summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xAndroid.bp47
-rwxr-xr-xAndroid.mk12
-rw-r--r--CleanSpec.mk1
-rw-r--r--apct-tests/perftests/core/Android.mk2
-rw-r--r--apct-tests/perftests/core/AndroidManifest.xml2
-rw-r--r--apct-tests/perftests/core/src/android/accounts/AccountManagerPerfTest.java8
-rw-r--r--apct-tests/perftests/core/src/android/app/PendingIntentPerfTest.java8
-rw-r--r--apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/app/ResourcesThemePerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/database/SQLiteDatabaseIoPerfTest.java11
-rw-r--r--apct-tests/perftests/core/src/android/database/SQLiteDatabasePerfTest.java13
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/CanvasPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/OutlinePerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/PaintHasGlyphPerfTest.java11
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/PaintMeasureTextTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/PathPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java15
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/VectorDrawablePerfTest.java12
-rw-r--r--apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/os/CpuUsageTrackingPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/os/LooperStatsPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/os/PackageManagerPerfTest.java12
-rw-r--r--apct-tests/perftests/core/src/android/os/ParcelArrayPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/os/ParcelPerfTest.java13
-rw-r--r--apct-tests/perftests/core/src/android/os/PssPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/os/SharedPreferencesTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/os/StrictModeTest.java16
-rw-r--r--apct-tests/perftests/core/src/android/os/TracePerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/perftests/SystemPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/text/CanvasDrawTextTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/text/DynamicLayoutPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java3
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java4
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutMultithreadPerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java5
-rw-r--r--apct-tests/perftests/core/src/android/util/perftests/LogPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/view/ViewPerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/widget/EditTextBackspacePerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/widget/EditTextCursorMovementPerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/widget/EditTextLongTextPerfTest.java33
-rw-r--r--apct-tests/perftests/core/src/android/widget/LayoutPerfTest.java22
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java26
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java16
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewOnMeasurePerfTest.java16
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java7
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewSetTextLocalePerfTest.java5
-rw-r--r--api/current.txt50816
-rw-r--r--api/removed.txt483
-rw-r--r--api/system-current.txt5875
-rw-r--r--api/system-removed.txt85
-rw-r--r--api/test-current.txt1276
-rw-r--r--api/test-removed.txt1
-rw-r--r--cmds/idmap2/Android.bp3
-rw-r--r--cmds/idmap2/idmap2/Create.cpp31
-rw-r--r--cmds/idmap2/idmap2/Scan.cpp155
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.cpp22
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.h7
-rw-r--r--cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl13
-rw-r--r--cmds/idmap2/include/idmap2/CommandLineOptions.h3
-rw-r--r--cmds/idmap2/include/idmap2/Idmap.h11
-rw-r--r--cmds/idmap2/include/idmap2/Policies.h41
-rw-r--r--cmds/idmap2/include/idmap2/ResourceUtils.h14
-rw-r--r--cmds/idmap2/libidmap2/CommandLineOptions.cpp23
-rw-r--r--cmds/idmap2/libidmap2/Idmap.cpp43
-rw-r--r--cmds/idmap2/libidmap2/Policies.cpp57
-rw-r--r--cmds/idmap2/libidmap2/RawPrintVisitor.cpp3
-rw-r--r--cmds/idmap2/libidmap2/ResourceUtils.cpp65
-rwxr-xr-xcmds/idmap2/static-checks.sh10
-rw-r--r--cmds/idmap2/tests/BinaryStreamVisitorTests.cpp45
-rw-r--r--cmds/idmap2/tests/CommandLineOptionsTests.cpp56
-rw-r--r--cmds/idmap2/tests/FileUtilsTests.cpp14
-rw-r--r--cmds/idmap2/tests/Idmap2BinaryTests.cpp32
-rw-r--r--cmds/idmap2/tests/IdmapTests.cpp131
-rw-r--r--cmds/idmap2/tests/PoliciesTests.cpp70
-rw-r--r--cmds/idmap2/tests/PrettyPrintVisitorTests.cpp5
-rw-r--r--cmds/idmap2/tests/RawPrintVisitorTests.cpp5
-rw-r--r--cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml22
-rw-r--r--cmds/idmap2/tests/data/system-overlay-invalid/build26
-rw-r--r--cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml32
-rw-r--r--cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apkbin0 -> 1511 bytes
-rw-r--r--cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml21
-rw-r--r--cmds/idmap2/tests/data/system-overlay/build26
-rw-r--r--cmds/idmap2/tests/data/system-overlay/res/values/values.xml22
-rw-r--r--cmds/idmap2/tests/data/system-overlay/system-overlay.apkbin0 -> 1283 bytes
-rw-r--r--cmds/idmap2/tests/data/target/res/values/overlayable.xml52
-rw-r--r--cmds/idmap2/tests/data/target/res/values/values.xml10
-rw-r--r--cmds/idmap2/tests/data/target/target.apkbin2173 -> 4761 bytes
-rw-r--r--cmds/input/src/com/android/commands/input/Input.java473
-rw-r--r--cmds/media/src/com/android/commands/media/Media.java83
-rw-r--r--cmds/screencap/screencap.cpp3
-rw-r--r--cmds/statsd/src/anomaly/subscriber_util.cpp2
-rw-r--r--cmds/statsd/src/atoms.proto513
-rw-r--r--cmds/statsd/src/external/Perfetto.cpp11
-rw-r--r--cmds/statsd/src/external/Perfetto.h1
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.cpp3
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.h6
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp3
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.h6
-rw-r--r--cmds/statsd/src/statsd_config.proto4
-rw-r--r--cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp62
-rw-r--r--cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp46
-rw-r--r--config/boot-image-profile.txt19
-rw-r--r--config/hiddenapi-greylist.txt117
-rw-r--r--config/preloaded-classes3
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java2
-rw-r--r--core/java/android/app/Activity.java66
-rw-r--r--core/java/android/app/ActivityManager.java7
-rw-r--r--core/java/android/app/ActivityManagerInternal.java16
-rw-r--r--core/java/android/app/ActivityThread.java63
-rw-r--r--core/java/android/app/ActivityView.java47
-rw-r--r--core/java/android/app/AlertDialog.java3
-rw-r--r--core/java/android/app/AppOpsManager.aidl4
-rw-r--r--core/java/android/app/AppOpsManager.java1539
-rw-r--r--core/java/android/app/ApplicationPackageManager.java10
-rw-r--r--core/java/android/app/ClientTransactionHandler.java4
-rw-r--r--core/java/android/app/Dialog.java4
-rw-r--r--core/java/android/app/IActivityManager.aidl2
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl1
-rw-r--r--core/java/android/app/INotificationManager.aidl6
-rw-r--r--core/java/android/app/IWallpaperManager.aidl11
-rw-r--r--core/java/android/app/Notification.java373
-rw-r--r--core/java/android/app/NotificationChannel.java110
-rw-r--r--core/java/android/app/NotificationManager.java8
-rw-r--r--core/java/android/app/SystemServiceRegistry.java76
-rw-r--r--core/java/android/app/WallpaperColors.java8
-rw-r--r--core/java/android/app/WallpaperManager.java20
-rw-r--r--core/java/android/app/WindowConfiguration.java8
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java76
-rw-r--r--core/java/android/app/assist/AssistStructure.java3
-rw-r--r--core/java/android/app/contentsuggestions/ClassificationsRequest.aidl19
-rw-r--r--core/java/android/app/contentsuggestions/ClassificationsRequest.java113
-rw-r--r--core/java/android/app/contentsuggestions/ContentClassification.aidl19
-rw-r--r--core/java/android/app/contentsuggestions/ContentClassification.java79
-rw-r--r--core/java/android/app/contentsuggestions/ContentSelection.aidl19
-rw-r--r--core/java/android/app/contentsuggestions/ContentSelection.java79
-rw-r--r--core/java/android/app/contentsuggestions/ContentSuggestionsManager.java230
-rw-r--r--core/java/android/app/contentsuggestions/IClassificationsCallback.aidl25
-rw-r--r--core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl37
-rw-r--r--core/java/android/app/contentsuggestions/ISelectionsCallback.aidl25
-rw-r--r--core/java/android/app/contentsuggestions/SelectionsRequest.aidl19
-rw-r--r--core/java/android/app/contentsuggestions/SelectionsRequest.java129
-rw-r--r--core/java/android/app/prediction/AppPredictionContext.aidl19
-rw-r--r--core/java/android/app/prediction/AppPredictionContext.java158
-rw-r--r--core/java/android/app/prediction/AppPredictionManager.java47
-rw-r--r--core/java/android/app/prediction/AppPredictionSessionId.aidl19
-rw-r--r--core/java/android/app/prediction/AppPredictionSessionId.java86
-rw-r--r--core/java/android/app/prediction/AppPredictor.java257
-rw-r--r--core/java/android/app/prediction/AppTarget.aidl19
-rw-r--r--core/java/android/app/prediction/AppTarget.java166
-rw-r--r--core/java/android/app/prediction/AppTargetEvent.aidl19
-rw-r--r--core/java/android/app/prediction/AppTargetEvent.java154
-rw-r--r--core/java/android/app/prediction/AppTargetId.aidl19
-rw-r--r--core/java/android/app/prediction/AppTargetId.java90
-rw-r--r--core/java/android/app/prediction/IPredictionCallback.aidl (renamed from services/core/java/com/android/server/wm/StackWindowListener.java)16
-rw-r--r--core/java/android/app/prediction/IPredictionManager.aidl51
-rw-r--r--core/java/android/app/role/IRoleManager.aidl2
-rw-r--r--core/java/android/app/role/RoleManager.java93
-rw-r--r--core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java5
-rw-r--r--core/java/android/app/usage/EventList.java17
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl4
-rw-r--r--core/java/android/app/usage/UsageEvents.java10
-rw-r--r--core/java/android/app/usage/UsageStats.java9
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java118
-rw-r--r--core/java/android/app/usage/UsageStatsManagerInternal.java6
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java6
-rw-r--r--core/java/android/attention/AttentionManagerInternal.java73
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java27
-rw-r--r--core/java/android/bluetooth/BluetoothCodecConfig.java13
-rw-r--r--core/java/android/bluetooth/BluetoothHealth.java484
-rw-r--r--core/java/android/bluetooth/BluetoothHealthAppConfiguration.java122
-rw-r--r--core/java/android/bluetooth/BluetoothHealthCallback.java18
-rw-r--r--core/java/android/bluetooth/BluetoothProfile.java13
-rw-r--r--core/java/android/content/Context.java46
-rw-r--r--core/java/android/content/Intent.java133
-rw-r--r--core/java/android/content/om/OverlayInfo.java43
-rw-r--r--core/java/android/content/om/OverlayManager.java98
-rw-r--r--core/java/android/content/pm/ActivityInfo.java22
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java10
-rw-r--r--core/java/android/content/pm/CrossProfileApps.java23
-rw-r--r--core/java/android/content/pm/ILauncherApps.aidl1
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl8
-rw-r--r--core/java/android/content/pm/IShortcutService.aidl4
-rw-r--r--core/java/android/content/pm/LauncherApps.java20
-rw-r--r--core/java/android/content/pm/PackageInfo.java21
-rw-r--r--core/java/android/content/pm/PackageManager.java160
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java24
-rw-r--r--core/java/android/content/pm/PackageParser.java285
-rw-r--r--core/java/android/content/pm/PackageUserState.java28
-rw-r--r--core/java/android/content/pm/PermissionGroupInfo.java6
-rw-r--r--core/java/android/content/pm/PermissionInfo.java15
-rw-r--r--core/java/android/content/pm/RegisteredServicesCache.java8
-rw-r--r--core/java/android/content/pm/ResolveInfo.java8
-rw-r--r--core/java/android/content/pm/ShortcutInfo.java114
-rw-r--r--core/java/android/content/pm/ShortcutManager.java86
-rw-r--r--core/java/android/content/pm/SuspendDialogInfo.java2
-rw-r--r--core/java/android/content/res/AssetManager.java34
-rw-r--r--core/java/android/content/res/Configuration.java1
-rw-r--r--core/java/android/content/res/ResourceId.java6
-rw-r--r--core/java/android/content/res/Resources.java32
-rw-r--r--core/java/android/content/res/ResourcesImpl.java42
-rw-r--r--core/java/android/content/res/TypedArray.java31
-rw-r--r--core/java/android/hardware/biometrics/BiometricManager.java14
-rw-r--r--core/java/android/hardware/biometrics/BiometricPrompt.java27
-rw-r--r--core/java/android/hardware/display/BrightnessConfiguration.java318
-rw-r--r--core/java/android/hardware/display/BrightnessCorrection.aidl19
-rw-r--r--core/java/android/hardware/display/BrightnessCorrection.java285
-rw-r--r--core/java/android/hardware/display/ColorDisplayManager.java65
-rw-r--r--core/java/android/hardware/display/DisplayManager.java7
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java20
-rw-r--r--core/java/android/hardware/display/IColorDisplayManager.aidl3
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl6
-rw-r--r--core/java/android/hardware/display/VirtualDisplay.java12
-rw-r--r--core/java/android/hardware/face/FaceManager.java4
-rw-r--r--core/java/android/hardware/face/IFaceService.aidl2
-rw-r--r--core/java/android/hardware/hdmi/HdmiAudioSystemClient.java47
-rw-r--r--core/java/android/hardware/hdmi/HdmiControlManager.java143
-rw-r--r--core/java/android/hardware/hdmi/HdmiSwitchClient.java137
-rw-r--r--core/java/android/hardware/hdmi/HdmiUtils.java81
-rw-r--r--core/java/android/hardware/hdmi/IHdmiControlService.aidl5
-rw-r--r--core/java/android/hardware/location/ActivityChangedEvent.java92
-rw-r--r--core/java/android/hardware/location/ActivityRecognitionEvent.java87
-rw-r--r--core/java/android/hardware/location/ActivityRecognitionHardware.java279
-rw-r--r--core/java/android/hardware/location/IActivityRecognitionHardware.aidl62
-rw-r--r--core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl36
-rw-r--r--core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl34
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java2
-rw-r--r--core/java/android/net/ApfCapabilitiesParcelable.aidl23
-rw-r--r--core/java/android/net/CaptivePortal.java8
-rw-r--r--core/java/android/net/ConnectivityManager.java99
-rw-r--r--core/java/android/net/DhcpResultsParcelable.aidl27
-rw-r--r--core/java/android/net/IConnectivityManager.aidl2
-rw-r--r--core/java/android/net/IIpMemoryStore.aidl113
-rw-r--r--core/java/android/net/INetworkMonitor.aidl45
-rw-r--r--core/java/android/net/INetworkMonitorCallbacks.aidl29
-rw-r--r--core/java/android/net/INetworkStackConnector.aidl8
-rw-r--r--core/java/android/net/INetworkStackStatusCallback.aidl22
-rw-r--r--core/java/android/net/InitialConfigurationParcelable.aidl27
-rw-r--r--core/java/android/net/IpMemoryStore.java174
-rw-r--r--core/java/android/net/IpPrefixParcelable.aidl22
-rw-r--r--core/java/android/net/LinkAddress.java11
-rw-r--r--core/java/android/net/LinkAddressParcelable.aidl24
-rw-r--r--core/java/android/net/LinkProperties.java173
-rw-r--r--core/java/android/net/LinkPropertiesParcelable.aidl39
-rw-r--r--core/java/android/net/MacAddress.java2
-rw-r--r--core/java/android/net/Network.java4
-rw-r--r--core/java/android/net/NetworkParcelable.aidl22
-rw-r--r--core/java/android/net/NetworkSpecifier.java27
-rw-r--r--core/java/android/net/NetworkStack.java97
-rw-r--r--core/java/android/net/PrivateDnsConfigParcel.aidl22
-rw-r--r--core/java/android/net/ProvisioningConfigurationParcelable.aidl38
-rw-r--r--core/java/android/net/ProxyInfoParcelable.aidl24
-rw-r--r--core/java/android/net/RouteInfo.java17
-rw-r--r--core/java/android/net/RouteInfoParcelable.aidl26
-rw-r--r--core/java/android/net/StaticIpConfigurationParcelable.aidl27
-rw-r--r--core/java/android/net/apf/ApfCapabilities.java (renamed from services/net/java/android/net/apf/ApfCapabilities.java)14
-rw-r--r--core/java/android/net/dhcp/DhcpServerCallbacks.java (renamed from services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRuleTest.java)35
-rw-r--r--core/java/android/net/dhcp/DhcpServingParamsParcel.aidl30
-rw-r--r--core/java/android/net/dhcp/IDhcpServer.aidl32
-rw-r--r--core/java/android/net/dhcp/IDhcpServerCallbacks.aidl24
-rw-r--r--core/java/android/net/ip/IIpClient.aidl32
-rw-r--r--core/java/android/net/ip/IIpClientCallbacks.aidl66
-rw-r--r--core/java/android/net/ip/IpClientCallbacks.java119
-rw-r--r--core/java/android/net/ipmemorystore/Blob.aidl26
-rw-r--r--core/java/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl30
-rw-r--r--core/java/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl27
-rw-r--r--core/java/android/net/ipmemorystore/IOnNetworkAttributesRetrieved.aidl30
-rw-r--r--core/java/android/net/ipmemorystore/IOnSameNetworkResponseListener.aidl29
-rw-r--r--core/java/android/net/ipmemorystore/IOnStatusListener.aidl27
-rw-r--r--core/java/android/net/ipmemorystore/NetworkAttributes.java259
-rw-r--r--core/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl36
-rw-r--r--core/java/android/net/ipmemorystore/SameL3NetworkResponse.java146
-rw-r--r--core/java/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl24
-rw-r--r--core/java/android/net/ipmemorystore/Status.java73
-rw-r--r--core/java/android/net/ipmemorystore/StatusParcelable.aidl22
-rw-r--r--core/java/android/net/ipmemorystore/Utils.java51
-rw-r--r--core/java/android/os/AppZygote.java130
-rw-r--r--core/java/android/os/Binder.java24
-rw-r--r--core/java/android/os/BugreportManager.java170
-rw-r--r--core/java/android/os/BugreportParams.java90
-rwxr-xr-xcore/java/android/os/Build.java20
-rw-r--r--core/java/android/os/FileUtils.java11
-rw-r--r--core/java/android/os/GraphicsEnvironment.java49
-rw-r--r--core/java/android/os/HwBinder.java2
-rw-r--r--core/java/android/os/HwBlob.java2
-rw-r--r--core/java/android/os/HwParcel.java2
-rw-r--r--core/java/android/os/IHwBinder.java2
-rw-r--r--core/java/android/os/IHwInterface.java3
-rw-r--r--core/java/android/os/INetworkManagementService.aidl10
-rw-r--r--core/java/android/os/NativeHandle.java2
-rw-r--r--core/java/android/os/Parcel.java115
-rw-r--r--core/java/android/os/ParcelableException.aidl18
-rw-r--r--core/java/android/os/PowerManager.java2
-rw-r--r--core/java/android/os/PowerSaveState.java2
-rw-r--r--core/java/android/os/Process.java26
-rw-r--r--core/java/android/os/Trace.java12
-rw-r--r--core/java/android/os/UpdateEngine.java1
-rw-r--r--core/java/android/os/UserHandle.java25
-rw-r--r--core/java/android/os/Vibrator.java27
-rw-r--r--core/java/android/os/VintfObject.java37
-rw-r--r--core/java/android/os/VintfRuntimeInfo.java31
-rw-r--r--core/java/android/os/ZygoteProcess.java60
-rw-r--r--core/java/android/permission/IPermissionController.aidl7
-rw-r--r--core/java/android/permission/PermissionControllerManager.java507
-rw-r--r--core/java/android/permission/PermissionControllerService.java153
-rw-r--r--core/java/android/permission/RuntimePermissionUsageInfo.aidl19
-rw-r--r--core/java/android/permission/RuntimePermissionUsageInfo.java96
-rw-r--r--core/java/android/permission/TEST_MAPPING12
-rw-r--r--core/java/android/provider/DeviceConfig.java43
-rw-r--r--core/java/android/provider/FontsContract.java12
-rw-r--r--core/java/android/provider/MediaStore.java72
-rw-r--r--core/java/android/provider/Settings.java399
-rw-r--r--core/java/android/security/keystore/recovery/RecoveryController.java89
-rw-r--r--core/java/android/security/keystore/recovery/WrappedApplicationKey.java28
-rw-r--r--core/java/android/service/appprediction/AppPredictionService.java322
-rw-r--r--core/java/android/service/appprediction/IPredictionService.aidl53
-rw-r--r--core/java/android/service/attention/AttentionService.java160
-rw-r--r--core/java/android/service/attention/IAttentionCallback.aidl27
-rw-r--r--core/java/android/service/attention/IAttentionService.aidl (renamed from core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl)19
-rw-r--r--core/java/android/service/autofill/augmented/AugmentedAutofillService.java56
-rw-r--r--core/java/android/service/autofill/augmented/FillCallback.java4
-rw-r--r--core/java/android/service/autofill/augmented/FillController.java4
-rw-r--r--core/java/android/service/autofill/augmented/FillRequest.java4
-rw-r--r--core/java/android/service/autofill/augmented/FillResponse.java7
-rw-r--r--core/java/android/service/autofill/augmented/FillWindow.java187
-rw-r--r--core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl2
-rw-r--r--core/java/android/service/autofill/augmented/PresentationParams.java9
-rw-r--r--core/java/android/service/contentcapture/ContentCaptureEventsRequest.java2
-rw-r--r--core/java/android/service/contentcapture/ContentCaptureService.java138
-rw-r--r--core/java/android/service/contentcapture/IContentCaptureService.aidl4
-rw-r--r--core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl35
-rw-r--r--core/java/android/service/contentsuggestions/ContentSuggestionsService.java154
-rw-r--r--core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl43
-rw-r--r--core/java/android/service/dreams/IDreamManager.aidl1
-rw-r--r--core/java/android/service/euicc/EuiccService.java6
-rw-r--r--core/java/android/service/notification/NotificationAssistantService.java17
-rw-r--r--core/java/android/service/notification/StatusBarNotification.java55
-rw-r--r--core/java/android/service/voice/VoiceInteractionSession.java6
-rw-r--r--core/java/android/service/wallpaper/IWallpaperConnection.aidl2
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java15
-rw-r--r--core/java/android/text/StaticLayout.java4
-rw-r--r--core/java/android/text/TextLine.java19
-rw-r--r--core/java/android/text/TextUtils.java5
-rw-r--r--core/java/android/text/style/SuggestionSpan.java104
-rw-r--r--core/java/android/text/util/Linkify.java79
-rw-r--r--core/java/android/util/DebugUtils.java3
-rw-r--r--core/java/android/util/FeatureFlagUtils.java19
-rw-r--r--core/java/android/util/Half.java4
-rw-r--r--core/java/android/util/KeyValueListParser.java161
-rw-r--r--core/java/android/util/TimeUtils.java29
-rw-r--r--core/java/android/util/TypedValue.java6
-rw-r--r--core/java/android/view/AccessibilityIterators.java3
-rw-r--r--core/java/android/view/Choreographer.java25
-rw-r--r--core/java/android/view/Display.java6
-rw-r--r--core/java/android/view/IWindowSession.aidl2
-rw-r--r--core/java/android/view/InsetsAnimationControlImpl.java54
-rw-r--r--core/java/android/view/InsetsController.java42
-rw-r--r--core/java/android/view/InsetsState.java59
-rw-r--r--core/java/android/view/KeyEvent.java5
-rw-r--r--core/java/android/view/LayoutInflater.java274
-rw-r--r--core/java/android/view/MotionEvent.java94
-rw-r--r--core/java/android/view/PointerIcon.java54
-rw-r--r--core/java/android/view/SurfaceControl.java497
-rw-r--r--core/java/android/view/SurfaceSession.java10
-rw-r--r--core/java/android/view/SurfaceView.java3
-rw-r--r--core/java/android/view/View.java112
-rw-r--r--core/java/android/view/ViewGroup.java45
-rw-r--r--core/java/android/view/ViewRootImpl.java23
-rw-r--r--core/java/android/view/WindowInsets.java492
-rw-r--r--core/java/android/view/WindowInsetsAnimationController.java21
-rw-r--r--core/java/android/view/WindowInsetsAnimationListener.java122
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java10
-rw-r--r--core/java/android/view/animation/Animation.java3
-rw-r--r--core/java/android/view/autofill/AutofillId.java72
-rw-r--r--core/java/android/view/autofill/AutofillManager.java160
-rw-r--r--core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl23
-rw-r--r--core/java/android/view/contentcapture/ChildContentCaptureSession.java37
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureEvent.java93
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureManager.java140
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureSession.java293
-rw-r--r--core/java/android/view/contentcapture/IContentCaptureManager.aidl21
-rw-r--r--core/java/android/view/contentcapture/MainContentCaptureSession.java233
-rw-r--r--core/java/android/view/contentcapture/ViewNode.java769
-rw-r--r--core/java/android/view/inputmethod/EditorInfo.java29
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java30
-rw-r--r--core/java/android/view/inputmethod/InputMethodSystemProperty.java26
-rw-r--r--core/java/android/view/inspector/InspectableNodeName.java3
-rw-r--r--core/java/android/view/inspector/InspectableProperty.java29
-rw-r--r--core/java/android/view/inspector/IntEnumMapping.java118
-rw-r--r--core/java/android/view/inspector/IntFlagMapping.java31
-rw-r--r--core/java/android/view/inspector/PropertyMapper.java3
-rw-r--r--core/java/android/view/inspector/PropertyReader.java24
-rw-r--r--core/java/android/view/textclassifier/ConversationAction.java266
-rw-r--r--core/java/android/view/textclassifier/ConversationActions.java432
-rw-r--r--core/java/android/view/textclassifier/GenerateLinksLogger.java8
-rw-r--r--core/java/android/view/textclassifier/Log.java26
-rw-r--r--core/java/android/view/textclassifier/SelectionSessionLogger.java8
-rw-r--r--core/java/android/view/textclassifier/TextClassificationConstants.java18
-rw-r--r--core/java/android/view/textclassifier/TextClassificationSession.java5
-rw-r--r--core/java/android/view/textclassifier/TextClassifier.java206
-rw-r--r--core/java/android/view/textclassifier/TextClassifierEvent.java2
-rw-r--r--core/java/android/view/textclassifier/TextClassifierEventTronLogger.java151
-rw-r--r--core/java/android/view/textclassifier/TextClassifierImpl.java22
-rw-r--r--core/java/android/view/textservice/SpellCheckerSession.java13
-rw-r--r--core/java/android/view/textservice/TextServicesManager.java58
-rw-r--r--core/java/android/webkit/WebView.java80
-rw-r--r--core/java/android/webkit/WebViewClient.java13
-rw-r--r--core/java/android/webkit/WebViewProvider.java9
-rw-r--r--core/java/android/webkit/WebViewRenderer.java45
-rw-r--r--core/java/android/webkit/WebViewRendererClient.java77
-rw-r--r--core/java/android/webkit/WebViewZygote.java5
-rw-r--r--core/java/android/widget/Editor.java15
-rw-r--r--core/java/android/widget/Magnifier.java85
-rw-r--r--core/java/android/widget/SpellChecker.java12
-rw-r--r--core/java/android/widget/TextView.java136
-rw-r--r--core/java/android/widget/TimePickerClockDelegate.java13
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java165
-rw-r--r--core/java/com/android/internal/app/IAppOpsService.aidl15
-rw-r--r--core/java/com/android/internal/app/ResolverComparator.java47
-rw-r--r--core/java/com/android/internal/app/SuspendedAppActivity.java2
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessStats.java53
-rw-r--r--core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java13
-rw-r--r--core/java/com/android/internal/infra/AbstractRemoteService.java47
-rw-r--r--core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl3
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java6
-rw-r--r--core/java/com/android/internal/net/NetworkStatsFactory.java5
-rw-r--r--core/java/com/android/internal/os/AppZygoteInit.java105
-rw-r--r--core/java/com/android/internal/os/AtomicDirectory.java294
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java71
-rw-r--r--core/java/com/android/internal/os/ChildZygoteInit.java137
-rw-r--r--core/java/com/android/internal/os/RoSystemProperties.java9
-rw-r--r--core/java/com/android/internal/os/WebViewZygoteInit.java51
-rw-r--r--core/java/com/android/internal/os/Zygote.java32
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java45
-rw-r--r--core/java/com/android/internal/policy/DecorView.java29
-rw-r--r--core/java/com/android/internal/policy/ScreenDecorationsUtils.java19
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl4
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl4
-rw-r--r--core/java/com/android/internal/textservice/ITextServicesManager.aidl13
-rw-r--r--core/java/com/android/internal/util/CollectionUtils.java14
-rw-r--r--core/java/com/android/internal/util/ContrastColorUtil.java27
-rw-r--r--core/java/com/android/internal/util/SyncResultReceiver.java145
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl3
-rw-r--r--core/java/com/android/internal/view/InputBindResult.java6
-rw-r--r--core/java/com/android/internal/widget/DecorCaptionView.java13
-rw-r--r--core/java/com/android/internal/widget/EditableInputConnection.java8
-rw-r--r--core/java/com/android/internal/widget/ILockSettings.aidl2
-rw-r--r--core/jni/Android.bp4
-rw-r--r--core/jni/AndroidRuntime.cpp4
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp76
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp2
-rw-r--r--core/jni/android/graphics/Graphics.cpp74
-rw-r--r--core/jni/android/graphics/GraphicsJNI.h5
-rw-r--r--core/jni/android/graphics/Paint.cpp70
-rw-r--r--core/jni/android_app_NativeActivity.cpp6
-rw-r--r--core/jni/android_hardware_location_ActivityRecognitionHardware.cpp132
-rw-r--r--core/jni/android_media_AudioRecord.cpp41
-rw-r--r--core/jni/android_media_AudioSystem.cpp47
-rw-r--r--core/jni/android_os_Debug.cpp131
-rw-r--r--core/jni/android_os_Debug.h3
-rw-r--r--core/jni/android_os_HwBinder.cpp2
-rw-r--r--core/jni/android_os_Parcel.cpp2
-rw-r--r--core/jni/android_util_AssetManager.cpp55
-rw-r--r--core/jni/android_util_Binder.cpp7
-rw-r--r--core/jni/android_util_Process.cpp17
-rw-r--r--core/jni/android_view_InputEventSender.cpp1
-rw-r--r--core/jni/android_view_MotionEvent.cpp15
-rw-r--r--core/jni/android_view_SurfaceControl.cpp59
-rw-r--r--core/jni/android_view_SurfaceSession.cpp9
-rw-r--r--core/jni/com_android_internal_os_AtomicDirectory.cpp66
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp57
-rw-r--r--core/jni/fd_utils.cpp2
-rw-r--r--core/proto/Android.bp27
-rw-r--r--core/proto/android/app/settings_enums.proto2094
-rw-r--r--core/proto/android/app/window_configuration.proto1
-rw-r--r--core/proto/android/bluetooth/enums.proto15
-rw-r--r--core/proto/android/bluetooth/hci/enums.proto519
-rw-r--r--core/proto/android/bluetooth/hfp/enums.proto28
-rw-r--r--core/proto/android/providers/settings/global.proto24
-rw-r--r--core/proto/android/providers/settings/secure.proto6
-rw-r--r--core/proto/android/server/connectivity/data_stall_event.proto89
-rw-r--r--core/proto/android/server/jobscheduler.proto13
-rw-r--r--core/proto/android/server/location/enums.proto102
-rw-r--r--core/proto/android/service/package.proto1
-rw-r--r--core/proto/android/service/procstats.proto23
-rw-r--r--core/proto/android/stats/docsui/docsui_enums.proto34
-rw-r--r--core/res/AndroidManifest.xml73
-rw-r--r--core/res/res/drawable/ic_account_circle.xml24
-rw-r--r--core/res/res/drawable/ic_battery.xml25
-rw-r--r--core/res/res/drawable/ic_corp_badge.xml23
-rw-r--r--core/res/res/drawable/perm_group_activity_recognition.xml29
-rw-r--r--core/res/res/drawable/perm_group_sensors.xml16
-rw-r--r--core/res/res/layout/notification_template_material_ambient.xml94
-rw-r--r--core/res/res/layout/time_picker_header_material.xml8
-rw-r--r--core/res/res/values-af/strings.xml15
-rw-r--r--core/res/res/values-am/strings.xml15
-rw-r--r--core/res/res/values-ar/strings.xml17
-rw-r--r--core/res/res/values-as/strings.xml17
-rw-r--r--core/res/res/values-az/strings.xml15
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml15
-rw-r--r--core/res/res/values-be/strings.xml19
-rw-r--r--core/res/res/values-bg/strings.xml15
-rw-r--r--core/res/res/values-bn/strings.xml15
-rw-r--r--core/res/res/values-bs/strings.xml25
-rw-r--r--core/res/res/values-ca/strings.xml15
-rw-r--r--core/res/res/values-cs/strings.xml15
-rw-r--r--core/res/res/values-da/strings.xml63
-rw-r--r--core/res/res/values-de/strings.xml17
-rw-r--r--core/res/res/values-el/strings.xml15
-rw-r--r--core/res/res/values-en-rAU/strings.xml15
-rw-r--r--core/res/res/values-en-rCA/strings.xml15
-rw-r--r--core/res/res/values-en-rGB/strings.xml15
-rw-r--r--core/res/res/values-en-rIN/strings.xml15
-rw-r--r--core/res/res/values-en-rXC/strings.xml9
-rw-r--r--core/res/res/values-es-rUS/strings.xml15
-rw-r--r--core/res/res/values-es/strings.xml15
-rw-r--r--core/res/res/values-et/strings.xml15
-rw-r--r--core/res/res/values-eu/strings.xml15
-rw-r--r--core/res/res/values-fa/strings.xml15
-rw-r--r--core/res/res/values-fi/strings.xml15
-rw-r--r--core/res/res/values-fr-rCA/strings.xml15
-rw-r--r--core/res/res/values-fr/strings.xml15
-rw-r--r--core/res/res/values-gl/strings.xml19
-rw-r--r--core/res/res/values-gu/strings.xml15
-rw-r--r--core/res/res/values-hi/strings.xml15
-rw-r--r--core/res/res/values-hr/strings.xml15
-rw-r--r--core/res/res/values-hu/strings.xml15
-rw-r--r--core/res/res/values-hy/strings.xml15
-rw-r--r--core/res/res/values-in/strings.xml15
-rw-r--r--core/res/res/values-is/strings.xml15
-rw-r--r--core/res/res/values-it/strings.xml15
-rw-r--r--core/res/res/values-iw/strings.xml15
-rw-r--r--core/res/res/values-ja/strings.xml15
-rw-r--r--core/res/res/values-ka/strings.xml15
-rw-r--r--core/res/res/values-kk/strings.xml15
-rw-r--r--core/res/res/values-km/strings.xml15
-rw-r--r--core/res/res/values-kn/strings.xml15
-rw-r--r--core/res/res/values-ko/strings.xml15
-rw-r--r--core/res/res/values-ky/strings.xml15
-rw-r--r--core/res/res/values-lo/strings.xml15
-rw-r--r--core/res/res/values-lt/strings.xml15
-rw-r--r--core/res/res/values-lv/strings.xml15
-rw-r--r--core/res/res/values-mk/strings.xml15
-rw-r--r--core/res/res/values-ml/strings.xml15
-rw-r--r--core/res/res/values-mn/strings.xml15
-rw-r--r--core/res/res/values-mr/strings.xml15
-rw-r--r--core/res/res/values-ms/strings.xml15
-rw-r--r--core/res/res/values-my/strings.xml15
-rw-r--r--core/res/res/values-nb/strings.xml15
-rw-r--r--core/res/res/values-ne/strings.xml15
-rw-r--r--core/res/res/values-nl/strings.xml15
-rw-r--r--core/res/res/values-or/strings.xml15
-rw-r--r--core/res/res/values-pa/strings.xml15
-rw-r--r--core/res/res/values-pl/strings.xml15
-rw-r--r--core/res/res/values-pt-rBR/strings.xml15
-rw-r--r--core/res/res/values-pt-rPT/strings.xml15
-rw-r--r--core/res/res/values-pt/strings.xml15
-rw-r--r--core/res/res/values-ro/strings.xml15
-rw-r--r--core/res/res/values-ru/strings.xml15
-rw-r--r--core/res/res/values-si/strings.xml15
-rw-r--r--core/res/res/values-sk/strings.xml15
-rw-r--r--core/res/res/values-sl/strings.xml15
-rw-r--r--core/res/res/values-sq/strings.xml15
-rw-r--r--core/res/res/values-sr/strings.xml15
-rw-r--r--core/res/res/values-sv/strings.xml15
-rw-r--r--core/res/res/values-sw/strings.xml15
-rw-r--r--core/res/res/values-ta/strings.xml15
-rw-r--r--core/res/res/values-te/strings.xml17
-rw-r--r--core/res/res/values-th/strings.xml15
-rw-r--r--core/res/res/values-tl/strings.xml15
-rw-r--r--core/res/res/values-tr/strings.xml15
-rw-r--r--core/res/res/values-uk/strings.xml15
-rw-r--r--core/res/res/values-ur/strings.xml15
-rw-r--r--core/res/res/values-uz/strings.xml15
-rw-r--r--core/res/res/values-vi/strings.xml15
-rw-r--r--core/res/res/values-zh-rCN/strings.xml15
-rw-r--r--core/res/res/values-zh-rHK/strings.xml15
-rw-r--r--core/res/res/values-zh-rTW/strings.xml15
-rw-r--r--core/res/res/values-zu/strings.xml15
-rw-r--r--core/res/res/values/attrs.xml7
-rw-r--r--core/res/res/values/attrs_manifest.xml21
-rw-r--r--core/res/res/values/colors_device_defaults.xml2
-rw-r--r--core/res/res/values/config.xml145
-rw-r--r--core/res/res/values/dimens.xml11
-rw-r--r--core/res/res/values/public.xml7
-rw-r--r--core/res/res/values/strings.xml9
-rw-r--r--core/res/res/values/styles_device_defaults.xml3
-rw-r--r--core/res/res/values/styles_material.xml9
-rw-r--r--core/res/res/values/symbols.xml37
-rw-r--r--core/res/res/values/themes_device_defaults.xml16
-rw-r--r--core/res/res/values/themes_material.xml8
-rw-r--r--core/tests/BroadcastRadioTests/Android.mk2
-rw-r--r--core/tests/BroadcastRadioTests/AndroidManifest.xml2
-rw-r--r--core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java38
-rw-r--r--core/tests/coretests/Android.mk7
-rw-r--r--core/tests/coretests/AndroidManifest.xml4
-rw-r--r--core/tests/coretests/AndroidTest.xml1
-rw-r--r--core/tests/coretests/README4
-rw-r--r--core/tests/coretests/res/color/drawable_in_color_dir_invalid.xml21
-rw-r--r--core/tests/coretests/res/color/drawable_in_color_dir_valid.xml22
-rw-r--r--core/tests/coretests/res/raw/com_android_tzdata.apexbin0 -> 1286419 bytes
-rw-r--r--core/tests/coretests/src/android/animation/AnimatorInflaterTest.java10
-rw-r--r--core/tests/coretests/src/android/animation/AnimatorSetActivity.java20
-rw-r--r--core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java25
-rw-r--r--core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java6
-rw-r--r--core/tests/coretests/src/android/animation/AutoCancelTest.java4
-rw-r--r--core/tests/coretests/src/android/animation/BasicAnimatorActivity.java5
-rw-r--r--core/tests/coretests/src/android/animation/EventsTest.java8
-rw-r--r--core/tests/coretests/src/android/animation/FutureWaiter.java1
-rw-r--r--core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java2
-rw-r--r--core/tests/coretests/src/android/animation/StateListAnimatorTest.java6
-rw-r--r--core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java1
-rw-r--r--core/tests/coretests/src/android/animation/ValueAnimatorTests.java14
-rw-r--r--core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java9
-rw-r--r--core/tests/coretests/src/android/app/ApplicationErrorReportTest.java13
-rw-r--r--core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java9
-rw-r--r--core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java3
-rw-r--r--core/tests/coretests/src/android/app/DownloadManagerStressTest.java5
-rw-r--r--core/tests/coretests/src/android/app/InstrumentationTest.java3
-rw-r--r--core/tests/coretests/src/android/app/LoaderLifecycleTest.java8
-rw-r--r--core/tests/coretests/src/android/app/NotificationTest.java7
-rw-r--r--core/tests/coretests/src/android/app/SearchManagerTest.java10
-rw-r--r--core/tests/coretests/src/android/app/activity/ActivityManagerTest.java5
-rw-r--r--core/tests/coretests/src/android/app/activity/ActivityThreadTest.java239
-rw-r--r--core/tests/coretests/src/android/app/activity/BroadcastTest.java15
-rw-r--r--core/tests/coretests/src/android/app/activity/IntentSenderTest.java3
-rw-r--r--core/tests/coretests/src/android/app/activity/LaunchTest.java5
-rw-r--r--core/tests/coretests/src/android/app/activity/LifecycleTest.java5
-rw-r--r--core/tests/coretests/src/android/app/activity/MetaDataTest.java5
-rw-r--r--core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java34
-rw-r--r--core/tests/coretests/src/android/app/activity/ServiceTest.java9
-rw-r--r--core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java3
-rw-r--r--core/tests/coretests/src/android/app/activity/SubActivityTest.java3
-rw-r--r--core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java5
-rw-r--r--core/tests/coretests/src/android/app/assist/AssistStructureTest.java9
-rw-r--r--core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java1
-rw-r--r--core/tests/coretests/src/android/app/backup/BackupDataTest.java13
-rw-r--r--core/tests/coretests/src/android/app/backup/FullBackupTest.java3
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java5
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java5
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java5
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java5
-rw-r--r--core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java3
-rw-r--r--core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java3
-rw-r--r--core/tests/coretests/src/android/app/timezone/RulesStateTest.java5
-rw-r--r--core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java3
-rw-r--r--core/tests/coretests/src/android/app/usage/EventListTest.java5
-rw-r--r--core/tests/coretests/src/android/app/usage/UsageStatsTest.java16
-rw-r--r--core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java8
-rw-r--r--core/tests/coretests/src/android/content/AssetTest.java3
-rw-r--r--core/tests/coretests/src/android/content/BrickDeniedTest.java3
-rw-r--r--core/tests/coretests/src/android/content/BroadcastReceiverTests.java6
-rw-r--r--core/tests/coretests/src/android/content/ContentProviderOperationTest.java7
-rw-r--r--core/tests/coretests/src/android/content/ContentProviderTest.java3
-rw-r--r--core/tests/coretests/src/android/content/ContentQueryMapTest.java8
-rw-r--r--core/tests/coretests/src/android/content/ContentResolverTest.java5
-rw-r--r--core/tests/coretests/src/android/content/ContentValuesTest.java4
-rw-r--r--core/tests/coretests/src/android/content/ContextTest.java7
-rw-r--r--core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java5
-rw-r--r--core/tests/coretests/src/android/content/MemoryFileProviderTest.java7
-rw-r--r--core/tests/coretests/src/android/content/RestrictionsManagerTest.java4
-rw-r--r--core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java5
-rw-r--r--core/tests/coretests/src/android/content/UriMatcherTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/ComponentTest.java15
-rw-r--r--core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java3
-rw-r--r--core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java7
-rw-r--r--core/tests/coretests/src/android/content/pm/OptionalClassRunner.java1
-rw-r--r--core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java3
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageBuilder.java1
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageManagerTests.java7
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java5
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageParserTest.java90
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java1
-rw-r--r--core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java19
-rw-r--r--core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java3
-rw-r--r--core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/SignatureTest.java2
-rw-r--r--core/tests/coretests/src/android/content/pm/VerificationParamsTest.java4
-rw-r--r--core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java3
-rw-r--r--core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java23
-rw-r--r--core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java3
-rw-r--r--core/tests/coretests/src/android/content/res/ConfigurationTest.java13
-rw-r--r--core/tests/coretests/src/android/content/res/FontResourcesParserTest.java8
-rw-r--r--core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java81
-rw-r--r--core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java5
-rw-r--r--core/tests/coretests/src/android/content/res/ResourcesManagerTest.java4
-rw-r--r--core/tests/coretests/src/android/database/CursorWindowTest.java6
-rw-r--r--core/tests/coretests/src/android/database/DatabaseCursorTest.java11
-rw-r--r--core/tests/coretests/src/android/database/DatabaseGeneralTest.java9
-rw-r--r--core/tests/coretests/src/android/database/DatabaseLocaleTest.java12
-rw-r--r--core/tests/coretests/src/android/database/DatabaseLockTest.java6
-rw-r--r--core/tests/coretests/src/android/database/DatabaseStatementTest.java4
-rw-r--r--core/tests/coretests/src/android/database/DatabaseStressTest.java6
-rw-r--r--core/tests/coretests/src/android/database/DatabaseUtilsTest.java2
-rw-r--r--core/tests/coretests/src/android/database/RedactingCursorTest.java5
-rw-r--r--core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java7
-rwxr-xr-xcore/tests/coretests/src/android/database/run_newdb_perf_test.sh2
-rw-r--r--core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java7
-rw-r--r--core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java7
-rw-r--r--core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java3
-rw-r--r--core/tests/coretests/src/android/graphics/BitmapFactoryTest.java4
-rw-r--r--core/tests/coretests/src/android/graphics/BitmapTest.java3
-rw-r--r--core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java4
-rw-r--r--core/tests/coretests/src/android/graphics/ColorStateListTest.java3
-rw-r--r--core/tests/coretests/src/android/graphics/FontFileUtilTest.java5
-rw-r--r--core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java3
-rw-r--r--core/tests/coretests/src/android/graphics/PaintTest.java4
-rw-r--r--core/tests/coretests/src/android/graphics/PathOffsetTest.java6
-rw-r--r--core/tests/coretests/src/android/graphics/PathTest.java3
-rw-r--r--core/tests/coretests/src/android/graphics/RectTest.java5
-rw-r--r--core/tests/coretests/src/android/graphics/ThreadBitmapTest.java2
-rw-r--r--core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java7
-rw-r--r--core/tests/coretests/src/android/graphics/TypefaceTest.java13
-rw-r--r--core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java19
-rw-r--r--core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java5
-rw-r--r--core/tests/coretests/src/android/graphics/drawable/IconTest.java3
-rw-r--r--core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java5
-rw-r--r--core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java5
-rw-r--r--core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java5
-rw-r--r--core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java82
-rw-r--r--core/tests/coretests/src/android/metrics/LogMakerTest.java3
-rw-r--r--core/tests/coretests/src/android/metrics/MetricsReaderTest.java4
-rw-r--r--core/tests/coretests/src/android/net/LocalSocketTest.java7
-rw-r--r--core/tests/coretests/src/android/net/NetworkKeyTest.java19
-rw-r--r--core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java1
-rw-r--r--core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java19
-rw-r--r--core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java2
-rw-r--r--core/tests/coretests/src/android/net/SSLSessionCacheTest.java4
-rw-r--r--core/tests/coretests/src/android/net/ScoredNetworkTest.java10
-rw-r--r--core/tests/coretests/src/android/net/SntpClientTest.java3
-rw-r--r--core/tests/coretests/src/android/net/UriTest.java3
-rw-r--r--core/tests/coretests/src/android/net/WebAddressTest.java4
-rw-r--r--core/tests/coretests/src/android/net/http/SslCertificateTest.java7
-rw-r--r--core/tests/coretests/src/android/os/AidlTest.java7
-rw-r--r--core/tests/coretests/src/android/os/BinderProxyCountingTest.java10
-rw-r--r--core/tests/coretests/src/android/os/BinderProxyTest.java3
-rw-r--r--core/tests/coretests/src/android/os/BinderTest.java11
-rw-r--r--core/tests/coretests/src/android/os/BinderThreadPriorityService.java1
-rw-r--r--core/tests/coretests/src/android/os/BinderThreadPriorityTest.java1
-rw-r--r--core/tests/coretests/src/android/os/BinderWorkSourceTest.java7
-rw-r--r--core/tests/coretests/src/android/os/BrightnessLimit.java1
-rw-r--r--core/tests/coretests/src/android/os/BroadcasterTest.java7
-rw-r--r--core/tests/coretests/src/android/os/BuildTest.java5
-rw-r--r--core/tests/coretests/src/android/os/BundleTest.java4
-rw-r--r--core/tests/coretests/src/android/os/EnvironmentTest.java5
-rw-r--r--core/tests/coretests/src/android/os/FileObserverTest.java9
-rw-r--r--core/tests/coretests/src/android/os/FileUtilsTest.java5
-rw-r--r--core/tests/coretests/src/android/os/HandlerTester.java4
-rw-r--r--core/tests/coretests/src/android/os/HandlerThreadTest.java8
-rw-r--r--core/tests/coretests/src/android/os/IdleHandlerTest.java7
-rw-r--r--core/tests/coretests/src/android/os/LocaleListTest.java7
-rw-r--r--core/tests/coretests/src/android/os/MemoryFileTest.java5
-rw-r--r--core/tests/coretests/src/android/os/MessageQueueTest.java8
-rw-r--r--core/tests/coretests/src/android/os/MessengerService.java5
-rw-r--r--core/tests/coretests/src/android/os/MessengerTest.java8
-rw-r--r--core/tests/coretests/src/android/os/OsTests.java4
-rw-r--r--core/tests/coretests/src/android/os/ParcelNullabilityTest.java5
-rw-r--r--core/tests/coretests/src/android/os/PatternMatcherTest.java22
-rw-r--r--core/tests/coretests/src/android/os/PerformanceCollectorTest.java9
-rw-r--r--core/tests/coretests/src/android/os/PowerManagerTest.java5
-rw-r--r--core/tests/coretests/src/android/os/PowerManagerVrTest.java10
-rw-r--r--core/tests/coretests/src/android/os/ProcessTest.java6
-rw-r--r--core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java5
-rw-r--r--core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java5
-rw-r--r--core/tests/coretests/src/android/os/TestHandlerThread.java5
-rw-r--r--core/tests/coretests/src/android/os/TestVrActivity.java1
-rw-r--r--core/tests/coretests/src/android/os/TraceTest.java8
-rw-r--r--core/tests/coretests/src/android/os/UserHandleTest.java2
-rw-r--r--core/tests/coretests/src/android/os/VintfObjectTest.java1
-rw-r--r--core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java3
-rw-r--r--core/tests/coretests/src/android/preference/ListPreferenceTest.java4
-rw-r--r--core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java8
-rw-r--r--core/tests/coretests/src/android/print/IPrintManagerParametersTest.java7
-rw-r--r--core/tests/coretests/src/android/provider/DeviceConfigTest.java7
-rw-r--r--core/tests/coretests/src/android/provider/DocumentsProviderTest.java3
-rw-r--r--core/tests/coretests/src/android/provider/FontsContractE2ETest.java18
-rw-r--r--core/tests/coretests/src/android/provider/FontsContractTest.java16
-rw-r--r--core/tests/coretests/src/android/provider/MockFontProvider.java10
-rw-r--r--core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java6
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java24
-rw-r--r--core/tests/coretests/src/android/provider/SettingsProviderTest.java7
-rw-r--r--core/tests/coretests/src/android/provider/SettingsValidatorsTest.java5
-rw-r--r--core/tests/coretests/src/android/provider/SmsProviderTest.java5
-rw-r--r--core/tests/coretests/src/android/provider/TestFontsProvider.java2
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java5
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java9
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java5
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java5
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java4
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java58
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java4
-rw-r--r--core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java6
-rw-r--r--core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java154
-rw-r--r--core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java4
-rw-r--r--core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java9
-rw-r--r--core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java7
-rw-r--r--core/tests/coretests/src/android/text/AndroidCharacterTest.java3
-rw-r--r--core/tests/coretests/src/android/text/BidiFormatterTest.java5
-rw-r--r--core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java5
-rw-r--r--core/tests/coretests/src/android/text/DynamicLayoutTest.java5
-rw-r--r--core/tests/coretests/src/android/text/EmojiTest.java5
-rw-r--r--core/tests/coretests/src/android/text/FontFallbackSetup.java3
-rw-r--r--core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java7
-rw-r--r--core/tests/coretests/src/android/text/LayoutTest.java5
-rw-r--r--core/tests/coretests/src/android/text/MeasuredParagraphTest.java7
-rw-r--r--core/tests/coretests/src/android/text/PackedIntVectorTest.java5
-rw-r--r--core/tests/coretests/src/android/text/SpannableStringBuilderTest.java6
-rw-r--r--core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java5
-rw-r--r--core/tests/coretests/src/android/text/SpannableTest.java5
-rw-r--r--core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java5
-rw-r--r--core/tests/coretests/src/android/text/SpannedTest.java5
-rw-r--r--core/tests/coretests/src/android/text/StaticLayoutBidiTest.java5
-rw-r--r--core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java5
-rw-r--r--core/tests/coretests/src/android/text/StaticLayoutTest.java5
-rw-r--r--core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java5
-rw-r--r--core/tests/coretests/src/android/text/TextLayoutTest.java5
-rw-r--r--core/tests/coretests/src/android/text/TextLineTest.java21
-rw-r--r--core/tests/coretests/src/android/text/TextUtilsTest.java7
-rw-r--r--core/tests/coretests/src/android/text/VariationParserTest.java5
-rw-r--r--core/tests/coretests/src/android/text/format/DateFormatTest.java5
-rw-r--r--core/tests/coretests/src/android/text/format/DateUtilsTest.java5
-rw-r--r--core/tests/coretests/src/android/text/format/FormatterTest.java7
-rw-r--r--core/tests/coretests/src/android/text/format/TimeTest.java7
-rw-r--r--core/tests/coretests/src/android/text/method/BackspaceTest.java7
-rw-r--r--core/tests/coretests/src/android/text/method/EditorState.java2
-rw-r--r--core/tests/coretests/src/android/text/method/ForwardDeleteTest.java7
-rw-r--r--core/tests/coretests/src/android/text/method/WordIteratorTest.java5
-rw-r--r--core/tests/coretests/src/android/text/style/UnderlineSpanTest.java6
-rw-r--r--core/tests/coretests/src/android/text/util/LinkifyTest.java7
-rw-r--r--core/tests/coretests/src/android/transition/AutoTransitionTest.java12
-rw-r--r--core/tests/coretests/src/android/transition/FadeTransitionTest.java3
-rw-r--r--core/tests/coretests/src/android/transition/SlideTransitionTest.java4
-rw-r--r--core/tests/coretests/src/android/transition/TransitionTest.java3
-rw-r--r--core/tests/coretests/src/android/util/ArrayMapTest.java4
-rw-r--r--core/tests/coretests/src/android/util/Base64Test.java2
-rw-r--r--core/tests/coretests/src/android/util/DataUnitTest.java2
-rw-r--r--core/tests/coretests/src/android/util/DayOfMonthCursorTest.java3
-rw-r--r--core/tests/coretests/src/android/util/InternalSelectionView.java13
-rw-r--r--core/tests/coretests/src/android/util/KeyUtils.java6
-rw-r--r--core/tests/coretests/src/android/util/KeyValueListParserTest.java5
-rw-r--r--core/tests/coretests/src/android/util/ListUtil.java2
-rw-r--r--core/tests/coretests/src/android/util/LocalLogTest.java2
-rw-r--r--core/tests/coretests/src/android/util/LogNullabilityTest.java4
-rw-r--r--core/tests/coretests/src/android/util/LogTest.java9
-rw-r--r--core/tests/coretests/src/android/util/LongSparseLongArrayTest.java2
-rw-r--r--core/tests/coretests/src/android/util/LruCacheTest.java3
-rw-r--r--core/tests/coretests/src/android/util/MonthDisplayHelperTest.java6
-rw-r--r--core/tests/coretests/src/android/util/OrientationUtil.java1
-rw-r--r--core/tests/coretests/src/android/util/PatternsTest.java7
-rw-r--r--core/tests/coretests/src/android/util/RecurrenceRuleTest.java2
-rw-r--r--core/tests/coretests/src/android/util/SparseLongArrayTest.java7
-rw-r--r--core/tests/coretests/src/android/util/StateSetTest.java3
-rw-r--r--core/tests/coretests/src/android/util/TimestampedValueTest.java3
-rw-r--r--core/tests/coretests/src/android/util/TimingsTraceLogTest.java6
-rw-r--r--core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java4
-rw-r--r--core/tests/coretests/src/android/view/BigCache.java10
-rw-r--r--core/tests/coretests/src/android/view/BigCacheTest.java12
-rw-r--r--core/tests/coretests/src/android/view/BitmapDrawable.java13
-rw-r--r--core/tests/coretests/src/android/view/CreateViewTest.java9
-rw-r--r--core/tests/coretests/src/android/view/Disabled.java9
-rw-r--r--core/tests/coretests/src/android/view/DisabledLongpressTest.java5
-rw-r--r--core/tests/coretests/src/android/view/DisabledTest.java7
-rw-r--r--core/tests/coretests/src/android/view/DisplayCutoutTest.java6
-rw-r--r--core/tests/coretests/src/android/view/DrawableBgMinSize.java5
-rw-r--r--core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java11
-rw-r--r--core/tests/coretests/src/android/view/FocusFinderTest.java3
-rw-r--r--core/tests/coretests/src/android/view/GlobalFocusChange.java6
-rw-r--r--core/tests/coretests/src/android/view/GlobalFocusChangeTest.java18
-rw-r--r--core/tests/coretests/src/android/view/HandlerActionQueueTest.java3
-rw-r--r--core/tests/coretests/src/android/view/Include.java6
-rw-r--r--core/tests/coretests/src/android/view/IncludeTest.java10
-rw-r--r--core/tests/coretests/src/android/view/InflateTest.java8
-rw-r--r--core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java10
-rw-r--r--core/tests/coretests/src/android/view/InsetsControllerTest.java8
-rw-r--r--core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java6
-rw-r--r--core/tests/coretests/src/android/view/InsetsSourceTest.java6
-rw-r--r--core/tests/coretests/src/android/view/InsetsStateTest.java24
-rw-r--r--core/tests/coretests/src/android/view/KeyEventTest.java4
-rw-r--r--core/tests/coretests/src/android/view/ListContextMenu.java11
-rw-r--r--core/tests/coretests/src/android/view/Longpress.java4
-rw-r--r--core/tests/coretests/src/android/view/LongpressTest.java5
-rw-r--r--core/tests/coretests/src/android/view/MenuTest.java3
-rw-r--r--core/tests/coretests/src/android/view/Merge.java8
-rw-r--r--core/tests/coretests/src/android/view/MergeTest.java6
-rw-r--r--core/tests/coretests/src/android/view/MotionEventTest.java5
-rw-r--r--core/tests/coretests/src/android/view/MutateDrawable.java3
-rw-r--r--core/tests/coretests/src/android/view/MutateDrawableTest.java5
-rw-r--r--core/tests/coretests/src/android/view/PinchZoomAction.java2
-rw-r--r--core/tests/coretests/src/android/view/PopupWindowVisibility.java1
-rw-r--r--core/tests/coretests/src/android/view/PreDrawListener.java3
-rw-r--r--core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java9
-rw-r--r--core/tests/coretests/src/android/view/RunQueue.java3
-rw-r--r--core/tests/coretests/src/android/view/RunQueueTest.java3
-rw-r--r--core/tests/coretests/src/android/view/ScaleGesture.java9
-rw-r--r--core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java16
-rw-r--r--core/tests/coretests/src/android/view/SetTagsTest.java7
-rw-r--r--core/tests/coretests/src/android/view/StubbedView.java7
-rw-r--r--core/tests/coretests/src/android/view/VelocityTest.java9
-rw-r--r--core/tests/coretests/src/android/view/ViewAttachTest.java9
-rw-r--r--core/tests/coretests/src/android/view/ViewAttachTestActivity.java4
-rw-r--r--core/tests/coretests/src/android/view/ViewAttachView.java1
-rw-r--r--core/tests/coretests/src/android/view/ViewCaptureTest.java7
-rw-r--r--core/tests/coretests/src/android/view/ViewCaptureTestActivity.java1
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupAttributesTest.java3
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupChildren.java8
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupChildrenTest.java12
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java9
-rw-r--r--core/tests/coretests/src/android/view/ViewInvalidateTest.java56
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java7
-rw-r--r--core/tests/coretests/src/android/view/ViewStubTest.java12
-rw-r--r--core/tests/coretests/src/android/view/ViewTransientStateTest.java7
-rw-r--r--core/tests/coretests/src/android/view/Visibility.java7
-rw-r--r--core/tests/coretests/src/android/view/VisibilityCallback.java9
-rw-r--r--core/tests/coretests/src/android/view/VisibilityCallbackTest.java8
-rw-r--r--core/tests/coretests/src/android/view/VisibilityTest.java5
-rw-r--r--core/tests/coretests/src/android/view/WindowInsetsTest.java23
-rw-r--r--core/tests/coretests/src/android/view/ZeroSized.java6
-rw-r--r--core/tests/coretests/src/android/view/ZeroSizedTest.java11
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java5
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java3
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java6
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java5
-rw-r--r--core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java2
-rw-r--r--core/tests/coretests/src/android/view/autofill/AutofillIdTest.java151
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java158
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java462
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java5
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java7
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java7
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java5
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java5
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java5
-rw-r--r--core/tests/coretests/src/android/view/menu/ContextMenuTest.java3
-rw-r--r--core/tests/coretests/src/android/view/menu/MenuLayout.java2
-rw-r--r--core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java7
-rw-r--r--core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java4
-rw-r--r--core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java13
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java4
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java8
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java8
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java4
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java7
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java7
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java41
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java5
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java109
-rw-r--r--core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java17
-rw-r--r--core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java9
-rw-r--r--core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java14
-rw-r--r--core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java4
-rw-r--r--core/tests/coretests/src/android/widget/DatePickerActivity.java1
-rw-r--r--core/tests/coretests/src/android/widget/DatePickerFocusTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/DateTimeViewTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/EditorCursorTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/ListViewTest.java15
-rw-r--r--core/tests/coretests/src/android/widget/RadioGroupActivity.java4
-rw-r--r--core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/RemoteViewsTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/TextViewActivityTest.java17
-rw-r--r--core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/TextViewPerformanceTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/TextViewTest.java11
-rw-r--r--core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java5
-rw-r--r--core/tests/coretests/src/android/widget/focus/DescendantFocusability.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java8
-rw-r--r--core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java12
-rw-r--r--core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java8
-rw-r--r--core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java13
-rw-r--r--core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java1
-rw-r--r--core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListOfButtons.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java16
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java7
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java2
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java3
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java17
-rw-r--r--core/tests/coretests/src/android/widget/focus/RequestFocus.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/RequestFocusTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java8
-rw-r--r--core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridDelete.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSimple.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/gridview/GridThrasher.java6
-rw-r--r--core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java1
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java2
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java1
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/Weight.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/WeightSum.java5
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/linear/WeightTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/AddColumn.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/CellSpan.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/FixedWidth.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/Weight.java4
-rw-r--r--core/tests/coretests/src/android/widget/layout/table/WeightTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListBottomGravity.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListFilter.java1
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListFocusableTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListInHorizontal.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListInVertical.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java11
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListManagedCursor.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListOfTouchables.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListSetSelection.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListSimple.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListThrasher.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListTopGravity.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java9
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListWithHeaders.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java2
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java3
-rw-r--r--core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java11
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java4
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java1
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java9
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java1
-rw-r--r--core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java6
-rw-r--r--core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java16
-rw-r--r--core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java11
-rw-r--r--core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java7
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java5
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/scroll/ShortButtons.java1
-rw-r--r--core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java10
-rw-r--r--core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java6
-rw-r--r--core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java11
-rw-r--r--core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java8
-rw-r--r--core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java5
-rw-r--r--core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java2
-rw-r--r--core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java48
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java52
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java25
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java9
-rw-r--r--core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java10
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java10
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java6
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java10
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java9
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java14
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java14
-rw-r--r--core/tests/coretests/src/com/android/internal/os/DebugTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java214
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java20
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java6
-rw-r--r--core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java6
-rw-r--r--core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java9
-rw-r--r--core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java7
-rw-r--r--core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/util/TokenBucketTest.java (renamed from core/tests/coretests/src/android/util/TokenBucketTest.java)19
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java9
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java5
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java6
-rw-r--r--core/tests/hdmitests/Android.mk2
-rw-r--r--core/tests/hdmitests/AndroidManifest.xml2
-rw-r--r--core/tests/hdmitests/AndroidTest.xml2
-rw-r--r--core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java28
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk11
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyAndException/AndroidManifest.xml2
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/MultiDexAndroidJUnitRunner.java3
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/NoActivityJUnit4Test.java3
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk8
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk4
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/InstrumentationTest.java5
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/MultiDexAndroidJUnitRunner.java3
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk2
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml2
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java18
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk4
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk4
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk4
-rw-r--r--core/tests/overlaytests/device/Android.mk2
-rw-r--r--core/tests/overlaytests/device/AndroidManifest.xml2
-rw-r--r--core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java3
-rw-r--r--core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java2
-rw-r--r--core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java2
-rw-r--r--core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java2
-rw-r--r--data/etc/Android.bp48
-rw-r--r--data/etc/com.android.carrierconfig.xml21
-rw-r--r--data/etc/com.android.contacts.xml22
-rw-r--r--data/etc/com.android.launcher3.xml23
-rw-r--r--data/etc/com.android.provision.xml21
-rw-r--r--data/etc/com.android.settings.intelligence.xml24
-rw-r--r--data/etc/com.android.storagemanager.xml26
-rw-r--r--data/etc/com.android.systemui.xml2
-rw-r--r--data/etc/platform.xml6
-rw-r--r--data/etc/privapp-permissions-platform.xml57
-rw-r--r--data/fonts/fonts.xml45
-rw-r--r--data/sounds/AllAudio.mk448
-rw-r--r--data/sounds/AudioPackage10.mk120
-rw-r--r--data/sounds/AudioPackage11.mk120
-rw-r--r--data/sounds/AudioPackage12.mk10
-rw-r--r--data/sounds/AudioPackage12_48.mk16
-rw-r--r--data/sounds/AudioPackage13.mk10
-rw-r--r--data/sounds/AudioPackage13_48.mk16
-rw-r--r--data/sounds/AudioPackage14.mk10
-rw-r--r--data/sounds/AudioPackage2.mk182
-rw-r--r--data/sounds/AudioPackage3.mk174
-rw-r--r--data/sounds/AudioPackage4.mk182
-rw-r--r--data/sounds/AudioPackage5.mk132
-rw-r--r--data/sounds/AudioPackage6.mk76
-rw-r--r--data/sounds/AudioPackage7.mk122
-rw-r--r--data/sounds/AudioPackage7alt.mk120
-rw-r--r--data/sounds/AudioPackage8.mk126
-rw-r--r--data/sounds/AudioPackage9.mk80
-rw-r--r--data/sounds/AudioPackageGo.mk54
-rw-r--r--data/sounds/AudioTv.mk10
-rw-r--r--data/sounds/OriginalAudio.mk120
-rw-r--r--drm/java/android/drm/DrmManagerClient.java3
-rw-r--r--graphics/java/android/graphics/BaseCanvas.java23
-rw-r--r--graphics/java/android/graphics/BaseRecordingCanvas.java20
-rw-r--r--graphics/java/android/graphics/Bitmap.java28
-rw-r--r--graphics/java/android/graphics/BitmapFactory.java3
-rw-r--r--graphics/java/android/graphics/Canvas.java29
-rw-r--r--graphics/java/android/graphics/ColorSpace.java35
-rw-r--r--graphics/java/android/graphics/Paint.java164
-rw-r--r--graphics/java/android/graphics/Typeface.java5
-rw-r--r--libs/androidfw/AssetManager2.cpp207
-rw-r--r--libs/androidfw/AttributeResolution.cpp9
-rw-r--r--libs/androidfw/CursorWindow.cpp2
-rw-r--r--libs/androidfw/LoadedArsc.cpp15
-rw-r--r--libs/androidfw/ResourceUtils.cpp61
-rw-r--r--libs/androidfw/ZipUtils.cpp2
-rw-r--r--libs/androidfw/include/androidfw/AssetDir.h2
-rw-r--r--libs/androidfw/include/androidfw/AssetManager2.h50
-rw-r--r--libs/androidfw/include/androidfw/AttributeResolution.h8
-rw-r--r--libs/androidfw/include/androidfw/BackupHelpers.h4
-rw-r--r--libs/androidfw/include/androidfw/ConfigDescription.h2
-rw-r--r--libs/androidfw/include/androidfw/DisplayEventDispatcher.h2
-rw-r--r--libs/androidfw/include/androidfw/LoadedArsc.h2
-rw-r--r--libs/androidfw/include/androidfw/ResourceTypes.h16
-rw-r--r--libs/androidfw/include/androidfw/ResourceUtils.h12
-rw-r--r--libs/androidfw/include/androidfw/StringPiece.h4
-rw-r--r--libs/androidfw/include/androidfw/TypeWrappers.h2
-rw-r--r--libs/androidfw/include/androidfw/Util.h2
-rw-r--r--libs/androidfw/tests/AssetManager2_test.cpp107
-rw-r--r--libs/androidfw/tests/LoadedArsc_test.cpp9
-rw-r--r--libs/androidfw/tests/data/overlayable/overlayable.apkbin1387 -> 3443 bytes
-rw-r--r--libs/androidfw/tests/data/overlayable/res/values/overlayable.xml10
-rw-r--r--libs/hwui/DeviceInfo.cpp3
-rw-r--r--libs/hwui/HardwareBitmapUploader.cpp13
-rw-r--r--libs/hwui/HardwareBitmapUploader.h1
-rw-r--r--libs/hwui/Matrix.h2
-rw-r--r--libs/hwui/Rect.h8
-rw-r--r--libs/hwui/SkiaCanvas.cpp8
-rw-r--r--libs/hwui/SkiaCanvas.h4
-rw-r--r--libs/hwui/WebViewFunctorManager.cpp25
-rw-r--r--libs/hwui/WebViewFunctorManager.h9
-rw-r--r--libs/hwui/debug/GlesErrorCheckWrapper.h2
-rw-r--r--libs/hwui/hwui/Canvas.cpp2
-rw-r--r--libs/hwui/hwui/Canvas.h6
-rw-r--r--libs/hwui/hwui/Paint.h2
-rw-r--r--libs/hwui/pipeline/skia/ShaderCache.cpp40
-rw-r--r--libs/hwui/pipeline/skia/ShaderCache.h34
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp5
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h1
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.cpp21
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.h10
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp2
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp8
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.h1
-rw-r--r--libs/hwui/pipeline/skia/VkFunctorDrawable.cpp59
-rw-r--r--libs/hwui/pipeline/skia/VkFunctorDrawable.h12
-rw-r--r--libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp44
-rw-r--r--libs/hwui/private/hwui/DrawVkInfo.h128
-rw-r--r--libs/hwui/private/hwui/WebViewFunctor.h13
-rw-r--r--libs/hwui/renderthread/CacheManager.cpp29
-rw-r--r--libs/hwui/renderthread/EglManager.cpp4
-rw-r--r--libs/hwui/renderthread/IRenderPipeline.h1
-rw-r--r--libs/hwui/renderthread/RenderThread.cpp3
-rw-r--r--libs/hwui/renderthread/RenderThread.h6
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp152
-rw-r--r--libs/hwui/renderthread/VulkanManager.h19
-rw-r--r--libs/hwui/service/GraphicsStatsService.cpp10
-rw-r--r--libs/hwui/tests/common/TestUtils.cpp4
-rw-r--r--libs/hwui/tests/common/scenes/BitmapFillrate.cpp4
-rw-r--r--libs/hwui/tests/common/scenes/BitmapShaders.cpp2
-rw-r--r--libs/hwui/tests/common/scenes/TvApp.cpp8
-rw-r--r--libs/hwui/tests/macrobench/main.cpp5
-rw-r--r--libs/hwui/tests/unit/SkiaCanvasTests.cpp4
-rw-r--r--libs/hwui/tests/unit/SkiaPipelineTests.cpp76
-rw-r--r--libs/hwui/tests/unit/SkiaRenderPropertiesTests.cpp2
-rw-r--r--libs/hwui/tests/unit/ThreadBaseTests.cpp4
-rw-r--r--libs/hwui/thread/ThreadBase.h2
-rw-r--r--libs/hwui/utils/Color.cpp46
-rw-r--r--libs/hwui/utils/Color.h5
-rw-r--r--libs/hwui/utils/LinearAllocator.h2
-rw-r--r--libs/input/PointerController.cpp141
-rw-r--r--libs/input/PointerController.h18
-rw-r--r--libs/input/SpriteController.cpp24
-rw-r--r--libs/input/SpriteController.h8
-rw-r--r--libs/protoutil/include/android/util/EncodedBuffer.h6
-rw-r--r--libs/services/include/android/os/DropBoxManager.h5
-rw-r--r--libs/services/src/os/DropBoxManager.cpp11
-rw-r--r--libs/usb/api/current.txt19
-rw-r--r--libs/usb/api/removed.txt1
-rw-r--r--libs/usb/api/system-current.txt1
-rw-r--r--libs/usb/api/system-removed.txt1
-rw-r--r--libs/usb/api/test-current.txt1
-rw-r--r--libs/usb/api/test-removed.txt1
-rw-r--r--location/java/android/location/GnssMeasurement.java199
-rw-r--r--location/java/android/location/GnssSingleSatCorrection.java51
-rw-r--r--location/java/android/location/ILocationManager.aidl7
-rw-r--r--location/java/android/location/LocationManager.java29
-rw-r--r--location/java/com/android/internal/location/GpsNetInitiatedHandler.java29
-rw-r--r--location/lib/Android.bp4
-rw-r--r--location/lib/api/current.txt25
-rw-r--r--location/lib/api/removed.txt1
-rw-r--r--location/lib/api/system-current.txt1
-rw-r--r--location/lib/api/system-removed.txt1
-rw-r--r--location/lib/api/test-current.txt1
-rw-r--r--location/lib/api/test-removed.txt1
-rw-r--r--location/lib/java/com/android/location/provider/ActivityChangedEvent.java57
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java71
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java133
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java76
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java90
-rw-r--r--location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java4
-rw-r--r--location/tests/locationtests/src/android/location/GnssSingleSatCorrectionsTest.java6
-rw-r--r--media/Android.bp50
-rw-r--r--media/apex/java/android/media/BufferingParams.java (renamed from media/java/android/media/BufferingParams.java)0
-rw-r--r--media/apex/java/android/media/CallbackDataSourceDesc.java (renamed from media/java/android/media/CallbackDataSourceDesc.java)0
-rw-r--r--media/apex/java/android/media/CloseGuard.java (renamed from media/java/android/media/CloseGuard.java)0
-rw-r--r--media/apex/java/android/media/DataSourceCallback.java (renamed from media/java/android/media/DataSourceCallback.java)0
-rw-r--r--media/apex/java/android/media/DataSourceDesc.java (renamed from media/java/android/media/DataSourceDesc.java)0
-rw-r--r--media/apex/java/android/media/FileDataSourceDesc.java (renamed from media/java/android/media/FileDataSourceDesc.java)0
-rw-r--r--media/apex/java/android/media/Media2HTTPConnection.java (renamed from media/java/android/media/Media2HTTPConnection.java)0
-rw-r--r--media/apex/java/android/media/Media2HTTPService.java (renamed from media/java/android/media/Media2HTTPService.java)0
-rw-r--r--media/apex/java/android/media/Media2Utils.java (renamed from media/java/android/media/Media2Utils.java)0
-rw-r--r--media/apex/java/android/media/MediaPlayer2.java (renamed from media/java/android/media/MediaPlayer2.java)415
-rw-r--r--media/apex/java/android/media/MediaPlayer2Utils.java (renamed from media/java/android/media/MediaPlayer2Utils.java)0
-rw-r--r--media/apex/java/android/media/RoutingDelegate.java (renamed from media/java/android/media/RoutingDelegate.java)0
-rw-r--r--media/apex/java/android/media/UriDataSourceDesc.java (renamed from media/java/android/media/UriDataSourceDesc.java)0
-rw-r--r--media/apex/java/android/media/VideoSize.java (renamed from media/java/android/media/VideoSize.java)0
-rw-r--r--media/java/android/media/AudioAttributes.java11
-rw-r--r--media/java/android/media/AudioFormat.java3
-rw-r--r--media/java/android/media/AudioManager.java65
-rw-r--r--media/java/android/media/AudioRecord.java34
-rw-r--r--media/java/android/media/AudioRecordingConfiguration.java3
-rw-r--r--media/java/android/media/AudioSystem.java51
-rw-r--r--media/java/android/media/Controller2Link.java53
-rw-r--r--media/java/android/media/IAudioService.aidl3
-rw-r--r--media/java/android/media/IMediaController2.aidl7
-rw-r--r--media/java/android/media/IMediaSession2Service.aidl32
-rw-r--r--media/java/android/media/ImageReader.java15
-rw-r--r--media/java/android/media/ImageWriter.java1
-rw-r--r--media/java/android/media/MediaCodec.java64
-rw-r--r--media/java/android/media/MediaCodecInfo.java374
-rw-r--r--media/java/android/media/MediaCodecList.java6
-rw-r--r--media/java/android/media/MediaConstants.java3
-rw-r--r--media/java/android/media/MediaController2.java279
-rw-r--r--media/java/android/media/MediaDrm.java288
-rw-r--r--media/java/android/media/MediaFormat.java1
-rw-r--r--media/java/android/media/MediaRecorder.java50
-rw-r--r--media/java/android/media/MediaSession2.java302
-rw-r--r--media/java/android/media/MediaSession2Service.java288
-rw-r--r--media/java/android/media/MicrophoneDirection.java62
-rw-r--r--media/java/android/media/Session2Command.java12
-rw-r--r--media/java/android/media/Session2CommandGroup.java19
-rw-r--r--media/java/android/media/Session2Link.java48
-rw-r--r--media/java/android/media/Session2Token.aidl (renamed from core/java/android/hardware/location/ActivityChangedEvent.aidl)8
-rw-r--r--media/java/android/media/Session2Token.java52
-rw-r--r--media/java/android/media/session/ControllerCallbackLink.aidl18
-rw-r--r--media/java/android/media/session/ControllerCallbackLink.java272
-rw-r--r--media/java/android/media/session/ISession.aidl4
-rw-r--r--media/java/android/media/session/ISession2TokensListener.aidl27
-rw-r--r--media/java/android/media/session/ISessionCallback.aidl62
-rw-r--r--media/java/android/media/session/ISessionController.aidl57
-rw-r--r--media/java/android/media/session/ISessionControllerCallback.aidl21
-rw-r--r--media/java/android/media/session/ISessionManager.aidl11
-rw-r--r--media/java/android/media/session/MediaController.aidl (renamed from media/java/android/media/session/ParcelableVolumeInfo.aidl)2
-rw-r--r--media/java/android/media/session/MediaController.java113
-rw-r--r--media/java/android/media/session/MediaSession.java60
-rw-r--r--media/java/android/media/session/MediaSessionManager.java196
-rw-r--r--media/java/android/media/session/MediaSessionProviderService.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java)25
-rw-r--r--media/java/android/media/session/ParcelableVolumeInfo.java80
-rw-r--r--media/java/android/media/session/SessionCallbackLink.aidl18
-rw-r--r--media/java/android/media/session/SessionCallbackLink.java776
-rw-r--r--media/java/android/media/soundtrigger/SoundTriggerManager.java1
-rw-r--r--media/jni/Android.bp10
-rw-r--r--media/jni/android_media_MediaCodec.cpp58
-rw-r--r--media/jni/android_media_MediaCodecList.cpp80
-rw-r--r--media/jni/android_media_MediaDrm.cpp59
-rw-r--r--media/jni/android_media_MediaPlayer2.cpp19
-rw-r--r--media/jni/android_mtp_MtpDatabase.cpp30
-rw-r--r--media/lib/remotedisplay/api/current.txt1
-rw-r--r--media/lib/remotedisplay/api/removed.txt1
-rw-r--r--media/lib/remotedisplay/api/system-current.txt17
-rw-r--r--media/lib/remotedisplay/api/system-removed.txt1
-rw-r--r--media/lib/remotedisplay/api/test-current.txt1
-rw-r--r--media/lib/remotedisplay/api/test-removed.txt1
-rw-r--r--media/lib/signer/Android.bp4
-rw-r--r--media/lib/signer/api/current.txt7
-rw-r--r--media/lib/signer/api/removed.txt1
-rw-r--r--media/lib/signer/api/system-current.txt1
-rw-r--r--media/lib/signer/api/system-removed.txt1
-rw-r--r--media/lib/signer/api/test-current.txt1
-rw-r--r--media/lib/signer/api/test-removed.txt1
-rw-r--r--media/lib/tvremote/api/current.txt5
-rw-r--r--media/lib/tvremote/api/removed.txt1
-rw-r--r--media/lib/tvremote/api/system-current.txt1
-rw-r--r--media/lib/tvremote/api/system-removed.txt1
-rw-r--r--media/lib/tvremote/api/test-current.txt1
-rw-r--r--media/lib/tvremote/api/test-removed.txt1
-rw-r--r--media/packages/MediaCore/Android.bp21
-rw-r--r--media/packages/MediaCore/AndroidManifest.xml32
-rw-r--r--media/packages/MediaCore/res/values/strings.xml21
-rw-r--r--media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java37
-rw-r--r--media/tests/players/Android.mk2
-rw-r--r--native/android/Android.bp5
-rw-r--r--native/android/libandroid.map.txt13
-rw-r--r--native/android/net.c10
-rw-r--r--native/android/sensor.cpp5
-rw-r--r--native/android/sharedmem.cpp2
-rw-r--r--native/android/surface_control.cpp232
-rw-r--r--native/webview/plat_support/Android.bp1
-rw-r--r--native/webview/plat_support/draw_fn.h42
-rw-r--r--native/webview/plat_support/draw_functor.cpp79
-rw-r--r--native/webview/plat_support/draw_vk.h125
-rw-r--r--native/webview/plat_support/draw_vk_functor.cpp142
-rw-r--r--nfc-extras/api/current.txt21
-rw-r--r--nfc-extras/api/removed.txt1
-rw-r--r--nfc-extras/api/system-current.txt1
-rw-r--r--nfc-extras/api/system-removed.txt1
-rw-r--r--nfc-extras/api/test-current.txt1
-rw-r--r--nfc-extras/api/test-removed.txt1
-rw-r--r--obex/api/current.txt1
-rw-r--r--obex/api/removed.txt1
-rw-r--r--obex/api/system-current.txt1
-rw-r--r--obex/api/system-removed.txt1
-rw-r--r--obex/api/test-current.txt1
-rw-r--r--obex/api/test-removed.txt1
-rw-r--r--packages/AppPredictionLib/Android.bp24
-rw-r--r--packages/AppPredictionLib/AndroidManifest.xml20
-rw-r--r--packages/AppPredictionLib/src/com/android/app/prediction/Constants.java71
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java4
-rw-r--r--packages/CarrierDefaultApp/tests/unit/Android.mk2
-rw-r--r--packages/CarrierDefaultApp/tests/unit/AndroidManifest.xml2
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/Assistant.java14
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java14
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java64
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/SmartActionHelperTest.java18
-rw-r--r--packages/NetworkStack/Android.bp4
-rw-r--r--packages/NetworkStack/AndroidManifest.xml6
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpLease.java (renamed from services/net/java/android/net/dhcp/DhcpLease.java)12
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpLeaseRepository.java (renamed from services/net/java/android/net/dhcp/DhcpLeaseRepository.java)11
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java (renamed from services/net/java/android/net/dhcp/DhcpPacketListener.java)24
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpServer.java (renamed from services/net/java/android/net/dhcp/DhcpServer.java)162
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java (renamed from services/net/java/android/net/dhcp/DhcpServingParams.java)119
-rw-r--r--packages/NetworkStack/src/android/net/util/SharedLog.java201
-rw-r--r--packages/NetworkStack/src/android/net/util/Stopwatch.java (renamed from services/net/java/android/net/util/Stopwatch.java)22
-rw-r--r--packages/NetworkStack/src/com/android/server/NetworkStackService.java180
-rw-r--r--packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java (renamed from services/core/java/com/android/server/connectivity/NetworkMonitor.java)495
-rw-r--r--packages/NetworkStack/src/com/android/server/util/NetworkStackConstants.java45
-rw-r--r--packages/NetworkStack/src/com/android/server/util/PermissionUtil.java55
-rw-r--r--packages/NetworkStack/tests/Android.bp35
-rw-r--r--packages/NetworkStack/tests/AndroidManifest.xml25
-rw-r--r--packages/NetworkStack/tests/AndroidTest.xml29
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java (renamed from tests/net/java/android/net/dhcp/DhcpLeaseRepositoryTest.java)6
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java (renamed from tests/net/java/android/net/dhcp/DhcpServerTest.java)58
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java (renamed from tests/net/java/android/net/dhcp/DhcpServingParamsTest.java)50
-rw-r--r--packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java (renamed from tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java)206
-rw-r--r--packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java96
-rw-r--r--packages/PackageInstaller/res/values-da/strings.xml2
-rw-r--r--packages/PackageInstaller/res/values-mr/strings.xml2
-rw-r--r--packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarChartPreference.java2
-rw-r--r--packages/SettingsLib/EntityHeaderWidgets/res/layout/app_view.xml2
-rw-r--r--packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntitiesHeaderController.java85
-rw-r--r--packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntityInfo.java129
-rw-r--r--packages/SettingsLib/SearchWidget/res/values-fa/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-as/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml120
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml78
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml88
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml39
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml78
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml84
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml78
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml80
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml80
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml78
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml84
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml84
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-te/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml76
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml76
-rw-r--r--packages/SettingsLib/res/values/arrays.xml14
-rw-r--r--packages/SettingsLib/res/values/strings.xml84
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/Utils.java15
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java12
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java27
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java484
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java117
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java13
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java40
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java35
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java26
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java25
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java43
-rw-r--r--packages/SettingsProvider/test/AndroidManifest.xml2
-rw-r--r--packages/Shell/AndroidManifest.xml7
-rw-r--r--packages/Shell/src/com/android/shell/BugreportProgressService.java74
-rw-r--r--packages/SystemUI/AndroidManifest.xml1
-rw-r--r--packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml9
-rw-r--r--packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml9
-rw-r--r--packages/SystemUI/res-keyguard/layout/bubble_clock.xml46
-rw-r--r--packages/SystemUI/res-keyguard/layout/digital_clock.xml28
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml12
-rw-r--r--packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml31
-rw-r--r--packages/SystemUI/res-keyguard/layout/text_clock.xml29
-rw-r--r--packages/SystemUI/res-keyguard/layout/type_clock.xml55
-rw-r--r--packages/SystemUI/res-keyguard/values/colors.xml24
-rw-r--r--packages/SystemUI/res-keyguard/values/dimens.xml2
-rw-r--r--packages/SystemUI/res-keyguard/values/strings.xml83
-rw-r--r--packages/SystemUI/res/drawable/biometric_dialog_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/bubble_expanded_header_bg.xml32
-rw-r--r--packages/SystemUI/res/layout/battery_percentage_view.xml2
-rw-r--r--packages/SystemUI/res/layout/bubble_expanded_view.xml16
-rw-r--r--packages/SystemUI/res/layout/bubble_view.xml38
-rw-r--r--packages/SystemUI/res/layout/dock_info_overlay.xml (renamed from core/res/res/layout/notification_template_ambient_header.xml)15
-rw-r--r--packages/SystemUI/res/layout/global_actions_wrapped.xml1
-rw-r--r--packages/SystemUI/res/layout/ongoing_privacy_dialog_item.xml14
-rw-r--r--packages/SystemUI/res/layout/quick_qs_status_icons.xml7
-rw-r--r--packages/SystemUI/res/layout/quick_settings_footer_dialog.xml8
-rw-r--r--packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml5
-rw-r--r--packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml7
-rw-r--r--packages/SystemUI/res/layout/signal_cluster_view.xml129
-rw-r--r--packages/SystemUI/res/layout/status_bar_expanded.xml2
-rw-r--r--packages/SystemUI/res/layout/super_status_bar.xml8
-rw-r--r--packages/SystemUI/res/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml3
-rw-r--r--packages/SystemUI/res/values-as/strings.xml6
-rw-r--r--packages/SystemUI/res/values-be/strings.xml7
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml3
-rw-r--r--packages/SystemUI/res/values-da/strings.xml93
-rw-r--r--packages/SystemUI/res/values-de/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml3
-rw-r--r--packages/SystemUI/res/values-in/strings.xml3
-rw-r--r--packages/SystemUI/res/values-is/strings.xml3
-rw-r--r--packages/SystemUI/res/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-km/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml6
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml3
-rw-r--r--packages/SystemUI/res/values-my/strings.xml3
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml6
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-or/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml5
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml6
-rw-r--r--packages/SystemUI/res/values-te/strings.xml6
-rw-r--r--packages/SystemUI/res/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml3
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml3
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res/values/config.xml11
-rw-r--r--packages/SystemUI/res/values/dimens.xml27
-rw-r--r--packages/SystemUI/res/values/ids.xml10
-rw-r--r--packages/SystemUI/res/values/styles.xml38
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java2
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java35
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl6
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java112
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java4
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java241
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java8
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java30
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java30
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java114
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java101
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/CrossFadeDarkController.java62
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/ImageClock.java94
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClock.java142
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java115
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java106
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java110
-rw-r--r--packages/SystemUI/src/com/android/systemui/BatteryMeterView.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dependency.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/DependencyBinder.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/MultiListLayout.java124
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIFactory.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/appops/AppOpItem.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java141
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java129
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java286
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java80
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java129
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java345
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java163
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java267
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeHost.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeLog.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java99
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java53
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java56
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLifetimeExtender.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java59
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java694
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationData.java1072
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java255
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java123
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java117
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java424
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java726
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java157
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java62
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java33
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInflater.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java143
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationAssistantAction.java54
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBackAction.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java51
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java56
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java75
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java35
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java61
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java90
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java75
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java119
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java51
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java58
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java115
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java222
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperFilter.java81
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperTransformer.java173
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/ScrimFilter.java67
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/VignetteFilter.java124
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java127
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java66
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/CrossFadeDarkControllerTest.java94
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java66
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java39
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java66
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java36
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java99
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java42
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java151
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java241
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationDataTest.java)29
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java145
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java32
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java100
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java16
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java50
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java30
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupTestHelper.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java98
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java98
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java177
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java88
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java69
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java94
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wallpaper/AodMaskViewTest.java128
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wallpaper/ImageWallpaperTransformerTest.java93
-rw-r--r--packages/VpnDialogs/res/values-as/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-ne/strings.xml2
-rw-r--r--packages/WallpaperCropper/Android.mk1
-rw-r--r--packages/WallpaperCropper/CleanSpec.mk50
-rw-r--r--packages/overlays/FontArbutusSourceOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/FontArvoLatoOverlay/res/values/config.xml4
-rw-r--r--packages/services/PacProcessor/Android.mk2
-rw-r--r--packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp58
-rw-r--r--proto/src/metrics_constants/metrics_constants.proto90
-rw-r--r--proto/src/wifi.proto32
-rw-r--r--services/Android.bp4
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java45
-rw-r--r--services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java102
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationController.java5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/TouchExplorer.java19
-rw-r--r--services/appprediction/Android.bp5
-rw-r--r--services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java156
-rw-r--r--services/appprediction/java/com/android/server/appprediction/AppPredictionManagerServiceShellCommand.java83
-rw-r--r--services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java218
-rw-r--r--services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java142
-rw-r--r--services/art-profile2
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerService.java27
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java25
-rw-r--r--services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java6
-rw-r--r--services/autofill/java/com/android/server/autofill/RemoteFillService.java3
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java14
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java28
-rw-r--r--services/backup/java/com/android/server/backup/FullBackupJob.java71
-rw-r--r--services/backup/java/com/android/server/backup/JobIdManager.java30
-rw-r--r--services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java11
-rw-r--r--services/backup/java/com/android/server/backup/KeyValueBackupJob.java76
-rw-r--r--services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java35
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java8
-rw-r--r--services/backup/java/com/android/server/backup/TransportManager.java21
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerFiles.java26
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java495
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/AppMetadataBackupWriter.java7
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java37
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java88
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java8
-rw-r--r--services/backup/java/com/android/server/backup/internal/ProvisionedObserver.java62
-rw-r--r--services/backup/java/com/android/server/backup/internal/RunBackupReceiver.java107
-rw-r--r--services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java53
-rw-r--r--services/backup/java/com/android/server/backup/internal/SetupObserver.java86
-rw-r--r--services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java19
-rw-r--r--services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java5
-rw-r--r--services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java17
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java25
-rw-r--r--services/backup/java/com/android/server/backup/transport/TransportClient.java9
-rw-r--r--services/backup/java/com/android/server/backup/transport/TransportClientManager.java9
-rw-r--r--services/backup/java/com/android/server/backup/utils/AppBackupUtils.java9
-rw-r--r--services/backup/java/com/android/server/backup/utils/RestoreUtils.java8
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java52
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java95
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java2
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java14
-rw-r--r--services/contentsuggestions/Android.bp5
-rw-r--r--services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java205
-rw-r--r--services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java84
-rw-r--r--services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java162
-rw-r--r--services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java97
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java2
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java275
-rw-r--r--services/core/java/com/android/server/IntentResolver.java30
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java2468
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java45
-rw-r--r--services/core/java/com/android/server/PackageWatchdog.java106
-rw-r--r--services/core/java/com/android/server/RescueParty.java3
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java21
-rw-r--r--services/core/java/com/android/server/TEST_MAPPING15
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java122
-rw-r--r--services/core/java/com/android/server/VibratorService.java32
-rw-r--r--services/core/java/com/android/server/ZramWriteback.java187
-rw-r--r--services/core/java/com/android/server/adb/AdbService.java3
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java43
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerConstants.java32
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java2423
-rw-r--r--services/core/java/com/android/server/am/AppCompactor.java80
-rw-r--r--services/core/java/com/android/server/am/CoreSettingsObserver.java4
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java2107
-rw-r--r--services/core/java/com/android/server/am/PendingIntentRecord.java13
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java313
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java5
-rw-r--r--services/core/java/com/android/server/am/SettingsToPropertiesMapper.java1
-rw-r--r--services/core/java/com/android/server/am/TEST_MAPPING4
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java (renamed from services/core/java/com/android/server/AppOpsService.java)328
-rw-r--r--services/core/java/com/android/server/appop/HistoricalRegistry.java1496
-rw-r--r--services/core/java/com/android/server/attention/AttentionManagerService.java548
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java397
-rw-r--r--services/core/java/com/android/server/audio/RecordingActivityMonitor.java2
-rw-r--r--services/core/java/com/android/server/biometrics/BiometricService.java75
-rw-r--r--services/core/java/com/android/server/biometrics/BiometricServiceBase.java4
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceService.java13
-rw-r--r--services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java9
-rw-r--r--services/core/java/com/android/server/connectivity/ConnectivityConstants.java16
-rw-r--r--services/core/java/com/android/server/connectivity/DnsManager.java48
-rw-r--r--services/core/java/com/android/server/connectivity/KeepaliveTracker.java5
-rw-r--r--services/core/java/com/android/server/connectivity/Nat464Xlat.java13
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkAgentInfo.java40
-rw-r--r--services/core/java/com/android/server/connectivity/PacManager.java1
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java2
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java25
-rw-r--r--services/core/java/com/android/server/content/SyncJobService.java5
-rw-r--r--services/core/java/com/android/server/content/SyncLogger.java19
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java59
-rw-r--r--services/core/java/com/android/server/content/SyncOperation.java11
-rw-r--r--services/core/java/com/android/server/content/SyncStorageEngine.java15
-rw-r--r--services/core/java/com/android/server/display/AppSaturationController.java213
-rw-r--r--services/core/java/com/android/server/display/AutomaticBrightnessController.java212
-rw-r--r--services/core/java/com/android/server/display/BrightnessMappingStrategy.java124
-rw-r--r--services/core/java/com/android/server/display/ColorDisplayService.java468
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java70
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerShellCommand.java18
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java11
-rw-r--r--services/core/java/com/android/server/display/PersistentDataStore.java95
-rw-r--r--services/core/java/com/android/server/display/VirtualDisplayAdapter.java21
-rw-r--r--services/core/java/com/android/server/dreams/DreamManagerService.java39
-rw-r--r--services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java34
-rw-r--r--services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java3
-rw-r--r--services/core/java/com/android/server/hdmi/Constants.java94
-rw-r--r--services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java6
-rwxr-xr-xservices/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java133
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecController.java24
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java4
-rwxr-xr-xservices/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java79
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java860
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java136
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java307
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java28
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessage.java16
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java14
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java393
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiUtils.java357
-rw-r--r--services/core/java/com/android/server/hdmi/OneTouchPlayAction.java21
-rw-r--r--services/core/java/com/android/server/hdmi/SelectRequestBuffer.java14
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java28
-rw-r--r--services/core/java/com/android/server/infra/AbstractMasterSystemService.java19
-rw-r--r--services/core/java/com/android/server/infra/AbstractPerUserSystemService.java13
-rw-r--r--services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java2
-rw-r--r--services/core/java/com/android/server/infra/SecureSettingsServiceNameResolver.java5
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java72
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java46
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java368
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodUtils.java64
-rw-r--r--services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java27
-rw-r--r--services/core/java/com/android/server/job/JobConcurrencyManager.java529
-rw-r--r--services/core/java/com/android/server/job/JobSchedulerService.java239
-rw-r--r--services/core/java/com/android/server/job/controllers/QuotaController.java248
-rw-r--r--services/core/java/com/android/server/location/AbstractLocationProvider.java14
-rw-r--r--services/core/java/com/android/server/location/ActivityRecognitionProxy.java118
-rw-r--r--services/core/java/com/android/server/location/GeofenceProxy.java8
-rw-r--r--services/core/java/com/android/server/location/GnssConfiguration.java415
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java293
-rw-r--r--services/core/java/com/android/server/location/GnssVisibilityControl.java384
-rw-r--r--services/core/java/com/android/server/location/LocationProviderProxy.java2
-rw-r--r--services/core/java/com/android/server/location/LocationRequestStatistics.java19
-rw-r--r--services/core/java/com/android/server/location/MockProvider.java7
-rw-r--r--services/core/java/com/android/server/location/PassiveProvider.java3
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java25
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java20
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java33
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java16
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java67
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java17
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java38
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java17
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java1
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java13
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java38
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java6
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java15
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java401
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java1889
-rw-r--r--services/core/java/com/android/server/media/MediaSessionServiceImpl.java2142
-rw-r--r--services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java23
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java9
-rw-r--r--services/core/java/com/android/server/net/NetworkStatsService.java58
-rw-r--r--services/core/java/com/android/server/notification/ManagedServices.java17
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java53
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java62
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java105
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java4
-rw-r--r--services/core/java/com/android/server/notification/SnoozeHelper.java26
-rw-r--r--services/core/java/com/android/server/notification/ZenModeHelper.java3
-rw-r--r--services/core/java/com/android/server/om/IdmapManager.java84
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerServiceImpl.java4
-rw-r--r--services/core/java/com/android/server/os/BugreportManagerService.java43
-rw-r--r--services/core/java/com/android/server/os/BugreportManagerServiceImpl.java137
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java59
-rw-r--r--services/core/java/com/android/server/pm/ComponentResolver.java46
-rw-r--r--services/core/java/com/android/server/pm/Installer.java8
-rw-r--r--services/core/java/com/android/server/pm/LauncherAppsService.java62
-rw-r--r--services/core/java/com/android/server/pm/PackageDexOptimizer.java25
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java22
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java113
-rwxr-xr-xservices/core/java/com/android/server/pm/PackageManagerService.java665
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceUtils.java10
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java44
-rw-r--r--services/core/java/com/android/server/pm/PackageSettingBase.java13
-rw-r--r--services/core/java/com/android/server/pm/SELinuxMMAC.java9
-rw-r--r--services/core/java/com/android/server/pm/Settings.java18
-rw-r--r--services/core/java/com/android/server/pm/ShortcutPackage.java51
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java18
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java158
-rw-r--r--services/core/java/com/android/server/pm/UserRestrictionsUtils.java3
-rw-r--r--services/core/java/com/android/server/pm/dex/ArtManagerService.java27
-rw-r--r--services/core/java/com/android/server/pm/dex/DexLogger.java28
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java2
-rw-r--r--services/core/java/com/android/server/pm/dex/DexoptUtils.java13
-rw-r--r--services/core/java/com/android/server/pm/dex/ViewCompiler.java58
-rw-r--r--services/core/java/com/android/server/pm/permission/BasePermission.java4
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java20
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java7
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java87
-rw-r--r--services/core/java/com/android/server/policy/TEST_MAPPING2
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java9
-rw-r--r--services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java99
-rw-r--r--services/core/java/com/android/server/power/Notifier.java12
-rw-r--r--services/core/java/com/android/server/power/OWNERS4
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java1
-rw-r--r--services/core/java/com/android/server/power/ThermalManagerService.java87
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverController.java20
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java (renamed from services/core/java/com/android/server/power/BatterySaverPolicy.java)14
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java59
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java1
-rw-r--r--services/core/java/com/android/server/role/RoleManagerService.java50
-rw-r--r--services/core/java/com/android/server/role/RoleUserState.java44
-rw-r--r--services/core/java/com/android/server/rollback/RollbackData.java (renamed from services/core/java/com/android/server/rollback/PackageRollbackData.java)23
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerService.java12
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java436
-rw-r--r--services/core/java/com/android/server/rollback/TEST_MAPPING7
-rw-r--r--services/core/java/com/android/server/security/VerityUtils.java127
-rw-r--r--services/core/java/com/android/server/signedconfig/GlobalSettingsConfigApplicator.java13
-rw-r--r--services/core/java/com/android/server/signedconfig/SignatureVerifier.java45
-rw-r--r--services/core/java/com/android/server/signedconfig/SignedConfigEvent.java39
-rw-r--r--services/core/java/com/android/server/signedconfig/SignedConfigService.java36
-rw-r--r--services/core/java/com/android/server/slice/SlicePermissionManager.java20
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java60
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java15
-rw-r--r--services/core/java/com/android/server/storage/DeviceStorageMonitorService.java9
-rw-r--r--services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java3
-rw-r--r--services/core/java/com/android/server/textservices/TextServicesManagerService.java48
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java223
-rw-r--r--services/core/java/com/android/server/wm/AccessibilityController.java155
-rw-r--r--services/core/java/com/android/server/wm/ActivityDisplay.java55
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java209
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java218
-rw-r--r--services/core/java/com/android/server/wm/ActivityStackSupervisor.java25
-rw-r--r--services/core/java/com/android/server/wm/ActivityStartController.java46
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java88
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java16
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java74
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java7
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java48
-rw-r--r--services/core/java/com/android/server/wm/ConfigurationContainer.java9
-rw-r--r--services/core/java/com/android/server/wm/Dimmer.java4
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java86
-rw-r--r--services/core/java/com/android/server/wm/DisplayRotation.java39
-rw-r--r--services/core/java/com/android/server/wm/DragState.java3
-rw-r--r--services/core/java/com/android/server/wm/InputManagerCallback.java33
-rw-r--r--services/core/java/com/android/server/wm/InsetsSourceProvider.java3
-rw-r--r--services/core/java/com/android/server/wm/InsetsStateController.java3
-rw-r--r--services/core/java/com/android/server/wm/KeyguardController.java38
-rw-r--r--services/core/java/com/android/server/wm/LaunchParamsPersister.java2
-rw-r--r--services/core/java/com/android/server/wm/Letterbox.java62
-rw-r--r--services/core/java/com/android/server/wm/PinnedActivityStack.java111
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackWindowController.java205
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackWindowListener.java33
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java41
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java10
-rw-r--r--services/core/java/com/android/server/wm/Session.java9
-rw-r--r--services/core/java/com/android/server/wm/StackWindowController.java245
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimator.java2
-rw-r--r--services/core/java/com/android/server/wm/Task.java19
-rw-r--r--services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioningController.java13
-rw-r--r--services/core/java/com/android/server/wm/TaskRecord.java163
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotSurface.java17
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java254
-rw-r--r--services/core/java/com/android/server/wm/TaskTapPointerEventListener.java24
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerInternal.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java72
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfaceController.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowTraceBuffer.java181
-rw-r--r--services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java88
-rw-r--r--services/core/java/com/android/server/wm/WindowTracing.java102
-rw-r--r--services/core/jni/Android.bp3
-rw-r--r--services/core/jni/com_android_server_VibratorService.cpp19
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp183
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp345
-rw-r--r--services/core/jni/com_android_server_security_VerityUtils.cpp25
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java3
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java107
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java60
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java37
-rw-r--r--services/ipmemorystore/Android.bp4
-rw-r--r--services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreDatabase.java372
-rw-r--r--services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreService.java348
-rw-r--r--services/ipmemorystore/java/com/android/server/net/ipmemorystore/RelevanceUtils.java307
-rwxr-xr-xservices/java/com/android/server/SystemServer.java77
-rw-r--r--services/net/Android.bp16
-rw-r--r--services/net/java/android/net/apf/ApfFilter.java28
-rw-r--r--services/net/java/android/net/dhcp/DhcpPacket.java6
-rw-r--r--services/net/java/android/net/dhcp/DhcpServingParamsParcelExt.java172
-rw-r--r--services/net/java/android/net/ip/IpClient.java463
-rw-r--r--services/net/java/android/net/ip/IpClientUtil.java92
-rw-r--r--services/net/java/android/net/ip/IpManager.java124
-rw-r--r--services/net/java/android/net/ip/IpServer.java144
-rw-r--r--services/net/java/android/net/netlink/ConntrackMessage.java1
-rw-r--r--services/net/java/android/net/netlink/StructNfGenMsg.java4
-rw-r--r--services/net/java/android/net/netlink/StructNlAttr.java7
-rw-r--r--services/net/java/android/net/netlink/StructNlMsgErr.java3
-rw-r--r--services/net/java/android/net/shared/InitialConfiguration.java234
-rw-r--r--services/net/java/android/net/shared/IpConfigurationParcelableUtil.java135
-rw-r--r--services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java224
-rw-r--r--services/net/java/android/net/shared/NetworkMonitorUtils.java66
-rw-r--r--services/net/java/android/net/shared/NetworkParcelableUtil.java50
-rw-r--r--services/net/java/android/net/shared/ParcelableUtil.java63
-rw-r--r--services/net/java/android/net/shared/PrivateDnsConfig.java90
-rw-r--r--services/net/java/android/net/shared/ProvisioningConfiguration.java314
-rw-r--r--services/net/java/android/net/util/InterfaceParams.java5
-rw-r--r--services/net/java/android/net/util/NetworkConstants.java5
-rw-r--r--services/net/java/android/net/util/SharedLog.java56
-rw-r--r--services/robotests/Android.mk9
-rw-r--r--services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java26
-rw-r--r--services/robotests/backup/src/com/android/server/backup/FullBackupJobTest.java110
-rw-r--r--services/robotests/backup/src/com/android/server/backup/JobIdManagerTest.java69
-rw-r--r--services/robotests/backup/src/com/android/server/backup/KeyValueBackupJobTest.java51
-rw-r--r--services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java18
-rw-r--r--services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java85
-rw-r--r--services/robotests/backup/src/com/android/server/backup/fullbackup/AppMetadataBackupWriterTest.java7
-rw-r--r--services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java144
-rw-r--r--services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java15
-rw-r--r--services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java13
-rw-r--r--services/robotests/backup/src/com/android/server/backup/transport/TransportClientManagerTest.java6
-rw-r--r--services/robotests/backup/src/com/android/server/backup/transport/TransportClientTest.java4
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java5
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowApplicationPackageManager.java91
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java3
-rw-r--r--services/startop/Android.bp24
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java277
-rw-r--r--services/tests/rescueparty/Android.bp23
-rw-r--r--services/tests/rescueparty/how_to_run.txt9
-rw-r--r--services/tests/rescueparty/log_rescueparty_reset_event_reported.cpp24
-rw-r--r--services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java129
-rw-r--r--services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java (renamed from services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java)2
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java (renamed from services/tests/servicestests/src/com/android/server/appops/AppOpsNotedWatcherTest.java)0
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java (renamed from services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java)3
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java (renamed from services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java)2
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java28
-rw-r--r--services/tests/servicestests/src/com/android/server/display/AppSaturationControllerTest.java115
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java165
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java31
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java609
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java95
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java39
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java146
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java63
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobCountTrackerTest.java305
-rw-r--r--services/tests/servicestests/src/com/android/server/job/MaxJobCountsTest.java67
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java50
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java80
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java49
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java84
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java35
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java80
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java110
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java48
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java114
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java64
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java34
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java (renamed from services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java)21
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java42
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java26
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java6
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java149
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java149
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java56
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java53
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java64
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java174
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java63
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java93
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java31
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DimmerTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java26
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java35
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java122
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java45
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java75
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java7
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java105
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java14
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java210
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java62
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskTests.java40
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java214
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRule.java223
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java73
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java115
-rw-r--r--services/usage/java/com/android/server/usage/AppTimeLimitController.java111
-rw-r--r--services/usage/java/com/android/server/usage/IntervalStats.java15
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java173
-rw-r--r--services/usage/java/com/android/server/usage/UserUsageStatsService.java35
-rwxr-xr-xservices/usb/java/com/android/server/usb/UsbDeviceManager.java2
-rw-r--r--services/usb/java/com/android/server/usb/UsbHostManager.java22
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java9
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java15
-rw-r--r--startop/iorap/Android.bp4
-rw-r--r--startop/iorap/src/com/google/android/startop/iorap/AppLaunchEvent.java368
-rw-r--r--startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java216
-rw-r--r--startop/iorap/src/com/google/android/startop/iorap/RequestId.java2
-rw-r--r--startop/iorap/tests/Android.bp11
-rw-r--r--startop/view_compiler/Android.bp25
-rw-r--r--startop/view_compiler/apk_layout_compiler.cc174
-rw-r--r--startop/view_compiler/apk_layout_compiler.h35
-rw-r--r--startop/view_compiler/dex_builder_test/Android.bp18
-rw-r--r--startop/view_compiler/dex_builder_test/AndroidTest.xml1
-rw-r--r--startop/view_compiler/dex_builder_test/res/layout/layout1.xml17
-rw-r--r--startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java46
-rw-r--r--startop/view_compiler/dex_layout_compiler.cc226
-rw-r--r--startop/view_compiler/dex_layout_compiler.h118
-rw-r--r--startop/view_compiler/java_lang_builder.cc2
-rw-r--r--startop/view_compiler/java_lang_builder.h2
-rw-r--r--startop/view_compiler/main.cc98
-rw-r--r--telecomm/java/android/telecom/Call.java46
-rw-r--r--telecomm/java/android/telecom/CallIdentification.java22
-rw-r--r--telecomm/java/android/telecom/CallRedirectionService.java76
-rw-r--r--telecomm/java/android/telecom/CallScreeningService.java62
-rw-r--r--telecomm/java/android/telecom/Connection.java13
-rw-r--r--telecomm/java/android/telecom/InCallService.java107
-rw-r--r--telecomm/java/android/telecom/ParcelableCall.java18
-rw-r--r--telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl3
-rw-r--r--telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl2
-rw-r--r--telephony/java/android/provider/Telephony.java18
-rw-r--r--telephony/java/android/telephony/AvailableNetworkInfo.java1
-rw-r--r--telephony/java/android/telephony/CallAttributes.aidl20
-rw-r--r--telephony/java/android/telephony/CallAttributes.java151
-rw-r--r--telephony/java/android/telephony/CallQuality.aidl20
-rw-r--r--telephony/java/android/telephony/CallQuality.java341
-rw-r--r--telephony/java/android/telephony/CarrierRestrictionRules.aidl20
-rw-r--r--telephony/java/android/telephony/CarrierRestrictionRules.java277
-rw-r--r--telephony/java/android/telephony/CellConfigLte.java5
-rw-r--r--telephony/java/android/telephony/CellInfo.java22
-rw-r--r--telephony/java/android/telephony/CellInfoCdma.java9
-rw-r--r--telephony/java/android/telephony/CellInfoGsm.java8
-rw-r--r--telephony/java/android/telephony/CellInfoLte.java9
-rw-r--r--telephony/java/android/telephony/CellInfoTdscdma.java8
-rw-r--r--telephony/java/android/telephony/CellInfoWcdma.java8
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthLte.java2
-rw-r--r--telephony/java/android/telephony/DataFailCause.java37
-rw-r--r--telephony/java/android/telephony/DataSpecificRegistrationStates.java19
-rw-r--r--telephony/java/android/telephony/ICellInfoCallback.aidl2
-rw-r--r--telephony/java/android/telephony/LteVopsSupportInfo.aidl19
-rw-r--r--telephony/java/android/telephony/LteVopsSupportInfo.java137
-rw-r--r--telephony/java/android/telephony/NetworkRegistrationState.java5
-rw-r--r--telephony/java/android/telephony/PhoneStateListener.java49
-rw-r--r--telephony/java/android/telephony/PreciseDataConnectionState.java147
-rw-r--r--telephony/java/android/telephony/ServiceState.java3
-rw-r--r--telephony/java/android/telephony/SignalStrength.java68
-rw-r--r--telephony/java/android/telephony/SubscriptionInfo.java41
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java129
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java276
-rw-r--r--telephony/java/android/telephony/emergency/EmergencyNumber.java203
-rw-r--r--telephony/java/android/telephony/euicc/EuiccManager.java74
-rw-r--r--telephony/java/android/telephony/ims/ImsCallProfile.java137
-rw-r--r--telephony/java/android/telephony/ims/ImsCallSession.java35
-rw-r--r--telephony/java/android/telephony/ims/ImsCallSessionListener.java27
-rw-r--r--telephony/java/android/telephony/ims/ImsMmTelManager.java57
-rw-r--r--telephony/java/android/telephony/ims/ImsStreamMediaProfile.java16
-rw-r--r--telephony/java/android/telephony/ims/ProvisioningManager.java25
-rw-r--r--telephony/java/android/telephony/ims/RcsParticipant.java102
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl18
-rw-r--r--telephony/java/android/telephony/ims/aidl/IRcs.aidl9
-rw-r--r--telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java18
-rw-r--r--telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl18
-rw-r--r--telephony/java/com/android/internal/telephony/DctConstants.java6
-rwxr-xr-xtelephony/java/com/android/internal/telephony/IOns.aidl (renamed from telephony/java/com/android/internal/telephony/IAns.aidl)16
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl6
-rwxr-xr-xtelephony/java/com/android/internal/telephony/ISub.aidl10
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl42
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl6
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java1
-rw-r--r--telephony/java/com/android/internal/telephony/SmsApplication.java117
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyIntents.java14
-rw-r--r--telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl31
-rw-r--r--test-base/api/current.txt238
-rw-r--r--test-base/api/removed.txt1
-rw-r--r--test-base/api/system-current.txt1
-rw-r--r--test-base/api/system-removed.txt1
-rw-r--r--test-base/api/test-current.txt1
-rw-r--r--test-base/api/test-removed.txt1
-rw-r--r--test-base/src/android/test/RepetitiveTest.java6
-rw-r--r--test-legacy/Android.bp2
-rw-r--r--test-mock/Android.bp19
-rw-r--r--test-mock/api/current.txt423
-rw-r--r--test-mock/api/removed.txt11
-rw-r--r--test-mock/api/system-current.txt41
-rw-r--r--test-mock/api/system-removed.txt1
-rw-r--r--test-mock/api/test-current.txt19
-rw-r--r--test-mock/api/test-removed.txt1
-rw-r--r--test-runner/api/current.txt503
-rw-r--r--test-runner/api/removed.txt1
-rw-r--r--test-runner/api/system-current.txt1
-rw-r--r--test-runner/api/system-removed.txt1
-rw-r--r--test-runner/api/test-current.txt1
-rw-r--r--test-runner/api/test-removed.txt1
-rw-r--r--tests/ActivityViewTest/Android.mk2
-rw-r--r--tests/ActivityViewTest/AndroidManifest.xml14
-rw-r--r--tests/ActivityViewTest/res/layout/activity_view_main_activity.xml6
-rw-r--r--tests/ActivityViewTest/res/layout/activity_view_test_activity.xml12
-rw-r--r--tests/ActivityViewTest/res/layout/activity_view_visibility_activity.xml46
-rw-r--r--tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewMainActivity.java3
-rw-r--r--tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewTestActivity.java21
-rw-r--r--tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewVisibilityActivity.java75
-rw-r--r--tests/PackageWatchdog/Android.mk34
-rw-r--r--tests/PackageWatchdog/AndroidManifest.xml28
-rw-r--r--tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java286
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsParticipantTest.java46
-rw-r--r--tests/RollbackTest/TEST_MAPPING7
-rw-r--r--tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java173
-rw-r--r--tests/UsageReportingTest/Android.mk17
-rw-r--r--tests/UsageReportingTest/AndroidManifest.xml22
-rw-r--r--tests/UsageReportingTest/res/layout/row_item.xml36
-rw-r--r--tests/UsageReportingTest/res/menu/main.xml28
-rw-r--r--tests/UsageReportingTest/res/values/colors.xml19
-rw-r--r--tests/UsageReportingTest/res/values/strings.xml47
-rw-r--r--tests/UsageReportingTest/res/values/styles.xml31
-rw-r--r--tests/UsageReportingTest/src/com/android/tests/usagereporter/UsageReporterActivity.java320
-rw-r--r--tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java2
-rw-r--r--tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java3
-rw-r--r--tests/net/Android.mk2
-rw-r--r--tests/net/java/android/net/IpMemoryStoreTest.java64
-rw-r--r--tests/net/java/android/net/LinkPropertiesTest.java97
-rw-r--r--tests/net/java/android/net/apf/ApfTest.java43
-rw-r--r--tests/net/java/android/net/dhcp/DhcpServingParamsParcelExtTest.java113
-rw-r--r--tests/net/java/android/net/ip/IpClientTest.java14
-rw-r--r--tests/net/java/android/net/ip/IpServerTest.java80
-rw-r--r--tests/net/java/android/net/ipmemorystore/ParcelableTests.java120
-rw-r--r--tests/net/java/android/net/shared/InitialConfigurationTest.java85
-rw-r--r--tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java130
-rw-r--r--tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java192
-rw-r--r--tests/net/java/android/net/shared/ParcelableTestUtil.java41
-rw-r--r--tests/net/java/android/net/shared/ProvisioningConfigurationTest.java137
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java312
-rw-r--r--tests/net/java/com/android/server/IpSecServiceParameterizedTest.java9
-rw-r--r--tests/net/java/com/android/server/IpSecServiceTest.java4
-rw-r--r--tests/net/java/com/android/server/connectivity/DnsManagerTest.java15
-rw-r--r--tests/net/java/com/android/server/connectivity/LingerMonitorTest.java19
-rw-r--r--tests/net/java/com/android/server/connectivity/Nat464XlatTest.java30
-rw-r--r--tests/net/java/com/android/server/connectivity/TetheringTest.java100
-rw-r--r--tests/net/java/com/android/server/net/ipmemorystore/IpMemoryStoreServiceTest.java313
-rw-r--r--tests/net/java/com/android/server/net/ipmemorystore/RelevanceUtilsTests.java149
-rw-r--r--tools/aapt2/Android.bp2
-rw-r--r--tools/aapt2/LoadedApk.cpp14
-rw-r--r--tools/aapt2/ResourceParser.cpp5
-rw-r--r--tools/aapt2/ResourceParser_test.cpp17
-rw-r--r--tools/aapt2/ResourceTable.h3
-rw-r--r--tools/aapt2/ResourceTable_test.cpp4
-rw-r--r--tools/aapt2/ResourceUtils.cpp9
-rw-r--r--tools/aapt2/ResourceUtils_test.cpp12
-rw-r--r--tools/aapt2/Resources.proto1
-rw-r--r--tools/aapt2/cmd/Compile.cpp5
-rw-r--r--tools/aapt2/cmd/Optimize.cpp26
-rw-r--r--tools/aapt2/cmd/Optimize.h17
-rw-r--r--tools/aapt2/format/binary/BinaryResourceParser.cpp30
-rw-r--r--tools/aapt2/format/binary/TableFlattener.cpp167
-rw-r--r--tools/aapt2/format/binary/TableFlattener.h3
-rw-r--r--tools/aapt2/format/binary/TableFlattener_test.cpp110
-rw-r--r--tools/aapt2/format/proto/ProtoDeserialize.cpp3
-rw-r--r--tools/aapt2/format/proto/ProtoSerialize.cpp3
-rw-r--r--tools/aapt2/format/proto/ProtoSerialize_test.cpp4
-rw-r--r--tools/aapt2/link/ManifestFixer.cpp22
-rw-r--r--tools/aapt2/link/ManifestFixer_test.cpp32
-rw-r--r--tools/aapt2/link/TableMerger_test.cpp4
-rw-r--r--tools/aapt2/optimize/ResourcePathShortener.cpp112
-rw-r--r--tools/aapt2/optimize/ResourcePathShortener.h44
-rw-r--r--tools/aapt2/optimize/ResourcePathShortener_test.cpp67
-rw-r--r--tools/apilint/apilint.py642
-rw-r--r--tools/apilint/apilint_test.py186
-rw-r--r--tools/bit/command.h2
-rwxr-xr-xtools/hiddenapi/generate_hiddenapi_lists.py78
-rw-r--r--tools/processors/view_inspector/Android.bp6
-rw-r--r--tools/processors/view_inspector/TEST_MAPPING2
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/AnnotationUtils.java121
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java23
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java7
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java408
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java18
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java2
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java12
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/ProcessingException.java2
-rw-r--r--tools/processors/view_inspector/src/resources/META-INF/services/javax.annotation.processing.Processor2
-rw-r--r--tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java48
-rw-r--r--tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NoAttributeId.java.txt3
-rw-r--r--tools/signedconfig/prod_public.pem5
-rwxr-xr-xtools/signedconfig/verify_b64.sh28
-rw-r--r--tools/stats_log_api_gen/main.cpp69
-rw-r--r--tools/streaming_proto/Errors.h2
-rw-r--r--wifi/java/android/net/wifi/DppStatusCallback.java166
-rw-r--r--wifi/java/android/net/wifi/EasyConnectStatusCallback.java179
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl11
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java44
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java100
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java225
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java10
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java2
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSpecifier.java6
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSuggestion.java3
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java5
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareManager.java70
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java58
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java56
-rw-r--r--wifi/java/android/net/wifi/hotspot2/OsuProvider.java13
-rw-r--r--wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java2
-rw-r--r--wifi/java/android/net/wifi/hotspot2/pps/Credential.java59
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pConfig.java91
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pGroup.java28
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pManager.java11
-rw-r--r--wifi/java/com/android/server/wifi/BaseWifiService.java (renamed from wifi/java/com/android/server/wifi/AbstractWifiService.java)82
-rw-r--r--wifi/tests/src/android/net/wifi/WifiConfigurationTest.java14
-rw-r--r--wifi/tests/src/android/net/wifi/WifiInfoTest.java2
-rw-r--r--wifi/tests/src/android/net/wifi/WifiManagerTest.java14
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java2
-rw-r--r--wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java3
-rw-r--r--wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java263
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java27
2618 files changed, 125642 insertions, 59890 deletions
diff --git a/Android.bp b/Android.bp
index 1b7c0f452ba9..482b58eb43e8 100755
--- a/Android.bp
+++ b/Android.bp
@@ -104,6 +104,11 @@ java_defaults {
"core/java/android/app/backup/IRestoreObserver.aidl",
"core/java/android/app/backup/IRestoreSession.aidl",
"core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
+ "core/java/android/app/contentsuggestions/IClassificationsCallback.aidl",
+ "core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl",
+ "core/java/android/app/contentsuggestions/ISelectionsCallback.aidl",
+ "core/java/android/app/prediction/IPredictionCallback.aidl",
+ "core/java/android/app/prediction/IPredictionManager.aidl",
"core/java/android/app/role/IOnRoleHoldersChangedListener.aidl",
"core/java/android/app/role/IRoleManager.aidl",
"core/java/android/app/role/IRoleManagerCallback.aidl",
@@ -186,10 +191,6 @@ java_defaults {
"core/java/android/hardware/input/IInputDevicesChangedListener.aidl",
"core/java/android/hardware/input/ITabletModeChangedListener.aidl",
"core/java/android/hardware/iris/IIrisService.aidl",
- "core/java/android/hardware/location/IActivityRecognitionHardware.aidl",
- "core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl",
- "core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl",
- "core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl",
"core/java/android/hardware/location/IGeofenceHardware.aidl",
"core/java/android/hardware/location/IGeofenceHardwareCallback.aidl",
"core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl",
@@ -273,6 +274,7 @@ java_defaults {
"core/java/android/rolecontrollerservice/IRoleControllerService.aidl",
":keystore_aidl",
"core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl",
+ "core/java/android/service/appprediction/IPredictionService.aidl",
"core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl",
"core/java/android/service/autofill/augmented/IFillCallback.aidl",
"core/java/android/service/autofill/IAutoFillService.aidl",
@@ -282,6 +284,7 @@ java_defaults {
"core/java/android/service/carrier/ICarrierService.aidl",
"core/java/android/service/carrier/ICarrierMessagingCallback.aidl",
"core/java/android/service/carrier/ICarrierMessagingService.aidl",
+ "core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl",
"core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl",
"core/java/android/service/euicc/IDownloadSubscriptionCallback.aidl",
"core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl",
@@ -298,6 +301,7 @@ java_defaults {
"core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl",
"core/java/android/service/gatekeeper/IGateKeeperService.aidl",
"core/java/android/service/contentcapture/IContentCaptureService.aidl",
+ "core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl",
"core/java/android/service/notification/INotificationListener.aidl",
"core/java/android/service/notification/IStatusBarNotificationHolder.aidl",
"core/java/android/service/notification/IConditionListener.aidl",
@@ -350,6 +354,8 @@ java_defaults {
"core/java/android/service/textclassifier/ITextLanguageCallback.aidl",
"core/java/android/service/textclassifier/ITextLinksCallback.aidl",
"core/java/android/service/textclassifier/ITextSelectionCallback.aidl",
+ "core/java/android/service/attention/IAttentionService.aidl",
+ "core/java/android/service/attention/IAttentionCallback.aidl",
"core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl",
"core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl",
"core/java/android/view/accessibility/IAccessibilityManager.aidl",
@@ -469,6 +475,7 @@ java_defaults {
"media/java/android/media/IMediaRouterClient.aidl",
"media/java/android/media/IMediaRouterService.aidl",
"media/java/android/media/IMediaSession2.aidl",
+ "media/java/android/media/IMediaSession2Service.aidl",
"media/java/android/media/IMediaScannerListener.aidl",
"media/java/android/media/IMediaScannerService.aidl",
"media/java/android/media/IPlaybackConfigDispatcher.aidl",
@@ -495,6 +502,7 @@ java_defaults {
"media/java/android/media/session/IOnMediaKeyListener.aidl",
"media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl",
"media/java/android/media/session/ISession.aidl",
+ "media/java/android/media/session/ISession2TokensListener.aidl",
"media/java/android/media/session/ISessionCallback.aidl",
"media/java/android/media/session/ISessionController.aidl",
"media/java/android/media/session/ISessionControllerCallback.aidl",
@@ -593,7 +601,7 @@ java_defaults {
"telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl",
"telephony/java/com/android/internal/telephony/ISms.aidl",
"telephony/java/com/android/internal/telephony/ISub.aidl",
- "telephony/java/com/android/internal/telephony/IAns.aidl",
+ "telephony/java/com/android/internal/telephony/IOns.aidl",
"telephony/java/com/android/internal/telephony/ITelephony.aidl",
"telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl",
"telephony/java/com/android/internal/telephony/IWapPushManager.aidl",
@@ -733,6 +741,7 @@ java_defaults {
"android.hardware.contexthub-V1.0-java",
"android.hardware.health-V1.0-java-constants",
"android.hardware.thermal-V1.0-java-constants",
+ "android.hardware.thermal-V1.0-java",
"android.hardware.thermal-V1.1-java",
"android.hardware.thermal-V2.0-java",
"android.hardware.tv.input-V1.0-java-constants",
@@ -741,11 +750,13 @@ java_defaults {
"android.hardware.vibrator-V1.0-java",
"android.hardware.vibrator-V1.1-java",
"android.hardware.vibrator-V1.2-java",
+ "android.hardware.vibrator-V1.3-java",
"android.hardware.wifi-V1.0-java-constants",
"android.hardware.radio-V1.0-java",
"android.hardware.radio-V1.3-java",
"android.hardware.radio-V1.4-java",
"android.hardware.usb.gadget-V1.0-java",
+ "networkstack-aidl-interfaces-java",
"netd_aidl_interface-java",
"devicepolicyprotosnano",
],
@@ -873,7 +884,29 @@ aidl_interface {
name: "networkstack-aidl-interfaces",
local_include_dir: "core/java",
srcs: [
+ "core/java/android/net/ApfCapabilitiesParcelable.aidl",
+ "core/java/android/net/DhcpResultsParcelable.aidl",
+ "core/java/android/net/INetworkMonitor.aidl",
+ "core/java/android/net/INetworkMonitorCallbacks.aidl",
+ "core/java/android/net/IIpMemoryStore.aidl",
"core/java/android/net/INetworkStackConnector.aidl",
+ "core/java/android/net/INetworkStackStatusCallback.aidl",
+ "core/java/android/net/InitialConfigurationParcelable.aidl",
+ "core/java/android/net/IpPrefixParcelable.aidl",
+ "core/java/android/net/LinkAddressParcelable.aidl",
+ "core/java/android/net/LinkPropertiesParcelable.aidl",
+ "core/java/android/net/NetworkParcelable.aidl",
+ "core/java/android/net/PrivateDnsConfigParcel.aidl",
+ "core/java/android/net/ProvisioningConfigurationParcelable.aidl",
+ "core/java/android/net/ProxyInfoParcelable.aidl",
+ "core/java/android/net/RouteInfoParcelable.aidl",
+ "core/java/android/net/StaticIpConfigurationParcelable.aidl",
+ "core/java/android/net/dhcp/DhcpServingParamsParcel.aidl",
+ "core/java/android/net/dhcp/IDhcpServer.aidl",
+ "core/java/android/net/dhcp/IDhcpServerCallbacks.aidl",
+ "core/java/android/net/ip/IIpClient.aidl",
+ "core/java/android/net/ip/IIpClientCallbacks.aidl",
+ "core/java/android/net/ipmemorystore/**/*.aidl",
],
api_dir: "aidl/networkstack",
}
@@ -1049,6 +1082,7 @@ java_library {
"core/java/android/annotation/IntDef.java",
"core/java/android/annotation/NonNull.java",
"core/java/android/annotation/SystemApi.java",
+ "core/java/android/annotation/TestApi.java",
"core/java/android/os/HwBinder.java",
"core/java/android/os/HwBlob.java",
"core/java/android/os/HwParcel.java",
@@ -1229,6 +1263,7 @@ stubs_defaults {
":non_openjdk_javadoc_files",
":android_icu4j_src_files_for_docs",
":conscrypt_public_api_files",
+ ":media2-srcs",
"test-mock/src/**/*.java",
"test-runner/src/**/*.java",
],
@@ -1290,6 +1325,7 @@ stubs_defaults {
":non_openjdk_javadoc_files",
":android_icu4j_src_files_for_docs",
":conscrypt_public_api_files",
+ ":media2-srcs",
],
srcs_lib: "framework",
srcs_lib_whitelist_dirs: frameworks_base_subdirs,
@@ -1298,7 +1334,6 @@ stubs_defaults {
"ext",
"framework",
"voip-common",
- "android.test.mock.impl",
],
local_sourcepaths: frameworks_base_subdirs,
installable: false,
diff --git a/Android.mk b/Android.mk
index e3cc2754fed3..e4053452a9c5 100755
--- a/Android.mk
+++ b/Android.mk
@@ -80,18 +80,18 @@ update-api: doc-comment-check-docs
# ==== hiddenapi lists =======================================
.KATI_RESTAT: $(INTERNAL_PLATFORM_HIDDENAPI_FLAGS)
$(INTERNAL_PLATFORM_HIDDENAPI_FLAGS): \
+ PRIVATE_FLAGS_INPUTS := $(PRIVATE_FLAGS_INPUTS) $(SOONG_HIDDENAPI_FLAGS)
+$(INTERNAL_PLATFORM_HIDDENAPI_FLAGS): \
frameworks/base/tools/hiddenapi/generate_hiddenapi_lists.py \
frameworks/base/config/hiddenapi-greylist.txt \
frameworks/base/config/hiddenapi-greylist-max-p.txt \
frameworks/base/config/hiddenapi-greylist-max-o.txt \
frameworks/base/config/hiddenapi-force-blacklist.txt \
- $(INTERNAL_PLATFORM_HIDDENAPI_PUBLIC_LIST) \
- $(INTERNAL_PLATFORM_HIDDENAPI_PRIVATE_LIST) \
- $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE)
+ $(INTERNAL_PLATFORM_HIDDENAPI_STUB_FLAGS) \
+ $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) \
+ $(SOONG_HIDDENAPI_FLAGS)
frameworks/base/tools/hiddenapi/generate_hiddenapi_lists.py \
- --public $(INTERNAL_PLATFORM_HIDDENAPI_PUBLIC_LIST) \
- --private $(INTERNAL_PLATFORM_HIDDENAPI_PRIVATE_LIST) \
- --csv $(PRIVATE_FLAGS_INPUTS) \
+ --csv $(INTERNAL_PLATFORM_HIDDENAPI_STUB_FLAGS) $(PRIVATE_FLAGS_INPUTS) \
--greylist frameworks/base/config/hiddenapi-greylist.txt \
--greylist-ignore-conflicts $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) \
--greylist-max-p frameworks/base/config/hiddenapi-greylist-max-p.txt \
diff --git a/CleanSpec.mk b/CleanSpec.mk
index d01e183df84d..30c2c69e8572 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -252,6 +252,7 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/overlay/ExperimentNavigation
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/vendor/overlay/ExperimentNavigationBarSlim)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/overlay/ExperimentNavigationBarSlim)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/SystemUI)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
# ******************************************************************
diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk
index 77bacbe4213d..3f87a1c8b598 100644
--- a/apct-tests/perftests/core/Android.mk
+++ b/apct-tests/perftests/core/Android.mk
@@ -9,7 +9,7 @@ LOCAL_SRC_FILES := \
src/android/os/ISomeService.aidl
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
androidx.annotation_annotation \
apct-perftests-utils \
guava
diff --git a/apct-tests/perftests/core/AndroidManifest.xml b/apct-tests/perftests/core/AndroidManifest.xml
index 13c24d9b478d..a564a4d27fb3 100644
--- a/apct-tests/perftests/core/AndroidManifest.xml
+++ b/apct-tests/perftests/core/AndroidManifest.xml
@@ -28,7 +28,7 @@
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.perftests.core"/>
</manifest>
diff --git a/apct-tests/perftests/core/src/android/accounts/AccountManagerPerfTest.java b/apct-tests/perftests/core/src/android/accounts/AccountManagerPerfTest.java
index b9411fa463d5..e455e6a0574d 100644
--- a/apct-tests/perftests/core/src/android/accounts/AccountManagerPerfTest.java
+++ b/apct-tests/perftests/core/src/android/accounts/AccountManagerPerfTest.java
@@ -23,10 +23,10 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/app/PendingIntentPerfTest.java b/apct-tests/perftests/core/src/android/app/PendingIntentPerfTest.java
index f8fd51d7b0b6..b3f83596e8a1 100644
--- a/apct-tests/perftests/core/src/android/app/PendingIntentPerfTest.java
+++ b/apct-tests/perftests/core/src/android/app/PendingIntentPerfTest.java
@@ -21,9 +21,10 @@ import android.content.Intent;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
@@ -33,7 +34,6 @@ import org.junit.runner.RunWith;
// Due to b/71353150, you might get "java.lang.AssertionError: Binder ProxyMap has too many
// entries", but it's flaky. Adding "Runtime.getRuntime().gc()" between each iteration solves
// the problem, but it doesn't seem like it's currently needed.
-
@RunWith(AndroidJUnit4.class)
@LargeTest
public class PendingIntentPerfTest {
diff --git a/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java b/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
index 9cdeb489722a..c3e43ee07453 100644
--- a/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
+++ b/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
@@ -23,7 +23,8 @@ import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Before;
diff --git a/apct-tests/perftests/core/src/android/app/ResourcesThemePerfTest.java b/apct-tests/perftests/core/src/android/app/ResourcesThemePerfTest.java
index bb0627e562b4..1b07572fd3f8 100644
--- a/apct-tests/perftests/core/src/android/app/ResourcesThemePerfTest.java
+++ b/apct-tests/perftests/core/src/android/app/ResourcesThemePerfTest.java
@@ -19,8 +19,9 @@ import android.content.Context;
import android.content.res.Resources;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
import org.junit.Before;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java b/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java
index 897d0aeed4f8..c5ef80d455f7 100644
--- a/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java
+++ b/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java
@@ -23,9 +23,10 @@ import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.AfterClass;
import org.junit.BeforeClass;
diff --git a/apct-tests/perftests/core/src/android/database/SQLiteDatabaseIoPerfTest.java b/apct-tests/perftests/core/src/android/database/SQLiteDatabaseIoPerfTest.java
index 7c5316d233a7..830302e229a8 100644
--- a/apct-tests/perftests/core/src/android/database/SQLiteDatabaseIoPerfTest.java
+++ b/apct-tests/perftests/core/src/android/database/SQLiteDatabaseIoPerfTest.java
@@ -16,17 +16,20 @@
package android.database;
+import static org.junit.Assert.assertEquals;
+
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.Preconditions;
import org.junit.After;
@@ -40,8 +43,6 @@ import java.nio.file.Files;
import java.util.List;
import java.util.Map;
-import static org.junit.Assert.assertEquals;
-
/**
* Performance tests for measuring amount of data written during typical DB operations
*
diff --git a/apct-tests/perftests/core/src/android/database/SQLiteDatabasePerfTest.java b/apct-tests/perftests/core/src/android/database/SQLiteDatabasePerfTest.java
index e2b75c3f5746..973e996a17c3 100644
--- a/apct-tests/perftests/core/src/android/database/SQLiteDatabasePerfTest.java
+++ b/apct-tests/perftests/core/src/android/database/SQLiteDatabasePerfTest.java
@@ -16,14 +16,18 @@
package android.database;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -33,9 +37,6 @@ import org.junit.runner.RunWith;
import java.util.Random;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
/**
* Performance tests for typical CRUD operations and loading rows into the Cursor
*
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/CanvasPerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/CanvasPerfTest.java
index c742df3b882b..9f093052ebb2 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/CanvasPerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/CanvasPerfTest.java
@@ -24,7 +24,8 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/OutlinePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/OutlinePerfTest.java
index f9c375804599..10a51280ac86 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/OutlinePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/OutlinePerfTest.java
@@ -19,7 +19,8 @@ package android.graphics.perftests;
import android.graphics.Outline;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/PaintHasGlyphPerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/PaintHasGlyphPerfTest.java
index 26b830919b65..3a8002003299 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/PaintHasGlyphPerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/PaintHasGlyphPerfTest.java
@@ -20,17 +20,18 @@ import android.graphics.Paint;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
-import java.util.Arrays;
-import java.util.Collection;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.util.Arrays;
+import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/PaintMeasureTextTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/PaintMeasureTextTest.java
index b9ee613315af..fc8c673d591c 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/PaintMeasureTextTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/PaintMeasureTextTest.java
@@ -19,9 +19,10 @@ package android.graphics.perftests;
import android.graphics.Canvas;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
import android.text.TextPaint;
+import androidx.test.filters.LargeTest;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/PathPerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/PathPerfTest.java
index 7a49b4f456b1..c6de9ec6c2e0 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/PathPerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/PathPerfTest.java
@@ -20,7 +20,8 @@ import android.graphics.Path;
import android.graphics.RectF;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
index 62dd124beb86..e7fe235e0ea8 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
@@ -20,7 +20,8 @@ import android.graphics.Outline;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
index 11ee59939601..d6e8ab2516a8 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
@@ -21,9 +21,14 @@ import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import java.io.File;
import java.io.FileOutputStream;
@@ -31,10 +36,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TypefaceCreatePerfTest {
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/VectorDrawablePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/VectorDrawablePerfTest.java
index 5533782ca84d..3b2b8a94f610 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/VectorDrawablePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/VectorDrawablePerfTest.java
@@ -16,6 +16,8 @@
package android.graphics.perftests;
+import static junit.framework.Assert.assertTrue;
+
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -25,21 +27,17 @@ import android.perftests.utils.BenchmarkState;
import android.perftests.utils.BitmapUtils;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.perftests.core.R;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.io.IOException;
-
-import static junit.framework.Assert.assertTrue;
-
@RunWith(AndroidJUnit4.class)
@LargeTest
public class VectorDrawablePerfTest {
diff --git a/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
index 99e4ba1bb804..12e49e36e8cb 100644
--- a/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
@@ -18,8 +18,9 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.BinderInternal.CallSession;
@@ -31,7 +32,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-
/**
* Performance tests for {@link BinderCallsStats}
*/
diff --git a/apct-tests/perftests/core/src/android/os/CpuUsageTrackingPerfTest.java b/apct-tests/perftests/core/src/android/os/CpuUsageTrackingPerfTest.java
index 4961b4f94057..0d7b7cae3b0e 100644
--- a/apct-tests/perftests/core/src/android/os/CpuUsageTrackingPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/CpuUsageTrackingPerfTest.java
@@ -18,8 +18,9 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
@@ -28,7 +29,6 @@ import org.junit.runner.RunWith;
import java.nio.file.Files;
import java.nio.file.Paths;
-
/**
* Performance tests collecting CPU data different mechanisms.
*/
diff --git a/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java b/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
index 9034034539e9..11c7599a508a 100644
--- a/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertNotNull;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.KernelCpuThreadReader;
@@ -29,7 +30,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-
/**
* Performance tests collecting per-thread CPU data.
*/
diff --git a/apct-tests/perftests/core/src/android/os/LooperStatsPerfTest.java b/apct-tests/perftests/core/src/android/os/LooperStatsPerfTest.java
index 0f880b71c7b1..162167deb75d 100644
--- a/apct-tests/perftests/core/src/android/os/LooperStatsPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/LooperStatsPerfTest.java
@@ -19,8 +19,9 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.CachedDeviceState;
import com.android.internal.os.LooperStats;
@@ -31,7 +32,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-
/**
* Performance tests for {@link LooperStats}.
*/
diff --git a/apct-tests/perftests/core/src/android/os/PackageManagerPerfTest.java b/apct-tests/perftests/core/src/android/os/PackageManagerPerfTest.java
index 145fbcd2d5d7..3aa6749502bc 100644
--- a/apct-tests/perftests/core/src/android/os/PackageManagerPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/PackageManagerPerfTest.java
@@ -16,20 +16,16 @@
package android.os;
-import static android.content.pm.PackageManager.PERMISSION_DENIED;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-
import android.content.ComponentName;
-import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Assert;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/os/ParcelArrayPerfTest.java b/apct-tests/perftests/core/src/android/os/ParcelArrayPerfTest.java
index a67aeca95540..af6d6b03d0a3 100644
--- a/apct-tests/perftests/core/src/android/os/ParcelArrayPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/ParcelArrayPerfTest.java
@@ -18,7 +18,8 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Before;
diff --git a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
index 6e4c9c54a2f3..4db9262f7fe3 100644
--- a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
@@ -16,10 +16,15 @@
package android.os;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -27,10 +32,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ParcelPerfTest {
diff --git a/apct-tests/perftests/core/src/android/os/PssPerfTest.java b/apct-tests/perftests/core/src/android/os/PssPerfTest.java
index 400115deeeb8..2cc294f40e9c 100644
--- a/apct-tests/perftests/core/src/android/os/PssPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/PssPerfTest.java
@@ -18,8 +18,9 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/os/SharedPreferencesTest.java b/apct-tests/perftests/core/src/android/os/SharedPreferencesTest.java
index 099134f35303..dd479acdeee0 100644
--- a/apct-tests/perftests/core/src/android/os/SharedPreferencesTest.java
+++ b/apct-tests/perftests/core/src/android/os/SharedPreferencesTest.java
@@ -20,9 +20,10 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/os/StrictModeTest.java b/apct-tests/perftests/core/src/android/os/StrictModeTest.java
index d973c204f89e..60678e954038 100644
--- a/apct-tests/perftests/core/src/android/os/StrictModeTest.java
+++ b/apct-tests/perftests/core/src/android/os/StrictModeTest.java
@@ -23,17 +23,21 @@ import android.content.ServiceConnection;
import android.net.Uri;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.common.util.concurrent.SettableFuture;
-import java.io.File;
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
@RunWith(AndroidJUnit4.class)
@LargeTest
public class StrictModeTest {
diff --git a/apct-tests/perftests/core/src/android/os/TracePerfTest.java b/apct-tests/perftests/core/src/android/os/TracePerfTest.java
index 8e5cfaafde52..0d64c390f4c2 100644
--- a/apct-tests/perftests/core/src/android/os/TracePerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/TracePerfTest.java
@@ -20,7 +20,8 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.ShellHelper;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.AfterClass;
import org.junit.Assert;
diff --git a/apct-tests/perftests/core/src/android/perftests/SystemPerfTest.java b/apct-tests/perftests/core/src/android/perftests/SystemPerfTest.java
index 95a714486062..4f0d1084b767 100644
--- a/apct-tests/perftests/core/src/android/perftests/SystemPerfTest.java
+++ b/apct-tests/perftests/core/src/android/perftests/SystemPerfTest.java
@@ -18,8 +18,9 @@ package android.perftests;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import dalvik.annotation.optimization.FastNative;
diff --git a/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
index 9245c1ba59e4..c8121c52dda0 100644
--- a/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
@@ -22,9 +22,10 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
+import androidx.test.filters.LargeTest;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java b/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
index 194a88c36bba..ad1327cbbd1c 100644
--- a/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
@@ -18,9 +18,10 @@ package android.text;
import android.graphics.Canvas;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
+import androidx.test.filters.LargeTest;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/text/CanvasDrawTextTest.java b/apct-tests/perftests/core/src/android/text/CanvasDrawTextTest.java
index ad9fb5f5e99f..bb6b691226d6 100644
--- a/apct-tests/perftests/core/src/android/text/CanvasDrawTextTest.java
+++ b/apct-tests/perftests/core/src/android/text/CanvasDrawTextTest.java
@@ -19,8 +19,9 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/text/DynamicLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/DynamicLayoutPerfTest.java
index b4c7f543946a..5be99d9d779e 100644
--- a/apct-tests/perftests/core/src/android/text/DynamicLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/DynamicLayoutPerfTest.java
@@ -24,11 +24,12 @@ import android.graphics.Paint.FontMetricsInt;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
import android.text.style.ReplacementSpan;
import android.util.ArraySet;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
index a7972f59f382..bbe75b762bdd 100644
--- a/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
@@ -21,7 +21,8 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
index 00a626750c79..4ae2b9395d6d 100644
--- a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
@@ -18,9 +18,10 @@ package android.text;
import android.app.Activity;
import android.os.Bundle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
index 33b1a47413c8..3be9114269f1 100644
--- a/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
@@ -18,8 +18,9 @@ package android.text;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
index b40dd6b9dbb7..6c9222909f88 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
@@ -22,9 +22,10 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
+import androidx.test.filters.LargeTest;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java
index 2768a7d89e16..47e04ef5ab3f 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java
@@ -19,8 +19,8 @@ package android.text;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutMultithreadPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutMultithreadPerfTest.java
index 60c6d89b39ce..0b79834bb54c 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutMultithreadPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutMultithreadPerfTest.java
@@ -19,17 +19,16 @@ package android.text;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Random;
import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
@LargeTest
@RunWith(AndroidJUnit4.class)
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
index f60cbee62c54..bd7522d0359e 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
@@ -21,8 +21,9 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java b/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
index 25cc7078762a..10bfa4247159 100644
--- a/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
@@ -23,11 +23,12 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java b/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
index a482c4a6c2f7..a7a81f2d20bb 100644
--- a/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
+++ b/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
@@ -18,13 +18,14 @@ package android.textclassifier;
import android.content.Context;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.view.textclassifier.ConversationActions;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLanguage;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java b/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java
index 0c1f2899690d..b24bf42be632 100644
--- a/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java
+++ b/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java
@@ -18,8 +18,9 @@ package android.util;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/util/perftests/LogPerfTest.java b/apct-tests/perftests/core/src/android/util/perftests/LogPerfTest.java
index 07cd33f09294..26cec952a0e5 100644
--- a/apct-tests/perftests/core/src/android/util/perftests/LogPerfTest.java
+++ b/apct-tests/perftests/core/src/android/util/perftests/LogPerfTest.java
@@ -18,11 +18,11 @@ package android.util.perftests;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/view/ViewPerfTest.java b/apct-tests/perftests/core/src/android/view/ViewPerfTest.java
index 990be24bc805..a1f8608e197a 100644
--- a/apct-tests/perftests/core/src/android/view/ViewPerfTest.java
+++ b/apct-tests/perftests/core/src/android/view/ViewPerfTest.java
@@ -17,13 +17,13 @@
package android.view;
import android.content.Context;
-import android.content.res.Resources;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.widget.FrameLayout;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import com.android.perftests.core.R;
import org.junit.Rule;
diff --git a/apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java b/apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java
index dc4d4bd782fb..b34001dcf6b5 100644
--- a/apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java
+++ b/apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java
@@ -24,14 +24,15 @@ import android.graphics.drawable.ColorDrawable;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
import android.view.View.MeasureSpec;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/apct-tests/perftests/core/src/android/widget/EditTextBackspacePerfTest.java b/apct-tests/perftests/core/src/android/widget/EditTextBackspacePerfTest.java
index d219d3a28189..b3ea62aa7da0 100644
--- a/apct-tests/perftests/core/src/android/widget/EditTextBackspacePerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/EditTextBackspacePerfTest.java
@@ -19,14 +19,15 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
import android.text.Selection;
import android.view.KeyEvent;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/widget/EditTextCursorMovementPerfTest.java b/apct-tests/perftests/core/src/android/widget/EditTextCursorMovementPerfTest.java
index b6cf7d3f49c2..aa47d5bdd998 100644
--- a/apct-tests/perftests/core/src/android/widget/EditTextCursorMovementPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/EditTextCursorMovementPerfTest.java
@@ -19,14 +19,15 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
import android.text.Selection;
import android.view.KeyEvent;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/widget/EditTextLongTextPerfTest.java b/apct-tests/perftests/core/src/android/widget/EditTextLongTextPerfTest.java
index ce0c35747b3f..e50016c45008 100644
--- a/apct-tests/perftests/core/src/android/widget/EditTextLongTextPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/EditTextLongTextPerfTest.java
@@ -16,10 +16,16 @@
package android.widget;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Locale;
-import java.util.Random;
+import android.app.Activity;
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.perftests.utils.StubActivity;
+import android.view.KeyEvent;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
@@ -27,22 +33,9 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import android.app.Activity;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.RenderNodeAnimator;
-import android.view.ViewGroup;
-import android.view.View.MeasureSpec;
-
-import android.perftests.utils.BenchmarkState;
-import android.perftests.utils.PerfStatusReporter;
-import android.perftests.utils.StubActivity;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.InstrumentationRegistry;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Random;
@LargeTest
@RunWith(Parameterized.class)
diff --git a/apct-tests/perftests/core/src/android/widget/LayoutPerfTest.java b/apct-tests/perftests/core/src/android/widget/LayoutPerfTest.java
index d570ef3b2de6..644095b36206 100644
--- a/apct-tests/perftests/core/src/android/widget/LayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/LayoutPerfTest.java
@@ -16,17 +16,26 @@
package android.widget;
+import static android.perftests.utils.LayoutUtils.gatherViewTree;
+import static android.perftests.utils.LayoutUtils.requestLayoutForAllNodes;
+import static android.view.View.MeasureSpec.AT_MOST;
+import static android.view.View.MeasureSpec.EXACTLY;
+import static android.view.View.MeasureSpec.UNSPECIFIED;
+
+import static org.junit.Assert.assertTrue;
+
import android.app.Activity;
import android.os.Looper;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
import com.android.perftests.core.R;
import org.junit.Rule;
@@ -38,13 +47,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-import static android.perftests.utils.LayoutUtils.gatherViewTree;
-import static android.perftests.utils.LayoutUtils.requestLayoutForAllNodes;
-import static android.view.View.MeasureSpec.AT_MOST;
-import static android.view.View.MeasureSpec.EXACTLY;
-import static android.view.View.MeasureSpec.UNSPECIFIED;
-import static org.junit.Assert.assertTrue;
-
@LargeTest
@RunWith(Parameterized.class)
public class LayoutPerfTest {
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
index c3101664d1ff..bed173bd269a 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
@@ -16,33 +16,27 @@
package android.widget;
+import static org.junit.Assert.assertTrue;
+
import android.app.Activity;
import android.os.Looper;
-import android.os.Bundle;
-import android.perftests.utils.PerfStatusReporter;
-import android.util.Log;
-import android.view.View;
-
import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.InstrumentationRegistry;
-import com.android.perftests.core.R;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
-import java.util.Locale;
-import java.util.Collection;
-import java.util.Arrays;
+import com.android.perftests.core.R;
-import org.junit.Test;
import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java
index 4b6da6ba345a..1f008382ae74 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java
@@ -19,23 +19,21 @@ package android.widget;
import android.content.Context;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.LayoutInflater;
-import com.android.perftests.core.R;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
-import java.util.Collection;
-import java.util.Arrays;
+import com.android.perftests.core.R;
-import org.junit.Test;
import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewOnMeasurePerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewOnMeasurePerfTest.java
index a14dd25c4446..88acbba62d40 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewOnMeasurePerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewOnMeasurePerfTest.java
@@ -25,24 +25,20 @@ import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.TextAppearanceSpan;
-import android.view.LayoutInflater;
-import com.android.perftests.core.R;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
-import java.util.Random;
-import java.util.Locale;
-
-import org.junit.Test;
import org.junit.Rule;
+import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertTrue;
+import java.util.Locale;
+import java.util.Random;
@LargeTest
@RunWith(AndroidJUnit4.class)
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
index bd9111228eac..0bc9ee4e53ab 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
@@ -24,9 +24,6 @@ import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.BoringLayout;
import android.text.Layout;
import android.text.PrecomputedText;
@@ -34,6 +31,10 @@ import android.text.TextPaint;
import android.text.TextPerfUtils;
import android.view.View.MeasureSpec;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewSetTextLocalePerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewSetTextLocalePerfTest.java
index e95676b272fd..00bd8db7f5a3 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewSetTextLocalePerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewSetTextLocalePerfTest.java
@@ -19,8 +19,9 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
diff --git a/api/current.txt b/api/current.txt
index 8d0b5c7e63de..3cb45c896de7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1,3 +1,4 @@
+// Signature format: 2.0
package android {
public final class Manifest {
@@ -6,183 +7,183 @@ package android {
public static final class Manifest.permission {
ctor public Manifest.permission();
- field public static final java.lang.String ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER";
- field public static final java.lang.String ACCESS_BACKGROUND_LOCATION = "android.permission.ACCESS_BACKGROUND_LOCATION";
- field public static final java.lang.String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
- field public static final java.lang.String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
- field public static final java.lang.String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
- field public static final java.lang.String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
- field public static final java.lang.String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";
- field public static final java.lang.String ACCESS_NETWORK_STATE = "android.permission.ACCESS_NETWORK_STATE";
- field public static final java.lang.String ACCESS_NOTIFICATION_POLICY = "android.permission.ACCESS_NOTIFICATION_POLICY";
- field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
- field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
- field public static final java.lang.String ACTIVITY_RECOGNITION = "android.permission.ACTIVITY_RECOGNITION";
- field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
- field public static final java.lang.String ANSWER_PHONE_CALLS = "android.permission.ANSWER_PHONE_CALLS";
- field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
- field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
- field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
- field public static final java.lang.String BIND_AUTOFILL_SERVICE = "android.permission.BIND_AUTOFILL_SERVICE";
- field public static final java.lang.String BIND_CALL_REDIRECTION_SERVICE = "android.permission.BIND_CALL_REDIRECTION_SERVICE";
- field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
- field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
- field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
- field public static final java.lang.String BIND_CONDITION_PROVIDER_SERVICE = "android.permission.BIND_CONDITION_PROVIDER_SERVICE";
- field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN";
- field public static final java.lang.String BIND_DREAM_SERVICE = "android.permission.BIND_DREAM_SERVICE";
- field public static final java.lang.String BIND_INCALL_SERVICE = "android.permission.BIND_INCALL_SERVICE";
- field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
- field public static final java.lang.String BIND_MIDI_DEVICE_SERVICE = "android.permission.BIND_MIDI_DEVICE_SERVICE";
- field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
- field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
- field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
- field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE";
- field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
- field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE";
- field public static final java.lang.String BIND_SMS_APP_SERVICE = "android.permission.BIND_SMS_APP_SERVICE";
- field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE";
- field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE";
- field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT";
- field public static final java.lang.String BIND_VISUAL_VOICEMAIL_SERVICE = "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE";
- field public static final java.lang.String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION";
- field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE";
- field public static final java.lang.String BIND_VR_LISTENER_SERVICE = "android.permission.BIND_VR_LISTENER_SERVICE";
- field public static final java.lang.String BIND_WALLPAPER = "android.permission.BIND_WALLPAPER";
- field public static final java.lang.String BLUETOOTH = "android.permission.BLUETOOTH";
- field public static final java.lang.String BLUETOOTH_ADMIN = "android.permission.BLUETOOTH_ADMIN";
- field public static final java.lang.String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED";
- field public static final java.lang.String BODY_SENSORS = "android.permission.BODY_SENSORS";
- field public static final java.lang.String BROADCAST_PACKAGE_REMOVED = "android.permission.BROADCAST_PACKAGE_REMOVED";
- field public static final java.lang.String BROADCAST_SMS = "android.permission.BROADCAST_SMS";
- field public static final java.lang.String BROADCAST_STICKY = "android.permission.BROADCAST_STICKY";
- field public static final java.lang.String BROADCAST_WAP_PUSH = "android.permission.BROADCAST_WAP_PUSH";
- field public static final java.lang.String CALL_COMPANION_APP = "android.permission.CALL_COMPANION_APP";
- field public static final java.lang.String CALL_PHONE = "android.permission.CALL_PHONE";
- field public static final java.lang.String CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED";
- field public static final java.lang.String CAMERA = "android.permission.CAMERA";
- field public static final java.lang.String CAPTURE_AUDIO_OUTPUT = "android.permission.CAPTURE_AUDIO_OUTPUT";
- field public static final java.lang.String CHANGE_COMPONENT_ENABLED_STATE = "android.permission.CHANGE_COMPONENT_ENABLED_STATE";
- field public static final java.lang.String CHANGE_CONFIGURATION = "android.permission.CHANGE_CONFIGURATION";
- field public static final java.lang.String CHANGE_NETWORK_STATE = "android.permission.CHANGE_NETWORK_STATE";
- field public static final java.lang.String CHANGE_WIFI_MULTICAST_STATE = "android.permission.CHANGE_WIFI_MULTICAST_STATE";
- field public static final java.lang.String CHANGE_WIFI_STATE = "android.permission.CHANGE_WIFI_STATE";
- field public static final java.lang.String CLEAR_APP_CACHE = "android.permission.CLEAR_APP_CACHE";
- field public static final java.lang.String CONTROL_LOCATION_UPDATES = "android.permission.CONTROL_LOCATION_UPDATES";
- field public static final java.lang.String DELETE_CACHE_FILES = "android.permission.DELETE_CACHE_FILES";
- field public static final java.lang.String DELETE_PACKAGES = "android.permission.DELETE_PACKAGES";
- field public static final java.lang.String DIAGNOSTIC = "android.permission.DIAGNOSTIC";
- field public static final java.lang.String DISABLE_KEYGUARD = "android.permission.DISABLE_KEYGUARD";
- field public static final java.lang.String DUMP = "android.permission.DUMP";
- field public static final java.lang.String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR";
- field public static final java.lang.String FACTORY_TEST = "android.permission.FACTORY_TEST";
- field public static final java.lang.String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE";
- field public static final java.lang.String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
- field public static final java.lang.String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED";
- field public static final java.lang.String GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY = "android.permission.GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY";
- field public static final java.lang.String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
- field public static final deprecated java.lang.String GET_TASKS = "android.permission.GET_TASKS";
- field public static final java.lang.String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH";
- field public static final java.lang.String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
- field public static final java.lang.String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES";
- field public static final java.lang.String INSTALL_SHORTCUT = "com.android.launcher.permission.INSTALL_SHORTCUT";
- field public static final java.lang.String INSTANT_APP_FOREGROUND_SERVICE = "android.permission.INSTANT_APP_FOREGROUND_SERVICE";
- field public static final java.lang.String INTERNET = "android.permission.INTERNET";
- field public static final java.lang.String KILL_BACKGROUND_PROCESSES = "android.permission.KILL_BACKGROUND_PROCESSES";
- field public static final java.lang.String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE";
- field public static final java.lang.String MANAGE_DOCUMENTS = "android.permission.MANAGE_DOCUMENTS";
- field public static final java.lang.String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS";
- field public static final java.lang.String MASTER_CLEAR = "android.permission.MASTER_CLEAR";
- field public static final java.lang.String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL";
- field public static final java.lang.String MODIFY_AUDIO_SETTINGS = "android.permission.MODIFY_AUDIO_SETTINGS";
- field public static final java.lang.String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE";
- field public static final java.lang.String MOUNT_FORMAT_FILESYSTEMS = "android.permission.MOUNT_FORMAT_FILESYSTEMS";
- field public static final java.lang.String MOUNT_UNMOUNT_FILESYSTEMS = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS";
- field public static final java.lang.String NFC = "android.permission.NFC";
- field public static final java.lang.String NFC_TRANSACTION_EVENT = "android.permission.NFC_TRANSACTION_EVENT";
- field public static final java.lang.String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
- field public static final deprecated java.lang.String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY";
- field public static final java.lang.String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
- field public static final java.lang.String READ_CALENDAR = "android.permission.READ_CALENDAR";
- field public static final java.lang.String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
- field public static final java.lang.String READ_CONTACTS = "android.permission.READ_CONTACTS";
- field public static final deprecated java.lang.String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
- field public static final deprecated java.lang.String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
- field public static final java.lang.String READ_LOGS = "android.permission.READ_LOGS";
- field public static final java.lang.String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO";
- field public static final java.lang.String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES";
- field public static final java.lang.String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO";
- field public static final java.lang.String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS";
- field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
- field public static final java.lang.String READ_SMS = "android.permission.READ_SMS";
- field public static final java.lang.String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS";
- field public static final java.lang.String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS";
- field public static final java.lang.String READ_VOICEMAIL = "com.android.voicemail.permission.READ_VOICEMAIL";
- field public static final java.lang.String REBOOT = "android.permission.REBOOT";
- field public static final java.lang.String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED";
- field public static final java.lang.String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
- field public static final java.lang.String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
- field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
- field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
- field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
- field public static final java.lang.String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND";
- field public static final java.lang.String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND";
- field public static final java.lang.String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
- field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
- field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
- field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
- field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
- field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
- field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
- field public static final java.lang.String SET_ALWAYS_FINISH = "android.permission.SET_ALWAYS_FINISH";
- field public static final java.lang.String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE";
- field public static final java.lang.String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP";
- field public static final deprecated java.lang.String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS";
- field public static final java.lang.String SET_PROCESS_LIMIT = "android.permission.SET_PROCESS_LIMIT";
- field public static final java.lang.String SET_TIME = "android.permission.SET_TIME";
- field public static final java.lang.String SET_TIME_ZONE = "android.permission.SET_TIME_ZONE";
- field public static final java.lang.String SET_WALLPAPER = "android.permission.SET_WALLPAPER";
- field public static final java.lang.String SET_WALLPAPER_HINTS = "android.permission.SET_WALLPAPER_HINTS";
- field public static final java.lang.String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES";
- field public static final java.lang.String SMS_FINANCIAL_TRANSACTIONS = "android.permission.SMS_FINANCIAL_TRANSACTIONS";
- field public static final java.lang.String STATUS_BAR = "android.permission.STATUS_BAR";
- field public static final java.lang.String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW";
- field public static final java.lang.String TRANSMIT_IR = "android.permission.TRANSMIT_IR";
- field public static final java.lang.String UNINSTALL_SHORTCUT = "com.android.launcher.permission.UNINSTALL_SHORTCUT";
- field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
- field public static final java.lang.String USE_BIOMETRIC = "android.permission.USE_BIOMETRIC";
- field public static final deprecated java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
- field public static final java.lang.String USE_FULL_SCREEN_INTENT = "android.permission.USE_FULL_SCREEN_INTENT";
- field public static final java.lang.String USE_SIP = "android.permission.USE_SIP";
- field public static final java.lang.String VIBRATE = "android.permission.VIBRATE";
- field public static final java.lang.String WAKE_LOCK = "android.permission.WAKE_LOCK";
- field public static final java.lang.String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS";
- field public static final java.lang.String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
- field public static final java.lang.String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
- field public static final java.lang.String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
- field public static final deprecated java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
- field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
- field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
- field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
- field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
- field public static final java.lang.String WRITE_VOICEMAIL = "com.android.voicemail.permission.WRITE_VOICEMAIL";
+ field public static final String ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER";
+ field public static final String ACCESS_BACKGROUND_LOCATION = "android.permission.ACCESS_BACKGROUND_LOCATION";
+ field public static final String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
+ field public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
+ field public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
+ field public static final String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
+ field public static final String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";
+ field public static final String ACCESS_NETWORK_STATE = "android.permission.ACCESS_NETWORK_STATE";
+ field public static final String ACCESS_NOTIFICATION_POLICY = "android.permission.ACCESS_NOTIFICATION_POLICY";
+ field public static final String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
+ field public static final String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
+ field public static final String ACTIVITY_RECOGNITION = "android.permission.ACTIVITY_RECOGNITION";
+ field public static final String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
+ field public static final String ANSWER_PHONE_CALLS = "android.permission.ANSWER_PHONE_CALLS";
+ field public static final String BATTERY_STATS = "android.permission.BATTERY_STATS";
+ field public static final String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
+ field public static final String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final String BIND_AUTOFILL_SERVICE = "android.permission.BIND_AUTOFILL_SERVICE";
+ field public static final String BIND_CALL_REDIRECTION_SERVICE = "android.permission.BIND_CALL_REDIRECTION_SERVICE";
+ field @Deprecated public static final String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
+ field public static final String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
+ field public static final String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
+ field public static final String BIND_CONDITION_PROVIDER_SERVICE = "android.permission.BIND_CONDITION_PROVIDER_SERVICE";
+ field public static final String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN";
+ field public static final String BIND_DREAM_SERVICE = "android.permission.BIND_DREAM_SERVICE";
+ field public static final String BIND_INCALL_SERVICE = "android.permission.BIND_INCALL_SERVICE";
+ field public static final String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
+ field public static final String BIND_MIDI_DEVICE_SERVICE = "android.permission.BIND_MIDI_DEVICE_SERVICE";
+ field public static final String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
+ field public static final String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
+ field public static final String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
+ field public static final String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE";
+ field public static final String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
+ field public static final String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE";
+ field public static final String BIND_SMS_APP_SERVICE = "android.permission.BIND_SMS_APP_SERVICE";
+ field public static final String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE";
+ field public static final String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE";
+ field public static final String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT";
+ field public static final String BIND_VISUAL_VOICEMAIL_SERVICE = "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE";
+ field public static final String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION";
+ field public static final String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE";
+ field public static final String BIND_VR_LISTENER_SERVICE = "android.permission.BIND_VR_LISTENER_SERVICE";
+ field public static final String BIND_WALLPAPER = "android.permission.BIND_WALLPAPER";
+ field public static final String BLUETOOTH = "android.permission.BLUETOOTH";
+ field public static final String BLUETOOTH_ADMIN = "android.permission.BLUETOOTH_ADMIN";
+ field public static final String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED";
+ field public static final String BODY_SENSORS = "android.permission.BODY_SENSORS";
+ field public static final String BROADCAST_PACKAGE_REMOVED = "android.permission.BROADCAST_PACKAGE_REMOVED";
+ field public static final String BROADCAST_SMS = "android.permission.BROADCAST_SMS";
+ field public static final String BROADCAST_STICKY = "android.permission.BROADCAST_STICKY";
+ field public static final String BROADCAST_WAP_PUSH = "android.permission.BROADCAST_WAP_PUSH";
+ field public static final String CALL_COMPANION_APP = "android.permission.CALL_COMPANION_APP";
+ field public static final String CALL_PHONE = "android.permission.CALL_PHONE";
+ field public static final String CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED";
+ field public static final String CAMERA = "android.permission.CAMERA";
+ field public static final String CAPTURE_AUDIO_OUTPUT = "android.permission.CAPTURE_AUDIO_OUTPUT";
+ field public static final String CHANGE_COMPONENT_ENABLED_STATE = "android.permission.CHANGE_COMPONENT_ENABLED_STATE";
+ field public static final String CHANGE_CONFIGURATION = "android.permission.CHANGE_CONFIGURATION";
+ field public static final String CHANGE_NETWORK_STATE = "android.permission.CHANGE_NETWORK_STATE";
+ field public static final String CHANGE_WIFI_MULTICAST_STATE = "android.permission.CHANGE_WIFI_MULTICAST_STATE";
+ field public static final String CHANGE_WIFI_STATE = "android.permission.CHANGE_WIFI_STATE";
+ field public static final String CLEAR_APP_CACHE = "android.permission.CLEAR_APP_CACHE";
+ field public static final String CONTROL_LOCATION_UPDATES = "android.permission.CONTROL_LOCATION_UPDATES";
+ field public static final String DELETE_CACHE_FILES = "android.permission.DELETE_CACHE_FILES";
+ field public static final String DELETE_PACKAGES = "android.permission.DELETE_PACKAGES";
+ field public static final String DIAGNOSTIC = "android.permission.DIAGNOSTIC";
+ field public static final String DISABLE_KEYGUARD = "android.permission.DISABLE_KEYGUARD";
+ field public static final String DUMP = "android.permission.DUMP";
+ field public static final String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR";
+ field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST";
+ field public static final String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE";
+ field public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
+ field public static final String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED";
+ field public static final String GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY = "android.permission.GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY";
+ field public static final String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
+ field @Deprecated public static final String GET_TASKS = "android.permission.GET_TASKS";
+ field public static final String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH";
+ field public static final String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
+ field public static final String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES";
+ field public static final String INSTALL_SHORTCUT = "com.android.launcher.permission.INSTALL_SHORTCUT";
+ field public static final String INSTANT_APP_FOREGROUND_SERVICE = "android.permission.INSTANT_APP_FOREGROUND_SERVICE";
+ field public static final String INTERNET = "android.permission.INTERNET";
+ field public static final String KILL_BACKGROUND_PROCESSES = "android.permission.KILL_BACKGROUND_PROCESSES";
+ field public static final String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE";
+ field public static final String MANAGE_DOCUMENTS = "android.permission.MANAGE_DOCUMENTS";
+ field public static final String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS";
+ field public static final String MASTER_CLEAR = "android.permission.MASTER_CLEAR";
+ field public static final String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL";
+ field public static final String MODIFY_AUDIO_SETTINGS = "android.permission.MODIFY_AUDIO_SETTINGS";
+ field public static final String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE";
+ field public static final String MOUNT_FORMAT_FILESYSTEMS = "android.permission.MOUNT_FORMAT_FILESYSTEMS";
+ field public static final String MOUNT_UNMOUNT_FILESYSTEMS = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS";
+ field public static final String NFC = "android.permission.NFC";
+ field public static final String NFC_TRANSACTION_EVENT = "android.permission.NFC_TRANSACTION_EVENT";
+ field public static final String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
+ field @Deprecated public static final String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY";
+ field public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
+ field public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
+ field public static final String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
+ field public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
+ field @Deprecated public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
+ field @Deprecated public static final String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
+ field public static final String READ_LOGS = "android.permission.READ_LOGS";
+ field public static final String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO";
+ field public static final String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES";
+ field public static final String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO";
+ field public static final String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS";
+ field public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
+ field public static final String READ_SMS = "android.permission.READ_SMS";
+ field public static final String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS";
+ field public static final String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS";
+ field public static final String READ_VOICEMAIL = "com.android.voicemail.permission.READ_VOICEMAIL";
+ field public static final String REBOOT = "android.permission.REBOOT";
+ field public static final String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED";
+ field public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
+ field public static final String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
+ field public static final String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
+ field public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
+ field public static final String REORDER_TASKS = "android.permission.REORDER_TASKS";
+ field public static final String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND";
+ field public static final String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND";
+ field public static final String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
+ field public static final String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
+ field public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
+ field @Deprecated public static final String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
+ field public static final String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
+ field public static final String SEND_SMS = "android.permission.SEND_SMS";
+ field public static final String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
+ field public static final String SET_ALWAYS_FINISH = "android.permission.SET_ALWAYS_FINISH";
+ field public static final String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE";
+ field public static final String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP";
+ field @Deprecated public static final String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS";
+ field public static final String SET_PROCESS_LIMIT = "android.permission.SET_PROCESS_LIMIT";
+ field public static final String SET_TIME = "android.permission.SET_TIME";
+ field public static final String SET_TIME_ZONE = "android.permission.SET_TIME_ZONE";
+ field public static final String SET_WALLPAPER = "android.permission.SET_WALLPAPER";
+ field public static final String SET_WALLPAPER_HINTS = "android.permission.SET_WALLPAPER_HINTS";
+ field public static final String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES";
+ field public static final String SMS_FINANCIAL_TRANSACTIONS = "android.permission.SMS_FINANCIAL_TRANSACTIONS";
+ field public static final String STATUS_BAR = "android.permission.STATUS_BAR";
+ field public static final String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW";
+ field public static final String TRANSMIT_IR = "android.permission.TRANSMIT_IR";
+ field public static final String UNINSTALL_SHORTCUT = "com.android.launcher.permission.UNINSTALL_SHORTCUT";
+ field public static final String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
+ field public static final String USE_BIOMETRIC = "android.permission.USE_BIOMETRIC";
+ field @Deprecated public static final String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
+ field public static final String USE_FULL_SCREEN_INTENT = "android.permission.USE_FULL_SCREEN_INTENT";
+ field public static final String USE_SIP = "android.permission.USE_SIP";
+ field public static final String VIBRATE = "android.permission.VIBRATE";
+ field public static final String WAKE_LOCK = "android.permission.WAKE_LOCK";
+ field public static final String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS";
+ field public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
+ field public static final String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
+ field public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
+ field @Deprecated public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
+ field public static final String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
+ field public static final String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
+ field public static final String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
+ field public static final String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
+ field public static final String WRITE_VOICEMAIL = "com.android.voicemail.permission.WRITE_VOICEMAIL";
}
public static final class Manifest.permission_group {
ctor public Manifest.permission_group();
- field public static final java.lang.String ACTIVITY_RECOGNITION = "android.permission-group.ACTIVITY_RECOGNITION";
- field public static final java.lang.String CALENDAR = "android.permission-group.CALENDAR";
- field public static final java.lang.String CALL_LOG = "android.permission-group.CALL_LOG";
- field public static final java.lang.String CAMERA = "android.permission-group.CAMERA";
- field public static final java.lang.String CONTACTS = "android.permission-group.CONTACTS";
- field public static final java.lang.String LOCATION = "android.permission-group.LOCATION";
- field public static final java.lang.String MEDIA_AURAL = "android.permission-group.MEDIA_AURAL";
- field public static final java.lang.String MEDIA_VISUAL = "android.permission-group.MEDIA_VISUAL";
- field public static final java.lang.String MICROPHONE = "android.permission-group.MICROPHONE";
- field public static final java.lang.String PHONE = "android.permission-group.PHONE";
- field public static final java.lang.String SENSORS = "android.permission-group.SENSORS";
- field public static final java.lang.String SMS = "android.permission-group.SMS";
- field public static final deprecated java.lang.String STORAGE = "android.permission-group.STORAGE";
+ field public static final String ACTIVITY_RECOGNITION = "android.permission-group.ACTIVITY_RECOGNITION";
+ field public static final String CALENDAR = "android.permission-group.CALENDAR";
+ field public static final String CALL_LOG = "android.permission-group.CALL_LOG";
+ field public static final String CAMERA = "android.permission-group.CAMERA";
+ field public static final String CONTACTS = "android.permission-group.CONTACTS";
+ field public static final String LOCATION = "android.permission-group.LOCATION";
+ field public static final String MEDIA_AURAL = "android.permission-group.MEDIA_AURAL";
+ field public static final String MEDIA_VISUAL = "android.permission-group.MEDIA_VISUAL";
+ field public static final String MICROPHONE = "android.permission-group.MICROPHONE";
+ field public static final String PHONE = "android.permission-group.PHONE";
+ field public static final String SENSORS = "android.permission-group.SENSORS";
+ field public static final String SMS = "android.permission-group.SMS";
+ field @Deprecated public static final String STORAGE = "android.permission-group.STORAGE";
}
public final class R {
@@ -293,8 +294,8 @@ package android {
field public static final int alphabeticShortcut = 16843235; // 0x10101e3
field public static final int alwaysDrawnWithCache = 16842991; // 0x10100ef
field public static final int alwaysRetainTaskState = 16843267; // 0x1010203
- field public static final deprecated int amPmBackgroundColor = 16843941; // 0x10104a5
- field public static final deprecated int amPmTextColor = 16843940; // 0x10104a4
+ field @Deprecated public static final int amPmBackgroundColor = 16843941; // 0x10104a5
+ field @Deprecated public static final int amPmTextColor = 16843940; // 0x10104a4
field public static final int ambientShadowAlpha = 16843966; // 0x10104be
field public static final int angle = 16843168; // 0x10101a0
field public static final int animateFirstView = 16843477; // 0x10102d5
@@ -304,7 +305,7 @@ package android {
field public static final int animationCache = 16842989; // 0x10100ed
field public static final int animationDuration = 16843026; // 0x1010112
field public static final int animationOrder = 16843214; // 0x10101ce
- field public static final deprecated int animationResolution = 16843546; // 0x101031a
+ field @Deprecated public static final int animationResolution = 16843546; // 0x101031a
field public static final int antialias = 16843034; // 0x101011a
field public static final int anyDensity = 16843372; // 0x101026c
field public static final int apduServiceBanner = 16843757; // 0x10103ed
@@ -324,7 +325,7 @@ package android {
field public static final int autoSizeStepGranularity = 16844086; // 0x1010536
field public static final int autoSizeTextType = 16844085; // 0x1010535
field public static final int autoStart = 16843445; // 0x10102b5
- field public static final deprecated int autoText = 16843114; // 0x101016a
+ field @Deprecated public static final int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
field public static final int autofillHints = 16844118; // 0x1010556
@@ -377,14 +378,14 @@ package android {
field public static final int canControlMagnification = 16844039; // 0x1010507
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
- field public static final deprecated int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
+ field @Deprecated public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
field public static final int canRequestFingerprintGestures = 16844109; // 0x101054d
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
field public static final int cantSaveState = 16844142; // 0x101056e
- field public static final deprecated int capitalize = 16843113; // 0x1010169
+ field @Deprecated public static final int capitalize = 16843113; // 0x1010169
field public static final int category = 16843752; // 0x10103e8
field public static final int centerBright = 16842956; // 0x10100cc
field public static final int centerColor = 16843275; // 0x101020b
@@ -417,7 +418,7 @@ package android {
field public static final int clipOrientation = 16843274; // 0x101020a
field public static final int clipToPadding = 16842987; // 0x10100eb
field public static final int closeIcon = 16843905; // 0x1010481
- field public static final deprecated int codes = 16843330; // 0x1010242
+ field @Deprecated public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int collapseContentDescription = 16843984; // 0x10104d0
field public static final int collapseIcon = 16844031; // 0x10104ff
@@ -491,8 +492,8 @@ package android {
field public static final int datePickerMode = 16843955; // 0x10104b3
field public static final int datePickerStyle = 16843612; // 0x101035c
field public static final int dateTextAppearance = 16843593; // 0x1010349
- field public static final deprecated int dayOfWeekBackground = 16843924; // 0x1010494
- field public static final deprecated int dayOfWeekTextAppearance = 16843925; // 0x1010495
+ field @Deprecated public static final int dayOfWeekBackground = 16843924; // 0x1010494
+ field @Deprecated public static final int dayOfWeekTextAppearance = 16843925; // 0x1010495
field public static final int debuggable = 16842767; // 0x101000f
field public static final int defaultFocusHighlightEnabled = 16844130; // 0x1010562
field public static final int defaultHeight = 16844021; // 0x10104f5
@@ -519,7 +520,7 @@ package android {
field public static final int digits = 16843110; // 0x1010166
field public static final int directBootAware = 16844037; // 0x1010505
field public static final int direction = 16843217; // 0x10101d1
- field public static final deprecated int directionDescriptions = 16843681; // 0x10103a1
+ field @Deprecated public static final int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
field public static final int disableDependentsState = 16843249; // 0x10101f1
field public static final int disabledAlpha = 16842803; // 0x1010033
@@ -559,7 +560,7 @@ package android {
field public static final int editTextColor = 16843601; // 0x1010351
field public static final int editTextPreferenceStyle = 16842898; // 0x1010092
field public static final int editTextStyle = 16842862; // 0x101006e
- field public static final deprecated int editable = 16843115; // 0x101016b
+ field @Deprecated public static final int editable = 16843115; // 0x101016b
field public static final int editorExtras = 16843300; // 0x1010224
field public static final int elegantTextHeight = 16843869; // 0x101045d
field public static final int elevation = 16843840; // 0x1010440
@@ -571,7 +572,7 @@ package android {
field public static final int endColor = 16843166; // 0x101019e
field public static final int endX = 16844050; // 0x1010512
field public static final int endY = 16844051; // 0x1010513
- field public static final deprecated int endYear = 16843133; // 0x101017d
+ field @Deprecated public static final int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
field public static final int entries = 16842930; // 0x10100b2
field public static final int entryValues = 16843256; // 0x10101f8
@@ -630,7 +631,7 @@ package android {
field public static final int focusable = 16842970; // 0x10100da
field public static final int focusableInTouchMode = 16842971; // 0x10100db
field public static final int focusedByDefault = 16844100; // 0x1010544
- field public static final deprecated int focusedMonthDateColor = 16843587; // 0x1010343
+ field @Deprecated public static final int focusedMonthDateColor = 16843587; // 0x1010343
field public static final int font = 16844082; // 0x1010532
field public static final int fontFamily = 16843692; // 0x10103ac
field public static final int fontFeatureSettings = 16843959; // 0x10104b7
@@ -705,20 +706,20 @@ package android {
field public static final int hardwareAccelerated = 16843475; // 0x10102d3
field public static final int hasCode = 16842764; // 0x101000c
field public static final int hasFragileUserData = 16844192; // 0x10105a0
- field public static final deprecated int headerAmPmTextAppearance = 16843936; // 0x10104a0
+ field @Deprecated public static final int headerAmPmTextAppearance = 16843936; // 0x10104a0
field public static final int headerBackground = 16843055; // 0x101012f
- field public static final deprecated int headerDayOfMonthTextAppearance = 16843927; // 0x1010497
+ field @Deprecated public static final int headerDayOfMonthTextAppearance = 16843927; // 0x1010497
field public static final int headerDividersEnabled = 16843310; // 0x101022e
- field public static final deprecated int headerMonthTextAppearance = 16843926; // 0x1010496
- field public static final deprecated int headerTimeTextAppearance = 16843935; // 0x101049f
- field public static final deprecated int headerYearTextAppearance = 16843928; // 0x1010498
+ field @Deprecated public static final int headerMonthTextAppearance = 16843926; // 0x1010496
+ field @Deprecated public static final int headerTimeTextAppearance = 16843935; // 0x101049f
+ field @Deprecated public static final int headerYearTextAppearance = 16843928; // 0x1010498
field public static final int height = 16843093; // 0x1010155
field public static final int hideOnContentScroll = 16843843; // 0x1010443
field public static final int hint = 16843088; // 0x1010150
field public static final int homeAsUpIndicator = 16843531; // 0x101030b
field public static final int homeLayout = 16843549; // 0x101031d
field public static final int horizontalDivider = 16843053; // 0x101012d
- field public static final deprecated int horizontalGap = 16843327; // 0x101023f
+ field @Deprecated public static final int horizontalGap = 16843327; // 0x101023f
field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
field public static final int horizontalSpacing = 16843028; // 0x1010114
field public static final int host = 16842792; // 0x1010028
@@ -726,7 +727,7 @@ package android {
field public static final int hotSpotY = 16844056; // 0x1010518
field public static final int hyphenationFrequency = 16843998; // 0x10104de
field public static final int icon = 16842754; // 0x1010002
- field public static final deprecated int iconPreview = 16843337; // 0x1010249
+ field @Deprecated public static final int iconPreview = 16843337; // 0x1010249
field public static final int iconSpaceReserved = 16844129; // 0x1010561
field public static final int iconTint = 16844126; // 0x101055e
field public static final int iconTintMode = 16844127; // 0x101055f
@@ -769,7 +770,7 @@ package android {
field public static final int initialLayout = 16843345; // 0x1010251
field public static final int innerRadius = 16843359; // 0x101025f
field public static final int innerRadiusRatio = 16843163; // 0x101019b
- field public static final deprecated int inputMethod = 16843112; // 0x1010168
+ field @Deprecated public static final int inputMethod = 16843112; // 0x1010168
field public static final int inputType = 16843296; // 0x1010220
field public static final int inset = 16843957; // 0x10104b5
field public static final int insetBottom = 16843194; // 0x10101ba
@@ -787,12 +788,12 @@ package android {
field public static final int isGame = 16843764; // 0x10103f4
field public static final int isIndicator = 16843079; // 0x1010147
field public static final int isLightTheme = 16844176; // 0x1010590
- field public static final deprecated int isModifier = 16843334; // 0x1010246
- field public static final deprecated int isRepeatable = 16843336; // 0x1010248
+ field @Deprecated public static final int isModifier = 16843334; // 0x1010246
+ field @Deprecated public static final int isRepeatable = 16843336; // 0x1010248
field public static final int isScrollContainer = 16843342; // 0x101024e
field public static final int isSplitRequired = 16844177; // 0x1010591
field public static final int isStatic = 16844122; // 0x101055a
- field public static final deprecated int isSticky = 16843335; // 0x1010247
+ field @Deprecated public static final int isSticky = 16843335; // 0x1010247
field public static final int isolatedProcess = 16843689; // 0x10103a9
field public static final int isolatedSplits = 16844107; // 0x101054b
field public static final int itemBackground = 16843056; // 0x1010130
@@ -802,27 +803,27 @@ package android {
field public static final int justificationMode = 16844135; // 0x1010567
field public static final int keepScreenOn = 16843286; // 0x1010216
field public static final int key = 16843240; // 0x10101e8
- field public static final deprecated int keyBackground = 16843315; // 0x1010233
- field public static final deprecated int keyEdgeFlags = 16843333; // 0x1010245
- field public static final deprecated int keyHeight = 16843326; // 0x101023e
- field public static final deprecated int keyIcon = 16843340; // 0x101024c
- field public static final deprecated int keyLabel = 16843339; // 0x101024b
- field public static final deprecated int keyOutputText = 16843338; // 0x101024a
- field public static final deprecated int keyPreviewHeight = 16843321; // 0x1010239
- field public static final deprecated int keyPreviewLayout = 16843319; // 0x1010237
- field public static final deprecated int keyPreviewOffset = 16843320; // 0x1010238
+ field @Deprecated public static final int keyBackground = 16843315; // 0x1010233
+ field @Deprecated public static final int keyEdgeFlags = 16843333; // 0x1010245
+ field @Deprecated public static final int keyHeight = 16843326; // 0x101023e
+ field @Deprecated public static final int keyIcon = 16843340; // 0x101024c
+ field @Deprecated public static final int keyLabel = 16843339; // 0x101024b
+ field @Deprecated public static final int keyOutputText = 16843338; // 0x101024a
+ field @Deprecated public static final int keyPreviewHeight = 16843321; // 0x1010239
+ field @Deprecated public static final int keyPreviewLayout = 16843319; // 0x1010237
+ field @Deprecated public static final int keyPreviewOffset = 16843320; // 0x1010238
field public static final int keySet = 16843739; // 0x10103db
- field public static final deprecated int keyTextColor = 16843318; // 0x1010236
- field public static final deprecated int keyTextSize = 16843316; // 0x1010234
- field public static final deprecated int keyWidth = 16843325; // 0x101023d
+ field @Deprecated public static final int keyTextColor = 16843318; // 0x1010236
+ field @Deprecated public static final int keyTextSize = 16843316; // 0x1010234
+ field @Deprecated public static final int keyWidth = 16843325; // 0x101023d
field public static final int keyboardLayout = 16843691; // 0x10103ab
- field public static final deprecated int keyboardMode = 16843341; // 0x101024d
+ field @Deprecated public static final int keyboardMode = 16843341; // 0x101024d
field public static final int keyboardNavigationCluster = 16844096; // 0x1010540
field public static final int keycode = 16842949; // 0x10100c5
field public static final int killAfterRestore = 16843420; // 0x101029c
field public static final int label = 16842753; // 0x1010001
field public static final int labelFor = 16843718; // 0x10103c6
- field public static final deprecated int labelTextSize = 16843317; // 0x1010235
+ field @Deprecated public static final int labelTextSize = 16843317; // 0x1010235
field public static final int languageTag = 16844040; // 0x1010508
field public static final int largeHeap = 16843610; // 0x101035a
field public static final int largeScreens = 16843398; // 0x1010286
@@ -984,7 +985,7 @@ package android {
field public static final int numbersInnerTextColor = 16844001; // 0x10104e1
field public static final int numbersSelectorColor = 16843939; // 0x10104a3
field public static final int numbersTextColor = 16843937; // 0x10104a1
- field public static final deprecated int numeric = 16843109; // 0x1010165
+ field @Deprecated public static final int numeric = 16843109; // 0x1010165
field public static final int numericModifiers = 16844111; // 0x101054f
field public static final int numericShortcut = 16843236; // 0x10101e4
field public static final int offset = 16844052; // 0x1010514
@@ -1027,7 +1028,7 @@ package android {
field public static final int panelFullBackground = 16842847; // 0x101005f
field public static final int panelTextAppearance = 16842850; // 0x1010062
field public static final int parentActivityName = 16843687; // 0x10103a7
- field public static final deprecated int password = 16843100; // 0x101015c
+ field @Deprecated public static final int password = 16843100; // 0x101015c
field public static final int path = 16842794; // 0x101002a
field public static final int pathData = 16843781; // 0x1010405
field public static final int pathPattern = 16842796; // 0x101002c
@@ -1041,18 +1042,18 @@ package android {
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
field public static final int persistentWhenFeatureAvailable = 16844131; // 0x1010563
- field public static final deprecated int phoneNumber = 16843111; // 0x1010167
+ field @Deprecated public static final int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
field public static final int pointerIcon = 16844041; // 0x1010509
field public static final int popupAnimationStyle = 16843465; // 0x10102c9
field public static final int popupBackground = 16843126; // 0x1010176
- field public static final deprecated int popupCharacters = 16843332; // 0x1010244
+ field @Deprecated public static final int popupCharacters = 16843332; // 0x1010244
field public static final int popupElevation = 16843916; // 0x101048c
field public static final int popupEnterTransition = 16844063; // 0x101051f
field public static final int popupExitTransition = 16844064; // 0x1010520
- field public static final deprecated int popupKeyboard = 16843331; // 0x1010243
- field public static final deprecated int popupLayout = 16843323; // 0x101023b
+ field @Deprecated public static final int popupKeyboard = 16843331; // 0x1010243
+ field @Deprecated public static final int popupLayout = 16843323; // 0x101023b
field public static final int popupMenuStyle = 16843520; // 0x1010300
field public static final int popupTheme = 16843945; // 0x10104a9
field public static final int popupWindowStyle = 16842870; // 0x1010076
@@ -1135,7 +1136,7 @@ package android {
field public static final int resizeableActivity = 16844022; // 0x10104f6
field public static final int resource = 16842789; // 0x1010025
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
- field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
+ field @Deprecated public static final int restoreNeedsApplication = 16843421; // 0x101029d
field public static final int restrictedAccountType = 16843733; // 0x10103d5
field public static final int restrictionType = 16843923; // 0x1010493
field public static final int resumeWhilePausing = 16843954; // 0x10104b2
@@ -1151,7 +1152,7 @@ package android {
field public static final int roundIcon = 16844076; // 0x101052c
field public static final int rowCount = 16843637; // 0x1010375
field public static final int rowDelay = 16843216; // 0x10101d0
- field public static final deprecated int rowEdgeFlags = 16843329; // 0x1010241
+ field @Deprecated public static final int rowEdgeFlags = 16843329; // 0x1010241
field public static final int rowHeight = 16843058; // 0x1010132
field public static final int rowOrderPreserved = 16843638; // 0x1010376
field public static final int saveEnabled = 16842983; // 0x10100e7
@@ -1183,7 +1184,7 @@ package android {
field public static final int scrollbarTrackVertical = 16842855; // 0x1010067
field public static final int scrollbars = 16842974; // 0x10100de
field public static final int scrollingCache = 16843006; // 0x10100fe
- field public static final deprecated int searchButtonText = 16843269; // 0x1010205
+ field @Deprecated public static final int searchButtonText = 16843269; // 0x1010205
field public static final int searchHintIcon = 16843988; // 0x10104d4
field public static final int searchIcon = 16843907; // 0x1010483
field public static final int searchMode = 16843221; // 0x10101d5
@@ -1205,8 +1206,8 @@ package android {
field public static final int selectable = 16843238; // 0x10101e6
field public static final int selectableItemBackground = 16843534; // 0x101030e
field public static final int selectableItemBackgroundBorderless = 16843868; // 0x101045c
- field public static final deprecated int selectedDateVerticalBar = 16843591; // 0x1010347
- field public static final deprecated int selectedWeekBackgroundColor = 16843586; // 0x1010342
+ field @Deprecated public static final int selectedDateVerticalBar = 16843591; // 0x1010347
+ field @Deprecated public static final int selectedWeekBackgroundColor = 16843586; // 0x1010342
field public static final int selectionDividerHeight = 16844190; // 0x101059e
field public static final int sessionService = 16843837; // 0x101043d
field public static final int settingsActivity = 16843301; // 0x1010225
@@ -1231,14 +1232,14 @@ package android {
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showForAllUsers = 16844015; // 0x10104ef
field public static final int showMetadataInPreview = 16844079; // 0x101052f
- field public static final deprecated int showOnLockScreen = 16843721; // 0x10103c9
+ field @Deprecated public static final int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
- field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
+ field @Deprecated public static final int showWeekNumber = 16843582; // 0x101033e
field public static final int showWhenLocked = 16844137; // 0x1010569
- field public static final deprecated int shownWeekCount = 16843585; // 0x1010341
+ field @Deprecated public static final int shownWeekCount = 16843585; // 0x1010341
field public static final int shrinkColumns = 16843082; // 0x101014a
- field public static final deprecated int singleLine = 16843101; // 0x101015d
+ field @Deprecated public static final int singleLine = 16843101; // 0x101015d
field public static final int singleLineTitle = 16844124; // 0x101055c
field public static final int singleUser = 16843711; // 0x10103bf
field public static final int slideEdge = 16843824; // 0x1010430
@@ -1269,7 +1270,7 @@ package android {
field public static final int startOffset = 16843198; // 0x10101be
field public static final int startX = 16844048; // 0x1010510
field public static final int startY = 16844049; // 0x1010511
- field public static final deprecated int startYear = 16843132; // 0x101017c
+ field @Deprecated public static final int startYear = 16843132; // 0x101017c
field public static final int stateListAnimator = 16843848; // 0x1010448
field public static final int stateNotNeeded = 16842774; // 0x1010016
field public static final int state_above_anchor = 16842922; // 0x10100aa
@@ -1287,7 +1288,7 @@ package android {
field public static final int state_focused = 16842908; // 0x101009c
field public static final int state_hovered = 16843623; // 0x1010367
field public static final int state_last = 16842918; // 0x10100a6
- field public static final deprecated int state_long_pressable = 16843324; // 0x101023c
+ field @Deprecated public static final int state_long_pressable = 16843324; // 0x101023c
field public static final int state_middle = 16842917; // 0x10100a5
field public static final int state_multiline = 16843597; // 0x101034d
field public static final int state_pressed = 16842919; // 0x10100a7
@@ -1346,12 +1347,12 @@ package android {
field public static final int tag = 16842961; // 0x10100d1
field public static final int targetActivity = 16843266; // 0x1010202
field public static final int targetClass = 16842799; // 0x101002f
- field public static final deprecated int targetDescriptions = 16843680; // 0x10103a0
+ field @Deprecated public static final int targetDescriptions = 16843680; // 0x10103a0
field public static final int targetId = 16843740; // 0x10103dc
field public static final int targetName = 16843853; // 0x101044d
field public static final int targetPackage = 16842785; // 0x1010021
field public static final int targetProcesses = 16844097; // 0x1010541
- field public static final deprecated int targetSandboxVersion = 16844108; // 0x101054c
+ field @Deprecated public static final int targetSandboxVersion = 16844108; // 0x101054c
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
field public static final int taskCloseEnterAnimation = 16842942; // 0x10100be
@@ -1503,7 +1504,7 @@ package android {
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
field public static final int uncertainGestureColor = 16843382; // 0x1010276
- field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344
+ field @Deprecated public static final int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
field public static final int updatePeriodMillis = 16843344; // 0x1010250
field public static final int usageInfoRequired = 16844185; // 0x1010599
@@ -1525,9 +1526,9 @@ package android {
field public static final int versionCodeMajor = 16844150; // 0x1010576
field public static final int versionMajor = 16844151; // 0x1010577
field public static final int versionName = 16843292; // 0x101021c
- field public static final deprecated int verticalCorrection = 16843322; // 0x101023a
+ field @Deprecated public static final int verticalCorrection = 16843322; // 0x101023a
field public static final int verticalDivider = 16843054; // 0x101012e
- field public static final deprecated int verticalGap = 16843328; // 0x1010240
+ field @Deprecated public static final int verticalGap = 16843328; // 0x1010240
field public static final int verticalScrollbarPosition = 16843572; // 0x1010334
field public static final int verticalSpacing = 16843029; // 0x1010115
field public static final int viewportHeight = 16843779; // 0x1010403
@@ -1553,8 +1554,8 @@ package android {
field public static final int webTextViewStyle = 16843449; // 0x10102b9
field public static final int webViewStyle = 16842885; // 0x1010085
field public static final int weekDayTextAppearance = 16843592; // 0x1010348
- field public static final deprecated int weekNumberColor = 16843589; // 0x1010345
- field public static final deprecated int weekSeparatorLineColor = 16843590; // 0x1010346
+ field @Deprecated public static final int weekNumberColor = 16843589; // 0x1010345
+ field @Deprecated public static final int weekSeparatorLineColor = 16843590; // 0x1010346
field public static final int weightSum = 16843048; // 0x1010128
field public static final int widgetCategory = 16843716; // 0x10103c4
field public static final int widgetFeatures = 16844153; // 0x1010579
@@ -1617,8 +1618,8 @@ package android {
field public static final int x = 16842924; // 0x10100ac
field public static final int xlargeScreens = 16843455; // 0x10102bf
field public static final int y = 16842925; // 0x10100ad
- field public static final deprecated int yearListItemTextAppearance = 16843929; // 0x1010499
- field public static final deprecated int yearListSelectorColor = 16843930; // 0x101049a
+ field @Deprecated public static final int yearListItemTextAppearance = 16843929; // 0x1010499
+ field @Deprecated public static final int yearListSelectorColor = 16843930; // 0x101049a
field public static final int yesNoPreferenceStyle = 16842896; // 0x1010090
field public static final int zAdjustment = 16843201; // 0x10101c1
}
@@ -1643,17 +1644,17 @@ package android {
field public static final int holo_purple = 17170458; // 0x106001a
field public static final int holo_red_dark = 17170455; // 0x1060017
field public static final int holo_red_light = 17170454; // 0x1060016
- field public static final deprecated int primary_text_dark = 17170433; // 0x1060001
- field public static final deprecated int primary_text_dark_nodisable = 17170434; // 0x1060002
- field public static final deprecated int primary_text_light = 17170435; // 0x1060003
- field public static final deprecated int primary_text_light_nodisable = 17170436; // 0x1060004
- field public static final deprecated int secondary_text_dark = 17170437; // 0x1060005
- field public static final deprecated int secondary_text_dark_nodisable = 17170438; // 0x1060006
- field public static final deprecated int secondary_text_light = 17170439; // 0x1060007
- field public static final deprecated int secondary_text_light_nodisable = 17170440; // 0x1060008
+ field @Deprecated public static final int primary_text_dark = 17170433; // 0x1060001
+ field @Deprecated public static final int primary_text_dark_nodisable = 17170434; // 0x1060002
+ field @Deprecated public static final int primary_text_light = 17170435; // 0x1060003
+ field @Deprecated public static final int primary_text_light_nodisable = 17170436; // 0x1060004
+ field @Deprecated public static final int secondary_text_dark = 17170437; // 0x1060005
+ field @Deprecated public static final int secondary_text_dark_nodisable = 17170438; // 0x1060006
+ field @Deprecated public static final int secondary_text_light = 17170439; // 0x1060007
+ field @Deprecated public static final int secondary_text_light_nodisable = 17170440; // 0x1060008
field public static final int tab_indicator_text = 17170441; // 0x1060009
- field public static final deprecated int tertiary_text_dark = 17170448; // 0x1060010
- field public static final deprecated int tertiary_text_light = 17170449; // 0x1060011
+ field @Deprecated public static final int tertiary_text_dark = 17170448; // 0x1060010
+ field @Deprecated public static final int tertiary_text_light = 17170449; // 0x1060011
field public static final int transparent = 17170445; // 0x106000d
field public static final int white = 17170443; // 0x106000b
field public static final int widget_edittext_dark = 17170442; // 0x106000a
@@ -1823,14 +1824,14 @@ package android {
field public static final int stat_sys_download = 17301633; // 0x1080081
field public static final int stat_sys_download_done = 17301634; // 0x1080082
field public static final int stat_sys_headset = 17301635; // 0x1080083
- field public static final deprecated int stat_sys_phone_call = 17301636; // 0x1080084
- field public static final deprecated int stat_sys_phone_call_forward = 17301637; // 0x1080085
- field public static final deprecated int stat_sys_phone_call_on_hold = 17301638; // 0x1080086
+ field @Deprecated public static final int stat_sys_phone_call = 17301636; // 0x1080084
+ field @Deprecated public static final int stat_sys_phone_call_forward = 17301637; // 0x1080085
+ field @Deprecated public static final int stat_sys_phone_call_on_hold = 17301638; // 0x1080086
field public static final int stat_sys_speakerphone = 17301639; // 0x1080087
field public static final int stat_sys_upload = 17301640; // 0x1080088
field public static final int stat_sys_upload_done = 17301641; // 0x1080089
- field public static final deprecated int stat_sys_vp_phone_call = 17301671; // 0x10800a7
- field public static final deprecated int stat_sys_vp_phone_call_on_hold = 17301672; // 0x10800a8
+ field @Deprecated public static final int stat_sys_vp_phone_call = 17301671; // 0x10800a7
+ field @Deprecated public static final int stat_sys_vp_phone_call_on_hold = 17301672; // 0x10800a8
field public static final int stat_sys_warning = 17301642; // 0x108008a
field public static final int status_bar_item_app_background = 17301643; // 0x108008b
field public static final int status_bar_item_background = 17301644; // 0x108008c
@@ -1895,7 +1896,7 @@ package android {
field public static final int input = 16908297; // 0x1020009
field public static final int inputArea = 16908318; // 0x102001e
field public static final int inputExtractEditText = 16908325; // 0x1020025
- field public static final deprecated int keyboardView = 16908326; // 0x1020026
+ field @Deprecated public static final int keyboardView = 16908326; // 0x1020026
field public static final int list = 16908298; // 0x102000a
field public static final int list_container = 16908351; // 0x102003f
field public static final int mask = 16908334; // 0x102002e
@@ -2077,13 +2078,13 @@ package android {
field public static final int TextAppearance_DeviceDefault_Widget = 16974265; // 0x10301b9
field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Menu = 16974286; // 0x10301ce
field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle = 16974279; // 0x10301c7
- field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse = 16974283; // 0x10301cb
+ field @Deprecated public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse = 16974283; // 0x10301cb
field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title = 16974278; // 0x10301c6
- field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse = 16974282; // 0x10301ca
+ field @Deprecated public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse = 16974282; // 0x10301ca
field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle = 16974281; // 0x10301c9
- field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse = 16974285; // 0x10301cd
+ field @Deprecated public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse = 16974285; // 0x10301cd
field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title = 16974280; // 0x10301c8
- field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse = 16974284; // 0x10301cc
+ field @Deprecated public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse = 16974284; // 0x10301cc
field public static final int TextAppearance_DeviceDefault_Widget_Button = 16974266; // 0x10301ba
field public static final int TextAppearance_DeviceDefault_Widget_DropDownHint = 16974271; // 0x10301bf
field public static final int TextAppearance_DeviceDefault_Widget_DropDownItem = 16974272; // 0x10301c0
@@ -2260,34 +2261,34 @@ package android {
field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c
field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d
field public static final int Theme_Dialog = 16973835; // 0x103000b
- field public static final deprecated int Theme_Holo = 16973931; // 0x103006b
- field public static final deprecated int Theme_Holo_Dialog = 16973935; // 0x103006f
- field public static final deprecated int Theme_Holo_DialogWhenLarge = 16973943; // 0x1030077
- field public static final deprecated int Theme_Holo_DialogWhenLarge_NoActionBar = 16973944; // 0x1030078
- field public static final deprecated int Theme_Holo_Dialog_MinWidth = 16973936; // 0x1030070
- field public static final deprecated int Theme_Holo_Dialog_NoActionBar = 16973937; // 0x1030071
- field public static final deprecated int Theme_Holo_Dialog_NoActionBar_MinWidth = 16973938; // 0x1030072
- field public static final deprecated int Theme_Holo_InputMethod = 16973951; // 0x103007f
- field public static final deprecated int Theme_Holo_Light = 16973934; // 0x103006e
- field public static final deprecated int Theme_Holo_Light_DarkActionBar = 16974105; // 0x1030119
- field public static final deprecated int Theme_Holo_Light_Dialog = 16973939; // 0x1030073
- field public static final deprecated int Theme_Holo_Light_DialogWhenLarge = 16973945; // 0x1030079
- field public static final deprecated int Theme_Holo_Light_DialogWhenLarge_NoActionBar = 16973946; // 0x103007a
- field public static final deprecated int Theme_Holo_Light_Dialog_MinWidth = 16973940; // 0x1030074
- field public static final deprecated int Theme_Holo_Light_Dialog_NoActionBar = 16973941; // 0x1030075
- field public static final deprecated int Theme_Holo_Light_Dialog_NoActionBar_MinWidth = 16973942; // 0x1030076
- field public static final deprecated int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
- field public static final deprecated int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
- field public static final deprecated int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de
- field public static final deprecated int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2
- field public static final deprecated int Theme_Holo_Light_Panel = 16973948; // 0x103007c
- field public static final deprecated int Theme_Holo_NoActionBar = 16973932; // 0x103006c
- field public static final deprecated int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
- field public static final deprecated int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd
- field public static final deprecated int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1
- field public static final deprecated int Theme_Holo_Panel = 16973947; // 0x103007b
- field public static final deprecated int Theme_Holo_Wallpaper = 16973949; // 0x103007d
- field public static final deprecated int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e
+ field @Deprecated public static final int Theme_Holo = 16973931; // 0x103006b
+ field @Deprecated public static final int Theme_Holo_Dialog = 16973935; // 0x103006f
+ field @Deprecated public static final int Theme_Holo_DialogWhenLarge = 16973943; // 0x1030077
+ field @Deprecated public static final int Theme_Holo_DialogWhenLarge_NoActionBar = 16973944; // 0x1030078
+ field @Deprecated public static final int Theme_Holo_Dialog_MinWidth = 16973936; // 0x1030070
+ field @Deprecated public static final int Theme_Holo_Dialog_NoActionBar = 16973937; // 0x1030071
+ field @Deprecated public static final int Theme_Holo_Dialog_NoActionBar_MinWidth = 16973938; // 0x1030072
+ field @Deprecated public static final int Theme_Holo_InputMethod = 16973951; // 0x103007f
+ field @Deprecated public static final int Theme_Holo_Light = 16973934; // 0x103006e
+ field @Deprecated public static final int Theme_Holo_Light_DarkActionBar = 16974105; // 0x1030119
+ field @Deprecated public static final int Theme_Holo_Light_Dialog = 16973939; // 0x1030073
+ field @Deprecated public static final int Theme_Holo_Light_DialogWhenLarge = 16973945; // 0x1030079
+ field @Deprecated public static final int Theme_Holo_Light_DialogWhenLarge_NoActionBar = 16973946; // 0x103007a
+ field @Deprecated public static final int Theme_Holo_Light_Dialog_MinWidth = 16973940; // 0x1030074
+ field @Deprecated public static final int Theme_Holo_Light_Dialog_NoActionBar = 16973941; // 0x1030075
+ field @Deprecated public static final int Theme_Holo_Light_Dialog_NoActionBar_MinWidth = 16973942; // 0x1030076
+ field @Deprecated public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
+ field @Deprecated public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
+ field @Deprecated public static final int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de
+ field @Deprecated public static final int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2
+ field @Deprecated public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c
+ field @Deprecated public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c
+ field @Deprecated public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
+ field @Deprecated public static final int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd
+ field @Deprecated public static final int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1
+ field @Deprecated public static final int Theme_Holo_Panel = 16973947; // 0x103007b
+ field @Deprecated public static final int Theme_Holo_Wallpaper = 16973949; // 0x103007d
+ field @Deprecated public static final int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e
field public static final int Theme_InputMethod = 16973908; // 0x1030054
field public static final int Theme_Light = 16973836; // 0x103000c
field public static final int Theme_Light_NoTitleBar = 16973837; // 0x103000d
@@ -2401,18 +2402,18 @@ package android {
field public static final int Widget_DeviceDefault_Light = 16974196; // 0x1030174
field public static final int Widget_DeviceDefault_Light_ActionBar = 16974243; // 0x10301a3
field public static final int Widget_DeviceDefault_Light_ActionBar_Solid = 16974247; // 0x10301a7
- field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_Solid_Inverse = 16974248; // 0x10301a8
+ field @Deprecated public static final int Widget_DeviceDefault_Light_ActionBar_Solid_Inverse = 16974248; // 0x10301a8
field public static final int Widget_DeviceDefault_Light_ActionBar_TabBar = 16974246; // 0x10301a6
- field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse = 16974249; // 0x10301a9
+ field @Deprecated public static final int Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse = 16974249; // 0x10301a9
field public static final int Widget_DeviceDefault_Light_ActionBar_TabText = 16974245; // 0x10301a5
- field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabText_Inverse = 16974251; // 0x10301ab
+ field @Deprecated public static final int Widget_DeviceDefault_Light_ActionBar_TabText_Inverse = 16974251; // 0x10301ab
field public static final int Widget_DeviceDefault_Light_ActionBar_TabView = 16974244; // 0x10301a4
- field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabView_Inverse = 16974250; // 0x10301aa
+ field @Deprecated public static final int Widget_DeviceDefault_Light_ActionBar_TabView_Inverse = 16974250; // 0x10301aa
field public static final int Widget_DeviceDefault_Light_ActionButton = 16974239; // 0x103019f
field public static final int Widget_DeviceDefault_Light_ActionButton_CloseMode = 16974242; // 0x10301a2
field public static final int Widget_DeviceDefault_Light_ActionButton_Overflow = 16974240; // 0x10301a0
field public static final int Widget_DeviceDefault_Light_ActionMode = 16974241; // 0x10301a1
- field public static final deprecated int Widget_DeviceDefault_Light_ActionMode_Inverse = 16974252; // 0x10301ac
+ field @Deprecated public static final int Widget_DeviceDefault_Light_ActionMode_Inverse = 16974252; // 0x10301ac
field public static final int Widget_DeviceDefault_Light_AutoCompleteTextView = 16974203; // 0x103017b
field public static final int Widget_DeviceDefault_Light_Button = 16974197; // 0x1030175
field public static final int Widget_DeviceDefault_Light_Button_Borderless_Small = 16974201; // 0x1030179
@@ -2606,7 +2607,7 @@ package android {
field public static final int Widget_Holo_WebView = 16973993; // 0x10300a9
field public static final int Widget_ImageButton = 16973862; // 0x1030026
field public static final int Widget_ImageWell = 16973861; // 0x1030025
- field public static final deprecated int Widget_KeyboardView = 16973911; // 0x1030057
+ field @Deprecated public static final int Widget_KeyboardView = 16973911; // 0x1030057
field public static final int Widget_ListPopupWindow = 16973957; // 0x1030085
field public static final int Widget_ListView = 16973870; // 0x103002e
field public static final int Widget_ListView_DropDown = 16973872; // 0x1030030
@@ -2795,12 +2796,12 @@ package android.accessibilityservice {
public final class AccessibilityButtonController {
method public boolean isAccessibilityButtonAvailable();
- method public void registerAccessibilityButtonCallback(android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback);
- method public void registerAccessibilityButtonCallback(android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback, android.os.Handler);
- method public void unregisterAccessibilityButtonCallback(android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback);
+ method public void registerAccessibilityButtonCallback(@NonNull android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback);
+ method public void registerAccessibilityButtonCallback(@NonNull android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback, @NonNull android.os.Handler);
+ method public void unregisterAccessibilityButtonCallback(@NonNull android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback);
}
- public static abstract class AccessibilityButtonController.AccessibilityButtonCallback {
+ public abstract static class AccessibilityButtonController.AccessibilityButtonCallback {
ctor public AccessibilityButtonController.AccessibilityButtonCallback();
method public void onAvailabilityChanged(android.accessibilityservice.AccessibilityButtonController, boolean);
method public void onClicked(android.accessibilityservice.AccessibilityButtonController);
@@ -2809,14 +2810,14 @@ package android.accessibilityservice {
public abstract class AccessibilityService extends android.app.Service {
ctor public AccessibilityService();
method public final void disableSelf();
- method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
+ method public final boolean dispatchGesture(@NonNull android.accessibilityservice.GestureDescription, @Nullable android.accessibilityservice.AccessibilityService.GestureResultCallback, @Nullable android.os.Handler);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
- method public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController();
- method public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
- method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
+ method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController();
+ method @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) @NonNull public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
+ method @NonNull public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
- method public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
+ method @NonNull public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
@@ -2851,70 +2852,70 @@ package android.accessibilityservice {
field public static final int GLOBAL_ACTION_RECENTS = 3; // 0x3
field public static final int GLOBAL_ACTION_TAKE_SCREENSHOT = 9; // 0x9
field public static final int GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN = 7; // 0x7
- field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService";
- field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice";
+ field public static final String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService";
+ field public static final String SERVICE_META_DATA = "android.accessibilityservice";
field public static final int SHOW_MODE_AUTO = 0; // 0x0
field public static final int SHOW_MODE_HIDDEN = 1; // 0x1
field public static final int SHOW_MODE_IGNORE_HARD_KEYBOARD = 2; // 0x2
}
- public static abstract class AccessibilityService.GestureResultCallback {
+ public abstract static class AccessibilityService.GestureResultCallback {
ctor public AccessibilityService.GestureResultCallback();
method public void onCancelled(android.accessibilityservice.GestureDescription);
method public void onCompleted(android.accessibilityservice.GestureDescription);
}
public static final class AccessibilityService.MagnificationController {
- method public void addListener(android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener);
- method public void addListener(android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener, android.os.Handler);
+ method public void addListener(@NonNull android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener);
+ method public void addListener(@NonNull android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener, @Nullable android.os.Handler);
method public float getCenterX();
method public float getCenterY();
- method public android.graphics.Region getMagnificationRegion();
+ method @NonNull public android.graphics.Region getMagnificationRegion();
method public float getScale();
- method public boolean removeListener(android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener);
+ method public boolean removeListener(@NonNull android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener);
method public boolean reset(boolean);
method public boolean setCenter(float, float, boolean);
method public boolean setScale(float, boolean);
}
- public static abstract interface AccessibilityService.MagnificationController.OnMagnificationChangedListener {
- method public abstract void onMagnificationChanged(android.accessibilityservice.AccessibilityService.MagnificationController, android.graphics.Region, float, float, float);
+ public static interface AccessibilityService.MagnificationController.OnMagnificationChangedListener {
+ method public void onMagnificationChanged(@NonNull android.accessibilityservice.AccessibilityService.MagnificationController, @NonNull android.graphics.Region, float, float, float);
}
public static final class AccessibilityService.SoftKeyboardController {
- method public void addOnShowModeChangedListener(android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener);
- method public void addOnShowModeChangedListener(android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener, android.os.Handler);
+ method public void addOnShowModeChangedListener(@NonNull android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener);
+ method public void addOnShowModeChangedListener(@NonNull android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener, @Nullable android.os.Handler);
method public int getShowMode();
- method public boolean removeOnShowModeChangedListener(android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener);
+ method public boolean removeOnShowModeChangedListener(@NonNull android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener);
method public boolean setShowMode(int);
}
- public static abstract interface AccessibilityService.SoftKeyboardController.OnShowModeChangedListener {
- method public abstract void onShowModeChanged(android.accessibilityservice.AccessibilityService.SoftKeyboardController, int);
+ public static interface AccessibilityService.SoftKeyboardController.OnShowModeChangedListener {
+ method public void onShowModeChanged(@NonNull android.accessibilityservice.AccessibilityService.SoftKeyboardController, int);
}
public class AccessibilityServiceInfo implements android.os.Parcelable {
ctor public AccessibilityServiceInfo();
- method public static java.lang.String capabilityToString(int);
+ method public static String capabilityToString(int);
method public int describeContents();
- method public static java.lang.String feedbackTypeToString(int);
- method public static java.lang.String flagToString(int);
- method public deprecated boolean getCanRetrieveWindowContent();
+ method public static String feedbackTypeToString(int);
+ method public static String flagToString(int);
+ method @Deprecated public boolean getCanRetrieveWindowContent();
method public int getCapabilities();
- method public deprecated java.lang.String getDescription();
- method public java.lang.String getId();
+ method @Deprecated public String getDescription();
+ method public String getId();
method public int getInteractiveUiTimeoutMillis();
method public int getNonInteractiveUiTimeoutMillis();
method public android.content.pm.ResolveInfo getResolveInfo();
- method public java.lang.String getSettingsActivityName();
- method public java.lang.String loadDescription(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
- method public void setInteractiveUiTimeoutMillis(int);
- method public void setNonInteractiveUiTimeoutMillis(int);
+ method public String getSettingsActivityName();
+ method public String loadDescription(android.content.pm.PackageManager);
+ method public CharSequence loadSummary(android.content.pm.PackageManager);
+ method public void setInteractiveUiTimeoutMillis(@IntRange(from=0) int);
+ method public void setNonInteractiveUiTimeoutMillis(@IntRange(from=0) int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
- field public static final deprecated int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field @Deprecated public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
field public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 8; // 0x8
field public static final int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
@@ -2932,7 +2933,7 @@ package android.accessibilityservice {
field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
field public static final int FLAG_REQUEST_ACCESSIBILITY_BUTTON = 256; // 0x100
- field public static final deprecated int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field @Deprecated public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
field public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 1024; // 0x400
@@ -2942,12 +2943,12 @@ package android.accessibilityservice {
field public int feedbackType;
field public int flags;
field public long notificationTimeout;
- field public java.lang.String[] packageNames;
+ field public String[] packageNames;
}
public final class FingerprintGestureController {
method public boolean isGestureDetectionAvailable();
- method public void registerFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback, android.os.Handler);
+ method public void registerFingerprintGestureCallback(@NonNull android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback, @Nullable android.os.Handler);
method public void unregisterFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback);
field public static final int FINGERPRINT_GESTURE_SWIPE_DOWN = 8; // 0x8
field public static final int FINGERPRINT_GESTURE_SWIPE_LEFT = 2; // 0x2
@@ -2955,7 +2956,7 @@ package android.accessibilityservice {
field public static final int FINGERPRINT_GESTURE_SWIPE_UP = 4; // 0x4
}
- public static abstract class FingerprintGestureController.FingerprintGestureCallback {
+ public abstract static class FingerprintGestureController.FingerprintGestureCallback {
ctor public FingerprintGestureController.FingerprintGestureCallback();
method public void onGestureDetected(int);
method public void onGestureDetectionAvailabilityChanged(boolean);
@@ -2964,19 +2965,19 @@ package android.accessibilityservice {
public final class GestureDescription {
method public static long getMaxGestureDuration();
method public static int getMaxStrokeCount();
- method public android.accessibilityservice.GestureDescription.StrokeDescription getStroke(int);
+ method public android.accessibilityservice.GestureDescription.StrokeDescription getStroke(@IntRange(from=0) int);
method public int getStrokeCount();
}
public static class GestureDescription.Builder {
ctor public GestureDescription.Builder();
- method public android.accessibilityservice.GestureDescription.Builder addStroke(android.accessibilityservice.GestureDescription.StrokeDescription);
+ method public android.accessibilityservice.GestureDescription.Builder addStroke(@NonNull android.accessibilityservice.GestureDescription.StrokeDescription);
method public android.accessibilityservice.GestureDescription build();
}
public static class GestureDescription.StrokeDescription {
- ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long);
- ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, boolean);
+ ctor public GestureDescription.StrokeDescription(@NonNull android.graphics.Path, @IntRange(from=0) long, @IntRange(from=0) long);
+ ctor public GestureDescription.StrokeDescription(@NonNull android.graphics.Path, @IntRange(from=0) long, @IntRange(from=0) long, boolean);
method public android.accessibilityservice.GestureDescription.StrokeDescription continueStroke(android.graphics.Path, long, long, boolean);
method public long getDuration();
method public android.graphics.Path getPath();
@@ -2990,32 +2991,32 @@ package android.accounts {
public abstract class AbstractAccountAuthenticator {
ctor public AbstractAccountAuthenticator(android.content.Context);
- method public abstract android.os.Bundle addAccount(android.accounts.AccountAuthenticatorResponse, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle) throws android.accounts.NetworkErrorException;
+ method public abstract android.os.Bundle addAccount(android.accounts.AccountAuthenticatorResponse, String, String, String[], android.os.Bundle) throws android.accounts.NetworkErrorException;
method public android.os.Bundle addAccountFromCredentials(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, android.os.Bundle) throws android.accounts.NetworkErrorException;
method public abstract android.os.Bundle confirmCredentials(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, android.os.Bundle) throws android.accounts.NetworkErrorException;
- method public abstract android.os.Bundle editProperties(android.accounts.AccountAuthenticatorResponse, java.lang.String);
- method public android.os.Bundle finishSession(android.accounts.AccountAuthenticatorResponse, java.lang.String, android.os.Bundle) throws android.accounts.NetworkErrorException;
+ method public abstract android.os.Bundle editProperties(android.accounts.AccountAuthenticatorResponse, String);
+ method public android.os.Bundle finishSession(android.accounts.AccountAuthenticatorResponse, String, android.os.Bundle) throws android.accounts.NetworkErrorException;
method public android.os.Bundle getAccountCredentialsForCloning(android.accounts.AccountAuthenticatorResponse, android.accounts.Account) throws android.accounts.NetworkErrorException;
method public android.os.Bundle getAccountRemovalAllowed(android.accounts.AccountAuthenticatorResponse, android.accounts.Account) throws android.accounts.NetworkErrorException;
- method public abstract android.os.Bundle getAuthToken(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, java.lang.String, android.os.Bundle) throws android.accounts.NetworkErrorException;
- method public abstract java.lang.String getAuthTokenLabel(java.lang.String);
+ method public abstract android.os.Bundle getAuthToken(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, String, android.os.Bundle) throws android.accounts.NetworkErrorException;
+ method public abstract String getAuthTokenLabel(String);
method public final android.os.IBinder getIBinder();
- method public abstract android.os.Bundle hasFeatures(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, java.lang.String[]) throws android.accounts.NetworkErrorException;
- method public android.os.Bundle isCredentialsUpdateSuggested(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, java.lang.String) throws android.accounts.NetworkErrorException;
- method public android.os.Bundle startAddAccountSession(android.accounts.AccountAuthenticatorResponse, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle) throws android.accounts.NetworkErrorException;
- method public android.os.Bundle startUpdateCredentialsSession(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, java.lang.String, android.os.Bundle) throws android.accounts.NetworkErrorException;
- method public abstract android.os.Bundle updateCredentials(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, java.lang.String, android.os.Bundle) throws android.accounts.NetworkErrorException;
- field public static final java.lang.String KEY_CUSTOM_TOKEN_EXPIRY = "android.accounts.expiry";
+ method public abstract android.os.Bundle hasFeatures(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, String[]) throws android.accounts.NetworkErrorException;
+ method public android.os.Bundle isCredentialsUpdateSuggested(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, String) throws android.accounts.NetworkErrorException;
+ method public android.os.Bundle startAddAccountSession(android.accounts.AccountAuthenticatorResponse, String, String, String[], android.os.Bundle) throws android.accounts.NetworkErrorException;
+ method public android.os.Bundle startUpdateCredentialsSession(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, String, android.os.Bundle) throws android.accounts.NetworkErrorException;
+ method public abstract android.os.Bundle updateCredentials(android.accounts.AccountAuthenticatorResponse, android.accounts.Account, String, android.os.Bundle) throws android.accounts.NetworkErrorException;
+ field public static final String KEY_CUSTOM_TOKEN_EXPIRY = "android.accounts.expiry";
}
public class Account implements android.os.Parcelable {
- ctor public Account(java.lang.String, java.lang.String);
+ ctor public Account(String, String);
ctor public Account(android.os.Parcel);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.accounts.Account> CREATOR;
- field public final java.lang.String name;
- field public final java.lang.String type;
+ field public final String name;
+ field public final String type;
}
public class AccountAuthenticatorActivity extends android.app.Activity {
@@ -3026,7 +3027,7 @@ package android.accounts {
public class AccountAuthenticatorResponse implements android.os.Parcelable {
ctor public AccountAuthenticatorResponse(android.os.Parcel);
method public int describeContents();
- method public void onError(int, java.lang.String);
+ method public void onError(int, String);
method public void onRequestContinued();
method public void onResult(android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
@@ -3034,55 +3035,55 @@ package android.accounts {
}
public class AccountManager {
- method public android.accounts.AccountManagerFuture<android.os.Bundle> addAccount(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public boolean addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle);
- method public boolean addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>);
- method public void addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean);
- method public void addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]);
- method public java.lang.String blockingGetAuthToken(android.accounts.Account, java.lang.String, boolean) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
- method public void clearPassword(android.accounts.Account);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> editProperties(java.lang.String, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> addAccount(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public boolean addAccountExplicitly(android.accounts.Account, String, android.os.Bundle);
+ method public boolean addAccountExplicitly(android.accounts.Account, String, android.os.Bundle, java.util.Map<java.lang.String,java.lang.Integer>);
+ method @RequiresPermission(value="android.permission.GET_ACCOUNTS", apis="..22") public void addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean);
+ method public void addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, String[]);
+ method @RequiresPermission(value="android.permission.USE_CREDENTIALS", apis="..22") public String blockingGetAuthToken(android.accounts.Account, String, boolean) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public void clearPassword(android.accounts.Account);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> editProperties(String, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> finishSession(android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public static android.accounts.AccountManager get(android.content.Context);
- method public int getAccountVisibility(android.accounts.Account, java.lang.String);
- method public android.accounts.Account[] getAccounts();
- method public java.util.Map<android.accounts.Account, java.lang.Integer> getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String);
- method public android.accounts.Account[] getAccountsByType(java.lang.String);
- method public android.accounts.AccountManagerFuture<android.accounts.Account[]> getAccountsByTypeAndFeatures(java.lang.String, java.lang.String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler);
- method public android.accounts.Account[] getAccountsByTypeForPackage(java.lang.String, java.lang.String);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public deprecated android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthTokenByFeatures(java.lang.String, java.lang.String, java.lang.String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public int getAccountVisibility(android.accounts.Account, String);
+ method @NonNull @RequiresPermission(value="android.permission.GET_ACCOUNTS", apis="..22") public android.accounts.Account[] getAccounts();
+ method public java.util.Map<android.accounts.Account,java.lang.Integer> getAccountsAndVisibilityForPackage(String, String);
+ method @NonNull @RequiresPermission(value="android.permission.GET_ACCOUNTS", apis="..22") public android.accounts.Account[] getAccountsByType(String);
+ method public android.accounts.AccountManagerFuture<android.accounts.Account[]> getAccountsByTypeAndFeatures(String, String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler);
+ method @NonNull public android.accounts.Account[] getAccountsByTypeForPackage(String, String);
+ method @RequiresPermission(value="android.permission.USE_CREDENTIALS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @Deprecated @RequiresPermission(value="android.permission.USE_CREDENTIALS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.USE_CREDENTIALS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthTokenByFeatures(String, String, String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AuthenticatorDescription[] getAuthenticatorTypes();
- method public java.util.Map<java.lang.String, java.lang.Integer> getPackagesAndVisibilityForAccount(android.accounts.Account);
- method public java.lang.String getPassword(android.accounts.Account);
- method public java.lang.String getPreviousName(android.accounts.Account);
- method public java.lang.String getUserData(android.accounts.Account, java.lang.String);
- method public android.accounts.AccountManagerFuture<java.lang.Boolean> hasFeatures(android.accounts.Account, java.lang.String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
- method public void invalidateAuthToken(java.lang.String, java.lang.String);
- method public android.accounts.AccountManagerFuture<java.lang.Boolean> isCredentialsUpdateSuggested(android.accounts.Account, java.lang.String, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
- method public static deprecated android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], boolean, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
- method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.List<android.accounts.Account>, java.lang.String[], java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
- method public boolean notifyAccountAuthenticated(android.accounts.Account);
- method public java.lang.String peekAuthToken(android.accounts.Account, java.lang.String);
- method public deprecated android.accounts.AccountManagerFuture<java.lang.Boolean> removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> removeAccount(android.accounts.Account, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public boolean removeAccountExplicitly(android.accounts.Account);
+ method public java.util.Map<java.lang.String,java.lang.Integer> getPackagesAndVisibilityForAccount(android.accounts.Account);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public String getPassword(android.accounts.Account);
+ method public String getPreviousName(android.accounts.Account);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public String getUserData(android.accounts.Account, String);
+ method public android.accounts.AccountManagerFuture<java.lang.Boolean> hasFeatures(android.accounts.Account, String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
+ method @RequiresPermission(anyOf={"android.permission.MANAGE_ACCOUNTS", "android.permission.USE_CREDENTIALS"}, apis="..22") public void invalidateAuthToken(String, String);
+ method public android.accounts.AccountManagerFuture<java.lang.Boolean> isCredentialsUpdateSuggested(android.accounts.Account, String, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
+ method @Deprecated public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, String[], boolean, String, String, String[], android.os.Bundle);
+ method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.List<android.accounts.Account>, String[], String, String, String[], android.os.Bundle);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public boolean notifyAccountAuthenticated(android.accounts.Account);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public String peekAuthToken(android.accounts.Account, String);
+ method @Deprecated @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<java.lang.Boolean> removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> removeAccount(android.accounts.Account, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public boolean removeAccountExplicitly(android.accounts.Account);
method public void removeOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener);
- method public android.accounts.AccountManagerFuture<android.accounts.Account> renameAccount(android.accounts.Account, java.lang.String, android.accounts.AccountManagerCallback<android.accounts.Account>, android.os.Handler);
- method public boolean setAccountVisibility(android.accounts.Account, java.lang.String, int);
- method public void setAuthToken(android.accounts.Account, java.lang.String, java.lang.String);
- method public void setPassword(android.accounts.Account, java.lang.String);
- method public void setUserData(android.accounts.Account, java.lang.String, java.lang.String);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- field public static final java.lang.String ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED";
- field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator";
- field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
- field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator";
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.accounts.Account> renameAccount(android.accounts.Account, @Size(min=1) String, android.accounts.AccountManagerCallback<android.accounts.Account>, android.os.Handler);
+ method public boolean setAccountVisibility(android.accounts.Account, String, int);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public void setAuthToken(android.accounts.Account, String, String);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public void setPassword(android.accounts.Account, String);
+ method @RequiresPermission(value="android.permission.AUTHENTICATE_ACCOUNTS", apis="..22") public void setUserData(android.accounts.Account, String, String);
+ method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(value="android.permission.MANAGE_ACCOUNTS", apis="..22") public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ field public static final String ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED";
+ field public static final String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator";
+ field public static final String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
+ field public static final String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator";
field public static final int ERROR_CODE_BAD_ARGUMENTS = 7; // 0x7
field public static final int ERROR_CODE_BAD_AUTHENTICATION = 9; // 0x9
field public static final int ERROR_CODE_BAD_REQUEST = 8; // 0x8
@@ -3091,30 +3092,30 @@ package android.accounts {
field public static final int ERROR_CODE_NETWORK_ERROR = 3; // 0x3
field public static final int ERROR_CODE_REMOTE_EXCEPTION = 1; // 0x1
field public static final int ERROR_CODE_UNSUPPORTED_OPERATION = 6; // 0x6
- field public static final java.lang.String KEY_ACCOUNTS = "accounts";
- field public static final java.lang.String KEY_ACCOUNT_AUTHENTICATOR_RESPONSE = "accountAuthenticatorResponse";
- field public static final java.lang.String KEY_ACCOUNT_MANAGER_RESPONSE = "accountManagerResponse";
- field public static final java.lang.String KEY_ACCOUNT_NAME = "authAccount";
- field public static final java.lang.String KEY_ACCOUNT_SESSION_BUNDLE = "accountSessionBundle";
- field public static final java.lang.String KEY_ACCOUNT_STATUS_TOKEN = "accountStatusToken";
- field public static final java.lang.String KEY_ACCOUNT_TYPE = "accountType";
- field public static final java.lang.String KEY_ANDROID_PACKAGE_NAME = "androidPackageName";
- field public static final java.lang.String KEY_AUTHENTICATOR_TYPES = "authenticator_types";
- field public static final java.lang.String KEY_AUTHTOKEN = "authtoken";
- field public static final java.lang.String KEY_AUTH_FAILED_MESSAGE = "authFailedMessage";
- field public static final java.lang.String KEY_AUTH_TOKEN_LABEL = "authTokenLabelKey";
- field public static final java.lang.String KEY_BOOLEAN_RESULT = "booleanResult";
- field public static final java.lang.String KEY_CALLER_PID = "callerPid";
- field public static final java.lang.String KEY_CALLER_UID = "callerUid";
- field public static final java.lang.String KEY_ERROR_CODE = "errorCode";
- field public static final java.lang.String KEY_ERROR_MESSAGE = "errorMessage";
- field public static final java.lang.String KEY_INTENT = "intent";
- field public static final java.lang.String KEY_LAST_AUTHENTICATED_TIME = "lastAuthenticatedTime";
- field public static final java.lang.String KEY_PASSWORD = "password";
- field public static final java.lang.String KEY_USERDATA = "userdata";
- field public static final deprecated java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android:accounts:key_legacy_not_visible";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android:accounts:key_legacy_visible";
+ field public static final String KEY_ACCOUNTS = "accounts";
+ field public static final String KEY_ACCOUNT_AUTHENTICATOR_RESPONSE = "accountAuthenticatorResponse";
+ field public static final String KEY_ACCOUNT_MANAGER_RESPONSE = "accountManagerResponse";
+ field public static final String KEY_ACCOUNT_NAME = "authAccount";
+ field public static final String KEY_ACCOUNT_SESSION_BUNDLE = "accountSessionBundle";
+ field public static final String KEY_ACCOUNT_STATUS_TOKEN = "accountStatusToken";
+ field public static final String KEY_ACCOUNT_TYPE = "accountType";
+ field public static final String KEY_ANDROID_PACKAGE_NAME = "androidPackageName";
+ field public static final String KEY_AUTHENTICATOR_TYPES = "authenticator_types";
+ field public static final String KEY_AUTHTOKEN = "authtoken";
+ field public static final String KEY_AUTH_FAILED_MESSAGE = "authFailedMessage";
+ field public static final String KEY_AUTH_TOKEN_LABEL = "authTokenLabelKey";
+ field public static final String KEY_BOOLEAN_RESULT = "booleanResult";
+ field public static final String KEY_CALLER_PID = "callerPid";
+ field public static final String KEY_CALLER_UID = "callerUid";
+ field public static final String KEY_ERROR_CODE = "errorCode";
+ field public static final String KEY_ERROR_MESSAGE = "errorMessage";
+ field public static final String KEY_INTENT = "intent";
+ field public static final String KEY_LAST_AUTHENTICATED_TIME = "lastAuthenticatedTime";
+ field public static final String KEY_PASSWORD = "password";
+ field public static final String KEY_USERDATA = "userdata";
+ field @Deprecated public static final String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
+ field public static final String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android:accounts:key_legacy_not_visible";
+ field public static final String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android:accounts:key_legacy_visible";
field public static final int VISIBILITY_NOT_VISIBLE = 3; // 0x3
field public static final int VISIBILITY_UNDEFINED = 0; // 0x0
field public static final int VISIBILITY_USER_MANAGED_NOT_VISIBLE = 4; // 0x4
@@ -3122,64 +3123,64 @@ package android.accounts {
field public static final int VISIBILITY_VISIBLE = 1; // 0x1
}
- public abstract interface AccountManagerCallback<V> {
- method public abstract void run(android.accounts.AccountManagerFuture<V>);
+ public interface AccountManagerCallback<V> {
+ method public void run(android.accounts.AccountManagerFuture<V>);
}
- public abstract interface AccountManagerFuture<V> {
- method public abstract boolean cancel(boolean);
- method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
- method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
- method public abstract boolean isCancelled();
- method public abstract boolean isDone();
+ public interface AccountManagerFuture<V> {
+ method public boolean cancel(boolean);
+ method public V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
+ method public V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
+ method public boolean isCancelled();
+ method public boolean isDone();
}
public class AccountsException extends java.lang.Exception {
ctor public AccountsException();
- ctor public AccountsException(java.lang.String);
- ctor public AccountsException(java.lang.String, java.lang.Throwable);
- ctor public AccountsException(java.lang.Throwable);
+ ctor public AccountsException(String);
+ ctor public AccountsException(String, Throwable);
+ ctor public AccountsException(Throwable);
}
public class AuthenticatorDescription implements android.os.Parcelable {
- ctor public AuthenticatorDescription(java.lang.String, java.lang.String, int, int, int, int, boolean);
- ctor public AuthenticatorDescription(java.lang.String, java.lang.String, int, int, int, int);
+ ctor public AuthenticatorDescription(String, String, int, int, int, int, boolean);
+ ctor public AuthenticatorDescription(String, String, int, int, int, int);
method public int describeContents();
- method public static android.accounts.AuthenticatorDescription newKey(java.lang.String);
+ method public static android.accounts.AuthenticatorDescription newKey(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.accounts.AuthenticatorDescription> CREATOR;
field public final int accountPreferencesId;
field public final boolean customTokens;
field public final int iconId;
field public final int labelId;
- field public final java.lang.String packageName;
+ field public final String packageName;
field public final int smallIconId;
- field public final java.lang.String type;
+ field public final String type;
}
public class AuthenticatorException extends android.accounts.AccountsException {
ctor public AuthenticatorException();
- ctor public AuthenticatorException(java.lang.String);
- ctor public AuthenticatorException(java.lang.String, java.lang.Throwable);
- ctor public AuthenticatorException(java.lang.Throwable);
+ ctor public AuthenticatorException(String);
+ ctor public AuthenticatorException(String, Throwable);
+ ctor public AuthenticatorException(Throwable);
}
public class NetworkErrorException extends android.accounts.AccountsException {
ctor public NetworkErrorException();
- ctor public NetworkErrorException(java.lang.String);
- ctor public NetworkErrorException(java.lang.String, java.lang.Throwable);
- ctor public NetworkErrorException(java.lang.Throwable);
+ ctor public NetworkErrorException(String);
+ ctor public NetworkErrorException(String, Throwable);
+ ctor public NetworkErrorException(Throwable);
}
- public abstract interface OnAccountsUpdateListener {
- method public abstract void onAccountsUpdated(android.accounts.Account[]);
+ public interface OnAccountsUpdateListener {
+ method public void onAccountsUpdated(android.accounts.Account[]);
}
public class OperationCanceledException extends android.accounts.AccountsException {
ctor public OperationCanceledException();
- ctor public OperationCanceledException(java.lang.String);
- ctor public OperationCanceledException(java.lang.String, java.lang.Throwable);
- ctor public OperationCanceledException(java.lang.Throwable);
+ ctor public OperationCanceledException(String);
+ ctor public OperationCanceledException(String, Throwable);
+ ctor public OperationCanceledException(Throwable);
}
}
@@ -3209,30 +3210,30 @@ package android.animation {
method public abstract android.animation.Animator setDuration(long);
method public abstract void setInterpolator(android.animation.TimeInterpolator);
method public abstract void setStartDelay(long);
- method public void setTarget(java.lang.Object);
+ method public void setTarget(@Nullable Object);
method public void setupEndValues();
method public void setupStartValues();
method public void start();
field public static final long DURATION_INFINITE = -1L; // 0xffffffffffffffffL
}
- public static abstract interface Animator.AnimatorListener {
- method public abstract void onAnimationCancel(android.animation.Animator);
+ public static interface Animator.AnimatorListener {
+ method public void onAnimationCancel(android.animation.Animator);
method public default void onAnimationEnd(android.animation.Animator, boolean);
- method public abstract void onAnimationEnd(android.animation.Animator);
- method public abstract void onAnimationRepeat(android.animation.Animator);
+ method public void onAnimationEnd(android.animation.Animator);
+ method public void onAnimationRepeat(android.animation.Animator);
method public default void onAnimationStart(android.animation.Animator, boolean);
- method public abstract void onAnimationStart(android.animation.Animator);
+ method public void onAnimationStart(android.animation.Animator);
}
- public static abstract interface Animator.AnimatorPauseListener {
- method public abstract void onAnimationPause(android.animation.Animator);
- method public abstract void onAnimationResume(android.animation.Animator);
+ public static interface Animator.AnimatorPauseListener {
+ method public void onAnimationPause(android.animation.Animator);
+ method public void onAnimationResume(android.animation.Animator);
}
public class AnimatorInflater {
ctor public AnimatorInflater();
- method public static android.animation.Animator loadAnimator(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+ method public static android.animation.Animator loadAnimator(android.content.Context, @AnimatorRes int) throws android.content.res.Resources.NotFoundException;
method public static android.animation.StateListAnimator loadStateListAnimator(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
}
@@ -3275,35 +3276,35 @@ package android.animation {
public class ArgbEvaluator implements android.animation.TypeEvaluator {
ctor public ArgbEvaluator();
- method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
+ method public Object evaluate(float, Object, Object);
}
- public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter {
- ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>);
+ public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter<T,V> {
+ ctor public BidirectionalTypeConverter(Class<T>, Class<V>);
method public abstract T convertBack(V);
- method public android.animation.BidirectionalTypeConverter<V, T> invert();
+ method public android.animation.BidirectionalTypeConverter<V,T> invert();
}
- public class FloatArrayEvaluator implements android.animation.TypeEvaluator {
+ public class FloatArrayEvaluator implements android.animation.TypeEvaluator<float[]> {
ctor public FloatArrayEvaluator();
ctor public FloatArrayEvaluator(float[]);
method public float[] evaluate(float, float[], float[]);
}
- public class FloatEvaluator implements android.animation.TypeEvaluator {
+ public class FloatEvaluator implements android.animation.TypeEvaluator<java.lang.Number> {
ctor public FloatEvaluator();
- method public java.lang.Float evaluate(float, java.lang.Number, java.lang.Number);
+ method public Float evaluate(float, Number, Number);
}
- public class IntArrayEvaluator implements android.animation.TypeEvaluator {
+ public class IntArrayEvaluator implements android.animation.TypeEvaluator<int[]> {
ctor public IntArrayEvaluator();
ctor public IntArrayEvaluator(int[]);
method public int[] evaluate(float, int[], int[]);
}
- public class IntEvaluator implements android.animation.TypeEvaluator {
+ public class IntEvaluator implements android.animation.TypeEvaluator<java.lang.Integer> {
ctor public IntEvaluator();
- method public java.lang.Integer evaluate(float, java.lang.Integer, java.lang.Integer);
+ method public Integer evaluate(float, Integer, Integer);
}
public abstract class Keyframe implements java.lang.Cloneable {
@@ -3311,18 +3312,18 @@ package android.animation {
method public abstract android.animation.Keyframe clone();
method public float getFraction();
method public android.animation.TimeInterpolator getInterpolator();
- method public java.lang.Class getType();
- method public abstract java.lang.Object getValue();
+ method public Class getType();
+ method public abstract Object getValue();
method public boolean hasValue();
method public static android.animation.Keyframe ofFloat(float, float);
method public static android.animation.Keyframe ofFloat(float);
method public static android.animation.Keyframe ofInt(float, int);
method public static android.animation.Keyframe ofInt(float);
- method public static android.animation.Keyframe ofObject(float, java.lang.Object);
+ method public static android.animation.Keyframe ofObject(float, Object);
method public static android.animation.Keyframe ofObject(float);
method public void setFraction(float);
method public void setInterpolator(android.animation.TimeInterpolator);
- method public abstract void setValue(java.lang.Object);
+ method public abstract void setValue(Object);
}
public class LayoutTransition {
@@ -3337,7 +3338,7 @@ package android.animation {
method public long getStagger(int);
method public long getStartDelay(int);
method public java.util.List<android.animation.LayoutTransition.TransitionListener> getTransitionListeners();
- method public deprecated void hideChild(android.view.ViewGroup, android.view.View);
+ method @Deprecated public void hideChild(android.view.ViewGroup, android.view.View);
method public void hideChild(android.view.ViewGroup, android.view.View, int);
method public boolean isChangingLayout();
method public boolean isRunning();
@@ -3351,7 +3352,7 @@ package android.animation {
method public void setInterpolator(int, android.animation.TimeInterpolator);
method public void setStagger(int, long);
method public void setStartDelay(int, long);
- method public deprecated void showChild(android.view.ViewGroup, android.view.View);
+ method @Deprecated public void showChild(android.view.ViewGroup, android.view.View);
method public void showChild(android.view.ViewGroup, android.view.View, int);
field public static final int APPEARING = 2; // 0x2
field public static final int CHANGE_APPEARING = 0; // 0x0
@@ -3360,45 +3361,45 @@ package android.animation {
field public static final int DISAPPEARING = 3; // 0x3
}
- public static abstract interface LayoutTransition.TransitionListener {
- method public abstract void endTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
- method public abstract void startTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
+ public static interface LayoutTransition.TransitionListener {
+ method public void endTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
+ method public void startTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
}
public final class ObjectAnimator extends android.animation.ValueAnimator {
ctor public ObjectAnimator();
method public android.animation.ObjectAnimator clone();
- method public java.lang.String getPropertyName();
- method public java.lang.Object getTarget();
- method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
- method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
- method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
- method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
- method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
- method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
- method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
- method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
- method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
- method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
- method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]);
- method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path);
- method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
- method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]);
- method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path);
- method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
- method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
- method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
- method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
- method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
- method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
- method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
+ method @Nullable public String getPropertyName();
+ method @Nullable public Object getTarget();
+ method public static android.animation.ObjectAnimator ofArgb(Object, String, int...);
+ method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T,java.lang.Integer>, int...);
+ method public static android.animation.ObjectAnimator ofFloat(Object, String, float...);
+ method public static android.animation.ObjectAnimator ofFloat(Object, String, String, android.graphics.Path);
+ method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T,java.lang.Float>, float...);
+ method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T,java.lang.Float>, android.util.Property<T,java.lang.Float>, android.graphics.Path);
+ method public static android.animation.ObjectAnimator ofInt(Object, String, int...);
+ method public static android.animation.ObjectAnimator ofInt(Object, String, String, android.graphics.Path);
+ method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T,java.lang.Integer>, int...);
+ method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T,java.lang.Integer>, android.util.Property<T,java.lang.Integer>, android.graphics.Path);
+ method public static android.animation.ObjectAnimator ofMultiFloat(Object, String, float[][]);
+ method public static android.animation.ObjectAnimator ofMultiFloat(Object, String, android.graphics.Path);
+ method @java.lang.SafeVarargs public static <T> android.animation.ObjectAnimator ofMultiFloat(Object, String, android.animation.TypeConverter<T,float[]>, android.animation.TypeEvaluator<T>, T...);
+ method public static android.animation.ObjectAnimator ofMultiInt(Object, String, int[][]);
+ method public static android.animation.ObjectAnimator ofMultiInt(Object, String, android.graphics.Path);
+ method @java.lang.SafeVarargs public static <T> android.animation.ObjectAnimator ofMultiInt(Object, String, android.animation.TypeConverter<T,int[]>, android.animation.TypeEvaluator<T>, T...);
+ method public static android.animation.ObjectAnimator ofObject(Object, String, android.animation.TypeEvaluator, java.lang.Object...);
+ method @NonNull public static android.animation.ObjectAnimator ofObject(Object, String, @Nullable android.animation.TypeConverter<android.graphics.PointF,?>, android.graphics.Path);
+ method @NonNull @java.lang.SafeVarargs public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T,V>, android.animation.TypeEvaluator<V>, V...);
+ method @NonNull @java.lang.SafeVarargs public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T,P>, android.animation.TypeConverter<V,P>, android.animation.TypeEvaluator<V>, V...);
+ method @NonNull public static <T, V> android.animation.ObjectAnimator ofObject(T, @NonNull android.util.Property<T,V>, @Nullable android.animation.TypeConverter<android.graphics.PointF,V>, android.graphics.Path);
+ method @NonNull public static android.animation.ObjectAnimator ofPropertyValuesHolder(Object, android.animation.PropertyValuesHolder...);
method public void setAutoCancel(boolean);
- method public android.animation.ObjectAnimator setDuration(long);
- method public void setProperty(android.util.Property);
- method public void setPropertyName(java.lang.String);
+ method @NonNull public android.animation.ObjectAnimator setDuration(long);
+ method public void setProperty(@NonNull android.util.Property);
+ method public void setPropertyName(@NonNull String);
}
- public class PointFEvaluator implements android.animation.TypeEvaluator {
+ public class PointFEvaluator implements android.animation.TypeEvaluator<android.graphics.PointF> {
ctor public PointFEvaluator();
ctor public PointFEvaluator(android.graphics.PointF);
method public android.graphics.PointF evaluate(float, android.graphics.PointF, android.graphics.PointF);
@@ -3406,26 +3407,26 @@ package android.animation {
public class PropertyValuesHolder implements java.lang.Cloneable {
method public android.animation.PropertyValuesHolder clone();
- method public java.lang.String getPropertyName();
- method public static android.animation.PropertyValuesHolder ofFloat(java.lang.String, float...);
- method public static android.animation.PropertyValuesHolder ofFloat(android.util.Property<?, java.lang.Float>, float...);
- method public static android.animation.PropertyValuesHolder ofInt(java.lang.String, int...);
- method public static android.animation.PropertyValuesHolder ofInt(android.util.Property<?, java.lang.Integer>, int...);
- method public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe...);
+ method public String getPropertyName();
+ method public static android.animation.PropertyValuesHolder ofFloat(String, float...);
+ method public static android.animation.PropertyValuesHolder ofFloat(android.util.Property<?,java.lang.Float>, float...);
+ method public static android.animation.PropertyValuesHolder ofInt(String, int...);
+ method public static android.animation.PropertyValuesHolder ofInt(android.util.Property<?,java.lang.Integer>, int...);
+ method public static android.animation.PropertyValuesHolder ofKeyframe(String, android.animation.Keyframe...);
method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
- method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
- method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
- method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
- method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
- method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
- method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
- method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
- method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
- method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
- method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
- method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
- method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
- method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+ method public static android.animation.PropertyValuesHolder ofMultiFloat(String, float[][]);
+ method public static android.animation.PropertyValuesHolder ofMultiFloat(String, android.graphics.Path);
+ method @java.lang.SafeVarargs public static <V> android.animation.PropertyValuesHolder ofMultiFloat(String, android.animation.TypeConverter<V,float[]>, android.animation.TypeEvaluator<V>, V...);
+ method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(String, android.animation.TypeConverter<T,float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+ method public static android.animation.PropertyValuesHolder ofMultiInt(String, int[][]);
+ method public static android.animation.PropertyValuesHolder ofMultiInt(String, android.graphics.Path);
+ method @java.lang.SafeVarargs public static <V> android.animation.PropertyValuesHolder ofMultiInt(String, android.animation.TypeConverter<V,int[]>, android.animation.TypeEvaluator<V>, V...);
+ method public static <T> android.animation.PropertyValuesHolder ofMultiInt(String, android.animation.TypeConverter<T,int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+ method public static android.animation.PropertyValuesHolder ofObject(String, android.animation.TypeEvaluator, java.lang.Object...);
+ method public static android.animation.PropertyValuesHolder ofObject(String, android.animation.TypeConverter<android.graphics.PointF,?>, android.graphics.Path);
+ method @java.lang.SafeVarargs public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
+ method @java.lang.SafeVarargs public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?,V>, android.animation.TypeConverter<T,V>, android.animation.TypeEvaluator<T>, T...);
+ method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?,V>, android.animation.TypeConverter<android.graphics.PointF,V>, android.graphics.Path);
method public void setConverter(android.animation.TypeConverter);
method public void setEvaluator(android.animation.TypeEvaluator);
method public void setFloatValues(float...);
@@ -3433,10 +3434,10 @@ package android.animation {
method public void setKeyframes(android.animation.Keyframe...);
method public void setObjectValues(java.lang.Object...);
method public void setProperty(android.util.Property);
- method public void setPropertyName(java.lang.String);
+ method public void setPropertyName(String);
}
- public class RectEvaluator implements android.animation.TypeEvaluator {
+ public class RectEvaluator implements android.animation.TypeEvaluator<android.graphics.Rect> {
ctor public RectEvaluator();
ctor public RectEvaluator(android.graphics.Rect);
method public android.graphics.Rect evaluate(float, android.graphics.Rect, android.graphics.Rect);
@@ -3454,21 +3455,21 @@ package android.animation {
method public void setTimeListener(android.animation.TimeAnimator.TimeListener);
}
- public static abstract interface TimeAnimator.TimeListener {
- method public abstract void onTimeUpdate(android.animation.TimeAnimator, long, long);
+ public static interface TimeAnimator.TimeListener {
+ method public void onTimeUpdate(android.animation.TimeAnimator, long, long);
}
- public abstract interface TimeInterpolator {
- method public abstract float getInterpolation(float);
+ public interface TimeInterpolator {
+ method public float getInterpolation(float);
}
public abstract class TypeConverter<T, V> {
- ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>);
+ ctor public TypeConverter(Class<T>, Class<V>);
method public abstract V convert(T);
}
- public abstract interface TypeEvaluator<T> {
- method public abstract T evaluate(float, T, T);
+ public interface TypeEvaluator<T> {
+ method public T evaluate(float, T, T);
}
public class ValueAnimator extends android.animation.Animator {
@@ -3477,8 +3478,8 @@ package android.animation {
method public static boolean areAnimatorsEnabled();
method public android.animation.ValueAnimator clone();
method public float getAnimatedFraction();
- method public java.lang.Object getAnimatedValue();
- method public java.lang.Object getAnimatedValue(java.lang.String);
+ method public Object getAnimatedValue();
+ method public Object getAnimatedValue(String);
method public long getCurrentPlayTime();
method public long getDuration();
method public static long getFrameDelay();
@@ -3513,18 +3514,20 @@ package android.animation {
field public static final int REVERSE = 2; // 0x2
}
- public static abstract interface ValueAnimator.AnimatorUpdateListener {
- method public abstract void onAnimationUpdate(android.animation.ValueAnimator);
+ public static interface ValueAnimator.AnimatorUpdateListener {
+ method public void onAnimationUpdate(android.animation.ValueAnimator);
}
}
package android.annotation {
- public abstract class SuppressLint implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SuppressLint {
+ method public abstract String[] value();
}
- public abstract class TargetApi implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TargetApi {
+ method public abstract int value();
}
}
@@ -3534,37 +3537,37 @@ package android.app {
public abstract class ActionBar {
ctor public ActionBar();
method public abstract void addOnMenuVisibilityListener(android.app.ActionBar.OnMenuVisibilityListener);
- method public abstract deprecated void addTab(android.app.ActionBar.Tab);
- method public abstract deprecated void addTab(android.app.ActionBar.Tab, boolean);
- method public abstract deprecated void addTab(android.app.ActionBar.Tab, int);
- method public abstract deprecated void addTab(android.app.ActionBar.Tab, int, boolean);
+ method @Deprecated public abstract void addTab(android.app.ActionBar.Tab);
+ method @Deprecated public abstract void addTab(android.app.ActionBar.Tab, boolean);
+ method @Deprecated public abstract void addTab(android.app.ActionBar.Tab, int);
+ method @Deprecated public abstract void addTab(android.app.ActionBar.Tab, int, boolean);
method public abstract android.view.View getCustomView();
method public abstract int getDisplayOptions();
method public float getElevation();
method public abstract int getHeight();
method public int getHideOffset();
- method public abstract deprecated int getNavigationItemCount();
- method public abstract deprecated int getNavigationMode();
- method public abstract deprecated int getSelectedNavigationIndex();
- method public abstract deprecated android.app.ActionBar.Tab getSelectedTab();
- method public abstract java.lang.CharSequence getSubtitle();
- method public abstract deprecated android.app.ActionBar.Tab getTabAt(int);
- method public abstract deprecated int getTabCount();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract android.app.ActionBar.Tab getSelectedTab();
+ method public abstract CharSequence getSubtitle();
+ method @Deprecated public abstract android.app.ActionBar.Tab getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
method public android.content.Context getThemedContext();
- method public abstract java.lang.CharSequence getTitle();
+ method public abstract CharSequence getTitle();
method public abstract void hide();
method public boolean isHideOnContentScrollEnabled();
method public abstract boolean isShowing();
- method public abstract deprecated android.app.ActionBar.Tab newTab();
- method public abstract deprecated void removeAllTabs();
+ method @Deprecated public abstract android.app.ActionBar.Tab newTab();
+ method @Deprecated public abstract void removeAllTabs();
method public abstract void removeOnMenuVisibilityListener(android.app.ActionBar.OnMenuVisibilityListener);
- method public abstract deprecated void removeTab(android.app.ActionBar.Tab);
- method public abstract deprecated void removeTabAt(int);
- method public abstract deprecated void selectTab(android.app.ActionBar.Tab);
- method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method @Deprecated public abstract void removeTab(android.app.ActionBar.Tab);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(android.app.ActionBar.Tab);
+ method public abstract void setBackgroundDrawable(@Nullable android.graphics.drawable.Drawable);
method public abstract void setCustomView(android.view.View);
method public abstract void setCustomView(android.view.View, android.app.ActionBar.LayoutParams);
- method public abstract void setCustomView(int);
+ method public abstract void setCustomView(@LayoutRes int);
method public abstract void setDisplayHomeAsUpEnabled(boolean);
method public abstract void setDisplayOptions(int);
method public abstract void setDisplayOptions(int, int);
@@ -3575,79 +3578,79 @@ package android.app {
method public void setElevation(float);
method public void setHideOffset(int);
method public void setHideOnContentScrollEnabled(boolean);
- method public void setHomeActionContentDescription(java.lang.CharSequence);
- method public void setHomeActionContentDescription(int);
+ method public void setHomeActionContentDescription(CharSequence);
+ method public void setHomeActionContentDescription(@StringRes int);
method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
- method public void setHomeAsUpIndicator(int);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
method public void setHomeButtonEnabled(boolean);
- method public abstract void setIcon(int);
+ method public abstract void setIcon(@DrawableRes int);
method public abstract void setIcon(android.graphics.drawable.Drawable);
- method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar.OnNavigationListener);
- method public abstract void setLogo(int);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar.OnNavigationListener);
+ method public abstract void setLogo(@DrawableRes int);
method public abstract void setLogo(android.graphics.drawable.Drawable);
- method public abstract deprecated void setNavigationMode(int);
- method public abstract deprecated void setSelectedNavigationItem(int);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
- method public abstract void setSubtitle(java.lang.CharSequence);
- method public abstract void setSubtitle(int);
- method public abstract void setTitle(java.lang.CharSequence);
- method public abstract void setTitle(int);
+ method public abstract void setSubtitle(CharSequence);
+ method public abstract void setSubtitle(@StringRes int);
+ method public abstract void setTitle(CharSequence);
+ method public abstract void setTitle(@StringRes int);
method public abstract void show();
field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
field public static final int DISPLAY_USE_LOGO = 1; // 0x1
- field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
- field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
- field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
}
public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
- ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor public ActionBar.LayoutParams(@NonNull android.content.Context, android.util.AttributeSet);
ctor public ActionBar.LayoutParams(int, int);
ctor public ActionBar.LayoutParams(int, int, int);
ctor public ActionBar.LayoutParams(int);
ctor public ActionBar.LayoutParams(android.app.ActionBar.LayoutParams);
ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
- field public int gravity;
+ field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity;
}
- public static abstract interface ActionBar.OnMenuVisibilityListener {
- method public abstract void onMenuVisibilityChanged(boolean);
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
}
- public static abstract deprecated interface ActionBar.OnNavigationListener {
- method public abstract boolean onNavigationItemSelected(int, long);
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
}
- public static abstract deprecated class ActionBar.Tab {
- ctor public ActionBar.Tab();
- method public abstract java.lang.CharSequence getContentDescription();
- method public abstract android.view.View getCustomView();
- method public abstract android.graphics.drawable.Drawable getIcon();
- method public abstract int getPosition();
- method public abstract java.lang.Object getTag();
- method public abstract java.lang.CharSequence getText();
- method public abstract void select();
- method public abstract android.app.ActionBar.Tab setContentDescription(int);
- method public abstract android.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
- method public abstract android.app.ActionBar.Tab setCustomView(android.view.View);
- method public abstract android.app.ActionBar.Tab setCustomView(int);
- method public abstract android.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
- method public abstract android.app.ActionBar.Tab setIcon(int);
- method public abstract android.app.ActionBar.Tab setTabListener(android.app.ActionBar.TabListener);
- method public abstract android.app.ActionBar.Tab setTag(java.lang.Object);
- method public abstract android.app.ActionBar.Tab setText(java.lang.CharSequence);
- method public abstract android.app.ActionBar.Tab setText(int);
- field public static final int INVALID_POSITION = -1; // 0xffffffff
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence getContentDescription();
+ method @Deprecated public abstract android.view.View getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object getTag();
+ method @Deprecated public abstract CharSequence getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract android.app.ActionBar.Tab setContentDescription(@StringRes int);
+ method @Deprecated public abstract android.app.ActionBar.Tab setContentDescription(CharSequence);
+ method @Deprecated public abstract android.app.ActionBar.Tab setCustomView(android.view.View);
+ method @Deprecated public abstract android.app.ActionBar.Tab setCustomView(@LayoutRes int);
+ method @Deprecated public abstract android.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
+ method @Deprecated public abstract android.app.ActionBar.Tab setIcon(@DrawableRes int);
+ method @Deprecated public abstract android.app.ActionBar.Tab setTabListener(android.app.ActionBar.TabListener);
+ method @Deprecated public abstract android.app.ActionBar.Tab setTag(Object);
+ method @Deprecated public abstract android.app.ActionBar.Tab setText(CharSequence);
+ method @Deprecated public abstract android.app.ActionBar.Tab setText(@StringRes int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
}
- public static abstract deprecated interface ActionBar.TabListener {
- method public abstract void onTabReselected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
- method public abstract void onTabSelected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
- method public abstract void onTabUnselected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
+ method @Deprecated public void onTabSelected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
+ method @Deprecated public void onTabUnselected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
}
public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
@@ -3655,8 +3658,8 @@ package android.app {
method public void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public void closeContextMenu();
method public void closeOptionsMenu();
- method public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
- method public final deprecated void dismissDialog(int);
+ method public android.app.PendingIntent createPendingResult(int, @NonNull android.content.Intent, int);
+ method @Deprecated public final void dismissDialog(int);
method public final void dismissKeyboardShortcutsHelper();
method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
method public boolean dispatchKeyEvent(android.view.KeyEvent);
@@ -3664,43 +3667,43 @@ package android.app {
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
- method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public deprecated void enterPictureInPictureMode();
- method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
- method public <T extends android.view.View> T findViewById(int);
+ method public void dump(@NonNull String, @Nullable java.io.FileDescriptor, @NonNull java.io.PrintWriter, @Nullable String[]);
+ method @Deprecated public void enterPictureInPictureMode();
+ method public boolean enterPictureInPictureMode(@NonNull android.app.PictureInPictureParams);
+ method public <T extends android.view.View> T findViewById(@IdRes int);
method public void finish();
method public void finishActivity(int);
- method public void finishActivityFromChild(android.app.Activity, int);
+ method public void finishActivityFromChild(@NonNull android.app.Activity, int);
method public void finishAffinity();
method public void finishAfterTransition();
method public void finishAndRemoveTask();
method public void finishFromChild(android.app.Activity);
- method public android.app.ActionBar getActionBar();
+ method @Nullable public android.app.ActionBar getActionBar();
method public final android.app.Application getApplication();
- method public android.content.ComponentName getCallingActivity();
- method public java.lang.String getCallingPackage();
+ method @Nullable public android.content.ComponentName getCallingActivity();
+ method @Nullable public String getCallingPackage();
method public int getChangingConfigurations();
method public android.content.ComponentName getComponentName();
method public android.transition.Scene getContentScene();
method public android.transition.TransitionManager getContentTransitionManager();
- method public android.view.View getCurrentFocus();
- method public deprecated android.app.FragmentManager getFragmentManager();
+ method @Nullable public android.view.View getCurrentFocus();
+ method @Deprecated public android.app.FragmentManager getFragmentManager();
method public android.content.Intent getIntent();
- method public java.lang.Object getLastNonConfigurationInstance();
- method public android.view.LayoutInflater getLayoutInflater();
- method public deprecated android.app.LoaderManager getLoaderManager();
- method public java.lang.String getLocalClassName();
+ method @Nullable public Object getLastNonConfigurationInstance();
+ method @NonNull public android.view.LayoutInflater getLayoutInflater();
+ method @Deprecated public android.app.LoaderManager getLoaderManager();
+ method @NonNull public String getLocalClassName();
method public int getMaxNumPictureInPictureActions();
method public final android.media.session.MediaController getMediaController();
- method public android.view.MenuInflater getMenuInflater();
+ method @NonNull public android.view.MenuInflater getMenuInflater();
method public final android.app.Activity getParent();
- method public android.content.Intent getParentActivityIntent();
+ method @Nullable public android.content.Intent getParentActivityIntent();
method public android.content.SharedPreferences getPreferences(int);
- method public android.net.Uri getReferrer();
+ method @Nullable public android.net.Uri getReferrer();
method public int getRequestedOrientation();
method public final android.view.SearchEvent getSearchEvent();
method public int getTaskId();
- method public final java.lang.CharSequence getTitle();
+ method public final CharSequence getTitle();
method public final int getTitleColor();
method public android.app.VoiceInteractor getVoiceInteractor();
method public final int getVolumeControlStream();
@@ -3720,36 +3723,36 @@ package android.app {
method public boolean isTaskRoot();
method public boolean isVoiceInteraction();
method public boolean isVoiceInteractionRoot();
- method public final deprecated android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+ method @Deprecated public final android.database.Cursor managedQuery(android.net.Uri, String[], String, String[], String);
method public boolean moveTaskToBack(boolean);
method public boolean navigateUpTo(android.content.Intent);
method public boolean navigateUpToFromChild(android.app.Activity, android.content.Intent);
- method public void onActionModeFinished(android.view.ActionMode);
- method public void onActionModeStarted(android.view.ActionMode);
+ method @CallSuper public void onActionModeFinished(android.view.ActionMode);
+ method @CallSuper public void onActionModeStarted(android.view.ActionMode);
method public void onActivityReenter(int, android.content.Intent);
method protected void onActivityResult(int, int, android.content.Intent);
- method public deprecated void onAttachFragment(android.app.Fragment);
+ method @Deprecated public void onAttachFragment(android.app.Fragment);
method public void onAttachedToWindow();
method public void onBackPressed();
- method protected void onChildTitleChanged(android.app.Activity, java.lang.CharSequence);
- method public void onConfigurationChanged(android.content.res.Configuration);
+ method protected void onChildTitleChanged(android.app.Activity, CharSequence);
+ method public void onConfigurationChanged(@NonNull android.content.res.Configuration);
method public void onContentChanged();
- method public boolean onContextItemSelected(android.view.MenuItem);
- method public void onContextMenuClosed(android.view.Menu);
- method protected void onCreate(android.os.Bundle);
- method public void onCreate(android.os.Bundle, android.os.PersistableBundle);
+ method public boolean onContextItemSelected(@NonNull android.view.MenuItem);
+ method public void onContextMenuClosed(@NonNull android.view.Menu);
+ method @MainThread @CallSuper protected void onCreate(@Nullable android.os.Bundle);
+ method public void onCreate(@Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
- method public java.lang.CharSequence onCreateDescription();
- method protected deprecated android.app.Dialog onCreateDialog(int);
- method protected deprecated android.app.Dialog onCreateDialog(int, android.os.Bundle);
+ method @Nullable public CharSequence onCreateDescription();
+ method @Deprecated protected android.app.Dialog onCreateDialog(int);
+ method @Deprecated @Nullable protected android.app.Dialog onCreateDialog(int, android.os.Bundle);
method public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder);
method public boolean onCreateOptionsMenu(android.view.Menu);
- method public boolean onCreatePanelMenu(int, android.view.Menu);
- method public android.view.View onCreatePanelView(int);
- method public deprecated boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
- method public android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
- method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
- method protected void onDestroy();
+ method public boolean onCreatePanelMenu(int, @NonNull android.view.Menu);
+ method @Nullable public android.view.View onCreatePanelView(int);
+ method @Deprecated public boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
+ method @Nullable public android.view.View onCreateView(@NonNull String, @NonNull android.content.Context, @NonNull android.util.AttributeSet);
+ method @Nullable public android.view.View onCreateView(@Nullable android.view.View, @NonNull String, @NonNull android.content.Context, @NonNull android.util.AttributeSet);
+ method @CallSuper protected void onDestroy();
method public void onDetachedFromWindow();
method public void onEnterAnimationComplete();
method public boolean onGenericMotionEvent(android.view.MotionEvent);
@@ -3761,74 +3764,74 @@ package android.app {
method public void onLocalVoiceInteractionStarted();
method public void onLocalVoiceInteractionStopped();
method public void onLowMemory();
- method public boolean onMenuItemSelected(int, android.view.MenuItem);
- method public boolean onMenuOpened(int, android.view.Menu);
+ method public boolean onMenuItemSelected(int, @NonNull android.view.MenuItem);
+ method public boolean onMenuOpened(int, @NonNull android.view.Menu);
method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
- method public deprecated void onMultiWindowModeChanged(boolean);
+ method @Deprecated public void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
method public boolean onNavigateUpFromChild(android.app.Activity);
method protected void onNewIntent(android.content.Intent);
- method public boolean onOptionsItemSelected(android.view.MenuItem);
+ method public boolean onOptionsItemSelected(@NonNull android.view.MenuItem);
method public void onOptionsMenuClosed(android.view.Menu);
- method public void onPanelClosed(int, android.view.Menu);
- method protected void onPause();
+ method public void onPanelClosed(int, @NonNull android.view.Menu);
+ method @CallSuper protected void onPause();
method public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
- method public deprecated void onPictureInPictureModeChanged(boolean);
- method protected void onPostCreate(android.os.Bundle);
- method public void onPostCreate(android.os.Bundle, android.os.PersistableBundle);
- method protected void onPostResume();
- method protected deprecated void onPrepareDialog(int, android.app.Dialog);
- method protected deprecated void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
+ method @Deprecated public void onPictureInPictureModeChanged(boolean);
+ method @CallSuper protected void onPostCreate(@Nullable android.os.Bundle);
+ method public void onPostCreate(@Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
+ method @CallSuper protected void onPostResume();
+ method @Deprecated protected void onPrepareDialog(int, android.app.Dialog);
+ method @Deprecated protected void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
method public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
method public boolean onPrepareOptionsMenu(android.view.Menu);
- method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
+ method public boolean onPreparePanel(int, @Nullable android.view.View, @NonNull android.view.Menu);
method public void onProvideAssistContent(android.app.assist.AssistContent);
method public void onProvideAssistData(android.os.Bundle);
method public android.net.Uri onProvideReferrer();
- method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
- method protected void onRestart();
- method protected void onRestoreInstanceState(android.os.Bundle);
- method public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle);
- method protected void onResume();
- method public java.lang.Object onRetainNonConfigurationInstance();
- method protected void onSaveInstanceState(android.os.Bundle);
- method public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle);
- method public boolean onSearchRequested(android.view.SearchEvent);
+ method public void onRequestPermissionsResult(int, @NonNull String[], @NonNull int[]);
+ method @CallSuper protected void onRestart();
+ method protected void onRestoreInstanceState(@NonNull android.os.Bundle);
+ method public void onRestoreInstanceState(@Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
+ method @CallSuper protected void onResume();
+ method public Object onRetainNonConfigurationInstance();
+ method protected void onSaveInstanceState(@NonNull android.os.Bundle);
+ method public void onSaveInstanceState(@NonNull android.os.Bundle, @NonNull android.os.PersistableBundle);
+ method public boolean onSearchRequested(@Nullable android.view.SearchEvent);
method public boolean onSearchRequested();
- method protected void onStart();
- method public deprecated void onStateNotSaved();
- method protected void onStop();
- method protected void onTitleChanged(java.lang.CharSequence, int);
+ method @CallSuper protected void onStart();
+ method @Deprecated public void onStateNotSaved();
+ method @CallSuper protected void onStop();
+ method protected void onTitleChanged(CharSequence, int);
method public boolean onTouchEvent(android.view.MotionEvent);
method public boolean onTrackballEvent(android.view.MotionEvent);
method public void onTrimMemory(int);
method public void onUserInteraction();
method protected void onUserLeaveHint();
- method public deprecated void onVisibleBehindCanceled();
+ method @Deprecated @CallSuper public void onVisibleBehindCanceled();
method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
method public void onWindowFocusChanged(boolean);
- method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
- method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
+ method @Nullable public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
+ method @Nullable public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
method public void openContextMenu(android.view.View);
method public void openOptionsMenu();
method public void overridePendingTransition(int, int);
method public void postponeEnterTransition();
method public void recreate();
- method public void registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+ method public void registerActivityLifecycleCallbacks(@NonNull android.app.Application.ActivityLifecycleCallbacks);
method public void registerForContextMenu(android.view.View);
method public boolean releaseInstance();
- method public final deprecated void removeDialog(int);
+ method @Deprecated public final void removeDialog(int);
method public void reportFullyDrawn();
method public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
- method public final void requestPermissions(java.lang.String[], int);
+ method public final void requestPermissions(@NonNull String[], int);
method public final void requestShowKeyboardShortcuts();
- method public deprecated boolean requestVisibleBehind(boolean);
+ method @Deprecated public boolean requestVisibleBehind(boolean);
method public final boolean requestWindowFeature(int);
- method public final <T extends android.view.View> T requireViewById(int);
- method public final void runOnUiThread(java.lang.Runnable);
- method public void setActionBar(android.widget.Toolbar);
+ method @NonNull public final <T extends android.view.View> T requireViewById(@IdRes int);
+ method public final void runOnUiThread(Runnable);
+ method public void setActionBar(@Nullable android.widget.Toolbar);
method public void setContentTransitionManager(android.transition.TransitionManager);
- method public void setContentView(int);
+ method public void setContentView(@LayoutRes int);
method public void setContentView(android.view.View);
method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public final void setDefaultKeyMode(int);
@@ -3836,63 +3839,63 @@ package android.app {
method public void setExitSharedElementCallback(android.app.SharedElementCallback);
method public final void setFeatureDrawable(int, android.graphics.drawable.Drawable);
method public final void setFeatureDrawableAlpha(int, int);
- method public final void setFeatureDrawableResource(int, int);
+ method public final void setFeatureDrawableResource(int, @DrawableRes int);
method public final void setFeatureDrawableUri(int, android.net.Uri);
method public void setFinishOnTouchOutside(boolean);
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- method public void setPictureInPictureParams(android.app.PictureInPictureParams);
- method public final deprecated void setProgress(int);
- method public final deprecated void setProgressBarIndeterminate(boolean);
- method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
- method public final deprecated void setProgressBarVisibility(boolean);
+ method public void setPictureInPictureParams(@NonNull android.app.PictureInPictureParams);
+ method @Deprecated public final void setProgress(int);
+ method @Deprecated public final void setProgressBarIndeterminate(boolean);
+ method @Deprecated public final void setProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public final void setProgressBarVisibility(boolean);
method public void setRequestedOrientation(int);
method public final void setResult(int);
method public final void setResult(int, android.content.Intent);
- method public final deprecated void setSecondaryProgress(int);
+ method @Deprecated public final void setSecondaryProgress(int);
method public void setShowWhenLocked(boolean);
method public void setTaskDescription(android.app.ActivityManager.TaskDescription);
- method public void setTitle(java.lang.CharSequence);
+ method public void setTitle(CharSequence);
method public void setTitle(int);
- method public deprecated void setTitleColor(int);
+ method @Deprecated public void setTitleColor(int);
method public void setTurnScreenOn(boolean);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
- method public void setVrModeEnabled(boolean, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
- method public boolean shouldShowRequestPermissionRationale(java.lang.String);
+ method public void setVrModeEnabled(boolean, @NonNull android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public boolean shouldShowRequestPermissionRationale(@NonNull String);
method public boolean shouldUpRecreateTask(android.content.Intent);
method public boolean showAssist(android.os.Bundle);
- method public final deprecated void showDialog(int);
- method public final deprecated boolean showDialog(int, android.os.Bundle);
+ method @Deprecated public final void showDialog(int);
+ method @Deprecated public final boolean showDialog(int, android.os.Bundle);
method public void showLockTaskEscapeMessage();
- method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback);
- method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback, int);
- method public void startActivityForResult(android.content.Intent, int);
- method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
- method public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
- method public void startActivityFromChild(android.app.Activity, android.content.Intent, int, android.os.Bundle);
- method public deprecated void startActivityFromFragment(android.app.Fragment, android.content.Intent, int);
- method public deprecated void startActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
- method public boolean startActivityIfNeeded(android.content.Intent, int);
- method public boolean startActivityIfNeeded(android.content.Intent, int, android.os.Bundle);
- method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
- method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method @Nullable public android.view.ActionMode startActionMode(android.view.ActionMode.Callback);
+ method @Nullable public android.view.ActionMode startActionMode(android.view.ActionMode.Callback, int);
+ method public void startActivityForResult(@RequiresPermission android.content.Intent, int);
+ method public void startActivityForResult(@RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
+ method public void startActivityFromChild(@NonNull android.app.Activity, @RequiresPermission android.content.Intent, int);
+ method public void startActivityFromChild(@NonNull android.app.Activity, @RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
+ method @Deprecated public void startActivityFromFragment(@NonNull android.app.Fragment, @RequiresPermission android.content.Intent, int);
+ method @Deprecated public void startActivityFromFragment(@NonNull android.app.Fragment, @RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
+ method public boolean startActivityIfNeeded(@RequiresPermission @NonNull android.content.Intent, int);
+ method public boolean startActivityIfNeeded(@RequiresPermission @NonNull android.content.Intent, int, @Nullable android.os.Bundle);
+ method public void startIntentSenderForResult(android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSenderForResult(android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
- method public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, @Nullable android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public void startLocalVoiceInteraction(android.os.Bundle);
method public void startLockTask();
- method public deprecated void startManagingCursor(android.database.Cursor);
- method public boolean startNextMatchingActivity(android.content.Intent);
- method public boolean startNextMatchingActivity(android.content.Intent, android.os.Bundle);
+ method @Deprecated public void startManagingCursor(android.database.Cursor);
+ method public boolean startNextMatchingActivity(@RequiresPermission @NonNull android.content.Intent);
+ method public boolean startNextMatchingActivity(@RequiresPermission @NonNull android.content.Intent, @Nullable android.os.Bundle);
method public void startPostponedEnterTransition();
- method public void startSearch(java.lang.String, boolean, android.os.Bundle, boolean);
+ method public void startSearch(@Nullable String, boolean, @Nullable android.os.Bundle, boolean);
method public void stopLocalVoiceInteraction();
method public void stopLockTask();
- method public deprecated void stopManagingCursor(android.database.Cursor);
+ method @Deprecated public void stopManagingCursor(android.database.Cursor);
method public void takeKeyEvents(boolean);
- method public void triggerSearch(java.lang.String, android.os.Bundle);
- method public void unregisterActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+ method public void triggerSearch(String, @Nullable android.os.Bundle);
+ method public void unregisterActivityLifecycleCallbacks(@NonNull android.app.Application.ActivityLifecycleCallbacks);
method public void unregisterForContextMenu(android.view.View);
field public static final int DEFAULT_KEYS_DIALER = 1; // 0x1
field public static final int DEFAULT_KEYS_DISABLE = 0; // 0x0
@@ -3905,18 +3908,18 @@ package android.app {
field public static final int RESULT_OK = -1; // 0xffffffff
}
- public deprecated class ActivityGroup extends android.app.Activity {
- ctor public ActivityGroup();
- ctor public ActivityGroup(boolean);
- method public android.app.Activity getCurrentActivity();
- method public final android.app.LocalActivityManager getLocalActivityManager();
+ @Deprecated public class ActivityGroup extends android.app.Activity {
+ ctor @Deprecated public ActivityGroup();
+ ctor @Deprecated public ActivityGroup(boolean);
+ method @Deprecated public android.app.Activity getCurrentActivity();
+ method @Deprecated public final android.app.LocalActivityManager getLocalActivityManager();
}
public class ActivityManager {
- method public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager.TaskDescription, android.graphics.Bitmap);
+ method public int addAppTask(@NonNull android.app.Activity, @NonNull android.content.Intent, @Nullable android.app.ActivityManager.TaskDescription, @NonNull android.graphics.Bitmap);
method public boolean clearApplicationUserData();
method public void clearWatchHeapLimit();
- method public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.DUMP) public void dumpPackageState(java.io.FileDescriptor, String);
method public android.util.Size getAppTaskThumbnailSize();
method public java.util.List<android.app.ActivityManager.AppTask> getAppTasks();
method public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
@@ -3929,28 +3932,28 @@ package android.app {
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
method public android.os.Debug.MemoryInfo[] getProcessMemoryInfo(int[]);
method public java.util.List<android.app.ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
- method public deprecated java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
+ method @Deprecated public java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
method public java.util.List<android.app.ActivityManager.RunningAppProcessInfo> getRunningAppProcesses();
method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException;
- method public deprecated java.util.List<android.app.ActivityManager.RunningServiceInfo> getRunningServices(int) throws java.lang.SecurityException;
- method public deprecated java.util.List<android.app.ActivityManager.RunningTaskInfo> getRunningTasks(int) throws java.lang.SecurityException;
+ method @Deprecated public java.util.List<android.app.ActivityManager.RunningServiceInfo> getRunningServices(int) throws java.lang.SecurityException;
+ method @Deprecated public java.util.List<android.app.ActivityManager.RunningTaskInfo> getRunningTasks(int) throws java.lang.SecurityException;
method public boolean isActivityStartAllowedOnDisplay(android.content.Context, int, android.content.Intent);
method public boolean isBackgroundRestricted();
- method public deprecated boolean isInLockTaskMode();
+ method @Deprecated public boolean isInLockTaskMode();
method public boolean isLowRamDevice();
method public static boolean isRunningInTestHarness();
method public static boolean isUserAMonkey();
- method public void killBackgroundProcesses(java.lang.String);
- method public void moveTaskToFront(int, int);
- method public void moveTaskToFront(int, int, android.os.Bundle);
- method public deprecated void restartPackage(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES) public void killBackgroundProcesses(String);
+ method @RequiresPermission(android.Manifest.permission.REORDER_TASKS) public void moveTaskToFront(int, int);
+ method @RequiresPermission(android.Manifest.permission.REORDER_TASKS) public void moveTaskToFront(int, int, android.os.Bundle);
+ method @Deprecated public void restartPackage(String);
method public static void setVrThread(int);
method public void setWatchHeapLimit(long);
- field public static final java.lang.String ACTION_REPORT_HEAP_LIMIT = "android.app.action.REPORT_HEAP_LIMIT";
+ field public static final String ACTION_REPORT_HEAP_LIMIT = "android.app.action.REPORT_HEAP_LIMIT";
field public static final int LOCK_TASK_MODE_LOCKED = 1; // 0x1
field public static final int LOCK_TASK_MODE_NONE = 0; // 0x0
field public static final int LOCK_TASK_MODE_PINNED = 2; // 0x2
- field public static final java.lang.String META_HOME_ALTERNATE = "android.app.home.alternate";
+ field public static final String META_HOME_ALTERNATE = "android.app.home.alternate";
field public static final int MOVE_TASK_NO_USER_ACTION = 2; // 0x2
field public static final int MOVE_TASK_WITH_HOME = 1; // 0x1
field public static final int RECENT_IGNORE_UNAVAILABLE = 2; // 0x2
@@ -3988,12 +3991,12 @@ package android.app {
field public static final int NO_ERROR = 0; // 0x0
field public int condition;
field public byte[] crashData;
- field public java.lang.String longMsg;
+ field public String longMsg;
field public int pid;
- field public java.lang.String processName;
- field public java.lang.String shortMsg;
- field public java.lang.String stackTrace;
- field public java.lang.String tag;
+ field public String processName;
+ field public String shortMsg;
+ field public String stackTrace;
+ field public String tag;
field public int uid;
}
@@ -4003,23 +4006,23 @@ package android.app {
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RecentTaskInfo> CREATOR;
- field public deprecated int affiliatedTaskId;
- field public deprecated java.lang.CharSequence description;
- field public deprecated int id;
- field public deprecated int persistentId;
+ field @Deprecated public int affiliatedTaskId;
+ field @Deprecated public CharSequence description;
+ field @Deprecated public int id;
+ field @Deprecated public int persistentId;
}
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
ctor public ActivityManager.RunningAppProcessInfo();
- ctor public ActivityManager.RunningAppProcessInfo(java.lang.String, int, java.lang.String[]);
+ ctor public ActivityManager.RunningAppProcessInfo(String, int, String[]);
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningAppProcessInfo> CREATOR;
- field public static final deprecated int IMPORTANCE_BACKGROUND = 400; // 0x190
+ field @Deprecated public static final int IMPORTANCE_BACKGROUND = 400; // 0x190
field public static final int IMPORTANCE_CACHED = 400; // 0x190
field public static final int IMPORTANCE_CANT_SAVE_STATE = 350; // 0x15e
- field public static final deprecated int IMPORTANCE_EMPTY = 500; // 0x1f4
+ field @Deprecated public static final int IMPORTANCE_EMPTY = 500; // 0x1f4
field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64
field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d
field public static final int IMPORTANCE_GONE = 1000; // 0x3e8
@@ -4027,7 +4030,7 @@ package android.app {
field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82
field public static final int IMPORTANCE_SERVICE = 300; // 0x12c
field public static final int IMPORTANCE_TOP_SLEEPING = 325; // 0x145
- field public static final deprecated int IMPORTANCE_TOP_SLEEPING_PRE_28 = 150; // 0x96
+ field @Deprecated public static final int IMPORTANCE_TOP_SLEEPING_PRE_28 = 150; // 0x96
field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8
field public static final int REASON_PROVIDER_IN_USE = 1; // 0x1
field public static final int REASON_SERVICE_IN_USE = 2; // 0x2
@@ -4039,8 +4042,8 @@ package android.app {
field public int lastTrimLevel;
field public int lru;
field public int pid;
- field public java.lang.String[] pkgList;
- field public java.lang.String processName;
+ field public String[] pkgList;
+ field public String processName;
field public int uid;
}
@@ -4057,13 +4060,13 @@ package android.app {
field public long activeSince;
field public int clientCount;
field public int clientLabel;
- field public java.lang.String clientPackage;
+ field public String clientPackage;
field public int crashCount;
field public int flags;
field public boolean foreground;
field public long lastActivityTime;
field public int pid;
- field public java.lang.String process;
+ field public String process;
field public long restarting;
field public android.content.ComponentName service;
field public boolean started;
@@ -4076,23 +4079,23 @@ package android.app {
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningTaskInfo> CREATOR;
- field public deprecated java.lang.CharSequence description;
- field public deprecated int id;
- field public deprecated int numRunning;
- field public deprecated android.graphics.Bitmap thumbnail;
+ field @Deprecated public CharSequence description;
+ field @Deprecated public int id;
+ field @Deprecated public int numRunning;
+ field @Deprecated public android.graphics.Bitmap thumbnail;
}
public static class ActivityManager.TaskDescription implements android.os.Parcelable {
- ctor public deprecated ActivityManager.TaskDescription(java.lang.String, android.graphics.Bitmap, int);
- ctor public ActivityManager.TaskDescription(java.lang.String, int, int);
- ctor public deprecated ActivityManager.TaskDescription(java.lang.String, android.graphics.Bitmap);
- ctor public ActivityManager.TaskDescription(java.lang.String, int);
- ctor public ActivityManager.TaskDescription(java.lang.String);
+ ctor @Deprecated public ActivityManager.TaskDescription(String, android.graphics.Bitmap, int);
+ ctor public ActivityManager.TaskDescription(String, @DrawableRes int, int);
+ ctor @Deprecated public ActivityManager.TaskDescription(String, android.graphics.Bitmap);
+ ctor public ActivityManager.TaskDescription(String, @DrawableRes int);
+ ctor public ActivityManager.TaskDescription(String);
ctor public ActivityManager.TaskDescription();
ctor public ActivityManager.TaskDescription(android.app.ActivityManager.TaskDescription);
method public int describeContents();
method public android.graphics.Bitmap getIcon();
- method public java.lang.String getLabel();
+ method public String getLabel();
method public int getPrimaryColor();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
@@ -4100,26 +4103,26 @@ package android.app {
}
public class ActivityOptions {
- method public android.graphics.Rect getLaunchBounds();
+ method @Nullable public android.graphics.Rect getLaunchBounds();
method public int getLaunchDisplayId();
method public boolean getLockTaskMode();
method public static android.app.ActivityOptions makeBasic();
method public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
method public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
method public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
- method public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
- method public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair<android.view.View, java.lang.String>...);
+ method public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+ method @java.lang.SafeVarargs public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair<android.view.View,java.lang.String>...);
method public static android.app.ActivityOptions makeTaskLaunchBehind();
method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
method public void requestUsageTimeReport(android.app.PendingIntent);
method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
- method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
+ method public android.app.ActivityOptions setLaunchBounds(@Nullable android.graphics.Rect);
method public android.app.ActivityOptions setLaunchDisplayId(int);
method public android.app.ActivityOptions setLockTaskEnabled(boolean);
method public android.os.Bundle toBundle();
method public void update(android.app.ActivityOptions);
- field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
- field public static final java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+ field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+ field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
}
public class AlarmManager {
@@ -4127,19 +4130,19 @@ package android.app {
method public void cancel(android.app.AlarmManager.OnAlarmListener);
method public android.app.AlarmManager.AlarmClockInfo getNextAlarmClock();
method public void set(int, long, android.app.PendingIntent);
- method public void set(int, long, java.lang.String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
+ method public void set(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
method public void setAlarmClock(android.app.AlarmManager.AlarmClockInfo, android.app.PendingIntent);
method public void setAndAllowWhileIdle(int, long, android.app.PendingIntent);
method public void setExact(int, long, android.app.PendingIntent);
- method public void setExact(int, long, java.lang.String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
+ method public void setExact(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
method public void setExactAndAllowWhileIdle(int, long, android.app.PendingIntent);
method public void setInexactRepeating(int, long, long, android.app.PendingIntent);
method public void setRepeating(int, long, long, android.app.PendingIntent);
- method public void setTime(long);
- method public void setTimeZone(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.SET_TIME) public void setTime(long);
+ method @RequiresPermission(android.Manifest.permission.SET_TIME_ZONE) public void setTimeZone(String);
method public void setWindow(int, long, long, android.app.PendingIntent);
- method public void setWindow(int, long, long, java.lang.String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
- field public static final java.lang.String ACTION_NEXT_ALARM_CLOCK_CHANGED = "android.app.action.NEXT_ALARM_CLOCK_CHANGED";
+ method public void setWindow(int, long, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler);
+ field public static final String ACTION_NEXT_ALARM_CLOCK_CHANGED = "android.app.action.NEXT_ALARM_CLOCK_CHANGED";
field public static final int ELAPSED_REALTIME = 3; // 0x3
field public static final int ELAPSED_REALTIME_WAKEUP = 2; // 0x2
field public static final long INTERVAL_DAY = 86400000L; // 0x5265c00L
@@ -4160,37 +4163,37 @@ package android.app {
field public static final android.os.Parcelable.Creator<android.app.AlarmManager.AlarmClockInfo> CREATOR;
}
- public static abstract interface AlarmManager.OnAlarmListener {
- method public abstract void onAlarm();
+ public static interface AlarmManager.OnAlarmListener {
+ method public void onAlarm();
}
public class AlertDialog extends android.app.Dialog implements android.content.DialogInterface {
ctor protected AlertDialog(android.content.Context);
ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
- ctor protected AlertDialog(android.content.Context, int);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
method public android.widget.Button getButton(int);
method public android.widget.ListView getListView();
- method public void setButton(int, java.lang.CharSequence, android.os.Message);
- method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
- method public deprecated void setButton(java.lang.CharSequence, android.os.Message);
- method public deprecated void setButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
- method public deprecated void setButton2(java.lang.CharSequence, android.os.Message);
- method public deprecated void setButton2(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
- method public deprecated void setButton3(java.lang.CharSequence, android.os.Message);
- method public deprecated void setButton3(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+ method public void setButton(int, CharSequence, android.os.Message);
+ method public void setButton(int, CharSequence, android.content.DialogInterface.OnClickListener);
+ method @Deprecated public void setButton(CharSequence, android.os.Message);
+ method @Deprecated public void setButton(CharSequence, android.content.DialogInterface.OnClickListener);
+ method @Deprecated public void setButton2(CharSequence, android.os.Message);
+ method @Deprecated public void setButton2(CharSequence, android.content.DialogInterface.OnClickListener);
+ method @Deprecated public void setButton3(CharSequence, android.os.Message);
+ method @Deprecated public void setButton3(CharSequence, android.content.DialogInterface.OnClickListener);
method public void setCustomTitle(android.view.View);
- method public void setIcon(int);
+ method public void setIcon(@DrawableRes int);
method public void setIcon(android.graphics.drawable.Drawable);
- method public void setIconAttribute(int);
+ method public void setIconAttribute(@AttrRes int);
method public void setInverseBackgroundForced(boolean);
- method public void setMessage(java.lang.CharSequence);
+ method public void setMessage(CharSequence);
method public void setView(android.view.View);
method public void setView(android.view.View, int, int, int, int);
- field public static final deprecated int THEME_DEVICE_DEFAULT_DARK = 4; // 0x4
- field public static final deprecated int THEME_DEVICE_DEFAULT_LIGHT = 5; // 0x5
- field public static final deprecated int THEME_HOLO_DARK = 2; // 0x2
- field public static final deprecated int THEME_HOLO_LIGHT = 3; // 0x3
- field public static final deprecated int THEME_TRADITIONAL = 1; // 0x1
+ field @Deprecated public static final int THEME_DEVICE_DEFAULT_DARK = 4; // 0x4
+ field @Deprecated public static final int THEME_DEVICE_DEFAULT_LIGHT = 5; // 0x5
+ field @Deprecated public static final int THEME_HOLO_DARK = 2; // 0x2
+ field @Deprecated public static final int THEME_HOLO_LIGHT = 3; // 0x3
+ field @Deprecated public static final int THEME_TRADITIONAL = 1; // 0x1
}
public static class AlertDialog.Builder {
@@ -4200,35 +4203,35 @@ package android.app {
method public android.content.Context getContext();
method public android.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
method public android.app.AlertDialog.Builder setCancelable(boolean);
- method public android.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
+ method public android.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, String);
method public android.app.AlertDialog.Builder setCustomTitle(android.view.View);
- method public android.app.AlertDialog.Builder setIcon(int);
+ method public android.app.AlertDialog.Builder setIcon(@DrawableRes int);
method public android.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.app.AlertDialog.Builder setIconAttribute(int);
- method public deprecated android.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
- method public android.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setMessage(int);
- method public android.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
- method public android.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
- method public android.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
- method public android.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
- method public android.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setIconAttribute(@AttrRes int);
+ method @Deprecated public android.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
+ method public android.app.AlertDialog.Builder setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setItems(CharSequence[], android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setMessage(@StringRes int);
+ method public android.app.AlertDialog.Builder setMessage(CharSequence);
+ method public android.app.AlertDialog.Builder setMultiChoiceItems(@ArrayRes int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+ method public android.app.AlertDialog.Builder setMultiChoiceItems(CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+ method public android.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, String, String, android.content.DialogInterface.OnMultiChoiceClickListener);
+ method public android.app.AlertDialog.Builder setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setNegativeButton(CharSequence, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setNeutralButton(CharSequence, android.content.DialogInterface.OnClickListener);
method public android.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
method public android.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
method public android.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
method public android.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
- method public android.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setPositiveButton(CharSequence, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, String, android.content.DialogInterface.OnClickListener);
+ method public android.app.AlertDialog.Builder setSingleChoiceItems(CharSequence[], int, android.content.DialogInterface.OnClickListener);
method public android.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
- method public android.app.AlertDialog.Builder setTitle(int);
- method public android.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
+ method public android.app.AlertDialog.Builder setTitle(@StringRes int);
+ method public android.app.AlertDialog.Builder setTitle(CharSequence);
method public android.app.AlertDialog.Builder setView(int);
method public android.app.AlertDialog.Builder setView(android.view.View);
method public android.app.AlertDialog show();
@@ -4241,125 +4244,125 @@ package android.app {
public class AppComponentFactory {
ctor public AppComponentFactory();
method public android.content.pm.ApplicationInfo getApplicationInfo();
- method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public android.app.Application instantiateApplication(java.lang.ClassLoader, java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public java.lang.ClassLoader instantiateClassLoader(java.lang.ClassLoader);
- method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public android.app.Activity instantiateActivity(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public android.app.Application instantiateApplication(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public ClassLoader instantiateClassLoader(@NonNull ClassLoader);
+ method @NonNull public android.content.ContentProvider instantiateProvider(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public android.content.BroadcastReceiver instantiateReceiver(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public android.app.Service instantiateService(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
}
public class AppOpsManager {
- method public deprecated int checkOp(java.lang.String, int, java.lang.String);
- method public deprecated int checkOpNoThrow(java.lang.String, int, java.lang.String);
- method public void checkPackage(int, java.lang.String);
- method public void finishOp(java.lang.String, int, java.lang.String);
- method public int noteOp(java.lang.String, int, java.lang.String);
- method public int noteOpNoThrow(java.lang.String, int, java.lang.String);
- method public int noteProxyOp(java.lang.String, java.lang.String);
- method public int noteProxyOpNoThrow(java.lang.String, java.lang.String);
- method public static java.lang.String permissionToOp(java.lang.String);
- method public int startOp(java.lang.String, int, java.lang.String);
- method public int startOpNoThrow(java.lang.String, int, java.lang.String);
- method public void startWatchingMode(java.lang.String, java.lang.String, android.app.AppOpsManager.OnOpChangedListener);
- method public void startWatchingMode(java.lang.String, java.lang.String, int, android.app.AppOpsManager.OnOpChangedListener);
+ method @Deprecated public int checkOp(String, int, String);
+ method @Deprecated public int checkOpNoThrow(String, int, String);
+ method public void checkPackage(int, String);
+ method public void finishOp(String, int, String);
+ method public int noteOp(String, int, String);
+ method public int noteOpNoThrow(String, int, String);
+ method public int noteProxyOp(String, String);
+ method public int noteProxyOpNoThrow(String, String);
+ method public static String permissionToOp(String);
+ method public int startOp(String, int, String);
+ method public int startOpNoThrow(String, int, String);
+ method public void startWatchingMode(String, String, android.app.AppOpsManager.OnOpChangedListener);
+ method public void startWatchingMode(String, String, int, android.app.AppOpsManager.OnOpChangedListener);
method public void stopWatchingMode(android.app.AppOpsManager.OnOpChangedListener);
- method public int unsafeCheckOp(java.lang.String, int, java.lang.String);
- method public int unsafeCheckOpNoThrow(java.lang.String, int, java.lang.String);
- method public int unsafeCheckOpRaw(java.lang.String, int, java.lang.String);
+ method public int unsafeCheckOp(String, int, String);
+ method public int unsafeCheckOpNoThrow(String, int, String);
+ method public int unsafeCheckOpRaw(String, int, String);
field public static final int MODE_ALLOWED = 0; // 0x0
field public static final int MODE_DEFAULT = 3; // 0x3
field public static final int MODE_ERRORED = 2; // 0x2
field public static final int MODE_FOREGROUND = 4; // 0x4
field public static final int MODE_IGNORED = 1; // 0x1
- field public static final java.lang.String OPSTR_ADD_VOICEMAIL = "android:add_voicemail";
- field public static final java.lang.String OPSTR_ANSWER_PHONE_CALLS = "android:answer_phone_calls";
- field public static final java.lang.String OPSTR_BODY_SENSORS = "android:body_sensors";
- field public static final java.lang.String OPSTR_CALL_PHONE = "android:call_phone";
- field public static final java.lang.String OPSTR_CAMERA = "android:camera";
- field public static final java.lang.String OPSTR_COARSE_LOCATION = "android:coarse_location";
- field public static final java.lang.String OPSTR_FINE_LOCATION = "android:fine_location";
- field public static final java.lang.String OPSTR_GET_USAGE_STATS = "android:get_usage_stats";
- field public static final java.lang.String OPSTR_MOCK_LOCATION = "android:mock_location";
- field public static final java.lang.String OPSTR_MONITOR_HIGH_POWER_LOCATION = "android:monitor_location_high_power";
- field public static final java.lang.String OPSTR_MONITOR_LOCATION = "android:monitor_location";
- field public static final java.lang.String OPSTR_PICTURE_IN_PICTURE = "android:picture_in_picture";
- field public static final java.lang.String OPSTR_PROCESS_OUTGOING_CALLS = "android:process_outgoing_calls";
- field public static final java.lang.String OPSTR_READ_CALENDAR = "android:read_calendar";
- field public static final java.lang.String OPSTR_READ_CALL_LOG = "android:read_call_log";
- field public static final java.lang.String OPSTR_READ_CELL_BROADCASTS = "android:read_cell_broadcasts";
- field public static final java.lang.String OPSTR_READ_CONTACTS = "android:read_contacts";
- field public static final java.lang.String OPSTR_READ_EXTERNAL_STORAGE = "android:read_external_storage";
- field public static final java.lang.String OPSTR_READ_PHONE_NUMBERS = "android:read_phone_numbers";
- field public static final java.lang.String OPSTR_READ_PHONE_STATE = "android:read_phone_state";
- field public static final java.lang.String OPSTR_READ_SMS = "android:read_sms";
- field public static final java.lang.String OPSTR_RECEIVE_MMS = "android:receive_mms";
- field public static final java.lang.String OPSTR_RECEIVE_SMS = "android:receive_sms";
- field public static final java.lang.String OPSTR_RECEIVE_WAP_PUSH = "android:receive_wap_push";
- field public static final java.lang.String OPSTR_RECORD_AUDIO = "android:record_audio";
- field public static final java.lang.String OPSTR_SEND_SMS = "android:send_sms";
- field public static final java.lang.String OPSTR_SYSTEM_ALERT_WINDOW = "android:system_alert_window";
- field public static final java.lang.String OPSTR_USE_FINGERPRINT = "android:use_fingerprint";
- field public static final java.lang.String OPSTR_USE_SIP = "android:use_sip";
- field public static final java.lang.String OPSTR_WRITE_CALENDAR = "android:write_calendar";
- field public static final java.lang.String OPSTR_WRITE_CALL_LOG = "android:write_call_log";
- field public static final java.lang.String OPSTR_WRITE_CONTACTS = "android:write_contacts";
- field public static final java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE = "android:write_external_storage";
- field public static final java.lang.String OPSTR_WRITE_SETTINGS = "android:write_settings";
+ field public static final String OPSTR_ADD_VOICEMAIL = "android:add_voicemail";
+ field public static final String OPSTR_ANSWER_PHONE_CALLS = "android:answer_phone_calls";
+ field public static final String OPSTR_BODY_SENSORS = "android:body_sensors";
+ field public static final String OPSTR_CALL_PHONE = "android:call_phone";
+ field public static final String OPSTR_CAMERA = "android:camera";
+ field public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
+ field public static final String OPSTR_FINE_LOCATION = "android:fine_location";
+ field public static final String OPSTR_GET_USAGE_STATS = "android:get_usage_stats";
+ field public static final String OPSTR_MOCK_LOCATION = "android:mock_location";
+ field public static final String OPSTR_MONITOR_HIGH_POWER_LOCATION = "android:monitor_location_high_power";
+ field public static final String OPSTR_MONITOR_LOCATION = "android:monitor_location";
+ field public static final String OPSTR_PICTURE_IN_PICTURE = "android:picture_in_picture";
+ field public static final String OPSTR_PROCESS_OUTGOING_CALLS = "android:process_outgoing_calls";
+ field public static final String OPSTR_READ_CALENDAR = "android:read_calendar";
+ field public static final String OPSTR_READ_CALL_LOG = "android:read_call_log";
+ field public static final String OPSTR_READ_CELL_BROADCASTS = "android:read_cell_broadcasts";
+ field public static final String OPSTR_READ_CONTACTS = "android:read_contacts";
+ field public static final String OPSTR_READ_EXTERNAL_STORAGE = "android:read_external_storage";
+ field public static final String OPSTR_READ_PHONE_NUMBERS = "android:read_phone_numbers";
+ field public static final String OPSTR_READ_PHONE_STATE = "android:read_phone_state";
+ field public static final String OPSTR_READ_SMS = "android:read_sms";
+ field public static final String OPSTR_RECEIVE_MMS = "android:receive_mms";
+ field public static final String OPSTR_RECEIVE_SMS = "android:receive_sms";
+ field public static final String OPSTR_RECEIVE_WAP_PUSH = "android:receive_wap_push";
+ field public static final String OPSTR_RECORD_AUDIO = "android:record_audio";
+ field public static final String OPSTR_SEND_SMS = "android:send_sms";
+ field public static final String OPSTR_SYSTEM_ALERT_WINDOW = "android:system_alert_window";
+ field public static final String OPSTR_USE_FINGERPRINT = "android:use_fingerprint";
+ field public static final String OPSTR_USE_SIP = "android:use_sip";
+ field public static final String OPSTR_WRITE_CALENDAR = "android:write_calendar";
+ field public static final String OPSTR_WRITE_CALL_LOG = "android:write_call_log";
+ field public static final String OPSTR_WRITE_CONTACTS = "android:write_contacts";
+ field public static final String OPSTR_WRITE_EXTERNAL_STORAGE = "android:write_external_storage";
+ field public static final String OPSTR_WRITE_SETTINGS = "android:write_settings";
field public static final int WATCH_FOREGROUND_CHANGES = 1; // 0x1
}
- public static abstract interface AppOpsManager.OnOpChangedListener {
- method public abstract void onOpChanged(java.lang.String, java.lang.String);
+ public static interface AppOpsManager.OnOpChangedListener {
+ method public void onOpChanged(String, String);
}
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
- method public static java.lang.String getProcessName();
- method public void onConfigurationChanged(android.content.res.Configuration);
- method public void onCreate();
- method public void onLowMemory();
- method public void onTerminate();
- method public void onTrimMemory(int);
+ method public static String getProcessName();
+ method @CallSuper public void onConfigurationChanged(@NonNull android.content.res.Configuration);
+ method @CallSuper public void onCreate();
+ method @CallSuper public void onLowMemory();
+ method @CallSuper public void onTerminate();
+ method @CallSuper public void onTrimMemory(int);
method public void registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
method public void registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener);
method public void unregisterActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
method public void unregisterOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener);
}
- public static abstract interface Application.ActivityLifecycleCallbacks {
- method public abstract void onActivityCreated(android.app.Activity, android.os.Bundle);
- method public abstract void onActivityDestroyed(android.app.Activity);
- method public abstract void onActivityPaused(android.app.Activity);
- method public default void onActivityPostCreated(android.app.Activity, android.os.Bundle);
- method public default void onActivityPostDestroyed(android.app.Activity);
- method public default void onActivityPostPaused(android.app.Activity);
- method public default void onActivityPostResumed(android.app.Activity);
- method public default void onActivityPostSaveInstanceState(android.app.Activity, android.os.Bundle);
- method public default void onActivityPostStarted(android.app.Activity);
- method public default void onActivityPostStopped(android.app.Activity);
- method public default void onActivityPreCreated(android.app.Activity, android.os.Bundle);
- method public default void onActivityPreDestroyed(android.app.Activity);
- method public default void onActivityPrePaused(android.app.Activity);
- method public default void onActivityPreResumed(android.app.Activity);
- method public default void onActivityPreSaveInstanceState(android.app.Activity, android.os.Bundle);
- method public default void onActivityPreStarted(android.app.Activity);
- method public default void onActivityPreStopped(android.app.Activity);
- method public abstract void onActivityResumed(android.app.Activity);
- method public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle);
- method public abstract void onActivityStarted(android.app.Activity);
- method public abstract void onActivityStopped(android.app.Activity);
- }
-
- public static abstract interface Application.OnProvideAssistDataListener {
- method public abstract void onProvideAssistData(android.app.Activity, android.os.Bundle);
+ public static interface Application.ActivityLifecycleCallbacks {
+ method public void onActivityCreated(@NonNull android.app.Activity, @Nullable android.os.Bundle);
+ method public void onActivityDestroyed(@NonNull android.app.Activity);
+ method public void onActivityPaused(@NonNull android.app.Activity);
+ method public default void onActivityPostCreated(@NonNull android.app.Activity, @Nullable android.os.Bundle);
+ method public default void onActivityPostDestroyed(@NonNull android.app.Activity);
+ method public default void onActivityPostPaused(@NonNull android.app.Activity);
+ method public default void onActivityPostResumed(@NonNull android.app.Activity);
+ method public default void onActivityPostSaveInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle);
+ method public default void onActivityPostStarted(@NonNull android.app.Activity);
+ method public default void onActivityPostStopped(@NonNull android.app.Activity);
+ method public default void onActivityPreCreated(@NonNull android.app.Activity, @Nullable android.os.Bundle);
+ method public default void onActivityPreDestroyed(@NonNull android.app.Activity);
+ method public default void onActivityPrePaused(@NonNull android.app.Activity);
+ method public default void onActivityPreResumed(@NonNull android.app.Activity);
+ method public default void onActivityPreSaveInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle);
+ method public default void onActivityPreStarted(@NonNull android.app.Activity);
+ method public default void onActivityPreStopped(@NonNull android.app.Activity);
+ method public void onActivityResumed(@NonNull android.app.Activity);
+ method public void onActivitySaveInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle);
+ method public void onActivityStarted(@NonNull android.app.Activity);
+ method public void onActivityStopped(@NonNull android.app.Activity);
+ }
+
+ public static interface Application.OnProvideAssistDataListener {
+ method public void onProvideAssistData(android.app.Activity, android.os.Bundle);
}
public class ApplicationErrorReport implements android.os.Parcelable {
ctor public ApplicationErrorReport();
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
- method public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
+ method public void dump(android.util.Printer, String);
+ method public static android.content.ComponentName getErrorReportReceiver(android.content.Context, String, int);
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ApplicationErrorReport> CREATOR;
@@ -4371,9 +4374,9 @@ package android.app {
field public android.app.ApplicationErrorReport.AnrInfo anrInfo;
field public android.app.ApplicationErrorReport.BatteryInfo batteryInfo;
field public android.app.ApplicationErrorReport.CrashInfo crashInfo;
- field public java.lang.String installerPackageName;
- field public java.lang.String packageName;
- field public java.lang.String processName;
+ field public String installerPackageName;
+ field public String packageName;
+ field public String processName;
field public android.app.ApplicationErrorReport.RunningServiceInfo runningServiceInfo;
field public boolean systemApp;
field public long time;
@@ -4383,50 +4386,50 @@ package android.app {
public static class ApplicationErrorReport.AnrInfo {
ctor public ApplicationErrorReport.AnrInfo();
ctor public ApplicationErrorReport.AnrInfo(android.os.Parcel);
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String activity;
- field public java.lang.String cause;
- field public java.lang.String info;
+ field public String activity;
+ field public String cause;
+ field public String info;
}
public static class ApplicationErrorReport.BatteryInfo {
ctor public ApplicationErrorReport.BatteryInfo();
ctor public ApplicationErrorReport.BatteryInfo(android.os.Parcel);
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String checkinDetails;
+ field public String checkinDetails;
field public long durationMicros;
- field public java.lang.String usageDetails;
+ field public String usageDetails;
field public int usagePercent;
}
public static class ApplicationErrorReport.CrashInfo {
ctor public ApplicationErrorReport.CrashInfo();
- ctor public ApplicationErrorReport.CrashInfo(java.lang.Throwable);
+ ctor public ApplicationErrorReport.CrashInfo(Throwable);
ctor public ApplicationErrorReport.CrashInfo(android.os.Parcel);
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String exceptionClassName;
- field public java.lang.String exceptionMessage;
- field public java.lang.String stackTrace;
- field public java.lang.String throwClassName;
- field public java.lang.String throwFileName;
+ field public String exceptionClassName;
+ field public String exceptionMessage;
+ field public String stackTrace;
+ field public String throwClassName;
+ field public String throwFileName;
field public int throwLineNumber;
- field public java.lang.String throwMethodName;
+ field public String throwMethodName;
}
public static class ApplicationErrorReport.RunningServiceInfo {
ctor public ApplicationErrorReport.RunningServiceInfo();
ctor public ApplicationErrorReport.RunningServiceInfo(android.os.Parcel);
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public void writeToParcel(android.os.Parcel, int);
field public long durationMillis;
- field public java.lang.String serviceDetails;
+ field public String serviceDetails;
}
public final class AuthenticationRequiredException extends java.lang.SecurityException implements android.os.Parcelable {
- ctor public AuthenticationRequiredException(java.lang.Throwable, android.app.PendingIntent);
+ ctor public AuthenticationRequiredException(Throwable, android.app.PendingIntent);
method public int describeContents();
method public android.app.PendingIntent getUserAction();
method public void writeToParcel(android.os.Parcel, int);
@@ -4434,15 +4437,15 @@ package android.app {
}
public final class AutomaticZenRule implements android.os.Parcelable {
- ctor public deprecated AutomaticZenRule(java.lang.String, android.content.ComponentName, android.net.Uri, int, boolean);
- ctor public AutomaticZenRule(java.lang.String, android.content.ComponentName, android.content.ComponentName, android.net.Uri, android.service.notification.ZenPolicy, int, boolean);
+ ctor @Deprecated public AutomaticZenRule(String, android.content.ComponentName, android.net.Uri, int, boolean);
+ ctor public AutomaticZenRule(String, android.content.ComponentName, android.content.ComponentName, android.net.Uri, android.service.notification.ZenPolicy, int, boolean);
ctor public AutomaticZenRule(android.os.Parcel);
method public int describeContents();
method public android.net.Uri getConditionId();
method public android.content.ComponentName getConfigurationActivity();
method public long getCreationTime();
method public int getInterruptionFilter();
- method public java.lang.String getName();
+ method public String getName();
method public android.content.ComponentName getOwner();
method public android.service.notification.ZenPolicy getZenPolicy();
method public boolean isEnabled();
@@ -4450,171 +4453,172 @@ package android.app {
method public void setConfigurationActivity(android.content.ComponentName);
method public void setEnabled(boolean);
method public void setInterruptionFilter(int);
- method public void setName(java.lang.String);
+ method public void setName(String);
method public void setZenPolicy(android.service.notification.ZenPolicy);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.AutomaticZenRule> CREATOR;
}
public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {
- ctor public DatePickerDialog(android.content.Context);
- ctor public DatePickerDialog(android.content.Context, int);
- ctor public DatePickerDialog(android.content.Context, android.app.DatePickerDialog.OnDateSetListener, int, int, int);
- ctor public DatePickerDialog(android.content.Context, int, android.app.DatePickerDialog.OnDateSetListener, int, int, int);
- method public android.widget.DatePicker getDatePicker();
- method public void onClick(android.content.DialogInterface, int);
- method public void onDateChanged(android.widget.DatePicker, int, int, int);
- method public void setOnDateSetListener(android.app.DatePickerDialog.OnDateSetListener);
+ ctor public DatePickerDialog(@NonNull android.content.Context);
+ ctor public DatePickerDialog(@NonNull android.content.Context, @StyleRes int);
+ ctor public DatePickerDialog(@NonNull android.content.Context, @Nullable android.app.DatePickerDialog.OnDateSetListener, int, int, int);
+ ctor public DatePickerDialog(@NonNull android.content.Context, @StyleRes int, @Nullable android.app.DatePickerDialog.OnDateSetListener, int, int, int);
+ method @NonNull public android.widget.DatePicker getDatePicker();
+ method public void onClick(@NonNull android.content.DialogInterface, int);
+ method public void onDateChanged(@NonNull android.widget.DatePicker, int, int, int);
+ method public void setOnDateSetListener(@Nullable android.app.DatePickerDialog.OnDateSetListener);
method public void updateDate(int, int, int);
}
- public static abstract interface DatePickerDialog.OnDateSetListener {
- method public abstract void onDateSet(android.widget.DatePicker, int, int, int);
+ public static interface DatePickerDialog.OnDateSetListener {
+ method public void onDateSet(android.widget.DatePicker, int, int, int);
}
public class Dialog implements android.content.DialogInterface android.view.KeyEvent.Callback android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
- ctor public Dialog(android.content.Context);
- ctor public Dialog(android.content.Context, int);
- ctor protected Dialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
- method public void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+ ctor public Dialog(@NonNull android.content.Context);
+ ctor public Dialog(@NonNull android.content.Context, @StyleRes int);
+ ctor protected Dialog(@NonNull android.content.Context, boolean, @Nullable android.content.DialogInterface.OnCancelListener);
+ method public void addContentView(@NonNull android.view.View, @Nullable android.view.ViewGroup.LayoutParams);
method public void cancel();
method public void closeOptionsMenu();
method public void create();
method public void dismiss();
- method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- method public boolean dispatchKeyEvent(android.view.KeyEvent);
- method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public boolean dispatchTouchEvent(android.view.MotionEvent);
- method public boolean dispatchTrackballEvent(android.view.MotionEvent);
- method public <T extends android.view.View> T findViewById(int);
- method public android.app.ActionBar getActionBar();
- method public final android.content.Context getContext();
- method public android.view.View getCurrentFocus();
- method public android.view.LayoutInflater getLayoutInflater();
- method public final android.app.Activity getOwnerActivity();
- method public final android.view.SearchEvent getSearchEvent();
+ method public boolean dispatchGenericMotionEvent(@NonNull android.view.MotionEvent);
+ method public boolean dispatchKeyEvent(@NonNull android.view.KeyEvent);
+ method public boolean dispatchKeyShortcutEvent(@NonNull android.view.KeyEvent);
+ method public boolean dispatchPopulateAccessibilityEvent(@NonNull android.view.accessibility.AccessibilityEvent);
+ method public boolean dispatchTouchEvent(@NonNull android.view.MotionEvent);
+ method public boolean dispatchTrackballEvent(@NonNull android.view.MotionEvent);
+ method public <T extends android.view.View> T findViewById(@IdRes int);
+ method @Nullable public android.app.ActionBar getActionBar();
+ method @NonNull public final android.content.Context getContext();
+ method @Nullable public android.view.View getCurrentFocus();
+ method @NonNull public android.view.LayoutInflater getLayoutInflater();
+ method @Nullable public final android.app.Activity getOwnerActivity();
+ method @Nullable public final android.view.SearchEvent getSearchEvent();
method public final int getVolumeControlStream();
- method public android.view.Window getWindow();
+ method @Nullable public android.view.Window getWindow();
method public void hide();
method public void invalidateOptionsMenu();
method public boolean isShowing();
- method public void onActionModeFinished(android.view.ActionMode);
- method public void onActionModeStarted(android.view.ActionMode);
+ method @CallSuper public void onActionModeFinished(android.view.ActionMode);
+ method @CallSuper public void onActionModeStarted(android.view.ActionMode);
method public void onAttachedToWindow();
method public void onBackPressed();
method public void onContentChanged();
- method public boolean onContextItemSelected(android.view.MenuItem);
- method public void onContextMenuClosed(android.view.Menu);
+ method public boolean onContextItemSelected(@NonNull android.view.MenuItem);
+ method public void onContextMenuClosed(@NonNull android.view.Menu);
method protected void onCreate(android.os.Bundle);
method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
- method public boolean onCreateOptionsMenu(android.view.Menu);
- method public boolean onCreatePanelMenu(int, android.view.Menu);
+ method public boolean onCreateOptionsMenu(@NonNull android.view.Menu);
+ method public boolean onCreatePanelMenu(int, @NonNull android.view.Menu);
method public android.view.View onCreatePanelView(int);
method public void onDetachedFromWindow();
- method public boolean onGenericMotionEvent(android.view.MotionEvent);
- method public boolean onKeyDown(int, android.view.KeyEvent);
- method public boolean onKeyLongPress(int, android.view.KeyEvent);
- method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
- method public boolean onKeyShortcut(int, android.view.KeyEvent);
- method public boolean onKeyUp(int, android.view.KeyEvent);
- method public boolean onMenuItemSelected(int, android.view.MenuItem);
- method public boolean onMenuOpened(int, android.view.Menu);
- method public boolean onOptionsItemSelected(android.view.MenuItem);
- method public void onOptionsMenuClosed(android.view.Menu);
- method public void onPanelClosed(int, android.view.Menu);
- method public boolean onPrepareOptionsMenu(android.view.Menu);
- method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
- method public void onRestoreInstanceState(android.os.Bundle);
- method public android.os.Bundle onSaveInstanceState();
- method public boolean onSearchRequested(android.view.SearchEvent);
+ method public boolean onGenericMotionEvent(@NonNull android.view.MotionEvent);
+ method public boolean onKeyDown(int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyLongPress(int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyMultiple(int, int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyShortcut(int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyUp(int, @NonNull android.view.KeyEvent);
+ method public boolean onMenuItemSelected(int, @NonNull android.view.MenuItem);
+ method public boolean onMenuOpened(int, @NonNull android.view.Menu);
+ method public boolean onOptionsItemSelected(@NonNull android.view.MenuItem);
+ method public void onOptionsMenuClosed(@NonNull android.view.Menu);
+ method public void onPanelClosed(int, @NonNull android.view.Menu);
+ method public boolean onPrepareOptionsMenu(@NonNull android.view.Menu);
+ method public boolean onPreparePanel(int, @Nullable android.view.View, @NonNull android.view.Menu);
+ method public void onRestoreInstanceState(@NonNull android.os.Bundle);
+ method @NonNull public android.os.Bundle onSaveInstanceState();
+ method public boolean onSearchRequested(@NonNull android.view.SearchEvent);
method public boolean onSearchRequested();
method protected void onStart();
method protected void onStop();
- method public boolean onTouchEvent(android.view.MotionEvent);
- method public boolean onTrackballEvent(android.view.MotionEvent);
+ method public boolean onTouchEvent(@NonNull android.view.MotionEvent);
+ method public boolean onTrackballEvent(@NonNull android.view.MotionEvent);
method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
method public void onWindowFocusChanged(boolean);
method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
- method public void openContextMenu(android.view.View);
+ method public void openContextMenu(@NonNull android.view.View);
method public void openOptionsMenu();
- method public void registerForContextMenu(android.view.View);
+ method public void registerForContextMenu(@NonNull android.view.View);
method public final boolean requestWindowFeature(int);
- method public final <T extends android.view.View> T requireViewById(int);
- method public void setCancelMessage(android.os.Message);
+ method @NonNull public final <T extends android.view.View> T requireViewById(@IdRes int);
+ method public void setCancelMessage(@Nullable android.os.Message);
method public void setCancelable(boolean);
method public void setCanceledOnTouchOutside(boolean);
- method public void setContentView(int);
- method public void setContentView(android.view.View);
- method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
- method public void setDismissMessage(android.os.Message);
- method public final void setFeatureDrawable(int, android.graphics.drawable.Drawable);
+ method public void setContentView(@LayoutRes int);
+ method public void setContentView(@NonNull android.view.View);
+ method public void setContentView(@NonNull android.view.View, @Nullable android.view.ViewGroup.LayoutParams);
+ method public void setDismissMessage(@Nullable android.os.Message);
+ method public final void setFeatureDrawable(int, @Nullable android.graphics.drawable.Drawable);
method public final void setFeatureDrawableAlpha(int, int);
- method public final void setFeatureDrawableResource(int, int);
- method public final void setFeatureDrawableUri(int, android.net.Uri);
- method public void setOnCancelListener(android.content.DialogInterface.OnCancelListener);
- method public void setOnDismissListener(android.content.DialogInterface.OnDismissListener);
- method public void setOnKeyListener(android.content.DialogInterface.OnKeyListener);
- method public void setOnShowListener(android.content.DialogInterface.OnShowListener);
- method public final void setOwnerActivity(android.app.Activity);
- method public void setTitle(java.lang.CharSequence);
- method public void setTitle(int);
+ method public final void setFeatureDrawableResource(int, @DrawableRes int);
+ method public final void setFeatureDrawableUri(int, @Nullable android.net.Uri);
+ method public void setOnCancelListener(@Nullable android.content.DialogInterface.OnCancelListener);
+ method public void setOnDismissListener(@Nullable android.content.DialogInterface.OnDismissListener);
+ method public void setOnKeyListener(@Nullable android.content.DialogInterface.OnKeyListener);
+ method public void setOnShowListener(@Nullable android.content.DialogInterface.OnShowListener);
+ method public final void setOwnerActivity(@NonNull android.app.Activity);
+ method public void setTitle(@Nullable CharSequence);
+ method public void setTitle(@StringRes int);
method public final void setVolumeControlStream(int);
method public void show();
method public void takeKeyEvents(boolean);
- method public void unregisterForContextMenu(android.view.View);
- }
-
- public deprecated class DialogFragment extends android.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
- ctor public DialogFragment();
- method public void dismiss();
- method public void dismissAllowingStateLoss();
- method public android.app.Dialog getDialog();
- method public boolean getShowsDialog();
- method public int getTheme();
- method public boolean isCancelable();
- method public void onCancel(android.content.DialogInterface);
- method public android.app.Dialog onCreateDialog(android.os.Bundle);
- method public void onDismiss(android.content.DialogInterface);
- method public void setCancelable(boolean);
- method public void setShowsDialog(boolean);
- method public void setStyle(int, int);
- method public void show(android.app.FragmentManager, java.lang.String);
- method public int show(android.app.FragmentTransaction, java.lang.String);
- field public static final int STYLE_NORMAL = 0; // 0x0
- field public static final int STYLE_NO_FRAME = 2; // 0x2
- field public static final int STYLE_NO_INPUT = 3; // 0x3
- field public static final int STYLE_NO_TITLE = 1; // 0x1
+ method public void unregisterForContextMenu(@NonNull android.view.View);
+ }
+
+ @Deprecated public class DialogFragment extends android.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+ ctor @Deprecated public DialogFragment();
+ method @Deprecated public void dismiss();
+ method @Deprecated public void dismissAllowingStateLoss();
+ method @Deprecated public android.app.Dialog getDialog();
+ method @Deprecated public boolean getShowsDialog();
+ method @Deprecated public int getTheme();
+ method @Deprecated public boolean isCancelable();
+ method @Deprecated public void onCancel(android.content.DialogInterface);
+ method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle);
+ method @Deprecated public void onDismiss(android.content.DialogInterface);
+ method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+ method @Deprecated public void setCancelable(boolean);
+ method @Deprecated public void setShowsDialog(boolean);
+ method @Deprecated public void setStyle(int, int);
+ method @Deprecated public void show(android.app.FragmentManager, String);
+ method @Deprecated public int show(android.app.FragmentTransaction, String);
+ field @Deprecated public static final int STYLE_NORMAL = 0; // 0x0
+ field @Deprecated public static final int STYLE_NO_FRAME = 2; // 0x2
+ field @Deprecated public static final int STYLE_NO_INPUT = 3; // 0x3
+ field @Deprecated public static final int STYLE_NO_TITLE = 1; // 0x1
}
public class DownloadManager {
- method public long addCompletedDownload(java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, long, boolean);
- method public long addCompletedDownload(java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, long, boolean, android.net.Uri, android.net.Uri);
+ method public long addCompletedDownload(String, String, boolean, String, String, long, boolean);
+ method public long addCompletedDownload(String, String, boolean, String, String, long, boolean, android.net.Uri, android.net.Uri);
method public long enqueue(android.app.DownloadManager.Request);
- method public static java.lang.Long getMaxBytesOverMobile(android.content.Context);
- method public java.lang.String getMimeTypeForDownloadedFile(long);
- method public static java.lang.Long getRecommendedMaxBytesOverMobile(android.content.Context);
+ method public static Long getMaxBytesOverMobile(android.content.Context);
+ method public String getMimeTypeForDownloadedFile(long);
+ method public static Long getRecommendedMaxBytesOverMobile(android.content.Context);
method public android.net.Uri getUriForDownloadedFile(long);
method public android.os.ParcelFileDescriptor openDownloadedFile(long) throws java.io.FileNotFoundException;
method public android.database.Cursor query(android.app.DownloadManager.Query);
method public int remove(long...);
- field public static final java.lang.String ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE";
- field public static final java.lang.String ACTION_NOTIFICATION_CLICKED = "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED";
- field public static final java.lang.String ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS";
- field public static final java.lang.String COLUMN_BYTES_DOWNLOADED_SO_FAR = "bytes_so_far";
- field public static final java.lang.String COLUMN_DESCRIPTION = "description";
- field public static final java.lang.String COLUMN_ID = "_id";
- field public static final java.lang.String COLUMN_LAST_MODIFIED_TIMESTAMP = "last_modified_timestamp";
- field public static final deprecated java.lang.String COLUMN_LOCAL_FILENAME = "local_filename";
- field public static final java.lang.String COLUMN_LOCAL_URI = "local_uri";
- field public static final java.lang.String COLUMN_MEDIAPROVIDER_URI = "mediaprovider_uri";
- field public static final java.lang.String COLUMN_MEDIA_TYPE = "media_type";
- field public static final java.lang.String COLUMN_REASON = "reason";
- field public static final java.lang.String COLUMN_STATUS = "status";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_TOTAL_SIZE_BYTES = "total_size";
- field public static final java.lang.String COLUMN_URI = "uri";
+ field public static final String ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE";
+ field public static final String ACTION_NOTIFICATION_CLICKED = "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED";
+ field public static final String ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS";
+ field public static final String COLUMN_BYTES_DOWNLOADED_SO_FAR = "bytes_so_far";
+ field public static final String COLUMN_DESCRIPTION = "description";
+ field public static final String COLUMN_ID = "_id";
+ field public static final String COLUMN_LAST_MODIFIED_TIMESTAMP = "last_modified_timestamp";
+ field @Deprecated public static final String COLUMN_LOCAL_FILENAME = "local_filename";
+ field public static final String COLUMN_LOCAL_URI = "local_uri";
+ field public static final String COLUMN_MEDIAPROVIDER_URI = "mediaprovider_uri";
+ field public static final String COLUMN_MEDIA_TYPE = "media_type";
+ field public static final String COLUMN_REASON = "reason";
+ field public static final String COLUMN_STATUS = "status";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_TOTAL_SIZE_BYTES = "total_size";
+ field public static final String COLUMN_URI = "uri";
field public static final int ERROR_CANNOT_RESUME = 1008; // 0x3f0
field public static final int ERROR_DEVICE_NOT_FOUND = 1007; // 0x3ef
field public static final int ERROR_FILE_ALREADY_EXISTS = 1009; // 0x3f1
@@ -4624,9 +4628,9 @@ package android.app {
field public static final int ERROR_TOO_MANY_REDIRECTS = 1005; // 0x3ed
field public static final int ERROR_UNHANDLED_HTTP_CODE = 1002; // 0x3ea
field public static final int ERROR_UNKNOWN = 1000; // 0x3e8
- field public static final java.lang.String EXTRA_DOWNLOAD_ID = "extra_download_id";
- field public static final java.lang.String EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS = "extra_click_download_ids";
- field public static final java.lang.String INTENT_EXTRAS_SORT_BY_SIZE = "android.app.DownloadManager.extra_sortBySize";
+ field public static final String EXTRA_DOWNLOAD_ID = "extra_download_id";
+ field public static final String EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS = "extra_click_download_ids";
+ field public static final String INTENT_EXTRAS_SORT_BY_SIZE = "android.app.DownloadManager.extra_sortBySize";
field public static final int PAUSED_QUEUED_FOR_WIFI = 3; // 0x3
field public static final int PAUSED_UNKNOWN = 4; // 0x4
field public static final int PAUSED_WAITING_FOR_NETWORK = 2; // 0x2
@@ -4646,21 +4650,21 @@ package android.app {
public static class DownloadManager.Request {
ctor public DownloadManager.Request(android.net.Uri);
- method public android.app.DownloadManager.Request addRequestHeader(java.lang.String, java.lang.String);
+ method public android.app.DownloadManager.Request addRequestHeader(String, String);
method public void allowScanningByMediaScanner();
method public android.app.DownloadManager.Request setAllowedNetworkTypes(int);
method public android.app.DownloadManager.Request setAllowedOverMetered(boolean);
method public android.app.DownloadManager.Request setAllowedOverRoaming(boolean);
- method public android.app.DownloadManager.Request setDescription(java.lang.CharSequence);
- method public android.app.DownloadManager.Request setDestinationInExternalFilesDir(android.content.Context, java.lang.String, java.lang.String);
- method public android.app.DownloadManager.Request setDestinationInExternalPublicDir(java.lang.String, java.lang.String);
+ method public android.app.DownloadManager.Request setDescription(CharSequence);
+ method public android.app.DownloadManager.Request setDestinationInExternalFilesDir(android.content.Context, String, String);
+ method public android.app.DownloadManager.Request setDestinationInExternalPublicDir(String, String);
method public android.app.DownloadManager.Request setDestinationUri(android.net.Uri);
- method public android.app.DownloadManager.Request setMimeType(java.lang.String);
+ method public android.app.DownloadManager.Request setMimeType(String);
method public android.app.DownloadManager.Request setNotificationVisibility(int);
method public android.app.DownloadManager.Request setRequiresCharging(boolean);
method public android.app.DownloadManager.Request setRequiresDeviceIdle(boolean);
- method public deprecated android.app.DownloadManager.Request setShowRunningNotification(boolean);
- method public android.app.DownloadManager.Request setTitle(java.lang.CharSequence);
+ method @Deprecated public android.app.DownloadManager.Request setShowRunningNotification(boolean);
+ method public android.app.DownloadManager.Request setTitle(CharSequence);
method public android.app.DownloadManager.Request setVisibleInDownloadsUi(boolean);
field public static final int NETWORK_MOBILE = 1; // 0x1
field public static final int NETWORK_WIFI = 2; // 0x2
@@ -4684,314 +4688,314 @@ package android.app {
method public void setSelectedGroup(int);
}
- public deprecated class Fragment implements android.content.ComponentCallbacks2 android.view.View.OnCreateContextMenuListener {
- ctor public Fragment();
- method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public final boolean equals(java.lang.Object);
- method public final android.app.Activity getActivity();
- method public boolean getAllowEnterTransitionOverlap();
- method public boolean getAllowReturnTransitionOverlap();
- method public final android.os.Bundle getArguments();
- method public final android.app.FragmentManager getChildFragmentManager();
- method public android.content.Context getContext();
- method public android.transition.Transition getEnterTransition();
- method public android.transition.Transition getExitTransition();
- method public final android.app.FragmentManager getFragmentManager();
- method public final java.lang.Object getHost();
- method public final int getId();
- method public final android.view.LayoutInflater getLayoutInflater();
- method public deprecated android.app.LoaderManager getLoaderManager();
- method public final android.app.Fragment getParentFragment();
- method public android.transition.Transition getReenterTransition();
- method public final android.content.res.Resources getResources();
- method public final boolean getRetainInstance();
- method public android.transition.Transition getReturnTransition();
- method public android.transition.Transition getSharedElementEnterTransition();
- method public android.transition.Transition getSharedElementReturnTransition();
- method public final java.lang.String getString(int);
- method public final java.lang.String getString(int, java.lang.Object...);
- method public final java.lang.String getTag();
- method public final android.app.Fragment getTargetFragment();
- method public final int getTargetRequestCode();
- method public final java.lang.CharSequence getText(int);
- method public boolean getUserVisibleHint();
- method public android.view.View getView();
- method public final int hashCode();
- method public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
- method public static android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
- method public final boolean isAdded();
- method public final boolean isDetached();
- method public final boolean isHidden();
- method public final boolean isInLayout();
- method public final boolean isRemoving();
- method public final boolean isResumed();
- method public final boolean isStateSaved();
- method public final boolean isVisible();
- method public void onActivityCreated(android.os.Bundle);
- method public void onActivityResult(int, int, android.content.Intent);
- method public void onAttach(android.content.Context);
- method public deprecated void onAttach(android.app.Activity);
- method public void onAttachFragment(android.app.Fragment);
- method public void onConfigurationChanged(android.content.res.Configuration);
- method public boolean onContextItemSelected(android.view.MenuItem);
- method public void onCreate(android.os.Bundle);
- method public android.animation.Animator onCreateAnimator(int, boolean, int);
- method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
- method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
- method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
- method public void onDestroy();
- method public void onDestroyOptionsMenu();
- method public void onDestroyView();
- method public void onDetach();
- method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
- method public void onHiddenChanged(boolean);
- method public deprecated void onInflate(android.util.AttributeSet, android.os.Bundle);
- method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
- method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
- method public void onLowMemory();
- method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
- method public deprecated void onMultiWindowModeChanged(boolean);
- method public boolean onOptionsItemSelected(android.view.MenuItem);
- method public void onOptionsMenuClosed(android.view.Menu);
- method public void onPause();
- method public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
- method public deprecated void onPictureInPictureModeChanged(boolean);
- method public void onPrepareOptionsMenu(android.view.Menu);
- method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
- method public void onResume();
- method public void onSaveInstanceState(android.os.Bundle);
- method public void onStart();
- method public void onStop();
- method public void onTrimMemory(int);
- method public void onViewCreated(android.view.View, android.os.Bundle);
- method public void onViewStateRestored(android.os.Bundle);
- method public void postponeEnterTransition();
- method public void registerForContextMenu(android.view.View);
- method public final void requestPermissions(java.lang.String[], int);
- method public void setAllowEnterTransitionOverlap(boolean);
- method public void setAllowReturnTransitionOverlap(boolean);
- method public void setArguments(android.os.Bundle);
- method public void setEnterSharedElementCallback(android.app.SharedElementCallback);
- method public void setEnterTransition(android.transition.Transition);
- method public void setExitSharedElementCallback(android.app.SharedElementCallback);
- method public void setExitTransition(android.transition.Transition);
- method public void setHasOptionsMenu(boolean);
- method public void setInitialSavedState(android.app.Fragment.SavedState);
- method public void setMenuVisibility(boolean);
- method public void setReenterTransition(android.transition.Transition);
- method public void setRetainInstance(boolean);
- method public void setReturnTransition(android.transition.Transition);
- method public void setSharedElementEnterTransition(android.transition.Transition);
- method public void setSharedElementReturnTransition(android.transition.Transition);
- method public void setTargetFragment(android.app.Fragment, int);
- method public void setUserVisibleHint(boolean);
- method public boolean shouldShowRequestPermissionRationale(java.lang.String);
- method public void startActivity(android.content.Intent);
- method public void startActivity(android.content.Intent, android.os.Bundle);
- method public void startActivityForResult(android.content.Intent, int);
- method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
- method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
- method public void startPostponedEnterTransition();
- method public void unregisterForContextMenu(android.view.View);
- }
-
- public static deprecated class Fragment.InstantiationException extends android.util.AndroidRuntimeException {
- ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
- }
-
- public static deprecated class Fragment.SavedState implements android.os.Parcelable {
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.ClassLoaderCreator<android.app.Fragment.SavedState> CREATOR;
- }
-
- public deprecated class FragmentBreadCrumbs extends android.view.ViewGroup implements android.app.FragmentManager.OnBackStackChangedListener {
- ctor public FragmentBreadCrumbs(android.content.Context);
- ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet);
- ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet, int);
- method public void onBackStackChanged();
- method public void setActivity(android.app.Activity);
- method public void setMaxVisible(int);
- method public void setOnBreadCrumbClickListener(android.app.FragmentBreadCrumbs.OnBreadCrumbClickListener);
- method public void setParentTitle(java.lang.CharSequence, java.lang.CharSequence, android.view.View.OnClickListener);
- method public void setTitle(java.lang.CharSequence, java.lang.CharSequence);
- }
-
- public static abstract deprecated interface FragmentBreadCrumbs.OnBreadCrumbClickListener {
- method public abstract boolean onBreadCrumbClick(android.app.FragmentManager.BackStackEntry, int);
- }
-
- public abstract deprecated class FragmentContainer {
- ctor public FragmentContainer();
- method public abstract <T extends android.view.View> T onFindViewById(int);
- method public abstract boolean onHasView();
- }
-
- public deprecated class FragmentController {
- method public void attachHost(android.app.Fragment);
- method public static final android.app.FragmentController createController(android.app.FragmentHostCallback<?>);
- method public void dispatchActivityCreated();
- method public void dispatchConfigurationChanged(android.content.res.Configuration);
- method public boolean dispatchContextItemSelected(android.view.MenuItem);
- method public void dispatchCreate();
- method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
- method public void dispatchDestroy();
- method public void dispatchDestroyView();
- method public void dispatchLowMemory();
- method public deprecated void dispatchMultiWindowModeChanged(boolean);
- method public void dispatchMultiWindowModeChanged(boolean, android.content.res.Configuration);
- method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
- method public void dispatchOptionsMenuClosed(android.view.Menu);
- method public void dispatchPause();
- method public deprecated void dispatchPictureInPictureModeChanged(boolean);
- method public void dispatchPictureInPictureModeChanged(boolean, android.content.res.Configuration);
- method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
- method public void dispatchResume();
- method public void dispatchStart();
- method public void dispatchStop();
- method public void dispatchTrimMemory(int);
- method public void doLoaderDestroy();
- method public void doLoaderStart();
- method public void doLoaderStop(boolean);
- method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public boolean execPendingActions();
- method public android.app.Fragment findFragmentByWho(java.lang.String);
- method public android.app.FragmentManager getFragmentManager();
- method public android.app.LoaderManager getLoaderManager();
- method public void noteStateNotSaved();
- method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
- method public void reportLoaderStart();
- method public deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.app.Fragment>);
- method public void restoreAllState(android.os.Parcelable, android.app.FragmentManagerNonConfig);
- method public void restoreLoaderNonConfig(android.util.ArrayMap<java.lang.String, android.app.LoaderManager>);
- method public android.util.ArrayMap<java.lang.String, android.app.LoaderManager> retainLoaderNonConfig();
- method public android.app.FragmentManagerNonConfig retainNestedNonConfig();
- method public deprecated java.util.List<android.app.Fragment> retainNonConfig();
- method public android.os.Parcelable saveAllState();
- }
-
- public abstract deprecated class FragmentHostCallback<E> extends android.app.FragmentContainer {
- ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
- method public void onAttachFragment(android.app.Fragment);
- method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public <T extends android.view.View> T onFindViewById(int);
- method public abstract E onGetHost();
- method public android.view.LayoutInflater onGetLayoutInflater();
- method public int onGetWindowAnimations();
- method public boolean onHasView();
- method public boolean onHasWindowAnimations();
- method public void onInvalidateOptionsMenu();
- method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
- method public boolean onShouldSaveFragmentState(android.app.Fragment);
- method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
- method public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
- method public boolean onUseFragmentManagerInflaterFactory();
- }
-
- public abstract deprecated class FragmentManager {
- ctor public FragmentManager();
- method public abstract void addOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener);
- method public abstract android.app.FragmentTransaction beginTransaction();
- method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public static void enableDebugLogging(boolean);
- method public abstract boolean executePendingTransactions();
- method public abstract android.app.Fragment findFragmentById(int);
- method public abstract android.app.Fragment findFragmentByTag(java.lang.String);
- method public abstract android.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
- method public abstract int getBackStackEntryCount();
- method public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
- method public abstract java.util.List<android.app.Fragment> getFragments();
- method public abstract android.app.Fragment getPrimaryNavigationFragment();
- method public void invalidateOptionsMenu();
- method public abstract boolean isDestroyed();
- method public abstract boolean isStateSaved();
- method public abstract void popBackStack();
- method public abstract void popBackStack(java.lang.String, int);
- method public abstract void popBackStack(int, int);
- method public abstract boolean popBackStackImmediate();
- method public abstract boolean popBackStackImmediate(java.lang.String, int);
- method public abstract boolean popBackStackImmediate(int, int);
- method public abstract void putFragment(android.os.Bundle, java.lang.String, android.app.Fragment);
- method public abstract void registerFragmentLifecycleCallbacks(android.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
- method public abstract void removeOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener);
- method public abstract android.app.Fragment.SavedState saveFragmentInstanceState(android.app.Fragment);
- method public abstract void unregisterFragmentLifecycleCallbacks(android.app.FragmentManager.FragmentLifecycleCallbacks);
- field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
- }
-
- public static abstract deprecated interface FragmentManager.BackStackEntry {
- method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
- method public abstract int getBreadCrumbShortTitleRes();
- method public abstract java.lang.CharSequence getBreadCrumbTitle();
- method public abstract int getBreadCrumbTitleRes();
- method public abstract int getId();
- method public abstract java.lang.String getName();
- }
-
- public static abstract deprecated class FragmentManager.FragmentLifecycleCallbacks {
- ctor public FragmentManager.FragmentLifecycleCallbacks();
- method public void onFragmentActivityCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- method public void onFragmentAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
- method public void onFragmentCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- method public void onFragmentDestroyed(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
- method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentStopped(android.app.FragmentManager, android.app.Fragment);
- method public void onFragmentViewCreated(android.app.FragmentManager, android.app.Fragment, android.view.View, android.os.Bundle);
- method public void onFragmentViewDestroyed(android.app.FragmentManager, android.app.Fragment);
- }
-
- public static abstract deprecated interface FragmentManager.OnBackStackChangedListener {
- method public abstract void onBackStackChanged();
- }
-
- public deprecated class FragmentManagerNonConfig {
- }
-
- public abstract deprecated class FragmentTransaction {
- ctor public FragmentTransaction();
- method public abstract android.app.FragmentTransaction add(android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction add(int, android.app.Fragment);
- method public abstract android.app.FragmentTransaction add(int, android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
- method public abstract android.app.FragmentTransaction addToBackStack(java.lang.String);
- method public abstract android.app.FragmentTransaction attach(android.app.Fragment);
- method public abstract int commit();
- method public abstract int commitAllowingStateLoss();
- method public abstract void commitNow();
- method public abstract void commitNowAllowingStateLoss();
- method public abstract android.app.FragmentTransaction detach(android.app.Fragment);
- method public abstract android.app.FragmentTransaction disallowAddToBackStack();
- method public abstract android.app.FragmentTransaction hide(android.app.Fragment);
- method public abstract boolean isAddToBackStackAllowed();
- method public abstract boolean isEmpty();
- method public abstract android.app.FragmentTransaction remove(android.app.Fragment);
- method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
- method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
- method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
- method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
- method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
- method public abstract android.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
- method public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
- method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
- method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
- method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
- method public abstract android.app.FragmentTransaction setTransition(int);
- method public abstract android.app.FragmentTransaction setTransitionStyle(int);
- method public abstract android.app.FragmentTransaction show(android.app.Fragment);
- field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
- field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
- field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
- field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
- field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
- field public static final int TRANSIT_NONE = 0; // 0x0
- field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+ @Deprecated public class Fragment implements android.content.ComponentCallbacks2 android.view.View.OnCreateContextMenuListener {
+ ctor @Deprecated public Fragment();
+ method @Deprecated public void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated public final boolean equals(Object);
+ method @Deprecated public final android.app.Activity getActivity();
+ method @Deprecated public boolean getAllowEnterTransitionOverlap();
+ method @Deprecated public boolean getAllowReturnTransitionOverlap();
+ method @Deprecated public final android.os.Bundle getArguments();
+ method @Deprecated public final android.app.FragmentManager getChildFragmentManager();
+ method @Deprecated public android.content.Context getContext();
+ method @Deprecated public android.transition.Transition getEnterTransition();
+ method @Deprecated public android.transition.Transition getExitTransition();
+ method @Deprecated public final android.app.FragmentManager getFragmentManager();
+ method @Deprecated @Nullable public final Object getHost();
+ method @Deprecated public final int getId();
+ method @Deprecated public final android.view.LayoutInflater getLayoutInflater();
+ method @Deprecated public android.app.LoaderManager getLoaderManager();
+ method @Deprecated public final android.app.Fragment getParentFragment();
+ method @Deprecated public android.transition.Transition getReenterTransition();
+ method @Deprecated public final android.content.res.Resources getResources();
+ method @Deprecated public final boolean getRetainInstance();
+ method @Deprecated public android.transition.Transition getReturnTransition();
+ method @Deprecated public android.transition.Transition getSharedElementEnterTransition();
+ method @Deprecated public android.transition.Transition getSharedElementReturnTransition();
+ method @Deprecated public final String getString(@StringRes int);
+ method @Deprecated public final String getString(@StringRes int, java.lang.Object...);
+ method @Deprecated public final String getTag();
+ method @Deprecated public final android.app.Fragment getTargetFragment();
+ method @Deprecated public final int getTargetRequestCode();
+ method @Deprecated public final CharSequence getText(@StringRes int);
+ method @Deprecated public boolean getUserVisibleHint();
+ method @Deprecated @Nullable public android.view.View getView();
+ method @Deprecated public final int hashCode();
+ method @Deprecated public static android.app.Fragment instantiate(android.content.Context, String);
+ method @Deprecated public static android.app.Fragment instantiate(android.content.Context, String, @Nullable android.os.Bundle);
+ method @Deprecated public final boolean isAdded();
+ method @Deprecated public final boolean isDetached();
+ method @Deprecated public final boolean isHidden();
+ method @Deprecated public final boolean isInLayout();
+ method @Deprecated public final boolean isRemoving();
+ method @Deprecated public final boolean isResumed();
+ method @Deprecated public final boolean isStateSaved();
+ method @Deprecated public final boolean isVisible();
+ method @Deprecated @CallSuper public void onActivityCreated(@Nullable android.os.Bundle);
+ method @Deprecated public void onActivityResult(int, int, android.content.Intent);
+ method @Deprecated @CallSuper public void onAttach(android.content.Context);
+ method @Deprecated @CallSuper public void onAttach(android.app.Activity);
+ method @Deprecated public void onAttachFragment(android.app.Fragment);
+ method @Deprecated @CallSuper public void onConfigurationChanged(android.content.res.Configuration);
+ method @Deprecated public boolean onContextItemSelected(android.view.MenuItem);
+ method @Deprecated @CallSuper public void onCreate(@Nullable android.os.Bundle);
+ method @Deprecated public android.animation.Animator onCreateAnimator(int, boolean, int);
+ method @Deprecated public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
+ method @Deprecated public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+ method @Deprecated @Nullable public android.view.View onCreateView(android.view.LayoutInflater, @Nullable android.view.ViewGroup, android.os.Bundle);
+ method @Deprecated @CallSuper public void onDestroy();
+ method @Deprecated public void onDestroyOptionsMenu();
+ method @Deprecated @CallSuper public void onDestroyView();
+ method @Deprecated @CallSuper public void onDetach();
+ method @Deprecated public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+ method @Deprecated public void onHiddenChanged(boolean);
+ method @Deprecated @CallSuper public void onInflate(android.util.AttributeSet, android.os.Bundle);
+ method @Deprecated @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
+ method @Deprecated @CallSuper public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
+ method @Deprecated @CallSuper public void onLowMemory();
+ method @Deprecated public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
+ method @Deprecated public void onMultiWindowModeChanged(boolean);
+ method @Deprecated public boolean onOptionsItemSelected(android.view.MenuItem);
+ method @Deprecated public void onOptionsMenuClosed(android.view.Menu);
+ method @Deprecated @CallSuper public void onPause();
+ method @Deprecated public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
+ method @Deprecated public void onPictureInPictureModeChanged(boolean);
+ method @Deprecated public void onPrepareOptionsMenu(android.view.Menu);
+ method @Deprecated public void onRequestPermissionsResult(int, @NonNull String[], @NonNull int[]);
+ method @Deprecated @CallSuper public void onResume();
+ method @Deprecated public void onSaveInstanceState(android.os.Bundle);
+ method @Deprecated @CallSuper public void onStart();
+ method @Deprecated @CallSuper public void onStop();
+ method @Deprecated @CallSuper public void onTrimMemory(int);
+ method @Deprecated public void onViewCreated(android.view.View, @Nullable android.os.Bundle);
+ method @Deprecated @CallSuper public void onViewStateRestored(android.os.Bundle);
+ method @Deprecated public void postponeEnterTransition();
+ method @Deprecated public void registerForContextMenu(android.view.View);
+ method @Deprecated public final void requestPermissions(@NonNull String[], int);
+ method @Deprecated public void setAllowEnterTransitionOverlap(boolean);
+ method @Deprecated public void setAllowReturnTransitionOverlap(boolean);
+ method @Deprecated public void setArguments(android.os.Bundle);
+ method @Deprecated public void setEnterSharedElementCallback(android.app.SharedElementCallback);
+ method @Deprecated public void setEnterTransition(android.transition.Transition);
+ method @Deprecated public void setExitSharedElementCallback(android.app.SharedElementCallback);
+ method @Deprecated public void setExitTransition(android.transition.Transition);
+ method @Deprecated public void setHasOptionsMenu(boolean);
+ method @Deprecated public void setInitialSavedState(android.app.Fragment.SavedState);
+ method @Deprecated public void setMenuVisibility(boolean);
+ method @Deprecated public void setReenterTransition(android.transition.Transition);
+ method @Deprecated public void setRetainInstance(boolean);
+ method @Deprecated public void setReturnTransition(android.transition.Transition);
+ method @Deprecated public void setSharedElementEnterTransition(android.transition.Transition);
+ method @Deprecated public void setSharedElementReturnTransition(android.transition.Transition);
+ method @Deprecated public void setTargetFragment(android.app.Fragment, int);
+ method @Deprecated public void setUserVisibleHint(boolean);
+ method @Deprecated public boolean shouldShowRequestPermissionRationale(@NonNull String);
+ method @Deprecated public void startActivity(android.content.Intent);
+ method @Deprecated public void startActivity(android.content.Intent, android.os.Bundle);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method @Deprecated public void startPostponedEnterTransition();
+ method @Deprecated public void unregisterForContextMenu(android.view.View);
+ }
+
+ @Deprecated public static class Fragment.InstantiationException extends android.util.AndroidRuntimeException {
+ ctor @Deprecated public Fragment.InstantiationException(String, Exception);
+ }
+
+ @Deprecated public static class Fragment.SavedState implements android.os.Parcelable {
+ method @Deprecated public int describeContents();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.ClassLoaderCreator<android.app.Fragment.SavedState> CREATOR;
+ }
+
+ @Deprecated public class FragmentBreadCrumbs extends android.view.ViewGroup implements android.app.FragmentManager.OnBackStackChangedListener {
+ ctor @Deprecated public FragmentBreadCrumbs(android.content.Context);
+ ctor @Deprecated public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet, int);
+ method @Deprecated public void onBackStackChanged();
+ method @Deprecated public void setActivity(android.app.Activity);
+ method @Deprecated public void setMaxVisible(int);
+ method @Deprecated public void setOnBreadCrumbClickListener(android.app.FragmentBreadCrumbs.OnBreadCrumbClickListener);
+ method @Deprecated public void setParentTitle(CharSequence, CharSequence, android.view.View.OnClickListener);
+ method @Deprecated public void setTitle(CharSequence, CharSequence);
+ }
+
+ @Deprecated public static interface FragmentBreadCrumbs.OnBreadCrumbClickListener {
+ method @Deprecated public boolean onBreadCrumbClick(android.app.FragmentManager.BackStackEntry, int);
+ }
+
+ @Deprecated public abstract class FragmentContainer {
+ ctor @Deprecated public FragmentContainer();
+ method @Deprecated @Nullable public abstract <T extends android.view.View> T onFindViewById(@IdRes int);
+ method @Deprecated public abstract boolean onHasView();
+ }
+
+ @Deprecated public class FragmentController {
+ method @Deprecated public void attachHost(android.app.Fragment);
+ method @Deprecated public static final android.app.FragmentController createController(android.app.FragmentHostCallback<?>);
+ method @Deprecated public void dispatchActivityCreated();
+ method @Deprecated public void dispatchConfigurationChanged(android.content.res.Configuration);
+ method @Deprecated public boolean dispatchContextItemSelected(android.view.MenuItem);
+ method @Deprecated public void dispatchCreate();
+ method @Deprecated public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+ method @Deprecated public void dispatchDestroy();
+ method @Deprecated public void dispatchDestroyView();
+ method @Deprecated public void dispatchLowMemory();
+ method @Deprecated public void dispatchMultiWindowModeChanged(boolean);
+ method @Deprecated public void dispatchMultiWindowModeChanged(boolean, android.content.res.Configuration);
+ method @Deprecated public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+ method @Deprecated public void dispatchOptionsMenuClosed(android.view.Menu);
+ method @Deprecated public void dispatchPause();
+ method @Deprecated public void dispatchPictureInPictureModeChanged(boolean);
+ method @Deprecated public void dispatchPictureInPictureModeChanged(boolean, android.content.res.Configuration);
+ method @Deprecated public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+ method @Deprecated public void dispatchResume();
+ method @Deprecated public void dispatchStart();
+ method @Deprecated public void dispatchStop();
+ method @Deprecated public void dispatchTrimMemory(int);
+ method @Deprecated public void doLoaderDestroy();
+ method @Deprecated public void doLoaderStart();
+ method @Deprecated public void doLoaderStop(boolean);
+ method @Deprecated public void dumpLoaders(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated public boolean execPendingActions();
+ method @Deprecated @Nullable public android.app.Fragment findFragmentByWho(String);
+ method @Deprecated public android.app.FragmentManager getFragmentManager();
+ method @Deprecated public android.app.LoaderManager getLoaderManager();
+ method @Deprecated public void noteStateNotSaved();
+ method @Deprecated public android.view.View onCreateView(android.view.View, String, android.content.Context, android.util.AttributeSet);
+ method @Deprecated public void reportLoaderStart();
+ method @Deprecated public void restoreAllState(android.os.Parcelable, java.util.List<android.app.Fragment>);
+ method @Deprecated public void restoreAllState(android.os.Parcelable, android.app.FragmentManagerNonConfig);
+ method @Deprecated public void restoreLoaderNonConfig(android.util.ArrayMap<java.lang.String,android.app.LoaderManager>);
+ method @Deprecated public android.util.ArrayMap<java.lang.String,android.app.LoaderManager> retainLoaderNonConfig();
+ method @Deprecated public android.app.FragmentManagerNonConfig retainNestedNonConfig();
+ method @Deprecated public java.util.List<android.app.Fragment> retainNonConfig();
+ method @Deprecated public android.os.Parcelable saveAllState();
+ }
+
+ @Deprecated public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer {
+ ctor @Deprecated public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+ method @Deprecated public void onAttachFragment(android.app.Fragment);
+ method @Deprecated public void onDump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated @Nullable public <T extends android.view.View> T onFindViewById(int);
+ method @Deprecated @Nullable public abstract E onGetHost();
+ method @Deprecated public android.view.LayoutInflater onGetLayoutInflater();
+ method @Deprecated public int onGetWindowAnimations();
+ method @Deprecated public boolean onHasView();
+ method @Deprecated public boolean onHasWindowAnimations();
+ method @Deprecated public void onInvalidateOptionsMenu();
+ method @Deprecated public void onRequestPermissionsFromFragment(@NonNull android.app.Fragment, @NonNull String[], int);
+ method @Deprecated public boolean onShouldSaveFragmentState(android.app.Fragment);
+ method @Deprecated public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
+ method @Deprecated public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method @Deprecated public boolean onUseFragmentManagerInflaterFactory();
+ }
+
+ @Deprecated public abstract class FragmentManager {
+ ctor @Deprecated public FragmentManager();
+ method @Deprecated public abstract void addOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener);
+ method @Deprecated public abstract android.app.FragmentTransaction beginTransaction();
+ method @Deprecated public abstract void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated public static void enableDebugLogging(boolean);
+ method @Deprecated public abstract boolean executePendingTransactions();
+ method @Deprecated public abstract android.app.Fragment findFragmentById(int);
+ method @Deprecated public abstract android.app.Fragment findFragmentByTag(String);
+ method @Deprecated public abstract android.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+ method @Deprecated public abstract int getBackStackEntryCount();
+ method @Deprecated public abstract android.app.Fragment getFragment(android.os.Bundle, String);
+ method @Deprecated public abstract java.util.List<android.app.Fragment> getFragments();
+ method @Deprecated public abstract android.app.Fragment getPrimaryNavigationFragment();
+ method @Deprecated public void invalidateOptionsMenu();
+ method @Deprecated public abstract boolean isDestroyed();
+ method @Deprecated public abstract boolean isStateSaved();
+ method @Deprecated public abstract void popBackStack();
+ method @Deprecated public abstract void popBackStack(String, int);
+ method @Deprecated public abstract void popBackStack(int, int);
+ method @Deprecated public abstract boolean popBackStackImmediate();
+ method @Deprecated public abstract boolean popBackStackImmediate(String, int);
+ method @Deprecated public abstract boolean popBackStackImmediate(int, int);
+ method @Deprecated public abstract void putFragment(android.os.Bundle, String, android.app.Fragment);
+ method @Deprecated public abstract void registerFragmentLifecycleCallbacks(android.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+ method @Deprecated public abstract void removeOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener);
+ method @Deprecated public abstract android.app.Fragment.SavedState saveFragmentInstanceState(android.app.Fragment);
+ method @Deprecated public abstract void unregisterFragmentLifecycleCallbacks(android.app.FragmentManager.FragmentLifecycleCallbacks);
+ field @Deprecated public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+ }
+
+ @Deprecated public static interface FragmentManager.BackStackEntry {
+ method @Deprecated public CharSequence getBreadCrumbShortTitle();
+ method @Deprecated public int getBreadCrumbShortTitleRes();
+ method @Deprecated public CharSequence getBreadCrumbTitle();
+ method @Deprecated public int getBreadCrumbTitleRes();
+ method @Deprecated public int getId();
+ method @Deprecated public String getName();
+ }
+
+ @Deprecated public abstract static class FragmentManager.FragmentLifecycleCallbacks {
+ ctor @Deprecated public FragmentManager.FragmentLifecycleCallbacks();
+ method @Deprecated public void onFragmentActivityCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
+ method @Deprecated public void onFragmentAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
+ method @Deprecated public void onFragmentCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
+ method @Deprecated public void onFragmentDestroyed(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
+ method @Deprecated public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
+ method @Deprecated public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
+ method @Deprecated public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentStopped(android.app.FragmentManager, android.app.Fragment);
+ method @Deprecated public void onFragmentViewCreated(android.app.FragmentManager, android.app.Fragment, android.view.View, android.os.Bundle);
+ method @Deprecated public void onFragmentViewDestroyed(android.app.FragmentManager, android.app.Fragment);
+ }
+
+ @Deprecated public static interface FragmentManager.OnBackStackChangedListener {
+ method @Deprecated public void onBackStackChanged();
+ }
+
+ @Deprecated public class FragmentManagerNonConfig {
+ }
+
+ @Deprecated public abstract class FragmentTransaction {
+ ctor @Deprecated public FragmentTransaction();
+ method @Deprecated public abstract android.app.FragmentTransaction add(android.app.Fragment, String);
+ method @Deprecated public abstract android.app.FragmentTransaction add(@IdRes int, android.app.Fragment);
+ method @Deprecated public abstract android.app.FragmentTransaction add(@IdRes int, android.app.Fragment, String);
+ method @Deprecated public abstract android.app.FragmentTransaction addSharedElement(android.view.View, String);
+ method @Deprecated public abstract android.app.FragmentTransaction addToBackStack(@Nullable String);
+ method @Deprecated public abstract android.app.FragmentTransaction attach(android.app.Fragment);
+ method @Deprecated public abstract int commit();
+ method @Deprecated public abstract int commitAllowingStateLoss();
+ method @Deprecated public abstract void commitNow();
+ method @Deprecated public abstract void commitNowAllowingStateLoss();
+ method @Deprecated public abstract android.app.FragmentTransaction detach(android.app.Fragment);
+ method @Deprecated public abstract android.app.FragmentTransaction disallowAddToBackStack();
+ method @Deprecated public abstract android.app.FragmentTransaction hide(android.app.Fragment);
+ method @Deprecated public abstract boolean isAddToBackStackAllowed();
+ method @Deprecated public abstract boolean isEmpty();
+ method @Deprecated public abstract android.app.FragmentTransaction remove(android.app.Fragment);
+ method @Deprecated public abstract android.app.FragmentTransaction replace(@IdRes int, android.app.Fragment);
+ method @Deprecated public abstract android.app.FragmentTransaction replace(@IdRes int, android.app.Fragment, String);
+ method @Deprecated public abstract android.app.FragmentTransaction runOnCommit(Runnable);
+ method @Deprecated public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(@StringRes int);
+ method @Deprecated public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(CharSequence);
+ method @Deprecated public abstract android.app.FragmentTransaction setBreadCrumbTitle(@StringRes int);
+ method @Deprecated public abstract android.app.FragmentTransaction setBreadCrumbTitle(CharSequence);
+ method @Deprecated public abstract android.app.FragmentTransaction setCustomAnimations(@AnimatorRes int, @AnimatorRes int);
+ method @Deprecated public abstract android.app.FragmentTransaction setCustomAnimations(@AnimatorRes int, @AnimatorRes int, @AnimatorRes int, @AnimatorRes int);
+ method @Deprecated public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
+ method @Deprecated public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
+ method @Deprecated public abstract android.app.FragmentTransaction setTransition(int);
+ method @Deprecated public abstract android.app.FragmentTransaction setTransitionStyle(@StyleRes int);
+ method @Deprecated public abstract android.app.FragmentTransaction show(android.app.Fragment);
+ field @Deprecated public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+ field @Deprecated public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+ field @Deprecated public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+ field @Deprecated public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+ field @Deprecated public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+ field @Deprecated public static final int TRANSIT_NONE = 0; // 0x0
+ field @Deprecated public static final int TRANSIT_UNSET = -1; // 0xffffffff
}
public class Instrumentation {
@@ -4999,21 +5003,21 @@ package android.app {
method public android.os.TestLooperManager acquireLooperManager(android.os.Looper);
method public void addMonitor(android.app.Instrumentation.ActivityMonitor);
method public android.app.Instrumentation.ActivityMonitor addMonitor(android.content.IntentFilter, android.app.Instrumentation.ActivityResult, boolean);
- method public android.app.Instrumentation.ActivityMonitor addMonitor(java.lang.String, android.app.Instrumentation.ActivityResult, boolean);
+ method public android.app.Instrumentation.ActivityMonitor addMonitor(String, android.app.Instrumentation.ActivityResult, boolean);
method public void addResults(android.os.Bundle);
method public void callActivityOnCreate(android.app.Activity, android.os.Bundle);
method public void callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
method public void callActivityOnDestroy(android.app.Activity);
method public void callActivityOnNewIntent(android.app.Activity, android.content.Intent);
method public void callActivityOnPause(android.app.Activity);
- method public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle);
- method public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
+ method public void callActivityOnPostCreate(@NonNull android.app.Activity, @Nullable android.os.Bundle);
+ method public void callActivityOnPostCreate(@NonNull android.app.Activity, @Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
method public void callActivityOnRestart(android.app.Activity);
- method public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle);
- method public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
+ method public void callActivityOnRestoreInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle);
+ method public void callActivityOnRestoreInstanceState(@NonNull android.app.Activity, @Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
method public void callActivityOnResume(android.app.Activity);
- method public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle);
- method public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
+ method public void callActivityOnSaveInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle);
+ method public void callActivityOnSaveInstanceState(@NonNull android.app.Activity, @NonNull android.os.Bundle, @NonNull android.os.PersistableBundle);
method public void callActivityOnStart(android.app.Activity);
method public void callActivityOnStop(android.app.Activity);
method public void callActivityOnUserLeaving(android.app.Activity);
@@ -5025,51 +5029,51 @@ package android.app {
method public android.os.Bundle getBinderCounts();
method public android.content.ComponentName getComponentName();
method public android.content.Context getContext();
- method public java.lang.String getProcessName();
+ method public String getProcessName();
method public android.content.Context getTargetContext();
method public android.app.UiAutomation getUiAutomation();
method public android.app.UiAutomation getUiAutomation(int);
method public boolean invokeContextMenuAction(android.app.Activity, int, int);
method public boolean invokeMenuActionSync(android.app.Activity, int, int);
method public boolean isProfiling();
- method public android.app.Activity newActivity(java.lang.Class<?>, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, java.lang.CharSequence, android.app.Activity, java.lang.String, java.lang.Object) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public android.app.Activity newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public android.app.Application newApplication(java.lang.ClassLoader, java.lang.String, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public static android.app.Application newApplication(java.lang.Class<?>, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity newActivity(Class<?>, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, CharSequence, android.app.Activity, String, Object) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity newActivity(ClassLoader, String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Application newApplication(ClassLoader, String, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public static android.app.Application newApplication(Class<?>, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
method public void onCreate(android.os.Bundle);
method public void onDestroy();
- method public boolean onException(java.lang.Object, java.lang.Throwable);
+ method public boolean onException(Object, Throwable);
method public void onStart();
method public void removeMonitor(android.app.Instrumentation.ActivityMonitor);
- method public void runOnMainSync(java.lang.Runnable);
+ method public void runOnMainSync(Runnable);
method public void sendCharacterSync(int);
method public void sendKeyDownUpSync(int);
method public void sendKeySync(android.view.KeyEvent);
method public void sendPointerSync(android.view.MotionEvent);
method public void sendStatus(int, android.os.Bundle);
- method public void sendStringSync(java.lang.String);
+ method public void sendStringSync(String);
method public void sendTrackballEventSync(android.view.MotionEvent);
method public void setAutomaticPerformanceSnapshots();
method public void setInTouchMode(boolean);
method public void start();
method public android.app.Activity startActivitySync(android.content.Intent);
- method public android.app.Activity startActivitySync(android.content.Intent, android.os.Bundle);
- method public deprecated void startAllocCounting();
+ method @NonNull public android.app.Activity startActivitySync(@NonNull android.content.Intent, @Nullable android.os.Bundle);
+ method @Deprecated public void startAllocCounting();
method public void startPerformanceSnapshot();
method public void startProfiling();
- method public deprecated void stopAllocCounting();
+ method @Deprecated public void stopAllocCounting();
method public void stopProfiling();
- method public void waitForIdle(java.lang.Runnable);
+ method public void waitForIdle(Runnable);
method public void waitForIdleSync();
method public android.app.Activity waitForMonitor(android.app.Instrumentation.ActivityMonitor);
method public android.app.Activity waitForMonitorWithTimeout(android.app.Instrumentation.ActivityMonitor, long);
- field public static final java.lang.String REPORT_KEY_IDENTIFIER = "id";
- field public static final java.lang.String REPORT_KEY_STREAMRESULT = "stream";
+ field public static final String REPORT_KEY_IDENTIFIER = "id";
+ field public static final String REPORT_KEY_STREAMRESULT = "stream";
}
public static class Instrumentation.ActivityMonitor {
ctor public Instrumentation.ActivityMonitor(android.content.IntentFilter, android.app.Instrumentation.ActivityResult, boolean);
- ctor public Instrumentation.ActivityMonitor(java.lang.String, android.app.Instrumentation.ActivityResult, boolean);
+ ctor public Instrumentation.ActivityMonitor(String, android.app.Instrumentation.ActivityResult, boolean);
ctor public Instrumentation.ActivityMonitor();
method public final android.content.IntentFilter getFilter();
method public final int getHits();
@@ -5088,39 +5092,39 @@ package android.app {
}
public abstract class IntentService extends android.app.Service {
- ctor public IntentService(java.lang.String);
- method public android.os.IBinder onBind(android.content.Intent);
- method protected abstract void onHandleIntent(android.content.Intent);
- method public void onStart(android.content.Intent, int);
+ ctor public IntentService(String);
+ method @Nullable public android.os.IBinder onBind(android.content.Intent);
+ method @WorkerThread protected abstract void onHandleIntent(@Nullable android.content.Intent);
+ method public void onStart(@Nullable android.content.Intent, int);
method public void setIntentRedelivery(boolean);
}
public class KeyguardManager {
- method public android.content.Intent createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence);
- method public deprecated void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
- method public deprecated boolean inKeyguardRestrictedInputMode();
+ method public android.content.Intent createConfirmDeviceCredentialIntent(CharSequence, CharSequence);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.DISABLE_KEYGUARD) public void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
+ method @Deprecated public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
method public boolean isDeviceSecure();
method public boolean isKeyguardLocked();
method public boolean isKeyguardSecure();
- method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
- method public void requestDismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback);
+ method @Deprecated public android.app.KeyguardManager.KeyguardLock newKeyguardLock(String);
+ method public void requestDismissKeyguard(@NonNull android.app.Activity, @Nullable android.app.KeyguardManager.KeyguardDismissCallback);
}
- public static abstract class KeyguardManager.KeyguardDismissCallback {
+ public abstract static class KeyguardManager.KeyguardDismissCallback {
ctor public KeyguardManager.KeyguardDismissCallback();
method public void onDismissCancelled();
method public void onDismissError();
method public void onDismissSucceeded();
}
- public deprecated class KeyguardManager.KeyguardLock {
- method public void disableKeyguard();
- method public void reenableKeyguard();
+ @Deprecated public class KeyguardManager.KeyguardLock {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.DISABLE_KEYGUARD) public void disableKeyguard();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.DISABLE_KEYGUARD) public void reenableKeyguard();
}
- public static abstract deprecated interface KeyguardManager.OnKeyguardExitResult {
- method public abstract void onKeyguardExitResult(boolean);
+ @Deprecated public static interface KeyguardManager.OnKeyguardExitResult {
+ method @Deprecated public void onKeyguardExitResult(boolean);
}
public abstract class LauncherActivity extends android.app.ListActivity {
@@ -5140,11 +5144,11 @@ package android.app {
public static class LauncherActivity.ListItem {
ctor public LauncherActivity.ListItem();
- field public java.lang.String className;
+ field public String className;
field public android.os.Bundle extras;
field public android.graphics.drawable.Drawable icon;
- field public java.lang.CharSequence label;
- field public java.lang.String packageName;
+ field public CharSequence label;
+ field public String packageName;
field public android.content.pm.ResolveInfo resolveInfo;
}
@@ -5159,50 +5163,50 @@ package android.app {
method public void setSelection(int);
}
- public deprecated class ListFragment extends android.app.Fragment {
- ctor public ListFragment();
- method public android.widget.ListAdapter getListAdapter();
- method public android.widget.ListView getListView();
- method public long getSelectedItemId();
- method public int getSelectedItemPosition();
- method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
- method public void setEmptyText(java.lang.CharSequence);
- method public void setListAdapter(android.widget.ListAdapter);
- method public void setListShown(boolean);
- method public void setListShownNoAnimation(boolean);
- method public void setSelection(int);
- }
-
- public abstract deprecated class LoaderManager {
- ctor public LoaderManager();
- method public abstract void destroyLoader(int);
- method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public static void enableDebugLogging(boolean);
- method public abstract <D> android.content.Loader<D> getLoader(int);
- method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
- method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
- }
-
- public static abstract deprecated interface LoaderManager.LoaderCallbacks<D> {
- method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle);
- method public abstract void onLoadFinished(android.content.Loader<D>, D);
- method public abstract void onLoaderReset(android.content.Loader<D>);
- }
-
- public deprecated class LocalActivityManager {
- ctor public LocalActivityManager(android.app.Activity, boolean);
- method public android.view.Window destroyActivity(java.lang.String, boolean);
- method public void dispatchCreate(android.os.Bundle);
- method public void dispatchDestroy(boolean);
- method public void dispatchPause(boolean);
- method public void dispatchResume();
- method public void dispatchStop();
- method public android.app.Activity getActivity(java.lang.String);
- method public android.app.Activity getCurrentActivity();
- method public java.lang.String getCurrentId();
- method public void removeAllActivities();
- method public android.os.Bundle saveInstanceState();
- method public android.view.Window startActivity(java.lang.String, android.content.Intent);
+ @Deprecated public class ListFragment extends android.app.Fragment {
+ ctor @Deprecated public ListFragment();
+ method @Deprecated public android.widget.ListAdapter getListAdapter();
+ method @Deprecated public android.widget.ListView getListView();
+ method @Deprecated public long getSelectedItemId();
+ method @Deprecated public int getSelectedItemPosition();
+ method @Deprecated public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+ method @Deprecated public void setEmptyText(CharSequence);
+ method @Deprecated public void setListAdapter(android.widget.ListAdapter);
+ method @Deprecated public void setListShown(boolean);
+ method @Deprecated public void setListShownNoAnimation(boolean);
+ method @Deprecated public void setSelection(int);
+ }
+
+ @Deprecated public abstract class LoaderManager {
+ ctor @Deprecated public LoaderManager();
+ method @Deprecated public abstract void destroyLoader(int);
+ method @Deprecated public abstract void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated public static void enableDebugLogging(boolean);
+ method @Deprecated public abstract <D> android.content.Loader<D> getLoader(int);
+ method @Deprecated public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+ method @Deprecated public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+ }
+
+ @Deprecated public static interface LoaderManager.LoaderCallbacks<D> {
+ method @Deprecated public android.content.Loader<D> onCreateLoader(int, android.os.Bundle);
+ method @Deprecated public void onLoadFinished(android.content.Loader<D>, D);
+ method @Deprecated public void onLoaderReset(android.content.Loader<D>);
+ }
+
+ @Deprecated public class LocalActivityManager {
+ ctor @Deprecated public LocalActivityManager(android.app.Activity, boolean);
+ method @Deprecated public android.view.Window destroyActivity(String, boolean);
+ method @Deprecated public void dispatchCreate(android.os.Bundle);
+ method @Deprecated public void dispatchDestroy(boolean);
+ method @Deprecated public void dispatchPause(boolean);
+ method @Deprecated public void dispatchResume();
+ method @Deprecated public void dispatchStop();
+ method @Deprecated public android.app.Activity getActivity(String);
+ method @Deprecated public android.app.Activity getCurrentActivity();
+ method @Deprecated public String getCurrentId();
+ method @Deprecated public void removeAllActivities();
+ method @Deprecated public android.os.Bundle saveInstanceState();
+ method @Deprecated public android.view.Window startActivity(String, android.content.Intent);
}
public class MediaRouteActionProvider extends android.view.ActionProvider {
@@ -5234,149 +5238,149 @@ package android.app {
method public void surfaceCreated(android.view.SurfaceHolder);
method public void surfaceDestroyed(android.view.SurfaceHolder);
method public void surfaceRedrawNeeded(android.view.SurfaceHolder);
- field public static final java.lang.String META_DATA_FUNC_NAME = "android.app.func_name";
- field public static final java.lang.String META_DATA_LIB_NAME = "android.app.lib_name";
+ field public static final String META_DATA_FUNC_NAME = "android.app.func_name";
+ field public static final String META_DATA_LIB_NAME = "android.app.lib_name";
}
public class Notification implements android.os.Parcelable {
ctor public Notification();
- ctor public deprecated Notification(int, java.lang.CharSequence, long);
+ ctor @Deprecated public Notification(int, CharSequence, long);
ctor public Notification(android.os.Parcel);
method public android.app.Notification clone();
method public int describeContents();
method public boolean getAllowSystemGeneratedContextualActions();
- method public android.app.PendingIntent getAppOverlayIntent();
method public int getBadgeIconType();
- method public java.lang.String getChannelId();
- method public java.lang.String getGroup();
+ method public android.app.Notification.BubbleMetadata getBubbleMetadata();
+ method public String getChannelId();
+ method public String getGroup();
method public int getGroupAlertBehavior();
method public android.graphics.drawable.Icon getLargeIcon();
- method public java.lang.CharSequence getSettingsText();
- method public java.lang.String getShortcutId();
+ method public CharSequence getSettingsText();
+ method public String getShortcutId();
method public android.graphics.drawable.Icon getSmallIcon();
- method public java.lang.String getSortKey();
+ method public String getSortKey();
method public long getTimeoutAfter();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final int BADGE_ICON_LARGE = 2; // 0x2
field public static final int BADGE_ICON_NONE = 0; // 0x0
field public static final int BADGE_ICON_SMALL = 1; // 0x1
- field public static final java.lang.String CATEGORY_ALARM = "alarm";
- field public static final java.lang.String CATEGORY_CALL = "call";
- field public static final java.lang.String CATEGORY_EMAIL = "email";
- field public static final java.lang.String CATEGORY_ERROR = "err";
- field public static final java.lang.String CATEGORY_EVENT = "event";
- field public static final java.lang.String CATEGORY_MESSAGE = "msg";
- field public static final java.lang.String CATEGORY_NAVIGATION = "navigation";
- field public static final java.lang.String CATEGORY_PROGRESS = "progress";
- field public static final java.lang.String CATEGORY_PROMO = "promo";
- field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
- field public static final java.lang.String CATEGORY_REMINDER = "reminder";
- field public static final java.lang.String CATEGORY_SERVICE = "service";
- field public static final java.lang.String CATEGORY_SOCIAL = "social";
- field public static final java.lang.String CATEGORY_STATUS = "status";
- field public static final java.lang.String CATEGORY_SYSTEM = "sys";
- field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
- field public static final int COLOR_DEFAULT = 0; // 0x0
+ field public static final String CATEGORY_ALARM = "alarm";
+ field public static final String CATEGORY_CALL = "call";
+ field public static final String CATEGORY_EMAIL = "email";
+ field public static final String CATEGORY_ERROR = "err";
+ field public static final String CATEGORY_EVENT = "event";
+ field public static final String CATEGORY_MESSAGE = "msg";
+ field public static final String CATEGORY_NAVIGATION = "navigation";
+ field public static final String CATEGORY_PROGRESS = "progress";
+ field public static final String CATEGORY_PROMO = "promo";
+ field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+ field public static final String CATEGORY_REMINDER = "reminder";
+ field public static final String CATEGORY_SERVICE = "service";
+ field public static final String CATEGORY_SOCIAL = "social";
+ field public static final String CATEGORY_STATUS = "status";
+ field public static final String CATEGORY_SYSTEM = "sys";
+ field public static final String CATEGORY_TRANSPORT = "transport";
+ field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
field public static final android.os.Parcelable.Creator<android.app.Notification> CREATOR;
field public static final int DEFAULT_ALL = -1; // 0xffffffff
field public static final int DEFAULT_LIGHTS = 4; // 0x4
field public static final int DEFAULT_SOUND = 1; // 0x1
field public static final int DEFAULT_VIBRATE = 2; // 0x2
- field public static final java.lang.String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
- field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
- field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
- field public static final java.lang.String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
- field public static final java.lang.String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
- field public static final java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
- field public static final java.lang.String EXTRA_COLORIZED = "android.colorized";
- field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
- field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
- field public static final java.lang.String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
- field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
- field public static final java.lang.String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
- field public static final deprecated java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
- field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
- field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
- field public static final java.lang.String EXTRA_MESSAGES = "android.messages";
- field public static final java.lang.String EXTRA_MESSAGING_PERSON = "android.messagingUser";
- field public static final java.lang.String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
- field public static final java.lang.String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
- field public static final deprecated java.lang.String EXTRA_PEOPLE = "android.people";
- field public static final java.lang.String EXTRA_PEOPLE_LIST = "android.people.list";
- field public static final java.lang.String EXTRA_PICTURE = "android.picture";
- field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
- field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
- field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
- field public static final java.lang.String EXTRA_REMOTE_INPUT_DRAFT = "android.remoteInputDraft";
- field public static final java.lang.String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
- field public static final deprecated java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
- field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
- field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
- field public static final deprecated java.lang.String EXTRA_SMALL_ICON = "android.icon";
- field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
- field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
- field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
- field public static final java.lang.String EXTRA_TEXT = "android.text";
- field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
- field public static final java.lang.String EXTRA_TITLE = "android.title";
- field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
+ field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+ field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+ field public static final String EXTRA_BIG_TEXT = "android.bigText";
+ field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+ field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+ field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+ field public static final String EXTRA_COLORIZED = "android.colorized";
+ field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+ field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+ field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+ field public static final String EXTRA_INFO_TEXT = "android.infoText";
+ field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+ field @Deprecated public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+ field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+ field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+ field public static final String EXTRA_MESSAGES = "android.messages";
+ field public static final String EXTRA_MESSAGING_PERSON = "android.messagingUser";
+ field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+ field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+ field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+ field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+ field public static final String EXTRA_PICTURE = "android.picture";
+ field public static final String EXTRA_PROGRESS = "android.progress";
+ field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+ field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+ field public static final String EXTRA_REMOTE_INPUT_DRAFT = "android.remoteInputDraft";
+ field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+ field @Deprecated public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+ field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+ field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+ field @Deprecated public static final String EXTRA_SMALL_ICON = "android.icon";
+ field public static final String EXTRA_SUB_TEXT = "android.subText";
+ field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+ field public static final String EXTRA_TEMPLATE = "android.template";
+ field public static final String EXTRA_TEXT = "android.text";
+ field public static final String EXTRA_TEXT_LINES = "android.textLines";
+ field public static final String EXTRA_TITLE = "android.title";
+ field public static final String EXTRA_TITLE_BIG = "android.title.big";
field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
- field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
field public static final int FLAG_INSISTENT = 4; // 0x4
field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
field public static final int FLAG_NO_CLEAR = 32; // 0x20
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
- field public static final deprecated int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field @Deprecated public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
field public static final int GROUP_ALERT_ALL = 0; // 0x0
field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
- field public static final java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
- field public static final deprecated int PRIORITY_DEFAULT = 0; // 0x0
- field public static final deprecated int PRIORITY_HIGH = 1; // 0x1
- field public static final deprecated int PRIORITY_LOW = -1; // 0xffffffff
- field public static final deprecated int PRIORITY_MAX = 2; // 0x2
- field public static final deprecated int PRIORITY_MIN = -2; // 0xfffffffe
- field public static final deprecated int STREAM_DEFAULT = -1; // 0xffffffff
+ field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+ field @Deprecated public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int PRIORITY_HIGH = 1; // 0x1
+ field @Deprecated public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field @Deprecated public static final int PRIORITY_MAX = 2; // 0x2
+ field @Deprecated public static final int PRIORITY_MIN = -2; // 0xfffffffe
+ field @Deprecated public static final int STREAM_DEFAULT = -1; // 0xffffffff
field public static final int VISIBILITY_PRIVATE = 0; // 0x0
field public static final int VISIBILITY_PUBLIC = 1; // 0x1
field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
field public android.app.Notification.Action[] actions;
- field public deprecated android.media.AudioAttributes audioAttributes;
- field public deprecated int audioStreamType;
- field public deprecated android.widget.RemoteViews bigContentView;
- field public java.lang.String category;
- field public int color;
+ field @Deprecated public android.media.AudioAttributes audioAttributes;
+ field @Deprecated public int audioStreamType;
+ field @Deprecated public android.widget.RemoteViews bigContentView;
+ field public String category;
+ field @ColorInt public int color;
field public android.app.PendingIntent contentIntent;
- field public deprecated android.widget.RemoteViews contentView;
- field public deprecated int defaults;
+ field @Deprecated public android.widget.RemoteViews contentView;
+ field @Deprecated public int defaults;
field public android.app.PendingIntent deleteIntent;
field public android.os.Bundle extras;
field public int flags;
field public android.app.PendingIntent fullScreenIntent;
- field public deprecated android.widget.RemoteViews headsUpContentView;
- field public deprecated int icon;
+ field @Deprecated public android.widget.RemoteViews headsUpContentView;
+ field @Deprecated @DrawableRes public int icon;
field public int iconLevel;
- field public deprecated android.graphics.Bitmap largeIcon;
- field public deprecated int ledARGB;
- field public deprecated int ledOffMS;
- field public deprecated int ledOnMS;
+ field @Deprecated public android.graphics.Bitmap largeIcon;
+ field @Deprecated @ColorInt public int ledARGB;
+ field @Deprecated public int ledOffMS;
+ field @Deprecated public int ledOnMS;
field public int number;
- field public deprecated int priority;
+ field @Deprecated public int priority;
field public android.app.Notification publicVersion;
- field public deprecated android.net.Uri sound;
- field public java.lang.CharSequence tickerText;
- field public deprecated android.widget.RemoteViews tickerView;
- field public deprecated long[] vibrate;
+ field @Deprecated public android.net.Uri sound;
+ field public CharSequence tickerText;
+ field @Deprecated public android.widget.RemoteViews tickerView;
+ field @Deprecated public long[] vibrate;
field public int visibility;
field public long when;
}
public static class Notification.Action implements android.os.Parcelable {
- ctor public deprecated Notification.Action(int, java.lang.CharSequence, android.app.PendingIntent);
+ ctor @Deprecated public Notification.Action(int, CharSequence, android.app.PendingIntent);
method public android.app.Notification.Action clone();
method public int describeContents();
method public boolean getAllowGeneratedReplies();
@@ -5385,11 +5389,11 @@ package android.app {
method public android.graphics.drawable.Icon getIcon();
method public android.app.RemoteInput[] getRemoteInputs();
method public int getSemanticAction();
+ method public boolean isContextual();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.Notification.Action> CREATOR;
field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
- field public static final int SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION = 11; // 0xb
field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
@@ -5400,13 +5404,13 @@ package android.app {
field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
field public android.app.PendingIntent actionIntent;
- field public deprecated int icon;
- field public java.lang.CharSequence title;
+ field @Deprecated public int icon;
+ field public CharSequence title;
}
public static final class Notification.Action.Builder {
- ctor public deprecated Notification.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
- ctor public Notification.Action.Builder(android.graphics.drawable.Icon, java.lang.CharSequence, android.app.PendingIntent);
+ ctor @Deprecated public Notification.Action.Builder(int, CharSequence, android.app.PendingIntent);
+ ctor public Notification.Action.Builder(android.graphics.drawable.Icon, CharSequence, android.app.PendingIntent);
ctor public Notification.Action.Builder(android.app.Notification.Action);
method public android.app.Notification.Action.Builder addExtras(android.os.Bundle);
method public android.app.Notification.Action.Builder addRemoteInput(android.app.RemoteInput);
@@ -5414,11 +5418,12 @@ package android.app {
method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Extender);
method public android.os.Bundle getExtras();
method public android.app.Notification.Action.Builder setAllowGeneratedReplies(boolean);
+ method public android.app.Notification.Action.Builder setContextual(boolean);
method public android.app.Notification.Action.Builder setSemanticAction(int);
}
- public static abstract interface Notification.Action.Extender {
- method public abstract android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
+ public static interface Notification.Action.Extender {
+ method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
}
public static final class Notification.Action.WearableExtender implements android.app.Notification.Action.Extender {
@@ -5426,45 +5431,64 @@ package android.app {
ctor public Notification.Action.WearableExtender(android.app.Notification.Action);
method public android.app.Notification.Action.WearableExtender clone();
method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
- method public deprecated java.lang.CharSequence getCancelLabel();
- method public deprecated java.lang.CharSequence getConfirmLabel();
+ method @Deprecated public CharSequence getCancelLabel();
+ method @Deprecated public CharSequence getConfirmLabel();
method public boolean getHintDisplayActionInline();
method public boolean getHintLaunchesActivity();
- method public deprecated java.lang.CharSequence getInProgressLabel();
+ method @Deprecated public CharSequence getInProgressLabel();
method public boolean isAvailableOffline();
method public android.app.Notification.Action.WearableExtender setAvailableOffline(boolean);
- method public deprecated android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
- method public deprecated android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+ method @Deprecated public android.app.Notification.Action.WearableExtender setCancelLabel(CharSequence);
+ method @Deprecated public android.app.Notification.Action.WearableExtender setConfirmLabel(CharSequence);
method public android.app.Notification.Action.WearableExtender setHintDisplayActionInline(boolean);
method public android.app.Notification.Action.WearableExtender setHintLaunchesActivity(boolean);
- method public deprecated android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
+ method @Deprecated public android.app.Notification.Action.WearableExtender setInProgressLabel(CharSequence);
}
public static class Notification.BigPictureStyle extends android.app.Notification.Style {
ctor public Notification.BigPictureStyle();
- ctor public deprecated Notification.BigPictureStyle(android.app.Notification.Builder);
+ ctor @Deprecated public Notification.BigPictureStyle(android.app.Notification.Builder);
method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon);
method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap);
- method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
- method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence);
+ method public android.app.Notification.BigPictureStyle setBigContentTitle(CharSequence);
+ method public android.app.Notification.BigPictureStyle setSummaryText(CharSequence);
}
public static class Notification.BigTextStyle extends android.app.Notification.Style {
ctor public Notification.BigTextStyle();
- ctor public deprecated Notification.BigTextStyle(android.app.Notification.Builder);
- method public android.app.Notification.BigTextStyle bigText(java.lang.CharSequence);
- method public android.app.Notification.BigTextStyle setBigContentTitle(java.lang.CharSequence);
- method public android.app.Notification.BigTextStyle setSummaryText(java.lang.CharSequence);
+ ctor @Deprecated public Notification.BigTextStyle(android.app.Notification.Builder);
+ method public android.app.Notification.BigTextStyle bigText(CharSequence);
+ method public android.app.Notification.BigTextStyle setBigContentTitle(CharSequence);
+ method public android.app.Notification.BigTextStyle setSummaryText(CharSequence);
+ }
+
+ public static final class Notification.BubbleMetadata implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getDesiredHeight();
+ method public android.graphics.drawable.Icon getIcon();
+ method public android.app.PendingIntent getIntent();
+ method public CharSequence getTitle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.Notification.BubbleMetadata> CREATOR;
+ }
+
+ public static class Notification.BubbleMetadata.Builder {
+ ctor public Notification.BubbleMetadata.Builder();
+ method public android.app.Notification.BubbleMetadata build();
+ method public android.app.Notification.BubbleMetadata.Builder setDesiredHeight(int);
+ method public android.app.Notification.BubbleMetadata.Builder setIcon(android.graphics.drawable.Icon);
+ method public android.app.Notification.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+ method public android.app.Notification.BubbleMetadata.Builder setTitle(CharSequence);
}
public static class Notification.Builder {
- ctor public Notification.Builder(android.content.Context, java.lang.String);
- ctor public deprecated Notification.Builder(android.content.Context);
- method public deprecated android.app.Notification.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
+ ctor public Notification.Builder(android.content.Context, String);
+ ctor @Deprecated public Notification.Builder(android.content.Context);
+ method @Deprecated public android.app.Notification.Builder addAction(int, CharSequence, android.app.PendingIntent);
method public android.app.Notification.Builder addAction(android.app.Notification.Action);
method public android.app.Notification.Builder addExtras(android.os.Bundle);
- method public deprecated android.app.Notification.Builder addPerson(java.lang.String);
+ method @Deprecated public android.app.Notification.Builder addPerson(String);
method public android.app.Notification.Builder addPerson(android.app.Person);
method public android.app.Notification build();
method public android.widget.RemoteViews createBigContentView();
@@ -5472,62 +5496,62 @@ package android.app {
method public android.widget.RemoteViews createHeadsUpContentView();
method public android.app.Notification.Builder extend(android.app.Notification.Extender);
method public android.os.Bundle getExtras();
- method public deprecated android.app.Notification getNotification();
+ method @Deprecated public android.app.Notification getNotification();
method public android.app.Notification.Style getStyle();
method public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification);
method public android.app.Notification.Builder setActions(android.app.Notification.Action...);
method public android.app.Notification.Builder setAllowSystemGeneratedContextualActions(boolean);
- method public android.app.Notification.Builder setAppOverlayIntent(android.app.PendingIntent);
method public android.app.Notification.Builder setAutoCancel(boolean);
method public android.app.Notification.Builder setBadgeIconType(int);
- method public android.app.Notification.Builder setCategory(java.lang.String);
- method public android.app.Notification.Builder setChannelId(java.lang.String);
+ method public android.app.Notification.Builder setBubbleMetadata(android.app.Notification.BubbleMetadata);
+ method public android.app.Notification.Builder setCategory(String);
+ method public android.app.Notification.Builder setChannelId(String);
method public android.app.Notification.Builder setChronometerCountDown(boolean);
- method public android.app.Notification.Builder setColor(int);
+ method public android.app.Notification.Builder setColor(@ColorInt int);
method public android.app.Notification.Builder setColorized(boolean);
- method public deprecated android.app.Notification.Builder setContent(android.widget.RemoteViews);
- method public deprecated android.app.Notification.Builder setContentInfo(java.lang.CharSequence);
+ method @Deprecated public android.app.Notification.Builder setContent(android.widget.RemoteViews);
+ method @Deprecated public android.app.Notification.Builder setContentInfo(CharSequence);
method public android.app.Notification.Builder setContentIntent(android.app.PendingIntent);
- method public android.app.Notification.Builder setContentText(java.lang.CharSequence);
- method public android.app.Notification.Builder setContentTitle(java.lang.CharSequence);
+ method public android.app.Notification.Builder setContentText(CharSequence);
+ method public android.app.Notification.Builder setContentTitle(CharSequence);
method public android.app.Notification.Builder setCustomBigContentView(android.widget.RemoteViews);
method public android.app.Notification.Builder setCustomContentView(android.widget.RemoteViews);
method public android.app.Notification.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
- method public deprecated android.app.Notification.Builder setDefaults(int);
+ method @Deprecated public android.app.Notification.Builder setDefaults(int);
method public android.app.Notification.Builder setDeleteIntent(android.app.PendingIntent);
method public android.app.Notification.Builder setExtras(android.os.Bundle);
method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
- method public android.app.Notification.Builder setGroup(java.lang.String);
+ method public android.app.Notification.Builder setGroup(String);
method public android.app.Notification.Builder setGroupAlertBehavior(int);
method public android.app.Notification.Builder setGroupSummary(boolean);
method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
- method public deprecated android.app.Notification.Builder setLights(int, int, int);
+ method @Deprecated public android.app.Notification.Builder setLights(@ColorInt int, int, int);
method public android.app.Notification.Builder setLocalOnly(boolean);
method public android.app.Notification.Builder setNumber(int);
method public android.app.Notification.Builder setOngoing(boolean);
method public android.app.Notification.Builder setOnlyAlertOnce(boolean);
- method public deprecated android.app.Notification.Builder setPriority(int);
+ method @Deprecated public android.app.Notification.Builder setPriority(int);
method public android.app.Notification.Builder setProgress(int, int, boolean);
method public android.app.Notification.Builder setPublicVersion(android.app.Notification);
- method public android.app.Notification.Builder setRemoteInputHistory(java.lang.CharSequence[]);
- method public android.app.Notification.Builder setSettingsText(java.lang.CharSequence);
- method public android.app.Notification.Builder setShortcutId(java.lang.String);
+ method public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]);
+ method public android.app.Notification.Builder setSettingsText(CharSequence);
+ method public android.app.Notification.Builder setShortcutId(String);
method public android.app.Notification.Builder setShowWhen(boolean);
- method public android.app.Notification.Builder setSmallIcon(int);
- method public android.app.Notification.Builder setSmallIcon(int, int);
+ method public android.app.Notification.Builder setSmallIcon(@DrawableRes int);
+ method public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int);
method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon);
- method public android.app.Notification.Builder setSortKey(java.lang.String);
- method public deprecated android.app.Notification.Builder setSound(android.net.Uri);
- method public deprecated android.app.Notification.Builder setSound(android.net.Uri, int);
- method public deprecated android.app.Notification.Builder setSound(android.net.Uri, android.media.AudioAttributes);
+ method public android.app.Notification.Builder setSortKey(String);
+ method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri);
+ method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, int);
+ method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, android.media.AudioAttributes);
method public android.app.Notification.Builder setStyle(android.app.Notification.Style);
- method public android.app.Notification.Builder setSubText(java.lang.CharSequence);
- method public android.app.Notification.Builder setTicker(java.lang.CharSequence);
- method public deprecated android.app.Notification.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
+ method public android.app.Notification.Builder setSubText(CharSequence);
+ method public android.app.Notification.Builder setTicker(CharSequence);
+ method @Deprecated public android.app.Notification.Builder setTicker(CharSequence, android.widget.RemoteViews);
method public android.app.Notification.Builder setTimeoutAfter(long);
method public android.app.Notification.Builder setUsesChronometer(boolean);
- method public deprecated android.app.Notification.Builder setVibrate(long[]);
+ method @Deprecated public android.app.Notification.Builder setVibrate(long[]);
method public android.app.Notification.Builder setVisibility(int);
method public android.app.Notification.Builder setWhen(long);
}
@@ -5536,17 +5560,17 @@ package android.app {
ctor public Notification.CarExtender();
ctor public Notification.CarExtender(android.app.Notification);
method public android.app.Notification.Builder extend(android.app.Notification.Builder);
- method public int getColor();
+ method @ColorInt public int getColor();
method public android.graphics.Bitmap getLargeIcon();
method public android.app.Notification.CarExtender.UnreadConversation getUnreadConversation();
- method public android.app.Notification.CarExtender setColor(int);
+ method public android.app.Notification.CarExtender setColor(@ColorInt int);
method public android.app.Notification.CarExtender setLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.CarExtender setUnreadConversation(android.app.Notification.CarExtender.UnreadConversation);
}
public static class Notification.CarExtender.Builder {
- ctor public Notification.CarExtender.Builder(java.lang.String);
- method public android.app.Notification.CarExtender.Builder addMessage(java.lang.String);
+ ctor public Notification.CarExtender.Builder(String);
+ method public android.app.Notification.CarExtender.Builder addMessage(String);
method public android.app.Notification.CarExtender.UnreadConversation build();
method public android.app.Notification.CarExtender.Builder setLatestTimestamp(long);
method public android.app.Notification.CarExtender.Builder setReadPendingIntent(android.app.PendingIntent);
@@ -5555,9 +5579,9 @@ package android.app {
public static class Notification.CarExtender.UnreadConversation {
method public long getLatestTimestamp();
- method public java.lang.String[] getMessages();
- method public java.lang.String getParticipant();
- method public java.lang.String[] getParticipants();
+ method public String[] getMessages();
+ method public String getParticipant();
+ method public String[] getParticipants();
method public android.app.PendingIntent getReadPendingIntent();
method public android.app.RemoteInput getRemoteInput();
method public android.app.PendingIntent getReplyPendingIntent();
@@ -5571,63 +5595,63 @@ package android.app {
ctor public Notification.DecoratedMediaCustomViewStyle();
}
- public static abstract interface Notification.Extender {
- method public abstract android.app.Notification.Builder extend(android.app.Notification.Builder);
+ public static interface Notification.Extender {
+ method public android.app.Notification.Builder extend(android.app.Notification.Builder);
}
public static class Notification.InboxStyle extends android.app.Notification.Style {
ctor public Notification.InboxStyle();
- ctor public deprecated Notification.InboxStyle(android.app.Notification.Builder);
- method public android.app.Notification.InboxStyle addLine(java.lang.CharSequence);
- method public android.app.Notification.InboxStyle setBigContentTitle(java.lang.CharSequence);
- method public android.app.Notification.InboxStyle setSummaryText(java.lang.CharSequence);
+ ctor @Deprecated public Notification.InboxStyle(android.app.Notification.Builder);
+ method public android.app.Notification.InboxStyle addLine(CharSequence);
+ method public android.app.Notification.InboxStyle setBigContentTitle(CharSequence);
+ method public android.app.Notification.InboxStyle setSummaryText(CharSequence);
}
public static class Notification.MediaStyle extends android.app.Notification.Style {
ctor public Notification.MediaStyle();
- ctor public deprecated Notification.MediaStyle(android.app.Notification.Builder);
+ ctor @Deprecated public Notification.MediaStyle(android.app.Notification.Builder);
method public android.app.Notification.MediaStyle setMediaSession(android.media.session.MediaSession.Token);
method public android.app.Notification.MediaStyle setShowActionsInCompactView(int...);
}
public static class Notification.MessagingStyle extends android.app.Notification.Style {
- ctor public deprecated Notification.MessagingStyle(java.lang.CharSequence);
- ctor public Notification.MessagingStyle(android.app.Person);
+ ctor @Deprecated public Notification.MessagingStyle(@NonNull CharSequence);
+ ctor public Notification.MessagingStyle(@NonNull android.app.Person);
method public android.app.Notification.MessagingStyle addHistoricMessage(android.app.Notification.MessagingStyle.Message);
- method public deprecated android.app.Notification.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
- method public android.app.Notification.MessagingStyle addMessage(java.lang.CharSequence, long, android.app.Person);
+ method @Deprecated public android.app.Notification.MessagingStyle addMessage(CharSequence, long, CharSequence);
+ method public android.app.Notification.MessagingStyle addMessage(@NonNull CharSequence, long, @Nullable android.app.Person);
method public android.app.Notification.MessagingStyle addMessage(android.app.Notification.MessagingStyle.Message);
- method public java.lang.CharSequence getConversationTitle();
+ method @Nullable public CharSequence getConversationTitle();
method public java.util.List<android.app.Notification.MessagingStyle.Message> getHistoricMessages();
method public java.util.List<android.app.Notification.MessagingStyle.Message> getMessages();
- method public android.app.Person getUser();
- method public deprecated java.lang.CharSequence getUserDisplayName();
+ method @NonNull public android.app.Person getUser();
+ method @Deprecated public CharSequence getUserDisplayName();
method public boolean isGroupConversation();
- method public android.app.Notification.MessagingStyle setConversationTitle(java.lang.CharSequence);
+ method public android.app.Notification.MessagingStyle setConversationTitle(@Nullable CharSequence);
method public android.app.Notification.MessagingStyle setGroupConversation(boolean);
field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
}
public static final class Notification.MessagingStyle.Message {
- ctor public deprecated Notification.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
- ctor public Notification.MessagingStyle.Message(java.lang.CharSequence, long, android.app.Person);
- method public java.lang.String getDataMimeType();
+ ctor @Deprecated public Notification.MessagingStyle.Message(CharSequence, long, CharSequence);
+ ctor public Notification.MessagingStyle.Message(@NonNull CharSequence, long, @Nullable android.app.Person);
+ method public String getDataMimeType();
method public android.net.Uri getDataUri();
method public android.os.Bundle getExtras();
- method public deprecated java.lang.CharSequence getSender();
- method public android.app.Person getSenderPerson();
- method public java.lang.CharSequence getText();
+ method @Deprecated public CharSequence getSender();
+ method @Nullable public android.app.Person getSenderPerson();
+ method public CharSequence getText();
method public long getTimestamp();
- method public android.app.Notification.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
+ method public android.app.Notification.MessagingStyle.Message setData(String, android.net.Uri);
}
- public static abstract class Notification.Style {
+ public abstract static class Notification.Style {
ctor public Notification.Style();
method public android.app.Notification build();
method protected void checkBuilder();
method protected android.widget.RemoteViews getStandardView(int);
- method protected void internalSetBigContentTitle(java.lang.CharSequence);
- method protected void internalSetSummaryText(java.lang.CharSequence);
+ method protected void internalSetBigContentTitle(CharSequence);
+ method protected void internalSetSummaryText(CharSequence);
method public void setBuilder(android.app.Notification.Builder);
field protected android.app.Notification.Builder mBuilder;
}
@@ -5637,88 +5661,88 @@ package android.app {
ctor public Notification.WearableExtender(android.app.Notification);
method public android.app.Notification.WearableExtender addAction(android.app.Notification.Action);
method public android.app.Notification.WearableExtender addActions(java.util.List<android.app.Notification.Action>);
- method public deprecated android.app.Notification.WearableExtender addPage(android.app.Notification);
- method public deprecated android.app.Notification.WearableExtender addPages(java.util.List<android.app.Notification>);
+ method @Deprecated public android.app.Notification.WearableExtender addPage(android.app.Notification);
+ method @Deprecated public android.app.Notification.WearableExtender addPages(java.util.List<android.app.Notification>);
method public android.app.Notification.WearableExtender clearActions();
- method public deprecated android.app.Notification.WearableExtender clearPages();
+ method @Deprecated public android.app.Notification.WearableExtender clearPages();
method public android.app.Notification.WearableExtender clone();
method public android.app.Notification.Builder extend(android.app.Notification.Builder);
method public java.util.List<android.app.Notification.Action> getActions();
- method public deprecated android.graphics.Bitmap getBackground();
- method public java.lang.String getBridgeTag();
+ method @Deprecated public android.graphics.Bitmap getBackground();
+ method public String getBridgeTag();
method public int getContentAction();
- method public deprecated int getContentIcon();
- method public deprecated int getContentIconGravity();
+ method @Deprecated public int getContentIcon();
+ method @Deprecated public int getContentIconGravity();
method public boolean getContentIntentAvailableOffline();
- method public deprecated int getCustomContentHeight();
- method public deprecated int getCustomSizePreset();
- method public java.lang.String getDismissalId();
- method public deprecated android.app.PendingIntent getDisplayIntent();
- method public deprecated int getGravity();
- method public deprecated boolean getHintAmbientBigPicture();
- method public deprecated boolean getHintAvoidBackgroundClipping();
+ method @Deprecated public int getCustomContentHeight();
+ method @Deprecated public int getCustomSizePreset();
+ method public String getDismissalId();
+ method @Deprecated public android.app.PendingIntent getDisplayIntent();
+ method @Deprecated public int getGravity();
+ method @Deprecated public boolean getHintAmbientBigPicture();
+ method @Deprecated public boolean getHintAvoidBackgroundClipping();
method public boolean getHintContentIntentLaunchesActivity();
- method public deprecated boolean getHintHideIcon();
- method public deprecated int getHintScreenTimeout();
- method public deprecated boolean getHintShowBackgroundOnly();
- method public deprecated java.util.List<android.app.Notification> getPages();
+ method @Deprecated public boolean getHintHideIcon();
+ method @Deprecated public int getHintScreenTimeout();
+ method @Deprecated public boolean getHintShowBackgroundOnly();
+ method @Deprecated public java.util.List<android.app.Notification> getPages();
method public boolean getStartScrollBottom();
- method public deprecated android.app.Notification.WearableExtender setBackground(android.graphics.Bitmap);
- method public android.app.Notification.WearableExtender setBridgeTag(java.lang.String);
+ method @Deprecated public android.app.Notification.WearableExtender setBackground(android.graphics.Bitmap);
+ method public android.app.Notification.WearableExtender setBridgeTag(String);
method public android.app.Notification.WearableExtender setContentAction(int);
- method public deprecated android.app.Notification.WearableExtender setContentIcon(int);
- method public deprecated android.app.Notification.WearableExtender setContentIconGravity(int);
+ method @Deprecated public android.app.Notification.WearableExtender setContentIcon(int);
+ method @Deprecated public android.app.Notification.WearableExtender setContentIconGravity(int);
method public android.app.Notification.WearableExtender setContentIntentAvailableOffline(boolean);
- method public deprecated android.app.Notification.WearableExtender setCustomContentHeight(int);
- method public deprecated android.app.Notification.WearableExtender setCustomSizePreset(int);
- method public android.app.Notification.WearableExtender setDismissalId(java.lang.String);
- method public deprecated android.app.Notification.WearableExtender setDisplayIntent(android.app.PendingIntent);
- method public deprecated android.app.Notification.WearableExtender setGravity(int);
- method public deprecated android.app.Notification.WearableExtender setHintAmbientBigPicture(boolean);
- method public deprecated android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean);
+ method @Deprecated public android.app.Notification.WearableExtender setCustomContentHeight(int);
+ method @Deprecated public android.app.Notification.WearableExtender setCustomSizePreset(int);
+ method public android.app.Notification.WearableExtender setDismissalId(String);
+ method @Deprecated public android.app.Notification.WearableExtender setDisplayIntent(android.app.PendingIntent);
+ method @Deprecated public android.app.Notification.WearableExtender setGravity(int);
+ method @Deprecated public android.app.Notification.WearableExtender setHintAmbientBigPicture(boolean);
+ method @Deprecated public android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean);
method public android.app.Notification.WearableExtender setHintContentIntentLaunchesActivity(boolean);
- method public deprecated android.app.Notification.WearableExtender setHintHideIcon(boolean);
- method public deprecated android.app.Notification.WearableExtender setHintScreenTimeout(int);
- method public deprecated android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean);
+ method @Deprecated public android.app.Notification.WearableExtender setHintHideIcon(boolean);
+ method @Deprecated public android.app.Notification.WearableExtender setHintScreenTimeout(int);
+ method @Deprecated public android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean);
method public android.app.Notification.WearableExtender setStartScrollBottom(boolean);
- field public static final deprecated int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
- field public static final deprecated int SCREEN_TIMEOUT_SHORT = 0; // 0x0
- field public static final deprecated int SIZE_DEFAULT = 0; // 0x0
- field public static final deprecated int SIZE_FULL_SCREEN = 5; // 0x5
- field public static final deprecated int SIZE_LARGE = 4; // 0x4
- field public static final deprecated int SIZE_MEDIUM = 3; // 0x3
- field public static final deprecated int SIZE_SMALL = 2; // 0x2
- field public static final deprecated int SIZE_XSMALL = 1; // 0x1
+ field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+ field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+ field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+ field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+ field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+ field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+ field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
}
public final class NotificationChannel implements android.os.Parcelable {
- ctor public NotificationChannel(java.lang.String, java.lang.CharSequence, int);
+ ctor public NotificationChannel(String, CharSequence, int);
+ method public boolean canBubble();
method public boolean canBypassDnd();
- method public boolean canOverlayApps();
method public boolean canShowBadge();
method public int describeContents();
method public void enableLights(boolean);
method public void enableVibration(boolean);
method public android.media.AudioAttributes getAudioAttributes();
- method public java.lang.String getDescription();
- method public java.lang.String getGroup();
- method public java.lang.String getId();
+ method public String getDescription();
+ method public String getGroup();
+ method public String getId();
method public int getImportance();
method public int getLightColor();
method public int getLockscreenVisibility();
- method public java.lang.CharSequence getName();
+ method public CharSequence getName();
method public android.net.Uri getSound();
method public long[] getVibrationPattern();
method public boolean hasUserSetImportance();
- method public void setAllowAppOverlay(boolean);
+ method public void setAllowBubbles(boolean);
method public void setBypassDnd(boolean);
- method public void setDescription(java.lang.String);
- method public void setGroup(java.lang.String);
+ method public void setDescription(String);
+ method public void setGroup(String);
method public void setImportance(int);
method public void setLightColor(int);
method public void setLockscreenVisibility(int);
- method public void setName(java.lang.CharSequence);
+ method public void setName(CharSequence);
method public void setShowBadge(boolean);
method public void setSound(android.net.Uri, android.media.AudioAttributes);
method public void setVibrationPattern(long[]);
@@ -5726,71 +5750,71 @@ package android.app {
method public boolean shouldVibrate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.NotificationChannel> CREATOR;
- field public static final java.lang.String DEFAULT_CHANNEL_ID = "miscellaneous";
+ field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
}
public final class NotificationChannelGroup implements android.os.Parcelable {
- ctor public NotificationChannelGroup(java.lang.String, java.lang.CharSequence);
+ ctor public NotificationChannelGroup(String, CharSequence);
method public android.app.NotificationChannelGroup clone();
method public int describeContents();
method public java.util.List<android.app.NotificationChannel> getChannels();
- method public java.lang.String getDescription();
- method public java.lang.String getId();
- method public java.lang.CharSequence getName();
+ method public String getDescription();
+ method public String getId();
+ method public CharSequence getName();
method public boolean isBlocked();
- method public void setDescription(java.lang.String);
+ method public void setDescription(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.NotificationChannelGroup> CREATOR;
}
public class NotificationManager {
- method public java.lang.String addAutomaticZenRule(android.app.AutomaticZenRule);
- method public boolean areAppOverlaysAllowed();
+ method public String addAutomaticZenRule(android.app.AutomaticZenRule);
+ method public boolean areBubblesAllowed();
method public boolean areNotificationsEnabled();
- method public boolean canNotifyAsPackage(java.lang.String);
+ method public boolean canNotifyAsPackage(String);
method public void cancel(int);
- method public void cancel(java.lang.String, int);
+ method public void cancel(String, int);
method public void cancelAll();
- method public void createNotificationChannel(android.app.NotificationChannel);
- method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
- method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup>);
- method public void createNotificationChannels(java.util.List<android.app.NotificationChannel>);
- method public void deleteNotificationChannel(java.lang.String);
- method public void deleteNotificationChannelGroup(java.lang.String);
+ method public void createNotificationChannel(@NonNull android.app.NotificationChannel);
+ method public void createNotificationChannelGroup(@NonNull android.app.NotificationChannelGroup);
+ method public void createNotificationChannelGroups(@NonNull java.util.List<android.app.NotificationChannelGroup>);
+ method public void createNotificationChannels(@NonNull java.util.List<android.app.NotificationChannel>);
+ method public void deleteNotificationChannel(String);
+ method public void deleteNotificationChannelGroup(String);
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
- method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String);
- method public java.util.Map<java.lang.String, android.app.AutomaticZenRule> getAutomaticZenRules();
+ method public android.app.AutomaticZenRule getAutomaticZenRule(String);
+ method public java.util.Map<java.lang.String,android.app.AutomaticZenRule> getAutomaticZenRules();
method public final int getCurrentInterruptionFilter();
method public int getImportance();
- method public android.app.NotificationChannel getNotificationChannel(java.lang.String);
- method public android.app.NotificationChannelGroup getNotificationChannelGroup(java.lang.String);
+ method public android.app.NotificationChannel getNotificationChannel(String);
+ method public android.app.NotificationChannelGroup getNotificationChannelGroup(String);
method public java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups();
method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
- method public java.lang.String getNotificationDelegate();
+ method @Nullable public String getNotificationDelegate();
method public android.app.NotificationManager.Policy getNotificationPolicy();
method public boolean isNotificationListenerAccessGranted(android.content.ComponentName);
method public boolean isNotificationPolicyAccessGranted();
method public void notify(int, android.app.Notification);
- method public void notify(java.lang.String, int, android.app.Notification);
- method public void notifyAsPackage(java.lang.String, java.lang.String, int, android.app.Notification);
- method public boolean removeAutomaticZenRule(java.lang.String);
+ method public void notify(String, int, android.app.Notification);
+ method public void notifyAsPackage(@NonNull String, @NonNull String, int, android.app.Notification);
+ method public boolean removeAutomaticZenRule(String);
method public void revokeNotificationDelegate();
- method public void setAutomaticZenRuleState(java.lang.String, android.service.notification.Condition);
+ method public void setAutomaticZenRuleState(String, android.service.notification.Condition);
method public final void setInterruptionFilter(int);
- method public void setNotificationDelegate(java.lang.String);
- method public void setNotificationPolicy(android.app.NotificationManager.Policy);
- method public boolean updateAutomaticZenRule(java.lang.String, android.app.AutomaticZenRule);
- field public static final java.lang.String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED";
- field public static final java.lang.String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE";
- field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED";
- field public static final java.lang.String ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED";
- field public static final java.lang.String ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED";
- field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED";
- field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED";
- field public static final java.lang.String EXTRA_AUTOMATIC_RULE_ID = "android.app.extra.AUTOMATIC_RULE_ID";
- field public static final java.lang.String EXTRA_BLOCKED_STATE = "android.app.extra.BLOCKED_STATE";
- field public static final java.lang.String EXTRA_NOTIFICATION_CHANNEL_GROUP_ID = "android.app.extra.NOTIFICATION_CHANNEL_GROUP_ID";
- field public static final java.lang.String EXTRA_NOTIFICATION_CHANNEL_ID = "android.app.extra.NOTIFICATION_CHANNEL_ID";
+ method public void setNotificationDelegate(@NonNull String);
+ method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy);
+ method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule);
+ field public static final String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED";
+ field public static final String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE";
+ field public static final String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED";
+ field public static final String ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED";
+ field public static final String ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED";
+ field public static final String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED";
+ field public static final String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED";
+ field public static final String EXTRA_AUTOMATIC_RULE_ID = "android.app.extra.AUTOMATIC_RULE_ID";
+ field public static final String EXTRA_BLOCKED_STATE = "android.app.extra.BLOCKED_STATE";
+ field public static final String EXTRA_NOTIFICATION_CHANNEL_GROUP_ID = "android.app.extra.NOTIFICATION_CHANNEL_GROUP_ID";
+ field public static final String EXTRA_NOTIFICATION_CHANNEL_ID = "android.app.extra.NOTIFICATION_CHANNEL_ID";
field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
field public static final int IMPORTANCE_HIGH = 4; // 0x4
field public static final int IMPORTANCE_LOW = 2; // 0x2
@@ -5803,17 +5827,17 @@ package android.app {
field public static final int INTERRUPTION_FILTER_NONE = 3; // 0x3
field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2
field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0
- field public static final java.lang.String META_DATA_AUTOMATIC_RULE_TYPE = "android.app.automatic.ruleType";
- field public static final java.lang.String META_DATA_RULE_INSTANCE_LIMIT = "android.app.zen.automatic.ruleInstanceLimit";
+ field public static final String META_DATA_AUTOMATIC_RULE_TYPE = "android.app.automatic.ruleType";
+ field public static final String META_DATA_RULE_INSTANCE_LIMIT = "android.app.zen.automatic.ruleInstanceLimit";
}
public static class NotificationManager.Policy implements android.os.Parcelable {
ctor public NotificationManager.Policy(int, int, int);
ctor public NotificationManager.Policy(int, int, int, int);
method public int describeContents();
- method public static java.lang.String priorityCategoriesToString(int);
- method public static java.lang.String prioritySendersToString(int);
- method public static java.lang.String suppressedEffectsToString(int);
+ method public static String priorityCategoriesToString(int);
+ method public static String prioritySendersToString(int);
+ method public static String suppressedEffectsToString(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy> CREATOR;
field public static final int PRIORITY_CATEGORY_ALARMS = 32; // 0x20
@@ -5833,8 +5857,8 @@ package android.app {
field public static final int SUPPRESSED_EFFECT_LIGHTS = 8; // 0x8
field public static final int SUPPRESSED_EFFECT_NOTIFICATION_LIST = 256; // 0x100
field public static final int SUPPRESSED_EFFECT_PEEK = 16; // 0x10
- field public static final deprecated int SUPPRESSED_EFFECT_SCREEN_OFF = 1; // 0x1
- field public static final deprecated int SUPPRESSED_EFFECT_SCREEN_ON = 2; // 0x2
+ field @Deprecated public static final int SUPPRESSED_EFFECT_SCREEN_OFF = 1; // 0x1
+ field @Deprecated public static final int SUPPRESSED_EFFECT_SCREEN_ON = 2; // 0x2
field public static final int SUPPRESSED_EFFECT_STATUS_BAR = 32; // 0x20
field public final int priorityCallSenders;
field public final int priorityCategories;
@@ -5845,27 +5869,27 @@ package android.app {
public final class PendingIntent implements android.os.Parcelable {
method public void cancel();
method public int describeContents();
- method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
- method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
+ method public static android.app.PendingIntent getActivities(android.content.Context, int, @NonNull android.content.Intent[], int);
+ method public static android.app.PendingIntent getActivities(android.content.Context, int, @NonNull android.content.Intent[], int, @Nullable android.os.Bundle);
method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
- method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
+ method public static android.app.PendingIntent getActivity(android.content.Context, int, @NonNull android.content.Intent, int, @Nullable android.os.Bundle);
method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
- method public java.lang.String getCreatorPackage();
+ method @Nullable public String getCreatorPackage();
method public int getCreatorUid();
- method public android.os.UserHandle getCreatorUserHandle();
- method public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int);
+ method @Nullable public android.os.UserHandle getCreatorUserHandle();
+ method public static android.app.PendingIntent getForegroundService(android.content.Context, int, @NonNull android.content.Intent, int);
method public android.content.IntentSender getIntentSender();
- method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
- method public deprecated java.lang.String getTargetPackage();
- method public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
+ method public static android.app.PendingIntent getService(android.content.Context, int, @NonNull android.content.Intent, int);
+ method @Deprecated public String getTargetPackage();
+ method @Nullable public static android.app.PendingIntent readPendingIntentOrNullFromParcel(@NonNull android.os.Parcel);
method public void send() throws android.app.PendingIntent.CanceledException;
method public void send(int) throws android.app.PendingIntent.CanceledException;
- method public void send(android.content.Context, int, android.content.Intent) throws android.app.PendingIntent.CanceledException;
- method public void send(int, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
- method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
- method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, java.lang.String) throws android.app.PendingIntent.CanceledException;
- method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, java.lang.String, android.os.Bundle) throws android.app.PendingIntent.CanceledException;
- method public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
+ method public void send(android.content.Context, int, @Nullable android.content.Intent) throws android.app.PendingIntent.CanceledException;
+ method public void send(int, @Nullable android.app.PendingIntent.OnFinished, @Nullable android.os.Handler) throws android.app.PendingIntent.CanceledException;
+ method public void send(android.content.Context, int, @Nullable android.content.Intent, @Nullable android.app.PendingIntent.OnFinished, @Nullable android.os.Handler) throws android.app.PendingIntent.CanceledException;
+ method public void send(android.content.Context, int, @Nullable android.content.Intent, @Nullable android.app.PendingIntent.OnFinished, @Nullable android.os.Handler, @Nullable String) throws android.app.PendingIntent.CanceledException;
+ method public void send(android.content.Context, int, @Nullable android.content.Intent, @Nullable android.app.PendingIntent.OnFinished, @Nullable android.os.Handler, @Nullable String, @Nullable android.os.Bundle) throws android.app.PendingIntent.CanceledException;
+ method public static void writePendingIntentOrNullToParcel(@Nullable android.app.PendingIntent, @NonNull android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.PendingIntent> CREATOR;
field public static final int FLAG_CANCEL_CURRENT = 268435456; // 0x10000000
@@ -5877,20 +5901,20 @@ package android.app {
public static class PendingIntent.CanceledException extends android.util.AndroidException {
ctor public PendingIntent.CanceledException();
- ctor public PendingIntent.CanceledException(java.lang.String);
- ctor public PendingIntent.CanceledException(java.lang.Exception);
+ ctor public PendingIntent.CanceledException(String);
+ ctor public PendingIntent.CanceledException(Exception);
}
- public static abstract interface PendingIntent.OnFinished {
- method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
+ public static interface PendingIntent.OnFinished {
+ method public void onSendFinished(android.app.PendingIntent, android.content.Intent, int, String, android.os.Bundle);
}
public final class Person implements android.os.Parcelable {
method public int describeContents();
- method public android.graphics.drawable.Icon getIcon();
- method public java.lang.String getKey();
- method public java.lang.CharSequence getName();
- method public java.lang.String getUri();
+ method @Nullable public android.graphics.drawable.Icon getIcon();
+ method @Nullable public String getKey();
+ method @Nullable public CharSequence getName();
+ method @Nullable public String getUri();
method public boolean isBot();
method public boolean isImportant();
method public android.app.Person.Builder toBuilder();
@@ -5900,13 +5924,13 @@ package android.app {
public static class Person.Builder {
ctor public Person.Builder();
- method public android.app.Person build();
- method public android.app.Person.Builder setBot(boolean);
- method public android.app.Person.Builder setIcon(android.graphics.drawable.Icon);
- method public android.app.Person.Builder setImportant(boolean);
- method public android.app.Person.Builder setKey(java.lang.String);
- method public android.app.Person.Builder setName(java.lang.CharSequence);
- method public android.app.Person.Builder setUri(java.lang.String);
+ method @NonNull public android.app.Person build();
+ method @NonNull public android.app.Person.Builder setBot(boolean);
+ method @NonNull public android.app.Person.Builder setIcon(@Nullable android.graphics.drawable.Icon);
+ method @NonNull public android.app.Person.Builder setImportant(boolean);
+ method @NonNull public android.app.Person.Builder setKey(@Nullable String);
+ method @NonNull public android.app.Person.Builder setName(@Nullable CharSequence);
+ method @NonNull public android.app.Person.Builder setUri(@Nullable String);
}
public final class PictureInPictureParams implements android.os.Parcelable {
@@ -5932,51 +5956,51 @@ package android.app {
method public void onDisplayRemoved();
}
- public deprecated class ProgressDialog extends android.app.AlertDialog {
- ctor public ProgressDialog(android.content.Context);
- ctor public ProgressDialog(android.content.Context, int);
- method public int getMax();
- method public int getProgress();
- method public int getSecondaryProgress();
- method public void incrementProgressBy(int);
- method public void incrementSecondaryProgressBy(int);
- method public boolean isIndeterminate();
- method public void onStart();
- method public void setIndeterminate(boolean);
- method public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
- method public void setMax(int);
- method public void setProgress(int);
- method public void setProgressDrawable(android.graphics.drawable.Drawable);
- method public void setProgressNumberFormat(java.lang.String);
- method public void setProgressPercentFormat(java.text.NumberFormat);
- method public void setProgressStyle(int);
- method public void setSecondaryProgress(int);
- method public static android.app.ProgressDialog show(android.content.Context, java.lang.CharSequence, java.lang.CharSequence);
- method public static android.app.ProgressDialog show(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, boolean);
- method public static android.app.ProgressDialog show(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, boolean, boolean);
- method public static android.app.ProgressDialog show(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, boolean, boolean, android.content.DialogInterface.OnCancelListener);
- field public static final int STYLE_HORIZONTAL = 1; // 0x1
- field public static final int STYLE_SPINNER = 0; // 0x0
+ @Deprecated public class ProgressDialog extends android.app.AlertDialog {
+ ctor @Deprecated public ProgressDialog(android.content.Context);
+ ctor @Deprecated public ProgressDialog(android.content.Context, int);
+ method @Deprecated public int getMax();
+ method @Deprecated public int getProgress();
+ method @Deprecated public int getSecondaryProgress();
+ method @Deprecated public void incrementProgressBy(int);
+ method @Deprecated public void incrementSecondaryProgressBy(int);
+ method @Deprecated public boolean isIndeterminate();
+ method @Deprecated public void onStart();
+ method @Deprecated public void setIndeterminate(boolean);
+ method @Deprecated public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
+ method @Deprecated public void setMax(int);
+ method @Deprecated public void setProgress(int);
+ method @Deprecated public void setProgressDrawable(android.graphics.drawable.Drawable);
+ method @Deprecated public void setProgressNumberFormat(String);
+ method @Deprecated public void setProgressPercentFormat(java.text.NumberFormat);
+ method @Deprecated public void setProgressStyle(int);
+ method @Deprecated public void setSecondaryProgress(int);
+ method @Deprecated public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence);
+ method @Deprecated public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean);
+ method @Deprecated public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean, boolean);
+ method @Deprecated public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean, boolean, android.content.DialogInterface.OnCancelListener);
+ field @Deprecated public static final int STYLE_HORIZONTAL = 1; // 0x1
+ field @Deprecated public static final int STYLE_SPINNER = 0; // 0x0
}
public final class RecoverableSecurityException extends java.lang.SecurityException implements android.os.Parcelable {
- ctor public RecoverableSecurityException(java.lang.Throwable, java.lang.CharSequence, android.app.RemoteAction);
+ ctor public RecoverableSecurityException(@NonNull Throwable, @NonNull CharSequence, @NonNull android.app.RemoteAction);
method public int describeContents();
- method public android.app.RemoteAction getUserAction();
- method public java.lang.CharSequence getUserMessage();
+ method @NonNull public android.app.RemoteAction getUserAction();
+ method @NonNull public CharSequence getUserMessage();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.RecoverableSecurityException> CREATOR;
}
public final class RemoteAction implements android.os.Parcelable {
- ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
+ ctor public RemoteAction(@NonNull android.graphics.drawable.Icon, @NonNull CharSequence, @NonNull CharSequence, @NonNull android.app.PendingIntent);
method public android.app.RemoteAction clone();
method public int describeContents();
- method public void dump(java.lang.String, java.io.PrintWriter);
- method public android.app.PendingIntent getActionIntent();
- method public java.lang.CharSequence getContentDescription();
- method public android.graphics.drawable.Icon getIcon();
- method public java.lang.CharSequence getTitle();
+ method public void dump(String, java.io.PrintWriter);
+ method @NonNull public android.app.PendingIntent getActionIntent();
+ method @NonNull public CharSequence getContentDescription();
+ method @NonNull public android.graphics.drawable.Icon getIcon();
+ method @NonNull public CharSequence getTitle();
method public boolean isEnabled();
method public void setEnabled(boolean);
method public void setShouldShowIcon(boolean);
@@ -5986,17 +6010,17 @@ package android.app {
}
public final class RemoteInput implements android.os.Parcelable {
- method public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
+ method public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String,android.net.Uri>);
method public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
method public int describeContents();
method public boolean getAllowFreeFormInput();
method public java.util.Set<java.lang.String> getAllowedDataTypes();
- method public java.lang.CharSequence[] getChoices();
- method public static java.util.Map<java.lang.String, android.net.Uri> getDataResultsFromIntent(android.content.Intent, java.lang.String);
+ method public CharSequence[] getChoices();
+ method public static java.util.Map<java.lang.String,android.net.Uri> getDataResultsFromIntent(android.content.Intent, String);
method public int getEditChoicesBeforeSending();
method public android.os.Bundle getExtras();
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getResultKey();
+ method public CharSequence getLabel();
+ method public String getResultKey();
method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
method public static int getResultsSource(android.content.Intent);
method public boolean isDataOnly();
@@ -6006,95 +6030,95 @@ package android.app {
field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
- field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
- field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+ field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+ field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
field public static final int SOURCE_CHOICE = 1; // 0x1
field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
}
public static final class RemoteInput.Builder {
- ctor public RemoteInput.Builder(java.lang.String);
- method public android.app.RemoteInput.Builder addExtras(android.os.Bundle);
- method public android.app.RemoteInput build();
- method public android.os.Bundle getExtras();
- method public android.app.RemoteInput.Builder setAllowDataType(java.lang.String, boolean);
- method public android.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
- method public android.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
- method public android.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
- method public android.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
+ ctor public RemoteInput.Builder(@NonNull String);
+ method @NonNull public android.app.RemoteInput.Builder addExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.app.RemoteInput build();
+ method @NonNull public android.os.Bundle getExtras();
+ method @NonNull public android.app.RemoteInput.Builder setAllowDataType(@NonNull String, boolean);
+ method @NonNull public android.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+ method @NonNull public android.app.RemoteInput.Builder setChoices(@Nullable CharSequence[]);
+ method @NonNull public android.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+ method @NonNull public android.app.RemoteInput.Builder setLabel(@Nullable CharSequence);
}
public class SearchManager implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
method public android.content.ComponentName getGlobalSearchActivity();
method public android.app.SearchableInfo getSearchableInfo(android.content.ComponentName);
method public java.util.List<android.app.SearchableInfo> getSearchablesInGlobalSearch();
- method public deprecated void onCancel(android.content.DialogInterface);
- method public deprecated void onDismiss(android.content.DialogInterface);
+ method @Deprecated public void onCancel(android.content.DialogInterface);
+ method @Deprecated public void onDismiss(android.content.DialogInterface);
method public void setOnCancelListener(android.app.SearchManager.OnCancelListener);
method public void setOnDismissListener(android.app.SearchManager.OnDismissListener);
- method public void startSearch(java.lang.String, boolean, android.content.ComponentName, android.os.Bundle, boolean);
+ method public void startSearch(String, boolean, android.content.ComponentName, android.os.Bundle, boolean);
method public void stopSearch();
- method public void triggerSearch(java.lang.String, android.content.ComponentName, android.os.Bundle);
- field public static final java.lang.String ACTION_KEY = "action_key";
- field public static final java.lang.String ACTION_MSG = "action_msg";
- field public static final java.lang.String APP_DATA = "app_data";
- field public static final java.lang.String CURSOR_EXTRA_KEY_IN_PROGRESS = "in_progress";
- field public static final java.lang.String EXTRA_DATA_KEY = "intent_extra_data_key";
- field public static final java.lang.String EXTRA_NEW_SEARCH = "new_search";
- field public static final java.lang.String EXTRA_SELECT_QUERY = "select_query";
- field public static final java.lang.String EXTRA_WEB_SEARCH_PENDINGINTENT = "web_search_pendingintent";
+ method public void triggerSearch(String, android.content.ComponentName, android.os.Bundle);
+ field public static final String ACTION_KEY = "action_key";
+ field public static final String ACTION_MSG = "action_msg";
+ field public static final String APP_DATA = "app_data";
+ field public static final String CURSOR_EXTRA_KEY_IN_PROGRESS = "in_progress";
+ field public static final String EXTRA_DATA_KEY = "intent_extra_data_key";
+ field public static final String EXTRA_NEW_SEARCH = "new_search";
+ field public static final String EXTRA_SELECT_QUERY = "select_query";
+ field public static final String EXTRA_WEB_SEARCH_PENDINGINTENT = "web_search_pendingintent";
field public static final int FLAG_QUERY_REFINEMENT = 1; // 0x1
- field public static final java.lang.String INTENT_ACTION_GLOBAL_SEARCH = "android.search.action.GLOBAL_SEARCH";
- field public static final java.lang.String INTENT_ACTION_SEARCHABLES_CHANGED = "android.search.action.SEARCHABLES_CHANGED";
- field public static final java.lang.String INTENT_ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
- field public static final java.lang.String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED";
- field public static final java.lang.String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS";
- field public static final java.lang.String INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED = "android.search.action.GLOBAL_SEARCH_ACTIVITY_CHANGED";
+ field public static final String INTENT_ACTION_GLOBAL_SEARCH = "android.search.action.GLOBAL_SEARCH";
+ field public static final String INTENT_ACTION_SEARCHABLES_CHANGED = "android.search.action.SEARCHABLES_CHANGED";
+ field public static final String INTENT_ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
+ field public static final String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED";
+ field public static final String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS";
+ field public static final String INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED = "android.search.action.GLOBAL_SEARCH_ACTIVITY_CHANGED";
field public static final char MENU_KEY = 115; // 0x0073 's'
field public static final int MENU_KEYCODE = 47; // 0x2f
- field public static final java.lang.String QUERY = "query";
- field public static final java.lang.String SHORTCUT_MIME_TYPE = "vnd.android.cursor.item/vnd.android.search.suggest";
- field public static final java.lang.String SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG = "suggest_audio_channel_config";
- field public static final java.lang.String SUGGEST_COLUMN_CONTENT_TYPE = "suggest_content_type";
- field public static final java.lang.String SUGGEST_COLUMN_DURATION = "suggest_duration";
- field public static final java.lang.String SUGGEST_COLUMN_FLAGS = "suggest_flags";
- field public static final java.lang.String SUGGEST_COLUMN_FORMAT = "suggest_format";
- field public static final java.lang.String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
- field public static final java.lang.String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
- field public static final java.lang.String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action";
- field public static final java.lang.String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
- field public static final java.lang.String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
- field public static final java.lang.String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
- field public static final java.lang.String SUGGEST_COLUMN_IS_LIVE = "suggest_is_live";
- field public static final java.lang.String SUGGEST_COLUMN_LAST_ACCESS_HINT = "suggest_last_access_hint";
- field public static final java.lang.String SUGGEST_COLUMN_PRODUCTION_YEAR = "suggest_production_year";
- field public static final java.lang.String SUGGEST_COLUMN_PURCHASE_PRICE = "suggest_purchase_price";
- field public static final java.lang.String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
- field public static final java.lang.String SUGGEST_COLUMN_RATING_SCORE = "suggest_rating_score";
- field public static final java.lang.String SUGGEST_COLUMN_RATING_STYLE = "suggest_rating_style";
- field public static final java.lang.String SUGGEST_COLUMN_RENTAL_PRICE = "suggest_rental_price";
- field public static final java.lang.String SUGGEST_COLUMN_RESULT_CARD_IMAGE = "suggest_result_card_image";
- field public static final java.lang.String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
- field public static final java.lang.String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing";
- field public static final java.lang.String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1";
- field public static final java.lang.String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
- field public static final java.lang.String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url";
- field public static final java.lang.String SUGGEST_COLUMN_VIDEO_HEIGHT = "suggest_video_height";
- field public static final java.lang.String SUGGEST_COLUMN_VIDEO_WIDTH = "suggest_video_width";
- field public static final java.lang.String SUGGEST_MIME_TYPE = "vnd.android.cursor.dir/vnd.android.search.suggest";
- field public static final java.lang.String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
- field public static final java.lang.String SUGGEST_PARAMETER_LIMIT = "limit";
- field public static final java.lang.String SUGGEST_URI_PATH_QUERY = "search_suggest_query";
- field public static final java.lang.String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut";
- field public static final java.lang.String USER_QUERY = "user_query";
- }
-
- public static abstract interface SearchManager.OnCancelListener {
- method public abstract void onCancel();
- }
-
- public static abstract interface SearchManager.OnDismissListener {
- method public abstract void onDismiss();
+ field public static final String QUERY = "query";
+ field public static final String SHORTCUT_MIME_TYPE = "vnd.android.cursor.item/vnd.android.search.suggest";
+ field public static final String SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG = "suggest_audio_channel_config";
+ field public static final String SUGGEST_COLUMN_CONTENT_TYPE = "suggest_content_type";
+ field public static final String SUGGEST_COLUMN_DURATION = "suggest_duration";
+ field public static final String SUGGEST_COLUMN_FLAGS = "suggest_flags";
+ field public static final String SUGGEST_COLUMN_FORMAT = "suggest_format";
+ field public static final String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
+ field public static final String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
+ field public static final String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action";
+ field public static final String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
+ field public static final String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
+ field public static final String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
+ field public static final String SUGGEST_COLUMN_IS_LIVE = "suggest_is_live";
+ field public static final String SUGGEST_COLUMN_LAST_ACCESS_HINT = "suggest_last_access_hint";
+ field public static final String SUGGEST_COLUMN_PRODUCTION_YEAR = "suggest_production_year";
+ field public static final String SUGGEST_COLUMN_PURCHASE_PRICE = "suggest_purchase_price";
+ field public static final String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
+ field public static final String SUGGEST_COLUMN_RATING_SCORE = "suggest_rating_score";
+ field public static final String SUGGEST_COLUMN_RATING_STYLE = "suggest_rating_style";
+ field public static final String SUGGEST_COLUMN_RENTAL_PRICE = "suggest_rental_price";
+ field public static final String SUGGEST_COLUMN_RESULT_CARD_IMAGE = "suggest_result_card_image";
+ field public static final String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
+ field public static final String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing";
+ field public static final String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1";
+ field public static final String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
+ field public static final String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url";
+ field public static final String SUGGEST_COLUMN_VIDEO_HEIGHT = "suggest_video_height";
+ field public static final String SUGGEST_COLUMN_VIDEO_WIDTH = "suggest_video_width";
+ field public static final String SUGGEST_MIME_TYPE = "vnd.android.cursor.dir/vnd.android.search.suggest";
+ field public static final String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
+ field public static final String SUGGEST_PARAMETER_LIMIT = "limit";
+ field public static final String SUGGEST_URI_PATH_QUERY = "search_suggest_query";
+ field public static final String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut";
+ field public static final String USER_QUERY = "user_query";
+ }
+
+ public static interface SearchManager.OnCancelListener {
+ method public void onCancel();
+ }
+
+ public static interface SearchManager.OnDismissListener {
+ method public void onDismiss();
}
public final class SearchableInfo implements android.os.Parcelable {
@@ -6105,17 +6129,17 @@ package android.app {
method public int getInputType();
method public android.content.ComponentName getSearchActivity();
method public int getSettingsDescriptionId();
- method public java.lang.String getSuggestAuthority();
- method public java.lang.String getSuggestIntentAction();
- method public java.lang.String getSuggestIntentData();
- method public java.lang.String getSuggestPackage();
- method public java.lang.String getSuggestPath();
- method public java.lang.String getSuggestSelection();
+ method public String getSuggestAuthority();
+ method public String getSuggestIntentAction();
+ method public String getSuggestIntentData();
+ method public String getSuggestPackage();
+ method public String getSuggestPath();
+ method public String getSuggestSelection();
method public int getSuggestThreshold();
- method public int getVoiceLanguageId();
- method public int getVoiceLanguageModeId();
+ method @StringRes public int getVoiceLanguageId();
+ method @StringRes public int getVoiceLanguageModeId();
method public int getVoiceMaxResults();
- method public int getVoicePromptTextId();
+ method @StringRes public int getVoicePromptTextId();
method public boolean getVoiceSearchEnabled();
method public boolean getVoiceSearchLaunchRecognizer();
method public boolean getVoiceSearchLaunchWebSearch();
@@ -6129,15 +6153,15 @@ package android.app {
public abstract class Service extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Service();
- method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
method public final android.app.Application getApplication();
- method public abstract android.os.IBinder onBind(android.content.Intent);
+ method @Nullable public abstract android.os.IBinder onBind(android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onDestroy();
method public void onLowMemory();
method public void onRebind(android.content.Intent);
- method public deprecated void onStart(android.content.Intent, int);
+ method @Deprecated public void onStart(android.content.Intent, int);
method public int onStartCommand(android.content.Intent, int, int);
method public void onTaskRemoved(android.content.Intent);
method public void onTrimMemory(int);
@@ -6163,15 +6187,15 @@ package android.app {
ctor public SharedElementCallback();
method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
- method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
+ method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String,android.view.View>);
method public void onRejectSharedElements(java.util.List<android.view.View>);
method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.app.SharedElementCallback.OnSharedElementsReadyListener);
}
- public static abstract interface SharedElementCallback.OnSharedElementsReadyListener {
- method public abstract void onSharedElementsReady();
+ public static interface SharedElementCallback.OnSharedElementsReadyListener {
+ method public void onSharedElementsReady();
}
public class SmsAppService extends android.app.Service {
@@ -6179,12 +6203,12 @@ package android.app {
method public final android.os.IBinder onBind(android.content.Intent);
}
- public deprecated class TabActivity extends android.app.ActivityGroup {
- ctor public TabActivity();
- method public android.widget.TabHost getTabHost();
- method public android.widget.TabWidget getTabWidget();
- method public void setDefaultTab(java.lang.String);
- method public void setDefaultTab(int);
+ @Deprecated public class TabActivity extends android.app.ActivityGroup {
+ ctor @Deprecated public TabActivity();
+ method @Deprecated public android.widget.TabHost getTabHost();
+ method @Deprecated public android.widget.TabWidget getTabWidget();
+ method @Deprecated public void setDefaultTab(String);
+ method @Deprecated public void setDefaultTab(int);
}
public class TaskInfo {
@@ -6202,12 +6226,12 @@ package android.app {
method public android.app.TaskStackBuilder addNextIntent(android.content.Intent);
method public android.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
method public android.app.TaskStackBuilder addParentStack(android.app.Activity);
- method public android.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
+ method public android.app.TaskStackBuilder addParentStack(Class<?>);
method public android.app.TaskStackBuilder addParentStack(android.content.ComponentName);
method public static android.app.TaskStackBuilder create(android.content.Context);
method public android.content.Intent editIntentAt(int);
method public int getIntentCount();
- method public android.content.Intent[] getIntents();
+ method @NonNull public android.content.Intent[] getIntents();
method public android.app.PendingIntent getPendingIntent(int, int);
method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
method public void startActivities();
@@ -6222,8 +6246,8 @@ package android.app {
method public void updateTime(int, int);
}
- public static abstract interface TimePickerDialog.OnTimeSetListener {
- method public abstract void onTimeSet(android.widget.TimePicker, int, int);
+ public static interface TimePickerDialog.OnTimeSetListener {
+ method public void onTimeSet(android.widget.TimePicker, int, int);
}
public final class UiAutomation {
@@ -6232,20 +6256,20 @@ package android.app {
method public void clearWindowAnimationFrameStats();
method public boolean clearWindowContentFrameStats(int);
method public void dropShellPermissionIdentity();
- method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException;
- method public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String);
+ method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException;
+ method public android.os.ParcelFileDescriptor executeShellCommand(String);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
method public android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method public android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
method public android.view.WindowContentFrameStats getWindowContentFrameStats(int);
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
- method public void grantRuntimePermission(java.lang.String, java.lang.String);
- method public void grantRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public void grantRuntimePermission(String, String);
+ method public void grantRuntimePermissionAsUser(String, String, android.os.UserHandle);
method public boolean injectInputEvent(android.view.InputEvent, boolean);
method public boolean performGlobalAction(int);
- method public void revokeRuntimePermission(java.lang.String, java.lang.String);
- method public void revokeRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public void revokeRuntimePermission(String, String);
+ method public void revokeRuntimePermissionAsUser(String, String, android.os.UserHandle);
method public void setOnAccessibilityEventListener(android.app.UiAutomation.OnAccessibilityEventListener);
method public boolean setRotation(int);
method public void setRunAsMonkey(boolean);
@@ -6261,12 +6285,12 @@ package android.app {
field public static final int ROTATION_UNFREEZE = -2; // 0xfffffffe
}
- public static abstract interface UiAutomation.AccessibilityEventFilter {
- method public abstract boolean accept(android.view.accessibility.AccessibilityEvent);
+ public static interface UiAutomation.AccessibilityEventFilter {
+ method public boolean accept(android.view.accessibility.AccessibilityEvent);
}
- public static abstract interface UiAutomation.OnAccessibilityEventListener {
- method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ public static interface UiAutomation.OnAccessibilityEventListener {
+ method public void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
}
public class UiModeManager {
@@ -6275,10 +6299,10 @@ package android.app {
method public int getCurrentModeType();
method public int getNightMode();
method public void setNightMode(int);
- field public static java.lang.String ACTION_ENTER_CAR_MODE;
- field public static java.lang.String ACTION_ENTER_DESK_MODE;
- field public static java.lang.String ACTION_EXIT_CAR_MODE;
- field public static java.lang.String ACTION_EXIT_DESK_MODE;
+ field public static String ACTION_ENTER_CAR_MODE;
+ field public static String ACTION_ENTER_DESK_MODE;
+ field public static String ACTION_EXIT_CAR_MODE;
+ field public static String ACTION_EXIT_DESK_MODE;
field public static final int DISABLE_CAR_MODE_GO_HOME = 1; // 0x1
field public static final int ENABLE_CAR_MODE_ALLOW_SLEEP = 2; // 0x2
field public static final int ENABLE_CAR_MODE_GO_CAR_HOME = 1; // 0x1
@@ -6288,68 +6312,68 @@ package android.app {
}
public final class VoiceInteractor {
- method public android.app.VoiceInteractor.Request getActiveRequest(java.lang.String);
+ method public android.app.VoiceInteractor.Request getActiveRequest(String);
method public android.app.VoiceInteractor.Request[] getActiveRequests();
method public boolean submitRequest(android.app.VoiceInteractor.Request);
- method public boolean submitRequest(android.app.VoiceInteractor.Request, java.lang.String);
- method public boolean[] supportsCommands(java.lang.String[]);
+ method public boolean submitRequest(android.app.VoiceInteractor.Request, String);
+ method public boolean[] supportsCommands(String[]);
}
public static class VoiceInteractor.AbortVoiceRequest extends android.app.VoiceInteractor.Request {
- ctor public VoiceInteractor.AbortVoiceRequest(android.app.VoiceInteractor.Prompt, android.os.Bundle);
+ ctor public VoiceInteractor.AbortVoiceRequest(@Nullable android.app.VoiceInteractor.Prompt, @Nullable android.os.Bundle);
method public void onAbortResult(android.os.Bundle);
}
public static class VoiceInteractor.CommandRequest extends android.app.VoiceInteractor.Request {
- ctor public VoiceInteractor.CommandRequest(java.lang.String, android.os.Bundle);
+ ctor public VoiceInteractor.CommandRequest(String, android.os.Bundle);
method public void onCommandResult(boolean, android.os.Bundle);
}
public static class VoiceInteractor.CompleteVoiceRequest extends android.app.VoiceInteractor.Request {
- ctor public VoiceInteractor.CompleteVoiceRequest(android.app.VoiceInteractor.Prompt, android.os.Bundle);
+ ctor public VoiceInteractor.CompleteVoiceRequest(@Nullable android.app.VoiceInteractor.Prompt, @Nullable android.os.Bundle);
method public void onCompleteResult(android.os.Bundle);
}
public static class VoiceInteractor.ConfirmationRequest extends android.app.VoiceInteractor.Request {
- ctor public VoiceInteractor.ConfirmationRequest(android.app.VoiceInteractor.Prompt, android.os.Bundle);
+ ctor public VoiceInteractor.ConfirmationRequest(@Nullable android.app.VoiceInteractor.Prompt, @Nullable android.os.Bundle);
method public void onConfirmationResult(boolean, android.os.Bundle);
}
public static class VoiceInteractor.PickOptionRequest extends android.app.VoiceInteractor.Request {
- ctor public VoiceInteractor.PickOptionRequest(android.app.VoiceInteractor.Prompt, android.app.VoiceInteractor.PickOptionRequest.Option[], android.os.Bundle);
+ ctor public VoiceInteractor.PickOptionRequest(@Nullable android.app.VoiceInteractor.Prompt, android.app.VoiceInteractor.PickOptionRequest.Option[], @Nullable android.os.Bundle);
method public void onPickOptionResult(boolean, android.app.VoiceInteractor.PickOptionRequest.Option[], android.os.Bundle);
}
public static final class VoiceInteractor.PickOptionRequest.Option implements android.os.Parcelable {
- ctor public VoiceInteractor.PickOptionRequest.Option(java.lang.CharSequence, int);
- method public android.app.VoiceInteractor.PickOptionRequest.Option addSynonym(java.lang.CharSequence);
+ ctor public VoiceInteractor.PickOptionRequest.Option(CharSequence, int);
+ method public android.app.VoiceInteractor.PickOptionRequest.Option addSynonym(CharSequence);
method public int countSynonyms();
method public int describeContents();
method public android.os.Bundle getExtras();
method public int getIndex();
- method public java.lang.CharSequence getLabel();
- method public java.lang.CharSequence getSynonymAt(int);
+ method public CharSequence getLabel();
+ method public CharSequence getSynonymAt(int);
method public void setExtras(android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.VoiceInteractor.PickOptionRequest.Option> CREATOR;
}
public static class VoiceInteractor.Prompt implements android.os.Parcelable {
- ctor public VoiceInteractor.Prompt(java.lang.CharSequence[], java.lang.CharSequence);
- ctor public VoiceInteractor.Prompt(java.lang.CharSequence);
+ ctor public VoiceInteractor.Prompt(@NonNull CharSequence[], @NonNull CharSequence);
+ ctor public VoiceInteractor.Prompt(@NonNull CharSequence);
method public int countVoicePrompts();
method public int describeContents();
- method public java.lang.CharSequence getVisualPrompt();
- method public java.lang.CharSequence getVoicePromptAt(int);
+ method @NonNull public CharSequence getVisualPrompt();
+ method @NonNull public CharSequence getVoicePromptAt(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.VoiceInteractor.Prompt> CREATOR;
}
- public static abstract class VoiceInteractor.Request {
+ public abstract static class VoiceInteractor.Request {
method public void cancel();
method public android.app.Activity getActivity();
method public android.content.Context getContext();
- method public java.lang.String getName();
+ method public String getName();
method public void onAttached(android.app.Activity);
method public void onCancel();
method public void onDetached();
@@ -6357,13 +6381,13 @@ package android.app {
public final class WallpaperColors implements android.os.Parcelable {
ctor public WallpaperColors(android.os.Parcel);
- ctor public WallpaperColors(android.graphics.Color, android.graphics.Color, android.graphics.Color);
+ ctor public WallpaperColors(@NonNull android.graphics.Color, @Nullable android.graphics.Color, @Nullable android.graphics.Color);
method public int describeContents();
- method public static android.app.WallpaperColors fromBitmap(android.graphics.Bitmap);
+ method public static android.app.WallpaperColors fromBitmap(@NonNull android.graphics.Bitmap);
method public static android.app.WallpaperColors fromDrawable(android.graphics.drawable.Drawable);
- method public android.graphics.Color getPrimaryColor();
- method public android.graphics.Color getSecondaryColor();
- method public android.graphics.Color getTertiaryColor();
+ method @NonNull public android.graphics.Color getPrimaryColor();
+ method @Nullable public android.graphics.Color getSecondaryColor();
+ method @Nullable public android.graphics.Color getTertiaryColor();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
}
@@ -6371,20 +6395,20 @@ package android.app {
public final class WallpaperInfo implements android.os.Parcelable {
ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public android.content.ComponentName getComponent();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public android.content.pm.ServiceInfo getServiceInfo();
- method public java.lang.String getServiceName();
- method public java.lang.String getSettingsActivity();
+ method public String getServiceName();
+ method public String getSettingsActivity();
method public android.net.Uri getSettingsSliceUri();
method public boolean getShowMetadataInPreview();
- method public java.lang.CharSequence loadAuthor(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
- method public java.lang.CharSequence loadContextDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
+ method public CharSequence loadAuthor(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
+ method public CharSequence loadContextDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
method public android.net.Uri loadContextUri(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
- method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
+ method public CharSequence loadDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
method public android.graphics.drawable.Drawable loadThumbnail(android.content.pm.PackageManager);
method public boolean supportsMultipleDisplays();
method public void writeToParcel(android.os.Parcel, int);
@@ -6392,10 +6416,10 @@ package android.app {
}
public class WallpaperManager {
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler);
- method public void clear() throws java.io.IOException;
- method public void clear(int) throws java.io.IOException;
- method public void clearWallpaper();
+ method public void addOnColorsChangedListener(@NonNull android.app.WallpaperManager.OnColorsChangedListener, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void clear() throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void clear(int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void clearWallpaper();
method public void clearWallpaperOffsets(android.os.IBinder);
method public void forgetLoadedWallpaper();
method public android.graphics.drawable.Drawable getBuiltInDrawable();
@@ -6406,45 +6430,45 @@ package android.app {
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.graphics.drawable.Drawable getDrawable();
- method public android.graphics.drawable.Drawable getFastDrawable();
+ method @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) public android.graphics.drawable.Drawable getFastDrawable();
method public static android.app.WallpaperManager getInstance(android.content.Context);
- method public android.app.WallpaperColors getWallpaperColors(int);
- method public android.os.ParcelFileDescriptor getWallpaperFile(int);
+ method @Nullable public android.app.WallpaperColors getWallpaperColors(int);
+ method @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) public android.os.ParcelFileDescriptor getWallpaperFile(int);
method public int getWallpaperId(int);
method public android.app.WallpaperInfo getWallpaperInfo();
- method public boolean hasResourceWallpaper(int);
+ method public boolean hasResourceWallpaper(@RawRes int);
method public boolean isSetWallpaperAllowed();
method public boolean isWallpaperSupported();
method public android.graphics.drawable.Drawable peekDrawable();
- method public android.graphics.drawable.Drawable peekFastDrawable();
- method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
- method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
- method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
- method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
- method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean, int) throws java.io.IOException;
- method public void setDisplayPadding(android.graphics.Rect);
- method public void setResource(int) throws java.io.IOException;
- method public int setResource(int, int) throws java.io.IOException;
- method public void setStream(java.io.InputStream) throws java.io.IOException;
- method public int setStream(java.io.InputStream, android.graphics.Rect, boolean) throws java.io.IOException;
- method public int setStream(java.io.InputStream, android.graphics.Rect, boolean, int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) public android.graphics.drawable.Drawable peekFastDrawable();
+ method public void removeOnColorsChangedListener(@NonNull android.app.WallpaperManager.OnColorsChangedListener);
+ method public void sendWallpaperCommand(android.os.IBinder, String, int, int, int, android.os.Bundle);
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean, int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_HINTS) public void setDisplayPadding(android.graphics.Rect);
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void setResource(@RawRes int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setResource(@RawRes int, int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public void setStream(java.io.InputStream) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setStream(java.io.InputStream, android.graphics.Rect, boolean) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setStream(java.io.InputStream, android.graphics.Rect, boolean, int) throws java.io.IOException;
method public void setWallpaperOffsetSteps(float, float);
method public void setWallpaperOffsets(android.os.IBinder, float, float);
method public void suggestDesiredDimensions(int, int);
- field public static final java.lang.String ACTION_CHANGE_LIVE_WALLPAPER = "android.service.wallpaper.CHANGE_LIVE_WALLPAPER";
- field public static final java.lang.String ACTION_CROP_AND_SET_WALLPAPER = "android.service.wallpaper.CROP_AND_SET_WALLPAPER";
- field public static final java.lang.String ACTION_LIVE_WALLPAPER_CHOOSER = "android.service.wallpaper.LIVE_WALLPAPER_CHOOSER";
- field public static final java.lang.String COMMAND_DROP = "android.home.drop";
- field public static final java.lang.String COMMAND_SECONDARY_TAP = "android.wallpaper.secondaryTap";
- field public static final java.lang.String COMMAND_TAP = "android.wallpaper.tap";
- field public static final java.lang.String EXTRA_LIVE_WALLPAPER_COMPONENT = "android.service.wallpaper.extra.LIVE_WALLPAPER_COMPONENT";
+ field public static final String ACTION_CHANGE_LIVE_WALLPAPER = "android.service.wallpaper.CHANGE_LIVE_WALLPAPER";
+ field public static final String ACTION_CROP_AND_SET_WALLPAPER = "android.service.wallpaper.CROP_AND_SET_WALLPAPER";
+ field public static final String ACTION_LIVE_WALLPAPER_CHOOSER = "android.service.wallpaper.LIVE_WALLPAPER_CHOOSER";
+ field public static final String COMMAND_DROP = "android.home.drop";
+ field public static final String COMMAND_SECONDARY_TAP = "android.wallpaper.secondaryTap";
+ field public static final String COMMAND_TAP = "android.wallpaper.tap";
+ field public static final String EXTRA_LIVE_WALLPAPER_COMPONENT = "android.service.wallpaper.extra.LIVE_WALLPAPER_COMPONENT";
field public static final int FLAG_LOCK = 2; // 0x2
field public static final int FLAG_SYSTEM = 1; // 0x1
- field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
+ field public static final String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
}
- public static abstract interface WallpaperManager.OnColorsChangedListener {
- method public abstract void onColorsChanged(android.app.WallpaperColors, int);
+ public static interface WallpaperManager.OnColorsChangedListener {
+ method public void onColorsChanged(android.app.WallpaperColors, int);
}
}
@@ -6460,7 +6484,7 @@ package android.app.admin {
public class DelegatedAdminReceiver extends android.content.BroadcastReceiver {
ctor public DelegatedAdminReceiver();
- method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String);
+ method public String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, String);
method public void onNetworkLogsAvailable(android.content.Context, android.content.Intent, long, int);
method public void onReceive(android.content.Context, android.content.Intent);
}
@@ -6468,16 +6492,16 @@ package android.app.admin {
public final class DeviceAdminInfo implements android.os.Parcelable {
ctor public DeviceAdminInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public android.content.pm.ActivityInfo getActivityInfo();
- method public android.content.ComponentName getComponent();
- method public java.lang.String getPackageName();
- method public java.lang.String getReceiverName();
- method public java.lang.String getTagForPolicy(int);
+ method @NonNull public android.content.ComponentName getComponent();
+ method public String getPackageName();
+ method public String getReceiverName();
+ method public String getTagForPolicy(int);
method public boolean isVisible();
- method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
+ method public CharSequence loadDescription(android.content.pm.PackageManager) throws android.content.res.Resources.NotFoundException;
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
method public boolean supportsTransferOwnership();
method public boolean usesPolicy(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -6498,53 +6522,53 @@ package android.app.admin {
method public android.app.admin.DevicePolicyManager getManager(android.content.Context);
method public android.content.ComponentName getWho(android.content.Context);
method public void onBugreportFailed(android.content.Context, android.content.Intent, int);
- method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String);
+ method public void onBugreportShared(android.content.Context, android.content.Intent, String);
method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent);
- method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String);
- method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent);
+ method public String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, String);
+ method public CharSequence onDisableRequested(android.content.Context, android.content.Intent);
method public void onDisabled(android.content.Context, android.content.Intent);
method public void onEnabled(android.content.Context, android.content.Intent);
- method public void onLockTaskModeEntering(android.content.Context, android.content.Intent, java.lang.String);
+ method public void onLockTaskModeEntering(android.content.Context, android.content.Intent, String);
method public void onLockTaskModeExiting(android.content.Context, android.content.Intent);
method public void onNetworkLogsAvailable(android.content.Context, android.content.Intent, long, int);
- method public deprecated void onPasswordChanged(android.content.Context, android.content.Intent);
+ method @Deprecated public void onPasswordChanged(android.content.Context, android.content.Intent);
method public void onPasswordChanged(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public deprecated void onPasswordExpiring(android.content.Context, android.content.Intent);
+ method @Deprecated public void onPasswordExpiring(android.content.Context, android.content.Intent);
method public void onPasswordExpiring(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public deprecated void onPasswordFailed(android.content.Context, android.content.Intent);
+ method @Deprecated public void onPasswordFailed(android.content.Context, android.content.Intent);
method public void onPasswordFailed(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public deprecated void onPasswordSucceeded(android.content.Context, android.content.Intent);
+ method @Deprecated public void onPasswordSucceeded(android.content.Context, android.content.Intent);
method public void onPasswordSucceeded(android.content.Context, android.content.Intent, android.os.UserHandle);
method public void onProfileProvisioningComplete(android.content.Context, android.content.Intent);
- method public deprecated void onReadyForUserInitialization(android.content.Context, android.content.Intent);
+ method @Deprecated public void onReadyForUserInitialization(android.content.Context, android.content.Intent);
method public void onReceive(android.content.Context, android.content.Intent);
method public void onSecurityLogsAvailable(android.content.Context, android.content.Intent);
method public void onSystemUpdatePending(android.content.Context, android.content.Intent, long);
method public void onTransferAffiliatedProfileOwnershipComplete(android.content.Context, android.os.UserHandle);
- method public void onTransferOwnershipComplete(android.content.Context, android.os.PersistableBundle);
- method public void onUserAdded(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public void onUserRemoved(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public void onUserStarted(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public void onUserStopped(android.content.Context, android.content.Intent, android.os.UserHandle);
- method public void onUserSwitched(android.content.Context, android.content.Intent, android.os.UserHandle);
- field public static final java.lang.String ACTION_CHOOSE_PRIVATE_KEY_ALIAS = "android.app.action.CHOOSE_PRIVATE_KEY_ALIAS";
- field public static final java.lang.String ACTION_DEVICE_ADMIN_DISABLED = "android.app.action.DEVICE_ADMIN_DISABLED";
- field public static final java.lang.String ACTION_DEVICE_ADMIN_DISABLE_REQUESTED = "android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED";
- field public static final java.lang.String ACTION_DEVICE_ADMIN_ENABLED = "android.app.action.DEVICE_ADMIN_ENABLED";
- field public static final java.lang.String ACTION_LOCK_TASK_ENTERING = "android.app.action.LOCK_TASK_ENTERING";
- field public static final java.lang.String ACTION_LOCK_TASK_EXITING = "android.app.action.LOCK_TASK_EXITING";
- field public static final java.lang.String ACTION_NETWORK_LOGS_AVAILABLE = "android.app.action.NETWORK_LOGS_AVAILABLE";
- field public static final java.lang.String ACTION_PASSWORD_CHANGED = "android.app.action.ACTION_PASSWORD_CHANGED";
- field public static final java.lang.String ACTION_PASSWORD_EXPIRING = "android.app.action.ACTION_PASSWORD_EXPIRING";
- field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED";
- field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED";
- field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE";
+ method public void onTransferOwnershipComplete(@NonNull android.content.Context, @Nullable android.os.PersistableBundle);
+ method public void onUserAdded(android.content.Context, android.content.Intent, @NonNull android.os.UserHandle);
+ method public void onUserRemoved(android.content.Context, android.content.Intent, @NonNull android.os.UserHandle);
+ method public void onUserStarted(android.content.Context, android.content.Intent, @NonNull android.os.UserHandle);
+ method public void onUserStopped(android.content.Context, android.content.Intent, @NonNull android.os.UserHandle);
+ method public void onUserSwitched(android.content.Context, android.content.Intent, @NonNull android.os.UserHandle);
+ field public static final String ACTION_CHOOSE_PRIVATE_KEY_ALIAS = "android.app.action.CHOOSE_PRIVATE_KEY_ALIAS";
+ field public static final String ACTION_DEVICE_ADMIN_DISABLED = "android.app.action.DEVICE_ADMIN_DISABLED";
+ field public static final String ACTION_DEVICE_ADMIN_DISABLE_REQUESTED = "android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED";
+ field public static final String ACTION_DEVICE_ADMIN_ENABLED = "android.app.action.DEVICE_ADMIN_ENABLED";
+ field public static final String ACTION_LOCK_TASK_ENTERING = "android.app.action.LOCK_TASK_ENTERING";
+ field public static final String ACTION_LOCK_TASK_EXITING = "android.app.action.LOCK_TASK_EXITING";
+ field public static final String ACTION_NETWORK_LOGS_AVAILABLE = "android.app.action.NETWORK_LOGS_AVAILABLE";
+ field public static final String ACTION_PASSWORD_CHANGED = "android.app.action.ACTION_PASSWORD_CHANGED";
+ field public static final String ACTION_PASSWORD_EXPIRING = "android.app.action.ACTION_PASSWORD_EXPIRING";
+ field public static final String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED";
+ field public static final String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED";
+ field public static final String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE";
field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0
field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1
- field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin";
- field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING";
- field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE";
- field public static final java.lang.String EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE = "android.app.extra.TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE";
+ field public static final String DEVICE_ADMIN_META_DATA = "android.app.device_admin";
+ field public static final String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING";
+ field public static final String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE";
+ field public static final String EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE = "android.app.extra.TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE";
}
public class DeviceAdminService extends android.app.Service {
@@ -6553,286 +6577,291 @@ package android.app.admin {
}
public class DevicePolicyManager {
- method public void addCrossProfileCalendarPackage(android.content.ComponentName, java.lang.String);
- method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int);
- method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
- method public int addOverrideApn(android.content.ComponentName, android.telephony.data.ApnSetting);
- method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName);
- method public void addUserRestriction(android.content.ComponentName, java.lang.String);
- method public boolean bindDeviceAdminServiceAsUser(android.content.ComponentName, android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
- method public void clearApplicationUserData(android.content.ComponentName, java.lang.String, java.util.concurrent.Executor, android.app.admin.DevicePolicyManager.OnClearApplicationUserDataListener);
- method public void clearCrossProfileIntentFilters(android.content.ComponentName);
- method public deprecated void clearDeviceOwnerApp(java.lang.String);
- method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
- method public deprecated void clearProfileOwner(android.content.ComponentName);
+ method public void addCrossProfileCalendarPackage(@NonNull android.content.ComponentName, @NonNull String);
+ method public void addCrossProfileIntentFilter(@NonNull android.content.ComponentName, android.content.IntentFilter, int);
+ method public boolean addCrossProfileWidgetProvider(@NonNull android.content.ComponentName, String);
+ method public int addOverrideApn(@NonNull android.content.ComponentName, @NonNull android.telephony.data.ApnSetting);
+ method public void addPersistentPreferredActivity(@NonNull android.content.ComponentName, android.content.IntentFilter, @NonNull android.content.ComponentName);
+ method public void addUserRestriction(@NonNull android.content.ComponentName, String);
+ method public boolean bindDeviceAdminServiceAsUser(@NonNull android.content.ComponentName, android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull android.os.UserHandle);
+ method public void clearApplicationUserData(@NonNull android.content.ComponentName, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.app.admin.DevicePolicyManager.OnClearApplicationUserDataListener);
+ method public void clearCrossProfileIntentFilters(@NonNull android.content.ComponentName);
+ method @Deprecated public void clearDeviceOwnerApp(String);
+ method public void clearPackagePersistentPreferredActivities(@NonNull android.content.ComponentName, String);
+ method @Deprecated public void clearProfileOwner(@NonNull android.content.ComponentName);
method public boolean clearResetPasswordToken(android.content.ComponentName);
- method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
- method public android.content.Intent createAdminSupportIntent(java.lang.String);
- method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
- method public void enableSystemApp(android.content.ComponentName, java.lang.String);
- method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
- method public android.security.AttestedKeyPair generateKeyPair(android.content.ComponentName, java.lang.String, android.security.keystore.KeyGenParameterSpec, int);
- method public java.lang.String[] getAccountTypesWithManagementDisabled();
- method public java.util.List<android.content.ComponentName> getActiveAdmins();
- method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName);
- method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName);
- method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String);
- method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName);
+ method public void clearUserRestriction(@NonNull android.content.ComponentName, String);
+ method public android.content.Intent createAdminSupportIntent(@NonNull String);
+ method @Nullable public android.os.UserHandle createAndManageUser(@NonNull android.content.ComponentName, @NonNull String, @NonNull android.content.ComponentName, @Nullable android.os.PersistableBundle, int);
+ method public void enableSystemApp(@NonNull android.content.ComponentName, String);
+ method public int enableSystemApp(@NonNull android.content.ComponentName, android.content.Intent);
+ method public android.security.AttestedKeyPair generateKeyPair(@Nullable android.content.ComponentName, @NonNull String, @NonNull android.security.keystore.KeyGenParameterSpec, int);
+ method @Nullable public String[] getAccountTypesWithManagementDisabled();
+ method @Nullable public java.util.List<android.content.ComponentName> getActiveAdmins();
+ method @NonNull public java.util.Set<java.lang.String> getAffiliationIds(@NonNull android.content.ComponentName);
+ method @Nullable public String getAlwaysOnVpnPackage(@NonNull android.content.ComponentName);
+ method @WorkerThread @NonNull public android.os.Bundle getApplicationRestrictions(@Nullable android.content.ComponentName, String);
+ method @Deprecated @Nullable public String getApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName);
method public boolean getAutoTimeRequired();
- method public java.util.List<android.os.UserHandle> getBindDeviceAdminTargetUsers(android.content.ComponentName);
- method public boolean getBluetoothContactSharingDisabled(android.content.ComponentName);
- method public boolean getCameraDisabled(android.content.ComponentName);
- method public deprecated java.lang.String getCertInstallerPackage(android.content.ComponentName) throws java.lang.SecurityException;
- method public java.util.Set<java.lang.String> getCrossProfileCalendarPackages(android.content.ComponentName);
- method public boolean getCrossProfileCallerIdDisabled(android.content.ComponentName);
- method public boolean getCrossProfileContactsSearchDisabled(android.content.ComponentName);
- method public java.util.List<java.lang.String> getCrossProfileWidgetProviders(android.content.ComponentName);
+ method @NonNull public java.util.List<android.os.UserHandle> getBindDeviceAdminTargetUsers(@NonNull android.content.ComponentName);
+ method public boolean getBluetoothContactSharingDisabled(@NonNull android.content.ComponentName);
+ method public boolean getCameraDisabled(@Nullable android.content.ComponentName);
+ method @Deprecated @Nullable public String getCertInstallerPackage(@NonNull android.content.ComponentName) throws java.lang.SecurityException;
+ method @NonNull public java.util.Set<java.lang.String> getCrossProfileCalendarPackages(@NonNull android.content.ComponentName);
+ method public boolean getCrossProfileCallerIdDisabled(@NonNull android.content.ComponentName);
+ method public boolean getCrossProfileContactsSearchDisabled(@NonNull android.content.ComponentName);
+ method @NonNull public java.util.List<java.lang.String> getCrossProfileWidgetProviders(@NonNull android.content.ComponentName);
method public int getCurrentFailedPasswordAttempts();
- method public java.util.List<java.lang.String> getDelegatePackages(android.content.ComponentName, java.lang.String);
- method public java.util.List<java.lang.String> getDelegatedScopes(android.content.ComponentName, java.lang.String);
- method public java.lang.CharSequence getDeviceOwnerLockScreenInfo();
- method public java.lang.CharSequence getEndUserSessionMessage(android.content.ComponentName);
- method public java.lang.String getGlobalPrivateDnsHost(android.content.ComponentName);
- method public int getGlobalPrivateDnsMode(android.content.ComponentName);
- method public java.util.List<byte[]> getInstalledCaCerts(android.content.ComponentName);
- method public java.util.List<java.lang.String> getKeepUninstalledPackages(android.content.ComponentName);
- method public int getKeyguardDisabledFeatures(android.content.ComponentName);
- method public int getLockTaskFeatures(android.content.ComponentName);
- method public java.lang.String[] getLockTaskPackages(android.content.ComponentName);
- method public java.lang.CharSequence getLongSupportMessage(android.content.ComponentName);
- method public int getMaximumFailedPasswordsForWipe(android.content.ComponentName);
- method public long getMaximumTimeToLock(android.content.ComponentName);
- method public java.util.List<java.lang.String> getMeteredDataDisabledPackages(android.content.ComponentName);
- method public int getOrganizationColor(android.content.ComponentName);
- method public java.lang.CharSequence getOrganizationName(android.content.ComponentName);
- method public java.util.List<android.telephony.data.ApnSetting> getOverrideApns(android.content.ComponentName);
- method public android.app.admin.DevicePolicyManager getParentProfileInstance(android.content.ComponentName);
- method public int getPasswordComplexity();
- method public long getPasswordExpiration(android.content.ComponentName);
- method public long getPasswordExpirationTimeout(android.content.ComponentName);
- method public int getPasswordHistoryLength(android.content.ComponentName);
+ method @Nullable public java.util.List<java.lang.String> getDelegatePackages(@NonNull android.content.ComponentName, @NonNull String);
+ method @NonNull public java.util.List<java.lang.String> getDelegatedScopes(@Nullable android.content.ComponentName, @NonNull String);
+ method public CharSequence getDeviceOwnerLockScreenInfo();
+ method public CharSequence getEndUserSessionMessage(@NonNull android.content.ComponentName);
+ method public String getGlobalPrivateDnsHost(@NonNull android.content.ComponentName);
+ method public int getGlobalPrivateDnsMode(@NonNull android.content.ComponentName);
+ method @NonNull public java.util.List<byte[]> getInstalledCaCerts(@Nullable android.content.ComponentName);
+ method @Nullable public java.util.List<java.lang.String> getKeepUninstalledPackages(@Nullable android.content.ComponentName);
+ method public int getKeyguardDisabledFeatures(@Nullable android.content.ComponentName);
+ method public int getLockTaskFeatures(@NonNull android.content.ComponentName);
+ method @NonNull public String[] getLockTaskPackages(@NonNull android.content.ComponentName);
+ method @Nullable public CharSequence getLongSupportMessage(@NonNull android.content.ComponentName);
+ method public int getMaximumFailedPasswordsForWipe(@Nullable android.content.ComponentName);
+ method public long getMaximumTimeToLock(@Nullable android.content.ComponentName);
+ method @NonNull public java.util.List<java.lang.String> getMeteredDataDisabledPackages(@NonNull android.content.ComponentName);
+ method @ColorInt public int getOrganizationColor(@NonNull android.content.ComponentName);
+ method @Nullable public CharSequence getOrganizationName(@NonNull android.content.ComponentName);
+ method public java.util.List<android.telephony.data.ApnSetting> getOverrideApns(@NonNull android.content.ComponentName);
+ method @NonNull public android.app.admin.DevicePolicyManager getParentProfileInstance(@NonNull android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY) public int getPasswordComplexity();
+ method public long getPasswordExpiration(@Nullable android.content.ComponentName);
+ method public long getPasswordExpirationTimeout(@Nullable android.content.ComponentName);
+ method public int getPasswordHistoryLength(@Nullable android.content.ComponentName);
method public int getPasswordMaximumLength(int);
- method public int getPasswordMinimumLength(android.content.ComponentName);
- method public int getPasswordMinimumLetters(android.content.ComponentName);
- method public int getPasswordMinimumLowerCase(android.content.ComponentName);
- method public int getPasswordMinimumNonLetter(android.content.ComponentName);
- method public int getPasswordMinimumNumeric(android.content.ComponentName);
- method public int getPasswordMinimumSymbols(android.content.ComponentName);
- method public int getPasswordMinimumUpperCase(android.content.ComponentName);
- method public int getPasswordQuality(android.content.ComponentName);
- method public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(android.content.ComponentName);
- method public int getPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String);
+ method public int getPasswordMinimumLength(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumLetters(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumLowerCase(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumNonLetter(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumNumeric(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName);
+ method public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName);
+ method public int getPasswordQuality(@Nullable android.content.ComponentName);
+ method @Nullable public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(@NonNull android.content.ComponentName);
+ method public int getPermissionGrantState(@Nullable android.content.ComponentName, String, String);
method public int getPermissionPolicy(android.content.ComponentName);
- method public java.util.List<java.lang.String> getPermittedAccessibilityServices(android.content.ComponentName);
- method public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(android.content.ComponentName);
- method public java.util.List<java.lang.String> getPermittedInputMethods(android.content.ComponentName);
- method public long getRequiredStrongAuthTimeout(android.content.ComponentName);
- method public boolean getScreenCaptureDisabled(android.content.ComponentName);
- method public java.util.List<android.os.UserHandle> getSecondaryUsers(android.content.ComponentName);
- method public java.lang.CharSequence getShortSupportMessage(android.content.ComponentName);
- method public java.lang.CharSequence getStartUserSessionMessage(android.content.ComponentName);
- method public boolean getStorageEncryption(android.content.ComponentName);
+ method @Nullable public java.util.List<java.lang.String> getPermittedAccessibilityServices(@NonNull android.content.ComponentName);
+ method @Nullable public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName);
+ method @Nullable public java.util.List<java.lang.String> getPermittedInputMethods(@NonNull android.content.ComponentName);
+ method public long getRequiredStrongAuthTimeout(@Nullable android.content.ComponentName);
+ method public boolean getScreenCaptureDisabled(@Nullable android.content.ComponentName);
+ method public java.util.List<android.os.UserHandle> getSecondaryUsers(@NonNull android.content.ComponentName);
+ method public CharSequence getShortSupportMessage(@NonNull android.content.ComponentName);
+ method public CharSequence getStartUserSessionMessage(@NonNull android.content.ComponentName);
+ method public boolean getStorageEncryption(@Nullable android.content.ComponentName);
method public int getStorageEncryptionStatus();
- method public android.app.admin.SystemUpdatePolicy getSystemUpdatePolicy();
- method public android.os.PersistableBundle getTransferOwnershipBundle();
- method public java.util.List<android.os.PersistableBundle> getTrustAgentConfiguration(android.content.ComponentName, android.content.ComponentName);
- method public android.os.Bundle getUserRestrictions(android.content.ComponentName);
- method public java.lang.String getWifiMacAddress(android.content.ComponentName);
- method public boolean hasCaCertInstalled(android.content.ComponentName, byte[]);
- method public boolean hasGrantedPolicy(android.content.ComponentName, int);
- method public boolean installCaCert(android.content.ComponentName, byte[]);
- method public boolean installExistingPackage(android.content.ComponentName, java.lang.String);
- method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate, java.lang.String);
- method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate[], java.lang.String, boolean);
- method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate[], java.lang.String, int);
- method public void installSystemUpdate(android.content.ComponentName, android.net.Uri, java.util.concurrent.Executor, android.app.admin.DevicePolicyManager.InstallUpdateCallback);
+ method @Nullable public android.app.admin.SystemUpdatePolicy getSystemUpdatePolicy();
+ method @Nullable public android.os.PersistableBundle getTransferOwnershipBundle();
+ method @Nullable public java.util.List<android.os.PersistableBundle> getTrustAgentConfiguration(@Nullable android.content.ComponentName, @NonNull android.content.ComponentName);
+ method @NonNull public android.os.Bundle getUserRestrictions(@NonNull android.content.ComponentName);
+ method @Nullable public String getWifiMacAddress(@NonNull android.content.ComponentName);
+ method public boolean hasCaCertInstalled(@Nullable android.content.ComponentName, byte[]);
+ method public boolean hasGrantedPolicy(@NonNull android.content.ComponentName, int);
+ method public boolean installCaCert(@Nullable android.content.ComponentName, byte[]);
+ method public boolean installExistingPackage(@NonNull android.content.ComponentName, String);
+ method public boolean installKeyPair(@Nullable android.content.ComponentName, @NonNull java.security.PrivateKey, @NonNull java.security.cert.Certificate, @NonNull String);
+ method public boolean installKeyPair(@Nullable android.content.ComponentName, @NonNull java.security.PrivateKey, @NonNull java.security.cert.Certificate[], @NonNull String, boolean);
+ method public boolean installKeyPair(@Nullable android.content.ComponentName, @NonNull java.security.PrivateKey, @NonNull java.security.cert.Certificate[], @NonNull String, int);
+ method public void installSystemUpdate(@NonNull android.content.ComponentName, @NonNull android.net.Uri, @NonNull java.util.concurrent.Executor, @NonNull android.app.admin.DevicePolicyManager.InstallUpdateCallback);
method public boolean isActivePasswordSufficient();
- method public boolean isAdminActive(android.content.ComponentName);
+ method public boolean isAdminActive(@NonNull android.content.ComponentName);
method public boolean isAffiliatedUser();
- method public boolean isApplicationHidden(android.content.ComponentName, java.lang.String);
- method public boolean isBackupServiceEnabled(android.content.ComponentName);
- method public deprecated boolean isCallerApplicationRestrictionsManagingPackage();
+ method public boolean isApplicationHidden(@NonNull android.content.ComponentName, String);
+ method public boolean isBackupServiceEnabled(@NonNull android.content.ComponentName);
+ method @Deprecated public boolean isCallerApplicationRestrictionsManagingPackage();
method public boolean isDeviceIdAttestationSupported();
- method public boolean isDeviceOwnerApp(java.lang.String);
- method public boolean isEphemeralUser(android.content.ComponentName);
- method public boolean isLockTaskPermitted(java.lang.String);
+ method public boolean isDeviceOwnerApp(String);
+ method public boolean isEphemeralUser(@NonNull android.content.ComponentName);
+ method public boolean isLockTaskPermitted(String);
method public boolean isLogoutEnabled();
- method public boolean isManagedProfile(android.content.ComponentName);
- method public boolean isMasterVolumeMuted(android.content.ComponentName);
- method public boolean isNetworkLoggingEnabled(android.content.ComponentName);
- method public boolean isOverrideApnEnabled(android.content.ComponentName);
- method public boolean isPackageSuspended(android.content.ComponentName, java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public boolean isProfileOwnerApp(java.lang.String);
- method public boolean isProvisioningAllowed(java.lang.String);
+ method public boolean isManagedProfile(@NonNull android.content.ComponentName);
+ method public boolean isMasterVolumeMuted(@NonNull android.content.ComponentName);
+ method public boolean isNetworkLoggingEnabled(@Nullable android.content.ComponentName);
+ method public boolean isOverrideApnEnabled(@NonNull android.content.ComponentName);
+ method public boolean isPackageSuspended(@NonNull android.content.ComponentName, String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public boolean isProfileOwnerApp(String);
+ method public boolean isProvisioningAllowed(@NonNull String);
method public boolean isResetPasswordTokenActive(android.content.ComponentName);
- method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
- method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
- method public boolean isUsingUnifiedPassword(android.content.ComponentName);
+ method public boolean isSecurityLoggingEnabled(@Nullable android.content.ComponentName);
+ method public boolean isUninstallBlocked(@Nullable android.content.ComponentName, String);
+ method public boolean isUsingUnifiedPassword(@NonNull android.content.ComponentName);
method public void lockNow();
method public void lockNow(int);
- method public int logoutUser(android.content.ComponentName);
- method public void reboot(android.content.ComponentName);
- method public void removeActiveAdmin(android.content.ComponentName);
- method public boolean removeCrossProfileCalendarPackage(android.content.ComponentName, java.lang.String);
- method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
- method public boolean removeKeyPair(android.content.ComponentName, java.lang.String);
- method public boolean removeOverrideApn(android.content.ComponentName, int);
- method public boolean removeUser(android.content.ComponentName, android.os.UserHandle);
- method public boolean requestBugreport(android.content.ComponentName);
- method public boolean resetPassword(java.lang.String, int);
- method public boolean resetPasswordWithToken(android.content.ComponentName, java.lang.String, byte[], int);
- method public java.util.List<android.app.admin.NetworkEvent> retrieveNetworkLogs(android.content.ComponentName, long);
- method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
- method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
- method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean);
- method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>);
- method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
- method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean);
- method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle);
- method public deprecated void setApplicationRestrictionsManagingPackage(android.content.ComponentName, java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public void setAutoTimeRequired(android.content.ComponentName, boolean);
- method public void setBackupServiceEnabled(android.content.ComponentName, boolean);
- method public void setBluetoothContactSharingDisabled(android.content.ComponentName, boolean);
- method public void setCameraDisabled(android.content.ComponentName, boolean);
- method public deprecated void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException;
- method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean);
- method public void setCrossProfileContactsSearchDisabled(android.content.ComponentName, boolean);
- method public void setDelegatedScopes(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>);
- method public void setDeviceOwnerLockScreenInfo(android.content.ComponentName, java.lang.CharSequence);
- method public void setEndUserSessionMessage(android.content.ComponentName, java.lang.CharSequence);
- method public int setGlobalPrivateDns(android.content.ComponentName, int, java.lang.String);
- method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String);
- method public void setKeepUninstalledPackages(android.content.ComponentName, java.util.List<java.lang.String>);
- method public boolean setKeyPairCertificate(android.content.ComponentName, java.lang.String, java.util.List<java.security.cert.Certificate>, boolean);
- method public boolean setKeyguardDisabled(android.content.ComponentName, boolean);
- method public void setKeyguardDisabledFeatures(android.content.ComponentName, int);
- method public void setLockTaskFeatures(android.content.ComponentName, int);
- method public void setLockTaskPackages(android.content.ComponentName, java.lang.String[]) throws java.lang.SecurityException;
- method public void setLogoutEnabled(android.content.ComponentName, boolean);
- method public void setLongSupportMessage(android.content.ComponentName, java.lang.CharSequence);
- method public void setMasterVolumeMuted(android.content.ComponentName, boolean);
- method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int);
- method public void setMaximumTimeToLock(android.content.ComponentName, long);
- method public java.util.List<java.lang.String> setMeteredDataDisabledPackages(android.content.ComponentName, java.util.List<java.lang.String>);
- method public void setNetworkLoggingEnabled(android.content.ComponentName, boolean);
- method public void setOrganizationColor(android.content.ComponentName, int);
- method public void setOrganizationName(android.content.ComponentName, java.lang.CharSequence);
- method public void setOverrideApnsEnabled(android.content.ComponentName, boolean);
- method public java.lang.String[] setPackagesSuspended(android.content.ComponentName, java.lang.String[], boolean);
- method public void setPasswordExpirationTimeout(android.content.ComponentName, long);
- method public void setPasswordHistoryLength(android.content.ComponentName, int);
- method public void setPasswordMinimumLength(android.content.ComponentName, int);
- method public void setPasswordMinimumLetters(android.content.ComponentName, int);
- method public void setPasswordMinimumLowerCase(android.content.ComponentName, int);
- method public void setPasswordMinimumNonLetter(android.content.ComponentName, int);
- method public void setPasswordMinimumNumeric(android.content.ComponentName, int);
- method public void setPasswordMinimumSymbols(android.content.ComponentName, int);
- method public void setPasswordMinimumUpperCase(android.content.ComponentName, int);
- method public void setPasswordQuality(android.content.ComponentName, int);
- method public boolean setPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String, int);
- method public void setPermissionPolicy(android.content.ComponentName, int);
- method public boolean setPermittedAccessibilityServices(android.content.ComponentName, java.util.List<java.lang.String>);
- method public boolean setPermittedCrossProfileNotificationListeners(android.content.ComponentName, java.util.List<java.lang.String>);
- method public boolean setPermittedInputMethods(android.content.ComponentName, java.util.List<java.lang.String>);
- method public void setProfileEnabled(android.content.ComponentName);
- method public void setProfileName(android.content.ComponentName, java.lang.String);
- method public void setRecommendedGlobalProxy(android.content.ComponentName, android.net.ProxyInfo);
- method public void setRequiredStrongAuthTimeout(android.content.ComponentName, long);
+ method public int logoutUser(@NonNull android.content.ComponentName);
+ method public void reboot(@NonNull android.content.ComponentName);
+ method public void removeActiveAdmin(@NonNull android.content.ComponentName);
+ method public boolean removeCrossProfileCalendarPackage(@NonNull android.content.ComponentName, @NonNull String);
+ method public boolean removeCrossProfileWidgetProvider(@NonNull android.content.ComponentName, String);
+ method public boolean removeKeyPair(@Nullable android.content.ComponentName, @NonNull String);
+ method public boolean removeOverrideApn(@NonNull android.content.ComponentName, int);
+ method public boolean removeUser(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
+ method public boolean requestBugreport(@NonNull android.content.ComponentName);
+ method public boolean resetPassword(String, int);
+ method public boolean resetPasswordWithToken(@NonNull android.content.ComponentName, String, byte[], int);
+ method @Nullable public java.util.List<android.app.admin.NetworkEvent> retrieveNetworkLogs(@Nullable android.content.ComponentName, long);
+ method @Nullable public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(@NonNull android.content.ComponentName);
+ method @Nullable public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(@NonNull android.content.ComponentName);
+ method public void setAccountManagementDisabled(@NonNull android.content.ComponentName, String, boolean);
+ method public void setAffiliationIds(@NonNull android.content.ComponentName, @NonNull java.util.Set<java.lang.String>);
+ method public void setAlwaysOnVpnPackage(@NonNull android.content.ComponentName, @Nullable String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
+ method public boolean setApplicationHidden(@NonNull android.content.ComponentName, String, boolean);
+ method @WorkerThread public void setApplicationRestrictions(@Nullable android.content.ComponentName, String, android.os.Bundle);
+ method @Deprecated public void setApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName, @Nullable String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void setAutoTimeRequired(@NonNull android.content.ComponentName, boolean);
+ method public void setBackupServiceEnabled(@NonNull android.content.ComponentName, boolean);
+ method public void setBluetoothContactSharingDisabled(@NonNull android.content.ComponentName, boolean);
+ method public void setCameraDisabled(@NonNull android.content.ComponentName, boolean);
+ method @Deprecated public void setCertInstallerPackage(@NonNull android.content.ComponentName, @Nullable String) throws java.lang.SecurityException;
+ method public void setCrossProfileCallerIdDisabled(@NonNull android.content.ComponentName, boolean);
+ method public void setCrossProfileContactsSearchDisabled(@NonNull android.content.ComponentName, boolean);
+ method public void setDelegatedScopes(@NonNull android.content.ComponentName, @NonNull String, @NonNull java.util.List<java.lang.String>);
+ method public void setDeviceOwnerLockScreenInfo(@NonNull android.content.ComponentName, CharSequence);
+ method public void setEndUserSessionMessage(@NonNull android.content.ComponentName, @Nullable CharSequence);
+ method public int setGlobalPrivateDns(@NonNull android.content.ComponentName, int, @Nullable String);
+ method public void setGlobalSetting(@NonNull android.content.ComponentName, String, String);
+ method public void setKeepUninstalledPackages(@Nullable android.content.ComponentName, @NonNull java.util.List<java.lang.String>);
+ method public boolean setKeyPairCertificate(@Nullable android.content.ComponentName, @NonNull String, @NonNull java.util.List<java.security.cert.Certificate>, boolean);
+ method public boolean setKeyguardDisabled(@NonNull android.content.ComponentName, boolean);
+ method public void setKeyguardDisabledFeatures(@NonNull android.content.ComponentName, int);
+ method public void setLockTaskFeatures(@NonNull android.content.ComponentName, int);
+ method public void setLockTaskPackages(@NonNull android.content.ComponentName, @NonNull String[]) throws java.lang.SecurityException;
+ method public void setLogoutEnabled(@NonNull android.content.ComponentName, boolean);
+ method public void setLongSupportMessage(@NonNull android.content.ComponentName, @Nullable CharSequence);
+ method public void setMasterVolumeMuted(@NonNull android.content.ComponentName, boolean);
+ method public void setMaximumFailedPasswordsForWipe(@NonNull android.content.ComponentName, int);
+ method public void setMaximumTimeToLock(@NonNull android.content.ComponentName, long);
+ method @NonNull public java.util.List<java.lang.String> setMeteredDataDisabledPackages(@NonNull android.content.ComponentName, @NonNull java.util.List<java.lang.String>);
+ method public void setNetworkLoggingEnabled(@Nullable android.content.ComponentName, boolean);
+ method public void setOrganizationColor(@NonNull android.content.ComponentName, int);
+ method public void setOrganizationName(@NonNull android.content.ComponentName, @Nullable CharSequence);
+ method public void setOverrideApnsEnabled(@NonNull android.content.ComponentName, boolean);
+ method @NonNull public String[] setPackagesSuspended(@NonNull android.content.ComponentName, @NonNull String[], boolean);
+ method public void setPasswordExpirationTimeout(@NonNull android.content.ComponentName, long);
+ method public void setPasswordHistoryLength(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumLength(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumLetters(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumLowerCase(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumNonLetter(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumNumeric(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumSymbols(@NonNull android.content.ComponentName, int);
+ method public void setPasswordMinimumUpperCase(@NonNull android.content.ComponentName, int);
+ method public void setPasswordQuality(@NonNull android.content.ComponentName, int);
+ method public boolean setPermissionGrantState(@NonNull android.content.ComponentName, String, String, int);
+ method public void setPermissionPolicy(@NonNull android.content.ComponentName, int);
+ method public boolean setPermittedAccessibilityServices(@NonNull android.content.ComponentName, java.util.List<java.lang.String>);
+ method public boolean setPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName, @Nullable java.util.List<java.lang.String>);
+ method public boolean setPermittedInputMethods(@NonNull android.content.ComponentName, java.util.List<java.lang.String>);
+ method public void setProfileEnabled(@NonNull android.content.ComponentName);
+ method public void setProfileName(@NonNull android.content.ComponentName, String);
+ method public void setRecommendedGlobalProxy(@NonNull android.content.ComponentName, @Nullable android.net.ProxyInfo);
+ method public void setRequiredStrongAuthTimeout(@NonNull android.content.ComponentName, long);
method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
- method public void setRestrictionsProvider(android.content.ComponentName, android.content.ComponentName);
- method public void setScreenCaptureDisabled(android.content.ComponentName, boolean);
- method public void setSecureSetting(android.content.ComponentName, java.lang.String, java.lang.String);
- method public void setSecurityLoggingEnabled(android.content.ComponentName, boolean);
- method public void setShortSupportMessage(android.content.ComponentName, java.lang.CharSequence);
- method public void setStartUserSessionMessage(android.content.ComponentName, java.lang.CharSequence);
- method public boolean setStatusBarDisabled(android.content.ComponentName, boolean);
- method public int setStorageEncryption(android.content.ComponentName, boolean);
- method public void setSystemSetting(android.content.ComponentName, java.lang.String, java.lang.String);
- method public void setSystemUpdatePolicy(android.content.ComponentName, android.app.admin.SystemUpdatePolicy);
- method public boolean setTime(android.content.ComponentName, long);
- method public boolean setTimeZone(android.content.ComponentName, java.lang.String);
- method public void setTrustAgentConfiguration(android.content.ComponentName, android.content.ComponentName, android.os.PersistableBundle);
- method public void setUninstallBlocked(android.content.ComponentName, java.lang.String, boolean);
- method public void setUserIcon(android.content.ComponentName, android.graphics.Bitmap);
- method public int startUserInBackground(android.content.ComponentName, android.os.UserHandle);
- method public int stopUser(android.content.ComponentName, android.os.UserHandle);
- method public boolean switchUser(android.content.ComponentName, android.os.UserHandle);
- method public void transferOwnership(android.content.ComponentName, android.content.ComponentName, android.os.PersistableBundle);
- method public void uninstallAllUserCaCerts(android.content.ComponentName);
- method public void uninstallCaCert(android.content.ComponentName, byte[]);
- method public boolean updateOverrideApn(android.content.ComponentName, int, android.telephony.data.ApnSetting);
+ method public void setRestrictionsProvider(@NonNull android.content.ComponentName, @Nullable android.content.ComponentName);
+ method public void setScreenCaptureDisabled(@NonNull android.content.ComponentName, boolean);
+ method public void setSecureSetting(@NonNull android.content.ComponentName, String, String);
+ method public void setSecurityLoggingEnabled(@NonNull android.content.ComponentName, boolean);
+ method public void setShortSupportMessage(@NonNull android.content.ComponentName, @Nullable CharSequence);
+ method public void setStartUserSessionMessage(@NonNull android.content.ComponentName, @Nullable CharSequence);
+ method public boolean setStatusBarDisabled(@NonNull android.content.ComponentName, boolean);
+ method public int setStorageEncryption(@NonNull android.content.ComponentName, boolean);
+ method public void setSystemSetting(@NonNull android.content.ComponentName, @NonNull String, String);
+ method public void setSystemUpdatePolicy(@NonNull android.content.ComponentName, android.app.admin.SystemUpdatePolicy);
+ method public boolean setTime(@NonNull android.content.ComponentName, long);
+ method public boolean setTimeZone(@NonNull android.content.ComponentName, String);
+ method public void setTrustAgentConfiguration(@NonNull android.content.ComponentName, @NonNull android.content.ComponentName, android.os.PersistableBundle);
+ method public void setUninstallBlocked(@Nullable android.content.ComponentName, String, boolean);
+ method public void setUserIcon(@NonNull android.content.ComponentName, android.graphics.Bitmap);
+ method public int startUserInBackground(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
+ method public int stopUser(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
+ method public boolean switchUser(@NonNull android.content.ComponentName, @Nullable android.os.UserHandle);
+ method public void transferOwnership(@NonNull android.content.ComponentName, @NonNull android.content.ComponentName, @Nullable android.os.PersistableBundle);
+ method public void uninstallAllUserCaCerts(@Nullable android.content.ComponentName);
+ method public void uninstallCaCert(@Nullable android.content.ComponentName, byte[]);
+ method public boolean updateOverrideApn(@NonNull android.content.ComponentName, int, @NonNull android.telephony.data.ApnSetting);
method public void wipeData(int);
- method public void wipeData(int, java.lang.CharSequence);
- field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";
- field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
- field public static final java.lang.String ACTION_DEVICE_ADMIN_SERVICE = "android.app.action.DEVICE_ADMIN_SERVICE";
- field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_PROVISIONED = "android.app.action.MANAGED_PROFILE_PROVISIONED";
- field public static final java.lang.String ACTION_PROFILE_OWNER_CHANGED = "android.app.action.PROFILE_OWNER_CHANGED";
- field public static final java.lang.String ACTION_PROVISIONING_SUCCESSFUL = "android.app.action.PROVISIONING_SUCCESSFUL";
- field public static final java.lang.String ACTION_PROVISION_MANAGED_DEVICE = "android.app.action.PROVISION_MANAGED_DEVICE";
- field public static final java.lang.String ACTION_PROVISION_MANAGED_PROFILE = "android.app.action.PROVISION_MANAGED_PROFILE";
- field public static final java.lang.String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD";
- field public static final java.lang.String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD";
- field public static final java.lang.String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION";
- field public static final java.lang.String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
- field public static final java.lang.String DELEGATION_APP_RESTRICTIONS = "delegation-app-restrictions";
- field public static final java.lang.String DELEGATION_BLOCK_UNINSTALL = "delegation-block-uninstall";
- field public static final java.lang.String DELEGATION_CERT_INSTALL = "delegation-cert-install";
- field public static final java.lang.String DELEGATION_CERT_SELECTION = "delegation-cert-selection";
- field public static final java.lang.String DELEGATION_ENABLE_SYSTEM_APP = "delegation-enable-system-app";
- field public static final java.lang.String DELEGATION_INSTALL_EXISTING_PACKAGE = "delegation-install-existing-package";
- field public static final java.lang.String DELEGATION_KEEP_UNINSTALLED_PACKAGES = "delegation-keep-uninstalled-packages";
- field public static final java.lang.String DELEGATION_NETWORK_LOGGING = "delegation-network-logging";
- field public static final java.lang.String DELEGATION_PACKAGE_ACCESS = "delegation-package-access";
- field public static final java.lang.String DELEGATION_PACKAGE_INSTALLATION = "delegation-package-installation";
- field public static final java.lang.String DELEGATION_PERMISSION_GRANT = "delegation-permission-grant";
+ method public void wipeData(int, CharSequence);
+ field public static final String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";
+ field public static final String ACTION_ADMIN_POLICY_COMPLIANCE = "android.app.action.ADMIN_POLICY_COMPLIANCE";
+ field public static final String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
+ field public static final String ACTION_DEVICE_ADMIN_SERVICE = "android.app.action.DEVICE_ADMIN_SERVICE";
+ field public static final String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED";
+ field public static final String ACTION_GET_PROVISIONING_MODE = "android.app.action.GET_PROVISIONING_MODE";
+ field public static final String ACTION_MANAGED_PROFILE_PROVISIONED = "android.app.action.MANAGED_PROFILE_PROVISIONED";
+ field public static final String ACTION_PROFILE_OWNER_CHANGED = "android.app.action.PROFILE_OWNER_CHANGED";
+ field public static final String ACTION_PROVISIONING_SUCCESSFUL = "android.app.action.PROVISIONING_SUCCESSFUL";
+ field public static final String ACTION_PROVISION_MANAGED_DEVICE = "android.app.action.PROVISION_MANAGED_DEVICE";
+ field public static final String ACTION_PROVISION_MANAGED_PROFILE = "android.app.action.PROVISION_MANAGED_PROFILE";
+ field public static final String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD";
+ field public static final String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD";
+ field public static final String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION";
+ field public static final String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
+ field public static final String DELEGATION_APP_RESTRICTIONS = "delegation-app-restrictions";
+ field public static final String DELEGATION_BLOCK_UNINSTALL = "delegation-block-uninstall";
+ field public static final String DELEGATION_CERT_INSTALL = "delegation-cert-install";
+ field public static final String DELEGATION_CERT_SELECTION = "delegation-cert-selection";
+ field public static final String DELEGATION_ENABLE_SYSTEM_APP = "delegation-enable-system-app";
+ field public static final String DELEGATION_INSTALL_EXISTING_PACKAGE = "delegation-install-existing-package";
+ field public static final String DELEGATION_KEEP_UNINSTALLED_PACKAGES = "delegation-keep-uninstalled-packages";
+ field public static final String DELEGATION_NETWORK_LOGGING = "delegation-network-logging";
+ field public static final String DELEGATION_PACKAGE_ACCESS = "delegation-package-access";
+ field public static final String DELEGATION_PACKAGE_INSTALLATION = "delegation-package-installation";
+ field public static final String DELEGATION_PERMISSION_GRANT = "delegation-permission-grant";
field public static final int ENCRYPTION_STATUS_ACTIVATING = 2; // 0x2
field public static final int ENCRYPTION_STATUS_ACTIVE = 3; // 0x3
field public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4; // 0x4
field public static final int ENCRYPTION_STATUS_ACTIVE_PER_USER = 5; // 0x5
field public static final int ENCRYPTION_STATUS_INACTIVE = 1; // 0x1
field public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0; // 0x0
- field public static final java.lang.String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
- field public static final java.lang.String EXTRA_DELEGATION_SCOPES = "android.app.extra.DELEGATION_SCOPES";
- field public static final java.lang.String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
- field public static final java.lang.String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE";
- field public static final java.lang.String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
- field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM";
- field public static final java.lang.String EXTRA_PROVISIONING_DISCLAIMERS = "android.app.extra.PROVISIONING_DISCLAIMERS";
- field public static final java.lang.String EXTRA_PROVISIONING_DISCLAIMER_CONTENT = "android.app.extra.PROVISIONING_DISCLAIMER_CONTENT";
- field public static final java.lang.String EXTRA_PROVISIONING_DISCLAIMER_HEADER = "android.app.extra.PROVISIONING_DISCLAIMER_HEADER";
- field public static final deprecated java.lang.String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.PROVISIONING_EMAIL_ADDRESS";
- field public static final java.lang.String EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION = "android.app.extra.PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION";
- field public static final java.lang.String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED";
- field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE";
- field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME";
- field public static final java.lang.String EXTRA_PROVISIONING_LOGO_URI = "android.app.extra.PROVISIONING_LOGO_URI";
- field public static final java.lang.String EXTRA_PROVISIONING_MAIN_COLOR = "android.app.extra.PROVISIONING_MAIN_COLOR";
- field public static final java.lang.String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
- field public static final java.lang.String EXTRA_PROVISIONING_SKIP_USER_CONSENT = "android.app.extra.PROVISIONING_SKIP_USER_CONSENT";
- field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY = "android.app.extra.PROVISIONING_WIFI_ANONYMOUS_IDENTITY";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE = "android.app.extra.PROVISIONING_WIFI_CA_CERTIFICATE";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_DOMAIN = "android.app.extra.PROVISIONING_WIFI_DOMAIN";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_EAP_METHOD = "android.app.extra.PROVISIONING_WIFI_EAP_METHOD";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_IDENTITY = "android.app.extra.PROVISIONING_WIFI_IDENTITY";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PAC_URL = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PASSWORD = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PHASE2_AUTH = "android.app.extra.PROVISIONING_WIFI_PHASE2_AUTH";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_HOST = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE = "android.app.extra.PROVISIONING_WIFI_USER_CERTIFICATE";
+ field public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
+ field public static final String EXTRA_DELEGATION_SCOPES = "android.app.extra.DELEGATION_SCOPES";
+ field public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
+ field public static final String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE";
+ field public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
+ field @Deprecated public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM";
+ field public static final String EXTRA_PROVISIONING_DISCLAIMERS = "android.app.extra.PROVISIONING_DISCLAIMERS";
+ field public static final String EXTRA_PROVISIONING_DISCLAIMER_CONTENT = "android.app.extra.PROVISIONING_DISCLAIMER_CONTENT";
+ field public static final String EXTRA_PROVISIONING_DISCLAIMER_HEADER = "android.app.extra.PROVISIONING_DISCLAIMER_HEADER";
+ field @Deprecated public static final String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.PROVISIONING_EMAIL_ADDRESS";
+ field public static final String EXTRA_PROVISIONING_IMEI = "android.app.extra.PROVISIONING_IMEI";
+ field public static final String EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION = "android.app.extra.PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION";
+ field public static final String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED";
+ field public static final String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE";
+ field public static final String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME";
+ field public static final String EXTRA_PROVISIONING_LOGO_URI = "android.app.extra.PROVISIONING_LOGO_URI";
+ field public static final String EXTRA_PROVISIONING_MAIN_COLOR = "android.app.extra.PROVISIONING_MAIN_COLOR";
+ field public static final String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE";
+ field public static final String EXTRA_PROVISIONING_SERIAL_NUMBER = "android.app.extra.PROVISIONING_SERIAL_NUMBER";
+ field public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
+ field public static final String EXTRA_PROVISIONING_SKIP_USER_CONSENT = "android.app.extra.PROVISIONING_SKIP_USER_CONSENT";
+ field public static final String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE";
+ field public static final String EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY = "android.app.extra.PROVISIONING_WIFI_ANONYMOUS_IDENTITY";
+ field public static final String EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE = "android.app.extra.PROVISIONING_WIFI_CA_CERTIFICATE";
+ field public static final String EXTRA_PROVISIONING_WIFI_DOMAIN = "android.app.extra.PROVISIONING_WIFI_DOMAIN";
+ field public static final String EXTRA_PROVISIONING_WIFI_EAP_METHOD = "android.app.extra.PROVISIONING_WIFI_EAP_METHOD";
+ field public static final String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
+ field public static final String EXTRA_PROVISIONING_WIFI_IDENTITY = "android.app.extra.PROVISIONING_WIFI_IDENTITY";
+ field public static final String EXTRA_PROVISIONING_WIFI_PAC_URL = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
+ field public static final String EXTRA_PROVISIONING_WIFI_PASSWORD = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
+ field public static final String EXTRA_PROVISIONING_WIFI_PHASE2_AUTH = "android.app.extra.PROVISIONING_WIFI_PHASE2_AUTH";
+ field public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
+ field public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
+ field public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
+ field public static final String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
+ field public static final String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
+ field public static final String EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE = "android.app.extra.PROVISIONING_WIFI_USER_CERTIFICATE";
field public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
@@ -6863,7 +6892,7 @@ package android.app.admin {
field public static final int LOCK_TASK_FEATURE_OVERVIEW = 8; // 0x8
field public static final int LOCK_TASK_FEATURE_SYSTEM_INFO = 1; // 0x1
field public static final int MAKE_USER_EPHEMERAL = 2; // 0x2
- field public static final java.lang.String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning";
+ field public static final String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning";
field public static final int PASSWORD_COMPLEXITY_HIGH = 327680; // 0x50000
field public static final int PASSWORD_COMPLEXITY_LOW = 65536; // 0x10000
field public static final int PASSWORD_COMPLEXITY_MEDIUM = 196608; // 0x30000
@@ -6882,8 +6911,8 @@ package android.app.admin {
field public static final int PERMISSION_POLICY_AUTO_DENY = 2; // 0x2
field public static final int PERMISSION_POLICY_AUTO_GRANT = 1; // 0x1
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
- field public static final java.lang.String POLICY_DISABLE_CAMERA = "policy_disable_camera";
- field public static final java.lang.String POLICY_DISABLE_SCREEN_CAPTURE = "policy_disable_screen_capture";
+ field public static final String POLICY_DISABLE_CAMERA = "policy_disable_camera";
+ field public static final String POLICY_DISABLE_SCREEN_CAPTURE = "policy_disable_screen_capture";
field public static final int PRIVATE_DNS_MODE_OFF = 1; // 0x1
field public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2; // 0x2
field public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3; // 0x3
@@ -6891,6 +6920,9 @@ package android.app.admin {
field public static final int PRIVATE_DNS_SET_ERROR_FAILURE_SETTING = 2; // 0x2
field public static final int PRIVATE_DNS_SET_ERROR_HOST_NOT_SERVING = 1; // 0x1
field public static final int PRIVATE_DNS_SET_SUCCESS = 0; // 0x0
+ field public static final int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1; // 0x1
+ field public static final int PROVISIONING_MODE_MANAGED_PROFILE = 2; // 0x2
+ field public static final int PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 3; // 0x3
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
@@ -6899,9 +6931,9 @@ package android.app.admin {
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
- public static abstract class DevicePolicyManager.InstallUpdateCallback {
+ public abstract static class DevicePolicyManager.InstallUpdateCallback {
ctor public DevicePolicyManager.InstallUpdateCallback();
- method public void onInstallUpdateError(int, java.lang.String);
+ method public void onInstallUpdateError(int, String);
field public static final int UPDATE_ERROR_BATTERY_LOW = 5; // 0x5
field public static final int UPDATE_ERROR_FILE_NOT_FOUND = 4; // 0x4
field public static final int UPDATE_ERROR_INCORRECT_OS_VERSION = 2; // 0x2
@@ -6909,12 +6941,12 @@ package android.app.admin {
field public static final int UPDATE_ERROR_UPDATE_FILE_INVALID = 3; // 0x3
}
- public static abstract interface DevicePolicyManager.OnClearApplicationUserDataListener {
- method public abstract void onApplicationUserDataCleared(java.lang.String, boolean);
+ public static interface DevicePolicyManager.OnClearApplicationUserDataListener {
+ method public void onApplicationUserDataCleared(String, boolean);
}
public final class DnsEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
- method public java.lang.String getHostname();
+ method public String getHostname();
method public java.util.List<java.net.InetAddress> getInetAddresses();
method public int getTotalResolvedAddressCount();
method public void writeToParcel(android.os.Parcel, int);
@@ -6930,7 +6962,7 @@ package android.app.admin {
public abstract class NetworkEvent implements android.os.Parcelable {
method public int describeContents();
method public long getId();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public long getTimestamp();
field public static final android.os.Parcelable.Creator<android.app.admin.NetworkEvent> CREATOR;
}
@@ -6977,7 +7009,7 @@ package android.app.admin {
public static final class SecurityLog.SecurityEvent implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.Object getData();
+ method public Object getData();
method public long getId();
method public int getLogLevel();
method public int getTag();
@@ -7037,13 +7069,13 @@ package android.app.assist {
method public android.content.ClipData getClipData();
method public android.os.Bundle getExtras();
method public android.content.Intent getIntent();
- method public java.lang.String getStructuredData();
+ method public String getStructuredData();
method public android.net.Uri getWebUri();
method public boolean isAppProvidedIntent();
method public boolean isAppProvidedWebUri();
method public void setClipData(android.content.ClipData);
method public void setIntent(android.content.Intent);
- method public void setStructuredData(java.lang.String);
+ method public void setStructuredData(String);
method public void setWebUri(android.net.Uri);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.assist.AssistContent> CREATOR;
@@ -7064,37 +7096,37 @@ package android.app.assist {
public static class AssistStructure.ViewNode {
method public float getAlpha();
- method public java.lang.String[] getAutofillHints();
- method public android.view.autofill.AutofillId getAutofillId();
- method public java.lang.CharSequence[] getAutofillOptions();
+ method @Nullable public String[] getAutofillHints();
+ method @Nullable public android.view.autofill.AutofillId getAutofillId();
+ method @Nullable public CharSequence[] getAutofillOptions();
method public int getAutofillType();
- method public android.view.autofill.AutofillValue getAutofillValue();
+ method @Nullable public android.view.autofill.AutofillValue getAutofillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
- method public java.lang.String getClassName();
- method public java.lang.CharSequence getContentDescription();
+ method public String getClassName();
+ method public CharSequence getContentDescription();
method public float getElevation();
method public android.os.Bundle getExtras();
method public int getHeight();
- method public java.lang.String getHint();
- method public android.view.ViewStructure.HtmlInfo getHtmlInfo();
+ method public String getHint();
+ method @Nullable public android.view.ViewStructure.HtmlInfo getHtmlInfo();
method public int getId();
- method public java.lang.String getIdEntry();
- method public java.lang.String getIdPackage();
- method public java.lang.String getIdType();
+ method public String getIdEntry();
+ method public String getIdPackage();
+ method public String getIdType();
method public int getImportantForAutofill();
method public int getInputType();
method public int getLeft();
- method public android.os.LocaleList getLocaleList();
+ method @Nullable public android.os.LocaleList getLocaleList();
method public int getMaxTextEms();
method public int getMaxTextLength();
method public int getMinTextEms();
method public int getScrollX();
method public int getScrollY();
- method public java.lang.CharSequence getText();
+ method public CharSequence getText();
method public int getTextBackgroundColor();
method public int getTextColor();
- method public java.lang.String getTextIdEntry();
+ method @Nullable public String getTextIdEntry();
method public int[] getTextLineBaselines();
method public int[] getTextLineCharOffsets();
method public int getTextSelectionEnd();
@@ -7104,8 +7136,8 @@ package android.app.assist {
method public int getTop();
method public android.graphics.Matrix getTransformation();
method public int getVisibility();
- method public java.lang.String getWebDomain();
- method public java.lang.String getWebScheme();
+ method @Nullable public String getWebDomain();
+ method @Nullable public String getWebScheme();
method public int getWidth();
method public boolean isAccessibilityFocused();
method public boolean isActivated();
@@ -7132,7 +7164,7 @@ package android.app.assist {
method public int getHeight();
method public int getLeft();
method public android.app.assist.AssistStructure.ViewNode getRootViewNode();
- method public java.lang.CharSequence getTitle();
+ method public CharSequence getTitle();
method public int getTop();
method public int getWidth();
}
@@ -7161,21 +7193,21 @@ package android.app.backup {
public class BackupAgentHelper extends android.app.backup.BackupAgent {
ctor public BackupAgentHelper();
- method public void addHelper(java.lang.String, android.app.backup.BackupHelper);
+ method public void addHelper(String, android.app.backup.BackupHelper);
method public void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void onRestore(android.app.backup.BackupDataInput, int, android.os.ParcelFileDescriptor) throws java.io.IOException;
}
public class BackupDataInput {
method public int getDataSize();
- method public java.lang.String getKey();
+ method public String getKey();
method public int readEntityData(byte[], int, int) throws java.io.IOException;
method public boolean readNextHeader() throws java.io.IOException;
method public void skipEntityData() throws java.io.IOException;
}
public class BackupDataInputStream extends java.io.InputStream {
- method public java.lang.String getKey();
+ method public String getKey();
method public int read() throws java.io.IOException;
method public int size();
}
@@ -7184,26 +7216,27 @@ package android.app.backup {
method public long getQuota();
method public int getTransportFlags();
method public int writeEntityData(byte[], int) throws java.io.IOException;
- method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException;
+ method public int writeEntityHeader(String, int) throws java.io.IOException;
}
- public abstract interface BackupHelper {
- method public abstract void performBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor);
- method public abstract void restoreEntity(android.app.backup.BackupDataInputStream);
- method public abstract void writeNewStateDescription(android.os.ParcelFileDescriptor);
+ public interface BackupHelper {
+ method public void performBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor);
+ method public void restoreEntity(android.app.backup.BackupDataInputStream);
+ method public void writeNewStateDescription(android.os.ParcelFileDescriptor);
}
public class BackupManager {
ctor public BackupManager(android.content.Context);
method public void dataChanged();
- method public static void dataChanged(java.lang.String);
- method public deprecated int requestRestore(android.app.backup.RestoreObserver);
+ method public static void dataChanged(String);
+ method @Deprecated public int requestRestore(android.app.backup.RestoreObserver);
}
public class FileBackupHelper implements android.app.backup.BackupHelper {
ctor public FileBackupHelper(android.content.Context, java.lang.String...);
method public void performBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor);
method public void restoreEntity(android.app.backup.BackupDataInputStream);
+ method public void writeNewStateDescription(android.os.ParcelFileDescriptor);
}
public class FullBackupDataOutput {
@@ -7213,7 +7246,7 @@ package android.app.backup {
public abstract class RestoreObserver {
ctor public RestoreObserver();
- method public void onUpdate(int, java.lang.String);
+ method public void onUpdate(int, String);
method public void restoreFinished(int);
method public void restoreStarting(int);
}
@@ -7222,6 +7255,7 @@ package android.app.backup {
ctor public SharedPreferencesBackupHelper(android.content.Context, java.lang.String...);
method public void performBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor);
method public void restoreEntity(android.app.backup.BackupDataInputStream);
+ method public void writeNewStateDescription(android.os.ParcelFileDescriptor);
}
}
@@ -7231,11 +7265,11 @@ package android.app.job {
public class JobInfo implements android.os.Parcelable {
method public int describeContents();
method public int getBackoffPolicy();
- method public android.content.ClipData getClipData();
+ method @Nullable public android.content.ClipData getClipData();
method public int getClipGrantFlags();
method public long getEstimatedNetworkDownloadBytes();
method public long getEstimatedNetworkUploadBytes();
- method public android.os.PersistableBundle getExtras();
+ method @NonNull public android.os.PersistableBundle getExtras();
method public long getFlexMillis();
method public int getId();
method public long getInitialBackoffMillis();
@@ -7244,13 +7278,13 @@ package android.app.job {
method public static final long getMinFlexMillis();
method public long getMinLatencyMillis();
method public static final long getMinPeriodMillis();
- method public deprecated int getNetworkType();
- method public android.net.NetworkRequest getRequiredNetwork();
- method public android.content.ComponentName getService();
- method public android.os.Bundle getTransientExtras();
+ method @Deprecated public int getNetworkType();
+ method @Nullable public android.net.NetworkRequest getRequiredNetwork();
+ method @NonNull public android.content.ComponentName getService();
+ method @NonNull public android.os.Bundle getTransientExtras();
method public long getTriggerContentMaxDelay();
method public long getTriggerContentUpdateDelay();
- method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
+ method @Nullable public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isImportantWhileForeground();
method public boolean isPeriodic();
method public boolean isPersisted();
@@ -7268,40 +7302,40 @@ package android.app.job {
field public static final int NETWORK_BYTES_UNKNOWN = -1; // 0xffffffff
field public static final int NETWORK_TYPE_ANY = 1; // 0x1
field public static final int NETWORK_TYPE_CELLULAR = 4; // 0x4
- field public static final deprecated int NETWORK_TYPE_METERED = 4; // 0x4
+ field @Deprecated public static final int NETWORK_TYPE_METERED = 4; // 0x4
field public static final int NETWORK_TYPE_NONE = 0; // 0x0
field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3
field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2
}
public static final class JobInfo.Builder {
- ctor public JobInfo.Builder(int, android.content.ComponentName);
- method public android.app.job.JobInfo.Builder addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri);
+ ctor public JobInfo.Builder(int, @NonNull android.content.ComponentName);
+ method public android.app.job.JobInfo.Builder addTriggerContentUri(@NonNull android.app.job.JobInfo.TriggerContentUri);
method public android.app.job.JobInfo build();
method public android.app.job.JobInfo.Builder setBackoffCriteria(long, int);
- method public android.app.job.JobInfo.Builder setClipData(android.content.ClipData, int);
+ method public android.app.job.JobInfo.Builder setClipData(@Nullable android.content.ClipData, int);
method public android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long, long);
- method public android.app.job.JobInfo.Builder setExtras(android.os.PersistableBundle);
+ method public android.app.job.JobInfo.Builder setExtras(@NonNull android.os.PersistableBundle);
method public android.app.job.JobInfo.Builder setImportantWhileForeground(boolean);
method public android.app.job.JobInfo.Builder setMinimumLatency(long);
method public android.app.job.JobInfo.Builder setOverrideDeadline(long);
method public android.app.job.JobInfo.Builder setPeriodic(long);
method public android.app.job.JobInfo.Builder setPeriodic(long, long);
- method public android.app.job.JobInfo.Builder setPersisted(boolean);
+ method @RequiresPermission(android.Manifest.permission.RECEIVE_BOOT_COMPLETED) public android.app.job.JobInfo.Builder setPersisted(boolean);
method public android.app.job.JobInfo.Builder setPrefetch(boolean);
- method public android.app.job.JobInfo.Builder setRequiredNetwork(android.net.NetworkRequest);
+ method public android.app.job.JobInfo.Builder setRequiredNetwork(@Nullable android.net.NetworkRequest);
method public android.app.job.JobInfo.Builder setRequiredNetworkType(int);
method public android.app.job.JobInfo.Builder setRequiresBatteryNotLow(boolean);
method public android.app.job.JobInfo.Builder setRequiresCharging(boolean);
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
method public android.app.job.JobInfo.Builder setRequiresStorageNotLow(boolean);
- method public android.app.job.JobInfo.Builder setTransientExtras(android.os.Bundle);
+ method public android.app.job.JobInfo.Builder setTransientExtras(@NonNull android.os.Bundle);
method public android.app.job.JobInfo.Builder setTriggerContentMaxDelay(long);
method public android.app.job.JobInfo.Builder setTriggerContentUpdateDelay(long);
}
public static final class JobInfo.TriggerContentUri implements android.os.Parcelable {
- ctor public JobInfo.TriggerContentUri(android.net.Uri, int);
+ ctor public JobInfo.TriggerContentUri(@NonNull android.net.Uri, int);
method public int describeContents();
method public int getFlags();
method public android.net.Uri getUri();
@@ -7311,17 +7345,17 @@ package android.app.job {
}
public class JobParameters implements android.os.Parcelable {
- method public void completeWork(android.app.job.JobWorkItem);
- method public android.app.job.JobWorkItem dequeueWork();
+ method public void completeWork(@NonNull android.app.job.JobWorkItem);
+ method @Nullable public android.app.job.JobWorkItem dequeueWork();
method public int describeContents();
- method public android.content.ClipData getClipData();
+ method @Nullable public android.content.ClipData getClipData();
method public int getClipGrantFlags();
- method public android.os.PersistableBundle getExtras();
+ method @NonNull public android.os.PersistableBundle getExtras();
method public int getJobId();
- method public android.net.Network getNetwork();
- method public android.os.Bundle getTransientExtras();
- method public java.lang.String[] getTriggeredContentAuthorities();
- method public android.net.Uri[] getTriggeredContentUris();
+ method @Nullable public android.net.Network getNetwork();
+ method @NonNull public android.os.Bundle getTransientExtras();
+ method @Nullable public String[] getTriggeredContentAuthorities();
+ method @Nullable public android.net.Uri[] getTriggeredContentUris();
method public boolean isOverrideDeadlineExpired();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
@@ -7331,10 +7365,10 @@ package android.app.job {
ctor public JobScheduler();
method public abstract void cancel(int);
method public abstract void cancelAll();
- method public abstract int enqueue(android.app.job.JobInfo, android.app.job.JobWorkItem);
- method public abstract java.util.List<android.app.job.JobInfo> getAllPendingJobs();
- method public abstract android.app.job.JobInfo getPendingJob(int);
- method public abstract int schedule(android.app.job.JobInfo);
+ method public abstract int enqueue(@NonNull android.app.job.JobInfo, @NonNull android.app.job.JobWorkItem);
+ method @NonNull public abstract java.util.List<android.app.job.JobInfo> getAllPendingJobs();
+ method @Nullable public abstract android.app.job.JobInfo getPendingJob(int);
+ method public abstract int schedule(@NonNull android.app.job.JobInfo);
field public static final int RESULT_FAILURE = 0; // 0x0
field public static final int RESULT_SUCCESS = 1; // 0x1
}
@@ -7345,7 +7379,7 @@ package android.app.job {
method public final android.os.IBinder onBind(android.content.Intent);
method public abstract boolean onStartJob(android.app.job.JobParameters);
method public abstract boolean onStopJob(android.app.job.JobParameters);
- field public static final java.lang.String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE";
+ field public static final String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE";
}
public abstract class JobServiceEngine {
@@ -7373,14 +7407,16 @@ package android.app.job {
package android.app.role {
public final class RoleManager {
- method public android.content.Intent createRequestRoleIntent(java.lang.String);
- method public boolean isRoleAvailable(java.lang.String);
- method public boolean isRoleHeld(java.lang.String);
- field public static final java.lang.String ROLE_BROWSER = "android.app.role.BROWSER";
- field public static final java.lang.String ROLE_DIALER = "android.app.role.DIALER";
- field public static final java.lang.String ROLE_GALLERY = "android.app.role.GALLERY";
- field public static final java.lang.String ROLE_MUSIC = "android.app.role.MUSIC";
- field public static final java.lang.String ROLE_SMS = "android.app.role.SMS";
+ method @NonNull public android.content.Intent createRequestRoleIntent(@NonNull String);
+ method public boolean isRoleAvailable(@NonNull String);
+ method public boolean isRoleHeld(@NonNull String);
+ field public static final String ROLE_BROWSER = "android.app.role.BROWSER";
+ field public static final String ROLE_DIALER = "android.app.role.DIALER";
+ field public static final String ROLE_EMERGENCY = "android.app.role.EMERGENCY";
+ field public static final String ROLE_GALLERY = "android.app.role.GALLERY";
+ field public static final String ROLE_HOME = "android.app.role.HOME";
+ field public static final String ROLE_MUSIC = "android.app.role.MUSIC";
+ field public static final String ROLE_SMS = "android.app.role.SMS";
}
}
@@ -7392,55 +7428,55 @@ package android.app.slice {
method public int describeContents();
method public java.util.List<java.lang.String> getHints();
method public java.util.List<android.app.slice.SliceItem> getItems();
- method public android.app.slice.SliceSpec getSpec();
+ method @Nullable public android.app.slice.SliceSpec getSpec();
method public android.net.Uri getUri();
method public boolean isCallerNeeded();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
- field public static final java.lang.String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
- field public static final java.lang.String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
- field public static final java.lang.String HINT_ACTIONS = "actions";
- field public static final java.lang.String HINT_ERROR = "error";
- field public static final java.lang.String HINT_HORIZONTAL = "horizontal";
- field public static final java.lang.String HINT_KEYWORDS = "keywords";
- field public static final java.lang.String HINT_LARGE = "large";
- field public static final java.lang.String HINT_LAST_UPDATED = "last_updated";
- field public static final java.lang.String HINT_LIST = "list";
- field public static final java.lang.String HINT_LIST_ITEM = "list_item";
- field public static final java.lang.String HINT_NO_TINT = "no_tint";
- field public static final java.lang.String HINT_PARTIAL = "partial";
- field public static final java.lang.String HINT_PERMISSION_REQUEST = "permission_request";
- field public static final java.lang.String HINT_SEE_MORE = "see_more";
- field public static final java.lang.String HINT_SELECTED = "selected";
- field public static final java.lang.String HINT_SHORTCUT = "shortcut";
- field public static final java.lang.String HINT_SUMMARY = "summary";
- field public static final java.lang.String HINT_TITLE = "title";
- field public static final java.lang.String HINT_TTL = "ttl";
- field public static final java.lang.String SUBTYPE_COLOR = "color";
- field public static final java.lang.String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
- field public static final java.lang.String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
- field public static final java.lang.String SUBTYPE_MAX = "max";
- field public static final java.lang.String SUBTYPE_MESSAGE = "message";
- field public static final java.lang.String SUBTYPE_MILLIS = "millis";
- field public static final java.lang.String SUBTYPE_PRIORITY = "priority";
- field public static final java.lang.String SUBTYPE_RANGE = "range";
- field public static final java.lang.String SUBTYPE_SOURCE = "source";
- field public static final java.lang.String SUBTYPE_TOGGLE = "toggle";
- field public static final java.lang.String SUBTYPE_VALUE = "value";
+ field public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
+ field public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
+ field public static final String HINT_ACTIONS = "actions";
+ field public static final String HINT_ERROR = "error";
+ field public static final String HINT_HORIZONTAL = "horizontal";
+ field public static final String HINT_KEYWORDS = "keywords";
+ field public static final String HINT_LARGE = "large";
+ field public static final String HINT_LAST_UPDATED = "last_updated";
+ field public static final String HINT_LIST = "list";
+ field public static final String HINT_LIST_ITEM = "list_item";
+ field public static final String HINT_NO_TINT = "no_tint";
+ field public static final String HINT_PARTIAL = "partial";
+ field public static final String HINT_PERMISSION_REQUEST = "permission_request";
+ field public static final String HINT_SEE_MORE = "see_more";
+ field public static final String HINT_SELECTED = "selected";
+ field public static final String HINT_SHORTCUT = "shortcut";
+ field public static final String HINT_SUMMARY = "summary";
+ field public static final String HINT_TITLE = "title";
+ field public static final String HINT_TTL = "ttl";
+ field public static final String SUBTYPE_COLOR = "color";
+ field public static final String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
+ field public static final String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
+ field public static final String SUBTYPE_MAX = "max";
+ field public static final String SUBTYPE_MESSAGE = "message";
+ field public static final String SUBTYPE_MILLIS = "millis";
+ field public static final String SUBTYPE_PRIORITY = "priority";
+ field public static final String SUBTYPE_RANGE = "range";
+ field public static final String SUBTYPE_SOURCE = "source";
+ field public static final String SUBTYPE_TOGGLE = "toggle";
+ field public static final String SUBTYPE_VALUE = "value";
}
public static class Slice.Builder {
- ctor public Slice.Builder(android.net.Uri, android.app.slice.SliceSpec);
- ctor public Slice.Builder(android.app.slice.Slice.Builder);
- method public android.app.slice.Slice.Builder addAction(android.app.PendingIntent, android.app.slice.Slice, java.lang.String);
- method public android.app.slice.Slice.Builder addBundle(android.os.Bundle, java.lang.String, java.util.List<java.lang.String>);
+ ctor public Slice.Builder(@NonNull android.net.Uri, android.app.slice.SliceSpec);
+ ctor public Slice.Builder(@NonNull android.app.slice.Slice.Builder);
+ method public android.app.slice.Slice.Builder addAction(@NonNull android.app.PendingIntent, @NonNull android.app.slice.Slice, @Nullable String);
+ method public android.app.slice.Slice.Builder addBundle(android.os.Bundle, @Nullable String, java.util.List<java.lang.String>);
method public android.app.slice.Slice.Builder addHints(java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addInt(int, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addLong(long, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addSubSlice(android.app.slice.Slice, java.lang.String);
- method public android.app.slice.Slice.Builder addText(java.lang.CharSequence, java.lang.String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, @Nullable String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addInt(int, @Nullable String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addLong(long, @Nullable String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, @Nullable String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addSubSlice(@NonNull android.app.slice.Slice, @Nullable String);
+ method public android.app.slice.Slice.Builder addText(CharSequence, @Nullable String, java.util.List<java.lang.String>);
method public android.app.slice.Slice build();
method public android.app.slice.Slice.Builder setCallerNeeded(boolean);
}
@@ -7449,76 +7485,76 @@ package android.app.slice {
method public int describeContents();
method public android.app.PendingIntent getAction();
method public android.os.Bundle getBundle();
- method public java.lang.String getFormat();
- method public java.util.List<java.lang.String> getHints();
+ method public String getFormat();
+ method @NonNull public java.util.List<java.lang.String> getHints();
method public android.graphics.drawable.Icon getIcon();
method public int getInt();
method public long getLong();
method public android.app.RemoteInput getRemoteInput();
method public android.app.slice.Slice getSlice();
- method public java.lang.String getSubType();
- method public java.lang.CharSequence getText();
- method public boolean hasHint(java.lang.String);
+ method public String getSubType();
+ method public CharSequence getText();
+ method public boolean hasHint(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.slice.SliceItem> CREATOR;
- field public static final java.lang.String FORMAT_ACTION = "action";
- field public static final java.lang.String FORMAT_BUNDLE = "bundle";
- field public static final java.lang.String FORMAT_IMAGE = "image";
- field public static final java.lang.String FORMAT_INT = "int";
- field public static final java.lang.String FORMAT_LONG = "long";
- field public static final java.lang.String FORMAT_REMOTE_INPUT = "input";
- field public static final java.lang.String FORMAT_SLICE = "slice";
- field public static final java.lang.String FORMAT_TEXT = "text";
+ field public static final String FORMAT_ACTION = "action";
+ field public static final String FORMAT_BUNDLE = "bundle";
+ field public static final String FORMAT_IMAGE = "image";
+ field public static final String FORMAT_INT = "int";
+ field public static final String FORMAT_LONG = "long";
+ field public static final String FORMAT_REMOTE_INPUT = "input";
+ field public static final String FORMAT_SLICE = "slice";
+ field public static final String FORMAT_TEXT = "text";
}
public class SliceManager {
- method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.Set<android.app.slice.SliceSpec>);
- method public int checkSlicePermission(android.net.Uri, int, int);
- method public java.util.List<android.net.Uri> getPinnedSlices();
- method public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
- method public java.util.Collection<android.net.Uri> getSliceDescendants(android.net.Uri);
- method public void grantSlicePermission(java.lang.String, android.net.Uri);
- method public android.net.Uri mapIntentToUri(android.content.Intent);
- method public void pinSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public void revokeSlicePermission(java.lang.String, android.net.Uri);
- method public void unpinSlice(android.net.Uri);
- field public static final java.lang.String CATEGORY_SLICE = "android.app.slice.category.SLICE";
- field public static final java.lang.String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
+ method @Nullable public android.app.slice.Slice bindSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+ method @Nullable public android.app.slice.Slice bindSlice(@NonNull android.content.Intent, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+ method public int checkSlicePermission(@NonNull android.net.Uri, int, int);
+ method @NonNull public java.util.List<android.net.Uri> getPinnedSlices();
+ method @NonNull public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
+ method @WorkerThread @NonNull public java.util.Collection<android.net.Uri> getSliceDescendants(@NonNull android.net.Uri);
+ method public void grantSlicePermission(@NonNull String, @NonNull android.net.Uri);
+ method @Nullable public android.net.Uri mapIntentToUri(@NonNull android.content.Intent);
+ method public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+ method public void revokeSlicePermission(@NonNull String, @NonNull android.net.Uri);
+ method public void unpinSlice(@NonNull android.net.Uri);
+ field public static final String CATEGORY_SLICE = "android.app.slice.category.SLICE";
+ field public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
}
public class SliceMetrics {
- ctor public SliceMetrics(android.content.Context, android.net.Uri);
+ ctor public SliceMetrics(@NonNull android.content.Context, @NonNull android.net.Uri);
method public void logHidden();
- method public void logTouch(int, android.net.Uri);
+ method public void logTouch(int, @NonNull android.net.Uri);
method public void logVisible();
}
public abstract class SliceProvider extends android.content.ContentProvider {
- ctor public SliceProvider(java.lang.String...);
+ ctor public SliceProvider(@NonNull java.lang.String...);
ctor public SliceProvider();
- method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public final java.lang.String getType(android.net.Uri);
+ method public final int delete(android.net.Uri, String, String[]);
+ method public final String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
- method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri);
- method public android.net.Uri onMapIntentToUri(android.content.Intent);
+ method @NonNull public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
+ method @NonNull public java.util.Collection<android.net.Uri> onGetSliceDescendants(@NonNull android.net.Uri);
+ method @NonNull public android.net.Uri onMapIntentToUri(android.content.Intent);
method public void onSlicePinned(android.net.Uri);
method public void onSliceUnpinned(android.net.Uri);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
- field public static final java.lang.String SLICE_TYPE = "vnd.android.slice";
+ method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+ method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String, android.os.CancellationSignal);
+ method public final android.database.Cursor query(android.net.Uri, String[], android.os.Bundle, android.os.CancellationSignal);
+ method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
+ field public static final String SLICE_TYPE = "vnd.android.slice";
}
public final class SliceSpec implements android.os.Parcelable {
- ctor public SliceSpec(java.lang.String, int);
- method public boolean canRender(android.app.slice.SliceSpec);
+ ctor public SliceSpec(@NonNull String, int);
+ method public boolean canRender(@NonNull android.app.slice.SliceSpec);
method public int describeContents();
method public int getRevision();
- method public java.lang.String getType();
+ method public String getType();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
}
@@ -7604,21 +7640,21 @@ package android.app.usage {
}
public class NetworkStatsManager {
- method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
- method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws java.lang.SecurityException;
- method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException;
- method public android.app.usage.NetworkStats queryDetailsForUidTagState(int, java.lang.String, long, long, int, int, int) throws java.lang.SecurityException;
- method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
- method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
- method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
- method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback);
- method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+ method public android.app.usage.NetworkStats queryDetails(int, String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
+ method public android.app.usage.NetworkStats queryDetailsForUid(int, String, long, long, int) throws java.lang.SecurityException;
+ method public android.app.usage.NetworkStats queryDetailsForUidTag(int, String, long, long, int, int) throws java.lang.SecurityException;
+ method public android.app.usage.NetworkStats queryDetailsForUidTagState(int, String, long, long, int, int, int) throws java.lang.SecurityException;
+ method public android.app.usage.NetworkStats querySummary(int, String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
+ method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
+ method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
+ method public void registerUsageCallback(int, String, long, android.app.usage.NetworkStatsManager.UsageCallback);
+ method public void registerUsageCallback(int, String, long, android.app.usage.NetworkStatsManager.UsageCallback, @Nullable android.os.Handler);
method public void unregisterUsageCallback(android.app.usage.NetworkStatsManager.UsageCallback);
}
- public static abstract class NetworkStatsManager.UsageCallback {
+ public abstract static class NetworkStatsManager.UsageCallback {
ctor public NetworkStatsManager.UsageCallback();
- method public abstract void onThresholdReached(int, java.lang.String);
+ method public abstract void onThresholdReached(int, String);
}
public final class StorageStats implements android.os.Parcelable {
@@ -7631,12 +7667,12 @@ package android.app.usage {
}
public class StorageStatsManager {
- method public long getFreeBytes(java.util.UUID) throws java.io.IOException;
- method public long getTotalBytes(java.util.UUID) throws java.io.IOException;
- method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.util.UUID, android.os.UserHandle) throws java.io.IOException;
- method public android.app.usage.StorageStats queryStatsForPackage(java.util.UUID, java.lang.String, android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
- method public android.app.usage.StorageStats queryStatsForUid(java.util.UUID, int) throws java.io.IOException;
- method public android.app.usage.StorageStats queryStatsForUser(java.util.UUID, android.os.UserHandle) throws java.io.IOException;
+ method @WorkerThread public long getFreeBytes(@NonNull java.util.UUID) throws java.io.IOException;
+ method @WorkerThread public long getTotalBytes(@NonNull java.util.UUID) throws java.io.IOException;
+ method @WorkerThread @NonNull public android.app.usage.ExternalStorageStats queryExternalStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
+ method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForPackage(@NonNull java.util.UUID, @NonNull String, @NonNull android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
+ method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForUid(@NonNull java.util.UUID, int) throws java.io.IOException;
+ method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
}
public final class UsageEvents implements android.os.Parcelable {
@@ -7650,22 +7686,23 @@ package android.app.usage {
public static final class UsageEvents.Event {
ctor public UsageEvents.Event();
method public int getAppStandbyBucket();
- method public java.lang.String getClassName();
+ method public String getClassName();
method public android.content.res.Configuration getConfiguration();
method public int getEventType();
- method public java.lang.String getPackageName();
- method public java.lang.String getShortcutId();
+ method public String getPackageName();
+ method public String getShortcutId();
method public long getTimeStamp();
field public static final int ACTIVITY_PAUSED = 2; // 0x2
field public static final int ACTIVITY_RESUMED = 1; // 0x1
field public static final int ACTIVITY_STOPPED = 23; // 0x17
field public static final int CONFIGURATION_CHANGE = 5; // 0x5
+ field public static final int DEVICE_SHUTDOWN = 26; // 0x1a
field public static final int FOREGROUND_SERVICE_START = 19; // 0x13
field public static final int FOREGROUND_SERVICE_STOP = 20; // 0x14
field public static final int KEYGUARD_HIDDEN = 18; // 0x12
field public static final int KEYGUARD_SHOWN = 17; // 0x11
- field public static final deprecated int MOVE_TO_BACKGROUND = 2; // 0x2
- field public static final deprecated int MOVE_TO_FOREGROUND = 1; // 0x1
+ field @Deprecated public static final int MOVE_TO_BACKGROUND = 2; // 0x2
+ field @Deprecated public static final int MOVE_TO_FOREGROUND = 1; // 0x1
field public static final int NONE = 0; // 0x0
field public static final int SCREEN_INTERACTIVE = 15; // 0xf
field public static final int SCREEN_NON_INTERACTIVE = 16; // 0x10
@@ -7683,7 +7720,7 @@ package android.app.usage {
method public long getLastTimeStamp();
method public long getLastTimeUsed();
method public long getLastTimeVisible();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public long getTotalTimeForegroundServiceUsed();
method public long getTotalTimeInForeground();
method public long getTotalTimeVisible();
@@ -7693,8 +7730,8 @@ package android.app.usage {
public final class UsageStatsManager {
method public int getAppStandbyBucket();
- method public boolean isAppInactive(java.lang.String);
- method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long);
+ method public boolean isAppInactive(String);
+ method public java.util.Map<java.lang.String,android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long);
method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long);
method public java.util.List<android.app.usage.EventStats> queryEventStats(int, long, long);
method public android.app.usage.UsageEvents queryEvents(long, long);
@@ -7727,7 +7764,7 @@ package android.appwidget {
method protected android.appwidget.AppWidgetHostView onCreateView(android.content.Context, int, android.appwidget.AppWidgetProviderInfo);
method protected void onProviderChanged(int, android.appwidget.AppWidgetProviderInfo);
method protected void onProvidersChanged();
- method public final void startAppWidgetConfigureActivityForResult(android.app.Activity, int, int, int, android.os.Bundle);
+ method public final void startAppWidgetConfigureActivityForResult(@NonNull android.app.Activity, int, int, int, @Nullable android.os.Bundle);
method public void startListening();
method public void stopListening();
}
@@ -7757,47 +7794,47 @@ package android.appwidget {
method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int);
method public android.os.Bundle getAppWidgetOptions(int);
method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders();
- method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForPackage(java.lang.String, android.os.UserHandle);
- method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForProfile(android.os.UserHandle);
+ method @NonNull public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForPackage(@NonNull String, @Nullable android.os.UserHandle);
+ method @NonNull public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProvidersForProfile(@Nullable android.os.UserHandle);
method public static android.appwidget.AppWidgetManager getInstance(android.content.Context);
method public boolean isRequestPinAppWidgetSupported();
method public void notifyAppWidgetViewDataChanged(int[], int);
method public void notifyAppWidgetViewDataChanged(int, int);
method public void partiallyUpdateAppWidget(int[], android.widget.RemoteViews);
method public void partiallyUpdateAppWidget(int, android.widget.RemoteViews);
- method public boolean requestPinAppWidget(android.content.ComponentName, android.os.Bundle, android.app.PendingIntent);
+ method public boolean requestPinAppWidget(@NonNull android.content.ComponentName, @Nullable android.os.Bundle, @Nullable android.app.PendingIntent);
method public void updateAppWidget(int[], android.widget.RemoteViews);
method public void updateAppWidget(int, android.widget.RemoteViews);
method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
method public void updateAppWidgetOptions(int, android.os.Bundle);
- method public void updateAppWidgetProviderInfo(android.content.ComponentName, java.lang.String);
- field public static final java.lang.String ACTION_APPWIDGET_BIND = "android.appwidget.action.APPWIDGET_BIND";
- field public static final java.lang.String ACTION_APPWIDGET_CONFIGURE = "android.appwidget.action.APPWIDGET_CONFIGURE";
- field public static final java.lang.String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
- field public static final java.lang.String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
- field public static final java.lang.String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
- field public static final java.lang.String ACTION_APPWIDGET_HOST_RESTORED = "android.appwidget.action.APPWIDGET_HOST_RESTORED";
- field public static final java.lang.String ACTION_APPWIDGET_OPTIONS_CHANGED = "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS";
- field public static final java.lang.String ACTION_APPWIDGET_PICK = "android.appwidget.action.APPWIDGET_PICK";
- field public static final java.lang.String ACTION_APPWIDGET_RESTORED = "android.appwidget.action.APPWIDGET_RESTORED";
- field public static final java.lang.String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
- field public static final java.lang.String EXTRA_APPWIDGET_ID = "appWidgetId";
- field public static final java.lang.String EXTRA_APPWIDGET_IDS = "appWidgetIds";
- field public static final java.lang.String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
- field public static final java.lang.String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
- field public static final java.lang.String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
- field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
- field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER_PROFILE = "appWidgetProviderProfile";
- field public static final java.lang.String EXTRA_CUSTOM_EXTRAS = "customExtras";
- field public static final java.lang.String EXTRA_CUSTOM_INFO = "customInfo";
- field public static final java.lang.String EXTRA_HOST_ID = "hostId";
+ method public void updateAppWidgetProviderInfo(android.content.ComponentName, @Nullable String);
+ field public static final String ACTION_APPWIDGET_BIND = "android.appwidget.action.APPWIDGET_BIND";
+ field public static final String ACTION_APPWIDGET_CONFIGURE = "android.appwidget.action.APPWIDGET_CONFIGURE";
+ field public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
+ field public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
+ field public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
+ field public static final String ACTION_APPWIDGET_HOST_RESTORED = "android.appwidget.action.APPWIDGET_HOST_RESTORED";
+ field public static final String ACTION_APPWIDGET_OPTIONS_CHANGED = "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS";
+ field public static final String ACTION_APPWIDGET_PICK = "android.appwidget.action.APPWIDGET_PICK";
+ field public static final String ACTION_APPWIDGET_RESTORED = "android.appwidget.action.APPWIDGET_RESTORED";
+ field public static final String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
+ field public static final String EXTRA_APPWIDGET_ID = "appWidgetId";
+ field public static final String EXTRA_APPWIDGET_IDS = "appWidgetIds";
+ field public static final String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
+ field public static final String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
+ field public static final String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
+ field public static final String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
+ field public static final String EXTRA_APPWIDGET_PROVIDER_PROFILE = "appWidgetProviderProfile";
+ field public static final String EXTRA_CUSTOM_EXTRAS = "customExtras";
+ field public static final String EXTRA_CUSTOM_INFO = "customInfo";
+ field public static final String EXTRA_HOST_ID = "hostId";
field public static final int INVALID_APPWIDGET_ID = 0; // 0x0
- field public static final java.lang.String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider";
- field public static final java.lang.String OPTION_APPWIDGET_HOST_CATEGORY = "appWidgetCategory";
- field public static final java.lang.String OPTION_APPWIDGET_MAX_HEIGHT = "appWidgetMaxHeight";
- field public static final java.lang.String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth";
- field public static final java.lang.String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight";
- field public static final java.lang.String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth";
+ field public static final String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider";
+ field public static final String OPTION_APPWIDGET_HOST_CATEGORY = "appWidgetCategory";
+ field public static final String OPTION_APPWIDGET_MAX_HEIGHT = "appWidgetMaxHeight";
+ field public static final String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth";
+ field public static final String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight";
+ field public static final String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth";
}
public class AppWidgetProvider extends android.content.BroadcastReceiver {
@@ -7817,9 +7854,9 @@ package android.appwidget {
method public android.appwidget.AppWidgetProviderInfo clone();
method public int describeContents();
method public final android.os.UserHandle getProfile();
- method public final android.graphics.drawable.Drawable loadIcon(android.content.Context, int);
- method public final java.lang.String loadLabel(android.content.pm.PackageManager);
- method public final android.graphics.drawable.Drawable loadPreviewImage(android.content.Context, int);
+ method public final android.graphics.drawable.Drawable loadIcon(@NonNull android.content.Context, int);
+ method public final String loadLabel(android.content.pm.PackageManager);
+ method public final android.graphics.drawable.Drawable loadPreviewImage(@NonNull android.content.Context, int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.appwidget.AppWidgetProviderInfo> CREATOR;
field public static final int RESIZE_BOTH = 3; // 0x3
@@ -7836,7 +7873,7 @@ package android.appwidget {
field public int icon;
field public int initialKeyguardLayout;
field public int initialLayout;
- field public deprecated java.lang.String label;
+ field @Deprecated public String label;
field public int minHeight;
field public int minResizeHeight;
field public int minResizeWidth;
@@ -7859,33 +7896,33 @@ package android.bluetooth {
method public int getConnectionState(android.bluetooth.BluetoothDevice);
method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
method public boolean isA2dpPlaying(android.bluetooth.BluetoothDevice);
- field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED";
- field public static final java.lang.String ACTION_PLAYING_STATE_CHANGED = "android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED";
+ field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED";
+ field public static final String ACTION_PLAYING_STATE_CHANGED = "android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED";
field public static final int STATE_NOT_PLAYING = 11; // 0xb
field public static final int STATE_PLAYING = 10; // 0xa
}
public final class BluetoothAdapter {
- method public boolean cancelDiscovery();
- method public static boolean checkBluetoothAddress(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean cancelDiscovery();
+ method public static boolean checkBluetoothAddress(String);
method public void closeProfileProxy(int, android.bluetooth.BluetoothProfile);
- method public boolean disable();
- method public boolean enable();
- method public java.lang.String getAddress();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean disable();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean enable();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public String getAddress();
method public android.bluetooth.le.BluetoothLeAdvertiser getBluetoothLeAdvertiser();
method public android.bluetooth.le.BluetoothLeScanner getBluetoothLeScanner();
- method public java.util.Set<android.bluetooth.BluetoothDevice> getBondedDevices();
- method public static synchronized android.bluetooth.BluetoothAdapter getDefaultAdapter();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.Set<android.bluetooth.BluetoothDevice> getBondedDevices();
+ method public static android.bluetooth.BluetoothAdapter getDefaultAdapter();
method public int getLeMaximumAdvertisingDataLength();
- method public java.lang.String getName();
- method public int getProfileConnectionState(int);
+ method public String getName();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getProfileConnectionState(int);
method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int);
- method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String);
+ method public android.bluetooth.BluetoothDevice getRemoteDevice(String);
method public android.bluetooth.BluetoothDevice getRemoteDevice(byte[]);
- method public int getScanMode();
- method public int getState();
- method public boolean isDiscovering();
- method public boolean isEnabled();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getScanMode();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getState();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isDiscovering();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEnabled();
method public boolean isLe2MPhySupported();
method public boolean isLeCodedPhySupported();
method public boolean isLeExtendedAdvertisingSupported();
@@ -7893,32 +7930,32 @@ package android.bluetooth {
method public boolean isMultipleAdvertisementSupported();
method public boolean isOffloadedFilteringSupported();
method public boolean isOffloadedScanBatchingSupported();
- method public android.bluetooth.BluetoothServerSocket listenUsingInsecureL2capChannel() throws java.io.IOException;
- method public android.bluetooth.BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(java.lang.String, java.util.UUID) throws java.io.IOException;
- method public android.bluetooth.BluetoothServerSocket listenUsingL2capChannel() throws java.io.IOException;
- method public android.bluetooth.BluetoothServerSocket listenUsingRfcommWithServiceRecord(java.lang.String, java.util.UUID) throws java.io.IOException;
- method public boolean setName(java.lang.String);
- method public boolean startDiscovery();
- method public deprecated boolean startLeScan(android.bluetooth.BluetoothAdapter.LeScanCallback);
- method public deprecated boolean startLeScan(java.util.UUID[], android.bluetooth.BluetoothAdapter.LeScanCallback);
- method public deprecated void stopLeScan(android.bluetooth.BluetoothAdapter.LeScanCallback);
- field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED";
- field public static final java.lang.String ACTION_DISCOVERY_FINISHED = "android.bluetooth.adapter.action.DISCOVERY_FINISHED";
- field public static final java.lang.String ACTION_DISCOVERY_STARTED = "android.bluetooth.adapter.action.DISCOVERY_STARTED";
- field public static final java.lang.String ACTION_LOCAL_NAME_CHANGED = "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED";
- field public static final java.lang.String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
- field public static final java.lang.String ACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE";
- field public static final java.lang.String ACTION_SCAN_MODE_CHANGED = "android.bluetooth.adapter.action.SCAN_MODE_CHANGED";
- field public static final java.lang.String ACTION_STATE_CHANGED = "android.bluetooth.adapter.action.STATE_CHANGED";
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingInsecureL2capChannel() throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String, java.util.UUID) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingL2capChannel() throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingRfcommWithServiceRecord(String, java.util.UUID) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setName(String);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean startDiscovery();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean startLeScan(android.bluetooth.BluetoothAdapter.LeScanCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean startLeScan(java.util.UUID[], android.bluetooth.BluetoothAdapter.LeScanCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void stopLeScan(android.bluetooth.BluetoothAdapter.LeScanCallback);
+ field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED";
+ field public static final String ACTION_DISCOVERY_FINISHED = "android.bluetooth.adapter.action.DISCOVERY_FINISHED";
+ field public static final String ACTION_DISCOVERY_STARTED = "android.bluetooth.adapter.action.DISCOVERY_STARTED";
+ field public static final String ACTION_LOCAL_NAME_CHANGED = "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED";
+ field public static final String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
+ field public static final String ACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE";
+ field public static final String ACTION_SCAN_MODE_CHANGED = "android.bluetooth.adapter.action.SCAN_MODE_CHANGED";
+ field public static final String ACTION_STATE_CHANGED = "android.bluetooth.adapter.action.STATE_CHANGED";
field public static final int ERROR = -2147483648; // 0x80000000
- field public static final java.lang.String EXTRA_CONNECTION_STATE = "android.bluetooth.adapter.extra.CONNECTION_STATE";
- field public static final java.lang.String EXTRA_DISCOVERABLE_DURATION = "android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";
- field public static final java.lang.String EXTRA_LOCAL_NAME = "android.bluetooth.adapter.extra.LOCAL_NAME";
- field public static final java.lang.String EXTRA_PREVIOUS_CONNECTION_STATE = "android.bluetooth.adapter.extra.PREVIOUS_CONNECTION_STATE";
- field public static final java.lang.String EXTRA_PREVIOUS_SCAN_MODE = "android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";
- field public static final java.lang.String EXTRA_PREVIOUS_STATE = "android.bluetooth.adapter.extra.PREVIOUS_STATE";
- field public static final java.lang.String EXTRA_SCAN_MODE = "android.bluetooth.adapter.extra.SCAN_MODE";
- field public static final java.lang.String EXTRA_STATE = "android.bluetooth.adapter.extra.STATE";
+ field public static final String EXTRA_CONNECTION_STATE = "android.bluetooth.adapter.extra.CONNECTION_STATE";
+ field public static final String EXTRA_DISCOVERABLE_DURATION = "android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";
+ field public static final String EXTRA_LOCAL_NAME = "android.bluetooth.adapter.extra.LOCAL_NAME";
+ field public static final String EXTRA_PREVIOUS_CONNECTION_STATE = "android.bluetooth.adapter.extra.PREVIOUS_CONNECTION_STATE";
+ field public static final String EXTRA_PREVIOUS_SCAN_MODE = "android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";
+ field public static final String EXTRA_PREVIOUS_STATE = "android.bluetooth.adapter.extra.PREVIOUS_STATE";
+ field public static final String EXTRA_SCAN_MODE = "android.bluetooth.adapter.extra.SCAN_MODE";
+ field public static final String EXTRA_STATE = "android.bluetooth.adapter.extra.STATE";
field public static final int SCAN_MODE_CONNECTABLE = 21; // 0x15
field public static final int SCAN_MODE_CONNECTABLE_DISCOVERABLE = 23; // 0x17
field public static final int SCAN_MODE_NONE = 20; // 0x14
@@ -7932,8 +7969,8 @@ package android.bluetooth {
field public static final int STATE_TURNING_ON = 11; // 0xb
}
- public static abstract interface BluetoothAdapter.LeScanCallback {
- method public abstract void onLeScan(android.bluetooth.BluetoothDevice, int, byte[]);
+ public static interface BluetoothAdapter.LeScanCallback {
+ method public void onLeScan(android.bluetooth.BluetoothDevice, int, byte[]);
}
public class BluetoothAssignedNumbers {
@@ -8262,31 +8299,31 @@ package android.bluetooth {
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int, android.os.Handler);
- method public boolean createBond();
- method public android.bluetooth.BluetoothSocket createInsecureL2capChannel(int) throws java.io.IOException;
- method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
- method public android.bluetooth.BluetoothSocket createL2capChannel(int) throws java.io.IOException;
- method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean createBond();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createInsecureL2capChannel(int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createL2capChannel(int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public int describeContents();
- method public boolean fetchUuidsWithSdp();
- method public java.lang.String getAddress();
- method public android.bluetooth.BluetoothClass getBluetoothClass();
- method public int getBondState();
- method public java.lang.String getName();
- method public int getType();
- method public android.os.ParcelUuid[] getUuids();
- method public boolean setPairingConfirmation(boolean);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean fetchUuidsWithSdp();
+ method public String getAddress();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothClass getBluetoothClass();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getBondState();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public String getName();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getType();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.os.ParcelUuid[] getUuids();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPairingConfirmation(boolean);
method public boolean setPin(byte[]);
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String ACTION_ACL_CONNECTED = "android.bluetooth.device.action.ACL_CONNECTED";
- field public static final java.lang.String ACTION_ACL_DISCONNECTED = "android.bluetooth.device.action.ACL_DISCONNECTED";
- field public static final java.lang.String ACTION_ACL_DISCONNECT_REQUESTED = "android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED";
- field public static final java.lang.String ACTION_BOND_STATE_CHANGED = "android.bluetooth.device.action.BOND_STATE_CHANGED";
- field public static final java.lang.String ACTION_CLASS_CHANGED = "android.bluetooth.device.action.CLASS_CHANGED";
- field public static final java.lang.String ACTION_FOUND = "android.bluetooth.device.action.FOUND";
- field public static final java.lang.String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED";
- field public static final java.lang.String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";
- field public static final java.lang.String ACTION_UUID = "android.bluetooth.device.action.UUID";
+ field public static final String ACTION_ACL_CONNECTED = "android.bluetooth.device.action.ACL_CONNECTED";
+ field public static final String ACTION_ACL_DISCONNECTED = "android.bluetooth.device.action.ACL_DISCONNECTED";
+ field public static final String ACTION_ACL_DISCONNECT_REQUESTED = "android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED";
+ field public static final String ACTION_BOND_STATE_CHANGED = "android.bluetooth.device.action.BOND_STATE_CHANGED";
+ field public static final String ACTION_CLASS_CHANGED = "android.bluetooth.device.action.CLASS_CHANGED";
+ field public static final String ACTION_FOUND = "android.bluetooth.device.action.FOUND";
+ field public static final String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED";
+ field public static final String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";
+ field public static final String ACTION_UUID = "android.bluetooth.device.action.UUID";
field public static final int BOND_BONDED = 12; // 0xc
field public static final int BOND_BONDING = 11; // 0xb
field public static final int BOND_NONE = 10; // 0xa
@@ -8296,15 +8333,15 @@ package android.bluetooth {
field public static final int DEVICE_TYPE_LE = 2; // 0x2
field public static final int DEVICE_TYPE_UNKNOWN = 0; // 0x0
field public static final int ERROR = -2147483648; // 0x80000000
- field public static final java.lang.String EXTRA_BOND_STATE = "android.bluetooth.device.extra.BOND_STATE";
- field public static final java.lang.String EXTRA_CLASS = "android.bluetooth.device.extra.CLASS";
- field public static final java.lang.String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE";
- field public static final java.lang.String EXTRA_NAME = "android.bluetooth.device.extra.NAME";
- field public static final java.lang.String EXTRA_PAIRING_KEY = "android.bluetooth.device.extra.PAIRING_KEY";
- field public static final java.lang.String EXTRA_PAIRING_VARIANT = "android.bluetooth.device.extra.PAIRING_VARIANT";
- field public static final java.lang.String EXTRA_PREVIOUS_BOND_STATE = "android.bluetooth.device.extra.PREVIOUS_BOND_STATE";
- field public static final java.lang.String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI";
- field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID";
+ field public static final String EXTRA_BOND_STATE = "android.bluetooth.device.extra.BOND_STATE";
+ field public static final String EXTRA_CLASS = "android.bluetooth.device.extra.CLASS";
+ field public static final String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE";
+ field public static final String EXTRA_NAME = "android.bluetooth.device.extra.NAME";
+ field public static final String EXTRA_PAIRING_KEY = "android.bluetooth.device.extra.PAIRING_KEY";
+ field public static final String EXTRA_PAIRING_VARIANT = "android.bluetooth.device.extra.PAIRING_VARIANT";
+ field public static final String EXTRA_PREVIOUS_BOND_STATE = "android.bluetooth.device.extra.PREVIOUS_BOND_STATE";
+ field public static final String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI";
+ field public static final String EXTRA_UUID = "android.bluetooth.device.extra.UUID";
field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2
field public static final int PAIRING_VARIANT_PIN = 0; // 0x0
field public static final int PHY_LE_1M = 1; // 0x1
@@ -8323,7 +8360,7 @@ package android.bluetooth {
public final class BluetoothGatt implements android.bluetooth.BluetoothProfile {
method public void abortReliableWrite();
- method public deprecated void abortReliableWrite(android.bluetooth.BluetoothDevice);
+ method @Deprecated public void abortReliableWrite(android.bluetooth.BluetoothDevice);
method public boolean beginReliableWrite();
method public void close();
method public boolean connect();
@@ -8383,20 +8420,20 @@ package android.bluetooth {
method public int describeContents();
method public android.bluetooth.BluetoothGattDescriptor getDescriptor(java.util.UUID);
method public java.util.List<android.bluetooth.BluetoothGattDescriptor> getDescriptors();
- method public java.lang.Float getFloatValue(int, int);
+ method public Float getFloatValue(int, int);
method public int getInstanceId();
- method public java.lang.Integer getIntValue(int, int);
+ method public Integer getIntValue(int, int);
method public int getPermissions();
method public int getProperties();
method public android.bluetooth.BluetoothGattService getService();
- method public java.lang.String getStringValue(int);
+ method public String getStringValue(int);
method public java.util.UUID getUuid();
method public byte[] getValue();
method public int getWriteType();
method public boolean setValue(byte[]);
method public boolean setValue(int, int, int);
method public boolean setValue(int, int, int, int);
- method public boolean setValue(java.lang.String);
+ method public boolean setValue(String);
method public void setWriteType(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothGattCharacteristic> CREATOR;
@@ -8510,63 +8547,65 @@ package android.bluetooth {
method public int getConnectionState(android.bluetooth.BluetoothDevice);
method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
method public boolean isAudioConnected(android.bluetooth.BluetoothDevice);
- method public boolean sendVendorSpecificResultCode(android.bluetooth.BluetoothDevice, java.lang.String, java.lang.String);
+ method public boolean sendVendorSpecificResultCode(android.bluetooth.BluetoothDevice, String, String);
method public boolean startVoiceRecognition(android.bluetooth.BluetoothDevice);
method public boolean stopVoiceRecognition(android.bluetooth.BluetoothDevice);
- field public static final java.lang.String ACTION_AUDIO_STATE_CHANGED = "android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED";
- field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED";
- field public static final java.lang.String ACTION_VENDOR_SPECIFIC_HEADSET_EVENT = "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT";
+ field public static final String ACTION_AUDIO_STATE_CHANGED = "android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED";
+ field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED";
+ field public static final String ACTION_VENDOR_SPECIFIC_HEADSET_EVENT = "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT";
field public static final int AT_CMD_TYPE_ACTION = 4; // 0x4
field public static final int AT_CMD_TYPE_BASIC = 3; // 0x3
field public static final int AT_CMD_TYPE_READ = 0; // 0x0
field public static final int AT_CMD_TYPE_SET = 2; // 0x2
field public static final int AT_CMD_TYPE_TEST = 1; // 0x1
- field public static final java.lang.String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_ARGS";
- field public static final java.lang.String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_CMD";
- field public static final java.lang.String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE";
+ field public static final String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_ARGS";
+ field public static final String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_CMD";
+ field public static final String EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE = "android.bluetooth.headset.extra.VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE";
field public static final int STATE_AUDIO_CONNECTED = 12; // 0xc
field public static final int STATE_AUDIO_CONNECTING = 11; // 0xb
field public static final int STATE_AUDIO_DISCONNECTED = 10; // 0xa
- field public static final java.lang.String VENDOR_RESULT_CODE_COMMAND_ANDROID = "+ANDROID";
- field public static final java.lang.String VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY = "android.bluetooth.headset.intent.category.companyid";
- }
-
- public final class BluetoothHealth implements android.bluetooth.BluetoothProfile {
- method public boolean connectChannelToSource(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
- method public boolean disconnectChannel(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration, int);
- method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method public int getConnectionState(android.bluetooth.BluetoothDevice);
- method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
- method public android.os.ParcelFileDescriptor getMainChannelFd(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
- method public boolean registerSinkAppConfiguration(java.lang.String, int, android.bluetooth.BluetoothHealthCallback);
- method public boolean unregisterAppConfiguration(android.bluetooth.BluetoothHealthAppConfiguration);
- field public static final int APP_CONFIG_REGISTRATION_FAILURE = 1; // 0x1
- field public static final int APP_CONFIG_REGISTRATION_SUCCESS = 0; // 0x0
- field public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3; // 0x3
- field public static final int APP_CONFIG_UNREGISTRATION_SUCCESS = 2; // 0x2
- field public static final int CHANNEL_TYPE_RELIABLE = 10; // 0xa
- field public static final int CHANNEL_TYPE_STREAMING = 11; // 0xb
- field public static final int SINK_ROLE = 2; // 0x2
- field public static final int SOURCE_ROLE = 1; // 0x1
- field public static final int STATE_CHANNEL_CONNECTED = 2; // 0x2
- field public static final int STATE_CHANNEL_CONNECTING = 1; // 0x1
- field public static final int STATE_CHANNEL_DISCONNECTED = 0; // 0x0
- field public static final int STATE_CHANNEL_DISCONNECTING = 3; // 0x3
- }
-
- public final class BluetoothHealthAppConfiguration implements android.os.Parcelable {
- method public int describeContents();
- method public int getDataType();
- method public java.lang.String getName();
- method public int getRole();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHealthAppConfiguration> CREATOR;
- }
-
- public abstract class BluetoothHealthCallback {
- ctor public BluetoothHealthCallback();
- method public void onHealthAppConfigurationStatusChange(android.bluetooth.BluetoothHealthAppConfiguration, int);
- method public void onHealthChannelStateChange(android.bluetooth.BluetoothHealthAppConfiguration, android.bluetooth.BluetoothDevice, int, int, android.os.ParcelFileDescriptor, int);
+ field public static final String VENDOR_RESULT_CODE_COMMAND_ANDROID = "+ANDROID";
+ field public static final String VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY = "android.bluetooth.headset.intent.category.companyid";
+ }
+
+ @Deprecated public final class BluetoothHealth implements android.bluetooth.BluetoothProfile {
+ ctor @Deprecated public BluetoothHealth();
+ method @Deprecated public boolean connectChannelToSource(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
+ method @Deprecated public boolean disconnectChannel(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration, int);
+ method @Deprecated public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method @Deprecated public int getConnectionState(android.bluetooth.BluetoothDevice);
+ method @Deprecated public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ method @Deprecated public android.os.ParcelFileDescriptor getMainChannelFd(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
+ method @Deprecated public boolean registerSinkAppConfiguration(String, int, android.bluetooth.BluetoothHealthCallback);
+ method @Deprecated public boolean unregisterAppConfiguration(android.bluetooth.BluetoothHealthAppConfiguration);
+ field @Deprecated public static final int APP_CONFIG_REGISTRATION_FAILURE = 1; // 0x1
+ field @Deprecated public static final int APP_CONFIG_REGISTRATION_SUCCESS = 0; // 0x0
+ field @Deprecated public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3; // 0x3
+ field @Deprecated public static final int APP_CONFIG_UNREGISTRATION_SUCCESS = 2; // 0x2
+ field @Deprecated public static final int CHANNEL_TYPE_RELIABLE = 10; // 0xa
+ field @Deprecated public static final int CHANNEL_TYPE_STREAMING = 11; // 0xb
+ field @Deprecated public static final int SINK_ROLE = 2; // 0x2
+ field @Deprecated public static final int SOURCE_ROLE = 1; // 0x1
+ field @Deprecated public static final int STATE_CHANNEL_CONNECTED = 2; // 0x2
+ field @Deprecated public static final int STATE_CHANNEL_CONNECTING = 1; // 0x1
+ field @Deprecated public static final int STATE_CHANNEL_DISCONNECTED = 0; // 0x0
+ field @Deprecated public static final int STATE_CHANNEL_DISCONNECTING = 3; // 0x3
+ }
+
+ @Deprecated public final class BluetoothHealthAppConfiguration implements android.os.Parcelable {
+ ctor @Deprecated public BluetoothHealthAppConfiguration();
+ method @Deprecated public int describeContents();
+ method @Deprecated public int getDataType();
+ method @Deprecated public String getName();
+ method @Deprecated public int getRole();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHealthAppConfiguration> CREATOR;
+ }
+
+ @Deprecated public abstract class BluetoothHealthCallback {
+ ctor @Deprecated public BluetoothHealthCallback();
+ method @Deprecated @BinderThread public void onHealthAppConfigurationStatusChange(android.bluetooth.BluetoothHealthAppConfiguration, int);
+ method @Deprecated @BinderThread public void onHealthChannelStateChange(android.bluetooth.BluetoothHealthAppConfiguration, android.bluetooth.BluetoothDevice, int, int, android.os.ParcelFileDescriptor, int);
}
public final class BluetoothHidDevice implements android.bluetooth.BluetoothProfile {
@@ -8580,7 +8619,7 @@ package android.bluetooth {
method public boolean reportError(android.bluetooth.BluetoothDevice, byte);
method public boolean sendReport(android.bluetooth.BluetoothDevice, int, byte[]);
method public boolean unregisterApp();
- field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.hiddevice.profile.action.CONNECTION_STATE_CHANGED";
+ field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.hiddevice.profile.action.CONNECTION_STATE_CHANGED";
field public static final byte ERROR_RSP_INVALID_PARAM = 4; // 0x4
field public static final byte ERROR_RSP_INVALID_RPT_ID = 2; // 0x2
field public static final byte ERROR_RSP_NOT_READY = 1; // 0x1
@@ -8605,7 +8644,7 @@ package android.bluetooth {
field public static final byte SUBCLASS2_UNCATEGORIZED = 0; // 0x0
}
- public static abstract class BluetoothHidDevice.Callback {
+ public abstract static class BluetoothHidDevice.Callback {
ctor public BluetoothHidDevice.Callback();
method public void onAppStatusChanged(android.bluetooth.BluetoothDevice, boolean);
method public void onConnectionStateChanged(android.bluetooth.BluetoothDevice, int);
@@ -8634,12 +8673,12 @@ package android.bluetooth {
}
public final class BluetoothHidDeviceAppSdpSettings implements android.os.Parcelable {
- ctor public BluetoothHidDeviceAppSdpSettings(java.lang.String, java.lang.String, java.lang.String, byte, byte[]);
+ ctor public BluetoothHidDeviceAppSdpSettings(String, String, String, byte, byte[]);
method public int describeContents();
- method public java.lang.String getDescription();
+ method public String getDescription();
method public byte[] getDescriptors();
- method public java.lang.String getName();
- method public java.lang.String getProvider();
+ method public String getName();
+ method public String getProvider();
method public byte getSubclass();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHidDeviceAppSdpSettings> CREATOR;
@@ -8647,23 +8686,23 @@ package android.bluetooth {
public final class BluetoothManager {
method public android.bluetooth.BluetoothAdapter getAdapter();
- method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices(int);
- method public int getConnectionState(android.bluetooth.BluetoothDevice, int);
- method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int, int[]);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices(int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionState(android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int, int[]);
method public android.bluetooth.BluetoothGattServer openGattServer(android.content.Context, android.bluetooth.BluetoothGattServerCallback);
}
- public abstract interface BluetoothProfile {
- method public abstract java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method public abstract int getConnectionState(android.bluetooth.BluetoothDevice);
- method public abstract java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ public interface BluetoothProfile {
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionState(android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
field public static final int A2DP = 2; // 0x2
- field public static final java.lang.String EXTRA_PREVIOUS_STATE = "android.bluetooth.profile.extra.PREVIOUS_STATE";
- field public static final java.lang.String EXTRA_STATE = "android.bluetooth.profile.extra.STATE";
+ field public static final String EXTRA_PREVIOUS_STATE = "android.bluetooth.profile.extra.PREVIOUS_STATE";
+ field public static final String EXTRA_STATE = "android.bluetooth.profile.extra.STATE";
field public static final int GATT = 7; // 0x7
field public static final int GATT_SERVER = 8; // 0x8
field public static final int HEADSET = 1; // 0x1
- field public static final int HEALTH = 3; // 0x3
+ field @Deprecated public static final int HEALTH = 3; // 0x3
field public static final int HID_DEVICE = 19; // 0x13
field public static final int SAP = 10; // 0xa
field public static final int STATE_CONNECTED = 2; // 0x2
@@ -8672,9 +8711,9 @@ package android.bluetooth {
field public static final int STATE_DISCONNECTING = 3; // 0x3
}
- public static abstract interface BluetoothProfile.ServiceListener {
- method public abstract void onServiceConnected(int, android.bluetooth.BluetoothProfile);
- method public abstract void onServiceDisconnected(int);
+ public static interface BluetoothProfile.ServiceListener {
+ method public void onServiceConnected(int, android.bluetooth.BluetoothProfile);
+ method public void onServiceDisconnected(int);
}
public final class BluetoothServerSocket implements java.io.Closeable {
@@ -8719,7 +8758,7 @@ package android.bluetooth.le {
method public boolean getIncludeDeviceName();
method public boolean getIncludeTxPowerLevel();
method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
- method public java.util.Map<android.os.ParcelUuid, byte[]> getServiceData();
+ method public java.util.Map<android.os.ParcelUuid,byte[]> getServiceData();
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.bluetooth.le.AdvertiseData> CREATOR;
@@ -8843,14 +8882,14 @@ package android.bluetooth.le {
public final class BluetoothLeScanner {
method public void flushPendingScanResults(android.bluetooth.le.ScanCallback);
- method public void startScan(android.bluetooth.le.ScanCallback);
- method public void startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback);
- method public int startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.app.PendingIntent);
- method public void stopScan(android.bluetooth.le.ScanCallback);
- method public void stopScan(android.app.PendingIntent);
- field public static final java.lang.String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE";
- field public static final java.lang.String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE";
- field public static final java.lang.String EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT";
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void startScan(android.bluetooth.le.ScanCallback);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public int startScan(@Nullable java.util.List<android.bluetooth.le.ScanFilter>, @Nullable android.bluetooth.le.ScanSettings, @NonNull android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void stopScan(android.bluetooth.le.ScanCallback);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void stopScan(android.app.PendingIntent);
+ field public static final String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE";
+ field public static final String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE";
+ field public static final String EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT";
}
public final class PeriodicAdvertisingParameters implements android.os.Parcelable {
@@ -8881,18 +8920,18 @@ package android.bluetooth.le {
public final class ScanFilter implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getDeviceAddress();
- method public java.lang.String getDeviceName();
- method public byte[] getManufacturerData();
- method public byte[] getManufacturerDataMask();
+ method @Nullable public String getDeviceAddress();
+ method @Nullable public String getDeviceName();
+ method @Nullable public byte[] getManufacturerData();
+ method @Nullable public byte[] getManufacturerDataMask();
method public int getManufacturerId();
- method public byte[] getServiceData();
- method public byte[] getServiceDataMask();
- method public android.os.ParcelUuid getServiceDataUuid();
- method public android.os.ParcelUuid getServiceSolicitationUuid();
- method public android.os.ParcelUuid getServiceSolicitationUuidMask();
- method public android.os.ParcelUuid getServiceUuid();
- method public android.os.ParcelUuid getServiceUuidMask();
+ method @Nullable public byte[] getServiceData();
+ method @Nullable public byte[] getServiceDataMask();
+ method @Nullable public android.os.ParcelUuid getServiceDataUuid();
+ method @Nullable public android.os.ParcelUuid getServiceSolicitationUuid();
+ method @Nullable public android.os.ParcelUuid getServiceSolicitationUuidMask();
+ method @Nullable public android.os.ParcelUuid getServiceUuid();
+ method @Nullable public android.os.ParcelUuid getServiceUuidMask();
method public boolean matches(android.bluetooth.le.ScanResult);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanFilter> CREATOR;
@@ -8901,8 +8940,8 @@ package android.bluetooth.le {
public static final class ScanFilter.Builder {
ctor public ScanFilter.Builder();
method public android.bluetooth.le.ScanFilter build();
- method public android.bluetooth.le.ScanFilter.Builder setDeviceAddress(java.lang.String);
- method public android.bluetooth.le.ScanFilter.Builder setDeviceName(java.lang.String);
+ method public android.bluetooth.le.ScanFilter.Builder setDeviceAddress(String);
+ method public android.bluetooth.le.ScanFilter.Builder setDeviceName(String);
method public android.bluetooth.le.ScanFilter.Builder setManufacturerData(int, byte[]);
method public android.bluetooth.le.ScanFilter.Builder setManufacturerData(int, byte[], byte[]);
method public android.bluetooth.le.ScanFilter.Builder setServiceData(android.os.ParcelUuid, byte[]);
@@ -8916,18 +8955,18 @@ package android.bluetooth.le {
public final class ScanRecord {
method public int getAdvertiseFlags();
method public byte[] getBytes();
- method public java.lang.String getDeviceName();
+ method @Nullable public String getDeviceName();
method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
- method public byte[] getManufacturerSpecificData(int);
- method public java.util.Map<android.os.ParcelUuid, byte[]> getServiceData();
- method public byte[] getServiceData(android.os.ParcelUuid);
- method public java.util.List<android.os.ParcelUuid> getServiceSolicitationUuids();
+ method @Nullable public byte[] getManufacturerSpecificData(int);
+ method public java.util.Map<android.os.ParcelUuid,byte[]> getServiceData();
+ method @Nullable public byte[] getServiceData(android.os.ParcelUuid);
+ method @Nullable public java.util.List<android.os.ParcelUuid> getServiceSolicitationUuids();
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
method public int getTxPowerLevel();
}
public final class ScanResult implements android.os.Parcelable {
- ctor public deprecated ScanResult(android.bluetooth.BluetoothDevice, android.bluetooth.le.ScanRecord, int, long);
+ ctor @Deprecated public ScanResult(android.bluetooth.BluetoothDevice, android.bluetooth.le.ScanRecord, int, long);
ctor public ScanResult(android.bluetooth.BluetoothDevice, int, int, int, int, int, int, int, android.bluetooth.le.ScanRecord, long);
method public int describeContents();
method public int getAdvertisingSid();
@@ -8936,7 +8975,7 @@ package android.bluetooth.le {
method public int getPeriodicAdvertisingInterval();
method public int getPrimaryPhy();
method public int getRssi();
- method public android.bluetooth.le.ScanRecord getScanRecord();
+ method @Nullable public android.bluetooth.le.ScanRecord getScanRecord();
method public int getSecondaryPhy();
method public long getTimestampNanos();
method public int getTxPower();
@@ -9001,12 +9040,12 @@ package android.companion {
public static final class AssociationRequest.Builder {
ctor public AssociationRequest.Builder();
- method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
- method public android.companion.AssociationRequest build();
- method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
+ method @NonNull public android.companion.AssociationRequest.Builder addDeviceFilter(@Nullable android.companion.DeviceFilter<?>);
+ method @NonNull public android.companion.AssociationRequest build();
+ method @NonNull public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
}
- public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
+ public final class BluetoothDeviceFilter implements android.companion.DeviceFilter<android.bluetooth.BluetoothDevice> {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.BluetoothDeviceFilter> CREATOR;
@@ -9014,13 +9053,13 @@ package android.companion {
public static final class BluetoothDeviceFilter.Builder {
ctor public BluetoothDeviceFilter.Builder();
- method public android.companion.BluetoothDeviceFilter.Builder addServiceUuid(android.os.ParcelUuid, android.os.ParcelUuid);
- method public android.companion.BluetoothDeviceFilter build();
- method public android.companion.BluetoothDeviceFilter.Builder setAddress(java.lang.String);
- method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method @NonNull public android.companion.BluetoothDeviceFilter.Builder addServiceUuid(@Nullable android.os.ParcelUuid, @Nullable android.os.ParcelUuid);
+ method @NonNull public android.companion.BluetoothDeviceFilter build();
+ method @NonNull public android.companion.BluetoothDeviceFilter.Builder setAddress(@Nullable String);
+ method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(@Nullable java.util.regex.Pattern);
}
- public final class BluetoothLeDeviceFilter implements android.companion.DeviceFilter {
+ public final class BluetoothLeDeviceFilter implements android.companion.DeviceFilter<android.bluetooth.le.ScanResult> {
method public int describeContents();
method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
@@ -9029,33 +9068,33 @@ package android.companion {
public static final class BluetoothLeDeviceFilter.Builder {
ctor public BluetoothLeDeviceFilter.Builder();
- method public android.companion.BluetoothLeDeviceFilter build();
- method public android.companion.BluetoothLeDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
- method public android.companion.BluetoothLeDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
- method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, java.nio.ByteOrder);
- method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
- method public android.companion.BluetoothLeDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
+ method @NonNull public android.companion.BluetoothLeDeviceFilter build();
+ method public android.companion.BluetoothLeDeviceFilter.Builder setNamePattern(@Nullable java.util.regex.Pattern);
+ method @NonNull public android.companion.BluetoothLeDeviceFilter.Builder setRawDataFilter(@NonNull byte[], @Nullable byte[]);
+ method @NonNull public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromBytes(@NonNull String, @NonNull String, int, int, java.nio.ByteOrder);
+ method @NonNull public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromName(@NonNull String, @NonNull String, int, int);
+ method @NonNull public android.companion.BluetoothLeDeviceFilter.Builder setScanFilter(@Nullable android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
- method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
- method public void disassociate(java.lang.String);
- method public java.util.List<java.lang.String> getAssociations();
+ method public void associate(@NonNull android.companion.AssociationRequest, @NonNull android.companion.CompanionDeviceManager.Callback, @Nullable android.os.Handler);
+ method public void disassociate(@NonNull String);
+ method @NonNull public java.util.List<java.lang.String> getAssociations();
method public boolean hasNotificationAccess(android.content.ComponentName);
method public void requestNotificationAccess(android.content.ComponentName);
- field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
+ field public static final String EXTRA_DEVICE = "android.companion.extra.DEVICE";
}
- public static abstract class CompanionDeviceManager.Callback {
+ public abstract static class CompanionDeviceManager.Callback {
ctor public CompanionDeviceManager.Callback();
method public abstract void onDeviceFound(android.content.IntentSender);
- method public abstract void onFailure(java.lang.CharSequence);
+ method public abstract void onFailure(CharSequence);
}
- public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
+ public interface DeviceFilter<D extends android.os.Parcelable> extends android.os.Parcelable {
}
- public final class WifiDeviceFilter implements android.companion.DeviceFilter {
+ public final class WifiDeviceFilter implements android.companion.DeviceFilter<android.net.wifi.ScanResult> {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
@@ -9063,8 +9102,8 @@ package android.companion {
public static final class WifiDeviceFilter.Builder {
ctor public WifiDeviceFilter.Builder();
- method public android.companion.WifiDeviceFilter build();
- method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method @NonNull public android.companion.WifiDeviceFilter build();
+ method public android.companion.WifiDeviceFilter.Builder setNamePattern(@Nullable java.util.regex.Pattern);
}
}
@@ -9076,42 +9115,42 @@ package android.content {
ctor public AbstractThreadedSyncAdapter(android.content.Context, boolean, boolean);
method public android.content.Context getContext();
method public final android.os.IBinder getSyncAdapterBinder();
- method public abstract void onPerformSync(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.ContentProviderClient, android.content.SyncResult);
- method public void onSecurityException(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.SyncResult);
+ method public abstract void onPerformSync(android.accounts.Account, android.os.Bundle, String, android.content.ContentProviderClient, android.content.SyncResult);
+ method public void onSecurityException(android.accounts.Account, android.os.Bundle, String, android.content.SyncResult);
method public void onSyncCanceled();
- method public void onSyncCanceled(java.lang.Thread);
- method public boolean onUnsyncableAccount();
- field public static final deprecated int LOG_SYNC_DETAILS = 2743; // 0xab7
+ method public void onSyncCanceled(Thread);
+ method @MainThread public boolean onUnsyncableAccount();
+ field @Deprecated public static final int LOG_SYNC_DETAILS = 2743; // 0xab7
}
public class ActivityNotFoundException extends java.lang.RuntimeException {
ctor public ActivityNotFoundException();
- ctor public ActivityNotFoundException(java.lang.String);
+ ctor public ActivityNotFoundException(String);
}
public abstract class AsyncQueryHandler extends android.os.Handler {
ctor public AsyncQueryHandler(android.content.ContentResolver);
method public final void cancelOperation(int);
method protected android.os.Handler createHandler(android.os.Looper);
- method protected void onDeleteComplete(int, java.lang.Object, int);
- method protected void onInsertComplete(int, java.lang.Object, android.net.Uri);
- method protected void onQueryComplete(int, java.lang.Object, android.database.Cursor);
- method protected void onUpdateComplete(int, java.lang.Object, int);
- method public final void startDelete(int, java.lang.Object, android.net.Uri, java.lang.String, java.lang.String[]);
- method public final void startInsert(int, java.lang.Object, android.net.Uri, android.content.ContentValues);
- method public void startQuery(int, java.lang.Object, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public final void startUpdate(int, java.lang.Object, android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method protected void onDeleteComplete(int, Object, int);
+ method protected void onInsertComplete(int, Object, android.net.Uri);
+ method protected void onQueryComplete(int, Object, android.database.Cursor);
+ method protected void onUpdateComplete(int, Object, int);
+ method public final void startDelete(int, Object, android.net.Uri, String, String[]);
+ method public final void startInsert(int, Object, android.net.Uri, android.content.ContentValues);
+ method public void startQuery(int, Object, android.net.Uri, String[], String, String[], String);
+ method public final void startUpdate(int, Object, android.net.Uri, android.content.ContentValues, String, String[]);
}
protected static final class AsyncQueryHandler.WorkerArgs {
ctor protected AsyncQueryHandler.WorkerArgs();
- field public java.lang.Object cookie;
+ field public Object cookie;
field public android.os.Handler handler;
- field public java.lang.String orderBy;
- field public java.lang.String[] projection;
- field public java.lang.Object result;
- field public java.lang.String selection;
- field public java.lang.String[] selectionArgs;
+ field public String orderBy;
+ field public String[] projection;
+ field public Object result;
+ field public String selection;
+ field public String[] selectionArgs;
field public android.net.Uri uri;
field public android.content.ContentValues values;
}
@@ -9120,14 +9159,14 @@ package android.content {
ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper);
}
- public abstract deprecated class AsyncTaskLoader<D> extends android.content.Loader {
- ctor public AsyncTaskLoader(android.content.Context);
- method public void cancelLoadInBackground();
- method public boolean isLoadInBackgroundCanceled();
- method public abstract D loadInBackground();
- method public void onCanceled(D);
- method protected D onLoadInBackground();
- method public void setUpdateThrottle(long);
+ @Deprecated public abstract class AsyncTaskLoader<D> extends android.content.Loader<D> {
+ ctor @Deprecated public AsyncTaskLoader(android.content.Context);
+ method @Deprecated public void cancelLoadInBackground();
+ method @Deprecated public boolean isLoadInBackgroundCanceled();
+ method @Deprecated public abstract D loadInBackground();
+ method @Deprecated public void onCanceled(D);
+ method @Deprecated protected D onLoadInBackground();
+ method @Deprecated public void setUpdateThrottle(long);
}
public abstract class BroadcastReceiver {
@@ -9137,7 +9176,7 @@ package android.content {
method public final boolean getAbortBroadcast();
method public final boolean getDebugUnregister();
method public final int getResultCode();
- method public final java.lang.String getResultData();
+ method public final String getResultData();
method public final android.os.Bundle getResultExtras(boolean);
method public final android.content.BroadcastReceiver.PendingResult goAsync();
method public final boolean isInitialStickyBroadcast();
@@ -9146,9 +9185,9 @@ package android.content {
method public android.os.IBinder peekService(android.content.Context, android.content.Intent);
method public final void setDebugUnregister(boolean);
method public final void setOrderedHint(boolean);
- method public final void setResult(int, java.lang.String, android.os.Bundle);
+ method public final void setResult(int, String, android.os.Bundle);
method public final void setResultCode(int);
- method public final void setResultData(java.lang.String);
+ method public final void setResultData(String);
method public final void setResultExtras(android.os.Bundle);
}
@@ -9158,16 +9197,16 @@ package android.content {
method public final void finish();
method public final boolean getAbortBroadcast();
method public final int getResultCode();
- method public final java.lang.String getResultData();
+ method public final String getResultData();
method public final android.os.Bundle getResultExtras(boolean);
- method public final void setResult(int, java.lang.String, android.os.Bundle);
+ method public final void setResult(int, String, android.os.Bundle);
method public final void setResultCode(int);
- method public final void setResultData(java.lang.String);
+ method public final void setResultData(String);
method public final void setResultExtras(android.os.Bundle);
}
public class ClipData implements android.os.Parcelable {
- ctor public ClipData(java.lang.CharSequence, java.lang.String[], android.content.ClipData.Item);
+ ctor public ClipData(CharSequence, String[], android.content.ClipData.Item);
ctor public ClipData(android.content.ClipDescription, android.content.ClipData.Item);
ctor public ClipData(android.content.ClipData);
method public void addItem(android.content.ClipData.Item);
@@ -9176,76 +9215,76 @@ package android.content {
method public android.content.ClipDescription getDescription();
method public android.content.ClipData.Item getItemAt(int);
method public int getItemCount();
- method public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
- method public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
- method public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
- method public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
- method public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
+ method public static android.content.ClipData newHtmlText(CharSequence, CharSequence, String);
+ method public static android.content.ClipData newIntent(CharSequence, android.content.Intent);
+ method public static android.content.ClipData newPlainText(CharSequence, CharSequence);
+ method public static android.content.ClipData newRawUri(CharSequence, android.net.Uri);
+ method public static android.content.ClipData newUri(android.content.ContentResolver, CharSequence, android.net.Uri);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.ClipData> CREATOR;
}
public static class ClipData.Item {
- ctor public ClipData.Item(java.lang.CharSequence);
- ctor public ClipData.Item(java.lang.CharSequence, java.lang.String);
+ ctor public ClipData.Item(CharSequence);
+ ctor public ClipData.Item(CharSequence, String);
ctor public ClipData.Item(android.content.Intent);
ctor public ClipData.Item(android.net.Uri);
- ctor public ClipData.Item(java.lang.CharSequence, android.content.Intent, android.net.Uri);
- ctor public ClipData.Item(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);
- method public java.lang.String coerceToHtmlText(android.content.Context);
- method public java.lang.CharSequence coerceToStyledText(android.content.Context);
- method public java.lang.CharSequence coerceToText(android.content.Context);
- method public java.lang.String getHtmlText();
+ ctor public ClipData.Item(CharSequence, android.content.Intent, android.net.Uri);
+ ctor public ClipData.Item(CharSequence, String, android.content.Intent, android.net.Uri);
+ method public String coerceToHtmlText(android.content.Context);
+ method public CharSequence coerceToStyledText(android.content.Context);
+ method public CharSequence coerceToText(android.content.Context);
+ method public String getHtmlText();
method public android.content.Intent getIntent();
- method public java.lang.CharSequence getText();
+ method public CharSequence getText();
method public android.net.Uri getUri();
}
public class ClipDescription implements android.os.Parcelable {
- ctor public ClipDescription(java.lang.CharSequence, java.lang.String[]);
+ ctor public ClipDescription(CharSequence, String[]);
ctor public ClipDescription(android.content.ClipDescription);
- method public static boolean compareMimeTypes(java.lang.String, java.lang.String);
+ method public static boolean compareMimeTypes(String, String);
method public int describeContents();
- method public java.lang.String[] filterMimeTypes(java.lang.String);
+ method public String[] filterMimeTypes(String);
method public android.os.PersistableBundle getExtras();
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getMimeType(int);
+ method public CharSequence getLabel();
+ method public String getMimeType(int);
method public int getMimeTypeCount();
method public long getTimestamp();
- method public boolean hasMimeType(java.lang.String);
+ method public boolean hasMimeType(String);
method public void setExtras(android.os.PersistableBundle);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.ClipDescription> CREATOR;
- field public static final java.lang.String MIMETYPE_TEXT_HTML = "text/html";
- field public static final java.lang.String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
- field public static final java.lang.String MIMETYPE_TEXT_PLAIN = "text/plain";
- field public static final java.lang.String MIMETYPE_TEXT_URILIST = "text/uri-list";
+ field public static final String MIMETYPE_TEXT_HTML = "text/html";
+ field public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
+ field public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
+ field public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
}
public class ClipboardManager extends android.text.ClipboardManager {
method public void addPrimaryClipChangedListener(android.content.ClipboardManager.OnPrimaryClipChangedListener);
method public void clearPrimaryClip();
- method public android.content.ClipData getPrimaryClip();
- method public android.content.ClipDescription getPrimaryClipDescription();
- method public deprecated java.lang.CharSequence getText();
+ method @Nullable public android.content.ClipData getPrimaryClip();
+ method @Nullable public android.content.ClipDescription getPrimaryClipDescription();
+ method @Deprecated public CharSequence getText();
method public boolean hasPrimaryClip();
- method public deprecated boolean hasText();
+ method @Deprecated public boolean hasText();
method public void removePrimaryClipChangedListener(android.content.ClipboardManager.OnPrimaryClipChangedListener);
- method public void setPrimaryClip(android.content.ClipData);
- method public deprecated void setText(java.lang.CharSequence);
+ method public void setPrimaryClip(@NonNull android.content.ClipData);
+ method @Deprecated public void setText(CharSequence);
}
- public static abstract interface ClipboardManager.OnPrimaryClipChangedListener {
- method public abstract void onPrimaryClipChanged();
+ public static interface ClipboardManager.OnPrimaryClipChangedListener {
+ method public void onPrimaryClipChanged();
}
- public abstract interface ComponentCallbacks {
- method public abstract void onConfigurationChanged(android.content.res.Configuration);
- method public abstract void onLowMemory();
+ public interface ComponentCallbacks {
+ method public void onConfigurationChanged(@NonNull android.content.res.Configuration);
+ method public void onLowMemory();
}
- public abstract interface ComponentCallbacks2 implements android.content.ComponentCallbacks {
- method public abstract void onTrimMemory(int);
+ public interface ComponentCallbacks2 extends android.content.ComponentCallbacks {
+ method public void onTrimMemory(int);
field public static final int TRIM_MEMORY_BACKGROUND = 40; // 0x28
field public static final int TRIM_MEMORY_COMPLETE = 80; // 0x50
field public static final int TRIM_MEMORY_MODERATE = 60; // 0x3c
@@ -9255,128 +9294,128 @@ package android.content {
field public static final int TRIM_MEMORY_UI_HIDDEN = 20; // 0x14
}
- public final class ComponentName implements java.lang.Cloneable java.lang.Comparable android.os.Parcelable {
- ctor public ComponentName(java.lang.String, java.lang.String);
- ctor public ComponentName(android.content.Context, java.lang.String);
- ctor public ComponentName(android.content.Context, java.lang.Class<?>);
+ public final class ComponentName implements java.lang.Cloneable java.lang.Comparable<android.content.ComponentName> android.os.Parcelable {
+ ctor public ComponentName(@NonNull String, @NonNull String);
+ ctor public ComponentName(@NonNull android.content.Context, @NonNull String);
+ ctor public ComponentName(@NonNull android.content.Context, @NonNull Class<?>);
ctor public ComponentName(android.os.Parcel);
method public android.content.ComponentName clone();
method public int compareTo(android.content.ComponentName);
- method public static android.content.ComponentName createRelative(java.lang.String, java.lang.String);
- method public static android.content.ComponentName createRelative(android.content.Context, java.lang.String);
+ method @NonNull public static android.content.ComponentName createRelative(@NonNull String, @NonNull String);
+ method @NonNull public static android.content.ComponentName createRelative(@NonNull android.content.Context, @NonNull String);
method public int describeContents();
- method public java.lang.String flattenToShortString();
- method public java.lang.String flattenToString();
- method public java.lang.String getClassName();
- method public java.lang.String getPackageName();
- method public java.lang.String getShortClassName();
+ method @NonNull public String flattenToShortString();
+ method @NonNull public String flattenToString();
+ method @NonNull public String getClassName();
+ method @NonNull public String getPackageName();
+ method public String getShortClassName();
method public static android.content.ComponentName readFromParcel(android.os.Parcel);
- method public java.lang.String toShortString();
- method public static android.content.ComponentName unflattenFromString(java.lang.String);
+ method public String toShortString();
+ method @Nullable public static android.content.ComponentName unflattenFromString(@NonNull String);
method public void writeToParcel(android.os.Parcel, int);
method public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
field public static final android.os.Parcelable.Creator<android.content.ComponentName> CREATOR;
}
- public abstract interface ContentInterface {
- method public abstract android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
- method public abstract int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException;
- method public abstract android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException;
- method public abstract android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException;
- method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
- method public abstract java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException;
- method public abstract java.lang.String getType(android.net.Uri) throws android.os.RemoteException;
- method public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues) throws android.os.RemoteException;
- method public abstract android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public abstract android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public abstract android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException;
- method public abstract boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException;
- method public abstract android.net.Uri uncanonicalize(android.net.Uri) throws android.os.RemoteException;
- method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
+ public interface ContentInterface {
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull String, @NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
+ method public int bulkInsert(@NonNull android.net.Uri, @NonNull android.content.ContentValues[]) throws android.os.RemoteException;
+ method @Nullable public android.os.Bundle call(@NonNull String, @NonNull String, @Nullable String, @Nullable android.os.Bundle) throws android.os.RemoteException;
+ method @Nullable public android.net.Uri canonicalize(@NonNull android.net.Uri) throws android.os.RemoteException;
+ method public int delete(@NonNull android.net.Uri, @Nullable String, @Nullable String[]) throws android.os.RemoteException;
+ method @Nullable public String[] getStreamTypes(@NonNull android.net.Uri, @NonNull String) throws android.os.RemoteException;
+ method @Nullable public String getType(@NonNull android.net.Uri) throws android.os.RemoteException;
+ method @Nullable public android.net.Uri insert(@NonNull android.net.Uri, @Nullable android.content.ContentValues) throws android.os.RemoteException;
+ method @Nullable public android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws android.os.RemoteException;
+ method public boolean refresh(@NonNull android.net.Uri, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws android.os.RemoteException;
+ method @Nullable public android.net.Uri uncanonicalize(@NonNull android.net.Uri) throws android.os.RemoteException;
+ method public int update(@NonNull android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]) throws android.os.RemoteException;
}
public abstract class ContentProvider implements android.content.ComponentCallbacks2 android.content.ContentInterface {
ctor public ContentProvider();
- method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException;
- method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException;
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull String, @NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException;
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException;
method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
- method public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
- method public android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
- method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
- method public android.net.Uri canonicalize(android.net.Uri);
- method public final android.content.ContentProvider.CallingIdentity clearCallingIdentity();
- method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public final java.lang.String getCallingPackage();
- method public final android.content.Context getContext();
- method public final android.content.pm.PathPermission[] getPathPermissions();
- method public final java.lang.String getReadPermission();
- method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
- method public abstract java.lang.String getType(android.net.Uri);
- method public final java.lang.String getWritePermission();
- method public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+ method public int bulkInsert(@NonNull android.net.Uri, @NonNull android.content.ContentValues[]);
+ method @Nullable public android.os.Bundle call(@NonNull String, @NonNull String, @Nullable String, @Nullable android.os.Bundle);
+ method @Nullable public android.os.Bundle call(@NonNull String, @Nullable String, @Nullable android.os.Bundle);
+ method @Nullable public android.net.Uri canonicalize(@NonNull android.net.Uri);
+ method @NonNull public final android.content.ContentProvider.CallingIdentity clearCallingIdentity();
+ method public abstract int delete(@NonNull android.net.Uri, @Nullable String, @Nullable String[]);
+ method public void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Nullable public final String getCallingPackage();
+ method @Nullable public final android.content.Context getContext();
+ method @Nullable public final android.content.pm.PathPermission[] getPathPermissions();
+ method @Nullable public final String getReadPermission();
+ method @Nullable public String[] getStreamTypes(@NonNull android.net.Uri, @NonNull String);
+ method @Nullable public abstract String getType(@NonNull android.net.Uri);
+ method @Nullable public final String getWritePermission();
+ method @Nullable public abstract android.net.Uri insert(@NonNull android.net.Uri, @Nullable android.content.ContentValues);
method protected boolean isTemporary();
method public void onConfigurationChanged(android.content.res.Configuration);
method public abstract boolean onCreate();
method public void onLowMemory();
method public void onTrimMemory(int);
- method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
- method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
- method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- method public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
- method public final void restoreCallingIdentity(android.content.ContentProvider.CallingIdentity);
- method protected final void setPathPermissions(android.content.pm.PathPermission[]);
- method protected final void setReadPermission(java.lang.String);
- method protected final void setWritePermission(java.lang.String);
+ method @Nullable public android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @Nullable public android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @Nullable public android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @NonNull protected final android.os.ParcelFileDescriptor openFileHelper(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @NonNull public <T> android.os.ParcelFileDescriptor openPipeHelper(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable T, @NonNull android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
+ method @Nullable public android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle) throws java.io.FileNotFoundException;
+ method @Nullable public android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public abstract android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String);
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String, @Nullable android.os.CancellationSignal);
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
+ method public boolean refresh(android.net.Uri, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
+ method public final void restoreCallingIdentity(@NonNull android.content.ContentProvider.CallingIdentity);
+ method protected final void setPathPermissions(@Nullable android.content.pm.PathPermission[]);
+ method protected final void setReadPermission(@Nullable String);
+ method protected final void setWritePermission(@Nullable String);
method public void shutdown();
- method public android.net.Uri uncanonicalize(android.net.Uri);
- method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method @Nullable public android.net.Uri uncanonicalize(@NonNull android.net.Uri);
+ method public abstract int update(@NonNull android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]);
}
public final class ContentProvider.CallingIdentity {
}
- public static abstract interface ContentProvider.PipeDataWriter<T> {
- method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
+ public static interface ContentProvider.PipeDataWriter<T> {
+ method public void writeDataToPipe(@NonNull android.os.ParcelFileDescriptor, @NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable T);
}
public class ContentProviderClient implements java.lang.AutoCloseable android.content.ContentInterface {
- method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
- method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
- method public int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException;
- method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException;
- method public android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException;
- method public final android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException;
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull String, @NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
+ method public int bulkInsert(@NonNull android.net.Uri, @NonNull android.content.ContentValues[]) throws android.os.RemoteException;
+ method @Nullable public android.os.Bundle call(@NonNull String, @Nullable String, @Nullable android.os.Bundle) throws android.os.RemoteException;
+ method @Nullable public android.os.Bundle call(@NonNull String, @NonNull String, @Nullable String, @Nullable android.os.Bundle) throws android.os.RemoteException;
+ method @Nullable public final android.net.Uri canonicalize(@NonNull android.net.Uri) throws android.os.RemoteException;
method public void close();
method public static void closeQuietly(android.content.ContentProviderClient);
- method public int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
- method public android.content.ContentProvider getLocalContentProvider();
- method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException;
- method public java.lang.String getType(android.net.Uri) throws android.os.RemoteException;
- method public android.net.Uri insert(android.net.Uri, android.content.ContentValues) throws android.os.RemoteException;
- method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) throws android.os.RemoteException;
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal) throws android.os.RemoteException;
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException;
- method public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException;
- method public deprecated boolean release();
- method public final android.net.Uri uncanonicalize(android.net.Uri) throws android.os.RemoteException;
- method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
+ method public int delete(@NonNull android.net.Uri, @Nullable String, @Nullable String[]) throws android.os.RemoteException;
+ method @Nullable public android.content.ContentProvider getLocalContentProvider();
+ method @Nullable public String[] getStreamTypes(@NonNull android.net.Uri, @NonNull String) throws android.os.RemoteException;
+ method @Nullable public String getType(@NonNull android.net.Uri) throws android.os.RemoteException;
+ method @Nullable public android.net.Uri insert(@NonNull android.net.Uri, @Nullable android.content.ContentValues) throws android.os.RemoteException;
+ method @Nullable public android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException;
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String) throws android.os.RemoteException;
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String, @Nullable android.os.CancellationSignal) throws android.os.RemoteException;
+ method @Nullable public android.database.Cursor query(@NonNull android.net.Uri, @Nullable String[], android.os.Bundle, @Nullable android.os.CancellationSignal) throws android.os.RemoteException;
+ method public boolean refresh(android.net.Uri, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws android.os.RemoteException;
+ method @Deprecated public boolean release();
+ method @Nullable public final android.net.Uri uncanonicalize(@NonNull android.net.Uri) throws android.os.RemoteException;
+ method public int update(@NonNull android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]) throws android.os.RemoteException;
}
public class ContentProviderOperation implements android.os.Parcelable {
@@ -9394,7 +9433,7 @@ package android.content {
method public static android.content.ContentProviderOperation.Builder newDelete(android.net.Uri);
method public static android.content.ContentProviderOperation.Builder newInsert(android.net.Uri);
method public static android.content.ContentProviderOperation.Builder newUpdate(android.net.Uri);
- method public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
+ method public String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
method public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.ContentProviderOperation> CREATOR;
@@ -9403,10 +9442,10 @@ package android.content {
public static class ContentProviderOperation.Builder {
method public android.content.ContentProviderOperation build();
method public android.content.ContentProviderOperation.Builder withExpectedCount(int);
- method public android.content.ContentProviderOperation.Builder withSelection(java.lang.String, java.lang.String[]);
+ method public android.content.ContentProviderOperation.Builder withSelection(String, String[]);
method public android.content.ContentProviderOperation.Builder withSelectionBackReference(int, int);
- method public android.content.ContentProviderOperation.Builder withValue(java.lang.String, java.lang.Object);
- method public android.content.ContentProviderOperation.Builder withValueBackReference(java.lang.String, int);
+ method public android.content.ContentProviderOperation.Builder withValue(String, Object);
+ method public android.content.ContentProviderOperation.Builder withValueBackReference(String, int);
method public android.content.ContentProviderOperation.Builder withValueBackReferences(android.content.ContentValues);
method public android.content.ContentProviderOperation.Builder withValues(android.content.ContentValues);
method public android.content.ContentProviderOperation.Builder withYieldAllowed(boolean);
@@ -9419,121 +9458,121 @@ package android.content {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.ContentProviderResult> CREATOR;
- field public final java.lang.Integer count;
+ field public final Integer count;
field public final android.net.Uri uri;
}
public class ContentQueryMap extends java.util.Observable {
- ctor public ContentQueryMap(android.database.Cursor, java.lang.String, boolean, android.os.Handler);
- method public synchronized void close();
- method public synchronized java.util.Map<java.lang.String, android.content.ContentValues> getRows();
- method public synchronized android.content.ContentValues getValues(java.lang.String);
+ ctor public ContentQueryMap(android.database.Cursor, String, boolean, android.os.Handler);
+ method public void close();
+ method public java.util.Map<java.lang.String,android.content.ContentValues> getRows();
+ method public android.content.ContentValues getValues(String);
method public void requery();
method public void setKeepUpdated(boolean);
}
public abstract class ContentResolver implements android.content.ContentInterface {
ctor public ContentResolver(android.content.Context);
- method public final android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
- method public final android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
- method public final android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
- method public final android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
- method public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
- method public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
- method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
- method public final int bulkInsert(android.net.Uri, android.content.ContentValues[]);
- method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
- method public final android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
- method public deprecated void cancelSync(android.net.Uri);
- method public static void cancelSync(android.accounts.Account, java.lang.String);
+ method @Nullable public final android.content.ContentProviderClient acquireContentProviderClient(@NonNull android.net.Uri);
+ method @Nullable public final android.content.ContentProviderClient acquireContentProviderClient(@NonNull String);
+ method @Nullable public final android.content.ContentProviderClient acquireUnstableContentProviderClient(@NonNull android.net.Uri);
+ method @Nullable public final android.content.ContentProviderClient acquireUnstableContentProviderClient(@NonNull String);
+ method public static void addPeriodicSync(android.accounts.Account, String, android.os.Bundle, long);
+ method public static Object addStatusChangeListener(int, android.content.SyncStatusObserver);
+ method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull String, @NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
+ method public final int bulkInsert(@RequiresPermission.Write @NonNull android.net.Uri, @NonNull android.content.ContentValues[]);
+ method @Nullable public final android.os.Bundle call(@NonNull android.net.Uri, @NonNull String, @Nullable String, @Nullable android.os.Bundle);
+ method @Nullable public final android.os.Bundle call(@NonNull String, @NonNull String, @Nullable String, @Nullable android.os.Bundle);
+ method @Deprecated public void cancelSync(android.net.Uri);
+ method public static void cancelSync(android.accounts.Account, String);
method public static void cancelSync(android.content.SyncRequest);
- method public final android.net.Uri canonicalize(android.net.Uri);
- method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+ method @Nullable public final android.net.Uri canonicalize(@NonNull android.net.Uri);
+ method public final int delete(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable String, @Nullable String[]);
method public android.os.Bundle getCache(android.net.Uri);
- method public static deprecated android.content.SyncInfo getCurrentSync();
+ method @Deprecated public static android.content.SyncInfo getCurrentSync();
method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
- method public static int getIsSyncable(android.accounts.Account, java.lang.String);
+ method public static int getIsSyncable(android.accounts.Account, String);
method public static boolean getMasterSyncAutomatically();
- method public java.util.List<android.content.UriPermission> getOutgoingPersistedUriPermissions();
- method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String);
- method public java.util.List<android.content.UriPermission> getPersistedUriPermissions();
- method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
+ method @NonNull public java.util.List<android.content.UriPermission> getOutgoingPersistedUriPermissions();
+ method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, String);
+ method @NonNull public java.util.List<android.content.UriPermission> getPersistedUriPermissions();
+ method @Nullable public String[] getStreamTypes(@NonNull android.net.Uri, @NonNull String);
method public static android.content.SyncAdapterType[] getSyncAdapterTypes();
- method public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
- method public final java.lang.String getType(android.net.Uri);
- method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- method public static boolean isSyncActive(android.accounts.Account, java.lang.String);
- method public static boolean isSyncPending(android.accounts.Account, java.lang.String);
- method public android.graphics.Bitmap loadThumbnail(android.net.Uri, android.util.Size, android.os.CancellationSignal) throws java.io.IOException;
- method public void notifyChange(android.net.Uri, android.database.ContentObserver);
- method public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
- method public void notifyChange(android.net.Uri, android.database.ContentObserver, int);
- method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final java.io.InputStream openInputStream(android.net.Uri) throws java.io.FileNotFoundException;
- method public final java.io.OutputStream openOutputStream(android.net.Uri) throws java.io.FileNotFoundException;
- method public final java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public static boolean getSyncAutomatically(android.accounts.Account, String);
+ method @Nullable public final String getType(@NonNull android.net.Uri);
+ method @Nullable public final android.net.Uri insert(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable android.content.ContentValues);
+ method public static boolean isSyncActive(android.accounts.Account, String);
+ method public static boolean isSyncPending(android.accounts.Account, String);
+ method @NonNull public android.graphics.Bitmap loadThumbnail(@NonNull android.net.Uri, @NonNull android.util.Size, @Nullable android.os.CancellationSignal) throws java.io.IOException;
+ method public void notifyChange(@NonNull android.net.Uri, @Nullable android.database.ContentObserver);
+ method public void notifyChange(@NonNull android.net.Uri, @Nullable android.database.ContentObserver, boolean);
+ method public void notifyChange(@NonNull android.net.Uri, @Nullable android.database.ContentObserver, int);
+ method @Nullable public final android.content.res.AssetFileDescriptor openAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public final android.os.ParcelFileDescriptor openFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public final android.os.ParcelFileDescriptor openFileDescriptor(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @Nullable public final android.os.ParcelFileDescriptor openFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public final java.io.InputStream openInputStream(@NonNull android.net.Uri) throws java.io.FileNotFoundException;
+ method @Nullable public final java.io.OutputStream openOutputStream(@NonNull android.net.Uri) throws java.io.FileNotFoundException;
+ method @Nullable public final java.io.OutputStream openOutputStream(@NonNull android.net.Uri, @NonNull String) throws java.io.FileNotFoundException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle) throws java.io.FileNotFoundException;
+ method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
method public void putCache(android.net.Uri, android.os.Bundle);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- method public final boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
- method public final void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
- method public void releasePersistableUriPermission(android.net.Uri, int);
- method public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
- method public static void removeStatusChangeListener(java.lang.Object);
- method public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
+ method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String);
+ method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String, @Nullable android.os.CancellationSignal);
+ method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
+ method public final boolean refresh(@NonNull android.net.Uri, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
+ method public final void registerContentObserver(@NonNull android.net.Uri, boolean, @NonNull android.database.ContentObserver);
+ method public void releasePersistableUriPermission(@NonNull android.net.Uri, int);
+ method public static void removePeriodicSync(android.accounts.Account, String, android.os.Bundle);
+ method public static void removeStatusChangeListener(Object);
+ method public static void requestSync(android.accounts.Account, String, android.os.Bundle);
method public static void requestSync(android.content.SyncRequest);
- method public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
+ method public static void setIsSyncable(android.accounts.Account, String, int);
method public static void setMasterSyncAutomatically(boolean);
- method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
- method public deprecated void startSync(android.net.Uri, android.os.Bundle);
- method public void takePersistableUriPermission(android.net.Uri, int);
- method public final android.net.Uri uncanonicalize(android.net.Uri);
- method public final void unregisterContentObserver(android.database.ContentObserver);
- method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public static void setSyncAutomatically(android.accounts.Account, String, boolean);
+ method @Deprecated public void startSync(android.net.Uri, android.os.Bundle);
+ method public void takePersistableUriPermission(@NonNull android.net.Uri, int);
+ method @Nullable public final android.net.Uri uncanonicalize(@NonNull android.net.Uri);
+ method public final void unregisterContentObserver(@NonNull android.database.ContentObserver);
+ method public final int update(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]);
method public static void validateSyncExtrasBundle(android.os.Bundle);
- field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
- field public static final java.lang.String CURSOR_DIR_BASE_TYPE = "vnd.android.cursor.dir";
- field public static final java.lang.String CURSOR_ITEM_BASE_TYPE = "vnd.android.cursor.item";
- field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
- field public static final java.lang.String EXTRA_REFRESH_SUPPORTED = "android.content.extra.REFRESH_SUPPORTED";
- field public static final java.lang.String EXTRA_SIZE = "android.content.extra.SIZE";
- field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+ field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+ field public static final String CURSOR_DIR_BASE_TYPE = "vnd.android.cursor.dir";
+ field public static final String CURSOR_ITEM_BASE_TYPE = "vnd.android.cursor.item";
+ field public static final String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+ field public static final String EXTRA_REFRESH_SUPPORTED = "android.content.extra.REFRESH_SUPPORTED";
+ field public static final String EXTRA_SIZE = "android.content.extra.SIZE";
+ field public static final String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
field public static final int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS = 2; // 0x2
field public static final int NOTIFY_SYNC_TO_NETWORK = 1; // 0x1
- field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
- field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
- field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
- field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
- field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-arg-sql-selection-args";
- field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
+ field public static final String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ field public static final String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
+ field public static final String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
+ field public static final String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
+ field public static final String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
+ field public static final String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-arg-sql-selection-args";
+ field public static final String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
field public static final int QUERY_SORT_DIRECTION_ASCENDING = 0; // 0x0
field public static final int QUERY_SORT_DIRECTION_DESCENDING = 1; // 0x1
- field public static final java.lang.String SCHEME_ANDROID_RESOURCE = "android.resource";
- field public static final java.lang.String SCHEME_CONTENT = "content";
- field public static final java.lang.String SCHEME_FILE = "file";
- field public static final deprecated java.lang.String SYNC_EXTRAS_ACCOUNT = "account";
- field public static final java.lang.String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS = "discard_deletions";
- field public static final java.lang.String SYNC_EXTRAS_DO_NOT_RETRY = "do_not_retry";
- field public static final java.lang.String SYNC_EXTRAS_EXPEDITED = "expedited";
- field public static final deprecated java.lang.String SYNC_EXTRAS_FORCE = "force";
- field public static final java.lang.String SYNC_EXTRAS_IGNORE_BACKOFF = "ignore_backoff";
- field public static final java.lang.String SYNC_EXTRAS_IGNORE_SETTINGS = "ignore_settings";
- field public static final java.lang.String SYNC_EXTRAS_INITIALIZE = "initialize";
- field public static final java.lang.String SYNC_EXTRAS_MANUAL = "force";
- field public static final java.lang.String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS = "deletions_override";
- field public static final java.lang.String SYNC_EXTRAS_REQUIRE_CHARGING = "require_charging";
- field public static final java.lang.String SYNC_EXTRAS_UPLOAD = "upload";
+ field public static final String SCHEME_ANDROID_RESOURCE = "android.resource";
+ field public static final String SCHEME_CONTENT = "content";
+ field public static final String SCHEME_FILE = "file";
+ field @Deprecated public static final String SYNC_EXTRAS_ACCOUNT = "account";
+ field public static final String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS = "discard_deletions";
+ field public static final String SYNC_EXTRAS_DO_NOT_RETRY = "do_not_retry";
+ field public static final String SYNC_EXTRAS_EXPEDITED = "expedited";
+ field @Deprecated public static final String SYNC_EXTRAS_FORCE = "force";
+ field public static final String SYNC_EXTRAS_IGNORE_BACKOFF = "ignore_backoff";
+ field public static final String SYNC_EXTRAS_IGNORE_SETTINGS = "ignore_settings";
+ field public static final String SYNC_EXTRAS_INITIALIZE = "initialize";
+ field public static final String SYNC_EXTRAS_MANUAL = "force";
+ field public static final String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS = "deletions_override";
+ field public static final String SYNC_EXTRAS_REQUIRE_CHARGING = "require_charging";
+ field public static final String SYNC_EXTRAS_UPLOAD = "upload";
field public static final int SYNC_OBSERVER_TYPE_ACTIVE = 4; // 0x4
field public static final int SYNC_OBSERVER_TYPE_PENDING = 2; // 0x2
field public static final int SYNC_OBSERVER_TYPE_SETTINGS = 1; // 0x1
@@ -9552,169 +9591,169 @@ package android.content {
ctor public ContentValues(int);
ctor public ContentValues(android.content.ContentValues);
method public void clear();
- method public boolean containsKey(java.lang.String);
+ method public boolean containsKey(String);
method public int describeContents();
- method public java.lang.Object get(java.lang.String);
- method public java.lang.Boolean getAsBoolean(java.lang.String);
- method public java.lang.Byte getAsByte(java.lang.String);
- method public byte[] getAsByteArray(java.lang.String);
- method public java.lang.Double getAsDouble(java.lang.String);
- method public java.lang.Float getAsFloat(java.lang.String);
- method public java.lang.Integer getAsInteger(java.lang.String);
- method public java.lang.Long getAsLong(java.lang.String);
- method public java.lang.Short getAsShort(java.lang.String);
- method public java.lang.String getAsString(java.lang.String);
+ method public Object get(String);
+ method public Boolean getAsBoolean(String);
+ method public Byte getAsByte(String);
+ method public byte[] getAsByteArray(String);
+ method public Double getAsDouble(String);
+ method public Float getAsFloat(String);
+ method public Integer getAsInteger(String);
+ method public Long getAsLong(String);
+ method public Short getAsShort(String);
+ method public String getAsString(String);
method public java.util.Set<java.lang.String> keySet();
- method public void put(java.lang.String, java.lang.String);
- method public void put(java.lang.String, java.lang.Byte);
- method public void put(java.lang.String, java.lang.Short);
- method public void put(java.lang.String, java.lang.Integer);
- method public void put(java.lang.String, java.lang.Long);
- method public void put(java.lang.String, java.lang.Float);
- method public void put(java.lang.String, java.lang.Double);
- method public void put(java.lang.String, java.lang.Boolean);
- method public void put(java.lang.String, byte[]);
+ method public void put(String, String);
+ method public void put(String, Byte);
+ method public void put(String, Short);
+ method public void put(String, Integer);
+ method public void put(String, Long);
+ method public void put(String, Float);
+ method public void put(String, Double);
+ method public void put(String, Boolean);
+ method public void put(String, byte[]);
method public void putAll(android.content.ContentValues);
- method public void putNull(java.lang.String);
- method public void remove(java.lang.String);
+ method public void putNull(String);
+ method public void remove(String);
method public int size();
- method public java.util.Set<java.util.Map.Entry<java.lang.String, java.lang.Object>> valueSet();
+ method public java.util.Set<java.util.Map.Entry<java.lang.String,java.lang.Object>> valueSet();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.ContentValues> CREATOR;
- field public static final java.lang.String TAG = "ContentValues";
+ field public static final String TAG = "ContentValues";
}
public abstract class Context {
ctor public Context();
- method public abstract boolean bindIsolatedService(android.content.Intent, android.content.ServiceConnection, int, java.lang.String);
- method public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- method public abstract int checkCallingOrSelfPermission(java.lang.String);
- method public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
- method public abstract int checkCallingPermission(java.lang.String);
- method public abstract int checkCallingUriPermission(android.net.Uri, int);
- method public abstract int checkPermission(java.lang.String, int, int);
- method public abstract int checkSelfPermission(java.lang.String);
- method public abstract int checkUriPermission(android.net.Uri, int, int, int);
- method public abstract int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
- method public abstract deprecated void clearWallpaper() throws java.io.IOException;
- method public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
- method public abstract android.content.Context createContextForSplit(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract boolean bindIsolatedService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String);
+ method public abstract boolean bindService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int);
+ method @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)") public abstract int checkCallingOrSelfPermission(@NonNull String);
+ method @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)") public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
+ method @CheckResult(suggest="#enforceCallingPermission(String,String)") public abstract int checkCallingPermission(@NonNull String);
+ method @CheckResult(suggest="#enforceCallingUriPermission(Uri,int,String)") public abstract int checkCallingUriPermission(android.net.Uri, int);
+ method @CheckResult(suggest="#enforcePermission(String,int,int,String)") public abstract int checkPermission(@NonNull String, int, int);
+ method public abstract int checkSelfPermission(@NonNull String);
+ method @CheckResult(suggest="#enforceUriPermission(Uri,int,int,String)") public abstract int checkUriPermission(android.net.Uri, int, int, int);
+ method @CheckResult(suggest="#enforceUriPermission(Uri,String,String,int,int,int,String)") public abstract int checkUriPermission(@Nullable android.net.Uri, @Nullable String, @Nullable String, int, int, int);
+ method @Deprecated public abstract void clearWallpaper() throws java.io.IOException;
+ method public abstract android.content.Context createConfigurationContext(@NonNull android.content.res.Configuration);
+ method public abstract android.content.Context createContextForSplit(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.Context createDeviceProtectedStorageContext();
- method public abstract android.content.Context createDisplayContext(android.view.Display);
- method public abstract android.content.Context createPackageContext(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.lang.String[] databaseList();
- method public abstract boolean deleteDatabase(java.lang.String);
- method public abstract boolean deleteFile(java.lang.String);
- method public abstract boolean deleteSharedPreferences(java.lang.String);
- method public abstract void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- method public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- method public abstract void enforceCallingPermission(java.lang.String, java.lang.String);
- method public abstract void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- method public abstract void enforcePermission(java.lang.String, int, int, java.lang.String);
- method public abstract void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- method public abstract void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- method public abstract java.lang.String[] fileList();
+ method public abstract android.content.Context createDisplayContext(@NonNull android.view.Display);
+ method public abstract android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract String[] databaseList();
+ method public abstract boolean deleteDatabase(String);
+ method public abstract boolean deleteFile(String);
+ method public abstract boolean deleteSharedPreferences(String);
+ method public abstract void enforceCallingOrSelfPermission(@NonNull String, @Nullable String);
+ method public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
+ method public abstract void enforceCallingPermission(@NonNull String, @Nullable String);
+ method public abstract void enforceCallingUriPermission(android.net.Uri, int, String);
+ method public abstract void enforcePermission(@NonNull String, int, int, @Nullable String);
+ method public abstract void enforceUriPermission(android.net.Uri, int, int, int, String);
+ method public abstract void enforceUriPermission(@Nullable android.net.Uri, @Nullable String, @Nullable String, int, int, int, @Nullable String);
+ method public abstract String[] fileList();
method public abstract android.content.Context getApplicationContext();
method public abstract android.content.pm.ApplicationInfo getApplicationInfo();
method public abstract android.content.res.AssetManager getAssets();
method public abstract java.io.File getCacheDir();
- method public abstract java.lang.ClassLoader getClassLoader();
+ method public abstract ClassLoader getClassLoader();
method public abstract java.io.File getCodeCacheDir();
- method public final int getColor(int);
- method public final android.content.res.ColorStateList getColorStateList(int);
+ method @ColorInt public final int getColor(@ColorRes int);
+ method @NonNull public final android.content.res.ColorStateList getColorStateList(@ColorRes int);
method public abstract android.content.ContentResolver getContentResolver();
method public abstract java.io.File getDataDir();
- method public abstract java.io.File getDatabasePath(java.lang.String);
- method public abstract java.io.File getDir(java.lang.String, int);
- method public final android.graphics.drawable.Drawable getDrawable(int);
- method public abstract java.io.File getExternalCacheDir();
+ method public abstract java.io.File getDatabasePath(String);
+ method public abstract java.io.File getDir(String, int);
+ method @Nullable public final android.graphics.drawable.Drawable getDrawable(@DrawableRes int);
+ method @Nullable public abstract java.io.File getExternalCacheDir();
method public abstract java.io.File[] getExternalCacheDirs();
- method public abstract java.io.File getExternalFilesDir(java.lang.String);
- method public abstract java.io.File[] getExternalFilesDirs(java.lang.String);
+ method @Nullable public abstract java.io.File getExternalFilesDir(@Nullable String);
+ method public abstract java.io.File[] getExternalFilesDirs(String);
method public abstract java.io.File[] getExternalMediaDirs();
- method public abstract java.io.File getFileStreamPath(java.lang.String);
+ method public abstract java.io.File getFileStreamPath(String);
method public abstract java.io.File getFilesDir();
method public java.util.concurrent.Executor getMainExecutor();
method public abstract android.os.Looper getMainLooper();
method public abstract java.io.File getNoBackupFilesDir();
method public abstract java.io.File getObbDir();
method public abstract java.io.File[] getObbDirs();
- method public abstract java.lang.String getOpPackageName();
- method public abstract java.lang.String getPackageCodePath();
+ method public abstract String getOpPackageName();
+ method public abstract String getPackageCodePath();
method public abstract android.content.pm.PackageManager getPackageManager();
- method public abstract java.lang.String getPackageName();
- method public abstract java.lang.String getPackageResourcePath();
+ method public abstract String getPackageName();
+ method public abstract String getPackageResourcePath();
method public abstract android.content.res.Resources getResources();
- method public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- method public final java.lang.String getString(int);
- method public final java.lang.String getString(int, java.lang.Object...);
- method public abstract java.lang.Object getSystemService(java.lang.String);
- method public final <T> T getSystemService(java.lang.Class<T>);
- method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>);
- method public final java.lang.CharSequence getText(int);
- method public abstract android.content.res.Resources.Theme getTheme();
- method public abstract deprecated android.graphics.drawable.Drawable getWallpaper();
- method public abstract deprecated int getWallpaperDesiredMinimumHeight();
- method public abstract deprecated int getWallpaperDesiredMinimumWidth();
- method public abstract void grantUriPermission(java.lang.String, android.net.Uri, int);
+ method public abstract android.content.SharedPreferences getSharedPreferences(String, int);
+ method @NonNull public final String getString(@StringRes int);
+ method @NonNull public final String getString(@StringRes int, java.lang.Object...);
+ method public abstract Object getSystemService(@NonNull String);
+ method public final <T> T getSystemService(@NonNull Class<T>);
+ method @Nullable public abstract String getSystemServiceName(@NonNull Class<?>);
+ method @NonNull public final CharSequence getText(@StringRes int);
+ method @android.view.ViewDebug.ExportedProperty(deepExport=true) public abstract android.content.res.Resources.Theme getTheme();
+ method @Deprecated public abstract android.graphics.drawable.Drawable getWallpaper();
+ method @Deprecated public abstract int getWallpaperDesiredMinimumHeight();
+ method @Deprecated public abstract int getWallpaperDesiredMinimumWidth();
+ method public abstract void grantUriPermission(String, android.net.Uri, int);
method public abstract boolean isDeviceProtectedStorage();
method public boolean isRestricted();
- method public abstract boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- method public abstract boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- method public final android.content.res.TypedArray obtainStyledAttributes(int[]);
- method public final android.content.res.TypedArray obtainStyledAttributes(int, int[]) throws android.content.res.Resources.NotFoundException;
- method public final android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
- method public final android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
- method public abstract java.io.FileInputStream openFileInput(java.lang.String) throws java.io.FileNotFoundException;
- method public abstract java.io.FileOutputStream openFileOutput(java.lang.String, int) throws java.io.FileNotFoundException;
- method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
- method public abstract deprecated android.graphics.drawable.Drawable peekWallpaper();
+ method public abstract boolean moveDatabaseFrom(android.content.Context, String);
+ method public abstract boolean moveSharedPreferencesFrom(android.content.Context, String);
+ method @NonNull public final android.content.res.TypedArray obtainStyledAttributes(@NonNull @StyleableRes int[]);
+ method @NonNull public final android.content.res.TypedArray obtainStyledAttributes(@StyleRes int, @NonNull @StyleableRes int[]) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public final android.content.res.TypedArray obtainStyledAttributes(@Nullable android.util.AttributeSet, @NonNull @StyleableRes int[]);
+ method @NonNull public final android.content.res.TypedArray obtainStyledAttributes(@Nullable android.util.AttributeSet, @NonNull @StyleableRes int[], @AttrRes int, @StyleRes int);
+ method public abstract java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
+ method public abstract java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
+ method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, @Nullable android.database.DatabaseErrorHandler);
+ method @Deprecated public abstract android.graphics.drawable.Drawable peekWallpaper();
method public void registerComponentCallbacks(android.content.ComponentCallbacks);
- method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
- method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
- method public abstract deprecated void removeStickyBroadcast(android.content.Intent);
- method public abstract deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method @Nullable public abstract android.content.Intent registerReceiver(@Nullable android.content.BroadcastReceiver, android.content.IntentFilter);
+ method @Nullable public abstract android.content.Intent registerReceiver(@Nullable android.content.BroadcastReceiver, android.content.IntentFilter, int);
+ method @Nullable public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, @Nullable String, @Nullable android.os.Handler);
+ method @Nullable public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, @Nullable String, @Nullable android.os.Handler, int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY) public abstract void removeStickyBroadcast(@RequiresPermission android.content.Intent);
+ method @Deprecated @RequiresPermission(allOf={"android.permission.INTERACT_ACROSS_USERS", android.Manifest.permission.BROADCAST_STICKY}) public abstract void removeStickyBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
method public abstract void revokeUriPermission(android.net.Uri, int);
- method public abstract void revokeUriPermission(java.lang.String, android.net.Uri, int);
- method public abstract void sendBroadcast(android.content.Intent);
- method public abstract void sendBroadcast(android.content.Intent, java.lang.String);
- method public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- method public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- method public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public abstract deprecated void sendStickyBroadcast(android.content.Intent);
- method public abstract deprecated void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public abstract deprecated void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public abstract deprecated void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public abstract void setTheme(int);
- method public abstract deprecated void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
- method public abstract deprecated void setWallpaper(java.io.InputStream) throws java.io.IOException;
- method public abstract void startActivities(android.content.Intent[]);
- method public abstract void startActivities(android.content.Intent[], android.os.Bundle);
- method public abstract void startActivity(android.content.Intent);
- method public abstract void startActivity(android.content.Intent, android.os.Bundle);
- method public abstract android.content.ComponentName startForegroundService(android.content.Intent);
- method public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
- method public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
- method public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
- method public abstract android.content.ComponentName startService(android.content.Intent);
+ method public abstract void revokeUriPermission(String, android.net.Uri, int);
+ method public abstract void sendBroadcast(@RequiresPermission android.content.Intent);
+ method public abstract void sendBroadcast(@RequiresPermission android.content.Intent, @Nullable String);
+ method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
+ method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String);
+ method public abstract void sendOrderedBroadcast(@RequiresPermission android.content.Intent, @Nullable String);
+ method public abstract void sendOrderedBroadcast(@RequiresPermission @NonNull android.content.Intent, @Nullable String, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendOrderedBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY) public abstract void sendStickyBroadcast(@RequiresPermission android.content.Intent);
+ method @Deprecated @RequiresPermission(allOf={"android.permission.INTERACT_ACROSS_USERS", android.Manifest.permission.BROADCAST_STICKY}) public abstract void sendStickyBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY) public abstract void sendStickyOrderedBroadcast(@RequiresPermission android.content.Intent, android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method @Deprecated @RequiresPermission(allOf={"android.permission.INTERACT_ACROSS_USERS", android.Manifest.permission.BROADCAST_STICKY}) public abstract void sendStickyOrderedBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method public abstract void setTheme(@StyleRes int);
+ method @Deprecated public abstract void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
+ method @Deprecated public abstract void setWallpaper(java.io.InputStream) throws java.io.IOException;
+ method public abstract void startActivities(@RequiresPermission android.content.Intent[]);
+ method public abstract void startActivities(@RequiresPermission android.content.Intent[], android.os.Bundle);
+ method public abstract void startActivity(@RequiresPermission android.content.Intent);
+ method public abstract void startActivity(@RequiresPermission android.content.Intent, @Nullable android.os.Bundle);
+ method @Nullable public abstract android.content.ComponentName startForegroundService(android.content.Intent);
+ method public abstract boolean startInstrumentation(@NonNull android.content.ComponentName, @Nullable String, @Nullable android.os.Bundle);
+ method public abstract void startIntentSender(android.content.IntentSender, @Nullable android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public abstract void startIntentSender(android.content.IntentSender, @Nullable android.content.Intent, int, int, int, @Nullable android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method @Nullable public abstract android.content.ComponentName startService(android.content.Intent);
method public abstract boolean stopService(android.content.Intent);
- method public abstract void unbindService(android.content.ServiceConnection);
+ method public abstract void unbindService(@NonNull android.content.ServiceConnection);
method public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
method public abstract void unregisterReceiver(android.content.BroadcastReceiver);
- method public abstract void updateServiceGroup(android.content.ServiceConnection, int, int);
- field public static final java.lang.String ACCESSIBILITY_SERVICE = "accessibility";
- field public static final java.lang.String ACCOUNT_SERVICE = "account";
- field public static final java.lang.String ACTIVITY_SERVICE = "activity";
- field public static final java.lang.String ALARM_SERVICE = "alarm";
- field public static final java.lang.String APPWIDGET_SERVICE = "appwidget";
- field public static final java.lang.String APP_OPS_SERVICE = "appops";
- field public static final java.lang.String AUDIO_SERVICE = "audio";
- field public static final java.lang.String BATTERY_SERVICE = "batterymanager";
+ method public abstract void updateServiceGroup(@NonNull android.content.ServiceConnection, int, int);
+ field public static final String ACCESSIBILITY_SERVICE = "accessibility";
+ field public static final String ACCOUNT_SERVICE = "account";
+ field public static final String ACTIVITY_SERVICE = "activity";
+ field public static final String ALARM_SERVICE = "alarm";
+ field public static final String APPWIDGET_SERVICE = "appwidget";
+ field public static final String APP_OPS_SERVICE = "appops";
+ field public static final String AUDIO_SERVICE = "audio";
+ field public static final String BATTERY_SERVICE = "batterymanager";
field public static final int BIND_ABOVE_CLIENT = 8; // 0x8
field public static final int BIND_ADJUST_WITH_ACTIVITY = 128; // 0x80
field public static final int BIND_ALLOW_OOM_MANAGEMENT = 16; // 0x10
@@ -9724,182 +9763,182 @@ package android.content {
field public static final int BIND_IMPORTANT = 64; // 0x40
field public static final int BIND_NOT_FOREGROUND = 4; // 0x4
field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20
- field public static final java.lang.String BIOMETRIC_SERVICE = "biometric";
- field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
- field public static final java.lang.String CAMERA_SERVICE = "camera";
- field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
- field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
- field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
- field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
- field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
- field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
+ field public static final String BIOMETRIC_SERVICE = "biometric";
+ field public static final String BLUETOOTH_SERVICE = "bluetooth";
+ field public static final String CAMERA_SERVICE = "camera";
+ field public static final String CAPTIONING_SERVICE = "captioning";
+ field public static final String CARRIER_CONFIG_SERVICE = "carrier_config";
+ field public static final String CLIPBOARD_SERVICE = "clipboard";
+ field public static final String COMPANION_DEVICE_SERVICE = "companiondevice";
+ field public static final String CONNECTIVITY_SERVICE = "connectivity";
+ field public static final String CONSUMER_IR_SERVICE = "consumer_ir";
field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
field public static final int CONTEXT_INCLUDE_CODE = 1; // 0x1
field public static final int CONTEXT_RESTRICTED = 4; // 0x4
- field public static final java.lang.String CROSS_PROFILE_APPS_SERVICE = "crossprofileapps";
- field public static final java.lang.String DEVICE_POLICY_SERVICE = "device_policy";
- field public static final java.lang.String DISPLAY_SERVICE = "display";
- field public static final java.lang.String DOWNLOAD_SERVICE = "download";
- field public static final java.lang.String DROPBOX_SERVICE = "dropbox";
- field public static final java.lang.String EUICC_SERVICE = "euicc";
- field public static final java.lang.String FINGERPRINT_SERVICE = "fingerprint";
- field public static final java.lang.String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
- field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
- field public static final java.lang.String INPUT_SERVICE = "input";
- field public static final java.lang.String IPSEC_SERVICE = "ipsec";
- field public static final java.lang.String JOB_SCHEDULER_SERVICE = "jobscheduler";
- field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
- field public static final java.lang.String LAUNCHER_APPS_SERVICE = "launcherapps";
- field public static final java.lang.String LAYOUT_INFLATER_SERVICE = "layout_inflater";
- field public static final java.lang.String LOCATION_SERVICE = "location";
- field public static final java.lang.String MEDIA_PROJECTION_SERVICE = "media_projection";
- field public static final java.lang.String MEDIA_ROUTER_SERVICE = "media_router";
- field public static final java.lang.String MEDIA_SESSION_SERVICE = "media_session";
- field public static final java.lang.String MIDI_SERVICE = "midi";
+ field public static final String CROSS_PROFILE_APPS_SERVICE = "crossprofileapps";
+ field public static final String DEVICE_POLICY_SERVICE = "device_policy";
+ field public static final String DISPLAY_SERVICE = "display";
+ field public static final String DOWNLOAD_SERVICE = "download";
+ field public static final String DROPBOX_SERVICE = "dropbox";
+ field public static final String EUICC_SERVICE = "euicc";
+ field public static final String FINGERPRINT_SERVICE = "fingerprint";
+ field public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
+ field public static final String INPUT_METHOD_SERVICE = "input_method";
+ field public static final String INPUT_SERVICE = "input";
+ field public static final String IPSEC_SERVICE = "ipsec";
+ field public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
+ field public static final String KEYGUARD_SERVICE = "keyguard";
+ field public static final String LAUNCHER_APPS_SERVICE = "launcherapps";
+ field public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
+ field public static final String LOCATION_SERVICE = "location";
+ field public static final String MEDIA_PROJECTION_SERVICE = "media_projection";
+ field public static final String MEDIA_ROUTER_SERVICE = "media_router";
+ field public static final String MEDIA_SESSION_SERVICE = "media_session";
+ field public static final String MIDI_SERVICE = "midi";
field public static final int MODE_APPEND = 32768; // 0x8000
field public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 8; // 0x8
- field public static final deprecated int MODE_MULTI_PROCESS = 4; // 0x4
+ field @Deprecated public static final int MODE_MULTI_PROCESS = 4; // 0x4
field public static final int MODE_NO_LOCALIZED_COLLATORS = 16; // 0x10
field public static final int MODE_PRIVATE = 0; // 0x0
- field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1
- field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2
- field public static final java.lang.String NETWORK_STATS_SERVICE = "netstats";
- field public static final java.lang.String NFC_SERVICE = "nfc";
- field public static final java.lang.String NOTIFICATION_SERVICE = "notification";
- field public static final java.lang.String NSD_SERVICE = "servicediscovery";
- field public static final java.lang.String POWER_SERVICE = "power";
- field public static final java.lang.String PRINT_SERVICE = "print";
+ field @Deprecated public static final int MODE_WORLD_READABLE = 1; // 0x1
+ field @Deprecated public static final int MODE_WORLD_WRITEABLE = 2; // 0x2
+ field public static final String NETWORK_STATS_SERVICE = "netstats";
+ field public static final String NFC_SERVICE = "nfc";
+ field public static final String NOTIFICATION_SERVICE = "notification";
+ field public static final String NSD_SERVICE = "servicediscovery";
+ field public static final String POWER_SERVICE = "power";
+ field public static final String PRINT_SERVICE = "print";
field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
- field public static final java.lang.String RESTRICTIONS_SERVICE = "restrictions";
- field public static final java.lang.String ROLE_SERVICE = "role";
- field public static final java.lang.String SEARCH_SERVICE = "search";
- field public static final java.lang.String SENSOR_SERVICE = "sensor";
- field public static final java.lang.String SHORTCUT_SERVICE = "shortcut";
- field public static final java.lang.String STORAGE_SERVICE = "storage";
- field public static final java.lang.String STORAGE_STATS_SERVICE = "storagestats";
- field public static final java.lang.String SYSTEM_HEALTH_SERVICE = "systemhealth";
- field public static final java.lang.String TELECOM_SERVICE = "telecom";
- field public static final java.lang.String TELEPHONY_SERVICE = "phone";
- field public static final java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
- field public static final java.lang.String TEXT_CLASSIFICATION_SERVICE = "textclassification";
- field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
- field public static final java.lang.String TV_INPUT_SERVICE = "tv_input";
- field public static final java.lang.String UI_MODE_SERVICE = "uimode";
- field public static final java.lang.String USAGE_STATS_SERVICE = "usagestats";
- field public static final java.lang.String USB_SERVICE = "usb";
- field public static final java.lang.String USER_SERVICE = "user";
- field public static final java.lang.String VIBRATOR_SERVICE = "vibrator";
- field public static final java.lang.String WALLPAPER_SERVICE = "wallpaper";
- field public static final java.lang.String WIFI_AWARE_SERVICE = "wifiaware";
- field public static final java.lang.String WIFI_P2P_SERVICE = "wifip2p";
- field public static final java.lang.String WIFI_RTT_RANGING_SERVICE = "wifirtt";
- field public static final java.lang.String WIFI_SERVICE = "wifi";
- field public static final java.lang.String WINDOW_SERVICE = "window";
+ field public static final String RESTRICTIONS_SERVICE = "restrictions";
+ field public static final String ROLE_SERVICE = "role";
+ field public static final String SEARCH_SERVICE = "search";
+ field public static final String SENSOR_SERVICE = "sensor";
+ field public static final String SHORTCUT_SERVICE = "shortcut";
+ field public static final String STORAGE_SERVICE = "storage";
+ field public static final String STORAGE_STATS_SERVICE = "storagestats";
+ field public static final String SYSTEM_HEALTH_SERVICE = "systemhealth";
+ field public static final String TELECOM_SERVICE = "telecom";
+ field public static final String TELEPHONY_SERVICE = "phone";
+ field public static final String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
+ field public static final String TEXT_CLASSIFICATION_SERVICE = "textclassification";
+ field public static final String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
+ field public static final String TV_INPUT_SERVICE = "tv_input";
+ field public static final String UI_MODE_SERVICE = "uimode";
+ field public static final String USAGE_STATS_SERVICE = "usagestats";
+ field public static final String USB_SERVICE = "usb";
+ field public static final String USER_SERVICE = "user";
+ field public static final String VIBRATOR_SERVICE = "vibrator";
+ field public static final String WALLPAPER_SERVICE = "wallpaper";
+ field public static final String WIFI_AWARE_SERVICE = "wifiaware";
+ field public static final String WIFI_P2P_SERVICE = "wifip2p";
+ field public static final String WIFI_RTT_RANGING_SERVICE = "wifirtt";
+ field public static final String WIFI_SERVICE = "wifi";
+ field public static final String WINDOW_SERVICE = "window";
}
public class ContextWrapper extends android.content.Context {
ctor public ContextWrapper(android.content.Context);
method protected void attachBaseContext(android.content.Context);
- method public boolean bindIsolatedService(android.content.Intent, android.content.ServiceConnection, int, java.lang.String);
+ method public boolean bindIsolatedService(android.content.Intent, android.content.ServiceConnection, int, String);
method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- method public int checkCallingOrSelfPermission(java.lang.String);
+ method public int checkCallingOrSelfPermission(String);
method public int checkCallingOrSelfUriPermission(android.net.Uri, int);
- method public int checkCallingPermission(java.lang.String);
+ method public int checkCallingPermission(String);
method public int checkCallingUriPermission(android.net.Uri, int);
- method public int checkPermission(java.lang.String, int, int);
- method public int checkSelfPermission(java.lang.String);
+ method public int checkPermission(String, int, int);
+ method public int checkSelfPermission(String);
method public int checkUriPermission(android.net.Uri, int, int, int);
- method public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
- method public deprecated void clearWallpaper() throws java.io.IOException;
+ method public int checkUriPermission(android.net.Uri, String, String, int, int, int);
+ method @Deprecated public void clearWallpaper() throws java.io.IOException;
method public android.content.Context createConfigurationContext(android.content.res.Configuration);
- method public android.content.Context createContextForSplit(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createContextForSplit(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.Context createDeviceProtectedStorageContext();
method public android.content.Context createDisplayContext(android.view.Display);
- method public android.content.Context createPackageContext(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.lang.String[] databaseList();
- method public boolean deleteDatabase(java.lang.String);
- method public boolean deleteFile(java.lang.String);
- method public boolean deleteSharedPreferences(java.lang.String);
- method public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- method public void enforceCallingPermission(java.lang.String, java.lang.String);
- method public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- method public void enforcePermission(java.lang.String, int, int, java.lang.String);
- method public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- method public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- method public java.lang.String[] fileList();
+ method public android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public String[] databaseList();
+ method public boolean deleteDatabase(String);
+ method public boolean deleteFile(String);
+ method public boolean deleteSharedPreferences(String);
+ method public void enforceCallingOrSelfPermission(String, String);
+ method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
+ method public void enforceCallingPermission(String, String);
+ method public void enforceCallingUriPermission(android.net.Uri, int, String);
+ method public void enforcePermission(String, int, int, String);
+ method public void enforceUriPermission(android.net.Uri, int, int, int, String);
+ method public void enforceUriPermission(android.net.Uri, String, String, int, int, int, String);
+ method public String[] fileList();
method public android.content.Context getApplicationContext();
method public android.content.pm.ApplicationInfo getApplicationInfo();
method public android.content.res.AssetManager getAssets();
method public android.content.Context getBaseContext();
method public java.io.File getCacheDir();
- method public java.lang.ClassLoader getClassLoader();
+ method public ClassLoader getClassLoader();
method public java.io.File getCodeCacheDir();
method public android.content.ContentResolver getContentResolver();
method public java.io.File getDataDir();
- method public java.io.File getDatabasePath(java.lang.String);
- method public java.io.File getDir(java.lang.String, int);
+ method public java.io.File getDatabasePath(String);
+ method public java.io.File getDir(String, int);
method public java.io.File getExternalCacheDir();
method public java.io.File[] getExternalCacheDirs();
- method public java.io.File getExternalFilesDir(java.lang.String);
- method public java.io.File[] getExternalFilesDirs(java.lang.String);
+ method public java.io.File getExternalFilesDir(String);
+ method public java.io.File[] getExternalFilesDirs(String);
method public java.io.File[] getExternalMediaDirs();
- method public java.io.File getFileStreamPath(java.lang.String);
+ method public java.io.File getFileStreamPath(String);
method public java.io.File getFilesDir();
method public android.os.Looper getMainLooper();
method public java.io.File getNoBackupFilesDir();
method public java.io.File getObbDir();
method public java.io.File[] getObbDirs();
- method public java.lang.String getOpPackageName();
- method public java.lang.String getPackageCodePath();
+ method public String getOpPackageName();
+ method public String getPackageCodePath();
method public android.content.pm.PackageManager getPackageManager();
- method public java.lang.String getPackageName();
- method public java.lang.String getPackageResourcePath();
+ method public String getPackageName();
+ method public String getPackageResourcePath();
method public android.content.res.Resources getResources();
- method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- method public java.lang.Object getSystemService(java.lang.String);
- method public java.lang.String getSystemServiceName(java.lang.Class<?>);
+ method public android.content.SharedPreferences getSharedPreferences(String, int);
+ method public Object getSystemService(String);
+ method public String getSystemServiceName(Class<?>);
method public android.content.res.Resources.Theme getTheme();
- method public deprecated android.graphics.drawable.Drawable getWallpaper();
- method public deprecated int getWallpaperDesiredMinimumHeight();
- method public deprecated int getWallpaperDesiredMinimumWidth();
- method public void grantUriPermission(java.lang.String, android.net.Uri, int);
+ method @Deprecated public android.graphics.drawable.Drawable getWallpaper();
+ method @Deprecated public int getWallpaperDesiredMinimumHeight();
+ method @Deprecated public int getWallpaperDesiredMinimumWidth();
+ method public void grantUriPermission(String, android.net.Uri, int);
method public boolean isDeviceProtectedStorage();
- method public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- method public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- method public java.io.FileInputStream openFileInput(java.lang.String) throws java.io.FileNotFoundException;
- method public java.io.FileOutputStream openFileOutput(java.lang.String, int) throws java.io.FileNotFoundException;
- method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
- method public deprecated android.graphics.drawable.Drawable peekWallpaper();
+ method public boolean moveDatabaseFrom(android.content.Context, String);
+ method public boolean moveSharedPreferencesFrom(android.content.Context, String);
+ method public java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
+ method public java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
+ method @Deprecated public android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
- method public deprecated void removeStickyBroadcast(android.content.Intent);
- method public deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler, int);
+ method @Deprecated public void removeStickyBroadcast(android.content.Intent);
+ method @Deprecated public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
- method public void revokeUriPermission(java.lang.String, android.net.Uri, int);
+ method public void revokeUriPermission(String, android.net.Uri, int);
method public void sendBroadcast(android.content.Intent);
- method public void sendBroadcast(android.content.Intent, java.lang.String);
+ method public void sendBroadcast(android.content.Intent, String);
method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public deprecated void sendStickyBroadcast(android.content.Intent);
- method public deprecated void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public deprecated void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public deprecated void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, String);
+ method public void sendOrderedBroadcast(android.content.Intent, String);
+ method public void sendOrderedBroadcast(android.content.Intent, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
+ method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
+ method @Deprecated public void sendStickyBroadcast(android.content.Intent);
+ method @Deprecated public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method @Deprecated public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
+ method @Deprecated public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
method public void setTheme(int);
- method public deprecated void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
- method public deprecated void setWallpaper(java.io.InputStream) throws java.io.IOException;
+ method @Deprecated public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
+ method @Deprecated public void setWallpaper(java.io.InputStream) throws java.io.IOException;
method public void startActivities(android.content.Intent[]);
method public void startActivities(android.content.Intent[], android.os.Bundle);
method public void startActivity(android.content.Intent);
method public void startActivity(android.content.Intent, android.os.Bundle);
method public android.content.ComponentName startForegroundService(android.content.Intent);
- method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
+ method public boolean startInstrumentation(android.content.ComponentName, String, android.os.Bundle);
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public android.content.ComponentName startService(android.content.Intent);
@@ -9909,57 +9948,57 @@ package android.content {
method public void updateServiceGroup(android.content.ServiceConnection, int, int);
}
- public deprecated class CursorLoader extends android.content.AsyncTaskLoader {
- ctor public CursorLoader(android.content.Context);
- ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public void deliverResult(android.database.Cursor);
- method public java.lang.String[] getProjection();
- method public java.lang.String getSelection();
- method public java.lang.String[] getSelectionArgs();
- method public java.lang.String getSortOrder();
- method public android.net.Uri getUri();
- method public android.database.Cursor loadInBackground();
- method public void onCanceled(android.database.Cursor);
- method public void setProjection(java.lang.String[]);
- method public void setSelection(java.lang.String);
- method public void setSelectionArgs(java.lang.String[]);
- method public void setSortOrder(java.lang.String);
- method public void setUri(android.net.Uri);
- }
-
- public abstract interface DialogInterface {
- method public abstract void cancel();
- method public abstract void dismiss();
- field public static final deprecated int BUTTON1 = -1; // 0xffffffff
- field public static final deprecated int BUTTON2 = -2; // 0xfffffffe
- field public static final deprecated int BUTTON3 = -3; // 0xfffffffd
+ @Deprecated public class CursorLoader extends android.content.AsyncTaskLoader<android.database.Cursor> {
+ ctor @Deprecated public CursorLoader(android.content.Context);
+ ctor @Deprecated public CursorLoader(android.content.Context, android.net.Uri, String[], String, String[], String);
+ method @Deprecated public void deliverResult(android.database.Cursor);
+ method @Deprecated public String[] getProjection();
+ method @Deprecated public String getSelection();
+ method @Deprecated public String[] getSelectionArgs();
+ method @Deprecated public String getSortOrder();
+ method @Deprecated public android.net.Uri getUri();
+ method @Deprecated public android.database.Cursor loadInBackground();
+ method @Deprecated public void onCanceled(android.database.Cursor);
+ method @Deprecated public void setProjection(String[]);
+ method @Deprecated public void setSelection(String);
+ method @Deprecated public void setSelectionArgs(String[]);
+ method @Deprecated public void setSortOrder(String);
+ method @Deprecated public void setUri(android.net.Uri);
+ }
+
+ public interface DialogInterface {
+ method public void cancel();
+ method public void dismiss();
+ field @Deprecated public static final int BUTTON1 = -1; // 0xffffffff
+ field @Deprecated public static final int BUTTON2 = -2; // 0xfffffffe
+ field @Deprecated public static final int BUTTON3 = -3; // 0xfffffffd
field public static final int BUTTON_NEGATIVE = -2; // 0xfffffffe
field public static final int BUTTON_NEUTRAL = -3; // 0xfffffffd
field public static final int BUTTON_POSITIVE = -1; // 0xffffffff
}
- public static abstract interface DialogInterface.OnCancelListener {
- method public abstract void onCancel(android.content.DialogInterface);
+ public static interface DialogInterface.OnCancelListener {
+ method public void onCancel(android.content.DialogInterface);
}
- public static abstract interface DialogInterface.OnClickListener {
- method public abstract void onClick(android.content.DialogInterface, int);
+ public static interface DialogInterface.OnClickListener {
+ method public void onClick(android.content.DialogInterface, int);
}
- public static abstract interface DialogInterface.OnDismissListener {
- method public abstract void onDismiss(android.content.DialogInterface);
+ public static interface DialogInterface.OnDismissListener {
+ method public void onDismiss(android.content.DialogInterface);
}
- public static abstract interface DialogInterface.OnKeyListener {
- method public abstract boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);
+ public static interface DialogInterface.OnKeyListener {
+ method public boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);
}
- public static abstract interface DialogInterface.OnMultiChoiceClickListener {
- method public abstract void onClick(android.content.DialogInterface, int, boolean);
+ public static interface DialogInterface.OnMultiChoiceClickListener {
+ method public void onClick(android.content.DialogInterface, int, boolean);
}
- public static abstract interface DialogInterface.OnShowListener {
- method public abstract void onShow(android.content.DialogInterface);
+ public static interface DialogInterface.OnShowListener {
+ method public void onShow(android.content.DialogInterface);
}
public final class Entity {
@@ -9975,383 +10014,386 @@ package android.content {
field public final android.content.ContentValues values;
}
- public abstract interface EntityIterator implements java.util.Iterator {
- method public abstract void close();
- method public abstract void reset();
+ public interface EntityIterator extends java.util.Iterator<android.content.Entity> {
+ method public void close();
+ method public void reset();
}
public class Intent implements java.lang.Cloneable android.os.Parcelable {
ctor public Intent();
ctor public Intent(android.content.Intent);
- ctor public Intent(java.lang.String);
- ctor public Intent(java.lang.String, android.net.Uri);
- ctor public Intent(android.content.Context, java.lang.Class<?>);
- ctor public Intent(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class<?>);
- method public android.content.Intent addCategory(java.lang.String);
- method public android.content.Intent addFlags(int);
- method public java.lang.Object clone();
- method public android.content.Intent cloneFilter();
- method public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
- method public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
+ ctor public Intent(String);
+ ctor public Intent(String, android.net.Uri);
+ ctor public Intent(android.content.Context, Class<?>);
+ ctor public Intent(String, android.net.Uri, android.content.Context, Class<?>);
+ method @NonNull public android.content.Intent addCategory(String);
+ method @NonNull public android.content.Intent addFlags(int);
+ method public Object clone();
+ method @NonNull public android.content.Intent cloneFilter();
+ method public static android.content.Intent createChooser(android.content.Intent, CharSequence);
+ method public static android.content.Intent createChooser(android.content.Intent, CharSequence, android.content.IntentSender);
method public int describeContents();
- method public int fillIn(android.content.Intent, int);
+ method public int fillIn(@NonNull android.content.Intent, int);
method public boolean filterEquals(android.content.Intent);
method public int filterHashCode();
- method public java.lang.String getAction();
- method public boolean[] getBooleanArrayExtra(java.lang.String);
- method public boolean getBooleanExtra(java.lang.String, boolean);
- method public android.os.Bundle getBundleExtra(java.lang.String);
- method public byte[] getByteArrayExtra(java.lang.String);
- method public byte getByteExtra(java.lang.String, byte);
+ method @Nullable public String getAction();
+ method @Nullable public boolean[] getBooleanArrayExtra(String);
+ method public boolean getBooleanExtra(String, boolean);
+ method @Nullable public android.os.Bundle getBundleExtra(String);
+ method @Nullable public byte[] getByteArrayExtra(String);
+ method public byte getByteExtra(String, byte);
method public java.util.Set<java.lang.String> getCategories();
- method public char[] getCharArrayExtra(java.lang.String);
- method public char getCharExtra(java.lang.String, char);
- method public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
- method public java.util.ArrayList<java.lang.CharSequence> getCharSequenceArrayListExtra(java.lang.String);
- method public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
- method public android.content.ClipData getClipData();
- method public android.content.ComponentName getComponent();
- method public android.net.Uri getData();
- method public java.lang.String getDataString();
- method public double[] getDoubleArrayExtra(java.lang.String);
- method public double getDoubleExtra(java.lang.String, double);
- method public android.os.Bundle getExtras();
+ method @Nullable public char[] getCharArrayExtra(String);
+ method public char getCharExtra(String, char);
+ method @Nullable public CharSequence[] getCharSequenceArrayExtra(String);
+ method @Nullable public java.util.ArrayList<java.lang.CharSequence> getCharSequenceArrayListExtra(String);
+ method @Nullable public CharSequence getCharSequenceExtra(String);
+ method @Nullable public android.content.ClipData getClipData();
+ method @Nullable public android.content.ComponentName getComponent();
+ method @Nullable public android.net.Uri getData();
+ method @Nullable public String getDataString();
+ method @Nullable public double[] getDoubleArrayExtra(String);
+ method public double getDoubleExtra(String, double);
+ method @Nullable public android.os.Bundle getExtras();
method public int getFlags();
- method public float[] getFloatArrayExtra(java.lang.String);
- method public float getFloatExtra(java.lang.String, float);
- method public int[] getIntArrayExtra(java.lang.String);
- method public int getIntExtra(java.lang.String, int);
- method public java.util.ArrayList<java.lang.Integer> getIntegerArrayListExtra(java.lang.String);
- method public static deprecated android.content.Intent getIntent(java.lang.String) throws java.net.URISyntaxException;
- method public static android.content.Intent getIntentOld(java.lang.String) throws java.net.URISyntaxException;
- method public long[] getLongArrayExtra(java.lang.String);
- method public long getLongExtra(java.lang.String, long);
- method public java.lang.String getPackage();
- method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
- method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
- method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String);
- method public java.lang.String getScheme();
- method public android.content.Intent getSelector();
- method public java.io.Serializable getSerializableExtra(java.lang.String);
- method public short[] getShortArrayExtra(java.lang.String);
- method public short getShortExtra(java.lang.String, short);
- method public android.graphics.Rect getSourceBounds();
- method public java.lang.String[] getStringArrayExtra(java.lang.String);
- method public java.util.ArrayList<java.lang.String> getStringArrayListExtra(java.lang.String);
- method public java.lang.String getStringExtra(java.lang.String);
- method public java.lang.String getType();
- method public boolean hasCategory(java.lang.String);
- method public boolean hasExtra(java.lang.String);
+ method @Nullable public float[] getFloatArrayExtra(String);
+ method public float getFloatExtra(String, float);
+ method @Nullable public int[] getIntArrayExtra(String);
+ method public int getIntExtra(String, int);
+ method @Nullable public java.util.ArrayList<java.lang.Integer> getIntegerArrayListExtra(String);
+ method @Deprecated public static android.content.Intent getIntent(String) throws java.net.URISyntaxException;
+ method public static android.content.Intent getIntentOld(String) throws java.net.URISyntaxException;
+ method @Nullable public long[] getLongArrayExtra(String);
+ method public long getLongExtra(String, long);
+ method @Nullable public String getPackage();
+ method @Nullable public android.os.Parcelable[] getParcelableArrayExtra(String);
+ method @Nullable public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(String);
+ method @Nullable public <T extends android.os.Parcelable> T getParcelableExtra(String);
+ method @Nullable public String getScheme();
+ method @Nullable public android.content.Intent getSelector();
+ method @Nullable public java.io.Serializable getSerializableExtra(String);
+ method @Nullable public short[] getShortArrayExtra(String);
+ method public short getShortExtra(String, short);
+ method @Nullable public android.graphics.Rect getSourceBounds();
+ method @Nullable public String[] getStringArrayExtra(String);
+ method @Nullable public java.util.ArrayList<java.lang.String> getStringArrayListExtra(String);
+ method @Nullable public String getStringExtra(String);
+ method @Nullable public String getType();
+ method public boolean hasCategory(String);
+ method public boolean hasExtra(String);
method public boolean hasFileDescriptors();
method public static android.content.Intent makeMainActivity(android.content.ComponentName);
- method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+ method public static android.content.Intent makeMainSelectorActivity(String, String);
method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
- method public static java.lang.String normalizeMimeType(java.lang.String);
- method public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static android.content.Intent parseUri(java.lang.String, int) throws java.net.URISyntaxException;
- method public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList<java.lang.CharSequence>);
- method public android.content.Intent putExtra(java.lang.String, boolean);
- method public android.content.Intent putExtra(java.lang.String, byte);
- method public android.content.Intent putExtra(java.lang.String, char);
- method public android.content.Intent putExtra(java.lang.String, short);
- method public android.content.Intent putExtra(java.lang.String, int);
- method public android.content.Intent putExtra(java.lang.String, long);
- method public android.content.Intent putExtra(java.lang.String, float);
- method public android.content.Intent putExtra(java.lang.String, double);
- method public android.content.Intent putExtra(java.lang.String, java.lang.String);
- method public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence);
- method public android.content.Intent putExtra(java.lang.String, android.os.Parcelable);
- method public android.content.Intent putExtra(java.lang.String, android.os.Parcelable[]);
- method public android.content.Intent putExtra(java.lang.String, java.io.Serializable);
- method public android.content.Intent putExtra(java.lang.String, boolean[]);
- method public android.content.Intent putExtra(java.lang.String, byte[]);
- method public android.content.Intent putExtra(java.lang.String, short[]);
- method public android.content.Intent putExtra(java.lang.String, char[]);
- method public android.content.Intent putExtra(java.lang.String, int[]);
- method public android.content.Intent putExtra(java.lang.String, long[]);
- method public android.content.Intent putExtra(java.lang.String, float[]);
- method public android.content.Intent putExtra(java.lang.String, double[]);
- method public android.content.Intent putExtra(java.lang.String, java.lang.String[]);
- method public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence[]);
- method public android.content.Intent putExtra(java.lang.String, android.os.Bundle);
- method public android.content.Intent putExtras(android.content.Intent);
- method public android.content.Intent putExtras(android.os.Bundle);
- method public android.content.Intent putIntegerArrayListExtra(java.lang.String, java.util.ArrayList<java.lang.Integer>);
- method public android.content.Intent putParcelableArrayListExtra(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>);
- method public android.content.Intent putStringArrayListExtra(java.lang.String, java.util.ArrayList<java.lang.String>);
+ method @Nullable public static String normalizeMimeType(@Nullable String);
+ method @NonNull public static android.content.Intent parseIntent(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static android.content.Intent parseUri(String, int) throws java.net.URISyntaxException;
+ method @NonNull public android.content.Intent putCharSequenceArrayListExtra(String, @Nullable java.util.ArrayList<java.lang.CharSequence>);
+ method @NonNull public android.content.Intent putExtra(String, boolean);
+ method @NonNull public android.content.Intent putExtra(String, byte);
+ method @NonNull public android.content.Intent putExtra(String, char);
+ method @NonNull public android.content.Intent putExtra(String, short);
+ method @NonNull public android.content.Intent putExtra(String, int);
+ method @NonNull public android.content.Intent putExtra(String, long);
+ method @NonNull public android.content.Intent putExtra(String, float);
+ method @NonNull public android.content.Intent putExtra(String, double);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable String);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable CharSequence);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable android.os.Parcelable);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable android.os.Parcelable[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable java.io.Serializable);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable boolean[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable byte[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable short[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable char[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable int[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable long[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable float[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable double[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable String[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable CharSequence[]);
+ method @NonNull public android.content.Intent putExtra(String, @Nullable android.os.Bundle);
+ method @NonNull public android.content.Intent putExtras(@NonNull android.content.Intent);
+ method @NonNull public android.content.Intent putExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.content.Intent putIntegerArrayListExtra(String, @Nullable java.util.ArrayList<java.lang.Integer>);
+ method @NonNull public android.content.Intent putParcelableArrayListExtra(String, @Nullable java.util.ArrayList<? extends android.os.Parcelable>);
+ method @NonNull public android.content.Intent putStringArrayListExtra(String, @Nullable java.util.ArrayList<java.lang.String>);
method public void readFromParcel(android.os.Parcel);
- method public void removeCategory(java.lang.String);
- method public void removeExtra(java.lang.String);
+ method public void removeCategory(String);
+ method public void removeExtra(String);
method public void removeFlags(int);
- method public android.content.Intent replaceExtras(android.content.Intent);
- method public android.content.Intent replaceExtras(android.os.Bundle);
- method public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
- method public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
- method public java.lang.String resolveType(android.content.Context);
- method public java.lang.String resolveType(android.content.ContentResolver);
- method public java.lang.String resolveTypeIfNeeded(android.content.ContentResolver);
- method public android.content.Intent setAction(java.lang.String);
- method public android.content.Intent setClass(android.content.Context, java.lang.Class<?>);
- method public android.content.Intent setClassName(android.content.Context, java.lang.String);
- method public android.content.Intent setClassName(java.lang.String, java.lang.String);
- method public void setClipData(android.content.ClipData);
- method public android.content.Intent setComponent(android.content.ComponentName);
- method public android.content.Intent setData(android.net.Uri);
- method public android.content.Intent setDataAndNormalize(android.net.Uri);
- method public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
- method public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
- method public void setExtrasClassLoader(java.lang.ClassLoader);
- method public android.content.Intent setFlags(int);
- method public android.content.Intent setPackage(java.lang.String);
- method public void setSelector(android.content.Intent);
- method public void setSourceBounds(android.graphics.Rect);
- method public android.content.Intent setType(java.lang.String);
- method public android.content.Intent setTypeAndNormalize(java.lang.String);
- method public deprecated java.lang.String toURI();
- method public java.lang.String toUri(int);
+ method @NonNull public android.content.Intent replaceExtras(@NonNull android.content.Intent);
+ method @NonNull public android.content.Intent replaceExtras(@Nullable android.os.Bundle);
+ method public android.content.ComponentName resolveActivity(@NonNull android.content.pm.PackageManager);
+ method public android.content.pm.ActivityInfo resolveActivityInfo(@NonNull android.content.pm.PackageManager, int);
+ method @Nullable public String resolveType(@NonNull android.content.Context);
+ method @Nullable public String resolveType(@NonNull android.content.ContentResolver);
+ method @Nullable public String resolveTypeIfNeeded(@NonNull android.content.ContentResolver);
+ method @NonNull public android.content.Intent setAction(@Nullable String);
+ method @NonNull public android.content.Intent setClass(@NonNull android.content.Context, @NonNull Class<?>);
+ method @NonNull public android.content.Intent setClassName(@NonNull android.content.Context, @NonNull String);
+ method @NonNull public android.content.Intent setClassName(@NonNull String, @NonNull String);
+ method public void setClipData(@Nullable android.content.ClipData);
+ method @NonNull public android.content.Intent setComponent(@Nullable android.content.ComponentName);
+ method @NonNull public android.content.Intent setData(@Nullable android.net.Uri);
+ method @NonNull public android.content.Intent setDataAndNormalize(@NonNull android.net.Uri);
+ method @NonNull public android.content.Intent setDataAndType(@Nullable android.net.Uri, @Nullable String);
+ method @NonNull public android.content.Intent setDataAndTypeAndNormalize(@NonNull android.net.Uri, @Nullable String);
+ method public void setExtrasClassLoader(@Nullable ClassLoader);
+ method @NonNull public android.content.Intent setFlags(int);
+ method @NonNull public android.content.Intent setPackage(@Nullable String);
+ method public void setSelector(@Nullable android.content.Intent);
+ method public void setSourceBounds(@Nullable android.graphics.Rect);
+ method @NonNull public android.content.Intent setType(@Nullable String);
+ method @NonNull public android.content.Intent setTypeAndNormalize(@Nullable String);
+ method @Deprecated public String toURI();
+ method public String toUri(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
- field public static final java.lang.String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
- field public static final java.lang.String ACTION_ANSWER = "android.intent.action.ANSWER";
- field public static final java.lang.String ACTION_APPLICATION_PREFERENCES = "android.intent.action.APPLICATION_PREFERENCES";
- field public static final java.lang.String ACTION_APPLICATION_RESTRICTIONS_CHANGED = "android.intent.action.APPLICATION_RESTRICTIONS_CHANGED";
- field public static final java.lang.String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
- field public static final java.lang.String ACTION_ASSIST = "android.intent.action.ASSIST";
- field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
- field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
- field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
- field public static final java.lang.String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
- field public static final java.lang.String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
- field public static final java.lang.String ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT";
- field public static final java.lang.String ACTION_CALL = "android.intent.action.CALL";
- field public static final java.lang.String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
- field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
- field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
- field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
- field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
- field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
- field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
- field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
- field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
- field public static final java.lang.String ACTION_DEFINE = "android.intent.action.DEFINE";
- field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
- field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
- field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
- field public static final java.lang.String ACTION_DIAL = "android.intent.action.DIAL";
- field public static final java.lang.String ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
- field public static final java.lang.String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
- field public static final java.lang.String ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED";
- field public static final java.lang.String ACTION_EDIT = "android.intent.action.EDIT";
- field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
- field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
- field public static final java.lang.String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
- field public static final java.lang.String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
- field public static final java.lang.String ACTION_GET_RESTRICTION_ENTRIES = "android.intent.action.GET_RESTRICTION_ENTRIES";
- field public static final java.lang.String ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED";
- field public static final java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED";
- field public static final java.lang.String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
- field public static final java.lang.String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED";
- field public static final java.lang.String ACTION_INSERT = "android.intent.action.INSERT";
- field public static final java.lang.String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
- field public static final java.lang.String ACTION_INSTALL_FAILURE = "android.intent.action.INSTALL_FAILURE";
- field public static final deprecated java.lang.String ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE";
- field public static final java.lang.String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
- field public static final java.lang.String ACTION_LOCKED_BOOT_COMPLETED = "android.intent.action.LOCKED_BOOT_COMPLETED";
- field public static final java.lang.String ACTION_MAIN = "android.intent.action.MAIN";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_ADDED = "android.intent.action.MANAGED_PROFILE_ADDED";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_AVAILABLE = "android.intent.action.MANAGED_PROFILE_AVAILABLE";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_REMOVED = "android.intent.action.MANAGED_PROFILE_REMOVED";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_UNAVAILABLE = "android.intent.action.MANAGED_PROFILE_UNAVAILABLE";
- field public static final java.lang.String ACTION_MANAGED_PROFILE_UNLOCKED = "android.intent.action.MANAGED_PROFILE_UNLOCKED";
- field public static final java.lang.String ACTION_MANAGE_NETWORK_USAGE = "android.intent.action.MANAGE_NETWORK_USAGE";
- field public static final java.lang.String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
- field public static final java.lang.String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
- field public static final java.lang.String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
- field public static final java.lang.String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
- field public static final java.lang.String ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
- field public static final java.lang.String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
- field public static final java.lang.String ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
- field public static final java.lang.String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
- field public static final java.lang.String ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED";
- field public static final java.lang.String ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE";
- field public static final java.lang.String ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
- field public static final java.lang.String ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
- field public static final java.lang.String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
- field public static final java.lang.String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
- field public static final java.lang.String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
- field public static final java.lang.String ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED";
- field public static final java.lang.String ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED";
- field public static final java.lang.String ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
- field public static final java.lang.String ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT";
- field public static final java.lang.String ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE";
- field public static final java.lang.String ACTION_PACKAGES_SUSPENDED = "android.intent.action.PACKAGES_SUSPENDED";
- field public static final java.lang.String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
- field public static final java.lang.String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
- field public static final java.lang.String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
- field public static final java.lang.String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
- field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
- field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
- field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
- field public static final java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
- field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
- field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
- field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
- field public static final java.lang.String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
- field public static final java.lang.String ACTION_PASTE = "android.intent.action.PASTE";
- field public static final java.lang.String ACTION_PICK = "android.intent.action.PICK";
- field public static final java.lang.String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
- field public static final java.lang.String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
- field public static final java.lang.String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
- field public static final java.lang.String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
- field public static final java.lang.String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT";
- field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
- field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK";
- field public static final java.lang.String ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW";
- field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT";
- field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN";
- field public static final java.lang.String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
- field public static final java.lang.String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
- field public static final java.lang.String ACTION_SEARCH = "android.intent.action.SEARCH";
- field public static final java.lang.String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
- field public static final java.lang.String ACTION_SEND = "android.intent.action.SEND";
- field public static final java.lang.String ACTION_SENDTO = "android.intent.action.SENDTO";
- field public static final java.lang.String ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE";
- field public static final java.lang.String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
- field public static final java.lang.String ACTION_SHOW_APP_INFO = "android.intent.action.SHOW_APP_INFO";
- field public static final java.lang.String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
- field public static final java.lang.String ACTION_SYNC = "android.intent.action.SYNC";
- field public static final java.lang.String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
- field public static final java.lang.String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
- field public static final java.lang.String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
- field public static final java.lang.String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
- field public static final java.lang.String ACTION_TRANSLATE = "android.intent.action.TRANSLATE";
- field public static final java.lang.String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
- field public static final deprecated java.lang.String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
- field public static final deprecated java.lang.String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
- field public static final deprecated java.lang.String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
- field public static final java.lang.String ACTION_USER_BACKGROUND = "android.intent.action.USER_BACKGROUND";
- field public static final java.lang.String ACTION_USER_FOREGROUND = "android.intent.action.USER_FOREGROUND";
- field public static final java.lang.String ACTION_USER_INITIALIZE = "android.intent.action.USER_INITIALIZE";
- field public static final java.lang.String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
- field public static final java.lang.String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
- field public static final java.lang.String ACTION_VIEW = "android.intent.action.VIEW";
- field public static final java.lang.String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
- field public static final deprecated java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
- field public static final java.lang.String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
- field public static final java.lang.String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
- field public static final java.lang.String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER";
- field public static final java.lang.String CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR";
- field public static final java.lang.String CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR";
- field public static final java.lang.String CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS";
- field public static final java.lang.String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL";
- field public static final java.lang.String CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY";
- field public static final java.lang.String CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS";
- field public static final java.lang.String CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET";
- field public static final java.lang.String CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING";
- field public static final java.lang.String CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC";
- field public static final java.lang.String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
- field public static final java.lang.String CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK";
- field public static final java.lang.String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE";
- field public static final java.lang.String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
- field public static final java.lang.String CATEGORY_DESK_DOCK = "android.intent.category.DESK_DOCK";
- field public static final java.lang.String CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE";
- field public static final java.lang.String CATEGORY_EMBED = "android.intent.category.EMBED";
- field public static final java.lang.String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST = "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST";
- field public static final java.lang.String CATEGORY_HE_DESK_DOCK = "android.intent.category.HE_DESK_DOCK";
- field public static final java.lang.String CATEGORY_HOME = "android.intent.category.HOME";
- field public static final java.lang.String CATEGORY_INFO = "android.intent.category.INFO";
- field public static final java.lang.String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";
- field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
- field public static final java.lang.String CATEGORY_LE_DESK_DOCK = "android.intent.category.LE_DESK_DOCK";
- field public static final java.lang.String CATEGORY_MONKEY = "android.intent.category.MONKEY";
- field public static final java.lang.String CATEGORY_OPENABLE = "android.intent.category.OPENABLE";
- field public static final java.lang.String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
- field public static final java.lang.String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";
- field public static final java.lang.String CATEGORY_SECONDARY_HOME = "android.intent.category.SECONDARY_HOME";
- field public static final java.lang.String CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE";
- field public static final java.lang.String CATEGORY_TAB = "android.intent.category.TAB";
- field public static final java.lang.String CATEGORY_TEST = "android.intent.category.TEST";
- field public static final java.lang.String CATEGORY_TYPED_OPENABLE = "android.intent.category.TYPED_OPENABLE";
- field public static final java.lang.String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
- field public static final java.lang.String CATEGORY_VOICE = "android.intent.category.VOICE";
- field public static final java.lang.String CATEGORY_VR_HOME = "android.intent.category.VR_HOME";
+ field public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
+ field public static final String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
+ field public static final String ACTION_ANSWER = "android.intent.action.ANSWER";
+ field public static final String ACTION_APPLICATION_PREFERENCES = "android.intent.action.APPLICATION_PREFERENCES";
+ field public static final String ACTION_APPLICATION_RESTRICTIONS_CHANGED = "android.intent.action.APPLICATION_RESTRICTIONS_CHANGED";
+ field public static final String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
+ field public static final String ACTION_ASSIST = "android.intent.action.ASSIST";
+ field public static final String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
+ field public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
+ field public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
+ field public static final String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
+ field public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
+ field public static final String ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT";
+ field public static final String ACTION_CALL = "android.intent.action.CALL";
+ field public static final String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
+ field public static final String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
+ field public static final String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
+ field public static final String ACTION_CHOOSER = "android.intent.action.CHOOSER";
+ field public static final String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
+ field public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
+ field public static final String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
+ field public static final String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
+ field public static final String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
+ field public static final String ACTION_DEFAULT = "android.intent.action.VIEW";
+ field public static final String ACTION_DEFINE = "android.intent.action.DEFINE";
+ field public static final String ACTION_DELETE = "android.intent.action.DELETE";
+ field @Deprecated public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
+ field @Deprecated public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
+ field public static final String ACTION_DIAL = "android.intent.action.DIAL";
+ field public static final String ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
+ field public static final String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
+ field public static final String ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED";
+ field public static final String ACTION_EDIT = "android.intent.action.EDIT";
+ field public static final String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
+ field public static final String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
+ field public static final String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
+ field public static final String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
+ field public static final String ACTION_GET_RESTRICTION_ENTRIES = "android.intent.action.GET_RESTRICTION_ENTRIES";
+ field public static final String ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED";
+ field public static final String ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED";
+ field public static final String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
+ field public static final String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED";
+ field public static final String ACTION_INSERT = "android.intent.action.INSERT";
+ field public static final String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
+ field public static final String ACTION_INSTALL_FAILURE = "android.intent.action.INSTALL_FAILURE";
+ field @Deprecated public static final String ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE";
+ field public static final String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
+ field public static final String ACTION_LOCKED_BOOT_COMPLETED = "android.intent.action.LOCKED_BOOT_COMPLETED";
+ field public static final String ACTION_MAIN = "android.intent.action.MAIN";
+ field public static final String ACTION_MANAGED_PROFILE_ADDED = "android.intent.action.MANAGED_PROFILE_ADDED";
+ field public static final String ACTION_MANAGED_PROFILE_AVAILABLE = "android.intent.action.MANAGED_PROFILE_AVAILABLE";
+ field public static final String ACTION_MANAGED_PROFILE_REMOVED = "android.intent.action.MANAGED_PROFILE_REMOVED";
+ field public static final String ACTION_MANAGED_PROFILE_UNAVAILABLE = "android.intent.action.MANAGED_PROFILE_UNAVAILABLE";
+ field public static final String ACTION_MANAGED_PROFILE_UNLOCKED = "android.intent.action.MANAGED_PROFILE_UNLOCKED";
+ field public static final String ACTION_MANAGE_NETWORK_USAGE = "android.intent.action.MANAGE_NETWORK_USAGE";
+ field public static final String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
+ field public static final String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
+ field public static final String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
+ field public static final String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
+ field public static final String ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
+ field public static final String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
+ field public static final String ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
+ field public static final String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
+ field public static final String ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED";
+ field public static final String ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE";
+ field public static final String ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
+ field public static final String ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
+ field public static final String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
+ field public static final String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
+ field public static final String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
+ field public static final String ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED";
+ field public static final String ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED";
+ field public static final String ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
+ field public static final String ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT";
+ field public static final String ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE";
+ field public static final String ACTION_PACKAGES_SUSPENDED = "android.intent.action.PACKAGES_SUSPENDED";
+ field public static final String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
+ field public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
+ field public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
+ field public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
+ field public static final String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
+ field public static final String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
+ field @Deprecated public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
+ field public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
+ field public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
+ field public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
+ field public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
+ field public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
+ field public static final String ACTION_PASTE = "android.intent.action.PASTE";
+ field public static final String ACTION_PERMISSION_USAGE_DETAILS = "android.intent.action.PERMISSION_USAGE_DETAILS";
+ field public static final String ACTION_PICK = "android.intent.action.PICK";
+ field public static final String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
+ field public static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
+ field public static final String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
+ field public static final String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
+ field public static final String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT";
+ field public static final String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
+ field public static final String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK";
+ field public static final String ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW";
+ field public static final String ACTION_REBOOT = "android.intent.action.REBOOT";
+ field public static final String ACTION_RUN = "android.intent.action.RUN";
+ field public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
+ field public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
+ field public static final String ACTION_SEARCH = "android.intent.action.SEARCH";
+ field public static final String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
+ field public static final String ACTION_SEND = "android.intent.action.SEND";
+ field public static final String ACTION_SENDTO = "android.intent.action.SENDTO";
+ field public static final String ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE";
+ field public static final String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
+ field public static final String ACTION_SHOW_APP_INFO = "android.intent.action.SHOW_APP_INFO";
+ field public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
+ field public static final String ACTION_SYNC = "android.intent.action.SYNC";
+ field public static final String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
+ field public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
+ field public static final String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
+ field public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
+ field public static final String ACTION_TRANSLATE = "android.intent.action.TRANSLATE";
+ field public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
+ field @Deprecated public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
+ field @Deprecated public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
+ field @Deprecated public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
+ field public static final String ACTION_USER_BACKGROUND = "android.intent.action.USER_BACKGROUND";
+ field public static final String ACTION_USER_FOREGROUND = "android.intent.action.USER_FOREGROUND";
+ field public static final String ACTION_USER_INITIALIZE = "android.intent.action.USER_INITIALIZE";
+ field public static final String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
+ field public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
+ field public static final String ACTION_VIEW = "android.intent.action.VIEW";
+ field public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
+ field @Deprecated public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
+ field public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
+ field public static final String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
+ field public static final String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER";
+ field public static final String CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR";
+ field public static final String CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR";
+ field public static final String CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS";
+ field public static final String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL";
+ field public static final String CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY";
+ field public static final String CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS";
+ field public static final String CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET";
+ field public static final String CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING";
+ field public static final String CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC";
+ field public static final String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
+ field public static final String CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK";
+ field public static final String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE";
+ field public static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
+ field public static final String CATEGORY_DESK_DOCK = "android.intent.category.DESK_DOCK";
+ field public static final String CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE";
+ field public static final String CATEGORY_EMBED = "android.intent.category.EMBED";
+ field public static final String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST = "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST";
+ field public static final String CATEGORY_HE_DESK_DOCK = "android.intent.category.HE_DESK_DOCK";
+ field public static final String CATEGORY_HOME = "android.intent.category.HOME";
+ field public static final String CATEGORY_INFO = "android.intent.category.INFO";
+ field public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";
+ field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+ field public static final String CATEGORY_LE_DESK_DOCK = "android.intent.category.LE_DESK_DOCK";
+ field public static final String CATEGORY_MONKEY = "android.intent.category.MONKEY";
+ field public static final String CATEGORY_OPENABLE = "android.intent.category.OPENABLE";
+ field public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
+ field public static final String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";
+ field public static final String CATEGORY_SECONDARY_HOME = "android.intent.category.SECONDARY_HOME";
+ field public static final String CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE";
+ field public static final String CATEGORY_TAB = "android.intent.category.TAB";
+ field public static final String CATEGORY_TEST = "android.intent.category.TEST";
+ field public static final String CATEGORY_TYPED_OPENABLE = "android.intent.category.TYPED_OPENABLE";
+ field public static final String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
+ field public static final String CATEGORY_VOICE = "android.intent.category.VOICE";
+ field public static final String CATEGORY_VR_HOME = "android.intent.category.VR_HOME";
field public static final android.os.Parcelable.Creator<android.content.Intent> CREATOR;
- field public static final java.lang.String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
- field public static final java.lang.String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE";
- field public static final deprecated java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
- field public static final java.lang.String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS";
- field public static final java.lang.String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT";
- field public static final java.lang.String EXTRA_ASSIST_INPUT_DEVICE_ID = "android.intent.extra.ASSIST_INPUT_DEVICE_ID";
- field public static final java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
- field public static final java.lang.String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
- field public static final java.lang.String EXTRA_ASSIST_UID = "android.intent.extra.ASSIST_UID";
- field public static final java.lang.String EXTRA_AUTO_LAUNCH_SINGLE_CHOICE = "android.intent.extra.AUTO_LAUNCH_SINGLE_CHOICE";
- field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
- field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
- field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
- field public static final deprecated java.lang.String EXTRA_CHANGED_COMPONENT_NAME = "android.intent.extra.changed_component_name";
- field public static final java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST = "android.intent.extra.changed_component_name_list";
- field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
- field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
- field public static final java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER";
- field public static final java.lang.String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS";
- field public static final java.lang.String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
- field public static final java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
- field public static final java.lang.String EXTRA_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
- field public static final java.lang.String EXTRA_CONTENT_ANNOTATIONS = "android.intent.extra.CONTENT_ANNOTATIONS";
- field public static final java.lang.String EXTRA_CONTENT_QUERY = "android.intent.extra.CONTENT_QUERY";
- field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
- field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
+ field public static final String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
+ field public static final String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE";
+ field @Deprecated public static final String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
+ field public static final String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS";
+ field public static final String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT";
+ field public static final String EXTRA_ASSIST_INPUT_DEVICE_ID = "android.intent.extra.ASSIST_INPUT_DEVICE_ID";
+ field public static final String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
+ field public static final String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
+ field public static final String EXTRA_ASSIST_UID = "android.intent.extra.ASSIST_UID";
+ field public static final String EXTRA_AUTO_LAUNCH_SINGLE_CHOICE = "android.intent.extra.AUTO_LAUNCH_SINGLE_CHOICE";
+ field public static final String EXTRA_BCC = "android.intent.extra.BCC";
+ field public static final String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
+ field public static final String EXTRA_CC = "android.intent.extra.CC";
+ field @Deprecated public static final String EXTRA_CHANGED_COMPONENT_NAME = "android.intent.extra.changed_component_name";
+ field public static final String EXTRA_CHANGED_COMPONENT_NAME_LIST = "android.intent.extra.changed_component_name_list";
+ field public static final String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
+ field public static final String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
+ field public static final String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER";
+ field public static final String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS";
+ field public static final String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
+ field public static final String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
+ field public static final String EXTRA_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
+ field public static final String EXTRA_CONTENT_ANNOTATIONS = "android.intent.extra.CONTENT_ANNOTATIONS";
+ field public static final String EXTRA_CONTENT_QUERY = "android.intent.extra.CONTENT_QUERY";
+ field public static final String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
+ field public static final String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
field public static final int EXTRA_DOCK_STATE_CAR = 2; // 0x2
field public static final int EXTRA_DOCK_STATE_DESK = 1; // 0x1
field public static final int EXTRA_DOCK_STATE_HE_DESK = 4; // 0x4
field public static final int EXTRA_DOCK_STATE_LE_DESK = 3; // 0x3
field public static final int EXTRA_DOCK_STATE_UNDOCKED = 0; // 0x0
- field public static final java.lang.String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
- field public static final java.lang.String EXTRA_EMAIL = "android.intent.extra.EMAIL";
- field public static final java.lang.String EXTRA_EXCLUDE_COMPONENTS = "android.intent.extra.EXCLUDE_COMPONENTS";
- field public static final java.lang.String EXTRA_FROM_STORAGE = "android.intent.extra.FROM_STORAGE";
- field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
- field public static final java.lang.String EXTRA_INDEX = "android.intent.extra.INDEX";
- field public static final java.lang.String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
- field public static final java.lang.String EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME";
- field public static final java.lang.String EXTRA_INTENT = "android.intent.extra.INTENT";
- field public static final java.lang.String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
- field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
- field public static final java.lang.String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";
- field public static final java.lang.String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
- field public static final java.lang.String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME";
- field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
- field public static final java.lang.String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
- field public static final java.lang.String EXTRA_PROCESS_TEXT_READONLY = "android.intent.extra.PROCESS_TEXT_READONLY";
- field public static final java.lang.String EXTRA_QUICK_VIEW_FEATURES = "android.intent.extra.QUICK_VIEW_FEATURES";
- field public static final java.lang.String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
- field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
- field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
- field public static final java.lang.String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token";
- field public static final java.lang.String EXTRA_REPLACEMENT_EXTRAS = "android.intent.extra.REPLACEMENT_EXTRAS";
- field public static final java.lang.String EXTRA_REPLACING = "android.intent.extra.REPLACING";
- field public static final java.lang.String EXTRA_RESTRICTIONS_BUNDLE = "android.intent.extra.restrictions_bundle";
- field public static final java.lang.String EXTRA_RESTRICTIONS_INTENT = "android.intent.extra.restrictions_intent";
- field public static final java.lang.String EXTRA_RESTRICTIONS_LIST = "android.intent.extra.restrictions_list";
- field public static final java.lang.String EXTRA_RESULT_RECEIVER = "android.intent.extra.RESULT_RECEIVER";
- field public static final java.lang.String EXTRA_RETURN_RESULT = "android.intent.extra.RETURN_RESULT";
- field public static final deprecated java.lang.String EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON";
- field public static final deprecated java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE = "android.intent.extra.shortcut.ICON_RESOURCE";
- field public static final deprecated java.lang.String EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT";
- field public static final deprecated java.lang.String EXTRA_SHORTCUT_NAME = "android.intent.extra.shortcut.NAME";
- field public static final java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
- field public static final java.lang.String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
- field public static final java.lang.String EXTRA_STREAM = "android.intent.extra.STREAM";
- field public static final java.lang.String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
- field public static final java.lang.String EXTRA_SUSPENDED_PACKAGE_EXTRAS = "android.intent.extra.SUSPENDED_PACKAGE_EXTRAS";
- field public static final java.lang.String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
- field public static final java.lang.String EXTRA_TEXT = "android.intent.extra.TEXT";
- field public static final java.lang.String EXTRA_TITLE = "android.intent.extra.TITLE";
- field public static final java.lang.String EXTRA_UID = "android.intent.extra.UID";
- field public static final java.lang.String EXTRA_USER = "android.intent.extra.USER";
+ field public static final String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
+ field public static final String EXTRA_EMAIL = "android.intent.extra.EMAIL";
+ field public static final String EXTRA_EXCLUDE_COMPONENTS = "android.intent.extra.EXCLUDE_COMPONENTS";
+ field public static final String EXTRA_FROM_STORAGE = "android.intent.extra.FROM_STORAGE";
+ field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+ field public static final String EXTRA_INDEX = "android.intent.extra.INDEX";
+ field public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
+ field public static final String EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME";
+ field public static final String EXTRA_INTENT = "android.intent.extra.INTENT";
+ field public static final String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
+ field public static final String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
+ field public static final String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";
+ field public static final String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
+ field public static final String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
+ field public static final String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME";
+ field public static final String EXTRA_PERMISSION_USAGE_PERMISSIONS = "android.intent.extra.PERMISSION_USAGE_PERMISSIONS";
+ field public static final String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
+ field public static final String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
+ field public static final String EXTRA_PROCESS_TEXT_READONLY = "android.intent.extra.PROCESS_TEXT_READONLY";
+ field public static final String EXTRA_QUICK_VIEW_FEATURES = "android.intent.extra.QUICK_VIEW_FEATURES";
+ field public static final String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
+ field public static final String EXTRA_REFERRER = "android.intent.extra.REFERRER";
+ field public static final String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
+ field public static final String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token";
+ field public static final String EXTRA_REPLACEMENT_EXTRAS = "android.intent.extra.REPLACEMENT_EXTRAS";
+ field public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
+ field public static final String EXTRA_RESTRICTIONS_BUNDLE = "android.intent.extra.restrictions_bundle";
+ field public static final String EXTRA_RESTRICTIONS_INTENT = "android.intent.extra.restrictions_intent";
+ field public static final String EXTRA_RESTRICTIONS_LIST = "android.intent.extra.restrictions_list";
+ field public static final String EXTRA_RESULT_RECEIVER = "android.intent.extra.RESULT_RECEIVER";
+ field public static final String EXTRA_RETURN_RESULT = "android.intent.extra.RETURN_RESULT";
+ field @Deprecated public static final String EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON";
+ field @Deprecated public static final String EXTRA_SHORTCUT_ICON_RESOURCE = "android.intent.extra.shortcut.ICON_RESOURCE";
+ field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+ field @Deprecated public static final String EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT";
+ field @Deprecated public static final String EXTRA_SHORTCUT_NAME = "android.intent.extra.shortcut.NAME";
+ field public static final String EXTRA_SHUTDOWN_USERSPACE_ONLY = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
+ field public static final String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
+ field public static final String EXTRA_STREAM = "android.intent.extra.STREAM";
+ field public static final String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
+ field public static final String EXTRA_SUSPENDED_PACKAGE_EXTRAS = "android.intent.extra.SUSPENDED_PACKAGE_EXTRAS";
+ field public static final String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
+ field public static final String EXTRA_TEXT = "android.intent.extra.TEXT";
+ field public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
+ field public static final String EXTRA_UID = "android.intent.extra.UID";
+ field public static final String EXTRA_USER = "android.intent.extra.USER";
field public static final int FILL_IN_ACTION = 1; // 0x1
field public static final int FILL_IN_CATEGORIES = 4; // 0x4
field public static final int FILL_IN_CLIP_DATA = 128; // 0x80
@@ -10363,7 +10405,7 @@ package android.content {
field public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; // 0x400000
field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
field public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864; // 0x4000000
- field public static final deprecated int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000
+ field @Deprecated public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000
field public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; // 0x800000
field public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; // 0x2000000
field public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; // 0x100000
@@ -10395,7 +10437,7 @@ package android.content {
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
field public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 2097152; // 0x200000
- field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
+ field public static final String METADATA_DOCK_HOME = "android.dock_home";
field public static final int URI_ALLOW_UNSAFE = 4; // 0x4
field public static final int URI_ANDROID_APP_SCHEME = 2; // 0x2
field public static final int URI_INTENT_SCHEME = 1; // 0x1
@@ -10409,26 +10451,26 @@ package android.content {
public static class Intent.ShortcutIconResource implements android.os.Parcelable {
ctor public Intent.ShortcutIconResource();
method public int describeContents();
- method public static android.content.Intent.ShortcutIconResource fromContext(android.content.Context, int);
+ method public static android.content.Intent.ShortcutIconResource fromContext(android.content.Context, @AnyRes int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.Intent.ShortcutIconResource> CREATOR;
- field public java.lang.String packageName;
- field public java.lang.String resourceName;
+ field public String packageName;
+ field public String resourceName;
}
public class IntentFilter implements android.os.Parcelable {
ctor public IntentFilter();
- ctor public IntentFilter(java.lang.String);
- ctor public IntentFilter(java.lang.String, java.lang.String) throws android.content.IntentFilter.MalformedMimeTypeException;
+ ctor public IntentFilter(String);
+ ctor public IntentFilter(String, String) throws android.content.IntentFilter.MalformedMimeTypeException;
ctor public IntentFilter(android.content.IntentFilter);
method public final java.util.Iterator<java.lang.String> actionsIterator();
- method public final void addAction(java.lang.String);
- method public final void addCategory(java.lang.String);
- method public final void addDataAuthority(java.lang.String, java.lang.String);
- method public final void addDataPath(java.lang.String, int);
- method public final void addDataScheme(java.lang.String);
- method public final void addDataSchemeSpecificPart(java.lang.String, int);
- method public final void addDataType(java.lang.String) throws android.content.IntentFilter.MalformedMimeTypeException;
+ method public final void addAction(String);
+ method public final void addCategory(String);
+ method public final void addDataAuthority(String, String);
+ method public final void addDataPath(String, int);
+ method public final void addDataScheme(String);
+ method public final void addDataSchemeSpecificPart(String, int);
+ method public final void addDataType(String) throws android.content.IntentFilter.MalformedMimeTypeException;
method public final java.util.Iterator<android.content.IntentFilter.AuthorityEntry> authoritiesIterator();
method public final java.util.Iterator<java.lang.String> categoriesIterator();
method public final int countActions();
@@ -10438,29 +10480,29 @@ package android.content {
method public final int countDataSchemeSpecificParts();
method public final int countDataSchemes();
method public final int countDataTypes();
- method public static android.content.IntentFilter create(java.lang.String, java.lang.String);
+ method public static android.content.IntentFilter create(String, String);
method public final int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
- method public final java.lang.String getAction(int);
- method public final java.lang.String getCategory(int);
+ method public void dump(android.util.Printer, String);
+ method public final String getAction(int);
+ method public final String getCategory(int);
method public final android.content.IntentFilter.AuthorityEntry getDataAuthority(int);
method public final android.os.PatternMatcher getDataPath(int);
- method public final java.lang.String getDataScheme(int);
+ method public final String getDataScheme(int);
method public final android.os.PatternMatcher getDataSchemeSpecificPart(int);
- method public final java.lang.String getDataType(int);
+ method public final String getDataType(int);
method public final int getPriority();
- method public final boolean hasAction(java.lang.String);
- method public final boolean hasCategory(java.lang.String);
+ method public final boolean hasAction(String);
+ method public final boolean hasCategory(String);
method public final boolean hasDataAuthority(android.net.Uri);
- method public final boolean hasDataPath(java.lang.String);
- method public final boolean hasDataScheme(java.lang.String);
- method public final boolean hasDataSchemeSpecificPart(java.lang.String);
- method public final boolean hasDataType(java.lang.String);
- method public final int match(android.content.ContentResolver, android.content.Intent, boolean, java.lang.String);
- method public final int match(java.lang.String, java.lang.String, java.lang.String, android.net.Uri, java.util.Set<java.lang.String>, java.lang.String);
- method public final boolean matchAction(java.lang.String);
- method public final java.lang.String matchCategories(java.util.Set<java.lang.String>);
- method public final int matchData(java.lang.String, java.lang.String, android.net.Uri);
+ method public final boolean hasDataPath(String);
+ method public final boolean hasDataScheme(String);
+ method public final boolean hasDataSchemeSpecificPart(String);
+ method public final boolean hasDataType(String);
+ method public final int match(android.content.ContentResolver, android.content.Intent, boolean, String);
+ method public final int match(String, String, String, android.net.Uri, java.util.Set<java.lang.String>, String);
+ method public final boolean matchAction(String);
+ method public final String matchCategories(java.util.Set<java.lang.String>);
+ method public final int matchData(String, String, android.net.Uri);
method public final int matchDataAuthority(android.net.Uri);
method public final java.util.Iterator<android.os.PatternMatcher> pathsIterator();
method public void readFromXml(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
@@ -10490,84 +10532,84 @@ package android.content {
}
public static final class IntentFilter.AuthorityEntry {
- ctor public IntentFilter.AuthorityEntry(java.lang.String, java.lang.String);
- method public java.lang.String getHost();
+ ctor public IntentFilter.AuthorityEntry(String, String);
+ method public String getHost();
method public int getPort();
method public int match(android.net.Uri);
}
public static class IntentFilter.MalformedMimeTypeException extends android.util.AndroidException {
ctor public IntentFilter.MalformedMimeTypeException();
- ctor public IntentFilter.MalformedMimeTypeException(java.lang.String);
+ ctor public IntentFilter.MalformedMimeTypeException(String);
}
public class IntentSender implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCreatorPackage();
+ method public String getCreatorPackage();
method public int getCreatorUid();
method public android.os.UserHandle getCreatorUserHandle();
- method public deprecated java.lang.String getTargetPackage();
+ method @Deprecated public String getTargetPackage();
method public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler) throws android.content.IntentSender.SendIntentException;
- method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler, java.lang.String) throws android.content.IntentSender.SendIntentException;
+ method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler, String) throws android.content.IntentSender.SendIntentException;
method public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.IntentSender> CREATOR;
}
- public static abstract interface IntentSender.OnFinished {
- method public abstract void onSendFinished(android.content.IntentSender, android.content.Intent, int, java.lang.String, android.os.Bundle);
+ public static interface IntentSender.OnFinished {
+ method public void onSendFinished(android.content.IntentSender, android.content.Intent, int, String, android.os.Bundle);
}
public static class IntentSender.SendIntentException extends android.util.AndroidException {
ctor public IntentSender.SendIntentException();
- ctor public IntentSender.SendIntentException(java.lang.String);
- ctor public IntentSender.SendIntentException(java.lang.Exception);
- }
-
- public deprecated class Loader<D> {
- ctor public Loader(android.content.Context);
- method public void abandon();
- method public boolean cancelLoad();
- method public void commitContentChanged();
- method public java.lang.String dataToString(D);
- method public void deliverCancellation();
- method public void deliverResult(D);
- method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public void forceLoad();
- method public android.content.Context getContext();
- method public int getId();
- method public boolean isAbandoned();
- method public boolean isReset();
- method public boolean isStarted();
- method protected void onAbandon();
- method protected boolean onCancelLoad();
- method public void onContentChanged();
- method protected void onForceLoad();
- method protected void onReset();
- method protected void onStartLoading();
- method protected void onStopLoading();
- method public void registerListener(int, android.content.Loader.OnLoadCompleteListener<D>);
- method public void registerOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
- method public void reset();
- method public void rollbackContentChanged();
- method public final void startLoading();
- method public void stopLoading();
- method public boolean takeContentChanged();
- method public void unregisterListener(android.content.Loader.OnLoadCompleteListener<D>);
- method public void unregisterOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
- }
-
- public final deprecated class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
- ctor public Loader.ForceLoadContentObserver();
- }
-
- public static abstract deprecated interface Loader.OnLoadCanceledListener<D> {
- method public abstract void onLoadCanceled(android.content.Loader<D>);
- }
-
- public static abstract deprecated interface Loader.OnLoadCompleteListener<D> {
- method public abstract void onLoadComplete(android.content.Loader<D>, D);
+ ctor public IntentSender.SendIntentException(String);
+ ctor public IntentSender.SendIntentException(Exception);
+ }
+
+ @Deprecated public class Loader<D> {
+ ctor @Deprecated public Loader(android.content.Context);
+ method @Deprecated public void abandon();
+ method @Deprecated public boolean cancelLoad();
+ method @Deprecated public void commitContentChanged();
+ method @Deprecated public String dataToString(D);
+ method @Deprecated public void deliverCancellation();
+ method @Deprecated public void deliverResult(D);
+ method @Deprecated public void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated public void forceLoad();
+ method @Deprecated public android.content.Context getContext();
+ method @Deprecated public int getId();
+ method @Deprecated public boolean isAbandoned();
+ method @Deprecated public boolean isReset();
+ method @Deprecated public boolean isStarted();
+ method @Deprecated protected void onAbandon();
+ method @Deprecated protected boolean onCancelLoad();
+ method @Deprecated public void onContentChanged();
+ method @Deprecated protected void onForceLoad();
+ method @Deprecated protected void onReset();
+ method @Deprecated protected void onStartLoading();
+ method @Deprecated protected void onStopLoading();
+ method @Deprecated public void registerListener(int, android.content.Loader.OnLoadCompleteListener<D>);
+ method @Deprecated public void registerOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
+ method @Deprecated public void reset();
+ method @Deprecated public void rollbackContentChanged();
+ method @Deprecated public final void startLoading();
+ method @Deprecated public void stopLoading();
+ method @Deprecated public boolean takeContentChanged();
+ method @Deprecated public void unregisterListener(android.content.Loader.OnLoadCompleteListener<D>);
+ method @Deprecated public void unregisterOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
+ }
+
+ @Deprecated public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
+ ctor @Deprecated public Loader.ForceLoadContentObserver();
+ }
+
+ @Deprecated public static interface Loader.OnLoadCanceledListener<D> {
+ method @Deprecated public void onLoadCanceled(android.content.Loader<D>);
+ }
+
+ @Deprecated public static interface Loader.OnLoadCompleteListener<D> {
+ method @Deprecated public void onLoadComplete(android.content.Loader<D>, D);
}
public class MutableContextWrapper extends android.content.ContextWrapper {
@@ -10577,70 +10619,70 @@ package android.content {
public class OperationApplicationException extends java.lang.Exception {
ctor public OperationApplicationException();
- ctor public OperationApplicationException(java.lang.String);
- ctor public OperationApplicationException(java.lang.String, java.lang.Throwable);
- ctor public OperationApplicationException(java.lang.Throwable);
+ ctor public OperationApplicationException(String);
+ ctor public OperationApplicationException(String, Throwable);
+ ctor public OperationApplicationException(Throwable);
ctor public OperationApplicationException(int);
- ctor public OperationApplicationException(java.lang.String, int);
+ ctor public OperationApplicationException(String, int);
method public int getNumSuccessfulYieldPoints();
}
public class PeriodicSync implements android.os.Parcelable {
- ctor public PeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
+ ctor public PeriodicSync(android.accounts.Account, String, android.os.Bundle, long);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.PeriodicSync> CREATOR;
field public final android.accounts.Account account;
- field public final java.lang.String authority;
+ field public final String authority;
field public final android.os.Bundle extras;
field public final long period;
}
public class QuickViewConstants {
- field public static final java.lang.String FEATURE_DELETE = "android:delete";
- field public static final java.lang.String FEATURE_DOWNLOAD = "android:download";
- field public static final java.lang.String FEATURE_EDIT = "android:edit";
- field public static final java.lang.String FEATURE_PRINT = "android:print";
- field public static final java.lang.String FEATURE_SEND = "android:send";
- field public static final java.lang.String FEATURE_VIEW = "android:view";
+ field public static final String FEATURE_DELETE = "android:delete";
+ field public static final String FEATURE_DOWNLOAD = "android:download";
+ field public static final String FEATURE_EDIT = "android:edit";
+ field public static final String FEATURE_PRINT = "android:print";
+ field public static final String FEATURE_SEND = "android:send";
+ field public static final String FEATURE_VIEW = "android:view";
}
public class ReceiverCallNotAllowedException extends android.util.AndroidRuntimeException {
- ctor public ReceiverCallNotAllowedException(java.lang.String);
+ ctor public ReceiverCallNotAllowedException(String);
}
public class RestrictionEntry implements android.os.Parcelable {
- ctor public RestrictionEntry(int, java.lang.String);
- ctor public RestrictionEntry(java.lang.String, java.lang.String);
- ctor public RestrictionEntry(java.lang.String, boolean);
- ctor public RestrictionEntry(java.lang.String, java.lang.String[]);
- ctor public RestrictionEntry(java.lang.String, int);
+ ctor public RestrictionEntry(int, String);
+ ctor public RestrictionEntry(String, String);
+ ctor public RestrictionEntry(String, boolean);
+ ctor public RestrictionEntry(String, String[]);
+ ctor public RestrictionEntry(String, int);
ctor public RestrictionEntry(android.os.Parcel);
- method public static android.content.RestrictionEntry createBundleArrayEntry(java.lang.String, android.content.RestrictionEntry[]);
- method public static android.content.RestrictionEntry createBundleEntry(java.lang.String, android.content.RestrictionEntry[]);
+ method public static android.content.RestrictionEntry createBundleArrayEntry(String, android.content.RestrictionEntry[]);
+ method public static android.content.RestrictionEntry createBundleEntry(String, android.content.RestrictionEntry[]);
method public int describeContents();
- method public java.lang.String[] getAllSelectedStrings();
- method public java.lang.String[] getChoiceEntries();
- method public java.lang.String[] getChoiceValues();
- method public java.lang.String getDescription();
+ method public String[] getAllSelectedStrings();
+ method public String[] getChoiceEntries();
+ method public String[] getChoiceValues();
+ method public String getDescription();
method public int getIntValue();
- method public java.lang.String getKey();
+ method public String getKey();
method public android.content.RestrictionEntry[] getRestrictions();
method public boolean getSelectedState();
- method public java.lang.String getSelectedString();
- method public java.lang.String getTitle();
+ method public String getSelectedString();
+ method public String getTitle();
method public int getType();
- method public void setAllSelectedStrings(java.lang.String[]);
- method public void setChoiceEntries(java.lang.String[]);
- method public void setChoiceEntries(android.content.Context, int);
- method public void setChoiceValues(java.lang.String[]);
- method public void setChoiceValues(android.content.Context, int);
- method public void setDescription(java.lang.String);
+ method public void setAllSelectedStrings(String[]);
+ method public void setChoiceEntries(String[]);
+ method public void setChoiceEntries(android.content.Context, @ArrayRes int);
+ method public void setChoiceValues(String[]);
+ method public void setChoiceValues(android.content.Context, @ArrayRes int);
+ method public void setDescription(String);
method public void setIntValue(int);
method public void setRestrictions(android.content.RestrictionEntry[]);
method public void setSelectedState(boolean);
- method public void setSelectedString(java.lang.String);
- method public void setTitle(java.lang.String);
+ method public void setSelectedString(String);
+ method public void setTitle(String);
method public void setType(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.RestrictionEntry> CREATOR;
@@ -10658,32 +10700,32 @@ package android.content {
method public static android.os.Bundle convertRestrictionsToBundle(java.util.List<android.content.RestrictionEntry>);
method public android.content.Intent createLocalApprovalIntent();
method public android.os.Bundle getApplicationRestrictions();
- method public java.util.List<android.content.RestrictionEntry> getManifestRestrictions(java.lang.String);
+ method public java.util.List<android.content.RestrictionEntry> getManifestRestrictions(String);
method public boolean hasRestrictionsProvider();
- method public void notifyPermissionResponse(java.lang.String, android.os.PersistableBundle);
- method public void requestPermission(java.lang.String, java.lang.String, android.os.PersistableBundle);
- field public static final java.lang.String ACTION_PERMISSION_RESPONSE_RECEIVED = "android.content.action.PERMISSION_RESPONSE_RECEIVED";
- field public static final java.lang.String ACTION_REQUEST_LOCAL_APPROVAL = "android.content.action.REQUEST_LOCAL_APPROVAL";
- field public static final java.lang.String ACTION_REQUEST_PERMISSION = "android.content.action.REQUEST_PERMISSION";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.content.extra.PACKAGE_NAME";
- field public static final java.lang.String EXTRA_REQUEST_BUNDLE = "android.content.extra.REQUEST_BUNDLE";
- field public static final java.lang.String EXTRA_REQUEST_ID = "android.content.extra.REQUEST_ID";
- field public static final java.lang.String EXTRA_REQUEST_TYPE = "android.content.extra.REQUEST_TYPE";
- field public static final java.lang.String EXTRA_RESPONSE_BUNDLE = "android.content.extra.RESPONSE_BUNDLE";
- field public static final java.lang.String META_DATA_APP_RESTRICTIONS = "android.content.APP_RESTRICTIONS";
- field public static final java.lang.String REQUEST_KEY_APPROVE_LABEL = "android.request.approve_label";
- field public static final java.lang.String REQUEST_KEY_DATA = "android.request.data";
- field public static final java.lang.String REQUEST_KEY_DENY_LABEL = "android.request.deny_label";
- field public static final java.lang.String REQUEST_KEY_ICON = "android.request.icon";
- field public static final java.lang.String REQUEST_KEY_ID = "android.request.id";
- field public static final java.lang.String REQUEST_KEY_MESSAGE = "android.request.mesg";
- field public static final java.lang.String REQUEST_KEY_NEW_REQUEST = "android.request.new_request";
- field public static final java.lang.String REQUEST_KEY_TITLE = "android.request.title";
- field public static final java.lang.String REQUEST_TYPE_APPROVAL = "android.request.type.approval";
- field public static final java.lang.String RESPONSE_KEY_ERROR_CODE = "android.response.errorcode";
- field public static final java.lang.String RESPONSE_KEY_MESSAGE = "android.response.msg";
- field public static final java.lang.String RESPONSE_KEY_RESPONSE_TIMESTAMP = "android.response.timestamp";
- field public static final java.lang.String RESPONSE_KEY_RESULT = "android.response.result";
+ method public void notifyPermissionResponse(String, android.os.PersistableBundle);
+ method public void requestPermission(String, String, android.os.PersistableBundle);
+ field public static final String ACTION_PERMISSION_RESPONSE_RECEIVED = "android.content.action.PERMISSION_RESPONSE_RECEIVED";
+ field public static final String ACTION_REQUEST_LOCAL_APPROVAL = "android.content.action.REQUEST_LOCAL_APPROVAL";
+ field public static final String ACTION_REQUEST_PERMISSION = "android.content.action.REQUEST_PERMISSION";
+ field public static final String EXTRA_PACKAGE_NAME = "android.content.extra.PACKAGE_NAME";
+ field public static final String EXTRA_REQUEST_BUNDLE = "android.content.extra.REQUEST_BUNDLE";
+ field public static final String EXTRA_REQUEST_ID = "android.content.extra.REQUEST_ID";
+ field public static final String EXTRA_REQUEST_TYPE = "android.content.extra.REQUEST_TYPE";
+ field public static final String EXTRA_RESPONSE_BUNDLE = "android.content.extra.RESPONSE_BUNDLE";
+ field public static final String META_DATA_APP_RESTRICTIONS = "android.content.APP_RESTRICTIONS";
+ field public static final String REQUEST_KEY_APPROVE_LABEL = "android.request.approve_label";
+ field public static final String REQUEST_KEY_DATA = "android.request.data";
+ field public static final String REQUEST_KEY_DENY_LABEL = "android.request.deny_label";
+ field public static final String REQUEST_KEY_ICON = "android.request.icon";
+ field public static final String REQUEST_KEY_ID = "android.request.id";
+ field public static final String REQUEST_KEY_MESSAGE = "android.request.mesg";
+ field public static final String REQUEST_KEY_NEW_REQUEST = "android.request.new_request";
+ field public static final String REQUEST_KEY_TITLE = "android.request.title";
+ field public static final String REQUEST_TYPE_APPROVAL = "android.request.type.approval";
+ field public static final String RESPONSE_KEY_ERROR_CODE = "android.response.errorcode";
+ field public static final String RESPONSE_KEY_MESSAGE = "android.response.msg";
+ field public static final String RESPONSE_KEY_RESPONSE_TIMESTAMP = "android.response.timestamp";
+ field public static final String RESPONSE_KEY_RESULT = "android.response.result";
field public static final int RESULT_APPROVED = 1; // 0x1
field public static final int RESULT_DENIED = 2; // 0x2
field public static final int RESULT_ERROR = 5; // 0x5
@@ -10696,69 +10738,69 @@ package android.content {
public class SearchRecentSuggestionsProvider extends android.content.ContentProvider {
ctor public SearchRecentSuggestionsProvider();
- method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public java.lang.String getType(android.net.Uri);
+ method public int delete(android.net.Uri, String, String[]);
+ method public String getType(android.net.Uri);
method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public boolean onCreate();
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method protected void setupSuggestions(java.lang.String, int);
- method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+ method protected void setupSuggestions(String, int);
+ method public int update(android.net.Uri, android.content.ContentValues, String, String[]);
field public static final int DATABASE_MODE_2LINES = 2; // 0x2
field public static final int DATABASE_MODE_QUERIES = 1; // 0x1
}
- public abstract interface ServiceConnection {
+ public interface ServiceConnection {
method public default void onBindingDied(android.content.ComponentName);
method public default void onNullBinding(android.content.ComponentName);
- method public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
- method public abstract void onServiceDisconnected(android.content.ComponentName);
+ method public void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ method public void onServiceDisconnected(android.content.ComponentName);
}
- public abstract interface SharedPreferences {
- method public abstract boolean contains(java.lang.String);
- method public abstract android.content.SharedPreferences.Editor edit();
- method public abstract java.util.Map<java.lang.String, ?> getAll();
- method public abstract boolean getBoolean(java.lang.String, boolean);
- method public abstract float getFloat(java.lang.String, float);
- method public abstract int getInt(java.lang.String, int);
- method public abstract long getLong(java.lang.String, long);
- method public abstract java.lang.String getString(java.lang.String, java.lang.String);
- method public abstract java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
- method public abstract void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
- method public abstract void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+ public interface SharedPreferences {
+ method public boolean contains(String);
+ method public android.content.SharedPreferences.Editor edit();
+ method public java.util.Map<java.lang.String,?> getAll();
+ method public boolean getBoolean(String, boolean);
+ method public float getFloat(String, float);
+ method public int getInt(String, int);
+ method public long getLong(String, long);
+ method @Nullable public String getString(String, @Nullable String);
+ method @Nullable public java.util.Set<java.lang.String> getStringSet(String, @Nullable java.util.Set<java.lang.String>);
+ method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+ method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
}
- public static abstract interface SharedPreferences.Editor {
- method public abstract void apply();
- method public abstract android.content.SharedPreferences.Editor clear();
- method public abstract boolean commit();
- method public abstract android.content.SharedPreferences.Editor putBoolean(java.lang.String, boolean);
- method public abstract android.content.SharedPreferences.Editor putFloat(java.lang.String, float);
- method public abstract android.content.SharedPreferences.Editor putInt(java.lang.String, int);
- method public abstract android.content.SharedPreferences.Editor putLong(java.lang.String, long);
- method public abstract android.content.SharedPreferences.Editor putString(java.lang.String, java.lang.String);
- method public abstract android.content.SharedPreferences.Editor putStringSet(java.lang.String, java.util.Set<java.lang.String>);
- method public abstract android.content.SharedPreferences.Editor remove(java.lang.String);
+ public static interface SharedPreferences.Editor {
+ method public void apply();
+ method public android.content.SharedPreferences.Editor clear();
+ method public boolean commit();
+ method public android.content.SharedPreferences.Editor putBoolean(String, boolean);
+ method public android.content.SharedPreferences.Editor putFloat(String, float);
+ method public android.content.SharedPreferences.Editor putInt(String, int);
+ method public android.content.SharedPreferences.Editor putLong(String, long);
+ method public android.content.SharedPreferences.Editor putString(String, @Nullable String);
+ method public android.content.SharedPreferences.Editor putStringSet(String, @Nullable java.util.Set<java.lang.String>);
+ method public android.content.SharedPreferences.Editor remove(String);
}
- public static abstract interface SharedPreferences.OnSharedPreferenceChangeListener {
- method public abstract void onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String);
+ public static interface SharedPreferences.OnSharedPreferenceChangeListener {
+ method public void onSharedPreferenceChanged(android.content.SharedPreferences, String);
}
public class SyncAdapterType implements android.os.Parcelable {
- ctor public SyncAdapterType(java.lang.String, java.lang.String, boolean, boolean);
+ ctor public SyncAdapterType(String, String, boolean, boolean);
ctor public SyncAdapterType(android.os.Parcel);
method public boolean allowParallelSyncs();
method public int describeContents();
- method public java.lang.String getSettingsActivity();
+ method public String getSettingsActivity();
method public boolean isAlwaysSyncable();
method public boolean isUserVisible();
- method public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
+ method public static android.content.SyncAdapterType newKey(String, String);
method public boolean supportsUploading();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.SyncAdapterType> CREATOR;
- field public final java.lang.String accountType;
- field public final java.lang.String authority;
+ field public final String accountType;
+ field public final String authority;
field public final boolean isKey;
}
@@ -10771,7 +10813,7 @@ package android.content {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public final android.accounts.Account account;
- field public final java.lang.String authority;
+ field public final String authority;
field public final long startTime;
}
@@ -10792,7 +10834,7 @@ package android.content {
method public android.content.SyncRequest.Builder setManual(boolean);
method public android.content.SyncRequest.Builder setNoRetry(boolean);
method public android.content.SyncRequest.Builder setRequiresCharging(boolean);
- method public android.content.SyncRequest.Builder setSyncAdapter(android.accounts.Account, java.lang.String);
+ method public android.content.SyncRequest.Builder setSyncAdapter(android.accounts.Account, String);
method public android.content.SyncRequest.Builder syncOnce();
method public android.content.SyncRequest.Builder syncPeriodic(long, long);
}
@@ -10805,7 +10847,7 @@ package android.content {
method public boolean hasHardError();
method public boolean hasSoftError();
method public boolean madeSomeProgress();
- method public java.lang.String toDebugString();
+ method public String toDebugString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.content.SyncResult ALREADY_IN_PROGRESS;
field public static final android.os.Parcelable.Creator<android.content.SyncResult> CREATOR;
@@ -10838,13 +10880,13 @@ package android.content {
field public long numUpdates;
}
- public abstract interface SyncStatusObserver {
- method public abstract void onStatusChanged(int);
+ public interface SyncStatusObserver {
+ method public void onStatusChanged(int);
}
public class UriMatcher {
ctor public UriMatcher(int);
- method public void addURI(java.lang.String, java.lang.String, int);
+ method public void addURI(String, String, int);
method public int match(android.net.Uri);
field public static final int NO_MATCH = -1; // 0xffffffff
}
@@ -10868,7 +10910,7 @@ package android.content.pm {
ctor public ActivityInfo();
ctor public ActivityInfo(android.content.pm.ActivityInfo);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public final int getThemeResource();
field public static final int COLOR_MODE_DEFAULT = 0; // 0x0
field public static final int COLOR_MODE_HDR = 2; // 0x2
@@ -10940,13 +10982,13 @@ package android.content.pm {
field public int flags;
field public int launchMode;
field public int maxRecents;
- field public java.lang.String parentActivityName;
- field public java.lang.String permission;
+ field public String parentActivityName;
+ field public String permission;
field public int persistableMode;
field public int screenOrientation;
field public int softInputMode;
- field public java.lang.String targetActivity;
- field public java.lang.String taskAffinity;
+ field public String targetActivity;
+ field public String taskAffinity;
field public int theme;
field public int uiOptions;
field public android.content.pm.ActivityInfo.WindowLayout windowLayout;
@@ -10967,11 +11009,11 @@ package android.content.pm {
ctor public ApplicationInfo();
ctor public ApplicationInfo(android.content.pm.ApplicationInfo);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
- method public static java.lang.CharSequence getCategoryTitle(android.content.Context, int);
+ method public void dump(android.util.Printer, String);
+ method public static CharSequence getCategoryTitle(android.content.Context, int);
method public boolean isProfileableByShell();
method public boolean isVirtualPreload();
- method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+ method public CharSequence loadDescription(android.content.pm.PackageManager);
field public static final int CATEGORY_AUDIO = 1; // 0x1
field public static final int CATEGORY_GAME = 0; // 0x0
field public static final int CATEGORY_IMAGE = 3; // 0x3
@@ -10994,7 +11036,7 @@ package android.content.pm {
field public static final int FLAG_HAS_CODE = 4; // 0x4
field public static final int FLAG_INSTALLED = 8388608; // 0x800000
field public static final int FLAG_IS_DATA_ONLY = 16777216; // 0x1000000
- field public static final deprecated int FLAG_IS_GAME = 33554432; // 0x2000000
+ field @Deprecated public static final int FLAG_IS_GAME = 33554432; // 0x2000000
field public static final int FLAG_KILL_AFTER_RESTORE = 65536; // 0x10000
field public static final int FLAG_LARGE_HEAP = 1048576; // 0x100000
field public static final int FLAG_MULTIARCH = -2147483648; // 0x80000000
@@ -11014,46 +11056,46 @@ package android.content.pm {
field public static final int FLAG_UPDATED_SYSTEM_APP = 128; // 0x80
field public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 134217728; // 0x8000000
field public static final int FLAG_VM_SAFE_MODE = 16384; // 0x4000
- field public java.lang.String appComponentFactory;
- field public java.lang.String backupAgentName;
+ field public String appComponentFactory;
+ field public String backupAgentName;
field public int category;
- field public java.lang.String className;
+ field public String className;
field public int compatibleWidthLimitDp;
- field public java.lang.String dataDir;
+ field public String dataDir;
field public int descriptionRes;
- field public java.lang.String deviceProtectedDataDir;
+ field public String deviceProtectedDataDir;
field public boolean enabled;
field public int flags;
field public int largestWidthLimitDp;
- field public java.lang.String manageSpaceActivityName;
+ field public String manageSpaceActivityName;
field public int minSdkVersion;
- field public java.lang.String nativeLibraryDir;
- field public java.lang.String permission;
- field public java.lang.String processName;
- field public java.lang.String publicSourceDir;
+ field public String nativeLibraryDir;
+ field public String permission;
+ field public String processName;
+ field public String publicSourceDir;
field public int requiresSmallestWidthDp;
- field public java.lang.String[] sharedLibraryFiles;
- field public java.lang.String sourceDir;
- field public java.lang.String[] splitNames;
- field public java.lang.String[] splitPublicSourceDirs;
- field public java.lang.String[] splitSourceDirs;
+ field public String[] sharedLibraryFiles;
+ field public String sourceDir;
+ field public String[] splitNames;
+ field public String[] splitPublicSourceDirs;
+ field public String[] splitSourceDirs;
field public java.util.UUID storageUuid;
field public int targetSdkVersion;
- field public java.lang.String taskAffinity;
+ field public String taskAffinity;
field public int theme;
field public int uiOptions;
field public int uid;
}
- public static class ApplicationInfo.DisplayNameComparator implements java.util.Comparator {
+ public static class ApplicationInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.ApplicationInfo> {
ctor public ApplicationInfo.DisplayNameComparator(android.content.pm.PackageManager);
method public final int compare(android.content.pm.ApplicationInfo, android.content.pm.ApplicationInfo);
}
public final class ChangedPackages implements android.os.Parcelable {
- ctor public ChangedPackages(int, java.util.List<java.lang.String>);
+ ctor public ChangedPackages(int, @NonNull java.util.List<java.lang.String>);
method public int describeContents();
- method public java.util.List<java.lang.String> getPackageNames();
+ method @NonNull public java.util.List<java.lang.String> getPackageNames();
method public int getSequenceNumber();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.ChangedPackages> CREATOR;
@@ -11072,15 +11114,15 @@ package android.content.pm {
field public boolean directBootAware;
field public boolean enabled;
field public boolean exported;
- field public java.lang.String processName;
- field public java.lang.String splitName;
+ field public String processName;
+ field public String splitName;
}
public class ConfigurationInfo implements android.os.Parcelable {
ctor public ConfigurationInfo();
ctor public ConfigurationInfo(android.content.pm.ConfigurationInfo);
method public int describeContents();
- method public java.lang.String getGlEsVersion();
+ method public String getGlEsVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.ConfigurationInfo> CREATOR;
field public static final int GL_ES_VERSION_UNDEFINED = 0; // 0x0
@@ -11094,10 +11136,10 @@ package android.content.pm {
}
public class CrossProfileApps {
- method public android.graphics.drawable.Drawable getProfileSwitchingIconDrawable(android.os.UserHandle);
- method public java.lang.CharSequence getProfileSwitchingLabel(android.os.UserHandle);
- method public java.util.List<android.os.UserHandle> getTargetUserProfiles();
- method public void startMainActivity(android.content.ComponentName, android.os.UserHandle);
+ method @NonNull public android.graphics.drawable.Drawable getProfileSwitchingIconDrawable(@NonNull android.os.UserHandle);
+ method @NonNull public CharSequence getProfileSwitchingLabel(@NonNull android.os.UserHandle);
+ method @NonNull public java.util.List<android.os.UserHandle> getTargetUserProfiles();
+ method public void startMainActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
}
public final class FeatureGroupInfo implements android.os.Parcelable {
@@ -11113,13 +11155,13 @@ package android.content.pm {
ctor public FeatureInfo();
ctor public FeatureInfo(android.content.pm.FeatureInfo);
method public int describeContents();
- method public java.lang.String getGlEsVersion();
+ method public String getGlEsVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.FeatureInfo> CREATOR;
field public static final int FLAG_REQUIRED = 1; // 0x1
field public static final int GL_ES_VERSION_UNDEFINED = 0; // 0x0
field public int flags;
- field public java.lang.String name;
+ field public String name;
field public int reqGlEsVersion;
field public int version;
}
@@ -11129,29 +11171,29 @@ package android.content.pm {
ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
method public int describeContents();
field public static final android.os.Parcelable.Creator<android.content.pm.InstrumentationInfo> CREATOR;
- field public java.lang.String dataDir;
+ field public String dataDir;
field public boolean functionalTest;
field public boolean handleProfiling;
- field public java.lang.String publicSourceDir;
- field public java.lang.String sourceDir;
- field public java.lang.String[] splitNames;
- field public java.lang.String[] splitPublicSourceDirs;
- field public java.lang.String[] splitSourceDirs;
- field public java.lang.String targetPackage;
- field public java.lang.String targetProcesses;
+ field public String publicSourceDir;
+ field public String sourceDir;
+ field public String[] splitNames;
+ field public String[] splitPublicSourceDirs;
+ field public String[] splitSourceDirs;
+ field public String targetPackage;
+ field public String targetProcesses;
}
public class LabeledIntent extends android.content.Intent {
- ctor public LabeledIntent(android.content.Intent, java.lang.String, int, int);
- ctor public LabeledIntent(android.content.Intent, java.lang.String, java.lang.CharSequence, int);
- ctor public LabeledIntent(java.lang.String, int, int);
- ctor public LabeledIntent(java.lang.String, java.lang.CharSequence, int);
+ ctor public LabeledIntent(android.content.Intent, String, int, int);
+ ctor public LabeledIntent(android.content.Intent, String, CharSequence, int);
+ ctor public LabeledIntent(String, int, int);
+ ctor public LabeledIntent(String, CharSequence, int);
method public int getIconResource();
method public int getLabelResource();
- method public java.lang.CharSequence getNonLocalizedLabel();
- method public java.lang.String getSourcePackage();
+ method public CharSequence getNonLocalizedLabel();
+ method public String getSourcePackage();
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator<android.content.pm.LabeledIntent> CREATOR;
}
@@ -11161,60 +11203,61 @@ package android.content.pm {
method public android.content.ComponentName getComponentName();
method public long getFirstInstallTime();
method public android.graphics.drawable.Drawable getIcon(int);
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getName();
+ method public CharSequence getLabel();
+ method public String getName();
method public android.os.UserHandle getUser();
}
public class LauncherApps {
- method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
- method public android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(String, android.os.UserHandle);
+ method public android.content.pm.ApplicationInfo getApplicationInfo(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.pm.LauncherApps.PinItemRequest getPinItemRequest(android.content.Intent);
method public java.util.List<android.os.UserHandle> getProfiles();
method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(android.content.pm.ShortcutInfo, int);
- method public android.content.IntentSender getShortcutConfigActivityIntent(android.content.pm.LauncherActivityInfo);
- method public java.util.List<android.content.pm.LauncherActivityInfo> getShortcutConfigActivityList(java.lang.String, android.os.UserHandle);
- method public android.graphics.drawable.Drawable getShortcutIconDrawable(android.content.pm.ShortcutInfo, int);
- method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
- method public android.os.Bundle getSuspendedPackageLauncherExtras(java.lang.String, android.os.UserHandle);
+ method @Nullable public android.content.IntentSender getShortcutConfigActivityIntent(@NonNull android.content.pm.LauncherActivityInfo);
+ method public java.util.List<android.content.pm.LauncherActivityInfo> getShortcutConfigActivityList(@Nullable String, @NonNull android.os.UserHandle);
+ method public android.graphics.drawable.Drawable getShortcutIconDrawable(@NonNull android.content.pm.ShortcutInfo, int);
+ method @Nullable public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(@NonNull android.content.pm.LauncherApps.ShortcutQuery, @NonNull android.os.UserHandle);
+ method @Nullable public android.os.Bundle getSuspendedPackageLauncherExtras(String, android.os.UserHandle);
method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
- method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
- method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
+ method public boolean isPackageEnabled(String, android.os.UserHandle);
+ method public void pinShortcuts(@NonNull String, @NonNull java.util.List<java.lang.String>, @NonNull android.os.UserHandle);
method public void registerCallback(android.content.pm.LauncherApps.Callback);
method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
+ method public boolean shouldHideFromSuggestions(@NonNull String, @NonNull android.os.UserHandle);
method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
- method public void startShortcut(java.lang.String, java.lang.String, android.graphics.Rect, android.os.Bundle, android.os.UserHandle);
- method public void startShortcut(android.content.pm.ShortcutInfo, android.graphics.Rect, android.os.Bundle);
+ method public void startShortcut(@NonNull String, @NonNull String, @Nullable android.graphics.Rect, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
+ method public void startShortcut(@NonNull android.content.pm.ShortcutInfo, @Nullable android.graphics.Rect, @Nullable android.os.Bundle);
method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
- field public static final java.lang.String ACTION_CONFIRM_PIN_APPWIDGET = "android.content.pm.action.CONFIRM_PIN_APPWIDGET";
- field public static final java.lang.String ACTION_CONFIRM_PIN_SHORTCUT = "android.content.pm.action.CONFIRM_PIN_SHORTCUT";
- field public static final java.lang.String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST";
+ field public static final String ACTION_CONFIRM_PIN_APPWIDGET = "android.content.pm.action.CONFIRM_PIN_APPWIDGET";
+ field public static final String ACTION_CONFIRM_PIN_SHORTCUT = "android.content.pm.action.CONFIRM_PIN_SHORTCUT";
+ field public static final String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST";
}
- public static abstract class LauncherApps.Callback {
+ public abstract static class LauncherApps.Callback {
ctor public LauncherApps.Callback();
- method public abstract void onPackageAdded(java.lang.String, android.os.UserHandle);
- method public abstract void onPackageChanged(java.lang.String, android.os.UserHandle);
- method public abstract void onPackageRemoved(java.lang.String, android.os.UserHandle);
- method public abstract void onPackagesAvailable(java.lang.String[], android.os.UserHandle, boolean);
- method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle);
- method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle, android.os.Bundle);
- method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean);
- method public void onPackagesUnsuspended(java.lang.String[], android.os.UserHandle);
- method public void onShortcutsChanged(java.lang.String, java.util.List<android.content.pm.ShortcutInfo>, android.os.UserHandle);
+ method public abstract void onPackageAdded(String, android.os.UserHandle);
+ method public abstract void onPackageChanged(String, android.os.UserHandle);
+ method public abstract void onPackageRemoved(String, android.os.UserHandle);
+ method public abstract void onPackagesAvailable(String[], android.os.UserHandle, boolean);
+ method public void onPackagesSuspended(String[], android.os.UserHandle);
+ method public void onPackagesSuspended(String[], android.os.UserHandle, @Nullable android.os.Bundle);
+ method public abstract void onPackagesUnavailable(String[], android.os.UserHandle, boolean);
+ method public void onPackagesUnsuspended(String[], android.os.UserHandle);
+ method public void onShortcutsChanged(@NonNull String, @NonNull java.util.List<android.content.pm.ShortcutInfo>, @NonNull android.os.UserHandle);
}
public static final class LauncherApps.PinItemRequest implements android.os.Parcelable {
- method public boolean accept(android.os.Bundle);
+ method public boolean accept(@Nullable android.os.Bundle);
method public boolean accept();
method public int describeContents();
- method public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo(android.content.Context);
- method public android.os.Bundle getExtras();
+ method @Nullable public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo(android.content.Context);
+ method @Nullable public android.os.Bundle getExtras();
method public int getRequestType();
- method public android.content.pm.ShortcutInfo getShortcutInfo();
+ method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
method public boolean isValid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.LauncherApps.PinItemRequest> CREATOR;
@@ -11224,11 +11267,11 @@ package android.content.pm {
public static class LauncherApps.ShortcutQuery {
ctor public LauncherApps.ShortcutQuery();
- method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
+ method public android.content.pm.LauncherApps.ShortcutQuery setActivity(@Nullable android.content.ComponentName);
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
- method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
+ method public android.content.pm.LauncherApps.ShortcutQuery setPackage(@Nullable String);
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
- method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
+ method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(@Nullable java.util.List<java.lang.String>);
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
@@ -11238,8 +11281,8 @@ package android.content.pm {
public final class ModuleInfo implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getName();
- method public java.lang.String getPackageName();
+ method @Nullable public String getName();
+ method @Nullable public String getPackageName();
method public boolean isHidden();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.ModuleInfo> CREATOR;
@@ -11267,50 +11310,50 @@ package android.content.pm {
field public android.content.pm.InstrumentationInfo[] instrumentation;
field public boolean isApex;
field public long lastUpdateTime;
- field public java.lang.String packageName;
+ field public String packageName;
field public android.content.pm.PermissionInfo[] permissions;
field public android.content.pm.ProviderInfo[] providers;
field public android.content.pm.ActivityInfo[] receivers;
field public android.content.pm.FeatureInfo[] reqFeatures;
- field public deprecated java.lang.String[] requestedPermissions;
- field public deprecated int[] requestedPermissionsFlags;
+ field @Deprecated public String[] requestedPermissions;
+ field @Deprecated public int[] requestedPermissionsFlags;
field public android.content.pm.ServiceInfo[] services;
- field public java.lang.String sharedUserId;
+ field public String sharedUserId;
field public int sharedUserLabel;
- field public deprecated android.content.pm.Signature[] signatures;
+ field @Deprecated public android.content.pm.Signature[] signatures;
field public android.content.pm.SigningInfo signingInfo;
- field public java.lang.String[] splitNames;
+ field public String[] splitNames;
field public int[] splitRevisionCodes;
field public android.content.pm.UsesPermissionInfo[] usesPermissions;
- field public deprecated int versionCode;
- field public java.lang.String versionName;
+ field @Deprecated public int versionCode;
+ field public String versionName;
}
public class PackageInstaller {
method public void abandonSession(int);
- method public int createSession(android.content.pm.PackageInstaller.SessionParams) throws java.io.IOException;
- method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions();
- method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions();
- method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int);
- method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getStagedSessions();
- method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException;
- method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
- method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler);
- method public void uninstall(java.lang.String, android.content.IntentSender);
- method public void uninstall(android.content.pm.VersionedPackage, android.content.IntentSender);
- method public void unregisterSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
- method public void updateSessionAppIcon(int, android.graphics.Bitmap);
- method public void updateSessionAppLabel(int, java.lang.CharSequence);
- field public static final java.lang.String ACTION_SESSION_COMMITTED = "android.content.pm.action.SESSION_COMMITTED";
- field public static final java.lang.String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
- field public static final java.lang.String ACTION_SESSION_UPDATED = "android.content.pm.action.SESSION_UPDATED";
- field public static final java.lang.String EXTRA_OTHER_PACKAGE_NAME = "android.content.pm.extra.OTHER_PACKAGE_NAME";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
- field public static final java.lang.String EXTRA_SESSION = "android.content.pm.extra.SESSION";
- field public static final java.lang.String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
- field public static final java.lang.String EXTRA_STATUS = "android.content.pm.extra.STATUS";
- field public static final java.lang.String EXTRA_STATUS_MESSAGE = "android.content.pm.extra.STATUS_MESSAGE";
- field public static final java.lang.String EXTRA_STORAGE_PATH = "android.content.pm.extra.STORAGE_PATH";
+ method public int createSession(@NonNull android.content.pm.PackageInstaller.SessionParams) throws java.io.IOException;
+ method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions();
+ method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions();
+ method @Nullable public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int);
+ method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getStagedSessions();
+ method @NonNull public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException;
+ method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback);
+ method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull String, @NonNull android.content.IntentSender);
+ method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull android.content.pm.VersionedPackage, @NonNull android.content.IntentSender);
+ method public void unregisterSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback);
+ method public void updateSessionAppIcon(int, @Nullable android.graphics.Bitmap);
+ method public void updateSessionAppLabel(int, @Nullable CharSequence);
+ field public static final String ACTION_SESSION_COMMITTED = "android.content.pm.action.SESSION_COMMITTED";
+ field public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+ field public static final String ACTION_SESSION_UPDATED = "android.content.pm.action.SESSION_UPDATED";
+ field public static final String EXTRA_OTHER_PACKAGE_NAME = "android.content.pm.extra.OTHER_PACKAGE_NAME";
+ field public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
+ field public static final String EXTRA_SESSION = "android.content.pm.extra.SESSION";
+ field public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
+ field public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
+ field public static final String EXTRA_STATUS_MESSAGE = "android.content.pm.extra.STATUS_MESSAGE";
+ field public static final String EXTRA_STORAGE_PATH = "android.content.pm.extra.STORAGE_PATH";
field public static final int STATUS_FAILURE = 1; // 0x1
field public static final int STATUS_FAILURE_ABORTED = 3; // 0x3
field public static final int STATUS_FAILURE_BLOCKED = 2; // 0x2
@@ -11326,22 +11369,22 @@ package android.content.pm {
method public void abandon();
method public void addChildSessionId(int);
method public void close();
- method public void commit(android.content.IntentSender);
- method public void fsync(java.io.OutputStream) throws java.io.IOException;
- method public int[] getChildSessionIds();
- method public java.lang.String[] getNames() throws java.io.IOException;
+ method public void commit(@NonNull android.content.IntentSender);
+ method public void fsync(@NonNull java.io.OutputStream) throws java.io.IOException;
+ method @NonNull public int[] getChildSessionIds();
+ method @NonNull public String[] getNames() throws java.io.IOException;
method public int getParentSessionId();
method public boolean isMultiPackage();
method public boolean isStaged();
- method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException;
- method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
+ method @NonNull public java.io.InputStream openRead(@NonNull String) throws java.io.IOException;
+ method @NonNull public java.io.OutputStream openWrite(@NonNull String, long, long) throws java.io.IOException;
method public void removeChildSessionId(int);
- method public void removeSplit(java.lang.String) throws java.io.IOException;
+ method public void removeSplit(@NonNull String) throws java.io.IOException;
method public void setStagingProgress(float);
- method public void transfer(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void transfer(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
}
- public static abstract class PackageInstaller.SessionCallback {
+ public abstract static class PackageInstaller.SessionCallback {
ctor public PackageInstaller.SessionCallback();
method public abstract void onActiveChanged(int, boolean);
method public abstract void onBadgingChanged(int);
@@ -11351,21 +11394,21 @@ package android.content.pm {
}
public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
- method public android.content.Intent createDetailsIntent();
+ method @Nullable public android.content.Intent createDetailsIntent();
method public int describeContents();
- method public android.graphics.Bitmap getAppIcon();
- method public java.lang.CharSequence getAppLabel();
- method public java.lang.String getAppPackageName();
+ method @Nullable public android.graphics.Bitmap getAppIcon();
+ method @Nullable public CharSequence getAppLabel();
+ method @Nullable public String getAppPackageName();
method public int[] getChildSessionIds();
method public int getInstallLocation();
method public int getInstallReason();
- method public java.lang.String getInstallerPackageName();
+ method @Nullable public String getInstallerPackageName();
method public int getMode();
method public int getOriginatingUid();
- method public android.net.Uri getOriginatingUri();
+ method @Nullable public android.net.Uri getOriginatingUri();
method public int getParentSessionId();
method public float getProgress();
- method public android.net.Uri getReferrerUri();
+ method @Nullable public android.net.Uri getReferrerUri();
method public int getSessionId();
method public long getSize();
method public int getStagedSessionErrorCode();
@@ -11387,15 +11430,15 @@ package android.content.pm {
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
ctor public PackageInstaller.SessionParams(int);
method public int describeContents();
- method public void setAppIcon(android.graphics.Bitmap);
- method public void setAppLabel(java.lang.CharSequence);
- method public void setAppPackageName(java.lang.String);
+ method public void setAppIcon(@Nullable android.graphics.Bitmap);
+ method public void setAppLabel(@Nullable CharSequence);
+ method public void setAppPackageName(@Nullable String);
method public void setInstallLocation(int);
method public void setInstallReason(int);
method public void setMultiPackage();
method public void setOriginatingUid(int);
- method public void setOriginatingUri(android.net.Uri);
- method public void setReferrerUri(android.net.Uri);
+ method public void setOriginatingUri(@Nullable android.net.Uri);
+ method public void setReferrerUri(@Nullable android.net.Uri);
method public void setSize(long);
method public void setStaged();
method public void writeToParcel(android.os.Parcel, int);
@@ -11408,44 +11451,44 @@ package android.content.pm {
ctor public PackageItemInfo();
ctor public PackageItemInfo(android.content.pm.PackageItemInfo);
ctor protected PackageItemInfo(android.os.Parcel);
- method protected void dumpBack(android.util.Printer, java.lang.String);
- method protected void dumpFront(android.util.Printer, java.lang.String);
+ method protected void dumpBack(android.util.Printer, String);
+ method protected void dumpFront(android.util.Printer, String);
method public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager);
method public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager);
method public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
- method public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
+ method public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, String);
method public void writeToParcel(android.os.Parcel, int);
field public int banner;
field public int icon;
field public int labelRes;
field public int logo;
field public android.os.Bundle metaData;
- field public java.lang.String name;
- field public java.lang.CharSequence nonLocalizedLabel;
- field public java.lang.String packageName;
+ field public String name;
+ field public CharSequence nonLocalizedLabel;
+ field public String packageName;
}
- public static class PackageItemInfo.DisplayNameComparator implements java.util.Comparator {
+ public static class PackageItemInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.PackageItemInfo> {
ctor public PackageItemInfo.DisplayNameComparator(android.content.pm.PackageManager);
method public final int compare(android.content.pm.PackageItemInfo, android.content.pm.PackageItemInfo);
}
public abstract class PackageManager {
ctor public PackageManager();
- method public abstract deprecated void addPackageToPreferred(java.lang.String);
+ method @Deprecated public abstract void addPackageToPreferred(String);
method public abstract boolean addPermission(android.content.pm.PermissionInfo);
method public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
- method public abstract deprecated void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
+ method @Deprecated public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
method public abstract boolean canRequestPackageInstalls();
- method public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
- method public abstract int checkPermission(java.lang.String, java.lang.String);
- method public abstract int checkSignatures(java.lang.String, java.lang.String);
- method public abstract int checkSignatures(int, int);
+ method public abstract String[] canonicalToCurrentPackageNames(String[]);
+ method @CheckResult public abstract int checkPermission(String, String);
+ method @CheckResult public abstract int checkSignatures(String, String);
+ method @CheckResult public abstract int checkSignatures(int, int);
method public abstract void clearInstantAppCookie();
- method public abstract deprecated void clearPackagePreferredActivities(java.lang.String);
- method public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
+ method @Deprecated public abstract void clearPackagePreferredActivities(String);
+ method public abstract String[] currentToCanonicalPackageNames(String[]);
method public abstract void extendVerificationTimeout(int, int, long);
method public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -11456,85 +11499,85 @@ package android.content.pm {
method public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
method public abstract android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
- method public abstract android.graphics.drawable.Drawable getApplicationBanner(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract int getApplicationEnabledSetting(java.lang.String);
+ method public abstract android.graphics.drawable.Drawable getApplicationBanner(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract int getApplicationEnabledSetting(String);
method public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
- method public abstract android.graphics.drawable.Drawable getApplicationIcon(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
+ method public abstract android.graphics.drawable.Drawable getApplicationIcon(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract android.content.pm.ApplicationInfo getApplicationInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
method public abstract android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
- method public abstract android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.pm.ChangedPackages getChangedPackages(int);
+ method public abstract android.graphics.drawable.Drawable getApplicationLogo(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Nullable public abstract android.content.pm.ChangedPackages getChangedPackages(@IntRange(from=0) int);
method public abstract int getComponentEnabledSetting(android.content.ComponentName);
method public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
- method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
+ method public abstract android.graphics.drawable.Drawable getDrawable(String, @DrawableRes int, android.content.pm.ApplicationInfo);
method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
- method public java.util.List<android.content.pm.ModuleInfo> getInstalledModules(int);
+ method @NonNull public java.util.List<android.content.pm.ModuleInfo> getInstalledModules(int);
method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
- method public abstract java.lang.String getInstallerPackageName(java.lang.String);
- method public abstract byte[] getInstantAppCookie();
+ method @Nullable public abstract String getInstallerPackageName(String);
+ method @NonNull public abstract byte[] getInstantAppCookie();
method public abstract int getInstantAppCookieMaxBytes();
method public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
- method public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
- method public android.content.pm.ModuleInfo getModuleInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.lang.String getNameForUid(int);
- method public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
- method public abstract int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Nullable public abstract android.content.Intent getLaunchIntentForPackage(@NonNull String);
+ method @Nullable public abstract android.content.Intent getLeanbackLaunchIntentForPackage(@NonNull String);
+ method public android.content.pm.ModuleInfo getModuleInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Nullable public abstract String getNameForUid(int);
+ method public android.content.pm.PackageInfo getPackageArchiveInfo(String, int);
+ method public abstract int[] getPackageGids(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract int[] getPackageGids(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract android.content.pm.PackageInfo getPackageInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.pm.PackageInstaller getPackageInstaller();
- method public abstract int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.lang.String[] getPackagesForUid(int);
- method public abstract java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
- method public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract deprecated int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, java.lang.String);
- method public abstract deprecated java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
+ method @NonNull public abstract android.content.pm.PackageInstaller getPackageInstaller();
+ method public abstract int getPackageUid(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Nullable public abstract String[] getPackagesForUid(int);
+ method public abstract java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(String[], int);
+ method public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract android.content.pm.PermissionInfo getPermissionInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public abstract int getPreferredActivities(@NonNull java.util.List<android.content.IntentFilter>, @NonNull java.util.List<android.content.ComponentName>, String);
+ method @Deprecated public abstract java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
method public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract android.content.res.Resources getResourcesForApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
- method public android.os.Bundle getSuspendedPackageAppExtras();
+ method @NonNull public abstract java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
+ method @Nullable public android.os.Bundle getSuspendedPackageAppExtras();
method public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
- method public abstract java.lang.String[] getSystemSharedLibraryNames();
- method public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
+ method public abstract String[] getSystemSharedLibraryNames();
+ method public abstract CharSequence getText(String, @StringRes int, android.content.pm.ApplicationInfo);
method public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public abstract android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
- method public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
- method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
- method public boolean hasSigningCertificate(java.lang.String, byte[], int);
+ method public abstract CharSequence getUserBadgedLabel(CharSequence, android.os.UserHandle);
+ method public abstract android.content.res.XmlResourceParser getXml(String, @XmlRes int, android.content.pm.ApplicationInfo);
+ method public boolean hasSigningCertificate(String, byte[], int);
method public boolean hasSigningCertificate(int, byte[], int);
- method public abstract boolean hasSystemFeature(java.lang.String);
- method public abstract boolean hasSystemFeature(java.lang.String, int);
+ method public abstract boolean hasSystemFeature(String);
+ method public abstract boolean hasSystemFeature(String, int);
method public abstract boolean isInstantApp();
- method public abstract boolean isInstantApp(java.lang.String);
- method public boolean isPackageSuspended(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract boolean isInstantApp(String);
+ method public boolean isPackageSuspended(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public boolean isPackageSuspended();
- method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
+ method @CheckResult public abstract boolean isPermissionRevokedByPolicy(@NonNull String, @NonNull String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
- method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
- method public abstract java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int);
+ method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(String, int, int);
+ method public abstract java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(String, int);
method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
- method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+ method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(@Nullable android.content.ComponentName, @Nullable android.content.Intent[], android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
- method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract deprecated void removePackageFromPreferred(java.lang.String);
- method public abstract void removePermission(java.lang.String);
+ method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public abstract void removePackageFromPreferred(String);
+ method public abstract void removePermission(String);
method public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
- method public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
+ method public abstract android.content.pm.ProviderInfo resolveContentProvider(String, int);
method public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
- method public abstract void setApplicationCategoryHint(java.lang.String, int);
- method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
- method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
- method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
- method public abstract void updateInstantAppCookie(byte[]);
+ method public abstract void setApplicationCategoryHint(@NonNull String, int);
+ method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setApplicationEnabledSetting(String, int, int);
+ method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
+ method public abstract void setInstallerPackageName(String, String);
+ method public abstract void updateInstantAppCookie(@Nullable byte[]);
method public abstract void verifyPendingInstall(int, int);
field public static final int CERT_INPUT_RAW_X509 = 0; // 0x0
field public static final int CERT_INPUT_SHA256 = 1; // 0x1
@@ -11544,119 +11587,119 @@ package android.content.pm {
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
field public static final int DONT_KILL_APP = 1; // 0x1
- field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
- field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT";
- field public static final java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS = "android.software.activities_on_secondary_displays";
- field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets";
- field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
- field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output";
- field public static final java.lang.String FEATURE_AUDIO_PRO = "android.hardware.audio.pro";
- field public static final java.lang.String FEATURE_AUTOFILL = "android.software.autofill";
- field public static final java.lang.String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
- field public static final java.lang.String FEATURE_BACKUP = "android.software.backup";
- field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
- field public static final java.lang.String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
- field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
- field public static final java.lang.String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
- field public static final java.lang.String FEATURE_CAMERA_AR = "android.hardware.camera.ar";
- field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
- field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING = "android.hardware.camera.capability.manual_post_processing";
- field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR = "android.hardware.camera.capability.manual_sensor";
- field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_RAW = "android.hardware.camera.capability.raw";
- field public static final java.lang.String FEATURE_CAMERA_EXTERNAL = "android.hardware.camera.external";
- field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
- field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
- field public static final java.lang.String FEATURE_CAMERA_LEVEL_FULL = "android.hardware.camera.level.full";
- field public static final java.lang.String FEATURE_CANT_SAVE_STATE = "android.software.cant_save_state";
- field public static final java.lang.String FEATURE_COMPANION_DEVICE_SETUP = "android.software.companion_device_setup";
- field public static final java.lang.String FEATURE_CONNECTION_SERVICE = "android.software.connectionservice";
- field public static final java.lang.String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
- field public static final java.lang.String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
- field public static final java.lang.String FEATURE_EMBEDDED = "android.hardware.type.embedded";
- field public static final java.lang.String FEATURE_ETHERNET = "android.hardware.ethernet";
- field public static final java.lang.String FEATURE_FACE = "android.hardware.biometrics.face";
- field public static final java.lang.String FEATURE_FAKETOUCH = "android.hardware.faketouch";
- field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
- field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
- field public static final java.lang.String FEATURE_FINGERPRINT = "android.hardware.biometrics.fingerprint";
- field public static final java.lang.String FEATURE_FINGERPRINT_PRE_29 = "android.hardware.fingerprint";
- field public static final java.lang.String FEATURE_FREEFORM_WINDOW_MANAGEMENT = "android.software.freeform_window_management";
- field public static final java.lang.String FEATURE_GAMEPAD = "android.hardware.gamepad";
- field public static final java.lang.String FEATURE_HIFI_SENSORS = "android.hardware.sensor.hifi_sensors";
- field public static final java.lang.String FEATURE_HOME_SCREEN = "android.software.home_screen";
- field public static final java.lang.String FEATURE_INPUT_METHODS = "android.software.input_methods";
- field public static final java.lang.String FEATURE_IPSEC_TUNNELS = "android.software.ipsec_tunnels";
- field public static final java.lang.String FEATURE_IRIS = "android.hardware.biometrics.iris";
- field public static final java.lang.String FEATURE_LEANBACK = "android.software.leanback";
- field public static final java.lang.String FEATURE_LEANBACK_ONLY = "android.software.leanback_only";
- field public static final java.lang.String FEATURE_LIVE_TV = "android.software.live_tv";
- field public static final java.lang.String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
- field public static final java.lang.String FEATURE_LOCATION = "android.hardware.location";
- field public static final java.lang.String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
- field public static final java.lang.String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
- field public static final java.lang.String FEATURE_MANAGED_USERS = "android.software.managed_users";
- field public static final java.lang.String FEATURE_MICROPHONE = "android.hardware.microphone";
- field public static final java.lang.String FEATURE_MIDI = "android.software.midi";
- field public static final java.lang.String FEATURE_NFC = "android.hardware.nfc";
- field public static final java.lang.String FEATURE_NFC_BEAM = "android.sofware.nfc.beam";
- field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
- field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
- field public static final java.lang.String FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE = "android.hardware.nfc.ese";
- field public static final java.lang.String FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC = "android.hardware.nfc.uicc";
- field public static final java.lang.String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
- field public static final java.lang.String FEATURE_PC = "android.hardware.type.pc";
- field public static final java.lang.String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
- field public static final java.lang.String FEATURE_PRINTING = "android.software.print";
- field public static final java.lang.String FEATURE_RAM_LOW = "android.hardware.ram.low";
- field public static final java.lang.String FEATURE_RAM_NORMAL = "android.hardware.ram.normal";
- field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
- field public static final java.lang.String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
- field public static final java.lang.String FEATURE_SECURELY_REMOVES_USERS = "android.software.securely_removes_users";
- field public static final java.lang.String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
- field public static final java.lang.String FEATURE_SENSOR_AMBIENT_TEMPERATURE = "android.hardware.sensor.ambient_temperature";
- field public static final java.lang.String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
- field public static final java.lang.String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
- field public static final java.lang.String FEATURE_SENSOR_GYROSCOPE = "android.hardware.sensor.gyroscope";
- field public static final java.lang.String FEATURE_SENSOR_HEART_RATE = "android.hardware.sensor.heartrate";
- field public static final java.lang.String FEATURE_SENSOR_HEART_RATE_ECG = "android.hardware.sensor.heartrate.ecg";
- field public static final java.lang.String FEATURE_SENSOR_LIGHT = "android.hardware.sensor.light";
- field public static final java.lang.String FEATURE_SENSOR_PROXIMITY = "android.hardware.sensor.proximity";
- field public static final java.lang.String FEATURE_SENSOR_RELATIVE_HUMIDITY = "android.hardware.sensor.relative_humidity";
- field public static final java.lang.String FEATURE_SENSOR_STEP_COUNTER = "android.hardware.sensor.stepcounter";
- field public static final java.lang.String FEATURE_SENSOR_STEP_DETECTOR = "android.hardware.sensor.stepdetector";
- field public static final java.lang.String FEATURE_SIP = "android.software.sip";
- field public static final java.lang.String FEATURE_SIP_VOIP = "android.software.sip.voip";
- field public static final java.lang.String FEATURE_STRONGBOX_KEYSTORE = "android.hardware.strongbox_keystore";
- field public static final java.lang.String FEATURE_TELEPHONY = "android.hardware.telephony";
- field public static final java.lang.String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
- field public static final java.lang.String FEATURE_TELEPHONY_EUICC = "android.hardware.telephony.euicc";
- field public static final java.lang.String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
- field public static final java.lang.String FEATURE_TELEPHONY_MBMS = "android.hardware.telephony.mbms";
- field public static final deprecated java.lang.String FEATURE_TELEVISION = "android.hardware.type.television";
- field public static final java.lang.String FEATURE_TOUCHSCREEN = "android.hardware.touchscreen";
- field public static final java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
- field public static final java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct";
- field public static final java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND = "android.hardware.touchscreen.multitouch.jazzhand";
- field public static final java.lang.String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
- field public static final java.lang.String FEATURE_USB_HOST = "android.hardware.usb.host";
- field public static final java.lang.String FEATURE_VERIFIED_BOOT = "android.software.verified_boot";
- field public static final java.lang.String FEATURE_VR_HEADTRACKING = "android.hardware.vr.headtracking";
- field public static final deprecated java.lang.String FEATURE_VR_MODE = "android.software.vr.mode";
- field public static final java.lang.String FEATURE_VR_MODE_HIGH_PERFORMANCE = "android.hardware.vr.high_performance";
- field public static final java.lang.String FEATURE_VULKAN_HARDWARE_COMPUTE = "android.hardware.vulkan.compute";
- field public static final java.lang.String FEATURE_VULKAN_HARDWARE_LEVEL = "android.hardware.vulkan.level";
- field public static final java.lang.String FEATURE_VULKAN_HARDWARE_VERSION = "android.hardware.vulkan.version";
- field public static final java.lang.String FEATURE_WATCH = "android.hardware.type.watch";
- field public static final java.lang.String FEATURE_WEBVIEW = "android.software.webview";
- field public static final java.lang.String FEATURE_WIFI = "android.hardware.wifi";
- field public static final java.lang.String FEATURE_WIFI_AWARE = "android.hardware.wifi.aware";
- field public static final java.lang.String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
- field public static final java.lang.String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
- field public static final java.lang.String FEATURE_WIFI_RTT = "android.hardware.wifi.rtt";
+ field public static final String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
+ field public static final String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT";
+ field public static final String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS = "android.software.activities_on_secondary_displays";
+ field public static final String FEATURE_APP_WIDGETS = "android.software.app_widgets";
+ field public static final String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
+ field public static final String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output";
+ field public static final String FEATURE_AUDIO_PRO = "android.hardware.audio.pro";
+ field public static final String FEATURE_AUTOFILL = "android.software.autofill";
+ field public static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
+ field public static final String FEATURE_BACKUP = "android.software.backup";
+ field public static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
+ field public static final String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
+ field public static final String FEATURE_CAMERA = "android.hardware.camera";
+ field public static final String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
+ field public static final String FEATURE_CAMERA_AR = "android.hardware.camera.ar";
+ field public static final String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
+ field public static final String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING = "android.hardware.camera.capability.manual_post_processing";
+ field public static final String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR = "android.hardware.camera.capability.manual_sensor";
+ field public static final String FEATURE_CAMERA_CAPABILITY_RAW = "android.hardware.camera.capability.raw";
+ field public static final String FEATURE_CAMERA_EXTERNAL = "android.hardware.camera.external";
+ field public static final String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
+ field public static final String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
+ field public static final String FEATURE_CAMERA_LEVEL_FULL = "android.hardware.camera.level.full";
+ field public static final String FEATURE_CANT_SAVE_STATE = "android.software.cant_save_state";
+ field public static final String FEATURE_COMPANION_DEVICE_SETUP = "android.software.companion_device_setup";
+ field public static final String FEATURE_CONNECTION_SERVICE = "android.software.connectionservice";
+ field public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
+ field public static final String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
+ field public static final String FEATURE_EMBEDDED = "android.hardware.type.embedded";
+ field public static final String FEATURE_ETHERNET = "android.hardware.ethernet";
+ field public static final String FEATURE_FACE = "android.hardware.biometrics.face";
+ field public static final String FEATURE_FAKETOUCH = "android.hardware.faketouch";
+ field public static final String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
+ field public static final String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
+ field public static final String FEATURE_FINGERPRINT = "android.hardware.biometrics.fingerprint";
+ field public static final String FEATURE_FINGERPRINT_PRE_29 = "android.hardware.fingerprint";
+ field public static final String FEATURE_FREEFORM_WINDOW_MANAGEMENT = "android.software.freeform_window_management";
+ field public static final String FEATURE_GAMEPAD = "android.hardware.gamepad";
+ field public static final String FEATURE_HIFI_SENSORS = "android.hardware.sensor.hifi_sensors";
+ field public static final String FEATURE_HOME_SCREEN = "android.software.home_screen";
+ field public static final String FEATURE_INPUT_METHODS = "android.software.input_methods";
+ field public static final String FEATURE_IPSEC_TUNNELS = "android.software.ipsec_tunnels";
+ field public static final String FEATURE_IRIS = "android.hardware.biometrics.iris";
+ field public static final String FEATURE_LEANBACK = "android.software.leanback";
+ field public static final String FEATURE_LEANBACK_ONLY = "android.software.leanback_only";
+ field public static final String FEATURE_LIVE_TV = "android.software.live_tv";
+ field public static final String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
+ field public static final String FEATURE_LOCATION = "android.hardware.location";
+ field public static final String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
+ field public static final String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
+ field public static final String FEATURE_MANAGED_USERS = "android.software.managed_users";
+ field public static final String FEATURE_MICROPHONE = "android.hardware.microphone";
+ field public static final String FEATURE_MIDI = "android.software.midi";
+ field public static final String FEATURE_NFC = "android.hardware.nfc";
+ field public static final String FEATURE_NFC_BEAM = "android.sofware.nfc.beam";
+ field public static final String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
+ field public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
+ field public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE = "android.hardware.nfc.ese";
+ field public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC = "android.hardware.nfc.uicc";
+ field public static final String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
+ field public static final String FEATURE_PC = "android.hardware.type.pc";
+ field public static final String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
+ field public static final String FEATURE_PRINTING = "android.software.print";
+ field public static final String FEATURE_RAM_LOW = "android.hardware.ram.low";
+ field public static final String FEATURE_RAM_NORMAL = "android.hardware.ram.normal";
+ field public static final String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
+ field public static final String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
+ field public static final String FEATURE_SECURELY_REMOVES_USERS = "android.software.securely_removes_users";
+ field public static final String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
+ field public static final String FEATURE_SENSOR_AMBIENT_TEMPERATURE = "android.hardware.sensor.ambient_temperature";
+ field public static final String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
+ field public static final String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
+ field public static final String FEATURE_SENSOR_GYROSCOPE = "android.hardware.sensor.gyroscope";
+ field public static final String FEATURE_SENSOR_HEART_RATE = "android.hardware.sensor.heartrate";
+ field public static final String FEATURE_SENSOR_HEART_RATE_ECG = "android.hardware.sensor.heartrate.ecg";
+ field public static final String FEATURE_SENSOR_LIGHT = "android.hardware.sensor.light";
+ field public static final String FEATURE_SENSOR_PROXIMITY = "android.hardware.sensor.proximity";
+ field public static final String FEATURE_SENSOR_RELATIVE_HUMIDITY = "android.hardware.sensor.relative_humidity";
+ field public static final String FEATURE_SENSOR_STEP_COUNTER = "android.hardware.sensor.stepcounter";
+ field public static final String FEATURE_SENSOR_STEP_DETECTOR = "android.hardware.sensor.stepdetector";
+ field public static final String FEATURE_SIP = "android.software.sip";
+ field public static final String FEATURE_SIP_VOIP = "android.software.sip.voip";
+ field public static final String FEATURE_STRONGBOX_KEYSTORE = "android.hardware.strongbox_keystore";
+ field public static final String FEATURE_TELEPHONY = "android.hardware.telephony";
+ field public static final String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
+ field public static final String FEATURE_TELEPHONY_EUICC = "android.hardware.telephony.euicc";
+ field public static final String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
+ field public static final String FEATURE_TELEPHONY_MBMS = "android.hardware.telephony.mbms";
+ field @Deprecated public static final String FEATURE_TELEVISION = "android.hardware.type.television";
+ field public static final String FEATURE_TOUCHSCREEN = "android.hardware.touchscreen";
+ field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
+ field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct";
+ field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND = "android.hardware.touchscreen.multitouch.jazzhand";
+ field public static final String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
+ field public static final String FEATURE_USB_HOST = "android.hardware.usb.host";
+ field public static final String FEATURE_VERIFIED_BOOT = "android.software.verified_boot";
+ field public static final String FEATURE_VR_HEADTRACKING = "android.hardware.vr.headtracking";
+ field @Deprecated public static final String FEATURE_VR_MODE = "android.software.vr.mode";
+ field public static final String FEATURE_VR_MODE_HIGH_PERFORMANCE = "android.hardware.vr.high_performance";
+ field public static final String FEATURE_VULKAN_HARDWARE_COMPUTE = "android.hardware.vulkan.compute";
+ field public static final String FEATURE_VULKAN_HARDWARE_LEVEL = "android.hardware.vulkan.level";
+ field public static final String FEATURE_VULKAN_HARDWARE_VERSION = "android.hardware.vulkan.version";
+ field public static final String FEATURE_WATCH = "android.hardware.type.watch";
+ field public static final String FEATURE_WEBVIEW = "android.software.webview";
+ field public static final String FEATURE_WIFI = "android.hardware.wifi";
+ field public static final String FEATURE_WIFI_AWARE = "android.hardware.wifi.aware";
+ field public static final String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
+ field public static final String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
+ field public static final String FEATURE_WIFI_RTT = "android.hardware.wifi.rtt";
field public static final int GET_ACTIVITIES = 1; // 0x1
field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
- field public static final deprecated int GET_DISABLED_COMPONENTS = 512; // 0x200
- field public static final deprecated int GET_DISABLED_UNTIL_USED_COMPONENTS = 32768; // 0x8000
+ field @Deprecated public static final int GET_DISABLED_COMPONENTS = 512; // 0x200
+ field @Deprecated public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 32768; // 0x8000
field public static final int GET_GIDS = 256; // 0x100
field public static final int GET_INSTRUMENTATION = 16; // 0x10
field public static final int GET_INTENT_FILTERS = 32; // 0x20
@@ -11667,9 +11710,9 @@ package android.content.pm {
field public static final int GET_RESOLVED_FILTER = 64; // 0x40
field public static final int GET_SERVICES = 4; // 0x4
field public static final int GET_SHARED_LIBRARY_FILES = 1024; // 0x400
- field public static final deprecated int GET_SIGNATURES = 64; // 0x40
+ field @Deprecated public static final int GET_SIGNATURES = 64; // 0x40
field public static final int GET_SIGNING_CERTIFICATES = 134217728; // 0x8000000
- field public static final deprecated int GET_UNINSTALLED_PACKAGES = 8192; // 0x2000
+ field @Deprecated public static final int GET_UNINSTALLED_PACKAGES = 8192; // 0x2000
field public static final int GET_URI_PERMISSION_PATTERNS = 2048; // 0x800
field public static final int INSTALL_REASON_DEVICE_RESTORE = 2; // 0x2
field public static final int INSTALL_REASON_DEVICE_SETUP = 3; // 0x3
@@ -11702,32 +11745,32 @@ package android.content.pm {
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
ctor public PackageManager.NameNotFoundException();
- ctor public PackageManager.NameNotFoundException(java.lang.String);
- }
-
- public deprecated class PackageStats implements android.os.Parcelable {
- ctor public PackageStats(java.lang.String);
- ctor public PackageStats(android.os.Parcel);
- ctor public PackageStats(android.content.pm.PackageStats);
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.content.pm.PackageStats> CREATOR;
- field public long cacheSize;
- field public long codeSize;
- field public long dataSize;
- field public long externalCacheSize;
- field public long externalCodeSize;
- field public long externalDataSize;
- field public long externalMediaSize;
- field public long externalObbSize;
- field public java.lang.String packageName;
+ ctor public PackageManager.NameNotFoundException(String);
+ }
+
+ @Deprecated public class PackageStats implements android.os.Parcelable {
+ ctor @Deprecated public PackageStats(String);
+ ctor @Deprecated public PackageStats(android.os.Parcel);
+ ctor @Deprecated public PackageStats(android.content.pm.PackageStats);
+ method @Deprecated public int describeContents();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.content.pm.PackageStats> CREATOR;
+ field @Deprecated public long cacheSize;
+ field @Deprecated public long codeSize;
+ field @Deprecated public long dataSize;
+ field @Deprecated public long externalCacheSize;
+ field @Deprecated public long externalCodeSize;
+ field @Deprecated public long externalDataSize;
+ field @Deprecated public long externalMediaSize;
+ field @Deprecated public long externalObbSize;
+ field @Deprecated public String packageName;
}
public class PathPermission extends android.os.PatternMatcher {
- ctor public PathPermission(java.lang.String, int, java.lang.String, java.lang.String);
+ ctor public PathPermission(String, int, String, String);
ctor public PathPermission(android.os.Parcel);
- method public java.lang.String getReadPermission();
- method public java.lang.String getWritePermission();
+ method public String getReadPermission();
+ method public String getWritePermission();
field public static final android.os.Parcelable.Creator<android.content.pm.PathPermission> CREATOR;
}
@@ -11735,12 +11778,12 @@ package android.content.pm {
ctor public PermissionGroupInfo();
ctor public PermissionGroupInfo(android.content.pm.PermissionGroupInfo);
method public int describeContents();
- method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+ method public CharSequence loadDescription(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator<android.content.pm.PermissionGroupInfo> CREATOR;
field public static final int FLAG_PERSONAL_INFO = 1; // 0x1
field public int descriptionRes;
field public int flags;
- field public java.lang.CharSequence nonLocalizedDescription;
+ field public CharSequence nonLocalizedDescription;
field public int priority;
}
@@ -11750,7 +11793,7 @@ package android.content.pm {
method public int describeContents();
method public int getProtection();
method public int getProtectionFlags();
- method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+ method public CharSequence loadDescription(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
field public static final int FLAG_COSTS_MONEY = 1; // 0x1
field public static final int FLAG_INSTALLED = 1073741824; // 0x40000000
@@ -11764,18 +11807,18 @@ package android.content.pm {
field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10
field public static final int PROTECTION_FLAG_RUNTIME_ONLY = 8192; // 0x2000
field public static final int PROTECTION_FLAG_SETUP = 2048; // 0x800
- field public static final deprecated int PROTECTION_FLAG_SYSTEM = 16; // 0x10
+ field @Deprecated public static final int PROTECTION_FLAG_SYSTEM = 16; // 0x10
field public static final int PROTECTION_FLAG_VERIFIER = 512; // 0x200
- field public static final deprecated int PROTECTION_MASK_BASE = 15; // 0xf
- field public static final deprecated int PROTECTION_MASK_FLAGS = 65520; // 0xfff0
+ field @Deprecated public static final int PROTECTION_MASK_BASE = 15; // 0xf
+ field @Deprecated public static final int PROTECTION_MASK_FLAGS = 65520; // 0xfff0
field public static final int PROTECTION_NORMAL = 0; // 0x0
field public static final int PROTECTION_SIGNATURE = 2; // 0x2
- field public static final deprecated int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3
+ field @Deprecated public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3
field public int descriptionRes;
field public int flags;
- field public java.lang.String group;
- field public java.lang.CharSequence nonLocalizedDescription;
- field public deprecated int protectionLevel;
+ field public String group;
+ field public CharSequence nonLocalizedDescription;
+ field @Deprecated public int protectionLevel;
field public boolean usageInfoRequired;
}
@@ -11783,29 +11826,29 @@ package android.content.pm {
ctor public ProviderInfo();
ctor public ProviderInfo(android.content.pm.ProviderInfo);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
field public static final android.os.Parcelable.Creator<android.content.pm.ProviderInfo> CREATOR;
field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000
- field public java.lang.String authority;
+ field public String authority;
field public int flags;
field public boolean grantUriPermissions;
field public int initOrder;
- field public deprecated boolean isSyncable;
+ field @Deprecated public boolean isSyncable;
field public boolean multiprocess;
field public android.content.pm.PathPermission[] pathPermissions;
- field public java.lang.String readPermission;
+ field public String readPermission;
field public android.os.PatternMatcher[] uriPermissionPatterns;
- field public java.lang.String writePermission;
+ field public String writePermission;
}
public class ResolveInfo implements android.os.Parcelable {
ctor public ResolveInfo();
ctor public ResolveInfo(android.content.pm.ResolveInfo);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public final int getIconResource();
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.ResolveInfo> CREATOR;
field public android.content.pm.ActivityInfo activityInfo;
@@ -11815,16 +11858,16 @@ package android.content.pm {
field public boolean isInstantAppAvailable;
field public int labelRes;
field public int match;
- field public java.lang.CharSequence nonLocalizedLabel;
+ field public CharSequence nonLocalizedLabel;
field public int preferredOrder;
field public int priority;
field public android.content.pm.ProviderInfo providerInfo;
- field public java.lang.String resolvePackageName;
+ field public String resolvePackageName;
field public android.content.pm.ServiceInfo serviceInfo;
field public int specificIndex;
}
- public static class ResolveInfo.DisplayNameComparator implements java.util.Comparator {
+ public static class ResolveInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.ResolveInfo> {
ctor public ResolveInfo.DisplayNameComparator(android.content.pm.PackageManager);
method public final int compare(android.content.pm.ResolveInfo, android.content.pm.ResolveInfo);
}
@@ -11833,7 +11876,7 @@ package android.content.pm {
ctor public ServiceInfo();
ctor public ServiceInfo(android.content.pm.ServiceInfo);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public int getForegroundServiceType();
field public static final android.os.Parcelable.Creator<android.content.pm.ServiceInfo> CREATOR;
field public static final int FLAG_EXTERNAL_SERVICE = 4; // 0x4
@@ -11849,17 +11892,17 @@ package android.content.pm {
field public static final int FOREGROUND_SERVICE_TYPE_SYNC = 1; // 0x1
field public static final int FOREGROUND_SERVICE_TYPE_UNSPECIFIED = 0; // 0x0
field public int flags;
- field public java.lang.String permission;
+ field public String permission;
}
public final class SharedLibraryInfo implements android.os.Parcelable {
method public int describeContents();
- method public android.content.pm.VersionedPackage getDeclaringPackage();
- method public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
- method public long getLongVersion();
- method public java.lang.String getName();
+ method @NonNull public android.content.pm.VersionedPackage getDeclaringPackage();
+ method @NonNull public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
+ method @IntRange(from=0xffffffff) public long getLongVersion();
+ method public String getName();
method public int getType();
- method public deprecated int getVersion();
+ method @Deprecated @IntRange(from=0xffffffff) public int getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.SharedLibraryInfo> CREATOR;
field public static final int TYPE_BUILTIN = 0; // 0x0
@@ -11870,19 +11913,19 @@ package android.content.pm {
public final class ShortcutInfo implements android.os.Parcelable {
method public int describeContents();
- method public android.content.ComponentName getActivity();
- method public java.util.Set<java.lang.String> getCategories();
- method public java.lang.CharSequence getDisabledMessage();
+ method @Nullable public android.content.ComponentName getActivity();
+ method @Nullable public java.util.Set<java.lang.String> getCategories();
+ method @Nullable public CharSequence getDisabledMessage();
method public int getDisabledReason();
- method public android.os.PersistableBundle getExtras();
- method public java.lang.String getId();
- method public android.content.Intent getIntent();
- method public android.content.Intent[] getIntents();
+ method @Nullable public android.os.PersistableBundle getExtras();
+ method @NonNull public String getId();
+ method @Nullable public android.content.Intent getIntent();
+ method @Nullable public android.content.Intent[] getIntents();
method public long getLastChangedTimestamp();
- method public java.lang.CharSequence getLongLabel();
- method public java.lang.String getPackage();
+ method @Nullable public CharSequence getLongLabel();
+ method @NonNull public String getPackage();
method public int getRank();
- method public java.lang.CharSequence getShortLabel();
+ method @Nullable public CharSequence getShortLabel();
method public android.os.UserHandle getUserHandle();
method public boolean hasKeyFieldsOnly();
method public boolean isDeclaredInManifest();
@@ -11900,54 +11943,57 @@ package android.content.pm {
field public static final int DISABLED_REASON_SIGNATURE_MISMATCH = 102; // 0x66
field public static final int DISABLED_REASON_UNKNOWN = 3; // 0x3
field public static final int DISABLED_REASON_VERSION_LOWER = 100; // 0x64
- field public static final java.lang.String SHORTCUT_CATEGORY_CONVERSATION = "android.shortcut.conversation";
+ field public static final String SHORTCUT_CATEGORY_CONVERSATION = "android.shortcut.conversation";
}
public static class ShortcutInfo.Builder {
- ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
- method public android.content.pm.ShortcutInfo build();
- method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
- method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
- method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
- method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
- method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
- method public android.content.pm.ShortcutInfo.Builder setIntent(android.content.Intent);
- method public android.content.pm.ShortcutInfo.Builder setIntents(android.content.Intent[]);
- method public android.content.pm.ShortcutInfo.Builder setLongLabel(java.lang.CharSequence);
- method public android.content.pm.ShortcutInfo.Builder setRank(int);
- method public android.content.pm.ShortcutInfo.Builder setShortLabel(java.lang.CharSequence);
+ ctor public ShortcutInfo.Builder(android.content.Context, String);
+ method @NonNull public android.content.pm.ShortcutInfo build();
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setActivity(@NonNull android.content.ComponentName);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setDisabledMessage(@NonNull CharSequence);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setExtras(@NonNull android.os.PersistableBundle);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setIntent(@NonNull android.content.Intent);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setIntents(@NonNull android.content.Intent[]);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setLongLabel(@NonNull CharSequence);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setLongLived();
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setPerson(@NonNull android.app.Person);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setPersons(@NonNull android.app.Person[]);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setRank(int);
+ method @NonNull public android.content.pm.ShortcutInfo.Builder setShortLabel(@NonNull CharSequence);
}
public class ShortcutManager {
- method public boolean addDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public android.content.Intent createShortcutResultIntent(android.content.pm.ShortcutInfo);
- method public void disableShortcuts(java.util.List<java.lang.String>);
- method public void disableShortcuts(java.util.List<java.lang.String>, java.lang.CharSequence);
- method public void enableShortcuts(java.util.List<java.lang.String>);
- method public java.util.List<android.content.pm.ShortcutInfo> getDynamicShortcuts();
+ method public boolean addDynamicShortcuts(@NonNull java.util.List<android.content.pm.ShortcutInfo>);
+ method public android.content.Intent createShortcutResultIntent(@NonNull android.content.pm.ShortcutInfo);
+ method public void disableShortcuts(@NonNull java.util.List<java.lang.String>);
+ method public void disableShortcuts(@NonNull java.util.List<java.lang.String>, CharSequence);
+ method public void enableShortcuts(@NonNull java.util.List<java.lang.String>);
+ method @NonNull public java.util.List<android.content.pm.ShortcutInfo> getDynamicShortcuts();
method public int getIconMaxHeight();
method public int getIconMaxWidth();
- method public java.util.List<android.content.pm.ShortcutInfo> getManifestShortcuts();
+ method @NonNull public java.util.List<android.content.pm.ShortcutInfo> getManifestShortcuts();
method public int getMaxShortcutCountPerActivity();
- method public java.util.List<android.content.pm.ShortcutInfo> getPinnedShortcuts();
+ method @NonNull public java.util.List<android.content.pm.ShortcutInfo> getPinnedShortcuts();
method public boolean isRateLimitingActive();
method public boolean isRequestPinShortcutSupported();
method public void removeAllDynamicShortcuts();
- method public void removeDynamicShortcuts(java.util.List<java.lang.String>);
- method public void reportShortcutUsed(java.lang.String);
- method public boolean requestPinShortcut(android.content.pm.ShortcutInfo, android.content.IntentSender);
- method public boolean setDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public boolean updateShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
+ method public void removeDynamicShortcuts(@NonNull java.util.List<java.lang.String>);
+ method public void reportShortcutUsed(String);
+ method public boolean requestPinShortcut(@NonNull android.content.pm.ShortcutInfo, @Nullable android.content.IntentSender);
+ method public boolean setDynamicShortcuts(@NonNull java.util.List<android.content.pm.ShortcutInfo>);
+ method public boolean updateShortcuts(@NonNull java.util.List<android.content.pm.ShortcutInfo>);
}
public class Signature implements android.os.Parcelable {
ctor public Signature(byte[]);
- ctor public Signature(java.lang.String);
+ ctor public Signature(String);
method public int describeContents();
method public byte[] toByteArray();
method public char[] toChars();
method public char[] toChars(char[], int[]);
- method public java.lang.String toCharsString();
+ method public String toCharsString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.Signature> CREATOR;
}
@@ -11972,7 +12018,7 @@ package android.content.pm {
method public int getDataSharedWithThirdParty();
method public int getDataUsedForMonetization();
method public int getFlags();
- method public java.lang.String getPermission();
+ method public String getPermission();
field public static final android.os.Parcelable.Creator<android.content.pm.UsesPermissionInfo> CREATOR;
field public static final int FLAG_REQUESTED_PERMISSION_GRANTED = 2; // 0x2
field public static final int RETENTION_NOT_RETAINED = 1; // 0x1
@@ -11987,12 +12033,12 @@ package android.content.pm {
}
public final class VersionedPackage implements android.os.Parcelable {
- ctor public VersionedPackage(java.lang.String, int);
- ctor public VersionedPackage(java.lang.String, long);
+ ctor public VersionedPackage(@NonNull String, int);
+ ctor public VersionedPackage(@NonNull String, long);
method public int describeContents();
method public long getLongVersionCode();
- method public java.lang.String getPackageName();
- method public deprecated int getVersionCode();
+ method @NonNull public String getPackageName();
+ method @Deprecated public int getVersionCode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.VersionedPackage> CREATOR;
}
@@ -12021,7 +12067,6 @@ package android.content.res {
public static class AssetFileDescriptor.AutoCloseInputStream extends android.os.ParcelFileDescriptor.AutoCloseInputStream {
ctor public AssetFileDescriptor.AutoCloseInputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
- method public void mark(int);
}
public static class AssetFileDescriptor.AutoCloseOutputStream extends android.os.ParcelFileDescriptor.AutoCloseOutputStream {
@@ -12030,15 +12075,15 @@ package android.content.res {
public final class AssetManager implements java.lang.AutoCloseable {
method public void close();
- method public java.lang.String[] getLocales();
- method public java.lang.String[] list(java.lang.String) throws java.io.IOException;
- method public java.io.InputStream open(java.lang.String) throws java.io.IOException;
- method public java.io.InputStream open(java.lang.String, int) throws java.io.IOException;
- method public android.content.res.AssetFileDescriptor openFd(java.lang.String) throws java.io.IOException;
- method public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String) throws java.io.IOException;
- method public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String) throws java.io.IOException;
- method public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String) throws java.io.IOException;
- method public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String) throws java.io.IOException;
+ method public String[] getLocales();
+ method @Nullable public String[] list(@NonNull String) throws java.io.IOException;
+ method @NonNull public java.io.InputStream open(@NonNull String) throws java.io.IOException;
+ method @NonNull public java.io.InputStream open(@NonNull String, int) throws java.io.IOException;
+ method @NonNull public android.content.res.AssetFileDescriptor openFd(@NonNull String) throws java.io.IOException;
+ method @NonNull public android.content.res.AssetFileDescriptor openNonAssetFd(@NonNull String) throws java.io.IOException;
+ method @NonNull public android.content.res.AssetFileDescriptor openNonAssetFd(int, @NonNull String) throws java.io.IOException;
+ method @NonNull public android.content.res.XmlResourceParser openXmlResourceParser(@NonNull String) throws java.io.IOException;
+ method @NonNull public android.content.res.XmlResourceParser openXmlResourceParser(int, @NonNull String) throws java.io.IOException;
field public static final int ACCESS_BUFFER = 3; // 0x3
field public static final int ACCESS_RANDOM = 1; // 0x1
field public static final int ACCESS_STREAMING = 2; // 0x2
@@ -12046,28 +12091,26 @@ package android.content.res {
}
public final class AssetManager.AssetInputStream extends java.io.InputStream {
- method public void mark(int);
method public int read() throws java.io.IOException;
- method public void reset() throws java.io.IOException;
}
public class ColorStateList implements android.os.Parcelable {
- ctor public ColorStateList(int[][], int[]);
- method public static deprecated android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ ctor public ColorStateList(int[][], @ColorInt int[]);
+ method @Deprecated @NonNull public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @NonNull public static android.content.res.ColorStateList createFromXml(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @Nullable android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
method public int getChangingConfigurations();
- method public int getColorForState(int[], int);
- method public int getDefaultColor();
+ method public int getColorForState(@Nullable int[], int);
+ method @ColorInt public int getDefaultColor();
method public boolean isOpaque();
method public boolean isStateful();
- method public static android.content.res.ColorStateList valueOf(int);
- method public android.content.res.ColorStateList withAlpha(int);
+ method @NonNull public static android.content.res.ColorStateList valueOf(@ColorInt int);
+ method @NonNull public android.content.res.ColorStateList withAlpha(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.res.ColorStateList> CREATOR;
}
- public final class Configuration implements java.lang.Comparable android.os.Parcelable {
+ public final class Configuration implements java.lang.Comparable<android.content.res.Configuration> android.os.Parcelable {
ctor public Configuration();
ctor public Configuration(android.content.res.Configuration);
method public int compareTo(android.content.res.Configuration);
@@ -12075,7 +12118,7 @@ package android.content.res {
method public int diff(android.content.res.Configuration);
method public boolean equals(android.content.res.Configuration);
method public int getLayoutDirection();
- method public android.os.LocaleList getLocales();
+ method @NonNull public android.os.LocaleList getLocales();
method public boolean isLayoutSizeAtLeast(int);
method public boolean isScreenHdr();
method public boolean isScreenRound();
@@ -12083,11 +12126,11 @@ package android.content.res {
method public static boolean needNewResources(int, int);
method public void readFromParcel(android.os.Parcel);
method public void setLayoutDirection(java.util.Locale);
- method public void setLocale(java.util.Locale);
- method public void setLocales(android.os.LocaleList);
+ method public void setLocale(@Nullable java.util.Locale);
+ method public void setLocales(@Nullable android.os.LocaleList);
method public void setTo(android.content.res.Configuration);
method public void setToDefaults();
- method public int updateFrom(android.content.res.Configuration);
+ method public int updateFrom(@NonNull android.content.res.Configuration);
method public void writeToParcel(android.os.Parcel, int);
field public static final int COLOR_MODE_HDR_MASK = 12; // 0xc
field public static final int COLOR_MODE_HDR_NO = 4; // 0x4
@@ -12122,7 +12165,7 @@ package android.content.res {
field public static final int NAVIGATION_WHEEL = 4; // 0x4
field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2
field public static final int ORIENTATION_PORTRAIT = 1; // 0x1
- field public static final deprecated int ORIENTATION_SQUARE = 3; // 0x3
+ field @Deprecated public static final int ORIENTATION_SQUARE = 3; // 0x3
field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
field public static final int SCREENLAYOUT_LAYOUTDIR_LTR = 64; // 0x40
field public static final int SCREENLAYOUT_LAYOUTDIR_MASK = 192; // 0xc0
@@ -12149,7 +12192,7 @@ package android.content.res {
field public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0; // 0x0
field public static final int TOUCHSCREEN_FINGER = 3; // 0x3
field public static final int TOUCHSCREEN_NOTOUCH = 1; // 0x1
- field public static final deprecated int TOUCHSCREEN_STYLUS = 2; // 0x2
+ field @Deprecated public static final int TOUCHSCREEN_STYLUS = 2; // 0x2
field public static final int TOUCHSCREEN_UNDEFINED = 0; // 0x0
field public static final int UI_MODE_NIGHT_MASK = 48; // 0x30
field public static final int UI_MODE_NIGHT_NO = 16; // 0x10
@@ -12170,7 +12213,7 @@ package android.content.res {
field public int hardKeyboardHidden;
field public int keyboard;
field public int keyboardHidden;
- field public deprecated java.util.Locale locale;
+ field @Deprecated public java.util.Locale locale;
field public int mcc;
field public int mnc;
field public int navigation;
@@ -12189,128 +12232,130 @@ package android.content.res {
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.res.ObbInfo> CREATOR;
field public static final int OBB_OVERLAY = 1; // 0x1
- field public java.lang.String filename;
+ field public String filename;
field public int flags;
- field public java.lang.String packageName;
+ field public String packageName;
field public int version;
}
public class ObbScanner {
- method public static android.content.res.ObbInfo getObbInfo(java.lang.String) throws java.io.IOException;
+ method public static android.content.res.ObbInfo getObbInfo(String) throws java.io.IOException;
}
public class Resources {
- ctor public deprecated Resources(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
+ ctor @Deprecated public Resources(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
method public final void finishPreloading();
method public final void flushLayoutCache();
- method public android.content.res.XmlResourceParser getAnimation(int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.XmlResourceParser getAnimation(@AnimatorRes @AnimRes int) throws android.content.res.Resources.NotFoundException;
method public final android.content.res.AssetManager getAssets();
- method public boolean getBoolean(int) throws android.content.res.Resources.NotFoundException;
- method public deprecated int getColor(int) throws android.content.res.Resources.NotFoundException;
- method public int getColor(int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
- method public deprecated android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.ColorStateList getColorStateList(int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+ method public boolean getBoolean(@BoolRes int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated @ColorInt public int getColor(@ColorRes int) throws android.content.res.Resources.NotFoundException;
+ method @ColorInt public int getColor(@ColorRes int, @Nullable android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated @NonNull public android.content.res.ColorStateList getColorStateList(@ColorRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.ColorStateList getColorStateList(@ColorRes int, @Nullable android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
method public android.content.res.Configuration getConfiguration();
- method public float getDimension(int) throws android.content.res.Resources.NotFoundException;
- method public int getDimensionPixelOffset(int) throws android.content.res.Resources.NotFoundException;
- method public int getDimensionPixelSize(int) throws android.content.res.Resources.NotFoundException;
+ method public float getDimension(@DimenRes int) throws android.content.res.Resources.NotFoundException;
+ method public int getDimensionPixelOffset(@DimenRes int) throws android.content.res.Resources.NotFoundException;
+ method public int getDimensionPixelSize(@DimenRes int) throws android.content.res.Resources.NotFoundException;
method public android.util.DisplayMetrics getDisplayMetrics();
- method public deprecated android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
- method public android.graphics.drawable.Drawable getDrawable(int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
- method public deprecated android.graphics.drawable.Drawable getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
- method public android.graphics.drawable.Drawable getDrawableForDensity(int, int, android.content.res.Resources.Theme);
- method public float getFloat(int);
- method public android.graphics.Typeface getFont(int) throws android.content.res.Resources.NotFoundException;
- method public float getFraction(int, int, int);
- method public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
- method public int[] getIntArray(int) throws android.content.res.Resources.NotFoundException;
- method public int getInteger(int) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.XmlResourceParser getLayout(int) throws android.content.res.Resources.NotFoundException;
- method public deprecated android.graphics.Movie getMovie(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getQuantityString(int, int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getQuantityString(int, int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.CharSequence getQuantityText(int, int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getResourceEntryName(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getResourceName(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getResourcePackageName(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getResourceTypeName(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getString(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String getString(int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
- method public java.lang.String[] getStringArray(int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getDrawable(@DrawableRes int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(@DrawableRes int, @Nullable android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@DrawableRes int, int) throws android.content.res.Resources.NotFoundException;
+ method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@DrawableRes int, int, @Nullable android.content.res.Resources.Theme);
+ method public float getFloat(@DimenRes int);
+ method @NonNull public android.graphics.Typeface getFont(@FontRes int) throws android.content.res.Resources.NotFoundException;
+ method public float getFraction(@FractionRes int, int, int);
+ method public int getIdentifier(String, String, String);
+ method @NonNull public int[] getIntArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
+ method public int getInteger(@IntegerRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.XmlResourceParser getLayout(@LayoutRes int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public android.graphics.Movie getMovie(@RawRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public String getQuantityString(@PluralsRes int, int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public String getQuantityString(@PluralsRes int, int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public CharSequence getQuantityText(@PluralsRes int, int) throws android.content.res.Resources.NotFoundException;
+ method public String getResourceEntryName(@AnyRes int) throws android.content.res.Resources.NotFoundException;
+ method public String getResourceName(@AnyRes int) throws android.content.res.Resources.NotFoundException;
+ method public String getResourcePackageName(@AnyRes int) throws android.content.res.Resources.NotFoundException;
+ method public String getResourceTypeName(@AnyRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public String getString(@StringRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public String getString(@StringRes int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public String[] getStringArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
method public static android.content.res.Resources getSystem();
- method public java.lang.CharSequence getText(int) throws android.content.res.Resources.NotFoundException;
- method public java.lang.CharSequence getText(int, java.lang.CharSequence);
- method public java.lang.CharSequence[] getTextArray(int) throws android.content.res.Resources.NotFoundException;
- method public void getValue(int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
- method public void getValue(java.lang.String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
- method public void getValueForDensity(int, int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.XmlResourceParser getXml(int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public CharSequence getText(@StringRes int) throws android.content.res.Resources.NotFoundException;
+ method public CharSequence getText(@StringRes int, CharSequence);
+ method @NonNull public CharSequence[] getTextArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
+ method public void getValue(@AnyRes int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
+ method public void getValue(String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
+ method public void getValueForDensity(@AnyRes int, int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.XmlResourceParser getXml(@XmlRes int) throws android.content.res.Resources.NotFoundException;
method public final android.content.res.Resources.Theme newTheme();
- method public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
- method public android.content.res.TypedArray obtainTypedArray(int) throws android.content.res.Resources.NotFoundException;
- method public java.io.InputStream openRawResource(int) throws android.content.res.Resources.NotFoundException;
- method public java.io.InputStream openRawResource(int, android.util.TypedValue) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.AssetFileDescriptor openRawResourceFd(int) throws android.content.res.Resources.NotFoundException;
- method public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle) throws org.xmlpull.v1.XmlPullParserException;
+ method public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, @StyleableRes int[]);
+ method @NonNull public android.content.res.TypedArray obtainTypedArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public java.io.InputStream openRawResource(@RawRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public java.io.InputStream openRawResource(@RawRes int, android.util.TypedValue) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.AssetFileDescriptor openRawResourceFd(@RawRes int) throws android.content.res.Resources.NotFoundException;
+ method public void parseBundleExtra(String, android.util.AttributeSet, android.os.Bundle) throws org.xmlpull.v1.XmlPullParserException;
method public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public deprecated void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
+ method @Deprecated public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
+ field @AnyRes public static final int ID_NULL = 0; // 0x0
}
public static class Resources.NotFoundException extends java.lang.RuntimeException {
ctor public Resources.NotFoundException();
- ctor public Resources.NotFoundException(java.lang.String);
- ctor public Resources.NotFoundException(java.lang.String, java.lang.Exception);
+ ctor public Resources.NotFoundException(String);
+ ctor public Resources.NotFoundException(String, Exception);
}
public final class Resources.Theme {
method public void applyStyle(int, boolean);
- method public void dump(int, java.lang.String, java.lang.String);
+ method public void dump(int, String, String);
method public int getChangingConfigurations();
- method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(@DrawableRes int) throws android.content.res.Resources.NotFoundException;
method public android.content.res.Resources getResources();
- method public android.content.res.TypedArray obtainStyledAttributes(int[]);
- method public android.content.res.TypedArray obtainStyledAttributes(int, int[]) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
+ method @NonNull public android.content.res.TypedArray obtainStyledAttributes(@NonNull @StyleableRes int[]);
+ method @NonNull public android.content.res.TypedArray obtainStyledAttributes(@StyleRes int, @NonNull @StyleableRes int[]) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.TypedArray obtainStyledAttributes(@Nullable android.util.AttributeSet, @NonNull @StyleableRes int[], @AttrRes int, @StyleRes int);
method public boolean resolveAttribute(int, android.util.TypedValue, boolean);
method public void setTo(android.content.res.Resources.Theme);
}
public class TypedArray {
- method public boolean getBoolean(int, boolean);
+ method public boolean getBoolean(@StyleableRes int, boolean);
method public int getChangingConfigurations();
- method public int getColor(int, int);
- method public android.content.res.ColorStateList getColorStateList(int);
- method public float getDimension(int, float);
- method public int getDimensionPixelOffset(int, int);
- method public int getDimensionPixelSize(int, int);
- method public android.graphics.drawable.Drawable getDrawable(int);
- method public float getFloat(int, float);
- method public android.graphics.Typeface getFont(int);
- method public float getFraction(int, int, int, float);
+ method @ColorInt public int getColor(@StyleableRes int, @ColorInt int);
+ method @Nullable public android.content.res.ColorStateList getColorStateList(@StyleableRes int);
+ method public float getDimension(@StyleableRes int, float);
+ method public int getDimensionPixelOffset(@StyleableRes int, int);
+ method public int getDimensionPixelSize(@StyleableRes int, int);
+ method @Nullable public android.graphics.drawable.Drawable getDrawable(@StyleableRes int);
+ method public float getFloat(@StyleableRes int, float);
+ method @Nullable public android.graphics.Typeface getFont(@StyleableRes int);
+ method public float getFraction(@StyleableRes int, int, int, float);
method public int getIndex(int);
method public int getIndexCount();
- method public int getInt(int, int);
- method public int getInteger(int, int);
- method public int getLayoutDimension(int, java.lang.String);
- method public int getLayoutDimension(int, int);
- method public java.lang.String getNonResourceString(int);
- method public java.lang.String getPositionDescription();
- method public int getResourceId(int, int);
+ method public int getInt(@StyleableRes int, int);
+ method public int getInteger(@StyleableRes int, int);
+ method public int getLayoutDimension(@StyleableRes int, String);
+ method public int getLayoutDimension(@StyleableRes int, int);
+ method public String getNonResourceString(@StyleableRes int);
+ method public String getPositionDescription();
+ method @AnyRes public int getResourceId(@StyleableRes int, int);
method public android.content.res.Resources getResources();
- method public java.lang.String getString(int);
- method public java.lang.CharSequence getText(int);
- method public java.lang.CharSequence[] getTextArray(int);
- method public int getType(int);
- method public boolean getValue(int, android.util.TypedValue);
- method public boolean hasValue(int);
- method public boolean hasValueOrEmpty(int);
+ method @StyleRes public int getSourceStyleResourceId(@StyleableRes int, @StyleRes int);
+ method @Nullable public String getString(@StyleableRes int);
+ method public CharSequence getText(@StyleableRes int);
+ method public CharSequence[] getTextArray(@StyleableRes int);
+ method public int getType(@StyleableRes int);
+ method public boolean getValue(@StyleableRes int, android.util.TypedValue);
+ method public boolean hasValue(@StyleableRes int);
+ method public boolean hasValueOrEmpty(@StyleableRes int);
method public int length();
- method public android.util.TypedValue peekValue(int);
+ method public android.util.TypedValue peekValue(@StyleableRes int);
method public void recycle();
}
- public abstract interface XmlResourceParser implements android.util.AttributeSet java.lang.AutoCloseable org.xmlpull.v1.XmlPullParser {
- method public abstract void close();
+ public interface XmlResourceParser extends org.xmlpull.v1.XmlPullParser android.util.AttributeSet java.lang.AutoCloseable {
+ method public void close();
}
}
@@ -12327,20 +12372,20 @@ package android.database {
method protected void finalize();
method public byte[] getBlob(int);
method public int getColumnCount();
- method public int getColumnIndex(java.lang.String);
- method public int getColumnIndexOrThrow(java.lang.String);
- method public java.lang.String getColumnName(int);
+ method public int getColumnIndex(String);
+ method public int getColumnIndexOrThrow(String);
+ method public String getColumnName(int);
method public android.os.Bundle getExtras();
method public android.net.Uri getNotificationUri();
method public final int getPosition();
method public int getType(int);
- method protected deprecated java.lang.Object getUpdatedField(int);
+ method @Deprecated protected Object getUpdatedField(int);
method public boolean getWantsAllOnMoveCalls();
method public android.database.CursorWindow getWindow();
method public final boolean isAfterLast();
method public final boolean isBeforeFirst();
method public boolean isClosed();
- method protected deprecated boolean isFieldUpdated(int);
+ method @Deprecated protected boolean isFieldUpdated(int);
method public final boolean isFirst();
method public final boolean isLast();
method public final boolean move(int);
@@ -12359,9 +12404,9 @@ package android.database {
method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
method public void unregisterContentObserver(android.database.ContentObserver);
method public void unregisterDataSetObserver(android.database.DataSetObserver);
- field protected deprecated boolean mClosed;
- field protected deprecated android.content.ContentResolver mContentResolver;
- field protected deprecated int mPos;
+ field @Deprecated protected boolean mClosed;
+ field @Deprecated protected android.content.ContentResolver mContentResolver;
+ field @Deprecated protected int mPos;
}
protected static class AbstractCursor.SelfContentObserver extends android.database.ContentObserver {
@@ -12375,13 +12420,13 @@ package android.database {
method public int getInt(int);
method public long getLong(int);
method public short getShort(int);
- method public java.lang.String getString(int);
+ method public String getString(int);
method public boolean hasWindow();
- method public deprecated boolean isBlob(int);
- method public deprecated boolean isFloat(int);
- method public deprecated boolean isLong(int);
+ method @Deprecated public boolean isBlob(int);
+ method @Deprecated public boolean isFloat(int);
+ method @Deprecated public boolean isLong(int);
method public boolean isNull(int);
- method public deprecated boolean isString(int);
+ method @Deprecated public boolean isString(int);
method public void setWindow(android.database.CursorWindow);
field protected android.database.CursorWindow mWindow;
}
@@ -12393,27 +12438,27 @@ package android.database {
field public int sizeCopied;
}
- public class ContentObservable extends android.database.Observable {
+ public class ContentObservable extends android.database.Observable<android.database.ContentObserver> {
ctor public ContentObservable();
- method public deprecated void dispatchChange(boolean);
+ method @Deprecated public void dispatchChange(boolean);
method public void dispatchChange(boolean, android.net.Uri);
- method public deprecated void notifyChange(boolean);
+ method @Deprecated public void notifyChange(boolean);
method public void registerObserver(android.database.ContentObserver);
}
public abstract class ContentObserver {
ctor public ContentObserver(android.os.Handler);
method public boolean deliverSelfNotifications();
- method public final deprecated void dispatchChange(boolean);
+ method @Deprecated public final void dispatchChange(boolean);
method public final void dispatchChange(boolean, android.net.Uri);
method public void onChange(boolean);
method public void onChange(boolean, android.net.Uri);
}
- public abstract interface CrossProcessCursor implements android.database.Cursor {
- method public abstract void fillWindow(int, android.database.CursorWindow);
- method public abstract android.database.CursorWindow getWindow();
- method public abstract boolean onMove(int, int);
+ public interface CrossProcessCursor extends android.database.Cursor {
+ method public void fillWindow(int, android.database.CursorWindow);
+ method public android.database.CursorWindow getWindow();
+ method public boolean onMove(int, int);
}
public class CrossProcessCursorWrapper extends android.database.CursorWrapper implements android.database.CrossProcessCursor {
@@ -12423,48 +12468,48 @@ package android.database {
method public boolean onMove(int, int);
}
- public abstract interface Cursor implements java.io.Closeable {
- method public abstract void close();
- method public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
- method public abstract deprecated void deactivate();
- method public abstract byte[] getBlob(int);
- method public abstract int getColumnCount();
- method public abstract int getColumnIndex(java.lang.String);
- method public abstract int getColumnIndexOrThrow(java.lang.String) throws java.lang.IllegalArgumentException;
- method public abstract java.lang.String getColumnName(int);
- method public abstract java.lang.String[] getColumnNames();
- method public abstract int getCount();
- method public abstract double getDouble(int);
- method public abstract android.os.Bundle getExtras();
- method public abstract float getFloat(int);
- method public abstract int getInt(int);
- method public abstract long getLong(int);
- method public abstract android.net.Uri getNotificationUri();
- method public abstract int getPosition();
- method public abstract short getShort(int);
- method public abstract java.lang.String getString(int);
- method public abstract int getType(int);
- method public abstract boolean getWantsAllOnMoveCalls();
- method public abstract boolean isAfterLast();
- method public abstract boolean isBeforeFirst();
- method public abstract boolean isClosed();
- method public abstract boolean isFirst();
- method public abstract boolean isLast();
- method public abstract boolean isNull(int);
- method public abstract boolean move(int);
- method public abstract boolean moveToFirst();
- method public abstract boolean moveToLast();
- method public abstract boolean moveToNext();
- method public abstract boolean moveToPosition(int);
- method public abstract boolean moveToPrevious();
- method public abstract void registerContentObserver(android.database.ContentObserver);
- method public abstract void registerDataSetObserver(android.database.DataSetObserver);
- method public abstract deprecated boolean requery();
- method public abstract android.os.Bundle respond(android.os.Bundle);
- method public abstract void setExtras(android.os.Bundle);
- method public abstract void setNotificationUri(android.content.ContentResolver, android.net.Uri);
- method public abstract void unregisterContentObserver(android.database.ContentObserver);
- method public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
+ public interface Cursor extends java.io.Closeable {
+ method public void close();
+ method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
+ method @Deprecated public void deactivate();
+ method public byte[] getBlob(int);
+ method public int getColumnCount();
+ method public int getColumnIndex(String);
+ method public int getColumnIndexOrThrow(String) throws java.lang.IllegalArgumentException;
+ method public String getColumnName(int);
+ method public String[] getColumnNames();
+ method public int getCount();
+ method public double getDouble(int);
+ method public android.os.Bundle getExtras();
+ method public float getFloat(int);
+ method public int getInt(int);
+ method public long getLong(int);
+ method public android.net.Uri getNotificationUri();
+ method public int getPosition();
+ method public short getShort(int);
+ method public String getString(int);
+ method public int getType(int);
+ method public boolean getWantsAllOnMoveCalls();
+ method public boolean isAfterLast();
+ method public boolean isBeforeFirst();
+ method public boolean isClosed();
+ method public boolean isFirst();
+ method public boolean isLast();
+ method public boolean isNull(int);
+ method public boolean move(int);
+ method public boolean moveToFirst();
+ method public boolean moveToLast();
+ method public boolean moveToNext();
+ method public boolean moveToPosition(int);
+ method public boolean moveToPrevious();
+ method public void registerContentObserver(android.database.ContentObserver);
+ method public void registerDataSetObserver(android.database.DataSetObserver);
+ method @Deprecated public boolean requery();
+ method public android.os.Bundle respond(android.os.Bundle);
+ method public void setExtras(android.os.Bundle);
+ method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
+ method public void unregisterContentObserver(android.database.ContentObserver);
+ method public void unregisterDataSetObserver(android.database.DataSetObserver);
field public static final int FIELD_TYPE_BLOB = 4; // 0x4
field public static final int FIELD_TYPE_FLOAT = 2; // 0x2
field public static final int FIELD_TYPE_INTEGER = 1; // 0x1
@@ -12474,28 +12519,26 @@ package android.database {
public class CursorIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
ctor public CursorIndexOutOfBoundsException(int, int);
- ctor public CursorIndexOutOfBoundsException(java.lang.String);
+ ctor public CursorIndexOutOfBoundsException(String);
}
- public final class CursorJoiner implements java.lang.Iterable java.util.Iterator {
- ctor public CursorJoiner(android.database.Cursor, java.lang.String[], android.database.Cursor, java.lang.String[]);
+ public final class CursorJoiner implements java.lang.Iterable<android.database.CursorJoiner.Result> java.util.Iterator<android.database.CursorJoiner.Result> {
+ ctor public CursorJoiner(android.database.Cursor, String[], android.database.Cursor, String[]);
method public boolean hasNext();
method public java.util.Iterator<android.database.CursorJoiner.Result> iterator();
method public android.database.CursorJoiner.Result next();
}
- public static final class CursorJoiner.Result extends java.lang.Enum {
- method public static android.database.CursorJoiner.Result valueOf(java.lang.String);
- method public static final android.database.CursorJoiner.Result[] values();
+ public enum CursorJoiner.Result {
enum_constant public static final android.database.CursorJoiner.Result BOTH;
enum_constant public static final android.database.CursorJoiner.Result LEFT;
enum_constant public static final android.database.CursorJoiner.Result RIGHT;
}
public class CursorWindow extends android.database.sqlite.SQLiteClosable implements android.os.Parcelable {
- ctor public CursorWindow(java.lang.String);
- ctor public CursorWindow(java.lang.String, long);
- ctor public deprecated CursorWindow(boolean);
+ ctor public CursorWindow(String);
+ ctor public CursorWindow(String, long);
+ ctor @Deprecated public CursorWindow(boolean);
method public boolean allocRow();
method public void clear();
method public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
@@ -12509,20 +12552,20 @@ package android.database {
method public int getNumRows();
method public short getShort(int, int);
method public int getStartPosition();
- method public java.lang.String getString(int, int);
+ method public String getString(int, int);
method public int getType(int, int);
- method public deprecated boolean isBlob(int, int);
- method public deprecated boolean isFloat(int, int);
- method public deprecated boolean isLong(int, int);
- method public deprecated boolean isNull(int, int);
- method public deprecated boolean isString(int, int);
+ method @Deprecated public boolean isBlob(int, int);
+ method @Deprecated public boolean isFloat(int, int);
+ method @Deprecated public boolean isLong(int, int);
+ method @Deprecated public boolean isNull(int, int);
+ method @Deprecated public boolean isString(int, int);
method public static android.database.CursorWindow newFromParcel(android.os.Parcel);
method protected void onAllReferencesReleased();
method public boolean putBlob(byte[], int, int);
method public boolean putDouble(double, int, int);
method public boolean putLong(long, int, int);
method public boolean putNull(int, int);
- method public boolean putString(java.lang.String, int, int);
+ method public boolean putString(String, int, int);
method public boolean setNumColumns(int);
method public void setStartPosition(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -12533,13 +12576,13 @@ package android.database {
ctor public CursorWrapper(android.database.Cursor);
method public void close();
method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
- method public deprecated void deactivate();
+ method @Deprecated public void deactivate();
method public byte[] getBlob(int);
method public int getColumnCount();
- method public int getColumnIndex(java.lang.String);
- method public int getColumnIndexOrThrow(java.lang.String) throws java.lang.IllegalArgumentException;
- method public java.lang.String getColumnName(int);
- method public java.lang.String[] getColumnNames();
+ method public int getColumnIndex(String);
+ method public int getColumnIndexOrThrow(String) throws java.lang.IllegalArgumentException;
+ method public String getColumnName(int);
+ method public String[] getColumnNames();
method public int getCount();
method public double getDouble(int);
method public android.os.Bundle getExtras();
@@ -12549,7 +12592,7 @@ package android.database {
method public android.net.Uri getNotificationUri();
method public int getPosition();
method public short getShort(int);
- method public java.lang.String getString(int);
+ method public String getString(int);
method public int getType(int);
method public boolean getWantsAllOnMoveCalls();
method public android.database.Cursor getWrappedCursor();
@@ -12567,7 +12610,7 @@ package android.database {
method public boolean moveToPrevious();
method public void registerContentObserver(android.database.ContentObserver);
method public void registerDataSetObserver(android.database.DataSetObserver);
- method public deprecated boolean requery();
+ method @Deprecated public boolean requery();
method public android.os.Bundle respond(android.os.Bundle);
method public void setExtras(android.os.Bundle);
method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
@@ -12575,7 +12618,7 @@ package android.database {
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
- public class DataSetObservable extends android.database.Observable {
+ public class DataSetObservable extends android.database.Observable<android.database.DataSetObserver> {
ctor public DataSetObservable();
method public void notifyChanged();
method public void notifyInvalidated();
@@ -12587,59 +12630,59 @@ package android.database {
method public void onInvalidated();
}
- public abstract interface DatabaseErrorHandler {
- method public abstract void onCorruption(android.database.sqlite.SQLiteDatabase);
+ public interface DatabaseErrorHandler {
+ method public void onCorruption(android.database.sqlite.SQLiteDatabase);
}
public class DatabaseUtils {
ctor public DatabaseUtils();
- method public static void appendEscapedSQLString(java.lang.StringBuilder, java.lang.String);
- method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
- method public static final void appendValueToSql(java.lang.StringBuilder, java.lang.Object);
- method public static void bindObjectToProgram(android.database.sqlite.SQLiteProgram, int, java.lang.Object);
- method public static android.os.ParcelFileDescriptor blobFileDescriptorForQuery(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
- method public static android.os.ParcelFileDescriptor blobFileDescriptorForQuery(android.database.sqlite.SQLiteStatement, java.lang.String[]);
- method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
- method public static void createDbFromSqlStatements(android.content.Context, java.lang.String, int, java.lang.String);
- method public static void cursorDoubleToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues, java.lang.String);
- method public static void cursorDoubleToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
- method public static void cursorDoubleToCursorValues(android.database.Cursor, java.lang.String, android.content.ContentValues);
- method public static void cursorFloatToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
- method public static void cursorIntToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues);
- method public static void cursorIntToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues, java.lang.String);
- method public static void cursorIntToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
- method public static void cursorLongToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues);
- method public static void cursorLongToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues, java.lang.String);
- method public static void cursorLongToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
+ method public static void appendEscapedSQLString(StringBuilder, String);
+ method public static String[] appendSelectionArgs(String[], String[]);
+ method public static final void appendValueToSql(StringBuilder, Object);
+ method public static void bindObjectToProgram(android.database.sqlite.SQLiteProgram, int, Object);
+ method public static android.os.ParcelFileDescriptor blobFileDescriptorForQuery(android.database.sqlite.SQLiteDatabase, String, String[]);
+ method public static android.os.ParcelFileDescriptor blobFileDescriptorForQuery(android.database.sqlite.SQLiteStatement, String[]);
+ method public static String concatenateWhere(String, String);
+ method public static void createDbFromSqlStatements(android.content.Context, String, int, String);
+ method public static void cursorDoubleToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
+ method public static void cursorDoubleToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
+ method public static void cursorDoubleToCursorValues(android.database.Cursor, String, android.content.ContentValues);
+ method public static void cursorFloatToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
+ method public static void cursorIntToContentValues(android.database.Cursor, String, android.content.ContentValues);
+ method public static void cursorIntToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
+ method public static void cursorIntToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
+ method public static void cursorLongToContentValues(android.database.Cursor, String, android.content.ContentValues);
+ method public static void cursorLongToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
+ method public static void cursorLongToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
method public static void cursorRowToContentValues(android.database.Cursor, android.content.ContentValues);
- method public static void cursorShortToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
- method public static void cursorStringToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues);
- method public static void cursorStringToContentValues(android.database.Cursor, java.lang.String, android.content.ContentValues, java.lang.String);
- method public static void cursorStringToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, java.lang.String);
- method public static void cursorStringToInsertHelper(android.database.Cursor, java.lang.String, android.database.DatabaseUtils.InsertHelper, int);
+ method public static void cursorShortToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
+ method public static void cursorStringToContentValues(android.database.Cursor, String, android.content.ContentValues);
+ method public static void cursorStringToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
+ method public static void cursorStringToContentValuesIfPresent(android.database.Cursor, android.content.ContentValues, String);
+ method public static void cursorStringToInsertHelper(android.database.Cursor, String, android.database.DatabaseUtils.InsertHelper, int);
method public static void dumpCurrentRow(android.database.Cursor);
method public static void dumpCurrentRow(android.database.Cursor, java.io.PrintStream);
- method public static void dumpCurrentRow(android.database.Cursor, java.lang.StringBuilder);
- method public static java.lang.String dumpCurrentRowToString(android.database.Cursor);
+ method public static void dumpCurrentRow(android.database.Cursor, StringBuilder);
+ method public static String dumpCurrentRowToString(android.database.Cursor);
method public static void dumpCursor(android.database.Cursor);
method public static void dumpCursor(android.database.Cursor, java.io.PrintStream);
- method public static void dumpCursor(android.database.Cursor, java.lang.StringBuilder);
- method public static java.lang.String dumpCursorToString(android.database.Cursor);
- method public static java.lang.String getCollationKey(java.lang.String);
- method public static java.lang.String getHexCollationKey(java.lang.String);
- method public static int getSqlStatementType(java.lang.String);
- method public static long longForQuery(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
- method public static long longForQuery(android.database.sqlite.SQLiteStatement, java.lang.String[]);
- method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, java.lang.String);
- method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String);
- method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String, java.lang.String[]);
+ method public static void dumpCursor(android.database.Cursor, StringBuilder);
+ method public static String dumpCursorToString(android.database.Cursor);
+ method public static String getCollationKey(String);
+ method public static String getHexCollationKey(String);
+ method public static int getSqlStatementType(String);
+ method public static long longForQuery(android.database.sqlite.SQLiteDatabase, String, String[]);
+ method public static long longForQuery(android.database.sqlite.SQLiteStatement, String[]);
+ method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, String);
+ method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, String, String);
+ method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, String, String, String[]);
method public static final void readExceptionFromParcel(android.os.Parcel);
method public static void readExceptionWithFileNotFoundExceptionFromParcel(android.os.Parcel) throws java.io.FileNotFoundException;
method public static void readExceptionWithOperationApplicationExceptionFromParcel(android.os.Parcel) throws android.content.OperationApplicationException;
- method public static java.lang.String sqlEscapeString(java.lang.String);
- method public static java.lang.String stringForQuery(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
- method public static java.lang.String stringForQuery(android.database.sqlite.SQLiteStatement, java.lang.String[]);
- method public static final void writeExceptionToParcel(android.os.Parcel, java.lang.Exception);
+ method public static String sqlEscapeString(String);
+ method public static String stringForQuery(android.database.sqlite.SQLiteDatabase, String, String[]);
+ method public static String stringForQuery(android.database.sqlite.SQLiteStatement, String[]);
+ method public static final void writeExceptionToParcel(android.os.Parcel, Exception);
field public static final int STATEMENT_ABORT = 6; // 0x6
field public static final int STATEMENT_ATTACH = 3; // 0x3
field public static final int STATEMENT_BEGIN = 4; // 0x4
@@ -12652,23 +12695,23 @@ package android.database {
field public static final int STATEMENT_UPDATE = 2; // 0x2
}
- public static deprecated class DatabaseUtils.InsertHelper {
- ctor public DatabaseUtils.InsertHelper(android.database.sqlite.SQLiteDatabase, java.lang.String);
- method public void bind(int, double);
- method public void bind(int, float);
- method public void bind(int, long);
- method public void bind(int, int);
- method public void bind(int, boolean);
- method public void bind(int, byte[]);
- method public void bind(int, java.lang.String);
- method public void bindNull(int);
- method public void close();
- method public long execute();
- method public int getColumnIndex(java.lang.String);
- method public long insert(android.content.ContentValues);
- method public void prepareForInsert();
- method public void prepareForReplace();
- method public long replace(android.content.ContentValues);
+ @Deprecated public static class DatabaseUtils.InsertHelper {
+ ctor @Deprecated public DatabaseUtils.InsertHelper(android.database.sqlite.SQLiteDatabase, String);
+ method @Deprecated public void bind(int, double);
+ method @Deprecated public void bind(int, float);
+ method @Deprecated public void bind(int, long);
+ method @Deprecated public void bind(int, int);
+ method @Deprecated public void bind(int, boolean);
+ method @Deprecated public void bind(int, byte[]);
+ method @Deprecated public void bind(int, String);
+ method @Deprecated public void bindNull(int);
+ method @Deprecated public void close();
+ method @Deprecated public long execute();
+ method @Deprecated public int getColumnIndex(String);
+ method @Deprecated public long insert(android.content.ContentValues);
+ method @Deprecated public void prepareForInsert();
+ method @Deprecated public void prepareForReplace();
+ method @Deprecated public long replace(android.content.ContentValues);
}
public final class DefaultDatabaseErrorHandler implements android.database.DatabaseErrorHandler {
@@ -12677,37 +12720,37 @@ package android.database {
}
public class MatrixCursor extends android.database.AbstractCursor {
- ctor public MatrixCursor(java.lang.String[], int);
- ctor public MatrixCursor(java.lang.String[]);
- method public void addRow(java.lang.Object[]);
- method public void addRow(java.lang.Iterable<?>);
- method public java.lang.String[] getColumnNames();
+ ctor public MatrixCursor(String[], int);
+ ctor public MatrixCursor(String[]);
+ method public void addRow(Object[]);
+ method public void addRow(Iterable<?>);
+ method public String[] getColumnNames();
method public int getCount();
method public double getDouble(int);
method public float getFloat(int);
method public int getInt(int);
method public long getLong(int);
method public short getShort(int);
- method public java.lang.String getString(int);
+ method public String getString(int);
method public boolean isNull(int);
method public android.database.MatrixCursor.RowBuilder newRow();
}
public class MatrixCursor.RowBuilder {
- method public android.database.MatrixCursor.RowBuilder add(java.lang.Object);
- method public android.database.MatrixCursor.RowBuilder add(java.lang.String, java.lang.Object);
+ method public android.database.MatrixCursor.RowBuilder add(Object);
+ method public android.database.MatrixCursor.RowBuilder add(String, Object);
}
public class MergeCursor extends android.database.AbstractCursor {
ctor public MergeCursor(android.database.Cursor[]);
- method public java.lang.String[] getColumnNames();
+ method public String[] getColumnNames();
method public int getCount();
method public double getDouble(int);
method public float getFloat(int);
method public int getInt(int);
method public long getLong(int);
method public short getShort(int);
- method public java.lang.String getString(int);
+ method public String getString(int);
method public boolean isNull(int);
}
@@ -12721,13 +12764,13 @@ package android.database {
public class SQLException extends java.lang.RuntimeException {
ctor public SQLException();
- ctor public SQLException(java.lang.String);
- ctor public SQLException(java.lang.String, java.lang.Throwable);
+ ctor public SQLException(String);
+ ctor public SQLException(String, Throwable);
}
public class StaleDataException extends java.lang.RuntimeException {
ctor public StaleDataException();
- ctor public StaleDataException(java.lang.String);
+ ctor public StaleDataException(String);
}
}
@@ -12736,27 +12779,27 @@ package android.database.sqlite {
public class SQLiteAbortException extends android.database.sqlite.SQLiteException {
ctor public SQLiteAbortException();
- ctor public SQLiteAbortException(java.lang.String);
+ ctor public SQLiteAbortException(String);
}
public class SQLiteAccessPermException extends android.database.sqlite.SQLiteException {
ctor public SQLiteAccessPermException();
- ctor public SQLiteAccessPermException(java.lang.String);
+ ctor public SQLiteAccessPermException(String);
}
public class SQLiteBindOrColumnIndexOutOfRangeException extends android.database.sqlite.SQLiteException {
ctor public SQLiteBindOrColumnIndexOutOfRangeException();
- ctor public SQLiteBindOrColumnIndexOutOfRangeException(java.lang.String);
+ ctor public SQLiteBindOrColumnIndexOutOfRangeException(String);
}
public class SQLiteBlobTooBigException extends android.database.sqlite.SQLiteException {
ctor public SQLiteBlobTooBigException();
- ctor public SQLiteBlobTooBigException(java.lang.String);
+ ctor public SQLiteBlobTooBigException(String);
}
public class SQLiteCantOpenDatabaseException extends android.database.sqlite.SQLiteException {
ctor public SQLiteCantOpenDatabaseException();
- ctor public SQLiteCantOpenDatabaseException(java.lang.String);
+ ctor public SQLiteCantOpenDatabaseException(String);
}
public abstract class SQLiteClosable implements java.io.Closeable {
@@ -12764,32 +12807,32 @@ package android.database.sqlite {
method public void acquireReference();
method public void close();
method protected abstract void onAllReferencesReleased();
- method protected deprecated void onAllReferencesReleasedFromContainer();
+ method @Deprecated protected void onAllReferencesReleasedFromContainer();
method public void releaseReference();
- method public deprecated void releaseReferenceFromContainer();
+ method @Deprecated public void releaseReferenceFromContainer();
}
public class SQLiteConstraintException extends android.database.sqlite.SQLiteException {
ctor public SQLiteConstraintException();
- ctor public SQLiteConstraintException(java.lang.String);
+ ctor public SQLiteConstraintException(String);
}
public class SQLiteCursor extends android.database.AbstractWindowedCursor {
- ctor public deprecated SQLiteCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
- ctor public SQLiteCursor(android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
- method public java.lang.String[] getColumnNames();
+ ctor @Deprecated public SQLiteCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, String, android.database.sqlite.SQLiteQuery);
+ ctor public SQLiteCursor(android.database.sqlite.SQLiteCursorDriver, String, android.database.sqlite.SQLiteQuery);
+ method public String[] getColumnNames();
method public int getCount();
method public android.database.sqlite.SQLiteDatabase getDatabase();
method public void setFillWindowForwardOnly(boolean);
- method public void setSelectionArguments(java.lang.String[]);
+ method public void setSelectionArguments(String[]);
}
- public abstract interface SQLiteCursorDriver {
- method public abstract void cursorClosed();
- method public abstract void cursorDeactivated();
- method public abstract void cursorRequeried(android.database.Cursor);
- method public abstract android.database.Cursor query(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String[]);
- method public abstract void setBindArguments(java.lang.String[]);
+ public interface SQLiteCursorDriver {
+ method public void cursorClosed();
+ method public void cursorDeactivated();
+ method public void cursorRequeried(android.database.Cursor);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]);
+ method public void setBindArguments(String[]);
}
public final class SQLiteDatabase extends android.database.sqlite.SQLiteClosable {
@@ -12797,68 +12840,68 @@ package android.database.sqlite {
method public void beginTransactionNonExclusive();
method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
- method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException;
- method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase.OpenParams);
- method public int delete(java.lang.String, java.lang.String, java.lang.String[]);
- method public static boolean deleteDatabase(java.io.File);
+ method public android.database.sqlite.SQLiteStatement compileStatement(String) throws android.database.SQLException;
+ method @NonNull public static android.database.sqlite.SQLiteDatabase create(@Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method @NonNull public static android.database.sqlite.SQLiteDatabase createInMemory(@NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public int delete(String, String, String[]);
+ method public static boolean deleteDatabase(@NonNull java.io.File);
method public void disableWriteAheadLogging();
method public boolean enableWriteAheadLogging();
method public void endTransaction();
- method public void execSQL(java.lang.String) throws android.database.SQLException;
- method public void execSQL(java.lang.String, java.lang.Object[]) throws android.database.SQLException;
- method public static java.lang.String findEditTable(java.lang.String);
- method public java.util.List<android.util.Pair<java.lang.String, java.lang.String>> getAttachedDbs();
+ method public void execSQL(String) throws android.database.SQLException;
+ method public void execSQL(String, Object[]) throws android.database.SQLException;
+ method public static String findEditTable(String);
+ method public java.util.List<android.util.Pair<java.lang.String,java.lang.String>> getAttachedDbs();
method public long getMaximumSize();
method public long getPageSize();
- method public java.lang.String getPath();
- method public deprecated java.util.Map<java.lang.String, java.lang.String> getSyncedTables();
+ method public String getPath();
+ method @Deprecated public java.util.Map<java.lang.String,java.lang.String> getSyncedTables();
method public int getVersion();
method public boolean inTransaction();
- method public long insert(java.lang.String, java.lang.String, android.content.ContentValues);
- method public long insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues) throws android.database.SQLException;
- method public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
+ method public long insert(String, String, android.content.ContentValues);
+ method public long insertOrThrow(String, String, android.content.ContentValues) throws android.database.SQLException;
+ method public long insertWithOnConflict(String, String, android.content.ContentValues, int);
method public boolean isDatabaseIntegrityOk();
method public boolean isDbLockedByCurrentThread();
- method public deprecated boolean isDbLockedByOtherThreads();
+ method @Deprecated public boolean isDbLockedByOtherThreads();
method public boolean isOpen();
method public boolean isReadOnly();
method public boolean isWriteAheadLoggingEnabled();
- method public deprecated void markTableSyncable(java.lang.String, java.lang.String);
- method public deprecated void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
+ method @Deprecated public void markTableSyncable(String, String);
+ method @Deprecated public void markTableSyncable(String, String, String);
method public boolean needUpgrade(int);
method protected void onAllReferencesReleased();
- method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
- method public static android.database.sqlite.SQLiteDatabase openDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.OpenParams);
- method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
- method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
- method public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
- method public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
- method public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
- method public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
- method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
- method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(@NonNull String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory, int);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(@NonNull java.io.File, @NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(@NonNull String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory, int, @Nullable android.database.DatabaseErrorHandler);
+ method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(@NonNull java.io.File, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(@NonNull String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(@NonNull String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory, @Nullable android.database.DatabaseErrorHandler);
+ method public android.database.Cursor query(boolean, String, String[], String, String[], String, String, String, String);
+ method public android.database.Cursor query(boolean, String, String[], String, String[], String, String, String, String, android.os.CancellationSignal);
+ method public android.database.Cursor query(String, String[], String, String[], String, String, String);
+ method public android.database.Cursor query(String, String[], String, String[], String, String, String, String);
+ method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, String, String[], String, String[], String, String, String, String);
+ method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, String, String[], String, String[], String, String, String, String, android.os.CancellationSignal);
+ method public android.database.Cursor rawQuery(String, String[]);
+ method public android.database.Cursor rawQuery(String, String[], android.os.CancellationSignal);
+ method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, String, String[], String);
+ method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, String, String[], String, android.os.CancellationSignal);
method public static int releaseMemory();
- method public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
- method public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues) throws android.database.SQLException;
+ method public long replace(String, String, android.content.ContentValues);
+ method public long replaceOrThrow(String, String, android.content.ContentValues) throws android.database.SQLException;
method public void setForeignKeyConstraintsEnabled(boolean);
method public void setLocale(java.util.Locale);
- method public deprecated void setLockingEnabled(boolean);
+ method @Deprecated public void setLockingEnabled(boolean);
method public void setMaxSqlCacheSize(int);
method public long setMaximumSize(long);
method public void setPageSize(long);
method public void setTransactionSuccessful();
method public void setVersion(int);
- method public int update(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[]);
- method public int updateWithOnConflict(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[], int);
- method public void validateSql(java.lang.String, android.os.CancellationSignal);
- method public deprecated boolean yieldIfContended();
+ method public int update(String, android.content.ContentValues, String, String[]);
+ method public int updateWithOnConflict(String, android.content.ContentValues, String, String[], int);
+ method public void validateSql(@NonNull String, @Nullable android.os.CancellationSignal);
+ method @Deprecated public boolean yieldIfContended();
method public boolean yieldIfContendedSafely();
method public boolean yieldIfContendedSafely(long);
field public static final int CONFLICT_ABORT = 2; // 0x2
@@ -12876,83 +12919,83 @@ package android.database.sqlite {
field public static final int SQLITE_MAX_LIKE_PATTERN_LENGTH = 50000; // 0xc350
}
- public static abstract interface SQLiteDatabase.CursorFactory {
- method public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
+ public static interface SQLiteDatabase.CursorFactory {
+ method public android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, String, android.database.sqlite.SQLiteQuery);
}
public static final class SQLiteDatabase.OpenParams {
- method public android.database.sqlite.SQLiteDatabase.CursorFactory getCursorFactory();
- method public android.database.DatabaseErrorHandler getErrorHandler();
+ method @Nullable public android.database.sqlite.SQLiteDatabase.CursorFactory getCursorFactory();
+ method @Nullable public android.database.DatabaseErrorHandler getErrorHandler();
method public long getIdleConnectionTimeout();
- method public java.lang.String getJournalMode();
- method public int getLookasideSlotCount();
- method public int getLookasideSlotSize();
+ method @Nullable public String getJournalMode();
+ method @IntRange(from=0xffffffff) public int getLookasideSlotCount();
+ method @IntRange(from=0xffffffff) public int getLookasideSlotSize();
method public int getOpenFlags();
- method public java.lang.String getSynchronousMode();
+ method @Nullable public String getSynchronousMode();
}
public static final class SQLiteDatabase.OpenParams.Builder {
ctor public SQLiteDatabase.OpenParams.Builder();
ctor public SQLiteDatabase.OpenParams.Builder(android.database.sqlite.SQLiteDatabase.OpenParams);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder addOpenFlags(int);
- method public android.database.sqlite.SQLiteDatabase.OpenParams build();
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(android.database.DatabaseErrorHandler);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(long);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setJournalMode(java.lang.String);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(int, int);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
- method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setSynchronousMode(java.lang.String);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder addOpenFlags(int);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams build();
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(@Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(@Nullable android.database.DatabaseErrorHandler);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setJournalMode(@NonNull String);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
+ method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setSynchronousMode(@NonNull String);
}
public class SQLiteDatabaseCorruptException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatabaseCorruptException();
- ctor public SQLiteDatabaseCorruptException(java.lang.String);
+ ctor public SQLiteDatabaseCorruptException(String);
}
public class SQLiteDatabaseLockedException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatabaseLockedException();
- ctor public SQLiteDatabaseLockedException(java.lang.String);
+ ctor public SQLiteDatabaseLockedException(String);
}
public class SQLiteDatatypeMismatchException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatatypeMismatchException();
- ctor public SQLiteDatatypeMismatchException(java.lang.String);
+ ctor public SQLiteDatatypeMismatchException(String);
}
public class SQLiteDiskIOException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDiskIOException();
- ctor public SQLiteDiskIOException(java.lang.String);
+ ctor public SQLiteDiskIOException(String);
}
public class SQLiteDoneException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDoneException();
- ctor public SQLiteDoneException(java.lang.String);
+ ctor public SQLiteDoneException(String);
}
public class SQLiteException extends android.database.SQLException {
ctor public SQLiteException();
- ctor public SQLiteException(java.lang.String);
- ctor public SQLiteException(java.lang.String, java.lang.Throwable);
+ ctor public SQLiteException(String);
+ ctor public SQLiteException(String, Throwable);
}
public class SQLiteFullException extends android.database.sqlite.SQLiteException {
ctor public SQLiteFullException();
- ctor public SQLiteFullException(java.lang.String);
+ ctor public SQLiteFullException(String);
}
public class SQLiteMisuseException extends android.database.sqlite.SQLiteException {
ctor public SQLiteMisuseException();
- ctor public SQLiteMisuseException(java.lang.String);
+ ctor public SQLiteMisuseException(String);
}
public abstract class SQLiteOpenHelper implements java.lang.AutoCloseable {
- ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
- ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
- ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, int, android.database.sqlite.SQLiteDatabase.OpenParams);
- method public synchronized void close();
- method public java.lang.String getDatabaseName();
+ ctor public SQLiteOpenHelper(@Nullable android.content.Context, @Nullable String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory, int);
+ ctor public SQLiteOpenHelper(@Nullable android.content.Context, @Nullable String, @Nullable android.database.sqlite.SQLiteDatabase.CursorFactory, int, @Nullable android.database.DatabaseErrorHandler);
+ ctor public SQLiteOpenHelper(@Nullable android.content.Context, @Nullable String, int, @NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public void close();
+ method public String getDatabaseName();
method public android.database.sqlite.SQLiteDatabase getReadableDatabase();
method public android.database.sqlite.SQLiteDatabase getWritableDatabase();
method public void onConfigure(android.database.sqlite.SQLiteDatabase);
@@ -12960,26 +13003,26 @@ package android.database.sqlite {
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
- method public void setIdleConnectionTimeout(long);
- method public void setLookasideConfig(int, int);
- method public void setOpenParams(android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public void setIdleConnectionTimeout(@IntRange(from=0) long);
+ method public void setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
+ method public void setOpenParams(@NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
method public void setWriteAheadLoggingEnabled(boolean);
}
public class SQLiteOutOfMemoryException extends android.database.sqlite.SQLiteException {
ctor public SQLiteOutOfMemoryException();
- ctor public SQLiteOutOfMemoryException(java.lang.String);
+ ctor public SQLiteOutOfMemoryException(String);
}
public abstract class SQLiteProgram extends android.database.sqlite.SQLiteClosable {
- method public void bindAllArgsAsStrings(java.lang.String[]);
+ method public void bindAllArgsAsStrings(String[]);
method public void bindBlob(int, byte[]);
method public void bindDouble(int, double);
method public void bindLong(int, long);
method public void bindNull(int);
- method public void bindString(int, java.lang.String);
+ method public void bindString(int, String);
method public void clearBindings();
- method public final deprecated int getUniqueId();
+ method @Deprecated public final int getUniqueId();
method protected void onAllReferencesReleased();
}
@@ -12988,32 +13031,32 @@ package android.database.sqlite {
public class SQLiteQueryBuilder {
ctor public SQLiteQueryBuilder();
- method public static void appendColumns(java.lang.StringBuilder, java.lang.String[]);
- method public void appendWhere(java.lang.CharSequence);
- method public void appendWhereEscapeString(java.lang.String);
- method public void appendWhereStandalone(java.lang.CharSequence);
- method public java.lang.String buildQuery(java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public deprecated java.lang.String buildQuery(java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public static java.lang.String buildQueryString(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String buildUnionQuery(java.lang.String[], java.lang.String, java.lang.String);
- method public java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public deprecated java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.lang.String);
- method public int delete(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
- method public java.lang.String getTables();
- method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
+ method public static void appendColumns(StringBuilder, String[]);
+ method public void appendWhere(@NonNull CharSequence);
+ method public void appendWhereEscapeString(@NonNull String);
+ method public void appendWhereStandalone(@NonNull CharSequence);
+ method public String buildQuery(String[], String, String, String, String, String);
+ method @Deprecated public String buildQuery(String[], String, String[], String, String, String, String);
+ method public static String buildQueryString(boolean, String, String[], String, String, String, String, String);
+ method public String buildUnionQuery(String[], String, String);
+ method public String buildUnionSubQuery(String, String[], java.util.Set<java.lang.String>, int, String, String, String, String);
+ method @Deprecated public String buildUnionSubQuery(String, String[], java.util.Set<java.lang.String>, int, String, String, String[], String, String);
+ method public int delete(@NonNull android.database.sqlite.SQLiteDatabase, @Nullable String, @Nullable String[]);
+ method public String getTables();
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, String[], String, String[], String, String, String);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, String[], String, String[], String, String, String, String);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, String[], String, String[], String, String, String, String, android.os.CancellationSignal);
method public void setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
method public void setDistinct(boolean);
- method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
+ method public void setProjectionMap(java.util.Map<java.lang.String,java.lang.String>);
method public void setStrict(boolean);
- method public void setTables(java.lang.String);
- method public int update(android.database.sqlite.SQLiteDatabase, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public void setTables(String);
+ method public int update(@NonNull android.database.sqlite.SQLiteDatabase, @NonNull android.content.ContentValues, @Nullable String, @Nullable String[]);
}
public class SQLiteReadOnlyDatabaseException extends android.database.sqlite.SQLiteException {
ctor public SQLiteReadOnlyDatabaseException();
- ctor public SQLiteReadOnlyDatabaseException(java.lang.String);
+ ctor public SQLiteReadOnlyDatabaseException(String);
}
public final class SQLiteStatement extends android.database.sqlite.SQLiteProgram {
@@ -13022,18 +13065,18 @@ package android.database.sqlite {
method public int executeUpdateDelete();
method public android.os.ParcelFileDescriptor simpleQueryForBlobFileDescriptor();
method public long simpleQueryForLong();
- method public java.lang.String simpleQueryForString();
+ method public String simpleQueryForString();
}
public class SQLiteTableLockedException extends android.database.sqlite.SQLiteException {
ctor public SQLiteTableLockedException();
- ctor public SQLiteTableLockedException(java.lang.String);
+ ctor public SQLiteTableLockedException(String);
}
- public abstract interface SQLiteTransactionListener {
- method public abstract void onBegin();
- method public abstract void onCommit();
- method public abstract void onRollback();
+ public interface SQLiteTransactionListener {
+ method public void onBegin();
+ method public void onCommit();
+ method public void onRollback();
}
}
@@ -13051,8 +13094,8 @@ package android.drm {
}
public class DrmErrorEvent extends android.drm.DrmEvent {
- ctor public DrmErrorEvent(int, int, java.lang.String);
- ctor public DrmErrorEvent(int, int, java.lang.String, java.util.HashMap<java.lang.String, java.lang.Object>);
+ ctor public DrmErrorEvent(int, int, String);
+ ctor public DrmErrorEvent(int, int, String, java.util.HashMap<java.lang.String,java.lang.Object>);
field public static final int TYPE_ACQUIRE_DRM_INFO_FAILED = 2008; // 0x7d8
field public static final int TYPE_NOT_SUPPORTED = 2003; // 0x7d3
field public static final int TYPE_NO_INTERNET_CONNECTION = 2005; // 0x7d5
@@ -13064,33 +13107,33 @@ package android.drm {
}
public class DrmEvent {
- ctor protected DrmEvent(int, int, java.lang.String, java.util.HashMap<java.lang.String, java.lang.Object>);
- ctor protected DrmEvent(int, int, java.lang.String);
- method public java.lang.Object getAttribute(java.lang.String);
- method public java.lang.String getMessage();
+ ctor protected DrmEvent(int, int, String, java.util.HashMap<java.lang.String,java.lang.Object>);
+ ctor protected DrmEvent(int, int, String);
+ method public Object getAttribute(String);
+ method public String getMessage();
method public int getType();
method public int getUniqueId();
- field public static final java.lang.String DRM_INFO_OBJECT = "drm_info_object";
- field public static final java.lang.String DRM_INFO_STATUS_OBJECT = "drm_info_status_object";
+ field public static final String DRM_INFO_OBJECT = "drm_info_object";
+ field public static final String DRM_INFO_STATUS_OBJECT = "drm_info_status_object";
field public static final int TYPE_ALL_RIGHTS_REMOVED = 1001; // 0x3e9
field public static final int TYPE_DRM_INFO_PROCESSED = 1002; // 0x3ea
}
public class DrmInfo {
- ctor public DrmInfo(int, byte[], java.lang.String);
- ctor public DrmInfo(int, java.lang.String, java.lang.String);
- method public java.lang.Object get(java.lang.String);
+ ctor public DrmInfo(int, byte[], String);
+ ctor public DrmInfo(int, String, String);
+ method public Object get(String);
method public byte[] getData();
method public int getInfoType();
- method public java.lang.String getMimeType();
+ method public String getMimeType();
method public java.util.Iterator<java.lang.Object> iterator();
method public java.util.Iterator<java.lang.String> keyIterator();
- method public void put(java.lang.String, java.lang.Object);
+ method public void put(String, Object);
}
public class DrmInfoEvent extends android.drm.DrmEvent {
- ctor public DrmInfoEvent(int, int, java.lang.String);
- ctor public DrmInfoEvent(int, int, java.lang.String, java.util.HashMap<java.lang.String, java.lang.Object>);
+ ctor public DrmInfoEvent(int, int, String);
+ ctor public DrmInfoEvent(int, int, String, java.util.HashMap<java.lang.String,java.lang.Object>);
field public static final int TYPE_ACCOUNT_ALREADY_REGISTERED = 5; // 0x5
field public static final int TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT = 1; // 0x1
field public static final int TYPE_REMOVE_RIGHTS = 2; // 0x2
@@ -13100,15 +13143,15 @@ package android.drm {
}
public class DrmInfoRequest {
- ctor public DrmInfoRequest(int, java.lang.String);
- method public java.lang.Object get(java.lang.String);
+ ctor public DrmInfoRequest(int, String);
+ method public Object get(String);
method public int getInfoType();
- method public java.lang.String getMimeType();
+ method public String getMimeType();
method public java.util.Iterator<java.lang.Object> iterator();
method public java.util.Iterator<java.lang.String> keyIterator();
- method public void put(java.lang.String, java.lang.Object);
- field public static final java.lang.String ACCOUNT_ID = "account_id";
- field public static final java.lang.String SUBSCRIPTION_ID = "subscription_id";
+ method public void put(String, Object);
+ field public static final String ACCOUNT_ID = "account_id";
+ field public static final String SUBSCRIPTION_ID = "subscription_id";
field public static final int TYPE_REGISTRATION_INFO = 1; // 0x1
field public static final int TYPE_RIGHTS_ACQUISITION_INFO = 3; // 0x3
field public static final int TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO = 4; // 0x4
@@ -13116,12 +13159,12 @@ package android.drm {
}
public class DrmInfoStatus {
- ctor public DrmInfoStatus(int, int, android.drm.ProcessedData, java.lang.String);
+ ctor public DrmInfoStatus(int, int, android.drm.ProcessedData, String);
field public static final int STATUS_ERROR = 2; // 0x2
field public static final int STATUS_OK = 1; // 0x1
field public final android.drm.ProcessedData data;
field public final int infoType;
- field public final java.lang.String mimeType;
+ field public final String mimeType;
field public final int statusCode;
}
@@ -13129,68 +13172,68 @@ package android.drm {
ctor public DrmManagerClient(android.content.Context);
method public android.drm.DrmInfo acquireDrmInfo(android.drm.DrmInfoRequest);
method public int acquireRights(android.drm.DrmInfoRequest);
- method public boolean canHandle(java.lang.String, java.lang.String);
- method public boolean canHandle(android.net.Uri, java.lang.String);
- method public int checkRightsStatus(java.lang.String);
+ method public boolean canHandle(String, String);
+ method public boolean canHandle(android.net.Uri, String);
+ method public int checkRightsStatus(String);
method public int checkRightsStatus(android.net.Uri);
- method public int checkRightsStatus(java.lang.String, int);
+ method public int checkRightsStatus(String, int);
method public int checkRightsStatus(android.net.Uri, int);
method public void close();
method public android.drm.DrmConvertedStatus closeConvertSession(int);
method public android.drm.DrmConvertedStatus convertData(int, byte[]);
- method public java.lang.String[] getAvailableDrmEngines();
- method public android.content.ContentValues getConstraints(java.lang.String, int);
+ method public String[] getAvailableDrmEngines();
+ method public android.content.ContentValues getConstraints(String, int);
method public android.content.ContentValues getConstraints(android.net.Uri, int);
- method public int getDrmObjectType(java.lang.String, java.lang.String);
- method public int getDrmObjectType(android.net.Uri, java.lang.String);
- method public android.content.ContentValues getMetadata(java.lang.String);
+ method public int getDrmObjectType(String, String);
+ method public int getDrmObjectType(android.net.Uri, String);
+ method public android.content.ContentValues getMetadata(String);
method public android.content.ContentValues getMetadata(android.net.Uri);
- method public java.lang.String getOriginalMimeType(java.lang.String);
- method public java.lang.String getOriginalMimeType(android.net.Uri);
- method public int openConvertSession(java.lang.String);
+ method public String getOriginalMimeType(String);
+ method public String getOriginalMimeType(android.net.Uri);
+ method public int openConvertSession(String);
method public int processDrmInfo(android.drm.DrmInfo);
- method public deprecated void release();
+ method @Deprecated public void release();
method public int removeAllRights();
- method public int removeRights(java.lang.String);
+ method public int removeRights(String);
method public int removeRights(android.net.Uri);
- method public int saveRights(android.drm.DrmRights, java.lang.String, java.lang.String) throws java.io.IOException;
- method public synchronized void setOnErrorListener(android.drm.DrmManagerClient.OnErrorListener);
- method public synchronized void setOnEventListener(android.drm.DrmManagerClient.OnEventListener);
- method public synchronized void setOnInfoListener(android.drm.DrmManagerClient.OnInfoListener);
+ method public int saveRights(android.drm.DrmRights, String, String) throws java.io.IOException;
+ method public void setOnErrorListener(android.drm.DrmManagerClient.OnErrorListener);
+ method public void setOnEventListener(android.drm.DrmManagerClient.OnEventListener);
+ method public void setOnInfoListener(android.drm.DrmManagerClient.OnInfoListener);
field public static final int ERROR_NONE = 0; // 0x0
field public static final int ERROR_UNKNOWN = -2000; // 0xfffff830
}
- public static abstract interface DrmManagerClient.OnErrorListener {
- method public abstract void onError(android.drm.DrmManagerClient, android.drm.DrmErrorEvent);
+ public static interface DrmManagerClient.OnErrorListener {
+ method public void onError(android.drm.DrmManagerClient, android.drm.DrmErrorEvent);
}
- public static abstract interface DrmManagerClient.OnEventListener {
- method public abstract void onEvent(android.drm.DrmManagerClient, android.drm.DrmEvent);
+ public static interface DrmManagerClient.OnEventListener {
+ method public void onEvent(android.drm.DrmManagerClient, android.drm.DrmEvent);
}
- public static abstract interface DrmManagerClient.OnInfoListener {
- method public abstract void onInfo(android.drm.DrmManagerClient, android.drm.DrmInfoEvent);
+ public static interface DrmManagerClient.OnInfoListener {
+ method public void onInfo(android.drm.DrmManagerClient, android.drm.DrmInfoEvent);
}
public class DrmRights {
- ctor public DrmRights(java.lang.String, java.lang.String);
- ctor public DrmRights(java.lang.String, java.lang.String, java.lang.String);
- ctor public DrmRights(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- ctor public DrmRights(java.io.File, java.lang.String);
- ctor public DrmRights(android.drm.ProcessedData, java.lang.String);
- method public java.lang.String getAccountId();
+ ctor public DrmRights(String, String);
+ ctor public DrmRights(String, String, String);
+ ctor public DrmRights(String, String, String, String);
+ ctor public DrmRights(java.io.File, String);
+ ctor public DrmRights(android.drm.ProcessedData, String);
+ method public String getAccountId();
method public byte[] getData();
- method public java.lang.String getMimeType();
- method public java.lang.String getSubscriptionId();
+ method public String getMimeType();
+ method public String getSubscriptionId();
}
public class DrmStore {
- ctor public deprecated DrmStore();
+ ctor @Deprecated public DrmStore();
}
public static class DrmStore.Action {
- ctor public deprecated DrmStore.Action();
+ ctor @Deprecated public DrmStore.Action();
field public static final int DEFAULT = 0; // 0x0
field public static final int DISPLAY = 7; // 0x7
field public static final int EXECUTE = 6; // 0x6
@@ -13201,17 +13244,17 @@ package android.drm {
field public static final int TRANSFER = 3; // 0x3
}
- public static abstract interface DrmStore.ConstraintsColumns {
- field public static final java.lang.String EXTENDED_METADATA = "extended_metadata";
- field public static final java.lang.String LICENSE_AVAILABLE_TIME = "license_available_time";
- field public static final java.lang.String LICENSE_EXPIRY_TIME = "license_expiry_time";
- field public static final java.lang.String LICENSE_START_TIME = "license_start_time";
- field public static final java.lang.String MAX_REPEAT_COUNT = "max_repeat_count";
- field public static final java.lang.String REMAINING_REPEAT_COUNT = "remaining_repeat_count";
+ public static interface DrmStore.ConstraintsColumns {
+ field public static final String EXTENDED_METADATA = "extended_metadata";
+ field public static final String LICENSE_AVAILABLE_TIME = "license_available_time";
+ field public static final String LICENSE_EXPIRY_TIME = "license_expiry_time";
+ field public static final String LICENSE_START_TIME = "license_start_time";
+ field public static final String MAX_REPEAT_COUNT = "max_repeat_count";
+ field public static final String REMAINING_REPEAT_COUNT = "remaining_repeat_count";
}
public static class DrmStore.DrmObjectType {
- ctor public deprecated DrmStore.DrmObjectType();
+ ctor @Deprecated public DrmStore.DrmObjectType();
field public static final int CONTENT = 1; // 0x1
field public static final int RIGHTS_OBJECT = 2; // 0x2
field public static final int TRIGGER_OBJECT = 3; // 0x3
@@ -13219,7 +13262,7 @@ package android.drm {
}
public static class DrmStore.Playback {
- ctor public deprecated DrmStore.Playback();
+ ctor @Deprecated public DrmStore.Playback();
field public static final int PAUSE = 2; // 0x2
field public static final int RESUME = 3; // 0x3
field public static final int START = 0; // 0x0
@@ -13227,7 +13270,7 @@ package android.drm {
}
public static class DrmStore.RightsStatus {
- ctor public deprecated DrmStore.RightsStatus();
+ ctor @Deprecated public DrmStore.RightsStatus();
field public static final int RIGHTS_EXPIRED = 2; // 0x2
field public static final int RIGHTS_INVALID = 1; // 0x1
field public static final int RIGHTS_NOT_ACQUIRED = 3; // 0x3
@@ -13236,13 +13279,13 @@ package android.drm {
public class DrmSupportInfo {
ctor public DrmSupportInfo();
- method public void addFileSuffix(java.lang.String);
- method public void addMimeType(java.lang.String);
- method public deprecated java.lang.String getDescriprition();
- method public java.lang.String getDescription();
+ method public void addFileSuffix(String);
+ method public void addMimeType(String);
+ method @Deprecated public String getDescriprition();
+ method public String getDescription();
method public java.util.Iterator<java.lang.String> getFileSuffixIterator();
method public java.util.Iterator<java.lang.String> getMimeTypeIterator();
- method public void setDescription(java.lang.String);
+ method public void setDescription(String);
}
public class DrmUtils {
@@ -13251,15 +13294,15 @@ package android.drm {
}
public static class DrmUtils.ExtendedMetadataParser {
- method public java.lang.String get(java.lang.String);
+ method public String get(String);
method public java.util.Iterator<java.lang.String> iterator();
method public java.util.Iterator<java.lang.String> keyIterator();
}
public class ProcessedData {
- method public java.lang.String getAccountId();
+ method public String getAccountId();
method public byte[] getData();
- method public java.lang.String getSubscriptionId();
+ method public String getSubscriptionId();
}
}
@@ -13269,7 +13312,7 @@ package android.gesture {
public class Gesture implements android.os.Parcelable {
ctor public Gesture();
method public void addStroke(android.gesture.GestureStroke);
- method public java.lang.Object clone();
+ method public Object clone();
method public int describeContents();
method public android.graphics.RectF getBoundingBox();
method public long getID();
@@ -13287,24 +13330,24 @@ package android.gesture {
}
public final class GestureLibraries {
- method public static android.gesture.GestureLibrary fromFile(java.lang.String);
+ method public static android.gesture.GestureLibrary fromFile(String);
method public static android.gesture.GestureLibrary fromFile(java.io.File);
- method public static android.gesture.GestureLibrary fromPrivateFile(android.content.Context, java.lang.String);
- method public static android.gesture.GestureLibrary fromRawResource(android.content.Context, int);
+ method public static android.gesture.GestureLibrary fromPrivateFile(android.content.Context, String);
+ method public static android.gesture.GestureLibrary fromRawResource(android.content.Context, @RawRes int);
}
public abstract class GestureLibrary {
ctor protected GestureLibrary();
- method public void addGesture(java.lang.String, android.gesture.Gesture);
+ method public void addGesture(String, android.gesture.Gesture);
method public java.util.Set<java.lang.String> getGestureEntries();
- method public java.util.ArrayList<android.gesture.Gesture> getGestures(java.lang.String);
+ method public java.util.ArrayList<android.gesture.Gesture> getGestures(String);
method public int getOrientationStyle();
method public int getSequenceType();
method public boolean isReadOnly();
method public abstract boolean load();
method public java.util.ArrayList<android.gesture.Prediction> recognize(android.gesture.Gesture);
- method public void removeEntry(java.lang.String);
- method public void removeGesture(java.lang.String, android.gesture.Gesture);
+ method public void removeEntry(String);
+ method public void removeGesture(String, android.gesture.Gesture);
method public abstract boolean save();
method public void setOrientationStyle(int);
method public void setSequenceType(int);
@@ -13325,7 +13368,7 @@ package android.gesture {
method public java.util.ArrayList<android.gesture.GesturePoint> getCurrentStroke();
method public long getFadeOffset();
method public android.gesture.Gesture getGesture();
- method public int getGestureColor();
+ method @ColorInt public int getGestureColor();
method public android.graphics.Path getGesturePath();
method public android.graphics.Path getGesturePath(android.graphics.Path);
method public float getGestureStrokeAngleThreshold();
@@ -13334,7 +13377,7 @@ package android.gesture {
method public int getGestureStrokeType();
method public float getGestureStrokeWidth();
method public int getOrientation();
- method public int getUncertainGestureColor();
+ method @ColorInt public int getUncertainGestureColor();
method public boolean isEventsInterceptionEnabled();
method public boolean isFadeEnabled();
method public boolean isGestureVisible();
@@ -13349,7 +13392,7 @@ package android.gesture {
method public void setFadeEnabled(boolean);
method public void setFadeOffset(long);
method public void setGesture(android.gesture.Gesture);
- method public void setGestureColor(int);
+ method public void setGestureColor(@ColorInt int);
method public void setGestureStrokeAngleThreshold(float);
method public void setGestureStrokeLengthThreshold(float);
method public void setGestureStrokeSquarenessTreshold(float);
@@ -13357,32 +13400,32 @@ package android.gesture {
method public void setGestureStrokeWidth(float);
method public void setGestureVisible(boolean);
method public void setOrientation(int);
- method public void setUncertainGestureColor(int);
+ method public void setUncertainGestureColor(@ColorInt int);
field public static final int GESTURE_STROKE_TYPE_MULTIPLE = 1; // 0x1
field public static final int GESTURE_STROKE_TYPE_SINGLE = 0; // 0x0
field public static final int ORIENTATION_HORIZONTAL = 0; // 0x0
field public static final int ORIENTATION_VERTICAL = 1; // 0x1
}
- public static abstract interface GestureOverlayView.OnGestureListener {
- method public abstract void onGesture(android.gesture.GestureOverlayView, android.view.MotionEvent);
- method public abstract void onGestureCancelled(android.gesture.GestureOverlayView, android.view.MotionEvent);
- method public abstract void onGestureEnded(android.gesture.GestureOverlayView, android.view.MotionEvent);
- method public abstract void onGestureStarted(android.gesture.GestureOverlayView, android.view.MotionEvent);
+ public static interface GestureOverlayView.OnGestureListener {
+ method public void onGesture(android.gesture.GestureOverlayView, android.view.MotionEvent);
+ method public void onGestureCancelled(android.gesture.GestureOverlayView, android.view.MotionEvent);
+ method public void onGestureEnded(android.gesture.GestureOverlayView, android.view.MotionEvent);
+ method public void onGestureStarted(android.gesture.GestureOverlayView, android.view.MotionEvent);
}
- public static abstract interface GestureOverlayView.OnGesturePerformedListener {
- method public abstract void onGesturePerformed(android.gesture.GestureOverlayView, android.gesture.Gesture);
+ public static interface GestureOverlayView.OnGesturePerformedListener {
+ method public void onGesturePerformed(android.gesture.GestureOverlayView, android.gesture.Gesture);
}
- public static abstract interface GestureOverlayView.OnGesturingListener {
- method public abstract void onGesturingEnded(android.gesture.GestureOverlayView);
- method public abstract void onGesturingStarted(android.gesture.GestureOverlayView);
+ public static interface GestureOverlayView.OnGesturingListener {
+ method public void onGesturingEnded(android.gesture.GestureOverlayView);
+ method public void onGesturingStarted(android.gesture.GestureOverlayView);
}
public class GesturePoint {
ctor public GesturePoint(float, float, long);
- method public java.lang.Object clone();
+ method public Object clone();
field public final long timestamp;
field public final float x;
field public final float y;
@@ -13390,17 +13433,17 @@ package android.gesture {
public class GestureStore {
ctor public GestureStore();
- method public void addGesture(java.lang.String, android.gesture.Gesture);
+ method public void addGesture(String, android.gesture.Gesture);
method public java.util.Set<java.lang.String> getGestureEntries();
- method public java.util.ArrayList<android.gesture.Gesture> getGestures(java.lang.String);
+ method public java.util.ArrayList<android.gesture.Gesture> getGestures(String);
method public int getOrientationStyle();
method public int getSequenceType();
method public boolean hasChanged();
method public void load(java.io.InputStream) throws java.io.IOException;
method public void load(java.io.InputStream, boolean) throws java.io.IOException;
method public java.util.ArrayList<android.gesture.Prediction> recognize(android.gesture.Gesture);
- method public void removeEntry(java.lang.String);
- method public void removeGesture(java.lang.String, android.gesture.Gesture);
+ method public void removeEntry(String);
+ method public void removeGesture(String, android.gesture.Gesture);
method public void save(java.io.OutputStream) throws java.io.IOException;
method public void save(java.io.OutputStream, boolean) throws java.io.IOException;
method public void setOrientationStyle(int);
@@ -13414,7 +13457,7 @@ package android.gesture {
public class GestureStroke {
ctor public GestureStroke(java.util.ArrayList<android.gesture.GesturePoint>);
method public void clearPath();
- method public java.lang.Object clone();
+ method public Object clone();
method public android.gesture.OrientedBoundingBox computeOrientedBoundingBox();
method public android.graphics.Path getPath();
method public android.graphics.Path toPath(float, float, int);
@@ -13441,7 +13484,7 @@ package android.gesture {
}
public class Prediction {
- field public final java.lang.String name;
+ field public final String name;
field public double score;
}
@@ -13450,40 +13493,40 @@ package android.gesture {
package android.graphics {
public final class Bitmap implements android.os.Parcelable {
- method public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream);
+ method @WorkerThread public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream);
method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean);
method public void copyPixelsFromBuffer(java.nio.Buffer);
method public void copyPixelsToBuffer(java.nio.Buffer);
- method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
- method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
- method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
- method public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap.Config, boolean);
- method public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap.Config, boolean, android.graphics.ColorSpace);
- method public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap.Config, boolean);
- method public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap.Config, boolean, android.graphics.ColorSpace);
- method public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(android.graphics.Picture);
- method public static android.graphics.Bitmap createBitmap(android.graphics.Picture, int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
+ method public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Bitmap);
+ method public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Bitmap, int, int, int, int);
+ method public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Bitmap, int, int, int, int, @Nullable android.graphics.Matrix, boolean);
+ method public static android.graphics.Bitmap createBitmap(int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(int, int, @NonNull android.graphics.Bitmap.Config, boolean);
+ method public static android.graphics.Bitmap createBitmap(int, int, @NonNull android.graphics.Bitmap.Config, boolean, @NonNull android.graphics.ColorSpace);
+ method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, int, int, @NonNull android.graphics.Bitmap.Config, boolean);
+ method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, int, int, @NonNull android.graphics.Bitmap.Config, boolean, @NonNull android.graphics.ColorSpace);
+ method public static android.graphics.Bitmap createBitmap(@NonNull @ColorInt int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@NonNull android.util.DisplayMetrics, @NonNull @ColorInt int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@NonNull @ColorInt int[], int, int, android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, @NonNull @ColorInt int[], int, int, @NonNull android.graphics.Bitmap.Config);
+ method @NonNull public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Picture);
+ method @NonNull public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Picture, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createScaledBitmap(@NonNull android.graphics.Bitmap, int, int, boolean);
method public int describeContents();
- method public void eraseColor(int);
- method public android.graphics.Bitmap extractAlpha();
- method public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
+ method public void eraseColor(@ColorInt int);
+ method @CheckResult public android.graphics.Bitmap extractAlpha();
+ method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
method public int getAllocationByteCount();
method public int getByteCount();
- method public android.graphics.ColorSpace getColorSpace();
+ method @Nullable public android.graphics.ColorSpace getColorSpace();
method public android.graphics.Bitmap.Config getConfig();
method public int getDensity();
method public int getGenerationId();
method public int getHeight();
method public byte[] getNinePatchChunk();
- method public int getPixel(int, int);
- method public void getPixels(int[], int, int, int, int, int, int);
+ method @ColorInt public int getPixel(int, int);
+ method public void getPixels(@ColorInt int[], int, int, int, int, int, int);
method public int getRowBytes();
method public int getScaledHeight(android.graphics.Canvas);
method public int getScaledHeight(android.util.DisplayMetrics);
@@ -13506,29 +13549,25 @@ package android.graphics {
method public void setHasAlpha(boolean);
method public void setHasMipMap(boolean);
method public void setHeight(int);
- method public void setPixel(int, int, int);
- method public void setPixels(int[], int, int, int, int, int, int);
+ method public void setPixel(int, int, @ColorInt int);
+ method public void setPixels(@ColorInt int[], int, int, int, int, int, int);
method public void setPremultiplied(boolean);
method public void setWidth(int);
- method public static android.graphics.Bitmap wrapHardwareBuffer(android.hardware.HardwareBuffer, android.graphics.ColorSpace);
+ method @Nullable public static android.graphics.Bitmap wrapHardwareBuffer(@NonNull android.hardware.HardwareBuffer, @Nullable android.graphics.ColorSpace);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.Bitmap> CREATOR;
field public static final int DENSITY_NONE = 0; // 0x0
}
- public static final class Bitmap.CompressFormat extends java.lang.Enum {
- method public static android.graphics.Bitmap.CompressFormat valueOf(java.lang.String);
- method public static final android.graphics.Bitmap.CompressFormat[] values();
+ public enum Bitmap.CompressFormat {
enum_constant public static final android.graphics.Bitmap.CompressFormat JPEG;
enum_constant public static final android.graphics.Bitmap.CompressFormat PNG;
enum_constant public static final android.graphics.Bitmap.CompressFormat WEBP;
}
- public static final class Bitmap.Config extends java.lang.Enum {
- method public static android.graphics.Bitmap.Config valueOf(java.lang.String);
- method public static final android.graphics.Bitmap.Config[] values();
+ public enum Bitmap.Config {
enum_constant public static final android.graphics.Bitmap.Config ALPHA_8;
- enum_constant public static final deprecated android.graphics.Bitmap.Config ARGB_4444;
+ enum_constant @Deprecated public static final android.graphics.Bitmap.Config ARGB_4444;
enum_constant public static final android.graphics.Bitmap.Config ARGB_8888;
enum_constant public static final android.graphics.Bitmap.Config HARDWARE;
enum_constant public static final android.graphics.Bitmap.Config RGBA_F16;
@@ -13539,41 +13578,41 @@ package android.graphics {
ctor public BitmapFactory();
method public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory.Options);
method public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
- method public static android.graphics.Bitmap decodeFile(java.lang.String, android.graphics.BitmapFactory.Options);
- method public static android.graphics.Bitmap decodeFile(java.lang.String);
+ method public static android.graphics.Bitmap decodeFile(String, android.graphics.BitmapFactory.Options);
+ method public static android.graphics.Bitmap decodeFile(String);
method public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory.Options);
method public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
method public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory.Options);
method public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
- method public static android.graphics.Bitmap decodeResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory.Options);
- method public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory.Options);
+ method @Nullable public static android.graphics.Bitmap decodeResourceStream(@Nullable android.content.res.Resources, @Nullable android.util.TypedValue, @Nullable java.io.InputStream, @Nullable android.graphics.Rect, @Nullable android.graphics.BitmapFactory.Options);
+ method @Nullable public static android.graphics.Bitmap decodeStream(@Nullable java.io.InputStream, @Nullable android.graphics.Rect, @Nullable android.graphics.BitmapFactory.Options);
method public static android.graphics.Bitmap decodeStream(java.io.InputStream);
}
public static class BitmapFactory.Options {
ctor public BitmapFactory.Options();
- method public deprecated void requestCancelDecode();
+ method @Deprecated public void requestCancelDecode();
field public android.graphics.Bitmap inBitmap;
field public int inDensity;
- field public deprecated boolean inDither;
- field public deprecated boolean inInputShareable;
+ field @Deprecated public boolean inDither;
+ field @Deprecated public boolean inInputShareable;
field public boolean inJustDecodeBounds;
field public boolean inMutable;
- field public deprecated boolean inPreferQualityOverSpeed;
+ field @Deprecated public boolean inPreferQualityOverSpeed;
field public android.graphics.ColorSpace inPreferredColorSpace;
field public android.graphics.Bitmap.Config inPreferredConfig;
field public boolean inPremultiplied;
- field public deprecated boolean inPurgeable;
+ field @Deprecated public boolean inPurgeable;
field public int inSampleSize;
field public boolean inScaled;
field public int inScreenDensity;
field public int inTargetDensity;
field public byte[] inTempStorage;
- field public deprecated boolean mCancel;
+ field @Deprecated public boolean mCancel;
field public android.graphics.ColorSpace outColorSpace;
field public android.graphics.Bitmap.Config outConfig;
field public int outHeight;
- field public java.lang.String outMimeType;
+ field public String outMimeType;
field public int outWidth;
}
@@ -13585,17 +13624,15 @@ package android.graphics {
method public static android.graphics.BitmapRegionDecoder newInstance(byte[], int, int, boolean) throws java.io.IOException;
method public static android.graphics.BitmapRegionDecoder newInstance(java.io.FileDescriptor, boolean) throws java.io.IOException;
method public static android.graphics.BitmapRegionDecoder newInstance(java.io.InputStream, boolean) throws java.io.IOException;
- method public static android.graphics.BitmapRegionDecoder newInstance(java.lang.String, boolean) throws java.io.IOException;
+ method public static android.graphics.BitmapRegionDecoder newInstance(String, boolean) throws java.io.IOException;
method public void recycle();
}
public class BitmapShader extends android.graphics.Shader {
- ctor public BitmapShader(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
+ ctor public BitmapShader(@NonNull android.graphics.Bitmap, @NonNull android.graphics.Shader.TileMode, @NonNull android.graphics.Shader.TileMode);
}
- public final class BlendMode extends java.lang.Enum {
- method public static android.graphics.BlendMode valueOf(java.lang.String);
- method public static final android.graphics.BlendMode[] values();
+ public enum BlendMode {
enum_constant public static final android.graphics.BlendMode CLEAR;
enum_constant public static final android.graphics.BlendMode COLOR;
enum_constant public static final android.graphics.BlendMode COLOR_BURN;
@@ -13628,8 +13665,8 @@ package android.graphics {
}
public final class BlendModeColorFilter extends android.graphics.ColorFilter {
- ctor public BlendModeColorFilter(int, android.graphics.BlendMode);
- method public int getColor();
+ ctor public BlendModeColorFilter(@ColorInt int, @NonNull android.graphics.BlendMode);
+ method @ColorInt public int getColor();
method public android.graphics.BlendMode getMode();
}
@@ -13637,9 +13674,7 @@ package android.graphics {
ctor public BlurMaskFilter(float, android.graphics.BlurMaskFilter.Blur);
}
- public static final class BlurMaskFilter.Blur extends java.lang.Enum {
- method public static android.graphics.BlurMaskFilter.Blur valueOf(java.lang.String);
- method public static final android.graphics.BlurMaskFilter.Blur[] values();
+ public enum BlurMaskFilter.Blur {
enum_constant public static final android.graphics.BlurMaskFilter.Blur INNER;
enum_constant public static final android.graphics.BlurMaskFilter.Blur NORMAL;
enum_constant public static final android.graphics.BlurMaskFilter.Blur OUTER;
@@ -13666,199 +13701,196 @@ package android.graphics {
public class Canvas {
ctor public Canvas();
- ctor public Canvas(android.graphics.Bitmap);
- method public boolean clipOutPath(android.graphics.Path);
- method public boolean clipOutRect(android.graphics.RectF);
- method public boolean clipOutRect(android.graphics.Rect);
+ ctor public Canvas(@NonNull android.graphics.Bitmap);
+ method public boolean clipOutPath(@NonNull android.graphics.Path);
+ method public boolean clipOutRect(@NonNull android.graphics.RectF);
+ method public boolean clipOutRect(@NonNull android.graphics.Rect);
method public boolean clipOutRect(float, float, float, float);
method public boolean clipOutRect(int, int, int, int);
- method public deprecated boolean clipPath(android.graphics.Path, android.graphics.Region.Op);
- method public boolean clipPath(android.graphics.Path);
- method public deprecated boolean clipRect(android.graphics.RectF, android.graphics.Region.Op);
- method public deprecated boolean clipRect(android.graphics.Rect, android.graphics.Region.Op);
- method public boolean clipRect(android.graphics.RectF);
- method public boolean clipRect(android.graphics.Rect);
- method public deprecated boolean clipRect(float, float, float, float, android.graphics.Region.Op);
+ method @Deprecated public boolean clipPath(@NonNull android.graphics.Path, @NonNull android.graphics.Region.Op);
+ method public boolean clipPath(@NonNull android.graphics.Path);
+ method @Deprecated public boolean clipRect(@NonNull android.graphics.RectF, @NonNull android.graphics.Region.Op);
+ method @Deprecated public boolean clipRect(@NonNull android.graphics.Rect, @NonNull android.graphics.Region.Op);
+ method public boolean clipRect(@NonNull android.graphics.RectF);
+ method public boolean clipRect(@NonNull android.graphics.Rect);
+ method @Deprecated public boolean clipRect(float, float, float, float, @NonNull android.graphics.Region.Op);
method public boolean clipRect(float, float, float, float);
method public boolean clipRect(int, int, int, int);
- method public void concat(android.graphics.Matrix);
+ method public void concat(@Nullable android.graphics.Matrix);
method public void disableZ();
method public void drawARGB(int, int, int, int);
- method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
- method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
- method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
- method public void drawCircle(float, float, float, android.graphics.Paint);
- method public void drawColor(int);
- method public deprecated void drawColor(int, android.graphics.PorterDuff.Mode);
- method public void drawColor(int, android.graphics.BlendMode);
- method public void drawDoubleRoundRect(android.graphics.RectF, float, float, android.graphics.RectF, float, float, android.graphics.Paint);
- method public void drawDoubleRoundRect(android.graphics.RectF, float[], android.graphics.RectF, float[], android.graphics.Paint);
- method public void drawLine(float, float, float, float, android.graphics.Paint);
- method public void drawLines(float[], int, int, android.graphics.Paint);
- method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(android.graphics.RectF, android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
- method public void drawPaint(android.graphics.Paint);
- method public void drawPath(android.graphics.Path, android.graphics.Paint);
- method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
- method public void drawPoint(float, float, android.graphics.Paint);
- method public void drawPoints(float[], int, int, android.graphics.Paint);
- method public void drawPoints(float[], android.graphics.Paint);
- method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
- method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
+ method public void drawArc(@NonNull android.graphics.RectF, float, float, boolean, @NonNull android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, @NonNull android.graphics.Paint);
+ method public void drawBitmap(@NonNull android.graphics.Bitmap, float, float, @Nullable android.graphics.Paint);
+ method public void drawBitmap(@NonNull android.graphics.Bitmap, @Nullable android.graphics.Rect, @NonNull android.graphics.RectF, @Nullable android.graphics.Paint);
+ method public void drawBitmap(@NonNull android.graphics.Bitmap, @Nullable android.graphics.Rect, @NonNull android.graphics.Rect, @Nullable android.graphics.Paint);
+ method @Deprecated public void drawBitmap(@NonNull int[], int, int, float, float, int, int, boolean, @Nullable android.graphics.Paint);
+ method @Deprecated public void drawBitmap(@NonNull int[], int, int, int, int, int, int, boolean, @Nullable android.graphics.Paint);
+ method public void drawBitmap(@NonNull android.graphics.Bitmap, @NonNull android.graphics.Matrix, @Nullable android.graphics.Paint);
+ method public void drawBitmapMesh(@NonNull android.graphics.Bitmap, int, int, @NonNull float[], int, @Nullable int[], int, @Nullable android.graphics.Paint);
+ method public void drawCircle(float, float, float, @NonNull android.graphics.Paint);
+ method public void drawColor(@ColorInt int);
+ method @Deprecated public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
+ method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode);
+ method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
+ method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint);
+ method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
+ method public void drawLines(@Size(multiple=4) @NonNull float[], int, int, @NonNull android.graphics.Paint);
+ method public void drawLines(@Size(multiple=4) @NonNull float[], @NonNull android.graphics.Paint);
+ method public void drawOval(@NonNull android.graphics.RectF, @NonNull android.graphics.Paint);
+ method public void drawOval(float, float, float, float, @NonNull android.graphics.Paint);
+ method public void drawPaint(@NonNull android.graphics.Paint);
+ method public void drawPath(@NonNull android.graphics.Path, @NonNull android.graphics.Paint);
+ method public void drawPicture(@NonNull android.graphics.Picture);
+ method public void drawPicture(@NonNull android.graphics.Picture, @NonNull android.graphics.RectF);
+ method public void drawPicture(@NonNull android.graphics.Picture, @NonNull android.graphics.Rect);
+ method public void drawPoint(float, float, @NonNull android.graphics.Paint);
+ method public void drawPoints(@Size(multiple=2) float[], int, int, @NonNull android.graphics.Paint);
+ method public void drawPoints(@Size(multiple=2) @NonNull float[], @NonNull android.graphics.Paint);
+ method @Deprecated public void drawPosText(@NonNull char[], int, int, @NonNull @Size(multiple=2) float[], @NonNull android.graphics.Paint);
+ method @Deprecated public void drawPosText(@NonNull String, @NonNull @Size(multiple=2) float[], @NonNull android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRenderNode(android.graphics.RenderNode);
- method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
- method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.String, float, float, android.graphics.Paint);
- method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
- method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
- method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
- method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
- method public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
- method public void drawVertices(android.graphics.Canvas.VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
+ method public void drawRect(@NonNull android.graphics.RectF, @NonNull android.graphics.Paint);
+ method public void drawRect(@NonNull android.graphics.Rect, @NonNull android.graphics.Paint);
+ method public void drawRect(float, float, float, float, @NonNull android.graphics.Paint);
+ method public void drawRenderNode(@NonNull android.graphics.RenderNode);
+ method public void drawRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, @NonNull android.graphics.Paint);
+ method public void drawText(@NonNull char[], int, int, float, float, @NonNull android.graphics.Paint);
+ method public void drawText(@NonNull String, float, float, @NonNull android.graphics.Paint);
+ method public void drawText(@NonNull String, int, int, float, float, @NonNull android.graphics.Paint);
+ method public void drawText(@NonNull CharSequence, int, int, float, float, @NonNull android.graphics.Paint);
+ method public void drawTextOnPath(@NonNull char[], int, int, @NonNull android.graphics.Path, float, float, @NonNull android.graphics.Paint);
+ method public void drawTextOnPath(@NonNull String, @NonNull android.graphics.Path, float, float, @NonNull android.graphics.Paint);
+ method public void drawTextRun(@NonNull char[], int, int, int, int, float, float, boolean, @NonNull android.graphics.Paint);
+ method public void drawTextRun(@NonNull CharSequence, int, int, int, int, float, float, boolean, @NonNull android.graphics.Paint);
+ method public void drawTextRun(@NonNull android.graphics.text.MeasuredText, int, int, int, int, float, float, boolean, @NonNull android.graphics.Paint);
+ method public void drawVertices(@NonNull android.graphics.Canvas.VertexMode, int, @NonNull float[], int, @Nullable float[], int, @Nullable int[], int, @Nullable short[], int, int, @NonNull android.graphics.Paint);
method public void enableZ();
- method public boolean getClipBounds(android.graphics.Rect);
- method public final android.graphics.Rect getClipBounds();
+ method public boolean getClipBounds(@Nullable android.graphics.Rect);
+ method @NonNull public final android.graphics.Rect getClipBounds();
method public int getDensity();
- method public android.graphics.DrawFilter getDrawFilter();
+ method @Nullable public android.graphics.DrawFilter getDrawFilter();
method public int getHeight();
- method public deprecated void getMatrix(android.graphics.Matrix);
- method public final deprecated android.graphics.Matrix getMatrix();
+ method @Deprecated public void getMatrix(@NonNull android.graphics.Matrix);
+ method @Deprecated @NonNull public final android.graphics.Matrix getMatrix();
method public int getMaximumBitmapHeight();
method public int getMaximumBitmapWidth();
method public int getSaveCount();
method public int getWidth();
method public boolean isHardwareAccelerated();
method public boolean isOpaque();
- method public boolean quickReject(android.graphics.RectF, android.graphics.Canvas.EdgeType);
- method public boolean quickReject(android.graphics.Path, android.graphics.Canvas.EdgeType);
- method public boolean quickReject(float, float, float, float, android.graphics.Canvas.EdgeType);
+ method public boolean quickReject(@NonNull android.graphics.RectF, @NonNull android.graphics.Canvas.EdgeType);
+ method public boolean quickReject(@NonNull android.graphics.Path, @NonNull android.graphics.Canvas.EdgeType);
+ method public boolean quickReject(float, float, float, float, @NonNull android.graphics.Canvas.EdgeType);
method public void restore();
method public void restoreToCount(int);
method public void rotate(float);
method public final void rotate(float, float, float);
method public int save();
- method public deprecated int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
- method public int saveLayer(android.graphics.RectF, android.graphics.Paint);
- method public deprecated int saveLayer(float, float, float, float, android.graphics.Paint, int);
- method public int saveLayer(float, float, float, float, android.graphics.Paint);
- method public deprecated int saveLayerAlpha(android.graphics.RectF, int, int);
- method public int saveLayerAlpha(android.graphics.RectF, int);
- method public deprecated int saveLayerAlpha(float, float, float, float, int, int);
+ method @Deprecated public int saveLayer(@Nullable android.graphics.RectF, @Nullable android.graphics.Paint, int);
+ method public int saveLayer(@Nullable android.graphics.RectF, @Nullable android.graphics.Paint);
+ method @Deprecated public int saveLayer(float, float, float, float, @Nullable android.graphics.Paint, int);
+ method public int saveLayer(float, float, float, float, @Nullable android.graphics.Paint);
+ method @Deprecated public int saveLayerAlpha(@Nullable android.graphics.RectF, int, int);
+ method public int saveLayerAlpha(@Nullable android.graphics.RectF, int);
+ method @Deprecated public int saveLayerAlpha(float, float, float, float, int, int);
method public int saveLayerAlpha(float, float, float, float, int);
method public void scale(float, float);
method public final void scale(float, float, float, float);
- method public void setBitmap(android.graphics.Bitmap);
+ method public void setBitmap(@Nullable android.graphics.Bitmap);
method public void setDensity(int);
- method public void setDrawFilter(android.graphics.DrawFilter);
- method public void setMatrix(android.graphics.Matrix);
+ method public void setDrawFilter(@Nullable android.graphics.DrawFilter);
+ method public void setMatrix(@Nullable android.graphics.Matrix);
method public void skew(float, float);
method public void translate(float, float);
field public static final int ALL_SAVE_FLAG = 31; // 0x1f
}
- public static final class Canvas.EdgeType extends java.lang.Enum {
- method public static android.graphics.Canvas.EdgeType valueOf(java.lang.String);
- method public static final android.graphics.Canvas.EdgeType[] values();
+ public enum Canvas.EdgeType {
enum_constant public static final android.graphics.Canvas.EdgeType AA;
enum_constant public static final android.graphics.Canvas.EdgeType BW;
}
- public static final class Canvas.VertexMode extends java.lang.Enum {
- method public static android.graphics.Canvas.VertexMode valueOf(java.lang.String);
- method public static final android.graphics.Canvas.VertexMode[] values();
+ public enum Canvas.VertexMode {
enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLES;
enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLE_FAN;
enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLE_STRIP;
}
- public class Color {
+ @AnyThread public class Color {
ctor public Color();
- method public static int HSVToColor(float[]);
- method public static int HSVToColor(int, float[]);
- method public static void RGBToHSV(int, int, int, float[]);
+ method @ColorInt public static int HSVToColor(@Size(3) float[]);
+ method @ColorInt public static int HSVToColor(@IntRange(from=0, to=255) int, @Size(3) float[]);
+ method public static void RGBToHSV(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @Size(3) float[]);
method public float alpha();
- method public static float alpha(long);
- method public static int alpha(int);
- method public static int argb(int, int, int, int);
- method public static int argb(float, float, float, float);
+ method public static float alpha(@ColorLong long);
+ method @IntRange(from=0, to=255) public static int alpha(int);
+ method @ColorInt public static int argb(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int);
+ method @ColorInt public static int argb(float, float, float, float);
method public float blue();
- method public static float blue(long);
- method public static int blue(int);
- method public static android.graphics.ColorSpace colorSpace(long);
- method public static void colorToHSV(int, float[]);
- method public android.graphics.Color convert(android.graphics.ColorSpace);
- method public static long convert(int, android.graphics.ColorSpace);
- method public static long convert(long, android.graphics.ColorSpace);
- method public static long convert(float, float, float, float, android.graphics.ColorSpace, android.graphics.ColorSpace);
- method public static long convert(long, android.graphics.ColorSpace.Connector);
- method public static long convert(float, float, float, float, android.graphics.ColorSpace.Connector);
- method public android.graphics.ColorSpace getColorSpace();
- method public float getComponent(int);
- method public int getComponentCount();
- method public float[] getComponents();
- method public float[] getComponents(float[]);
+ method public static float blue(@ColorLong long);
+ method @IntRange(from=0, to=255) public static int blue(int);
+ method @NonNull public static android.graphics.ColorSpace colorSpace(@ColorLong long);
+ method public static void colorToHSV(@ColorInt int, @Size(3) float[]);
+ method @NonNull public android.graphics.Color convert(@NonNull android.graphics.ColorSpace);
+ method @ColorLong public static long convert(@ColorInt int, @NonNull android.graphics.ColorSpace);
+ method @ColorLong public static long convert(@ColorLong long, @NonNull android.graphics.ColorSpace);
+ method @ColorLong public static long convert(float, float, float, float, @NonNull android.graphics.ColorSpace, @NonNull android.graphics.ColorSpace);
+ method @ColorLong public static long convert(@ColorLong long, @NonNull android.graphics.ColorSpace.Connector);
+ method @ColorLong public static long convert(float, float, float, float, @NonNull android.graphics.ColorSpace.Connector);
+ method @NonNull public android.graphics.ColorSpace getColorSpace();
+ method public float getComponent(@IntRange(from=0, to=4) int);
+ method @IntRange(from=4, to=5) public int getComponentCount();
+ method @NonNull @Size(min=4, max=5) public float[] getComponents();
+ method @NonNull @Size(min=4) public float[] getComponents(@Nullable @Size(min=4) float[]);
method public android.graphics.ColorSpace.Model getModel();
method public float green();
- method public static float green(long);
- method public static int green(int);
- method public static boolean isInColorSpace(long, android.graphics.ColorSpace);
+ method public static float green(@ColorLong long);
+ method @IntRange(from=0, to=255) public static int green(int);
+ method public static boolean isInColorSpace(@ColorLong long, @NonNull android.graphics.ColorSpace);
method public boolean isSrgb();
- method public static boolean isSrgb(long);
+ method public static boolean isSrgb(@ColorLong long);
method public boolean isWideGamut();
- method public static boolean isWideGamut(long);
+ method public static boolean isWideGamut(@ColorLong long);
method public float luminance();
- method public static float luminance(long);
- method public static float luminance(int);
- method public long pack();
- method public static long pack(int);
- method public static long pack(float, float, float);
- method public static long pack(float, float, float, float);
- method public static long pack(float, float, float, float, android.graphics.ColorSpace);
- method public static int parseColor(java.lang.String);
+ method public static float luminance(@ColorLong long);
+ method public static float luminance(@ColorInt int);
+ method @ColorLong public long pack();
+ method @ColorLong public static long pack(@ColorInt int);
+ method @ColorLong public static long pack(float, float, float);
+ method @ColorLong public static long pack(float, float, float, float);
+ method @ColorLong public static long pack(float, float, float, float, @NonNull android.graphics.ColorSpace);
+ method @ColorInt public static int parseColor(@Size(min=1) String);
method public float red();
- method public static float red(long);
- method public static int red(int);
- method public static int rgb(int, int, int);
- method public static int rgb(float, float, float);
- method public int toArgb();
- method public static int toArgb(long);
- method public static android.graphics.Color valueOf(int);
- method public static android.graphics.Color valueOf(long);
- method public static android.graphics.Color valueOf(float, float, float);
- method public static android.graphics.Color valueOf(float, float, float, float);
- method public static android.graphics.Color valueOf(float, float, float, float, android.graphics.ColorSpace);
- method public static android.graphics.Color valueOf(float[], android.graphics.ColorSpace);
- field public static final int BLACK = -16777216; // 0xff000000
- field public static final int BLUE = -16776961; // 0xff0000ff
- field public static final int CYAN = -16711681; // 0xff00ffff
- field public static final int DKGRAY = -12303292; // 0xff444444
- field public static final int GRAY = -7829368; // 0xff888888
- field public static final int GREEN = -16711936; // 0xff00ff00
- field public static final int LTGRAY = -3355444; // 0xffcccccc
- field public static final int MAGENTA = -65281; // 0xffff00ff
- field public static final int RED = -65536; // 0xffff0000
- field public static final int TRANSPARENT = 0; // 0x0
- field public static final int WHITE = -1; // 0xffffffff
- field public static final int YELLOW = -256; // 0xffffff00
+ method public static float red(@ColorLong long);
+ method @IntRange(from=0, to=255) public static int red(int);
+ method @ColorInt public static int rgb(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int);
+ method @ColorInt public static int rgb(float, float, float);
+ method @ColorInt public int toArgb();
+ method @ColorInt public static int toArgb(@ColorLong long);
+ method @NonNull public static android.graphics.Color valueOf(@ColorInt int);
+ method @NonNull public static android.graphics.Color valueOf(@ColorLong long);
+ method @NonNull public static android.graphics.Color valueOf(float, float, float);
+ method @NonNull public static android.graphics.Color valueOf(float, float, float, float);
+ method @NonNull public static android.graphics.Color valueOf(float, float, float, float, @NonNull android.graphics.ColorSpace);
+ method @NonNull public static android.graphics.Color valueOf(@NonNull @Size(min=4, max=5) float[], @NonNull android.graphics.ColorSpace);
+ field @ColorInt public static final int BLACK = -16777216; // 0xff000000
+ field @ColorInt public static final int BLUE = -16776961; // 0xff0000ff
+ field @ColorInt public static final int CYAN = -16711681; // 0xff00ffff
+ field @ColorInt public static final int DKGRAY = -12303292; // 0xff444444
+ field @ColorInt public static final int GRAY = -7829368; // 0xff888888
+ field @ColorInt public static final int GREEN = -16711936; // 0xff00ff00
+ field @ColorInt public static final int LTGRAY = -3355444; // 0xffcccccc
+ field @ColorInt public static final int MAGENTA = -65281; // 0xffff00ff
+ field @ColorInt public static final int RED = -65536; // 0xffff0000
+ field @ColorInt public static final int TRANSPARENT = 0; // 0x0
+ field @ColorInt public static final int WHITE = -1; // 0xffffffff
+ field @ColorInt public static final int YELLOW = -256; // 0xffffff00
}
public class ColorFilter {
- ctor public deprecated ColorFilter();
+ ctor @Deprecated public ColorFilter();
}
public class ColorMatrix {
@@ -13880,34 +13912,34 @@ package android.graphics {
}
public class ColorMatrixColorFilter extends android.graphics.ColorFilter {
- ctor public ColorMatrixColorFilter(android.graphics.ColorMatrix);
- ctor public ColorMatrixColorFilter(float[]);
+ ctor public ColorMatrixColorFilter(@NonNull android.graphics.ColorMatrix);
+ ctor public ColorMatrixColorFilter(@NonNull float[]);
method public void getColorMatrix(android.graphics.ColorMatrix);
}
- public abstract class ColorSpace {
- method public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[]);
- method public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[], android.graphics.ColorSpace.Adaptation);
- method public static float[] cctToIlluminantdXyz(int);
- method public static float[] chromaticAdaptation(android.graphics.ColorSpace.Adaptation, float[], float[]);
- method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace);
- method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent);
- method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace);
- method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent);
- method public float[] fromXyz(float, float, float);
- method public abstract float[] fromXyz(float[]);
- method public static android.graphics.ColorSpace get(android.graphics.ColorSpace.Named);
- method public int getComponentCount();
- method public int getId();
- method public abstract float getMaxValue(int);
- method public abstract float getMinValue(int);
- method public android.graphics.ColorSpace.Model getModel();
- method public java.lang.String getName();
+ @AnyThread public abstract class ColorSpace {
+ method @NonNull public static android.graphics.ColorSpace adapt(@NonNull android.graphics.ColorSpace, @NonNull @Size(min=2, max=3) float[]);
+ method @NonNull public static android.graphics.ColorSpace adapt(@NonNull android.graphics.ColorSpace, @NonNull @Size(min=2, max=3) float[], @NonNull android.graphics.ColorSpace.Adaptation);
+ method @NonNull @Size(3) public static float[] cctToIlluminantdXyz(@IntRange(from=1) int);
+ method @NonNull @Size(9) public static float[] chromaticAdaptation(@NonNull android.graphics.ColorSpace.Adaptation, @NonNull @Size(min=2, max=3) float[], @NonNull @Size(min=2, max=3) float[]);
+ method @NonNull public static android.graphics.ColorSpace.Connector connect(@NonNull android.graphics.ColorSpace, @NonNull android.graphics.ColorSpace);
+ method @NonNull public static android.graphics.ColorSpace.Connector connect(@NonNull android.graphics.ColorSpace, @NonNull android.graphics.ColorSpace, @NonNull android.graphics.ColorSpace.RenderIntent);
+ method @NonNull public static android.graphics.ColorSpace.Connector connect(@NonNull android.graphics.ColorSpace);
+ method @NonNull public static android.graphics.ColorSpace.Connector connect(@NonNull android.graphics.ColorSpace, @NonNull android.graphics.ColorSpace.RenderIntent);
+ method @NonNull @Size(min=3) public float[] fromXyz(float, float, float);
+ method @NonNull @Size(min=3) public abstract float[] fromXyz(@NonNull @Size(min=3) float[]);
+ method @NonNull public static android.graphics.ColorSpace get(@NonNull android.graphics.ColorSpace.Named);
+ method @IntRange(from=1, to=4) public int getComponentCount();
+ method @IntRange(from=android.graphics.ColorSpace.MIN_ID, to=android.graphics.ColorSpace.MAX_ID) public int getId();
+ method public abstract float getMaxValue(@IntRange(from=0, to=3) int);
+ method public abstract float getMinValue(@IntRange(from=0, to=3) int);
+ method @NonNull public android.graphics.ColorSpace.Model getModel();
+ method @NonNull public String getName();
method public boolean isSrgb();
method public abstract boolean isWideGamut();
- method public static android.graphics.ColorSpace match(float[], android.graphics.ColorSpace.Rgb.TransferParameters);
- method public float[] toXyz(float, float, float);
- method public abstract float[] toXyz(float[]);
+ method @Nullable public static android.graphics.ColorSpace match(@NonNull @Size(9) float[], @NonNull android.graphics.ColorSpace.Rgb.TransferParameters);
+ method @NonNull @Size(3) public float[] toXyz(float, float, float);
+ method @NonNull @Size(min=3) public abstract float[] toXyz(@NonNull @Size(min=3) float[]);
field public static final float[] ILLUMINANT_A;
field public static final float[] ILLUMINANT_B;
field public static final float[] ILLUMINANT_C;
@@ -13921,35 +13953,29 @@ package android.graphics {
field public static final int MIN_ID = -1; // 0xffffffff
}
- public static final class ColorSpace.Adaptation extends java.lang.Enum {
- method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String);
- method public static final android.graphics.ColorSpace.Adaptation[] values();
+ public enum ColorSpace.Adaptation {
enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD;
enum_constant public static final android.graphics.ColorSpace.Adaptation CIECAT02;
enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES;
}
- public static class ColorSpace.Connector {
- method public android.graphics.ColorSpace getDestination();
+ @AnyThread public static class ColorSpace.Connector {
+ method @NonNull public android.graphics.ColorSpace getDestination();
method public android.graphics.ColorSpace.RenderIntent getRenderIntent();
- method public android.graphics.ColorSpace getSource();
- method public float[] transform(float, float, float);
- method public float[] transform(float[]);
+ method @NonNull public android.graphics.ColorSpace getSource();
+ method @NonNull @Size(3) public float[] transform(float, float, float);
+ method @NonNull @Size(min=3) public float[] transform(@NonNull @Size(min=3) float[]);
}
- public static final class ColorSpace.Model extends java.lang.Enum {
- method public int getComponentCount();
- method public static android.graphics.ColorSpace.Model valueOf(java.lang.String);
- method public static final android.graphics.ColorSpace.Model[] values();
+ public enum ColorSpace.Model {
+ method @IntRange(from=1, to=4) public int getComponentCount();
enum_constant public static final android.graphics.ColorSpace.Model CMYK;
enum_constant public static final android.graphics.ColorSpace.Model LAB;
enum_constant public static final android.graphics.ColorSpace.Model RGB;
enum_constant public static final android.graphics.ColorSpace.Model XYZ;
}
- public static final class ColorSpace.Named extends java.lang.Enum {
- method public static android.graphics.ColorSpace.Named valueOf(java.lang.String);
- method public static final android.graphics.ColorSpace.Named[] values();
+ public enum ColorSpace.Named {
enum_constant public static final android.graphics.ColorSpace.Named ACES;
enum_constant public static final android.graphics.ColorSpace.Named ACESCG;
enum_constant public static final android.graphics.ColorSpace.Named ADOBE_RGB;
@@ -13968,42 +13994,40 @@ package android.graphics {
enum_constant public static final android.graphics.ColorSpace.Named SRGB;
}
- public static final class ColorSpace.RenderIntent extends java.lang.Enum {
- method public static android.graphics.ColorSpace.RenderIntent valueOf(java.lang.String);
- method public static final android.graphics.ColorSpace.RenderIntent[] values();
+ public enum ColorSpace.RenderIntent {
enum_constant public static final android.graphics.ColorSpace.RenderIntent ABSOLUTE;
enum_constant public static final android.graphics.ColorSpace.RenderIntent PERCEPTUAL;
enum_constant public static final android.graphics.ColorSpace.RenderIntent RELATIVE;
enum_constant public static final android.graphics.ColorSpace.RenderIntent SATURATION;
}
- public static class ColorSpace.Rgb extends android.graphics.ColorSpace {
- ctor public ColorSpace.Rgb(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator);
- ctor public ColorSpace.Rgb(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float);
- ctor public ColorSpace.Rgb(java.lang.String, float[], android.graphics.ColorSpace.Rgb.TransferParameters);
- ctor public ColorSpace.Rgb(java.lang.String, float[], float[], android.graphics.ColorSpace.Rgb.TransferParameters);
- ctor public ColorSpace.Rgb(java.lang.String, float[], double);
- ctor public ColorSpace.Rgb(java.lang.String, float[], float[], double);
- method public float[] fromLinear(float, float, float);
- method public float[] fromLinear(float[]);
- method public float[] fromXyz(float[]);
- method public java.util.function.DoubleUnaryOperator getEotf();
- method public float[] getInverseTransform(float[]);
- method public float[] getInverseTransform();
+ @AnyThread public static class ColorSpace.Rgb extends android.graphics.ColorSpace {
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(9) float[], @NonNull java.util.function.DoubleUnaryOperator, @NonNull java.util.function.DoubleUnaryOperator);
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(min=6, max=9) float[], @NonNull @Size(min=2, max=3) float[], @NonNull java.util.function.DoubleUnaryOperator, @NonNull java.util.function.DoubleUnaryOperator, float, float);
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(9) float[], @NonNull android.graphics.ColorSpace.Rgb.TransferParameters);
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(min=6, max=9) float[], @NonNull @Size(min=2, max=3) float[], @NonNull android.graphics.ColorSpace.Rgb.TransferParameters);
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(9) float[], double);
+ ctor public ColorSpace.Rgb(@NonNull @Size(min=1) String, @NonNull @Size(min=6, max=9) float[], @NonNull @Size(min=2, max=3) float[], double);
+ method @NonNull @Size(3) public float[] fromLinear(float, float, float);
+ method @NonNull @Size(min=3) public float[] fromLinear(@NonNull @Size(min=3) float[]);
+ method @NonNull @Size(min=3) public float[] fromXyz(@NonNull @Size(min=3) float[]);
+ method @NonNull public java.util.function.DoubleUnaryOperator getEotf();
+ method @NonNull @Size(min=9) public float[] getInverseTransform(@NonNull @Size(min=9) float[]);
+ method @NonNull @Size(9) public float[] getInverseTransform();
method public float getMaxValue(int);
method public float getMinValue(int);
- method public java.util.function.DoubleUnaryOperator getOetf();
- method public float[] getPrimaries(float[]);
- method public float[] getPrimaries();
- method public android.graphics.ColorSpace.Rgb.TransferParameters getTransferParameters();
- method public float[] getTransform(float[]);
- method public float[] getTransform();
- method public float[] getWhitePoint(float[]);
- method public float[] getWhitePoint();
+ method @NonNull public java.util.function.DoubleUnaryOperator getOetf();
+ method @NonNull @Size(min=6) public float[] getPrimaries(@NonNull @Size(min=6) float[]);
+ method @NonNull @Size(6) public float[] getPrimaries();
+ method @Nullable public android.graphics.ColorSpace.Rgb.TransferParameters getTransferParameters();
+ method @NonNull @Size(min=9) public float[] getTransform(@NonNull @Size(min=9) float[]);
+ method @NonNull @Size(9) public float[] getTransform();
+ method @NonNull @Size(min=2) public float[] getWhitePoint(@NonNull @Size(min=2) float[]);
+ method @NonNull @Size(2) public float[] getWhitePoint();
method public boolean isWideGamut();
- method public float[] toLinear(float, float, float);
- method public float[] toLinear(float[]);
- method public float[] toXyz(float[]);
+ method @NonNull @Size(3) public float[] toLinear(float, float, float);
+ method @NonNull @Size(min=3) public float[] toLinear(@NonNull @Size(min=3) float[]);
+ method @NonNull @Size(min=3) public float[] toXyz(@NonNull @Size(min=3) float[]);
}
public static class ColorSpace.Rgb.TransferParameters {
@@ -14023,8 +14047,8 @@ package android.graphics {
}
public class ComposeShader extends android.graphics.Shader {
- ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
- ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
+ ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.Xfermode);
+ ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.PorterDuff.Mode);
}
public class CornerPathEffect extends android.graphics.PathEffect {
@@ -14044,39 +14068,39 @@ package android.graphics {
}
public class EmbossMaskFilter extends android.graphics.MaskFilter {
- ctor public deprecated EmbossMaskFilter(float[], float, float, float);
+ ctor @Deprecated public EmbossMaskFilter(float[], float, float, float);
}
public final class ImageDecoder implements java.lang.AutoCloseable {
method public void close();
- method public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, int);
- method public static android.graphics.ImageDecoder.Source createSource(android.content.ContentResolver, android.net.Uri);
- method public static android.graphics.ImageDecoder.Source createSource(android.content.res.AssetManager, java.lang.String);
- method public static android.graphics.ImageDecoder.Source createSource(java.nio.ByteBuffer);
- method public static android.graphics.ImageDecoder.Source createSource(java.io.File);
- method public static android.graphics.ImageDecoder.Source createSource(java.util.concurrent.Callable<android.content.res.AssetFileDescriptor>);
- method public static android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
- method public static android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source) throws java.io.IOException;
- method public static android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
- method public static android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source) throws java.io.IOException;
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull android.content.res.Resources, int);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull android.content.ContentResolver, @NonNull android.net.Uri);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull android.content.res.AssetManager, @NonNull String);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.nio.ByteBuffer);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.io.File);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.util.concurrent.Callable<android.content.res.AssetFileDescriptor>);
+ method @WorkerThread @NonNull public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
+ method @WorkerThread @NonNull public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
+ method @WorkerThread @NonNull public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
+ method @WorkerThread @NonNull public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
method public int getAllocator();
- method public android.graphics.Rect getCrop();
+ method @Nullable public android.graphics.Rect getCrop();
method public int getMemorySizePolicy();
- method public android.graphics.ImageDecoder.OnPartialImageListener getOnPartialImageListener();
- method public android.graphics.PostProcessor getPostProcessor();
+ method @Nullable public android.graphics.ImageDecoder.OnPartialImageListener getOnPartialImageListener();
+ method @Nullable public android.graphics.PostProcessor getPostProcessor();
method public boolean isDecodeAsAlphaMaskEnabled();
method public boolean isMutableRequired();
method public boolean isUnpremultipliedRequired();
method public void setAllocator(int);
- method public void setCrop(android.graphics.Rect);
+ method public void setCrop(@Nullable android.graphics.Rect);
method public void setDecodeAsAlphaMaskEnabled(boolean);
method public void setMemorySizePolicy(int);
method public void setMutableRequired(boolean);
- method public void setOnPartialImageListener(android.graphics.ImageDecoder.OnPartialImageListener);
- method public void setPostProcessor(android.graphics.PostProcessor);
+ method public void setOnPartialImageListener(@Nullable android.graphics.ImageDecoder.OnPartialImageListener);
+ method public void setPostProcessor(@Nullable android.graphics.PostProcessor);
method public void setTargetColorSpace(android.graphics.ColorSpace);
- method public void setTargetSampleSize(int);
- method public void setTargetSize(int, int);
+ method public void setTargetSampleSize(@IntRange(from=1) int);
+ method public void setTargetSize(@Px @IntRange(from=1) int, @Px @IntRange(from=1) int);
method public void setUnpremultipliedRequired(boolean);
field public static final int ALLOCATOR_DEFAULT = 0; // 0x0
field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
@@ -14088,28 +14112,28 @@ package android.graphics {
public static final class ImageDecoder.DecodeException extends java.io.IOException {
method public int getError();
- method public android.graphics.ImageDecoder.Source getSource();
+ method @NonNull public android.graphics.ImageDecoder.Source getSource();
field public static final int SOURCE_EXCEPTION = 1; // 0x1
field public static final int SOURCE_INCOMPLETE = 2; // 0x2
field public static final int SOURCE_MALFORMED_DATA = 3; // 0x3
}
public static class ImageDecoder.ImageInfo {
- method public android.graphics.ColorSpace getColorSpace();
- method public java.lang.String getMimeType();
- method public android.util.Size getSize();
+ method @Nullable public android.graphics.ColorSpace getColorSpace();
+ method @NonNull public String getMimeType();
+ method @NonNull public android.util.Size getSize();
method public boolean isAnimated();
}
- public static abstract interface ImageDecoder.OnHeaderDecodedListener {
- method public abstract void onHeaderDecoded(android.graphics.ImageDecoder, android.graphics.ImageDecoder.ImageInfo, android.graphics.ImageDecoder.Source);
+ public static interface ImageDecoder.OnHeaderDecodedListener {
+ method public void onHeaderDecoded(@NonNull android.graphics.ImageDecoder, @NonNull android.graphics.ImageDecoder.ImageInfo, @NonNull android.graphics.ImageDecoder.Source);
}
- public static abstract interface ImageDecoder.OnPartialImageListener {
- method public abstract boolean onPartialImage(android.graphics.ImageDecoder.DecodeException);
+ public static interface ImageDecoder.OnPartialImageListener {
+ method public boolean onPartialImage(@NonNull android.graphics.ImageDecoder.DecodeException);
}
- public static abstract class ImageDecoder.Source {
+ public abstract static class ImageDecoder.Source {
}
public class ImageFormat {
@@ -14138,12 +14162,12 @@ package android.graphics {
}
public final class Insets {
- method public static android.graphics.Insets add(android.graphics.Insets, android.graphics.Insets);
- method public static android.graphics.Insets max(android.graphics.Insets, android.graphics.Insets);
- method public static android.graphics.Insets min(android.graphics.Insets, android.graphics.Insets);
- method public static android.graphics.Insets of(int, int, int, int);
- method public static android.graphics.Insets of(android.graphics.Rect);
- method public static android.graphics.Insets subtract(android.graphics.Insets, android.graphics.Insets);
+ method @NonNull public static android.graphics.Insets add(@NonNull android.graphics.Insets, @NonNull android.graphics.Insets);
+ method @NonNull public static android.graphics.Insets max(@NonNull android.graphics.Insets, @NonNull android.graphics.Insets);
+ method @NonNull public static android.graphics.Insets min(@NonNull android.graphics.Insets, @NonNull android.graphics.Insets);
+ method @NonNull public static android.graphics.Insets of(int, int, int, int);
+ method @NonNull public static android.graphics.Insets of(@Nullable android.graphics.Rect);
+ method @NonNull public static android.graphics.Insets subtract(@NonNull android.graphics.Insets, @NonNull android.graphics.Insets);
field public static final android.graphics.Insets NONE;
field public final int bottom;
field public final int left;
@@ -14165,23 +14189,21 @@ package android.graphics {
method public android.graphics.Interpolator.Result timeToValues(int, float[]);
}
- public static final class Interpolator.Result extends java.lang.Enum {
- method public static android.graphics.Interpolator.Result valueOf(java.lang.String);
- method public static final android.graphics.Interpolator.Result[] values();
+ public enum Interpolator.Result {
enum_constant public static final android.graphics.Interpolator.Result FREEZE_END;
enum_constant public static final android.graphics.Interpolator.Result FREEZE_START;
enum_constant public static final android.graphics.Interpolator.Result NORMAL;
}
public class LightingColorFilter extends android.graphics.ColorFilter {
- ctor public LightingColorFilter(int, int);
- method public int getColorAdd();
- method public int getColorMultiply();
+ ctor public LightingColorFilter(@ColorInt int, @ColorInt int);
+ method @ColorInt public int getColorAdd();
+ method @ColorInt public int getColorMultiply();
}
public class LinearGradient extends android.graphics.Shader {
- ctor public LinearGradient(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
- ctor public LinearGradient(float, float, float, float, int, int, android.graphics.Shader.TileMode);
+ ctor public LinearGradient(float, float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public LinearGradient(float, float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
}
public class MaskFilter {
@@ -14236,7 +14258,7 @@ package android.graphics {
method public void setSkew(float, float);
method public void setTranslate(float, float);
method public void setValues(float[]);
- method public java.lang.String toShortString();
+ method public String toShortString();
field public static final int MPERSP_0 = 6; // 0x6
field public static final int MPERSP_1 = 7; // 0x7
field public static final int MPERSP_2 = 8; // 0x8
@@ -14248,38 +14270,36 @@ package android.graphics {
field public static final int MTRANS_Y = 5; // 0x5
}
- public static final class Matrix.ScaleToFit extends java.lang.Enum {
- method public static android.graphics.Matrix.ScaleToFit valueOf(java.lang.String);
- method public static final android.graphics.Matrix.ScaleToFit[] values();
+ public enum Matrix.ScaleToFit {
enum_constant public static final android.graphics.Matrix.ScaleToFit CENTER;
enum_constant public static final android.graphics.Matrix.ScaleToFit END;
enum_constant public static final android.graphics.Matrix.ScaleToFit FILL;
enum_constant public static final android.graphics.Matrix.ScaleToFit START;
}
- public deprecated class Movie {
- method public static android.graphics.Movie decodeByteArray(byte[], int, int);
- method public static android.graphics.Movie decodeFile(java.lang.String);
- method public static android.graphics.Movie decodeStream(java.io.InputStream);
- method public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
- method public void draw(android.graphics.Canvas, float, float);
- method public int duration();
- method public int height();
- method public boolean isOpaque();
- method public boolean setTime(int);
- method public int width();
+ @Deprecated public class Movie {
+ method @Deprecated public static android.graphics.Movie decodeByteArray(byte[], int, int);
+ method @Deprecated public static android.graphics.Movie decodeFile(String);
+ method @Deprecated public static android.graphics.Movie decodeStream(java.io.InputStream);
+ method @Deprecated public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
+ method @Deprecated public void draw(android.graphics.Canvas, float, float);
+ method @Deprecated public int duration();
+ method @Deprecated public int height();
+ method @Deprecated public boolean isOpaque();
+ method @Deprecated public boolean setTime(int);
+ method @Deprecated public int width();
}
public class NinePatch {
ctor public NinePatch(android.graphics.Bitmap, byte[]);
- ctor public NinePatch(android.graphics.Bitmap, byte[], java.lang.String);
+ ctor public NinePatch(android.graphics.Bitmap, byte[], String);
method public void draw(android.graphics.Canvas, android.graphics.RectF);
method public void draw(android.graphics.Canvas, android.graphics.Rect);
method public void draw(android.graphics.Canvas, android.graphics.Rect, android.graphics.Paint);
method public android.graphics.Bitmap getBitmap();
method public int getDensity();
method public int getHeight();
- method public java.lang.String getName();
+ method public String getName();
method public android.graphics.Paint getPaint();
method public final android.graphics.Region getTransparentRegion(android.graphics.Rect);
method public int getWidth();
@@ -14290,23 +14310,23 @@ package android.graphics {
public final class Outline {
ctor public Outline();
- ctor public Outline(android.graphics.Outline);
+ ctor public Outline(@NonNull android.graphics.Outline);
method public boolean canClip();
method public float getAlpha();
method public float getRadius();
- method public boolean getRect(android.graphics.Rect);
+ method public boolean getRect(@NonNull android.graphics.Rect);
method public boolean isEmpty();
method public void offset(int, int);
- method public void set(android.graphics.Outline);
- method public void setAlpha(float);
- method public void setConvexPath(android.graphics.Path);
+ method public void set(@NonNull android.graphics.Outline);
+ method public void setAlpha(@FloatRange(from=0.0, to=1.0) float);
+ method public void setConvexPath(@NonNull android.graphics.Path);
method public void setEmpty();
method public void setOval(int, int, int, int);
- method public void setOval(android.graphics.Rect);
+ method public void setOval(@NonNull android.graphics.Rect);
method public void setRect(int, int, int, int);
- method public void setRect(android.graphics.Rect);
+ method public void setRect(@NonNull android.graphics.Rect);
method public void setRoundRect(int, int, int, int, float);
- method public void setRoundRect(android.graphics.Rect, float);
+ method public void setRoundRect(@NonNull android.graphics.Rect, float);
}
public class Paint {
@@ -14315,69 +14335,69 @@ package android.graphics {
ctor public Paint(android.graphics.Paint);
method public float ascent();
method public int breakText(char[], int, int, float, float[]);
- method public int breakText(java.lang.CharSequence, int, int, boolean, float, float[]);
- method public int breakText(java.lang.String, boolean, float, float[]);
+ method public int breakText(CharSequence, int, int, boolean, float, float[]);
+ method public int breakText(String, boolean, float, float[]);
method public void clearShadowLayer();
method public float descent();
- method public boolean equalsForTextMeasurement(android.graphics.Paint);
+ method public boolean equalsForTextMeasurement(@NonNull android.graphics.Paint);
method public int getAlpha();
- method public android.graphics.BlendMode getBlendMode();
- method public int getColor();
+ method @Nullable public android.graphics.BlendMode getBlendMode();
+ method @ColorInt public int getColor();
method public android.graphics.ColorFilter getColorFilter();
method public boolean getFillPath(android.graphics.Path, android.graphics.Path);
method public int getFlags();
- method public java.lang.String getFontFeatureSettings();
+ method public String getFontFeatureSettings();
method public float getFontMetrics(android.graphics.Paint.FontMetrics);
method public android.graphics.Paint.FontMetrics getFontMetrics();
method public int getFontMetricsInt(android.graphics.Paint.FontMetricsInt);
method public android.graphics.Paint.FontMetricsInt getFontMetricsInt();
method public float getFontSpacing();
- method public java.lang.String getFontVariationSettings();
+ method public String getFontVariationSettings();
method public int getHinting();
method public int getHyphenEdit();
method public float getLetterSpacing();
method public android.graphics.MaskFilter getMaskFilter();
method public int getOffsetForAdvance(char[], int, int, int, int, boolean, float);
- method public int getOffsetForAdvance(java.lang.CharSequence, int, int, int, int, boolean, float);
+ method public int getOffsetForAdvance(CharSequence, int, int, int, int, boolean, float);
method public android.graphics.PathEffect getPathEffect();
method public float getRunAdvance(char[], int, int, int, int, boolean, int);
- method public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int);
+ method public float getRunAdvance(CharSequence, int, int, int, int, boolean, int);
method public android.graphics.Shader getShader();
- method public int getShadowLayerColor();
+ method @ColorInt public int getShadowLayerColor();
method public float getShadowLayerDx();
method public float getShadowLayerDy();
method public float getShadowLayerRadius();
- method public float getStrikeThruPosition();
- method public float getStrikeThruThickness();
+ method @Px public float getStrikeThruPosition();
+ method @Px public float getStrikeThruThickness();
method public android.graphics.Paint.Cap getStrokeCap();
method public android.graphics.Paint.Join getStrokeJoin();
method public float getStrokeMiter();
method public float getStrokeWidth();
method public android.graphics.Paint.Style getStyle();
method public android.graphics.Paint.Align getTextAlign();
- method public void getTextBounds(java.lang.String, int, int, android.graphics.Rect);
- method public void getTextBounds(java.lang.CharSequence, int, int, android.graphics.Rect);
+ method public void getTextBounds(String, int, int, android.graphics.Rect);
+ method public void getTextBounds(CharSequence, int, int, android.graphics.Rect);
method public void getTextBounds(char[], int, int, android.graphics.Rect);
- method public java.util.Locale getTextLocale();
- method public android.os.LocaleList getTextLocales();
+ method @NonNull public java.util.Locale getTextLocale();
+ method @NonNull @Size(min=1) public android.os.LocaleList getTextLocales();
method public void getTextPath(char[], int, int, float, float, android.graphics.Path);
- method public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path);
- method public float getTextRunAdvances(char[], int, int, int, int, boolean, float[], int);
- method public int getTextRunCursor(char[], int, int, boolean, int, int);
- method public int getTextRunCursor(java.lang.CharSequence, int, int, boolean, int, int);
+ method public void getTextPath(String, int, int, float, float, android.graphics.Path);
+ method public float getTextRunAdvances(@NonNull char[], @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean, @Nullable float[], @IntRange(from=0) int);
+ method public int getTextRunCursor(@NonNull char[], @IntRange(from=0) int, @IntRange(from=0) int, boolean, @IntRange(from=0) int, int);
+ method public int getTextRunCursor(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, boolean, @IntRange(from=0) int, int);
method public float getTextScaleX();
method public float getTextSize();
method public float getTextSkewX();
method public int getTextWidths(char[], int, int, float[]);
- method public int getTextWidths(java.lang.CharSequence, int, int, float[]);
- method public int getTextWidths(java.lang.String, int, int, float[]);
- method public int getTextWidths(java.lang.String, float[]);
+ method public int getTextWidths(CharSequence, int, int, float[]);
+ method public int getTextWidths(String, int, int, float[]);
+ method public int getTextWidths(String, float[]);
method public android.graphics.Typeface getTypeface();
- method public float getUnderlinePosition();
- method public float getUnderlineThickness();
+ method @Px public float getUnderlinePosition();
+ method @Px public float getUnderlineThickness();
method public float getWordSpacing();
- method public deprecated android.graphics.Xfermode getXfermode();
- method public boolean hasGlyph(java.lang.String);
+ method @Deprecated public android.graphics.Xfermode getXfermode();
+ method public boolean hasGlyph(String);
method public final boolean isAntiAlias();
method public final boolean isDither();
method public boolean isElegantTextHeight();
@@ -14388,24 +14408,24 @@ package android.graphics {
method public final boolean isSubpixelText();
method public final boolean isUnderlineText();
method public float measureText(char[], int, int);
- method public float measureText(java.lang.String, int, int);
- method public float measureText(java.lang.String);
- method public float measureText(java.lang.CharSequence, int, int);
+ method public float measureText(String, int, int);
+ method public float measureText(String);
+ method public float measureText(CharSequence, int, int);
method public void reset();
method public void set(android.graphics.Paint);
method public void setARGB(int, int, int, int);
method public void setAlpha(int);
method public void setAntiAlias(boolean);
- method public void setBlendMode(android.graphics.BlendMode);
- method public void setColor(int);
+ method public void setBlendMode(@Nullable android.graphics.BlendMode);
+ method public void setColor(@ColorInt int);
method public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
method public void setDither(boolean);
method public void setElegantTextHeight(boolean);
method public void setFakeBoldText(boolean);
method public void setFilterBitmap(boolean);
method public void setFlags(int);
- method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String);
+ method public void setFontFeatureSettings(String);
+ method public boolean setFontVariationSettings(String);
method public void setHinting(int);
method public void setHyphenEdit(int);
method public void setLetterSpacing(float);
@@ -14413,7 +14433,7 @@ package android.graphics {
method public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
method public android.graphics.Shader setShader(android.graphics.Shader);
- method public void setShadowLayer(float, float, float, int);
+ method public void setShadowLayer(float, float, float, @ColorInt int);
method public void setStrikeThruText(boolean);
method public void setStrokeCap(android.graphics.Paint.Cap);
method public void setStrokeJoin(android.graphics.Paint.Join);
@@ -14422,15 +14442,15 @@ package android.graphics {
method public void setStyle(android.graphics.Paint.Style);
method public void setSubpixelText(boolean);
method public void setTextAlign(android.graphics.Paint.Align);
- method public void setTextLocale(java.util.Locale);
- method public void setTextLocales(android.os.LocaleList);
+ method public void setTextLocale(@NonNull java.util.Locale);
+ method public void setTextLocales(@NonNull @Size(min=1) android.os.LocaleList);
method public void setTextScaleX(float);
method public void setTextSize(float);
method public void setTextSkewX(float);
method public android.graphics.Typeface setTypeface(android.graphics.Typeface);
method public void setUnderlineText(boolean);
method public void setWordSpacing(float);
- method public deprecated android.graphics.Xfermode setXfermode(android.graphics.Xfermode);
+ method @Deprecated public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);
field public static final int ANTI_ALIAS_FLAG = 1; // 0x1
field public static final int CURSOR_AFTER = 0; // 0x0
field public static final int CURSOR_AT = 4; // 0x4
@@ -14450,17 +14470,13 @@ package android.graphics {
field public static final int UNDERLINE_TEXT_FLAG = 8; // 0x8
}
- public static final class Paint.Align extends java.lang.Enum {
- method public static android.graphics.Paint.Align valueOf(java.lang.String);
- method public static final android.graphics.Paint.Align[] values();
+ public enum Paint.Align {
enum_constant public static final android.graphics.Paint.Align CENTER;
enum_constant public static final android.graphics.Paint.Align LEFT;
enum_constant public static final android.graphics.Paint.Align RIGHT;
}
- public static final class Paint.Cap extends java.lang.Enum {
- method public static android.graphics.Paint.Cap valueOf(java.lang.String);
- method public static final android.graphics.Paint.Cap[] values();
+ public enum Paint.Cap {
enum_constant public static final android.graphics.Paint.Cap BUTT;
enum_constant public static final android.graphics.Paint.Cap ROUND;
enum_constant public static final android.graphics.Paint.Cap SQUARE;
@@ -14484,17 +14500,13 @@ package android.graphics {
field public int top;
}
- public static final class Paint.Join extends java.lang.Enum {
- method public static android.graphics.Paint.Join valueOf(java.lang.String);
- method public static final android.graphics.Paint.Join[] values();
+ public enum Paint.Join {
enum_constant public static final android.graphics.Paint.Join BEVEL;
enum_constant public static final android.graphics.Paint.Join MITER;
enum_constant public static final android.graphics.Paint.Join ROUND;
}
- public static final class Paint.Style extends java.lang.Enum {
- method public static android.graphics.Paint.Style valueOf(java.lang.String);
- method public static final android.graphics.Paint.Style[] values();
+ public enum Paint.Style {
enum_constant public static final android.graphics.Paint.Style FILL;
enum_constant public static final android.graphics.Paint.Style FILL_AND_STROKE;
enum_constant public static final android.graphics.Paint.Style STROKE;
@@ -14506,40 +14518,40 @@ package android.graphics {
public class Path {
ctor public Path();
- ctor public Path(android.graphics.Path);
- method public void addArc(android.graphics.RectF, float, float);
+ ctor public Path(@Nullable android.graphics.Path);
+ method public void addArc(@NonNull android.graphics.RectF, float, float);
method public void addArc(float, float, float, float, float, float);
- method public void addCircle(float, float, float, android.graphics.Path.Direction);
- method public void addOval(android.graphics.RectF, android.graphics.Path.Direction);
- method public void addOval(float, float, float, float, android.graphics.Path.Direction);
- method public void addPath(android.graphics.Path, float, float);
- method public void addPath(android.graphics.Path);
- method public void addPath(android.graphics.Path, android.graphics.Matrix);
- method public void addRect(android.graphics.RectF, android.graphics.Path.Direction);
- method public void addRect(float, float, float, float, android.graphics.Path.Direction);
- method public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path.Direction);
- method public void addRoundRect(float, float, float, float, float, float, android.graphics.Path.Direction);
- method public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction);
- method public void addRoundRect(float, float, float, float, float[], android.graphics.Path.Direction);
- method public float[] approximate(float);
- method public void arcTo(android.graphics.RectF, float, float, boolean);
- method public void arcTo(android.graphics.RectF, float, float);
+ method public void addCircle(float, float, float, @NonNull android.graphics.Path.Direction);
+ method public void addOval(@NonNull android.graphics.RectF, @NonNull android.graphics.Path.Direction);
+ method public void addOval(float, float, float, float, @NonNull android.graphics.Path.Direction);
+ method public void addPath(@NonNull android.graphics.Path, float, float);
+ method public void addPath(@NonNull android.graphics.Path);
+ method public void addPath(@NonNull android.graphics.Path, @NonNull android.graphics.Matrix);
+ method public void addRect(@NonNull android.graphics.RectF, @NonNull android.graphics.Path.Direction);
+ method public void addRect(float, float, float, float, @NonNull android.graphics.Path.Direction);
+ method public void addRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Path.Direction);
+ method public void addRoundRect(float, float, float, float, float, float, @NonNull android.graphics.Path.Direction);
+ method public void addRoundRect(@NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.Path.Direction);
+ method public void addRoundRect(float, float, float, float, @NonNull float[], @NonNull android.graphics.Path.Direction);
+ method @NonNull @Size(min=6, multiple=3) public float[] approximate(@FloatRange(from=0) float);
+ method public void arcTo(@NonNull android.graphics.RectF, float, float, boolean);
+ method public void arcTo(@NonNull android.graphics.RectF, float, float);
method public void arcTo(float, float, float, float, float, float, boolean);
method public void close();
- method public void computeBounds(android.graphics.RectF, boolean);
+ method public void computeBounds(@NonNull android.graphics.RectF, boolean);
method public void cubicTo(float, float, float, float, float, float);
- method public android.graphics.Path.FillType getFillType();
+ method @NonNull public android.graphics.Path.FillType getFillType();
method public void incReserve(int);
method public boolean isConvex();
method public boolean isEmpty();
method public boolean isInverseFillType();
- method public boolean isRect(android.graphics.RectF);
+ method public boolean isRect(@Nullable android.graphics.RectF);
method public void lineTo(float, float);
method public void moveTo(float, float);
- method public void offset(float, float, android.graphics.Path);
+ method public void offset(float, float, @Nullable android.graphics.Path);
method public void offset(float, float);
- method public boolean op(android.graphics.Path, android.graphics.Path.Op);
- method public boolean op(android.graphics.Path, android.graphics.Path, android.graphics.Path.Op);
+ method public boolean op(@NonNull android.graphics.Path, @NonNull android.graphics.Path.Op);
+ method public boolean op(@NonNull android.graphics.Path, @NonNull android.graphics.Path, @NonNull android.graphics.Path.Op);
method public void quadTo(float, float, float, float);
method public void rCubicTo(float, float, float, float, float, float);
method public void rLineTo(float, float);
@@ -14547,33 +14559,27 @@ package android.graphics {
method public void rQuadTo(float, float, float, float);
method public void reset();
method public void rewind();
- method public void set(android.graphics.Path);
- method public void setFillType(android.graphics.Path.FillType);
+ method public void set(@NonNull android.graphics.Path);
+ method public void setFillType(@NonNull android.graphics.Path.FillType);
method public void setLastPoint(float, float);
method public void toggleInverseFillType();
- method public void transform(android.graphics.Matrix, android.graphics.Path);
- method public void transform(android.graphics.Matrix);
+ method public void transform(@NonNull android.graphics.Matrix, @Nullable android.graphics.Path);
+ method public void transform(@NonNull android.graphics.Matrix);
}
- public static final class Path.Direction extends java.lang.Enum {
- method public static android.graphics.Path.Direction valueOf(java.lang.String);
- method public static final android.graphics.Path.Direction[] values();
+ public enum Path.Direction {
enum_constant public static final android.graphics.Path.Direction CCW;
enum_constant public static final android.graphics.Path.Direction CW;
}
- public static final class Path.FillType extends java.lang.Enum {
- method public static android.graphics.Path.FillType valueOf(java.lang.String);
- method public static final android.graphics.Path.FillType[] values();
+ public enum Path.FillType {
enum_constant public static final android.graphics.Path.FillType EVEN_ODD;
enum_constant public static final android.graphics.Path.FillType INVERSE_EVEN_ODD;
enum_constant public static final android.graphics.Path.FillType INVERSE_WINDING;
enum_constant public static final android.graphics.Path.FillType WINDING;
}
- public static final class Path.Op extends java.lang.Enum {
- method public static android.graphics.Path.Op valueOf(java.lang.String);
- method public static final android.graphics.Path.Op[] values();
+ public enum Path.Op {
enum_constant public static final android.graphics.Path.Op DIFFERENCE;
enum_constant public static final android.graphics.Path.Op INTERSECT;
enum_constant public static final android.graphics.Path.Op REVERSE_DIFFERENCE;
@@ -14585,9 +14591,7 @@ package android.graphics {
ctor public PathDashPathEffect(android.graphics.Path, float, float, android.graphics.PathDashPathEffect.Style);
}
- public static final class PathDashPathEffect.Style extends java.lang.Enum {
- method public static android.graphics.PathDashPathEffect.Style valueOf(java.lang.String);
- method public static final android.graphics.PathDashPathEffect.Style[] values();
+ public enum PathDashPathEffect.Style {
enum_constant public static final android.graphics.PathDashPathEffect.Style MORPH;
enum_constant public static final android.graphics.PathDashPathEffect.Style ROTATE;
enum_constant public static final android.graphics.PathDashPathEffect.Style TRANSLATE;
@@ -14626,26 +14630,26 @@ package android.graphics {
ctor public PixelFormat();
method public static boolean formatHasAlpha(int);
method public static void getPixelFormatInfo(int, android.graphics.PixelFormat);
- field public static final deprecated int A_8 = 8; // 0x8
- field public static final deprecated int JPEG = 256; // 0x100
- field public static final deprecated int LA_88 = 10; // 0xa
- field public static final deprecated int L_8 = 9; // 0x9
+ field @Deprecated public static final int A_8 = 8; // 0x8
+ field @Deprecated public static final int JPEG = 256; // 0x100
+ field @Deprecated public static final int LA_88 = 10; // 0xa
+ field @Deprecated public static final int L_8 = 9; // 0x9
field public static final int OPAQUE = -1; // 0xffffffff
field public static final int RGBA_1010102 = 43; // 0x2b
- field public static final deprecated int RGBA_4444 = 7; // 0x7
- field public static final deprecated int RGBA_5551 = 6; // 0x6
+ field @Deprecated public static final int RGBA_4444 = 7; // 0x7
+ field @Deprecated public static final int RGBA_5551 = 6; // 0x6
field public static final int RGBA_8888 = 1; // 0x1
field public static final int RGBA_F16 = 22; // 0x16
field public static final int RGBX_8888 = 2; // 0x2
- field public static final deprecated int RGB_332 = 11; // 0xb
+ field @Deprecated public static final int RGB_332 = 11; // 0xb
field public static final int RGB_565 = 4; // 0x4
field public static final int RGB_888 = 3; // 0x3
field public static final int TRANSLUCENT = -3; // 0xfffffffd
field public static final int TRANSPARENT = -2; // 0xfffffffe
field public static final int UNKNOWN = 0; // 0x0
- field public static final deprecated int YCbCr_420_SP = 17; // 0x11
- field public static final deprecated int YCbCr_422_I = 20; // 0x14
- field public static final deprecated int YCbCr_422_SP = 16; // 0x10
+ field @Deprecated public static final int YCbCr_420_SP = 17; // 0x11
+ field @Deprecated public static final int YCbCr_422_I = 20; // 0x14
+ field @Deprecated public static final int YCbCr_422_SP = 16; // 0x10
field public int bitsPerPixel;
field public int bytesPerPixel;
}
@@ -14653,12 +14657,12 @@ package android.graphics {
public class Point implements android.os.Parcelable {
ctor public Point();
ctor public Point(int, int);
- ctor public Point(android.graphics.Point);
+ ctor public Point(@NonNull android.graphics.Point);
method public int describeContents();
method public final boolean equals(int, int);
method public final void negate();
method public final void offset(int, int);
- method public void readFromParcel(android.os.Parcel);
+ method public void readFromParcel(@NonNull android.os.Parcel);
method public void set(int, int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.Point> CREATOR;
@@ -14669,16 +14673,16 @@ package android.graphics {
public class PointF implements android.os.Parcelable {
ctor public PointF();
ctor public PointF(float, float);
- ctor public PointF(android.graphics.Point);
+ ctor public PointF(@NonNull android.graphics.Point);
method public int describeContents();
method public final boolean equals(float, float);
method public final float length();
method public static float length(float, float);
method public final void negate();
method public final void offset(float, float);
- method public void readFromParcel(android.os.Parcel);
+ method public void readFromParcel(@NonNull android.os.Parcel);
method public final void set(float, float);
- method public final void set(android.graphics.PointF);
+ method public final void set(@NonNull android.graphics.PointF);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.PointF> CREATOR;
field public float x;
@@ -14689,9 +14693,7 @@ package android.graphics {
ctor public PorterDuff();
}
- public static final class PorterDuff.Mode extends java.lang.Enum {
- method public static android.graphics.PorterDuff.Mode valueOf(java.lang.String);
- method public static final android.graphics.PorterDuff.Mode[] values();
+ public enum PorterDuff.Mode {
enum_constant public static final android.graphics.PorterDuff.Mode ADD;
enum_constant public static final android.graphics.PorterDuff.Mode CLEAR;
enum_constant public static final android.graphics.PorterDuff.Mode DARKEN;
@@ -14712,58 +14714,60 @@ package android.graphics {
enum_constant public static final android.graphics.PorterDuff.Mode XOR;
}
- public deprecated class PorterDuffColorFilter extends android.graphics.ColorFilter {
- ctor public PorterDuffColorFilter(int, android.graphics.PorterDuff.Mode);
+ @Deprecated public class PorterDuffColorFilter extends android.graphics.ColorFilter {
+ ctor @Deprecated public PorterDuffColorFilter(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
}
public class PorterDuffXfermode extends android.graphics.Xfermode {
ctor public PorterDuffXfermode(android.graphics.PorterDuff.Mode);
}
- public abstract interface PostProcessor {
- method public abstract int onPostProcess(android.graphics.Canvas);
+ public interface PostProcessor {
+ method public int onPostProcess(@NonNull android.graphics.Canvas);
}
public class RadialGradient extends android.graphics.Shader {
- ctor public RadialGradient(float, float, float, int[], float[], android.graphics.Shader.TileMode);
- ctor public RadialGradient(float, float, float, int, int, android.graphics.Shader.TileMode);
+ ctor public RadialGradient(float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public RadialGradient(float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
}
public final class RecordingCanvas extends android.graphics.Canvas {
+ method public final void drawPatch(@NonNull android.graphics.NinePatch, @NonNull android.graphics.Rect, @Nullable android.graphics.Paint);
+ method public final void drawPatch(@NonNull android.graphics.NinePatch, @NonNull android.graphics.RectF, @Nullable android.graphics.Paint);
}
public final class Rect implements android.os.Parcelable {
ctor public Rect();
ctor public Rect(int, int, int, int);
- ctor public Rect(android.graphics.Rect);
+ ctor public Rect(@Nullable android.graphics.Rect);
method public int centerX();
method public int centerY();
method public boolean contains(int, int);
method public boolean contains(int, int, int, int);
- method public boolean contains(android.graphics.Rect);
+ method public boolean contains(@NonNull android.graphics.Rect);
method public int describeContents();
method public float exactCenterX();
method public float exactCenterY();
- method public java.lang.String flattenToString();
+ method @NonNull public String flattenToString();
method public int height();
method public void inset(int, int);
- method public boolean intersect(int, int, int, int);
- method public boolean intersect(android.graphics.Rect);
+ method @CheckResult public boolean intersect(int, int, int, int);
+ method @CheckResult public boolean intersect(@NonNull android.graphics.Rect);
method public boolean intersects(int, int, int, int);
- method public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
+ method public static boolean intersects(@NonNull android.graphics.Rect, @NonNull android.graphics.Rect);
method public boolean isEmpty();
method public void offset(int, int);
method public void offsetTo(int, int);
- method public void readFromParcel(android.os.Parcel);
+ method public void readFromParcel(@NonNull android.os.Parcel);
method public void set(int, int, int, int);
- method public void set(android.graphics.Rect);
+ method public void set(@NonNull android.graphics.Rect);
method public void setEmpty();
- method public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
+ method @CheckResult public boolean setIntersect(@NonNull android.graphics.Rect, @NonNull android.graphics.Rect);
method public void sort();
- method public java.lang.String toShortString();
- method public static android.graphics.Rect unflattenFromString(java.lang.String);
+ method @NonNull public String toShortString();
+ method @Nullable public static android.graphics.Rect unflattenFromString(@Nullable String);
method public void union(int, int, int, int);
- method public void union(android.graphics.Rect);
+ method public void union(@NonNull android.graphics.Rect);
method public void union(int, int);
method public int width();
method public void writeToParcel(android.os.Parcel, int);
@@ -14777,35 +14781,35 @@ package android.graphics {
public class RectF implements android.os.Parcelable {
ctor public RectF();
ctor public RectF(float, float, float, float);
- ctor public RectF(android.graphics.RectF);
- ctor public RectF(android.graphics.Rect);
+ ctor public RectF(@Nullable android.graphics.RectF);
+ ctor public RectF(@Nullable android.graphics.Rect);
method public final float centerX();
method public final float centerY();
method public boolean contains(float, float);
method public boolean contains(float, float, float, float);
- method public boolean contains(android.graphics.RectF);
+ method public boolean contains(@NonNull android.graphics.RectF);
method public int describeContents();
method public final float height();
method public void inset(float, float);
method public boolean intersect(float, float, float, float);
- method public boolean intersect(android.graphics.RectF);
+ method public boolean intersect(@NonNull android.graphics.RectF);
method public boolean intersects(float, float, float, float);
- method public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
+ method public static boolean intersects(@NonNull android.graphics.RectF, @NonNull android.graphics.RectF);
method public final boolean isEmpty();
method public void offset(float, float);
method public void offsetTo(float, float);
- method public void readFromParcel(android.os.Parcel);
- method public void round(android.graphics.Rect);
- method public void roundOut(android.graphics.Rect);
+ method public void readFromParcel(@NonNull android.os.Parcel);
+ method public void round(@NonNull android.graphics.Rect);
+ method public void roundOut(@NonNull android.graphics.Rect);
method public void set(float, float, float, float);
- method public void set(android.graphics.RectF);
- method public void set(android.graphics.Rect);
+ method public void set(@NonNull android.graphics.RectF);
+ method public void set(@NonNull android.graphics.Rect);
method public void setEmpty();
- method public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
+ method public boolean setIntersect(@NonNull android.graphics.RectF, @NonNull android.graphics.RectF);
method public void sort();
- method public java.lang.String toShortString();
+ method @NonNull public String toShortString();
method public void union(float, float, float, float);
- method public void union(android.graphics.RectF);
+ method public void union(@NonNull android.graphics.RectF);
method public void union(float, float);
method public final float width();
method public void writeToParcel(android.os.Parcel, int);
@@ -14818,43 +14822,41 @@ package android.graphics {
public class Region implements android.os.Parcelable {
ctor public Region();
- ctor public Region(android.graphics.Region);
- ctor public Region(android.graphics.Rect);
+ ctor public Region(@NonNull android.graphics.Region);
+ ctor public Region(@NonNull android.graphics.Rect);
ctor public Region(int, int, int, int);
method public boolean contains(int, int);
method public int describeContents();
- method public android.graphics.Path getBoundaryPath();
- method public boolean getBoundaryPath(android.graphics.Path);
- method public android.graphics.Rect getBounds();
- method public boolean getBounds(android.graphics.Rect);
+ method @NonNull public android.graphics.Path getBoundaryPath();
+ method public boolean getBoundaryPath(@NonNull android.graphics.Path);
+ method @NonNull public android.graphics.Rect getBounds();
+ method public boolean getBounds(@NonNull android.graphics.Rect);
method public boolean isComplex();
method public boolean isEmpty();
method public boolean isRect();
- method public boolean op(android.graphics.Rect, android.graphics.Region.Op);
- method public boolean op(int, int, int, int, android.graphics.Region.Op);
- method public boolean op(android.graphics.Region, android.graphics.Region.Op);
- method public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region.Op);
- method public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region.Op);
- method public boolean quickContains(android.graphics.Rect);
+ method public boolean op(@NonNull android.graphics.Rect, @NonNull android.graphics.Region.Op);
+ method public boolean op(int, int, int, int, @NonNull android.graphics.Region.Op);
+ method public boolean op(@NonNull android.graphics.Region, @NonNull android.graphics.Region.Op);
+ method public boolean op(@NonNull android.graphics.Rect, @NonNull android.graphics.Region, @NonNull android.graphics.Region.Op);
+ method public boolean op(@NonNull android.graphics.Region, @NonNull android.graphics.Region, @NonNull android.graphics.Region.Op);
+ method public boolean quickContains(@NonNull android.graphics.Rect);
method public boolean quickContains(int, int, int, int);
- method public boolean quickReject(android.graphics.Rect);
+ method public boolean quickReject(@NonNull android.graphics.Rect);
method public boolean quickReject(int, int, int, int);
method public boolean quickReject(android.graphics.Region);
- method public boolean set(android.graphics.Region);
- method public boolean set(android.graphics.Rect);
+ method public boolean set(@NonNull android.graphics.Region);
+ method public boolean set(@NonNull android.graphics.Rect);
method public boolean set(int, int, int, int);
method public void setEmpty();
- method public boolean setPath(android.graphics.Path, android.graphics.Region);
+ method public boolean setPath(@NonNull android.graphics.Path, @NonNull android.graphics.Region);
method public void translate(int, int);
method public void translate(int, int, android.graphics.Region);
- method public final boolean union(android.graphics.Rect);
+ method public final boolean union(@NonNull android.graphics.Rect);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.Region> CREATOR;
}
- public static final class Region.Op extends java.lang.Enum {
- method public static android.graphics.Region.Op valueOf(java.lang.String);
- method public static final android.graphics.Region.Op[] values();
+ public enum Region.Op {
enum_constant public static final android.graphics.Region.Op DIFFERENCE;
enum_constant public static final android.graphics.Region.Op INTERSECT;
enum_constant public static final android.graphics.Region.Op REPLACE;
@@ -14869,7 +14871,7 @@ package android.graphics {
}
public final class RenderNode {
- ctor public RenderNode(java.lang.String);
+ ctor public RenderNode(String);
method public int computeApproximateMemoryUsage();
method public void discardDisplayList();
method public void endRecording();
@@ -14881,9 +14883,9 @@ package android.graphics {
method public boolean getClipToOutline();
method public float getElevation();
method public int getHeight();
- method public void getInverseMatrix(android.graphics.Matrix);
+ method public void getInverseMatrix(@NonNull android.graphics.Matrix);
method public int getLeft();
- method public void getMatrix(android.graphics.Matrix);
+ method public void getMatrix(@NonNull android.graphics.Matrix);
method public float getPivotX();
method public float getPivotY();
method public int getRight();
@@ -14913,7 +14915,7 @@ package android.graphics {
method public boolean setAmbientShadowColor(int);
method public boolean setBottom(int);
method public boolean setCameraDistance(float);
- method public boolean setClipBounds(android.graphics.Rect);
+ method public boolean setClipBounds(@Nullable android.graphics.Rect);
method public boolean setClipToBounds(boolean);
method public boolean setClipToOutline(boolean);
method public boolean setElevation(float);
@@ -14921,7 +14923,7 @@ package android.graphics {
method public boolean setHasOverlappingRendering(boolean);
method public boolean setLeft(int);
method public boolean setLeftTopRightBottom(int, int, int, int);
- method public boolean setOutline(android.graphics.Outline);
+ method public boolean setOutline(@Nullable android.graphics.Outline);
method public boolean setPivotX(float);
method public boolean setPivotY(float);
method public boolean setProjectBackwards(boolean);
@@ -14937,20 +14939,18 @@ package android.graphics {
method public boolean setTranslationX(float);
method public boolean setTranslationY(float);
method public boolean setTranslationZ(float);
- method public boolean setUseCompositingLayer(boolean, android.graphics.Paint);
+ method public boolean setUseCompositingLayer(boolean, @Nullable android.graphics.Paint);
method public android.graphics.RecordingCanvas startRecording(int, int);
method public android.graphics.RecordingCanvas startRecording();
}
public class Shader {
- ctor public deprecated Shader();
- method public boolean getLocalMatrix(android.graphics.Matrix);
- method public void setLocalMatrix(android.graphics.Matrix);
+ ctor @Deprecated public Shader();
+ method public boolean getLocalMatrix(@NonNull android.graphics.Matrix);
+ method public void setLocalMatrix(@Nullable android.graphics.Matrix);
}
- public static final class Shader.TileMode extends java.lang.Enum {
- method public static android.graphics.Shader.TileMode valueOf(java.lang.String);
- method public static final android.graphics.Shader.TileMode[] values();
+ public enum Shader.TileMode {
enum_constant public static final android.graphics.Shader.TileMode CLAMP;
enum_constant public static final android.graphics.Shader.TileMode MIRROR;
enum_constant public static final android.graphics.Shader.TileMode REPEAT;
@@ -14972,35 +14972,35 @@ package android.graphics {
method public void release();
method public void releaseTexImage();
method public void setDefaultBufferSize(int, int);
- method public void setOnFrameAvailableListener(android.graphics.SurfaceTexture.OnFrameAvailableListener);
- method public void setOnFrameAvailableListener(android.graphics.SurfaceTexture.OnFrameAvailableListener, android.os.Handler);
+ method public void setOnFrameAvailableListener(@Nullable android.graphics.SurfaceTexture.OnFrameAvailableListener);
+ method public void setOnFrameAvailableListener(@Nullable android.graphics.SurfaceTexture.OnFrameAvailableListener, @Nullable android.os.Handler);
method public void updateTexImage();
}
- public static abstract interface SurfaceTexture.OnFrameAvailableListener {
- method public abstract void onFrameAvailable(android.graphics.SurfaceTexture);
+ public static interface SurfaceTexture.OnFrameAvailableListener {
+ method public void onFrameAvailable(android.graphics.SurfaceTexture);
}
- public static deprecated class SurfaceTexture.OutOfResourcesException extends java.lang.Exception {
- ctor public SurfaceTexture.OutOfResourcesException();
- ctor public SurfaceTexture.OutOfResourcesException(java.lang.String);
+ @Deprecated public static class SurfaceTexture.OutOfResourcesException extends java.lang.Exception {
+ ctor @Deprecated public SurfaceTexture.OutOfResourcesException();
+ ctor @Deprecated public SurfaceTexture.OutOfResourcesException(String);
}
public class SweepGradient extends android.graphics.Shader {
- ctor public SweepGradient(float, float, int[], float[]);
- ctor public SweepGradient(float, float, int, int);
+ ctor public SweepGradient(float, float, @NonNull @ColorInt int[], @Nullable float[]);
+ ctor public SweepGradient(float, float, @ColorInt int, @ColorInt int);
}
public class Typeface {
- method public static android.graphics.Typeface create(java.lang.String, int);
+ method public static android.graphics.Typeface create(String, int);
method public static android.graphics.Typeface create(android.graphics.Typeface, int);
- method public static android.graphics.Typeface create(android.graphics.Typeface, int, boolean);
- method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
- method public static android.graphics.Typeface createFromFile(java.io.File);
- method public static android.graphics.Typeface createFromFile(java.lang.String);
+ method @NonNull public static android.graphics.Typeface create(@Nullable android.graphics.Typeface, @IntRange(from=1, to=1000) int, boolean);
+ method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, String);
+ method public static android.graphics.Typeface createFromFile(@Nullable java.io.File);
+ method public static android.graphics.Typeface createFromFile(@Nullable String);
method public static android.graphics.Typeface defaultFromStyle(int);
method public int getStyle();
- method public int getWeight();
+ method @IntRange(from=0, to=1000) public int getWeight();
method public final boolean isBold();
method public final boolean isItalic();
field public static final int BOLD = 1; // 0x1
@@ -15015,26 +15015,26 @@ package android.graphics {
}
public static final class Typeface.Builder {
- ctor public Typeface.Builder(java.io.File);
- ctor public Typeface.Builder(java.io.FileDescriptor);
- ctor public Typeface.Builder(java.lang.String);
- ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
+ ctor public Typeface.Builder(@NonNull java.io.File);
+ ctor public Typeface.Builder(@NonNull java.io.FileDescriptor);
+ ctor public Typeface.Builder(@NonNull String);
+ ctor public Typeface.Builder(@NonNull android.content.res.AssetManager, @NonNull String);
method public android.graphics.Typeface build();
- method public android.graphics.Typeface.Builder setFallback(java.lang.String);
- method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String);
- method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
+ method public android.graphics.Typeface.Builder setFallback(@Nullable String);
+ method public android.graphics.Typeface.Builder setFontVariationSettings(@Nullable String);
+ method public android.graphics.Typeface.Builder setFontVariationSettings(@Nullable android.graphics.fonts.FontVariationAxis[]);
method public android.graphics.Typeface.Builder setItalic(boolean);
- method public android.graphics.Typeface.Builder setTtcIndex(int);
- method public android.graphics.Typeface.Builder setWeight(int);
+ method public android.graphics.Typeface.Builder setTtcIndex(@IntRange(from=0) int);
+ method public android.graphics.Typeface.Builder setWeight(@IntRange(from=1, to=1000) int);
}
public static class Typeface.CustomFallbackBuilder {
- ctor public Typeface.CustomFallbackBuilder(android.graphics.fonts.FontFamily);
- method public android.graphics.Typeface.CustomFallbackBuilder addCustomFallback(android.graphics.fonts.FontFamily);
+ ctor public Typeface.CustomFallbackBuilder(@NonNull android.graphics.fonts.FontFamily);
+ method public android.graphics.Typeface.CustomFallbackBuilder addCustomFallback(@NonNull android.graphics.fonts.FontFamily);
method public android.graphics.Typeface build();
- method public static int getMaxCustomFallbackCount();
- method public android.graphics.Typeface.CustomFallbackBuilder setStyle(android.graphics.fonts.FontStyle);
- method public android.graphics.Typeface.CustomFallbackBuilder setSystemFallback(java.lang.String);
+ method @IntRange(from=64) public static int getMaxCustomFallbackCount();
+ method public android.graphics.Typeface.CustomFallbackBuilder setStyle(@NonNull android.graphics.fonts.FontStyle);
+ method public android.graphics.Typeface.CustomFallbackBuilder setSystemFallback(@NonNull String);
}
public class Xfermode {
@@ -15063,28 +15063,28 @@ package android.graphics.drawable {
method public android.graphics.drawable.Drawable getForeground();
method public android.graphics.Path getIconMask();
method public int getOpacity();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void setDither(boolean);
method public void setOpacity(int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
}
- public abstract interface Animatable {
- method public abstract boolean isRunning();
- method public abstract void start();
- method public abstract void stop();
+ public interface Animatable {
+ method public boolean isRunning();
+ method public void start();
+ method public void stop();
}
- public abstract interface Animatable2 implements android.graphics.drawable.Animatable {
- method public abstract void clearAnimationCallbacks();
- method public abstract void registerAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
- method public abstract boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
+ public interface Animatable2 extends android.graphics.drawable.Animatable {
+ method public void clearAnimationCallbacks();
+ method public void registerAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
+ method public boolean unregisterAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
}
- public static abstract class Animatable2.AnimationCallback {
+ public abstract static class Animatable2.AnimationCallback {
ctor public Animatable2.AnimationCallback();
method public void onAnimationEnd(android.graphics.drawable.Drawable);
method public void onAnimationStart(android.graphics.drawable.Drawable);
@@ -15093,25 +15093,25 @@ package android.graphics.drawable {
public class AnimatedImageDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
ctor public AnimatedImageDrawable();
method public void clearAnimationCallbacks();
- method public void draw(android.graphics.Canvas);
+ method public void draw(@NonNull android.graphics.Canvas);
method public int getOpacity();
method public int getRepeatCount();
method public final boolean isAutoMirrored();
method public boolean isRunning();
- method public void registerAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
- method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setRepeatCount(int);
+ method public void registerAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
+ method public void setAlpha(@IntRange(from=0, to=255) int);
+ method public void setColorFilter(@Nullable android.graphics.ColorFilter);
+ method public void setRepeatCount(@IntRange(from=android.graphics.drawable.AnimatedImageDrawable.REPEAT_INFINITE) int);
method public void start();
method public void stop();
- method public boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
+ method public boolean unregisterAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
field public static final int REPEAT_INFINITE = -1; // 0xffffffff
}
public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable {
ctor public AnimatedStateListDrawable();
- method public void addState(int[], android.graphics.drawable.Drawable, int);
- method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public void addState(@NonNull int[], @NonNull android.graphics.drawable.Drawable, int);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, @NonNull T, boolean);
}
public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
@@ -15120,18 +15120,18 @@ package android.graphics.drawable {
method public void draw(android.graphics.Canvas);
method public int getOpacity();
method public boolean isRunning();
- method public void registerAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
+ method public void registerAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
method public void reset();
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void start();
method public void stop();
- method public boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
+ method public boolean unregisterAnimationCallback(@NonNull android.graphics.drawable.Animatable2.AnimationCallback);
}
public class AnimationDrawable extends android.graphics.drawable.DrawableContainer implements android.graphics.drawable.Animatable java.lang.Runnable {
ctor public AnimationDrawable();
- method public void addFrame(android.graphics.drawable.Drawable, int);
+ method public void addFrame(@NonNull android.graphics.drawable.Drawable, int);
method public int getDuration(int);
method public android.graphics.drawable.Drawable getFrame(int);
method public int getNumberOfFrames();
@@ -15144,13 +15144,13 @@ package android.graphics.drawable {
}
public class BitmapDrawable extends android.graphics.drawable.Drawable {
- ctor public deprecated BitmapDrawable();
- ctor public deprecated BitmapDrawable(android.content.res.Resources);
- ctor public deprecated BitmapDrawable(android.graphics.Bitmap);
+ ctor @Deprecated public BitmapDrawable();
+ ctor @Deprecated public BitmapDrawable(android.content.res.Resources);
+ ctor @Deprecated public BitmapDrawable(android.graphics.Bitmap);
ctor public BitmapDrawable(android.content.res.Resources, android.graphics.Bitmap);
- ctor public deprecated BitmapDrawable(java.lang.String);
- ctor public BitmapDrawable(android.content.res.Resources, java.lang.String);
- ctor public deprecated BitmapDrawable(java.io.InputStream);
+ ctor @Deprecated public BitmapDrawable(String);
+ ctor public BitmapDrawable(android.content.res.Resources, String);
+ ctor @Deprecated public BitmapDrawable(java.io.InputStream);
ctor public BitmapDrawable(android.content.res.Resources, java.io.InputStream);
method public void draw(android.graphics.Canvas);
method public final android.graphics.Bitmap getBitmap();
@@ -15185,12 +15185,12 @@ package android.graphics.drawable {
public class ColorDrawable extends android.graphics.drawable.Drawable {
ctor public ColorDrawable();
- ctor public ColorDrawable(int);
+ ctor public ColorDrawable(@ColorInt int);
method public void draw(android.graphics.Canvas);
- method public int getColor();
+ method @ColorInt public int getColor();
method public int getOpacity();
method public void setAlpha(int);
- method public void setColor(int);
+ method public void setColor(@ColorInt int);
method public void setColorFilter(android.graphics.ColorFilter);
}
@@ -15199,56 +15199,56 @@ package android.graphics.drawable {
ctor public ColorStateListDrawable(android.content.res.ColorStateList);
method public void clearAlpha();
method public void draw(android.graphics.Canvas);
- method public android.content.res.ColorStateList getColorStateList();
+ method @NonNull public android.content.res.ColorStateList getColorStateList();
method public int getOpacity();
method public boolean hasFocusStateSpecified();
method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- method public void setAlpha(int);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(@IntRange(from=0, to=255) int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void setColorStateList(android.content.res.ColorStateList);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
}
public abstract class Drawable {
ctor public Drawable();
- method public void applyTheme(android.content.res.Resources.Theme);
+ method public void applyTheme(@NonNull android.content.res.Resources.Theme);
method public boolean canApplyTheme();
method public void clearColorFilter();
- method public final void copyBounds(android.graphics.Rect);
- method public final android.graphics.Rect copyBounds();
- method public static android.graphics.drawable.Drawable createFromPath(java.lang.String);
- method public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String);
- method public static deprecated android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String, android.graphics.BitmapFactory.Options);
- method public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, java.lang.String);
- method public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract void draw(android.graphics.Canvas);
- method public int getAlpha();
- method public final android.graphics.Rect getBounds();
- method public android.graphics.drawable.Drawable.Callback getCallback();
+ method public final void copyBounds(@NonNull android.graphics.Rect);
+ method @NonNull public final android.graphics.Rect copyBounds();
+ method @Nullable public static android.graphics.drawable.Drawable createFromPath(String);
+ method public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, String);
+ method @Deprecated @Nullable public static android.graphics.drawable.Drawable createFromResourceStream(@Nullable android.content.res.Resources, @Nullable android.util.TypedValue, @Nullable java.io.InputStream, @Nullable String, @Nullable android.graphics.BitmapFactory.Options);
+ method public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, String);
+ method @NonNull public static android.graphics.drawable.Drawable createFromXml(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @NonNull public static android.graphics.drawable.Drawable createFromXml(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @Nullable android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @NonNull public static android.graphics.drawable.Drawable createFromXmlInner(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @NonNull android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @NonNull public static android.graphics.drawable.Drawable createFromXmlInner(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @NonNull android.util.AttributeSet, @Nullable android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public abstract void draw(@NonNull android.graphics.Canvas);
+ method @IntRange(from=0, to=255) public int getAlpha();
+ method @NonNull public final android.graphics.Rect getBounds();
+ method @Nullable public android.graphics.drawable.Drawable.Callback getCallback();
method public int getChangingConfigurations();
- method public android.graphics.ColorFilter getColorFilter();
- method public android.graphics.drawable.Drawable.ConstantState getConstantState();
- method public android.graphics.drawable.Drawable getCurrent();
- method public android.graphics.Rect getDirtyBounds();
- method public void getHotspotBounds(android.graphics.Rect);
+ method @Nullable public android.graphics.ColorFilter getColorFilter();
+ method @Nullable public android.graphics.drawable.Drawable.ConstantState getConstantState();
+ method @NonNull public android.graphics.drawable.Drawable getCurrent();
+ method @NonNull public android.graphics.Rect getDirtyBounds();
+ method public void getHotspotBounds(@NonNull android.graphics.Rect);
method public int getIntrinsicHeight();
method public int getIntrinsicWidth();
method public int getLayoutDirection();
- method public final int getLevel();
+ method @IntRange(from=0, to=10000) public final int getLevel();
method public int getMinimumHeight();
method public int getMinimumWidth();
- method public abstract deprecated int getOpacity();
- method public android.graphics.Insets getOpticalInsets();
- method public void getOutline(android.graphics.Outline);
- method public boolean getPadding(android.graphics.Rect);
- method public int[] getState();
- method public android.graphics.Region getTransparentRegion();
- method public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Deprecated public abstract int getOpacity();
+ method @NonNull public android.graphics.Insets getOpticalInsets();
+ method public void getOutline(@NonNull android.graphics.Outline);
+ method public boolean getPadding(@NonNull android.graphics.Rect);
+ method @NonNull public int[] getState();
+ method @Nullable public android.graphics.Region getTransparentRegion();
+ method public void inflate(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @NonNull android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void inflate(@NonNull android.content.res.Resources, @NonNull org.xmlpull.v1.XmlPullParser, @NonNull android.util.AttributeSet, @Nullable android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void invalidateSelf();
method public boolean isAutoMirrored();
method public boolean isFilterBitmap();
@@ -15256,56 +15256,56 @@ package android.graphics.drawable {
method public boolean isStateful();
method public final boolean isVisible();
method public void jumpToCurrentState();
- method public android.graphics.drawable.Drawable mutate();
+ method @NonNull public android.graphics.drawable.Drawable mutate();
method protected void onBoundsChange(android.graphics.Rect);
method public boolean onLayoutDirectionChanged(int);
method protected boolean onLevelChange(int);
method protected boolean onStateChange(int[]);
method public static int resolveOpacity(int, int);
- method public void scheduleSelf(java.lang.Runnable, long);
- method public abstract void setAlpha(int);
+ method public void scheduleSelf(@NonNull Runnable, long);
+ method public abstract void setAlpha(@IntRange(from=0, to=255) int);
method public void setAutoMirrored(boolean);
method public void setBounds(int, int, int, int);
- method public void setBounds(android.graphics.Rect);
- method public final void setCallback(android.graphics.drawable.Drawable.Callback);
+ method public void setBounds(@NonNull android.graphics.Rect);
+ method public final void setCallback(@Nullable android.graphics.drawable.Drawable.Callback);
method public void setChangingConfigurations(int);
- method public abstract void setColorFilter(android.graphics.ColorFilter);
- method public deprecated void setColorFilter(int, android.graphics.PorterDuff.Mode);
- method public deprecated void setDither(boolean);
+ method public abstract void setColorFilter(@Nullable android.graphics.ColorFilter);
+ method @Deprecated public void setColorFilter(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
+ method @Deprecated public void setDither(boolean);
method public void setFilterBitmap(boolean);
method public void setHotspot(float, float);
method public void setHotspotBounds(int, int, int, int);
method public final boolean setLayoutDirection(int);
- method public final boolean setLevel(int);
- method public boolean setState(int[]);
- method public void setTint(int);
- method public void setTintList(android.content.res.ColorStateList);
- method public void setTintMode(android.graphics.PorterDuff.Mode);
+ method public final boolean setLevel(@IntRange(from=0, to=10000) int);
+ method public boolean setState(@NonNull int[]);
+ method public void setTint(@ColorInt int);
+ method public void setTintList(@Nullable android.content.res.ColorStateList);
+ method public void setTintMode(@NonNull android.graphics.PorterDuff.Mode);
method public boolean setVisible(boolean, boolean);
- method public void unscheduleSelf(java.lang.Runnable);
+ method public void unscheduleSelf(@NonNull Runnable);
}
- public static abstract interface Drawable.Callback {
- method public abstract void invalidateDrawable(android.graphics.drawable.Drawable);
- method public abstract void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- method public abstract void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ public static interface Drawable.Callback {
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
}
- public static abstract class Drawable.ConstantState {
+ public abstract static class Drawable.ConstantState {
ctor public Drawable.ConstantState();
method public boolean canApplyTheme();
method public abstract int getChangingConfigurations();
- method public abstract android.graphics.drawable.Drawable newDrawable();
- method public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources);
- method public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources, android.content.res.Resources.Theme);
+ method @NonNull public abstract android.graphics.drawable.Drawable newDrawable();
+ method @NonNull public android.graphics.drawable.Drawable newDrawable(@Nullable android.content.res.Resources);
+ method @NonNull public android.graphics.drawable.Drawable newDrawable(@Nullable android.content.res.Resources, @Nullable android.content.res.Resources.Theme);
}
public class DrawableContainer extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
ctor public DrawableContainer();
method public void draw(android.graphics.Canvas);
method public int getOpacity();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public boolean selectDrawable(int);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
@@ -15313,12 +15313,12 @@ package android.graphics.drawable {
method public void setDither(boolean);
method public void setEnterFadeDuration(int);
method public void setExitFadeDuration(int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
}
- public static abstract class DrawableContainer.DrawableContainerState extends android.graphics.drawable.Drawable.ConstantState {
+ public abstract static class DrawableContainer.DrawableContainerState extends android.graphics.drawable.Drawable.ConstantState {
method public final int addChild(android.graphics.drawable.Drawable);
- method public synchronized boolean canConstantState();
+ method public boolean canConstantState();
method protected void computeConstantSize();
method public int getChangingConfigurations();
method public final android.graphics.drawable.Drawable getChild(int);
@@ -15342,25 +15342,25 @@ package android.graphics.drawable {
}
public abstract class DrawableWrapper extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
- ctor public DrawableWrapper(android.graphics.drawable.Drawable);
- method public void draw(android.graphics.Canvas);
- method public android.graphics.drawable.Drawable getDrawable();
+ ctor public DrawableWrapper(@Nullable android.graphics.drawable.Drawable);
+ method public void draw(@NonNull android.graphics.Canvas);
+ method @Nullable public android.graphics.drawable.Drawable getDrawable();
method public int getOpacity();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setDrawable(android.graphics.drawable.Drawable);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void setColorFilter(@Nullable android.graphics.ColorFilter);
+ method public void setDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
}
public class GradientDrawable extends android.graphics.drawable.Drawable {
ctor public GradientDrawable();
- ctor public GradientDrawable(android.graphics.drawable.GradientDrawable.Orientation, int[]);
+ ctor public GradientDrawable(android.graphics.drawable.GradientDrawable.Orientation, @ColorInt int[]);
method public void draw(android.graphics.Canvas);
- method public android.content.res.ColorStateList getColor();
- method public int[] getColors();
- method public float[] getCornerRadii();
+ method @Nullable public android.content.res.ColorStateList getColor();
+ method @Nullable public int[] getColors();
+ method @Nullable public float[] getCornerRadii();
method public float getCornerRadius();
method public float getGradientCenterX();
method public float getGradientCenterY();
@@ -15371,11 +15371,11 @@ package android.graphics.drawable {
method public int getShape();
method public boolean getUseLevel();
method public void setAlpha(int);
- method public void setColor(int);
- method public void setColor(android.content.res.ColorStateList);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setColors(int[]);
- method public void setCornerRadii(float[]);
+ method public void setColor(@ColorInt int);
+ method public void setColor(@Nullable android.content.res.ColorStateList);
+ method public void setColorFilter(@Nullable android.graphics.ColorFilter);
+ method public void setColors(@ColorInt int[]);
+ method public void setCornerRadii(@Nullable float[]);
method public void setCornerRadius(float);
method public void setDither(boolean);
method public void setGradientCenter(float, float);
@@ -15384,9 +15384,9 @@ package android.graphics.drawable {
method public void setOrientation(android.graphics.drawable.GradientDrawable.Orientation);
method public void setShape(int);
method public void setSize(int, int);
- method public void setStroke(int, int);
+ method public void setStroke(int, @ColorInt int);
method public void setStroke(int, android.content.res.ColorStateList);
- method public void setStroke(int, int, float, float);
+ method public void setStroke(int, @ColorInt int, float, float);
method public void setStroke(int, android.content.res.ColorStateList, float, float);
method public void setUseLevel(boolean);
field public static final int LINE = 2; // 0x2
@@ -15398,9 +15398,7 @@ package android.graphics.drawable {
field public static final int SWEEP_GRADIENT = 2; // 0x2
}
- public static final class GradientDrawable.Orientation extends java.lang.Enum {
- method public static android.graphics.drawable.GradientDrawable.Orientation valueOf(java.lang.String);
- method public static final android.graphics.drawable.GradientDrawable.Orientation[] values();
+ public enum GradientDrawable.Orientation {
enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BL_TR;
enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BOTTOM_TOP;
enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BR_TL;
@@ -15414,21 +15412,21 @@ package android.graphics.drawable {
public final class Icon implements android.os.Parcelable {
method public static android.graphics.drawable.Icon createWithAdaptiveBitmap(android.graphics.Bitmap);
method public static android.graphics.drawable.Icon createWithBitmap(android.graphics.Bitmap);
- method public static android.graphics.drawable.Icon createWithContentUri(java.lang.String);
+ method public static android.graphics.drawable.Icon createWithContentUri(String);
method public static android.graphics.drawable.Icon createWithContentUri(android.net.Uri);
method public static android.graphics.drawable.Icon createWithData(byte[], int, int);
- method public static android.graphics.drawable.Icon createWithFilePath(java.lang.String);
- method public static android.graphics.drawable.Icon createWithResource(android.content.Context, int);
- method public static android.graphics.drawable.Icon createWithResource(java.lang.String, int);
+ method public static android.graphics.drawable.Icon createWithFilePath(String);
+ method public static android.graphics.drawable.Icon createWithResource(android.content.Context, @DrawableRes int);
+ method public static android.graphics.drawable.Icon createWithResource(String, @DrawableRes int);
method public int describeContents();
- method public int getResId();
- method public java.lang.String getResPackage();
+ method @IdRes public int getResId();
+ method @NonNull public String getResPackage();
method public int getType();
- method public android.net.Uri getUri();
+ method @NonNull public android.net.Uri getUri();
method public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
method public void loadDrawableAsync(android.content.Context, android.os.Message);
method public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon.OnDrawableLoadedListener, android.os.Handler);
- method public android.graphics.drawable.Icon setTint(int);
+ method public android.graphics.drawable.Icon setTint(@ColorInt int);
method public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
method public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff.Mode);
method public void writeToParcel(android.os.Parcel, int);
@@ -15440,19 +15438,19 @@ package android.graphics.drawable {
field public static final int TYPE_URI = 4; // 0x4
}
- public static abstract interface Icon.OnDrawableLoadedListener {
- method public abstract void onDrawableLoaded(android.graphics.drawable.Drawable);
+ public static interface Icon.OnDrawableLoadedListener {
+ method public void onDrawableLoaded(android.graphics.drawable.Drawable);
}
public class InsetDrawable extends android.graphics.drawable.DrawableWrapper {
- ctor public InsetDrawable(android.graphics.drawable.Drawable, int);
- ctor public InsetDrawable(android.graphics.drawable.Drawable, float);
- ctor public InsetDrawable(android.graphics.drawable.Drawable, int, int, int, int);
- ctor public InsetDrawable(android.graphics.drawable.Drawable, float, float, float, float);
+ ctor public InsetDrawable(@Nullable android.graphics.drawable.Drawable, int);
+ ctor public InsetDrawable(@Nullable android.graphics.drawable.Drawable, float);
+ ctor public InsetDrawable(@Nullable android.graphics.drawable.Drawable, int, int, int, int);
+ ctor public InsetDrawable(@Nullable android.graphics.drawable.Drawable, float, float, float, float);
}
public class LayerDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
- ctor public LayerDrawable(android.graphics.drawable.Drawable[]);
+ ctor public LayerDrawable(@NonNull android.graphics.drawable.Drawable[]);
method public int addLayer(android.graphics.drawable.Drawable);
method public void draw(android.graphics.Canvas);
method public android.graphics.drawable.Drawable findDrawableByLayerId(int);
@@ -15477,8 +15475,8 @@ package android.graphics.drawable {
method public int getRightPadding();
method public int getStartPadding();
method public int getTopPadding();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void setDither(boolean);
@@ -15501,7 +15499,7 @@ package android.graphics.drawable {
method public void setPadding(int, int, int, int);
method public void setPaddingMode(int);
method public void setPaddingRelative(int, int, int, int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
field public static final int INSET_UNDEFINED = -2147483648; // 0x80000000
field public static final int PADDING_MODE_NEST = 0; // 0x0
field public static final int PADDING_MODE_STACK = 1; // 0x1
@@ -15513,18 +15511,18 @@ package android.graphics.drawable {
}
public class NinePatchDrawable extends android.graphics.drawable.Drawable {
- ctor public deprecated NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
- ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
- ctor public deprecated NinePatchDrawable(android.graphics.NinePatch);
- ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.NinePatch);
+ ctor @Deprecated public NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, String);
+ ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.Bitmap, byte[], android.graphics.Rect, String);
+ ctor @Deprecated public NinePatchDrawable(@NonNull android.graphics.NinePatch);
+ ctor public NinePatchDrawable(@Nullable android.content.res.Resources, @NonNull android.graphics.NinePatch);
method public void draw(android.graphics.Canvas);
method public int getOpacity();
- method public android.graphics.Paint getPaint();
+ method @NonNull public android.graphics.Paint getPaint();
method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setColorFilter(@Nullable android.graphics.ColorFilter);
method public void setDither(boolean);
- method public void setTargetDensity(android.graphics.Canvas);
- method public void setTargetDensity(android.util.DisplayMetrics);
+ method public void setTargetDensity(@NonNull android.graphics.Canvas);
+ method public void setTargetDensity(@NonNull android.util.DisplayMetrics);
method public void setTargetDensity(int);
}
@@ -15546,7 +15544,7 @@ package android.graphics.drawable {
}
public class RippleDrawable extends android.graphics.drawable.LayerDrawable {
- ctor public RippleDrawable(android.content.res.ColorStateList, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+ ctor public RippleDrawable(@NonNull android.content.res.ColorStateList, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable);
method public int getRadius();
method public void setColor(android.content.res.ColorStateList);
method public void setRadius(int);
@@ -15581,7 +15579,7 @@ package android.graphics.drawable {
method public android.graphics.Paint getPaint();
method public android.graphics.drawable.ShapeDrawable.ShaderFactory getShaderFactory();
method public android.graphics.drawable.shapes.Shape getShape();
- method protected boolean inflateTag(java.lang.String, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
+ method protected boolean inflateTag(String, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
method protected void onDraw(android.graphics.drawable.shapes.Shape, android.graphics.Canvas, android.graphics.Paint);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
@@ -15594,7 +15592,7 @@ package android.graphics.drawable {
method public void setShape(android.graphics.drawable.shapes.Shape);
}
- public static abstract class ShapeDrawable.ShaderFactory {
+ public abstract static class ShapeDrawable.ShaderFactory {
ctor public ShapeDrawable.ShaderFactory();
method public abstract android.graphics.Shader resize(int, int);
}
@@ -15642,7 +15640,7 @@ package android.graphics.drawable.shapes {
}
public class PathShape extends android.graphics.drawable.shapes.Shape {
- ctor public PathShape(android.graphics.Path, float, float);
+ ctor public PathShape(@NonNull android.graphics.Path, float, float);
method public android.graphics.drawable.shapes.PathShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
}
@@ -15655,7 +15653,7 @@ package android.graphics.drawable.shapes {
}
public class RoundRectShape extends android.graphics.drawable.shapes.RectShape {
- ctor public RoundRectShape(float[], android.graphics.RectF, float[]);
+ ctor public RoundRectShape(@Nullable float[], @Nullable android.graphics.RectF, @Nullable float[]);
method public android.graphics.drawable.shapes.RoundRectShape clone() throws java.lang.CloneNotSupportedException;
}
@@ -15664,7 +15662,7 @@ package android.graphics.drawable.shapes {
method public android.graphics.drawable.shapes.Shape clone() throws java.lang.CloneNotSupportedException;
method public abstract void draw(android.graphics.Canvas, android.graphics.Paint);
method public final float getHeight();
- method public void getOutline(android.graphics.Outline);
+ method public void getOutline(@NonNull android.graphics.Outline);
method public final float getWidth();
method public boolean hasAlpha();
method protected void onResize(float, float);
@@ -15676,45 +15674,45 @@ package android.graphics.drawable.shapes {
package android.graphics.fonts {
public final class Font {
- method public android.graphics.fonts.FontVariationAxis[] getAxes();
- method public java.nio.ByteBuffer getBuffer();
- method public java.io.File getFile();
- method public android.os.LocaleList getLocaleList();
+ method @Nullable public android.graphics.fonts.FontVariationAxis[] getAxes();
+ method @NonNull public java.nio.ByteBuffer getBuffer();
+ method @Nullable public java.io.File getFile();
+ method @NonNull public android.os.LocaleList getLocaleList();
method public android.graphics.fonts.FontStyle getStyle();
- method public int getTtcIndex();
+ method @IntRange(from=0) public int getTtcIndex();
}
public static class Font.Builder {
- ctor public Font.Builder(java.nio.ByteBuffer);
- ctor public Font.Builder(java.io.File);
- ctor public Font.Builder(java.io.FileDescriptor);
- ctor public Font.Builder(java.io.FileDescriptor, long, long);
- ctor public Font.Builder(android.content.res.AssetManager, java.lang.String);
- ctor public Font.Builder(android.content.res.Resources, int);
- method public android.graphics.fonts.Font build() throws java.io.IOException;
- method public android.graphics.fonts.Font.Builder setFontVariationSettings(java.lang.String);
- method public android.graphics.fonts.Font.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
- method public android.graphics.fonts.Font.Builder setSlant(int);
- method public android.graphics.fonts.Font.Builder setTtcIndex(int);
- method public android.graphics.fonts.Font.Builder setWeight(int);
+ ctor public Font.Builder(@NonNull java.nio.ByteBuffer);
+ ctor public Font.Builder(@NonNull java.io.File);
+ ctor public Font.Builder(@NonNull java.io.FileDescriptor);
+ ctor public Font.Builder(@NonNull java.io.FileDescriptor, @IntRange(from=0) long, @IntRange(from=0xffffffff) long);
+ ctor public Font.Builder(@NonNull android.content.res.AssetManager, @NonNull String);
+ ctor public Font.Builder(@NonNull android.content.res.Resources, int);
+ method @Nullable public android.graphics.fonts.Font build() throws java.io.IOException;
+ method @NonNull public android.graphics.fonts.Font.Builder setFontVariationSettings(@Nullable String);
+ method @NonNull public android.graphics.fonts.Font.Builder setFontVariationSettings(@Nullable android.graphics.fonts.FontVariationAxis[]);
+ method @NonNull public android.graphics.fonts.Font.Builder setSlant(int);
+ method @NonNull public android.graphics.fonts.Font.Builder setTtcIndex(@IntRange(from=0) int);
+ method @NonNull public android.graphics.fonts.Font.Builder setWeight(@IntRange(from=android.graphics.fonts.FontStyle.FONT_WEIGHT_MIN, to=android.graphics.fonts.FontStyle.FONT_WEIGHT_MAX) int);
}
public final class FontFamily {
- method public android.graphics.fonts.Font getFont(int);
+ method public android.graphics.fonts.Font getFont(@IntRange(from=0) int);
method public int getSize();
}
public static class FontFamily.Builder {
- ctor public FontFamily.Builder(android.graphics.fonts.Font);
- method public android.graphics.fonts.FontFamily.Builder addFont(android.graphics.fonts.Font);
- method public android.graphics.fonts.FontFamily build();
+ ctor public FontFamily.Builder(@NonNull android.graphics.fonts.Font);
+ method @NonNull public android.graphics.fonts.FontFamily.Builder addFont(@NonNull android.graphics.fonts.Font);
+ method @NonNull public android.graphics.fonts.FontFamily build();
}
public final class FontStyle {
ctor public FontStyle();
ctor public FontStyle(int, int);
method public int getSlant();
- method public int getWeight();
+ method @IntRange(from=0, to=1000) public int getWeight();
field public static final int FONT_SLANT_ITALIC = 1; // 0x1
field public static final int FONT_SLANT_UPRIGHT = 0; // 0x0
field public static final int FONT_WEIGHT_BLACK = 900; // 0x384
@@ -15731,15 +15729,15 @@ package android.graphics.fonts {
}
public final class FontVariationAxis {
- ctor public FontVariationAxis(java.lang.String, float);
- method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
+ ctor public FontVariationAxis(@NonNull String, float);
+ method @Nullable public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(@Nullable String);
method public float getStyleValue();
- method public java.lang.String getTag();
- method public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
+ method public String getTag();
+ method @NonNull public static String toFontVariationSettings(@Nullable android.graphics.fonts.FontVariationAxis[]);
}
public final class SystemFonts {
- method public static java.util.Set<android.graphics.fonts.Font> getAvailableFonts();
+ method @NonNull public static java.util.Set<android.graphics.fonts.Font> getAvailableFonts();
}
}
@@ -15774,7 +15772,7 @@ package android.graphics.pdf {
}
public final class PdfRenderer implements java.lang.AutoCloseable {
- ctor public PdfRenderer(android.os.ParcelFileDescriptor) throws java.io.IOException;
+ ctor public PdfRenderer(@NonNull android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void close();
method public int getPageCount();
method public android.graphics.pdf.PdfRenderer.Page openPage(int);
@@ -15786,7 +15784,7 @@ package android.graphics.pdf {
method public int getHeight();
method public int getIndex();
method public int getWidth();
- method public void render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int);
+ method public void render(@NonNull android.graphics.Bitmap, @Nullable android.graphics.Rect, @Nullable android.graphics.Matrix, int);
field public static final int RENDER_MODE_FOR_DISPLAY = 1; // 0x1
field public static final int RENDER_MODE_FOR_PRINT = 2; // 0x2
}
@@ -15796,7 +15794,7 @@ package android.graphics.pdf {
package android.graphics.text {
public class LineBreaker {
- method public android.graphics.text.LineBreaker.Result computeLineBreaks(android.graphics.text.MeasuredText, android.graphics.text.LineBreaker.ParagraphConstraints, int);
+ method public android.graphics.text.LineBreaker.Result computeLineBreaks(@NonNull android.graphics.text.MeasuredText, @NonNull android.graphics.text.LineBreaker.ParagraphConstraints, @IntRange(from=0) int);
field public static final int BREAK_STRATEGY_BALANCED = 2; // 0x2
field public static final int BREAK_STRATEGY_HIGH_QUALITY = 1; // 0x1
field public static final int BREAK_STRATEGY_SIMPLE = 0; // 0x0
@@ -15812,44 +15810,44 @@ package android.graphics.text {
method public android.graphics.text.LineBreaker build();
method public android.graphics.text.LineBreaker.Builder setBreakStrategy(int);
method public android.graphics.text.LineBreaker.Builder setHyphenationFrequency(int);
- method public android.graphics.text.LineBreaker.Builder setIndents(int[]);
+ method public android.graphics.text.LineBreaker.Builder setIndents(@Nullable int[]);
method public android.graphics.text.LineBreaker.Builder setJustified(int);
}
public static class LineBreaker.ParagraphConstraints {
ctor public LineBreaker.ParagraphConstraints();
- method public int getDefaultTabStop();
- method public float getFirstWidth();
- method public int getFirstWidthLineCount();
- method public int[] getTabStops();
- method public float getWidth();
- method public void setIndent(float, int);
- method public void setTabStops(int[], int);
- method public void setWidth(float);
+ method @Px @IntRange(from=0) public int getDefaultTabStop();
+ method @Px @FloatRange(from=0.0f) public float getFirstWidth();
+ method @Px @IntRange(from=0) public int getFirstWidthLineCount();
+ method @Nullable public int[] getTabStops();
+ method @Px @FloatRange(from=0.0f) public float getWidth();
+ method public void setIndent(@Px @FloatRange(from=0.0f) float, @Px @IntRange(from=0) int);
+ method public void setTabStops(@Nullable int[], @Px @IntRange(from=0) int);
+ method public void setWidth(@Px @FloatRange(from=0.0f) float);
}
public static class LineBreaker.Result {
- method public float getLineAscent(int);
- method public int getLineBreakOffset(int);
- method public int getLineCount();
- method public float getLineDescent(int);
+ method @Px public float getLineAscent(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getLineBreakOffset(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getLineCount();
+ method @Px public float getLineDescent(@IntRange(from=0) int);
method public int getLineHyphenEdit(int);
- method public float getLineWidth(int);
+ method @Px public float getLineWidth(@IntRange(from=0) int);
method public boolean hasLineTab(int);
}
public class MeasuredText {
- method public void getBounds(int, int, android.graphics.Rect);
- method public float getCharWidthAt(int);
- method public char[] getChars();
- method public float getWidth(int, int);
+ method public void getBounds(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Rect);
+ method @FloatRange(from=0.0f) @Px public float getCharWidthAt(@IntRange(from=0) int);
+ method @NonNull public char[] getChars();
+ method @FloatRange(from=0.0) @Px public float getWidth(@IntRange(from=0) int, @IntRange(from=0) int);
}
public static class MeasuredText.Builder {
- ctor public MeasuredText.Builder(char[]);
- ctor public MeasuredText.Builder(android.graphics.text.MeasuredText);
- method public android.graphics.text.MeasuredText.Builder appendReplacementRun(android.graphics.Paint, int, float);
- method public android.graphics.text.MeasuredText.Builder appendStyleRun(android.graphics.Paint, int, boolean);
+ ctor public MeasuredText.Builder(@NonNull char[]);
+ ctor public MeasuredText.Builder(@NonNull android.graphics.text.MeasuredText);
+ method public android.graphics.text.MeasuredText.Builder appendReplacementRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, @FloatRange(from=0) float);
+ method public android.graphics.text.MeasuredText.Builder appendStyleRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, boolean);
method public android.graphics.text.MeasuredText build();
method public android.graphics.text.MeasuredText.Builder setComputeHyphenation(boolean);
method public android.graphics.text.MeasuredText.Builder setComputeLayout(boolean);
@@ -15859,258 +15857,258 @@ package android.graphics.text {
package android.hardware {
- public deprecated class Camera {
- method public final void addCallbackBuffer(byte[]);
- method public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
- method public final void cancelAutoFocus();
- method public final boolean enableShutterSound(boolean);
- method protected void finalize();
- method public static void getCameraInfo(int, android.hardware.Camera.CameraInfo);
- method public static int getNumberOfCameras();
- method public android.hardware.Camera.Parameters getParameters();
- method public final void lock();
- method public static android.hardware.Camera open(int);
- method public static android.hardware.Camera open();
- method public final void reconnect() throws java.io.IOException;
- method public final void release();
- method public void setAutoFocusMoveCallback(android.hardware.Camera.AutoFocusMoveCallback);
- method public final void setDisplayOrientation(int);
- method public final void setErrorCallback(android.hardware.Camera.ErrorCallback);
- method public final void setFaceDetectionListener(android.hardware.Camera.FaceDetectionListener);
- method public final void setOneShotPreviewCallback(android.hardware.Camera.PreviewCallback);
- method public void setParameters(android.hardware.Camera.Parameters);
- method public final void setPreviewCallback(android.hardware.Camera.PreviewCallback);
- method public final void setPreviewCallbackWithBuffer(android.hardware.Camera.PreviewCallback);
- method public final void setPreviewDisplay(android.view.SurfaceHolder) throws java.io.IOException;
- method public final void setPreviewTexture(android.graphics.SurfaceTexture) throws java.io.IOException;
- method public final void setZoomChangeListener(android.hardware.Camera.OnZoomChangeListener);
- method public final void startFaceDetection();
- method public final void startPreview();
- method public final void startSmoothZoom(int);
- method public final void stopFaceDetection();
- method public final void stopPreview();
- method public final void stopSmoothZoom();
- method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
- method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
- method public final void unlock();
- field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
- field public static final java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
- field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2
- field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
- field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
- }
-
- public static deprecated class Camera.Area {
- ctor public Camera.Area(android.graphics.Rect, int);
- field public android.graphics.Rect rect;
- field public int weight;
- }
-
- public static abstract deprecated interface Camera.AutoFocusCallback {
- method public abstract void onAutoFocus(boolean, android.hardware.Camera);
- }
-
- public static abstract deprecated interface Camera.AutoFocusMoveCallback {
- method public abstract void onAutoFocusMoving(boolean, android.hardware.Camera);
- }
-
- public static deprecated class Camera.CameraInfo {
- ctor public Camera.CameraInfo();
- field public static final int CAMERA_FACING_BACK = 0; // 0x0
- field public static final int CAMERA_FACING_FRONT = 1; // 0x1
- field public boolean canDisableShutterSound;
- field public int facing;
- field public int orientation;
- }
-
- public static abstract deprecated interface Camera.ErrorCallback {
- method public abstract void onError(int, android.hardware.Camera);
- }
-
- public static deprecated class Camera.Face {
- ctor public Camera.Face();
- field public int id;
- field public android.graphics.Point leftEye;
- field public android.graphics.Point mouth;
- field public android.graphics.Rect rect;
- field public android.graphics.Point rightEye;
- field public int score;
- }
-
- public static abstract deprecated interface Camera.FaceDetectionListener {
- method public abstract void onFaceDetection(android.hardware.Camera.Face[], android.hardware.Camera);
- }
-
- public static abstract deprecated interface Camera.OnZoomChangeListener {
- method public abstract void onZoomChange(int, boolean, android.hardware.Camera);
- }
-
- public deprecated class Camera.Parameters {
- method public java.lang.String flatten();
- method public java.lang.String get(java.lang.String);
- method public java.lang.String getAntibanding();
- method public boolean getAutoExposureLock();
- method public boolean getAutoWhiteBalanceLock();
- method public java.lang.String getColorEffect();
- method public int getExposureCompensation();
- method public float getExposureCompensationStep();
- method public java.lang.String getFlashMode();
- method public float getFocalLength();
- method public java.util.List<android.hardware.Camera.Area> getFocusAreas();
- method public void getFocusDistances(float[]);
- method public java.lang.String getFocusMode();
- method public float getHorizontalViewAngle();
- method public int getInt(java.lang.String);
- method public int getJpegQuality();
- method public int getJpegThumbnailQuality();
- method public android.hardware.Camera.Size getJpegThumbnailSize();
- method public int getMaxExposureCompensation();
- method public int getMaxNumDetectedFaces();
- method public int getMaxNumFocusAreas();
- method public int getMaxNumMeteringAreas();
- method public int getMaxZoom();
- method public java.util.List<android.hardware.Camera.Area> getMeteringAreas();
- method public int getMinExposureCompensation();
- method public int getPictureFormat();
- method public android.hardware.Camera.Size getPictureSize();
- method public android.hardware.Camera.Size getPreferredPreviewSizeForVideo();
- method public int getPreviewFormat();
- method public void getPreviewFpsRange(int[]);
- method public deprecated int getPreviewFrameRate();
- method public android.hardware.Camera.Size getPreviewSize();
- method public java.lang.String getSceneMode();
- method public java.util.List<java.lang.String> getSupportedAntibanding();
- method public java.util.List<java.lang.String> getSupportedColorEffects();
- method public java.util.List<java.lang.String> getSupportedFlashModes();
- method public java.util.List<java.lang.String> getSupportedFocusModes();
- method public java.util.List<android.hardware.Camera.Size> getSupportedJpegThumbnailSizes();
- method public java.util.List<java.lang.Integer> getSupportedPictureFormats();
- method public java.util.List<android.hardware.Camera.Size> getSupportedPictureSizes();
- method public java.util.List<java.lang.Integer> getSupportedPreviewFormats();
- method public java.util.List<int[]> getSupportedPreviewFpsRange();
- method public deprecated java.util.List<java.lang.Integer> getSupportedPreviewFrameRates();
- method public java.util.List<android.hardware.Camera.Size> getSupportedPreviewSizes();
- method public java.util.List<java.lang.String> getSupportedSceneModes();
- method public java.util.List<android.hardware.Camera.Size> getSupportedVideoSizes();
- method public java.util.List<java.lang.String> getSupportedWhiteBalance();
- method public float getVerticalViewAngle();
- method public boolean getVideoStabilization();
- method public java.lang.String getWhiteBalance();
- method public int getZoom();
- method public java.util.List<java.lang.Integer> getZoomRatios();
- method public boolean isAutoExposureLockSupported();
- method public boolean isAutoWhiteBalanceLockSupported();
- method public boolean isSmoothZoomSupported();
- method public boolean isVideoSnapshotSupported();
- method public boolean isVideoStabilizationSupported();
- method public boolean isZoomSupported();
- method public void remove(java.lang.String);
- method public void removeGpsData();
- method public void set(java.lang.String, java.lang.String);
- method public void set(java.lang.String, int);
- method public void setAntibanding(java.lang.String);
- method public void setAutoExposureLock(boolean);
- method public void setAutoWhiteBalanceLock(boolean);
- method public void setColorEffect(java.lang.String);
- method public void setExposureCompensation(int);
- method public void setFlashMode(java.lang.String);
- method public void setFocusAreas(java.util.List<android.hardware.Camera.Area>);
- method public void setFocusMode(java.lang.String);
- method public void setGpsAltitude(double);
- method public void setGpsLatitude(double);
- method public void setGpsLongitude(double);
- method public void setGpsProcessingMethod(java.lang.String);
- method public void setGpsTimestamp(long);
- method public void setJpegQuality(int);
- method public void setJpegThumbnailQuality(int);
- method public void setJpegThumbnailSize(int, int);
- method public void setMeteringAreas(java.util.List<android.hardware.Camera.Area>);
- method public void setPictureFormat(int);
- method public void setPictureSize(int, int);
- method public void setPreviewFormat(int);
- method public void setPreviewFpsRange(int, int);
- method public deprecated void setPreviewFrameRate(int);
- method public void setPreviewSize(int, int);
- method public void setRecordingHint(boolean);
- method public void setRotation(int);
- method public void setSceneMode(java.lang.String);
- method public void setVideoStabilization(boolean);
- method public void setWhiteBalance(java.lang.String);
- method public void setZoom(int);
- method public void unflatten(java.lang.String);
- field public static final java.lang.String ANTIBANDING_50HZ = "50hz";
- field public static final java.lang.String ANTIBANDING_60HZ = "60hz";
- field public static final java.lang.String ANTIBANDING_AUTO = "auto";
- field public static final java.lang.String ANTIBANDING_OFF = "off";
- field public static final java.lang.String EFFECT_AQUA = "aqua";
- field public static final java.lang.String EFFECT_BLACKBOARD = "blackboard";
- field public static final java.lang.String EFFECT_MONO = "mono";
- field public static final java.lang.String EFFECT_NEGATIVE = "negative";
- field public static final java.lang.String EFFECT_NONE = "none";
- field public static final java.lang.String EFFECT_POSTERIZE = "posterize";
- field public static final java.lang.String EFFECT_SEPIA = "sepia";
- field public static final java.lang.String EFFECT_SOLARIZE = "solarize";
- field public static final java.lang.String EFFECT_WHITEBOARD = "whiteboard";
- field public static final java.lang.String FLASH_MODE_AUTO = "auto";
- field public static final java.lang.String FLASH_MODE_OFF = "off";
- field public static final java.lang.String FLASH_MODE_ON = "on";
- field public static final java.lang.String FLASH_MODE_RED_EYE = "red-eye";
- field public static final java.lang.String FLASH_MODE_TORCH = "torch";
- field public static final int FOCUS_DISTANCE_FAR_INDEX = 2; // 0x2
- field public static final int FOCUS_DISTANCE_NEAR_INDEX = 0; // 0x0
- field public static final int FOCUS_DISTANCE_OPTIMAL_INDEX = 1; // 0x1
- field public static final java.lang.String FOCUS_MODE_AUTO = "auto";
- field public static final java.lang.String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
- field public static final java.lang.String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
- field public static final java.lang.String FOCUS_MODE_EDOF = "edof";
- field public static final java.lang.String FOCUS_MODE_FIXED = "fixed";
- field public static final java.lang.String FOCUS_MODE_INFINITY = "infinity";
- field public static final java.lang.String FOCUS_MODE_MACRO = "macro";
- field public static final int PREVIEW_FPS_MAX_INDEX = 1; // 0x1
- field public static final int PREVIEW_FPS_MIN_INDEX = 0; // 0x0
- field public static final java.lang.String SCENE_MODE_ACTION = "action";
- field public static final java.lang.String SCENE_MODE_AUTO = "auto";
- field public static final java.lang.String SCENE_MODE_BARCODE = "barcode";
- field public static final java.lang.String SCENE_MODE_BEACH = "beach";
- field public static final java.lang.String SCENE_MODE_CANDLELIGHT = "candlelight";
- field public static final java.lang.String SCENE_MODE_FIREWORKS = "fireworks";
- field public static final java.lang.String SCENE_MODE_HDR = "hdr";
- field public static final java.lang.String SCENE_MODE_LANDSCAPE = "landscape";
- field public static final java.lang.String SCENE_MODE_NIGHT = "night";
- field public static final java.lang.String SCENE_MODE_NIGHT_PORTRAIT = "night-portrait";
- field public static final java.lang.String SCENE_MODE_PARTY = "party";
- field public static final java.lang.String SCENE_MODE_PORTRAIT = "portrait";
- field public static final java.lang.String SCENE_MODE_SNOW = "snow";
- field public static final java.lang.String SCENE_MODE_SPORTS = "sports";
- field public static final java.lang.String SCENE_MODE_STEADYPHOTO = "steadyphoto";
- field public static final java.lang.String SCENE_MODE_SUNSET = "sunset";
- field public static final java.lang.String SCENE_MODE_THEATRE = "theatre";
- field public static final java.lang.String WHITE_BALANCE_AUTO = "auto";
- field public static final java.lang.String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight";
- field public static final java.lang.String WHITE_BALANCE_DAYLIGHT = "daylight";
- field public static final java.lang.String WHITE_BALANCE_FLUORESCENT = "fluorescent";
- field public static final java.lang.String WHITE_BALANCE_INCANDESCENT = "incandescent";
- field public static final java.lang.String WHITE_BALANCE_SHADE = "shade";
- field public static final java.lang.String WHITE_BALANCE_TWILIGHT = "twilight";
- field public static final java.lang.String WHITE_BALANCE_WARM_FLUORESCENT = "warm-fluorescent";
- }
-
- public static abstract deprecated interface Camera.PictureCallback {
- method public abstract void onPictureTaken(byte[], android.hardware.Camera);
- }
-
- public static abstract deprecated interface Camera.PreviewCallback {
- method public abstract void onPreviewFrame(byte[], android.hardware.Camera);
- }
-
- public static abstract deprecated interface Camera.ShutterCallback {
- method public abstract void onShutter();
- }
-
- public deprecated class Camera.Size {
- ctor public Camera.Size(int, int);
- field public int height;
- field public int width;
+ @Deprecated public class Camera {
+ method @Deprecated public final void addCallbackBuffer(byte[]);
+ method @Deprecated public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
+ method @Deprecated public final void cancelAutoFocus();
+ method @Deprecated public final boolean enableShutterSound(boolean);
+ method @Deprecated protected void finalize();
+ method @Deprecated public static void getCameraInfo(int, android.hardware.Camera.CameraInfo);
+ method @Deprecated public static int getNumberOfCameras();
+ method @Deprecated public android.hardware.Camera.Parameters getParameters();
+ method @Deprecated public final void lock();
+ method @Deprecated public static android.hardware.Camera open(int);
+ method @Deprecated public static android.hardware.Camera open();
+ method @Deprecated public final void reconnect() throws java.io.IOException;
+ method @Deprecated public final void release();
+ method @Deprecated public void setAutoFocusMoveCallback(android.hardware.Camera.AutoFocusMoveCallback);
+ method @Deprecated public final void setDisplayOrientation(int);
+ method @Deprecated public final void setErrorCallback(android.hardware.Camera.ErrorCallback);
+ method @Deprecated public final void setFaceDetectionListener(android.hardware.Camera.FaceDetectionListener);
+ method @Deprecated public final void setOneShotPreviewCallback(android.hardware.Camera.PreviewCallback);
+ method @Deprecated public void setParameters(android.hardware.Camera.Parameters);
+ method @Deprecated public final void setPreviewCallback(android.hardware.Camera.PreviewCallback);
+ method @Deprecated public final void setPreviewCallbackWithBuffer(android.hardware.Camera.PreviewCallback);
+ method @Deprecated public final void setPreviewDisplay(android.view.SurfaceHolder) throws java.io.IOException;
+ method @Deprecated public final void setPreviewTexture(android.graphics.SurfaceTexture) throws java.io.IOException;
+ method @Deprecated public final void setZoomChangeListener(android.hardware.Camera.OnZoomChangeListener);
+ method @Deprecated public final void startFaceDetection();
+ method @Deprecated public final void startPreview();
+ method @Deprecated public final void startSmoothZoom(int);
+ method @Deprecated public final void stopFaceDetection();
+ method @Deprecated public final void stopPreview();
+ method @Deprecated public final void stopSmoothZoom();
+ method @Deprecated public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
+ method @Deprecated public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
+ method @Deprecated public final void unlock();
+ field @Deprecated public static final String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
+ field @Deprecated public static final String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
+ field @Deprecated public static final int CAMERA_ERROR_EVICTED = 2; // 0x2
+ field @Deprecated public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
+ field @Deprecated public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
+ }
+
+ @Deprecated public static class Camera.Area {
+ ctor @Deprecated public Camera.Area(android.graphics.Rect, int);
+ field @Deprecated public android.graphics.Rect rect;
+ field @Deprecated public int weight;
+ }
+
+ @Deprecated public static interface Camera.AutoFocusCallback {
+ method @Deprecated public void onAutoFocus(boolean, android.hardware.Camera);
+ }
+
+ @Deprecated public static interface Camera.AutoFocusMoveCallback {
+ method @Deprecated public void onAutoFocusMoving(boolean, android.hardware.Camera);
+ }
+
+ @Deprecated public static class Camera.CameraInfo {
+ ctor @Deprecated public Camera.CameraInfo();
+ field @Deprecated public static final int CAMERA_FACING_BACK = 0; // 0x0
+ field @Deprecated public static final int CAMERA_FACING_FRONT = 1; // 0x1
+ field @Deprecated public boolean canDisableShutterSound;
+ field @Deprecated public int facing;
+ field @Deprecated public int orientation;
+ }
+
+ @Deprecated public static interface Camera.ErrorCallback {
+ method @Deprecated public void onError(int, android.hardware.Camera);
+ }
+
+ @Deprecated public static class Camera.Face {
+ ctor @Deprecated public Camera.Face();
+ field @Deprecated public int id;
+ field @Deprecated public android.graphics.Point leftEye;
+ field @Deprecated public android.graphics.Point mouth;
+ field @Deprecated public android.graphics.Rect rect;
+ field @Deprecated public android.graphics.Point rightEye;
+ field @Deprecated public int score;
+ }
+
+ @Deprecated public static interface Camera.FaceDetectionListener {
+ method @Deprecated public void onFaceDetection(android.hardware.Camera.Face[], android.hardware.Camera);
+ }
+
+ @Deprecated public static interface Camera.OnZoomChangeListener {
+ method @Deprecated public void onZoomChange(int, boolean, android.hardware.Camera);
+ }
+
+ @Deprecated public class Camera.Parameters {
+ method @Deprecated public String flatten();
+ method @Deprecated public String get(String);
+ method @Deprecated public String getAntibanding();
+ method @Deprecated public boolean getAutoExposureLock();
+ method @Deprecated public boolean getAutoWhiteBalanceLock();
+ method @Deprecated public String getColorEffect();
+ method @Deprecated public int getExposureCompensation();
+ method @Deprecated public float getExposureCompensationStep();
+ method @Deprecated public String getFlashMode();
+ method @Deprecated public float getFocalLength();
+ method @Deprecated public java.util.List<android.hardware.Camera.Area> getFocusAreas();
+ method @Deprecated public void getFocusDistances(float[]);
+ method @Deprecated public String getFocusMode();
+ method @Deprecated public float getHorizontalViewAngle();
+ method @Deprecated public int getInt(String);
+ method @Deprecated public int getJpegQuality();
+ method @Deprecated public int getJpegThumbnailQuality();
+ method @Deprecated public android.hardware.Camera.Size getJpegThumbnailSize();
+ method @Deprecated public int getMaxExposureCompensation();
+ method @Deprecated public int getMaxNumDetectedFaces();
+ method @Deprecated public int getMaxNumFocusAreas();
+ method @Deprecated public int getMaxNumMeteringAreas();
+ method @Deprecated public int getMaxZoom();
+ method @Deprecated public java.util.List<android.hardware.Camera.Area> getMeteringAreas();
+ method @Deprecated public int getMinExposureCompensation();
+ method @Deprecated public int getPictureFormat();
+ method @Deprecated public android.hardware.Camera.Size getPictureSize();
+ method @Deprecated public android.hardware.Camera.Size getPreferredPreviewSizeForVideo();
+ method @Deprecated public int getPreviewFormat();
+ method @Deprecated public void getPreviewFpsRange(int[]);
+ method @Deprecated public int getPreviewFrameRate();
+ method @Deprecated public android.hardware.Camera.Size getPreviewSize();
+ method @Deprecated public String getSceneMode();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedAntibanding();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedColorEffects();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedFlashModes();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedFocusModes();
+ method @Deprecated public java.util.List<android.hardware.Camera.Size> getSupportedJpegThumbnailSizes();
+ method @Deprecated public java.util.List<java.lang.Integer> getSupportedPictureFormats();
+ method @Deprecated public java.util.List<android.hardware.Camera.Size> getSupportedPictureSizes();
+ method @Deprecated public java.util.List<java.lang.Integer> getSupportedPreviewFormats();
+ method @Deprecated public java.util.List<int[]> getSupportedPreviewFpsRange();
+ method @Deprecated public java.util.List<java.lang.Integer> getSupportedPreviewFrameRates();
+ method @Deprecated public java.util.List<android.hardware.Camera.Size> getSupportedPreviewSizes();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedSceneModes();
+ method @Deprecated public java.util.List<android.hardware.Camera.Size> getSupportedVideoSizes();
+ method @Deprecated public java.util.List<java.lang.String> getSupportedWhiteBalance();
+ method @Deprecated public float getVerticalViewAngle();
+ method @Deprecated public boolean getVideoStabilization();
+ method @Deprecated public String getWhiteBalance();
+ method @Deprecated public int getZoom();
+ method @Deprecated public java.util.List<java.lang.Integer> getZoomRatios();
+ method @Deprecated public boolean isAutoExposureLockSupported();
+ method @Deprecated public boolean isAutoWhiteBalanceLockSupported();
+ method @Deprecated public boolean isSmoothZoomSupported();
+ method @Deprecated public boolean isVideoSnapshotSupported();
+ method @Deprecated public boolean isVideoStabilizationSupported();
+ method @Deprecated public boolean isZoomSupported();
+ method @Deprecated public void remove(String);
+ method @Deprecated public void removeGpsData();
+ method @Deprecated public void set(String, String);
+ method @Deprecated public void set(String, int);
+ method @Deprecated public void setAntibanding(String);
+ method @Deprecated public void setAutoExposureLock(boolean);
+ method @Deprecated public void setAutoWhiteBalanceLock(boolean);
+ method @Deprecated public void setColorEffect(String);
+ method @Deprecated public void setExposureCompensation(int);
+ method @Deprecated public void setFlashMode(String);
+ method @Deprecated public void setFocusAreas(java.util.List<android.hardware.Camera.Area>);
+ method @Deprecated public void setFocusMode(String);
+ method @Deprecated public void setGpsAltitude(double);
+ method @Deprecated public void setGpsLatitude(double);
+ method @Deprecated public void setGpsLongitude(double);
+ method @Deprecated public void setGpsProcessingMethod(String);
+ method @Deprecated public void setGpsTimestamp(long);
+ method @Deprecated public void setJpegQuality(int);
+ method @Deprecated public void setJpegThumbnailQuality(int);
+ method @Deprecated public void setJpegThumbnailSize(int, int);
+ method @Deprecated public void setMeteringAreas(java.util.List<android.hardware.Camera.Area>);
+ method @Deprecated public void setPictureFormat(int);
+ method @Deprecated public void setPictureSize(int, int);
+ method @Deprecated public void setPreviewFormat(int);
+ method @Deprecated public void setPreviewFpsRange(int, int);
+ method @Deprecated public void setPreviewFrameRate(int);
+ method @Deprecated public void setPreviewSize(int, int);
+ method @Deprecated public void setRecordingHint(boolean);
+ method @Deprecated public void setRotation(int);
+ method @Deprecated public void setSceneMode(String);
+ method @Deprecated public void setVideoStabilization(boolean);
+ method @Deprecated public void setWhiteBalance(String);
+ method @Deprecated public void setZoom(int);
+ method @Deprecated public void unflatten(String);
+ field @Deprecated public static final String ANTIBANDING_50HZ = "50hz";
+ field @Deprecated public static final String ANTIBANDING_60HZ = "60hz";
+ field @Deprecated public static final String ANTIBANDING_AUTO = "auto";
+ field @Deprecated public static final String ANTIBANDING_OFF = "off";
+ field @Deprecated public static final String EFFECT_AQUA = "aqua";
+ field @Deprecated public static final String EFFECT_BLACKBOARD = "blackboard";
+ field @Deprecated public static final String EFFECT_MONO = "mono";
+ field @Deprecated public static final String EFFECT_NEGATIVE = "negative";
+ field @Deprecated public static final String EFFECT_NONE = "none";
+ field @Deprecated public static final String EFFECT_POSTERIZE = "posterize";
+ field @Deprecated public static final String EFFECT_SEPIA = "sepia";
+ field @Deprecated public static final String EFFECT_SOLARIZE = "solarize";
+ field @Deprecated public static final String EFFECT_WHITEBOARD = "whiteboard";
+ field @Deprecated public static final String FLASH_MODE_AUTO = "auto";
+ field @Deprecated public static final String FLASH_MODE_OFF = "off";
+ field @Deprecated public static final String FLASH_MODE_ON = "on";
+ field @Deprecated public static final String FLASH_MODE_RED_EYE = "red-eye";
+ field @Deprecated public static final String FLASH_MODE_TORCH = "torch";
+ field @Deprecated public static final int FOCUS_DISTANCE_FAR_INDEX = 2; // 0x2
+ field @Deprecated public static final int FOCUS_DISTANCE_NEAR_INDEX = 0; // 0x0
+ field @Deprecated public static final int FOCUS_DISTANCE_OPTIMAL_INDEX = 1; // 0x1
+ field @Deprecated public static final String FOCUS_MODE_AUTO = "auto";
+ field @Deprecated public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
+ field @Deprecated public static final String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
+ field @Deprecated public static final String FOCUS_MODE_EDOF = "edof";
+ field @Deprecated public static final String FOCUS_MODE_FIXED = "fixed";
+ field @Deprecated public static final String FOCUS_MODE_INFINITY = "infinity";
+ field @Deprecated public static final String FOCUS_MODE_MACRO = "macro";
+ field @Deprecated public static final int PREVIEW_FPS_MAX_INDEX = 1; // 0x1
+ field @Deprecated public static final int PREVIEW_FPS_MIN_INDEX = 0; // 0x0
+ field @Deprecated public static final String SCENE_MODE_ACTION = "action";
+ field @Deprecated public static final String SCENE_MODE_AUTO = "auto";
+ field @Deprecated public static final String SCENE_MODE_BARCODE = "barcode";
+ field @Deprecated public static final String SCENE_MODE_BEACH = "beach";
+ field @Deprecated public static final String SCENE_MODE_CANDLELIGHT = "candlelight";
+ field @Deprecated public static final String SCENE_MODE_FIREWORKS = "fireworks";
+ field @Deprecated public static final String SCENE_MODE_HDR = "hdr";
+ field @Deprecated public static final String SCENE_MODE_LANDSCAPE = "landscape";
+ field @Deprecated public static final String SCENE_MODE_NIGHT = "night";
+ field @Deprecated public static final String SCENE_MODE_NIGHT_PORTRAIT = "night-portrait";
+ field @Deprecated public static final String SCENE_MODE_PARTY = "party";
+ field @Deprecated public static final String SCENE_MODE_PORTRAIT = "portrait";
+ field @Deprecated public static final String SCENE_MODE_SNOW = "snow";
+ field @Deprecated public static final String SCENE_MODE_SPORTS = "sports";
+ field @Deprecated public static final String SCENE_MODE_STEADYPHOTO = "steadyphoto";
+ field @Deprecated public static final String SCENE_MODE_SUNSET = "sunset";
+ field @Deprecated public static final String SCENE_MODE_THEATRE = "theatre";
+ field @Deprecated public static final String WHITE_BALANCE_AUTO = "auto";
+ field @Deprecated public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight";
+ field @Deprecated public static final String WHITE_BALANCE_DAYLIGHT = "daylight";
+ field @Deprecated public static final String WHITE_BALANCE_FLUORESCENT = "fluorescent";
+ field @Deprecated public static final String WHITE_BALANCE_INCANDESCENT = "incandescent";
+ field @Deprecated public static final String WHITE_BALANCE_SHADE = "shade";
+ field @Deprecated public static final String WHITE_BALANCE_TWILIGHT = "twilight";
+ field @Deprecated public static final String WHITE_BALANCE_WARM_FLUORESCENT = "warm-fluorescent";
+ }
+
+ @Deprecated public static interface Camera.PictureCallback {
+ method @Deprecated public void onPictureTaken(byte[], android.hardware.Camera);
+ }
+
+ @Deprecated public static interface Camera.PreviewCallback {
+ method @Deprecated public void onPreviewFrame(byte[], android.hardware.Camera);
+ }
+
+ @Deprecated public static interface Camera.ShutterCallback {
+ method @Deprecated public void onShutter();
+ }
+
+ @Deprecated public class Camera.Size {
+ ctor @Deprecated public Camera.Size(int, int);
+ field @Deprecated public int height;
+ field @Deprecated public int width;
}
public final class ConsumerIrManager {
@@ -16138,7 +16136,7 @@ package android.hardware {
public final class HardwareBuffer implements java.lang.AutoCloseable android.os.Parcelable {
method public void close();
- method public static android.hardware.HardwareBuffer create(int, int, int, int, long);
+ method @NonNull public static android.hardware.HardwareBuffer create(int, int, int, int, long);
method public int describeContents();
method public int getFormat();
method public int getHeight();
@@ -16183,13 +16181,13 @@ package android.hardware {
method public int getMaxDelay();
method public float getMaximumRange();
method public int getMinDelay();
- method public java.lang.String getName();
+ method public String getName();
method public float getPower();
method public int getReportingMode();
method public float getResolution();
- method public java.lang.String getStringType();
+ method public String getStringType();
method public int getType();
- method public java.lang.String getVendor();
+ method public String getVendor();
method public int getVersion();
method public boolean isAdditionalInfoSupported();
method public boolean isDirectChannelTypeSupported(int);
@@ -16199,33 +16197,33 @@ package android.hardware {
field public static final int REPORTING_MODE_ONE_SHOT = 2; // 0x2
field public static final int REPORTING_MODE_ON_CHANGE = 1; // 0x1
field public static final int REPORTING_MODE_SPECIAL_TRIGGER = 3; // 0x3
- field public static final java.lang.String STRING_TYPE_ACCELEROMETER = "android.sensor.accelerometer";
- field public static final java.lang.String STRING_TYPE_ACCELEROMETER_UNCALIBRATED = "android.sensor.accelerometer_uncalibrated";
- field public static final java.lang.String STRING_TYPE_AMBIENT_TEMPERATURE = "android.sensor.ambient_temperature";
- field public static final java.lang.String STRING_TYPE_GAME_ROTATION_VECTOR = "android.sensor.game_rotation_vector";
- field public static final java.lang.String STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR = "android.sensor.geomagnetic_rotation_vector";
- field public static final java.lang.String STRING_TYPE_GRAVITY = "android.sensor.gravity";
- field public static final java.lang.String STRING_TYPE_GYROSCOPE = "android.sensor.gyroscope";
- field public static final java.lang.String STRING_TYPE_GYROSCOPE_UNCALIBRATED = "android.sensor.gyroscope_uncalibrated";
- field public static final java.lang.String STRING_TYPE_HEART_BEAT = "android.sensor.heart_beat";
- field public static final java.lang.String STRING_TYPE_HEART_RATE = "android.sensor.heart_rate";
- field public static final java.lang.String STRING_TYPE_LIGHT = "android.sensor.light";
- field public static final java.lang.String STRING_TYPE_LINEAR_ACCELERATION = "android.sensor.linear_acceleration";
- field public static final java.lang.String STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT = "android.sensor.low_latency_offbody_detect";
- field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD = "android.sensor.magnetic_field";
- field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED = "android.sensor.magnetic_field_uncalibrated";
- field public static final java.lang.String STRING_TYPE_MOTION_DETECT = "android.sensor.motion_detect";
- field public static final deprecated java.lang.String STRING_TYPE_ORIENTATION = "android.sensor.orientation";
- field public static final java.lang.String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
- field public static final java.lang.String STRING_TYPE_PRESSURE = "android.sensor.pressure";
- field public static final java.lang.String STRING_TYPE_PROXIMITY = "android.sensor.proximity";
- field public static final java.lang.String STRING_TYPE_RELATIVE_HUMIDITY = "android.sensor.relative_humidity";
- field public static final java.lang.String STRING_TYPE_ROTATION_VECTOR = "android.sensor.rotation_vector";
- field public static final java.lang.String STRING_TYPE_SIGNIFICANT_MOTION = "android.sensor.significant_motion";
- field public static final java.lang.String STRING_TYPE_STATIONARY_DETECT = "android.sensor.stationary_detect";
- field public static final java.lang.String STRING_TYPE_STEP_COUNTER = "android.sensor.step_counter";
- field public static final java.lang.String STRING_TYPE_STEP_DETECTOR = "android.sensor.step_detector";
- field public static final deprecated java.lang.String STRING_TYPE_TEMPERATURE = "android.sensor.temperature";
+ field public static final String STRING_TYPE_ACCELEROMETER = "android.sensor.accelerometer";
+ field public static final String STRING_TYPE_ACCELEROMETER_UNCALIBRATED = "android.sensor.accelerometer_uncalibrated";
+ field public static final String STRING_TYPE_AMBIENT_TEMPERATURE = "android.sensor.ambient_temperature";
+ field public static final String STRING_TYPE_GAME_ROTATION_VECTOR = "android.sensor.game_rotation_vector";
+ field public static final String STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR = "android.sensor.geomagnetic_rotation_vector";
+ field public static final String STRING_TYPE_GRAVITY = "android.sensor.gravity";
+ field public static final String STRING_TYPE_GYROSCOPE = "android.sensor.gyroscope";
+ field public static final String STRING_TYPE_GYROSCOPE_UNCALIBRATED = "android.sensor.gyroscope_uncalibrated";
+ field public static final String STRING_TYPE_HEART_BEAT = "android.sensor.heart_beat";
+ field public static final String STRING_TYPE_HEART_RATE = "android.sensor.heart_rate";
+ field public static final String STRING_TYPE_LIGHT = "android.sensor.light";
+ field public static final String STRING_TYPE_LINEAR_ACCELERATION = "android.sensor.linear_acceleration";
+ field public static final String STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT = "android.sensor.low_latency_offbody_detect";
+ field public static final String STRING_TYPE_MAGNETIC_FIELD = "android.sensor.magnetic_field";
+ field public static final String STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED = "android.sensor.magnetic_field_uncalibrated";
+ field public static final String STRING_TYPE_MOTION_DETECT = "android.sensor.motion_detect";
+ field @Deprecated public static final String STRING_TYPE_ORIENTATION = "android.sensor.orientation";
+ field public static final String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
+ field public static final String STRING_TYPE_PRESSURE = "android.sensor.pressure";
+ field public static final String STRING_TYPE_PROXIMITY = "android.sensor.proximity";
+ field public static final String STRING_TYPE_RELATIVE_HUMIDITY = "android.sensor.relative_humidity";
+ field public static final String STRING_TYPE_ROTATION_VECTOR = "android.sensor.rotation_vector";
+ field public static final String STRING_TYPE_SIGNIFICANT_MOTION = "android.sensor.significant_motion";
+ field public static final String STRING_TYPE_STATIONARY_DETECT = "android.sensor.stationary_detect";
+ field public static final String STRING_TYPE_STEP_COUNTER = "android.sensor.step_counter";
+ field public static final String STRING_TYPE_STEP_DETECTOR = "android.sensor.step_detector";
+ field @Deprecated public static final String STRING_TYPE_TEMPERATURE = "android.sensor.temperature";
field public static final int TYPE_ACCELEROMETER = 1; // 0x1
field public static final int TYPE_ACCELEROMETER_UNCALIBRATED = 35; // 0x23
field public static final int TYPE_ALL = -1; // 0xffffffff
@@ -16244,7 +16242,7 @@ package android.hardware {
field public static final int TYPE_MAGNETIC_FIELD = 2; // 0x2
field public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14; // 0xe
field public static final int TYPE_MOTION_DETECT = 30; // 0x1e
- field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
+ field @Deprecated public static final int TYPE_ORIENTATION = 3; // 0x3
field public static final int TYPE_POSE_6DOF = 28; // 0x1c
field public static final int TYPE_PRESSURE = 6; // 0x6
field public static final int TYPE_PROXIMITY = 8; // 0x8
@@ -16254,7 +16252,7 @@ package android.hardware {
field public static final int TYPE_STATIONARY_DETECT = 29; // 0x1d
field public static final int TYPE_STEP_COUNTER = 19; // 0x13
field public static final int TYPE_STEP_DETECTOR = 18; // 0x12
- field public static final deprecated int TYPE_TEMPERATURE = 7; // 0x7
+ field @Deprecated public static final int TYPE_TEMPERATURE = 7; // 0x7
}
public class SensorAdditionalInfo {
@@ -16299,18 +16297,18 @@ package android.hardware {
method public void onSensorChanged(android.hardware.SensorEvent);
}
- public abstract interface SensorEventListener {
- method public abstract void onAccuracyChanged(android.hardware.Sensor, int);
- method public abstract void onSensorChanged(android.hardware.SensorEvent);
+ public interface SensorEventListener {
+ method public void onAccuracyChanged(android.hardware.Sensor, int);
+ method public void onSensorChanged(android.hardware.SensorEvent);
}
- public abstract interface SensorEventListener2 implements android.hardware.SensorEventListener {
- method public abstract void onFlushCompleted(android.hardware.Sensor);
+ public interface SensorEventListener2 extends android.hardware.SensorEventListener {
+ method public void onFlushCompleted(android.hardware.Sensor);
}
- public abstract deprecated interface SensorListener {
- method public abstract void onAccuracyChanged(int, int);
- method public abstract void onSensorChanged(int, float[]);
+ @Deprecated public interface SensorListener {
+ method @Deprecated public void onAccuracyChanged(int, int);
+ method @Deprecated public void onSensorChanged(int, float[]);
}
public abstract class SensorManager {
@@ -16329,12 +16327,12 @@ package android.hardware {
method public static boolean getRotationMatrix(float[], float[], float[], float[]);
method public static void getRotationMatrixFromVector(float[], float[]);
method public java.util.List<android.hardware.Sensor> getSensorList(int);
- method public deprecated int getSensors();
+ method @Deprecated public int getSensors();
method public boolean isDynamicSensorDiscoverySupported();
method public void registerDynamicSensorCallback(android.hardware.SensorManager.DynamicSensorCallback);
method public void registerDynamicSensorCallback(android.hardware.SensorManager.DynamicSensorCallback, android.os.Handler);
- method public deprecated boolean registerListener(android.hardware.SensorListener, int);
- method public deprecated boolean registerListener(android.hardware.SensorListener, int, int);
+ method @Deprecated public boolean registerListener(android.hardware.SensorListener, int);
+ method @Deprecated public boolean registerListener(android.hardware.SensorListener, int, int);
method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int);
method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, int);
method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, android.os.Handler);
@@ -16342,8 +16340,8 @@ package android.hardware {
method public static boolean remapCoordinateSystem(float[], int, int, float[]);
method public boolean requestTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor);
method public void unregisterDynamicSensorCallback(android.hardware.SensorManager.DynamicSensorCallback);
- method public deprecated void unregisterListener(android.hardware.SensorListener);
- method public deprecated void unregisterListener(android.hardware.SensorListener, int);
+ method @Deprecated public void unregisterListener(android.hardware.SensorListener);
+ method @Deprecated public void unregisterListener(android.hardware.SensorListener, int);
method public void unregisterListener(android.hardware.SensorEventListener, android.hardware.Sensor);
method public void unregisterListener(android.hardware.SensorEventListener);
field public static final int AXIS_MINUS_X = 129; // 0x81
@@ -16352,9 +16350,9 @@ package android.hardware {
field public static final int AXIS_X = 1; // 0x1
field public static final int AXIS_Y = 2; // 0x2
field public static final int AXIS_Z = 3; // 0x3
- field public static final deprecated int DATA_X = 0; // 0x0
- field public static final deprecated int DATA_Y = 1; // 0x1
- field public static final deprecated int DATA_Z = 2; // 0x2
+ field @Deprecated public static final int DATA_X = 0; // 0x0
+ field @Deprecated public static final int DATA_Y = 1; // 0x1
+ field @Deprecated public static final int DATA_Z = 2; // 0x2
field public static final float GRAVITY_DEATH_STAR_I = 3.5303614E-7f;
field public static final float GRAVITY_EARTH = 9.80665f;
field public static final float GRAVITY_JUPITER = 23.12f;
@@ -16379,34 +16377,34 @@ package android.hardware {
field public static final float MAGNETIC_FIELD_EARTH_MAX = 60.0f;
field public static final float MAGNETIC_FIELD_EARTH_MIN = 30.0f;
field public static final float PRESSURE_STANDARD_ATMOSPHERE = 1013.25f;
- field public static final deprecated int RAW_DATA_INDEX = 3; // 0x3
- field public static final deprecated int RAW_DATA_X = 3; // 0x3
- field public static final deprecated int RAW_DATA_Y = 4; // 0x4
- field public static final deprecated int RAW_DATA_Z = 5; // 0x5
- field public static final deprecated int SENSOR_ACCELEROMETER = 2; // 0x2
- field public static final deprecated int SENSOR_ALL = 127; // 0x7f
+ field @Deprecated public static final int RAW_DATA_INDEX = 3; // 0x3
+ field @Deprecated public static final int RAW_DATA_X = 3; // 0x3
+ field @Deprecated public static final int RAW_DATA_Y = 4; // 0x4
+ field @Deprecated public static final int RAW_DATA_Z = 5; // 0x5
+ field @Deprecated public static final int SENSOR_ACCELEROMETER = 2; // 0x2
+ field @Deprecated public static final int SENSOR_ALL = 127; // 0x7f
field public static final int SENSOR_DELAY_FASTEST = 0; // 0x0
field public static final int SENSOR_DELAY_GAME = 1; // 0x1
field public static final int SENSOR_DELAY_NORMAL = 3; // 0x3
field public static final int SENSOR_DELAY_UI = 2; // 0x2
- field public static final deprecated int SENSOR_LIGHT = 16; // 0x10
- field public static final deprecated int SENSOR_MAGNETIC_FIELD = 8; // 0x8
- field public static final deprecated int SENSOR_MAX = 64; // 0x40
- field public static final deprecated int SENSOR_MIN = 1; // 0x1
- field public static final deprecated int SENSOR_ORIENTATION = 1; // 0x1
- field public static final deprecated int SENSOR_ORIENTATION_RAW = 128; // 0x80
- field public static final deprecated int SENSOR_PROXIMITY = 32; // 0x20
+ field @Deprecated public static final int SENSOR_LIGHT = 16; // 0x10
+ field @Deprecated public static final int SENSOR_MAGNETIC_FIELD = 8; // 0x8
+ field @Deprecated public static final int SENSOR_MAX = 64; // 0x40
+ field @Deprecated public static final int SENSOR_MIN = 1; // 0x1
+ field @Deprecated public static final int SENSOR_ORIENTATION = 1; // 0x1
+ field @Deprecated public static final int SENSOR_ORIENTATION_RAW = 128; // 0x80
+ field @Deprecated public static final int SENSOR_PROXIMITY = 32; // 0x20
field public static final int SENSOR_STATUS_ACCURACY_HIGH = 3; // 0x3
field public static final int SENSOR_STATUS_ACCURACY_LOW = 1; // 0x1
field public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2; // 0x2
field public static final int SENSOR_STATUS_NO_CONTACT = -1; // 0xffffffff
field public static final int SENSOR_STATUS_UNRELIABLE = 0; // 0x0
- field public static final deprecated int SENSOR_TEMPERATURE = 4; // 0x4
- field public static final deprecated int SENSOR_TRICORDER = 64; // 0x40
+ field @Deprecated public static final int SENSOR_TEMPERATURE = 4; // 0x4
+ field @Deprecated public static final int SENSOR_TRICORDER = 64; // 0x40
field public static final float STANDARD_GRAVITY = 9.80665f;
}
- public static abstract class SensorManager.DynamicSensorCallback {
+ public abstract static class SensorManager.DynamicSensorCallback {
ctor public SensorManager.DynamicSensorCallback();
method public void onDynamicSensorConnected(android.hardware.Sensor);
method public void onDynamicSensorDisconnected(android.hardware.Sensor);
@@ -16428,16 +16426,16 @@ package android.hardware {
package android.hardware.biometrics {
public class BiometricManager {
- method public int canAuthenticate();
- field public static final int BIOMETRIC_ERROR_NO_BIOMETRICS = 11; // 0xb
+ method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public int canAuthenticate();
+ field public static final int BIOMETRIC_ERROR_HW_UNAVAILABLE = 1; // 0x1
+ field public static final int BIOMETRIC_ERROR_NONE_ENROLLED = 11; // 0xb
field public static final int BIOMETRIC_ERROR_NO_HARDWARE = 12; // 0xc
- field public static final int BIOMETRIC_ERROR_UNAVAILABLE = 1; // 0x1
field public static final int BIOMETRIC_SUCCESS = 0; // 0x0
}
public class BiometricPrompt {
- method public void authenticate(android.hardware.biometrics.BiometricPrompt.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
- method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
+ method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public void authenticate(@NonNull android.hardware.biometrics.BiometricPrompt.CryptoObject, @NonNull android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
+ method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public void authenticate(@NonNull android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
field public static final int BIOMETRIC_ACQUIRED_GOOD = 0; // 0x0
field public static final int BIOMETRIC_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
field public static final int BIOMETRIC_ACQUIRED_INSUFFICIENT = 2; // 0x2
@@ -16457,11 +16455,11 @@ package android.hardware.biometrics {
field public static final int BIOMETRIC_ERROR_VENDOR = 8; // 0x8
}
- public static abstract class BiometricPrompt.AuthenticationCallback {
+ public abstract static class BiometricPrompt.AuthenticationCallback {
ctor public BiometricPrompt.AuthenticationCallback();
- method public void onAuthenticationError(int, java.lang.CharSequence);
+ method public void onAuthenticationError(int, CharSequence);
method public void onAuthenticationFailed();
- method public void onAuthenticationHelp(int, java.lang.CharSequence);
+ method public void onAuthenticationHelp(int, CharSequence);
method public void onAuthenticationSucceeded(android.hardware.biometrics.BiometricPrompt.AuthenticationResult);
}
@@ -16472,16 +16470,17 @@ package android.hardware.biometrics {
public static class BiometricPrompt.Builder {
ctor public BiometricPrompt.Builder(android.content.Context);
method public android.hardware.biometrics.BiometricPrompt build();
- method public android.hardware.biometrics.BiometricPrompt.Builder setDescription(java.lang.CharSequence);
- method public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(java.lang.CharSequence, java.util.concurrent.Executor, android.content.DialogInterface.OnClickListener);
- method public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(java.lang.CharSequence);
- method public android.hardware.biometrics.BiometricPrompt.Builder setTitle(java.lang.CharSequence);
+ method public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence);
+ method public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener);
+ method public android.hardware.biometrics.BiometricPrompt.Builder setRequireConfirmation(boolean);
+ method public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence);
+ method public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence);
}
public static final class BiometricPrompt.CryptoObject {
- ctor public BiometricPrompt.CryptoObject(java.security.Signature);
- ctor public BiometricPrompt.CryptoObject(javax.crypto.Cipher);
- ctor public BiometricPrompt.CryptoObject(javax.crypto.Mac);
+ ctor public BiometricPrompt.CryptoObject(@NonNull java.security.Signature);
+ ctor public BiometricPrompt.CryptoObject(@NonNull javax.crypto.Cipher);
+ ctor public BiometricPrompt.CryptoObject(@NonNull javax.crypto.Mac);
method public javax.crypto.Cipher getCipher();
method public javax.crypto.Mac getMac();
method public java.security.Signature getSignature();
@@ -16493,9 +16492,9 @@ package android.hardware.camera2 {
public class CameraAccessException extends android.util.AndroidException {
ctor public CameraAccessException(int);
- ctor public CameraAccessException(int, java.lang.String);
- ctor public CameraAccessException(int, java.lang.String, java.lang.Throwable);
- ctor public CameraAccessException(int, java.lang.Throwable);
+ ctor public CameraAccessException(int, String);
+ ctor public CameraAccessException(int, String, Throwable);
+ ctor public CameraAccessException(int, Throwable);
method public final int getReason();
field public static final int CAMERA_DISABLED = 1; // 0x1
field public static final int CAMERA_DISCONNECTED = 2; // 0x2
@@ -16507,56 +16506,56 @@ package android.hardware.camera2 {
public abstract class CameraCaptureSession implements java.lang.AutoCloseable {
ctor public CameraCaptureSession();
method public abstract void abortCaptures() throws android.hardware.camera2.CameraAccessException;
- method public abstract int capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract int captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public int captureBurstRequests(java.util.List<android.hardware.camera2.CaptureRequest>, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
- method public int captureSingleRequest(android.hardware.camera2.CaptureRequest, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int capture(@NonNull android.hardware.camera2.CaptureRequest, @Nullable android.hardware.camera2.CameraCaptureSession.CaptureCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int captureBurst(@NonNull java.util.List<android.hardware.camera2.CaptureRequest>, @Nullable android.hardware.camera2.CameraCaptureSession.CaptureCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public int captureBurstRequests(@NonNull java.util.List<android.hardware.camera2.CaptureRequest>, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
+ method public int captureSingleRequest(@NonNull android.hardware.camera2.CaptureRequest, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
method public abstract void close();
method public abstract void finalizeOutputConfigurations(java.util.List<android.hardware.camera2.params.OutputConfiguration>) throws android.hardware.camera2.CameraAccessException;
- method public abstract android.hardware.camera2.CameraDevice getDevice();
- method public abstract android.view.Surface getInputSurface();
+ method @NonNull public abstract android.hardware.camera2.CameraDevice getDevice();
+ method @Nullable public abstract android.view.Surface getInputSurface();
method public abstract boolean isReprocessable();
- method public abstract void prepare(android.view.Surface) throws android.hardware.camera2.CameraAccessException;
- method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public int setRepeatingBurstRequests(java.util.List<android.hardware.camera2.CaptureRequest>, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
- method public abstract int setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public int setSingleRepeatingRequest(android.hardware.camera2.CaptureRequest, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void prepare(@NonNull android.view.Surface) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int setRepeatingBurst(@NonNull java.util.List<android.hardware.camera2.CaptureRequest>, @Nullable android.hardware.camera2.CameraCaptureSession.CaptureCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public int setRepeatingBurstRequests(@NonNull java.util.List<android.hardware.camera2.CaptureRequest>, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int setRepeatingRequest(@NonNull android.hardware.camera2.CaptureRequest, @Nullable android.hardware.camera2.CameraCaptureSession.CaptureCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public int setSingleRepeatingRequest(@NonNull android.hardware.camera2.CaptureRequest, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.CaptureCallback) throws android.hardware.camera2.CameraAccessException;
method public abstract void stopRepeating() throws android.hardware.camera2.CameraAccessException;
method public void updateOutputConfiguration(android.hardware.camera2.params.OutputConfiguration) throws android.hardware.camera2.CameraAccessException;
}
- public static abstract class CameraCaptureSession.CaptureCallback {
+ public abstract static class CameraCaptureSession.CaptureCallback {
ctor public CameraCaptureSession.CaptureCallback();
- method public void onCaptureBufferLost(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.view.Surface, long);
- method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult);
- method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
- method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);
- method public void onCaptureSequenceAborted(android.hardware.camera2.CameraCaptureSession, int);
- method public void onCaptureSequenceCompleted(android.hardware.camera2.CameraCaptureSession, int, long);
- method public void onCaptureStarted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, long, long);
+ method public void onCaptureBufferLost(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.hardware.camera2.CaptureRequest, @NonNull android.view.Surface, long);
+ method public void onCaptureCompleted(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.hardware.camera2.CaptureRequest, @NonNull android.hardware.camera2.TotalCaptureResult);
+ method public void onCaptureFailed(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.hardware.camera2.CaptureRequest, @NonNull android.hardware.camera2.CaptureFailure);
+ method public void onCaptureProgressed(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.hardware.camera2.CaptureRequest, @NonNull android.hardware.camera2.CaptureResult);
+ method public void onCaptureSequenceAborted(@NonNull android.hardware.camera2.CameraCaptureSession, int);
+ method public void onCaptureSequenceCompleted(@NonNull android.hardware.camera2.CameraCaptureSession, int, long);
+ method public void onCaptureStarted(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.hardware.camera2.CaptureRequest, long, long);
}
- public static abstract class CameraCaptureSession.StateCallback {
+ public abstract static class CameraCaptureSession.StateCallback {
ctor public CameraCaptureSession.StateCallback();
- method public void onActive(android.hardware.camera2.CameraCaptureSession);
- method public void onCaptureQueueEmpty(android.hardware.camera2.CameraCaptureSession);
- method public void onClosed(android.hardware.camera2.CameraCaptureSession);
- method public abstract void onConfigureFailed(android.hardware.camera2.CameraCaptureSession);
- method public abstract void onConfigured(android.hardware.camera2.CameraCaptureSession);
- method public void onReady(android.hardware.camera2.CameraCaptureSession);
- method public void onSurfacePrepared(android.hardware.camera2.CameraCaptureSession, android.view.Surface);
- }
-
- public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata {
- method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
- method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
- method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
+ method public void onActive(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public void onCaptureQueueEmpty(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public void onClosed(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public abstract void onConfigureFailed(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public abstract void onConfigured(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public void onReady(@NonNull android.hardware.camera2.CameraCaptureSession);
+ method public void onSurfacePrepared(@NonNull android.hardware.camera2.CameraCaptureSession, @NonNull android.view.Surface);
+ }
+
+ public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CameraCharacteristics.Key<?>> {
+ method @Nullable public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
+ method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
+ method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailablePhysicalCameraRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableSessionKeys();
- method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
+ method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
- method public java.util.Set<java.lang.String> getPhysicalCameraIds();
- method public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int);
+ method @NonNull public java.util.Set<java.lang.String> getPhysicalCameraIds();
+ method @Nullable public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int);
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
@@ -16596,7 +16595,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION;
- field public static final deprecated android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
+ field @Deprecated public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL;
@@ -16647,27 +16646,27 @@ package android.hardware.camera2 {
}
public static final class CameraCharacteristics.Key<T> {
- method public java.lang.String getName();
+ method @NonNull public String getName();
}
public abstract class CameraConstrainedHighSpeedCaptureSession extends android.hardware.camera2.CameraCaptureSession {
ctor public CameraConstrainedHighSpeedCaptureSession();
- method public abstract java.util.List<android.hardware.camera2.CaptureRequest> createHighSpeedRequestList(android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public abstract java.util.List<android.hardware.camera2.CaptureRequest> createHighSpeedRequestList(@NonNull android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
}
public abstract class CameraDevice implements java.lang.AutoCloseable {
method public abstract void close();
- method public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
- method public android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int, java.util.Set<java.lang.String>) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int, java.util.Set<java.lang.String>) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createCaptureSession(@NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public void createCaptureSession(android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createCaptureSessionByOutputConfigurations(java.util.List<android.hardware.camera2.params.OutputConfiguration>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createConstrainedHighSpeedCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createReprocessableCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createReprocessableCaptureSessionByConfigurations(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract java.lang.String getId();
- method public boolean isSessionConfigurationSupported(android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createCaptureSessionByOutputConfigurations(java.util.List<android.hardware.camera2.params.OutputConfiguration>, android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createConstrainedHighSpeedCaptureSession(@NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(@NonNull android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createReprocessableCaptureSession(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public abstract String getId();
+ method public boolean isSessionConfigurationSupported(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
field public static final int TEMPLATE_MANUAL = 6; // 0x6
field public static final int TEMPLATE_PREVIEW = 1; // 0x1
field public static final int TEMPLATE_RECORD = 3; // 0x3
@@ -16676,12 +16675,12 @@ package android.hardware.camera2 {
field public static final int TEMPLATE_ZERO_SHUTTER_LAG = 5; // 0x5
}
- public static abstract class CameraDevice.StateCallback {
+ public abstract static class CameraDevice.StateCallback {
ctor public CameraDevice.StateCallback();
- method public void onClosed(android.hardware.camera2.CameraDevice);
- method public abstract void onDisconnected(android.hardware.camera2.CameraDevice);
- method public abstract void onError(android.hardware.camera2.CameraDevice, int);
- method public abstract void onOpened(android.hardware.camera2.CameraDevice);
+ method public void onClosed(@NonNull android.hardware.camera2.CameraDevice);
+ method public abstract void onDisconnected(@NonNull android.hardware.camera2.CameraDevice);
+ method public abstract void onError(@NonNull android.hardware.camera2.CameraDevice, int);
+ method public abstract void onOpened(@NonNull android.hardware.camera2.CameraDevice);
field public static final int ERROR_CAMERA_DEVICE = 4; // 0x4
field public static final int ERROR_CAMERA_DISABLED = 3; // 0x3
field public static final int ERROR_CAMERA_IN_USE = 1; // 0x1
@@ -16690,33 +16689,33 @@ package android.hardware.camera2 {
}
public final class CameraManager {
- method public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(java.lang.String) throws android.hardware.camera2.CameraAccessException;
- method public java.lang.String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
- method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public void openCamera(java.lang.String, java.util.concurrent.Executor, android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException;
- method public void registerAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback, android.os.Handler);
- method public void registerAvailabilityCallback(java.util.concurrent.Executor, android.hardware.camera2.CameraManager.AvailabilityCallback);
- method public void registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback, android.os.Handler);
- method public void registerTorchCallback(java.util.concurrent.Executor, android.hardware.camera2.CameraManager.TorchCallback);
- method public void setTorchMode(java.lang.String, boolean) throws android.hardware.camera2.CameraAccessException;
- method public void unregisterAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback);
- method public void unregisterTorchCallback(android.hardware.camera2.CameraManager.TorchCallback);
- }
-
- public static abstract class CameraManager.AvailabilityCallback {
+ method @NonNull public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(@NonNull String) throws android.hardware.camera2.CameraAccessException;
+ method @NonNull public String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
+ method @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@NonNull String, @NonNull android.hardware.camera2.CameraDevice.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException;
+ method public void registerAvailabilityCallback(@NonNull android.hardware.camera2.CameraManager.AvailabilityCallback, @Nullable android.os.Handler);
+ method public void registerAvailabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraManager.AvailabilityCallback);
+ method public void registerTorchCallback(@NonNull android.hardware.camera2.CameraManager.TorchCallback, @Nullable android.os.Handler);
+ method public void registerTorchCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraManager.TorchCallback);
+ method public void setTorchMode(@NonNull String, boolean) throws android.hardware.camera2.CameraAccessException;
+ method public void unregisterAvailabilityCallback(@NonNull android.hardware.camera2.CameraManager.AvailabilityCallback);
+ method public void unregisterTorchCallback(@NonNull android.hardware.camera2.CameraManager.TorchCallback);
+ }
+
+ public abstract static class CameraManager.AvailabilityCallback {
ctor public CameraManager.AvailabilityCallback();
- method public void onCameraAvailable(java.lang.String);
- method public void onCameraUnavailable(java.lang.String);
+ method public void onCameraAvailable(@NonNull String);
+ method public void onCameraUnavailable(@NonNull String);
}
- public static abstract class CameraManager.TorchCallback {
+ public abstract static class CameraManager.TorchCallback {
ctor public CameraManager.TorchCallback();
- method public void onTorchModeChanged(java.lang.String, boolean);
- method public void onTorchModeUnavailable(java.lang.String);
+ method public void onTorchModeChanged(@NonNull String, boolean);
+ method public void onTorchModeUnavailable(@NonNull String);
}
public abstract class CameraMetadata<TKey> {
- method public java.util.List<TKey> getKeys();
+ method @NonNull public java.util.List<TKey> getKeys();
field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1
field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2
field public static final int COLOR_CORRECTION_ABERRATION_MODE_OFF = 0; // 0x0
@@ -16802,7 +16801,7 @@ package android.hardware.camera2 {
field public static final int CONTROL_SCENE_MODE_FACE_PRIORITY = 1; // 0x1
field public static final int CONTROL_SCENE_MODE_FIREWORKS = 12; // 0xc
field public static final int CONTROL_SCENE_MODE_HDR = 18; // 0x12
- field public static final deprecated int CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO = 17; // 0x11
+ field @Deprecated public static final int CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO = 17; // 0x11
field public static final int CONTROL_SCENE_MODE_LANDSCAPE = 4; // 0x4
field public static final int CONTROL_SCENE_MODE_NIGHT = 5; // 0x5
field public static final int CONTROL_SCENE_MODE_NIGHT_PORTRAIT = 6; // 0x6
@@ -16933,18 +16932,18 @@ package android.hardware.camera2 {
public class CaptureFailure {
method public long getFrameNumber();
method public int getReason();
- method public android.hardware.camera2.CaptureRequest getRequest();
+ method @NonNull public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
method public boolean wasImageCaptured();
field public static final int REASON_ERROR = 0; // 0x0
field public static final int REASON_FLUSHED = 1; // 0x1
}
- public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
+ public final class CaptureRequest extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureRequest.Key<?>> implements android.os.Parcelable {
method public int describeContents();
- method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
- method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys();
- method public java.lang.Object getTag();
+ method @Nullable public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
+ method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys();
+ method @Nullable public Object getTag();
method public boolean isReprocess();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
@@ -17007,25 +17006,25 @@ package android.hardware.camera2 {
}
public static final class CaptureRequest.Builder {
- method public void addTarget(android.view.Surface);
- method public android.hardware.camera2.CaptureRequest build();
- method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
- method public <T> T getPhysicalCameraKey(android.hardware.camera2.CaptureRequest.Key<T>, java.lang.String);
- method public void removeTarget(android.view.Surface);
- method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
- method public <T> android.hardware.camera2.CaptureRequest.Builder setPhysicalCameraKey(android.hardware.camera2.CaptureRequest.Key<T>, T, java.lang.String);
- method public void setTag(java.lang.Object);
+ method public void addTarget(@NonNull android.view.Surface);
+ method @NonNull public android.hardware.camera2.CaptureRequest build();
+ method @Nullable public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
+ method @Nullable public <T> T getPhysicalCameraKey(android.hardware.camera2.CaptureRequest.Key<T>, @NonNull String);
+ method public void removeTarget(@NonNull android.view.Surface);
+ method public <T> void set(@NonNull android.hardware.camera2.CaptureRequest.Key<T>, T);
+ method public <T> android.hardware.camera2.CaptureRequest.Builder setPhysicalCameraKey(@NonNull android.hardware.camera2.CaptureRequest.Key<T>, T, @NonNull String);
+ method public void setTag(@Nullable Object);
}
public static final class CaptureRequest.Key<T> {
- method public java.lang.String getName();
+ method @NonNull public String getName();
}
- public class CaptureResult extends android.hardware.camera2.CameraMetadata {
- method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
+ public class CaptureResult extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureResult.Key<?>> {
+ method @Nullable public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method public long getFrameNumber();
- method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
- method public android.hardware.camera2.CaptureRequest getRequest();
+ method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
+ method @NonNull public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
@@ -17071,12 +17070,12 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float, java.lang.Float>> LENS_FOCUS_RANGE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float,java.lang.Float>> LENS_FOCUS_RANGE;
field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_INTRINSIC_CALIBRATION;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION;
field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION;
- field public static final deprecated android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
+ field @Deprecated public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
@@ -17088,7 +17087,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT;
field public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double, java.lang.Double>[]> SENSOR_NOISE_PROFILE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double,java.lang.Double>[]> SENSOR_NOISE_PROFILE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY;
field public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA;
@@ -17111,26 +17110,26 @@ package android.hardware.camera2 {
}
public static final class CaptureResult.Key<T> {
- method public java.lang.String getName();
+ method @NonNull public String getName();
}
public final class DngCreator implements java.lang.AutoCloseable {
- ctor public DngCreator(android.hardware.camera2.CameraCharacteristics, android.hardware.camera2.CaptureResult);
+ ctor public DngCreator(@NonNull android.hardware.camera2.CameraCharacteristics, @NonNull android.hardware.camera2.CaptureResult);
method public void close();
- method public android.hardware.camera2.DngCreator setDescription(java.lang.String);
- method public android.hardware.camera2.DngCreator setLocation(android.location.Location);
- method public android.hardware.camera2.DngCreator setOrientation(int);
- method public android.hardware.camera2.DngCreator setThumbnail(android.graphics.Bitmap);
- method public android.hardware.camera2.DngCreator setThumbnail(android.media.Image);
- method public void writeByteBuffer(java.io.OutputStream, android.util.Size, java.nio.ByteBuffer, long) throws java.io.IOException;
- method public void writeImage(java.io.OutputStream, android.media.Image) throws java.io.IOException;
- method public void writeInputStream(java.io.OutputStream, android.util.Size, java.io.InputStream, long) throws java.io.IOException;
+ method @NonNull public android.hardware.camera2.DngCreator setDescription(@NonNull String);
+ method @NonNull public android.hardware.camera2.DngCreator setLocation(@NonNull android.location.Location);
+ method @NonNull public android.hardware.camera2.DngCreator setOrientation(int);
+ method @NonNull public android.hardware.camera2.DngCreator setThumbnail(@NonNull android.graphics.Bitmap);
+ method @NonNull public android.hardware.camera2.DngCreator setThumbnail(@NonNull android.media.Image);
+ method public void writeByteBuffer(@NonNull java.io.OutputStream, @NonNull android.util.Size, @NonNull java.nio.ByteBuffer, @IntRange(from=0) long) throws java.io.IOException;
+ method public void writeImage(@NonNull java.io.OutputStream, @NonNull android.media.Image) throws java.io.IOException;
+ method public void writeInputStream(@NonNull java.io.OutputStream, @NonNull android.util.Size, @NonNull java.io.InputStream, @IntRange(from=0) long) throws java.io.IOException;
field public static final int MAX_THUMBNAIL_DIMENSION = 256; // 0x100
}
public final class TotalCaptureResult extends android.hardware.camera2.CaptureResult {
- method public java.util.List<android.hardware.camera2.CaptureResult> getPartialResults();
- method public java.util.Map<java.lang.String, android.hardware.camera2.CaptureResult> getPhysicalCameraResults();
+ method @NonNull public java.util.List<android.hardware.camera2.CaptureResult> getPartialResults();
+ method public java.util.Map<java.lang.String,android.hardware.camera2.CaptureResult> getPhysicalCameraResults();
}
}
@@ -17181,7 +17180,7 @@ package android.hardware.camera2.params {
}
public final class MandatoryStreamCombination {
- method public java.lang.String getDescription();
+ method public String getDescription();
method public java.util.List<android.hardware.camera2.params.MandatoryStreamCombination.MandatoryStreamInformation> getStreamsInformation();
method public boolean isReprocessable();
}
@@ -17218,42 +17217,42 @@ package android.hardware.camera2.params {
}
public final class OutputConfiguration implements android.os.Parcelable {
- ctor public OutputConfiguration(android.view.Surface);
- ctor public OutputConfiguration(int, android.view.Surface);
- ctor public OutputConfiguration(android.util.Size, java.lang.Class<T>);
- method public void addSurface(android.view.Surface);
+ ctor public OutputConfiguration(@NonNull android.view.Surface);
+ ctor public OutputConfiguration(int, @NonNull android.view.Surface);
+ ctor public OutputConfiguration(@NonNull android.util.Size, @NonNull Class<T>);
+ method public void addSurface(@NonNull android.view.Surface);
method public int describeContents();
method public void enableSurfaceSharing();
method public int getMaxSharedSurfaceCount();
- method public android.view.Surface getSurface();
+ method @Nullable public android.view.Surface getSurface();
method public int getSurfaceGroupId();
- method public java.util.List<android.view.Surface> getSurfaces();
- method public void removeSurface(android.view.Surface);
- method public void setPhysicalCameraId(java.lang.String);
+ method @NonNull public java.util.List<android.view.Surface> getSurfaces();
+ method public void removeSurface(@NonNull android.view.Surface);
+ method public void setPhysicalCameraId(@Nullable String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.camera2.params.OutputConfiguration> CREATOR;
field public static final int SURFACE_GROUP_ID_NONE = -1; // 0xffffffff
}
public final class RecommendedStreamConfigurationMap {
- method public java.util.Set<android.util.Size> getHighResolutionOutputSizes(int);
- method public java.util.Set<android.util.Range<java.lang.Integer>> getHighSpeedVideoFpsRanges();
- method public java.util.Set<android.util.Range<java.lang.Integer>> getHighSpeedVideoFpsRangesFor(android.util.Size);
- method public java.util.Set<android.util.Size> getHighSpeedVideoSizes();
- method public java.util.Set<android.util.Size> getHighSpeedVideoSizesFor(android.util.Range<java.lang.Integer>);
- method public java.util.Set<java.lang.Integer> getInputFormats();
- method public java.util.Set<android.util.Size> getInputSizes(int);
- method public java.util.Set<java.lang.Integer> getOutputFormats();
- method public long getOutputMinFrameDuration(int, android.util.Size);
- method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
- method public java.util.Set<android.util.Size> getOutputSizes(int);
- method public <T> java.util.Set<android.util.Size> getOutputSizes(java.lang.Class<T>);
- method public long getOutputStallDuration(int, android.util.Size);
- method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
+ method @Nullable public java.util.Set<android.util.Size> getHighResolutionOutputSizes(int);
+ method @Nullable public java.util.Set<android.util.Range<java.lang.Integer>> getHighSpeedVideoFpsRanges();
+ method @Nullable public java.util.Set<android.util.Range<java.lang.Integer>> getHighSpeedVideoFpsRangesFor(@NonNull android.util.Size);
+ method @Nullable public java.util.Set<android.util.Size> getHighSpeedVideoSizes();
+ method @Nullable public java.util.Set<android.util.Size> getHighSpeedVideoSizesFor(@NonNull android.util.Range<java.lang.Integer>);
+ method @Nullable public java.util.Set<java.lang.Integer> getInputFormats();
+ method @Nullable public java.util.Set<android.util.Size> getInputSizes(int);
+ method @NonNull public java.util.Set<java.lang.Integer> getOutputFormats();
+ method @IntRange(from=0) public long getOutputMinFrameDuration(int, @NonNull android.util.Size);
+ method public <T> long getOutputMinFrameDuration(@NonNull Class<T>, @NonNull android.util.Size);
+ method @Nullable public java.util.Set<android.util.Size> getOutputSizes(int);
+ method public <T> java.util.Set<android.util.Size> getOutputSizes(@NonNull Class<T>);
+ method @IntRange(from=0) public long getOutputStallDuration(int, @NonNull android.util.Size);
+ method public <T> long getOutputStallDuration(@NonNull Class<T>, @NonNull android.util.Size);
method public int getRecommendedUseCase();
- method public java.util.Set<java.lang.Integer> getValidOutputFormatsForInput(int);
+ method @Nullable public java.util.Set<java.lang.Integer> getValidOutputFormatsForInput(int);
method public boolean isOutputSupportedFor(int);
- method public boolean isOutputSupportedFor(android.view.Surface);
+ method public boolean isOutputSupportedFor(@NonNull android.view.Surface);
field public static final int USECASE_PREVIEW = 0; // 0x0
field public static final int USECASE_RAW = 5; // 0x5
field public static final int USECASE_RECORD = 1; // 0x1
@@ -17278,7 +17277,7 @@ package android.hardware.camera2.params {
}
public final class SessionConfiguration implements android.os.Parcelable {
- ctor public SessionConfiguration(int, java.util.List<android.hardware.camera2.params.OutputConfiguration>, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.StateCallback);
+ ctor public SessionConfiguration(int, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback);
method public int describeContents();
method public java.util.concurrent.Executor getExecutor();
method public android.hardware.camera2.params.InputConfiguration getInputConfiguration();
@@ -17286,7 +17285,7 @@ package android.hardware.camera2.params {
method public android.hardware.camera2.CaptureRequest getSessionParameters();
method public int getSessionType();
method public android.hardware.camera2.CameraCaptureSession.StateCallback getStateCallback();
- method public void setInputConfiguration(android.hardware.camera2.params.InputConfiguration);
+ method public void setInputConfiguration(@NonNull android.hardware.camera2.params.InputConfiguration);
method public void setSessionParameters(android.hardware.camera2.CaptureRequest);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.camera2.params.SessionConfiguration> CREATOR;
@@ -17304,14 +17303,14 @@ package android.hardware.camera2.params {
method public android.util.Size[] getInputSizes(int);
method public int[] getOutputFormats();
method public long getOutputMinFrameDuration(int, android.util.Size);
- method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
- method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>);
+ method public <T> long getOutputMinFrameDuration(Class<T>, android.util.Size);
+ method public <T> android.util.Size[] getOutputSizes(Class<T>);
method public android.util.Size[] getOutputSizes(int);
method public long getOutputStallDuration(int, android.util.Size);
- method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
+ method public <T> long getOutputStallDuration(Class<T>, android.util.Size);
method public int[] getValidOutputFormatsForInput(int);
method public boolean isOutputSupportedFor(int);
- method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>);
+ method public static <T> boolean isOutputSupportedFor(Class<T>);
method public boolean isOutputSupportedFor(android.view.Surface);
}
@@ -17333,14 +17332,14 @@ package android.hardware.camera2.params {
package android.hardware.display {
public final class DisplayManager {
- method public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int);
- method public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay.Callback, android.os.Handler);
+ method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int);
+ method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler);
method public android.view.Display getDisplay(int);
method public android.view.Display[] getDisplays();
- method public android.view.Display[] getDisplays(java.lang.String);
+ method public android.view.Display[] getDisplays(String);
method public void registerDisplayListener(android.hardware.display.DisplayManager.DisplayListener, android.os.Handler);
method public void unregisterDisplayListener(android.hardware.display.DisplayManager.DisplayListener);
- field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+ field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
field public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16; // 0x10
field public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8; // 0x8
field public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2; // 0x2
@@ -17348,10 +17347,10 @@ package android.hardware.display {
field public static final int VIRTUAL_DISPLAY_FLAG_SECURE = 4; // 0x4
}
- public static abstract interface DisplayManager.DisplayListener {
- method public abstract void onDisplayAdded(int);
- method public abstract void onDisplayChanged(int);
- method public abstract void onDisplayRemoved(int);
+ public static interface DisplayManager.DisplayListener {
+ method public void onDisplayAdded(int);
+ method public void onDisplayChanged(int);
+ method public void onDisplayRemoved(int);
}
public final class VirtualDisplay {
@@ -17362,7 +17361,7 @@ package android.hardware.display {
method public void setSurface(android.view.Surface);
}
- public static abstract class VirtualDisplay.Callback {
+ public abstract static class VirtualDisplay.Callback {
ctor public VirtualDisplay.Callback();
method public void onPaused();
method public void onResumed();
@@ -17373,10 +17372,10 @@ package android.hardware.display {
package android.hardware.fingerprint {
- public deprecated class FingerprintManager {
- method public deprecated void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, int, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, android.os.Handler);
- method public deprecated boolean hasEnrolledFingerprints();
- method public deprecated boolean isHardwareDetected();
+ @Deprecated public class FingerprintManager {
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.USE_BIOMETRIC, android.Manifest.permission.USE_FINGERPRINT}) public void authenticate(@Nullable android.hardware.fingerprint.FingerprintManager.CryptoObject, @Nullable android.os.CancellationSignal, int, @NonNull android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, @Nullable android.os.Handler);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
@@ -17396,25 +17395,25 @@ package android.hardware.fingerprint {
field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
- public static abstract deprecated class FingerprintManager.AuthenticationCallback {
- ctor public FingerprintManager.AuthenticationCallback();
- method public void onAuthenticationError(int, java.lang.CharSequence);
- method public void onAuthenticationFailed();
- method public void onAuthenticationHelp(int, java.lang.CharSequence);
- method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
+ @Deprecated public abstract static class FingerprintManager.AuthenticationCallback {
+ ctor @Deprecated public FingerprintManager.AuthenticationCallback();
+ method @Deprecated public void onAuthenticationError(int, CharSequence);
+ method @Deprecated public void onAuthenticationFailed();
+ method @Deprecated public void onAuthenticationHelp(int, CharSequence);
+ method @Deprecated public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
}
- public static deprecated class FingerprintManager.AuthenticationResult {
- method public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
+ @Deprecated public static class FingerprintManager.AuthenticationResult {
+ method @Deprecated public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
}
- public static final deprecated class FingerprintManager.CryptoObject {
- ctor public FingerprintManager.CryptoObject(java.security.Signature);
- ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
- ctor public FingerprintManager.CryptoObject(javax.crypto.Mac);
- method public javax.crypto.Cipher getCipher();
- method public javax.crypto.Mac getMac();
- method public java.security.Signature getSignature();
+ @Deprecated public static final class FingerprintManager.CryptoObject {
+ ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull java.security.Signature);
+ ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull javax.crypto.Cipher);
+ ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull javax.crypto.Mac);
+ method @Deprecated public javax.crypto.Cipher getCipher();
+ method @Deprecated public javax.crypto.Mac getMac();
+ method @Deprecated public java.security.Signature getSignature();
}
}
@@ -17426,14 +17425,14 @@ package android.hardware.input {
method public int[] getInputDeviceIds();
method public void registerInputDeviceListener(android.hardware.input.InputManager.InputDeviceListener, android.os.Handler);
method public void unregisterInputDeviceListener(android.hardware.input.InputManager.InputDeviceListener);
- field public static final java.lang.String ACTION_QUERY_KEYBOARD_LAYOUTS = "android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS";
- field public static final java.lang.String META_DATA_KEYBOARD_LAYOUTS = "android.hardware.input.metadata.KEYBOARD_LAYOUTS";
+ field public static final String ACTION_QUERY_KEYBOARD_LAYOUTS = "android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS";
+ field public static final String META_DATA_KEYBOARD_LAYOUTS = "android.hardware.input.metadata.KEYBOARD_LAYOUTS";
}
- public static abstract interface InputManager.InputDeviceListener {
- method public abstract void onInputDeviceAdded(int);
- method public abstract void onInputDeviceChanged(int);
- method public abstract void onInputDeviceRemoved(int);
+ public static interface InputManager.InputDeviceListener {
+ method public void onInputDeviceAdded(int);
+ method public void onInputDeviceChanged(int);
+ method public void onInputDeviceRemoved(int);
}
}
@@ -17442,12 +17441,12 @@ package android.hardware.usb {
public class UsbAccessory implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getDescription();
- method public java.lang.String getManufacturer();
- method public java.lang.String getModel();
- method public java.lang.String getSerial();
- method public java.lang.String getUri();
- method public java.lang.String getVersion();
+ method @Nullable public String getDescription();
+ method @NonNull public String getManufacturer();
+ method @NonNull public String getModel();
+ method @Nullable public String getSerial();
+ method @Nullable public String getUri();
+ method @Nullable public String getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbAccessory> CREATOR;
}
@@ -17455,10 +17454,10 @@ package android.hardware.usb {
public class UsbConfiguration implements android.os.Parcelable {
method public int describeContents();
method public int getId();
- method public android.hardware.usb.UsbInterface getInterface(int);
+ method @NonNull public android.hardware.usb.UsbInterface getInterface(int);
method public int getInterfaceCount();
method public int getMaxPower();
- method public java.lang.String getName();
+ method @Nullable public String getName();
method public boolean isRemoteWakeup();
method public boolean isSelfPowered();
method public void writeToParcel(android.os.Parcel, int);
@@ -17504,23 +17503,23 @@ package android.hardware.usb {
public class UsbDevice implements android.os.Parcelable {
method public int describeContents();
- method public android.hardware.usb.UsbConfiguration getConfiguration(int);
+ method @NonNull public android.hardware.usb.UsbConfiguration getConfiguration(int);
method public int getConfigurationCount();
method public int getDeviceClass();
method public int getDeviceId();
- method public static int getDeviceId(java.lang.String);
- method public java.lang.String getDeviceName();
- method public static java.lang.String getDeviceName(int);
+ method public static int getDeviceId(String);
+ method @NonNull public String getDeviceName();
+ method public static String getDeviceName(int);
method public int getDeviceProtocol();
method public int getDeviceSubclass();
- method public android.hardware.usb.UsbInterface getInterface(int);
+ method @NonNull public android.hardware.usb.UsbInterface getInterface(int);
method public int getInterfaceCount();
- method public java.lang.String getManufacturerName();
+ method @Nullable public String getManufacturerName();
method public int getProductId();
- method public java.lang.String getProductName();
- method public java.lang.String getSerialNumber();
+ method @Nullable public String getProductName();
+ method @Nullable public String getSerialNumber();
method public int getVendorId();
- method public java.lang.String getVersion();
+ method @NonNull public String getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbDevice> CREATOR;
}
@@ -17534,7 +17533,7 @@ package android.hardware.usb {
method public int controlTransfer(int, int, int, int, byte[], int, int, int);
method public int getFileDescriptor();
method public byte[] getRawDescriptors();
- method public java.lang.String getSerial();
+ method public String getSerial();
method public boolean releaseInterface(android.hardware.usb.UsbInterface);
method public android.hardware.usb.UsbRequest requestWait();
method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException;
@@ -17564,39 +17563,39 @@ package android.hardware.usb {
method public int getInterfaceClass();
method public int getInterfaceProtocol();
method public int getInterfaceSubclass();
- method public java.lang.String getName();
+ method @Nullable public String getName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbInterface> CREATOR;
}
public class UsbManager {
method public android.hardware.usb.UsbAccessory[] getAccessoryList();
- method public java.util.HashMap<java.lang.String, android.hardware.usb.UsbDevice> getDeviceList();
+ method public java.util.HashMap<java.lang.String,android.hardware.usb.UsbDevice> getDeviceList();
method public boolean hasPermission(android.hardware.usb.UsbDevice);
method public boolean hasPermission(android.hardware.usb.UsbAccessory);
method public android.os.ParcelFileDescriptor openAccessory(android.hardware.usb.UsbAccessory);
method public android.hardware.usb.UsbDeviceConnection openDevice(android.hardware.usb.UsbDevice);
method public void requestPermission(android.hardware.usb.UsbDevice, android.app.PendingIntent);
method public void requestPermission(android.hardware.usb.UsbAccessory, android.app.PendingIntent);
- field public static final java.lang.String ACTION_USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
- field public static final java.lang.String ACTION_USB_ACCESSORY_DETACHED = "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
- field public static final java.lang.String ACTION_USB_DEVICE_ATTACHED = "android.hardware.usb.action.USB_DEVICE_ATTACHED";
- field public static final java.lang.String ACTION_USB_DEVICE_DETACHED = "android.hardware.usb.action.USB_DEVICE_DETACHED";
- field public static final java.lang.String EXTRA_ACCESSORY = "accessory";
- field public static final java.lang.String EXTRA_DEVICE = "device";
- field public static final java.lang.String EXTRA_PERMISSION_GRANTED = "permission";
+ field public static final String ACTION_USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
+ field public static final String ACTION_USB_ACCESSORY_DETACHED = "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
+ field public static final String ACTION_USB_DEVICE_ATTACHED = "android.hardware.usb.action.USB_DEVICE_ATTACHED";
+ field public static final String ACTION_USB_DEVICE_DETACHED = "android.hardware.usb.action.USB_DEVICE_DETACHED";
+ field public static final String EXTRA_ACCESSORY = "accessory";
+ field public static final String EXTRA_DEVICE = "device";
+ field public static final String EXTRA_PERMISSION_GRANTED = "permission";
}
public class UsbRequest {
ctor public UsbRequest();
method public boolean cancel();
method public void close();
- method public java.lang.Object getClientData();
+ method public Object getClientData();
method public android.hardware.usb.UsbEndpoint getEndpoint();
method public boolean initialize(android.hardware.usb.UsbDeviceConnection, android.hardware.usb.UsbEndpoint);
- method public deprecated boolean queue(java.nio.ByteBuffer, int);
- method public boolean queue(java.nio.ByteBuffer);
- method public void setClientData(java.lang.Object);
+ method @Deprecated public boolean queue(java.nio.ByteBuffer, int);
+ method public boolean queue(@Nullable java.nio.ByteBuffer);
+ method public void setClientData(Object);
}
}
@@ -17605,47 +17604,47 @@ package android.icu.lang {
public final class UCharacter implements android.icu.lang.UCharacterEnums.ECharacterCategory android.icu.lang.UCharacterEnums.ECharacterDirection {
method public static int charCount(int);
- method public static int codePointAt(java.lang.CharSequence, int);
+ method public static int codePointAt(CharSequence, int);
method public static int codePointAt(char[], int);
method public static int codePointAt(char[], int, int);
- method public static int codePointBefore(java.lang.CharSequence, int);
+ method public static int codePointBefore(CharSequence, int);
method public static int codePointBefore(char[], int);
method public static int codePointBefore(char[], int, int);
- method public static int codePointCount(java.lang.CharSequence, int, int);
+ method public static int codePointCount(CharSequence, int, int);
method public static int codePointCount(char[], int, int);
method public static int digit(int, int);
method public static int digit(int);
method public static int foldCase(int, boolean);
- method public static java.lang.String foldCase(java.lang.String, boolean);
+ method public static String foldCase(String, boolean);
method public static int foldCase(int, int);
- method public static java.lang.String foldCase(java.lang.String, int);
+ method public static String foldCase(String, int);
method public static char forDigit(int, int);
method public static android.icu.util.VersionInfo getAge(int);
method public static int getBidiPairedBracket(int);
- method public static int getCharFromExtendedName(java.lang.String);
- method public static int getCharFromName(java.lang.String);
- method public static int getCharFromNameAlias(java.lang.String);
+ method public static int getCharFromExtendedName(String);
+ method public static int getCharFromName(String);
+ method public static int getCharFromNameAlias(String);
method public static int getCodePoint(char, char);
method public static int getCodePoint(char);
method public static int getCombiningClass(int);
method public static int getDirection(int);
method public static byte getDirectionality(int);
- method public static java.lang.String getExtendedName(int);
+ method public static String getExtendedName(int);
method public static android.icu.util.ValueIterator getExtendedNameIterator();
method public static int getHanNumericValue(int);
method public static int getIntPropertyMaxValue(int);
method public static int getIntPropertyMinValue(int);
method public static int getIntPropertyValue(int, int);
method public static int getMirror(int);
- method public static java.lang.String getName(int);
- method public static java.lang.String getName(java.lang.String, java.lang.String);
- method public static java.lang.String getNameAlias(int);
+ method public static String getName(int);
+ method public static String getName(String, String);
+ method public static String getNameAlias(int);
method public static android.icu.util.ValueIterator getNameIterator();
method public static int getNumericValue(int);
- method public static int getPropertyEnum(java.lang.CharSequence);
- method public static java.lang.String getPropertyName(int, int);
- method public static int getPropertyValueEnum(int, java.lang.CharSequence);
- method public static java.lang.String getPropertyValueName(int, int, int);
+ method public static int getPropertyEnum(CharSequence);
+ method public static String getPropertyName(int, int);
+ method public static int getPropertyValueEnum(int, CharSequence);
+ method public static String getPropertyValueName(int, int, int);
method public static int getType(int);
method public static android.icu.util.RangeValueIterator getTypeIterator();
method public static double getUnicodeNumericValue(int);
@@ -17661,7 +17660,7 @@ package android.icu.lang {
method public static boolean isJavaIdentifierPart(int);
method public static boolean isJavaIdentifierStart(int);
method public static boolean isLegal(int);
- method public static boolean isLegal(java.lang.String);
+ method public static boolean isLegal(String);
method public static boolean isLetter(int);
method public static boolean isLetterOrDigit(int);
method public static boolean isLowSurrogate(char);
@@ -17682,26 +17681,26 @@ package android.icu.lang {
method public static boolean isUpperCase(int);
method public static boolean isValidCodePoint(int);
method public static boolean isWhitespace(int);
- method public static int offsetByCodePoints(java.lang.CharSequence, int, int);
+ method public static int offsetByCodePoints(CharSequence, int, int);
method public static int offsetByCodePoints(char[], int, int, int, int);
method public static int toChars(int, char[], int);
method public static char[] toChars(int);
method public static int toCodePoint(char, char);
method public static int toLowerCase(int);
- method public static java.lang.String toLowerCase(java.lang.String);
- method public static java.lang.String toLowerCase(java.util.Locale, java.lang.String);
- method public static java.lang.String toLowerCase(android.icu.util.ULocale, java.lang.String);
- method public static java.lang.String toString(int);
+ method public static String toLowerCase(String);
+ method public static String toLowerCase(java.util.Locale, String);
+ method public static String toLowerCase(android.icu.util.ULocale, String);
+ method public static String toString(int);
method public static int toTitleCase(int);
- method public static java.lang.String toTitleCase(java.lang.String, android.icu.text.BreakIterator);
- method public static java.lang.String toTitleCase(java.util.Locale, java.lang.String, android.icu.text.BreakIterator);
- method public static java.lang.String toTitleCase(android.icu.util.ULocale, java.lang.String, android.icu.text.BreakIterator);
- method public static java.lang.String toTitleCase(android.icu.util.ULocale, java.lang.String, android.icu.text.BreakIterator, int);
- method public static java.lang.String toTitleCase(java.util.Locale, java.lang.String, android.icu.text.BreakIterator, int);
+ method public static String toTitleCase(String, android.icu.text.BreakIterator);
+ method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator);
+ method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator);
+ method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator, int);
+ method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator, int);
method public static int toUpperCase(int);
- method public static java.lang.String toUpperCase(java.lang.String);
- method public static java.lang.String toUpperCase(java.util.Locale, java.lang.String);
- method public static java.lang.String toUpperCase(android.icu.util.ULocale, java.lang.String);
+ method public static String toUpperCase(String);
+ method public static String toUpperCase(java.util.Locale, String);
+ method public static String toUpperCase(android.icu.util.ULocale, String);
field public static final int FOLD_CASE_DEFAULT = 0; // 0x0
field public static final int FOLD_CASE_EXCLUDE_SPECIAL_I = 1; // 0x1
field public static final int MAX_CODE_POINT = 1114111; // 0x10ffff
@@ -17724,13 +17723,13 @@ package android.icu.lang {
field public static final int TITLECASE_NO_LOWERCASE = 256; // 0x100
}
- public static abstract interface UCharacter.BidiPairedBracketType {
+ public static interface UCharacter.BidiPairedBracketType {
field public static final int CLOSE = 2; // 0x2
field public static final int NONE = 0; // 0x0
field public static final int OPEN = 1; // 0x1
}
- public static abstract interface UCharacter.DecompositionType {
+ public static interface UCharacter.DecompositionType {
field public static final int CANONICAL = 1; // 0x1
field public static final int CIRCLE = 3; // 0x3
field public static final int COMPAT = 2; // 0x2
@@ -17751,7 +17750,7 @@ package android.icu.lang {
field public static final int WIDE = 17; // 0x11
}
- public static abstract interface UCharacter.EastAsianWidth {
+ public static interface UCharacter.EastAsianWidth {
field public static final int AMBIGUOUS = 1; // 0x1
field public static final int FULLWIDTH = 3; // 0x3
field public static final int HALFWIDTH = 2; // 0x2
@@ -17760,7 +17759,7 @@ package android.icu.lang {
field public static final int WIDE = 5; // 0x5
}
- public static abstract interface UCharacter.GraphemeClusterBreak {
+ public static interface UCharacter.GraphemeClusterBreak {
field public static final int CONTROL = 1; // 0x1
field public static final int CR = 2; // 0x2
field public static final int EXTEND = 3; // 0x3
@@ -17781,7 +17780,7 @@ package android.icu.lang {
field public static final int ZWJ = 17; // 0x11
}
- public static abstract interface UCharacter.HangulSyllableType {
+ public static interface UCharacter.HangulSyllableType {
field public static final int LEADING_JAMO = 1; // 0x1
field public static final int LVT_SYLLABLE = 5; // 0x5
field public static final int LV_SYLLABLE = 4; // 0x4
@@ -17790,7 +17789,7 @@ package android.icu.lang {
field public static final int VOWEL_JAMO = 2; // 0x2
}
- public static abstract interface UCharacter.IndicPositionalCategory {
+ public static interface UCharacter.IndicPositionalCategory {
field public static final int BOTTOM = 1; // 0x1
field public static final int BOTTOM_AND_LEFT = 2; // 0x2
field public static final int BOTTOM_AND_RIGHT = 3; // 0x3
@@ -17808,7 +17807,7 @@ package android.icu.lang {
field public static final int VISUAL_ORDER_LEFT = 14; // 0xe
}
- public static abstract interface UCharacter.IndicSyllabicCategory {
+ public static interface UCharacter.IndicSyllabicCategory {
field public static final int AVAGRAHA = 1; // 0x1
field public static final int BINDU = 2; // 0x2
field public static final int BRAHMI_JOINING_NUMBER = 3; // 0x3
@@ -17847,7 +17846,7 @@ package android.icu.lang {
field public static final int VOWEL_INDEPENDENT = 35; // 0x23
}
- public static abstract interface UCharacter.JoiningGroup {
+ public static interface UCharacter.JoiningGroup {
field public static final int AFRICAN_FEH = 86; // 0x56
field public static final int AFRICAN_NOON = 87; // 0x57
field public static final int AFRICAN_QAF = 88; // 0x58
@@ -17953,7 +17952,7 @@ package android.icu.lang {
field public static final int ZHAIN = 53; // 0x35
}
- public static abstract interface UCharacter.JoiningType {
+ public static interface UCharacter.JoiningType {
field public static final int DUAL_JOINING = 2; // 0x2
field public static final int JOIN_CAUSING = 1; // 0x1
field public static final int LEFT_JOINING = 3; // 0x3
@@ -17962,7 +17961,7 @@ package android.icu.lang {
field public static final int TRANSPARENT = 5; // 0x5
}
- public static abstract interface UCharacter.LineBreak {
+ public static interface UCharacter.LineBreak {
field public static final int ALPHABETIC = 2; // 0x2
field public static final int AMBIGUOUS = 1; // 0x1
field public static final int BREAK_AFTER = 4; // 0x4
@@ -18009,14 +18008,14 @@ package android.icu.lang {
field public static final int ZWSPACE = 28; // 0x1c
}
- public static abstract interface UCharacter.NumericType {
+ public static interface UCharacter.NumericType {
field public static final int DECIMAL = 1; // 0x1
field public static final int DIGIT = 2; // 0x2
field public static final int NONE = 0; // 0x0
field public static final int NUMERIC = 3; // 0x3
}
- public static abstract interface UCharacter.SentenceBreak {
+ public static interface UCharacter.SentenceBreak {
field public static final int ATERM = 1; // 0x1
field public static final int CLOSE = 2; // 0x2
field public static final int CR = 11; // 0xb
@@ -18035,7 +18034,7 @@ package android.icu.lang {
}
public static final class UCharacter.UnicodeBlock extends java.lang.Character.Subset {
- method public static android.icu.lang.UCharacter.UnicodeBlock forName(java.lang.String);
+ method public static android.icu.lang.UCharacter.UnicodeBlock forName(String);
method public int getID();
method public static android.icu.lang.UCharacter.UnicodeBlock getInstance(int);
method public static android.icu.lang.UCharacter.UnicodeBlock of(int);
@@ -18630,14 +18629,14 @@ package android.icu.lang {
field public static final int ZANABAZAR_SQUARE_ID = 280; // 0x118
}
- public static abstract interface UCharacter.VerticalOrientation {
+ public static interface UCharacter.VerticalOrientation {
field public static final int ROTATED = 0; // 0x0
field public static final int TRANSFORMED_ROTATED = 1; // 0x1
field public static final int TRANSFORMED_UPRIGHT = 2; // 0x2
field public static final int UPRIGHT = 3; // 0x3
}
- public static abstract interface UCharacter.WordBreak {
+ public static interface UCharacter.WordBreak {
field public static final int ALETTER = 1; // 0x1
field public static final int CR = 8; // 0x8
field public static final int DOUBLE_QUOTE = 16; // 0x10
@@ -18664,17 +18663,17 @@ package android.icu.lang {
}
public final class UCharacterCategory implements android.icu.lang.UCharacterEnums.ECharacterCategory {
- method public static java.lang.String toString(int);
+ method public static String toString(int);
}
public final class UCharacterDirection implements android.icu.lang.UCharacterEnums.ECharacterDirection {
- method public static java.lang.String toString(int);
+ method public static String toString(int);
}
public class UCharacterEnums {
}
- public static abstract interface UCharacterEnums.ECharacterCategory {
+ public static interface UCharacterEnums.ECharacterCategory {
field public static final byte COMBINING_SPACING_MARK = 8; // 0x8
field public static final byte CONNECTOR_PUNCTUATION = 22; // 0x16
field public static final byte CONTROL = 15; // 0xf
@@ -18710,7 +18709,7 @@ package android.icu.lang {
field public static final byte UPPERCASE_LETTER = 1; // 0x1
}
- public static abstract interface UCharacterEnums.ECharacterDirection {
+ public static interface UCharacterEnums.ECharacterDirection {
field public static final int ARABIC_NUMBER = 5; // 0x5
field public static final int BLOCK_SEPARATOR = 7; // 0x7
field public static final int BOUNDARY_NEUTRAL = 18; // 0x12
@@ -18756,7 +18755,7 @@ package android.icu.lang {
field public static final int WHITE_SPACE_NEUTRAL = 9; // 0x9
}
- public abstract interface UProperty {
+ public interface UProperty {
field public static final int AGE = 16384; // 0x4000
field public static final int ALPHABETIC = 0; // 0x0
field public static final int ASCII_HEX_DIGIT = 1; // 0x1
@@ -18870,7 +18869,7 @@ package android.icu.lang {
field public static final int XID_START = 33; // 0x21
}
- public static abstract interface UProperty.NameChoice {
+ public static interface UProperty.NameChoice {
field public static final int LONG = 1; // 0x1
field public static final int SHORT = 0; // 0x0
}
@@ -18879,13 +18878,13 @@ package android.icu.lang {
method public static boolean breaksBetweenLetters(int);
method public static int[] getCode(java.util.Locale);
method public static int[] getCode(android.icu.util.ULocale);
- method public static int[] getCode(java.lang.String);
- method public static int getCodeFromName(java.lang.String);
- method public static java.lang.String getName(int);
- method public static java.lang.String getSampleString(int);
+ method public static int[] getCode(String);
+ method public static int getCodeFromName(String);
+ method public static String getName(int);
+ method public static String getSampleString(int);
method public static int getScript(int);
method public static int getScriptExtensions(int, java.util.BitSet);
- method public static java.lang.String getShortName(int);
+ method public static String getShortName(int);
method public static android.icu.lang.UScript.ScriptUsage getUsage(int);
method public static boolean hasScript(int, int);
method public static boolean isCased(int);
@@ -19083,9 +19082,7 @@ package android.icu.lang {
field public static final int ZANABAZAR_SQUARE = 177; // 0xb1
}
- public static final class UScript.ScriptUsage extends java.lang.Enum {
- method public static android.icu.lang.UScript.ScriptUsage valueOf(java.lang.String);
- method public static final android.icu.lang.UScript.ScriptUsage[] values();
+ public enum UScript.ScriptUsage {
enum_constant public static final android.icu.lang.UScript.ScriptUsage ASPIRATIONAL;
enum_constant public static final android.icu.lang.UScript.ScriptUsage EXCLUDED;
enum_constant public static final android.icu.lang.UScript.ScriptUsage LIMITED_USE;
@@ -19098,7 +19095,7 @@ package android.icu.lang {
package android.icu.math {
- public class BigDecimal extends java.lang.Number implements java.lang.Comparable java.io.Serializable {
+ public class BigDecimal extends java.lang.Number implements java.lang.Comparable<android.icu.math.BigDecimal> java.io.Serializable {
ctor public BigDecimal(java.math.BigDecimal);
ctor public BigDecimal(java.math.BigInteger);
ctor public BigDecimal(java.math.BigInteger, int);
@@ -19107,7 +19104,7 @@ package android.icu.math {
ctor public BigDecimal(double);
ctor public BigDecimal(int);
ctor public BigDecimal(long);
- ctor public BigDecimal(java.lang.String);
+ ctor public BigDecimal(String);
method public android.icu.math.BigDecimal abs();
method public android.icu.math.BigDecimal abs(android.icu.math.MathContext);
method public android.icu.math.BigDecimal add(android.icu.math.BigDecimal);
@@ -19123,8 +19120,8 @@ package android.icu.math {
method public android.icu.math.BigDecimal divideInteger(android.icu.math.BigDecimal, android.icu.math.MathContext);
method public double doubleValue();
method public float floatValue();
- method public java.lang.String format(int, int);
- method public java.lang.String format(int, int, int, int, int, int);
+ method public String format(int, int);
+ method public String format(int, int, int, int, int, int);
method public int intValue();
method public int intValueExact();
method public long longValue();
@@ -19200,71 +19197,69 @@ package android.icu.math {
package android.icu.text {
- public final class AlphabeticIndex<V> implements java.lang.Iterable {
+ public final class AlphabeticIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> {
ctor public AlphabeticIndex(android.icu.util.ULocale);
ctor public AlphabeticIndex(java.util.Locale);
ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator);
method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.text.UnicodeSet);
method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.util.ULocale...);
method public android.icu.text.AlphabeticIndex<V> addLabels(java.util.Locale...);
- method public android.icu.text.AlphabeticIndex<V> addRecord(java.lang.CharSequence, V);
+ method public android.icu.text.AlphabeticIndex<V> addRecord(CharSequence, V);
method public android.icu.text.AlphabeticIndex.ImmutableIndex<V> buildImmutableIndex();
method public android.icu.text.AlphabeticIndex<V> clearRecords();
method public int getBucketCount();
- method public int getBucketIndex(java.lang.CharSequence);
+ method public int getBucketIndex(CharSequence);
method public java.util.List<java.lang.String> getBucketLabels();
method public android.icu.text.RuleBasedCollator getCollator();
- method public java.lang.String getInflowLabel();
+ method public String getInflowLabel();
method public int getMaxLabelCount();
- method public java.lang.String getOverflowLabel();
+ method public String getOverflowLabel();
method public int getRecordCount();
- method public java.lang.String getUnderflowLabel();
+ method public String getUnderflowLabel();
method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
- method public android.icu.text.AlphabeticIndex<V> setInflowLabel(java.lang.String);
+ method public android.icu.text.AlphabeticIndex<V> setInflowLabel(String);
method public android.icu.text.AlphabeticIndex<V> setMaxLabelCount(int);
- method public android.icu.text.AlphabeticIndex<V> setOverflowLabel(java.lang.String);
- method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String);
+ method public android.icu.text.AlphabeticIndex<V> setOverflowLabel(String);
+ method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(String);
}
- public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable {
- method public java.lang.String getLabel();
+ public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Record<V>> {
+ method public String getLabel();
method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType();
method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator();
method public int size();
}
- public static final class AlphabeticIndex.Bucket.LabelType extends java.lang.Enum {
- method public static android.icu.text.AlphabeticIndex.Bucket.LabelType valueOf(java.lang.String);
- method public static final android.icu.text.AlphabeticIndex.Bucket.LabelType[] values();
+ public enum AlphabeticIndex.Bucket.LabelType {
enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType INFLOW;
enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType NORMAL;
enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType OVERFLOW;
enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW;
}
- public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable {
+ public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> {
method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int);
method public int getBucketCount();
- method public int getBucketIndex(java.lang.CharSequence);
+ method public int getBucketIndex(CharSequence);
method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
}
public static class AlphabeticIndex.Record<V> {
method public V getData();
- method public java.lang.CharSequence getName();
+ method public CharSequence getName();
}
public class Bidi {
ctor public Bidi();
ctor public Bidi(int, int);
- ctor public Bidi(java.lang.String, int);
+ ctor public Bidi(String, int);
ctor public Bidi(java.text.AttributedCharacterIterator);
ctor public Bidi(char[], int, byte[], int, int, int);
method public boolean baseIsLeftToRight();
method public int countParagraphs();
method public int countRuns();
method public android.icu.text.Bidi createLineBidi(int, int);
- method public static byte getBaseDirection(java.lang.CharSequence);
+ method public static byte getBaseDirection(CharSequence);
method public int getBaseLevel();
method public android.icu.text.BidiClassifier getCustomClassifier();
method public int getCustomizedClass(int);
@@ -19288,7 +19283,7 @@ package android.icu.text {
method public int getRunLimit(int);
method public int getRunStart(int);
method public char[] getText();
- method public java.lang.String getTextAsString();
+ method public String getTextAsString();
method public int getVisualIndex(int);
method public int[] getVisualMap();
method public android.icu.text.BidiRun getVisualRun(int);
@@ -19301,19 +19296,19 @@ package android.icu.text {
method public void orderParagraphsLTR(boolean);
method public static int[] reorderLogical(byte[]);
method public static int[] reorderVisual(byte[]);
- method public static void reorderVisually(byte[], int, java.lang.Object[], int, int);
+ method public static void reorderVisually(byte[], int, Object[], int, int);
method public static boolean requiresBidi(char[], int, int);
- method public void setContext(java.lang.String, java.lang.String);
+ method public void setContext(String, String);
method public void setCustomClassifier(android.icu.text.BidiClassifier);
method public void setInverse(boolean);
method public android.icu.text.Bidi setLine(int, int);
- method public void setPara(java.lang.String, byte, byte[]);
+ method public void setPara(String, byte, byte[]);
method public void setPara(char[], byte, byte[]);
method public void setPara(java.text.AttributedCharacterIterator);
method public void setReorderingMode(int);
method public void setReorderingOptions(int);
- method public java.lang.String writeReordered(int);
- method public static java.lang.String writeReverse(java.lang.String, int);
+ method public String writeReordered(int);
+ method public static String writeReverse(String, int);
field public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = 126; // 0x7e
field public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = 127; // 0x7f
field public static final int DIRECTION_LEFT_TO_RIGHT = 0; // 0x0
@@ -19346,10 +19341,10 @@ package android.icu.text {
}
public class BidiClassifier {
- ctor public BidiClassifier(java.lang.Object);
+ ctor public BidiClassifier(Object);
method public int classify(int);
- method public java.lang.Object getContext();
- method public void setContext(java.lang.Object);
+ method public Object getContext();
+ method public void setContext(Object);
}
public class BidiRun {
@@ -19364,11 +19359,11 @@ package android.icu.text {
public abstract class BreakIterator implements java.lang.Cloneable {
ctor protected BreakIterator();
- method public java.lang.Object clone();
+ method public Object clone();
method public abstract int current();
method public abstract int first();
method public abstract int following(int);
- method public static synchronized java.util.Locale[] getAvailableLocales();
+ method public static java.util.Locale[] getAvailableLocales();
method public static android.icu.text.BreakIterator getCharacterInstance();
method public static android.icu.text.BreakIterator getCharacterInstance(java.util.Locale);
method public static android.icu.text.BreakIterator getCharacterInstance(android.icu.util.ULocale);
@@ -19393,8 +19388,8 @@ package android.icu.text {
method public abstract int next();
method public int preceding(int);
method public abstract int previous();
- method public void setText(java.lang.String);
- method public void setText(java.lang.CharSequence);
+ method public void setText(String);
+ method public void setText(CharSequence);
method public abstract void setText(java.text.CharacterIterator);
field public static final int DONE = -1; // 0xffffffff
field public static final int KIND_CHARACTER = 0; // 0x0
@@ -19423,22 +19418,22 @@ package android.icu.text {
}
public static final class CaseMap.Fold extends android.icu.text.CaseMap {
- method public java.lang.String apply(java.lang.CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.lang.CharSequence, A, android.icu.text.Edits);
+ method public String apply(CharSequence);
+ method public <A extends java.lang.Appendable> A apply(CharSequence, A, android.icu.text.Edits);
method public android.icu.text.CaseMap.Fold omitUnchangedText();
method public android.icu.text.CaseMap.Fold turkic();
}
public static final class CaseMap.Lower extends android.icu.text.CaseMap {
- method public java.lang.String apply(java.util.Locale, java.lang.CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, java.lang.CharSequence, A, android.icu.text.Edits);
+ method public String apply(java.util.Locale, CharSequence);
+ method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits);
method public android.icu.text.CaseMap.Lower omitUnchangedText();
}
public static final class CaseMap.Title extends android.icu.text.CaseMap {
method public android.icu.text.CaseMap.Title adjustToCased();
- method public java.lang.String apply(java.util.Locale, android.icu.text.BreakIterator, java.lang.CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, android.icu.text.BreakIterator, java.lang.CharSequence, A, android.icu.text.Edits);
+ method public String apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence);
+ method public <A extends java.lang.Appendable> A apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence, A, android.icu.text.Edits);
method public android.icu.text.CaseMap.Title noBreakAdjustment();
method public android.icu.text.CaseMap.Title noLowercase();
method public android.icu.text.CaseMap.Title omitUnchangedText();
@@ -19447,8 +19442,8 @@ package android.icu.text {
}
public static final class CaseMap.Upper extends android.icu.text.CaseMap {
- method public java.lang.String apply(java.util.Locale, java.lang.CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, java.lang.CharSequence, A, android.icu.text.Edits);
+ method public String apply(java.util.Locale, CharSequence);
+ method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits);
method public android.icu.text.CaseMap.Upper omitUnchangedText();
}
@@ -19461,7 +19456,7 @@ package android.icu.text {
method public void reset();
method public static int secondaryOrder(int);
method public void setOffset(int);
- method public void setText(java.lang.String);
+ method public void setText(String);
method public void setText(android.icu.text.UCharacterIterator);
method public void setText(java.text.CharacterIterator);
method public static int tertiaryOrder(int);
@@ -19469,12 +19464,12 @@ package android.icu.text {
field public static final int NULLORDER = -1; // 0xffffffff
}
- public final class CollationKey implements java.lang.Comparable {
- ctor public CollationKey(java.lang.String, byte[]);
+ public final class CollationKey implements java.lang.Comparable<android.icu.text.CollationKey> {
+ ctor public CollationKey(String, byte[]);
method public int compareTo(android.icu.text.CollationKey);
method public boolean equals(android.icu.text.CollationKey);
method public android.icu.text.CollationKey getBound(int, int);
- method public java.lang.String getSourceString();
+ method public String getSourceString();
method public android.icu.text.CollationKey merge(android.icu.text.CollationKey);
method public byte[] toByteArray();
}
@@ -19485,31 +19480,31 @@ package android.icu.text {
field public static final int UPPER_LONG = 2; // 0x2
}
- public abstract class Collator implements java.lang.Cloneable java.util.Comparator android.icu.util.Freezable {
+ public abstract class Collator implements java.lang.Cloneable java.util.Comparator<java.lang.Object> android.icu.util.Freezable<android.icu.text.Collator> {
ctor protected Collator();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
method public android.icu.text.Collator cloneAsThawed();
- method public abstract int compare(java.lang.String, java.lang.String);
- method public int compare(java.lang.Object, java.lang.Object);
- method public boolean equals(java.lang.String, java.lang.String);
+ method public abstract int compare(String, String);
+ method public int compare(Object, Object);
+ method public boolean equals(String, String);
method public android.icu.text.Collator freeze();
method public static java.util.Locale[] getAvailableLocales();
method public static final android.icu.util.ULocale[] getAvailableULocales();
- method public abstract android.icu.text.CollationKey getCollationKey(java.lang.String);
+ method public abstract android.icu.text.CollationKey getCollationKey(String);
method public int getDecomposition();
- method public static java.lang.String getDisplayName(java.util.Locale, java.util.Locale);
- method public static java.lang.String getDisplayName(android.icu.util.ULocale, android.icu.util.ULocale);
- method public static java.lang.String getDisplayName(java.util.Locale);
- method public static java.lang.String getDisplayName(android.icu.util.ULocale);
+ method public static String getDisplayName(java.util.Locale, java.util.Locale);
+ method public static String getDisplayName(android.icu.util.ULocale, android.icu.util.ULocale);
+ method public static String getDisplayName(java.util.Locale);
+ method public static String getDisplayName(android.icu.util.ULocale);
method public static int[] getEquivalentReorderCodes(int);
- method public static final android.icu.util.ULocale getFunctionalEquivalent(java.lang.String, android.icu.util.ULocale, boolean[]);
- method public static final android.icu.util.ULocale getFunctionalEquivalent(java.lang.String, android.icu.util.ULocale);
+ method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale, boolean[]);
+ method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale);
method public static final android.icu.text.Collator getInstance();
method public static final android.icu.text.Collator getInstance(android.icu.util.ULocale);
method public static final android.icu.text.Collator getInstance(java.util.Locale);
- method public static final java.lang.String[] getKeywordValues(java.lang.String);
- method public static final java.lang.String[] getKeywordValuesForLocale(java.lang.String, android.icu.util.ULocale, boolean);
- method public static final java.lang.String[] getKeywords();
+ method public static final String[] getKeywordValues(String);
+ method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
+ method public static final String[] getKeywords();
method public int getMaxVariable();
method public int[] getReorderCodes();
method public int getStrength();
@@ -19532,7 +19527,7 @@ package android.icu.text {
field public static final int TERTIARY = 2; // 0x2
}
- public static abstract interface Collator.ReorderCodes {
+ public static interface Collator.ReorderCodes {
field public static final int CURRENCY = 4099; // 0x1003
field public static final int DEFAULT = -1; // 0xffffffff
field public static final int DIGIT = 4100; // 0x1004
@@ -19549,9 +19544,7 @@ package android.icu.text {
method public static android.icu.text.CompactDecimalFormat getInstance(java.util.Locale, android.icu.text.CompactDecimalFormat.CompactStyle);
}
- public static final class CompactDecimalFormat.CompactStyle extends java.lang.Enum {
- method public static android.icu.text.CompactDecimalFormat.CompactStyle valueOf(java.lang.String);
- method public static final android.icu.text.CompactDecimalFormat.CompactStyle[] values();
+ public enum CompactDecimalFormat.CompactStyle {
enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle LONG;
enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle SHORT;
}
@@ -19560,24 +19553,24 @@ package android.icu.text {
ctor public CurrencyPluralInfo();
ctor public CurrencyPluralInfo(java.util.Locale);
ctor public CurrencyPluralInfo(android.icu.util.ULocale);
- method public java.lang.Object clone();
- method public java.lang.String getCurrencyPluralPattern(java.lang.String);
+ method public Object clone();
+ method public String getCurrencyPluralPattern(String);
method public static android.icu.text.CurrencyPluralInfo getInstance();
method public static android.icu.text.CurrencyPluralInfo getInstance(java.util.Locale);
method public static android.icu.text.CurrencyPluralInfo getInstance(android.icu.util.ULocale);
method public android.icu.util.ULocale getLocale();
method public android.icu.text.PluralRules getPluralRules();
- method public void setCurrencyPluralPattern(java.lang.String, java.lang.String);
+ method public void setCurrencyPluralPattern(String, String);
method public void setLocale(android.icu.util.ULocale);
- method public void setPluralRules(java.lang.String);
+ method public void setPluralRules(String);
}
public abstract class DateFormat extends android.icu.text.UFormat {
ctor protected DateFormat();
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(java.util.Date, java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.String format(java.util.Date);
+ method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public abstract StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition);
+ method public final String format(java.util.Date);
method public static java.util.Locale[] getAvailableLocales();
method public boolean getBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute);
method public android.icu.util.Calendar getCalendar();
@@ -19599,17 +19592,17 @@ package android.icu.text {
method public static final android.icu.text.DateFormat getInstance();
method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar, java.util.Locale);
method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(java.lang.String);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(java.lang.String, java.util.Locale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(java.lang.String, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, java.lang.String, java.util.Locale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, java.lang.String, android.icu.util.ULocale);
+ method public static final android.icu.text.DateFormat getInstanceForSkeleton(String);
+ method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, java.util.Locale);
+ method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, android.icu.util.ULocale);
+ method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, java.util.Locale);
+ method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, android.icu.util.ULocale);
method public android.icu.text.NumberFormat getNumberFormat();
- method public static final android.icu.text.DateFormat getPatternInstance(java.lang.String);
- method public static final android.icu.text.DateFormat getPatternInstance(java.lang.String, java.util.Locale);
- method public static final android.icu.text.DateFormat getPatternInstance(java.lang.String, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, java.lang.String, java.util.Locale);
- method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, java.lang.String, android.icu.util.ULocale);
+ method public static final android.icu.text.DateFormat getPatternInstance(String);
+ method public static final android.icu.text.DateFormat getPatternInstance(String, java.util.Locale);
+ method public static final android.icu.text.DateFormat getPatternInstance(String, android.icu.util.ULocale);
+ method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, java.util.Locale);
+ method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, android.icu.util.ULocale);
method public static final android.icu.text.DateFormat getTimeInstance();
method public static final android.icu.text.DateFormat getTimeInstance(int);
method public static final android.icu.text.DateFormat getTimeInstance(int, java.util.Locale);
@@ -19620,10 +19613,10 @@ package android.icu.text {
method public android.icu.util.TimeZone getTimeZone();
method public boolean isCalendarLenient();
method public boolean isLenient();
- method public java.util.Date parse(java.lang.String) throws java.text.ParseException;
- method public abstract void parse(java.lang.String, android.icu.util.Calendar, java.text.ParsePosition);
- method public java.util.Date parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
+ method public java.util.Date parse(String) throws java.text.ParseException;
+ method public abstract void parse(String, android.icu.util.Calendar, java.text.ParsePosition);
+ method public java.util.Date parse(String, java.text.ParsePosition);
+ method public Object parseObject(String, java.text.ParsePosition);
method public android.icu.text.DateFormat setBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute, boolean);
method public void setCalendar(android.icu.util.Calendar);
method public void setCalendarLenient(boolean);
@@ -19631,18 +19624,18 @@ package android.icu.text {
method public void setLenient(boolean);
method public void setNumberFormat(android.icu.text.NumberFormat);
method public void setTimeZone(android.icu.util.TimeZone);
- field public static final java.lang.String ABBR_GENERIC_TZ = "v";
- field public static final java.lang.String ABBR_MONTH = "MMM";
- field public static final java.lang.String ABBR_MONTH_DAY = "MMMd";
- field public static final java.lang.String ABBR_MONTH_WEEKDAY_DAY = "MMMEd";
- field public static final java.lang.String ABBR_QUARTER = "QQQ";
- field public static final java.lang.String ABBR_SPECIFIC_TZ = "z";
- field public static final java.lang.String ABBR_UTC_TZ = "ZZZZ";
- field public static final java.lang.String ABBR_WEEKDAY = "E";
+ field public static final String ABBR_GENERIC_TZ = "v";
+ field public static final String ABBR_MONTH = "MMM";
+ field public static final String ABBR_MONTH_DAY = "MMMd";
+ field public static final String ABBR_MONTH_WEEKDAY_DAY = "MMMEd";
+ field public static final String ABBR_QUARTER = "QQQ";
+ field public static final String ABBR_SPECIFIC_TZ = "z";
+ field public static final String ABBR_UTC_TZ = "ZZZZ";
+ field public static final String ABBR_WEEKDAY = "E";
field public static final int AM_PM_FIELD = 14; // 0xe
field public static final int AM_PM_MIDNIGHT_NOON_FIELD = 35; // 0x23
field public static final int DATE_FIELD = 3; // 0x3
- field public static final java.lang.String DAY = "d";
+ field public static final String DAY = "d";
field public static final int DAY_OF_WEEK_FIELD = 9; // 0x9
field public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11; // 0xb
field public static final int DAY_OF_YEAR_FIELD = 10; // 0xa
@@ -19653,35 +19646,35 @@ package android.icu.text {
field public static final int FLEXIBLE_DAY_PERIOD_FIELD = 36; // 0x24
field public static final int FRACTIONAL_SECOND_FIELD = 8; // 0x8
field public static final int FULL = 0; // 0x0
- field public static final java.lang.String GENERIC_TZ = "vvvv";
- field public static final java.lang.String HOUR = "j";
+ field public static final String GENERIC_TZ = "vvvv";
+ field public static final String HOUR = "j";
field public static final int HOUR0_FIELD = 16; // 0x10
field public static final int HOUR1_FIELD = 15; // 0xf
- field public static final java.lang.String HOUR24 = "H";
- field public static final java.lang.String HOUR24_MINUTE = "Hm";
- field public static final java.lang.String HOUR24_MINUTE_SECOND = "Hms";
- field public static final java.lang.String HOUR_MINUTE = "jm";
- field public static final java.lang.String HOUR_MINUTE_SECOND = "jms";
+ field public static final String HOUR24 = "H";
+ field public static final String HOUR24_MINUTE = "Hm";
+ field public static final String HOUR24_MINUTE_SECOND = "Hms";
+ field public static final String HOUR_MINUTE = "jm";
+ field public static final String HOUR_MINUTE_SECOND = "jms";
field public static final int HOUR_OF_DAY0_FIELD = 5; // 0x5
field public static final int HOUR_OF_DAY1_FIELD = 4; // 0x4
field public static final int JULIAN_DAY_FIELD = 21; // 0x15
- field public static final java.lang.String LOCATION_TZ = "VVVV";
+ field public static final String LOCATION_TZ = "VVVV";
field public static final int LONG = 1; // 0x1
field public static final int MEDIUM = 2; // 0x2
field public static final int MILLISECONDS_IN_DAY_FIELD = 22; // 0x16
field public static final int MILLISECOND_FIELD = 8; // 0x8
- field public static final java.lang.String MINUTE = "m";
+ field public static final String MINUTE = "m";
field public static final int MINUTE_FIELD = 6; // 0x6
- field public static final java.lang.String MINUTE_SECOND = "ms";
- field public static final java.lang.String MONTH = "MMMM";
- field public static final java.lang.String MONTH_DAY = "MMMMd";
+ field public static final String MINUTE_SECOND = "ms";
+ field public static final String MONTH = "MMMM";
+ field public static final String MONTH_DAY = "MMMMd";
field public static final int MONTH_FIELD = 2; // 0x2
- field public static final java.lang.String MONTH_WEEKDAY_DAY = "MMMMEEEEd";
+ field public static final String MONTH_WEEKDAY_DAY = "MMMMEEEEd";
field public static final int NONE = -1; // 0xffffffff
- field public static final java.lang.String NUM_MONTH = "M";
- field public static final java.lang.String NUM_MONTH_DAY = "Md";
- field public static final java.lang.String NUM_MONTH_WEEKDAY_DAY = "MEd";
- field public static final java.lang.String QUARTER = "QQQQ";
+ field public static final String NUM_MONTH = "M";
+ field public static final String NUM_MONTH_DAY = "Md";
+ field public static final String NUM_MONTH_WEEKDAY_DAY = "MEd";
+ field public static final String QUARTER = "QQQQ";
field public static final int QUARTER_FIELD = 27; // 0x1b
field public static final int RELATIVE = 128; // 0x80
field public static final int RELATIVE_DEFAULT = 130; // 0x82
@@ -19689,10 +19682,10 @@ package android.icu.text {
field public static final int RELATIVE_LONG = 129; // 0x81
field public static final int RELATIVE_MEDIUM = 130; // 0x82
field public static final int RELATIVE_SHORT = 131; // 0x83
- field public static final java.lang.String SECOND = "s";
+ field public static final String SECOND = "s";
field public static final int SECOND_FIELD = 7; // 0x7
field public static final int SHORT = 3; // 0x3
- field public static final java.lang.String SPECIFIC_TZ = "zzzz";
+ field public static final String SPECIFIC_TZ = "zzzz";
field public static final int STANDALONE_DAY_FIELD = 25; // 0x19
field public static final int STANDALONE_MONTH_FIELD = 26; // 0x1a
field public static final int STANDALONE_QUARTER_FIELD = 28; // 0x1c
@@ -19703,31 +19696,29 @@ package android.icu.text {
field public static final int TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD = 31; // 0x1f
field public static final int TIMEZONE_RFC_FIELD = 23; // 0x17
field public static final int TIMEZONE_SPECIAL_FIELD = 29; // 0x1d
- field public static final java.lang.String WEEKDAY = "EEEE";
+ field public static final String WEEKDAY = "EEEE";
field public static final int WEEK_OF_MONTH_FIELD = 13; // 0xd
field public static final int WEEK_OF_YEAR_FIELD = 12; // 0xc
- field public static final java.lang.String YEAR = "y";
- field public static final java.lang.String YEAR_ABBR_MONTH = "yMMM";
- field public static final java.lang.String YEAR_ABBR_MONTH_DAY = "yMMMd";
- field public static final java.lang.String YEAR_ABBR_MONTH_WEEKDAY_DAY = "yMMMEd";
- field public static final java.lang.String YEAR_ABBR_QUARTER = "yQQQ";
+ field public static final String YEAR = "y";
+ field public static final String YEAR_ABBR_MONTH = "yMMM";
+ field public static final String YEAR_ABBR_MONTH_DAY = "yMMMd";
+ field public static final String YEAR_ABBR_MONTH_WEEKDAY_DAY = "yMMMEd";
+ field public static final String YEAR_ABBR_QUARTER = "yQQQ";
field public static final int YEAR_FIELD = 1; // 0x1
- field public static final java.lang.String YEAR_MONTH = "yMMMM";
- field public static final java.lang.String YEAR_MONTH_DAY = "yMMMMd";
- field public static final java.lang.String YEAR_MONTH_WEEKDAY_DAY = "yMMMMEEEEd";
+ field public static final String YEAR_MONTH = "yMMMM";
+ field public static final String YEAR_MONTH_DAY = "yMMMMd";
+ field public static final String YEAR_MONTH_WEEKDAY_DAY = "yMMMMEEEEd";
field public static final int YEAR_NAME_FIELD = 30; // 0x1e
- field public static final java.lang.String YEAR_NUM_MONTH = "yM";
- field public static final java.lang.String YEAR_NUM_MONTH_DAY = "yMd";
- field public static final java.lang.String YEAR_NUM_MONTH_WEEKDAY_DAY = "yMEd";
- field public static final java.lang.String YEAR_QUARTER = "yQQQQ";
+ field public static final String YEAR_NUM_MONTH = "yM";
+ field public static final String YEAR_NUM_MONTH_DAY = "yMd";
+ field public static final String YEAR_NUM_MONTH_WEEKDAY_DAY = "yMEd";
+ field public static final String YEAR_QUARTER = "yQQQQ";
field public static final int YEAR_WOY_FIELD = 18; // 0x12
field protected android.icu.util.Calendar calendar;
field protected android.icu.text.NumberFormat numberFormat;
}
- public static final class DateFormat.BooleanAttribute extends java.lang.Enum {
- method public static android.icu.text.DateFormat.BooleanAttribute valueOf(java.lang.String);
- method public static final android.icu.text.DateFormat.BooleanAttribute[] values();
+ public enum DateFormat.BooleanAttribute {
enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_NUMERIC;
enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_WHITESPACE;
enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_MULTIPLE_PATTERNS_FOR_MATCH;
@@ -19735,7 +19726,7 @@ package android.icu.text {
}
public static class DateFormat.Field extends java.text.Format.Field {
- ctor protected DateFormat.Field(java.lang.String, int);
+ ctor protected DateFormat.Field(String, int);
method public int getCalendarField();
method public static android.icu.text.DateFormat.Field ofCalendarField(int);
field public static final android.icu.text.DateFormat.Field AM_PM;
@@ -19772,44 +19763,44 @@ package android.icu.text {
ctor public DateFormatSymbols(android.icu.util.ULocale);
ctor public DateFormatSymbols(android.icu.util.Calendar, java.util.Locale);
ctor public DateFormatSymbols(android.icu.util.Calendar, android.icu.util.ULocale);
- ctor public DateFormatSymbols(java.lang.Class<? extends android.icu.util.Calendar>, java.util.Locale);
- ctor public DateFormatSymbols(java.lang.Class<? extends android.icu.util.Calendar>, android.icu.util.ULocale);
+ ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, java.util.Locale);
+ ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, android.icu.util.ULocale);
ctor public DateFormatSymbols(java.util.ResourceBundle, java.util.Locale);
ctor public DateFormatSymbols(java.util.ResourceBundle, android.icu.util.ULocale);
- method public java.lang.Object clone();
- method public java.lang.String[] getAmPmStrings();
+ method public Object clone();
+ method public String[] getAmPmStrings();
method public static java.util.Locale[] getAvailableLocales();
- method public java.lang.String[] getEraNames();
- method public java.lang.String[] getEras();
+ method public String[] getEraNames();
+ method public String[] getEras();
method public static android.icu.text.DateFormatSymbols getInstance();
method public static android.icu.text.DateFormatSymbols getInstance(java.util.Locale);
method public static android.icu.text.DateFormatSymbols getInstance(android.icu.util.ULocale);
- method public java.lang.String getLocalPatternChars();
- method public java.lang.String[] getMonths();
- method public java.lang.String[] getMonths(int, int);
- method public java.lang.String[] getQuarters(int, int);
- method public java.lang.String[] getShortMonths();
- method public java.lang.String[] getShortWeekdays();
- method public java.lang.String[] getWeekdays();
- method public java.lang.String[] getWeekdays(int, int);
- method public java.lang.String[] getYearNames(int, int);
- method public java.lang.String[] getZodiacNames(int, int);
- method public java.lang.String[][] getZoneStrings();
- method protected void initializeData(android.icu.util.ULocale, java.lang.String);
- method public void setAmPmStrings(java.lang.String[]);
- method public void setEraNames(java.lang.String[]);
- method public void setEras(java.lang.String[]);
- method public void setLocalPatternChars(java.lang.String);
- method public void setMonths(java.lang.String[]);
- method public void setMonths(java.lang.String[], int, int);
- method public void setQuarters(java.lang.String[], int, int);
- method public void setShortMonths(java.lang.String[]);
- method public void setShortWeekdays(java.lang.String[]);
- method public void setWeekdays(java.lang.String[], int, int);
- method public void setWeekdays(java.lang.String[]);
- method public void setYearNames(java.lang.String[], int, int);
- method public void setZodiacNames(java.lang.String[], int, int);
- method public void setZoneStrings(java.lang.String[][]);
+ method public String getLocalPatternChars();
+ method public String[] getMonths();
+ method public String[] getMonths(int, int);
+ method public String[] getQuarters(int, int);
+ method public String[] getShortMonths();
+ method public String[] getShortWeekdays();
+ method public String[] getWeekdays();
+ method public String[] getWeekdays(int, int);
+ method public String[] getYearNames(int, int);
+ method public String[] getZodiacNames(int, int);
+ method public String[][] getZoneStrings();
+ method protected void initializeData(android.icu.util.ULocale, String);
+ method public void setAmPmStrings(String[]);
+ method public void setEraNames(String[]);
+ method public void setEras(String[]);
+ method public void setLocalPatternChars(String);
+ method public void setMonths(String[]);
+ method public void setMonths(String[], int, int);
+ method public void setQuarters(String[], int, int);
+ method public void setShortMonths(String[]);
+ method public void setShortWeekdays(String[]);
+ method public void setWeekdays(String[], int, int);
+ method public void setWeekdays(String[]);
+ method public void setYearNames(String[], int, int);
+ method public void setZodiacNames(String[], int, int);
+ method public void setZoneStrings(String[][]);
field public static final int ABBREVIATED = 0; // 0x0
field public static final int FORMAT = 0; // 0x0
field public static final int NARROW = 2; // 0x2
@@ -19819,72 +19810,71 @@ package android.icu.text {
}
public class DateIntervalFormat extends android.icu.text.UFormat {
- method public synchronized java.lang.Object clone();
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public final synchronized java.lang.StringBuffer format(android.icu.util.DateInterval, java.lang.StringBuffer, java.text.FieldPosition);
- method public final synchronized java.lang.StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
- method public synchronized android.icu.text.DateFormat getDateFormat();
+ method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public final StringBuffer format(android.icu.util.DateInterval, StringBuffer, java.text.FieldPosition);
+ method public final StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
+ method public android.icu.text.DateFormat getDateFormat();
method public android.icu.text.DateIntervalInfo getDateIntervalInfo();
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String);
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String, java.util.Locale);
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String, android.icu.util.ULocale);
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String, android.icu.text.DateIntervalInfo);
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String, java.util.Locale, android.icu.text.DateIntervalInfo);
- method public static final android.icu.text.DateIntervalFormat getInstance(java.lang.String, android.icu.util.ULocale, android.icu.text.DateIntervalInfo);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.text.DateIntervalInfo);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale, android.icu.text.DateIntervalInfo);
+ method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale, android.icu.text.DateIntervalInfo);
method public android.icu.util.TimeZone getTimeZone();
- method public deprecated java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
+ method @Deprecated public Object parseObject(String, java.text.ParsePosition);
method public void setDateIntervalInfo(android.icu.text.DateIntervalInfo);
method public void setTimeZone(android.icu.util.TimeZone);
}
- public class DateIntervalInfo implements java.lang.Cloneable android.icu.util.Freezable java.io.Serializable {
+ public class DateIntervalInfo implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateIntervalInfo> java.io.Serializable {
ctor public DateIntervalInfo(android.icu.util.ULocale);
ctor public DateIntervalInfo(java.util.Locale);
- method public java.lang.Object clone();
+ method public Object clone();
method public android.icu.text.DateIntervalInfo cloneAsThawed();
method public android.icu.text.DateIntervalInfo freeze();
method public boolean getDefaultOrder();
- method public java.lang.String getFallbackIntervalPattern();
- method public android.icu.text.DateIntervalInfo.PatternInfo getIntervalPattern(java.lang.String, int);
+ method public String getFallbackIntervalPattern();
+ method public android.icu.text.DateIntervalInfo.PatternInfo getIntervalPattern(String, int);
method public boolean isFrozen();
- method public void setFallbackIntervalPattern(java.lang.String);
- method public void setIntervalPattern(java.lang.String, int, java.lang.String);
+ method public void setFallbackIntervalPattern(String);
+ method public void setIntervalPattern(String, int, String);
}
public static final class DateIntervalInfo.PatternInfo implements java.lang.Cloneable java.io.Serializable {
- ctor public DateIntervalInfo.PatternInfo(java.lang.String, java.lang.String, boolean);
+ ctor public DateIntervalInfo.PatternInfo(String, String, boolean);
method public boolean firstDateInPtnIsLaterDate();
- method public java.lang.String getFirstPart();
- method public java.lang.String getSecondPart();
+ method public String getFirstPart();
+ method public String getSecondPart();
}
- public class DateTimePatternGenerator implements java.lang.Cloneable android.icu.util.Freezable {
+ public class DateTimePatternGenerator implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateTimePatternGenerator> {
ctor protected DateTimePatternGenerator();
- method public android.icu.text.DateTimePatternGenerator addPattern(java.lang.String, boolean, android.icu.text.DateTimePatternGenerator.PatternInfo);
- method public java.lang.Object clone();
+ method public android.icu.text.DateTimePatternGenerator addPattern(String, boolean, android.icu.text.DateTimePatternGenerator.PatternInfo);
+ method public Object clone();
method public android.icu.text.DateTimePatternGenerator cloneAsThawed();
method public android.icu.text.DateTimePatternGenerator freeze();
- method public java.lang.String getAppendItemFormat(int);
- method public java.lang.String getAppendItemName(int);
- method public java.lang.String getBaseSkeleton(java.lang.String);
+ method public String getAppendItemFormat(int);
+ method public String getAppendItemName(int);
+ method public String getBaseSkeleton(String);
method public java.util.Set<java.lang.String> getBaseSkeletons(java.util.Set<java.lang.String>);
- method public java.lang.String getBestPattern(java.lang.String);
- method public java.lang.String getBestPattern(java.lang.String, int);
- method public java.lang.String getDateTimeFormat();
- method public java.lang.String getDecimal();
+ method public String getBestPattern(String);
+ method public String getBestPattern(String, int);
+ method public String getDateTimeFormat();
+ method public String getDecimal();
method public static android.icu.text.DateTimePatternGenerator getEmptyInstance();
method public static android.icu.text.DateTimePatternGenerator getInstance();
method public static android.icu.text.DateTimePatternGenerator getInstance(android.icu.util.ULocale);
method public static android.icu.text.DateTimePatternGenerator getInstance(java.util.Locale);
- method public java.lang.String getSkeleton(java.lang.String);
- method public java.util.Map<java.lang.String, java.lang.String> getSkeletons(java.util.Map<java.lang.String, java.lang.String>);
+ method public String getSkeleton(String);
+ method public java.util.Map<java.lang.String,java.lang.String> getSkeletons(java.util.Map<java.lang.String,java.lang.String>);
method public boolean isFrozen();
- method public java.lang.String replaceFieldTypes(java.lang.String, java.lang.String);
- method public java.lang.String replaceFieldTypes(java.lang.String, java.lang.String, int);
- method public void setAppendItemFormat(int, java.lang.String);
- method public void setAppendItemName(int, java.lang.String);
- method public void setDateTimeFormat(java.lang.String);
- method public void setDecimal(java.lang.String);
+ method public String replaceFieldTypes(String, String);
+ method public String replaceFieldTypes(String, String, int);
+ method public void setAppendItemFormat(int, String);
+ method public void setAppendItemName(int, String);
+ method public void setDateTimeFormat(String);
+ method public void setDecimal(String);
field public static final int DAY = 7; // 0x7
field public static final int DAYPERIOD = 10; // 0xa
field public static final int DAY_OF_WEEK_IN_MONTH = 9; // 0x9
@@ -19911,99 +19901,79 @@ package android.icu.text {
field public static final int BASE_CONFLICT = 1; // 0x1
field public static final int CONFLICT = 2; // 0x2
field public static final int OK = 0; // 0x0
- field public java.lang.String conflictingPattern;
+ field public String conflictingPattern;
field public int status;
}
public class DecimalFormat extends android.icu.text.NumberFormat {
ctor public DecimalFormat();
- ctor public DecimalFormat(java.lang.String);
- ctor public DecimalFormat(java.lang.String, android.icu.text.DecimalFormatSymbols);
- ctor public DecimalFormat(java.lang.String, android.icu.text.DecimalFormatSymbols, android.icu.text.CurrencyPluralInfo, int);
- method public synchronized void applyLocalizedPattern(java.lang.String);
- method public synchronized void applyPattern(java.lang.String);
- method public synchronized boolean areSignificantDigitsUsed();
- method public synchronized boolean equals(java.lang.Object);
- method public java.lang.StringBuffer format(double, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(long, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(java.math.BigInteger, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(java.math.BigDecimal, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(android.icu.math.BigDecimal, java.lang.StringBuffer, java.text.FieldPosition);
- method public synchronized android.icu.util.Currency getCurrency();
- method public synchronized android.icu.text.CurrencyPluralInfo getCurrencyPluralInfo();
- method public synchronized android.icu.util.Currency.CurrencyUsage getCurrencyUsage();
- method public synchronized android.icu.text.DecimalFormatSymbols getDecimalFormatSymbols();
- method public synchronized int getFormatWidth();
- method public synchronized int getGroupingSize();
- method public synchronized java.math.MathContext getMathContext();
- method public synchronized android.icu.math.MathContext getMathContextICU();
- method public synchronized int getMaximumFractionDigits();
- method public synchronized int getMaximumIntegerDigits();
- method public synchronized int getMaximumSignificantDigits();
- method public synchronized byte getMinimumExponentDigits();
- method public synchronized int getMinimumFractionDigits();
- method public synchronized int getMinimumIntegerDigits();
- method public synchronized int getMinimumSignificantDigits();
- method public synchronized int getMultiplier();
- method public synchronized java.lang.String getNegativePrefix();
- method public synchronized java.lang.String getNegativeSuffix();
- method public synchronized char getPadCharacter();
- method public synchronized int getPadPosition();
- method public deprecated int getParseMaxDigits();
- method public synchronized java.lang.String getPositivePrefix();
- method public synchronized java.lang.String getPositiveSuffix();
- method public synchronized java.math.BigDecimal getRoundingIncrement();
- method public synchronized int getRoundingMode();
- method public synchronized int getSecondaryGroupingSize();
- method public synchronized int hashCode();
- method public synchronized boolean isDecimalPatternMatchRequired();
- method public synchronized boolean isDecimalSeparatorAlwaysShown();
- method public synchronized boolean isExponentSignAlwaysShown();
- method public synchronized boolean isGroupingUsed();
- method public synchronized boolean isParseBigDecimal();
- method public synchronized boolean isParseIntegerOnly();
- method public synchronized boolean isParseStrict();
- method public synchronized boolean isScientificNotation();
- method public java.lang.Number parse(java.lang.String, java.text.ParsePosition);
- method public synchronized void setCurrency(android.icu.util.Currency);
- method public synchronized void setCurrencyPluralInfo(android.icu.text.CurrencyPluralInfo);
- method public synchronized void setCurrencyUsage(android.icu.util.Currency.CurrencyUsage);
- method public synchronized void setDecimalFormatSymbols(android.icu.text.DecimalFormatSymbols);
- method public synchronized void setDecimalPatternMatchRequired(boolean);
- method public synchronized void setDecimalSeparatorAlwaysShown(boolean);
- method public synchronized void setExponentSignAlwaysShown(boolean);
- method public synchronized void setFormatWidth(int);
- method public synchronized void setGroupingSize(int);
- method public synchronized void setGroupingUsed(boolean);
- method public synchronized void setMathContext(java.math.MathContext);
- method public synchronized void setMathContextICU(android.icu.math.MathContext);
- method public synchronized void setMaximumFractionDigits(int);
- method public synchronized void setMaximumIntegerDigits(int);
- method public synchronized void setMaximumSignificantDigits(int);
- method public synchronized void setMinimumExponentDigits(byte);
- method public synchronized void setMinimumFractionDigits(int);
- method public synchronized void setMinimumIntegerDigits(int);
- method public synchronized void setMinimumSignificantDigits(int);
- method public synchronized void setMultiplier(int);
- method public synchronized void setNegativePrefix(java.lang.String);
- method public synchronized void setNegativeSuffix(java.lang.String);
- method public synchronized void setPadCharacter(char);
- method public synchronized void setPadPosition(int);
- method public synchronized void setParseBigDecimal(boolean);
- method public synchronized void setParseIntegerOnly(boolean);
- method public deprecated void setParseMaxDigits(int);
- method public synchronized void setParseStrict(boolean);
- method public synchronized void setPositivePrefix(java.lang.String);
- method public synchronized void setPositiveSuffix(java.lang.String);
- method public synchronized void setRoundingIncrement(java.math.BigDecimal);
- method public synchronized void setRoundingIncrement(android.icu.math.BigDecimal);
- method public synchronized void setRoundingIncrement(double);
- method public synchronized void setRoundingMode(int);
- method public synchronized void setScientificNotation(boolean);
- method public synchronized void setSecondaryGroupingSize(int);
- method public synchronized void setSignificantDigitsUsed(boolean);
- method public synchronized java.lang.String toLocalizedPattern();
- method public synchronized java.lang.String toPattern();
+ ctor public DecimalFormat(String);
+ ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols);
+ ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols, android.icu.text.CurrencyPluralInfo, int);
+ method public void applyLocalizedPattern(String);
+ method public void applyPattern(String);
+ method public boolean areSignificantDigitsUsed();
+ method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition);
+ method public android.icu.text.CurrencyPluralInfo getCurrencyPluralInfo();
+ method public android.icu.util.Currency.CurrencyUsage getCurrencyUsage();
+ method public android.icu.text.DecimalFormatSymbols getDecimalFormatSymbols();
+ method public int getFormatWidth();
+ method public int getGroupingSize();
+ method public java.math.MathContext getMathContext();
+ method public android.icu.math.MathContext getMathContextICU();
+ method public int getMaximumSignificantDigits();
+ method public byte getMinimumExponentDigits();
+ method public int getMinimumSignificantDigits();
+ method public int getMultiplier();
+ method public String getNegativePrefix();
+ method public String getNegativeSuffix();
+ method public char getPadCharacter();
+ method public int getPadPosition();
+ method @Deprecated public int getParseMaxDigits();
+ method public String getPositivePrefix();
+ method public String getPositiveSuffix();
+ method public java.math.BigDecimal getRoundingIncrement();
+ method public int getSecondaryGroupingSize();
+ method public boolean isDecimalPatternMatchRequired();
+ method public boolean isDecimalSeparatorAlwaysShown();
+ method public boolean isExponentSignAlwaysShown();
+ method public boolean isParseBigDecimal();
+ method public boolean isScientificNotation();
+ method public Number parse(String, java.text.ParsePosition);
+ method public void setCurrencyPluralInfo(android.icu.text.CurrencyPluralInfo);
+ method public void setCurrencyUsage(android.icu.util.Currency.CurrencyUsage);
+ method public void setDecimalFormatSymbols(android.icu.text.DecimalFormatSymbols);
+ method public void setDecimalPatternMatchRequired(boolean);
+ method public void setDecimalSeparatorAlwaysShown(boolean);
+ method public void setExponentSignAlwaysShown(boolean);
+ method public void setFormatWidth(int);
+ method public void setGroupingSize(int);
+ method public void setMathContext(java.math.MathContext);
+ method public void setMathContextICU(android.icu.math.MathContext);
+ method public void setMaximumSignificantDigits(int);
+ method public void setMinimumExponentDigits(byte);
+ method public void setMinimumSignificantDigits(int);
+ method public void setMultiplier(int);
+ method public void setNegativePrefix(String);
+ method public void setNegativeSuffix(String);
+ method public void setPadCharacter(char);
+ method public void setPadPosition(int);
+ method public void setParseBigDecimal(boolean);
+ method @Deprecated public void setParseMaxDigits(int);
+ method public void setPositivePrefix(String);
+ method public void setPositiveSuffix(String);
+ method public void setRoundingIncrement(java.math.BigDecimal);
+ method public void setRoundingIncrement(android.icu.math.BigDecimal);
+ method public void setRoundingIncrement(double);
+ method public void setScientificNotation(boolean);
+ method public void setSecondaryGroupingSize(int);
+ method public void setSignificantDigitsUsed(boolean);
+ method public String toLocalizedPattern();
+ method public String toPattern();
field public static final int PAD_AFTER_PREFIX = 1; // 0x1
field public static final int PAD_AFTER_SUFFIX = 3; // 0x3
field public static final int PAD_BEFORE_PREFIX = 0; // 0x0
@@ -20014,74 +19984,74 @@ package android.icu.text {
ctor public DecimalFormatSymbols();
ctor public DecimalFormatSymbols(java.util.Locale);
ctor public DecimalFormatSymbols(android.icu.util.ULocale);
- method public java.lang.Object clone();
+ method public Object clone();
method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(java.util.Locale, android.icu.text.NumberingSystem);
method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(android.icu.util.ULocale, android.icu.text.NumberingSystem);
method public static java.util.Locale[] getAvailableLocales();
method public android.icu.util.Currency getCurrency();
- method public java.lang.String getCurrencySymbol();
+ method public String getCurrencySymbol();
method public char getDecimalSeparator();
- method public java.lang.String getDecimalSeparatorString();
+ method public String getDecimalSeparatorString();
method public char getDigit();
- method public java.lang.String[] getDigitStrings();
+ method public String[] getDigitStrings();
method public char[] getDigits();
- method public java.lang.String getExponentMultiplicationSign();
- method public java.lang.String getExponentSeparator();
+ method public String getExponentMultiplicationSign();
+ method public String getExponentSeparator();
method public char getGroupingSeparator();
- method public java.lang.String getGroupingSeparatorString();
- method public java.lang.String getInfinity();
+ method public String getGroupingSeparatorString();
+ method public String getInfinity();
method public static android.icu.text.DecimalFormatSymbols getInstance();
method public static android.icu.text.DecimalFormatSymbols getInstance(java.util.Locale);
method public static android.icu.text.DecimalFormatSymbols getInstance(android.icu.util.ULocale);
- method public java.lang.String getInternationalCurrencySymbol();
+ method public String getInternationalCurrencySymbol();
method public java.util.Locale getLocale();
method public char getMinusSign();
- method public java.lang.String getMinusSignString();
+ method public String getMinusSignString();
method public char getMonetaryDecimalSeparator();
- method public java.lang.String getMonetaryDecimalSeparatorString();
+ method public String getMonetaryDecimalSeparatorString();
method public char getMonetaryGroupingSeparator();
- method public java.lang.String getMonetaryGroupingSeparatorString();
- method public java.lang.String getNaN();
+ method public String getMonetaryGroupingSeparatorString();
+ method public String getNaN();
method public char getPadEscape();
- method public java.lang.String getPatternForCurrencySpacing(int, boolean);
+ method public String getPatternForCurrencySpacing(int, boolean);
method public char getPatternSeparator();
method public char getPerMill();
- method public java.lang.String getPerMillString();
+ method public String getPerMillString();
method public char getPercent();
- method public java.lang.String getPercentString();
+ method public String getPercentString();
method public char getPlusSign();
- method public java.lang.String getPlusSignString();
+ method public String getPlusSignString();
method public char getSignificantDigit();
method public android.icu.util.ULocale getULocale();
method public char getZeroDigit();
method public void setCurrency(android.icu.util.Currency);
- method public void setCurrencySymbol(java.lang.String);
+ method public void setCurrencySymbol(String);
method public void setDecimalSeparator(char);
- method public void setDecimalSeparatorString(java.lang.String);
+ method public void setDecimalSeparatorString(String);
method public void setDigit(char);
- method public void setDigitStrings(java.lang.String[]);
- method public void setExponentMultiplicationSign(java.lang.String);
- method public void setExponentSeparator(java.lang.String);
+ method public void setDigitStrings(String[]);
+ method public void setExponentMultiplicationSign(String);
+ method public void setExponentSeparator(String);
method public void setGroupingSeparator(char);
- method public void setGroupingSeparatorString(java.lang.String);
- method public void setInfinity(java.lang.String);
- method public void setInternationalCurrencySymbol(java.lang.String);
+ method public void setGroupingSeparatorString(String);
+ method public void setInfinity(String);
+ method public void setInternationalCurrencySymbol(String);
method public void setMinusSign(char);
- method public void setMinusSignString(java.lang.String);
+ method public void setMinusSignString(String);
method public void setMonetaryDecimalSeparator(char);
- method public void setMonetaryDecimalSeparatorString(java.lang.String);
+ method public void setMonetaryDecimalSeparatorString(String);
method public void setMonetaryGroupingSeparator(char);
- method public void setMonetaryGroupingSeparatorString(java.lang.String);
- method public void setNaN(java.lang.String);
+ method public void setMonetaryGroupingSeparatorString(String);
+ method public void setNaN(String);
method public void setPadEscape(char);
- method public void setPatternForCurrencySpacing(int, boolean, java.lang.String);
+ method public void setPatternForCurrencySpacing(int, boolean, String);
method public void setPatternSeparator(char);
method public void setPerMill(char);
- method public void setPerMillString(java.lang.String);
+ method public void setPerMillString(String);
method public void setPercent(char);
- method public void setPercentString(java.lang.String);
+ method public void setPercentString(String);
method public void setPlusSign(char);
- method public void setPlusSignString(java.lang.String);
+ method public void setPlusSignString(String);
method public void setSignificantDigit(char);
method public void setZeroDigit(char);
field public static final int CURRENCY_SPC_CURRENCY_MATCH = 0; // 0x0
@@ -20089,11 +20059,9 @@ package android.icu.text {
field public static final int CURRENCY_SPC_SURROUNDING_MATCH = 1; // 0x1
}
- public final class DisplayContext extends java.lang.Enum {
+ public enum DisplayContext {
method public android.icu.text.DisplayContext.Type type();
method public int value();
- method public static android.icu.text.DisplayContext valueOf(java.lang.String);
- method public static final android.icu.text.DisplayContext[] values();
enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE;
enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_STANDALONE;
@@ -20107,9 +20075,7 @@ package android.icu.text {
enum_constant public static final android.icu.text.DisplayContext SUBSTITUTE;
}
- public static final class DisplayContext.Type extends java.lang.Enum {
- method public static android.icu.text.DisplayContext.Type valueOf(java.lang.String);
- method public static final android.icu.text.DisplayContext.Type[] values();
+ public enum DisplayContext.Type {
enum_constant public static final android.icu.text.DisplayContext.Type CAPITALIZATION;
enum_constant public static final android.icu.text.DisplayContext.Type DIALECT_HANDLING;
enum_constant public static final android.icu.text.DisplayContext.Type DISPLAY_LENGTH;
@@ -20147,10 +20113,10 @@ package android.icu.text {
public abstract class IDNA {
method public static android.icu.text.IDNA getUTS46Instance(int);
- method public abstract java.lang.StringBuilder labelToASCII(java.lang.CharSequence, java.lang.StringBuilder, android.icu.text.IDNA.Info);
- method public abstract java.lang.StringBuilder labelToUnicode(java.lang.CharSequence, java.lang.StringBuilder, android.icu.text.IDNA.Info);
- method public abstract java.lang.StringBuilder nameToASCII(java.lang.CharSequence, java.lang.StringBuilder, android.icu.text.IDNA.Info);
- method public abstract java.lang.StringBuilder nameToUnicode(java.lang.CharSequence, java.lang.StringBuilder, android.icu.text.IDNA.Info);
+ method public abstract StringBuilder labelToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
+ method public abstract StringBuilder labelToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
+ method public abstract StringBuilder nameToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
+ method public abstract StringBuilder nameToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
field public static final int CHECK_BIDI = 4; // 0x4
field public static final int CHECK_CONTEXTJ = 8; // 0x8
field public static final int CHECK_CONTEXTO = 64; // 0x40
@@ -20160,9 +20126,7 @@ package android.icu.text {
field public static final int USE_STD3_RULES = 2; // 0x2
}
- public static final class IDNA.Error extends java.lang.Enum {
- method public static android.icu.text.IDNA.Error valueOf(java.lang.String);
- method public static final android.icu.text.IDNA.Error[] values();
+ public enum IDNA.Error {
enum_constant public static final android.icu.text.IDNA.Error BIDI;
enum_constant public static final android.icu.text.IDNA.Error CONTEXTJ;
enum_constant public static final android.icu.text.IDNA.Error CONTEXTO_DIGITS;
@@ -20188,12 +20152,12 @@ package android.icu.text {
}
public final class ListFormatter {
- method public java.lang.String format(java.lang.Object...);
- method public java.lang.String format(java.util.Collection<?>);
+ method public String format(java.lang.Object...);
+ method public String format(java.util.Collection<?>);
method public static android.icu.text.ListFormatter getInstance(android.icu.util.ULocale);
method public static android.icu.text.ListFormatter getInstance(java.util.Locale);
method public static android.icu.text.ListFormatter getInstance();
- method public java.lang.String getPatternForNumItems(int);
+ method public String getPatternForNumItems(int);
}
public abstract class LocaleDisplayNames {
@@ -20207,40 +20171,38 @@ package android.icu.text {
method public abstract android.icu.util.ULocale getLocale();
method public java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiList(java.util.Set<android.icu.util.ULocale>, boolean, java.util.Comparator<java.lang.Object>);
method public abstract java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiListCompareWholeItems(java.util.Set<android.icu.util.ULocale>, java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem>);
- method public abstract java.lang.String keyDisplayName(java.lang.String);
- method public abstract java.lang.String keyValueDisplayName(java.lang.String, java.lang.String);
- method public abstract java.lang.String languageDisplayName(java.lang.String);
- method public abstract java.lang.String localeDisplayName(android.icu.util.ULocale);
- method public abstract java.lang.String localeDisplayName(java.util.Locale);
- method public abstract java.lang.String localeDisplayName(java.lang.String);
- method public abstract java.lang.String regionDisplayName(java.lang.String);
- method public abstract java.lang.String scriptDisplayName(java.lang.String);
- method public abstract java.lang.String scriptDisplayName(int);
- method public abstract java.lang.String variantDisplayName(java.lang.String);
- }
-
- public static final class LocaleDisplayNames.DialectHandling extends java.lang.Enum {
- method public static android.icu.text.LocaleDisplayNames.DialectHandling valueOf(java.lang.String);
- method public static final android.icu.text.LocaleDisplayNames.DialectHandling[] values();
+ method public abstract String keyDisplayName(String);
+ method public abstract String keyValueDisplayName(String, String);
+ method public abstract String languageDisplayName(String);
+ method public abstract String localeDisplayName(android.icu.util.ULocale);
+ method public abstract String localeDisplayName(java.util.Locale);
+ method public abstract String localeDisplayName(String);
+ method public abstract String regionDisplayName(String);
+ method public abstract String scriptDisplayName(String);
+ method public abstract String scriptDisplayName(int);
+ method public abstract String variantDisplayName(String);
+ }
+
+ public enum LocaleDisplayNames.DialectHandling {
enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling DIALECT_NAMES;
enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling STANDARD_NAMES;
}
public static class LocaleDisplayNames.UiListItem {
- ctor public LocaleDisplayNames.UiListItem(android.icu.util.ULocale, android.icu.util.ULocale, java.lang.String, java.lang.String);
+ ctor public LocaleDisplayNames.UiListItem(android.icu.util.ULocale, android.icu.util.ULocale, String, String);
method public static java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem> getComparator(java.util.Comparator<java.lang.Object>, boolean);
field public final android.icu.util.ULocale minimized;
field public final android.icu.util.ULocale modified;
- field public final java.lang.String nameInDisplayLocale;
- field public final java.lang.String nameInSelf;
+ field public final String nameInDisplayLocale;
+ field public final String nameInSelf;
}
public class MeasureFormat extends android.icu.text.UFormat {
- method public final boolean equals(java.lang.Object);
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuilder formatMeasurePerUnit(android.icu.util.Measure, android.icu.util.MeasureUnit, java.lang.StringBuilder, java.text.FieldPosition);
- method public final java.lang.String formatMeasures(android.icu.util.Measure...);
- method public java.lang.StringBuilder formatMeasures(java.lang.StringBuilder, java.text.FieldPosition, android.icu.util.Measure...);
+ method public final boolean equals(Object);
+ method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public StringBuilder formatMeasurePerUnit(android.icu.util.Measure, android.icu.util.MeasureUnit, StringBuilder, java.text.FieldPosition);
+ method public final String formatMeasures(android.icu.util.Measure...);
+ method public StringBuilder formatMeasures(StringBuilder, java.text.FieldPosition, android.icu.util.Measure...);
method public static android.icu.text.MeasureFormat getCurrencyFormat(android.icu.util.ULocale);
method public static android.icu.text.MeasureFormat getCurrencyFormat(java.util.Locale);
method public static android.icu.text.MeasureFormat getCurrencyFormat();
@@ -20250,15 +20212,13 @@ package android.icu.text {
method public static android.icu.text.MeasureFormat getInstance(java.util.Locale, android.icu.text.MeasureFormat.FormatWidth, android.icu.text.NumberFormat);
method public final android.icu.util.ULocale getLocale();
method public android.icu.text.NumberFormat getNumberFormat();
- method public java.lang.String getUnitDisplayName(android.icu.util.MeasureUnit);
+ method public String getUnitDisplayName(android.icu.util.MeasureUnit);
method public android.icu.text.MeasureFormat.FormatWidth getWidth();
method public final int hashCode();
- method public android.icu.util.Measure parseObject(java.lang.String, java.text.ParsePosition);
+ method public android.icu.util.Measure parseObject(String, java.text.ParsePosition);
}
- public static final class MeasureFormat.FormatWidth extends java.lang.Enum {
- method public static android.icu.text.MeasureFormat.FormatWidth valueOf(java.lang.String);
- method public static final android.icu.text.MeasureFormat.FormatWidth[] values();
+ public enum MeasureFormat.FormatWidth {
enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NARROW;
enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NUMERIC;
enum_constant public static final android.icu.text.MeasureFormat.FormatWidth SHORT;
@@ -20266,54 +20226,54 @@ package android.icu.text {
}
public class MessageFormat extends android.icu.text.UFormat {
- ctor public MessageFormat(java.lang.String);
- ctor public MessageFormat(java.lang.String, java.util.Locale);
- ctor public MessageFormat(java.lang.String, android.icu.util.ULocale);
- method public void applyPattern(java.lang.String);
- method public void applyPattern(java.lang.String, android.icu.text.MessagePattern.ApostropheMode);
- method public static java.lang.String autoQuoteApostrophe(java.lang.String);
- method public final java.lang.StringBuffer format(java.lang.Object[], java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.StringBuffer format(java.util.Map<java.lang.String, java.lang.Object>, java.lang.StringBuffer, java.text.FieldPosition);
- method public static java.lang.String format(java.lang.String, java.lang.Object...);
- method public static java.lang.String format(java.lang.String, java.util.Map<java.lang.String, java.lang.Object>);
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
+ ctor public MessageFormat(String);
+ ctor public MessageFormat(String, java.util.Locale);
+ ctor public MessageFormat(String, android.icu.util.ULocale);
+ method public void applyPattern(String);
+ method public void applyPattern(String, android.icu.text.MessagePattern.ApostropheMode);
+ method public static String autoQuoteApostrophe(String);
+ method public final StringBuffer format(Object[], StringBuffer, java.text.FieldPosition);
+ method public final StringBuffer format(java.util.Map<java.lang.String,java.lang.Object>, StringBuffer, java.text.FieldPosition);
+ method public static String format(String, java.lang.Object...);
+ method public static String format(String, java.util.Map<java.lang.String,java.lang.Object>);
+ method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
method public android.icu.text.MessagePattern.ApostropheMode getApostropheMode();
method public java.util.Set<java.lang.String> getArgumentNames();
- method public java.text.Format getFormatByArgumentName(java.lang.String);
+ method public java.text.Format getFormatByArgumentName(String);
method public java.text.Format[] getFormats();
method public java.text.Format[] getFormatsByArgumentIndex();
method public java.util.Locale getLocale();
method public android.icu.util.ULocale getULocale();
- method public java.lang.Object[] parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object[] parse(java.lang.String) throws java.text.ParseException;
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public java.util.Map<java.lang.String, java.lang.Object> parseToMap(java.lang.String, java.text.ParsePosition);
- method public java.util.Map<java.lang.String, java.lang.Object> parseToMap(java.lang.String) throws java.text.ParseException;
+ method public Object[] parse(String, java.text.ParsePosition);
+ method public Object[] parse(String) throws java.text.ParseException;
+ method public Object parseObject(String, java.text.ParsePosition);
+ method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String, java.text.ParsePosition);
+ method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String) throws java.text.ParseException;
method public void setFormat(int, java.text.Format);
method public void setFormatByArgumentIndex(int, java.text.Format);
- method public void setFormatByArgumentName(java.lang.String, java.text.Format);
+ method public void setFormatByArgumentName(String, java.text.Format);
method public void setFormats(java.text.Format[]);
method public void setFormatsByArgumentIndex(java.text.Format[]);
- method public void setFormatsByArgumentName(java.util.Map<java.lang.String, java.text.Format>);
+ method public void setFormatsByArgumentName(java.util.Map<java.lang.String,java.text.Format>);
method public void setLocale(java.util.Locale);
method public void setLocale(android.icu.util.ULocale);
- method public java.lang.String toPattern();
+ method public String toPattern();
method public boolean usesNamedArguments();
}
public static class MessageFormat.Field extends java.text.Format.Field {
- ctor protected MessageFormat.Field(java.lang.String);
+ ctor protected MessageFormat.Field(String);
field public static final android.icu.text.MessageFormat.Field ARGUMENT;
}
- public final class MessagePattern implements java.lang.Cloneable android.icu.util.Freezable {
+ public final class MessagePattern implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.MessagePattern> {
ctor public MessagePattern();
ctor public MessagePattern(android.icu.text.MessagePattern.ApostropheMode);
- ctor public MessagePattern(java.lang.String);
- method public java.lang.String autoQuoteApostropheDeep();
+ ctor public MessagePattern(String);
+ method public String autoQuoteApostropheDeep();
method public void clear();
method public void clearPatternAndSetApostropheMode(android.icu.text.MessagePattern.ApostropheMode);
- method public java.lang.Object clone();
+ method public Object clone();
method public android.icu.text.MessagePattern cloneAsThawed();
method public int countParts();
method public android.icu.text.MessagePattern freeze();
@@ -20323,34 +20283,30 @@ package android.icu.text {
method public android.icu.text.MessagePattern.Part getPart(int);
method public android.icu.text.MessagePattern.Part.Type getPartType(int);
method public int getPatternIndex(int);
- method public java.lang.String getPatternString();
+ method public String getPatternString();
method public double getPluralOffset(int);
- method public java.lang.String getSubstring(android.icu.text.MessagePattern.Part);
+ method public String getSubstring(android.icu.text.MessagePattern.Part);
method public boolean hasNamedArguments();
method public boolean hasNumberedArguments();
method public boolean isFrozen();
- method public android.icu.text.MessagePattern parse(java.lang.String);
- method public android.icu.text.MessagePattern parseChoiceStyle(java.lang.String);
- method public android.icu.text.MessagePattern parsePluralStyle(java.lang.String);
- method public android.icu.text.MessagePattern parseSelectStyle(java.lang.String);
- method public boolean partSubstringMatches(android.icu.text.MessagePattern.Part, java.lang.String);
- method public static int validateArgumentName(java.lang.String);
+ method public android.icu.text.MessagePattern parse(String);
+ method public android.icu.text.MessagePattern parseChoiceStyle(String);
+ method public android.icu.text.MessagePattern parsePluralStyle(String);
+ method public android.icu.text.MessagePattern parseSelectStyle(String);
+ method public boolean partSubstringMatches(android.icu.text.MessagePattern.Part, String);
+ method public static int validateArgumentName(String);
field public static final int ARG_NAME_NOT_NUMBER = -1; // 0xffffffff
field public static final int ARG_NAME_NOT_VALID = -2; // 0xfffffffe
field public static final double NO_NUMERIC_VALUE = -1.23456789E8;
}
- public static final class MessagePattern.ApostropheMode extends java.lang.Enum {
- method public static android.icu.text.MessagePattern.ApostropheMode valueOf(java.lang.String);
- method public static final android.icu.text.MessagePattern.ApostropheMode[] values();
+ public enum MessagePattern.ApostropheMode {
enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_OPTIONAL;
enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_REQUIRED;
}
- public static final class MessagePattern.ArgType extends java.lang.Enum {
+ public enum MessagePattern.ArgType {
method public boolean hasPluralStyle();
- method public static android.icu.text.MessagePattern.ArgType valueOf(java.lang.String);
- method public static final android.icu.text.MessagePattern.ArgType[] values();
enum_constant public static final android.icu.text.MessagePattern.ArgType CHOICE;
enum_constant public static final android.icu.text.MessagePattern.ArgType NONE;
enum_constant public static final android.icu.text.MessagePattern.ArgType PLURAL;
@@ -20368,10 +20324,8 @@ package android.icu.text {
method public int getValue();
}
- public static final class MessagePattern.Part.Type extends java.lang.Enum {
+ public enum MessagePattern.Part.Type {
method public boolean hasNumericValue();
- method public static android.icu.text.MessagePattern.Part.Type valueOf(java.lang.String);
- method public static final android.icu.text.MessagePattern.Part.Type[] values();
enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_DOUBLE;
enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_INT;
enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_LIMIT;
@@ -20389,12 +20343,12 @@ package android.icu.text {
}
public final class Normalizer implements java.lang.Cloneable {
- method public deprecated java.lang.Object clone();
+ method @Deprecated public Object clone();
method public static int compare(char[], int, int, char[], int, int, int);
- method public static int compare(java.lang.String, java.lang.String, int);
+ method public static int compare(String, String, int);
method public static int compare(char[], char[], int);
method public static int compare(int, int, int);
- method public static int compare(int, java.lang.String, int);
+ method public static int compare(int, String, int);
field public static final int COMPARE_CODE_POINT_ORDER = 32768; // 0x8000
field public static final int COMPARE_IGNORE_CASE = 65536; // 0x10000
field public static final int FOLD_CASE_DEFAULT = 0; // 0x0
@@ -20409,32 +20363,30 @@ package android.icu.text {
}
public abstract class Normalizer2 {
- method public abstract java.lang.StringBuilder append(java.lang.StringBuilder, java.lang.CharSequence);
+ method public abstract StringBuilder append(StringBuilder, CharSequence);
method public int composePair(int, int);
method public int getCombiningClass(int);
- method public abstract java.lang.String getDecomposition(int);
- method public static android.icu.text.Normalizer2 getInstance(java.io.InputStream, java.lang.String, android.icu.text.Normalizer2.Mode);
+ method public abstract String getDecomposition(int);
+ method public static android.icu.text.Normalizer2 getInstance(java.io.InputStream, String, android.icu.text.Normalizer2.Mode);
method public static android.icu.text.Normalizer2 getNFCInstance();
method public static android.icu.text.Normalizer2 getNFDInstance();
method public static android.icu.text.Normalizer2 getNFKCCasefoldInstance();
method public static android.icu.text.Normalizer2 getNFKCInstance();
method public static android.icu.text.Normalizer2 getNFKDInstance();
- method public java.lang.String getRawDecomposition(int);
+ method public String getRawDecomposition(int);
method public abstract boolean hasBoundaryAfter(int);
method public abstract boolean hasBoundaryBefore(int);
method public abstract boolean isInert(int);
- method public abstract boolean isNormalized(java.lang.CharSequence);
- method public java.lang.String normalize(java.lang.CharSequence);
- method public abstract java.lang.StringBuilder normalize(java.lang.CharSequence, java.lang.StringBuilder);
- method public abstract java.lang.Appendable normalize(java.lang.CharSequence, java.lang.Appendable);
- method public abstract java.lang.StringBuilder normalizeSecondAndAppend(java.lang.StringBuilder, java.lang.CharSequence);
- method public abstract android.icu.text.Normalizer.QuickCheckResult quickCheck(java.lang.CharSequence);
- method public abstract int spanQuickCheckYes(java.lang.CharSequence);
- }
-
- public static final class Normalizer2.Mode extends java.lang.Enum {
- method public static android.icu.text.Normalizer2.Mode valueOf(java.lang.String);
- method public static final android.icu.text.Normalizer2.Mode[] values();
+ method public abstract boolean isNormalized(CharSequence);
+ method public String normalize(CharSequence);
+ method public abstract StringBuilder normalize(CharSequence, StringBuilder);
+ method public abstract Appendable normalize(CharSequence, Appendable);
+ method public abstract StringBuilder normalizeSecondAndAppend(StringBuilder, CharSequence);
+ method public abstract android.icu.text.Normalizer.QuickCheckResult quickCheck(CharSequence);
+ method public abstract int spanQuickCheckYes(CharSequence);
+ }
+
+ public enum Normalizer2.Mode {
enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE;
enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE_CONTIGUOUS;
enum_constant public static final android.icu.text.Normalizer2.Mode DECOMPOSE;
@@ -20443,19 +20395,19 @@ package android.icu.text {
public abstract class NumberFormat extends android.icu.text.UFormat {
ctor public NumberFormat();
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.String format(double);
- method public final java.lang.String format(long);
- method public final java.lang.String format(java.math.BigInteger);
- method public final java.lang.String format(java.math.BigDecimal);
- method public final java.lang.String format(android.icu.math.BigDecimal);
- method public final java.lang.String format(android.icu.util.CurrencyAmount);
- method public abstract java.lang.StringBuffer format(double, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(long, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(java.math.BigInteger, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(java.math.BigDecimal, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(android.icu.math.BigDecimal, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(android.icu.util.CurrencyAmount, java.lang.StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public final String format(double);
+ method public final String format(long);
+ method public final String format(java.math.BigInteger);
+ method public final String format(java.math.BigDecimal);
+ method public final String format(android.icu.math.BigDecimal);
+ method public final String format(android.icu.util.CurrencyAmount);
+ method public abstract StringBuffer format(double, StringBuffer, java.text.FieldPosition);
+ method public abstract StringBuffer format(long, StringBuffer, java.text.FieldPosition);
+ method public abstract StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition);
+ method public abstract StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition);
+ method public abstract StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(android.icu.util.CurrencyAmount, StringBuffer, java.text.FieldPosition);
method public static java.util.Locale[] getAvailableLocales();
method public android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type);
method public android.icu.util.Currency getCurrency();
@@ -20478,7 +20430,7 @@ package android.icu.text {
method public static final android.icu.text.NumberFormat getNumberInstance();
method public static android.icu.text.NumberFormat getNumberInstance(java.util.Locale);
method public static android.icu.text.NumberFormat getNumberInstance(android.icu.util.ULocale);
- method protected static java.lang.String getPattern(android.icu.util.ULocale, int);
+ method protected static String getPattern(android.icu.util.ULocale, int);
method public static final android.icu.text.NumberFormat getPercentInstance();
method public static android.icu.text.NumberFormat getPercentInstance(java.util.Locale);
method public static android.icu.text.NumberFormat getPercentInstance(android.icu.util.ULocale);
@@ -20489,10 +20441,10 @@ package android.icu.text {
method public boolean isGroupingUsed();
method public boolean isParseIntegerOnly();
method public boolean isParseStrict();
- method public abstract java.lang.Number parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Number parse(java.lang.String) throws java.text.ParseException;
- method public android.icu.util.CurrencyAmount parseCurrency(java.lang.CharSequence, java.text.ParsePosition);
- method public final java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
+ method public abstract Number parse(String, java.text.ParsePosition);
+ method public Number parse(String) throws java.text.ParseException;
+ method public android.icu.util.CurrencyAmount parseCurrency(CharSequence, java.text.ParsePosition);
+ method public final Object parseObject(String, java.text.ParsePosition);
method public void setContext(android.icu.text.DisplayContext);
method public void setCurrency(android.icu.util.Currency);
method public void setGroupingUsed(boolean);
@@ -20518,7 +20470,7 @@ package android.icu.text {
}
public static class NumberFormat.Field extends java.text.Format.Field {
- ctor protected NumberFormat.Field(java.lang.String);
+ ctor protected NumberFormat.Field(String);
field public static final android.icu.text.NumberFormat.Field CURRENCY;
field public static final android.icu.text.NumberFormat.Field DECIMAL_SEPARATOR;
field public static final android.icu.text.NumberFormat.Field EXPONENT;
@@ -20534,17 +20486,17 @@ package android.icu.text {
public class NumberingSystem {
ctor public NumberingSystem();
- method public static java.lang.String[] getAvailableNames();
- method public java.lang.String getDescription();
- method public static android.icu.text.NumberingSystem getInstance(int, boolean, java.lang.String);
+ method public static String[] getAvailableNames();
+ method public String getDescription();
+ method public static android.icu.text.NumberingSystem getInstance(int, boolean, String);
method public static android.icu.text.NumberingSystem getInstance(java.util.Locale);
method public static android.icu.text.NumberingSystem getInstance(android.icu.util.ULocale);
method public static android.icu.text.NumberingSystem getInstance();
- method public static android.icu.text.NumberingSystem getInstanceByName(java.lang.String);
- method public java.lang.String getName();
+ method public static android.icu.text.NumberingSystem getInstanceByName(String);
+ method public String getName();
method public int getRadix();
method public boolean isAlgorithmic();
- method public static boolean isValidDigitString(java.lang.String);
+ method public static boolean isValidDigitString(String);
field public static final android.icu.text.NumberingSystem LATIN;
}
@@ -20557,57 +20509,55 @@ package android.icu.text {
ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules);
ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType);
ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules.PluralType);
- ctor public PluralFormat(java.lang.String);
- ctor public PluralFormat(android.icu.util.ULocale, java.lang.String);
- ctor public PluralFormat(android.icu.text.PluralRules, java.lang.String);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules, java.lang.String);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType, java.lang.String);
- method public void applyPattern(java.lang.String);
+ ctor public PluralFormat(String);
+ ctor public PluralFormat(android.icu.util.ULocale, String);
+ ctor public PluralFormat(android.icu.text.PluralRules, String);
+ ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules, String);
+ ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType, String);
+ method public void applyPattern(String);
method public boolean equals(android.icu.text.PluralFormat);
- method public final java.lang.String format(double);
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.Number parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
+ method public final String format(double);
+ method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public Number parse(String, java.text.ParsePosition);
+ method public Object parseObject(String, java.text.ParsePosition);
method public void setNumberFormat(android.icu.text.NumberFormat);
- method public java.lang.String toPattern();
+ method public String toPattern();
}
public class PluralRules implements java.io.Serializable {
- method public static android.icu.text.PluralRules createRules(java.lang.String);
+ method public static android.icu.text.PluralRules createRules(String);
method public boolean equals(android.icu.text.PluralRules);
method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale);
method public static android.icu.text.PluralRules forLocale(java.util.Locale);
method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType);
method public static android.icu.text.PluralRules forLocale(java.util.Locale, android.icu.text.PluralRules.PluralType);
- method public java.util.Collection<java.lang.Double> getAllKeywordValues(java.lang.String);
+ method public java.util.Collection<java.lang.Double> getAllKeywordValues(String);
method public java.util.Set<java.lang.String> getKeywords();
- method public java.util.Collection<java.lang.Double> getSamples(java.lang.String);
- method public double getUniqueKeywordValue(java.lang.String);
- method public static android.icu.text.PluralRules parseDescription(java.lang.String) throws java.text.ParseException;
- method public java.lang.String select(double);
+ method public java.util.Collection<java.lang.Double> getSamples(String);
+ method public double getUniqueKeywordValue(String);
+ method public static android.icu.text.PluralRules parseDescription(String) throws java.text.ParseException;
+ method public String select(double);
field public static final android.icu.text.PluralRules DEFAULT;
- field public static final java.lang.String KEYWORD_FEW = "few";
- field public static final java.lang.String KEYWORD_MANY = "many";
- field public static final java.lang.String KEYWORD_ONE = "one";
- field public static final java.lang.String KEYWORD_OTHER = "other";
- field public static final java.lang.String KEYWORD_TWO = "two";
- field public static final java.lang.String KEYWORD_ZERO = "zero";
+ field public static final String KEYWORD_FEW = "few";
+ field public static final String KEYWORD_MANY = "many";
+ field public static final String KEYWORD_ONE = "one";
+ field public static final String KEYWORD_OTHER = "other";
+ field public static final String KEYWORD_TWO = "two";
+ field public static final String KEYWORD_ZERO = "zero";
field public static final double NO_UNIQUE_VALUE = -0.00123456777;
}
- public static final class PluralRules.PluralType extends java.lang.Enum {
- method public static android.icu.text.PluralRules.PluralType valueOf(java.lang.String);
- method public static final android.icu.text.PluralRules.PluralType[] values();
+ public enum PluralRules.PluralType {
enum_constant public static final android.icu.text.PluralRules.PluralType CARDINAL;
enum_constant public static final android.icu.text.PluralRules.PluralType ORDINAL;
}
public final class RelativeDateTimeFormatter {
- method public java.lang.String combineDateAndTime(java.lang.String, java.lang.String);
- method public java.lang.String format(double, android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.RelativeUnit);
- method public java.lang.String format(android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit);
- method public java.lang.String format(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
- method public java.lang.String formatNumeric(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
+ method public String combineDateAndTime(String, String);
+ method public String format(double, android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.RelativeUnit);
+ method public String format(android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit);
+ method public String format(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
+ method public String formatNumeric(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
method public android.icu.text.DisplayContext getCapitalizationContext();
method public android.icu.text.RelativeDateTimeFormatter.Style getFormatStyle();
method public static android.icu.text.RelativeDateTimeFormatter getInstance();
@@ -20619,9 +20569,7 @@ package android.icu.text {
method public android.icu.text.NumberFormat getNumberFormat();
}
- public static final class RelativeDateTimeFormatter.AbsoluteUnit extends java.lang.Enum {
- method public static android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit valueOf(java.lang.String);
- method public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit[] values();
+ public enum RelativeDateTimeFormatter.AbsoluteUnit {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit DAY;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit FRIDAY;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit MONDAY;
@@ -20636,9 +20584,7 @@ package android.icu.text {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit YEAR;
}
- public static final class RelativeDateTimeFormatter.Direction extends java.lang.Enum {
- method public static android.icu.text.RelativeDateTimeFormatter.Direction valueOf(java.lang.String);
- method public static final android.icu.text.RelativeDateTimeFormatter.Direction[] values();
+ public enum RelativeDateTimeFormatter.Direction {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST_2;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction NEXT;
@@ -20647,9 +20593,7 @@ package android.icu.text {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction THIS;
}
- public static final class RelativeDateTimeFormatter.RelativeDateTimeUnit extends java.lang.Enum {
- method public static android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit valueOf(java.lang.String);
- method public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit[] values();
+ public enum RelativeDateTimeFormatter.RelativeDateTimeUnit {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit DAY;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit FRIDAY;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit HOUR;
@@ -20667,9 +20611,7 @@ package android.icu.text {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit YEAR;
}
- public static final class RelativeDateTimeFormatter.RelativeUnit extends java.lang.Enum {
- method public static android.icu.text.RelativeDateTimeFormatter.RelativeUnit valueOf(java.lang.String);
- method public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit[] values();
+ public enum RelativeDateTimeFormatter.RelativeUnit {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit DAYS;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit HOURS;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit MINUTES;
@@ -20679,37 +20621,35 @@ package android.icu.text {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit YEARS;
}
- public static final class RelativeDateTimeFormatter.Style extends java.lang.Enum {
- method public static android.icu.text.RelativeDateTimeFormatter.Style valueOf(java.lang.String);
- method public static final android.icu.text.RelativeDateTimeFormatter.Style[] values();
+ public enum RelativeDateTimeFormatter.Style {
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style LONG;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style NARROW;
enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style SHORT;
}
- public abstract interface Replaceable {
- method public abstract int char32At(int);
- method public abstract char charAt(int);
- method public abstract void copy(int, int, int);
- method public abstract void getChars(int, int, char[], int);
- method public abstract boolean hasMetaData();
- method public abstract int length();
- method public abstract void replace(int, int, java.lang.String);
- method public abstract void replace(int, int, char[], int, int);
+ public interface Replaceable {
+ method public int char32At(int);
+ method public char charAt(int);
+ method public void copy(int, int, int);
+ method public void getChars(int, int, char[], int);
+ method public boolean hasMetaData();
+ method public int length();
+ method public void replace(int, int, String);
+ method public void replace(int, int, char[], int, int);
}
public final class RuleBasedCollator extends android.icu.text.Collator {
- ctor public RuleBasedCollator(java.lang.String) throws java.lang.Exception;
+ ctor public RuleBasedCollator(String) throws java.lang.Exception;
method public android.icu.text.RuleBasedCollator cloneAsThawed();
- method public int compare(java.lang.String, java.lang.String);
- method public android.icu.text.CollationElementIterator getCollationElementIterator(java.lang.String);
+ method public int compare(String, String);
+ method public android.icu.text.CollationElementIterator getCollationElementIterator(String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
method public android.icu.text.CollationElementIterator getCollationElementIterator(android.icu.text.UCharacterIterator);
- method public android.icu.text.CollationKey getCollationKey(java.lang.String);
+ method public android.icu.text.CollationKey getCollationKey(String);
method public void getContractionsAndExpansions(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet, boolean) throws java.lang.Exception;
method public boolean getNumericCollation();
- method public java.lang.String getRules();
- method public java.lang.String getRules(boolean);
+ method public String getRules();
+ method public String getRules(boolean);
method public android.icu.util.VersionInfo getUCAVersion();
method public int getVariableTop();
method public android.icu.util.VersionInfo getVersion();
@@ -20735,9 +20675,9 @@ package android.icu.text {
}
public final class ScientificNumberFormatter {
- method public java.lang.String format(java.lang.Object);
- method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.util.ULocale, java.lang.String, java.lang.String);
- method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.text.DecimalFormat, java.lang.String, java.lang.String);
+ method public String format(Object);
+ method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.util.ULocale, String, String);
+ method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.text.DecimalFormat, String, String);
method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.util.ULocale);
method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.text.DecimalFormat);
}
@@ -20751,7 +20691,7 @@ package android.icu.text {
method public abstract int getIndex();
method public int getMatchLength();
method public int getMatchStart();
- method public java.lang.String getMatchedText();
+ method public String getMatchedText();
method public java.text.CharacterIterator getTarget();
method protected abstract int handleNext(int);
method protected abstract int handlePrevious(int);
@@ -20773,57 +20713,55 @@ package android.icu.text {
field protected java.text.CharacterIterator targetText;
}
- public static final class SearchIterator.ElementComparisonType extends java.lang.Enum {
- method public static android.icu.text.SearchIterator.ElementComparisonType valueOf(java.lang.String);
- method public static final android.icu.text.SearchIterator.ElementComparisonType[] values();
+ public enum SearchIterator.ElementComparisonType {
enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType ANY_BASE_WEIGHT_IS_WILDCARD;
enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType PATTERN_BASE_WEIGHT_IS_WILDCARD;
enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType STANDARD_ELEMENT_COMPARISON;
}
public class SelectFormat extends java.text.Format {
- ctor public SelectFormat(java.lang.String);
- method public void applyPattern(java.lang.String);
- method public final java.lang.String format(java.lang.String);
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public java.lang.String toPattern();
+ ctor public SelectFormat(String);
+ method public void applyPattern(String);
+ method public final String format(String);
+ method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public Object parseObject(String, java.text.ParsePosition);
+ method public String toPattern();
}
public class SimpleDateFormat extends android.icu.text.DateFormat {
ctor public SimpleDateFormat();
- ctor public SimpleDateFormat(java.lang.String);
- ctor public SimpleDateFormat(java.lang.String, java.util.Locale);
- ctor public SimpleDateFormat(java.lang.String, android.icu.util.ULocale);
- ctor public SimpleDateFormat(java.lang.String, java.lang.String, android.icu.util.ULocale);
- ctor public SimpleDateFormat(java.lang.String, android.icu.text.DateFormatSymbols);
- method public void applyLocalizedPattern(java.lang.String);
- method public void applyPattern(java.lang.String);
- method public java.lang.StringBuffer format(android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
+ ctor public SimpleDateFormat(String);
+ ctor public SimpleDateFormat(String, java.util.Locale);
+ ctor public SimpleDateFormat(String, android.icu.util.ULocale);
+ ctor public SimpleDateFormat(String, String, android.icu.util.ULocale);
+ ctor public SimpleDateFormat(String, android.icu.text.DateFormatSymbols);
+ method public void applyLocalizedPattern(String);
+ method public void applyPattern(String);
+ method public StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
method public java.util.Date get2DigitYearStart();
method public android.icu.text.DateFormatSymbols getDateFormatSymbols();
method public android.icu.text.NumberFormat getNumberFormat(char);
method protected android.icu.text.DateFormatSymbols getSymbols();
method public android.icu.text.TimeZoneFormat getTimeZoneFormat();
- method protected int matchQuarterString(java.lang.String, int, int, java.lang.String[], android.icu.util.Calendar);
- method protected int matchString(java.lang.String, int, int, java.lang.String[], android.icu.util.Calendar);
- method public void parse(java.lang.String, android.icu.util.Calendar, java.text.ParsePosition);
+ method protected int matchQuarterString(String, int, int, String[], android.icu.util.Calendar);
+ method protected int matchString(String, int, int, String[], android.icu.util.Calendar);
+ method public void parse(String, android.icu.util.Calendar, java.text.ParsePosition);
method protected android.icu.text.DateFormat.Field patternCharToDateFormatField(char);
method public void set2DigitYearStart(java.util.Date);
method public void setDateFormatSymbols(android.icu.text.DateFormatSymbols);
- method public void setNumberFormat(java.lang.String, android.icu.text.NumberFormat);
+ method public void setNumberFormat(String, android.icu.text.NumberFormat);
method public void setTimeZoneFormat(android.icu.text.TimeZoneFormat);
- method protected java.lang.String subFormat(char, int, int, java.text.FieldPosition, android.icu.text.DateFormatSymbols, android.icu.util.Calendar) throws java.lang.IllegalArgumentException;
- method protected int subParse(java.lang.String, int, char, int, boolean, boolean, boolean[], android.icu.util.Calendar);
- method public java.lang.String toLocalizedPattern();
- method public java.lang.String toPattern();
- method protected java.lang.String zeroPaddingNumber(long, int, int);
+ method protected String subFormat(char, int, int, java.text.FieldPosition, android.icu.text.DateFormatSymbols, android.icu.util.Calendar) throws java.lang.IllegalArgumentException;
+ method protected int subParse(String, int, char, int, boolean, boolean, boolean[], android.icu.util.Calendar);
+ method public String toLocalizedPattern();
+ method public String toPattern();
+ method protected String zeroPaddingNumber(long, int, int);
}
public class StringPrepParseException extends java.text.ParseException {
- ctor public StringPrepParseException(java.lang.String, int);
- ctor public StringPrepParseException(java.lang.String, int, java.lang.String, int);
- ctor public StringPrepParseException(java.lang.String, int, java.lang.String, int, int);
+ ctor public StringPrepParseException(String, int);
+ ctor public StringPrepParseException(String, int, String, int);
+ ctor public StringPrepParseException(String, int, String, int, int);
method public int getError();
field public static final int ACE_PREFIX_ERROR = 6; // 0x6
field public static final int BUFFER_OVERFLOW_ERROR = 9; // 0x9
@@ -20840,68 +20778,66 @@ package android.icu.text {
}
public final class StringSearch extends android.icu.text.SearchIterator {
- ctor public StringSearch(java.lang.String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator, android.icu.text.BreakIterator);
- ctor public StringSearch(java.lang.String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator);
- ctor public StringSearch(java.lang.String, java.text.CharacterIterator, java.util.Locale);
- ctor public StringSearch(java.lang.String, java.text.CharacterIterator, android.icu.util.ULocale);
- ctor public StringSearch(java.lang.String, java.lang.String);
+ ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator, android.icu.text.BreakIterator);
+ ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator);
+ ctor public StringSearch(String, java.text.CharacterIterator, java.util.Locale);
+ ctor public StringSearch(String, java.text.CharacterIterator, android.icu.util.ULocale);
+ ctor public StringSearch(String, String);
method public android.icu.text.RuleBasedCollator getCollator();
method public int getIndex();
- method public java.lang.String getPattern();
+ method public String getPattern();
method protected int handleNext(int);
method protected int handlePrevious(int);
method public boolean isCanonical();
method public void setCanonical(boolean);
method public void setCollator(android.icu.text.RuleBasedCollator);
- method public void setPattern(java.lang.String);
+ method public void setPattern(String);
}
- public abstract interface SymbolTable {
- method public abstract char[] lookup(java.lang.String);
- method public abstract android.icu.text.UnicodeMatcher lookupMatcher(int);
- method public abstract java.lang.String parseReference(java.lang.String, java.text.ParsePosition, int);
+ public interface SymbolTable {
+ method public char[] lookup(String);
+ method public android.icu.text.UnicodeMatcher lookupMatcher(int);
+ method public String parseReference(String, java.text.ParsePosition, int);
field public static final char SYMBOL_REF = 36; // 0x0024 '$'
}
- public class TimeZoneFormat extends android.icu.text.UFormat implements android.icu.util.Freezable java.io.Serializable {
+ public class TimeZoneFormat extends android.icu.text.UFormat implements android.icu.util.Freezable<android.icu.text.TimeZoneFormat> java.io.Serializable {
ctor protected TimeZoneFormat(android.icu.util.ULocale);
method public android.icu.text.TimeZoneFormat cloneAsThawed();
- method public final java.lang.String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long);
- method public java.lang.String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.String formatOffsetISO8601Basic(int, boolean, boolean, boolean);
- method public final java.lang.String formatOffsetISO8601Extended(int, boolean, boolean, boolean);
- method public java.lang.String formatOffsetLocalizedGMT(int);
- method public java.lang.String formatOffsetShortLocalizedGMT(int);
+ method public final String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long);
+ method public String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
+ method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public final String formatOffsetISO8601Basic(int, boolean, boolean, boolean);
+ method public final String formatOffsetISO8601Extended(int, boolean, boolean, boolean);
+ method public String formatOffsetLocalizedGMT(int);
+ method public String formatOffsetShortLocalizedGMT(int);
method public android.icu.text.TimeZoneFormat freeze();
method public java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption> getDefaultParseOptions();
- method public java.lang.String getGMTOffsetDigits();
- method public java.lang.String getGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType);
- method public java.lang.String getGMTPattern();
- method public java.lang.String getGMTZeroFormat();
+ method public String getGMTOffsetDigits();
+ method public String getGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType);
+ method public String getGMTPattern();
+ method public String getGMTZeroFormat();
method public static android.icu.text.TimeZoneFormat getInstance(android.icu.util.ULocale);
method public static android.icu.text.TimeZoneFormat getInstance(java.util.Locale);
method public android.icu.text.TimeZoneNames getTimeZoneNames();
method public boolean isFrozen();
- method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, java.lang.String, java.text.ParsePosition, java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, java.lang.String, java.text.ParsePosition, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public final android.icu.util.TimeZone parse(java.lang.String, java.text.ParsePosition);
- method public final android.icu.util.TimeZone parse(java.lang.String) throws java.text.ParseException;
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public final int parseOffsetISO8601(java.lang.String, java.text.ParsePosition);
- method public int parseOffsetLocalizedGMT(java.lang.String, java.text.ParsePosition);
- method public int parseOffsetShortLocalizedGMT(java.lang.String, java.text.ParsePosition);
+ method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
+ method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
+ method public final android.icu.util.TimeZone parse(String, java.text.ParsePosition);
+ method public final android.icu.util.TimeZone parse(String) throws java.text.ParseException;
+ method public Object parseObject(String, java.text.ParsePosition);
+ method public final int parseOffsetISO8601(String, java.text.ParsePosition);
+ method public int parseOffsetLocalizedGMT(String, java.text.ParsePosition);
+ method public int parseOffsetShortLocalizedGMT(String, java.text.ParsePosition);
method public android.icu.text.TimeZoneFormat setDefaultParseOptions(java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>);
- method public android.icu.text.TimeZoneFormat setGMTOffsetDigits(java.lang.String);
- method public android.icu.text.TimeZoneFormat setGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType, java.lang.String);
- method public android.icu.text.TimeZoneFormat setGMTPattern(java.lang.String);
- method public android.icu.text.TimeZoneFormat setGMTZeroFormat(java.lang.String);
+ method public android.icu.text.TimeZoneFormat setGMTOffsetDigits(String);
+ method public android.icu.text.TimeZoneFormat setGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType, String);
+ method public android.icu.text.TimeZoneFormat setGMTPattern(String);
+ method public android.icu.text.TimeZoneFormat setGMTZeroFormat(String);
method public android.icu.text.TimeZoneFormat setTimeZoneNames(android.icu.text.TimeZoneNames);
}
- public static final class TimeZoneFormat.GMTOffsetPatternType extends java.lang.Enum {
- method public static android.icu.text.TimeZoneFormat.GMTOffsetPatternType valueOf(java.lang.String);
- method public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType[] values();
+ public enum TimeZoneFormat.GMTOffsetPatternType {
enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_H;
enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HM;
enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HMS;
@@ -20910,16 +20846,12 @@ package android.icu.text {
enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_HMS;
}
- public static final class TimeZoneFormat.ParseOption extends java.lang.Enum {
- method public static android.icu.text.TimeZoneFormat.ParseOption valueOf(java.lang.String);
- method public static final android.icu.text.TimeZoneFormat.ParseOption[] values();
+ public enum TimeZoneFormat.ParseOption {
enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption ALL_STYLES;
enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption TZ_DATABASE_ABBREVIATIONS;
}
- public static final class TimeZoneFormat.Style extends java.lang.Enum {
- method public static android.icu.text.TimeZoneFormat.Style valueOf(java.lang.String);
- method public static final android.icu.text.TimeZoneFormat.Style[] values();
+ public enum TimeZoneFormat.Style {
enum_constant public static final android.icu.text.TimeZoneFormat.Style EXEMPLAR_LOCATION;
enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LOCATION;
enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LONG;
@@ -20942,9 +20874,7 @@ package android.icu.text {
enum_constant public static final android.icu.text.TimeZoneFormat.Style ZONE_ID_SHORT;
}
- public static final class TimeZoneFormat.TimeType extends java.lang.Enum {
- method public static android.icu.text.TimeZoneFormat.TimeType valueOf(java.lang.String);
- method public static final android.icu.text.TimeZoneFormat.TimeType[] values();
+ public enum TimeZoneFormat.TimeType {
enum_constant public static final android.icu.text.TimeZoneFormat.TimeType DAYLIGHT;
enum_constant public static final android.icu.text.TimeZoneFormat.TimeType STANDARD;
enum_constant public static final android.icu.text.TimeZoneFormat.TimeType UNKNOWN;
@@ -20952,21 +20882,19 @@ package android.icu.text {
public abstract class TimeZoneNames implements java.io.Serializable {
method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs();
- method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs(java.lang.String);
- method public final java.lang.String getDisplayName(java.lang.String, android.icu.text.TimeZoneNames.NameType, long);
- method public java.lang.String getExemplarLocationName(java.lang.String);
+ method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs(String);
+ method public final String getDisplayName(String, android.icu.text.TimeZoneNames.NameType, long);
+ method public String getExemplarLocationName(String);
method public static android.icu.text.TimeZoneNames getInstance(android.icu.util.ULocale);
method public static android.icu.text.TimeZoneNames getInstance(java.util.Locale);
- method public abstract java.lang.String getMetaZoneDisplayName(java.lang.String, android.icu.text.TimeZoneNames.NameType);
- method public abstract java.lang.String getMetaZoneID(java.lang.String, long);
- method public abstract java.lang.String getReferenceZoneID(java.lang.String, java.lang.String);
+ method public abstract String getMetaZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType);
+ method public abstract String getMetaZoneID(String, long);
+ method public abstract String getReferenceZoneID(String, String);
method public static android.icu.text.TimeZoneNames getTZDBInstance(android.icu.util.ULocale);
- method public abstract java.lang.String getTimeZoneDisplayName(java.lang.String, android.icu.text.TimeZoneNames.NameType);
+ method public abstract String getTimeZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType);
}
- public static final class TimeZoneNames.NameType extends java.lang.Enum {
- method public static android.icu.text.TimeZoneNames.NameType valueOf(java.lang.String);
- method public static final android.icu.text.TimeZoneNames.NameType[] values();
+ public enum TimeZoneNames.NameType {
enum_constant public static final android.icu.text.TimeZoneNames.NameType EXEMPLAR_LOCATION;
enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_DAYLIGHT;
enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_GENERIC;
@@ -20977,31 +20905,31 @@ package android.icu.text {
}
public abstract class Transliterator {
- method public static final android.icu.text.Transliterator createFromRules(java.lang.String, java.lang.String, int);
+ method public static final android.icu.text.Transliterator createFromRules(String, String, int);
method public void filteredTransliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, boolean);
method public final void finishTransliteration(android.icu.text.Replaceable, android.icu.text.Transliterator.Position);
method public static final java.util.Enumeration<java.lang.String> getAvailableIDs();
method public static final java.util.Enumeration<java.lang.String> getAvailableSources();
- method public static final java.util.Enumeration<java.lang.String> getAvailableTargets(java.lang.String);
- method public static final java.util.Enumeration<java.lang.String> getAvailableVariants(java.lang.String, java.lang.String);
- method public static final java.lang.String getDisplayName(java.lang.String);
- method public static java.lang.String getDisplayName(java.lang.String, java.util.Locale);
- method public static java.lang.String getDisplayName(java.lang.String, android.icu.util.ULocale);
+ method public static final java.util.Enumeration<java.lang.String> getAvailableTargets(String);
+ method public static final java.util.Enumeration<java.lang.String> getAvailableVariants(String, String);
+ method public static final String getDisplayName(String);
+ method public static String getDisplayName(String, java.util.Locale);
+ method public static String getDisplayName(String, android.icu.util.ULocale);
method public android.icu.text.Transliterator[] getElements();
method public final android.icu.text.UnicodeFilter getFilter();
- method public final java.lang.String getID();
- method public static final android.icu.text.Transliterator getInstance(java.lang.String);
- method public static android.icu.text.Transliterator getInstance(java.lang.String, int);
+ method public final String getID();
+ method public static final android.icu.text.Transliterator getInstance(String);
+ method public static android.icu.text.Transliterator getInstance(String, int);
method public final android.icu.text.Transliterator getInverse();
method public final int getMaximumContextLength();
method public final android.icu.text.UnicodeSet getSourceSet();
method public android.icu.text.UnicodeSet getTargetSet();
method public void setFilter(android.icu.text.UnicodeFilter);
- method public java.lang.String toRules(boolean);
+ method public String toRules(boolean);
method public final int transliterate(android.icu.text.Replaceable, int, int);
method public final void transliterate(android.icu.text.Replaceable);
- method public final java.lang.String transliterate(java.lang.String);
- method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, java.lang.String);
+ method public final String transliterate(String);
+ method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, String);
method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, int);
method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position);
field public static final int FORWARD = 0; // 0x0
@@ -21023,21 +20951,21 @@ package android.icu.text {
public abstract class UCharacterIterator implements java.lang.Cloneable {
ctor protected UCharacterIterator();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
method public abstract int current();
method public int currentCodePoint();
method public java.text.CharacterIterator getCharacterIterator();
method public abstract int getIndex();
method public static final android.icu.text.UCharacterIterator getInstance(android.icu.text.Replaceable);
- method public static final android.icu.text.UCharacterIterator getInstance(java.lang.String);
+ method public static final android.icu.text.UCharacterIterator getInstance(String);
method public static final android.icu.text.UCharacterIterator getInstance(char[]);
method public static final android.icu.text.UCharacterIterator getInstance(char[], int, int);
- method public static final android.icu.text.UCharacterIterator getInstance(java.lang.StringBuffer);
+ method public static final android.icu.text.UCharacterIterator getInstance(StringBuffer);
method public static final android.icu.text.UCharacterIterator getInstance(java.text.CharacterIterator);
method public abstract int getLength();
method public abstract int getText(char[], int);
method public final int getText(char[]);
- method public java.lang.String getText();
+ method public String getText();
method public int moveCodePointIndex(int);
method public int moveIndex(int);
method public abstract int next();
@@ -21059,78 +20987,78 @@ package android.icu.text {
method public int matches(android.icu.text.Replaceable, int[], int, boolean);
}
- public abstract interface UnicodeMatcher {
- method public abstract void addMatchSetTo(android.icu.text.UnicodeSet);
- method public abstract int matches(android.icu.text.Replaceable, int[], int, boolean);
- method public abstract boolean matchesIndexValue(int);
- method public abstract java.lang.String toPattern(boolean);
+ public interface UnicodeMatcher {
+ method public void addMatchSetTo(android.icu.text.UnicodeSet);
+ method public int matches(android.icu.text.Replaceable, int[], int, boolean);
+ method public boolean matchesIndexValue(int);
+ method public String toPattern(boolean);
field public static final char ETHER = 65535; // 0xffff '\uffff'
field public static final int U_MATCH = 2; // 0x2
field public static final int U_MISMATCH = 0; // 0x0
field public static final int U_PARTIAL_MATCH = 1; // 0x1
}
- public class UnicodeSet extends android.icu.text.UnicodeFilter implements java.lang.Comparable android.icu.util.Freezable java.lang.Iterable {
+ public class UnicodeSet extends android.icu.text.UnicodeFilter implements java.lang.Comparable<android.icu.text.UnicodeSet> android.icu.util.Freezable<android.icu.text.UnicodeSet> java.lang.Iterable<java.lang.String> {
ctor public UnicodeSet();
ctor public UnicodeSet(android.icu.text.UnicodeSet);
ctor public UnicodeSet(int, int);
ctor public UnicodeSet(int...);
- ctor public UnicodeSet(java.lang.String);
- ctor public UnicodeSet(java.lang.String, boolean);
- ctor public UnicodeSet(java.lang.String, int);
- ctor public UnicodeSet(java.lang.String, java.text.ParsePosition, android.icu.text.SymbolTable);
- ctor public UnicodeSet(java.lang.String, java.text.ParsePosition, android.icu.text.SymbolTable, int);
- method public java.lang.StringBuffer _generatePattern(java.lang.StringBuffer, boolean);
- method public java.lang.StringBuffer _generatePattern(java.lang.StringBuffer, boolean, boolean);
+ ctor public UnicodeSet(String);
+ ctor public UnicodeSet(String, boolean);
+ ctor public UnicodeSet(String, int);
+ ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable);
+ ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable, int);
+ method public StringBuffer _generatePattern(StringBuffer, boolean);
+ method public StringBuffer _generatePattern(StringBuffer, boolean, boolean);
method public android.icu.text.UnicodeSet add(int, int);
method public final android.icu.text.UnicodeSet add(int);
- method public final android.icu.text.UnicodeSet add(java.lang.CharSequence);
- method public android.icu.text.UnicodeSet add(java.lang.Iterable<?>);
+ method public final android.icu.text.UnicodeSet add(CharSequence);
+ method public android.icu.text.UnicodeSet add(Iterable<?>);
method public android.icu.text.UnicodeSet addAll(int, int);
- method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence);
+ method public final android.icu.text.UnicodeSet addAll(CharSequence);
method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet);
- method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>);
+ method public android.icu.text.UnicodeSet addAll(Iterable<?>);
method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...);
method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
method public void addMatchSetTo(android.icu.text.UnicodeSet);
method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int);
- method public final android.icu.text.UnicodeSet applyPattern(java.lang.String);
- method public android.icu.text.UnicodeSet applyPattern(java.lang.String, boolean);
- method public android.icu.text.UnicodeSet applyPattern(java.lang.String, int);
- method public android.icu.text.UnicodeSet applyPropertyAlias(java.lang.String, java.lang.String);
- method public android.icu.text.UnicodeSet applyPropertyAlias(java.lang.String, java.lang.String, android.icu.text.SymbolTable);
+ method public final android.icu.text.UnicodeSet applyPattern(String);
+ method public android.icu.text.UnicodeSet applyPattern(String, boolean);
+ method public android.icu.text.UnicodeSet applyPattern(String, int);
+ method public android.icu.text.UnicodeSet applyPropertyAlias(String, String);
+ method public android.icu.text.UnicodeSet applyPropertyAlias(String, String, android.icu.text.SymbolTable);
method public int charAt(int);
method public android.icu.text.UnicodeSet clear();
- method public java.lang.Object clone();
+ method public Object clone();
method public android.icu.text.UnicodeSet cloneAsThawed();
method public android.icu.text.UnicodeSet closeOver(int);
method public android.icu.text.UnicodeSet compact();
method public int compareTo(android.icu.text.UnicodeSet);
method public int compareTo(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet.ComparisonStyle);
- method public int compareTo(java.lang.Iterable<java.lang.String>);
+ method public int compareTo(Iterable<java.lang.String>);
method public android.icu.text.UnicodeSet complement(int, int);
method public final android.icu.text.UnicodeSet complement(int);
method public android.icu.text.UnicodeSet complement();
- method public final android.icu.text.UnicodeSet complement(java.lang.CharSequence);
- method public final android.icu.text.UnicodeSet complementAll(java.lang.CharSequence);
+ method public final android.icu.text.UnicodeSet complement(CharSequence);
+ method public final android.icu.text.UnicodeSet complementAll(CharSequence);
method public android.icu.text.UnicodeSet complementAll(android.icu.text.UnicodeSet);
method public boolean contains(int);
method public boolean contains(int, int);
- method public final boolean contains(java.lang.CharSequence);
+ method public final boolean contains(CharSequence);
method public boolean containsAll(android.icu.text.UnicodeSet);
- method public boolean containsAll(java.lang.String);
- method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>);
+ method public boolean containsAll(String);
+ method public <T extends java.lang.CharSequence> boolean containsAll(Iterable<T>);
method public boolean containsNone(int, int);
method public boolean containsNone(android.icu.text.UnicodeSet);
- method public boolean containsNone(java.lang.CharSequence);
- method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>);
+ method public boolean containsNone(CharSequence);
+ method public <T extends java.lang.CharSequence> boolean containsNone(Iterable<T>);
method public final boolean containsSome(int, int);
method public final boolean containsSome(android.icu.text.UnicodeSet);
- method public final boolean containsSome(java.lang.CharSequence);
- method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>);
+ method public final boolean containsSome(CharSequence);
+ method public final <T extends java.lang.CharSequence> boolean containsSome(Iterable<T>);
method public android.icu.text.UnicodeSet freeze();
- method public static android.icu.text.UnicodeSet from(java.lang.CharSequence);
- method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence);
+ method public static android.icu.text.UnicodeSet from(CharSequence);
+ method public static android.icu.text.UnicodeSet fromAll(CharSequence);
method public int getRangeCount();
method public int getRangeEnd(int);
method public int getRangeStart(int);
@@ -21139,29 +21067,29 @@ package android.icu.text {
method public boolean isFrozen();
method public java.util.Iterator<java.lang.String> iterator();
method public boolean matchesIndexValue(int);
- method public java.lang.Iterable<android.icu.text.UnicodeSet.EntryRange> ranges();
+ method public Iterable<android.icu.text.UnicodeSet.EntryRange> ranges();
method public android.icu.text.UnicodeSet remove(int, int);
method public final android.icu.text.UnicodeSet remove(int);
- method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence);
- method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence);
+ method public final android.icu.text.UnicodeSet remove(CharSequence);
+ method public final android.icu.text.UnicodeSet removeAll(CharSequence);
method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet);
- method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
+ method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(Iterable<T>);
method public final android.icu.text.UnicodeSet removeAllStrings();
method public android.icu.text.UnicodeSet retain(int, int);
method public final android.icu.text.UnicodeSet retain(int);
- method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence);
- method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence);
+ method public final android.icu.text.UnicodeSet retain(CharSequence);
+ method public final android.icu.text.UnicodeSet retainAll(CharSequence);
method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet);
- method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
+ method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(Iterable<T>);
method public android.icu.text.UnicodeSet set(int, int);
method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet);
method public int size();
- method public int span(java.lang.CharSequence, android.icu.text.UnicodeSet.SpanCondition);
- method public int span(java.lang.CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
- method public int spanBack(java.lang.CharSequence, android.icu.text.UnicodeSet.SpanCondition);
- method public int spanBack(java.lang.CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
+ method public int span(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
+ method public int span(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
+ method public int spanBack(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
+ method public int spanBack(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
method public java.util.Collection<java.lang.String> strings();
- method public java.lang.String toPattern(boolean);
+ method public String toPattern(boolean);
field public static final int ADD_CASE_MAPPINGS = 4; // 0x4
field public static final android.icu.text.UnicodeSet ALL_CODE_POINTS;
field public static final int CASE = 2; // 0x2
@@ -21172,9 +21100,7 @@ package android.icu.text {
field public static final int MIN_VALUE = 0; // 0x0
}
- public static final class UnicodeSet.ComparisonStyle extends java.lang.Enum {
- method public static android.icu.text.UnicodeSet.ComparisonStyle valueOf(java.lang.String);
- method public static final android.icu.text.UnicodeSet.ComparisonStyle[] values();
+ public enum UnicodeSet.ComparisonStyle {
enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LEXICOGRAPHIC;
enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LONGER_FIRST;
enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle SHORTER_FIRST;
@@ -21185,9 +21111,7 @@ package android.icu.text {
field public int codepointEnd;
}
- public static final class UnicodeSet.SpanCondition extends java.lang.Enum {
- method public static android.icu.text.UnicodeSet.SpanCondition valueOf(java.lang.String);
- method public static final android.icu.text.UnicodeSet.SpanCondition[] values();
+ public enum UnicodeSet.SpanCondition {
enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONDITION_COUNT;
enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONTAINED;
enum_constant public static final android.icu.text.UnicodeSet.SpanCondition NOT_CONTAINED;
@@ -21197,7 +21121,7 @@ package android.icu.text {
public class UnicodeSetIterator {
ctor public UnicodeSetIterator(android.icu.text.UnicodeSet);
ctor public UnicodeSetIterator();
- method public java.lang.String getString();
+ method public String getString();
method public boolean next();
method public boolean nextRange();
method public void reset(android.icu.text.UnicodeSet);
@@ -21205,35 +21129,31 @@ package android.icu.text {
field public static int IS_STRING;
field public int codepoint;
field public int codepointEnd;
- field public java.lang.String string;
+ field public String string;
}
public class UnicodeSetSpanner {
ctor public UnicodeSetSpanner(android.icu.text.UnicodeSet);
- method public int countIn(java.lang.CharSequence);
- method public int countIn(java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
- method public int countIn(java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
- method public java.lang.String deleteFrom(java.lang.CharSequence);
- method public java.lang.String deleteFrom(java.lang.CharSequence, android.icu.text.UnicodeSet.SpanCondition);
+ method public int countIn(CharSequence);
+ method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
+ method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
+ method public String deleteFrom(CharSequence);
+ method public String deleteFrom(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
method public android.icu.text.UnicodeSet getUnicodeSet();
- method public java.lang.String replaceFrom(java.lang.CharSequence, java.lang.CharSequence);
- method public java.lang.String replaceFrom(java.lang.CharSequence, java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
- method public java.lang.String replaceFrom(java.lang.CharSequence, java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
- method public java.lang.CharSequence trim(java.lang.CharSequence);
- method public java.lang.CharSequence trim(java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption);
- method public java.lang.CharSequence trim(java.lang.CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption, android.icu.text.UnicodeSet.SpanCondition);
+ method public String replaceFrom(CharSequence, CharSequence);
+ method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
+ method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
+ method public CharSequence trim(CharSequence);
+ method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption);
+ method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption, android.icu.text.UnicodeSet.SpanCondition);
}
- public static final class UnicodeSetSpanner.CountMethod extends java.lang.Enum {
- method public static android.icu.text.UnicodeSetSpanner.CountMethod valueOf(java.lang.String);
- method public static final android.icu.text.UnicodeSetSpanner.CountMethod[] values();
+ public enum UnicodeSetSpanner.CountMethod {
enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod MIN_ELEMENTS;
enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod WHOLE_SPAN;
}
- public static final class UnicodeSetSpanner.TrimOption extends java.lang.Enum {
- method public static android.icu.text.UnicodeSetSpanner.TrimOption valueOf(java.lang.String);
- method public static final android.icu.text.UnicodeSetSpanner.TrimOption[] values();
+ public enum UnicodeSetSpanner.TrimOption {
enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption BOTH;
enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption LEADING;
enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption TRAILING;
@@ -21256,27 +21176,27 @@ package android.icu.util {
field public static final int BE = 0; // 0x0
}
- public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable java.io.Serializable {
+ public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable<android.icu.util.Calendar> java.io.Serializable {
ctor protected Calendar();
ctor protected Calendar(android.icu.util.TimeZone, java.util.Locale);
ctor protected Calendar(android.icu.util.TimeZone, android.icu.util.ULocale);
method public void add(int, int);
- method public boolean after(java.lang.Object);
- method public boolean before(java.lang.Object);
+ method public boolean after(Object);
+ method public boolean before(Object);
method public final void clear();
method public final void clear(int);
- method public java.lang.Object clone();
+ method public Object clone();
method public int compareTo(android.icu.util.Calendar);
method protected void complete();
method protected void computeFields();
method protected final void computeGregorianFields(int);
method protected int computeGregorianMonthStart(int, int);
method protected int computeJulianDay();
- method protected deprecated int computeMillisInDay();
+ method @Deprecated protected int computeMillisInDay();
method protected void computeTime();
- method protected deprecated int computeZoneOffset(long, int);
+ method @Deprecated protected int computeZoneOffset(long, int);
method public int fieldDifference(java.util.Date, int);
- method protected java.lang.String fieldName(int);
+ method protected String fieldName(int);
method protected static final long floorDivide(long, long);
method protected static final int floorDivide(int, int);
method protected static final int floorDivide(int, int, int[]);
@@ -21287,8 +21207,8 @@ package android.icu.util {
method public static java.util.Locale[] getAvailableLocales();
method public android.icu.text.DateFormat getDateTimeFormat(int, int, java.util.Locale);
method public android.icu.text.DateFormat getDateTimeFormat(int, int, android.icu.util.ULocale);
- method public java.lang.String getDisplayName(java.util.Locale);
- method public java.lang.String getDisplayName(android.icu.util.ULocale);
+ method public String getDisplayName(java.util.Locale);
+ method public String getDisplayName(android.icu.util.ULocale);
method public final int getFieldCount();
method protected int[][][] getFieldResolutionTable();
method public int getFirstDayOfWeek();
@@ -21303,7 +21223,7 @@ package android.icu.util {
method public static android.icu.util.Calendar getInstance(android.icu.util.ULocale);
method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, java.util.Locale);
method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, android.icu.util.ULocale);
- method public static final java.lang.String[] getKeywordValuesForLocale(java.lang.String, android.icu.util.ULocale, boolean);
+ method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
method public final int getLeastMaximum(int);
method protected int getLimit(int, int);
method public final int getMaximum(int);
@@ -21315,18 +21235,18 @@ package android.icu.util {
method public final java.util.Date getTime();
method public long getTimeInMillis();
method public android.icu.util.TimeZone getTimeZone();
- method public java.lang.String getType();
+ method public String getType();
method public android.icu.util.Calendar.WeekData getWeekData();
- method public static android.icu.util.Calendar.WeekData getWeekDataForRegion(java.lang.String);
+ method public static android.icu.util.Calendar.WeekData getWeekDataForRegion(String);
method protected static final int gregorianMonthLength(int, int);
method protected static final int gregorianPreviousMonthLength(int, int);
method protected void handleComputeFields(int);
method protected int handleComputeJulianDay(int);
method protected abstract int handleComputeMonthStart(int, int, boolean);
method protected int[] handleCreateFields();
- method protected android.icu.text.DateFormat handleGetDateFormat(java.lang.String, java.util.Locale);
- method protected android.icu.text.DateFormat handleGetDateFormat(java.lang.String, java.lang.String, java.util.Locale);
- method protected android.icu.text.DateFormat handleGetDateFormat(java.lang.String, android.icu.util.ULocale);
+ method protected android.icu.text.DateFormat handleGetDateFormat(String, java.util.Locale);
+ method protected android.icu.text.DateFormat handleGetDateFormat(String, String, java.util.Locale);
+ method protected android.icu.text.DateFormat handleGetDateFormat(String, android.icu.util.ULocale);
method protected abstract int handleGetExtendedYear();
method protected abstract int handleGetLimit(int, int);
method protected int handleGetMonthLength(int, int);
@@ -21373,7 +21293,7 @@ package android.icu.util {
field public static final int AM_PM = 9; // 0x9
field public static final int APRIL = 3; // 0x3
field public static final int AUGUST = 7; // 0x7
- field protected static final deprecated int BASE_FIELD_COUNT = 23; // 0x17
+ field @Deprecated protected static final int BASE_FIELD_COUNT = 23; // 0x17
field public static final int DATE = 5; // 0x5
field public static final int DAY_OF_MONTH = 5; // 0x5
field public static final int DAY_OF_WEEK = 7; // 0x7
@@ -21401,7 +21321,7 @@ package android.icu.util {
field public static final int MARCH = 2; // 0x2
field protected static final int MAXIMUM = 3; // 0x3
field protected static final java.util.Date MAX_DATE;
- field protected static final deprecated int MAX_FIELD_COUNT = 32; // 0x20
+ field @Deprecated protected static final int MAX_FIELD_COUNT = 32; // 0x20
field protected static final int MAX_JULIAN = 2130706432; // 0x7f000000
field protected static final long MAX_MILLIS = 183882168921600000L; // 0x28d47dbbf19b000L
field public static final int MAY = 4; // 0x4
@@ -21466,7 +21386,7 @@ package android.icu.util {
ctor public ChineseCalendar(android.icu.util.ULocale);
ctor public ChineseCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
method protected int handleComputeMonthStart(int, int, boolean);
- method protected android.icu.text.DateFormat handleGetDateFormat(java.lang.String, java.lang.String, android.icu.util.ULocale);
+ method protected android.icu.text.DateFormat handleGetDateFormat(String, String, android.icu.util.ULocale);
method protected int handleGetExtendedYear();
method protected int handleGetLimit(int, int);
}
@@ -21481,8 +21401,10 @@ package android.icu.util {
ctor public CopticCalendar(int, int, int);
ctor public CopticCalendar(java.util.Date);
ctor public CopticCalendar(int, int, int, int, int, int);
- method protected deprecated void handleComputeFields(int);
- method protected deprecated int handleGetExtendedYear();
+ method @Deprecated protected void handleComputeFields(int);
+ method protected int handleComputeMonthStart(int, int, boolean);
+ method @Deprecated protected int handleGetExtendedYear();
+ method protected int handleGetLimit(int, int);
field public static final int AMSHIR = 5; // 0x5
field public static final int BABA = 1; // 0x1
field public static final int BARAMHAT = 6; // 0x6
@@ -21499,50 +21421,48 @@ package android.icu.util {
}
public class Currency extends android.icu.util.MeasureUnit {
- ctor protected Currency(java.lang.String);
+ ctor protected Currency(String);
method public static android.icu.util.Currency fromJavaCurrency(java.util.Currency);
method public static java.util.Set<android.icu.util.Currency> getAvailableCurrencies();
- method public static java.lang.String[] getAvailableCurrencyCodes(android.icu.util.ULocale, java.util.Date);
- method public static java.lang.String[] getAvailableCurrencyCodes(java.util.Locale, java.util.Date);
+ method public static String[] getAvailableCurrencyCodes(android.icu.util.ULocale, java.util.Date);
+ method public static String[] getAvailableCurrencyCodes(java.util.Locale, java.util.Date);
method public static java.util.Locale[] getAvailableLocales();
method public static android.icu.util.ULocale[] getAvailableULocales();
- method public java.lang.String getCurrencyCode();
+ method public String getCurrencyCode();
method public int getDefaultFractionDigits();
method public int getDefaultFractionDigits(android.icu.util.Currency.CurrencyUsage);
- method public java.lang.String getDisplayName();
- method public java.lang.String getDisplayName(java.util.Locale);
+ method public String getDisplayName();
+ method public String getDisplayName(java.util.Locale);
method public static android.icu.util.Currency getInstance(java.util.Locale);
method public static android.icu.util.Currency getInstance(android.icu.util.ULocale);
- method public static android.icu.util.Currency getInstance(java.lang.String);
- method public static final java.lang.String[] getKeywordValuesForLocale(java.lang.String, android.icu.util.ULocale, boolean);
- method public java.lang.String getName(java.util.Locale, int, boolean[]);
- method public java.lang.String getName(android.icu.util.ULocale, int, boolean[]);
- method public java.lang.String getName(java.util.Locale, int, java.lang.String, boolean[]);
- method public java.lang.String getName(android.icu.util.ULocale, int, java.lang.String, boolean[]);
+ method public static android.icu.util.Currency getInstance(String);
+ method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
+ method public String getName(java.util.Locale, int, boolean[]);
+ method public String getName(android.icu.util.ULocale, int, boolean[]);
+ method public String getName(java.util.Locale, int, String, boolean[]);
+ method public String getName(android.icu.util.ULocale, int, String, boolean[]);
method public int getNumericCode();
method public double getRoundingIncrement();
method public double getRoundingIncrement(android.icu.util.Currency.CurrencyUsage);
- method public java.lang.String getSymbol();
- method public java.lang.String getSymbol(java.util.Locale);
- method public java.lang.String getSymbol(android.icu.util.ULocale);
- method public static boolean isAvailable(java.lang.String, java.util.Date, java.util.Date);
+ method public String getSymbol();
+ method public String getSymbol(java.util.Locale);
+ method public String getSymbol(android.icu.util.ULocale);
+ method public static boolean isAvailable(String, java.util.Date, java.util.Date);
method public java.util.Currency toJavaCurrency();
field public static final int LONG_NAME = 1; // 0x1
field public static final int PLURAL_LONG_NAME = 2; // 0x2
field public static final int SYMBOL_NAME = 0; // 0x0
}
- public static final class Currency.CurrencyUsage extends java.lang.Enum {
- method public static android.icu.util.Currency.CurrencyUsage valueOf(java.lang.String);
- method public static final android.icu.util.Currency.CurrencyUsage[] values();
+ public enum Currency.CurrencyUsage {
enum_constant public static final android.icu.util.Currency.CurrencyUsage CASH;
enum_constant public static final android.icu.util.Currency.CurrencyUsage STANDARD;
}
public class CurrencyAmount extends android.icu.util.Measure {
- ctor public CurrencyAmount(java.lang.Number, android.icu.util.Currency);
+ ctor public CurrencyAmount(Number, android.icu.util.Currency);
ctor public CurrencyAmount(double, android.icu.util.Currency);
- ctor public CurrencyAmount(java.lang.Number, java.util.Currency);
+ ctor public CurrencyAmount(Number, java.util.Currency);
ctor public CurrencyAmount(double, java.util.Currency);
method public android.icu.util.Currency getCurrency();
}
@@ -21563,9 +21483,10 @@ package android.icu.util {
ctor public EthiopicCalendar(int, int, int);
ctor public EthiopicCalendar(java.util.Date);
ctor public EthiopicCalendar(int, int, int, int, int, int);
- method protected deprecated void handleComputeFields(int);
- method protected deprecated int handleGetExtendedYear();
- method protected deprecated int handleGetLimit(int, int);
+ method @Deprecated protected void handleComputeFields(int);
+ method protected int handleComputeMonthStart(int, int, boolean);
+ method @Deprecated protected int handleGetExtendedYear();
+ method @Deprecated protected int handleGetLimit(int, int);
method public boolean isAmeteAlemEra();
method public void setAmeteAlemEra(boolean);
field public static final int GENBOT = 8; // 0x8
@@ -21583,10 +21504,10 @@ package android.icu.util {
field public static final int YEKATIT = 5; // 0x5
}
- public abstract interface Freezable<T> implements java.lang.Cloneable {
- method public abstract T cloneAsThawed();
- method public abstract T freeze();
- method public abstract boolean isFrozen();
+ public interface Freezable<T> extends java.lang.Cloneable {
+ method public T cloneAsThawed();
+ method public T freeze();
+ method public boolean isFrozen();
}
public class GregorianCalendar extends android.icu.util.Calendar {
@@ -21624,7 +21545,7 @@ package android.icu.util {
method protected int handleComputeMonthStart(int, int, boolean);
method protected int handleGetExtendedYear();
method protected int handleGetLimit(int, int);
- method protected deprecated void validateField(int);
+ method @Deprecated protected void validateField(int);
field public static final int ADAR = 6; // 0x6
field public static final int ADAR_1 = 5; // 0x5
field public static final int AV = 11; // 0xb
@@ -21642,15 +21563,15 @@ package android.icu.util {
public class ICUUncheckedIOException extends java.lang.RuntimeException {
ctor public ICUUncheckedIOException();
- ctor public ICUUncheckedIOException(java.lang.String);
- ctor public ICUUncheckedIOException(java.lang.Throwable);
- ctor public ICUUncheckedIOException(java.lang.String, java.lang.Throwable);
+ ctor public ICUUncheckedIOException(String);
+ ctor public ICUUncheckedIOException(Throwable);
+ ctor public ICUUncheckedIOException(String, Throwable);
}
public class IllformedLocaleException extends java.lang.RuntimeException {
ctor public IllformedLocaleException();
- ctor public IllformedLocaleException(java.lang.String);
- ctor public IllformedLocaleException(java.lang.String, int);
+ ctor public IllformedLocaleException(String);
+ ctor public IllformedLocaleException(String, int);
method public int getErrorIndex();
}
@@ -21711,9 +21632,7 @@ package android.icu.util {
field public static final int SHAWWAL = 9; // 0x9
}
- public static final class IslamicCalendar.CalculationType extends java.lang.Enum {
- method public static android.icu.util.IslamicCalendar.CalculationType valueOf(java.lang.String);
- method public static final android.icu.util.IslamicCalendar.CalculationType[] values();
+ public enum IslamicCalendar.CalculationType {
enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC;
enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_CIVIL;
enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_TBLA;
@@ -21740,7 +21659,7 @@ package android.icu.util {
public final class LocaleData {
method public static android.icu.util.VersionInfo getCLDRVersion();
- method public java.lang.String getDelimiter(int);
+ method public String getDelimiter(int);
method public static android.icu.util.LocaleData getInstance(android.icu.util.ULocale);
method public static android.icu.util.LocaleData getInstance();
method public static android.icu.util.LocaleData.MeasurementSystem getMeasurementSystem(android.icu.util.ULocale);
@@ -21765,17 +21684,17 @@ package android.icu.util {
}
public class Measure {
- ctor public Measure(java.lang.Number, android.icu.util.MeasureUnit);
- method public java.lang.Number getNumber();
+ ctor public Measure(Number, android.icu.util.MeasureUnit);
+ method public Number getNumber();
method public android.icu.util.MeasureUnit getUnit();
}
public class MeasureUnit implements java.io.Serializable {
- method public static synchronized java.util.Set<android.icu.util.MeasureUnit> getAvailable(java.lang.String);
- method public static synchronized java.util.Set<android.icu.util.MeasureUnit> getAvailable();
- method public static synchronized java.util.Set<java.lang.String> getAvailableTypes();
- method public java.lang.String getSubtype();
- method public java.lang.String getType();
+ method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable(String);
+ method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable();
+ method public static java.util.Set<java.lang.String> getAvailableTypes();
+ method public String getSubtype();
+ method public String getType();
field public static final android.icu.util.MeasureUnit ACRE;
field public static final android.icu.util.MeasureUnit ACRE_FOOT;
field public static final android.icu.util.MeasureUnit AMPERE;
@@ -21919,9 +21838,9 @@ package android.icu.util {
field public T value;
}
- public abstract interface RangeValueIterator {
- method public abstract boolean next(android.icu.util.RangeValueIterator.Element);
- method public abstract void reset();
+ public interface RangeValueIterator {
+ method public boolean next(android.icu.util.RangeValueIterator.Element);
+ method public void reset();
}
public static class RangeValueIterator.Element {
@@ -21949,44 +21868,44 @@ package android.icu.util {
method public static android.icu.util.TimeUnit[] values();
}
- public abstract class TimeZone implements java.lang.Cloneable android.icu.util.Freezable java.io.Serializable {
+ public abstract class TimeZone implements java.lang.Cloneable android.icu.util.Freezable<android.icu.util.TimeZone> java.io.Serializable {
ctor public TimeZone();
- method public java.lang.Object clone();
+ method public Object clone();
method public android.icu.util.TimeZone cloneAsThawed();
- method public static int countEquivalentIDs(java.lang.String);
+ method public static int countEquivalentIDs(String);
method public android.icu.util.TimeZone freeze();
- method public static java.util.Set<java.lang.String> getAvailableIDs(android.icu.util.TimeZone.SystemTimeZoneType, java.lang.String, java.lang.Integer);
- method public static java.lang.String[] getAvailableIDs(int);
- method public static java.lang.String[] getAvailableIDs(java.lang.String);
- method public static java.lang.String[] getAvailableIDs();
- method public static java.lang.String getCanonicalID(java.lang.String);
- method public static java.lang.String getCanonicalID(java.lang.String, boolean[]);
+ method public static java.util.Set<java.lang.String> getAvailableIDs(android.icu.util.TimeZone.SystemTimeZoneType, String, Integer);
+ method public static String[] getAvailableIDs(int);
+ method public static String[] getAvailableIDs(String);
+ method public static String[] getAvailableIDs();
+ method public static String getCanonicalID(String);
+ method public static String getCanonicalID(String, boolean[]);
method public int getDSTSavings();
method public static android.icu.util.TimeZone getDefault();
- method public final java.lang.String getDisplayName();
- method public final java.lang.String getDisplayName(java.util.Locale);
- method public final java.lang.String getDisplayName(android.icu.util.ULocale);
- method public final java.lang.String getDisplayName(boolean, int);
- method public java.lang.String getDisplayName(boolean, int, java.util.Locale);
- method public java.lang.String getDisplayName(boolean, int, android.icu.util.ULocale);
- method public static java.lang.String getEquivalentID(java.lang.String, int);
- method public static android.icu.util.TimeZone getFrozenTimeZone(java.lang.String);
- method public java.lang.String getID();
- method public static java.lang.String getIDForWindowsID(java.lang.String, java.lang.String);
+ method public final String getDisplayName();
+ method public final String getDisplayName(java.util.Locale);
+ method public final String getDisplayName(android.icu.util.ULocale);
+ method public final String getDisplayName(boolean, int);
+ method public String getDisplayName(boolean, int, java.util.Locale);
+ method public String getDisplayName(boolean, int, android.icu.util.ULocale);
+ method public static String getEquivalentID(String, int);
+ method public static android.icu.util.TimeZone getFrozenTimeZone(String);
+ method public String getID();
+ method public static String getIDForWindowsID(String, String);
method public abstract int getOffset(int, int, int, int, int, int);
method public int getOffset(long);
method public void getOffset(long, boolean, int[]);
method public abstract int getRawOffset();
- method public static java.lang.String getRegion(java.lang.String);
- method public static java.lang.String getTZDataVersion();
- method public static android.icu.util.TimeZone getTimeZone(java.lang.String);
- method public static android.icu.util.TimeZone getTimeZone(java.lang.String, int);
- method public static java.lang.String getWindowsID(java.lang.String);
+ method public static String getRegion(String);
+ method public static String getTZDataVersion();
+ method public static android.icu.util.TimeZone getTimeZone(String);
+ method public static android.icu.util.TimeZone getTimeZone(String, int);
+ method public static String getWindowsID(String);
method public boolean hasSameRules(android.icu.util.TimeZone);
method public abstract boolean inDaylightTime(java.util.Date);
method public boolean isFrozen();
method public boolean observesDaylightTime();
- method public void setID(java.lang.String);
+ method public void setID(String);
method public abstract void setRawOffset(int);
method public abstract boolean useDaylightTime();
field public static final int GENERIC_LOCATION = 7; // 0x7
@@ -22001,111 +21920,109 @@ package android.icu.util {
field public static final int TIMEZONE_ICU = 0; // 0x0
field public static final int TIMEZONE_JDK = 1; // 0x1
field public static final android.icu.util.TimeZone UNKNOWN_ZONE;
- field public static final java.lang.String UNKNOWN_ZONE_ID = "Etc/Unknown";
+ field public static final String UNKNOWN_ZONE_ID = "Etc/Unknown";
}
- public static final class TimeZone.SystemTimeZoneType extends java.lang.Enum {
- method public static android.icu.util.TimeZone.SystemTimeZoneType valueOf(java.lang.String);
- method public static final android.icu.util.TimeZone.SystemTimeZoneType[] values();
+ public enum TimeZone.SystemTimeZoneType {
enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType ANY;
enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL;
enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL_LOCATION;
}
- public final class ULocale implements java.lang.Comparable java.io.Serializable {
- ctor public ULocale(java.lang.String);
- ctor public ULocale(java.lang.String, java.lang.String);
- ctor public ULocale(java.lang.String, java.lang.String, java.lang.String);
- method public static android.icu.util.ULocale acceptLanguage(java.lang.String, android.icu.util.ULocale[], boolean[]);
+ public final class ULocale implements java.lang.Comparable<android.icu.util.ULocale> java.io.Serializable {
+ ctor public ULocale(String);
+ ctor public ULocale(String, String);
+ ctor public ULocale(String, String, String);
+ method public static android.icu.util.ULocale acceptLanguage(String, android.icu.util.ULocale[], boolean[]);
method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], android.icu.util.ULocale[], boolean[]);
- method public static android.icu.util.ULocale acceptLanguage(java.lang.String, boolean[]);
+ method public static android.icu.util.ULocale acceptLanguage(String, boolean[]);
method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], boolean[]);
method public static android.icu.util.ULocale addLikelySubtags(android.icu.util.ULocale);
- method public static java.lang.String canonicalize(java.lang.String);
- method public java.lang.Object clone();
+ method public static String canonicalize(String);
+ method public Object clone();
method public int compareTo(android.icu.util.ULocale);
- method public static android.icu.util.ULocale createCanonical(java.lang.String);
- method public static android.icu.util.ULocale forLanguageTag(java.lang.String);
+ method public static android.icu.util.ULocale createCanonical(String);
+ method public static android.icu.util.ULocale forLanguageTag(String);
method public static android.icu.util.ULocale forLocale(java.util.Locale);
method public static android.icu.util.ULocale[] getAvailableLocales();
- method public java.lang.String getBaseName();
- method public static java.lang.String getBaseName(java.lang.String);
- method public java.lang.String getCharacterOrientation();
- method public java.lang.String getCountry();
- method public static java.lang.String getCountry(java.lang.String);
+ method public String getBaseName();
+ method public static String getBaseName(String);
+ method public String getCharacterOrientation();
+ method public String getCountry();
+ method public static String getCountry(String);
method public static android.icu.util.ULocale getDefault();
method public static android.icu.util.ULocale getDefault(android.icu.util.ULocale.Category);
- method public java.lang.String getDisplayCountry();
- method public java.lang.String getDisplayCountry(android.icu.util.ULocale);
- method public static java.lang.String getDisplayCountry(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayCountry(java.lang.String, android.icu.util.ULocale);
- method public static java.lang.String getDisplayKeyword(java.lang.String);
- method public static java.lang.String getDisplayKeyword(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayKeyword(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayKeywordValue(java.lang.String);
- method public java.lang.String getDisplayKeywordValue(java.lang.String, android.icu.util.ULocale);
- method public static java.lang.String getDisplayKeywordValue(java.lang.String, java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayKeywordValue(java.lang.String, java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayLanguage();
- method public java.lang.String getDisplayLanguage(android.icu.util.ULocale);
- method public static java.lang.String getDisplayLanguage(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayLanguage(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayLanguageWithDialect();
- method public java.lang.String getDisplayLanguageWithDialect(android.icu.util.ULocale);
- method public static java.lang.String getDisplayLanguageWithDialect(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayLanguageWithDialect(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayName();
- method public java.lang.String getDisplayName(android.icu.util.ULocale);
- method public static java.lang.String getDisplayName(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayName(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayNameWithDialect();
- method public java.lang.String getDisplayNameWithDialect(android.icu.util.ULocale);
- method public static java.lang.String getDisplayNameWithDialect(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayNameWithDialect(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayScript();
- method public java.lang.String getDisplayScript(android.icu.util.ULocale);
- method public static java.lang.String getDisplayScript(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayScript(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getDisplayVariant();
- method public java.lang.String getDisplayVariant(android.icu.util.ULocale);
- method public static java.lang.String getDisplayVariant(java.lang.String, java.lang.String);
- method public static java.lang.String getDisplayVariant(java.lang.String, android.icu.util.ULocale);
- method public java.lang.String getExtension(char);
+ method public String getDisplayCountry();
+ method public String getDisplayCountry(android.icu.util.ULocale);
+ method public static String getDisplayCountry(String, String);
+ method public static String getDisplayCountry(String, android.icu.util.ULocale);
+ method public static String getDisplayKeyword(String);
+ method public static String getDisplayKeyword(String, String);
+ method public static String getDisplayKeyword(String, android.icu.util.ULocale);
+ method public String getDisplayKeywordValue(String);
+ method public String getDisplayKeywordValue(String, android.icu.util.ULocale);
+ method public static String getDisplayKeywordValue(String, String, String);
+ method public static String getDisplayKeywordValue(String, String, android.icu.util.ULocale);
+ method public String getDisplayLanguage();
+ method public String getDisplayLanguage(android.icu.util.ULocale);
+ method public static String getDisplayLanguage(String, String);
+ method public static String getDisplayLanguage(String, android.icu.util.ULocale);
+ method public String getDisplayLanguageWithDialect();
+ method public String getDisplayLanguageWithDialect(android.icu.util.ULocale);
+ method public static String getDisplayLanguageWithDialect(String, String);
+ method public static String getDisplayLanguageWithDialect(String, android.icu.util.ULocale);
+ method public String getDisplayName();
+ method public String getDisplayName(android.icu.util.ULocale);
+ method public static String getDisplayName(String, String);
+ method public static String getDisplayName(String, android.icu.util.ULocale);
+ method public String getDisplayNameWithDialect();
+ method public String getDisplayNameWithDialect(android.icu.util.ULocale);
+ method public static String getDisplayNameWithDialect(String, String);
+ method public static String getDisplayNameWithDialect(String, android.icu.util.ULocale);
+ method public String getDisplayScript();
+ method public String getDisplayScript(android.icu.util.ULocale);
+ method public static String getDisplayScript(String, String);
+ method public static String getDisplayScript(String, android.icu.util.ULocale);
+ method public String getDisplayVariant();
+ method public String getDisplayVariant(android.icu.util.ULocale);
+ method public static String getDisplayVariant(String, String);
+ method public static String getDisplayVariant(String, android.icu.util.ULocale);
+ method public String getExtension(char);
method public java.util.Set<java.lang.Character> getExtensionKeys();
- method public static java.lang.String getFallback(java.lang.String);
+ method public static String getFallback(String);
method public android.icu.util.ULocale getFallback();
- method public java.lang.String getISO3Country();
- method public static java.lang.String getISO3Country(java.lang.String);
- method public java.lang.String getISO3Language();
- method public static java.lang.String getISO3Language(java.lang.String);
- method public static java.lang.String[] getISOCountries();
- method public static java.lang.String[] getISOLanguages();
- method public java.lang.String getKeywordValue(java.lang.String);
- method public static java.lang.String getKeywordValue(java.lang.String, java.lang.String);
+ method public String getISO3Country();
+ method public static String getISO3Country(String);
+ method public String getISO3Language();
+ method public static String getISO3Language(String);
+ method public static String[] getISOCountries();
+ method public static String[] getISOLanguages();
+ method public String getKeywordValue(String);
+ method public static String getKeywordValue(String, String);
method public java.util.Iterator<java.lang.String> getKeywords();
- method public static java.util.Iterator<java.lang.String> getKeywords(java.lang.String);
- method public java.lang.String getLanguage();
- method public static java.lang.String getLanguage(java.lang.String);
- method public java.lang.String getLineOrientation();
- method public java.lang.String getName();
- method public static java.lang.String getName(java.lang.String);
- method public java.lang.String getScript();
- method public static java.lang.String getScript(java.lang.String);
+ method public static java.util.Iterator<java.lang.String> getKeywords(String);
+ method public String getLanguage();
+ method public static String getLanguage(String);
+ method public String getLineOrientation();
+ method public String getName();
+ method public static String getName(String);
+ method public String getScript();
+ method public static String getScript(String);
method public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
method public java.util.Set<java.lang.String> getUnicodeLocaleKeys();
- method public java.lang.String getUnicodeLocaleType(java.lang.String);
- method public java.lang.String getVariant();
- method public static java.lang.String getVariant(java.lang.String);
+ method public String getUnicodeLocaleType(String);
+ method public String getVariant();
+ method public static String getVariant(String);
method public boolean isRightToLeft();
method public static android.icu.util.ULocale minimizeSubtags(android.icu.util.ULocale);
- method public android.icu.util.ULocale setKeywordValue(java.lang.String, java.lang.String);
- method public static java.lang.String setKeywordValue(java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String toLanguageTag();
- method public static java.lang.String toLegacyKey(java.lang.String);
- method public static java.lang.String toLegacyType(java.lang.String, java.lang.String);
+ method public android.icu.util.ULocale setKeywordValue(String, String);
+ method public static String setKeywordValue(String, String, String);
+ method public String toLanguageTag();
+ method public static String toLegacyKey(String);
+ method public static String toLegacyType(String, String);
method public java.util.Locale toLocale();
- method public static java.lang.String toUnicodeLocaleKey(java.lang.String);
- method public static java.lang.String toUnicodeLocaleType(java.lang.String, java.lang.String);
+ method public static String toUnicodeLocaleKey(String);
+ method public static String toUnicodeLocaleType(String, String);
field public static final android.icu.util.ULocale CANADA;
field public static final android.icu.util.ULocale CANADA_FRENCH;
field public static final android.icu.util.ULocale CHINA;
@@ -22134,24 +22051,22 @@ package android.icu.util {
public static final class ULocale.Builder {
ctor public ULocale.Builder();
- method public android.icu.util.ULocale.Builder addUnicodeLocaleAttribute(java.lang.String);
+ method public android.icu.util.ULocale.Builder addUnicodeLocaleAttribute(String);
method public android.icu.util.ULocale build();
method public android.icu.util.ULocale.Builder clear();
method public android.icu.util.ULocale.Builder clearExtensions();
- method public android.icu.util.ULocale.Builder removeUnicodeLocaleAttribute(java.lang.String);
- method public android.icu.util.ULocale.Builder setExtension(char, java.lang.String);
- method public android.icu.util.ULocale.Builder setLanguage(java.lang.String);
- method public android.icu.util.ULocale.Builder setLanguageTag(java.lang.String);
+ method public android.icu.util.ULocale.Builder removeUnicodeLocaleAttribute(String);
+ method public android.icu.util.ULocale.Builder setExtension(char, String);
+ method public android.icu.util.ULocale.Builder setLanguage(String);
+ method public android.icu.util.ULocale.Builder setLanguageTag(String);
method public android.icu.util.ULocale.Builder setLocale(android.icu.util.ULocale);
- method public android.icu.util.ULocale.Builder setRegion(java.lang.String);
- method public android.icu.util.ULocale.Builder setScript(java.lang.String);
- method public android.icu.util.ULocale.Builder setUnicodeLocaleKeyword(java.lang.String, java.lang.String);
- method public android.icu.util.ULocale.Builder setVariant(java.lang.String);
+ method public android.icu.util.ULocale.Builder setRegion(String);
+ method public android.icu.util.ULocale.Builder setScript(String);
+ method public android.icu.util.ULocale.Builder setUnicodeLocaleKeyword(String, String);
+ method public android.icu.util.ULocale.Builder setVariant(String);
}
- public static final class ULocale.Category extends java.lang.Enum {
- method public static android.icu.util.ULocale.Category valueOf(java.lang.String);
- method public static final android.icu.util.ULocale.Category[] values();
+ public enum ULocale.Category {
enum_constant public static final android.icu.util.ULocale.Category DISPLAY;
enum_constant public static final android.icu.util.ULocale.Category FORMAT;
}
@@ -22176,7 +22091,7 @@ package android.icu.util {
field public static final int JAVA_TIME = 0; // 0x0
field public static final int MAC_OLD_TIME = 5; // 0x5
field public static final int MAC_TIME = 6; // 0x6
- field public static final deprecated int MAX_SCALE = 10; // 0xa
+ field @Deprecated public static final int MAX_SCALE = 10; // 0xa
field public static final int TO_MAX_VALUE = 5; // 0x5
field public static final int TO_MIN_VALUE = 4; // 0x4
field public static final int UNITS_VALUE = 0; // 0x0
@@ -22185,21 +22100,21 @@ package android.icu.util {
field public static final int WINDOWS_FILE_TIME = 3; // 0x3
}
- public abstract interface ValueIterator {
- method public abstract boolean next(android.icu.util.ValueIterator.Element);
- method public abstract void reset();
- method public abstract void setRange(int, int);
+ public interface ValueIterator {
+ method public boolean next(android.icu.util.ValueIterator.Element);
+ method public void reset();
+ method public void setRange(int, int);
}
public static final class ValueIterator.Element {
ctor public ValueIterator.Element();
field public int integer;
- field public java.lang.Object value;
+ field public Object value;
}
- public final class VersionInfo implements java.lang.Comparable {
+ public final class VersionInfo implements java.lang.Comparable<android.icu.util.VersionInfo> {
method public int compareTo(android.icu.util.VersionInfo);
- method public static android.icu.util.VersionInfo getInstance(java.lang.String);
+ method public static android.icu.util.VersionInfo getInstance(String);
method public static android.icu.util.VersionInfo getInstance(int, int, int, int);
method public static android.icu.util.VersionInfo getInstance(int, int, int);
method public static android.icu.util.VersionInfo getInstance(int, int);
@@ -22258,9 +22173,9 @@ package android.inputmethodservice {
public abstract class AbstractInputMethodService.AbstractInputMethodImpl implements android.view.inputmethod.InputMethod {
ctor public AbstractInputMethodService.AbstractInputMethodImpl();
- method public void createSession(android.view.inputmethod.InputMethod.SessionCallback);
- method public void revokeSession(android.view.inputmethod.InputMethodSession);
- method public void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
+ method @MainThread public void createSession(android.view.inputmethod.InputMethod.SessionCallback);
+ method @MainThread public void revokeSession(android.view.inputmethod.InputMethodSession);
+ method @MainThread public void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
}
public abstract class AbstractInputMethodService.AbstractInputMethodSessionImpl implements android.view.inputmethod.InputMethodSession {
@@ -22286,17 +22201,17 @@ package android.inputmethodservice {
public class InputMethodService extends android.inputmethodservice.AbstractInputMethodService {
ctor public InputMethodService();
- method public deprecated boolean enableHardwareAcceleration();
+ method @Deprecated public boolean enableHardwareAcceleration();
method public int getBackDisposition();
method public int getCandidatesHiddenVisibility();
method public android.view.inputmethod.InputBinding getCurrentInputBinding();
method public android.view.inputmethod.InputConnection getCurrentInputConnection();
method public android.view.inputmethod.EditorInfo getCurrentInputEditorInfo();
method public boolean getCurrentInputStarted();
- method public deprecated int getInputMethodWindowRecommendedHeight();
+ method @Deprecated public int getInputMethodWindowRecommendedHeight();
method public android.view.LayoutInflater getLayoutInflater();
method public int getMaxWidth();
- method public java.lang.CharSequence getTextForImeAction(int);
+ method public CharSequence getTextForImeAction(int);
method public android.app.Dialog getWindow();
method public void hideStatusIcon();
method public void hideWindow();
@@ -22304,7 +22219,7 @@ package android.inputmethodservice {
method public boolean isFullscreenMode();
method public boolean isInputViewShown();
method public boolean isShowInputRequested();
- method public void onAppPrivateCommand(java.lang.String, android.os.Bundle);
+ method public void onAppPrivateCommand(String, android.os.Bundle);
method public void onBindInput();
method public void onComputeInsets(android.inputmethodservice.InputMethodService.Insets);
method public void onConfigureWindow(android.view.Window, boolean, boolean);
@@ -22316,7 +22231,7 @@ package android.inputmethodservice {
method protected void onCurrentInputMethodSubtypeChanged(android.view.inputmethod.InputMethodSubtype);
method public void onDisplayCompletions(android.view.inputmethod.CompletionInfo[]);
method public boolean onEvaluateFullscreenMode();
- method public boolean onEvaluateInputViewShown();
+ method @CallSuper public boolean onEvaluateInputViewShown();
method public boolean onExtractTextContextMenuItem(int);
method public void onExtractedCursorMovement(int, int);
method public void onExtractedSelectionChanged(int, int);
@@ -22335,7 +22250,7 @@ package android.inputmethodservice {
method public void onStartInput(android.view.inputmethod.EditorInfo, boolean);
method public void onStartInputView(android.view.inputmethod.EditorInfo, boolean);
method public void onUnbindInput();
- method public deprecated void onUpdateCursor(android.graphics.Rect);
+ method @Deprecated public void onUpdateCursor(android.graphics.Rect);
method public void onUpdateCursorAnchorInfo(android.view.inputmethod.CursorAnchorInfo);
method public void onUpdateExtractedText(int, android.view.inputmethod.ExtractedText);
method public void onUpdateExtractingViews(android.view.inputmethod.EditorInfo);
@@ -22356,35 +22271,35 @@ package android.inputmethodservice {
method public void setExtractViewShown(boolean);
method public void setInputView(android.view.View);
method public final boolean shouldOfferSwitchingToNextInputMethod();
- method public void showStatusIcon(int);
+ method public void showStatusIcon(@DrawableRes int);
method public void showWindow(boolean);
- method public void switchInputMethod(java.lang.String);
- method public final void switchInputMethod(java.lang.String, android.view.inputmethod.InputMethodSubtype);
+ method public void switchInputMethod(String);
+ method public final void switchInputMethod(String, android.view.inputmethod.InputMethodSubtype);
method public final boolean switchToNextInputMethod(boolean);
method public final boolean switchToPreviousInputMethod();
method public void updateFullscreenMode();
method public void updateInputViewShown();
field public static final int BACK_DISPOSITION_ADJUST_NOTHING = 3; // 0x3
field public static final int BACK_DISPOSITION_DEFAULT = 0; // 0x0
- field public static final deprecated int BACK_DISPOSITION_WILL_DISMISS = 2; // 0x2
- field public static final deprecated int BACK_DISPOSITION_WILL_NOT_DISMISS = 1; // 0x1
+ field @Deprecated public static final int BACK_DISPOSITION_WILL_DISMISS = 2; // 0x2
+ field @Deprecated public static final int BACK_DISPOSITION_WILL_NOT_DISMISS = 1; // 0x1
}
public class InputMethodService.InputMethodImpl extends android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl {
ctor public InputMethodService.InputMethodImpl();
- method public void attachToken(android.os.IBinder);
- method public void bindInput(android.view.inputmethod.InputBinding);
- method public void changeInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
- method public void hideSoftInput(int, android.os.ResultReceiver);
- method public void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
- method public void showSoftInput(int, android.os.ResultReceiver);
- method public void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
- method public void unbindInput();
+ method @MainThread public void attachToken(android.os.IBinder);
+ method @MainThread public void bindInput(android.view.inputmethod.InputBinding);
+ method @MainThread public void changeInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
+ method @MainThread public void hideSoftInput(int, android.os.ResultReceiver);
+ method @MainThread public void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ method @MainThread public void showSoftInput(int, android.os.ResultReceiver);
+ method @MainThread public void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ method @MainThread public void unbindInput();
}
public class InputMethodService.InputMethodSessionImpl extends android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl {
ctor public InputMethodService.InputMethodSessionImpl();
- method public void appPrivateCommand(java.lang.String, android.os.Bundle);
+ method public void appPrivateCommand(String, android.os.Bundle);
method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
method public void finishInput();
method public void toggleSoftInput(int, int);
@@ -22407,122 +22322,122 @@ package android.inputmethodservice {
field public int visibleTopInsets;
}
- public deprecated class Keyboard {
- ctor public Keyboard(android.content.Context, int);
- ctor public Keyboard(android.content.Context, int, int, int, int);
- ctor public Keyboard(android.content.Context, int, int);
- ctor public Keyboard(android.content.Context, int, java.lang.CharSequence, int, int);
- method protected android.inputmethodservice.Keyboard.Key createKeyFromXml(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
- method protected android.inputmethodservice.Keyboard.Row createRowFromXml(android.content.res.Resources, android.content.res.XmlResourceParser);
- method public int getHeight();
- method protected int getHorizontalGap();
- method protected int getKeyHeight();
- method protected int getKeyWidth();
- method public java.util.List<android.inputmethodservice.Keyboard.Key> getKeys();
- method public int getMinWidth();
- method public java.util.List<android.inputmethodservice.Keyboard.Key> getModifierKeys();
- method public int[] getNearestKeys(int, int);
- method public int getShiftKeyIndex();
- method protected int getVerticalGap();
- method public boolean isShifted();
- method protected void setHorizontalGap(int);
- method protected void setKeyHeight(int);
- method protected void setKeyWidth(int);
- method public boolean setShifted(boolean);
- method protected void setVerticalGap(int);
- field public static final int EDGE_BOTTOM = 8; // 0x8
- field public static final int EDGE_LEFT = 1; // 0x1
- field public static final int EDGE_RIGHT = 2; // 0x2
- field public static final int EDGE_TOP = 4; // 0x4
- field public static final int KEYCODE_ALT = -6; // 0xfffffffa
- field public static final int KEYCODE_CANCEL = -3; // 0xfffffffd
- field public static final int KEYCODE_DELETE = -5; // 0xfffffffb
- field public static final int KEYCODE_DONE = -4; // 0xfffffffc
- field public static final int KEYCODE_MODE_CHANGE = -2; // 0xfffffffe
- field public static final int KEYCODE_SHIFT = -1; // 0xffffffff
- }
-
- public static class Keyboard.Key {
- ctor public Keyboard.Key(android.inputmethodservice.Keyboard.Row);
- ctor public Keyboard.Key(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
- method public int[] getCurrentDrawableState();
- method public boolean isInside(int, int);
- method public void onPressed();
- method public void onReleased(boolean);
- method public int squaredDistanceFrom(int, int);
- field public int[] codes;
- field public int edgeFlags;
- field public int gap;
- field public int height;
- field public android.graphics.drawable.Drawable icon;
- field public android.graphics.drawable.Drawable iconPreview;
- field public java.lang.CharSequence label;
- field public boolean modifier;
- field public boolean on;
- field public java.lang.CharSequence popupCharacters;
- field public int popupResId;
- field public boolean pressed;
- field public boolean repeatable;
- field public boolean sticky;
- field public java.lang.CharSequence text;
- field public int width;
- field public int x;
- field public int y;
- }
-
- public static class Keyboard.Row {
- ctor public Keyboard.Row(android.inputmethodservice.Keyboard);
- ctor public Keyboard.Row(android.content.res.Resources, android.inputmethodservice.Keyboard, android.content.res.XmlResourceParser);
- field public int defaultHeight;
- field public int defaultHorizontalGap;
- field public int defaultWidth;
- field public int mode;
- field public int rowEdgeFlags;
- field public int verticalGap;
- }
-
- public deprecated class KeyboardView extends android.view.View implements android.view.View.OnClickListener {
- ctor public KeyboardView(android.content.Context, android.util.AttributeSet);
- ctor public KeyboardView(android.content.Context, android.util.AttributeSet, int);
- ctor public KeyboardView(android.content.Context, android.util.AttributeSet, int, int);
- method public void closing();
- method public android.inputmethodservice.Keyboard getKeyboard();
- method protected android.inputmethodservice.KeyboardView.OnKeyboardActionListener getOnKeyboardActionListener();
- method public boolean handleBack();
- method public void invalidateAllKeys();
- method public void invalidateKey(int);
- method public boolean isPreviewEnabled();
- method public boolean isProximityCorrectionEnabled();
- method public boolean isShifted();
+ @Deprecated public class Keyboard {
+ ctor @Deprecated public Keyboard(android.content.Context, int);
+ ctor @Deprecated public Keyboard(android.content.Context, @XmlRes int, int, int, int);
+ ctor @Deprecated public Keyboard(android.content.Context, @XmlRes int, int);
+ ctor @Deprecated public Keyboard(android.content.Context, int, CharSequence, int, int);
+ method @Deprecated protected android.inputmethodservice.Keyboard.Key createKeyFromXml(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
+ method @Deprecated protected android.inputmethodservice.Keyboard.Row createRowFromXml(android.content.res.Resources, android.content.res.XmlResourceParser);
+ method @Deprecated public int getHeight();
+ method @Deprecated protected int getHorizontalGap();
+ method @Deprecated protected int getKeyHeight();
+ method @Deprecated protected int getKeyWidth();
+ method @Deprecated public java.util.List<android.inputmethodservice.Keyboard.Key> getKeys();
+ method @Deprecated public int getMinWidth();
+ method @Deprecated public java.util.List<android.inputmethodservice.Keyboard.Key> getModifierKeys();
+ method @Deprecated public int[] getNearestKeys(int, int);
+ method @Deprecated public int getShiftKeyIndex();
+ method @Deprecated protected int getVerticalGap();
+ method @Deprecated public boolean isShifted();
+ method @Deprecated protected void setHorizontalGap(int);
+ method @Deprecated protected void setKeyHeight(int);
+ method @Deprecated protected void setKeyWidth(int);
+ method @Deprecated public boolean setShifted(boolean);
+ method @Deprecated protected void setVerticalGap(int);
+ field @Deprecated public static final int EDGE_BOTTOM = 8; // 0x8
+ field @Deprecated public static final int EDGE_LEFT = 1; // 0x1
+ field @Deprecated public static final int EDGE_RIGHT = 2; // 0x2
+ field @Deprecated public static final int EDGE_TOP = 4; // 0x4
+ field @Deprecated public static final int KEYCODE_ALT = -6; // 0xfffffffa
+ field @Deprecated public static final int KEYCODE_CANCEL = -3; // 0xfffffffd
+ field @Deprecated public static final int KEYCODE_DELETE = -5; // 0xfffffffb
+ field @Deprecated public static final int KEYCODE_DONE = -4; // 0xfffffffc
+ field @Deprecated public static final int KEYCODE_MODE_CHANGE = -2; // 0xfffffffe
+ field @Deprecated public static final int KEYCODE_SHIFT = -1; // 0xffffffff
+ }
+
+ @Deprecated public static class Keyboard.Key {
+ ctor @Deprecated public Keyboard.Key(android.inputmethodservice.Keyboard.Row);
+ ctor @Deprecated public Keyboard.Key(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
+ method @Deprecated public int[] getCurrentDrawableState();
+ method @Deprecated public boolean isInside(int, int);
+ method @Deprecated public void onPressed();
+ method @Deprecated public void onReleased(boolean);
+ method @Deprecated public int squaredDistanceFrom(int, int);
+ field @Deprecated public int[] codes;
+ field @Deprecated public int edgeFlags;
+ field @Deprecated public int gap;
+ field @Deprecated public int height;
+ field @Deprecated public android.graphics.drawable.Drawable icon;
+ field @Deprecated public android.graphics.drawable.Drawable iconPreview;
+ field @Deprecated public CharSequence label;
+ field @Deprecated public boolean modifier;
+ field @Deprecated public boolean on;
+ field @Deprecated public CharSequence popupCharacters;
+ field @Deprecated public int popupResId;
+ field @Deprecated public boolean pressed;
+ field @Deprecated public boolean repeatable;
+ field @Deprecated public boolean sticky;
+ field @Deprecated public CharSequence text;
+ field @Deprecated public int width;
+ field @Deprecated public int x;
+ field @Deprecated public int y;
+ }
+
+ @Deprecated public static class Keyboard.Row {
+ ctor @Deprecated public Keyboard.Row(android.inputmethodservice.Keyboard);
+ ctor @Deprecated public Keyboard.Row(android.content.res.Resources, android.inputmethodservice.Keyboard, android.content.res.XmlResourceParser);
+ field @Deprecated public int defaultHeight;
+ field @Deprecated public int defaultHorizontalGap;
+ field @Deprecated public int defaultWidth;
+ field @Deprecated public int mode;
+ field @Deprecated public int rowEdgeFlags;
+ field @Deprecated public int verticalGap;
+ }
+
+ @Deprecated public class KeyboardView extends android.view.View implements android.view.View.OnClickListener {
+ ctor @Deprecated public KeyboardView(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public KeyboardView(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public KeyboardView(android.content.Context, android.util.AttributeSet, int, int);
+ method @Deprecated public void closing();
+ method @Deprecated public android.inputmethodservice.Keyboard getKeyboard();
+ method @Deprecated protected android.inputmethodservice.KeyboardView.OnKeyboardActionListener getOnKeyboardActionListener();
+ method @Deprecated public boolean handleBack();
+ method @Deprecated public void invalidateAllKeys();
+ method @Deprecated public void invalidateKey(int);
+ method @Deprecated public boolean isPreviewEnabled();
+ method @Deprecated public boolean isProximityCorrectionEnabled();
+ method @Deprecated public boolean isShifted();
method public void onClick(android.view.View);
- method public void onDetachedFromWindow();
- method public void onDraw(android.graphics.Canvas);
- method protected boolean onLongPress(android.inputmethodservice.Keyboard.Key);
- method public void onMeasure(int, int);
- method public void onSizeChanged(int, int, int, int);
- method public void setKeyboard(android.inputmethodservice.Keyboard);
- method public void setOnKeyboardActionListener(android.inputmethodservice.KeyboardView.OnKeyboardActionListener);
- method public void setPopupOffset(int, int);
- method public void setPopupParent(android.view.View);
- method public void setPreviewEnabled(boolean);
- method public void setProximityCorrectionEnabled(boolean);
- method public boolean setShifted(boolean);
- method public void setVerticalCorrection(int);
- method protected void swipeDown();
- method protected void swipeLeft();
- method protected void swipeRight();
- method protected void swipeUp();
- }
-
- public static abstract interface KeyboardView.OnKeyboardActionListener {
- method public abstract void onKey(int, int[]);
- method public abstract void onPress(int);
- method public abstract void onRelease(int);
- method public abstract void onText(java.lang.CharSequence);
- method public abstract void swipeDown();
- method public abstract void swipeLeft();
- method public abstract void swipeRight();
- method public abstract void swipeUp();
+ method @Deprecated public void onDetachedFromWindow();
+ method @Deprecated public void onDraw(android.graphics.Canvas);
+ method @Deprecated protected boolean onLongPress(android.inputmethodservice.Keyboard.Key);
+ method @Deprecated public void onMeasure(int, int);
+ method @Deprecated public void onSizeChanged(int, int, int, int);
+ method @Deprecated public void setKeyboard(android.inputmethodservice.Keyboard);
+ method @Deprecated public void setOnKeyboardActionListener(android.inputmethodservice.KeyboardView.OnKeyboardActionListener);
+ method @Deprecated public void setPopupOffset(int, int);
+ method @Deprecated public void setPopupParent(android.view.View);
+ method @Deprecated public void setPreviewEnabled(boolean);
+ method @Deprecated public void setProximityCorrectionEnabled(boolean);
+ method @Deprecated public boolean setShifted(boolean);
+ method @Deprecated public void setVerticalCorrection(int);
+ method @Deprecated protected void swipeDown();
+ method @Deprecated protected void swipeLeft();
+ method @Deprecated protected void swipeRight();
+ method @Deprecated protected void swipeUp();
+ }
+
+ @Deprecated public static interface KeyboardView.OnKeyboardActionListener {
+ method @Deprecated public void onKey(int, int[]);
+ method @Deprecated public void onPress(int);
+ method @Deprecated public void onRelease(int);
+ method @Deprecated public void onText(CharSequence);
+ method @Deprecated public void swipeDown();
+ method @Deprecated public void swipeLeft();
+ method @Deprecated public void swipeRight();
+ method @Deprecated public void swipeUp();
}
}
@@ -22534,44 +22449,44 @@ package android.location {
method public void clearLatitude();
method public void clearLongitude();
method public int describeContents();
- method public java.lang.String getAddressLine(int);
- method public java.lang.String getAdminArea();
- method public java.lang.String getCountryCode();
- method public java.lang.String getCountryName();
+ method public String getAddressLine(int);
+ method public String getAdminArea();
+ method public String getCountryCode();
+ method public String getCountryName();
method public android.os.Bundle getExtras();
- method public java.lang.String getFeatureName();
+ method public String getFeatureName();
method public double getLatitude();
method public java.util.Locale getLocale();
- method public java.lang.String getLocality();
+ method public String getLocality();
method public double getLongitude();
method public int getMaxAddressLineIndex();
- method public java.lang.String getPhone();
- method public java.lang.String getPostalCode();
- method public java.lang.String getPremises();
- method public java.lang.String getSubAdminArea();
- method public java.lang.String getSubLocality();
- method public java.lang.String getSubThoroughfare();
- method public java.lang.String getThoroughfare();
- method public java.lang.String getUrl();
+ method public String getPhone();
+ method public String getPostalCode();
+ method public String getPremises();
+ method public String getSubAdminArea();
+ method public String getSubLocality();
+ method public String getSubThoroughfare();
+ method public String getThoroughfare();
+ method public String getUrl();
method public boolean hasLatitude();
method public boolean hasLongitude();
- method public void setAddressLine(int, java.lang.String);
- method public void setAdminArea(java.lang.String);
- method public void setCountryCode(java.lang.String);
- method public void setCountryName(java.lang.String);
+ method public void setAddressLine(int, String);
+ method public void setAdminArea(String);
+ method public void setCountryCode(String);
+ method public void setCountryName(String);
method public void setExtras(android.os.Bundle);
- method public void setFeatureName(java.lang.String);
+ method public void setFeatureName(String);
method public void setLatitude(double);
- method public void setLocality(java.lang.String);
+ method public void setLocality(String);
method public void setLongitude(double);
- method public void setPhone(java.lang.String);
- method public void setPostalCode(java.lang.String);
- method public void setPremises(java.lang.String);
- method public void setSubAdminArea(java.lang.String);
- method public void setSubLocality(java.lang.String);
- method public void setSubThoroughfare(java.lang.String);
- method public void setThoroughfare(java.lang.String);
- method public void setUrl(java.lang.String);
+ method public void setPhone(String);
+ method public void setPostalCode(String);
+ method public void setPremises(String);
+ method public void setSubAdminArea(String);
+ method public void setSubLocality(String);
+ method public void setSubThoroughfare(String);
+ method public void setThoroughfare(String);
+ method public void setUrl(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.Address> CREATOR;
}
@@ -22617,8 +22532,8 @@ package android.location {
ctor public Geocoder(android.content.Context, java.util.Locale);
ctor public Geocoder(android.content.Context);
method public java.util.List<android.location.Address> getFromLocation(double, double, int) throws java.io.IOException;
- method public java.util.List<android.location.Address> getFromLocationName(java.lang.String, int) throws java.io.IOException;
- method public java.util.List<android.location.Address> getFromLocationName(java.lang.String, int, double, double, double, double) throws java.io.IOException;
+ method public java.util.List<android.location.Address> getFromLocationName(String, int) throws java.io.IOException;
+ method public java.util.List<android.location.Address> getFromLocationName(String, int, double, double, double, double) throws java.io.IOException;
method public static boolean isPresent();
}
@@ -22650,11 +22565,12 @@ package android.location {
method public int getAccumulatedDeltaRangeState();
method public double getAccumulatedDeltaRangeUncertaintyMeters();
method public double getAutomaticGainControlLevelDb();
- method public deprecated long getCarrierCycles();
+ method @Deprecated public long getCarrierCycles();
method public float getCarrierFrequencyHz();
- method public deprecated double getCarrierPhase();
- method public deprecated double getCarrierPhaseUncertainty();
+ method @Deprecated public double getCarrierPhase();
+ method @Deprecated public double getCarrierPhaseUncertainty();
method public double getCn0DbHz();
+ method public int getCodeType();
method public int getConstellationType();
method public int getMultipathIndicator();
method public double getPseudorangeRateMetersPerSecond();
@@ -22666,10 +22582,11 @@ package android.location {
method public int getSvid();
method public double getTimeOffsetNanos();
method public boolean hasAutomaticGainControlLevelDb();
- method public deprecated boolean hasCarrierCycles();
+ method @Deprecated public boolean hasCarrierCycles();
method public boolean hasCarrierFrequencyHz();
- method public deprecated boolean hasCarrierPhase();
- method public deprecated boolean hasCarrierPhaseUncertainty();
+ method @Deprecated public boolean hasCarrierPhase();
+ method @Deprecated public boolean hasCarrierPhaseUncertainty();
+ method public boolean hasCodeType();
method public boolean hasSnrInDb();
method public void writeToParcel(android.os.Parcel, int);
field public static final int ADR_STATE_CYCLE_SLIP = 4; // 0x4
@@ -22678,6 +22595,21 @@ package android.location {
field public static final int ADR_STATE_RESET = 2; // 0x2
field public static final int ADR_STATE_UNKNOWN = 0; // 0x0
field public static final int ADR_STATE_VALID = 1; // 0x1
+ field public static final int CODE_TYPE_A = 0; // 0x0
+ field public static final int CODE_TYPE_B = 1; // 0x1
+ field public static final int CODE_TYPE_C = 2; // 0x2
+ field public static final int CODE_TYPE_CODELESS = 13; // 0xd
+ field public static final int CODE_TYPE_I = 3; // 0x3
+ field public static final int CODE_TYPE_L = 4; // 0x4
+ field public static final int CODE_TYPE_M = 5; // 0x5
+ field public static final int CODE_TYPE_P = 6; // 0x6
+ field public static final int CODE_TYPE_Q = 7; // 0x7
+ field public static final int CODE_TYPE_S = 8; // 0x8
+ field public static final int CODE_TYPE_UNKNOWN = -1; // 0xffffffff
+ field public static final int CODE_TYPE_W = 9; // 0x9
+ field public static final int CODE_TYPE_X = 10; // 0xa
+ field public static final int CODE_TYPE_Y = 11; // 0xb
+ field public static final int CODE_TYPE_Z = 12; // 0xc
field public static final android.os.Parcelable.Creator<android.location.GnssMeasurement> CREATOR;
field public static final int MULTIPATH_INDICATOR_DETECTED = 1; // 0x1
field public static final int MULTIPATH_INDICATOR_NOT_DETECTED = 2; // 0x2
@@ -22703,13 +22635,13 @@ package android.location {
public final class GnssMeasurementsEvent implements android.os.Parcelable {
method public int describeContents();
- method public android.location.GnssClock getClock();
- method public java.util.Collection<android.location.GnssMeasurement> getMeasurements();
+ method @NonNull public android.location.GnssClock getClock();
+ method @NonNull public java.util.Collection<android.location.GnssMeasurement> getMeasurements();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementsEvent> CREATOR;
}
- public static abstract class GnssMeasurementsEvent.Callback {
+ public abstract static class GnssMeasurementsEvent.Callback {
ctor public GnssMeasurementsEvent.Callback();
method public void onGnssMeasurementsReceived(android.location.GnssMeasurementsEvent);
method public void onStatusChanged(int);
@@ -22721,7 +22653,7 @@ package android.location {
public final class GnssNavigationMessage implements android.os.Parcelable {
method public int describeContents();
- method public byte[] getData();
+ method @NonNull public byte[] getData();
method public int getMessageId();
method public int getStatus();
method public int getSubmessageId();
@@ -22744,7 +22676,7 @@ package android.location {
field public static final int TYPE_UNKNOWN = 0; // 0x0
}
- public static abstract class GnssNavigationMessage.Callback {
+ public abstract static class GnssNavigationMessage.Callback {
ctor public GnssNavigationMessage.Callback();
method public void onGnssNavigationMessageReceived(android.location.GnssNavigationMessage);
method public void onStatusChanged(int);
@@ -22774,7 +22706,7 @@ package android.location {
field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
}
- public static abstract class GnssStatus.Callback {
+ public abstract static class GnssStatus.Callback {
ctor public GnssStatus.Callback();
method public void onFirstFix(int);
method public void onSatelliteStatusChanged(android.location.GnssStatus);
@@ -22782,44 +22714,44 @@ package android.location {
method public void onStopped();
}
- public final deprecated class GpsSatellite {
- method public float getAzimuth();
- method public float getElevation();
- method public int getPrn();
- method public float getSnr();
- method public boolean hasAlmanac();
- method public boolean hasEphemeris();
- method public boolean usedInFix();
+ @Deprecated public final class GpsSatellite {
+ method @Deprecated public float getAzimuth();
+ method @Deprecated public float getElevation();
+ method @Deprecated public int getPrn();
+ method @Deprecated public float getSnr();
+ method @Deprecated public boolean hasAlmanac();
+ method @Deprecated public boolean hasEphemeris();
+ method @Deprecated public boolean usedInFix();
}
- public final deprecated class GpsStatus {
- method public int getMaxSatellites();
- method public java.lang.Iterable<android.location.GpsSatellite> getSatellites();
- method public int getTimeToFirstFix();
- field public static final int GPS_EVENT_FIRST_FIX = 3; // 0x3
- field public static final int GPS_EVENT_SATELLITE_STATUS = 4; // 0x4
- field public static final int GPS_EVENT_STARTED = 1; // 0x1
- field public static final int GPS_EVENT_STOPPED = 2; // 0x2
+ @Deprecated public final class GpsStatus {
+ method @Deprecated public int getMaxSatellites();
+ method @Deprecated public Iterable<android.location.GpsSatellite> getSatellites();
+ method @Deprecated public int getTimeToFirstFix();
+ field @Deprecated public static final int GPS_EVENT_FIRST_FIX = 3; // 0x3
+ field @Deprecated public static final int GPS_EVENT_SATELLITE_STATUS = 4; // 0x4
+ field @Deprecated public static final int GPS_EVENT_STARTED = 1; // 0x1
+ field @Deprecated public static final int GPS_EVENT_STOPPED = 2; // 0x2
}
- public static abstract deprecated interface GpsStatus.Listener {
- method public abstract void onGpsStatusChanged(int);
+ @Deprecated public static interface GpsStatus.Listener {
+ method @Deprecated public void onGpsStatusChanged(int);
}
- public static abstract deprecated interface GpsStatus.NmeaListener {
- method public abstract void onNmeaReceived(long, java.lang.String);
+ @Deprecated public static interface GpsStatus.NmeaListener {
+ method @Deprecated public void onNmeaReceived(long, String);
}
public class Location implements android.os.Parcelable {
- ctor public Location(java.lang.String);
+ ctor public Location(String);
ctor public Location(android.location.Location);
method public float bearingTo(android.location.Location);
- method public static java.lang.String convert(double, int);
- method public static double convert(java.lang.String);
+ method public static String convert(double, int);
+ method public static double convert(String);
method public int describeContents();
method public static void distanceBetween(double, double, double, double, float[]);
method public float distanceTo(android.location.Location);
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public float getAccuracy();
method public double getAltitude();
method public float getBearing();
@@ -22828,7 +22760,7 @@ package android.location {
method public android.os.Bundle getExtras();
method public double getLatitude();
method public double getLongitude();
- method public java.lang.String getProvider();
+ method public String getProvider();
method public float getSpeed();
method public float getSpeedAccuracyMetersPerSecond();
method public long getTime();
@@ -22841,10 +22773,10 @@ package android.location {
method public boolean hasSpeedAccuracy();
method public boolean hasVerticalAccuracy();
method public boolean isFromMockProvider();
- method public deprecated void removeAccuracy();
- method public deprecated void removeAltitude();
- method public deprecated void removeBearing();
- method public deprecated void removeSpeed();
+ method @Deprecated public void removeAccuracy();
+ method @Deprecated public void removeAltitude();
+ method @Deprecated public void removeBearing();
+ method @Deprecated public void removeSpeed();
method public void reset();
method public void set(android.location.Location);
method public void setAccuracy(float);
@@ -22855,7 +22787,7 @@ package android.location {
method public void setExtras(android.os.Bundle);
method public void setLatitude(double);
method public void setLongitude(double);
- method public void setProvider(java.lang.String);
+ method public void setProvider(String);
method public void setSpeed(float);
method public void setSpeedAccuracyMetersPerSecond(float);
method public void setTime(long);
@@ -22867,77 +22799,77 @@ package android.location {
field public static final int FORMAT_SECONDS = 2; // 0x2
}
- public abstract interface LocationListener {
- method public abstract void onLocationChanged(android.location.Location);
- method public abstract void onProviderDisabled(java.lang.String);
- method public abstract void onProviderEnabled(java.lang.String);
- method public abstract deprecated void onStatusChanged(java.lang.String, int, android.os.Bundle);
+ public interface LocationListener {
+ method public void onLocationChanged(android.location.Location);
+ method public void onProviderDisabled(String);
+ method public void onProviderEnabled(String);
+ method @Deprecated public void onStatusChanged(String, int, android.os.Bundle);
}
public class LocationManager {
- method public deprecated boolean addGpsStatusListener(android.location.GpsStatus.Listener);
- method public deprecated boolean addNmeaListener(android.location.GpsStatus.NmeaListener);
- method public boolean addNmeaListener(android.location.OnNmeaMessageListener);
- method public boolean addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler);
- method public void addProximityAlert(double, double, float, long, android.app.PendingIntent);
- method public void addTestProvider(java.lang.String, boolean, boolean, boolean, boolean, boolean, boolean, boolean, int, int);
- method public deprecated void clearTestProviderEnabled(java.lang.String);
- method public deprecated void clearTestProviderLocation(java.lang.String);
- method public deprecated void clearTestProviderStatus(java.lang.String);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean addGpsStatusListener(android.location.GpsStatus.Listener);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean addNmeaListener(android.location.GpsStatus.NmeaListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean addNmeaListener(android.location.OnNmeaMessageListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void addProximityAlert(double, double, float, long, android.app.PendingIntent);
+ method public void addTestProvider(String, boolean, boolean, boolean, boolean, boolean, boolean, boolean, int, int);
+ method @Deprecated public void clearTestProviderEnabled(String);
+ method @Deprecated public void clearTestProviderLocation(String);
+ method @Deprecated public void clearTestProviderStatus(String);
method public java.util.List<java.lang.String> getAllProviders();
- method public java.lang.String getBestProvider(android.location.Criteria, boolean);
- method public java.lang.String getGnssHardwareModelName();
+ method public String getBestProvider(android.location.Criteria, boolean);
+ method @Nullable public String getGnssHardwareModelName();
method public int getGnssYearOfHardware();
- method public deprecated android.location.GpsStatus getGpsStatus(android.location.GpsStatus);
- method public android.location.Location getLastKnownLocation(java.lang.String);
- method public android.location.LocationProvider getProvider(java.lang.String);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public android.location.GpsStatus getGpsStatus(android.location.GpsStatus);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.location.Location getLastKnownLocation(String);
+ method public android.location.LocationProvider getProvider(String);
method public java.util.List<java.lang.String> getProviders(boolean);
method public java.util.List<java.lang.String> getProviders(android.location.Criteria, boolean);
method public boolean isLocationEnabled();
- method public boolean isProviderEnabled(java.lang.String);
- method public boolean registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback);
- method public boolean registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback, android.os.Handler);
+ method public boolean isProviderEnabled(String);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback, android.os.Handler);
method public boolean registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback);
- method public boolean registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback, android.os.Handler);
- method public boolean registerGnssStatusCallback(android.location.GnssStatus.Callback);
- method public boolean registerGnssStatusCallback(android.location.GnssStatus.Callback, android.os.Handler);
- method public deprecated void removeGpsStatusListener(android.location.GpsStatus.Listener);
- method public deprecated void removeNmeaListener(android.location.GpsStatus.NmeaListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssStatusCallback(android.location.GnssStatus.Callback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssStatusCallback(android.location.GnssStatus.Callback, android.os.Handler);
+ method @Deprecated public void removeGpsStatusListener(android.location.GpsStatus.Listener);
+ method @Deprecated public void removeNmeaListener(android.location.GpsStatus.NmeaListener);
method public void removeNmeaListener(android.location.OnNmeaMessageListener);
- method public void removeProximityAlert(android.app.PendingIntent);
- method public void removeTestProvider(java.lang.String);
- method public void removeUpdates(android.location.LocationListener);
+ method @RequiresPermission(anyOf={"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}, apis="..22") public void removeProximityAlert(android.app.PendingIntent);
+ method public void removeTestProvider(String);
+ method @RequiresPermission(anyOf={"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}, apis="..22") public void removeUpdates(android.location.LocationListener);
method public void removeUpdates(android.app.PendingIntent);
- method public void requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener);
- method public void requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener, android.os.Looper);
- method public void requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper);
- method public void requestLocationUpdates(java.lang.String, long, float, android.app.PendingIntent);
- method public void requestLocationUpdates(long, float, android.location.Criteria, android.app.PendingIntent);
- method public void requestSingleUpdate(java.lang.String, android.location.LocationListener, android.os.Looper);
- method public void requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper);
- method public void requestSingleUpdate(java.lang.String, android.app.PendingIntent);
- method public void requestSingleUpdate(android.location.Criteria, android.app.PendingIntent);
- method public boolean sendExtraCommand(java.lang.String, java.lang.String, android.os.Bundle);
- method public void setTestProviderEnabled(java.lang.String, boolean);
- method public void setTestProviderLocation(java.lang.String, android.location.Location);
- method public deprecated void setTestProviderStatus(java.lang.String, int, android.os.Bundle, long);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String, long, float, android.location.LocationListener);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String, long, float, android.app.PendingIntent);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, android.location.Criteria, android.app.PendingIntent);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(String, android.location.LocationListener, android.os.Looper);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(String, android.app.PendingIntent);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(android.location.Criteria, android.app.PendingIntent);
+ method public boolean sendExtraCommand(String, String, android.os.Bundle);
+ method public void setTestProviderEnabled(String, boolean);
+ method public void setTestProviderLocation(String, android.location.Location);
+ method @Deprecated public void setTestProviderStatus(String, int, android.os.Bundle, long);
method public void unregisterGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback);
method public void unregisterGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback);
method public void unregisterGnssStatusCallback(android.location.GnssStatus.Callback);
- field public static final java.lang.String GPS_PROVIDER = "gps";
- field public static final java.lang.String KEY_LOCATION_CHANGED = "location";
- field public static final java.lang.String KEY_PROVIDER_ENABLED = "providerEnabled";
- field public static final java.lang.String KEY_PROXIMITY_ENTERING = "entering";
- field public static final deprecated java.lang.String KEY_STATUS_CHANGED = "status";
- field public static final java.lang.String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
- field public static final java.lang.String NETWORK_PROVIDER = "network";
- field public static final java.lang.String PASSIVE_PROVIDER = "passive";
- field public static final java.lang.String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED";
+ field public static final String GPS_PROVIDER = "gps";
+ field public static final String KEY_LOCATION_CHANGED = "location";
+ field public static final String KEY_PROVIDER_ENABLED = "providerEnabled";
+ field public static final String KEY_PROXIMITY_ENTERING = "entering";
+ field @Deprecated public static final String KEY_STATUS_CHANGED = "status";
+ field public static final String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
+ field public static final String NETWORK_PROVIDER = "network";
+ field public static final String PASSIVE_PROVIDER = "passive";
+ field public static final String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED";
}
public class LocationProvider {
method public int getAccuracy();
- method public java.lang.String getName();
+ method public String getName();
method public int getPowerRequirement();
method public boolean hasMonetaryCost();
method public boolean meetsCriteria(android.location.Criteria);
@@ -22947,27 +22879,27 @@ package android.location {
method public boolean supportsAltitude();
method public boolean supportsBearing();
method public boolean supportsSpeed();
- field public static final deprecated int AVAILABLE = 2; // 0x2
- field public static final deprecated int OUT_OF_SERVICE = 0; // 0x0
- field public static final deprecated int TEMPORARILY_UNAVAILABLE = 1; // 0x1
+ field @Deprecated public static final int AVAILABLE = 2; // 0x2
+ field @Deprecated public static final int OUT_OF_SERVICE = 0; // 0x0
+ field @Deprecated public static final int TEMPORARILY_UNAVAILABLE = 1; // 0x1
}
- public abstract interface OnNmeaMessageListener {
- method public abstract void onNmeaMessage(java.lang.String, long);
+ public interface OnNmeaMessageListener {
+ method public void onNmeaMessage(String, long);
}
public abstract class SettingInjectorService extends android.app.Service {
- ctor public SettingInjectorService(java.lang.String);
+ ctor public SettingInjectorService(String);
method public final android.os.IBinder onBind(android.content.Intent);
method protected abstract boolean onGetEnabled();
- method protected abstract java.lang.String onGetSummary();
+ method protected abstract String onGetSummary();
method public final void onStart(android.content.Intent, int);
method public final int onStartCommand(android.content.Intent, int, int);
method public static final void refreshSettings(android.content.Context);
- field public static final java.lang.String ACTION_INJECTED_SETTING_CHANGED = "android.location.InjectedSettingChanged";
- field public static final java.lang.String ACTION_SERVICE_INTENT = "android.location.SettingInjectorService";
- field public static final java.lang.String ATTRIBUTES_NAME = "injected-location-setting";
- field public static final java.lang.String META_DATA_NAME = "android.location.SettingInjectorService";
+ field public static final String ACTION_INJECTED_SETTING_CHANGED = "android.location.InjectedSettingChanged";
+ field public static final String ACTION_SERVICE_INTENT = "android.location.SettingInjectorService";
+ field public static final String ATTRIBUTES_NAME = "injected-location-setting";
+ field public static final String META_DATA_NAME = "android.location.SettingInjectorService";
}
}
@@ -22975,9 +22907,9 @@ package android.location {
package android.media {
public class AsyncPlayer {
- ctor public AsyncPlayer(java.lang.String);
- method public deprecated void play(android.content.Context, android.net.Uri, boolean, int);
- method public void play(android.content.Context, android.net.Uri, boolean, android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
+ ctor public AsyncPlayer(String);
+ method @Deprecated public void play(android.content.Context, android.net.Uri, boolean, int);
+ method public void play(@NonNull android.content.Context, @NonNull android.net.Uri, boolean, @NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method public void stop();
}
@@ -22996,7 +22928,7 @@ package android.media {
field public static final android.os.Parcelable.Creator<android.media.AudioAttributes> CREATOR;
field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
- field public static final deprecated int FLAG_LOW_LATENCY = 256; // 0x100
+ field @Deprecated public static final int FLAG_LOW_LATENCY = 256; // 0x100
field public static final int USAGE_ALARM = 4; // 0x4
field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
@@ -23032,14 +22964,14 @@ package android.media {
}
public final class AudioDeviceInfo {
- method public java.lang.String getAddress();
- method public int[] getChannelCounts();
- method public int[] getChannelIndexMasks();
- method public int[] getChannelMasks();
- method public int[] getEncodings();
+ method @NonNull public String getAddress();
+ method @NonNull public int[] getChannelCounts();
+ method @NonNull public int[] getChannelIndexMasks();
+ method @NonNull public int[] getChannelMasks();
+ method @NonNull public int[] getEncodings();
method public int getId();
- method public java.lang.CharSequence getProductName();
- method public int[] getSampleRates();
+ method public CharSequence getProductName();
+ method @NonNull public int[] getSampleRates();
method public int getType();
method public boolean isSink();
method public boolean isSource();
@@ -23071,22 +23003,22 @@ package android.media {
public final class AudioFocusRequest {
method public boolean acceptsDelayedFocusGain();
- method public android.media.AudioAttributes getAudioAttributes();
+ method @NonNull public android.media.AudioAttributes getAudioAttributes();
method public int getFocusGain();
method public boolean willPauseWhenDucked();
}
public static final class AudioFocusRequest.Builder {
ctor public AudioFocusRequest.Builder(int);
- ctor public AudioFocusRequest.Builder(android.media.AudioFocusRequest);
+ ctor public AudioFocusRequest.Builder(@NonNull android.media.AudioFocusRequest);
method public android.media.AudioFocusRequest build();
- method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
- method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
- method public android.media.AudioFocusRequest.Builder setFocusGain(int);
- method public android.media.AudioFocusRequest.Builder setForceDucking(boolean);
- method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener);
- method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
- method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
+ method @NonNull public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
+ method @NonNull public android.media.AudioFocusRequest.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
+ method @NonNull public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method @NonNull public android.media.AudioFocusRequest.Builder setForceDucking(boolean);
+ method @NonNull public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(@NonNull android.media.AudioManager.OnAudioFocusChangeListener);
+ method @NonNull public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(@NonNull android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.os.Handler);
+ method @NonNull public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
}
public final class AudioFormat implements android.os.Parcelable {
@@ -23095,13 +23027,13 @@ package android.media {
method public int getChannelIndexMask();
method public int getChannelMask();
method public int getEncoding();
- method public int getFrameSizeInBytes();
+ method @IntRange(from=1) public int getFrameSizeInBytes();
method public int getSampleRate();
method public void writeToParcel(android.os.Parcel, int);
- field public static final deprecated int CHANNEL_CONFIGURATION_DEFAULT = 1; // 0x1
- field public static final deprecated int CHANNEL_CONFIGURATION_INVALID = 0; // 0x0
- field public static final deprecated int CHANNEL_CONFIGURATION_MONO = 2; // 0x2
- field public static final deprecated int CHANNEL_CONFIGURATION_STEREO = 3; // 0x3
+ field @Deprecated public static final int CHANNEL_CONFIGURATION_DEFAULT = 1; // 0x1
+ field @Deprecated public static final int CHANNEL_CONFIGURATION_INVALID = 0; // 0x0
+ field @Deprecated public static final int CHANNEL_CONFIGURATION_MONO = 2; // 0x2
+ field @Deprecated public static final int CHANNEL_CONFIGURATION_STEREO = 3; // 0x3
field public static final int CHANNEL_INVALID = 0; // 0x0
field public static final int CHANNEL_IN_BACK = 32; // 0x20
field public static final int CHANNEL_IN_BACK_PROCESSED = 512; // 0x200
@@ -23121,7 +23053,7 @@ package android.media {
field public static final int CHANNEL_IN_Y_AXIS = 4096; // 0x1000
field public static final int CHANNEL_IN_Z_AXIS = 8192; // 0x2000
field public static final int CHANNEL_OUT_5POINT1 = 252; // 0xfc
- field public static final deprecated int CHANNEL_OUT_7POINT1 = 1020; // 0x3fc
+ field @Deprecated public static final int CHANNEL_OUT_7POINT1 = 1020; // 0x3fc
field public static final int CHANNEL_OUT_7POINT1_SURROUND = 6396; // 0x18fc
field public static final int CHANNEL_OUT_BACK_CENTER = 1024; // 0x400
field public static final int CHANNEL_OUT_BACK_LEFT = 64; // 0x40
@@ -23167,87 +23099,87 @@ package android.media {
ctor public AudioFormat.Builder();
ctor public AudioFormat.Builder(android.media.AudioFormat);
method public android.media.AudioFormat build();
- method public android.media.AudioFormat.Builder setChannelIndexMask(int);
- method public android.media.AudioFormat.Builder setChannelMask(int);
+ method @NonNull public android.media.AudioFormat.Builder setChannelIndexMask(int);
+ method @NonNull public android.media.AudioFormat.Builder setChannelMask(int);
method public android.media.AudioFormat.Builder setEncoding(int) throws java.lang.IllegalArgumentException;
method public android.media.AudioFormat.Builder setSampleRate(int) throws java.lang.IllegalArgumentException;
}
public class AudioManager {
- method public deprecated int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
- method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
+ method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public int abandonAudioFocusRequest(@NonNull android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
method public void adjustVolume(int, int);
method public void dispatchMediaKeyEvent(android.view.KeyEvent);
method public int generateAudioSessionId();
- method public java.util.List<android.media.AudioPlaybackConfiguration> getActivePlaybackConfigurations();
- method public java.util.List<android.media.AudioRecordingConfiguration> getActiveRecordingConfigurations();
+ method @NonNull public java.util.List<android.media.AudioPlaybackConfiguration> getActivePlaybackConfigurations();
+ method @NonNull public java.util.List<android.media.AudioRecordingConfiguration> getActiveRecordingConfigurations();
method public android.media.AudioDeviceInfo[] getDevices(int);
method public java.util.List<android.media.MicrophoneInfo> getMicrophones() throws java.io.IOException;
method public int getMode();
- method public java.lang.String getParameters(java.lang.String);
- method public java.lang.String getProperty(java.lang.String);
+ method public String getParameters(String);
+ method public String getProperty(String);
method public int getRingerMode();
- method public deprecated int getRouting(int);
+ method @Deprecated public int getRouting(int);
method public int getStreamMaxVolume(int);
method public int getStreamMinVolume(int);
method public int getStreamVolume(int);
method public float getStreamVolumeDb(int, int, int);
- method public deprecated int getVibrateSetting(int);
- method public deprecated boolean isBluetoothA2dpOn();
+ method @Deprecated public int getVibrateSetting(int);
+ method @Deprecated public boolean isBluetoothA2dpOn();
method public boolean isBluetoothScoAvailableOffCall();
method public boolean isBluetoothScoOn();
method public static boolean isHapticPlaybackSupported();
method public boolean isMicrophoneMute();
method public boolean isMusicActive();
- method public static boolean isOffloadedPlaybackSupported(android.media.AudioFormat);
+ method public static boolean isOffloadedPlaybackSupported(@NonNull android.media.AudioFormat);
method public boolean isSpeakerphoneOn();
method public boolean isStreamMute(int);
method public boolean isVolumeFixed();
- method public deprecated boolean isWiredHeadsetOn();
+ method @Deprecated public boolean isWiredHeadsetOn();
method public void loadSoundEffects();
method public void playSoundEffect(int);
method public void playSoundEffect(int, float);
method public void registerAudioDeviceCallback(android.media.AudioDeviceCallback, android.os.Handler);
- method public void registerAudioPlaybackCallback(android.media.AudioManager.AudioPlaybackCallback, android.os.Handler);
- method public void registerAudioRecordingCallback(android.media.AudioManager.AudioRecordingCallback, android.os.Handler);
- method public deprecated void registerMediaButtonEventReceiver(android.content.ComponentName);
- method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent);
- method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
- method public deprecated boolean registerRemoteController(android.media.RemoteController);
- method public deprecated int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
- method public int requestAudioFocus(android.media.AudioFocusRequest);
- method public deprecated void setBluetoothA2dpOn(boolean);
+ method public void registerAudioPlaybackCallback(@NonNull android.media.AudioManager.AudioPlaybackCallback, android.os.Handler);
+ method public void registerAudioRecordingCallback(@NonNull android.media.AudioManager.AudioRecordingCallback, android.os.Handler);
+ method @Deprecated public void registerMediaButtonEventReceiver(android.content.ComponentName);
+ method @Deprecated public void registerMediaButtonEventReceiver(android.app.PendingIntent);
+ method @Deprecated public void registerRemoteControlClient(android.media.RemoteControlClient);
+ method @Deprecated public boolean registerRemoteController(android.media.RemoteController);
+ method @Deprecated public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public int requestAudioFocus(@NonNull android.media.AudioFocusRequest);
+ method @Deprecated public void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
method public void setMicrophoneMute(boolean);
method public void setMode(int);
- method public void setParameters(java.lang.String);
+ method public void setParameters(String);
method public void setRingerMode(int);
- method public deprecated void setRouting(int, int, int);
+ method @Deprecated public void setRouting(int, int, int);
method public void setSpeakerphoneOn(boolean);
- method public deprecated void setStreamMute(int, boolean);
- method public deprecated void setStreamSolo(int, boolean);
+ method @Deprecated public void setStreamMute(int, boolean);
+ method @Deprecated public void setStreamSolo(int, boolean);
method public void setStreamVolume(int, int, int);
- method public deprecated void setVibrateSetting(int, int);
- method public deprecated void setWiredHeadsetOn(boolean);
- method public deprecated boolean shouldVibrate(int);
+ method @Deprecated public void setVibrateSetting(int, int);
+ method @Deprecated public void setWiredHeadsetOn(boolean);
+ method @Deprecated public boolean shouldVibrate(int);
method public void startBluetoothSco();
method public void stopBluetoothSco();
method public void unloadSoundEffects();
method public void unregisterAudioDeviceCallback(android.media.AudioDeviceCallback);
- method public void unregisterAudioPlaybackCallback(android.media.AudioManager.AudioPlaybackCallback);
- method public void unregisterAudioRecordingCallback(android.media.AudioManager.AudioRecordingCallback);
- method public deprecated void unregisterMediaButtonEventReceiver(android.content.ComponentName);
- method public deprecated void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
- method public deprecated void unregisterRemoteControlClient(android.media.RemoteControlClient);
- method public deprecated void unregisterRemoteController(android.media.RemoteController);
- field public static final java.lang.String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
- field public static final java.lang.String ACTION_HDMI_AUDIO_PLUG = "android.media.action.HDMI_AUDIO_PLUG";
- field public static final java.lang.String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
- field public static final java.lang.String ACTION_MICROPHONE_MUTE_CHANGED = "android.media.action.MICROPHONE_MUTE_CHANGED";
- field public static final deprecated java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
- field public static final java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
+ method public void unregisterAudioPlaybackCallback(@NonNull android.media.AudioManager.AudioPlaybackCallback);
+ method public void unregisterAudioRecordingCallback(@NonNull android.media.AudioManager.AudioRecordingCallback);
+ method @Deprecated public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
+ method @Deprecated public void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
+ method @Deprecated public void unregisterRemoteControlClient(android.media.RemoteControlClient);
+ method @Deprecated public void unregisterRemoteController(android.media.RemoteController);
+ field public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
+ field public static final String ACTION_HDMI_AUDIO_PLUG = "android.media.action.HDMI_AUDIO_PLUG";
+ field public static final String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
+ field public static final String ACTION_MICROPHONE_MUTE_CHANGED = "android.media.action.MICROPHONE_MUTE_CHANGED";
+ field @Deprecated public static final String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
+ field public static final String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
field public static final int ADJUST_LOWER = -1; // 0xffffffff
field public static final int ADJUST_MUTE = -100; // 0xffffff9c
field public static final int ADJUST_RAISE = 1; // 0x1
@@ -23268,14 +23200,14 @@ package android.media {
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_DEAD_OBJECT = -6; // 0xfffffffa
- field public static final java.lang.String EXTRA_AUDIO_PLUG_STATE = "android.media.extra.AUDIO_PLUG_STATE";
- field public static final java.lang.String EXTRA_ENCODINGS = "android.media.extra.ENCODINGS";
- field public static final java.lang.String EXTRA_MAX_CHANNEL_COUNT = "android.media.extra.MAX_CHANNEL_COUNT";
- field public static final java.lang.String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
- field public static final java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE = "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
- field public static final java.lang.String EXTRA_SCO_AUDIO_STATE = "android.media.extra.SCO_AUDIO_STATE";
- field public static final deprecated java.lang.String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
- field public static final deprecated java.lang.String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
+ field public static final String EXTRA_AUDIO_PLUG_STATE = "android.media.extra.AUDIO_PLUG_STATE";
+ field public static final String EXTRA_ENCODINGS = "android.media.extra.ENCODINGS";
+ field public static final String EXTRA_MAX_CHANNEL_COUNT = "android.media.extra.MAX_CHANNEL_COUNT";
+ field public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
+ field public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE = "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
+ field public static final String EXTRA_SCO_AUDIO_STATE = "android.media.extra.SCO_AUDIO_STATE";
+ field @Deprecated public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
+ field @Deprecated public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
field public static final int FLAG_ALLOW_RINGER_MODES = 2; // 0x2
field public static final int FLAG_PLAY_SOUND = 4; // 0x4
field public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 8; // 0x8
@@ -23300,23 +23232,23 @@ package android.media {
field public static final int MODE_IN_COMMUNICATION = 3; // 0x3
field public static final int MODE_NORMAL = 0; // 0x0
field public static final int MODE_RINGTONE = 1; // 0x1
- field public static final deprecated int NUM_STREAMS = 5; // 0x5
- field public static final java.lang.String PROPERTY_OUTPUT_FRAMES_PER_BUFFER = "android.media.property.OUTPUT_FRAMES_PER_BUFFER";
- field public static final java.lang.String PROPERTY_OUTPUT_SAMPLE_RATE = "android.media.property.OUTPUT_SAMPLE_RATE";
- field public static final java.lang.String PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED = "android.media.property.SUPPORT_AUDIO_SOURCE_UNPROCESSED";
- field public static final java.lang.String PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND = "android.media.property.SUPPORT_MIC_NEAR_ULTRASOUND";
- field public static final java.lang.String PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND = "android.media.property.SUPPORT_SPEAKER_NEAR_ULTRASOUND";
- field public static final java.lang.String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
+ field @Deprecated public static final int NUM_STREAMS = 5; // 0x5
+ field public static final String PROPERTY_OUTPUT_FRAMES_PER_BUFFER = "android.media.property.OUTPUT_FRAMES_PER_BUFFER";
+ field public static final String PROPERTY_OUTPUT_SAMPLE_RATE = "android.media.property.OUTPUT_SAMPLE_RATE";
+ field public static final String PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED = "android.media.property.SUPPORT_AUDIO_SOURCE_UNPROCESSED";
+ field public static final String PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND = "android.media.property.SUPPORT_MIC_NEAR_ULTRASOUND";
+ field public static final String PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND = "android.media.property.SUPPORT_SPEAKER_NEAR_ULTRASOUND";
+ field public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
field public static final int RINGER_MODE_NORMAL = 2; // 0x2
field public static final int RINGER_MODE_SILENT = 0; // 0x0
field public static final int RINGER_MODE_VIBRATE = 1; // 0x1
- field public static final deprecated int ROUTE_ALL = -1; // 0xffffffff
- field public static final deprecated int ROUTE_BLUETOOTH = 4; // 0x4
- field public static final deprecated int ROUTE_BLUETOOTH_A2DP = 16; // 0x10
- field public static final deprecated int ROUTE_BLUETOOTH_SCO = 4; // 0x4
- field public static final deprecated int ROUTE_EARPIECE = 1; // 0x1
- field public static final deprecated int ROUTE_HEADSET = 8; // 0x8
- field public static final deprecated int ROUTE_SPEAKER = 2; // 0x2
+ field @Deprecated public static final int ROUTE_ALL = -1; // 0xffffffff
+ field @Deprecated public static final int ROUTE_BLUETOOTH = 4; // 0x4
+ field @Deprecated public static final int ROUTE_BLUETOOTH_A2DP = 16; // 0x10
+ field @Deprecated public static final int ROUTE_BLUETOOTH_SCO = 4; // 0x4
+ field @Deprecated public static final int ROUTE_EARPIECE = 1; // 0x1
+ field @Deprecated public static final int ROUTE_HEADSET = 8; // 0x8
+ field @Deprecated public static final int ROUTE_SPEAKER = 2; // 0x2
field public static final int SCO_AUDIO_STATE_CONNECTED = 1; // 0x1
field public static final int SCO_AUDIO_STATE_CONNECTING = 2; // 0x2
field public static final int SCO_AUDIO_STATE_DISCONNECTED = 0; // 0x0
@@ -23330,26 +23262,26 @@ package android.media {
field public static final int STREAM_SYSTEM = 1; // 0x1
field public static final int STREAM_VOICE_CALL = 0; // 0x0
field public static final int USE_DEFAULT_STREAM_TYPE = -2147483648; // 0x80000000
- field public static final deprecated java.lang.String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
- field public static final deprecated int VIBRATE_SETTING_OFF = 0; // 0x0
- field public static final deprecated int VIBRATE_SETTING_ON = 1; // 0x1
- field public static final deprecated int VIBRATE_SETTING_ONLY_SILENT = 2; // 0x2
- field public static final deprecated int VIBRATE_TYPE_NOTIFICATION = 1; // 0x1
- field public static final deprecated int VIBRATE_TYPE_RINGER = 0; // 0x0
+ field @Deprecated public static final String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
+ field @Deprecated public static final int VIBRATE_SETTING_OFF = 0; // 0x0
+ field @Deprecated public static final int VIBRATE_SETTING_ON = 1; // 0x1
+ field @Deprecated public static final int VIBRATE_SETTING_ONLY_SILENT = 2; // 0x2
+ field @Deprecated public static final int VIBRATE_TYPE_NOTIFICATION = 1; // 0x1
+ field @Deprecated public static final int VIBRATE_TYPE_RINGER = 0; // 0x0
}
- public static abstract class AudioManager.AudioPlaybackCallback {
+ public abstract static class AudioManager.AudioPlaybackCallback {
ctor public AudioManager.AudioPlaybackCallback();
method public void onPlaybackConfigChanged(java.util.List<android.media.AudioPlaybackConfiguration>);
}
- public static abstract class AudioManager.AudioRecordingCallback {
+ public abstract static class AudioManager.AudioRecordingCallback {
ctor public AudioManager.AudioRecordingCallback();
method public void onRecordingConfigChanged(java.util.List<android.media.AudioRecordingConfiguration>);
}
- public static abstract interface AudioManager.OnAudioFocusChangeListener {
- method public abstract void onAudioFocusChange(int);
+ public static interface AudioManager.OnAudioFocusChangeListener {
+ method public void onAudioFocusChange(int);
}
public final class AudioPlaybackConfiguration implements android.os.Parcelable {
@@ -23360,7 +23292,7 @@ package android.media {
}
public final class AudioPresentation {
- method public java.util.Map<java.util.Locale, java.lang.String> getLabels();
+ method public java.util.Map<java.util.Locale,java.lang.String> getLabels();
method public java.util.Locale getLocale();
method public int getMasteringIndication();
method public int getPresentationId();
@@ -23377,30 +23309,30 @@ package android.media {
public static class AudioPresentation.Builder {
ctor public AudioPresentation.Builder(int);
- method public android.media.AudioPresentation build();
- method public android.media.AudioPresentation.Builder setHasAudioDescription(boolean);
- method public android.media.AudioPresentation.Builder setHasDialogueEnhancement(boolean);
- method public android.media.AudioPresentation.Builder setHasSpokenSubtitles(boolean);
- method public android.media.AudioPresentation.Builder setLabels(java.util.Map<android.icu.util.ULocale, java.lang.String>);
- method public android.media.AudioPresentation.Builder setLocale(android.icu.util.ULocale);
- method public android.media.AudioPresentation.Builder setMasteringIndication(int);
- method public android.media.AudioPresentation.Builder setProgramId(int);
+ method @NonNull public android.media.AudioPresentation build();
+ method @NonNull public android.media.AudioPresentation.Builder setHasAudioDescription(boolean);
+ method @NonNull public android.media.AudioPresentation.Builder setHasDialogueEnhancement(boolean);
+ method @NonNull public android.media.AudioPresentation.Builder setHasSpokenSubtitles(boolean);
+ method @NonNull public android.media.AudioPresentation.Builder setLabels(@NonNull java.util.Map<android.icu.util.ULocale,java.lang.String>);
+ method @NonNull public android.media.AudioPresentation.Builder setLocale(android.icu.util.ULocale);
+ method @NonNull public android.media.AudioPresentation.Builder setMasteringIndication(int);
+ method @NonNull public android.media.AudioPresentation.Builder setProgramId(int);
}
public class AudioRecord implements android.media.AudioRecordingMonitor android.media.AudioRouting {
ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public deprecated void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler);
+ method @Deprecated public void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler);
method protected void finalize();
method public java.util.List<android.media.MicrophoneInfo> getActiveMicrophones() throws java.io.IOException;
- method public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
+ method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
method public int getAudioFormat();
method public int getAudioSessionId();
method public int getAudioSource();
method public int getBufferSizeInFrames();
method public int getChannelConfiguration();
method public int getChannelCount();
- method public android.media.AudioFormat getFormat();
+ method @NonNull public android.media.AudioFormat getFormat();
method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
method public int getNotificationMarkerPosition();
@@ -23410,18 +23342,18 @@ package android.media {
method public android.media.AudioDeviceInfo getRoutedDevice();
method public int getSampleRate();
method public int getState();
- method public int getTimestamp(android.media.AudioTimestamp, int);
- method public int read(byte[], int, int);
- method public int read(byte[], int, int, int);
- method public int read(short[], int, int);
- method public int read(short[], int, int, int);
- method public int read(float[], int, int, int);
- method public int read(java.nio.ByteBuffer, int);
- method public int read(java.nio.ByteBuffer, int, int);
- method public void registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback);
+ method public int getTimestamp(@NonNull android.media.AudioTimestamp, int);
+ method public int read(@NonNull byte[], int, int);
+ method public int read(@NonNull byte[], int, int, int);
+ method public int read(@NonNull short[], int, int);
+ method public int read(@NonNull short[], int, int, int);
+ method public int read(@NonNull float[], int, int, int);
+ method public int read(@NonNull java.nio.ByteBuffer, int);
+ method public int read(@NonNull java.nio.ByteBuffer, int, int);
+ method public void registerAudioRecordingCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioRecordingCallback);
method public void release();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
- method public deprecated void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener);
+ method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener);
method public int setNotificationMarkerPosition(int);
method public int setPositionNotificationPeriod(int);
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
@@ -23430,7 +23362,7 @@ package android.media {
method public void startRecording() throws java.lang.IllegalStateException;
method public void startRecording(android.media.MediaSyncEvent) throws java.lang.IllegalStateException;
method public void stop() throws java.lang.IllegalStateException;
- method public void unregisterAudioRecordingCallback(android.media.AudioManager.AudioRecordingCallback);
+ method public void unregisterAudioRecordingCallback(@NonNull android.media.AudioManager.AudioRecordingCallback);
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
field public static final int ERROR_DEAD_OBJECT = -6; // 0xfffffffa
@@ -23447,27 +23379,27 @@ package android.media {
public static class AudioRecord.Builder {
ctor public AudioRecord.Builder();
method public android.media.AudioRecord build() throws java.lang.UnsupportedOperationException;
- method public android.media.AudioRecord.Builder setAudioFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException;
+ method public android.media.AudioRecord.Builder setAudioFormat(@NonNull android.media.AudioFormat) throws java.lang.IllegalArgumentException;
method public android.media.AudioRecord.Builder setAudioSource(int) throws java.lang.IllegalArgumentException;
method public android.media.AudioRecord.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
}
public static final class AudioRecord.MetricsConstants {
- field public static final java.lang.String CHANNELS = "android.media.audiorecord.channels";
- field public static final java.lang.String ENCODING = "android.media.audiorecord.encoding";
- field public static final java.lang.String LATENCY = "android.media.audiorecord.latency";
- field public static final java.lang.String SAMPLERATE = "android.media.audiorecord.samplerate";
- field public static final java.lang.String SOURCE = "android.media.audiorecord.source";
+ field public static final String CHANNELS = "android.media.audiorecord.channels";
+ field public static final String ENCODING = "android.media.audiorecord.encoding";
+ field public static final String LATENCY = "android.media.audiorecord.latency";
+ field public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+ field public static final String SOURCE = "android.media.audiorecord.source";
}
- public static abstract interface AudioRecord.OnRecordPositionUpdateListener {
- method public abstract void onMarkerReached(android.media.AudioRecord);
- method public abstract void onPeriodicNotification(android.media.AudioRecord);
+ public static interface AudioRecord.OnRecordPositionUpdateListener {
+ method public void onMarkerReached(android.media.AudioRecord);
+ method public void onPeriodicNotification(android.media.AudioRecord);
}
- public static abstract deprecated interface AudioRecord.OnRoutingChangedListener implements android.media.AudioRouting.OnRoutingChangedListener {
- method public abstract void onRoutingChanged(android.media.AudioRecord);
- method public default void onRoutingChanged(android.media.AudioRouting);
+ @Deprecated public static interface AudioRecord.OnRoutingChangedListener extends android.media.AudioRouting.OnRoutingChangedListener {
+ method @Deprecated public void onRoutingChanged(android.media.AudioRecord);
+ method @Deprecated public default void onRoutingChanged(android.media.AudioRouting);
}
public final class AudioRecordingConfiguration implements android.os.Parcelable {
@@ -23476,31 +23408,31 @@ package android.media {
method public int getAudioSource();
method public int getClientAudioSessionId();
method public int getClientAudioSource();
- method public java.util.List<android.media.audiofx.AudioEffect.Descriptor> getClientEffects();
+ method @NonNull public java.util.List<android.media.audiofx.AudioEffect.Descriptor> getClientEffects();
method public android.media.AudioFormat getClientFormat();
- method public java.util.List<android.media.audiofx.AudioEffect.Descriptor> getEffects();
+ method @NonNull public java.util.List<android.media.audiofx.AudioEffect.Descriptor> getEffects();
method public android.media.AudioFormat getFormat();
method public boolean isClientSilenced();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.AudioRecordingConfiguration> CREATOR;
}
- public abstract interface AudioRecordingMonitor {
- method public abstract android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
- method public abstract void registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback);
- method public abstract void unregisterAudioRecordingCallback(android.media.AudioManager.AudioRecordingCallback);
+ public interface AudioRecordingMonitor {
+ method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
+ method public void registerAudioRecordingCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioRecordingCallback);
+ method public void unregisterAudioRecordingCallback(@NonNull android.media.AudioManager.AudioRecordingCallback);
}
- public abstract interface AudioRouting {
- method public abstract void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public abstract android.media.AudioDeviceInfo getPreferredDevice();
- method public abstract android.media.AudioDeviceInfo getRoutedDevice();
- method public abstract void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
- method public abstract boolean setPreferredDevice(android.media.AudioDeviceInfo);
+ public interface AudioRouting {
+ method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
+ method public android.media.AudioDeviceInfo getPreferredDevice();
+ method public android.media.AudioDeviceInfo getRoutedDevice();
+ method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
+ method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
}
- public static abstract interface AudioRouting.OnRoutingChangedListener {
- method public abstract void onRoutingChanged(android.media.AudioRouting);
+ public static interface AudioRouting.OnRoutingChangedListener {
+ method public void onRoutingChanged(android.media.AudioRouting);
}
public final class AudioTimestamp {
@@ -23512,34 +23444,35 @@ package android.media {
}
public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
- ctor public deprecated AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
- ctor public deprecated AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
+ ctor @Deprecated public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
+ ctor @Deprecated public AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
+ method @Deprecated public void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
- method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
+ method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method protected void finalize();
method public void flush();
- method public android.media.AudioAttributes getAudioAttributes();
+ method @NonNull public android.media.AudioAttributes getAudioAttributes();
method public int getAudioFormat();
method public int getAudioSessionId();
method public int getBufferCapacityInFrames();
method public int getBufferSizeInFrames();
method public int getChannelConfiguration();
method public int getChannelCount();
- method public android.media.AudioFormat getFormat();
+ method @NonNull public android.media.AudioFormat getFormat();
method public static float getMaxVolume();
method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
method public static float getMinVolume();
- method protected deprecated int getNativeFrameCount();
+ method @Deprecated protected int getNativeFrameCount();
method public static int getNativeOutputSampleRate(int);
method public int getNotificationMarkerPosition();
method public int getPerformanceMode();
method public int getPlayState();
method public int getPlaybackHeadPosition();
- method public android.media.PlaybackParams getPlaybackParams();
+ method @NonNull public android.media.PlaybackParams getPlaybackParams();
method public int getPlaybackRate();
method public int getPositionNotificationPeriod();
method public android.media.AudioDeviceInfo getPreferredDevice();
@@ -23549,38 +23482,38 @@ package android.media {
method public int getStreamType();
method public boolean getTimestamp(android.media.AudioTimestamp);
method public int getUnderrunCount();
- method public static boolean isDirectPlaybackSupported(android.media.AudioFormat, android.media.AudioAttributes);
+ method public static boolean isDirectPlaybackSupported(@NonNull android.media.AudioFormat, @NonNull android.media.AudioAttributes);
method public void pause() throws java.lang.IllegalStateException;
method public void play() throws java.lang.IllegalStateException;
- method public void registerStreamEventCallback(java.util.concurrent.Executor, android.media.AudioTrack.StreamEventCallback);
+ method public void registerStreamEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioTrack.StreamEventCallback);
method public void release();
method public int reloadStaticData();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
- method public deprecated void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener);
+ method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener);
method public int setAuxEffectSendLevel(float);
method public int setBufferSizeInFrames(int);
method public int setLoopPoints(int, int, int);
method public int setNotificationMarkerPosition(int);
method public int setPlaybackHeadPosition(int);
- method public void setPlaybackParams(android.media.PlaybackParams);
+ method public void setPlaybackParams(@NonNull android.media.PlaybackParams);
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener);
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler);
method public int setPlaybackRate(int);
method public int setPositionNotificationPeriod(int);
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
- method public int setPresentation(android.media.AudioPresentation);
- method protected deprecated void setState(int);
- method public deprecated int setStereoVolume(float, float);
+ method public int setPresentation(@NonNull android.media.AudioPresentation);
+ method @Deprecated protected void setState(int);
+ method @Deprecated public int setStereoVolume(float, float);
method public int setVolume(float);
method public void stop() throws java.lang.IllegalStateException;
- method public void unregisterStreamEventCallback(android.media.AudioTrack.StreamEventCallback);
- method public int write(byte[], int, int);
- method public int write(byte[], int, int, int);
- method public int write(short[], int, int);
- method public int write(short[], int, int, int);
- method public int write(float[], int, int, int);
- method public int write(java.nio.ByteBuffer, int, int);
- method public int write(java.nio.ByteBuffer, int, int, long);
+ method public void unregisterStreamEventCallback(@NonNull android.media.AudioTrack.StreamEventCallback);
+ method public int write(@NonNull byte[], int, int);
+ method public int write(@NonNull byte[], int, int, int);
+ method public int write(@NonNull short[], int, int);
+ method public int write(@NonNull short[], int, int, int);
+ method public int write(@NonNull float[], int, int, int);
+ method public int write(@NonNull java.nio.ByteBuffer, int, int);
+ method public int write(@NonNull java.nio.ByteBuffer, int, int, long);
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
field public static final int ERROR_DEAD_OBJECT = -6; // 0xfffffffa
@@ -23603,35 +23536,35 @@ package android.media {
public static class AudioTrack.Builder {
ctor public AudioTrack.Builder();
- method public android.media.AudioTrack build() throws java.lang.UnsupportedOperationException;
- method public android.media.AudioTrack.Builder setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
- method public android.media.AudioTrack.Builder setAudioFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException;
- method public android.media.AudioTrack.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
- method public android.media.AudioTrack.Builder setOffloadedPlayback(boolean);
- method public android.media.AudioTrack.Builder setPerformanceMode(int);
- method public android.media.AudioTrack.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
- method public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack build() throws java.lang.UnsupportedOperationException;
+ method @NonNull public android.media.AudioTrack.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setAudioFormat(@NonNull android.media.AudioFormat) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setOffloadedPlayback(boolean);
+ method @NonNull public android.media.AudioTrack.Builder setPerformanceMode(int);
+ method @NonNull public android.media.AudioTrack.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
}
public static final class AudioTrack.MetricsConstants {
- field public static final java.lang.String CHANNELMASK = "android.media.audiorecord.channelmask";
- field public static final java.lang.String CONTENTTYPE = "android.media.audiotrack.type";
- field public static final java.lang.String SAMPLERATE = "android.media.audiorecord.samplerate";
- field public static final java.lang.String STREAMTYPE = "android.media.audiotrack.streamtype";
- field public static final java.lang.String USAGE = "android.media.audiotrack.usage";
+ field public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
+ field public static final String CONTENTTYPE = "android.media.audiotrack.type";
+ field public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+ field public static final String STREAMTYPE = "android.media.audiotrack.streamtype";
+ field public static final String USAGE = "android.media.audiotrack.usage";
}
- public static abstract interface AudioTrack.OnPlaybackPositionUpdateListener {
- method public abstract void onMarkerReached(android.media.AudioTrack);
- method public abstract void onPeriodicNotification(android.media.AudioTrack);
+ public static interface AudioTrack.OnPlaybackPositionUpdateListener {
+ method public void onMarkerReached(android.media.AudioTrack);
+ method public void onPeriodicNotification(android.media.AudioTrack);
}
- public static abstract deprecated interface AudioTrack.OnRoutingChangedListener implements android.media.AudioRouting.OnRoutingChangedListener {
- method public abstract void onRoutingChanged(android.media.AudioTrack);
- method public default void onRoutingChanged(android.media.AudioRouting);
+ @Deprecated public static interface AudioTrack.OnRoutingChangedListener extends android.media.AudioRouting.OnRoutingChangedListener {
+ method @Deprecated public void onRoutingChanged(android.media.AudioTrack);
+ method @Deprecated public default void onRoutingChanged(android.media.AudioRouting);
}
- public static abstract class AudioTrack.StreamEventCallback {
+ public abstract static class AudioTrack.StreamEventCallback {
ctor public AudioTrack.StreamEventCallback();
method public void onDataRequest(android.media.AudioTrack, int);
method public void onPresentationEnded(android.media.AudioTrack);
@@ -23642,11 +23575,11 @@ package android.media {
method public android.media.DataSourceCallback getDataSourceCallback();
}
- public static class CallbackDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase {
+ public static class CallbackDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.CallbackDataSourceDesc.Builder> {
ctor public CallbackDataSourceDesc.Builder();
ctor public CallbackDataSourceDesc.Builder(android.media.CallbackDataSourceDesc);
- method public android.media.CallbackDataSourceDesc build();
- method public android.media.CallbackDataSourceDesc.Builder setDataSource(android.media.DataSourceCallback);
+ method @NonNull public android.media.CallbackDataSourceDesc build();
+ method @NonNull public android.media.CallbackDataSourceDesc.Builder setDataSource(@NonNull android.media.DataSourceCallback);
}
public class CamcorderProfile {
@@ -23709,20 +23642,20 @@ package android.media {
public class DataSourceDesc {
method public long getEndPosition();
- method public java.lang.String getMediaId();
+ method public String getMediaId();
method public long getStartPosition();
field public static final long LONG_MAX_TIME_MS = 576460752303423L; // 0x20c49ba5e353fL
field public static final long POSITION_UNKNOWN = 576460752303423L; // 0x20c49ba5e353fL
}
protected static class DataSourceDesc.BuilderBase<T extends android.media.DataSourceDesc.BuilderBase> {
- method public T setEndPosition(long);
- method public T setMediaId(java.lang.String);
- method public T setStartPosition(long);
+ method @NonNull public T setEndPosition(long);
+ method @NonNull public T setMediaId(String);
+ method @NonNull public T setStartPosition(long);
}
public final class DeniedByServerException extends android.media.MediaDrmException {
- ctor public DeniedByServerException(java.lang.String);
+ ctor public DeniedByServerException(String);
}
public abstract class DrmInitData {
@@ -23731,29 +23664,29 @@ package android.media {
public static final class DrmInitData.SchemeInitData {
field public final byte[] data;
- field public final java.lang.String mimeType;
+ field public final String mimeType;
}
public class ExifInterface {
- ctor public ExifInterface(java.io.File) throws java.io.IOException;
- ctor public ExifInterface(java.lang.String) throws java.io.IOException;
- ctor public ExifInterface(java.io.FileDescriptor) throws java.io.IOException;
- ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
+ ctor public ExifInterface(@NonNull java.io.File) throws java.io.IOException;
+ ctor public ExifInterface(@NonNull String) throws java.io.IOException;
+ ctor public ExifInterface(@NonNull java.io.FileDescriptor) throws java.io.IOException;
+ ctor public ExifInterface(@NonNull java.io.InputStream) throws java.io.IOException;
method public double getAltitude(double);
- method public java.lang.String getAttribute(java.lang.String);
- method public double getAttributeDouble(java.lang.String, double);
- method public int getAttributeInt(java.lang.String, int);
- method public long[] getAttributeRange(java.lang.String);
+ method @Nullable public String getAttribute(@NonNull String);
+ method public double getAttributeDouble(@NonNull String, double);
+ method public int getAttributeInt(@NonNull String, int);
+ method @Nullable public long[] getAttributeRange(@NonNull String);
method public boolean getLatLong(float[]);
method public byte[] getThumbnail();
method public android.graphics.Bitmap getThumbnailBitmap();
method public byte[] getThumbnailBytes();
- method public long[] getThumbnailRange();
- method public boolean hasAttribute(java.lang.String);
+ method @Nullable public long[] getThumbnailRange();
+ method public boolean hasAttribute(String);
method public boolean hasThumbnail();
method public boolean isThumbnailCompressed();
method public void saveAttributes() throws java.io.IOException;
- method public void setAttribute(java.lang.String, java.lang.String);
+ method public void setAttribute(@NonNull String, @Nullable String);
field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
field public static final int ORIENTATION_NORMAL = 1; // 0x1
@@ -23763,144 +23696,144 @@ package android.media {
field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
- field public static final deprecated java.lang.String TAG_APERTURE = "FNumber";
- field public static final java.lang.String TAG_APERTURE_VALUE = "ApertureValue";
- field public static final java.lang.String TAG_ARTIST = "Artist";
- field public static final java.lang.String TAG_BITS_PER_SAMPLE = "BitsPerSample";
- field public static final java.lang.String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
- field public static final java.lang.String TAG_CFA_PATTERN = "CFAPattern";
- field public static final java.lang.String TAG_COLOR_SPACE = "ColorSpace";
- field public static final java.lang.String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
- field public static final java.lang.String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
- field public static final java.lang.String TAG_COMPRESSION = "Compression";
- field public static final java.lang.String TAG_CONTRAST = "Contrast";
- field public static final java.lang.String TAG_COPYRIGHT = "Copyright";
- field public static final java.lang.String TAG_CUSTOM_RENDERED = "CustomRendered";
- field public static final java.lang.String TAG_DATETIME = "DateTime";
- field public static final java.lang.String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
- field public static final java.lang.String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
- field public static final java.lang.String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
- field public static final java.lang.String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
- field public static final java.lang.String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
- field public static final java.lang.String TAG_DNG_VERSION = "DNGVersion";
- field public static final java.lang.String TAG_EXIF_VERSION = "ExifVersion";
- field public static final java.lang.String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
- field public static final java.lang.String TAG_EXPOSURE_INDEX = "ExposureIndex";
- field public static final java.lang.String TAG_EXPOSURE_MODE = "ExposureMode";
- field public static final java.lang.String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
- field public static final java.lang.String TAG_EXPOSURE_TIME = "ExposureTime";
- field public static final java.lang.String TAG_FILE_SOURCE = "FileSource";
- field public static final java.lang.String TAG_FLASH = "Flash";
- field public static final java.lang.String TAG_FLASHPIX_VERSION = "FlashpixVersion";
- field public static final java.lang.String TAG_FLASH_ENERGY = "FlashEnergy";
- field public static final java.lang.String TAG_FOCAL_LENGTH = "FocalLength";
- field public static final java.lang.String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
- field public static final java.lang.String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
- field public static final java.lang.String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
- field public static final java.lang.String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
- field public static final java.lang.String TAG_F_NUMBER = "FNumber";
- field public static final java.lang.String TAG_GAIN_CONTROL = "GainControl";
- field public static final java.lang.String TAG_GPS_ALTITUDE = "GPSAltitude";
- field public static final java.lang.String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
- field public static final java.lang.String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
- field public static final java.lang.String TAG_GPS_DATESTAMP = "GPSDateStamp";
- field public static final java.lang.String TAG_GPS_DEST_BEARING = "GPSDestBearing";
- field public static final java.lang.String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
- field public static final java.lang.String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
- field public static final java.lang.String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
- field public static final java.lang.String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
- field public static final java.lang.String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
- field public static final java.lang.String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
- field public static final java.lang.String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
- field public static final java.lang.String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
- field public static final java.lang.String TAG_GPS_DOP = "GPSDOP";
- field public static final java.lang.String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
- field public static final java.lang.String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
- field public static final java.lang.String TAG_GPS_LATITUDE = "GPSLatitude";
- field public static final java.lang.String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
- field public static final java.lang.String TAG_GPS_LONGITUDE = "GPSLongitude";
- field public static final java.lang.String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
- field public static final java.lang.String TAG_GPS_MAP_DATUM = "GPSMapDatum";
- field public static final java.lang.String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
- field public static final java.lang.String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
- field public static final java.lang.String TAG_GPS_SATELLITES = "GPSSatellites";
- field public static final java.lang.String TAG_GPS_SPEED = "GPSSpeed";
- field public static final java.lang.String TAG_GPS_SPEED_REF = "GPSSpeedRef";
- field public static final java.lang.String TAG_GPS_STATUS = "GPSStatus";
- field public static final java.lang.String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
- field public static final java.lang.String TAG_GPS_TRACK = "GPSTrack";
- field public static final java.lang.String TAG_GPS_TRACK_REF = "GPSTrackRef";
- field public static final java.lang.String TAG_GPS_VERSION_ID = "GPSVersionID";
- field public static final java.lang.String TAG_IMAGE_DESCRIPTION = "ImageDescription";
- field public static final java.lang.String TAG_IMAGE_LENGTH = "ImageLength";
- field public static final java.lang.String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
- field public static final java.lang.String TAG_IMAGE_WIDTH = "ImageWidth";
- field public static final java.lang.String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
- field public static final deprecated java.lang.String TAG_ISO = "ISOSpeedRatings";
- field public static final java.lang.String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
- field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
- field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
- field public static final java.lang.String TAG_LIGHT_SOURCE = "LightSource";
- field public static final java.lang.String TAG_MAKE = "Make";
- field public static final java.lang.String TAG_MAKER_NOTE = "MakerNote";
- field public static final java.lang.String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
- field public static final java.lang.String TAG_METERING_MODE = "MeteringMode";
- field public static final java.lang.String TAG_MODEL = "Model";
- field public static final java.lang.String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
- field public static final java.lang.String TAG_OECF = "OECF";
- field public static final java.lang.String TAG_ORF_ASPECT_FRAME = "AspectFrame";
- field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
- field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
- field public static final java.lang.String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
- field public static final java.lang.String TAG_ORIENTATION = "Orientation";
- field public static final java.lang.String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
- field public static final java.lang.String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
- field public static final java.lang.String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
- field public static final java.lang.String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
- field public static final java.lang.String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
- field public static final java.lang.String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
- field public static final java.lang.String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
- field public static final java.lang.String TAG_RESOLUTION_UNIT = "ResolutionUnit";
- field public static final java.lang.String TAG_ROWS_PER_STRIP = "RowsPerStrip";
- field public static final java.lang.String TAG_RW2_ISO = "ISO";
- field public static final java.lang.String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
- field public static final java.lang.String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
- field public static final java.lang.String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
- field public static final java.lang.String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
- field public static final java.lang.String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
- field public static final java.lang.String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
- field public static final java.lang.String TAG_SATURATION = "Saturation";
- field public static final java.lang.String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
- field public static final java.lang.String TAG_SCENE_TYPE = "SceneType";
- field public static final java.lang.String TAG_SENSING_METHOD = "SensingMethod";
- field public static final java.lang.String TAG_SHARPNESS = "Sharpness";
- field public static final java.lang.String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
- field public static final java.lang.String TAG_SOFTWARE = "Software";
- field public static final java.lang.String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
- field public static final java.lang.String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
- field public static final java.lang.String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
- field public static final java.lang.String TAG_STRIP_OFFSETS = "StripOffsets";
- field public static final java.lang.String TAG_SUBFILE_TYPE = "SubfileType";
- field public static final java.lang.String TAG_SUBJECT_AREA = "SubjectArea";
- field public static final java.lang.String TAG_SUBJECT_DISTANCE = "SubjectDistance";
- field public static final java.lang.String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
- field public static final java.lang.String TAG_SUBJECT_LOCATION = "SubjectLocation";
- field public static final java.lang.String TAG_SUBSEC_TIME = "SubSecTime";
- field public static final deprecated java.lang.String TAG_SUBSEC_TIME_DIG = "SubSecTimeDigitized";
- field public static final java.lang.String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
- field public static final deprecated java.lang.String TAG_SUBSEC_TIME_ORIG = "SubSecTimeOriginal";
- field public static final java.lang.String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
- field public static final java.lang.String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
- field public static final java.lang.String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
- field public static final java.lang.String TAG_TRANSFER_FUNCTION = "TransferFunction";
- field public static final java.lang.String TAG_USER_COMMENT = "UserComment";
- field public static final java.lang.String TAG_WHITE_BALANCE = "WhiteBalance";
- field public static final java.lang.String TAG_WHITE_POINT = "WhitePoint";
- field public static final java.lang.String TAG_X_RESOLUTION = "XResolution";
- field public static final java.lang.String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
- field public static final java.lang.String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
- field public static final java.lang.String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
- field public static final java.lang.String TAG_Y_RESOLUTION = "YResolution";
+ field @Deprecated public static final String TAG_APERTURE = "FNumber";
+ field public static final String TAG_APERTURE_VALUE = "ApertureValue";
+ field public static final String TAG_ARTIST = "Artist";
+ field public static final String TAG_BITS_PER_SAMPLE = "BitsPerSample";
+ field public static final String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
+ field public static final String TAG_CFA_PATTERN = "CFAPattern";
+ field public static final String TAG_COLOR_SPACE = "ColorSpace";
+ field public static final String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
+ field public static final String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
+ field public static final String TAG_COMPRESSION = "Compression";
+ field public static final String TAG_CONTRAST = "Contrast";
+ field public static final String TAG_COPYRIGHT = "Copyright";
+ field public static final String TAG_CUSTOM_RENDERED = "CustomRendered";
+ field public static final String TAG_DATETIME = "DateTime";
+ field public static final String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
+ field public static final String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
+ field public static final String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
+ field public static final String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
+ field public static final String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
+ field public static final String TAG_DNG_VERSION = "DNGVersion";
+ field public static final String TAG_EXIF_VERSION = "ExifVersion";
+ field public static final String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
+ field public static final String TAG_EXPOSURE_INDEX = "ExposureIndex";
+ field public static final String TAG_EXPOSURE_MODE = "ExposureMode";
+ field public static final String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
+ field public static final String TAG_EXPOSURE_TIME = "ExposureTime";
+ field public static final String TAG_FILE_SOURCE = "FileSource";
+ field public static final String TAG_FLASH = "Flash";
+ field public static final String TAG_FLASHPIX_VERSION = "FlashpixVersion";
+ field public static final String TAG_FLASH_ENERGY = "FlashEnergy";
+ field public static final String TAG_FOCAL_LENGTH = "FocalLength";
+ field public static final String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
+ field public static final String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
+ field public static final String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
+ field public static final String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
+ field public static final String TAG_F_NUMBER = "FNumber";
+ field public static final String TAG_GAIN_CONTROL = "GainControl";
+ field public static final String TAG_GPS_ALTITUDE = "GPSAltitude";
+ field public static final String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
+ field public static final String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
+ field public static final String TAG_GPS_DATESTAMP = "GPSDateStamp";
+ field public static final String TAG_GPS_DEST_BEARING = "GPSDestBearing";
+ field public static final String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
+ field public static final String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
+ field public static final String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
+ field public static final String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
+ field public static final String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
+ field public static final String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
+ field public static final String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
+ field public static final String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
+ field public static final String TAG_GPS_DOP = "GPSDOP";
+ field public static final String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
+ field public static final String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
+ field public static final String TAG_GPS_LATITUDE = "GPSLatitude";
+ field public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+ field public static final String TAG_GPS_LONGITUDE = "GPSLongitude";
+ field public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+ field public static final String TAG_GPS_MAP_DATUM = "GPSMapDatum";
+ field public static final String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
+ field public static final String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
+ field public static final String TAG_GPS_SATELLITES = "GPSSatellites";
+ field public static final String TAG_GPS_SPEED = "GPSSpeed";
+ field public static final String TAG_GPS_SPEED_REF = "GPSSpeedRef";
+ field public static final String TAG_GPS_STATUS = "GPSStatus";
+ field public static final String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
+ field public static final String TAG_GPS_TRACK = "GPSTrack";
+ field public static final String TAG_GPS_TRACK_REF = "GPSTrackRef";
+ field public static final String TAG_GPS_VERSION_ID = "GPSVersionID";
+ field public static final String TAG_IMAGE_DESCRIPTION = "ImageDescription";
+ field public static final String TAG_IMAGE_LENGTH = "ImageLength";
+ field public static final String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
+ field public static final String TAG_IMAGE_WIDTH = "ImageWidth";
+ field public static final String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
+ field @Deprecated public static final String TAG_ISO = "ISOSpeedRatings";
+ field public static final String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
+ field public static final String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
+ field public static final String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
+ field public static final String TAG_LIGHT_SOURCE = "LightSource";
+ field public static final String TAG_MAKE = "Make";
+ field public static final String TAG_MAKER_NOTE = "MakerNote";
+ field public static final String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
+ field public static final String TAG_METERING_MODE = "MeteringMode";
+ field public static final String TAG_MODEL = "Model";
+ field public static final String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
+ field public static final String TAG_OECF = "OECF";
+ field public static final String TAG_ORF_ASPECT_FRAME = "AspectFrame";
+ field public static final String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
+ field public static final String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
+ field public static final String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
+ field public static final String TAG_ORIENTATION = "Orientation";
+ field public static final String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
+ field public static final String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
+ field public static final String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
+ field public static final String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
+ field public static final String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
+ field public static final String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
+ field public static final String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
+ field public static final String TAG_RESOLUTION_UNIT = "ResolutionUnit";
+ field public static final String TAG_ROWS_PER_STRIP = "RowsPerStrip";
+ field public static final String TAG_RW2_ISO = "ISO";
+ field public static final String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
+ field public static final String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
+ field public static final String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
+ field public static final String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
+ field public static final String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
+ field public static final String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
+ field public static final String TAG_SATURATION = "Saturation";
+ field public static final String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
+ field public static final String TAG_SCENE_TYPE = "SceneType";
+ field public static final String TAG_SENSING_METHOD = "SensingMethod";
+ field public static final String TAG_SHARPNESS = "Sharpness";
+ field public static final String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
+ field public static final String TAG_SOFTWARE = "Software";
+ field public static final String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
+ field public static final String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
+ field public static final String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
+ field public static final String TAG_STRIP_OFFSETS = "StripOffsets";
+ field public static final String TAG_SUBFILE_TYPE = "SubfileType";
+ field public static final String TAG_SUBJECT_AREA = "SubjectArea";
+ field public static final String TAG_SUBJECT_DISTANCE = "SubjectDistance";
+ field public static final String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
+ field public static final String TAG_SUBJECT_LOCATION = "SubjectLocation";
+ field public static final String TAG_SUBSEC_TIME = "SubSecTime";
+ field @Deprecated public static final String TAG_SUBSEC_TIME_DIG = "SubSecTimeDigitized";
+ field public static final String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
+ field @Deprecated public static final String TAG_SUBSEC_TIME_ORIG = "SubSecTimeOriginal";
+ field public static final String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
+ field public static final String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
+ field public static final String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
+ field public static final String TAG_TRANSFER_FUNCTION = "TransferFunction";
+ field public static final String TAG_USER_COMMENT = "UserComment";
+ field public static final String TAG_WHITE_BALANCE = "WhiteBalance";
+ field public static final String TAG_WHITE_POINT = "WhitePoint";
+ field public static final String TAG_X_RESOLUTION = "XResolution";
+ field public static final String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
+ field public static final String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
+ field public static final String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
+ field public static final String TAG_Y_RESOLUTION = "YResolution";
field public static final int WHITEBALANCE_AUTO = 0; // 0x0
field public static final int WHITEBALANCE_MANUAL = 1; // 0x1
}
@@ -23928,19 +23861,19 @@ package android.media {
field public static final long FD_LENGTH_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL
}
- public static class FileDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase {
+ public static class FileDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.FileDataSourceDesc.Builder> {
ctor public FileDataSourceDesc.Builder();
ctor public FileDataSourceDesc.Builder(android.media.FileDataSourceDesc);
- method public android.media.FileDataSourceDesc build();
- method public android.media.FileDataSourceDesc.Builder setDataSource(android.os.ParcelFileDescriptor);
- method public android.media.FileDataSourceDesc.Builder setDataSource(android.os.ParcelFileDescriptor, long, long);
+ method @NonNull public android.media.FileDataSourceDesc build();
+ method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor);
+ method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor, long, long);
}
public abstract class Image implements java.lang.AutoCloseable {
method public abstract void close();
method public android.graphics.Rect getCropRect();
method public abstract int getFormat();
- method public android.hardware.HardwareBuffer getHardwareBuffer();
+ method @Nullable public android.hardware.HardwareBuffer getHardwareBuffer();
method public abstract int getHeight();
method public abstract android.media.Image.Plane[] getPlanes();
method public abstract long getTimestamp();
@@ -23949,7 +23882,7 @@ package android.media {
method public void setTimestamp(long);
}
- public static abstract class Image.Plane {
+ public abstract static class Image.Plane {
method public abstract java.nio.ByteBuffer getBuffer();
method public abstract int getPixelStride();
method public abstract int getRowStride();
@@ -23966,11 +23899,12 @@ package android.media {
method public android.view.Surface getSurface();
method public int getWidth();
method public static android.media.ImageReader newInstance(int, int, int, int);
+ method public static android.media.ImageReader newInstance(int, int, int, int, long);
method public void setOnImageAvailableListener(android.media.ImageReader.OnImageAvailableListener, android.os.Handler);
}
- public static abstract interface ImageReader.OnImageAvailableListener {
- method public abstract void onImageAvailable(android.media.ImageReader);
+ public static interface ImageReader.OnImageAvailableListener {
+ method public void onImageAvailable(android.media.ImageReader);
}
public class ImageWriter implements java.lang.AutoCloseable {
@@ -23979,22 +23913,23 @@ package android.media {
method public int getFormat();
method public int getMaxImages();
method public static android.media.ImageWriter newInstance(android.view.Surface, int);
+ method public static android.media.ImageWriter newInstance(android.view.Surface, int, int);
method public void queueInputImage(android.media.Image);
method public void setOnImageReleasedListener(android.media.ImageWriter.OnImageReleasedListener, android.os.Handler);
}
- public static abstract interface ImageWriter.OnImageReleasedListener {
- method public abstract void onImageReleased(android.media.ImageWriter);
+ public static interface ImageWriter.OnImageReleasedListener {
+ method public void onImageReleased(android.media.ImageWriter);
}
public class JetPlayer {
method public boolean clearQueue();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
method public boolean closeJetFile();
method protected void finalize();
method public static android.media.JetPlayer getJetPlayer();
method public static int getMaxTracks();
- method public boolean loadJetFile(java.lang.String);
+ method public boolean loadJetFile(String);
method public boolean loadJetFile(android.content.res.AssetFileDescriptor);
method public boolean pause();
method public boolean play();
@@ -24009,11 +23944,11 @@ package android.media {
method public boolean triggerClip(int);
}
- public static abstract interface JetPlayer.OnJetEventListener {
- method public abstract void onJetEvent(android.media.JetPlayer, short, byte, byte, byte, byte);
- method public abstract void onJetNumQueuedSegmentUpdate(android.media.JetPlayer, int);
- method public abstract void onJetPauseUpdate(android.media.JetPlayer, int);
- method public abstract void onJetUserIdUpdate(android.media.JetPlayer, int, int);
+ public static interface JetPlayer.OnJetEventListener {
+ method public void onJetEvent(android.media.JetPlayer, short, byte, byte, byte, byte);
+ method public void onJetNumQueuedSegmentUpdate(android.media.JetPlayer, int);
+ method public void onJetPauseUpdate(android.media.JetPlayer, int);
+ method public void onJetUserIdUpdate(android.media.JetPlayer, int, int);
}
public class MediaActionSound {
@@ -24034,29 +23969,29 @@ package android.media {
method protected void finalize();
method public static boolean isSystemIdSupported(int);
method public android.media.MediaCas.Session openSession() throws android.media.MediaCasException;
- method public void processEmm(byte[], int, int) throws android.media.MediaCasException;
- method public void processEmm(byte[]) throws android.media.MediaCasException;
- method public void provision(java.lang.String) throws android.media.MediaCasException;
- method public void refreshEntitlements(int, byte[]) throws android.media.MediaCasException;
- method public void sendEvent(int, int, byte[]) throws android.media.MediaCasException;
- method public void setEventListener(android.media.MediaCas.EventListener, android.os.Handler);
- method public void setPrivateData(byte[]) throws android.media.MediaCasException;
+ method public void processEmm(@NonNull byte[], int, int) throws android.media.MediaCasException;
+ method public void processEmm(@NonNull byte[]) throws android.media.MediaCasException;
+ method public void provision(@NonNull String) throws android.media.MediaCasException;
+ method public void refreshEntitlements(int, @Nullable byte[]) throws android.media.MediaCasException;
+ method public void sendEvent(int, int, @Nullable byte[]) throws android.media.MediaCasException;
+ method public void setEventListener(@Nullable android.media.MediaCas.EventListener, @Nullable android.os.Handler);
+ method public void setPrivateData(@NonNull byte[]) throws android.media.MediaCasException;
}
- public static abstract interface MediaCas.EventListener {
- method public abstract void onEvent(android.media.MediaCas, int, int, byte[]);
+ public static interface MediaCas.EventListener {
+ method public void onEvent(android.media.MediaCas, int, int, @Nullable byte[]);
}
public static class MediaCas.PluginDescriptor {
- method public java.lang.String getName();
+ method @NonNull public String getName();
method public int getSystemId();
}
public final class MediaCas.Session implements java.lang.AutoCloseable {
method public void close();
- method public void processEcm(byte[], int, int) throws android.media.MediaCasException;
- method public void processEcm(byte[]) throws android.media.MediaCasException;
- method public void setPrivateData(byte[]) throws android.media.MediaCasException;
+ method public void processEcm(@NonNull byte[], int, int) throws android.media.MediaCasException;
+ method public void processEcm(@NonNull byte[]) throws android.media.MediaCasException;
+ method public void setPrivateData(@NonNull byte[]) throws android.media.MediaCasException;
}
public class MediaCasException extends java.lang.Exception {
@@ -24075,46 +24010,47 @@ package android.media {
}
public class MediaCasStateException extends java.lang.IllegalStateException {
- method public java.lang.String getDiagnosticInfo();
+ method @NonNull public String getDiagnosticInfo();
}
public final class MediaCodec {
- method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
- method public void configure(android.media.MediaFormat, android.view.Surface, int, android.media.MediaDescrambler);
- method public static android.media.MediaCodec createByCodecName(java.lang.String) throws java.io.IOException;
- method public static android.media.MediaCodec createDecoderByType(java.lang.String) throws java.io.IOException;
- method public static android.media.MediaCodec createEncoderByType(java.lang.String) throws java.io.IOException;
- method public android.view.Surface createInputSurface();
- method public static android.view.Surface createPersistentInputSurface();
+ method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, @Nullable android.media.MediaCrypto, int);
+ method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler);
+ method @NonNull public static android.media.MediaCodec createByCodecName(@NonNull String) throws java.io.IOException;
+ method @NonNull public static android.media.MediaCodec createDecoderByType(@NonNull String) throws java.io.IOException;
+ method @NonNull public static android.media.MediaCodec createEncoderByType(@NonNull String) throws java.io.IOException;
+ method @NonNull public android.view.Surface createInputSurface();
+ method @NonNull public static android.view.Surface createPersistentInputSurface();
method public int dequeueInputBuffer(long);
- method public int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
+ method public int dequeueOutputBuffer(@NonNull android.media.MediaCodec.BufferInfo, long);
method protected void finalize();
method public void flush();
- method public android.media.MediaCodecInfo getCodecInfo();
- method public java.nio.ByteBuffer getInputBuffer(int);
- method public deprecated java.nio.ByteBuffer[] getInputBuffers();
- method public android.media.MediaFormat getInputFormat();
- method public android.media.Image getInputImage(int);
+ method @NonNull public String getCanonicalName();
+ method @NonNull public android.media.MediaCodecInfo getCodecInfo();
+ method @Nullable public java.nio.ByteBuffer getInputBuffer(int);
+ method @Deprecated @NonNull public java.nio.ByteBuffer[] getInputBuffers();
+ method @NonNull public android.media.MediaFormat getInputFormat();
+ method @Nullable public android.media.Image getInputImage(int);
method public android.os.PersistableBundle getMetrics();
- method public java.lang.String getName();
- method public java.nio.ByteBuffer getOutputBuffer(int);
- method public deprecated java.nio.ByteBuffer[] getOutputBuffers();
- method public android.media.MediaFormat getOutputFormat();
- method public android.media.MediaFormat getOutputFormat(int);
- method public android.media.Image getOutputImage(int);
+ method @NonNull public String getName();
+ method @Nullable public java.nio.ByteBuffer getOutputBuffer(int);
+ method @Deprecated @NonNull public java.nio.ByteBuffer[] getOutputBuffers();
+ method @NonNull public android.media.MediaFormat getOutputFormat();
+ method @NonNull public android.media.MediaFormat getOutputFormat(int);
+ method @Nullable public android.media.Image getOutputImage(int);
method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
- method public void queueSecureInputBuffer(int, int, android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException;
+ method public void queueSecureInputBuffer(int, int, @NonNull android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException;
method public void release();
method public void releaseOutputBuffer(int, boolean);
method public void releaseOutputBuffer(int, long);
method public void reset();
- method public void setAudioPresentation(android.media.AudioPresentation);
- method public void setCallback(android.media.MediaCodec.Callback, android.os.Handler);
- method public void setCallback(android.media.MediaCodec.Callback);
- method public void setInputSurface(android.view.Surface);
- method public void setOnFrameRenderedListener(android.media.MediaCodec.OnFrameRenderedListener, android.os.Handler);
- method public void setOutputSurface(android.view.Surface);
- method public void setParameters(android.os.Bundle);
+ method public void setAudioPresentation(@NonNull android.media.AudioPresentation);
+ method public void setCallback(@Nullable android.media.MediaCodec.Callback, @Nullable android.os.Handler);
+ method public void setCallback(@Nullable android.media.MediaCodec.Callback);
+ method public void setInputSurface(@NonNull android.view.Surface);
+ method public void setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler);
+ method public void setOutputSurface(@NonNull android.view.Surface);
+ method public void setParameters(@Nullable android.os.Bundle);
method public void setVideoScalingMode(int);
method public void signalEndOfInputStream();
method public void start();
@@ -24123,18 +24059,18 @@ package android.media {
field public static final int BUFFER_FLAG_END_OF_STREAM = 4; // 0x4
field public static final int BUFFER_FLAG_KEY_FRAME = 1; // 0x1
field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
- field public static final deprecated int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
+ field @Deprecated public static final int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
field public static final int CRYPTO_MODE_AES_CTR = 1; // 0x1
field public static final int CRYPTO_MODE_UNENCRYPTED = 0; // 0x0
- field public static final deprecated int INFO_OUTPUT_BUFFERS_CHANGED = -3; // 0xfffffffd
+ field @Deprecated public static final int INFO_OUTPUT_BUFFERS_CHANGED = -3; // 0xfffffffd
field public static final int INFO_OUTPUT_FORMAT_CHANGED = -2; // 0xfffffffe
field public static final int INFO_TRY_AGAIN_LATER = -1; // 0xffffffff
- field public static final java.lang.String PARAMETER_KEY_HDR10_PLUS_INFO = "hdr10-plus-info";
- field public static final java.lang.String PARAMETER_KEY_REQUEST_SYNC_FRAME = "request-sync";
- field public static final java.lang.String PARAMETER_KEY_SUSPEND = "drop-input-frames";
- field public static final java.lang.String PARAMETER_KEY_VIDEO_BITRATE = "video-bitrate";
+ field public static final String PARAMETER_KEY_HDR10_PLUS_INFO = "hdr10-plus-info";
+ field public static final String PARAMETER_KEY_REQUEST_SYNC_FRAME = "request-sync";
+ field public static final String PARAMETER_KEY_SUSPEND = "drop-input-frames";
+ field public static final String PARAMETER_KEY_VIDEO_BITRATE = "video-bitrate";
field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1
field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = 2; // 0x2
}
@@ -24148,16 +24084,16 @@ package android.media {
field public int size;
}
- public static abstract class MediaCodec.Callback {
+ public abstract static class MediaCodec.Callback {
ctor public MediaCodec.Callback();
- method public abstract void onError(android.media.MediaCodec, android.media.MediaCodec.CodecException);
- method public abstract void onInputBufferAvailable(android.media.MediaCodec, int);
- method public abstract void onOutputBufferAvailable(android.media.MediaCodec, int, android.media.MediaCodec.BufferInfo);
- method public abstract void onOutputFormatChanged(android.media.MediaCodec, android.media.MediaFormat);
+ method public abstract void onError(@NonNull android.media.MediaCodec, @NonNull android.media.MediaCodec.CodecException);
+ method public abstract void onInputBufferAvailable(@NonNull android.media.MediaCodec, int);
+ method public abstract void onOutputBufferAvailable(@NonNull android.media.MediaCodec, int, @NonNull android.media.MediaCodec.BufferInfo);
+ method public abstract void onOutputFormatChanged(@NonNull android.media.MediaCodec, @NonNull android.media.MediaFormat);
}
public static final class MediaCodec.CodecException extends java.lang.IllegalStateException {
- method public java.lang.String getDiagnosticInfo();
+ method @NonNull public String getDiagnosticInfo();
method public int getErrorCode();
method public boolean isRecoverable();
method public boolean isTransient();
@@ -24166,10 +24102,13 @@ package android.media {
}
public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
- ctor public MediaCodec.CryptoException(int, java.lang.String);
+ ctor public MediaCodec.CryptoException(int, @Nullable String);
method public int getErrorCode();
+ field public static final int ERROR_FRAME_TOO_LARGE = 8; // 0x8
field public static final int ERROR_INSUFFICIENT_OUTPUT_PROTECTION = 4; // 0x4
+ field public static final int ERROR_INSUFFICIENT_SECURITY = 7; // 0x7
field public static final int ERROR_KEY_EXPIRED = 2; // 0x2
+ field public static final int ERROR_LOST_STATE = 9; // 0x9
field public static final int ERROR_NO_KEY = 1; // 0x1
field public static final int ERROR_RESOURCE_BUSY = 3; // 0x3
field public static final int ERROR_SESSION_NOT_OPENED = 5; // 0x5
@@ -24178,7 +24117,7 @@ package android.media {
public static final class MediaCodec.CryptoInfo {
ctor public MediaCodec.CryptoInfo();
- method public void set(int, int[], int[], byte[], byte[], int);
+ method public void set(int, @NonNull int[], @NonNull int[], @NonNull byte[], @NonNull byte[], int);
method public void setPattern(android.media.MediaCodec.CryptoInfo.Pattern);
field public byte[] iv;
field public byte[] key;
@@ -24196,27 +24135,32 @@ package android.media {
}
public static final class MediaCodec.MetricsConstants {
- field public static final java.lang.String CODEC = "android.media.mediacodec.codec";
- field public static final java.lang.String ENCODER = "android.media.mediacodec.encoder";
- field public static final java.lang.String HEIGHT = "android.media.mediacodec.height";
- field public static final java.lang.String MIME_TYPE = "android.media.mediacodec.mime";
- field public static final java.lang.String MODE = "android.media.mediacodec.mode";
- field public static final java.lang.String MODE_AUDIO = "audio";
- field public static final java.lang.String MODE_VIDEO = "video";
- field public static final java.lang.String ROTATION = "android.media.mediacodec.rotation";
- field public static final java.lang.String SECURE = "android.media.mediacodec.secure";
- field public static final java.lang.String WIDTH = "android.media.mediacodec.width";
+ field public static final String CODEC = "android.media.mediacodec.codec";
+ field public static final String ENCODER = "android.media.mediacodec.encoder";
+ field public static final String HEIGHT = "android.media.mediacodec.height";
+ field public static final String MIME_TYPE = "android.media.mediacodec.mime";
+ field public static final String MODE = "android.media.mediacodec.mode";
+ field public static final String MODE_AUDIO = "audio";
+ field public static final String MODE_VIDEO = "video";
+ field public static final String ROTATION = "android.media.mediacodec.rotation";
+ field public static final String SECURE = "android.media.mediacodec.secure";
+ field public static final String WIDTH = "android.media.mediacodec.width";
}
- public static abstract interface MediaCodec.OnFrameRenderedListener {
- method public abstract void onFrameRendered(android.media.MediaCodec, long, long);
+ public static interface MediaCodec.OnFrameRenderedListener {
+ method public void onFrameRendered(@NonNull android.media.MediaCodec, long, long);
}
public final class MediaCodecInfo {
- method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(java.lang.String);
- method public java.lang.String getName();
- method public java.lang.String[] getSupportedTypes();
+ method @NonNull public String getCanonicalName();
+ method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(String);
+ method @NonNull public String getName();
+ method public String[] getSupportedTypes();
+ method public boolean isAlias();
method public boolean isEncoder();
+ method public boolean isHardwareAccelerated();
+ method public boolean isSoftwareOnly();
+ method public boolean isVendor();
}
public static final class MediaCodecInfo.AudioCapabilities {
@@ -24229,73 +24173,76 @@ package android.media {
public static final class MediaCodecInfo.CodecCapabilities {
ctor public MediaCodecInfo.CodecCapabilities();
- method public static android.media.MediaCodecInfo.CodecCapabilities createFromProfileLevel(java.lang.String, int, int);
+ method public static android.media.MediaCodecInfo.CodecCapabilities createFromProfileLevel(String, int, int);
method public android.media.MediaCodecInfo.AudioCapabilities getAudioCapabilities();
method public android.media.MediaFormat getDefaultFormat();
method public android.media.MediaCodecInfo.EncoderCapabilities getEncoderCapabilities();
method public int getMaxSupportedInstances();
- method public java.lang.String getMimeType();
+ method public String getMimeType();
method public android.media.MediaCodecInfo.VideoCapabilities getVideoCapabilities();
- method public boolean isFeatureRequired(java.lang.String);
- method public boolean isFeatureSupported(java.lang.String);
+ method public boolean isFeatureRequired(String);
+ method public boolean isFeatureSupported(String);
method public boolean isFormatSupported(android.media.MediaFormat);
- field public static final deprecated int COLOR_Format12bitRGB444 = 3; // 0x3
- field public static final deprecated int COLOR_Format16bitARGB1555 = 5; // 0x5
- field public static final deprecated int COLOR_Format16bitARGB4444 = 4; // 0x4
- field public static final deprecated int COLOR_Format16bitBGR565 = 7; // 0x7
+ field @Deprecated public static final int COLOR_Format12bitRGB444 = 3; // 0x3
+ field @Deprecated public static final int COLOR_Format16bitARGB1555 = 5; // 0x5
+ field @Deprecated public static final int COLOR_Format16bitARGB4444 = 4; // 0x4
+ field @Deprecated public static final int COLOR_Format16bitBGR565 = 7; // 0x7
field public static final int COLOR_Format16bitRGB565 = 6; // 0x6
- field public static final deprecated int COLOR_Format18BitBGR666 = 41; // 0x29
- field public static final deprecated int COLOR_Format18bitARGB1665 = 9; // 0x9
- field public static final deprecated int COLOR_Format18bitRGB666 = 8; // 0x8
- field public static final deprecated int COLOR_Format19bitARGB1666 = 10; // 0xa
- field public static final deprecated int COLOR_Format24BitABGR6666 = 43; // 0x2b
- field public static final deprecated int COLOR_Format24BitARGB6666 = 42; // 0x2a
- field public static final deprecated int COLOR_Format24bitARGB1887 = 13; // 0xd
+ field @Deprecated public static final int COLOR_Format18BitBGR666 = 41; // 0x29
+ field @Deprecated public static final int COLOR_Format18bitARGB1665 = 9; // 0x9
+ field @Deprecated public static final int COLOR_Format18bitRGB666 = 8; // 0x8
+ field @Deprecated public static final int COLOR_Format19bitARGB1666 = 10; // 0xa
+ field @Deprecated public static final int COLOR_Format24BitABGR6666 = 43; // 0x2b
+ field @Deprecated public static final int COLOR_Format24BitARGB6666 = 42; // 0x2a
+ field @Deprecated public static final int COLOR_Format24bitARGB1887 = 13; // 0xd
field public static final int COLOR_Format24bitBGR888 = 12; // 0xc
- field public static final deprecated int COLOR_Format24bitRGB888 = 11; // 0xb
- field public static final deprecated int COLOR_Format25bitARGB1888 = 14; // 0xe
+ field @Deprecated public static final int COLOR_Format24bitRGB888 = 11; // 0xb
+ field @Deprecated public static final int COLOR_Format25bitARGB1888 = 14; // 0xe
field public static final int COLOR_Format32bitABGR8888 = 2130747392; // 0x7f00a000
- field public static final deprecated int COLOR_Format32bitARGB8888 = 16; // 0x10
- field public static final deprecated int COLOR_Format32bitBGRA8888 = 15; // 0xf
- field public static final deprecated int COLOR_Format8bitRGB332 = 2; // 0x2
- field public static final deprecated int COLOR_FormatCbYCrY = 27; // 0x1b
- field public static final deprecated int COLOR_FormatCrYCbY = 28; // 0x1c
+ field @Deprecated public static final int COLOR_Format32bitARGB8888 = 16; // 0x10
+ field @Deprecated public static final int COLOR_Format32bitBGRA8888 = 15; // 0xf
+ field @Deprecated public static final int COLOR_Format8bitRGB332 = 2; // 0x2
+ field @Deprecated public static final int COLOR_FormatCbYCrY = 27; // 0x1b
+ field @Deprecated public static final int COLOR_FormatCrYCbY = 28; // 0x1c
field public static final int COLOR_FormatL16 = 36; // 0x24
- field public static final deprecated int COLOR_FormatL2 = 33; // 0x21
- field public static final deprecated int COLOR_FormatL24 = 37; // 0x25
- field public static final deprecated int COLOR_FormatL32 = 38; // 0x26
- field public static final deprecated int COLOR_FormatL4 = 34; // 0x22
+ field @Deprecated public static final int COLOR_FormatL2 = 33; // 0x21
+ field @Deprecated public static final int COLOR_FormatL24 = 37; // 0x25
+ field @Deprecated public static final int COLOR_FormatL32 = 38; // 0x26
+ field @Deprecated public static final int COLOR_FormatL4 = 34; // 0x22
field public static final int COLOR_FormatL8 = 35; // 0x23
- field public static final deprecated int COLOR_FormatMonochrome = 1; // 0x1
+ field @Deprecated public static final int COLOR_FormatMonochrome = 1; // 0x1
field public static final int COLOR_FormatRGBAFlexible = 2134288520; // 0x7f36a888
field public static final int COLOR_FormatRGBFlexible = 2134292616; // 0x7f36b888
field public static final int COLOR_FormatRawBayer10bit = 31; // 0x1f
field public static final int COLOR_FormatRawBayer8bit = 30; // 0x1e
field public static final int COLOR_FormatRawBayer8bitcompressed = 32; // 0x20
field public static final int COLOR_FormatSurface = 2130708361; // 0x7f000789
- field public static final deprecated int COLOR_FormatYCbYCr = 25; // 0x19
- field public static final deprecated int COLOR_FormatYCrYCb = 26; // 0x1a
- field public static final deprecated int COLOR_FormatYUV411PackedPlanar = 18; // 0x12
- field public static final deprecated int COLOR_FormatYUV411Planar = 17; // 0x11
+ field @Deprecated public static final int COLOR_FormatYCbYCr = 25; // 0x19
+ field @Deprecated public static final int COLOR_FormatYCrYCb = 26; // 0x1a
+ field @Deprecated public static final int COLOR_FormatYUV411PackedPlanar = 18; // 0x12
+ field @Deprecated public static final int COLOR_FormatYUV411Planar = 17; // 0x11
field public static final int COLOR_FormatYUV420Flexible = 2135033992; // 0x7f420888
- field public static final deprecated int COLOR_FormatYUV420PackedPlanar = 20; // 0x14
- field public static final deprecated int COLOR_FormatYUV420PackedSemiPlanar = 39; // 0x27
- field public static final deprecated int COLOR_FormatYUV420Planar = 19; // 0x13
- field public static final deprecated int COLOR_FormatYUV420SemiPlanar = 21; // 0x15
+ field @Deprecated public static final int COLOR_FormatYUV420PackedPlanar = 20; // 0x14
+ field @Deprecated public static final int COLOR_FormatYUV420PackedSemiPlanar = 39; // 0x27
+ field @Deprecated public static final int COLOR_FormatYUV420Planar = 19; // 0x13
+ field @Deprecated public static final int COLOR_FormatYUV420SemiPlanar = 21; // 0x15
field public static final int COLOR_FormatYUV422Flexible = 2135042184; // 0x7f422888
- field public static final deprecated int COLOR_FormatYUV422PackedPlanar = 23; // 0x17
- field public static final deprecated int COLOR_FormatYUV422PackedSemiPlanar = 40; // 0x28
- field public static final deprecated int COLOR_FormatYUV422Planar = 22; // 0x16
- field public static final deprecated int COLOR_FormatYUV422SemiPlanar = 24; // 0x18
+ field @Deprecated public static final int COLOR_FormatYUV422PackedPlanar = 23; // 0x17
+ field @Deprecated public static final int COLOR_FormatYUV422PackedSemiPlanar = 40; // 0x28
+ field @Deprecated public static final int COLOR_FormatYUV422Planar = 22; // 0x16
+ field @Deprecated public static final int COLOR_FormatYUV422SemiPlanar = 24; // 0x18
field public static final int COLOR_FormatYUV444Flexible = 2135181448; // 0x7f444888
- field public static final deprecated int COLOR_FormatYUV444Interleaved = 29; // 0x1d
- field public static final deprecated int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00
- field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
- field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback";
- field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh";
- field public static final java.lang.String FEATURE_PartialFrame = "partial-frame";
- field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback";
- field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback";
+ field @Deprecated public static final int COLOR_FormatYUV444Interleaved = 29; // 0x1d
+ field @Deprecated public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00
+ field @Deprecated public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
+ field public static final String FEATURE_AdaptivePlayback = "adaptive-playback";
+ field public static final String FEATURE_DynamicTimestamp = "dynamic-timestamp";
+ field public static final String FEATURE_FrameParsing = "frame-parsing";
+ field public static final String FEATURE_IntraRefresh = "intra-refresh";
+ field public static final String FEATURE_MultipleFrames = "multiple-frames";
+ field public static final String FEATURE_PartialFrame = "partial-frame";
+ field public static final String FEATURE_SecurePlayback = "secure-playback";
+ field public static final String FEATURE_TunneledPlayback = "tunneled-playback";
field public int[] colorFormats;
field public android.media.MediaCodecInfo.CodecProfileLevel[] profileLevels;
}
@@ -24314,6 +24261,33 @@ package android.media {
field public static final int AACObjectSSR = 3; // 0x3
field public static final int AACObjectScalable = 6; // 0x6
field public static final int AACObjectXHE = 42; // 0x2a
+ field public static final int AV1Level2 = 1; // 0x1
+ field public static final int AV1Level21 = 2; // 0x2
+ field public static final int AV1Level22 = 4; // 0x4
+ field public static final int AV1Level23 = 8; // 0x8
+ field public static final int AV1Level3 = 16; // 0x10
+ field public static final int AV1Level31 = 32; // 0x20
+ field public static final int AV1Level32 = 64; // 0x40
+ field public static final int AV1Level33 = 128; // 0x80
+ field public static final int AV1Level4 = 256; // 0x100
+ field public static final int AV1Level41 = 512; // 0x200
+ field public static final int AV1Level42 = 1024; // 0x400
+ field public static final int AV1Level43 = 2048; // 0x800
+ field public static final int AV1Level5 = 4096; // 0x1000
+ field public static final int AV1Level51 = 8192; // 0x2000
+ field public static final int AV1Level52 = 16384; // 0x4000
+ field public static final int AV1Level53 = 32768; // 0x8000
+ field public static final int AV1Level6 = 65536; // 0x10000
+ field public static final int AV1Level61 = 131072; // 0x20000
+ field public static final int AV1Level62 = 262144; // 0x40000
+ field public static final int AV1Level63 = 524288; // 0x80000
+ field public static final int AV1Level7 = 1048576; // 0x100000
+ field public static final int AV1Level71 = 2097152; // 0x200000
+ field public static final int AV1Level72 = 4194304; // 0x400000
+ field public static final int AV1Level73 = 8388608; // 0x800000
+ field public static final int AV1Profile0 = 1; // 0x1
+ field public static final int AV1Profile1 = 2; // 0x2
+ field public static final int AV1Profile2 = 4; // 0x4
field public static final int AVCLevel1 = 1; // 0x1
field public static final int AVCLevel11 = 4; // 0x4
field public static final int AVCLevel12 = 8; // 0x8
@@ -24331,6 +24305,9 @@ package android.media {
field public static final int AVCLevel5 = 16384; // 0x4000
field public static final int AVCLevel51 = 32768; // 0x8000
field public static final int AVCLevel52 = 65536; // 0x10000
+ field public static final int AVCLevel6 = 131072; // 0x20000
+ field public static final int AVCLevel61 = 262144; // 0x40000
+ field public static final int AVCLevel62 = 524288; // 0x80000
field public static final int AVCProfileBaseline = 1; // 0x1
field public static final int AVCProfileConstrainedBaseline = 65536; // 0x10000
field public static final int AVCProfileConstrainedHigh = 524288; // 0x80000
@@ -24486,41 +24463,100 @@ package android.media {
public static final class MediaCodecInfo.VideoCapabilities {
method public boolean areSizeAndRateSupported(int, int, double);
- method public android.util.Range<java.lang.Double> getAchievableFrameRatesFor(int, int);
+ method @Nullable public android.util.Range<java.lang.Double> getAchievableFrameRatesFor(int, int);
method public android.util.Range<java.lang.Integer> getBitrateRange();
method public int getHeightAlignment();
method public android.util.Range<java.lang.Integer> getSupportedFrameRates();
method public android.util.Range<java.lang.Double> getSupportedFrameRatesFor(int, int);
method public android.util.Range<java.lang.Integer> getSupportedHeights();
method public android.util.Range<java.lang.Integer> getSupportedHeightsFor(int);
+ method @Nullable public java.util.List<android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint> getSupportedPerformancePoints();
method public android.util.Range<java.lang.Integer> getSupportedWidths();
method public android.util.Range<java.lang.Integer> getSupportedWidthsFor(int);
method public int getWidthAlignment();
method public boolean isSizeSupported(int, int);
}
+ public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint {
+ method public boolean covers(@NonNull android.media.MediaFormat);
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_100;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_120;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_200;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_24;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_240;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_25;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_30;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_50;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_60;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_100;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_120;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_200;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_24;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_240;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_25;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_30;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_50;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_60;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_24;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_25;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_30;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_48;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_50;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_60;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_100;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_120;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_200;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_24;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_240;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_25;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_30;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_50;
+ field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_60;
+ field public final int frameRate;
+ field public final int height;
+ field public final int width;
+ }
+
public final class MediaCodecList {
ctor public MediaCodecList(int);
- method public java.lang.String findDecoderForFormat(android.media.MediaFormat);
- method public java.lang.String findEncoderForFormat(android.media.MediaFormat);
- method public static deprecated int getCodecCount();
- method public static deprecated android.media.MediaCodecInfo getCodecInfoAt(int);
+ method public String findDecoderForFormat(android.media.MediaFormat);
+ method public String findEncoderForFormat(android.media.MediaFormat);
+ method @Deprecated public static int getCodecCount();
+ method @Deprecated public static android.media.MediaCodecInfo getCodecInfoAt(int);
method public android.media.MediaCodecInfo[] getCodecInfos();
field public static final int ALL_CODECS = 1; // 0x1
field public static final int REGULAR_CODECS = 0; // 0x0
}
+ public class MediaController2 implements java.lang.AutoCloseable {
+ ctor public MediaController2(@NonNull android.content.Context, @NonNull android.media.Session2Token);
+ ctor public MediaController2(@NonNull android.content.Context, @NonNull android.media.Session2Token, @NonNull java.util.concurrent.Executor, @NonNull android.media.MediaController2.ControllerCallback);
+ method public void cancelSessionCommand(@NonNull Object);
+ method public void close();
+ method public boolean isPlaybackActive();
+ method @NonNull public Object sendSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle);
+ }
+
+ public abstract static class MediaController2.ControllerCallback {
+ ctor public MediaController2.ControllerCallback();
+ method public void onCommandResult(@NonNull android.media.MediaController2, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result);
+ method public void onConnected(@NonNull android.media.MediaController2, @NonNull android.media.Session2CommandGroup);
+ method public void onDisconnected(@NonNull android.media.MediaController2);
+ method public void onPlaybackActiveChanged(@NonNull android.media.MediaController2, boolean);
+ method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaController2, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
+ }
+
public final class MediaCrypto {
- ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
+ ctor public MediaCrypto(@NonNull java.util.UUID, @NonNull byte[]) throws android.media.MediaCryptoException;
method protected void finalize();
- method public static boolean isCryptoSchemeSupported(java.util.UUID);
+ method public static boolean isCryptoSchemeSupported(@NonNull java.util.UUID);
method public void release();
- method public boolean requiresSecureDecoderComponent(java.lang.String);
- method public void setMediaDrmSession(byte[]) throws android.media.MediaCryptoException;
+ method public boolean requiresSecureDecoderComponent(@NonNull String);
+ method public void setMediaDrmSession(@NonNull byte[]) throws android.media.MediaCryptoException;
}
public final class MediaCryptoException extends java.lang.Exception {
- ctor public MediaCryptoException(java.lang.String);
+ ctor public MediaCryptoException(@Nullable String);
}
public abstract class MediaDataSource implements java.io.Closeable {
@@ -24532,10 +24568,10 @@ package android.media {
public final class MediaDescrambler implements java.lang.AutoCloseable {
ctor public MediaDescrambler(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
- method public int descramble(java.nio.ByteBuffer, java.nio.ByteBuffer, android.media.MediaCodec.CryptoInfo);
+ method public int descramble(@NonNull java.nio.ByteBuffer, @NonNull java.nio.ByteBuffer, @NonNull android.media.MediaCodec.CryptoInfo);
method protected void finalize();
- method public boolean requiresSecureDecoderComponent(java.lang.String);
- method public void setMediaCasSession(android.media.MediaCas.Session);
+ method public boolean requiresSecureDecoderComponent(@NonNull String);
+ method public void setMediaCasSession(@NonNull android.media.MediaCas.Session);
field public static final byte SCRAMBLE_CONTROL_EVEN_KEY = 2; // 0x2
field public static final byte SCRAMBLE_CONTROL_ODD_KEY = 3; // 0x3
field public static final byte SCRAMBLE_CONTROL_RESERVED = 1; // 0x1
@@ -24545,14 +24581,14 @@ package android.media {
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.CharSequence getDescription();
- method public android.os.Bundle getExtras();
- method public android.graphics.Bitmap getIconBitmap();
- method public android.net.Uri getIconUri();
- method public java.lang.String getMediaId();
- method public android.net.Uri getMediaUri();
- method public java.lang.CharSequence getSubtitle();
- method public java.lang.CharSequence getTitle();
+ method @Nullable public CharSequence getDescription();
+ method @Nullable public android.os.Bundle getExtras();
+ method @Nullable public android.graphics.Bitmap getIconBitmap();
+ method @Nullable public android.net.Uri getIconUri();
+ method @Nullable public String getMediaId();
+ method @Nullable public android.net.Uri getMediaUri();
+ method @Nullable public CharSequence getSubtitle();
+ method @Nullable public CharSequence getTitle();
method public void writeToParcel(android.os.Parcel, int);
field public static final long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
@@ -24562,66 +24598,67 @@ package android.media {
field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
field public static final android.os.Parcelable.Creator<android.media.MediaDescription> CREATOR;
- field public static final java.lang.String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+ field public static final String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
}
public static class MediaDescription.Builder {
ctor public MediaDescription.Builder();
method public android.media.MediaDescription build();
- method public android.media.MediaDescription.Builder setDescription(java.lang.CharSequence);
- method public android.media.MediaDescription.Builder setExtras(android.os.Bundle);
- method public android.media.MediaDescription.Builder setIconBitmap(android.graphics.Bitmap);
- method public android.media.MediaDescription.Builder setIconUri(android.net.Uri);
- method public android.media.MediaDescription.Builder setMediaId(java.lang.String);
- method public android.media.MediaDescription.Builder setMediaUri(android.net.Uri);
- method public android.media.MediaDescription.Builder setSubtitle(java.lang.CharSequence);
- method public android.media.MediaDescription.Builder setTitle(java.lang.CharSequence);
+ method public android.media.MediaDescription.Builder setDescription(@Nullable CharSequence);
+ method public android.media.MediaDescription.Builder setExtras(@Nullable android.os.Bundle);
+ method public android.media.MediaDescription.Builder setIconBitmap(@Nullable android.graphics.Bitmap);
+ method public android.media.MediaDescription.Builder setIconUri(@Nullable android.net.Uri);
+ method public android.media.MediaDescription.Builder setMediaId(@Nullable String);
+ method public android.media.MediaDescription.Builder setMediaUri(@Nullable android.net.Uri);
+ method public android.media.MediaDescription.Builder setSubtitle(@Nullable CharSequence);
+ method public android.media.MediaDescription.Builder setTitle(@Nullable CharSequence);
}
public final class MediaDrm implements java.lang.AutoCloseable {
- ctor public MediaDrm(java.util.UUID) throws android.media.UnsupportedSchemeException;
+ ctor public MediaDrm(@NonNull java.util.UUID) throws android.media.UnsupportedSchemeException;
method public void close();
- method public void closeSession(byte[]);
- method public int getConnectedHdcpLevel();
- method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String);
- method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>) throws android.media.NotProvisionedException;
- method public int getMaxHdcpLevel();
+ method public void closeSession(@NonNull byte[]);
+ method @android.media.MediaDrm.HdcpLevel public int getConnectedHdcpLevel();
+ method public android.media.MediaDrm.CryptoSession getCryptoSession(@NonNull byte[], @NonNull String, @NonNull String);
+ method @NonNull public android.media.MediaDrm.KeyRequest getKeyRequest(@NonNull byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.HashMap<java.lang.String,java.lang.String>) throws android.media.NotProvisionedException;
+ method @android.media.MediaDrm.HdcpLevel public int getMaxHdcpLevel();
method public static int getMaxSecurityLevel();
method public int getMaxSessionCount();
method public android.os.PersistableBundle getMetrics();
- method public java.util.List<byte[]> getOfflineLicenseKeySetIds();
- method public int getOfflineLicenseState(byte[]);
+ method @NonNull public java.util.List<byte[]> getOfflineLicenseKeySetIds();
+ method public int getOfflineLicenseState(@NonNull byte[]);
method public int getOpenSessionCount();
- method public byte[] getPropertyByteArray(java.lang.String);
- method public java.lang.String getPropertyString(java.lang.String);
- method public android.media.MediaDrm.ProvisionRequest getProvisionRequest();
- method public byte[] getSecureStop(byte[]);
- method public java.util.List<byte[]> getSecureStopIds();
- method public java.util.List<byte[]> getSecureStops();
- method public int getSecurityLevel(byte[]);
- method public static boolean isCryptoSchemeSupported(java.util.UUID);
- method public static boolean isCryptoSchemeSupported(java.util.UUID, java.lang.String);
- method public byte[] openSession() throws android.media.NotProvisionedException, android.media.ResourceBusyException;
- method public byte[] openSession(int) throws android.media.NotProvisionedException, android.media.ResourceBusyException;
- method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.NotProvisionedException;
- method public void provideProvisionResponse(byte[]) throws android.media.DeniedByServerException;
- method public java.util.HashMap<java.lang.String, java.lang.String> queryKeyStatus(byte[]);
- method public deprecated void release();
- method public deprecated void releaseAllSecureStops();
- method public void releaseSecureStops(byte[]);
+ method @NonNull public byte[] getPropertyByteArray(String);
+ method @NonNull public String getPropertyString(@NonNull String);
+ method @NonNull public android.media.MediaDrm.ProvisionRequest getProvisionRequest();
+ method @NonNull public byte[] getSecureStop(@NonNull byte[]);
+ method @NonNull public java.util.List<byte[]> getSecureStopIds();
+ method @NonNull public java.util.List<byte[]> getSecureStops();
+ method @android.media.MediaDrm.SecurityLevel public int getSecurityLevel(@NonNull byte[]);
+ method public static boolean isCryptoSchemeSupported(@NonNull java.util.UUID);
+ method public static boolean isCryptoSchemeSupported(@NonNull java.util.UUID, @NonNull String);
+ method @NonNull public byte[] openSession() throws android.media.NotProvisionedException, android.media.ResourceBusyException;
+ method @NonNull public byte[] openSession(@android.media.MediaDrm.SecurityLevel int) throws android.media.NotProvisionedException, android.media.ResourceBusyException;
+ method @Nullable public byte[] provideKeyResponse(@NonNull byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.NotProvisionedException;
+ method public void provideProvisionResponse(@NonNull byte[]) throws android.media.DeniedByServerException;
+ method @NonNull public java.util.HashMap<java.lang.String,java.lang.String> queryKeyStatus(@NonNull byte[]);
+ method @Deprecated public void release();
+ method @Deprecated public void releaseAllSecureStops();
+ method public void releaseSecureStops(@NonNull byte[]);
method public void removeAllSecureStops();
- method public void removeKeys(byte[]);
- method public void removeOfflineLicense(byte[]);
- method public void removeSecureStop(byte[]);
- method public void restoreKeys(byte[], byte[]);
- method public void setOnEventListener(android.media.MediaDrm.OnEventListener);
- method public void setOnExpirationUpdateListener(android.media.MediaDrm.OnExpirationUpdateListener, android.os.Handler);
- method public void setOnKeyStatusChangeListener(android.media.MediaDrm.OnKeyStatusChangeListener, android.os.Handler);
- method public void setPropertyByteArray(java.lang.String, byte[]);
- method public void setPropertyString(java.lang.String, java.lang.String);
- field public static final deprecated int EVENT_KEY_EXPIRED = 3; // 0x3
+ method public void removeKeys(@NonNull byte[]);
+ method public void removeOfflineLicense(@NonNull byte[]);
+ method public void removeSecureStop(@NonNull byte[]);
+ method public void restoreKeys(@NonNull byte[], @NonNull byte[]);
+ method public void setOnEventListener(@Nullable android.media.MediaDrm.OnEventListener);
+ method public void setOnExpirationUpdateListener(@Nullable android.media.MediaDrm.OnExpirationUpdateListener, @Nullable android.os.Handler);
+ method public void setOnKeyStatusChangeListener(@Nullable android.media.MediaDrm.OnKeyStatusChangeListener, @Nullable android.os.Handler);
+ method public void setOnSessionLostStateListener(@Nullable android.media.MediaDrm.OnSessionLostStateListener, @Nullable android.os.Handler);
+ method public void setPropertyByteArray(@NonNull String, @NonNull byte[]);
+ method public void setPropertyString(@NonNull String, @NonNull String);
+ field @Deprecated public static final int EVENT_KEY_EXPIRED = 3; // 0x3
field public static final int EVENT_KEY_REQUIRED = 2; // 0x2
- field public static final deprecated int EVENT_PROVISION_REQUIRED = 1; // 0x1
+ field @Deprecated public static final int EVENT_PROVISION_REQUIRED = 1; // 0x1
field public static final int EVENT_SESSION_RECLAIMED = 5; // 0x5
field public static final int EVENT_VENDOR_DEFINED = 4; // 0x4
field public static final int HDCP_LEVEL_UNKNOWN = 0; // 0x0
@@ -24631,17 +24668,18 @@ package android.media {
field public static final int HDCP_V2 = 3; // 0x3
field public static final int HDCP_V2_1 = 4; // 0x4
field public static final int HDCP_V2_2 = 5; // 0x5
+ field public static final int HDCP_V2_3 = 6; // 0x6
field public static final int KEY_TYPE_OFFLINE = 2; // 0x2
field public static final int KEY_TYPE_RELEASE = 3; // 0x3
field public static final int KEY_TYPE_STREAMING = 1; // 0x1
field public static final int OFFLINE_LICENSE_INACTIVE = 2; // 0x2
field public static final int OFFLINE_LICENSE_STATE_UNKNOWN = 0; // 0x0
field public static final int OFFLINE_LICENSE_USABLE = 1; // 0x1
- field public static final java.lang.String PROPERTY_ALGORITHMS = "algorithms";
- field public static final java.lang.String PROPERTY_DESCRIPTION = "description";
- field public static final java.lang.String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
- field public static final java.lang.String PROPERTY_VENDOR = "vendor";
- field public static final java.lang.String PROPERTY_VERSION = "version";
+ field public static final String PROPERTY_ALGORITHMS = "algorithms";
+ field public static final String PROPERTY_DESCRIPTION = "description";
+ field public static final String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
+ field public static final String PROPERTY_VENDOR = "vendor";
+ field public static final String PROPERTY_VERSION = "version";
field public static final int SECURITY_LEVEL_HW_SECURE_ALL = 5; // 0x5
field public static final int SECURITY_LEVEL_HW_SECURE_CRYPTO = 3; // 0x3
field public static final int SECURITY_LEVEL_HW_SECURE_DECODE = 4; // 0x4
@@ -24651,18 +24689,18 @@ package android.media {
}
public final class MediaDrm.CryptoSession {
- method public byte[] decrypt(byte[], byte[], byte[]);
- method public byte[] encrypt(byte[], byte[], byte[]);
- method public byte[] sign(byte[], byte[]);
- method public boolean verify(byte[], byte[], byte[]);
+ method @NonNull public byte[] decrypt(@NonNull byte[], @NonNull byte[], @NonNull byte[]);
+ method @NonNull public byte[] encrypt(@NonNull byte[], @NonNull byte[], @NonNull byte[]);
+ method @NonNull public byte[] sign(@NonNull byte[], @NonNull byte[]);
+ method public boolean verify(@NonNull byte[], @NonNull byte[], @NonNull byte[]);
}
- public static abstract class MediaDrm.HdcpLevel implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.media.MediaDrm.HDCP_LEVEL_UNKNOWN, android.media.MediaDrm.HDCP_NONE, android.media.MediaDrm.HDCP_V1, android.media.MediaDrm.HDCP_V2, android.media.MediaDrm.HDCP_V2_1, android.media.MediaDrm.HDCP_V2_2, android.media.MediaDrm.HDCP_V2_3, android.media.MediaDrm.HDCP_NO_DIGITAL_OUTPUT}) public static @interface MediaDrm.HdcpLevel {
}
public static final class MediaDrm.KeyRequest {
- method public byte[] getData();
- method public java.lang.String getDefaultUrl();
+ method @NonNull public byte[] getData();
+ method @NonNull public String getDefaultUrl();
method public int getRequestType();
field public static final int REQUEST_TYPE_INITIAL = 0; // 0x0
field public static final int REQUEST_TYPE_NONE = 3; // 0x3
@@ -24672,7 +24710,7 @@ package android.media {
}
public static final class MediaDrm.KeyStatus {
- method public byte[] getKeyId();
+ method @NonNull public byte[] getKeyId();
method public int getStatusCode();
field public static final int STATUS_EXPIRED = 1; // 0x1
field public static final int STATUS_INTERNAL_ERROR = 4; // 0x4
@@ -24682,105 +24720,115 @@ package android.media {
}
public static final class MediaDrm.MediaDrmStateException extends java.lang.IllegalStateException {
- method public java.lang.String getDiagnosticInfo();
+ method @NonNull public String getDiagnosticInfo();
}
public static final class MediaDrm.MetricsConstants {
- field public static final java.lang.String CLOSE_SESSION_ERROR_COUNT = "drm.mediadrm.close_session.error.count";
- field public static final java.lang.String CLOSE_SESSION_ERROR_LIST = "drm.mediadrm.close_session.error.list";
- field public static final java.lang.String CLOSE_SESSION_OK_COUNT = "drm.mediadrm.close_session.ok.count";
- field public static final java.lang.String EVENT_KEY_EXPIRED_COUNT = "drm.mediadrm.event.KEY_EXPIRED.count";
- field public static final java.lang.String EVENT_KEY_NEEDED_COUNT = "drm.mediadrm.event.KEY_NEEDED.count";
- field public static final java.lang.String EVENT_PROVISION_REQUIRED_COUNT = "drm.mediadrm.event.PROVISION_REQUIRED.count";
- field public static final java.lang.String EVENT_SESSION_RECLAIMED_COUNT = "drm.mediadrm.event.SESSION_RECLAIMED.count";
- field public static final java.lang.String EVENT_VENDOR_DEFINED_COUNT = "drm.mediadrm.event.VENDOR_DEFINED.count";
- field public static final java.lang.String GET_DEVICE_UNIQUE_ID_ERROR_COUNT = "drm.mediadrm.get_device_unique_id.error.count";
- field public static final java.lang.String GET_DEVICE_UNIQUE_ID_ERROR_LIST = "drm.mediadrm.get_device_unique_id.error.list";
- field public static final java.lang.String GET_DEVICE_UNIQUE_ID_OK_COUNT = "drm.mediadrm.get_device_unique_id.ok.count";
- field public static final java.lang.String GET_KEY_REQUEST_ERROR_COUNT = "drm.mediadrm.get_key_request.error.count";
- field public static final java.lang.String GET_KEY_REQUEST_ERROR_LIST = "drm.mediadrm.get_key_request.error.list";
- field public static final java.lang.String GET_KEY_REQUEST_OK_COUNT = "drm.mediadrm.get_key_request.ok.count";
- field public static final java.lang.String GET_KEY_REQUEST_OK_TIME_MICROS = "drm.mediadrm.get_key_request.ok.average_time_micros";
- field public static final java.lang.String GET_PROVISION_REQUEST_ERROR_COUNT = "drm.mediadrm.get_provision_request.error.count";
- field public static final java.lang.String GET_PROVISION_REQUEST_ERROR_LIST = "drm.mediadrm.get_provision_request.error.list";
- field public static final java.lang.String GET_PROVISION_REQUEST_OK_COUNT = "drm.mediadrm.get_provision_request.ok.count";
- field public static final java.lang.String KEY_STATUS_EXPIRED_COUNT = "drm.mediadrm.key_status.EXPIRED.count";
- field public static final java.lang.String KEY_STATUS_INTERNAL_ERROR_COUNT = "drm.mediadrm.key_status.INTERNAL_ERROR.count";
- field public static final java.lang.String KEY_STATUS_OUTPUT_NOT_ALLOWED_COUNT = "drm.mediadrm.key_status_change.OUTPUT_NOT_ALLOWED.count";
- field public static final java.lang.String KEY_STATUS_PENDING_COUNT = "drm.mediadrm.key_status_change.PENDING.count";
- field public static final java.lang.String KEY_STATUS_USABLE_COUNT = "drm.mediadrm.key_status_change.USABLE.count";
- field public static final java.lang.String OPEN_SESSION_ERROR_COUNT = "drm.mediadrm.open_session.error.count";
- field public static final java.lang.String OPEN_SESSION_ERROR_LIST = "drm.mediadrm.open_session.error.list";
- field public static final java.lang.String OPEN_SESSION_OK_COUNT = "drm.mediadrm.open_session.ok.count";
- field public static final java.lang.String PROVIDE_KEY_RESPONSE_ERROR_COUNT = "drm.mediadrm.provide_key_response.error.count";
- field public static final java.lang.String PROVIDE_KEY_RESPONSE_ERROR_LIST = "drm.mediadrm.provide_key_response.error.list";
- field public static final java.lang.String PROVIDE_KEY_RESPONSE_OK_COUNT = "drm.mediadrm.provide_key_response.ok.count";
- field public static final java.lang.String PROVIDE_KEY_RESPONSE_OK_TIME_MICROS = "drm.mediadrm.provide_key_response.ok.average_time_micros";
- field public static final java.lang.String PROVIDE_PROVISION_RESPONSE_ERROR_COUNT = "drm.mediadrm.provide_provision_response.error.count";
- field public static final java.lang.String PROVIDE_PROVISION_RESPONSE_ERROR_LIST = "drm.mediadrm.provide_provision_response.error.list";
- field public static final java.lang.String PROVIDE_PROVISION_RESPONSE_OK_COUNT = "drm.mediadrm.provide_provision_response.ok.count";
- field public static final java.lang.String SESSION_END_TIMES_MS = "drm.mediadrm.session_end_times_ms";
- field public static final java.lang.String SESSION_START_TIMES_MS = "drm.mediadrm.session_start_times_ms";
- }
-
- public static abstract interface MediaDrm.OnEventListener {
- method public abstract void onEvent(android.media.MediaDrm, byte[], int, int, byte[]);
- }
-
- public static abstract interface MediaDrm.OnExpirationUpdateListener {
- method public abstract void onExpirationUpdate(android.media.MediaDrm, byte[], long);
- }
-
- public static abstract interface MediaDrm.OnKeyStatusChangeListener {
- method public abstract void onKeyStatusChange(android.media.MediaDrm, byte[], java.util.List<android.media.MediaDrm.KeyStatus>, boolean);
+ field public static final String CLOSE_SESSION_ERROR_COUNT = "drm.mediadrm.close_session.error.count";
+ field public static final String CLOSE_SESSION_ERROR_LIST = "drm.mediadrm.close_session.error.list";
+ field public static final String CLOSE_SESSION_OK_COUNT = "drm.mediadrm.close_session.ok.count";
+ field public static final String EVENT_KEY_EXPIRED_COUNT = "drm.mediadrm.event.KEY_EXPIRED.count";
+ field public static final String EVENT_KEY_NEEDED_COUNT = "drm.mediadrm.event.KEY_NEEDED.count";
+ field public static final String EVENT_PROVISION_REQUIRED_COUNT = "drm.mediadrm.event.PROVISION_REQUIRED.count";
+ field public static final String EVENT_SESSION_RECLAIMED_COUNT = "drm.mediadrm.event.SESSION_RECLAIMED.count";
+ field public static final String EVENT_VENDOR_DEFINED_COUNT = "drm.mediadrm.event.VENDOR_DEFINED.count";
+ field public static final String GET_DEVICE_UNIQUE_ID_ERROR_COUNT = "drm.mediadrm.get_device_unique_id.error.count";
+ field public static final String GET_DEVICE_UNIQUE_ID_ERROR_LIST = "drm.mediadrm.get_device_unique_id.error.list";
+ field public static final String GET_DEVICE_UNIQUE_ID_OK_COUNT = "drm.mediadrm.get_device_unique_id.ok.count";
+ field public static final String GET_KEY_REQUEST_ERROR_COUNT = "drm.mediadrm.get_key_request.error.count";
+ field public static final String GET_KEY_REQUEST_ERROR_LIST = "drm.mediadrm.get_key_request.error.list";
+ field public static final String GET_KEY_REQUEST_OK_COUNT = "drm.mediadrm.get_key_request.ok.count";
+ field public static final String GET_KEY_REQUEST_OK_TIME_MICROS = "drm.mediadrm.get_key_request.ok.average_time_micros";
+ field public static final String GET_PROVISION_REQUEST_ERROR_COUNT = "drm.mediadrm.get_provision_request.error.count";
+ field public static final String GET_PROVISION_REQUEST_ERROR_LIST = "drm.mediadrm.get_provision_request.error.list";
+ field public static final String GET_PROVISION_REQUEST_OK_COUNT = "drm.mediadrm.get_provision_request.ok.count";
+ field public static final String KEY_STATUS_EXPIRED_COUNT = "drm.mediadrm.key_status.EXPIRED.count";
+ field public static final String KEY_STATUS_INTERNAL_ERROR_COUNT = "drm.mediadrm.key_status.INTERNAL_ERROR.count";
+ field public static final String KEY_STATUS_OUTPUT_NOT_ALLOWED_COUNT = "drm.mediadrm.key_status_change.OUTPUT_NOT_ALLOWED.count";
+ field public static final String KEY_STATUS_PENDING_COUNT = "drm.mediadrm.key_status_change.PENDING.count";
+ field public static final String KEY_STATUS_USABLE_COUNT = "drm.mediadrm.key_status_change.USABLE.count";
+ field public static final String OPEN_SESSION_ERROR_COUNT = "drm.mediadrm.open_session.error.count";
+ field public static final String OPEN_SESSION_ERROR_LIST = "drm.mediadrm.open_session.error.list";
+ field public static final String OPEN_SESSION_OK_COUNT = "drm.mediadrm.open_session.ok.count";
+ field public static final String PROVIDE_KEY_RESPONSE_ERROR_COUNT = "drm.mediadrm.provide_key_response.error.count";
+ field public static final String PROVIDE_KEY_RESPONSE_ERROR_LIST = "drm.mediadrm.provide_key_response.error.list";
+ field public static final String PROVIDE_KEY_RESPONSE_OK_COUNT = "drm.mediadrm.provide_key_response.ok.count";
+ field public static final String PROVIDE_KEY_RESPONSE_OK_TIME_MICROS = "drm.mediadrm.provide_key_response.ok.average_time_micros";
+ field public static final String PROVIDE_PROVISION_RESPONSE_ERROR_COUNT = "drm.mediadrm.provide_provision_response.error.count";
+ field public static final String PROVIDE_PROVISION_RESPONSE_ERROR_LIST = "drm.mediadrm.provide_provision_response.error.list";
+ field public static final String PROVIDE_PROVISION_RESPONSE_OK_COUNT = "drm.mediadrm.provide_provision_response.ok.count";
+ field public static final String SESSION_END_TIMES_MS = "drm.mediadrm.session_end_times_ms";
+ field public static final String SESSION_START_TIMES_MS = "drm.mediadrm.session_start_times_ms";
+ }
+
+ public static interface MediaDrm.OnEventListener {
+ method public void onEvent(@NonNull android.media.MediaDrm, @Nullable byte[], int, int, @Nullable byte[]);
+ }
+
+ public static interface MediaDrm.OnExpirationUpdateListener {
+ method public void onExpirationUpdate(@NonNull android.media.MediaDrm, @NonNull byte[], long);
+ }
+
+ public static interface MediaDrm.OnKeyStatusChangeListener {
+ method public void onKeyStatusChange(@NonNull android.media.MediaDrm, @NonNull byte[], @NonNull java.util.List<android.media.MediaDrm.KeyStatus>, boolean);
+ }
+
+ public static interface MediaDrm.OnSessionLostStateListener {
+ method public void onSessionLostState(@NonNull android.media.MediaDrm, @NonNull byte[]);
}
public static final class MediaDrm.ProvisionRequest {
- method public byte[] getData();
- method public java.lang.String getDefaultUrl();
+ method @NonNull public byte[] getData();
+ method @NonNull public String getDefaultUrl();
}
- public static abstract class MediaDrm.SecurityLevel implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.media.MediaDrm.SECURITY_LEVEL_UNKNOWN, android.media.MediaDrm.SECURITY_LEVEL_SW_SECURE_CRYPTO, android.media.MediaDrm.SECURITY_LEVEL_SW_SECURE_DECODE, android.media.MediaDrm.SECURITY_LEVEL_HW_SECURE_CRYPTO, android.media.MediaDrm.SECURITY_LEVEL_HW_SECURE_DECODE, android.media.MediaDrm.SECURITY_LEVEL_HW_SECURE_ALL}) public static @interface MediaDrm.SecurityLevel {
+ }
+
+ public static final class MediaDrm.SessionException extends java.lang.RuntimeException {
+ ctor public MediaDrm.SessionException(int, @Nullable String);
+ method public int getErrorCode();
+ field public static final int ERROR_RESOURCE_CONTENTION = 1; // 0x1
}
public class MediaDrmException extends java.lang.Exception {
- ctor public MediaDrmException(java.lang.String);
+ ctor public MediaDrmException(String);
}
public class MediaDrmResetException extends java.lang.IllegalStateException {
- ctor public MediaDrmResetException(java.lang.String);
+ ctor public MediaDrmResetException(String);
}
public final class MediaExtractor {
ctor public MediaExtractor();
method public boolean advance();
method protected void finalize();
- method public java.util.List<android.media.AudioPresentation> getAudioPresentations(int);
+ method @NonNull public java.util.List<android.media.AudioPresentation> getAudioPresentations(int);
method public long getCachedDuration();
method public android.media.MediaExtractor.CasInfo getCasInfo(int);
method public android.media.DrmInitData getDrmInitData();
method public android.os.PersistableBundle getMetrics();
- method public java.util.Map<java.util.UUID, byte[]> getPsshInfo();
- method public boolean getSampleCryptoInfo(android.media.MediaCodec.CryptoInfo);
+ method @Nullable public java.util.Map<java.util.UUID,byte[]> getPsshInfo();
+ method public boolean getSampleCryptoInfo(@NonNull android.media.MediaCodec.CryptoInfo);
method public int getSampleFlags();
method public long getSampleSize();
method public long getSampleTime();
method public int getSampleTrackIndex();
method public int getTrackCount();
- method public android.media.MediaFormat getTrackFormat(int);
+ method @NonNull public android.media.MediaFormat getTrackFormat(int);
method public boolean hasCacheReachedEndOfStream();
- method public int readSampleData(java.nio.ByteBuffer, int);
+ method public int readSampleData(@NonNull java.nio.ByteBuffer, int);
method public void release();
method public void seekTo(long, int);
method public void selectTrack(int);
- method public void setDataSource(android.media.MediaDataSource) throws java.io.IOException;
- method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
- method public void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
- method public void setDataSource(java.lang.String) throws java.io.IOException;
- method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException;
- method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException;
- method public void setMediaCas(android.media.MediaCas);
+ method public void setDataSource(@NonNull android.media.MediaDataSource) throws java.io.IOException;
+ method public void setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws java.io.IOException;
+ method public void setDataSource(@NonNull String, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws java.io.IOException;
+ method public void setDataSource(@NonNull String) throws java.io.IOException;
+ method public void setDataSource(@NonNull android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setDataSource(@NonNull java.io.FileDescriptor) throws java.io.IOException;
+ method public void setDataSource(@NonNull java.io.FileDescriptor, long, long) throws java.io.IOException;
+ method public void setMediaCas(@NonNull android.media.MediaCas);
method public void unselectTrack(int);
field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
field public static final int SAMPLE_FLAG_PARTIAL_FRAME = 4; // 0x4
@@ -24791,49 +24839,49 @@ package android.media {
}
public static final class MediaExtractor.CasInfo {
- method public byte[] getPrivateData();
+ method @Nullable public byte[] getPrivateData();
method public android.media.MediaCas.Session getSession();
method public int getSystemId();
}
public static final class MediaExtractor.MetricsConstants {
- field public static final java.lang.String FORMAT = "android.media.mediaextractor.fmt";
- field public static final java.lang.String MIME_TYPE = "android.media.mediaextractor.mime";
- field public static final java.lang.String TRACKS = "android.media.mediaextractor.ntrk";
+ field public static final String FORMAT = "android.media.mediaextractor.fmt";
+ field public static final String MIME_TYPE = "android.media.mediaextractor.mime";
+ field public static final String TRACKS = "android.media.mediaextractor.ntrk";
}
public final class MediaFormat {
ctor public MediaFormat();
- ctor public MediaFormat(android.media.MediaFormat);
- method public boolean containsFeature(java.lang.String);
- method public boolean containsKey(java.lang.String);
- method public static android.media.MediaFormat createAudioFormat(java.lang.String, int, int);
- method public static android.media.MediaFormat createSubtitleFormat(java.lang.String, java.lang.String);
- method public static android.media.MediaFormat createVideoFormat(java.lang.String, int, int);
- method public java.nio.ByteBuffer getByteBuffer(java.lang.String);
- method public java.nio.ByteBuffer getByteBuffer(java.lang.String, java.nio.ByteBuffer);
- method public boolean getFeatureEnabled(java.lang.String);
- method public java.util.Set<java.lang.String> getFeatures();
- method public float getFloat(java.lang.String);
- method public float getFloat(java.lang.String, float);
- method public int getInteger(java.lang.String);
- method public int getInteger(java.lang.String, int);
- method public java.util.Set<java.lang.String> getKeys();
- method public long getLong(java.lang.String);
- method public long getLong(java.lang.String, long);
- method public java.lang.Number getNumber(java.lang.String);
- method public java.lang.Number getNumber(java.lang.String, java.lang.Number);
- method public java.lang.String getString(java.lang.String);
- method public java.lang.String getString(java.lang.String, java.lang.String);
- method public int getValueTypeForKey(java.lang.String);
- method public void removeFeature(java.lang.String);
- method public void removeKey(java.lang.String);
- method public void setByteBuffer(java.lang.String, java.nio.ByteBuffer);
- method public void setFeatureEnabled(java.lang.String, boolean);
- method public void setFloat(java.lang.String, float);
- method public void setInteger(java.lang.String, int);
- method public void setLong(java.lang.String, long);
- method public void setString(java.lang.String, java.lang.String);
+ ctor public MediaFormat(@NonNull android.media.MediaFormat);
+ method public boolean containsFeature(@NonNull String);
+ method public boolean containsKey(@NonNull String);
+ method @NonNull public static android.media.MediaFormat createAudioFormat(@NonNull String, int, int);
+ method @NonNull public static android.media.MediaFormat createSubtitleFormat(@NonNull String, String);
+ method @NonNull public static android.media.MediaFormat createVideoFormat(@NonNull String, int, int);
+ method @Nullable public java.nio.ByteBuffer getByteBuffer(@NonNull String);
+ method @NonNull public java.nio.ByteBuffer getByteBuffer(@NonNull String, @NonNull java.nio.ByteBuffer);
+ method public boolean getFeatureEnabled(@NonNull String);
+ method @NonNull public java.util.Set<java.lang.String> getFeatures();
+ method public float getFloat(@NonNull String);
+ method public float getFloat(@NonNull String, float);
+ method public int getInteger(@NonNull String);
+ method public int getInteger(@NonNull String, int);
+ method @NonNull public java.util.Set<java.lang.String> getKeys();
+ method public long getLong(@NonNull String);
+ method public long getLong(@NonNull String, long);
+ method @Nullable public Number getNumber(@NonNull String);
+ method @NonNull public Number getNumber(@NonNull String, @NonNull Number);
+ method @Nullable public String getString(@NonNull String);
+ method @NonNull public String getString(@NonNull String, @NonNull String);
+ method public int getValueTypeForKey(@NonNull String);
+ method public void removeFeature(@NonNull String);
+ method public void removeKey(@NonNull String);
+ method public void setByteBuffer(@NonNull String, @Nullable java.nio.ByteBuffer);
+ method public void setFeatureEnabled(@NonNull String, boolean);
+ method public void setFloat(@NonNull String, float);
+ method public void setInteger(@NonNull String, int);
+ method public void setLong(@NonNull String, long);
+ method public void setString(@NonNull String, @Nullable String);
field public static final int COLOR_RANGE_FULL = 1; // 0x1
field public static final int COLOR_RANGE_LIMITED = 2; // 0x2
field public static final int COLOR_STANDARD_BT2020 = 6; // 0x6
@@ -24844,96 +24892,97 @@ package android.media {
field public static final int COLOR_TRANSFER_LINEAR = 1; // 0x1
field public static final int COLOR_TRANSFER_SDR_VIDEO = 3; // 0x3
field public static final int COLOR_TRANSFER_ST2084 = 6; // 0x6
- field public static final java.lang.String KEY_AAC_DRC_ATTENUATION_FACTOR = "aac-drc-cut-level";
- field public static final java.lang.String KEY_AAC_DRC_BOOST_FACTOR = "aac-drc-boost-level";
- field public static final java.lang.String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type";
- field public static final java.lang.String KEY_AAC_DRC_HEAVY_COMPRESSION = "aac-drc-heavy-compression";
- field public static final java.lang.String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level";
- field public static final java.lang.String KEY_AAC_ENCODED_TARGET_LEVEL = "aac-encoded-target-level";
- field public static final java.lang.String KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT = "aac-max-output-channel_count";
- field public static final java.lang.String KEY_AAC_PROFILE = "aac-profile";
- field public static final java.lang.String KEY_AAC_SBR_MODE = "aac-sbr-mode";
- field public static final java.lang.String KEY_AUDIO_SESSION_ID = "audio-session-id";
- field public static final java.lang.String KEY_BITRATE_MODE = "bitrate-mode";
- field public static final java.lang.String KEY_BIT_RATE = "bitrate";
- field public static final java.lang.String KEY_CAPTURE_RATE = "capture-rate";
- field public static final java.lang.String KEY_CHANNEL_COUNT = "channel-count";
- field public static final java.lang.String KEY_CHANNEL_MASK = "channel-mask";
- field public static final java.lang.String KEY_COLOR_FORMAT = "color-format";
- field public static final java.lang.String KEY_COLOR_RANGE = "color-range";
- field public static final java.lang.String KEY_COLOR_STANDARD = "color-standard";
- field public static final java.lang.String KEY_COLOR_TRANSFER = "color-transfer";
- field public static final java.lang.String KEY_COMPLEXITY = "complexity";
- field public static final java.lang.String KEY_DURATION = "durationUs";
- field public static final java.lang.String KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level";
- field public static final java.lang.String KEY_FRAME_RATE = "frame-rate";
- field public static final java.lang.String KEY_GRID_COLUMNS = "grid-cols";
- field public static final java.lang.String KEY_GRID_ROWS = "grid-rows";
- field public static final java.lang.String KEY_HDR10_PLUS_INFO = "hdr10-plus-info";
- field public static final java.lang.String KEY_HDR_STATIC_INFO = "hdr-static-info";
- field public static final java.lang.String KEY_HEIGHT = "height";
- field public static final java.lang.String KEY_INTRA_REFRESH_PERIOD = "intra-refresh-period";
- field public static final java.lang.String KEY_IS_ADTS = "is-adts";
- field public static final java.lang.String KEY_IS_AUTOSELECT = "is-autoselect";
- field public static final java.lang.String KEY_IS_DEFAULT = "is-default";
- field public static final java.lang.String KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle";
- field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval";
- field public static final java.lang.String KEY_LANGUAGE = "language";
- field public static final java.lang.String KEY_LATENCY = "latency";
- field public static final java.lang.String KEY_LEVEL = "level";
- field public static final java.lang.String KEY_MAX_HEIGHT = "max-height";
- field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size";
- field public static final java.lang.String KEY_MAX_WIDTH = "max-width";
- field public static final java.lang.String KEY_MIME = "mime";
- field public static final java.lang.String KEY_OPERATING_RATE = "operating-rate";
- field public static final java.lang.String KEY_OUTPUT_REORDER_DEPTH = "output-reorder-depth";
- field public static final java.lang.String KEY_PCM_ENCODING = "pcm-encoding";
- field public static final java.lang.String KEY_PRIORITY = "priority";
- field public static final java.lang.String KEY_PROFILE = "profile";
- field public static final java.lang.String KEY_PUSH_BLANK_BUFFERS_ON_STOP = "push-blank-buffers-on-shutdown";
- field public static final java.lang.String KEY_QUALITY = "quality";
- field public static final java.lang.String KEY_REPEAT_PREVIOUS_FRAME_AFTER = "repeat-previous-frame-after";
- field public static final java.lang.String KEY_ROTATION = "rotation-degrees";
- field public static final java.lang.String KEY_SAMPLE_RATE = "sample-rate";
- field public static final java.lang.String KEY_SLICE_HEIGHT = "slice-height";
- field public static final java.lang.String KEY_STRIDE = "stride";
- field public static final java.lang.String KEY_TEMPORAL_LAYERING = "ts-schema";
- field public static final java.lang.String KEY_TILE_HEIGHT = "tile-height";
- field public static final java.lang.String KEY_TILE_WIDTH = "tile-width";
- field public static final java.lang.String KEY_TRACK_ID = "track-id";
- field public static final java.lang.String KEY_WIDTH = "width";
- field public static final java.lang.String MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";
- field public static final java.lang.String MIMETYPE_AUDIO_AC3 = "audio/ac3";
- field public static final java.lang.String MIMETYPE_AUDIO_AC4 = "audio/ac4";
- field public static final java.lang.String MIMETYPE_AUDIO_AMR_NB = "audio/3gpp";
- field public static final java.lang.String MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb";
- field public static final java.lang.String MIMETYPE_AUDIO_EAC3 = "audio/eac3";
- field public static final java.lang.String MIMETYPE_AUDIO_EAC3_JOC = "audio/eac3-joc";
- field public static final java.lang.String MIMETYPE_AUDIO_FLAC = "audio/flac";
- field public static final java.lang.String MIMETYPE_AUDIO_G711_ALAW = "audio/g711-alaw";
- field public static final java.lang.String MIMETYPE_AUDIO_G711_MLAW = "audio/g711-mlaw";
- field public static final java.lang.String MIMETYPE_AUDIO_MPEG = "audio/mpeg";
- field public static final java.lang.String MIMETYPE_AUDIO_MSGSM = "audio/gsm";
- field public static final java.lang.String MIMETYPE_AUDIO_OPUS = "audio/opus";
- field public static final java.lang.String MIMETYPE_AUDIO_QCELP = "audio/qcelp";
- field public static final java.lang.String MIMETYPE_AUDIO_RAW = "audio/raw";
- field public static final java.lang.String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
- field public static final java.lang.String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
- field public static final java.lang.String MIMETYPE_IMAGE_ANDROID_HEIC = "image/vnd.android.heic";
- field public static final java.lang.String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
- field public static final java.lang.String MIMETYPE_TEXT_CEA_708 = "text/cea-708";
- field public static final java.lang.String MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
- field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt";
- field public static final java.lang.String MIMETYPE_VIDEO_AVC = "video/avc";
- field public static final java.lang.String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision";
- field public static final java.lang.String MIMETYPE_VIDEO_H263 = "video/3gpp";
- field public static final java.lang.String MIMETYPE_VIDEO_HEVC = "video/hevc";
- field public static final java.lang.String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
- field public static final java.lang.String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
- field public static final java.lang.String MIMETYPE_VIDEO_RAW = "video/raw";
- field public static final java.lang.String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
- field public static final java.lang.String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
- field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
+ field public static final String KEY_AAC_DRC_ATTENUATION_FACTOR = "aac-drc-cut-level";
+ field public static final String KEY_AAC_DRC_BOOST_FACTOR = "aac-drc-boost-level";
+ field public static final String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type";
+ field public static final String KEY_AAC_DRC_HEAVY_COMPRESSION = "aac-drc-heavy-compression";
+ field public static final String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level";
+ field public static final String KEY_AAC_ENCODED_TARGET_LEVEL = "aac-encoded-target-level";
+ field public static final String KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT = "aac-max-output-channel_count";
+ field public static final String KEY_AAC_PROFILE = "aac-profile";
+ field public static final String KEY_AAC_SBR_MODE = "aac-sbr-mode";
+ field public static final String KEY_AUDIO_SESSION_ID = "audio-session-id";
+ field public static final String KEY_BITRATE_MODE = "bitrate-mode";
+ field public static final String KEY_BIT_RATE = "bitrate";
+ field public static final String KEY_CAPTURE_RATE = "capture-rate";
+ field public static final String KEY_CHANNEL_COUNT = "channel-count";
+ field public static final String KEY_CHANNEL_MASK = "channel-mask";
+ field public static final String KEY_COLOR_FORMAT = "color-format";
+ field public static final String KEY_COLOR_RANGE = "color-range";
+ field public static final String KEY_COLOR_STANDARD = "color-standard";
+ field public static final String KEY_COLOR_TRANSFER = "color-transfer";
+ field public static final String KEY_COMPLEXITY = "complexity";
+ field public static final String KEY_DURATION = "durationUs";
+ field public static final String KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level";
+ field public static final String KEY_FRAME_RATE = "frame-rate";
+ field public static final String KEY_GRID_COLUMNS = "grid-cols";
+ field public static final String KEY_GRID_ROWS = "grid-rows";
+ field public static final String KEY_HDR10_PLUS_INFO = "hdr10-plus-info";
+ field public static final String KEY_HDR_STATIC_INFO = "hdr-static-info";
+ field public static final String KEY_HEIGHT = "height";
+ field public static final String KEY_INTRA_REFRESH_PERIOD = "intra-refresh-period";
+ field public static final String KEY_IS_ADTS = "is-adts";
+ field public static final String KEY_IS_AUTOSELECT = "is-autoselect";
+ field public static final String KEY_IS_DEFAULT = "is-default";
+ field public static final String KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle";
+ field public static final String KEY_I_FRAME_INTERVAL = "i-frame-interval";
+ field public static final String KEY_LANGUAGE = "language";
+ field public static final String KEY_LATENCY = "latency";
+ field public static final String KEY_LEVEL = "level";
+ field public static final String KEY_MAX_HEIGHT = "max-height";
+ field public static final String KEY_MAX_INPUT_SIZE = "max-input-size";
+ field public static final String KEY_MAX_WIDTH = "max-width";
+ field public static final String KEY_MIME = "mime";
+ field public static final String KEY_OPERATING_RATE = "operating-rate";
+ field public static final String KEY_OUTPUT_REORDER_DEPTH = "output-reorder-depth";
+ field public static final String KEY_PCM_ENCODING = "pcm-encoding";
+ field public static final String KEY_PRIORITY = "priority";
+ field public static final String KEY_PROFILE = "profile";
+ field public static final String KEY_PUSH_BLANK_BUFFERS_ON_STOP = "push-blank-buffers-on-shutdown";
+ field public static final String KEY_QUALITY = "quality";
+ field public static final String KEY_REPEAT_PREVIOUS_FRAME_AFTER = "repeat-previous-frame-after";
+ field public static final String KEY_ROTATION = "rotation-degrees";
+ field public static final String KEY_SAMPLE_RATE = "sample-rate";
+ field public static final String KEY_SLICE_HEIGHT = "slice-height";
+ field public static final String KEY_STRIDE = "stride";
+ field public static final String KEY_TEMPORAL_LAYERING = "ts-schema";
+ field public static final String KEY_TILE_HEIGHT = "tile-height";
+ field public static final String KEY_TILE_WIDTH = "tile-width";
+ field public static final String KEY_TRACK_ID = "track-id";
+ field public static final String KEY_WIDTH = "width";
+ field public static final String MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";
+ field public static final String MIMETYPE_AUDIO_AC3 = "audio/ac3";
+ field public static final String MIMETYPE_AUDIO_AC4 = "audio/ac4";
+ field public static final String MIMETYPE_AUDIO_AMR_NB = "audio/3gpp";
+ field public static final String MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb";
+ field public static final String MIMETYPE_AUDIO_EAC3 = "audio/eac3";
+ field public static final String MIMETYPE_AUDIO_EAC3_JOC = "audio/eac3-joc";
+ field public static final String MIMETYPE_AUDIO_FLAC = "audio/flac";
+ field public static final String MIMETYPE_AUDIO_G711_ALAW = "audio/g711-alaw";
+ field public static final String MIMETYPE_AUDIO_G711_MLAW = "audio/g711-mlaw";
+ field public static final String MIMETYPE_AUDIO_MPEG = "audio/mpeg";
+ field public static final String MIMETYPE_AUDIO_MSGSM = "audio/gsm";
+ field public static final String MIMETYPE_AUDIO_OPUS = "audio/opus";
+ field public static final String MIMETYPE_AUDIO_QCELP = "audio/qcelp";
+ field public static final String MIMETYPE_AUDIO_RAW = "audio/raw";
+ field public static final String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
+ field public static final String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
+ field public static final String MIMETYPE_IMAGE_ANDROID_HEIC = "image/vnd.android.heic";
+ field public static final String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
+ field public static final String MIMETYPE_TEXT_CEA_708 = "text/cea-708";
+ field public static final String MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+ field public static final String MIMETYPE_TEXT_VTT = "text/vtt";
+ field public static final String MIMETYPE_VIDEO_AV1 = "video/av01";
+ field public static final String MIMETYPE_VIDEO_AVC = "video/avc";
+ field public static final String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision";
+ field public static final String MIMETYPE_VIDEO_H263 = "video/3gpp";
+ field public static final String MIMETYPE_VIDEO_HEVC = "video/hevc";
+ field public static final String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
+ field public static final String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
+ field public static final String MIMETYPE_VIDEO_RAW = "video/raw";
+ field public static final String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
+ field public static final String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
+ field public static final String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
field public static final int TYPE_BYTE_BUFFER = 5; // 0x5
field public static final int TYPE_FLOAT = 3; // 0x3
field public static final int TYPE_INTEGER = 1; // 0x1
@@ -24945,9 +24994,9 @@ package android.media {
public final class MediaItem2 implements android.os.Parcelable {
method public int describeContents();
method public long getEndPosition();
- method public android.media.MediaMetadata getMetadata();
+ method @Nullable public android.media.MediaMetadata getMetadata();
method public long getStartPosition();
- method public void setMetadata(android.media.MediaMetadata);
+ method public void setMetadata(@Nullable android.media.MediaMetadata);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.MediaItem2> CREATOR;
field public static final long POSITION_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL
@@ -24955,106 +25004,106 @@ package android.media {
public static class MediaItem2.Builder {
ctor public MediaItem2.Builder();
- method public android.media.MediaItem2 build();
- method public android.media.MediaItem2.Builder setEndPosition(long);
- method public android.media.MediaItem2.Builder setMetadata(android.media.MediaMetadata);
- method public android.media.MediaItem2.Builder setStartPosition(long);
+ method @NonNull public android.media.MediaItem2 build();
+ method @NonNull public android.media.MediaItem2.Builder setEndPosition(long);
+ method @NonNull public android.media.MediaItem2.Builder setMetadata(@Nullable android.media.MediaMetadata);
+ method @NonNull public android.media.MediaItem2.Builder setStartPosition(long);
}
public final class MediaMetadata implements android.os.Parcelable {
- method public boolean containsKey(java.lang.String);
+ method public boolean containsKey(String);
method public int describeContents();
- method public android.graphics.Bitmap getBitmap(java.lang.String);
- method public android.media.MediaDescription getDescription();
- method public long getLong(java.lang.String);
- method public android.media.Rating getRating(java.lang.String);
- method public java.lang.String getString(java.lang.String);
- method public java.lang.CharSequence getText(java.lang.String);
+ method public android.graphics.Bitmap getBitmap(String);
+ method @NonNull public android.media.MediaDescription getDescription();
+ method public long getLong(String);
+ method public android.media.Rating getRating(String);
+ method public String getString(String);
+ method public CharSequence getText(String);
method public java.util.Set<java.lang.String> keySet();
method public int size();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.MediaMetadata> CREATOR;
- field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
- field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
- field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
- field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
- field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
- field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
- field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
- field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
- field public static final java.lang.String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
- field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
- field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
- field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
- field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
- field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
- field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
- field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
- field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
- field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
- field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
- field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
- field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
- field public static final java.lang.String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
- field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
- field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
- field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
- field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
- field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
- field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
- field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+ field public static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+ field public static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+ field public static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+ field public static final String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+ field public static final String METADATA_KEY_ART = "android.media.metadata.ART";
+ field public static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+ field public static final String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+ field public static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+ field public static final String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
+ field public static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+ field public static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+ field public static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
+ field public static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+ field public static final String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
+ field public static final String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
+ field public static final String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
+ field public static final String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
+ field public static final String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+ field public static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+ field public static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+ field public static final String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+ field public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+ field public static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+ field public static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
+ field public static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+ field public static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+ field public static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+ field public static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+ field public static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
}
public static final class MediaMetadata.Builder {
ctor public MediaMetadata.Builder();
ctor public MediaMetadata.Builder(android.media.MediaMetadata);
method public android.media.MediaMetadata build();
- method public android.media.MediaMetadata.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
- method public android.media.MediaMetadata.Builder putLong(java.lang.String, long);
- method public android.media.MediaMetadata.Builder putRating(java.lang.String, android.media.Rating);
- method public android.media.MediaMetadata.Builder putString(java.lang.String, java.lang.String);
- method public android.media.MediaMetadata.Builder putText(java.lang.String, java.lang.CharSequence);
- }
-
- public abstract deprecated class MediaMetadataEditor {
- method public synchronized void addEditableKey(int);
- method public abstract void apply();
- method public synchronized void clear();
- method public synchronized android.graphics.Bitmap getBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
- method public synchronized int[] getEditableKeys();
- method public synchronized long getLong(int, long) throws java.lang.IllegalArgumentException;
- method public synchronized java.lang.Object getObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
- method public synchronized java.lang.String getString(int, java.lang.String) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.MediaMetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.MediaMetadataEditor putObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.MediaMetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
- method public synchronized void removeEditableKeys();
- field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
- field public static final int RATING_KEY_BY_OTHERS = 101; // 0x65
- field public static final int RATING_KEY_BY_USER = 268435457; // 0x10000001
+ method public android.media.MediaMetadata.Builder putBitmap(String, android.graphics.Bitmap);
+ method public android.media.MediaMetadata.Builder putLong(String, long);
+ method public android.media.MediaMetadata.Builder putRating(String, android.media.Rating);
+ method public android.media.MediaMetadata.Builder putString(String, String);
+ method public android.media.MediaMetadata.Builder putText(String, CharSequence);
+ }
+
+ @Deprecated public abstract class MediaMetadataEditor {
+ method @Deprecated public void addEditableKey(int);
+ method @Deprecated public abstract void apply();
+ method @Deprecated public void clear();
+ method @Deprecated public android.graphics.Bitmap getBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method @Deprecated public int[] getEditableKeys();
+ method @Deprecated public long getLong(int, long) throws java.lang.IllegalArgumentException;
+ method @Deprecated public Object getObject(int, Object) throws java.lang.IllegalArgumentException;
+ method @Deprecated public String getString(int, String) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.MediaMetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.MediaMetadataEditor putObject(int, Object) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.MediaMetadataEditor putString(int, String) throws java.lang.IllegalArgumentException;
+ method @Deprecated public void removeEditableKeys();
+ field @Deprecated public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
+ field @Deprecated public static final int RATING_KEY_BY_OTHERS = 101; // 0x65
+ field @Deprecated public static final int RATING_KEY_BY_USER = 268435457; // 0x10000001
}
public class MediaMetadataRetriever implements java.lang.AutoCloseable {
ctor public MediaMetadataRetriever();
method public void close();
- method public java.lang.String extractMetadata(int);
+ method public String extractMetadata(int);
method public byte[] getEmbeddedPicture();
- method public android.graphics.Bitmap getFrameAtIndex(int, android.media.MediaMetadataRetriever.BitmapParams);
+ method public android.graphics.Bitmap getFrameAtIndex(int, @NonNull android.media.MediaMetadataRetriever.BitmapParams);
method public android.graphics.Bitmap getFrameAtIndex(int);
method public android.graphics.Bitmap getFrameAtTime(long, int);
method public android.graphics.Bitmap getFrameAtTime(long);
method public android.graphics.Bitmap getFrameAtTime();
- method public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int, android.media.MediaMetadataRetriever.BitmapParams);
- method public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int);
- method public android.graphics.Bitmap getImageAtIndex(int, android.media.MediaMetadataRetriever.BitmapParams);
+ method @NonNull public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int, @NonNull android.media.MediaMetadataRetriever.BitmapParams);
+ method @NonNull public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int);
+ method public android.graphics.Bitmap getImageAtIndex(int, @NonNull android.media.MediaMetadataRetriever.BitmapParams);
method public android.graphics.Bitmap getImageAtIndex(int);
- method public android.graphics.Bitmap getPrimaryImage(android.media.MediaMetadataRetriever.BitmapParams);
+ method public android.graphics.Bitmap getPrimaryImage(@NonNull android.media.MediaMetadataRetriever.BitmapParams);
method public android.graphics.Bitmap getPrimaryImage();
method public android.graphics.Bitmap getScaledFrameAtTime(long, int, int, int);
method public void release();
- method public void setDataSource(java.lang.String) throws java.lang.IllegalArgumentException;
- method public void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>) throws java.lang.IllegalArgumentException;
+ method public void setDataSource(String) throws java.lang.IllegalArgumentException;
+ method public void setDataSource(String, java.util.Map<java.lang.String,java.lang.String>) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor) throws java.lang.IllegalArgumentException;
method public void setDataSource(android.content.Context, android.net.Uri) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
@@ -25098,21 +25147,21 @@ package android.media {
public static final class MediaMetadataRetriever.BitmapParams {
ctor public MediaMetadataRetriever.BitmapParams();
- method public android.graphics.Bitmap.Config getActualConfig();
- method public android.graphics.Bitmap.Config getPreferredConfig();
- method public void setPreferredConfig(android.graphics.Bitmap.Config);
+ method @NonNull public android.graphics.Bitmap.Config getActualConfig();
+ method @NonNull public android.graphics.Bitmap.Config getPreferredConfig();
+ method public void setPreferredConfig(@NonNull android.graphics.Bitmap.Config);
}
public final class MediaMuxer {
- ctor public MediaMuxer(java.lang.String, int) throws java.io.IOException;
- ctor public MediaMuxer(java.io.FileDescriptor, int) throws java.io.IOException;
- method public int addTrack(android.media.MediaFormat);
+ ctor public MediaMuxer(@NonNull String, int) throws java.io.IOException;
+ ctor public MediaMuxer(@NonNull java.io.FileDescriptor, int) throws java.io.IOException;
+ method public int addTrack(@NonNull android.media.MediaFormat);
method public void release();
method public void setLocation(float, float);
method public void setOrientationHint(int);
method public void start();
method public void stop();
- method public void writeSampleData(int, java.nio.ByteBuffer, android.media.MediaCodec.BufferInfo);
+ method public void writeSampleData(int, @NonNull java.nio.ByteBuffer, @NonNull android.media.MediaCodec.BufferInfo);
}
public static final class MediaMuxer.OutputFormat {
@@ -25126,10 +25175,10 @@ package android.media {
public class MediaPlayer implements android.media.AudioRouting android.media.VolumeAutomation {
ctor public MediaPlayer();
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public void addTimedTextSource(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public void addTimedTextSource(android.content.Context, android.net.Uri, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public void addTimedTextSource(java.io.FileDescriptor, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public void addTimedTextSource(java.io.FileDescriptor, long, long, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(android.content.Context, android.net.Uri, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(java.io.FileDescriptor, String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(java.io.FileDescriptor, long, long, String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void attachAuxEffect(int);
method public void clearOnMediaTimeDiscontinuityListener();
method public void clearOnSubtitleDataListener();
@@ -25138,22 +25187,23 @@ package android.media {
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder, android.media.AudioAttributes, int);
method public static android.media.MediaPlayer create(android.content.Context, int);
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
- method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
+ method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method public void deselectTrack(int) throws java.lang.IllegalStateException;
method protected void finalize();
method public int getAudioSessionId();
method public int getCurrentPosition();
method public android.media.MediaPlayer.DrmInfo getDrmInfo();
- method public java.lang.String getDrmPropertyString(java.lang.String) throws android.media.MediaPlayer.NoDrmSchemeException;
+ method @NonNull public String getDrmPropertyString(@NonNull String) throws android.media.MediaPlayer.NoDrmSchemeException;
method public int getDuration();
- method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.Map<java.lang.String, java.lang.String>) throws android.media.MediaPlayer.NoDrmSchemeException;
+ method @NonNull public android.media.MediaDrm.KeyRequest getKeyRequest(@Nullable byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws android.media.MediaPlayer.NoDrmSchemeException;
method public android.os.PersistableBundle getMetrics();
- method public android.media.PlaybackParams getPlaybackParams();
+ method @NonNull public android.media.PlaybackParams getPlaybackParams();
method public android.media.AudioDeviceInfo getPreferredDevice();
method public android.media.AudioDeviceInfo getRoutedDevice();
method public int getSelectedTrack(int) throws java.lang.IllegalStateException;
- method public android.media.SyncParams getSyncParams();
- method public android.media.MediaTimestamp getTimestamp();
+ method @NonNull public android.media.SyncParams getSyncParams();
+ method @Nullable public android.media.MediaTimestamp getTimestamp();
method public android.media.MediaPlayer.TrackInfo[] getTrackInfo() throws java.lang.IllegalStateException;
method public int getVideoHeight();
method public int getVideoWidth();
@@ -25162,30 +25212,30 @@ package android.media {
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
method public void prepareAsync() throws java.lang.IllegalStateException;
- method public void prepareDrm(java.util.UUID) throws android.media.MediaPlayer.ProvisioningNetworkErrorException, android.media.MediaPlayer.ProvisioningServerErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
- method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer.NoDrmSchemeException;
+ method public void prepareDrm(@NonNull java.util.UUID) throws android.media.MediaPlayer.ProvisioningNetworkErrorException, android.media.MediaPlayer.ProvisioningServerErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
+ method public byte[] provideKeyResponse(@Nullable byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer.NoDrmSchemeException;
method public void release();
method public void releaseDrm() throws android.media.MediaPlayer.NoDrmSchemeException;
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method public void reset();
- method public void restoreKeys(byte[]) throws android.media.MediaPlayer.NoDrmSchemeException;
+ method public void restoreKeys(@NonNull byte[]) throws android.media.MediaPlayer.NoDrmSchemeException;
method public void seekTo(long, int);
method public void seekTo(int) throws java.lang.IllegalStateException;
method public void selectTrack(int) throws java.lang.IllegalStateException;
method public void setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method public void setAudioSessionId(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public deprecated void setAudioStreamType(int);
+ method @Deprecated public void setAudioStreamType(int);
method public void setAuxEffectSendLevel(float);
- method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
- method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>) throws java.io.IOException;
- method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
- method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
- method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>) throws java.io.IOException;
+ method public void setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(@NonNull android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDisplay(android.view.SurfaceHolder);
- method public void setDrmPropertyString(java.lang.String, java.lang.String) throws android.media.MediaPlayer.NoDrmSchemeException;
+ method public void setDrmPropertyString(@NonNull String, @NonNull String) throws android.media.MediaPlayer.NoDrmSchemeException;
method public void setLooping(boolean);
method public void setNextMediaPlayer(android.media.MediaPlayer);
method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
@@ -25197,20 +25247,20 @@ package android.media {
method public void setOnDrmPreparedListener(android.media.MediaPlayer.OnDrmPreparedListener, android.os.Handler);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
- method public void setOnMediaTimeDiscontinuityListener(android.media.MediaPlayer.OnMediaTimeDiscontinuityListener, android.os.Handler);
- method public void setOnMediaTimeDiscontinuityListener(android.media.MediaPlayer.OnMediaTimeDiscontinuityListener);
+ method public void setOnMediaTimeDiscontinuityListener(@NonNull android.media.MediaPlayer.OnMediaTimeDiscontinuityListener, @NonNull android.os.Handler);
+ method public void setOnMediaTimeDiscontinuityListener(@NonNull android.media.MediaPlayer.OnMediaTimeDiscontinuityListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
- method public void setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener, android.os.Handler);
- method public void setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener);
+ method public void setOnSubtitleDataListener(@NonNull android.media.MediaPlayer.OnSubtitleDataListener, @NonNull android.os.Handler);
+ method public void setOnSubtitleDataListener(@NonNull android.media.MediaPlayer.OnSubtitleDataListener);
method public void setOnTimedMetaDataAvailableListener(android.media.MediaPlayer.OnTimedMetaDataAvailableListener);
method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
- method public void setPlaybackParams(android.media.PlaybackParams);
+ method public void setPlaybackParams(@NonNull android.media.PlaybackParams);
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
method public void setScreenOnWhilePlaying(boolean);
method public void setSurface(android.view.Surface);
- method public void setSyncParams(android.media.SyncParams);
+ method public void setSyncParams(@NonNull android.media.SyncParams);
method public void setVideoScalingMode(int);
method public void setVolume(float, float);
method public void setWakeMode(android.content.Context, int);
@@ -25236,7 +25286,7 @@ package android.media {
field public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; // 0x325
field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3
field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
- field public static final deprecated java.lang.String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+ field @Deprecated public static final String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3
field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1
field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2
@@ -25250,97 +25300,97 @@ package android.media {
}
public static final class MediaPlayer.DrmInfo {
- method public java.util.Map<java.util.UUID, byte[]> getPssh();
+ method public java.util.Map<java.util.UUID,byte[]> getPssh();
method public java.util.UUID[] getSupportedSchemes();
}
public static final class MediaPlayer.MetricsConstants {
- field public static final java.lang.String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
- field public static final java.lang.String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
- field public static final java.lang.String DURATION = "android.media.mediaplayer.durationMs";
- field public static final java.lang.String ERRORS = "android.media.mediaplayer.err";
- field public static final java.lang.String ERROR_CODE = "android.media.mediaplayer.errcode";
- field public static final java.lang.String FRAMES = "android.media.mediaplayer.frames";
- field public static final java.lang.String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
- field public static final java.lang.String HEIGHT = "android.media.mediaplayer.height";
- field public static final java.lang.String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
- field public static final java.lang.String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
- field public static final java.lang.String PLAYING = "android.media.mediaplayer.playingMs";
- field public static final java.lang.String WIDTH = "android.media.mediaplayer.width";
+ field public static final String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
+ field public static final String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
+ field public static final String DURATION = "android.media.mediaplayer.durationMs";
+ field public static final String ERRORS = "android.media.mediaplayer.err";
+ field public static final String ERROR_CODE = "android.media.mediaplayer.errcode";
+ field public static final String FRAMES = "android.media.mediaplayer.frames";
+ field public static final String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
+ field public static final String HEIGHT = "android.media.mediaplayer.height";
+ field public static final String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
+ field public static final String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
+ field public static final String PLAYING = "android.media.mediaplayer.playingMs";
+ field public static final String WIDTH = "android.media.mediaplayer.width";
}
public static final class MediaPlayer.NoDrmSchemeException extends android.media.MediaDrmException {
- ctor public MediaPlayer.NoDrmSchemeException(java.lang.String);
+ ctor public MediaPlayer.NoDrmSchemeException(String);
}
- public static abstract interface MediaPlayer.OnBufferingUpdateListener {
- method public abstract void onBufferingUpdate(android.media.MediaPlayer, int);
+ public static interface MediaPlayer.OnBufferingUpdateListener {
+ method public void onBufferingUpdate(android.media.MediaPlayer, int);
}
- public static abstract interface MediaPlayer.OnCompletionListener {
- method public abstract void onCompletion(android.media.MediaPlayer);
+ public static interface MediaPlayer.OnCompletionListener {
+ method public void onCompletion(android.media.MediaPlayer);
}
- public static abstract interface MediaPlayer.OnDrmConfigHelper {
- method public abstract void onDrmConfig(android.media.MediaPlayer);
+ public static interface MediaPlayer.OnDrmConfigHelper {
+ method public void onDrmConfig(android.media.MediaPlayer);
}
- public static abstract interface MediaPlayer.OnDrmInfoListener {
- method public abstract void onDrmInfo(android.media.MediaPlayer, android.media.MediaPlayer.DrmInfo);
+ public static interface MediaPlayer.OnDrmInfoListener {
+ method public void onDrmInfo(android.media.MediaPlayer, android.media.MediaPlayer.DrmInfo);
}
- public static abstract interface MediaPlayer.OnDrmPreparedListener {
- method public abstract void onDrmPrepared(android.media.MediaPlayer, int);
+ public static interface MediaPlayer.OnDrmPreparedListener {
+ method public void onDrmPrepared(android.media.MediaPlayer, int);
}
- public static abstract interface MediaPlayer.OnErrorListener {
- method public abstract boolean onError(android.media.MediaPlayer, int, int);
+ public static interface MediaPlayer.OnErrorListener {
+ method public boolean onError(android.media.MediaPlayer, int, int);
}
- public static abstract interface MediaPlayer.OnInfoListener {
- method public abstract boolean onInfo(android.media.MediaPlayer, int, int);
+ public static interface MediaPlayer.OnInfoListener {
+ method public boolean onInfo(android.media.MediaPlayer, int, int);
}
- public static abstract interface MediaPlayer.OnMediaTimeDiscontinuityListener {
- method public abstract void onMediaTimeDiscontinuity(android.media.MediaPlayer, android.media.MediaTimestamp);
+ public static interface MediaPlayer.OnMediaTimeDiscontinuityListener {
+ method public void onMediaTimeDiscontinuity(@NonNull android.media.MediaPlayer, @NonNull android.media.MediaTimestamp);
}
- public static abstract interface MediaPlayer.OnPreparedListener {
- method public abstract void onPrepared(android.media.MediaPlayer);
+ public static interface MediaPlayer.OnPreparedListener {
+ method public void onPrepared(android.media.MediaPlayer);
}
- public static abstract interface MediaPlayer.OnSeekCompleteListener {
- method public abstract void onSeekComplete(android.media.MediaPlayer);
+ public static interface MediaPlayer.OnSeekCompleteListener {
+ method public void onSeekComplete(android.media.MediaPlayer);
}
- public static abstract interface MediaPlayer.OnSubtitleDataListener {
- method public abstract void onSubtitleData(android.media.MediaPlayer, android.media.SubtitleData);
+ public static interface MediaPlayer.OnSubtitleDataListener {
+ method public void onSubtitleData(@NonNull android.media.MediaPlayer, @NonNull android.media.SubtitleData);
}
- public static abstract interface MediaPlayer.OnTimedMetaDataAvailableListener {
- method public abstract void onTimedMetaDataAvailable(android.media.MediaPlayer, android.media.TimedMetaData);
+ public static interface MediaPlayer.OnTimedMetaDataAvailableListener {
+ method public void onTimedMetaDataAvailable(android.media.MediaPlayer, android.media.TimedMetaData);
}
- public static abstract interface MediaPlayer.OnTimedTextListener {
- method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText);
+ public static interface MediaPlayer.OnTimedTextListener {
+ method public void onTimedText(android.media.MediaPlayer, android.media.TimedText);
}
- public static abstract interface MediaPlayer.OnVideoSizeChangedListener {
- method public abstract void onVideoSizeChanged(android.media.MediaPlayer, int, int);
+ public static interface MediaPlayer.OnVideoSizeChangedListener {
+ method public void onVideoSizeChanged(android.media.MediaPlayer, int, int);
}
public static final class MediaPlayer.ProvisioningNetworkErrorException extends android.media.MediaDrmException {
- ctor public MediaPlayer.ProvisioningNetworkErrorException(java.lang.String);
+ ctor public MediaPlayer.ProvisioningNetworkErrorException(String);
}
public static final class MediaPlayer.ProvisioningServerErrorException extends android.media.MediaDrmException {
- ctor public MediaPlayer.ProvisioningServerErrorException(java.lang.String);
+ ctor public MediaPlayer.ProvisioningServerErrorException(String);
}
public static class MediaPlayer.TrackInfo implements android.os.Parcelable {
method public int describeContents();
method public android.media.MediaFormat getFormat();
- method public java.lang.String getLanguage();
+ method public String getLanguage();
method public int getTrackType();
method public void writeToParcel(android.os.Parcel, int);
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
@@ -25354,57 +25404,64 @@ package android.media {
public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable {
ctor public MediaPlayer2(android.content.Context);
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public java.lang.Object attachAuxEffect(int);
- method public boolean cancelCommand(java.lang.Object);
- method public java.lang.Object clearNextDataSources();
+ method public Object attachAuxEffect(int);
+ method public boolean cancelCommand(@NonNull Object);
+ method public Object clearNextDataSources();
method public void clearPendingCommands();
method public void close();
- method public java.lang.Object deselectTrack(android.media.DataSourceDesc, int);
- method public android.media.AudioAttributes getAudioAttributes();
+ method public Object deselectTrack(int);
+ method public Object deselectTrack(@NonNull android.media.DataSourceDesc, int);
+ method @NonNull public android.media.AudioAttributes getAudioAttributes();
method public int getAudioSessionId();
- method public long getBufferedPosition(android.media.DataSourceDesc);
- method public android.media.DataSourceDesc getCurrentDataSource();
+ method public long getBufferedPosition();
+ method public long getBufferedPosition(@NonNull android.media.DataSourceDesc);
+ method @Nullable public android.media.DataSourceDesc getCurrentDataSource();
method public long getCurrentPosition();
- method public long getDuration(android.media.DataSourceDesc);
+ method public long getDuration();
+ method public long getDuration(@NonNull android.media.DataSourceDesc);
method public float getMaxPlayerVolume();
method public android.os.PersistableBundle getMetrics();
- method public android.media.PlaybackParams getPlaybackParams();
+ method @NonNull public android.media.PlaybackParams getPlaybackParams();
method public float getPlayerVolume();
method public android.media.AudioDeviceInfo getPreferredDevice();
method public android.media.AudioDeviceInfo getRoutedDevice();
- method public int getSelectedTrack(android.media.DataSourceDesc, int);
+ method public int getSelectedTrack(int);
+ method public int getSelectedTrack(@NonNull android.media.DataSourceDesc, int);
method public int getState();
- method public android.media.SyncParams getSyncParams();
- method public android.media.MediaTimestamp getTimestamp();
- method public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(android.media.DataSourceDesc);
+ method @NonNull public android.media.SyncParams getSyncParams();
+ method @Nullable public android.media.MediaTimestamp getTimestamp();
+ method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo();
+ method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(@NonNull android.media.DataSourceDesc);
method public android.media.VideoSize getVideoSize();
method public boolean isLooping();
- method public java.lang.Object loopCurrent(boolean);
- method public java.lang.Object notifyWhenCommandLabelReached(java.lang.Object);
- method public java.lang.Object pause();
- method public java.lang.Object play();
- method public java.lang.Object prepare();
- method public void registerEventCallback(java.util.concurrent.Executor, android.media.MediaPlayer2.EventCallback);
+ method public Object loopCurrent(boolean);
+ method public Object notifyWhenCommandLabelReached(@NonNull Object);
+ method public Object pause();
+ method public Object play();
+ method public Object prepare();
+ method public void registerEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.EventCallback);
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method public void reset();
- method public java.lang.Object seekTo(long);
- method public java.lang.Object seekTo(long, int);
- method public java.lang.Object selectTrack(android.media.DataSourceDesc, int);
- method public java.lang.Object setAudioAttributes(android.media.AudioAttributes);
- method public java.lang.Object setAudioSessionId(int);
- method public java.lang.Object setAuxEffectSendLevel(float);
- method public java.lang.Object setDataSource(android.media.DataSourceDesc);
- method public java.lang.Object setDisplay(android.view.SurfaceHolder);
- method public java.lang.Object setNextDataSource(android.media.DataSourceDesc);
- method public java.lang.Object setNextDataSources(java.util.List<android.media.DataSourceDesc>);
- method public java.lang.Object setPlaybackParams(android.media.PlaybackParams);
- method public java.lang.Object setPlayerVolume(float);
+ method public Object seekTo(long);
+ method public Object seekTo(long, int);
+ method public Object selectTrack(int);
+ method public Object selectTrack(@NonNull android.media.DataSourceDesc, int);
+ method public Object setAudioAttributes(@NonNull android.media.AudioAttributes);
+ method public Object setAudioSessionId(int);
+ method public Object setAuxEffectSendLevel(float);
+ method public Object setDataSource(@NonNull android.media.DataSourceDesc);
+ method public Object setDisplay(android.view.SurfaceHolder);
+ method public void setDrmEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.DrmEventCallback);
+ method public Object setNextDataSource(@NonNull android.media.DataSourceDesc);
+ method public Object setNextDataSources(@NonNull java.util.List<android.media.DataSourceDesc>);
+ method public Object setPlaybackParams(@NonNull android.media.PlaybackParams);
+ method public Object setPlayerVolume(float);
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
- method public java.lang.Object setScreenOnWhilePlaying(boolean);
- method public java.lang.Object setSurface(android.view.Surface);
- method public java.lang.Object setSyncParams(android.media.SyncParams);
- method public java.lang.Object setWakeLock(android.os.PowerManager.WakeLock);
- method public java.lang.Object skipToNext();
+ method public Object setScreenOnWhilePlaying(boolean);
+ method public Object setSurface(android.view.Surface);
+ method public Object setSyncParams(@NonNull android.media.SyncParams);
+ method public Object setWakeLock(@NonNull android.os.PowerManager.WakeLock);
+ method public Object skipToNext();
method public void unregisterEventCallback(android.media.MediaPlayer2.EventCallback);
field public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1; // 0x1
field public static final int CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES = 30; // 0x1e
@@ -25473,36 +25530,67 @@ package android.media {
field public static final int SEEK_PREVIOUS_SYNC = 0; // 0x0
}
+ public static class MediaPlayer2.DrmEventCallback {
+ ctor public MediaPlayer2.DrmEventCallback();
+ method public void onDrmConfig(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaDrm);
+ method public android.media.MediaPlayer2.DrmPreparationInfo onDrmInfo(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.MediaPlayer2.DrmInfo);
+ method public byte[] onDrmKeyRequest(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaDrm.KeyRequest);
+ method public void onDrmPrepared(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, @Nullable byte[]);
+ }
+
+ public static final class MediaPlayer2.DrmInfo {
+ method public java.util.Map<java.util.UUID,byte[]> getPssh();
+ method public java.util.List<java.util.UUID> getSupportedSchemes();
+ }
+
+ public static final class MediaPlayer2.DrmPreparationInfo {
+ }
+
+ public static final class MediaPlayer2.DrmPreparationInfo.Builder {
+ ctor public MediaPlayer2.DrmPreparationInfo.Builder();
+ method public android.media.MediaPlayer2.DrmPreparationInfo build();
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setInitData(@Nullable byte[]);
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setKeySetId(@Nullable byte[]);
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setKeyType(int);
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setMimeType(@Nullable String);
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setOptionalParameters(@Nullable java.util.Map<java.lang.String,java.lang.String>);
+ method public android.media.MediaPlayer2.DrmPreparationInfo.Builder setUuid(@NonNull java.util.UUID);
+ }
+
public static class MediaPlayer2.EventCallback {
ctor public MediaPlayer2.EventCallback();
- method public void onCallCompleted(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onCommandLabelReached(android.media.MediaPlayer2, java.lang.Object);
- method public void onError(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onInfo(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onMediaTimeDiscontinuity(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.MediaTimestamp);
- method public void onSubtitleData(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.SubtitleData);
- method public void onTimedMetaDataAvailable(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.TimedMetaData);
- method public void onVideoSizeChanged(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.VideoSize);
+ method public void onCallCompleted(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int);
+ method public void onCommandLabelReached(@NonNull android.media.MediaPlayer2, @NonNull Object);
+ method public void onError(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int);
+ method public void onInfo(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int);
+ method public void onMediaTimeDiscontinuity(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaTimestamp);
+ method public void onSubtitleData(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.SubtitleData);
+ method public void onTimedMetaDataAvailable(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.TimedMetaData);
+ method public void onVideoSizeChanged(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.VideoSize);
}
public static final class MediaPlayer2.MetricsConstants {
- field public static final java.lang.String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
- field public static final java.lang.String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
- field public static final java.lang.String DURATION = "android.media.mediaplayer.durationMs";
- field public static final java.lang.String ERRORS = "android.media.mediaplayer.err";
- field public static final java.lang.String ERROR_CODE = "android.media.mediaplayer.errcode";
- field public static final java.lang.String FRAMES = "android.media.mediaplayer.frames";
- field public static final java.lang.String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
- field public static final java.lang.String HEIGHT = "android.media.mediaplayer.height";
- field public static final java.lang.String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
- field public static final java.lang.String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
- field public static final java.lang.String PLAYING = "android.media.mediaplayer.playingMs";
- field public static final java.lang.String WIDTH = "android.media.mediaplayer.width";
+ field public static final String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
+ field public static final String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
+ field public static final String DURATION = "android.media.mediaplayer.durationMs";
+ field public static final String ERRORS = "android.media.mediaplayer.err";
+ field public static final String ERROR_CODE = "android.media.mediaplayer.errcode";
+ field public static final String FRAMES = "android.media.mediaplayer.frames";
+ field public static final String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
+ field public static final String HEIGHT = "android.media.mediaplayer.height";
+ field public static final String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
+ field public static final String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
+ field public static final String PLAYING = "android.media.mediaplayer.playingMs";
+ field public static final String WIDTH = "android.media.mediaplayer.width";
+ }
+
+ public static final class MediaPlayer2.NoDrmSchemeException extends android.media.MediaDrmException {
+ ctor public MediaPlayer2.NoDrmSchemeException(String);
}
public static class MediaPlayer2.TrackInfo {
method public android.media.MediaFormat getFormat();
- method public java.lang.String getLanguage();
+ method public String getLanguage();
method public int getTrackType();
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
@@ -25516,7 +25604,7 @@ package android.media {
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method protected void finalize();
method public java.util.List<android.media.MicrophoneInfo> getActiveMicrophones() throws java.io.IOException;
- method public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
+ method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
method public android.os.PersistableBundle getMetrics();
@@ -25525,7 +25613,7 @@ package android.media {
method public android.view.Surface getSurface();
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
- method public void registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback);
+ method public void registerAudioRecordingCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioRecordingCallback);
method public void release();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method public void reset();
@@ -25535,9 +25623,9 @@ package android.media {
method public void setAudioEncodingBitRate(int);
method public void setAudioSamplingRate(int);
method public void setAudioSource(int) throws java.lang.IllegalStateException;
- method public deprecated void setCamera(android.hardware.Camera);
+ method @Deprecated public void setCamera(android.hardware.Camera);
method public void setCaptureRate(double);
- method public void setInputSurface(android.view.Surface);
+ method public void setInputSurface(@NonNull android.view.Surface);
method public void setLocation(float, float);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
@@ -25548,7 +25636,7 @@ package android.media {
method public void setOrientationHint(int);
method public void setOutputFile(java.io.FileDescriptor) throws java.lang.IllegalStateException;
method public void setOutputFile(java.io.File);
- method public void setOutputFile(java.lang.String) throws java.lang.IllegalStateException;
+ method public void setOutputFile(String) throws java.lang.IllegalStateException;
method public void setOutputFormat(int) throws java.lang.IllegalStateException;
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
method public void setPreviewDisplay(android.view.Surface);
@@ -25561,7 +25649,7 @@ package android.media {
method public void setVideoSource(int) throws java.lang.IllegalStateException;
method public void start() throws java.lang.IllegalStateException;
method public void stop() throws java.lang.IllegalStateException;
- method public void unregisterAudioRecordingCallback(android.media.AudioManager.AudioRecordingCallback);
+ method public void unregisterAudioRecordingCallback(@NonNull android.media.AudioManager.AudioRecordingCallback);
field public static final int MEDIA_ERROR_SERVER_DIED = 100; // 0x64
field public static final int MEDIA_RECORDER_ERROR_UNKNOWN = 1; // 0x1
field public static final int MEDIA_RECORDER_INFO_MAX_DURATION_REACHED = 800; // 0x320
@@ -25586,40 +25674,41 @@ package android.media {
field public static final int CAMCORDER = 5; // 0x5
field public static final int DEFAULT = 0; // 0x0
field public static final int MIC = 1; // 0x1
- field public static final int REMOTE_SUBMIX = 8; // 0x8
+ field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int REMOTE_SUBMIX = 8; // 0x8
field public static final int UNPROCESSED = 9; // 0x9
field public static final int VOICE_CALL = 4; // 0x4
field public static final int VOICE_COMMUNICATION = 7; // 0x7
field public static final int VOICE_DOWNLINK = 3; // 0x3
+ field public static final int VOICE_PERFORMANCE = 10; // 0xa
field public static final int VOICE_RECOGNITION = 6; // 0x6
field public static final int VOICE_UPLINK = 2; // 0x2
}
public static final class MediaRecorder.MetricsConstants {
- field public static final java.lang.String AUDIO_BITRATE = "android.media.mediarecorder.audio-bitrate";
- field public static final java.lang.String AUDIO_CHANNELS = "android.media.mediarecorder.audio-channels";
- field public static final java.lang.String AUDIO_SAMPLERATE = "android.media.mediarecorder.audio-samplerate";
- field public static final java.lang.String AUDIO_TIMESCALE = "android.media.mediarecorder.audio-timescale";
- field public static final java.lang.String CAPTURE_FPS = "android.media.mediarecorder.capture-fps";
- field public static final java.lang.String CAPTURE_FPS_ENABLE = "android.media.mediarecorder.capture-fpsenable";
- field public static final java.lang.String FRAMERATE = "android.media.mediarecorder.frame-rate";
- field public static final java.lang.String HEIGHT = "android.media.mediarecorder.height";
- field public static final java.lang.String MOVIE_TIMESCALE = "android.media.mediarecorder.movie-timescale";
- field public static final java.lang.String ROTATION = "android.media.mediarecorder.rotation";
- field public static final java.lang.String VIDEO_BITRATE = "android.media.mediarecorder.video-bitrate";
- field public static final java.lang.String VIDEO_IFRAME_INTERVAL = "android.media.mediarecorder.video-iframe-interval";
- field public static final java.lang.String VIDEO_LEVEL = "android.media.mediarecorder.video-encoder-level";
- field public static final java.lang.String VIDEO_PROFILE = "android.media.mediarecorder.video-encoder-profile";
- field public static final java.lang.String VIDEO_TIMESCALE = "android.media.mediarecorder.video-timescale";
- field public static final java.lang.String WIDTH = "android.media.mediarecorder.width";
+ field public static final String AUDIO_BITRATE = "android.media.mediarecorder.audio-bitrate";
+ field public static final String AUDIO_CHANNELS = "android.media.mediarecorder.audio-channels";
+ field public static final String AUDIO_SAMPLERATE = "android.media.mediarecorder.audio-samplerate";
+ field public static final String AUDIO_TIMESCALE = "android.media.mediarecorder.audio-timescale";
+ field public static final String CAPTURE_FPS = "android.media.mediarecorder.capture-fps";
+ field public static final String CAPTURE_FPS_ENABLE = "android.media.mediarecorder.capture-fpsenable";
+ field public static final String FRAMERATE = "android.media.mediarecorder.frame-rate";
+ field public static final String HEIGHT = "android.media.mediarecorder.height";
+ field public static final String MOVIE_TIMESCALE = "android.media.mediarecorder.movie-timescale";
+ field public static final String ROTATION = "android.media.mediarecorder.rotation";
+ field public static final String VIDEO_BITRATE = "android.media.mediarecorder.video-bitrate";
+ field public static final String VIDEO_IFRAME_INTERVAL = "android.media.mediarecorder.video-iframe-interval";
+ field public static final String VIDEO_LEVEL = "android.media.mediarecorder.video-encoder-level";
+ field public static final String VIDEO_PROFILE = "android.media.mediarecorder.video-encoder-profile";
+ field public static final String VIDEO_TIMESCALE = "android.media.mediarecorder.video-timescale";
+ field public static final String WIDTH = "android.media.mediarecorder.width";
}
- public static abstract interface MediaRecorder.OnErrorListener {
- method public abstract void onError(android.media.MediaRecorder, int, int);
+ public static interface MediaRecorder.OnErrorListener {
+ method public void onError(android.media.MediaRecorder, int, int);
}
- public static abstract interface MediaRecorder.OnInfoListener {
- method public abstract void onInfo(android.media.MediaRecorder, int, int);
+ public static interface MediaRecorder.OnInfoListener {
+ method public void onInfo(android.media.MediaRecorder, int, int);
}
public final class MediaRecorder.OutputFormat {
@@ -25630,7 +25719,7 @@ package android.media {
field public static final int MPEG_2_TS = 8; // 0x8
field public static final int MPEG_4 = 2; // 0x2
field public static final int OGG = 11; // 0xb
- field public static final deprecated int RAW_AMR = 3; // 0x3
+ field @Deprecated public static final int RAW_AMR = 3; // 0x3
field public static final int THREE_GPP = 1; // 0x1
field public static final int WEBM = 9; // 0x9
}
@@ -25655,7 +25744,7 @@ package android.media {
method public void addCallback(int, android.media.MediaRouter.Callback, int);
method public void addUserRoute(android.media.MediaRouter.UserRouteInfo);
method public void clearUserRoutes();
- method public android.media.MediaRouter.RouteCategory createRouteCategory(java.lang.CharSequence, boolean);
+ method public android.media.MediaRouter.RouteCategory createRouteCategory(CharSequence, boolean);
method public android.media.MediaRouter.RouteCategory createRouteCategory(int, boolean);
method public android.media.MediaRouter.UserRouteInfo createUserRoute(android.media.MediaRouter.RouteCategory);
method public android.media.MediaRouter.RouteCategory getCategoryAt(int);
@@ -25666,7 +25755,7 @@ package android.media {
method public android.media.MediaRouter.RouteInfo getSelectedRoute(int);
method public void removeCallback(android.media.MediaRouter.Callback);
method public void removeUserRoute(android.media.MediaRouter.UserRouteInfo);
- method public void selectRoute(int, android.media.MediaRouter.RouteInfo);
+ method public void selectRoute(int, @NonNull android.media.MediaRouter.RouteInfo);
field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
field public static final int ROUTE_TYPE_LIVE_AUDIO = 1; // 0x1
@@ -25674,7 +25763,7 @@ package android.media {
field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
}
- public static abstract class MediaRouter.Callback {
+ public abstract static class MediaRouter.Callback {
ctor public MediaRouter.Callback();
method public abstract void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
method public abstract void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
@@ -25688,8 +25777,8 @@ package android.media {
}
public static class MediaRouter.RouteCategory {
- method public java.lang.CharSequence getName();
- method public java.lang.CharSequence getName(android.content.Context);
+ method public CharSequence getName();
+ method public CharSequence getName(android.content.Context);
method public java.util.List<android.media.MediaRouter.RouteInfo> getRoutes(java.util.List<android.media.MediaRouter.RouteInfo>);
method public int getSupportedTypes();
method public boolean isGroupable();
@@ -25703,23 +25792,23 @@ package android.media {
method public void removeRoute(android.media.MediaRouter.RouteInfo);
method public void removeRoute(int);
method public void setIconDrawable(android.graphics.drawable.Drawable);
- method public void setIconResource(int);
+ method public void setIconResource(@DrawableRes int);
}
public static class MediaRouter.RouteInfo {
method public android.media.MediaRouter.RouteCategory getCategory();
- method public java.lang.CharSequence getDescription();
+ method public CharSequence getDescription();
method public int getDeviceType();
method public android.media.MediaRouter.RouteGroup getGroup();
method public android.graphics.drawable.Drawable getIconDrawable();
- method public java.lang.CharSequence getName();
- method public java.lang.CharSequence getName(android.content.Context);
+ method public CharSequence getName();
+ method public CharSequence getName(android.content.Context);
method public int getPlaybackStream();
method public int getPlaybackType();
method public android.view.Display getPresentationDisplay();
- method public java.lang.CharSequence getStatus();
+ method public CharSequence getStatus();
method public int getSupportedTypes();
- method public java.lang.Object getTag();
+ method public Object getTag();
method public int getVolume();
method public int getVolumeHandling();
method public int getVolumeMax();
@@ -25727,7 +25816,7 @@ package android.media {
method public boolean isEnabled();
method public void requestSetVolume(int);
method public void requestUpdateVolume(int);
- method public void setTag(java.lang.Object);
+ method public void setTag(Object);
field public static final int DEVICE_TYPE_BLUETOOTH = 3; // 0x3
field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
field public static final int DEVICE_TYPE_TV = 1; // 0x1
@@ -25752,22 +25841,22 @@ package android.media {
public static class MediaRouter.UserRouteInfo extends android.media.MediaRouter.RouteInfo {
method public android.media.RemoteControlClient getRemoteControlClient();
- method public void setDescription(java.lang.CharSequence);
+ method public void setDescription(CharSequence);
method public void setIconDrawable(android.graphics.drawable.Drawable);
- method public void setIconResource(int);
- method public void setName(java.lang.CharSequence);
+ method public void setIconResource(@DrawableRes int);
+ method public void setName(CharSequence);
method public void setName(int);
method public void setPlaybackStream(int);
method public void setPlaybackType(int);
method public void setRemoteControlClient(android.media.RemoteControlClient);
- method public void setStatus(java.lang.CharSequence);
+ method public void setStatus(CharSequence);
method public void setVolume(int);
method public void setVolumeCallback(android.media.MediaRouter.VolumeCallback);
method public void setVolumeHandling(int);
method public void setVolumeMax(int);
}
- public static abstract class MediaRouter.VolumeCallback {
+ public abstract static class MediaRouter.VolumeCallback {
ctor public MediaRouter.VolumeCallback();
method public abstract void onVolumeSetRequest(android.media.MediaRouter.RouteInfo, int);
method public abstract void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo, int);
@@ -25777,48 +25866,81 @@ package android.media {
ctor public MediaScannerConnection(android.content.Context, android.media.MediaScannerConnection.MediaScannerConnectionClient);
method public void connect();
method public void disconnect();
- method public synchronized boolean isConnected();
+ method public boolean isConnected();
method public void onServiceConnected(android.content.ComponentName, android.os.IBinder);
method public void onServiceDisconnected(android.content.ComponentName);
- method public void scanFile(java.lang.String, java.lang.String);
- method public static void scanFile(android.content.Context, java.lang.String[], java.lang.String[], android.media.MediaScannerConnection.OnScanCompletedListener);
+ method public void scanFile(String, String);
+ method public static void scanFile(android.content.Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener);
+ }
+
+ public static interface MediaScannerConnection.MediaScannerConnectionClient extends android.media.MediaScannerConnection.OnScanCompletedListener {
+ method public void onMediaScannerConnected();
+ }
+
+ public static interface MediaScannerConnection.OnScanCompletedListener {
+ method public void onScanCompleted(String, android.net.Uri);
+ }
+
+ public class MediaSession2 implements java.lang.AutoCloseable {
+ method public void broadcastSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle);
+ method public void cancelSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object);
+ method public void close();
+ method @NonNull public String getSessionId();
+ method @NonNull public android.media.Session2Token getSessionToken();
+ method public boolean isPlaybackActive();
+ method @NonNull public Object sendSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
+ method public void setPlaybackActive(boolean);
}
- public static abstract interface MediaScannerConnection.MediaScannerConnectionClient implements android.media.MediaScannerConnection.OnScanCompletedListener {
- method public abstract void onMediaScannerConnected();
+ public static final class MediaSession2.Builder {
+ ctor public MediaSession2.Builder(@NonNull android.content.Context);
+ method @NonNull public android.media.MediaSession2 build();
+ method @NonNull public android.media.MediaSession2.Builder setId(@NonNull String);
+ method @NonNull public android.media.MediaSession2.Builder setSessionActivity(@Nullable android.app.PendingIntent);
+ method @NonNull public android.media.MediaSession2.Builder setSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaSession2.SessionCallback);
}
- public static abstract interface MediaScannerConnection.OnScanCompletedListener {
- method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
+ public static final class MediaSession2.ControllerInfo {
+ method @NonNull public String getPackageName();
+ method @NonNull public android.media.session.MediaSessionManager.RemoteUserInfo getRemoteUserInfo();
+ method public int getUid();
+ }
+
+ public abstract static class MediaSession2.SessionCallback {
+ ctor public MediaSession2.SessionCallback();
+ method public void onCommandResult(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result);
+ method @Nullable public android.media.Session2CommandGroup onConnect(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo);
+ method public void onDisconnected(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo);
+ method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
}
public final class MediaSync {
ctor public MediaSync();
- method public android.view.Surface createInputSurface();
+ method @NonNull public android.view.Surface createInputSurface();
method protected void finalize();
method public void flush();
- method public android.media.PlaybackParams getPlaybackParams();
- method public android.media.SyncParams getSyncParams();
- method public android.media.MediaTimestamp getTimestamp();
- method public void queueAudio(java.nio.ByteBuffer, int, long);
+ method @NonNull public android.media.PlaybackParams getPlaybackParams();
+ method @NonNull public android.media.SyncParams getSyncParams();
+ method @Nullable public android.media.MediaTimestamp getTimestamp();
+ method public void queueAudio(@NonNull java.nio.ByteBuffer, int, long);
method public void release();
- method public void setAudioTrack(android.media.AudioTrack);
- method public void setCallback(android.media.MediaSync.Callback, android.os.Handler);
- method public void setOnErrorListener(android.media.MediaSync.OnErrorListener, android.os.Handler);
- method public void setPlaybackParams(android.media.PlaybackParams);
- method public void setSurface(android.view.Surface);
- method public void setSyncParams(android.media.SyncParams);
+ method public void setAudioTrack(@Nullable android.media.AudioTrack);
+ method public void setCallback(@Nullable android.media.MediaSync.Callback, @Nullable android.os.Handler);
+ method public void setOnErrorListener(@Nullable android.media.MediaSync.OnErrorListener, @Nullable android.os.Handler);
+ method public void setPlaybackParams(@NonNull android.media.PlaybackParams);
+ method public void setSurface(@Nullable android.view.Surface);
+ method public void setSyncParams(@NonNull android.media.SyncParams);
field public static final int MEDIASYNC_ERROR_AUDIOTRACK_FAIL = 1; // 0x1
field public static final int MEDIASYNC_ERROR_SURFACE_FAIL = 2; // 0x2
}
- public static abstract class MediaSync.Callback {
+ public abstract static class MediaSync.Callback {
ctor public MediaSync.Callback();
- method public abstract void onAudioBufferConsumed(android.media.MediaSync, java.nio.ByteBuffer, int);
+ method public abstract void onAudioBufferConsumed(@NonNull android.media.MediaSync, @NonNull java.nio.ByteBuffer, int);
}
- public static abstract interface MediaSync.OnErrorListener {
- method public abstract void onError(android.media.MediaSync, int, int);
+ public static interface MediaSync.OnErrorListener {
+ method public void onError(@NonNull android.media.MediaSync, int, int);
}
public class MediaSyncEvent {
@@ -25833,17 +25955,17 @@ package android.media {
public final class MediaTimestamp {
method public long getAnchorMediaTimeUs();
method public long getAnchorSystemNanoTime();
- method public deprecated long getAnchorSytemNanoTime();
+ method @Deprecated public long getAnchorSytemNanoTime();
method public float getMediaClockRate();
field public static final android.media.MediaTimestamp TIMESTAMP_UNKNOWN;
}
public final class MicrophoneInfo {
- method public java.lang.String getAddress();
- method public java.util.List<android.util.Pair<java.lang.Integer, java.lang.Integer>> getChannelMapping();
- method public java.lang.String getDescription();
+ method @NonNull public String getAddress();
+ method public java.util.List<android.util.Pair<java.lang.Integer,java.lang.Integer>> getChannelMapping();
+ method public String getDescription();
method public int getDirectionality();
- method public java.util.List<android.util.Pair<java.lang.Float, java.lang.Float>> getFrequencyResponse();
+ method public java.util.List<android.util.Pair<java.lang.Float,java.lang.Float>> getFrequencyResponse();
method public int getGroup();
method public int getId();
method public int getIndexInTheGroup();
@@ -25881,7 +26003,7 @@ package android.media {
}
public final class NotProvisionedException extends android.media.MediaDrmException {
- ctor public NotProvisionedException(java.lang.String);
+ ctor public NotProvisionedException(String);
}
public final class PlaybackParams implements android.os.Parcelable {
@@ -25925,102 +26047,102 @@ package android.media {
field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
}
- public deprecated class RemoteControlClient {
- ctor public RemoteControlClient(android.app.PendingIntent);
- ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
- method public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
- method public android.media.session.MediaSession getMediaSession();
- method public void setMetadataUpdateListener(android.media.RemoteControlClient.OnMetadataUpdateListener);
- method public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient.OnGetPlaybackPositionListener);
- method public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient.OnPlaybackPositionUpdateListener);
- method public void setPlaybackState(int);
- method public void setPlaybackState(int, long, float);
- method public void setTransportControlFlags(int);
- field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
- field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
- field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
- field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
- field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
- field public static final int FLAG_KEY_MEDIA_POSITION_UPDATE = 256; // 0x100
- field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
- field public static final int FLAG_KEY_MEDIA_RATING = 512; // 0x200
- field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
- field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
- field public static final int PLAYSTATE_BUFFERING = 8; // 0x8
- field public static final int PLAYSTATE_ERROR = 9; // 0x9
- field public static final int PLAYSTATE_FAST_FORWARDING = 4; // 0x4
- field public static final int PLAYSTATE_PAUSED = 2; // 0x2
- field public static final int PLAYSTATE_PLAYING = 3; // 0x3
- field public static final int PLAYSTATE_REWINDING = 5; // 0x5
- field public static final int PLAYSTATE_SKIPPING_BACKWARDS = 7; // 0x7
- field public static final int PLAYSTATE_SKIPPING_FORWARDS = 6; // 0x6
- field public static final int PLAYSTATE_STOPPED = 1; // 0x1
- }
-
- public deprecated class RemoteControlClient.MetadataEditor extends android.media.MediaMetadataEditor {
- method public synchronized void apply();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
- method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.RemoteControlClient.MetadataEditor putObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
- method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
- field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
- }
-
- public static abstract interface RemoteControlClient.OnGetPlaybackPositionListener {
- method public abstract long onGetPlaybackPosition();
- }
-
- public static abstract interface RemoteControlClient.OnMetadataUpdateListener {
- method public abstract void onMetadataUpdate(int, java.lang.Object);
- }
-
- public static abstract interface RemoteControlClient.OnPlaybackPositionUpdateListener {
- method public abstract void onPlaybackPositionUpdate(long);
- }
-
- public final deprecated class RemoteController {
- ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener) throws java.lang.IllegalArgumentException;
- ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener, android.os.Looper) throws java.lang.IllegalArgumentException;
- method public boolean clearArtworkConfiguration();
- method public android.media.RemoteController.MetadataEditor editMetadata();
- method public long getEstimatedMediaPosition();
- method public boolean seekTo(long) throws java.lang.IllegalArgumentException;
- method public boolean sendMediaKeyEvent(android.view.KeyEvent) throws java.lang.IllegalArgumentException;
- method public boolean setArtworkConfiguration(int, int) throws java.lang.IllegalArgumentException;
- method public boolean setSynchronizationMode(int) throws java.lang.IllegalArgumentException;
- field public static final int POSITION_SYNCHRONIZATION_CHECK = 1; // 0x1
- field public static final int POSITION_SYNCHRONIZATION_NONE = 0; // 0x0
- }
-
- public class RemoteController.MetadataEditor extends android.media.MediaMetadataEditor {
- method public synchronized void apply();
- }
-
- public static abstract interface RemoteController.OnClientUpdateListener {
- method public abstract void onClientChange(boolean);
- method public abstract void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor);
- method public abstract void onClientPlaybackStateUpdate(int);
- method public abstract void onClientPlaybackStateUpdate(int, long, long, float);
- method public abstract void onClientTransportControlUpdate(int);
+ @Deprecated public class RemoteControlClient {
+ ctor @Deprecated public RemoteControlClient(android.app.PendingIntent);
+ ctor @Deprecated public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
+ method @Deprecated public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
+ method @Deprecated public android.media.session.MediaSession getMediaSession();
+ method @Deprecated public void setMetadataUpdateListener(android.media.RemoteControlClient.OnMetadataUpdateListener);
+ method @Deprecated public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient.OnGetPlaybackPositionListener);
+ method @Deprecated public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient.OnPlaybackPositionUpdateListener);
+ method @Deprecated public void setPlaybackState(int);
+ method @Deprecated public void setPlaybackState(int, long, float);
+ method @Deprecated public void setTransportControlFlags(int);
+ field @Deprecated public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
+ field @Deprecated public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
+ field @Deprecated public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
+ field @Deprecated public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
+ field @Deprecated public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
+ field @Deprecated public static final int FLAG_KEY_MEDIA_POSITION_UPDATE = 256; // 0x100
+ field @Deprecated public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+ field @Deprecated public static final int FLAG_KEY_MEDIA_RATING = 512; // 0x200
+ field @Deprecated public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
+ field @Deprecated public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
+ field @Deprecated public static final int PLAYSTATE_BUFFERING = 8; // 0x8
+ field @Deprecated public static final int PLAYSTATE_ERROR = 9; // 0x9
+ field @Deprecated public static final int PLAYSTATE_FAST_FORWARDING = 4; // 0x4
+ field @Deprecated public static final int PLAYSTATE_PAUSED = 2; // 0x2
+ field @Deprecated public static final int PLAYSTATE_PLAYING = 3; // 0x3
+ field @Deprecated public static final int PLAYSTATE_REWINDING = 5; // 0x5
+ field @Deprecated public static final int PLAYSTATE_SKIPPING_BACKWARDS = 7; // 0x7
+ field @Deprecated public static final int PLAYSTATE_SKIPPING_FORWARDS = 6; // 0x6
+ field @Deprecated public static final int PLAYSTATE_STOPPED = 1; // 0x1
+ }
+
+ @Deprecated public class RemoteControlClient.MetadataEditor extends android.media.MediaMetadataEditor {
+ method @Deprecated public void apply();
+ method public Object clone() throws java.lang.CloneNotSupportedException;
+ method @Deprecated public android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.RemoteControlClient.MetadataEditor putObject(int, Object) throws java.lang.IllegalArgumentException;
+ method @Deprecated public android.media.RemoteControlClient.MetadataEditor putString(int, String) throws java.lang.IllegalArgumentException;
+ field @Deprecated public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
+ }
+
+ @Deprecated public static interface RemoteControlClient.OnGetPlaybackPositionListener {
+ method @Deprecated public long onGetPlaybackPosition();
+ }
+
+ @Deprecated public static interface RemoteControlClient.OnMetadataUpdateListener {
+ method @Deprecated public void onMetadataUpdate(int, Object);
+ }
+
+ @Deprecated public static interface RemoteControlClient.OnPlaybackPositionUpdateListener {
+ method @Deprecated public void onPlaybackPositionUpdate(long);
+ }
+
+ @Deprecated public final class RemoteController {
+ ctor @Deprecated public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener) throws java.lang.IllegalArgumentException;
+ ctor @Deprecated public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener, android.os.Looper) throws java.lang.IllegalArgumentException;
+ method @Deprecated public boolean clearArtworkConfiguration();
+ method @Deprecated public android.media.RemoteController.MetadataEditor editMetadata();
+ method @Deprecated public long getEstimatedMediaPosition();
+ method @Deprecated public boolean seekTo(long) throws java.lang.IllegalArgumentException;
+ method @Deprecated public boolean sendMediaKeyEvent(android.view.KeyEvent) throws java.lang.IllegalArgumentException;
+ method @Deprecated public boolean setArtworkConfiguration(int, int) throws java.lang.IllegalArgumentException;
+ method @Deprecated public boolean setSynchronizationMode(int) throws java.lang.IllegalArgumentException;
+ field @Deprecated public static final int POSITION_SYNCHRONIZATION_CHECK = 1; // 0x1
+ field @Deprecated public static final int POSITION_SYNCHRONIZATION_NONE = 0; // 0x0
+ }
+
+ @Deprecated public class RemoteController.MetadataEditor extends android.media.MediaMetadataEditor {
+ method @Deprecated public void apply();
+ }
+
+ @Deprecated public static interface RemoteController.OnClientUpdateListener {
+ method @Deprecated public void onClientChange(boolean);
+ method @Deprecated public void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor);
+ method @Deprecated public void onClientPlaybackStateUpdate(int);
+ method @Deprecated public void onClientPlaybackStateUpdate(int, long, long, float);
+ method @Deprecated public void onClientTransportControlUpdate(int);
}
public final class ResourceBusyException extends android.media.MediaDrmException {
- ctor public ResourceBusyException(java.lang.String);
+ ctor public ResourceBusyException(String);
}
public class Ringtone {
method protected void finalize();
method public android.media.AudioAttributes getAudioAttributes();
- method public deprecated int getStreamType();
- method public java.lang.String getTitle(android.content.Context);
+ method @Deprecated public int getStreamType();
+ method public String getTitle(android.content.Context);
method public float getVolume();
method public boolean isLooping();
method public boolean isPlaying();
method public void play();
method public void setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method public void setLooping(boolean);
- method public deprecated void setStreamType(int);
+ method @Deprecated public void setStreamType(int);
method public void setVolume(float);
method public void stop();
}
@@ -26032,7 +26154,7 @@ package android.media {
method public android.database.Cursor getCursor();
method public static int getDefaultType(android.net.Uri);
method public static android.net.Uri getDefaultUri(int);
- method public deprecated boolean getIncludeDrm();
+ method @Deprecated public boolean getIncludeDrm();
method public android.media.Ringtone getRingtone(int);
method public static android.media.Ringtone getRingtone(android.content.Context, android.net.Uri);
method public int getRingtonePosition(android.net.Uri);
@@ -26041,21 +26163,21 @@ package android.media {
method public static android.net.Uri getValidRingtoneUri(android.content.Context);
method public int inferStreamType();
method public static boolean isDefault(android.net.Uri);
- method public static android.content.res.AssetFileDescriptor openDefaultRingtoneUri(android.content.Context, android.net.Uri) throws java.io.FileNotFoundException;
+ method @Nullable public static android.content.res.AssetFileDescriptor openDefaultRingtoneUri(@NonNull android.content.Context, @NonNull android.net.Uri) throws java.io.FileNotFoundException;
method public static void setActualDefaultRingtoneUri(android.content.Context, int, android.net.Uri);
- method public deprecated void setIncludeDrm(boolean);
+ method @Deprecated public void setIncludeDrm(boolean);
method public void setStopPreviousRingtone(boolean);
method public void setType(int);
method public void stopPreviousRingtone();
- field public static final java.lang.String ACTION_RINGTONE_PICKER = "android.intent.action.RINGTONE_PICKER";
- field public static final java.lang.String EXTRA_RINGTONE_DEFAULT_URI = "android.intent.extra.ringtone.DEFAULT_URI";
- field public static final java.lang.String EXTRA_RINGTONE_EXISTING_URI = "android.intent.extra.ringtone.EXISTING_URI";
- field public static final deprecated java.lang.String EXTRA_RINGTONE_INCLUDE_DRM = "android.intent.extra.ringtone.INCLUDE_DRM";
- field public static final java.lang.String EXTRA_RINGTONE_PICKED_URI = "android.intent.extra.ringtone.PICKED_URI";
- field public static final java.lang.String EXTRA_RINGTONE_SHOW_DEFAULT = "android.intent.extra.ringtone.SHOW_DEFAULT";
- field public static final java.lang.String EXTRA_RINGTONE_SHOW_SILENT = "android.intent.extra.ringtone.SHOW_SILENT";
- field public static final java.lang.String EXTRA_RINGTONE_TITLE = "android.intent.extra.ringtone.TITLE";
- field public static final java.lang.String EXTRA_RINGTONE_TYPE = "android.intent.extra.ringtone.TYPE";
+ field public static final String ACTION_RINGTONE_PICKER = "android.intent.action.RINGTONE_PICKER";
+ field public static final String EXTRA_RINGTONE_DEFAULT_URI = "android.intent.extra.ringtone.DEFAULT_URI";
+ field public static final String EXTRA_RINGTONE_EXISTING_URI = "android.intent.extra.ringtone.EXISTING_URI";
+ field @Deprecated public static final String EXTRA_RINGTONE_INCLUDE_DRM = "android.intent.extra.ringtone.INCLUDE_DRM";
+ field public static final String EXTRA_RINGTONE_PICKED_URI = "android.intent.extra.ringtone.PICKED_URI";
+ field public static final String EXTRA_RINGTONE_SHOW_DEFAULT = "android.intent.extra.ringtone.SHOW_DEFAULT";
+ field public static final String EXTRA_RINGTONE_SHOW_SILENT = "android.intent.extra.ringtone.SHOW_SILENT";
+ field public static final String EXTRA_RINGTONE_TITLE = "android.intent.extra.ringtone.TITLE";
+ field public static final String EXTRA_RINGTONE_TYPE = "android.intent.extra.ringtone.TYPE";
field public static final int ID_COLUMN_INDEX = 0; // 0x0
field public static final int TITLE_COLUMN_INDEX = 1; // 0x1
field public static final int TYPE_ALARM = 4; // 0x4
@@ -26065,12 +26187,66 @@ package android.media {
field public static final int URI_COLUMN_INDEX = 2; // 0x2
}
+ public final class Session2Command implements android.os.Parcelable {
+ ctor public Session2Command(int);
+ ctor public Session2Command(@NonNull String, @Nullable android.os.Bundle);
+ method public int describeContents();
+ method public int getCommandCode();
+ method @Nullable public String getCustomCommand();
+ method @Nullable public android.os.Bundle getExtras();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0
+ field public static final android.os.Parcelable.Creator<android.media.Session2Command> CREATOR;
+ field public static final int RESULT_ERROR_UNKNOWN_ERROR = -1; // 0xffffffff
+ field public static final int RESULT_INFO_SKIPPED = 1; // 0x1
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ }
+
+ public static final class Session2Command.Result {
+ ctor public Session2Command.Result(int, @Nullable android.os.Bundle);
+ method public int getResultCode();
+ method @Nullable public android.os.Bundle getResultData();
+ }
+
+ public final class Session2CommandGroup implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.Set<android.media.Session2Command> getCommands();
+ method public boolean hasCommand(@NonNull android.media.Session2Command);
+ method public boolean hasCommand(int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.Session2CommandGroup> CREATOR;
+ }
+
+ public static final class Session2CommandGroup.Builder {
+ ctor public Session2CommandGroup.Builder();
+ ctor public Session2CommandGroup.Builder(@NonNull android.media.Session2CommandGroup);
+ method @NonNull public android.media.Session2CommandGroup.Builder addCommand(@NonNull android.media.Session2Command);
+ method @NonNull public android.media.Session2CommandGroup.Builder addCommand(int);
+ method @NonNull public android.media.Session2CommandGroup build();
+ method @NonNull public android.media.Session2CommandGroup.Builder removeCommand(@NonNull android.media.Session2Command);
+ method @NonNull public android.media.Session2CommandGroup.Builder removeCommand(int);
+ }
+
+ public final class Session2Token implements android.os.Parcelable {
+ ctor public Session2Token(@NonNull android.content.Context, @NonNull android.content.ComponentName);
+ method public int describeContents();
+ method @NonNull public String getPackageName();
+ method @Nullable public String getServiceName();
+ method public int getType();
+ method public int getUid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.Session2Token> CREATOR;
+ field public static final int TYPE_SESSION = 0; // 0x0
+ field public static final int TYPE_SESSION_SERVICE = 1; // 0x1
+ }
+
public class SoundPool {
- ctor public deprecated SoundPool(int, int, int);
+ ctor @Deprecated public SoundPool(int, int, int);
method public final void autoPause();
method public final void autoResume();
+ method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method protected void finalize();
- method public int load(java.lang.String, int);
+ method public int load(String, int);
method public int load(android.content.Context, int, int);
method public int load(android.content.res.AssetFileDescriptor, int);
method public int load(java.io.FileDescriptor, long, long, int);
@@ -26094,12 +26270,12 @@ package android.media {
method public android.media.SoundPool.Builder setMaxStreams(int) throws java.lang.IllegalArgumentException;
}
- public static abstract interface SoundPool.OnLoadCompleteListener {
- method public abstract void onLoadComplete(android.media.SoundPool, int, int);
+ public static interface SoundPool.OnLoadCompleteListener {
+ method public void onLoadComplete(android.media.SoundPool, int, int);
}
public final class SubtitleData {
- method public byte[] getData();
+ method @NonNull public byte[] getData();
method public long getDurationUs();
method public long getStartTimeUs();
method public int getTrackIndex();
@@ -26127,12 +26303,12 @@ package android.media {
public class ThumbnailUtils {
ctor public ThumbnailUtils();
- method public static deprecated android.graphics.Bitmap createAudioThumbnail(java.lang.String, int);
- method public static android.graphics.Bitmap createAudioThumbnail(java.io.File, android.util.Size, android.os.CancellationSignal) throws java.io.IOException;
- method public static deprecated android.graphics.Bitmap createImageThumbnail(java.lang.String, int);
- method public static android.graphics.Bitmap createImageThumbnail(java.io.File, android.util.Size, android.os.CancellationSignal) throws java.io.IOException;
- method public static deprecated android.graphics.Bitmap createVideoThumbnail(java.lang.String, int);
- method public static android.graphics.Bitmap createVideoThumbnail(java.io.File, android.util.Size, android.os.CancellationSignal) throws java.io.IOException;
+ method @Deprecated @Nullable public static android.graphics.Bitmap createAudioThumbnail(@NonNull String, int);
+ method @NonNull public static android.graphics.Bitmap createAudioThumbnail(@NonNull java.io.File, @NonNull android.util.Size, @Nullable android.os.CancellationSignal) throws java.io.IOException;
+ method @Deprecated @Nullable public static android.graphics.Bitmap createImageThumbnail(@NonNull String, int);
+ method @NonNull public static android.graphics.Bitmap createImageThumbnail(@NonNull java.io.File, @NonNull android.util.Size, @Nullable android.os.CancellationSignal) throws java.io.IOException;
+ method @Deprecated @Nullable public static android.graphics.Bitmap createVideoThumbnail(@NonNull String, int);
+ method @NonNull public static android.graphics.Bitmap createVideoThumbnail(@NonNull java.io.File, @NonNull android.util.Size, @Nullable android.os.CancellationSignal) throws java.io.IOException;
method public static android.graphics.Bitmap extractThumbnail(android.graphics.Bitmap, int, int);
method public static android.graphics.Bitmap extractThumbnail(android.graphics.Bitmap, int, int, int);
field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2
@@ -26145,7 +26321,7 @@ package android.media {
public final class TimedText {
method public android.graphics.Rect getBounds();
- method public java.lang.String getText();
+ method public String getText();
}
public class ToneGenerator {
@@ -26260,22 +26436,22 @@ package android.media {
}
public final class UnsupportedSchemeException extends android.media.MediaDrmException {
- ctor public UnsupportedSchemeException(java.lang.String);
+ ctor public UnsupportedSchemeException(String);
}
public class UriDataSourceDesc extends android.media.DataSourceDesc {
method public android.content.Context getContext();
method public java.util.List<java.net.HttpCookie> getCookies();
- method public java.util.Map<java.lang.String, java.lang.String> getHeaders();
+ method public java.util.Map<java.lang.String,java.lang.String> getHeaders();
method public android.net.Uri getUri();
}
- public static class UriDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase {
+ public static class UriDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.UriDataSourceDesc.Builder> {
ctor public UriDataSourceDesc.Builder();
ctor public UriDataSourceDesc.Builder(android.media.UriDataSourceDesc);
- method public android.media.UriDataSourceDesc build();
- method public android.media.UriDataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri);
- method public android.media.UriDataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>);
+ method @NonNull public android.media.UriDataSourceDesc build();
+ method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri);
+ method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>);
}
public final class VideoSize {
@@ -26283,8 +26459,8 @@ package android.media {
method public int getWidth();
}
- public abstract interface VolumeAutomation {
- method public abstract android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ public interface VolumeAutomation {
+ method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
}
public abstract class VolumeProvider {
@@ -26301,11 +26477,11 @@ package android.media {
}
public final class VolumeShaper implements java.lang.AutoCloseable {
- method public void apply(android.media.VolumeShaper.Operation);
+ method public void apply(@NonNull android.media.VolumeShaper.Operation);
method public void close();
method protected void finalize();
method public float getVolume();
- method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
+ method public void replace(@NonNull android.media.VolumeShaper.Configuration, @NonNull android.media.VolumeShaper.Operation, boolean);
}
public static final class VolumeShaper.Configuration implements android.os.Parcelable {
@@ -26329,15 +26505,15 @@ package android.media {
public static final class VolumeShaper.Configuration.Builder {
ctor public VolumeShaper.Configuration.Builder();
- ctor public VolumeShaper.Configuration.Builder(android.media.VolumeShaper.Configuration);
- method public android.media.VolumeShaper.Configuration build();
- method public android.media.VolumeShaper.Configuration.Builder invertVolumes();
- method public android.media.VolumeShaper.Configuration.Builder reflectTimes();
- method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
- method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
- method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
- method public android.media.VolumeShaper.Configuration.Builder setDuration(long);
- method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
+ ctor public VolumeShaper.Configuration.Builder(@NonNull android.media.VolumeShaper.Configuration);
+ method @NonNull public android.media.VolumeShaper.Configuration build();
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder invertVolumes();
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder reflectTimes();
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder setCurve(@NonNull float[], @NonNull float[]);
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder setDuration(long);
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
}
public static final class VolumeShaper.Operation implements android.os.Parcelable {
@@ -26368,16 +26544,16 @@ package android.media.audiofx {
method public void setControlStatusListener(android.media.audiofx.AudioEffect.OnControlStatusChangeListener);
method public void setEnableStatusListener(android.media.audiofx.AudioEffect.OnEnableStatusChangeListener);
method public int setEnabled(boolean) throws java.lang.IllegalStateException;
- field public static final java.lang.String ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION = "android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION";
- field public static final java.lang.String ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL = "android.media.action.DISPLAY_AUDIO_EFFECT_CONTROL_PANEL";
- field public static final java.lang.String ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION = "android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION";
+ field public static final String ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION = "android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION";
+ field public static final String ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL = "android.media.action.DISPLAY_AUDIO_EFFECT_CONTROL_PANEL";
+ field public static final String ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION = "android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION";
field public static final int ALREADY_EXISTS = -2; // 0xfffffffe
field public static final int CONTENT_TYPE_GAME = 2; // 0x2
field public static final int CONTENT_TYPE_MOVIE = 1; // 0x1
field public static final int CONTENT_TYPE_MUSIC = 0; // 0x0
field public static final int CONTENT_TYPE_VOICE = 3; // 0x3
- field public static final java.lang.String EFFECT_AUXILIARY = "Auxiliary";
- field public static final java.lang.String EFFECT_INSERT = "Insert";
+ field public static final String EFFECT_AUXILIARY = "Auxiliary";
+ field public static final String EFFECT_INSERT = "Insert";
field public static final java.util.UUID EFFECT_TYPE_AEC;
field public static final java.util.UUID EFFECT_TYPE_AGC;
field public static final java.util.UUID EFFECT_TYPE_BASS_BOOST;
@@ -26394,31 +26570,31 @@ package android.media.audiofx {
field public static final int ERROR_INVALID_OPERATION = -5; // 0xfffffffb
field public static final int ERROR_NO_INIT = -3; // 0xfffffffd
field public static final int ERROR_NO_MEMORY = -6; // 0xfffffffa
- field public static final java.lang.String EXTRA_AUDIO_SESSION = "android.media.extra.AUDIO_SESSION";
- field public static final java.lang.String EXTRA_CONTENT_TYPE = "android.media.extra.CONTENT_TYPE";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.extra.PACKAGE_NAME";
+ field public static final String EXTRA_AUDIO_SESSION = "android.media.extra.AUDIO_SESSION";
+ field public static final String EXTRA_CONTENT_TYPE = "android.media.extra.CONTENT_TYPE";
+ field public static final String EXTRA_PACKAGE_NAME = "android.media.extra.PACKAGE_NAME";
field public static final int SUCCESS = 0; // 0x0
}
public static final class AudioEffect.Descriptor implements android.os.Parcelable {
ctor public AudioEffect.Descriptor();
- ctor public AudioEffect.Descriptor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ ctor public AudioEffect.Descriptor(String, String, String, String, String);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.audiofx.AudioEffect.Descriptor> CREATOR;
- field public java.lang.String connectMode;
- field public java.lang.String implementor;
- field public java.lang.String name;
+ field public String connectMode;
+ field public String implementor;
+ field public String name;
field public java.util.UUID type;
field public java.util.UUID uuid;
}
- public static abstract interface AudioEffect.OnControlStatusChangeListener {
- method public abstract void onControlStatusChange(android.media.audiofx.AudioEffect, boolean);
+ public static interface AudioEffect.OnControlStatusChangeListener {
+ method public void onControlStatusChange(android.media.audiofx.AudioEffect, boolean);
}
- public static abstract interface AudioEffect.OnEnableStatusChangeListener {
- method public abstract void onEnableStatusChange(android.media.audiofx.AudioEffect, boolean);
+ public static interface AudioEffect.OnEnableStatusChangeListener {
+ method public void onEnableStatusChange(android.media.audiofx.AudioEffect, boolean);
}
public class AutomaticGainControl extends android.media.audiofx.AudioEffect {
@@ -26438,19 +26614,19 @@ package android.media.audiofx {
field public static final int PARAM_STRENGTH_SUPPORTED = 0; // 0x0
}
- public static abstract interface BassBoost.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.BassBoost, int, int, short);
+ public static interface BassBoost.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.BassBoost, int, int, short);
}
public static class BassBoost.Settings {
ctor public BassBoost.Settings();
- ctor public BassBoost.Settings(java.lang.String);
+ ctor public BassBoost.Settings(String);
field public short strength;
}
public final class DynamicsProcessing extends android.media.audiofx.AudioEffect {
ctor public DynamicsProcessing(int);
- ctor public DynamicsProcessing(int, int, android.media.audiofx.DynamicsProcessing.Config);
+ ctor public DynamicsProcessing(int, int, @Nullable android.media.audiofx.DynamicsProcessing.Config);
method public android.media.audiofx.DynamicsProcessing.Channel getChannelByChannelIndex(int);
method public int getChannelCount();
method public android.media.audiofx.DynamicsProcessing.Config getConfig();
@@ -26680,13 +26856,13 @@ package android.media.audiofx {
field public static final int PARAM_ROOM_LEVEL = 0; // 0x0
}
- public static abstract interface EnvironmentalReverb.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.EnvironmentalReverb, int, int, int);
+ public static interface EnvironmentalReverb.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.EnvironmentalReverb, int, int, int);
}
public static class EnvironmentalReverb.Settings {
ctor public EnvironmentalReverb.Settings();
- ctor public EnvironmentalReverb.Settings(java.lang.String);
+ ctor public EnvironmentalReverb.Settings(String);
field public short decayHFRatio;
field public int decayTime;
field public short density;
@@ -26709,7 +26885,7 @@ package android.media.audiofx {
method public short getCurrentPreset() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
method public short getNumberOfBands() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
method public short getNumberOfPresets() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
- method public java.lang.String getPresetName(short);
+ method public String getPresetName(short);
method public android.media.audiofx.Equalizer.Settings getProperties() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
method public void setBandLevel(short, short) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
method public void setParameterListener(android.media.audiofx.Equalizer.OnParameterChangeListener);
@@ -26727,13 +26903,13 @@ package android.media.audiofx {
field public static final int PARAM_STRING_SIZE_MAX = 32; // 0x20
}
- public static abstract interface Equalizer.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.Equalizer, int, int, int, int);
+ public static interface Equalizer.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.Equalizer, int, int, int, int);
}
public static class Equalizer.Settings {
ctor public Equalizer.Settings();
- ctor public Equalizer.Settings(java.lang.String);
+ ctor public Equalizer.Settings(String);
field public short[] bandLevels;
field public short curPreset;
field public short numBands;
@@ -26768,13 +26944,13 @@ package android.media.audiofx {
field public static final short PRESET_SMALLROOM = 1; // 0x1
}
- public static abstract interface PresetReverb.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.PresetReverb, int, int, short);
+ public static interface PresetReverb.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.PresetReverb, int, int, short);
}
public static class PresetReverb.Settings {
ctor public PresetReverb.Settings();
- ctor public PresetReverb.Settings(java.lang.String);
+ ctor public PresetReverb.Settings(String);
field public short preset;
}
@@ -26798,13 +26974,13 @@ package android.media.audiofx {
field public static final int VIRTUALIZATION_MODE_TRANSAURAL = 3; // 0x3
}
- public static abstract interface Virtualizer.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.Virtualizer, int, int, short);
+ public static interface Virtualizer.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.Virtualizer, int, int, short);
}
public static class Virtualizer.Settings {
ctor public Virtualizer.Settings();
- ctor public Virtualizer.Settings(java.lang.String);
+ ctor public Virtualizer.Settings(String);
field public short strength;
}
@@ -26850,9 +27026,9 @@ package android.media.audiofx {
field public int mRms;
}
- public static abstract interface Visualizer.OnDataCaptureListener {
- method public abstract void onFftDataCapture(android.media.audiofx.Visualizer, byte[], int);
- method public abstract void onWaveFormDataCapture(android.media.audiofx.Visualizer, byte[], int);
+ public static interface Visualizer.OnDataCaptureListener {
+ method public void onFftDataCapture(android.media.audiofx.Visualizer, byte[], int);
+ method public void onWaveFormDataCapture(android.media.audiofx.Visualizer, byte[], int);
}
}
@@ -26863,18 +27039,18 @@ package android.media.browse {
ctor public MediaBrowser(android.content.Context, android.content.ComponentName, android.media.browse.MediaBrowser.ConnectionCallback, android.os.Bundle);
method public void connect();
method public void disconnect();
- method public android.os.Bundle getExtras();
- method public void getItem(java.lang.String, android.media.browse.MediaBrowser.ItemCallback);
- method public java.lang.String getRoot();
- method public android.content.ComponentName getServiceComponent();
- method public android.media.session.MediaSession.Token getSessionToken();
+ method @Nullable public android.os.Bundle getExtras();
+ method public void getItem(@NonNull String, @NonNull android.media.browse.MediaBrowser.ItemCallback);
+ method @NonNull public String getRoot();
+ method @NonNull public android.content.ComponentName getServiceComponent();
+ method @NonNull public android.media.session.MediaSession.Token getSessionToken();
method public boolean isConnected();
- method public void subscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback);
- method public void subscribe(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SubscriptionCallback);
- method public void unsubscribe(java.lang.String);
- method public void unsubscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback);
- field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
- field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+ method public void subscribe(@NonNull String, @NonNull android.media.browse.MediaBrowser.SubscriptionCallback);
+ method public void subscribe(@NonNull String, @NonNull android.os.Bundle, @NonNull android.media.browse.MediaBrowser.SubscriptionCallback);
+ method public void unsubscribe(@NonNull String);
+ method public void unsubscribe(@NonNull String, @NonNull android.media.browse.MediaBrowser.SubscriptionCallback);
+ field public static final String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+ field public static final String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
}
public static class MediaBrowser.ConnectionCallback {
@@ -26884,18 +27060,18 @@ package android.media.browse {
method public void onConnectionSuspended();
}
- public static abstract class MediaBrowser.ItemCallback {
+ public abstract static class MediaBrowser.ItemCallback {
ctor public MediaBrowser.ItemCallback();
- method public void onError(java.lang.String);
+ method public void onError(@NonNull String);
method public void onItemLoaded(android.media.browse.MediaBrowser.MediaItem);
}
public static class MediaBrowser.MediaItem implements android.os.Parcelable {
- ctor public MediaBrowser.MediaItem(android.media.MediaDescription, int);
+ ctor public MediaBrowser.MediaItem(@NonNull android.media.MediaDescription, int);
method public int describeContents();
- method public android.media.MediaDescription getDescription();
+ method @NonNull public android.media.MediaDescription getDescription();
method public int getFlags();
- method public java.lang.String getMediaId();
+ method @Nullable public String getMediaId();
method public boolean isBrowsable();
method public boolean isPlayable();
method public void writeToParcel(android.os.Parcel, int);
@@ -26904,12 +27080,12 @@ package android.media.browse {
field public static final int FLAG_PLAYABLE = 2; // 0x2
}
- public static abstract class MediaBrowser.SubscriptionCallback {
+ public abstract static class MediaBrowser.SubscriptionCallback {
ctor public MediaBrowser.SubscriptionCallback();
- method public void onChildrenLoaded(java.lang.String, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
- method public void onChildrenLoaded(java.lang.String, java.util.List<android.media.browse.MediaBrowser.MediaItem>, android.os.Bundle);
- method public void onError(java.lang.String);
- method public void onError(java.lang.String, android.os.Bundle);
+ method public void onChildrenLoaded(@NonNull String, @NonNull java.util.List<android.media.browse.MediaBrowser.MediaItem>);
+ method public void onChildrenLoaded(@NonNull String, @NonNull java.util.List<android.media.browse.MediaBrowser.MediaItem>, @NonNull android.os.Bundle);
+ method public void onError(@NonNull String);
+ method public void onError(@NonNull String, @NonNull android.os.Bundle);
}
}
@@ -26919,9 +27095,9 @@ package android.media.effect {
public abstract class Effect {
ctor public Effect();
method public abstract void apply(int, int, int, int);
- method public abstract java.lang.String getName();
+ method public abstract String getName();
method public abstract void release();
- method public abstract void setParameter(java.lang.String, java.lang.Object);
+ method public abstract void setParameter(String, Object);
method public void setUpdateListener(android.media.effect.EffectUpdateListener);
}
@@ -26932,39 +27108,39 @@ package android.media.effect {
}
public class EffectFactory {
- method public android.media.effect.Effect createEffect(java.lang.String);
- method public static boolean isEffectSupported(java.lang.String);
- field public static final java.lang.String EFFECT_AUTOFIX = "android.media.effect.effects.AutoFixEffect";
- field public static final java.lang.String EFFECT_BACKDROPPER = "android.media.effect.effects.BackDropperEffect";
- field public static final java.lang.String EFFECT_BITMAPOVERLAY = "android.media.effect.effects.BitmapOverlayEffect";
- field public static final java.lang.String EFFECT_BLACKWHITE = "android.media.effect.effects.BlackWhiteEffect";
- field public static final java.lang.String EFFECT_BRIGHTNESS = "android.media.effect.effects.BrightnessEffect";
- field public static final java.lang.String EFFECT_CONTRAST = "android.media.effect.effects.ContrastEffect";
- field public static final java.lang.String EFFECT_CROP = "android.media.effect.effects.CropEffect";
- field public static final java.lang.String EFFECT_CROSSPROCESS = "android.media.effect.effects.CrossProcessEffect";
- field public static final java.lang.String EFFECT_DOCUMENTARY = "android.media.effect.effects.DocumentaryEffect";
- field public static final java.lang.String EFFECT_DUOTONE = "android.media.effect.effects.DuotoneEffect";
- field public static final java.lang.String EFFECT_FILLLIGHT = "android.media.effect.effects.FillLightEffect";
- field public static final java.lang.String EFFECT_FISHEYE = "android.media.effect.effects.FisheyeEffect";
- field public static final java.lang.String EFFECT_FLIP = "android.media.effect.effects.FlipEffect";
- field public static final java.lang.String EFFECT_GRAIN = "android.media.effect.effects.GrainEffect";
- field public static final java.lang.String EFFECT_GRAYSCALE = "android.media.effect.effects.GrayscaleEffect";
- field public static final java.lang.String EFFECT_LOMOISH = "android.media.effect.effects.LomoishEffect";
- field public static final java.lang.String EFFECT_NEGATIVE = "android.media.effect.effects.NegativeEffect";
- field public static final java.lang.String EFFECT_POSTERIZE = "android.media.effect.effects.PosterizeEffect";
- field public static final java.lang.String EFFECT_REDEYE = "android.media.effect.effects.RedEyeEffect";
- field public static final java.lang.String EFFECT_ROTATE = "android.media.effect.effects.RotateEffect";
- field public static final java.lang.String EFFECT_SATURATE = "android.media.effect.effects.SaturateEffect";
- field public static final java.lang.String EFFECT_SEPIA = "android.media.effect.effects.SepiaEffect";
- field public static final java.lang.String EFFECT_SHARPEN = "android.media.effect.effects.SharpenEffect";
- field public static final java.lang.String EFFECT_STRAIGHTEN = "android.media.effect.effects.StraightenEffect";
- field public static final java.lang.String EFFECT_TEMPERATURE = "android.media.effect.effects.ColorTemperatureEffect";
- field public static final java.lang.String EFFECT_TINT = "android.media.effect.effects.TintEffect";
- field public static final java.lang.String EFFECT_VIGNETTE = "android.media.effect.effects.VignetteEffect";
- }
-
- public abstract interface EffectUpdateListener {
- method public abstract void onEffectUpdated(android.media.effect.Effect, java.lang.Object);
+ method public android.media.effect.Effect createEffect(String);
+ method public static boolean isEffectSupported(String);
+ field public static final String EFFECT_AUTOFIX = "android.media.effect.effects.AutoFixEffect";
+ field public static final String EFFECT_BACKDROPPER = "android.media.effect.effects.BackDropperEffect";
+ field public static final String EFFECT_BITMAPOVERLAY = "android.media.effect.effects.BitmapOverlayEffect";
+ field public static final String EFFECT_BLACKWHITE = "android.media.effect.effects.BlackWhiteEffect";
+ field public static final String EFFECT_BRIGHTNESS = "android.media.effect.effects.BrightnessEffect";
+ field public static final String EFFECT_CONTRAST = "android.media.effect.effects.ContrastEffect";
+ field public static final String EFFECT_CROP = "android.media.effect.effects.CropEffect";
+ field public static final String EFFECT_CROSSPROCESS = "android.media.effect.effects.CrossProcessEffect";
+ field public static final String EFFECT_DOCUMENTARY = "android.media.effect.effects.DocumentaryEffect";
+ field public static final String EFFECT_DUOTONE = "android.media.effect.effects.DuotoneEffect";
+ field public static final String EFFECT_FILLLIGHT = "android.media.effect.effects.FillLightEffect";
+ field public static final String EFFECT_FISHEYE = "android.media.effect.effects.FisheyeEffect";
+ field public static final String EFFECT_FLIP = "android.media.effect.effects.FlipEffect";
+ field public static final String EFFECT_GRAIN = "android.media.effect.effects.GrainEffect";
+ field public static final String EFFECT_GRAYSCALE = "android.media.effect.effects.GrayscaleEffect";
+ field public static final String EFFECT_LOMOISH = "android.media.effect.effects.LomoishEffect";
+ field public static final String EFFECT_NEGATIVE = "android.media.effect.effects.NegativeEffect";
+ field public static final String EFFECT_POSTERIZE = "android.media.effect.effects.PosterizeEffect";
+ field public static final String EFFECT_REDEYE = "android.media.effect.effects.RedEyeEffect";
+ field public static final String EFFECT_ROTATE = "android.media.effect.effects.RotateEffect";
+ field public static final String EFFECT_SATURATE = "android.media.effect.effects.SaturateEffect";
+ field public static final String EFFECT_SEPIA = "android.media.effect.effects.SepiaEffect";
+ field public static final String EFFECT_SHARPEN = "android.media.effect.effects.SharpenEffect";
+ field public static final String EFFECT_STRAIGHTEN = "android.media.effect.effects.StraightenEffect";
+ field public static final String EFFECT_TEMPERATURE = "android.media.effect.effects.ColorTemperatureEffect";
+ field public static final String EFFECT_TINT = "android.media.effect.effects.TintEffect";
+ field public static final String EFFECT_VIGNETTE = "android.media.effect.effects.VignetteEffect";
+ }
+
+ public interface EffectUpdateListener {
+ method public void onEffectUpdated(android.media.effect.Effect, Object);
}
}
@@ -26994,20 +27170,20 @@ package android.media.midi {
method public boolean isPrivate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.midi.MidiDeviceInfo> CREATOR;
- field public static final java.lang.String PROPERTY_BLUETOOTH_DEVICE = "bluetooth_device";
- field public static final java.lang.String PROPERTY_MANUFACTURER = "manufacturer";
- field public static final java.lang.String PROPERTY_NAME = "name";
- field public static final java.lang.String PROPERTY_PRODUCT = "product";
- field public static final java.lang.String PROPERTY_SERIAL_NUMBER = "serial_number";
- field public static final java.lang.String PROPERTY_USB_DEVICE = "usb_device";
- field public static final java.lang.String PROPERTY_VERSION = "version";
+ field public static final String PROPERTY_BLUETOOTH_DEVICE = "bluetooth_device";
+ field public static final String PROPERTY_MANUFACTURER = "manufacturer";
+ field public static final String PROPERTY_NAME = "name";
+ field public static final String PROPERTY_PRODUCT = "product";
+ field public static final String PROPERTY_SERIAL_NUMBER = "serial_number";
+ field public static final String PROPERTY_USB_DEVICE = "usb_device";
+ field public static final String PROPERTY_VERSION = "version";
field public static final int TYPE_BLUETOOTH = 3; // 0x3
field public static final int TYPE_USB = 1; // 0x1
field public static final int TYPE_VIRTUAL = 2; // 0x2
}
public static final class MidiDeviceInfo.PortInfo {
- method public java.lang.String getName();
+ method public String getName();
method public int getPortNumber();
method public int getType();
field public static final int TYPE_INPUT = 1; // 0x1
@@ -27022,7 +27198,7 @@ package android.media.midi {
method public void onClose();
method public void onDeviceStatusChanged(android.media.midi.MidiDeviceStatus);
method public abstract android.media.midi.MidiReceiver[] onGetInputPortReceivers();
- field public static final java.lang.String SERVICE_INTERFACE = "android.media.midi.MidiDeviceService";
+ field public static final String SERVICE_INTERFACE = "android.media.midi.MidiDeviceService";
}
public final class MidiDeviceStatus implements android.os.Parcelable {
@@ -27055,8 +27231,8 @@ package android.media.midi {
method public void onDeviceStatusChanged(android.media.midi.MidiDeviceStatus);
}
- public static abstract interface MidiManager.OnDeviceOpenedListener {
- method public abstract void onDeviceOpened(android.media.midi.MidiDevice);
+ public static interface MidiManager.OnDeviceOpenedListener {
+ method public void onDeviceOpened(android.media.midi.MidiDevice);
}
public final class MidiOutputPort extends android.media.midi.MidiSender implements java.io.Closeable {
@@ -27090,67 +27266,85 @@ package android.media.midi {
package android.media.projection {
public final class MediaProjection {
- method public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler);
+ method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, int, @Nullable android.view.Surface, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler);
method public void registerCallback(android.media.projection.MediaProjection.Callback, android.os.Handler);
method public void stop();
method public void unregisterCallback(android.media.projection.MediaProjection.Callback);
}
- public static abstract class MediaProjection.Callback {
+ public abstract static class MediaProjection.Callback {
ctor public MediaProjection.Callback();
method public void onStop();
}
public final class MediaProjectionManager {
method public android.content.Intent createScreenCaptureIntent();
- method public android.media.projection.MediaProjection getMediaProjection(int, android.content.Intent);
+ method public android.media.projection.MediaProjection getMediaProjection(int, @NonNull android.content.Intent);
}
}
package android.media.session {
+ public final class ControllerCallbackLink implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.os.IBinder getBinder();
+ method public void notifyEvent(@NonNull String, @Nullable android.os.Bundle);
+ method public void notifyExtrasChanged(@Nullable android.os.Bundle);
+ method public void notifyMetadataChanged(@Nullable android.media.MediaMetadata);
+ method public void notifyPlaybackStateChanged(@Nullable android.media.session.PlaybackState);
+ method public void notifyQueueChanged(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
+ method public void notifyQueueTitleChanged(@Nullable CharSequence);
+ method public void notifySessionDestroyed();
+ method public void notifyVolumeInfoChanged(@NonNull android.media.session.MediaController.PlaybackInfo);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.session.ControllerCallbackLink> CREATOR;
+ }
+
public final class MediaController {
- ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
+ ctor public MediaController(@NonNull android.content.Context, @NonNull android.media.session.MediaSession.Token);
method public void adjustVolume(int, int);
- method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
- method public android.os.Bundle getExtras();
+ method public boolean dispatchMediaButtonEvent(@NonNull android.view.KeyEvent);
+ method @Nullable public android.os.Bundle getExtras();
method public long getFlags();
- method public android.media.MediaMetadata getMetadata();
- method public java.lang.String getPackageName();
- method public android.media.session.MediaController.PlaybackInfo getPlaybackInfo();
- method public android.media.session.PlaybackState getPlaybackState();
- method public java.util.List<android.media.session.MediaSession.QueueItem> getQueue();
- method public java.lang.CharSequence getQueueTitle();
+ method @Nullable public android.media.MediaMetadata getMetadata();
+ method public String getPackageName();
+ method @Nullable public android.media.session.MediaController.PlaybackInfo getPlaybackInfo();
+ method @Nullable public android.media.session.PlaybackState getPlaybackState();
+ method @Nullable public java.util.List<android.media.session.MediaSession.QueueItem> getQueue();
+ method @Nullable public CharSequence getQueueTitle();
method public int getRatingType();
- method public android.app.PendingIntent getSessionActivity();
- method public android.media.session.MediaSession.Token getSessionToken();
- method public android.media.session.MediaController.TransportControls getTransportControls();
- method public void registerCallback(android.media.session.MediaController.Callback);
- method public void registerCallback(android.media.session.MediaController.Callback, android.os.Handler);
- method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+ method @Nullable public android.app.PendingIntent getSessionActivity();
+ method @NonNull public android.media.session.MediaSession.Token getSessionToken();
+ method @NonNull public android.media.session.MediaController.TransportControls getTransportControls();
+ method public void registerCallback(@NonNull android.media.session.MediaController.Callback);
+ method public void registerCallback(@NonNull android.media.session.MediaController.Callback, @Nullable android.os.Handler);
+ method public void sendCommand(@NonNull String, @Nullable android.os.Bundle, @Nullable android.os.ResultReceiver);
method public void setVolumeTo(int, int);
- method public void unregisterCallback(android.media.session.MediaController.Callback);
+ method public void unregisterCallback(@NonNull android.media.session.MediaController.Callback);
}
- public static abstract class MediaController.Callback {
+ public abstract static class MediaController.Callback {
ctor public MediaController.Callback();
method public void onAudioInfoChanged(android.media.session.MediaController.PlaybackInfo);
- method public void onExtrasChanged(android.os.Bundle);
- method public void onMetadataChanged(android.media.MediaMetadata);
- method public void onPlaybackStateChanged(android.media.session.PlaybackState);
- method public void onQueueChanged(java.util.List<android.media.session.MediaSession.QueueItem>);
- method public void onQueueTitleChanged(java.lang.CharSequence);
+ method public void onExtrasChanged(@Nullable android.os.Bundle);
+ method public void onMetadataChanged(@Nullable android.media.MediaMetadata);
+ method public void onPlaybackStateChanged(@Nullable android.media.session.PlaybackState);
+ method public void onQueueChanged(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
+ method public void onQueueTitleChanged(@Nullable CharSequence);
method public void onSessionDestroyed();
- method public void onSessionEvent(java.lang.String, android.os.Bundle);
+ method public void onSessionEvent(@NonNull String, @Nullable android.os.Bundle);
}
- public static final class MediaController.PlaybackInfo {
+ public static final class MediaController.PlaybackInfo implements android.os.Parcelable {
+ method public int describeContents();
method public android.media.AudioAttributes getAudioAttributes();
method public int getCurrentVolume();
method public int getMaxVolume();
method public int getPlaybackType();
method public int getVolumeControl();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.session.MediaController.PlaybackInfo> CREATOR;
field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
}
@@ -27159,17 +27353,17 @@ package android.media.session {
method public void fastForward();
method public void pause();
method public void play();
- method public void playFromMediaId(java.lang.String, android.os.Bundle);
- method public void playFromSearch(java.lang.String, android.os.Bundle);
+ method public void playFromMediaId(String, android.os.Bundle);
+ method public void playFromSearch(String, android.os.Bundle);
method public void playFromUri(android.net.Uri, android.os.Bundle);
method public void prepare();
- method public void prepareFromMediaId(java.lang.String, android.os.Bundle);
- method public void prepareFromSearch(java.lang.String, android.os.Bundle);
+ method public void prepareFromMediaId(String, android.os.Bundle);
+ method public void prepareFromSearch(String, android.os.Bundle);
method public void prepareFromUri(android.net.Uri, android.os.Bundle);
method public void rewind();
method public void seekTo(long);
- method public void sendCustomAction(android.media.session.PlaybackState.CustomAction, android.os.Bundle);
- method public void sendCustomAction(java.lang.String, android.os.Bundle);
+ method public void sendCustomAction(@NonNull android.media.session.PlaybackState.CustomAction, @Nullable android.os.Bundle);
+ method public void sendCustomAction(@NonNull String, @Nullable android.os.Bundle);
method public void setRating(android.media.Rating);
method public void skipToNext();
method public void skipToPrevious();
@@ -27178,49 +27372,49 @@ package android.media.session {
}
public final class MediaSession {
- ctor public MediaSession(android.content.Context, java.lang.String);
- method public android.media.session.MediaController getController();
- method public android.media.session.MediaSessionManager.RemoteUserInfo getCurrentControllerInfo();
- method public android.media.session.MediaSession.Token getSessionToken();
+ ctor public MediaSession(@NonNull android.content.Context, @NonNull String);
+ method @NonNull public android.media.session.MediaController getController();
+ method @NonNull public android.media.session.MediaSessionManager.RemoteUserInfo getCurrentControllerInfo();
+ method @NonNull public android.media.session.MediaSession.Token getSessionToken();
method public boolean isActive();
method public void release();
- method public void sendSessionEvent(java.lang.String, android.os.Bundle);
+ method public void sendSessionEvent(@NonNull String, @Nullable android.os.Bundle);
method public void setActive(boolean);
- method public void setCallback(android.media.session.MediaSession.Callback);
- method public void setCallback(android.media.session.MediaSession.Callback, android.os.Handler);
- method public void setExtras(android.os.Bundle);
+ method public void setCallback(@Nullable android.media.session.MediaSession.Callback);
+ method public void setCallback(@Nullable android.media.session.MediaSession.Callback, @Nullable android.os.Handler);
+ method public void setExtras(@Nullable android.os.Bundle);
method public void setFlags(int);
- method public void setMediaButtonReceiver(android.app.PendingIntent);
- method public void setMetadata(android.media.MediaMetadata);
- method public void setPlaybackState(android.media.session.PlaybackState);
+ method public void setMediaButtonReceiver(@Nullable android.app.PendingIntent);
+ method public void setMetadata(@Nullable android.media.MediaMetadata);
+ method public void setPlaybackState(@Nullable android.media.session.PlaybackState);
method public void setPlaybackToLocal(android.media.AudioAttributes);
- method public void setPlaybackToRemote(android.media.VolumeProvider);
- method public void setQueue(java.util.List<android.media.session.MediaSession.QueueItem>);
- method public void setQueueTitle(java.lang.CharSequence);
+ method public void setPlaybackToRemote(@NonNull android.media.VolumeProvider);
+ method public void setQueue(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
+ method public void setQueueTitle(@Nullable CharSequence);
method public void setRatingType(int);
- method public void setSessionActivity(android.app.PendingIntent);
- field public static final deprecated int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
- field public static final deprecated int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+ method public void setSessionActivity(@Nullable android.app.PendingIntent);
+ field @Deprecated public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+ field @Deprecated public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
}
- public static abstract class MediaSession.Callback {
+ public abstract static class MediaSession.Callback {
ctor public MediaSession.Callback();
- method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- method public void onCustomAction(java.lang.String, android.os.Bundle);
+ method public void onCommand(@NonNull String, @Nullable android.os.Bundle, @Nullable android.os.ResultReceiver);
+ method public void onCustomAction(@NonNull String, @Nullable android.os.Bundle);
method public void onFastForward();
- method public boolean onMediaButtonEvent(android.content.Intent);
+ method public boolean onMediaButtonEvent(@NonNull android.content.Intent);
method public void onPause();
method public void onPlay();
- method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
- method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
+ method public void onPlayFromMediaId(String, android.os.Bundle);
+ method public void onPlayFromSearch(String, android.os.Bundle);
method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
method public void onPrepare();
- method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
- method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
+ method public void onPrepareFromMediaId(String, android.os.Bundle);
+ method public void onPrepareFromSearch(String, android.os.Bundle);
method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
method public void onRewind();
method public void onSeekTo(long);
- method public void onSetRating(android.media.Rating);
+ method public void onSetRating(@NonNull android.media.Rating);
method public void onSkipToNext();
method public void onSkipToPrevious();
method public void onSkipToQueueItem(long);
@@ -27244,21 +27438,21 @@ package android.media.session {
}
public final class MediaSessionManager {
- method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName);
- method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
- method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName);
- method public boolean isTrustedForMediaControl(android.media.session.MediaSessionManager.RemoteUserInfo);
- method public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
+ method public void addOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, @Nullable android.content.ComponentName);
+ method public void addOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, @Nullable android.content.ComponentName, @Nullable android.os.Handler);
+ method @NonNull public java.util.List<android.media.session.MediaController> getActiveSessions(@Nullable android.content.ComponentName);
+ method public boolean isTrustedForMediaControl(@NonNull android.media.session.MediaSessionManager.RemoteUserInfo);
+ method public void removeOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
}
- public static abstract interface MediaSessionManager.OnActiveSessionsChangedListener {
- method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>);
+ public static interface MediaSessionManager.OnActiveSessionsChangedListener {
+ method public void onActiveSessionsChanged(@Nullable java.util.List<android.media.session.MediaController>);
}
public static final class MediaSessionManager.RemoteUserInfo {
- ctor public MediaSessionManager.RemoteUserInfo(java.lang.String, int, int);
- ctor public MediaSessionManager.RemoteUserInfo(java.lang.String, int, int, android.os.IBinder);
- method public java.lang.String getPackageName();
+ ctor public MediaSessionManager.RemoteUserInfo(@NonNull String, int, int);
+ ctor public MediaSessionManager.RemoteUserInfo(String, int, int, android.os.IBinder);
+ method public String getPackageName();
method public int getPid();
method public int getUid();
}
@@ -27269,8 +27463,8 @@ package android.media.session {
method public long getActiveQueueItemId();
method public long getBufferedPosition();
method public java.util.List<android.media.session.PlaybackState.CustomAction> getCustomActions();
- method public java.lang.CharSequence getErrorMessage();
- method public android.os.Bundle getExtras();
+ method public CharSequence getErrorMessage();
+ method @Nullable public android.os.Bundle getExtras();
method public long getLastPositionUpdateTime();
method public float getPlaybackSpeed();
method public long getPosition();
@@ -27313,13 +27507,13 @@ package android.media.session {
public static final class PlaybackState.Builder {
ctor public PlaybackState.Builder();
ctor public PlaybackState.Builder(android.media.session.PlaybackState);
- method public android.media.session.PlaybackState.Builder addCustomAction(java.lang.String, java.lang.String, int);
+ method public android.media.session.PlaybackState.Builder addCustomAction(String, String, int);
method public android.media.session.PlaybackState.Builder addCustomAction(android.media.session.PlaybackState.CustomAction);
method public android.media.session.PlaybackState build();
method public android.media.session.PlaybackState.Builder setActions(long);
method public android.media.session.PlaybackState.Builder setActiveQueueItemId(long);
method public android.media.session.PlaybackState.Builder setBufferedPosition(long);
- method public android.media.session.PlaybackState.Builder setErrorMessage(java.lang.CharSequence);
+ method public android.media.session.PlaybackState.Builder setErrorMessage(CharSequence);
method public android.media.session.PlaybackState.Builder setExtras(android.os.Bundle);
method public android.media.session.PlaybackState.Builder setState(int, long, float, long);
method public android.media.session.PlaybackState.Builder setState(int, long, float);
@@ -27327,33 +27521,63 @@ package android.media.session {
public static final class PlaybackState.CustomAction implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getAction();
+ method public String getAction();
method public android.os.Bundle getExtras();
method public int getIcon();
- method public java.lang.CharSequence getName();
+ method public CharSequence getName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.session.PlaybackState.CustomAction> CREATOR;
}
public static final class PlaybackState.CustomAction.Builder {
- ctor public PlaybackState.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
+ ctor public PlaybackState.CustomAction.Builder(String, CharSequence, @DrawableRes int);
method public android.media.session.PlaybackState.CustomAction build();
method public android.media.session.PlaybackState.CustomAction.Builder setExtras(android.os.Bundle);
}
+ public final class SessionCallbackLink implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.os.IBinder getBinder();
+ method public void notifyAdjustVolume(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, int);
+ method public void notifyCommand(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.ResultReceiver);
+ method public void notifyCustomAction(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
+ method public void notifyFastForward(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyMediaButton(@NonNull String, int, int, @NonNull android.content.Intent, int, @Nullable android.os.ResultReceiver);
+ method public void notifyMediaButtonFromController(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.content.Intent);
+ method public void notifyNext(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyPause(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyPlay(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyPlayFromMediaId(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
+ method public void notifyPlayFromSearch(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
+ method public void notifyPlayFromUri(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
+ method public void notifyPrepare(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyPrepareFromMediaId(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
+ method public void notifyPrepareFromSearch(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
+ method public void notifyPrepareFromUri(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
+ method public void notifyPrevious(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifyRate(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.media.Rating);
+ method public void notifyRewind(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void notifySeekTo(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, long);
+ method public void notifySetVolumeTo(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, int);
+ method public void notifySkipToTrack(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, long);
+ method public void notifyStop(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.session.SessionCallbackLink> CREATOR;
+ }
+
}
package android.media.tv {
public final class TvContentRating {
- method public boolean contains(android.media.tv.TvContentRating);
- method public static android.media.tv.TvContentRating createRating(java.lang.String, java.lang.String, java.lang.String, java.lang.String...);
- method public java.lang.String flattenToString();
- method public java.lang.String getDomain();
- method public java.lang.String getMainRating();
- method public java.lang.String getRatingSystem();
+ method public boolean contains(@NonNull android.media.tv.TvContentRating);
+ method public static android.media.tv.TvContentRating createRating(String, String, String, java.lang.String...);
+ method public String flattenToString();
+ method public String getDomain();
+ method public String getMainRating();
+ method public String getRatingSystem();
method public java.util.List<java.lang.String> getSubRatings();
- method public static android.media.tv.TvContentRating unflattenFromString(java.lang.String);
+ method public static android.media.tv.TvContentRating unflattenFromString(String);
field public static final android.media.tv.TvContentRating UNRATED;
}
@@ -27361,9 +27585,9 @@ package android.media.tv {
method public static android.net.Uri buildChannelLogoUri(long);
method public static android.net.Uri buildChannelLogoUri(android.net.Uri);
method public static android.net.Uri buildChannelUri(long);
- method public static android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
- method public static android.net.Uri buildChannelsUriForInput(java.lang.String);
- method public static java.lang.String buildInputId(android.content.ComponentName);
+ method public static android.net.Uri buildChannelUriForPassthroughInput(String);
+ method public static android.net.Uri buildChannelsUriForInput(@Nullable String);
+ method public static String buildInputId(android.content.ComponentName);
method public static android.net.Uri buildPreviewProgramUri(long);
method public static android.net.Uri buildPreviewProgramsUriForChannel(long);
method public static android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
@@ -27374,107 +27598,107 @@ package android.media.tv {
method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
method public static android.net.Uri buildRecordedProgramUri(long);
method public static android.net.Uri buildWatchNextProgramUri(long);
- method public static boolean isChannelUri(android.net.Uri);
- method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
- method public static boolean isChannelUriForTunerInput(android.net.Uri);
- method public static boolean isProgramUri(android.net.Uri);
- method public static boolean isRecordedProgramUri(android.net.Uri);
+ method public static boolean isChannelUri(@NonNull android.net.Uri);
+ method public static boolean isChannelUriForPassthroughInput(@NonNull android.net.Uri);
+ method public static boolean isChannelUriForTunerInput(@NonNull android.net.Uri);
+ method public static boolean isProgramUri(@NonNull android.net.Uri);
+ method public static boolean isRecordedProgramUri(@NonNull android.net.Uri);
method public static void requestChannelBrowsable(android.content.Context, long);
- field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
- field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
- field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
- field public static final java.lang.String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
- field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
- field public static final java.lang.String AUTHORITY = "android.media.tv";
- field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
- field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
- field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
+ field public static final String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
+ field public static final String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
+ field public static final String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+ field public static final String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
+ field public static final String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
+ field public static final String AUTHORITY = "android.media.tv";
+ field public static final String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
+ field public static final String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
+ field public static final String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
}
- public static abstract interface TvContract.BaseTvColumns implements android.provider.BaseColumns {
- field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
+ public static interface TvContract.BaseTvColumns extends android.provider.BaseColumns {
+ field public static final String COLUMN_PACKAGE_NAME = "package_name";
}
public static final class TvContract.Channels implements android.media.tv.TvContract.BaseTvColumns {
- method public static java.lang.String getVideoResolution(java.lang.String);
- field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color";
- field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
- field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
- field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
- field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text";
- field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
- field public static final java.lang.String COLUMN_DESCRIPTION = "description";
- field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name";
- field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number";
- field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
- field public static final java.lang.String COLUMN_LOCKED = "locked";
- field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
- field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
- field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
- field public static final java.lang.String COLUMN_SERVICE_ID = "service_id";
- field public static final java.lang.String COLUMN_SERVICE_TYPE = "service_type";
- field public static final java.lang.String COLUMN_TRANSIENT = "transient";
- field public static final java.lang.String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
- field public static final java.lang.String COLUMN_TYPE = "type";
- field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
- field public static final java.lang.String COLUMN_VIDEO_FORMAT = "video_format";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
+ method @Nullable public static String getVideoResolution(String);
+ field public static final String COLUMN_APP_LINK_COLOR = "app_link_color";
+ field public static final String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
+ field public static final String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
+ field public static final String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
+ field public static final String COLUMN_APP_LINK_TEXT = "app_link_text";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_DESCRIPTION = "description";
+ field public static final String COLUMN_DISPLAY_NAME = "display_name";
+ field public static final String COLUMN_DISPLAY_NUMBER = "display_number";
+ field public static final String COLUMN_INPUT_ID = "input_id";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_LOCKED = "locked";
+ field public static final String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
+ field public static final String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SERVICE_ID = "service_id";
+ field public static final String COLUMN_SERVICE_TYPE = "service_type";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_FORMAT = "video_format";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
- field public static final java.lang.String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
- field public static final java.lang.String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
- field public static final java.lang.String TYPE_1SEG = "TYPE_1SEG";
- field public static final java.lang.String TYPE_ATSC_C = "TYPE_ATSC_C";
- field public static final java.lang.String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
- field public static final java.lang.String TYPE_ATSC_T = "TYPE_ATSC_T";
- field public static final java.lang.String TYPE_CMMB = "TYPE_CMMB";
- field public static final java.lang.String TYPE_DTMB = "TYPE_DTMB";
- field public static final java.lang.String TYPE_DVB_C = "TYPE_DVB_C";
- field public static final java.lang.String TYPE_DVB_C2 = "TYPE_DVB_C2";
- field public static final java.lang.String TYPE_DVB_H = "TYPE_DVB_H";
- field public static final java.lang.String TYPE_DVB_S = "TYPE_DVB_S";
- field public static final java.lang.String TYPE_DVB_S2 = "TYPE_DVB_S2";
- field public static final java.lang.String TYPE_DVB_SH = "TYPE_DVB_SH";
- field public static final java.lang.String TYPE_DVB_T = "TYPE_DVB_T";
- field public static final java.lang.String TYPE_DVB_T2 = "TYPE_DVB_T2";
- field public static final java.lang.String TYPE_ISDB_C = "TYPE_ISDB_C";
- field public static final java.lang.String TYPE_ISDB_S = "TYPE_ISDB_S";
- field public static final java.lang.String TYPE_ISDB_T = "TYPE_ISDB_T";
- field public static final java.lang.String TYPE_ISDB_TB = "TYPE_ISDB_TB";
- field public static final java.lang.String TYPE_NTSC = "TYPE_NTSC";
- field public static final java.lang.String TYPE_OTHER = "TYPE_OTHER";
- field public static final java.lang.String TYPE_PAL = "TYPE_PAL";
- field public static final java.lang.String TYPE_PREVIEW = "TYPE_PREVIEW";
- field public static final java.lang.String TYPE_SECAM = "TYPE_SECAM";
- field public static final java.lang.String TYPE_S_DMB = "TYPE_S_DMB";
- field public static final java.lang.String TYPE_T_DMB = "TYPE_T_DMB";
- field public static final java.lang.String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
- field public static final java.lang.String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
- field public static final java.lang.String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
- field public static final java.lang.String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
- field public static final java.lang.String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
- field public static final java.lang.String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
- field public static final java.lang.String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
- field public static final java.lang.String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
- field public static final java.lang.String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
- field public static final java.lang.String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
- field public static final java.lang.String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
- field public static final java.lang.String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
- field public static final java.lang.String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
- field public static final java.lang.String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
- field public static final java.lang.String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
- field public static final java.lang.String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
+ field public static final String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
+ field public static final String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
+ field public static final String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
+ field public static final String TYPE_1SEG = "TYPE_1SEG";
+ field public static final String TYPE_ATSC_C = "TYPE_ATSC_C";
+ field public static final String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
+ field public static final String TYPE_ATSC_T = "TYPE_ATSC_T";
+ field public static final String TYPE_CMMB = "TYPE_CMMB";
+ field public static final String TYPE_DTMB = "TYPE_DTMB";
+ field public static final String TYPE_DVB_C = "TYPE_DVB_C";
+ field public static final String TYPE_DVB_C2 = "TYPE_DVB_C2";
+ field public static final String TYPE_DVB_H = "TYPE_DVB_H";
+ field public static final String TYPE_DVB_S = "TYPE_DVB_S";
+ field public static final String TYPE_DVB_S2 = "TYPE_DVB_S2";
+ field public static final String TYPE_DVB_SH = "TYPE_DVB_SH";
+ field public static final String TYPE_DVB_T = "TYPE_DVB_T";
+ field public static final String TYPE_DVB_T2 = "TYPE_DVB_T2";
+ field public static final String TYPE_ISDB_C = "TYPE_ISDB_C";
+ field public static final String TYPE_ISDB_S = "TYPE_ISDB_S";
+ field public static final String TYPE_ISDB_T = "TYPE_ISDB_T";
+ field public static final String TYPE_ISDB_TB = "TYPE_ISDB_TB";
+ field public static final String TYPE_NTSC = "TYPE_NTSC";
+ field public static final String TYPE_OTHER = "TYPE_OTHER";
+ field public static final String TYPE_PAL = "TYPE_PAL";
+ field public static final String TYPE_PREVIEW = "TYPE_PREVIEW";
+ field public static final String TYPE_SECAM = "TYPE_SECAM";
+ field public static final String TYPE_S_DMB = "TYPE_S_DMB";
+ field public static final String TYPE_T_DMB = "TYPE_T_DMB";
+ field public static final String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
+ field public static final String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
+ field public static final String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
+ field public static final String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
+ field public static final String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
+ field public static final String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
+ field public static final String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
+ field public static final String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
+ field public static final String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
+ field public static final String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
+ field public static final String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
+ field public static final String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
+ field public static final String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
+ field public static final String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
+ field public static final String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
+ field public static final String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
}
public static final class TvContract.Channels.Logo {
- field public static final java.lang.String CONTENT_DIRECTORY = "logo";
+ field public static final String CONTENT_DIRECTORY = "logo";
}
public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseTvColumns {
@@ -27486,55 +27710,55 @@ package android.media.tv {
field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
- field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
- field public static final java.lang.String COLUMN_AUTHOR = "author";
- field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
- field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
- field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
- field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
- field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
- field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
- field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
- field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
- field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
- field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
- field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
- field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
- field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
- field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
- field public static final java.lang.String COLUMN_LIVE = "live";
- field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
- field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
- field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
- field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
- field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
- field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
- field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
- field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
- field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
- field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
- field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
- field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
- field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
- field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
- field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
- field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_TRANSIENT = "transient";
- field public static final java.lang.String COLUMN_TYPE = "type";
- field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
- field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
- field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
- field public static final java.lang.String COLUMN_WEIGHT = "weight";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_AUTHOR = "author";
+ field public static final String COLUMN_AVAILABILITY = "availability";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_ID = "content_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_DURATION_MILLIS = "duration_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INTENT_URI = "intent_uri";
+ field public static final String COLUMN_INTERACTION_COUNT = "interaction_count";
+ field public static final String COLUMN_INTERACTION_TYPE = "interaction_type";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_ITEM_COUNT = "item_count";
+ field public static final String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+ field public static final String COLUMN_LIVE = "live";
+ field public static final String COLUMN_LOGO_URI = "logo_uri";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_OFFER_PRICE = "offer_price";
+ field public static final String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+ field public static final String COLUMN_RELEASE_DATE = "release_date";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SERIES_ID = "series_id";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_STARTING_PRICE = "starting_price";
+ field public static final String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String COLUMN_WEIGHT = "weight";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
field public static final android.net.Uri CONTENT_URI;
field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
@@ -27561,39 +27785,39 @@ package android.media.tv {
}
public static final class TvContract.Programs implements android.media.tv.TvContract.BaseTvColumns {
- field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
- field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
- field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
- field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
- field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
- field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
- field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
- field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
- field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
- field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
- field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
- field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
- field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
- field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
- field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
- field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
- field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
- field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
- field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
- field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field @Deprecated public static final String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field @Deprecated public static final String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SERIES_ID = "series_id";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/program";
field public static final android.net.Uri CONTENT_URI;
field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
@@ -27601,64 +27825,64 @@ package android.media.tv {
}
public static final class TvContract.Programs.Genres {
- method public static java.lang.String[] decode(java.lang.String);
- method public static java.lang.String encode(java.lang.String...);
- method public static boolean isCanonical(java.lang.String);
- field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
- field public static final java.lang.String ARTS = "ARTS";
- field public static final java.lang.String COMEDY = "COMEDY";
- field public static final java.lang.String DRAMA = "DRAMA";
- field public static final java.lang.String EDUCATION = "EDUCATION";
- field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
- field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
- field public static final java.lang.String GAMING = "GAMING";
- field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
- field public static final java.lang.String MOVIES = "MOVIES";
- field public static final java.lang.String MUSIC = "MUSIC";
- field public static final java.lang.String NEWS = "NEWS";
- field public static final java.lang.String PREMIER = "PREMIER";
- field public static final java.lang.String SHOPPING = "SHOPPING";
- field public static final java.lang.String SPORTS = "SPORTS";
- field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
- field public static final java.lang.String TRAVEL = "TRAVEL";
+ method public static String[] decode(@NonNull String);
+ method public static String encode(@NonNull java.lang.String...);
+ method public static boolean isCanonical(String);
+ field public static final String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+ field public static final String ARTS = "ARTS";
+ field public static final String COMEDY = "COMEDY";
+ field public static final String DRAMA = "DRAMA";
+ field public static final String EDUCATION = "EDUCATION";
+ field public static final String ENTERTAINMENT = "ENTERTAINMENT";
+ field public static final String FAMILY_KIDS = "FAMILY_KIDS";
+ field public static final String GAMING = "GAMING";
+ field public static final String LIFE_STYLE = "LIFE_STYLE";
+ field public static final String MOVIES = "MOVIES";
+ field public static final String MUSIC = "MUSIC";
+ field public static final String NEWS = "NEWS";
+ field public static final String PREMIER = "PREMIER";
+ field public static final String SHOPPING = "SHOPPING";
+ field public static final String SPORTS = "SPORTS";
+ field public static final String TECH_SCIENCE = "TECH_SCIENCE";
+ field public static final String TRAVEL = "TRAVEL";
}
public static final class TvContract.RecordedPrograms implements android.media.tv.TvContract.BaseTvColumns {
- field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
- field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
- field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
- field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
- field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
- field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
- field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
- field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
- field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
- field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
- field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
- field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
- field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
- field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
- field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
- field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
- field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
- field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
- field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
- field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
- field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
- field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INPUT_ID = "input_id";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+ field public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+ field public static final String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+ field public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SERIES_ID = "series_id";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
field public static final android.net.Uri CONTENT_URI;
field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
@@ -27674,55 +27898,55 @@ package android.media.tv {
field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
- field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
- field public static final java.lang.String COLUMN_AUTHOR = "author";
- field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
- field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
- field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
- field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
- field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
- field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
- field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
- field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
- field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
- field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
- field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
- field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
- field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
- field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
- field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
- field public static final java.lang.String COLUMN_LIVE = "live";
- field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
- field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
- field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
- field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
- field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
- field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
- field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
- field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
- field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
- field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
- field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
- field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
- field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
- field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
- field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
- field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_TRANSIENT = "transient";
- field public static final java.lang.String COLUMN_TYPE = "type";
- field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
- field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
- field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
- field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_AUTHOR = "author";
+ field public static final String COLUMN_AVAILABILITY = "availability";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CONTENT_ID = "content_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_DURATION_MILLIS = "duration_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INTENT_URI = "intent_uri";
+ field public static final String COLUMN_INTERACTION_COUNT = "interaction_count";
+ field public static final String COLUMN_INTERACTION_TYPE = "interaction_type";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_ITEM_COUNT = "item_count";
+ field public static final String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+ field public static final String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+ field public static final String COLUMN_LIVE = "live";
+ field public static final String COLUMN_LOGO_URI = "logo_uri";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_OFFER_PRICE = "offer_price";
+ field public static final String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+ field public static final String COLUMN_RELEASE_DATE = "release_date";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SERIES_ID = "series_id";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_STARTING_PRICE = "starting_price";
+ field public static final String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
field public static final android.net.Uri CONTENT_URI;
field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
@@ -27754,23 +27978,23 @@ package android.media.tv {
public final class TvInputInfo implements android.os.Parcelable {
method public boolean canRecord();
- method public deprecated android.content.Intent createSettingsIntent();
+ method @Deprecated public android.content.Intent createSettingsIntent();
method public android.content.Intent createSetupIntent();
method public int describeContents();
method public android.os.Bundle getExtras();
- method public java.lang.String getId();
- method public java.lang.String getParentId();
+ method public String getId();
+ method public String getParentId();
method public android.content.pm.ServiceInfo getServiceInfo();
method public int getTunerCount();
method public int getType();
method public boolean isHidden(android.content.Context);
method public boolean isPassthroughInput();
- method public java.lang.CharSequence loadCustomLabel(android.content.Context);
- method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
- method public java.lang.CharSequence loadLabel(android.content.Context);
- method public void writeToParcel(android.os.Parcel, int);
+ method public CharSequence loadCustomLabel(android.content.Context);
+ method public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.Context);
+ method public CharSequence loadLabel(@NonNull android.content.Context);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.tv.TvInputInfo> CREATOR;
- field public static final java.lang.String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
+ field public static final String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
field public static final int TYPE_COMPONENT = 1004; // 0x3ec
field public static final int TYPE_COMPOSITE = 1001; // 0x3e9
field public static final int TYPE_DISPLAY_PORT = 1008; // 0x3f0
@@ -27793,23 +28017,23 @@ package android.media.tv {
public final class TvInputManager {
method public java.util.List<android.media.tv.TvContentRating> getBlockedRatings();
- method public int getInputState(java.lang.String);
- method public android.media.tv.TvInputInfo getTvInputInfo(java.lang.String);
+ method public int getInputState(@NonNull String);
+ method @Nullable public android.media.tv.TvInputInfo getTvInputInfo(@NonNull String);
method public java.util.List<android.media.tv.TvInputInfo> getTvInputList();
method public boolean isParentalControlsEnabled();
- method public boolean isRatingBlocked(android.media.tv.TvContentRating);
- method public void registerCallback(android.media.tv.TvInputManager.TvInputCallback, android.os.Handler);
- method public void unregisterCallback(android.media.tv.TvInputManager.TvInputCallback);
- method public void updateTvInputInfo(android.media.tv.TvInputInfo);
- field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
- field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
- field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
- field public static final java.lang.String ACTION_SETUP_INPUTS = "android.media.tv.action.SETUP_INPUTS";
- field public static final java.lang.String ACTION_VIEW_RECORDING_SCHEDULES = "android.media.tv.action.VIEW_RECORDING_SCHEDULES";
+ method public boolean isRatingBlocked(@NonNull android.media.tv.TvContentRating);
+ method public void registerCallback(@NonNull android.media.tv.TvInputManager.TvInputCallback, @NonNull android.os.Handler);
+ method public void unregisterCallback(@NonNull android.media.tv.TvInputManager.TvInputCallback);
+ method public void updateTvInputInfo(@NonNull android.media.tv.TvInputInfo);
+ field public static final String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
+ field public static final String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
+ field public static final String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
+ field public static final String ACTION_SETUP_INPUTS = "android.media.tv.action.SETUP_INPUTS";
+ field public static final String ACTION_VIEW_RECORDING_SCHEDULES = "android.media.tv.action.VIEW_RECORDING_SCHEDULES";
field public static final int INPUT_STATE_CONNECTED = 0; // 0x0
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
- field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
+ field public static final String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
field public static final int RECORDING_ERROR_INSUFFICIENT_SPACE = 1; // 0x1
field public static final int RECORDING_ERROR_RESOURCE_BUSY = 2; // 0x2
field public static final int RECORDING_ERROR_UNKNOWN = 0; // 0x0
@@ -27825,57 +28049,57 @@ package android.media.tv {
field public static final int VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL = 2; // 0x2
}
- public static abstract class TvInputManager.TvInputCallback {
+ public abstract static class TvInputManager.TvInputCallback {
ctor public TvInputManager.TvInputCallback();
- method public void onInputAdded(java.lang.String);
- method public void onInputRemoved(java.lang.String);
- method public void onInputStateChanged(java.lang.String, int);
- method public void onInputUpdated(java.lang.String);
+ method public void onInputAdded(String);
+ method public void onInputRemoved(String);
+ method public void onInputStateChanged(String, int);
+ method public void onInputUpdated(String);
method public void onTvInputInfoUpdated(android.media.tv.TvInputInfo);
}
public abstract class TvInputService extends android.app.Service {
ctor public TvInputService();
method public final android.os.IBinder onBind(android.content.Intent);
- method public android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(java.lang.String);
- method public abstract android.media.tv.TvInputService.Session onCreateSession(java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.media.tv.TvInputService";
- field public static final java.lang.String SERVICE_META_DATA = "android.media.tv.input";
+ method @Nullable public android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(String);
+ method @Nullable public abstract android.media.tv.TvInputService.Session onCreateSession(String);
+ field public static final String SERVICE_INTERFACE = "android.media.tv.TvInputService";
+ field public static final String SERVICE_META_DATA = "android.media.tv.input";
}
- public static abstract class TvInputService.HardwareSession extends android.media.tv.TvInputService.Session {
+ public abstract static class TvInputService.HardwareSession extends android.media.tv.TvInputService.Session {
ctor public TvInputService.HardwareSession(android.content.Context);
- method public abstract java.lang.String getHardwareInputId();
+ method public abstract String getHardwareInputId();
method public void onHardwareVideoAvailable();
method public void onHardwareVideoUnavailable(int);
method public final boolean onSetSurface(android.view.Surface);
}
- public static abstract class TvInputService.RecordingSession {
+ public abstract static class TvInputService.RecordingSession {
ctor public TvInputService.RecordingSession(android.content.Context);
method public void notifyError(int);
method public void notifyRecordingStopped(android.net.Uri);
method public void notifyTuned(android.net.Uri);
- method public void onAppPrivateCommand(java.lang.String, android.os.Bundle);
+ method public void onAppPrivateCommand(@NonNull String, android.os.Bundle);
method public abstract void onRelease();
- method public abstract void onStartRecording(android.net.Uri);
+ method public abstract void onStartRecording(@Nullable android.net.Uri);
method public abstract void onStopRecording();
method public abstract void onTune(android.net.Uri);
method public void onTune(android.net.Uri, android.os.Bundle);
}
- public static abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
+ public abstract static class TvInputService.Session implements android.view.KeyEvent.Callback {
ctor public TvInputService.Session(android.content.Context);
method public void layoutSurface(int, int, int, int);
method public void notifyChannelRetuned(android.net.Uri);
method public void notifyContentAllowed();
- method public void notifyContentBlocked(android.media.tv.TvContentRating);
+ method public void notifyContentBlocked(@NonNull android.media.tv.TvContentRating);
method public void notifyTimeShiftStatusChanged(int);
- method public void notifyTrackSelected(int, java.lang.String);
+ method public void notifyTrackSelected(int, String);
method public void notifyTracksChanged(java.util.List<android.media.tv.TvTrackInfo>);
method public void notifyVideoAvailable();
method public void notifyVideoUnavailable(int);
- method public void onAppPrivateCommand(java.lang.String, android.os.Bundle);
+ method public void onAppPrivateCommand(@NonNull String, android.os.Bundle);
method public android.view.View onCreateOverlayView();
method public boolean onGenericMotionEvent(android.view.MotionEvent);
method public boolean onKeyDown(int, android.view.KeyEvent);
@@ -27884,10 +28108,10 @@ package android.media.tv {
method public boolean onKeyUp(int, android.view.KeyEvent);
method public void onOverlayViewSizeChanged(int, int);
method public abstract void onRelease();
- method public boolean onSelectTrack(int, java.lang.String);
+ method public boolean onSelectTrack(int, @Nullable String);
method public abstract void onSetCaptionEnabled(boolean);
- method public abstract void onSetStreamVolume(float);
- method public abstract boolean onSetSurface(android.view.Surface);
+ method public abstract void onSetStreamVolume(@FloatRange(from=0.0, to=1.0) float);
+ method public abstract boolean onSetSurface(@Nullable android.view.Surface);
method public void onSurfaceChanged(int, int, int);
method public long onTimeShiftGetCurrentPosition();
method public long onTimeShiftGetStartPosition();
@@ -27905,19 +28129,19 @@ package android.media.tv {
}
public class TvRecordingClient {
- ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
+ ctor public TvRecordingClient(android.content.Context, String, @NonNull android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
method public void release();
- method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle);
- method public void startRecording(android.net.Uri);
+ method public void sendAppPrivateCommand(@NonNull String, android.os.Bundle);
+ method public void startRecording(@Nullable android.net.Uri);
method public void stopRecording();
- method public void tune(java.lang.String, android.net.Uri);
- method public void tune(java.lang.String, android.net.Uri, android.os.Bundle);
+ method public void tune(String, android.net.Uri);
+ method public void tune(String, android.net.Uri, android.os.Bundle);
}
- public static abstract class TvRecordingClient.RecordingCallback {
+ public abstract static class TvRecordingClient.RecordingCallback {
ctor public TvRecordingClient.RecordingCallback();
- method public void onConnectionFailed(java.lang.String);
- method public void onDisconnected(java.lang.String);
+ method public void onConnectionFailed(String);
+ method public void onDisconnected(String);
method public void onError(int);
method public void onRecordingStopped(android.net.Uri);
method public void onTuned(android.net.Uri);
@@ -27927,10 +28151,10 @@ package android.media.tv {
method public int describeContents();
method public int getAudioChannelCount();
method public int getAudioSampleRate();
- method public java.lang.CharSequence getDescription();
+ method public CharSequence getDescription();
method public android.os.Bundle getExtra();
- method public java.lang.String getId();
- method public java.lang.String getLanguage();
+ method public String getId();
+ method public String getLanguage();
method public int getType();
method public byte getVideoActiveFormatDescription();
method public float getVideoFrameRate();
@@ -27945,13 +28169,13 @@ package android.media.tv {
}
public static final class TvTrackInfo.Builder {
- ctor public TvTrackInfo.Builder(int, java.lang.String);
+ ctor public TvTrackInfo.Builder(int, @NonNull String);
method public android.media.tv.TvTrackInfo build();
method public android.media.tv.TvTrackInfo.Builder setAudioChannelCount(int);
method public android.media.tv.TvTrackInfo.Builder setAudioSampleRate(int);
- method public android.media.tv.TvTrackInfo.Builder setDescription(java.lang.CharSequence);
+ method public android.media.tv.TvTrackInfo.Builder setDescription(CharSequence);
method public android.media.tv.TvTrackInfo.Builder setExtra(android.os.Bundle);
- method public android.media.tv.TvTrackInfo.Builder setLanguage(java.lang.String);
+ method public android.media.tv.TvTrackInfo.Builder setLanguage(String);
method public android.media.tv.TvTrackInfo.Builder setVideoActiveFormatDescription(byte);
method public android.media.tv.TvTrackInfo.Builder setVideoFrameRate(float);
method public android.media.tv.TvTrackInfo.Builder setVideoHeight(int);
@@ -27964,51 +28188,51 @@ package android.media.tv {
ctor public TvView(android.content.Context, android.util.AttributeSet);
ctor public TvView(android.content.Context, android.util.AttributeSet, int);
method public boolean dispatchUnhandledInputEvent(android.view.InputEvent);
- method public java.lang.String getSelectedTrack(int);
+ method public String getSelectedTrack(int);
method public java.util.List<android.media.tv.TvTrackInfo> getTracks(int);
method public boolean onUnhandledInputEvent(android.view.InputEvent);
method public void reset();
- method public void selectTrack(int, java.lang.String);
- method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle);
- method public void setCallback(android.media.tv.TvView.TvInputCallback);
+ method public void selectTrack(int, String);
+ method public void sendAppPrivateCommand(@NonNull String, android.os.Bundle);
+ method public void setCallback(@Nullable android.media.tv.TvView.TvInputCallback);
method public void setCaptionEnabled(boolean);
method public void setOnUnhandledInputEventListener(android.media.tv.TvView.OnUnhandledInputEventListener);
- method public void setStreamVolume(float);
- method public void setTimeShiftPositionCallback(android.media.tv.TvView.TimeShiftPositionCallback);
+ method public void setStreamVolume(@FloatRange(from=0.0, to=1.0) float);
+ method public void setTimeShiftPositionCallback(@Nullable android.media.tv.TvView.TimeShiftPositionCallback);
method public void setZOrderMediaOverlay(boolean);
method public void setZOrderOnTop(boolean);
method public void timeShiftPause();
- method public void timeShiftPlay(java.lang.String, android.net.Uri);
+ method public void timeShiftPlay(String, android.net.Uri);
method public void timeShiftResume();
method public void timeShiftSeekTo(long);
- method public void timeShiftSetPlaybackParams(android.media.PlaybackParams);
- method public void tune(java.lang.String, android.net.Uri);
- method public void tune(java.lang.String, android.net.Uri, android.os.Bundle);
+ method public void timeShiftSetPlaybackParams(@NonNull android.media.PlaybackParams);
+ method public void tune(@NonNull String, android.net.Uri);
+ method public void tune(String, android.net.Uri, android.os.Bundle);
}
- public static abstract interface TvView.OnUnhandledInputEventListener {
- method public abstract boolean onUnhandledInputEvent(android.view.InputEvent);
+ public static interface TvView.OnUnhandledInputEventListener {
+ method public boolean onUnhandledInputEvent(android.view.InputEvent);
}
- public static abstract class TvView.TimeShiftPositionCallback {
+ public abstract static class TvView.TimeShiftPositionCallback {
ctor public TvView.TimeShiftPositionCallback();
- method public void onTimeShiftCurrentPositionChanged(java.lang.String, long);
- method public void onTimeShiftStartPositionChanged(java.lang.String, long);
+ method public void onTimeShiftCurrentPositionChanged(String, long);
+ method public void onTimeShiftStartPositionChanged(String, long);
}
- public static abstract class TvView.TvInputCallback {
+ public abstract static class TvView.TvInputCallback {
ctor public TvView.TvInputCallback();
- method public void onChannelRetuned(java.lang.String, android.net.Uri);
- method public void onConnectionFailed(java.lang.String);
- method public void onContentAllowed(java.lang.String);
- method public void onContentBlocked(java.lang.String, android.media.tv.TvContentRating);
- method public void onDisconnected(java.lang.String);
- method public void onTimeShiftStatusChanged(java.lang.String, int);
- method public void onTrackSelected(java.lang.String, int, java.lang.String);
- method public void onTracksChanged(java.lang.String, java.util.List<android.media.tv.TvTrackInfo>);
- method public void onVideoAvailable(java.lang.String);
- method public void onVideoSizeChanged(java.lang.String, int, int);
- method public void onVideoUnavailable(java.lang.String, int);
+ method public void onChannelRetuned(String, android.net.Uri);
+ method public void onConnectionFailed(String);
+ method public void onContentAllowed(String);
+ method public void onContentBlocked(String, android.media.tv.TvContentRating);
+ method public void onDisconnected(String);
+ method public void onTimeShiftStatusChanged(String, int);
+ method public void onTrackSelected(String, int, String);
+ method public void onTracksChanged(String, java.util.List<android.media.tv.TvTrackInfo>);
+ method public void onVideoAvailable(String);
+ method public void onVideoSizeChanged(String, int, int);
+ method public void onVideoUnavailable(String, int);
}
}
@@ -28120,37 +28344,37 @@ package android.mtp {
}
public final class MtpDevice {
- ctor public MtpDevice(android.hardware.usb.UsbDevice);
+ ctor public MtpDevice(@NonNull android.hardware.usb.UsbDevice);
method public void close();
method public boolean deleteObject(int);
method public int getDeviceId();
- method public android.mtp.MtpDeviceInfo getDeviceInfo();
- method public java.lang.String getDeviceName();
- method public byte[] getObject(int, int);
- method public int[] getObjectHandles(int, int, int);
- method public android.mtp.MtpObjectInfo getObjectInfo(int);
+ method @Nullable public android.mtp.MtpDeviceInfo getDeviceInfo();
+ method @NonNull public String getDeviceName();
+ method @Nullable public byte[] getObject(int, int);
+ method @Nullable public int[] getObjectHandles(int, int, int);
+ method @Nullable public android.mtp.MtpObjectInfo getObjectInfo(int);
method public long getParent(int);
- method public long getPartialObject(int, long, long, byte[]) throws java.io.IOException;
- method public long getPartialObject64(int, long, long, byte[]) throws java.io.IOException;
+ method public long getPartialObject(int, long, long, @NonNull byte[]) throws java.io.IOException;
+ method public long getPartialObject64(int, long, long, @NonNull byte[]) throws java.io.IOException;
method public long getStorageId(int);
- method public int[] getStorageIds();
- method public android.mtp.MtpStorageInfo getStorageInfo(int);
- method public byte[] getThumbnail(int);
- method public boolean importFile(int, java.lang.String);
- method public boolean importFile(int, android.os.ParcelFileDescriptor);
- method public boolean open(android.hardware.usb.UsbDeviceConnection);
- method public android.mtp.MtpEvent readEvent(android.os.CancellationSignal) throws java.io.IOException;
- method public boolean sendObject(int, long, android.os.ParcelFileDescriptor);
- method public android.mtp.MtpObjectInfo sendObjectInfo(android.mtp.MtpObjectInfo);
+ method @Nullable public int[] getStorageIds();
+ method @Nullable public android.mtp.MtpStorageInfo getStorageInfo(int);
+ method @Nullable public byte[] getThumbnail(int);
+ method public boolean importFile(int, @NonNull String);
+ method public boolean importFile(int, @NonNull android.os.ParcelFileDescriptor);
+ method public boolean open(@NonNull android.hardware.usb.UsbDeviceConnection);
+ method @NonNull public android.mtp.MtpEvent readEvent(@Nullable android.os.CancellationSignal) throws java.io.IOException;
+ method public boolean sendObject(int, long, @NonNull android.os.ParcelFileDescriptor);
+ method @Nullable public android.mtp.MtpObjectInfo sendObjectInfo(@NonNull android.mtp.MtpObjectInfo);
}
public class MtpDeviceInfo {
- method public final int[] getEventsSupported();
- method public final java.lang.String getManufacturer();
- method public final java.lang.String getModel();
- method public final int[] getOperationsSupported();
- method public final java.lang.String getSerialNumber();
- method public final java.lang.String getVersion();
+ method @NonNull public final int[] getEventsSupported();
+ method @NonNull public final String getManufacturer();
+ method @NonNull public final String getModel();
+ method @NonNull public final int[] getOperationsSupported();
+ method @NonNull public final String getSerialNumber();
+ method @NonNull public final String getVersion();
method public boolean isEventSupported(int);
method public boolean isOperationSupported(int);
}
@@ -28200,8 +28424,8 @@ package android.mtp {
method public long getImagePixHeightLong();
method public int getImagePixWidth();
method public long getImagePixWidthLong();
- method public java.lang.String getKeywords();
- method public java.lang.String getName();
+ method @NonNull public String getKeywords();
+ method @NonNull public String getName();
method public int getObjectHandle();
method public int getParent();
method public int getProtectionStatus();
@@ -28230,8 +28454,8 @@ package android.mtp {
method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(long);
method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(long);
method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(long);
- method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String);
- method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String);
+ method public android.mtp.MtpObjectInfo.Builder setKeywords(@NonNull String);
+ method public android.mtp.MtpObjectInfo.Builder setName(@NonNull String);
method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int);
method public android.mtp.MtpObjectInfo.Builder setParent(int);
method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int);
@@ -28244,11 +28468,11 @@ package android.mtp {
}
public final class MtpStorageInfo {
- method public java.lang.String getDescription();
+ method @NonNull public String getDescription();
method public long getFreeSpace();
method public long getMaxCapacity();
method public int getStorageId();
- method public java.lang.String getVolumeIdentifier();
+ method @NonNull public String getVolumeIdentifier();
}
}
@@ -28265,79 +28489,79 @@ package android.net {
public class ConnectivityManager {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
- method public boolean bindProcessToNetwork(android.net.Network);
- method public android.net.Network getActiveNetwork();
- method public deprecated android.net.NetworkInfo getActiveNetworkInfo();
- method public deprecated android.net.NetworkInfo[] getAllNetworkInfo();
- method public android.net.Network[] getAllNetworks();
- method public deprecated boolean getBackgroundDataSetting();
- method public android.net.Network getBoundNetworkForProcess();
- method public int getConnectionOwnerUid(int, java.net.InetSocketAddress, java.net.InetSocketAddress);
- method public android.net.ProxyInfo getDefaultProxy();
- method public android.net.LinkProperties getLinkProperties(android.net.Network);
- method public int getMultipathPreference(android.net.Network);
- method public android.net.NetworkCapabilities getNetworkCapabilities(android.net.Network);
- method public deprecated android.net.NetworkInfo getNetworkInfo(int);
- method public deprecated android.net.NetworkInfo getNetworkInfo(android.net.Network);
- method public deprecated int getNetworkPreference();
- method public byte[] getNetworkWatchlistConfigHash();
- method public static deprecated android.net.Network getProcessDefaultNetwork();
+ method public boolean bindProcessToNetwork(@Nullable android.net.Network);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.Network getActiveNetwork();
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getActiveNetworkInfo();
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo[] getAllNetworkInfo();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @NonNull public android.net.Network[] getAllNetworks();
+ method @Deprecated public boolean getBackgroundDataSetting();
+ method @Nullable public android.net.Network getBoundNetworkForProcess();
+ method public int getConnectionOwnerUid(int, @NonNull java.net.InetSocketAddress, @NonNull java.net.InetSocketAddress);
+ method @Nullable public android.net.ProxyInfo getDefaultProxy();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.LinkProperties getLinkProperties(@Nullable android.net.Network);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getMultipathPreference(@Nullable android.net.Network);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.NetworkCapabilities getNetworkCapabilities(@Nullable android.net.Network);
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(int);
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(@Nullable android.net.Network);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getNetworkPreference();
+ method @Nullable public byte[] getNetworkWatchlistConfigHash();
+ method @Deprecated @Nullable public static android.net.Network getProcessDefaultNetwork();
method public int getRestrictBackgroundStatus();
- method public boolean isActiveNetworkMetered();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
- method public static deprecated boolean isNetworkTypeValid(int);
- method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
- method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
- method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent);
- method public void releaseNetworkRequest(android.app.PendingIntent);
- method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
- method public deprecated void reportBadNetwork(android.net.Network);
- method public void reportNetworkConnectivity(android.net.Network, boolean);
- method public boolean requestBandwidthUpdate(android.net.Network);
- method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
- method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, int);
- method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler, int);
- method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
- method public deprecated void setNetworkPreference(int);
- method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
- method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
- method public void unregisterNetworkCallback(android.app.PendingIntent);
- field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
- field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
- field public static final java.lang.String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
- field public static final deprecated java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
- field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
- field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
- field public static final java.lang.String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL";
- field public static final deprecated java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
- field public static final deprecated java.lang.String EXTRA_IS_FAILOVER = "isFailover";
- field public static final java.lang.String EXTRA_NETWORK = "android.net.extra.NETWORK";
- field public static final deprecated java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
- field public static final java.lang.String EXTRA_NETWORK_REQUEST = "android.net.extra.NETWORK_REQUEST";
- field public static final java.lang.String EXTRA_NETWORK_TYPE = "networkType";
- field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
- field public static final deprecated java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
- field public static final java.lang.String EXTRA_REASON = "reason";
+ method @Deprecated public static boolean isNetworkTypeValid(int);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.app.PendingIntent);
+ method public void releaseNetworkRequest(@NonNull android.app.PendingIntent);
+ method public void removeDefaultNetworkActiveListener(@NonNull android.net.ConnectivityManager.OnNetworkActiveListener);
+ method @Deprecated public void reportBadNetwork(@Nullable android.net.Network);
+ method public void reportNetworkConnectivity(@Nullable android.net.Network, boolean);
+ method public boolean requestBandwidthUpdate(@NonNull android.net.Network);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, int);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler, int);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.app.PendingIntent);
+ method @Deprecated public void setNetworkPreference(int);
+ method @Deprecated public static boolean setProcessDefaultNetwork(@Nullable android.net.Network);
+ method public void unregisterNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback);
+ method public void unregisterNetworkCallback(@NonNull android.app.PendingIntent);
+ field @Deprecated public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
+ field public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
+ field public static final String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
+ field @Deprecated public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
+ field @Deprecated public static final int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
+ field public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
+ field public static final String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL";
+ field @Deprecated public static final String EXTRA_EXTRA_INFO = "extraInfo";
+ field @Deprecated public static final String EXTRA_IS_FAILOVER = "isFailover";
+ field public static final String EXTRA_NETWORK = "android.net.extra.NETWORK";
+ field @Deprecated public static final String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final String EXTRA_NETWORK_REQUEST = "android.net.extra.NETWORK_REQUEST";
+ field public static final String EXTRA_NETWORK_TYPE = "networkType";
+ field public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
+ field @Deprecated public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
+ field public static final String EXTRA_REASON = "reason";
field public static final int MULTIPATH_PREFERENCE_HANDOVER = 1; // 0x1
field public static final int MULTIPATH_PREFERENCE_PERFORMANCE = 4; // 0x4
field public static final int MULTIPATH_PREFERENCE_RELIABILITY = 2; // 0x2
field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
- field public static final deprecated int TYPE_BLUETOOTH = 7; // 0x7
- field public static final deprecated int TYPE_DUMMY = 8; // 0x8
- field public static final deprecated int TYPE_ETHERNET = 9; // 0x9
- field public static final deprecated int TYPE_MOBILE = 0; // 0x0
- field public static final deprecated int TYPE_MOBILE_DUN = 4; // 0x4
- field public static final deprecated int TYPE_MOBILE_HIPRI = 5; // 0x5
- field public static final deprecated int TYPE_MOBILE_MMS = 2; // 0x2
- field public static final deprecated int TYPE_MOBILE_SUPL = 3; // 0x3
- field public static final deprecated int TYPE_VPN = 17; // 0x11
- field public static final deprecated int TYPE_WIFI = 1; // 0x1
- field public static final deprecated int TYPE_WIMAX = 6; // 0x6
+ field @Deprecated public static final int TYPE_BLUETOOTH = 7; // 0x7
+ field @Deprecated public static final int TYPE_DUMMY = 8; // 0x8
+ field @Deprecated public static final int TYPE_ETHERNET = 9; // 0x9
+ field @Deprecated public static final int TYPE_MOBILE = 0; // 0x0
+ field @Deprecated public static final int TYPE_MOBILE_DUN = 4; // 0x4
+ field @Deprecated public static final int TYPE_MOBILE_HIPRI = 5; // 0x5
+ field @Deprecated public static final int TYPE_MOBILE_MMS = 2; // 0x2
+ field @Deprecated public static final int TYPE_MOBILE_SUPL = 3; // 0x3
+ field @Deprecated public static final int TYPE_VPN = 17; // 0x11
+ field @Deprecated public static final int TYPE_WIFI = 1; // 0x1
+ field @Deprecated public static final int TYPE_WIMAX = 6; // 0x6
}
public static class ConnectivityManager.NetworkCallback {
@@ -28351,8 +28575,8 @@ package android.net {
method public void onUnavailable();
}
- public static abstract interface ConnectivityManager.OnNetworkActiveListener {
- method public abstract void onNetworkActive();
+ public static interface ConnectivityManager.OnNetworkActiveListener {
+ method public void onNetworkActive();
}
public class Credentials {
@@ -28376,8 +28600,8 @@ package android.net {
}
public class InetAddresses {
- method public static boolean isNumericAddress(java.lang.String);
- method public static java.net.InetAddress parseNumericAddress(java.lang.String);
+ method public static boolean isNumericAddress(String);
+ method public static java.net.InetAddress parseNumericAddress(String);
}
public final class IpPrefix implements android.os.Parcelable {
@@ -28391,34 +28615,34 @@ package android.net {
}
public final class IpSecAlgorithm implements android.os.Parcelable {
- ctor public IpSecAlgorithm(java.lang.String, byte[]);
- ctor public IpSecAlgorithm(java.lang.String, byte[], int);
+ ctor public IpSecAlgorithm(@NonNull String, @NonNull byte[]);
+ ctor public IpSecAlgorithm(@NonNull String, @NonNull byte[], int);
method public int describeContents();
- method public byte[] getKey();
- method public java.lang.String getName();
+ method @NonNull public byte[] getKey();
+ method @NonNull public String getName();
method public int getTruncationLengthBits();
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String AUTH_CRYPT_AES_GCM = "rfc4106(gcm(aes))";
- field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)";
- field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)";
- field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)";
- field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)";
- field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)";
+ field public static final String AUTH_CRYPT_AES_GCM = "rfc4106(gcm(aes))";
+ field public static final String AUTH_HMAC_MD5 = "hmac(md5)";
+ field public static final String AUTH_HMAC_SHA1 = "hmac(sha1)";
+ field public static final String AUTH_HMAC_SHA256 = "hmac(sha256)";
+ field public static final String AUTH_HMAC_SHA384 = "hmac(sha384)";
+ field public static final String AUTH_HMAC_SHA512 = "hmac(sha512)";
field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR;
- field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)";
+ field public static final String CRYPT_AES_CBC = "cbc(aes)";
}
public final class IpSecManager {
- method public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- method public void applyTransportModeTransform(java.net.Socket, int, android.net.IpSecTransform) throws java.io.IOException;
- method public void applyTransportModeTransform(java.net.DatagramSocket, int, android.net.IpSecTransform) throws java.io.IOException;
- method public void applyTransportModeTransform(java.io.FileDescriptor, int, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public void removeTransportModeTransforms(java.net.Socket) throws java.io.IOException;
- method public void removeTransportModeTransforms(java.net.DatagramSocket) throws java.io.IOException;
- method public void removeTransportModeTransforms(java.io.FileDescriptor) throws java.io.IOException;
+ method @NonNull public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(@NonNull java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
+ method @NonNull public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(@NonNull java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
+ method public void applyTransportModeTransform(@NonNull java.net.Socket, int, @NonNull android.net.IpSecTransform) throws java.io.IOException;
+ method public void applyTransportModeTransform(@NonNull java.net.DatagramSocket, int, @NonNull android.net.IpSecTransform) throws java.io.IOException;
+ method public void applyTransportModeTransform(@NonNull java.io.FileDescriptor, int, @NonNull android.net.IpSecTransform) throws java.io.IOException;
+ method @NonNull public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
+ method @NonNull public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
+ method public void removeTransportModeTransforms(@NonNull java.net.Socket) throws java.io.IOException;
+ method public void removeTransportModeTransforms(@NonNull java.net.DatagramSocket) throws java.io.IOException;
+ method public void removeTransportModeTransforms(@NonNull java.io.FileDescriptor) throws java.io.IOException;
field public static final int DIRECTION_IN = 0; // 0x0
field public static final int DIRECTION_OUT = 1; // 0x1
}
@@ -28446,12 +28670,12 @@ package android.net {
}
public static class IpSecTransform.Builder {
- ctor public IpSecTransform.Builder(android.content.Context);
- method public android.net.IpSecTransform buildTransportModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- method public android.net.IpSecTransform.Builder setAuthenticatedEncryption(android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setAuthentication(android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setEncryption(android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setIpv4Encapsulation(android.net.IpSecManager.UdpEncapsulationSocket, int);
+ ctor public IpSecTransform.Builder(@NonNull android.content.Context);
+ method @NonNull public android.net.IpSecTransform buildTransportModeTransform(@NonNull java.net.InetAddress, @NonNull android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
+ method @NonNull public android.net.IpSecTransform.Builder setAuthenticatedEncryption(@NonNull android.net.IpSecAlgorithm);
+ method @NonNull public android.net.IpSecTransform.Builder setAuthentication(@NonNull android.net.IpSecAlgorithm);
+ method @NonNull public android.net.IpSecTransform.Builder setEncryption(@NonNull android.net.IpSecAlgorithm);
+ method @NonNull public android.net.IpSecTransform.Builder setIpv4Encapsulation(@NonNull android.net.IpSecManager.UdpEncapsulationSocket, int);
}
public class LinkAddress implements android.os.Parcelable {
@@ -28467,12 +28691,12 @@ package android.net {
public final class LinkProperties implements android.os.Parcelable {
method public int describeContents();
method public java.util.List<java.net.InetAddress> getDnsServers();
- method public java.lang.String getDomains();
+ method public String getDomains();
method public android.net.ProxyInfo getHttpProxy();
- method public java.lang.String getInterfaceName();
+ method @Nullable public String getInterfaceName();
method public java.util.List<android.net.LinkAddress> getLinkAddresses();
method public int getMtu();
- method public java.lang.String getPrivateDnsServerName();
+ method @Nullable public String getPrivateDnsServerName();
method public java.util.List<android.net.RouteInfo> getRoutes();
method public boolean isPrivateDnsActive();
method public void writeToParcel(android.os.Parcel, int);
@@ -28480,7 +28704,7 @@ package android.net {
}
public class LocalServerSocket implements java.io.Closeable {
- ctor public LocalServerSocket(java.lang.String) throws java.io.IOException;
+ ctor public LocalServerSocket(String) throws java.io.IOException;
ctor public LocalServerSocket(java.io.FileDescriptor) throws java.io.IOException;
method public android.net.LocalSocket accept() throws java.io.IOException;
method public void close() throws java.io.IOException;
@@ -28505,9 +28729,9 @@ package android.net {
method public android.net.LocalSocketAddress getRemoteSocketAddress();
method public int getSendBufferSize() throws java.io.IOException;
method public int getSoTimeout() throws java.io.IOException;
- method public synchronized boolean isBound();
+ method public boolean isBound();
method public boolean isClosed();
- method public synchronized boolean isConnected();
+ method public boolean isConnected();
method public boolean isInputShutdown();
method public boolean isOutputShutdown();
method public void setFileDescriptorsForSend(java.io.FileDescriptor[]);
@@ -28522,15 +28746,13 @@ package android.net {
}
public class LocalSocketAddress {
- ctor public LocalSocketAddress(java.lang.String, android.net.LocalSocketAddress.Namespace);
- ctor public LocalSocketAddress(java.lang.String);
- method public java.lang.String getName();
+ ctor public LocalSocketAddress(String, android.net.LocalSocketAddress.Namespace);
+ ctor public LocalSocketAddress(String);
+ method public String getName();
method public android.net.LocalSocketAddress.Namespace getNamespace();
}
- public static final class LocalSocketAddress.Namespace extends java.lang.Enum {
- method public static android.net.LocalSocketAddress.Namespace valueOf(java.lang.String);
- method public static final android.net.LocalSocketAddress.Namespace[] values();
+ public enum LocalSocketAddress.Namespace {
enum_constant public static final android.net.LocalSocketAddress.Namespace ABSTRACT;
enum_constant public static final android.net.LocalSocketAddress.Namespace FILESYSTEM;
enum_constant public static final android.net.LocalSocketAddress.Namespace RESERVED;
@@ -28538,12 +28760,12 @@ package android.net {
public final class MacAddress implements android.os.Parcelable {
method public int describeContents();
- method public static android.net.MacAddress fromBytes(byte[]);
- method public static android.net.MacAddress fromString(java.lang.String);
+ method @NonNull public static android.net.MacAddress fromBytes(@NonNull byte[]);
+ method @NonNull public static android.net.MacAddress fromString(@NonNull String);
method public int getAddressType();
method public boolean isLocallyAssigned();
- method public byte[] toByteArray();
- method public java.lang.String toOuiString();
+ method @NonNull public byte[] toByteArray();
+ method @NonNull public String toOuiString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.net.MacAddress BROADCAST_ADDRESS;
field public static final android.os.Parcelable.Creator<android.net.MacAddress> CREATOR;
@@ -28553,14 +28775,14 @@ package android.net {
}
public class MailTo {
- method public java.lang.String getBody();
- method public java.lang.String getCc();
- method public java.util.Map<java.lang.String, java.lang.String> getHeaders();
- method public java.lang.String getSubject();
- method public java.lang.String getTo();
- method public static boolean isMailTo(java.lang.String);
- method public static android.net.MailTo parse(java.lang.String) throws android.net.ParseException;
- field public static final java.lang.String MAILTO_SCHEME = "mailto:";
+ method public String getBody();
+ method public String getCc();
+ method public java.util.Map<java.lang.String,java.lang.String> getHeaders();
+ method public String getSubject();
+ method public String getTo();
+ method public static boolean isMailTo(String);
+ method public static android.net.MailTo parse(String) throws android.net.ParseException;
+ field public static final String MAILTO_SCHEME = "mailto:";
}
public class Network implements android.os.Parcelable {
@@ -28569,8 +28791,8 @@ package android.net {
method public void bindSocket(java.io.FileDescriptor) throws java.io.IOException;
method public int describeContents();
method public static android.net.Network fromNetworkHandle(long);
- method public java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
- method public java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
+ method public java.net.InetAddress[] getAllByName(String) throws java.net.UnknownHostException;
+ method public java.net.InetAddress getByName(String) throws java.net.UnknownHostException;
method public long getNetworkHandle();
method public javax.net.SocketFactory getSocketFactory();
method public java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
@@ -28584,7 +28806,7 @@ package android.net {
method public int describeContents();
method public int getLinkDownstreamBandwidthKbps();
method public int getLinkUpstreamBandwidthKbps();
- method public android.net.TransportInfo getTransportInfo();
+ method @Nullable public android.net.TransportInfo getTransportInfo();
method public boolean hasCapability(int);
method public boolean hasTransport(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -28620,52 +28842,48 @@ package android.net {
field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
}
- public deprecated class NetworkInfo implements android.os.Parcelable {
- method public int describeContents();
- method public deprecated android.net.NetworkInfo.DetailedState getDetailedState();
- method public deprecated java.lang.String getExtraInfo();
- method public deprecated java.lang.String getReason();
- method public deprecated android.net.NetworkInfo.State getState();
- method public deprecated int getSubtype();
- method public deprecated java.lang.String getSubtypeName();
- method public deprecated int getType();
- method public deprecated java.lang.String getTypeName();
- method public deprecated boolean isAvailable();
- method public deprecated boolean isConnected();
- method public deprecated boolean isConnectedOrConnecting();
- method public deprecated boolean isFailover();
- method public deprecated boolean isRoaming();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR;
- }
-
- public static final deprecated class NetworkInfo.DetailedState extends java.lang.Enum {
- method public static android.net.NetworkInfo.DetailedState valueOf(java.lang.String);
- method public static final android.net.NetworkInfo.DetailedState[] values();
- enum_constant public static final android.net.NetworkInfo.DetailedState AUTHENTICATING;
- enum_constant public static final android.net.NetworkInfo.DetailedState BLOCKED;
- enum_constant public static final android.net.NetworkInfo.DetailedState CAPTIVE_PORTAL_CHECK;
- enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTED;
- enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTING;
- enum_constant public static final android.net.NetworkInfo.DetailedState DISCONNECTED;
- enum_constant public static final android.net.NetworkInfo.DetailedState DISCONNECTING;
- enum_constant public static final android.net.NetworkInfo.DetailedState FAILED;
- enum_constant public static final android.net.NetworkInfo.DetailedState IDLE;
- enum_constant public static final android.net.NetworkInfo.DetailedState OBTAINING_IPADDR;
- enum_constant public static final android.net.NetworkInfo.DetailedState SCANNING;
- enum_constant public static final android.net.NetworkInfo.DetailedState SUSPENDED;
- enum_constant public static final android.net.NetworkInfo.DetailedState VERIFYING_POOR_LINK;
- }
-
- public static final deprecated class NetworkInfo.State extends java.lang.Enum {
- method public static android.net.NetworkInfo.State valueOf(java.lang.String);
- method public static final android.net.NetworkInfo.State[] values();
- enum_constant public static final android.net.NetworkInfo.State CONNECTED;
- enum_constant public static final android.net.NetworkInfo.State CONNECTING;
- enum_constant public static final android.net.NetworkInfo.State DISCONNECTED;
- enum_constant public static final android.net.NetworkInfo.State DISCONNECTING;
- enum_constant public static final android.net.NetworkInfo.State SUSPENDED;
- enum_constant public static final android.net.NetworkInfo.State UNKNOWN;
+ @Deprecated public class NetworkInfo implements android.os.Parcelable {
+ method @Deprecated public int describeContents();
+ method @Deprecated public android.net.NetworkInfo.DetailedState getDetailedState();
+ method @Deprecated public String getExtraInfo();
+ method @Deprecated public String getReason();
+ method @Deprecated public android.net.NetworkInfo.State getState();
+ method @Deprecated public int getSubtype();
+ method @Deprecated public String getSubtypeName();
+ method @Deprecated public int getType();
+ method @Deprecated public String getTypeName();
+ method @Deprecated public boolean isAvailable();
+ method @Deprecated public boolean isConnected();
+ method @Deprecated public boolean isConnectedOrConnecting();
+ method @Deprecated public boolean isFailover();
+ method @Deprecated public boolean isRoaming();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR;
+ }
+
+ @Deprecated public enum NetworkInfo.DetailedState {
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState AUTHENTICATING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState BLOCKED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CAPTIVE_PORTAL_CHECK;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState DISCONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState DISCONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState FAILED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState IDLE;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState OBTAINING_IPADDR;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState SCANNING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState SUSPENDED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState VERIFYING_POOR_LINK;
+ }
+
+ @Deprecated public enum NetworkInfo.State {
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State CONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State CONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State DISCONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State DISCONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State SUSPENDED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State UNKNOWN;
}
public class NetworkRequest implements android.os.Parcelable {
@@ -28683,7 +28901,7 @@ package android.net {
method public android.net.NetworkRequest build();
method public android.net.NetworkRequest.Builder removeCapability(int);
method public android.net.NetworkRequest.Builder removeTransportType(int);
- method public android.net.NetworkRequest.Builder setNetworkSpecifier(java.lang.String);
+ method public android.net.NetworkRequest.Builder setNetworkSpecifier(String);
method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier);
}
@@ -28691,26 +28909,26 @@ package android.net {
}
public class ParseException extends java.lang.RuntimeException {
- field public java.lang.String response;
+ field public String response;
}
public final class Proxy {
ctor public Proxy();
- method public static deprecated java.lang.String getDefaultHost();
- method public static deprecated int getDefaultPort();
- method public static deprecated java.lang.String getHost(android.content.Context);
- method public static deprecated int getPort(android.content.Context);
- field public static final deprecated java.lang.String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
- field public static final java.lang.String PROXY_CHANGE_ACTION = "android.intent.action.PROXY_CHANGE";
+ method @Deprecated public static String getDefaultHost();
+ method @Deprecated public static int getDefaultPort();
+ method @Deprecated public static String getHost(android.content.Context);
+ method @Deprecated public static int getPort(android.content.Context);
+ field @Deprecated public static final String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
+ field public static final String PROXY_CHANGE_ACTION = "android.intent.action.PROXY_CHANGE";
}
public class ProxyInfo implements android.os.Parcelable {
- method public static android.net.ProxyInfo buildDirectProxy(java.lang.String, int);
- method public static android.net.ProxyInfo buildDirectProxy(java.lang.String, int, java.util.List<java.lang.String>);
+ method public static android.net.ProxyInfo buildDirectProxy(String, int);
+ method public static android.net.ProxyInfo buildDirectProxy(String, int, java.util.List<java.lang.String>);
method public static android.net.ProxyInfo buildPacProxy(android.net.Uri);
method public int describeContents();
- method public java.lang.String[] getExclusionList();
- method public java.lang.String getHost();
+ method public String[] getExclusionList();
+ method public String getHost();
method public android.net.Uri getPacFileUrl();
method public int getPort();
method public void writeToParcel(android.os.Parcel, int);
@@ -28721,7 +28939,8 @@ package android.net {
method public int describeContents();
method public android.net.IpPrefix getDestination();
method public java.net.InetAddress getGateway();
- method public java.lang.String getInterface();
+ method public String getInterface();
+ method public boolean hasGateway();
method public boolean isDefaultRoute();
method public boolean matches(java.net.InetAddress);
method public void writeToParcel(android.os.Parcel, int);
@@ -28729,19 +28948,19 @@ package android.net {
}
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
- ctor public deprecated SSLCertificateSocketFactory(int);
- method public java.net.Socket createSocket(java.net.Socket, java.lang.String, int, boolean) throws java.io.IOException;
+ ctor @Deprecated public SSLCertificateSocketFactory(int);
+ method public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException;
method public java.net.Socket createSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
method public java.net.Socket createSocket(java.net.InetAddress, int) throws java.io.IOException;
- method public java.net.Socket createSocket(java.lang.String, int, java.net.InetAddress, int) throws java.io.IOException;
- method public java.net.Socket createSocket(java.lang.String, int) throws java.io.IOException;
+ method public java.net.Socket createSocket(String, int, java.net.InetAddress, int) throws java.io.IOException;
+ method public java.net.Socket createSocket(String, int) throws java.io.IOException;
method public static javax.net.SocketFactory getDefault(int);
method public static javax.net.ssl.SSLSocketFactory getDefault(int, android.net.SSLSessionCache);
- method public java.lang.String[] getDefaultCipherSuites();
+ method public String[] getDefaultCipherSuites();
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
method public byte[] getNpnSelectedProtocol(java.net.Socket);
- method public java.lang.String[] getSupportedCipherSuites();
- method public void setHostname(java.net.Socket, java.lang.String);
+ method public String[] getSupportedCipherSuites();
+ method public void setHostname(java.net.Socket, String);
method public void setKeyManagers(javax.net.ssl.KeyManager[]);
method public void setNpnProtocols(byte[][]);
method public void setTrustManagers(javax.net.ssl.TrustManager[]);
@@ -28770,16 +28989,16 @@ package android.net {
method public static long getTotalTxPackets();
method public static long getUidRxBytes(int);
method public static long getUidRxPackets(int);
- method public static deprecated long getUidTcpRxBytes(int);
- method public static deprecated long getUidTcpRxSegments(int);
- method public static deprecated long getUidTcpTxBytes(int);
- method public static deprecated long getUidTcpTxSegments(int);
+ method @Deprecated public static long getUidTcpRxBytes(int);
+ method @Deprecated public static long getUidTcpRxSegments(int);
+ method @Deprecated public static long getUidTcpTxBytes(int);
+ method @Deprecated public static long getUidTcpTxSegments(int);
method public static long getUidTxBytes(int);
method public static long getUidTxPackets(int);
- method public static deprecated long getUidUdpRxBytes(int);
- method public static deprecated long getUidUdpRxPackets(int);
- method public static deprecated long getUidUdpTxBytes(int);
- method public static deprecated long getUidUdpTxPackets(int);
+ method @Deprecated public static long getUidUdpRxBytes(int);
+ method @Deprecated public static long getUidUdpRxPackets(int);
+ method @Deprecated public static long getUidUdpTxBytes(int);
+ method @Deprecated public static long getUidUdpTxPackets(int);
method public static void incrementOperationCount(int);
method public static void incrementOperationCount(int, int);
method public static void setThreadStatsTag(int);
@@ -28793,47 +29012,47 @@ package android.net {
field public static final int UNSUPPORTED = -1; // 0xffffffff
}
- public abstract interface TransportInfo {
+ public interface TransportInfo {
}
- public abstract class Uri implements java.lang.Comparable android.os.Parcelable {
+ public abstract class Uri implements java.lang.Comparable<android.net.Uri> android.os.Parcelable {
method public abstract android.net.Uri.Builder buildUpon();
method public int compareTo(android.net.Uri);
- method public static java.lang.String decode(java.lang.String);
- method public static java.lang.String encode(java.lang.String);
- method public static java.lang.String encode(java.lang.String, java.lang.String);
+ method public static String decode(String);
+ method public static String encode(String);
+ method public static String encode(String, String);
method public static android.net.Uri fromFile(java.io.File);
- method public static android.net.Uri fromParts(java.lang.String, java.lang.String, java.lang.String);
- method public abstract java.lang.String getAuthority();
- method public boolean getBooleanQueryParameter(java.lang.String, boolean);
- method public abstract java.lang.String getEncodedAuthority();
- method public abstract java.lang.String getEncodedFragment();
- method public abstract java.lang.String getEncodedPath();
- method public abstract java.lang.String getEncodedQuery();
- method public abstract java.lang.String getEncodedSchemeSpecificPart();
- method public abstract java.lang.String getEncodedUserInfo();
- method public abstract java.lang.String getFragment();
- method public abstract java.lang.String getHost();
- method public abstract java.lang.String getLastPathSegment();
- method public abstract java.lang.String getPath();
+ method public static android.net.Uri fromParts(String, String, String);
+ method @Nullable public abstract String getAuthority();
+ method public boolean getBooleanQueryParameter(String, boolean);
+ method @Nullable public abstract String getEncodedAuthority();
+ method @Nullable public abstract String getEncodedFragment();
+ method @Nullable public abstract String getEncodedPath();
+ method @Nullable public abstract String getEncodedQuery();
+ method public abstract String getEncodedSchemeSpecificPart();
+ method @Nullable public abstract String getEncodedUserInfo();
+ method @Nullable public abstract String getFragment();
+ method @Nullable public abstract String getHost();
+ method @Nullable public abstract String getLastPathSegment();
+ method @Nullable public abstract String getPath();
method public abstract java.util.List<java.lang.String> getPathSegments();
method public abstract int getPort();
- method public abstract java.lang.String getQuery();
- method public java.lang.String getQueryParameter(java.lang.String);
+ method @Nullable public abstract String getQuery();
+ method @Nullable public String getQueryParameter(String);
method public java.util.Set<java.lang.String> getQueryParameterNames();
- method public java.util.List<java.lang.String> getQueryParameters(java.lang.String);
- method public abstract java.lang.String getScheme();
- method public abstract java.lang.String getSchemeSpecificPart();
- method public abstract java.lang.String getUserInfo();
+ method public java.util.List<java.lang.String> getQueryParameters(String);
+ method @Nullable public abstract String getScheme();
+ method public abstract String getSchemeSpecificPart();
+ method @Nullable public abstract String getUserInfo();
method public boolean isAbsolute();
method public abstract boolean isHierarchical();
method public boolean isOpaque();
method public abstract boolean isRelative();
method public android.net.Uri normalizeScheme();
- method public static android.net.Uri parse(java.lang.String);
- method public java.lang.String toSafeString();
- method public abstract java.lang.String toString();
- method public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
+ method public static android.net.Uri parse(String);
+ method public String toSafeString();
+ method public abstract String toString();
+ method public static android.net.Uri withAppendedPath(android.net.Uri, String);
method public static void writeToParcel(android.os.Parcel, android.net.Uri);
field public static final android.os.Parcelable.Creator<android.net.Uri> CREATOR;
field public static final android.net.Uri EMPTY;
@@ -28841,28 +29060,28 @@ package android.net {
public static final class Uri.Builder {
ctor public Uri.Builder();
- method public android.net.Uri.Builder appendEncodedPath(java.lang.String);
- method public android.net.Uri.Builder appendPath(java.lang.String);
- method public android.net.Uri.Builder appendQueryParameter(java.lang.String, java.lang.String);
- method public android.net.Uri.Builder authority(java.lang.String);
+ method public android.net.Uri.Builder appendEncodedPath(String);
+ method public android.net.Uri.Builder appendPath(String);
+ method public android.net.Uri.Builder appendQueryParameter(String, String);
+ method public android.net.Uri.Builder authority(String);
method public android.net.Uri build();
method public android.net.Uri.Builder clearQuery();
- method public android.net.Uri.Builder encodedAuthority(java.lang.String);
- method public android.net.Uri.Builder encodedFragment(java.lang.String);
- method public android.net.Uri.Builder encodedOpaquePart(java.lang.String);
- method public android.net.Uri.Builder encodedPath(java.lang.String);
- method public android.net.Uri.Builder encodedQuery(java.lang.String);
- method public android.net.Uri.Builder fragment(java.lang.String);
- method public android.net.Uri.Builder opaquePart(java.lang.String);
- method public android.net.Uri.Builder path(java.lang.String);
- method public android.net.Uri.Builder query(java.lang.String);
- method public android.net.Uri.Builder scheme(java.lang.String);
+ method public android.net.Uri.Builder encodedAuthority(String);
+ method public android.net.Uri.Builder encodedFragment(String);
+ method public android.net.Uri.Builder encodedOpaquePart(String);
+ method public android.net.Uri.Builder encodedPath(String);
+ method public android.net.Uri.Builder encodedQuery(String);
+ method public android.net.Uri.Builder fragment(String);
+ method public android.net.Uri.Builder opaquePart(String);
+ method public android.net.Uri.Builder path(String);
+ method public android.net.Uri.Builder query(String);
+ method public android.net.Uri.Builder scheme(String);
}
public class UrlQuerySanitizer {
ctor public UrlQuerySanitizer();
- ctor public UrlQuerySanitizer(java.lang.String);
- method protected void addSanitizedEntry(java.lang.String, java.lang.String);
+ ctor public UrlQuerySanitizer(String);
+ method protected void addSanitizedEntry(String, String);
method protected void clear();
method protected int decodeHexDigit(char);
method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAllButNulAndAngleBracketsLegal();
@@ -28872,7 +29091,7 @@ package android.net {
method public boolean getAllowUnregisteredParamaters();
method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAmpAndSpaceLegal();
method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAmpLegal();
- method public android.net.UrlQuerySanitizer.ValueSanitizer getEffectiveValueSanitizer(java.lang.String);
+ method public android.net.UrlQuerySanitizer.ValueSanitizer getEffectiveValueSanitizer(String);
method public java.util.List<android.net.UrlQuerySanitizer.ParameterValuePair> getParameterList();
method public java.util.Set<java.lang.String> getParameterSet();
method public boolean getPreferFirstRepeatedParameter();
@@ -28880,24 +29099,24 @@ package android.net {
method public android.net.UrlQuerySanitizer.ValueSanitizer getUnregisteredParameterValueSanitizer();
method public static final android.net.UrlQuerySanitizer.ValueSanitizer getUrlAndSpaceLegal();
method public static final android.net.UrlQuerySanitizer.ValueSanitizer getUrlLegal();
- method public java.lang.String getValue(java.lang.String);
- method public android.net.UrlQuerySanitizer.ValueSanitizer getValueSanitizer(java.lang.String);
- method public boolean hasParameter(java.lang.String);
+ method public String getValue(String);
+ method public android.net.UrlQuerySanitizer.ValueSanitizer getValueSanitizer(String);
+ method public boolean hasParameter(String);
method protected boolean isHexDigit(char);
- method protected void parseEntry(java.lang.String, java.lang.String);
- method public void parseQuery(java.lang.String);
- method public void parseUrl(java.lang.String);
- method public void registerParameter(java.lang.String, android.net.UrlQuerySanitizer.ValueSanitizer);
- method public void registerParameters(java.lang.String[], android.net.UrlQuerySanitizer.ValueSanitizer);
+ method protected void parseEntry(String, String);
+ method public void parseQuery(String);
+ method public void parseUrl(String);
+ method public void registerParameter(String, android.net.UrlQuerySanitizer.ValueSanitizer);
+ method public void registerParameters(String[], android.net.UrlQuerySanitizer.ValueSanitizer);
method public void setAllowUnregisteredParamaters(boolean);
method public void setPreferFirstRepeatedParameter(boolean);
method public void setUnregisteredParameterValueSanitizer(android.net.UrlQuerySanitizer.ValueSanitizer);
- method public java.lang.String unescape(java.lang.String);
+ method public String unescape(String);
}
public static class UrlQuerySanitizer.IllegalCharacterValueSanitizer implements android.net.UrlQuerySanitizer.ValueSanitizer {
ctor public UrlQuerySanitizer.IllegalCharacterValueSanitizer(int);
- method public java.lang.String sanitize(java.lang.String);
+ method public String sanitize(String);
field public static final int ALL_BUT_NUL_AND_ANGLE_BRACKETS_LEGAL = 1439; // 0x59f
field public static final int ALL_BUT_NUL_LEGAL = 1535; // 0x5ff
field public static final int ALL_BUT_WHITESPACE_LEGAL = 1532; // 0x5fc
@@ -28923,13 +29142,13 @@ package android.net {
}
public class UrlQuerySanitizer.ParameterValuePair {
- ctor public UrlQuerySanitizer.ParameterValuePair(java.lang.String, java.lang.String);
- field public java.lang.String mParameter;
- field public java.lang.String mValue;
+ ctor public UrlQuerySanitizer.ParameterValuePair(String, String);
+ field public String mParameter;
+ field public String mValue;
}
- public static abstract interface UrlQuerySanitizer.ValueSanitizer {
- method public abstract java.lang.String sanitize(java.lang.String);
+ public static interface UrlQuerySanitizer.ValueSanitizer {
+ method public String sanitize(String);
}
public class VpnService extends android.app.Service {
@@ -28941,28 +29160,28 @@ package android.net {
method public boolean protect(java.net.Socket);
method public boolean protect(java.net.DatagramSocket);
method public boolean setUnderlyingNetworks(android.net.Network[]);
- field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService";
- field public static final java.lang.String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON";
+ field public static final String SERVICE_INTERFACE = "android.net.VpnService";
+ field public static final String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON";
}
public class VpnService.Builder {
ctor public VpnService.Builder();
method public android.net.VpnService.Builder addAddress(java.net.InetAddress, int);
- method public android.net.VpnService.Builder addAddress(java.lang.String, int);
- method public android.net.VpnService.Builder addAllowedApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.net.VpnService.Builder addDisallowedApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.net.VpnService.Builder addAddress(String, int);
+ method public android.net.VpnService.Builder addAllowedApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.net.VpnService.Builder addDisallowedApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.net.VpnService.Builder addDnsServer(java.net.InetAddress);
- method public android.net.VpnService.Builder addDnsServer(java.lang.String);
+ method public android.net.VpnService.Builder addDnsServer(String);
method public android.net.VpnService.Builder addRoute(java.net.InetAddress, int);
- method public android.net.VpnService.Builder addRoute(java.lang.String, int);
- method public android.net.VpnService.Builder addSearchDomain(java.lang.String);
+ method public android.net.VpnService.Builder addRoute(String, int);
+ method public android.net.VpnService.Builder addSearchDomain(String);
method public android.net.VpnService.Builder allowBypass();
method public android.net.VpnService.Builder allowFamily(int);
method public android.os.ParcelFileDescriptor establish();
method public android.net.VpnService.Builder setBlocking(boolean);
method public android.net.VpnService.Builder setConfigureIntent(android.app.PendingIntent);
method public android.net.VpnService.Builder setMtu(int);
- method public android.net.VpnService.Builder setSession(java.lang.String);
+ method public android.net.VpnService.Builder setSession(String);
method public android.net.VpnService.Builder setUnderlyingNetworks(android.net.Network[]);
}
@@ -28974,26 +29193,26 @@ package android.net.http {
method public void close() throws java.io.IOException;
method public void delete() throws java.io.IOException;
method public void flush();
- method public java.net.CacheResponse get(java.net.URI, java.lang.String, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public java.net.CacheResponse get(java.net.URI, String, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
method public int getHitCount();
method public static android.net.http.HttpResponseCache getInstalled();
method public int getNetworkCount();
method public int getRequestCount();
- method public static synchronized android.net.http.HttpResponseCache install(java.io.File, long) throws java.io.IOException;
+ method public static android.net.http.HttpResponseCache install(java.io.File, long) throws java.io.IOException;
method public long maxSize();
method public java.net.CacheRequest put(java.net.URI, java.net.URLConnection) throws java.io.IOException;
method public long size();
}
public class SslCertificate {
- ctor public deprecated SslCertificate(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- ctor public deprecated SslCertificate(java.lang.String, java.lang.String, java.util.Date, java.util.Date);
+ ctor @Deprecated public SslCertificate(String, String, String, String);
+ ctor @Deprecated public SslCertificate(String, String, java.util.Date, java.util.Date);
ctor public SslCertificate(java.security.cert.X509Certificate);
method public android.net.http.SslCertificate.DName getIssuedBy();
method public android.net.http.SslCertificate.DName getIssuedTo();
- method public deprecated java.lang.String getValidNotAfter();
+ method @Deprecated public String getValidNotAfter();
method public java.util.Date getValidNotAfterDate();
- method public deprecated java.lang.String getValidNotBefore();
+ method @Deprecated public String getValidNotBefore();
method public java.util.Date getValidNotBeforeDate();
method public java.security.cert.X509Certificate getX509Certificate();
method public static android.net.http.SslCertificate restoreState(android.os.Bundle);
@@ -29001,36 +29220,36 @@ package android.net.http {
}
public class SslCertificate.DName {
- ctor public SslCertificate.DName(java.lang.String);
- method public java.lang.String getCName();
- method public java.lang.String getDName();
- method public java.lang.String getOName();
- method public java.lang.String getUName();
+ ctor public SslCertificate.DName(String);
+ method public String getCName();
+ method public String getDName();
+ method public String getOName();
+ method public String getUName();
}
public class SslError {
- ctor public deprecated SslError(int, android.net.http.SslCertificate);
- ctor public deprecated SslError(int, java.security.cert.X509Certificate);
- ctor public SslError(int, android.net.http.SslCertificate, java.lang.String);
- ctor public SslError(int, java.security.cert.X509Certificate, java.lang.String);
+ ctor @Deprecated public SslError(int, android.net.http.SslCertificate);
+ ctor @Deprecated public SslError(int, java.security.cert.X509Certificate);
+ ctor public SslError(int, android.net.http.SslCertificate, String);
+ ctor public SslError(int, java.security.cert.X509Certificate, String);
method public boolean addError(int);
method public android.net.http.SslCertificate getCertificate();
method public int getPrimaryError();
- method public java.lang.String getUrl();
+ method public String getUrl();
method public boolean hasError(int);
field public static final int SSL_DATE_INVALID = 4; // 0x4
field public static final int SSL_EXPIRED = 1; // 0x1
field public static final int SSL_IDMISMATCH = 2; // 0x2
field public static final int SSL_INVALID = 5; // 0x5
- field public static final deprecated int SSL_MAX_ERROR = 6; // 0x6
+ field @Deprecated public static final int SSL_MAX_ERROR = 6; // 0x6
field public static final int SSL_NOTYETVALID = 0; // 0x0
field public static final int SSL_UNTRUSTED = 3; // 0x3
}
public class X509TrustManagerExtensions {
ctor public X509TrustManagerExtensions(javax.net.ssl.X509TrustManager) throws java.lang.IllegalArgumentException;
- method public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, java.lang.String) throws java.security.cert.CertificateException;
- method public boolean isSameTrustConfiguration(java.lang.String, java.lang.String);
+ method public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(java.security.cert.X509Certificate[], String, String) throws java.security.cert.CertificateException;
+ method public boolean isSameTrustConfiguration(String, String);
method public boolean isUserAddedCertificate(java.security.cert.X509Certificate);
}
@@ -29039,13 +29258,13 @@ package android.net.http {
package android.net.nsd {
public final class NsdManager {
- method public void discoverServices(java.lang.String, int, android.net.nsd.NsdManager.DiscoveryListener);
+ method public void discoverServices(String, int, android.net.nsd.NsdManager.DiscoveryListener);
method public void registerService(android.net.nsd.NsdServiceInfo, int, android.net.nsd.NsdManager.RegistrationListener);
method public void resolveService(android.net.nsd.NsdServiceInfo, android.net.nsd.NsdManager.ResolveListener);
method public void stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener);
method public void unregisterService(android.net.nsd.NsdManager.RegistrationListener);
- field public static final java.lang.String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED";
- field public static final java.lang.String EXTRA_NSD_STATE = "nsd_state";
+ field public static final String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED";
+ field public static final String EXTRA_NSD_STATE = "nsd_state";
field public static final int FAILURE_ALREADY_ACTIVE = 3; // 0x3
field public static final int FAILURE_INTERNAL_ERROR = 0; // 0x0
field public static final int FAILURE_MAX_LIMIT = 4; // 0x4
@@ -29054,41 +29273,41 @@ package android.net.nsd {
field public static final int PROTOCOL_DNS_SD = 1; // 0x1
}
- public static abstract interface NsdManager.DiscoveryListener {
- method public abstract void onDiscoveryStarted(java.lang.String);
- method public abstract void onDiscoveryStopped(java.lang.String);
- method public abstract void onServiceFound(android.net.nsd.NsdServiceInfo);
- method public abstract void onServiceLost(android.net.nsd.NsdServiceInfo);
- method public abstract void onStartDiscoveryFailed(java.lang.String, int);
- method public abstract void onStopDiscoveryFailed(java.lang.String, int);
+ public static interface NsdManager.DiscoveryListener {
+ method public void onDiscoveryStarted(String);
+ method public void onDiscoveryStopped(String);
+ method public void onServiceFound(android.net.nsd.NsdServiceInfo);
+ method public void onServiceLost(android.net.nsd.NsdServiceInfo);
+ method public void onStartDiscoveryFailed(String, int);
+ method public void onStopDiscoveryFailed(String, int);
}
- public static abstract interface NsdManager.RegistrationListener {
- method public abstract void onRegistrationFailed(android.net.nsd.NsdServiceInfo, int);
- method public abstract void onServiceRegistered(android.net.nsd.NsdServiceInfo);
- method public abstract void onServiceUnregistered(android.net.nsd.NsdServiceInfo);
- method public abstract void onUnregistrationFailed(android.net.nsd.NsdServiceInfo, int);
+ public static interface NsdManager.RegistrationListener {
+ method public void onRegistrationFailed(android.net.nsd.NsdServiceInfo, int);
+ method public void onServiceRegistered(android.net.nsd.NsdServiceInfo);
+ method public void onServiceUnregistered(android.net.nsd.NsdServiceInfo);
+ method public void onUnregistrationFailed(android.net.nsd.NsdServiceInfo, int);
}
- public static abstract interface NsdManager.ResolveListener {
- method public abstract void onResolveFailed(android.net.nsd.NsdServiceInfo, int);
- method public abstract void onServiceResolved(android.net.nsd.NsdServiceInfo);
+ public static interface NsdManager.ResolveListener {
+ method public void onResolveFailed(android.net.nsd.NsdServiceInfo, int);
+ method public void onServiceResolved(android.net.nsd.NsdServiceInfo);
}
public final class NsdServiceInfo implements android.os.Parcelable {
ctor public NsdServiceInfo();
method public int describeContents();
- method public java.util.Map<java.lang.String, byte[]> getAttributes();
+ method public java.util.Map<java.lang.String,byte[]> getAttributes();
method public java.net.InetAddress getHost();
method public int getPort();
- method public java.lang.String getServiceName();
- method public java.lang.String getServiceType();
- method public void removeAttribute(java.lang.String);
- method public void setAttribute(java.lang.String, java.lang.String);
+ method public String getServiceName();
+ method public String getServiceType();
+ method public void removeAttribute(String);
+ method public void setAttribute(String, String);
method public void setHost(java.net.InetAddress);
method public void setPort(int);
- method public void setServiceName(java.lang.String);
- method public void setServiceType(java.lang.String);
+ method public void setServiceName(String);
+ method public void setServiceType(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.nsd.NsdServiceInfo> CREATOR;
}
@@ -29098,15 +29317,15 @@ package android.net.nsd {
package android.net.rtp {
public class AudioCodec {
- method public static android.net.rtp.AudioCodec getCodec(int, java.lang.String, java.lang.String);
+ method public static android.net.rtp.AudioCodec getCodec(int, String, String);
method public static android.net.rtp.AudioCodec[] getCodecs();
field public static final android.net.rtp.AudioCodec AMR;
field public static final android.net.rtp.AudioCodec GSM;
field public static final android.net.rtp.AudioCodec GSM_EFR;
field public static final android.net.rtp.AudioCodec PCMA;
field public static final android.net.rtp.AudioCodec PCMU;
- field public final java.lang.String fmtp;
- field public final java.lang.String rtpmap;
+ field public final String fmtp;
+ field public final String rtpmap;
field public final int type;
}
@@ -29156,7 +29375,7 @@ package android.net.sip {
public class SipAudioCall {
ctor public SipAudioCall(android.content.Context, android.net.sip.SipProfile);
method public void answerCall(int) throws android.net.sip.SipException;
- method public void attachCall(android.net.sip.SipSession, java.lang.String) throws android.net.sip.SipException;
+ method public void attachCall(android.net.sip.SipSession, String) throws android.net.sip.SipException;
method public void close();
method public void continueCall(int) throws android.net.sip.SipException;
method public void endCall() throws android.net.sip.SipException;
@@ -29185,14 +29404,14 @@ package android.net.sip {
method public void onCallHeld(android.net.sip.SipAudioCall);
method public void onCalling(android.net.sip.SipAudioCall);
method public void onChanged(android.net.sip.SipAudioCall);
- method public void onError(android.net.sip.SipAudioCall, int, java.lang.String);
+ method public void onError(android.net.sip.SipAudioCall, int, String);
method public void onReadyToCall(android.net.sip.SipAudioCall);
method public void onRinging(android.net.sip.SipAudioCall, android.net.sip.SipProfile);
method public void onRingingBack(android.net.sip.SipAudioCall);
}
public class SipErrorCode {
- method public static java.lang.String toString(int);
+ method public static String toString(int);
field public static final int CLIENT_ERROR = -4; // 0xfffffffc
field public static final int CROSS_DOMAIN_AUTHENTICATION = -11; // 0xfffffff5
field public static final int DATA_CONNECTION_LOST = -10; // 0xfffffff6
@@ -29210,87 +29429,87 @@ package android.net.sip {
public class SipException extends java.lang.Exception {
ctor public SipException();
- ctor public SipException(java.lang.String);
- ctor public SipException(java.lang.String, java.lang.Throwable);
+ ctor public SipException(String);
+ ctor public SipException(String, Throwable);
}
public class SipManager {
- method public void close(java.lang.String) throws android.net.sip.SipException;
+ method public void close(String) throws android.net.sip.SipException;
method public android.net.sip.SipSession createSipSession(android.net.sip.SipProfile, android.net.sip.SipSession.Listener) throws android.net.sip.SipException;
- method public static java.lang.String getCallId(android.content.Intent);
- method public static java.lang.String getOfferSessionDescription(android.content.Intent);
+ method public static String getCallId(android.content.Intent);
+ method public static String getOfferSessionDescription(android.content.Intent);
method public android.net.sip.SipSession getSessionFor(android.content.Intent) throws android.net.sip.SipException;
method public static boolean isApiSupported(android.content.Context);
method public static boolean isIncomingCallIntent(android.content.Intent);
- method public boolean isOpened(java.lang.String) throws android.net.sip.SipException;
- method public boolean isRegistered(java.lang.String) throws android.net.sip.SipException;
+ method public boolean isOpened(String) throws android.net.sip.SipException;
+ method public boolean isRegistered(String) throws android.net.sip.SipException;
method public static boolean isSipWifiOnly(android.content.Context);
method public static boolean isVoipSupported(android.content.Context);
method public android.net.sip.SipAudioCall makeAudioCall(android.net.sip.SipProfile, android.net.sip.SipProfile, android.net.sip.SipAudioCall.Listener, int) throws android.net.sip.SipException;
- method public android.net.sip.SipAudioCall makeAudioCall(java.lang.String, java.lang.String, android.net.sip.SipAudioCall.Listener, int) throws android.net.sip.SipException;
+ method public android.net.sip.SipAudioCall makeAudioCall(String, String, android.net.sip.SipAudioCall.Listener, int) throws android.net.sip.SipException;
method public static android.net.sip.SipManager newInstance(android.content.Context);
method public void open(android.net.sip.SipProfile) throws android.net.sip.SipException;
method public void open(android.net.sip.SipProfile, android.app.PendingIntent, android.net.sip.SipRegistrationListener) throws android.net.sip.SipException;
method public void register(android.net.sip.SipProfile, int, android.net.sip.SipRegistrationListener) throws android.net.sip.SipException;
- method public void setRegistrationListener(java.lang.String, android.net.sip.SipRegistrationListener) throws android.net.sip.SipException;
+ method public void setRegistrationListener(String, android.net.sip.SipRegistrationListener) throws android.net.sip.SipException;
method public android.net.sip.SipAudioCall takeAudioCall(android.content.Intent, android.net.sip.SipAudioCall.Listener) throws android.net.sip.SipException;
method public void unregister(android.net.sip.SipProfile, android.net.sip.SipRegistrationListener) throws android.net.sip.SipException;
- field public static final java.lang.String EXTRA_CALL_ID = "android:sipCallID";
- field public static final java.lang.String EXTRA_OFFER_SD = "android:sipOfferSD";
+ field public static final String EXTRA_CALL_ID = "android:sipCallID";
+ field public static final String EXTRA_OFFER_SD = "android:sipOfferSD";
field public static final int INCOMING_CALL_RESULT_CODE = 101; // 0x65
}
public class SipProfile implements java.lang.Cloneable android.os.Parcelable java.io.Serializable {
method public int describeContents();
- method public java.lang.String getAuthUserName();
+ method public String getAuthUserName();
method public boolean getAutoRegistration();
- method public java.lang.String getDisplayName();
- method public java.lang.String getPassword();
+ method public String getDisplayName();
+ method public String getPassword();
method public int getPort();
- method public java.lang.String getProfileName();
- method public java.lang.String getProtocol();
- method public java.lang.String getProxyAddress();
+ method public String getProfileName();
+ method public String getProtocol();
+ method public String getProxyAddress();
method public boolean getSendKeepAlive();
- method public java.lang.String getSipDomain();
- method public java.lang.String getUriString();
- method public java.lang.String getUserName();
+ method public String getSipDomain();
+ method public String getUriString();
+ method public String getUserName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.sip.SipProfile> CREATOR;
}
public static class SipProfile.Builder {
ctor public SipProfile.Builder(android.net.sip.SipProfile);
- ctor public SipProfile.Builder(java.lang.String) throws java.text.ParseException;
- ctor public SipProfile.Builder(java.lang.String, java.lang.String) throws java.text.ParseException;
+ ctor public SipProfile.Builder(String) throws java.text.ParseException;
+ ctor public SipProfile.Builder(String, String) throws java.text.ParseException;
method public android.net.sip.SipProfile build();
- method public android.net.sip.SipProfile.Builder setAuthUserName(java.lang.String);
+ method public android.net.sip.SipProfile.Builder setAuthUserName(String);
method public android.net.sip.SipProfile.Builder setAutoRegistration(boolean);
- method public android.net.sip.SipProfile.Builder setDisplayName(java.lang.String);
- method public android.net.sip.SipProfile.Builder setOutboundProxy(java.lang.String);
- method public android.net.sip.SipProfile.Builder setPassword(java.lang.String);
+ method public android.net.sip.SipProfile.Builder setDisplayName(String);
+ method public android.net.sip.SipProfile.Builder setOutboundProxy(String);
+ method public android.net.sip.SipProfile.Builder setPassword(String);
method public android.net.sip.SipProfile.Builder setPort(int) throws java.lang.IllegalArgumentException;
- method public android.net.sip.SipProfile.Builder setProfileName(java.lang.String);
- method public android.net.sip.SipProfile.Builder setProtocol(java.lang.String) throws java.lang.IllegalArgumentException;
+ method public android.net.sip.SipProfile.Builder setProfileName(String);
+ method public android.net.sip.SipProfile.Builder setProtocol(String) throws java.lang.IllegalArgumentException;
method public android.net.sip.SipProfile.Builder setSendKeepAlive(boolean);
}
- public abstract interface SipRegistrationListener {
- method public abstract void onRegistering(java.lang.String);
- method public abstract void onRegistrationDone(java.lang.String, long);
- method public abstract void onRegistrationFailed(java.lang.String, int, java.lang.String);
+ public interface SipRegistrationListener {
+ method public void onRegistering(String);
+ method public void onRegistrationDone(String, long);
+ method public void onRegistrationFailed(String, int, String);
}
public final class SipSession {
- method public void answerCall(java.lang.String, int);
- method public void changeCall(java.lang.String, int);
+ method public void answerCall(String, int);
+ method public void changeCall(String, int);
method public void endCall();
- method public java.lang.String getCallId();
- method public java.lang.String getLocalIp();
+ method public String getCallId();
+ method public String getLocalIp();
method public android.net.sip.SipProfile getLocalProfile();
method public android.net.sip.SipProfile getPeerProfile();
method public int getState();
method public boolean isInCall();
- method public void makeCall(android.net.sip.SipProfile, java.lang.String, int);
+ method public void makeCall(android.net.sip.SipProfile, String, int);
method public void register(int);
method public void setListener(android.net.sip.SipSession.Listener);
method public void unregister();
@@ -29299,21 +29518,21 @@ package android.net.sip {
public static class SipSession.Listener {
ctor public SipSession.Listener();
method public void onCallBusy(android.net.sip.SipSession);
- method public void onCallChangeFailed(android.net.sip.SipSession, int, java.lang.String);
+ method public void onCallChangeFailed(android.net.sip.SipSession, int, String);
method public void onCallEnded(android.net.sip.SipSession);
- method public void onCallEstablished(android.net.sip.SipSession, java.lang.String);
+ method public void onCallEstablished(android.net.sip.SipSession, String);
method public void onCalling(android.net.sip.SipSession);
- method public void onError(android.net.sip.SipSession, int, java.lang.String);
+ method public void onError(android.net.sip.SipSession, int, String);
method public void onRegistering(android.net.sip.SipSession);
method public void onRegistrationDone(android.net.sip.SipSession, int);
- method public void onRegistrationFailed(android.net.sip.SipSession, int, java.lang.String);
+ method public void onRegistrationFailed(android.net.sip.SipSession, int, String);
method public void onRegistrationTimeout(android.net.sip.SipSession);
- method public void onRinging(android.net.sip.SipSession, android.net.sip.SipProfile, java.lang.String);
+ method public void onRinging(android.net.sip.SipSession, android.net.sip.SipProfile, String);
method public void onRingingBack(android.net.sip.SipSession);
}
public static class SipSession.State {
- method public static java.lang.String toString(int);
+ method public static String toString(int);
field public static final int DEREGISTERING = 2; // 0x2
field public static final int INCOMING_CALL = 3; // 0x3
field public static final int INCOMING_CALL_ANSWERING = 4; // 0x4
@@ -29332,13 +29551,13 @@ package android.net.sip {
package android.net.ssl {
public class SSLEngines {
- method public static boolean isSupportedEngine(javax.net.ssl.SSLEngine);
- method public static void setUseSessionTickets(javax.net.ssl.SSLEngine, boolean);
+ method public static boolean isSupportedEngine(@NonNull javax.net.ssl.SSLEngine);
+ method public static void setUseSessionTickets(@NonNull javax.net.ssl.SSLEngine, boolean);
}
public class SSLSockets {
- method public static boolean isSupportedSocket(javax.net.ssl.SSLSocket);
- method public static void setUseSessionTickets(javax.net.ssl.SSLSocket, boolean);
+ method public static boolean isSupportedSocket(@NonNull javax.net.ssl.SSLSocket);
+ method public static void setUseSessionTickets(@NonNull javax.net.ssl.SSLSocket, boolean);
}
}
@@ -29350,29 +29569,27 @@ package android.net.wifi {
method public boolean is80211mcResponder();
method public boolean isPasspointNetwork();
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String BSSID;
+ field public String BSSID;
field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3
field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0
field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1
field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
- field public java.lang.String SSID;
- field public java.lang.String capabilities;
+ field public String SSID;
+ field public String capabilities;
field public int centerFreq0;
field public int centerFreq1;
field public int channelWidth;
field public int frequency;
field public int level;
- field public java.lang.CharSequence operatorFriendlyName;
+ field public CharSequence operatorFriendlyName;
field public long timestamp;
- field public java.lang.CharSequence venueName;
+ field public CharSequence venueName;
}
- public final class SupplicantState extends java.lang.Enum implements android.os.Parcelable {
+ public enum SupplicantState implements android.os.Parcelable {
method public int describeContents();
method public static boolean isValidState(android.net.wifi.SupplicantState);
- method public static android.net.wifi.SupplicantState valueOf(java.lang.String);
- method public static final android.net.wifi.SupplicantState[] values();
method public void writeToParcel(android.os.Parcel, int);
enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED;
enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING;
@@ -29389,127 +29606,128 @@ package android.net.wifi {
enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED;
}
- public deprecated class WifiConfiguration implements android.os.Parcelable {
- ctor public WifiConfiguration();
+ @Deprecated public class WifiConfiguration implements android.os.Parcelable {
+ ctor @Deprecated public WifiConfiguration();
method public int describeContents();
- method public android.net.ProxyInfo getHttpProxy();
- method public boolean isPasspoint();
- method public void setHttpProxy(android.net.ProxyInfo);
+ method @Deprecated public android.net.ProxyInfo getHttpProxy();
+ method @Deprecated @NonNull public android.net.MacAddress getRandomizedMacAddress();
+ method @Deprecated public boolean isPasspoint();
+ method @Deprecated public void setHttpProxy(android.net.ProxyInfo);
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String BSSID;
- field public java.lang.String FQDN;
- field public java.lang.String SSID;
- field public java.util.BitSet allowedAuthAlgorithms;
- field public java.util.BitSet allowedGroupCiphers;
- field public java.util.BitSet allowedGroupMgmtCiphers;
- field public java.util.BitSet allowedKeyManagement;
- field public java.util.BitSet allowedPairwiseCiphers;
- field public java.util.BitSet allowedProtocols;
- field public java.util.BitSet allowedSuiteBCiphers;
- field public android.net.wifi.WifiEnterpriseConfig enterpriseConfig;
- field public boolean hiddenSSID;
- field public boolean isHomeProviderNetwork;
- field public int networkId;
- field public java.lang.String preSharedKey;
- field public deprecated int priority;
- field public java.lang.String providerFriendlyName;
- field public long[] roamingConsortiumIds;
- field public int status;
- field public deprecated java.lang.String[] wepKeys;
- field public deprecated int wepTxKeyIndex;
- }
-
- public static class WifiConfiguration.AuthAlgorithm {
- field public static final int LEAP = 2; // 0x2
- field public static final int OPEN = 0; // 0x0
- field public static final deprecated int SHARED = 1; // 0x1
- field public static final java.lang.String[] strings;
- field public static final java.lang.String varName = "auth_alg";
- }
-
- public static class WifiConfiguration.GroupCipher {
- field public static final int CCMP = 3; // 0x3
- field public static final int GCMP_256 = 5; // 0x5
- field public static final int TKIP = 2; // 0x2
- field public static final deprecated int WEP104 = 1; // 0x1
- field public static final deprecated int WEP40 = 0; // 0x0
- field public static final java.lang.String[] strings;
- field public static final java.lang.String varName = "group";
- }
-
- public static class WifiConfiguration.GroupMgmtCipher {
- field public static final int BIP_CMAC_256 = 0; // 0x0
- field public static final int BIP_GMAC_128 = 1; // 0x1
- field public static final int BIP_GMAC_256 = 2; // 0x2
- }
-
- public static class WifiConfiguration.KeyMgmt {
- field public static final int IEEE8021X = 3; // 0x3
- field public static final int NONE = 0; // 0x0
- field public static final int OWE = 9; // 0x9
- field public static final int SAE = 8; // 0x8
- field public static final int SUITE_B_192 = 10; // 0xa
- field public static final int WPA_EAP = 2; // 0x2
- field public static final int WPA_PSK = 1; // 0x1
- field public static final java.lang.String[] strings;
- field public static final java.lang.String varName = "key_mgmt";
- }
-
- public static class WifiConfiguration.PairwiseCipher {
- field public static final int CCMP = 2; // 0x2
- field public static final int GCMP_256 = 3; // 0x3
- field public static final int NONE = 0; // 0x0
- field public static final deprecated int TKIP = 1; // 0x1
- field public static final java.lang.String[] strings;
- field public static final java.lang.String varName = "pairwise";
- }
-
- public static class WifiConfiguration.Protocol {
- field public static final int RSN = 1; // 0x1
- field public static final deprecated int WPA = 0; // 0x0
- field public static final java.lang.String[] strings;
- field public static final java.lang.String varName = "proto";
- }
-
- public static class WifiConfiguration.Status {
- field public static final int CURRENT = 0; // 0x0
- field public static final int DISABLED = 1; // 0x1
- field public static final int ENABLED = 2; // 0x2
- field public static final java.lang.String[] strings;
+ field @Deprecated public String BSSID;
+ field @Deprecated public String FQDN;
+ field @Deprecated public String SSID;
+ field @Deprecated public java.util.BitSet allowedAuthAlgorithms;
+ field @Deprecated public java.util.BitSet allowedGroupCiphers;
+ field @Deprecated public java.util.BitSet allowedGroupManagementCiphers;
+ field @Deprecated public java.util.BitSet allowedKeyManagement;
+ field @Deprecated public java.util.BitSet allowedPairwiseCiphers;
+ field @Deprecated public java.util.BitSet allowedProtocols;
+ field @Deprecated public java.util.BitSet allowedSuiteBCiphers;
+ field @Deprecated public android.net.wifi.WifiEnterpriseConfig enterpriseConfig;
+ field @Deprecated public boolean hiddenSSID;
+ field @Deprecated public boolean isHomeProviderNetwork;
+ field @Deprecated public int networkId;
+ field @Deprecated public String preSharedKey;
+ field @Deprecated public int priority;
+ field @Deprecated public String providerFriendlyName;
+ field @Deprecated public long[] roamingConsortiumIds;
+ field @Deprecated public int status;
+ field @Deprecated public String[] wepKeys;
+ field @Deprecated public int wepTxKeyIndex;
+ }
+
+ @Deprecated public static class WifiConfiguration.AuthAlgorithm {
+ field @Deprecated public static final int LEAP = 2; // 0x2
+ field @Deprecated public static final int OPEN = 0; // 0x0
+ field @Deprecated public static final int SHARED = 1; // 0x1
+ field @Deprecated public static final String[] strings;
+ field @Deprecated public static final String varName = "auth_alg";
+ }
+
+ @Deprecated public static class WifiConfiguration.GroupCipher {
+ field @Deprecated public static final int CCMP = 3; // 0x3
+ field @Deprecated public static final int GCMP_256 = 5; // 0x5
+ field @Deprecated public static final int TKIP = 2; // 0x2
+ field @Deprecated public static final int WEP104 = 1; // 0x1
+ field @Deprecated public static final int WEP40 = 0; // 0x0
+ field @Deprecated public static final String[] strings;
+ field @Deprecated public static final String varName = "group";
+ }
+
+ @Deprecated public static class WifiConfiguration.GroupMgmtCipher {
+ field @Deprecated public static final int BIP_CMAC_256 = 0; // 0x0
+ field @Deprecated public static final int BIP_GMAC_128 = 1; // 0x1
+ field @Deprecated public static final int BIP_GMAC_256 = 2; // 0x2
+ }
+
+ @Deprecated public static class WifiConfiguration.KeyMgmt {
+ field @Deprecated public static final int IEEE8021X = 3; // 0x3
+ field @Deprecated public static final int NONE = 0; // 0x0
+ field @Deprecated public static final int OWE = 9; // 0x9
+ field @Deprecated public static final int SAE = 8; // 0x8
+ field @Deprecated public static final int SUITE_B_192 = 10; // 0xa
+ field @Deprecated public static final int WPA_EAP = 2; // 0x2
+ field @Deprecated public static final int WPA_PSK = 1; // 0x1
+ field @Deprecated public static final String[] strings;
+ field @Deprecated public static final String varName = "key_mgmt";
+ }
+
+ @Deprecated public static class WifiConfiguration.PairwiseCipher {
+ field @Deprecated public static final int CCMP = 2; // 0x2
+ field @Deprecated public static final int GCMP_256 = 3; // 0x3
+ field @Deprecated public static final int NONE = 0; // 0x0
+ field @Deprecated public static final int TKIP = 1; // 0x1
+ field @Deprecated public static final String[] strings;
+ field @Deprecated public static final String varName = "pairwise";
+ }
+
+ @Deprecated public static class WifiConfiguration.Protocol {
+ field @Deprecated public static final int RSN = 1; // 0x1
+ field @Deprecated public static final int WPA = 0; // 0x0
+ field @Deprecated public static final String[] strings;
+ field @Deprecated public static final String varName = "proto";
+ }
+
+ @Deprecated public static class WifiConfiguration.Status {
+ field @Deprecated public static final int CURRENT = 0; // 0x0
+ field @Deprecated public static final int DISABLED = 1; // 0x1
+ field @Deprecated public static final int ENABLED = 2; // 0x2
+ field @Deprecated public static final String[] strings;
}
public class WifiEnterpriseConfig implements android.os.Parcelable {
ctor public WifiEnterpriseConfig();
ctor public WifiEnterpriseConfig(android.net.wifi.WifiEnterpriseConfig);
method public int describeContents();
- method public java.lang.String getAltSubjectMatch();
- method public java.lang.String getAnonymousIdentity();
- method public java.security.cert.X509Certificate getCaCertificate();
- method public java.security.cert.X509Certificate[] getCaCertificates();
+ method public String getAltSubjectMatch();
+ method public String getAnonymousIdentity();
+ method @Nullable public java.security.cert.X509Certificate getCaCertificate();
+ method @Nullable public java.security.cert.X509Certificate[] getCaCertificates();
method public java.security.cert.X509Certificate getClientCertificate();
- method public java.security.cert.X509Certificate[] getClientCertificateChain();
- method public java.lang.String getDomainSuffixMatch();
+ method @Nullable public java.security.cert.X509Certificate[] getClientCertificateChain();
+ method public String getDomainSuffixMatch();
method public int getEapMethod();
- method public java.lang.String getIdentity();
- method public java.lang.String getPassword();
+ method public String getIdentity();
+ method public String getPassword();
method public int getPhase2Method();
- method public java.lang.String getPlmn();
- method public java.lang.String getRealm();
- method public deprecated java.lang.String getSubjectMatch();
- method public void setAltSubjectMatch(java.lang.String);
- method public void setAnonymousIdentity(java.lang.String);
- method public void setCaCertificate(java.security.cert.X509Certificate);
- method public void setCaCertificates(java.security.cert.X509Certificate[]);
+ method public String getPlmn();
+ method public String getRealm();
+ method @Deprecated public String getSubjectMatch();
+ method public void setAltSubjectMatch(String);
+ method public void setAnonymousIdentity(String);
+ method public void setCaCertificate(@Nullable java.security.cert.X509Certificate);
+ method public void setCaCertificates(@Nullable java.security.cert.X509Certificate[]);
method public void setClientKeyEntry(java.security.PrivateKey, java.security.cert.X509Certificate);
method public void setClientKeyEntryWithCertificateChain(java.security.PrivateKey, java.security.cert.X509Certificate[]);
- method public void setDomainSuffixMatch(java.lang.String);
+ method public void setDomainSuffixMatch(String);
method public void setEapMethod(int);
- method public void setIdentity(java.lang.String);
- method public void setPassword(java.lang.String);
+ method public void setIdentity(String);
+ method public void setPassword(String);
method public void setPhase2Method(int);
- method public void setPlmn(java.lang.String);
- method public void setRealm(java.lang.String);
- method public deprecated void setSubjectMatch(java.lang.String);
+ method public void setPlmn(String);
+ method public void setRealm(String);
+ method @Deprecated public void setSubjectMatch(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.WifiEnterpriseConfig> CREATOR;
}
@@ -29539,110 +29757,112 @@ package android.net.wifi {
public class WifiInfo implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getBSSID();
+ method public String getBSSID();
method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState);
method public int getFrequency();
method public boolean getHiddenSSID();
method public int getIpAddress();
method public int getLinkSpeed();
- method public java.lang.String getMacAddress();
+ method public String getMacAddress();
method public int getNetworkId();
method public int getRssi();
- method public java.lang.String getSSID();
+ method public int getRxLinkSpeedMbps();
+ method public String getSSID();
method public android.net.wifi.SupplicantState getSupplicantState();
+ method public int getTxLinkSpeedMbps();
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String FREQUENCY_UNITS = "MHz";
- field public static final java.lang.String LINK_SPEED_UNITS = "Mbps";
+ field public static final String FREQUENCY_UNITS = "MHz";
+ field public static final String LINK_SPEED_UNITS = "Mbps";
}
public class WifiManager {
- method public deprecated int addNetwork(android.net.wifi.WifiConfiguration);
- method public int addNetworkSuggestions(java.util.List<android.net.wifi.WifiNetworkSuggestion>);
+ method @Deprecated public int addNetwork(android.net.wifi.WifiConfiguration);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int addNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public static int calculateSignalLevel(int, int);
- method public deprecated void cancelWps(android.net.wifi.WifiManager.WpsCallback);
+ method @Deprecated public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
method public static int compareSignalLevel(int, int);
- method public android.net.wifi.WifiManager.MulticastLock createMulticastLock(java.lang.String);
- method public android.net.wifi.WifiManager.WifiLock createWifiLock(int, java.lang.String);
- method public deprecated android.net.wifi.WifiManager.WifiLock createWifiLock(java.lang.String);
- method public deprecated boolean disableNetwork(int);
- method public deprecated boolean disconnect();
- method public deprecated boolean enableNetwork(int, boolean);
- method public deprecated java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
+ method public android.net.wifi.WifiManager.MulticastLock createMulticastLock(String);
+ method public android.net.wifi.WifiManager.WifiLock createWifiLock(int, String);
+ method @Deprecated public android.net.wifi.WifiManager.WifiLock createWifiLock(String);
+ method @Deprecated public boolean disableNetwork(int);
+ method @Deprecated public boolean disconnect();
+ method @Deprecated public boolean enableNetwork(int, boolean);
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
method public android.net.wifi.WifiInfo getConnectionInfo();
method public android.net.DhcpInfo getDhcpInfo();
method public int getMaxNumberOfNetworkSuggestionsPerApp();
- method public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
+ method @Deprecated @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", "android.permission.NETWORK_SETUP_WIZARD"}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
method public java.util.List<android.net.wifi.ScanResult> getScanResults();
method public int getWifiState();
method public boolean is5GHzBandSupported();
method public boolean isDeviceToApRttSupported();
- method public boolean isDppSupported();
+ method public boolean isEasyConnectSupported();
method public boolean isEnhancedPowerReportingSupported();
method public boolean isOweSupported();
method public boolean isP2pSupported();
method public boolean isPreferredNetworkOffloadSupported();
- method public deprecated boolean isScanAlwaysAvailable();
+ method @Deprecated public boolean isScanAlwaysAvailable();
method public boolean isTdlsSupported();
method public boolean isWifiEnabled();
method public boolean isWpa3SaeSupported();
method public boolean isWpa3SuiteBSupported();
- method public deprecated boolean pingSupplicant();
- method public deprecated boolean reassociate();
- method public deprecated boolean reconnect();
- method public deprecated boolean removeNetwork(int);
- method public int removeNetworkSuggestions(java.util.List<android.net.wifi.WifiNetworkSuggestion>);
- method public void removePasspointConfiguration(java.lang.String);
- method public deprecated boolean saveConfiguration();
+ method @Deprecated public boolean pingSupplicant();
+ method @Deprecated public boolean reassociate();
+ method @Deprecated public boolean reconnect();
+ method @Deprecated public boolean removeNetwork(int);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int removeNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
+ method @Deprecated @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", "android.permission.NETWORK_SETUP_WIZARD"}) public void removePasspointConfiguration(String);
+ method @Deprecated public boolean saveConfiguration();
method public void setTdlsEnabled(java.net.InetAddress, boolean);
- method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
- method public deprecated boolean setWifiEnabled(boolean);
- method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, android.os.Handler);
- method public deprecated boolean startScan();
- method public deprecated void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
- method public deprecated int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
- field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
- field public static final java.lang.String ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION = "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION";
- field public static final deprecated int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final deprecated java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
- field public static final java.lang.String EXTRA_NETWORK_SUGGESTION = "android.net.wifi.extra.NETWORK_SUGGESTION";
- field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
- field public static final deprecated java.lang.String EXTRA_NEW_STATE = "newState";
- field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
- field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final deprecated java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
- field public static final deprecated java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final deprecated java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
- field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
- field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
- field public static final java.lang.String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
- field public static final java.lang.String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
- field public static final java.lang.String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
+ method public void setTdlsEnabledWithMacAddress(String, boolean);
+ method @Deprecated public boolean setWifiEnabled(boolean);
+ method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, @Nullable android.os.Handler);
+ method @Deprecated public boolean startScan();
+ method @Deprecated public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
+ method @Deprecated public int updateNetwork(android.net.wifi.WifiConfiguration);
+ field public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
+ field public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
+ field public static final String ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION = "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION";
+ field @Deprecated public static final int ERROR_AUTHENTICATING = 1; // 0x1
+ field @Deprecated public static final String EXTRA_BSSID = "bssid";
+ field public static final String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final String EXTRA_NETWORK_SUGGESTION = "android.net.wifi.extra.NETWORK_SUGGESTION";
+ field public static final String EXTRA_NEW_RSSI = "newRssi";
+ field @Deprecated public static final String EXTRA_NEW_STATE = "newState";
+ field public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
+ field public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated";
+ field @Deprecated public static final String EXTRA_SUPPLICANT_CONNECTED = "connected";
+ field @Deprecated public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError";
+ field @Deprecated public static final String EXTRA_WIFI_INFO = "wifiInfo";
+ field public static final String EXTRA_WIFI_STATE = "wifi_state";
+ field public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
+ field public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
+ field public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
+ field public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE = 3; // 0x3
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP = 4; // 0x4
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED = 2; // 0x2
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5
field public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0; // 0x0
- field public static final deprecated java.lang.String SUPPLICANT_CONNECTION_CHANGE_ACTION = "android.net.wifi.supplicant.CONNECTION_CHANGE";
- field public static final deprecated java.lang.String SUPPLICANT_STATE_CHANGED_ACTION = "android.net.wifi.supplicant.STATE_CHANGE";
- field public static final deprecated int WIFI_MODE_FULL = 1; // 0x1
+ field @Deprecated public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = "android.net.wifi.supplicant.CONNECTION_CHANGE";
+ field @Deprecated public static final String SUPPLICANT_STATE_CHANGED_ACTION = "android.net.wifi.supplicant.STATE_CHANGE";
+ field @Deprecated public static final int WIFI_MODE_FULL = 1; // 0x1
field public static final int WIFI_MODE_FULL_HIGH_PERF = 3; // 0x3
field public static final int WIFI_MODE_FULL_LOW_LATENCY = 4; // 0x4
- field public static final deprecated int WIFI_MODE_SCAN_ONLY = 2; // 0x2
- field public static final java.lang.String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";
+ field @Deprecated public static final int WIFI_MODE_SCAN_ONLY = 2; // 0x2
+ field public static final String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";
field public static final int WIFI_STATE_DISABLED = 1; // 0x1
field public static final int WIFI_STATE_DISABLING = 0; // 0x0
field public static final int WIFI_STATE_ENABLED = 3; // 0x3
field public static final int WIFI_STATE_ENABLING = 2; // 0x2
field public static final int WIFI_STATE_UNKNOWN = 4; // 0x4
- field public static final deprecated int WPS_AUTH_FAILURE = 6; // 0x6
- field public static final deprecated int WPS_OVERLAP_ERROR = 3; // 0x3
- field public static final deprecated int WPS_TIMED_OUT = 7; // 0x7
- field public static final deprecated int WPS_TKIP_ONLY_PROHIBITED = 5; // 0x5
- field public static final deprecated int WPS_WEP_PROHIBITED = 4; // 0x4
+ field @Deprecated public static final int WPS_AUTH_FAILURE = 6; // 0x6
+ field @Deprecated public static final int WPS_OVERLAP_ERROR = 3; // 0x3
+ field @Deprecated public static final int WPS_TIMED_OUT = 7; // 0x7
+ field @Deprecated public static final int WPS_TKIP_ONLY_PROHIBITED = 5; // 0x5
+ field @Deprecated public static final int WPS_WEP_PROHIBITED = 4; // 0x4
}
public static class WifiManager.LocalOnlyHotspotCallback {
@@ -29668,9 +29888,6 @@ package android.net.wifi {
method public void setReferenceCounted(boolean);
}
- public static abstract class WifiManager.NetworkSuggestionsStatusCode implements java.lang.annotation.Annotation {
- }
-
public class WifiManager.WifiLock {
method public void acquire();
method public boolean isHeld();
@@ -29679,31 +29896,31 @@ package android.net.wifi {
method public void setWorkSource(android.os.WorkSource);
}
- public static abstract deprecated class WifiManager.WpsCallback {
- ctor public WifiManager.WpsCallback();
- method public abstract deprecated void onFailed(int);
- method public abstract deprecated void onStarted(java.lang.String);
- method public abstract deprecated void onSucceeded();
+ @Deprecated public abstract static class WifiManager.WpsCallback {
+ ctor @Deprecated public WifiManager.WpsCallback();
+ method @Deprecated public abstract void onFailed(int);
+ method @Deprecated public abstract void onStarted(String);
+ method @Deprecated public abstract void onSucceeded();
}
public class WifiNetworkConfigBuilder {
ctor public WifiNetworkConfigBuilder();
method public android.net.NetworkSpecifier buildNetworkSpecifier();
method public android.net.wifi.WifiNetworkSuggestion buildNetworkSuggestion();
- method public android.net.wifi.WifiNetworkConfigBuilder setBssid(android.net.MacAddress);
- method public android.net.wifi.WifiNetworkConfigBuilder setBssidPattern(android.net.MacAddress, android.net.MacAddress);
+ method public android.net.wifi.WifiNetworkConfigBuilder setBssid(@NonNull android.net.MacAddress);
+ method public android.net.wifi.WifiNetworkConfigBuilder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
method public android.net.wifi.WifiNetworkConfigBuilder setIsAppInteractionRequired();
method public android.net.wifi.WifiNetworkConfigBuilder setIsEnhancedOpen();
method public android.net.wifi.WifiNetworkConfigBuilder setIsHiddenSsid();
method public android.net.wifi.WifiNetworkConfigBuilder setIsMetered();
method public android.net.wifi.WifiNetworkConfigBuilder setIsUserInteractionRequired();
method public android.net.wifi.WifiNetworkConfigBuilder setPriority(int);
- method public android.net.wifi.WifiNetworkConfigBuilder setSsid(java.lang.String);
- method public android.net.wifi.WifiNetworkConfigBuilder setSsidPattern(android.os.PatternMatcher);
- method public android.net.wifi.WifiNetworkConfigBuilder setWpa2EnterpriseConfig(android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkConfigBuilder setWpa2Passphrase(java.lang.String);
- method public android.net.wifi.WifiNetworkConfigBuilder setWpa3EnterpriseConfig(android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkConfigBuilder setWpa3Passphrase(java.lang.String);
+ method public android.net.wifi.WifiNetworkConfigBuilder setSsid(@NonNull String);
+ method public android.net.wifi.WifiNetworkConfigBuilder setSsidPattern(@NonNull android.os.PatternMatcher);
+ method public android.net.wifi.WifiNetworkConfigBuilder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method public android.net.wifi.WifiNetworkConfigBuilder setWpa2Passphrase(@NonNull String);
+ method public android.net.wifi.WifiNetworkConfigBuilder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method public android.net.wifi.WifiNetworkConfigBuilder setWpa3Passphrase(@NonNull String);
}
public final class WifiNetworkSuggestion implements android.os.Parcelable {
@@ -29717,14 +29934,14 @@ package android.net.wifi {
ctor public WpsInfo(android.net.wifi.WpsInfo);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public java.lang.String BSSID;
+ field public String BSSID;
field public static final android.os.Parcelable.Creator<android.net.wifi.WpsInfo> CREATOR;
field public static final int DISPLAY = 1; // 0x1
field public static final int INVALID = 4; // 0x4
field public static final int KEYPAD = 2; // 0x2
field public static final int LABEL = 3; // 0x3
field public static final int PBC = 0; // 0x0
- field public java.lang.String pin;
+ field public String pin;
field public int setup;
}
@@ -29749,9 +29966,9 @@ package android.net.wifi.aware {
public class DiscoverySession implements java.lang.AutoCloseable {
method public void close();
- method public deprecated android.net.NetworkSpecifier createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
- method public deprecated android.net.NetworkSpecifier createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
- method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
+ method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierOpen(@NonNull android.net.wifi.aware.PeerHandle);
+ method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(@NonNull android.net.wifi.aware.PeerHandle, @NonNull String);
+ method public void sendMessage(@NonNull android.net.wifi.aware.PeerHandle, int, @Nullable byte[]);
}
public class DiscoverySessionCallback {
@@ -29759,13 +29976,13 @@ package android.net.wifi.aware {
method public void onMessageReceived(android.net.wifi.aware.PeerHandle, byte[]);
method public void onMessageSendFailed(int);
method public void onMessageSendSucceeded(int);
- method public void onPublishStarted(android.net.wifi.aware.PublishDiscoverySession);
+ method public void onPublishStarted(@NonNull android.net.wifi.aware.PublishDiscoverySession);
method public void onServiceDiscovered(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>);
method public void onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>, int);
method public void onSessionConfigFailed();
method public void onSessionConfigUpdated();
method public void onSessionTerminated();
- method public void onSubscribeStarted(android.net.wifi.aware.SubscribeDiscoverySession);
+ method public void onSubscribeStarted(@NonNull android.net.wifi.aware.SubscribeDiscoverySession);
}
public class IdentityChangedListener {
@@ -29790,17 +30007,17 @@ package android.net.wifi.aware {
public static final class PublishConfig.Builder {
ctor public PublishConfig.Builder();
method public android.net.wifi.aware.PublishConfig build();
- method public android.net.wifi.aware.PublishConfig.Builder setMatchFilter(java.util.List<byte[]>);
+ method public android.net.wifi.aware.PublishConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>);
method public android.net.wifi.aware.PublishConfig.Builder setPublishType(int);
method public android.net.wifi.aware.PublishConfig.Builder setRangingEnabled(boolean);
- method public android.net.wifi.aware.PublishConfig.Builder setServiceName(java.lang.String);
- method public android.net.wifi.aware.PublishConfig.Builder setServiceSpecificInfo(byte[]);
+ method public android.net.wifi.aware.PublishConfig.Builder setServiceName(@NonNull String);
+ method public android.net.wifi.aware.PublishConfig.Builder setServiceSpecificInfo(@Nullable byte[]);
method public android.net.wifi.aware.PublishConfig.Builder setTerminateNotificationEnabled(boolean);
method public android.net.wifi.aware.PublishConfig.Builder setTtlSec(int);
}
public class PublishDiscoverySession extends android.net.wifi.aware.DiscoverySession {
- method public void updatePublish(android.net.wifi.aware.PublishConfig);
+ method public void updatePublish(@NonNull android.net.wifi.aware.PublishConfig);
}
public final class SubscribeConfig implements android.os.Parcelable {
@@ -29814,51 +30031,55 @@ package android.net.wifi.aware {
public static final class SubscribeConfig.Builder {
ctor public SubscribeConfig.Builder();
method public android.net.wifi.aware.SubscribeConfig build();
- method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(java.util.List<byte[]>);
+ method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>);
method public android.net.wifi.aware.SubscribeConfig.Builder setMaxDistanceMm(int);
method public android.net.wifi.aware.SubscribeConfig.Builder setMinDistanceMm(int);
- method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(java.lang.String);
- method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(byte[]);
+ method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(@NonNull String);
+ method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(@Nullable byte[]);
method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int);
method public android.net.wifi.aware.SubscribeConfig.Builder setTerminateNotificationEnabled(boolean);
method public android.net.wifi.aware.SubscribeConfig.Builder setTtlSec(int);
}
public class SubscribeDiscoverySession extends android.net.wifi.aware.DiscoverySession {
- method public void updateSubscribe(android.net.wifi.aware.SubscribeConfig);
+ method public void updateSubscribe(@NonNull android.net.wifi.aware.SubscribeConfig);
}
public class WifiAwareManager {
- method public void attach(android.net.wifi.aware.AttachCallback, android.os.Handler);
- method public void attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler);
+ method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @Nullable android.os.Handler);
+ method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @NonNull android.net.wifi.aware.IdentityChangedListener, @Nullable android.os.Handler);
method public android.net.wifi.aware.Characteristics getCharacteristics();
method public boolean isAvailable();
- field public static final java.lang.String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED";
+ field public static final String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED";
field public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0; // 0x0
field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1
}
public static class WifiAwareManager.NetworkSpecifierBuilder {
ctor public WifiAwareManager.NetworkSpecifierBuilder();
- method public android.net.NetworkSpecifier build();
- method public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setDiscoverySession(android.net.wifi.aware.DiscoverySession);
- method public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPeerHandle(android.net.wifi.aware.PeerHandle);
- method public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPskPassphrase(java.lang.String);
+ method @NonNull public android.net.NetworkSpecifier build();
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setDiscoverySession(@NonNull android.net.wifi.aware.DiscoverySession);
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPeerHandle(@NonNull android.net.wifi.aware.PeerHandle);
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPort(int);
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPskPassphrase(@NonNull String);
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setTransportProtocol(int);
}
public final class WifiAwareNetworkInfo implements android.os.Parcelable android.net.TransportInfo {
method public int describeContents();
- method public java.net.Inet6Address getPeerIpv6Addr();
+ method @Nullable public java.net.Inet6Address getPeerIpv6Addr();
+ method public int getPort();
+ method public int getTransportProtocol();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.WifiAwareNetworkInfo> CREATOR;
}
public class WifiAwareSession implements java.lang.AutoCloseable {
method public void close();
- method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, byte[]);
- method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
- method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
- method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
+ method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, @NonNull byte[]);
+ method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, @NonNull byte[], @NonNull String);
+ method public void publish(@NonNull android.net.wifi.aware.PublishConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler);
+ method public void subscribe(@NonNull android.net.wifi.aware.SubscribeConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler);
}
}
@@ -29866,7 +30087,7 @@ package android.net.wifi.aware {
package android.net.wifi.hotspot2 {
public final class ConfigParser {
- method public static android.net.wifi.hotspot2.PasspointConfiguration parsePasspointConfig(java.lang.String, byte[]);
+ method public static android.net.wifi.hotspot2.PasspointConfiguration parsePasspointConfig(String, byte[]);
}
public final class PasspointConfiguration implements android.os.Parcelable {
@@ -29886,7 +30107,7 @@ package android.net.wifi.hotspot2 {
package android.net.wifi.hotspot2.omadm {
public final class PpsMoParser {
- method public static android.net.wifi.hotspot2.PasspointConfiguration parseMoText(java.lang.String);
+ method public static android.net.wifi.hotspot2.PasspointConfiguration parseMoText(String);
}
}
@@ -29901,14 +30122,14 @@ package android.net.wifi.hotspot2.pps {
method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential();
method public java.security.cert.X509Certificate[] getClientCertificateChain();
method public java.security.PrivateKey getClientPrivateKey();
- method public java.lang.String getRealm();
+ method public String getRealm();
method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential();
method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential();
method public void setCaCertificate(java.security.cert.X509Certificate);
method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
method public void setClientCertificateChain(java.security.cert.X509Certificate[]);
method public void setClientPrivateKey(java.security.PrivateKey);
- method public void setRealm(java.lang.String);
+ method public void setRealm(String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
method public void writeToParcel(android.os.Parcel, int);
@@ -29920,9 +30141,9 @@ package android.net.wifi.hotspot2.pps {
ctor public Credential.CertificateCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
method public int describeContents();
method public byte[] getCertSha256Fingerprint();
- method public java.lang.String getCertType();
+ method public String getCertType();
method public void setCertSha256Fingerprint(byte[]);
- method public void setCertType(java.lang.String);
+ method public void setCertType(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR;
}
@@ -29932,9 +30153,9 @@ package android.net.wifi.hotspot2.pps {
ctor public Credential.SimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public int describeContents();
method public int getEapType();
- method public java.lang.String getImsi();
+ method public String getImsi();
method public void setEapType(int);
- method public void setImsi(java.lang.String);
+ method public void setImsi(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR;
}
@@ -29944,13 +30165,13 @@ package android.net.wifi.hotspot2.pps {
ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
method public int describeContents();
method public int getEapType();
- method public java.lang.String getNonEapInnerMethod();
- method public java.lang.String getPassword();
- method public java.lang.String getUsername();
+ method public String getNonEapInnerMethod();
+ method public String getPassword();
+ method public String getUsername();
method public void setEapType(int);
- method public void setNonEapInnerMethod(java.lang.String);
- method public void setPassword(java.lang.String);
- method public void setUsername(java.lang.String);
+ method public void setNonEapInnerMethod(String);
+ method public void setPassword(String);
+ method public void setUsername(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
}
@@ -29959,11 +30180,11 @@ package android.net.wifi.hotspot2.pps {
ctor public HomeSp();
ctor public HomeSp(android.net.wifi.hotspot2.pps.HomeSp);
method public int describeContents();
- method public java.lang.String getFqdn();
- method public java.lang.String getFriendlyName();
+ method public String getFqdn();
+ method public String getFriendlyName();
method public long[] getRoamingConsortiumOis();
- method public void setFqdn(java.lang.String);
- method public void setFriendlyName(java.lang.String);
+ method public void setFqdn(String);
+ method public void setFriendlyName(String);
method public void setRoamingConsortiumOis(long[]);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
@@ -29982,7 +30203,7 @@ package android.net.wifi.p2p {
field public static final int GROUP_OWNER_BAND_2GHZ = 1; // 0x1
field public static final int GROUP_OWNER_BAND_5GHZ = 2; // 0x2
field public static final int GROUP_OWNER_BAND_AUTO = 0; // 0x0
- field public java.lang.String deviceAddress;
+ field public String deviceAddress;
field public int groupOwnerIntent;
field public android.net.wifi.WpsInfo wps;
}
@@ -29992,9 +30213,10 @@ package android.net.wifi.p2p {
method public android.net.wifi.p2p.WifiP2pConfig build();
method public android.net.wifi.p2p.WifiP2pConfig.Builder enablePersistentMode(boolean);
method public android.net.wifi.p2p.WifiP2pConfig.Builder setDeviceAddress(android.net.MacAddress);
- method public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOwnerBand(int);
- method public android.net.wifi.p2p.WifiP2pConfig.Builder setNetworkName(java.lang.String);
- method public android.net.wifi.p2p.WifiP2pConfig.Builder setPassphrase(java.lang.String);
+ method public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingBand(int);
+ method public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingFrequency(int);
+ method public android.net.wifi.p2p.WifiP2pConfig.Builder setNetworkName(String);
+ method public android.net.wifi.p2p.WifiP2pConfig.Builder setPassphrase(String);
}
public class WifiP2pDevice implements android.os.Parcelable {
@@ -30013,10 +30235,10 @@ package android.net.wifi.p2p {
field public static final int FAILED = 2; // 0x2
field public static final int INVITED = 1; // 0x1
field public static final int UNAVAILABLE = 4; // 0x4
- field public java.lang.String deviceAddress;
- field public java.lang.String deviceName;
- field public java.lang.String primaryDeviceType;
- field public java.lang.String secondaryDeviceType;
+ field public String deviceAddress;
+ field public String deviceName;
+ field public String primaryDeviceType;
+ field public String secondaryDeviceType;
field public int status;
}
@@ -30024,7 +30246,7 @@ package android.net.wifi.p2p {
ctor public WifiP2pDeviceList();
ctor public WifiP2pDeviceList(android.net.wifi.p2p.WifiP2pDeviceList);
method public int describeContents();
- method public android.net.wifi.p2p.WifiP2pDevice get(java.lang.String);
+ method public android.net.wifi.p2p.WifiP2pDevice get(String);
method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDeviceList> CREATOR;
@@ -30035,10 +30257,11 @@ package android.net.wifi.p2p {
ctor public WifiP2pGroup(android.net.wifi.p2p.WifiP2pGroup);
method public int describeContents();
method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getClientList();
- method public java.lang.String getInterface();
- method public java.lang.String getNetworkName();
+ method public int getFrequency();
+ method public String getInterface();
+ method public String getNetworkName();
method public android.net.wifi.p2p.WifiP2pDevice getOwner();
- method public java.lang.String getPassphrase();
+ method public String getPassphrase();
method public boolean isGroupOwner();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroup> CREATOR;
@@ -30056,103 +30279,103 @@ package android.net.wifi.p2p {
}
public class WifiP2pManager {
- method public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void clearLocalServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void clearServiceRequests(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
- method public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
- method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
- method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
- method public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
- method public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void createGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pConfig, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
- method public void requestDiscoveryState(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener);
- method public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
- method public void requestNetworkInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener);
- method public void requestP2pState(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.P2pStateListener);
- method public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
+ method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
+ method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener);
+ method public void requestP2pState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.P2pStateListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
method public void setDnsSdResponseListeners(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener, android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener);
method public void setServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener);
method public void setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener);
method public void stopPeerDiscovery(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
field public static final int BUSY = 2; // 0x2
field public static final int ERROR = 0; // 0x0
- field public static final java.lang.String EXTRA_DISCOVERY_STATE = "discoveryState";
- field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
- field public static final java.lang.String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
- field public static final java.lang.String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
- field public static final java.lang.String EXTRA_WIFI_P2P_GROUP = "p2pGroupInfo";
- field public static final java.lang.String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
- field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_p2p_state";
+ field public static final String EXTRA_DISCOVERY_STATE = "discoveryState";
+ field public static final String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
+ field public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
+ field public static final String EXTRA_WIFI_P2P_GROUP = "p2pGroupInfo";
+ field public static final String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
+ field public static final String EXTRA_WIFI_STATE = "wifi_p2p_state";
field public static final int NO_SERVICE_REQUESTS = 3; // 0x3
field public static final int P2P_UNSUPPORTED = 1; // 0x1
- field public static final java.lang.String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
- field public static final java.lang.String WIFI_P2P_DISCOVERY_CHANGED_ACTION = "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
+ field public static final String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
+ field public static final String WIFI_P2P_DISCOVERY_CHANGED_ACTION = "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
field public static final int WIFI_P2P_DISCOVERY_STARTED = 2; // 0x2
field public static final int WIFI_P2P_DISCOVERY_STOPPED = 1; // 0x1
- field public static final java.lang.String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
- field public static final java.lang.String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
+ field public static final String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
+ field public static final String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1
field public static final int WIFI_P2P_STATE_ENABLED = 2; // 0x2
- field public static final java.lang.String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
+ field public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
}
- public static abstract interface WifiP2pManager.ActionListener {
- method public abstract void onFailure(int);
- method public abstract void onSuccess();
+ public static interface WifiP2pManager.ActionListener {
+ method public void onFailure(int);
+ method public void onSuccess();
}
public static class WifiP2pManager.Channel implements java.lang.AutoCloseable {
method public void close();
}
- public static abstract interface WifiP2pManager.ChannelListener {
- method public abstract void onChannelDisconnected();
+ public static interface WifiP2pManager.ChannelListener {
+ method public void onChannelDisconnected();
}
- public static abstract interface WifiP2pManager.ConnectionInfoListener {
- method public abstract void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
+ public static interface WifiP2pManager.ConnectionInfoListener {
+ method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
}
- public static abstract interface WifiP2pManager.DiscoveryStateListener {
- method public abstract void onDiscoveryStateAvailable(int);
+ public static interface WifiP2pManager.DiscoveryStateListener {
+ method public void onDiscoveryStateAvailable(int);
}
- public static abstract interface WifiP2pManager.DnsSdServiceResponseListener {
- method public abstract void onDnsSdServiceAvailable(java.lang.String, java.lang.String, android.net.wifi.p2p.WifiP2pDevice);
+ public static interface WifiP2pManager.DnsSdServiceResponseListener {
+ method public void onDnsSdServiceAvailable(String, String, android.net.wifi.p2p.WifiP2pDevice);
}
- public static abstract interface WifiP2pManager.DnsSdTxtRecordListener {
- method public abstract void onDnsSdTxtRecordAvailable(java.lang.String, java.util.Map<java.lang.String, java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
+ public static interface WifiP2pManager.DnsSdTxtRecordListener {
+ method public void onDnsSdTxtRecordAvailable(String, java.util.Map<java.lang.String,java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
}
- public static abstract interface WifiP2pManager.GroupInfoListener {
- method public abstract void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
+ public static interface WifiP2pManager.GroupInfoListener {
+ method public void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
}
- public static abstract interface WifiP2pManager.NetworkInfoListener {
- method public abstract void onNetworkInfoAvailable(android.net.NetworkInfo);
+ public static interface WifiP2pManager.NetworkInfoListener {
+ method public void onNetworkInfoAvailable(android.net.NetworkInfo);
}
- public static abstract interface WifiP2pManager.P2pStateListener {
- method public abstract void onP2pStateAvailable(int);
+ public static interface WifiP2pManager.P2pStateListener {
+ method public void onP2pStateAvailable(int);
}
- public static abstract interface WifiP2pManager.PeerListListener {
- method public abstract void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
+ public static interface WifiP2pManager.PeerListListener {
+ method public void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
}
- public static abstract interface WifiP2pManager.ServiceResponseListener {
- method public abstract void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice);
+ public static interface WifiP2pManager.ServiceResponseListener {
+ method public void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice);
}
- public static abstract interface WifiP2pManager.UpnpServiceResponseListener {
- method public abstract void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
+ public static interface WifiP2pManager.UpnpServiceResponseListener {
+ method public void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
}
}
@@ -30160,13 +30383,13 @@ package android.net.wifi.p2p {
package android.net.wifi.p2p.nsd {
public class WifiP2pDnsSdServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
- method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(java.lang.String, java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(String, String, java.util.Map<java.lang.String,java.lang.String>);
}
public class WifiP2pDnsSdServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance();
- method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String);
- method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String, java.lang.String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String, String);
}
public class WifiP2pServiceInfo implements android.os.Parcelable {
@@ -30180,18 +30403,18 @@ package android.net.wifi.p2p.nsd {
public class WifiP2pServiceRequest implements android.os.Parcelable {
method public int describeContents();
- method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, java.lang.String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, String);
method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int);
method public void writeToParcel(android.os.Parcel, int);
}
public class WifiP2pUpnpServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
- method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(java.lang.String, java.lang.String, java.util.List<java.lang.String>);
+ method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(String, String, java.util.List<java.lang.String>);
}
public class WifiP2pUpnpServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance();
- method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(java.lang.String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(String);
}
}
@@ -30207,10 +30430,10 @@ package android.net.wifi.rtt {
public static final class RangingRequest.Builder {
ctor public RangingRequest.Builder();
- method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoint(android.net.wifi.ScanResult);
- method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoints(java.util.List<android.net.wifi.ScanResult>);
- method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(android.net.MacAddress);
- method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(android.net.wifi.aware.PeerHandle);
+ method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoint(@NonNull android.net.wifi.ScanResult);
+ method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoints(@NonNull java.util.List<android.net.wifi.ScanResult>);
+ method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.MacAddress);
+ method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.wifi.aware.PeerHandle);
method public android.net.wifi.rtt.RangingRequest build();
}
@@ -30218,10 +30441,10 @@ package android.net.wifi.rtt {
method public int describeContents();
method public int getDistanceMm();
method public int getDistanceStdDevMm();
- method public android.net.MacAddress getMacAddress();
+ method @Nullable public android.net.MacAddress getMacAddress();
method public int getNumAttemptedMeasurements();
method public int getNumSuccessfulMeasurements();
- method public android.net.wifi.aware.PeerHandle getPeerHandle();
+ method @Nullable public android.net.wifi.aware.PeerHandle getPeerHandle();
method public long getRangingTimestampMillis();
method public int getRssi();
method public int getStatus();
@@ -30235,15 +30458,15 @@ package android.net.wifi.rtt {
public abstract class RangingResultCallback {
ctor public RangingResultCallback();
method public abstract void onRangingFailure(int);
- method public abstract void onRangingResults(java.util.List<android.net.wifi.rtt.RangingResult>);
+ method public abstract void onRangingResults(@NonNull java.util.List<android.net.wifi.rtt.RangingResult>);
field public static final int STATUS_CODE_FAIL = 1; // 0x1
field public static final int STATUS_CODE_FAIL_RTT_NOT_AVAILABLE = 2; // 0x2
}
public class WifiRttManager {
method public boolean isAvailable();
- method public void startRanging(android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback);
- field public static final java.lang.String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED";
+ method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback);
+ field public static final String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED";
}
}
@@ -30252,8 +30475,8 @@ package android.nfc {
public class FormatException extends java.lang.Exception {
ctor public FormatException();
- ctor public FormatException(java.lang.String);
- ctor public FormatException(java.lang.String, java.lang.Throwable);
+ ctor public FormatException(String);
+ ctor public FormatException(String, Throwable);
}
public final class NdefMessage implements android.os.Parcelable {
@@ -30270,20 +30493,20 @@ package android.nfc {
public final class NdefRecord implements android.os.Parcelable {
ctor public NdefRecord(short, byte[], byte[], byte[]);
- ctor public deprecated NdefRecord(byte[]) throws android.nfc.FormatException;
- method public static android.nfc.NdefRecord createApplicationRecord(java.lang.String);
- method public static android.nfc.NdefRecord createExternal(java.lang.String, java.lang.String, byte[]);
- method public static android.nfc.NdefRecord createMime(java.lang.String, byte[]);
- method public static android.nfc.NdefRecord createTextRecord(java.lang.String, java.lang.String);
+ ctor @Deprecated public NdefRecord(byte[]) throws android.nfc.FormatException;
+ method public static android.nfc.NdefRecord createApplicationRecord(String);
+ method public static android.nfc.NdefRecord createExternal(String, String, byte[]);
+ method public static android.nfc.NdefRecord createMime(String, byte[]);
+ method public static android.nfc.NdefRecord createTextRecord(String, String);
method public static android.nfc.NdefRecord createUri(android.net.Uri);
- method public static android.nfc.NdefRecord createUri(java.lang.String);
+ method public static android.nfc.NdefRecord createUri(String);
method public int describeContents();
method public byte[] getId();
method public byte[] getPayload();
method public short getTnf();
method public byte[] getType();
- method public deprecated byte[] toByteArray();
- method public java.lang.String toMimeType();
+ method @Deprecated public byte[] toByteArray();
+ method public String toMimeType();
method public android.net.Uri toUri();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.nfc.NdefRecord> CREATOR;
@@ -30305,35 +30528,35 @@ package android.nfc {
public final class NfcAdapter {
method public void disableForegroundDispatch(android.app.Activity);
- method public deprecated void disableForegroundNdefPush(android.app.Activity);
+ method @Deprecated public void disableForegroundNdefPush(android.app.Activity);
method public void disableReaderMode(android.app.Activity);
- method public void enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][]);
- method public deprecated void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
+ method public void enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], String[][]);
+ method @Deprecated public void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
method public void enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle);
method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context);
- method public java.util.List<java.lang.String> getSupportedOffHostSecureElements();
+ method @NonNull public java.util.List<java.lang.String> getSupportedOffHostSecureElements();
method public boolean ignore(android.nfc.Tag, int, android.nfc.NfcAdapter.OnTagRemovedListener, android.os.Handler);
- method public deprecated boolean invokeBeam(android.app.Activity);
+ method @Deprecated public boolean invokeBeam(android.app.Activity);
method public boolean isEnabled();
- method public deprecated boolean isNdefPushEnabled();
- method public deprecated void setBeamPushUris(android.net.Uri[], android.app.Activity);
- method public deprecated void setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity);
- method public deprecated void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
- method public deprecated void setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...);
- method public deprecated void setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...);
- field public static final java.lang.String ACTION_ADAPTER_STATE_CHANGED = "android.nfc.action.ADAPTER_STATE_CHANGED";
- field public static final java.lang.String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED";
- field public static final java.lang.String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED";
- field public static final java.lang.String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED";
- field public static final java.lang.String ACTION_TRANSACTION_DETECTED = "android.nfc.action.TRANSACTION_DETECTED";
- field public static final java.lang.String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE";
- field public static final java.lang.String EXTRA_AID = "android.nfc.extra.AID";
- field public static final java.lang.String EXTRA_DATA = "android.nfc.extra.DATA";
- field public static final java.lang.String EXTRA_ID = "android.nfc.extra.ID";
- field public static final java.lang.String EXTRA_NDEF_MESSAGES = "android.nfc.extra.NDEF_MESSAGES";
- field public static final java.lang.String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence";
- field public static final java.lang.String EXTRA_SECURE_ELEMENT_NAME = "android.nfc.extra.SECURE_ELEMENT_NAME";
- field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG";
+ method @Deprecated public boolean isNdefPushEnabled();
+ method @Deprecated public void setBeamPushUris(android.net.Uri[], android.app.Activity);
+ method @Deprecated public void setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity);
+ method @Deprecated public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
+ method @Deprecated public void setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...);
+ method @Deprecated public void setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...);
+ field public static final String ACTION_ADAPTER_STATE_CHANGED = "android.nfc.action.ADAPTER_STATE_CHANGED";
+ field public static final String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED";
+ field public static final String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED";
+ field public static final String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED";
+ field @RequiresPermission(android.Manifest.permission.NFC_TRANSACTION_EVENT) public static final String ACTION_TRANSACTION_DETECTED = "android.nfc.action.TRANSACTION_DETECTED";
+ field public static final String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE";
+ field public static final String EXTRA_AID = "android.nfc.extra.AID";
+ field public static final String EXTRA_DATA = "android.nfc.extra.DATA";
+ field public static final String EXTRA_ID = "android.nfc.extra.ID";
+ field public static final String EXTRA_NDEF_MESSAGES = "android.nfc.extra.NDEF_MESSAGES";
+ field public static final String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence";
+ field public static final String EXTRA_SECURE_ELEMENT_NAME = "android.nfc.extra.SECURE_ELEMENT_NAME";
+ field public static final String EXTRA_TAG = "android.nfc.extra.TAG";
field public static final int FLAG_READER_NFC_A = 1; // 0x1
field public static final int FLAG_READER_NFC_B = 2; // 0x2
field public static final int FLAG_READER_NFC_BARCODE = 16; // 0x10
@@ -30347,24 +30570,24 @@ package android.nfc {
field public static final int STATE_TURNING_ON = 2; // 0x2
}
- public static abstract deprecated interface NfcAdapter.CreateBeamUrisCallback {
- method public abstract android.net.Uri[] createBeamUris(android.nfc.NfcEvent);
+ @Deprecated public static interface NfcAdapter.CreateBeamUrisCallback {
+ method @Deprecated public android.net.Uri[] createBeamUris(android.nfc.NfcEvent);
}
- public static abstract deprecated interface NfcAdapter.CreateNdefMessageCallback {
- method public abstract android.nfc.NdefMessage createNdefMessage(android.nfc.NfcEvent);
+ @Deprecated public static interface NfcAdapter.CreateNdefMessageCallback {
+ method @Deprecated public android.nfc.NdefMessage createNdefMessage(android.nfc.NfcEvent);
}
- public static abstract deprecated interface NfcAdapter.OnNdefPushCompleteCallback {
- method public abstract void onNdefPushComplete(android.nfc.NfcEvent);
+ @Deprecated public static interface NfcAdapter.OnNdefPushCompleteCallback {
+ method @Deprecated public void onNdefPushComplete(android.nfc.NfcEvent);
}
- public static abstract interface NfcAdapter.OnTagRemovedListener {
- method public abstract void onTagRemoved();
+ public static interface NfcAdapter.OnTagRemovedListener {
+ method public void onTagRemoved();
}
- public static abstract interface NfcAdapter.ReaderCallback {
- method public abstract void onTagDiscovered(android.nfc.Tag);
+ public static interface NfcAdapter.ReaderCallback {
+ method public void onTagDiscovered(android.nfc.Tag);
}
public final class NfcEvent {
@@ -30380,14 +30603,14 @@ package android.nfc {
public final class Tag implements android.os.Parcelable {
method public int describeContents();
method public byte[] getId();
- method public java.lang.String[] getTechList();
+ method public String[] getTechList();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.nfc.Tag> CREATOR;
}
public class TagLostException extends java.io.IOException {
ctor public TagLostException();
- ctor public TagLostException(java.lang.String);
+ ctor public TagLostException(String);
}
}
@@ -30395,24 +30618,24 @@ package android.nfc {
package android.nfc.cardemulation {
public final class CardEmulation {
- method public boolean categoryAllowsForegroundPreference(java.lang.String);
- method public java.util.List<java.lang.String> getAidsForService(android.content.ComponentName, java.lang.String);
- method public static synchronized android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter);
- method public int getSelectionModeForCategory(java.lang.String);
- method public boolean isDefaultServiceForAid(android.content.ComponentName, java.lang.String);
- method public boolean isDefaultServiceForCategory(android.content.ComponentName, java.lang.String);
- method public boolean registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>);
- method public boolean removeAidsForService(android.content.ComponentName, java.lang.String);
- method public boolean setOffHostForService(android.content.ComponentName, java.lang.String);
+ method public boolean categoryAllowsForegroundPreference(String);
+ method public java.util.List<java.lang.String> getAidsForService(android.content.ComponentName, String);
+ method public static android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter);
+ method public int getSelectionModeForCategory(String);
+ method public boolean isDefaultServiceForAid(android.content.ComponentName, String);
+ method public boolean isDefaultServiceForCategory(android.content.ComponentName, String);
+ method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>);
+ method public boolean removeAidsForService(android.content.ComponentName, String);
+ method public boolean setOffHostForService(android.content.ComponentName, String);
method public boolean setPreferredService(android.app.Activity, android.content.ComponentName);
method public boolean supportsAidPrefixRegistration();
method public boolean unsetOffHostForService(android.content.ComponentName);
method public boolean unsetPreferredService(android.app.Activity);
- field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
- field public static final java.lang.String CATEGORY_OTHER = "other";
- field public static final java.lang.String CATEGORY_PAYMENT = "payment";
- field public static final java.lang.String EXTRA_CATEGORY = "category";
- field public static final java.lang.String EXTRA_SERVICE_COMPONENT = "component";
+ field public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
+ field public static final String CATEGORY_OTHER = "other";
+ field public static final String CATEGORY_PAYMENT = "payment";
+ field public static final String EXTRA_CATEGORY = "category";
+ field public static final String EXTRA_SERVICE_COMPONENT = "component";
field public static final int SELECTION_MODE_ALWAYS_ASK = 1; // 0x1
field public static final int SELECTION_MODE_ASK_IF_CONFLICT = 2; // 0x2
field public static final int SELECTION_MODE_PREFER_DEFAULT = 0; // 0x0
@@ -30427,8 +30650,8 @@ package android.nfc.cardemulation {
method public final void sendResponseApdu(byte[]);
field public static final int DEACTIVATION_DESELECTED = 1; // 0x1
field public static final int DEACTIVATION_LINK_LOSS = 0; // 0x0
- field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
- field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.host_apdu_service";
+ field public static final String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
+ field public static final String SERVICE_META_DATA = "android.nfc.cardemulation.host_apdu_service";
}
public abstract class HostNfcFService extends android.app.Service {
@@ -30438,25 +30661,25 @@ package android.nfc.cardemulation {
method public abstract byte[] processNfcFPacket(byte[], android.os.Bundle);
method public final void sendResponsePacket(byte[]);
field public static final int DEACTIVATION_LINK_LOSS = 0; // 0x0
- field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_NFCF_SERVICE";
- field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.host_nfcf_service";
+ field public static final String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_NFCF_SERVICE";
+ field public static final String SERVICE_META_DATA = "android.nfc.cardemulation.host_nfcf_service";
}
public final class NfcFCardEmulation {
method public boolean disableService(android.app.Activity) throws java.lang.RuntimeException;
method public boolean enableService(android.app.Activity, android.content.ComponentName) throws java.lang.RuntimeException;
- method public static synchronized android.nfc.cardemulation.NfcFCardEmulation getInstance(android.nfc.NfcAdapter);
- method public java.lang.String getNfcid2ForService(android.content.ComponentName) throws java.lang.RuntimeException;
- method public java.lang.String getSystemCodeForService(android.content.ComponentName) throws java.lang.RuntimeException;
- method public boolean registerSystemCodeForService(android.content.ComponentName, java.lang.String) throws java.lang.RuntimeException;
- method public boolean setNfcid2ForService(android.content.ComponentName, java.lang.String) throws java.lang.RuntimeException;
+ method public static android.nfc.cardemulation.NfcFCardEmulation getInstance(android.nfc.NfcAdapter);
+ method public String getNfcid2ForService(android.content.ComponentName) throws java.lang.RuntimeException;
+ method public String getSystemCodeForService(android.content.ComponentName) throws java.lang.RuntimeException;
+ method public boolean registerSystemCodeForService(android.content.ComponentName, String) throws java.lang.RuntimeException;
+ method public boolean setNfcid2ForService(android.content.ComponentName, String) throws java.lang.RuntimeException;
method public boolean unregisterSystemCodeForService(android.content.ComponentName) throws java.lang.RuntimeException;
}
public abstract class OffHostApduService extends android.app.Service {
ctor public OffHostApduService();
- field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
- field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.off_host_apdu_service";
+ field public static final String SERVICE_INTERFACE = "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
+ field public static final String SERVICE_META_DATA = "android.nfc.cardemulation.off_host_apdu_service";
}
}
@@ -30464,11 +30687,15 @@ package android.nfc.cardemulation {
package android.nfc.tech {
public final class IsoDep implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.IsoDep get(android.nfc.Tag);
method public byte[] getHiLayerResponse();
method public byte[] getHistoricalBytes();
method public int getMaxTransceiveLength();
+ method public android.nfc.Tag getTag();
method public int getTimeout();
+ method public boolean isConnected();
method public boolean isExtendedLengthApduSupported();
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
@@ -30478,6 +30705,8 @@ package android.nfc.tech {
method public boolean authenticateSectorWithKeyA(int, byte[]) throws java.io.IOException;
method public boolean authenticateSectorWithKeyB(int, byte[]) throws java.io.IOException;
method public int blockToSector(int);
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public void decrement(int, int) throws java.io.IOException;
method public static android.nfc.tech.MifareClassic get(android.nfc.Tag);
method public int getBlockCount();
@@ -30485,9 +30714,11 @@ package android.nfc.tech {
method public int getMaxTransceiveLength();
method public int getSectorCount();
method public int getSize();
+ method public android.nfc.Tag getTag();
method public int getTimeout();
method public int getType();
method public void increment(int, int) throws java.io.IOException;
+ method public boolean isConnected();
method public byte[] readBlock(int) throws java.io.IOException;
method public void restore(int) throws java.io.IOException;
method public int sectorToBlock(int);
@@ -30510,10 +30741,14 @@ package android.nfc.tech {
}
public final class MifareUltralight implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.MifareUltralight get(android.nfc.Tag);
method public int getMaxTransceiveLength();
+ method public android.nfc.Tag getTag();
method public int getTimeout();
method public int getType();
+ method public boolean isConnected();
method public byte[] readPages(int) throws java.io.IOException;
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
@@ -30526,75 +30761,103 @@ package android.nfc.tech {
public final class Ndef implements android.nfc.tech.TagTechnology {
method public boolean canMakeReadOnly();
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.Ndef get(android.nfc.Tag);
method public android.nfc.NdefMessage getCachedNdefMessage();
method public int getMaxSize();
method public android.nfc.NdefMessage getNdefMessage() throws android.nfc.FormatException, java.io.IOException;
- method public java.lang.String getType();
+ method public android.nfc.Tag getTag();
+ method public String getType();
+ method public boolean isConnected();
method public boolean isWritable();
method public boolean makeReadOnly() throws java.io.IOException;
method public void writeNdefMessage(android.nfc.NdefMessage) throws android.nfc.FormatException, java.io.IOException;
- field public static final java.lang.String MIFARE_CLASSIC = "com.nxp.ndef.mifareclassic";
- field public static final java.lang.String NFC_FORUM_TYPE_1 = "org.nfcforum.ndef.type1";
- field public static final java.lang.String NFC_FORUM_TYPE_2 = "org.nfcforum.ndef.type2";
- field public static final java.lang.String NFC_FORUM_TYPE_3 = "org.nfcforum.ndef.type3";
- field public static final java.lang.String NFC_FORUM_TYPE_4 = "org.nfcforum.ndef.type4";
+ field public static final String MIFARE_CLASSIC = "com.nxp.ndef.mifareclassic";
+ field public static final String NFC_FORUM_TYPE_1 = "org.nfcforum.ndef.type1";
+ field public static final String NFC_FORUM_TYPE_2 = "org.nfcforum.ndef.type2";
+ field public static final String NFC_FORUM_TYPE_3 = "org.nfcforum.ndef.type3";
+ field public static final String NFC_FORUM_TYPE_4 = "org.nfcforum.ndef.type4";
}
public final class NdefFormatable implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public void format(android.nfc.NdefMessage) throws android.nfc.FormatException, java.io.IOException;
method public void formatReadOnly(android.nfc.NdefMessage) throws android.nfc.FormatException, java.io.IOException;
method public static android.nfc.tech.NdefFormatable get(android.nfc.Tag);
+ method public android.nfc.Tag getTag();
+ method public boolean isConnected();
}
public final class NfcA implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.NfcA get(android.nfc.Tag);
method public byte[] getAtqa();
method public int getMaxTransceiveLength();
method public short getSak();
+ method public android.nfc.Tag getTag();
method public int getTimeout();
+ method public boolean isConnected();
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
public final class NfcB implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.NfcB get(android.nfc.Tag);
method public byte[] getApplicationData();
method public int getMaxTransceiveLength();
method public byte[] getProtocolInfo();
+ method public android.nfc.Tag getTag();
+ method public boolean isConnected();
method public byte[] transceive(byte[]) throws java.io.IOException;
}
public final class NfcBarcode implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.NfcBarcode get(android.nfc.Tag);
method public byte[] getBarcode();
+ method public android.nfc.Tag getTag();
method public int getType();
+ method public boolean isConnected();
field public static final int TYPE_KOVIO = 1; // 0x1
field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
}
public final class NfcF implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.NfcF get(android.nfc.Tag);
method public byte[] getManufacturer();
method public int getMaxTransceiveLength();
method public byte[] getSystemCode();
+ method public android.nfc.Tag getTag();
method public int getTimeout();
+ method public boolean isConnected();
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
public final class NfcV implements android.nfc.tech.TagTechnology {
+ method public void close() throws java.io.IOException;
+ method public void connect() throws java.io.IOException;
method public static android.nfc.tech.NfcV get(android.nfc.Tag);
method public byte getDsfId();
method public int getMaxTransceiveLength();
method public byte getResponseFlags();
+ method public android.nfc.Tag getTag();
+ method public boolean isConnected();
method public byte[] transceive(byte[]) throws java.io.IOException;
}
- public abstract interface TagTechnology implements java.io.Closeable {
- method public abstract void connect() throws java.io.IOException;
- method public abstract android.nfc.Tag getTag();
- method public abstract boolean isConnected();
+ public interface TagTechnology extends java.io.Closeable {
+ method public void connect() throws java.io.IOException;
+ method public android.nfc.Tag getTag();
+ method public boolean isConnected();
}
}
@@ -30610,8 +30873,8 @@ package android.opengl {
method public static android.opengl.EGLContext eglCreateContext(android.opengl.EGLDisplay, android.opengl.EGLConfig, android.opengl.EGLContext, int[], int);
method public static android.opengl.EGLSurface eglCreatePbufferFromClientBuffer(android.opengl.EGLDisplay, int, int, android.opengl.EGLConfig, int[], int);
method public static android.opengl.EGLSurface eglCreatePbufferSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, int[], int);
- method public static deprecated android.opengl.EGLSurface eglCreatePixmapSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, int, int[], int);
- method public static android.opengl.EGLSurface eglCreateWindowSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, java.lang.Object, int[], int);
+ method @Deprecated public static android.opengl.EGLSurface eglCreatePixmapSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, int, int[], int);
+ method public static android.opengl.EGLSurface eglCreateWindowSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, Object, int[], int);
method public static boolean eglDestroyContext(android.opengl.EGLDisplay, android.opengl.EGLContext);
method public static boolean eglDestroySurface(android.opengl.EGLDisplay, android.opengl.EGLSurface);
method public static boolean eglGetConfigAttrib(android.opengl.EGLDisplay, android.opengl.EGLConfig, int, int[], int);
@@ -30625,7 +30888,7 @@ package android.opengl {
method public static boolean eglMakeCurrent(android.opengl.EGLDisplay, android.opengl.EGLSurface, android.opengl.EGLSurface, android.opengl.EGLContext);
method public static int eglQueryAPI();
method public static boolean eglQueryContext(android.opengl.EGLDisplay, android.opengl.EGLContext, int, int[], int);
- method public static java.lang.String eglQueryString(android.opengl.EGLDisplay, int);
+ method public static String eglQueryString(android.opengl.EGLDisplay, int);
method public static boolean eglQuerySurface(android.opengl.EGLDisplay, android.opengl.EGLSurface, int, int[], int);
method public static boolean eglReleaseTexImage(android.opengl.EGLDisplay, android.opengl.EGLSurface, int);
method public static boolean eglReleaseThread();
@@ -30835,9 +31098,9 @@ package android.opengl {
}
public abstract class EGLObjectHandle {
- ctor protected deprecated EGLObjectHandle(int);
+ ctor @Deprecated protected EGLObjectHandle(int);
ctor protected EGLObjectHandle(long);
- method public deprecated int getHandle();
+ method @Deprecated public int getHandle();
method public long getNativeHandle();
}
@@ -30942,7 +31205,7 @@ package android.opengl {
method public static int glGetError();
method public static void glGetIntegerv(int, int[], int);
method public static void glGetIntegerv(int, java.nio.IntBuffer);
- method public static java.lang.String glGetString(int);
+ method public static String glGetString(int);
method public static void glHint(int, int);
method public static void glLightModelf(int, float);
method public static void glLightModelfv(int, float[], int);
@@ -31691,7 +31954,7 @@ package android.opengl {
ctor public GLES20();
method public static void glActiveTexture(int);
method public static void glAttachShader(int, int);
- method public static void glBindAttribLocation(int, int, java.lang.String);
+ method public static void glBindAttribLocation(int, int, String);
method public static void glBindBuffer(int, int);
method public static void glBindFramebuffer(int, int);
method public static void glBindRenderbuffer(int, int);
@@ -31753,14 +32016,14 @@ package android.opengl {
method public static void glGenTextures(int, java.nio.IntBuffer);
method public static void glGenerateMipmap(int);
method public static void glGetActiveAttrib(int, int, int, int[], int, int[], int, int[], int, byte[], int);
- method public static java.lang.String glGetActiveAttrib(int, int, int[], int, int[], int);
- method public static java.lang.String glGetActiveAttrib(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
+ method public static String glGetActiveAttrib(int, int, int[], int, int[], int);
+ method public static String glGetActiveAttrib(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
method public static void glGetActiveUniform(int, int, int, int[], int, int[], int, int[], int, byte[], int);
- method public static java.lang.String glGetActiveUniform(int, int, int[], int, int[], int);
- method public static java.lang.String glGetActiveUniform(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
+ method public static String glGetActiveUniform(int, int, int[], int, int[], int);
+ method public static String glGetActiveUniform(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
method public static void glGetAttachedShaders(int, int, int[], int, int[], int);
method public static void glGetAttachedShaders(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
- method public static int glGetAttribLocation(int, java.lang.String);
+ method public static int glGetAttribLocation(int, String);
method public static void glGetBooleanv(int, boolean[], int);
method public static void glGetBooleanv(int, java.nio.IntBuffer);
method public static void glGetBufferParameteriv(int, int, int[], int);
@@ -31772,24 +32035,24 @@ package android.opengl {
method public static void glGetFramebufferAttachmentParameteriv(int, int, int, java.nio.IntBuffer);
method public static void glGetIntegerv(int, int[], int);
method public static void glGetIntegerv(int, java.nio.IntBuffer);
- method public static java.lang.String glGetProgramInfoLog(int);
+ method public static String glGetProgramInfoLog(int);
method public static void glGetProgramiv(int, int, int[], int);
method public static void glGetProgramiv(int, int, java.nio.IntBuffer);
method public static void glGetRenderbufferParameteriv(int, int, int[], int);
method public static void glGetRenderbufferParameteriv(int, int, java.nio.IntBuffer);
- method public static java.lang.String glGetShaderInfoLog(int);
+ method public static String glGetShaderInfoLog(int);
method public static void glGetShaderPrecisionFormat(int, int, int[], int, int[], int);
method public static void glGetShaderPrecisionFormat(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
method public static void glGetShaderSource(int, int, int[], int, byte[], int);
- method public static java.lang.String glGetShaderSource(int);
+ method public static String glGetShaderSource(int);
method public static void glGetShaderiv(int, int, int[], int);
method public static void glGetShaderiv(int, int, java.nio.IntBuffer);
- method public static java.lang.String glGetString(int);
+ method public static String glGetString(int);
method public static void glGetTexParameterfv(int, int, float[], int);
method public static void glGetTexParameterfv(int, int, java.nio.FloatBuffer);
method public static void glGetTexParameteriv(int, int, int[], int);
method public static void glGetTexParameteriv(int, int, java.nio.IntBuffer);
- method public static int glGetUniformLocation(int, java.lang.String);
+ method public static int glGetUniformLocation(int, String);
method public static void glGetUniformfv(int, int, float[], int);
method public static void glGetUniformfv(int, int, java.nio.FloatBuffer);
method public static void glGetUniformiv(int, int, int[], int);
@@ -31817,7 +32080,7 @@ package android.opengl {
method public static void glScissor(int, int, int, int);
method public static void glShaderBinary(int, int[], int, int, java.nio.Buffer, int);
method public static void glShaderBinary(int, java.nio.IntBuffer, int, java.nio.Buffer, int);
- method public static void glShaderSource(int, java.lang.String);
+ method public static void glShaderSource(int, String);
method public static void glStencilFunc(int, int, int);
method public static void glStencilFuncSeparate(int, int, int, int);
method public static void glStencilMask(int);
@@ -32100,7 +32363,7 @@ package android.opengl {
field public static final int GL_STENCIL_CLEAR_VALUE = 2961; // 0xb91
field public static final int GL_STENCIL_FAIL = 2964; // 0xb94
field public static final int GL_STENCIL_FUNC = 2962; // 0xb92
- field public static final deprecated int GL_STENCIL_INDEX = 6401; // 0x1901
+ field @Deprecated public static final int GL_STENCIL_INDEX = 6401; // 0x1901
field public static final int GL_STENCIL_INDEX8 = 36168; // 0x8d48
field public static final int GL_STENCIL_PASS_DEPTH_FAIL = 2965; // 0xb95
field public static final int GL_STENCIL_PASS_DEPTH_PASS = 2966; // 0xb96
@@ -32238,7 +32501,7 @@ package android.opengl {
method public static void glGenVertexArrays(int, java.nio.IntBuffer);
method public static void glGetActiveUniformBlockName(int, int, int, int[], int, byte[], int);
method public static void glGetActiveUniformBlockName(int, int, java.nio.Buffer, java.nio.Buffer);
- method public static java.lang.String glGetActiveUniformBlockName(int, int);
+ method public static String glGetActiveUniformBlockName(int, int);
method public static void glGetActiveUniformBlockiv(int, int, int, int[], int);
method public static void glGetActiveUniformBlockiv(int, int, int, java.nio.IntBuffer);
method public static void glGetActiveUniformsiv(int, int, int[], int, int, int[], int);
@@ -32246,7 +32509,7 @@ package android.opengl {
method public static void glGetBufferParameteri64v(int, int, long[], int);
method public static void glGetBufferParameteri64v(int, int, java.nio.LongBuffer);
method public static java.nio.Buffer glGetBufferPointerv(int, int);
- method public static int glGetFragDataLocation(int, java.lang.String);
+ method public static int glGetFragDataLocation(int, String);
method public static void glGetInteger64i_v(int, int, long[], int);
method public static void glGetInteger64i_v(int, int, java.nio.LongBuffer);
method public static void glGetInteger64v(int, long[], int);
@@ -32265,17 +32528,17 @@ package android.opengl {
method public static void glGetSamplerParameterfv(int, int, java.nio.FloatBuffer);
method public static void glGetSamplerParameteriv(int, int, int[], int);
method public static void glGetSamplerParameteriv(int, int, java.nio.IntBuffer);
- method public static java.lang.String glGetStringi(int, int);
+ method public static String glGetStringi(int, int);
method public static void glGetSynciv(long, int, int, int[], int, int[], int);
method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer);
method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int);
- method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte);
+ method @Deprecated public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte);
method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer);
- method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int);
- method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
- method public static int glGetUniformBlockIndex(int, java.lang.String);
- method public static void glGetUniformIndices(int, java.lang.String[], int[], int);
- method public static void glGetUniformIndices(int, java.lang.String[], java.nio.IntBuffer);
+ method public static String glGetTransformFeedbackVarying(int, int, int[], int, int[], int);
+ method public static String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer);
+ method public static int glGetUniformBlockIndex(int, String);
+ method public static void glGetUniformIndices(int, String[], int[], int);
+ method public static void glGetUniformIndices(int, String[], java.nio.IntBuffer);
method public static void glGetUniformuiv(int, int, int[], int);
method public static void glGetUniformuiv(int, int, java.nio.IntBuffer);
method public static void glGetVertexAttribIiv(int, int, int[], int);
@@ -32311,7 +32574,7 @@ package android.opengl {
method public static void glTexStorage3D(int, int, int, int, int, int);
method public static void glTexSubImage3D(int, int, int, int, int, int, int, int, int, int, java.nio.Buffer);
method public static void glTexSubImage3D(int, int, int, int, int, int, int, int, int, int, int);
- method public static void glTransformFeedbackVaryings(int, java.lang.String[], int);
+ method public static void glTransformFeedbackVaryings(int, String[], int);
method public static void glUniform1ui(int, int);
method public static void glUniform1uiv(int, int, int[], int);
method public static void glUniform1uiv(int, int, java.nio.IntBuffer);
@@ -32660,7 +32923,7 @@ package android.opengl {
method public static void glBindImageTexture(int, int, int, boolean, int, int, int);
method public static void glBindProgramPipeline(int);
method public static void glBindVertexBuffer(int, int, long, int);
- method public static int glCreateShaderProgramv(int, java.lang.String[]);
+ method public static int glCreateShaderProgramv(int, String[]);
method public static void glDeleteProgramPipelines(int, int[], int);
method public static void glDeleteProgramPipelines(int, java.nio.IntBuffer);
method public static void glDispatchCompute(int, int, int);
@@ -32678,12 +32941,12 @@ package android.opengl {
method public static void glGetMultisamplefv(int, int, java.nio.FloatBuffer);
method public static void glGetProgramInterfaceiv(int, int, int, int[], int);
method public static void glGetProgramInterfaceiv(int, int, int, java.nio.IntBuffer);
- method public static java.lang.String glGetProgramPipelineInfoLog(int);
+ method public static String glGetProgramPipelineInfoLog(int);
method public static void glGetProgramPipelineiv(int, int, int[], int);
method public static void glGetProgramPipelineiv(int, int, java.nio.IntBuffer);
- method public static int glGetProgramResourceIndex(int, int, java.lang.String);
- method public static int glGetProgramResourceLocation(int, int, java.lang.String);
- method public static java.lang.String glGetProgramResourceName(int, int, int);
+ method public static int glGetProgramResourceIndex(int, int, String);
+ method public static int glGetProgramResourceLocation(int, int, String);
+ method public static String glGetProgramResourceName(int, int, int);
method public static void glGetProgramResourceiv(int, int, int, int, int[], int, int, int[], int, int[], int);
method public static void glGetProgramResourceiv(int, int, int, int, java.nio.IntBuffer, int, java.nio.IntBuffer, java.nio.IntBuffer);
method public static void glGetTexLevelParameterfv(int, int, int, float[], int);
@@ -32941,17 +33204,17 @@ package android.opengl {
method public static void glDebugMessageCallbackKHR(android.opengl.GLES31Ext.DebugProcKHR);
method public static void glDebugMessageControlKHR(int, int, int, int, int[], int, boolean);
method public static void glDebugMessageControlKHR(int, int, int, int, java.nio.IntBuffer, boolean);
- method public static void glDebugMessageInsertKHR(int, int, int, int, java.lang.String);
+ method public static void glDebugMessageInsertKHR(int, int, int, int, String);
method public static void glDisableiEXT(int, int);
method public static void glEnableiEXT(int, int);
method public static void glFramebufferTextureEXT(int, int, int, int);
method public static android.opengl.GLES31Ext.DebugProcKHR glGetDebugMessageCallbackKHR();
method public static int glGetDebugMessageLogKHR(int, int, int[], int, int[], int, int[], int, int[], int, int[], int, byte[], int);
method public static int glGetDebugMessageLogKHR(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer);
- method public static java.lang.String[] glGetDebugMessageLogKHR(int, int[], int, int[], int, int[], int, int[], int);
- method public static java.lang.String[] glGetDebugMessageLogKHR(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer);
- method public static java.lang.String glGetObjectLabelKHR(int, int);
- method public static java.lang.String glGetObjectPtrLabelKHR(long);
+ method public static String[] glGetDebugMessageLogKHR(int, int[], int, int[], int, int[], int, int[], int);
+ method public static String[] glGetDebugMessageLogKHR(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer);
+ method public static String glGetObjectLabelKHR(int, int);
+ method public static String glGetObjectPtrLabelKHR(long);
method public static void glGetSamplerParameterIivEXT(int, int, int[], int);
method public static void glGetSamplerParameterIivEXT(int, int, java.nio.IntBuffer);
method public static void glGetSamplerParameterIuivEXT(int, int, int[], int);
@@ -32962,12 +33225,12 @@ package android.opengl {
method public static void glGetTexParameterIuivEXT(int, int, java.nio.IntBuffer);
method public static boolean glIsEnablediEXT(int, int);
method public static void glMinSampleShadingOES(float);
- method public static void glObjectLabelKHR(int, int, int, java.lang.String);
- method public static void glObjectPtrLabelKHR(long, java.lang.String);
+ method public static void glObjectLabelKHR(int, int, int, String);
+ method public static void glObjectPtrLabelKHR(long, String);
method public static void glPatchParameteriEXT(int, int);
method public static void glPopDebugGroupKHR();
method public static void glPrimitiveBoundingBoxEXT(float, float, float, float, float, float, float, float);
- method public static void glPushDebugGroupKHR(int, int, int, java.lang.String);
+ method public static void glPushDebugGroupKHR(int, int, int, String);
method public static void glSamplerParameterIivEXT(int, int, int[], int);
method public static void glSamplerParameterIivEXT(int, int, java.nio.IntBuffer);
method public static void glSamplerParameterIuivEXT(int, int, int[], int);
@@ -33181,8 +33444,8 @@ package android.opengl {
field public static final int GL_VERTEX_ARRAY_KHR = 32884; // 0x8074
}
- public static abstract interface GLES31Ext.DebugProcKHR {
- method public abstract void onMessage(int, int, int, int, java.lang.String);
+ public static interface GLES31Ext.DebugProcKHR {
+ method public void onMessage(int, int, int, int, String);
}
public class GLES32 extends android.opengl.GLES31 {
@@ -33196,7 +33459,7 @@ package android.opengl {
method public static void glDebugMessageCallback(android.opengl.GLES32.DebugProc);
method public static void glDebugMessageControl(int, int, int, int, int[], int, boolean);
method public static void glDebugMessageControl(int, int, int, int, java.nio.IntBuffer, boolean);
- method public static void glDebugMessageInsert(int, int, int, int, int, java.lang.String);
+ method public static void glDebugMessageInsert(int, int, int, int, int, String);
method public static void glDisablei(int, int);
method public static void glDrawElementsBaseVertex(int, int, int, java.nio.Buffer, int);
method public static void glDrawElementsInstancedBaseVertex(int, int, int, java.nio.Buffer, int, int);
@@ -33206,11 +33469,11 @@ package android.opengl {
method public static void glFramebufferTexture(int, int, int, int);
method public static int glGetDebugMessageLog(int, int, int[], int, int[], int, int[], int, int[], int, int[], int, byte[], int);
method public static int glGetDebugMessageLog(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer);
- method public static java.lang.String[] glGetDebugMessageLog(int, int[], int, int[], int, int[], int, int[], int);
- method public static java.lang.String[] glGetDebugMessageLog(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer);
+ method public static String[] glGetDebugMessageLog(int, int[], int, int[], int, int[], int, int[], int);
+ method public static String[] glGetDebugMessageLog(int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer);
method public static int glGetGraphicsResetStatus();
- method public static java.lang.String glGetObjectLabel(int, int);
- method public static java.lang.String glGetObjectPtrLabel(long);
+ method public static String glGetObjectLabel(int, int);
+ method public static String glGetObjectPtrLabel(long);
method public static long glGetPointerv(int);
method public static void glGetSamplerParameterIiv(int, int, int[], int);
method public static void glGetSamplerParameterIiv(int, int, java.nio.IntBuffer);
@@ -33228,12 +33491,12 @@ package android.opengl {
method public static void glGetnUniformuiv(int, int, int, java.nio.IntBuffer);
method public static boolean glIsEnabledi(int, int);
method public static void glMinSampleShading(float);
- method public static void glObjectLabel(int, int, int, java.lang.String);
- method public static void glObjectPtrLabel(long, java.lang.String);
+ method public static void glObjectLabel(int, int, int, String);
+ method public static void glObjectPtrLabel(long, String);
method public static void glPatchParameteri(int, int);
method public static void glPopDebugGroup();
method public static void glPrimitiveBoundingBox(float, float, float, float, float, float, float, float);
- method public static void glPushDebugGroup(int, int, int, java.lang.String);
+ method public static void glPushDebugGroup(int, int, int, String);
method public static void glReadnPixels(int, int, int, int, int, int, int, java.nio.Buffer);
method public static void glSamplerParameterIiv(int, int, int[], int);
method public static void glSamplerParameterIiv(int, int, java.nio.IntBuffer);
@@ -33454,13 +33717,13 @@ package android.opengl {
field public static final int GL_VERTEX_ARRAY = 32884; // 0x8074
}
- public static abstract interface GLES32.DebugProc {
- method public abstract void onMessage(int, int, int, int, java.lang.String);
+ public static interface GLES32.DebugProc {
+ method public void onMessage(int, int, int, int, String);
}
public class GLException extends java.lang.RuntimeException {
ctor public GLException(int);
- ctor public GLException(int, java.lang.String);
+ ctor public GLException(int, String);
}
public class GLSurfaceView extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback2 {
@@ -33471,7 +33734,7 @@ package android.opengl {
method public int getRenderMode();
method public void onPause();
method public void onResume();
- method public void queueEvent(java.lang.Runnable);
+ method public void queueEvent(Runnable);
method public void requestRender();
method public void setDebugFlags(int);
method public void setEGLConfigChooser(android.opengl.GLSurfaceView.EGLConfigChooser);
@@ -33487,40 +33750,40 @@ package android.opengl {
method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
method public void surfaceCreated(android.view.SurfaceHolder);
method public void surfaceDestroyed(android.view.SurfaceHolder);
- method public deprecated void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method @Deprecated public void surfaceRedrawNeeded(android.view.SurfaceHolder);
field public static final int DEBUG_CHECK_GL_ERROR = 1; // 0x1
field public static final int DEBUG_LOG_GL_CALLS = 2; // 0x2
field public static final int RENDERMODE_CONTINUOUSLY = 1; // 0x1
field public static final int RENDERMODE_WHEN_DIRTY = 0; // 0x0
}
- public static abstract interface GLSurfaceView.EGLConfigChooser {
- method public abstract javax.microedition.khronos.egl.EGLConfig chooseConfig(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay);
+ public static interface GLSurfaceView.EGLConfigChooser {
+ method public javax.microedition.khronos.egl.EGLConfig chooseConfig(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay);
}
- public static abstract interface GLSurfaceView.EGLContextFactory {
- method public abstract javax.microedition.khronos.egl.EGLContext createContext(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig);
- method public abstract void destroyContext(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext);
+ public static interface GLSurfaceView.EGLContextFactory {
+ method public javax.microedition.khronos.egl.EGLContext createContext(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig);
+ method public void destroyContext(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext);
}
- public static abstract interface GLSurfaceView.EGLWindowSurfaceFactory {
- method public abstract javax.microedition.khronos.egl.EGLSurface createWindowSurface(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, java.lang.Object);
- method public abstract void destroySurface(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
+ public static interface GLSurfaceView.EGLWindowSurfaceFactory {
+ method public javax.microedition.khronos.egl.EGLSurface createWindowSurface(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object);
+ method public void destroySurface(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
}
- public static abstract interface GLSurfaceView.GLWrapper {
- method public abstract javax.microedition.khronos.opengles.GL wrap(javax.microedition.khronos.opengles.GL);
+ public static interface GLSurfaceView.GLWrapper {
+ method public javax.microedition.khronos.opengles.GL wrap(javax.microedition.khronos.opengles.GL);
}
- public static abstract interface GLSurfaceView.Renderer {
- method public abstract void onDrawFrame(javax.microedition.khronos.opengles.GL10);
- method public abstract void onSurfaceChanged(javax.microedition.khronos.opengles.GL10, int, int);
- method public abstract void onSurfaceCreated(javax.microedition.khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig);
+ public static interface GLSurfaceView.Renderer {
+ method public void onDrawFrame(javax.microedition.khronos.opengles.GL10);
+ method public void onSurfaceChanged(javax.microedition.khronos.opengles.GL10, int, int);
+ method public void onSurfaceCreated(javax.microedition.khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig);
}
public class GLU {
ctor public GLU();
- method public static java.lang.String gluErrorString(int);
+ method public static String gluErrorString(int);
method public static void gluLookAt(javax.microedition.khronos.opengles.GL10, float, float, float, float, float, float, float, float, float);
method public static void gluOrtho2D(javax.microedition.khronos.opengles.GL10, float, float, float, float);
method public static void gluPerspective(javax.microedition.khronos.opengles.GL10, float, float, float, float);
@@ -33529,7 +33792,7 @@ package android.opengl {
}
public final class GLUtils {
- method public static java.lang.String getEGLErrorString(int);
+ method public static String getEGLErrorString(int);
method public static int getInternalFormat(android.graphics.Bitmap);
method public static int getType(android.graphics.Bitmap);
method public static void texImage2D(int, int, int, android.graphics.Bitmap, int);
@@ -33540,7 +33803,7 @@ package android.opengl {
}
public class Matrix {
- ctor public deprecated Matrix();
+ ctor @Deprecated public Matrix();
method public static void frustumM(float[], int, float, float, float, float, float, float);
method public static boolean invertM(float[], int, float[], int);
method public static float length(float, float, float);
@@ -33575,70 +33838,68 @@ package android.os {
public abstract class AsyncTask<Params, Progress, Result> {
ctor public AsyncTask();
method public final boolean cancel(boolean);
- method protected abstract Result doInBackground(Params...);
- method public final android.os.AsyncTask<Params, Progress, Result> execute(Params...);
- method public static void execute(java.lang.Runnable);
- method public final android.os.AsyncTask<Params, Progress, Result> executeOnExecutor(java.util.concurrent.Executor, Params...);
+ method @WorkerThread protected abstract Result doInBackground(Params...);
+ method @MainThread public final android.os.AsyncTask<Params,Progress,Result> execute(Params...);
+ method @MainThread public static void execute(Runnable);
+ method @MainThread public final android.os.AsyncTask<Params,Progress,Result> executeOnExecutor(java.util.concurrent.Executor, Params...);
method public final Result get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
method public final Result get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
method public final android.os.AsyncTask.Status getStatus();
method public final boolean isCancelled();
- method protected void onCancelled(Result);
- method protected void onCancelled();
- method protected void onPostExecute(Result);
- method protected void onPreExecute();
- method protected void onProgressUpdate(Progress...);
- method protected final void publishProgress(Progress...);
+ method @MainThread protected void onCancelled(Result);
+ method @MainThread protected void onCancelled();
+ method @MainThread protected void onPostExecute(Result);
+ method @MainThread protected void onPreExecute();
+ method @MainThread protected void onProgressUpdate(Progress...);
+ method @WorkerThread protected final void publishProgress(Progress...);
field public static final java.util.concurrent.Executor SERIAL_EXECUTOR;
field public static final java.util.concurrent.Executor THREAD_POOL_EXECUTOR;
}
- public static final class AsyncTask.Status extends java.lang.Enum {
- method public static android.os.AsyncTask.Status valueOf(java.lang.String);
- method public static final android.os.AsyncTask.Status[] values();
+ public enum AsyncTask.Status {
enum_constant public static final android.os.AsyncTask.Status FINISHED;
enum_constant public static final android.os.AsyncTask.Status PENDING;
enum_constant public static final android.os.AsyncTask.Status RUNNING;
}
public class BadParcelableException extends android.util.AndroidRuntimeException {
- ctor public BadParcelableException(java.lang.String);
- ctor public BadParcelableException(java.lang.Exception);
+ ctor public BadParcelableException(String);
+ ctor public BadParcelableException(Exception);
}
public class BaseBundle {
method public void clear();
- method public boolean containsKey(java.lang.String);
- method public java.lang.Object get(java.lang.String);
- method public boolean getBoolean(java.lang.String);
- method public boolean getBoolean(java.lang.String, boolean);
- method public boolean[] getBooleanArray(java.lang.String);
- method public double getDouble(java.lang.String);
- method public double getDouble(java.lang.String, double);
- method public double[] getDoubleArray(java.lang.String);
- method public int getInt(java.lang.String);
- method public int getInt(java.lang.String, int);
- method public int[] getIntArray(java.lang.String);
- method public long getLong(java.lang.String);
- method public long getLong(java.lang.String, long);
- method public long[] getLongArray(java.lang.String);
- method public java.lang.String getString(java.lang.String);
- method public java.lang.String getString(java.lang.String, java.lang.String);
- method public java.lang.String[] getStringArray(java.lang.String);
+ method public boolean containsKey(String);
+ method @Nullable public Object get(String);
+ method public boolean getBoolean(String);
+ method public boolean getBoolean(String, boolean);
+ method @Nullable public boolean[] getBooleanArray(@Nullable String);
+ method public double getDouble(String);
+ method public double getDouble(String, double);
+ method @Nullable public double[] getDoubleArray(@Nullable String);
+ method public int getInt(String);
+ method public int getInt(String, int);
+ method @Nullable public int[] getIntArray(@Nullable String);
+ method public long getLong(String);
+ method public long getLong(String, long);
+ method @Nullable public long[] getLongArray(@Nullable String);
+ method @Nullable public String getString(@Nullable String);
+ method public String getString(@Nullable String, String);
+ method @Nullable public String[] getStringArray(@Nullable String);
method public boolean isEmpty();
method public java.util.Set<java.lang.String> keySet();
method public void putAll(android.os.PersistableBundle);
- method public void putBoolean(java.lang.String, boolean);
- method public void putBooleanArray(java.lang.String, boolean[]);
- method public void putDouble(java.lang.String, double);
- method public void putDoubleArray(java.lang.String, double[]);
- method public void putInt(java.lang.String, int);
- method public void putIntArray(java.lang.String, int[]);
- method public void putLong(java.lang.String, long);
- method public void putLongArray(java.lang.String, long[]);
- method public void putString(java.lang.String, java.lang.String);
- method public void putStringArray(java.lang.String, java.lang.String[]);
- method public void remove(java.lang.String);
+ method public void putBoolean(@Nullable String, boolean);
+ method public void putBooleanArray(@Nullable String, @Nullable boolean[]);
+ method public void putDouble(@Nullable String, double);
+ method public void putDoubleArray(@Nullable String, @Nullable double[]);
+ method public void putInt(@Nullable String, int);
+ method public void putIntArray(@Nullable String, @Nullable int[]);
+ method public void putLong(@Nullable String, long);
+ method public void putLongArray(@Nullable String, @Nullable long[]);
+ method public void putString(@Nullable String, @Nullable String);
+ method public void putStringArray(@Nullable String, @Nullable String[]);
+ method public void remove(String);
method public int size();
}
@@ -33647,8 +33908,8 @@ package android.os {
method public int getIntProperty(int);
method public long getLongProperty(int);
method public boolean isCharging();
- field public static final java.lang.String ACTION_CHARGING = "android.os.action.CHARGING";
- field public static final java.lang.String ACTION_DISCHARGING = "android.os.action.DISCHARGING";
+ field public static final String ACTION_CHARGING = "android.os.action.CHARGING";
+ field public static final String ACTION_DISCHARGING = "android.os.action.DISCHARGING";
field public static final int BATTERY_HEALTH_COLD = 7; // 0x7
field public static final int BATTERY_HEALTH_DEAD = 4; // 0x4
field public static final int BATTERY_HEALTH_GOOD = 2; // 0x2
@@ -33670,92 +33931,93 @@ package android.os {
field public static final int BATTERY_STATUS_FULL = 5; // 0x5
field public static final int BATTERY_STATUS_NOT_CHARGING = 4; // 0x4
field public static final int BATTERY_STATUS_UNKNOWN = 1; // 0x1
- field public static final java.lang.String EXTRA_BATTERY_LOW = "battery_low";
- field public static final java.lang.String EXTRA_HEALTH = "health";
- field public static final java.lang.String EXTRA_ICON_SMALL = "icon-small";
- field public static final java.lang.String EXTRA_LEVEL = "level";
- field public static final java.lang.String EXTRA_PLUGGED = "plugged";
- field public static final java.lang.String EXTRA_PRESENT = "present";
- field public static final java.lang.String EXTRA_SCALE = "scale";
- field public static final java.lang.String EXTRA_STATUS = "status";
- field public static final java.lang.String EXTRA_TECHNOLOGY = "technology";
- field public static final java.lang.String EXTRA_TEMPERATURE = "temperature";
- field public static final java.lang.String EXTRA_VOLTAGE = "voltage";
+ field public static final String EXTRA_BATTERY_LOW = "battery_low";
+ field public static final String EXTRA_HEALTH = "health";
+ field public static final String EXTRA_ICON_SMALL = "icon-small";
+ field public static final String EXTRA_LEVEL = "level";
+ field public static final String EXTRA_PLUGGED = "plugged";
+ field public static final String EXTRA_PRESENT = "present";
+ field public static final String EXTRA_SCALE = "scale";
+ field public static final String EXTRA_STATUS = "status";
+ field public static final String EXTRA_TECHNOLOGY = "technology";
+ field public static final String EXTRA_TEMPERATURE = "temperature";
+ field public static final String EXTRA_VOLTAGE = "voltage";
}
public class Binder implements android.os.IBinder {
ctor public Binder();
- ctor public Binder(java.lang.String);
- method public void attachInterface(android.os.IInterface, java.lang.String);
+ ctor public Binder(@Nullable String);
+ method public void attachInterface(@Nullable android.os.IInterface, @Nullable String);
method public static final long clearCallingIdentity();
- method public void dump(java.io.FileDescriptor, java.lang.String[]);
- method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
+ method public void dump(@NonNull java.io.FileDescriptor, @Nullable String[]);
+ method protected void dump(@NonNull java.io.FileDescriptor, @NonNull java.io.PrintWriter, @Nullable String[]);
+ method public void dumpAsync(@NonNull java.io.FileDescriptor, @Nullable String[]);
method public static final void flushPendingCommands();
method public static final int getCallingPid();
method public static final int getCallingUid();
- method public static final android.os.UserHandle getCallingUserHandle();
- method public java.lang.String getInterfaceDescriptor();
+ method public static final int getCallingUidOrThrow();
+ method @NonNull public static final android.os.UserHandle getCallingUserHandle();
+ method @Nullable public String getInterfaceDescriptor();
method public boolean isBinderAlive();
method public static final void joinThreadPool();
- method public void linkToDeath(android.os.IBinder.DeathRecipient, int);
- method protected boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
+ method public void linkToDeath(@NonNull android.os.IBinder.DeathRecipient, int);
+ method protected boolean onTransact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException;
method public boolean pingBinder();
- method public android.os.IInterface queryLocalInterface(java.lang.String);
+ method @Nullable public android.os.IInterface queryLocalInterface(@NonNull String);
method public static final void restoreCallingIdentity(long);
- method public final boolean transact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
- method public boolean unlinkToDeath(android.os.IBinder.DeathRecipient, int);
+ method public final boolean transact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException;
+ method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int);
}
public class Build {
ctor public Build();
- method public static java.util.List<android.os.Build.Partition> getFingerprintedPartitions();
- method public static java.lang.String getRadioVersion();
- method public static java.lang.String getSerial();
- field public static final java.lang.String BOARD;
- field public static final java.lang.String BOOTLOADER;
- field public static final java.lang.String BRAND;
- field public static final deprecated java.lang.String CPU_ABI;
- field public static final deprecated java.lang.String CPU_ABI2;
- field public static final java.lang.String DEVICE;
- field public static final java.lang.String DISPLAY;
- field public static final java.lang.String FINGERPRINT;
- field public static final java.lang.String HARDWARE;
- field public static final java.lang.String HOST;
- field public static final java.lang.String ID;
- field public static final java.lang.String MANUFACTURER;
- field public static final java.lang.String MODEL;
- field public static final java.lang.String PRODUCT;
- field public static final deprecated java.lang.String RADIO;
- field public static final deprecated java.lang.String SERIAL;
- field public static final java.lang.String[] SUPPORTED_32_BIT_ABIS;
- field public static final java.lang.String[] SUPPORTED_64_BIT_ABIS;
- field public static final java.lang.String[] SUPPORTED_ABIS;
- field public static final java.lang.String TAGS;
+ method @NonNull public static java.util.List<android.os.Build.Partition> getFingerprintedPartitions();
+ method public static String getRadioVersion();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public static String getSerial();
+ field public static final String BOARD;
+ field public static final String BOOTLOADER;
+ field public static final String BRAND;
+ field @Deprecated public static final String CPU_ABI;
+ field @Deprecated public static final String CPU_ABI2;
+ field public static final String DEVICE;
+ field public static final String DISPLAY;
+ field public static final String FINGERPRINT;
+ field public static final String HARDWARE;
+ field public static final String HOST;
+ field public static final String ID;
+ field public static final String MANUFACTURER;
+ field public static final String MODEL;
+ field public static final String PRODUCT;
+ field @Deprecated public static final String RADIO;
+ field @Deprecated public static final String SERIAL;
+ field public static final String[] SUPPORTED_32_BIT_ABIS;
+ field public static final String[] SUPPORTED_64_BIT_ABIS;
+ field public static final String[] SUPPORTED_ABIS;
+ field public static final String TAGS;
field public static final long TIME;
- field public static final java.lang.String TYPE;
- field public static final java.lang.String UNKNOWN = "unknown";
- field public static final java.lang.String USER;
+ field public static final String TYPE;
+ field public static final String UNKNOWN = "unknown";
+ field public static final String USER;
}
public static class Build.Partition {
ctor public Build.Partition();
method public long getBuildTimeMillis();
- method public java.lang.String getFingerprint();
- method public java.lang.String getName();
- field public static final java.lang.String PARTITION_NAME_SYSTEM = "system";
+ method @NonNull public String getFingerprint();
+ method @NonNull public String getName();
+ field public static final String PARTITION_NAME_SYSTEM = "system";
}
public static class Build.VERSION {
ctor public Build.VERSION();
- field public static final java.lang.String BASE_OS;
- field public static final java.lang.String CODENAME;
- field public static final java.lang.String INCREMENTAL;
+ field public static final String BASE_OS;
+ field public static final String CODENAME;
+ field public static final String INCREMENTAL;
field public static final int PREVIEW_SDK_INT;
- field public static final java.lang.String RELEASE;
- field public static final deprecated java.lang.String SDK;
+ field public static final String RELEASE;
+ field @Deprecated public static final String SDK;
field public static final int SDK_INT;
- field public static final java.lang.String SECURITY_PATCH;
+ field public static final String SECURITY_PATCH;
}
public static class Build.VERSION_CODES {
@@ -33794,68 +34056,67 @@ package android.os {
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
ctor public Bundle();
- ctor public Bundle(java.lang.ClassLoader);
+ ctor public Bundle(ClassLoader);
ctor public Bundle(int);
ctor public Bundle(android.os.Bundle);
ctor public Bundle(android.os.PersistableBundle);
- method public java.lang.Object clone();
+ method public Object clone();
method public android.os.Bundle deepCopy();
method public int describeContents();
- method public android.os.IBinder getBinder(java.lang.String);
- method public android.os.Bundle getBundle(java.lang.String);
- method public byte getByte(java.lang.String);
- method public java.lang.Byte getByte(java.lang.String, byte);
- method public byte[] getByteArray(java.lang.String);
- method public char getChar(java.lang.String);
- method public char getChar(java.lang.String, char);
- method public char[] getCharArray(java.lang.String);
- method public java.lang.CharSequence getCharSequence(java.lang.String);
- method public java.lang.CharSequence getCharSequence(java.lang.String, java.lang.CharSequence);
- method public java.lang.CharSequence[] getCharSequenceArray(java.lang.String);
- method public java.util.ArrayList<java.lang.CharSequence> getCharSequenceArrayList(java.lang.String);
- method public java.lang.ClassLoader getClassLoader();
- method public float getFloat(java.lang.String);
- method public float getFloat(java.lang.String, float);
- method public float[] getFloatArray(java.lang.String);
- method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String);
- method public <T extends android.os.Parcelable> T getParcelable(java.lang.String);
- method public android.os.Parcelable[] getParcelableArray(java.lang.String);
- method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
- method public java.io.Serializable getSerializable(java.lang.String);
- method public short getShort(java.lang.String);
- method public short getShort(java.lang.String, short);
- method public short[] getShortArray(java.lang.String);
- method public android.util.Size getSize(java.lang.String);
- method public android.util.SizeF getSizeF(java.lang.String);
- method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
- method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
+ method @Nullable public android.os.IBinder getBinder(@Nullable String);
+ method @Nullable public android.os.Bundle getBundle(@Nullable String);
+ method public byte getByte(String);
+ method public Byte getByte(String, byte);
+ method @Nullable public byte[] getByteArray(@Nullable String);
+ method public char getChar(String);
+ method public char getChar(String, char);
+ method @Nullable public char[] getCharArray(@Nullable String);
+ method @Nullable public CharSequence getCharSequence(@Nullable String);
+ method public CharSequence getCharSequence(@Nullable String, CharSequence);
+ method @Nullable public CharSequence[] getCharSequenceArray(@Nullable String);
+ method @Nullable public java.util.ArrayList<java.lang.CharSequence> getCharSequenceArrayList(@Nullable String);
+ method public ClassLoader getClassLoader();
+ method public float getFloat(String);
+ method public float getFloat(String, float);
+ method @Nullable public float[] getFloatArray(@Nullable String);
+ method @Nullable public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(@Nullable String);
+ method @Nullable public <T extends android.os.Parcelable> T getParcelable(@Nullable String);
+ method @Nullable public android.os.Parcelable[] getParcelableArray(@Nullable String);
+ method @Nullable public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(@Nullable String);
+ method @Nullable public java.io.Serializable getSerializable(@Nullable String);
+ method public short getShort(String);
+ method public short getShort(String, short);
+ method @Nullable public short[] getShortArray(@Nullable String);
+ method @Nullable public android.util.Size getSize(@Nullable String);
+ method @Nullable public android.util.SizeF getSizeF(@Nullable String);
+ method @Nullable public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(@Nullable String);
+ method @Nullable public java.util.ArrayList<java.lang.String> getStringArrayList(@Nullable String);
method public boolean hasFileDescriptors();
method public void putAll(android.os.Bundle);
- method public void putBinder(java.lang.String, android.os.IBinder);
- method public void putBundle(java.lang.String, android.os.Bundle);
- method public void putByte(java.lang.String, byte);
- method public void putByteArray(java.lang.String, byte[]);
- method public void putChar(java.lang.String, char);
- method public void putCharArray(java.lang.String, char[]);
- method public void putCharSequence(java.lang.String, java.lang.CharSequence);
- method public void putCharSequenceArray(java.lang.String, java.lang.CharSequence[]);
- method public void putCharSequenceArrayList(java.lang.String, java.util.ArrayList<java.lang.CharSequence>);
- method public void putFloat(java.lang.String, float);
- method public void putFloatArray(java.lang.String, float[]);
- method public void putIntegerArrayList(java.lang.String, java.util.ArrayList<java.lang.Integer>);
- method public void putParcelable(java.lang.String, android.os.Parcelable);
- method public void putParcelableArray(java.lang.String, android.os.Parcelable[]);
- method public void putParcelableArrayList(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>);
- method public void putSerializable(java.lang.String, java.io.Serializable);
- method public void putShort(java.lang.String, short);
- method public void putShortArray(java.lang.String, short[]);
- method public void putSize(java.lang.String, android.util.Size);
- method public void putSizeF(java.lang.String, android.util.SizeF);
- method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray<? extends android.os.Parcelable>);
- method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
+ method public void putBinder(@Nullable String, @Nullable android.os.IBinder);
+ method public void putBundle(@Nullable String, @Nullable android.os.Bundle);
+ method public void putByte(@Nullable String, byte);
+ method public void putByteArray(@Nullable String, @Nullable byte[]);
+ method public void putChar(@Nullable String, char);
+ method public void putCharArray(@Nullable String, @Nullable char[]);
+ method public void putCharSequence(@Nullable String, @Nullable CharSequence);
+ method public void putCharSequenceArray(@Nullable String, @Nullable CharSequence[]);
+ method public void putCharSequenceArrayList(@Nullable String, @Nullable java.util.ArrayList<java.lang.CharSequence>);
+ method public void putFloat(@Nullable String, float);
+ method public void putFloatArray(@Nullable String, @Nullable float[]);
+ method public void putIntegerArrayList(@Nullable String, @Nullable java.util.ArrayList<java.lang.Integer>);
+ method public void putParcelable(@Nullable String, @Nullable android.os.Parcelable);
+ method public void putParcelableArray(@Nullable String, @Nullable android.os.Parcelable[]);
+ method public void putParcelableArrayList(@Nullable String, @Nullable java.util.ArrayList<? extends android.os.Parcelable>);
+ method public void putSerializable(@Nullable String, @Nullable java.io.Serializable);
+ method public void putShort(@Nullable String, short);
+ method public void putShortArray(@Nullable String, @Nullable short[]);
+ method public void putSize(@Nullable String, @Nullable android.util.Size);
+ method public void putSizeF(@Nullable String, @Nullable android.util.SizeF);
+ method public void putSparseParcelableArray(@Nullable String, @Nullable android.util.SparseArray<? extends android.os.Parcelable>);
+ method public void putStringArrayList(@Nullable String, @Nullable java.util.ArrayList<java.lang.String>);
method public void readFromParcel(android.os.Parcel);
- method public void setClassLoader(java.lang.ClassLoader);
- method public synchronized java.lang.String toString();
+ method public void setClassLoader(ClassLoader);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
field public static final android.os.Bundle EMPTY;
@@ -33869,8 +34130,8 @@ package android.os {
method public void throwIfCanceled();
}
- public static abstract interface CancellationSignal.OnCancelListener {
- method public abstract void onCancel();
+ public static interface CancellationSignal.OnCancelListener {
+ method public void onCancel();
}
public class ConditionVariable {
@@ -33884,10 +34145,10 @@ package android.os {
public abstract class CountDownTimer {
ctor public CountDownTimer(long, long);
- method public final synchronized void cancel();
+ method public final void cancel();
method public abstract void onFinish();
method public abstract void onTick(long);
- method public final synchronized android.os.CountDownTimer start();
+ method public final android.os.CountDownTimer start();
}
public final class CpuUsageInfo implements android.os.Parcelable {
@@ -33900,7 +34161,7 @@ package android.os {
public class DeadObjectException extends android.os.RemoteException {
ctor public DeadObjectException();
- ctor public DeadObjectException(java.lang.String);
+ ctor public DeadObjectException(String);
}
public class DeadSystemException extends android.os.DeadObjectException {
@@ -33908,69 +34169,69 @@ package android.os {
}
public final class Debug {
- method public static void attachJvmtiAgent(java.lang.String, java.lang.String, java.lang.ClassLoader) throws java.io.IOException;
- method public static deprecated void changeDebugPort(int);
- method public static void dumpHprofData(java.lang.String) throws java.io.IOException;
- method public static boolean dumpService(java.lang.String, java.io.FileDescriptor, java.lang.String[]);
+ method public static void attachJvmtiAgent(@NonNull String, @Nullable String, @Nullable ClassLoader) throws java.io.IOException;
+ method @Deprecated public static void changeDebugPort(int);
+ method public static void dumpHprofData(String) throws java.io.IOException;
+ method public static boolean dumpService(String, java.io.FileDescriptor, String[]);
method public static void enableEmulatorTraceOutput();
method public static int getBinderDeathObjectCount();
method public static int getBinderLocalObjectCount();
method public static int getBinderProxyObjectCount();
method public static int getBinderReceivedTransactions();
method public static int getBinderSentTransactions();
- method public static deprecated int getGlobalAllocCount();
- method public static deprecated int getGlobalAllocSize();
- method public static deprecated int getGlobalClassInitCount();
- method public static deprecated int getGlobalClassInitTime();
- method public static deprecated int getGlobalExternalAllocCount();
- method public static deprecated int getGlobalExternalAllocSize();
- method public static deprecated int getGlobalExternalFreedCount();
- method public static deprecated int getGlobalExternalFreedSize();
- method public static deprecated int getGlobalFreedCount();
- method public static deprecated int getGlobalFreedSize();
- method public static deprecated int getGlobalGcInvocationCount();
+ method @Deprecated public static int getGlobalAllocCount();
+ method @Deprecated public static int getGlobalAllocSize();
+ method @Deprecated public static int getGlobalClassInitCount();
+ method @Deprecated public static int getGlobalClassInitTime();
+ method @Deprecated public static int getGlobalExternalAllocCount();
+ method @Deprecated public static int getGlobalExternalAllocSize();
+ method @Deprecated public static int getGlobalExternalFreedCount();
+ method @Deprecated public static int getGlobalExternalFreedSize();
+ method @Deprecated public static int getGlobalFreedCount();
+ method @Deprecated public static int getGlobalFreedSize();
+ method @Deprecated public static int getGlobalGcInvocationCount();
method public static int getLoadedClassCount();
method public static void getMemoryInfo(android.os.Debug.MemoryInfo);
method public static long getNativeHeapAllocatedSize();
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
method public static long getPss();
- method public static java.lang.String getRuntimeStat(java.lang.String);
- method public static java.util.Map<java.lang.String, java.lang.String> getRuntimeStats();
- method public static deprecated int getThreadAllocCount();
- method public static deprecated int getThreadAllocSize();
- method public static deprecated int getThreadExternalAllocCount();
- method public static deprecated int getThreadExternalAllocSize();
- method public static deprecated int getThreadGcInvocationCount();
+ method public static String getRuntimeStat(String);
+ method public static java.util.Map<java.lang.String,java.lang.String> getRuntimeStats();
+ method @Deprecated public static int getThreadAllocCount();
+ method @Deprecated public static int getThreadAllocSize();
+ method @Deprecated public static int getThreadExternalAllocCount();
+ method @Deprecated public static int getThreadExternalAllocSize();
+ method @Deprecated public static int getThreadGcInvocationCount();
method public static boolean isDebuggerConnected();
method public static void printLoadedClasses(int);
- method public static deprecated void resetAllCounts();
- method public static deprecated void resetGlobalAllocCount();
- method public static deprecated void resetGlobalAllocSize();
- method public static deprecated void resetGlobalClassInitCount();
- method public static deprecated void resetGlobalClassInitTime();
- method public static deprecated void resetGlobalExternalAllocCount();
- method public static deprecated void resetGlobalExternalAllocSize();
- method public static deprecated void resetGlobalExternalFreedCount();
- method public static deprecated void resetGlobalExternalFreedSize();
- method public static deprecated void resetGlobalFreedCount();
- method public static deprecated void resetGlobalFreedSize();
- method public static deprecated void resetGlobalGcInvocationCount();
- method public static deprecated void resetThreadAllocCount();
- method public static deprecated void resetThreadAllocSize();
- method public static deprecated void resetThreadExternalAllocCount();
- method public static deprecated void resetThreadExternalAllocSize();
- method public static deprecated void resetThreadGcInvocationCount();
- method public static deprecated int setAllocationLimit(int);
- method public static deprecated int setGlobalAllocationLimit(int);
- method public static deprecated void startAllocCounting();
+ method @Deprecated public static void resetAllCounts();
+ method @Deprecated public static void resetGlobalAllocCount();
+ method @Deprecated public static void resetGlobalAllocSize();
+ method @Deprecated public static void resetGlobalClassInitCount();
+ method @Deprecated public static void resetGlobalClassInitTime();
+ method @Deprecated public static void resetGlobalExternalAllocCount();
+ method @Deprecated public static void resetGlobalExternalAllocSize();
+ method @Deprecated public static void resetGlobalExternalFreedCount();
+ method @Deprecated public static void resetGlobalExternalFreedSize();
+ method @Deprecated public static void resetGlobalFreedCount();
+ method @Deprecated public static void resetGlobalFreedSize();
+ method @Deprecated public static void resetGlobalGcInvocationCount();
+ method @Deprecated public static void resetThreadAllocCount();
+ method @Deprecated public static void resetThreadAllocSize();
+ method @Deprecated public static void resetThreadExternalAllocCount();
+ method @Deprecated public static void resetThreadExternalAllocSize();
+ method @Deprecated public static void resetThreadGcInvocationCount();
+ method @Deprecated public static int setAllocationLimit(int);
+ method @Deprecated public static int setGlobalAllocationLimit(int);
+ method @Deprecated public static void startAllocCounting();
method public static void startMethodTracing();
- method public static void startMethodTracing(java.lang.String);
- method public static void startMethodTracing(java.lang.String, int);
- method public static void startMethodTracing(java.lang.String, int, int);
- method public static void startMethodTracingSampling(java.lang.String, int, int);
+ method public static void startMethodTracing(String);
+ method public static void startMethodTracing(String, int);
+ method public static void startMethodTracing(String, int, int);
+ method public static void startMethodTracingSampling(String, int, int);
method public static void startNativeTracing();
- method public static deprecated void stopAllocCounting();
+ method @Deprecated public static void stopAllocCounting();
method public static void stopMethodTracing();
method public static void stopNativeTracing();
method public static long threadCpuTimeNanos();
@@ -33979,22 +34240,22 @@ package android.os {
field public static final int SHOW_CLASSLOADER = 2; // 0x2
field public static final int SHOW_FULL_DETAIL = 1; // 0x1
field public static final int SHOW_INITIALIZED = 4; // 0x4
- field public static final deprecated int TRACE_COUNT_ALLOCS = 1; // 0x1
+ field @Deprecated public static final int TRACE_COUNT_ALLOCS = 1; // 0x1
}
- public static deprecated class Debug.InstructionCount {
- ctor public Debug.InstructionCount();
- method public boolean collect();
- method public int globalMethodInvocations();
- method public int globalTotal();
- method public boolean resetAndStart();
+ @Deprecated public static class Debug.InstructionCount {
+ ctor @Deprecated public Debug.InstructionCount();
+ method @Deprecated public boolean collect();
+ method @Deprecated public int globalMethodInvocations();
+ method @Deprecated public int globalTotal();
+ method @Deprecated public boolean resetAndStart();
}
public static class Debug.MemoryInfo implements android.os.Parcelable {
ctor public Debug.MemoryInfo();
method public int describeContents();
- method public java.lang.String getMemoryStat(java.lang.String);
- method public java.util.Map<java.lang.String, java.lang.String> getMemoryStats();
+ method public String getMemoryStat(String);
+ method public java.util.Map<java.lang.String,java.lang.String> getMemoryStats();
method public int getTotalPrivateClean();
method public int getTotalPrivateDirty();
method public int getTotalPss();
@@ -34017,31 +34278,31 @@ package android.os {
public class DropBoxManager {
ctor protected DropBoxManager();
- method public void addData(java.lang.String, byte[], int);
- method public void addFile(java.lang.String, java.io.File, int) throws java.io.IOException;
- method public void addText(java.lang.String, java.lang.String);
- method public android.os.DropBoxManager.Entry getNextEntry(java.lang.String, long);
- method public boolean isTagEnabled(java.lang.String);
- field public static final java.lang.String ACTION_DROPBOX_ENTRY_ADDED = "android.intent.action.DROPBOX_ENTRY_ADDED";
- field public static final java.lang.String EXTRA_TAG = "tag";
- field public static final java.lang.String EXTRA_TIME = "time";
+ method public void addData(String, byte[], int);
+ method public void addFile(String, java.io.File, int) throws java.io.IOException;
+ method public void addText(String, String);
+ method @RequiresPermission(allOf={android.Manifest.permission.READ_LOGS, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.DropBoxManager.Entry getNextEntry(String, long);
+ method public boolean isTagEnabled(String);
+ field public static final String ACTION_DROPBOX_ENTRY_ADDED = "android.intent.action.DROPBOX_ENTRY_ADDED";
+ field public static final String EXTRA_TAG = "tag";
+ field public static final String EXTRA_TIME = "time";
field public static final int IS_EMPTY = 1; // 0x1
field public static final int IS_GZIPPED = 4; // 0x4
field public static final int IS_TEXT = 2; // 0x2
}
public static class DropBoxManager.Entry implements java.io.Closeable android.os.Parcelable {
- ctor public DropBoxManager.Entry(java.lang.String, long);
- ctor public DropBoxManager.Entry(java.lang.String, long, java.lang.String);
- ctor public DropBoxManager.Entry(java.lang.String, long, byte[], int);
- ctor public DropBoxManager.Entry(java.lang.String, long, android.os.ParcelFileDescriptor, int);
- ctor public DropBoxManager.Entry(java.lang.String, long, java.io.File, int) throws java.io.IOException;
+ ctor public DropBoxManager.Entry(String, long);
+ ctor public DropBoxManager.Entry(String, long, String);
+ ctor public DropBoxManager.Entry(String, long, byte[], int);
+ ctor public DropBoxManager.Entry(String, long, android.os.ParcelFileDescriptor, int);
+ ctor public DropBoxManager.Entry(String, long, java.io.File, int) throws java.io.IOException;
method public void close();
method public int describeContents();
method public int getFlags();
method public java.io.InputStream getInputStream() throws java.io.IOException;
- method public java.lang.String getTag();
- method public java.lang.String getText(int);
+ method public String getTag();
+ method public String getText(int);
method public long getTimeMillis();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.DropBoxManager.Entry> CREATOR;
@@ -34052,45 +34313,45 @@ package android.os {
method public static java.io.File getDataDirectory();
method public static java.io.File getDownloadCacheDirectory();
method public static java.io.File getExternalStorageDirectory();
- method public static java.io.File getExternalStoragePublicDirectory(java.lang.String);
- method public static java.lang.String getExternalStorageState();
- method public static java.lang.String getExternalStorageState(java.io.File);
+ method public static java.io.File getExternalStoragePublicDirectory(String);
+ method public static String getExternalStorageState();
+ method public static String getExternalStorageState(java.io.File);
method public static java.io.File getRootDirectory();
- method public static deprecated java.lang.String getStorageState(java.io.File);
+ method @Deprecated public static String getStorageState(java.io.File);
method public static boolean isExternalStorageEmulated();
method public static boolean isExternalStorageEmulated(java.io.File);
method public static boolean isExternalStorageRemovable();
method public static boolean isExternalStorageRemovable(java.io.File);
- field public static java.lang.String DIRECTORY_ALARMS;
- field public static java.lang.String DIRECTORY_AUDIOBOOKS;
- field public static java.lang.String DIRECTORY_DCIM;
- field public static java.lang.String DIRECTORY_DOCUMENTS;
- field public static java.lang.String DIRECTORY_DOWNLOADS;
- field public static java.lang.String DIRECTORY_MOVIES;
- field public static java.lang.String DIRECTORY_MUSIC;
- field public static java.lang.String DIRECTORY_NOTIFICATIONS;
- field public static java.lang.String DIRECTORY_PICTURES;
- field public static java.lang.String DIRECTORY_PODCASTS;
- field public static java.lang.String DIRECTORY_RINGTONES;
- field public static java.lang.String DIRECTORY_SCREENSHOTS;
- field public static final java.lang.String MEDIA_BAD_REMOVAL = "bad_removal";
- field public static final java.lang.String MEDIA_CHECKING = "checking";
- field public static final java.lang.String MEDIA_EJECTING = "ejecting";
- field public static final java.lang.String MEDIA_MOUNTED = "mounted";
- field public static final java.lang.String MEDIA_MOUNTED_READ_ONLY = "mounted_ro";
- field public static final java.lang.String MEDIA_NOFS = "nofs";
- field public static final java.lang.String MEDIA_REMOVED = "removed";
- field public static final java.lang.String MEDIA_SHARED = "shared";
- field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
- field public static final java.lang.String MEDIA_UNMOUNTABLE = "unmountable";
- field public static final java.lang.String MEDIA_UNMOUNTED = "unmounted";
+ field public static String DIRECTORY_ALARMS;
+ field public static String DIRECTORY_AUDIOBOOKS;
+ field public static String DIRECTORY_DCIM;
+ field public static String DIRECTORY_DOCUMENTS;
+ field public static String DIRECTORY_DOWNLOADS;
+ field public static String DIRECTORY_MOVIES;
+ field public static String DIRECTORY_MUSIC;
+ field public static String DIRECTORY_NOTIFICATIONS;
+ field public static String DIRECTORY_PICTURES;
+ field public static String DIRECTORY_PODCASTS;
+ field public static String DIRECTORY_RINGTONES;
+ field public static String DIRECTORY_SCREENSHOTS;
+ field public static final String MEDIA_BAD_REMOVAL = "bad_removal";
+ field public static final String MEDIA_CHECKING = "checking";
+ field public static final String MEDIA_EJECTING = "ejecting";
+ field public static final String MEDIA_MOUNTED = "mounted";
+ field public static final String MEDIA_MOUNTED_READ_ONLY = "mounted_ro";
+ field public static final String MEDIA_NOFS = "nofs";
+ field public static final String MEDIA_REMOVED = "removed";
+ field public static final String MEDIA_SHARED = "shared";
+ field public static final String MEDIA_UNKNOWN = "unknown";
+ field public static final String MEDIA_UNMOUNTABLE = "unmountable";
+ field public static final String MEDIA_UNMOUNTED = "unmounted";
}
public abstract class FileObserver {
- ctor public FileObserver(java.lang.String);
- ctor public FileObserver(java.lang.String, int);
+ ctor public FileObserver(String);
+ ctor public FileObserver(String, int);
method protected void finalize();
- method public abstract void onEvent(int, java.lang.String);
+ method public abstract void onEvent(int, @Nullable String);
method public void startWatching();
method public void stopWatching();
field public static final int ACCESS = 1; // 0x1
@@ -34109,22 +34370,22 @@ package android.os {
}
public class FileUriExposedException extends java.lang.RuntimeException {
- ctor public FileUriExposedException(java.lang.String);
+ ctor public FileUriExposedException(String);
}
public class FileUtils {
- method public static void closeQuietly(java.lang.AutoCloseable);
- method public static void closeQuietly(java.io.FileDescriptor);
- method public static long copy(java.io.File, java.io.File) throws java.io.IOException;
- method public static long copy(java.io.File, java.io.File, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
- method public static long copy(java.io.InputStream, java.io.OutputStream) throws java.io.IOException;
- method public static long copy(java.io.InputStream, java.io.OutputStream, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
- method public static long copy(java.io.FileDescriptor, java.io.FileDescriptor) throws java.io.IOException;
- method public static long copy(java.io.FileDescriptor, java.io.FileDescriptor, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ method public static void closeQuietly(@Nullable AutoCloseable);
+ method public static void closeQuietly(@Nullable java.io.FileDescriptor);
+ method public static long copy(@NonNull java.io.File, @NonNull java.io.File) throws java.io.IOException;
+ method public static long copy(@NonNull java.io.File, @NonNull java.io.File, @Nullable android.os.CancellationSignal, @Nullable java.util.concurrent.Executor, @Nullable android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ method public static long copy(@NonNull java.io.InputStream, @NonNull java.io.OutputStream) throws java.io.IOException;
+ method public static long copy(@NonNull java.io.InputStream, @NonNull java.io.OutputStream, @Nullable android.os.CancellationSignal, @Nullable java.util.concurrent.Executor, @Nullable android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ method public static long copy(@NonNull java.io.FileDescriptor, @NonNull java.io.FileDescriptor) throws java.io.IOException;
+ method public static long copy(@NonNull java.io.FileDescriptor, @NonNull java.io.FileDescriptor, @Nullable android.os.CancellationSignal, @Nullable java.util.concurrent.Executor, @Nullable android.os.FileUtils.ProgressListener) throws java.io.IOException;
}
- public static abstract interface FileUtils.ProgressListener {
- method public abstract void onProgress(long);
+ public static interface FileUtils.ProgressListener {
+ method public void onProgress(long);
}
public class Handler {
@@ -34132,32 +34393,32 @@ package android.os {
ctor public Handler(android.os.Handler.Callback);
ctor public Handler(android.os.Looper);
ctor public Handler(android.os.Looper, android.os.Handler.Callback);
- method public static android.os.Handler createAsync(android.os.Looper);
- method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+ method @NonNull public static android.os.Handler createAsync(@NonNull android.os.Looper);
+ method @NonNull public static android.os.Handler createAsync(@NonNull android.os.Looper, @NonNull android.os.Handler.Callback);
method public void dispatchMessage(android.os.Message);
- method public final void dump(android.util.Printer, java.lang.String);
+ method public final void dump(android.util.Printer, String);
method public final android.os.Looper getLooper();
- method public java.lang.String getMessageName(android.os.Message);
+ method public String getMessageName(android.os.Message);
method public void handleMessage(android.os.Message);
- method public final boolean hasCallbacks(java.lang.Runnable);
+ method public final boolean hasCallbacks(Runnable);
method public final boolean hasMessages(int);
- method public final boolean hasMessages(int, java.lang.Object);
+ method public final boolean hasMessages(int, Object);
method public final android.os.Message obtainMessage();
method public final android.os.Message obtainMessage(int);
- method public final android.os.Message obtainMessage(int, java.lang.Object);
+ method public final android.os.Message obtainMessage(int, Object);
method public final android.os.Message obtainMessage(int, int, int);
- method public final android.os.Message obtainMessage(int, int, int, java.lang.Object);
- method public final boolean post(java.lang.Runnable);
- method public final boolean postAtFrontOfQueue(java.lang.Runnable);
- method public final boolean postAtTime(java.lang.Runnable, long);
- method public final boolean postAtTime(java.lang.Runnable, java.lang.Object, long);
- method public final boolean postDelayed(java.lang.Runnable, long);
- method public final boolean postDelayed(java.lang.Runnable, java.lang.Object, long);
- method public final void removeCallbacks(java.lang.Runnable);
- method public final void removeCallbacks(java.lang.Runnable, java.lang.Object);
- method public final void removeCallbacksAndMessages(java.lang.Object);
+ method public final android.os.Message obtainMessage(int, int, int, Object);
+ method public final boolean post(Runnable);
+ method public final boolean postAtFrontOfQueue(Runnable);
+ method public final boolean postAtTime(Runnable, long);
+ method public final boolean postAtTime(Runnable, Object, long);
+ method public final boolean postDelayed(Runnable, long);
+ method public final boolean postDelayed(Runnable, Object, long);
+ method public final void removeCallbacks(Runnable);
+ method public final void removeCallbacks(Runnable, Object);
+ method public final void removeCallbacksAndMessages(Object);
method public final void removeMessages(int);
- method public final void removeMessages(int, java.lang.Object);
+ method public final void removeMessages(int, Object);
method public final boolean sendEmptyMessage(int);
method public final boolean sendEmptyMessageAtTime(int, long);
method public final boolean sendEmptyMessageDelayed(int, long);
@@ -34167,13 +34428,13 @@ package android.os {
method public final boolean sendMessageDelayed(android.os.Message, long);
}
- public static abstract interface Handler.Callback {
- method public abstract boolean handleMessage(android.os.Message);
+ public static interface Handler.Callback {
+ method public boolean handleMessage(android.os.Message);
}
public class HandlerThread extends java.lang.Thread {
- ctor public HandlerThread(java.lang.String);
- ctor public HandlerThread(java.lang.String, int);
+ ctor public HandlerThread(String);
+ ctor public HandlerThread(String, int);
method public android.os.Looper getLooper();
method public int getThreadId();
method protected void onLooperPrepared();
@@ -34182,9 +34443,9 @@ package android.os {
}
public class HardwarePropertiesManager {
- method public android.os.CpuUsageInfo[] getCpuUsages();
- method public float[] getDeviceTemperatures(int, int);
- method public float[] getFanSpeeds();
+ method @NonNull public android.os.CpuUsageInfo[] getCpuUsages();
+ method @NonNull public float[] getDeviceTemperatures(int, int);
+ method @NonNull public float[] getFanSpeeds();
field public static final int DEVICE_TEMPERATURE_BATTERY = 2; // 0x2
field public static final int DEVICE_TEMPERATURE_CPU = 0; // 0x0
field public static final int DEVICE_TEMPERATURE_GPU = 1; // 0x1
@@ -34196,16 +34457,16 @@ package android.os {
field public static final float UNDEFINED_TEMPERATURE = -3.4028235E38f;
}
- public abstract interface IBinder {
- method public abstract void dump(java.io.FileDescriptor, java.lang.String[]) throws android.os.RemoteException;
- method public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]) throws android.os.RemoteException;
- method public abstract java.lang.String getInterfaceDescriptor() throws android.os.RemoteException;
- method public abstract boolean isBinderAlive();
- method public abstract void linkToDeath(android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException;
- method public abstract boolean pingBinder();
- method public abstract android.os.IInterface queryLocalInterface(java.lang.String);
- method public abstract boolean transact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
- method public abstract boolean unlinkToDeath(android.os.IBinder.DeathRecipient, int);
+ public interface IBinder {
+ method public void dump(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException;
+ method public void dumpAsync(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException;
+ method @Nullable public String getInterfaceDescriptor() throws android.os.RemoteException;
+ method public boolean isBinderAlive();
+ method public void linkToDeath(@NonNull android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException;
+ method public boolean pingBinder();
+ method @Nullable public android.os.IInterface queryLocalInterface(@NonNull String);
+ method public boolean transact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException;
+ method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int);
field public static final int DUMP_TRANSACTION = 1598311760; // 0x5f444d50
field public static final int FIRST_CALL_TRANSACTION = 1; // 0x1
field public static final int FLAG_ONEWAY = 1; // 0x1
@@ -34216,55 +34477,55 @@ package android.os {
field public static final int TWEET_TRANSACTION = 1599362900; // 0x5f545754
}
- public static abstract interface IBinder.DeathRecipient {
- method public abstract void binderDied();
+ public static interface IBinder.DeathRecipient {
+ method public void binderDied();
}
- public abstract interface IInterface {
- method public abstract android.os.IBinder asBinder();
+ public interface IInterface {
+ method public android.os.IBinder asBinder();
}
public final class LocaleList implements android.os.Parcelable {
- ctor public LocaleList(java.util.Locale...);
+ ctor public LocaleList(@NonNull java.util.Locale...);
method public int describeContents();
- method public static android.os.LocaleList forLanguageTags(java.lang.String);
+ method @NonNull public static android.os.LocaleList forLanguageTags(@Nullable String);
method public java.util.Locale get(int);
- method public static android.os.LocaleList getAdjustedDefault();
- method public static android.os.LocaleList getDefault();
- method public static android.os.LocaleList getEmptyLocaleList();
- method public java.util.Locale getFirstMatch(java.lang.String[]);
- method public int indexOf(java.util.Locale);
+ method @NonNull @Size(min=1) public static android.os.LocaleList getAdjustedDefault();
+ method @NonNull @Size(min=1) public static android.os.LocaleList getDefault();
+ method @NonNull public static android.os.LocaleList getEmptyLocaleList();
+ method @Nullable public java.util.Locale getFirstMatch(String[]);
+ method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale);
method public boolean isEmpty();
- method public static void setDefault(android.os.LocaleList);
- method public int size();
- method public java.lang.String toLanguageTags();
+ method public static void setDefault(@NonNull @Size(min=1) android.os.LocaleList);
+ method @IntRange(from=0) public int size();
+ method @NonNull public String toLanguageTags();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.LocaleList> CREATOR;
}
public final class Looper {
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(@NonNull android.util.Printer, @NonNull String);
method public static android.os.Looper getMainLooper();
- method public android.os.MessageQueue getQueue();
- method public java.lang.Thread getThread();
+ method @NonNull public android.os.MessageQueue getQueue();
+ method @NonNull public Thread getThread();
method public boolean isCurrentThread();
method public static void loop();
- method public static android.os.Looper myLooper();
- method public static android.os.MessageQueue myQueue();
+ method @Nullable public static android.os.Looper myLooper();
+ method @NonNull public static android.os.MessageQueue myQueue();
method public static void prepare();
method public static void prepareMainLooper();
method public void quit();
method public void quitSafely();
- method public void setMessageLogging(android.util.Printer);
+ method public void setMessageLogging(@Nullable android.util.Printer);
}
public class MemoryFile {
- ctor public MemoryFile(java.lang.String, int) throws java.io.IOException;
- method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException;
+ ctor public MemoryFile(String, int) throws java.io.IOException;
+ method @Deprecated public boolean allowPurging(boolean) throws java.io.IOException;
method public void close();
method public java.io.InputStream getInputStream();
method public java.io.OutputStream getOutputStream();
- method public deprecated boolean isPurgingAllowed();
+ method @Deprecated public boolean isPurgingAllowed();
method public int length();
method public int readBytes(byte[], int, int, int) throws java.io.IOException;
method public void writeBytes(byte[], int, int, int) throws java.io.IOException;
@@ -34274,7 +34535,7 @@ package android.os {
ctor public Message();
method public void copyFrom(android.os.Message);
method public int describeContents();
- method public java.lang.Runnable getCallback();
+ method public Runnable getCallback();
method public android.os.Bundle getData();
method public android.os.Handler getTarget();
method public long getWhen();
@@ -34282,11 +34543,11 @@ package android.os {
method public static android.os.Message obtain();
method public static android.os.Message obtain(android.os.Message);
method public static android.os.Message obtain(android.os.Handler);
- method public static android.os.Message obtain(android.os.Handler, java.lang.Runnable);
+ method public static android.os.Message obtain(android.os.Handler, Runnable);
method public static android.os.Message obtain(android.os.Handler, int);
- method public static android.os.Message obtain(android.os.Handler, int, java.lang.Object);
+ method public static android.os.Message obtain(android.os.Handler, int, Object);
method public static android.os.Message obtain(android.os.Handler, int, int, int);
- method public static android.os.Message obtain(android.os.Handler, int, int, int, java.lang.Object);
+ method public static android.os.Message obtain(android.os.Handler, int, int, int, Object);
method public android.os.Bundle peekData();
method public void recycle();
method public void sendToTarget();
@@ -34297,26 +34558,26 @@ package android.os {
field public static final android.os.Parcelable.Creator<android.os.Message> CREATOR;
field public int arg1;
field public int arg2;
- field public java.lang.Object obj;
+ field public Object obj;
field public android.os.Messenger replyTo;
field public int sendingUid;
field public int what;
}
public final class MessageQueue {
- method public void addIdleHandler(android.os.MessageQueue.IdleHandler);
- method public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue.OnFileDescriptorEventListener);
+ method public void addIdleHandler(@NonNull android.os.MessageQueue.IdleHandler);
+ method public void addOnFileDescriptorEventListener(@NonNull java.io.FileDescriptor, int, @NonNull android.os.MessageQueue.OnFileDescriptorEventListener);
method public boolean isIdle();
- method public void removeIdleHandler(android.os.MessageQueue.IdleHandler);
- method public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);
+ method public void removeIdleHandler(@NonNull android.os.MessageQueue.IdleHandler);
+ method public void removeOnFileDescriptorEventListener(@NonNull java.io.FileDescriptor);
}
- public static abstract interface MessageQueue.IdleHandler {
- method public abstract boolean queueIdle();
+ public static interface MessageQueue.IdleHandler {
+ method public boolean queueIdle();
}
- public static abstract interface MessageQueue.OnFileDescriptorEventListener {
- method public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int);
+ public static interface MessageQueue.OnFileDescriptorEventListener {
+ method public int onFileDescriptorEvents(@NonNull java.io.FileDescriptor, int);
field public static final int EVENT_ERROR = 4; // 0x4
field public static final int EVENT_INPUT = 1; // 0x1
field public static final int EVENT_OUTPUT = 2; // 0x2
@@ -34340,122 +34601,126 @@ package android.os {
public class OperationCanceledException extends java.lang.RuntimeException {
ctor public OperationCanceledException();
- ctor public OperationCanceledException(java.lang.String);
+ ctor public OperationCanceledException(String);
}
public final class Parcel {
method public void appendFrom(android.os.Parcel, int, int);
- method public android.os.IBinder[] createBinderArray();
- method public java.util.ArrayList<android.os.IBinder> createBinderArrayList();
- method public boolean[] createBooleanArray();
- method public byte[] createByteArray();
- method public char[] createCharArray();
- method public double[] createDoubleArray();
- method public float[] createFloatArray();
- method public int[] createIntArray();
- method public long[] createLongArray();
- method public java.lang.String[] createStringArray();
- method public java.util.ArrayList<java.lang.String> createStringArrayList();
- method public <T> T[] createTypedArray(android.os.Parcelable.Creator<T>);
- method public <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
+ method @Nullable public android.os.IBinder[] createBinderArray();
+ method @Nullable public java.util.ArrayList<android.os.IBinder> createBinderArrayList();
+ method @Nullable public boolean[] createBooleanArray();
+ method @Nullable public byte[] createByteArray();
+ method @Nullable public char[] createCharArray();
+ method @Nullable public double[] createDoubleArray();
+ method @Nullable public float[] createFloatArray();
+ method @Nullable public int[] createIntArray();
+ method @Nullable public long[] createLongArray();
+ method @Nullable public String[] createStringArray();
+ method @Nullable public java.util.ArrayList<java.lang.String> createStringArrayList();
+ method @Nullable public <T> T[] createTypedArray(@NonNull android.os.Parcelable.Creator<T>);
+ method @Nullable public <T> java.util.ArrayList<T> createTypedArrayList(@NonNull android.os.Parcelable.Creator<T>);
+ method @Nullable public <T extends android.os.Parcelable> android.util.ArrayMap<java.lang.String,T> createTypedArrayMap(@NonNull android.os.Parcelable.Creator<T>);
+ method @Nullable public <T extends android.os.Parcelable> android.util.SparseArray<T> createTypedSparseArray(@NonNull android.os.Parcelable.Creator<T>);
method public int dataAvail();
method public int dataCapacity();
method public int dataPosition();
method public int dataSize();
- method public void enforceInterface(java.lang.String);
+ method public void enforceInterface(String);
method public boolean hasFileDescriptors();
method public byte[] marshall();
- method public static android.os.Parcel obtain();
- method public java.lang.Object[] readArray(java.lang.ClassLoader);
- method public java.util.ArrayList readArrayList(java.lang.ClassLoader);
- method public void readBinderArray(android.os.IBinder[]);
- method public void readBinderList(java.util.List<android.os.IBinder>);
+ method @NonNull public static android.os.Parcel obtain();
+ method @Nullable public Object[] readArray(@Nullable ClassLoader);
+ method @Nullable public java.util.ArrayList readArrayList(@Nullable ClassLoader);
+ method public void readBinderArray(@NonNull android.os.IBinder[]);
+ method public void readBinderList(@NonNull java.util.List<android.os.IBinder>);
method public boolean readBoolean();
- method public void readBooleanArray(boolean[]);
- method public android.os.Bundle readBundle();
- method public android.os.Bundle readBundle(java.lang.ClassLoader);
+ method public void readBooleanArray(@NonNull boolean[]);
+ method @Nullable public android.os.Bundle readBundle();
+ method @Nullable public android.os.Bundle readBundle(@Nullable ClassLoader);
method public byte readByte();
- method public void readByteArray(byte[]);
- method public void readCharArray(char[]);
+ method public void readByteArray(@NonNull byte[]);
+ method public void readCharArray(@NonNull char[]);
method public double readDouble();
- method public void readDoubleArray(double[]);
+ method public void readDoubleArray(@NonNull double[]);
method public void readException();
- method public void readException(int, java.lang.String);
+ method public void readException(int, String);
method public android.os.ParcelFileDescriptor readFileDescriptor();
method public float readFloat();
- method public void readFloatArray(float[]);
- method public java.util.HashMap readHashMap(java.lang.ClassLoader);
+ method public void readFloatArray(@NonNull float[]);
+ method @Nullable public java.util.HashMap readHashMap(@Nullable ClassLoader);
method public int readInt();
- method public void readIntArray(int[]);
- method public void readList(java.util.List, java.lang.ClassLoader);
+ method public void readIntArray(@NonNull int[]);
+ method public void readList(@NonNull java.util.List, @Nullable ClassLoader);
method public long readLong();
- method public void readLongArray(long[]);
- method public void readMap(java.util.Map, java.lang.ClassLoader);
- method public <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader);
- method public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
- method public <T extends android.os.Parcelable> java.util.List<T> readParcelableList(java.util.List<T>, java.lang.ClassLoader);
- method public android.os.PersistableBundle readPersistableBundle();
- method public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
- method public java.io.Serializable readSerializable();
- method public android.util.Size readSize();
- method public android.util.SizeF readSizeF();
- method public android.util.SparseArray readSparseArray(java.lang.ClassLoader);
- method public android.util.SparseBooleanArray readSparseBooleanArray();
- method public java.lang.String readString();
- method public void readStringArray(java.lang.String[]);
- method public void readStringList(java.util.List<java.lang.String>);
+ method public void readLongArray(@NonNull long[]);
+ method public void readMap(@NonNull java.util.Map, @Nullable ClassLoader);
+ method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader);
+ method @Nullable public android.os.Parcelable[] readParcelableArray(@Nullable ClassLoader);
+ method @NonNull public <T extends android.os.Parcelable> java.util.List<T> readParcelableList(@NonNull java.util.List<T>, @Nullable ClassLoader);
+ method @Nullable public android.os.PersistableBundle readPersistableBundle();
+ method @Nullable public android.os.PersistableBundle readPersistableBundle(@Nullable ClassLoader);
+ method @Nullable public java.io.Serializable readSerializable();
+ method @NonNull public android.util.Size readSize();
+ method @NonNull public android.util.SizeF readSizeF();
+ method @Nullable public <T> android.util.SparseArray<T> readSparseArray(@Nullable ClassLoader);
+ method @Nullable public android.util.SparseBooleanArray readSparseBooleanArray();
+ method @Nullable public String readString();
+ method public void readStringArray(@NonNull String[]);
+ method public void readStringList(@NonNull java.util.List<java.lang.String>);
method public android.os.IBinder readStrongBinder();
- method public <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
- method public <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
- method public <T> T readTypedObject(android.os.Parcelable.Creator<T>);
- method public java.lang.Object readValue(java.lang.ClassLoader);
+ method public <T> void readTypedArray(@NonNull T[], @NonNull android.os.Parcelable.Creator<T>);
+ method public <T> void readTypedList(@NonNull java.util.List<T>, @NonNull android.os.Parcelable.Creator<T>);
+ method @Nullable public <T> T readTypedObject(@NonNull android.os.Parcelable.Creator<T>);
+ method @Nullable public Object readValue(@Nullable ClassLoader);
method public void recycle();
method public void setDataCapacity(int);
method public void setDataPosition(int);
method public void setDataSize(int);
- method public void unmarshall(byte[], int, int);
- method public void writeArray(java.lang.Object[]);
- method public void writeBinderArray(android.os.IBinder[]);
- method public void writeBinderList(java.util.List<android.os.IBinder>);
+ method public void unmarshall(@NonNull byte[], int, int);
+ method public void writeArray(@Nullable Object[]);
+ method public void writeBinderArray(@Nullable android.os.IBinder[]);
+ method public void writeBinderList(@Nullable java.util.List<android.os.IBinder>);
method public void writeBoolean(boolean);
- method public void writeBooleanArray(boolean[]);
- method public void writeBundle(android.os.Bundle);
+ method public void writeBooleanArray(@Nullable boolean[]);
+ method public void writeBundle(@Nullable android.os.Bundle);
method public void writeByte(byte);
- method public void writeByteArray(byte[]);
- method public void writeByteArray(byte[], int, int);
- method public void writeCharArray(char[]);
+ method public void writeByteArray(@Nullable byte[]);
+ method public void writeByteArray(@Nullable byte[], int, int);
+ method public void writeCharArray(@Nullable char[]);
method public void writeDouble(double);
- method public void writeDoubleArray(double[]);
- method public void writeException(java.lang.Exception);
- method public void writeFileDescriptor(java.io.FileDescriptor);
+ method public void writeDoubleArray(@Nullable double[]);
+ method public void writeException(@NonNull Exception);
+ method public void writeFileDescriptor(@NonNull java.io.FileDescriptor);
method public void writeFloat(float);
- method public void writeFloatArray(float[]);
+ method public void writeFloatArray(@Nullable float[]);
method public void writeInt(int);
- method public void writeIntArray(int[]);
- method public void writeInterfaceToken(java.lang.String);
- method public void writeList(java.util.List);
+ method public void writeIntArray(@Nullable int[]);
+ method public void writeInterfaceToken(String);
+ method public void writeList(@Nullable java.util.List);
method public void writeLong(long);
- method public void writeLongArray(long[]);
- method public void writeMap(java.util.Map);
+ method public void writeLongArray(@Nullable long[]);
+ method public void writeMap(@Nullable java.util.Map);
method public void writeNoException();
- method public void writeParcelable(android.os.Parcelable, int);
- method public <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
- method public <T extends android.os.Parcelable> void writeParcelableList(java.util.List<T>, int);
- method public void writePersistableBundle(android.os.PersistableBundle);
- method public void writeSerializable(java.io.Serializable);
- method public void writeSize(android.util.Size);
- method public void writeSizeF(android.util.SizeF);
- method public void writeSparseArray(android.util.SparseArray<java.lang.Object>);
- method public void writeSparseBooleanArray(android.util.SparseBooleanArray);
- method public void writeString(java.lang.String);
- method public void writeStringArray(java.lang.String[]);
- method public void writeStringList(java.util.List<java.lang.String>);
+ method public void writeParcelable(@Nullable android.os.Parcelable, int);
+ method public <T extends android.os.Parcelable> void writeParcelableArray(@Nullable T[], int);
+ method public <T extends android.os.Parcelable> void writeParcelableList(@Nullable java.util.List<T>, int);
+ method public void writePersistableBundle(@Nullable android.os.PersistableBundle);
+ method public void writeSerializable(@Nullable java.io.Serializable);
+ method public void writeSize(@NonNull android.util.Size);
+ method public void writeSizeF(@NonNull android.util.SizeF);
+ method public <T> void writeSparseArray(@Nullable android.util.SparseArray<T>);
+ method public void writeSparseBooleanArray(@Nullable android.util.SparseBooleanArray);
+ method public void writeString(@Nullable String);
+ method public void writeStringArray(@Nullable String[]);
+ method public void writeStringList(@Nullable java.util.List<java.lang.String>);
method public void writeStrongBinder(android.os.IBinder);
method public void writeStrongInterface(android.os.IInterface);
- method public <T extends android.os.Parcelable> void writeTypedArray(T[], int);
- method public <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
- method public <T extends android.os.Parcelable> void writeTypedObject(T, int);
- method public void writeValue(java.lang.Object);
+ method public <T extends android.os.Parcelable> void writeTypedArray(@Nullable T[], int);
+ method public <T extends android.os.Parcelable> void writeTypedArrayMap(@Nullable android.util.ArrayMap<java.lang.String,T>, int);
+ method public <T extends android.os.Parcelable> void writeTypedList(@Nullable java.util.List<T>);
+ method public <T extends android.os.Parcelable> void writeTypedObject(@Nullable T, int);
+ method public <T extends android.os.Parcelable> void writeTypedSparseArray(@Nullable android.util.SparseArray<T>, int);
+ method public void writeValue(@Nullable Object);
field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
}
@@ -34465,7 +34730,7 @@ package android.os {
method public boolean canDetectErrors();
method public void checkError() throws java.io.IOException;
method public void close() throws java.io.IOException;
- method public void closeWithError(java.lang.String) throws java.io.IOException;
+ method public void closeWithError(String) throws java.io.IOException;
method public static android.os.ParcelFileDescriptor[] createPipe() throws java.io.IOException;
method public static android.os.ParcelFileDescriptor[] createReliablePipe() throws java.io.IOException;
method public static android.os.ParcelFileDescriptor[] createReliableSocketPair() throws java.io.IOException;
@@ -34482,7 +34747,7 @@ package android.os {
method public long getStatSize();
method public static android.os.ParcelFileDescriptor open(java.io.File, int) throws java.io.FileNotFoundException;
method public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor.OnCloseListener) throws java.io.IOException;
- method public static int parseMode(java.lang.String);
+ method public static int parseMode(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.ParcelFileDescriptor> CREATOR;
field public static final int MODE_APPEND = 33554432; // 0x2000000
@@ -34490,8 +34755,8 @@ package android.os {
field public static final int MODE_READ_ONLY = 268435456; // 0x10000000
field public static final int MODE_READ_WRITE = 805306368; // 0x30000000
field public static final int MODE_TRUNCATE = 67108864; // 0x4000000
- field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1
- field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2
+ field @Deprecated public static final int MODE_WORLD_READABLE = 1; // 0x1
+ field @Deprecated public static final int MODE_WORLD_WRITEABLE = 2; // 0x2
field public static final int MODE_WRITE_ONLY = 536870912; // 0x20000000
}
@@ -34507,47 +34772,47 @@ package android.os {
ctor public ParcelFileDescriptor.FileDescriptorDetachedException();
}
- public static abstract interface ParcelFileDescriptor.OnCloseListener {
- method public abstract void onClose(java.io.IOException);
+ public static interface ParcelFileDescriptor.OnCloseListener {
+ method public void onClose(java.io.IOException);
}
public class ParcelFormatException extends java.lang.RuntimeException {
ctor public ParcelFormatException();
- ctor public ParcelFormatException(java.lang.String);
+ ctor public ParcelFormatException(String);
}
public final class ParcelUuid implements android.os.Parcelable {
ctor public ParcelUuid(java.util.UUID);
method public int describeContents();
- method public static android.os.ParcelUuid fromString(java.lang.String);
+ method public static android.os.ParcelUuid fromString(String);
method public java.util.UUID getUuid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.ParcelUuid> CREATOR;
}
- public abstract interface Parcelable {
- method public abstract int describeContents();
- method public abstract void writeToParcel(android.os.Parcel, int);
+ public interface Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
field public static final int CONTENTS_FILE_DESCRIPTOR = 1; // 0x1
field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
}
- public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator {
- method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+ public static interface Parcelable.ClassLoaderCreator<T> extends android.os.Parcelable.Creator<T> {
+ method public T createFromParcel(android.os.Parcel, ClassLoader);
}
- public static abstract interface Parcelable.Creator<T> {
- method public abstract T createFromParcel(android.os.Parcel);
- method public abstract T[] newArray(int);
+ public static interface Parcelable.Creator<T> {
+ method public T createFromParcel(android.os.Parcel);
+ method public T[] newArray(int);
}
public class PatternMatcher implements android.os.Parcelable {
- ctor public PatternMatcher(java.lang.String, int);
+ ctor public PatternMatcher(String, int);
ctor public PatternMatcher(android.os.Parcel);
method public int describeContents();
- method public final java.lang.String getPath();
+ method public final String getPath();
method public final int getType();
- method public boolean match(java.lang.String);
+ method public boolean match(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.PatternMatcher> CREATOR;
field public static final int PATTERN_ADVANCED_GLOB = 3; // 0x3
@@ -34560,12 +34825,11 @@ package android.os {
ctor public PersistableBundle();
ctor public PersistableBundle(int);
ctor public PersistableBundle(android.os.PersistableBundle);
- method public java.lang.Object clone();
+ method public Object clone();
method public android.os.PersistableBundle deepCopy();
method public int describeContents();
- method public android.os.PersistableBundle getPersistableBundle(java.lang.String);
- method public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
- method public synchronized java.lang.String toString();
+ method @Nullable public android.os.PersistableBundle getPersistableBundle(@Nullable String);
+ method public void putPersistableBundle(@Nullable String, @Nullable android.os.PersistableBundle);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.PersistableBundle> CREATOR;
field public static final android.os.PersistableBundle EMPTY;
@@ -34575,20 +34839,20 @@ package android.os {
method public int getCurrentThermalStatus();
method public int getLocationPowerSaveMode();
method public boolean isDeviceIdleMode();
- method public boolean isIgnoringBatteryOptimizations(java.lang.String);
+ method public boolean isIgnoringBatteryOptimizations(String);
method public boolean isInteractive();
method public boolean isPowerSaveMode();
- method public deprecated boolean isScreenOn();
+ method @Deprecated public boolean isScreenOn();
method public boolean isSustainedPerformanceModeSupported();
method public boolean isWakeLockLevelSupported(int);
- method public android.os.PowerManager.WakeLock newWakeLock(int, java.lang.String);
- method public void reboot(java.lang.String);
- method public void registerThermalStatusCallback(android.os.PowerManager.ThermalStatusCallback, java.util.concurrent.Executor);
+ method public android.os.PowerManager.WakeLock newWakeLock(int, String);
+ method public void reboot(String);
+ method public void registerThermalStatusCallback(@NonNull android.os.PowerManager.ThermalStatusCallback, @NonNull java.util.concurrent.Executor);
method public void unregisterThermalStatusCallback(android.os.PowerManager.ThermalStatusCallback);
field public static final int ACQUIRE_CAUSES_WAKEUP = 268435456; // 0x10000000
- field public static final java.lang.String ACTION_DEVICE_IDLE_MODE_CHANGED = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
- field public static final java.lang.String ACTION_POWER_SAVE_MODE_CHANGED = "android.os.action.POWER_SAVE_MODE_CHANGED";
- field public static final deprecated int FULL_WAKE_LOCK = 26; // 0x1a
+ field public static final String ACTION_DEVICE_IDLE_MODE_CHANGED = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
+ field public static final String ACTION_POWER_SAVE_MODE_CHANGED = "android.os.action.POWER_SAVE_MODE_CHANGED";
+ field @Deprecated public static final int FULL_WAKE_LOCK = 26; // 0x1a
field public static final int LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF = 2; // 0x2
field public static final int LOCATION_MODE_FOREGROUND_ONLY = 3; // 0x3
field public static final int LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF = 1; // 0x1
@@ -34597,8 +34861,8 @@ package android.os {
field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1
field public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32; // 0x20
field public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1; // 0x1
- field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
- field public static final deprecated int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
+ field @Deprecated public static final int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
+ field @Deprecated public static final int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
field public static final int THERMAL_STATUS_CRITICAL = 4; // 0x4
field public static final int THERMAL_STATUS_EMERGENCY = 5; // 0x5
field public static final int THERMAL_STATUS_LIGHT = 1; // 0x1
@@ -34608,7 +34872,7 @@ package android.os {
field public static final int THERMAL_STATUS_SHUTDOWN = 6; // 0x6
}
- public static abstract class PowerManager.ThermalStatusCallback {
+ public abstract static class PowerManager.ThermalStatusCallback {
ctor public PowerManager.ThermalStatusCallback();
method public void onStatusChange(int);
}
@@ -34627,11 +34891,11 @@ package android.os {
ctor public Process();
method public static final long getElapsedCpuTime();
method public static final int[] getExclusiveCores();
- method public static final int getGidForName(java.lang.String);
+ method public static final int getGidForName(String);
method public static final long getStartElapsedRealtime();
method public static final long getStartUptimeMillis();
method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
- method public static final int getUidForName(java.lang.String);
+ method public static final int getUidForName(String);
method public static final boolean is64Bit();
method public static boolean isApplicationUid(int);
method public static final boolean isIsolated();
@@ -34643,7 +34907,7 @@ package android.os {
method public static final void sendSignal(int, int);
method public static final void setThreadPriority(int, int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
method public static final void setThreadPriority(int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
- method public static final deprecated boolean supportsProcesses();
+ method @Deprecated public static final boolean supportsProcesses();
field public static final int FIRST_APPLICATION_UID = 10000; // 0x2710
field public static final int INVALID_UID = -1; // 0xffffffff
field public static final int LAST_APPLICATION_UID = 19999; // 0x4e1f
@@ -34675,36 +34939,36 @@ package android.os {
}
public class RecoverySystem {
- method public static void installPackage(android.content.Context, java.io.File) throws java.io.IOException;
+ method @RequiresPermission("android.permission.RECOVERY") public static void installPackage(android.content.Context, java.io.File) throws java.io.IOException;
method public static void rebootWipeCache(android.content.Context) throws java.io.IOException;
method public static void rebootWipeUserData(android.content.Context) throws java.io.IOException;
method public static void verifyPackage(java.io.File, android.os.RecoverySystem.ProgressListener, java.io.File) throws java.security.GeneralSecurityException, java.io.IOException;
}
- public static abstract interface RecoverySystem.ProgressListener {
- method public abstract void onProgress(int);
+ public static interface RecoverySystem.ProgressListener {
+ method public void onProgress(int);
}
public class RemoteCallbackList<E extends android.os.IInterface> {
ctor public RemoteCallbackList();
method public int beginBroadcast();
method public void finishBroadcast();
- method public java.lang.Object getBroadcastCookie(int);
+ method public Object getBroadcastCookie(int);
method public E getBroadcastItem(int);
- method public java.lang.Object getRegisteredCallbackCookie(int);
+ method public Object getRegisteredCallbackCookie(int);
method public int getRegisteredCallbackCount();
method public E getRegisteredCallbackItem(int);
method public void kill();
method public void onCallbackDied(E);
- method public void onCallbackDied(E, java.lang.Object);
+ method public void onCallbackDied(E, Object);
method public boolean register(E);
- method public boolean register(E, java.lang.Object);
+ method public boolean register(E, Object);
method public boolean unregister(E);
}
public class RemoteException extends android.util.AndroidException {
ctor public RemoteException();
- ctor public RemoteException(java.lang.String);
+ ctor public RemoteException(String);
}
public class ResultReceiver implements android.os.Parcelable {
@@ -34718,32 +34982,32 @@ package android.os {
public final class SharedMemory implements java.io.Closeable android.os.Parcelable {
method public void close();
- method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException;
+ method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException;
method public int describeContents();
method public int getSize();
- method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
- method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
- method public java.nio.ByteBuffer mapReadWrite() throws android.system.ErrnoException;
+ method @NonNull public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
+ method @NonNull public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
+ method @NonNull public java.nio.ByteBuffer mapReadWrite() throws android.system.ErrnoException;
method public boolean setProtect(int);
- method public static void unmap(java.nio.ByteBuffer);
- method public void writeToParcel(android.os.Parcel, int);
+ method public static void unmap(@NonNull java.nio.ByteBuffer);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.SharedMemory> CREATOR;
}
public class StatFs {
- ctor public StatFs(java.lang.String);
- method public deprecated int getAvailableBlocks();
+ ctor public StatFs(String);
+ method @Deprecated public int getAvailableBlocks();
method public long getAvailableBlocksLong();
method public long getAvailableBytes();
- method public deprecated int getBlockCount();
+ method @Deprecated public int getBlockCount();
method public long getBlockCountLong();
- method public deprecated int getBlockSize();
+ method @Deprecated public int getBlockSize();
method public long getBlockSizeLong();
- method public deprecated int getFreeBlocks();
+ method @Deprecated public int getFreeBlocks();
method public long getFreeBlocksLong();
method public long getFreeBytes();
method public long getTotalBytes();
- method public void restat(java.lang.String);
+ method public void restat(String);
}
public final class StrictMode {
@@ -34752,17 +35016,17 @@ package android.os {
method public static void enableDefaults();
method public static android.os.StrictMode.ThreadPolicy getThreadPolicy();
method public static android.os.StrictMode.VmPolicy getVmPolicy();
- method public static void noteSlowCall(java.lang.String);
+ method public static void noteSlowCall(String);
method public static void setThreadPolicy(android.os.StrictMode.ThreadPolicy);
method public static void setVmPolicy(android.os.StrictMode.VmPolicy);
}
- public static abstract interface StrictMode.OnThreadViolationListener {
- method public abstract void onThreadViolation(android.os.strictmode.Violation);
+ public static interface StrictMode.OnThreadViolationListener {
+ method public void onThreadViolation(android.os.strictmode.Violation);
}
- public static abstract interface StrictMode.OnVmViolationListener {
- method public abstract void onVmViolation(android.os.strictmode.Violation);
+ public static interface StrictMode.OnVmViolationListener {
+ method public void onVmViolation(android.os.strictmode.Violation);
}
public static final class StrictMode.ThreadPolicy {
@@ -34785,7 +35049,7 @@ package android.os {
method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog();
method public android.os.StrictMode.ThreadPolicy.Builder penaltyDropBox();
method public android.os.StrictMode.ThreadPolicy.Builder penaltyFlashScreen();
- method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnThreadViolationListener);
+ method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.StrictMode.OnThreadViolationListener);
method public android.os.StrictMode.ThreadPolicy.Builder penaltyLog();
method public android.os.StrictMode.ThreadPolicy.Builder permitAll();
method public android.os.StrictMode.ThreadPolicy.Builder permitCustomSlowCalls();
@@ -34820,10 +35084,10 @@ package android.os {
method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnCleartextNetwork();
method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnFileUriExposure();
method public android.os.StrictMode.VmPolicy.Builder penaltyDropBox();
- method public android.os.StrictMode.VmPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnVmViolationListener);
+ method public android.os.StrictMode.VmPolicy.Builder penaltyListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.StrictMode.OnVmViolationListener);
method public android.os.StrictMode.VmPolicy.Builder penaltyLog();
method public android.os.StrictMode.VmPolicy.Builder permitNonSdkApiUsage();
- method public android.os.StrictMode.VmPolicy.Builder setClassInstanceLimit(java.lang.Class, int);
+ method public android.os.StrictMode.VmPolicy.Builder setClassInstanceLimit(Class, int);
}
public final class SystemClock {
@@ -34838,16 +35102,16 @@ package android.os {
public class TestLooperManager {
method public void execute(android.os.Message);
method public android.os.MessageQueue getMessageQueue();
- method public boolean hasMessages(android.os.Handler, java.lang.Object, int);
- method public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
+ method public boolean hasMessages(android.os.Handler, Object, int);
+ method public boolean hasMessages(android.os.Handler, Object, Runnable);
method public android.os.Message next();
method public void recycle(android.os.Message);
method public void release();
}
public abstract class TokenWatcher {
- ctor public TokenWatcher(android.os.Handler, java.lang.String);
- method public void acquire(android.os.IBinder, java.lang.String);
+ ctor public TokenWatcher(android.os.Handler, String);
+ method public void acquire(android.os.IBinder, String);
method public abstract void acquired();
method public void cleanup(android.os.IBinder, boolean);
method public void dump();
@@ -34858,17 +35122,17 @@ package android.os {
}
public final class Trace {
- method public static void beginAsyncSection(java.lang.String, int);
- method public static void beginSection(java.lang.String);
- method public static void endAsyncSection(java.lang.String, int);
+ method public static void beginAsyncSection(@NonNull String, int);
+ method public static void beginSection(@NonNull String);
+ method public static void endAsyncSection(@NonNull String, int);
method public static void endSection();
method public static boolean isEnabled();
- method public static void setCounter(java.lang.String, long);
+ method public static void setCounter(@NonNull String, long);
}
public class TransactionTooLargeException extends android.os.RemoteException {
ctor public TransactionTooLargeException();
- ctor public TransactionTooLargeException(java.lang.String);
+ ctor public TransactionTooLargeException(String);
}
public final class UserHandle implements android.os.Parcelable {
@@ -34882,17 +35146,17 @@ package android.os {
}
public class UserManager {
- method public static android.content.Intent createUserCreationIntent(java.lang.String, java.lang.String, java.lang.String, android.os.PersistableBundle);
- method public android.os.Bundle getApplicationRestrictions(java.lang.String);
+ method public static android.content.Intent createUserCreationIntent(@Nullable String, @Nullable String, @Nullable String, @Nullable android.os.PersistableBundle);
+ method @WorkerThread public android.os.Bundle getApplicationRestrictions(String);
method public long getSerialNumberForUser(android.os.UserHandle);
method public int getUserCount();
method public long getUserCreationTime(android.os.UserHandle);
method public android.os.UserHandle getUserForSerialNumber(long);
- method public java.lang.String getUserName();
+ method public String getUserName();
method public java.util.List<android.os.UserHandle> getUserProfiles();
method public android.os.Bundle getUserRestrictions();
method public android.os.Bundle getUserRestrictions(android.os.UserHandle);
- method public boolean hasUserRestriction(java.lang.String);
+ method public boolean hasUserRestriction(String);
method public boolean isDemoUser();
method public boolean isQuietModeEnabled(android.os.UserHandle);
method public boolean isSystemUser();
@@ -34901,67 +35165,67 @@ package android.os {
method public boolean isUserRunningOrStopping(android.os.UserHandle);
method public boolean isUserUnlocked();
method public boolean isUserUnlocked(android.os.UserHandle);
- method public boolean requestQuietModeEnabled(boolean, android.os.UserHandle);
- method public deprecated boolean setRestrictionsChallenge(java.lang.String);
- method public deprecated void setUserRestriction(java.lang.String, boolean);
- method public deprecated void setUserRestrictions(android.os.Bundle);
- method public deprecated void setUserRestrictions(android.os.Bundle, android.os.UserHandle);
+ method public boolean requestQuietModeEnabled(boolean, @NonNull android.os.UserHandle);
+ method @Deprecated public boolean setRestrictionsChallenge(String);
+ method @Deprecated public void setUserRestriction(String, boolean);
+ method @Deprecated public void setUserRestrictions(android.os.Bundle);
+ method @Deprecated public void setUserRestrictions(android.os.Bundle, android.os.UserHandle);
method public static boolean supportsMultipleUsers();
- field public static final java.lang.String ALLOW_PARENT_PROFILE_APP_LINKING = "allow_parent_profile_app_linking";
- field public static final java.lang.String DISALLOW_ADD_MANAGED_PROFILE = "no_add_managed_profile";
- field public static final java.lang.String DISALLOW_ADD_USER = "no_add_user";
- field public static final java.lang.String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
- field public static final java.lang.String DISALLOW_AIRPLANE_MODE = "no_airplane_mode";
- field public static final java.lang.String DISALLOW_AMBIENT_DISPLAY = "no_ambient_display";
- field public static final java.lang.String DISALLOW_APPS_CONTROL = "no_control_apps";
- field public static final java.lang.String DISALLOW_AUTOFILL = "no_autofill";
- field public static final java.lang.String DISALLOW_BLUETOOTH = "no_bluetooth";
- field public static final java.lang.String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
- field public static final java.lang.String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
- field public static final java.lang.String DISALLOW_CONFIG_BRIGHTNESS = "no_config_brightness";
- field public static final java.lang.String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
- field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
- field public static final java.lang.String DISALLOW_CONFIG_DATE_TIME = "no_config_date_time";
- field public static final java.lang.String DISALLOW_CONFIG_LOCALE = "no_config_locale";
- field public static final java.lang.String DISALLOW_CONFIG_LOCATION = "no_config_location";
- field public static final java.lang.String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
- field public static final java.lang.String DISALLOW_CONFIG_PRIVATE_DNS = "disallow_config_private_dns";
- field public static final java.lang.String DISALLOW_CONFIG_SCREEN_TIMEOUT = "no_config_screen_timeout";
- field public static final java.lang.String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
- field public static final java.lang.String DISALLOW_CONFIG_VPN = "no_config_vpn";
- field public static final java.lang.String DISALLOW_CONFIG_WIFI = "no_config_wifi";
- field public static final java.lang.String DISALLOW_CONTENT_CAPTURE = "no_content_capture";
- field public static final java.lang.String DISALLOW_CREATE_WINDOWS = "no_create_windows";
- field public static final java.lang.String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
- field public static final java.lang.String DISALLOW_DATA_ROAMING = "no_data_roaming";
- field public static final java.lang.String DISALLOW_DEBUGGING_FEATURES = "no_debugging_features";
- field public static final java.lang.String DISALLOW_FACTORY_RESET = "no_factory_reset";
- field public static final java.lang.String DISALLOW_FUN = "no_fun";
- field public static final java.lang.String DISALLOW_INSTALL_APPS = "no_install_apps";
- field public static final java.lang.String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
- field public static final java.lang.String DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY = "no_install_unknown_sources_globally";
- field public static final java.lang.String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
- field public static final java.lang.String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
- field public static final java.lang.String DISALLOW_NETWORK_RESET = "no_network_reset";
- field public static final java.lang.String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
- field public static final java.lang.String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
- field public static final java.lang.String DISALLOW_PRINTING = "no_printing";
- field public static final java.lang.String DISALLOW_REMOVE_MANAGED_PROFILE = "no_remove_managed_profile";
- field public static final java.lang.String DISALLOW_REMOVE_USER = "no_remove_user";
- field public static final java.lang.String DISALLOW_SAFE_BOOT = "no_safe_boot";
- field public static final java.lang.String DISALLOW_SET_USER_ICON = "no_set_user_icon";
- field public static final java.lang.String DISALLOW_SET_WALLPAPER = "no_set_wallpaper";
- field public static final java.lang.String DISALLOW_SHARE_INTO_MANAGED_PROFILE = "no_sharing_into_profile";
- field public static final java.lang.String DISALLOW_SHARE_LOCATION = "no_share_location";
- field public static final java.lang.String DISALLOW_SMS = "no_sms";
- field public static final java.lang.String DISALLOW_SYSTEM_ERROR_DIALOGS = "no_system_error_dialogs";
- field public static final java.lang.String DISALLOW_UNIFIED_PASSWORD = "no_unified_password";
- field public static final java.lang.String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
- field public static final java.lang.String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
- field public static final java.lang.String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
- field public static final java.lang.String DISALLOW_USER_SWITCH = "no_user_switch";
- field public static final java.lang.String ENSURE_VERIFY_APPS = "ensure_verify_apps";
- field public static final java.lang.String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
+ field public static final String ALLOW_PARENT_PROFILE_APP_LINKING = "allow_parent_profile_app_linking";
+ field public static final String DISALLOW_ADD_MANAGED_PROFILE = "no_add_managed_profile";
+ field public static final String DISALLOW_ADD_USER = "no_add_user";
+ field public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
+ field public static final String DISALLOW_AIRPLANE_MODE = "no_airplane_mode";
+ field public static final String DISALLOW_AMBIENT_DISPLAY = "no_ambient_display";
+ field public static final String DISALLOW_APPS_CONTROL = "no_control_apps";
+ field public static final String DISALLOW_AUTOFILL = "no_autofill";
+ field public static final String DISALLOW_BLUETOOTH = "no_bluetooth";
+ field public static final String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
+ field public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
+ field public static final String DISALLOW_CONFIG_BRIGHTNESS = "no_config_brightness";
+ field public static final String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
+ field public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
+ field public static final String DISALLOW_CONFIG_DATE_TIME = "no_config_date_time";
+ field public static final String DISALLOW_CONFIG_LOCALE = "no_config_locale";
+ field public static final String DISALLOW_CONFIG_LOCATION = "no_config_location";
+ field public static final String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
+ field public static final String DISALLOW_CONFIG_PRIVATE_DNS = "disallow_config_private_dns";
+ field public static final String DISALLOW_CONFIG_SCREEN_TIMEOUT = "no_config_screen_timeout";
+ field public static final String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
+ field public static final String DISALLOW_CONFIG_VPN = "no_config_vpn";
+ field public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
+ field public static final String DISALLOW_CONTENT_CAPTURE = "no_content_capture";
+ field public static final String DISALLOW_CREATE_WINDOWS = "no_create_windows";
+ field public static final String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
+ field public static final String DISALLOW_DATA_ROAMING = "no_data_roaming";
+ field public static final String DISALLOW_DEBUGGING_FEATURES = "no_debugging_features";
+ field public static final String DISALLOW_FACTORY_RESET = "no_factory_reset";
+ field public static final String DISALLOW_FUN = "no_fun";
+ field public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
+ field public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
+ field public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY = "no_install_unknown_sources_globally";
+ field public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
+ field public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
+ field public static final String DISALLOW_NETWORK_RESET = "no_network_reset";
+ field public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
+ field public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
+ field public static final String DISALLOW_PRINTING = "no_printing";
+ field public static final String DISALLOW_REMOVE_MANAGED_PROFILE = "no_remove_managed_profile";
+ field public static final String DISALLOW_REMOVE_USER = "no_remove_user";
+ field public static final String DISALLOW_SAFE_BOOT = "no_safe_boot";
+ field public static final String DISALLOW_SET_USER_ICON = "no_set_user_icon";
+ field public static final String DISALLOW_SET_WALLPAPER = "no_set_wallpaper";
+ field public static final String DISALLOW_SHARE_INTO_MANAGED_PROFILE = "no_sharing_into_profile";
+ field public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
+ field public static final String DISALLOW_SMS = "no_sms";
+ field public static final String DISALLOW_SYSTEM_ERROR_DIALOGS = "no_system_error_dialogs";
+ field public static final String DISALLOW_UNIFIED_PASSWORD = "no_unified_password";
+ field public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
+ field public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
+ field public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
+ field public static final String DISALLOW_USER_SWITCH = "no_user_switch";
+ field public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
+ field public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1
field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2
field public static final int USER_OPERATION_ERROR_CURRENT_USER = 4; // 0x4
@@ -34987,15 +35251,15 @@ package android.os {
}
public abstract class Vibrator {
- method public abstract void cancel();
+ method @RequiresPermission(android.Manifest.permission.VIBRATE) public abstract void cancel();
method public abstract boolean hasAmplitudeControl();
method public abstract boolean hasVibrator();
- method public deprecated void vibrate(long);
- method public deprecated void vibrate(long, android.media.AudioAttributes);
- method public deprecated void vibrate(long[], int);
- method public deprecated void vibrate(long[], int, android.media.AudioAttributes);
- method public void vibrate(android.os.VibrationEffect);
- method public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(long);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(long, android.media.AudioAttributes);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(long[], int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(long[], int, android.media.AudioAttributes);
+ method @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(android.os.VibrationEffect);
+ method @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
}
public class WorkSource implements android.os.Parcelable {
@@ -35016,14 +35280,14 @@ package android.os {
package android.os.health {
public class HealthStats {
- method public java.lang.String getDataType();
+ method public String getDataType();
method public long getMeasurement(int);
method public int getMeasurementKeyAt(int);
method public int getMeasurementKeyCount();
- method public java.util.Map<java.lang.String, java.lang.Long> getMeasurements(int);
+ method public java.util.Map<java.lang.String,java.lang.Long> getMeasurements(int);
method public int getMeasurementsKeyAt(int);
method public int getMeasurementsKeyCount();
- method public java.util.Map<java.lang.String, android.os.health.HealthStats> getStats(int);
+ method public java.util.Map<java.lang.String,android.os.health.HealthStats> getStats(int);
method public int getStatsKeyAt(int);
method public int getStatsKeyCount();
method public android.os.health.TimerStat getTimer(int);
@@ -35031,7 +35295,7 @@ package android.os.health {
method public int getTimerKeyAt(int);
method public int getTimerKeyCount();
method public long getTimerTime(int);
- method public java.util.Map<java.lang.String, android.os.health.TimerStat> getTimers(int);
+ method public java.util.Map<java.lang.String,android.os.health.TimerStat> getTimers(int);
method public int getTimersKeyAt(int);
method public int getTimersKeyCount();
method public boolean hasMeasurement(int);
@@ -35095,7 +35359,7 @@ package android.os.health {
field public static final int MEASUREMENT_BLUETOOTH_TX_MS = 10022; // 0x2726
field public static final int MEASUREMENT_BLUETOOTH_TX_PACKETS = 10059; // 0x274b
field public static final int MEASUREMENT_BUTTON_USER_ACTIVITY_COUNT = 10046; // 0x273e
- field public static final deprecated int MEASUREMENT_CPU_POWER_MAMS = 10064; // 0x2750
+ field @Deprecated public static final int MEASUREMENT_CPU_POWER_MAMS = 10064; // 0x2750
field public static final int MEASUREMENT_MOBILE_IDLE_MS = 10024; // 0x2728
field public static final int MEASUREMENT_MOBILE_POWER_MAMS = 10027; // 0x272b
field public static final int MEASUREMENT_MOBILE_RX_BYTES = 10048; // 0x2740
@@ -35157,7 +35421,7 @@ package android.os.storage {
public abstract class OnObbStateChangeListener {
ctor public OnObbStateChangeListener();
- method public void onObbStateChange(java.lang.String, int);
+ method public void onObbStateChange(String, int);
field public static final int ERROR_ALREADY_MOUNTED = 24; // 0x18
field public static final int ERROR_COULD_NOT_MOUNT = 21; // 0x15
field public static final int ERROR_COULD_NOT_UNMOUNT = 22; // 0x16
@@ -35169,45 +35433,45 @@ package android.os.storage {
}
public class StorageManager {
- method public void allocateBytes(java.util.UUID, long) throws java.io.IOException;
- method public void allocateBytes(java.io.FileDescriptor, long) throws java.io.IOException;
- method public long getAllocatableBytes(java.util.UUID) throws java.io.IOException;
- method public long getCacheQuotaBytes(java.util.UUID) throws java.io.IOException;
- method public long getCacheSizeBytes(java.util.UUID) throws java.io.IOException;
- method public java.lang.String getMountedObbPath(java.lang.String);
- method public android.os.storage.StorageVolume getPrimaryStorageVolume();
- method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
- method public java.util.List<android.os.storage.StorageVolume> getStorageVolumes();
- method public java.util.UUID getUuidForPath(java.io.File) throws java.io.IOException;
- method public boolean isAllocationSupported(java.io.FileDescriptor);
+ method @WorkerThread public void allocateBytes(@NonNull java.util.UUID, long) throws java.io.IOException;
+ method @WorkerThread public void allocateBytes(java.io.FileDescriptor, long) throws java.io.IOException;
+ method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID) throws java.io.IOException;
+ method @WorkerThread public long getCacheQuotaBytes(@NonNull java.util.UUID) throws java.io.IOException;
+ method @WorkerThread public long getCacheSizeBytes(@NonNull java.util.UUID) throws java.io.IOException;
+ method public String getMountedObbPath(String);
+ method @NonNull public android.os.storage.StorageVolume getPrimaryStorageVolume();
+ method @Nullable public android.os.storage.StorageVolume getStorageVolume(java.io.File);
+ method @NonNull public java.util.List<android.os.storage.StorageVolume> getStorageVolumes();
+ method @NonNull public java.util.UUID getUuidForPath(@NonNull java.io.File) throws java.io.IOException;
+ method public boolean isAllocationSupported(@NonNull java.io.FileDescriptor);
method public boolean isCacheBehaviorGroup(java.io.File) throws java.io.IOException;
method public boolean isCacheBehaviorTombstone(java.io.File) throws java.io.IOException;
method public boolean isEncrypted(java.io.File);
- method public boolean isObbMounted(java.lang.String);
- method public boolean mountObb(java.lang.String, java.lang.String, android.os.storage.OnObbStateChangeListener);
- method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback, android.os.Handler) throws java.io.IOException;
+ method public boolean isObbMounted(String);
+ method public boolean mountObb(String, String, android.os.storage.OnObbStateChangeListener);
+ method @NonNull public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback, android.os.Handler) throws java.io.IOException;
method public void setCacheBehaviorGroup(java.io.File, boolean) throws java.io.IOException;
method public void setCacheBehaviorTombstone(java.io.File, boolean) throws java.io.IOException;
- method public boolean unmountObb(java.lang.String, boolean, android.os.storage.OnObbStateChangeListener);
- field public static final java.lang.String ACTION_MANAGE_STORAGE = "android.os.storage.action.MANAGE_STORAGE";
- field public static final java.lang.String EXTRA_REQUESTED_BYTES = "android.os.storage.extra.REQUESTED_BYTES";
- field public static final java.lang.String EXTRA_UUID = "android.os.storage.extra.UUID";
+ method public boolean unmountObb(String, boolean, android.os.storage.OnObbStateChangeListener);
+ field public static final String ACTION_MANAGE_STORAGE = "android.os.storage.action.MANAGE_STORAGE";
+ field public static final String EXTRA_REQUESTED_BYTES = "android.os.storage.extra.REQUESTED_BYTES";
+ field public static final String EXTRA_UUID = "android.os.storage.extra.UUID";
field public static final java.util.UUID UUID_DEFAULT;
}
public final class StorageVolume implements android.os.Parcelable {
- method public deprecated android.content.Intent createAccessIntent(java.lang.String);
- method public android.content.Intent createOpenDocumentTreeIntent();
+ method @Deprecated @Nullable public android.content.Intent createAccessIntent(String);
+ method @NonNull public android.content.Intent createOpenDocumentTreeIntent();
method public int describeContents();
- method public java.lang.String getDescription(android.content.Context);
- method public java.lang.String getState();
- method public java.lang.String getUuid();
+ method public String getDescription(android.content.Context);
+ method public String getState();
+ method @Nullable public String getUuid();
method public boolean isEmulated();
method public boolean isPrimary();
method public boolean isRemovable();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.storage.StorageVolume> CREATOR;
- field public static final java.lang.String EXTRA_STORAGE_VOLUME = "android.os.storage.extra.STORAGE_VOLUME";
+ field public static final String EXTRA_STORAGE_VOLUME = "android.os.storage.extra.STORAGE_VOLUME";
}
}
@@ -35279,412 +35543,412 @@ package android.os.strictmode {
package android.preference {
- public deprecated class CheckBoxPreference extends android.preference.TwoStatePreference {
- ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
- ctor public CheckBoxPreference(android.content.Context);
- }
-
- public abstract deprecated class DialogPreference extends android.preference.Preference implements android.content.DialogInterface.OnClickListener android.content.DialogInterface.OnDismissListener android.preference.PreferenceManager.OnActivityDestroyListener {
- ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
- ctor public DialogPreference(android.content.Context);
- method public android.app.Dialog getDialog();
- method public android.graphics.drawable.Drawable getDialogIcon();
- method public int getDialogLayoutResource();
- method public java.lang.CharSequence getDialogMessage();
- method public java.lang.CharSequence getDialogTitle();
- method public java.lang.CharSequence getNegativeButtonText();
- method public java.lang.CharSequence getPositiveButtonText();
- method public void onActivityDestroy();
- method protected void onBindDialogView(android.view.View);
- method public void onClick(android.content.DialogInterface, int);
- method protected android.view.View onCreateDialogView();
- method protected void onDialogClosed(boolean);
- method public void onDismiss(android.content.DialogInterface);
- method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
- method public void setDialogIcon(android.graphics.drawable.Drawable);
- method public void setDialogIcon(int);
- method public void setDialogLayoutResource(int);
- method public void setDialogMessage(java.lang.CharSequence);
- method public void setDialogMessage(int);
- method public void setDialogTitle(java.lang.CharSequence);
- method public void setDialogTitle(int);
- method public void setNegativeButtonText(java.lang.CharSequence);
- method public void setNegativeButtonText(int);
- method public void setPositiveButtonText(java.lang.CharSequence);
- method public void setPositiveButtonText(int);
- method protected void showDialog(android.os.Bundle);
- }
-
- public deprecated class EditTextPreference extends android.preference.DialogPreference {
- ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
- ctor public EditTextPreference(android.content.Context);
- method public android.widget.EditText getEditText();
- method public java.lang.String getText();
- method protected void onAddEditTextToDialogView(android.view.View, android.widget.EditText);
- method public void setText(java.lang.String);
- }
-
- public deprecated class ListPreference extends android.preference.DialogPreference {
- ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public ListPreference(android.content.Context, android.util.AttributeSet);
- ctor public ListPreference(android.content.Context);
- method public int findIndexOfValue(java.lang.String);
- method public java.lang.CharSequence[] getEntries();
- method public java.lang.CharSequence getEntry();
- method public java.lang.CharSequence[] getEntryValues();
- method public java.lang.String getValue();
- method public void setEntries(java.lang.CharSequence[]);
- method public void setEntries(int);
- method public void setEntryValues(java.lang.CharSequence[]);
- method public void setEntryValues(int);
- method public void setValue(java.lang.String);
- method public void setValueIndex(int);
- }
-
- public deprecated class MultiSelectListPreference extends android.preference.DialogPreference {
- ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
- ctor public MultiSelectListPreference(android.content.Context);
- method public int findIndexOfValue(java.lang.String);
- method public java.lang.CharSequence[] getEntries();
- method public java.lang.CharSequence[] getEntryValues();
- method public java.util.Set<java.lang.String> getValues();
- method public void setEntries(java.lang.CharSequence[]);
- method public void setEntries(int);
- method public void setEntryValues(java.lang.CharSequence[]);
- method public void setEntryValues(int);
- method public void setValues(java.util.Set<java.lang.String>);
- }
-
- public deprecated class Preference implements java.lang.Comparable {
- ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public Preference(android.content.Context, android.util.AttributeSet, int);
- ctor public Preference(android.content.Context, android.util.AttributeSet);
- ctor public Preference(android.content.Context);
- method protected boolean callChangeListener(java.lang.Object);
- method public int compareTo(android.preference.Preference);
- method protected android.preference.Preference findPreferenceInHierarchy(java.lang.String);
- method public android.content.Context getContext();
- method public java.lang.String getDependency();
- method public android.content.SharedPreferences.Editor getEditor();
- method public android.os.Bundle getExtras();
- method public java.lang.String getFragment();
- method public android.graphics.drawable.Drawable getIcon();
- method public android.content.Intent getIntent();
- method public java.lang.String getKey();
- method public int getLayoutResource();
- method public android.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
- method public android.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
- method public int getOrder();
- method public android.preference.PreferenceGroup getParent();
- method protected boolean getPersistedBoolean(boolean);
- method protected float getPersistedFloat(float);
- method protected int getPersistedInt(int);
- method protected long getPersistedLong(long);
- method protected java.lang.String getPersistedString(java.lang.String);
- method public java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
- method public android.preference.PreferenceDataStore getPreferenceDataStore();
- method public android.preference.PreferenceManager getPreferenceManager();
- method public android.content.SharedPreferences getSharedPreferences();
- method public boolean getShouldDisableView();
- method public java.lang.CharSequence getSummary();
- method public java.lang.CharSequence getTitle();
- method public int getTitleRes();
- method public android.view.View getView(android.view.View, android.view.ViewGroup);
- method public int getWidgetLayoutResource();
- method public boolean hasKey();
- method public boolean isEnabled();
- method public boolean isIconSpaceReserved();
- method public boolean isPersistent();
- method public boolean isRecycleEnabled();
- method public boolean isSelectable();
- method public boolean isSingleLineTitle();
- method protected void notifyChanged();
- method public void notifyDependencyChange(boolean);
- method protected void notifyHierarchyChanged();
- method protected void onAttachedToActivity();
- method protected void onAttachedToHierarchy(android.preference.PreferenceManager);
- method protected void onBindView(android.view.View);
- method protected void onClick();
- method protected android.view.View onCreateView(android.view.ViewGroup);
- method public void onDependencyChanged(android.preference.Preference, boolean);
- method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
- method public void onParentChanged(android.preference.Preference, boolean);
- method protected void onPrepareForRemoval();
- method protected void onRestoreInstanceState(android.os.Parcelable);
- method protected android.os.Parcelable onSaveInstanceState();
- method protected void onSetInitialValue(boolean, java.lang.Object);
- method public android.os.Bundle peekExtras();
- method protected boolean persistBoolean(boolean);
- method protected boolean persistFloat(float);
- method protected boolean persistInt(int);
- method protected boolean persistLong(long);
- method protected boolean persistString(java.lang.String);
- method public boolean persistStringSet(java.util.Set<java.lang.String>);
- method public void restoreHierarchyState(android.os.Bundle);
- method public void saveHierarchyState(android.os.Bundle);
- method public void setDefaultValue(java.lang.Object);
- method public void setDependency(java.lang.String);
- method public void setEnabled(boolean);
- method public void setFragment(java.lang.String);
- method public void setIcon(android.graphics.drawable.Drawable);
- method public void setIcon(int);
- method public void setIconSpaceReserved(boolean);
- method public void setIntent(android.content.Intent);
- method public void setKey(java.lang.String);
- method public void setLayoutResource(int);
- method public void setOnPreferenceChangeListener(android.preference.Preference.OnPreferenceChangeListener);
- method public void setOnPreferenceClickListener(android.preference.Preference.OnPreferenceClickListener);
- method public void setOrder(int);
- method public void setPersistent(boolean);
- method public void setPreferenceDataStore(android.preference.PreferenceDataStore);
- method public void setRecycleEnabled(boolean);
- method public void setSelectable(boolean);
- method public void setShouldDisableView(boolean);
- method public void setSingleLineTitle(boolean);
- method public void setSummary(java.lang.CharSequence);
- method public void setSummary(int);
- method public void setTitle(java.lang.CharSequence);
- method public void setTitle(int);
- method public void setWidgetLayoutResource(int);
- method public boolean shouldCommit();
- method public boolean shouldDisableDependents();
- method protected boolean shouldPersist();
- field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
- }
-
- public static deprecated class Preference.BaseSavedState extends android.view.AbsSavedState {
- ctor public Preference.BaseSavedState(android.os.Parcel);
- ctor public Preference.BaseSavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator<android.preference.Preference.BaseSavedState> CREATOR;
- }
-
- public static abstract deprecated interface Preference.OnPreferenceChangeListener {
- method public abstract boolean onPreferenceChange(android.preference.Preference, java.lang.Object);
- }
-
- public static abstract deprecated interface Preference.OnPreferenceClickListener {
- method public abstract boolean onPreferenceClick(android.preference.Preference);
- }
-
- public abstract deprecated class PreferenceActivity extends android.app.ListActivity implements android.preference.PreferenceFragment.OnPreferenceStartFragmentCallback {
- ctor public PreferenceActivity();
- method public deprecated void addPreferencesFromIntent(android.content.Intent);
- method public deprecated void addPreferencesFromResource(int);
- method public deprecated android.preference.Preference findPreference(java.lang.CharSequence);
- method public void finishPreferencePanel(android.app.Fragment, int, android.content.Intent);
- method public deprecated android.preference.PreferenceManager getPreferenceManager();
- method public deprecated android.preference.PreferenceScreen getPreferenceScreen();
- method public boolean hasHeaders();
- method public void invalidateHeaders();
- method public boolean isMultiPane();
- method protected boolean isValidFragment(java.lang.String);
- method public void loadHeadersFromResource(int, java.util.List<android.preference.PreferenceActivity.Header>);
- method public void onBuildHeaders(java.util.List<android.preference.PreferenceActivity.Header>);
- method public android.content.Intent onBuildStartFragmentIntent(java.lang.String, android.os.Bundle, int, int);
- method public android.preference.PreferenceActivity.Header onGetInitialHeader();
- method public android.preference.PreferenceActivity.Header onGetNewHeader();
- method public void onHeaderClick(android.preference.PreferenceActivity.Header, int);
- method public boolean onIsHidingHeaders();
- method public boolean onIsMultiPane();
- method public boolean onPreferenceStartFragment(android.preference.PreferenceFragment, android.preference.Preference);
- method public deprecated boolean onPreferenceTreeClick(android.preference.PreferenceScreen, android.preference.Preference);
- method public void setListFooter(android.view.View);
- method public void setParentTitle(java.lang.CharSequence, java.lang.CharSequence, android.view.View.OnClickListener);
- method public deprecated void setPreferenceScreen(android.preference.PreferenceScreen);
- method public void showBreadCrumbs(java.lang.CharSequence, java.lang.CharSequence);
- method public void startPreferenceFragment(android.app.Fragment, boolean);
- method public void startPreferencePanel(java.lang.String, android.os.Bundle, int, java.lang.CharSequence, android.app.Fragment, int);
- method public void startWithFragment(java.lang.String, android.os.Bundle, android.app.Fragment, int);
- method public void startWithFragment(java.lang.String, android.os.Bundle, android.app.Fragment, int, int, int);
- method public void switchToHeader(java.lang.String, android.os.Bundle);
- method public void switchToHeader(android.preference.PreferenceActivity.Header);
- field public static final java.lang.String EXTRA_NO_HEADERS = ":android:no_headers";
- field public static final java.lang.String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
- field public static final java.lang.String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":android:show_fragment_args";
- field public static final java.lang.String EXTRA_SHOW_FRAGMENT_SHORT_TITLE = ":android:show_fragment_short_title";
- field public static final java.lang.String EXTRA_SHOW_FRAGMENT_TITLE = ":android:show_fragment_title";
- field public static final long HEADER_ID_UNDEFINED = -1L; // 0xffffffffffffffffL
- }
-
- public static final deprecated class PreferenceActivity.Header implements android.os.Parcelable {
- ctor public PreferenceActivity.Header();
- method public int describeContents();
- method public java.lang.CharSequence getBreadCrumbShortTitle(android.content.res.Resources);
- method public java.lang.CharSequence getBreadCrumbTitle(android.content.res.Resources);
- method public java.lang.CharSequence getSummary(android.content.res.Resources);
- method public java.lang.CharSequence getTitle(android.content.res.Resources);
- method public void readFromParcel(android.os.Parcel);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.preference.PreferenceActivity.Header> CREATOR;
- field public java.lang.CharSequence breadCrumbShortTitle;
- field public int breadCrumbShortTitleRes;
- field public java.lang.CharSequence breadCrumbTitle;
- field public int breadCrumbTitleRes;
- field public android.os.Bundle extras;
- field public java.lang.String fragment;
- field public android.os.Bundle fragmentArguments;
- field public int iconRes;
- field public long id;
- field public android.content.Intent intent;
- field public java.lang.CharSequence summary;
- field public int summaryRes;
- field public java.lang.CharSequence title;
- field public int titleRes;
- }
-
- public deprecated class PreferenceCategory extends android.preference.PreferenceGroup {
- ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
- ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
- ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
- ctor public PreferenceCategory(android.content.Context);
- }
-
- public abstract deprecated interface PreferenceDataStore {
- method public default boolean getBoolean(java.lang.String, boolean);
- method public default float getFloat(java.lang.String, float);
- method public default int getInt(java.lang.String, int);
- method public default long getLong(java.lang.String, long);
- method public default java.lang.String getString(java.lang.String, java.lang.String);
- method public default java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
- method public default void putBoolean(java.lang.String, boolean);
- method public default void putFloat(java.lang.String, float);
- method public default void putInt(java.lang.String, int);
- method public default void putLong(java.lang.String, long);
- method public default void putString(java.lang.String, java.lang.String);
- method public default void putStringSet(java.lang.String, java.util.Set<java.lang.String>);
- }
-
- public abstract deprecated class PreferenceFragment extends android.app.Fragment {
- ctor public PreferenceFragment();
- method public void addPreferencesFromIntent(android.content.Intent);
- method public void addPreferencesFromResource(int);
- method public android.preference.Preference findPreference(java.lang.CharSequence);
- method public android.preference.PreferenceManager getPreferenceManager();
- method public android.preference.PreferenceScreen getPreferenceScreen();
- method public boolean onPreferenceTreeClick(android.preference.PreferenceScreen, android.preference.Preference);
- method public void setPreferenceScreen(android.preference.PreferenceScreen);
- }
-
- public static abstract deprecated interface PreferenceFragment.OnPreferenceStartFragmentCallback {
- method public abstract boolean onPreferenceStartFragment(android.preference.PreferenceFragment, android.preference.Preference);
- }
-
- public abstract deprecated class PreferenceGroup extends android.preference.Preference {
- ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
- ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
- ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
- method public void addItemFromInflater(android.preference.Preference);
- method public boolean addPreference(android.preference.Preference);
- method protected void dispatchRestoreInstanceState(android.os.Bundle);
- method protected void dispatchSaveInstanceState(android.os.Bundle);
- method public android.preference.Preference findPreference(java.lang.CharSequence);
- method public android.preference.Preference getPreference(int);
- method public int getPreferenceCount();
- method protected boolean isOnSameScreenAsChildren();
- method public boolean isOrderingAsAdded();
- method protected boolean onPrepareAddPreference(android.preference.Preference);
- method public void removeAll();
- method public boolean removePreference(android.preference.Preference);
- method public void setOrderingAsAdded(boolean);
- }
-
- public deprecated class PreferenceManager {
- method public android.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
- method public android.preference.Preference findPreference(java.lang.CharSequence);
- method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
- method public static java.lang.String getDefaultSharedPreferencesName(android.content.Context);
- method public android.preference.PreferenceDataStore getPreferenceDataStore();
- method public android.content.SharedPreferences getSharedPreferences();
- method public int getSharedPreferencesMode();
- method public java.lang.String getSharedPreferencesName();
- method public boolean isStorageDefault();
- method public boolean isStorageDeviceProtected();
- method public static void setDefaultValues(android.content.Context, int, boolean);
- method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
- method public void setPreferenceDataStore(android.preference.PreferenceDataStore);
- method public void setSharedPreferencesMode(int);
- method public void setSharedPreferencesName(java.lang.String);
- method public void setStorageDefault();
- method public void setStorageDeviceProtected();
- field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
- field public static final java.lang.String METADATA_KEY_PREFERENCES = "android.preference";
- }
-
- public static abstract deprecated interface PreferenceManager.OnActivityDestroyListener {
- method public abstract void onActivityDestroy();
- }
-
- public static abstract deprecated interface PreferenceManager.OnActivityResultListener {
- method public abstract boolean onActivityResult(int, int, android.content.Intent);
- }
-
- public static abstract deprecated interface PreferenceManager.OnActivityStopListener {
- method public abstract void onActivityStop();
- }
-
- public final deprecated class PreferenceScreen extends android.preference.PreferenceGroup implements android.widget.AdapterView.OnItemClickListener android.content.DialogInterface.OnDismissListener {
- method public void bind(android.widget.ListView);
- method public android.app.Dialog getDialog();
- method public android.widget.ListAdapter getRootAdapter();
- method protected android.widget.ListAdapter onCreateRootAdapter();
- method public void onDismiss(android.content.DialogInterface);
- method public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
- }
-
- public deprecated class RingtonePreference extends android.preference.Preference implements android.preference.PreferenceManager.OnActivityResultListener {
- ctor public RingtonePreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public RingtonePreference(android.content.Context, android.util.AttributeSet, int);
- ctor public RingtonePreference(android.content.Context, android.util.AttributeSet);
- ctor public RingtonePreference(android.content.Context);
- method public int getRingtoneType();
- method public boolean getShowDefault();
- method public boolean getShowSilent();
- method public boolean onActivityResult(int, int, android.content.Intent);
- method protected void onPrepareRingtonePickerIntent(android.content.Intent);
- method protected android.net.Uri onRestoreRingtone();
- method protected void onSaveRingtone(android.net.Uri);
- method public void setRingtoneType(int);
- method public void setShowDefault(boolean);
- method public void setShowSilent(boolean);
- }
-
- public deprecated class SwitchPreference extends android.preference.TwoStatePreference {
- ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
- ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
- ctor public SwitchPreference(android.content.Context);
- method public java.lang.CharSequence getSwitchTextOff();
- method public java.lang.CharSequence getSwitchTextOn();
- method public void setSwitchTextOff(java.lang.CharSequence);
- method public void setSwitchTextOff(int);
- method public void setSwitchTextOn(java.lang.CharSequence);
- method public void setSwitchTextOn(int);
- }
-
- public abstract deprecated class TwoStatePreference extends android.preference.Preference {
- ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
- ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
- ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
- ctor public TwoStatePreference(android.content.Context);
- method public boolean getDisableDependentsState();
- method public java.lang.CharSequence getSummaryOff();
- method public java.lang.CharSequence getSummaryOn();
- method public boolean isChecked();
- method public void setChecked(boolean);
- method public void setDisableDependentsState(boolean);
- method public void setSummaryOff(java.lang.CharSequence);
- method public void setSummaryOff(int);
- method public void setSummaryOn(java.lang.CharSequence);
- method public void setSummaryOn(int);
+ @Deprecated public class CheckBoxPreference extends android.preference.TwoStatePreference {
+ ctor @Deprecated public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public CheckBoxPreference(android.content.Context);
+ }
+
+ @Deprecated public abstract class DialogPreference extends android.preference.Preference implements android.content.DialogInterface.OnClickListener android.content.DialogInterface.OnDismissListener android.preference.PreferenceManager.OnActivityDestroyListener {
+ ctor @Deprecated public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public DialogPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public DialogPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public DialogPreference(android.content.Context);
+ method @Deprecated public android.app.Dialog getDialog();
+ method @Deprecated public android.graphics.drawable.Drawable getDialogIcon();
+ method @Deprecated public int getDialogLayoutResource();
+ method @Deprecated public CharSequence getDialogMessage();
+ method @Deprecated public CharSequence getDialogTitle();
+ method @Deprecated public CharSequence getNegativeButtonText();
+ method @Deprecated public CharSequence getPositiveButtonText();
+ method @Deprecated public void onActivityDestroy();
+ method @Deprecated @CallSuper protected void onBindDialogView(android.view.View);
+ method @Deprecated public void onClick(android.content.DialogInterface, int);
+ method @Deprecated protected android.view.View onCreateDialogView();
+ method @Deprecated protected void onDialogClosed(boolean);
+ method @Deprecated public void onDismiss(android.content.DialogInterface);
+ method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
+ method @Deprecated public void setDialogIcon(android.graphics.drawable.Drawable);
+ method @Deprecated public void setDialogIcon(@DrawableRes int);
+ method @Deprecated public void setDialogLayoutResource(int);
+ method @Deprecated public void setDialogMessage(CharSequence);
+ method @Deprecated public void setDialogMessage(int);
+ method @Deprecated public void setDialogTitle(CharSequence);
+ method @Deprecated public void setDialogTitle(int);
+ method @Deprecated public void setNegativeButtonText(CharSequence);
+ method @Deprecated public void setNegativeButtonText(@StringRes int);
+ method @Deprecated public void setPositiveButtonText(CharSequence);
+ method @Deprecated public void setPositiveButtonText(@StringRes int);
+ method @Deprecated protected void showDialog(android.os.Bundle);
+ }
+
+ @Deprecated public class EditTextPreference extends android.preference.DialogPreference {
+ ctor @Deprecated public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public EditTextPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public EditTextPreference(android.content.Context);
+ method @Deprecated public android.widget.EditText getEditText();
+ method @Deprecated public String getText();
+ method @Deprecated protected void onAddEditTextToDialogView(android.view.View, android.widget.EditText);
+ method @Deprecated public void setText(String);
+ }
+
+ @Deprecated public class ListPreference extends android.preference.DialogPreference {
+ ctor @Deprecated public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public ListPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public ListPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public ListPreference(android.content.Context);
+ method @Deprecated public int findIndexOfValue(String);
+ method @Deprecated public CharSequence[] getEntries();
+ method @Deprecated public CharSequence getEntry();
+ method @Deprecated public CharSequence[] getEntryValues();
+ method @Deprecated public String getValue();
+ method @Deprecated public void setEntries(CharSequence[]);
+ method @Deprecated public void setEntries(@ArrayRes int);
+ method @Deprecated public void setEntryValues(CharSequence[]);
+ method @Deprecated public void setEntryValues(@ArrayRes int);
+ method @Deprecated public void setValue(String);
+ method @Deprecated public void setValueIndex(int);
+ }
+
+ @Deprecated public class MultiSelectListPreference extends android.preference.DialogPreference {
+ ctor @Deprecated public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public MultiSelectListPreference(android.content.Context);
+ method @Deprecated public int findIndexOfValue(String);
+ method @Deprecated public CharSequence[] getEntries();
+ method @Deprecated public CharSequence[] getEntryValues();
+ method @Deprecated public java.util.Set<java.lang.String> getValues();
+ method @Deprecated public void setEntries(CharSequence[]);
+ method @Deprecated public void setEntries(@ArrayRes int);
+ method @Deprecated public void setEntryValues(CharSequence[]);
+ method @Deprecated public void setEntryValues(@ArrayRes int);
+ method @Deprecated public void setValues(java.util.Set<java.lang.String>);
+ }
+
+ @Deprecated public class Preference implements java.lang.Comparable<android.preference.Preference> {
+ ctor @Deprecated public Preference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public Preference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public Preference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public Preference(android.content.Context);
+ method @Deprecated protected boolean callChangeListener(Object);
+ method @Deprecated public int compareTo(android.preference.Preference);
+ method @Deprecated protected android.preference.Preference findPreferenceInHierarchy(String);
+ method @Deprecated public android.content.Context getContext();
+ method @Deprecated public String getDependency();
+ method @Deprecated public android.content.SharedPreferences.Editor getEditor();
+ method @Deprecated public android.os.Bundle getExtras();
+ method @Deprecated public String getFragment();
+ method @Deprecated public android.graphics.drawable.Drawable getIcon();
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public String getKey();
+ method @Deprecated @LayoutRes public int getLayoutResource();
+ method @Deprecated public android.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
+ method @Deprecated public android.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
+ method @Deprecated public int getOrder();
+ method @Deprecated @Nullable public android.preference.PreferenceGroup getParent();
+ method @Deprecated protected boolean getPersistedBoolean(boolean);
+ method @Deprecated protected float getPersistedFloat(float);
+ method @Deprecated protected int getPersistedInt(int);
+ method @Deprecated protected long getPersistedLong(long);
+ method @Deprecated protected String getPersistedString(String);
+ method @Deprecated public java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
+ method @Deprecated @Nullable public android.preference.PreferenceDataStore getPreferenceDataStore();
+ method @Deprecated public android.preference.PreferenceManager getPreferenceManager();
+ method @Deprecated public android.content.SharedPreferences getSharedPreferences();
+ method @Deprecated public boolean getShouldDisableView();
+ method @Deprecated public CharSequence getSummary();
+ method @Deprecated public CharSequence getTitle();
+ method @Deprecated @StringRes public int getTitleRes();
+ method @Deprecated public android.view.View getView(android.view.View, android.view.ViewGroup);
+ method @Deprecated @LayoutRes public int getWidgetLayoutResource();
+ method @Deprecated public boolean hasKey();
+ method @Deprecated public boolean isEnabled();
+ method @Deprecated public boolean isIconSpaceReserved();
+ method @Deprecated public boolean isPersistent();
+ method @Deprecated public boolean isRecycleEnabled();
+ method @Deprecated public boolean isSelectable();
+ method @Deprecated public boolean isSingleLineTitle();
+ method @Deprecated protected void notifyChanged();
+ method @Deprecated public void notifyDependencyChange(boolean);
+ method @Deprecated protected void notifyHierarchyChanged();
+ method @Deprecated protected void onAttachedToActivity();
+ method @Deprecated protected void onAttachedToHierarchy(android.preference.PreferenceManager);
+ method @Deprecated @CallSuper protected void onBindView(android.view.View);
+ method @Deprecated protected void onClick();
+ method @Deprecated @CallSuper protected android.view.View onCreateView(android.view.ViewGroup);
+ method @Deprecated public void onDependencyChanged(android.preference.Preference, boolean);
+ method @Deprecated protected Object onGetDefaultValue(android.content.res.TypedArray, int);
+ method @Deprecated public void onParentChanged(android.preference.Preference, boolean);
+ method @Deprecated @CallSuper protected void onPrepareForRemoval();
+ method @Deprecated protected void onRestoreInstanceState(android.os.Parcelable);
+ method @Deprecated protected android.os.Parcelable onSaveInstanceState();
+ method @Deprecated protected void onSetInitialValue(boolean, Object);
+ method @Deprecated public android.os.Bundle peekExtras();
+ method @Deprecated protected boolean persistBoolean(boolean);
+ method @Deprecated protected boolean persistFloat(float);
+ method @Deprecated protected boolean persistInt(int);
+ method @Deprecated protected boolean persistLong(long);
+ method @Deprecated protected boolean persistString(String);
+ method @Deprecated public boolean persistStringSet(java.util.Set<java.lang.String>);
+ method @Deprecated public void restoreHierarchyState(android.os.Bundle);
+ method @Deprecated public void saveHierarchyState(android.os.Bundle);
+ method @Deprecated public void setDefaultValue(Object);
+ method @Deprecated public void setDependency(String);
+ method @Deprecated public void setEnabled(boolean);
+ method @Deprecated public void setFragment(String);
+ method @Deprecated public void setIcon(android.graphics.drawable.Drawable);
+ method @Deprecated public void setIcon(@DrawableRes int);
+ method @Deprecated public void setIconSpaceReserved(boolean);
+ method @Deprecated public void setIntent(android.content.Intent);
+ method @Deprecated public void setKey(String);
+ method @Deprecated public void setLayoutResource(@LayoutRes int);
+ method @Deprecated public void setOnPreferenceChangeListener(android.preference.Preference.OnPreferenceChangeListener);
+ method @Deprecated public void setOnPreferenceClickListener(android.preference.Preference.OnPreferenceClickListener);
+ method @Deprecated public void setOrder(int);
+ method @Deprecated public void setPersistent(boolean);
+ method @Deprecated public void setPreferenceDataStore(android.preference.PreferenceDataStore);
+ method @Deprecated @CallSuper public void setRecycleEnabled(boolean);
+ method @Deprecated public void setSelectable(boolean);
+ method @Deprecated public void setShouldDisableView(boolean);
+ method @Deprecated public void setSingleLineTitle(boolean);
+ method @Deprecated public void setSummary(CharSequence);
+ method @Deprecated public void setSummary(@StringRes int);
+ method @Deprecated public void setTitle(CharSequence);
+ method @Deprecated public void setTitle(@StringRes int);
+ method @Deprecated public void setWidgetLayoutResource(@LayoutRes int);
+ method @Deprecated public boolean shouldCommit();
+ method @Deprecated public boolean shouldDisableDependents();
+ method @Deprecated protected boolean shouldPersist();
+ field @Deprecated public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
+ }
+
+ @Deprecated public static class Preference.BaseSavedState extends android.view.AbsSavedState {
+ ctor @Deprecated public Preference.BaseSavedState(android.os.Parcel);
+ ctor @Deprecated public Preference.BaseSavedState(android.os.Parcelable);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.preference.Preference.BaseSavedState> CREATOR;
+ }
+
+ @Deprecated public static interface Preference.OnPreferenceChangeListener {
+ method @Deprecated public boolean onPreferenceChange(android.preference.Preference, Object);
+ }
+
+ @Deprecated public static interface Preference.OnPreferenceClickListener {
+ method @Deprecated public boolean onPreferenceClick(android.preference.Preference);
+ }
+
+ @Deprecated public abstract class PreferenceActivity extends android.app.ListActivity implements android.preference.PreferenceFragment.OnPreferenceStartFragmentCallback {
+ ctor @Deprecated public PreferenceActivity();
+ method @Deprecated public void addPreferencesFromIntent(android.content.Intent);
+ method @Deprecated public void addPreferencesFromResource(int);
+ method @Deprecated public android.preference.Preference findPreference(CharSequence);
+ method @Deprecated public void finishPreferencePanel(android.app.Fragment, int, android.content.Intent);
+ method @Deprecated public android.preference.PreferenceManager getPreferenceManager();
+ method @Deprecated public android.preference.PreferenceScreen getPreferenceScreen();
+ method @Deprecated public boolean hasHeaders();
+ method @Deprecated public void invalidateHeaders();
+ method @Deprecated public boolean isMultiPane();
+ method @Deprecated protected boolean isValidFragment(String);
+ method @Deprecated public void loadHeadersFromResource(@XmlRes int, java.util.List<android.preference.PreferenceActivity.Header>);
+ method @Deprecated public void onBuildHeaders(java.util.List<android.preference.PreferenceActivity.Header>);
+ method @Deprecated public android.content.Intent onBuildStartFragmentIntent(String, android.os.Bundle, @StringRes int, int);
+ method @Deprecated public android.preference.PreferenceActivity.Header onGetInitialHeader();
+ method @Deprecated public android.preference.PreferenceActivity.Header onGetNewHeader();
+ method @Deprecated public void onHeaderClick(android.preference.PreferenceActivity.Header, int);
+ method @Deprecated public boolean onIsHidingHeaders();
+ method @Deprecated public boolean onIsMultiPane();
+ method @Deprecated public boolean onPreferenceStartFragment(android.preference.PreferenceFragment, android.preference.Preference);
+ method @Deprecated public boolean onPreferenceTreeClick(android.preference.PreferenceScreen, android.preference.Preference);
+ method @Deprecated public void setListFooter(android.view.View);
+ method @Deprecated public void setParentTitle(CharSequence, CharSequence, android.view.View.OnClickListener);
+ method @Deprecated public void setPreferenceScreen(android.preference.PreferenceScreen);
+ method @Deprecated public void showBreadCrumbs(CharSequence, CharSequence);
+ method @Deprecated public void startPreferenceFragment(android.app.Fragment, boolean);
+ method @Deprecated public void startPreferencePanel(String, android.os.Bundle, @StringRes int, CharSequence, android.app.Fragment, int);
+ method @Deprecated public void startWithFragment(String, android.os.Bundle, android.app.Fragment, int);
+ method @Deprecated public void startWithFragment(String, android.os.Bundle, android.app.Fragment, int, @StringRes int, @StringRes int);
+ method @Deprecated public void switchToHeader(String, android.os.Bundle);
+ method @Deprecated public void switchToHeader(android.preference.PreferenceActivity.Header);
+ field @Deprecated public static final String EXTRA_NO_HEADERS = ":android:no_headers";
+ field @Deprecated public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
+ field @Deprecated public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":android:show_fragment_args";
+ field @Deprecated public static final String EXTRA_SHOW_FRAGMENT_SHORT_TITLE = ":android:show_fragment_short_title";
+ field @Deprecated public static final String EXTRA_SHOW_FRAGMENT_TITLE = ":android:show_fragment_title";
+ field @Deprecated public static final long HEADER_ID_UNDEFINED = -1L; // 0xffffffffffffffffL
+ }
+
+ @Deprecated public static final class PreferenceActivity.Header implements android.os.Parcelable {
+ ctor @Deprecated public PreferenceActivity.Header();
+ method @Deprecated public int describeContents();
+ method @Deprecated public CharSequence getBreadCrumbShortTitle(android.content.res.Resources);
+ method @Deprecated public CharSequence getBreadCrumbTitle(android.content.res.Resources);
+ method @Deprecated public CharSequence getSummary(android.content.res.Resources);
+ method @Deprecated public CharSequence getTitle(android.content.res.Resources);
+ method @Deprecated public void readFromParcel(android.os.Parcel);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.preference.PreferenceActivity.Header> CREATOR;
+ field @Deprecated public CharSequence breadCrumbShortTitle;
+ field @Deprecated @StringRes public int breadCrumbShortTitleRes;
+ field @Deprecated public CharSequence breadCrumbTitle;
+ field @Deprecated @StringRes public int breadCrumbTitleRes;
+ field @Deprecated public android.os.Bundle extras;
+ field @Deprecated public String fragment;
+ field @Deprecated public android.os.Bundle fragmentArguments;
+ field @Deprecated public int iconRes;
+ field @Deprecated public long id;
+ field @Deprecated public android.content.Intent intent;
+ field @Deprecated public CharSequence summary;
+ field @Deprecated @StringRes public int summaryRes;
+ field @Deprecated public CharSequence title;
+ field @Deprecated @StringRes public int titleRes;
+ }
+
+ @Deprecated public class PreferenceCategory extends android.preference.PreferenceGroup {
+ ctor @Deprecated public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public PreferenceCategory(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public PreferenceCategory(android.content.Context);
+ }
+
+ @Deprecated public interface PreferenceDataStore {
+ method @Deprecated public default boolean getBoolean(String, boolean);
+ method @Deprecated public default float getFloat(String, float);
+ method @Deprecated public default int getInt(String, int);
+ method @Deprecated public default long getLong(String, long);
+ method @Deprecated @Nullable public default String getString(String, @Nullable String);
+ method @Deprecated @Nullable public default java.util.Set<java.lang.String> getStringSet(String, @Nullable java.util.Set<java.lang.String>);
+ method @Deprecated public default void putBoolean(String, boolean);
+ method @Deprecated public default void putFloat(String, float);
+ method @Deprecated public default void putInt(String, int);
+ method @Deprecated public default void putLong(String, long);
+ method @Deprecated public default void putString(String, @Nullable String);
+ method @Deprecated public default void putStringSet(String, @Nullable java.util.Set<java.lang.String>);
+ }
+
+ @Deprecated public abstract class PreferenceFragment extends android.app.Fragment {
+ ctor @Deprecated public PreferenceFragment();
+ method @Deprecated public void addPreferencesFromIntent(android.content.Intent);
+ method @Deprecated public void addPreferencesFromResource(@XmlRes int);
+ method @Deprecated public android.preference.Preference findPreference(CharSequence);
+ method @Deprecated public android.preference.PreferenceManager getPreferenceManager();
+ method @Deprecated public android.preference.PreferenceScreen getPreferenceScreen();
+ method @Deprecated public boolean onPreferenceTreeClick(android.preference.PreferenceScreen, android.preference.Preference);
+ method @Deprecated public void setPreferenceScreen(android.preference.PreferenceScreen);
+ }
+
+ @Deprecated public static interface PreferenceFragment.OnPreferenceStartFragmentCallback {
+ method @Deprecated public boolean onPreferenceStartFragment(android.preference.PreferenceFragment, android.preference.Preference);
+ }
+
+ @Deprecated public abstract class PreferenceGroup extends android.preference.Preference {
+ ctor @Deprecated public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public PreferenceGroup(android.content.Context, android.util.AttributeSet);
+ method @Deprecated public void addItemFromInflater(android.preference.Preference);
+ method @Deprecated public boolean addPreference(android.preference.Preference);
+ method @Deprecated protected void dispatchRestoreInstanceState(android.os.Bundle);
+ method @Deprecated protected void dispatchSaveInstanceState(android.os.Bundle);
+ method @Deprecated public android.preference.Preference findPreference(CharSequence);
+ method @Deprecated public android.preference.Preference getPreference(int);
+ method @Deprecated public int getPreferenceCount();
+ method @Deprecated protected boolean isOnSameScreenAsChildren();
+ method @Deprecated public boolean isOrderingAsAdded();
+ method @Deprecated protected boolean onPrepareAddPreference(android.preference.Preference);
+ method @Deprecated public void removeAll();
+ method @Deprecated public boolean removePreference(android.preference.Preference);
+ method @Deprecated public void setOrderingAsAdded(boolean);
+ }
+
+ @Deprecated public class PreferenceManager {
+ method @Deprecated public android.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
+ method @Deprecated @Nullable public android.preference.Preference findPreference(CharSequence);
+ method @Deprecated public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
+ method @Deprecated public static String getDefaultSharedPreferencesName(android.content.Context);
+ method @Deprecated @Nullable public android.preference.PreferenceDataStore getPreferenceDataStore();
+ method @Deprecated public android.content.SharedPreferences getSharedPreferences();
+ method @Deprecated public int getSharedPreferencesMode();
+ method @Deprecated public String getSharedPreferencesName();
+ method @Deprecated public boolean isStorageDefault();
+ method @Deprecated public boolean isStorageDeviceProtected();
+ method @Deprecated public static void setDefaultValues(android.content.Context, @XmlRes int, boolean);
+ method @Deprecated public static void setDefaultValues(android.content.Context, String, int, int, boolean);
+ method @Deprecated public void setPreferenceDataStore(android.preference.PreferenceDataStore);
+ method @Deprecated public void setSharedPreferencesMode(int);
+ method @Deprecated public void setSharedPreferencesName(String);
+ method @Deprecated public void setStorageDefault();
+ method @Deprecated public void setStorageDeviceProtected();
+ field @Deprecated public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
+ field @Deprecated public static final String METADATA_KEY_PREFERENCES = "android.preference";
+ }
+
+ @Deprecated public static interface PreferenceManager.OnActivityDestroyListener {
+ method @Deprecated public void onActivityDestroy();
+ }
+
+ @Deprecated public static interface PreferenceManager.OnActivityResultListener {
+ method @Deprecated public boolean onActivityResult(int, int, android.content.Intent);
+ }
+
+ @Deprecated public static interface PreferenceManager.OnActivityStopListener {
+ method @Deprecated public void onActivityStop();
+ }
+
+ @Deprecated public final class PreferenceScreen extends android.preference.PreferenceGroup implements android.widget.AdapterView.OnItemClickListener android.content.DialogInterface.OnDismissListener {
+ method @Deprecated public void bind(android.widget.ListView);
+ method @Deprecated public android.app.Dialog getDialog();
+ method @Deprecated public android.widget.ListAdapter getRootAdapter();
+ method @Deprecated protected android.widget.ListAdapter onCreateRootAdapter();
+ method @Deprecated public void onDismiss(android.content.DialogInterface);
+ method @Deprecated public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
+ }
+
+ @Deprecated public class RingtonePreference extends android.preference.Preference implements android.preference.PreferenceManager.OnActivityResultListener {
+ ctor @Deprecated public RingtonePreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public RingtonePreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public RingtonePreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public RingtonePreference(android.content.Context);
+ method @Deprecated public int getRingtoneType();
+ method @Deprecated public boolean getShowDefault();
+ method @Deprecated public boolean getShowSilent();
+ method @Deprecated public boolean onActivityResult(int, int, android.content.Intent);
+ method @Deprecated protected void onPrepareRingtonePickerIntent(android.content.Intent);
+ method @Deprecated protected android.net.Uri onRestoreRingtone();
+ method @Deprecated protected void onSaveRingtone(android.net.Uri);
+ method @Deprecated public void setRingtoneType(int);
+ method @Deprecated public void setShowDefault(boolean);
+ method @Deprecated public void setShowSilent(boolean);
+ }
+
+ @Deprecated public class SwitchPreference extends android.preference.TwoStatePreference {
+ ctor @Deprecated public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public SwitchPreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public SwitchPreference(android.content.Context);
+ method @Deprecated public CharSequence getSwitchTextOff();
+ method @Deprecated public CharSequence getSwitchTextOn();
+ method @Deprecated public void setSwitchTextOff(CharSequence);
+ method @Deprecated public void setSwitchTextOff(@StringRes int);
+ method @Deprecated public void setSwitchTextOn(CharSequence);
+ method @Deprecated public void setSwitchTextOn(@StringRes int);
+ }
+
+ @Deprecated public abstract class TwoStatePreference extends android.preference.Preference {
+ ctor @Deprecated public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor @Deprecated public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public TwoStatePreference(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public TwoStatePreference(android.content.Context);
+ method @Deprecated public boolean getDisableDependentsState();
+ method @Deprecated public CharSequence getSummaryOff();
+ method @Deprecated public CharSequence getSummaryOn();
+ method @Deprecated public boolean isChecked();
+ method @Deprecated public void setChecked(boolean);
+ method @Deprecated public void setDisableDependentsState(boolean);
+ method @Deprecated public void setSummaryOff(CharSequence);
+ method @Deprecated public void setSummaryOff(@StringRes int);
+ method @Deprecated public void setSummaryOn(CharSequence);
+ method @Deprecated public void setSummaryOn(@StringRes int);
}
}
@@ -35692,10 +35956,10 @@ package android.preference {
package android.print {
public final class PageRange implements android.os.Parcelable {
- ctor public PageRange(int, int);
+ ctor public PageRange(@IntRange(from=0) int, @IntRange(from=0) int);
method public int describeContents();
- method public int getEnd();
- method public int getStart();
+ method @IntRange(from=0) public int getEnd();
+ method @IntRange(from=0) public int getStart();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.print.PageRange ALL_PAGES;
field public static final android.os.Parcelable.Creator<android.print.PageRange> CREATOR;
@@ -35703,11 +35967,11 @@ package android.print {
public final class PrintAttributes implements android.os.Parcelable {
method public int describeContents();
- method public int getColorMode();
- method public int getDuplexMode();
- method public android.print.PrintAttributes.MediaSize getMediaSize();
- method public android.print.PrintAttributes.Margins getMinMargins();
- method public android.print.PrintAttributes.Resolution getResolution();
+ method @IntRange(from=0) public int getColorMode();
+ method @IntRange(from=0) public int getDuplexMode();
+ method @Nullable public android.print.PrintAttributes.MediaSize getMediaSize();
+ method @Nullable public android.print.PrintAttributes.Margins getMinMargins();
+ method @Nullable public android.print.PrintAttributes.Resolution getResolution();
method public void writeToParcel(android.os.Parcel, int);
field public static final int COLOR_MODE_COLOR = 2; // 0x2
field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
@@ -35719,12 +35983,12 @@ package android.print {
public static final class PrintAttributes.Builder {
ctor public PrintAttributes.Builder();
- method public android.print.PrintAttributes build();
- method public android.print.PrintAttributes.Builder setColorMode(int);
- method public android.print.PrintAttributes.Builder setDuplexMode(int);
- method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
- method public android.print.PrintAttributes.Builder setMinMargins(android.print.PrintAttributes.Margins);
- method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution);
+ method @NonNull public android.print.PrintAttributes build();
+ method @NonNull public android.print.PrintAttributes.Builder setColorMode(int);
+ method @NonNull public android.print.PrintAttributes.Builder setDuplexMode(int);
+ method @NonNull public android.print.PrintAttributes.Builder setMediaSize(@NonNull android.print.PrintAttributes.MediaSize);
+ method @NonNull public android.print.PrintAttributes.Builder setMinMargins(@NonNull android.print.PrintAttributes.Margins);
+ method @NonNull public android.print.PrintAttributes.Builder setResolution(@NonNull android.print.PrintAttributes.Resolution);
}
public static final class PrintAttributes.Margins {
@@ -35737,13 +36001,13 @@ package android.print {
}
public static final class PrintAttributes.MediaSize {
- ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int);
- method public android.print.PrintAttributes.MediaSize asLandscape();
- method public android.print.PrintAttributes.MediaSize asPortrait();
- method public int getHeightMils();
- method public java.lang.String getId();
- method public java.lang.String getLabel(android.content.pm.PackageManager);
- method public int getWidthMils();
+ ctor public PrintAttributes.MediaSize(@NonNull String, @NonNull String, @IntRange(from=1) int, @IntRange(from=1) int);
+ method @NonNull public android.print.PrintAttributes.MediaSize asLandscape();
+ method @NonNull public android.print.PrintAttributes.MediaSize asPortrait();
+ method @IntRange(from=1) public int getHeightMils();
+ method @NonNull public String getId();
+ method @NonNull public String getLabel(@NonNull android.content.pm.PackageManager);
+ method @IntRange(from=1) public int getWidthMils();
method public boolean isPortrait();
field public static final android.print.PrintAttributes.MediaSize ISO_A0;
field public static final android.print.PrintAttributes.MediaSize ISO_A1;
@@ -35831,11 +36095,11 @@ package android.print {
}
public static final class PrintAttributes.Resolution {
- ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int);
- method public int getHorizontalDpi();
- method public java.lang.String getId();
- method public java.lang.String getLabel();
- method public int getVerticalDpi();
+ ctor public PrintAttributes.Resolution(@NonNull String, @NonNull String, @IntRange(from=1) int, @IntRange(from=1) int);
+ method @IntRange(from=1) public int getHorizontalDpi();
+ method @NonNull public String getId();
+ method @NonNull public String getLabel();
+ method @IntRange(from=1) public int getVerticalDpi();
}
public abstract class PrintDocumentAdapter {
@@ -35844,27 +36108,27 @@ package android.print {
method public abstract void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle);
method public void onStart();
method public abstract void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
- field public static final java.lang.String EXTRA_PRINT_PREVIEW = "EXTRA_PRINT_PREVIEW";
+ field public static final String EXTRA_PRINT_PREVIEW = "EXTRA_PRINT_PREVIEW";
}
- public static abstract class PrintDocumentAdapter.LayoutResultCallback {
+ public abstract static class PrintDocumentAdapter.LayoutResultCallback {
method public void onLayoutCancelled();
- method public void onLayoutFailed(java.lang.CharSequence);
+ method public void onLayoutFailed(CharSequence);
method public void onLayoutFinished(android.print.PrintDocumentInfo, boolean);
}
- public static abstract class PrintDocumentAdapter.WriteResultCallback {
+ public abstract static class PrintDocumentAdapter.WriteResultCallback {
method public void onWriteCancelled();
- method public void onWriteFailed(java.lang.CharSequence);
+ method public void onWriteFailed(CharSequence);
method public void onWriteFinished(android.print.PageRange[]);
}
public final class PrintDocumentInfo implements android.os.Parcelable {
method public int describeContents();
method public int getContentType();
- method public long getDataSize();
- method public java.lang.String getName();
- method public int getPageCount();
+ method @IntRange(from=0) public long getDataSize();
+ method @NonNull public String getName();
+ method @IntRange(from=0xffffffff) public int getPageCount();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0
field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1
@@ -35874,16 +36138,16 @@ package android.print {
}
public static final class PrintDocumentInfo.Builder {
- ctor public PrintDocumentInfo.Builder(java.lang.String);
- method public android.print.PrintDocumentInfo build();
- method public android.print.PrintDocumentInfo.Builder setContentType(int);
- method public android.print.PrintDocumentInfo.Builder setPageCount(int);
+ ctor public PrintDocumentInfo.Builder(@NonNull String);
+ method @NonNull public android.print.PrintDocumentInfo build();
+ method @NonNull public android.print.PrintDocumentInfo.Builder setContentType(int);
+ method @NonNull public android.print.PrintDocumentInfo.Builder setPageCount(@IntRange(from=0xffffffff) int);
}
public final class PrintJob {
method public void cancel();
- method public android.print.PrintJobId getId();
- method public android.print.PrintJobInfo getInfo();
+ method @Nullable public android.print.PrintJobId getId();
+ method @NonNull public android.print.PrintJobInfo getInfo();
method public boolean isBlocked();
method public boolean isCancelled();
method public boolean isCompleted();
@@ -35901,17 +36165,17 @@ package android.print {
public final class PrintJobInfo implements android.os.Parcelable {
method public int describeContents();
- method public int getAdvancedIntOption(java.lang.String);
- method public java.lang.String getAdvancedStringOption(java.lang.String);
- method public android.print.PrintAttributes getAttributes();
- method public int getCopies();
+ method public int getAdvancedIntOption(String);
+ method public String getAdvancedStringOption(String);
+ method @NonNull public android.print.PrintAttributes getAttributes();
+ method @IntRange(from=0) public int getCopies();
method public long getCreationTime();
- method public android.print.PrintJobId getId();
- method public java.lang.String getLabel();
- method public android.print.PageRange[] getPages();
- method public android.print.PrinterId getPrinterId();
+ method @Nullable public android.print.PrintJobId getId();
+ method @NonNull public String getLabel();
+ method @Nullable public android.print.PageRange[] getPages();
+ method @Nullable public android.print.PrinterId getPrinterId();
method public int getState();
- method public boolean hasAdvancedOption(java.lang.String);
+ method public boolean hasAdvancedOption(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.print.PrintJobInfo> CREATOR;
field public static final int STATE_BLOCKED = 4; // 0x4
@@ -35924,55 +36188,55 @@ package android.print {
}
public static final class PrintJobInfo.Builder {
- ctor public PrintJobInfo.Builder(android.print.PrintJobInfo);
- method public android.print.PrintJobInfo build();
- method public void putAdvancedOption(java.lang.String, java.lang.String);
- method public void putAdvancedOption(java.lang.String, int);
- method public void setAttributes(android.print.PrintAttributes);
- method public void setCopies(int);
- method public void setPages(android.print.PageRange[]);
+ ctor public PrintJobInfo.Builder(@Nullable android.print.PrintJobInfo);
+ method @NonNull public android.print.PrintJobInfo build();
+ method public void putAdvancedOption(@NonNull String, @Nullable String);
+ method public void putAdvancedOption(@NonNull String, int);
+ method public void setAttributes(@NonNull android.print.PrintAttributes);
+ method public void setCopies(@IntRange(from=1) int);
+ method public void setPages(@NonNull android.print.PageRange[]);
}
public final class PrintManager {
- method public java.util.List<android.print.PrintJob> getPrintJobs();
- method public android.print.PrintJob print(java.lang.String, android.print.PrintDocumentAdapter, android.print.PrintAttributes);
+ method @NonNull public java.util.List<android.print.PrintJob> getPrintJobs();
+ method @NonNull public android.print.PrintJob print(@NonNull String, @NonNull android.print.PrintDocumentAdapter, @Nullable android.print.PrintAttributes);
}
public final class PrinterCapabilitiesInfo implements android.os.Parcelable {
method public int describeContents();
method public int getColorModes();
- method public android.print.PrintAttributes getDefaults();
+ method @NonNull public android.print.PrintAttributes getDefaults();
method public int getDuplexModes();
- method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
- method public android.print.PrintAttributes.Margins getMinMargins();
- method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
+ method @NonNull public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
+ method @NonNull public android.print.PrintAttributes.Margins getMinMargins();
+ method @NonNull public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.print.PrinterCapabilitiesInfo> CREATOR;
}
public static final class PrinterCapabilitiesInfo.Builder {
- ctor public PrinterCapabilitiesInfo.Builder(android.print.PrinterId);
- method public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(android.print.PrintAttributes.MediaSize, boolean);
- method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean);
- method public android.print.PrinterCapabilitiesInfo build();
- method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
- method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
- method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins);
+ ctor public PrinterCapabilitiesInfo.Builder(@NonNull android.print.PrinterId);
+ method @NonNull public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(@NonNull android.print.PrintAttributes.MediaSize, boolean);
+ method @NonNull public android.print.PrinterCapabilitiesInfo.Builder addResolution(@NonNull android.print.PrintAttributes.Resolution, boolean);
+ method @NonNull public android.print.PrinterCapabilitiesInfo build();
+ method @NonNull public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
+ method @NonNull public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
+ method @NonNull public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(@NonNull android.print.PrintAttributes.Margins);
}
public final class PrinterId implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getLocalId();
+ method @NonNull public String getLocalId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.print.PrinterId> CREATOR;
}
public final class PrinterInfo implements android.os.Parcelable {
method public int describeContents();
- method public android.print.PrinterCapabilitiesInfo getCapabilities();
- method public java.lang.String getDescription();
- method public android.print.PrinterId getId();
- method public java.lang.String getName();
+ method @Nullable public android.print.PrinterCapabilitiesInfo getCapabilities();
+ method @Nullable public String getDescription();
+ method @NonNull public android.print.PrinterId getId();
+ method @NonNull public String getName();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.print.PrinterInfo> CREATOR;
@@ -35982,16 +36246,16 @@ package android.print {
}
public static final class PrinterInfo.Builder {
- ctor public PrinterInfo.Builder(android.print.PrinterId, java.lang.String, int);
- ctor public PrinterInfo.Builder(android.print.PrinterInfo);
- method public android.print.PrinterInfo build();
- method public android.print.PrinterInfo.Builder setCapabilities(android.print.PrinterCapabilitiesInfo);
- method public android.print.PrinterInfo.Builder setDescription(java.lang.String);
- method public android.print.PrinterInfo.Builder setHasCustomPrinterIcon(boolean);
- method public android.print.PrinterInfo.Builder setIconResourceId(int);
- method public android.print.PrinterInfo.Builder setInfoIntent(android.app.PendingIntent);
- method public android.print.PrinterInfo.Builder setName(java.lang.String);
- method public android.print.PrinterInfo.Builder setStatus(int);
+ ctor public PrinterInfo.Builder(@NonNull android.print.PrinterId, @NonNull String, int);
+ ctor public PrinterInfo.Builder(@NonNull android.print.PrinterInfo);
+ method @NonNull public android.print.PrinterInfo build();
+ method @NonNull public android.print.PrinterInfo.Builder setCapabilities(@NonNull android.print.PrinterCapabilitiesInfo);
+ method @NonNull public android.print.PrinterInfo.Builder setDescription(@NonNull String);
+ method @NonNull public android.print.PrinterInfo.Builder setHasCustomPrinterIcon(boolean);
+ method @NonNull public android.print.PrinterInfo.Builder setIconResourceId(@DrawableRes int);
+ method @NonNull public android.print.PrinterInfo.Builder setInfoIntent(@NonNull android.app.PendingIntent);
+ method @NonNull public android.print.PrinterInfo.Builder setName(@NonNull String);
+ method @NonNull public android.print.PrinterInfo.Builder setStatus(int);
}
}
@@ -35999,11 +36263,11 @@ package android.print {
package android.print.pdf {
public class PrintedPdfDocument extends android.graphics.pdf.PdfDocument {
- ctor public PrintedPdfDocument(android.content.Context, android.print.PrintAttributes);
- method public android.graphics.Rect getPageContentRect();
- method public int getPageHeight();
- method public int getPageWidth();
- method public android.graphics.pdf.PdfDocument.Page startPage(int);
+ ctor public PrintedPdfDocument(@NonNull android.content.Context, @NonNull android.print.PrintAttributes);
+ method @NonNull public android.graphics.Rect getPageContentRect();
+ method @IntRange(from=0) public int getPageHeight();
+ method @IntRange(from=0) public int getPageWidth();
+ method @NonNull public android.graphics.pdf.PdfDocument.Page startPage(@IntRange(from=0) int);
}
}
@@ -36011,74 +36275,74 @@ package android.print.pdf {
package android.printservice {
public final class CustomPrinterIconCallback {
- method public boolean onCustomPrinterIconLoaded(android.graphics.drawable.Icon);
+ method public boolean onCustomPrinterIconLoaded(@Nullable android.graphics.drawable.Icon);
}
public final class PrintDocument {
- method public android.os.ParcelFileDescriptor getData();
- method public android.print.PrintDocumentInfo getInfo();
+ method @Nullable public android.os.ParcelFileDescriptor getData();
+ method @NonNull public android.print.PrintDocumentInfo getInfo();
}
public final class PrintJob {
- method public boolean block(java.lang.String);
- method public boolean cancel();
- method public boolean complete();
- method public boolean fail(java.lang.String);
- method public int getAdvancedIntOption(java.lang.String);
- method public java.lang.String getAdvancedStringOption(java.lang.String);
- method public android.printservice.PrintDocument getDocument();
- method public android.print.PrintJobId getId();
- method public android.print.PrintJobInfo getInfo();
- method public java.lang.String getTag();
- method public boolean hasAdvancedOption(java.lang.String);
- method public boolean isBlocked();
- method public boolean isCancelled();
- method public boolean isCompleted();
- method public boolean isFailed();
- method public boolean isQueued();
- method public boolean isStarted();
- method public void setProgress(float);
- method public void setStatus(java.lang.CharSequence);
- method public void setStatus(int);
- method public boolean setTag(java.lang.String);
- method public boolean start();
+ method @MainThread public boolean block(@Nullable String);
+ method @MainThread public boolean cancel();
+ method @MainThread public boolean complete();
+ method @MainThread public boolean fail(@Nullable String);
+ method @MainThread public int getAdvancedIntOption(String);
+ method @MainThread public String getAdvancedStringOption(String);
+ method @MainThread @NonNull public android.printservice.PrintDocument getDocument();
+ method @MainThread public android.print.PrintJobId getId();
+ method @MainThread @NonNull public android.print.PrintJobInfo getInfo();
+ method @MainThread @Nullable public String getTag();
+ method @MainThread public boolean hasAdvancedOption(String);
+ method @MainThread public boolean isBlocked();
+ method @MainThread public boolean isCancelled();
+ method @MainThread public boolean isCompleted();
+ method @MainThread public boolean isFailed();
+ method @MainThread public boolean isQueued();
+ method @MainThread public boolean isStarted();
+ method @MainThread public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method @MainThread public void setStatus(@Nullable CharSequence);
+ method @MainThread public void setStatus(@StringRes int);
+ method @MainThread public boolean setTag(@NonNull String);
+ method @MainThread public boolean start();
}
public abstract class PrintService extends android.app.Service {
ctor public PrintService();
method protected final void attachBaseContext(android.content.Context);
- method public final android.print.PrinterId generatePrinterId(java.lang.String);
+ method @NonNull public final android.print.PrinterId generatePrinterId(String);
method public final java.util.List<android.printservice.PrintJob> getActivePrintJobs();
method public final android.os.IBinder onBind(android.content.Intent);
method protected void onConnected();
- method protected abstract android.printservice.PrinterDiscoverySession onCreatePrinterDiscoverySession();
+ method @Nullable protected abstract android.printservice.PrinterDiscoverySession onCreatePrinterDiscoverySession();
method protected void onDisconnected();
method protected abstract void onPrintJobQueued(android.printservice.PrintJob);
method protected abstract void onRequestCancelPrintJob(android.printservice.PrintJob);
- field public static final java.lang.String EXTRA_CAN_SELECT_PRINTER = "android.printservice.extra.CAN_SELECT_PRINTER";
- field public static final java.lang.String EXTRA_PRINTER_INFO = "android.intent.extra.print.EXTRA_PRINTER_INFO";
- field public static final java.lang.String EXTRA_PRINT_DOCUMENT_INFO = "android.printservice.extra.PRINT_DOCUMENT_INFO";
- field public static final java.lang.String EXTRA_PRINT_JOB_INFO = "android.intent.extra.print.PRINT_JOB_INFO";
- field public static final java.lang.String EXTRA_SELECT_PRINTER = "android.printservice.extra.SELECT_PRINTER";
- field public static final java.lang.String SERVICE_INTERFACE = "android.printservice.PrintService";
- field public static final java.lang.String SERVICE_META_DATA = "android.printservice";
+ field public static final String EXTRA_CAN_SELECT_PRINTER = "android.printservice.extra.CAN_SELECT_PRINTER";
+ field public static final String EXTRA_PRINTER_INFO = "android.intent.extra.print.EXTRA_PRINTER_INFO";
+ field public static final String EXTRA_PRINT_DOCUMENT_INFO = "android.printservice.extra.PRINT_DOCUMENT_INFO";
+ field public static final String EXTRA_PRINT_JOB_INFO = "android.intent.extra.print.PRINT_JOB_INFO";
+ field public static final String EXTRA_SELECT_PRINTER = "android.printservice.extra.SELECT_PRINTER";
+ field public static final String SERVICE_INTERFACE = "android.printservice.PrintService";
+ field public static final String SERVICE_META_DATA = "android.printservice";
}
public abstract class PrinterDiscoverySession {
ctor public PrinterDiscoverySession();
- method public final void addPrinters(java.util.List<android.print.PrinterInfo>);
- method public final java.util.List<android.print.PrinterInfo> getPrinters();
- method public final java.util.List<android.print.PrinterId> getTrackedPrinters();
+ method public final void addPrinters(@NonNull java.util.List<android.print.PrinterInfo>);
+ method @NonNull public final java.util.List<android.print.PrinterInfo> getPrinters();
+ method @NonNull public final java.util.List<android.print.PrinterId> getTrackedPrinters();
method public final boolean isDestroyed();
method public final boolean isPrinterDiscoveryStarted();
method public abstract void onDestroy();
- method public void onRequestCustomPrinterIcon(android.print.PrinterId, android.os.CancellationSignal, android.printservice.CustomPrinterIconCallback);
- method public abstract void onStartPrinterDiscovery(java.util.List<android.print.PrinterId>);
- method public abstract void onStartPrinterStateTracking(android.print.PrinterId);
+ method public void onRequestCustomPrinterIcon(@NonNull android.print.PrinterId, @NonNull android.os.CancellationSignal, @NonNull android.printservice.CustomPrinterIconCallback);
+ method public abstract void onStartPrinterDiscovery(@NonNull java.util.List<android.print.PrinterId>);
+ method public abstract void onStartPrinterStateTracking(@NonNull android.print.PrinterId);
method public abstract void onStopPrinterDiscovery();
- method public abstract void onStopPrinterStateTracking(android.print.PrinterId);
- method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>);
- method public final void removePrinters(java.util.List<android.print.PrinterId>);
+ method public abstract void onStopPrinterStateTracking(@NonNull android.print.PrinterId);
+ method public abstract void onValidatePrinters(@NonNull java.util.List<android.print.PrinterId>);
+ method public final void removePrinters(@NonNull java.util.List<android.print.PrinterId>);
}
}
@@ -36087,97 +36351,97 @@ package android.provider {
public final class AlarmClock {
ctor public AlarmClock();
- field public static final java.lang.String ACTION_DISMISS_ALARM = "android.intent.action.DISMISS_ALARM";
- field public static final java.lang.String ACTION_DISMISS_TIMER = "android.intent.action.DISMISS_TIMER";
- field public static final java.lang.String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
- field public static final java.lang.String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
- field public static final java.lang.String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
- field public static final java.lang.String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
- field public static final java.lang.String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
- field public static final java.lang.String ALARM_SEARCH_MODE_ALL = "android.all";
- field public static final java.lang.String ALARM_SEARCH_MODE_LABEL = "android.label";
- field public static final java.lang.String ALARM_SEARCH_MODE_NEXT = "android.next";
- field public static final java.lang.String ALARM_SEARCH_MODE_TIME = "android.time";
- field public static final java.lang.String EXTRA_ALARM_SEARCH_MODE = "android.intent.extra.alarm.SEARCH_MODE";
- field public static final java.lang.String EXTRA_ALARM_SNOOZE_DURATION = "android.intent.extra.alarm.SNOOZE_DURATION";
- field public static final java.lang.String EXTRA_DAYS = "android.intent.extra.alarm.DAYS";
- field public static final java.lang.String EXTRA_HOUR = "android.intent.extra.alarm.HOUR";
- field public static final java.lang.String EXTRA_IS_PM = "android.intent.extra.alarm.IS_PM";
- field public static final java.lang.String EXTRA_LENGTH = "android.intent.extra.alarm.LENGTH";
- field public static final java.lang.String EXTRA_MESSAGE = "android.intent.extra.alarm.MESSAGE";
- field public static final java.lang.String EXTRA_MINUTES = "android.intent.extra.alarm.MINUTES";
- field public static final java.lang.String EXTRA_RINGTONE = "android.intent.extra.alarm.RINGTONE";
- field public static final java.lang.String EXTRA_SKIP_UI = "android.intent.extra.alarm.SKIP_UI";
- field public static final java.lang.String EXTRA_VIBRATE = "android.intent.extra.alarm.VIBRATE";
- field public static final java.lang.String VALUE_RINGTONE_SILENT = "silent";
- }
-
- public abstract interface BaseColumns {
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
+ field public static final String ACTION_DISMISS_ALARM = "android.intent.action.DISMISS_ALARM";
+ field public static final String ACTION_DISMISS_TIMER = "android.intent.action.DISMISS_TIMER";
+ field public static final String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
+ field public static final String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
+ field public static final String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
+ field public static final String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
+ field public static final String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
+ field public static final String ALARM_SEARCH_MODE_ALL = "android.all";
+ field public static final String ALARM_SEARCH_MODE_LABEL = "android.label";
+ field public static final String ALARM_SEARCH_MODE_NEXT = "android.next";
+ field public static final String ALARM_SEARCH_MODE_TIME = "android.time";
+ field public static final String EXTRA_ALARM_SEARCH_MODE = "android.intent.extra.alarm.SEARCH_MODE";
+ field public static final String EXTRA_ALARM_SNOOZE_DURATION = "android.intent.extra.alarm.SNOOZE_DURATION";
+ field public static final String EXTRA_DAYS = "android.intent.extra.alarm.DAYS";
+ field public static final String EXTRA_HOUR = "android.intent.extra.alarm.HOUR";
+ field public static final String EXTRA_IS_PM = "android.intent.extra.alarm.IS_PM";
+ field public static final String EXTRA_LENGTH = "android.intent.extra.alarm.LENGTH";
+ field public static final String EXTRA_MESSAGE = "android.intent.extra.alarm.MESSAGE";
+ field public static final String EXTRA_MINUTES = "android.intent.extra.alarm.MINUTES";
+ field public static final String EXTRA_RINGTONE = "android.intent.extra.alarm.RINGTONE";
+ field public static final String EXTRA_SKIP_UI = "android.intent.extra.alarm.SKIP_UI";
+ field public static final String EXTRA_VIBRATE = "android.intent.extra.alarm.VIBRATE";
+ field public static final String VALUE_RINGTONE_SILENT = "silent";
+ }
+
+ public interface BaseColumns {
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
}
public class BlockedNumberContract {
method public static boolean canCurrentUserBlockNumbers(android.content.Context);
- method public static boolean isBlocked(android.content.Context, java.lang.String);
- method public static int unblock(android.content.Context, java.lang.String);
- field public static final java.lang.String AUTHORITY = "com.android.blockednumber";
+ method @WorkerThread public static boolean isBlocked(android.content.Context, String);
+ method @WorkerThread public static int unblock(android.content.Context, String);
+ field public static final String AUTHORITY = "com.android.blockednumber";
field public static final android.net.Uri AUTHORITY_URI;
}
public static class BlockedNumberContract.BlockedNumbers {
- field public static final java.lang.String COLUMN_E164_NUMBER = "e164_number";
- field public static final java.lang.String COLUMN_ID = "_id";
- field public static final java.lang.String COLUMN_ORIGINAL_NUMBER = "original_number";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/blocked_number";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number";
+ field public static final String COLUMN_E164_NUMBER = "e164_number";
+ field public static final String COLUMN_ID = "_id";
+ field public static final String COLUMN_ORIGINAL_NUMBER = "original_number";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/blocked_number";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number";
field public static final android.net.Uri CONTENT_URI;
}
public class Browser {
ctor public Browser();
- method public static final void sendString(android.content.Context, java.lang.String);
- field public static final java.lang.String EXTRA_APPLICATION_ID = "com.android.browser.application_id";
- field public static final java.lang.String EXTRA_CREATE_NEW_TAB = "create_new_tab";
- field public static final java.lang.String EXTRA_HEADERS = "com.android.browser.headers";
- field public static final java.lang.String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel";
+ method public static final void sendString(android.content.Context, String);
+ field public static final String EXTRA_APPLICATION_ID = "com.android.browser.application_id";
+ field public static final String EXTRA_CREATE_NEW_TAB = "create_new_tab";
+ field public static final String EXTRA_HEADERS = "com.android.browser.headers";
+ field public static final String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel";
}
public final class CalendarContract {
- method public static boolean startViewCalendarEventInManagedProfile(android.content.Context, long, long, long, boolean, int);
- field public static final java.lang.String ACCOUNT_TYPE_LOCAL = "LOCAL";
- field public static final java.lang.String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
- field public static final java.lang.String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT";
- field public static final java.lang.String ACTION_VIEW_WORK_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
- field public static final java.lang.String AUTHORITY = "com.android.calendar";
- field public static final java.lang.String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
+ method public static boolean startViewCalendarEventInManagedProfile(@NonNull android.content.Context, long, long, long, boolean, int);
+ field public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
+ field public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
+ field public static final String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT";
+ field public static final String ACTION_VIEW_WORK_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
+ field public static final String AUTHORITY = "com.android.calendar";
+ field public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String EXTRA_CUSTOM_APP_URI = "customAppUri";
- field public static final java.lang.String EXTRA_EVENT_ALL_DAY = "allDay";
- field public static final java.lang.String EXTRA_EVENT_BEGIN_TIME = "beginTime";
- field public static final java.lang.String EXTRA_EVENT_END_TIME = "endTime";
- field public static final java.lang.String EXTRA_EVENT_ID = "id";
+ field public static final String EXTRA_CUSTOM_APP_URI = "customAppUri";
+ field public static final String EXTRA_EVENT_ALL_DAY = "allDay";
+ field public static final String EXTRA_EVENT_BEGIN_TIME = "beginTime";
+ field public static final String EXTRA_EVENT_END_TIME = "endTime";
+ field public static final String EXTRA_EVENT_ID = "id";
}
public static final class CalendarContract.Attendees implements android.provider.BaseColumns android.provider.CalendarContract.AttendeesColumns android.provider.CalendarContract.EventsColumns {
- method public static android.database.Cursor query(android.content.ContentResolver, long, java.lang.String[]);
+ method public static android.database.Cursor query(android.content.ContentResolver, long, String[]);
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.AttendeesColumns {
- field public static final java.lang.String ATTENDEE_EMAIL = "attendeeEmail";
- field public static final java.lang.String ATTENDEE_IDENTITY = "attendeeIdentity";
- field public static final java.lang.String ATTENDEE_ID_NAMESPACE = "attendeeIdNamespace";
- field public static final java.lang.String ATTENDEE_NAME = "attendeeName";
- field public static final java.lang.String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
- field public static final java.lang.String ATTENDEE_STATUS = "attendeeStatus";
+ protected static interface CalendarContract.AttendeesColumns {
+ field public static final String ATTENDEE_EMAIL = "attendeeEmail";
+ field public static final String ATTENDEE_IDENTITY = "attendeeIdentity";
+ field public static final String ATTENDEE_ID_NAMESPACE = "attendeeIdNamespace";
+ field public static final String ATTENDEE_NAME = "attendeeName";
+ field public static final String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
+ field public static final String ATTENDEE_STATUS = "attendeeStatus";
field public static final int ATTENDEE_STATUS_ACCEPTED = 1; // 0x1
field public static final int ATTENDEE_STATUS_DECLINED = 2; // 0x2
field public static final int ATTENDEE_STATUS_INVITED = 3; // 0x3
field public static final int ATTENDEE_STATUS_NONE = 0; // 0x0
field public static final int ATTENDEE_STATUS_TENTATIVE = 4; // 0x4
- field public static final java.lang.String ATTENDEE_TYPE = "attendeeType";
- field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final String ATTENDEE_TYPE = "attendeeType";
+ field public static final String EVENT_ID = "event_id";
field public static final int RELATIONSHIP_ATTENDEE = 1; // 0x1
field public static final int RELATIONSHIP_NONE = 0; // 0x0
field public static final int RELATIONSHIP_ORGANIZER = 2; // 0x2
@@ -36194,45 +36458,45 @@ package android.provider {
field public static final android.net.Uri CONTENT_URI_BY_INSTANCE;
}
- protected static abstract interface CalendarContract.CalendarAlertsColumns {
- field public static final java.lang.String ALARM_TIME = "alarmTime";
- field public static final java.lang.String BEGIN = "begin";
- field public static final java.lang.String CREATION_TIME = "creationTime";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
- field public static final java.lang.String END = "end";
- field public static final java.lang.String EVENT_ID = "event_id";
- field public static final java.lang.String MINUTES = "minutes";
- field public static final java.lang.String NOTIFY_TIME = "notifyTime";
- field public static final java.lang.String RECEIVED_TIME = "receivedTime";
- field public static final java.lang.String STATE = "state";
+ protected static interface CalendarContract.CalendarAlertsColumns {
+ field public static final String ALARM_TIME = "alarmTime";
+ field public static final String BEGIN = "begin";
+ field public static final String CREATION_TIME = "creationTime";
+ field public static final String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
+ field public static final String END = "end";
+ field public static final String EVENT_ID = "event_id";
+ field public static final String MINUTES = "minutes";
+ field public static final String NOTIFY_TIME = "notifyTime";
+ field public static final String RECEIVED_TIME = "receivedTime";
+ field public static final String STATE = "state";
field public static final int STATE_DISMISSED = 2; // 0x2
field public static final int STATE_FIRED = 1; // 0x1
field public static final int STATE_SCHEDULED = 0; // 0x0
}
public static final class CalendarContract.CalendarCache implements android.provider.CalendarContract.CalendarCacheColumns {
- field public static final java.lang.String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
- field public static final java.lang.String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
- field public static final java.lang.String KEY_TIMEZONE_TYPE = "timezoneType";
- field public static final java.lang.String TIMEZONE_TYPE_AUTO = "auto";
- field public static final java.lang.String TIMEZONE_TYPE_HOME = "home";
+ field public static final String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
+ field public static final String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
+ field public static final String KEY_TIMEZONE_TYPE = "timezoneType";
+ field public static final String TIMEZONE_TYPE_AUTO = "auto";
+ field public static final String TIMEZONE_TYPE_HOME = "home";
field public static final android.net.Uri URI;
}
- protected static abstract interface CalendarContract.CalendarCacheColumns {
- field public static final java.lang.String KEY = "key";
- field public static final java.lang.String VALUE = "value";
+ protected static interface CalendarContract.CalendarCacheColumns {
+ field public static final String KEY = "key";
+ field public static final String VALUE = "value";
}
- protected static abstract interface CalendarContract.CalendarColumns {
- field public static final java.lang.String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes";
- field public static final java.lang.String ALLOWED_AVAILABILITY = "allowedAvailability";
- field public static final java.lang.String ALLOWED_REMINDERS = "allowedReminders";
- field public static final java.lang.String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
- field public static final java.lang.String CALENDAR_COLOR = "calendar_color";
- field public static final java.lang.String CALENDAR_COLOR_KEY = "calendar_color_index";
- field public static final java.lang.String CALENDAR_DISPLAY_NAME = "calendar_displayName";
- field public static final java.lang.String CALENDAR_TIME_ZONE = "calendar_timezone";
+ protected static interface CalendarContract.CalendarColumns {
+ field public static final String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes";
+ field public static final String ALLOWED_AVAILABILITY = "allowedAvailability";
+ field public static final String ALLOWED_REMINDERS = "allowedReminders";
+ field public static final String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
+ field public static final String CALENDAR_COLOR = "calendar_color";
+ field public static final String CALENDAR_COLOR_KEY = "calendar_color_index";
+ field public static final String CALENDAR_DISPLAY_NAME = "calendar_displayName";
+ field public static final String CALENDAR_TIME_ZONE = "calendar_timezone";
field public static final int CAL_ACCESS_CONTRIBUTOR = 500; // 0x1f4
field public static final int CAL_ACCESS_EDITOR = 600; // 0x258
field public static final int CAL_ACCESS_FREEBUSY = 100; // 0x64
@@ -36242,13 +36506,13 @@ package android.provider {
field public static final int CAL_ACCESS_READ = 200; // 0xc8
field public static final int CAL_ACCESS_RESPOND = 300; // 0x12c
field public static final int CAL_ACCESS_ROOT = 800; // 0x320
- field public static final java.lang.String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
- field public static final java.lang.String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
- field public static final java.lang.String IS_PRIMARY = "isPrimary";
- field public static final java.lang.String MAX_REMINDERS = "maxReminders";
- field public static final java.lang.String OWNER_ACCOUNT = "ownerAccount";
- field public static final java.lang.String SYNC_EVENTS = "sync_events";
- field public static final java.lang.String VISIBLE = "visible";
+ field public static final String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
+ field public static final String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
+ field public static final String IS_PRIMARY = "isPrimary";
+ field public static final String MAX_REMINDERS = "maxReminders";
+ field public static final String OWNER_ACCOUNT = "ownerAccount";
+ field public static final String SYNC_EVENTS = "sync_events";
+ field public static final String VISIBLE = "visible";
}
public static final class CalendarContract.CalendarEntity implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.SyncColumns {
@@ -36256,47 +36520,47 @@ package android.provider {
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.CalendarSyncColumns {
- field public static final java.lang.String CAL_SYNC1 = "cal_sync1";
- field public static final java.lang.String CAL_SYNC10 = "cal_sync10";
- field public static final java.lang.String CAL_SYNC2 = "cal_sync2";
- field public static final java.lang.String CAL_SYNC3 = "cal_sync3";
- field public static final java.lang.String CAL_SYNC4 = "cal_sync4";
- field public static final java.lang.String CAL_SYNC5 = "cal_sync5";
- field public static final java.lang.String CAL_SYNC6 = "cal_sync6";
- field public static final java.lang.String CAL_SYNC7 = "cal_sync7";
- field public static final java.lang.String CAL_SYNC8 = "cal_sync8";
- field public static final java.lang.String CAL_SYNC9 = "cal_sync9";
+ protected static interface CalendarContract.CalendarSyncColumns {
+ field public static final String CAL_SYNC1 = "cal_sync1";
+ field public static final String CAL_SYNC10 = "cal_sync10";
+ field public static final String CAL_SYNC2 = "cal_sync2";
+ field public static final String CAL_SYNC3 = "cal_sync3";
+ field public static final String CAL_SYNC4 = "cal_sync4";
+ field public static final String CAL_SYNC5 = "cal_sync5";
+ field public static final String CAL_SYNC6 = "cal_sync6";
+ field public static final String CAL_SYNC7 = "cal_sync7";
+ field public static final String CAL_SYNC8 = "cal_sync8";
+ field public static final String CAL_SYNC9 = "cal_sync9";
}
public static final class CalendarContract.Calendars implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.SyncColumns {
- field public static final java.lang.String CALENDAR_LOCATION = "calendar_location";
+ field public static final String CALENDAR_LOCATION = "calendar_location";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "calendar_displayName";
+ field public static final String DEFAULT_SORT_ORDER = "calendar_displayName";
field public static final android.net.Uri ENTERPRISE_CONTENT_URI;
- field public static final java.lang.String NAME = "name";
+ field public static final String NAME = "name";
}
public static final class CalendarContract.Colors implements android.provider.CalendarContract.ColorsColumns {
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.ColorsColumns implements android.provider.SyncStateContract.Columns {
- field public static final java.lang.String COLOR = "color";
- field public static final java.lang.String COLOR_KEY = "color_index";
- field public static final java.lang.String COLOR_TYPE = "color_type";
+ protected static interface CalendarContract.ColorsColumns extends android.provider.SyncStateContract.Columns {
+ field public static final String COLOR = "color";
+ field public static final String COLOR_KEY = "color_index";
+ field public static final String COLOR_TYPE = "color_type";
field public static final int TYPE_CALENDAR = 0; // 0x0
field public static final int TYPE_EVENT = 1; // 0x1
}
public static final class CalendarContract.EventDays implements android.provider.CalendarContract.EventDaysColumns {
- method public static android.database.Cursor query(android.content.ContentResolver, int, int, java.lang.String[]);
+ method public static android.database.Cursor query(android.content.ContentResolver, int, int, String[]);
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.EventDaysColumns {
- field public static final java.lang.String ENDDAY = "endDay";
- field public static final java.lang.String STARTDAY = "startDay";
+ protected static interface CalendarContract.EventDaysColumns {
+ field public static final String ENDDAY = "endDay";
+ field public static final String STARTDAY = "startDay";
}
public static final class CalendarContract.Events implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.SyncColumns {
@@ -36305,66 +36569,66 @@ package android.provider {
field public static final android.net.Uri ENTERPRISE_CONTENT_URI;
}
- protected static abstract interface CalendarContract.EventsColumns {
+ protected static interface CalendarContract.EventsColumns {
field public static final int ACCESS_CONFIDENTIAL = 1; // 0x1
field public static final int ACCESS_DEFAULT = 0; // 0x0
- field public static final java.lang.String ACCESS_LEVEL = "accessLevel";
+ field public static final String ACCESS_LEVEL = "accessLevel";
field public static final int ACCESS_PRIVATE = 2; // 0x2
field public static final int ACCESS_PUBLIC = 3; // 0x3
- field public static final java.lang.String ALL_DAY = "allDay";
- field public static final java.lang.String AVAILABILITY = "availability";
+ field public static final String ALL_DAY = "allDay";
+ field public static final String AVAILABILITY = "availability";
field public static final int AVAILABILITY_BUSY = 0; // 0x0
field public static final int AVAILABILITY_FREE = 1; // 0x1
field public static final int AVAILABILITY_TENTATIVE = 2; // 0x2
- field public static final java.lang.String CALENDAR_ID = "calendar_id";
- field public static final java.lang.String CAN_INVITE_OTHERS = "canInviteOthers";
- field public static final java.lang.String CUSTOM_APP_PACKAGE = "customAppPackage";
- field public static final java.lang.String CUSTOM_APP_URI = "customAppUri";
- field public static final java.lang.String DESCRIPTION = "description";
- field public static final java.lang.String DISPLAY_COLOR = "displayColor";
- field public static final java.lang.String DTEND = "dtend";
- field public static final java.lang.String DTSTART = "dtstart";
- field public static final java.lang.String DURATION = "duration";
- field public static final java.lang.String EVENT_COLOR = "eventColor";
- field public static final java.lang.String EVENT_COLOR_KEY = "eventColor_index";
- field public static final java.lang.String EVENT_END_TIMEZONE = "eventEndTimezone";
- field public static final java.lang.String EVENT_LOCATION = "eventLocation";
- field public static final java.lang.String EVENT_TIMEZONE = "eventTimezone";
- field public static final java.lang.String EXDATE = "exdate";
- field public static final java.lang.String EXRULE = "exrule";
- field public static final java.lang.String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
- field public static final java.lang.String GUESTS_CAN_MODIFY = "guestsCanModify";
- field public static final java.lang.String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
- field public static final java.lang.String HAS_ALARM = "hasAlarm";
- field public static final java.lang.String HAS_ATTENDEE_DATA = "hasAttendeeData";
- field public static final java.lang.String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
- field public static final java.lang.String IS_ORGANIZER = "isOrganizer";
- field public static final java.lang.String LAST_DATE = "lastDate";
- field public static final java.lang.String LAST_SYNCED = "lastSynced";
- field public static final java.lang.String ORGANIZER = "organizer";
- field public static final java.lang.String ORIGINAL_ALL_DAY = "originalAllDay";
- field public static final java.lang.String ORIGINAL_ID = "original_id";
- field public static final java.lang.String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
- field public static final java.lang.String ORIGINAL_SYNC_ID = "original_sync_id";
- field public static final java.lang.String RDATE = "rdate";
- field public static final java.lang.String RRULE = "rrule";
- field public static final java.lang.String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
- field public static final java.lang.String STATUS = "eventStatus";
+ field public static final String CALENDAR_ID = "calendar_id";
+ field public static final String CAN_INVITE_OTHERS = "canInviteOthers";
+ field public static final String CUSTOM_APP_PACKAGE = "customAppPackage";
+ field public static final String CUSTOM_APP_URI = "customAppUri";
+ field public static final String DESCRIPTION = "description";
+ field public static final String DISPLAY_COLOR = "displayColor";
+ field public static final String DTEND = "dtend";
+ field public static final String DTSTART = "dtstart";
+ field public static final String DURATION = "duration";
+ field public static final String EVENT_COLOR = "eventColor";
+ field public static final String EVENT_COLOR_KEY = "eventColor_index";
+ field public static final String EVENT_END_TIMEZONE = "eventEndTimezone";
+ field public static final String EVENT_LOCATION = "eventLocation";
+ field public static final String EVENT_TIMEZONE = "eventTimezone";
+ field public static final String EXDATE = "exdate";
+ field public static final String EXRULE = "exrule";
+ field public static final String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
+ field public static final String GUESTS_CAN_MODIFY = "guestsCanModify";
+ field public static final String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
+ field public static final String HAS_ALARM = "hasAlarm";
+ field public static final String HAS_ATTENDEE_DATA = "hasAttendeeData";
+ field public static final String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
+ field public static final String IS_ORGANIZER = "isOrganizer";
+ field public static final String LAST_DATE = "lastDate";
+ field public static final String LAST_SYNCED = "lastSynced";
+ field public static final String ORGANIZER = "organizer";
+ field public static final String ORIGINAL_ALL_DAY = "originalAllDay";
+ field public static final String ORIGINAL_ID = "original_id";
+ field public static final String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
+ field public static final String ORIGINAL_SYNC_ID = "original_sync_id";
+ field public static final String RDATE = "rdate";
+ field public static final String RRULE = "rrule";
+ field public static final String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
+ field public static final String STATUS = "eventStatus";
field public static final int STATUS_CANCELED = 2; // 0x2
field public static final int STATUS_CONFIRMED = 1; // 0x1
field public static final int STATUS_TENTATIVE = 0; // 0x0
- field public static final java.lang.String SYNC_DATA1 = "sync_data1";
- field public static final java.lang.String SYNC_DATA10 = "sync_data10";
- field public static final java.lang.String SYNC_DATA2 = "sync_data2";
- field public static final java.lang.String SYNC_DATA3 = "sync_data3";
- field public static final java.lang.String SYNC_DATA4 = "sync_data4";
- field public static final java.lang.String SYNC_DATA5 = "sync_data5";
- field public static final java.lang.String SYNC_DATA6 = "sync_data6";
- field public static final java.lang.String SYNC_DATA7 = "sync_data7";
- field public static final java.lang.String SYNC_DATA8 = "sync_data8";
- field public static final java.lang.String SYNC_DATA9 = "sync_data9";
- field public static final java.lang.String TITLE = "title";
- field public static final java.lang.String UID_2445 = "uid2445";
+ field public static final String SYNC_DATA1 = "sync_data1";
+ field public static final String SYNC_DATA10 = "sync_data10";
+ field public static final String SYNC_DATA2 = "sync_data2";
+ field public static final String SYNC_DATA3 = "sync_data3";
+ field public static final String SYNC_DATA4 = "sync_data4";
+ field public static final String SYNC_DATA5 = "sync_data5";
+ field public static final String SYNC_DATA6 = "sync_data6";
+ field public static final String SYNC_DATA7 = "sync_data7";
+ field public static final String SYNC_DATA8 = "sync_data8";
+ field public static final String SYNC_DATA9 = "sync_data9";
+ field public static final String TITLE = "title";
+ field public static final String UID_2445 = "uid2445";
}
public static final class CalendarContract.EventsEntity implements android.provider.BaseColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.SyncColumns {
@@ -36377,57 +36641,57 @@ package android.provider {
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.ExtendedPropertiesColumns {
- field public static final java.lang.String EVENT_ID = "event_id";
- field public static final java.lang.String NAME = "name";
- field public static final java.lang.String VALUE = "value";
+ protected static interface CalendarContract.ExtendedPropertiesColumns {
+ field public static final String EVENT_ID = "event_id";
+ field public static final String NAME = "name";
+ field public static final String VALUE = "value";
}
public static final class CalendarContract.Instances implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns {
- method public static android.database.Cursor query(android.content.ContentResolver, java.lang.String[], long, long);
- method public static android.database.Cursor query(android.content.ContentResolver, java.lang.String[], long, long, java.lang.String);
- field public static final java.lang.String BEGIN = "begin";
+ method public static android.database.Cursor query(android.content.ContentResolver, String[], long, long);
+ method public static android.database.Cursor query(android.content.ContentResolver, String[], long, long, String);
+ field public static final String BEGIN = "begin";
field public static final android.net.Uri CONTENT_BY_DAY_URI;
field public static final android.net.Uri CONTENT_SEARCH_BY_DAY_URI;
field public static final android.net.Uri CONTENT_SEARCH_URI;
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String END = "end";
- field public static final java.lang.String END_DAY = "endDay";
- field public static final java.lang.String END_MINUTE = "endMinute";
+ field public static final String END = "end";
+ field public static final String END_DAY = "endDay";
+ field public static final String END_MINUTE = "endMinute";
field public static final android.net.Uri ENTERPRISE_CONTENT_BY_DAY_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_SEARCH_BY_DAY_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_SEARCH_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_URI;
- field public static final java.lang.String EVENT_ID = "event_id";
- field public static final java.lang.String START_DAY = "startDay";
- field public static final java.lang.String START_MINUTE = "startMinute";
+ field public static final String EVENT_ID = "event_id";
+ field public static final String START_DAY = "startDay";
+ field public static final String START_MINUTE = "startMinute";
}
public static final class CalendarContract.Reminders implements android.provider.BaseColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.RemindersColumns {
- method public static android.database.Cursor query(android.content.ContentResolver, long, java.lang.String[]);
+ method public static android.database.Cursor query(android.content.ContentResolver, long, String[]);
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface CalendarContract.RemindersColumns {
- field public static final java.lang.String EVENT_ID = "event_id";
- field public static final java.lang.String METHOD = "method";
+ protected static interface CalendarContract.RemindersColumns {
+ field public static final String EVENT_ID = "event_id";
+ field public static final String METHOD = "method";
field public static final int METHOD_ALARM = 4; // 0x4
field public static final int METHOD_ALERT = 1; // 0x1
field public static final int METHOD_DEFAULT = 0; // 0x0
field public static final int METHOD_EMAIL = 2; // 0x2
field public static final int METHOD_SMS = 3; // 0x3
- field public static final java.lang.String MINUTES = "minutes";
+ field public static final String MINUTES = "minutes";
field public static final int MINUTES_DEFAULT = -1; // 0xffffffff
}
- protected static abstract interface CalendarContract.SyncColumns implements android.provider.CalendarContract.CalendarSyncColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
- field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String DIRTY = "dirty";
- field public static final java.lang.String MUTATORS = "mutators";
- field public static final java.lang.String _SYNC_ID = "_sync_id";
+ protected static interface CalendarContract.SyncColumns extends android.provider.CalendarContract.CalendarSyncColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
+ field public static final String DELETED = "deleted";
+ field public static final String DIRTY = "dirty";
+ field public static final String MUTATORS = "mutators";
+ field public static final String _SYNC_ID = "_sync_id";
}
public static final class CalendarContract.SyncState implements android.provider.SyncStateContract.Columns {
@@ -36436,16 +36700,16 @@ package android.provider {
public class CallLog {
ctor public CallLog();
- field public static final java.lang.String AUTHORITY = "call_log";
+ field public static final String AUTHORITY = "call_log";
field public static final android.net.Uri CONTENT_URI;
}
public static class CallLog.Calls implements android.provider.BaseColumns {
ctor public CallLog.Calls();
- method public static java.lang.String getLastOutgoingCall(android.content.Context);
+ method public static String getLastOutgoingCall(android.content.Context);
field public static final int ANSWERED_EXTERNALLY_TYPE = 7; // 0x7
field public static final int BLOCKED_TYPE = 6; // 0x6
- field public static final java.lang.String BLOCK_REASON = "block_reason";
+ field public static final String BLOCK_REASON = "block_reason";
field public static final int BLOCK_REASON_BLOCKED_NUMBER = 3; // 0x3
field public static final int BLOCK_REASON_CALL_SCREENING_SERVICE = 1; // 0x1
field public static final int BLOCK_REASON_DIRECT_TO_VOICEMAIL = 2; // 0x2
@@ -36454,399 +36718,399 @@ package android.provider {
field public static final int BLOCK_REASON_PAY_PHONE = 6; // 0x6
field public static final int BLOCK_REASON_RESTRICTED_NUMBER = 5; // 0x5
field public static final int BLOCK_REASON_UNKNOWN_NUMBER = 4; // 0x4
- field public static final java.lang.String CACHED_FORMATTED_NUMBER = "formatted_number";
- field public static final java.lang.String CACHED_LOOKUP_URI = "lookup_uri";
- field public static final java.lang.String CACHED_MATCHED_NUMBER = "matched_number";
- field public static final java.lang.String CACHED_NAME = "name";
- field public static final java.lang.String CACHED_NORMALIZED_NUMBER = "normalized_number";
- field public static final java.lang.String CACHED_NUMBER_LABEL = "numberlabel";
- field public static final java.lang.String CACHED_NUMBER_TYPE = "numbertype";
- field public static final java.lang.String CACHED_PHOTO_ID = "photo_id";
- field public static final java.lang.String CACHED_PHOTO_URI = "photo_uri";
- field public static final java.lang.String CALL_ID_APP_NAME = "call_id_app_name";
- field public static final java.lang.String CALL_ID_DESCRIPTION = "call_id_description";
- field public static final java.lang.String CALL_ID_DETAILS = "call_id_details";
- field public static final java.lang.String CALL_ID_NAME = "call_id_name";
- field public static final java.lang.String CALL_ID_NUISANCE_CONFIDENCE = "call_id_nuisance_confidence";
- field public static final java.lang.String CALL_ID_PACKAGE_NAME = "call_id_package_name";
- field public static final java.lang.String CALL_SCREENING_APP_NAME = "call_screening_app_name";
- field public static final java.lang.String CALL_SCREENING_COMPONENT_NAME = "call_screening_component_name";
+ field public static final String CACHED_FORMATTED_NUMBER = "formatted_number";
+ field public static final String CACHED_LOOKUP_URI = "lookup_uri";
+ field public static final String CACHED_MATCHED_NUMBER = "matched_number";
+ field public static final String CACHED_NAME = "name";
+ field public static final String CACHED_NORMALIZED_NUMBER = "normalized_number";
+ field public static final String CACHED_NUMBER_LABEL = "numberlabel";
+ field public static final String CACHED_NUMBER_TYPE = "numbertype";
+ field public static final String CACHED_PHOTO_ID = "photo_id";
+ field public static final String CACHED_PHOTO_URI = "photo_uri";
+ field public static final String CALL_ID_APP_NAME = "call_id_app_name";
+ field public static final String CALL_ID_DESCRIPTION = "call_id_description";
+ field public static final String CALL_ID_DETAILS = "call_id_details";
+ field public static final String CALL_ID_NAME = "call_id_name";
+ field public static final String CALL_ID_NUISANCE_CONFIDENCE = "call_id_nuisance_confidence";
+ field public static final String CALL_ID_PACKAGE_NAME = "call_id_package_name";
+ field public static final String CALL_SCREENING_APP_NAME = "call_screening_app_name";
+ field public static final String CALL_SCREENING_COMPONENT_NAME = "call_screening_component_name";
field public static final android.net.Uri CONTENT_FILTER_URI;
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
field public static final android.net.Uri CONTENT_URI;
field public static final android.net.Uri CONTENT_URI_WITH_VOICEMAIL;
- field public static final java.lang.String COUNTRY_ISO = "countryiso";
- field public static final java.lang.String DATA_USAGE = "data_usage";
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
- field public static final java.lang.String DURATION = "duration";
- field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER";
- field public static final java.lang.String FEATURES = "features";
+ field public static final String COUNTRY_ISO = "countryiso";
+ field public static final String DATA_USAGE = "data_usage";
+ field public static final String DATE = "date";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DURATION = "duration";
+ field public static final String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER";
+ field public static final String FEATURES = "features";
field public static final int FEATURES_HD_CALL = 4; // 0x4
field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2
field public static final int FEATURES_RTT = 32; // 0x20
field public static final int FEATURES_VIDEO = 1; // 0x1
field public static final int FEATURES_WIFI = 8; // 0x8
- field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location";
+ field public static final String GEOCODED_LOCATION = "geocoded_location";
field public static final int INCOMING_TYPE = 1; // 0x1
- field public static final java.lang.String IS_READ = "is_read";
- field public static final java.lang.String LAST_MODIFIED = "last_modified";
- field public static final java.lang.String LIMIT_PARAM_KEY = "limit";
+ field public static final String IS_READ = "is_read";
+ field public static final String LAST_MODIFIED = "last_modified";
+ field public static final String LIMIT_PARAM_KEY = "limit";
field public static final int MISSED_TYPE = 3; // 0x3
- field public static final java.lang.String NEW = "new";
- field public static final java.lang.String NUMBER = "number";
- field public static final java.lang.String NUMBER_PRESENTATION = "presentation";
- field public static final java.lang.String OFFSET_PARAM_KEY = "offset";
+ field public static final String NEW = "new";
+ field public static final String NUMBER = "number";
+ field public static final String NUMBER_PRESENTATION = "presentation";
+ field public static final String OFFSET_PARAM_KEY = "offset";
field public static final int OUTGOING_TYPE = 2; // 0x2
- field public static final java.lang.String PHONE_ACCOUNT_COMPONENT_NAME = "subscription_component_name";
- field public static final java.lang.String PHONE_ACCOUNT_ID = "subscription_id";
- field public static final java.lang.String POST_DIAL_DIGITS = "post_dial_digits";
+ field public static final String PHONE_ACCOUNT_COMPONENT_NAME = "subscription_component_name";
+ field public static final String PHONE_ACCOUNT_ID = "subscription_id";
+ field public static final String POST_DIAL_DIGITS = "post_dial_digits";
field public static final int PRESENTATION_ALLOWED = 1; // 0x1
field public static final int PRESENTATION_PAYPHONE = 4; // 0x4
field public static final int PRESENTATION_RESTRICTED = 2; // 0x2
field public static final int PRESENTATION_UNKNOWN = 3; // 0x3
field public static final int REJECTED_TYPE = 5; // 0x5
- field public static final java.lang.String TRANSCRIPTION = "transcription";
- field public static final java.lang.String TYPE = "type";
- field public static final java.lang.String VIA_NUMBER = "via_number";
+ field public static final String TRANSCRIPTION = "transcription";
+ field public static final String TYPE = "type";
+ field public static final String VIA_NUMBER = "via_number";
field public static final int VOICEMAIL_TYPE = 4; // 0x4
- field public static final java.lang.String VOICEMAIL_URI = "voicemail_uri";
- }
-
- public deprecated class Contacts {
- field public static final deprecated java.lang.String AUTHORITY = "contacts";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated int KIND_EMAIL = 1; // 0x1
- field public static final deprecated int KIND_IM = 3; // 0x3
- field public static final deprecated int KIND_ORGANIZATION = 4; // 0x4
- field public static final deprecated int KIND_PHONE = 5; // 0x5
- field public static final deprecated int KIND_POSTAL = 2; // 0x2
- }
-
- public static final deprecated class Contacts.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
- method public deprecated void addPostalLocation(android.content.Context, long, double, double);
- method public static deprecated java.lang.Object decodeImProtocol(java.lang.String);
- method public static deprecated java.lang.String encodeCustomImProtocol(java.lang.String);
- method public static deprecated java.lang.String encodePredefinedImProtocol(int);
- method public static deprecated java.lang.CharSequence getDisplayLabel(android.content.Context, int, int, java.lang.CharSequence);
- field public static final deprecated java.lang.String CONTENT_EMAIL_ITEM_TYPE = "vnd.android.cursor.item/email";
- field public static final deprecated java.lang.String CONTENT_EMAIL_TYPE = "vnd.android.cursor.dir/email";
- field public static final deprecated android.net.Uri CONTENT_EMAIL_URI;
- field public static final deprecated java.lang.String CONTENT_IM_ITEM_TYPE = "vnd.android.cursor.item/jabber-im";
- field public static final deprecated java.lang.String CONTENT_POSTAL_ITEM_TYPE = "vnd.android.cursor.item/postal-address";
- field public static final deprecated java.lang.String CONTENT_POSTAL_TYPE = "vnd.android.cursor.dir/postal-address";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact-methods";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- field public static final deprecated java.lang.String POSTAL_LOCATION_LATITUDE = "data";
- field public static final deprecated java.lang.String POSTAL_LOCATION_LONGITUDE = "aux_data";
- field public static final deprecated int PROTOCOL_AIM = 0; // 0x0
- field public static final deprecated int PROTOCOL_GOOGLE_TALK = 5; // 0x5
- field public static final deprecated int PROTOCOL_ICQ = 6; // 0x6
- field public static final deprecated int PROTOCOL_JABBER = 7; // 0x7
- field public static final deprecated int PROTOCOL_MSN = 1; // 0x1
- field public static final deprecated int PROTOCOL_QQ = 4; // 0x4
- field public static final deprecated int PROTOCOL_SKYPE = 3; // 0x3
- field public static final deprecated int PROTOCOL_YAHOO = 2; // 0x2
- }
-
- public static abstract deprecated interface Contacts.ContactMethodsColumns {
- field public static final deprecated java.lang.String AUX_DATA = "aux_data";
- field public static final deprecated java.lang.String DATA = "data";
- field public static final deprecated java.lang.String ISPRIMARY = "isprimary";
- field public static final deprecated java.lang.String KIND = "kind";
- field public static final deprecated java.lang.String LABEL = "label";
- field public static final deprecated java.lang.String TYPE = "type";
- field public static final deprecated int TYPE_CUSTOM = 0; // 0x0
- field public static final deprecated int TYPE_HOME = 1; // 0x1
- field public static final deprecated int TYPE_OTHER = 3; // 0x3
- field public static final deprecated int TYPE_WORK = 2; // 0x2
- }
-
- public static final deprecated class Contacts.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_extensions";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact_extensions";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "person, name ASC";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- }
-
- public static abstract deprecated interface Contacts.ExtensionsColumns {
- field public static final deprecated java.lang.String NAME = "name";
- field public static final deprecated java.lang.String VALUE = "value";
- }
-
- public static final deprecated class Contacts.GroupMembership implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "groupmembership";
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroupmembership";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroupmembership";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "group_id ASC";
- field public static final deprecated java.lang.String GROUP_ID = "group_id";
- field public static final deprecated java.lang.String GROUP_SYNC_ACCOUNT = "group_sync_account";
- field public static final deprecated java.lang.String GROUP_SYNC_ACCOUNT_TYPE = "group_sync_account_type";
- field public static final deprecated java.lang.String GROUP_SYNC_ID = "group_sync_id";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- field public static final deprecated android.net.Uri RAW_CONTENT_URI;
- }
-
- public static final deprecated class Contacts.Groups implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroup";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroup";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated android.net.Uri DELETED_CONTENT_URI;
- field public static final deprecated java.lang.String GROUP_ANDROID_STARRED = "Starred in Android";
- field public static final deprecated java.lang.String GROUP_MY_CONTACTS = "Contacts";
- }
-
- public static abstract deprecated interface Contacts.GroupsColumns {
- field public static final deprecated java.lang.String NAME = "name";
- field public static final deprecated java.lang.String NOTES = "notes";
- field public static final deprecated java.lang.String SHOULD_SYNC = "should_sync";
- field public static final deprecated java.lang.String SYSTEM_ID = "system_id";
- }
-
- public static final deprecated class Contacts.Intents {
- ctor public deprecated Contacts.Intents();
- field public static final deprecated java.lang.String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
- field public static final deprecated java.lang.String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
- field public static final deprecated java.lang.String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
- field public static final deprecated java.lang.String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
- field public static final deprecated java.lang.String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
- field public static final deprecated java.lang.String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
- field public static final deprecated java.lang.String SHOW_OR_CREATE_CONTACT = "com.android.contacts.action.SHOW_OR_CREATE_CONTACT";
- }
-
- public static final deprecated class Contacts.Intents.Insert {
- ctor public deprecated Contacts.Intents.Insert();
- field public static final deprecated java.lang.String ACTION = "android.intent.action.INSERT";
- field public static final deprecated java.lang.String COMPANY = "company";
- field public static final deprecated java.lang.String EMAIL = "email";
- field public static final deprecated java.lang.String EMAIL_ISPRIMARY = "email_isprimary";
- field public static final deprecated java.lang.String EMAIL_TYPE = "email_type";
- field public static final deprecated java.lang.String FULL_MODE = "full_mode";
- field public static final deprecated java.lang.String IM_HANDLE = "im_handle";
- field public static final deprecated java.lang.String IM_ISPRIMARY = "im_isprimary";
- field public static final deprecated java.lang.String IM_PROTOCOL = "im_protocol";
- field public static final deprecated java.lang.String JOB_TITLE = "job_title";
- field public static final deprecated java.lang.String NAME = "name";
- field public static final deprecated java.lang.String NOTES = "notes";
- field public static final deprecated java.lang.String PHONE = "phone";
- field public static final deprecated java.lang.String PHONETIC_NAME = "phonetic_name";
- field public static final deprecated java.lang.String PHONE_ISPRIMARY = "phone_isprimary";
- field public static final deprecated java.lang.String PHONE_TYPE = "phone_type";
- field public static final deprecated java.lang.String POSTAL = "postal";
- field public static final deprecated java.lang.String POSTAL_ISPRIMARY = "postal_isprimary";
- field public static final deprecated java.lang.String POSTAL_TYPE = "postal_type";
- field public static final deprecated java.lang.String SECONDARY_EMAIL = "secondary_email";
- field public static final deprecated java.lang.String SECONDARY_EMAIL_TYPE = "secondary_email_type";
- field public static final deprecated java.lang.String SECONDARY_PHONE = "secondary_phone";
- field public static final deprecated java.lang.String SECONDARY_PHONE_TYPE = "secondary_phone_type";
- field public static final deprecated java.lang.String TERTIARY_EMAIL = "tertiary_email";
- field public static final deprecated java.lang.String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
- field public static final deprecated java.lang.String TERTIARY_PHONE = "tertiary_phone";
- field public static final deprecated java.lang.String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
- }
-
- public static final deprecated class Contacts.Intents.UI {
- ctor public deprecated Contacts.Intents.UI();
- field public static final deprecated java.lang.String FILTER_CONTACTS_ACTION = "com.android.contacts.action.FILTER_CONTACTS";
- field public static final deprecated java.lang.String FILTER_TEXT_EXTRA_KEY = "com.android.contacts.extra.FILTER_TEXT";
- field public static final deprecated java.lang.String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP";
- field public static final deprecated java.lang.String LIST_ALL_CONTACTS_ACTION = "com.android.contacts.action.LIST_ALL_CONTACTS";
- field public static final deprecated java.lang.String LIST_CONTACTS_WITH_PHONES_ACTION = "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
- field public static final deprecated java.lang.String LIST_DEFAULT = "com.android.contacts.action.LIST_DEFAULT";
- field public static final deprecated java.lang.String LIST_FREQUENT_ACTION = "com.android.contacts.action.LIST_FREQUENT";
- field public static final deprecated java.lang.String LIST_GROUP_ACTION = "com.android.contacts.action.LIST_GROUP";
- field public static final deprecated java.lang.String LIST_STARRED_ACTION = "com.android.contacts.action.LIST_STARRED";
- field public static final deprecated java.lang.String LIST_STREQUENT_ACTION = "com.android.contacts.action.LIST_STREQUENT";
- field public static final deprecated java.lang.String TITLE_EXTRA_KEY = "com.android.contacts.extra.TITLE_EXTRA";
- }
-
- public static abstract deprecated interface Contacts.OrganizationColumns {
- field public static final deprecated java.lang.String COMPANY = "company";
- field public static final deprecated java.lang.String ISPRIMARY = "isprimary";
- field public static final deprecated java.lang.String LABEL = "label";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- field public static final deprecated java.lang.String TITLE = "title";
- field public static final deprecated java.lang.String TYPE = "type";
- field public static final deprecated int TYPE_CUSTOM = 0; // 0x0
- field public static final deprecated int TYPE_OTHER = 2; // 0x2
- field public static final deprecated int TYPE_WORK = 1; // 0x1
- }
-
- public static final deprecated class Contacts.Organizations implements android.provider.BaseColumns android.provider.Contacts.OrganizationColumns {
- method public static deprecated java.lang.CharSequence getDisplayLabel(android.content.Context, int, java.lang.CharSequence);
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "organizations";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "company, title, isprimary ASC";
- }
-
- public static final deprecated class Contacts.People implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns android.provider.Contacts.PresenceColumns {
- method public static deprecated android.net.Uri addToGroup(android.content.ContentResolver, long, java.lang.String);
- method public static deprecated android.net.Uri addToGroup(android.content.ContentResolver, long, long);
- method public static deprecated android.net.Uri addToMyContactsGroup(android.content.ContentResolver, long);
- method public static deprecated android.net.Uri createPersonInMyContactsGroup(android.content.ContentResolver, android.content.ContentValues);
- method public static deprecated android.graphics.Bitmap loadContactPhoto(android.content.Context, android.net.Uri, int, android.graphics.BitmapFactory.Options);
- method public static deprecated void markAsContacted(android.content.ContentResolver, long);
- method public static deprecated java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
- method public static deprecated android.database.Cursor queryGroups(android.content.ContentResolver, long);
- method public static deprecated void setPhotoData(android.content.ContentResolver, android.net.Uri, byte[]);
- field public static final deprecated android.net.Uri CONTENT_FILTER_URI;
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/person";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/person";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated android.net.Uri DELETED_CONTENT_URI;
- field public static final deprecated java.lang.String PRIMARY_EMAIL_ID = "primary_email";
- field public static final deprecated java.lang.String PRIMARY_ORGANIZATION_ID = "primary_organization";
- field public static final deprecated java.lang.String PRIMARY_PHONE_ID = "primary_phone";
- }
-
- public static final deprecated class Contacts.People.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "contact_methods";
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "data ASC";
- }
-
- public static deprecated class Contacts.People.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "extensions";
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- }
-
- public static final deprecated class Contacts.People.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "phones";
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "number ASC";
- }
-
- public static abstract deprecated interface Contacts.PeopleColumns {
- field public static final deprecated java.lang.String CUSTOM_RINGTONE = "custom_ringtone";
- field public static final deprecated java.lang.String DISPLAY_NAME = "display_name";
- field public static final deprecated java.lang.String LAST_TIME_CONTACTED = "last_time_contacted";
- field public static final deprecated java.lang.String NAME = "name";
- field public static final deprecated java.lang.String NOTES = "notes";
- field public static final deprecated java.lang.String PHONETIC_NAME = "phonetic_name";
- field public static final deprecated java.lang.String PHOTO_VERSION = "photo_version";
- field public static final deprecated java.lang.String SEND_TO_VOICEMAIL = "send_to_voicemail";
- field public static final deprecated java.lang.String STARRED = "starred";
- field public static final deprecated java.lang.String TIMES_CONTACTED = "times_contacted";
- }
-
- public static final deprecated class Contacts.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
- method public static deprecated java.lang.CharSequence getDisplayLabel(android.content.Context, int, java.lang.CharSequence, java.lang.CharSequence[]);
- method public static deprecated java.lang.CharSequence getDisplayLabel(android.content.Context, int, java.lang.CharSequence);
- field public static final deprecated android.net.Uri CONTENT_FILTER_URL;
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/phone";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- }
-
- public static abstract deprecated interface Contacts.PhonesColumns {
- field public static final deprecated java.lang.String ISPRIMARY = "isprimary";
- field public static final deprecated java.lang.String LABEL = "label";
- field public static final deprecated java.lang.String NUMBER = "number";
- field public static final deprecated java.lang.String NUMBER_KEY = "number_key";
- field public static final deprecated java.lang.String TYPE = "type";
- field public static final deprecated int TYPE_CUSTOM = 0; // 0x0
- field public static final deprecated int TYPE_FAX_HOME = 5; // 0x5
- field public static final deprecated int TYPE_FAX_WORK = 4; // 0x4
- field public static final deprecated int TYPE_HOME = 1; // 0x1
- field public static final deprecated int TYPE_MOBILE = 2; // 0x2
- field public static final deprecated int TYPE_OTHER = 7; // 0x7
- field public static final deprecated int TYPE_PAGER = 6; // 0x6
- field public static final deprecated int TYPE_WORK = 3; // 0x3
- }
-
- public static final deprecated class Contacts.Photos implements android.provider.BaseColumns android.provider.Contacts.PhotosColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "photo";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "person ASC";
- }
-
- public static abstract deprecated interface Contacts.PhotosColumns {
- field public static final deprecated java.lang.String DATA = "data";
- field public static final deprecated java.lang.String DOWNLOAD_REQUIRED = "download_required";
- field public static final deprecated java.lang.String EXISTS_ON_SERVER = "exists_on_server";
- field public static final deprecated java.lang.String LOCAL_VERSION = "local_version";
- field public static final deprecated java.lang.String PERSON_ID = "person";
- field public static final deprecated java.lang.String SYNC_ERROR = "sync_error";
- }
-
- public static abstract deprecated interface Contacts.PresenceColumns {
- field public static final int AVAILABLE = 5; // 0x5
- field public static final int AWAY = 2; // 0x2
- field public static final int DO_NOT_DISTURB = 4; // 0x4
- field public static final int IDLE = 3; // 0x3
- field public static final deprecated java.lang.String IM_ACCOUNT = "im_account";
- field public static final deprecated java.lang.String IM_HANDLE = "im_handle";
- field public static final deprecated java.lang.String IM_PROTOCOL = "im_protocol";
- field public static final int INVISIBLE = 1; // 0x1
- field public static final int OFFLINE = 0; // 0x0
- field public static final java.lang.String PRESENCE_CUSTOM_STATUS = "status";
- field public static final java.lang.String PRESENCE_STATUS = "mode";
- field public static final java.lang.String PRIORITY = "priority";
- }
-
- public static final deprecated class Contacts.Settings implements android.provider.BaseColumns android.provider.Contacts.SettingsColumns {
- method public static deprecated java.lang.String getSetting(android.content.ContentResolver, java.lang.String, java.lang.String);
- method public static deprecated void setSetting(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String);
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "settings";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DEFAULT_SORT_ORDER = "key ASC";
- field public static final deprecated java.lang.String SYNC_EVERYTHING = "syncEverything";
- }
-
- public static abstract deprecated interface Contacts.SettingsColumns {
- field public static final deprecated java.lang.String KEY = "key";
- field public static final deprecated java.lang.String VALUE = "value";
- field public static final deprecated java.lang.String _SYNC_ACCOUNT = "_sync_account";
- field public static final deprecated java.lang.String _SYNC_ACCOUNT_TYPE = "_sync_account_type";
+ field public static final String VOICEMAIL_URI = "voicemail_uri";
+ }
+
+ @Deprecated public class Contacts {
+ field @Deprecated public static final String AUTHORITY = "contacts";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final int KIND_EMAIL = 1; // 0x1
+ field @Deprecated public static final int KIND_IM = 3; // 0x3
+ field @Deprecated public static final int KIND_ORGANIZATION = 4; // 0x4
+ field @Deprecated public static final int KIND_PHONE = 5; // 0x5
+ field @Deprecated public static final int KIND_POSTAL = 2; // 0x2
+ }
+
+ @Deprecated public static final class Contacts.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
+ method @Deprecated public void addPostalLocation(android.content.Context, long, double, double);
+ method @Deprecated public static Object decodeImProtocol(String);
+ method @Deprecated public static String encodeCustomImProtocol(String);
+ method @Deprecated public static String encodePredefinedImProtocol(int);
+ method @Deprecated public static CharSequence getDisplayLabel(android.content.Context, int, int, CharSequence);
+ field @Deprecated public static final String CONTENT_EMAIL_ITEM_TYPE = "vnd.android.cursor.item/email";
+ field @Deprecated public static final String CONTENT_EMAIL_TYPE = "vnd.android.cursor.dir/email";
+ field @Deprecated public static final android.net.Uri CONTENT_EMAIL_URI;
+ field @Deprecated public static final String CONTENT_IM_ITEM_TYPE = "vnd.android.cursor.item/jabber-im";
+ field @Deprecated public static final String CONTENT_POSTAL_ITEM_TYPE = "vnd.android.cursor.item/postal-address";
+ field @Deprecated public static final String CONTENT_POSTAL_TYPE = "vnd.android.cursor.dir/postal-address";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact-methods";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final String PERSON_ID = "person";
+ field @Deprecated public static final String POSTAL_LOCATION_LATITUDE = "data";
+ field @Deprecated public static final String POSTAL_LOCATION_LONGITUDE = "aux_data";
+ field @Deprecated public static final int PROTOCOL_AIM = 0; // 0x0
+ field @Deprecated public static final int PROTOCOL_GOOGLE_TALK = 5; // 0x5
+ field @Deprecated public static final int PROTOCOL_ICQ = 6; // 0x6
+ field @Deprecated public static final int PROTOCOL_JABBER = 7; // 0x7
+ field @Deprecated public static final int PROTOCOL_MSN = 1; // 0x1
+ field @Deprecated public static final int PROTOCOL_QQ = 4; // 0x4
+ field @Deprecated public static final int PROTOCOL_SKYPE = 3; // 0x3
+ field @Deprecated public static final int PROTOCOL_YAHOO = 2; // 0x2
+ }
+
+ @Deprecated public static interface Contacts.ContactMethodsColumns {
+ field @Deprecated public static final String AUX_DATA = "aux_data";
+ field @Deprecated public static final String DATA = "data";
+ field @Deprecated public static final String ISPRIMARY = "isprimary";
+ field @Deprecated public static final String KIND = "kind";
+ field @Deprecated public static final String LABEL = "label";
+ field @Deprecated public static final String TYPE = "type";
+ field @Deprecated public static final int TYPE_CUSTOM = 0; // 0x0
+ field @Deprecated public static final int TYPE_HOME = 1; // 0x1
+ field @Deprecated public static final int TYPE_OTHER = 3; // 0x3
+ field @Deprecated public static final int TYPE_WORK = 2; // 0x2
+ }
+
+ @Deprecated public static final class Contacts.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_extensions";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_extensions";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "person, name ASC";
+ field @Deprecated public static final String PERSON_ID = "person";
+ }
+
+ @Deprecated public static interface Contacts.ExtensionsColumns {
+ field @Deprecated public static final String NAME = "name";
+ field @Deprecated public static final String VALUE = "value";
+ }
+
+ @Deprecated public static final class Contacts.GroupMembership implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "groupmembership";
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroupmembership";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroupmembership";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "group_id ASC";
+ field @Deprecated public static final String GROUP_ID = "group_id";
+ field @Deprecated public static final String GROUP_SYNC_ACCOUNT = "group_sync_account";
+ field @Deprecated public static final String GROUP_SYNC_ACCOUNT_TYPE = "group_sync_account_type";
+ field @Deprecated public static final String GROUP_SYNC_ID = "group_sync_id";
+ field @Deprecated public static final String PERSON_ID = "person";
+ field @Deprecated public static final android.net.Uri RAW_CONTENT_URI;
+ }
+
+ @Deprecated public static final class Contacts.Groups implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroup";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroup";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final android.net.Uri DELETED_CONTENT_URI;
+ field @Deprecated public static final String GROUP_ANDROID_STARRED = "Starred in Android";
+ field @Deprecated public static final String GROUP_MY_CONTACTS = "Contacts";
+ }
+
+ @Deprecated public static interface Contacts.GroupsColumns {
+ field @Deprecated public static final String NAME = "name";
+ field @Deprecated public static final String NOTES = "notes";
+ field @Deprecated public static final String SHOULD_SYNC = "should_sync";
+ field @Deprecated public static final String SYSTEM_ID = "system_id";
+ }
+
+ @Deprecated public static final class Contacts.Intents {
+ ctor @Deprecated public Contacts.Intents();
+ field @Deprecated public static final String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
+ field @Deprecated public static final String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
+ field @Deprecated public static final String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
+ field @Deprecated public static final String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
+ field @Deprecated public static final String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
+ field @Deprecated public static final String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
+ field @Deprecated public static final String SHOW_OR_CREATE_CONTACT = "com.android.contacts.action.SHOW_OR_CREATE_CONTACT";
+ }
+
+ @Deprecated public static final class Contacts.Intents.Insert {
+ ctor @Deprecated public Contacts.Intents.Insert();
+ field @Deprecated public static final String ACTION = "android.intent.action.INSERT";
+ field @Deprecated public static final String COMPANY = "company";
+ field @Deprecated public static final String EMAIL = "email";
+ field @Deprecated public static final String EMAIL_ISPRIMARY = "email_isprimary";
+ field @Deprecated public static final String EMAIL_TYPE = "email_type";
+ field @Deprecated public static final String FULL_MODE = "full_mode";
+ field @Deprecated public static final String IM_HANDLE = "im_handle";
+ field @Deprecated public static final String IM_ISPRIMARY = "im_isprimary";
+ field @Deprecated public static final String IM_PROTOCOL = "im_protocol";
+ field @Deprecated public static final String JOB_TITLE = "job_title";
+ field @Deprecated public static final String NAME = "name";
+ field @Deprecated public static final String NOTES = "notes";
+ field @Deprecated public static final String PHONE = "phone";
+ field @Deprecated public static final String PHONETIC_NAME = "phonetic_name";
+ field @Deprecated public static final String PHONE_ISPRIMARY = "phone_isprimary";
+ field @Deprecated public static final String PHONE_TYPE = "phone_type";
+ field @Deprecated public static final String POSTAL = "postal";
+ field @Deprecated public static final String POSTAL_ISPRIMARY = "postal_isprimary";
+ field @Deprecated public static final String POSTAL_TYPE = "postal_type";
+ field @Deprecated public static final String SECONDARY_EMAIL = "secondary_email";
+ field @Deprecated public static final String SECONDARY_EMAIL_TYPE = "secondary_email_type";
+ field @Deprecated public static final String SECONDARY_PHONE = "secondary_phone";
+ field @Deprecated public static final String SECONDARY_PHONE_TYPE = "secondary_phone_type";
+ field @Deprecated public static final String TERTIARY_EMAIL = "tertiary_email";
+ field @Deprecated public static final String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
+ field @Deprecated public static final String TERTIARY_PHONE = "tertiary_phone";
+ field @Deprecated public static final String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
+ }
+
+ @Deprecated public static final class Contacts.Intents.UI {
+ ctor @Deprecated public Contacts.Intents.UI();
+ field @Deprecated public static final String FILTER_CONTACTS_ACTION = "com.android.contacts.action.FILTER_CONTACTS";
+ field @Deprecated public static final String FILTER_TEXT_EXTRA_KEY = "com.android.contacts.extra.FILTER_TEXT";
+ field @Deprecated public static final String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP";
+ field @Deprecated public static final String LIST_ALL_CONTACTS_ACTION = "com.android.contacts.action.LIST_ALL_CONTACTS";
+ field @Deprecated public static final String LIST_CONTACTS_WITH_PHONES_ACTION = "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
+ field @Deprecated public static final String LIST_DEFAULT = "com.android.contacts.action.LIST_DEFAULT";
+ field @Deprecated public static final String LIST_FREQUENT_ACTION = "com.android.contacts.action.LIST_FREQUENT";
+ field @Deprecated public static final String LIST_GROUP_ACTION = "com.android.contacts.action.LIST_GROUP";
+ field @Deprecated public static final String LIST_STARRED_ACTION = "com.android.contacts.action.LIST_STARRED";
+ field @Deprecated public static final String LIST_STREQUENT_ACTION = "com.android.contacts.action.LIST_STREQUENT";
+ field @Deprecated public static final String TITLE_EXTRA_KEY = "com.android.contacts.extra.TITLE_EXTRA";
+ }
+
+ @Deprecated public static interface Contacts.OrganizationColumns {
+ field @Deprecated public static final String COMPANY = "company";
+ field @Deprecated public static final String ISPRIMARY = "isprimary";
+ field @Deprecated public static final String LABEL = "label";
+ field @Deprecated public static final String PERSON_ID = "person";
+ field @Deprecated public static final String TITLE = "title";
+ field @Deprecated public static final String TYPE = "type";
+ field @Deprecated public static final int TYPE_CUSTOM = 0; // 0x0
+ field @Deprecated public static final int TYPE_OTHER = 2; // 0x2
+ field @Deprecated public static final int TYPE_WORK = 1; // 0x1
+ }
+
+ @Deprecated public static final class Contacts.Organizations implements android.provider.BaseColumns android.provider.Contacts.OrganizationColumns {
+ method @Deprecated public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence);
+ field @Deprecated public static final String CONTENT_DIRECTORY = "organizations";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "company, title, isprimary ASC";
+ }
+
+ @Deprecated public static final class Contacts.People implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns android.provider.Contacts.PresenceColumns {
+ method @Deprecated public static android.net.Uri addToGroup(android.content.ContentResolver, long, String);
+ method @Deprecated public static android.net.Uri addToGroup(android.content.ContentResolver, long, long);
+ method @Deprecated public static android.net.Uri addToMyContactsGroup(android.content.ContentResolver, long);
+ method @Deprecated public static android.net.Uri createPersonInMyContactsGroup(android.content.ContentResolver, android.content.ContentValues);
+ method @Deprecated public static android.graphics.Bitmap loadContactPhoto(android.content.Context, android.net.Uri, int, android.graphics.BitmapFactory.Options);
+ method @Deprecated public static void markAsContacted(android.content.ContentResolver, long);
+ method @Deprecated public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
+ method @Deprecated public static android.database.Cursor queryGroups(android.content.ContentResolver, long);
+ method @Deprecated public static void setPhotoData(android.content.ContentResolver, android.net.Uri, byte[]);
+ field @Deprecated public static final android.net.Uri CONTENT_FILTER_URI;
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/person";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/person";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final android.net.Uri DELETED_CONTENT_URI;
+ field @Deprecated public static final String PRIMARY_EMAIL_ID = "primary_email";
+ field @Deprecated public static final String PRIMARY_ORGANIZATION_ID = "primary_organization";
+ field @Deprecated public static final String PRIMARY_PHONE_ID = "primary_phone";
+ }
+
+ @Deprecated public static final class Contacts.People.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "contact_methods";
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "data ASC";
+ }
+
+ @Deprecated public static class Contacts.People.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "extensions";
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final String PERSON_ID = "person";
+ }
+
+ @Deprecated public static final class Contacts.People.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "phones";
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "number ASC";
+ }
+
+ @Deprecated public static interface Contacts.PeopleColumns {
+ field @Deprecated public static final String CUSTOM_RINGTONE = "custom_ringtone";
+ field @Deprecated public static final String DISPLAY_NAME = "display_name";
+ field @Deprecated public static final String LAST_TIME_CONTACTED = "last_time_contacted";
+ field @Deprecated public static final String NAME = "name";
+ field @Deprecated public static final String NOTES = "notes";
+ field @Deprecated public static final String PHONETIC_NAME = "phonetic_name";
+ field @Deprecated public static final String PHOTO_VERSION = "photo_version";
+ field @Deprecated public static final String SEND_TO_VOICEMAIL = "send_to_voicemail";
+ field @Deprecated public static final String STARRED = "starred";
+ field @Deprecated public static final String TIMES_CONTACTED = "times_contacted";
+ }
+
+ @Deprecated public static final class Contacts.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
+ method @Deprecated public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence, CharSequence[]);
+ method @Deprecated public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence);
+ field @Deprecated public static final android.net.Uri CONTENT_FILTER_URL;
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final String PERSON_ID = "person";
+ }
+
+ @Deprecated public static interface Contacts.PhonesColumns {
+ field @Deprecated public static final String ISPRIMARY = "isprimary";
+ field @Deprecated public static final String LABEL = "label";
+ field @Deprecated public static final String NUMBER = "number";
+ field @Deprecated public static final String NUMBER_KEY = "number_key";
+ field @Deprecated public static final String TYPE = "type";
+ field @Deprecated public static final int TYPE_CUSTOM = 0; // 0x0
+ field @Deprecated public static final int TYPE_FAX_HOME = 5; // 0x5
+ field @Deprecated public static final int TYPE_FAX_WORK = 4; // 0x4
+ field @Deprecated public static final int TYPE_HOME = 1; // 0x1
+ field @Deprecated public static final int TYPE_MOBILE = 2; // 0x2
+ field @Deprecated public static final int TYPE_OTHER = 7; // 0x7
+ field @Deprecated public static final int TYPE_PAGER = 6; // 0x6
+ field @Deprecated public static final int TYPE_WORK = 3; // 0x3
+ }
+
+ @Deprecated public static final class Contacts.Photos implements android.provider.BaseColumns android.provider.Contacts.PhotosColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "photo";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "person ASC";
+ }
+
+ @Deprecated public static interface Contacts.PhotosColumns {
+ field @Deprecated public static final String DATA = "data";
+ field @Deprecated public static final String DOWNLOAD_REQUIRED = "download_required";
+ field @Deprecated public static final String EXISTS_ON_SERVER = "exists_on_server";
+ field @Deprecated public static final String LOCAL_VERSION = "local_version";
+ field @Deprecated public static final String PERSON_ID = "person";
+ field @Deprecated public static final String SYNC_ERROR = "sync_error";
+ }
+
+ @Deprecated public static interface Contacts.PresenceColumns {
+ field @Deprecated public static final int AVAILABLE = 5; // 0x5
+ field @Deprecated public static final int AWAY = 2; // 0x2
+ field @Deprecated public static final int DO_NOT_DISTURB = 4; // 0x4
+ field @Deprecated public static final int IDLE = 3; // 0x3
+ field @Deprecated public static final String IM_ACCOUNT = "im_account";
+ field @Deprecated public static final String IM_HANDLE = "im_handle";
+ field @Deprecated public static final String IM_PROTOCOL = "im_protocol";
+ field @Deprecated public static final int INVISIBLE = 1; // 0x1
+ field @Deprecated public static final int OFFLINE = 0; // 0x0
+ field @Deprecated public static final String PRESENCE_CUSTOM_STATUS = "status";
+ field @Deprecated public static final String PRESENCE_STATUS = "mode";
+ field @Deprecated public static final String PRIORITY = "priority";
+ }
+
+ @Deprecated public static final class Contacts.Settings implements android.provider.BaseColumns android.provider.Contacts.SettingsColumns {
+ method @Deprecated public static String getSetting(android.content.ContentResolver, String, String);
+ method @Deprecated public static void setSetting(android.content.ContentResolver, String, String, String);
+ field @Deprecated public static final String CONTENT_DIRECTORY = "settings";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String DEFAULT_SORT_ORDER = "key ASC";
+ field @Deprecated public static final String SYNC_EVERYTHING = "syncEverything";
+ }
+
+ @Deprecated public static interface Contacts.SettingsColumns {
+ field @Deprecated public static final String KEY = "key";
+ field @Deprecated public static final String VALUE = "value";
+ field @Deprecated public static final String _SYNC_ACCOUNT = "_sync_account";
+ field @Deprecated public static final String _SYNC_ACCOUNT_TYPE = "_sync_account_type";
}
public final class ContactsContract {
ctor public ContactsContract();
method public static boolean isProfileId(long);
- field public static final java.lang.String AUTHORITY = "com.android.contacts";
+ field public static final String AUTHORITY = "com.android.contacts";
field public static final android.net.Uri AUTHORITY_URI;
- field public static final java.lang.String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
- field public static final java.lang.String DEFERRED_SNIPPETING = "deferred_snippeting";
- field public static final java.lang.String DEFERRED_SNIPPETING_QUERY = "deferred_snippeting_query";
- field public static final java.lang.String DIRECTORY_PARAM_KEY = "directory";
- field public static final java.lang.String LIMIT_PARAM_KEY = "limit";
- field public static final java.lang.String PRIMARY_ACCOUNT_NAME = "name_for_primary_account";
- field public static final java.lang.String PRIMARY_ACCOUNT_TYPE = "type_for_primary_account";
- field public static final java.lang.String REMOVE_DUPLICATE_ENTRIES = "remove_duplicate_entries";
- field public static final java.lang.String STREQUENT_PHONE_ONLY = "strequent_phone_only";
+ field public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
+ field public static final String DEFERRED_SNIPPETING = "deferred_snippeting";
+ field public static final String DEFERRED_SNIPPETING_QUERY = "deferred_snippeting_query";
+ field public static final String DIRECTORY_PARAM_KEY = "directory";
+ field public static final String LIMIT_PARAM_KEY = "limit";
+ field public static final String PRIMARY_ACCOUNT_NAME = "name_for_primary_account";
+ field public static final String PRIMARY_ACCOUNT_TYPE = "type_for_primary_account";
+ field public static final String REMOVE_DUPLICATE_ENTRIES = "remove_duplicate_entries";
+ field public static final String STREQUENT_PHONE_ONLY = "strequent_phone_only";
}
public static final class ContactsContract.AggregationExceptions implements android.provider.BaseColumns {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/aggregation_exception";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/aggregation_exception";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/aggregation_exception";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/aggregation_exception";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String RAW_CONTACT_ID1 = "raw_contact_id1";
- field public static final java.lang.String RAW_CONTACT_ID2 = "raw_contact_id2";
- field public static final java.lang.String TYPE = "type";
+ field public static final String RAW_CONTACT_ID1 = "raw_contact_id1";
+ field public static final String RAW_CONTACT_ID2 = "raw_contact_id2";
+ field public static final String TYPE = "type";
field public static final int TYPE_AUTOMATIC = 0; // 0x0
field public static final int TYPE_KEEP_SEPARATE = 2; // 0x2
field public static final int TYPE_KEEP_TOGETHER = 1; // 0x1
}
- protected static abstract interface ContactsContract.BaseSyncColumns {
- field public static final java.lang.String SYNC1 = "sync1";
- field public static final java.lang.String SYNC2 = "sync2";
- field public static final java.lang.String SYNC3 = "sync3";
- field public static final java.lang.String SYNC4 = "sync4";
+ protected static interface ContactsContract.BaseSyncColumns {
+ field public static final String SYNC1 = "sync1";
+ field public static final String SYNC2 = "sync2";
+ field public static final String SYNC3 = "sync3";
+ field public static final String SYNC4 = "sync4";
}
public static final class ContactsContract.CommonDataKinds {
}
- public static abstract interface ContactsContract.CommonDataKinds.BaseTypes {
+ public static interface ContactsContract.CommonDataKinds.BaseTypes {
field public static final int TYPE_CUSTOM = 0; // 0x0
}
@@ -36855,42 +37119,42 @@ package android.provider {
field public static final android.net.Uri CONTENT_FILTER_URI;
field public static final android.net.Uri CONTENT_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
}
- protected static abstract interface ContactsContract.CommonDataKinds.CommonColumns implements android.provider.ContactsContract.CommonDataKinds.BaseTypes {
- field public static final java.lang.String DATA = "data1";
- field public static final java.lang.String LABEL = "data3";
- field public static final java.lang.String TYPE = "data2";
+ protected static interface ContactsContract.CommonDataKinds.CommonColumns extends android.provider.ContactsContract.CommonDataKinds.BaseTypes {
+ field public static final String DATA = "data1";
+ field public static final String LABEL = "data3";
+ field public static final String TYPE = "data2";
}
public static final class ContactsContract.CommonDataKinds.Contactables implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
ctor public ContactsContract.CommonDataKinds.Contactables();
field public static final android.net.Uri CONTENT_FILTER_URI;
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String VISIBLE_CONTACTS_ONLY = "visible_contacts_only";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String VISIBLE_CONTACTS_ONLY = "visible_contacts_only";
}
public static final class ContactsContract.CommonDataKinds.Email implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String ADDRESS = "data1";
+ field public static final String ADDRESS = "data1";
field public static final android.net.Uri CONTENT_FILTER_URI;
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/email_v2";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/email_v2";
field public static final android.net.Uri CONTENT_LOOKUP_URI;
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DISPLAY_NAME = "data4";
+ field public static final String DISPLAY_NAME = "data4";
field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_LOOKUP_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
field public static final int TYPE_HOME = 1; // 0x1
field public static final int TYPE_MOBILE = 4; // 0x4
field public static final int TYPE_OTHER = 3; // 0x3
@@ -36898,47 +37162,47 @@ package android.provider {
}
public static final class ContactsContract.CommonDataKinds.Event implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
- method public static int getTypeResource(java.lang.Integer);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_event";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String START_DATE = "data1";
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
+ method public static int getTypeResource(Integer);
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_event";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String START_DATE = "data1";
field public static final int TYPE_ANNIVERSARY = 1; // 0x1
field public static final int TYPE_BIRTHDAY = 3; // 0x3
field public static final int TYPE_OTHER = 2; // 0x2
}
public static final class ContactsContract.CommonDataKinds.GroupMembership implements android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/group_membership";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String GROUP_ROW_ID = "data1";
- field public static final java.lang.String GROUP_SOURCE_ID = "group_sourceid";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/group_membership";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String GROUP_ROW_ID = "data1";
+ field public static final String GROUP_SOURCE_ID = "group_sourceid";
}
public static final class ContactsContract.CommonDataKinds.Identity implements android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/identity";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String IDENTITY = "data1";
- field public static final java.lang.String NAMESPACE = "data2";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/identity";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String IDENTITY = "data1";
+ field public static final String NAMESPACE = "data2";
}
public static final class ContactsContract.CommonDataKinds.Im implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getProtocolLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getProtocolLabel(android.content.res.Resources, int, CharSequence);
method public static int getProtocolLabelResource(int);
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/im";
- field public static final java.lang.String CUSTOM_PROTOCOL = "data6";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String PROTOCOL = "data5";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/im";
+ field public static final String CUSTOM_PROTOCOL = "data6";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String PROTOCOL = "data5";
field public static final int PROTOCOL_AIM = 0; // 0x0
field public static final int PROTOCOL_CUSTOM = -1; // 0xffffffff
field public static final int PROTOCOL_GOOGLE_TALK = 5; // 0x5
@@ -36955,61 +37219,61 @@ package android.provider {
}
public static final class ContactsContract.CommonDataKinds.Nickname implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/nickname";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String NAME = "data1";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/nickname";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String NAME = "data1";
field public static final int TYPE_DEFAULT = 1; // 0x1
field public static final int TYPE_INITIALS = 5; // 0x5
field public static final int TYPE_MAIDEN_NAME = 3; // 0x3
- field public static final deprecated int TYPE_MAINDEN_NAME = 3; // 0x3
+ field @Deprecated public static final int TYPE_MAINDEN_NAME = 3; // 0x3
field public static final int TYPE_OTHER_NAME = 2; // 0x2
field public static final int TYPE_SHORT_NAME = 4; // 0x4
}
public static final class ContactsContract.CommonDataKinds.Note implements android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/note";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String NOTE = "data1";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/note";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String NOTE = "data1";
}
public static final class ContactsContract.CommonDataKinds.Organization implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String COMPANY = "data1";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/organization";
- field public static final java.lang.String DEPARTMENT = "data5";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String JOB_DESCRIPTION = "data6";
- field public static final java.lang.String OFFICE_LOCATION = "data9";
- field public static final java.lang.String PHONETIC_NAME = "data8";
- field public static final java.lang.String PHONETIC_NAME_STYLE = "data10";
- field public static final java.lang.String SYMBOL = "data7";
- field public static final java.lang.String TITLE = "data4";
+ field public static final String COMPANY = "data1";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/organization";
+ field public static final String DEPARTMENT = "data5";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String JOB_DESCRIPTION = "data6";
+ field public static final String OFFICE_LOCATION = "data9";
+ field public static final String PHONETIC_NAME = "data8";
+ field public static final String PHONETIC_NAME_STYLE = "data10";
+ field public static final String SYMBOL = "data7";
+ field public static final String TITLE = "data4";
field public static final int TYPE_OTHER = 2; // 0x2
field public static final int TYPE_WORK = 1; // 0x1
}
public static final class ContactsContract.CommonDataKinds.Phone implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
field public static final android.net.Uri CONTENT_FILTER_URI;
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/phone_v2";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone_v2";
field public static final android.net.Uri CONTENT_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String NORMALIZED_NUMBER = "data4";
- field public static final java.lang.String NUMBER = "data1";
- field public static final java.lang.String SEARCH_DISPLAY_NAME_KEY = "search_display_name";
- field public static final java.lang.String SEARCH_PHONE_NUMBER_KEY = "search_phone_number";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String NORMALIZED_NUMBER = "data4";
+ field public static final String NUMBER = "data1";
+ field public static final String SEARCH_DISPLAY_NAME_KEY = "search_display_name";
+ field public static final String SEARCH_PHONE_NUMBER_KEY = "search_phone_number";
field public static final int TYPE_ASSISTANT = 19; // 0x13
field public static final int TYPE_CALLBACK = 8; // 0x8
field public static final int TYPE_CAR = 9; // 0x9
@@ -37033,22 +37297,22 @@ package android.provider {
}
public static final class ContactsContract.CommonDataKinds.Photo implements android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String PHOTO = "data15";
- field public static final java.lang.String PHOTO_FILE_ID = "data14";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String PHOTO = "data15";
+ field public static final String PHOTO_FILE_ID = "data14";
}
public static final class ContactsContract.CommonDataKinds.Relation implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/relation";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String NAME = "data1";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/relation";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String NAME = "data1";
field public static final int TYPE_ASSISTANT = 1; // 0x1
field public static final int TYPE_BROTHER = 2; // 0x2
field public static final int TYPE_CHILD = 3; // 0x3
@@ -37066,63 +37330,63 @@ package android.provider {
}
public static final class ContactsContract.CommonDataKinds.SipAddress implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/sip_address";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String SIP_ADDRESS = "data1";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/sip_address";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String SIP_ADDRESS = "data1";
field public static final int TYPE_HOME = 1; // 0x1
field public static final int TYPE_OTHER = 3; // 0x3
field public static final int TYPE_WORK = 2; // 0x2
}
public static final class ContactsContract.CommonDataKinds.StructuredName implements android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/name";
- field public static final java.lang.String DISPLAY_NAME = "data1";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String FAMILY_NAME = "data3";
- field public static final java.lang.String FULL_NAME_STYLE = "data10";
- field public static final java.lang.String GIVEN_NAME = "data2";
- field public static final java.lang.String MIDDLE_NAME = "data5";
- field public static final java.lang.String PHONETIC_FAMILY_NAME = "data9";
- field public static final java.lang.String PHONETIC_GIVEN_NAME = "data7";
- field public static final java.lang.String PHONETIC_MIDDLE_NAME = "data8";
- field public static final java.lang.String PHONETIC_NAME_STYLE = "data11";
- field public static final java.lang.String PREFIX = "data4";
- field public static final java.lang.String SUFFIX = "data6";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/name";
+ field public static final String DISPLAY_NAME = "data1";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String FAMILY_NAME = "data3";
+ field public static final String FULL_NAME_STYLE = "data10";
+ field public static final String GIVEN_NAME = "data2";
+ field public static final String MIDDLE_NAME = "data5";
+ field public static final String PHONETIC_FAMILY_NAME = "data9";
+ field public static final String PHONETIC_GIVEN_NAME = "data7";
+ field public static final String PHONETIC_MIDDLE_NAME = "data8";
+ field public static final String PHONETIC_NAME_STYLE = "data11";
+ field public static final String PREFIX = "data4";
+ field public static final String SUFFIX = "data6";
}
public static final class ContactsContract.CommonDataKinds.StructuredPostal implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- method public static java.lang.CharSequence getTypeLabel(android.content.res.Resources, int, java.lang.CharSequence);
+ method public static CharSequence getTypeLabel(android.content.res.Resources, int, CharSequence);
method public static int getTypeLabelResource(int);
- field public static final java.lang.String CITY = "data7";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/postal-address_v2";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/postal-address_v2";
+ field public static final String CITY = "data7";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/postal-address_v2";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/postal-address_v2";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String COUNTRY = "data10";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String FORMATTED_ADDRESS = "data1";
- field public static final java.lang.String NEIGHBORHOOD = "data6";
- field public static final java.lang.String POBOX = "data5";
- field public static final java.lang.String POSTCODE = "data9";
- field public static final java.lang.String REGION = "data8";
- field public static final java.lang.String STREET = "data4";
+ field public static final String COUNTRY = "data10";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String FORMATTED_ADDRESS = "data1";
+ field public static final String NEIGHBORHOOD = "data6";
+ field public static final String POBOX = "data5";
+ field public static final String POSTCODE = "data9";
+ field public static final String REGION = "data8";
+ field public static final String STREET = "data4";
field public static final int TYPE_HOME = 1; // 0x1
field public static final int TYPE_OTHER = 3; // 0x3
field public static final int TYPE_WORK = 2; // 0x2
}
public static final class ContactsContract.CommonDataKinds.Website implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/website";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/website";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
field public static final int TYPE_BLOG = 2; // 0x2
field public static final int TYPE_FTP = 6; // 0x6
field public static final int TYPE_HOME = 4; // 0x4
@@ -37130,168 +37394,168 @@ package android.provider {
field public static final int TYPE_OTHER = 7; // 0x7
field public static final int TYPE_PROFILE = 3; // 0x3
field public static final int TYPE_WORK = 5; // 0x5
- field public static final java.lang.String URL = "data1";
+ field public static final String URL = "data1";
}
- protected static abstract interface ContactsContract.ContactNameColumns {
- field public static final java.lang.String DISPLAY_NAME_ALTERNATIVE = "display_name_alt";
- field public static final java.lang.String DISPLAY_NAME_PRIMARY = "display_name";
- field public static final java.lang.String DISPLAY_NAME_SOURCE = "display_name_source";
- field public static final java.lang.String PHONETIC_NAME = "phonetic_name";
- field public static final java.lang.String PHONETIC_NAME_STYLE = "phonetic_name_style";
- field public static final java.lang.String SORT_KEY_ALTERNATIVE = "sort_key_alt";
- field public static final java.lang.String SORT_KEY_PRIMARY = "sort_key";
+ protected static interface ContactsContract.ContactNameColumns {
+ field public static final String DISPLAY_NAME_ALTERNATIVE = "display_name_alt";
+ field public static final String DISPLAY_NAME_PRIMARY = "display_name";
+ field public static final String DISPLAY_NAME_SOURCE = "display_name_source";
+ field public static final String PHONETIC_NAME = "phonetic_name";
+ field public static final String PHONETIC_NAME_STYLE = "phonetic_name_style";
+ field public static final String SORT_KEY_ALTERNATIVE = "sort_key_alt";
+ field public static final String SORT_KEY_PRIMARY = "sort_key";
}
- protected static abstract interface ContactsContract.ContactOptionsColumns {
- field public static final java.lang.String CUSTOM_RINGTONE = "custom_ringtone";
- field public static final deprecated java.lang.String LAST_TIME_CONTACTED = "last_time_contacted";
- field public static final java.lang.String PINNED = "pinned";
- field public static final java.lang.String SEND_TO_VOICEMAIL = "send_to_voicemail";
- field public static final java.lang.String STARRED = "starred";
- field public static final deprecated java.lang.String TIMES_CONTACTED = "times_contacted";
+ protected static interface ContactsContract.ContactOptionsColumns {
+ field public static final String CUSTOM_RINGTONE = "custom_ringtone";
+ field @Deprecated public static final String LAST_TIME_CONTACTED = "last_time_contacted";
+ field public static final String PINNED = "pinned";
+ field public static final String SEND_TO_VOICEMAIL = "send_to_voicemail";
+ field public static final String STARRED = "starred";
+ field @Deprecated public static final String TIMES_CONTACTED = "times_contacted";
}
- protected static abstract interface ContactsContract.ContactStatusColumns {
- field public static final java.lang.String CONTACT_CHAT_CAPABILITY = "contact_chat_capability";
- field public static final java.lang.String CONTACT_PRESENCE = "contact_presence";
- field public static final java.lang.String CONTACT_STATUS = "contact_status";
- field public static final java.lang.String CONTACT_STATUS_ICON = "contact_status_icon";
- field public static final java.lang.String CONTACT_STATUS_LABEL = "contact_status_label";
- field public static final java.lang.String CONTACT_STATUS_RES_PACKAGE = "contact_status_res_package";
- field public static final java.lang.String CONTACT_STATUS_TIMESTAMP = "contact_status_ts";
+ protected static interface ContactsContract.ContactStatusColumns {
+ field public static final String CONTACT_CHAT_CAPABILITY = "contact_chat_capability";
+ field public static final String CONTACT_PRESENCE = "contact_presence";
+ field public static final String CONTACT_STATUS = "contact_status";
+ field public static final String CONTACT_STATUS_ICON = "contact_status_icon";
+ field public static final String CONTACT_STATUS_LABEL = "contact_status_label";
+ field public static final String CONTACT_STATUS_RES_PACKAGE = "contact_status_res_package";
+ field public static final String CONTACT_STATUS_TIMESTAMP = "contact_status_ts";
}
public static class ContactsContract.Contacts implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns {
method public static android.net.Uri getLookupUri(android.content.ContentResolver, android.net.Uri);
- method public static android.net.Uri getLookupUri(long, java.lang.String);
+ method public static android.net.Uri getLookupUri(long, String);
method public static boolean isEnterpriseContactId(long);
method public static android.net.Uri lookupContact(android.content.ContentResolver, android.net.Uri);
- method public static deprecated void markAsContacted(android.content.ContentResolver, long);
+ method @Deprecated public static void markAsContacted(android.content.ContentResolver, long);
method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri, boolean);
method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
field public static final android.net.Uri CONTENT_FILTER_URI;
- field public static final deprecated android.net.Uri CONTENT_FREQUENT_URI;
+ field @Deprecated public static final android.net.Uri CONTENT_FREQUENT_URI;
field public static final android.net.Uri CONTENT_GROUP_URI;
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact";
field public static final android.net.Uri CONTENT_LOOKUP_URI;
field public static final android.net.Uri CONTENT_MULTI_VCARD_URI;
field public static final android.net.Uri CONTENT_STREQUENT_FILTER_URI;
field public static final android.net.Uri CONTENT_STREQUENT_URI;
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String CONTENT_VCARD_TYPE = "text/x-vcard";
+ field public static final String CONTENT_VCARD_TYPE = "text/x-vcard";
field public static final android.net.Uri CONTENT_VCARD_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String QUERY_PARAMETER_VCARD_NO_PHOTO = "no_photo";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String QUERY_PARAMETER_VCARD_NO_PHOTO = "no_photo";
}
public static final class ContactsContract.Contacts.AggregationSuggestions implements android.provider.BaseColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns {
- field public static final java.lang.String CONTENT_DIRECTORY = "suggestions";
+ field public static final String CONTENT_DIRECTORY = "suggestions";
}
public static final class ContactsContract.Contacts.AggregationSuggestions.Builder {
ctor public ContactsContract.Contacts.AggregationSuggestions.Builder();
- method public android.provider.ContactsContract.Contacts.AggregationSuggestions.Builder addNameParameter(java.lang.String);
+ method public android.provider.ContactsContract.Contacts.AggregationSuggestions.Builder addNameParameter(String);
method public android.net.Uri build();
method public android.provider.ContactsContract.Contacts.AggregationSuggestions.Builder setContactId(long);
method public android.provider.ContactsContract.Contacts.AggregationSuggestions.Builder setLimit(int);
}
public static final class ContactsContract.Contacts.Data implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns {
- field public static final java.lang.String CONTENT_DIRECTORY = "data";
+ field public static final String CONTENT_DIRECTORY = "data";
}
public static final class ContactsContract.Contacts.Entity implements android.provider.BaseColumns android.provider.ContactsContract.BaseSyncColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.DataUsageStatColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.StatusColumns android.provider.ContactsContract.SyncColumns {
- field public static final java.lang.String CONTENT_DIRECTORY = "entities";
- field public static final java.lang.String DATA_ID = "data_id";
- field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id";
+ field public static final String CONTENT_DIRECTORY = "entities";
+ field public static final String DATA_ID = "data_id";
+ field public static final String RAW_CONTACT_ID = "raw_contact_id";
}
public static final class ContactsContract.Contacts.Photo implements android.provider.BaseColumns android.provider.ContactsContract.DataColumnsWithJoins {
- field public static final java.lang.String CONTENT_DIRECTORY = "photo";
- field public static final java.lang.String DISPLAY_PHOTO = "display_photo";
- field public static final java.lang.String PHOTO = "data15";
- field public static final java.lang.String PHOTO_FILE_ID = "data14";
- }
-
- protected static abstract interface ContactsContract.ContactsColumns {
- field public static final java.lang.String CONTACT_LAST_UPDATED_TIMESTAMP = "contact_last_updated_timestamp";
- field public static final java.lang.String DISPLAY_NAME = "display_name";
- field public static final java.lang.String HAS_PHONE_NUMBER = "has_phone_number";
- field public static final java.lang.String IN_DEFAULT_DIRECTORY = "in_default_directory";
- field public static final java.lang.String IN_VISIBLE_GROUP = "in_visible_group";
- field public static final java.lang.String IS_USER_PROFILE = "is_user_profile";
- field public static final java.lang.String LOOKUP_KEY = "lookup";
- field public static final java.lang.String NAME_RAW_CONTACT_ID = "name_raw_contact_id";
- field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id";
- field public static final java.lang.String PHOTO_ID = "photo_id";
- field public static final java.lang.String PHOTO_THUMBNAIL_URI = "photo_thumb_uri";
- field public static final java.lang.String PHOTO_URI = "photo_uri";
+ field public static final String CONTENT_DIRECTORY = "photo";
+ field public static final String DISPLAY_PHOTO = "display_photo";
+ field public static final String PHOTO = "data15";
+ field public static final String PHOTO_FILE_ID = "data14";
+ }
+
+ protected static interface ContactsContract.ContactsColumns {
+ field public static final String CONTACT_LAST_UPDATED_TIMESTAMP = "contact_last_updated_timestamp";
+ field public static final String DISPLAY_NAME = "display_name";
+ field public static final String HAS_PHONE_NUMBER = "has_phone_number";
+ field public static final String IN_DEFAULT_DIRECTORY = "in_default_directory";
+ field public static final String IN_VISIBLE_GROUP = "in_visible_group";
+ field public static final String IS_USER_PROFILE = "is_user_profile";
+ field public static final String LOOKUP_KEY = "lookup";
+ field public static final String NAME_RAW_CONTACT_ID = "name_raw_contact_id";
+ field public static final String PHOTO_FILE_ID = "photo_file_id";
+ field public static final String PHOTO_ID = "photo_id";
+ field public static final String PHOTO_THUMBNAIL_URI = "photo_thumb_uri";
+ field public static final String PHOTO_URI = "photo_uri";
}
public static final class ContactsContract.Data implements android.provider.ContactsContract.DataColumnsWithJoins {
method public static android.net.Uri getContactLookupUri(android.content.ContentResolver, android.net.Uri);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/data";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/data";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
- field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
- field public static final java.lang.String VISIBLE_CONTACTS_ONLY = "visible_contacts_only";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS";
+ field public static final String EXTRA_ADDRESS_BOOK_INDEX_TITLES = "android.provider.extra.ADDRESS_BOOK_INDEX_TITLES";
+ field public static final String VISIBLE_CONTACTS_ONLY = "visible_contacts_only";
}
- protected static abstract interface ContactsContract.DataColumns {
- field public static final java.lang.String CARRIER_PRESENCE = "carrier_presence";
+ protected static interface ContactsContract.DataColumns {
+ field public static final String CARRIER_PRESENCE = "carrier_presence";
field public static final int CARRIER_PRESENCE_VT_CAPABLE = 1; // 0x1
- field public static final java.lang.String DATA1 = "data1";
- field public static final java.lang.String DATA10 = "data10";
- field public static final java.lang.String DATA11 = "data11";
- field public static final java.lang.String DATA12 = "data12";
- field public static final java.lang.String DATA13 = "data13";
- field public static final java.lang.String DATA14 = "data14";
- field public static final java.lang.String DATA15 = "data15";
- field public static final java.lang.String DATA2 = "data2";
- field public static final java.lang.String DATA3 = "data3";
- field public static final java.lang.String DATA4 = "data4";
- field public static final java.lang.String DATA5 = "data5";
- field public static final java.lang.String DATA6 = "data6";
- field public static final java.lang.String DATA7 = "data7";
- field public static final java.lang.String DATA8 = "data8";
- field public static final java.lang.String DATA9 = "data9";
- field public static final java.lang.String DATA_VERSION = "data_version";
- field public static final java.lang.String IS_PRIMARY = "is_primary";
- field public static final java.lang.String IS_READ_ONLY = "is_read_only";
- field public static final java.lang.String IS_SUPER_PRIMARY = "is_super_primary";
- field public static final java.lang.String MIMETYPE = "mimetype";
- field public static final java.lang.String PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME = "preferred_phone_account_component_name";
- field public static final java.lang.String PREFERRED_PHONE_ACCOUNT_ID = "preferred_phone_account_id";
- field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id";
- field public static final java.lang.String RES_PACKAGE = "res_package";
- field public static final java.lang.String SYNC1 = "data_sync1";
- field public static final java.lang.String SYNC2 = "data_sync2";
- field public static final java.lang.String SYNC3 = "data_sync3";
- field public static final java.lang.String SYNC4 = "data_sync4";
- }
-
- protected static abstract interface ContactsContract.DataColumnsWithJoins implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.DataUsageStatColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.StatusColumns {
- }
-
- public static final deprecated class ContactsContract.DataUsageFeedback {
- ctor public ContactsContract.DataUsageFeedback();
- field public static final android.net.Uri DELETE_USAGE_URI;
- field public static final android.net.Uri FEEDBACK_URI;
- field public static final java.lang.String USAGE_TYPE = "type";
- field public static final java.lang.String USAGE_TYPE_CALL = "call";
- field public static final java.lang.String USAGE_TYPE_LONG_TEXT = "long_text";
- field public static final java.lang.String USAGE_TYPE_SHORT_TEXT = "short_text";
- }
-
- protected static abstract interface ContactsContract.DataUsageStatColumns {
- field public static final deprecated java.lang.String LAST_TIME_USED = "last_time_used";
- field public static final deprecated java.lang.String TIMES_USED = "times_used";
+ field public static final String DATA1 = "data1";
+ field public static final String DATA10 = "data10";
+ field public static final String DATA11 = "data11";
+ field public static final String DATA12 = "data12";
+ field public static final String DATA13 = "data13";
+ field public static final String DATA14 = "data14";
+ field public static final String DATA15 = "data15";
+ field public static final String DATA2 = "data2";
+ field public static final String DATA3 = "data3";
+ field public static final String DATA4 = "data4";
+ field public static final String DATA5 = "data5";
+ field public static final String DATA6 = "data6";
+ field public static final String DATA7 = "data7";
+ field public static final String DATA8 = "data8";
+ field public static final String DATA9 = "data9";
+ field public static final String DATA_VERSION = "data_version";
+ field public static final String IS_PRIMARY = "is_primary";
+ field public static final String IS_READ_ONLY = "is_read_only";
+ field public static final String IS_SUPER_PRIMARY = "is_super_primary";
+ field public static final String MIMETYPE = "mimetype";
+ field public static final String PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME = "preferred_phone_account_component_name";
+ field public static final String PREFERRED_PHONE_ACCOUNT_ID = "preferred_phone_account_id";
+ field public static final String RAW_CONTACT_ID = "raw_contact_id";
+ field public static final String RES_PACKAGE = "res_package";
+ field public static final String SYNC1 = "data_sync1";
+ field public static final String SYNC2 = "data_sync2";
+ field public static final String SYNC3 = "data_sync3";
+ field public static final String SYNC4 = "data_sync4";
+ }
+
+ protected static interface ContactsContract.DataColumnsWithJoins extends android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.DataUsageStatColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.StatusColumns {
+ }
+
+ @Deprecated public static final class ContactsContract.DataUsageFeedback {
+ ctor @Deprecated public ContactsContract.DataUsageFeedback();
+ field @Deprecated public static final android.net.Uri DELETE_USAGE_URI;
+ field @Deprecated public static final android.net.Uri FEEDBACK_URI;
+ field @Deprecated public static final String USAGE_TYPE = "type";
+ field @Deprecated public static final String USAGE_TYPE_CALL = "call";
+ field @Deprecated public static final String USAGE_TYPE_LONG_TEXT = "long_text";
+ field @Deprecated public static final String USAGE_TYPE_SHORT_TEXT = "short_text";
+ }
+
+ protected static interface ContactsContract.DataUsageStatColumns {
+ field @Deprecated public static final String LAST_TIME_USED = "last_time_used";
+ field @Deprecated public static final String TIMES_USED = "times_used";
}
public static final class ContactsContract.DeletedContacts implements android.provider.ContactsContract.DeletedContactsColumns {
@@ -37299,46 +37563,46 @@ package android.provider {
field public static final long DAYS_KEPT_MILLISECONDS = 2592000000L; // 0x9a7ec800L
}
- protected static abstract interface ContactsContract.DeletedContactsColumns {
- field public static final java.lang.String CONTACT_DELETED_TIMESTAMP = "contact_deleted_timestamp";
- field public static final java.lang.String CONTACT_ID = "contact_id";
+ protected static interface ContactsContract.DeletedContactsColumns {
+ field public static final String CONTACT_DELETED_TIMESTAMP = "contact_deleted_timestamp";
+ field public static final String CONTACT_ID = "contact_id";
}
public static final class ContactsContract.Directory implements android.provider.BaseColumns {
method public static boolean isEnterpriseDirectoryId(long);
method public static boolean isRemoteDirectoryId(long);
method public static void notifyDirectoryChange(android.content.ContentResolver);
- field public static final java.lang.String ACCOUNT_NAME = "accountName";
- field public static final java.lang.String ACCOUNT_TYPE = "accountType";
- field public static final java.lang.String CALLER_PACKAGE_PARAM_KEY = "callerPackage";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_directory";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact_directories";
+ field public static final String ACCOUNT_NAME = "accountName";
+ field public static final String ACCOUNT_TYPE = "accountType";
+ field public static final String CALLER_PACKAGE_PARAM_KEY = "callerPackage";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_directory";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_directories";
field public static final android.net.Uri CONTENT_URI;
field public static final long DEFAULT = 0L; // 0x0L
- field public static final java.lang.String DIRECTORY_AUTHORITY = "authority";
- field public static final java.lang.String DISPLAY_NAME = "displayName";
+ field public static final String DIRECTORY_AUTHORITY = "authority";
+ field public static final String DISPLAY_NAME = "displayName";
field public static final android.net.Uri ENTERPRISE_CONTENT_URI;
field public static final long ENTERPRISE_DEFAULT = 1000000000L; // 0x3b9aca00L
field public static final long ENTERPRISE_LOCAL_INVISIBLE = 1000000001L; // 0x3b9aca01L
- field public static final java.lang.String EXPORT_SUPPORT = "exportSupport";
+ field public static final String EXPORT_SUPPORT = "exportSupport";
field public static final int EXPORT_SUPPORT_ANY_ACCOUNT = 2; // 0x2
field public static final int EXPORT_SUPPORT_NONE = 0; // 0x0
field public static final int EXPORT_SUPPORT_SAME_ACCOUNT_ONLY = 1; // 0x1
field public static final long LOCAL_INVISIBLE = 1L; // 0x1L
- field public static final java.lang.String PACKAGE_NAME = "packageName";
- field public static final java.lang.String PHOTO_SUPPORT = "photoSupport";
+ field public static final String PACKAGE_NAME = "packageName";
+ field public static final String PHOTO_SUPPORT = "photoSupport";
field public static final int PHOTO_SUPPORT_FULL = 3; // 0x3
field public static final int PHOTO_SUPPORT_FULL_SIZE_ONLY = 2; // 0x2
field public static final int PHOTO_SUPPORT_NONE = 0; // 0x0
field public static final int PHOTO_SUPPORT_THUMBNAIL_ONLY = 1; // 0x1
- field public static final java.lang.String SHORTCUT_SUPPORT = "shortcutSupport";
+ field public static final String SHORTCUT_SUPPORT = "shortcutSupport";
field public static final int SHORTCUT_SUPPORT_DATA_ITEMS_ONLY = 1; // 0x1
field public static final int SHORTCUT_SUPPORT_FULL = 2; // 0x2
field public static final int SHORTCUT_SUPPORT_NONE = 0; // 0x0
- field public static final java.lang.String TYPE_RESOURCE_ID = "typeResourceId";
+ field public static final String TYPE_RESOURCE_ID = "typeResourceId";
}
- public static abstract interface ContactsContract.DisplayNameSources {
+ public static interface ContactsContract.DisplayNameSources {
field public static final int EMAIL = 10; // 0xa
field public static final int NICKNAME = 35; // 0x23
field public static final int ORGANIZATION = 30; // 0x1e
@@ -37351,11 +37615,11 @@ package android.provider {
public static final class ContactsContract.DisplayPhoto {
field public static final android.net.Uri CONTENT_MAX_DIMENSIONS_URI;
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DISPLAY_MAX_DIM = "display_max_dim";
- field public static final java.lang.String THUMBNAIL_MAX_DIM = "thumbnail_max_dim";
+ field public static final String DISPLAY_MAX_DIM = "display_max_dim";
+ field public static final String THUMBNAIL_MAX_DIM = "thumbnail_max_dim";
}
- public static abstract interface ContactsContract.FullNameStyle {
+ public static interface ContactsContract.FullNameStyle {
field public static final int CHINESE = 3; // 0x3
field public static final int CJK = 2; // 0x2
field public static final int JAPANESE = 4; // 0x4
@@ -37366,98 +37630,98 @@ package android.provider {
public static final class ContactsContract.Groups implements android.provider.BaseColumns android.provider.ContactsContract.GroupsColumns android.provider.ContactsContract.SyncColumns {
method public static android.content.EntityIterator newEntityIterator(android.database.Cursor);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/group";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/group";
field public static final android.net.Uri CONTENT_SUMMARY_URI;
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/group";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/group";
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface ContactsContract.GroupsColumns {
- field public static final java.lang.String AUTO_ADD = "auto_add";
- field public static final java.lang.String DATA_SET = "data_set";
- field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String FAVORITES = "favorites";
- field public static final java.lang.String GROUP_IS_READ_ONLY = "group_is_read_only";
- field public static final java.lang.String GROUP_VISIBLE = "group_visible";
- field public static final java.lang.String NOTES = "notes";
- field public static final java.lang.String RES_PACKAGE = "res_package";
- field public static final java.lang.String SHOULD_SYNC = "should_sync";
- field public static final java.lang.String SUMMARY_COUNT = "summ_count";
- field public static final java.lang.String SUMMARY_WITH_PHONES = "summ_phones";
- field public static final java.lang.String SYSTEM_ID = "system_id";
- field public static final java.lang.String TITLE = "title";
- field public static final java.lang.String TITLE_RES = "title_res";
+ protected static interface ContactsContract.GroupsColumns {
+ field public static final String AUTO_ADD = "auto_add";
+ field public static final String DATA_SET = "data_set";
+ field public static final String DELETED = "deleted";
+ field public static final String FAVORITES = "favorites";
+ field public static final String GROUP_IS_READ_ONLY = "group_is_read_only";
+ field public static final String GROUP_VISIBLE = "group_visible";
+ field public static final String NOTES = "notes";
+ field public static final String RES_PACKAGE = "res_package";
+ field public static final String SHOULD_SYNC = "should_sync";
+ field public static final String SUMMARY_COUNT = "summ_count";
+ field public static final String SUMMARY_WITH_PHONES = "summ_phones";
+ field public static final String SYSTEM_ID = "system_id";
+ field public static final String TITLE = "title";
+ field public static final String TITLE_RES = "title_res";
}
public static final class ContactsContract.Intents {
ctor public ContactsContract.Intents();
- field public static final java.lang.String ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS = "android.provider.action.VOICE_SEND_MESSAGE_TO_CONTACTS";
- field public static final java.lang.String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
- field public static final java.lang.String CONTACTS_DATABASE_CREATED = "android.provider.Contacts.DATABASE_CREATED";
- field public static final java.lang.String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
- field public static final java.lang.String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
- field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
- field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
- field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
- field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
- field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
- field public static final java.lang.String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
- field public static final java.lang.String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
- field public static final java.lang.String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
- field public static final java.lang.String SHOW_OR_CREATE_CONTACT = "com.android.contacts.action.SHOW_OR_CREATE_CONTACT";
+ field public static final String ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS = "android.provider.action.VOICE_SEND_MESSAGE_TO_CONTACTS";
+ field public static final String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
+ field public static final String CONTACTS_DATABASE_CREATED = "android.provider.Contacts.DATABASE_CREATED";
+ field public static final String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
+ field public static final String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
+ field public static final String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
+ field public static final String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
+ field public static final String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
+ field public static final String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
+ field public static final String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
+ field public static final String METADATA_MIMETYPE = "android.provider.mimetype";
+ field public static final String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
+ field public static final String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
+ field public static final String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
+ field public static final String SHOW_OR_CREATE_CONTACT = "com.android.contacts.action.SHOW_OR_CREATE_CONTACT";
}
public static final class ContactsContract.Intents.Insert {
ctor public ContactsContract.Intents.Insert();
- field public static final java.lang.String ACTION = "android.intent.action.INSERT";
- field public static final java.lang.String COMPANY = "company";
- field public static final java.lang.String DATA = "data";
- field public static final java.lang.String EMAIL = "email";
- field public static final java.lang.String EMAIL_ISPRIMARY = "email_isprimary";
- field public static final java.lang.String EMAIL_TYPE = "email_type";
- field public static final java.lang.String EXTRA_ACCOUNT = "android.provider.extra.ACCOUNT";
- field public static final java.lang.String EXTRA_DATA_SET = "android.provider.extra.DATA_SET";
- field public static final java.lang.String FULL_MODE = "full_mode";
- field public static final java.lang.String IM_HANDLE = "im_handle";
- field public static final java.lang.String IM_ISPRIMARY = "im_isprimary";
- field public static final java.lang.String IM_PROTOCOL = "im_protocol";
- field public static final java.lang.String JOB_TITLE = "job_title";
- field public static final java.lang.String NAME = "name";
- field public static final java.lang.String NOTES = "notes";
- field public static final java.lang.String PHONE = "phone";
- field public static final java.lang.String PHONETIC_NAME = "phonetic_name";
- field public static final java.lang.String PHONE_ISPRIMARY = "phone_isprimary";
- field public static final java.lang.String PHONE_TYPE = "phone_type";
- field public static final java.lang.String POSTAL = "postal";
- field public static final java.lang.String POSTAL_ISPRIMARY = "postal_isprimary";
- field public static final java.lang.String POSTAL_TYPE = "postal_type";
- field public static final java.lang.String SECONDARY_EMAIL = "secondary_email";
- field public static final java.lang.String SECONDARY_EMAIL_TYPE = "secondary_email_type";
- field public static final java.lang.String SECONDARY_PHONE = "secondary_phone";
- field public static final java.lang.String SECONDARY_PHONE_TYPE = "secondary_phone_type";
- field public static final java.lang.String TERTIARY_EMAIL = "tertiary_email";
- field public static final java.lang.String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
- field public static final java.lang.String TERTIARY_PHONE = "tertiary_phone";
- field public static final java.lang.String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
+ field public static final String ACTION = "android.intent.action.INSERT";
+ field public static final String COMPANY = "company";
+ field public static final String DATA = "data";
+ field public static final String EMAIL = "email";
+ field public static final String EMAIL_ISPRIMARY = "email_isprimary";
+ field public static final String EMAIL_TYPE = "email_type";
+ field public static final String EXTRA_ACCOUNT = "android.provider.extra.ACCOUNT";
+ field public static final String EXTRA_DATA_SET = "android.provider.extra.DATA_SET";
+ field public static final String FULL_MODE = "full_mode";
+ field public static final String IM_HANDLE = "im_handle";
+ field public static final String IM_ISPRIMARY = "im_isprimary";
+ field public static final String IM_PROTOCOL = "im_protocol";
+ field public static final String JOB_TITLE = "job_title";
+ field public static final String NAME = "name";
+ field public static final String NOTES = "notes";
+ field public static final String PHONE = "phone";
+ field public static final String PHONETIC_NAME = "phonetic_name";
+ field public static final String PHONE_ISPRIMARY = "phone_isprimary";
+ field public static final String PHONE_TYPE = "phone_type";
+ field public static final String POSTAL = "postal";
+ field public static final String POSTAL_ISPRIMARY = "postal_isprimary";
+ field public static final String POSTAL_TYPE = "postal_type";
+ field public static final String SECONDARY_EMAIL = "secondary_email";
+ field public static final String SECONDARY_EMAIL_TYPE = "secondary_email_type";
+ field public static final String SECONDARY_PHONE = "secondary_phone";
+ field public static final String SECONDARY_PHONE_TYPE = "secondary_phone_type";
+ field public static final String TERTIARY_EMAIL = "tertiary_email";
+ field public static final String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
+ field public static final String TERTIARY_PHONE = "tertiary_phone";
+ field public static final String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
}
public static final class ContactsContract.PhoneLookup implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactsColumns android.provider.ContactsContract.PhoneLookupColumns {
field public static final android.net.Uri CONTENT_FILTER_URI;
field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI;
- field public static final java.lang.String QUERY_PARAMETER_SIP_ADDRESS = "sip";
+ field public static final String QUERY_PARAMETER_SIP_ADDRESS = "sip";
}
- protected static abstract interface ContactsContract.PhoneLookupColumns {
- field public static final java.lang.String CONTACT_ID = "contact_id";
- field public static final java.lang.String DATA_ID = "data_id";
- field public static final java.lang.String LABEL = "label";
- field public static final java.lang.String NORMALIZED_NUMBER = "normalized_number";
- field public static final java.lang.String NUMBER = "number";
- field public static final java.lang.String TYPE = "type";
+ protected static interface ContactsContract.PhoneLookupColumns {
+ field public static final String CONTACT_ID = "contact_id";
+ field public static final String DATA_ID = "data_id";
+ field public static final String LABEL = "label";
+ field public static final String NORMALIZED_NUMBER = "normalized_number";
+ field public static final String NUMBER = "number";
+ field public static final String TYPE = "type";
}
- public static abstract interface ContactsContract.PhoneticNameStyle {
+ public static interface ContactsContract.PhoneticNameStyle {
field public static final int JAPANESE = 4; // 0x4
field public static final int KOREAN = 5; // 0x5
field public static final int PINYIN = 3; // 0x3
@@ -37472,16 +37736,16 @@ package android.provider {
field public static final int UNPINNED = 0; // 0x0
}
- public static final deprecated class ContactsContract.Presence extends android.provider.ContactsContract.StatusUpdates {
- ctor public ContactsContract.Presence();
+ @Deprecated public static final class ContactsContract.Presence extends android.provider.ContactsContract.StatusUpdates {
+ ctor @Deprecated public ContactsContract.Presence();
}
- protected static abstract interface ContactsContract.PresenceColumns {
- field public static final java.lang.String CUSTOM_PROTOCOL = "custom_protocol";
- field public static final java.lang.String DATA_ID = "presence_data_id";
- field public static final java.lang.String IM_ACCOUNT = "im_account";
- field public static final java.lang.String IM_HANDLE = "im_handle";
- field public static final java.lang.String PROTOCOL = "protocol";
+ protected static interface ContactsContract.PresenceColumns {
+ field public static final String CUSTOM_PROTOCOL = "custom_protocol";
+ field public static final String DATA_ID = "presence_data_id";
+ field public static final String IM_ACCOUNT = "im_account";
+ field public static final String IM_HANDLE = "im_handle";
+ field public static final String PROTOCOL = "protocol";
}
public static final class ContactsContract.Profile implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns {
@@ -37493,18 +37757,18 @@ package android.provider {
public static final class ContactsContract.ProfileSyncState implements android.provider.SyncStateContract.Columns {
method public static byte[] get(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
- method public static android.util.Pair<android.net.Uri, byte[]> getWithUri(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
+ method public static android.util.Pair<android.net.Uri,byte[]> getWithUri(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
method public static android.content.ContentProviderOperation newSetOperation(android.accounts.Account, byte[]);
method public static void set(android.content.ContentProviderClient, android.accounts.Account, byte[]) throws android.os.RemoteException;
- field public static final java.lang.String CONTENT_DIRECTORY = "syncstate";
+ field public static final String CONTENT_DIRECTORY = "syncstate";
field public static final android.net.Uri CONTENT_URI;
}
public static final class ContactsContract.ProviderStatus {
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/provider_status";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/provider_status";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DATABASE_CREATION_TIMESTAMP = "database_creation_timestamp";
- field public static final java.lang.String STATUS = "status";
+ field public static final String DATABASE_CREATION_TIMESTAMP = "database_creation_timestamp";
+ field public static final String STATUS = "status";
field public static final int STATUS_BUSY = 1; // 0x1
field public static final int STATUS_EMPTY = 2; // 0x2
field public static final int STATUS_NORMAL = 0; // 0x0
@@ -37512,14 +37776,14 @@ package android.provider {
public static final class ContactsContract.QuickContact {
ctor public ContactsContract.QuickContact();
- method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, int, java.lang.String[]);
- method public static void showQuickContact(android.content.Context, android.graphics.Rect, android.net.Uri, int, java.lang.String[]);
- method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, java.lang.String[], java.lang.String);
- method public static void showQuickContact(android.content.Context, android.graphics.Rect, android.net.Uri, java.lang.String[], java.lang.String);
- field public static final java.lang.String ACTION_QUICK_CONTACT = "android.provider.action.QUICK_CONTACT";
- field public static final java.lang.String EXTRA_EXCLUDE_MIMES = "android.provider.extra.EXCLUDE_MIMES";
- field public static final java.lang.String EXTRA_MODE = "android.provider.extra.MODE";
- field public static final java.lang.String EXTRA_PRIORITIZED_MIMETYPE = "android.provider.extra.PRIORITIZED_MIMETYPE";
+ method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, int, String[]);
+ method public static void showQuickContact(android.content.Context, android.graphics.Rect, android.net.Uri, int, String[]);
+ method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, String[], String);
+ method public static void showQuickContact(android.content.Context, android.graphics.Rect, android.net.Uri, String[], String);
+ field public static final String ACTION_QUICK_CONTACT = "android.provider.action.QUICK_CONTACT";
+ field public static final String EXTRA_EXCLUDE_MIMES = "android.provider.extra.EXCLUDE_MIMES";
+ field public static final String EXTRA_MODE = "android.provider.extra.MODE";
+ field public static final String EXTRA_PRIORITIZED_MIMETYPE = "android.provider.extra.PRIORITIZED_MIMETYPE";
field public static final int MODE_LARGE = 3; // 0x3
field public static final int MODE_MEDIUM = 2; // 0x2
field public static final int MODE_SMALL = 1; // 0x1
@@ -37530,186 +37794,186 @@ package android.provider {
method public static android.content.EntityIterator newEntityIterator(android.database.Cursor);
field public static final int AGGREGATION_MODE_DEFAULT = 0; // 0x0
field public static final int AGGREGATION_MODE_DISABLED = 3; // 0x3
- field public static final deprecated int AGGREGATION_MODE_IMMEDIATE = 1; // 0x1
+ field @Deprecated public static final int AGGREGATION_MODE_IMMEDIATE = 1; // 0x1
field public static final int AGGREGATION_MODE_SUSPENDED = 2; // 0x2
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/raw_contact";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/raw_contact";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact";
field public static final android.net.Uri CONTENT_URI;
}
public static final class ContactsContract.RawContacts.Data implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns {
- field public static final java.lang.String CONTENT_DIRECTORY = "data";
+ field public static final String CONTENT_DIRECTORY = "data";
}
public static final class ContactsContract.RawContacts.DisplayPhoto {
- field public static final java.lang.String CONTENT_DIRECTORY = "display_photo";
+ field public static final String CONTENT_DIRECTORY = "display_photo";
}
public static final class ContactsContract.RawContacts.Entity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns {
- field public static final java.lang.String CONTENT_DIRECTORY = "entity";
- field public static final java.lang.String DATA_ID = "data_id";
+ field public static final String CONTENT_DIRECTORY = "entity";
+ field public static final String DATA_ID = "data_id";
}
- protected static abstract interface ContactsContract.RawContactsColumns {
- field public static final java.lang.String ACCOUNT_TYPE_AND_DATA_SET = "account_type_and_data_set";
- field public static final java.lang.String AGGREGATION_MODE = "aggregation_mode";
- field public static final java.lang.String BACKUP_ID = "backup_id";
- field public static final java.lang.String CONTACT_ID = "contact_id";
- field public static final java.lang.String DATA_SET = "data_set";
- field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String METADATA_DIRTY = "metadata_dirty";
- field public static final java.lang.String RAW_CONTACT_IS_READ_ONLY = "raw_contact_is_read_only";
- field public static final java.lang.String RAW_CONTACT_IS_USER_PROFILE = "raw_contact_is_user_profile";
+ protected static interface ContactsContract.RawContactsColumns {
+ field public static final String ACCOUNT_TYPE_AND_DATA_SET = "account_type_and_data_set";
+ field public static final String AGGREGATION_MODE = "aggregation_mode";
+ field public static final String BACKUP_ID = "backup_id";
+ field public static final String CONTACT_ID = "contact_id";
+ field public static final String DATA_SET = "data_set";
+ field public static final String DELETED = "deleted";
+ field public static final String METADATA_DIRTY = "metadata_dirty";
+ field public static final String RAW_CONTACT_IS_READ_ONLY = "raw_contact_is_read_only";
+ field public static final String RAW_CONTACT_IS_USER_PROFILE = "raw_contact_is_user_profile";
}
public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns {
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact_entity";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact_entity";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DATA_ID = "data_id";
+ field public static final String DATA_ID = "data_id";
field public static final android.net.Uri PROFILE_CONTENT_URI;
}
public static class ContactsContract.SearchSnippets {
ctor public ContactsContract.SearchSnippets();
- field public static final java.lang.String DEFERRED_SNIPPETING_KEY = "deferred_snippeting";
- field public static final java.lang.String SNIPPET = "snippet";
+ field public static final String DEFERRED_SNIPPETING_KEY = "deferred_snippeting";
+ field public static final String SNIPPET = "snippet";
}
public static final class ContactsContract.Settings implements android.provider.ContactsContract.SettingsColumns {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/setting";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/setting";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/setting";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/setting";
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface ContactsContract.SettingsColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String ANY_UNSYNCED = "any_unsynced";
- field public static final java.lang.String DATA_SET = "data_set";
- field public static final java.lang.String SHOULD_SYNC = "should_sync";
- field public static final java.lang.String UNGROUPED_COUNT = "summ_count";
- field public static final java.lang.String UNGROUPED_VISIBLE = "ungrouped_visible";
- field public static final java.lang.String UNGROUPED_WITH_PHONES = "summ_phones";
+ protected static interface ContactsContract.SettingsColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String ANY_UNSYNCED = "any_unsynced";
+ field public static final String DATA_SET = "data_set";
+ field public static final String SHOULD_SYNC = "should_sync";
+ field public static final String UNGROUPED_COUNT = "summ_count";
+ field public static final String UNGROUPED_VISIBLE = "ungrouped_visible";
+ field public static final String UNGROUPED_WITH_PHONES = "summ_phones";
}
- protected static abstract interface ContactsContract.StatusColumns {
+ protected static interface ContactsContract.StatusColumns {
field public static final int AVAILABLE = 5; // 0x5
field public static final int AWAY = 2; // 0x2
field public static final int CAPABILITY_HAS_CAMERA = 4; // 0x4
field public static final int CAPABILITY_HAS_VIDEO = 2; // 0x2
field public static final int CAPABILITY_HAS_VOICE = 1; // 0x1
- field public static final java.lang.String CHAT_CAPABILITY = "chat_capability";
+ field public static final String CHAT_CAPABILITY = "chat_capability";
field public static final int DO_NOT_DISTURB = 4; // 0x4
field public static final int IDLE = 3; // 0x3
field public static final int INVISIBLE = 1; // 0x1
field public static final int OFFLINE = 0; // 0x0
- field public static final java.lang.String PRESENCE = "mode";
- field public static final deprecated java.lang.String PRESENCE_CUSTOM_STATUS = "status";
- field public static final deprecated java.lang.String PRESENCE_STATUS = "mode";
- field public static final java.lang.String STATUS = "status";
- field public static final java.lang.String STATUS_ICON = "status_icon";
- field public static final java.lang.String STATUS_LABEL = "status_label";
- field public static final java.lang.String STATUS_RES_PACKAGE = "status_res_package";
- field public static final java.lang.String STATUS_TIMESTAMP = "status_ts";
+ field public static final String PRESENCE = "mode";
+ field @Deprecated public static final String PRESENCE_CUSTOM_STATUS = "status";
+ field @Deprecated public static final String PRESENCE_STATUS = "mode";
+ field public static final String STATUS = "status";
+ field public static final String STATUS_ICON = "status_icon";
+ field public static final String STATUS_LABEL = "status_label";
+ field public static final String STATUS_RES_PACKAGE = "status_res_package";
+ field public static final String STATUS_TIMESTAMP = "status_ts";
}
public static class ContactsContract.StatusUpdates implements android.provider.ContactsContract.PresenceColumns android.provider.ContactsContract.StatusColumns {
method public static final int getPresenceIconResourceId(int);
method public static final int getPresencePrecedence(int);
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/status-update";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/status-update";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/status-update";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/status-update";
field public static final android.net.Uri CONTENT_URI;
field public static final android.net.Uri PROFILE_CONTENT_URI;
}
- protected static abstract interface ContactsContract.SyncColumns implements android.provider.ContactsContract.BaseSyncColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String DIRTY = "dirty";
- field public static final java.lang.String SOURCE_ID = "sourceid";
- field public static final java.lang.String VERSION = "version";
+ protected static interface ContactsContract.SyncColumns extends android.provider.ContactsContract.BaseSyncColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String DIRTY = "dirty";
+ field public static final String SOURCE_ID = "sourceid";
+ field public static final String VERSION = "version";
}
public static final class ContactsContract.SyncState implements android.provider.SyncStateContract.Columns {
method public static byte[] get(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
- method public static android.util.Pair<android.net.Uri, byte[]> getWithUri(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
+ method public static android.util.Pair<android.net.Uri,byte[]> getWithUri(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
method public static android.content.ContentProviderOperation newSetOperation(android.accounts.Account, byte[]);
method public static void set(android.content.ContentProviderClient, android.accounts.Account, byte[]) throws android.os.RemoteException;
- field public static final java.lang.String CONTENT_DIRECTORY = "syncstate";
+ field public static final String CONTENT_DIRECTORY = "syncstate";
field public static final android.net.Uri CONTENT_URI;
}
public final class DocumentsContract {
- method public static android.net.Uri buildChildDocumentsUri(java.lang.String, java.lang.String);
- method public static android.net.Uri buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String);
- method public static android.net.Uri buildDocumentUri(java.lang.String, java.lang.String);
- method public static android.net.Uri buildDocumentUriUsingTree(android.net.Uri, java.lang.String);
- method public static android.net.Uri buildRecentDocumentsUri(java.lang.String, java.lang.String);
- method public static android.net.Uri buildRootUri(java.lang.String, java.lang.String);
- method public static android.net.Uri buildRootsUri(java.lang.String);
- method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
- method public static android.net.Uri buildTreeDocumentUri(java.lang.String, java.lang.String);
+ method public static android.net.Uri buildChildDocumentsUri(String, String);
+ method public static android.net.Uri buildChildDocumentsUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri buildDocumentUri(String, String);
+ method public static android.net.Uri buildDocumentUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri buildRecentDocumentsUri(String, String);
+ method public static android.net.Uri buildRootUri(String, String);
+ method public static android.net.Uri buildRootsUri(String);
+ method public static android.net.Uri buildSearchDocumentsUri(String, String, String);
+ method public static android.net.Uri buildTreeDocumentUri(String, String);
method public static android.net.Uri copyDocument(android.content.ContentInterface, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static android.net.Uri createDocument(android.content.ContentInterface, android.net.Uri, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public static deprecated android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri createDocument(android.content.ContentInterface, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
method public static android.content.IntentSender createWebLinkIntent(android.content.ContentInterface, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
- method public static deprecated android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
method public static boolean deleteDocument(android.content.ContentInterface, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated boolean deleteDocument(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method @Deprecated public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
method public static void ejectRoot(android.content.ContentInterface, android.net.Uri);
- method public static deprecated void ejectRoot(android.content.ContentResolver, android.net.Uri);
+ method @Deprecated public static void ejectRoot(android.content.ContentResolver, android.net.Uri);
method public static android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentInterface, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
- method public static java.lang.String getDocumentId(android.net.Uri);
+ method @Deprecated public static android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static String getDocumentId(android.net.Uri);
method public static android.os.Bundle getDocumentMetadata(android.content.ContentInterface, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated android.os.Bundle getDocumentMetadata(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.os.Bundle getDocumentMetadata(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentInterface, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public static deprecated android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public static java.lang.String getRootId(android.net.Uri);
- method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
- method public static java.lang.String getTreeDocumentId(android.net.Uri);
+ method @Deprecated public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public static String getRootId(android.net.Uri);
+ method public static String getSearchDocumentsQuery(android.net.Uri);
+ method public static String getTreeDocumentId(android.net.Uri);
method public static boolean isChildDocument(android.content.ContentInterface, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated boolean isChildDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
- method public static boolean isRootUri(android.content.Context, android.net.Uri);
- method public static boolean isRootsUri(android.content.Context, android.net.Uri);
+ method @Deprecated public static boolean isChildDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static boolean isDocumentUri(android.content.Context, @Nullable android.net.Uri);
+ method public static boolean isRootUri(android.content.Context, @Nullable android.net.Uri);
+ method public static boolean isRootsUri(android.content.Context, @Nullable android.net.Uri);
method public static boolean isTreeUri(android.net.Uri);
method public static android.net.Uri moveDocument(android.content.ContentInterface, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
method public static boolean removeDocument(android.content.ContentInterface, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static deprecated boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
- method public static android.net.Uri renameDocument(android.content.ContentInterface, android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public static deprecated android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- field public static final java.lang.String ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
- field public static final java.lang.String EXTRA_ERROR = "error";
- field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF";
- field public static final java.lang.String EXTRA_INFO = "info";
- field public static final java.lang.String EXTRA_INITIAL_URI = "android.provider.extra.INITIAL_URI";
- field public static final java.lang.String EXTRA_LOADING = "loading";
- field public static final java.lang.String EXTRA_ORIENTATION = "android.provider.extra.ORIENTATION";
- field public static final java.lang.String EXTRA_PROMPT = "android.provider.extra.PROMPT";
- field public static final java.lang.String METADATA_EXIF = "android:documentExif";
- field public static final java.lang.String METADATA_TREE_COUNT = "android:metadataTreeCount";
- field public static final java.lang.String METADATA_TREE_SIZE = "android:metadataTreeSize";
- field public static final java.lang.String METADATA_TYPES = "android:documentMetadataTypes";
- field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER";
- field public static final java.lang.String QUERY_ARG_DISPLAY_NAME = "android:query-arg-display-name";
- field public static final java.lang.String QUERY_ARG_EXCLUDE_MEDIA = "android:query-arg-exclude-media";
- field public static final java.lang.String QUERY_ARG_FILE_SIZE_OVER = "android:query-arg-file-size-over";
- field public static final java.lang.String QUERY_ARG_LAST_MODIFIED_AFTER = "android:query-arg-last-modified-after";
- field public static final java.lang.String QUERY_ARG_MIME_TYPES = "android:query-arg-mime-types";
+ method @Deprecated public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri renameDocument(android.content.ContentInterface, android.net.Uri, String) throws java.io.FileNotFoundException;
+ method @Deprecated public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+ field public static final String ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
+ field public static final String EXTRA_ERROR = "error";
+ field public static final String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF";
+ field public static final String EXTRA_INFO = "info";
+ field public static final String EXTRA_INITIAL_URI = "android.provider.extra.INITIAL_URI";
+ field public static final String EXTRA_LOADING = "loading";
+ field public static final String EXTRA_ORIENTATION = "android.provider.extra.ORIENTATION";
+ field public static final String EXTRA_PROMPT = "android.provider.extra.PROMPT";
+ field public static final String METADATA_EXIF = "android:documentExif";
+ field public static final String METADATA_TREE_COUNT = "android:metadataTreeCount";
+ field public static final String METADATA_TREE_SIZE = "android:metadataTreeSize";
+ field public static final String METADATA_TYPES = "android:documentMetadataTypes";
+ field public static final String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER";
+ field public static final String QUERY_ARG_DISPLAY_NAME = "android:query-arg-display-name";
+ field public static final String QUERY_ARG_EXCLUDE_MEDIA = "android:query-arg-exclude-media";
+ field public static final String QUERY_ARG_FILE_SIZE_OVER = "android:query-arg-file-size-over";
+ field public static final String QUERY_ARG_LAST_MODIFIED_AFTER = "android:query-arg-last-modified-after";
+ field public static final String QUERY_ARG_MIME_TYPES = "android:query-arg-mime-types";
}
public static final class DocumentsContract.Document {
- field public static final java.lang.String COLUMN_DISPLAY_NAME = "_display_name";
- field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
- field public static final java.lang.String COLUMN_FLAGS = "flags";
- field public static final java.lang.String COLUMN_ICON = "icon";
- field public static final java.lang.String COLUMN_LAST_MODIFIED = "last_modified";
- field public static final java.lang.String COLUMN_MIME_TYPE = "mime_type";
- field public static final java.lang.String COLUMN_SIZE = "_size";
- field public static final java.lang.String COLUMN_SUMMARY = "summary";
+ field public static final String COLUMN_DISPLAY_NAME = "_display_name";
+ field public static final String COLUMN_DOCUMENT_ID = "document_id";
+ field public static final String COLUMN_FLAGS = "flags";
+ field public static final String COLUMN_ICON = "icon";
+ field public static final String COLUMN_LAST_MODIFIED = "last_modified";
+ field public static final String COLUMN_MIME_TYPE = "mime_type";
+ field public static final String COLUMN_SIZE = "_size";
+ field public static final String COLUMN_SUMMARY = "summary";
field public static final int FLAG_DIR_PREFERS_GRID = 16; // 0x10
field public static final int FLAG_DIR_PREFERS_LAST_MODIFIED = 32; // 0x20
field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8
@@ -37725,28 +37989,28 @@ package android.provider {
field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2
field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
field public static final int FLAG_WEB_LINKABLE = 4096; // 0x1000
- field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.document/directory";
+ field public static final String MIME_TYPE_DIR = "vnd.android.document/directory";
}
public static final class DocumentsContract.Path implements android.os.Parcelable {
- ctor public DocumentsContract.Path(java.lang.String, java.util.List<java.lang.String>);
+ ctor public DocumentsContract.Path(@Nullable String, java.util.List<java.lang.String>);
method public int describeContents();
method public java.util.List<java.lang.String> getPath();
- method public java.lang.String getRootId();
+ method @Nullable public String getRootId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.provider.DocumentsContract.Path> CREATOR;
}
public static final class DocumentsContract.Root {
- field public static final java.lang.String COLUMN_AVAILABLE_BYTES = "available_bytes";
- field public static final java.lang.String COLUMN_CAPACITY_BYTES = "capacity_bytes";
- field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
- field public static final java.lang.String COLUMN_FLAGS = "flags";
- field public static final java.lang.String COLUMN_ICON = "icon";
- field public static final java.lang.String COLUMN_MIME_TYPES = "mime_types";
- field public static final java.lang.String COLUMN_ROOT_ID = "root_id";
- field public static final java.lang.String COLUMN_SUMMARY = "summary";
- field public static final java.lang.String COLUMN_TITLE = "title";
+ field public static final String COLUMN_AVAILABLE_BYTES = "available_bytes";
+ field public static final String COLUMN_CAPACITY_BYTES = "capacity_bytes";
+ field public static final String COLUMN_DOCUMENT_ID = "document_id";
+ field public static final String COLUMN_FLAGS = "flags";
+ field public static final String COLUMN_ICON = "icon";
+ field public static final String COLUMN_MIME_TYPES = "mime_types";
+ field public static final String COLUMN_ROOT_ID = "root_id";
+ field public static final String COLUMN_SUMMARY = "summary";
+ field public static final String COLUMN_TITLE = "title";
field public static final int FLAG_EMPTY = 64; // 0x40
field public static final int FLAG_LOCAL_ONLY = 2; // 0x2
field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
@@ -37754,80 +38018,80 @@ package android.provider {
field public static final int FLAG_SUPPORTS_IS_CHILD = 16; // 0x10
field public static final int FLAG_SUPPORTS_RECENTS = 4; // 0x4
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
- field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.document/root";
+ field public static final String MIME_TYPE_ITEM = "vnd.android.document/root";
}
public abstract class DocumentsProvider extends android.content.ContentProvider {
ctor public DocumentsProvider();
- method public java.lang.String copyDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public android.content.IntentSender createWebLinkIntent(java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
- method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
- method public void ejectRoot(java.lang.String);
- method public android.provider.DocumentsContract.Path findDocumentPath(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public android.os.Bundle getDocumentMetadata(java.lang.String) throws java.io.FileNotFoundException;
- method public java.lang.String[] getDocumentStreamTypes(java.lang.String, java.lang.String);
- method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
- method public final java.lang.String getType(android.net.Uri);
+ method public String copyDocument(String, String) throws java.io.FileNotFoundException;
+ method public String createDocument(String, String, String) throws java.io.FileNotFoundException;
+ method public android.content.IntentSender createWebLinkIntent(String, @Nullable android.os.Bundle) throws java.io.FileNotFoundException;
+ method public final int delete(android.net.Uri, String, String[]);
+ method public void deleteDocument(String) throws java.io.FileNotFoundException;
+ method public void ejectRoot(String);
+ method public android.provider.DocumentsContract.Path findDocumentPath(@Nullable String, String) throws java.io.FileNotFoundException;
+ method @Nullable public android.os.Bundle getDocumentMetadata(String) throws java.io.FileNotFoundException;
+ method public String[] getDocumentStreamTypes(String, String);
+ method public String getDocumentType(String) throws java.io.FileNotFoundException;
+ method public final String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- method public boolean isChildDocument(java.lang.String, java.lang.String);
- method public java.lang.String moveDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public abstract android.os.ParcelFileDescriptor openDocument(java.lang.String, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public android.content.res.AssetFileDescriptor openDocumentThumbnail(java.lang.String, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
- method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
- method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public android.content.res.AssetFileDescriptor openTypedDocument(java.lang.String, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public final android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- method public abstract android.database.Cursor queryChildDocuments(java.lang.String, java.lang.String[], java.lang.String) throws java.io.FileNotFoundException;
- method public android.database.Cursor queryChildDocuments(java.lang.String, java.lang.String[], android.os.Bundle) throws java.io.FileNotFoundException;
- method public abstract android.database.Cursor queryDocument(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
- method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
- method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[], android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method public abstract android.database.Cursor queryRoots(java.lang.String[]) throws java.io.FileNotFoundException;
- method public android.database.Cursor querySearchDocuments(java.lang.String, java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
- method public android.database.Cursor querySearchDocuments(java.lang.String, java.lang.String[], android.os.Bundle) throws java.io.FileNotFoundException;
- method public void removeDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public java.lang.String renameDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public final void revokeDocumentPermission(java.lang.String);
- method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public boolean isChildDocument(String, String);
+ method public String moveDocument(String, String, String) throws java.io.FileNotFoundException;
+ method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, String) throws java.io.FileNotFoundException;
+ method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public abstract android.os.ParcelFileDescriptor openDocument(String, String, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public android.content.res.AssetFileDescriptor openDocumentThumbnail(String, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, String) throws java.io.FileNotFoundException;
+ method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, String, android.os.Bundle) throws java.io.FileNotFoundException;
+ method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public android.content.res.AssetFileDescriptor openTypedDocument(String, String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+ method public final android.database.Cursor query(android.net.Uri, String[], android.os.Bundle, android.os.CancellationSignal);
+ method public abstract android.database.Cursor queryChildDocuments(String, String[], String) throws java.io.FileNotFoundException;
+ method public android.database.Cursor queryChildDocuments(String, @Nullable String[], @Nullable android.os.Bundle) throws java.io.FileNotFoundException;
+ method public abstract android.database.Cursor queryDocument(String, String[]) throws java.io.FileNotFoundException;
+ method public android.database.Cursor queryRecentDocuments(String, String[]) throws java.io.FileNotFoundException;
+ method public android.database.Cursor queryRecentDocuments(String, String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
+ method public abstract android.database.Cursor queryRoots(String[]) throws java.io.FileNotFoundException;
+ method public android.database.Cursor querySearchDocuments(String, String, String[]) throws java.io.FileNotFoundException;
+ method public android.database.Cursor querySearchDocuments(String, String[], android.os.Bundle) throws java.io.FileNotFoundException;
+ method public void removeDocument(String, String) throws java.io.FileNotFoundException;
+ method public String renameDocument(String, String) throws java.io.FileNotFoundException;
+ method public final void revokeDocumentPermission(String);
+ method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
}
public final class FontRequest {
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+ ctor public FontRequest(@NonNull String, @NonNull String, @NonNull String);
+ ctor public FontRequest(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.List<java.util.List<byte[]>>);
method public java.util.List<java.util.List<byte[]>> getCertificates();
- method public java.lang.String getProviderAuthority();
- method public java.lang.String getProviderPackage();
- method public java.lang.String getQuery();
+ method public String getProviderAuthority();
+ method public String getProviderPackage();
+ method public String getQuery();
}
public class FontsContract {
- method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[]);
- method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
- method public static void requestFonts(android.content.Context, android.provider.FontRequest, android.os.Handler, android.os.CancellationSignal, android.provider.FontsContract.FontRequestCallback);
+ method public static android.graphics.Typeface buildTypeface(@NonNull android.content.Context, @Nullable android.os.CancellationSignal, @NonNull android.provider.FontsContract.FontInfo[]);
+ method @NonNull public static android.provider.FontsContract.FontFamilyResult fetchFonts(@NonNull android.content.Context, @Nullable android.os.CancellationSignal, @NonNull android.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFonts(@NonNull android.content.Context, @NonNull android.provider.FontRequest, @NonNull android.os.Handler, @Nullable android.os.CancellationSignal, @NonNull android.provider.FontsContract.FontRequestCallback);
}
public static final class FontsContract.Columns implements android.provider.BaseColumns {
- field public static final java.lang.String FILE_ID = "file_id";
- field public static final java.lang.String ITALIC = "font_italic";
- field public static final java.lang.String RESULT_CODE = "result_code";
+ field public static final String FILE_ID = "file_id";
+ field public static final String ITALIC = "font_italic";
+ field public static final String RESULT_CODE = "result_code";
field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
field public static final int RESULT_CODE_OK = 0; // 0x0
- field public static final java.lang.String TTC_INDEX = "font_ttc_index";
- field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
- field public static final java.lang.String WEIGHT = "font_weight";
+ field public static final String TTC_INDEX = "font_ttc_index";
+ field public static final String VARIATION_SETTINGS = "font_variation_settings";
+ field public static final String WEIGHT = "font_weight";
}
public static class FontsContract.FontFamilyResult {
- method public android.provider.FontsContract.FontInfo[] getFonts();
+ method @NonNull public android.provider.FontsContract.FontInfo[] getFonts();
method public int getStatusCode();
field public static final int STATUS_OK = 0; // 0x0
field public static final int STATUS_REJECTED = 3; // 0x3
@@ -37836,11 +38100,11 @@ package android.provider {
}
public static class FontsContract.FontInfo {
- method public android.graphics.fonts.FontVariationAxis[] getAxes();
+ method @Nullable public android.graphics.fonts.FontVariationAxis[] getAxes();
method public int getResultCode();
- method public int getTtcIndex();
- method public android.net.Uri getUri();
- method public int getWeight();
+ method @IntRange(from=0) public int getTtcIndex();
+ method @NonNull public android.net.Uri getUri();
+ method @IntRange(from=1, to=1000) public int getWeight();
method public boolean isItalic();
}
@@ -37856,404 +38120,404 @@ package android.provider {
field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
}
- public final deprecated class LiveFolders implements android.provider.BaseColumns {
- field public static final java.lang.String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER";
- field public static final java.lang.String DESCRIPTION = "description";
- field public static final int DISPLAY_MODE_GRID = 1; // 0x1
- field public static final int DISPLAY_MODE_LIST = 2; // 0x2
- field public static final java.lang.String EXTRA_LIVE_FOLDER_BASE_INTENT = "android.intent.extra.livefolder.BASE_INTENT";
- field public static final java.lang.String EXTRA_LIVE_FOLDER_DISPLAY_MODE = "android.intent.extra.livefolder.DISPLAY_MODE";
- field public static final java.lang.String EXTRA_LIVE_FOLDER_ICON = "android.intent.extra.livefolder.ICON";
- field public static final java.lang.String EXTRA_LIVE_FOLDER_NAME = "android.intent.extra.livefolder.NAME";
- field public static final java.lang.String ICON_BITMAP = "icon_bitmap";
- field public static final java.lang.String ICON_PACKAGE = "icon_package";
- field public static final java.lang.String ICON_RESOURCE = "icon_resource";
- field public static final java.lang.String INTENT = "intent";
- field public static final java.lang.String NAME = "name";
+ @Deprecated public final class LiveFolders implements android.provider.BaseColumns {
+ field @Deprecated public static final String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER";
+ field @Deprecated public static final String DESCRIPTION = "description";
+ field @Deprecated public static final int DISPLAY_MODE_GRID = 1; // 0x1
+ field @Deprecated public static final int DISPLAY_MODE_LIST = 2; // 0x2
+ field @Deprecated public static final String EXTRA_LIVE_FOLDER_BASE_INTENT = "android.intent.extra.livefolder.BASE_INTENT";
+ field @Deprecated public static final String EXTRA_LIVE_FOLDER_DISPLAY_MODE = "android.intent.extra.livefolder.DISPLAY_MODE";
+ field @Deprecated public static final String EXTRA_LIVE_FOLDER_ICON = "android.intent.extra.livefolder.ICON";
+ field @Deprecated public static final String EXTRA_LIVE_FOLDER_NAME = "android.intent.extra.livefolder.NAME";
+ field @Deprecated public static final String ICON_BITMAP = "icon_bitmap";
+ field @Deprecated public static final String ICON_PACKAGE = "icon_package";
+ field @Deprecated public static final String ICON_RESOURCE = "icon_resource";
+ field @Deprecated public static final String INTENT = "intent";
+ field @Deprecated public static final String NAME = "name";
}
public final class MediaStore {
ctor public MediaStore();
- method public static android.net.Uri createPending(android.content.Context, android.provider.MediaStore.PendingParams);
- method public static java.util.Set<java.lang.String> getAllVolumeNames(android.content.Context);
+ method @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams);
+ method @NonNull public static java.util.Set<java.lang.String> getAllVolumeNames(android.content.Context);
method public static android.net.Uri getDocumentUri(android.content.Context, android.net.Uri);
method public static android.net.Uri getMediaScannerUri();
method public static android.net.Uri getMediaUri(android.content.Context, android.net.Uri);
- method public static java.lang.String getVersion(android.content.Context);
- method public static java.lang.String getVolumeName(android.net.Uri);
- method public static android.provider.MediaStore.PendingSession openPending(android.content.Context, android.net.Uri);
- method public static android.net.Uri setIncludePending(android.net.Uri);
- method public static android.net.Uri setIncludeTrashed(android.net.Uri);
- method public static android.net.Uri setRequireOriginal(android.net.Uri);
- method public static void trash(android.content.Context, android.net.Uri);
- method public static void trash(android.content.Context, android.net.Uri, long);
- method public static void untrash(android.content.Context, android.net.Uri);
- field public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
- field public static final java.lang.String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE";
- field public static final java.lang.String ACTION_REVIEW = "android.provider.action.REVIEW";
- field public static final java.lang.String ACTION_REVIEW_SECURE = "android.provider.action.REVIEW_SECURE";
- field public static final java.lang.String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
- field public static final java.lang.String AUTHORITY = "media";
+ method public static String getVersion(android.content.Context);
+ method @NonNull public static String getVolumeName(@NonNull android.net.Uri);
+ method @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri);
+ method @NonNull public static android.net.Uri setIncludePending(@NonNull android.net.Uri);
+ method @NonNull public static android.net.Uri setIncludeTrashed(@NonNull android.net.Uri);
+ method @NonNull public static android.net.Uri setRequireOriginal(@NonNull android.net.Uri);
+ method public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri);
+ method public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri, long);
+ method public static void untrash(@NonNull android.content.Context, @NonNull android.net.Uri);
+ field public static final String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
+ field public static final String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE";
+ field public static final String ACTION_REVIEW = "android.provider.action.REVIEW";
+ field public static final String ACTION_REVIEW_SECURE = "android.provider.action.REVIEW_SECURE";
+ field public static final String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
+ field public static final String AUTHORITY = "media";
field public static final android.net.Uri AUTHORITY_URI;
- field public static final java.lang.String EXTRA_BRIGHTNESS = "android.provider.extra.BRIGHTNESS";
- field public static final java.lang.String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
- field public static final java.lang.String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
- field public static final java.lang.String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
- field public static final java.lang.String EXTRA_MEDIA_ALBUM = "android.intent.extra.album";
- field public static final java.lang.String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
- field public static final java.lang.String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus";
- field public static final java.lang.String EXTRA_MEDIA_GENRE = "android.intent.extra.genre";
- field public static final java.lang.String EXTRA_MEDIA_PLAYLIST = "android.intent.extra.playlist";
- field public static final java.lang.String EXTRA_MEDIA_RADIO_CHANNEL = "android.intent.extra.radio_channel";
- field public static final java.lang.String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
- field public static final java.lang.String EXTRA_OUTPUT = "output";
- field public static final java.lang.String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
- field public static final java.lang.String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
- field public static final java.lang.String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit";
- field public static final java.lang.String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
- field public static final java.lang.String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH = "android.media.action.MEDIA_PLAY_FROM_SEARCH";
- field public static final java.lang.String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
- field public static final deprecated java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
- field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
- field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE";
- field public static final java.lang.String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH = "android.media.action.TEXT_OPEN_FROM_SEARCH";
- field public static final java.lang.String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
- field public static final java.lang.String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH = "android.media.action.VIDEO_PLAY_FROM_SEARCH";
- field public static final java.lang.String MEDIA_IGNORE_FILENAME = ".nomedia";
- field public static final java.lang.String MEDIA_SCANNER_VOLUME = "volume";
- field public static final java.lang.String META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE = "android.media.still_image_camera_preview_service";
- field public static final java.lang.String UNKNOWN_STRING = "<unknown>";
+ field public static final String EXTRA_BRIGHTNESS = "android.provider.extra.BRIGHTNESS";
+ field public static final String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
+ field public static final String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
+ field public static final String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
+ field public static final String EXTRA_MEDIA_ALBUM = "android.intent.extra.album";
+ field public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
+ field public static final String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus";
+ field public static final String EXTRA_MEDIA_GENRE = "android.intent.extra.genre";
+ field public static final String EXTRA_MEDIA_PLAYLIST = "android.intent.extra.playlist";
+ field public static final String EXTRA_MEDIA_RADIO_CHANNEL = "android.intent.extra.radio_channel";
+ field public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
+ field public static final String EXTRA_OUTPUT = "output";
+ field public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
+ field public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
+ field public static final String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit";
+ field public static final String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
+ field public static final String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH = "android.media.action.MEDIA_PLAY_FROM_SEARCH";
+ field public static final String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
+ field @Deprecated public static final String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
+ field public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
+ field public static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE";
+ field public static final String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH = "android.media.action.TEXT_OPEN_FROM_SEARCH";
+ field public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
+ field public static final String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH = "android.media.action.VIDEO_PLAY_FROM_SEARCH";
+ field public static final String MEDIA_IGNORE_FILENAME = ".nomedia";
+ field public static final String MEDIA_SCANNER_VOLUME = "volume";
+ field public static final String META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE = "android.media.still_image_camera_preview_service";
+ field public static final String UNKNOWN_STRING = "<unknown>";
}
public static final class MediaStore.Audio {
ctor public MediaStore.Audio();
- method public static java.lang.String keyFor(java.lang.String);
+ method public static String keyFor(String);
}
- public static abstract interface MediaStore.Audio.AlbumColumns {
- field public static final java.lang.String ALBUM = "album";
- field public static final deprecated java.lang.String ALBUM_ART = "album_art";
- field public static final java.lang.String ALBUM_ID = "album_id";
- field public static final java.lang.String ALBUM_KEY = "album_key";
- field public static final java.lang.String ARTIST = "artist";
- field public static final java.lang.String FIRST_YEAR = "minyear";
- field public static final java.lang.String LAST_YEAR = "maxyear";
- field public static final java.lang.String NUMBER_OF_SONGS = "numsongs";
- field public static final java.lang.String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist";
+ public static interface MediaStore.Audio.AlbumColumns {
+ field public static final String ALBUM = "album";
+ field @Deprecated public static final String ALBUM_ART = "album_art";
+ field public static final String ALBUM_ID = "album_id";
+ field public static final String ALBUM_KEY = "album_key";
+ field public static final String ARTIST = "artist";
+ field public static final String FIRST_YEAR = "minyear";
+ field public static final String LAST_YEAR = "maxyear";
+ field public static final String NUMBER_OF_SONGS = "numsongs";
+ field public static final String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist";
}
public static final class MediaStore.Audio.Albums implements android.provider.BaseColumns android.provider.MediaStore.Audio.AlbumColumns {
ctor public MediaStore.Audio.Albums();
- method public static android.net.Uri getContentUri(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/albums";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "album_key";
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album";
+ method public static android.net.Uri getContentUri(String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/albums";
+ field public static final String DEFAULT_SORT_ORDER = "album_key";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
- public static abstract interface MediaStore.Audio.ArtistColumns {
- field public static final java.lang.String ARTIST = "artist";
- field public static final java.lang.String ARTIST_KEY = "artist_key";
- field public static final java.lang.String NUMBER_OF_ALBUMS = "number_of_albums";
- field public static final java.lang.String NUMBER_OF_TRACKS = "number_of_tracks";
+ public static interface MediaStore.Audio.ArtistColumns {
+ field public static final String ARTIST = "artist";
+ field public static final String ARTIST_KEY = "artist_key";
+ field public static final String NUMBER_OF_ALBUMS = "number_of_albums";
+ field public static final String NUMBER_OF_TRACKS = "number_of_tracks";
}
public static final class MediaStore.Audio.Artists implements android.provider.BaseColumns android.provider.MediaStore.Audio.ArtistColumns {
ctor public MediaStore.Audio.Artists();
- method public static android.net.Uri getContentUri(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/artists";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "artist_key";
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist";
+ method public static android.net.Uri getContentUri(String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/artists";
+ field public static final String DEFAULT_SORT_ORDER = "artist_key";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static final class MediaStore.Audio.Artists.Albums implements android.provider.MediaStore.Audio.AlbumColumns {
ctor public MediaStore.Audio.Artists.Albums();
- method public static android.net.Uri getContentUri(java.lang.String, long);
- }
-
- public static abstract interface MediaStore.Audio.AudioColumns implements android.provider.MediaStore.MediaColumns {
- field public static final java.lang.String ALBUM = "album";
- field public static final java.lang.String ALBUM_ID = "album_id";
- field public static final java.lang.String ALBUM_KEY = "album_key";
- field public static final java.lang.String ARTIST = "artist";
- field public static final java.lang.String ARTIST_ID = "artist_id";
- field public static final java.lang.String ARTIST_KEY = "artist_key";
- field public static final java.lang.String BOOKMARK = "bookmark";
- field public static final java.lang.String COMPOSER = "composer";
- field public static final java.lang.String DURATION = "duration";
- field public static final java.lang.String IS_ALARM = "is_alarm";
- field public static final java.lang.String IS_AUDIOBOOK = "is_audiobook";
- field public static final java.lang.String IS_MUSIC = "is_music";
- field public static final java.lang.String IS_NOTIFICATION = "is_notification";
- field public static final java.lang.String IS_PODCAST = "is_podcast";
- field public static final java.lang.String IS_RINGTONE = "is_ringtone";
- field public static final java.lang.String TITLE_KEY = "title_key";
- field public static final java.lang.String TRACK = "track";
- field public static final java.lang.String YEAR = "year";
+ method public static android.net.Uri getContentUri(String, long);
+ }
+
+ public static interface MediaStore.Audio.AudioColumns extends android.provider.MediaStore.MediaColumns {
+ field public static final String ALBUM = "album";
+ field public static final String ALBUM_ID = "album_id";
+ field public static final String ALBUM_KEY = "album_key";
+ field public static final String ARTIST = "artist";
+ field public static final String ARTIST_ID = "artist_id";
+ field public static final String ARTIST_KEY = "artist_key";
+ field public static final String BOOKMARK = "bookmark";
+ field public static final String COMPOSER = "composer";
+ field public static final String DURATION = "duration";
+ field public static final String IS_ALARM = "is_alarm";
+ field public static final String IS_AUDIOBOOK = "is_audiobook";
+ field public static final String IS_MUSIC = "is_music";
+ field public static final String IS_NOTIFICATION = "is_notification";
+ field public static final String IS_PODCAST = "is_podcast";
+ field public static final String IS_RINGTONE = "is_ringtone";
+ field public static final String TITLE_KEY = "title_key";
+ field public static final String TRACK = "track";
+ field public static final String YEAR = "year";
}
public static final class MediaStore.Audio.Genres implements android.provider.BaseColumns android.provider.MediaStore.Audio.GenresColumns {
ctor public MediaStore.Audio.Genres();
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static android.net.Uri getContentUriForAudioId(java.lang.String, int);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/genre";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "name";
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre";
+ method public static android.net.Uri getContentUri(String);
+ method public static android.net.Uri getContentUriForAudioId(String, int);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/genre";
+ field public static final String DEFAULT_SORT_ORDER = "name";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static final class MediaStore.Audio.Genres.Members implements android.provider.MediaStore.Audio.AudioColumns {
ctor public MediaStore.Audio.Genres.Members();
- method public static android.net.Uri getContentUri(java.lang.String, long);
- field public static final java.lang.String AUDIO_ID = "audio_id";
- field public static final java.lang.String CONTENT_DIRECTORY = "members";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "title_key";
- field public static final java.lang.String GENRE_ID = "genre_id";
+ method public static android.net.Uri getContentUri(String, long);
+ field public static final String AUDIO_ID = "audio_id";
+ field public static final String CONTENT_DIRECTORY = "members";
+ field public static final String DEFAULT_SORT_ORDER = "title_key";
+ field public static final String GENRE_ID = "genre_id";
}
- public static abstract interface MediaStore.Audio.GenresColumns {
- field public static final java.lang.String NAME = "name";
+ public static interface MediaStore.Audio.GenresColumns {
+ field public static final String NAME = "name";
}
public static final class MediaStore.Audio.Media implements android.provider.MediaStore.Audio.AudioColumns {
ctor public MediaStore.Audio.Media();
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static deprecated android.net.Uri getContentUriForPath(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "title_key";
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/audio";
+ method public static android.net.Uri getContentUri(String);
+ method @Deprecated @Nullable public static android.net.Uri getContentUriForPath(@NonNull String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
+ field public static final String DEFAULT_SORT_ORDER = "title_key";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/audio";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
- field public static final java.lang.String EXTRA_MAX_BYTES = "android.provider.MediaStore.extra.MAX_BYTES";
+ field public static final String EXTRA_MAX_BYTES = "android.provider.MediaStore.extra.MAX_BYTES";
field public static final android.net.Uri INTERNAL_CONTENT_URI;
- field public static final java.lang.String RECORD_SOUND_ACTION = "android.provider.MediaStore.RECORD_SOUND";
+ field public static final String RECORD_SOUND_ACTION = "android.provider.MediaStore.RECORD_SOUND";
}
public static final class MediaStore.Audio.Playlists implements android.provider.BaseColumns android.provider.MediaStore.Audio.PlaylistsColumns {
ctor public MediaStore.Audio.Playlists();
- method public static android.net.Uri getContentUri(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/playlist";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "name";
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist";
+ method public static android.net.Uri getContentUri(String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/playlist";
+ field public static final String DEFAULT_SORT_ORDER = "name";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static final class MediaStore.Audio.Playlists.Members implements android.provider.MediaStore.Audio.AudioColumns {
ctor public MediaStore.Audio.Playlists.Members();
- method public static android.net.Uri getContentUri(java.lang.String, long);
+ method public static android.net.Uri getContentUri(String, long);
method public static boolean moveItem(android.content.ContentResolver, long, int, int);
- field public static final java.lang.String AUDIO_ID = "audio_id";
- field public static final java.lang.String CONTENT_DIRECTORY = "members";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "play_order";
- field public static final java.lang.String PLAYLIST_ID = "playlist_id";
- field public static final java.lang.String PLAY_ORDER = "play_order";
- field public static final java.lang.String _ID = "_id";
+ field public static final String AUDIO_ID = "audio_id";
+ field public static final String CONTENT_DIRECTORY = "members";
+ field public static final String DEFAULT_SORT_ORDER = "play_order";
+ field public static final String PLAYLIST_ID = "playlist_id";
+ field public static final String PLAY_ORDER = "play_order";
+ field public static final String _ID = "_id";
}
- public static abstract interface MediaStore.Audio.PlaylistsColumns {
- field public static final deprecated java.lang.String DATA = "_data";
- field public static final java.lang.String DATE_ADDED = "date_added";
- field public static final java.lang.String DATE_MODIFIED = "date_modified";
- field public static final java.lang.String NAME = "name";
+ public static interface MediaStore.Audio.PlaylistsColumns {
+ field @Deprecated public static final String DATA = "_data";
+ field public static final String DATE_ADDED = "date_added";
+ field public static final String DATE_MODIFIED = "date_modified";
+ field public static final String NAME = "name";
}
public static final class MediaStore.Audio.Radio {
- field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/radio";
+ field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/radio";
}
- public static abstract interface MediaStore.DownloadColumns implements android.provider.MediaStore.MediaColumns {
- field public static final java.lang.String DESCRIPTION = "description";
- field public static final java.lang.String DOWNLOAD_URI = "download_uri";
- field public static final java.lang.String REFERER_URI = "referer_uri";
+ public static interface MediaStore.DownloadColumns extends android.provider.MediaStore.MediaColumns {
+ field public static final String DESCRIPTION = "description";
+ field public static final String DOWNLOAD_URI = "download_uri";
+ field public static final String REFERER_URI = "referer_uri";
}
public static final class MediaStore.Downloads implements android.provider.MediaStore.DownloadColumns {
- method public static android.net.Uri getContentUri(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/download";
+ method public static android.net.Uri getContentUri(String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/download";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static final class MediaStore.Files {
ctor public MediaStore.Files();
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static android.net.Uri getContentUri(java.lang.String, long);
+ method public static android.net.Uri getContentUri(String);
+ method public static android.net.Uri getContentUri(String, long);
}
- public static abstract interface MediaStore.Files.FileColumns implements android.provider.MediaStore.MediaColumns {
- field public static final java.lang.String MEDIA_TYPE = "media_type";
+ public static interface MediaStore.Files.FileColumns extends android.provider.MediaStore.MediaColumns {
+ field public static final String MEDIA_TYPE = "media_type";
field public static final int MEDIA_TYPE_AUDIO = 2; // 0x2
field public static final int MEDIA_TYPE_IMAGE = 1; // 0x1
field public static final int MEDIA_TYPE_NONE = 0; // 0x0
field public static final int MEDIA_TYPE_PLAYLIST = 4; // 0x4
field public static final int MEDIA_TYPE_VIDEO = 3; // 0x3
- field public static final java.lang.String MIME_TYPE = "mime_type";
- field public static final java.lang.String PARENT = "parent";
- field public static final java.lang.String TITLE = "title";
+ field public static final String MIME_TYPE = "mime_type";
+ field public static final String PARENT = "parent";
+ field public static final String TITLE = "title";
}
public static final class MediaStore.Images {
ctor public MediaStore.Images();
}
- public static abstract interface MediaStore.Images.ImageColumns implements android.provider.MediaStore.MediaColumns {
- field public static final java.lang.String BUCKET_DISPLAY_NAME = "bucket_display_name";
- field public static final java.lang.String BUCKET_ID = "bucket_id";
- field public static final java.lang.String DATE_TAKEN = "datetaken";
- field public static final java.lang.String DESCRIPTION = "description";
- field public static final java.lang.String IS_PRIVATE = "isprivate";
- field public static final deprecated java.lang.String LATITUDE = "latitude";
- field public static final deprecated java.lang.String LONGITUDE = "longitude";
- field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
- field public static final java.lang.String ORIENTATION = "orientation";
- field public static final deprecated java.lang.String PICASA_ID = "picasa_id";
- field public static final java.lang.String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+ public static interface MediaStore.Images.ImageColumns extends android.provider.MediaStore.MediaColumns {
+ field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
+ field public static final String BUCKET_ID = "bucket_id";
+ field public static final String DATE_TAKEN = "datetaken";
+ field public static final String DESCRIPTION = "description";
+ field public static final String IS_PRIVATE = "isprivate";
+ field @Deprecated public static final String LATITUDE = "latitude";
+ field @Deprecated public static final String LONGITUDE = "longitude";
+ field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
+ field public static final String ORIENTATION = "orientation";
+ field @Deprecated public static final String PICASA_ID = "picasa_id";
+ field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
}
public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
ctor public MediaStore.Images.Media();
method public static android.graphics.Bitmap getBitmap(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException, java.io.IOException;
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static java.lang.String insertImage(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- method public static java.lang.String insertImage(android.content.ContentResolver, android.graphics.Bitmap, java.lang.String, java.lang.String);
- method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[]);
- method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String);
- method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/image";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "bucket_display_name";
+ method public static android.net.Uri getContentUri(String);
+ method public static String insertImage(android.content.ContentResolver, String, String, String) throws java.io.FileNotFoundException;
+ method public static String insertImage(android.content.ContentResolver, android.graphics.Bitmap, String, String);
+ method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
+ method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String);
+ method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String[], String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image";
+ field public static final String DEFAULT_SORT_ORDER = "bucket_display_name";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static class MediaStore.Images.Thumbnails implements android.provider.BaseColumns {
ctor public MediaStore.Images.Thumbnails();
- method public static deprecated void cancelThumbnailRequest(android.content.ContentResolver, long);
- method public static deprecated void cancelThumbnailRequest(android.content.ContentResolver, long, long);
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static deprecated android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
- method public static deprecated android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
- method public static final android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[]);
- method public static final android.database.Cursor queryMiniThumbnail(android.content.ContentResolver, long, int, java.lang.String[]);
- method public static final android.database.Cursor queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, java.lang.String[]);
- field public static final deprecated java.lang.String DATA = "_data";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "image_id ASC";
+ method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long);
+ method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long, long);
+ method public static android.net.Uri getContentUri(String);
+ method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
+ method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
+ method public static final android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
+ method public static final android.database.Cursor queryMiniThumbnail(android.content.ContentResolver, long, int, String[]);
+ method public static final android.database.Cursor queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, String[]);
+ field @Deprecated public static final String DATA = "_data";
+ field public static final String DEFAULT_SORT_ORDER = "image_id ASC";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final int FULL_SCREEN_KIND = 2; // 0x2
- field public static final java.lang.String HEIGHT = "height";
- field public static final java.lang.String IMAGE_ID = "image_id";
+ field public static final String HEIGHT = "height";
+ field public static final String IMAGE_ID = "image_id";
field public static final android.net.Uri INTERNAL_CONTENT_URI;
- field public static final java.lang.String KIND = "kind";
+ field public static final String KIND = "kind";
field public static final int MICRO_KIND = 3; // 0x3
field public static final int MINI_KIND = 1; // 0x1
- field public static final java.lang.String THUMB_DATA = "thumb_data";
- field public static final java.lang.String WIDTH = "width";
- }
-
- public static abstract interface MediaStore.MediaColumns implements android.provider.BaseColumns {
- field public static final deprecated java.lang.String DATA = "_data";
- field public static final java.lang.String DATE_ADDED = "date_added";
- field public static final java.lang.String DATE_EXPIRES = "date_expires";
- field public static final java.lang.String DATE_MODIFIED = "date_modified";
- field public static final java.lang.String DISPLAY_NAME = "_display_name";
- field public static final java.lang.String HASH = "_hash";
- field public static final java.lang.String HEIGHT = "height";
- field public static final java.lang.String IS_PENDING = "is_pending";
- field public static final java.lang.String IS_TRASHED = "is_trashed";
- field public static final java.lang.String MIME_TYPE = "mime_type";
- field public static final java.lang.String OWNER_PACKAGE_NAME = "owner_package_name";
- field public static final java.lang.String SIZE = "_size";
- field public static final java.lang.String TITLE = "title";
- field public static final java.lang.String WIDTH = "width";
+ field public static final String THUMB_DATA = "thumb_data";
+ field public static final String WIDTH = "width";
+ }
+
+ public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
+ field @Deprecated public static final String DATA = "_data";
+ field public static final String DATE_ADDED = "date_added";
+ field public static final String DATE_EXPIRES = "date_expires";
+ field public static final String DATE_MODIFIED = "date_modified";
+ field public static final String DISPLAY_NAME = "_display_name";
+ field public static final String HASH = "_hash";
+ field public static final String HEIGHT = "height";
+ field public static final String IS_PENDING = "is_pending";
+ field public static final String IS_TRASHED = "is_trashed";
+ field public static final String MIME_TYPE = "mime_type";
+ field public static final String OWNER_PACKAGE_NAME = "owner_package_name";
+ field public static final String SIZE = "_size";
+ field public static final String TITLE = "title";
+ field public static final String WIDTH = "width";
}
public static class MediaStore.PendingParams {
- ctor public MediaStore.PendingParams(android.net.Uri, java.lang.String, java.lang.String);
- method public void setDownloadUri(android.net.Uri);
- method public void setPrimaryDirectory(java.lang.String);
- method public void setRefererUri(android.net.Uri);
- method public void setSecondaryDirectory(java.lang.String);
+ ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String);
+ method public void setDownloadUri(@Nullable android.net.Uri);
+ method public void setPrimaryDirectory(@Nullable String);
+ method public void setRefererUri(@Nullable android.net.Uri);
+ method public void setSecondaryDirectory(@Nullable String);
}
public static class MediaStore.PendingSession implements java.lang.AutoCloseable {
method public void abandon();
method public void close();
- method public void notifyProgress(int);
- method public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException;
- method public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException;
- method public android.net.Uri publish();
+ method public void notifyProgress(@IntRange(from=0, to=100) int);
+ method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException;
+ method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException;
+ method @NonNull public android.net.Uri publish();
}
public static final class MediaStore.Video {
ctor public MediaStore.Video();
- method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[]);
- field public static final java.lang.String DEFAULT_SORT_ORDER = "_display_name";
+ method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
+ field public static final String DEFAULT_SORT_ORDER = "_display_name";
}
public static final class MediaStore.Video.Media implements android.provider.MediaStore.Video.VideoColumns {
ctor public MediaStore.Video.Media();
- method public static android.net.Uri getContentUri(java.lang.String);
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/video";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "title";
+ method public static android.net.Uri getContentUri(String);
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/video";
+ field public static final String DEFAULT_SORT_ORDER = "title";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static class MediaStore.Video.Thumbnails implements android.provider.BaseColumns {
ctor public MediaStore.Video.Thumbnails();
- method public static deprecated void cancelThumbnailRequest(android.content.ContentResolver, long);
- method public static deprecated void cancelThumbnailRequest(android.content.ContentResolver, long, long);
- method public static android.net.Uri getContentUri(java.lang.String);
- method public static deprecated android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
- method public static deprecated android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
- field public static final deprecated java.lang.String DATA = "_data";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "video_id ASC";
+ method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long);
+ method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long, long);
+ method public static android.net.Uri getContentUri(String);
+ method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
+ method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
+ field @Deprecated public static final String DATA = "_data";
+ field public static final String DEFAULT_SORT_ORDER = "video_id ASC";
field public static final android.net.Uri EXTERNAL_CONTENT_URI;
field public static final int FULL_SCREEN_KIND = 2; // 0x2
- field public static final java.lang.String HEIGHT = "height";
+ field public static final String HEIGHT = "height";
field public static final android.net.Uri INTERNAL_CONTENT_URI;
- field public static final java.lang.String KIND = "kind";
+ field public static final String KIND = "kind";
field public static final int MICRO_KIND = 3; // 0x3
field public static final int MINI_KIND = 1; // 0x1
- field public static final java.lang.String VIDEO_ID = "video_id";
- field public static final java.lang.String WIDTH = "width";
- }
-
- public static abstract interface MediaStore.Video.VideoColumns implements android.provider.MediaStore.MediaColumns {
- field public static final java.lang.String ALBUM = "album";
- field public static final java.lang.String ARTIST = "artist";
- field public static final java.lang.String BOOKMARK = "bookmark";
- field public static final java.lang.String BUCKET_DISPLAY_NAME = "bucket_display_name";
- field public static final java.lang.String BUCKET_ID = "bucket_id";
- field public static final java.lang.String CATEGORY = "category";
- field public static final java.lang.String DATE_TAKEN = "datetaken";
- field public static final java.lang.String DESCRIPTION = "description";
- field public static final java.lang.String DURATION = "duration";
- field public static final java.lang.String IS_PRIVATE = "isprivate";
- field public static final java.lang.String LANGUAGE = "language";
- field public static final deprecated java.lang.String LATITUDE = "latitude";
- field public static final deprecated java.lang.String LONGITUDE = "longitude";
- field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
- field public static final java.lang.String RESOLUTION = "resolution";
- field public static final java.lang.String SECONDARY_BUCKET_ID = "secondary_bucket_id";
- field public static final java.lang.String TAGS = "tags";
- }
-
- public abstract interface OpenableColumns {
- field public static final java.lang.String DISPLAY_NAME = "_display_name";
- field public static final java.lang.String SIZE = "_size";
+ field public static final String VIDEO_ID = "video_id";
+ field public static final String WIDTH = "width";
+ }
+
+ public static interface MediaStore.Video.VideoColumns extends android.provider.MediaStore.MediaColumns {
+ field public static final String ALBUM = "album";
+ field public static final String ARTIST = "artist";
+ field public static final String BOOKMARK = "bookmark";
+ field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
+ field public static final String BUCKET_ID = "bucket_id";
+ field public static final String CATEGORY = "category";
+ field public static final String DATE_TAKEN = "datetaken";
+ field public static final String DESCRIPTION = "description";
+ field public static final String DURATION = "duration";
+ field public static final String IS_PRIVATE = "isprivate";
+ field public static final String LANGUAGE = "language";
+ field @Deprecated public static final String LATITUDE = "latitude";
+ field @Deprecated public static final String LONGITUDE = "longitude";
+ field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
+ field public static final String RESOLUTION = "resolution";
+ field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+ field public static final String TAGS = "tags";
+ }
+
+ public interface OpenableColumns {
+ field public static final String DISPLAY_NAME = "_display_name";
+ field public static final String SIZE = "_size";
}
public class SearchRecentSuggestions {
- ctor public SearchRecentSuggestions(android.content.Context, java.lang.String, int);
+ ctor public SearchRecentSuggestions(android.content.Context, String, int);
method public void clearHistory();
- method public void saveRecentQuery(java.lang.String, java.lang.String);
+ method public void saveRecentQuery(String, String);
method protected void truncateHistory(android.content.ContentResolver, int);
- field public static final java.lang.String[] QUERIES_PROJECTION_1LINE;
- field public static final java.lang.String[] QUERIES_PROJECTION_2LINE;
+ field public static final String[] QUERIES_PROJECTION_1LINE;
+ field public static final String[] QUERIES_PROJECTION_2LINE;
field public static final int QUERIES_PROJECTION_DATE_INDEX = 1; // 0x1
field public static final int QUERIES_PROJECTION_DISPLAY1_INDEX = 3; // 0x3
field public static final int QUERIES_PROJECTION_DISPLAY2_INDEX = 4; // 0x4
@@ -38263,404 +38527,404 @@ package android.provider {
public final class Settings {
ctor public Settings();
method public static boolean canDrawOverlays(android.content.Context);
- field public static final java.lang.String ACTION_ACCESSIBILITY_SETTINGS = "android.settings.ACCESSIBILITY_SETTINGS";
- field public static final java.lang.String ACTION_ADD_ACCOUNT = "android.settings.ADD_ACCOUNT_SETTINGS";
- field public static final java.lang.String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS";
- field public static final java.lang.String ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS";
- field public static final java.lang.String ACTION_APPLICATION_DETAILS_SETTINGS = "android.settings.APPLICATION_DETAILS_SETTINGS";
- field public static final java.lang.String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
- field public static final java.lang.String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
- field public static final java.lang.String ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS";
- field public static final java.lang.String ACTION_APP_SEARCH_SETTINGS = "android.settings.APP_SEARCH_SETTINGS";
- field public static final java.lang.String ACTION_APP_USAGE_SETTINGS = "android.settings.action.APP_USAGE_SETTINGS";
- field public static final java.lang.String ACTION_BATTERY_SAVER_SETTINGS = "android.settings.BATTERY_SAVER_SETTINGS";
- field public static final java.lang.String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
- field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
- field public static final java.lang.String ACTION_CAST_SETTINGS = "android.settings.CAST_SETTINGS";
- field public static final java.lang.String ACTION_CHANNEL_NOTIFICATION_SETTINGS = "android.settings.CHANNEL_NOTIFICATION_SETTINGS";
- field public static final java.lang.String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
- field public static final java.lang.String ACTION_DATA_USAGE_SETTINGS = "android.settings.DATA_USAGE_SETTINGS";
- field public static final java.lang.String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
- field public static final java.lang.String ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS";
- field public static final java.lang.String ACTION_DISPLAY_SETTINGS = "android.settings.DISPLAY_SETTINGS";
- field public static final java.lang.String ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS";
- field public static final java.lang.String ACTION_FINGERPRINT_ENROLL = "android.settings.FINGERPRINT_ENROLL";
- field public static final java.lang.String ACTION_HARD_KEYBOARD_SETTINGS = "android.settings.HARD_KEYBOARD_SETTINGS";
- field public static final java.lang.String ACTION_HOME_SETTINGS = "android.settings.HOME_SETTINGS";
- field public static final java.lang.String ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS = "android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS";
- field public static final java.lang.String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS";
- field public static final java.lang.String ACTION_INPUT_METHOD_SETTINGS = "android.settings.INPUT_METHOD_SETTINGS";
- field public static final java.lang.String ACTION_INPUT_METHOD_SUBTYPE_SETTINGS = "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS";
- field public static final java.lang.String ACTION_INTERNAL_STORAGE_SETTINGS = "android.settings.INTERNAL_STORAGE_SETTINGS";
- field public static final java.lang.String ACTION_LOCALE_SETTINGS = "android.settings.LOCALE_SETTINGS";
- field public static final java.lang.String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_DEFAULT_APPS_SETTINGS = "android.settings.MANAGE_DEFAULT_APPS_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMISSION";
- field public static final java.lang.String ACTION_MANAGE_UNKNOWN_APP_SOURCES = "android.settings.MANAGE_UNKNOWN_APP_SOURCES";
- field public static final java.lang.String ACTION_MANAGE_WRITE_SETTINGS = "android.settings.action.MANAGE_WRITE_SETTINGS";
- field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
- field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
- field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
- field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
- field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
- field public static final java.lang.String ACTION_NIGHT_DISPLAY_SETTINGS = "android.settings.NIGHT_DISPLAY_SETTINGS";
- field public static final java.lang.String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
- field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
- field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
- field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
- field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
- field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
- field public static final java.lang.String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
- field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
- field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
- field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS";
- field public static final java.lang.String ACTION_SHOW_REGULATORY_INFO = "android.settings.SHOW_REGULATORY_INFO";
- field public static final java.lang.String ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS";
- field public static final deprecated java.lang.String ACTION_STORAGE_VOLUME_ACCESS_SETTINGS = "android.settings.STORAGE_VOLUME_ACCESS_SETTINGS";
- field public static final java.lang.String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS";
- field public static final java.lang.String ACTION_USAGE_ACCESS_SETTINGS = "android.settings.USAGE_ACCESS_SETTINGS";
- field public static final java.lang.String ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS";
- field public static final java.lang.String ACTION_VOICE_CONTROL_AIRPLANE_MODE = "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
- field public static final java.lang.String ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE = "android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE";
- field public static final java.lang.String ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE = "android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE";
- field public static final java.lang.String ACTION_VOICE_INPUT_SETTINGS = "android.settings.VOICE_INPUT_SETTINGS";
- field public static final java.lang.String ACTION_VPN_SETTINGS = "android.settings.VPN_SETTINGS";
- field public static final java.lang.String ACTION_VR_LISTENER_SETTINGS = "android.settings.VR_LISTENER_SETTINGS";
- field public static final java.lang.String ACTION_WEBVIEW_SETTINGS = "android.settings.WEBVIEW_SETTINGS";
- field public static final java.lang.String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS";
- field public static final java.lang.String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS";
- field public static final java.lang.String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS";
- field public static final java.lang.String ACTION_ZEN_MODE_PRIORITY_SETTINGS = "android.settings.ZEN_MODE_PRIORITY_SETTINGS";
- field public static final java.lang.String AUTHORITY = "settings";
- field public static final java.lang.String EXTRA_ACCOUNT_TYPES = "account_types";
- field public static final java.lang.String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
- field public static final java.lang.String EXTRA_APP_PACKAGE = "android.provider.extra.APP_PACKAGE";
- field public static final java.lang.String EXTRA_AUTHORITIES = "authorities";
- field public static final java.lang.String EXTRA_BATTERY_SAVER_MODE_ENABLED = "android.settings.extra.battery_saver_mode_enabled";
- field public static final java.lang.String EXTRA_CHANNEL_ID = "android.provider.extra.CHANNEL_ID";
- field public static final java.lang.String EXTRA_DO_NOT_DISTURB_MODE_ENABLED = "android.settings.extra.do_not_disturb_mode_enabled";
- field public static final java.lang.String EXTRA_DO_NOT_DISTURB_MODE_MINUTES = "android.settings.extra.do_not_disturb_mode_minutes";
- field public static final java.lang.String EXTRA_INPUT_METHOD_ID = "input_method_id";
- field public static final java.lang.String EXTRA_SUB_ID = "android.provider.extra.SUB_ID";
- field public static final java.lang.String INTENT_CATEGORY_USAGE_ACCESS_CONFIG = "android.intent.category.USAGE_ACCESS_CONFIG";
- field public static final java.lang.String METADATA_USAGE_ACCESS_REASON = "android.settings.metadata.USAGE_ACCESS_REASON";
+ field public static final String ACTION_ACCESSIBILITY_SETTINGS = "android.settings.ACCESSIBILITY_SETTINGS";
+ field public static final String ACTION_ADD_ACCOUNT = "android.settings.ADD_ACCOUNT_SETTINGS";
+ field public static final String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS";
+ field public static final String ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS";
+ field public static final String ACTION_APPLICATION_DETAILS_SETTINGS = "android.settings.APPLICATION_DETAILS_SETTINGS";
+ field public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
+ field public static final String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
+ field public static final String ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS";
+ field public static final String ACTION_APP_SEARCH_SETTINGS = "android.settings.APP_SEARCH_SETTINGS";
+ field public static final String ACTION_APP_USAGE_SETTINGS = "android.settings.action.APP_USAGE_SETTINGS";
+ field public static final String ACTION_BATTERY_SAVER_SETTINGS = "android.settings.BATTERY_SAVER_SETTINGS";
+ field public static final String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
+ field public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
+ field public static final String ACTION_CAST_SETTINGS = "android.settings.CAST_SETTINGS";
+ field public static final String ACTION_CHANNEL_NOTIFICATION_SETTINGS = "android.settings.CHANNEL_NOTIFICATION_SETTINGS";
+ field public static final String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
+ field public static final String ACTION_DATA_USAGE_SETTINGS = "android.settings.DATA_USAGE_SETTINGS";
+ field public static final String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
+ field public static final String ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS";
+ field public static final String ACTION_DISPLAY_SETTINGS = "android.settings.DISPLAY_SETTINGS";
+ field public static final String ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS";
+ field public static final String ACTION_FINGERPRINT_ENROLL = "android.settings.FINGERPRINT_ENROLL";
+ field public static final String ACTION_HARD_KEYBOARD_SETTINGS = "android.settings.HARD_KEYBOARD_SETTINGS";
+ field public static final String ACTION_HOME_SETTINGS = "android.settings.HOME_SETTINGS";
+ field public static final String ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS = "android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS";
+ field public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS";
+ field public static final String ACTION_INPUT_METHOD_SETTINGS = "android.settings.INPUT_METHOD_SETTINGS";
+ field public static final String ACTION_INPUT_METHOD_SUBTYPE_SETTINGS = "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS";
+ field public static final String ACTION_INTERNAL_STORAGE_SETTINGS = "android.settings.INTERNAL_STORAGE_SETTINGS";
+ field public static final String ACTION_LOCALE_SETTINGS = "android.settings.LOCALE_SETTINGS";
+ field public static final String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
+ field public static final String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
+ field public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
+ field public static final String ACTION_MANAGE_DEFAULT_APPS_SETTINGS = "android.settings.MANAGE_DEFAULT_APPS_SETTINGS";
+ field public static final String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMISSION";
+ field public static final String ACTION_MANAGE_UNKNOWN_APP_SOURCES = "android.settings.MANAGE_UNKNOWN_APP_SOURCES";
+ field public static final String ACTION_MANAGE_WRITE_SETTINGS = "android.settings.action.MANAGE_WRITE_SETTINGS";
+ field public static final String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
+ field public static final String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
+ field public static final String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
+ field public static final String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
+ field public static final String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
+ field public static final String ACTION_NIGHT_DISPLAY_SETTINGS = "android.settings.NIGHT_DISPLAY_SETTINGS";
+ field public static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
+ field public static final String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
+ field public static final String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
+ field public static final String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
+ field public static final String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
+ field public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
+ field public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
+ field public static final String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
+ field public static final String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
+ field public static final String ACTION_SETTINGS = "android.settings.SETTINGS";
+ field public static final String ACTION_SHOW_REGULATORY_INFO = "android.settings.SHOW_REGULATORY_INFO";
+ field public static final String ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS";
+ field @Deprecated public static final String ACTION_STORAGE_VOLUME_ACCESS_SETTINGS = "android.settings.STORAGE_VOLUME_ACCESS_SETTINGS";
+ field public static final String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS";
+ field public static final String ACTION_USAGE_ACCESS_SETTINGS = "android.settings.USAGE_ACCESS_SETTINGS";
+ field public static final String ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS";
+ field public static final String ACTION_VOICE_CONTROL_AIRPLANE_MODE = "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
+ field public static final String ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE = "android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE";
+ field public static final String ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE = "android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE";
+ field public static final String ACTION_VOICE_INPUT_SETTINGS = "android.settings.VOICE_INPUT_SETTINGS";
+ field public static final String ACTION_VPN_SETTINGS = "android.settings.VPN_SETTINGS";
+ field public static final String ACTION_VR_LISTENER_SETTINGS = "android.settings.VR_LISTENER_SETTINGS";
+ field public static final String ACTION_WEBVIEW_SETTINGS = "android.settings.WEBVIEW_SETTINGS";
+ field public static final String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS";
+ field public static final String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS";
+ field public static final String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS";
+ field public static final String ACTION_ZEN_MODE_PRIORITY_SETTINGS = "android.settings.ZEN_MODE_PRIORITY_SETTINGS";
+ field public static final String AUTHORITY = "settings";
+ field public static final String EXTRA_ACCOUNT_TYPES = "account_types";
+ field public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
+ field public static final String EXTRA_APP_PACKAGE = "android.provider.extra.APP_PACKAGE";
+ field public static final String EXTRA_AUTHORITIES = "authorities";
+ field public static final String EXTRA_BATTERY_SAVER_MODE_ENABLED = "android.settings.extra.battery_saver_mode_enabled";
+ field public static final String EXTRA_CHANNEL_ID = "android.provider.extra.CHANNEL_ID";
+ field public static final String EXTRA_DO_NOT_DISTURB_MODE_ENABLED = "android.settings.extra.do_not_disturb_mode_enabled";
+ field public static final String EXTRA_DO_NOT_DISTURB_MODE_MINUTES = "android.settings.extra.do_not_disturb_mode_minutes";
+ field public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
+ field public static final String EXTRA_SUB_ID = "android.provider.extra.SUB_ID";
+ field public static final String INTENT_CATEGORY_USAGE_ACCESS_CONFIG = "android.intent.category.USAGE_ACCESS_CONFIG";
+ field public static final String METADATA_USAGE_ACCESS_REASON = "android.settings.metadata.USAGE_ACCESS_REASON";
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
ctor public Settings.Global();
- method public static float getFloat(android.content.ContentResolver, java.lang.String, float);
- method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static int getInt(android.content.ContentResolver, java.lang.String, int);
- method public static int getInt(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static long getLong(android.content.ContentResolver, java.lang.String, long);
- method public static long getLong(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static java.lang.String getString(android.content.ContentResolver, java.lang.String);
- method public static android.net.Uri getUriFor(java.lang.String);
- method public static boolean putFloat(android.content.ContentResolver, java.lang.String, float);
- method public static boolean putInt(android.content.ContentResolver, java.lang.String, int);
- method public static boolean putLong(android.content.ContentResolver, java.lang.String, long);
- method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String);
- field public static final java.lang.String ADB_ENABLED = "adb_enabled";
- field public static final java.lang.String AIRPLANE_MODE_ON = "airplane_mode_on";
- field public static final java.lang.String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
- field public static final java.lang.String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
- field public static final java.lang.String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
- field public static final java.lang.String AUTO_TIME = "auto_time";
- field public static final java.lang.String AUTO_TIME_ZONE = "auto_time_zone";
- field public static final java.lang.String BLUETOOTH_ON = "bluetooth_on";
- field public static final java.lang.String BOOT_COUNT = "boot_count";
- field public static final java.lang.String CONTACT_METADATA_SYNC_ENABLED = "contact_metadata_sync_enabled";
+ method public static float getFloat(android.content.ContentResolver, String, float);
+ method public static float getFloat(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static int getInt(android.content.ContentResolver, String, int);
+ method public static int getInt(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static long getLong(android.content.ContentResolver, String, long);
+ method public static long getLong(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static String getString(android.content.ContentResolver, String);
+ method public static android.net.Uri getUriFor(String);
+ method public static boolean putFloat(android.content.ContentResolver, String, float);
+ method public static boolean putInt(android.content.ContentResolver, String, int);
+ method public static boolean putLong(android.content.ContentResolver, String, long);
+ method public static boolean putString(android.content.ContentResolver, String, String);
+ field public static final String ADB_ENABLED = "adb_enabled";
+ field public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
+ field public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
+ field public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
+ field public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
+ field public static final String AUTO_TIME = "auto_time";
+ field public static final String AUTO_TIME_ZONE = "auto_time_zone";
+ field public static final String BLUETOOTH_ON = "bluetooth_on";
+ field public static final String BOOT_COUNT = "boot_count";
+ field public static final String CONTACT_METADATA_SYNC_ENABLED = "contact_metadata_sync_enabled";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DATA_ROAMING = "data_roaming";
- field public static final java.lang.String DEBUG_APP = "debug_app";
- field public static final java.lang.String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
- field public static final java.lang.String DEVICE_NAME = "device_name";
- field public static final java.lang.String DEVICE_PROVISIONED = "device_provisioned";
- field public static final java.lang.String HTTP_PROXY = "http_proxy";
- field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
- field public static final java.lang.String MODE_RINGER = "mode_ringer";
- field public static final java.lang.String NETWORK_PREFERENCE = "network_preference";
- field public static final java.lang.String RADIO_BLUETOOTH = "bluetooth";
- field public static final java.lang.String RADIO_CELL = "cell";
- field public static final java.lang.String RADIO_NFC = "nfc";
- field public static final java.lang.String RADIO_WIFI = "wifi";
- field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes";
- field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
- field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
- field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
- field public static final java.lang.String USE_GOOGLE_MAIL = "use_google_mail";
- field public static final java.lang.String WAIT_FOR_DEBUGGER = "wait_for_debugger";
- field public static final java.lang.String WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN = "wifi_device_owner_configs_lockdown";
- field public static final java.lang.String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
- field public static final java.lang.String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
- field public static final deprecated java.lang.String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
- field public static final java.lang.String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
- field public static final java.lang.String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
- field public static final java.lang.String WIFI_ON = "wifi_on";
- field public static final java.lang.String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
+ field public static final String DATA_ROAMING = "data_roaming";
+ field public static final String DEBUG_APP = "debug_app";
+ field public static final String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
+ field public static final String DEVICE_NAME = "device_name";
+ field public static final String DEVICE_PROVISIONED = "device_provisioned";
+ field public static final String HTTP_PROXY = "http_proxy";
+ field @Deprecated public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ field public static final String MODE_RINGER = "mode_ringer";
+ field public static final String NETWORK_PREFERENCE = "network_preference";
+ field public static final String RADIO_BLUETOOTH = "bluetooth";
+ field public static final String RADIO_CELL = "cell";
+ field public static final String RADIO_NFC = "nfc";
+ field public static final String RADIO_WIFI = "wifi";
+ field @Deprecated public static final String SHOW_PROCESSES = "show_processes";
+ field public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
+ field public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
+ field public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
+ field public static final String USE_GOOGLE_MAIL = "use_google_mail";
+ field public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
+ field public static final String WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN = "wifi_device_owner_configs_lockdown";
+ field public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
+ field public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
+ field @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
+ field public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
+ field public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
+ field public static final String WIFI_ON = "wifi_on";
+ field public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
field public static final int WIFI_SLEEP_POLICY_DEFAULT = 0; // 0x0
field public static final int WIFI_SLEEP_POLICY_NEVER = 2; // 0x2
field public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; // 0x1
- field public static final java.lang.String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
- field public static final java.lang.String WINDOW_ANIMATION_SCALE = "window_animation_scale";
+ field public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
+ field public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
}
public static class Settings.NameValueTable implements android.provider.BaseColumns {
ctor public Settings.NameValueTable();
- method public static android.net.Uri getUriFor(android.net.Uri, java.lang.String);
- method protected static boolean putString(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
- field public static final java.lang.String NAME = "name";
- field public static final java.lang.String VALUE = "value";
+ method public static android.net.Uri getUriFor(android.net.Uri, String);
+ method protected static boolean putString(android.content.ContentResolver, android.net.Uri, String, String);
+ field public static final String NAME = "name";
+ field public static final String VALUE = "value";
}
public static final class Settings.Panel {
- field public static final java.lang.String ACTION_INTERNET_CONNECTIVITY = "android.settings.panel.action.INTERNET_CONNECTIVITY";
- field public static final java.lang.String ACTION_VOLUME = "android.settings.panel.action.VOLUME";
+ field public static final String ACTION_INTERNET_CONNECTIVITY = "android.settings.panel.action.INTERNET_CONNECTIVITY";
+ field public static final String ACTION_VOLUME = "android.settings.panel.action.VOLUME";
}
public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
ctor public Settings.Secure();
- method public static float getFloat(android.content.ContentResolver, java.lang.String, float);
- method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static int getInt(android.content.ContentResolver, java.lang.String, int);
- method public static int getInt(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static long getLong(android.content.ContentResolver, java.lang.String, long);
- method public static long getLong(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static java.lang.String getString(android.content.ContentResolver, java.lang.String);
- method public static android.net.Uri getUriFor(java.lang.String);
- method public static deprecated boolean isLocationProviderEnabled(android.content.ContentResolver, java.lang.String);
- method public static boolean putFloat(android.content.ContentResolver, java.lang.String, float);
- method public static boolean putInt(android.content.ContentResolver, java.lang.String, int);
- method public static boolean putLong(android.content.ContentResolver, java.lang.String, long);
- method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String);
- method public static deprecated void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean);
- field public static final java.lang.String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
- field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled";
- field public static final deprecated java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
- field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled";
- field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
- field public static final deprecated java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
- field public static final java.lang.String ANDROID_ID = "android_id";
- field public static final deprecated java.lang.String BACKGROUND_DATA = "background_data";
- field public static final deprecated java.lang.String BLUETOOTH_ON = "bluetooth_on";
+ method public static float getFloat(android.content.ContentResolver, String, float);
+ method public static float getFloat(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static int getInt(android.content.ContentResolver, String, int);
+ method public static int getInt(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static long getLong(android.content.ContentResolver, String, long);
+ method public static long getLong(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static String getString(android.content.ContentResolver, String);
+ method public static android.net.Uri getUriFor(String);
+ method @Deprecated public static boolean isLocationProviderEnabled(android.content.ContentResolver, String);
+ method public static boolean putFloat(android.content.ContentResolver, String, float);
+ method public static boolean putInt(android.content.ContentResolver, String, int);
+ method public static boolean putLong(android.content.ContentResolver, String, long);
+ method public static boolean putString(android.content.ContentResolver, String, String);
+ method @Deprecated public static void setLocationProviderEnabled(android.content.ContentResolver, String, boolean);
+ field public static final String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
+ field public static final String ACCESSIBILITY_ENABLED = "accessibility_enabled";
+ field @Deprecated public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
+ field @Deprecated public static final String ADB_ENABLED = "adb_enabled";
+ field public static final String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
+ field @Deprecated public static final String ALLOW_MOCK_LOCATION = "mock_location";
+ field public static final String ANDROID_ID = "android_id";
+ field @Deprecated public static final String BACKGROUND_DATA = "background_data";
+ field @Deprecated public static final String BLUETOOTH_ON = "bluetooth_on";
field public static final android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DATA_ROAMING = "data_roaming";
- field public static final java.lang.String DEFAULT_INPUT_METHOD = "default_input_method";
- field public static final deprecated java.lang.String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
- field public static final deprecated java.lang.String DEVICE_PROVISIONED = "device_provisioned";
- field public static final java.lang.String ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
- field public static final java.lang.String ENABLED_INPUT_METHODS = "enabled_input_methods";
- field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";
- field public static final java.lang.String INPUT_METHOD_SELECTOR_VISIBILITY = "input_method_selector_visibility";
- field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
- field public static final deprecated java.lang.String LOCATION_MODE = "location_mode";
- field public static final deprecated int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2
- field public static final deprecated int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3
- field public static final deprecated int LOCATION_MODE_OFF = 0; // 0x0
- field public static final deprecated int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1
- field public static final deprecated java.lang.String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
- field public static final deprecated java.lang.String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
- field public static final deprecated java.lang.String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
- field public static final deprecated java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
- field public static final deprecated java.lang.String LOGGING_ID = "logging_id";
- field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference";
- field public static final java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
- field public static final java.lang.String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
- field public static final java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
- field public static final java.lang.String RTT_CALLING_MODE = "rtt_calling_mode";
- field public static final java.lang.String SELECTED_INPUT_METHOD_SUBTYPE = "selected_input_method_subtype";
- field public static final java.lang.String SETTINGS_CLASSNAME = "settings_classname";
- field public static final java.lang.String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
- field public static final java.lang.String TOUCH_EXPLORATION_ENABLED = "touch_exploration_enabled";
- field public static final deprecated java.lang.String TTS_DEFAULT_COUNTRY = "tts_default_country";
- field public static final deprecated java.lang.String TTS_DEFAULT_LANG = "tts_default_lang";
- field public static final java.lang.String TTS_DEFAULT_PITCH = "tts_default_pitch";
- field public static final java.lang.String TTS_DEFAULT_RATE = "tts_default_rate";
- field public static final java.lang.String TTS_DEFAULT_SYNTH = "tts_default_synth";
- field public static final deprecated java.lang.String TTS_DEFAULT_VARIANT = "tts_default_variant";
- field public static final java.lang.String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
- field public static final deprecated java.lang.String TTS_USE_DEFAULTS = "tts_use_defaults";
- field public static final deprecated java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
- field public static final deprecated java.lang.String USE_GOOGLE_MAIL = "use_google_mail";
- field public static final deprecated java.lang.String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
- field public static final deprecated java.lang.String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
- field public static final deprecated java.lang.String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
- field public static final deprecated java.lang.String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
- field public static final deprecated java.lang.String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
- field public static final deprecated java.lang.String WIFI_ON = "wifi_on";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
+ field @Deprecated public static final String DATA_ROAMING = "data_roaming";
+ field public static final String DEFAULT_INPUT_METHOD = "default_input_method";
+ field @Deprecated public static final String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
+ field @Deprecated public static final String DEVICE_PROVISIONED = "device_provisioned";
+ field public static final String ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
+ field public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
+ field @Deprecated public static final String HTTP_PROXY = "http_proxy";
+ field public static final String INPUT_METHOD_SELECTOR_VISIBILITY = "input_method_selector_visibility";
+ field @Deprecated public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ field @Deprecated public static final String LOCATION_MODE = "location_mode";
+ field @Deprecated public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2
+ field @Deprecated public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3
+ field @Deprecated public static final int LOCATION_MODE_OFF = 0; // 0x0
+ field @Deprecated public static final int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1
+ field @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
+ field @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
+ field @Deprecated public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
+ field @Deprecated public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
+ field @Deprecated public static final String LOGGING_ID = "logging_id";
+ field @Deprecated public static final String NETWORK_PREFERENCE = "network_preference";
+ field public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
+ field public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
+ field public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
+ field public static final String RTT_CALLING_MODE = "rtt_calling_mode";
+ field public static final String SELECTED_INPUT_METHOD_SUBTYPE = "selected_input_method_subtype";
+ field public static final String SETTINGS_CLASSNAME = "settings_classname";
+ field public static final String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
+ field public static final String TOUCH_EXPLORATION_ENABLED = "touch_exploration_enabled";
+ field @Deprecated public static final String TTS_DEFAULT_COUNTRY = "tts_default_country";
+ field @Deprecated public static final String TTS_DEFAULT_LANG = "tts_default_lang";
+ field public static final String TTS_DEFAULT_PITCH = "tts_default_pitch";
+ field public static final String TTS_DEFAULT_RATE = "tts_default_rate";
+ field public static final String TTS_DEFAULT_SYNTH = "tts_default_synth";
+ field @Deprecated public static final String TTS_DEFAULT_VARIANT = "tts_default_variant";
+ field public static final String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
+ field @Deprecated public static final String TTS_USE_DEFAULTS = "tts_use_defaults";
+ field @Deprecated public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
+ field @Deprecated public static final String USE_GOOGLE_MAIL = "use_google_mail";
+ field @Deprecated public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
+ field @Deprecated public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
+ field @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
+ field @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
+ field @Deprecated public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
+ field @Deprecated public static final String WIFI_ON = "wifi_on";
+ field @Deprecated public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
+ field @Deprecated public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
+ field @Deprecated public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
}
public static class Settings.SettingNotFoundException extends android.util.AndroidException {
- ctor public Settings.SettingNotFoundException(java.lang.String);
+ ctor public Settings.SettingNotFoundException(String);
}
public static final class Settings.System extends android.provider.Settings.NameValueTable {
ctor public Settings.System();
method public static boolean canWrite(android.content.Context);
method public static void getConfiguration(android.content.ContentResolver, android.content.res.Configuration);
- method public static float getFloat(android.content.ContentResolver, java.lang.String, float);
- method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static int getInt(android.content.ContentResolver, java.lang.String, int);
- method public static int getInt(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static long getLong(android.content.ContentResolver, java.lang.String, long);
- method public static long getLong(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException;
- method public static deprecated boolean getShowGTalkServiceStatus(android.content.ContentResolver);
- method public static java.lang.String getString(android.content.ContentResolver, java.lang.String);
- method public static android.net.Uri getUriFor(java.lang.String);
+ method public static float getFloat(android.content.ContentResolver, String, float);
+ method public static float getFloat(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static int getInt(android.content.ContentResolver, String, int);
+ method public static int getInt(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method public static long getLong(android.content.ContentResolver, String, long);
+ method public static long getLong(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
+ method @Deprecated public static boolean getShowGTalkServiceStatus(android.content.ContentResolver);
+ method public static String getString(android.content.ContentResolver, String);
+ method public static android.net.Uri getUriFor(String);
method public static boolean putConfiguration(android.content.ContentResolver, android.content.res.Configuration);
- method public static boolean putFloat(android.content.ContentResolver, java.lang.String, float);
- method public static boolean putInt(android.content.ContentResolver, java.lang.String, int);
- method public static boolean putLong(android.content.ContentResolver, java.lang.String, long);
- method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String);
- method public static deprecated void setShowGTalkServiceStatus(android.content.ContentResolver, boolean);
- field public static final java.lang.String ACCELEROMETER_ROTATION = "accelerometer_rotation";
- field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled";
- field public static final deprecated java.lang.String AIRPLANE_MODE_ON = "airplane_mode_on";
- field public static final deprecated java.lang.String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
- field public static final java.lang.String ALARM_ALERT = "alarm_alert";
- field public static final deprecated java.lang.String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
- field public static final deprecated java.lang.String ANDROID_ID = "android_id";
- field public static final deprecated java.lang.String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
- field public static final deprecated java.lang.String AUTO_TIME = "auto_time";
- field public static final deprecated java.lang.String AUTO_TIME_ZONE = "auto_time_zone";
- field public static final java.lang.String BLUETOOTH_DISCOVERABILITY = "bluetooth_discoverability";
- field public static final java.lang.String BLUETOOTH_DISCOVERABILITY_TIMEOUT = "bluetooth_discoverability_timeout";
- field public static final deprecated java.lang.String BLUETOOTH_ON = "bluetooth_on";
+ method public static boolean putFloat(android.content.ContentResolver, String, float);
+ method public static boolean putInt(android.content.ContentResolver, String, int);
+ method public static boolean putLong(android.content.ContentResolver, String, long);
+ method public static boolean putString(android.content.ContentResolver, String, String);
+ method @Deprecated public static void setShowGTalkServiceStatus(android.content.ContentResolver, boolean);
+ field public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";
+ field @Deprecated public static final String ADB_ENABLED = "adb_enabled";
+ field @Deprecated public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
+ field @Deprecated public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
+ field public static final String ALARM_ALERT = "alarm_alert";
+ field @Deprecated public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
+ field @Deprecated public static final String ANDROID_ID = "android_id";
+ field @Deprecated public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
+ field @Deprecated public static final String AUTO_TIME = "auto_time";
+ field @Deprecated public static final String AUTO_TIME_ZONE = "auto_time_zone";
+ field public static final String BLUETOOTH_DISCOVERABILITY = "bluetooth_discoverability";
+ field public static final String BLUETOOTH_DISCOVERABILITY_TIMEOUT = "bluetooth_discoverability_timeout";
+ field @Deprecated public static final String BLUETOOTH_ON = "bluetooth_on";
field public static final android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String DATA_ROAMING = "data_roaming";
- field public static final java.lang.String DATE_FORMAT = "date_format";
- field public static final deprecated java.lang.String DEBUG_APP = "debug_app";
+ field @Deprecated public static final String DATA_ROAMING = "data_roaming";
+ field public static final String DATE_FORMAT = "date_format";
+ field @Deprecated public static final String DEBUG_APP = "debug_app";
field public static final android.net.Uri DEFAULT_ALARM_ALERT_URI;
field public static final android.net.Uri DEFAULT_NOTIFICATION_URI;
field public static final android.net.Uri DEFAULT_RINGTONE_URI;
- field public static final deprecated java.lang.String DEVICE_PROVISIONED = "device_provisioned";
- field public static final deprecated java.lang.String DIM_SCREEN = "dim_screen";
- field public static final java.lang.String DTMF_TONE_TYPE_WHEN_DIALING = "dtmf_tone_type";
- field public static final java.lang.String DTMF_TONE_WHEN_DIALING = "dtmf_tone";
- field public static final java.lang.String END_BUTTON_BEHAVIOR = "end_button_behavior";
- field public static final java.lang.String FONT_SCALE = "font_scale";
- field public static final java.lang.String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
- field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";
- field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
- field public static final deprecated java.lang.String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
- field public static final deprecated java.lang.String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
- field public static final deprecated java.lang.String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
- field public static final deprecated java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
- field public static final deprecated java.lang.String LOGGING_ID = "logging_id";
- field public static final deprecated java.lang.String MODE_RINGER = "mode_ringer";
- field public static final java.lang.String MODE_RINGER_STREAMS_AFFECTED = "mode_ringer_streams_affected";
- field public static final java.lang.String MUTE_STREAMS_AFFECTED = "mute_streams_affected";
- field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference";
- field public static final deprecated java.lang.String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
- field public static final java.lang.String NOTIFICATION_SOUND = "notification_sound";
- field public static final deprecated java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
- field public static final deprecated java.lang.String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
- field public static final deprecated java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
- field public static final deprecated java.lang.String RADIO_BLUETOOTH = "bluetooth";
- field public static final deprecated java.lang.String RADIO_CELL = "cell";
- field public static final deprecated java.lang.String RADIO_NFC = "nfc";
- field public static final deprecated java.lang.String RADIO_WIFI = "wifi";
- field public static final java.lang.String RINGTONE = "ringtone";
- field public static final java.lang.String SCREEN_BRIGHTNESS = "screen_brightness";
- field public static final java.lang.String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
+ field @Deprecated public static final String DEVICE_PROVISIONED = "device_provisioned";
+ field @Deprecated public static final String DIM_SCREEN = "dim_screen";
+ field public static final String DTMF_TONE_TYPE_WHEN_DIALING = "dtmf_tone_type";
+ field public static final String DTMF_TONE_WHEN_DIALING = "dtmf_tone";
+ field public static final String END_BUTTON_BEHAVIOR = "end_button_behavior";
+ field public static final String FONT_SCALE = "font_scale";
+ field public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
+ field @Deprecated public static final String HTTP_PROXY = "http_proxy";
+ field @Deprecated public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ field @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
+ field @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
+ field @Deprecated public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
+ field @Deprecated public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
+ field @Deprecated public static final String LOGGING_ID = "logging_id";
+ field @Deprecated public static final String MODE_RINGER = "mode_ringer";
+ field public static final String MODE_RINGER_STREAMS_AFFECTED = "mode_ringer_streams_affected";
+ field public static final String MUTE_STREAMS_AFFECTED = "mute_streams_affected";
+ field @Deprecated public static final String NETWORK_PREFERENCE = "network_preference";
+ field @Deprecated public static final String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
+ field public static final String NOTIFICATION_SOUND = "notification_sound";
+ field @Deprecated public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
+ field @Deprecated public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
+ field @Deprecated public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
+ field @Deprecated public static final String RADIO_BLUETOOTH = "bluetooth";
+ field @Deprecated public static final String RADIO_CELL = "cell";
+ field @Deprecated public static final String RADIO_NFC = "nfc";
+ field @Deprecated public static final String RADIO_WIFI = "wifi";
+ field public static final String RINGTONE = "ringtone";
+ field public static final String SCREEN_BRIGHTNESS = "screen_brightness";
+ field public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
field public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1; // 0x1
field public static final int SCREEN_BRIGHTNESS_MODE_MANUAL = 0; // 0x0
- field public static final java.lang.String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
- field public static final deprecated java.lang.String SETTINGS_CLASSNAME = "settings_classname";
- field public static final java.lang.String SETUP_WIZARD_HAS_RUN = "setup_wizard_has_run";
- field public static final java.lang.String SHOW_GTALK_SERVICE_STATUS = "SHOW_GTALK_SERVICE_STATUS";
- field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes";
- field public static final deprecated java.lang.String SHOW_WEB_SUGGESTIONS = "show_web_suggestions";
- field public static final java.lang.String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
- field public static final deprecated java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
- field public static final java.lang.String TEXT_AUTO_CAPS = "auto_caps";
- field public static final java.lang.String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
- field public static final java.lang.String TEXT_AUTO_REPLACE = "auto_replace";
- field public static final java.lang.String TEXT_SHOW_PASSWORD = "show_password";
- field public static final java.lang.String TIME_12_24 = "time_12_24";
- field public static final deprecated java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
- field public static final deprecated java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
- field public static final java.lang.String USER_ROTATION = "user_rotation";
- field public static final deprecated java.lang.String USE_GOOGLE_MAIL = "use_google_mail";
- field public static final java.lang.String VIBRATE_ON = "vibrate_on";
- field public static final java.lang.String VIBRATE_WHEN_RINGING = "vibrate_when_ringing";
- field public static final deprecated java.lang.String WAIT_FOR_DEBUGGER = "wait_for_debugger";
- field public static final deprecated java.lang.String WALLPAPER_ACTIVITY = "wallpaper_activity";
- field public static final deprecated java.lang.String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
- field public static final deprecated java.lang.String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
- field public static final deprecated java.lang.String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
- field public static final deprecated java.lang.String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
- field public static final deprecated java.lang.String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
- field public static final deprecated java.lang.String WIFI_ON = "wifi_on";
- field public static final deprecated java.lang.String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
- field public static final deprecated int WIFI_SLEEP_POLICY_DEFAULT = 0; // 0x0
- field public static final deprecated int WIFI_SLEEP_POLICY_NEVER = 2; // 0x2
- field public static final deprecated int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; // 0x1
- field public static final deprecated java.lang.String WIFI_STATIC_DNS1 = "wifi_static_dns1";
- field public static final deprecated java.lang.String WIFI_STATIC_DNS2 = "wifi_static_dns2";
- field public static final deprecated java.lang.String WIFI_STATIC_GATEWAY = "wifi_static_gateway";
- field public static final deprecated java.lang.String WIFI_STATIC_IP = "wifi_static_ip";
- field public static final deprecated java.lang.String WIFI_STATIC_NETMASK = "wifi_static_netmask";
- field public static final deprecated java.lang.String WIFI_USE_STATIC_IP = "wifi_use_static_ip";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
- field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
- field public static final deprecated java.lang.String WINDOW_ANIMATION_SCALE = "window_animation_scale";
+ field public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
+ field @Deprecated public static final String SETTINGS_CLASSNAME = "settings_classname";
+ field public static final String SETUP_WIZARD_HAS_RUN = "setup_wizard_has_run";
+ field public static final String SHOW_GTALK_SERVICE_STATUS = "SHOW_GTALK_SERVICE_STATUS";
+ field @Deprecated public static final String SHOW_PROCESSES = "show_processes";
+ field @Deprecated public static final String SHOW_WEB_SUGGESTIONS = "show_web_suggestions";
+ field public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
+ field @Deprecated public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
+ field public static final String TEXT_AUTO_CAPS = "auto_caps";
+ field public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
+ field public static final String TEXT_AUTO_REPLACE = "auto_replace";
+ field public static final String TEXT_SHOW_PASSWORD = "show_password";
+ field public static final String TIME_12_24 = "time_12_24";
+ field @Deprecated public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
+ field @Deprecated public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
+ field public static final String USER_ROTATION = "user_rotation";
+ field @Deprecated public static final String USE_GOOGLE_MAIL = "use_google_mail";
+ field public static final String VIBRATE_ON = "vibrate_on";
+ field public static final String VIBRATE_WHEN_RINGING = "vibrate_when_ringing";
+ field @Deprecated public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
+ field @Deprecated public static final String WALLPAPER_ACTIVITY = "wallpaper_activity";
+ field @Deprecated public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
+ field @Deprecated public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
+ field @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
+ field @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
+ field @Deprecated public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
+ field @Deprecated public static final String WIFI_ON = "wifi_on";
+ field @Deprecated public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
+ field @Deprecated public static final int WIFI_SLEEP_POLICY_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int WIFI_SLEEP_POLICY_NEVER = 2; // 0x2
+ field @Deprecated public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; // 0x1
+ field @Deprecated public static final String WIFI_STATIC_DNS1 = "wifi_static_dns1";
+ field @Deprecated public static final String WIFI_STATIC_DNS2 = "wifi_static_dns2";
+ field @Deprecated public static final String WIFI_STATIC_GATEWAY = "wifi_static_gateway";
+ field @Deprecated public static final String WIFI_STATIC_IP = "wifi_static_ip";
+ field @Deprecated public static final String WIFI_STATIC_NETMASK = "wifi_static_netmask";
+ field @Deprecated public static final String WIFI_USE_STATIC_IP = "wifi_use_static_ip";
+ field @Deprecated public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
+ field @Deprecated public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
+ field @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
+ field @Deprecated public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
+ field @Deprecated public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
+ field @Deprecated public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
}
public class SettingsSlicesContract {
- field public static final java.lang.String AUTHORITY = "android.settings.slices";
+ field public static final String AUTHORITY = "android.settings.slices";
field public static final android.net.Uri BASE_URI;
- field public static final java.lang.String KEY_AIRPLANE_MODE = "airplane_mode";
- field public static final java.lang.String KEY_BATTERY_SAVER = "battery_saver";
- field public static final java.lang.String KEY_BLUETOOTH = "bluetooth";
- field public static final java.lang.String KEY_LOCATION = "location";
- field public static final java.lang.String KEY_WIFI = "wifi";
- field public static final java.lang.String PATH_SETTING_ACTION = "action";
- field public static final java.lang.String PATH_SETTING_INTENT = "intent";
+ field public static final String KEY_AIRPLANE_MODE = "airplane_mode";
+ field public static final String KEY_BATTERY_SAVER = "battery_saver";
+ field public static final String KEY_BLUETOOTH = "bluetooth";
+ field public static final String KEY_LOCATION = "location";
+ field public static final String KEY_WIFI = "wifi";
+ field public static final String PATH_SETTING_ACTION = "action";
+ field public static final String PATH_SETTING_INTENT = "intent";
}
public class SyncStateContract {
ctor public SyncStateContract();
}
- public static abstract interface SyncStateContract.Columns implements android.provider.BaseColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String DATA = "data";
+ public static interface SyncStateContract.Columns extends android.provider.BaseColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String DATA = "data";
}
public static class SyncStateContract.Constants implements android.provider.SyncStateContract.Columns {
ctor public SyncStateContract.Constants();
- field public static final java.lang.String CONTENT_DIRECTORY = "syncstate";
+ field public static final String CONTENT_DIRECTORY = "syncstate";
}
public static final class SyncStateContract.Helpers {
ctor public SyncStateContract.Helpers();
method public static byte[] get(android.content.ContentProviderClient, android.net.Uri, android.accounts.Account) throws android.os.RemoteException;
- method public static android.util.Pair<android.net.Uri, byte[]> getWithUri(android.content.ContentProviderClient, android.net.Uri, android.accounts.Account) throws android.os.RemoteException;
+ method public static android.util.Pair<android.net.Uri,byte[]> getWithUri(android.content.ContentProviderClient, android.net.Uri, android.accounts.Account) throws android.os.RemoteException;
method public static android.net.Uri insert(android.content.ContentProviderClient, android.net.Uri, android.accounts.Account, byte[]) throws android.os.RemoteException;
method public static android.content.ContentProviderOperation newSetOperation(android.net.Uri, android.accounts.Account, byte[]);
method public static android.content.ContentProviderOperation newUpdateOperation(android.net.Uri, byte[]);
@@ -38671,153 +38935,153 @@ package android.provider {
public final class Telephony {
}
- public static abstract interface Telephony.BaseMmsColumns implements android.provider.BaseColumns {
- field public static final java.lang.String CONTENT_CLASS = "ct_cls";
- field public static final java.lang.String CONTENT_LOCATION = "ct_l";
- field public static final java.lang.String CONTENT_TYPE = "ct_t";
- field public static final java.lang.String CREATOR = "creator";
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String DATE_SENT = "date_sent";
- field public static final java.lang.String DELIVERY_REPORT = "d_rpt";
- field public static final java.lang.String DELIVERY_TIME = "d_tm";
- field public static final java.lang.String EXPIRY = "exp";
- field public static final java.lang.String LOCKED = "locked";
- field public static final java.lang.String MESSAGE_BOX = "msg_box";
+ public static interface Telephony.BaseMmsColumns extends android.provider.BaseColumns {
+ field public static final String CONTENT_CLASS = "ct_cls";
+ field public static final String CONTENT_LOCATION = "ct_l";
+ field public static final String CONTENT_TYPE = "ct_t";
+ field public static final String CREATOR = "creator";
+ field public static final String DATE = "date";
+ field public static final String DATE_SENT = "date_sent";
+ field public static final String DELIVERY_REPORT = "d_rpt";
+ field public static final String DELIVERY_TIME = "d_tm";
+ field public static final String EXPIRY = "exp";
+ field public static final String LOCKED = "locked";
+ field public static final String MESSAGE_BOX = "msg_box";
field public static final int MESSAGE_BOX_ALL = 0; // 0x0
field public static final int MESSAGE_BOX_DRAFTS = 3; // 0x3
field public static final int MESSAGE_BOX_FAILED = 5; // 0x5
field public static final int MESSAGE_BOX_INBOX = 1; // 0x1
field public static final int MESSAGE_BOX_OUTBOX = 4; // 0x4
field public static final int MESSAGE_BOX_SENT = 2; // 0x2
- field public static final java.lang.String MESSAGE_CLASS = "m_cls";
- field public static final java.lang.String MESSAGE_ID = "m_id";
- field public static final java.lang.String MESSAGE_SIZE = "m_size";
- field public static final java.lang.String MESSAGE_TYPE = "m_type";
- field public static final java.lang.String MMS_VERSION = "v";
- field public static final java.lang.String PRIORITY = "pri";
- field public static final java.lang.String READ = "read";
- field public static final java.lang.String READ_REPORT = "rr";
- field public static final java.lang.String READ_STATUS = "read_status";
- field public static final java.lang.String REPORT_ALLOWED = "rpt_a";
- field public static final java.lang.String RESPONSE_STATUS = "resp_st";
- field public static final java.lang.String RESPONSE_TEXT = "resp_txt";
- field public static final java.lang.String RETRIEVE_STATUS = "retr_st";
- field public static final java.lang.String RETRIEVE_TEXT = "retr_txt";
- field public static final java.lang.String RETRIEVE_TEXT_CHARSET = "retr_txt_cs";
- field public static final java.lang.String SEEN = "seen";
- field public static final java.lang.String STATUS = "st";
- field public static final java.lang.String SUBJECT = "sub";
- field public static final java.lang.String SUBJECT_CHARSET = "sub_cs";
- field public static final java.lang.String SUBSCRIPTION_ID = "sub_id";
- field public static final java.lang.String TEXT_ONLY = "text_only";
- field public static final java.lang.String THREAD_ID = "thread_id";
- field public static final java.lang.String TRANSACTION_ID = "tr_id";
- }
-
- public static abstract interface Telephony.CanonicalAddressesColumns implements android.provider.BaseColumns {
- field public static final java.lang.String ADDRESS = "address";
+ field public static final String MESSAGE_CLASS = "m_cls";
+ field public static final String MESSAGE_ID = "m_id";
+ field public static final String MESSAGE_SIZE = "m_size";
+ field public static final String MESSAGE_TYPE = "m_type";
+ field public static final String MMS_VERSION = "v";
+ field public static final String PRIORITY = "pri";
+ field public static final String READ = "read";
+ field public static final String READ_REPORT = "rr";
+ field public static final String READ_STATUS = "read_status";
+ field public static final String REPORT_ALLOWED = "rpt_a";
+ field public static final String RESPONSE_STATUS = "resp_st";
+ field public static final String RESPONSE_TEXT = "resp_txt";
+ field public static final String RETRIEVE_STATUS = "retr_st";
+ field public static final String RETRIEVE_TEXT = "retr_txt";
+ field public static final String RETRIEVE_TEXT_CHARSET = "retr_txt_cs";
+ field public static final String SEEN = "seen";
+ field public static final String STATUS = "st";
+ field public static final String SUBJECT = "sub";
+ field public static final String SUBJECT_CHARSET = "sub_cs";
+ field public static final String SUBSCRIPTION_ID = "sub_id";
+ field public static final String TEXT_ONLY = "text_only";
+ field public static final String THREAD_ID = "thread_id";
+ field public static final String TRANSACTION_ID = "tr_id";
+ }
+
+ public static interface Telephony.CanonicalAddressesColumns extends android.provider.BaseColumns {
+ field public static final String ADDRESS = "address";
}
public static final class Telephony.CarrierId implements android.provider.BaseColumns {
method public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int);
method public static android.net.Uri getUriForSubscriptionId(int);
- field public static final java.lang.String CARRIER_ID = "carrier_id";
- field public static final java.lang.String CARRIER_NAME = "carrier_name";
+ field public static final String CARRIER_ID = "carrier_id";
+ field public static final String CARRIER_NAME = "carrier_name";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String PRECISE_CARRIER_ID = "precise_carrier_id";
- field public static final java.lang.String PRECISE_CARRIER_ID_NAME = "precise_carrier_id_name";
+ field public static final String PRECISE_CARRIER_ID = "precise_carrier_id";
+ field public static final String PRECISE_CARRIER_ID_NAME = "precise_carrier_id_name";
}
public static final class Telephony.Carriers implements android.provider.BaseColumns {
- field public static final java.lang.String APN = "apn";
- field public static final java.lang.String AUTH_TYPE = "authtype";
- field public static final deprecated java.lang.String BEARER = "bearer";
- field public static final java.lang.String CARRIER_ENABLED = "carrier_enabled";
- field public static final java.lang.String CARRIER_ID = "carrier_id";
+ field public static final String APN = "apn";
+ field public static final String AUTH_TYPE = "authtype";
+ field @Deprecated public static final String BEARER = "bearer";
+ field public static final String CARRIER_ENABLED = "carrier_enabled";
+ field public static final String CARRIER_ID = "carrier_id";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String CURRENT = "current";
- field public static final java.lang.String DEFAULT_SORT_ORDER = "name ASC";
- field public static final deprecated java.lang.String MCC = "mcc";
- field public static final java.lang.String MMSC = "mmsc";
- field public static final java.lang.String MMSPORT = "mmsport";
- field public static final java.lang.String MMSPROXY = "mmsproxy";
- field public static final deprecated java.lang.String MNC = "mnc";
- field public static final deprecated java.lang.String MVNO_MATCH_DATA = "mvno_match_data";
- field public static final deprecated java.lang.String MVNO_TYPE = "mvno_type";
- field public static final java.lang.String NAME = "name";
- field public static final java.lang.String NETWORK_TYPE_BITMASK = "network_type_bitmask";
- field public static final deprecated java.lang.String NUMERIC = "numeric";
- field public static final java.lang.String PASSWORD = "password";
- field public static final java.lang.String PORT = "port";
- field public static final java.lang.String PROTOCOL = "protocol";
- field public static final java.lang.String PROXY = "proxy";
- field public static final java.lang.String ROAMING_PROTOCOL = "roaming_protocol";
- field public static final java.lang.String SERVER = "server";
+ field public static final String CURRENT = "current";
+ field public static final String DEFAULT_SORT_ORDER = "name ASC";
+ field @Deprecated public static final String MCC = "mcc";
+ field public static final String MMSC = "mmsc";
+ field public static final String MMSPORT = "mmsport";
+ field public static final String MMSPROXY = "mmsproxy";
+ field @Deprecated public static final String MNC = "mnc";
+ field @Deprecated public static final String MVNO_MATCH_DATA = "mvno_match_data";
+ field @Deprecated public static final String MVNO_TYPE = "mvno_type";
+ field public static final String NAME = "name";
+ field public static final String NETWORK_TYPE_BITMASK = "network_type_bitmask";
+ field @Deprecated public static final String NUMERIC = "numeric";
+ field public static final String PASSWORD = "password";
+ field public static final String PORT = "port";
+ field public static final String PROTOCOL = "protocol";
+ field public static final String PROXY = "proxy";
+ field public static final String ROAMING_PROTOCOL = "roaming_protocol";
+ field public static final String SERVER = "server";
field public static final android.net.Uri SIM_APN_URI;
- field public static final java.lang.String SUBSCRIPTION_ID = "sub_id";
- field public static final java.lang.String TYPE = "type";
- field public static final java.lang.String USER = "user";
+ field public static final String SUBSCRIPTION_ID = "sub_id";
+ field public static final String TYPE = "type";
+ field public static final String USER = "user";
}
public static final class Telephony.Mms implements android.provider.Telephony.BaseMmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
field public static final android.net.Uri REPORT_REQUEST_URI;
field public static final android.net.Uri REPORT_STATUS_URI;
}
public static final class Telephony.Mms.Addr implements android.provider.BaseColumns {
- field public static final java.lang.String ADDRESS = "address";
- field public static final java.lang.String CHARSET = "charset";
- field public static final java.lang.String CONTACT_ID = "contact_id";
- field public static final java.lang.String MSG_ID = "msg_id";
- field public static final java.lang.String TYPE = "type";
+ field public static final String ADDRESS = "address";
+ field public static final String CHARSET = "charset";
+ field public static final String CONTACT_ID = "contact_id";
+ field public static final String MSG_ID = "msg_id";
+ field public static final String TYPE = "type";
}
public static final class Telephony.Mms.Draft implements android.provider.Telephony.BaseMmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Mms.Inbox implements android.provider.Telephony.BaseMmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Mms.Intents {
- field public static final java.lang.String CONTENT_CHANGED_ACTION = "android.intent.action.CONTENT_CHANGED";
- field public static final java.lang.String DELETED_CONTENTS = "deleted_contents";
+ field public static final String CONTENT_CHANGED_ACTION = "android.intent.action.CONTENT_CHANGED";
+ field public static final String DELETED_CONTENTS = "deleted_contents";
}
public static final class Telephony.Mms.Outbox implements android.provider.Telephony.BaseMmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Mms.Part implements android.provider.BaseColumns {
- field public static final java.lang.String CHARSET = "chset";
- field public static final java.lang.String CONTENT_DISPOSITION = "cd";
- field public static final java.lang.String CONTENT_ID = "cid";
- field public static final java.lang.String CONTENT_LOCATION = "cl";
- field public static final java.lang.String CONTENT_TYPE = "ct";
- field public static final java.lang.String CT_START = "ctt_s";
- field public static final java.lang.String CT_TYPE = "ctt_t";
- field public static final java.lang.String FILENAME = "fn";
- field public static final java.lang.String MSG_ID = "mid";
- field public static final java.lang.String NAME = "name";
- field public static final java.lang.String SEQ = "seq";
- field public static final java.lang.String TEXT = "text";
- field public static final java.lang.String _DATA = "_data";
+ field public static final String CHARSET = "chset";
+ field public static final String CONTENT_DISPOSITION = "cd";
+ field public static final String CONTENT_ID = "cid";
+ field public static final String CONTENT_LOCATION = "cl";
+ field public static final String CONTENT_TYPE = "ct";
+ field public static final String CT_START = "ctt_s";
+ field public static final String CT_TYPE = "ctt_t";
+ field public static final String FILENAME = "fn";
+ field public static final String MSG_ID = "mid";
+ field public static final String NAME = "name";
+ field public static final String SEQ = "seq";
+ field public static final String TEXT = "text";
+ field public static final String _DATA = "_data";
}
public static final class Telephony.Mms.Rate {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String SENT_TIME = "sent_time";
+ field public static final String SENT_TIME = "sent_time";
}
public static final class Telephony.Mms.Sent implements android.provider.Telephony.BaseMmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.MmsSms implements android.provider.BaseColumns {
@@ -38838,97 +39102,97 @@ package android.provider {
field public static final int NO_ERROR = 0; // 0x0
field public static final android.net.Uri SEARCH_URI;
field public static final int SMS_PROTO = 0; // 0x0
- field public static final java.lang.String TYPE_DISCRIMINATOR_COLUMN = "transport_type";
+ field public static final String TYPE_DISCRIMINATOR_COLUMN = "transport_type";
}
public static final class Telephony.MmsSms.PendingMessages implements android.provider.BaseColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DUE_TIME = "due_time";
- field public static final java.lang.String ERROR_CODE = "err_code";
- field public static final java.lang.String ERROR_TYPE = "err_type";
- field public static final java.lang.String LAST_TRY = "last_try";
- field public static final java.lang.String MSG_ID = "msg_id";
- field public static final java.lang.String MSG_TYPE = "msg_type";
- field public static final java.lang.String PROTO_TYPE = "proto_type";
- field public static final java.lang.String RETRY_INDEX = "retry_index";
- field public static final java.lang.String SUBSCRIPTION_ID = "pending_sub_id";
+ field public static final String DUE_TIME = "due_time";
+ field public static final String ERROR_CODE = "err_code";
+ field public static final String ERROR_TYPE = "err_type";
+ field public static final String LAST_TRY = "last_try";
+ field public static final String MSG_ID = "msg_id";
+ field public static final String MSG_TYPE = "msg_type";
+ field public static final String PROTO_TYPE = "proto_type";
+ field public static final String RETRY_INDEX = "retry_index";
+ field public static final String SUBSCRIPTION_ID = "pending_sub_id";
}
public static final class Telephony.ServiceStateTable {
method public static android.net.Uri getUriForSubscriptionId(int);
- method public static android.net.Uri getUriForSubscriptionIdAndField(int, java.lang.String);
- field public static final java.lang.String AUTHORITY = "service-state";
+ method public static android.net.Uri getUriForSubscriptionIdAndField(int, String);
+ field public static final String AUTHORITY = "service-state";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String IS_MANUAL_NETWORK_SELECTION = "is_manual_network_selection";
- field public static final java.lang.String VOICE_OPERATOR_NUMERIC = "voice_operator_numeric";
- field public static final java.lang.String VOICE_REG_STATE = "voice_reg_state";
+ field public static final String IS_MANUAL_NETWORK_SELECTION = "is_manual_network_selection";
+ field public static final String VOICE_OPERATOR_NUMERIC = "voice_operator_numeric";
+ field public static final String VOICE_REG_STATE = "voice_reg_state";
}
public static final class Telephony.Sms implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
- method public static java.lang.String getDefaultSmsPackage(android.content.Context);
+ method public static String getDefaultSmsPackage(android.content.Context);
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Sms.Conversations implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
- field public static final java.lang.String MESSAGE_COUNT = "msg_count";
- field public static final java.lang.String SNIPPET = "snippet";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String MESSAGE_COUNT = "msg_count";
+ field public static final String SNIPPET = "snippet";
}
public static final class Telephony.Sms.Draft implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Sms.Inbox implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Sms.Intents {
method public static android.telephony.SmsMessage[] getMessagesFromIntent(android.content.Intent);
- field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.provider.Telephony.ACTION_CHANGE_DEFAULT";
- field public static final java.lang.String ACTION_DEFAULT_SMS_PACKAGE_CHANGED = "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED";
- field public static final java.lang.String ACTION_EXTERNAL_PROVIDER_CHANGE = "android.provider.action.EXTERNAL_PROVIDER_CHANGE";
- field public static final java.lang.String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";
- field public static final java.lang.String EXTRA_IS_DEFAULT_SMS_APP = "android.provider.extra.IS_DEFAULT_SMS_APP";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "package";
+ field public static final String ACTION_CHANGE_DEFAULT = "android.provider.Telephony.ACTION_CHANGE_DEFAULT";
+ field public static final String ACTION_DEFAULT_SMS_PACKAGE_CHANGED = "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED";
+ field public static final String ACTION_EXTERNAL_PROVIDER_CHANGE = "android.provider.action.EXTERNAL_PROVIDER_CHANGE";
+ field public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";
+ field public static final String EXTRA_IS_DEFAULT_SMS_APP = "android.provider.extra.IS_DEFAULT_SMS_APP";
+ field public static final String EXTRA_PACKAGE_NAME = "package";
field public static final int RESULT_SMS_DUPLICATED = 5; // 0x5
field public static final int RESULT_SMS_GENERIC_ERROR = 2; // 0x2
field public static final int RESULT_SMS_HANDLED = 1; // 0x1
field public static final int RESULT_SMS_OUT_OF_MEMORY = 3; // 0x3
field public static final int RESULT_SMS_UNSUPPORTED = 4; // 0x4
- field public static final deprecated java.lang.String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";
- field public static final java.lang.String SIM_FULL_ACTION = "android.provider.Telephony.SIM_FULL";
- field public static final java.lang.String SMS_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_CB_RECEIVED";
- field public static final java.lang.String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";
- field public static final java.lang.String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
- field public static final java.lang.String SMS_REJECTED_ACTION = "android.provider.Telephony.SMS_REJECTED";
- field public static final java.lang.String SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION = "android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED";
- field public static final java.lang.String WAP_PUSH_DELIVER_ACTION = "android.provider.Telephony.WAP_PUSH_DELIVER";
- field public static final java.lang.String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
+ field @Deprecated public static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";
+ field public static final String SIM_FULL_ACTION = "android.provider.Telephony.SIM_FULL";
+ field public static final String SMS_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_CB_RECEIVED";
+ field public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";
+ field public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
+ field public static final String SMS_REJECTED_ACTION = "android.provider.Telephony.SMS_REJECTED";
+ field public static final String SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION = "android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED";
+ field public static final String WAP_PUSH_DELIVER_ACTION = "android.provider.Telephony.WAP_PUSH_DELIVER";
+ field public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
}
public static final class Telephony.Sms.Outbox implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
public static final class Telephony.Sms.Sent implements android.provider.BaseColumns android.provider.Telephony.TextBasedSmsColumns {
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
}
- public static abstract interface Telephony.TextBasedSmsColumns {
- field public static final java.lang.String ADDRESS = "address";
- field public static final java.lang.String BODY = "body";
- field public static final java.lang.String CREATOR = "creator";
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String DATE_SENT = "date_sent";
- field public static final java.lang.String ERROR_CODE = "error_code";
- field public static final java.lang.String LOCKED = "locked";
+ public static interface Telephony.TextBasedSmsColumns {
+ field public static final String ADDRESS = "address";
+ field public static final String BODY = "body";
+ field public static final String CREATOR = "creator";
+ field public static final String DATE = "date";
+ field public static final String DATE_SENT = "date_sent";
+ field public static final String ERROR_CODE = "error_code";
+ field public static final String LOCKED = "locked";
field public static final int MESSAGE_TYPE_ALL = 0; // 0x0
field public static final int MESSAGE_TYPE_DRAFT = 3; // 0x3
field public static final int MESSAGE_TYPE_FAILED = 5; // 0x5
@@ -38936,25 +39200,25 @@ package android.provider {
field public static final int MESSAGE_TYPE_OUTBOX = 4; // 0x4
field public static final int MESSAGE_TYPE_QUEUED = 6; // 0x6
field public static final int MESSAGE_TYPE_SENT = 2; // 0x2
- field public static final java.lang.String PERSON = "person";
- field public static final java.lang.String PROTOCOL = "protocol";
- field public static final java.lang.String READ = "read";
- field public static final java.lang.String REPLY_PATH_PRESENT = "reply_path_present";
- field public static final java.lang.String SEEN = "seen";
- field public static final java.lang.String SERVICE_CENTER = "service_center";
- field public static final java.lang.String STATUS = "status";
+ field public static final String PERSON = "person";
+ field public static final String PROTOCOL = "protocol";
+ field public static final String READ = "read";
+ field public static final String REPLY_PATH_PRESENT = "reply_path_present";
+ field public static final String SEEN = "seen";
+ field public static final String SERVICE_CENTER = "service_center";
+ field public static final String STATUS = "status";
field public static final int STATUS_COMPLETE = 0; // 0x0
field public static final int STATUS_FAILED = 64; // 0x40
field public static final int STATUS_NONE = -1; // 0xffffffff
field public static final int STATUS_PENDING = 32; // 0x20
- field public static final java.lang.String SUBJECT = "subject";
- field public static final java.lang.String SUBSCRIPTION_ID = "sub_id";
- field public static final java.lang.String THREAD_ID = "thread_id";
- field public static final java.lang.String TYPE = "type";
+ field public static final String SUBJECT = "subject";
+ field public static final String SUBSCRIPTION_ID = "sub_id";
+ field public static final String THREAD_ID = "thread_id";
+ field public static final String TYPE = "type";
}
public static final class Telephony.Threads implements android.provider.Telephony.ThreadsColumns {
- method public static long getOrCreateThreadId(android.content.Context, java.lang.String);
+ method public static long getOrCreateThreadId(android.content.Context, String);
method public static long getOrCreateThreadId(android.content.Context, java.util.Set<java.lang.String>);
field public static final int BROADCAST_THREAD = 1; // 0x1
field public static final int COMMON_THREAD = 0; // 0x0
@@ -38962,56 +39226,56 @@ package android.provider {
field public static final android.net.Uri OBSOLETE_THREADS_URI;
}
- public static abstract interface Telephony.ThreadsColumns implements android.provider.BaseColumns {
- field public static final java.lang.String ARCHIVED = "archived";
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String ERROR = "error";
- field public static final java.lang.String HAS_ATTACHMENT = "has_attachment";
- field public static final java.lang.String MESSAGE_COUNT = "message_count";
- field public static final java.lang.String READ = "read";
- field public static final java.lang.String RECIPIENT_IDS = "recipient_ids";
- field public static final java.lang.String SNIPPET = "snippet";
- field public static final java.lang.String SNIPPET_CHARSET = "snippet_cs";
- field public static final java.lang.String TYPE = "type";
+ public static interface Telephony.ThreadsColumns extends android.provider.BaseColumns {
+ field public static final String ARCHIVED = "archived";
+ field public static final String DATE = "date";
+ field public static final String ERROR = "error";
+ field public static final String HAS_ATTACHMENT = "has_attachment";
+ field public static final String MESSAGE_COUNT = "message_count";
+ field public static final String READ = "read";
+ field public static final String RECIPIENT_IDS = "recipient_ids";
+ field public static final String SNIPPET = "snippet";
+ field public static final String SNIPPET_CHARSET = "snippet_cs";
+ field public static final String TYPE = "type";
}
public class UserDictionary {
ctor public UserDictionary();
- field public static final java.lang.String AUTHORITY = "user_dictionary";
+ field public static final String AUTHORITY = "user_dictionary";
field public static final android.net.Uri CONTENT_URI;
}
public static class UserDictionary.Words implements android.provider.BaseColumns {
ctor public UserDictionary.Words();
- method public static deprecated void addWord(android.content.Context, java.lang.String, int, int);
- method public static void addWord(android.content.Context, java.lang.String, int, java.lang.String, java.util.Locale);
- field public static final java.lang.String APP_ID = "appid";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.userword";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.userword";
+ method @Deprecated public static void addWord(android.content.Context, String, int, int);
+ method public static void addWord(android.content.Context, String, int, String, java.util.Locale);
+ field public static final String APP_ID = "appid";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.userword";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.userword";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DEFAULT_SORT_ORDER = "frequency DESC";
- field public static final java.lang.String FREQUENCY = "frequency";
- field public static final java.lang.String LOCALE = "locale";
- field public static final deprecated int LOCALE_TYPE_ALL = 0; // 0x0
- field public static final deprecated int LOCALE_TYPE_CURRENT = 1; // 0x1
- field public static final java.lang.String SHORTCUT = "shortcut";
- field public static final java.lang.String WORD = "word";
- field public static final java.lang.String _ID = "_id";
+ field public static final String DEFAULT_SORT_ORDER = "frequency DESC";
+ field public static final String FREQUENCY = "frequency";
+ field public static final String LOCALE = "locale";
+ field @Deprecated public static final int LOCALE_TYPE_ALL = 0; // 0x0
+ field @Deprecated public static final int LOCALE_TYPE_CURRENT = 1; // 0x1
+ field public static final String SHORTCUT = "shortcut";
+ field public static final String WORD = "word";
+ field public static final String _ID = "_id";
}
public class VoicemailContract {
- field public static final java.lang.String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL";
- field public static final java.lang.String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL";
- field public static final java.lang.String ACTION_SYNC_VOICEMAIL = "android.provider.action.SYNC_VOICEMAIL";
- field public static final java.lang.String AUTHORITY = "com.android.voicemail";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.provider.extra.PHONE_ACCOUNT_HANDLE";
- field public static final java.lang.String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE";
- field public static final java.lang.String PARAM_KEY_SOURCE_PACKAGE = "source_package";
+ field public static final String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL";
+ field public static final String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL";
+ field public static final String ACTION_SYNC_VOICEMAIL = "android.provider.action.SYNC_VOICEMAIL";
+ field public static final String AUTHORITY = "com.android.voicemail";
+ field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.provider.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE";
+ field public static final String PARAM_KEY_SOURCE_PACKAGE = "source_package";
}
public static final class VoicemailContract.Status implements android.provider.BaseColumns {
- method public static android.net.Uri buildSourceUri(java.lang.String);
- field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
+ method public static android.net.Uri buildSourceUri(String);
+ field public static final String CONFIGURATION_STATE = "configuration_state";
field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
field public static final int CONFIGURATION_STATE_CONFIGURING = 3; // 0x3
field public static final int CONFIGURATION_STATE_DISABLED = 5; // 0x5
@@ -39019,7 +39283,7 @@ package android.provider {
field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
field public static final int CONFIGURATION_STATE_OK = 0; // 0x0
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DATA_CHANNEL_STATE = "data_channel_state";
+ field public static final String DATA_CHANNEL_STATE = "data_channel_state";
field public static final int DATA_CHANNEL_STATE_BAD_CONFIGURATION = 3; // 0x3
field public static final int DATA_CHANNEL_STATE_COMMUNICATION_ERROR = 4; // 0x4
field public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1
@@ -39027,48 +39291,48 @@ package android.provider {
field public static final int DATA_CHANNEL_STATE_OK = 0; // 0x0
field public static final int DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR = 6; // 0x6
field public static final int DATA_CHANNEL_STATE_SERVER_ERROR = 5; // 0x5
- field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status";
- field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status";
- field public static final java.lang.String NOTIFICATION_CHANNEL_STATE = "notification_channel_state";
+ field public static final String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status";
+ field public static final String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status";
+ field public static final String NOTIFICATION_CHANNEL_STATE = "notification_channel_state";
field public static final int NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING = 2; // 0x2
field public static final int NOTIFICATION_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1
field public static final int NOTIFICATION_CHANNEL_STATE_OK = 0; // 0x0
- field public static final java.lang.String PHONE_ACCOUNT_COMPONENT_NAME = "phone_account_component_name";
- field public static final java.lang.String PHONE_ACCOUNT_ID = "phone_account_id";
- field public static final java.lang.String QUOTA_OCCUPIED = "quota_occupied";
- field public static final java.lang.String QUOTA_TOTAL = "quota_total";
+ field public static final String PHONE_ACCOUNT_COMPONENT_NAME = "phone_account_component_name";
+ field public static final String PHONE_ACCOUNT_ID = "phone_account_id";
+ field public static final String QUOTA_OCCUPIED = "quota_occupied";
+ field public static final String QUOTA_TOTAL = "quota_total";
field public static final int QUOTA_UNAVAILABLE = -1; // 0xffffffff
- field public static final java.lang.String SETTINGS_URI = "settings_uri";
- field public static final java.lang.String SOURCE_PACKAGE = "source_package";
- field public static final java.lang.String SOURCE_TYPE = "source_type";
- field public static final java.lang.String VOICEMAIL_ACCESS_URI = "voicemail_access_uri";
+ field public static final String SETTINGS_URI = "settings_uri";
+ field public static final String SOURCE_PACKAGE = "source_package";
+ field public static final String SOURCE_TYPE = "source_type";
+ field public static final String VOICEMAIL_ACCESS_URI = "voicemail_access_uri";
}
public static final class VoicemailContract.Voicemails implements android.provider.BaseColumns android.provider.OpenableColumns {
- method public static android.net.Uri buildSourceUri(java.lang.String);
- field public static final java.lang.String ARCHIVED = "archived";
- field public static final java.lang.String BACKED_UP = "backed_up";
+ method public static android.net.Uri buildSourceUri(String);
+ field public static final String ARCHIVED = "archived";
+ field public static final String BACKED_UP = "backed_up";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String DIRTY = "dirty";
+ field public static final String DATE = "date";
+ field public static final String DELETED = "deleted";
+ field public static final String DIRTY = "dirty";
field public static final int DIRTY_RETAIN = -1; // 0xffffffff
- field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemails";
- field public static final java.lang.String DURATION = "duration";
- field public static final java.lang.String HAS_CONTENT = "has_content";
- field public static final java.lang.String IS_OMTP_VOICEMAIL = "is_omtp_voicemail";
- field public static final java.lang.String IS_READ = "is_read";
- field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail";
- field public static final java.lang.String LAST_MODIFIED = "last_modified";
- field public static final java.lang.String MIME_TYPE = "mime_type";
- field public static final java.lang.String NEW = "new";
- field public static final java.lang.String NUMBER = "number";
- field public static final java.lang.String PHONE_ACCOUNT_COMPONENT_NAME = "subscription_component_name";
- field public static final java.lang.String PHONE_ACCOUNT_ID = "subscription_id";
- field public static final java.lang.String RESTORED = "restored";
- field public static final java.lang.String SOURCE_DATA = "source_data";
- field public static final java.lang.String SOURCE_PACKAGE = "source_package";
- field public static final java.lang.String TRANSCRIPTION = "transcription";
+ field public static final String DIR_TYPE = "vnd.android.cursor.dir/voicemails";
+ field public static final String DURATION = "duration";
+ field public static final String HAS_CONTENT = "has_content";
+ field public static final String IS_OMTP_VOICEMAIL = "is_omtp_voicemail";
+ field public static final String IS_READ = "is_read";
+ field public static final String ITEM_TYPE = "vnd.android.cursor.item/voicemail";
+ field public static final String LAST_MODIFIED = "last_modified";
+ field public static final String MIME_TYPE = "mime_type";
+ field public static final String NEW = "new";
+ field public static final String NUMBER = "number";
+ field public static final String PHONE_ACCOUNT_COMPONENT_NAME = "subscription_component_name";
+ field public static final String PHONE_ACCOUNT_ID = "subscription_id";
+ field public static final String RESTORED = "restored";
+ field public static final String SOURCE_DATA = "source_data";
+ field public static final String SOURCE_PACKAGE = "source_package";
+ field public static final String TRANSCRIPTION = "transcription";
}
}
@@ -39076,57 +39340,57 @@ package android.provider {
package android.renderscript {
public class Allocation extends android.renderscript.BaseObj {
- method public void copy1DRangeFrom(int, int, java.lang.Object);
+ method public void copy1DRangeFrom(int, int, Object);
method public void copy1DRangeFrom(int, int, int[]);
method public void copy1DRangeFrom(int, int, short[]);
method public void copy1DRangeFrom(int, int, byte[]);
method public void copy1DRangeFrom(int, int, float[]);
method public void copy1DRangeFrom(int, int, android.renderscript.Allocation, int);
- method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
+ method public void copy1DRangeFromUnchecked(int, int, Object);
method public void copy1DRangeFromUnchecked(int, int, int[]);
method public void copy1DRangeFromUnchecked(int, int, short[]);
method public void copy1DRangeFromUnchecked(int, int, byte[]);
method public void copy1DRangeFromUnchecked(int, int, float[]);
- method public void copy1DRangeTo(int, int, java.lang.Object);
+ method public void copy1DRangeTo(int, int, Object);
method public void copy1DRangeTo(int, int, int[]);
method public void copy1DRangeTo(int, int, short[]);
method public void copy1DRangeTo(int, int, byte[]);
method public void copy1DRangeTo(int, int, float[]);
- method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
+ method public void copy1DRangeToUnchecked(int, int, Object);
method public void copy1DRangeToUnchecked(int, int, int[]);
method public void copy1DRangeToUnchecked(int, int, short[]);
method public void copy1DRangeToUnchecked(int, int, byte[]);
method public void copy1DRangeToUnchecked(int, int, float[]);
- method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
+ method public void copy2DRangeFrom(int, int, int, int, Object);
method public void copy2DRangeFrom(int, int, int, int, byte[]);
method public void copy2DRangeFrom(int, int, int, int, short[]);
method public void copy2DRangeFrom(int, int, int, int, int[]);
method public void copy2DRangeFrom(int, int, int, int, float[]);
method public void copy2DRangeFrom(int, int, int, int, android.renderscript.Allocation, int, int);
method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
- method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
+ method public void copy2DRangeTo(int, int, int, int, Object);
method public void copy2DRangeTo(int, int, int, int, byte[]);
method public void copy2DRangeTo(int, int, int, int, short[]);
method public void copy2DRangeTo(int, int, int, int, int[]);
method public void copy2DRangeTo(int, int, int, int, float[]);
- method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
+ method public void copy3DRangeFrom(int, int, int, int, int, int, Object);
method public void copy3DRangeFrom(int, int, int, int, int, int, android.renderscript.Allocation, int, int, int);
- method public void copy3DRangeTo(int, int, int, int, int, int, java.lang.Object);
+ method public void copy3DRangeTo(int, int, int, int, int, int, Object);
method public void copyFrom(android.renderscript.BaseObj[]);
- method public void copyFrom(java.lang.Object);
+ method public void copyFrom(Object);
method public void copyFrom(int[]);
method public void copyFrom(short[]);
method public void copyFrom(byte[]);
method public void copyFrom(float[]);
method public void copyFrom(android.graphics.Bitmap);
method public void copyFrom(android.renderscript.Allocation);
- method public void copyFromUnchecked(java.lang.Object);
+ method public void copyFromUnchecked(Object);
method public void copyFromUnchecked(int[]);
method public void copyFromUnchecked(short[]);
method public void copyFromUnchecked(byte[]);
method public void copyFromUnchecked(float[]);
method public void copyTo(android.graphics.Bitmap);
- method public void copyTo(java.lang.Object);
+ method public void copyTo(Object);
method public void copyTo(byte[]);
method public void copyTo(short[]);
method public void copyTo(int[]);
@@ -39140,7 +39404,7 @@ package android.renderscript {
method public static android.renderscript.Allocation createFromBitmap(android.renderscript.RenderScript, android.graphics.Bitmap);
method public static android.renderscript.Allocation createFromBitmapResource(android.renderscript.RenderScript, android.content.res.Resources, int, android.renderscript.Allocation.MipmapControl, int);
method public static android.renderscript.Allocation createFromBitmapResource(android.renderscript.RenderScript, android.content.res.Resources, int);
- method public static android.renderscript.Allocation createFromString(android.renderscript.RenderScript, java.lang.String, int);
+ method public static android.renderscript.Allocation createFromString(android.renderscript.RenderScript, String, int);
method public static android.renderscript.Allocation createSized(android.renderscript.RenderScript, android.renderscript.Element, int, int);
method public static android.renderscript.Allocation createSized(android.renderscript.RenderScript, android.renderscript.Element, int);
method public static android.renderscript.Allocation createTyped(android.renderscript.RenderScript, android.renderscript.Type, android.renderscript.Allocation.MipmapControl, int);
@@ -39157,7 +39421,7 @@ package android.renderscript {
method public int getUsage();
method public void ioReceive();
method public void ioSend();
- method public deprecated synchronized void resize(int);
+ method @Deprecated public void resize(int);
method public void setAutoPadding(boolean);
method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
@@ -39175,23 +39439,21 @@ package android.renderscript {
field public static final int USAGE_SHARED = 128; // 0x80
}
- public static final class Allocation.MipmapControl extends java.lang.Enum {
- method public static android.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
- method public static final android.renderscript.Allocation.MipmapControl[] values();
+ public enum Allocation.MipmapControl {
enum_constant public static final android.renderscript.Allocation.MipmapControl MIPMAP_FULL;
enum_constant public static final android.renderscript.Allocation.MipmapControl MIPMAP_NONE;
enum_constant public static final android.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
}
- public static abstract interface Allocation.OnBufferAvailableListener {
- method public abstract void onBufferAvailable(android.renderscript.Allocation);
+ public static interface Allocation.OnBufferAvailableListener {
+ method public void onBufferAvailable(android.renderscript.Allocation);
}
public class AllocationAdapter extends android.renderscript.Allocation {
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
- method public synchronized void resize(int);
+ method public void resize(int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -39201,8 +39463,8 @@ package android.renderscript {
public class BaseObj {
method public void destroy();
- method public java.lang.String getName();
- method public void setName(java.lang.String);
+ method public String getName();
+ method public void setName(String);
}
public class Byte2 {
@@ -39287,7 +39549,7 @@ package android.renderscript {
method public static android.renderscript.Element I8_2(android.renderscript.RenderScript);
method public static android.renderscript.Element I8_3(android.renderscript.RenderScript);
method public static android.renderscript.Element I8_4(android.renderscript.RenderScript);
- method public static deprecated android.renderscript.Element MATRIX4X4(android.renderscript.RenderScript);
+ method @Deprecated public static android.renderscript.Element MATRIX4X4(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_2X2(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_3X3(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_4X4(android.renderscript.RenderScript);
@@ -39329,7 +39591,7 @@ package android.renderscript {
method public android.renderscript.Element getSubElement(int);
method public int getSubElementArraySize(int);
method public int getSubElementCount();
- method public java.lang.String getSubElementName(int);
+ method public String getSubElementName(int);
method public int getSubElementOffsetBytes(int);
method public int getVectorSize();
method public boolean isCompatible(android.renderscript.Element);
@@ -39338,14 +39600,12 @@ package android.renderscript {
public static class Element.Builder {
ctor public Element.Builder(android.renderscript.RenderScript);
- method public android.renderscript.Element.Builder add(android.renderscript.Element, java.lang.String, int);
- method public android.renderscript.Element.Builder add(android.renderscript.Element, java.lang.String);
+ method public android.renderscript.Element.Builder add(android.renderscript.Element, String, int);
+ method public android.renderscript.Element.Builder add(android.renderscript.Element, String);
method public android.renderscript.Element create();
}
- public static final class Element.DataKind extends java.lang.Enum {
- method public static android.renderscript.Element.DataKind valueOf(java.lang.String);
- method public static final android.renderscript.Element.DataKind[] values();
+ public enum Element.DataKind {
enum_constant public static final android.renderscript.Element.DataKind PIXEL_A;
enum_constant public static final android.renderscript.Element.DataKind PIXEL_DEPTH;
enum_constant public static final android.renderscript.Element.DataKind PIXEL_L;
@@ -39356,9 +39616,7 @@ package android.renderscript {
enum_constant public static final android.renderscript.Element.DataKind USER;
}
- public static final class Element.DataType extends java.lang.Enum {
- method public static android.renderscript.Element.DataType valueOf(java.lang.String);
- method public static final android.renderscript.Element.DataType[] values();
+ public enum Element.DataType {
enum_constant public static final android.renderscript.Element.DataType BOOLEAN;
enum_constant public static final android.renderscript.Element.DataType FLOAT_16;
enum_constant public static final android.renderscript.Element.DataType FLOAT_32;
@@ -39614,19 +39872,19 @@ package android.renderscript {
}
public class RSDriverException extends android.renderscript.RSRuntimeException {
- ctor public RSDriverException(java.lang.String);
+ ctor public RSDriverException(String);
}
public class RSIllegalArgumentException extends android.renderscript.RSRuntimeException {
- ctor public RSIllegalArgumentException(java.lang.String);
+ ctor public RSIllegalArgumentException(String);
}
public class RSInvalidStateException extends android.renderscript.RSRuntimeException {
- ctor public RSInvalidStateException(java.lang.String);
+ ctor public RSInvalidStateException(String);
}
public class RSRuntimeException extends java.lang.RuntimeException {
- ctor public RSRuntimeException(java.lang.String);
+ ctor public RSRuntimeException(String);
}
public class RenderScript {
@@ -39651,17 +39909,13 @@ package android.renderscript {
field public static final int CREATE_FLAG_NONE = 0; // 0x0
}
- public static final class RenderScript.ContextType extends java.lang.Enum {
- method public static android.renderscript.RenderScript.ContextType valueOf(java.lang.String);
- method public static final android.renderscript.RenderScript.ContextType[] values();
+ public enum RenderScript.ContextType {
enum_constant public static final android.renderscript.RenderScript.ContextType DEBUG;
enum_constant public static final android.renderscript.RenderScript.ContextType NORMAL;
enum_constant public static final android.renderscript.RenderScript.ContextType PROFILE;
}
- public static final class RenderScript.Priority extends java.lang.Enum {
- method public static android.renderscript.RenderScript.Priority valueOf(java.lang.String);
- method public static final android.renderscript.RenderScript.Priority[] values();
+ public enum RenderScript.Priority {
enum_constant public static final android.renderscript.RenderScript.Priority LOW;
enum_constant public static final android.renderscript.RenderScript.Priority NORMAL;
}
@@ -39669,7 +39923,7 @@ package android.renderscript {
public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
ctor public RenderScript.RSErrorHandler();
method public void run();
- field protected java.lang.String mErrorMessage;
+ field protected String mErrorMessage;
field protected int mErrorNum;
}
@@ -39708,9 +39962,7 @@ package android.renderscript {
method public void setWrapT(android.renderscript.Sampler.Value);
}
- public static final class Sampler.Value extends java.lang.Enum {
- method public static android.renderscript.Sampler.Value valueOf(java.lang.String);
- method public static final android.renderscript.Sampler.Value[] values();
+ public enum Sampler.Value {
enum_constant public static final android.renderscript.Sampler.Value CLAMP;
enum_constant public static final android.renderscript.Sampler.Value LINEAR;
enum_constant public static final android.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
@@ -39738,7 +39990,7 @@ package android.renderscript {
method protected void invoke(int);
method protected void invoke(int, android.renderscript.FieldPacker);
method protected void reduce(int, android.renderscript.Allocation[], android.renderscript.Allocation, android.renderscript.Script.LaunchOptions);
- method public void setTimeZone(java.lang.String);
+ method public void setTimeZone(String);
method public void setVar(int, float);
method public void setVar(int, double);
method public void setVar(int, int);
@@ -39790,26 +40042,26 @@ package android.renderscript {
ctor protected ScriptC(int, android.renderscript.RenderScript);
ctor protected ScriptC(long, android.renderscript.RenderScript);
ctor protected ScriptC(android.renderscript.RenderScript, android.content.res.Resources, int);
- ctor protected ScriptC(android.renderscript.RenderScript, java.lang.String, byte[], byte[]);
+ ctor protected ScriptC(android.renderscript.RenderScript, String, byte[], byte[]);
}
public final class ScriptGroup extends android.renderscript.BaseObj {
- method public java.lang.Object[] execute(java.lang.Object...);
- method public deprecated void execute();
- method public deprecated void setInput(android.renderscript.Script.KernelID, android.renderscript.Allocation);
- method public deprecated void setOutput(android.renderscript.Script.KernelID, android.renderscript.Allocation);
+ method public Object[] execute(java.lang.Object...);
+ method @Deprecated public void execute();
+ method @Deprecated public void setInput(android.renderscript.Script.KernelID, android.renderscript.Allocation);
+ method @Deprecated public void setOutput(android.renderscript.Script.KernelID, android.renderscript.Allocation);
}
public static final class ScriptGroup.Binding {
- ctor public ScriptGroup.Binding(android.renderscript.Script.FieldID, java.lang.Object);
+ ctor public ScriptGroup.Binding(android.renderscript.Script.FieldID, Object);
}
- public static final deprecated class ScriptGroup.Builder {
- ctor public ScriptGroup.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ScriptGroup.Builder addConnection(android.renderscript.Type, android.renderscript.Script.KernelID, android.renderscript.Script.FieldID);
- method public android.renderscript.ScriptGroup.Builder addConnection(android.renderscript.Type, android.renderscript.Script.KernelID, android.renderscript.Script.KernelID);
- method public android.renderscript.ScriptGroup.Builder addKernel(android.renderscript.Script.KernelID);
- method public android.renderscript.ScriptGroup create();
+ @Deprecated public static final class ScriptGroup.Builder {
+ ctor @Deprecated public ScriptGroup.Builder(android.renderscript.RenderScript);
+ method @Deprecated public android.renderscript.ScriptGroup.Builder addConnection(android.renderscript.Type, android.renderscript.Script.KernelID, android.renderscript.Script.FieldID);
+ method @Deprecated public android.renderscript.ScriptGroup.Builder addConnection(android.renderscript.Type, android.renderscript.Script.KernelID, android.renderscript.Script.KernelID);
+ method @Deprecated public android.renderscript.ScriptGroup.Builder addKernel(android.renderscript.Script.KernelID);
+ method @Deprecated public android.renderscript.ScriptGroup create();
}
public static final class ScriptGroup.Builder2 {
@@ -39817,7 +40069,7 @@ package android.renderscript {
method public android.renderscript.ScriptGroup.Input addInput();
method public android.renderscript.ScriptGroup.Closure addInvoke(android.renderscript.Script.InvokeID, java.lang.Object...);
method public android.renderscript.ScriptGroup.Closure addKernel(android.renderscript.Script.KernelID, android.renderscript.Type, java.lang.Object...);
- method public android.renderscript.ScriptGroup create(java.lang.String, android.renderscript.ScriptGroup.Future...);
+ method public android.renderscript.ScriptGroup create(String, android.renderscript.ScriptGroup.Future...);
}
public static final class ScriptGroup.Closure extends android.renderscript.BaseObj {
@@ -40012,7 +40264,7 @@ package android.renderscript {
}
public final class ScriptIntrinsicColorMatrix extends android.renderscript.ScriptIntrinsic {
- method public static deprecated android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript, android.renderscript.Element);
+ method @Deprecated public static android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript, android.renderscript.Element);
method public static android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript);
method public void forEach(android.renderscript.Allocation, android.renderscript.Allocation);
method public void forEach(android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Script.LaunchOptions);
@@ -40135,18 +40387,16 @@ package android.renderscript {
method public android.renderscript.Type.Builder setZ(int);
}
- public static final class Type.CubemapFace extends java.lang.Enum {
- method public static android.renderscript.Type.CubemapFace valueOf(java.lang.String);
- method public static final android.renderscript.Type.CubemapFace[] values();
+ public enum Type.CubemapFace {
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_X;
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_Y;
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_Z;
enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_X;
enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_Y;
enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_Z;
- enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_X;
- enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_Y;
- enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_Z;
+ enum_constant @Deprecated public static final android.renderscript.Type.CubemapFace POSITVE_X;
+ enum_constant @Deprecated public static final android.renderscript.Type.CubemapFace POSITVE_Y;
+ enum_constant @Deprecated public static final android.renderscript.Type.CubemapFace POSITVE_Z;
}
}
@@ -40154,10 +40404,10 @@ package android.renderscript {
package android.sax {
public class Element {
- method public android.sax.Element getChild(java.lang.String);
- method public android.sax.Element getChild(java.lang.String, java.lang.String);
- method public android.sax.Element requireChild(java.lang.String);
- method public android.sax.Element requireChild(java.lang.String, java.lang.String);
+ method public android.sax.Element getChild(String);
+ method public android.sax.Element getChild(String, String);
+ method public android.sax.Element requireChild(String);
+ method public android.sax.Element requireChild(String, String);
method public void setElementListener(android.sax.ElementListener);
method public void setEndElementListener(android.sax.EndElementListener);
method public void setEndTextElementListener(android.sax.EndTextElementListener);
@@ -40165,28 +40415,28 @@ package android.sax {
method public void setTextElementListener(android.sax.TextElementListener);
}
- public abstract interface ElementListener implements android.sax.EndElementListener android.sax.StartElementListener {
+ public interface ElementListener extends android.sax.StartElementListener android.sax.EndElementListener {
}
- public abstract interface EndElementListener {
- method public abstract void end();
+ public interface EndElementListener {
+ method public void end();
}
- public abstract interface EndTextElementListener {
- method public abstract void end(java.lang.String);
+ public interface EndTextElementListener {
+ method public void end(String);
}
public class RootElement extends android.sax.Element {
- ctor public RootElement(java.lang.String, java.lang.String);
- ctor public RootElement(java.lang.String);
+ ctor public RootElement(String, String);
+ ctor public RootElement(String);
method public org.xml.sax.ContentHandler getContentHandler();
}
- public abstract interface StartElementListener {
- method public abstract void start(org.xml.sax.Attributes);
+ public interface StartElementListener {
+ method public void start(org.xml.sax.Attributes);
}
- public abstract interface TextElementListener implements android.sax.EndTextElementListener android.sax.StartElementListener {
+ public interface TextElementListener extends android.sax.StartElementListener android.sax.EndTextElementListener {
}
}
@@ -40195,44 +40445,44 @@ package android.se.omapi {
public final class Channel implements java.nio.channels.Channel {
method public void close();
- method public byte[] getSelectResponse();
- method public android.se.omapi.Session getSession();
+ method @Nullable public byte[] getSelectResponse();
+ method @NonNull public android.se.omapi.Session getSession();
method public boolean isBasicChannel();
method public boolean isOpen();
method public boolean selectNext() throws java.io.IOException;
- method public byte[] transmit(byte[]) throws java.io.IOException;
+ method @NonNull public byte[] transmit(@NonNull byte[]) throws java.io.IOException;
}
public final class Reader {
method public void closeSessions();
- method public java.lang.String getName();
- method public android.se.omapi.SEService getSEService();
+ method @NonNull public String getName();
+ method @NonNull public android.se.omapi.SEService getSEService();
method public boolean isSecureElementPresent();
- method public android.se.omapi.Session openSession() throws java.io.IOException;
+ method @NonNull public android.se.omapi.Session openSession() throws java.io.IOException;
}
public final class SEService {
- ctor public SEService(android.content.Context, java.util.concurrent.Executor, android.se.omapi.SEService.OnConnectedListener);
- method public android.se.omapi.Reader[] getReaders();
- method public java.lang.String getVersion();
+ ctor public SEService(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.se.omapi.SEService.OnConnectedListener);
+ method @NonNull public android.se.omapi.Reader[] getReaders();
+ method @NonNull public String getVersion();
method public boolean isConnected();
method public void shutdown();
}
- public static abstract interface SEService.OnConnectedListener {
- method public abstract void onConnected();
+ public static interface SEService.OnConnectedListener {
+ method public void onConnected();
}
public final class Session {
method public void close();
method public void closeChannels();
- method public byte[] getATR();
- method public android.se.omapi.Reader getReader();
+ method @Nullable public byte[] getATR();
+ method @NonNull public android.se.omapi.Reader getReader();
method public boolean isClosed();
- method public android.se.omapi.Channel openBasicChannel(byte[], byte) throws java.io.IOException;
- method public android.se.omapi.Channel openBasicChannel(byte[]) throws java.io.IOException;
- method public android.se.omapi.Channel openLogicalChannel(byte[], byte) throws java.io.IOException;
- method public android.se.omapi.Channel openLogicalChannel(byte[]) throws java.io.IOException;
+ method @Nullable public android.se.omapi.Channel openBasicChannel(@Nullable byte[], @Nullable byte) throws java.io.IOException;
+ method @Nullable public android.se.omapi.Channel openBasicChannel(@Nullable byte[]) throws java.io.IOException;
+ method @Nullable public android.se.omapi.Channel openLogicalChannel(@Nullable byte[], @Nullable byte) throws java.io.IOException;
+ method @Nullable public android.se.omapi.Channel openLogicalChannel(@Nullable byte[]) throws java.io.IOException;
}
}
@@ -40246,107 +40496,107 @@ package android.security {
public class ConfirmationAlreadyPresentingException extends java.lang.Exception {
ctor public ConfirmationAlreadyPresentingException();
- ctor public ConfirmationAlreadyPresentingException(java.lang.String);
+ ctor public ConfirmationAlreadyPresentingException(String);
}
public abstract class ConfirmationCallback {
ctor public ConfirmationCallback();
method public void onCanceled();
- method public void onConfirmed(byte[]);
+ method public void onConfirmed(@NonNull byte[]);
method public void onDismissed();
- method public void onError(java.lang.Throwable);
+ method public void onError(Throwable);
}
public class ConfirmationNotAvailableException extends java.lang.Exception {
ctor public ConfirmationNotAvailableException();
- ctor public ConfirmationNotAvailableException(java.lang.String);
+ ctor public ConfirmationNotAvailableException(String);
}
public class ConfirmationPrompt {
method public void cancelPrompt();
method public static boolean isSupported(android.content.Context);
- method public void presentPrompt(java.util.concurrent.Executor, android.security.ConfirmationCallback) throws android.security.ConfirmationAlreadyPresentingException, android.security.ConfirmationNotAvailableException;
+ method public void presentPrompt(@NonNull java.util.concurrent.Executor, @NonNull android.security.ConfirmationCallback) throws android.security.ConfirmationAlreadyPresentingException, android.security.ConfirmationNotAvailableException;
}
public static final class ConfirmationPrompt.Builder {
ctor public ConfirmationPrompt.Builder(android.content.Context);
method public android.security.ConfirmationPrompt build();
method public android.security.ConfirmationPrompt.Builder setExtraData(byte[]);
- method public android.security.ConfirmationPrompt.Builder setPromptText(java.lang.CharSequence);
+ method public android.security.ConfirmationPrompt.Builder setPromptText(CharSequence);
}
public final class KeyChain {
ctor public KeyChain();
- method public static void choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, java.lang.String[], java.security.Principal[], java.lang.String, int, java.lang.String);
- method public static void choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, java.lang.String[], java.security.Principal[], android.net.Uri, java.lang.String);
- method public static android.content.Intent createInstallIntent();
- method public static java.security.cert.X509Certificate[] getCertificateChain(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
- method public static java.security.PrivateKey getPrivateKey(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
- method public static deprecated boolean isBoundKeyAlgorithm(java.lang.String);
- method public static boolean isKeyAlgorithmSupported(java.lang.String);
- field public static final java.lang.String ACTION_KEYCHAIN_CHANGED = "android.security.action.KEYCHAIN_CHANGED";
- field public static final java.lang.String ACTION_KEY_ACCESS_CHANGED = "android.security.action.KEY_ACCESS_CHANGED";
- field public static final deprecated java.lang.String ACTION_STORAGE_CHANGED = "android.security.STORAGE_CHANGED";
- field public static final java.lang.String ACTION_TRUST_STORE_CHANGED = "android.security.action.TRUST_STORE_CHANGED";
- field public static final java.lang.String EXTRA_CERTIFICATE = "CERT";
- field public static final java.lang.String EXTRA_KEY_ACCESSIBLE = "android.security.extra.KEY_ACCESSIBLE";
- field public static final java.lang.String EXTRA_KEY_ALIAS = "android.security.extra.KEY_ALIAS";
- field public static final java.lang.String EXTRA_NAME = "name";
- field public static final java.lang.String EXTRA_PKCS12 = "PKCS12";
- }
-
- public abstract interface KeyChainAliasCallback {
- method public abstract void alias(java.lang.String);
+ method public static void choosePrivateKeyAlias(@NonNull android.app.Activity, @NonNull android.security.KeyChainAliasCallback, @Nullable String[], @Nullable java.security.Principal[], @Nullable String, int, @Nullable String);
+ method public static void choosePrivateKeyAlias(@NonNull android.app.Activity, @NonNull android.security.KeyChainAliasCallback, @Nullable String[], @Nullable java.security.Principal[], @Nullable android.net.Uri, @Nullable String);
+ method @NonNull public static android.content.Intent createInstallIntent();
+ method @Nullable @WorkerThread public static java.security.cert.X509Certificate[] getCertificateChain(@NonNull android.content.Context, @NonNull String) throws java.lang.InterruptedException, android.security.KeyChainException;
+ method @Nullable @WorkerThread public static java.security.PrivateKey getPrivateKey(@NonNull android.content.Context, @NonNull String) throws java.lang.InterruptedException, android.security.KeyChainException;
+ method @Deprecated public static boolean isBoundKeyAlgorithm(@NonNull String);
+ method public static boolean isKeyAlgorithmSupported(@NonNull String);
+ field public static final String ACTION_KEYCHAIN_CHANGED = "android.security.action.KEYCHAIN_CHANGED";
+ field public static final String ACTION_KEY_ACCESS_CHANGED = "android.security.action.KEY_ACCESS_CHANGED";
+ field @Deprecated public static final String ACTION_STORAGE_CHANGED = "android.security.STORAGE_CHANGED";
+ field public static final String ACTION_TRUST_STORE_CHANGED = "android.security.action.TRUST_STORE_CHANGED";
+ field public static final String EXTRA_CERTIFICATE = "CERT";
+ field public static final String EXTRA_KEY_ACCESSIBLE = "android.security.extra.KEY_ACCESSIBLE";
+ field public static final String EXTRA_KEY_ALIAS = "android.security.extra.KEY_ALIAS";
+ field public static final String EXTRA_NAME = "name";
+ field public static final String EXTRA_PKCS12 = "PKCS12";
+ }
+
+ public interface KeyChainAliasCallback {
+ method public void alias(@Nullable String);
}
public class KeyChainException extends java.lang.Exception {
ctor public KeyChainException();
- ctor public KeyChainException(java.lang.String);
- ctor public KeyChainException(java.lang.String, java.lang.Throwable);
- ctor public KeyChainException(java.lang.Throwable);
+ ctor public KeyChainException(String);
+ ctor public KeyChainException(String, Throwable);
+ ctor public KeyChainException(Throwable);
}
- public final deprecated class KeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
- method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
- method public android.content.Context getContext();
- method public java.util.Date getEndDate();
- method public int getKeySize();
- method public java.lang.String getKeyType();
- method public java.lang.String getKeystoreAlias();
- method public java.math.BigInteger getSerialNumber();
- method public java.util.Date getStartDate();
- method public javax.security.auth.x500.X500Principal getSubjectDN();
- method public boolean isEncryptionRequired();
+ @Deprecated public final class KeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
+ method @Deprecated @NonNull public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
+ method @Deprecated public android.content.Context getContext();
+ method @Deprecated @NonNull public java.util.Date getEndDate();
+ method @Deprecated public int getKeySize();
+ method @Deprecated @Nullable public String getKeyType();
+ method @Deprecated public String getKeystoreAlias();
+ method @Deprecated @NonNull public java.math.BigInteger getSerialNumber();
+ method @Deprecated @NonNull public java.util.Date getStartDate();
+ method @Deprecated @NonNull public javax.security.auth.x500.X500Principal getSubjectDN();
+ method @Deprecated public boolean isEncryptionRequired();
}
- public static final deprecated class KeyPairGeneratorSpec.Builder {
- ctor public KeyPairGeneratorSpec.Builder(android.content.Context);
- method public android.security.KeyPairGeneratorSpec build();
- method public android.security.KeyPairGeneratorSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec);
- method public android.security.KeyPairGeneratorSpec.Builder setAlias(java.lang.String);
- method public android.security.KeyPairGeneratorSpec.Builder setEncryptionRequired();
- method public android.security.KeyPairGeneratorSpec.Builder setEndDate(java.util.Date);
- method public android.security.KeyPairGeneratorSpec.Builder setKeySize(int);
- method public android.security.KeyPairGeneratorSpec.Builder setKeyType(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public android.security.KeyPairGeneratorSpec.Builder setSerialNumber(java.math.BigInteger);
- method public android.security.KeyPairGeneratorSpec.Builder setStartDate(java.util.Date);
- method public android.security.KeyPairGeneratorSpec.Builder setSubject(javax.security.auth.x500.X500Principal);
+ @Deprecated public static final class KeyPairGeneratorSpec.Builder {
+ ctor @Deprecated public KeyPairGeneratorSpec.Builder(@NonNull android.content.Context);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec build();
+ method @Deprecated public android.security.KeyPairGeneratorSpec.Builder setAlgorithmParameterSpec(@NonNull java.security.spec.AlgorithmParameterSpec);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setAlias(@NonNull String);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setEncryptionRequired();
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setEndDate(@NonNull java.util.Date);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setKeySize(int);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setKeyType(@NonNull String) throws java.security.NoSuchAlgorithmException;
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setSerialNumber(@NonNull java.math.BigInteger);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setStartDate(@NonNull java.util.Date);
+ method @Deprecated @NonNull public android.security.KeyPairGeneratorSpec.Builder setSubject(@NonNull javax.security.auth.x500.X500Principal);
}
- public final deprecated class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter {
- method public boolean isEncryptionRequired();
+ @Deprecated public final class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter {
+ method @Deprecated public boolean isEncryptionRequired();
}
- public static final deprecated class KeyStoreParameter.Builder {
- ctor public KeyStoreParameter.Builder(android.content.Context);
- method public android.security.KeyStoreParameter build();
- method public android.security.KeyStoreParameter.Builder setEncryptionRequired(boolean);
+ @Deprecated public static final class KeyStoreParameter.Builder {
+ ctor @Deprecated public KeyStoreParameter.Builder(@NonNull android.content.Context);
+ method @Deprecated @NonNull public android.security.KeyStoreParameter build();
+ method @Deprecated @NonNull public android.security.KeyStoreParameter.Builder setEncryptionRequired(boolean);
}
public class NetworkSecurityPolicy {
method public static android.security.NetworkSecurityPolicy getInstance();
method public boolean isCleartextTrafficPermitted();
- method public boolean isCleartextTrafficPermitted(java.lang.String);
+ method public boolean isCleartextTrafficPermitted(String);
}
}
@@ -40355,29 +40605,29 @@ package android.security.keystore {
public class KeyExpiredException extends java.security.InvalidKeyException {
ctor public KeyExpiredException();
- ctor public KeyExpiredException(java.lang.String);
- ctor public KeyExpiredException(java.lang.String, java.lang.Throwable);
+ ctor public KeyExpiredException(String);
+ ctor public KeyExpiredException(String, Throwable);
}
public final class KeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
- method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
+ method @Nullable public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
method public byte[] getAttestationChallenge();
- method public java.lang.String[] getBlockModes();
- method public java.util.Date getCertificateNotAfter();
- method public java.util.Date getCertificateNotBefore();
- method public java.math.BigInteger getCertificateSerialNumber();
- method public javax.security.auth.x500.X500Principal getCertificateSubject();
- method public java.lang.String[] getDigests();
- method public java.lang.String[] getEncryptionPaddings();
+ method @NonNull public String[] getBlockModes();
+ method @NonNull public java.util.Date getCertificateNotAfter();
+ method @NonNull public java.util.Date getCertificateNotBefore();
+ method @NonNull public java.math.BigInteger getCertificateSerialNumber();
+ method @NonNull public javax.security.auth.x500.X500Principal getCertificateSubject();
+ method @NonNull public String[] getDigests();
+ method @NonNull public String[] getEncryptionPaddings();
method public int getKeySize();
- method public java.util.Date getKeyValidityForConsumptionEnd();
- method public java.util.Date getKeyValidityForOriginationEnd();
- method public java.util.Date getKeyValidityStart();
- method public java.lang.String getKeystoreAlias();
+ method @Nullable public java.util.Date getKeyValidityForConsumptionEnd();
+ method @Nullable public java.util.Date getKeyValidityForOriginationEnd();
+ method @Nullable public java.util.Date getKeyValidityStart();
+ method @NonNull public String getKeystoreAlias();
method public int getPurposes();
- method public java.lang.String[] getSignaturePaddings();
+ method @NonNull public String[] getSignaturePaddings();
method public int getUserAuthenticationValidityDurationSeconds();
- method public boolean isDigestsSpecified();
+ method @NonNull public boolean isDigestsSpecified();
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
method public boolean isStrongBoxBacked();
@@ -40389,46 +40639,46 @@ package android.security.keystore {
}
public static final class KeyGenParameterSpec.Builder {
- ctor public KeyGenParameterSpec.Builder(java.lang.String, int);
- method public android.security.keystore.KeyGenParameterSpec build();
- method public android.security.keystore.KeyGenParameterSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec);
- method public android.security.keystore.KeyGenParameterSpec.Builder setAttestationChallenge(byte[]);
- method public android.security.keystore.KeyGenParameterSpec.Builder setBlockModes(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotAfter(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotBefore(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateSerialNumber(java.math.BigInteger);
- method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateSubject(javax.security.auth.x500.X500Principal);
- method public android.security.keystore.KeyGenParameterSpec.Builder setDigests(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setEncryptionPaddings(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setInvalidatedByBiometricEnrollment(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setIsStrongBoxBacked(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setKeySize(int);
- method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityEnd(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityForConsumptionEnd(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date);
- method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUserPresenceRequired(boolean);
+ ctor public KeyGenParameterSpec.Builder(@NonNull String, int);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec build();
+ method public android.security.keystore.KeyGenParameterSpec.Builder setAlgorithmParameterSpec(@NonNull java.security.spec.AlgorithmParameterSpec);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setAttestationChallenge(byte[]);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setBlockModes(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotAfter(@NonNull java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotBefore(@NonNull java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setCertificateSerialNumber(@NonNull java.math.BigInteger);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setCertificateSubject(@NonNull javax.security.auth.x500.X500Principal);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setDigests(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setEncryptionPaddings(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setInvalidatedByBiometricEnrollment(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setIsStrongBoxBacked(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeySize(int);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityForConsumptionEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(@IntRange(from=0xffffffff) int);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUserPresenceRequired(boolean);
}
public class KeyInfo implements java.security.spec.KeySpec {
- method public java.lang.String[] getBlockModes();
- method public java.lang.String[] getDigests();
- method public java.lang.String[] getEncryptionPaddings();
+ method @NonNull public String[] getBlockModes();
+ method @NonNull public String[] getDigests();
+ method @NonNull public String[] getEncryptionPaddings();
method public int getKeySize();
- method public java.util.Date getKeyValidityForConsumptionEnd();
- method public java.util.Date getKeyValidityForOriginationEnd();
- method public java.util.Date getKeyValidityStart();
- method public java.lang.String getKeystoreAlias();
+ method @Nullable public java.util.Date getKeyValidityForConsumptionEnd();
+ method @Nullable public java.util.Date getKeyValidityForOriginationEnd();
+ method @Nullable public java.util.Date getKeyValidityStart();
+ method public String getKeystoreAlias();
method public int getOrigin();
method public int getPurposes();
- method public java.lang.String[] getSignaturePaddings();
+ method @NonNull public String[] getSignaturePaddings();
method public int getUserAuthenticationValidityDurationSeconds();
method public boolean isInsideSecureHardware();
method public boolean isInvalidatedByBiometricEnrollment();
@@ -40441,41 +40691,41 @@ package android.security.keystore {
public class KeyNotYetValidException extends java.security.InvalidKeyException {
ctor public KeyNotYetValidException();
- ctor public KeyNotYetValidException(java.lang.String);
- ctor public KeyNotYetValidException(java.lang.String, java.lang.Throwable);
+ ctor public KeyNotYetValidException(String);
+ ctor public KeyNotYetValidException(String, Throwable);
}
public class KeyPermanentlyInvalidatedException extends java.security.InvalidKeyException {
ctor public KeyPermanentlyInvalidatedException();
- ctor public KeyPermanentlyInvalidatedException(java.lang.String);
- ctor public KeyPermanentlyInvalidatedException(java.lang.String, java.lang.Throwable);
+ ctor public KeyPermanentlyInvalidatedException(String);
+ ctor public KeyPermanentlyInvalidatedException(String, Throwable);
}
public abstract class KeyProperties {
- field public static final java.lang.String BLOCK_MODE_CBC = "CBC";
- field public static final java.lang.String BLOCK_MODE_CTR = "CTR";
- field public static final java.lang.String BLOCK_MODE_ECB = "ECB";
- field public static final java.lang.String BLOCK_MODE_GCM = "GCM";
- field public static final java.lang.String DIGEST_MD5 = "MD5";
- field public static final java.lang.String DIGEST_NONE = "NONE";
- field public static final java.lang.String DIGEST_SHA1 = "SHA-1";
- field public static final java.lang.String DIGEST_SHA224 = "SHA-224";
- field public static final java.lang.String DIGEST_SHA256 = "SHA-256";
- field public static final java.lang.String DIGEST_SHA384 = "SHA-384";
- field public static final java.lang.String DIGEST_SHA512 = "SHA-512";
- field public static final java.lang.String ENCRYPTION_PADDING_NONE = "NoPadding";
- field public static final java.lang.String ENCRYPTION_PADDING_PKCS7 = "PKCS7Padding";
- field public static final java.lang.String ENCRYPTION_PADDING_RSA_OAEP = "OAEPPadding";
- field public static final java.lang.String ENCRYPTION_PADDING_RSA_PKCS1 = "PKCS1Padding";
- field public static final deprecated java.lang.String KEY_ALGORITHM_3DES = "DESede";
- field public static final java.lang.String KEY_ALGORITHM_AES = "AES";
- field public static final java.lang.String KEY_ALGORITHM_EC = "EC";
- field public static final java.lang.String KEY_ALGORITHM_HMAC_SHA1 = "HmacSHA1";
- field public static final java.lang.String KEY_ALGORITHM_HMAC_SHA224 = "HmacSHA224";
- field public static final java.lang.String KEY_ALGORITHM_HMAC_SHA256 = "HmacSHA256";
- field public static final java.lang.String KEY_ALGORITHM_HMAC_SHA384 = "HmacSHA384";
- field public static final java.lang.String KEY_ALGORITHM_HMAC_SHA512 = "HmacSHA512";
- field public static final java.lang.String KEY_ALGORITHM_RSA = "RSA";
+ field public static final String BLOCK_MODE_CBC = "CBC";
+ field public static final String BLOCK_MODE_CTR = "CTR";
+ field public static final String BLOCK_MODE_ECB = "ECB";
+ field public static final String BLOCK_MODE_GCM = "GCM";
+ field public static final String DIGEST_MD5 = "MD5";
+ field public static final String DIGEST_NONE = "NONE";
+ field public static final String DIGEST_SHA1 = "SHA-1";
+ field public static final String DIGEST_SHA224 = "SHA-224";
+ field public static final String DIGEST_SHA256 = "SHA-256";
+ field public static final String DIGEST_SHA384 = "SHA-384";
+ field public static final String DIGEST_SHA512 = "SHA-512";
+ field public static final String ENCRYPTION_PADDING_NONE = "NoPadding";
+ field public static final String ENCRYPTION_PADDING_PKCS7 = "PKCS7Padding";
+ field public static final String ENCRYPTION_PADDING_RSA_OAEP = "OAEPPadding";
+ field public static final String ENCRYPTION_PADDING_RSA_PKCS1 = "PKCS1Padding";
+ field @Deprecated public static final String KEY_ALGORITHM_3DES = "DESede";
+ field public static final String KEY_ALGORITHM_AES = "AES";
+ field public static final String KEY_ALGORITHM_EC = "EC";
+ field public static final String KEY_ALGORITHM_HMAC_SHA1 = "HmacSHA1";
+ field public static final String KEY_ALGORITHM_HMAC_SHA224 = "HmacSHA224";
+ field public static final String KEY_ALGORITHM_HMAC_SHA256 = "HmacSHA256";
+ field public static final String KEY_ALGORITHM_HMAC_SHA384 = "HmacSHA384";
+ field public static final String KEY_ALGORITHM_HMAC_SHA512 = "HmacSHA512";
+ field public static final String KEY_ALGORITHM_RSA = "RSA";
field public static final int ORIGIN_GENERATED = 1; // 0x1
field public static final int ORIGIN_IMPORTED = 2; // 0x2
field public static final int ORIGIN_SECURELY_IMPORTED = 8; // 0x8
@@ -40485,19 +40735,19 @@ package android.security.keystore {
field public static final int PURPOSE_SIGN = 4; // 0x4
field public static final int PURPOSE_VERIFY = 8; // 0x8
field public static final int PURPOSE_WRAP_KEY = 32; // 0x20
- field public static final java.lang.String SIGNATURE_PADDING_RSA_PKCS1 = "PKCS1";
- field public static final java.lang.String SIGNATURE_PADDING_RSA_PSS = "PSS";
+ field public static final String SIGNATURE_PADDING_RSA_PKCS1 = "PKCS1";
+ field public static final String SIGNATURE_PADDING_RSA_PSS = "PSS";
}
public final class KeyProtection implements java.security.KeyStore.ProtectionParameter {
- method public java.lang.String[] getBlockModes();
- method public java.lang.String[] getDigests();
- method public java.lang.String[] getEncryptionPaddings();
- method public java.util.Date getKeyValidityForConsumptionEnd();
- method public java.util.Date getKeyValidityForOriginationEnd();
- method public java.util.Date getKeyValidityStart();
+ method @NonNull public String[] getBlockModes();
+ method @NonNull public String[] getDigests();
+ method @NonNull public String[] getEncryptionPaddings();
+ method @Nullable public java.util.Date getKeyValidityForConsumptionEnd();
+ method @Nullable public java.util.Date getKeyValidityForOriginationEnd();
+ method @Nullable public java.util.Date getKeyValidityStart();
method public int getPurposes();
- method public java.lang.String[] getSignaturePaddings();
+ method @NonNull public String[] getSignaturePaddings();
method public int getUserAuthenticationValidityDurationSeconds();
method public boolean isDigestsSpecified();
method public boolean isInvalidatedByBiometricEnrollment();
@@ -40511,57 +40761,57 @@ package android.security.keystore {
public static final class KeyProtection.Builder {
ctor public KeyProtection.Builder(int);
- method public android.security.keystore.KeyProtection build();
- method public android.security.keystore.KeyProtection.Builder setBlockModes(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setDigests(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setEncryptionPaddings(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setInvalidatedByBiometricEnrollment(boolean);
- method public android.security.keystore.KeyProtection.Builder setKeyValidityEnd(java.util.Date);
- method public android.security.keystore.KeyProtection.Builder setKeyValidityForConsumptionEnd(java.util.Date);
- method public android.security.keystore.KeyProtection.Builder setKeyValidityForOriginationEnd(java.util.Date);
- method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
- method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
- method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
- method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
- method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
- method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int);
- method public android.security.keystore.KeyProtection.Builder setUserConfirmationRequired(boolean);
- method public android.security.keystore.KeyProtection.Builder setUserPresenceRequired(boolean);
+ method @NonNull public android.security.keystore.KeyProtection build();
+ method @NonNull public android.security.keystore.KeyProtection.Builder setBlockModes(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setDigests(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setEncryptionPaddings(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setInvalidatedByBiometricEnrollment(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityForConsumptionEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityForOriginationEnd(java.util.Date);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(@IntRange(from=0xffffffff) int);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUserConfirmationRequired(boolean);
+ method @NonNull public android.security.keystore.KeyProtection.Builder setUserPresenceRequired(boolean);
}
public class SecureKeyImportUnavailableException extends java.security.ProviderException {
ctor public SecureKeyImportUnavailableException();
- ctor public SecureKeyImportUnavailableException(java.lang.String);
- ctor public SecureKeyImportUnavailableException(java.lang.String, java.lang.Throwable);
- ctor public SecureKeyImportUnavailableException(java.lang.Throwable);
+ ctor public SecureKeyImportUnavailableException(String);
+ ctor public SecureKeyImportUnavailableException(String, Throwable);
+ ctor public SecureKeyImportUnavailableException(Throwable);
}
public class StrongBoxUnavailableException extends java.security.ProviderException {
ctor public StrongBoxUnavailableException();
- ctor public StrongBoxUnavailableException(java.lang.String);
- ctor public StrongBoxUnavailableException(java.lang.String, java.lang.Throwable);
- ctor public StrongBoxUnavailableException(java.lang.Throwable);
+ ctor public StrongBoxUnavailableException(String);
+ ctor public StrongBoxUnavailableException(String, Throwable);
+ ctor public StrongBoxUnavailableException(Throwable);
}
public class UserNotAuthenticatedException extends java.security.InvalidKeyException {
ctor public UserNotAuthenticatedException();
- ctor public UserNotAuthenticatedException(java.lang.String);
- ctor public UserNotAuthenticatedException(java.lang.String, java.lang.Throwable);
+ ctor public UserNotAuthenticatedException(String);
+ ctor public UserNotAuthenticatedException(String, Throwable);
}
public class UserPresenceUnavailableException extends java.security.InvalidKeyException {
ctor public UserPresenceUnavailableException();
- ctor public UserPresenceUnavailableException(java.lang.String);
- ctor public UserPresenceUnavailableException(java.lang.String, java.lang.Throwable);
+ ctor public UserPresenceUnavailableException(String);
+ ctor public UserPresenceUnavailableException(String, Throwable);
}
public class WrappedKeyEntry implements java.security.KeyStore.Entry {
- ctor public WrappedKeyEntry(byte[], java.lang.String, java.lang.String, java.security.spec.AlgorithmParameterSpec);
+ ctor public WrappedKeyEntry(byte[], String, String, java.security.spec.AlgorithmParameterSpec);
method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
- method public java.lang.String getTransformation();
+ method public String getTransformation();
method public byte[] getWrappedKeyBytes();
- method public java.lang.String getWrappingKeyAlias();
+ method public String getWrappingKeyAlias();
}
}
@@ -40570,14 +40820,14 @@ package android.service.autofill {
public abstract class AutofillService extends android.app.Service {
ctor public AutofillService();
- method public final android.service.autofill.FillEventHistory getFillEventHistory();
+ method @Nullable public final android.service.autofill.FillEventHistory getFillEventHistory();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
- method public abstract void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public abstract void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
- field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
+ method public abstract void onFillRequest(@NonNull android.service.autofill.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.FillCallback);
+ method public abstract void onSaveRequest(@NonNull android.service.autofill.SaveRequest, @NonNull android.service.autofill.SaveCallback);
+ field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
+ field public static final String SERVICE_META_DATA = "android.autofill";
}
public final class BatchUpdates implements android.os.Parcelable {
@@ -40589,8 +40839,8 @@ package android.service.autofill {
public static class BatchUpdates.Builder {
ctor public BatchUpdates.Builder();
method public android.service.autofill.BatchUpdates build();
- method public android.service.autofill.BatchUpdates.Builder transformChild(int, android.service.autofill.Transformation);
- method public android.service.autofill.BatchUpdates.Builder updateTemplate(android.widget.RemoteViews);
+ method public android.service.autofill.BatchUpdates.Builder transformChild(int, @NonNull android.service.autofill.Transformation);
+ method public android.service.autofill.BatchUpdates.Builder updateTemplate(@NonNull android.widget.RemoteViews);
}
public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
@@ -40600,8 +40850,8 @@ package android.service.autofill {
}
public static class CharSequenceTransformation.Builder {
- ctor public CharSequenceTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
- method public android.service.autofill.CharSequenceTransformation.Builder addField(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ ctor public CharSequenceTransformation.Builder(@NonNull android.view.autofill.AutofillId, @NonNull java.util.regex.Pattern, @NonNull String);
+ method public android.service.autofill.CharSequenceTransformation.Builder addField(@NonNull android.view.autofill.AutofillId, @NonNull java.util.regex.Pattern, @NonNull String);
method public android.service.autofill.CharSequenceTransformation build();
}
@@ -40612,10 +40862,10 @@ package android.service.autofill {
}
public static class CustomDescription.Builder {
- ctor public CustomDescription.Builder(android.widget.RemoteViews);
- method public android.service.autofill.CustomDescription.Builder addChild(int, android.service.autofill.Transformation);
- method public android.service.autofill.CustomDescription.Builder addOnClickAction(int, android.service.autofill.OnClickAction);
- method public android.service.autofill.CustomDescription.Builder batchUpdate(android.service.autofill.Validator, android.service.autofill.BatchUpdates);
+ ctor public CustomDescription.Builder(@NonNull android.widget.RemoteViews);
+ method public android.service.autofill.CustomDescription.Builder addChild(int, @NonNull android.service.autofill.Transformation);
+ method public android.service.autofill.CustomDescription.Builder addOnClickAction(int, @NonNull android.service.autofill.OnClickAction);
+ method public android.service.autofill.CustomDescription.Builder batchUpdate(@NonNull android.service.autofill.Validator, @NonNull android.service.autofill.BatchUpdates);
method public android.service.autofill.CustomDescription build();
}
@@ -40626,43 +40876,43 @@ package android.service.autofill {
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder(android.widget.RemoteViews);
+ ctor public Dataset.Builder(@NonNull android.widget.RemoteViews);
ctor public Dataset.Builder();
- method public android.service.autofill.Dataset build();
- method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setId(java.lang.String);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, android.widget.RemoteViews);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern, android.widget.RemoteViews);
+ method @NonNull public android.service.autofill.Dataset build();
+ method @NonNull public android.service.autofill.Dataset.Builder setAuthentication(@Nullable android.content.IntentSender);
+ method @NonNull public android.service.autofill.Dataset.Builder setId(@Nullable String);
+ method @NonNull public android.service.autofill.Dataset.Builder setValue(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue);
+ method @NonNull public android.service.autofill.Dataset.Builder setValue(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @NonNull android.widget.RemoteViews);
+ method @NonNull public android.service.autofill.Dataset.Builder setValue(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @Nullable java.util.regex.Pattern);
+ method @NonNull public android.service.autofill.Dataset.Builder setValue(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @Nullable java.util.regex.Pattern, @NonNull android.widget.RemoteViews);
}
public final class DateTransformation implements android.os.Parcelable android.service.autofill.Transformation {
- ctor public DateTransformation(android.view.autofill.AutofillId, android.icu.text.DateFormat);
+ ctor public DateTransformation(@NonNull android.view.autofill.AutofillId, @NonNull android.icu.text.DateFormat);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.DateTransformation> CREATOR;
}
public final class DateValueSanitizer implements android.os.Parcelable android.service.autofill.Sanitizer {
- ctor public DateValueSanitizer(android.icu.text.DateFormat);
+ ctor public DateValueSanitizer(@NonNull android.icu.text.DateFormat);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.DateValueSanitizer> CREATOR;
}
public final class FieldClassification {
- method public java.util.List<android.service.autofill.FieldClassification.Match> getMatches();
+ method @NonNull public java.util.List<android.service.autofill.FieldClassification.Match> getMatches();
}
public static final class FieldClassification.Match {
- method public java.lang.String getCategoryId();
+ method @NonNull public String getCategoryId();
method public float getScore();
}
public final class FillCallback {
- method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(android.service.autofill.FillResponse);
+ method public void onFailure(@Nullable CharSequence);
+ method public void onSuccess(@Nullable android.service.autofill.FillResponse);
}
public final class FillContext implements android.os.Parcelable {
@@ -40675,20 +40925,20 @@ package android.service.autofill {
public final class FillEventHistory implements android.os.Parcelable {
method public int describeContents();
- method public deprecated android.os.Bundle getClientState();
- method public java.util.List<android.service.autofill.FillEventHistory.Event> getEvents();
+ method @Deprecated @Nullable public android.os.Bundle getClientState();
+ method @Nullable public java.util.List<android.service.autofill.FillEventHistory.Event> getEvents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillEventHistory> CREATOR;
}
public static final class FillEventHistory.Event {
- method public java.util.Map<android.view.autofill.AutofillId, java.lang.String> getChangedFields();
- method public android.os.Bundle getClientState();
- method public java.lang.String getDatasetId();
- method public java.util.Map<android.view.autofill.AutofillId, android.service.autofill.FieldClassification> getFieldsClassification();
- method public java.util.Set<java.lang.String> getIgnoredDatasetIds();
- method public java.util.Map<android.view.autofill.AutofillId, java.util.Set<java.lang.String>> getManuallyEnteredField();
- method public java.util.Set<java.lang.String> getSelectedDatasetIds();
+ method @NonNull public java.util.Map<android.view.autofill.AutofillId,java.lang.String> getChangedFields();
+ method @Nullable public android.os.Bundle getClientState();
+ method @Nullable public String getDatasetId();
+ method @NonNull public java.util.Map<android.view.autofill.AutofillId,android.service.autofill.FieldClassification> getFieldsClassification();
+ method @NonNull public java.util.Set<java.lang.String> getIgnoredDatasetIds();
+ method @NonNull public java.util.Map<android.view.autofill.AutofillId,java.util.Set<java.lang.String>> getManuallyEnteredField();
+ method @NonNull public java.util.Set<java.lang.String> getSelectedDatasetIds();
method public int getType();
field public static final int TYPE_AUTHENTICATION_SELECTED = 2; // 0x2
field public static final int TYPE_CONTEXT_COMMITTED = 4; // 0x4
@@ -40699,8 +40949,8 @@ package android.service.autofill {
public final class FillRequest implements android.os.Parcelable {
method public int describeContents();
- method public android.os.Bundle getClientState();
- method public java.util.List<android.service.autofill.FillContext> getFillContexts();
+ method @Nullable public android.os.Bundle getClientState();
+ method @NonNull public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
method public void writeToParcel(android.os.Parcel, int);
@@ -40719,18 +40969,18 @@ package android.service.autofill {
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
- method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
+ method @NonNull public android.service.autofill.FillResponse.Builder addDataset(@Nullable android.service.autofill.Dataset);
method public android.service.autofill.FillResponse build();
method public android.service.autofill.FillResponse.Builder disableAutofill(long);
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews);
- method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle);
- method public android.service.autofill.FillResponse.Builder setFieldClassificationIds(android.view.autofill.AutofillId...);
+ method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews);
+ method public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle);
+ method public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...);
method public android.service.autofill.FillResponse.Builder setFlags(int);
- method public android.service.autofill.FillResponse.Builder setFooter(android.widget.RemoteViews);
- method public android.service.autofill.FillResponse.Builder setHeader(android.widget.RemoteViews);
+ method public android.service.autofill.FillResponse.Builder setFooter(@NonNull android.widget.RemoteViews);
+ method public android.service.autofill.FillResponse.Builder setHeader(@NonNull android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
- method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
- method public android.service.autofill.FillResponse.Builder setUserData(android.service.autofill.UserData);
+ method @NonNull public android.service.autofill.FillResponse.Builder setSaveInfo(@NonNull android.service.autofill.SaveInfo);
+ method public android.service.autofill.FillResponse.Builder setUserData(@NonNull android.service.autofill.UserData);
}
public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
@@ -40740,37 +40990,37 @@ package android.service.autofill {
}
public static class ImageTransformation.Builder {
- ctor public deprecated ImageTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, int);
- ctor public ImageTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, int, java.lang.CharSequence);
- method public deprecated android.service.autofill.ImageTransformation.Builder addOption(java.util.regex.Pattern, int);
- method public android.service.autofill.ImageTransformation.Builder addOption(java.util.regex.Pattern, int, java.lang.CharSequence);
+ ctor @Deprecated public ImageTransformation.Builder(@NonNull android.view.autofill.AutofillId, @NonNull java.util.regex.Pattern, @DrawableRes int);
+ ctor public ImageTransformation.Builder(@NonNull android.view.autofill.AutofillId, @NonNull java.util.regex.Pattern, @DrawableRes int, @NonNull CharSequence);
+ method @Deprecated public android.service.autofill.ImageTransformation.Builder addOption(@NonNull java.util.regex.Pattern, @DrawableRes int);
+ method public android.service.autofill.ImageTransformation.Builder addOption(@NonNull java.util.regex.Pattern, @DrawableRes int, @NonNull CharSequence);
method public android.service.autofill.ImageTransformation build();
}
public final class LuhnChecksumValidator implements android.os.Parcelable android.service.autofill.Validator {
- ctor public LuhnChecksumValidator(android.view.autofill.AutofillId...);
+ ctor public LuhnChecksumValidator(@NonNull android.view.autofill.AutofillId...);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.LuhnChecksumValidator> CREATOR;
}
- public abstract interface OnClickAction {
+ public interface OnClickAction {
}
public final class RegexValidator implements android.os.Parcelable android.service.autofill.Validator {
- ctor public RegexValidator(android.view.autofill.AutofillId, java.util.regex.Pattern);
+ ctor public RegexValidator(@NonNull android.view.autofill.AutofillId, @NonNull java.util.regex.Pattern);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.RegexValidator> CREATOR;
}
- public abstract interface Sanitizer {
+ public interface Sanitizer {
}
public final class SaveCallback {
- method public void onFailure(java.lang.CharSequence);
+ method public void onFailure(CharSequence);
method public void onSuccess();
- method public void onSuccess(android.content.IntentSender);
+ method public void onSuccess(@NonNull android.content.IntentSender);
}
public final class SaveInfo implements android.os.Parcelable {
@@ -40791,43 +41041,43 @@ package android.service.autofill {
}
public static final class SaveInfo.Builder {
- ctor public SaveInfo.Builder(int, android.view.autofill.AutofillId[]);
+ ctor public SaveInfo.Builder(int, @NonNull android.view.autofill.AutofillId[]);
ctor public SaveInfo.Builder(int);
- method public android.service.autofill.SaveInfo.Builder addSanitizer(android.service.autofill.Sanitizer, android.view.autofill.AutofillId...);
+ method @NonNull public android.service.autofill.SaveInfo.Builder addSanitizer(@NonNull android.service.autofill.Sanitizer, @NonNull android.view.autofill.AutofillId...);
method public android.service.autofill.SaveInfo build();
- method public android.service.autofill.SaveInfo.Builder setCustomDescription(android.service.autofill.CustomDescription);
- method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
- method public android.service.autofill.SaveInfo.Builder setFlags(int);
- method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
- method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
- method public android.service.autofill.SaveInfo.Builder setTriggerId(android.view.autofill.AutofillId);
- method public android.service.autofill.SaveInfo.Builder setValidator(android.service.autofill.Validator);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setCustomDescription(@NonNull android.service.autofill.CustomDescription);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setDescription(@Nullable CharSequence);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setFlags(int);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setNegativeAction(int, @Nullable android.content.IntentSender);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setOptionalIds(@NonNull android.view.autofill.AutofillId[]);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setTriggerId(@NonNull android.view.autofill.AutofillId);
+ method @NonNull public android.service.autofill.SaveInfo.Builder setValidator(@NonNull android.service.autofill.Validator);
}
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
- method public android.os.Bundle getClientState();
- method public java.util.List<java.lang.String> getDatasetIds();
- method public java.util.List<android.service.autofill.FillContext> getFillContexts();
+ method @Nullable public android.os.Bundle getClientState();
+ method @Nullable public java.util.List<java.lang.String> getDatasetIds();
+ method @NonNull public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
}
public final class TextValueSanitizer implements android.os.Parcelable android.service.autofill.Sanitizer {
- ctor public TextValueSanitizer(java.util.regex.Pattern, java.lang.String);
+ ctor public TextValueSanitizer(@NonNull java.util.regex.Pattern, @NonNull String);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.TextValueSanitizer> CREATOR;
}
- public abstract interface Transformation {
+ public interface Transformation {
}
public final class UserData implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getFieldClassificationAlgorithm();
- method public java.lang.String getFieldClassificationAlgorithmForCategory(java.lang.String);
- method public java.lang.String getId();
+ method @Nullable public String getFieldClassificationAlgorithm();
+ method @Nullable public String getFieldClassificationAlgorithmForCategory(@NonNull String);
+ method public String getId();
method public static int getMaxCategoryCount();
method public static int getMaxFieldClassificationIdsSize();
method public static int getMaxUserDataSize();
@@ -40838,20 +41088,20 @@ package android.service.autofill {
}
public static final class UserData.Builder {
- ctor public UserData.Builder(java.lang.String, java.lang.String, java.lang.String);
- method public android.service.autofill.UserData.Builder add(java.lang.String, java.lang.String);
+ ctor public UserData.Builder(@NonNull String, @NonNull String, @NonNull String);
+ method public android.service.autofill.UserData.Builder add(@NonNull String, @NonNull String);
method public android.service.autofill.UserData build();
- method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithm(java.lang.String, android.os.Bundle);
- method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithmForCategory(java.lang.String, java.lang.String, android.os.Bundle);
+ method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithm(@Nullable String, @Nullable android.os.Bundle);
+ method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithmForCategory(@NonNull String, @Nullable String, @Nullable android.os.Bundle);
}
- public abstract interface Validator {
+ public interface Validator {
}
public final class Validators {
- method public static android.service.autofill.Validator and(android.service.autofill.Validator...);
- method public static android.service.autofill.Validator not(android.service.autofill.Validator);
- method public static android.service.autofill.Validator or(android.service.autofill.Validator...);
+ method @NonNull public static android.service.autofill.Validator and(@NonNull android.service.autofill.Validator...);
+ method @NonNull public static android.service.autofill.Validator not(@NonNull android.service.autofill.Validator);
+ method @NonNull public static android.service.autofill.Validator or(@NonNull android.service.autofill.Validator...);
}
public final class VisibilitySetterAction implements android.service.autofill.OnClickAction android.os.Parcelable {
@@ -40861,9 +41111,9 @@ package android.service.autofill {
}
public static class VisibilitySetterAction.Builder {
- ctor public VisibilitySetterAction.Builder(int, int);
+ ctor public VisibilitySetterAction.Builder(@IdRes int, int);
method public android.service.autofill.VisibilitySetterAction build();
- method public android.service.autofill.VisibilitySetterAction.Builder setVisibility(int, int);
+ method public android.service.autofill.VisibilitySetterAction.Builder setVisibility(@IdRes int, int);
}
}
@@ -40871,35 +41121,35 @@ package android.service.autofill {
package android.service.carrier {
public class CarrierIdentifier implements android.os.Parcelable {
- ctor public CarrierIdentifier(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- ctor public CarrierIdentifier(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, int, int);
- ctor public CarrierIdentifier(byte[], java.lang.String, java.lang.String);
+ ctor public CarrierIdentifier(String, String, @Nullable String, @Nullable String, @Nullable String, @Nullable String);
+ ctor public CarrierIdentifier(String, String, @Nullable String, @Nullable String, @Nullable String, @Nullable String, int, int);
+ ctor public CarrierIdentifier(byte[], @Nullable String, @Nullable String);
method public int describeContents();
method public int getCarrierId();
- method public java.lang.String getGid1();
- method public java.lang.String getGid2();
- method public java.lang.String getImsi();
- method public java.lang.String getMcc();
- method public java.lang.String getMnc();
+ method @Nullable public String getGid1();
+ method @Nullable public String getGid2();
+ method @Nullable public String getImsi();
+ method public String getMcc();
+ method public String getMnc();
method public int getPreciseCarrierId();
- method public java.lang.String getSpn();
+ method @Nullable public String getSpn();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.carrier.CarrierIdentifier> CREATOR;
}
public abstract class CarrierMessagingService extends android.app.Service {
ctor public CarrierMessagingService();
- method public android.os.IBinder onBind(android.content.Intent);
- method public void onDownloadMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Integer>);
- method public deprecated void onFilterSms(android.service.carrier.MessagePdu, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Boolean>);
- method public void onReceiveTextSms(android.service.carrier.MessagePdu, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Integer>);
- method public deprecated void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
- method public void onSendDataSms(byte[], int, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
- method public void onSendMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMmsResult>);
- method public deprecated void onSendMultipartTextSms(java.util.List<java.lang.String>, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMultipartSmsResult>);
- method public void onSendMultipartTextSms(java.util.List<java.lang.String>, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMultipartSmsResult>);
- method public deprecated void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
- method public void onSendTextSms(java.lang.String, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
+ method @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
+ method public void onDownloadMms(@NonNull android.net.Uri, int, @NonNull android.net.Uri, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Integer>);
+ method @Deprecated public void onFilterSms(@NonNull android.service.carrier.MessagePdu, @NonNull String, int, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Boolean>);
+ method public void onReceiveTextSms(@NonNull android.service.carrier.MessagePdu, @NonNull String, int, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Integer>);
+ method @Deprecated public void onSendDataSms(@NonNull byte[], int, @NonNull String, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
+ method public void onSendDataSms(@NonNull byte[], int, @NonNull String, int, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
+ method public void onSendMms(@NonNull android.net.Uri, int, @Nullable android.net.Uri, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMmsResult>);
+ method @Deprecated public void onSendMultipartTextSms(@NonNull java.util.List<java.lang.String>, int, @NonNull String, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMultipartSmsResult>);
+ method public void onSendMultipartTextSms(@NonNull java.util.List<java.lang.String>, int, @NonNull String, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMultipartSmsResult>);
+ method @Deprecated public void onSendTextSms(@NonNull String, int, @NonNull String, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
+ method public void onSendTextSms(@NonNull String, int, @NonNull String, int, @NonNull android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>);
field public static final int DOWNLOAD_STATUS_ERROR = 2; // 0x2
field public static final int DOWNLOAD_STATUS_OK = 0; // 0x0
field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1
@@ -40910,22 +41160,22 @@ package android.service.carrier {
field public static final int SEND_STATUS_ERROR = 2; // 0x2
field public static final int SEND_STATUS_OK = 0; // 0x0
field public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService";
+ field public static final String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService";
}
- public static abstract interface CarrierMessagingService.ResultCallback<T> {
- method public abstract void onReceiveResult(T) throws android.os.RemoteException;
+ public static interface CarrierMessagingService.ResultCallback<T> {
+ method public void onReceiveResult(@NonNull T) throws android.os.RemoteException;
}
public static final class CarrierMessagingService.SendMmsResult {
- ctor public CarrierMessagingService.SendMmsResult(int, byte[]);
- method public byte[] getSendConfPdu();
+ ctor public CarrierMessagingService.SendMmsResult(int, @Nullable byte[]);
+ method @Nullable public byte[] getSendConfPdu();
method public int getSendStatus();
}
public static final class CarrierMessagingService.SendMultipartSmsResult {
- ctor public CarrierMessagingService.SendMultipartSmsResult(int, int[]);
- method public int[] getMessageRefs();
+ ctor public CarrierMessagingService.SendMultipartSmsResult(int, @Nullable int[]);
+ method @Nullable public int[] getMessageRefs();
method public int getSendStatus();
}
@@ -40938,15 +41188,15 @@ package android.service.carrier {
public abstract class CarrierService extends android.app.Service {
ctor public CarrierService();
method public final void notifyCarrierNetworkChange(boolean);
- method public android.os.IBinder onBind(android.content.Intent);
+ method @CallSuper public android.os.IBinder onBind(android.content.Intent);
method public abstract android.os.PersistableBundle onLoadConfig(android.service.carrier.CarrierIdentifier);
- field public static final java.lang.String CARRIER_SERVICE_INTERFACE = "android.service.carrier.CarrierService";
+ field public static final String CARRIER_SERVICE_INTERFACE = "android.service.carrier.CarrierService";
}
public final class MessagePdu implements android.os.Parcelable {
- ctor public MessagePdu(java.util.List<byte[]>);
+ ctor public MessagePdu(@NonNull java.util.List<byte[]>);
method public int describeContents();
- method public java.util.List<byte[]> getPdus();
+ method @NonNull public java.util.List<byte[]> getPdus();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.carrier.MessagePdu> CREATOR;
}
@@ -40956,13 +41206,13 @@ package android.service.carrier {
package android.service.chooser {
public final class ChooserTarget implements android.os.Parcelable {
- ctor public ChooserTarget(java.lang.CharSequence, android.graphics.drawable.Icon, float, android.content.ComponentName, android.os.Bundle);
+ ctor public ChooserTarget(CharSequence, android.graphics.drawable.Icon, float, android.content.ComponentName, @Nullable android.os.Bundle);
method public int describeContents();
method public android.content.ComponentName getComponentName();
method public android.graphics.drawable.Icon getIcon();
method public android.os.Bundle getIntentExtras();
method public float getScore();
- method public java.lang.CharSequence getTitle();
+ method public CharSequence getTitle();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.chooser.ChooserTarget> CREATOR;
}
@@ -40971,9 +41221,9 @@ package android.service.chooser {
ctor public ChooserTargetService();
method public android.os.IBinder onBind(android.content.Intent);
method public abstract java.util.List<android.service.chooser.ChooserTarget> onGetChooserTargets(android.content.ComponentName, android.content.IntentFilter);
- field public static final java.lang.String BIND_PERMISSION = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
- field public static final java.lang.String META_DATA_NAME = "android.service.chooser.chooser_target_service";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.chooser.ChooserTargetService";
+ field public static final String BIND_PERMISSION = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
+ field public static final String META_DATA_NAME = "android.service.chooser.chooser_target_service";
+ field public static final String SERVICE_INTERFACE = "android.service.chooser.ChooserTargetService";
}
}
@@ -40989,7 +41239,7 @@ package android.service.dreams {
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
- method public <T extends android.view.View> T findViewById(int);
+ method public <T extends android.view.View> T findViewById(@IdRes int);
method public final void finish();
method public android.view.Window getWindow();
method public android.view.WindowManager getWindowManager();
@@ -41017,16 +41267,16 @@ package android.service.dreams {
method public void onWindowFocusChanged(boolean);
method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
- method public final <T extends android.view.View> T requireViewById(int);
- method public void setContentView(int);
+ method @NonNull public final <T extends android.view.View> T requireViewById(@IdRes int);
+ method public void setContentView(@LayoutRes int);
method public void setContentView(android.view.View);
method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public void setFullscreen(boolean);
method public void setInteractive(boolean);
method public void setScreenBright(boolean);
method public final void wakeUp();
- field public static final java.lang.String DREAM_META_DATA = "android.service.dream";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.dreams.DreamService";
+ field public static final String DREAM_META_DATA = "android.service.dream";
+ field public static final String SERVICE_INTERFACE = "android.service.dreams.DreamService";
}
}
@@ -41042,28 +41292,28 @@ package android.service.media {
public abstract class MediaBrowserService extends android.app.Service {
ctor public MediaBrowserService();
- method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method public void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
method public final android.os.Bundle getBrowserRootHints();
method public final android.media.session.MediaSessionManager.RemoteUserInfo getCurrentBrowserInfo();
- method public android.media.session.MediaSession.Token getSessionToken();
- method public void notifyChildrenChanged(java.lang.String);
- method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
+ method @Nullable public android.media.session.MediaSession.Token getSessionToken();
+ method public void notifyChildrenChanged(@NonNull String);
+ method public void notifyChildrenChanged(@NonNull String, @NonNull android.os.Bundle);
method public android.os.IBinder onBind(android.content.Intent);
- method public abstract android.service.media.MediaBrowserService.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
- method public abstract void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
- method public void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>, android.os.Bundle);
- method public void onLoadItem(java.lang.String, android.service.media.MediaBrowserService.Result<android.media.browse.MediaBrowser.MediaItem>);
+ method @Nullable public abstract android.service.media.MediaBrowserService.BrowserRoot onGetRoot(@NonNull String, int, @Nullable android.os.Bundle);
+ method public abstract void onLoadChildren(@NonNull String, @NonNull android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
+ method public void onLoadChildren(@NonNull String, @NonNull android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>, @NonNull android.os.Bundle);
+ method public void onLoadItem(String, android.service.media.MediaBrowserService.Result<android.media.browse.MediaBrowser.MediaItem>);
method public void setSessionToken(android.media.session.MediaSession.Token);
- field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+ field public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
}
public static final class MediaBrowserService.BrowserRoot {
- ctor public MediaBrowserService.BrowserRoot(java.lang.String, android.os.Bundle);
+ ctor public MediaBrowserService.BrowserRoot(@NonNull String, @Nullable android.os.Bundle);
method public android.os.Bundle getExtras();
- method public java.lang.String getRootId();
- field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
- field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
- field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+ method public String getRootId();
+ field public static final String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+ field public static final String EXTRA_RECENT = "android.service.media.extra.RECENT";
+ field public static final String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
}
public class MediaBrowserService.Result<T> {
@@ -41076,20 +41326,20 @@ package android.service.media {
package android.service.notification {
public final class Condition implements android.os.Parcelable {
- ctor public Condition(android.net.Uri, java.lang.String, int);
- ctor public Condition(android.net.Uri, java.lang.String, java.lang.String, java.lang.String, int, int, int);
+ ctor public Condition(android.net.Uri, String, int);
+ ctor public Condition(android.net.Uri, String, String, String, int, int, int);
ctor public Condition(android.os.Parcel);
method public android.service.notification.Condition copy();
method public int describeContents();
- method public static boolean isValidId(android.net.Uri, java.lang.String);
+ method public static boolean isValidId(android.net.Uri, String);
method public static android.net.Uri.Builder newId(android.content.Context);
- method public static java.lang.String relevanceToString(int);
- method public static java.lang.String stateToString(int);
+ method public static String relevanceToString(int);
+ method public static String stateToString(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Condition> CREATOR;
field public static final int FLAG_RELEVANT_ALWAYS = 2; // 0x2
field public static final int FLAG_RELEVANT_NOW = 1; // 0x1
- field public static final java.lang.String SCHEME = "condition";
+ field public static final String SCHEME = "condition";
field public static final int STATE_ERROR = 3; // 0x3
field public static final int STATE_FALSE = 0; // 0x0
field public static final int STATE_TRUE = 1; // 0x1
@@ -41097,52 +41347,52 @@ package android.service.notification {
field public final int flags;
field public final int icon;
field public final android.net.Uri id;
- field public final java.lang.String line1;
- field public final java.lang.String line2;
+ field public final String line1;
+ field public final String line2;
field public final int state;
- field public final java.lang.String summary;
- }
-
- public abstract deprecated class ConditionProviderService extends android.app.Service {
- ctor public ConditionProviderService();
- method public final deprecated void notifyCondition(android.service.notification.Condition);
- method public final deprecated void notifyConditions(android.service.notification.Condition...);
- method public android.os.IBinder onBind(android.content.Intent);
- method public abstract void onConnected();
- method public void onRequestConditions(int);
- method public abstract void onSubscribe(android.net.Uri);
- method public abstract void onUnsubscribe(android.net.Uri);
- method public static final void requestRebind(android.content.ComponentName);
- method public final void requestUnbind();
- field public static final deprecated java.lang.String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID";
- field public static final deprecated java.lang.String META_DATA_CONFIGURATION_ACTIVITY = "android.service.zen.automatic.configurationActivity";
- field public static final deprecated java.lang.String META_DATA_RULE_INSTANCE_LIMIT = "android.service.zen.automatic.ruleInstanceLimit";
- field public static final deprecated java.lang.String META_DATA_RULE_TYPE = "android.service.zen.automatic.ruleType";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.ConditionProviderService";
+ field public final String summary;
+ }
+
+ @Deprecated public abstract class ConditionProviderService extends android.app.Service {
+ ctor @Deprecated public ConditionProviderService();
+ method @Deprecated public final void notifyCondition(android.service.notification.Condition);
+ method @Deprecated public final void notifyConditions(android.service.notification.Condition...);
+ method @Deprecated public android.os.IBinder onBind(android.content.Intent);
+ method @Deprecated public abstract void onConnected();
+ method @Deprecated public void onRequestConditions(int);
+ method @Deprecated public abstract void onSubscribe(android.net.Uri);
+ method @Deprecated public abstract void onUnsubscribe(android.net.Uri);
+ method @Deprecated public static final void requestRebind(android.content.ComponentName);
+ method @Deprecated public final void requestUnbind();
+ field @Deprecated public static final String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID";
+ field @Deprecated public static final String META_DATA_CONFIGURATION_ACTIVITY = "android.service.zen.automatic.configurationActivity";
+ field @Deprecated public static final String META_DATA_RULE_INSTANCE_LIMIT = "android.service.zen.automatic.ruleInstanceLimit";
+ field @Deprecated public static final String META_DATA_RULE_TYPE = "android.service.zen.automatic.ruleType";
+ field @Deprecated public static final String SERVICE_INTERFACE = "android.service.notification.ConditionProviderService";
}
public abstract class NotificationListenerService extends android.app.Service {
ctor public NotificationListenerService();
method public final void cancelAllNotifications();
- method public final deprecated void cancelNotification(java.lang.String, java.lang.String, int);
- method public final void cancelNotification(java.lang.String);
- method public final void cancelNotifications(java.lang.String[]);
+ method @Deprecated public final void cancelNotification(String, String, int);
+ method public final void cancelNotification(String);
+ method public final void cancelNotifications(String[]);
method public final void clearRequestedListenerHints();
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
- method public android.service.notification.StatusBarNotification[] getActiveNotifications(java.lang.String[]);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(String[]);
method public final int getCurrentInterruptionFilter();
method public final int getCurrentListenerHints();
method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking();
- method public final java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups(java.lang.String, android.os.UserHandle);
- method public final java.util.List<android.app.NotificationChannel> getNotificationChannels(java.lang.String, android.os.UserHandle);
+ method public final java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups(@NonNull String, @NonNull android.os.UserHandle);
+ method public final java.util.List<android.app.NotificationChannel> getNotificationChannels(@NonNull String, @NonNull android.os.UserHandle);
method public final android.service.notification.StatusBarNotification[] getSnoozedNotifications();
method public android.os.IBinder onBind(android.content.Intent);
method public void onInterruptionFilterChanged(int);
method public void onListenerConnected();
method public void onListenerDisconnected();
method public void onListenerHintsChanged(int);
- method public void onNotificationChannelGroupModified(java.lang.String, android.os.UserHandle, android.app.NotificationChannelGroup, int);
- method public void onNotificationChannelModified(java.lang.String, android.os.UserHandle, android.app.NotificationChannel, int);
+ method public void onNotificationChannelGroupModified(String, android.os.UserHandle, android.app.NotificationChannelGroup, int);
+ method public void onNotificationChannelModified(String, android.os.UserHandle, android.app.NotificationChannel, int);
method public void onNotificationPosted(android.service.notification.StatusBarNotification);
method public void onNotificationPosted(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap);
method public void onNotificationRankingUpdate(android.service.notification.NotificationListenerService.RankingMap);
@@ -41153,9 +41403,9 @@ package android.service.notification {
method public final void requestListenerHints(int);
method public static void requestRebind(android.content.ComponentName);
method public final void requestUnbind();
- method public final void setNotificationsShown(java.lang.String[]);
- method public final void snoozeNotification(java.lang.String, long);
- method public final void updateNotificationChannel(java.lang.String, android.os.UserHandle, android.app.NotificationChannel);
+ method public final void setNotificationsShown(String[]);
+ method public final void snoozeNotification(String, long);
+ method public final void updateNotificationChannel(@NonNull String, @NonNull android.os.UserHandle, @NonNull android.app.NotificationChannel);
field public static final int HINT_HOST_DISABLE_CALL_EFFECTS = 4; // 0x4
field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1
field public static final int HINT_HOST_DISABLE_NOTIFICATION_EFFECTS = 2; // 0x2
@@ -41186,9 +41436,9 @@ package android.service.notification {
field public static final int REASON_TIMEOUT = 19; // 0x13
field public static final int REASON_UNAUTOBUNDLED = 16; // 0x10
field public static final int REASON_USER_STOPPED = 6; // 0x6
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService";
- field public static final deprecated int SUPPRESSED_EFFECT_SCREEN_OFF = 1; // 0x1
- field public static final deprecated int SUPPRESSED_EFFECT_SCREEN_ON = 2; // 0x2
+ field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService";
+ field @Deprecated public static final int SUPPRESSED_EFFECT_SCREEN_OFF = 1; // 0x1
+ field @Deprecated public static final int SUPPRESSED_EFFECT_SCREEN_ON = 2; // 0x2
}
public static class NotificationListenerService.Ranking {
@@ -41196,10 +41446,10 @@ package android.service.notification {
method public boolean canShowBadge();
method public android.app.NotificationChannel getChannel();
method public int getImportance();
- method public java.lang.CharSequence getImportanceExplanation();
- method public java.lang.String getKey();
+ method public CharSequence getImportanceExplanation();
+ method public String getKey();
method public long getLastAudiblyAlertedMillis();
- method public java.lang.String getOverrideGroupKey();
+ method public String getOverrideGroupKey();
method public int getRank();
method public int getSuppressedVisualEffects();
method public int getUserSentiment();
@@ -41213,33 +41463,33 @@ package android.service.notification {
public static class NotificationListenerService.RankingMap implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String[] getOrderedKeys();
- method public boolean getRanking(java.lang.String, android.service.notification.NotificationListenerService.Ranking);
+ method public String[] getOrderedKeys();
+ method public boolean getRanking(String, android.service.notification.NotificationListenerService.Ranking);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.NotificationListenerService.RankingMap> CREATOR;
}
public class StatusBarNotification implements android.os.Parcelable {
- ctor public deprecated StatusBarNotification(java.lang.String, java.lang.String, int, java.lang.String, int, int, int, android.app.Notification, android.os.UserHandle, long);
+ ctor @Deprecated public StatusBarNotification(String, String, int, String, int, int, int, android.app.Notification, android.os.UserHandle, long);
ctor public StatusBarNotification(android.os.Parcel);
method public android.service.notification.StatusBarNotification clone();
method public int describeContents();
- method public java.lang.String getGroupKey();
+ method public String getGroupKey();
method public int getId();
- method public java.lang.String getKey();
+ method public String getKey();
method public android.app.Notification getNotification();
- method public java.lang.String getOpPkg();
- method public java.lang.String getOverrideGroupKey();
- method public java.lang.String getPackageName();
+ method public String getOpPkg();
+ method public String getOverrideGroupKey();
+ method public String getPackageName();
method public long getPostTime();
- method public java.lang.String getTag();
+ method public String getTag();
method public int getUid();
method public android.os.UserHandle getUser();
- method public deprecated int getUserId();
+ method @Deprecated public int getUserId();
method public boolean isClearable();
method public boolean isGroup();
method public boolean isOngoing();
- method public void setOverrideGroupKey(java.lang.String);
+ method public void setOverrideGroupKey(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.StatusBarNotification> CREATOR;
}
@@ -41305,16 +41555,16 @@ package android.service.quicksettings {
public final class Tile implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.CharSequence getContentDescription();
+ method public CharSequence getContentDescription();
method public android.graphics.drawable.Icon getIcon();
- method public java.lang.CharSequence getLabel();
+ method public CharSequence getLabel();
method public int getState();
- method public java.lang.CharSequence getSubtitle();
- method public void setContentDescription(java.lang.CharSequence);
+ method @Nullable public CharSequence getSubtitle();
+ method public void setContentDescription(CharSequence);
method public void setIcon(android.graphics.drawable.Icon);
- method public void setLabel(java.lang.CharSequence);
+ method public void setLabel(CharSequence);
method public void setState(int);
- method public void setSubtitle(java.lang.CharSequence);
+ method public void setSubtitle(@Nullable CharSequence);
method public void updateTile();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.quicksettings.Tile> CREATOR;
@@ -41337,10 +41587,10 @@ package android.service.quicksettings {
method public static final void requestListeningState(android.content.Context, android.content.ComponentName);
method public final void showDialog(android.app.Dialog);
method public final void startActivityAndCollapse(android.content.Intent);
- method public final void unlockAndRun(java.lang.Runnable);
- field public static final java.lang.String ACTION_QS_TILE = "android.service.quicksettings.action.QS_TILE";
- field public static final java.lang.String ACTION_QS_TILE_PREFERENCES = "android.service.quicksettings.action.QS_TILE_PREFERENCES";
- field public static final java.lang.String META_DATA_ACTIVE_TILE = "android.service.quicksettings.ACTIVE_TILE";
+ method public final void unlockAndRun(Runnable);
+ field public static final String ACTION_QS_TILE = "android.service.quicksettings.action.QS_TILE";
+ field public static final String ACTION_QS_TILE_PREFERENCES = "android.service.quicksettings.action.QS_TILE_PREFERENCES";
+ field public static final String META_DATA_ACTIVE_TILE = "android.service.quicksettings.ACTIVE_TILE";
}
}
@@ -41350,7 +41600,7 @@ package android.service.restrictions {
public abstract class RestrictionsReceiver extends android.content.BroadcastReceiver {
ctor public RestrictionsReceiver();
method public void onReceive(android.content.Context, android.content.Intent);
- method public abstract void onRequestPermission(android.content.Context, java.lang.String, java.lang.String, java.lang.String, android.os.PersistableBundle);
+ method public abstract void onRequestPermission(android.content.Context, String, String, String, android.os.PersistableBundle);
}
}
@@ -41361,13 +41611,13 @@ package android.service.textservice {
ctor public SpellCheckerService();
method public abstract android.service.textservice.SpellCheckerService.Session createSession();
method public final android.os.IBinder onBind(android.content.Intent);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.textservice.SpellCheckerService";
+ field public static final String SERVICE_INTERFACE = "android.service.textservice.SpellCheckerService";
}
- public static abstract class SpellCheckerService.Session {
+ public abstract static class SpellCheckerService.Session {
ctor public SpellCheckerService.Session();
method public android.os.Bundle getBundle();
- method public java.lang.String getLocale();
+ method public String getLocale();
method public void onCancel();
method public void onClose();
method public abstract void onCreate();
@@ -41397,41 +41647,41 @@ package android.service.voice {
field public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; // 0xffffffff
}
- public static abstract class AlwaysOnHotwordDetector.Callback {
+ public abstract static class AlwaysOnHotwordDetector.Callback {
ctor public AlwaysOnHotwordDetector.Callback();
method public abstract void onAvailabilityChanged(int);
- method public abstract void onDetected(android.service.voice.AlwaysOnHotwordDetector.EventPayload);
+ method public abstract void onDetected(@NonNull android.service.voice.AlwaysOnHotwordDetector.EventPayload);
method public abstract void onError();
method public abstract void onRecognitionPaused();
method public abstract void onRecognitionResumed();
}
public static class AlwaysOnHotwordDetector.EventPayload {
- method public android.media.AudioFormat getCaptureAudioFormat();
- method public byte[] getTriggerAudio();
+ method @Nullable public android.media.AudioFormat getCaptureAudioFormat();
+ method @Nullable public byte[] getTriggerAudio();
}
public class VoiceInteractionService extends android.app.Service {
ctor public VoiceInteractionService();
- method public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(java.lang.String, java.util.Locale, android.service.voice.AlwaysOnHotwordDetector.Callback);
+ method public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, android.service.voice.AlwaysOnHotwordDetector.Callback);
method public int getDisabledShowContext();
method public static boolean isActiveService(android.content.Context, android.content.ComponentName);
method public android.os.IBinder onBind(android.content.Intent);
- method public java.util.Set<java.lang.String> onGetSupportedVoiceActions(java.util.Set<java.lang.String>);
+ method @Nullable public java.util.Set<java.lang.String> onGetSupportedVoiceActions(@NonNull java.util.Set<java.lang.String>);
method public void onLaunchVoiceAssistFromKeyguard();
method public void onReady();
method public void onShutdown();
method public void setDisabledShowContext(int);
method public void showSession(android.os.Bundle, int);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService";
- field public static final java.lang.String SERVICE_META_DATA = "android.voice_interaction";
+ field public static final String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService";
+ field public static final String SERVICE_META_DATA = "android.voice_interaction";
}
public class VoiceInteractionSession implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback {
ctor public VoiceInteractionSession(android.content.Context);
ctor public VoiceInteractionSession(android.content.Context, android.os.Handler);
method public void closeSystemDialogs();
- method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method public void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
method public void finish();
method public android.content.Context getContext();
method public int getDisabledShowContext();
@@ -41439,7 +41689,7 @@ package android.service.voice {
method public int getUserDisabledShowContext();
method public android.app.Dialog getWindow();
method public void hide();
- method public void onAssistStructureFailure(java.lang.Throwable);
+ method public void onAssistStructureFailure(Throwable);
method public void onBackPressed();
method public void onCancelRequest(android.service.voice.VoiceInteractionSession.Request);
method public void onCloseSystemDialogs();
@@ -41448,10 +41698,10 @@ package android.service.voice {
method public void onCreate();
method public android.view.View onCreateContentView();
method public void onDestroy();
- method public boolean[] onGetSupportedCommands(java.lang.String[]);
- method public void onHandleAssist(android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent);
- method public void onHandleAssistSecondary(android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, int, int);
- method public void onHandleScreenshot(android.graphics.Bitmap);
+ method public boolean[] onGetSupportedCommands(String[]);
+ method public void onHandleAssist(@Nullable android.os.Bundle, @Nullable android.app.assist.AssistStructure, @Nullable android.app.assist.AssistContent);
+ method public void onHandleAssistSecondary(@Nullable android.os.Bundle, @Nullable android.app.assist.AssistStructure, @Nullable android.app.assist.AssistContent, int, int);
+ method public void onHandleScreenshot(@Nullable android.graphics.Bitmap);
method public void onHide();
method public boolean onKeyDown(int, android.view.KeyEvent);
method public boolean onKeyLongPress(int, android.view.KeyEvent);
@@ -41480,6 +41730,7 @@ package android.service.voice {
field public static final int SHOW_SOURCE_ACTIVITY = 16; // 0x10
field public static final int SHOW_SOURCE_APPLICATION = 8; // 0x8
field public static final int SHOW_SOURCE_ASSIST_GESTURE = 4; // 0x4
+ field public static final int SHOW_SOURCE_AUTOMOTIVE_SYSTEM_UI = 128; // 0x80
field public static final int SHOW_SOURCE_NOTIFICATION = 64; // 0x40
field public static final int SHOW_SOURCE_PUSH_TO_TALK = 32; // 0x20
field public static final int SHOW_WITH_ASSIST = 1; // 0x1
@@ -41487,26 +41738,26 @@ package android.service.voice {
}
public static final class VoiceInteractionSession.AbortVoiceRequest extends android.service.voice.VoiceInteractionSession.Request {
- method public deprecated java.lang.CharSequence getMessage();
- method public android.app.VoiceInteractor.Prompt getVoicePrompt();
+ method @Deprecated @Nullable public CharSequence getMessage();
+ method @Nullable public android.app.VoiceInteractor.Prompt getVoicePrompt();
method public void sendAbortResult(android.os.Bundle);
}
public static final class VoiceInteractionSession.CommandRequest extends android.service.voice.VoiceInteractionSession.Request {
- method public java.lang.String getCommand();
+ method public String getCommand();
method public void sendIntermediateResult(android.os.Bundle);
method public void sendResult(android.os.Bundle);
}
public static final class VoiceInteractionSession.CompleteVoiceRequest extends android.service.voice.VoiceInteractionSession.Request {
- method public deprecated java.lang.CharSequence getMessage();
- method public android.app.VoiceInteractor.Prompt getVoicePrompt();
+ method @Deprecated @Nullable public CharSequence getMessage();
+ method @Nullable public android.app.VoiceInteractor.Prompt getVoicePrompt();
method public void sendCompleteResult(android.os.Bundle);
}
public static final class VoiceInteractionSession.ConfirmationRequest extends android.service.voice.VoiceInteractionSession.Request {
- method public deprecated java.lang.CharSequence getPrompt();
- method public android.app.VoiceInteractor.Prompt getVoicePrompt();
+ method @Deprecated @Nullable public CharSequence getPrompt();
+ method @Nullable public android.app.VoiceInteractor.Prompt getVoicePrompt();
method public void sendConfirmationResult(boolean, android.os.Bundle);
}
@@ -41522,15 +41773,15 @@ package android.service.voice {
public static final class VoiceInteractionSession.PickOptionRequest extends android.service.voice.VoiceInteractionSession.Request {
method public android.app.VoiceInteractor.PickOptionRequest.Option[] getOptions();
- method public deprecated java.lang.CharSequence getPrompt();
- method public android.app.VoiceInteractor.Prompt getVoicePrompt();
+ method @Deprecated @Nullable public CharSequence getPrompt();
+ method @Nullable public android.app.VoiceInteractor.Prompt getVoicePrompt();
method public void sendIntermediatePickOptionResult(android.app.VoiceInteractor.PickOptionRequest.Option[], android.os.Bundle);
method public void sendPickOptionResult(android.app.VoiceInteractor.PickOptionRequest.Option[], android.os.Bundle);
}
public static class VoiceInteractionSession.Request {
method public void cancel();
- method public java.lang.String getCallingPackage();
+ method public String getCallingPackage();
method public int getCallingUid();
method public android.os.Bundle getExtras();
method public boolean isActive();
@@ -41548,10 +41799,10 @@ package android.service.vr {
public abstract class VrListenerService extends android.app.Service {
ctor public VrListenerService();
- method public static final boolean isVrModePackageEnabled(android.content.Context, android.content.ComponentName);
+ method public static final boolean isVrModePackageEnabled(@NonNull android.content.Context, @NonNull android.content.ComponentName);
method public android.os.IBinder onBind(android.content.Intent);
method public void onCurrentVrActivityChanged(android.content.ComponentName);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.vr.VrListenerService";
+ field public static final String SERVICE_INTERFACE = "android.service.vr.VrListenerService";
}
}
@@ -41562,13 +41813,13 @@ package android.service.wallpaper {
ctor public WallpaperService();
method public final android.os.IBinder onBind(android.content.Intent);
method public abstract android.service.wallpaper.WallpaperService.Engine onCreateEngine();
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.wallpaper.WallpaperService";
- field public static final java.lang.String SERVICE_META_DATA = "android.service.wallpaper";
+ field public static final String SERVICE_INTERFACE = "android.service.wallpaper.WallpaperService";
+ field public static final String SERVICE_META_DATA = "android.service.wallpaper";
}
public class WallpaperService.Engine {
ctor public WallpaperService.Engine();
- method protected void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method protected void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.content.Context getDisplayContext();
@@ -41577,8 +41828,8 @@ package android.service.wallpaper {
method public boolean isVisible();
method public void notifyColorsChanged();
method public void onApplyWindowInsets(android.view.WindowInsets);
- method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeColors();
+ method public android.os.Bundle onCommand(String, int, int, int, android.os.Bundle, boolean);
+ method @Nullable public android.app.WallpaperColors onComputeColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -41597,16 +41848,16 @@ package android.service.wallpaper {
package android.speech {
- public abstract interface RecognitionListener {
- method public abstract void onBeginningOfSpeech();
- method public abstract void onBufferReceived(byte[]);
- method public abstract void onEndOfSpeech();
- method public abstract void onError(int);
- method public abstract void onEvent(int, android.os.Bundle);
- method public abstract void onPartialResults(android.os.Bundle);
- method public abstract void onReadyForSpeech(android.os.Bundle);
- method public abstract void onResults(android.os.Bundle);
- method public abstract void onRmsChanged(float);
+ public interface RecognitionListener {
+ method public void onBeginningOfSpeech();
+ method public void onBufferReceived(byte[]);
+ method public void onEndOfSpeech();
+ method public void onError(int);
+ method public void onEvent(int, android.os.Bundle);
+ method public void onPartialResults(android.os.Bundle);
+ method public void onReadyForSpeech(android.os.Bundle);
+ method public void onResults(android.os.Bundle);
+ method public void onRmsChanged(float);
}
public abstract class RecognitionService extends android.app.Service {
@@ -41615,8 +41866,8 @@ package android.speech {
method protected abstract void onCancel(android.speech.RecognitionService.Callback);
method protected abstract void onStartListening(android.content.Intent, android.speech.RecognitionService.Callback);
method protected abstract void onStopListening(android.speech.RecognitionService.Callback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.speech.RecognitionService";
- field public static final java.lang.String SERVICE_META_DATA = "android.speech";
+ field public static final String SERVICE_INTERFACE = "android.speech.RecognitionService";
+ field public static final String SERVICE_META_DATA = "android.speech";
}
public class RecognitionService.Callback {
@@ -41633,33 +41884,33 @@ package android.speech {
public class RecognizerIntent {
method public static final android.content.Intent getVoiceDetailsIntent(android.content.Context);
- field public static final java.lang.String ACTION_GET_LANGUAGE_DETAILS = "android.speech.action.GET_LANGUAGE_DETAILS";
- field public static final java.lang.String ACTION_RECOGNIZE_SPEECH = "android.speech.action.RECOGNIZE_SPEECH";
- field public static final java.lang.String ACTION_VOICE_SEARCH_HANDS_FREE = "android.speech.action.VOICE_SEARCH_HANDS_FREE";
- field public static final java.lang.String ACTION_WEB_SEARCH = "android.speech.action.WEB_SEARCH";
- field public static final java.lang.String DETAILS_META_DATA = "android.speech.DETAILS";
- field public static final java.lang.String EXTRA_CALLING_PACKAGE = "calling_package";
- field public static final java.lang.String EXTRA_CONFIDENCE_SCORES = "android.speech.extra.CONFIDENCE_SCORES";
- field public static final java.lang.String EXTRA_LANGUAGE = "android.speech.extra.LANGUAGE";
- field public static final java.lang.String EXTRA_LANGUAGE_MODEL = "android.speech.extra.LANGUAGE_MODEL";
- field public static final java.lang.String EXTRA_LANGUAGE_PREFERENCE = "android.speech.extra.LANGUAGE_PREFERENCE";
- field public static final java.lang.String EXTRA_MAX_RESULTS = "android.speech.extra.MAX_RESULTS";
- field public static final java.lang.String EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE = "android.speech.extra.ONLY_RETURN_LANGUAGE_PREFERENCE";
- field public static final java.lang.String EXTRA_ORIGIN = "android.speech.extra.ORIGIN";
- field public static final java.lang.String EXTRA_PARTIAL_RESULTS = "android.speech.extra.PARTIAL_RESULTS";
- field public static final java.lang.String EXTRA_PREFER_OFFLINE = "android.speech.extra.PREFER_OFFLINE";
- field public static final java.lang.String EXTRA_PROMPT = "android.speech.extra.PROMPT";
- field public static final java.lang.String EXTRA_RESULTS = "android.speech.extra.RESULTS";
- field public static final java.lang.String EXTRA_RESULTS_PENDINGINTENT = "android.speech.extra.RESULTS_PENDINGINTENT";
- field public static final java.lang.String EXTRA_RESULTS_PENDINGINTENT_BUNDLE = "android.speech.extra.RESULTS_PENDINGINTENT_BUNDLE";
- field public static final java.lang.String EXTRA_SECURE = "android.speech.extras.EXTRA_SECURE";
- field public static final java.lang.String EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS";
- field public static final java.lang.String EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_MINIMUM_LENGTH_MILLIS";
- field public static final java.lang.String EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS";
- field public static final java.lang.String EXTRA_SUPPORTED_LANGUAGES = "android.speech.extra.SUPPORTED_LANGUAGES";
- field public static final java.lang.String EXTRA_WEB_SEARCH_ONLY = "android.speech.extra.WEB_SEARCH_ONLY";
- field public static final java.lang.String LANGUAGE_MODEL_FREE_FORM = "free_form";
- field public static final java.lang.String LANGUAGE_MODEL_WEB_SEARCH = "web_search";
+ field public static final String ACTION_GET_LANGUAGE_DETAILS = "android.speech.action.GET_LANGUAGE_DETAILS";
+ field public static final String ACTION_RECOGNIZE_SPEECH = "android.speech.action.RECOGNIZE_SPEECH";
+ field public static final String ACTION_VOICE_SEARCH_HANDS_FREE = "android.speech.action.VOICE_SEARCH_HANDS_FREE";
+ field public static final String ACTION_WEB_SEARCH = "android.speech.action.WEB_SEARCH";
+ field public static final String DETAILS_META_DATA = "android.speech.DETAILS";
+ field public static final String EXTRA_CALLING_PACKAGE = "calling_package";
+ field public static final String EXTRA_CONFIDENCE_SCORES = "android.speech.extra.CONFIDENCE_SCORES";
+ field public static final String EXTRA_LANGUAGE = "android.speech.extra.LANGUAGE";
+ field public static final String EXTRA_LANGUAGE_MODEL = "android.speech.extra.LANGUAGE_MODEL";
+ field public static final String EXTRA_LANGUAGE_PREFERENCE = "android.speech.extra.LANGUAGE_PREFERENCE";
+ field public static final String EXTRA_MAX_RESULTS = "android.speech.extra.MAX_RESULTS";
+ field public static final String EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE = "android.speech.extra.ONLY_RETURN_LANGUAGE_PREFERENCE";
+ field public static final String EXTRA_ORIGIN = "android.speech.extra.ORIGIN";
+ field public static final String EXTRA_PARTIAL_RESULTS = "android.speech.extra.PARTIAL_RESULTS";
+ field public static final String EXTRA_PREFER_OFFLINE = "android.speech.extra.PREFER_OFFLINE";
+ field public static final String EXTRA_PROMPT = "android.speech.extra.PROMPT";
+ field public static final String EXTRA_RESULTS = "android.speech.extra.RESULTS";
+ field public static final String EXTRA_RESULTS_PENDINGINTENT = "android.speech.extra.RESULTS_PENDINGINTENT";
+ field public static final String EXTRA_RESULTS_PENDINGINTENT_BUNDLE = "android.speech.extra.RESULTS_PENDINGINTENT_BUNDLE";
+ field public static final String EXTRA_SECURE = "android.speech.extras.EXTRA_SECURE";
+ field public static final String EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS";
+ field public static final String EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_MINIMUM_LENGTH_MILLIS";
+ field public static final String EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS = "android.speech.extras.SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS";
+ field public static final String EXTRA_SUPPORTED_LANGUAGES = "android.speech.extra.SUPPORTED_LANGUAGES";
+ field public static final String EXTRA_WEB_SEARCH_ONLY = "android.speech.extra.WEB_SEARCH_ONLY";
+ field public static final String LANGUAGE_MODEL_FREE_FORM = "free_form";
+ field public static final String LANGUAGE_MODEL_WEB_SEARCH = "web_search";
field public static final int RESULT_AUDIO_ERROR = 5; // 0x5
field public static final int RESULT_CLIENT_ERROR = 2; // 0x2
field public static final int RESULT_NETWORK_ERROR = 4; // 0x4
@@ -41668,13 +41919,13 @@ package android.speech {
}
public class RecognizerResultsIntent {
- field public static final java.lang.String ACTION_VOICE_SEARCH_RESULTS = "android.speech.action.VOICE_SEARCH_RESULTS";
- field public static final java.lang.String EXTRA_VOICE_SEARCH_RESULT_HTML = "android.speech.extras.VOICE_SEARCH_RESULT_HTML";
- field public static final java.lang.String EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS = "android.speech.extras.VOICE_SEARCH_RESULT_HTML_BASE_URLS";
- field public static final java.lang.String EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS = "android.speech.extras.EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS";
- field public static final java.lang.String EXTRA_VOICE_SEARCH_RESULT_STRINGS = "android.speech.extras.VOICE_SEARCH_RESULT_STRINGS";
- field public static final java.lang.String EXTRA_VOICE_SEARCH_RESULT_URLS = "android.speech.extras.VOICE_SEARCH_RESULT_URLS";
- field public static final java.lang.String URI_SCHEME_INLINE = "inline";
+ field public static final String ACTION_VOICE_SEARCH_RESULTS = "android.speech.action.VOICE_SEARCH_RESULTS";
+ field public static final String EXTRA_VOICE_SEARCH_RESULT_HTML = "android.speech.extras.VOICE_SEARCH_RESULT_HTML";
+ field public static final String EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS = "android.speech.extras.VOICE_SEARCH_RESULT_HTML_BASE_URLS";
+ field public static final String EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS = "android.speech.extras.EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS";
+ field public static final String EXTRA_VOICE_SEARCH_RESULT_STRINGS = "android.speech.extras.VOICE_SEARCH_RESULT_STRINGS";
+ field public static final String EXTRA_VOICE_SEARCH_RESULT_URLS = "android.speech.extras.VOICE_SEARCH_RESULT_URLS";
+ field public static final String URI_SCHEME_INLINE = "inline";
}
public class SpeechRecognizer {
@@ -41686,7 +41937,7 @@ package android.speech {
method public void setRecognitionListener(android.speech.RecognitionListener);
method public void startListening(android.content.Intent);
method public void stopListening();
- field public static final java.lang.String CONFIDENCE_SCORES = "confidence_scores";
+ field public static final String CONFIDENCE_SCORES = "confidence_scores";
field public static final int ERROR_AUDIO = 3; // 0x3
field public static final int ERROR_CLIENT = 5; // 0x5
field public static final int ERROR_INSUFFICIENT_PERMISSIONS = 9; // 0x9
@@ -41696,82 +41947,82 @@ package android.speech {
field public static final int ERROR_RECOGNIZER_BUSY = 8; // 0x8
field public static final int ERROR_SERVER = 4; // 0x4
field public static final int ERROR_SPEECH_TIMEOUT = 6; // 0x6
- field public static final java.lang.String RESULTS_RECOGNITION = "results_recognition";
+ field public static final String RESULTS_RECOGNITION = "results_recognition";
}
}
package android.speech.tts {
- public abstract interface SynthesisCallback {
- method public abstract int audioAvailable(byte[], int, int);
- method public abstract int done();
- method public abstract void error();
- method public abstract void error(int);
- method public abstract int getMaxBufferSize();
- method public abstract boolean hasFinished();
- method public abstract boolean hasStarted();
+ public interface SynthesisCallback {
+ method public int audioAvailable(byte[], int, int);
+ method public int done();
+ method public void error();
+ method public void error(int);
+ method public int getMaxBufferSize();
+ method public boolean hasFinished();
+ method public boolean hasStarted();
method public default void rangeStart(int, int, int);
- method public abstract int start(int, int, int);
+ method public int start(int, int, @IntRange(from=1, to=2) int);
}
public final class SynthesisRequest {
- ctor public SynthesisRequest(java.lang.String, android.os.Bundle);
- ctor public SynthesisRequest(java.lang.CharSequence, android.os.Bundle);
+ ctor public SynthesisRequest(String, android.os.Bundle);
+ ctor public SynthesisRequest(CharSequence, android.os.Bundle);
method public int getCallerUid();
- method public java.lang.CharSequence getCharSequenceText();
- method public java.lang.String getCountry();
- method public java.lang.String getLanguage();
+ method public CharSequence getCharSequenceText();
+ method public String getCountry();
+ method public String getLanguage();
method public android.os.Bundle getParams();
method public int getPitch();
method public int getSpeechRate();
- method public deprecated java.lang.String getText();
- method public java.lang.String getVariant();
- method public java.lang.String getVoiceName();
+ method @Deprecated public String getText();
+ method public String getVariant();
+ method public String getVoiceName();
}
public class TextToSpeech {
ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener);
- ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener, java.lang.String);
- method public int addEarcon(java.lang.String, java.lang.String, int);
- method public deprecated int addEarcon(java.lang.String, java.lang.String);
- method public int addEarcon(java.lang.String, java.io.File);
- method public int addSpeech(java.lang.String, java.lang.String, int);
- method public int addSpeech(java.lang.CharSequence, java.lang.String, int);
- method public int addSpeech(java.lang.String, java.lang.String);
- method public int addSpeech(java.lang.CharSequence, java.io.File);
- method public deprecated boolean areDefaultsEnforced();
+ ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener, String);
+ method public int addEarcon(String, String, @RawRes int);
+ method @Deprecated public int addEarcon(String, String);
+ method public int addEarcon(String, java.io.File);
+ method public int addSpeech(String, String, @RawRes int);
+ method public int addSpeech(CharSequence, String, @RawRes int);
+ method public int addSpeech(String, String);
+ method public int addSpeech(CharSequence, java.io.File);
+ method @Deprecated public boolean areDefaultsEnforced();
method public java.util.Set<java.util.Locale> getAvailableLanguages();
- method public java.lang.String getDefaultEngine();
- method public deprecated java.util.Locale getDefaultLanguage();
+ method public String getDefaultEngine();
+ method @Deprecated public java.util.Locale getDefaultLanguage();
method public android.speech.tts.Voice getDefaultVoice();
method public java.util.List<android.speech.tts.TextToSpeech.EngineInfo> getEngines();
- method public deprecated java.util.Set<java.lang.String> getFeatures(java.util.Locale);
- method public deprecated java.util.Locale getLanguage();
+ method @Deprecated public java.util.Set<java.lang.String> getFeatures(java.util.Locale);
+ method @Deprecated public java.util.Locale getLanguage();
method public static int getMaxSpeechInputLength();
method public android.speech.tts.Voice getVoice();
method public java.util.Set<android.speech.tts.Voice> getVoices();
method public int isLanguageAvailable(java.util.Locale);
method public boolean isSpeaking();
- method public int playEarcon(java.lang.String, int, android.os.Bundle, java.lang.String);
- method public deprecated int playEarcon(java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>);
- method public deprecated int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>);
- method public int playSilentUtterance(long, int, java.lang.String);
+ method public int playEarcon(String, int, android.os.Bundle, String);
+ method @Deprecated public int playEarcon(String, int, java.util.HashMap<java.lang.String,java.lang.String>);
+ method @Deprecated public int playSilence(long, int, java.util.HashMap<java.lang.String,java.lang.String>);
+ method public int playSilentUtterance(long, int, String);
method public int setAudioAttributes(android.media.AudioAttributes);
- method public deprecated int setEngineByPackageName(java.lang.String);
+ method @Deprecated public int setEngineByPackageName(String);
method public int setLanguage(java.util.Locale);
- method public deprecated int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener);
+ method @Deprecated public int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener);
method public int setOnUtteranceProgressListener(android.speech.tts.UtteranceProgressListener);
method public int setPitch(float);
method public int setSpeechRate(float);
method public int setVoice(android.speech.tts.Voice);
method public void shutdown();
- method public int speak(java.lang.CharSequence, int, android.os.Bundle, java.lang.String);
- method public deprecated int speak(java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>);
+ method public int speak(CharSequence, int, android.os.Bundle, String);
+ method @Deprecated public int speak(String, int, java.util.HashMap<java.lang.String,java.lang.String>);
method public int stop();
- method public int synthesizeToFile(java.lang.CharSequence, android.os.Bundle, java.io.File, java.lang.String);
- method public deprecated int synthesizeToFile(java.lang.String, java.util.HashMap<java.lang.String, java.lang.String>, java.lang.String);
- field public static final java.lang.String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED";
+ method public int synthesizeToFile(CharSequence, android.os.Bundle, java.io.File, String);
+ method @Deprecated public int synthesizeToFile(String, java.util.HashMap<java.lang.String,java.lang.String>, String);
+ field public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED";
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_INVALID_REQUEST = -8; // 0xfffffff8
field public static final int ERROR_NETWORK = -6; // 0xfffffffa
@@ -41793,87 +42044,87 @@ package android.speech.tts {
public class TextToSpeech.Engine {
ctor public TextToSpeech.Engine();
- field public static final java.lang.String ACTION_CHECK_TTS_DATA = "android.speech.tts.engine.CHECK_TTS_DATA";
- field public static final java.lang.String ACTION_GET_SAMPLE_TEXT = "android.speech.tts.engine.GET_SAMPLE_TEXT";
- field public static final java.lang.String ACTION_INSTALL_TTS_DATA = "android.speech.tts.engine.INSTALL_TTS_DATA";
- field public static final java.lang.String ACTION_TTS_DATA_INSTALLED = "android.speech.tts.engine.TTS_DATA_INSTALLED";
- field public static final deprecated int CHECK_VOICE_DATA_BAD_DATA = -1; // 0xffffffff
+ field public static final String ACTION_CHECK_TTS_DATA = "android.speech.tts.engine.CHECK_TTS_DATA";
+ field public static final String ACTION_GET_SAMPLE_TEXT = "android.speech.tts.engine.GET_SAMPLE_TEXT";
+ field public static final String ACTION_INSTALL_TTS_DATA = "android.speech.tts.engine.INSTALL_TTS_DATA";
+ field public static final String ACTION_TTS_DATA_INSTALLED = "android.speech.tts.engine.TTS_DATA_INSTALLED";
+ field @Deprecated public static final int CHECK_VOICE_DATA_BAD_DATA = -1; // 0xffffffff
field public static final int CHECK_VOICE_DATA_FAIL = 0; // 0x0
- field public static final deprecated int CHECK_VOICE_DATA_MISSING_DATA = -2; // 0xfffffffe
- field public static final deprecated int CHECK_VOICE_DATA_MISSING_VOLUME = -3; // 0xfffffffd
+ field @Deprecated public static final int CHECK_VOICE_DATA_MISSING_DATA = -2; // 0xfffffffe
+ field @Deprecated public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3; // 0xfffffffd
field public static final int CHECK_VOICE_DATA_PASS = 1; // 0x1
field public static final int DEFAULT_STREAM = 3; // 0x3
- field public static final java.lang.String EXTRA_AVAILABLE_VOICES = "availableVoices";
- field public static final deprecated java.lang.String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
- field public static final java.lang.String EXTRA_SAMPLE_TEXT = "sampleText";
- field public static final deprecated java.lang.String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
- field public static final java.lang.String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices";
- field public static final deprecated java.lang.String EXTRA_VOICE_DATA_FILES = "dataFiles";
- field public static final deprecated java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
- field public static final deprecated java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
- field public static final java.lang.String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE";
- field public static final deprecated java.lang.String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
- field public static final java.lang.String KEY_FEATURE_NETWORK_RETRIES_COUNT = "networkRetriesCount";
- field public static final deprecated java.lang.String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts";
- field public static final java.lang.String KEY_FEATURE_NETWORK_TIMEOUT_MS = "networkTimeoutMs";
- field public static final java.lang.String KEY_FEATURE_NOT_INSTALLED = "notInstalled";
- field public static final java.lang.String KEY_PARAM_PAN = "pan";
- field public static final java.lang.String KEY_PARAM_SESSION_ID = "sessionId";
- field public static final java.lang.String KEY_PARAM_STREAM = "streamType";
- field public static final java.lang.String KEY_PARAM_UTTERANCE_ID = "utteranceId";
- field public static final java.lang.String KEY_PARAM_VOLUME = "volume";
- field public static final java.lang.String SERVICE_META_DATA = "android.speech.tts";
+ field public static final String EXTRA_AVAILABLE_VOICES = "availableVoices";
+ field @Deprecated public static final String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
+ field public static final String EXTRA_SAMPLE_TEXT = "sampleText";
+ field @Deprecated public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
+ field public static final String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices";
+ field @Deprecated public static final String EXTRA_VOICE_DATA_FILES = "dataFiles";
+ field @Deprecated public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
+ field @Deprecated public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
+ field public static final String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE";
+ field @Deprecated public static final String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
+ field public static final String KEY_FEATURE_NETWORK_RETRIES_COUNT = "networkRetriesCount";
+ field @Deprecated public static final String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts";
+ field public static final String KEY_FEATURE_NETWORK_TIMEOUT_MS = "networkTimeoutMs";
+ field public static final String KEY_FEATURE_NOT_INSTALLED = "notInstalled";
+ field public static final String KEY_PARAM_PAN = "pan";
+ field public static final String KEY_PARAM_SESSION_ID = "sessionId";
+ field public static final String KEY_PARAM_STREAM = "streamType";
+ field public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId";
+ field public static final String KEY_PARAM_VOLUME = "volume";
+ field public static final String SERVICE_META_DATA = "android.speech.tts";
}
public static class TextToSpeech.EngineInfo {
ctor public TextToSpeech.EngineInfo();
field public int icon;
- field public java.lang.String label;
- field public java.lang.String name;
+ field public String label;
+ field public String name;
}
- public static abstract interface TextToSpeech.OnInitListener {
- method public abstract void onInit(int);
+ public static interface TextToSpeech.OnInitListener {
+ method public void onInit(int);
}
- public static abstract deprecated interface TextToSpeech.OnUtteranceCompletedListener {
- method public abstract void onUtteranceCompleted(java.lang.String);
+ @Deprecated public static interface TextToSpeech.OnUtteranceCompletedListener {
+ method @Deprecated public void onUtteranceCompleted(String);
}
public abstract class TextToSpeechService extends android.app.Service {
ctor public TextToSpeechService();
method public android.os.IBinder onBind(android.content.Intent);
- method public java.lang.String onGetDefaultVoiceNameFor(java.lang.String, java.lang.String, java.lang.String);
- method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String);
- method protected abstract java.lang.String[] onGetLanguage();
+ method public String onGetDefaultVoiceNameFor(String, String, String);
+ method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(String, String, String);
+ method protected abstract String[] onGetLanguage();
method public java.util.List<android.speech.tts.Voice> onGetVoices();
- method protected abstract int onIsLanguageAvailable(java.lang.String, java.lang.String, java.lang.String);
- method public int onIsValidVoiceName(java.lang.String);
- method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String);
- method public int onLoadVoice(java.lang.String);
+ method protected abstract int onIsLanguageAvailable(String, String, String);
+ method public int onIsValidVoiceName(String);
+ method protected abstract int onLoadLanguage(String, String, String);
+ method public int onLoadVoice(String);
method protected abstract void onStop();
method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback);
}
public abstract class UtteranceProgressListener {
ctor public UtteranceProgressListener();
- method public void onAudioAvailable(java.lang.String, byte[]);
- method public void onBeginSynthesis(java.lang.String, int, int, int);
- method public abstract void onDone(java.lang.String);
- method public abstract deprecated void onError(java.lang.String);
- method public void onError(java.lang.String, int);
- method public void onRangeStart(java.lang.String, int, int, int);
- method public abstract void onStart(java.lang.String);
- method public void onStop(java.lang.String, boolean);
+ method public void onAudioAvailable(String, byte[]);
+ method public void onBeginSynthesis(String, int, int, int);
+ method public abstract void onDone(String);
+ method @Deprecated public abstract void onError(String);
+ method public void onError(String, int);
+ method public void onRangeStart(String, int, int, int);
+ method public abstract void onStart(String);
+ method public void onStop(String, boolean);
}
public class Voice implements android.os.Parcelable {
- ctor public Voice(java.lang.String, java.util.Locale, int, int, boolean, java.util.Set<java.lang.String>);
+ ctor public Voice(String, java.util.Locale, int, int, boolean, java.util.Set<java.lang.String>);
method public int describeContents();
method public java.util.Set<java.lang.String> getFeatures();
method public int getLatency();
method public java.util.Locale getLocale();
- method public java.lang.String getName();
+ method public String getName();
method public int getQuality();
method public boolean isNetworkConnectionRequired();
method public void writeToParcel(android.os.Parcel, int);
@@ -41895,8 +42146,8 @@ package android.speech.tts {
package android.system {
public final class ErrnoException extends java.lang.Exception {
- ctor public ErrnoException(java.lang.String, int);
- ctor public ErrnoException(java.lang.String, int, java.lang.Throwable);
+ ctor public ErrnoException(String, int);
+ ctor public ErrnoException(String, int, Throwable);
field public final int errno;
}
@@ -41907,17 +42158,17 @@ package android.system {
public final class Os {
method public static java.io.FileDescriptor accept(java.io.FileDescriptor, java.net.InetSocketAddress) throws android.system.ErrnoException, java.net.SocketException;
- method public static boolean access(java.lang.String, int) throws android.system.ErrnoException;
+ method public static boolean access(String, int) throws android.system.ErrnoException;
method public static void bind(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException;
- method public static void chmod(java.lang.String, int) throws android.system.ErrnoException;
- method public static void chown(java.lang.String, int, int) throws android.system.ErrnoException;
+ method public static void chmod(String, int) throws android.system.ErrnoException;
+ method public static void chown(String, int, int) throws android.system.ErrnoException;
method public static void close(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static void connect(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException;
method public static java.io.FileDescriptor dup(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static java.io.FileDescriptor dup2(java.io.FileDescriptor, int) throws android.system.ErrnoException;
- method public static java.lang.String[] environ();
- method public static void execv(java.lang.String, java.lang.String[]) throws android.system.ErrnoException;
- method public static void execve(java.lang.String, java.lang.String[], java.lang.String[]) throws android.system.ErrnoException;
+ method public static String[] environ();
+ method public static void execv(String, String[]) throws android.system.ErrnoException;
+ method public static void execve(String, String[], String[]) throws android.system.ErrnoException;
method public static void fchmod(java.io.FileDescriptor, int) throws android.system.ErrnoException;
method public static void fchown(java.io.FileDescriptor, int, int) throws android.system.ErrnoException;
method public static void fdatasync(java.io.FileDescriptor) throws android.system.ErrnoException;
@@ -41925,9 +42176,9 @@ package android.system {
method public static android.system.StructStatVfs fstatvfs(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static void fsync(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static void ftruncate(java.io.FileDescriptor, long) throws android.system.ErrnoException;
- method public static java.lang.String gai_strerror(int);
+ method public static String gai_strerror(int);
method public static int getegid();
- method public static java.lang.String getenv(java.lang.String);
+ method public static String getenv(String);
method public static int geteuid();
method public static int getgid();
method public static java.net.SocketAddress getpeername(java.io.FileDescriptor) throws android.system.ErrnoException;
@@ -41936,27 +42187,27 @@ package android.system {
method public static java.net.SocketAddress getsockname(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static int gettid();
method public static int getuid();
- method public static byte[] getxattr(java.lang.String, java.lang.String) throws android.system.ErrnoException;
- method public static java.lang.String if_indextoname(int);
- method public static int if_nametoindex(java.lang.String);
- method public static java.net.InetAddress inet_pton(int, java.lang.String);
+ method public static byte[] getxattr(String, String) throws android.system.ErrnoException;
+ method public static String if_indextoname(int);
+ method public static int if_nametoindex(String);
+ method public static java.net.InetAddress inet_pton(int, String);
method public static boolean isatty(java.io.FileDescriptor);
method public static void kill(int, int) throws android.system.ErrnoException;
- method public static void lchown(java.lang.String, int, int) throws android.system.ErrnoException;
- method public static void link(java.lang.String, java.lang.String) throws android.system.ErrnoException;
+ method public static void lchown(String, int, int) throws android.system.ErrnoException;
+ method public static void link(String, String) throws android.system.ErrnoException;
method public static void listen(java.io.FileDescriptor, int) throws android.system.ErrnoException;
- method public static java.lang.String[] listxattr(java.lang.String) throws android.system.ErrnoException;
+ method public static String[] listxattr(String) throws android.system.ErrnoException;
method public static long lseek(java.io.FileDescriptor, long, int) throws android.system.ErrnoException;
- method public static android.system.StructStat lstat(java.lang.String) throws android.system.ErrnoException;
+ method public static android.system.StructStat lstat(String) throws android.system.ErrnoException;
method public static void mincore(long, long, byte[]) throws android.system.ErrnoException;
- method public static void mkdir(java.lang.String, int) throws android.system.ErrnoException;
- method public static void mkfifo(java.lang.String, int) throws android.system.ErrnoException;
+ method public static void mkdir(String, int) throws android.system.ErrnoException;
+ method public static void mkfifo(String, int) throws android.system.ErrnoException;
method public static void mlock(long, long) throws android.system.ErrnoException;
method public static long mmap(long, long, int, int, java.io.FileDescriptor, long) throws android.system.ErrnoException;
method public static void msync(long, long, int) throws android.system.ErrnoException;
method public static void munlock(long, long) throws android.system.ErrnoException;
method public static void munmap(long, long) throws android.system.ErrnoException;
- method public static java.io.FileDescriptor open(java.lang.String, int, int) throws android.system.ErrnoException;
+ method public static java.io.FileDescriptor open(String, int, int) throws android.system.ErrnoException;
method public static java.io.FileDescriptor[] pipe() throws android.system.ErrnoException;
method public static int poll(android.system.StructPollfd[], int) throws android.system.ErrnoException;
method public static void posix_fallocate(java.io.FileDescriptor, long, long) throws android.system.ErrnoException;
@@ -41967,41 +42218,41 @@ package android.system {
method public static int pwrite(java.io.FileDescriptor, byte[], int, int, long) throws android.system.ErrnoException, java.io.InterruptedIOException;
method public static int read(java.io.FileDescriptor, java.nio.ByteBuffer) throws android.system.ErrnoException, java.io.InterruptedIOException;
method public static int read(java.io.FileDescriptor, byte[], int, int) throws android.system.ErrnoException, java.io.InterruptedIOException;
- method public static java.lang.String readlink(java.lang.String) throws android.system.ErrnoException;
- method public static int readv(java.io.FileDescriptor, java.lang.Object[], int[], int[]) throws android.system.ErrnoException, java.io.InterruptedIOException;
+ method public static String readlink(String) throws android.system.ErrnoException;
+ method public static int readv(java.io.FileDescriptor, Object[], int[], int[]) throws android.system.ErrnoException, java.io.InterruptedIOException;
method public static int recvfrom(java.io.FileDescriptor, java.nio.ByteBuffer, int, java.net.InetSocketAddress) throws android.system.ErrnoException, java.net.SocketException;
method public static int recvfrom(java.io.FileDescriptor, byte[], int, int, int, java.net.InetSocketAddress) throws android.system.ErrnoException, java.net.SocketException;
- method public static void remove(java.lang.String) throws android.system.ErrnoException;
- method public static void removexattr(java.lang.String, java.lang.String) throws android.system.ErrnoException;
- method public static void rename(java.lang.String, java.lang.String) throws android.system.ErrnoException;
+ method public static void remove(String) throws android.system.ErrnoException;
+ method public static void removexattr(String, String) throws android.system.ErrnoException;
+ method public static void rename(String, String) throws android.system.ErrnoException;
method public static long sendfile(java.io.FileDescriptor, java.io.FileDescriptor, android.system.Int64Ref, long) throws android.system.ErrnoException;
method public static int sendto(java.io.FileDescriptor, java.nio.ByteBuffer, int, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException;
method public static int sendto(java.io.FileDescriptor, byte[], int, int, int, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException;
- method public static deprecated void setegid(int) throws android.system.ErrnoException;
- method public static void setenv(java.lang.String, java.lang.String, boolean) throws android.system.ErrnoException;
- method public static deprecated void seteuid(int) throws android.system.ErrnoException;
- method public static deprecated void setgid(int) throws android.system.ErrnoException;
+ method @Deprecated public static void setegid(int) throws android.system.ErrnoException;
+ method public static void setenv(String, String, boolean) throws android.system.ErrnoException;
+ method @Deprecated public static void seteuid(int) throws android.system.ErrnoException;
+ method @Deprecated public static void setgid(int) throws android.system.ErrnoException;
method public static int setsid() throws android.system.ErrnoException;
method public static void setsockoptInt(java.io.FileDescriptor, int, int, int) throws android.system.ErrnoException;
- method public static deprecated void setuid(int) throws android.system.ErrnoException;
- method public static void setxattr(java.lang.String, java.lang.String, byte[], int) throws android.system.ErrnoException;
+ method @Deprecated public static void setuid(int) throws android.system.ErrnoException;
+ method public static void setxattr(String, String, byte[], int) throws android.system.ErrnoException;
method public static void shutdown(java.io.FileDescriptor, int) throws android.system.ErrnoException;
method public static java.io.FileDescriptor socket(int, int, int) throws android.system.ErrnoException;
method public static void socketpair(int, int, int, java.io.FileDescriptor, java.io.FileDescriptor) throws android.system.ErrnoException;
- method public static android.system.StructStat stat(java.lang.String) throws android.system.ErrnoException;
- method public static android.system.StructStatVfs statvfs(java.lang.String) throws android.system.ErrnoException;
- method public static java.lang.String strerror(int);
- method public static java.lang.String strsignal(int);
- method public static void symlink(java.lang.String, java.lang.String) throws android.system.ErrnoException;
+ method public static android.system.StructStat stat(String) throws android.system.ErrnoException;
+ method public static android.system.StructStatVfs statvfs(String) throws android.system.ErrnoException;
+ method public static String strerror(int);
+ method public static String strsignal(int);
+ method public static void symlink(String, String) throws android.system.ErrnoException;
method public static long sysconf(int);
method public static void tcdrain(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static void tcsendbreak(java.io.FileDescriptor, int) throws android.system.ErrnoException;
method public static int umask(int);
method public static android.system.StructUtsname uname();
- method public static void unsetenv(java.lang.String) throws android.system.ErrnoException;
+ method public static void unsetenv(String) throws android.system.ErrnoException;
method public static int write(java.io.FileDescriptor, java.nio.ByteBuffer) throws android.system.ErrnoException, java.io.InterruptedIOException;
method public static int write(java.io.FileDescriptor, byte[], int, int) throws android.system.ErrnoException, java.io.InterruptedIOException;
- method public static int writev(java.io.FileDescriptor, java.lang.Object[], int[], int[]) throws android.system.ErrnoException, java.io.InterruptedIOException;
+ method public static int writev(java.io.FileDescriptor, Object[], int[], int[]) throws android.system.ErrnoException, java.io.InterruptedIOException;
}
public final class OsConstants {
@@ -42019,10 +42270,12 @@ package android.system {
method public static boolean WIFSTOPPED(int);
method public static int WSTOPSIG(int);
method public static int WTERMSIG(int);
- method public static java.lang.String errnoName(int);
- method public static java.lang.String gaiName(int);
+ method public static String errnoName(int);
+ method public static String gaiName(int);
field public static final int AF_INET;
field public static final int AF_INET6;
+ field public static final int AF_NETLINK;
+ field public static final int AF_PACKET;
field public static final int AF_UNIX;
field public static final int AF_UNSPEC;
field public static final int AI_ADDRCONFIG;
@@ -42032,6 +42285,7 @@ package android.system {
field public static final int AI_NUMERICSERV;
field public static final int AI_PASSIVE;
field public static final int AI_V4MAPPED;
+ field public static final int ARPHRD_ETHER;
field public static final int CAP_AUDIT_CONTROL;
field public static final int CAP_AUDIT_WRITE;
field public static final int CAP_BLOCK_SUSPEND;
@@ -42155,6 +42409,10 @@ package android.system {
field public static final int ESPIPE;
field public static final int ESRCH;
field public static final int ESTALE;
+ field public static final int ETH_P_ALL;
+ field public static final int ETH_P_ARP;
+ field public static final int ETH_P_IP;
+ field public static final int ETH_P_IPV6;
field public static final int ETIME;
field public static final int ETIMEDOUT;
field public static final int ETXTBSY;
@@ -42252,6 +42510,8 @@ package android.system {
field public static final int MS_ASYNC;
field public static final int MS_INVALIDATE;
field public static final int MS_SYNC;
+ field public static final int NETLINK_INET_DIAG;
+ field public static final int NETLINK_ROUTE;
field public static final int NI_DGRAM;
field public static final int NI_NAMEREQD;
field public static final int NI_NOFQDN;
@@ -42288,6 +42548,7 @@ package android.system {
field public static final int PR_GET_DUMPABLE;
field public static final int PR_SET_DUMPABLE;
field public static final int PR_SET_NO_NEW_PRIVS;
+ field public static final int RTMGRP_NEIGH;
field public static final int RT_SCOPE_HOST;
field public static final int RT_SCOPE_LINK;
field public static final int RT_SCOPE_NOWHERE;
@@ -42504,7 +42765,7 @@ package android.system {
field public short events;
field public java.io.FileDescriptor fd;
field public short revents;
- field public java.lang.Object userData;
+ field public Object userData;
}
public final class StructStat {
@@ -42543,7 +42804,7 @@ package android.system {
field public final long f_namemax;
}
- public final class StructTimespec implements java.lang.Comparable {
+ public final class StructTimespec implements java.lang.Comparable<android.system.StructTimespec> {
ctor public StructTimespec(long, long);
method public int compareTo(android.system.StructTimespec);
field public final long tv_nsec;
@@ -42551,12 +42812,12 @@ package android.system {
}
public final class StructUtsname {
- ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- field public final java.lang.String machine;
- field public final java.lang.String nodename;
- field public final java.lang.String release;
- field public final java.lang.String sysname;
- field public final java.lang.String version;
+ ctor public StructUtsname(String, String, String, String, String);
+ field public final String machine;
+ field public final String nodename;
+ field public final String release;
+ field public final String sysname;
+ field public final String version;
}
}
@@ -42573,8 +42834,8 @@ package android.telecom {
method public java.util.List<android.telecom.Call> getConferenceableCalls();
method public android.telecom.Call.Details getDetails();
method public android.telecom.Call getParent();
- method public java.lang.String getRemainingPostDialSequence();
- method public android.telecom.Call.RttCall getRttCall();
+ method public String getRemainingPostDialSequence();
+ method @Nullable public android.telecom.Call.RttCall getRttCall();
method public int getState();
method public android.telecom.InCallService.VideoCall getVideoCall();
method public void handoverTo(android.telecom.PhoneAccountHandle, int, android.os.Bundle);
@@ -42588,11 +42849,11 @@ package android.telecom {
method public void putExtras(android.os.Bundle);
method public void registerCallback(android.telecom.Call.Callback);
method public void registerCallback(android.telecom.Call.Callback, android.os.Handler);
- method public void reject(boolean, java.lang.String);
+ method public void reject(boolean, String);
method public void removeExtras(java.util.List<java.lang.String>);
method public void removeExtras(java.lang.String...);
method public void respondToRttRequest(int, boolean);
- method public void sendCallEvent(java.lang.String, android.os.Bundle);
+ method public void sendCallEvent(String, android.os.Bundle);
method public void sendRttRequest();
method public void splitFromConference();
method public void stopDtmfTone();
@@ -42600,9 +42861,9 @@ package android.telecom {
method public void swapConference();
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
- field public static final deprecated java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
- field public static final java.lang.String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS = "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
- field public static final java.lang.String EXTRA_SUGGESTED_PHONE_ACCOUNTS = "android.telecom.extra.SUGGESTED_PHONE_ACCOUNTS";
+ field @Deprecated public static final String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+ field public static final String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS = "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
+ field public static final String EXTRA_SUGGESTED_PHONE_ACCOUNTS = "android.telecom.extra.SUGGESTED_PHONE_ACCOUNTS";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
field public static final int STATE_DIALING = 1; // 0x1
@@ -42615,18 +42876,18 @@ package android.telecom {
field public static final int STATE_SELECT_PHONE_ACCOUNT = 8; // 0x8
}
- public static abstract class Call.Callback {
+ public abstract static class Call.Callback {
ctor public Call.Callback();
method public void onCallDestroyed(android.telecom.Call);
method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
- method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle);
+ method public void onConnectionEvent(android.telecom.Call, String, android.os.Bundle);
method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
method public void onHandoverComplete(android.telecom.Call);
method public void onHandoverFailed(android.telecom.Call, int);
method public void onParentChanged(android.telecom.Call, android.telecom.Call);
- method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onPostDialWait(android.telecom.Call, String);
method public void onRttInitiationFailure(android.telecom.Call, int);
method public void onRttModeChanged(android.telecom.Call, int);
method public void onRttRequest(android.telecom.Call, int);
@@ -42643,12 +42904,13 @@ package android.telecom {
public static class Call.Details {
method public static boolean can(int, int);
method public boolean can(int);
- method public static java.lang.String capabilitiesToString(int);
+ method public static String capabilitiesToString(int);
method public android.telecom.PhoneAccountHandle getAccountHandle();
method public int getCallCapabilities();
- method public android.telecom.CallIdentification getCallIdentification();
+ method public int getCallDirection();
+ method @Nullable public android.telecom.CallIdentification getCallIdentification();
method public int getCallProperties();
- method public java.lang.String getCallerDisplayName();
+ method public String getCallerDisplayName();
method public int getCallerDisplayNamePresentation();
method public final long getConnectTimeMillis();
method public long getCreationTimeMillis();
@@ -42662,7 +42924,7 @@ package android.telecom {
method public int getVideoState();
method public static boolean hasProperty(int, int);
method public boolean hasProperty(int);
- method public static java.lang.String propertiesToString(int);
+ method public static String propertiesToString(int);
field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 4194304; // 0x400000
field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000
field public static final int CAPABILITY_CAN_PULL_CALL = 8388608; // 0x800000
@@ -42682,6 +42944,9 @@ package android.telecom {
field public static final int CAPABILITY_SUPPORT_DEFLECT = 16777216; // 0x1000000
field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2
field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8
+ field public static final int DIRECTION_INCOMING = 0; // 0x0
+ field public static final int DIRECTION_OUTGOING = 1; // 0x1
+ field public static final int DIRECTION_UNKNOWN = -1; // 0xffffffff
field public static final int PROPERTY_CONFERENCE = 1; // 0x1
field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4
field public static final int PROPERTY_ENTERPRISE_CALL = 32; // 0x20
@@ -42698,10 +42963,10 @@ package android.telecom {
public static final class Call.RttCall {
method public int getRttAudioMode();
- method public java.lang.String read();
- method public java.lang.String readImmediately() throws java.io.IOException;
+ method public String read();
+ method public String readImmediately() throws java.io.IOException;
method public void setRttMode(int);
- method public void write(java.lang.String) throws java.io.IOException;
+ method public void write(String) throws java.io.IOException;
field public static final int RTT_MODE_FULL = 1; // 0x1
field public static final int RTT_MODE_HCO = 2; // 0x2
field public static final int RTT_MODE_VCO = 3; // 0x3
@@ -42709,7 +42974,7 @@ package android.telecom {
public final class CallAudioState implements android.os.Parcelable {
ctor public CallAudioState(boolean, int, int);
- method public static java.lang.String audioRouteToString(int);
+ method public static String audioRouteToString(int);
method public int describeContents();
method public android.bluetooth.BluetoothDevice getActiveBluetoothDevice();
method public int getRoute();
@@ -42727,13 +42992,13 @@ package android.telecom {
public final class CallIdentification implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallScreeningAppName();
- method public java.lang.String getCallScreeningPackageName();
- method public java.lang.String getDescription();
- method public java.lang.String getDetails();
- method public java.lang.String getName();
+ method @NonNull public String getCallScreeningAppName();
+ method @NonNull public String getCallScreeningPackageName();
+ method @Nullable public String getDescription();
+ method @Nullable public String getDetails();
+ method @Nullable public String getName();
method public int getNuisanceConfidence();
- method public android.graphics.drawable.Icon getPhoto();
+ method @Nullable public android.graphics.drawable.Icon getPhoto();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CONFIDENCE_LIKELY_NOT_NUISANCE = -1; // 0xffffffff
field public static final int CONFIDENCE_LIKELY_NUISANCE = 1; // 0x1
@@ -42746,31 +43011,31 @@ package android.telecom {
public static class CallIdentification.Builder {
ctor public CallIdentification.Builder();
method public android.telecom.CallIdentification build();
- method public android.telecom.CallIdentification.Builder setDescription(java.lang.String);
- method public android.telecom.CallIdentification.Builder setDetails(java.lang.String);
- method public android.telecom.CallIdentification.Builder setName(java.lang.String);
+ method public android.telecom.CallIdentification.Builder setDescription(@Nullable String);
+ method public android.telecom.CallIdentification.Builder setDetails(@Nullable String);
+ method public android.telecom.CallIdentification.Builder setName(@Nullable String);
method public android.telecom.CallIdentification.Builder setNuisanceConfidence(int);
- method public android.telecom.CallIdentification.Builder setPhoto(android.graphics.drawable.Icon);
+ method public android.telecom.CallIdentification.Builder setPhoto(@Nullable android.graphics.drawable.Icon);
}
public abstract class CallRedirectionService extends android.app.Service {
ctor public CallRedirectionService();
method public final void cancelCall();
method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract void onPlaceCall(android.net.Uri, android.telecom.PhoneAccountHandle);
+ method public abstract void onPlaceCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
method public final boolean onUnbind(android.content.Intent);
method public final void placeCallUnmodified();
- method public final void redirectCall(android.net.Uri, android.telecom.PhoneAccountHandle);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.CallRedirectionService";
+ method public final void redirectCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
+ field public static final String SERVICE_INTERFACE = "android.telecom.CallRedirectionService";
}
public abstract class CallScreeningService extends android.app.Service {
ctor public CallScreeningService();
method public android.os.IBinder onBind(android.content.Intent);
- method public abstract void onScreenCall(android.telecom.Call.Details);
- method public final void provideCallIdentification(android.telecom.Call.Details, android.telecom.CallIdentification);
- method public final void respondToCall(android.telecom.Call.Details, android.telecom.CallScreeningService.CallResponse);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.CallScreeningService";
+ method public abstract void onScreenCall(@NonNull android.telecom.Call.Details);
+ method public final void provideCallIdentification(@NonNull android.telecom.Call.Details, @NonNull android.telecom.CallIdentification);
+ method public final void respondToCall(@NonNull android.telecom.Call.Details, @NonNull android.telecom.CallScreeningService.CallResponse);
+ field public static final String SERVICE_INTERFACE = "android.telecom.CallScreeningService";
}
public static class CallScreeningService.CallResponse {
@@ -42818,7 +43083,7 @@ package android.telecom {
method public void onStopDtmfTone();
method public void onSwap();
method public void onUnhold();
- method public final void putExtras(android.os.Bundle);
+ method public final void putExtras(@NonNull android.os.Bundle);
method public final void removeConnection(android.telecom.Connection);
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
@@ -42830,7 +43095,7 @@ package android.telecom {
method public final void setConnectionTime(long);
method public final void setDialing();
method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setExtras(android.os.Bundle);
+ method public final void setExtras(@Nullable android.os.Bundle);
method public final void setOnHold();
method public final void setStatusHints(android.telecom.StatusHints);
method public final void setVideoProvider(android.telecom.Connection, android.telecom.Connection.VideoProvider);
@@ -42843,7 +43108,7 @@ package android.telecom {
public abstract class Connection extends android.telecom.Conferenceable {
ctor public Connection();
- method public static java.lang.String capabilitiesToString(int);
+ method public static String capabilitiesToString(int);
method public static android.telecom.Connection createCanceledConnection();
method public static android.telecom.Connection createFailedConnection(android.telecom.DisconnectCause);
method public final void destroy();
@@ -42851,7 +43116,7 @@ package android.telecom {
method public final int getAddressPresentation();
method public final boolean getAudioModeIsVoip();
method public final android.telecom.CallAudioState getCallAudioState();
- method public final java.lang.String getCallerDisplayName();
+ method public final String getCallerDisplayName();
method public final int getCallerDisplayNamePresentation();
method public final android.telecom.Conference getConference();
method public final java.util.List<android.telecom.Conferenceable> getConferenceables();
@@ -42862,13 +43127,13 @@ package android.telecom {
method public final int getState();
method public final android.telecom.StatusHints getStatusHints();
method public final android.telecom.Connection.VideoProvider getVideoProvider();
- method public void handleRttUpgradeResponse(android.telecom.Connection.RttTextStream);
+ method public void handleRttUpgradeResponse(@Nullable android.telecom.Connection.RttTextStream);
method public final boolean isRingbackRequested();
method public void onAbort();
method public void onAnswer(int);
method public void onAnswer();
method public void onCallAudioStateChanged(android.telecom.CallAudioState);
- method public void onCallEvent(java.lang.String, android.os.Bundle);
+ method public void onCallEvent(String, android.os.Bundle);
method public void onDeflect(android.net.Uri);
method public void onDisconnect();
method public void onExtrasChanged(android.os.Bundle);
@@ -42878,21 +43143,21 @@ package android.telecom {
method public void onPostDialContinue(boolean);
method public void onPullExternalCall();
method public void onReject();
- method public void onReject(java.lang.String);
+ method public void onReject(String);
method public void onSeparate();
method public void onShowIncomingCallUi();
method public void onSilence();
- method public void onStartRtt(android.telecom.Connection.RttTextStream);
+ method public void onStartRtt(@NonNull android.telecom.Connection.RttTextStream);
method public void onStateChanged(int);
method public void onStopDtmfTone();
method public void onStopRtt();
method public void onUnhold();
- method public static java.lang.String propertiesToString(int);
- method public final void putExtras(android.os.Bundle);
+ method public static String propertiesToString(int);
+ method public final void putExtras(@NonNull android.os.Bundle);
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
- method public void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
- method public void sendConnectionEvent(java.lang.String, android.os.Bundle);
+ method public void requestBluetoothAudio(@NonNull android.bluetooth.BluetoothDevice);
+ method public void sendConnectionEvent(String, android.os.Bundle);
method public final void sendRemoteRttRequest();
method public final void sendRttInitiationFailure(int);
method public final void sendRttInitiationSuccess();
@@ -42901,31 +43166,31 @@ package android.telecom {
method public final void setAddress(android.net.Uri, int);
method public final void setAudioModeIsVoip(boolean);
method public final void setAudioRoute(int);
- method public final void setCallerDisplayName(java.lang.String, int);
+ method public final void setCallerDisplayName(String, int);
method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
method public final void setConferenceables(java.util.List<android.telecom.Conferenceable>);
method public final void setConnectionCapabilities(int);
method public final void setConnectionProperties(int);
method public final void setDialing();
method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setExtras(android.os.Bundle);
+ method public final void setExtras(@Nullable android.os.Bundle);
method public final void setInitialized();
method public final void setInitializing();
method public final void setNextPostDialChar(char);
method public final void setOnHold();
- method public final void setPostDialWait(java.lang.String);
+ method public final void setPostDialWait(String);
method public final void setPulling();
method public final void setRingbackRequested(boolean);
method public final void setRinging();
method public final void setStatusHints(android.telecom.StatusHints);
method public final void setVideoProvider(android.telecom.Connection.VideoProvider);
method public final void setVideoState(int);
- method public static java.lang.String stateToString(int);
+ method public static String stateToString(int);
field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 8388608; // 0x800000
field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000
field public static final int CAPABILITY_CAN_PULL_CALL = 16777216; // 0x1000000
field public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 4194304; // 0x400000
- field public static final deprecated int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000
+ field @Deprecated public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000
field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000
field public static final int CAPABILITY_HOLD = 1; // 0x1
field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80
@@ -42942,14 +43207,16 @@ package android.telecom {
field public static final int CAPABILITY_SUPPORT_DEFLECT = 33554432; // 0x2000000
field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2
field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8
- field public static final java.lang.String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
- field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED";
- field public static final java.lang.String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL";
- field public static final java.lang.String EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME = "android.telecom.extra.ANSWERING_DROPS_FG_CALL_APP_NAME";
- field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
- field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
- field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER";
- field public static final java.lang.String EXTRA_SIP_INVITE = "android.telecom.extra.SIP_INVITE";
+ field public static final String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
+ field public static final String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED";
+ field public static final String EVENT_RTT_AUDIO_INDICATION_CHANGED = "android.telecom.event.RTT_AUDIO_INDICATION_CHANGED";
+ field public static final String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL";
+ field public static final String EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME = "android.telecom.extra.ANSWERING_DROPS_FG_CALL_APP_NAME";
+ field public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
+ field public static final String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
+ field public static final String EXTRA_IS_RTT_AUDIO_PRESENT = "android.telecom.extra.IS_RTT_AUDIO_PRESENT";
+ field public static final String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER";
+ field public static final String EXTRA_SIP_INVITE = "android.telecom.extra.SIP_INVITE";
field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 32; // 0x20
field public static final int PROPERTY_IS_EXTERNAL_CALL = 16; // 0x10
field public static final int PROPERTY_IS_RTT = 256; // 0x100
@@ -42973,12 +43240,12 @@ package android.telecom {
}
public static final class Connection.RttTextStream {
- method public java.lang.String read() throws java.io.IOException;
- method public java.lang.String readImmediately() throws java.io.IOException;
- method public void write(java.lang.String) throws java.io.IOException;
+ method public String read() throws java.io.IOException;
+ method public String readImmediately() throws java.io.IOException;
+ method public void write(String) throws java.io.IOException;
}
- public static abstract class Connection.VideoProvider {
+ public abstract static class Connection.VideoProvider {
ctor public Connection.VideoProvider();
method public void changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities);
method public void changePeerDimensions(int, int);
@@ -42988,7 +43255,7 @@ package android.telecom {
method public abstract void onRequestConnectionDataUsage();
method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile);
method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile);
- method public abstract void onSetCamera(java.lang.String);
+ method public abstract void onSetCamera(String);
method public abstract void onSetDeviceOrientation(int);
method public abstract void onSetDisplaySurface(android.view.Surface);
method public abstract void onSetPauseImage(android.net.Uri);
@@ -43048,19 +43315,19 @@ package android.telecom {
method public void onHandoverFailed(android.telecom.ConnectionRequest, int);
method public void onRemoteConferenceAdded(android.telecom.RemoteConference);
method public void onRemoteExistingConnectionAdded(android.telecom.RemoteConnection);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService";
+ field public static final String SERVICE_INTERFACE = "android.telecom.ConnectionService";
}
public final class DisconnectCause implements android.os.Parcelable {
ctor public DisconnectCause(int);
- ctor public DisconnectCause(int, java.lang.String);
- ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
- ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String, int);
+ ctor public DisconnectCause(int, String);
+ ctor public DisconnectCause(int, CharSequence, CharSequence, String);
+ ctor public DisconnectCause(int, CharSequence, CharSequence, String, int);
method public int describeContents();
method public int getCode();
- method public java.lang.CharSequence getDescription();
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getReason();
+ method public CharSequence getDescription();
+ method public CharSequence getLabel();
+ method public String getReason();
method public int getTone();
method public void writeToParcel(android.os.Parcel, int);
field public static final int ANSWERED_ELSEWHERE = 11; // 0xb
@@ -43080,10 +43347,10 @@ package android.telecom {
}
public class GatewayInfo implements android.os.Parcelable {
- ctor public GatewayInfo(java.lang.String, android.net.Uri, android.net.Uri);
+ ctor public GatewayInfo(String, android.net.Uri, android.net.Uri);
method public int describeContents();
method public android.net.Uri getGatewayAddress();
- method public java.lang.String getGatewayProviderPackageName();
+ method public String getGatewayProviderPackageName();
method public android.net.Uri getOriginalAddress();
method public boolean isEmpty();
method public void writeToParcel(android.os.Parcel, int);
@@ -43101,15 +43368,15 @@ package android.telecom {
method public void onCallAudioStateChanged(android.telecom.CallAudioState);
method public void onCallRemoved(android.telecom.Call);
method public void onCanAddCallChanged(boolean);
- method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle);
+ method public void onConnectionEvent(android.telecom.Call, String, android.os.Bundle);
method public void onSilenceRinger();
- method public final void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
+ method public final void requestBluetoothAudio(@NonNull android.bluetooth.BluetoothDevice);
method public final void setAudioRoute(int);
method public final void setMuted(boolean);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.InCallService";
+ field public static final String SERVICE_INTERFACE = "android.telecom.InCallService";
}
- public static abstract class InCallService.VideoCall {
+ public abstract static class InCallService.VideoCall {
ctor public InCallService.VideoCall();
method public abstract void registerCallback(android.telecom.InCallService.VideoCall.Callback);
method public abstract void registerCallback(android.telecom.InCallService.VideoCall.Callback, android.os.Handler);
@@ -43117,7 +43384,7 @@ package android.telecom {
method public abstract void requestCameraCapabilities();
method public abstract void sendSessionModifyRequest(android.telecom.VideoProfile);
method public abstract void sendSessionModifyResponse(android.telecom.VideoProfile);
- method public abstract void setCamera(java.lang.String);
+ method public abstract void setCamera(String);
method public abstract void setDeviceOrientation(int);
method public abstract void setDisplaySurface(android.view.Surface);
method public abstract void setPauseImage(android.net.Uri);
@@ -43126,7 +43393,7 @@ package android.telecom {
method public abstract void unregisterCallback(android.telecom.InCallService.VideoCall.Callback);
}
- public static abstract class InCallService.VideoCall.Callback {
+ public abstract static class InCallService.VideoCall.Callback {
ctor public InCallService.VideoCall.Callback();
method public abstract void onCallDataUsageChanged(long);
method public abstract void onCallSessionEvent(int);
@@ -43138,7 +43405,7 @@ package android.telecom {
}
public final class PhoneAccount implements android.os.Parcelable {
- method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
+ method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, CharSequence);
method public int describeContents();
method public android.telecom.PhoneAccountHandle getAccountHandle();
method public android.net.Uri getAddress();
@@ -43146,13 +43413,13 @@ package android.telecom {
method public android.os.Bundle getExtras();
method public int getHighlightColor();
method public android.graphics.drawable.Icon getIcon();
- method public java.lang.CharSequence getLabel();
- method public java.lang.CharSequence getShortDescription();
+ method public CharSequence getLabel();
+ method public CharSequence getShortDescription();
method public android.net.Uri getSubscriptionAddress();
method public java.util.List<java.lang.String> getSupportedUriSchemes();
method public boolean hasCapabilities(int);
method public boolean isEnabled();
- method public boolean supportsUriScheme(java.lang.String);
+ method public boolean supportsUriScheme(String);
method public android.telecom.PhoneAccount.Builder toBuilder();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2
@@ -43166,39 +43433,39 @@ package android.telecom {
field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8
field public static final int CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE = 256; // 0x100
field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR;
- field public static final java.lang.String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING";
- field public static final java.lang.String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH";
- field public static final java.lang.String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS";
- field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM";
- field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO";
+ field public static final String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING";
+ field public static final String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH";
+ field public static final String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS";
+ field public static final String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM";
+ field public static final String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO";
field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0
field public static final int NO_RESOURCE_ID = -1; // 0xffffffff
- field public static final java.lang.String SCHEME_SIP = "sip";
- field public static final java.lang.String SCHEME_TEL = "tel";
- field public static final java.lang.String SCHEME_VOICEMAIL = "voicemail";
+ field public static final String SCHEME_SIP = "sip";
+ field public static final String SCHEME_TEL = "tel";
+ field public static final String SCHEME_VOICEMAIL = "voicemail";
}
public static class PhoneAccount.Builder {
- ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
+ ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, CharSequence);
ctor public PhoneAccount.Builder(android.telecom.PhoneAccount);
- method public android.telecom.PhoneAccount.Builder addSupportedUriScheme(java.lang.String);
+ method public android.telecom.PhoneAccount.Builder addSupportedUriScheme(String);
method public android.telecom.PhoneAccount build();
method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
method public android.telecom.PhoneAccount.Builder setCapabilities(int);
method public android.telecom.PhoneAccount.Builder setExtras(android.os.Bundle);
method public android.telecom.PhoneAccount.Builder setHighlightColor(int);
method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.drawable.Icon);
- method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence);
+ method public android.telecom.PhoneAccount.Builder setShortDescription(CharSequence);
method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri);
method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>);
}
public final class PhoneAccountHandle implements android.os.Parcelable {
- ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String);
- ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String, android.os.UserHandle);
+ ctor public PhoneAccountHandle(@NonNull android.content.ComponentName, @NonNull String);
+ ctor public PhoneAccountHandle(@NonNull android.content.ComponentName, @NonNull String, @NonNull android.os.UserHandle);
method public int describeContents();
method public android.content.ComponentName getComponentName();
- method public java.lang.String getId();
+ method public String getId();
method public android.os.UserHandle getUserHandle();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccountHandle> CREATOR;
@@ -43240,7 +43507,7 @@ package android.telecom {
method public void unregisterCallback(android.telecom.RemoteConference.Callback);
}
- public static abstract class RemoteConference.Callback {
+ public abstract static class RemoteConference.Callback {
ctor public RemoteConference.Callback();
method public void onConferenceableConnectionsChanged(android.telecom.RemoteConference, java.util.List<android.telecom.RemoteConnection>);
method public void onConnectionAdded(android.telecom.RemoteConference, android.telecom.RemoteConnection);
@@ -43249,7 +43516,7 @@ package android.telecom {
method public void onConnectionRemoved(android.telecom.RemoteConference, android.telecom.RemoteConnection);
method public void onDestroyed(android.telecom.RemoteConference);
method public void onDisconnected(android.telecom.RemoteConference, android.telecom.DisconnectCause);
- method public void onExtrasChanged(android.telecom.RemoteConference, android.os.Bundle);
+ method public void onExtrasChanged(android.telecom.RemoteConference, @Nullable android.os.Bundle);
method public void onStateChanged(android.telecom.RemoteConference, int, int);
}
@@ -43259,7 +43526,7 @@ package android.telecom {
method public void disconnect();
method public android.net.Uri getAddress();
method public int getAddressPresentation();
- method public java.lang.CharSequence getCallerDisplayName();
+ method public CharSequence getCallerDisplayName();
method public int getCallerDisplayNamePresentation();
method public android.telecom.RemoteConference getConference();
method public java.util.List<android.telecom.RemoteConnection> getConferenceableConnections();
@@ -43286,20 +43553,20 @@ package android.telecom {
method public void unregisterCallback(android.telecom.RemoteConnection.Callback);
}
- public static abstract class RemoteConnection.Callback {
+ public abstract static class RemoteConnection.Callback {
ctor public RemoteConnection.Callback();
method public void onAddressChanged(android.telecom.RemoteConnection, android.net.Uri, int);
- method public void onCallerDisplayNameChanged(android.telecom.RemoteConnection, java.lang.String, int);
+ method public void onCallerDisplayNameChanged(android.telecom.RemoteConnection, String, int);
method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference);
method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>);
method public void onConnectionCapabilitiesChanged(android.telecom.RemoteConnection, int);
- method public void onConnectionEvent(android.telecom.RemoteConnection, java.lang.String, android.os.Bundle);
+ method public void onConnectionEvent(android.telecom.RemoteConnection, String, android.os.Bundle);
method public void onConnectionPropertiesChanged(android.telecom.RemoteConnection, int);
method public void onDestroyed(android.telecom.RemoteConnection);
method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause);
- method public void onExtrasChanged(android.telecom.RemoteConnection, android.os.Bundle);
+ method public void onExtrasChanged(android.telecom.RemoteConnection, @Nullable android.os.Bundle);
method public void onPostDialChar(android.telecom.RemoteConnection, char);
- method public void onPostDialWait(android.telecom.RemoteConnection, java.lang.String);
+ method public void onPostDialWait(android.telecom.RemoteConnection, String);
method public void onRingbackRequested(android.telecom.RemoteConnection, boolean);
method public void onStateChanged(android.telecom.RemoteConnection, int);
method public void onStatusHintsChanged(android.telecom.RemoteConnection, android.telecom.StatusHints);
@@ -43314,7 +43581,7 @@ package android.telecom {
method public void requestCameraCapabilities();
method public void sendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile);
method public void sendSessionModifyResponse(android.telecom.VideoProfile);
- method public void setCamera(java.lang.String);
+ method public void setCamera(String);
method public void setDeviceOrientation(int);
method public void setDisplaySurface(android.view.Surface);
method public void setPauseImage(android.net.Uri);
@@ -43323,7 +43590,7 @@ package android.telecom {
method public void unregisterCallback(android.telecom.RemoteConnection.VideoProvider.Callback);
}
- public static abstract class RemoteConnection.VideoProvider.Callback {
+ public abstract static class RemoteConnection.VideoProvider.Callback {
ctor public RemoteConnection.VideoProvider.Callback();
method public void onCallDataUsageChanged(android.telecom.RemoteConnection.VideoProvider, long);
method public void onCallSessionEvent(android.telecom.RemoteConnection.VideoProvider, int);
@@ -43335,86 +43602,86 @@ package android.telecom {
}
public final class StatusHints implements android.os.Parcelable {
- ctor public StatusHints(java.lang.CharSequence, android.graphics.drawable.Icon, android.os.Bundle);
+ ctor public StatusHints(CharSequence, android.graphics.drawable.Icon, android.os.Bundle);
method public int describeContents();
method public android.os.Bundle getExtras();
method public android.graphics.drawable.Icon getIcon();
- method public java.lang.CharSequence getLabel();
+ method public CharSequence getLabel();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telecom.StatusHints> CREATOR;
}
public class TelecomManager {
method public void acceptHandover(android.net.Uri, int, android.telecom.PhoneAccountHandle);
- method public void acceptRingingCall();
- method public void acceptRingingCall(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ANSWER_PHONE_CALLS, android.Manifest.permission.MODIFY_PHONE_STATE}) public void acceptRingingCall();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ANSWER_PHONE_CALLS, android.Manifest.permission.MODIFY_PHONE_STATE}) public void acceptRingingCall(int);
method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
- method public void cancelMissedCallsNotification();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void cancelMissedCallsNotification();
method public android.content.Intent createManageBlockedNumbersIntent();
- method public boolean endCall();
- method public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle);
- method public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts();
- method public java.lang.String getDefaultDialerPackage();
- method public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(java.lang.String);
- method public java.lang.String getLine1Number(android.telecom.PhoneAccountHandle);
+ method @RequiresPermission(android.Manifest.permission.ANSWER_PHONE_CALLS) public boolean endCall();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts();
+ method public String getDefaultDialerPackage();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(String);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1Number(android.telecom.PhoneAccountHandle);
method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
- method public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts();
method public android.telecom.PhoneAccountHandle getSimCallManager();
- method public java.lang.String getSystemDialerPackage();
- method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
- method public boolean handleMmi(java.lang.String);
- method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle);
- method public boolean isInCall();
- method public boolean isInManagedCall();
+ method public String getSystemDialerPackage();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String, android.telecom.PhoneAccountHandle);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isInCall();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isInManagedCall();
method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle);
method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle);
- method public boolean isTtySupported();
- method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String);
- method public void placeCall(android.net.Uri, android.os.Bundle);
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE}) public boolean isTtySupported();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, String);
+ method @RequiresPermission(anyOf={android.Manifest.permission.CALL_PHONE, android.Manifest.permission.MANAGE_OWN_CALLS}) public void placeCall(android.net.Uri, android.os.Bundle);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
- method public void showInCallScreen(boolean);
- method public void silenceRinger();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public void showInCallScreen(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void silenceRinger();
method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
- field public static final java.lang.String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
- field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONFIGURE_PHONE_ACCOUNT = "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
- field public static final java.lang.String ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED = "android.telecom.action.DEFAULT_CALL_SCREENING_APP_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED";
- field public static final deprecated java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
- field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
- field public static final java.lang.String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED";
- field public static final java.lang.String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS";
- field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
- field public static final java.lang.String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION";
- field public static final java.lang.String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
+ field public static final String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
+ field public static final String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
+ field public static final String ACTION_CONFIGURE_PHONE_ACCOUNT = "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
+ field public static final String ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED = "android.telecom.action.DEFAULT_CALL_SCREENING_APP_CHANGED";
+ field public static final String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED";
+ field @Deprecated public static final String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
+ field public static final String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
+ field public static final String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED";
+ field public static final String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS";
+ field public static final String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
+ field public static final String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION";
+ field public static final String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
- field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
- field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
- field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
- field public static final java.lang.String EXTRA_CALL_NETWORK_TYPE = "android.telecom.extra.CALL_NETWORK_TYPE";
- field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
- field public static final java.lang.String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME";
- field public static final java.lang.String EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME = "android.telecom.extra.DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME";
- field public static final java.lang.String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS";
- field public static final java.lang.String EXTRA_INCOMING_CALL_EXTRAS = "android.telecom.extra.INCOMING_CALL_EXTRAS";
- field public static final java.lang.String EXTRA_INCOMING_VIDEO_STATE = "android.telecom.extra.INCOMING_VIDEO_STATE";
- field public static final java.lang.String EXTRA_IS_DEFAULT_CALL_SCREENING_APP = "android.telecom.extra.IS_DEFAULT_CALL_SCREENING_APP";
- field public static final java.lang.String EXTRA_IS_ENABLED = "android.telecom.extra.IS_ENABLED";
- field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telecom.extra.NOTIFICATION_COUNT";
- field public static final java.lang.String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
- field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
- field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
- field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
- field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
- field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
- field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
- field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS";
- field public static final java.lang.String METADATA_INCLUDE_SELF_MANAGED_CALLS = "android.telecom.INCLUDE_SELF_MANAGED_CALLS";
- field public static final java.lang.String METADATA_IN_CALL_SERVICE_CAR_MODE_UI = "android.telecom.IN_CALL_SERVICE_CAR_MODE_UI";
- field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING";
- field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI";
+ field public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
+ field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
+ field public static final String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
+ field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telecom.extra.CALL_NETWORK_TYPE";
+ field public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
+ field public static final String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME";
+ field public static final String EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME = "android.telecom.extra.DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME";
+ field public static final String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS";
+ field public static final String EXTRA_INCOMING_CALL_EXTRAS = "android.telecom.extra.INCOMING_CALL_EXTRAS";
+ field public static final String EXTRA_INCOMING_VIDEO_STATE = "android.telecom.extra.INCOMING_VIDEO_STATE";
+ field public static final String EXTRA_IS_DEFAULT_CALL_SCREENING_APP = "android.telecom.extra.IS_DEFAULT_CALL_SCREENING_APP";
+ field public static final String EXTRA_IS_ENABLED = "android.telecom.extra.IS_ENABLED";
+ field public static final String EXTRA_NOTIFICATION_COUNT = "android.telecom.extra.NOTIFICATION_COUNT";
+ field public static final String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
+ field public static final String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
+ field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
+ field public static final String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
+ field public static final String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
+ field public static final String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
+ field public static final String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
+ field public static final String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS";
+ field public static final String METADATA_INCLUDE_SELF_MANAGED_CALLS = "android.telecom.INCLUDE_SELF_MANAGED_CALLS";
+ field public static final String METADATA_IN_CALL_SERVICE_CAR_MODE_UI = "android.telecom.IN_CALL_SERVICE_CAR_MODE_UI";
+ field public static final String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING";
+ field public static final String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI";
field public static final int PRESENTATION_ALLOWED = 1; // 0x1
field public static final int PRESENTATION_PAYPHONE = 4; // 0x4
field public static final int PRESENTATION_RESTRICTED = 2; // 0x2
@@ -43433,7 +43700,7 @@ package android.telecom {
method public static boolean isReceptionEnabled(int);
method public static boolean isTransmissionEnabled(int);
method public static boolean isVideo(int);
- method public static java.lang.String videoStateToString(int);
+ method public static String videoStateToString(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telecom.VideoProfile> CREATOR;
field public static final int QUALITY_DEFAULT = 4; // 0x4
@@ -43580,182 +43847,182 @@ package android.telephony {
}
public class CarrierConfigManager {
- method public android.os.PersistableBundle getConfig();
- method public android.os.PersistableBundle getConfigForSubId(int);
+ method @Nullable public android.os.PersistableBundle getConfig();
+ method @Nullable public android.os.PersistableBundle getConfigForSubId(int);
method public static boolean isConfigForIdentifiedCarrier(android.os.PersistableBundle);
method public void notifyConfigChangedForSubId(int);
- field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+ field public static final String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
field public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
- field public static final java.lang.String EXTRA_SLOT_INDEX = "android.telephony.extra.SLOT_INDEX";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
- field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
- field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
- field public static final java.lang.String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
- field public static final java.lang.String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
- field public static final java.lang.String KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL = "allow_emergency_video_calls_bool";
- field public static final java.lang.String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
- field public static final java.lang.String KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL = "allow_merge_wifi_calls_when_vowifi_off_bool";
- field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
- field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
- field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
- field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
- field public static final java.lang.String KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL = "call_barring_supports_deactivate_all_bool";
- field public static final java.lang.String KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL = "call_barring_supports_password_change_bool";
- field public static final java.lang.String KEY_CALL_BARRING_VISIBILITY_BOOL = "call_barring_visibility_bool";
- field public static final java.lang.String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = "call_forwarding_blocks_while_roaming_string_array";
- field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
- field public static final java.lang.String KEY_CARRIER_CALL_SCREENING_APP_STRING = "call_screening_app";
- field public static final java.lang.String KEY_CARRIER_CONFIG_VERSION_STRING = "carrier_config_version_string";
- field public static final java.lang.String KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS = "carrier_data_call_permanent_failure_strings";
- field public static final java.lang.String KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT = "carrier_default_wfc_ims_mode_int";
- field public static final java.lang.String KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT = "carrier_default_wfc_ims_roaming_mode_int";
- field public static final java.lang.String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL = "carrier_force_disable_etws_cmas_test_bool";
- field public static final java.lang.String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL = "carrier_ims_gba_required_bool";
- field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL = "carrier_instant_lettering_available_bool";
- field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING = "carrier_instant_lettering_encoding_string";
- field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING = "carrier_instant_lettering_escaped_chars_string";
- field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING = "carrier_instant_lettering_invalid_chars_string";
- field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT = "carrier_instant_lettering_length_limit_int";
- field public static final java.lang.String KEY_CARRIER_NAME_OVERRIDE_BOOL = "carrier_name_override_bool";
- field public static final java.lang.String KEY_CARRIER_NAME_STRING = "carrier_name_string";
- field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
- field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
- field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
- field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
- field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool";
- field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool";
- field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
- field public static final deprecated java.lang.String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string";
- field public static final java.lang.String KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY = "carrier_vvm_package_name_string_array";
- field public static final java.lang.String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool";
- field public static final java.lang.String KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL = "carrier_wfc_supports_wifi_only_bool";
- field public static final java.lang.String KEY_CDMA_3WAYCALL_FLASH_DELAY_INT = "cdma_3waycall_flash_delay_int";
- field public static final java.lang.String KEY_CDMA_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
- field public static final java.lang.String KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array";
- field public static final java.lang.String KEY_CDMA_ROAMING_MODE_INT = "cdma_roaming_mode_int";
- field public static final java.lang.String KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array";
- field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
- field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string";
- field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
- field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
- field public static final java.lang.String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string";
- field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
- field public static final java.lang.String KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL = "config_telephony_use_own_number_for_voicemail_bool";
- field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
- field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
- field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
- field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
- field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
- field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array";
- field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool";
- field public static final java.lang.String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool";
- field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool";
- field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool";
- field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int";
- field public static final java.lang.String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";
- field public static final java.lang.String KEY_EDITABLE_VOICEMAIL_NUMBER_BOOL = "editable_voicemail_number_bool";
- field public static final java.lang.String KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL = "editable_voicemail_number_setting_bool";
- field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool";
- field public static final java.lang.String KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL = "enhanced_4g_lte_on_by_default_bool";
- field public static final java.lang.String KEY_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
- field public static final java.lang.String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
- field public static final java.lang.String KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array";
- field public static final java.lang.String KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY = "gsm_roaming_networks_string_array";
- field public static final java.lang.String KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL = "has_in_call_noise_suppression_bool";
- field public static final java.lang.String KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
- field public static final java.lang.String KEY_HIDE_ENHANCED_4G_LTE_BOOL = "hide_enhanced_4g_lte_bool";
- field public static final java.lang.String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
- field public static final java.lang.String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
- field public static final java.lang.String KEY_HIDE_PRESET_APN_DETAILS_BOOL = "hide_preset_apn_details_bool";
- field public static final java.lang.String KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
- field public static final java.lang.String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
- field public static final java.lang.String KEY_IMS_CONFERENCE_SIZE_LIMIT_INT = "ims_conference_size_limit_int";
- field public static final java.lang.String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
- field public static final java.lang.String KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL = "is_ims_conference_size_enforced_bool";
- field public static final java.lang.String KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL = "mdn_is_additional_voicemail_number_bool";
- field public static final java.lang.String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
- field public static final java.lang.String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
- field public static final java.lang.String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
- field public static final java.lang.String KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL = "allowAttachAudio";
- field public static final java.lang.String KEY_MMS_APPEND_TRANSACTION_ID_BOOL = "enabledTransID";
- field public static final java.lang.String KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING = "emailGatewayNumber";
- field public static final java.lang.String KEY_MMS_GROUP_MMS_ENABLED_BOOL = "enableGroupMms";
- field public static final java.lang.String KEY_MMS_HTTP_PARAMS_STRING = "httpParams";
- field public static final java.lang.String KEY_MMS_HTTP_SOCKET_TIMEOUT_INT = "httpSocketTimeout";
- field public static final java.lang.String KEY_MMS_MAX_IMAGE_HEIGHT_INT = "maxImageHeight";
- field public static final java.lang.String KEY_MMS_MAX_IMAGE_WIDTH_INT = "maxImageWidth";
- field public static final java.lang.String KEY_MMS_MAX_MESSAGE_SIZE_INT = "maxMessageSize";
- field public static final java.lang.String KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT = "maxMessageTextSize";
- field public static final java.lang.String KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL = "enableMMSDeliveryReports";
- field public static final java.lang.String KEY_MMS_MMS_ENABLED_BOOL = "enabledMMS";
- field public static final java.lang.String KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL = "enableMMSReadReports";
- field public static final java.lang.String KEY_MMS_MULTIPART_SMS_ENABLED_BOOL = "enableMultipartSMS";
- field public static final java.lang.String KEY_MMS_NAI_SUFFIX_STRING = "naiSuffix";
- field public static final java.lang.String KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL = "enabledNotifyWapMMSC";
- field public static final java.lang.String KEY_MMS_RECIPIENT_LIMIT_INT = "recipientLimit";
- field public static final java.lang.String KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL = "sendMultipartSmsAsSeparateMessages";
- field public static final java.lang.String KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL = "config_cellBroadcastAppLinks";
- field public static final java.lang.String KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL = "enableSMSDeliveryReports";
- field public static final java.lang.String KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT = "smsToMmsTextLengthThreshold";
- field public static final java.lang.String KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT = "smsToMmsTextThreshold";
- field public static final java.lang.String KEY_MMS_SUBJECT_MAX_LENGTH_INT = "maxSubjectLength";
- field public static final java.lang.String KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL = "supportHttpCharsetHeader";
- field public static final java.lang.String KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL = "supportMmsContentDisposition";
- field public static final java.lang.String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
- field public static final java.lang.String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
- field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
- field public static final java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
- field public static final java.lang.String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
- field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
- field public static final java.lang.String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT = "opportunistic_network_entry_threshold_rsrp_int";
- field public static final java.lang.String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT = "opportunistic_network_entry_threshold_rssnr_int";
- field public static final java.lang.String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSRP_INT = "opportunistic_network_exit_threshold_rsrp_int";
- field public static final java.lang.String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSSNR_INT = "opportunistic_network_exit_threshold_rssnr_int";
- field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
- field public static final java.lang.String KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY = "radio_restart_failure_causes_int_array";
- field public static final java.lang.String KEY_RCS_CONFIG_SERVER_URL_STRING = "rcs_config_server_url_string";
- field public static final java.lang.String KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
- field public static final deprecated java.lang.String KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL = "restart_radio_on_pdp_fail_regular_deactivation_bool";
- field public static final java.lang.String KEY_RTT_SUPPORTED_BOOL = "rtt_supported_bool";
- field public static final java.lang.String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
- field public static final java.lang.String KEY_SHOW_CALL_BLOCKING_DISABLED_NOTIFICATION_ALWAYS_BOOL = "show_call_blocking_disabled_notification_always_bool";
- field public static final java.lang.String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
- field public static final java.lang.String KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL = "show_iccid_in_sim_status_bool";
- field public static final java.lang.String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
- field public static final java.lang.String KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL = "show_signal_strength_in_sim_status_bool";
- field public static final java.lang.String KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL = "simplified_network_settings_bool";
- field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
- field public static final java.lang.String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool";
- field public static final java.lang.String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = "support_3gpp_call_forwarding_while_roaming_bool";
- field public static final java.lang.String KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL = "support_clir_network_default_bool";
- field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
- field public static final java.lang.String KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL = "support_emergency_sms_over_ims_bool";
- field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
- field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
- field public static final java.lang.String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool";
- field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
- field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
- field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
- field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool";
- field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool";
- field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int";
- field public static final java.lang.String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL = "vvm_cellular_data_required_bool";
- field public static final java.lang.String KEY_VVM_CLIENT_PREFIX_STRING = "vvm_client_prefix_string";
- field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string";
- field public static final java.lang.String KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY = "vvm_disabled_capabilities_string_array";
- field public static final java.lang.String KEY_VVM_LEGACY_MODE_ENABLED_BOOL = "vvm_legacy_mode_enabled_bool";
- field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int";
- field public static final java.lang.String KEY_VVM_PREFETCH_BOOL = "vvm_prefetch_bool";
- field public static final java.lang.String KEY_VVM_SSL_ENABLED_BOOL = "vvm_ssl_enabled_bool";
- field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string";
- field public static final java.lang.String KEY_WORLD_PHONE_BOOL = "world_phone_bool";
+ field public static final String EXTRA_SLOT_INDEX = "android.telephony.extra.SLOT_INDEX";
+ field public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
+ field public static final String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
+ field public static final String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
+ field public static final String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
+ field public static final String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
+ field public static final String KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL = "allow_emergency_video_calls_bool";
+ field public static final String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
+ field public static final String KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL = "allow_merge_wifi_calls_when_vowifi_off_bool";
+ field public static final String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
+ field public static final String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
+ field public static final String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
+ field public static final String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
+ field public static final String KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL = "call_barring_supports_deactivate_all_bool";
+ field public static final String KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL = "call_barring_supports_password_change_bool";
+ field public static final String KEY_CALL_BARRING_VISIBILITY_BOOL = "call_barring_visibility_bool";
+ field public static final String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = "call_forwarding_blocks_while_roaming_string_array";
+ field public static final String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
+ field public static final String KEY_CARRIER_CALL_SCREENING_APP_STRING = "call_screening_app";
+ field public static final String KEY_CARRIER_CONFIG_VERSION_STRING = "carrier_config_version_string";
+ field public static final String KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS = "carrier_data_call_permanent_failure_strings";
+ field public static final String KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT = "carrier_default_wfc_ims_mode_int";
+ field public static final String KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT = "carrier_default_wfc_ims_roaming_mode_int";
+ field public static final String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL = "carrier_force_disable_etws_cmas_test_bool";
+ field public static final String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL = "carrier_ims_gba_required_bool";
+ field public static final String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL = "carrier_instant_lettering_available_bool";
+ field public static final String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING = "carrier_instant_lettering_encoding_string";
+ field public static final String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING = "carrier_instant_lettering_escaped_chars_string";
+ field public static final String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING = "carrier_instant_lettering_invalid_chars_string";
+ field public static final String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT = "carrier_instant_lettering_length_limit_int";
+ field public static final String KEY_CARRIER_NAME_OVERRIDE_BOOL = "carrier_name_override_bool";
+ field public static final String KEY_CARRIER_NAME_STRING = "carrier_name_string";
+ field public static final String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
+ field public static final String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
+ field public static final String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
+ field public static final String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
+ field public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool";
+ field public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool";
+ field public static final String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
+ field @Deprecated public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string";
+ field public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY = "carrier_vvm_package_name_string_array";
+ field public static final String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool";
+ field public static final String KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL = "carrier_wfc_supports_wifi_only_bool";
+ field public static final String KEY_CDMA_3WAYCALL_FLASH_DELAY_INT = "cdma_3waycall_flash_delay_int";
+ field public static final String KEY_CDMA_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
+ field public static final String KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array";
+ field public static final String KEY_CDMA_ROAMING_MODE_INT = "cdma_roaming_mode_int";
+ field public static final String KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array";
+ field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
+ field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string";
+ field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
+ field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
+ field public static final String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string";
+ field public static final String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
+ field public static final String KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL = "config_telephony_use_own_number_for_voicemail_bool";
+ field public static final String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
+ field public static final String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+ field public static final String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
+ field public static final String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
+ field public static final String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
+ field public static final String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array";
+ field public static final String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool";
+ field public static final String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool";
+ field public static final String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool";
+ field public static final String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool";
+ field public static final String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int";
+ field public static final String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";
+ field public static final String KEY_EDITABLE_VOICEMAIL_NUMBER_BOOL = "editable_voicemail_number_bool";
+ field public static final String KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL = "editable_voicemail_number_setting_bool";
+ field public static final String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool";
+ field public static final String KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL = "enhanced_4g_lte_on_by_default_bool";
+ field public static final String KEY_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
+ field public static final String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
+ field public static final String KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array";
+ field public static final String KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY = "gsm_roaming_networks_string_array";
+ field public static final String KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL = "has_in_call_noise_suppression_bool";
+ field public static final String KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
+ field public static final String KEY_HIDE_ENHANCED_4G_LTE_BOOL = "hide_enhanced_4g_lte_bool";
+ field public static final String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
+ field public static final String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
+ field public static final String KEY_HIDE_PRESET_APN_DETAILS_BOOL = "hide_preset_apn_details_bool";
+ field public static final String KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
+ field public static final String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
+ field public static final String KEY_IMS_CONFERENCE_SIZE_LIMIT_INT = "ims_conference_size_limit_int";
+ field public static final String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
+ field public static final String KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL = "is_ims_conference_size_enforced_bool";
+ field public static final String KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL = "mdn_is_additional_voicemail_number_bool";
+ field public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
+ field public static final String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
+ field public static final String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
+ field public static final String KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL = "allowAttachAudio";
+ field public static final String KEY_MMS_APPEND_TRANSACTION_ID_BOOL = "enabledTransID";
+ field public static final String KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING = "emailGatewayNumber";
+ field public static final String KEY_MMS_GROUP_MMS_ENABLED_BOOL = "enableGroupMms";
+ field public static final String KEY_MMS_HTTP_PARAMS_STRING = "httpParams";
+ field public static final String KEY_MMS_HTTP_SOCKET_TIMEOUT_INT = "httpSocketTimeout";
+ field public static final String KEY_MMS_MAX_IMAGE_HEIGHT_INT = "maxImageHeight";
+ field public static final String KEY_MMS_MAX_IMAGE_WIDTH_INT = "maxImageWidth";
+ field public static final String KEY_MMS_MAX_MESSAGE_SIZE_INT = "maxMessageSize";
+ field public static final String KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT = "maxMessageTextSize";
+ field public static final String KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL = "enableMMSDeliveryReports";
+ field public static final String KEY_MMS_MMS_ENABLED_BOOL = "enabledMMS";
+ field public static final String KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL = "enableMMSReadReports";
+ field public static final String KEY_MMS_MULTIPART_SMS_ENABLED_BOOL = "enableMultipartSMS";
+ field public static final String KEY_MMS_NAI_SUFFIX_STRING = "naiSuffix";
+ field public static final String KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL = "enabledNotifyWapMMSC";
+ field public static final String KEY_MMS_RECIPIENT_LIMIT_INT = "recipientLimit";
+ field public static final String KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL = "sendMultipartSmsAsSeparateMessages";
+ field public static final String KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL = "config_cellBroadcastAppLinks";
+ field public static final String KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL = "enableSMSDeliveryReports";
+ field public static final String KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT = "smsToMmsTextLengthThreshold";
+ field public static final String KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT = "smsToMmsTextThreshold";
+ field public static final String KEY_MMS_SUBJECT_MAX_LENGTH_INT = "maxSubjectLength";
+ field public static final String KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL = "supportHttpCharsetHeader";
+ field public static final String KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL = "supportMmsContentDisposition";
+ field public static final String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
+ field public static final String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
+ field public static final String KEY_MMS_USER_AGENT_STRING = "userAgent";
+ field public static final String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
+ field public static final String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
+ field public static final String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
+ field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT = "opportunistic_network_entry_threshold_rsrp_int";
+ field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT = "opportunistic_network_entry_threshold_rssnr_int";
+ field public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSRP_INT = "opportunistic_network_exit_threshold_rsrp_int";
+ field public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSSNR_INT = "opportunistic_network_exit_threshold_rssnr_int";
+ field public static final String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
+ field public static final String KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY = "radio_restart_failure_causes_int_array";
+ field public static final String KEY_RCS_CONFIG_SERVER_URL_STRING = "rcs_config_server_url_string";
+ field public static final String KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
+ field @Deprecated public static final String KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL = "restart_radio_on_pdp_fail_regular_deactivation_bool";
+ field public static final String KEY_RTT_SUPPORTED_BOOL = "rtt_supported_bool";
+ field public static final String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
+ field public static final String KEY_SHOW_CALL_BLOCKING_DISABLED_NOTIFICATION_ALWAYS_BOOL = "show_call_blocking_disabled_notification_always_bool";
+ field public static final String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
+ field public static final String KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL = "show_iccid_in_sim_status_bool";
+ field public static final String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
+ field public static final String KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL = "show_signal_strength_in_sim_status_bool";
+ field public static final String KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL = "simplified_network_settings_bool";
+ field public static final String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
+ field public static final String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool";
+ field public static final String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = "support_3gpp_call_forwarding_while_roaming_bool";
+ field public static final String KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL = "support_clir_network_default_bool";
+ field public static final String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
+ field public static final String KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL = "support_emergency_sms_over_ims_bool";
+ field public static final String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
+ field public static final String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
+ field public static final String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool";
+ field public static final String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
+ field public static final String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
+ field public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
+ field public static final String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool";
+ field public static final String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool";
+ field public static final String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int";
+ field public static final String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL = "vvm_cellular_data_required_bool";
+ field public static final String KEY_VVM_CLIENT_PREFIX_STRING = "vvm_client_prefix_string";
+ field public static final String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string";
+ field public static final String KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY = "vvm_disabled_capabilities_string_array";
+ field public static final String KEY_VVM_LEGACY_MODE_ENABLED_BOOL = "vvm_legacy_mode_enabled_bool";
+ field public static final String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int";
+ field public static final String KEY_VVM_PREFETCH_BOOL = "vvm_prefetch_bool";
+ field public static final String KEY_VVM_SSL_ENABLED_BOOL = "vvm_ssl_enabled_bool";
+ field public static final String KEY_VVM_TYPE_STRING = "vvm_type_string";
+ field public static final String KEY_WORLD_PHONE_BOOL = "world_phone_bool";
}
public abstract class CellIdentity implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.CharSequence getOperatorAlphaLong();
- method public java.lang.CharSequence getOperatorAlphaShort();
- method public void writeToParcel(android.os.Parcel, int);
+ method @Nullable public CharSequence getOperatorAlphaLong();
+ method @Nullable public CharSequence getOperatorAlphaShort();
+ method @CallSuper public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentity> CREATOR;
}
@@ -43774,12 +44041,12 @@ package android.telephony {
method public int getBsic();
method public int getCid();
method public int getLac();
- method public deprecated int getMcc();
- method public java.lang.String getMccString();
- method public deprecated int getMnc();
- method public java.lang.String getMncString();
- method public java.lang.String getMobileNetworkOperator();
- method public deprecated int getPsc();
+ method @Deprecated public int getMcc();
+ method public String getMccString();
+ method @Deprecated public int getMnc();
+ method public String getMncString();
+ method @Nullable public String getMobileNetworkOperator();
+ method @Deprecated public int getPsc();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityGsm> CREATOR;
}
@@ -43788,11 +44055,11 @@ package android.telephony {
method public int getBandwidth();
method public int getCi();
method public int getEarfcn();
- method public deprecated int getMcc();
- method public java.lang.String getMccString();
- method public deprecated int getMnc();
- method public java.lang.String getMncString();
- method public java.lang.String getMobileNetworkOperator();
+ method @Deprecated public int getMcc();
+ method public String getMccString();
+ method @Deprecated public int getMnc();
+ method public String getMncString();
+ method @Nullable public String getMobileNetworkOperator();
method public int getPci();
method public int getTac();
method public void writeToParcel(android.os.Parcel, int);
@@ -43801,8 +44068,8 @@ package android.telephony {
public final class CellIdentityNr extends android.telephony.CellIdentity {
method public int getChannelNumber();
- method public java.lang.String getMccString();
- method public java.lang.String getMncString();
+ method public String getMccString();
+ method public String getMncString();
method public int getPci();
method public int getTac();
method public void writeToParcel(android.os.Parcel, int);
@@ -43813,9 +44080,9 @@ package android.telephony {
method public int getCid();
method public int getCpid();
method public int getLac();
- method public java.lang.String getMccString();
- method public java.lang.String getMncString();
- method public java.lang.String getMobileNetworkOperator();
+ method public String getMccString();
+ method public String getMncString();
+ method @Nullable public String getMobileNetworkOperator();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityTdscdma> CREATOR;
}
@@ -43823,11 +44090,11 @@ package android.telephony {
public final class CellIdentityWcdma extends android.telephony.CellIdentity {
method public int getCid();
method public int getLac();
- method public deprecated int getMcc();
- method public java.lang.String getMccString();
- method public deprecated int getMnc();
- method public java.lang.String getMncString();
- method public java.lang.String getMobileNetworkOperator();
+ method @Deprecated public int getMcc();
+ method public String getMccString();
+ method @Deprecated public int getMnc();
+ method public String getMncString();
+ method @Nullable public String getMobileNetworkOperator();
method public int getPsc();
method public int getUarfcn();
method public void writeToParcel(android.os.Parcel, int);
@@ -43889,7 +44156,7 @@ package android.telephony {
}
public abstract class CellSignalStrength {
- method public abstract boolean equals(java.lang.Object);
+ method public abstract boolean equals(Object);
method public abstract int getAsuLevel();
method public abstract int getDbm();
method public abstract int getLevel();
@@ -43981,26 +44248,26 @@ package android.telephony {
}
public class MbmsDownloadSession implements java.lang.AutoCloseable {
- method public void addProgressListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadProgressListener);
- method public void addStatusListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStatusListener);
- method public void cancelDownload(android.telephony.mbms.DownloadRequest);
+ method public void addProgressListener(@NonNull android.telephony.mbms.DownloadRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.DownloadProgressListener);
+ method public void addStatusListener(@NonNull android.telephony.mbms.DownloadRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.DownloadStatusListener);
+ method public void cancelDownload(@NonNull android.telephony.mbms.DownloadRequest);
method public void close();
- method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsDownloadSessionCallback);
- method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsDownloadSessionCallback);
- method public void download(android.telephony.mbms.DownloadRequest);
- method public java.io.File getTempFileRootDirectory();
- method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
- method public void removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener);
- method public void removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener);
+ method public static android.telephony.MbmsDownloadSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsDownloadSessionCallback);
+ method @Nullable public static android.telephony.MbmsDownloadSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, int, @NonNull android.telephony.mbms.MbmsDownloadSessionCallback);
+ method public void download(@NonNull android.telephony.mbms.DownloadRequest);
+ method @Nullable public java.io.File getTempFileRootDirectory();
+ method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
+ method public void removeProgressListener(@NonNull android.telephony.mbms.DownloadRequest, @NonNull android.telephony.mbms.DownloadProgressListener);
+ method public void removeStatusListener(@NonNull android.telephony.mbms.DownloadRequest, @NonNull android.telephony.mbms.DownloadStatusListener);
method public void requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
- method public void requestUpdateFileServices(java.util.List<java.lang.String>);
+ method public void requestUpdateFileServices(@NonNull java.util.List<java.lang.String>);
method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
- method public void setTempFileRootDirectory(java.io.File);
- field public static final java.lang.String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
- field public static final java.lang.String EXTRA_MBMS_COMPLETED_FILE_URI = "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
- field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_REQUEST = "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
- field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_RESULT = "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
- field public static final java.lang.String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
+ method public void setTempFileRootDirectory(@NonNull java.io.File);
+ field public static final String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+ field public static final String EXTRA_MBMS_COMPLETED_FILE_URI = "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
+ field public static final String EXTRA_MBMS_DOWNLOAD_REQUEST = "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
+ field public static final String EXTRA_MBMS_DOWNLOAD_RESULT = "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
+ field public static final String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
field public static final int RESULT_CANCELLED = 2; // 0x2
field public static final int RESULT_DOWNLOAD_FAILURE = 6; // 0x6
field public static final int RESULT_EXPIRED = 3; // 0x3
@@ -44018,36 +44285,36 @@ package android.telephony {
public class MbmsGroupCallSession implements java.lang.AutoCloseable {
method public void close();
- method public static android.telephony.MbmsGroupCallSession create(android.content.Context, int, java.util.concurrent.Executor, android.telephony.mbms.MbmsGroupCallSessionCallback);
- method public static android.telephony.MbmsGroupCallSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsGroupCallSessionCallback);
- method public android.telephony.mbms.GroupCall startGroupCall(long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, java.util.concurrent.Executor, android.telephony.mbms.GroupCallCallback);
+ method @Nullable public static android.telephony.MbmsGroupCallSession create(@NonNull android.content.Context, int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsGroupCallSessionCallback);
+ method public static android.telephony.MbmsGroupCallSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsGroupCallSessionCallback);
+ method @Nullable public android.telephony.mbms.GroupCall startGroupCall(long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.GroupCallCallback);
}
public class MbmsStreamingSession implements java.lang.AutoCloseable {
method public void close();
- method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsStreamingSessionCallback);
- method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsStreamingSessionCallback);
+ method @Nullable public static android.telephony.MbmsStreamingSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, int, @NonNull android.telephony.mbms.MbmsStreamingSessionCallback);
+ method public static android.telephony.MbmsStreamingSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsStreamingSessionCallback);
method public void requestUpdateStreamingServices(java.util.List<java.lang.String>);
- method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, java.util.concurrent.Executor, android.telephony.mbms.StreamingServiceCallback);
- }
-
- public deprecated class NeighboringCellInfo implements android.os.Parcelable {
- ctor public deprecated NeighboringCellInfo();
- ctor public deprecated NeighboringCellInfo(int, int);
- ctor public NeighboringCellInfo(int, java.lang.String, int);
- ctor public NeighboringCellInfo(android.os.Parcel);
- method public int describeContents();
- method public int getCid();
- method public int getLac();
- method public int getNetworkType();
- method public int getPsc();
- method public int getRssi();
- method public deprecated void setCid(int);
- method public deprecated void setRssi(int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telephony.NeighboringCellInfo> CREATOR;
- field public static final int UNKNOWN_CID = -1; // 0xffffffff
- field public static final int UNKNOWN_RSSI = 99; // 0x63
+ method @Nullable public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, @NonNull java.util.concurrent.Executor, android.telephony.mbms.StreamingServiceCallback);
+ }
+
+ @Deprecated public class NeighboringCellInfo implements android.os.Parcelable {
+ ctor @Deprecated public NeighboringCellInfo();
+ ctor @Deprecated public NeighboringCellInfo(int, int);
+ ctor @Deprecated public NeighboringCellInfo(int, String, int);
+ ctor @Deprecated public NeighboringCellInfo(android.os.Parcel);
+ method @Deprecated public int describeContents();
+ method @Deprecated public int getCid();
+ method @Deprecated public int getLac();
+ method @Deprecated public int getNetworkType();
+ method @Deprecated public int getPsc();
+ method @Deprecated public int getRssi();
+ method @Deprecated public void setCid(int);
+ method @Deprecated public void setRssi(int);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.telephony.NeighboringCellInfo> CREATOR;
+ field @Deprecated public static final int UNKNOWN_CID = -1; // 0xffffffff
+ field @Deprecated public static final int UNKNOWN_RSSI = 99; // 0x63
}
public class NetworkScan {
@@ -44080,58 +44347,58 @@ package android.telephony {
public class PhoneNumberFormattingTextWatcher implements android.text.TextWatcher {
ctor public PhoneNumberFormattingTextWatcher();
- ctor public PhoneNumberFormattingTextWatcher(java.lang.String);
- method public synchronized void afterTextChanged(android.text.Editable);
- method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
- method public void onTextChanged(java.lang.CharSequence, int, int, int);
+ ctor public PhoneNumberFormattingTextWatcher(String);
+ method public void afterTextChanged(android.text.Editable);
+ method public void beforeTextChanged(CharSequence, int, int, int);
+ method public void onTextChanged(CharSequence, int, int, int);
}
public class PhoneNumberUtils {
ctor public PhoneNumberUtils();
method public static void addTtsSpan(android.text.Spannable, int, int);
- method public static deprecated java.lang.String calledPartyBCDFragmentToString(byte[], int, int);
- method public static java.lang.String calledPartyBCDFragmentToString(byte[], int, int, int);
- method public static deprecated java.lang.String calledPartyBCDToString(byte[], int, int);
- method public static java.lang.String calledPartyBCDToString(byte[], int, int, int);
- method public static boolean compare(java.lang.String, java.lang.String);
- method public static boolean compare(android.content.Context, java.lang.String, java.lang.String);
- method public static java.lang.String convertKeypadLettersToDigits(java.lang.String);
- method public static android.text.style.TtsSpan createTtsSpan(java.lang.String);
- method public static java.lang.CharSequence createTtsSpannable(java.lang.CharSequence);
- method public static java.lang.String extractNetworkPortion(java.lang.String);
- method public static java.lang.String extractPostDialPortion(java.lang.String);
- method public static deprecated void formatJapaneseNumber(android.text.Editable);
- method public static deprecated void formatNanpNumber(android.text.Editable);
- method public static deprecated java.lang.String formatNumber(java.lang.String);
- method public static deprecated void formatNumber(android.text.Editable, int);
- method public static java.lang.String formatNumber(java.lang.String, java.lang.String);
- method public static java.lang.String formatNumber(java.lang.String, java.lang.String, java.lang.String);
- method public static java.lang.String formatNumberToE164(java.lang.String, java.lang.String);
- method public static java.lang.String formatNumberToRFC3966(java.lang.String, java.lang.String);
- method public static deprecated int getFormatTypeForLocale(java.util.Locale);
- method public static java.lang.String getNumberFromIntent(android.content.Intent, android.content.Context);
- method public static java.lang.String getStrippedReversed(java.lang.String);
+ method @Deprecated public static String calledPartyBCDFragmentToString(byte[], int, int);
+ method public static String calledPartyBCDFragmentToString(byte[], int, int, int);
+ method @Deprecated public static String calledPartyBCDToString(byte[], int, int);
+ method public static String calledPartyBCDToString(byte[], int, int, int);
+ method public static boolean compare(String, String);
+ method public static boolean compare(android.content.Context, String, String);
+ method public static String convertKeypadLettersToDigits(String);
+ method public static android.text.style.TtsSpan createTtsSpan(String);
+ method public static CharSequence createTtsSpannable(CharSequence);
+ method public static String extractNetworkPortion(String);
+ method public static String extractPostDialPortion(String);
+ method @Deprecated public static void formatJapaneseNumber(android.text.Editable);
+ method @Deprecated public static void formatNanpNumber(android.text.Editable);
+ method @Deprecated public static String formatNumber(String);
+ method @Deprecated public static void formatNumber(android.text.Editable, int);
+ method public static String formatNumber(String, String);
+ method public static String formatNumber(String, String, String);
+ method public static String formatNumberToE164(String, String);
+ method public static String formatNumberToRFC3966(String, String);
+ method @Deprecated public static int getFormatTypeForLocale(java.util.Locale);
+ method public static String getNumberFromIntent(android.content.Intent, android.content.Context);
+ method public static String getStrippedReversed(String);
method public static final boolean is12Key(char);
method public static final boolean isDialable(char);
- method public static deprecated boolean isEmergencyNumber(java.lang.String);
- method public static boolean isGlobalPhoneNumber(java.lang.String);
+ method @Deprecated public static boolean isEmergencyNumber(String);
+ method public static boolean isGlobalPhoneNumber(String);
method public static boolean isISODigit(char);
- method public static deprecated boolean isLocalEmergencyNumber(android.content.Context, java.lang.String);
+ method @Deprecated public static boolean isLocalEmergencyNumber(android.content.Context, String);
method public static final boolean isNonSeparator(char);
method public static final boolean isReallyDialable(char);
method public static final boolean isStartsPostDial(char);
- method public static boolean isVoiceMailNumber(java.lang.String);
- method public static boolean isWellFormedSmsAddress(java.lang.String);
- method public static byte[] networkPortionToCalledPartyBCD(java.lang.String);
- method public static byte[] networkPortionToCalledPartyBCDWithLength(java.lang.String);
- method public static java.lang.String normalizeNumber(java.lang.String);
- method public static deprecated byte[] numberToCalledPartyBCD(java.lang.String);
- method public static byte[] numberToCalledPartyBCD(java.lang.String, int);
- method public static java.lang.String replaceUnicodeDigits(java.lang.String);
- method public static java.lang.String stringFromStringAndTOA(java.lang.String, int);
- method public static java.lang.String stripSeparators(java.lang.String);
- method public static java.lang.String toCallerIDMinMatch(java.lang.String);
- method public static int toaFromString(java.lang.String);
+ method public static boolean isVoiceMailNumber(String);
+ method public static boolean isWellFormedSmsAddress(String);
+ method public static byte[] networkPortionToCalledPartyBCD(String);
+ method public static byte[] networkPortionToCalledPartyBCDWithLength(String);
+ method public static String normalizeNumber(String);
+ method @Deprecated public static byte[] numberToCalledPartyBCD(String);
+ method public static byte[] numberToCalledPartyBCD(String, int);
+ method public static String replaceUnicodeDigits(String);
+ method public static String stringFromStringAndTOA(String, int);
+ method public static String stripSeparators(String);
+ method public static String toCallerIDMinMatch(String);
+ method public static int toaFromString(String);
field public static final int BCD_EXTENDED_TYPE_CALLED_PARTY = 2; // 0x2
field public static final int BCD_EXTENDED_TYPE_EF_ADN = 1; // 0x1
field public static final int FORMAT_JAPAN = 2; // 0x2
@@ -44146,9 +44413,9 @@ package android.telephony {
public class PhoneStateListener {
ctor public PhoneStateListener();
- ctor public PhoneStateListener(java.util.concurrent.Executor);
+ ctor public PhoneStateListener(@NonNull java.util.concurrent.Executor);
method public void onCallForwardingIndicatorChanged(boolean);
- method public void onCallStateChanged(int, java.lang.String);
+ method public void onCallStateChanged(int, String);
method public void onCellInfoChanged(java.util.List<android.telephony.CellInfo>);
method public void onCellLocationChanged(android.telephony.CellLocation);
method public void onDataActivity(int);
@@ -44156,7 +44423,7 @@ package android.telephony {
method public void onDataConnectionStateChanged(int, int);
method public void onMessageWaitingIndicatorChanged(boolean);
method public void onServiceStateChanged(android.telephony.ServiceState);
- method public deprecated void onSignalStrengthChanged(int);
+ method @Deprecated public void onSignalStrengthChanged(int);
method public void onSignalStrengthsChanged(android.telephony.SignalStrength);
method public void onUserMobileDataStateChanged(boolean);
field public static final int LISTEN_CALL_FORWARDING_INDICATOR = 8; // 0x8
@@ -44169,7 +44436,7 @@ package android.telephony {
field public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 4; // 0x4
field public static final int LISTEN_NONE = 0; // 0x0
field public static final int LISTEN_SERVICE_STATE = 1; // 0x1
- field public static final deprecated int LISTEN_SIGNAL_STRENGTH = 2; // 0x2
+ field @Deprecated public static final int LISTEN_SIGNAL_STRENGTH = 2; // 0x2
field public static final int LISTEN_SIGNAL_STRENGTHS = 256; // 0x100
field public static final int LISTEN_USER_MOBILE_DATA_STATE = 524288; // 0x80000
}
@@ -44196,13 +44463,13 @@ package android.telephony {
method public int getChannelNumber();
method public int getDuplexMode();
method public boolean getIsManualSelection();
- method public java.lang.String getOperatorAlphaLong();
- method public java.lang.String getOperatorAlphaShort();
- method public java.lang.String getOperatorNumeric();
+ method public String getOperatorAlphaLong();
+ method public String getOperatorAlphaShort();
+ method public String getOperatorNumeric();
method public boolean getRoaming();
method public int getState();
method public void setIsManualSelection(boolean);
- method public void setOperatorName(java.lang.String, java.lang.String, java.lang.String);
+ method public void setOperatorName(String, String, String);
method public void setRoaming(boolean);
method public void setState(int);
method public void setStateOff();
@@ -44223,6 +44490,7 @@ package android.telephony {
method public int describeContents();
method public int getCdmaDbm();
method public int getCdmaEcio();
+ method @NonNull public java.util.List<android.telephony.CellSignalStrength> getCellSignalStrengths();
method public int getEvdoDbm();
method public int getEvdoEcio();
method public int getEvdoSnr();
@@ -44235,53 +44503,53 @@ package android.telephony {
}
public final class SmsManager {
- method public java.lang.String createAppSpecificSmsToken(android.app.PendingIntent);
- method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
- method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
+ method public String createAppSpecificSmsToken(android.app.PendingIntent);
+ method public java.util.ArrayList<java.lang.String> divideMessage(String);
+ method public void downloadMultimediaMessage(android.content.Context, String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
method public android.os.Bundle getCarrierConfigValues();
method public static android.telephony.SmsManager getDefault();
method public static int getDefaultSmsSubscriptionId();
method public static android.telephony.SmsManager getSmsManagerForSubscriptionId(int);
method public int getSubscriptionId();
- method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent);
- method public void sendDataMessage(java.lang.String, java.lang.String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
- method public void sendMultimediaMessage(android.content.Context, android.net.Uri, java.lang.String, android.os.Bundle, android.app.PendingIntent);
- method public void sendMultipartTextMessage(java.lang.String, java.lang.String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
- method public void sendTextMessage(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
- method public void sendTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
- field public static final java.lang.String EXTRA_MMS_DATA = "android.telephony.extra.MMS_DATA";
- field public static final java.lang.String EXTRA_MMS_HTTP_STATUS = "android.telephony.extra.MMS_HTTP_STATUS";
- field public static final java.lang.String MMS_CONFIG_ALIAS_ENABLED = "aliasEnabled";
- field public static final java.lang.String MMS_CONFIG_ALIAS_MAX_CHARS = "aliasMaxChars";
- field public static final java.lang.String MMS_CONFIG_ALIAS_MIN_CHARS = "aliasMinChars";
- field public static final java.lang.String MMS_CONFIG_ALLOW_ATTACH_AUDIO = "allowAttachAudio";
- field public static final java.lang.String MMS_CONFIG_APPEND_TRANSACTION_ID = "enabledTransID";
- field public static final java.lang.String MMS_CONFIG_EMAIL_GATEWAY_NUMBER = "emailGatewayNumber";
- field public static final java.lang.String MMS_CONFIG_GROUP_MMS_ENABLED = "enableGroupMms";
- field public static final java.lang.String MMS_CONFIG_HTTP_PARAMS = "httpParams";
- field public static final java.lang.String MMS_CONFIG_HTTP_SOCKET_TIMEOUT = "httpSocketTimeout";
- field public static final java.lang.String MMS_CONFIG_MAX_IMAGE_HEIGHT = "maxImageHeight";
- field public static final java.lang.String MMS_CONFIG_MAX_IMAGE_WIDTH = "maxImageWidth";
- field public static final java.lang.String MMS_CONFIG_MAX_MESSAGE_SIZE = "maxMessageSize";
- field public static final java.lang.String MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE = "maxMessageTextSize";
- field public static final java.lang.String MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED = "enableMMSDeliveryReports";
- field public static final java.lang.String MMS_CONFIG_MMS_ENABLED = "enabledMMS";
- field public static final java.lang.String MMS_CONFIG_MMS_READ_REPORT_ENABLED = "enableMMSReadReports";
- field public static final java.lang.String MMS_CONFIG_MULTIPART_SMS_ENABLED = "enableMultipartSMS";
- field public static final java.lang.String MMS_CONFIG_NAI_SUFFIX = "naiSuffix";
- field public static final java.lang.String MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED = "enabledNotifyWapMMSC";
- field public static final java.lang.String MMS_CONFIG_RECIPIENT_LIMIT = "recipientLimit";
- field public static final java.lang.String MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES = "sendMultipartSmsAsSeparateMessages";
- field public static final java.lang.String MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS = "config_cellBroadcastAppLinks";
- field public static final java.lang.String MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED = "enableSMSDeliveryReports";
- field public static final java.lang.String MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD = "smsToMmsTextLengthThreshold";
- field public static final java.lang.String MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD = "smsToMmsTextThreshold";
- field public static final java.lang.String MMS_CONFIG_SUBJECT_MAX_LENGTH = "maxSubjectLength";
- field public static final java.lang.String MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER = "supportHttpCharsetHeader";
- field public static final java.lang.String MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION = "supportMmsContentDisposition";
- field public static final java.lang.String MMS_CONFIG_UA_PROF_TAG_NAME = "uaProfTagName";
- field public static final java.lang.String MMS_CONFIG_UA_PROF_URL = "uaProfUrl";
- field public static final java.lang.String MMS_CONFIG_USER_AGENT = "userAgent";
+ method public void injectSmsPdu(byte[], String, android.app.PendingIntent);
+ method public void sendDataMessage(String, String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
+ method public void sendMultimediaMessage(android.content.Context, android.net.Uri, String, android.os.Bundle, android.app.PendingIntent);
+ method public void sendMultipartTextMessage(String, String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
+ method public void sendTextMessage(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
+ method @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.SEND_SMS}) public void sendTextMessageWithoutPersisting(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
+ field public static final String EXTRA_MMS_DATA = "android.telephony.extra.MMS_DATA";
+ field public static final String EXTRA_MMS_HTTP_STATUS = "android.telephony.extra.MMS_HTTP_STATUS";
+ field public static final String MMS_CONFIG_ALIAS_ENABLED = "aliasEnabled";
+ field public static final String MMS_CONFIG_ALIAS_MAX_CHARS = "aliasMaxChars";
+ field public static final String MMS_CONFIG_ALIAS_MIN_CHARS = "aliasMinChars";
+ field public static final String MMS_CONFIG_ALLOW_ATTACH_AUDIO = "allowAttachAudio";
+ field public static final String MMS_CONFIG_APPEND_TRANSACTION_ID = "enabledTransID";
+ field public static final String MMS_CONFIG_EMAIL_GATEWAY_NUMBER = "emailGatewayNumber";
+ field public static final String MMS_CONFIG_GROUP_MMS_ENABLED = "enableGroupMms";
+ field public static final String MMS_CONFIG_HTTP_PARAMS = "httpParams";
+ field public static final String MMS_CONFIG_HTTP_SOCKET_TIMEOUT = "httpSocketTimeout";
+ field public static final String MMS_CONFIG_MAX_IMAGE_HEIGHT = "maxImageHeight";
+ field public static final String MMS_CONFIG_MAX_IMAGE_WIDTH = "maxImageWidth";
+ field public static final String MMS_CONFIG_MAX_MESSAGE_SIZE = "maxMessageSize";
+ field public static final String MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE = "maxMessageTextSize";
+ field public static final String MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED = "enableMMSDeliveryReports";
+ field public static final String MMS_CONFIG_MMS_ENABLED = "enabledMMS";
+ field public static final String MMS_CONFIG_MMS_READ_REPORT_ENABLED = "enableMMSReadReports";
+ field public static final String MMS_CONFIG_MULTIPART_SMS_ENABLED = "enableMultipartSMS";
+ field public static final String MMS_CONFIG_NAI_SUFFIX = "naiSuffix";
+ field public static final String MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED = "enabledNotifyWapMMSC";
+ field public static final String MMS_CONFIG_RECIPIENT_LIMIT = "recipientLimit";
+ field public static final String MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES = "sendMultipartSmsAsSeparateMessages";
+ field public static final String MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS = "config_cellBroadcastAppLinks";
+ field public static final String MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED = "enableSMSDeliveryReports";
+ field public static final String MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD = "smsToMmsTextLengthThreshold";
+ field public static final String MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD = "smsToMmsTextThreshold";
+ field public static final String MMS_CONFIG_SUBJECT_MAX_LENGTH = "maxSubjectLength";
+ field public static final String MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER = "supportHttpCharsetHeader";
+ field public static final String MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION = "supportMmsContentDisposition";
+ field public static final String MMS_CONFIG_UA_PROF_TAG_NAME = "uaProfTagName";
+ field public static final String MMS_CONFIG_UA_PROF_URL = "uaProfUrl";
+ field public static final String MMS_CONFIG_USER_AGENT = "userAgent";
field public static final int MMS_ERROR_CONFIGURATION_ERROR = 7; // 0x7
field public static final int MMS_ERROR_HTTP_FAILURE = 4; // 0x4
field public static final int MMS_ERROR_INVALID_APN = 2; // 0x2
@@ -44305,29 +44573,29 @@ package android.telephony {
}
public class SmsMessage {
- method public static int[] calculateLength(java.lang.CharSequence, boolean);
- method public static int[] calculateLength(java.lang.String, boolean);
- method public static deprecated android.telephony.SmsMessage createFromPdu(byte[]);
- method public static android.telephony.SmsMessage createFromPdu(byte[], java.lang.String);
- method public java.lang.String getDisplayMessageBody();
- method public java.lang.String getDisplayOriginatingAddress();
- method public java.lang.String getEmailBody();
- method public java.lang.String getEmailFrom();
+ method public static int[] calculateLength(CharSequence, boolean);
+ method public static int[] calculateLength(String, boolean);
+ method @Deprecated public static android.telephony.SmsMessage createFromPdu(byte[]);
+ method public static android.telephony.SmsMessage createFromPdu(byte[], String);
+ method public String getDisplayMessageBody();
+ method public String getDisplayOriginatingAddress();
+ method public String getEmailBody();
+ method public String getEmailFrom();
method public int getIndexOnIcc();
- method public deprecated int getIndexOnSim();
- method public java.lang.String getMessageBody();
+ method @Deprecated public int getIndexOnSim();
+ method public String getMessageBody();
method public android.telephony.SmsMessage.MessageClass getMessageClass();
- method public java.lang.String getOriginatingAddress();
+ method @Nullable public String getOriginatingAddress();
method public byte[] getPdu();
method public int getProtocolIdentifier();
- method public java.lang.String getPseudoSubject();
- method public java.lang.String getServiceCenterAddress();
+ method public String getPseudoSubject();
+ method public String getServiceCenterAddress();
method public int getStatus();
method public int getStatusOnIcc();
- method public deprecated int getStatusOnSim();
- method public static android.telephony.SmsMessage.SubmitPdu getSubmitPdu(java.lang.String, java.lang.String, java.lang.String, boolean);
- method public static android.telephony.SmsMessage.SubmitPdu getSubmitPdu(java.lang.String, java.lang.String, short, byte[], boolean);
- method public static int getTPLayerLengthForPDU(java.lang.String);
+ method @Deprecated public int getStatusOnSim();
+ method public static android.telephony.SmsMessage.SubmitPdu getSubmitPdu(String, String, String, boolean);
+ method public static android.telephony.SmsMessage.SubmitPdu getSubmitPdu(String, String, short, byte[], boolean);
+ method public static int getTPLayerLengthForPDU(String);
method public long getTimestampMillis();
method public byte[] getUserData();
method public boolean isCphsMwiMessage();
@@ -44342,17 +44610,15 @@ package android.telephony {
field public static final int ENCODING_7BIT = 1; // 0x1
field public static final int ENCODING_8BIT = 2; // 0x2
field public static final int ENCODING_UNKNOWN = 0; // 0x0
- field public static final java.lang.String FORMAT_3GPP = "3gpp";
- field public static final java.lang.String FORMAT_3GPP2 = "3gpp2";
+ field public static final String FORMAT_3GPP = "3gpp";
+ field public static final String FORMAT_3GPP2 = "3gpp2";
field public static final int MAX_USER_DATA_BYTES = 140; // 0x8c
field public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134; // 0x86
field public static final int MAX_USER_DATA_SEPTETS = 160; // 0xa0
field public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; // 0x99
}
- public static final class SmsMessage.MessageClass extends java.lang.Enum {
- method public static android.telephony.SmsMessage.MessageClass valueOf(java.lang.String);
- method public static final android.telephony.SmsMessage.MessageClass[] values();
+ public enum SmsMessage.MessageClass {
enum_constant public static final android.telephony.SmsMessage.MessageClass CLASS_0;
enum_constant public static final android.telephony.SmsMessage.MessageClass CLASS_1;
enum_constant public static final android.telephony.SmsMessage.MessageClass CLASS_2;
@@ -44369,18 +44635,18 @@ package android.telephony {
method public android.graphics.Bitmap createIconBitmap(android.content.Context);
method public int describeContents();
method public int getCarrierId();
- method public java.lang.CharSequence getCarrierName();
- method public java.lang.String getCountryIso();
+ method public CharSequence getCarrierName();
+ method public String getCountryIso();
method public int getDataRoaming();
- method public java.lang.CharSequence getDisplayName();
- method public java.lang.String getGroupUuid();
- method public java.lang.String getIccId();
+ method public CharSequence getDisplayName();
+ method public String getGroupUuid();
+ method public String getIccId();
method public int getIconTint();
- method public deprecated int getMcc();
- method public java.lang.String getMccString();
- method public deprecated int getMnc();
- method public java.lang.String getMncString();
- method public java.lang.String getNumber();
+ method @Deprecated public int getMcc();
+ method public String getMccString();
+ method @Deprecated public int getMnc();
+ method public String getMncString();
+ method public String getNumber();
method public int getSimSlotIndex();
method public int getSubscriptionId();
method public boolean isEmbedded();
@@ -44390,47 +44656,47 @@ package android.telephony {
}
public class SubscriptionManager {
- method public void addOnOpportunisticSubscriptionsChangedListener(java.util.concurrent.Executor, android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
+ method public void addOnOpportunisticSubscriptionsChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
method public void addOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
method public boolean canManageSubscription(android.telephony.SubscriptionInfo);
- method public static deprecated android.telephony.SubscriptionManager from(android.content.Context);
+ method @Deprecated public static android.telephony.SubscriptionManager from(android.content.Context);
method public java.util.List<android.telephony.SubscriptionInfo> getAccessibleSubscriptionInfoList();
- method public android.telephony.SubscriptionInfo getActiveSubscriptionInfo(int);
- method public int getActiveSubscriptionInfoCount();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfo(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getActiveSubscriptionInfoCount();
method public int getActiveSubscriptionInfoCountMax();
- method public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int);
- method public java.util.List<android.telephony.SubscriptionInfo> getActiveSubscriptionInfoList();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telephony.SubscriptionInfo> getActiveSubscriptionInfoList();
method public static int getDefaultDataSubscriptionId();
method public static int getDefaultSmsSubscriptionId();
method public static int getDefaultSubscriptionId();
method public static int getDefaultVoiceSubscriptionId();
- method public java.util.List<android.telephony.SubscriptionInfo> getOpportunisticSubscriptions();
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telephony.SubscriptionInfo> getOpportunisticSubscriptions();
method public static int getSlotIndex(int);
- method public int[] getSubscriptionIds(int);
- method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
- method public java.util.List<android.telephony.SubscriptionInfo> getSubscriptionsInGroup(int);
- method public boolean isActiveSubscriptionId(int);
+ method @Nullable public int[] getSubscriptionIds(int);
+ method @NonNull public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telephony.SubscriptionInfo> getSubscriptionsInGroup(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isActiveSubscriptionId(int);
method public boolean isNetworkRoaming(int);
method public static boolean isUsableSubscriptionId(int);
method public static boolean isValidSubscriptionId(int);
method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
- method public boolean removeSubscriptionsFromGroup(int[]);
- method public boolean setMetered(boolean, int);
- method public boolean setOpportunistic(boolean, int);
- method public java.lang.String setSubscriptionGroup(int[]);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean removeSubscriptionsFromGroup(@NonNull int[]);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setMetered(boolean, int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunistic(boolean, int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String setSubscriptionGroup(@NonNull int[]);
method public void setSubscriptionOverrideCongested(int, boolean, long);
method public void setSubscriptionOverrideUnmetered(int, boolean, long);
- method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>);
- method public void switchToSubscription(int, android.app.PendingIntent);
- field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
- field public static final java.lang.String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS";
- field public static final java.lang.String ACTION_REFRESH_SUBSCRIPTION_PLANS = "android.telephony.action.REFRESH_SUBSCRIPTION_PLANS";
+ method public void setSubscriptionPlans(int, @NonNull java.util.List<android.telephony.SubscriptionPlan>);
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, android.app.PendingIntent);
+ field public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+ field public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
+ field public static final String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS";
+ field public static final String ACTION_REFRESH_SUBSCRIPTION_PLANS = "android.telephony.action.REFRESH_SUBSCRIPTION_PLANS";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
field public static final int DATA_ROAMING_ENABLE = 1; // 0x1
field public static final int DEFAULT_SUBSCRIPTION_ID = 2147483647; // 0x7fffffff
- field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
+ field public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
field public static final int INVALID_SIM_SLOT_INDEX = -1; // 0xffffffff
field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff
}
@@ -44452,8 +44718,8 @@ package android.telephony {
method public long getDataLimitBytes();
method public long getDataUsageBytes();
method public long getDataUsageTime();
- method public java.lang.CharSequence getSummary();
- method public java.lang.CharSequence getTitle();
+ method @Nullable public CharSequence getSummary();
+ method @Nullable public CharSequence getTitle();
method public void writeToParcel(android.os.Parcel, int);
field public static final long BYTES_UNKNOWN = -1L; // 0xffffffffffffffffL
field public static final long BYTES_UNLIMITED = 9223372036854775807L; // 0x7fffffffffffffffL
@@ -44471,114 +44737,114 @@ package android.telephony {
method public static android.telephony.SubscriptionPlan.Builder createRecurring(java.time.ZonedDateTime, java.time.Period);
method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
- method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
- method public android.telephony.SubscriptionPlan.Builder setTitle(java.lang.CharSequence);
+ method public android.telephony.SubscriptionPlan.Builder setSummary(@Nullable CharSequence);
+ method public android.telephony.SubscriptionPlan.Builder setTitle(@Nullable CharSequence);
}
public class TelephonyManager {
method public boolean canChangeDtmfToneLength();
- method public android.telephony.TelephonyManager createForPhoneAccountHandle(android.telecom.PhoneAccountHandle);
+ method @Nullable public android.telephony.TelephonyManager createForPhoneAccountHandle(android.telecom.PhoneAccountHandle);
method public android.telephony.TelephonyManager createForSubscriptionId(int);
- method public java.util.List<android.telephony.CellInfo> getAllCellInfo();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public java.util.List<android.telephony.CellInfo> getAllCellInfo();
method public int getCallState();
- method public android.os.PersistableBundle getCarrierConfig();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @WorkerThread public android.os.PersistableBundle getCarrierConfig();
method public int getCarrierIdFromSimMccMnc();
- method public deprecated android.telephony.CellLocation getCellLocation();
- method public java.util.Map<java.lang.Integer, java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList();
- method public java.util.Map<java.lang.Integer, java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList(int);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.telephony.CellLocation getCellLocation();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList(int);
method public int getDataActivity();
- method public int getDataNetworkType();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getDataNetworkType();
method public int getDataState();
- method public deprecated java.lang.String getDeviceId();
- method public deprecated java.lang.String getDeviceId(int);
- method public java.lang.String getDeviceSoftwareVersion();
- method public java.lang.String[] getForbiddenPlmns();
- method public java.lang.String getGroupIdLevel1();
- method public java.lang.String getIccAuthentication(int, int, java.lang.String);
- method public java.lang.String getImei();
- method public java.lang.String getImei(int);
- method public java.lang.String getLine1Number();
- method public java.lang.String getManufacturerCode();
- method public java.lang.String getManufacturerCode(int);
- method public java.lang.String getMeid();
- method public java.lang.String getMeid(int);
- method public java.lang.String getMmsUAProfUrl();
- method public java.lang.String getMmsUserAgent();
- method public java.lang.String getNai();
- method public java.lang.String getNetworkCountryIso();
- method public java.lang.String getNetworkOperator();
- method public java.lang.String getNetworkOperatorName();
- method public java.lang.String getNetworkSpecifier();
+ method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId();
+ method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String[] getForbiddenPlmns();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getGroupIdLevel1();
+ method public String getIccAuthentication(int, int, String);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getImei();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getImei(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_SMS, android.Manifest.permission.READ_PHONE_NUMBERS}) public String getLine1Number();
+ method public String getManufacturerCode();
+ method public String getManufacturerCode(int);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getMeid();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getMeid(int);
+ method public String getMmsUAProfUrl();
+ method public String getMmsUserAgent();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getNai();
+ method public String getNetworkCountryIso();
+ method public String getNetworkOperator();
+ method public String getNetworkOperatorName();
+ method public String getNetworkSpecifier();
method public int getNetworkType();
method public int getPhoneCount();
method public int getPhoneType();
method public int getPreferredOpportunisticDataSubscription();
- method public android.telephony.ServiceState getServiceState();
- method public android.telephony.SignalStrength getSignalStrength();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telephony.ServiceState getServiceState();
+ method @Nullable public android.telephony.SignalStrength getSignalStrength();
method public int getSimCarrierId();
- method public java.lang.CharSequence getSimCarrierIdName();
- method public java.lang.String getSimCountryIso();
- method public java.lang.String getSimOperator();
- method public java.lang.String getSimOperatorName();
+ method @Nullable public CharSequence getSimCarrierIdName();
+ method public String getSimCountryIso();
+ method public String getSimOperator();
+ method public String getSimOperatorName();
method public int getSimPreciseCarrierId();
- method public java.lang.CharSequence getSimPreciseCarrierIdName();
- method public java.lang.String getSimSerialNumber();
+ method @Nullable public CharSequence getSimPreciseCarrierIdName();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSimSerialNumber();
method public int getSimState();
method public int getSimState(int);
- method public java.lang.String getSubscriberId();
- method public java.lang.String getTypeAllocationCode();
- method public java.lang.String getTypeAllocationCode(int);
- method public java.lang.String getVisualVoicemailPackageName();
- method public java.lang.String getVoiceMailAlphaTag();
- method public java.lang.String getVoiceMailNumber();
- method public int getVoiceNetworkType();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId();
+ method public String getTypeAllocationCode();
+ method public String getTypeAllocationCode(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getVoiceNetworkType();
method public android.net.Uri getVoicemailRingtoneUri(android.telecom.PhoneAccountHandle);
method public boolean hasCarrierPrivileges();
method public boolean hasIccCard();
method public boolean iccCloseLogicalChannel(int);
- method public byte[] iccExchangeSimIO(int, int, int, int, int, java.lang.String);
- method public deprecated android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String);
- method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String, int);
- method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String);
- method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String);
+ method public byte[] iccExchangeSimIO(int, int, int, int, int, String);
+ method @Deprecated public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(String);
+ method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(String, int);
+ method public String iccTransmitApduBasicChannel(int, int, int, int, int, String);
+ method public String iccTransmitApduLogicalChannel(int, int, int, int, int, int, String);
method public boolean isConcurrentVoiceAndDataSupported();
- method public boolean isCurrentEmergencyNumber(java.lang.String);
- method public boolean isDataEnabled();
- method public boolean isDataRoamingEnabled();
+ method public boolean isCurrentEmergencyNumber(@NonNull String);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean isDataEnabled();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataRoamingEnabled();
method public boolean isHearingAidCompatibilitySupported();
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
- method public deprecated boolean isTtyModeSupported();
+ method @Deprecated public boolean isTtyModeSupported();
method public boolean isVoiceCapable();
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
- method public void requestCellInfoUpdate(java.util.concurrent.Executor, android.telephony.TelephonyManager.CellInfoCallback);
- method public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
- method public void sendDialerSpecialCode(java.lang.String);
- method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
- method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
- method public void sendVisualVoicemailSms(java.lang.String, int, java.lang.String, android.app.PendingIntent);
- method public void setDataEnabled(boolean);
- method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
- method public void setNetworkSelectionModeAutomatic();
- method public boolean setNetworkSelectionModeManual(java.lang.String, boolean);
- method public boolean setOperatorBrandOverride(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public void requestCellInfoUpdate(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
+ method public void sendDialerSpecialCode(String);
+ method public String sendEnvelopeWithStatus(String);
+ method @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void sendUssdRequest(String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
+ method public void sendVisualVoicemailSms(String, int, String, android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(boolean);
+ method public boolean setLine1NumberForDisplay(String, String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setNetworkSelectionModeAutomatic();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setNetworkSelectionModeManual(String, boolean);
+ method public boolean setOperatorBrandOverride(String);
method public boolean setPreferredNetworkTypeToGlobal();
method public boolean setPreferredOpportunisticDataSubscription(int);
method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings);
- method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
- method public deprecated void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
- method public deprecated void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
+ method public boolean setVoiceMailNumber(String, String);
+ method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
+ method @Deprecated public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
method public boolean updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>);
- field public static final java.lang.String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
- field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
- field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE";
- field public static final java.lang.String ACTION_SECRET_CODE = "android.telephony.action.SECRET_CODE";
- field public static final java.lang.String ACTION_SHOW_VOICEMAIL_NOTIFICATION = "android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION";
- field public static final java.lang.String ACTION_SMS_APP_SERVICE = "android.telephony.action.SMS_APP_SERVICE";
- field public static final java.lang.String ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED";
- field public static final java.lang.String ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED";
+ field public static final String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
+ field @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static final String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
+ field public static final String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE";
+ field public static final String ACTION_SECRET_CODE = "android.telephony.action.SECRET_CODE";
+ field public static final String ACTION_SHOW_VOICEMAIL_NOTIFICATION = "android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION";
+ field public static final String ACTION_SMS_APP_SERVICE = "android.telephony.action.SMS_APP_SERVICE";
+ field public static final String ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED";
+ field public static final String ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED";
field public static final int APPTYPE_CSIM = 4; // 0x4
field public static final int APPTYPE_ISIM = 5; // 0x5
field public static final int APPTYPE_RUIM = 3; // 0x3
@@ -44602,24 +44868,25 @@ package android.telephony {
field public static final int DATA_CONNECTING = 1; // 0x1
field public static final int DATA_DISCONNECTED = 0; // 0x0
field public static final int DATA_SUSPENDED = 3; // 0x3
- field public static final java.lang.String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
- field public static final java.lang.String EXTRA_CARRIER_ID = "android.telephony.extra.CARRIER_ID";
- field public static final java.lang.String EXTRA_CARRIER_NAME = "android.telephony.extra.CARRIER_NAME";
- field public static final java.lang.String EXTRA_HIDE_PUBLIC_SETTINGS = "android.telephony.extra.HIDE_PUBLIC_SETTINGS";
- field public static final java.lang.String EXTRA_INCOMING_NUMBER = "incoming_number";
- field public static final java.lang.String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
- field public static final java.lang.String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
- field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
- field public static final java.lang.String EXTRA_PRECISE_CARRIER_ID = "android.telephony.extra.PRECISE_CARRIER_ID";
- field public static final java.lang.String EXTRA_PRECISE_CARRIER_NAME = "android.telephony.extra.PRECISE_CARRIER_NAME";
- field public static final java.lang.String EXTRA_STATE = "state";
- field public static final java.lang.String EXTRA_STATE_IDLE;
- field public static final java.lang.String EXTRA_STATE_OFFHOOK;
- field public static final java.lang.String EXTRA_STATE_RINGING;
- field public static final java.lang.String EXTRA_SUBSCRIPTION_ID = "android.telephony.extra.SUBSCRIPTION_ID";
- field public static final java.lang.String EXTRA_VOICEMAIL_NUMBER = "android.telephony.extra.VOICEMAIL_NUMBER";
- field public static final java.lang.String METADATA_HIDE_VOICEMAIL_SETTINGS_MENU = "android.telephony.HIDE_VOICEMAIL_SETTINGS_MENU";
+ field public static final int DATA_UNKNOWN = -1; // 0xffffffff
+ field public static final String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
+ field public static final String EXTRA_CARRIER_ID = "android.telephony.extra.CARRIER_ID";
+ field public static final String EXTRA_CARRIER_NAME = "android.telephony.extra.CARRIER_NAME";
+ field public static final String EXTRA_HIDE_PUBLIC_SETTINGS = "android.telephony.extra.HIDE_PUBLIC_SETTINGS";
+ field public static final String EXTRA_INCOMING_NUMBER = "incoming_number";
+ field public static final String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
+ field public static final String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
+ field public static final String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
+ field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final String EXTRA_PRECISE_CARRIER_ID = "android.telephony.extra.PRECISE_CARRIER_ID";
+ field public static final String EXTRA_PRECISE_CARRIER_NAME = "android.telephony.extra.PRECISE_CARRIER_NAME";
+ field public static final String EXTRA_STATE = "state";
+ field public static final String EXTRA_STATE_IDLE;
+ field public static final String EXTRA_STATE_OFFHOOK;
+ field public static final String EXTRA_STATE_RINGING;
+ field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.extra.SUBSCRIPTION_ID";
+ field public static final String EXTRA_VOICEMAIL_NUMBER = "android.telephony.extra.VOICEMAIL_NUMBER";
+ field public static final String METADATA_HIDE_VOICEMAIL_SETTINGS_MENU = "android.telephony.HIDE_VOICEMAIL_SETTINGS_MENU";
field public static final int NETWORK_TYPE_1xRTT = 7; // 0x7
field public static final int NETWORK_TYPE_CDMA = 4; // 0x4
field public static final int NETWORK_TYPE_EDGE = 2; // 0x2
@@ -44657,26 +44924,29 @@ package android.telephony {
field public static final int UNKNOWN_CARRIER_ID = -1; // 0xffffffff
field public static final int USSD_ERROR_SERVICE_UNAVAIL = -2; // 0xfffffffe
field public static final int USSD_RETURN_FAILURE = -1; // 0xffffffff
- field public static final java.lang.String VVM_TYPE_CVVM = "vvm_type_cvvm";
- field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp";
+ field public static final String VVM_TYPE_CVVM = "vvm_type_cvvm";
+ field public static final String VVM_TYPE_OMTP = "vvm_type_omtp";
}
- public static abstract class TelephonyManager.CellInfoCallback {
+ public abstract static class TelephonyManager.CellInfoCallback {
ctor public TelephonyManager.CellInfoCallback();
- method public abstract void onCellInfo(java.util.List<android.telephony.CellInfo>);
+ method public abstract void onCellInfo(@NonNull java.util.List<android.telephony.CellInfo>);
+ method public void onError(int, @Nullable Throwable);
+ field public static final int ERROR_MODEM_ERROR = 2; // 0x2
+ field public static final int ERROR_TIMEOUT = 1; // 0x1
}
- public static abstract class TelephonyManager.UssdResponseCallback {
+ public abstract static class TelephonyManager.UssdResponseCallback {
ctor public TelephonyManager.UssdResponseCallback();
- method public void onReceiveUssdResponse(android.telephony.TelephonyManager, java.lang.String, java.lang.CharSequence);
- method public void onReceiveUssdResponseFailed(android.telephony.TelephonyManager, java.lang.String, int);
+ method public void onReceiveUssdResponse(android.telephony.TelephonyManager, String, CharSequence);
+ method public void onReceiveUssdResponseFailed(android.telephony.TelephonyManager, String, int);
}
public final class TelephonyScanManager {
ctor public TelephonyScanManager();
}
- public static abstract class TelephonyScanManager.NetworkScanCallback {
+ public abstract static class TelephonyScanManager.NetworkScanCallback {
ctor public TelephonyScanManager.NetworkScanCallback();
method public void onComplete();
method public void onError(int);
@@ -44686,11 +44956,11 @@ package android.telephony {
public abstract class VisualVoicemailService extends android.app.Service {
ctor public VisualVoicemailService();
method public android.os.IBinder onBind(android.content.Intent);
- method public abstract void onCellServiceConnected(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
- method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
- method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms);
- method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService";
+ method @MainThread public abstract void onCellServiceConnected(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
+ method @MainThread public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
+ method @MainThread public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms);
+ method @MainThread public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask);
+ field public static final String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService";
}
public static class VisualVoicemailService.VisualVoicemailTask {
@@ -44700,9 +44970,9 @@ package android.telephony {
public final class VisualVoicemailSms implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getFields();
- method public java.lang.String getMessageBody();
+ method public String getMessageBody();
method public android.telecom.PhoneAccountHandle getPhoneAccountHandle();
- method public java.lang.String getPrefix();
+ method public String getPrefix();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.VisualVoicemailSms> CREATOR;
}
@@ -44713,7 +44983,7 @@ package android.telephony {
field public static final android.os.Parcelable.Creator<android.telephony.VisualVoicemailSmsFilterSettings> CREATOR;
field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff
field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe
- field public final java.lang.String clientPrefix;
+ field public final String clientPrefix;
field public final int destinationPort;
field public final java.util.List<java.lang.String> originatingNumbers;
}
@@ -44721,7 +44991,7 @@ package android.telephony {
public static class VisualVoicemailSmsFilterSettings.Builder {
ctor public VisualVoicemailSmsFilterSettings.Builder();
method public android.telephony.VisualVoicemailSmsFilterSettings build();
- method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setClientPrefix(java.lang.String);
+ method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setClientPrefix(String);
method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setDestinationPort(int);
method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setOriginatingNumbers(java.util.List<java.lang.String>);
}
@@ -44751,28 +45021,28 @@ package android.telephony.data {
public class ApnSetting implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getApnName();
+ method public String getApnName();
method public int getApnTypeBitmask();
method public int getAuthType();
method public int getCarrierId();
- method public java.lang.String getEntryName();
+ method public String getEntryName();
method public int getId();
- method public deprecated java.net.InetAddress getMmsProxyAddress();
- method public java.lang.String getMmsProxyAddressAsString();
+ method @Deprecated public java.net.InetAddress getMmsProxyAddress();
+ method public String getMmsProxyAddressAsString();
method public int getMmsProxyPort();
method public android.net.Uri getMmsc();
method public int getMvnoType();
method public int getNetworkTypeBitmask();
- method public java.lang.String getOperatorNumeric();
- method public java.lang.String getPassword();
+ method public String getOperatorNumeric();
+ method public String getPassword();
method public int getProtocol();
- method public deprecated java.net.InetAddress getProxyAddress();
- method public java.lang.String getProxyAddressAsString();
+ method @Deprecated public java.net.InetAddress getProxyAddress();
+ method public String getProxyAddressAsString();
method public int getProxyPort();
method public int getRoamingProtocol();
- method public java.lang.String getUser();
+ method public String getUser();
method public boolean isEnabled();
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final int AUTH_TYPE_CHAP = 2; // 0x2
field public static final int AUTH_TYPE_NONE = 0; // 0x0
field public static final int AUTH_TYPE_PAP = 1; // 0x1
@@ -44801,46 +45071,51 @@ package android.telephony.data {
public static class ApnSetting.Builder {
ctor public ApnSetting.Builder();
method public android.telephony.data.ApnSetting build();
- method public android.telephony.data.ApnSetting.Builder setApnName(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setApnName(String);
method public android.telephony.data.ApnSetting.Builder setApnTypeBitmask(int);
method public android.telephony.data.ApnSetting.Builder setAuthType(int);
method public android.telephony.data.ApnSetting.Builder setCarrierEnabled(boolean);
method public android.telephony.data.ApnSetting.Builder setCarrierId(int);
- method public android.telephony.data.ApnSetting.Builder setEntryName(java.lang.String);
- method public deprecated android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.net.InetAddress);
- method public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setEntryName(String);
+ method @Deprecated public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(String);
method public android.telephony.data.ApnSetting.Builder setMmsProxyPort(int);
method public android.telephony.data.ApnSetting.Builder setMmsc(android.net.Uri);
method public android.telephony.data.ApnSetting.Builder setMvnoType(int);
method public android.telephony.data.ApnSetting.Builder setNetworkTypeBitmask(int);
- method public android.telephony.data.ApnSetting.Builder setOperatorNumeric(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setPassword(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setOperatorNumeric(String);
+ method public android.telephony.data.ApnSetting.Builder setPassword(String);
method public android.telephony.data.ApnSetting.Builder setProtocol(int);
- method public deprecated android.telephony.data.ApnSetting.Builder setProxyAddress(java.net.InetAddress);
- method public android.telephony.data.ApnSetting.Builder setProxyAddress(java.lang.String);
+ method @Deprecated public android.telephony.data.ApnSetting.Builder setProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setProxyAddress(String);
method public android.telephony.data.ApnSetting.Builder setProxyPort(int);
method public android.telephony.data.ApnSetting.Builder setRoamingProtocol(int);
- method public android.telephony.data.ApnSetting.Builder setUser(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setUser(String);
}
}
package android.telephony.emergency {
- public final class EmergencyNumber implements java.lang.Comparable android.os.Parcelable {
- method public int compareTo(android.telephony.emergency.EmergencyNumber);
+ public final class EmergencyNumber implements java.lang.Comparable<android.telephony.emergency.EmergencyNumber> android.os.Parcelable {
+ method public int compareTo(@NonNull android.telephony.emergency.EmergencyNumber);
method public int describeContents();
- method public java.lang.String getCountryIso();
+ method public String getCountryIso();
+ method public int getEmergencyCallRouting();
method public int getEmergencyNumberSourceBitmask();
method public java.util.List<java.lang.Integer> getEmergencyNumberSources();
method public java.util.List<java.lang.Integer> getEmergencyServiceCategories();
method public int getEmergencyServiceCategoryBitmask();
- method public java.lang.String getMnc();
- method public java.lang.String getNumber();
+ method @NonNull public java.util.List<java.lang.String> getEmergencyUrns();
+ method public String getMnc();
+ method public String getNumber();
method public boolean isFromSources(int);
method public boolean isInEmergencyServiceCategories(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.emergency.EmergencyNumber> CREATOR;
+ field public static final int EMERGENCY_CALL_ROUTING_EMERGENCY = 1; // 0x1
+ field public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2; // 0x2
+ field public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0; // 0x0
field public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 16; // 0x10
field public static final int EMERGENCY_NUMBER_SOURCE_DEFAULT = 8; // 0x8
field public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = 4; // 0x4
@@ -44862,37 +45137,39 @@ package android.telephony.euicc {
public final class DownloadableSubscription implements android.os.Parcelable {
method public int describeContents();
- method public static android.telephony.euicc.DownloadableSubscription forActivationCode(java.lang.String);
- method public java.lang.String getConfirmationCode();
- method public java.lang.String getEncodedActivationCode();
+ method public static android.telephony.euicc.DownloadableSubscription forActivationCode(String);
+ method @Nullable public String getConfirmationCode();
+ method @Nullable public String getEncodedActivationCode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.euicc.DownloadableSubscription> CREATOR;
}
public final class EuiccInfo implements android.os.Parcelable {
- ctor public EuiccInfo(java.lang.String);
+ ctor public EuiccInfo(@Nullable String);
method public int describeContents();
- method public java.lang.String getOsVersion();
+ method @Nullable public String getOsVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccInfo> CREATOR;
}
public class EuiccManager {
- method public void deleteSubscription(int, android.app.PendingIntent);
- method public void downloadSubscription(android.telephony.euicc.DownloadableSubscription, boolean, android.app.PendingIntent);
- method public java.lang.String getEid();
- method public android.telephony.euicc.EuiccInfo getEuiccInfo();
+ method public android.telephony.euicc.EuiccManager createForCardId(int);
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void deleteSubscription(int, android.app.PendingIntent);
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void downloadSubscription(android.telephony.euicc.DownloadableSubscription, boolean, android.app.PendingIntent);
+ method @Nullable public String getEid();
+ method @Nullable public android.telephony.euicc.EuiccInfo getEuiccInfo();
method public boolean isEnabled();
method public void startResolutionActivity(android.app.Activity, int, android.content.Intent, android.app.PendingIntent) throws android.content.IntentSender.SendIntentException;
- method public void switchToSubscription(int, android.app.PendingIntent);
- field public static final java.lang.String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.telephony.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS";
- field public static final java.lang.String ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE = "android.telephony.euicc.action.NOTIFY_CARRIER_SETUP_INCOMPLETE";
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, android.app.PendingIntent);
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void updateSubscriptionNickname(int, String, android.app.PendingIntent);
+ field public static final String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.telephony.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS";
+ field public static final String ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE = "android.telephony.euicc.action.NOTIFY_CARRIER_SETUP_INCOMPLETE";
field public static final int EMBEDDED_SUBSCRIPTION_RESULT_ERROR = 2; // 0x2
field public static final int EMBEDDED_SUBSCRIPTION_RESULT_OK = 0; // 0x0
field public static final int EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR = 1; // 0x1
- field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DETAILED_CODE";
- field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION";
- field public static final java.lang.String META_DATA_CARRIER_ICON = "android.telephony.euicc.carriericon";
+ field public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DETAILED_CODE";
+ field public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION";
+ field public static final String META_DATA_CARRIER_ICON = "android.telephony.euicc.carriericon";
}
}
@@ -44910,79 +45187,76 @@ package android.telephony.gsm {
method public void setStateInvalid();
}
- public final deprecated class SmsManager {
- method public deprecated java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
- method public static deprecated android.telephony.gsm.SmsManager getDefault();
- method public deprecated void sendDataMessage(java.lang.String, java.lang.String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
- method public deprecated void sendMultipartTextMessage(java.lang.String, java.lang.String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
- method public deprecated void sendTextMessage(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
- field public static final deprecated int RESULT_ERROR_GENERIC_FAILURE = 1; // 0x1
- field public static final deprecated int RESULT_ERROR_NO_SERVICE = 4; // 0x4
- field public static final deprecated int RESULT_ERROR_NULL_PDU = 3; // 0x3
- field public static final deprecated int RESULT_ERROR_RADIO_OFF = 2; // 0x2
- field public static final deprecated int STATUS_ON_SIM_FREE = 0; // 0x0
- field public static final deprecated int STATUS_ON_SIM_READ = 1; // 0x1
- field public static final deprecated int STATUS_ON_SIM_SENT = 5; // 0x5
- field public static final deprecated int STATUS_ON_SIM_UNREAD = 3; // 0x3
- field public static final deprecated int STATUS_ON_SIM_UNSENT = 7; // 0x7
- }
-
- public deprecated class SmsMessage {
- ctor public deprecated SmsMessage();
- method public static deprecated int[] calculateLength(java.lang.CharSequence, boolean);
- method public static deprecated int[] calculateLength(java.lang.String, boolean);
- method public static deprecated android.telephony.gsm.SmsMessage createFromPdu(byte[]);
- method public deprecated java.lang.String getDisplayMessageBody();
- method public deprecated java.lang.String getDisplayOriginatingAddress();
- method public deprecated java.lang.String getEmailBody();
- method public deprecated java.lang.String getEmailFrom();
- method public deprecated int getIndexOnSim();
- method public deprecated java.lang.String getMessageBody();
- method public deprecated android.telephony.gsm.SmsMessage.MessageClass getMessageClass();
- method public deprecated java.lang.String getOriginatingAddress();
- method public deprecated byte[] getPdu();
- method public deprecated int getProtocolIdentifier();
- method public deprecated java.lang.String getPseudoSubject();
- method public deprecated java.lang.String getServiceCenterAddress();
- method public deprecated int getStatus();
- method public deprecated int getStatusOnSim();
- method public static deprecated android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(java.lang.String, java.lang.String, java.lang.String, boolean);
- method public static deprecated android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(java.lang.String, java.lang.String, short, byte[], boolean);
- method public static deprecated int getTPLayerLengthForPDU(java.lang.String);
- method public deprecated long getTimestampMillis();
- method public deprecated byte[] getUserData();
- method public deprecated boolean isCphsMwiMessage();
- method public deprecated boolean isEmail();
- method public deprecated boolean isMWIClearMessage();
- method public deprecated boolean isMWISetMessage();
- method public deprecated boolean isMwiDontStore();
- method public deprecated boolean isReplace();
- method public deprecated boolean isReplyPathPresent();
- method public deprecated boolean isStatusReportMessage();
- field public static final deprecated int ENCODING_16BIT = 3; // 0x3
- field public static final deprecated int ENCODING_7BIT = 1; // 0x1
- field public static final deprecated int ENCODING_8BIT = 2; // 0x2
- field public static final deprecated int ENCODING_UNKNOWN = 0; // 0x0
- field public static final deprecated int MAX_USER_DATA_BYTES = 140; // 0x8c
- field public static final deprecated int MAX_USER_DATA_SEPTETS = 160; // 0xa0
- field public static final deprecated int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; // 0x99
- }
-
- public static final deprecated class SmsMessage.MessageClass extends java.lang.Enum {
- method public static android.telephony.gsm.SmsMessage.MessageClass valueOf(java.lang.String);
- method public static final android.telephony.gsm.SmsMessage.MessageClass[] values();
- enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_0;
- enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_1;
- enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_2;
- enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_3;
- enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass UNKNOWN;
- }
-
- public static deprecated class SmsMessage.SubmitPdu {
- ctor public deprecated SmsMessage.SubmitPdu();
- method public deprecated java.lang.String toString();
- field public deprecated byte[] encodedMessage;
- field public deprecated byte[] encodedScAddress;
+ @Deprecated public final class SmsManager {
+ method @Deprecated public java.util.ArrayList<java.lang.String> divideMessage(String);
+ method @Deprecated public static android.telephony.gsm.SmsManager getDefault();
+ method @Deprecated public void sendDataMessage(String, String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
+ method @Deprecated public void sendMultipartTextMessage(String, String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
+ method @Deprecated public void sendTextMessage(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
+ field @Deprecated public static final int RESULT_ERROR_GENERIC_FAILURE = 1; // 0x1
+ field @Deprecated public static final int RESULT_ERROR_NO_SERVICE = 4; // 0x4
+ field @Deprecated public static final int RESULT_ERROR_NULL_PDU = 3; // 0x3
+ field @Deprecated public static final int RESULT_ERROR_RADIO_OFF = 2; // 0x2
+ field @Deprecated public static final int STATUS_ON_SIM_FREE = 0; // 0x0
+ field @Deprecated public static final int STATUS_ON_SIM_READ = 1; // 0x1
+ field @Deprecated public static final int STATUS_ON_SIM_SENT = 5; // 0x5
+ field @Deprecated public static final int STATUS_ON_SIM_UNREAD = 3; // 0x3
+ field @Deprecated public static final int STATUS_ON_SIM_UNSENT = 7; // 0x7
+ }
+
+ @Deprecated public class SmsMessage {
+ ctor @Deprecated public SmsMessage();
+ method @Deprecated public static int[] calculateLength(CharSequence, boolean);
+ method @Deprecated public static int[] calculateLength(String, boolean);
+ method @Deprecated public static android.telephony.gsm.SmsMessage createFromPdu(byte[]);
+ method @Deprecated public String getDisplayMessageBody();
+ method @Deprecated public String getDisplayOriginatingAddress();
+ method @Deprecated public String getEmailBody();
+ method @Deprecated public String getEmailFrom();
+ method @Deprecated public int getIndexOnSim();
+ method @Deprecated public String getMessageBody();
+ method @Deprecated public android.telephony.gsm.SmsMessage.MessageClass getMessageClass();
+ method @Deprecated public String getOriginatingAddress();
+ method @Deprecated public byte[] getPdu();
+ method @Deprecated public int getProtocolIdentifier();
+ method @Deprecated public String getPseudoSubject();
+ method @Deprecated public String getServiceCenterAddress();
+ method @Deprecated public int getStatus();
+ method @Deprecated public int getStatusOnSim();
+ method @Deprecated public static android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(String, String, String, boolean);
+ method @Deprecated public static android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(String, String, short, byte[], boolean);
+ method @Deprecated public static int getTPLayerLengthForPDU(String);
+ method @Deprecated public long getTimestampMillis();
+ method @Deprecated public byte[] getUserData();
+ method @Deprecated public boolean isCphsMwiMessage();
+ method @Deprecated public boolean isEmail();
+ method @Deprecated public boolean isMWIClearMessage();
+ method @Deprecated public boolean isMWISetMessage();
+ method @Deprecated public boolean isMwiDontStore();
+ method @Deprecated public boolean isReplace();
+ method @Deprecated public boolean isReplyPathPresent();
+ method @Deprecated public boolean isStatusReportMessage();
+ field @Deprecated public static final int ENCODING_16BIT = 3; // 0x3
+ field @Deprecated public static final int ENCODING_7BIT = 1; // 0x1
+ field @Deprecated public static final int ENCODING_8BIT = 2; // 0x2
+ field @Deprecated public static final int ENCODING_UNKNOWN = 0; // 0x0
+ field @Deprecated public static final int MAX_USER_DATA_BYTES = 140; // 0x8c
+ field @Deprecated public static final int MAX_USER_DATA_SEPTETS = 160; // 0xa0
+ field @Deprecated public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; // 0x99
+ }
+
+ @Deprecated public enum SmsMessage.MessageClass {
+ enum_constant @Deprecated public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_0;
+ enum_constant @Deprecated public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_1;
+ enum_constant @Deprecated public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_2;
+ enum_constant @Deprecated public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_3;
+ enum_constant @Deprecated public static final android.telephony.gsm.SmsMessage.MessageClass UNKNOWN;
+ }
+
+ @Deprecated public static class SmsMessage.SubmitPdu {
+ ctor @Deprecated public SmsMessage.SubmitPdu();
+ field @Deprecated public byte[] encodedMessage;
+ field @Deprecated public byte[] encodedScAddress;
}
}
@@ -44997,7 +45271,7 @@ package android.telephony.mbms {
public final class DownloadRequest implements android.os.Parcelable {
method public int describeContents();
method public android.net.Uri getDestinationUri();
- method public java.lang.String getFileServiceId();
+ method public String getFileServiceId();
method public static int getMaxAppIntentSize();
method public static int getMaxDestinationUriSize();
method public android.net.Uri getSourceUri();
@@ -45008,7 +45282,7 @@ package android.telephony.mbms {
}
public static class DownloadRequest.Builder {
- ctor public DownloadRequest.Builder(android.net.Uri, android.net.Uri);
+ ctor public DownloadRequest.Builder(@NonNull android.net.Uri, @NonNull android.net.Uri);
method public android.telephony.mbms.DownloadRequest build();
method public static android.telephony.mbms.DownloadRequest.Builder fromDownloadRequest(android.telephony.mbms.DownloadRequest);
method public static android.telephony.mbms.DownloadRequest.Builder fromSerializedRequest(byte[]);
@@ -45024,7 +45298,7 @@ package android.telephony.mbms {
public final class FileInfo implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getMimeType();
+ method public String getMimeType();
method public android.net.Uri getUri();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileInfo> CREATOR;
@@ -45040,7 +45314,7 @@ package android.telephony.mbms {
public class GroupCall implements java.lang.AutoCloseable {
method public void close();
method public long getTmgi();
- method public void updateGroupCall(java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>);
+ method public void updateGroupCall(@NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>);
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_FREQUENCY_CONFLICT = 3; // 0x3
field public static final int REASON_LEFT_MBMS_BROADCAST_AREA = 6; // 0x6
@@ -45052,10 +45326,10 @@ package android.telephony.mbms {
field public static final int STATE_STOPPED = 1; // 0x1
}
- public abstract interface GroupCallCallback {
- method public abstract void onBroadcastSignalStrengthUpdated(int);
- method public abstract void onError(int, java.lang.String);
- method public abstract void onGroupCallStateChanged(int, int);
+ public interface GroupCallCallback {
+ method public void onBroadcastSignalStrengthUpdated(@IntRange(from=0xffffffff, to=4) int);
+ method public void onError(int, @Nullable String);
+ method public void onGroupCallStateChanged(int, int);
field public static final int SIGNAL_STRENGTH_UNAVAILABLE = -1; // 0xffffffff
}
@@ -45066,7 +45340,7 @@ package android.telephony.mbms {
public class MbmsDownloadSessionCallback {
ctor public MbmsDownloadSessionCallback();
- method public void onError(int, java.lang.String);
+ method public void onError(int, String);
method public void onFileServicesUpdated(java.util.List<android.telephony.mbms.FileServiceInfo>);
method public void onMiddlewareReady();
}
@@ -45112,26 +45386,26 @@ package android.telephony.mbms {
field public static final int ERROR_UNABLE_TO_START_SERVICE = 302; // 0x12e
}
- public abstract interface MbmsGroupCallSessionCallback {
- method public abstract void onAvailableSaisUpdated(java.util.List<java.lang.Integer>, java.util.List<java.util.List<java.lang.Integer>>);
- method public abstract void onError(int, java.lang.String);
- method public abstract void onMiddlewareReady();
- method public abstract void onServiceInterfaceAvailable(java.lang.String, int);
+ public interface MbmsGroupCallSessionCallback {
+ method public void onAvailableSaisUpdated(@NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.util.List<java.lang.Integer>>);
+ method public void onError(int, @Nullable String);
+ method public void onMiddlewareReady();
+ method public void onServiceInterfaceAvailable(@NonNull String, int);
}
public class MbmsStreamingSessionCallback {
ctor public MbmsStreamingSessionCallback();
- method public void onError(int, java.lang.String);
+ method public void onError(int, @Nullable String);
method public void onMiddlewareReady();
method public void onStreamingServicesUpdated(java.util.List<android.telephony.mbms.StreamingServiceInfo>);
}
public class ServiceInfo {
method public java.util.List<java.util.Locale> getLocales();
- method public java.lang.CharSequence getNameForLocale(java.util.Locale);
- method public java.util.Set<java.util.Locale> getNamedContentLocales();
- method public java.lang.String getServiceClassName();
- method public java.lang.String getServiceId();
+ method @NonNull public CharSequence getNameForLocale(@NonNull java.util.Locale);
+ method @NonNull public java.util.Set<java.util.Locale> getNamedContentLocales();
+ method public String getServiceClassName();
+ method public String getServiceId();
method public java.util.Date getSessionEndTime();
method public java.util.Date getSessionStartTime();
}
@@ -45139,7 +45413,7 @@ package android.telephony.mbms {
public class StreamingService implements java.lang.AutoCloseable {
method public void close();
method public android.telephony.mbms.StreamingServiceInfo getInfo();
- method public android.net.Uri getPlaybackUri();
+ method @Nullable public android.net.Uri getPlaybackUri();
field public static final int BROADCAST_METHOD = 1; // 0x1
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_END_OF_SESSION = 2; // 0x2
@@ -45157,7 +45431,7 @@ package android.telephony.mbms {
public class StreamingServiceCallback {
ctor public StreamingServiceCallback();
method public void onBroadcastSignalStrengthUpdated(int);
- method public void onError(int, java.lang.String);
+ method public void onError(int, @Nullable String);
method public void onMediaDescriptionUpdated();
method public void onStreamMethodUpdated(int);
method public void onStreamStateUpdated(int, int);
@@ -45178,37 +45452,37 @@ package android.text {
method public char charAt(int);
method public void getChars(int, int, char[], int);
method public int length();
- method public static android.text.AlteredCharSequence make(java.lang.CharSequence, char[], int, int);
- method public java.lang.CharSequence subSequence(int, int);
+ method public static android.text.AlteredCharSequence make(CharSequence, char[], int, int);
+ method public CharSequence subSequence(int, int);
}
- public deprecated class AndroidCharacter {
- ctor public AndroidCharacter();
- method public static void getDirectionalities(char[], byte[], int);
- method public static int getEastAsianWidth(char);
- method public static void getEastAsianWidths(char[], int, int, byte[]);
- method public static char getMirror(char);
- method public static boolean mirror(char[], int, int);
- field public static final int EAST_ASIAN_WIDTH_AMBIGUOUS = 1; // 0x1
- field public static final int EAST_ASIAN_WIDTH_FULL_WIDTH = 3; // 0x3
- field public static final int EAST_ASIAN_WIDTH_HALF_WIDTH = 2; // 0x2
- field public static final int EAST_ASIAN_WIDTH_NARROW = 4; // 0x4
- field public static final int EAST_ASIAN_WIDTH_NEUTRAL = 0; // 0x0
- field public static final int EAST_ASIAN_WIDTH_WIDE = 5; // 0x5
+ @Deprecated public class AndroidCharacter {
+ ctor @Deprecated public AndroidCharacter();
+ method @Deprecated public static void getDirectionalities(char[], byte[], int);
+ method @Deprecated public static int getEastAsianWidth(char);
+ method @Deprecated public static void getEastAsianWidths(char[], int, int, byte[]);
+ method @Deprecated public static char getMirror(char);
+ method @Deprecated public static boolean mirror(char[], int, int);
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_AMBIGUOUS = 1; // 0x1
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_FULL_WIDTH = 3; // 0x3
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_HALF_WIDTH = 2; // 0x2
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_NARROW = 4; // 0x4
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_NEUTRAL = 0; // 0x0
+ field @Deprecated public static final int EAST_ASIAN_WIDTH_WIDE = 5; // 0x5
}
public class Annotation implements android.text.ParcelableSpan {
- ctor public Annotation(java.lang.String, java.lang.String);
+ ctor public Annotation(String, String);
ctor public Annotation(android.os.Parcel);
method public int describeContents();
- method public java.lang.String getKey();
+ method public String getKey();
method public int getSpanTypeId();
- method public java.lang.String getValue();
+ method public String getValue();
method public void writeToParcel(android.os.Parcel, int);
}
public class AutoText {
- method public static java.lang.String get(java.lang.CharSequence, int, int, android.view.View);
+ method public static String get(CharSequence, int, int, android.view.View);
method public static int getSize(android.view.View);
}
@@ -45217,17 +45491,17 @@ package android.text {
method public static android.text.BidiFormatter getInstance(boolean);
method public static android.text.BidiFormatter getInstance(java.util.Locale);
method public boolean getStereoReset();
- method public boolean isRtl(java.lang.String);
- method public boolean isRtl(java.lang.CharSequence);
+ method public boolean isRtl(String);
+ method public boolean isRtl(CharSequence);
method public boolean isRtlContext();
- method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic, boolean);
- method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.text.TextDirectionHeuristic, boolean);
- method public java.lang.String unicodeWrap(java.lang.String, android.text.TextDirectionHeuristic);
- method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.text.TextDirectionHeuristic);
- method public java.lang.String unicodeWrap(java.lang.String, boolean);
- method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, boolean);
- method public java.lang.String unicodeWrap(java.lang.String);
- method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence);
+ method @Nullable public String unicodeWrap(@Nullable String, android.text.TextDirectionHeuristic, boolean);
+ method @Nullable public CharSequence unicodeWrap(@Nullable CharSequence, android.text.TextDirectionHeuristic, boolean);
+ method public String unicodeWrap(String, android.text.TextDirectionHeuristic);
+ method public CharSequence unicodeWrap(CharSequence, android.text.TextDirectionHeuristic);
+ method public String unicodeWrap(String, boolean);
+ method public CharSequence unicodeWrap(CharSequence, boolean);
+ method public String unicodeWrap(String);
+ method public CharSequence unicodeWrap(CharSequence);
}
public static final class BidiFormatter.Builder {
@@ -45240,8 +45514,8 @@ package android.text {
}
public class BoringLayout extends android.text.Layout implements android.text.TextUtils.EllipsizeCallback {
- ctor public BoringLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
- ctor public BoringLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
+ ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
+ ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
method public void ellipsized(int, int);
method public int getBottomPadding();
method public int getEllipsisCount(int);
@@ -45254,12 +45528,12 @@ package android.text {
method public int getLineTop(int);
method public int getParagraphDirection(int);
method public int getTopPadding();
- method public static android.text.BoringLayout.Metrics isBoring(java.lang.CharSequence, android.text.TextPaint);
- method public static android.text.BoringLayout.Metrics isBoring(java.lang.CharSequence, android.text.TextPaint, android.text.BoringLayout.Metrics);
- method public static android.text.BoringLayout make(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
- method public static android.text.BoringLayout make(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
- method public android.text.BoringLayout replaceOrMake(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
- method public android.text.BoringLayout replaceOrMake(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
+ method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint);
+ method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint, android.text.BoringLayout.Metrics);
+ method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
+ method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
+ method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
+ method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
}
public static class BoringLayout.Metrics extends android.graphics.Paint.FontMetricsInt {
@@ -45267,17 +45541,17 @@ package android.text {
field public int width;
}
- public abstract deprecated class ClipboardManager {
- ctor public ClipboardManager();
- method public abstract java.lang.CharSequence getText();
- method public abstract boolean hasText();
- method public abstract void setText(java.lang.CharSequence);
+ @Deprecated public abstract class ClipboardManager {
+ ctor @Deprecated public ClipboardManager();
+ method @Deprecated public abstract CharSequence getText();
+ method @Deprecated public abstract boolean hasText();
+ method @Deprecated public abstract void setText(CharSequence);
}
public class DynamicLayout extends android.text.Layout {
- ctor public deprecated DynamicLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
- ctor public deprecated DynamicLayout(java.lang.CharSequence, java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
- ctor public deprecated DynamicLayout(java.lang.CharSequence, java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean, android.text.TextUtils.TruncateAt, int);
+ ctor @Deprecated public DynamicLayout(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @FloatRange(from=0.0) float, float, boolean);
+ ctor @Deprecated public DynamicLayout(@NonNull CharSequence, @NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @FloatRange(from=0.0) float, float, boolean);
+ ctor @Deprecated public DynamicLayout(@NonNull CharSequence, @NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @FloatRange(from=0.0) float, float, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int);
method public int getBottomPadding();
method public int getEllipsisCount(int);
method public int getEllipsisStart(int);
@@ -45292,54 +45566,54 @@ package android.text {
}
public static final class DynamicLayout.Builder {
- method public android.text.DynamicLayout build();
- method public static android.text.DynamicLayout.Builder obtain(java.lang.CharSequence, android.text.TextPaint, int);
- method public android.text.DynamicLayout.Builder setAlignment(android.text.Layout.Alignment);
- method public android.text.DynamicLayout.Builder setBreakStrategy(int);
- method public android.text.DynamicLayout.Builder setDisplayText(java.lang.CharSequence);
- method public android.text.DynamicLayout.Builder setEllipsize(android.text.TextUtils.TruncateAt);
- method public android.text.DynamicLayout.Builder setEllipsizedWidth(int);
- method public android.text.DynamicLayout.Builder setHyphenationFrequency(int);
- method public android.text.DynamicLayout.Builder setIncludePad(boolean);
- method public android.text.DynamicLayout.Builder setJustificationMode(int);
- method public android.text.DynamicLayout.Builder setLineSpacing(float, float);
- method public android.text.DynamicLayout.Builder setTextDirection(android.text.TextDirectionHeuristic);
- method public android.text.DynamicLayout.Builder setUseLineSpacingFromFallbacks(boolean);
- }
-
- public abstract interface Editable implements java.lang.Appendable java.lang.CharSequence android.text.GetChars android.text.Spannable {
- method public abstract android.text.Editable append(java.lang.CharSequence);
- method public abstract android.text.Editable append(java.lang.CharSequence, int, int);
- method public abstract android.text.Editable append(char);
- method public abstract void clear();
- method public abstract void clearSpans();
- method public abstract android.text.Editable delete(int, int);
- method public abstract android.text.InputFilter[] getFilters();
- method public abstract android.text.Editable insert(int, java.lang.CharSequence, int, int);
- method public abstract android.text.Editable insert(int, java.lang.CharSequence);
- method public abstract android.text.Editable replace(int, int, java.lang.CharSequence, int, int);
- method public abstract android.text.Editable replace(int, int, java.lang.CharSequence);
- method public abstract void setFilters(android.text.InputFilter[]);
+ method @NonNull public android.text.DynamicLayout build();
+ method @NonNull public static android.text.DynamicLayout.Builder obtain(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int);
+ method @NonNull public android.text.DynamicLayout.Builder setAlignment(@NonNull android.text.Layout.Alignment);
+ method @NonNull public android.text.DynamicLayout.Builder setBreakStrategy(int);
+ method @NonNull public android.text.DynamicLayout.Builder setDisplayText(@NonNull CharSequence);
+ method public android.text.DynamicLayout.Builder setEllipsize(@Nullable android.text.TextUtils.TruncateAt);
+ method @NonNull public android.text.DynamicLayout.Builder setEllipsizedWidth(@IntRange(from=0) int);
+ method @NonNull public android.text.DynamicLayout.Builder setHyphenationFrequency(int);
+ method @NonNull public android.text.DynamicLayout.Builder setIncludePad(boolean);
+ method @NonNull public android.text.DynamicLayout.Builder setJustificationMode(int);
+ method @NonNull public android.text.DynamicLayout.Builder setLineSpacing(float, @FloatRange(from=0.0) float);
+ method @NonNull public android.text.DynamicLayout.Builder setTextDirection(@NonNull android.text.TextDirectionHeuristic);
+ method @NonNull public android.text.DynamicLayout.Builder setUseLineSpacingFromFallbacks(boolean);
+ }
+
+ public interface Editable extends java.lang.CharSequence java.lang.Appendable android.text.GetChars android.text.Spannable {
+ method public android.text.Editable append(CharSequence);
+ method public android.text.Editable append(CharSequence, int, int);
+ method public android.text.Editable append(char);
+ method public void clear();
+ method public void clearSpans();
+ method public android.text.Editable delete(int, int);
+ method public android.text.InputFilter[] getFilters();
+ method public android.text.Editable insert(int, CharSequence, int, int);
+ method public android.text.Editable insert(int, CharSequence);
+ method public android.text.Editable replace(int, int, CharSequence, int, int);
+ method public android.text.Editable replace(int, int, CharSequence);
+ method public void setFilters(android.text.InputFilter[]);
}
public static class Editable.Factory {
ctor public Editable.Factory();
method public static android.text.Editable.Factory getInstance();
- method public android.text.Editable newEditable(java.lang.CharSequence);
+ method public android.text.Editable newEditable(CharSequence);
}
- public abstract interface GetChars implements java.lang.CharSequence {
- method public abstract void getChars(int, int, char[], int);
+ public interface GetChars extends java.lang.CharSequence {
+ method public void getChars(int, int, char[], int);
}
public class Html {
- method public static java.lang.String escapeHtml(java.lang.CharSequence);
- method public static deprecated android.text.Spanned fromHtml(java.lang.String);
- method public static android.text.Spanned fromHtml(java.lang.String, int);
- method public static deprecated android.text.Spanned fromHtml(java.lang.String, android.text.Html.ImageGetter, android.text.Html.TagHandler);
- method public static android.text.Spanned fromHtml(java.lang.String, int, android.text.Html.ImageGetter, android.text.Html.TagHandler);
- method public static deprecated java.lang.String toHtml(android.text.Spanned);
- method public static java.lang.String toHtml(android.text.Spanned, int);
+ method public static String escapeHtml(CharSequence);
+ method @Deprecated public static android.text.Spanned fromHtml(String);
+ method public static android.text.Spanned fromHtml(String, int);
+ method @Deprecated public static android.text.Spanned fromHtml(String, android.text.Html.ImageGetter, android.text.Html.TagHandler);
+ method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter, android.text.Html.TagHandler);
+ method @Deprecated public static String toHtml(android.text.Spanned);
+ method public static String toHtml(android.text.Spanned, int);
field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
@@ -45353,12 +45627,12 @@ package android.text {
field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
}
- public static abstract interface Html.ImageGetter {
- method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String);
+ public static interface Html.ImageGetter {
+ method public android.graphics.drawable.Drawable getDrawable(String);
}
- public static abstract interface Html.TagHandler {
- method public abstract void handleTag(boolean, java.lang.String, android.text.Editable, org.xml.sax.XMLReader);
+ public static interface Html.TagHandler {
+ method public void handleTag(boolean, String, android.text.Editable, org.xml.sax.XMLReader);
}
public class Hyphenator {
@@ -45377,23 +45651,23 @@ package android.text {
field public static final int START_HYPHEN_EDIT_NO_EDIT = 0; // 0x0
}
- public abstract interface InputFilter {
- method public abstract java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
+ public interface InputFilter {
+ method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
}
public static class InputFilter.AllCaps implements android.text.InputFilter {
ctor public InputFilter.AllCaps();
- ctor public InputFilter.AllCaps(java.util.Locale);
- method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
+ ctor public InputFilter.AllCaps(@NonNull java.util.Locale);
+ method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
}
public static class InputFilter.LengthFilter implements android.text.InputFilter {
ctor public InputFilter.LengthFilter(int);
- method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
+ method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
method public int getMax();
}
- public abstract interface InputType {
+ public interface InputType {
field public static final int TYPE_CLASS_DATETIME = 4; // 0x4
field public static final int TYPE_CLASS_NUMBER = 2; // 0x2
field public static final int TYPE_CLASS_PHONE = 3; // 0x3
@@ -45435,14 +45709,14 @@ package android.text {
}
public abstract class Layout {
- ctor protected Layout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float);
+ ctor protected Layout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float);
method public void draw(android.graphics.Canvas);
method public void draw(android.graphics.Canvas, android.graphics.Path, android.graphics.Paint, int);
method public final android.text.Layout.Alignment getAlignment();
method public abstract int getBottomPadding();
- method public void getCursorPath(int, android.graphics.Path, java.lang.CharSequence);
- method public static float getDesiredWidth(java.lang.CharSequence, android.text.TextPaint);
- method public static float getDesiredWidth(java.lang.CharSequence, int, int, android.text.TextPaint);
+ method public void getCursorPath(int, android.graphics.Path, CharSequence);
+ method public static float getDesiredWidth(CharSequence, android.text.TextPaint);
+ method public static float getDesiredWidth(CharSequence, int, int, android.text.TextPaint);
method public abstract int getEllipsisCount(int);
method public abstract int getEllipsisStart(int);
method public int getEllipsizedWidth();
@@ -45478,7 +45752,7 @@ package android.text {
method public void getSelectionPath(int, int, android.graphics.Path);
method public final float getSpacingAdd();
method public final float getSpacingMultiplier();
- method public final java.lang.CharSequence getText();
+ method public final CharSequence getText();
method public abstract int getTopPadding();
method public final int getWidth();
method public final void increaseWidthTo(int);
@@ -45498,9 +45772,7 @@ package android.text {
field public static final int JUSTIFICATION_MODE_NONE = 0; // 0x0
}
- public static final class Layout.Alignment extends java.lang.Enum {
- method public static android.text.Layout.Alignment valueOf(java.lang.String);
- method public static final android.text.Layout.Alignment[] values();
+ public enum Layout.Alignment {
enum_constant public static final android.text.Layout.Alignment ALIGN_CENTER;
enum_constant public static final android.text.Layout.Alignment ALIGN_NORMAL;
enum_constant public static final android.text.Layout.Alignment ALIGN_OPPOSITE;
@@ -45510,7 +45782,7 @@ package android.text {
}
public abstract class LoginFilter implements android.text.InputFilter {
- method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
+ method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
method public abstract boolean isAllowed(char);
method public void onInvalidCharacter(char);
method public void onStart();
@@ -45535,51 +45807,51 @@ package android.text {
method public boolean isAllowed(char);
}
- public abstract interface NoCopySpan {
+ public interface NoCopySpan {
}
public static class NoCopySpan.Concrete implements android.text.NoCopySpan {
ctor public NoCopySpan.Concrete();
}
- public abstract interface ParcelableSpan implements android.os.Parcelable {
- method public abstract int getSpanTypeId();
+ public interface ParcelableSpan extends android.os.Parcelable {
+ method public int getSpanTypeId();
}
public class PrecomputedText implements android.text.Spannable {
method public char charAt(int);
- method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params);
- method public void getBounds(int, int, android.graphics.Rect);
- method public int getParagraphCount();
- method public int getParagraphEnd(int);
- method public int getParagraphStart(int);
- method public android.text.PrecomputedText.Params getParams();
- method public int getSpanEnd(java.lang.Object);
- method public int getSpanFlags(java.lang.Object);
- method public int getSpanStart(java.lang.Object);
- method public <T> T[] getSpans(int, int, java.lang.Class<T>);
- method public float getWidth(int, int);
+ method public static android.text.PrecomputedText create(@NonNull CharSequence, @NonNull android.text.PrecomputedText.Params);
+ method public void getBounds(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Rect);
+ method @IntRange(from=0) public int getParagraphCount();
+ method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+ method @NonNull public android.text.PrecomputedText.Params getParams();
+ method public int getSpanEnd(Object);
+ method public int getSpanFlags(Object);
+ method public int getSpanStart(Object);
+ method public <T> T[] getSpans(int, int, Class<T>);
+ method @FloatRange(from=0) public float getWidth(@IntRange(from=0) int, @IntRange(from=0) int);
method public int length();
- method public int nextSpanTransition(int, int, java.lang.Class);
- method public void removeSpan(java.lang.Object);
- method public void setSpan(java.lang.Object, int, int, int);
- method public java.lang.CharSequence subSequence(int, int);
+ method public int nextSpanTransition(int, int, Class);
+ method public void removeSpan(Object);
+ method public void setSpan(Object, int, int, int);
+ method public CharSequence subSequence(int, int);
}
public static final class PrecomputedText.Params {
method public int getBreakStrategy();
method public int getHyphenationFrequency();
- method public android.text.TextDirectionHeuristic getTextDirection();
- method public android.text.TextPaint getTextPaint();
+ method @NonNull public android.text.TextDirectionHeuristic getTextDirection();
+ method @NonNull public android.text.TextPaint getTextPaint();
}
public static class PrecomputedText.Params.Builder {
- ctor public PrecomputedText.Params.Builder(android.text.TextPaint);
- ctor public PrecomputedText.Params.Builder(android.text.PrecomputedText.Params);
- method public android.text.PrecomputedText.Params build();
+ ctor public PrecomputedText.Params.Builder(@NonNull android.text.TextPaint);
+ ctor public PrecomputedText.Params.Builder(@NonNull android.text.PrecomputedText.Params);
+ method @NonNull public android.text.PrecomputedText.Params build();
method public android.text.PrecomputedText.Params.Builder setBreakStrategy(int);
method public android.text.PrecomputedText.Params.Builder setHyphenationFrequency(int);
- method public android.text.PrecomputedText.Params.Builder setTextDirection(android.text.TextDirectionHeuristic);
+ method public android.text.PrecomputedText.Params.Builder setTextDirection(@NonNull android.text.TextDirectionHeuristic);
}
public class Selection {
@@ -45590,8 +45862,8 @@ package android.text {
method public static boolean extendToLeftEdge(android.text.Spannable, android.text.Layout);
method public static boolean extendToRightEdge(android.text.Spannable, android.text.Layout);
method public static boolean extendUp(android.text.Spannable, android.text.Layout);
- method public static final int getSelectionEnd(java.lang.CharSequence);
- method public static final int getSelectionStart(java.lang.CharSequence);
+ method public static final int getSelectionEnd(CharSequence);
+ method public static final int getSelectionStart(CharSequence);
method public static boolean moveDown(android.text.Spannable, android.text.Layout);
method public static boolean moveLeft(android.text.Spannable, android.text.Layout);
method public static boolean moveRight(android.text.Spannable, android.text.Layout);
@@ -45602,42 +45874,51 @@ package android.text {
method public static final void selectAll(android.text.Spannable);
method public static void setSelection(android.text.Spannable, int, int);
method public static final void setSelection(android.text.Spannable, int);
- field public static final java.lang.Object SELECTION_END;
- field public static final java.lang.Object SELECTION_START;
+ field public static final Object SELECTION_END;
+ field public static final Object SELECTION_START;
}
- public abstract interface SpanWatcher implements android.text.NoCopySpan {
- method public abstract void onSpanAdded(android.text.Spannable, java.lang.Object, int, int);
- method public abstract void onSpanChanged(android.text.Spannable, java.lang.Object, int, int, int, int);
- method public abstract void onSpanRemoved(android.text.Spannable, java.lang.Object, int, int);
+ public interface SpanWatcher extends android.text.NoCopySpan {
+ method public void onSpanAdded(android.text.Spannable, Object, int, int);
+ method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
+ method public void onSpanRemoved(android.text.Spannable, Object, int, int);
}
- public abstract interface Spannable implements android.text.Spanned {
- method public abstract void removeSpan(java.lang.Object);
- method public abstract void setSpan(java.lang.Object, int, int, int);
+ public interface Spannable extends android.text.Spanned {
+ method public void removeSpan(Object);
+ method public void setSpan(Object, int, int, int);
}
public static class Spannable.Factory {
ctor public Spannable.Factory();
method public static android.text.Spannable.Factory getInstance();
- method public android.text.Spannable newSpannable(java.lang.CharSequence);
+ method public android.text.Spannable newSpannable(CharSequence);
}
public class SpannableString implements java.lang.CharSequence android.text.GetChars android.text.Spannable {
- ctor public SpannableString(java.lang.CharSequence);
- method public void removeSpan(java.lang.Object);
- method public void setSpan(java.lang.Object, int, int, int);
- method public final java.lang.CharSequence subSequence(int, int);
- method public static android.text.SpannableString valueOf(java.lang.CharSequence);
+ ctor public SpannableString(CharSequence);
+ method public final char charAt(int);
+ method public final void getChars(int, int, char[], int);
+ method public int getSpanEnd(Object);
+ method public int getSpanFlags(Object);
+ method public int getSpanStart(Object);
+ method public <T> T[] getSpans(int, int, Class<T>);
+ method public final int length();
+ method public int nextSpanTransition(int, int, Class);
+ method public void removeSpan(Object);
+ method public void setSpan(Object, int, int, int);
+ method public final CharSequence subSequence(int, int);
+ method public final String toString();
+ method public static android.text.SpannableString valueOf(CharSequence);
}
public class SpannableStringBuilder implements java.lang.Appendable java.lang.CharSequence android.text.Editable android.text.GetChars android.text.Spannable {
ctor public SpannableStringBuilder();
- ctor public SpannableStringBuilder(java.lang.CharSequence);
- ctor public SpannableStringBuilder(java.lang.CharSequence, int, int);
- method public android.text.SpannableStringBuilder append(java.lang.CharSequence);
- method public android.text.SpannableStringBuilder append(java.lang.CharSequence, java.lang.Object, int);
- method public android.text.SpannableStringBuilder append(java.lang.CharSequence, int, int);
+ ctor public SpannableStringBuilder(CharSequence);
+ ctor public SpannableStringBuilder(CharSequence, int, int);
+ method public android.text.SpannableStringBuilder append(CharSequence);
+ method public android.text.SpannableStringBuilder append(CharSequence, Object, int);
+ method public android.text.SpannableStringBuilder append(CharSequence, int, int);
method public android.text.SpannableStringBuilder append(char);
method public char charAt(int);
method public void clear();
@@ -45645,31 +45926,31 @@ package android.text {
method public android.text.SpannableStringBuilder delete(int, int);
method public void getChars(int, int, char[], int);
method public android.text.InputFilter[] getFilters();
- method public int getSpanEnd(java.lang.Object);
- method public int getSpanFlags(java.lang.Object);
- method public int getSpanStart(java.lang.Object);
- method public <T> T[] getSpans(int, int, java.lang.Class<T>);
- method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint);
+ method public int getSpanEnd(Object);
+ method public int getSpanFlags(Object);
+ method public int getSpanStart(Object);
+ method public <T> T[] getSpans(int, int, @Nullable Class<T>);
+ method @Deprecated public int getTextRunCursor(int, int, int, int, int, android.graphics.Paint);
method public int getTextWatcherDepth();
- method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int);
- method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence);
+ method public android.text.SpannableStringBuilder insert(int, CharSequence, int, int);
+ method public android.text.SpannableStringBuilder insert(int, CharSequence);
method public int length();
- method public int nextSpanTransition(int, int, java.lang.Class);
- method public void removeSpan(java.lang.Object);
- method public android.text.SpannableStringBuilder replace(int, int, java.lang.CharSequence);
- method public android.text.SpannableStringBuilder replace(int, int, java.lang.CharSequence, int, int);
+ method public int nextSpanTransition(int, int, Class);
+ method public void removeSpan(Object);
+ method public android.text.SpannableStringBuilder replace(int, int, CharSequence);
+ method public android.text.SpannableStringBuilder replace(int, int, CharSequence, int, int);
method public void setFilters(android.text.InputFilter[]);
- method public void setSpan(java.lang.Object, int, int, int);
- method public java.lang.CharSequence subSequence(int, int);
- method public static android.text.SpannableStringBuilder valueOf(java.lang.CharSequence);
+ method public void setSpan(Object, int, int, int);
+ method public CharSequence subSequence(int, int);
+ method public static android.text.SpannableStringBuilder valueOf(CharSequence);
}
- public abstract interface Spanned implements java.lang.CharSequence {
- method public abstract int getSpanEnd(java.lang.Object);
- method public abstract int getSpanFlags(java.lang.Object);
- method public abstract int getSpanStart(java.lang.Object);
- method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>);
- method public abstract int nextSpanTransition(int, int, java.lang.Class);
+ public interface Spanned extends java.lang.CharSequence {
+ method public int getSpanEnd(Object);
+ method public int getSpanFlags(Object);
+ method public int getSpanStart(Object);
+ method public <T> T[] getSpans(int, int, Class<T>);
+ method public int nextSpanTransition(int, int, Class);
field public static final int SPAN_COMPOSING = 256; // 0x100
field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21
field public static final int SPAN_EXCLUSIVE_INCLUSIVE = 34; // 0x22
@@ -45689,15 +45970,23 @@ package android.text {
}
public final class SpannedString implements java.lang.CharSequence android.text.GetChars android.text.Spanned {
- ctor public SpannedString(java.lang.CharSequence);
- method public java.lang.CharSequence subSequence(int, int);
- method public static android.text.SpannedString valueOf(java.lang.CharSequence);
+ ctor public SpannedString(CharSequence);
+ method public final char charAt(int);
+ method public final void getChars(int, int, char[], int);
+ method public int getSpanEnd(Object);
+ method public int getSpanFlags(Object);
+ method public int getSpanStart(Object);
+ method public <T> T[] getSpans(int, int, Class<T>);
+ method public final int length();
+ method public int nextSpanTransition(int, int, Class);
+ method public CharSequence subSequence(int, int);
+ method public static android.text.SpannedString valueOf(CharSequence);
}
public class StaticLayout extends android.text.Layout {
- ctor public deprecated StaticLayout(java.lang.CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
- ctor public deprecated StaticLayout(java.lang.CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
- ctor public deprecated StaticLayout(java.lang.CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean, android.text.TextUtils.TruncateAt, int);
+ ctor @Deprecated public StaticLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
+ ctor @Deprecated public StaticLayout(CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
+ ctor @Deprecated public StaticLayout(CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean, android.text.TextUtils.TruncateAt, int);
method public int getBottomPadding();
method public int getEllipsisCount(int);
method public int getEllipsisStart(int);
@@ -45712,26 +46001,26 @@ package android.text {
}
public static final class StaticLayout.Builder {
- method public android.text.StaticLayout build();
- method public static android.text.StaticLayout.Builder obtain(java.lang.CharSequence, int, int, android.text.TextPaint, int);
- method public android.text.StaticLayout.Builder setAlignment(android.text.Layout.Alignment);
- method public android.text.StaticLayout.Builder setBreakStrategy(int);
- method public android.text.StaticLayout.Builder setEllipsize(android.text.TextUtils.TruncateAt);
- method public android.text.StaticLayout.Builder setEllipsizedWidth(int);
- method public android.text.StaticLayout.Builder setHyphenationFrequency(int);
- method public android.text.StaticLayout.Builder setIncludePad(boolean);
- method public android.text.StaticLayout.Builder setIndents(int[], int[]);
- method public android.text.StaticLayout.Builder setJustificationMode(int);
- method public android.text.StaticLayout.Builder setLineSpacing(float, float);
- method public android.text.StaticLayout.Builder setMaxLines(int);
- method public android.text.StaticLayout.Builder setText(java.lang.CharSequence);
- method public android.text.StaticLayout.Builder setTextDirection(android.text.TextDirectionHeuristic);
- method public android.text.StaticLayout.Builder setUseLineSpacingFromFallbacks(boolean);
- }
-
- public abstract interface TextDirectionHeuristic {
- method public abstract boolean isRtl(char[], int, int);
- method public abstract boolean isRtl(java.lang.CharSequence, int, int);
+ method @NonNull public android.text.StaticLayout build();
+ method @NonNull public static android.text.StaticLayout.Builder obtain(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.text.TextPaint, @IntRange(from=0) int);
+ method @NonNull public android.text.StaticLayout.Builder setAlignment(@NonNull android.text.Layout.Alignment);
+ method @NonNull public android.text.StaticLayout.Builder setBreakStrategy(int);
+ method @NonNull public android.text.StaticLayout.Builder setEllipsize(@Nullable android.text.TextUtils.TruncateAt);
+ method @NonNull public android.text.StaticLayout.Builder setEllipsizedWidth(@IntRange(from=0) int);
+ method @NonNull public android.text.StaticLayout.Builder setHyphenationFrequency(int);
+ method @NonNull public android.text.StaticLayout.Builder setIncludePad(boolean);
+ method @NonNull public android.text.StaticLayout.Builder setIndents(@Nullable int[], @Nullable int[]);
+ method @NonNull public android.text.StaticLayout.Builder setJustificationMode(int);
+ method @NonNull public android.text.StaticLayout.Builder setLineSpacing(float, @FloatRange(from=0.0) float);
+ method @NonNull public android.text.StaticLayout.Builder setMaxLines(@IntRange(from=0) int);
+ method public android.text.StaticLayout.Builder setText(CharSequence);
+ method @NonNull public android.text.StaticLayout.Builder setTextDirection(@NonNull android.text.TextDirectionHeuristic);
+ method @NonNull public android.text.StaticLayout.Builder setUseLineSpacingFromFallbacks(boolean);
+ }
+
+ public interface TextDirectionHeuristic {
+ method public boolean isRtl(char[], int, int);
+ method public boolean isRtl(CharSequence, int, int);
}
public class TextDirectionHeuristics {
@@ -45750,55 +46039,55 @@ package android.text {
ctor public TextPaint(android.graphics.Paint);
method public void set(android.text.TextPaint);
field public int baselineShift;
- field public int bgColor;
+ field @ColorInt public int bgColor;
field public float density;
field public int[] drawableState;
- field public int linkColor;
- field public int underlineColor;
- field public float underlineThickness;
+ field @ColorInt public int linkColor;
+ field @ColorInt public int underlineColor;
+ field @Px public float underlineThickness;
}
public class TextUtils {
- method public static deprecated java.lang.CharSequence commaEllipsize(java.lang.CharSequence, android.text.TextPaint, float, java.lang.String, java.lang.String);
- method public static java.lang.CharSequence concat(java.lang.CharSequence...);
- method public static void copySpansFrom(android.text.Spanned, int, int, java.lang.Class, android.text.Spannable, int);
- method public static void dumpSpans(java.lang.CharSequence, android.util.Printer, java.lang.String);
- method public static java.lang.CharSequence ellipsize(java.lang.CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt);
- method public static java.lang.CharSequence ellipsize(java.lang.CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt, boolean, android.text.TextUtils.EllipsizeCallback);
- method public static boolean equals(java.lang.CharSequence, java.lang.CharSequence);
- method public static java.lang.CharSequence expandTemplate(java.lang.CharSequence, java.lang.CharSequence...);
- method public static int getCapsMode(java.lang.CharSequence, int, int);
- method public static void getChars(java.lang.CharSequence, int, int, char[], int);
+ method @Deprecated public static CharSequence commaEllipsize(CharSequence, android.text.TextPaint, float, String, String);
+ method public static CharSequence concat(java.lang.CharSequence...);
+ method public static void copySpansFrom(android.text.Spanned, int, int, Class, android.text.Spannable, int);
+ method public static void dumpSpans(CharSequence, android.util.Printer, String);
+ method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt);
+ method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt, boolean, @Nullable android.text.TextUtils.EllipsizeCallback);
+ method public static boolean equals(CharSequence, CharSequence);
+ method public static CharSequence expandTemplate(CharSequence, java.lang.CharSequence...);
+ method public static int getCapsMode(CharSequence, int, int);
+ method public static void getChars(CharSequence, int, int, char[], int);
method public static int getLayoutDirectionFromLocale(java.util.Locale);
- method public static int getOffsetAfter(java.lang.CharSequence, int);
- method public static int getOffsetBefore(java.lang.CharSequence, int);
- method public static deprecated java.lang.CharSequence getReverse(java.lang.CharSequence, int, int);
- method public static int getTrimmedLength(java.lang.CharSequence);
- method public static java.lang.String htmlEncode(java.lang.String);
- method public static int indexOf(java.lang.CharSequence, char);
- method public static int indexOf(java.lang.CharSequence, char, int);
- method public static int indexOf(java.lang.CharSequence, char, int, int);
- method public static int indexOf(java.lang.CharSequence, java.lang.CharSequence);
- method public static int indexOf(java.lang.CharSequence, java.lang.CharSequence, int);
- method public static int indexOf(java.lang.CharSequence, java.lang.CharSequence, int, int);
- method public static boolean isDigitsOnly(java.lang.CharSequence);
- method public static boolean isEmpty(java.lang.CharSequence);
- method public static boolean isGraphic(java.lang.CharSequence);
- method public static deprecated boolean isGraphic(char);
- method public static java.lang.String join(java.lang.CharSequence, java.lang.Object[]);
- method public static java.lang.String join(java.lang.CharSequence, java.lang.Iterable);
- method public static int lastIndexOf(java.lang.CharSequence, char);
- method public static int lastIndexOf(java.lang.CharSequence, char, int);
- method public static int lastIndexOf(java.lang.CharSequence, char, int, int);
- method public static java.lang.CharSequence listEllipsize(android.content.Context, java.util.List<java.lang.CharSequence>, java.lang.String, android.text.TextPaint, float, int);
- method public static java.lang.CharSequence makeSafeForPresentation(java.lang.String, int, float, int);
- method public static boolean regionMatches(java.lang.CharSequence, int, java.lang.CharSequence, int, int);
- method public static java.lang.CharSequence replace(java.lang.CharSequence, java.lang.String[], java.lang.CharSequence[]);
- method public static java.lang.String[] split(java.lang.String, java.lang.String);
- method public static java.lang.String[] split(java.lang.String, java.util.regex.Pattern);
- method public static java.lang.CharSequence stringOrSpannedString(java.lang.CharSequence);
- method public static java.lang.String substring(java.lang.CharSequence, int, int);
- method public static void writeToParcel(java.lang.CharSequence, android.os.Parcel, int);
+ method public static int getOffsetAfter(CharSequence, int);
+ method public static int getOffsetBefore(CharSequence, int);
+ method @Deprecated public static CharSequence getReverse(CharSequence, int, int);
+ method public static int getTrimmedLength(CharSequence);
+ method public static String htmlEncode(String);
+ method public static int indexOf(CharSequence, char);
+ method public static int indexOf(CharSequence, char, int);
+ method public static int indexOf(CharSequence, char, int, int);
+ method public static int indexOf(CharSequence, CharSequence);
+ method public static int indexOf(CharSequence, CharSequence, int);
+ method public static int indexOf(CharSequence, CharSequence, int, int);
+ method public static boolean isDigitsOnly(CharSequence);
+ method public static boolean isEmpty(@Nullable CharSequence);
+ method public static boolean isGraphic(CharSequence);
+ method @Deprecated public static boolean isGraphic(char);
+ method public static String join(@NonNull CharSequence, @NonNull Object[]);
+ method public static String join(@NonNull CharSequence, @NonNull Iterable);
+ method public static int lastIndexOf(CharSequence, char);
+ method public static int lastIndexOf(CharSequence, char, int);
+ method public static int lastIndexOf(CharSequence, char, int, int);
+ method public static CharSequence listEllipsize(@Nullable android.content.Context, @Nullable java.util.List<java.lang.CharSequence>, @NonNull String, @NonNull android.text.TextPaint, @FloatRange(from=0.0, fromInclusive=false) float, @PluralsRes int);
+ method @NonNull public static CharSequence makeSafeForPresentation(@NonNull String, @IntRange(from=0) int, @FloatRange(from=0) float, int);
+ method public static boolean regionMatches(CharSequence, int, CharSequence, int, int);
+ method public static CharSequence replace(CharSequence, String[], CharSequence[]);
+ method public static String[] split(String, String);
+ method public static String[] split(String, java.util.regex.Pattern);
+ method public static CharSequence stringOrSpannedString(CharSequence);
+ method public static String substring(CharSequence, int, int);
+ method public static void writeToParcel(@Nullable CharSequence, @NonNull android.os.Parcel, int);
field public static final int CAP_MODE_CHARACTERS = 4096; // 0x1000
field public static final int CAP_MODE_SENTENCES = 16384; // 0x4000
field public static final int CAP_MODE_WORDS = 8192; // 0x2000
@@ -45808,35 +46097,33 @@ package android.text {
field public static final int SAFE_STRING_FLAG_TRIM = 1; // 0x1
}
- public static abstract interface TextUtils.EllipsizeCallback {
- method public abstract void ellipsized(int, int);
+ public static interface TextUtils.EllipsizeCallback {
+ method public void ellipsized(int, int);
}
- public static class TextUtils.SimpleStringSplitter implements java.util.Iterator android.text.TextUtils.StringSplitter {
+ public static class TextUtils.SimpleStringSplitter implements java.util.Iterator<java.lang.String> android.text.TextUtils.StringSplitter {
ctor public TextUtils.SimpleStringSplitter(char);
method public boolean hasNext();
method public java.util.Iterator<java.lang.String> iterator();
- method public java.lang.String next();
- method public void setString(java.lang.String);
+ method public String next();
+ method public void setString(String);
}
- public static abstract interface TextUtils.StringSplitter implements java.lang.Iterable {
- method public abstract void setString(java.lang.String);
+ public static interface TextUtils.StringSplitter extends java.lang.Iterable<java.lang.String> {
+ method public void setString(String);
}
- public static final class TextUtils.TruncateAt extends java.lang.Enum {
- method public static android.text.TextUtils.TruncateAt valueOf(java.lang.String);
- method public static final android.text.TextUtils.TruncateAt[] values();
+ public enum TextUtils.TruncateAt {
enum_constant public static final android.text.TextUtils.TruncateAt END;
enum_constant public static final android.text.TextUtils.TruncateAt MARQUEE;
enum_constant public static final android.text.TextUtils.TruncateAt MIDDLE;
enum_constant public static final android.text.TextUtils.TruncateAt START;
}
- public abstract interface TextWatcher implements android.text.NoCopySpan {
- method public abstract void afterTextChanged(android.text.Editable);
- method public abstract void beforeTextChanged(java.lang.CharSequence, int, int, int);
- method public abstract void onTextChanged(java.lang.CharSequence, int, int, int);
+ public interface TextWatcher extends android.text.NoCopySpan {
+ method public void afterTextChanged(android.text.Editable);
+ method public void beforeTextChanged(CharSequence, int, int, int);
+ method public void onTextChanged(CharSequence, int, int, int);
}
}
@@ -45845,10 +46132,10 @@ package android.text.format {
public class DateFormat {
ctor public DateFormat();
- method public static java.lang.CharSequence format(java.lang.CharSequence, long);
- method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
- method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
- method public static java.lang.String getBestDateTimePattern(java.util.Locale, java.lang.String);
+ method public static CharSequence format(CharSequence, long);
+ method public static CharSequence format(CharSequence, java.util.Date);
+ method public static CharSequence format(CharSequence, java.util.Calendar);
+ method public static String getBestDateTimePattern(java.util.Locale, String);
method public static java.text.DateFormat getDateFormat(android.content.Context);
method public static char[] getDateFormatOrder(android.content.Context);
method public static java.text.DateFormat getLongDateFormat(android.content.Context);
@@ -45859,136 +46146,136 @@ package android.text.format {
public class DateUtils {
ctor public DateUtils();
- method public static java.lang.String formatDateRange(android.content.Context, long, long, int);
+ method public static String formatDateRange(android.content.Context, long, long, int);
method public static java.util.Formatter formatDateRange(android.content.Context, java.util.Formatter, long, long, int);
- method public static java.util.Formatter formatDateRange(android.content.Context, java.util.Formatter, long, long, int, java.lang.String);
- method public static java.lang.String formatDateTime(android.content.Context, long, int);
- method public static java.lang.String formatElapsedTime(long);
- method public static java.lang.String formatElapsedTime(java.lang.StringBuilder, long);
- method public static final java.lang.CharSequence formatSameDayTime(long, long, int, int);
- method public static deprecated java.lang.String getAMPMString(int);
- method public static deprecated java.lang.String getDayOfWeekString(int, int);
- method public static deprecated java.lang.String getMonthString(int, int);
- method public static java.lang.CharSequence getRelativeDateTimeString(android.content.Context, long, long, long, int);
- method public static java.lang.CharSequence getRelativeTimeSpanString(long);
- method public static java.lang.CharSequence getRelativeTimeSpanString(long, long, long);
- method public static java.lang.CharSequence getRelativeTimeSpanString(long, long, long, int);
- method public static java.lang.CharSequence getRelativeTimeSpanString(android.content.Context, long, boolean);
- method public static java.lang.CharSequence getRelativeTimeSpanString(android.content.Context, long);
+ method public static java.util.Formatter formatDateRange(android.content.Context, java.util.Formatter, long, long, int, String);
+ method public static String formatDateTime(android.content.Context, long, int);
+ method public static String formatElapsedTime(long);
+ method public static String formatElapsedTime(StringBuilder, long);
+ method public static final CharSequence formatSameDayTime(long, long, int, int);
+ method @Deprecated public static String getAMPMString(int);
+ method @Deprecated public static String getDayOfWeekString(int, int);
+ method @Deprecated public static String getMonthString(int, int);
+ method public static CharSequence getRelativeDateTimeString(android.content.Context, long, long, long, int);
+ method public static CharSequence getRelativeTimeSpanString(long);
+ method public static CharSequence getRelativeTimeSpanString(long, long, long);
+ method public static CharSequence getRelativeTimeSpanString(long, long, long, int);
+ method public static CharSequence getRelativeTimeSpanString(android.content.Context, long, boolean);
+ method public static CharSequence getRelativeTimeSpanString(android.content.Context, long);
method public static boolean isToday(long);
- field public static final deprecated java.lang.String ABBREV_MONTH_FORMAT = "%b";
- field public static final java.lang.String ABBREV_WEEKDAY_FORMAT = "%a";
+ field @Deprecated public static final String ABBREV_MONTH_FORMAT = "%b";
+ field public static final String ABBREV_WEEKDAY_FORMAT = "%a";
field public static final long DAY_IN_MILLIS = 86400000L; // 0x5265c00L
- field public static final deprecated int FORMAT_12HOUR = 64; // 0x40
- field public static final deprecated int FORMAT_24HOUR = 128; // 0x80
+ field @Deprecated public static final int FORMAT_12HOUR = 64; // 0x40
+ field @Deprecated public static final int FORMAT_24HOUR = 128; // 0x80
field public static final int FORMAT_ABBREV_ALL = 524288; // 0x80000
field public static final int FORMAT_ABBREV_MONTH = 65536; // 0x10000
field public static final int FORMAT_ABBREV_RELATIVE = 262144; // 0x40000
field public static final int FORMAT_ABBREV_TIME = 16384; // 0x4000
field public static final int FORMAT_ABBREV_WEEKDAY = 32768; // 0x8000
- field public static final deprecated int FORMAT_CAP_AMPM = 256; // 0x100
- field public static final deprecated int FORMAT_CAP_MIDNIGHT = 4096; // 0x1000
- field public static final deprecated int FORMAT_CAP_NOON = 1024; // 0x400
- field public static final deprecated int FORMAT_CAP_NOON_MIDNIGHT = 5120; // 0x1400
+ field @Deprecated public static final int FORMAT_CAP_AMPM = 256; // 0x100
+ field @Deprecated public static final int FORMAT_CAP_MIDNIGHT = 4096; // 0x1000
+ field @Deprecated public static final int FORMAT_CAP_NOON = 1024; // 0x400
+ field @Deprecated public static final int FORMAT_CAP_NOON_MIDNIGHT = 5120; // 0x1400
field public static final int FORMAT_NO_MIDNIGHT = 2048; // 0x800
field public static final int FORMAT_NO_MONTH_DAY = 32; // 0x20
field public static final int FORMAT_NO_NOON = 512; // 0x200
- field public static final deprecated int FORMAT_NO_NOON_MIDNIGHT = 2560; // 0xa00
+ field @Deprecated public static final int FORMAT_NO_NOON_MIDNIGHT = 2560; // 0xa00
field public static final int FORMAT_NO_YEAR = 8; // 0x8
field public static final int FORMAT_NUMERIC_DATE = 131072; // 0x20000
field public static final int FORMAT_SHOW_DATE = 16; // 0x10
field public static final int FORMAT_SHOW_TIME = 1; // 0x1
field public static final int FORMAT_SHOW_WEEKDAY = 2; // 0x2
field public static final int FORMAT_SHOW_YEAR = 4; // 0x4
- field public static final deprecated int FORMAT_UTC = 8192; // 0x2000
+ field @Deprecated public static final int FORMAT_UTC = 8192; // 0x2000
field public static final long HOUR_IN_MILLIS = 3600000L; // 0x36ee80L
- field public static final deprecated java.lang.String HOUR_MINUTE_24 = "%H:%M";
- field public static final deprecated int LENGTH_LONG = 10; // 0xa
- field public static final deprecated int LENGTH_MEDIUM = 20; // 0x14
- field public static final deprecated int LENGTH_SHORT = 30; // 0x1e
- field public static final deprecated int LENGTH_SHORTER = 40; // 0x28
- field public static final deprecated int LENGTH_SHORTEST = 50; // 0x32
+ field @Deprecated public static final String HOUR_MINUTE_24 = "%H:%M";
+ field @Deprecated public static final int LENGTH_LONG = 10; // 0xa
+ field @Deprecated public static final int LENGTH_MEDIUM = 20; // 0x14
+ field @Deprecated public static final int LENGTH_SHORT = 30; // 0x1e
+ field @Deprecated public static final int LENGTH_SHORTER = 40; // 0x28
+ field @Deprecated public static final int LENGTH_SHORTEST = 50; // 0x32
field public static final long MINUTE_IN_MILLIS = 60000L; // 0xea60L
- field public static final java.lang.String MONTH_DAY_FORMAT = "%-d";
- field public static final java.lang.String MONTH_FORMAT = "%B";
- field public static final java.lang.String NUMERIC_MONTH_FORMAT = "%m";
+ field public static final String MONTH_DAY_FORMAT = "%-d";
+ field public static final String MONTH_FORMAT = "%B";
+ field public static final String NUMERIC_MONTH_FORMAT = "%m";
field public static final long SECOND_IN_MILLIS = 1000L; // 0x3e8L
- field public static final java.lang.String WEEKDAY_FORMAT = "%A";
+ field public static final String WEEKDAY_FORMAT = "%A";
field public static final long WEEK_IN_MILLIS = 604800000L; // 0x240c8400L
- field public static final java.lang.String YEAR_FORMAT = "%Y";
- field public static final java.lang.String YEAR_FORMAT_TWO_DIGITS = "%g";
+ field public static final String YEAR_FORMAT = "%Y";
+ field public static final String YEAR_FORMAT_TWO_DIGITS = "%g";
field public static final long YEAR_IN_MILLIS = 31449600000L; // 0x7528ad000L
- field public static final deprecated int[] sameMonthTable;
- field public static final deprecated int[] sameYearTable;
+ field @Deprecated public static final int[] sameMonthTable;
+ field @Deprecated public static final int[] sameYearTable;
}
public final class Formatter {
ctor public Formatter();
- method public static java.lang.String formatFileSize(android.content.Context, long);
- method public static deprecated java.lang.String formatIpAddress(int);
- method public static java.lang.String formatShortFileSize(android.content.Context, long);
- }
-
- public deprecated class Time {
- ctor public Time(java.lang.String);
- ctor public Time();
- ctor public Time(android.text.format.Time);
- method public boolean after(android.text.format.Time);
- method public boolean before(android.text.format.Time);
- method public void clear(java.lang.String);
- method public static int compare(android.text.format.Time, android.text.format.Time);
- method public java.lang.String format(java.lang.String);
- method public java.lang.String format2445();
- method public java.lang.String format3339(boolean);
- method public int getActualMaximum(int);
- method public static java.lang.String getCurrentTimezone();
- method public static int getJulianDay(long, long);
- method public static int getJulianMondayFromWeeksSinceEpoch(int);
- method public int getWeekNumber();
- method public static int getWeeksSinceEpochFromJulianDay(int, int);
- method public static boolean isEpoch(android.text.format.Time);
- method public long normalize(boolean);
- method public boolean parse(java.lang.String);
- method public boolean parse3339(java.lang.String);
- method public void set(long);
- method public void set(android.text.format.Time);
- method public void set(int, int, int, int, int, int);
- method public void set(int, int, int);
- method public long setJulianDay(int);
- method public void setToNow();
- method public void switchTimezone(java.lang.String);
- method public long toMillis(boolean);
- field public static final int EPOCH_JULIAN_DAY = 2440588; // 0x253d8c
- field public static final int FRIDAY = 5; // 0x5
- field public static final int HOUR = 3; // 0x3
- field public static final int MINUTE = 2; // 0x2
- field public static final int MONDAY = 1; // 0x1
- field public static final int MONDAY_BEFORE_JULIAN_EPOCH = 2440585; // 0x253d89
- field public static final int MONTH = 5; // 0x5
- field public static final int MONTH_DAY = 4; // 0x4
- field public static final int SATURDAY = 6; // 0x6
- field public static final int SECOND = 1; // 0x1
- field public static final int SUNDAY = 0; // 0x0
- field public static final int THURSDAY = 4; // 0x4
- field public static final java.lang.String TIMEZONE_UTC = "UTC";
- field public static final int TUESDAY = 2; // 0x2
- field public static final int WEDNESDAY = 3; // 0x3
- field public static final int WEEK_DAY = 7; // 0x7
- field public static final int WEEK_NUM = 9; // 0x9
- field public static final int YEAR = 6; // 0x6
- field public static final int YEAR_DAY = 8; // 0x8
- field public boolean allDay;
- field public long gmtoff;
- field public int hour;
- field public int isDst;
- field public int minute;
- field public int month;
- field public int monthDay;
- field public int second;
- field public java.lang.String timezone;
- field public int weekDay;
- field public int year;
- field public int yearDay;
+ method public static String formatFileSize(@Nullable android.content.Context, long);
+ method @Deprecated public static String formatIpAddress(int);
+ method public static String formatShortFileSize(@Nullable android.content.Context, long);
+ }
+
+ @Deprecated public class Time {
+ ctor @Deprecated public Time(String);
+ ctor @Deprecated public Time();
+ ctor @Deprecated public Time(android.text.format.Time);
+ method @Deprecated public boolean after(android.text.format.Time);
+ method @Deprecated public boolean before(android.text.format.Time);
+ method @Deprecated public void clear(String);
+ method @Deprecated public static int compare(android.text.format.Time, android.text.format.Time);
+ method @Deprecated public String format(String);
+ method @Deprecated public String format2445();
+ method @Deprecated public String format3339(boolean);
+ method @Deprecated public int getActualMaximum(int);
+ method @Deprecated public static String getCurrentTimezone();
+ method @Deprecated public static int getJulianDay(long, long);
+ method @Deprecated public static int getJulianMondayFromWeeksSinceEpoch(int);
+ method @Deprecated public int getWeekNumber();
+ method @Deprecated public static int getWeeksSinceEpochFromJulianDay(int, int);
+ method @Deprecated public static boolean isEpoch(android.text.format.Time);
+ method @Deprecated public long normalize(boolean);
+ method @Deprecated public boolean parse(String);
+ method @Deprecated public boolean parse3339(String);
+ method @Deprecated public void set(long);
+ method @Deprecated public void set(android.text.format.Time);
+ method @Deprecated public void set(int, int, int, int, int, int);
+ method @Deprecated public void set(int, int, int);
+ method @Deprecated public long setJulianDay(int);
+ method @Deprecated public void setToNow();
+ method @Deprecated public void switchTimezone(String);
+ method @Deprecated public long toMillis(boolean);
+ field @Deprecated public static final int EPOCH_JULIAN_DAY = 2440588; // 0x253d8c
+ field @Deprecated public static final int FRIDAY = 5; // 0x5
+ field @Deprecated public static final int HOUR = 3; // 0x3
+ field @Deprecated public static final int MINUTE = 2; // 0x2
+ field @Deprecated public static final int MONDAY = 1; // 0x1
+ field @Deprecated public static final int MONDAY_BEFORE_JULIAN_EPOCH = 2440585; // 0x253d89
+ field @Deprecated public static final int MONTH = 5; // 0x5
+ field @Deprecated public static final int MONTH_DAY = 4; // 0x4
+ field @Deprecated public static final int SATURDAY = 6; // 0x6
+ field @Deprecated public static final int SECOND = 1; // 0x1
+ field @Deprecated public static final int SUNDAY = 0; // 0x0
+ field @Deprecated public static final int THURSDAY = 4; // 0x4
+ field @Deprecated public static final String TIMEZONE_UTC = "UTC";
+ field @Deprecated public static final int TUESDAY = 2; // 0x2
+ field @Deprecated public static final int WEDNESDAY = 3; // 0x3
+ field @Deprecated public static final int WEEK_DAY = 7; // 0x7
+ field @Deprecated public static final int WEEK_NUM = 9; // 0x9
+ field @Deprecated public static final int YEAR = 6; // 0x6
+ field @Deprecated public static final int YEAR_DAY = 8; // 0x8
+ field @Deprecated public boolean allDay;
+ field @Deprecated public long gmtoff;
+ field @Deprecated public int hour;
+ field @Deprecated public int isDst;
+ field @Deprecated public int minute;
+ field @Deprecated public int month;
+ field @Deprecated public int monthDay;
+ field @Deprecated public int second;
+ field @Deprecated public String timezone;
+ field @Deprecated public int weekDay;
+ field @Deprecated public int year;
+ field @Deprecated public int yearDay;
}
}
@@ -46035,29 +46322,29 @@ package android.text.method {
}
public class CharacterPickerDialog extends android.app.Dialog implements android.widget.AdapterView.OnItemClickListener android.view.View.OnClickListener {
- ctor public CharacterPickerDialog(android.content.Context, android.view.View, android.text.Editable, java.lang.String, boolean);
+ ctor public CharacterPickerDialog(android.content.Context, android.view.View, android.text.Editable, String, boolean);
method public void onClick(android.view.View);
method public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
}
public class DateKeyListener extends android.text.method.NumberKeyListener {
- ctor public deprecated DateKeyListener();
- ctor public DateKeyListener(java.util.Locale);
- method protected char[] getAcceptedChars();
+ ctor @Deprecated public DateKeyListener();
+ ctor public DateKeyListener(@Nullable java.util.Locale);
+ method @NonNull protected char[] getAcceptedChars();
method public int getInputType();
- method public static deprecated android.text.method.DateKeyListener getInstance();
- method public static android.text.method.DateKeyListener getInstance(java.util.Locale);
- field public static final deprecated char[] CHARACTERS;
+ method @Deprecated @NonNull public static android.text.method.DateKeyListener getInstance();
+ method @NonNull public static android.text.method.DateKeyListener getInstance(@Nullable java.util.Locale);
+ field @Deprecated public static final char[] CHARACTERS;
}
public class DateTimeKeyListener extends android.text.method.NumberKeyListener {
- ctor public deprecated DateTimeKeyListener();
- ctor public DateTimeKeyListener(java.util.Locale);
- method protected char[] getAcceptedChars();
+ ctor @Deprecated public DateTimeKeyListener();
+ ctor public DateTimeKeyListener(@Nullable java.util.Locale);
+ method @NonNull protected char[] getAcceptedChars();
method public int getInputType();
- method public static deprecated android.text.method.DateTimeKeyListener getInstance();
- method public static android.text.method.DateTimeKeyListener getInstance(java.util.Locale);
- field public static final deprecated char[] CHARACTERS;
+ method @Deprecated @NonNull public static android.text.method.DateTimeKeyListener getInstance();
+ method @NonNull public static android.text.method.DateTimeKeyListener getInstance(@Nullable java.util.Locale);
+ field @Deprecated public static final char[] CHARACTERS;
}
public class DialerKeyListener extends android.text.method.NumberKeyListener {
@@ -46069,17 +46356,17 @@ package android.text.method {
}
public class DigitsKeyListener extends android.text.method.NumberKeyListener {
- ctor public deprecated DigitsKeyListener();
- ctor public deprecated DigitsKeyListener(boolean, boolean);
- ctor public DigitsKeyListener(java.util.Locale);
- ctor public DigitsKeyListener(java.util.Locale, boolean, boolean);
+ ctor @Deprecated public DigitsKeyListener();
+ ctor @Deprecated public DigitsKeyListener(boolean, boolean);
+ ctor public DigitsKeyListener(@Nullable java.util.Locale);
+ ctor public DigitsKeyListener(@Nullable java.util.Locale, boolean, boolean);
method protected char[] getAcceptedChars();
method public int getInputType();
- method public static deprecated android.text.method.DigitsKeyListener getInstance();
- method public static deprecated android.text.method.DigitsKeyListener getInstance(boolean, boolean);
- method public static android.text.method.DigitsKeyListener getInstance(java.util.Locale);
- method public static android.text.method.DigitsKeyListener getInstance(java.util.Locale, boolean, boolean);
- method public static android.text.method.DigitsKeyListener getInstance(java.lang.String);
+ method @Deprecated @NonNull public static android.text.method.DigitsKeyListener getInstance();
+ method @Deprecated @NonNull public static android.text.method.DigitsKeyListener getInstance(boolean, boolean);
+ method @NonNull public static android.text.method.DigitsKeyListener getInstance(@Nullable java.util.Locale);
+ method @NonNull public static android.text.method.DigitsKeyListener getInstance(@Nullable java.util.Locale, boolean, boolean);
+ method @NonNull public static android.text.method.DigitsKeyListener getInstance(@NonNull String);
}
public class HideReturnsTransformationMethod extends android.text.method.ReplacementTransformationMethod {
@@ -46089,12 +46376,12 @@ package android.text.method {
method protected char[] getReplacement();
}
- public abstract interface KeyListener {
- method public abstract void clearMetaKeyState(android.view.View, android.text.Editable, int);
- method public abstract int getInputType();
- method public abstract boolean onKeyDown(android.view.View, android.text.Editable, int, android.view.KeyEvent);
- method public abstract boolean onKeyOther(android.view.View, android.text.Editable, android.view.KeyEvent);
- method public abstract boolean onKeyUp(android.view.View, android.text.Editable, int, android.view.KeyEvent);
+ public interface KeyListener {
+ method public void clearMetaKeyState(android.view.View, android.text.Editable, int);
+ method public int getInputType();
+ method public boolean onKeyDown(android.view.View, android.text.Editable, int, android.view.KeyEvent);
+ method public boolean onKeyOther(android.view.View, android.text.Editable, android.view.KeyEvent);
+ method public boolean onKeyUp(android.view.View, android.text.Editable, int, android.view.KeyEvent);
}
public class LinkMovementMethod extends android.text.method.ScrollingMovementMethod {
@@ -46109,16 +46396,16 @@ package android.text.method {
method public void clearMetaKeyState(android.view.View, android.text.Editable, int);
method public static void clearMetaKeyState(android.text.Editable, int);
method public long clearMetaKeyState(long, int);
- method public static final int getMetaState(java.lang.CharSequence);
- method public static final int getMetaState(java.lang.CharSequence, android.view.KeyEvent);
- method public static final int getMetaState(java.lang.CharSequence, int);
- method public static final int getMetaState(java.lang.CharSequence, int, android.view.KeyEvent);
+ method public static final int getMetaState(CharSequence);
+ method public static final int getMetaState(CharSequence, android.view.KeyEvent);
+ method public static final int getMetaState(CharSequence, int);
+ method public static final int getMetaState(CharSequence, int, android.view.KeyEvent);
method public static final int getMetaState(long);
method public static final int getMetaState(long, int);
method public static long handleKeyDown(long, int, android.view.KeyEvent);
method public static long handleKeyUp(long, int, android.view.KeyEvent);
- method public static boolean isMetaTracker(java.lang.CharSequence, java.lang.Object);
- method public static boolean isSelectingMetaTracker(java.lang.CharSequence, java.lang.Object);
+ method public static boolean isMetaTracker(CharSequence, Object);
+ method public static boolean isSelectingMetaTracker(CharSequence, Object);
method public boolean onKeyDown(android.view.View, android.text.Editable, int, android.view.KeyEvent);
method public boolean onKeyUp(android.view.View, android.text.Editable, int, android.view.KeyEvent);
method protected static void resetLockedMeta(android.text.Spannable);
@@ -46132,31 +46419,31 @@ package android.text.method {
field public static final int META_SYM_ON = 4; // 0x4
}
- public abstract interface MovementMethod {
- method public abstract boolean canSelectArbitrarily();
- method public abstract void initialize(android.widget.TextView, android.text.Spannable);
- method public abstract boolean onGenericMotionEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
- method public abstract boolean onKeyDown(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
- method public abstract boolean onKeyOther(android.widget.TextView, android.text.Spannable, android.view.KeyEvent);
- method public abstract boolean onKeyUp(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
- method public abstract void onTakeFocus(android.widget.TextView, android.text.Spannable, int);
- method public abstract boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
- method public abstract boolean onTrackballEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
+ public interface MovementMethod {
+ method public boolean canSelectArbitrarily();
+ method public void initialize(android.widget.TextView, android.text.Spannable);
+ method public boolean onGenericMotionEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
+ method public boolean onKeyDown(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
+ method public boolean onKeyOther(android.widget.TextView, android.text.Spannable, android.view.KeyEvent);
+ method public boolean onKeyUp(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
+ method public void onTakeFocus(android.widget.TextView, android.text.Spannable, int);
+ method public boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
+ method public boolean onTrackballEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
}
public class MultiTapKeyListener extends android.text.method.BaseKeyListener implements android.text.SpanWatcher {
ctor public MultiTapKeyListener(android.text.method.TextKeyListener.Capitalize, boolean);
method public int getInputType();
method public static android.text.method.MultiTapKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
- method public void onSpanAdded(android.text.Spannable, java.lang.Object, int, int);
- method public void onSpanChanged(android.text.Spannable, java.lang.Object, int, int, int, int);
- method public void onSpanRemoved(android.text.Spannable, java.lang.Object, int, int);
+ method public void onSpanAdded(android.text.Spannable, Object, int, int);
+ method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
+ method public void onSpanRemoved(android.text.Spannable, Object, int, int);
}
public abstract class NumberKeyListener extends android.text.method.BaseKeyListener implements android.text.InputFilter {
ctor public NumberKeyListener();
- method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
- method protected abstract char[] getAcceptedChars();
+ method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
+ method @NonNull protected abstract char[] getAcceptedChars();
method protected int lookup(android.view.KeyEvent, android.text.Spannable);
method protected static boolean ok(char[], char);
}
@@ -46164,11 +46451,11 @@ package android.text.method {
public class PasswordTransformationMethod implements android.text.TextWatcher android.text.method.TransformationMethod {
ctor public PasswordTransformationMethod();
method public void afterTextChanged(android.text.Editable);
- method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
+ method public void beforeTextChanged(CharSequence, int, int, int);
method public static android.text.method.PasswordTransformationMethod getInstance();
- method public java.lang.CharSequence getTransformation(java.lang.CharSequence, android.view.View);
- method public void onFocusChanged(android.view.View, java.lang.CharSequence, boolean, int, android.graphics.Rect);
- method public void onTextChanged(java.lang.CharSequence, int, int, int);
+ method public CharSequence getTransformation(CharSequence, android.view.View);
+ method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
+ method public void onTextChanged(CharSequence, int, int, int);
}
public class QwertyKeyListener extends android.text.method.BaseKeyListener {
@@ -46176,15 +46463,15 @@ package android.text.method {
method public int getInputType();
method public static android.text.method.QwertyKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
method public static android.text.method.QwertyKeyListener getInstanceForFullKeyboard();
- method public static void markAsReplaced(android.text.Spannable, int, int, java.lang.String);
+ method public static void markAsReplaced(android.text.Spannable, int, int, String);
}
public abstract class ReplacementTransformationMethod implements android.text.method.TransformationMethod {
ctor public ReplacementTransformationMethod();
method protected abstract char[] getOriginal();
method protected abstract char[] getReplacement();
- method public java.lang.CharSequence getTransformation(java.lang.CharSequence, android.view.View);
- method public void onFocusChanged(android.view.View, java.lang.CharSequence, boolean, int, android.graphics.Rect);
+ method public CharSequence getTransformation(CharSequence, android.view.View);
+ method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
}
public class ScrollingMovementMethod extends android.text.method.BaseMovementMethod implements android.text.method.MovementMethod {
@@ -46205,16 +46492,14 @@ package android.text.method {
method public int getInputType();
method public static android.text.method.TextKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
method public static android.text.method.TextKeyListener getInstance();
- method public void onSpanAdded(android.text.Spannable, java.lang.Object, int, int);
- method public void onSpanChanged(android.text.Spannable, java.lang.Object, int, int, int, int);
- method public void onSpanRemoved(android.text.Spannable, java.lang.Object, int, int);
+ method public void onSpanAdded(android.text.Spannable, Object, int, int);
+ method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
+ method public void onSpanRemoved(android.text.Spannable, Object, int, int);
method public void release();
- method public static boolean shouldCap(android.text.method.TextKeyListener.Capitalize, java.lang.CharSequence, int);
+ method public static boolean shouldCap(android.text.method.TextKeyListener.Capitalize, CharSequence, int);
}
- public static final class TextKeyListener.Capitalize extends java.lang.Enum {
- method public static android.text.method.TextKeyListener.Capitalize valueOf(java.lang.String);
- method public static final android.text.method.TextKeyListener.Capitalize[] values();
+ public enum TextKeyListener.Capitalize {
enum_constant public static final android.text.method.TextKeyListener.Capitalize CHARACTERS;
enum_constant public static final android.text.method.TextKeyListener.Capitalize NONE;
enum_constant public static final android.text.method.TextKeyListener.Capitalize SENTENCES;
@@ -46222,13 +46507,13 @@ package android.text.method {
}
public class TimeKeyListener extends android.text.method.NumberKeyListener {
- ctor public deprecated TimeKeyListener();
- ctor public TimeKeyListener(java.util.Locale);
- method protected char[] getAcceptedChars();
+ ctor @Deprecated public TimeKeyListener();
+ ctor public TimeKeyListener(@Nullable java.util.Locale);
+ method @NonNull protected char[] getAcceptedChars();
method public int getInputType();
- method public static deprecated android.text.method.TimeKeyListener getInstance();
- method public static android.text.method.TimeKeyListener getInstance(java.util.Locale);
- field public static final deprecated char[] CHARACTERS;
+ method @Deprecated @NonNull public static android.text.method.TimeKeyListener getInstance();
+ method @NonNull public static android.text.method.TimeKeyListener getInstance(@Nullable java.util.Locale);
+ field @Deprecated public static final char[] CHARACTERS;
}
public class Touch {
@@ -46238,9 +46523,9 @@ package android.text.method {
method public static void scrollTo(android.widget.TextView, android.text.Layout, int, int);
}
- public abstract interface TransformationMethod {
- method public abstract java.lang.CharSequence getTransformation(java.lang.CharSequence, android.view.View);
- method public abstract void onFocusChanged(android.view.View, java.lang.CharSequence, boolean, int, android.graphics.Rect);
+ public interface TransformationMethod {
+ method public CharSequence getTransformation(CharSequence, android.view.View);
+ method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
}
}
@@ -46250,53 +46535,53 @@ package android.text.style {
public class AbsoluteSizeSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public AbsoluteSizeSpan(int);
ctor public AbsoluteSizeSpan(int, boolean);
- ctor public AbsoluteSizeSpan(android.os.Parcel);
+ ctor public AbsoluteSizeSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public boolean getDip();
method public int getSize();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void updateMeasureState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void updateMeasureState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
- public abstract interface AlignmentSpan implements android.text.style.ParagraphStyle {
- method public abstract android.text.Layout.Alignment getAlignment();
+ public interface AlignmentSpan extends android.text.style.ParagraphStyle {
+ method public android.text.Layout.Alignment getAlignment();
}
public static class AlignmentSpan.Standard implements android.text.style.AlignmentSpan android.text.ParcelableSpan {
- ctor public AlignmentSpan.Standard(android.text.Layout.Alignment);
- ctor public AlignmentSpan.Standard(android.os.Parcel);
+ ctor public AlignmentSpan.Standard(@NonNull android.text.Layout.Alignment);
+ ctor public AlignmentSpan.Standard(@NonNull android.os.Parcel);
method public int describeContents();
method public android.text.Layout.Alignment getAlignment();
method public int getSpanTypeId();
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class BackgroundColorSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
- ctor public BackgroundColorSpan(int);
- ctor public BackgroundColorSpan(android.os.Parcel);
+ ctor public BackgroundColorSpan(@ColorInt int);
+ ctor public BackgroundColorSpan(@NonNull android.os.Parcel);
method public int describeContents();
- method public int getBackgroundColor();
+ method @ColorInt public int getBackgroundColor();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class BulletSpan implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
ctor public BulletSpan();
ctor public BulletSpan(int);
- ctor public BulletSpan(int, int);
- ctor public BulletSpan(int, int, int);
- ctor public BulletSpan(android.os.Parcel);
+ ctor public BulletSpan(int, @ColorInt int);
+ ctor public BulletSpan(int, @ColorInt int, @IntRange(from=0) int);
+ ctor public BulletSpan(@NonNull android.os.Parcel);
method public int describeContents();
- method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
+ method public void drawLeadingMargin(@NonNull android.graphics.Canvas, @NonNull android.graphics.Paint, int, int, int, int, int, @NonNull CharSequence, int, int, boolean, @Nullable android.text.Layout);
method public int getBulletRadius();
method public int getColor();
method public int getGapWidth();
method public int getLeadingMargin(boolean);
method public int getSpanTypeId();
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final int STANDARD_GAP_WIDTH = 2; // 0x2
}
@@ -46309,24 +46594,24 @@ package android.text.style {
public abstract class ClickableSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateAppearance {
ctor public ClickableSpan();
- method public abstract void onClick(android.view.View);
- method public void updateDrawState(android.text.TextPaint);
+ method public abstract void onClick(@NonNull android.view.View);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
}
public class DrawableMarginSpan implements android.text.style.LeadingMarginSpan android.text.style.LineHeightSpan {
- ctor public DrawableMarginSpan(android.graphics.drawable.Drawable);
- ctor public DrawableMarginSpan(android.graphics.drawable.Drawable, int);
- method public void chooseHeight(java.lang.CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
- method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
+ ctor public DrawableMarginSpan(@NonNull android.graphics.drawable.Drawable);
+ ctor public DrawableMarginSpan(@NonNull android.graphics.drawable.Drawable, int);
+ method public void chooseHeight(@NonNull CharSequence, int, int, int, int, @NonNull android.graphics.Paint.FontMetricsInt);
+ method public void drawLeadingMargin(@NonNull android.graphics.Canvas, @NonNull android.graphics.Paint, int, int, int, int, int, @NonNull CharSequence, int, int, boolean, @NonNull android.text.Layout);
method public int getLeadingMargin(boolean);
}
public abstract class DynamicDrawableSpan extends android.text.style.ReplacementSpan {
ctor public DynamicDrawableSpan();
ctor protected DynamicDrawableSpan(int);
- method public void draw(android.graphics.Canvas, java.lang.CharSequence, int, int, float, int, int, int, android.graphics.Paint);
+ method public void draw(@NonNull android.graphics.Canvas, CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, float, int, int, int, @NonNull android.graphics.Paint);
method public abstract android.graphics.drawable.Drawable getDrawable();
- method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
+ method public int getSize(@NonNull android.graphics.Paint, CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.graphics.Paint.FontMetricsInt);
method public int getVerticalAlignment();
field public static final int ALIGN_BASELINE = 1; // 0x1
field public static final int ALIGN_BOTTOM = 0; // 0x0
@@ -46336,57 +46621,57 @@ package android.text.style {
public class EasyEditSpan implements android.text.ParcelableSpan {
ctor public EasyEditSpan();
ctor public EasyEditSpan(android.app.PendingIntent);
- ctor public EasyEditSpan(android.os.Parcel);
+ ctor public EasyEditSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String EXTRA_TEXT_CHANGED_TYPE = "android.text.style.EXTRA_TEXT_CHANGED_TYPE";
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final String EXTRA_TEXT_CHANGED_TYPE = "android.text.style.EXTRA_TEXT_CHANGED_TYPE";
field public static final int TEXT_DELETED = 1; // 0x1
field public static final int TEXT_MODIFIED = 2; // 0x2
}
public class ForegroundColorSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
- ctor public ForegroundColorSpan(int);
- ctor public ForegroundColorSpan(android.os.Parcel);
+ ctor public ForegroundColorSpan(@ColorInt int);
+ ctor public ForegroundColorSpan(@NonNull android.os.Parcel);
method public int describeContents();
- method public int getForegroundColor();
+ method @ColorInt public int getForegroundColor();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class IconMarginSpan implements android.text.style.LeadingMarginSpan android.text.style.LineHeightSpan {
- ctor public IconMarginSpan(android.graphics.Bitmap);
- ctor public IconMarginSpan(android.graphics.Bitmap, int);
- method public void chooseHeight(java.lang.CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
- method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
+ ctor public IconMarginSpan(@NonNull android.graphics.Bitmap);
+ ctor public IconMarginSpan(@NonNull android.graphics.Bitmap, @IntRange(from=0) int);
+ method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
+ method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
method public int getLeadingMargin(boolean);
}
public class ImageSpan extends android.text.style.DynamicDrawableSpan {
- ctor public deprecated ImageSpan(android.graphics.Bitmap);
- ctor public deprecated ImageSpan(android.graphics.Bitmap, int);
- ctor public ImageSpan(android.content.Context, android.graphics.Bitmap);
- ctor public ImageSpan(android.content.Context, android.graphics.Bitmap, int);
- ctor public ImageSpan(android.graphics.drawable.Drawable);
- ctor public ImageSpan(android.graphics.drawable.Drawable, int);
- ctor public ImageSpan(android.graphics.drawable.Drawable, java.lang.String);
- ctor public ImageSpan(android.graphics.drawable.Drawable, java.lang.String, int);
- ctor public ImageSpan(android.content.Context, android.net.Uri);
- ctor public ImageSpan(android.content.Context, android.net.Uri, int);
- ctor public ImageSpan(android.content.Context, int);
- ctor public ImageSpan(android.content.Context, int, int);
+ ctor @Deprecated public ImageSpan(@NonNull android.graphics.Bitmap);
+ ctor @Deprecated public ImageSpan(@NonNull android.graphics.Bitmap, int);
+ ctor public ImageSpan(@NonNull android.content.Context, @NonNull android.graphics.Bitmap);
+ ctor public ImageSpan(@NonNull android.content.Context, @NonNull android.graphics.Bitmap, int);
+ ctor public ImageSpan(@NonNull android.graphics.drawable.Drawable);
+ ctor public ImageSpan(@NonNull android.graphics.drawable.Drawable, int);
+ ctor public ImageSpan(@NonNull android.graphics.drawable.Drawable, @NonNull String);
+ ctor public ImageSpan(@NonNull android.graphics.drawable.Drawable, @NonNull String, int);
+ ctor public ImageSpan(@NonNull android.content.Context, @NonNull android.net.Uri);
+ ctor public ImageSpan(@NonNull android.content.Context, @NonNull android.net.Uri, int);
+ ctor public ImageSpan(@NonNull android.content.Context, @DrawableRes int);
+ ctor public ImageSpan(@NonNull android.content.Context, @DrawableRes int, int);
method public android.graphics.drawable.Drawable getDrawable();
- method public java.lang.String getSource();
+ method @Nullable public String getSource();
}
- public abstract interface LeadingMarginSpan implements android.text.style.ParagraphStyle {
- method public abstract void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
- method public abstract int getLeadingMargin(boolean);
+ public interface LeadingMarginSpan extends android.text.style.ParagraphStyle {
+ method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
+ method public int getLeadingMargin(boolean);
}
- public static abstract interface LeadingMarginSpan.LeadingMarginSpan2 implements android.text.style.LeadingMarginSpan android.text.style.WrapTogetherSpan {
- method public abstract int getLeadingMarginLineCount();
+ public static interface LeadingMarginSpan.LeadingMarginSpan2 extends android.text.style.LeadingMarginSpan android.text.style.WrapTogetherSpan {
+ method public int getLeadingMarginLineCount();
}
public static class LeadingMarginSpan.Standard implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
@@ -46394,51 +46679,51 @@ package android.text.style {
ctor public LeadingMarginSpan.Standard(int);
ctor public LeadingMarginSpan.Standard(android.os.Parcel);
method public int describeContents();
- method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
+ method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
method public int getLeadingMargin(boolean);
method public int getSpanTypeId();
method public void writeToParcel(android.os.Parcel, int);
}
- public abstract interface LineBackgroundSpan implements android.text.style.ParagraphStyle {
- method public abstract void drawBackground(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, int);
+ public interface LineBackgroundSpan extends android.text.style.ParagraphStyle {
+ method public void drawBackground(@NonNull android.graphics.Canvas, @NonNull android.graphics.Paint, @Px int, @Px int, @Px int, @Px int, @Px int, @NonNull CharSequence, int, int, int);
}
public static class LineBackgroundSpan.Standard implements android.text.style.LineBackgroundSpan android.text.ParcelableSpan {
- ctor public LineBackgroundSpan.Standard(int);
- ctor public LineBackgroundSpan.Standard(android.os.Parcel);
+ ctor public LineBackgroundSpan.Standard(@ColorInt int);
+ ctor public LineBackgroundSpan.Standard(@NonNull android.os.Parcel);
method public int describeContents();
- method public void drawBackground(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, int);
- method public final int getColor();
+ method public void drawBackground(@NonNull android.graphics.Canvas, @NonNull android.graphics.Paint, @Px int, @Px int, @Px int, @Px int, @Px int, @NonNull CharSequence, int, int, int);
+ method @ColorInt public final int getColor();
method public int getSpanTypeId();
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
- public abstract interface LineHeightSpan implements android.text.style.ParagraphStyle android.text.style.WrapTogetherSpan {
- method public abstract void chooseHeight(java.lang.CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
+ public interface LineHeightSpan extends android.text.style.ParagraphStyle android.text.style.WrapTogetherSpan {
+ method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
}
public static class LineHeightSpan.Standard implements android.text.style.LineHeightSpan android.text.ParcelableSpan {
- ctor public LineHeightSpan.Standard(int);
+ ctor public LineHeightSpan.Standard(@Px @IntRange(from=1) int);
ctor public LineHeightSpan.Standard(android.os.Parcel);
- method public void chooseHeight(java.lang.CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
+ method public void chooseHeight(@NonNull CharSequence, int, int, int, int, @NonNull android.graphics.Paint.FontMetricsInt);
method public int describeContents();
- method public int getHeight();
+ method @Px public int getHeight();
method public int getSpanTypeId();
method public void writeToParcel(android.os.Parcel, int);
}
- public static abstract interface LineHeightSpan.WithDensity implements android.text.style.LineHeightSpan {
- method public abstract void chooseHeight(java.lang.CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt, android.text.TextPaint);
+ public static interface LineHeightSpan.WithDensity extends android.text.style.LineHeightSpan {
+ method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt, android.text.TextPaint);
}
public class LocaleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
- ctor public LocaleSpan(java.util.Locale);
- ctor public LocaleSpan(android.os.LocaleList);
+ ctor public LocaleSpan(@Nullable java.util.Locale);
+ ctor public LocaleSpan(@NonNull android.os.LocaleList);
ctor public LocaleSpan(android.os.Parcel);
method public int describeContents();
- method public java.util.Locale getLocale();
- method public android.os.LocaleList getLocales();
+ method @Nullable public java.util.Locale getLocale();
+ method @NonNull public android.os.LocaleList getLocales();
method public int getSpanTypeId();
method public void updateDrawState(android.text.TextPaint);
method public void updateMeasureState(android.text.TextPaint);
@@ -46454,72 +46739,72 @@ package android.text.style {
public abstract class MetricAffectingSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateLayout {
ctor public MetricAffectingSpan();
method public android.text.style.MetricAffectingSpan getUnderlying();
- method public abstract void updateMeasureState(android.text.TextPaint);
+ method public abstract void updateMeasureState(@NonNull android.text.TextPaint);
}
- public abstract interface ParagraphStyle {
+ public interface ParagraphStyle {
}
public class QuoteSpan implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
ctor public QuoteSpan();
- ctor public QuoteSpan(int);
- ctor public QuoteSpan(int, int, int);
- ctor public QuoteSpan(android.os.Parcel);
+ ctor public QuoteSpan(@ColorInt int);
+ ctor public QuoteSpan(@ColorInt int, @IntRange(from=0) int, @IntRange(from=0) int);
+ ctor public QuoteSpan(@NonNull android.os.Parcel);
method public int describeContents();
- method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, java.lang.CharSequence, int, int, boolean, android.text.Layout);
- method public int getColor();
+ method public void drawLeadingMargin(@NonNull android.graphics.Canvas, @NonNull android.graphics.Paint, int, int, int, int, int, @NonNull CharSequence, int, int, boolean, @NonNull android.text.Layout);
+ method @ColorInt public int getColor();
method public int getGapWidth();
method public int getLeadingMargin(boolean);
method public int getSpanTypeId();
method public int getStripeWidth();
method public void writeToParcel(android.os.Parcel, int);
- field public static final int STANDARD_COLOR = -16776961; // 0xff0000ff
+ field @ColorInt public static final int STANDARD_COLOR = -16776961; // 0xff0000ff
field public static final int STANDARD_GAP_WIDTH_PX = 2; // 0x2
field public static final int STANDARD_STRIPE_WIDTH_PX = 2; // 0x2
}
public class RelativeSizeSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
- ctor public RelativeSizeSpan(float);
- ctor public RelativeSizeSpan(android.os.Parcel);
+ ctor public RelativeSizeSpan(@FloatRange(from=0) float);
+ ctor public RelativeSizeSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public float getSizeChange();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void updateMeasureState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void updateMeasureState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public abstract class ReplacementSpan extends android.text.style.MetricAffectingSpan {
ctor public ReplacementSpan();
- method public abstract void draw(android.graphics.Canvas, java.lang.CharSequence, int, int, float, int, int, int, android.graphics.Paint);
- method public abstract int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
+ method public abstract void draw(@NonNull android.graphics.Canvas, CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, float, int, int, int, @NonNull android.graphics.Paint);
+ method public abstract int getSize(@NonNull android.graphics.Paint, CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.graphics.Paint.FontMetricsInt);
method public void updateDrawState(android.text.TextPaint);
method public void updateMeasureState(android.text.TextPaint);
}
public class ScaleXSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
- ctor public ScaleXSpan(float);
- ctor public ScaleXSpan(android.os.Parcel);
+ ctor public ScaleXSpan(@FloatRange(from=0) float);
+ ctor public ScaleXSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public float getScaleX();
method public int getSpanTypeId();
method public void updateDrawState(android.text.TextPaint);
method public void updateMeasureState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class StrikethroughSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
ctor public StrikethroughSpan();
- ctor public StrikethroughSpan(android.os.Parcel);
+ ctor public StrikethroughSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class StyleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public StyleSpan(int);
- ctor public StyleSpan(android.os.Parcel);
+ ctor public StyleSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
method public int getStyle();
@@ -46530,68 +46815,68 @@ package android.text.style {
public class SubscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public SubscriptSpan();
- ctor public SubscriptSpan(android.os.Parcel);
+ ctor public SubscriptSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void updateMeasureState(android.text.TextPaint);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void updateMeasureState(@NonNull android.text.TextPaint);
method public void writeToParcel(android.os.Parcel, int);
}
public class SuggestionSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan {
- ctor public SuggestionSpan(android.content.Context, java.lang.String[], int);
- ctor public SuggestionSpan(java.util.Locale, java.lang.String[], int);
- ctor public SuggestionSpan(android.content.Context, java.util.Locale, java.lang.String[], int, java.lang.Class<?>);
+ ctor public SuggestionSpan(android.content.Context, String[], int);
+ ctor public SuggestionSpan(java.util.Locale, String[], int);
+ ctor public SuggestionSpan(android.content.Context, java.util.Locale, String[], int, Class<?>);
ctor public SuggestionSpan(android.os.Parcel);
method public int describeContents();
method public int getFlags();
- method public deprecated java.lang.String getLocale();
- method public java.util.Locale getLocaleObject();
+ method @Deprecated @NonNull public String getLocale();
+ method @Nullable public java.util.Locale getLocaleObject();
method public int getSpanTypeId();
- method public java.lang.String[] getSuggestions();
- method public int getUnderlineColor();
+ method public String[] getSuggestions();
+ method @ColorInt public int getUnderlineColor();
method public void setFlags(int);
method public void updateDrawState(android.text.TextPaint);
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
+ field @Deprecated public static final String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
field public static final android.os.Parcelable.Creator<android.text.style.SuggestionSpan> CREATOR;
field public static final int FLAG_AUTO_CORRECTION = 4; // 0x4
field public static final int FLAG_EASY_CORRECT = 1; // 0x1
field public static final int FLAG_MISSPELLED = 2; // 0x2
field public static final int SUGGESTIONS_MAX_SIZE = 5; // 0x5
- field public static final java.lang.String SUGGESTION_SPAN_PICKED_AFTER = "after";
- field public static final java.lang.String SUGGESTION_SPAN_PICKED_BEFORE = "before";
- field public static final java.lang.String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
+ field @Deprecated public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
+ field @Deprecated public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+ field @Deprecated public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
}
public class SuperscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public SuperscriptSpan();
- ctor public SuperscriptSpan(android.os.Parcel);
+ ctor public SuperscriptSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void updateMeasureState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void updateMeasureState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
- public abstract interface TabStopSpan implements android.text.style.ParagraphStyle {
- method public abstract int getTabStop();
+ public interface TabStopSpan extends android.text.style.ParagraphStyle {
+ method public int getTabStop();
}
public static class TabStopSpan.Standard implements android.text.style.TabStopSpan {
- ctor public TabStopSpan.Standard(int);
+ ctor public TabStopSpan.Standard(@IntRange(from=0) int);
method public int getTabStop();
}
public class TextAppearanceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public TextAppearanceSpan(android.content.Context, int);
ctor public TextAppearanceSpan(android.content.Context, int, int);
- ctor public TextAppearanceSpan(java.lang.String, int, int, android.content.res.ColorStateList, android.content.res.ColorStateList);
+ ctor public TextAppearanceSpan(String, int, int, android.content.res.ColorStateList, android.content.res.ColorStateList);
ctor public TextAppearanceSpan(android.os.Parcel);
method public int describeContents();
- method public java.lang.String getFamily();
- method public java.lang.String getFontFeatureSettings();
- method public java.lang.String getFontVariationSettings();
+ method public String getFamily();
+ method @Nullable public String getFontFeatureSettings();
+ method @Nullable public String getFontVariationSettings();
method public android.content.res.ColorStateList getLinkTextColor();
method public int getShadowColor();
method public float getShadowDx();
@@ -46600,10 +46885,10 @@ package android.text.style {
method public int getSpanTypeId();
method public android.content.res.ColorStateList getTextColor();
method public int getTextFontWeight();
- method public android.os.LocaleList getTextLocales();
+ method @Nullable public android.os.LocaleList getTextLocales();
method public int getTextSize();
method public int getTextStyle();
- method public android.graphics.Typeface getTypeface();
+ method @Nullable public android.graphics.Typeface getTypeface();
method public boolean isElegantTextHeight();
method public void updateDrawState(android.text.TextPaint);
method public void updateMeasureState(android.text.TextPaint);
@@ -46611,58 +46896,58 @@ package android.text.style {
}
public class TtsSpan implements android.text.ParcelableSpan {
- ctor public TtsSpan(java.lang.String, android.os.PersistableBundle);
+ ctor public TtsSpan(String, android.os.PersistableBundle);
ctor public TtsSpan(android.os.Parcel);
method public int describeContents();
method public android.os.PersistableBundle getArgs();
method public int getSpanTypeId();
- method public java.lang.String getType();
+ method public String getType();
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String ANIMACY_ANIMATE = "android.animate";
- field public static final java.lang.String ANIMACY_INANIMATE = "android.inanimate";
- field public static final java.lang.String ARG_ANIMACY = "android.arg.animacy";
- field public static final java.lang.String ARG_CASE = "android.arg.case";
- field public static final java.lang.String ARG_COUNTRY_CODE = "android.arg.country_code";
- field public static final java.lang.String ARG_CURRENCY = "android.arg.money";
- field public static final java.lang.String ARG_DAY = "android.arg.day";
- field public static final java.lang.String ARG_DENOMINATOR = "android.arg.denominator";
- field public static final java.lang.String ARG_DIGITS = "android.arg.digits";
- field public static final java.lang.String ARG_DOMAIN = "android.arg.domain";
- field public static final java.lang.String ARG_EXTENSION = "android.arg.extension";
- field public static final java.lang.String ARG_FRACTIONAL_PART = "android.arg.fractional_part";
- field public static final java.lang.String ARG_FRAGMENT_ID = "android.arg.fragment_id";
- field public static final java.lang.String ARG_GENDER = "android.arg.gender";
- field public static final java.lang.String ARG_HOURS = "android.arg.hours";
- field public static final java.lang.String ARG_INTEGER_PART = "android.arg.integer_part";
- field public static final java.lang.String ARG_MINUTES = "android.arg.minutes";
- field public static final java.lang.String ARG_MONTH = "android.arg.month";
- field public static final java.lang.String ARG_MULTIPLICITY = "android.arg.multiplicity";
- field public static final java.lang.String ARG_NUMBER = "android.arg.number";
- field public static final java.lang.String ARG_NUMBER_PARTS = "android.arg.number_parts";
- field public static final java.lang.String ARG_NUMERATOR = "android.arg.numerator";
- field public static final java.lang.String ARG_PASSWORD = "android.arg.password";
- field public static final java.lang.String ARG_PATH = "android.arg.path";
- field public static final java.lang.String ARG_PORT = "android.arg.port";
- field public static final java.lang.String ARG_PROTOCOL = "android.arg.protocol";
- field public static final java.lang.String ARG_QUANTITY = "android.arg.quantity";
- field public static final java.lang.String ARG_QUERY_STRING = "android.arg.query_string";
- field public static final java.lang.String ARG_TEXT = "android.arg.text";
- field public static final java.lang.String ARG_UNIT = "android.arg.unit";
- field public static final java.lang.String ARG_USERNAME = "android.arg.username";
- field public static final java.lang.String ARG_VERBATIM = "android.arg.verbatim";
- field public static final java.lang.String ARG_WEEKDAY = "android.arg.weekday";
- field public static final java.lang.String ARG_YEAR = "android.arg.year";
- field public static final java.lang.String CASE_ABLATIVE = "android.ablative";
- field public static final java.lang.String CASE_ACCUSATIVE = "android.accusative";
- field public static final java.lang.String CASE_DATIVE = "android.dative";
- field public static final java.lang.String CASE_GENITIVE = "android.genitive";
- field public static final java.lang.String CASE_INSTRUMENTAL = "android.instrumental";
- field public static final java.lang.String CASE_LOCATIVE = "android.locative";
- field public static final java.lang.String CASE_NOMINATIVE = "android.nominative";
- field public static final java.lang.String CASE_VOCATIVE = "android.vocative";
- field public static final java.lang.String GENDER_FEMALE = "android.female";
- field public static final java.lang.String GENDER_MALE = "android.male";
- field public static final java.lang.String GENDER_NEUTRAL = "android.neutral";
+ field public static final String ANIMACY_ANIMATE = "android.animate";
+ field public static final String ANIMACY_INANIMATE = "android.inanimate";
+ field public static final String ARG_ANIMACY = "android.arg.animacy";
+ field public static final String ARG_CASE = "android.arg.case";
+ field public static final String ARG_COUNTRY_CODE = "android.arg.country_code";
+ field public static final String ARG_CURRENCY = "android.arg.money";
+ field public static final String ARG_DAY = "android.arg.day";
+ field public static final String ARG_DENOMINATOR = "android.arg.denominator";
+ field public static final String ARG_DIGITS = "android.arg.digits";
+ field public static final String ARG_DOMAIN = "android.arg.domain";
+ field public static final String ARG_EXTENSION = "android.arg.extension";
+ field public static final String ARG_FRACTIONAL_PART = "android.arg.fractional_part";
+ field public static final String ARG_FRAGMENT_ID = "android.arg.fragment_id";
+ field public static final String ARG_GENDER = "android.arg.gender";
+ field public static final String ARG_HOURS = "android.arg.hours";
+ field public static final String ARG_INTEGER_PART = "android.arg.integer_part";
+ field public static final String ARG_MINUTES = "android.arg.minutes";
+ field public static final String ARG_MONTH = "android.arg.month";
+ field public static final String ARG_MULTIPLICITY = "android.arg.multiplicity";
+ field public static final String ARG_NUMBER = "android.arg.number";
+ field public static final String ARG_NUMBER_PARTS = "android.arg.number_parts";
+ field public static final String ARG_NUMERATOR = "android.arg.numerator";
+ field public static final String ARG_PASSWORD = "android.arg.password";
+ field public static final String ARG_PATH = "android.arg.path";
+ field public static final String ARG_PORT = "android.arg.port";
+ field public static final String ARG_PROTOCOL = "android.arg.protocol";
+ field public static final String ARG_QUANTITY = "android.arg.quantity";
+ field public static final String ARG_QUERY_STRING = "android.arg.query_string";
+ field public static final String ARG_TEXT = "android.arg.text";
+ field public static final String ARG_UNIT = "android.arg.unit";
+ field public static final String ARG_USERNAME = "android.arg.username";
+ field public static final String ARG_VERBATIM = "android.arg.verbatim";
+ field public static final String ARG_WEEKDAY = "android.arg.weekday";
+ field public static final String ARG_YEAR = "android.arg.year";
+ field public static final String CASE_ABLATIVE = "android.ablative";
+ field public static final String CASE_ACCUSATIVE = "android.accusative";
+ field public static final String CASE_DATIVE = "android.dative";
+ field public static final String CASE_GENITIVE = "android.genitive";
+ field public static final String CASE_INSTRUMENTAL = "android.instrumental";
+ field public static final String CASE_LOCATIVE = "android.locative";
+ field public static final String CASE_NOMINATIVE = "android.nominative";
+ field public static final String CASE_VOCATIVE = "android.vocative";
+ field public static final String GENDER_FEMALE = "android.female";
+ field public static final String GENDER_MALE = "android.male";
+ field public static final String GENDER_NEUTRAL = "android.neutral";
field public static final int MONTH_APRIL = 3; // 0x3
field public static final int MONTH_AUGUST = 7; // 0x7
field public static final int MONTH_DECEMBER = 11; // 0xb
@@ -46675,22 +46960,22 @@ package android.text.style {
field public static final int MONTH_NOVEMBER = 10; // 0xa
field public static final int MONTH_OCTOBER = 9; // 0x9
field public static final int MONTH_SEPTEMBER = 8; // 0x8
- field public static final java.lang.String MULTIPLICITY_DUAL = "android.dual";
- field public static final java.lang.String MULTIPLICITY_PLURAL = "android.plural";
- field public static final java.lang.String MULTIPLICITY_SINGLE = "android.single";
- field public static final java.lang.String TYPE_CARDINAL = "android.type.cardinal";
- field public static final java.lang.String TYPE_DATE = "android.type.date";
- field public static final java.lang.String TYPE_DECIMAL = "android.type.decimal";
- field public static final java.lang.String TYPE_DIGITS = "android.type.digits";
- field public static final java.lang.String TYPE_ELECTRONIC = "android.type.electronic";
- field public static final java.lang.String TYPE_FRACTION = "android.type.fraction";
- field public static final java.lang.String TYPE_MEASURE = "android.type.measure";
- field public static final java.lang.String TYPE_MONEY = "android.type.money";
- field public static final java.lang.String TYPE_ORDINAL = "android.type.ordinal";
- field public static final java.lang.String TYPE_TELEPHONE = "android.type.telephone";
- field public static final java.lang.String TYPE_TEXT = "android.type.text";
- field public static final java.lang.String TYPE_TIME = "android.type.time";
- field public static final java.lang.String TYPE_VERBATIM = "android.type.verbatim";
+ field public static final String MULTIPLICITY_DUAL = "android.dual";
+ field public static final String MULTIPLICITY_PLURAL = "android.plural";
+ field public static final String MULTIPLICITY_SINGLE = "android.single";
+ field public static final String TYPE_CARDINAL = "android.type.cardinal";
+ field public static final String TYPE_DATE = "android.type.date";
+ field public static final String TYPE_DECIMAL = "android.type.decimal";
+ field public static final String TYPE_DIGITS = "android.type.digits";
+ field public static final String TYPE_ELECTRONIC = "android.type.electronic";
+ field public static final String TYPE_FRACTION = "android.type.fraction";
+ field public static final String TYPE_MEASURE = "android.type.measure";
+ field public static final String TYPE_MONEY = "android.type.money";
+ field public static final String TYPE_ORDINAL = "android.type.ordinal";
+ field public static final String TYPE_TELEPHONE = "android.type.telephone";
+ field public static final String TYPE_TEXT = "android.type.text";
+ field public static final String TYPE_TIME = "android.type.time";
+ field public static final String TYPE_VERBATIM = "android.type.verbatim";
field public static final int WEEKDAY_FRIDAY = 6; // 0x6
field public static final int WEEKDAY_MONDAY = 2; // 0x2
field public static final int WEEKDAY_SATURDAY = 7; // 0x7
@@ -46701,175 +46986,175 @@ package android.text.style {
}
public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> {
- ctor public TtsSpan.Builder(java.lang.String);
+ ctor public TtsSpan.Builder(String);
method public android.text.style.TtsSpan build();
- method public C setIntArgument(java.lang.String, int);
- method public C setLongArgument(java.lang.String, long);
- method public C setStringArgument(java.lang.String, java.lang.String);
+ method public C setIntArgument(String, int);
+ method public C setLongArgument(String, long);
+ method public C setStringArgument(String, String);
}
- public static class TtsSpan.CardinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.CardinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.CardinalBuilder> {
ctor public TtsSpan.CardinalBuilder();
ctor public TtsSpan.CardinalBuilder(long);
- ctor public TtsSpan.CardinalBuilder(java.lang.String);
+ ctor public TtsSpan.CardinalBuilder(String);
method public android.text.style.TtsSpan.CardinalBuilder setNumber(long);
- method public android.text.style.TtsSpan.CardinalBuilder setNumber(java.lang.String);
+ method public android.text.style.TtsSpan.CardinalBuilder setNumber(String);
}
- public static class TtsSpan.DateBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.DateBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.DateBuilder> {
ctor public TtsSpan.DateBuilder();
- ctor public TtsSpan.DateBuilder(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer);
+ ctor public TtsSpan.DateBuilder(Integer, Integer, Integer, Integer);
method public android.text.style.TtsSpan.DateBuilder setDay(int);
method public android.text.style.TtsSpan.DateBuilder setMonth(int);
method public android.text.style.TtsSpan.DateBuilder setWeekday(int);
method public android.text.style.TtsSpan.DateBuilder setYear(int);
}
- public static class TtsSpan.DecimalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.DecimalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.DecimalBuilder> {
ctor public TtsSpan.DecimalBuilder();
ctor public TtsSpan.DecimalBuilder(double, int, int);
- ctor public TtsSpan.DecimalBuilder(java.lang.String, java.lang.String);
+ ctor public TtsSpan.DecimalBuilder(String, String);
method public android.text.style.TtsSpan.DecimalBuilder setArgumentsFromDouble(double, int, int);
- method public android.text.style.TtsSpan.DecimalBuilder setFractionalPart(java.lang.String);
+ method public android.text.style.TtsSpan.DecimalBuilder setFractionalPart(String);
method public android.text.style.TtsSpan.DecimalBuilder setIntegerPart(long);
- method public android.text.style.TtsSpan.DecimalBuilder setIntegerPart(java.lang.String);
+ method public android.text.style.TtsSpan.DecimalBuilder setIntegerPart(String);
}
- public static class TtsSpan.DigitsBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.DigitsBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.DigitsBuilder> {
ctor public TtsSpan.DigitsBuilder();
- ctor public TtsSpan.DigitsBuilder(java.lang.String);
- method public android.text.style.TtsSpan.DigitsBuilder setDigits(java.lang.String);
+ ctor public TtsSpan.DigitsBuilder(String);
+ method public android.text.style.TtsSpan.DigitsBuilder setDigits(String);
}
- public static class TtsSpan.ElectronicBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.ElectronicBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.ElectronicBuilder> {
ctor public TtsSpan.ElectronicBuilder();
- method public android.text.style.TtsSpan.ElectronicBuilder setDomain(java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setEmailArguments(java.lang.String, java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setFragmentId(java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setPassword(java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setPath(java.lang.String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setDomain(String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setEmailArguments(String, String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setFragmentId(String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setPassword(String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setPath(String);
method public android.text.style.TtsSpan.ElectronicBuilder setPort(int);
- method public android.text.style.TtsSpan.ElectronicBuilder setProtocol(java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setQueryString(java.lang.String);
- method public android.text.style.TtsSpan.ElectronicBuilder setUsername(java.lang.String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setProtocol(String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setQueryString(String);
+ method public android.text.style.TtsSpan.ElectronicBuilder setUsername(String);
}
- public static class TtsSpan.FractionBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.FractionBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.FractionBuilder> {
ctor public TtsSpan.FractionBuilder();
ctor public TtsSpan.FractionBuilder(long, long, long);
method public android.text.style.TtsSpan.FractionBuilder setDenominator(long);
- method public android.text.style.TtsSpan.FractionBuilder setDenominator(java.lang.String);
+ method public android.text.style.TtsSpan.FractionBuilder setDenominator(String);
method public android.text.style.TtsSpan.FractionBuilder setIntegerPart(long);
- method public android.text.style.TtsSpan.FractionBuilder setIntegerPart(java.lang.String);
+ method public android.text.style.TtsSpan.FractionBuilder setIntegerPart(String);
method public android.text.style.TtsSpan.FractionBuilder setNumerator(long);
- method public android.text.style.TtsSpan.FractionBuilder setNumerator(java.lang.String);
+ method public android.text.style.TtsSpan.FractionBuilder setNumerator(String);
}
- public static class TtsSpan.MeasureBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.MeasureBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.MeasureBuilder> {
ctor public TtsSpan.MeasureBuilder();
method public android.text.style.TtsSpan.MeasureBuilder setDenominator(long);
- method public android.text.style.TtsSpan.MeasureBuilder setDenominator(java.lang.String);
- method public android.text.style.TtsSpan.MeasureBuilder setFractionalPart(java.lang.String);
+ method public android.text.style.TtsSpan.MeasureBuilder setDenominator(String);
+ method public android.text.style.TtsSpan.MeasureBuilder setFractionalPart(String);
method public android.text.style.TtsSpan.MeasureBuilder setIntegerPart(long);
- method public android.text.style.TtsSpan.MeasureBuilder setIntegerPart(java.lang.String);
+ method public android.text.style.TtsSpan.MeasureBuilder setIntegerPart(String);
method public android.text.style.TtsSpan.MeasureBuilder setNumber(long);
- method public android.text.style.TtsSpan.MeasureBuilder setNumber(java.lang.String);
+ method public android.text.style.TtsSpan.MeasureBuilder setNumber(String);
method public android.text.style.TtsSpan.MeasureBuilder setNumerator(long);
- method public android.text.style.TtsSpan.MeasureBuilder setNumerator(java.lang.String);
- method public android.text.style.TtsSpan.MeasureBuilder setUnit(java.lang.String);
+ method public android.text.style.TtsSpan.MeasureBuilder setNumerator(String);
+ method public android.text.style.TtsSpan.MeasureBuilder setUnit(String);
}
- public static class TtsSpan.MoneyBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.MoneyBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.MoneyBuilder> {
ctor public TtsSpan.MoneyBuilder();
- method public android.text.style.TtsSpan.MoneyBuilder setCurrency(java.lang.String);
- method public android.text.style.TtsSpan.MoneyBuilder setFractionalPart(java.lang.String);
+ method public android.text.style.TtsSpan.MoneyBuilder setCurrency(String);
+ method public android.text.style.TtsSpan.MoneyBuilder setFractionalPart(String);
method public android.text.style.TtsSpan.MoneyBuilder setIntegerPart(long);
- method public android.text.style.TtsSpan.MoneyBuilder setIntegerPart(java.lang.String);
- method public android.text.style.TtsSpan.MoneyBuilder setQuantity(java.lang.String);
+ method public android.text.style.TtsSpan.MoneyBuilder setIntegerPart(String);
+ method public android.text.style.TtsSpan.MoneyBuilder setQuantity(String);
}
- public static class TtsSpan.OrdinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.OrdinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.OrdinalBuilder> {
ctor public TtsSpan.OrdinalBuilder();
ctor public TtsSpan.OrdinalBuilder(long);
- ctor public TtsSpan.OrdinalBuilder(java.lang.String);
+ ctor public TtsSpan.OrdinalBuilder(String);
method public android.text.style.TtsSpan.OrdinalBuilder setNumber(long);
- method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String);
+ method public android.text.style.TtsSpan.OrdinalBuilder setNumber(String);
}
- public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder {
- ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
- method public C setAnimacy(java.lang.String);
- method public C setCase(java.lang.String);
- method public C setGender(java.lang.String);
- method public C setMultiplicity(java.lang.String);
+ public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder<C> {
+ ctor public TtsSpan.SemioticClassBuilder(String);
+ method public C setAnimacy(String);
+ method public C setCase(String);
+ method public C setGender(String);
+ method public C setMultiplicity(String);
}
- public static class TtsSpan.TelephoneBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.TelephoneBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.TelephoneBuilder> {
ctor public TtsSpan.TelephoneBuilder();
- ctor public TtsSpan.TelephoneBuilder(java.lang.String);
- method public android.text.style.TtsSpan.TelephoneBuilder setCountryCode(java.lang.String);
- method public android.text.style.TtsSpan.TelephoneBuilder setExtension(java.lang.String);
- method public android.text.style.TtsSpan.TelephoneBuilder setNumberParts(java.lang.String);
+ ctor public TtsSpan.TelephoneBuilder(String);
+ method public android.text.style.TtsSpan.TelephoneBuilder setCountryCode(String);
+ method public android.text.style.TtsSpan.TelephoneBuilder setExtension(String);
+ method public android.text.style.TtsSpan.TelephoneBuilder setNumberParts(String);
}
- public static class TtsSpan.TextBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.TextBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.TextBuilder> {
ctor public TtsSpan.TextBuilder();
- ctor public TtsSpan.TextBuilder(java.lang.String);
- method public android.text.style.TtsSpan.TextBuilder setText(java.lang.String);
+ ctor public TtsSpan.TextBuilder(String);
+ method public android.text.style.TtsSpan.TextBuilder setText(String);
}
- public static class TtsSpan.TimeBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.TimeBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.TimeBuilder> {
ctor public TtsSpan.TimeBuilder();
ctor public TtsSpan.TimeBuilder(int, int);
method public android.text.style.TtsSpan.TimeBuilder setHours(int);
method public android.text.style.TtsSpan.TimeBuilder setMinutes(int);
}
- public static class TtsSpan.VerbatimBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ public static class TtsSpan.VerbatimBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.VerbatimBuilder> {
ctor public TtsSpan.VerbatimBuilder();
- ctor public TtsSpan.VerbatimBuilder(java.lang.String);
- method public android.text.style.TtsSpan.VerbatimBuilder setVerbatim(java.lang.String);
+ ctor public TtsSpan.VerbatimBuilder(String);
+ method public android.text.style.TtsSpan.VerbatimBuilder setVerbatim(String);
}
public class TypefaceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
- ctor public TypefaceSpan(java.lang.String);
- ctor public TypefaceSpan(android.graphics.Typeface);
- ctor public TypefaceSpan(android.os.Parcel);
+ ctor public TypefaceSpan(@Nullable String);
+ ctor public TypefaceSpan(@NonNull android.graphics.Typeface);
+ ctor public TypefaceSpan(@NonNull android.os.Parcel);
method public int describeContents();
- method public java.lang.String getFamily();
+ method @Nullable public String getFamily();
method public int getSpanTypeId();
- method public android.graphics.Typeface getTypeface();
- method public void updateDrawState(android.text.TextPaint);
- method public void updateMeasureState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method @Nullable public android.graphics.Typeface getTypeface();
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void updateMeasureState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class URLSpan extends android.text.style.ClickableSpan implements android.text.ParcelableSpan {
- ctor public URLSpan(java.lang.String);
- ctor public URLSpan(android.os.Parcel);
+ ctor public URLSpan(String);
+ ctor public URLSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public java.lang.String getURL();
+ method public String getURL();
method public void onClick(android.view.View);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
public class UnderlineSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
ctor public UnderlineSpan();
- ctor public UnderlineSpan(android.os.Parcel);
+ ctor public UnderlineSpan(@NonNull android.os.Parcel);
method public int describeContents();
method public int getSpanTypeId();
- method public void updateDrawState(android.text.TextPaint);
- method public void writeToParcel(android.os.Parcel, int);
+ method public void updateDrawState(@NonNull android.text.TextPaint);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
}
- public abstract interface UpdateAppearance {
+ public interface UpdateAppearance {
}
- public abstract interface UpdateLayout implements android.text.style.UpdateAppearance {
+ public interface UpdateLayout extends android.text.style.UpdateAppearance {
}
- public abstract interface WrapTogetherSpan implements android.text.style.ParagraphStyle {
+ public interface WrapTogetherSpan extends android.text.style.ParagraphStyle {
}
}
@@ -46878,19 +47163,19 @@ package android.text.util {
public class Linkify {
ctor public Linkify();
- method public static final boolean addLinks(android.text.Spannable, int);
- method public static final boolean addLinks(android.text.Spannable, int, android.text.util.Linkify.UrlSpanFactory);
- method public static final boolean addLinks(android.widget.TextView, int);
- method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
- method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
- method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
- method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
- method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
- method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
- method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter, android.text.util.Linkify.UrlSpanFactory);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, int);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, int, @Nullable java.util.function.Function<java.lang.String,android.text.style.URLSpan>);
+ method public static final boolean addLinks(@NonNull android.widget.TextView, int);
+ method public static final void addLinks(@NonNull android.widget.TextView, @NonNull java.util.regex.Pattern, @Nullable String);
+ method public static final void addLinks(@NonNull android.widget.TextView, @NonNull java.util.regex.Pattern, @Nullable String, @Nullable android.text.util.Linkify.MatchFilter, @Nullable android.text.util.Linkify.TransformFilter);
+ method public static final void addLinks(@NonNull android.widget.TextView, @NonNull java.util.regex.Pattern, @Nullable String, @Nullable String[], @Nullable android.text.util.Linkify.MatchFilter, @Nullable android.text.util.Linkify.TransformFilter);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, @NonNull java.util.regex.Pattern, @Nullable String);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, @NonNull java.util.regex.Pattern, @Nullable String, @Nullable android.text.util.Linkify.MatchFilter, @Nullable android.text.util.Linkify.TransformFilter);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, @NonNull java.util.regex.Pattern, @Nullable String, @Nullable String[], @Nullable android.text.util.Linkify.MatchFilter, @Nullable android.text.util.Linkify.TransformFilter);
+ method public static final boolean addLinks(@NonNull android.text.Spannable, @NonNull java.util.regex.Pattern, @Nullable String, @Nullable String[], @Nullable android.text.util.Linkify.MatchFilter, @Nullable android.text.util.Linkify.TransformFilter, @Nullable java.util.function.Function<java.lang.String,android.text.style.URLSpan>);
field public static final int ALL = 15; // 0xf
field public static final int EMAIL_ADDRESSES = 2; // 0x2
- field public static final deprecated int MAP_ADDRESSES = 8; // 0x8
+ field @Deprecated public static final int MAP_ADDRESSES = 8; // 0x8
field public static final int PHONE_NUMBERS = 4; // 0x4
field public static final int WEB_URLS = 1; // 0x1
field public static final android.text.util.Linkify.MatchFilter sPhoneNumberMatchFilter;
@@ -46898,39 +47183,34 @@ package android.text.util {
field public static final android.text.util.Linkify.MatchFilter sUrlMatchFilter;
}
- public static abstract interface Linkify.MatchFilter {
- method public abstract boolean acceptMatch(java.lang.CharSequence, int, int);
+ public static interface Linkify.MatchFilter {
+ method public boolean acceptMatch(CharSequence, int, int);
}
- public static abstract interface Linkify.TransformFilter {
- method public abstract java.lang.String transformUrl(java.util.regex.Matcher, java.lang.String);
- }
-
- public static class Linkify.UrlSpanFactory {
- ctor public Linkify.UrlSpanFactory();
- method public android.text.style.URLSpan create(java.lang.String);
+ public static interface Linkify.TransformFilter {
+ method public String transformUrl(java.util.regex.Matcher, String);
}
public class Rfc822Token {
- ctor public Rfc822Token(java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String getAddress();
- method public java.lang.String getComment();
- method public java.lang.String getName();
- method public static java.lang.String quoteComment(java.lang.String);
- method public static java.lang.String quoteName(java.lang.String);
- method public static java.lang.String quoteNameIfNecessary(java.lang.String);
- method public void setAddress(java.lang.String);
- method public void setComment(java.lang.String);
- method public void setName(java.lang.String);
+ ctor public Rfc822Token(@Nullable String, @Nullable String, @Nullable String);
+ method @Nullable public String getAddress();
+ method @Nullable public String getComment();
+ method @Nullable public String getName();
+ method public static String quoteComment(String);
+ method public static String quoteName(String);
+ method public static String quoteNameIfNecessary(String);
+ method public void setAddress(@Nullable String);
+ method public void setComment(@Nullable String);
+ method public void setName(@Nullable String);
}
public class Rfc822Tokenizer implements android.widget.MultiAutoCompleteTextView.Tokenizer {
ctor public Rfc822Tokenizer();
- method public int findTokenEnd(java.lang.CharSequence, int);
- method public int findTokenStart(java.lang.CharSequence, int);
- method public java.lang.CharSequence terminateToken(java.lang.CharSequence);
- method public static void tokenize(java.lang.CharSequence, java.util.Collection<android.text.util.Rfc822Token>);
- method public static android.text.util.Rfc822Token[] tokenize(java.lang.CharSequence);
+ method public int findTokenEnd(CharSequence, int);
+ method public int findTokenStart(CharSequence, int);
+ method public CharSequence terminateToken(CharSequence);
+ method public static void tokenize(CharSequence, java.util.Collection<android.text.util.Rfc822Token>);
+ method public static android.text.util.Rfc822Token[] tokenize(CharSequence);
}
}
@@ -46960,7 +47240,7 @@ package android.transition {
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
method public boolean getResizeClip();
- method public deprecated void setReparent(boolean);
+ method @Deprecated public void setReparent(boolean);
method public void setResizeClip(boolean);
}
@@ -47033,14 +47313,14 @@ package android.transition {
public final class Scene {
ctor public Scene(android.view.ViewGroup);
ctor public Scene(android.view.ViewGroup, android.view.View);
- ctor public deprecated Scene(android.view.ViewGroup, android.view.ViewGroup);
+ ctor @Deprecated public Scene(android.view.ViewGroup, android.view.ViewGroup);
method public void enter();
method public void exit();
- method public static android.transition.Scene getCurrentScene(android.view.ViewGroup);
+ method @Nullable public static android.transition.Scene getCurrentScene(@NonNull android.view.ViewGroup);
method public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
method public android.view.ViewGroup getSceneRoot();
- method public void setEnterAction(java.lang.Runnable);
- method public void setExitAction(java.lang.Runnable);
+ method public void setEnterAction(Runnable);
+ method public void setExitAction(Runnable);
}
public class SidePropagation extends android.transition.VisibilityPropagation {
@@ -47063,8 +47343,8 @@ package android.transition {
ctor public Transition(android.content.Context, android.util.AttributeSet);
method public android.transition.Transition addListener(android.transition.Transition.TransitionListener);
method public android.transition.Transition addTarget(int);
- method public android.transition.Transition addTarget(java.lang.String);
- method public android.transition.Transition addTarget(java.lang.Class);
+ method public android.transition.Transition addTarget(String);
+ method public android.transition.Transition addTarget(Class);
method public android.transition.Transition addTarget(android.view.View);
method public boolean canRemoveViews();
method public abstract void captureEndValues(android.transition.TransitionValues);
@@ -47073,16 +47353,16 @@ package android.transition {
method public android.animation.Animator createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues);
method public android.transition.Transition excludeChildren(int, boolean);
method public android.transition.Transition excludeChildren(android.view.View, boolean);
- method public android.transition.Transition excludeChildren(java.lang.Class, boolean);
+ method public android.transition.Transition excludeChildren(Class, boolean);
method public android.transition.Transition excludeTarget(int, boolean);
- method public android.transition.Transition excludeTarget(java.lang.String, boolean);
+ method public android.transition.Transition excludeTarget(String, boolean);
method public android.transition.Transition excludeTarget(android.view.View, boolean);
- method public android.transition.Transition excludeTarget(java.lang.Class, boolean);
+ method public android.transition.Transition excludeTarget(Class, boolean);
method public long getDuration();
method public android.graphics.Rect getEpicenter();
method public android.transition.Transition.EpicenterCallback getEpicenterCallback();
method public android.animation.TimeInterpolator getInterpolator();
- method public java.lang.String getName();
+ method public String getName();
method public android.transition.PathMotion getPathMotion();
method public android.transition.TransitionPropagation getPropagation();
method public long getStartDelay();
@@ -47090,14 +47370,14 @@ package android.transition {
method public java.util.List<java.lang.String> getTargetNames();
method public java.util.List<java.lang.Class> getTargetTypes();
method public java.util.List<android.view.View> getTargets();
- method public java.lang.String[] getTransitionProperties();
+ method public String[] getTransitionProperties();
method public android.transition.TransitionValues getTransitionValues(android.view.View, boolean);
- method public boolean isTransitionRequired(android.transition.TransitionValues, android.transition.TransitionValues);
+ method public boolean isTransitionRequired(@Nullable android.transition.TransitionValues, @Nullable android.transition.TransitionValues);
method public android.transition.Transition removeListener(android.transition.Transition.TransitionListener);
method public android.transition.Transition removeTarget(int);
- method public android.transition.Transition removeTarget(java.lang.String);
+ method public android.transition.Transition removeTarget(String);
method public android.transition.Transition removeTarget(android.view.View);
- method public android.transition.Transition removeTarget(java.lang.Class);
+ method public android.transition.Transition removeTarget(Class);
method public android.transition.Transition setDuration(long);
method public void setEpicenterCallback(android.transition.Transition.EpicenterCallback);
method public android.transition.Transition setInterpolator(android.animation.TimeInterpolator);
@@ -47111,23 +47391,23 @@ package android.transition {
field public static final int MATCH_NAME = 2; // 0x2
}
- public static abstract class Transition.EpicenterCallback {
+ public abstract static class Transition.EpicenterCallback {
ctor public Transition.EpicenterCallback();
method public abstract android.graphics.Rect onGetEpicenter(android.transition.Transition);
}
- public static abstract interface Transition.TransitionListener {
- method public abstract void onTransitionCancel(android.transition.Transition);
- method public abstract void onTransitionEnd(android.transition.Transition);
- method public abstract void onTransitionPause(android.transition.Transition);
- method public abstract void onTransitionResume(android.transition.Transition);
- method public abstract void onTransitionStart(android.transition.Transition);
+ public static interface Transition.TransitionListener {
+ method public void onTransitionCancel(android.transition.Transition);
+ method public void onTransitionEnd(android.transition.Transition);
+ method public void onTransitionPause(android.transition.Transition);
+ method public void onTransitionResume(android.transition.Transition);
+ method public void onTransitionStart(android.transition.Transition);
}
public class TransitionInflater {
method public static android.transition.TransitionInflater from(android.content.Context);
- method public android.transition.Transition inflateTransition(int);
- method public android.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup);
+ method public android.transition.Transition inflateTransition(@TransitionRes int);
+ method public android.transition.TransitionManager inflateTransitionManager(@TransitionRes int, android.view.ViewGroup);
}
public abstract class TransitionListenerAdapter implements android.transition.Transition.TransitionListener {
@@ -47154,7 +47434,7 @@ package android.transition {
public abstract class TransitionPropagation {
ctor public TransitionPropagation();
method public abstract void captureValues(android.transition.TransitionValues);
- method public abstract java.lang.String[] getPropagationProperties();
+ method public abstract String[] getPropagationProperties();
method public abstract long getStartDelay(android.view.ViewGroup, android.transition.Transition, android.transition.TransitionValues, android.transition.TransitionValues);
}
@@ -47164,8 +47444,8 @@ package android.transition {
method public android.transition.TransitionSet addListener(android.transition.Transition.TransitionListener);
method public android.transition.TransitionSet addTarget(android.view.View);
method public android.transition.TransitionSet addTarget(int);
- method public android.transition.TransitionSet addTarget(java.lang.String);
- method public android.transition.TransitionSet addTarget(java.lang.Class);
+ method public android.transition.TransitionSet addTarget(String);
+ method public android.transition.TransitionSet addTarget(Class);
method public android.transition.TransitionSet addTransition(android.transition.Transition);
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
@@ -47176,8 +47456,8 @@ package android.transition {
method public android.transition.TransitionSet removeListener(android.transition.Transition.TransitionListener);
method public android.transition.TransitionSet removeTarget(int);
method public android.transition.TransitionSet removeTarget(android.view.View);
- method public android.transition.TransitionSet removeTarget(java.lang.Class);
- method public android.transition.TransitionSet removeTarget(java.lang.String);
+ method public android.transition.TransitionSet removeTarget(Class);
+ method public android.transition.TransitionSet removeTarget(String);
method public android.transition.TransitionSet removeTransition(android.transition.Transition);
method public android.transition.TransitionSet setDuration(long);
method public android.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
@@ -47188,10 +47468,10 @@ package android.transition {
}
public class TransitionValues {
- ctor public deprecated TransitionValues();
- ctor public TransitionValues(android.view.View);
- field public final java.util.Map<java.lang.String, java.lang.Object> values;
- field public android.view.View view;
+ ctor @Deprecated public TransitionValues();
+ ctor public TransitionValues(@NonNull android.view.View);
+ field @NonNull public final java.util.Map<java.lang.String,java.lang.Object> values;
+ field @NonNull public android.view.View view;
}
public abstract class Visibility extends android.transition.Transition {
@@ -47213,7 +47493,7 @@ package android.transition {
public abstract class VisibilityPropagation extends android.transition.TransitionPropagation {
ctor public VisibilityPropagation();
method public void captureValues(android.transition.TransitionValues);
- method public java.lang.String[] getPropagationProperties();
+ method public String[] getPropagationProperties();
method public int getViewVisibility(android.transition.TransitionValues);
method public int getViewX(android.transition.TransitionValues);
method public int getViewY(android.transition.TransitionValues);
@@ -47225,38 +47505,38 @@ package android.util {
public class AndroidException extends java.lang.Exception {
ctor public AndroidException();
- ctor public AndroidException(java.lang.String);
- ctor public AndroidException(java.lang.String, java.lang.Throwable);
- ctor public AndroidException(java.lang.Exception);
+ ctor public AndroidException(String);
+ ctor public AndroidException(String, Throwable);
+ ctor public AndroidException(Exception);
}
public class AndroidRuntimeException extends java.lang.RuntimeException {
ctor public AndroidRuntimeException();
- ctor public AndroidRuntimeException(java.lang.String);
- ctor public AndroidRuntimeException(java.lang.String, java.lang.Throwable);
- ctor public AndroidRuntimeException(java.lang.Exception);
+ ctor public AndroidRuntimeException(String);
+ ctor public AndroidRuntimeException(String, Throwable);
+ ctor public AndroidRuntimeException(Exception);
}
- public final class ArrayMap<K, V> implements java.util.Map {
+ public final class ArrayMap<K, V> implements java.util.Map<K,V> {
ctor public ArrayMap();
ctor public ArrayMap(int);
- ctor public ArrayMap(android.util.ArrayMap<K, V>);
+ ctor public ArrayMap(android.util.ArrayMap<K,V>);
method public void clear();
method public boolean containsAll(java.util.Collection<?>);
- method public boolean containsKey(java.lang.Object);
- method public boolean containsValue(java.lang.Object);
+ method public boolean containsKey(Object);
+ method public boolean containsValue(Object);
method public void ensureCapacity(int);
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public V get(java.lang.Object);
- method public int indexOfKey(java.lang.Object);
- method public int indexOfValue(java.lang.Object);
+ method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method public V get(Object);
+ method public int indexOfKey(Object);
+ method public int indexOfValue(Object);
method public boolean isEmpty();
method public K keyAt(int);
method public java.util.Set<K> keySet();
method public V put(K, V);
- method public void putAll(android.util.ArrayMap<? extends K, ? extends V>);
- method public void putAll(java.util.Map<? extends K, ? extends V>);
- method public V remove(java.lang.Object);
+ method public void putAll(android.util.ArrayMap<? extends K,? extends V>);
+ method public void putAll(java.util.Map<? extends K,? extends V>);
+ method public V remove(Object);
method public boolean removeAll(java.util.Collection<?>);
method public V removeAt(int);
method public boolean retainAll(java.util.Collection<?>);
@@ -47266,7 +47546,7 @@ package android.util {
method public java.util.Collection<V> values();
}
- public final class ArraySet<E> implements java.util.Collection java.util.Set {
+ public final class ArraySet<E> implements java.util.Collection<E> java.util.Set<E> {
ctor public ArraySet();
ctor public ArraySet(int);
ctor public ArraySet(android.util.ArraySet<E>);
@@ -47275,19 +47555,19 @@ package android.util {
method public void addAll(android.util.ArraySet<? extends E>);
method public boolean addAll(java.util.Collection<? extends E>);
method public void clear();
- method public boolean contains(java.lang.Object);
+ method public boolean contains(Object);
method public boolean containsAll(java.util.Collection<?>);
method public void ensureCapacity(int);
- method public int indexOf(java.lang.Object);
+ method public int indexOf(Object);
method public boolean isEmpty();
method public java.util.Iterator<E> iterator();
- method public boolean remove(java.lang.Object);
+ method public boolean remove(Object);
method public boolean removeAll(android.util.ArraySet<? extends E>);
method public boolean removeAll(java.util.Collection<?>);
method public E removeAt(int);
method public boolean retainAll(java.util.Collection<?>);
method public int size();
- method public java.lang.Object[] toArray();
+ method public Object[] toArray();
method public <T> T[] toArray(T[]);
method public E valueAt(int);
}
@@ -47303,40 +47583,40 @@ package android.util {
method public java.io.FileOutputStream startWrite() throws java.io.IOException;
}
- public abstract interface AttributeSet {
- method public abstract boolean getAttributeBooleanValue(java.lang.String, java.lang.String, boolean);
- method public abstract boolean getAttributeBooleanValue(int, boolean);
- method public abstract int getAttributeCount();
- method public abstract float getAttributeFloatValue(java.lang.String, java.lang.String, float);
- method public abstract float getAttributeFloatValue(int, float);
- method public abstract int getAttributeIntValue(java.lang.String, java.lang.String, int);
- method public abstract int getAttributeIntValue(int, int);
- method public abstract int getAttributeListValue(java.lang.String, java.lang.String, java.lang.String[], int);
- method public abstract int getAttributeListValue(int, java.lang.String[], int);
- method public abstract java.lang.String getAttributeName(int);
- method public abstract int getAttributeNameResource(int);
- method public default java.lang.String getAttributeNamespace(int);
- method public abstract int getAttributeResourceValue(java.lang.String, java.lang.String, int);
- method public abstract int getAttributeResourceValue(int, int);
- method public abstract int getAttributeUnsignedIntValue(java.lang.String, java.lang.String, int);
- method public abstract int getAttributeUnsignedIntValue(int, int);
- method public abstract java.lang.String getAttributeValue(int);
- method public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
- method public abstract java.lang.String getClassAttribute();
- method public abstract java.lang.String getIdAttribute();
- method public abstract int getIdAttributeResourceValue(int);
- method public abstract java.lang.String getPositionDescription();
- method public abstract int getStyleAttribute();
+ public interface AttributeSet {
+ method public boolean getAttributeBooleanValue(String, String, boolean);
+ method public boolean getAttributeBooleanValue(int, boolean);
+ method public int getAttributeCount();
+ method public float getAttributeFloatValue(String, String, float);
+ method public float getAttributeFloatValue(int, float);
+ method public int getAttributeIntValue(String, String, int);
+ method public int getAttributeIntValue(int, int);
+ method public int getAttributeListValue(String, String, String[], int);
+ method public int getAttributeListValue(int, String[], int);
+ method public String getAttributeName(int);
+ method public int getAttributeNameResource(int);
+ method public default String getAttributeNamespace(int);
+ method public int getAttributeResourceValue(String, String, int);
+ method public int getAttributeResourceValue(int, int);
+ method public int getAttributeUnsignedIntValue(String, String, int);
+ method public int getAttributeUnsignedIntValue(int, int);
+ method public String getAttributeValue(int);
+ method public String getAttributeValue(String, String);
+ method public String getClassAttribute();
+ method public String getIdAttribute();
+ method public int getIdAttributeResourceValue(int);
+ method public String getPositionDescription();
+ method public int getStyleAttribute();
}
public class Base64 {
- method public static byte[] decode(java.lang.String, int);
+ method public static byte[] decode(String, int);
method public static byte[] decode(byte[], int);
method public static byte[] decode(byte[], int, int, int);
method public static byte[] encode(byte[], int);
method public static byte[] encode(byte[], int, int, int);
- method public static java.lang.String encodeToString(byte[], int);
- method public static java.lang.String encodeToString(byte[], int, int, int);
+ method public static String encodeToString(byte[], int);
+ method public static String encodeToString(byte[], int, int, int);
field public static final int CRLF = 4; // 0x4
field public static final int DEFAULT = 0; // 0x0
field public static final int NO_CLOSE = 16; // 0x10
@@ -47346,13 +47626,12 @@ package android.util {
}
public class Base64DataException extends java.io.IOException {
- ctor public Base64DataException(java.lang.String);
+ ctor public Base64DataException(String);
}
public class Base64InputStream extends java.io.FilterInputStream {
ctor public Base64InputStream(java.io.InputStream, int);
method public int available();
- method public void mark(int);
method public void reset();
}
@@ -47360,16 +47639,16 @@ package android.util {
ctor public Base64OutputStream(java.io.OutputStream, int);
}
- public final deprecated class Config {
- field public static final deprecated boolean DEBUG = false;
- field public static final deprecated boolean LOGD = true;
- field public static final deprecated boolean LOGV = false;
- field public static final deprecated boolean PROFILE = false;
- field public static final deprecated boolean RELEASE = true;
+ @Deprecated public final class Config {
+ field @Deprecated public static final boolean DEBUG = false;
+ field @Deprecated public static final boolean LOGD = true;
+ field @Deprecated public static final boolean LOGV = false;
+ field @Deprecated public static final boolean PROFILE = false;
+ field @Deprecated public static final boolean RELEASE = true;
}
public class DebugUtils {
- method public static boolean isObjectSelected(java.lang.Object);
+ method public static boolean isObjectSelected(Object);
}
public class DisplayMetrics {
@@ -47406,108 +47685,108 @@ package android.util {
}
public class EventLog {
- method public static int getTagCode(java.lang.String);
- method public static java.lang.String getTagName(int);
+ method public static int getTagCode(String);
+ method public static String getTagName(int);
method public static void readEvents(int[], java.util.Collection<android.util.EventLog.Event>) throws java.io.IOException;
method public static int writeEvent(int, int);
method public static int writeEvent(int, long);
method public static int writeEvent(int, float);
- method public static int writeEvent(int, java.lang.String);
+ method public static int writeEvent(int, String);
method public static int writeEvent(int, java.lang.Object...);
}
public static final class EventLog.Event {
- method public synchronized java.lang.Object getData();
+ method public Object getData();
method public int getProcessId();
method public int getTag();
method public int getThreadId();
method public long getTimeNanos();
}
- public deprecated class EventLogTags {
- ctor public EventLogTags() throws java.io.IOException;
- ctor public EventLogTags(java.io.BufferedReader) throws java.io.IOException;
- method public android.util.EventLogTags.Description get(java.lang.String);
- method public android.util.EventLogTags.Description get(int);
+ @Deprecated public class EventLogTags {
+ ctor @Deprecated public EventLogTags() throws java.io.IOException;
+ ctor @Deprecated public EventLogTags(java.io.BufferedReader) throws java.io.IOException;
+ method @Deprecated public android.util.EventLogTags.Description get(String);
+ method @Deprecated public android.util.EventLogTags.Description get(int);
}
- public static class EventLogTags.Description {
- field public final java.lang.String mName;
- field public final int mTag;
+ @Deprecated public static class EventLogTags.Description {
+ field @Deprecated public final String mName;
+ field @Deprecated public final int mTag;
}
- public deprecated class FloatMath {
+ @Deprecated public class FloatMath {
}
- public abstract class FloatProperty<T> extends android.util.Property {
- ctor public FloatProperty(java.lang.String);
- method public final void set(T, java.lang.Float);
+ public abstract class FloatProperty<T> extends android.util.Property<T,java.lang.Float> {
+ ctor public FloatProperty(String);
+ method public final void set(T, Float);
method public abstract void setValue(T, float);
}
- public final class Half extends java.lang.Number implements java.lang.Comparable {
- ctor public Half(short);
+ public final class Half extends java.lang.Number implements java.lang.Comparable<android.util.Half> {
+ ctor public Half(@HalfFloat short);
ctor public Half(float);
ctor public Half(double);
- ctor public Half(java.lang.String) throws java.lang.NumberFormatException;
- method public static short abs(short);
- method public static short ceil(short);
- method public static int compare(short, short);
- method public int compareTo(android.util.Half);
- method public static short copySign(short, short);
+ ctor public Half(@NonNull String) throws java.lang.NumberFormatException;
+ method @HalfFloat public static short abs(@HalfFloat short);
+ method @HalfFloat public static short ceil(@HalfFloat short);
+ method public static int compare(@HalfFloat short, @HalfFloat short);
+ method public int compareTo(@NonNull android.util.Half);
+ method @HalfFloat public static short copySign(@HalfFloat short, @HalfFloat short);
method public double doubleValue();
- method public static boolean equals(short, short);
+ method public static boolean equals(@HalfFloat short, @HalfFloat short);
method public float floatValue();
- method public static short floor(short);
- method public static int getExponent(short);
- method public static int getSign(short);
- method public static int getSignificand(short);
- method public static boolean greater(short, short);
- method public static boolean greaterEquals(short, short);
- method public static int halfToIntBits(short);
- method public static int halfToRawIntBits(short);
- method public static short halfToShortBits(short);
- method public short halfValue();
- method public static int hashCode(short);
- method public static short intBitsToHalf(int);
+ method @HalfFloat public static short floor(@HalfFloat short);
+ method public static int getExponent(@HalfFloat short);
+ method public static int getSign(@HalfFloat short);
+ method public static int getSignificand(@HalfFloat short);
+ method public static boolean greater(@HalfFloat short, @HalfFloat short);
+ method public static boolean greaterEquals(@HalfFloat short, @HalfFloat short);
+ method public static int halfToIntBits(@HalfFloat short);
+ method public static int halfToRawIntBits(@HalfFloat short);
+ method @HalfFloat public static short halfToShortBits(@HalfFloat short);
+ method @HalfFloat public short halfValue();
+ method public static int hashCode(@HalfFloat short);
+ method @HalfFloat public static short intBitsToHalf(int);
method public int intValue();
- method public static boolean isInfinite(short);
+ method public static boolean isInfinite(@HalfFloat short);
method public boolean isNaN();
- method public static boolean isNaN(short);
- method public static boolean isNormalized(short);
- method public static boolean less(short, short);
- method public static boolean lessEquals(short, short);
+ method public static boolean isNaN(@HalfFloat short);
+ method public static boolean isNormalized(@HalfFloat short);
+ method public static boolean less(@HalfFloat short, @HalfFloat short);
+ method public static boolean lessEquals(@HalfFloat short, @HalfFloat short);
method public long longValue();
- method public static short max(short, short);
- method public static short min(short, short);
- method public static short parseHalf(java.lang.String) throws java.lang.NumberFormatException;
- method public static short round(short);
- method public static float toFloat(short);
- method public static short toHalf(float);
- method public static java.lang.String toHexString(short);
- method public static java.lang.String toString(short);
- method public static short trunc(short);
- method public static android.util.Half valueOf(short);
- method public static android.util.Half valueOf(float);
- method public static android.util.Half valueOf(java.lang.String);
- field public static final short EPSILON = 5120; // 0x1400
- field public static final short LOWEST_VALUE = -1025; // 0xfffffbff
+ method @HalfFloat public static short max(@HalfFloat short, @HalfFloat short);
+ method @HalfFloat public static short min(@HalfFloat short, @HalfFloat short);
+ method @HalfFloat public static short parseHalf(@NonNull String) throws java.lang.NumberFormatException;
+ method @HalfFloat public static short round(@HalfFloat short);
+ method public static float toFloat(@HalfFloat short);
+ method @HalfFloat public static short toHalf(float);
+ method @NonNull public static String toHexString(@HalfFloat short);
+ method @NonNull public static String toString(@HalfFloat short);
+ method @HalfFloat public static short trunc(@HalfFloat short);
+ method @NonNull public static android.util.Half valueOf(@HalfFloat short);
+ method @NonNull public static android.util.Half valueOf(float);
+ method @NonNull public static android.util.Half valueOf(@NonNull String);
+ field @HalfFloat public static final short EPSILON = 5120; // 0x1400
+ field @HalfFloat public static final short LOWEST_VALUE = -1025; // 0xfffffbff
field public static final int MAX_EXPONENT = 15; // 0xf
- field public static final short MAX_VALUE = 31743; // 0x7bff
+ field @HalfFloat public static final short MAX_VALUE = 31743; // 0x7bff
field public static final int MIN_EXPONENT = -14; // 0xfffffff2
- field public static final short MIN_NORMAL = 1024; // 0x400
- field public static final short MIN_VALUE = 1; // 0x1
- field public static final short NEGATIVE_INFINITY = -1024; // 0xfffffc00
- field public static final short NEGATIVE_ZERO = -32768; // 0xffff8000
- field public static final short NaN = 32256; // 0x7e00
- field public static final short POSITIVE_INFINITY = 31744; // 0x7c00
- field public static final short POSITIVE_ZERO = 0; // 0x0
+ field @HalfFloat public static final short MIN_NORMAL = 1024; // 0x400
+ field @HalfFloat public static final short MIN_VALUE = 1; // 0x1
+ field @HalfFloat public static final short NEGATIVE_INFINITY = -1024; // 0xfffffc00
+ field @HalfFloat public static final short NEGATIVE_ZERO = -32768; // 0xffff8000
+ field @HalfFloat public static final short NaN = 32256; // 0x7e00
+ field @HalfFloat public static final short POSITIVE_INFINITY = 31744; // 0x7c00
+ field @HalfFloat public static final short POSITIVE_ZERO = 0; // 0x0
field public static final int SIZE = 16; // 0x10
}
- public abstract class IntProperty<T> extends android.util.Property {
- ctor public IntProperty(java.lang.String);
- method public final void set(T, java.lang.Integer);
+ public abstract class IntProperty<T> extends android.util.Property<T,java.lang.Integer> {
+ ctor public IntProperty(String);
+ method public final void set(T, Integer);
method public abstract void setValue(T, int);
}
@@ -47524,17 +47803,15 @@ package android.util {
method public double nextDouble() throws java.io.IOException;
method public int nextInt() throws java.io.IOException;
method public long nextLong() throws java.io.IOException;
- method public java.lang.String nextName() throws java.io.IOException;
+ method public String nextName() throws java.io.IOException;
method public void nextNull() throws java.io.IOException;
- method public java.lang.String nextString() throws java.io.IOException;
+ method public String nextString() throws java.io.IOException;
method public android.util.JsonToken peek() throws java.io.IOException;
method public void setLenient(boolean);
method public void skipValue() throws java.io.IOException;
}
- public final class JsonToken extends java.lang.Enum {
- method public static android.util.JsonToken valueOf(java.lang.String);
- method public static final android.util.JsonToken[] values();
+ public enum JsonToken {
enum_constant public static final android.util.JsonToken BEGIN_ARRAY;
enum_constant public static final android.util.JsonToken BEGIN_OBJECT;
enum_constant public static final android.util.JsonToken BOOLEAN;
@@ -47556,15 +47833,15 @@ package android.util {
method public android.util.JsonWriter endObject() throws java.io.IOException;
method public void flush() throws java.io.IOException;
method public boolean isLenient();
- method public android.util.JsonWriter name(java.lang.String) throws java.io.IOException;
+ method public android.util.JsonWriter name(String) throws java.io.IOException;
method public android.util.JsonWriter nullValue() throws java.io.IOException;
- method public void setIndent(java.lang.String);
+ method public void setIndent(String);
method public void setLenient(boolean);
- method public android.util.JsonWriter value(java.lang.String) throws java.io.IOException;
+ method public android.util.JsonWriter value(String) throws java.io.IOException;
method public android.util.JsonWriter value(boolean) throws java.io.IOException;
method public android.util.JsonWriter value(double) throws java.io.IOException;
method public android.util.JsonWriter value(long) throws java.io.IOException;
- method public android.util.JsonWriter value(java.lang.Number) throws java.io.IOException;
+ method public android.util.JsonWriter value(Number) throws java.io.IOException;
}
public final class LayoutDirection {
@@ -47575,23 +47852,23 @@ package android.util {
}
public final class Log {
- method public static int d(java.lang.String, java.lang.String);
- method public static int d(java.lang.String, java.lang.String, java.lang.Throwable);
- method public static int e(java.lang.String, java.lang.String);
- method public static int e(java.lang.String, java.lang.String, java.lang.Throwable);
- method public static java.lang.String getStackTraceString(java.lang.Throwable);
- method public static int i(java.lang.String, java.lang.String);
- method public static int i(java.lang.String, java.lang.String, java.lang.Throwable);
- method public static boolean isLoggable(java.lang.String, int);
- method public static int println(int, java.lang.String, java.lang.String);
- method public static int v(java.lang.String, java.lang.String);
- method public static int v(java.lang.String, java.lang.String, java.lang.Throwable);
- method public static int w(java.lang.String, java.lang.String);
- method public static int w(java.lang.String, java.lang.String, java.lang.Throwable);
- method public static int w(java.lang.String, java.lang.Throwable);
- method public static int wtf(java.lang.String, java.lang.String);
- method public static int wtf(java.lang.String, java.lang.Throwable);
- method public static int wtf(java.lang.String, java.lang.String, java.lang.Throwable);
+ method public static int d(@Nullable String, @NonNull String);
+ method public static int d(@Nullable String, @Nullable String, @Nullable Throwable);
+ method public static int e(@Nullable String, @NonNull String);
+ method public static int e(@Nullable String, @Nullable String, @Nullable Throwable);
+ method @NonNull public static String getStackTraceString(@Nullable Throwable);
+ method public static int i(@Nullable String, @NonNull String);
+ method public static int i(@Nullable String, @Nullable String, @Nullable Throwable);
+ method public static boolean isLoggable(@Nullable @Size(max=23, apis="..23") String, int);
+ method public static int println(int, @Nullable String, @NonNull String);
+ method public static int v(@Nullable String, @NonNull String);
+ method public static int v(@Nullable String, @Nullable String, @Nullable Throwable);
+ method public static int w(@Nullable String, @NonNull String);
+ method public static int w(@Nullable String, @Nullable String, @Nullable Throwable);
+ method public static int w(@Nullable String, @Nullable Throwable);
+ method public static int wtf(@Nullable String, @Nullable String);
+ method public static int wtf(@Nullable String, @NonNull Throwable);
+ method public static int wtf(@Nullable String, @Nullable String, @Nullable Throwable);
field public static final int ASSERT = 7; // 0x7
field public static final int DEBUG = 3; // 0x3
field public static final int ERROR = 6; // 0x6
@@ -47601,8 +47878,8 @@ package android.util {
}
public class LogPrinter implements android.util.Printer {
- ctor public LogPrinter(int, java.lang.String);
- method public void println(java.lang.String);
+ ctor public LogPrinter(int, String);
+ method public void println(String);
}
public class LongSparseArray<E> implements java.lang.Cloneable {
@@ -47628,27 +47905,27 @@ package android.util {
public class LruCache<K, V> {
ctor public LruCache(int);
method protected V create(K);
- method public final synchronized int createCount();
+ method public final int createCount();
method protected void entryRemoved(boolean, K, V, V);
method public final void evictAll();
- method public final synchronized int evictionCount();
+ method public final int evictionCount();
method public final V get(K);
- method public final synchronized int hitCount();
- method public final synchronized int maxSize();
- method public final synchronized int missCount();
+ method public final int hitCount();
+ method public final int maxSize();
+ method public final int missCount();
method public final V put(K, V);
- method public final synchronized int putCount();
+ method public final int putCount();
method public final V remove(K);
method public void resize(int);
- method public final synchronized int size();
+ method public final int size();
method protected int sizeOf(K, V);
- method public final synchronized java.util.Map<K, V> snapshot();
- method public final synchronized java.lang.String toString();
+ method public final java.util.Map<K,V> snapshot();
+ method public final String toString();
method public void trimToSize(int);
}
public final class MalformedJsonException extends java.io.IOException {
- ctor public MalformedJsonException(java.lang.String);
+ ctor public MalformedJsonException(String);
}
public class MonthDisplayHelper {
@@ -47669,92 +47946,92 @@ package android.util {
method public void previousMonth();
}
- public final deprecated class MutableBoolean {
- ctor public MutableBoolean(boolean);
- field public boolean value;
+ @Deprecated public final class MutableBoolean {
+ ctor @Deprecated public MutableBoolean(boolean);
+ field @Deprecated public boolean value;
}
- public final deprecated class MutableByte {
- ctor public MutableByte(byte);
- field public byte value;
+ @Deprecated public final class MutableByte {
+ ctor @Deprecated public MutableByte(byte);
+ field @Deprecated public byte value;
}
- public final deprecated class MutableChar {
- ctor public MutableChar(char);
- field public char value;
+ @Deprecated public final class MutableChar {
+ ctor @Deprecated public MutableChar(char);
+ field @Deprecated public char value;
}
- public final deprecated class MutableDouble {
- ctor public MutableDouble(double);
- field public double value;
+ @Deprecated public final class MutableDouble {
+ ctor @Deprecated public MutableDouble(double);
+ field @Deprecated public double value;
}
- public final deprecated class MutableFloat {
- ctor public MutableFloat(float);
- field public float value;
+ @Deprecated public final class MutableFloat {
+ ctor @Deprecated public MutableFloat(float);
+ field @Deprecated public float value;
}
- public final deprecated class MutableInt {
- ctor public MutableInt(int);
- field public int value;
+ @Deprecated public final class MutableInt {
+ ctor @Deprecated public MutableInt(int);
+ field @Deprecated public int value;
}
- public final deprecated class MutableLong {
- ctor public MutableLong(long);
- field public long value;
+ @Deprecated public final class MutableLong {
+ ctor @Deprecated public MutableLong(long);
+ field @Deprecated public long value;
}
- public final deprecated class MutableShort {
- ctor public MutableShort(short);
- field public short value;
+ @Deprecated public final class MutableShort {
+ ctor @Deprecated public MutableShort(short);
+ field @Deprecated public short value;
}
public class NoSuchPropertyException extends java.lang.RuntimeException {
- ctor public NoSuchPropertyException(java.lang.String);
+ ctor public NoSuchPropertyException(String);
}
public class Pair<F, S> {
ctor public Pair(F, S);
- method public static <A, B> android.util.Pair<A, B> create(A, B);
+ method public static <A, B> android.util.Pair<A,B> create(A, B);
field public final F first;
field public final S second;
}
public class Patterns {
- method public static final java.lang.String concatGroups(java.util.regex.Matcher);
- method public static final java.lang.String digitsAndPlusOnly(java.util.regex.Matcher);
+ method public static final String concatGroups(java.util.regex.Matcher);
+ method public static final String digitsAndPlusOnly(java.util.regex.Matcher);
field public static final java.util.regex.Pattern DOMAIN_NAME;
field public static final java.util.regex.Pattern EMAIL_ADDRESS;
- field public static final deprecated java.lang.String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
+ field @Deprecated public static final String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
field public static final java.util.regex.Pattern IP_ADDRESS;
field public static final java.util.regex.Pattern PHONE;
- field public static final deprecated java.util.regex.Pattern TOP_LEVEL_DOMAIN;
- field public static final deprecated java.lang.String TOP_LEVEL_DOMAIN_STR = "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(biz|b[abdefghijmnorstvwyz])|(cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(edu|e[cegrstu])|f[ijkmor]|(gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(info|int|i[delmnoqrst])|(jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(name|net|n[acefgilopruz])|(org|om)|(pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw])";
- field public static final deprecated java.lang.String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = "(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(?:\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw]))";
+ field @Deprecated public static final java.util.regex.Pattern TOP_LEVEL_DOMAIN;
+ field @Deprecated public static final String TOP_LEVEL_DOMAIN_STR = "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(biz|b[abdefghijmnorstvwyz])|(cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(edu|e[cegrstu])|f[ijkmor]|(gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(info|int|i[delmnoqrst])|(jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(name|net|n[acefgilopruz])|(org|om)|(pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw])";
+ field @Deprecated public static final String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = "(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(?:\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw]))";
field public static final java.util.regex.Pattern WEB_URL;
}
public class PrintStreamPrinter implements android.util.Printer {
ctor public PrintStreamPrinter(java.io.PrintStream);
- method public void println(java.lang.String);
+ method public void println(String);
}
public class PrintWriterPrinter implements android.util.Printer {
ctor public PrintWriterPrinter(java.io.PrintWriter);
- method public void println(java.lang.String);
+ method public void println(String);
}
- public abstract interface Printer {
- method public abstract void println(java.lang.String);
+ public interface Printer {
+ method public void println(String);
}
public abstract class Property<T, V> {
- ctor public Property(java.lang.Class<V>, java.lang.String);
+ ctor public Property(Class<V>, String);
method public abstract V get(T);
- method public java.lang.String getName();
- method public java.lang.Class<V> getType();
+ method public String getName();
+ method public Class<V> getType();
method public boolean isReadOnly();
- method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
+ method public static <T, V> android.util.Property<T,V> of(Class<T>, Class<V>, String);
method public void set(T, V);
}
@@ -47773,7 +48050,7 @@ package android.util {
method public android.util.Range<T> intersect(T, T);
}
- public final class Rational extends java.lang.Number implements java.lang.Comparable {
+ public final class Rational extends java.lang.Number implements java.lang.Comparable<android.util.Rational> {
ctor public Rational(int, int);
method public int compareTo(android.util.Rational);
method public double doubleValue();
@@ -47786,7 +48063,7 @@ package android.util {
method public boolean isNaN();
method public boolean isZero();
method public long longValue();
- method public static android.util.Rational parseRational(java.lang.String) throws java.lang.NumberFormatException;
+ method public static android.util.Rational parseRational(String) throws java.lang.NumberFormatException;
field public static final android.util.Rational NEGATIVE_INFINITY;
field public static final android.util.Rational NaN;
field public static final android.util.Rational POSITIVE_INFINITY;
@@ -47797,14 +48074,14 @@ package android.util {
ctor public Size(int, int);
method public int getHeight();
method public int getWidth();
- method public static android.util.Size parseSize(java.lang.String) throws java.lang.NumberFormatException;
+ method public static android.util.Size parseSize(String) throws java.lang.NumberFormatException;
}
public final class SizeF {
ctor public SizeF(float, float);
method public float getHeight();
method public float getWidth();
- method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException;
+ method public static android.util.SizeF parseSizeF(String) throws java.lang.NumberFormatException;
}
public class SparseArray<E> implements java.lang.Cloneable {
@@ -47885,7 +48162,7 @@ package android.util {
}
public class StateSet {
- method public static java.lang.String dump(int[]);
+ method public static String dump(int[]);
method public static boolean isWildCard(int[]);
method public static boolean stateSetMatches(int[], int[]);
method public static boolean stateSetMatches(int[], int);
@@ -47901,32 +48178,32 @@ package android.util {
}
public class StringBuilderPrinter implements android.util.Printer {
- ctor public StringBuilderPrinter(java.lang.StringBuilder);
- method public void println(java.lang.String);
+ ctor public StringBuilderPrinter(StringBuilder);
+ method public void println(String);
}
public class TimeFormatException extends java.lang.RuntimeException {
}
public class TimeUtils {
- method public static java.util.TimeZone getTimeZone(int, boolean, long, java.lang.String);
- method public static java.lang.String getTimeZoneDatabaseVersion();
- method public static java.util.List<java.lang.String> getTimeZoneIdsForCountryCode(java.lang.String);
+ method public static java.util.TimeZone getTimeZone(int, boolean, long, String);
+ method public static String getTimeZoneDatabaseVersion();
+ method @Nullable public static java.util.List<java.lang.String> getTimeZoneIdsForCountryCode(@NonNull String);
}
public class TimingLogger {
- ctor public TimingLogger(java.lang.String, java.lang.String);
- method public void addSplit(java.lang.String);
+ ctor public TimingLogger(String, String);
+ method public void addSplit(String);
method public void dumpToLog();
- method public void reset(java.lang.String, java.lang.String);
+ method public void reset(String, String);
method public void reset();
}
public class TypedValue {
ctor public TypedValue();
method public static float applyDimension(int, float, android.util.DisplayMetrics);
- method public final java.lang.CharSequence coerceToString();
- method public static final java.lang.String coerceToString(int, int);
+ method public final CharSequence coerceToString();
+ method public static final String coerceToString(int, int);
method public static float complexToDimension(int, android.util.DisplayMetrics);
method public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
method public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
@@ -47982,25 +48259,24 @@ package android.util {
field public int changingConfigurations;
field public int data;
field public int density;
- field public int resourceId;
- field public java.lang.CharSequence string;
+ field @AnyRes public int resourceId;
+ field public int sourceStyleResourceId;
+ field public CharSequence string;
field public int type;
}
public class Xml {
method public static android.util.AttributeSet asAttributeSet(org.xmlpull.v1.XmlPullParser);
- method public static android.util.Xml.Encoding findEncodingByName(java.lang.String) throws java.io.UnsupportedEncodingException;
+ method public static android.util.Xml.Encoding findEncodingByName(String) throws java.io.UnsupportedEncodingException;
method public static org.xmlpull.v1.XmlPullParser newPullParser();
method public static org.xmlpull.v1.XmlSerializer newSerializer();
- method public static void parse(java.lang.String, org.xml.sax.ContentHandler) throws org.xml.sax.SAXException;
+ method public static void parse(String, org.xml.sax.ContentHandler) throws org.xml.sax.SAXException;
method public static void parse(java.io.Reader, org.xml.sax.ContentHandler) throws java.io.IOException, org.xml.sax.SAXException;
method public static void parse(java.io.InputStream, android.util.Xml.Encoding, org.xml.sax.ContentHandler) throws java.io.IOException, org.xml.sax.SAXException;
- field public static java.lang.String FEATURE_RELAXED;
+ field public static String FEATURE_RELAXED;
}
- public static final class Xml.Encoding extends java.lang.Enum {
- method public static android.util.Xml.Encoding valueOf(java.lang.String);
- method public static final android.util.Xml.Encoding[] values();
+ public enum Xml.Encoding {
enum_constant public static final android.util.Xml.Encoding ISO_8859_1;
enum_constant public static final android.util.Xml.Encoding US_ASCII;
enum_constant public static final android.util.Xml.Encoding UTF_16;
@@ -48014,7 +48290,7 @@ package android.view {
public abstract class AbsSavedState implements android.os.Parcelable {
ctor protected AbsSavedState(android.os.Parcelable);
ctor protected AbsSavedState(android.os.Parcel);
- ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+ ctor protected AbsSavedState(android.os.Parcel, ClassLoader);
method public int describeContents();
method public final android.os.Parcelable getSuperState();
method public void writeToParcel(android.os.Parcel, int);
@@ -48028,9 +48304,9 @@ package android.view {
method public abstract android.view.View getCustomView();
method public abstract android.view.Menu getMenu();
method public abstract android.view.MenuInflater getMenuInflater();
- method public abstract java.lang.CharSequence getSubtitle();
- method public java.lang.Object getTag();
- method public abstract java.lang.CharSequence getTitle();
+ method public abstract CharSequence getSubtitle();
+ method public Object getTag();
+ method public abstract CharSequence getTitle();
method public boolean getTitleOptionalHint();
method public int getType();
method public void hide(long);
@@ -48039,11 +48315,11 @@ package android.view {
method public boolean isTitleOptional();
method public void onWindowFocusChanged(boolean);
method public abstract void setCustomView(android.view.View);
- method public abstract void setSubtitle(java.lang.CharSequence);
- method public abstract void setSubtitle(int);
- method public void setTag(java.lang.Object);
- method public abstract void setTitle(java.lang.CharSequence);
- method public abstract void setTitle(int);
+ method public abstract void setSubtitle(CharSequence);
+ method public abstract void setSubtitle(@StringRes int);
+ method public void setTag(Object);
+ method public abstract void setTitle(CharSequence);
+ method public abstract void setTitle(@StringRes int);
method public void setTitleOptionalHint(boolean);
method public void setType(int);
field public static final int DEFAULT_HIDE_DURATION = -1; // 0xffffffff
@@ -48051,14 +48327,14 @@ package android.view {
field public static final int TYPE_PRIMARY = 0; // 0x0
}
- public static abstract interface ActionMode.Callback {
- method public abstract boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
- method public abstract boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
- method public abstract void onDestroyActionMode(android.view.ActionMode);
- method public abstract boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
+ method public boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
+ method public void onDestroyActionMode(android.view.ActionMode);
+ method public boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
}
- public static abstract class ActionMode.Callback2 implements android.view.ActionMode.Callback {
+ public abstract static class ActionMode.Callback2 implements android.view.ActionMode.Callback {
ctor public ActionMode.Callback2();
method public void onGetContentRect(android.view.ActionMode, android.view.View, android.graphics.Rect);
}
@@ -48067,7 +48343,7 @@ package android.view {
ctor public ActionProvider(android.content.Context);
method public boolean hasSubMenu();
method public boolean isVisible();
- method public abstract deprecated android.view.View onCreateActionView();
+ method @Deprecated public abstract android.view.View onCreateActionView();
method public android.view.View onCreateActionView(android.view.MenuItem);
method public boolean onPerformDefaultAction();
method public void onPrepareSubMenu(android.view.SubMenu);
@@ -48076,8 +48352,8 @@ package android.view {
method public void setVisibilityListener(android.view.ActionProvider.VisibilityListener);
}
- public static abstract interface ActionProvider.VisibilityListener {
- method public abstract void onActionProviderVisibilityChanged(boolean);
+ public static interface ActionProvider.VisibilityListener {
+ method public void onActionProviderVisibilityChanged(boolean);
}
public final class Choreographer {
@@ -48087,30 +48363,30 @@ package android.view {
method public void removeFrameCallback(android.view.Choreographer.FrameCallback);
}
- public static abstract interface Choreographer.FrameCallback {
- method public abstract void doFrame(long);
+ public static interface Choreographer.FrameCallback {
+ method public void doFrame(long);
}
- public abstract interface CollapsibleActionView {
- method public abstract void onActionViewCollapsed();
- method public abstract void onActionViewExpanded();
+ public interface CollapsibleActionView {
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
}
- public abstract interface ContextMenu implements android.view.Menu {
- method public abstract void clearHeader();
- method public abstract android.view.ContextMenu setHeaderIcon(int);
- method public abstract android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
- method public abstract android.view.ContextMenu setHeaderTitle(int);
- method public abstract android.view.ContextMenu setHeaderTitle(java.lang.CharSequence);
- method public abstract android.view.ContextMenu setHeaderView(android.view.View);
+ public interface ContextMenu extends android.view.Menu {
+ method public void clearHeader();
+ method public android.view.ContextMenu setHeaderIcon(@DrawableRes int);
+ method public android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
+ method public android.view.ContextMenu setHeaderTitle(@StringRes int);
+ method public android.view.ContextMenu setHeaderTitle(CharSequence);
+ method public android.view.ContextMenu setHeaderView(android.view.View);
}
- public static abstract interface ContextMenu.ContextMenuInfo {
+ public static interface ContextMenu.ContextMenuInfo {
}
public class ContextThemeWrapper extends android.content.ContextWrapper {
ctor public ContextThemeWrapper();
- ctor public ContextThemeWrapper(android.content.Context, int);
+ ctor public ContextThemeWrapper(android.content.Context, @StyleRes int);
ctor public ContextThemeWrapper(android.content.Context, android.content.res.Resources.Theme);
method public void applyOverrideConfiguration(android.content.res.Configuration);
method protected void onApplyThemeResource(android.content.res.Resources.Theme, int, boolean);
@@ -48119,16 +48395,16 @@ package android.view {
public final class Display {
method public long getAppVsyncOffsetNanos();
method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
- method public android.view.DisplayCutout getCutout();
+ method @Nullable public android.view.DisplayCutout getCutout();
method public int getDisplayId();
method public int getFlags();
method public android.view.Display.HdrCapabilities getHdrCapabilities();
- method public deprecated int getHeight();
+ method @Deprecated public int getHeight();
method public void getMetrics(android.util.DisplayMetrics);
method public android.view.Display.Mode getMode();
- method public java.lang.String getName();
- method public deprecated int getOrientation();
- method public deprecated int getPixelFormat();
+ method public String getName();
+ method @Deprecated public int getOrientation();
+ method @Deprecated public int getPixelFormat();
method public long getPresentationDeadlineNanos();
method public void getRealMetrics(android.util.DisplayMetrics);
method public void getRealSize(android.graphics.Point);
@@ -48138,8 +48414,8 @@ package android.view {
method public void getSize(android.graphics.Point);
method public int getState();
method public android.view.Display.Mode[] getSupportedModes();
- method public deprecated float[] getSupportedRefreshRates();
- method public deprecated int getWidth();
+ method @Deprecated public float[] getSupportedRefreshRates();
+ method @Deprecated public int getWidth();
method public boolean isHdr();
method public boolean isValid();
method public boolean isWideColorGamut();
@@ -48169,6 +48445,7 @@ package android.view {
field public static final android.os.Parcelable.Creator<android.view.Display.HdrCapabilities> CREATOR;
field public static final int HDR_TYPE_DOLBY_VISION = 1; // 0x1
field public static final int HDR_TYPE_HDR10 = 2; // 0x2
+ field public static final int HDR_TYPE_HDR10_PLUS = 4; // 0x4
field public static final int HDR_TYPE_HLG = 3; // 0x3
field public static final float INVALID_LUMINANCE = -1.0f;
}
@@ -48184,13 +48461,13 @@ package android.view {
}
public final class DisplayCutout {
- ctor public DisplayCutout(android.graphics.Insets, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect);
- ctor public deprecated DisplayCutout(android.graphics.Rect, java.util.List<android.graphics.Rect>);
- method public android.graphics.Rect getBoundingRectBottom();
- method public android.graphics.Rect getBoundingRectLeft();
- method public android.graphics.Rect getBoundingRectRight();
- method public android.graphics.Rect getBoundingRectTop();
- method public java.util.List<android.graphics.Rect> getBoundingRects();
+ ctor public DisplayCutout(@NonNull android.graphics.Insets, @Nullable android.graphics.Rect, @Nullable android.graphics.Rect, @Nullable android.graphics.Rect, @Nullable android.graphics.Rect);
+ ctor @Deprecated public DisplayCutout(@Nullable android.graphics.Rect, @Nullable java.util.List<android.graphics.Rect>);
+ method @NonNull public android.graphics.Rect getBoundingRectBottom();
+ method @NonNull public android.graphics.Rect getBoundingRectLeft();
+ method @NonNull public android.graphics.Rect getBoundingRectRight();
+ method @NonNull public android.graphics.Rect getBoundingRectTop();
+ method @NonNull public java.util.List<android.graphics.Rect> getBoundingRects();
method public int getSafeInsetBottom();
method public int getSafeInsetLeft();
method public int getSafeInsetRight();
@@ -48209,7 +48486,7 @@ package android.view {
method public int getAction();
method public android.content.ClipData getClipData();
method public android.content.ClipDescription getClipDescription();
- method public java.lang.Object getLocalState();
+ method public Object getLocalState();
method public boolean getResult();
method public float getX();
method public float getY();
@@ -48227,7 +48504,7 @@ package android.view {
method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
method public android.view.View findNextFocusFromRect(android.view.ViewGroup, android.graphics.Rect, int);
- method public android.view.View findNextKeyboardNavigationCluster(android.view.View, android.view.View, int);
+ method public android.view.View findNextKeyboardNavigationCluster(@NonNull android.view.View, @Nullable android.view.View, int);
method public static android.view.FocusFinder getInstance();
}
@@ -48259,8 +48536,8 @@ package android.view {
}
public class GestureDetector {
- ctor public deprecated GestureDetector(android.view.GestureDetector.OnGestureListener, android.os.Handler);
- ctor public deprecated GestureDetector(android.view.GestureDetector.OnGestureListener);
+ ctor @Deprecated public GestureDetector(android.view.GestureDetector.OnGestureListener, android.os.Handler);
+ ctor @Deprecated public GestureDetector(android.view.GestureDetector.OnGestureListener);
ctor public GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener);
ctor public GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
ctor public GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler, boolean);
@@ -48272,23 +48549,23 @@ package android.view {
method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
}
- public static abstract interface GestureDetector.OnContextClickListener {
- method public abstract boolean onContextClick(android.view.MotionEvent);
+ public static interface GestureDetector.OnContextClickListener {
+ method public boolean onContextClick(android.view.MotionEvent);
}
- public static abstract interface GestureDetector.OnDoubleTapListener {
- method public abstract boolean onDoubleTap(android.view.MotionEvent);
- method public abstract boolean onDoubleTapEvent(android.view.MotionEvent);
- method public abstract boolean onSingleTapConfirmed(android.view.MotionEvent);
+ public static interface GestureDetector.OnDoubleTapListener {
+ method public boolean onDoubleTap(android.view.MotionEvent);
+ method public boolean onDoubleTapEvent(android.view.MotionEvent);
+ method public boolean onSingleTapConfirmed(android.view.MotionEvent);
}
- public static abstract interface GestureDetector.OnGestureListener {
- method public abstract boolean onDown(android.view.MotionEvent);
- method public abstract boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public abstract void onLongPress(android.view.MotionEvent);
- method public abstract boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public abstract void onShowPress(android.view.MotionEvent);
- method public abstract boolean onSingleTapUp(android.view.MotionEvent);
+ public static interface GestureDetector.OnGestureListener {
+ method public boolean onDown(android.view.MotionEvent);
+ method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
+ method public void onLongPress(android.view.MotionEvent);
+ method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
+ method public void onShowPress(android.view.MotionEvent);
+ method public boolean onSingleTapUp(android.view.MotionEvent);
}
public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnContextClickListener android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener {
@@ -48361,15 +48638,15 @@ package android.view {
public class InflateException extends java.lang.RuntimeException {
ctor public InflateException();
- ctor public InflateException(java.lang.String, java.lang.Throwable);
- ctor public InflateException(java.lang.String);
- ctor public InflateException(java.lang.Throwable);
+ ctor public InflateException(String, Throwable);
+ ctor public InflateException(String);
+ ctor public InflateException(Throwable);
}
public final class InputDevice implements android.os.Parcelable {
method public int describeContents();
method public int getControllerNumber();
- method public java.lang.String getDescriptor();
+ method public String getDescriptor();
method public static android.view.InputDevice getDevice(int);
method public static int[] getDeviceIds();
method public int getId();
@@ -48378,7 +48655,7 @@ package android.view {
method public android.view.InputDevice.MotionRange getMotionRange(int);
method public android.view.InputDevice.MotionRange getMotionRange(int, int);
method public java.util.List<android.view.InputDevice.MotionRange> getMotionRanges();
- method public java.lang.String getName();
+ method public String getName();
method public int getProductId();
method public int getSources();
method public int getVendorId();
@@ -48393,15 +48670,15 @@ package android.view {
field public static final int KEYBOARD_TYPE_ALPHABETIC = 2; // 0x2
field public static final int KEYBOARD_TYPE_NONE = 0; // 0x0
field public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1; // 0x1
- field public static final deprecated int MOTION_RANGE_ORIENTATION = 8; // 0x8
- field public static final deprecated int MOTION_RANGE_PRESSURE = 2; // 0x2
- field public static final deprecated int MOTION_RANGE_SIZE = 3; // 0x3
- field public static final deprecated int MOTION_RANGE_TOOL_MAJOR = 6; // 0x6
- field public static final deprecated int MOTION_RANGE_TOOL_MINOR = 7; // 0x7
- field public static final deprecated int MOTION_RANGE_TOUCH_MAJOR = 4; // 0x4
- field public static final deprecated int MOTION_RANGE_TOUCH_MINOR = 5; // 0x5
- field public static final deprecated int MOTION_RANGE_X = 0; // 0x0
- field public static final deprecated int MOTION_RANGE_Y = 1; // 0x1
+ field @Deprecated public static final int MOTION_RANGE_ORIENTATION = 8; // 0x8
+ field @Deprecated public static final int MOTION_RANGE_PRESSURE = 2; // 0x2
+ field @Deprecated public static final int MOTION_RANGE_SIZE = 3; // 0x3
+ field @Deprecated public static final int MOTION_RANGE_TOOL_MAJOR = 6; // 0x6
+ field @Deprecated public static final int MOTION_RANGE_TOOL_MINOR = 7; // 0x7
+ field @Deprecated public static final int MOTION_RANGE_TOUCH_MAJOR = 4; // 0x4
+ field @Deprecated public static final int MOTION_RANGE_TOUCH_MINOR = 5; // 0x5
+ field @Deprecated public static final int MOTION_RANGE_X = 0; // 0x0
+ field @Deprecated public static final int MOTION_RANGE_Y = 1; // 0x1
field public static final int SOURCE_ANY = -256; // 0xffffff00
field public static final int SOURCE_BLUETOOTH_STYLUS = 49154; // 0xc002
field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
@@ -48452,9 +48729,9 @@ package android.view {
public final class InputQueue {
}
- public static abstract interface InputQueue.Callback {
- method public abstract void onInputQueueCreated(android.view.InputQueue);
- method public abstract void onInputQueueDestroyed(android.view.InputQueue);
+ public static interface InputQueue.Callback {
+ method public void onInputQueueCreated(android.view.InputQueue);
+ method public void onInputQueueDestroyed(android.view.InputQueue);
}
public class KeyCharacterMap implements android.os.Parcelable {
@@ -48465,7 +48742,7 @@ package android.view {
method public static int getDeadChar(int, int);
method public char getDisplayLabel(int);
method public android.view.KeyEvent[] getEvents(char[]);
- method public deprecated boolean getKeyData(int, android.view.KeyCharacterMap.KeyData);
+ method @Deprecated public boolean getKeyData(int, android.view.KeyCharacterMap.KeyData);
method public int getKeyboardType();
method public char getMatch(int, char[]);
method public char getMatch(int, char[], int);
@@ -48475,7 +48752,7 @@ package android.view {
method public static android.view.KeyCharacterMap load(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ALPHA = 3; // 0x3
- field public static final deprecated int BUILT_IN_KEYBOARD = 0; // 0x0
+ field @Deprecated public static final int BUILT_IN_KEYBOARD = 0; // 0x0
field public static final int COMBINING_ACCENT = -2147483648; // 0x80000000
field public static final int COMBINING_ACCENT_MASK = 2147483647; // 0x7fffffff
field public static final android.os.Parcelable.Creator<android.view.KeyCharacterMap> CREATOR;
@@ -48490,16 +48767,16 @@ package android.view {
field public static final int VIRTUAL_KEYBOARD = -1; // 0xffffffff
}
- public static deprecated class KeyCharacterMap.KeyData {
- ctor public KeyCharacterMap.KeyData();
- field public static final int META_LENGTH = 4; // 0x4
- field public char displayLabel;
- field public char[] meta;
- field public char number;
+ @Deprecated public static class KeyCharacterMap.KeyData {
+ ctor @Deprecated public KeyCharacterMap.KeyData();
+ field @Deprecated public static final int META_LENGTH = 4; // 0x4
+ field @Deprecated public char displayLabel;
+ field @Deprecated public char[] meta;
+ field @Deprecated public char number;
}
public static class KeyCharacterMap.UnavailableException extends android.util.AndroidRuntimeException {
- ctor public KeyCharacterMap.UnavailableException(java.lang.String);
+ ctor public KeyCharacterMap.UnavailableException(String);
}
public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable {
@@ -48509,17 +48786,17 @@ package android.view {
ctor public KeyEvent(long, long, int, int, int, int, int, int);
ctor public KeyEvent(long, long, int, int, int, int, int, int, int);
ctor public KeyEvent(long, long, int, int, int, int, int, int, int, int);
- ctor public KeyEvent(long, java.lang.String, int, int);
+ ctor public KeyEvent(long, String, int, int);
ctor public KeyEvent(android.view.KeyEvent);
- ctor public deprecated KeyEvent(android.view.KeyEvent, long, int);
+ ctor @Deprecated public KeyEvent(android.view.KeyEvent, long, int);
method public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
method public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
method public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
method public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int, int);
- method public final deprecated boolean dispatch(android.view.KeyEvent.Callback);
- method public final boolean dispatch(android.view.KeyEvent.Callback, android.view.KeyEvent.DispatcherState, java.lang.Object);
+ method @Deprecated public final boolean dispatch(android.view.KeyEvent.Callback);
+ method public final boolean dispatch(android.view.KeyEvent.Callback, android.view.KeyEvent.DispatcherState, Object);
method public final int getAction();
- method public final deprecated java.lang.String getCharacters();
+ method @Deprecated public final String getCharacters();
method public static int getDeadChar(int, int);
method public final int getDeviceId();
method public char getDisplayLabel();
@@ -48528,7 +48805,7 @@ package android.view {
method public final int getFlags();
method public final android.view.KeyCharacterMap getKeyCharacterMap();
method public final int getKeyCode();
- method public deprecated boolean getKeyData(android.view.KeyCharacterMap.KeyData);
+ method @Deprecated public boolean getKeyData(android.view.KeyCharacterMap.KeyData);
method public char getMatch(char[]);
method public char getMatch(char[], int);
method public static int getMaxKeyCode();
@@ -48560,8 +48837,8 @@ package android.view {
method public final boolean isSymPressed();
method public final boolean isSystem();
method public final boolean isTracking();
- method public static int keyCodeFromString(java.lang.String);
- method public static java.lang.String keyCodeToString(int);
+ method public static int keyCodeFromString(@NonNull String);
+ method public static String keyCodeToString(int);
method public static boolean metaStateHasModifiers(int, int);
method public static boolean metaStateHasNoModifiers(int);
method public static int normalizeMetaState(int);
@@ -48569,7 +48846,7 @@ package android.view {
method public final void startTracking();
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_DOWN = 0; // 0x0
- field public static final deprecated int ACTION_MULTIPLE = 2; // 0x2
+ field @Deprecated public static final int ACTION_MULTIPLE = 2; // 0x2
field public static final int ACTION_UP = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.view.KeyEvent> CREATOR;
field public static final int FLAG_CANCELED = 32; // 0x20
@@ -48582,7 +48859,7 @@ package android.view {
field public static final int FLAG_SOFT_KEYBOARD = 2; // 0x2
field public static final int FLAG_TRACKING = 512; // 0x200
field public static final int FLAG_VIRTUAL_HARD_KEY = 64; // 0x40
- field public static final deprecated int FLAG_WOKE_HERE = 1; // 0x1
+ field @Deprecated public static final int FLAG_WOKE_HERE = 1; // 0x1
field public static final int KEYCODE_0 = 7; // 0x7
field public static final int KEYCODE_1 = 8; // 0x8
field public static final int KEYCODE_11 = 227; // 0xe3
@@ -48872,7 +49149,7 @@ package android.view {
field public static final int KEYCODE_ZENKAKU_HANKAKU = 211; // 0xd3
field public static final int KEYCODE_ZOOM_IN = 168; // 0xa8
field public static final int KEYCODE_ZOOM_OUT = 169; // 0xa9
- field public static final deprecated int MAX_KEYCODE = 84; // 0x54
+ field @Deprecated public static final int MAX_KEYCODE = 84; // 0x54
field public static final int META_ALT_LEFT_ON = 16; // 0x10
field public static final int META_ALT_MASK = 50; // 0x32
field public static final int META_ALT_ON = 2; // 0x2
@@ -48896,11 +49173,11 @@ package android.view {
field public static final int META_SYM_ON = 4; // 0x4
}
- public static abstract interface KeyEvent.Callback {
- method public abstract boolean onKeyDown(int, android.view.KeyEvent);
- method public abstract boolean onKeyLongPress(int, android.view.KeyEvent);
- method public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
- method public abstract boolean onKeyUp(int, android.view.KeyEvent);
+ public static interface KeyEvent.Callback {
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyLongPress(int, android.view.KeyEvent);
+ method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
}
public static class KeyEvent.DispatcherState {
@@ -48909,28 +49186,28 @@ package android.view {
method public boolean isTracking(android.view.KeyEvent);
method public void performedLongPress(android.view.KeyEvent);
method public void reset();
- method public void reset(java.lang.Object);
- method public void startTracking(android.view.KeyEvent, java.lang.Object);
+ method public void reset(Object);
+ method public void startTracking(android.view.KeyEvent, Object);
}
public final class KeyboardShortcutGroup implements android.os.Parcelable {
- ctor public KeyboardShortcutGroup(java.lang.CharSequence, java.util.List<android.view.KeyboardShortcutInfo>);
- ctor public KeyboardShortcutGroup(java.lang.CharSequence);
+ ctor public KeyboardShortcutGroup(@Nullable CharSequence, @NonNull java.util.List<android.view.KeyboardShortcutInfo>);
+ ctor public KeyboardShortcutGroup(@Nullable CharSequence);
method public void addItem(android.view.KeyboardShortcutInfo);
method public int describeContents();
method public java.util.List<android.view.KeyboardShortcutInfo> getItems();
- method public java.lang.CharSequence getLabel();
+ method public CharSequence getLabel();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.KeyboardShortcutGroup> CREATOR;
}
public final class KeyboardShortcutInfo implements android.os.Parcelable {
- ctor public KeyboardShortcutInfo(java.lang.CharSequence, int, int);
- ctor public KeyboardShortcutInfo(java.lang.CharSequence, char, int);
+ ctor public KeyboardShortcutInfo(CharSequence, int, int);
+ ctor public KeyboardShortcutInfo(CharSequence, char, int);
method public int describeContents();
method public char getBaseCharacter();
method public int getKeycode();
- method public java.lang.CharSequence getLabel();
+ method @Nullable public CharSequence getLabel();
method public int getModifiers();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.KeyboardShortcutInfo> CREATOR;
@@ -48940,61 +49217,61 @@ package android.view {
ctor protected LayoutInflater(android.content.Context);
ctor protected LayoutInflater(android.view.LayoutInflater, android.content.Context);
method public abstract android.view.LayoutInflater cloneInContext(android.content.Context);
- method public final android.view.View createView(java.lang.String, java.lang.String, android.util.AttributeSet) throws java.lang.ClassNotFoundException, android.view.InflateException;
+ method public final android.view.View createView(String, String, android.util.AttributeSet) throws java.lang.ClassNotFoundException, android.view.InflateException;
method public static android.view.LayoutInflater from(android.content.Context);
method public android.content.Context getContext();
method public final android.view.LayoutInflater.Factory getFactory();
method public final android.view.LayoutInflater.Factory2 getFactory2();
method public android.view.LayoutInflater.Filter getFilter();
- method public android.view.View inflate(int, android.view.ViewGroup);
- method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup);
- method public android.view.View inflate(int, android.view.ViewGroup, boolean);
- method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean);
- method protected android.view.View onCreateView(java.lang.String, android.util.AttributeSet) throws java.lang.ClassNotFoundException;
- method protected android.view.View onCreateView(android.view.View, java.lang.String, android.util.AttributeSet) throws java.lang.ClassNotFoundException;
+ method public android.view.View inflate(@LayoutRes int, @Nullable android.view.ViewGroup);
+ method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, @Nullable android.view.ViewGroup);
+ method public android.view.View inflate(@LayoutRes int, @Nullable android.view.ViewGroup, boolean);
+ method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, @Nullable android.view.ViewGroup, boolean);
+ method protected android.view.View onCreateView(String, android.util.AttributeSet) throws java.lang.ClassNotFoundException;
+ method protected android.view.View onCreateView(android.view.View, String, android.util.AttributeSet) throws java.lang.ClassNotFoundException;
method public void setFactory(android.view.LayoutInflater.Factory);
method public void setFactory2(android.view.LayoutInflater.Factory2);
method public void setFilter(android.view.LayoutInflater.Filter);
}
- public static abstract interface LayoutInflater.Factory {
- method public abstract android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
+ public static interface LayoutInflater.Factory {
+ method @Nullable public android.view.View onCreateView(@NonNull String, @NonNull android.content.Context, @NonNull android.util.AttributeSet);
}
- public static abstract interface LayoutInflater.Factory2 implements android.view.LayoutInflater.Factory {
- method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+ public static interface LayoutInflater.Factory2 extends android.view.LayoutInflater.Factory {
+ method @Nullable public android.view.View onCreateView(@Nullable android.view.View, @NonNull String, @NonNull android.content.Context, @NonNull android.util.AttributeSet);
}
- public static abstract interface LayoutInflater.Filter {
- method public abstract boolean onLoadClass(java.lang.Class);
+ public static interface LayoutInflater.Filter {
+ method public boolean onLoadClass(Class);
}
- public abstract interface Menu {
- method public abstract android.view.MenuItem add(java.lang.CharSequence);
- method public abstract android.view.MenuItem add(int);
- method public abstract android.view.MenuItem add(int, int, int, java.lang.CharSequence);
- method public abstract android.view.MenuItem add(int, int, int, int);
- method public abstract int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
- method public abstract android.view.SubMenu addSubMenu(java.lang.CharSequence);
- method public abstract android.view.SubMenu addSubMenu(int);
- method public abstract android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
- method public abstract android.view.SubMenu addSubMenu(int, int, int, int);
- method public abstract void clear();
- method public abstract void close();
- method public abstract android.view.MenuItem findItem(int);
- method public abstract android.view.MenuItem getItem(int);
- method public abstract boolean hasVisibleItems();
- method public abstract boolean isShortcutKey(int, android.view.KeyEvent);
- method public abstract boolean performIdentifierAction(int, int);
- method public abstract boolean performShortcut(int, android.view.KeyEvent, int);
- method public abstract void removeGroup(int);
- method public abstract void removeItem(int);
- method public abstract void setGroupCheckable(int, boolean, boolean);
+ public interface Menu {
+ method public android.view.MenuItem add(CharSequence);
+ method public android.view.MenuItem add(@StringRes int);
+ method public android.view.MenuItem add(int, int, int, CharSequence);
+ method public android.view.MenuItem add(int, int, int, @StringRes int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
+ method public android.view.SubMenu addSubMenu(CharSequence);
+ method public android.view.SubMenu addSubMenu(@StringRes int);
+ method public android.view.SubMenu addSubMenu(int, int, int, CharSequence);
+ method public android.view.SubMenu addSubMenu(int, int, int, @StringRes int);
+ method public void clear();
+ method public void close();
+ method public android.view.MenuItem findItem(int);
+ method public android.view.MenuItem getItem(int);
+ method public boolean hasVisibleItems();
+ method public boolean isShortcutKey(int, android.view.KeyEvent);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performShortcut(int, android.view.KeyEvent, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void setGroupCheckable(int, boolean, boolean);
method public default void setGroupDividerEnabled(boolean);
- method public abstract void setGroupEnabled(int, boolean);
- method public abstract void setGroupVisible(int, boolean);
- method public abstract void setQwertyMode(boolean);
- method public abstract int size();
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method public void setQwertyMode(boolean);
+ method public int size();
field public static final int CATEGORY_ALTERNATIVE = 262144; // 0x40000
field public static final int CATEGORY_CONTAINER = 65536; // 0x10000
field public static final int CATEGORY_SECONDARY = 196608; // 0x30000
@@ -49009,64 +49286,64 @@ package android.view {
public class MenuInflater {
ctor public MenuInflater(android.content.Context);
- method public void inflate(int, android.view.Menu);
+ method public void inflate(@MenuRes int, android.view.Menu);
}
- public abstract interface MenuItem {
- method public abstract boolean collapseActionView();
- method public abstract boolean expandActionView();
- method public abstract android.view.ActionProvider getActionProvider();
- method public abstract android.view.View getActionView();
+ public interface MenuItem {
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider getActionProvider();
+ method public android.view.View getActionView();
method public default int getAlphabeticModifiers();
- method public abstract char getAlphabeticShortcut();
- method public default java.lang.CharSequence getContentDescription();
- method public abstract int getGroupId();
- method public abstract android.graphics.drawable.Drawable getIcon();
- method public default android.content.res.ColorStateList getIconTintList();
- method public default android.graphics.PorterDuff.Mode getIconTintMode();
- method public abstract android.content.Intent getIntent();
- method public abstract int getItemId();
- method public abstract android.view.ContextMenu.ContextMenuInfo getMenuInfo();
+ method public char getAlphabeticShortcut();
+ method public default CharSequence getContentDescription();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable getIcon();
+ method @Nullable public default android.content.res.ColorStateList getIconTintList();
+ method @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode();
+ method public android.content.Intent getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo getMenuInfo();
method public default int getNumericModifiers();
- method public abstract char getNumericShortcut();
- method public abstract int getOrder();
- method public abstract android.view.SubMenu getSubMenu();
- method public abstract java.lang.CharSequence getTitle();
- method public abstract java.lang.CharSequence getTitleCondensed();
- method public default java.lang.CharSequence getTooltipText();
- method public abstract boolean hasSubMenu();
- method public abstract boolean isActionViewExpanded();
- method public abstract boolean isCheckable();
- method public abstract boolean isChecked();
- method public abstract boolean isEnabled();
- method public abstract boolean isVisible();
- method public abstract android.view.MenuItem setActionProvider(android.view.ActionProvider);
- method public abstract android.view.MenuItem setActionView(android.view.View);
- method public abstract android.view.MenuItem setActionView(int);
- method public abstract android.view.MenuItem setAlphabeticShortcut(char);
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu getSubMenu();
+ method public CharSequence getTitle();
+ method public CharSequence getTitleCondensed();
+ method public default CharSequence getTooltipText();
+ method public boolean hasSubMenu();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public android.view.MenuItem setActionProvider(android.view.ActionProvider);
+ method public android.view.MenuItem setActionView(android.view.View);
+ method public android.view.MenuItem setActionView(@LayoutRes int);
+ method public android.view.MenuItem setAlphabeticShortcut(char);
method public default android.view.MenuItem setAlphabeticShortcut(char, int);
- method public abstract android.view.MenuItem setCheckable(boolean);
- method public abstract android.view.MenuItem setChecked(boolean);
- method public default android.view.MenuItem setContentDescription(java.lang.CharSequence);
- method public abstract android.view.MenuItem setEnabled(boolean);
- method public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
- method public abstract android.view.MenuItem setIcon(int);
- method public default android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
- method public default android.view.MenuItem setIconTintMode(android.graphics.PorterDuff.Mode);
- method public abstract android.view.MenuItem setIntent(android.content.Intent);
- method public abstract android.view.MenuItem setNumericShortcut(char);
+ method public android.view.MenuItem setCheckable(boolean);
+ method public android.view.MenuItem setChecked(boolean);
+ method public default android.view.MenuItem setContentDescription(CharSequence);
+ method public android.view.MenuItem setEnabled(boolean);
+ method public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
+ method public android.view.MenuItem setIcon(@DrawableRes int);
+ method public default android.view.MenuItem setIconTintList(@Nullable android.content.res.ColorStateList);
+ method public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public android.view.MenuItem setIntent(android.content.Intent);
+ method public android.view.MenuItem setNumericShortcut(char);
method public default android.view.MenuItem setNumericShortcut(char, int);
- method public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
- method public abstract android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
- method public abstract android.view.MenuItem setShortcut(char, char);
+ method public android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
+ method public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
+ method public android.view.MenuItem setShortcut(char, char);
method public default android.view.MenuItem setShortcut(char, char, int, int);
- method public abstract void setShowAsAction(int);
- method public abstract android.view.MenuItem setShowAsActionFlags(int);
- method public abstract android.view.MenuItem setTitle(java.lang.CharSequence);
- method public abstract android.view.MenuItem setTitle(int);
- method public abstract android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
- method public default android.view.MenuItem setTooltipText(java.lang.CharSequence);
- method public abstract android.view.MenuItem setVisible(boolean);
+ method public void setShowAsAction(int);
+ method public android.view.MenuItem setShowAsActionFlags(int);
+ method public android.view.MenuItem setTitle(CharSequence);
+ method public android.view.MenuItem setTitle(@StringRes int);
+ method public android.view.MenuItem setTitleCondensed(CharSequence);
+ method public default android.view.MenuItem setTooltipText(CharSequence);
+ method public android.view.MenuItem setVisible(boolean);
field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
@@ -49074,21 +49351,21 @@ package android.view {
field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
}
- public static abstract interface MenuItem.OnActionExpandListener {
- method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
- method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+ public static interface MenuItem.OnActionExpandListener {
+ method public boolean onMenuItemActionCollapse(android.view.MenuItem);
+ method public boolean onMenuItemActionExpand(android.view.MenuItem);
}
- public static abstract interface MenuItem.OnMenuItemClickListener {
- method public abstract boolean onMenuItemClick(android.view.MenuItem);
+ public static interface MenuItem.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem);
}
public final class MotionEvent extends android.view.InputEvent implements android.os.Parcelable {
- method public static java.lang.String actionToString(int);
+ method public static String actionToString(int);
method public void addBatch(long, float, float, float, float, int);
method public void addBatch(long, android.view.MotionEvent.PointerCoords[], int);
- method public static int axisFromString(java.lang.String);
- method public static java.lang.String axisToString(int);
+ method public static int axisFromString(String);
+ method public static String axisToString(int);
method public int findPointerIndex(int);
method public int getAction();
method public int getActionButton();
@@ -49097,6 +49374,7 @@ package android.view {
method public float getAxisValue(int);
method public float getAxisValue(int, int);
method public int getButtonState();
+ method public int getClassification();
method public int getDeviceId();
method public long getDownTime();
method public int getEdgeFlags();
@@ -49158,9 +49436,9 @@ package android.view {
method public float getYPrecision();
method public boolean isButtonPressed(int);
method public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int);
- method public static deprecated android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
+ method @Deprecated public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
- method public static deprecated android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
+ method @Deprecated public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, int);
method public static android.view.MotionEvent obtain(android.view.MotionEvent);
method public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
@@ -49182,15 +49460,15 @@ package android.view {
field public static final int ACTION_MASK = 255; // 0xff
field public static final int ACTION_MOVE = 2; // 0x2
field public static final int ACTION_OUTSIDE = 4; // 0x4
- field public static final deprecated int ACTION_POINTER_1_DOWN = 5; // 0x5
- field public static final deprecated int ACTION_POINTER_1_UP = 6; // 0x6
- field public static final deprecated int ACTION_POINTER_2_DOWN = 261; // 0x105
- field public static final deprecated int ACTION_POINTER_2_UP = 262; // 0x106
- field public static final deprecated int ACTION_POINTER_3_DOWN = 517; // 0x205
- field public static final deprecated int ACTION_POINTER_3_UP = 518; // 0x206
+ field @Deprecated public static final int ACTION_POINTER_1_DOWN = 5; // 0x5
+ field @Deprecated public static final int ACTION_POINTER_1_UP = 6; // 0x6
+ field @Deprecated public static final int ACTION_POINTER_2_DOWN = 261; // 0x105
+ field @Deprecated public static final int ACTION_POINTER_2_UP = 262; // 0x106
+ field @Deprecated public static final int ACTION_POINTER_3_DOWN = 517; // 0x205
+ field @Deprecated public static final int ACTION_POINTER_3_UP = 518; // 0x206
field public static final int ACTION_POINTER_DOWN = 5; // 0x5
- field public static final deprecated int ACTION_POINTER_ID_MASK = 65280; // 0xff00
- field public static final deprecated int ACTION_POINTER_ID_SHIFT = 8; // 0x8
+ field @Deprecated public static final int ACTION_POINTER_ID_MASK = 65280; // 0xff00
+ field @Deprecated public static final int ACTION_POINTER_ID_SHIFT = 8; // 0x8
field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
field public static final int ACTION_POINTER_UP = 6; // 0x6
@@ -49248,6 +49526,9 @@ package android.view {
field public static final int BUTTON_STYLUS_PRIMARY = 32; // 0x20
field public static final int BUTTON_STYLUS_SECONDARY = 64; // 0x40
field public static final int BUTTON_TERTIARY = 4; // 0x4
+ field public static final int CLASSIFICATION_AMBIGUOUS_GESTURE = 1; // 0x1
+ field public static final int CLASSIFICATION_DEEP_PRESS = 2; // 0x2
+ field public static final int CLASSIFICATION_NONE = 0; // 0x0
field public static final android.os.Parcelable.Creator<android.view.MotionEvent> CREATOR;
field public static final int EDGE_BOTTOM = 2; // 0x2
field public static final int EDGE_LEFT = 4; // 0x4
@@ -49299,24 +49580,24 @@ package android.view {
field public static final int ORIENTATION_UNKNOWN = -1; // 0xffffffff
}
- public abstract deprecated class OrientationListener implements android.hardware.SensorListener {
- ctor public OrientationListener(android.content.Context);
- ctor public OrientationListener(android.content.Context, int);
- method public void disable();
- method public void enable();
- method public void onAccuracyChanged(int, int);
- method public abstract void onOrientationChanged(int);
- method public void onSensorChanged(int, float[]);
- field public static final int ORIENTATION_UNKNOWN = -1; // 0xffffffff
+ @Deprecated public abstract class OrientationListener implements android.hardware.SensorListener {
+ ctor @Deprecated public OrientationListener(android.content.Context);
+ ctor @Deprecated public OrientationListener(android.content.Context, int);
+ method @Deprecated public void disable();
+ method @Deprecated public void enable();
+ method @Deprecated public void onAccuracyChanged(int, int);
+ method @Deprecated public abstract void onOrientationChanged(int);
+ method @Deprecated public void onSensorChanged(int, float[]);
+ field @Deprecated public static final int ORIENTATION_UNKNOWN = -1; // 0xffffffff
}
public final class PixelCopy {
- method public static void request(android.view.SurfaceView, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
- method public static void request(android.view.SurfaceView, android.graphics.Rect, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
- method public static void request(android.view.Surface, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
- method public static void request(android.view.Surface, android.graphics.Rect, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
- method public static void request(android.view.Window, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
- method public static void request(android.view.Window, android.graphics.Rect, android.graphics.Bitmap, android.view.PixelCopy.OnPixelCopyFinishedListener, android.os.Handler);
+ method public static void request(@NonNull android.view.SurfaceView, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
+ method public static void request(@NonNull android.view.SurfaceView, @Nullable android.graphics.Rect, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
+ method public static void request(@NonNull android.view.Surface, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
+ method public static void request(@NonNull android.view.Surface, @Nullable android.graphics.Rect, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
+ method public static void request(@NonNull android.view.Window, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
+ method public static void request(@NonNull android.view.Window, @Nullable android.graphics.Rect, @NonNull android.graphics.Bitmap, @NonNull android.view.PixelCopy.OnPixelCopyFinishedListener, @NonNull android.os.Handler);
field public static final int ERROR_DESTINATION_INVALID = 5; // 0x5
field public static final int ERROR_SOURCE_INVALID = 4; // 0x4
field public static final int ERROR_SOURCE_NO_DATA = 3; // 0x3
@@ -49325,15 +49606,15 @@ package android.view {
field public static final int SUCCESS = 0; // 0x0
}
- public static abstract interface PixelCopy.OnPixelCopyFinishedListener {
- method public abstract void onPixelCopyFinished(int);
+ public static interface PixelCopy.OnPixelCopyFinishedListener {
+ method public void onPixelCopyFinished(int);
}
public final class PointerIcon implements android.os.Parcelable {
- method public static android.view.PointerIcon create(android.graphics.Bitmap, float, float);
+ method public static android.view.PointerIcon create(@NonNull android.graphics.Bitmap, float, float);
method public int describeContents();
- method public static android.view.PointerIcon getSystemIcon(android.content.Context, int);
- method public static android.view.PointerIcon load(android.content.res.Resources, int);
+ method public static android.view.PointerIcon getSystemIcon(@NonNull android.content.Context, int);
+ method public static android.view.PointerIcon load(@NonNull android.content.res.Resources, @XmlRes int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.PointerIcon> CREATOR;
field public static final int TYPE_ALIAS = 1010; // 0x3f2
@@ -49383,10 +49664,10 @@ package android.view {
method public void setStylusScaleEnabled(boolean);
}
- public static abstract interface ScaleGestureDetector.OnScaleGestureListener {
- method public abstract boolean onScale(android.view.ScaleGestureDetector);
- method public abstract boolean onScaleBegin(android.view.ScaleGestureDetector);
- method public abstract void onScaleEnd(android.view.ScaleGestureDetector);
+ public static interface ScaleGestureDetector.OnScaleGestureListener {
+ method public boolean onScale(android.view.ScaleGestureDetector);
+ method public boolean onScaleBegin(android.view.ScaleGestureDetector);
+ method public void onScaleEnd(android.view.ScaleGestureDetector);
}
public static class ScaleGestureDetector.SimpleOnScaleGestureListener implements android.view.ScaleGestureDetector.OnScaleGestureListener {
@@ -49410,16 +49691,16 @@ package android.view {
field public static final int NAVIGATION_UP = 2; // 0x2
}
- public abstract interface SubMenu implements android.view.Menu {
- method public abstract void clearHeader();
- method public abstract android.view.MenuItem getItem();
- method public abstract android.view.SubMenu setHeaderIcon(int);
- method public abstract android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
- method public abstract android.view.SubMenu setHeaderTitle(int);
- method public abstract android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
- method public abstract android.view.SubMenu setHeaderView(android.view.View);
- method public abstract android.view.SubMenu setIcon(int);
- method public abstract android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
+ public interface SubMenu extends android.view.Menu {
+ method public void clearHeader();
+ method public android.view.MenuItem getItem();
+ method public android.view.SubMenu setHeaderIcon(@DrawableRes int);
+ method public android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
+ method public android.view.SubMenu setHeaderTitle(@StringRes int);
+ method public android.view.SubMenu setHeaderTitle(CharSequence);
+ method public android.view.SubMenu setHeaderView(android.view.View);
+ method public android.view.SubMenu setIcon(@DrawableRes int);
+ method public android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
}
public class Surface implements android.os.Parcelable {
@@ -49430,7 +49711,7 @@ package android.view {
method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
- method public deprecated void unlockCanvas(android.graphics.Canvas);
+ method @Deprecated public void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.Surface> CREATOR;
@@ -49442,44 +49723,44 @@ package android.view {
public static class Surface.OutOfResourcesException extends java.lang.RuntimeException {
ctor public Surface.OutOfResourcesException();
- ctor public Surface.OutOfResourcesException(java.lang.String);
+ ctor public Surface.OutOfResourcesException(String);
}
- public abstract interface SurfaceHolder {
- method public abstract void addCallback(android.view.SurfaceHolder.Callback);
- method public abstract android.view.Surface getSurface();
- method public abstract android.graphics.Rect getSurfaceFrame();
- method public abstract boolean isCreating();
- method public abstract android.graphics.Canvas lockCanvas();
- method public abstract android.graphics.Canvas lockCanvas(android.graphics.Rect);
+ public interface SurfaceHolder {
+ method public void addCallback(android.view.SurfaceHolder.Callback);
+ method public android.view.Surface getSurface();
+ method public android.graphics.Rect getSurfaceFrame();
+ method public boolean isCreating();
+ method public android.graphics.Canvas lockCanvas();
+ method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
method public default android.graphics.Canvas lockHardwareCanvas();
- method public abstract void removeCallback(android.view.SurfaceHolder.Callback);
- method public abstract void setFixedSize(int, int);
- method public abstract void setFormat(int);
- method public abstract void setKeepScreenOn(boolean);
- method public abstract void setSizeFromLayout();
- method public abstract deprecated void setType(int);
- method public abstract void unlockCanvasAndPost(android.graphics.Canvas);
- field public static final deprecated int SURFACE_TYPE_GPU = 2; // 0x2
- field public static final deprecated int SURFACE_TYPE_HARDWARE = 1; // 0x1
- field public static final deprecated int SURFACE_TYPE_NORMAL = 0; // 0x0
- field public static final deprecated int SURFACE_TYPE_PUSH_BUFFERS = 3; // 0x3
+ method public void removeCallback(android.view.SurfaceHolder.Callback);
+ method public void setFixedSize(int, int);
+ method public void setFormat(int);
+ method public void setKeepScreenOn(boolean);
+ method public void setSizeFromLayout();
+ method @Deprecated public void setType(int);
+ method public void unlockCanvasAndPost(android.graphics.Canvas);
+ field @Deprecated public static final int SURFACE_TYPE_GPU = 2; // 0x2
+ field @Deprecated public static final int SURFACE_TYPE_HARDWARE = 1; // 0x1
+ field @Deprecated public static final int SURFACE_TYPE_NORMAL = 0; // 0x0
+ field @Deprecated public static final int SURFACE_TYPE_PUSH_BUFFERS = 3; // 0x3
}
public static class SurfaceHolder.BadSurfaceTypeException extends java.lang.RuntimeException {
ctor public SurfaceHolder.BadSurfaceTypeException();
- ctor public SurfaceHolder.BadSurfaceTypeException(java.lang.String);
+ ctor public SurfaceHolder.BadSurfaceTypeException(String);
}
- public static abstract interface SurfaceHolder.Callback {
- method public abstract void surfaceChanged(android.view.SurfaceHolder, int, int, int);
- method public abstract void surfaceCreated(android.view.SurfaceHolder);
- method public abstract void surfaceDestroyed(android.view.SurfaceHolder);
+ public static interface SurfaceHolder.Callback {
+ method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
+ method public void surfaceCreated(android.view.SurfaceHolder);
+ method public void surfaceDestroyed(android.view.SurfaceHolder);
}
- public static abstract interface SurfaceHolder.Callback2 implements android.view.SurfaceHolder.Callback {
- method public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
- method public default void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);
+ public static interface SurfaceHolder.Callback2 extends android.view.SurfaceHolder.Callback {
+ method public void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public default void surfaceRedrawNeededAsync(android.view.SurfaceHolder, Runnable);
}
public class SurfaceView extends android.view.View {
@@ -49518,18 +49799,18 @@ package android.view {
method public void unlockCanvasAndPost(android.graphics.Canvas);
}
- public static abstract interface TextureView.SurfaceTextureListener {
- method public abstract void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
- method public abstract boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
- method public abstract void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
- method public abstract void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
+ public static interface TextureView.SurfaceTextureListener {
+ method public void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
+ method public boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
+ method public void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
+ method public void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
}
public class TouchDelegate {
ctor public TouchDelegate(android.graphics.Rect, android.view.View);
- method public android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo getTouchDelegateInfo();
- method public boolean onTouchEvent(android.view.MotionEvent);
- method public boolean onTouchExplorationHoverEvent(android.view.MotionEvent);
+ method @NonNull public android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo getTouchDelegateInfo();
+ method public boolean onTouchEvent(@NonNull android.view.MotionEvent);
+ method public boolean onTouchExplorationHoverEvent(@NonNull android.view.MotionEvent);
field public static final int ABOVE = 1; // 0x1
field public static final int BELOW = 2; // 0x2
field public static final int TO_LEFT = 4; // 0x4
@@ -49549,30 +49830,30 @@ package android.view {
method public void recycle();
}
- public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
+ @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
ctor public View(android.content.Context);
- ctor public View(android.content.Context, android.util.AttributeSet);
- ctor public View(android.content.Context, android.util.AttributeSet, int);
- ctor public View(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public View(android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public View(android.content.Context, @Nullable android.util.AttributeSet, int);
+ ctor public View(android.content.Context, @Nullable android.util.AttributeSet, int, int);
method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
- method public void addExtraDataToAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
+ method public void addExtraDataToAccessibilityNodeInfo(@NonNull android.view.accessibility.AccessibilityNodeInfo, @NonNull String, @Nullable android.os.Bundle);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
- method public void addKeyboardNavigationClusters(java.util.Collection<android.view.View>, int);
+ method public void addKeyboardNavigationClusters(@NonNull java.util.Collection<android.view.View>, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void addOnUnhandledKeyEventListener(android.view.View.OnUnhandledKeyEventListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
- method public void announceForAccessibility(java.lang.CharSequence);
+ method public void announceForAccessibility(CharSequence);
method public void autofill(android.view.autofill.AutofillValue);
- method public void autofill(android.util.SparseArray<android.view.autofill.AutofillValue>);
+ method public void autofill(@NonNull android.util.SparseArray<android.view.autofill.AutofillValue>);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
method public void bringToFront();
- method public deprecated void buildDrawingCache();
- method public deprecated void buildDrawingCache(boolean);
+ method @Deprecated public void buildDrawingCache();
+ method @Deprecated public void buildDrawingCache(boolean);
method public void buildLayer();
method public boolean callOnClick();
method public boolean canResolveLayoutDirection();
@@ -49597,7 +49878,7 @@ package android.view {
method protected int computeVerticalScrollRange();
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo();
method public void createContextMenu(android.view.ContextMenu);
- method public deprecated void destroyDrawingCache();
+ method @Deprecated public void destroyDrawingCache();
method public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
method public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
method public void dispatchConfigurationChanged(android.content.res.Configuration);
@@ -49605,7 +49886,7 @@ package android.view {
method public boolean dispatchDragEvent(android.view.DragEvent);
method protected void dispatchDraw(android.graphics.Canvas);
method public void dispatchDrawableHotspotChanged(float, float);
- method public void dispatchFinishTemporaryDetach();
+ method @CallSuper public void dispatchFinishTemporaryDetach();
method protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
method protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
@@ -49616,117 +49897,117 @@ package android.view {
method public boolean dispatchNestedFling(float, float, boolean);
method public boolean dispatchNestedPreFling(float, float);
method public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
- method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
- method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+ method public boolean dispatchNestedPreScroll(int, int, @Nullable @Size(2) int[], @Nullable @Size(2) int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, @Nullable @Size(2) int[]);
method public void dispatchPointerCaptureChanged(boolean);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutofillStructure(@NonNull android.view.ViewStructure, int);
method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSetActivated(boolean);
method protected void dispatchSetPressed(boolean);
method protected void dispatchSetSelected(boolean);
- method public void dispatchStartTemporaryDetach();
+ method @CallSuper public void dispatchStartTemporaryDetach();
method public void dispatchSystemUiVisibilityChanged(int);
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
method public boolean dispatchUnhandledMove(android.view.View, int);
- method protected void dispatchVisibilityChanged(android.view.View, int);
+ method protected void dispatchVisibilityChanged(@NonNull android.view.View, int);
method public void dispatchWindowFocusChanged(boolean);
method public void dispatchWindowSystemUiVisiblityChanged(int);
method public void dispatchWindowVisibilityChanged(int);
- method public void draw(android.graphics.Canvas);
- method public void drawableHotspotChanged(float, float);
- method protected void drawableStateChanged();
+ method @CallSuper public void draw(android.graphics.Canvas);
+ method @CallSuper public void drawableHotspotChanged(float, float);
+ method @CallSuper protected void drawableStateChanged();
method public android.view.View findFocus();
- method public final <T extends android.view.View> T findViewById(int);
- method public final <T extends android.view.View> T findViewWithTag(java.lang.Object);
- method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
- method protected deprecated boolean fitSystemWindows(android.graphics.Rect);
+ method public final <T extends android.view.View> T findViewById(@IdRes int);
+ method public final <T extends android.view.View> T findViewWithTag(Object);
+ method public void findViewsWithText(java.util.ArrayList<android.view.View>, CharSequence, int);
+ method @Deprecated protected boolean fitSystemWindows(android.graphics.Rect);
method public android.view.View focusSearch(int);
method public void forceHasOverlappingRendering(boolean);
method public void forceLayout();
method public static int generateViewId();
- method public java.lang.CharSequence getAccessibilityClassName();
+ method public CharSequence getAccessibilityClassName();
method public android.view.View.AccessibilityDelegate getAccessibilityDelegate();
method public int getAccessibilityLiveRegion();
method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
- method public java.lang.CharSequence getAccessibilityPaneTitle();
+ method @Nullable public CharSequence getAccessibilityPaneTitle();
method public int getAccessibilityTraversalAfter();
method public int getAccessibilityTraversalBefore();
- method public float getAlpha();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
- method public java.lang.String[] getAutofillHints();
+ method @android.view.ViewDebug.ExportedProperty @Nullable public String[] getAutofillHints();
method public final android.view.autofill.AutofillId getAutofillId();
method public int getAutofillType();
- method public android.view.autofill.AutofillValue getAutofillValue();
+ method @Nullable public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
- method public android.content.res.ColorStateList getBackgroundTintList();
- method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
- method public int getBaseline();
- method public final int getBottom();
+ method @Nullable public android.content.res.ColorStateList getBackgroundTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode();
+ method @android.view.ViewDebug.ExportedProperty(category="layout") public int getBaseline();
+ method @android.view.ViewDebug.CapturedViewProperty public final int getBottom();
method protected float getBottomFadingEdgeStrength();
method protected int getBottomPaddingOffset();
method public float getCameraDistance();
method public android.graphics.Rect getClipBounds();
method public boolean getClipBounds(android.graphics.Rect);
method public final boolean getClipToOutline();
- method public final android.view.contentcapture.ContentCaptureSession getContentCaptureSession();
- method public java.lang.CharSequence getContentDescription();
- method public final android.content.Context getContext();
+ method @Nullable public final android.view.contentcapture.ContentCaptureSession getContentCaptureSession();
+ method @android.view.ViewDebug.ExportedProperty(category="accessibility") public CharSequence getContentDescription();
+ method @android.view.ViewDebug.CapturedViewProperty public final android.content.Context getContext();
method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo();
- method public final boolean getDefaultFocusHighlightEnabled();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean getDefaultFocusHighlightEnabled();
method public static int getDefaultSize(int, int);
method public android.view.Display getDisplay();
method public final int[] getDrawableState();
- method public deprecated android.graphics.Bitmap getDrawingCache();
- method public deprecated android.graphics.Bitmap getDrawingCache(boolean);
- method public deprecated int getDrawingCacheBackgroundColor();
- method public deprecated int getDrawingCacheQuality();
+ method @Deprecated public android.graphics.Bitmap getDrawingCache();
+ method @Deprecated public android.graphics.Bitmap getDrawingCache(boolean);
+ method @Deprecated @ColorInt public int getDrawingCacheBackgroundColor();
+ method @Deprecated public int getDrawingCacheQuality();
method public void getDrawingRect(android.graphics.Rect);
method public long getDrawingTime();
- method public float getElevation();
- method public boolean getFilterTouchesWhenObscured();
- method public boolean getFitsSystemWindows();
- method public int getFocusable();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getElevation();
+ method @android.view.ViewDebug.ExportedProperty public boolean getFilterTouchesWhenObscured();
+ method @android.view.ViewDebug.ExportedProperty public boolean getFitsSystemWindows();
+ method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.NOT_FOCUSABLE, to="NOT_FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE, to="FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE_AUTO, to="FOCUSABLE_AUTO")}, category="focus") public int getFocusable();
method public java.util.ArrayList<android.view.View> getFocusables(int);
method public void getFocusedRect(android.graphics.Rect);
method public android.graphics.drawable.Drawable getForeground();
method public int getForegroundGravity();
- method public android.content.res.ColorStateList getForegroundTintList();
- method public android.graphics.PorterDuff.Mode getForegroundTintMode();
+ method @Nullable public android.content.res.ColorStateList getForegroundTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getForegroundTintMode();
method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
method public final boolean getGlobalVisibleRect(android.graphics.Rect);
method public android.os.Handler getHandler();
method public final boolean getHasOverlappingRendering();
- method public final int getHeight();
+ method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getHeight();
method public void getHitRect(android.graphics.Rect);
method public int getHorizontalFadingEdgeLength();
method protected int getHorizontalScrollbarHeight();
- method public int getId();
- method public int getImportantForAccessibility();
- method public int getImportantForAutofill();
- method public int getImportantForContentCapture();
+ method @android.view.ViewDebug.CapturedViewProperty @IdRes public int getId();
+ method @android.view.ViewDebug.ExportedProperty(category="accessibility", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, to="noHideDescendants")}) public int getImportantForAccessibility();
+ method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForAutofill();
+ method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture();
method public boolean getKeepScreenOn();
method public android.view.KeyEvent.DispatcherState getKeyDispatcherState();
- method public int getLabelFor();
+ method @android.view.ViewDebug.ExportedProperty(category="accessibility") public int getLabelFor();
method public int getLayerType();
- method public int getLayoutDirection();
- method public android.view.ViewGroup.LayoutParams getLayoutParams();
- method public final int getLeft();
+ method @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_LTR, to="RESOLVED_DIRECTION_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_RTL, to="RESOLVED_DIRECTION_RTL")}) public int getLayoutDirection();
+ method @android.view.ViewDebug.ExportedProperty(deepExport=true, prefix="layout_") public android.view.ViewGroup.LayoutParams getLayoutParams();
+ method @android.view.ViewDebug.CapturedViewProperty public final int getLeft();
method protected float getLeftFadingEdgeStrength();
method protected int getLeftPaddingOffset();
method public final boolean getLocalVisibleRect(android.graphics.Rect);
- method public void getLocationInWindow(int[]);
- method public void getLocationOnScreen(int[]);
+ method public void getLocationInWindow(@Size(2) int[]);
+ method public void getLocationOnScreen(@Size(2) int[]);
method public android.graphics.Matrix getMatrix();
method public final int getMeasuredHeight();
- method public final int getMeasuredHeightAndState();
+ method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredHeightAndState();
method public final int getMeasuredState();
method public final int getMeasuredWidth();
- method public final int getMeasuredWidthAndState();
+ method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredWidthAndState();
method public int getMinimumHeight();
method public int getMinimumWidth();
method public int getNextClusterForwardId();
@@ -49736,9 +50017,9 @@ package android.view {
method public int getNextFocusRightId();
method public int getNextFocusUpId();
method public android.view.View.OnFocusChangeListener getOnFocusChangeListener();
- method public int getOutlineAmbientShadowColor();
+ method @ColorInt public int getOutlineAmbientShadowColor();
method public android.view.ViewOutlineProvider getOutlineProvider();
- method public int getOutlineSpotShadowColor();
+ method @ColorInt public int getOutlineSpotShadowColor();
method public int getOverScrollMode();
method public android.view.ViewOverlay getOverlay();
method public int getPaddingBottom();
@@ -49749,141 +50030,141 @@ package android.view {
method public int getPaddingTop();
method public final android.view.ViewParent getParent();
method public android.view.ViewParent getParentForAccessibility();
- method public float getPivotX();
- method public float getPivotY();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotX();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotY();
method public android.view.PointerIcon getPointerIcon();
method public android.content.res.Resources getResources();
method public final boolean getRevealOnFocusHint();
- method public final int getRight();
+ method @android.view.ViewDebug.CapturedViewProperty public final int getRight();
method protected float getRightFadingEdgeStrength();
method protected int getRightPaddingOffset();
method public android.view.View getRootView();
method public android.view.WindowInsets getRootWindowInsets();
- method public float getRotation();
- method public float getRotationX();
- method public float getRotationY();
- method public float getScaleX();
- method public float getScaleY();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotation();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationX();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationY();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleX();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleY();
method public int getScrollBarDefaultDelayBeforeFade();
method public int getScrollBarFadeDuration();
method public int getScrollBarSize();
- method public int getScrollBarStyle();
+ method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_OVERLAY, to="INSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_INSET, to="INSIDE_INSET"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_OVERLAY, to="OUTSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_INSET, to="OUTSIDE_INSET")}) public int getScrollBarStyle();
method public int getScrollIndicators();
method public final int getScrollX();
method public final int getScrollY();
- method public int getSolidColor();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getSolidColor();
method public android.animation.StateListAnimator getStateListAnimator();
method protected int getSuggestedMinimumHeight();
method protected int getSuggestedMinimumWidth();
method public int getSystemUiVisibility();
- method public java.lang.Object getTag();
- method public java.lang.Object getTag(int);
- method public int getTextAlignment();
- method public int getTextDirection();
- method public java.lang.CharSequence getTooltipText();
- method public final int getTop();
+ method @android.view.ViewDebug.ExportedProperty public Object getTag();
+ method public Object getTag(int);
+ method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_GRAVITY, to="GRAVITY"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_START, to="TEXT_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_END, to="TEXT_END"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_START, to="VIEW_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_END, to="VIEW_END")}) public int getTextAlignment();
+ method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG, to="FIRST_STRONG"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_ANY_RTL, to="ANY_RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LTR, to="LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_RTL, to="RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LOCALE, to="LOCALE"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_LTR, to="FIRST_STRONG_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_RTL, to="FIRST_STRONG_RTL")}) public int getTextDirection();
+ method @Nullable public CharSequence getTooltipText();
+ method @android.view.ViewDebug.CapturedViewProperty public final int getTop();
method protected float getTopFadingEdgeStrength();
method protected int getTopPaddingOffset();
method public android.view.TouchDelegate getTouchDelegate();
method public java.util.ArrayList<android.view.View> getTouchables();
- method public float getTransitionAlpha();
- method public java.lang.String getTransitionName();
- method public float getTranslationX();
- method public float getTranslationY();
- method public float getTranslationZ();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTransitionAlpha();
+ method @android.view.ViewDebug.ExportedProperty public String getTransitionName();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationX();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationY();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationZ();
method public long getUniqueDrawingId();
method public int getVerticalFadingEdgeLength();
method public int getVerticalScrollbarPosition();
method public int getVerticalScrollbarWidth();
method public android.view.ViewTreeObserver getViewTreeObserver();
- method public int getVisibility();
- method public final int getWidth();
+ method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.VISIBLE, to="VISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.INVISIBLE, to="INVISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.GONE, to="GONE")}) public int getVisibility();
+ method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getWidth();
method protected int getWindowAttachCount();
method public android.view.WindowId getWindowId();
method public int getWindowSystemUiVisibility();
method public android.os.IBinder getWindowToken();
method public int getWindowVisibility();
method public void getWindowVisibleDisplayFrame(android.graphics.Rect);
- method public float getX();
- method public float getY();
- method public float getZ();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getX();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getY();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getZ();
method public boolean hasExplicitFocusable();
- method public boolean hasFocus();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean hasFocus();
method public boolean hasFocusable();
method public boolean hasNestedScrollingParent();
method public boolean hasOnClickListeners();
- method public boolean hasOverlappingRendering();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean hasOverlappingRendering();
method public boolean hasPointerCapture();
- method public boolean hasTransientState();
+ method @android.view.ViewDebug.ExportedProperty(category="layout") public boolean hasTransientState();
method public boolean hasWindowFocus();
- method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
- method public deprecated void invalidate(android.graphics.Rect);
- method public deprecated void invalidate(int, int, int, int);
+ method public static android.view.View inflate(android.content.Context, @LayoutRes int, android.view.ViewGroup);
+ method @Deprecated public void invalidate(android.graphics.Rect);
+ method @Deprecated public void invalidate(int, int, int, int);
method public void invalidate();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
method public void invalidateOutline();
method public boolean isAccessibilityFocused();
method public boolean isAccessibilityHeading();
- method public boolean isActivated();
+ method @android.view.ViewDebug.ExportedProperty public boolean isActivated();
method public boolean isAttachedToWindow();
- method public boolean isClickable();
+ method @android.view.ViewDebug.ExportedProperty public boolean isClickable();
method public boolean isContextClickable();
method public boolean isDirty();
- method public deprecated boolean isDrawingCacheEnabled();
+ method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isDrawingCacheEnabled();
method public boolean isDuplicateParentStateEnabled();
- method public boolean isEnabled();
- method public final boolean isFocusable();
- method public final boolean isFocusableInTouchMode();
- method public boolean isFocused();
- method public final boolean isFocusedByDefault();
- method public boolean isForceDarkAllowed();
- method public boolean isHapticFeedbackEnabled();
- method public boolean isHardwareAccelerated();
+ method @android.view.ViewDebug.ExportedProperty public boolean isEnabled();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusable();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusableInTouchMode();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean isFocused();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusedByDefault();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isForceDarkAllowed();
+ method @android.view.ViewDebug.ExportedProperty public boolean isHapticFeedbackEnabled();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isHardwareAccelerated();
method public boolean isHorizontalFadingEdgeEnabled();
method public boolean isHorizontalScrollBarEnabled();
- method public boolean isHovered();
+ method @android.view.ViewDebug.ExportedProperty public boolean isHovered();
method public boolean isImportantForAccessibility();
method public final boolean isImportantForAutofill();
method public final boolean isImportantForContentCapture();
method public boolean isInEditMode();
method public boolean isInLayout();
- method public boolean isInTouchMode();
- method public final boolean isKeyboardNavigationCluster();
+ method @android.view.ViewDebug.ExportedProperty public boolean isInTouchMode();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isKeyboardNavigationCluster();
method public boolean isLaidOut();
method public boolean isLayoutDirectionResolved();
method public boolean isLayoutRequested();
method public boolean isLongClickable();
method public boolean isNestedScrollingEnabled();
- method public boolean isOpaque();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isOpaque();
method protected boolean isPaddingOffsetRequired();
method public boolean isPaddingRelative();
method public boolean isPivotSet();
- method public boolean isPressed();
+ method @android.view.ViewDebug.ExportedProperty public boolean isPressed();
method public boolean isSaveEnabled();
method public boolean isSaveFromParentEnabled();
method public boolean isScreenReaderFocusable();
method public boolean isScrollContainer();
method public boolean isScrollbarFadingEnabled();
- method public boolean isSelected();
+ method @android.view.ViewDebug.ExportedProperty public boolean isSelected();
method public boolean isShown();
- method public boolean isSoundEffectsEnabled();
+ method @android.view.ViewDebug.ExportedProperty public boolean isSoundEffectsEnabled();
method public final boolean isTemporarilyDetached();
method public boolean isTextAlignmentResolved();
method public boolean isTextDirectionResolved();
method public boolean isVerticalFadingEdgeEnabled();
method public boolean isVerticalScrollBarEnabled();
method public boolean isVisibleToUserForAutofill(int);
- method public void jumpDrawablesToCurrentState();
+ method @CallSuper public void jumpDrawablesToCurrentState();
method public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
method public void layout(int, int, int, int);
method public final void measure(int, int);
method protected static int[] mergeDrawableStates(int[], int[]);
method public void offsetLeftAndRight(int);
method public void offsetTopAndBottom(int);
- method protected void onAnimationEnd();
- method protected void onAnimationStart();
+ method @CallSuper protected void onAnimationEnd();
+ method @CallSuper protected void onAnimationStart();
method public android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets);
- method protected void onAttachedToWindow();
+ method @CallSuper protected void onAttachedToWindow();
method public void onCancelPendingInputEvents();
method public boolean onCapturedPointerEvent(android.view.MotionEvent);
method public boolean onCheckIsTextEditor();
@@ -49891,21 +50172,21 @@ package android.view {
method protected void onCreateContextMenu(android.view.ContextMenu);
method protected int[] onCreateDrawableState(int);
method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
- method protected void onDetachedFromWindow();
+ method @CallSuper protected void onDetachedFromWindow();
method protected void onDisplayHint(int);
method public boolean onDragEvent(android.view.DragEvent);
method protected void onDraw(android.graphics.Canvas);
method public void onDrawForeground(android.graphics.Canvas);
method protected final void onDrawScrollBars(android.graphics.Canvas);
method public boolean onFilterTouchEventForSecurity(android.view.MotionEvent);
- method protected void onFinishInflate();
+ method @CallSuper protected void onFinishInflate();
method public void onFinishTemporaryDetach();
- method protected void onFocusChanged(boolean, int, android.graphics.Rect);
+ method @CallSuper protected void onFocusChanged(boolean, int, @Nullable android.graphics.Rect);
method public boolean onGenericMotionEvent(android.view.MotionEvent);
method public void onHoverChanged(boolean);
method public boolean onHoverEvent(android.view.MotionEvent);
- method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
+ method @CallSuper public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method @CallSuper public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
method public boolean onKeyDown(int, android.view.KeyEvent);
method public boolean onKeyLongPress(int, android.view.KeyEvent);
method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
@@ -49915,17 +50196,17 @@ package android.view {
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
method protected void onOverScrolled(int, int, boolean, boolean);
- method public void onPointerCaptureChange(boolean);
- method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method @CallSuper public void onPointerCaptureChange(boolean);
+ method @CallSuper public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public void onProvideAutofillStructure(android.view.ViewStructure, int);
method public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
- method public void onProvideContentCaptureStructure(android.view.ViewStructure, int);
+ method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
method public void onProvideStructure(android.view.ViewStructure);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
- method protected void onRestoreInstanceState(android.os.Parcelable);
+ method @CallSuper protected void onRestoreInstanceState(android.os.Parcelable);
method public void onRtlPropertiesChanged(int);
- method protected android.os.Parcelable onSaveInstanceState();
+ method @CallSuper @Nullable protected android.os.Parcelable onSaveInstanceState();
method public void onScreenStateChanged(int);
method protected void onScrollChanged(int, int, int, int);
method protected boolean onSetAlpha(int);
@@ -49933,8 +50214,8 @@ package android.view {
method public void onStartTemporaryDetach();
method public boolean onTouchEvent(android.view.MotionEvent);
method public boolean onTrackballEvent(android.view.MotionEvent);
- method public void onVisibilityAggregated(boolean);
- method protected void onVisibilityChanged(android.view.View, int);
+ method @CallSuper public void onVisibilityAggregated(boolean);
+ method protected void onVisibilityChanged(@NonNull android.view.View, int);
method public void onWindowFocusChanged(boolean);
method public void onWindowSystemUiVisibilityChanged(int);
method protected void onWindowVisibilityChanged(int);
@@ -49948,75 +50229,75 @@ package android.view {
method public boolean performLongClick();
method public boolean performLongClick(float, float);
method public void playSoundEffect(int);
- method public boolean post(java.lang.Runnable);
- method public boolean postDelayed(java.lang.Runnable, long);
+ method public boolean post(Runnable);
+ method public boolean postDelayed(Runnable, long);
method public void postInvalidate();
method public void postInvalidate(int, int, int, int);
method public void postInvalidateDelayed(long);
method public void postInvalidateDelayed(long, int, int, int, int);
method public void postInvalidateOnAnimation();
method public void postInvalidateOnAnimation(int, int, int, int);
- method public void postOnAnimation(java.lang.Runnable);
- method public void postOnAnimationDelayed(java.lang.Runnable, long);
+ method public void postOnAnimation(Runnable);
+ method public void postOnAnimationDelayed(Runnable, long);
method public void refreshDrawableState();
method public void releasePointerCapture();
- method public boolean removeCallbacks(java.lang.Runnable);
+ method public boolean removeCallbacks(Runnable);
method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void removeOnUnhandledKeyEventListener(android.view.View.OnUnhandledKeyEventListener);
method public void requestApplyInsets();
- method public deprecated void requestFitSystemWindows();
+ method @Deprecated public void requestFitSystemWindows();
method public final boolean requestFocus();
method public final boolean requestFocus(int);
method public boolean requestFocus(int, android.graphics.Rect);
method public final boolean requestFocusFromTouch();
- method public void requestLayout();
+ method @CallSuper public void requestLayout();
method public void requestPointerCapture();
method public boolean requestRectangleOnScreen(android.graphics.Rect);
method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
method public final void requestUnbufferedDispatch(android.view.MotionEvent);
- method public final <T extends android.view.View> T requireViewById(int);
+ method @NonNull public final <T extends android.view.View> T requireViewById(@IdRes int);
method public void resetPivot();
method public static int resolveSize(int, int);
method public static int resolveSizeAndState(int, int, int);
method public boolean restoreDefaultFocus();
method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable>);
method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable>);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public void scrollBy(int, int);
method public void scrollTo(int, int);
method public void sendAccessibilityEvent(int);
method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
- method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
+ method public void setAccessibilityDelegate(@Nullable android.view.View.AccessibilityDelegate);
method public void setAccessibilityHeading(boolean);
method public void setAccessibilityLiveRegion(int);
- method public void setAccessibilityPaneTitle(java.lang.CharSequence);
+ method public void setAccessibilityPaneTitle(@Nullable CharSequence);
method public void setAccessibilityTraversalAfter(int);
method public void setAccessibilityTraversalBefore(int);
method public void setActivated(boolean);
- method public void setAlpha(float);
+ method public void setAlpha(@FloatRange(from=0.0, to=1.0) float);
method public void setAnimation(android.view.animation.Animation);
- method public void setAnimationMatrix(android.graphics.Matrix);
- method public void setAutofillHints(java.lang.String...);
- method public void setAutofillId(android.view.autofill.AutofillId);
+ method public void setAnimationMatrix(@Nullable android.graphics.Matrix);
+ method public void setAutofillHints(@Nullable java.lang.String...);
+ method public void setAutofillId(@Nullable android.view.autofill.AutofillId);
method public void setBackground(android.graphics.drawable.Drawable);
- method public void setBackgroundColor(int);
- method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setBackgroundResource(int);
- method public void setBackgroundTintList(android.content.res.ColorStateList);
- method public void setBackgroundTintMode(android.graphics.PorterDuff.Mode);
+ method public void setBackgroundColor(@ColorInt int);
+ method @Deprecated public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setBackgroundResource(@DrawableRes int);
+ method public void setBackgroundTintList(@Nullable android.content.res.ColorStateList);
+ method public void setBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public final void setBottom(int);
method public void setCameraDistance(float);
method public void setClickable(boolean);
method public void setClipBounds(android.graphics.Rect);
method public void setClipToOutline(boolean);
- method public void setContentCaptureSession(android.view.contentcapture.ContentCaptureSession);
- method public void setContentDescription(java.lang.CharSequence);
+ method public void setContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSession);
+ method public void setContentDescription(CharSequence);
method public void setContextClickable(boolean);
method public void setDefaultFocusHighlightEnabled(boolean);
- method public deprecated void setDrawingCacheBackgroundColor(int);
- method public deprecated void setDrawingCacheEnabled(boolean);
- method public deprecated void setDrawingCacheQuality(int);
+ method @Deprecated public void setDrawingCacheBackgroundColor(@ColorInt int);
+ method @Deprecated public void setDrawingCacheEnabled(boolean);
+ method @Deprecated public void setDrawingCacheQuality(int);
method public void setDuplicateParentStateEnabled(boolean);
method public void setElevation(float);
method public void setEnabled(boolean);
@@ -50030,22 +50311,22 @@ package android.view {
method public void setForceDarkAllowed(boolean);
method public void setForeground(android.graphics.drawable.Drawable);
method public void setForegroundGravity(int);
- method public void setForegroundTintList(android.content.res.ColorStateList);
- method public void setForegroundTintMode(android.graphics.PorterDuff.Mode);
+ method public void setForegroundTintList(@Nullable android.content.res.ColorStateList);
+ method public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setHapticFeedbackEnabled(boolean);
method public void setHasTransientState(boolean);
method public void setHorizontalFadingEdgeEnabled(boolean);
method public void setHorizontalScrollBarEnabled(boolean);
method public void setHovered(boolean);
- method public void setId(int);
+ method public void setId(@IdRes int);
method public void setImportantForAccessibility(int);
method public void setImportantForAutofill(int);
method public void setImportantForContentCapture(int);
method public void setKeepScreenOn(boolean);
method public void setKeyboardNavigationCluster(boolean);
- method public void setLabelFor(int);
- method public void setLayerPaint(android.graphics.Paint);
- method public void setLayerType(int, android.graphics.Paint);
+ method public void setLabelFor(@IdRes int);
+ method public void setLayerPaint(@Nullable android.graphics.Paint);
+ method public void setLayerType(int, @Nullable android.graphics.Paint);
method public void setLayoutDirection(int);
method public void setLayoutParams(android.view.ViewGroup.LayoutParams);
method public final void setLeft(int);
@@ -50063,21 +50344,21 @@ package android.view {
method public void setNextFocusUpId(int);
method public void setOnApplyWindowInsetsListener(android.view.View.OnApplyWindowInsetsListener);
method public void setOnCapturedPointerListener(android.view.View.OnCapturedPointerListener);
- method public void setOnClickListener(android.view.View.OnClickListener);
- method public void setOnContextClickListener(android.view.View.OnContextClickListener);
+ method public void setOnClickListener(@Nullable android.view.View.OnClickListener);
+ method public void setOnContextClickListener(@Nullable android.view.View.OnContextClickListener);
method public void setOnCreateContextMenuListener(android.view.View.OnCreateContextMenuListener);
method public void setOnDragListener(android.view.View.OnDragListener);
method public void setOnFocusChangeListener(android.view.View.OnFocusChangeListener);
method public void setOnGenericMotionListener(android.view.View.OnGenericMotionListener);
method public void setOnHoverListener(android.view.View.OnHoverListener);
method public void setOnKeyListener(android.view.View.OnKeyListener);
- method public void setOnLongClickListener(android.view.View.OnLongClickListener);
+ method public void setOnLongClickListener(@Nullable android.view.View.OnLongClickListener);
method public void setOnScrollChangeListener(android.view.View.OnScrollChangeListener);
method public void setOnSystemUiVisibilityChangeListener(android.view.View.OnSystemUiVisibilityChangeListener);
method public void setOnTouchListener(android.view.View.OnTouchListener);
- method public void setOutlineAmbientShadowColor(int);
+ method public void setOutlineAmbientShadowColor(@ColorInt int);
method public void setOutlineProvider(android.view.ViewOutlineProvider);
- method public void setOutlineSpotShadowColor(int);
+ method public void setOutlineSpotShadowColor(@ColorInt int);
method public void setOverScrollMode(int);
method public void setPadding(int, int, int, int);
method public void setPaddingRelative(int, int, int, int);
@@ -50109,15 +50390,15 @@ package android.view {
method public void setSoundEffectsEnabled(boolean);
method public void setStateListAnimator(android.animation.StateListAnimator);
method public void setSystemUiVisibility(int);
- method public void setTag(java.lang.Object);
- method public void setTag(int, java.lang.Object);
+ method public void setTag(Object);
+ method public void setTag(int, Object);
method public void setTextAlignment(int);
method public void setTextDirection(int);
- method public void setTooltipText(java.lang.CharSequence);
+ method public void setTooltipText(@Nullable CharSequence);
method public final void setTop(int);
method public void setTouchDelegate(android.view.TouchDelegate);
method public void setTransitionAlpha(float);
- method public final void setTransitionName(java.lang.String);
+ method public final void setTransitionName(String);
method public void setTranslationX(float);
method public void setTranslationY(float);
method public void setTranslationZ(float);
@@ -50125,7 +50406,7 @@ package android.view {
method public void setVerticalScrollBarEnabled(boolean);
method public void setVerticalScrollbarPosition(int);
method public void setVisibility(int);
- method public deprecated void setWillNotCacheDrawing(boolean);
+ method @Deprecated public void setWillNotCacheDrawing(boolean);
method public void setWillNotDraw(boolean);
method public void setX(float);
method public void setY(float);
@@ -50135,36 +50416,36 @@ package android.view {
method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback);
method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback, int);
method public void startAnimation(android.view.animation.Animation);
- method public final deprecated boolean startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
- method public final boolean startDragAndDrop(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
+ method @Deprecated public final boolean startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, Object, int);
+ method public final boolean startDragAndDrop(android.content.ClipData, android.view.View.DragShadowBuilder, Object, int);
method public boolean startNestedScroll(int);
method public void stopNestedScroll();
method public void transformMatrixToGlobal(android.graphics.Matrix);
method public void transformMatrixToLocal(android.graphics.Matrix);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
method public void unscheduleDrawable(android.graphics.drawable.Drawable);
method public final void updateDragShadow(android.view.View.DragShadowBuilder);
- method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
- method public deprecated boolean willNotCacheDrawing();
- method public boolean willNotDraw();
+ method @CallSuper protected boolean verifyDrawable(@NonNull android.graphics.drawable.Drawable);
+ method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotCacheDrawing();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotDraw();
field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
- field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final android.util.Property<android.view.View,java.lang.Float> ALPHA;
field public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 1; // 0x1
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate";
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth";
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = "creditCardExpirationYear";
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
- field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
- field public static final java.lang.String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
- field public static final java.lang.String AUTOFILL_HINT_NAME = "name";
- field public static final java.lang.String AUTOFILL_HINT_PASSWORD = "password";
- field public static final java.lang.String AUTOFILL_HINT_PHONE = "phone";
- field public static final java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
- field public static final java.lang.String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
- field public static final java.lang.String AUTOFILL_HINT_USERNAME = "username";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = "creditCardExpirationYear";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
+ field public static final String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
+ field public static final String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
+ field public static final String AUTOFILL_HINT_NAME = "name";
+ field public static final String AUTOFILL_HINT_PASSWORD = "password";
+ field public static final String AUTOFILL_HINT_PHONE = "phone";
+ field public static final String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
+ field public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
+ field public static final String AUTOFILL_HINT_USERNAME = "username";
field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4
field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3
field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0
@@ -50176,9 +50457,9 @@ package android.view {
field public static final int DRAG_FLAG_GLOBAL_URI_READ = 1; // 0x1
field public static final int DRAG_FLAG_GLOBAL_URI_WRITE = 2; // 0x2
field public static final int DRAG_FLAG_OPAQUE = 512; // 0x200
- field public static final deprecated int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
- field public static final deprecated int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
- field public static final deprecated int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000
+ field @Deprecated public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
+ field @Deprecated public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
+ field @Deprecated public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000
field protected static final int[] EMPTY_STATE_SET;
field protected static final int[] ENABLED_FOCUSED_SELECTED_STATE_SET;
field protected static final int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
@@ -50254,11 +50535,11 @@ package android.view {
field protected static final int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] PRESSED_STATE_SET;
field protected static final int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
- field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION;
- field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION_X;
- field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION_Y;
- field public static final android.util.Property<android.view.View, java.lang.Float> SCALE_X;
- field public static final android.util.Property<android.view.View, java.lang.Float> SCALE_Y;
+ field public static final android.util.Property<android.view.View,java.lang.Float> ROTATION;
+ field public static final android.util.Property<android.view.View,java.lang.Float> ROTATION_X;
+ field public static final android.util.Property<android.view.View,java.lang.Float> ROTATION_Y;
+ field public static final android.util.Property<android.view.View,java.lang.Float> SCALE_X;
+ field public static final android.util.Property<android.view.View,java.lang.Float> SCALE_Y;
field public static final int SCREEN_STATE_OFF = 0; // 0x0
field public static final int SCREEN_STATE_ON = 1; // 0x1
field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
@@ -50280,8 +50561,8 @@ package android.view {
field protected static final int[] SELECTED_STATE_SET;
field protected static final int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
field public static final int SOUND_EFFECTS_ENABLED = 134217728; // 0x8000000
- field public static final deprecated int STATUS_BAR_HIDDEN = 1; // 0x1
- field public static final deprecated int STATUS_BAR_VISIBLE = 0; // 0x0
+ field @Deprecated public static final int STATUS_BAR_HIDDEN = 1; // 0x1
+ field @Deprecated public static final int STATUS_BAR_VISIBLE = 0; // 0x0
field public static final int SYSTEM_UI_FLAG_FULLSCREEN = 4; // 0x4
field public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2; // 0x2
field public static final int SYSTEM_UI_FLAG_IMMERSIVE = 2048; // 0x800
@@ -50309,20 +50590,20 @@ package android.view {
field public static final int TEXT_DIRECTION_LOCALE = 5; // 0x5
field public static final int TEXT_DIRECTION_LTR = 3; // 0x3
field public static final int TEXT_DIRECTION_RTL = 4; // 0x4
- field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_X;
- field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_Y;
- field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_Z;
- field protected static final java.lang.String VIEW_LOG_TAG = "View";
+ field public static final android.util.Property<android.view.View,java.lang.Float> TRANSLATION_X;
+ field public static final android.util.Property<android.view.View,java.lang.Float> TRANSLATION_Y;
+ field public static final android.util.Property<android.view.View,java.lang.Float> TRANSLATION_Z;
+ field protected static final String VIEW_LOG_TAG = "View";
field public static final int VISIBLE = 0; // 0x0
field protected static final int[] WINDOW_FOCUSED_STATE_SET;
- field public static final android.util.Property<android.view.View, java.lang.Float> X;
- field public static final android.util.Property<android.view.View, java.lang.Float> Y;
- field public static final android.util.Property<android.view.View, java.lang.Float> Z;
+ field public static final android.util.Property<android.view.View,java.lang.Float> X;
+ field public static final android.util.Property<android.view.View,java.lang.Float> Y;
+ field public static final android.util.Property<android.view.View,java.lang.Float> Z;
}
public static class View.AccessibilityDelegate {
ctor public View.AccessibilityDelegate();
- method public void addExtraDataToAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
+ method public void addExtraDataToAccessibilityNodeInfo(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityNodeInfo, @NonNull String, @Nullable android.os.Bundle);
method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
@@ -50336,7 +50617,7 @@ package android.view {
public static class View.BaseSavedState extends android.view.AbsSavedState {
ctor public View.BaseSavedState(android.os.Parcel);
- ctor public View.BaseSavedState(android.os.Parcel, java.lang.ClassLoader);
+ ctor public View.BaseSavedState(android.os.Parcel, ClassLoader);
ctor public View.BaseSavedState(android.os.Parcelable);
field public static final android.os.Parcelable.Creator<android.view.View.BaseSavedState> CREATOR;
}
@@ -50353,80 +50634,80 @@ package android.view {
ctor public View.MeasureSpec();
method public static int getMode(int);
method public static int getSize(int);
- method public static int makeMeasureSpec(int, int);
- method public static java.lang.String toString(int);
+ method public static int makeMeasureSpec(@IntRange(from=0, to=0x40000000 - 1) int, int);
+ method public static String toString(int);
field public static final int AT_MOST = -2147483648; // 0x80000000
field public static final int EXACTLY = 1073741824; // 0x40000000
field public static final int UNSPECIFIED = 0; // 0x0
}
- public static abstract interface View.OnApplyWindowInsetsListener {
- method public abstract android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);
+ public static interface View.OnApplyWindowInsetsListener {
+ method public android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);
}
- public static abstract interface View.OnAttachStateChangeListener {
- method public abstract void onViewAttachedToWindow(android.view.View);
- method public abstract void onViewDetachedFromWindow(android.view.View);
+ public static interface View.OnAttachStateChangeListener {
+ method public void onViewAttachedToWindow(android.view.View);
+ method public void onViewDetachedFromWindow(android.view.View);
}
- public static abstract interface View.OnCapturedPointerListener {
- method public abstract boolean onCapturedPointer(android.view.View, android.view.MotionEvent);
+ public static interface View.OnCapturedPointerListener {
+ method public boolean onCapturedPointer(android.view.View, android.view.MotionEvent);
}
- public static abstract interface View.OnClickListener {
- method public abstract void onClick(android.view.View);
+ public static interface View.OnClickListener {
+ method public void onClick(android.view.View);
}
- public static abstract interface View.OnContextClickListener {
- method public abstract boolean onContextClick(android.view.View);
+ public static interface View.OnContextClickListener {
+ method public boolean onContextClick(android.view.View);
}
- public static abstract interface View.OnCreateContextMenuListener {
- method public abstract void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
+ public static interface View.OnCreateContextMenuListener {
+ method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
}
- public static abstract interface View.OnDragListener {
- method public abstract boolean onDrag(android.view.View, android.view.DragEvent);
+ public static interface View.OnDragListener {
+ method public boolean onDrag(android.view.View, android.view.DragEvent);
}
- public static abstract interface View.OnFocusChangeListener {
- method public abstract void onFocusChange(android.view.View, boolean);
+ public static interface View.OnFocusChangeListener {
+ method public void onFocusChange(android.view.View, boolean);
}
- public static abstract interface View.OnGenericMotionListener {
- method public abstract boolean onGenericMotion(android.view.View, android.view.MotionEvent);
+ public static interface View.OnGenericMotionListener {
+ method public boolean onGenericMotion(android.view.View, android.view.MotionEvent);
}
- public static abstract interface View.OnHoverListener {
- method public abstract boolean onHover(android.view.View, android.view.MotionEvent);
+ public static interface View.OnHoverListener {
+ method public boolean onHover(android.view.View, android.view.MotionEvent);
}
- public static abstract interface View.OnKeyListener {
- method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
+ public static interface View.OnKeyListener {
+ method public boolean onKey(android.view.View, int, android.view.KeyEvent);
}
- public static abstract interface View.OnLayoutChangeListener {
- method public abstract void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
+ public static interface View.OnLayoutChangeListener {
+ method public void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
}
- public static abstract interface View.OnLongClickListener {
- method public abstract boolean onLongClick(android.view.View);
+ public static interface View.OnLongClickListener {
+ method public boolean onLongClick(android.view.View);
}
- public static abstract interface View.OnScrollChangeListener {
- method public abstract void onScrollChange(android.view.View, int, int, int, int);
+ public static interface View.OnScrollChangeListener {
+ method public void onScrollChange(android.view.View, int, int, int, int);
}
- public static abstract interface View.OnSystemUiVisibilityChangeListener {
- method public abstract void onSystemUiVisibilityChange(int);
+ public static interface View.OnSystemUiVisibilityChangeListener {
+ method public void onSystemUiVisibilityChange(int);
}
- public static abstract interface View.OnTouchListener {
- method public abstract boolean onTouch(android.view.View, android.view.MotionEvent);
+ public static interface View.OnTouchListener {
+ method public boolean onTouch(android.view.View, android.view.MotionEvent);
}
- public static abstract interface View.OnUnhandledKeyEventListener {
- method public abstract boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+ public static interface View.OnUnhandledKeyEventListener {
+ method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
}
public final class ViewAnimationUtils {
@@ -50434,20 +50715,20 @@ package android.view {
}
public class ViewConfiguration {
- ctor public deprecated ViewConfiguration();
+ ctor @Deprecated public ViewConfiguration();
method public static android.view.ViewConfiguration get(android.content.Context);
method public static long getDefaultActionModeHideDuration();
method public static int getDoubleTapTimeout();
- method public static deprecated int getEdgeSlop();
- method public static deprecated int getFadingEdgeLength();
- method public static deprecated long getGlobalActionKeyTimeout();
+ method @Deprecated public static int getEdgeSlop();
+ method @Deprecated public static int getFadingEdgeLength();
+ method @Deprecated public static long getGlobalActionKeyTimeout();
method public static int getJumpTapTimeout();
method public static int getKeyRepeatDelay();
method public static int getKeyRepeatTimeout();
method public static int getLongPressTimeout();
- method public static deprecated int getMaximumDrawingCacheSize();
- method public static deprecated int getMaximumFlingVelocity();
- method public static deprecated int getMinimumFlingVelocity();
+ method @Deprecated public static int getMaximumDrawingCacheSize();
+ method @Deprecated public static int getMaximumFlingVelocity();
+ method @Deprecated public static int getMinimumFlingVelocity();
method public static int getPressedStateDuration();
method public int getScaledDoubleTapSlop();
method public int getScaledEdgeSlop();
@@ -50465,12 +50746,12 @@ package android.view {
method public float getScaledVerticalScrollFactor();
method public int getScaledWindowTouchSlop();
method public static int getScrollBarFadeDuration();
- method public static deprecated int getScrollBarSize();
+ method @Deprecated public static int getScrollBarSize();
method public static int getScrollDefaultDelay();
method public static float getScrollFriction();
method public static int getTapTimeout();
- method public static deprecated int getTouchSlop();
- method public static deprecated int getWindowTouchSlop();
+ method @Deprecated public static int getTouchSlop();
+ method @Deprecated public static int getWindowTouchSlop();
method public static long getZoomControlsTimeout();
method public boolean hasPermanentMenuKey();
method public boolean shouldShowMenuShortcutsWhenKeyboardPresent();
@@ -50478,54 +50759,66 @@ package android.view {
public class ViewDebug {
ctor public ViewDebug();
- method public static void dumpCapturedView(java.lang.String, java.lang.Object);
- method public static deprecated void startHierarchyTracing(java.lang.String, android.view.View);
- method public static deprecated void startRecyclerTracing(java.lang.String, android.view.View);
- method public static deprecated void stopHierarchyTracing();
- method public static deprecated void stopRecyclerTracing();
- method public static deprecated void trace(android.view.View, android.view.ViewDebug.RecyclerTraceType, int...);
- method public static deprecated void trace(android.view.View, android.view.ViewDebug.HierarchyTraceType);
- field public static final deprecated boolean TRACE_HIERARCHY = false;
- field public static final deprecated boolean TRACE_RECYCLER = false;
- }
-
- public static abstract class ViewDebug.CapturedViewProperty implements java.lang.annotation.Annotation {
- }
-
- public static abstract class ViewDebug.ExportedProperty implements java.lang.annotation.Annotation {
- }
-
- public static abstract class ViewDebug.FlagToString implements java.lang.annotation.Annotation {
- }
-
- public static final deprecated class ViewDebug.HierarchyTraceType extends java.lang.Enum {
- method public static android.view.ViewDebug.HierarchyTraceType valueOf(java.lang.String);
- method public static final android.view.ViewDebug.HierarchyTraceType[] values();
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType BUILD_CACHE;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType DRAW;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType ON_LAYOUT;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType ON_MEASURE;
- enum_constant public static final android.view.ViewDebug.HierarchyTraceType REQUEST_LAYOUT;
- }
-
- public static abstract class ViewDebug.IntToString implements java.lang.annotation.Annotation {
- }
-
- public static final deprecated class ViewDebug.RecyclerTraceType extends java.lang.Enum {
- method public static android.view.ViewDebug.RecyclerTraceType valueOf(java.lang.String);
- method public static final android.view.ViewDebug.RecyclerTraceType[] values();
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType BIND_VIEW;
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType MOVE_TO_SCRAP_HEAP;
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType NEW_VIEW;
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
- enum_constant public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;
- }
-
- public abstract class ViewGroup extends android.view.View implements android.view.ViewManager android.view.ViewParent {
+ method public static void dumpCapturedView(String, Object);
+ method @Deprecated public static void startHierarchyTracing(String, android.view.View);
+ method @Deprecated public static void startRecyclerTracing(String, android.view.View);
+ method @Deprecated public static void stopHierarchyTracing();
+ method @Deprecated public static void stopRecyclerTracing();
+ method @Deprecated public static void trace(android.view.View, android.view.ViewDebug.RecyclerTraceType, int...);
+ method @Deprecated public static void trace(android.view.View, android.view.ViewDebug.HierarchyTraceType);
+ field @Deprecated public static final boolean TRACE_HIERARCHY = false;
+ field @Deprecated public static final boolean TRACE_RECYCLER = false;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.CapturedViewProperty {
+ method public abstract boolean retrieveReturn() default false;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.ExportedProperty {
+ method public abstract String category() default "";
+ method public abstract boolean deepExport() default false;
+ method public abstract android.view.ViewDebug.FlagToString[] flagMapping() default {};
+ method public abstract boolean formatToHexString() default false;
+ method public abstract boolean hasAdjacentMapping() default false;
+ method public abstract android.view.ViewDebug.IntToString[] indexMapping() default {};
+ method public abstract android.view.ViewDebug.IntToString[] mapping() default {};
+ method public abstract String prefix() default "";
+ method public abstract boolean resolveId() default false;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.FlagToString {
+ method public abstract int equals();
+ method public abstract int mask();
+ method public abstract String name();
+ method public abstract boolean outputIf() default true;
+ }
+
+ @Deprecated public enum ViewDebug.HierarchyTraceType {
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType BUILD_CACHE;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType DRAW;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType ON_LAYOUT;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType ON_MEASURE;
+ enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType REQUEST_LAYOUT;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.IntToString {
+ method public abstract int from();
+ method public abstract String to();
+ }
+
+ @Deprecated public enum ViewDebug.RecyclerTraceType {
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType BIND_VIEW;
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType MOVE_TO_SCRAP_HEAP;
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType NEW_VIEW;
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
+ enum_constant @Deprecated public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;
+ }
+
+ @UiThread public abstract class ViewGroup extends android.view.View implements android.view.ViewManager android.view.ViewParent {
ctor public ViewGroup(android.content.Context);
ctor public ViewGroup(android.content.Context, android.util.AttributeSet);
ctor public ViewGroup(android.content.Context, android.util.AttributeSet, int);
@@ -50571,9 +50864,9 @@ package android.view {
method public static int getChildMeasureSpec(int, int, int);
method protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation);
method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
- method public boolean getClipChildren();
- method public boolean getClipToPadding();
- method public int getDescendantFocusability();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipChildren();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipToPadding();
+ method @android.view.ViewDebug.ExportedProperty(category="focus", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BEFORE_DESCENDANTS, to="FOCUS_BEFORE_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_AFTER_DESCENDANTS, to="FOCUS_AFTER_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BLOCK_DESCENDANTS, to="FOCUS_BLOCK_DESCENDANTS")}) public int getDescendantFocusability();
method public android.view.View getFocusedChild();
method public android.view.animation.LayoutAnimationController getLayoutAnimation();
method public android.view.animation.Animation.AnimationListener getLayoutAnimationListener();
@@ -50581,15 +50874,15 @@ package android.view {
method public android.animation.LayoutTransition getLayoutTransition();
method public int getNestedScrollAxes();
method public android.view.ViewGroupOverlay getOverlay();
- method public deprecated int getPersistentDrawingCache();
- method public boolean getTouchscreenBlocksFocus();
+ method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_NO_CACHE, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ANIMATION_CACHE, to="ANIMATION"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_SCROLLING_CACHE, to="SCROLLING"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ALL_CACHES, to="ALL")}) public int getPersistentDrawingCache();
+ method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean getTouchscreenBlocksFocus();
method public int indexOfChild(android.view.View);
- method public final deprecated void invalidateChild(android.view.View, android.graphics.Rect);
- method public deprecated android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
- method public deprecated boolean isAlwaysDrawnWithCacheEnabled();
- method public deprecated boolean isAnimationCacheEnabled();
- method protected boolean isChildrenDrawingOrderEnabled();
- method protected deprecated boolean isChildrenDrawnWithCacheEnabled();
+ method @Deprecated public final void invalidateChild(android.view.View, android.graphics.Rect);
+ method @Deprecated public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
+ method @Deprecated public boolean isAlwaysDrawnWithCacheEnabled();
+ method @Deprecated public boolean isAnimationCacheEnabled();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") protected boolean isChildrenDrawingOrderEnabled();
+ method @Deprecated protected boolean isChildrenDrawnWithCacheEnabled();
method public boolean isLayoutSuppressed();
method public boolean isMotionEventSplittingEnabled();
method public boolean isTransitionGroup();
@@ -50631,11 +50924,11 @@ package android.view {
method public void requestTransparentRegion(android.view.View);
method public void scheduleLayoutAnimation();
method public void setAddStatesFromChildren(boolean);
- method public deprecated void setAlwaysDrawnWithCacheEnabled(boolean);
- method public deprecated void setAnimationCacheEnabled(boolean);
- method protected deprecated void setChildrenDrawingCacheEnabled(boolean);
+ method @Deprecated public void setAlwaysDrawnWithCacheEnabled(boolean);
+ method @Deprecated public void setAnimationCacheEnabled(boolean);
+ method @Deprecated protected void setChildrenDrawingCacheEnabled(boolean);
method protected void setChildrenDrawingOrderEnabled(boolean);
- method protected deprecated void setChildrenDrawnWithCacheEnabled(boolean);
+ method @Deprecated protected void setChildrenDrawnWithCacheEnabled(boolean);
method public void setClipChildren(boolean);
method public void setClipToPadding(boolean);
method public void setDescendantFocusability(int);
@@ -50645,7 +50938,7 @@ package android.view {
method public void setLayoutTransition(android.animation.LayoutTransition);
method public void setMotionEventSplittingEnabled(boolean);
method public void setOnHierarchyChangeListener(android.view.ViewGroup.OnHierarchyChangeListener);
- method public deprecated void setPersistentDrawingCache(int);
+ method @Deprecated public void setPersistentDrawingCache(int);
method protected void setStaticTransformationsEnabled(boolean);
method public void setTouchscreenBlocksFocus(boolean);
method public void setTransitionGroup(boolean);
@@ -50664,10 +50957,10 @@ package android.view {
field public static final int FOCUS_BLOCK_DESCENDANTS = 393216; // 0x60000
field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
- field public static final deprecated int PERSISTENT_ALL_CACHES = 3; // 0x3
- field public static final deprecated int PERSISTENT_ANIMATION_CACHE = 1; // 0x1
- field public static final deprecated int PERSISTENT_NO_CACHE = 0; // 0x0
- field public static final deprecated int PERSISTENT_SCROLLING_CACHE = 2; // 0x2
+ field @Deprecated public static final int PERSISTENT_ALL_CACHES = 3; // 0x3
+ field @Deprecated public static final int PERSISTENT_ANIMATION_CACHE = 1; // 0x1
+ field @Deprecated public static final int PERSISTENT_NO_CACHE = 0; // 0x0
+ field @Deprecated public static final int PERSISTENT_SCROLLING_CACHE = 2; // 0x2
}
public static class ViewGroup.LayoutParams {
@@ -50676,12 +50969,12 @@ package android.view {
ctor public ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams);
method public void resolveLayoutDirection(int);
method protected void setBaseAttributes(android.content.res.TypedArray, int, int);
- field public static final deprecated int FILL_PARENT = -1; // 0xffffffff
+ field @Deprecated public static final int FILL_PARENT = -1; // 0xffffffff
field public static final int MATCH_PARENT = -1; // 0xffffffff
field public static final int WRAP_CONTENT = -2; // 0xfffffffe
- field public int height;
+ field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int height;
field public android.view.animation.LayoutAnimationController.AnimationParameters layoutAnimationParameters;
- field public int width;
+ field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int width;
}
public static class ViewGroup.MarginLayoutParams extends android.view.ViewGroup.LayoutParams {
@@ -50697,26 +50990,26 @@ package android.view {
method public void setMarginEnd(int);
method public void setMarginStart(int);
method public void setMargins(int, int, int, int);
- field public int bottomMargin;
- field public int leftMargin;
- field public int rightMargin;
- field public int topMargin;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int bottomMargin;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int leftMargin;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int rightMargin;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int topMargin;
}
- public static abstract interface ViewGroup.OnHierarchyChangeListener {
- method public abstract void onChildViewAdded(android.view.View, android.view.View);
- method public abstract void onChildViewRemoved(android.view.View, android.view.View);
+ public static interface ViewGroup.OnHierarchyChangeListener {
+ method public void onChildViewAdded(android.view.View, android.view.View);
+ method public void onChildViewRemoved(android.view.View, android.view.View);
}
public class ViewGroupOverlay extends android.view.ViewOverlay {
- method public void add(android.view.View);
- method public void remove(android.view.View);
+ method public void add(@NonNull android.view.View);
+ method public void remove(@NonNull android.view.View);
}
- public abstract interface ViewManager {
- method public abstract void addView(android.view.View, android.view.ViewGroup.LayoutParams);
- method public abstract void removeView(android.view.View);
- method public abstract void updateViewLayout(android.view.View, android.view.ViewGroup.LayoutParams);
+ public interface ViewManager {
+ method public void addView(android.view.View, android.view.ViewGroup.LayoutParams);
+ method public void removeView(android.view.View);
+ method public void updateViewLayout(android.view.View, android.view.ViewGroup.LayoutParams);
}
public abstract class ViewOutlineProvider {
@@ -50728,57 +51021,57 @@ package android.view {
}
public class ViewOverlay {
- method public void add(android.graphics.drawable.Drawable);
+ method public void add(@NonNull android.graphics.drawable.Drawable);
method public void clear();
- method public void remove(android.graphics.drawable.Drawable);
- }
-
- public abstract interface ViewParent {
- method public abstract void bringChildToFront(android.view.View);
- method public abstract boolean canResolveLayoutDirection();
- method public abstract boolean canResolveTextAlignment();
- method public abstract boolean canResolveTextDirection();
- method public abstract void childDrawableStateChanged(android.view.View);
- method public abstract void childHasTransientStateChanged(android.view.View, boolean);
- method public abstract void clearChildFocus(android.view.View);
- method public abstract void createContextMenu(android.view.ContextMenu);
- method public abstract android.view.View focusSearch(android.view.View, int);
- method public abstract void focusableViewAvailable(android.view.View);
- method public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
- method public abstract int getLayoutDirection();
- method public abstract android.view.ViewParent getParent();
- method public abstract android.view.ViewParent getParentForAccessibility();
- method public abstract int getTextAlignment();
- method public abstract int getTextDirection();
- method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect);
- method public abstract deprecated android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
- method public abstract boolean isLayoutDirectionResolved();
- method public abstract boolean isLayoutRequested();
- method public abstract boolean isTextAlignmentResolved();
- method public abstract boolean isTextDirectionResolved();
- method public abstract android.view.View keyboardNavigationClusterSearch(android.view.View, int);
- method public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
- method public default void onDescendantInvalidated(android.view.View, android.view.View);
- method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
- method public abstract boolean onNestedPreFling(android.view.View, float, float);
- method public abstract boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
- method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
- method public abstract void onNestedScroll(android.view.View, int, int, int, int);
- method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
- method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
- method public abstract void onStopNestedScroll(android.view.View);
- method public abstract void recomputeViewAttributes(android.view.View);
- method public abstract void requestChildFocus(android.view.View, android.view.View);
- method public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- method public abstract void requestDisallowInterceptTouchEvent(boolean);
- method public abstract void requestFitSystemWindows();
- method public abstract void requestLayout();
- method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- method public abstract void requestTransparentRegion(android.view.View);
- method public abstract boolean showContextMenuForChild(android.view.View);
- method public abstract boolean showContextMenuForChild(android.view.View, float, float);
- method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback);
- method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback, int);
+ method public void remove(@NonNull android.graphics.drawable.Drawable);
+ }
+
+ public interface ViewParent {
+ method public void bringChildToFront(android.view.View);
+ method public boolean canResolveLayoutDirection();
+ method public boolean canResolveTextAlignment();
+ method public boolean canResolveTextDirection();
+ method public void childDrawableStateChanged(android.view.View);
+ method public void childHasTransientStateChanged(android.view.View, boolean);
+ method public void clearChildFocus(android.view.View);
+ method public void createContextMenu(android.view.ContextMenu);
+ method public android.view.View focusSearch(android.view.View, int);
+ method public void focusableViewAvailable(android.view.View);
+ method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
+ method public int getLayoutDirection();
+ method public android.view.ViewParent getParent();
+ method public android.view.ViewParent getParentForAccessibility();
+ method public int getTextAlignment();
+ method public int getTextDirection();
+ method @Deprecated public void invalidateChild(android.view.View, android.graphics.Rect);
+ method @Deprecated public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
+ method public boolean isLayoutDirectionResolved();
+ method public boolean isLayoutRequested();
+ method public boolean isTextAlignmentResolved();
+ method public boolean isTextDirectionResolved();
+ method public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
+ method public void notifySubtreeAccessibilityStateChanged(android.view.View, @NonNull android.view.View, int);
+ method public default void onDescendantInvalidated(@NonNull android.view.View, @NonNull android.view.View);
+ method public boolean onNestedFling(android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.view.View, float, float);
+ method public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
+ method public void onNestedPreScroll(android.view.View, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void recomputeViewAttributes(android.view.View);
+ method public void requestChildFocus(android.view.View, android.view.View);
+ method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
+ method public void requestDisallowInterceptTouchEvent(boolean);
+ method public void requestFitSystemWindows();
+ method public void requestLayout();
+ method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void requestTransparentRegion(android.view.View);
+ method public boolean showContextMenuForChild(android.view.View);
+ method public boolean showContextMenuForChild(android.view.View, float, float);
+ method public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback);
+ method public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback, int);
}
public class ViewPropertyAnimator {
@@ -50810,9 +51103,9 @@ package android.view {
method public android.view.ViewPropertyAnimator translationYBy(float);
method public android.view.ViewPropertyAnimator translationZ(float);
method public android.view.ViewPropertyAnimator translationZBy(float);
- method public android.view.ViewPropertyAnimator withEndAction(java.lang.Runnable);
+ method public android.view.ViewPropertyAnimator withEndAction(Runnable);
method public android.view.ViewPropertyAnimator withLayer();
- method public android.view.ViewPropertyAnimator withStartAction(java.lang.Runnable);
+ method public android.view.ViewPropertyAnimator withStartAction(Runnable);
method public android.view.ViewPropertyAnimator x(float);
method public android.view.ViewPropertyAnimator xBy(float);
method public android.view.ViewPropertyAnimator y(float);
@@ -50826,31 +51119,31 @@ package android.view {
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
- method public abstract android.view.autofill.AutofillId getAutofillId();
+ method @Nullable public abstract android.view.autofill.AutofillId getAutofillId();
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
- method public abstract java.lang.CharSequence getHint();
- method public abstract java.lang.CharSequence getText();
+ method public abstract CharSequence getHint();
+ method public abstract CharSequence getText();
method public abstract int getTextSelectionEnd();
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
- method public abstract android.view.ViewStructure.HtmlInfo.Builder newHtmlInfoBuilder(java.lang.String);
+ method public abstract android.view.ViewStructure.HtmlInfo.Builder newHtmlInfoBuilder(@NonNull String);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
- method public abstract void setAutofillHints(java.lang.String[]);
- method public abstract void setAutofillId(android.view.autofill.AutofillId);
- method public abstract void setAutofillId(android.view.autofill.AutofillId, int);
- method public abstract void setAutofillOptions(java.lang.CharSequence[]);
+ method public abstract void setAutofillHints(@Nullable String[]);
+ method public abstract void setAutofillId(@NonNull android.view.autofill.AutofillId);
+ method public abstract void setAutofillId(@NonNull android.view.autofill.AutofillId, int);
+ method public abstract void setAutofillOptions(CharSequence[]);
method public abstract void setAutofillType(int);
method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
- method public abstract void setClassName(java.lang.String);
+ method public abstract void setClassName(String);
method public abstract void setClickable(boolean);
- method public abstract void setContentDescription(java.lang.CharSequence);
+ method public abstract void setContentDescription(CharSequence);
method public abstract void setContextClickable(boolean);
method public abstract void setDataIsSensitive(boolean);
method public abstract void setDimens(int, int, int, int, int, int);
@@ -50858,9 +51151,9 @@ package android.view {
method public abstract void setEnabled(boolean);
method public abstract void setFocusable(boolean);
method public abstract void setFocused(boolean);
- method public abstract void setHint(java.lang.CharSequence);
- method public abstract void setHtmlInfo(android.view.ViewStructure.HtmlInfo);
- method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
+ method public abstract void setHint(CharSequence);
+ method public abstract void setHtmlInfo(@NonNull android.view.ViewStructure.HtmlInfo);
+ method public abstract void setId(int, String, String, String);
method public void setImportantForAutofill(int);
method public abstract void setInputType(int);
method public abstract void setLocaleList(android.os.LocaleList);
@@ -50870,46 +51163,46 @@ package android.view {
method public void setMinTextEms(int);
method public abstract void setOpaque(boolean);
method public abstract void setSelected(boolean);
- method public abstract void setText(java.lang.CharSequence);
- method public abstract void setText(java.lang.CharSequence, int, int);
- method public void setTextIdEntry(java.lang.String);
+ method public abstract void setText(CharSequence);
+ method public abstract void setText(CharSequence, int, int);
+ method public void setTextIdEntry(@NonNull String);
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
method public abstract void setVisibility(int);
- method public abstract void setWebDomain(java.lang.String);
+ method public abstract void setWebDomain(@Nullable String);
}
- public static abstract class ViewStructure.HtmlInfo {
+ public abstract static class ViewStructure.HtmlInfo {
ctor public ViewStructure.HtmlInfo();
- method public abstract java.util.List<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
- method public abstract java.lang.String getTag();
+ method @Nullable public abstract java.util.List<android.util.Pair<java.lang.String,java.lang.String>> getAttributes();
+ method @NonNull public abstract String getTag();
}
- public static abstract class ViewStructure.HtmlInfo.Builder {
+ public abstract static class ViewStructure.HtmlInfo.Builder {
ctor public ViewStructure.HtmlInfo.Builder();
- method public abstract android.view.ViewStructure.HtmlInfo.Builder addAttribute(java.lang.String, java.lang.String);
+ method public abstract android.view.ViewStructure.HtmlInfo.Builder addAttribute(@NonNull String, @NonNull String);
method public abstract android.view.ViewStructure.HtmlInfo build();
}
- public final class ViewStub extends android.view.View {
+ @android.widget.RemoteViews.RemoteView public final class ViewStub extends android.view.View {
ctor public ViewStub(android.content.Context);
- ctor public ViewStub(android.content.Context, int);
+ ctor public ViewStub(android.content.Context, @LayoutRes int);
ctor public ViewStub(android.content.Context, android.util.AttributeSet);
ctor public ViewStub(android.content.Context, android.util.AttributeSet, int);
ctor public ViewStub(android.content.Context, android.util.AttributeSet, int, int);
- method public int getInflatedId();
+ method @IdRes public int getInflatedId();
method public android.view.LayoutInflater getLayoutInflater();
- method public int getLayoutResource();
+ method @LayoutRes public int getLayoutResource();
method public android.view.View inflate();
- method public void setInflatedId(int);
+ method public void setInflatedId(@IdRes int);
method public void setLayoutInflater(android.view.LayoutInflater);
- method public void setLayoutResource(int);
+ method public void setLayoutResource(@LayoutRes int);
method public void setOnInflateListener(android.view.ViewStub.OnInflateListener);
}
- public static abstract interface ViewStub.OnInflateListener {
- method public abstract void onInflate(android.view.ViewStub, android.view.View);
+ public static interface ViewStub.OnInflateListener {
+ method public void onInflate(android.view.ViewStub, android.view.View);
}
public final class ViewTreeObserver {
@@ -50925,8 +51218,8 @@ package android.view {
method public void dispatchOnGlobalLayout();
method public boolean dispatchOnPreDraw();
method public boolean isAlive();
- method public void registerFrameCommitCallback(java.lang.Runnable);
- method public deprecated void removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
+ method public void registerFrameCommitCallback(@NonNull Runnable);
+ method @Deprecated public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
method public void removeOnDrawListener(android.view.ViewTreeObserver.OnDrawListener);
method public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver.OnGlobalFocusChangeListener);
method public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
@@ -50935,51 +51228,51 @@ package android.view {
method public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
method public void removeOnWindowAttachListener(android.view.ViewTreeObserver.OnWindowAttachListener);
method public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver.OnWindowFocusChangeListener);
- method public boolean unregisterFrameCommitCallback(java.lang.Runnable);
+ method public boolean unregisterFrameCommitCallback(@NonNull Runnable);
}
- public static abstract interface ViewTreeObserver.OnDrawListener {
- method public abstract void onDraw();
+ public static interface ViewTreeObserver.OnDrawListener {
+ method public void onDraw();
}
- public static abstract interface ViewTreeObserver.OnGlobalFocusChangeListener {
- method public abstract void onGlobalFocusChanged(android.view.View, android.view.View);
+ public static interface ViewTreeObserver.OnGlobalFocusChangeListener {
+ method public void onGlobalFocusChanged(android.view.View, android.view.View);
}
- public static abstract interface ViewTreeObserver.OnGlobalLayoutListener {
- method public abstract void onGlobalLayout();
+ public static interface ViewTreeObserver.OnGlobalLayoutListener {
+ method public void onGlobalLayout();
}
- public static abstract interface ViewTreeObserver.OnPreDrawListener {
- method public abstract boolean onPreDraw();
+ public static interface ViewTreeObserver.OnPreDrawListener {
+ method public boolean onPreDraw();
}
- public static abstract interface ViewTreeObserver.OnScrollChangedListener {
- method public abstract void onScrollChanged();
+ public static interface ViewTreeObserver.OnScrollChangedListener {
+ method public void onScrollChanged();
}
- public static abstract interface ViewTreeObserver.OnTouchModeChangeListener {
- method public abstract void onTouchModeChanged(boolean);
+ public static interface ViewTreeObserver.OnTouchModeChangeListener {
+ method public void onTouchModeChanged(boolean);
}
- public static abstract interface ViewTreeObserver.OnWindowAttachListener {
- method public abstract void onWindowAttached();
- method public abstract void onWindowDetached();
+ public static interface ViewTreeObserver.OnWindowAttachListener {
+ method public void onWindowAttached();
+ method public void onWindowDetached();
}
- public static abstract interface ViewTreeObserver.OnWindowFocusChangeListener {
- method public abstract void onWindowFocusChanged(boolean);
+ public static interface ViewTreeObserver.OnWindowFocusChangeListener {
+ method public void onWindowFocusChanged(boolean);
}
public abstract class Window {
ctor public Window(android.content.Context);
method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public void addFlags(int);
- method public final void addOnFrameMetricsAvailableListener(android.view.Window.OnFrameMetricsAvailableListener, android.os.Handler);
+ method public final void addOnFrameMetricsAvailableListener(@NonNull android.view.Window.OnFrameMetricsAvailableListener, android.os.Handler);
method public void clearFlags(int);
method public abstract void closeAllPanels();
method public abstract void closePanel(int);
- method public <T extends android.view.View> T findViewById(int);
+ method public <T extends android.view.View> T findViewById(@IdRes int);
method public boolean getAllowEnterTransitionOverlap();
method public boolean getAllowReturnTransitionOverlap();
method public final android.view.WindowManager.LayoutParams getAttributes();
@@ -50988,18 +51281,18 @@ package android.view {
method public final android.view.Window getContainer();
method public android.transition.Scene getContentScene();
method public final android.content.Context getContext();
- method public abstract android.view.View getCurrentFocus();
- method public abstract android.view.View getDecorView();
+ method @Nullable public abstract android.view.View getCurrentFocus();
+ method @NonNull public abstract android.view.View getDecorView();
method public static int getDefaultFeatures(android.content.Context);
method public android.transition.Transition getEnterTransition();
method public android.transition.Transition getExitTransition();
method protected final int getFeatures();
method protected final int getForcedWindowFlags();
- method public abstract android.view.LayoutInflater getLayoutInflater();
+ method @NonNull public abstract android.view.LayoutInflater getLayoutInflater();
method protected final int getLocalFeatures();
method public android.media.session.MediaController getMediaController();
- method public abstract int getNavigationBarColor();
- method public int getNavigationBarDividerColor();
+ method @ColorInt public abstract int getNavigationBarColor();
+ method @ColorInt public int getNavigationBarDividerColor();
method public android.transition.Transition getReenterTransition();
method public android.transition.Transition getReturnTransition();
method public android.transition.Transition getSharedElementEnterTransition();
@@ -51007,7 +51300,7 @@ package android.view {
method public android.transition.Transition getSharedElementReenterTransition();
method public android.transition.Transition getSharedElementReturnTransition();
method public boolean getSharedElementsUseOverlay();
- method public abstract int getStatusBarColor();
+ method @ColorInt public abstract int getStatusBarColor();
method public long getTransitionBackgroundFadeDuration();
method public android.transition.TransitionManager getTransitionManager();
method public abstract int getVolumeControlStream();
@@ -51032,21 +51325,21 @@ package android.view {
method public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int);
method public final void removeOnFrameMetricsAvailableListener(android.view.Window.OnFrameMetricsAvailableListener);
method public boolean requestFeature(int);
- method public final <T extends android.view.View> T requireViewById(int);
+ method @NonNull public final <T extends android.view.View> T requireViewById(@IdRes int);
method public abstract void restoreHierarchyState(android.os.Bundle);
method public abstract android.os.Bundle saveHierarchyState();
method public void setAllowEnterTransitionOverlap(boolean);
method public void setAllowReturnTransitionOverlap(boolean);
method public void setAttributes(android.view.WindowManager.LayoutParams);
method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setBackgroundDrawableResource(int);
+ method public void setBackgroundDrawableResource(@DrawableRes int);
method public void setCallback(android.view.Window.Callback);
method public abstract void setChildDrawable(int, android.graphics.drawable.Drawable);
method public abstract void setChildInt(int, int);
method public void setClipToOutline(boolean);
method public void setColorMode(int);
method public void setContainer(android.view.Window);
- method public abstract void setContentView(int);
+ method public abstract void setContentView(@LayoutRes int);
method public abstract void setContentView(android.view.View);
method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public abstract void setDecorCaptionShade(int);
@@ -51057,19 +51350,19 @@ package android.view {
method public void setExitTransition(android.transition.Transition);
method public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
method public abstract void setFeatureDrawableAlpha(int, int);
- method public abstract void setFeatureDrawableResource(int, int);
+ method public abstract void setFeatureDrawableResource(int, @DrawableRes int);
method public abstract void setFeatureDrawableUri(int, android.net.Uri);
method public abstract void setFeatureInt(int, int);
method public void setFlags(int, int);
method public void setFormat(int);
method public void setGravity(int);
- method public void setIcon(int);
+ method public void setIcon(@DrawableRes int);
method public void setLayout(int, int);
method public void setLocalFocus(boolean, boolean);
- method public void setLogo(int);
+ method public void setLogo(@DrawableRes int);
method public void setMediaController(android.media.session.MediaController);
- method public abstract void setNavigationBarColor(int);
- method public void setNavigationBarDividerColor(int);
+ method public abstract void setNavigationBarColor(@ColorInt int);
+ method public void setNavigationBarDividerColor(@ColorInt int);
method public void setReenterTransition(android.transition.Transition);
method public abstract void setResizingCaptionDrawable(android.graphics.drawable.Drawable);
method public final void setRestrictedCaptionAreaListener(android.view.Window.OnRestrictedCaptionAreaChangedListener);
@@ -51080,19 +51373,19 @@ package android.view {
method public void setSharedElementReturnTransition(android.transition.Transition);
method public void setSharedElementsUseOverlay(boolean);
method public void setSoftInputMode(int);
- method public abstract void setStatusBarColor(int);
+ method public abstract void setStatusBarColor(@ColorInt int);
method public void setSustainedPerformanceMode(boolean);
- method public abstract void setTitle(java.lang.CharSequence);
- method public abstract deprecated void setTitleColor(int);
+ method public abstract void setTitle(CharSequence);
+ method @Deprecated public abstract void setTitleColor(@ColorInt int);
method public void setTransitionBackgroundFadeDuration(long);
method public void setTransitionManager(android.transition.TransitionManager);
method public void setType(int);
method public void setUiOptions(int);
method public void setUiOptions(int, int);
method public abstract void setVolumeControlStream(int);
- method public void setWindowAnimations(int);
- method public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String);
- method public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String, boolean);
+ method public void setWindowAnimations(@StyleRes int);
+ method public void setWindowManager(android.view.WindowManager, android.os.IBinder, String);
+ method public void setWindowManager(android.view.WindowManager, android.os.IBinder, String, boolean);
method public abstract boolean superDispatchGenericMotionEvent(android.view.MotionEvent);
method public abstract boolean superDispatchKeyEvent(android.view.KeyEvent);
method public abstract boolean superDispatchKeyShortcutEvent(android.view.KeyEvent);
@@ -51105,7 +51398,7 @@ package android.view {
field public static final int DECOR_CAPTION_SHADE_AUTO = 0; // 0x0
field public static final int DECOR_CAPTION_SHADE_DARK = 2; // 0x2
field public static final int DECOR_CAPTION_SHADE_LIGHT = 1; // 0x1
- field protected static final deprecated int DEFAULT_FEATURES = 65; // 0x41
+ field @Deprecated protected static final int DEFAULT_FEATURES = 65; // 0x41
field public static final int FEATURE_ACTION_BAR = 8; // 0x8
field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
@@ -51113,60 +51406,60 @@ package android.view {
field public static final int FEATURE_CONTENT_TRANSITIONS = 12; // 0xc
field public static final int FEATURE_CONTEXT_MENU = 6; // 0x6
field public static final int FEATURE_CUSTOM_TITLE = 7; // 0x7
- field public static final deprecated int FEATURE_INDETERMINATE_PROGRESS = 5; // 0x5
+ field @Deprecated public static final int FEATURE_INDETERMINATE_PROGRESS = 5; // 0x5
field public static final int FEATURE_LEFT_ICON = 3; // 0x3
field public static final int FEATURE_NO_TITLE = 1; // 0x1
field public static final int FEATURE_OPTIONS_PANEL = 0; // 0x0
- field public static final deprecated int FEATURE_PROGRESS = 2; // 0x2
+ field @Deprecated public static final int FEATURE_PROGRESS = 2; // 0x2
field public static final int FEATURE_RIGHT_ICON = 4; // 0x4
field public static final int FEATURE_SWIPE_TO_DISMISS = 11; // 0xb
field public static final int ID_ANDROID_CONTENT = 16908290; // 0x1020002
- field public static final java.lang.String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME = "android:navigation:background";
- field public static final deprecated int PROGRESS_END = 10000; // 0x2710
- field public static final deprecated int PROGRESS_INDETERMINATE_OFF = -4; // 0xfffffffc
- field public static final deprecated int PROGRESS_INDETERMINATE_ON = -3; // 0xfffffffd
- field public static final deprecated int PROGRESS_SECONDARY_END = 30000; // 0x7530
- field public static final deprecated int PROGRESS_SECONDARY_START = 20000; // 0x4e20
- field public static final deprecated int PROGRESS_START = 0; // 0x0
- field public static final deprecated int PROGRESS_VISIBILITY_OFF = -2; // 0xfffffffe
- field public static final deprecated int PROGRESS_VISIBILITY_ON = -1; // 0xffffffff
- field public static final java.lang.String STATUS_BAR_BACKGROUND_TRANSITION_NAME = "android:status:background";
- }
-
- public static abstract interface Window.Callback {
- method public abstract boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- method public abstract boolean dispatchKeyEvent(android.view.KeyEvent);
- method public abstract boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- method public abstract boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public abstract boolean dispatchTouchEvent(android.view.MotionEvent);
- method public abstract boolean dispatchTrackballEvent(android.view.MotionEvent);
- method public abstract void onActionModeFinished(android.view.ActionMode);
- method public abstract void onActionModeStarted(android.view.ActionMode);
- method public abstract void onAttachedToWindow();
- method public abstract void onContentChanged();
- method public abstract boolean onCreatePanelMenu(int, android.view.Menu);
- method public abstract android.view.View onCreatePanelView(int);
- method public abstract void onDetachedFromWindow();
- method public abstract boolean onMenuItemSelected(int, android.view.MenuItem);
- method public abstract boolean onMenuOpened(int, android.view.Menu);
- method public abstract void onPanelClosed(int, android.view.Menu);
+ field public static final String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME = "android:navigation:background";
+ field @Deprecated public static final int PROGRESS_END = 10000; // 0x2710
+ field @Deprecated public static final int PROGRESS_INDETERMINATE_OFF = -4; // 0xfffffffc
+ field @Deprecated public static final int PROGRESS_INDETERMINATE_ON = -3; // 0xfffffffd
+ field @Deprecated public static final int PROGRESS_SECONDARY_END = 30000; // 0x7530
+ field @Deprecated public static final int PROGRESS_SECONDARY_START = 20000; // 0x4e20
+ field @Deprecated public static final int PROGRESS_START = 0; // 0x0
+ field @Deprecated public static final int PROGRESS_VISIBILITY_OFF = -2; // 0xfffffffe
+ field @Deprecated public static final int PROGRESS_VISIBILITY_ON = -1; // 0xffffffff
+ field public static final String STATUS_BAR_BACKGROUND_TRANSITION_NAME = "android:status:background";
+ }
+
+ public static interface Window.Callback {
+ method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
+ method public boolean dispatchKeyEvent(android.view.KeyEvent);
+ method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public boolean dispatchTouchEvent(android.view.MotionEvent);
+ method public boolean dispatchTrackballEvent(android.view.MotionEvent);
+ method public void onActionModeFinished(android.view.ActionMode);
+ method public void onActionModeStarted(android.view.ActionMode);
+ method public void onAttachedToWindow();
+ method public void onContentChanged();
+ method public boolean onCreatePanelMenu(int, @NonNull android.view.Menu);
+ method @Nullable public android.view.View onCreatePanelView(int);
+ method public void onDetachedFromWindow();
+ method public boolean onMenuItemSelected(int, @NonNull android.view.MenuItem);
+ method public boolean onMenuOpened(int, @NonNull android.view.Menu);
+ method public void onPanelClosed(int, @NonNull android.view.Menu);
method public default void onPointerCaptureChanged(boolean);
- method public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu);
- method public default void onProvideKeyboardShortcuts(java.util.List<android.view.KeyboardShortcutGroup>, android.view.Menu, int);
- method public abstract boolean onSearchRequested();
- method public abstract boolean onSearchRequested(android.view.SearchEvent);
- method public abstract void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
- method public abstract void onWindowFocusChanged(boolean);
- method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
- method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
+ method public boolean onPreparePanel(int, @Nullable android.view.View, @NonNull android.view.Menu);
+ method public default void onProvideKeyboardShortcuts(java.util.List<android.view.KeyboardShortcutGroup>, @Nullable android.view.Menu, int);
+ method public boolean onSearchRequested();
+ method public boolean onSearchRequested(android.view.SearchEvent);
+ method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
+ method public void onWindowFocusChanged(boolean);
+ method @Nullable public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback);
+ method @Nullable public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int);
}
- public static abstract interface Window.OnFrameMetricsAvailableListener {
- method public abstract void onFrameMetricsAvailable(android.view.Window, android.view.FrameMetrics, int);
+ public static interface Window.OnFrameMetricsAvailableListener {
+ method public void onFrameMetricsAvailable(android.view.Window, android.view.FrameMetrics, int);
}
- public static abstract interface Window.OnRestrictedCaptionAreaChangedListener {
- method public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect);
+ public static interface Window.OnRestrictedCaptionAreaChangedListener {
+ method public void onRestrictedCaptionAreaChanged(android.graphics.Rect);
}
public final class WindowAnimationFrameStats extends android.view.FrameStats implements android.os.Parcelable {
@@ -51192,7 +51485,7 @@ package android.view {
field public static final android.os.Parcelable.Creator<android.view.WindowId> CREATOR;
}
- public static abstract class WindowId.FocusObserver {
+ public abstract static class WindowId.FocusObserver {
ctor public WindowId.FocusObserver();
method public abstract void onFocusGained(android.view.WindowId);
method public abstract void onFocusLost(android.view.WindowId);
@@ -51200,52 +51493,52 @@ package android.view {
public final class WindowInsets {
ctor public WindowInsets(android.view.WindowInsets);
- method public android.view.WindowInsets consumeDisplayCutout();
- method public android.view.WindowInsets consumeStableInsets();
- method public android.view.WindowInsets consumeSystemWindowInsets();
- method public android.view.DisplayCutout getDisplayCutout();
+ method @NonNull public android.view.WindowInsets consumeDisplayCutout();
+ method @NonNull public android.view.WindowInsets consumeStableInsets();
+ method @NonNull public android.view.WindowInsets consumeSystemWindowInsets();
+ method @Nullable public android.view.DisplayCutout getDisplayCutout();
method public int getStableInsetBottom();
method public int getStableInsetLeft();
method public int getStableInsetRight();
method public int getStableInsetTop();
- method public android.graphics.Insets getStableInsets();
+ method @NonNull public android.graphics.Insets getStableInsets();
method public int getSystemWindowInsetBottom();
method public int getSystemWindowInsetLeft();
method public int getSystemWindowInsetRight();
method public int getSystemWindowInsetTop();
- method public android.graphics.Insets getSystemWindowInsets();
+ method @NonNull public android.graphics.Insets getSystemWindowInsets();
method public boolean hasInsets();
method public boolean hasStableInsets();
method public boolean hasSystemWindowInsets();
- method public android.view.WindowInsets inset(int, int, int, int);
+ method @NonNull public android.view.WindowInsets inset(int, int, int, int);
method public boolean isConsumed();
method public boolean isRound();
- method public deprecated android.view.WindowInsets replaceSystemWindowInsets(int, int, int, int);
- method public deprecated android.view.WindowInsets replaceSystemWindowInsets(android.graphics.Rect);
+ method @Deprecated @NonNull public android.view.WindowInsets replaceSystemWindowInsets(int, int, int, int);
+ method @Deprecated @NonNull public android.view.WindowInsets replaceSystemWindowInsets(android.graphics.Rect);
}
public static class WindowInsets.Builder {
ctor public WindowInsets.Builder();
ctor public WindowInsets.Builder(android.view.WindowInsets);
- method public android.view.WindowInsets build();
- method public android.view.WindowInsets.Builder setDisplayCutout(android.view.DisplayCutout);
- method public android.view.WindowInsets.Builder setStableInsets(android.graphics.Insets);
- method public android.view.WindowInsets.Builder setSystemWindowInsets(android.graphics.Insets);
+ method @NonNull public android.view.WindowInsets build();
+ method @NonNull public android.view.WindowInsets.Builder setDisplayCutout(@Nullable android.view.DisplayCutout);
+ method @NonNull public android.view.WindowInsets.Builder setStableInsets(@NonNull android.graphics.Insets);
+ method @NonNull public android.view.WindowInsets.Builder setSystemWindowInsets(@NonNull android.graphics.Insets);
}
- public abstract interface WindowManager implements android.view.ViewManager {
- method public abstract android.view.Display getDefaultDisplay();
- method public abstract void removeViewImmediate(android.view.View);
+ public interface WindowManager extends android.view.ViewManager {
+ method public android.view.Display getDefaultDisplay();
+ method public void removeViewImmediate(android.view.View);
}
public static class WindowManager.BadTokenException extends java.lang.RuntimeException {
ctor public WindowManager.BadTokenException();
- ctor public WindowManager.BadTokenException(java.lang.String);
+ ctor public WindowManager.BadTokenException(String);
}
public static class WindowManager.InvalidDisplayException extends java.lang.RuntimeException {
ctor public WindowManager.InvalidDisplayException();
- ctor public WindowManager.InvalidDisplayException(java.lang.String);
+ ctor public WindowManager.InvalidDisplayException(String);
}
public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
@@ -51257,13 +51550,13 @@ package android.view {
ctor public WindowManager.LayoutParams(int, int, int, int, int, int, int);
ctor public WindowManager.LayoutParams(android.os.Parcel);
method public final int copyFrom(android.view.WindowManager.LayoutParams);
- method public java.lang.String debug(java.lang.String);
+ method public String debug(String);
method public int describeContents();
method public int getColorMode();
- method public final java.lang.CharSequence getTitle();
+ method public final CharSequence getTitle();
method public static boolean mayUseInputMethod(int);
method public void setColorMode(int);
- method public final void setTitle(java.lang.CharSequence);
+ method public final void setTitle(CharSequence);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ALPHA_CHANGED = 128; // 0x80
field public static final int ANIMATION_CHANGED = 16; // 0x10
@@ -51278,10 +51571,10 @@ package android.view {
field public static final int FLAGS_CHANGED = 4; // 0x4
field public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 1; // 0x1
field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
- field public static final deprecated int FLAG_BLUR_BEHIND = 4; // 0x4
+ field @Deprecated public static final int FLAG_BLUR_BEHIND = 4; // 0x4
field public static final int FLAG_DIM_BEHIND = 2; // 0x2
- field public static final deprecated int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
- field public static final deprecated int FLAG_DITHER = 4096; // 0x1000
+ field @Deprecated public static final int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
+ field @Deprecated public static final int FLAG_DITHER = 4096; // 0x1000
field public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = -2147483648; // 0x80000000
field public static final int FLAG_FORCE_NOT_FULLSCREEN = 2048; // 0x800
field public static final int FLAG_FULLSCREEN = 1024; // 0x400
@@ -51300,12 +51593,12 @@ package android.view {
field public static final int FLAG_SCALED = 16384; // 0x4000
field public static final int FLAG_SECURE = 8192; // 0x2000
field public static final int FLAG_SHOW_WALLPAPER = 1048576; // 0x100000
- field public static final deprecated int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
+ field @Deprecated public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000
- field public static final deprecated int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
+ field @Deprecated public static final int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000
field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000
- field public static final deprecated int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
+ field @Deprecated public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
field public static final int FORMAT_CHANGED = 8; // 0x8
field public static final int LAST_APPLICATION_WINDOW = 99; // 0x63
@@ -51316,10 +51609,10 @@ package android.view {
field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2; // 0x2
field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1; // 0x1
field public static final int MEMORY_TYPE_CHANGED = 256; // 0x100
- field public static final deprecated int MEMORY_TYPE_GPU = 2; // 0x2
- field public static final deprecated int MEMORY_TYPE_HARDWARE = 1; // 0x1
- field public static final deprecated int MEMORY_TYPE_NORMAL = 0; // 0x0
- field public static final deprecated int MEMORY_TYPE_PUSH_BUFFERS = 3; // 0x3
+ field @Deprecated public static final int MEMORY_TYPE_GPU = 2; // 0x2
+ field @Deprecated public static final int MEMORY_TYPE_HARDWARE = 1; // 0x1
+ field @Deprecated public static final int MEMORY_TYPE_NORMAL = 0; // 0x0
+ field @Deprecated public static final int MEMORY_TYPE_PUSH_BUFFERS = 3; // 0x3
field public static final int ROTATION_ANIMATION_CHANGED = 4096; // 0x1000
field public static final int ROTATION_ANIMATION_CROSSFADE = 1; // 0x1
field public static final int ROTATION_ANIMATION_JUMPCUT = 2; // 0x2
@@ -51356,43 +51649,43 @@ package android.view {
field public static final int TYPE_INPUT_METHOD = 2011; // 0x7db
field public static final int TYPE_INPUT_METHOD_DIALOG = 2012; // 0x7dc
field public static final int TYPE_KEYGUARD_DIALOG = 2009; // 0x7d9
- field public static final deprecated int TYPE_PHONE = 2002; // 0x7d2
- field public static final deprecated int TYPE_PRIORITY_PHONE = 2007; // 0x7d7
+ field @Deprecated public static final int TYPE_PHONE = 2002; // 0x7d2
+ field @Deprecated public static final int TYPE_PRIORITY_PHONE = 2007; // 0x7d7
field public static final int TYPE_PRIVATE_PRESENTATION = 2030; // 0x7ee
field public static final int TYPE_SEARCH_BAR = 2001; // 0x7d1
field public static final int TYPE_STATUS_BAR = 2000; // 0x7d0
field public static final int TYPE_STATUS_BAR_PANEL = 2014; // 0x7de
- field public static final deprecated int TYPE_SYSTEM_ALERT = 2003; // 0x7d3
+ field @Deprecated public static final int TYPE_SYSTEM_ALERT = 2003; // 0x7d3
field public static final int TYPE_SYSTEM_DIALOG = 2008; // 0x7d8
- field public static final deprecated int TYPE_SYSTEM_ERROR = 2010; // 0x7da
- field public static final deprecated int TYPE_SYSTEM_OVERLAY = 2006; // 0x7d6
- field public static final deprecated int TYPE_TOAST = 2005; // 0x7d5
+ field @Deprecated public static final int TYPE_SYSTEM_ERROR = 2010; // 0x7da
+ field @Deprecated public static final int TYPE_SYSTEM_OVERLAY = 2006; // 0x7d6
+ field @Deprecated public static final int TYPE_TOAST = 2005; // 0x7d5
field public static final int TYPE_WALLPAPER = 2013; // 0x7dd
field public float alpha;
field public float buttonBrightness;
field public float dimAmount;
- field public int flags;
+ field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, name="ALLOW_LOCK_WHILE_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, name="DIM_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, name="BLUR_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, name="NOT_FOCUSABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, name="NOT_TOUCHABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, name="NOT_TOUCH_MODAL"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, equals=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, name="TOUCHABLE_WHEN_WAKING"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, name="KEEP_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, name="LAYOUT_IN_SCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, name="LAYOUT_NO_LIMITS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, name="FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, name="FORCE_NOT_FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DITHER, equals=android.view.WindowManager.LayoutParams.FLAG_DITHER, name="DITHER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SECURE, equals=android.view.WindowManager.LayoutParams.FLAG_SECURE, name="SECURE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SCALED, equals=android.view.WindowManager.LayoutParams.FLAG_SCALED, name="SCALED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, equals=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, name="IGNORE_CHEEK_PRESSES"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, name="LAYOUT_INSET_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, equals=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, name="ALT_FOCUSABLE_IM"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, name="WATCH_OUTSIDE_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, name="SHOW_WHEN_LOCKED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, name="SHOW_WALLPAPER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, name="TURN_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, equals=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, name="DISMISS_KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, name="SPLIT_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, equals=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, name="HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, name="TRANSLUCENT_STATUS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, name="TRANSLUCENT_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, equals=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=0x20000000, equals=0x20000000, name="FLAG_SLIPPERY"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, name="FLAG_LAYOUT_ATTACHED_IN_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, equals=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, name="DRAWS_SYSTEM_BAR_BACKGROUNDS")}, formatToHexString=true) public int flags;
field public int format;
field public int gravity;
field public float horizontalMargin;
- field public float horizontalWeight;
+ field @android.view.ViewDebug.ExportedProperty public float horizontalWeight;
field public int layoutInDisplayCutoutMode;
- field public deprecated int memoryType;
- field public java.lang.String packageName;
+ field @Deprecated public int memoryType;
+ field public String packageName;
field public int preferredDisplayModeId;
- field public deprecated float preferredRefreshRate;
+ field @Deprecated public float preferredRefreshRate;
field public int rotationAnimation;
field public float screenBrightness;
field public int screenOrientation;
field public int softInputMode;
field public int systemUiVisibility;
field public android.os.IBinder token;
- field public int type;
+ field @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION, to="BASE_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION, to="APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING, to="APPLICATION_STARTING"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION, to="DRAWN_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, to="APPLICATION_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA, to="APPLICATION_MEDIA"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, to="APPLICATION_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x3ed, to="APPLICATION_ABOVE_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG, to="APPLICATION_ATTACHED_DIALOG"), @android.view.ViewDebug.IntToString(from=0x3ec, to="APPLICATION_MEDIA_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR, to="STATUS_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR, to="SEARCH_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PHONE, to="PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, to="SYSTEM_ALERT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_TOAST, to="TOAST"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, to="SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE, to="PRIORITY_PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG, to="SYSTEM_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, to="KEYGUARD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, to="SYSTEM_ERROR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD, to="INPUT_METHOD"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG, to="INPUT_METHOD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_WALLPAPER, to="WALLPAPER"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, to="STATUS_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7df, to="SECURE_SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e0, to="DRAG"), @android.view.ViewDebug.IntToString(from=0x7e1, to="STATUS_BAR_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x7e2, to="POINTER"), @android.view.ViewDebug.IntToString(from=0x7e3, to="NAVIGATION_BAR"), @android.view.ViewDebug.IntToString(from=0x7e4, to="VOLUME_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e5, to="BOOT_PROGRESS"), @android.view.ViewDebug.IntToString(from=0x7e6, to="INPUT_CONSUMER"), @android.view.ViewDebug.IntToString(from=0x7e7, to="DREAM"), @android.view.ViewDebug.IntToString(from=0x7e8, to="NAVIGATION_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7ea, to="DISPLAY_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7eb, to="MAGNIFICATION_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7f5, to="PRESENTATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION, to="PRIVATE_PRESENTATION"), @android.view.ViewDebug.IntToString(from=0x7ef, to="VOICE_INTERACTION"), @android.view.ViewDebug.IntToString(from=0x7f1, to="VOICE_INTERACTION_STARTING"), @android.view.ViewDebug.IntToString(from=0x7f2, to="DOCK_DIVIDER"), @android.view.ViewDebug.IntToString(from=0x7f3, to="QS_DIALOG"), @android.view.ViewDebug.IntToString(from=0x7f4, to="SCREENSHOT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, to="APPLICATION_OVERLAY")}) public int type;
field public float verticalMargin;
- field public float verticalWeight;
+ field @android.view.ViewDebug.ExportedProperty public float verticalWeight;
field public int windowAnimations;
- field public int x;
- field public int y;
+ field @android.view.ViewDebug.ExportedProperty public int x;
+ field @android.view.ViewDebug.ExportedProperty public int y;
}
}
@@ -51402,13 +51695,13 @@ package android.view.accessibility {
public final class AccessibilityEvent extends android.view.accessibility.AccessibilityRecord implements android.os.Parcelable {
method public void appendRecord(android.view.accessibility.AccessibilityRecord);
method public int describeContents();
- method public static java.lang.String eventTypeToString(int);
+ method public static String eventTypeToString(int);
method public int getAction();
method public int getContentChangeTypes();
method public long getEventTime();
method public int getEventType();
method public int getMovementGranularity();
- method public java.lang.CharSequence getPackageName();
+ method public CharSequence getPackageName();
method public android.view.accessibility.AccessibilityRecord getRecord(int);
method public int getRecordCount();
method public int getWindowChanges();
@@ -51421,7 +51714,7 @@ package android.view.accessibility {
method public void setEventTime(long);
method public void setEventType(int);
method public void setMovementGranularity(int);
- method public void setPackageName(java.lang.CharSequence);
+ method public void setPackageName(CharSequence);
method public void writeToParcel(android.os.Parcel, int);
field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
@@ -51432,7 +51725,7 @@ package android.view.accessibility {
field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityEvent> CREATOR;
field public static final int INVALID_POSITION = -1; // 0xffffffff
- field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
+ field @Deprecated public static final int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
@@ -51472,18 +51765,18 @@ package android.view.accessibility {
field public static final int WINDOWS_CHANGE_TITLE = 4; // 0x4
}
- public abstract interface AccessibilityEventSource {
- method public abstract void sendAccessibilityEvent(int);
- method public abstract void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
+ public interface AccessibilityEventSource {
+ method public void sendAccessibilityEvent(int);
+ method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
}
public final class AccessibilityManager {
method public void addAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
- method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
- method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
- method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
- method public void addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler);
- method public deprecated java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
+ method public boolean addAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public void addAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, @Nullable android.os.Handler);
+ method public boolean addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
+ method public void addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, @Nullable android.os.Handler);
+ method @Deprecated public java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
method public int getRecommendedTimeoutMillis(int, int);
@@ -51492,66 +51785,66 @@ package android.view.accessibility {
method public boolean isEnabled();
method public boolean isTouchExplorationEnabled();
method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
- method public boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
- method public boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
+ method public boolean removeAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public boolean removeTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
method public void sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
field public static final int FLAG_CONTENT_CONTROLS = 4; // 0x4
field public static final int FLAG_CONTENT_ICONS = 1; // 0x1
field public static final int FLAG_CONTENT_TEXT = 2; // 0x2
}
- public static abstract interface AccessibilityManager.AccessibilityStateChangeListener {
- method public abstract void onAccessibilityStateChanged(boolean);
+ public static interface AccessibilityManager.AccessibilityStateChangeListener {
+ method public void onAccessibilityStateChanged(boolean);
}
- public static abstract interface AccessibilityManager.TouchExplorationStateChangeListener {
- method public abstract void onTouchExplorationStateChanged(boolean);
+ public static interface AccessibilityManager.TouchExplorationStateChangeListener {
+ method public void onTouchExplorationStateChanged(boolean);
}
public class AccessibilityNodeInfo implements android.os.Parcelable {
method public void addAction(android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction);
- method public deprecated void addAction(int);
+ method @Deprecated public void addAction(int);
method public void addChild(android.view.View);
method public void addChild(android.view.View, int);
method public boolean canOpenPopup();
method public int describeContents();
- method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String);
- method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(java.lang.String);
+ method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String);
+ method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(String);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction> getActionList();
- method public deprecated int getActions();
+ method @Deprecated public int getActions();
method public java.util.List<java.lang.String> getAvailableExtraData();
method public void getBoundsInParent(android.graphics.Rect);
method public void getBoundsInScreen(android.graphics.Rect);
method public android.view.accessibility.AccessibilityNodeInfo getChild(int);
method public int getChildCount();
- method public java.lang.CharSequence getClassName();
+ method public CharSequence getClassName();
method public android.view.accessibility.AccessibilityNodeInfo.CollectionInfo getCollectionInfo();
method public android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo getCollectionItemInfo();
- method public java.lang.CharSequence getContentDescription();
+ method public CharSequence getContentDescription();
method public int getDrawingOrder();
- method public java.lang.CharSequence getError();
+ method public CharSequence getError();
method public android.os.Bundle getExtras();
- method public java.lang.CharSequence getHintText();
+ method public CharSequence getHintText();
method public int getInputType();
method public android.view.accessibility.AccessibilityNodeInfo getLabelFor();
method public android.view.accessibility.AccessibilityNodeInfo getLabeledBy();
method public int getLiveRegion();
method public int getMaxTextLength();
method public int getMovementGranularities();
- method public java.lang.CharSequence getPackageName();
- method public java.lang.CharSequence getPaneTitle();
+ method public CharSequence getPackageName();
+ method @Nullable public CharSequence getPaneTitle();
method public android.view.accessibility.AccessibilityNodeInfo getParent();
method public android.view.accessibility.AccessibilityNodeInfo.RangeInfo getRangeInfo();
- method public java.lang.CharSequence getText();
+ method public CharSequence getText();
method public int getTextSelectionEnd();
method public int getTextSelectionStart();
- method public java.lang.CharSequence getTooltipText();
- method public android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo getTouchDelegateInfo();
+ method @Nullable public CharSequence getTooltipText();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo getTouchDelegateInfo();
method public android.view.accessibility.AccessibilityNodeInfo getTraversalAfter();
method public android.view.accessibility.AccessibilityNodeInfo getTraversalBefore();
- method public java.lang.String getViewIdResourceName();
+ method public String getViewIdResourceName();
method public android.view.accessibility.AccessibilityWindowInfo getWindow();
method public int getWindowId();
method public boolean isAccessibilityFocused();
@@ -51584,8 +51877,8 @@ package android.view.accessibility {
method public boolean performAction(int, android.os.Bundle);
method public void recycle();
method public boolean refresh();
- method public boolean refreshWithExtraData(java.lang.String, android.os.Bundle);
- method public deprecated void removeAction(int);
+ method public boolean refreshWithExtraData(String, android.os.Bundle);
+ method @Deprecated public void removeAction(int);
method public boolean removeAction(android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction);
method public boolean removeChild(android.view.View);
method public boolean removeChild(android.view.View, int);
@@ -51596,22 +51889,22 @@ package android.view.accessibility {
method public void setCanOpenPopup(boolean);
method public void setCheckable(boolean);
method public void setChecked(boolean);
- method public void setClassName(java.lang.CharSequence);
- method public deprecated void setClickable(boolean);
+ method public void setClassName(CharSequence);
+ method @Deprecated public void setClickable(boolean);
method public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionInfo);
method public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo);
- method public void setContentDescription(java.lang.CharSequence);
+ method public void setContentDescription(CharSequence);
method public void setContentInvalid(boolean);
- method public deprecated void setContextClickable(boolean);
- method public deprecated void setDismissable(boolean);
+ method @Deprecated public void setContextClickable(boolean);
+ method @Deprecated public void setDismissable(boolean);
method public void setDrawingOrder(int);
method public void setEditable(boolean);
method public void setEnabled(boolean);
- method public void setError(java.lang.CharSequence);
- method public deprecated void setFocusable(boolean);
+ method public void setError(CharSequence);
+ method @Deprecated public void setFocusable(boolean);
method public void setFocused(boolean);
method public void setHeading(boolean);
- method public void setHintText(java.lang.CharSequence);
+ method public void setHintText(CharSequence);
method public void setImportantForAccessibility(boolean);
method public void setInputType(int);
method public void setLabelFor(android.view.View);
@@ -51619,46 +51912,46 @@ package android.view.accessibility {
method public void setLabeledBy(android.view.View);
method public void setLabeledBy(android.view.View, int);
method public void setLiveRegion(int);
- method public deprecated void setLongClickable(boolean);
+ method @Deprecated public void setLongClickable(boolean);
method public void setMaxTextLength(int);
method public void setMovementGranularities(int);
method public void setMultiLine(boolean);
- method public void setPackageName(java.lang.CharSequence);
- method public void setPaneTitle(java.lang.CharSequence);
+ method public void setPackageName(CharSequence);
+ method public void setPaneTitle(@Nullable CharSequence);
method public void setParent(android.view.View);
method public void setParent(android.view.View, int);
method public void setPassword(boolean);
method public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo.RangeInfo);
method public void setScreenReaderFocusable(boolean);
- method public deprecated void setScrollable(boolean);
+ method @Deprecated public void setScrollable(boolean);
method public void setSelected(boolean);
method public void setShowingHintText(boolean);
method public void setSource(android.view.View);
method public void setSource(android.view.View, int);
- method public void setText(java.lang.CharSequence);
+ method public void setText(CharSequence);
method public void setTextEntryKey(boolean);
method public void setTextSelection(int, int);
- method public void setTooltipText(java.lang.CharSequence);
- method public void setTouchDelegateInfo(android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo);
+ method public void setTooltipText(@Nullable CharSequence);
+ method public void setTouchDelegateInfo(@NonNull android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo);
method public void setTraversalAfter(android.view.View);
method public void setTraversalAfter(android.view.View, int);
method public void setTraversalBefore(android.view.View);
method public void setTraversalBefore(android.view.View, int);
- method public void setViewIdResourceName(java.lang.String);
+ method public void setViewIdResourceName(String);
method public void setVisibleToUser(boolean);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
- field public static final java.lang.String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
- field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
- field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
- field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
- field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
- field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
- field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
- field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
- field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+ field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+ field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+ field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+ field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+ field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+ field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
@@ -51681,9 +51974,9 @@ package android.view.accessibility {
field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo> CREATOR;
- field public static final java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
- field public static final java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
- field public static final java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+ field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+ field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+ field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
field public static final int FOCUS_INPUT = 1; // 0x1
field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
@@ -51694,9 +51987,9 @@ package android.view.accessibility {
}
public static final class AccessibilityNodeInfo.AccessibilityAction {
- ctor public AccessibilityNodeInfo.AccessibilityAction(int, java.lang.CharSequence);
+ ctor public AccessibilityNodeInfo.AccessibilityAction(int, @Nullable CharSequence);
method public int getId();
- method public java.lang.CharSequence getLabel();
+ method public CharSequence getLabel();
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_ACCESSIBILITY_FOCUS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_CLEAR_ACCESSIBILITY_FOCUS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_CLEAR_FOCUS;
@@ -51753,7 +52046,7 @@ package android.view.accessibility {
method public int getColumnSpan();
method public int getRowIndex();
method public int getRowSpan();
- method public deprecated boolean isHeading();
+ method @Deprecated public boolean isHeading();
method public boolean isSelected();
method public static android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo obtain(int, int, int, int, boolean);
method public static android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo obtain(int, int, int, int, boolean, boolean);
@@ -51771,20 +52064,20 @@ package android.view.accessibility {
}
public static final class AccessibilityNodeInfo.TouchDelegateInfo implements android.os.Parcelable {
- ctor public AccessibilityNodeInfo.TouchDelegateInfo(java.util.Map<android.graphics.Region, android.view.View>);
+ ctor public AccessibilityNodeInfo.TouchDelegateInfo(@NonNull java.util.Map<android.graphics.Region,android.view.View>);
method public int describeContents();
- method public android.graphics.Region getRegionAt(int);
+ method @NonNull public android.graphics.Region getRegionAt(int);
method public int getRegionCount();
- method public android.view.accessibility.AccessibilityNodeInfo getTargetForRegion(android.graphics.Region);
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getTargetForRegion(@NonNull android.graphics.Region);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo> CREATOR;
}
public abstract class AccessibilityNodeProvider {
ctor public AccessibilityNodeProvider();
- method public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
+ method public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, String, android.os.Bundle);
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
- method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
+ method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String, int);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public boolean performAction(int, int, android.os.Bundle);
field public static final int HOST_VIEW_ID = -1; // 0xffffffff
@@ -51792,9 +52085,9 @@ package android.view.accessibility {
public class AccessibilityRecord {
method public int getAddedCount();
- method public java.lang.CharSequence getBeforeText();
- method public java.lang.CharSequence getClassName();
- method public java.lang.CharSequence getContentDescription();
+ method public CharSequence getBeforeText();
+ method public CharSequence getClassName();
+ method public CharSequence getContentDescription();
method public int getCurrentItemIndex();
method public int getFromIndex();
method public int getItemCount();
@@ -51819,10 +52112,10 @@ package android.view.accessibility {
method public static android.view.accessibility.AccessibilityRecord obtain();
method public void recycle();
method public void setAddedCount(int);
- method public void setBeforeText(java.lang.CharSequence);
+ method public void setBeforeText(CharSequence);
method public void setChecked(boolean);
- method public void setClassName(java.lang.CharSequence);
- method public void setContentDescription(java.lang.CharSequence);
+ method public void setClassName(CharSequence);
+ method public void setContentDescription(CharSequence);
method public void setCurrentItemIndex(int);
method public void setEnabled(boolean);
method public void setFromIndex(int);
@@ -51839,14 +52132,14 @@ package android.view.accessibility {
method public void setScrollY(int);
method public void setScrollable(boolean);
method public void setSource(android.view.View);
- method public void setSource(android.view.View, int);
+ method public void setSource(@Nullable android.view.View, int);
method public void setToIndex(int);
}
public abstract class AccessibilityRequestPreparer {
ctor public AccessibilityRequestPreparer(android.view.View, int);
- method public android.view.View getView();
- method public abstract void onPrepareExtraData(int, java.lang.String, android.os.Bundle, android.os.Message);
+ method @Nullable public android.view.View getView();
+ method public abstract void onPrepareExtraData(int, String, android.os.Bundle, android.os.Message);
field public static final int REQUEST_TYPE_EXTRA_DATA = 1; // 0x1
}
@@ -51860,7 +52153,7 @@ package android.view.accessibility {
method public int getLayer();
method public android.view.accessibility.AccessibilityWindowInfo getParent();
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
- method public java.lang.CharSequence getTitle();
+ method @Nullable public CharSequence getTitle();
method public int getType();
method public boolean isAccessibilityFocused();
method public boolean isActive();
@@ -51879,16 +52172,16 @@ package android.view.accessibility {
}
public class CaptioningManager {
- method public void addCaptioningChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
+ method public void addCaptioningChangeListener(@NonNull android.view.accessibility.CaptioningManager.CaptioningChangeListener);
method public final float getFontScale();
- method public final java.util.Locale getLocale();
- method public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle();
+ method @Nullable public final java.util.Locale getLocale();
+ method @NonNull public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle();
method public final boolean isEnabled();
- method public void removeCaptioningChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
+ method public void removeCaptioningChangeListener(@NonNull android.view.accessibility.CaptioningManager.CaptioningChangeListener);
}
public static final class CaptioningManager.CaptionStyle {
- method public android.graphics.Typeface getTypeface();
+ method @Nullable public android.graphics.Typeface getTypeface();
method public boolean hasBackgroundColor();
method public boolean hasEdgeColor();
method public boolean hasEdgeType();
@@ -51907,12 +52200,12 @@ package android.view.accessibility {
field public final int windowColor;
}
- public static abstract class CaptioningManager.CaptioningChangeListener {
+ public abstract static class CaptioningManager.CaptioningChangeListener {
ctor public CaptioningManager.CaptioningChangeListener();
method public void onEnabledChanged(boolean);
method public void onFontScaleChanged(float);
- method public void onLocaleChanged(java.util.Locale);
- method public void onUserStyleChanged(android.view.accessibility.CaptioningManager.CaptionStyle);
+ method public void onLocaleChanged(@Nullable java.util.Locale);
+ method public void onUserStyleChanged(@NonNull android.view.accessibility.CaptioningManager.CaptionStyle);
}
}
@@ -51946,8 +52239,8 @@ package android.view.animation {
method protected android.view.animation.Animation clone() throws java.lang.CloneNotSupportedException;
method public long computeDurationHint();
method protected void ensureInterpolator();
- method public int getBackgroundColor();
- method public deprecated boolean getDetachWallpaper();
+ method @ColorInt public int getBackgroundColor();
+ method @Deprecated public boolean getDetachWallpaper();
method public long getDuration();
method public boolean getFillAfter();
method public boolean getFillBefore();
@@ -51971,13 +52264,13 @@ package android.view.animation {
method public void restrictDuration(long);
method public void scaleCurrentDuration(float);
method public void setAnimationListener(android.view.animation.Animation.AnimationListener);
- method public void setBackgroundColor(int);
- method public deprecated void setDetachWallpaper(boolean);
+ method public void setBackgroundColor(@ColorInt int);
+ method @Deprecated public void setDetachWallpaper(boolean);
method public void setDuration(long);
method public void setFillAfter(boolean);
method public void setFillBefore(boolean);
method public void setFillEnabled(boolean);
- method public void setInterpolator(android.content.Context, int);
+ method public void setInterpolator(android.content.Context, @AnimRes @InterpolatorRes int);
method public void setInterpolator(android.view.animation.Interpolator);
method public void setRepeatCount(int);
method public void setRepeatMode(int);
@@ -52000,10 +52293,10 @@ package android.view.animation {
field public static final int ZORDER_TOP = 1; // 0x1
}
- public static abstract interface Animation.AnimationListener {
- method public abstract void onAnimationEnd(android.view.animation.Animation);
- method public abstract void onAnimationRepeat(android.view.animation.Animation);
- method public abstract void onAnimationStart(android.view.animation.Animation);
+ public static interface Animation.AnimationListener {
+ method public void onAnimationEnd(android.view.animation.Animation);
+ method public void onAnimationRepeat(android.view.animation.Animation);
+ method public void onAnimationStart(android.view.animation.Animation);
}
protected static class Animation.Description {
@@ -52023,9 +52316,9 @@ package android.view.animation {
public class AnimationUtils {
ctor public AnimationUtils();
method public static long currentAnimationTimeMillis();
- method public static android.view.animation.Animation loadAnimation(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
- method public static android.view.animation.Interpolator loadInterpolator(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
- method public static android.view.animation.LayoutAnimationController loadLayoutAnimation(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+ method public static android.view.animation.Animation loadAnimation(android.content.Context, @AnimRes int) throws android.content.res.Resources.NotFoundException;
+ method public static android.view.animation.Interpolator loadInterpolator(android.content.Context, @AnimRes @InterpolatorRes int) throws android.content.res.Resources.NotFoundException;
+ method public static android.view.animation.LayoutAnimationController loadLayoutAnimation(android.content.Context, @AnimRes int) throws android.content.res.Resources.NotFoundException;
method public static android.view.animation.Animation makeInAnimation(android.content.Context, boolean);
method public static android.view.animation.Animation makeInChildBottomAnimation(android.content.Context);
method public static android.view.animation.Animation makeOutAnimation(android.content.Context, boolean);
@@ -52100,7 +52393,7 @@ package android.view.animation {
field public int rowsCount;
}
- public abstract interface Interpolator implements android.animation.TimeInterpolator {
+ public interface Interpolator extends android.animation.TimeInterpolator {
}
public class LayoutAnimationController {
@@ -52115,10 +52408,10 @@ package android.view.animation {
method public int getOrder();
method protected int getTransformedIndex(android.view.animation.LayoutAnimationController.AnimationParameters);
method public boolean isDone();
- method public void setAnimation(android.content.Context, int);
+ method public void setAnimation(android.content.Context, @AnimRes int);
method public void setAnimation(android.view.animation.Animation);
method public void setDelay(float);
- method public void setInterpolator(android.content.Context, int);
+ method public void setInterpolator(android.content.Context, @InterpolatorRes int);
method public void setInterpolator(android.view.animation.Interpolator);
method public void setOrder(int);
method public void start();
@@ -52180,9 +52473,9 @@ package android.view.animation {
method public android.graphics.Matrix getMatrix();
method public int getTransformationType();
method public void set(android.view.animation.Transformation);
- method public void setAlpha(float);
+ method public void setAlpha(@FloatRange(from=0.0, to=1.0) float);
method public void setTransformationType(int);
- method public java.lang.String toShortString();
+ method public String toShortString();
field public static final int TYPE_ALPHA = 1; // 0x1
field public static final int TYPE_BOTH = 3; // 0x3
field public static final int TYPE_IDENTITY = 0; // 0x0
@@ -52212,40 +52505,40 @@ package android.view.autofill {
method public void cancel();
method public void commit();
method public void disableAutofillServices();
- method public android.content.ComponentName getAutofillServiceComponentName();
- method public java.util.List<java.lang.String> getAvailableFieldClassificationAlgorithms();
- method public java.lang.String getDefaultFieldClassificationAlgorithm();
- method public android.view.autofill.AutofillId getNextAutofillId();
- method public android.service.autofill.UserData getUserData();
- method public java.lang.String getUserDataId();
+ method @Nullable public android.content.ComponentName getAutofillServiceComponentName();
+ method @NonNull public java.util.List<java.lang.String> getAvailableFieldClassificationAlgorithms();
+ method @Nullable public String getDefaultFieldClassificationAlgorithm();
+ method @Nullable public android.view.autofill.AutofillId getNextAutofillId();
+ method @Nullable public android.service.autofill.UserData getUserData();
+ method @Nullable public String getUserDataId();
method public boolean hasEnabledAutofillServices();
method public boolean isAutofillSupported();
method public boolean isEnabled();
method public boolean isFieldClassificationEnabled();
method public void notifyValueChanged(android.view.View);
method public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
- method public void notifyViewClicked(android.view.View);
- method public void notifyViewClicked(android.view.View, int);
- method public void notifyViewEntered(android.view.View);
- method public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
- method public void notifyViewExited(android.view.View);
- method public void notifyViewExited(android.view.View, int);
- method public void notifyViewVisibilityChanged(android.view.View, boolean);
- method public void notifyViewVisibilityChanged(android.view.View, int, boolean);
- method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
- method public void requestAutofill(android.view.View);
- method public void requestAutofill(android.view.View, int, android.graphics.Rect);
- method public void setUserData(android.service.autofill.UserData);
- method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
- field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
- field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
- field public static final java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.CLIENT_STATE";
- }
-
- public static abstract class AutofillManager.AutofillCallback {
+ method public void notifyViewClicked(@NonNull android.view.View);
+ method public void notifyViewClicked(@NonNull android.view.View, int);
+ method public void notifyViewEntered(@NonNull android.view.View);
+ method public void notifyViewEntered(@NonNull android.view.View, int, @NonNull android.graphics.Rect);
+ method public void notifyViewExited(@NonNull android.view.View);
+ method public void notifyViewExited(@NonNull android.view.View, int);
+ method public void notifyViewVisibilityChanged(@NonNull android.view.View, boolean);
+ method public void notifyViewVisibilityChanged(@NonNull android.view.View, int, boolean);
+ method public void registerCallback(@Nullable android.view.autofill.AutofillManager.AutofillCallback);
+ method public void requestAutofill(@NonNull android.view.View);
+ method public void requestAutofill(@NonNull android.view.View, int, @NonNull android.graphics.Rect);
+ method public void setUserData(@Nullable android.service.autofill.UserData);
+ method public void unregisterCallback(@Nullable android.view.autofill.AutofillManager.AutofillCallback);
+ field public static final String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
+ field public static final String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
+ field public static final String EXTRA_CLIENT_STATE = "android.view.autofill.extra.CLIENT_STATE";
+ }
+
+ public abstract static class AutofillManager.AutofillCallback {
ctor public AutofillManager.AutofillCallback();
- method public void onAutofillEvent(android.view.View, int);
- method public void onAutofillEvent(android.view.View, int, int);
+ method public void onAutofillEvent(@NonNull android.view.View, int);
+ method public void onAutofillEvent(@NonNull android.view.View, int, int);
field public static final int EVENT_INPUT_HIDDEN = 2; // 0x2
field public static final int EVENT_INPUT_SHOWN = 1; // 0x1
field public static final int EVENT_INPUT_UNAVAILABLE = 3; // 0x3
@@ -52255,11 +52548,11 @@ package android.view.autofill {
method public int describeContents();
method public static android.view.autofill.AutofillValue forDate(long);
method public static android.view.autofill.AutofillValue forList(int);
- method public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutofillValue forText(@Nullable CharSequence);
method public static android.view.autofill.AutofillValue forToggle(boolean);
method public long getDateValue();
method public int getListValue();
- method public java.lang.CharSequence getTextValue();
+ method @NonNull public CharSequence getTextValue();
method public boolean getToggleValue();
method public boolean isDate();
method public boolean isList();
@@ -52282,26 +52575,28 @@ package android.view.contentcapture {
public static final class ContentCaptureContext.Builder {
ctor public ContentCaptureContext.Builder();
method public android.view.contentcapture.ContentCaptureContext build();
- method public android.view.contentcapture.ContentCaptureContext.Builder setExtras(android.os.Bundle);
- method public android.view.contentcapture.ContentCaptureContext.Builder setUri(android.net.Uri);
+ method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setUri(@NonNull android.net.Uri);
}
public final class ContentCaptureManager {
- method public android.content.ComponentName getServiceComponentName();
+ method @Nullable public android.content.ComponentName getServiceComponentName();
method public boolean isContentCaptureEnabled();
- method public void removeUserData(android.view.contentcapture.UserDataRemovalRequest);
+ method public void removeUserData(@NonNull android.view.contentcapture.UserDataRemovalRequest);
method public void setContentCaptureEnabled(boolean);
}
public abstract class ContentCaptureSession implements java.lang.AutoCloseable {
method public void close();
- method public final android.view.contentcapture.ContentCaptureSession createContentCaptureSession(android.view.contentcapture.ContentCaptureContext);
+ method @NonNull public final android.view.contentcapture.ContentCaptureSession createContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext);
method public final void destroy();
method public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId();
- method public final void notifyViewAppeared(android.view.ViewStructure);
- method public final void notifyViewDisappeared(android.view.autofill.AutofillId);
- method public final void notifyViewTextChanged(android.view.autofill.AutofillId, java.lang.CharSequence, int);
- field public static final int FLAG_USER_INPUT = 1; // 0x1
+ method @NonNull public android.view.autofill.AutofillId newAutofillId(@NonNull android.view.autofill.AutofillId, int);
+ method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, int);
+ method public final void notifyViewAppeared(@NonNull android.view.ViewStructure);
+ method public final void notifyViewDisappeared(@NonNull android.view.autofill.AutofillId);
+ method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence, int);
+ method public final void notifyViewsDisappeared(@NonNull android.view.autofill.AutofillId, @NonNull int[]);
}
public final class ContentCaptureSessionId implements android.os.Parcelable {
@@ -52318,9 +52613,9 @@ package android.view.contentcapture {
public static final class UserDataRemovalRequest.Builder {
ctor public UserDataRemovalRequest.Builder();
- method public android.view.contentcapture.UserDataRemovalRequest.Builder addUri(android.net.Uri, boolean);
- method public android.view.contentcapture.UserDataRemovalRequest build();
- method public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
+ method public android.view.contentcapture.UserDataRemovalRequest.Builder addUri(@NonNull android.net.Uri, boolean);
+ method @NonNull public android.view.contentcapture.UserDataRemovalRequest build();
+ method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
}
}
@@ -52331,11 +52626,11 @@ package android.view.inputmethod {
ctor public BaseInputConnection(android.view.View, boolean);
method public boolean beginBatchEdit();
method public boolean clearMetaKeyStates(int);
- method public void closeConnection();
+ method @CallSuper public void closeConnection();
method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
method public boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
method public boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
- method public boolean commitText(java.lang.CharSequence, int);
+ method public boolean commitText(CharSequence, int);
method public boolean deleteSurroundingText(int, int);
method public boolean deleteSurroundingTextInCodePoints(int, int);
method public boolean endBatchEdit();
@@ -52346,40 +52641,40 @@ package android.view.inputmethod {
method public android.text.Editable getEditable();
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
- method public java.lang.CharSequence getSelectedText(int);
- method public java.lang.CharSequence getTextAfterCursor(int, int);
- method public java.lang.CharSequence getTextBeforeCursor(int, int);
+ method public CharSequence getSelectedText(int);
+ method public CharSequence getTextAfterCursor(int, int);
+ method public CharSequence getTextBeforeCursor(int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
- method public boolean performPrivateCommand(java.lang.String, android.os.Bundle);
+ method public boolean performPrivateCommand(String, android.os.Bundle);
method public static final void removeComposingSpans(android.text.Spannable);
method public boolean reportFullscreenMode(boolean);
method public boolean requestCursorUpdates(int);
method public boolean sendKeyEvent(android.view.KeyEvent);
method public boolean setComposingRegion(int, int);
method public static void setComposingSpans(android.text.Spannable);
- method public boolean setComposingText(java.lang.CharSequence, int);
+ method public boolean setComposingText(CharSequence, int);
method public boolean setSelection(int, int);
}
public final class CompletionInfo implements android.os.Parcelable {
- ctor public CompletionInfo(long, int, java.lang.CharSequence);
- ctor public CompletionInfo(long, int, java.lang.CharSequence, java.lang.CharSequence);
+ ctor public CompletionInfo(long, int, CharSequence);
+ ctor public CompletionInfo(long, int, CharSequence, CharSequence);
method public int describeContents();
method public long getId();
- method public java.lang.CharSequence getLabel();
+ method public CharSequence getLabel();
method public int getPosition();
- method public java.lang.CharSequence getText();
+ method public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.inputmethod.CompletionInfo> CREATOR;
}
public final class CorrectionInfo implements android.os.Parcelable {
- ctor public CorrectionInfo(int, java.lang.CharSequence, java.lang.CharSequence);
+ ctor public CorrectionInfo(int, CharSequence, CharSequence);
method public int describeContents();
- method public java.lang.CharSequence getNewText();
+ method public CharSequence getNewText();
method public int getOffset();
- method public java.lang.CharSequence getOldText();
+ method public CharSequence getOldText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.inputmethod.CorrectionInfo> CREATOR;
}
@@ -52389,7 +52684,7 @@ package android.view.inputmethod {
method public int describeContents();
method public android.graphics.RectF getCharacterBounds(int);
method public int getCharacterBoundsFlags(int);
- method public java.lang.CharSequence getComposingText();
+ method public CharSequence getComposingText();
method public int getComposingTextStart();
method public float getInsertionMarkerBaseline();
method public float getInsertionMarkerBottom();
@@ -52411,7 +52706,7 @@ package android.view.inputmethod {
method public android.view.inputmethod.CursorAnchorInfo.Builder addCharacterBounds(int, float, float, float, float, int);
method public android.view.inputmethod.CursorAnchorInfo build();
method public void reset();
- method public android.view.inputmethod.CursorAnchorInfo.Builder setComposingText(int, java.lang.CharSequence);
+ method public android.view.inputmethod.CursorAnchorInfo.Builder setComposingText(int, CharSequence);
method public android.view.inputmethod.CursorAnchorInfo.Builder setInsertionMarkerLocation(float, float, float, float, int);
method public android.view.inputmethod.CursorAnchorInfo.Builder setMatrix(android.graphics.Matrix);
method public android.view.inputmethod.CursorAnchorInfo.Builder setSelectionRange(int, int);
@@ -52420,7 +52715,7 @@ package android.view.inputmethod {
public class EditorInfo implements android.text.InputType android.os.Parcelable {
ctor public EditorInfo();
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public final void makeCompatible(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.inputmethod.EditorInfo> CREATOR;
@@ -52443,21 +52738,21 @@ package android.view.inputmethod {
field public static final int IME_MASK_ACTION = 255; // 0xff
field public static final int IME_NULL = 0; // 0x0
field public int actionId;
- field public java.lang.CharSequence actionLabel;
- field public java.lang.String[] contentMimeTypes;
+ field public CharSequence actionLabel;
+ field @Nullable public String[] contentMimeTypes;
field public android.os.Bundle extras;
field public int fieldId;
- field public java.lang.String fieldName;
- field public android.os.LocaleList hintLocales;
- field public java.lang.CharSequence hintText;
+ field public String fieldName;
+ field @Nullable public android.os.LocaleList hintLocales;
+ field public CharSequence hintText;
field public int imeOptions;
field public int initialCapsMode;
field public int initialSelEnd;
field public int initialSelStart;
field public int inputType;
- field public java.lang.CharSequence label;
- field public java.lang.String packageName;
- field public java.lang.String privateImeOptions;
+ field public CharSequence label;
+ field public String packageName;
+ field public String privateImeOptions;
}
public class ExtractedText implements android.os.Parcelable {
@@ -52468,13 +52763,13 @@ package android.view.inputmethod {
field public static final int FLAG_SELECTING = 2; // 0x2
field public static final int FLAG_SINGLE_LINE = 1; // 0x1
field public int flags;
- field public java.lang.CharSequence hint;
+ field public CharSequence hint;
field public int partialEndOffset;
field public int partialStartOffset;
field public int selectionEnd;
field public int selectionStart;
field public int startOffset;
- field public java.lang.CharSequence text;
+ field public CharSequence text;
}
public class ExtractedTextRequest implements android.os.Parcelable {
@@ -52500,33 +52795,33 @@ package android.view.inputmethod {
field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputBinding> CREATOR;
}
- public abstract interface InputConnection {
- method public abstract boolean beginBatchEdit();
- method public abstract boolean clearMetaKeyStates(int);
- method public abstract void closeConnection();
- method public abstract boolean commitCompletion(android.view.inputmethod.CompletionInfo);
- method public abstract boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
- method public abstract boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
- method public abstract boolean commitText(java.lang.CharSequence, int);
- method public abstract boolean deleteSurroundingText(int, int);
- method public abstract boolean deleteSurroundingTextInCodePoints(int, int);
- method public abstract boolean endBatchEdit();
- method public abstract boolean finishComposingText();
- method public abstract int getCursorCapsMode(int);
- method public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
- method public abstract android.os.Handler getHandler();
- method public abstract java.lang.CharSequence getSelectedText(int);
- method public abstract java.lang.CharSequence getTextAfterCursor(int, int);
- method public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
- method public abstract boolean performContextMenuAction(int);
- method public abstract boolean performEditorAction(int);
- method public abstract boolean performPrivateCommand(java.lang.String, android.os.Bundle);
- method public abstract boolean reportFullscreenMode(boolean);
- method public abstract boolean requestCursorUpdates(int);
- method public abstract boolean sendKeyEvent(android.view.KeyEvent);
- method public abstract boolean setComposingRegion(int, int);
- method public abstract boolean setComposingText(java.lang.CharSequence, int);
- method public abstract boolean setSelection(int, int);
+ public interface InputConnection {
+ method public boolean beginBatchEdit();
+ method public boolean clearMetaKeyStates(int);
+ method public void closeConnection();
+ method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
+ method public boolean commitContent(@NonNull android.view.inputmethod.InputContentInfo, int, @Nullable android.os.Bundle);
+ method public boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
+ method public boolean commitText(CharSequence, int);
+ method public boolean deleteSurroundingText(int, int);
+ method public boolean deleteSurroundingTextInCodePoints(int, int);
+ method public boolean endBatchEdit();
+ method public boolean finishComposingText();
+ method public int getCursorCapsMode(int);
+ method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
+ method public android.os.Handler getHandler();
+ method public CharSequence getSelectedText(int);
+ method public CharSequence getTextAfterCursor(int, int);
+ method public CharSequence getTextBeforeCursor(int, int);
+ method public boolean performContextMenuAction(int);
+ method public boolean performEditorAction(int);
+ method public boolean performPrivateCommand(String, android.os.Bundle);
+ method public boolean reportFullscreenMode(boolean);
+ method public boolean requestCursorUpdates(int);
+ method public boolean sendKeyEvent(android.view.KeyEvent);
+ method public boolean setComposingRegion(int, int);
+ method public boolean setComposingText(CharSequence, int);
+ method public boolean setSelection(int, int);
field public static final int CURSOR_UPDATE_IMMEDIATE = 1; // 0x1
field public static final int CURSOR_UPDATE_MONITOR = 2; // 0x2
field public static final int GET_EXTRACTED_TEXT_MONITOR = 1; // 0x1
@@ -52542,7 +52837,7 @@ package android.view.inputmethod {
method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
method public boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
method public boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
- method public boolean commitText(java.lang.CharSequence, int);
+ method public boolean commitText(CharSequence, int);
method public boolean deleteSurroundingText(int, int);
method public boolean deleteSurroundingTextInCodePoints(int, int);
method public boolean endBatchEdit();
@@ -52550,112 +52845,112 @@ package android.view.inputmethod {
method public int getCursorCapsMode(int);
method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
method public android.os.Handler getHandler();
- method public java.lang.CharSequence getSelectedText(int);
- method public java.lang.CharSequence getTextAfterCursor(int, int);
- method public java.lang.CharSequence getTextBeforeCursor(int, int);
+ method public CharSequence getSelectedText(int);
+ method public CharSequence getTextAfterCursor(int, int);
+ method public CharSequence getTextBeforeCursor(int, int);
method public boolean performContextMenuAction(int);
method public boolean performEditorAction(int);
- method public boolean performPrivateCommand(java.lang.String, android.os.Bundle);
+ method public boolean performPrivateCommand(String, android.os.Bundle);
method public boolean reportFullscreenMode(boolean);
method public boolean requestCursorUpdates(int);
method public boolean sendKeyEvent(android.view.KeyEvent);
method public boolean setComposingRegion(int, int);
- method public boolean setComposingText(java.lang.CharSequence, int);
+ method public boolean setComposingText(CharSequence, int);
method public boolean setSelection(int, int);
method public void setTarget(android.view.inputmethod.InputConnection);
}
public final class InputContentInfo implements android.os.Parcelable {
- ctor public InputContentInfo(android.net.Uri, android.content.ClipDescription);
- ctor public InputContentInfo(android.net.Uri, android.content.ClipDescription, android.net.Uri);
+ ctor public InputContentInfo(@NonNull android.net.Uri, @NonNull android.content.ClipDescription);
+ ctor public InputContentInfo(@NonNull android.net.Uri, @NonNull android.content.ClipDescription, @Nullable android.net.Uri);
method public int describeContents();
- method public android.net.Uri getContentUri();
- method public android.content.ClipDescription getDescription();
- method public android.net.Uri getLinkUri();
+ method @NonNull public android.net.Uri getContentUri();
+ method @NonNull public android.content.ClipDescription getDescription();
+ method @Nullable public android.net.Uri getLinkUri();
method public void releasePermission();
method public void requestPermission();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputContentInfo> CREATOR;
}
- public abstract interface InputMethod {
- method public abstract void attachToken(android.os.IBinder);
- method public abstract void bindInput(android.view.inputmethod.InputBinding);
- method public abstract void changeInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
- method public abstract void createSession(android.view.inputmethod.InputMethod.SessionCallback);
- method public abstract void hideSoftInput(int, android.os.ResultReceiver);
- method public abstract void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
- method public abstract void revokeSession(android.view.inputmethod.InputMethodSession);
- method public abstract void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
- method public abstract void showSoftInput(int, android.os.ResultReceiver);
- method public abstract void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
- method public abstract void unbindInput();
- field public static final java.lang.String SERVICE_INTERFACE = "android.view.InputMethod";
- field public static final java.lang.String SERVICE_META_DATA = "android.view.im";
+ public interface InputMethod {
+ method @MainThread public void attachToken(android.os.IBinder);
+ method @MainThread public void bindInput(android.view.inputmethod.InputBinding);
+ method @MainThread public void changeInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
+ method @MainThread public void createSession(android.view.inputmethod.InputMethod.SessionCallback);
+ method @MainThread public void hideSoftInput(int, android.os.ResultReceiver);
+ method @MainThread public void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ method @MainThread public void revokeSession(android.view.inputmethod.InputMethodSession);
+ method @MainThread public void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
+ method @MainThread public void showSoftInput(int, android.os.ResultReceiver);
+ method @MainThread public void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ method @MainThread public void unbindInput();
+ field public static final String SERVICE_INTERFACE = "android.view.InputMethod";
+ field public static final String SERVICE_META_DATA = "android.view.im";
field public static final int SHOW_EXPLICIT = 1; // 0x1
field public static final int SHOW_FORCED = 2; // 0x2
}
- public static abstract interface InputMethod.SessionCallback {
- method public abstract void sessionCreated(android.view.inputmethod.InputMethodSession);
+ public static interface InputMethod.SessionCallback {
+ method public void sessionCreated(android.view.inputmethod.InputMethodSession);
}
public final class InputMethodInfo implements android.os.Parcelable {
ctor public InputMethodInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- ctor public InputMethodInfo(java.lang.String, java.lang.String, java.lang.CharSequence, java.lang.String);
+ ctor public InputMethodInfo(String, String, CharSequence, String);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
+ method public void dump(android.util.Printer, String);
method public android.content.ComponentName getComponent();
- method public java.lang.String getId();
+ method public String getId();
method public int getIsDefaultResourceId();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public android.content.pm.ServiceInfo getServiceInfo();
- method public java.lang.String getServiceName();
- method public java.lang.String getSettingsActivity();
+ method public String getServiceName();
+ method public String getSettingsActivity();
method public android.view.inputmethod.InputMethodSubtype getSubtypeAt(int);
method public int getSubtypeCount();
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodInfo> CREATOR;
}
public final class InputMethodManager {
- method public void dispatchKeyEventFromInputMethod(android.view.View, android.view.KeyEvent);
+ method public void dispatchKeyEventFromInputMethod(@Nullable android.view.View, @NonNull android.view.KeyEvent);
method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
method public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype();
method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
method public java.util.List<android.view.inputmethod.InputMethodSubtype> getEnabledInputMethodSubtypeList(android.view.inputmethod.InputMethodInfo, boolean);
method public java.util.List<android.view.inputmethod.InputMethodInfo> getInputMethodList();
method public android.view.inputmethod.InputMethodSubtype getLastInputMethodSubtype();
- method public java.util.Map<android.view.inputmethod.InputMethodInfo, java.util.List<android.view.inputmethod.InputMethodSubtype>> getShortcutInputMethodsAndSubtypes();
- method public deprecated void hideSoftInputFromInputMethod(android.os.IBinder, int);
+ method public java.util.Map<android.view.inputmethod.InputMethodInfo,java.util.List<android.view.inputmethod.InputMethodSubtype>> getShortcutInputMethodsAndSubtypes();
+ method @Deprecated public void hideSoftInputFromInputMethod(android.os.IBinder, int);
method public boolean hideSoftInputFromWindow(android.os.IBinder, int);
method public boolean hideSoftInputFromWindow(android.os.IBinder, int, android.os.ResultReceiver);
- method public deprecated void hideStatusIcon(android.os.IBinder);
+ method @Deprecated public void hideStatusIcon(android.os.IBinder);
method public boolean isAcceptingText();
method public boolean isActive(android.view.View);
method public boolean isActive();
method public boolean isFullscreenMode();
- method public deprecated boolean isWatchingCursor(android.view.View);
+ method @Deprecated public boolean isWatchingCursor(android.view.View);
method public void restartInput(android.view.View);
- method public void sendAppPrivateCommand(android.view.View, java.lang.String, android.os.Bundle);
- method public void setAdditionalInputMethodSubtypes(java.lang.String, android.view.inputmethod.InputMethodSubtype[]);
- method public boolean setCurrentInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
- method public deprecated void setInputMethod(android.os.IBinder, java.lang.String);
- method public deprecated void setInputMethodAndSubtype(android.os.IBinder, java.lang.String, android.view.inputmethod.InputMethodSubtype);
- method public deprecated boolean shouldOfferSwitchingToNextInputMethod(android.os.IBinder);
- method public void showInputMethodAndSubtypeEnabler(java.lang.String);
+ method public void sendAppPrivateCommand(android.view.View, String, android.os.Bundle);
+ method public void setAdditionalInputMethodSubtypes(String, android.view.inputmethod.InputMethodSubtype[]);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setCurrentInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
+ method @Deprecated public void setInputMethod(android.os.IBinder, String);
+ method @Deprecated public void setInputMethodAndSubtype(@NonNull android.os.IBinder, String, android.view.inputmethod.InputMethodSubtype);
+ method @Deprecated public boolean shouldOfferSwitchingToNextInputMethod(android.os.IBinder);
+ method public void showInputMethodAndSubtypeEnabler(String);
method public void showInputMethodPicker();
method public boolean showSoftInput(android.view.View, int);
method public boolean showSoftInput(android.view.View, int, android.os.ResultReceiver);
- method public deprecated void showSoftInputFromInputMethod(android.os.IBinder, int);
- method public deprecated void showStatusIcon(android.os.IBinder, java.lang.String, int);
- method public deprecated boolean switchToLastInputMethod(android.os.IBinder);
- method public deprecated boolean switchToNextInputMethod(android.os.IBinder, boolean);
+ method @Deprecated public void showSoftInputFromInputMethod(android.os.IBinder, int);
+ method @Deprecated public void showStatusIcon(android.os.IBinder, String, @DrawableRes int);
+ method @Deprecated public boolean switchToLastInputMethod(android.os.IBinder);
+ method @Deprecated public boolean switchToNextInputMethod(android.os.IBinder, boolean);
method public void toggleSoftInput(int, int);
method public void toggleSoftInputFromWindow(android.os.IBinder, int, int);
- method public deprecated void updateCursor(android.view.View, int, int, int, int);
+ method @Deprecated public void updateCursor(android.view.View, int, int, int, int);
method public void updateCursorAnchorInfo(android.view.View, android.view.inputmethod.CursorAnchorInfo);
method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
method public void updateSelection(android.view.View, int, int, int, int);
@@ -52670,37 +52965,37 @@ package android.view.inputmethod {
field public static final int SHOW_IMPLICIT = 1; // 0x1
}
- public abstract interface InputMethodSession {
- method public abstract void appPrivateCommand(java.lang.String, android.os.Bundle);
- method public abstract void dispatchGenericMotionEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
- method public abstract void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
- method public abstract void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
- method public abstract void displayCompletions(android.view.inputmethod.CompletionInfo[]);
- method public abstract void finishInput();
- method public abstract void toggleSoftInput(int, int);
- method public abstract void updateCursor(android.graphics.Rect);
- method public abstract void updateCursorAnchorInfo(android.view.inputmethod.CursorAnchorInfo);
- method public abstract void updateExtractedText(int, android.view.inputmethod.ExtractedText);
- method public abstract void updateSelection(int, int, int, int, int, int);
- method public abstract void viewClicked(boolean);
+ public interface InputMethodSession {
+ method public void appPrivateCommand(String, android.os.Bundle);
+ method public void dispatchGenericMotionEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
+ method public void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
+ method public void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
+ method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+ method public void finishInput();
+ method public void toggleSoftInput(int, int);
+ method public void updateCursor(android.graphics.Rect);
+ method public void updateCursorAnchorInfo(android.view.inputmethod.CursorAnchorInfo);
+ method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
+ method public void updateSelection(int, int, int, int, int, int);
+ method public void viewClicked(boolean);
}
- public static abstract interface InputMethodSession.EventCallback {
- method public abstract void finishedEvent(int, boolean);
+ public static interface InputMethodSession.EventCallback {
+ method public void finishedEvent(int, boolean);
}
public final class InputMethodSubtype implements android.os.Parcelable {
- ctor public deprecated InputMethodSubtype(int, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean);
- ctor public deprecated InputMethodSubtype(int, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean, int);
- method public boolean containsExtraValueKey(java.lang.String);
+ ctor @Deprecated public InputMethodSubtype(int, int, String, String, String, boolean, boolean);
+ ctor @Deprecated public InputMethodSubtype(int, int, String, String, String, boolean, boolean, int);
+ method public boolean containsExtraValueKey(String);
method public int describeContents();
- method public java.lang.CharSequence getDisplayName(android.content.Context, java.lang.String, android.content.pm.ApplicationInfo);
- method public java.lang.String getExtraValue();
- method public java.lang.String getExtraValueOf(java.lang.String);
+ method @NonNull public CharSequence getDisplayName(android.content.Context, String, android.content.pm.ApplicationInfo);
+ method public String getExtraValue();
+ method public String getExtraValueOf(String);
method public int getIconResId();
- method public java.lang.String getLanguageTag();
- method public deprecated java.lang.String getLocale();
- method public java.lang.String getMode();
+ method @NonNull public String getLanguageTag();
+ method @Deprecated @NonNull public String getLocale();
+ method public String getMode();
method public int getNameResId();
method public boolean isAsciiCapable();
method public boolean isAuxiliary();
@@ -52714,13 +53009,13 @@ package android.view.inputmethod {
method public android.view.inputmethod.InputMethodSubtype build();
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setIsAsciiCapable(boolean);
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setIsAuxiliary(boolean);
- method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setLanguageTag(java.lang.String);
+ method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setLanguageTag(String);
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setOverridesImplicitlyEnabledSubtype(boolean);
- method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeExtraValue(java.lang.String);
+ method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeExtraValue(String);
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeIconResId(int);
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeId(int);
- method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeLocale(java.lang.String);
- method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeMode(java.lang.String);
+ method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeLocale(String);
+ method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeMode(String);
method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeNameResId(int);
}
@@ -52728,133 +53023,119 @@ package android.view.inputmethod {
package android.view.inspector {
- public abstract interface InspectionCompanion<T> {
- method public default java.lang.String getNodeName();
- method public abstract void mapProperties(android.view.inspector.PropertyMapper);
- method public abstract void readProperties(T, android.view.inspector.PropertyReader);
+ public interface InspectionCompanion<T> {
+ method @Nullable public default String getNodeName();
+ method public void mapProperties(@NonNull android.view.inspector.PropertyMapper);
+ method public void readProperties(@NonNull T, @NonNull android.view.inspector.PropertyReader);
}
public static class InspectionCompanion.UninitializedPropertyMapException extends java.lang.RuntimeException {
ctor public InspectionCompanion.UninitializedPropertyMapException();
}
- public final class IntEnumMapping {
- method public java.lang.String nameOf(int);
- }
-
- public static final class IntEnumMapping.Builder {
- ctor public IntEnumMapping.Builder();
- method public android.view.inspector.IntEnumMapping.Builder addValue(java.lang.String, int);
- method public android.view.inspector.IntEnumMapping build();
- method public void clear();
- }
-
public final class IntFlagMapping {
- method public java.lang.String[] namesOf(int);
+ method @NonNull public java.util.Set<java.lang.String> get(int);
}
public static final class IntFlagMapping.Builder {
ctor public IntFlagMapping.Builder();
- method public android.view.inspector.IntFlagMapping.Builder addFlag(java.lang.String, int);
- method public android.view.inspector.IntFlagMapping.Builder addFlag(java.lang.String, int, int);
- method public android.view.inspector.IntFlagMapping build();
- method public void clear();
- }
-
- public abstract interface PropertyMapper {
- method public abstract int mapBoolean(java.lang.String, int);
- method public abstract int mapByte(java.lang.String, int);
- method public abstract int mapChar(java.lang.String, int);
- method public abstract int mapColor(java.lang.String, int);
- method public abstract int mapDouble(java.lang.String, int);
- method public abstract int mapFloat(java.lang.String, int);
- method public abstract int mapGravity(java.lang.String, int);
- method public abstract int mapInt(java.lang.String, int);
- method public abstract int mapIntEnum(java.lang.String, int, android.view.inspector.IntEnumMapping);
- method public abstract int mapIntFlag(java.lang.String, int, android.view.inspector.IntFlagMapping);
- method public abstract int mapLong(java.lang.String, int);
- method public abstract int mapObject(java.lang.String, int);
- method public abstract int mapShort(java.lang.String, int);
+ method @NonNull public android.view.inspector.IntFlagMapping.Builder addFlag(@NonNull String, int);
+ method @NonNull public android.view.inspector.IntFlagMapping.Builder addFlag(@NonNull String, int, int);
+ method @NonNull public android.view.inspector.IntFlagMapping build();
+ }
+
+ public interface PropertyMapper {
+ method public int mapBoolean(@NonNull String, @AttrRes int);
+ method public int mapByte(@NonNull String, @AttrRes int);
+ method public int mapChar(@NonNull String, @AttrRes int);
+ method public int mapColor(@NonNull String, @AttrRes int);
+ method public int mapDouble(@NonNull String, @AttrRes int);
+ method public int mapFloat(@NonNull String, @AttrRes int);
+ method public int mapGravity(@NonNull String, @AttrRes int);
+ method public int mapInt(@NonNull String, @AttrRes int);
+ method public int mapIntEnum(@NonNull String, @AttrRes int, @NonNull android.util.SparseArray<java.lang.String>);
+ method public int mapIntFlag(@NonNull String, @AttrRes int, @NonNull android.view.inspector.IntFlagMapping);
+ method public int mapLong(@NonNull String, @AttrRes int);
+ method public int mapObject(@NonNull String, @AttrRes int);
+ method public int mapShort(@NonNull String, @AttrRes int);
}
public static class PropertyMapper.PropertyConflictException extends java.lang.RuntimeException {
- ctor public PropertyMapper.PropertyConflictException(java.lang.String, java.lang.String, java.lang.String);
- }
-
- public abstract interface PropertyReader {
- method public abstract void readBoolean(int, boolean);
- method public abstract void readByte(int, byte);
- method public abstract void readChar(int, char);
- method public abstract void readColor(int, int);
- method public abstract void readColor(int, long);
- method public abstract void readColor(int, android.graphics.Color);
- method public abstract void readDouble(int, double);
- method public abstract void readFloat(int, float);
- method public abstract void readGravity(int, int);
- method public abstract void readInt(int, int);
- method public abstract void readIntEnum(int, int);
- method public abstract void readIntFlag(int, int);
- method public abstract void readLong(int, long);
- method public abstract void readObject(int, java.lang.Object);
- method public abstract void readShort(int, short);
+ ctor public PropertyMapper.PropertyConflictException(@NonNull String, @NonNull String, @NonNull String);
+ }
+
+ public interface PropertyReader {
+ method public void readBoolean(int, boolean);
+ method public void readByte(int, byte);
+ method public void readChar(int, char);
+ method public void readColor(int, @ColorInt int);
+ method public void readColor(int, @ColorLong long);
+ method public void readColor(int, @Nullable android.graphics.Color);
+ method public void readDouble(int, double);
+ method public void readFloat(int, float);
+ method public void readGravity(int, int);
+ method public void readInt(int, int);
+ method public void readIntEnum(int, int);
+ method public void readIntFlag(int, int);
+ method public void readLong(int, long);
+ method public void readObject(int, @Nullable Object);
+ method public void readShort(int, short);
}
public static class PropertyReader.PropertyTypeMismatchException extends java.lang.RuntimeException {
- ctor public PropertyReader.PropertyTypeMismatchException(int, java.lang.String, java.lang.String, java.lang.String);
- ctor public PropertyReader.PropertyTypeMismatchException(int, java.lang.String, java.lang.String);
+ ctor public PropertyReader.PropertyTypeMismatchException(int, @NonNull String, @NonNull String, @Nullable String);
+ ctor public PropertyReader.PropertyTypeMismatchException(int, @NonNull String, @NonNull String);
}
}
package android.view.textclassifier {
- public final class ConversationActions implements android.os.Parcelable {
- ctor public ConversationActions(java.util.List<android.view.textclassifier.ConversationActions.ConversationAction>, java.lang.String);
- method public int describeContents();
- method public java.util.List<android.view.textclassifier.ConversationActions.ConversationAction> getConversationActions();
- method public java.lang.String getId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions> CREATOR;
- field public static final java.lang.String HINT_FOR_IN_APP = "in_app";
- field public static final java.lang.String HINT_FOR_NOTIFICATION = "notification";
- field public static final java.lang.String TYPE_CALL_PHONE = "call_phone";
- field public static final java.lang.String TYPE_CREATE_REMINDER = "create_reminder";
- field public static final java.lang.String TYPE_OPEN_URL = "open_url";
- field public static final java.lang.String TYPE_SEND_EMAIL = "send_email";
- field public static final java.lang.String TYPE_SEND_SMS = "send_sms";
- field public static final java.lang.String TYPE_SHARE_LOCATION = "share_location";
- field public static final java.lang.String TYPE_TEXT_REPLY = "text_reply";
- field public static final java.lang.String TYPE_TRACK_FLIGHT = "track_flight";
- field public static final java.lang.String TYPE_VIEW_CALENDAR = "view_calendar";
- field public static final java.lang.String TYPE_VIEW_MAP = "view_map";
- }
-
- public static final class ConversationActions.ConversationAction implements android.os.Parcelable {
+ public final class ConversationAction implements android.os.Parcelable {
method public int describeContents();
- method public android.app.RemoteAction getAction();
- method public float getConfidenceScore();
- method public android.os.Bundle getExtras();
- method public java.lang.CharSequence getTextReply();
- method public java.lang.String getType();
+ method @Nullable public android.app.RemoteAction getAction();
+ method @FloatRange(from=0, to=1) public float getConfidenceScore();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public CharSequence getTextReply();
+ method @NonNull public String getType();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.ConversationAction> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationAction> CREATOR;
+ field public static final String TYPE_CALL_PHONE = "call_phone";
+ field public static final String TYPE_CREATE_REMINDER = "create_reminder";
+ field public static final String TYPE_OPEN_URL = "open_url";
+ field public static final String TYPE_SEND_EMAIL = "send_email";
+ field public static final String TYPE_SEND_SMS = "send_sms";
+ field public static final String TYPE_SHARE_LOCATION = "share_location";
+ field public static final String TYPE_TEXT_REPLY = "text_reply";
+ field public static final String TYPE_TRACK_FLIGHT = "track_flight";
+ field public static final String TYPE_VIEW_CALENDAR = "view_calendar";
+ field public static final String TYPE_VIEW_MAP = "view_map";
+ }
+
+ public static final class ConversationAction.Builder {
+ ctor public ConversationAction.Builder(@NonNull String);
+ method @NonNull public android.view.textclassifier.ConversationAction build();
+ method @NonNull public android.view.textclassifier.ConversationAction.Builder setAction(@Nullable android.app.RemoteAction);
+ method @NonNull public android.view.textclassifier.ConversationAction.Builder setConfidenceScore(@FloatRange(from=0, to=1) float);
+ method @NonNull public android.view.textclassifier.ConversationAction.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.ConversationAction.Builder setTextReply(@Nullable CharSequence);
}
- public static final class ConversationActions.ConversationAction.Builder {
- ctor public ConversationActions.ConversationAction.Builder(java.lang.String);
- method public android.view.textclassifier.ConversationActions.ConversationAction build();
- method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setAction(android.app.RemoteAction);
- method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setConfidenceScore(float);
- method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setTextReply(java.lang.CharSequence);
+ public final class ConversationActions implements android.os.Parcelable {
+ ctor public ConversationActions(@NonNull java.util.List<android.view.textclassifier.ConversationAction>, @Nullable String);
+ method public int describeContents();
+ method @NonNull public java.util.List<android.view.textclassifier.ConversationAction> getConversationActions();
+ method @Nullable public String getId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions> CREATOR;
}
public static final class ConversationActions.Message implements android.os.Parcelable {
method public int describeContents();
- method public android.app.Person getAuthor();
- method public android.os.Bundle getExtras();
- method public java.time.ZonedDateTime getReferenceTime();
- method public java.lang.CharSequence getText();
+ method @NonNull public android.app.Person getAuthor();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public java.time.ZonedDateTime getReferenceTime();
+ method @Nullable public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Message> CREATOR;
field public static final android.app.Person PERSON_USER_LOCAL;
@@ -52862,74 +53143,60 @@ package android.view.textclassifier {
}
public static final class ConversationActions.Message.Builder {
- ctor public ConversationActions.Message.Builder(android.app.Person);
- method public android.view.textclassifier.ConversationActions.Message build();
- method public android.view.textclassifier.ConversationActions.Message.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.ConversationActions.Message.Builder setReferenceTime(java.time.ZonedDateTime);
- method public android.view.textclassifier.ConversationActions.Message.Builder setText(java.lang.CharSequence);
+ ctor public ConversationActions.Message.Builder(@NonNull android.app.Person);
+ method @NonNull public android.view.textclassifier.ConversationActions.Message build();
+ method @NonNull public android.view.textclassifier.ConversationActions.Message.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.ConversationActions.Message.Builder setReferenceTime(@Nullable java.time.ZonedDateTime);
+ method @NonNull public android.view.textclassifier.ConversationActions.Message.Builder setText(@Nullable CharSequence);
}
public static final class ConversationActions.Request implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallingPackageName();
- method public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
- method public java.lang.String getConversationId();
- method public java.util.List<java.lang.String> getHints();
- method public int getMaxSuggestions();
- method public android.view.textclassifier.ConversationActions.TypeConfig getTypeConfig();
+ method @Nullable public String getCallingPackageName();
+ method @NonNull public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
+ method @Nullable public String getConversationId();
+ method @Nullable public java.util.List<java.lang.String> getHints();
+ method @IntRange(from=0) public int getMaxSuggestions();
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig getTypeConfig();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Request> CREATOR;
+ field public static final String HINT_FOR_IN_APP = "in_app";
+ field public static final String HINT_FOR_NOTIFICATION = "notification";
}
public static final class ConversationActions.Request.Builder {
- ctor public ConversationActions.Request.Builder(java.util.List<android.view.textclassifier.ConversationActions.Message>);
- method public android.view.textclassifier.ConversationActions.Request build();
- method public android.view.textclassifier.ConversationActions.Request.Builder setConversationId(java.lang.String);
- method public android.view.textclassifier.ConversationActions.Request.Builder setHints(java.util.List<java.lang.String>);
- method public android.view.textclassifier.ConversationActions.Request.Builder setMaxSuggestions(int);
- method public android.view.textclassifier.ConversationActions.Request.Builder setTypeConfig(android.view.textclassifier.ConversationActions.TypeConfig);
- }
-
- public static final class ConversationActions.TypeConfig implements android.os.Parcelable {
- method public int describeContents();
- method public java.util.Collection<java.lang.String> resolveTypes(java.util.Collection<java.lang.String>);
- method public boolean shouldIncludeTypesFromTextClassifier();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.TypeConfig> CREATOR;
- }
-
- public static final class ConversationActions.TypeConfig.Builder {
- ctor public ConversationActions.TypeConfig.Builder();
- method public android.view.textclassifier.ConversationActions.TypeConfig build();
- method public android.view.textclassifier.ConversationActions.TypeConfig.Builder includeTypesFromTextClassifier(boolean);
- method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setExcludedTypes(java.util.Collection<java.lang.String>);
- method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setIncludedTypes(java.util.Collection<java.lang.String>);
+ ctor public ConversationActions.Request.Builder(@NonNull java.util.List<android.view.textclassifier.ConversationActions.Message>);
+ method @NonNull public android.view.textclassifier.ConversationActions.Request build();
+ method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setConversationId(@Nullable String);
+ method public android.view.textclassifier.ConversationActions.Request.Builder setHints(@Nullable java.util.List<java.lang.String>);
+ method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setMaxSuggestions(@IntRange(from=0) int);
+ method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setTypeConfig(@Nullable android.view.textclassifier.TextClassifier.EntityConfig);
}
public final class SelectionEvent implements android.os.Parcelable {
- method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int);
- method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int, android.view.textclassifier.TextClassification);
- method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int);
- method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, android.view.textclassifier.TextClassification);
- method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, android.view.textclassifier.TextSelection);
- method public static android.view.textclassifier.SelectionEvent createSelectionStartedEvent(int, int);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int, @NonNull android.view.textclassifier.TextClassification);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, @NonNull android.view.textclassifier.TextClassification);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, @NonNull android.view.textclassifier.TextSelection);
+ method @NonNull public static android.view.textclassifier.SelectionEvent createSelectionStartedEvent(int, int);
method public int describeContents();
method public long getDurationSincePreviousEvent();
method public long getDurationSinceSessionStart();
method public int getEnd();
- method public java.lang.String getEntityType();
+ method @NonNull public String getEntityType();
method public int getEventIndex();
method public long getEventTime();
method public int getEventType();
method public int getInvocationMethod();
- method public java.lang.String getPackageName();
- method public java.lang.String getResultId();
- method public android.view.textclassifier.TextClassificationSessionId getSessionId();
+ method @NonNull public String getPackageName();
+ method @Nullable public String getResultId();
+ method @Nullable public android.view.textclassifier.TextClassificationSessionId getSessionId();
method public int getSmartEnd();
method public int getSmartStart();
method public int getStart();
- method public java.lang.String getWidgetType();
- method public java.lang.String getWidgetVersion();
+ method @NonNull public String getWidgetType();
+ method @Nullable public String getWidgetVersion();
method public static boolean isTerminal(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_ABANDON = 107; // 0x6b
@@ -52957,79 +53224,79 @@ package android.view.textclassifier {
public final class TextClassification implements android.os.Parcelable {
method public int describeContents();
method public java.util.List<android.app.RemoteAction> getActions();
- method public float getConfidenceScore(java.lang.String);
- method public java.lang.String getEntity(int);
- method public int getEntityCount();
- method public android.os.Bundle getExtras();
- method public deprecated android.graphics.drawable.Drawable getIcon();
- method public java.lang.String getId();
- method public deprecated android.content.Intent getIntent();
- method public deprecated java.lang.CharSequence getLabel();
- method public deprecated android.view.View.OnClickListener getOnClickListener();
- method public java.lang.String getText();
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String);
+ method @NonNull public String getEntity(int);
+ method @IntRange(from=0) public int getEntityCount();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Deprecated @Nullable public android.graphics.drawable.Drawable getIcon();
+ method @Nullable public String getId();
+ method @Deprecated @Nullable public android.content.Intent getIntent();
+ method @Deprecated @Nullable public CharSequence getLabel();
+ method @Deprecated @Nullable public android.view.View.OnClickListener getOnClickListener();
+ method @Nullable public String getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification> CREATOR;
}
public static final class TextClassification.Builder {
ctor public TextClassification.Builder();
- method public android.view.textclassifier.TextClassification.Builder addAction(android.app.RemoteAction);
- method public android.view.textclassifier.TextClassification build();
- method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextClassification.Builder setExtras(android.os.Bundle);
- method public deprecated android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassification.Builder setId(java.lang.String);
- method public deprecated android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
- method public deprecated android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
- method public deprecated android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
- method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
+ method @NonNull public android.view.textclassifier.TextClassification.Builder addAction(@NonNull android.app.RemoteAction);
+ method @NonNull public android.view.textclassifier.TextClassification build();
+ method @NonNull public android.view.textclassifier.TextClassification.Builder setEntityType(@NonNull String, @FloatRange(from=0.0, to=1.0) float);
+ method @NonNull public android.view.textclassifier.TextClassification.Builder setExtras(@Nullable android.os.Bundle);
+ method @Deprecated @NonNull public android.view.textclassifier.TextClassification.Builder setIcon(@Nullable android.graphics.drawable.Drawable);
+ method @NonNull public android.view.textclassifier.TextClassification.Builder setId(@Nullable String);
+ method @Deprecated @NonNull public android.view.textclassifier.TextClassification.Builder setIntent(@Nullable android.content.Intent);
+ method @Deprecated @NonNull public android.view.textclassifier.TextClassification.Builder setLabel(@Nullable String);
+ method @Deprecated @NonNull public android.view.textclassifier.TextClassification.Builder setOnClickListener(@Nullable android.view.View.OnClickListener);
+ method @NonNull public android.view.textclassifier.TextClassification.Builder setText(@Nullable String);
}
public static final class TextClassification.Request implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallingPackageName();
- method public android.os.LocaleList getDefaultLocales();
- method public int getEndIndex();
- method public android.os.Bundle getExtras();
- method public java.time.ZonedDateTime getReferenceTime();
- method public int getStartIndex();
- method public java.lang.CharSequence getText();
+ method @Nullable public String getCallingPackageName();
+ method @Nullable public android.os.LocaleList getDefaultLocales();
+ method @IntRange(from=0) public int getEndIndex();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public java.time.ZonedDateTime getReferenceTime();
+ method @IntRange(from=0) public int getStartIndex();
+ method @NonNull public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Request> CREATOR;
}
public static final class TextClassification.Request.Builder {
- ctor public TextClassification.Request.Builder(java.lang.CharSequence, int, int);
- method public android.view.textclassifier.TextClassification.Request build();
- method public android.view.textclassifier.TextClassification.Request.Builder setDefaultLocales(android.os.LocaleList);
- method public android.view.textclassifier.TextClassification.Request.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.TextClassification.Request.Builder setReferenceTime(java.time.ZonedDateTime);
+ ctor public TextClassification.Request.Builder(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
+ method @NonNull public android.view.textclassifier.TextClassification.Request build();
+ method @NonNull public android.view.textclassifier.TextClassification.Request.Builder setDefaultLocales(@Nullable android.os.LocaleList);
+ method @NonNull public android.view.textclassifier.TextClassification.Request.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextClassification.Request.Builder setReferenceTime(@Nullable java.time.ZonedDateTime);
}
public final class TextClassificationContext implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getPackageName();
- method public java.lang.String getWidgetType();
- method public java.lang.String getWidgetVersion();
+ method @NonNull public String getPackageName();
+ method @NonNull public String getWidgetType();
+ method @Nullable public String getWidgetVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassificationContext> CREATOR;
}
public static final class TextClassificationContext.Builder {
- ctor public TextClassificationContext.Builder(java.lang.String, java.lang.String);
- method public android.view.textclassifier.TextClassificationContext build();
- method public android.view.textclassifier.TextClassificationContext.Builder setWidgetVersion(java.lang.String);
+ ctor public TextClassificationContext.Builder(@NonNull String, @NonNull String);
+ method @NonNull public android.view.textclassifier.TextClassificationContext build();
+ method public android.view.textclassifier.TextClassificationContext.Builder setWidgetVersion(@Nullable String);
}
public final class TextClassificationManager {
- method public android.view.textclassifier.TextClassifier createTextClassificationSession(android.view.textclassifier.TextClassificationContext);
- method public android.view.textclassifier.TextClassifier getTextClassifier();
- method public void setTextClassificationSessionFactory(android.view.textclassifier.TextClassificationSessionFactory);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
+ method @NonNull public android.view.textclassifier.TextClassifier createTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext);
+ method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier();
+ method public void setTextClassificationSessionFactory(@Nullable android.view.textclassifier.TextClassificationSessionFactory);
+ method public void setTextClassifier(@Nullable android.view.textclassifier.TextClassifier);
}
- public abstract interface TextClassificationSessionFactory {
- method public abstract android.view.textclassifier.TextClassifier createTextClassificationSession(android.view.textclassifier.TextClassificationContext);
+ public interface TextClassificationSessionFactory {
+ method @NonNull public android.view.textclassifier.TextClassifier createTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext);
}
public final class TextClassificationSessionId implements android.os.Parcelable {
@@ -53038,71 +53305,81 @@ package android.view.textclassifier {
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassificationSessionId> CREATOR;
}
- public abstract interface TextClassifier {
- method public default android.view.textclassifier.TextClassification classifyText(android.view.textclassifier.TextClassification.Request);
- method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
+ public interface TextClassifier {
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextClassification classifyText(@NonNull android.view.textclassifier.TextClassification.Request);
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextClassification classifyText(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
method public default void destroy();
- method public default android.view.textclassifier.TextLanguage detectLanguage(android.view.textclassifier.TextLanguage.Request);
- method public default android.view.textclassifier.TextLinks generateLinks(android.view.textclassifier.TextLinks.Request);
- method public default int getMaxGenerateLinksTextLength();
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextLanguage detectLanguage(@NonNull android.view.textclassifier.TextLanguage.Request);
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextLinks generateLinks(@NonNull android.view.textclassifier.TextLinks.Request);
+ method @WorkerThread public default int getMaxGenerateLinksTextLength();
method public default boolean isDestroyed();
- method public default void onSelectionEvent(android.view.textclassifier.SelectionEvent);
- method public default void onTextClassifierEvent(android.view.textclassifier.TextClassifierEvent);
- method public default android.view.textclassifier.ConversationActions suggestConversationActions(android.view.textclassifier.ConversationActions.Request);
- method public default android.view.textclassifier.TextSelection suggestSelection(android.view.textclassifier.TextSelection.Request);
- method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
- field public static final java.lang.String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
- field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
- field public static final java.lang.String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
+ method public default void onSelectionEvent(@NonNull android.view.textclassifier.SelectionEvent);
+ method public default void onTextClassifierEvent(@NonNull android.view.textclassifier.TextClassifierEvent);
+ method @WorkerThread public default android.view.textclassifier.ConversationActions suggestConversationActions(@NonNull android.view.textclassifier.ConversationActions.Request);
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull android.view.textclassifier.TextSelection.Request);
+ method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
+ field public static final String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
+ field public static final String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
+ field public static final String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
field public static final android.view.textclassifier.TextClassifier NO_OP;
- field public static final java.lang.String TYPE_ADDRESS = "address";
- field public static final java.lang.String TYPE_DATE = "date";
- field public static final java.lang.String TYPE_DATE_TIME = "datetime";
- field public static final java.lang.String TYPE_EMAIL = "email";
- field public static final java.lang.String TYPE_FLIGHT_NUMBER = "flight";
- field public static final java.lang.String TYPE_OTHER = "other";
- field public static final java.lang.String TYPE_PHONE = "phone";
- field public static final java.lang.String TYPE_UNKNOWN = "";
- field public static final java.lang.String TYPE_URL = "url";
- field public static final java.lang.String WIDGET_TYPE_CUSTOM_EDITTEXT = "customedit";
- field public static final java.lang.String WIDGET_TYPE_CUSTOM_TEXTVIEW = "customview";
- field public static final java.lang.String WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
- field public static final java.lang.String WIDGET_TYPE_EDITTEXT = "edittext";
- field public static final java.lang.String WIDGET_TYPE_EDIT_WEBVIEW = "edit-webview";
- field public static final java.lang.String WIDGET_TYPE_NOTIFICATION = "notification";
- field public static final java.lang.String WIDGET_TYPE_TEXTVIEW = "textview";
- field public static final java.lang.String WIDGET_TYPE_UNKNOWN = "unknown";
- field public static final java.lang.String WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = "nosel-textview";
- field public static final java.lang.String WIDGET_TYPE_WEBVIEW = "webview";
+ field public static final String TYPE_ADDRESS = "address";
+ field public static final String TYPE_DATE = "date";
+ field public static final String TYPE_DATE_TIME = "datetime";
+ field public static final String TYPE_EMAIL = "email";
+ field public static final String TYPE_FLIGHT_NUMBER = "flight";
+ field public static final String TYPE_OTHER = "other";
+ field public static final String TYPE_PHONE = "phone";
+ field public static final String TYPE_UNKNOWN = "";
+ field public static final String TYPE_URL = "url";
+ field public static final String WIDGET_TYPE_CUSTOM_EDITTEXT = "customedit";
+ field public static final String WIDGET_TYPE_CUSTOM_TEXTVIEW = "customview";
+ field public static final String WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
+ field public static final String WIDGET_TYPE_EDITTEXT = "edittext";
+ field public static final String WIDGET_TYPE_EDIT_WEBVIEW = "edit-webview";
+ field public static final String WIDGET_TYPE_NOTIFICATION = "notification";
+ field public static final String WIDGET_TYPE_TEXTVIEW = "textview";
+ field public static final String WIDGET_TYPE_UNKNOWN = "unknown";
+ field public static final String WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = "nosel-textview";
+ field public static final String WIDGET_TYPE_WEBVIEW = "webview";
}
public static final class TextClassifier.EntityConfig implements android.os.Parcelable {
- method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>);
- method public static android.view.textclassifier.TextClassifier.EntityConfig createWithExplicitEntityList(java.util.Collection<java.lang.String>);
- method public static android.view.textclassifier.TextClassifier.EntityConfig createWithHints(java.util.Collection<java.lang.String>);
+ method @Deprecated public static android.view.textclassifier.TextClassifier.EntityConfig create(@Nullable java.util.Collection<java.lang.String>, @Nullable java.util.Collection<java.lang.String>, @Nullable java.util.Collection<java.lang.String>);
+ method @Deprecated public static android.view.textclassifier.TextClassifier.EntityConfig createWithExplicitEntityList(@Nullable java.util.Collection<java.lang.String>);
+ method @Deprecated public static android.view.textclassifier.TextClassifier.EntityConfig createWithHints(@Nullable java.util.Collection<java.lang.String>);
method public int describeContents();
method public java.util.Collection<java.lang.String> getHints();
- method public java.util.Collection<java.lang.String> resolveEntityListModifications(java.util.Collection<java.lang.String>);
+ method public java.util.Collection<java.lang.String> resolveEntityListModifications(@NonNull java.util.Collection<java.lang.String>);
+ method public boolean shouldIncludeTypesFromTextClassifier();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifier.EntityConfig> CREATOR;
}
+ public static final class TextClassifier.EntityConfig.Builder {
+ ctor public TextClassifier.EntityConfig.Builder();
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig build();
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder includeTypesFromTextClassifier(boolean);
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder setExcludedTypes(@Nullable java.util.Collection<java.lang.String>);
+ method public android.view.textclassifier.TextClassifier.EntityConfig.Builder setHints(java.util.Collection<java.lang.String>);
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder setIncludedTypes(@Nullable java.util.Collection<java.lang.String>);
+ }
+
public final class TextClassifierEvent implements android.os.Parcelable {
method public int describeContents();
- method public int[] getActionIndices();
- method public java.lang.String getEntityType();
+ method @NonNull public int[] getActionIndices();
+ method @Nullable public String getEntityType();
method public int getEventCategory();
- method public android.view.textclassifier.TextClassificationContext getEventContext();
+ method @Nullable public android.view.textclassifier.TextClassificationContext getEventContext();
method public int getEventIndex();
method public long getEventTime();
method public int getEventType();
- method public android.os.Bundle getExtras();
- method public java.lang.String getLanguage();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public String getLanguage();
method public int getRelativeSuggestedWordEndIndex();
method public int getRelativeSuggestedWordStartIndex();
method public int getRelativeWordEndIndex();
method public int getRelativeWordStartIndex();
- method public java.lang.String getResultId();
+ method @Nullable public String getResultId();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CATEGORY_CONVERSATION_ACTIONS = 3; // 0x3
field public static final int CATEGORY_LANGUAGE_DETECTION = 4; // 0x4
@@ -53110,6 +53387,7 @@ package android.view.textclassifier {
field public static final int CATEGORY_SELECTION = 1; // 0x1
field public static final int CATEGORY_UNDEFINED = 0; // 0x0
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifierEvent> CREATOR;
+ field public static final int TYPE_ACTIONS_GENERATED = 20; // 0x14
field public static final int TYPE_ACTIONS_SHOWN = 6; // 0x6
field public static final int TYPE_AUTO_SELECTION = 5; // 0x5
field public static final int TYPE_COPY_ACTION = 9; // 0x9
@@ -53134,60 +53412,60 @@ package android.view.textclassifier {
public static final class TextClassifierEvent.Builder {
ctor public TextClassifierEvent.Builder(int, int);
- method public android.view.textclassifier.TextClassifierEvent build();
- method public android.view.textclassifier.TextClassifierEvent.Builder setActionIndices(int...);
- method public android.view.textclassifier.TextClassifierEvent.Builder setEntityType(java.lang.String);
- method public android.view.textclassifier.TextClassifierEvent.Builder setEventContext(android.view.textclassifier.TextClassificationContext);
- method public android.view.textclassifier.TextClassifierEvent.Builder setEventIndex(int);
- method public android.view.textclassifier.TextClassifierEvent.Builder setEventTime(long);
- method public android.view.textclassifier.TextClassifierEvent.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.TextClassifierEvent.Builder setLanguage(java.lang.String);
- method public android.view.textclassifier.TextClassifierEvent.Builder setRelativeSuggestedWordEndIndex(int);
- method public android.view.textclassifier.TextClassifierEvent.Builder setRelativeSuggestedWordStartIndex(int);
- method public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordEndIndex(int);
- method public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordStartIndex(int);
- method public android.view.textclassifier.TextClassifierEvent.Builder setResultId(java.lang.String);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent build();
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setActionIndices(@NonNull int...);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEntityType(@Nullable String);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventContext(@Nullable android.view.textclassifier.TextClassificationContext);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventIndex(int);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventTime(long);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setLanguage(@Nullable String);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeSuggestedWordEndIndex(int);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeSuggestedWordStartIndex(int);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordEndIndex(int);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordStartIndex(int);
+ method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setResultId(@Nullable String);
}
public final class TextLanguage implements android.os.Parcelable {
method public int describeContents();
- method public float getConfidenceScore(android.icu.util.ULocale);
- method public android.os.Bundle getExtras();
- method public java.lang.String getId();
- method public android.icu.util.ULocale getLocale(int);
- method public int getLocaleHypothesisCount();
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(@NonNull android.icu.util.ULocale);
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public String getId();
+ method @NonNull public android.icu.util.ULocale getLocale(int);
+ method @IntRange(from=0) public int getLocaleHypothesisCount();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLanguage> CREATOR;
}
public static final class TextLanguage.Builder {
ctor public TextLanguage.Builder();
- method public android.view.textclassifier.TextLanguage build();
- method public android.view.textclassifier.TextLanguage.Builder putLocale(android.icu.util.ULocale, float);
- method public android.view.textclassifier.TextLanguage.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.TextLanguage.Builder setId(java.lang.String);
+ method @NonNull public android.view.textclassifier.TextLanguage build();
+ method @NonNull public android.view.textclassifier.TextLanguage.Builder putLocale(@NonNull android.icu.util.ULocale, @FloatRange(from=0.0, to=1.0) float);
+ method @NonNull public android.view.textclassifier.TextLanguage.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextLanguage.Builder setId(@Nullable String);
}
public static final class TextLanguage.Request implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallingPackageName();
- method public android.os.Bundle getExtras();
- method public java.lang.CharSequence getText();
+ method @Nullable public String getCallingPackageName();
+ method @NonNull public android.os.Bundle getExtras();
+ method @NonNull public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLanguage.Request> CREATOR;
}
public static final class TextLanguage.Request.Builder {
- ctor public TextLanguage.Request.Builder(java.lang.CharSequence);
- method public android.view.textclassifier.TextLanguage.Request build();
- method public android.view.textclassifier.TextLanguage.Request.Builder setExtras(android.os.Bundle);
+ ctor public TextLanguage.Request.Builder(@NonNull CharSequence);
+ method @NonNull public android.view.textclassifier.TextLanguage.Request build();
+ method @NonNull public android.view.textclassifier.TextLanguage.Request.Builder setExtras(@NonNull android.os.Bundle);
}
public final class TextLinks implements android.os.Parcelable {
- method public int apply(android.text.Spannable, int, java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan>);
+ method public int apply(@NonNull android.text.Spannable, int, @Nullable java.util.function.Function<android.view.textclassifier.TextLinks.TextLink,android.view.textclassifier.TextLinks.TextLinkSpan>);
method public int describeContents();
- method public android.os.Bundle getExtras();
- method public java.util.Collection<android.view.textclassifier.TextLinks.TextLink> getLinks();
+ method @NonNull public android.os.Bundle getExtras();
+ method @NonNull public java.util.Collection<android.view.textclassifier.TextLinks.TextLink> getLinks();
method public void writeToParcel(android.os.Parcel, int);
field public static final int APPLY_STRATEGY_IGNORE = 0; // 0x0
field public static final int APPLY_STRATEGY_REPLACE = 1; // 0x1
@@ -53200,38 +53478,38 @@ package android.view.textclassifier {
}
public static final class TextLinks.Builder {
- ctor public TextLinks.Builder(java.lang.String);
- method public android.view.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String, java.lang.Float>);
- method public android.view.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String, java.lang.Float>, android.os.Bundle);
- method public android.view.textclassifier.TextLinks build();
- method public android.view.textclassifier.TextLinks.Builder clearTextLinks();
- method public android.view.textclassifier.TextLinks.Builder setExtras(android.os.Bundle);
+ ctor public TextLinks.Builder(@NonNull String);
+ method @NonNull public android.view.textclassifier.TextLinks.Builder addLink(int, int, @NonNull java.util.Map<java.lang.String,java.lang.Float>);
+ method @NonNull public android.view.textclassifier.TextLinks.Builder addLink(int, int, @NonNull java.util.Map<java.lang.String,java.lang.Float>, @NonNull android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextLinks build();
+ method @NonNull public android.view.textclassifier.TextLinks.Builder clearTextLinks();
+ method public android.view.textclassifier.TextLinks.Builder setExtras(@Nullable android.os.Bundle);
}
public static final class TextLinks.Request implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallingPackageName();
- method public android.os.LocaleList getDefaultLocales();
- method public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
- method public android.os.Bundle getExtras();
- method public java.lang.CharSequence getText();
+ method @Nullable public String getCallingPackageName();
+ method @Nullable public android.os.LocaleList getDefaultLocales();
+ method @Nullable public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
+ method @NonNull public android.os.Bundle getExtras();
+ method @NonNull public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Request> CREATOR;
}
public static final class TextLinks.Request.Builder {
- ctor public TextLinks.Request.Builder(java.lang.CharSequence);
- method public android.view.textclassifier.TextLinks.Request build();
- method public android.view.textclassifier.TextLinks.Request.Builder setDefaultLocales(android.os.LocaleList);
- method public android.view.textclassifier.TextLinks.Request.Builder setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
- method public android.view.textclassifier.TextLinks.Request.Builder setExtras(android.os.Bundle);
+ ctor public TextLinks.Request.Builder(@NonNull CharSequence);
+ method @NonNull public android.view.textclassifier.TextLinks.Request build();
+ method @NonNull public android.view.textclassifier.TextLinks.Request.Builder setDefaultLocales(@Nullable android.os.LocaleList);
+ method @NonNull public android.view.textclassifier.TextLinks.Request.Builder setEntityConfig(@Nullable android.view.textclassifier.TextClassifier.EntityConfig);
+ method public android.view.textclassifier.TextLinks.Request.Builder setExtras(@Nullable android.os.Bundle);
}
public static final class TextLinks.TextLink implements android.os.Parcelable {
method public int describeContents();
- method public float getConfidenceScore(java.lang.String);
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String);
method public int getEnd();
- method public java.lang.String getEntity(int);
+ method @NonNull public String getEntity(int);
method public int getEntityCount();
method public android.os.Bundle getExtras();
method public int getStart();
@@ -53240,18 +53518,18 @@ package android.view.textclassifier {
}
public static class TextLinks.TextLinkSpan extends android.text.style.ClickableSpan {
- ctor public TextLinks.TextLinkSpan(android.view.textclassifier.TextLinks.TextLink);
+ ctor public TextLinks.TextLinkSpan(@NonNull android.view.textclassifier.TextLinks.TextLink);
method public final android.view.textclassifier.TextLinks.TextLink getTextLink();
method public void onClick(android.view.View);
}
public final class TextSelection implements android.os.Parcelable {
method public int describeContents();
- method public float getConfidenceScore(java.lang.String);
- method public java.lang.String getEntity(int);
- method public int getEntityCount();
- method public android.os.Bundle getExtras();
- method public java.lang.String getId();
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String);
+ method @NonNull public String getEntity(int);
+ method @IntRange(from=0) public int getEntityCount();
+ method @NonNull public android.os.Bundle getExtras();
+ method @Nullable public String getId();
method public int getSelectionEndIndex();
method public int getSelectionStartIndex();
method public void writeToParcel(android.os.Parcel, int);
@@ -53259,30 +53537,30 @@ package android.view.textclassifier {
}
public static final class TextSelection.Builder {
- ctor public TextSelection.Builder(int, int);
- method public android.view.textclassifier.TextSelection build();
- method public android.view.textclassifier.TextSelection.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextSelection.Builder setExtras(android.os.Bundle);
- method public android.view.textclassifier.TextSelection.Builder setId(java.lang.String);
+ ctor public TextSelection.Builder(@IntRange(from=0) int, @IntRange(from=0) int);
+ method @NonNull public android.view.textclassifier.TextSelection build();
+ method @NonNull public android.view.textclassifier.TextSelection.Builder setEntityType(@NonNull String, @FloatRange(from=0.0, to=1.0) float);
+ method public android.view.textclassifier.TextSelection.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextSelection.Builder setId(@Nullable String);
}
public static final class TextSelection.Request implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getCallingPackageName();
- method public android.os.LocaleList getDefaultLocales();
- method public int getEndIndex();
- method public android.os.Bundle getExtras();
- method public int getStartIndex();
- method public java.lang.CharSequence getText();
+ method @Nullable public String getCallingPackageName();
+ method @Nullable public android.os.LocaleList getDefaultLocales();
+ method @IntRange(from=0) public int getEndIndex();
+ method @NonNull public android.os.Bundle getExtras();
+ method @IntRange(from=0) public int getStartIndex();
+ method @NonNull public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Request> CREATOR;
}
public static final class TextSelection.Request.Builder {
- ctor public TextSelection.Request.Builder(java.lang.CharSequence, int, int);
- method public android.view.textclassifier.TextSelection.Request build();
- method public android.view.textclassifier.TextSelection.Request.Builder setDefaultLocales(android.os.LocaleList);
- method public android.view.textclassifier.TextSelection.Request.Builder setExtras(android.os.Bundle);
+ ctor public TextSelection.Request.Builder(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
+ method @NonNull public android.view.textclassifier.TextSelection.Request build();
+ method @NonNull public android.view.textclassifier.TextSelection.Request.Builder setDefaultLocales(@Nullable android.os.LocaleList);
+ method public android.view.textclassifier.TextSelection.Request.Builder setExtras(@Nullable android.os.Bundle);
}
}
@@ -53304,14 +53582,14 @@ package android.view.textservice {
public final class SpellCheckerInfo implements android.os.Parcelable {
method public int describeContents();
method public android.content.ComponentName getComponent();
- method public java.lang.String getId();
- method public java.lang.String getPackageName();
+ method public String getId();
+ method public String getPackageName();
method public android.content.pm.ServiceInfo getServiceInfo();
- method public java.lang.String getSettingsActivity();
+ method public String getSettingsActivity();
method public android.view.textservice.SpellCheckerSubtype getSubtypeAt(int);
method public int getSubtypeCount();
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textservice.SpellCheckerInfo> CREATOR;
}
@@ -53321,39 +53599,39 @@ package android.view.textservice {
method public void close();
method public void getSentenceSuggestions(android.view.textservice.TextInfo[], int);
method public android.view.textservice.SpellCheckerInfo getSpellChecker();
- method public deprecated void getSuggestions(android.view.textservice.TextInfo, int);
- method public deprecated void getSuggestions(android.view.textservice.TextInfo[], int, boolean);
+ method @Deprecated public void getSuggestions(android.view.textservice.TextInfo, int);
+ method @Deprecated public void getSuggestions(android.view.textservice.TextInfo[], int, boolean);
method public boolean isSessionDisconnected();
- field public static final java.lang.String SERVICE_META_DATA = "android.view.textservice.scs";
+ field public static final String SERVICE_META_DATA = "android.view.textservice.scs";
}
- public static abstract interface SpellCheckerSession.SpellCheckerSessionListener {
- method public abstract void onGetSentenceSuggestions(android.view.textservice.SentenceSuggestionsInfo[]);
- method public abstract void onGetSuggestions(android.view.textservice.SuggestionsInfo[]);
+ public static interface SpellCheckerSession.SpellCheckerSessionListener {
+ method public void onGetSentenceSuggestions(android.view.textservice.SentenceSuggestionsInfo[]);
+ method public void onGetSuggestions(android.view.textservice.SuggestionsInfo[]);
}
public final class SpellCheckerSubtype implements android.os.Parcelable {
- ctor public deprecated SpellCheckerSubtype(int, java.lang.String, java.lang.String);
- method public boolean containsExtraValueKey(java.lang.String);
+ ctor @Deprecated public SpellCheckerSubtype(int, String, String);
+ method public boolean containsExtraValueKey(String);
method public int describeContents();
- method public java.lang.CharSequence getDisplayName(android.content.Context, java.lang.String, android.content.pm.ApplicationInfo);
- method public java.lang.String getExtraValue();
- method public java.lang.String getExtraValueOf(java.lang.String);
- method public java.lang.String getLanguageTag();
- method public deprecated java.lang.String getLocale();
+ method public CharSequence getDisplayName(android.content.Context, String, android.content.pm.ApplicationInfo);
+ method public String getExtraValue();
+ method public String getExtraValueOf(String);
+ method @NonNull public String getLanguageTag();
+ method @Deprecated @NonNull public String getLocale();
method public int getNameResId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textservice.SpellCheckerSubtype> CREATOR;
}
public final class SuggestionsInfo implements android.os.Parcelable {
- ctor public SuggestionsInfo(int, java.lang.String[]);
- ctor public SuggestionsInfo(int, java.lang.String[], int, int);
+ ctor public SuggestionsInfo(int, String[]);
+ ctor public SuggestionsInfo(int, String[], int, int);
ctor public SuggestionsInfo(android.os.Parcel);
method public int describeContents();
method public int getCookie();
method public int getSequence();
- method public java.lang.String getSuggestionAt(int);
+ method public String getSuggestionAt(int);
method public int getSuggestionsAttributes();
method public int getSuggestionsCount();
method public void setCookieAndSequence(int, int);
@@ -53365,15 +53643,15 @@ package android.view.textservice {
}
public final class TextInfo implements android.os.Parcelable {
- ctor public TextInfo(java.lang.String);
- ctor public TextInfo(java.lang.String, int, int);
- ctor public TextInfo(java.lang.CharSequence, int, int, int, int);
+ ctor public TextInfo(String);
+ ctor public TextInfo(String, int, int);
+ ctor public TextInfo(CharSequence, int, int, int, int);
ctor public TextInfo(android.os.Parcel);
method public int describeContents();
- method public java.lang.CharSequence getCharSequence();
+ method public CharSequence getCharSequence();
method public int getCookie();
method public int getSequence();
- method public java.lang.String getText();
+ method public String getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textservice.TextInfo> CREATOR;
}
@@ -53389,25 +53667,23 @@ package android.webkit {
public abstract class ClientCertRequest {
ctor public ClientCertRequest();
method public abstract void cancel();
- method public abstract java.lang.String getHost();
- method public abstract java.lang.String[] getKeyTypes();
+ method public abstract String getHost();
+ method @Nullable public abstract String[] getKeyTypes();
method public abstract int getPort();
- method public abstract java.security.Principal[] getPrincipals();
+ method @Nullable public abstract java.security.Principal[] getPrincipals();
method public abstract void ignore();
method public abstract void proceed(java.security.PrivateKey, java.security.cert.X509Certificate[]);
}
public class ConsoleMessage {
- ctor public ConsoleMessage(java.lang.String, java.lang.String, int, android.webkit.ConsoleMessage.MessageLevel);
+ ctor public ConsoleMessage(String, String, int, android.webkit.ConsoleMessage.MessageLevel);
method public int lineNumber();
- method public java.lang.String message();
+ method public String message();
method public android.webkit.ConsoleMessage.MessageLevel messageLevel();
- method public java.lang.String sourceId();
+ method public String sourceId();
}
- public static final class ConsoleMessage.MessageLevel extends java.lang.Enum {
- method public static android.webkit.ConsoleMessage.MessageLevel valueOf(java.lang.String);
- method public static final android.webkit.ConsoleMessage.MessageLevel[] values();
+ public enum ConsoleMessage.MessageLevel {
enum_constant public static final android.webkit.ConsoleMessage.MessageLevel DEBUG;
enum_constant public static final android.webkit.ConsoleMessage.MessageLevel ERROR;
enum_constant public static final android.webkit.ConsoleMessage.MessageLevel LOG;
@@ -53416,72 +53692,73 @@ package android.webkit {
}
public abstract class CookieManager {
- ctor public deprecated CookieManager();
+ ctor @Deprecated public CookieManager();
method public abstract boolean acceptCookie();
method public abstract boolean acceptThirdPartyCookies(android.webkit.WebView);
method public static boolean allowFileSchemeCookies();
method public abstract void flush();
- method public abstract java.lang.String getCookie(java.lang.String);
+ method public abstract String getCookie(String);
method public static android.webkit.CookieManager getInstance();
method public abstract boolean hasCookies();
- method public abstract deprecated void removeAllCookie();
- method public abstract void removeAllCookies(android.webkit.ValueCallback<java.lang.Boolean>);
- method public abstract deprecated void removeExpiredCookie();
- method public abstract deprecated void removeSessionCookie();
- method public abstract void removeSessionCookies(android.webkit.ValueCallback<java.lang.Boolean>);
+ method @Deprecated public abstract void removeAllCookie();
+ method public abstract void removeAllCookies(@Nullable android.webkit.ValueCallback<java.lang.Boolean>);
+ method @Deprecated public abstract void removeExpiredCookie();
+ method @Deprecated public abstract void removeSessionCookie();
+ method public abstract void removeSessionCookies(@Nullable android.webkit.ValueCallback<java.lang.Boolean>);
method public abstract void setAcceptCookie(boolean);
method public static void setAcceptFileSchemeCookies(boolean);
method public abstract void setAcceptThirdPartyCookies(android.webkit.WebView, boolean);
- method public abstract void setCookie(java.lang.String, java.lang.String);
- method public abstract void setCookie(java.lang.String, java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public abstract void setCookie(String, String);
+ method public abstract void setCookie(String, String, @Nullable android.webkit.ValueCallback<java.lang.Boolean>);
}
- public final deprecated class CookieSyncManager implements java.lang.Runnable {
- method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
- method public static android.webkit.CookieSyncManager getInstance();
- method public deprecated void resetSync();
- method public deprecated void startSync();
- method public deprecated void stopSync();
- method public deprecated void sync();
- method protected deprecated void syncFromRamToFlash();
+ @Deprecated public final class CookieSyncManager implements java.lang.Runnable {
+ method @Deprecated public static android.webkit.CookieSyncManager createInstance(android.content.Context);
+ method @Deprecated public static android.webkit.CookieSyncManager getInstance();
+ method @Deprecated public void resetSync();
+ method @Deprecated public void run();
+ method @Deprecated public void startSync();
+ method @Deprecated public void stopSync();
+ method @Deprecated public void sync();
+ method @Deprecated protected void syncFromRamToFlash();
}
public class DateSorter {
ctor public DateSorter(android.content.Context);
method public long getBoundary(int);
method public int getIndex(long);
- method public java.lang.String getLabel(int);
+ method public String getLabel(int);
field public static final int DAY_COUNT = 5; // 0x5
}
- public abstract interface DownloadListener {
- method public abstract void onDownloadStart(java.lang.String, java.lang.String, java.lang.String, java.lang.String, long);
+ public interface DownloadListener {
+ method public void onDownloadStart(String, String, String, String, long);
}
public class GeolocationPermissions {
- method public void allow(java.lang.String);
- method public void clear(java.lang.String);
+ method public void allow(String);
+ method public void clear(String);
method public void clearAll();
- method public void getAllowed(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void getAllowed(String, android.webkit.ValueCallback<java.lang.Boolean>);
method public static android.webkit.GeolocationPermissions getInstance();
method public void getOrigins(android.webkit.ValueCallback<java.util.Set<java.lang.String>>);
}
- public static abstract interface GeolocationPermissions.Callback {
- method public abstract void invoke(java.lang.String, boolean, boolean);
+ public static interface GeolocationPermissions.Callback {
+ method public void invoke(String, boolean, boolean);
}
public class HttpAuthHandler extends android.os.Handler {
method public void cancel();
- method public void proceed(java.lang.String, java.lang.String);
+ method public void proceed(String, String);
method public boolean useHttpAuthUsernamePassword();
}
- public abstract class JavascriptInterface implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface JavascriptInterface {
}
public class JsPromptResult extends android.webkit.JsResult {
- method public void confirm(java.lang.String);
+ method public void confirm(String);
}
public class JsResult {
@@ -53490,39 +53767,39 @@ package android.webkit {
}
public class MimeTypeMap {
- method public java.lang.String getExtensionFromMimeType(java.lang.String);
- method public static java.lang.String getFileExtensionFromUrl(java.lang.String);
- method public java.lang.String getMimeTypeFromExtension(java.lang.String);
+ method @Nullable public String getExtensionFromMimeType(String);
+ method public static String getFileExtensionFromUrl(String);
+ method @Nullable public String getMimeTypeFromExtension(String);
method public static android.webkit.MimeTypeMap getSingleton();
- method public boolean hasExtension(java.lang.String);
- method public boolean hasMimeType(java.lang.String);
+ method public boolean hasExtension(String);
+ method public boolean hasMimeType(String);
}
public abstract class PermissionRequest {
ctor public PermissionRequest();
method public abstract void deny();
method public abstract android.net.Uri getOrigin();
- method public abstract java.lang.String[] getResources();
- method public abstract void grant(java.lang.String[]);
- field public static final java.lang.String RESOURCE_AUDIO_CAPTURE = "android.webkit.resource.AUDIO_CAPTURE";
- field public static final java.lang.String RESOURCE_MIDI_SYSEX = "android.webkit.resource.MIDI_SYSEX";
- field public static final java.lang.String RESOURCE_PROTECTED_MEDIA_ID = "android.webkit.resource.PROTECTED_MEDIA_ID";
- field public static final java.lang.String RESOURCE_VIDEO_CAPTURE = "android.webkit.resource.VIDEO_CAPTURE";
+ method public abstract String[] getResources();
+ method public abstract void grant(String[]);
+ field public static final String RESOURCE_AUDIO_CAPTURE = "android.webkit.resource.AUDIO_CAPTURE";
+ field public static final String RESOURCE_MIDI_SYSEX = "android.webkit.resource.MIDI_SYSEX";
+ field public static final String RESOURCE_PROTECTED_MEDIA_ID = "android.webkit.resource.PROTECTED_MEDIA_ID";
+ field public static final String RESOURCE_VIDEO_CAPTURE = "android.webkit.resource.VIDEO_CAPTURE";
}
- public abstract interface PluginStub {
- method public abstract android.view.View getEmbeddedView(int, android.content.Context);
- method public abstract android.view.View getFullScreenView(int, android.content.Context);
+ public interface PluginStub {
+ method public android.view.View getEmbeddedView(int, android.content.Context);
+ method public android.view.View getFullScreenView(int, android.content.Context);
}
public abstract class RenderProcessGoneDetail {
- ctor public deprecated RenderProcessGoneDetail();
+ ctor @Deprecated public RenderProcessGoneDetail();
method public abstract boolean didCrash();
method public abstract int rendererPriorityAtExit();
}
public abstract class SafeBrowsingResponse {
- ctor public deprecated SafeBrowsingResponse();
+ ctor @Deprecated public SafeBrowsingResponse();
method public abstract void backToSafety(boolean);
method public abstract void proceed(boolean);
method public abstract void showInterstitial(boolean);
@@ -53530,14 +53807,14 @@ package android.webkit {
public class ServiceWorkerClient {
ctor public ServiceWorkerClient();
- method public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
+ method @Nullable public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
}
public abstract class ServiceWorkerController {
- ctor public deprecated ServiceWorkerController();
- method public static android.webkit.ServiceWorkerController getInstance();
- method public abstract android.webkit.ServiceWorkerWebSettings getServiceWorkerWebSettings();
- method public abstract void setServiceWorkerClient(android.webkit.ServiceWorkerClient);
+ ctor @Deprecated public ServiceWorkerController();
+ method @NonNull public static android.webkit.ServiceWorkerController getInstance();
+ method @NonNull public abstract android.webkit.ServiceWorkerWebSettings getServiceWorkerWebSettings();
+ method public abstract void setServiceWorkerClient(@Nullable android.webkit.ServiceWorkerClient);
}
public abstract class ServiceWorkerWebSettings {
@@ -53558,7 +53835,7 @@ package android.webkit {
}
public class TracingConfig {
- method public java.util.List<java.lang.String> getCustomIncludedCategories();
+ method @NonNull public java.util.List<java.lang.String> getCustomIncludedCategories();
method public int getPredefinedCategories();
method public int getTracingMode();
field public static final int CATEGORIES_ALL = 1; // 0x1
@@ -53583,90 +53860,90 @@ package android.webkit {
}
public abstract class TracingController {
- ctor public deprecated TracingController();
- method public static android.webkit.TracingController getInstance();
+ ctor @Deprecated public TracingController();
+ method @NonNull public static android.webkit.TracingController getInstance();
method public abstract boolean isTracing();
- method public abstract void start(android.webkit.TracingConfig);
- method public abstract boolean stop(java.io.OutputStream, java.util.concurrent.Executor);
+ method public abstract void start(@NonNull android.webkit.TracingConfig);
+ method public abstract boolean stop(@Nullable java.io.OutputStream, @NonNull java.util.concurrent.Executor);
}
public final class URLUtil {
ctor public URLUtil();
- method public static java.lang.String composeSearchUrl(java.lang.String, java.lang.String, java.lang.String);
+ method public static String composeSearchUrl(String, String, String);
method public static byte[] decode(byte[]) throws java.lang.IllegalArgumentException;
- method public static java.lang.String guessFileName(java.lang.String, java.lang.String, java.lang.String);
- method public static java.lang.String guessUrl(java.lang.String);
- method public static boolean isAboutUrl(java.lang.String);
- method public static boolean isAssetUrl(java.lang.String);
- method public static boolean isContentUrl(java.lang.String);
- method public static deprecated boolean isCookielessProxyUrl(java.lang.String);
- method public static boolean isDataUrl(java.lang.String);
- method public static boolean isFileUrl(java.lang.String);
- method public static boolean isHttpUrl(java.lang.String);
- method public static boolean isHttpsUrl(java.lang.String);
- method public static boolean isJavaScriptUrl(java.lang.String);
- method public static boolean isNetworkUrl(java.lang.String);
- method public static boolean isValidUrl(java.lang.String);
- method public static java.lang.String stripAnchor(java.lang.String);
- }
-
- public abstract interface ValueCallback<T> {
- method public abstract void onReceiveValue(T);
+ method public static String guessFileName(String, @Nullable String, @Nullable String);
+ method public static String guessUrl(String);
+ method public static boolean isAboutUrl(String);
+ method public static boolean isAssetUrl(String);
+ method public static boolean isContentUrl(String);
+ method @Deprecated public static boolean isCookielessProxyUrl(String);
+ method public static boolean isDataUrl(String);
+ method public static boolean isFileUrl(String);
+ method public static boolean isHttpUrl(String);
+ method public static boolean isHttpsUrl(String);
+ method public static boolean isJavaScriptUrl(String);
+ method public static boolean isNetworkUrl(String);
+ method public static boolean isValidUrl(String);
+ method public static String stripAnchor(String);
+ }
+
+ public interface ValueCallback<T> {
+ method public void onReceiveValue(T);
}
public abstract class WebBackForwardList implements java.lang.Cloneable java.io.Serializable {
ctor public WebBackForwardList();
method protected abstract android.webkit.WebBackForwardList clone();
method public abstract int getCurrentIndex();
- method public abstract android.webkit.WebHistoryItem getCurrentItem();
+ method @Nullable public abstract android.webkit.WebHistoryItem getCurrentItem();
method public abstract android.webkit.WebHistoryItem getItemAtIndex(int);
method public abstract int getSize();
}
public class WebChromeClient {
ctor public WebChromeClient();
- method public android.graphics.Bitmap getDefaultVideoPoster();
- method public android.view.View getVideoLoadingProgressView();
+ method @Nullable public android.graphics.Bitmap getDefaultVideoPoster();
+ method @Nullable public android.view.View getVideoLoadingProgressView();
method public void getVisitedHistory(android.webkit.ValueCallback<java.lang.String[]>);
method public void onCloseWindow(android.webkit.WebView);
- method public deprecated void onConsoleMessage(java.lang.String, int, java.lang.String);
+ method @Deprecated public void onConsoleMessage(String, int, String);
method public boolean onConsoleMessage(android.webkit.ConsoleMessage);
method public boolean onCreateWindow(android.webkit.WebView, boolean, boolean, android.os.Message);
- method public deprecated void onExceededDatabaseQuota(java.lang.String, java.lang.String, long, long, long, android.webkit.WebStorage.QuotaUpdater);
+ method @Deprecated public void onExceededDatabaseQuota(String, String, long, long, long, android.webkit.WebStorage.QuotaUpdater);
method public void onGeolocationPermissionsHidePrompt();
- method public void onGeolocationPermissionsShowPrompt(java.lang.String, android.webkit.GeolocationPermissions.Callback);
+ method public void onGeolocationPermissionsShowPrompt(String, android.webkit.GeolocationPermissions.Callback);
method public void onHideCustomView();
- method public boolean onJsAlert(android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult);
- method public boolean onJsBeforeUnload(android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult);
- method public boolean onJsConfirm(android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult);
- method public boolean onJsPrompt(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String, android.webkit.JsPromptResult);
- method public deprecated boolean onJsTimeout();
+ method public boolean onJsAlert(android.webkit.WebView, String, String, android.webkit.JsResult);
+ method public boolean onJsBeforeUnload(android.webkit.WebView, String, String, android.webkit.JsResult);
+ method public boolean onJsConfirm(android.webkit.WebView, String, String, android.webkit.JsResult);
+ method public boolean onJsPrompt(android.webkit.WebView, String, String, String, android.webkit.JsPromptResult);
+ method @Deprecated public boolean onJsTimeout();
method public void onPermissionRequest(android.webkit.PermissionRequest);
method public void onPermissionRequestCanceled(android.webkit.PermissionRequest);
method public void onProgressChanged(android.webkit.WebView, int);
- method public deprecated void onReachedMaxAppCacheSize(long, long, android.webkit.WebStorage.QuotaUpdater);
+ method @Deprecated public void onReachedMaxAppCacheSize(long, long, android.webkit.WebStorage.QuotaUpdater);
method public void onReceivedIcon(android.webkit.WebView, android.graphics.Bitmap);
- method public void onReceivedTitle(android.webkit.WebView, java.lang.String);
- method public void onReceivedTouchIconUrl(android.webkit.WebView, java.lang.String, boolean);
+ method public void onReceivedTitle(android.webkit.WebView, String);
+ method public void onReceivedTouchIconUrl(android.webkit.WebView, String, boolean);
method public void onRequestFocus(android.webkit.WebView);
method public void onShowCustomView(android.view.View, android.webkit.WebChromeClient.CustomViewCallback);
- method public deprecated void onShowCustomView(android.view.View, int, android.webkit.WebChromeClient.CustomViewCallback);
+ method @Deprecated public void onShowCustomView(android.view.View, int, android.webkit.WebChromeClient.CustomViewCallback);
method public boolean onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams);
}
- public static abstract interface WebChromeClient.CustomViewCallback {
- method public abstract void onCustomViewHidden();
+ public static interface WebChromeClient.CustomViewCallback {
+ method public void onCustomViewHidden();
}
- public static abstract class WebChromeClient.FileChooserParams {
+ public abstract static class WebChromeClient.FileChooserParams {
ctor public WebChromeClient.FileChooserParams();
method public abstract android.content.Intent createIntent();
- method public abstract java.lang.String[] getAcceptTypes();
- method public abstract java.lang.String getFilenameHint();
+ method public abstract String[] getAcceptTypes();
+ method @Nullable public abstract String getFilenameHint();
method public abstract int getMode();
- method public abstract java.lang.CharSequence getTitle();
+ method @Nullable public abstract CharSequence getTitle();
method public abstract boolean isCaptureEnabled();
- method public static android.net.Uri[] parseResult(int, android.content.Intent);
+ method @Nullable public static android.net.Uri[] parseResult(int, android.content.Intent);
field public static final int MODE_OPEN = 0; // 0x0
field public static final int MODE_OPEN_MULTIPLE = 1; // 0x1
field public static final int MODE_SAVE = 3; // 0x3
@@ -53675,32 +53952,32 @@ package android.webkit {
public abstract class WebHistoryItem implements java.lang.Cloneable {
ctor public WebHistoryItem();
method protected abstract android.webkit.WebHistoryItem clone();
- method public abstract android.graphics.Bitmap getFavicon();
- method public abstract java.lang.String getOriginalUrl();
- method public abstract java.lang.String getTitle();
- method public abstract java.lang.String getUrl();
+ method @Nullable public abstract android.graphics.Bitmap getFavicon();
+ method public abstract String getOriginalUrl();
+ method public abstract String getTitle();
+ method public abstract String getUrl();
}
- public abstract deprecated class WebIconDatabase {
- ctor public WebIconDatabase();
- method public abstract void close();
- method public static android.webkit.WebIconDatabase getInstance();
- method public abstract void open(java.lang.String);
- method public abstract void releaseIconForPageUrl(java.lang.String);
- method public abstract void removeAllIcons();
- method public abstract void requestIconForPageUrl(java.lang.String, android.webkit.WebIconDatabase.IconListener);
- method public abstract void retainIconForPageUrl(java.lang.String);
+ @Deprecated public abstract class WebIconDatabase {
+ ctor @Deprecated public WebIconDatabase();
+ method @Deprecated public abstract void close();
+ method @Deprecated public static android.webkit.WebIconDatabase getInstance();
+ method @Deprecated public abstract void open(String);
+ method @Deprecated public abstract void releaseIconForPageUrl(String);
+ method @Deprecated public abstract void removeAllIcons();
+ method @Deprecated public abstract void requestIconForPageUrl(String, android.webkit.WebIconDatabase.IconListener);
+ method @Deprecated public abstract void retainIconForPageUrl(String);
}
- public static abstract deprecated interface WebIconDatabase.IconListener {
- method public abstract void onReceivedIcon(java.lang.String, android.graphics.Bitmap);
+ @Deprecated public static interface WebIconDatabase.IconListener {
+ method @Deprecated public void onReceivedIcon(String, android.graphics.Bitmap);
}
public class WebMessage {
- ctor public WebMessage(java.lang.String);
- ctor public WebMessage(java.lang.String, android.webkit.WebMessagePort[]);
- method public java.lang.String getData();
- method public android.webkit.WebMessagePort[] getPorts();
+ ctor public WebMessage(String);
+ ctor public WebMessage(String, android.webkit.WebMessagePort[]);
+ method public String getData();
+ method @Nullable public android.webkit.WebMessagePort[] getPorts();
}
public abstract class WebMessagePort {
@@ -53710,44 +53987,44 @@ package android.webkit {
method public abstract void setWebMessageCallback(android.webkit.WebMessagePort.WebMessageCallback, android.os.Handler);
}
- public static abstract class WebMessagePort.WebMessageCallback {
+ public abstract static class WebMessagePort.WebMessageCallback {
ctor public WebMessagePort.WebMessageCallback();
method public void onMessage(android.webkit.WebMessagePort, android.webkit.WebMessage);
}
public abstract class WebResourceError {
- method public abstract java.lang.CharSequence getDescription();
+ method public abstract CharSequence getDescription();
method public abstract int getErrorCode();
}
- public abstract interface WebResourceRequest {
- method public abstract java.lang.String getMethod();
- method public abstract java.util.Map<java.lang.String, java.lang.String> getRequestHeaders();
- method public abstract android.net.Uri getUrl();
- method public abstract boolean hasGesture();
- method public abstract boolean isForMainFrame();
- method public abstract boolean isRedirect();
+ public interface WebResourceRequest {
+ method public String getMethod();
+ method public java.util.Map<java.lang.String,java.lang.String> getRequestHeaders();
+ method public android.net.Uri getUrl();
+ method public boolean hasGesture();
+ method public boolean isForMainFrame();
+ method public boolean isRedirect();
}
public class WebResourceResponse {
- ctor public WebResourceResponse(java.lang.String, java.lang.String, java.io.InputStream);
- ctor public WebResourceResponse(java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream);
+ ctor public WebResourceResponse(String, String, java.io.InputStream);
+ ctor public WebResourceResponse(String, String, int, @NonNull String, java.util.Map<java.lang.String,java.lang.String>, java.io.InputStream);
method public java.io.InputStream getData();
- method public java.lang.String getEncoding();
- method public java.lang.String getMimeType();
- method public java.lang.String getReasonPhrase();
- method public java.util.Map<java.lang.String, java.lang.String> getResponseHeaders();
+ method public String getEncoding();
+ method public String getMimeType();
+ method public String getReasonPhrase();
+ method public java.util.Map<java.lang.String,java.lang.String> getResponseHeaders();
method public int getStatusCode();
method public void setData(java.io.InputStream);
- method public void setEncoding(java.lang.String);
- method public void setMimeType(java.lang.String);
- method public void setResponseHeaders(java.util.Map<java.lang.String, java.lang.String>);
- method public void setStatusCodeAndReasonPhrase(int, java.lang.String);
+ method public void setEncoding(String);
+ method public void setMimeType(String);
+ method public void setResponseHeaders(java.util.Map<java.lang.String,java.lang.String>);
+ method public void setStatusCodeAndReasonPhrase(int, @NonNull String);
}
public abstract class WebSettings {
ctor public WebSettings();
- method public abstract deprecated boolean enableSmoothTransition();
+ method @Deprecated public abstract boolean enableSmoothTransition();
method public abstract boolean getAllowContentAccess();
method public abstract boolean getAllowFileAccess();
method public abstract boolean getAllowFileAccessFromFileURLs();
@@ -53756,24 +54033,24 @@ package android.webkit {
method public abstract boolean getBlockNetworkLoads();
method public abstract boolean getBuiltInZoomControls();
method public abstract int getCacheMode();
- method public abstract java.lang.String getCursiveFontFamily();
+ method public abstract String getCursiveFontFamily();
method public abstract boolean getDatabaseEnabled();
- method public abstract deprecated java.lang.String getDatabasePath();
+ method @Deprecated public abstract String getDatabasePath();
method public abstract int getDefaultFixedFontSize();
method public abstract int getDefaultFontSize();
- method public abstract java.lang.String getDefaultTextEncodingName();
- method public static java.lang.String getDefaultUserAgent(android.content.Context);
- method public abstract deprecated android.webkit.WebSettings.ZoomDensity getDefaultZoom();
+ method public abstract String getDefaultTextEncodingName();
+ method public static String getDefaultUserAgent(android.content.Context);
+ method @Deprecated public abstract android.webkit.WebSettings.ZoomDensity getDefaultZoom();
method public abstract int getDisabledActionModeMenuItems();
method public abstract boolean getDisplayZoomControls();
method public abstract boolean getDomStorageEnabled();
- method public abstract java.lang.String getFantasyFontFamily();
- method public abstract java.lang.String getFixedFontFamily();
+ method public abstract String getFantasyFontFamily();
+ method public abstract String getFixedFontFamily();
method public int getForceDarkMode();
method public abstract boolean getJavaScriptCanOpenWindowsAutomatically();
method public abstract boolean getJavaScriptEnabled();
method public abstract android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm();
- method public abstract deprecated boolean getLightTouchEnabled();
+ method @Deprecated public abstract boolean getLightTouchEnabled();
method public abstract boolean getLoadWithOverviewMode();
method public abstract boolean getLoadsImagesAutomatically();
method public abstract boolean getMediaPlaybackRequiresUserGesture();
@@ -53781,48 +54058,48 @@ package android.webkit {
method public abstract int getMinimumLogicalFontSize();
method public abstract int getMixedContentMode();
method public abstract boolean getOffscreenPreRaster();
- method public abstract deprecated android.webkit.WebSettings.PluginState getPluginState();
+ method @Deprecated public abstract android.webkit.WebSettings.PluginState getPluginState();
method public abstract boolean getSafeBrowsingEnabled();
- method public abstract java.lang.String getSansSerifFontFamily();
- method public abstract deprecated boolean getSaveFormData();
- method public abstract deprecated boolean getSavePassword();
- method public abstract java.lang.String getSerifFontFamily();
- method public abstract java.lang.String getStandardFontFamily();
- method public deprecated synchronized android.webkit.WebSettings.TextSize getTextSize();
+ method public abstract String getSansSerifFontFamily();
+ method @Deprecated public abstract boolean getSaveFormData();
+ method @Deprecated public abstract boolean getSavePassword();
+ method public abstract String getSerifFontFamily();
+ method public abstract String getStandardFontFamily();
+ method @Deprecated public android.webkit.WebSettings.TextSize getTextSize();
method public abstract int getTextZoom();
method public abstract boolean getUseWideViewPort();
- method public abstract java.lang.String getUserAgentString();
+ method public abstract String getUserAgentString();
method public abstract void setAllowContentAccess(boolean);
method public abstract void setAllowFileAccess(boolean);
method public abstract void setAllowFileAccessFromFileURLs(boolean);
method public abstract void setAllowUniversalAccessFromFileURLs(boolean);
method public abstract void setAppCacheEnabled(boolean);
- method public abstract deprecated void setAppCacheMaxSize(long);
- method public abstract void setAppCachePath(java.lang.String);
+ method @Deprecated public abstract void setAppCacheMaxSize(long);
+ method public abstract void setAppCachePath(String);
method public abstract void setBlockNetworkImage(boolean);
method public abstract void setBlockNetworkLoads(boolean);
method public abstract void setBuiltInZoomControls(boolean);
method public abstract void setCacheMode(int);
- method public abstract void setCursiveFontFamily(java.lang.String);
+ method public abstract void setCursiveFontFamily(String);
method public abstract void setDatabaseEnabled(boolean);
- method public abstract deprecated void setDatabasePath(java.lang.String);
+ method @Deprecated public abstract void setDatabasePath(String);
method public abstract void setDefaultFixedFontSize(int);
method public abstract void setDefaultFontSize(int);
- method public abstract void setDefaultTextEncodingName(java.lang.String);
- method public abstract deprecated void setDefaultZoom(android.webkit.WebSettings.ZoomDensity);
+ method public abstract void setDefaultTextEncodingName(String);
+ method @Deprecated public abstract void setDefaultZoom(android.webkit.WebSettings.ZoomDensity);
method public abstract void setDisabledActionModeMenuItems(int);
method public abstract void setDisplayZoomControls(boolean);
method public abstract void setDomStorageEnabled(boolean);
- method public abstract deprecated void setEnableSmoothTransition(boolean);
- method public abstract void setFantasyFontFamily(java.lang.String);
- method public abstract void setFixedFontFamily(java.lang.String);
+ method @Deprecated public abstract void setEnableSmoothTransition(boolean);
+ method public abstract void setFantasyFontFamily(String);
+ method public abstract void setFixedFontFamily(String);
method public void setForceDarkMode(int);
- method public abstract deprecated void setGeolocationDatabasePath(java.lang.String);
+ method @Deprecated public abstract void setGeolocationDatabasePath(String);
method public abstract void setGeolocationEnabled(boolean);
method public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean);
method public abstract void setJavaScriptEnabled(boolean);
method public abstract void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm);
- method public abstract deprecated void setLightTouchEnabled(boolean);
+ method @Deprecated public abstract void setLightTouchEnabled(boolean);
method public abstract void setLoadWithOverviewMode(boolean);
method public abstract void setLoadsImagesAutomatically(boolean);
method public abstract void setMediaPlaybackRequiresUserGesture(boolean);
@@ -53831,20 +54108,20 @@ package android.webkit {
method public abstract void setMixedContentMode(int);
method public abstract void setNeedInitialFocus(boolean);
method public abstract void setOffscreenPreRaster(boolean);
- method public abstract deprecated void setPluginState(android.webkit.WebSettings.PluginState);
- method public abstract deprecated void setRenderPriority(android.webkit.WebSettings.RenderPriority);
+ method @Deprecated public abstract void setPluginState(android.webkit.WebSettings.PluginState);
+ method @Deprecated public abstract void setRenderPriority(android.webkit.WebSettings.RenderPriority);
method public abstract void setSafeBrowsingEnabled(boolean);
- method public abstract void setSansSerifFontFamily(java.lang.String);
- method public abstract deprecated void setSaveFormData(boolean);
- method public abstract deprecated void setSavePassword(boolean);
- method public abstract void setSerifFontFamily(java.lang.String);
- method public abstract void setStandardFontFamily(java.lang.String);
+ method public abstract void setSansSerifFontFamily(String);
+ method @Deprecated public abstract void setSaveFormData(boolean);
+ method @Deprecated public abstract void setSavePassword(boolean);
+ method public abstract void setSerifFontFamily(String);
+ method public abstract void setStandardFontFamily(String);
method public abstract void setSupportMultipleWindows(boolean);
method public abstract void setSupportZoom(boolean);
- method public deprecated synchronized void setTextSize(android.webkit.WebSettings.TextSize);
+ method @Deprecated public void setTextSize(android.webkit.WebSettings.TextSize);
method public abstract void setTextZoom(int);
method public abstract void setUseWideViewPort(boolean);
- method public abstract void setUserAgentString(java.lang.String);
+ method public abstract void setUserAgentString(@Nullable String);
method public abstract boolean supportMultipleWindows();
method public abstract boolean supportZoom();
field public static final int FORCE_DARK_AUTO = 0; // 0x0
@@ -53853,7 +54130,7 @@ package android.webkit {
field public static final int LOAD_CACHE_ELSE_NETWORK = 1; // 0x1
field public static final int LOAD_CACHE_ONLY = 3; // 0x3
field public static final int LOAD_DEFAULT = -1; // 0xffffffff
- field public static final deprecated int LOAD_NORMAL = 0; // 0x0
+ field @Deprecated public static final int LOAD_NORMAL = 0; // 0x0
field public static final int LOAD_NO_CACHE = 2; // 0x2
field public static final int MENU_ITEM_NONE = 0; // 0x0
field public static final int MENU_ITEM_PROCESS_TEXT = 4; // 0x4
@@ -53864,44 +54141,34 @@ package android.webkit {
field public static final int MIXED_CONTENT_NEVER_ALLOW = 1; // 0x1
}
- public static final class WebSettings.LayoutAlgorithm extends java.lang.Enum {
- method public static android.webkit.WebSettings.LayoutAlgorithm valueOf(java.lang.String);
- method public static final android.webkit.WebSettings.LayoutAlgorithm[] values();
- enum_constant public static final deprecated android.webkit.WebSettings.LayoutAlgorithm NARROW_COLUMNS;
+ public enum WebSettings.LayoutAlgorithm {
+ enum_constant @Deprecated public static final android.webkit.WebSettings.LayoutAlgorithm NARROW_COLUMNS;
enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NORMAL;
- enum_constant public static final deprecated android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN;
+ enum_constant @Deprecated public static final android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN;
enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm TEXT_AUTOSIZING;
}
- public static final class WebSettings.PluginState extends java.lang.Enum {
- method public static android.webkit.WebSettings.PluginState valueOf(java.lang.String);
- method public static final android.webkit.WebSettings.PluginState[] values();
+ public enum WebSettings.PluginState {
enum_constant public static final android.webkit.WebSettings.PluginState OFF;
enum_constant public static final android.webkit.WebSettings.PluginState ON;
enum_constant public static final android.webkit.WebSettings.PluginState ON_DEMAND;
}
- public static final class WebSettings.RenderPriority extends java.lang.Enum {
- method public static android.webkit.WebSettings.RenderPriority valueOf(java.lang.String);
- method public static final android.webkit.WebSettings.RenderPriority[] values();
+ public enum WebSettings.RenderPriority {
enum_constant public static final android.webkit.WebSettings.RenderPriority HIGH;
enum_constant public static final android.webkit.WebSettings.RenderPriority LOW;
enum_constant public static final android.webkit.WebSettings.RenderPriority NORMAL;
}
- public static final deprecated class WebSettings.TextSize extends java.lang.Enum {
- method public static android.webkit.WebSettings.TextSize valueOf(java.lang.String);
- method public static final android.webkit.WebSettings.TextSize[] values();
- enum_constant public static final android.webkit.WebSettings.TextSize LARGER;
- enum_constant public static final android.webkit.WebSettings.TextSize LARGEST;
- enum_constant public static final android.webkit.WebSettings.TextSize NORMAL;
- enum_constant public static final android.webkit.WebSettings.TextSize SMALLER;
- enum_constant public static final android.webkit.WebSettings.TextSize SMALLEST;
+ @Deprecated public enum WebSettings.TextSize {
+ enum_constant @Deprecated public static final android.webkit.WebSettings.TextSize LARGER;
+ enum_constant @Deprecated public static final android.webkit.WebSettings.TextSize LARGEST;
+ enum_constant @Deprecated public static final android.webkit.WebSettings.TextSize NORMAL;
+ enum_constant @Deprecated public static final android.webkit.WebSettings.TextSize SMALLER;
+ enum_constant @Deprecated public static final android.webkit.WebSettings.TextSize SMALLEST;
}
- public static final class WebSettings.ZoomDensity extends java.lang.Enum {
- method public static android.webkit.WebSettings.ZoomDensity valueOf(java.lang.String);
- method public static final android.webkit.WebSettings.ZoomDensity[] values();
+ public enum WebSettings.ZoomDensity {
enum_constant public static final android.webkit.WebSettings.ZoomDensity CLOSE;
enum_constant public static final android.webkit.WebSettings.ZoomDensity FAR;
enum_constant public static final android.webkit.WebSettings.ZoomDensity MEDIUM;
@@ -53909,22 +54176,22 @@ package android.webkit {
public class WebStorage {
method public void deleteAllData();
- method public void deleteOrigin(java.lang.String);
+ method public void deleteOrigin(String);
method public static android.webkit.WebStorage getInstance();
method public void getOrigins(android.webkit.ValueCallback<java.util.Map>);
- method public void getQuotaForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>);
- method public void getUsageForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>);
- method public deprecated void setQuotaForOrigin(java.lang.String, long);
+ method public void getQuotaForOrigin(String, android.webkit.ValueCallback<java.lang.Long>);
+ method public void getUsageForOrigin(String, android.webkit.ValueCallback<java.lang.Long>);
+ method @Deprecated public void setQuotaForOrigin(String, long);
}
public static class WebStorage.Origin {
- method public java.lang.String getOrigin();
+ method public String getOrigin();
method public long getQuota();
method public long getUsage();
}
- public static abstract deprecated interface WebStorage.QuotaUpdater {
- method public abstract void updateQuota(long);
+ @Deprecated public static interface WebStorage.QuotaUpdater {
+ method @Deprecated public void updateQuota(long);
}
public class WebView extends android.widget.AbsoluteLayout implements android.view.ViewGroup.OnHierarchyChangeListener android.view.ViewTreeObserver.OnGlobalFocusChangeListener {
@@ -53932,108 +54199,112 @@ package android.webkit {
ctor public WebView(android.content.Context, android.util.AttributeSet);
ctor public WebView(android.content.Context, android.util.AttributeSet, int);
ctor public WebView(android.content.Context, android.util.AttributeSet, int, int);
- ctor public deprecated WebView(android.content.Context, android.util.AttributeSet, int, boolean);
- method public void addJavascriptInterface(java.lang.Object, java.lang.String);
+ ctor @Deprecated public WebView(android.content.Context, android.util.AttributeSet, int, boolean);
+ method public void addJavascriptInterface(Object, String);
method public boolean canGoBack();
method public boolean canGoBackOrForward(int);
method public boolean canGoForward();
- method public deprecated boolean canZoomIn();
- method public deprecated boolean canZoomOut();
- method public deprecated android.graphics.Picture capturePicture();
+ method @Deprecated public boolean canZoomIn();
+ method @Deprecated public boolean canZoomOut();
+ method @Deprecated public android.graphics.Picture capturePicture();
method public void clearCache(boolean);
- method public static void clearClientCertPreferences(java.lang.Runnable);
+ method public static void clearClientCertPreferences(@Nullable Runnable);
method public void clearFormData();
method public void clearHistory();
method public void clearMatches();
method public void clearSslPreferences();
- method public deprecated void clearView();
+ method @Deprecated public void clearView();
method public android.webkit.WebBackForwardList copyBackForwardList();
- method public deprecated android.print.PrintDocumentAdapter createPrintDocumentAdapter();
- method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(java.lang.String);
+ method @Deprecated public android.print.PrintDocumentAdapter createPrintDocumentAdapter();
+ method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(String);
method public android.webkit.WebMessagePort[] createWebMessageChannel();
method public void destroy();
method public static void disableWebView();
method public void documentHasImages(android.os.Message);
method public static void enableSlowWholeDocumentDraw();
- method public void evaluateJavascript(java.lang.String, android.webkit.ValueCallback<java.lang.String>);
- method public static deprecated java.lang.String findAddress(java.lang.String);
- method public deprecated int findAll(java.lang.String);
- method public void findAllAsync(java.lang.String);
+ method public void evaluateJavascript(String, @Nullable android.webkit.ValueCallback<java.lang.String>);
+ method @Deprecated @Nullable public static String findAddress(String);
+ method @Deprecated public int findAll(String);
+ method public void findAllAsync(String);
method public void findNext(boolean);
method public void flingScroll(int, int);
- method public deprecated void freeMemory();
- method public android.net.http.SslCertificate getCertificate();
- method public int getContentHeight();
- method public static android.content.pm.PackageInfo getCurrentWebViewPackage();
+ method @Deprecated public void freeMemory();
+ method @Nullable public android.net.http.SslCertificate getCertificate();
+ method @android.view.ViewDebug.ExportedProperty(category="webview") public int getContentHeight();
+ method @Nullable public static android.content.pm.PackageInfo getCurrentWebViewPackage();
method public android.graphics.Bitmap getFavicon();
method public android.webkit.WebView.HitTestResult getHitTestResult();
- method public deprecated java.lang.String[] getHttpAuthUsernamePassword(java.lang.String, java.lang.String);
- method public java.lang.String getOriginalUrl();
+ method @Deprecated @Nullable public String[] getHttpAuthUsernamePassword(String, String);
+ method @android.view.ViewDebug.ExportedProperty(category="webview") public String getOriginalUrl();
method public int getProgress();
method public boolean getRendererPriorityWaivedWhenNotVisible();
method public int getRendererRequestedPriority();
- method public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
- method public deprecated float getScale();
+ method @NonNull public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
+ method @Deprecated @android.view.ViewDebug.ExportedProperty(category="webview") public float getScale();
method public android.webkit.WebSettings getSettings();
- method public android.view.textclassifier.TextClassifier getTextClassifier();
- method public java.lang.String getTitle();
- method public java.lang.String getUrl();
- method public android.webkit.WebChromeClient getWebChromeClient();
- method public static java.lang.ClassLoader getWebViewClassLoader();
+ method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier();
+ method @android.view.ViewDebug.ExportedProperty(category="webview") public String getTitle();
+ method @android.view.ViewDebug.ExportedProperty(category="webview") public String getUrl();
+ method @Nullable public android.webkit.WebChromeClient getWebChromeClient();
+ method @NonNull public static ClassLoader getWebViewClassLoader();
method public android.webkit.WebViewClient getWebViewClient();
- method public android.os.Looper getWebViewLooper();
+ method @NonNull public android.os.Looper getWebViewLooper();
+ method @Nullable public android.webkit.WebViewRenderer getWebViewRenderer();
+ method @Nullable public android.webkit.WebViewRendererClient getWebViewRendererClient();
method public void goBack();
method public void goBackOrForward(int);
method public void goForward();
method public void invokeZoomPicker();
method public boolean isPrivateBrowsingEnabled();
- method public void loadData(java.lang.String, java.lang.String, java.lang.String);
- method public void loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public void loadUrl(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
- method public void loadUrl(java.lang.String);
- method public deprecated void onChildViewAdded(android.view.View, android.view.View);
- method public deprecated void onChildViewRemoved(android.view.View, android.view.View);
- method public deprecated void onGlobalFocusChanged(android.view.View, android.view.View);
+ method public void loadData(String, @Nullable String, @Nullable String);
+ method public void loadDataWithBaseURL(@Nullable String, String, @Nullable String, @Nullable String, @Nullable String);
+ method public void loadUrl(String, java.util.Map<java.lang.String,java.lang.String>);
+ method public void loadUrl(String);
+ method @Deprecated public void onChildViewAdded(android.view.View, android.view.View);
+ method @Deprecated public void onChildViewRemoved(android.view.View, android.view.View);
+ method @Deprecated public void onGlobalFocusChanged(android.view.View, android.view.View);
method public void onPause();
method public void onResume();
- method public deprecated boolean overlayHorizontalScrollbar();
- method public deprecated boolean overlayVerticalScrollbar();
+ method @Deprecated public boolean overlayHorizontalScrollbar();
+ method @Deprecated public boolean overlayVerticalScrollbar();
method public boolean pageDown(boolean);
method public boolean pageUp(boolean);
method public void pauseTimers();
- method public void postUrl(java.lang.String, byte[]);
+ method public void postUrl(String, byte[]);
method public void postVisualStateCallback(long, android.webkit.WebView.VisualStateCallback);
method public void postWebMessage(android.webkit.WebMessage, android.net.Uri);
method public void reload();
- method public void removeJavascriptInterface(java.lang.String);
- method public void requestFocusNodeHref(android.os.Message);
+ method public void removeJavascriptInterface(@NonNull String);
+ method public void requestFocusNodeHref(@Nullable android.os.Message);
method public void requestImageRef(android.os.Message);
- method public android.webkit.WebBackForwardList restoreState(android.os.Bundle);
+ method @Nullable public android.webkit.WebBackForwardList restoreState(android.os.Bundle);
method public void resumeTimers();
- method public deprecated void savePassword(java.lang.String, java.lang.String, java.lang.String);
- method public android.webkit.WebBackForwardList saveState(android.os.Bundle);
- method public void saveWebArchive(java.lang.String);
- method public void saveWebArchive(java.lang.String, boolean, android.webkit.ValueCallback<java.lang.String>);
- method public deprecated void setCertificate(android.net.http.SslCertificate);
- method public static void setDataDirectorySuffix(java.lang.String);
+ method @Deprecated public void savePassword(String, String, String);
+ method @Nullable public android.webkit.WebBackForwardList saveState(android.os.Bundle);
+ method public void saveWebArchive(String);
+ method public void saveWebArchive(String, boolean, @Nullable android.webkit.ValueCallback<java.lang.String>);
+ method @Deprecated public void setCertificate(android.net.http.SslCertificate);
+ method public static void setDataDirectorySuffix(String);
method public void setDownloadListener(android.webkit.DownloadListener);
method public void setFindListener(android.webkit.WebView.FindListener);
- method public deprecated void setHorizontalScrollbarOverlay(boolean);
- method public deprecated void setHttpAuthUsernamePassword(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method @Deprecated public void setHorizontalScrollbarOverlay(boolean);
+ method @Deprecated public void setHttpAuthUsernamePassword(String, String, String, String);
method public void setInitialScale(int);
- method public deprecated void setMapTrackballToArrowKeys(boolean);
+ method @Deprecated public void setMapTrackballToArrowKeys(boolean);
method public void setNetworkAvailable(boolean);
- method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
+ method @Deprecated public void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
- method public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
- method public deprecated void setVerticalScrollbarOverlay(boolean);
+ method public static void setSafeBrowsingWhitelist(@NonNull java.util.List<java.lang.String>, @Nullable android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setTextClassifier(@Nullable android.view.textclassifier.TextClassifier);
+ method @Deprecated public void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
method public void setWebViewClient(android.webkit.WebViewClient);
- method public deprecated boolean shouldDelayChildPressedState();
- method public deprecated boolean showFindDialog(java.lang.String, boolean);
- method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setWebViewRendererClient(@NonNull java.util.concurrent.Executor, @NonNull android.webkit.WebViewRendererClient);
+ method public void setWebViewRendererClient(@Nullable android.webkit.WebViewRendererClient);
+ method @Deprecated public boolean shouldDelayChildPressedState();
+ method @Deprecated public boolean showFindDialog(@Nullable String, boolean);
+ method public static void startSafeBrowsing(@NonNull android.content.Context, @Nullable android.webkit.ValueCallback<java.lang.Boolean>);
method public void stopLoading();
method public void zoomBy(float);
method public boolean zoomIn();
@@ -54041,23 +54312,23 @@ package android.webkit {
field public static final int RENDERER_PRIORITY_BOUND = 1; // 0x1
field public static final int RENDERER_PRIORITY_IMPORTANT = 2; // 0x2
field public static final int RENDERER_PRIORITY_WAIVED = 0; // 0x0
- field public static final java.lang.String SCHEME_GEO = "geo:0,0?q=";
- field public static final java.lang.String SCHEME_MAILTO = "mailto:";
- field public static final java.lang.String SCHEME_TEL = "tel:";
+ field public static final String SCHEME_GEO = "geo:0,0?q=";
+ field public static final String SCHEME_MAILTO = "mailto:";
+ field public static final String SCHEME_TEL = "tel:";
}
- public static abstract interface WebView.FindListener {
- method public abstract void onFindResultReceived(int, int, boolean);
+ public static interface WebView.FindListener {
+ method public void onFindResultReceived(int, int, boolean);
}
public static class WebView.HitTestResult {
- method public java.lang.String getExtra();
+ method @Nullable public String getExtra();
method public int getType();
- field public static final deprecated int ANCHOR_TYPE = 1; // 0x1
+ field @Deprecated public static final int ANCHOR_TYPE = 1; // 0x1
field public static final int EDIT_TEXT_TYPE = 9; // 0x9
field public static final int EMAIL_TYPE = 4; // 0x4
field public static final int GEO_TYPE = 3; // 0x3
- field public static final deprecated int IMAGE_ANCHOR_TYPE = 6; // 0x6
+ field @Deprecated public static final int IMAGE_ANCHOR_TYPE = 6; // 0x6
field public static final int IMAGE_TYPE = 5; // 0x5
field public static final int PHONE_TYPE = 2; // 0x2
field public static final int SRC_ANCHOR_TYPE = 7; // 0x7
@@ -54065,45 +54336,45 @@ package android.webkit {
field public static final int UNKNOWN_TYPE = 0; // 0x0
}
- public static abstract deprecated interface WebView.PictureListener {
- method public abstract deprecated void onNewPicture(android.webkit.WebView, android.graphics.Picture);
+ @Deprecated public static interface WebView.PictureListener {
+ method @Deprecated public void onNewPicture(android.webkit.WebView, @Nullable android.graphics.Picture);
}
- public static abstract class WebView.VisualStateCallback {
+ public abstract static class WebView.VisualStateCallback {
ctor public WebView.VisualStateCallback();
method public abstract void onComplete(long);
}
public class WebView.WebViewTransport {
ctor public WebView.WebViewTransport();
- method public synchronized android.webkit.WebView getWebView();
- method public synchronized void setWebView(android.webkit.WebView);
+ method public android.webkit.WebView getWebView();
+ method public void setWebView(android.webkit.WebView);
}
public class WebViewClient {
ctor public WebViewClient();
- method public void doUpdateVisitedHistory(android.webkit.WebView, java.lang.String, boolean);
+ method public void doUpdateVisitedHistory(android.webkit.WebView, String, boolean);
method public void onFormResubmission(android.webkit.WebView, android.os.Message, android.os.Message);
- method public void onLoadResource(android.webkit.WebView, java.lang.String);
- method public void onPageCommitVisible(android.webkit.WebView, java.lang.String);
- method public void onPageFinished(android.webkit.WebView, java.lang.String);
- method public void onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
+ method public void onLoadResource(android.webkit.WebView, String);
+ method public void onPageCommitVisible(android.webkit.WebView, String);
+ method public void onPageFinished(android.webkit.WebView, String);
+ method public void onPageStarted(android.webkit.WebView, String, android.graphics.Bitmap);
method public void onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest);
- method public deprecated void onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String);
+ method @Deprecated public void onReceivedError(android.webkit.WebView, int, String, String);
method public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
- method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String);
+ method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, String, String);
method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse);
- method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
+ method public void onReceivedLoginRequest(android.webkit.WebView, String, @Nullable String, String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public boolean onRenderProcessGone(android.webkit.WebView, android.webkit.RenderProcessGoneDetail);
method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onScaleChanged(android.webkit.WebView, float, float);
- method public deprecated void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
+ method @Deprecated public void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
method public void onUnhandledKeyEvent(android.webkit.WebView, android.view.KeyEvent);
- method public deprecated android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebView, java.lang.String);
- method public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebView, android.webkit.WebResourceRequest);
+ method @Deprecated @Nullable public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebView, String);
+ method @Nullable public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebView, android.webkit.WebResourceRequest);
method public boolean shouldOverrideKeyEvent(android.webkit.WebView, android.view.KeyEvent);
- method public deprecated boolean shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String);
+ method @Deprecated public boolean shouldOverrideUrlLoading(android.webkit.WebView, String);
method public boolean shouldOverrideUrlLoading(android.webkit.WebView, android.webkit.WebResourceRequest);
field public static final int ERROR_AUTHENTICATION = -4; // 0xfffffffc
field public static final int ERROR_BAD_URL = -12; // 0xfffffff4
@@ -54129,41 +54400,51 @@ package android.webkit {
}
public abstract class WebViewDatabase {
- ctor public deprecated WebViewDatabase();
- method public abstract deprecated void clearFormData();
+ ctor @Deprecated public WebViewDatabase();
+ method @Deprecated public abstract void clearFormData();
method public abstract void clearHttpAuthUsernamePassword();
- method public abstract deprecated void clearUsernamePassword();
- method public abstract java.lang.String[] getHttpAuthUsernamePassword(java.lang.String, java.lang.String);
+ method @Deprecated public abstract void clearUsernamePassword();
+ method @Nullable public abstract String[] getHttpAuthUsernamePassword(String, String);
method public static android.webkit.WebViewDatabase getInstance(android.content.Context);
- method public abstract deprecated boolean hasFormData();
+ method @Deprecated public abstract boolean hasFormData();
method public abstract boolean hasHttpAuthUsernamePassword();
- method public abstract deprecated boolean hasUsernamePassword();
- method public abstract void setHttpAuthUsernamePassword(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method @Deprecated public abstract boolean hasUsernamePassword();
+ method public abstract void setHttpAuthUsernamePassword(String, String, String, String);
}
- public deprecated class WebViewFragment extends android.app.Fragment {
- ctor public WebViewFragment();
- method public android.webkit.WebView getWebView();
+ @Deprecated public class WebViewFragment extends android.app.Fragment {
+ ctor @Deprecated public WebViewFragment();
+ method @Deprecated public android.webkit.WebView getWebView();
+ }
+
+ public abstract class WebViewRenderer {
+ method public abstract boolean terminate();
+ }
+
+ public abstract class WebViewRendererClient {
+ ctor public WebViewRendererClient();
+ method public abstract void onRendererResponsive(@NonNull android.webkit.WebView, @Nullable android.webkit.WebViewRenderer);
+ method public abstract void onRendererUnresponsive(@NonNull android.webkit.WebView, @Nullable android.webkit.WebViewRenderer);
}
}
package android.widget {
- public abstract class AbsListView extends android.widget.AdapterView implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener {
+ public abstract class AbsListView extends android.widget.AdapterView<android.widget.ListAdapter> implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener {
ctor public AbsListView(android.content.Context);
ctor public AbsListView(android.content.Context, android.util.AttributeSet);
ctor public AbsListView(android.content.Context, android.util.AttributeSet, int);
ctor public AbsListView(android.content.Context, android.util.AttributeSet, int, int);
method public void afterTextChanged(android.text.Editable);
- method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
+ method public void beforeTextChanged(CharSequence, int, int, int);
method public boolean canScrollList(int);
method public void clearChoices();
method public void clearTextFilter();
method public void deferNotifyDataSetChanged();
method public void fling(int);
method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet);
- method public int getCacheColorHint();
+ method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getCacheColorHint();
method public int getCheckedItemCount();
method public long[] getCheckedItemIds();
method public int getCheckedItemPosition();
@@ -54173,21 +54454,21 @@ package android.widget {
method public int getListPaddingLeft();
method public int getListPaddingRight();
method public int getListPaddingTop();
- method public android.view.View getSelectedView();
+ method @android.view.ViewDebug.ExportedProperty public android.view.View getSelectedView();
method public android.graphics.drawable.Drawable getSelector();
- method public java.lang.CharSequence getTextFilter();
+ method public CharSequence getTextFilter();
method public int getTranscriptMode();
method protected void handleDataChanged();
method public boolean hasTextFilter();
method public void invalidateViews();
method public boolean isFastScrollAlwaysVisible();
- method public boolean isFastScrollEnabled();
+ method @android.view.ViewDebug.ExportedProperty public boolean isFastScrollEnabled();
method protected boolean isInFilterMode();
method public boolean isItemChecked(int);
- method public boolean isScrollingCacheEnabled();
- method public boolean isSmoothScrollbarEnabled();
- method public boolean isStackFromBottom();
- method public boolean isTextFilterEnabled();
+ method @android.view.ViewDebug.ExportedProperty public boolean isScrollingCacheEnabled();
+ method @android.view.ViewDebug.ExportedProperty public boolean isSmoothScrollbarEnabled();
+ method @android.view.ViewDebug.ExportedProperty public boolean isStackFromBottom();
+ method @android.view.ViewDebug.ExportedProperty public boolean isTextFilterEnabled();
method protected void layoutChildren();
method public void onFilterComplete(int);
method public void onGlobalLayout();
@@ -54196,20 +54477,20 @@ package android.widget {
method public void onRemoteAdapterDisconnected();
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
- method public void onTextChanged(java.lang.CharSequence, int, int, int);
+ method public void onTextChanged(CharSequence, int, int, int);
method public void onTouchModeChanged(boolean);
method public int pointToPosition(int, int);
method public long pointToRowId(int, int);
method public void reclaimViews(java.util.List<android.view.View>);
method public void scrollListBy(int);
method public void setAdapter(android.widget.ListAdapter);
- method public void setCacheColorHint(int);
+ method public void setCacheColorHint(@ColorInt int);
method public void setChoiceMode(int);
method public void setDrawSelectorOnTop(boolean);
method public void setFastScrollAlwaysVisible(boolean);
method public void setFastScrollEnabled(boolean);
method public void setFastScrollStyle(int);
- method public void setFilterText(java.lang.String);
+ method public void setFilterText(String);
method public void setFriction(float);
method public void setItemChecked(int, boolean);
method public void setMultiChoiceModeListener(android.widget.AbsListView.MultiChoiceModeListener);
@@ -54219,7 +54500,7 @@ package android.widget {
method public void setScrollIndicators(android.view.View, android.view.View);
method public void setScrollingCacheEnabled(boolean);
method public void setSelectionFromTop(int, int);
- method public void setSelector(int);
+ method public void setSelector(@DrawableRes int);
method public void setSelector(android.graphics.drawable.Drawable);
method public void setSmoothScrollbarEnabled(boolean);
method public void setStackFromBottom(boolean);
@@ -54231,7 +54512,7 @@ package android.widget {
method public void smoothScrollToPosition(int, int);
method public void smoothScrollToPositionFromTop(int, int, int);
method public void smoothScrollToPositionFromTop(int, int);
- method public boolean verifyDrawable(android.graphics.drawable.Drawable);
+ method public boolean verifyDrawable(@NonNull android.graphics.drawable.Drawable);
field public static final int CHOICE_MODE_MULTIPLE = 2; // 0x2
field public static final int CHOICE_MODE_MULTIPLE_MODAL = 3; // 0x3
field public static final int CHOICE_MODE_NONE = 0; // 0x0
@@ -54248,24 +54529,24 @@ package android.widget {
ctor public AbsListView.LayoutParams(android.view.ViewGroup.LayoutParams);
}
- public static abstract interface AbsListView.MultiChoiceModeListener implements android.view.ActionMode.Callback {
- method public abstract void onItemCheckedStateChanged(android.view.ActionMode, int, long, boolean);
+ public static interface AbsListView.MultiChoiceModeListener extends android.view.ActionMode.Callback {
+ method public void onItemCheckedStateChanged(android.view.ActionMode, int, long, boolean);
}
- public static abstract interface AbsListView.OnScrollListener {
- method public abstract void onScroll(android.widget.AbsListView, int, int, int);
- method public abstract void onScrollStateChanged(android.widget.AbsListView, int);
+ public static interface AbsListView.OnScrollListener {
+ method public void onScroll(android.widget.AbsListView, int, int, int);
+ method public void onScrollStateChanged(android.widget.AbsListView, int);
field public static final int SCROLL_STATE_FLING = 2; // 0x2
field public static final int SCROLL_STATE_IDLE = 0; // 0x0
field public static final int SCROLL_STATE_TOUCH_SCROLL = 1; // 0x1
}
- public static abstract interface AbsListView.RecyclerListener {
- method public abstract void onMovedToScrapHeap(android.view.View);
+ public static interface AbsListView.RecyclerListener {
+ method public void onMovedToScrapHeap(android.view.View);
}
- public static abstract interface AbsListView.SelectionBoundsAdjuster {
- method public abstract void adjustListItemSelectionBounds(android.graphics.Rect);
+ public static interface AbsListView.SelectionBoundsAdjuster {
+ method public void adjustListItemSelectionBounds(android.graphics.Rect);
}
public abstract class AbsSeekBar extends android.widget.ProgressBar {
@@ -54277,23 +54558,23 @@ package android.widget {
method public boolean getSplitTrack();
method public android.graphics.drawable.Drawable getThumb();
method public int getThumbOffset();
- method public android.content.res.ColorStateList getThumbTintList();
- method public android.graphics.PorterDuff.Mode getThumbTintMode();
+ method @Nullable public android.content.res.ColorStateList getThumbTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getThumbTintMode();
method public android.graphics.drawable.Drawable getTickMark();
- method public android.content.res.ColorStateList getTickMarkTintList();
- method public android.graphics.PorterDuff.Mode getTickMarkTintMode();
+ method @Nullable public android.content.res.ColorStateList getTickMarkTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getTickMarkTintMode();
method public void setKeyProgressIncrement(int);
method public void setSplitTrack(boolean);
method public void setThumb(android.graphics.drawable.Drawable);
method public void setThumbOffset(int);
- method public void setThumbTintList(android.content.res.ColorStateList);
- method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
+ method public void setThumbTintList(@Nullable android.content.res.ColorStateList);
+ method public void setThumbTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setTickMark(android.graphics.drawable.Drawable);
- method public void setTickMarkTintList(android.content.res.ColorStateList);
- method public void setTickMarkTintMode(android.graphics.PorterDuff.Mode);
+ method public void setTickMarkTintList(@Nullable android.content.res.ColorStateList);
+ method public void setTickMarkTintMode(@Nullable android.graphics.PorterDuff.Mode);
}
- public abstract class AbsSpinner extends android.widget.AdapterView {
+ public abstract class AbsSpinner extends android.widget.AdapterView<android.widget.SpinnerAdapter> {
ctor public AbsSpinner(android.content.Context);
ctor public AbsSpinner(android.content.Context, android.util.AttributeSet);
ctor public AbsSpinner(android.content.Context, android.util.AttributeSet, int);
@@ -54308,20 +54589,20 @@ package android.widget {
method public void setSelection(int);
}
- public deprecated class AbsoluteLayout extends android.view.ViewGroup {
- ctor public AbsoluteLayout(android.content.Context);
- ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet);
- ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int);
- ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int, int);
+ @Deprecated @android.widget.RemoteViews.RemoteView public class AbsoluteLayout extends android.view.ViewGroup {
+ ctor @Deprecated public AbsoluteLayout(android.content.Context);
+ ctor @Deprecated public AbsoluteLayout(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int, int);
}
- public static class AbsoluteLayout.LayoutParams extends android.view.ViewGroup.LayoutParams {
- ctor public AbsoluteLayout.LayoutParams(int, int, int, int);
- ctor public AbsoluteLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
- ctor public AbsoluteLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
- method public java.lang.String debug(java.lang.String);
- field public int x;
- field public int y;
+ @Deprecated public static class AbsoluteLayout.LayoutParams extends android.view.ViewGroup.LayoutParams {
+ ctor @Deprecated public AbsoluteLayout.LayoutParams(int, int, int, int);
+ ctor @Deprecated public AbsoluteLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public AbsoluteLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ method @Deprecated public String debug(String);
+ field @Deprecated public int x;
+ field @Deprecated public int y;
}
public class ActionMenuView extends android.widget.LinearLayout {
@@ -54332,15 +54613,15 @@ package android.widget {
method public android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
method protected android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public android.view.Menu getMenu();
- method public android.graphics.drawable.Drawable getOverflowIcon();
+ method @Nullable public android.graphics.drawable.Drawable getOverflowIcon();
method public int getPopupTheme();
method public boolean hideOverflowMenu();
method public boolean isOverflowMenuShowing();
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onDetachedFromWindow();
method public void setOnMenuItemClickListener(android.widget.ActionMenuView.OnMenuItemClickListener);
- method public void setOverflowIcon(android.graphics.drawable.Drawable);
- method public void setPopupTheme(int);
+ method public void setOverflowIcon(@Nullable android.graphics.drawable.Drawable);
+ method public void setPopupTheme(@StyleRes int);
method public boolean showOverflowMenu();
}
@@ -54351,22 +54632,22 @@ package android.widget {
ctor public ActionMenuView.LayoutParams(int, int);
}
- public static abstract interface ActionMenuView.OnMenuItemClickListener {
- method public abstract boolean onMenuItemClick(android.view.MenuItem);
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem);
}
- public abstract interface Adapter {
- method public default java.lang.CharSequence[] getAutofillOptions();
- method public abstract int getCount();
- method public abstract java.lang.Object getItem(int);
- method public abstract long getItemId(int);
- method public abstract int getItemViewType(int);
- method public abstract android.view.View getView(int, android.view.View, android.view.ViewGroup);
- method public abstract int getViewTypeCount();
- method public abstract boolean hasStableIds();
- method public abstract boolean isEmpty();
- method public abstract void registerDataSetObserver(android.database.DataSetObserver);
- method public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
+ public interface Adapter {
+ method @Nullable public default CharSequence[] getAutofillOptions();
+ method public int getCount();
+ method public Object getItem(int);
+ method public long getItemId(int);
+ method public int getItemViewType(int);
+ method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
+ method public int getViewTypeCount();
+ method public boolean hasStableIds();
+ method public boolean isEmpty();
+ method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void unregisterDataSetObserver(android.database.DataSetObserver);
field public static final int IGNORE_ITEM_VIEW_TYPE = -1; // 0xffffffff
field public static final int NO_SELECTION = -2147483648; // 0x80000000
}
@@ -54377,26 +54658,26 @@ package android.widget {
ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
ctor public AdapterView(android.content.Context, android.util.AttributeSet, int, int);
method public abstract T getAdapter();
- method public int getCount();
+ method @android.view.ViewDebug.CapturedViewProperty public int getCount();
method public android.view.View getEmptyView();
method public int getFirstVisiblePosition();
- method public java.lang.Object getItemAtPosition(int);
+ method public Object getItemAtPosition(int);
method public long getItemIdAtPosition(int);
method public int getLastVisiblePosition();
- method public final android.widget.AdapterView.OnItemClickListener getOnItemClickListener();
+ method @Nullable public final android.widget.AdapterView.OnItemClickListener getOnItemClickListener();
method public final android.widget.AdapterView.OnItemLongClickListener getOnItemLongClickListener();
- method public final android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener();
+ method @Nullable public final android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener();
method public int getPositionForView(android.view.View);
- method public java.lang.Object getSelectedItem();
- method public long getSelectedItemId();
- method public int getSelectedItemPosition();
+ method public Object getSelectedItem();
+ method @android.view.ViewDebug.CapturedViewProperty public long getSelectedItemId();
+ method @android.view.ViewDebug.CapturedViewProperty public int getSelectedItemPosition();
method public abstract android.view.View getSelectedView();
method public boolean performItemClick(android.view.View, int, long);
method public abstract void setAdapter(T);
method public void setEmptyView(android.view.View);
- method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
+ method public void setOnItemClickListener(@Nullable android.widget.AdapterView.OnItemClickListener);
method public void setOnItemLongClickListener(android.widget.AdapterView.OnItemLongClickListener);
- method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+ method public void setOnItemSelectedListener(@Nullable android.widget.AdapterView.OnItemSelectedListener);
method public abstract void setSelection(int);
field public static final int INVALID_POSITION = -1; // 0xffffffff
field public static final long INVALID_ROW_ID = -9223372036854775808L; // 0x8000000000000000L
@@ -54411,20 +54692,20 @@ package android.widget {
field public android.view.View targetView;
}
- public static abstract interface AdapterView.OnItemClickListener {
- method public abstract void onItemClick(android.widget.AdapterView<?>, android.view.View, int, long);
+ public static interface AdapterView.OnItemClickListener {
+ method public void onItemClick(android.widget.AdapterView<?>, android.view.View, int, long);
}
- public static abstract interface AdapterView.OnItemLongClickListener {
- method public abstract boolean onItemLongClick(android.widget.AdapterView<?>, android.view.View, int, long);
+ public static interface AdapterView.OnItemLongClickListener {
+ method public boolean onItemLongClick(android.widget.AdapterView<?>, android.view.View, int, long);
}
- public static abstract interface AdapterView.OnItemSelectedListener {
- method public abstract void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
- method public abstract void onNothingSelected(android.widget.AdapterView<?>);
+ public static interface AdapterView.OnItemSelectedListener {
+ method public void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
+ method public void onNothingSelected(android.widget.AdapterView<?>);
}
- public abstract class AdapterViewAnimator extends android.widget.AdapterView implements android.widget.Advanceable {
+ public abstract class AdapterViewAnimator extends android.widget.AdapterView<android.widget.Adapter> implements android.widget.Advanceable {
ctor public AdapterViewAnimator(android.content.Context);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet, int);
@@ -54455,7 +54736,7 @@ package android.widget {
method public void showPrevious();
}
- public class AdapterViewFlipper extends android.widget.AdapterViewAnimator {
+ @android.widget.RemoteViews.RemoteView public class AdapterViewFlipper extends android.widget.AdapterViewAnimator {
ctor public AdapterViewFlipper(android.content.Context);
ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet);
ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet, int);
@@ -54469,56 +54750,56 @@ package android.widget {
method public void stopFlipping();
}
- public abstract interface Advanceable {
- method public abstract void advance();
- method public abstract void fyiWillBeAdvancedByHostKThx();
+ public interface Advanceable {
+ method public void advance();
+ method public void fyiWillBeAdvancedByHostKThx();
}
public class AlphabetIndexer extends android.database.DataSetObserver implements android.widget.SectionIndexer {
- ctor public AlphabetIndexer(android.database.Cursor, int, java.lang.CharSequence);
- method protected int compare(java.lang.String, java.lang.String);
+ ctor public AlphabetIndexer(android.database.Cursor, int, CharSequence);
+ method protected int compare(String, String);
method public int getPositionForSection(int);
method public int getSectionForPosition(int);
- method public java.lang.Object[] getSections();
+ method public Object[] getSections();
method public void setCursor(android.database.Cursor);
- field protected java.lang.CharSequence mAlphabet;
+ field protected CharSequence mAlphabet;
field protected int mColumnIndex;
field protected android.database.Cursor mDataCursor;
}
- public deprecated class AnalogClock extends android.view.View {
- ctor public AnalogClock(android.content.Context);
- ctor public AnalogClock(android.content.Context, android.util.AttributeSet);
- ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int);
- ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
+ @Deprecated @android.widget.RemoteViews.RemoteView public class AnalogClock extends android.view.View {
+ ctor @Deprecated public AnalogClock(android.content.Context);
+ ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
}
public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
- ctor public ArrayAdapter(android.content.Context, int);
- ctor public ArrayAdapter(android.content.Context, int, int);
- ctor public ArrayAdapter(android.content.Context, int, T[]);
- ctor public ArrayAdapter(android.content.Context, int, int, T[]);
- ctor public ArrayAdapter(android.content.Context, int, java.util.List<T>);
- ctor public ArrayAdapter(android.content.Context, int, int, java.util.List<T>);
- method public void add(T);
- method public void addAll(java.util.Collection<? extends T>);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int, @IdRes int);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int, @NonNull T[]);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int, @IdRes int, @NonNull T[]);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int, @NonNull java.util.List<T>);
+ ctor public ArrayAdapter(@NonNull android.content.Context, @LayoutRes int, @IdRes int, @NonNull java.util.List<T>);
+ method public void add(@Nullable T);
+ method public void addAll(@NonNull java.util.Collection<? extends T>);
method public void addAll(T...);
method public void clear();
- method public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(android.content.Context, int, int);
- method public android.content.Context getContext();
+ method @NonNull public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(@NonNull android.content.Context, @ArrayRes int, @LayoutRes int);
+ method @NonNull public android.content.Context getContext();
method public int getCount();
- method public android.content.res.Resources.Theme getDropDownViewTheme();
- method public android.widget.Filter getFilter();
- method public T getItem(int);
+ method @Nullable public android.content.res.Resources.Theme getDropDownViewTheme();
+ method @NonNull public android.widget.Filter getFilter();
+ method @Nullable public T getItem(int);
method public long getItemId(int);
- method public int getPosition(T);
- method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
- method public void insert(T, int);
- method public void remove(T);
- method public void setDropDownViewResource(int);
- method public void setDropDownViewTheme(android.content.res.Resources.Theme);
+ method public int getPosition(@Nullable T);
+ method @NonNull public android.view.View getView(int, @Nullable android.view.View, @NonNull android.view.ViewGroup);
+ method public void insert(@Nullable T, int);
+ method public void remove(@Nullable T);
+ method public void setDropDownViewResource(@LayoutRes int);
+ method public void setDropDownViewTheme(@Nullable android.content.res.Resources.Theme);
method public void setNotifyOnChange(boolean);
- method public void sort(java.util.Comparator<? super T>);
+ method public void sort(@NonNull java.util.Comparator<? super T>);
}
public class AutoCompleteTextView extends android.widget.EditText implements android.widget.Filter.FilterListener {
@@ -54528,11 +54809,11 @@ package android.widget {
ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet, int, int);
ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
method public void clearListSelection();
- method protected java.lang.CharSequence convertSelectionToString(java.lang.Object);
+ method protected CharSequence convertSelectionToString(Object);
method public void dismissDropDown();
method public boolean enoughToFilter();
method public android.widget.ListAdapter getAdapter();
- method public java.lang.CharSequence getCompletionHint();
+ method public CharSequence getCompletionHint();
method public int getDropDownAnchor();
method public android.graphics.drawable.Drawable getDropDownBackground();
method public int getDropDownHeight();
@@ -54540,8 +54821,8 @@ package android.widget {
method public int getDropDownVerticalOffset();
method public int getDropDownWidth();
method protected android.widget.Filter getFilter();
- method public deprecated android.widget.AdapterView.OnItemClickListener getItemClickListener();
- method public deprecated android.widget.AdapterView.OnItemSelectedListener getItemSelectedListener();
+ method @Deprecated public android.widget.AdapterView.OnItemClickListener getItemClickListener();
+ method @Deprecated public android.widget.AdapterView.OnItemSelectedListener getItemSelectedListener();
method public int getListSelection();
method public android.widget.AdapterView.OnItemClickListener getOnItemClickListener();
method public android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener();
@@ -54551,14 +54832,14 @@ package android.widget {
method public boolean isPopupShowing();
method public void onFilterComplete(int);
method public void performCompletion();
- method protected void performFiltering(java.lang.CharSequence, int);
+ method protected void performFiltering(CharSequence, int);
method public void performValidation();
- method protected void replaceText(java.lang.CharSequence);
+ method protected void replaceText(CharSequence);
method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T);
- method public void setCompletionHint(java.lang.CharSequence);
+ method public void setCompletionHint(CharSequence);
method public void setDropDownAnchor(int);
method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setDropDownBackgroundResource(int);
+ method public void setDropDownBackgroundResource(@DrawableRes int);
method public void setDropDownHeight(int);
method public void setDropDownHorizontalOffset(int);
method public void setDropDownVerticalOffset(int);
@@ -54567,19 +54848,19 @@ package android.widget {
method public void setOnDismissListener(android.widget.AutoCompleteTextView.OnDismissListener);
method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
- method public void setText(java.lang.CharSequence, boolean);
+ method public void setText(CharSequence, boolean);
method public void setThreshold(int);
method public void setValidator(android.widget.AutoCompleteTextView.Validator);
method public void showDropDown();
}
- public static abstract interface AutoCompleteTextView.OnDismissListener {
- method public abstract void onDismiss();
+ public static interface AutoCompleteTextView.OnDismissListener {
+ method public void onDismiss();
}
- public static abstract interface AutoCompleteTextView.Validator {
- method public abstract java.lang.CharSequence fixText(java.lang.CharSequence);
- method public abstract boolean isValid(java.lang.CharSequence);
+ public static interface AutoCompleteTextView.Validator {
+ method public CharSequence fixText(CharSequence);
+ method public boolean isValid(CharSequence);
}
public abstract class BaseAdapter implements android.widget.ListAdapter android.widget.SpinnerAdapter {
@@ -54594,7 +54875,7 @@ package android.widget {
method public void notifyDataSetChanged();
method public void notifyDataSetInvalidated();
method public void registerDataSetObserver(android.database.DataSetObserver);
- method public void setAutofillOptions(java.lang.CharSequence...);
+ method public void setAutofillOptions(@Nullable java.lang.CharSequence...);
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
@@ -54616,7 +54897,7 @@ package android.widget {
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
- public class Button extends android.widget.TextView {
+ @android.widget.RemoteViews.RemoteView public class Button extends android.widget.TextView {
ctor public Button(android.content.Context);
ctor public Button(android.content.Context, android.util.AttributeSet);
ctor public Button(android.content.Context, android.util.AttributeSet, int);
@@ -54624,45 +54905,45 @@ package android.widget {
}
public class CalendarView extends android.widget.FrameLayout {
- ctor public CalendarView(android.content.Context);
- ctor public CalendarView(android.content.Context, android.util.AttributeSet);
- ctor public CalendarView(android.content.Context, android.util.AttributeSet, int);
- ctor public CalendarView(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public CalendarView(@NonNull android.content.Context);
+ ctor public CalendarView(@NonNull android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public CalendarView(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int);
+ ctor public CalendarView(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int, @StyleRes int);
method public long getDate();
- method public int getDateTextAppearance();
+ method @StyleRes public int getDateTextAppearance();
method public int getFirstDayOfWeek();
- method public deprecated int getFocusedMonthDateColor();
+ method @Deprecated @ColorInt public int getFocusedMonthDateColor();
method public long getMaxDate();
method public long getMinDate();
- method public deprecated android.graphics.drawable.Drawable getSelectedDateVerticalBar();
- method public deprecated int getSelectedWeekBackgroundColor();
- method public deprecated boolean getShowWeekNumber();
- method public deprecated int getShownWeekCount();
- method public deprecated int getUnfocusedMonthDateColor();
- method public int getWeekDayTextAppearance();
- method public deprecated int getWeekNumberColor();
- method public deprecated int getWeekSeparatorLineColor();
+ method @Deprecated public android.graphics.drawable.Drawable getSelectedDateVerticalBar();
+ method @Deprecated @ColorInt public int getSelectedWeekBackgroundColor();
+ method @Deprecated public boolean getShowWeekNumber();
+ method @Deprecated public int getShownWeekCount();
+ method @Deprecated @ColorInt public int getUnfocusedMonthDateColor();
+ method @StyleRes public int getWeekDayTextAppearance();
+ method @Deprecated @ColorInt public int getWeekNumberColor();
+ method @Deprecated @ColorInt public int getWeekSeparatorLineColor();
method public void setDate(long);
method public void setDate(long, boolean, boolean);
- method public void setDateTextAppearance(int);
+ method public void setDateTextAppearance(@StyleRes int);
method public void setFirstDayOfWeek(int);
- method public deprecated void setFocusedMonthDateColor(int);
+ method @Deprecated public void setFocusedMonthDateColor(@ColorInt int);
method public void setMaxDate(long);
method public void setMinDate(long);
method public void setOnDateChangeListener(android.widget.CalendarView.OnDateChangeListener);
- method public deprecated void setSelectedDateVerticalBar(int);
- method public deprecated void setSelectedDateVerticalBar(android.graphics.drawable.Drawable);
- method public deprecated void setSelectedWeekBackgroundColor(int);
- method public deprecated void setShowWeekNumber(boolean);
- method public deprecated void setShownWeekCount(int);
- method public deprecated void setUnfocusedMonthDateColor(int);
- method public void setWeekDayTextAppearance(int);
- method public deprecated void setWeekNumberColor(int);
- method public deprecated void setWeekSeparatorLineColor(int);
+ method @Deprecated public void setSelectedDateVerticalBar(@DrawableRes int);
+ method @Deprecated public void setSelectedDateVerticalBar(android.graphics.drawable.Drawable);
+ method @Deprecated public void setSelectedWeekBackgroundColor(@ColorInt int);
+ method @Deprecated public void setShowWeekNumber(boolean);
+ method @Deprecated public void setShownWeekCount(int);
+ method @Deprecated public void setUnfocusedMonthDateColor(@ColorInt int);
+ method public void setWeekDayTextAppearance(@StyleRes int);
+ method @Deprecated public void setWeekNumberColor(@ColorInt int);
+ method @Deprecated public void setWeekSeparatorLineColor(@ColorInt int);
}
- public static abstract interface CalendarView.OnDateChangeListener {
- method public abstract void onSelectedDayChange(android.widget.CalendarView, int, int, int);
+ public static interface CalendarView.OnDateChangeListener {
+ method public void onSelectedDayChange(@NonNull android.widget.CalendarView, int, int, int);
}
public class CheckBox extends android.widget.CompoundButton {
@@ -54672,10 +54953,10 @@ package android.widget {
ctor public CheckBox(android.content.Context, android.util.AttributeSet, int, int);
}
- public abstract interface Checkable {
- method public abstract boolean isChecked();
- method public abstract void setChecked(boolean);
- method public abstract void toggle();
+ public interface Checkable {
+ method public boolean isChecked();
+ method public void setChecked(boolean);
+ method public void toggle();
}
public class CheckedTextView extends android.widget.TextView implements android.widget.Checkable {
@@ -54684,37 +54965,37 @@ package android.widget {
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int);
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int, int);
method public android.graphics.drawable.Drawable getCheckMarkDrawable();
- method public android.content.res.ColorStateList getCheckMarkTintList();
- method public android.graphics.PorterDuff.Mode getCheckMarkTintMode();
- method public boolean isChecked();
- method public void setCheckMarkDrawable(int);
- method public void setCheckMarkDrawable(android.graphics.drawable.Drawable);
- method public void setCheckMarkTintList(android.content.res.ColorStateList);
- method public void setCheckMarkTintMode(android.graphics.PorterDuff.Mode);
+ method @Nullable public android.content.res.ColorStateList getCheckMarkTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getCheckMarkTintMode();
+ method @android.view.ViewDebug.ExportedProperty public boolean isChecked();
+ method public void setCheckMarkDrawable(@DrawableRes int);
+ method public void setCheckMarkDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setCheckMarkTintList(@Nullable android.content.res.ColorStateList);
+ method public void setCheckMarkTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setChecked(boolean);
method public void toggle();
}
- public class Chronometer extends android.widget.TextView {
+ @android.widget.RemoteViews.RemoteView public class Chronometer extends android.widget.TextView {
ctor public Chronometer(android.content.Context);
ctor public Chronometer(android.content.Context, android.util.AttributeSet);
ctor public Chronometer(android.content.Context, android.util.AttributeSet, int);
ctor public Chronometer(android.content.Context, android.util.AttributeSet, int, int);
method public long getBase();
- method public java.lang.String getFormat();
+ method public String getFormat();
method public android.widget.Chronometer.OnChronometerTickListener getOnChronometerTickListener();
method public boolean isCountDown();
method public boolean isTheFinalCountDown();
method public void setBase(long);
method public void setCountDown(boolean);
- method public void setFormat(java.lang.String);
+ method public void setFormat(String);
method public void setOnChronometerTickListener(android.widget.Chronometer.OnChronometerTickListener);
method public void start();
method public void stop();
}
- public static abstract interface Chronometer.OnChronometerTickListener {
- method public abstract void onChronometerTick(android.widget.Chronometer);
+ public static interface Chronometer.OnChronometerTickListener {
+ method public void onChronometerTick(android.widget.Chronometer);
}
public abstract class CompoundButton extends android.widget.Button implements android.widget.Checkable {
@@ -54722,47 +55003,47 @@ package android.widget {
ctor public CompoundButton(android.content.Context, android.util.AttributeSet);
ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int);
ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int, int);
- method public android.graphics.drawable.Drawable getButtonDrawable();
- method public android.content.res.ColorStateList getButtonTintList();
- method public android.graphics.PorterDuff.Mode getButtonTintMode();
- method public boolean isChecked();
- method public void setButtonDrawable(int);
- method public void setButtonDrawable(android.graphics.drawable.Drawable);
- method public void setButtonTintList(android.content.res.ColorStateList);
- method public void setButtonTintMode(android.graphics.PorterDuff.Mode);
+ method @Nullable public android.graphics.drawable.Drawable getButtonDrawable();
+ method @Nullable public android.content.res.ColorStateList getButtonTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getButtonTintMode();
+ method @android.view.ViewDebug.ExportedProperty public boolean isChecked();
+ method public void setButtonDrawable(@DrawableRes int);
+ method public void setButtonDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setButtonTintList(@Nullable android.content.res.ColorStateList);
+ method public void setButtonTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setChecked(boolean);
- method public void setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener);
+ method public void setOnCheckedChangeListener(@Nullable android.widget.CompoundButton.OnCheckedChangeListener);
method public void toggle();
}
- public static abstract interface CompoundButton.OnCheckedChangeListener {
- method public abstract void onCheckedChanged(android.widget.CompoundButton, boolean);
+ public static interface CompoundButton.OnCheckedChangeListener {
+ method public void onCheckedChanged(android.widget.CompoundButton, boolean);
}
public abstract class CursorAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
- ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
+ ctor @Deprecated public CursorAdapter(android.content.Context, android.database.Cursor);
ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
method public void changeCursor(android.database.Cursor);
- method public java.lang.CharSequence convertToString(android.database.Cursor);
+ method public CharSequence convertToString(android.database.Cursor);
method public int getCount();
method public android.database.Cursor getCursor();
method public android.content.res.Resources.Theme getDropDownViewTheme();
method public android.widget.Filter getFilter();
method public android.widget.FilterQueryProvider getFilterQueryProvider();
- method public java.lang.Object getItem(int);
+ method public Object getItem(int);
method public long getItemId(int);
method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
- method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
+ method @Deprecated protected void init(android.content.Context, android.database.Cursor, boolean);
method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
method protected void onContentChanged();
- method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
+ method @WorkerThread public android.database.Cursor runQueryOnBackgroundThread(CharSequence);
method public void setDropDownViewTheme(android.content.res.Resources.Theme);
method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
method public android.database.Cursor swapCursor(android.database.Cursor);
- field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
+ field @Deprecated public static final int FLAG_AUTO_REQUERY = 1; // 0x1
field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
}
@@ -54772,7 +55053,7 @@ package android.widget {
method protected abstract void bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean);
method protected abstract void bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean);
method public void changeCursor(android.database.Cursor);
- method public java.lang.String convertToString(android.database.Cursor);
+ method public String convertToString(android.database.Cursor);
method public android.database.Cursor getChild(int, int);
method public long getChildId(int, int);
method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
@@ -54790,7 +55071,7 @@ package android.widget {
method protected abstract android.view.View newChildView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
method protected abstract android.view.View newGroupView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
method public void notifyDataSetChanged(boolean);
- method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
+ method public android.database.Cursor runQueryOnBackgroundThread(CharSequence);
method public void setChildrenCursor(int, android.database.Cursor);
method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
method public void setGroupCursor(android.database.Cursor);
@@ -54801,69 +55082,69 @@ package android.widget {
ctor public DatePicker(android.content.Context, android.util.AttributeSet);
ctor public DatePicker(android.content.Context, android.util.AttributeSet, int);
ctor public DatePicker(android.content.Context, android.util.AttributeSet, int, int);
- method public deprecated android.widget.CalendarView getCalendarView();
- method public deprecated boolean getCalendarViewShown();
+ method @Deprecated public android.widget.CalendarView getCalendarView();
+ method @Deprecated public boolean getCalendarViewShown();
method public int getDayOfMonth();
method public int getFirstDayOfWeek();
method public long getMaxDate();
method public long getMinDate();
method public int getMonth();
- method public deprecated boolean getSpinnersShown();
+ method @Deprecated public boolean getSpinnersShown();
method public int getYear();
method public void init(int, int, int, android.widget.DatePicker.OnDateChangedListener);
- method public deprecated void setCalendarViewShown(boolean);
+ method @Deprecated public void setCalendarViewShown(boolean);
method public void setFirstDayOfWeek(int);
method public void setMaxDate(long);
method public void setMinDate(long);
method public void setOnDateChangedListener(android.widget.DatePicker.OnDateChangedListener);
- method public deprecated void setSpinnersShown(boolean);
+ method @Deprecated public void setSpinnersShown(boolean);
method public void updateDate(int, int, int);
}
- public static abstract interface DatePicker.OnDateChangedListener {
- method public abstract void onDateChanged(android.widget.DatePicker, int, int, int);
- }
-
- public deprecated class DialerFilter extends android.widget.RelativeLayout {
- ctor public DialerFilter(android.content.Context);
- ctor public DialerFilter(android.content.Context, android.util.AttributeSet);
- method public void append(java.lang.String);
- method public void clearText();
- method public java.lang.CharSequence getDigits();
- method public java.lang.CharSequence getFilterText();
- method public java.lang.CharSequence getLetters();
- method public int getMode();
- method public boolean isQwertyKeyboard();
- method protected void onModeChange(int, int);
- method public void removeFilterWatcher(android.text.TextWatcher);
- method public void setDigitsWatcher(android.text.TextWatcher);
- method public void setFilterWatcher(android.text.TextWatcher);
- method public void setLettersWatcher(android.text.TextWatcher);
- method public void setMode(int);
- field public static final int DIGITS_AND_LETTERS = 1; // 0x1
- field public static final int DIGITS_AND_LETTERS_NO_DIGITS = 2; // 0x2
- field public static final int DIGITS_AND_LETTERS_NO_LETTERS = 3; // 0x3
- field public static final int DIGITS_ONLY = 4; // 0x4
- field public static final int LETTERS_ONLY = 5; // 0x5
+ public static interface DatePicker.OnDateChangedListener {
+ method public void onDateChanged(android.widget.DatePicker, int, int, int);
}
- public deprecated class DigitalClock extends android.widget.TextView {
- ctor public DigitalClock(android.content.Context);
- ctor public DigitalClock(android.content.Context, android.util.AttributeSet);
+ @Deprecated public class DialerFilter extends android.widget.RelativeLayout {
+ ctor @Deprecated public DialerFilter(android.content.Context);
+ ctor @Deprecated public DialerFilter(android.content.Context, android.util.AttributeSet);
+ method @Deprecated public void append(String);
+ method @Deprecated public void clearText();
+ method @Deprecated public CharSequence getDigits();
+ method @Deprecated public CharSequence getFilterText();
+ method @Deprecated public CharSequence getLetters();
+ method @Deprecated public int getMode();
+ method @Deprecated public boolean isQwertyKeyboard();
+ method @Deprecated protected void onModeChange(int, int);
+ method @Deprecated public void removeFilterWatcher(android.text.TextWatcher);
+ method @Deprecated public void setDigitsWatcher(android.text.TextWatcher);
+ method @Deprecated public void setFilterWatcher(android.text.TextWatcher);
+ method @Deprecated public void setLettersWatcher(android.text.TextWatcher);
+ method @Deprecated public void setMode(int);
+ field @Deprecated public static final int DIGITS_AND_LETTERS = 1; // 0x1
+ field @Deprecated public static final int DIGITS_AND_LETTERS_NO_DIGITS = 2; // 0x2
+ field @Deprecated public static final int DIGITS_AND_LETTERS_NO_LETTERS = 3; // 0x3
+ field @Deprecated public static final int DIGITS_ONLY = 4; // 0x4
+ field @Deprecated public static final int LETTERS_ONLY = 5; // 0x5
+ }
+
+ @Deprecated public class DigitalClock extends android.widget.TextView {
+ ctor @Deprecated public DigitalClock(android.content.Context);
+ ctor @Deprecated public DigitalClock(android.content.Context, android.util.AttributeSet);
}
public class EdgeEffect {
ctor public EdgeEffect(android.content.Context);
method public boolean draw(android.graphics.Canvas);
method public void finish();
- method public int getColor();
+ method @ColorInt public int getColor();
method public int getMaxHeight();
method public boolean isFinished();
method public void onAbsorb(int);
method public void onPull(float);
method public void onPull(float, float);
method public void onRelease();
- method public void setColor(int);
+ method public void setColor(@ColorInt int);
method public void setSize(int, int);
}
@@ -54879,25 +55160,25 @@ package android.widget {
method public void setSelection(int);
}
- public abstract interface ExpandableListAdapter {
- method public abstract boolean areAllItemsEnabled();
- method public abstract java.lang.Object getChild(int, int);
- method public abstract long getChildId(int, int);
- method public abstract android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
- method public abstract int getChildrenCount(int);
- method public abstract long getCombinedChildId(long, long);
- method public abstract long getCombinedGroupId(long);
- method public abstract java.lang.Object getGroup(int);
- method public abstract int getGroupCount();
- method public abstract long getGroupId(int);
- method public abstract android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
- method public abstract boolean hasStableIds();
- method public abstract boolean isChildSelectable(int, int);
- method public abstract boolean isEmpty();
- method public abstract void onGroupCollapsed(int);
- method public abstract void onGroupExpanded(int);
- method public abstract void registerDataSetObserver(android.database.DataSetObserver);
- method public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
+ public interface ExpandableListAdapter {
+ method public boolean areAllItemsEnabled();
+ method public Object getChild(int, int);
+ method public long getChildId(int, int);
+ method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
+ method public int getChildrenCount(int);
+ method public long getCombinedChildId(long, long);
+ method public long getCombinedGroupId(long);
+ method public Object getGroup(int);
+ method public int getGroupCount();
+ method public long getGroupId(int);
+ method public android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
+ method public boolean hasStableIds();
+ method public boolean isChildSelectable(int, int);
+ method public boolean isEmpty();
+ method public void onGroupCollapsed(int);
+ method public void onGroupExpanded(int);
+ method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
public class ExpandableListView extends android.widget.ListView {
@@ -54947,97 +55228,97 @@ package android.widget {
field public android.view.View targetView;
}
- public static abstract interface ExpandableListView.OnChildClickListener {
- method public abstract boolean onChildClick(android.widget.ExpandableListView, android.view.View, int, int, long);
+ public static interface ExpandableListView.OnChildClickListener {
+ method public boolean onChildClick(android.widget.ExpandableListView, android.view.View, int, int, long);
}
- public static abstract interface ExpandableListView.OnGroupClickListener {
- method public abstract boolean onGroupClick(android.widget.ExpandableListView, android.view.View, int, long);
+ public static interface ExpandableListView.OnGroupClickListener {
+ method public boolean onGroupClick(android.widget.ExpandableListView, android.view.View, int, long);
}
- public static abstract interface ExpandableListView.OnGroupCollapseListener {
- method public abstract void onGroupCollapse(int);
+ public static interface ExpandableListView.OnGroupCollapseListener {
+ method public void onGroupCollapse(int);
}
- public static abstract interface ExpandableListView.OnGroupExpandListener {
- method public abstract void onGroupExpand(int);
+ public static interface ExpandableListView.OnGroupExpandListener {
+ method public void onGroupExpand(int);
}
public abstract class Filter {
ctor public Filter();
- method public java.lang.CharSequence convertResultToString(java.lang.Object);
- method public final void filter(java.lang.CharSequence);
- method public final void filter(java.lang.CharSequence, android.widget.Filter.FilterListener);
- method protected abstract android.widget.Filter.FilterResults performFiltering(java.lang.CharSequence);
- method protected abstract void publishResults(java.lang.CharSequence, android.widget.Filter.FilterResults);
+ method public CharSequence convertResultToString(Object);
+ method public final void filter(CharSequence);
+ method public final void filter(CharSequence, android.widget.Filter.FilterListener);
+ method protected abstract android.widget.Filter.FilterResults performFiltering(CharSequence);
+ method protected abstract void publishResults(CharSequence, android.widget.Filter.FilterResults);
}
- public static abstract interface Filter.FilterListener {
- method public abstract void onFilterComplete(int);
+ public static interface Filter.FilterListener {
+ method public void onFilterComplete(int);
}
protected static class Filter.FilterResults {
ctor public Filter.FilterResults();
field public int count;
- field public java.lang.Object values;
+ field public Object values;
}
- public abstract interface FilterQueryProvider {
- method public abstract android.database.Cursor runQuery(java.lang.CharSequence);
+ public interface FilterQueryProvider {
+ method public android.database.Cursor runQuery(CharSequence);
}
- public abstract interface Filterable {
- method public abstract android.widget.Filter getFilter();
+ public interface Filterable {
+ method public android.widget.Filter getFilter();
}
- public class FrameLayout extends android.view.ViewGroup {
- ctor public FrameLayout(android.content.Context);
- ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
- ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
- ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+ @android.widget.RemoteViews.RemoteView public class FrameLayout extends android.view.ViewGroup {
+ ctor public FrameLayout(@NonNull android.content.Context);
+ ctor public FrameLayout(@NonNull android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public FrameLayout(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int);
+ ctor public FrameLayout(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int, @StyleRes int);
method protected android.widget.FrameLayout.LayoutParams generateDefaultLayoutParams();
method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
- method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
+ method @Deprecated public boolean getConsiderGoneChildrenWhenMeasuring();
method public boolean getMeasureAllChildren();
method public void setMeasureAllChildren(boolean);
}
public static class FrameLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
- ctor public FrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor public FrameLayout.LayoutParams(@NonNull android.content.Context, @Nullable android.util.AttributeSet);
ctor public FrameLayout.LayoutParams(int, int);
ctor public FrameLayout.LayoutParams(int, int, int);
- ctor public FrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
- ctor public FrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
- ctor public FrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+ ctor public FrameLayout.LayoutParams(@NonNull android.view.ViewGroup.LayoutParams);
+ ctor public FrameLayout.LayoutParams(@NonNull android.view.ViewGroup.MarginLayoutParams);
+ ctor public FrameLayout.LayoutParams(@NonNull android.widget.FrameLayout.LayoutParams);
field public static final int UNSPECIFIED_GRAVITY = -1; // 0xffffffff
field public int gravity;
}
- public deprecated class Gallery extends android.widget.AbsSpinner implements android.view.GestureDetector.OnGestureListener {
- ctor public Gallery(android.content.Context);
- ctor public Gallery(android.content.Context, android.util.AttributeSet);
- ctor public Gallery(android.content.Context, android.util.AttributeSet, int);
- ctor public Gallery(android.content.Context, android.util.AttributeSet, int, int);
- method public boolean onDown(android.view.MotionEvent);
- method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onLongPress(android.view.MotionEvent);
- method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onShowPress(android.view.MotionEvent);
- method public boolean onSingleTapUp(android.view.MotionEvent);
- method public void setAnimationDuration(int);
- method public void setCallbackDuringFling(boolean);
- method public void setGravity(int);
- method public void setSpacing(int);
- method public void setUnselectedAlpha(float);
+ @Deprecated public class Gallery extends android.widget.AbsSpinner implements android.view.GestureDetector.OnGestureListener {
+ ctor @Deprecated public Gallery(android.content.Context);
+ ctor @Deprecated public Gallery(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public Gallery(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public Gallery(android.content.Context, android.util.AttributeSet, int, int);
+ method @Deprecated public boolean onDown(android.view.MotionEvent);
+ method @Deprecated public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
+ method @Deprecated public void onLongPress(@NonNull android.view.MotionEvent);
+ method @Deprecated public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
+ method @Deprecated public void onShowPress(android.view.MotionEvent);
+ method @Deprecated public boolean onSingleTapUp(android.view.MotionEvent);
+ method @Deprecated public void setAnimationDuration(int);
+ method @Deprecated public void setCallbackDuringFling(boolean);
+ method @Deprecated public void setGravity(int);
+ method @Deprecated public void setSpacing(int);
+ method @Deprecated public void setUnselectedAlpha(float);
}
- public static class Gallery.LayoutParams extends android.view.ViewGroup.LayoutParams {
- ctor public Gallery.LayoutParams(android.content.Context, android.util.AttributeSet);
- ctor public Gallery.LayoutParams(int, int);
- ctor public Gallery.LayoutParams(android.view.ViewGroup.LayoutParams);
+ @Deprecated public static class Gallery.LayoutParams extends android.view.ViewGroup.LayoutParams {
+ ctor @Deprecated public Gallery.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public Gallery.LayoutParams(int, int);
+ ctor @Deprecated public Gallery.LayoutParams(android.view.ViewGroup.LayoutParams);
}
- public class GridLayout extends android.view.ViewGroup {
+ @android.widget.RemoteViews.RemoteView public class GridLayout extends android.view.ViewGroup {
ctor public GridLayout(android.content.Context);
ctor public GridLayout(android.content.Context, android.util.AttributeSet);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
@@ -55083,7 +55364,7 @@ package android.widget {
field public static final int VERTICAL = 1; // 0x1
}
- public static abstract class GridLayout.Alignment {
+ public abstract static class GridLayout.Alignment {
}
public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
@@ -55101,7 +55382,7 @@ package android.widget {
public static class GridLayout.Spec {
}
- public class GridView extends android.widget.AbsListView {
+ @android.widget.RemoteViews.RemoteView public class GridView extends android.widget.AbsListView {
ctor public GridView(android.content.Context);
ctor public GridView(android.content.Context, android.util.AttributeSet);
ctor public GridView(android.content.Context, android.util.AttributeSet, int);
@@ -55110,7 +55391,7 @@ package android.widget {
method public int getColumnWidth();
method public int getGravity();
method public int getHorizontalSpacing();
- method public int getNumColumns();
+ method @android.view.ViewDebug.ExportedProperty public int getNumColumns();
method public int getRequestedColumnWidth();
method public int getRequestedHorizontalSpacing();
method public int getStretchMode();
@@ -55137,7 +55418,7 @@ package android.widget {
method public android.widget.Filter getFilter();
method public int getFootersCount();
method public int getHeadersCount();
- method public java.lang.Object getItem(int);
+ method public Object getItem(int);
method public long getItemId(int);
method public int getItemViewType(int);
method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
@@ -55152,11 +55433,11 @@ package android.widget {
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
- public abstract interface HeterogeneousExpandableList {
- method public abstract int getChildType(int, int);
- method public abstract int getChildTypeCount();
- method public abstract int getGroupType(int);
- method public abstract int getGroupTypeCount();
+ public interface HeterogeneousExpandableList {
+ method public int getChildType(int, int);
+ method public int getChildTypeCount();
+ method public int getGroupType(int);
+ method public int getGroupTypeCount();
}
public class HorizontalScrollView extends android.widget.FrameLayout {
@@ -55179,7 +55460,7 @@ package android.widget {
method public final void smoothScrollTo(int, int);
}
- public class ImageButton extends android.widget.ImageView {
+ @android.widget.RemoteViews.RemoteView public class ImageButton extends android.widget.ImageView {
ctor public ImageButton(android.content.Context);
ctor public ImageButton(android.content.Context, android.util.AttributeSet);
ctor public ImageButton(android.content.Context, android.util.AttributeSet, int);
@@ -55190,16 +55471,16 @@ package android.widget {
ctor public ImageSwitcher(android.content.Context);
ctor public ImageSwitcher(android.content.Context, android.util.AttributeSet);
method public void setImageDrawable(android.graphics.drawable.Drawable);
- method public void setImageResource(int);
+ method public void setImageResource(@DrawableRes int);
method public void setImageURI(android.net.Uri);
}
- public class ImageView extends android.view.View {
+ @android.widget.RemoteViews.RemoteView public class ImageView extends android.view.View {
ctor public ImageView(android.content.Context);
- ctor public ImageView(android.content.Context, android.util.AttributeSet);
- ctor public ImageView(android.content.Context, android.util.AttributeSet, int);
- ctor public ImageView(android.content.Context, android.util.AttributeSet, int, int);
- method public void animateTransform(android.graphics.Matrix);
+ ctor public ImageView(android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public ImageView(android.content.Context, @Nullable android.util.AttributeSet, int);
+ ctor public ImageView(android.content.Context, @Nullable android.util.AttributeSet, int, int);
+ method public void animateTransform(@Nullable android.graphics.Matrix);
method public final void clearColorFilter();
method public boolean getAdjustViewBounds();
method public boolean getBaselineAlignBottom();
@@ -55208,14 +55489,14 @@ package android.widget {
method public android.graphics.drawable.Drawable getDrawable();
method public int getImageAlpha();
method public android.graphics.Matrix getImageMatrix();
- method public android.content.res.ColorStateList getImageTintList();
- method public android.graphics.PorterDuff.Mode getImageTintMode();
+ method @Nullable public android.content.res.ColorStateList getImageTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getImageTintMode();
method public int getMaxHeight();
method public int getMaxWidth();
method public android.widget.ImageView.ScaleType getScaleType();
method public int[] onCreateDrawableState(int);
method public void setAdjustViewBounds(boolean);
- method public deprecated void setAlpha(int);
+ method @Deprecated public void setAlpha(int);
method public void setBaseline(int);
method public void setBaselineAlignBottom(boolean);
method public final void setColorFilter(int, android.graphics.PorterDuff.Mode);
@@ -55225,23 +55506,21 @@ package android.widget {
method protected boolean setFrame(int, int, int, int);
method public void setImageAlpha(int);
method public void setImageBitmap(android.graphics.Bitmap);
- method public void setImageDrawable(android.graphics.drawable.Drawable);
- method public void setImageIcon(android.graphics.drawable.Icon);
+ method public void setImageDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setImageIcon(@Nullable android.graphics.drawable.Icon);
method public void setImageLevel(int);
method public void setImageMatrix(android.graphics.Matrix);
- method public void setImageResource(int);
+ method public void setImageResource(@DrawableRes int);
method public void setImageState(int[], boolean);
- method public void setImageTintList(android.content.res.ColorStateList);
- method public void setImageTintMode(android.graphics.PorterDuff.Mode);
- method public void setImageURI(android.net.Uri);
+ method public void setImageTintList(@Nullable android.content.res.ColorStateList);
+ method public void setImageTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setImageURI(@Nullable android.net.Uri);
method public void setMaxHeight(int);
method public void setMaxWidth(int);
method public void setScaleType(android.widget.ImageView.ScaleType);
}
- public static final class ImageView.ScaleType extends java.lang.Enum {
- method public static android.widget.ImageView.ScaleType valueOf(java.lang.String);
- method public static final android.widget.ImageView.ScaleType[] values();
+ public enum ImageView.ScaleType {
enum_constant public static final android.widget.ImageView.ScaleType CENTER;
enum_constant public static final android.widget.ImageView.ScaleType CENTER_CROP;
enum_constant public static final android.widget.ImageView.ScaleType CENTER_INSIDE;
@@ -55252,10 +55531,10 @@ package android.widget {
enum_constant public static final android.widget.ImageView.ScaleType MATRIX;
}
- public class LinearLayout extends android.view.ViewGroup {
+ @android.widget.RemoteViews.RemoteView public class LinearLayout extends android.view.ViewGroup {
ctor public LinearLayout(android.content.Context);
- ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
- ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public LinearLayout(android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public LinearLayout(android.content.Context, @Nullable android.util.AttributeSet, int);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int, int);
method protected android.widget.LinearLayout.LayoutParams generateDefaultLayoutParams();
method public android.widget.LinearLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
@@ -55295,51 +55574,51 @@ package android.widget {
ctor public LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
ctor public LinearLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
ctor public LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
- method public java.lang.String debug(java.lang.String);
- field public int gravity;
- field public float weight;
+ method public String debug(String);
+ field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public float weight;
}
- public abstract interface ListAdapter implements android.widget.Adapter {
- method public abstract boolean areAllItemsEnabled();
- method public abstract boolean isEnabled(int);
+ public interface ListAdapter extends android.widget.Adapter {
+ method public boolean areAllItemsEnabled();
+ method public boolean isEnabled(int);
}
public class ListPopupWindow {
- ctor public ListPopupWindow(android.content.Context);
- ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
- ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
- ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public ListPopupWindow(@NonNull android.content.Context);
+ ctor public ListPopupWindow(@NonNull android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public ListPopupWindow(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int);
+ ctor public ListPopupWindow(@NonNull android.content.Context, @Nullable android.util.AttributeSet, @AttrRes int, @StyleRes int);
method public void clearListSelection();
method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
method public void dismiss();
- method public android.view.View getAnchorView();
- method public int getAnimationStyle();
- method public android.graphics.drawable.Drawable getBackground();
+ method @Nullable public android.view.View getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method @Nullable public android.graphics.drawable.Drawable getBackground();
method public int getHeight();
method public int getHorizontalOffset();
method public int getInputMethodMode();
- method public android.widget.ListView getListView();
+ method @Nullable public android.widget.ListView getListView();
method public int getPromptPosition();
- method public java.lang.Object getSelectedItem();
+ method @Nullable public Object getSelectedItem();
method public long getSelectedItemId();
method public int getSelectedItemPosition();
- method public android.view.View getSelectedView();
+ method @Nullable public android.view.View getSelectedView();
method public int getSoftInputMode();
method public int getVerticalOffset();
method public int getWidth();
method public boolean isInputMethodNotNeeded();
method public boolean isModal();
method public boolean isShowing();
- method public boolean onKeyDown(int, android.view.KeyEvent);
- method public boolean onKeyPreIme(int, android.view.KeyEvent);
- method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean onKeyDown(int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, @NonNull android.view.KeyEvent);
+ method public boolean onKeyUp(int, @NonNull android.view.KeyEvent);
method public boolean performItemClick(int);
method public void postShow();
- method public void setAdapter(android.widget.ListAdapter);
- method public void setAnchorView(android.view.View);
- method public void setAnimationStyle(int);
- method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setAdapter(@Nullable android.widget.ListAdapter);
+ method public void setAnchorView(@Nullable android.view.View);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(@Nullable android.graphics.drawable.Drawable);
method public void setContentWidth(int);
method public void setDropDownGravity(int);
method public void setHeight(int);
@@ -55347,11 +55626,11 @@ package android.widget {
method public void setInputMethodMode(int);
method public void setListSelector(android.graphics.drawable.Drawable);
method public void setModal(boolean);
- method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
- method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
- method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+ method public void setOnDismissListener(@Nullable android.widget.PopupWindow.OnDismissListener);
+ method public void setOnItemClickListener(@Nullable android.widget.AdapterView.OnItemClickListener);
+ method public void setOnItemSelectedListener(@Nullable android.widget.AdapterView.OnItemSelectedListener);
method public void setPromptPosition(int);
- method public void setPromptView(android.view.View);
+ method public void setPromptView(@Nullable android.view.View);
method public void setSelection(int);
method public void setSoftInputMode(int);
method public void setVerticalOffset(int);
@@ -55367,20 +55646,20 @@ package android.widget {
field public static final int WRAP_CONTENT = -2; // 0xfffffffe
}
- public class ListView extends android.widget.AbsListView {
+ @android.widget.RemoteViews.RemoteView public class ListView extends android.widget.AbsListView {
ctor public ListView(android.content.Context);
ctor public ListView(android.content.Context, android.util.AttributeSet);
ctor public ListView(android.content.Context, android.util.AttributeSet, int);
ctor public ListView(android.content.Context, android.util.AttributeSet, int, int);
- method public void addFooterView(android.view.View, java.lang.Object, boolean);
+ method public void addFooterView(android.view.View, Object, boolean);
method public void addFooterView(android.view.View);
- method public void addHeaderView(android.view.View, java.lang.Object, boolean);
+ method public void addHeaderView(android.view.View, Object, boolean);
method public void addHeaderView(android.view.View);
method public boolean areFooterDividersEnabled();
method public boolean areHeaderDividersEnabled();
method public android.widget.ListAdapter getAdapter();
- method public deprecated long[] getCheckItemIds();
- method public android.graphics.drawable.Drawable getDivider();
+ method @Deprecated public long[] getCheckItemIds();
+ method @Nullable public android.graphics.drawable.Drawable getDivider();
method public int getDividerHeight();
method public int getFooterViewsCount();
method public int getHeaderViewsCount();
@@ -55390,7 +55669,7 @@ package android.widget {
method public android.graphics.drawable.Drawable getOverscrollHeader();
method public boolean removeFooterView(android.view.View);
method public boolean removeHeaderView(android.view.View);
- method public void setDivider(android.graphics.drawable.Drawable);
+ method public void setDivider(@Nullable android.graphics.drawable.Drawable);
method public void setDividerHeight(int);
method public void setFooterDividersEnabled(boolean);
method public void setHeaderDividersEnabled(boolean);
@@ -55404,30 +55683,30 @@ package android.widget {
public class ListView.FixedViewInfo {
ctor public ListView.FixedViewInfo();
- field public java.lang.Object data;
+ field public Object data;
field public boolean isSelectable;
field public android.view.View view;
}
- public final class Magnifier {
- ctor public deprecated Magnifier(android.view.View);
+ @UiThread public final class Magnifier {
+ ctor @Deprecated public Magnifier(@NonNull android.view.View);
method public void dismiss();
- method public float getCornerRadius();
- method public int getDefaultHorizontalSourceToMagnifierOffset();
- method public int getDefaultVerticalSourceToMagnifierOffset();
- method public float getElevation();
- method public int getHeight();
- method public android.graphics.drawable.Drawable getOverlay();
- method public android.graphics.Point getPosition();
- method public int getSourceHeight();
- method public android.graphics.Point getSourcePosition();
- method public int getSourceWidth();
- method public int getWidth();
+ method @Px public float getCornerRadius();
+ method @Px public int getDefaultHorizontalSourceToMagnifierOffset();
+ method @Px public int getDefaultVerticalSourceToMagnifierOffset();
+ method @Px public float getElevation();
+ method @Px public int getHeight();
+ method @Nullable public android.graphics.drawable.Drawable getOverlay();
+ method @Nullable public android.graphics.Point getPosition();
+ method @Px public int getSourceHeight();
+ method @Nullable public android.graphics.Point getSourcePosition();
+ method @Px public int getSourceWidth();
+ method @Px public int getWidth();
method public float getZoom();
- method public boolean isForcePositionWithinWindowSystemInsetsBounds();
- method public void setZoom(float);
- method public void show(float, float);
- method public void show(float, float, float, float);
+ method public boolean isClippingEnabled();
+ method public void setZoom(@FloatRange(from=0.0f) float);
+ method public void show(@FloatRange(from=0) float, @FloatRange(from=0) float);
+ method public void show(@FloatRange(from=0) float, @FloatRange(from=0) float, float, float);
method public void update();
field public static final int SOURCE_BOUND_MAX_IN_SURFACE = 0; // 0x0
field public static final int SOURCE_BOUND_MAX_IN_VIEW = 1; // 0x1
@@ -55435,16 +55714,16 @@ package android.widget {
}
public static class Magnifier.Builder {
- ctor public Magnifier.Builder(android.view.View);
- method public android.widget.Magnifier build();
- method public android.widget.Magnifier.Builder setCornerRadius(float);
- method public android.widget.Magnifier.Builder setDefaultSourceToMagnifierOffset(int, int);
- method public android.widget.Magnifier.Builder setElevation(float);
- method public android.widget.Magnifier.Builder setForcePositionWithinWindowSystemInsetsBounds(boolean);
- method public android.widget.Magnifier.Builder setOverlay(android.graphics.drawable.Drawable);
- method public android.widget.Magnifier.Builder setSize(int, int);
- method public android.widget.Magnifier.Builder setSourceBounds(int, int, int, int);
- method public android.widget.Magnifier.Builder setZoom(float);
+ ctor public Magnifier.Builder(@NonNull android.view.View);
+ method @NonNull public android.widget.Magnifier build();
+ method @NonNull public android.widget.Magnifier.Builder setClippingEnabled(boolean);
+ method @NonNull public android.widget.Magnifier.Builder setCornerRadius(@Px @FloatRange(from=0) float);
+ method @NonNull public android.widget.Magnifier.Builder setDefaultSourceToMagnifierOffset(@Px int, @Px int);
+ method @NonNull public android.widget.Magnifier.Builder setElevation(@Px @FloatRange(from=0) float);
+ method @NonNull public android.widget.Magnifier.Builder setOverlay(@Nullable android.graphics.drawable.Drawable);
+ method @NonNull public android.widget.Magnifier.Builder setSize(@Px @IntRange(from=0) int, @Px @IntRange(from=0) int);
+ method @NonNull public android.widget.Magnifier.Builder setSourceBounds(int, int, int, int);
+ method @NonNull public android.widget.Magnifier.Builder setZoom(@FloatRange(from=0.0f) float);
}
public class MediaController extends android.widget.FrameLayout {
@@ -55461,18 +55740,18 @@ package android.widget {
method public void show(int);
}
- public static abstract interface MediaController.MediaPlayerControl {
- method public abstract boolean canPause();
- method public abstract boolean canSeekBackward();
- method public abstract boolean canSeekForward();
- method public abstract int getAudioSessionId();
- method public abstract int getBufferPercentage();
- method public abstract int getCurrentPosition();
- method public abstract int getDuration();
- method public abstract boolean isPlaying();
- method public abstract void pause();
- method public abstract void seekTo(int);
- method public abstract void start();
+ public static interface MediaController.MediaPlayerControl {
+ method public boolean canPause();
+ method public boolean canSeekBackward();
+ method public boolean canSeekForward();
+ method public int getAudioSessionId();
+ method public int getBufferPercentage();
+ method public int getCurrentPosition();
+ method public int getDuration();
+ method public boolean isPlaying();
+ method public void pause();
+ method public void seekTo(int);
+ method public void start();
}
public class MultiAutoCompleteTextView extends android.widget.AutoCompleteTextView {
@@ -55480,21 +55759,21 @@ package android.widget {
ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int, int);
- method protected void performFiltering(java.lang.CharSequence, int, int, int);
+ method protected void performFiltering(CharSequence, int, int, int);
method public void setTokenizer(android.widget.MultiAutoCompleteTextView.Tokenizer);
}
public static class MultiAutoCompleteTextView.CommaTokenizer implements android.widget.MultiAutoCompleteTextView.Tokenizer {
ctor public MultiAutoCompleteTextView.CommaTokenizer();
- method public int findTokenEnd(java.lang.CharSequence, int);
- method public int findTokenStart(java.lang.CharSequence, int);
- method public java.lang.CharSequence terminateToken(java.lang.CharSequence);
+ method public int findTokenEnd(CharSequence, int);
+ method public int findTokenStart(CharSequence, int);
+ method public CharSequence terminateToken(CharSequence);
}
- public static abstract interface MultiAutoCompleteTextView.Tokenizer {
- method public abstract int findTokenEnd(java.lang.CharSequence, int);
- method public abstract int findTokenStart(java.lang.CharSequence, int);
- method public abstract java.lang.CharSequence terminateToken(java.lang.CharSequence);
+ public static interface MultiAutoCompleteTextView.Tokenizer {
+ method public int findTokenEnd(CharSequence, int);
+ method public int findTokenStart(CharSequence, int);
+ method public CharSequence terminateToken(CharSequence);
}
public class NumberPicker extends android.widget.LinearLayout {
@@ -55502,44 +55781,44 @@ package android.widget {
ctor public NumberPicker(android.content.Context, android.util.AttributeSet);
ctor public NumberPicker(android.content.Context, android.util.AttributeSet, int);
ctor public NumberPicker(android.content.Context, android.util.AttributeSet, int, int);
- method public java.lang.String[] getDisplayedValues();
+ method public String[] getDisplayedValues();
method public int getMaxValue();
method public int getMinValue();
method public int getSelectionDividerHeight();
method public int getValue();
method public boolean getWrapSelectorWheel();
- method public void setDisplayedValues(java.lang.String[]);
+ method public void setDisplayedValues(String[]);
method public void setFormatter(android.widget.NumberPicker.Formatter);
method public void setMaxValue(int);
method public void setMinValue(int);
method public void setOnLongPressUpdateInterval(long);
method public void setOnScrollListener(android.widget.NumberPicker.OnScrollListener);
method public void setOnValueChangedListener(android.widget.NumberPicker.OnValueChangeListener);
- method public void setSelectionDividerHeight(int);
+ method public void setSelectionDividerHeight(@IntRange(from=0) @Px int);
method public void setValue(int);
method public void setWrapSelectorWheel(boolean);
}
- public static abstract interface NumberPicker.Formatter {
- method public abstract java.lang.String format(int);
+ public static interface NumberPicker.Formatter {
+ method public String format(int);
}
- public static abstract interface NumberPicker.OnScrollListener {
- method public abstract void onScrollStateChange(android.widget.NumberPicker, int);
+ public static interface NumberPicker.OnScrollListener {
+ method public void onScrollStateChange(android.widget.NumberPicker, int);
field public static final int SCROLL_STATE_FLING = 2; // 0x2
field public static final int SCROLL_STATE_IDLE = 0; // 0x0
field public static final int SCROLL_STATE_TOUCH_SCROLL = 1; // 0x1
}
- public static abstract interface NumberPicker.OnValueChangeListener {
- method public abstract void onValueChange(android.widget.NumberPicker, int, int);
+ public static interface NumberPicker.OnValueChangeListener {
+ method public void onValueChange(android.widget.NumberPicker, int, int);
}
public class OverScroller {
ctor public OverScroller(android.content.Context);
ctor public OverScroller(android.content.Context, android.view.animation.Interpolator);
- ctor public deprecated OverScroller(android.content.Context, android.view.animation.Interpolator, float, float);
- ctor public deprecated OverScroller(android.content.Context, android.view.animation.Interpolator, float, float, boolean);
+ ctor @Deprecated public OverScroller(android.content.Context, android.view.animation.Interpolator, float, float);
+ ctor @Deprecated public OverScroller(android.content.Context, android.view.animation.Interpolator, float, float, boolean);
method public void abortAnimation();
method public boolean computeScrollOffset();
method public void fling(int, int, int, int, int, int, int, int);
@@ -55571,19 +55850,19 @@ package android.widget {
method public int getGravity();
method public android.view.Menu getMenu();
method public android.view.MenuInflater getMenuInflater();
- method public void inflate(int);
+ method public void inflate(@MenuRes int);
method public void setGravity(int);
method public void setOnDismissListener(android.widget.PopupMenu.OnDismissListener);
method public void setOnMenuItemClickListener(android.widget.PopupMenu.OnMenuItemClickListener);
method public void show();
}
- public static abstract interface PopupMenu.OnDismissListener {
- method public abstract void onDismiss(android.widget.PopupMenu);
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(android.widget.PopupMenu);
}
- public static abstract interface PopupMenu.OnMenuItemClickListener {
- method public abstract boolean onMenuItemClick(android.view.MenuItem);
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem);
}
public class PopupWindow {
@@ -55601,13 +55880,13 @@ package android.widget {
method public android.graphics.drawable.Drawable getBackground();
method public android.view.View getContentView();
method public float getElevation();
- method public android.transition.Transition getEnterTransition();
- method public android.transition.Transition getExitTransition();
+ method @Nullable public android.transition.Transition getEnterTransition();
+ method @Nullable public android.transition.Transition getExitTransition();
method public int getHeight();
method public int getInputMethodMode();
- method public int getMaxAvailableHeight(android.view.View);
- method public int getMaxAvailableHeight(android.view.View, int);
- method public int getMaxAvailableHeight(android.view.View, int, boolean);
+ method public int getMaxAvailableHeight(@NonNull android.view.View);
+ method public int getMaxAvailableHeight(@NonNull android.view.View, int);
+ method public int getMaxAvailableHeight(@NonNull android.view.View, int, boolean);
method public boolean getOverlapAnchor();
method public int getSoftInputMode();
method public int getWidth();
@@ -55626,8 +55905,8 @@ package android.widget {
method public void setClippingEnabled(boolean);
method public void setContentView(android.view.View);
method public void setElevation(float);
- method public void setEnterTransition(android.transition.Transition);
- method public void setExitTransition(android.transition.Transition);
+ method public void setEnterTransition(@Nullable android.transition.Transition);
+ method public void setExitTransition(@Nullable android.transition.Transition);
method public void setFocusable(boolean);
method public void setHeight(int);
method public void setIgnoreCheekPress();
@@ -55640,7 +55919,7 @@ package android.widget {
method public void setTouchInterceptor(android.view.View.OnTouchListener);
method public void setTouchable(boolean);
method public void setWidth(int);
- method public deprecated void setWindowLayoutMode(int, int);
+ method @Deprecated public void setWindowLayoutMode(int, int);
method public void setWindowLayoutType(int);
method public void showAsDropDown(android.view.View);
method public void showAsDropDown(android.view.View, int, int);
@@ -55657,58 +55936,56 @@ package android.widget {
field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
}
- public static abstract interface PopupWindow.OnDismissListener {
- method public abstract void onDismiss();
+ public static interface PopupWindow.OnDismissListener {
+ method public void onDismiss();
}
- public class ProgressBar extends android.view.View {
+ @android.widget.RemoteViews.RemoteView public class ProgressBar extends android.view.View {
ctor public ProgressBar(android.content.Context);
ctor public ProgressBar(android.content.Context, android.util.AttributeSet);
ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int);
ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int, int);
method public android.graphics.drawable.Drawable getIndeterminateDrawable();
- method public android.content.res.ColorStateList getIndeterminateTintList();
- method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
+ method @Nullable public android.content.res.ColorStateList getIndeterminateTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
- method public synchronized int getMax();
- method public synchronized int getMin();
- method public synchronized int getProgress();
- method public android.content.res.ColorStateList getProgressBackgroundTintList();
- method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
+ method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMax();
+ method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMin();
+ method @android.view.ViewDebug.ExportedProperty(category="progress") public int getProgress();
+ method @Nullable public android.content.res.ColorStateList getProgressBackgroundTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
method public android.graphics.drawable.Drawable getProgressDrawable();
- method public android.content.res.ColorStateList getProgressTintList();
- method public android.graphics.PorterDuff.Mode getProgressTintMode();
- method public synchronized int getSecondaryProgress();
- method public android.content.res.ColorStateList getSecondaryProgressTintList();
- method public android.graphics.PorterDuff.Mode getSecondaryProgressTintMode();
- method public final synchronized void incrementProgressBy(int);
- method public final synchronized void incrementSecondaryProgressBy(int);
+ method @Nullable public android.content.res.ColorStateList getProgressTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getProgressTintMode();
+ method @android.view.ViewDebug.ExportedProperty(category="progress") public int getSecondaryProgress();
+ method @Nullable public android.content.res.ColorStateList getSecondaryProgressTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getSecondaryProgressTintMode();
+ method public final void incrementProgressBy(int);
+ method public final void incrementSecondaryProgressBy(int);
method public boolean isAnimating();
- method public synchronized boolean isIndeterminate();
- method protected synchronized void onDraw(android.graphics.Canvas);
- method protected synchronized void onMeasure(int, int);
+ method @android.view.ViewDebug.ExportedProperty(category="progress") public boolean isIndeterminate();
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
- method public synchronized void setIndeterminate(boolean);
+ method public void setIndeterminate(boolean);
method public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
method public void setIndeterminateDrawableTiled(android.graphics.drawable.Drawable);
- method public void setIndeterminateTintList(android.content.res.ColorStateList);
- method public void setIndeterminateTintMode(android.graphics.PorterDuff.Mode);
- method public void setInterpolator(android.content.Context, int);
+ method public void setIndeterminateTintList(@Nullable android.content.res.ColorStateList);
+ method public void setIndeterminateTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setInterpolator(android.content.Context, @InterpolatorRes int);
method public void setInterpolator(android.view.animation.Interpolator);
- method public synchronized void setMax(int);
- method public synchronized void setMin(int);
- method public synchronized void setProgress(int);
+ method public void setMax(int);
+ method public void setMin(int);
+ method public void setProgress(int);
method public void setProgress(int, boolean);
- method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
- method public void setProgressBackgroundTintMode(android.graphics.PorterDuff.Mode);
+ method public void setProgressBackgroundTintList(@Nullable android.content.res.ColorStateList);
+ method public void setProgressBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setProgressDrawable(android.graphics.drawable.Drawable);
method public void setProgressDrawableTiled(android.graphics.drawable.Drawable);
- method public void setProgressTintList(android.content.res.ColorStateList);
- method public void setProgressTintMode(android.graphics.PorterDuff.Mode);
- method public synchronized void setSecondaryProgress(int);
- method public void setSecondaryProgressTintList(android.content.res.ColorStateList);
- method public void setSecondaryProgressTintMode(android.graphics.PorterDuff.Mode);
+ method public void setProgressTintList(@Nullable android.content.res.ColorStateList);
+ method public void setProgressTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setSecondaryProgress(int);
+ method public void setSecondaryProgressTintList(@Nullable android.content.res.ColorStateList);
+ method public void setSecondaryProgressTintMode(@Nullable android.graphics.PorterDuff.Mode);
}
public class QuickContactBadge extends android.widget.ImageView implements android.view.View.OnClickListener {
@@ -55716,18 +55993,18 @@ package android.widget {
ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet);
ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet, int);
ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet, int, int);
- method public void assignContactFromEmail(java.lang.String, boolean);
- method public void assignContactFromEmail(java.lang.String, boolean, android.os.Bundle);
- method public void assignContactFromPhone(java.lang.String, boolean);
- method public void assignContactFromPhone(java.lang.String, boolean, android.os.Bundle);
+ method public void assignContactFromEmail(String, boolean);
+ method public void assignContactFromEmail(String, boolean, android.os.Bundle);
+ method public void assignContactFromPhone(String, boolean);
+ method public void assignContactFromPhone(String, boolean, android.os.Bundle);
method public void assignContactUri(android.net.Uri);
method public void onClick(android.view.View);
- method public void setExcludeMimes(java.lang.String[]);
+ method public void setExcludeMimes(String[]);
method public void setImageToDefault();
method public void setMode(int);
method public void setOverlay(android.graphics.drawable.Drawable);
- method public void setPrioritizedMimeType(java.lang.String);
- field protected java.lang.String[] mExcludeMimes;
+ method public void setPrioritizedMimeType(String);
+ field protected String[] mExcludeMimes;
}
public class RadioButton extends android.widget.CompoundButton {
@@ -55740,10 +56017,10 @@ package android.widget {
public class RadioGroup extends android.widget.LinearLayout {
ctor public RadioGroup(android.content.Context);
ctor public RadioGroup(android.content.Context, android.util.AttributeSet);
- method public void check(int);
+ method public void check(@IdRes int);
method public void clearCheck();
method public android.widget.RadioGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
- method public int getCheckedRadioButtonId();
+ method @IdRes public int getCheckedRadioButtonId();
method public void setOnCheckedChangeListener(android.widget.RadioGroup.OnCheckedChangeListener);
}
@@ -55755,8 +56032,8 @@ package android.widget {
ctor public RadioGroup.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
}
- public static abstract interface RadioGroup.OnCheckedChangeListener {
- method public abstract void onCheckedChanged(android.widget.RadioGroup, int);
+ public static interface RadioGroup.OnCheckedChangeListener {
+ method public void onCheckedChanged(android.widget.RadioGroup, @IdRes int);
}
public class RatingBar extends android.widget.AbsSeekBar {
@@ -55776,11 +56053,11 @@ package android.widget {
method public void setStepSize(float);
}
- public static abstract interface RatingBar.OnRatingBarChangeListener {
- method public abstract void onRatingChanged(android.widget.RatingBar, float, boolean);
+ public static interface RatingBar.OnRatingBarChangeListener {
+ method public void onRatingChanged(android.widget.RatingBar, float, boolean);
}
- public class RelativeLayout extends android.view.ViewGroup {
+ @android.widget.RemoteViews.RemoteView public class RelativeLayout extends android.view.ViewGroup {
ctor public RelativeLayout(android.content.Context);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
@@ -55824,91 +56101,91 @@ package android.widget {
ctor public RelativeLayout.LayoutParams(android.widget.RelativeLayout.LayoutParams);
method public void addRule(int);
method public void addRule(int, int);
- method public java.lang.String debug(java.lang.String);
+ method public String debug(String);
method public int getRule(int);
method public int[] getRules();
method public void removeRule(int);
- field public boolean alignWithParent;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public boolean alignWithParent;
}
public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
- ctor public RemoteViews(java.lang.String, int);
+ ctor public RemoteViews(String, int);
ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
ctor public RemoteViews(android.widget.RemoteViews);
ctor public RemoteViews(android.os.Parcel);
method public void addView(int, android.widget.RemoteViews);
method public android.view.View apply(android.content.Context, android.view.ViewGroup);
- method public deprecated android.widget.RemoteViews clone();
+ method @Deprecated public android.widget.RemoteViews clone();
method public int describeContents();
method public int getLayoutId();
- method public java.lang.String getPackage();
- method public boolean onLoadClass(java.lang.Class);
+ method public String getPackage();
+ method public boolean onLoadClass(Class);
method public void reapply(android.content.Context, android.view.View);
method public void removeAllViews(int);
method public void setAccessibilityTraversalAfter(int, int);
method public void setAccessibilityTraversalBefore(int, int);
- method public void setBitmap(int, java.lang.String, android.graphics.Bitmap);
- method public void setBoolean(int, java.lang.String, boolean);
- method public void setBundle(int, java.lang.String, android.os.Bundle);
- method public void setByte(int, java.lang.String, byte);
- method public void setChar(int, java.lang.String, char);
- method public void setCharSequence(int, java.lang.String, java.lang.CharSequence);
- method public void setChronometer(int, long, java.lang.String, boolean);
+ method public void setBitmap(int, String, android.graphics.Bitmap);
+ method public void setBoolean(int, String, boolean);
+ method public void setBundle(int, String, android.os.Bundle);
+ method public void setByte(int, String, byte);
+ method public void setChar(int, String, char);
+ method public void setCharSequence(int, String, CharSequence);
+ method public void setChronometer(int, long, String, boolean);
method public void setChronometerCountDown(int, boolean);
- method public void setContentDescription(int, java.lang.CharSequence);
+ method public void setContentDescription(int, CharSequence);
method public void setDisplayedChild(int, int);
- method public void setDouble(int, java.lang.String, double);
+ method public void setDouble(int, String, double);
method public void setEmptyView(int, int);
- method public void setFloat(int, java.lang.String, float);
- method public void setIcon(int, java.lang.String, android.graphics.drawable.Icon);
+ method public void setFloat(int, String, float);
+ method public void setIcon(int, String, android.graphics.drawable.Icon);
method public void setImageViewBitmap(int, android.graphics.Bitmap);
method public void setImageViewIcon(int, android.graphics.drawable.Icon);
method public void setImageViewResource(int, int);
method public void setImageViewUri(int, android.net.Uri);
- method public void setInt(int, java.lang.String, int);
- method public void setIntent(int, java.lang.String, android.content.Intent);
+ method public void setInt(int, String, int);
+ method public void setIntent(int, String, android.content.Intent);
method public void setLabelFor(int, int);
- method public void setLightBackgroundLayoutId(int);
- method public void setLong(int, java.lang.String, long);
+ method public void setLightBackgroundLayoutId(@LayoutRes int);
+ method public void setLong(int, String, long);
method public void setOnClickFillInIntent(int, android.content.Intent);
method public void setOnClickPendingIntent(int, android.app.PendingIntent);
method public void setOnClickResponse(int, android.widget.RemoteViews.RemoteResponse);
method public void setPendingIntentTemplate(int, android.app.PendingIntent);
method public void setProgressBar(int, int, int, boolean);
method public void setRelativeScrollPosition(int, int);
- method public deprecated void setRemoteAdapter(int, int, android.content.Intent);
+ method @Deprecated public void setRemoteAdapter(int, int, android.content.Intent);
method public void setRemoteAdapter(int, android.content.Intent);
method public void setScrollPosition(int, int);
- method public void setShort(int, java.lang.String, short);
- method public void setString(int, java.lang.String, java.lang.String);
- method public void setTextColor(int, int);
+ method public void setShort(int, String, short);
+ method public void setString(int, String, String);
+ method public void setTextColor(int, @ColorInt int);
method public void setTextViewCompoundDrawables(int, int, int, int, int);
method public void setTextViewCompoundDrawablesRelative(int, int, int, int, int);
- method public void setTextViewText(int, java.lang.CharSequence);
+ method public void setTextViewText(int, CharSequence);
method public void setTextViewTextSize(int, int, float);
- method public void setUri(int, java.lang.String, android.net.Uri);
+ method public void setUri(int, String, android.net.Uri);
method public void setViewPadding(int, int, int, int, int);
method public void setViewVisibility(int, int);
method public void showNext(int);
method public void showPrevious(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.widget.RemoteViews> CREATOR;
- field public static final java.lang.String EXTRA_SHARED_ELEMENT_BOUNDS = "android.widget.extra.SHARED_ELEMENT_BOUNDS";
+ field public static final String EXTRA_SHARED_ELEMENT_BOUNDS = "android.widget.extra.SHARED_ELEMENT_BOUNDS";
}
public static class RemoteViews.ActionException extends java.lang.RuntimeException {
- ctor public RemoteViews.ActionException(java.lang.Exception);
- ctor public RemoteViews.ActionException(java.lang.String);
+ ctor public RemoteViews.ActionException(Exception);
+ ctor public RemoteViews.ActionException(String);
}
public static class RemoteViews.RemoteResponse {
ctor public RemoteViews.RemoteResponse();
- method public android.widget.RemoteViews.RemoteResponse addSharedElement(int, java.lang.String);
+ method public android.widget.RemoteViews.RemoteResponse addSharedElement(int, String);
method public static android.widget.RemoteViews.RemoteResponse fromFillInIntent(android.content.Intent);
method public static android.widget.RemoteViews.RemoteResponse fromPendingIntent(android.app.PendingIntent);
}
- public static abstract class RemoteViews.RemoteView implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface RemoteViews.RemoteView {
}
public abstract class RemoteViewsService extends android.app.Service {
@@ -55917,20 +56194,20 @@ package android.widget {
method public abstract android.widget.RemoteViewsService.RemoteViewsFactory onGetViewFactory(android.content.Intent);
}
- public static abstract interface RemoteViewsService.RemoteViewsFactory {
- method public abstract int getCount();
- method public abstract long getItemId(int);
- method public abstract android.widget.RemoteViews getLoadingView();
- method public abstract android.widget.RemoteViews getViewAt(int);
- method public abstract int getViewTypeCount();
- method public abstract boolean hasStableIds();
- method public abstract void onCreate();
- method public abstract void onDataSetChanged();
- method public abstract void onDestroy();
+ public static interface RemoteViewsService.RemoteViewsFactory {
+ method public int getCount();
+ method public long getItemId(int);
+ method public android.widget.RemoteViews getLoadingView();
+ method public android.widget.RemoteViews getViewAt(int);
+ method public int getViewTypeCount();
+ method public boolean hasStableIds();
+ method public void onCreate();
+ method public void onDataSetChanged();
+ method public void onDestroy();
}
public abstract class ResourceCursorAdapter extends android.widget.CursorAdapter {
- ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
+ ctor @Deprecated public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
@@ -56000,8 +56277,8 @@ package android.widget {
method public int getImeOptions();
method public int getInputType();
method public int getMaxWidth();
- method public java.lang.CharSequence getQuery();
- method public java.lang.CharSequence getQueryHint();
+ method public CharSequence getQuery();
+ method @Nullable public CharSequence getQueryHint();
method public android.widget.CursorAdapter getSuggestionsAdapter();
method public boolean isIconfiedByDefault();
method public boolean isIconified();
@@ -56019,32 +56296,32 @@ package android.widget {
method public void setOnQueryTextListener(android.widget.SearchView.OnQueryTextListener);
method public void setOnSearchClickListener(android.view.View.OnClickListener);
method public void setOnSuggestionListener(android.widget.SearchView.OnSuggestionListener);
- method public void setQuery(java.lang.CharSequence, boolean);
- method public void setQueryHint(java.lang.CharSequence);
+ method public void setQuery(CharSequence, boolean);
+ method public void setQueryHint(@Nullable CharSequence);
method public void setQueryRefinementEnabled(boolean);
method public void setSearchableInfo(android.app.SearchableInfo);
method public void setSubmitButtonEnabled(boolean);
method public void setSuggestionsAdapter(android.widget.CursorAdapter);
}
- public static abstract interface SearchView.OnCloseListener {
- method public abstract boolean onClose();
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
}
- public static abstract interface SearchView.OnQueryTextListener {
- method public abstract boolean onQueryTextChange(java.lang.String);
- method public abstract boolean onQueryTextSubmit(java.lang.String);
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String);
+ method public boolean onQueryTextSubmit(String);
}
- public static abstract interface SearchView.OnSuggestionListener {
- method public abstract boolean onSuggestionClick(int);
- method public abstract boolean onSuggestionSelect(int);
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
}
- public abstract interface SectionIndexer {
- method public abstract int getPositionForSection(int);
- method public abstract int getSectionForPosition(int);
- method public abstract java.lang.Object[] getSections();
+ public interface SectionIndexer {
+ method public int getPositionForSection(int);
+ method public int getSectionForPosition(int);
+ method public Object[] getSections();
}
public class SeekBar extends android.widget.AbsSeekBar {
@@ -56055,31 +56332,31 @@ package android.widget {
method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener);
}
- public static abstract interface SeekBar.OnSeekBarChangeListener {
- method public abstract void onProgressChanged(android.widget.SeekBar, int, boolean);
- method public abstract void onStartTrackingTouch(android.widget.SeekBar);
- method public abstract void onStopTrackingTouch(android.widget.SeekBar);
+ public static interface SeekBar.OnSeekBarChangeListener {
+ method public void onProgressChanged(android.widget.SeekBar, int, boolean);
+ method public void onStartTrackingTouch(android.widget.SeekBar);
+ method public void onStopTrackingTouch(android.widget.SeekBar);
}
public class ShareActionProvider extends android.view.ActionProvider {
ctor public ShareActionProvider(android.content.Context);
method public android.view.View onCreateActionView();
method public void setOnShareTargetSelectedListener(android.widget.ShareActionProvider.OnShareTargetSelectedListener);
- method public void setShareHistoryFileName(java.lang.String);
+ method public void setShareHistoryFileName(String);
method public void setShareIntent(android.content.Intent);
- field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
}
- public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
- method public abstract boolean onShareTargetSelected(android.widget.ShareActionProvider, android.content.Intent);
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(android.widget.ShareActionProvider, android.content.Intent);
}
public class SimpleAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
- ctor public SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String, ?>>, int, java.lang.String[], int[]);
+ ctor public SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, @LayoutRes int, String[], @IdRes int[]);
method public int getCount();
method public android.content.res.Resources.Theme getDropDownViewTheme();
method public android.widget.Filter getFilter();
- method public java.lang.Object getItem(int);
+ method public Object getItem(int);
method public long getItemId(int);
method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
method public android.widget.SimpleAdapter.ViewBinder getViewBinder();
@@ -56087,62 +56364,62 @@ package android.widget {
method public void setDropDownViewTheme(android.content.res.Resources.Theme);
method public void setViewBinder(android.widget.SimpleAdapter.ViewBinder);
method public void setViewImage(android.widget.ImageView, int);
- method public void setViewImage(android.widget.ImageView, java.lang.String);
- method public void setViewText(android.widget.TextView, java.lang.String);
+ method public void setViewImage(android.widget.ImageView, String);
+ method public void setViewText(android.widget.TextView, String);
}
- public static abstract interface SimpleAdapter.ViewBinder {
- method public abstract boolean setViewValue(android.view.View, java.lang.Object, java.lang.String);
+ public static interface SimpleAdapter.ViewBinder {
+ method public boolean setViewValue(android.view.View, Object, String);
}
public class SimpleCursorAdapter extends android.widget.ResourceCursorAdapter {
- ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
- ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
+ ctor @Deprecated public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, String[], int[]);
+ ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, String[], int[], int);
method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
- method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
+ method public void changeCursorAndColumns(android.database.Cursor, String[], int[]);
method public android.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
method public int getStringConversionColumn();
method public android.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
method public void setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter);
method public void setStringConversionColumn(int);
method public void setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder);
- method public void setViewImage(android.widget.ImageView, java.lang.String);
- method public void setViewText(android.widget.TextView, java.lang.String);
+ method public void setViewImage(android.widget.ImageView, String);
+ method public void setViewText(android.widget.TextView, String);
}
- public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
- method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
+ public static interface SimpleCursorAdapter.CursorToStringConverter {
+ method public CharSequence convertToString(android.database.Cursor);
}
- public static abstract interface SimpleCursorAdapter.ViewBinder {
- method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
+ public static interface SimpleCursorAdapter.ViewBinder {
+ method public boolean setViewValue(android.view.View, android.database.Cursor, int);
}
public abstract class SimpleCursorTreeAdapter extends android.widget.ResourceCursorTreeAdapter {
- ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, java.lang.String[], int[], int, int, java.lang.String[], int[]);
- ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, java.lang.String[], int[], int, java.lang.String[], int[]);
- ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, java.lang.String[], int[], int, java.lang.String[], int[]);
+ ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, String[], int[], int, int, String[], int[]);
+ ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, String[], int[], int, String[], int[]);
+ ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, String[], int[], int, String[], int[]);
method protected void bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean);
method protected void bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean);
method public android.widget.SimpleCursorTreeAdapter.ViewBinder getViewBinder();
method public void setViewBinder(android.widget.SimpleCursorTreeAdapter.ViewBinder);
- method protected void setViewImage(android.widget.ImageView, java.lang.String);
- method public void setViewText(android.widget.TextView, java.lang.String);
+ method protected void setViewImage(android.widget.ImageView, String);
+ method public void setViewText(android.widget.TextView, String);
}
- public static abstract interface SimpleCursorTreeAdapter.ViewBinder {
- method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
+ public static interface SimpleCursorTreeAdapter.ViewBinder {
+ method public boolean setViewValue(android.view.View, android.database.Cursor, int);
}
public class SimpleExpandableListAdapter extends android.widget.BaseExpandableListAdapter {
- ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String, ?>>, int, java.lang.String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String, ?>>>, int, java.lang.String[], int[]);
- ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String, ?>>, int, int, java.lang.String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String, ?>>>, int, java.lang.String[], int[]);
- ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String, ?>>, int, int, java.lang.String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String, ?>>>, int, int, java.lang.String[], int[]);
- method public java.lang.Object getChild(int, int);
+ ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, String[], int[]);
+ ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, String[], int[]);
+ ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, int, String[], int[]);
+ method public Object getChild(int, int);
method public long getChildId(int, int);
method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
method public int getChildrenCount(int);
- method public java.lang.Object getGroup(int);
+ method public Object getGroup(int);
method public int getGroupCount();
method public long getGroupId(int);
method public android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
@@ -56152,40 +56429,40 @@ package android.widget {
method public android.view.View newGroupView(boolean, android.view.ViewGroup);
}
- public deprecated class SlidingDrawer extends android.view.ViewGroup {
- ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet);
- ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet, int);
- ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet, int, int);
- method public void animateClose();
- method public void animateOpen();
- method public void animateToggle();
- method public void close();
- method public android.view.View getContent();
- method public android.view.View getHandle();
- method public boolean isMoving();
- method public boolean isOpened();
- method public void lock();
- method public void open();
- method public void setOnDrawerCloseListener(android.widget.SlidingDrawer.OnDrawerCloseListener);
- method public void setOnDrawerOpenListener(android.widget.SlidingDrawer.OnDrawerOpenListener);
- method public void setOnDrawerScrollListener(android.widget.SlidingDrawer.OnDrawerScrollListener);
- method public void toggle();
- method public void unlock();
- field public static final int ORIENTATION_HORIZONTAL = 0; // 0x0
- field public static final int ORIENTATION_VERTICAL = 1; // 0x1
+ @Deprecated public class SlidingDrawer extends android.view.ViewGroup {
+ ctor @Deprecated public SlidingDrawer(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public SlidingDrawer(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public SlidingDrawer(android.content.Context, android.util.AttributeSet, int, int);
+ method @Deprecated public void animateClose();
+ method @Deprecated public void animateOpen();
+ method @Deprecated public void animateToggle();
+ method @Deprecated public void close();
+ method @Deprecated public android.view.View getContent();
+ method @Deprecated public android.view.View getHandle();
+ method @Deprecated public boolean isMoving();
+ method @Deprecated public boolean isOpened();
+ method @Deprecated public void lock();
+ method @Deprecated public void open();
+ method @Deprecated public void setOnDrawerCloseListener(android.widget.SlidingDrawer.OnDrawerCloseListener);
+ method @Deprecated public void setOnDrawerOpenListener(android.widget.SlidingDrawer.OnDrawerOpenListener);
+ method @Deprecated public void setOnDrawerScrollListener(android.widget.SlidingDrawer.OnDrawerScrollListener);
+ method @Deprecated public void toggle();
+ method @Deprecated public void unlock();
+ field @Deprecated public static final int ORIENTATION_HORIZONTAL = 0; // 0x0
+ field @Deprecated public static final int ORIENTATION_VERTICAL = 1; // 0x1
}
- public static abstract interface SlidingDrawer.OnDrawerCloseListener {
- method public abstract void onDrawerClosed();
+ @Deprecated public static interface SlidingDrawer.OnDrawerCloseListener {
+ method @Deprecated public void onDrawerClosed();
}
- public static abstract interface SlidingDrawer.OnDrawerOpenListener {
- method public abstract void onDrawerOpened();
+ @Deprecated public static interface SlidingDrawer.OnDrawerOpenListener {
+ method @Deprecated public void onDrawerOpened();
}
- public static abstract interface SlidingDrawer.OnDrawerScrollListener {
- method public abstract void onScrollEnded();
- method public abstract void onScrollStarted();
+ @Deprecated public static interface SlidingDrawer.OnDrawerScrollListener {
+ method @Deprecated public void onScrollEnded();
+ method @Deprecated public void onScrollStarted();
}
public final class Space extends android.view.View {
@@ -56209,25 +56486,25 @@ package android.widget {
method public int getGravity();
method public android.graphics.drawable.Drawable getPopupBackground();
method public android.content.Context getPopupContext();
- method public java.lang.CharSequence getPrompt();
+ method public CharSequence getPrompt();
method public void onClick(android.content.DialogInterface, int);
method public void setDropDownHorizontalOffset(int);
method public void setDropDownVerticalOffset(int);
method public void setDropDownWidth(int);
method public void setGravity(int);
method public void setPopupBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setPopupBackgroundResource(int);
- method public void setPrompt(java.lang.CharSequence);
+ method public void setPopupBackgroundResource(@DrawableRes int);
+ method public void setPrompt(CharSequence);
method public void setPromptId(int);
field public static final int MODE_DIALOG = 0; // 0x0
field public static final int MODE_DROPDOWN = 1; // 0x1
}
- public abstract interface SpinnerAdapter implements android.widget.Adapter {
- method public abstract android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);
+ public interface SpinnerAdapter extends android.widget.Adapter {
+ method public android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);
}
- public class StackView extends android.widget.AdapterViewAnimator {
+ @android.widget.RemoteViews.RemoteView public class StackView extends android.widget.AdapterViewAnimator {
ctor public StackView(android.content.Context);
ctor public StackView(android.content.Context, android.util.AttributeSet);
ctor public StackView(android.content.Context, android.util.AttributeSet, int);
@@ -56243,34 +56520,34 @@ package android.widget {
method public boolean getSplitTrack();
method public int getSwitchMinWidth();
method public int getSwitchPadding();
- method public java.lang.CharSequence getTextOff();
- method public java.lang.CharSequence getTextOn();
+ method public CharSequence getTextOff();
+ method public CharSequence getTextOn();
method public android.graphics.drawable.Drawable getThumbDrawable();
method public int getThumbTextPadding();
- method public android.content.res.ColorStateList getThumbTintList();
- method public android.graphics.PorterDuff.Mode getThumbTintMode();
+ method @Nullable public android.content.res.ColorStateList getThumbTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getThumbTintMode();
method public android.graphics.drawable.Drawable getTrackDrawable();
- method public android.content.res.ColorStateList getTrackTintList();
- method public android.graphics.PorterDuff.Mode getTrackTintMode();
+ method @Nullable public android.content.res.ColorStateList getTrackTintList();
+ method @Nullable public android.graphics.PorterDuff.Mode getTrackTintMode();
method public void onMeasure(int, int);
method public void setShowText(boolean);
method public void setSplitTrack(boolean);
method public void setSwitchMinWidth(int);
method public void setSwitchPadding(int);
- method public void setSwitchTextAppearance(android.content.Context, int);
+ method public void setSwitchTextAppearance(android.content.Context, @StyleRes int);
method public void setSwitchTypeface(android.graphics.Typeface, int);
method public void setSwitchTypeface(android.graphics.Typeface);
- method public void setTextOff(java.lang.CharSequence);
- method public void setTextOn(java.lang.CharSequence);
+ method public void setTextOff(CharSequence);
+ method public void setTextOn(CharSequence);
method public void setThumbDrawable(android.graphics.drawable.Drawable);
- method public void setThumbResource(int);
+ method public void setThumbResource(@DrawableRes int);
method public void setThumbTextPadding(int);
- method public void setThumbTintList(android.content.res.ColorStateList);
- method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
+ method public void setThumbTintList(@Nullable android.content.res.ColorStateList);
+ method public void setThumbTintMode(@Nullable android.graphics.PorterDuff.Mode);
method public void setTrackDrawable(android.graphics.drawable.Drawable);
- method public void setTrackResource(int);
- method public void setTrackTintList(android.content.res.ColorStateList);
- method public void setTrackTintMode(android.graphics.PorterDuff.Mode);
+ method public void setTrackResource(@DrawableRes int);
+ method public void setTrackTintList(@Nullable android.content.res.ColorStateList);
+ method public void setTrackTintMode(@Nullable android.graphics.PorterDuff.Mode);
}
public class TabHost extends android.widget.FrameLayout implements android.view.ViewTreeObserver.OnTouchModeChangeListener {
@@ -56280,36 +56557,36 @@ package android.widget {
ctor public TabHost(android.content.Context, android.util.AttributeSet, int, int);
method public void addTab(android.widget.TabHost.TabSpec);
method public void clearAllTabs();
- method public int getCurrentTab();
- method public java.lang.String getCurrentTabTag();
- method public android.view.View getCurrentTabView();
+ method @Nullable public int getCurrentTab();
+ method @Nullable public String getCurrentTabTag();
+ method @Nullable public android.view.View getCurrentTabView();
method public android.view.View getCurrentView();
method public android.widget.FrameLayout getTabContentView();
method public android.widget.TabWidget getTabWidget();
- method public android.widget.TabHost.TabSpec newTabSpec(java.lang.String);
+ method @NonNull public android.widget.TabHost.TabSpec newTabSpec(@NonNull String);
method public void onTouchModeChanged(boolean);
method public void setCurrentTab(int);
- method public void setCurrentTabByTag(java.lang.String);
+ method public void setCurrentTabByTag(String);
method public void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener);
method public void setup();
method public void setup(android.app.LocalActivityManager);
}
- public static abstract interface TabHost.OnTabChangeListener {
- method public abstract void onTabChanged(java.lang.String);
+ public static interface TabHost.OnTabChangeListener {
+ method public void onTabChanged(String);
}
- public static abstract interface TabHost.TabContentFactory {
- method public abstract android.view.View createTabContent(java.lang.String);
+ public static interface TabHost.TabContentFactory {
+ method public android.view.View createTabContent(String);
}
public class TabHost.TabSpec {
- method public java.lang.String getTag();
+ method @NonNull public String getTag();
method public android.widget.TabHost.TabSpec setContent(int);
method public android.widget.TabHost.TabSpec setContent(android.widget.TabHost.TabContentFactory);
method public android.widget.TabHost.TabSpec setContent(android.content.Intent);
- method public android.widget.TabHost.TabSpec setIndicator(java.lang.CharSequence);
- method public android.widget.TabHost.TabSpec setIndicator(java.lang.CharSequence, android.graphics.drawable.Drawable);
+ method public android.widget.TabHost.TabSpec setIndicator(CharSequence);
+ method public android.widget.TabHost.TabSpec setIndicator(CharSequence, android.graphics.drawable.Drawable);
method public android.widget.TabHost.TabSpec setIndicator(android.view.View);
}
@@ -56321,17 +56598,17 @@ package android.widget {
method public void dispatchDraw(android.graphics.Canvas);
method public void focusCurrentTab(int);
method public android.view.View getChildTabViewAt(int);
- method public android.graphics.drawable.Drawable getLeftStripDrawable();
- method public android.graphics.drawable.Drawable getRightStripDrawable();
+ method @Nullable public android.graphics.drawable.Drawable getLeftStripDrawable();
+ method @Nullable public android.graphics.drawable.Drawable getRightStripDrawable();
method public int getTabCount();
method public boolean isStripEnabled();
method public void onFocusChange(android.view.View, boolean);
method public void setCurrentTab(int);
- method public void setDividerDrawable(int);
- method public void setLeftStripDrawable(android.graphics.drawable.Drawable);
- method public void setLeftStripDrawable(int);
- method public void setRightStripDrawable(android.graphics.drawable.Drawable);
- method public void setRightStripDrawable(int);
+ method public void setDividerDrawable(@DrawableRes int);
+ method public void setLeftStripDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setLeftStripDrawable(@DrawableRes int);
+ method public void setRightStripDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setRightStripDrawable(@DrawableRes int);
method public void setStripEnabled(boolean);
}
@@ -56376,41 +56653,41 @@ package android.widget {
ctor public TableRow.LayoutParams(int);
ctor public TableRow.LayoutParams(android.view.ViewGroup.LayoutParams);
ctor public TableRow.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
- field public int column;
- field public int span;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int column;
+ field @android.view.ViewDebug.ExportedProperty(category="layout") public int span;
}
- public class TextClock extends android.widget.TextView {
+ @android.widget.RemoteViews.RemoteView public class TextClock extends android.widget.TextView {
ctor public TextClock(android.content.Context);
ctor public TextClock(android.content.Context, android.util.AttributeSet);
ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
ctor public TextClock(android.content.Context, android.util.AttributeSet, int, int);
- method public java.lang.CharSequence getFormat12Hour();
- method public java.lang.CharSequence getFormat24Hour();
- method public java.lang.String getTimeZone();
+ method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat12Hour();
+ method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat24Hour();
+ method public String getTimeZone();
method public boolean is24HourModeEnabled();
- method public void setFormat12Hour(java.lang.CharSequence);
- method public void setFormat24Hour(java.lang.CharSequence);
- method public void setTimeZone(java.lang.String);
- field public static final deprecated java.lang.CharSequence DEFAULT_FORMAT_12_HOUR;
- field public static final deprecated java.lang.CharSequence DEFAULT_FORMAT_24_HOUR;
+ method public void setFormat12Hour(CharSequence);
+ method public void setFormat24Hour(CharSequence);
+ method public void setTimeZone(String);
+ field @Deprecated public static final CharSequence DEFAULT_FORMAT_12_HOUR;
+ field @Deprecated public static final CharSequence DEFAULT_FORMAT_24_HOUR;
}
public class TextSwitcher extends android.widget.ViewSwitcher {
ctor public TextSwitcher(android.content.Context);
ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
- method public void setCurrentText(java.lang.CharSequence);
- method public void setText(java.lang.CharSequence);
+ method public void setCurrentText(CharSequence);
+ method public void setText(CharSequence);
}
- public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
+ @android.widget.RemoteViews.RemoteView public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
ctor public TextView(android.content.Context);
- ctor public TextView(android.content.Context, android.util.AttributeSet);
- ctor public TextView(android.content.Context, android.util.AttributeSet, int);
- ctor public TextView(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public TextView(android.content.Context, @Nullable android.util.AttributeSet);
+ ctor public TextView(android.content.Context, @Nullable android.util.AttributeSet, int);
+ ctor public TextView(android.content.Context, @Nullable android.util.AttributeSet, int, int);
method public void addTextChangedListener(android.text.TextWatcher);
- method public final void append(java.lang.CharSequence);
- method public void append(java.lang.CharSequence, int, int);
+ method public final void append(CharSequence);
+ method public void append(CharSequence, int, int);
method public void beginBatchEdit();
method public boolean bringPointIntoView(int);
method public void clearComposingText();
@@ -56428,38 +56705,38 @@ package android.widget {
method public int getCompoundDrawablePadding();
method public android.content.res.ColorStateList getCompoundDrawableTintList();
method public android.graphics.PorterDuff.Mode getCompoundDrawableTintMode();
- method public android.graphics.drawable.Drawable[] getCompoundDrawables();
- method public android.graphics.drawable.Drawable[] getCompoundDrawablesRelative();
+ method @NonNull public android.graphics.drawable.Drawable[] getCompoundDrawables();
+ method @NonNull public android.graphics.drawable.Drawable[] getCompoundDrawablesRelative();
method public int getCompoundPaddingBottom();
method public int getCompoundPaddingEnd();
method public int getCompoundPaddingLeft();
method public int getCompoundPaddingRight();
method public int getCompoundPaddingStart();
method public int getCompoundPaddingTop();
- method public final int getCurrentHintTextColor();
- method public final int getCurrentTextColor();
+ method @ColorInt public final int getCurrentHintTextColor();
+ method @ColorInt public final int getCurrentTextColor();
method public android.view.ActionMode.Callback getCustomInsertionActionModeCallback();
method public android.view.ActionMode.Callback getCustomSelectionActionModeCallback();
method protected boolean getDefaultEditable();
method protected android.text.method.MovementMethod getDefaultMovementMethod();
method public android.text.Editable getEditableText();
- method public android.text.TextUtils.TruncateAt getEllipsize();
- method public java.lang.CharSequence getError();
+ method @android.view.ViewDebug.ExportedProperty public android.text.TextUtils.TruncateAt getEllipsize();
+ method public CharSequence getError();
method public int getExtendedPaddingBottom();
method public int getExtendedPaddingTop();
method public android.text.InputFilter[] getFilters();
method public int getFirstBaselineToTopHeight();
- method public java.lang.String getFontFeatureSettings();
- method public java.lang.String getFontVariationSettings();
+ method @Nullable public String getFontFeatureSettings();
+ method @Nullable public String getFontVariationSettings();
method public boolean getFreezesText();
method public int getGravity();
- method public int getHighlightColor();
- method public java.lang.CharSequence getHint();
+ method @ColorInt public int getHighlightColor();
+ method @android.view.ViewDebug.CapturedViewProperty public CharSequence getHint();
method public final android.content.res.ColorStateList getHintTextColors();
method public int getHyphenationFrequency();
method public int getImeActionId();
- method public java.lang.CharSequence getImeActionLabel();
- method public android.os.LocaleList getImeHintLocales();
+ method public CharSequence getImeActionLabel();
+ method @Nullable public android.os.LocaleList getImeHintLocales();
method public int getImeOptions();
method public boolean getIncludeFontPadding();
method public android.os.Bundle getInputExtras(boolean);
@@ -56489,27 +56766,27 @@ package android.widget {
method public int getOffsetForPosition(float, float);
method public android.text.TextPaint getPaint();
method public int getPaintFlags();
- method public java.lang.String getPrivateImeOptions();
- method public int getSelectionEnd();
- method public int getSelectionStart();
- method public int getShadowColor();
+ method public String getPrivateImeOptions();
+ method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionEnd();
+ method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionStart();
+ method @ColorInt public int getShadowColor();
method public float getShadowDx();
method public float getShadowDy();
method public float getShadowRadius();
method public final boolean getShowSoftInputOnFocus();
- method public java.lang.CharSequence getText();
- method public android.view.textclassifier.TextClassifier getTextClassifier();
+ method @android.view.ViewDebug.CapturedViewProperty public CharSequence getText();
+ method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier();
method public final android.content.res.ColorStateList getTextColors();
- method public android.graphics.drawable.Drawable getTextCursorDrawable();
+ method @Nullable public android.graphics.drawable.Drawable getTextCursorDrawable();
method public android.text.TextDirectionHeuristic getTextDirectionHeuristic();
- method public java.util.Locale getTextLocale();
- method public android.os.LocaleList getTextLocales();
- method public android.text.PrecomputedText.Params getTextMetricsParams();
+ method @NonNull public java.util.Locale getTextLocale();
+ method @NonNull @Size(min=1) public android.os.LocaleList getTextLocales();
+ method @NonNull public android.text.PrecomputedText.Params getTextMetricsParams();
method public float getTextScaleX();
- method public android.graphics.drawable.Drawable getTextSelectHandle();
- method public android.graphics.drawable.Drawable getTextSelectHandleLeft();
- method public android.graphics.drawable.Drawable getTextSelectHandleRight();
- method public float getTextSize();
+ method @Nullable public android.graphics.drawable.Drawable getTextSelectHandle();
+ method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleLeft();
+ method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleRight();
+ method @android.view.ViewDebug.ExportedProperty(category="text") public float getTextSize();
method public int getTotalPaddingBottom();
method public int getTotalPaddingEnd();
method public int getTotalPaddingLeft();
@@ -56537,28 +56814,28 @@ package android.widget {
method public void onEditorAction(int);
method public void onEndBatchEdit();
method public boolean onPreDraw();
- method public boolean onPrivateIMECommand(java.lang.String, android.os.Bundle);
+ method public boolean onPrivateIMECommand(String, android.os.Bundle);
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
method protected void onSelectionChanged(int, int);
- method protected void onTextChanged(java.lang.CharSequence, int, int, int);
+ method protected void onTextChanged(CharSequence, int, int, int);
method public boolean onTextContextMenuItem(int);
method public void removeTextChangedListener(android.text.TextWatcher);
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int);
- method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int);
+ method public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[], int);
method public void setAutoSizeTextTypeWithDefaults(int);
method public void setBreakStrategy(int);
method public void setCompoundDrawablePadding(int);
- method public void setCompoundDrawableTintList(android.content.res.ColorStateList);
- method public void setCompoundDrawableTintMode(android.graphics.PorterDuff.Mode);
- method public void setCompoundDrawables(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
- method public void setCompoundDrawablesRelative(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
- method public void setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int);
- method public void setCompoundDrawablesRelativeWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
- method public void setCompoundDrawablesWithIntrinsicBounds(int, int, int, int);
- method public void setCompoundDrawablesWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+ method public void setCompoundDrawableTintList(@Nullable android.content.res.ColorStateList);
+ method public void setCompoundDrawableTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setCompoundDrawables(@Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable);
+ method public void setCompoundDrawablesRelative(@Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable);
+ method public void setCompoundDrawablesRelativeWithIntrinsicBounds(@DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public void setCompoundDrawablesRelativeWithIntrinsicBounds(@Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable);
+ method public void setCompoundDrawablesWithIntrinsicBounds(@DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public void setCompoundDrawablesWithIntrinsicBounds(@Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable);
method public void setCursorVisible(boolean);
method public void setCustomInsertionActionModeCallback(android.view.ActionMode.Callback);
method public void setCustomSelectionActionModeCallback(android.view.ActionMode.Callback);
@@ -56566,39 +56843,39 @@ package android.widget {
method public void setElegantTextHeight(boolean);
method public void setEllipsize(android.text.TextUtils.TruncateAt);
method public void setEms(int);
- method public void setError(java.lang.CharSequence);
- method public void setError(java.lang.CharSequence, android.graphics.drawable.Drawable);
+ method public void setError(CharSequence);
+ method public void setError(CharSequence, android.graphics.drawable.Drawable);
method public void setExtractedText(android.view.inputmethod.ExtractedText);
method public void setFallbackLineSpacing(boolean);
method public void setFilters(android.text.InputFilter[]);
- method public void setFirstBaselineToTopHeight(int);
- method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String);
+ method public void setFirstBaselineToTopHeight(@Px @IntRange(from=0) int);
+ method public void setFontFeatureSettings(@Nullable String);
+ method public boolean setFontVariationSettings(@Nullable String);
method protected boolean setFrame(int, int, int, int);
method public void setFreezesText(boolean);
method public void setGravity(int);
method public void setHeight(int);
- method public void setHighlightColor(int);
- method public final void setHint(java.lang.CharSequence);
- method public final void setHint(int);
- method public final void setHintTextColor(int);
+ method public void setHighlightColor(@ColorInt int);
+ method public final void setHint(CharSequence);
+ method public final void setHint(@StringRes int);
+ method public final void setHintTextColor(@ColorInt int);
method public final void setHintTextColor(android.content.res.ColorStateList);
method public void setHorizontallyScrolling(boolean);
method public void setHyphenationFrequency(int);
- method public void setImeActionLabel(java.lang.CharSequence, int);
- method public void setImeHintLocales(android.os.LocaleList);
+ method public void setImeActionLabel(CharSequence, int);
+ method public void setImeHintLocales(@Nullable android.os.LocaleList);
method public void setImeOptions(int);
method public void setIncludeFontPadding(boolean);
- method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void setInputExtras(@XmlRes int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
method public void setJustificationMode(int);
method public void setKeyListener(android.text.method.KeyListener);
- method public void setLastBaselineToBottomHeight(int);
+ method public void setLastBaselineToBottomHeight(@Px @IntRange(from=0) int);
method public void setLetterSpacing(float);
- method public void setLineHeight(int);
+ method public void setLineHeight(@Px @IntRange(from=0) int);
method public void setLineSpacing(float, float);
method public void setLines(int);
- method public final void setLinkTextColor(int);
+ method public final void setLinkTextColor(@ColorInt int);
method public final void setLinkTextColor(android.content.res.ColorStateList);
method public final void setLinksClickable(boolean);
method public void setMarqueeRepeatLimit(int);
@@ -56613,7 +56890,7 @@ package android.widget {
method public final void setMovementMethod(android.text.method.MovementMethod);
method public void setOnEditorActionListener(android.widget.TextView.OnEditorActionListener);
method public void setPaintFlags(int);
- method public void setPrivateImeOptions(java.lang.String);
+ method public void setPrivateImeOptions(String);
method public void setRawInputType(int);
method public void setScroller(android.widget.Scroller);
method public void setSelectAllOnFocus(boolean);
@@ -56622,60 +56899,58 @@ package android.widget {
method public void setSingleLine();
method public void setSingleLine(boolean);
method public final void setSpannableFactory(android.text.Spannable.Factory);
- method public final void setText(java.lang.CharSequence);
- method public void setText(java.lang.CharSequence, android.widget.TextView.BufferType);
+ method public final void setText(CharSequence);
+ method public void setText(CharSequence, android.widget.TextView.BufferType);
method public final void setText(char[], int, int);
- method public final void setText(int);
- method public final void setText(int, android.widget.TextView.BufferType);
- method public void setTextAppearance(int);
- method public deprecated void setTextAppearance(android.content.Context, int);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
- method public void setTextColor(int);
+ method public final void setText(@StringRes int);
+ method public final void setText(@StringRes int, android.widget.TextView.BufferType);
+ method public void setTextAppearance(@StyleRes int);
+ method @Deprecated public void setTextAppearance(android.content.Context, @StyleRes int);
+ method public void setTextClassifier(@Nullable android.view.textclassifier.TextClassifier);
+ method public void setTextColor(@ColorInt int);
method public void setTextColor(android.content.res.ColorStateList);
- method public void setTextCursorDrawable(android.graphics.drawable.Drawable);
- method public void setTextCursorDrawable(int);
+ method public void setTextCursorDrawable(@Nullable android.graphics.drawable.Drawable);
+ method public void setTextCursorDrawable(@DrawableRes int);
method public void setTextIsSelectable(boolean);
- method public final void setTextKeepState(java.lang.CharSequence);
- method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType);
- method public void setTextLocale(java.util.Locale);
- method public void setTextLocales(android.os.LocaleList);
- method public void setTextMetricsParams(android.text.PrecomputedText.Params);
+ method public final void setTextKeepState(CharSequence);
+ method public final void setTextKeepState(CharSequence, android.widget.TextView.BufferType);
+ method public void setTextLocale(@NonNull java.util.Locale);
+ method public void setTextLocales(@NonNull @Size(min=1) android.os.LocaleList);
+ method public void setTextMetricsParams(@NonNull android.text.PrecomputedText.Params);
method public void setTextScaleX(float);
- method public void setTextSelectHandle(android.graphics.drawable.Drawable);
- method public void setTextSelectHandle(int);
- method public void setTextSelectHandleLeft(android.graphics.drawable.Drawable);
- method public void setTextSelectHandleLeft(int);
- method public void setTextSelectHandleRight(android.graphics.drawable.Drawable);
- method public void setTextSelectHandleRight(int);
+ method public void setTextSelectHandle(@NonNull android.graphics.drawable.Drawable);
+ method public void setTextSelectHandle(@DrawableRes int);
+ method public void setTextSelectHandleLeft(@NonNull android.graphics.drawable.Drawable);
+ method public void setTextSelectHandleLeft(@DrawableRes int);
+ method public void setTextSelectHandleRight(@NonNull android.graphics.drawable.Drawable);
+ method public void setTextSelectHandleRight(@DrawableRes int);
method public void setTextSize(float);
method public void setTextSize(int, float);
method public final void setTransformationMethod(android.text.method.TransformationMethod);
- method public void setTypeface(android.graphics.Typeface, int);
- method public void setTypeface(android.graphics.Typeface);
+ method public void setTypeface(@Nullable android.graphics.Typeface, int);
+ method public void setTypeface(@Nullable android.graphics.Typeface);
method public void setWidth(int);
field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
}
- public static final class TextView.BufferType extends java.lang.Enum {
- method public static android.widget.TextView.BufferType valueOf(java.lang.String);
- method public static final android.widget.TextView.BufferType[] values();
+ public enum TextView.BufferType {
enum_constant public static final android.widget.TextView.BufferType EDITABLE;
enum_constant public static final android.widget.TextView.BufferType NORMAL;
enum_constant public static final android.widget.TextView.BufferType SPANNABLE;
}
- public static abstract interface TextView.OnEditorActionListener {
- method public abstract boolean onEditorAction(android.widget.TextView, int, android.view.KeyEvent);
+ public static interface TextView.OnEditorActionListener {
+ method public boolean onEditorAction(android.widget.TextView, int, android.view.KeyEvent);
}
public static class TextView.SavedState extends android.view.View.BaseSavedState {
field public static final android.os.Parcelable.Creator<android.widget.TextView.SavedState> CREATOR;
}
- public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
- method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
- method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method @Nullable public android.content.res.Resources.Theme getDropDownViewTheme();
+ method public void setDropDownViewTheme(@Nullable android.content.res.Resources.Theme);
}
public class TimePicker extends android.widget.FrameLayout {
@@ -56683,22 +56958,22 @@ package android.widget {
ctor public TimePicker(android.content.Context, android.util.AttributeSet);
ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
ctor public TimePicker(android.content.Context, android.util.AttributeSet, int, int);
- method public deprecated java.lang.Integer getCurrentHour();
- method public deprecated java.lang.Integer getCurrentMinute();
+ method @Deprecated @NonNull public Integer getCurrentHour();
+ method @Deprecated @NonNull public Integer getCurrentMinute();
method public int getHour();
method public int getMinute();
method public boolean is24HourView();
- method public deprecated void setCurrentHour(java.lang.Integer);
- method public deprecated void setCurrentMinute(java.lang.Integer);
- method public void setHour(int);
- method public void setIs24HourView(java.lang.Boolean);
- method public void setMinute(int);
+ method @Deprecated public void setCurrentHour(@NonNull Integer);
+ method @Deprecated public void setCurrentMinute(@NonNull Integer);
+ method public void setHour(@IntRange(from=0, to=23) int);
+ method public void setIs24HourView(@NonNull Boolean);
+ method public void setMinute(@IntRange(from=0, to=59) int);
method public void setOnTimeChangedListener(android.widget.TimePicker.OnTimeChangedListener);
method public boolean validateInput();
}
- public static abstract interface TimePicker.OnTimeChangedListener {
- method public abstract void onTimeChanged(android.widget.TimePicker, int, int);
+ public static interface TimePicker.OnTimeChangedListener {
+ method public void onTimeChanged(android.widget.TimePicker, int, int);
}
public class Toast {
@@ -56711,13 +56986,13 @@ package android.widget {
method public android.view.View getView();
method public int getXOffset();
method public int getYOffset();
- method public static android.widget.Toast makeText(android.content.Context, java.lang.CharSequence, int);
- method public static android.widget.Toast makeText(android.content.Context, int, int) throws android.content.res.Resources.NotFoundException;
+ method public static android.widget.Toast makeText(android.content.Context, CharSequence, int);
+ method public static android.widget.Toast makeText(android.content.Context, @StringRes int, int) throws android.content.res.Resources.NotFoundException;
method public void setDuration(int);
method public void setGravity(int, int, int);
method public void setMargin(float, float);
- method public void setText(int);
- method public void setText(java.lang.CharSequence);
+ method public void setText(@StringRes int);
+ method public void setText(CharSequence);
method public void setView(android.view.View);
method public void show();
field public static final int LENGTH_LONG = 1; // 0x1
@@ -56729,11 +57004,11 @@ package android.widget {
ctor public ToggleButton(android.content.Context, android.util.AttributeSet, int);
ctor public ToggleButton(android.content.Context, android.util.AttributeSet);
ctor public ToggleButton(android.content.Context);
- method public java.lang.CharSequence getTextOff();
- method public java.lang.CharSequence getTextOn();
+ method public CharSequence getTextOff();
+ method public CharSequence getTextOn();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setTextOff(java.lang.CharSequence);
- method public void setTextOn(java.lang.CharSequence);
+ method public void setTextOff(CharSequence);
+ method public void setTextOn(CharSequence);
}
public class Toolbar extends android.view.ViewGroup {
@@ -56746,8 +57021,8 @@ package android.widget {
method protected android.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
method public android.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
method protected android.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
- method public java.lang.CharSequence getCollapseContentDescription();
- method public android.graphics.drawable.Drawable getCollapseIcon();
+ method @Nullable public CharSequence getCollapseContentDescription();
+ method @Nullable public android.graphics.drawable.Drawable getCollapseIcon();
method public int getContentInsetEnd();
method public int getContentInsetEndWithActions();
method public int getContentInsetLeft();
@@ -56759,60 +57034,60 @@ package android.widget {
method public int getCurrentContentInsetRight();
method public int getCurrentContentInsetStart();
method public android.graphics.drawable.Drawable getLogo();
- method public java.lang.CharSequence getLogoDescription();
+ method public CharSequence getLogoDescription();
method public android.view.Menu getMenu();
- method public java.lang.CharSequence getNavigationContentDescription();
- method public android.graphics.drawable.Drawable getNavigationIcon();
- method public android.graphics.drawable.Drawable getOverflowIcon();
+ method @Nullable public CharSequence getNavigationContentDescription();
+ method @Nullable public android.graphics.drawable.Drawable getNavigationIcon();
+ method @Nullable public android.graphics.drawable.Drawable getOverflowIcon();
method public int getPopupTheme();
- method public java.lang.CharSequence getSubtitle();
- method public java.lang.CharSequence getTitle();
+ method public CharSequence getSubtitle();
+ method public CharSequence getTitle();
method public int getTitleMarginBottom();
method public int getTitleMarginEnd();
method public int getTitleMarginStart();
method public int getTitleMarginTop();
method public boolean hasExpandedActionView();
method public boolean hideOverflowMenu();
- method public void inflateMenu(int);
+ method public void inflateMenu(@MenuRes int);
method public boolean isOverflowMenuShowing();
- method public void setCollapseContentDescription(int);
- method public void setCollapseContentDescription(java.lang.CharSequence);
- method public void setCollapseIcon(int);
- method public void setCollapseIcon(android.graphics.drawable.Drawable);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(@Nullable CharSequence);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(@Nullable android.graphics.drawable.Drawable);
method public void setContentInsetEndWithActions(int);
method public void setContentInsetStartWithNavigation(int);
method public void setContentInsetsAbsolute(int, int);
method public void setContentInsetsRelative(int, int);
- method public void setLogo(int);
+ method public void setLogo(@DrawableRes int);
method public void setLogo(android.graphics.drawable.Drawable);
- method public void setLogoDescription(int);
- method public void setLogoDescription(java.lang.CharSequence);
- method public void setNavigationContentDescription(int);
- method public void setNavigationContentDescription(java.lang.CharSequence);
- method public void setNavigationIcon(int);
- method public void setNavigationIcon(android.graphics.drawable.Drawable);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(@Nullable CharSequence);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(@Nullable android.graphics.drawable.Drawable);
method public void setNavigationOnClickListener(android.view.View.OnClickListener);
method public void setOnMenuItemClickListener(android.widget.Toolbar.OnMenuItemClickListener);
- method public void setOverflowIcon(android.graphics.drawable.Drawable);
- method public void setPopupTheme(int);
- method public void setSubtitle(int);
- method public void setSubtitle(java.lang.CharSequence);
- method public void setSubtitleTextAppearance(android.content.Context, int);
- method public void setSubtitleTextColor(int);
- method public void setTitle(int);
- method public void setTitle(java.lang.CharSequence);
+ method public void setOverflowIcon(@Nullable android.graphics.drawable.Drawable);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence);
+ method public void setSubtitleTextAppearance(android.content.Context, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence);
method public void setTitleMargin(int, int, int, int);
method public void setTitleMarginBottom(int);
method public void setTitleMarginEnd(int);
method public void setTitleMarginStart(int);
method public void setTitleMarginTop(int);
- method public void setTitleTextAppearance(android.content.Context, int);
- method public void setTitleTextColor(int);
+ method public void setTitleTextAppearance(android.content.Context, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
method public boolean showOverflowMenu();
}
public static class Toolbar.LayoutParams extends android.app.ActionBar.LayoutParams {
- ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor public Toolbar.LayoutParams(@NonNull android.content.Context, android.util.AttributeSet);
ctor public Toolbar.LayoutParams(int, int);
ctor public Toolbar.LayoutParams(int, int, int);
ctor public Toolbar.LayoutParams(int);
@@ -56822,17 +57097,17 @@ package android.widget {
ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
}
- public static abstract interface Toolbar.OnMenuItemClickListener {
- method public abstract boolean onMenuItemClick(android.view.MenuItem);
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem);
}
- public deprecated class TwoLineListItem extends android.widget.RelativeLayout {
- ctor public TwoLineListItem(android.content.Context);
- ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet);
- ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet, int);
- ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet, int, int);
- method public android.widget.TextView getText1();
- method public android.widget.TextView getText2();
+ @Deprecated public class TwoLineListItem extends android.widget.RelativeLayout {
+ ctor @Deprecated public TwoLineListItem(android.content.Context);
+ ctor @Deprecated public TwoLineListItem(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public TwoLineListItem(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public TwoLineListItem(android.content.Context, android.util.AttributeSet, int, int);
+ method @Deprecated public android.widget.TextView getText1();
+ method @Deprecated public android.widget.TextView getText2();
}
public class VideoView extends android.view.SurfaceView implements android.widget.MediaController.MediaPlayerControl {
@@ -56853,16 +57128,16 @@ package android.widget {
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
- method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioAttributes(@NonNull android.media.AudioAttributes);
method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
- method public void setVideoPath(java.lang.String);
+ method public void setVideoPath(String);
method public void setVideoURI(android.net.Uri);
- method public void setVideoURI(android.net.Uri, java.util.Map<java.lang.String, java.lang.String>);
+ method public void setVideoURI(android.net.Uri, java.util.Map<java.lang.String,java.lang.String>);
method public void start();
method public void stopPlayback();
method public void suspend();
@@ -56879,14 +57154,14 @@ package android.widget {
method public void setAnimateFirstView(boolean);
method public void setDisplayedChild(int);
method public void setInAnimation(android.view.animation.Animation);
- method public void setInAnimation(android.content.Context, int);
+ method public void setInAnimation(android.content.Context, @AnimRes int);
method public void setOutAnimation(android.view.animation.Animation);
- method public void setOutAnimation(android.content.Context, int);
+ method public void setOutAnimation(android.content.Context, @AnimRes int);
method public void showNext();
method public void showPrevious();
}
- public class ViewFlipper extends android.widget.ViewAnimator {
+ @android.widget.RemoteViews.RemoteView public class ViewFlipper extends android.widget.ViewAnimator {
ctor public ViewFlipper(android.content.Context);
ctor public ViewFlipper(android.content.Context, android.util.AttributeSet);
method public boolean isAutoStart();
@@ -56905,42 +57180,42 @@ package android.widget {
method public void setFactory(android.widget.ViewSwitcher.ViewFactory);
}
- public static abstract interface ViewSwitcher.ViewFactory {
- method public abstract android.view.View makeView();
+ public static interface ViewSwitcher.ViewFactory {
+ method public android.view.View makeView();
}
- public abstract interface WrapperListAdapter implements android.widget.ListAdapter {
- method public abstract android.widget.ListAdapter getWrappedAdapter();
+ public interface WrapperListAdapter extends android.widget.ListAdapter {
+ method public android.widget.ListAdapter getWrappedAdapter();
}
- public deprecated class ZoomButton extends android.widget.ImageButton implements android.view.View.OnLongClickListener {
- ctor public ZoomButton(android.content.Context);
- ctor public ZoomButton(android.content.Context, android.util.AttributeSet);
- ctor public ZoomButton(android.content.Context, android.util.AttributeSet, int);
- ctor public ZoomButton(android.content.Context, android.util.AttributeSet, int, int);
- method public boolean onLongClick(android.view.View);
- method public void setZoomSpeed(long);
+ @Deprecated public class ZoomButton extends android.widget.ImageButton implements android.view.View.OnLongClickListener {
+ ctor @Deprecated public ZoomButton(android.content.Context);
+ ctor @Deprecated public ZoomButton(android.content.Context, android.util.AttributeSet);
+ ctor @Deprecated public ZoomButton(android.content.Context, android.util.AttributeSet, int);
+ ctor @Deprecated public ZoomButton(android.content.Context, android.util.AttributeSet, int, int);
+ method @Deprecated public boolean onLongClick(android.view.View);
+ method @Deprecated public void setZoomSpeed(long);
}
- public deprecated class ZoomButtonsController implements android.view.View.OnTouchListener {
- ctor public ZoomButtonsController(android.view.View);
- method public android.view.ViewGroup getContainer();
- method public android.view.View getZoomControls();
- method public boolean isAutoDismissed();
- method public boolean isVisible();
+ @Deprecated public class ZoomButtonsController implements android.view.View.OnTouchListener {
+ ctor @Deprecated public ZoomButtonsController(android.view.View);
+ method @Deprecated public android.view.ViewGroup getContainer();
+ method @Deprecated public android.view.View getZoomControls();
+ method @Deprecated public boolean isAutoDismissed();
+ method @Deprecated public boolean isVisible();
method public boolean onTouch(android.view.View, android.view.MotionEvent);
- method public void setAutoDismissed(boolean);
- method public void setFocusable(boolean);
- method public void setOnZoomListener(android.widget.ZoomButtonsController.OnZoomListener);
- method public void setVisible(boolean);
- method public void setZoomInEnabled(boolean);
- method public void setZoomOutEnabled(boolean);
- method public void setZoomSpeed(long);
+ method @Deprecated public void setAutoDismissed(boolean);
+ method @Deprecated public void setFocusable(boolean);
+ method @Deprecated public void setOnZoomListener(android.widget.ZoomButtonsController.OnZoomListener);
+ method @Deprecated public void setVisible(boolean);
+ method @Deprecated public void setZoomInEnabled(boolean);
+ method @Deprecated public void setZoomOutEnabled(boolean);
+ method @Deprecated public void setZoomSpeed(long);
}
- public static abstract interface ZoomButtonsController.OnZoomListener {
- method public abstract void onVisibilityChanged(boolean);
- method public abstract void onZoom(boolean);
+ @Deprecated public static interface ZoomButtonsController.OnZoomListener {
+ method @Deprecated public void onVisibilityChanged(boolean);
+ method @Deprecated public void onZoom(boolean);
}
public class ZoomControls extends android.widget.LinearLayout {
@@ -56959,10 +57234,14 @@ package android.widget {
package dalvik.annotation {
- public abstract deprecated class TestTarget implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface TestTarget {
+ method @Deprecated public abstract String conceptName() default "";
+ method @Deprecated public abstract Class<?>[] methodArgs() default {};
+ method @Deprecated public abstract String methodName() default "";
}
- public abstract deprecated class TestTargetClass implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public @interface TestTargetClass {
+ method @Deprecated public abstract Class<?> value();
}
}
@@ -56974,7 +57253,7 @@ package dalvik.bytecode {
field public static final int MAXIMUM_VALUE;
}
- public abstract interface Opcodes {
+ public interface Opcodes {
field public static final int OP_ADD_DOUBLE = 171; // 0xab
field public static final int OP_ADD_DOUBLE_2ADDR = 203; // 0xcb
field public static final int OP_ADD_FLOAT = 166; // 0xa6
@@ -57006,7 +57285,7 @@ package dalvik.bytecode {
field public static final int OP_APUT_SHORT = 81; // 0x51
field public static final int OP_APUT_WIDE = 76; // 0x4c
field public static final int OP_ARRAY_LENGTH = 33; // 0x21
- field public static final deprecated int OP_BREAKPOINT = 236; // 0xec
+ field @Deprecated public static final int OP_BREAKPOINT = 236; // 0xec
field public static final int OP_CHECK_CAST = 31; // 0x1f
field public static final int OP_CHECK_CAST_JUMBO = 511; // 0x1ff
field public static final int OP_CMPG_DOUBLE = 48; // 0x30
@@ -57041,8 +57320,8 @@ package dalvik.bytecode {
field public static final int OP_DOUBLE_TO_FLOAT = 140; // 0x8c
field public static final int OP_DOUBLE_TO_INT = 138; // 0x8a
field public static final int OP_DOUBLE_TO_LONG = 139; // 0x8b
- field public static final deprecated int OP_EXECUTE_INLINE = 238; // 0xee
- field public static final deprecated int OP_EXECUTE_INLINE_RANGE = 239; // 0xef
+ field @Deprecated public static final int OP_EXECUTE_INLINE = 238; // 0xee
+ field @Deprecated public static final int OP_EXECUTE_INLINE_RANGE = 239; // 0xef
field public static final int OP_FILLED_NEW_ARRAY = 36; // 0x24
field public static final int OP_FILLED_NEW_ARRAY_JUMBO = 1535; // 0x5ff
field public static final int OP_FILLED_NEW_ARRAY_RANGE = 37; // 0x25
@@ -57075,14 +57354,14 @@ package dalvik.bytecode {
field public static final int OP_IGET_JUMBO = 1791; // 0x6ff
field public static final int OP_IGET_OBJECT = 84; // 0x54
field public static final int OP_IGET_OBJECT_JUMBO = 2303; // 0x8ff
- field public static final deprecated int OP_IGET_OBJECT_QUICK = 244; // 0xf4
- field public static final deprecated int OP_IGET_QUICK = 242; // 0xf2
+ field @Deprecated public static final int OP_IGET_OBJECT_QUICK = 244; // 0xf4
+ field @Deprecated public static final int OP_IGET_QUICK = 242; // 0xf2
field public static final int OP_IGET_SHORT = 88; // 0x58
field public static final int OP_IGET_SHORT_JUMBO = 3327; // 0xcff
field public static final int OP_IGET_WIDE = 83; // 0x53
field public static final int OP_IGET_WIDE_JUMBO = 2047; // 0x7ff
- field public static final deprecated int OP_IGET_WIDE_QUICK = 243; // 0xf3
- field public static final deprecated int OP_IGET_WIDE_VOLATILE = 232; // 0xe8
+ field @Deprecated public static final int OP_IGET_WIDE_QUICK = 243; // 0xf3
+ field @Deprecated public static final int OP_IGET_WIDE_VOLATILE = 232; // 0xe8
field public static final int OP_INSTANCE_OF = 32; // 0x20
field public static final int OP_INSTANCE_OF_JUMBO = 767; // 0x2ff
field public static final int OP_INT_TO_BYTE = 141; // 0x8d
@@ -57094,7 +57373,7 @@ package dalvik.bytecode {
field public static final int OP_INVOKE_CUSTOM = 252; // 0xfc
field public static final int OP_INVOKE_CUSTOM_RANGE = 253; // 0xfd
field public static final int OP_INVOKE_DIRECT = 112; // 0x70
- field public static final deprecated int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
+ field @Deprecated public static final int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
field public static final int OP_INVOKE_DIRECT_JUMBO = 9471; // 0x24ff
field public static final int OP_INVOKE_DIRECT_RANGE = 118; // 0x76
field public static final int OP_INVOKE_INTERFACE = 114; // 0x72
@@ -57107,13 +57386,13 @@ package dalvik.bytecode {
field public static final int OP_INVOKE_STATIC_RANGE = 119; // 0x77
field public static final int OP_INVOKE_SUPER = 111; // 0x6f
field public static final int OP_INVOKE_SUPER_JUMBO = 9215; // 0x23ff
- field public static final deprecated int OP_INVOKE_SUPER_QUICK = 250; // 0xfa
- field public static final deprecated int OP_INVOKE_SUPER_QUICK_RANGE = 251; // 0xfb
+ field @Deprecated public static final int OP_INVOKE_SUPER_QUICK = 250; // 0xfa
+ field @Deprecated public static final int OP_INVOKE_SUPER_QUICK_RANGE = 251; // 0xfb
field public static final int OP_INVOKE_SUPER_RANGE = 117; // 0x75
field public static final int OP_INVOKE_VIRTUAL = 110; // 0x6e
field public static final int OP_INVOKE_VIRTUAL_JUMBO = 8959; // 0x22ff
- field public static final deprecated int OP_INVOKE_VIRTUAL_QUICK = 248; // 0xf8
- field public static final deprecated int OP_INVOKE_VIRTUAL_QUICK_RANGE = 249; // 0xf9
+ field @Deprecated public static final int OP_INVOKE_VIRTUAL_QUICK = 248; // 0xf8
+ field @Deprecated public static final int OP_INVOKE_VIRTUAL_QUICK_RANGE = 249; // 0xf9
field public static final int OP_INVOKE_VIRTUAL_RANGE = 116; // 0x74
field public static final int OP_IPUT = 89; // 0x59
field public static final int OP_IPUT_BOOLEAN = 92; // 0x5c
@@ -57125,14 +57404,14 @@ package dalvik.bytecode {
field public static final int OP_IPUT_JUMBO = 3583; // 0xdff
field public static final int OP_IPUT_OBJECT = 91; // 0x5b
field public static final int OP_IPUT_OBJECT_JUMBO = 4095; // 0xfff
- field public static final deprecated int OP_IPUT_OBJECT_QUICK = 247; // 0xf7
- field public static final deprecated int OP_IPUT_QUICK = 245; // 0xf5
+ field @Deprecated public static final int OP_IPUT_OBJECT_QUICK = 247; // 0xf7
+ field @Deprecated public static final int OP_IPUT_QUICK = 245; // 0xf5
field public static final int OP_IPUT_SHORT = 95; // 0x5f
field public static final int OP_IPUT_SHORT_JUMBO = 5119; // 0x13ff
field public static final int OP_IPUT_WIDE = 90; // 0x5a
field public static final int OP_IPUT_WIDE_JUMBO = 3839; // 0xeff
- field public static final deprecated int OP_IPUT_WIDE_QUICK = 246; // 0xf6
- field public static final deprecated int OP_IPUT_WIDE_VOLATILE = 233; // 0xe9
+ field @Deprecated public static final int OP_IPUT_WIDE_QUICK = 246; // 0xf6
+ field @Deprecated public static final int OP_IPUT_WIDE_VOLATILE = 233; // 0xe9
field public static final int OP_LONG_TO_DOUBLE = 134; // 0x86
field public static final int OP_LONG_TO_FLOAT = 133; // 0x85
field public static final int OP_LONG_TO_INT = 132; // 0x84
@@ -57209,7 +57488,7 @@ package dalvik.bytecode {
field public static final int OP_SGET_SHORT_JUMBO = 6911; // 0x1aff
field public static final int OP_SGET_WIDE = 97; // 0x61
field public static final int OP_SGET_WIDE_JUMBO = 5631; // 0x15ff
- field public static final deprecated int OP_SGET_WIDE_VOLATILE = 234; // 0xea
+ field @Deprecated public static final int OP_SGET_WIDE_VOLATILE = 234; // 0xea
field public static final int OP_SHL_INT = 152; // 0x98
field public static final int OP_SHL_INT_2ADDR = 184; // 0xb8
field public static final int OP_SHL_INT_LIT8 = 224; // 0xe0
@@ -57235,7 +57514,7 @@ package dalvik.bytecode {
field public static final int OP_SPUT_SHORT_JUMBO = 8703; // 0x21ff
field public static final int OP_SPUT_WIDE = 104; // 0x68
field public static final int OP_SPUT_WIDE_JUMBO = 7423; // 0x1cff
- field public static final deprecated int OP_SPUT_WIDE_VOLATILE = 235; // 0xeb
+ field @Deprecated public static final int OP_SPUT_WIDE_VOLATILE = 235; // 0xeb
field public static final int OP_SUB_DOUBLE = 172; // 0xac
field public static final int OP_SUB_DOUBLE_2ADDR = 204; // 0xcc
field public static final int OP_SUB_FLOAT = 167; // 0xa7
@@ -57245,7 +57524,7 @@ package dalvik.bytecode {
field public static final int OP_SUB_LONG = 156; // 0x9c
field public static final int OP_SUB_LONG_2ADDR = 188; // 0xbc
field public static final int OP_THROW = 39; // 0x27
- field public static final deprecated int OP_THROW_VERIFICATION_ERROR = 237; // 0xed
+ field @Deprecated public static final int OP_THROW_VERIFICATION_ERROR = 237; // 0xed
field public static final int OP_USHR_INT = 154; // 0x9a
field public static final int OP_USHR_INT_2ADDR = 186; // 0xba
field public static final int OP_USHR_INT_LIT8 = 226; // 0xe2
@@ -57264,42 +57543,41 @@ package dalvik.bytecode {
package dalvik.system {
public class BaseDexClassLoader extends java.lang.ClassLoader {
- ctor public BaseDexClassLoader(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader);
- method public java.lang.String findLibrary(java.lang.String);
- method protected java.util.Enumeration<java.net.URL> findResources(java.lang.String);
- method protected synchronized java.lang.Package getPackage(java.lang.String);
+ ctor public BaseDexClassLoader(String, java.io.File, String, ClassLoader);
+ method public String findLibrary(String);
+ method protected java.util.Enumeration<java.net.URL> findResources(String);
}
public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader {
- ctor public DelegateLastClassLoader(java.lang.String, java.lang.ClassLoader);
- ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
- ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader, boolean);
+ ctor public DelegateLastClassLoader(String, ClassLoader);
+ ctor public DelegateLastClassLoader(String, String, ClassLoader);
+ ctor public DelegateLastClassLoader(String, String, ClassLoader, boolean);
}
public class DexClassLoader extends dalvik.system.BaseDexClassLoader {
- ctor public DexClassLoader(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader);
+ ctor public DexClassLoader(String, String, String, ClassLoader);
}
- public final deprecated class DexFile {
- ctor public deprecated DexFile(java.io.File) throws java.io.IOException;
- ctor public deprecated DexFile(java.lang.String) throws java.io.IOException;
- method public void close() throws java.io.IOException;
- method public java.util.Enumeration<java.lang.String> entries();
- method public java.lang.String getName();
- method public static boolean isDexOptNeeded(java.lang.String) throws java.io.FileNotFoundException, java.io.IOException;
- method public java.lang.Class loadClass(java.lang.String, java.lang.ClassLoader);
- method public static deprecated dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
+ @Deprecated public final class DexFile {
+ ctor @Deprecated public DexFile(java.io.File) throws java.io.IOException;
+ ctor @Deprecated public DexFile(String) throws java.io.IOException;
+ method @Deprecated public void close() throws java.io.IOException;
+ method @Deprecated public java.util.Enumeration<java.lang.String> entries();
+ method @Deprecated public String getName();
+ method @Deprecated public static boolean isDexOptNeeded(String) throws java.io.FileNotFoundException, java.io.IOException;
+ method @Deprecated public Class loadClass(String, ClassLoader);
+ method @Deprecated public static dalvik.system.DexFile loadDex(String, String, int) throws java.io.IOException;
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
- ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.String, java.lang.ClassLoader);
- ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
- ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
+ ctor public InMemoryDexClassLoader(@NonNull java.nio.ByteBuffer[], @Nullable String, @Nullable ClassLoader);
+ ctor public InMemoryDexClassLoader(@NonNull java.nio.ByteBuffer[], @Nullable ClassLoader);
+ ctor public InMemoryDexClassLoader(@NonNull java.nio.ByteBuffer, @Nullable ClassLoader);
}
public class PathClassLoader extends dalvik.system.BaseDexClassLoader {
- ctor public PathClassLoader(java.lang.String, java.lang.ClassLoader);
- ctor public PathClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
+ ctor public PathClassLoader(String, ClassLoader);
+ ctor public PathClassLoader(String, String, ClassLoader);
}
}
@@ -57341,9 +57619,7 @@ package java.awt.font {
field public static final int TIBETAN = 16384; // 0x4000
}
- public static class NumericShaper.Range extends java.lang.Enum {
- method public static java.awt.font.NumericShaper.Range valueOf(java.lang.String);
- method public static final java.awt.font.NumericShaper.Range[] values();
+ public enum NumericShaper.Range {
enum_constant public static final java.awt.font.NumericShaper.Range ARABIC;
enum_constant public static final java.awt.font.NumericShaper.Range BALINESE;
enum_constant public static final java.awt.font.NumericShaper.Range BENGALI;
@@ -57382,7 +57658,7 @@ package java.awt.font {
}
public final class TextAttribute extends java.text.AttributedCharacterIterator.Attribute {
- ctor protected TextAttribute(java.lang.String);
+ ctor protected TextAttribute(String);
field public static final java.awt.font.TextAttribute BACKGROUND;
field public static final java.awt.font.TextAttribute BIDI_EMBEDDING;
field public static final java.awt.font.TextAttribute CHAR_REPLACEMENT;
@@ -57392,56 +57668,56 @@ package java.awt.font {
field public static final java.awt.font.TextAttribute INPUT_METHOD_HIGHLIGHT;
field public static final java.awt.font.TextAttribute INPUT_METHOD_UNDERLINE;
field public static final java.awt.font.TextAttribute JUSTIFICATION;
- field public static final java.lang.Float JUSTIFICATION_FULL;
- field public static final java.lang.Float JUSTIFICATION_NONE;
+ field public static final Float JUSTIFICATION_FULL;
+ field public static final Float JUSTIFICATION_NONE;
field public static final java.awt.font.TextAttribute KERNING;
- field public static final java.lang.Integer KERNING_ON;
+ field public static final Integer KERNING_ON;
field public static final java.awt.font.TextAttribute LIGATURES;
- field public static final java.lang.Integer LIGATURES_ON;
+ field public static final Integer LIGATURES_ON;
field public static final java.awt.font.TextAttribute NUMERIC_SHAPING;
field public static final java.awt.font.TextAttribute POSTURE;
- field public static final java.lang.Float POSTURE_OBLIQUE;
- field public static final java.lang.Float POSTURE_REGULAR;
+ field public static final Float POSTURE_OBLIQUE;
+ field public static final Float POSTURE_REGULAR;
field public static final java.awt.font.TextAttribute RUN_DIRECTION;
- field public static final java.lang.Boolean RUN_DIRECTION_LTR;
- field public static final java.lang.Boolean RUN_DIRECTION_RTL;
+ field public static final Boolean RUN_DIRECTION_LTR;
+ field public static final Boolean RUN_DIRECTION_RTL;
field public static final java.awt.font.TextAttribute SIZE;
field public static final java.awt.font.TextAttribute STRIKETHROUGH;
- field public static final java.lang.Boolean STRIKETHROUGH_ON;
+ field public static final Boolean STRIKETHROUGH_ON;
field public static final java.awt.font.TextAttribute SUPERSCRIPT;
- field public static final java.lang.Integer SUPERSCRIPT_SUB;
- field public static final java.lang.Integer SUPERSCRIPT_SUPER;
+ field public static final Integer SUPERSCRIPT_SUB;
+ field public static final Integer SUPERSCRIPT_SUPER;
field public static final java.awt.font.TextAttribute SWAP_COLORS;
- field public static final java.lang.Boolean SWAP_COLORS_ON;
+ field public static final Boolean SWAP_COLORS_ON;
field public static final java.awt.font.TextAttribute TRACKING;
- field public static final java.lang.Float TRACKING_LOOSE;
- field public static final java.lang.Float TRACKING_TIGHT;
+ field public static final Float TRACKING_LOOSE;
+ field public static final Float TRACKING_TIGHT;
field public static final java.awt.font.TextAttribute TRANSFORM;
field public static final java.awt.font.TextAttribute UNDERLINE;
- field public static final java.lang.Integer UNDERLINE_LOW_DASHED;
- field public static final java.lang.Integer UNDERLINE_LOW_DOTTED;
- field public static final java.lang.Integer UNDERLINE_LOW_GRAY;
- field public static final java.lang.Integer UNDERLINE_LOW_ONE_PIXEL;
- field public static final java.lang.Integer UNDERLINE_LOW_TWO_PIXEL;
- field public static final java.lang.Integer UNDERLINE_ON;
+ field public static final Integer UNDERLINE_LOW_DASHED;
+ field public static final Integer UNDERLINE_LOW_DOTTED;
+ field public static final Integer UNDERLINE_LOW_GRAY;
+ field public static final Integer UNDERLINE_LOW_ONE_PIXEL;
+ field public static final Integer UNDERLINE_LOW_TWO_PIXEL;
+ field public static final Integer UNDERLINE_ON;
field public static final java.awt.font.TextAttribute WEIGHT;
- field public static final java.lang.Float WEIGHT_BOLD;
- field public static final java.lang.Float WEIGHT_DEMIBOLD;
- field public static final java.lang.Float WEIGHT_DEMILIGHT;
- field public static final java.lang.Float WEIGHT_EXTRABOLD;
- field public static final java.lang.Float WEIGHT_EXTRA_LIGHT;
- field public static final java.lang.Float WEIGHT_HEAVY;
- field public static final java.lang.Float WEIGHT_LIGHT;
- field public static final java.lang.Float WEIGHT_MEDIUM;
- field public static final java.lang.Float WEIGHT_REGULAR;
- field public static final java.lang.Float WEIGHT_SEMIBOLD;
- field public static final java.lang.Float WEIGHT_ULTRABOLD;
+ field public static final Float WEIGHT_BOLD;
+ field public static final Float WEIGHT_DEMIBOLD;
+ field public static final Float WEIGHT_DEMILIGHT;
+ field public static final Float WEIGHT_EXTRABOLD;
+ field public static final Float WEIGHT_EXTRA_LIGHT;
+ field public static final Float WEIGHT_HEAVY;
+ field public static final Float WEIGHT_LIGHT;
+ field public static final Float WEIGHT_MEDIUM;
+ field public static final Float WEIGHT_REGULAR;
+ field public static final Float WEIGHT_SEMIBOLD;
+ field public static final Float WEIGHT_ULTRABOLD;
field public static final java.awt.font.TextAttribute WIDTH;
- field public static final java.lang.Float WIDTH_CONDENSED;
- field public static final java.lang.Float WIDTH_EXTENDED;
- field public static final java.lang.Float WIDTH_REGULAR;
- field public static final java.lang.Float WIDTH_SEMI_CONDENSED;
- field public static final java.lang.Float WIDTH_SEMI_EXTENDED;
+ field public static final Float WIDTH_CONDENSED;
+ field public static final Float WIDTH_EXTENDED;
+ field public static final Float WIDTH_REGULAR;
+ field public static final Float WIDTH_SEMI_CONDENSED;
+ field public static final Float WIDTH_SEMI_EXTENDED;
}
}
@@ -57449,45 +57725,45 @@ package java.awt.font {
package java.beans {
public class IndexedPropertyChangeEvent extends java.beans.PropertyChangeEvent {
- ctor public IndexedPropertyChangeEvent(java.lang.Object, java.lang.String, java.lang.Object, java.lang.Object, int);
+ ctor public IndexedPropertyChangeEvent(Object, String, Object, Object, int);
method public int getIndex();
}
public class PropertyChangeEvent extends java.util.EventObject {
- ctor public PropertyChangeEvent(java.lang.Object, java.lang.String, java.lang.Object, java.lang.Object);
- method public java.lang.Object getNewValue();
- method public java.lang.Object getOldValue();
- method public java.lang.Object getPropagationId();
- method public java.lang.String getPropertyName();
- method public void setPropagationId(java.lang.Object);
+ ctor public PropertyChangeEvent(Object, String, Object, Object);
+ method public Object getNewValue();
+ method public Object getOldValue();
+ method public Object getPropagationId();
+ method public String getPropertyName();
+ method public void setPropagationId(Object);
}
- public abstract interface PropertyChangeListener implements java.util.EventListener {
- method public abstract void propertyChange(java.beans.PropertyChangeEvent);
+ public interface PropertyChangeListener extends java.util.EventListener {
+ method public void propertyChange(java.beans.PropertyChangeEvent);
}
- public class PropertyChangeListenerProxy extends java.util.EventListenerProxy implements java.beans.PropertyChangeListener {
- ctor public PropertyChangeListenerProxy(java.lang.String, java.beans.PropertyChangeListener);
- method public java.lang.String getPropertyName();
+ public class PropertyChangeListenerProxy extends java.util.EventListenerProxy<java.beans.PropertyChangeListener> implements java.beans.PropertyChangeListener {
+ ctor public PropertyChangeListenerProxy(String, java.beans.PropertyChangeListener);
+ method public String getPropertyName();
method public void propertyChange(java.beans.PropertyChangeEvent);
}
public class PropertyChangeSupport implements java.io.Serializable {
- ctor public PropertyChangeSupport(java.lang.Object);
+ ctor public PropertyChangeSupport(Object);
method public void addPropertyChangeListener(java.beans.PropertyChangeListener);
- method public void addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener);
- method public void fireIndexedPropertyChange(java.lang.String, int, java.lang.Object, java.lang.Object);
- method public void fireIndexedPropertyChange(java.lang.String, int, int, int);
- method public void fireIndexedPropertyChange(java.lang.String, int, boolean, boolean);
- method public void firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object);
- method public void firePropertyChange(java.lang.String, int, int);
- method public void firePropertyChange(java.lang.String, boolean, boolean);
+ method public void addPropertyChangeListener(String, java.beans.PropertyChangeListener);
+ method public void fireIndexedPropertyChange(String, int, Object, Object);
+ method public void fireIndexedPropertyChange(String, int, int, int);
+ method public void fireIndexedPropertyChange(String, int, boolean, boolean);
+ method public void firePropertyChange(String, Object, Object);
+ method public void firePropertyChange(String, int, int);
+ method public void firePropertyChange(String, boolean, boolean);
method public void firePropertyChange(java.beans.PropertyChangeEvent);
method public java.beans.PropertyChangeListener[] getPropertyChangeListeners();
- method public java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String);
- method public boolean hasListeners(java.lang.String);
+ method public java.beans.PropertyChangeListener[] getPropertyChangeListeners(String);
+ method public boolean hasListeners(String);
method public void removePropertyChangeListener(java.beans.PropertyChangeListener);
- method public void removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener);
+ method public void removePropertyChangeListener(String, java.beans.PropertyChangeListener);
}
}
@@ -57497,10 +57773,6 @@ package java.io {
public class BufferedInputStream extends java.io.FilterInputStream {
ctor public BufferedInputStream(java.io.InputStream);
ctor public BufferedInputStream(java.io.InputStream, int);
- method public synchronized int available() throws java.io.IOException;
- method public synchronized int read() throws java.io.IOException;
- method public synchronized int read(byte[], int, int) throws java.io.IOException;
- method public synchronized long skip(long) throws java.io.IOException;
field protected volatile byte[] buf;
field protected int count;
field protected int marklimit;
@@ -57511,9 +57783,6 @@ package java.io {
public class BufferedOutputStream extends java.io.FilterOutputStream {
ctor public BufferedOutputStream(java.io.OutputStream);
ctor public BufferedOutputStream(java.io.OutputStream, int);
- method public synchronized void flush() throws java.io.IOException;
- method public synchronized void write(int) throws java.io.IOException;
- method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
}
@@ -57524,7 +57793,7 @@ package java.io {
method public void close() throws java.io.IOException;
method public java.util.stream.Stream<java.lang.String> lines();
method public int read(char[], int, int) throws java.io.IOException;
- method public java.lang.String readLine() throws java.io.IOException;
+ method public String readLine() throws java.io.IOException;
}
public class BufferedWriter extends java.io.Writer {
@@ -57539,12 +57808,11 @@ package java.io {
public class ByteArrayInputStream extends java.io.InputStream {
ctor public ByteArrayInputStream(byte[]);
ctor public ByteArrayInputStream(byte[], int, int);
- method public synchronized int available();
- method public void mark(int);
- method public synchronized int read();
- method public synchronized int read(byte[], int, int);
- method public synchronized void reset();
- method public synchronized long skip(long);
+ method public int available();
+ method public int read();
+ method public int read(byte[], int, int);
+ method public void reset();
+ method public long skip(long);
field protected byte[] buf;
field protected int count;
field protected int mark;
@@ -57554,15 +57822,14 @@ package java.io {
public class ByteArrayOutputStream extends java.io.OutputStream {
ctor public ByteArrayOutputStream();
ctor public ByteArrayOutputStream(int);
- method public synchronized void reset();
- method public synchronized int size();
- method public synchronized byte[] toByteArray();
- method public synchronized java.lang.String toString();
- method public synchronized java.lang.String toString(java.lang.String) throws java.io.UnsupportedEncodingException;
- method public deprecated synchronized java.lang.String toString(int);
- method public synchronized void write(int);
- method public synchronized void write(byte[], int, int);
- method public synchronized void writeTo(java.io.OutputStream) throws java.io.IOException;
+ method public void reset();
+ method public int size();
+ method public byte[] toByteArray();
+ method @NonNull public String toString(@NonNull String) throws java.io.UnsupportedEncodingException;
+ method @Deprecated @NonNull public String toString(int);
+ method public void write(int);
+ method public void write(byte[], int, int);
+ method public void writeTo(@NonNull java.io.OutputStream) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
}
@@ -57581,8 +57848,8 @@ package java.io {
public class CharArrayWriter extends java.io.Writer {
ctor public CharArrayWriter();
ctor public CharArrayWriter(int);
- method public java.io.CharArrayWriter append(java.lang.CharSequence);
- method public java.io.CharArrayWriter append(java.lang.CharSequence, int, int);
+ method public java.io.CharArrayWriter append(CharSequence);
+ method public java.io.CharArrayWriter append(CharSequence, int, int);
method public java.io.CharArrayWriter append(char);
method public void close();
method public void flush();
@@ -57591,7 +57858,7 @@ package java.io {
method public char[] toCharArray();
method public void write(int);
method public void write(char[], int, int);
- method public void write(java.lang.String, int, int);
+ method public void write(String, int, int);
method public void writeTo(java.io.Writer) throws java.io.IOException;
field protected char[] buf;
field protected int count;
@@ -57599,41 +57866,41 @@ package java.io {
public class CharConversionException extends java.io.IOException {
ctor public CharConversionException();
- ctor public CharConversionException(java.lang.String);
+ ctor public CharConversionException(String);
}
- public abstract interface Closeable implements java.lang.AutoCloseable {
- method public abstract void close() throws java.io.IOException;
+ public interface Closeable extends java.lang.AutoCloseable {
+ method public void close() throws java.io.IOException;
}
public final class Console implements java.io.Flushable {
method public void flush();
- method public java.io.Console format(java.lang.String, java.lang.Object...);
- method public java.io.Console printf(java.lang.String, java.lang.Object...);
- method public java.lang.String readLine(java.lang.String, java.lang.Object...);
- method public java.lang.String readLine();
- method public char[] readPassword(java.lang.String, java.lang.Object...);
+ method public java.io.Console format(String, java.lang.Object...);
+ method public java.io.Console printf(String, java.lang.Object...);
+ method public String readLine(String, java.lang.Object...);
+ method public String readLine();
+ method public char[] readPassword(String, java.lang.Object...);
method public char[] readPassword();
method public java.io.Reader reader();
method public java.io.PrintWriter writer();
}
- public abstract interface DataInput {
- method public abstract boolean readBoolean() throws java.io.IOException;
- method public abstract byte readByte() throws java.io.IOException;
- method public abstract char readChar() throws java.io.IOException;
- method public abstract double readDouble() throws java.io.IOException;
- method public abstract float readFloat() throws java.io.IOException;
- method public abstract void readFully(byte[]) throws java.io.IOException;
- method public abstract void readFully(byte[], int, int) throws java.io.IOException;
- method public abstract int readInt() throws java.io.IOException;
- method public abstract java.lang.String readLine() throws java.io.IOException;
- method public abstract long readLong() throws java.io.IOException;
- method public abstract short readShort() throws java.io.IOException;
- method public abstract java.lang.String readUTF() throws java.io.IOException;
- method public abstract int readUnsignedByte() throws java.io.IOException;
- method public abstract int readUnsignedShort() throws java.io.IOException;
- method public abstract int skipBytes(int) throws java.io.IOException;
+ public interface DataInput {
+ method public boolean readBoolean() throws java.io.IOException;
+ method public byte readByte() throws java.io.IOException;
+ method public char readChar() throws java.io.IOException;
+ method public double readDouble() throws java.io.IOException;
+ method public float readFloat() throws java.io.IOException;
+ method public void readFully(byte[]) throws java.io.IOException;
+ method public void readFully(byte[], int, int) throws java.io.IOException;
+ method public int readInt() throws java.io.IOException;
+ method public String readLine() throws java.io.IOException;
+ method public long readLong() throws java.io.IOException;
+ method public short readShort() throws java.io.IOException;
+ method public String readUTF() throws java.io.IOException;
+ method public int readUnsignedByte() throws java.io.IOException;
+ method public int readUnsignedShort() throws java.io.IOException;
+ method public int skipBytes(int) throws java.io.IOException;
}
public class DataInputStream extends java.io.FilterInputStream implements java.io.DataInput {
@@ -57648,86 +57915,84 @@ package java.io {
method public final void readFully(byte[]) throws java.io.IOException;
method public final void readFully(byte[], int, int) throws java.io.IOException;
method public final int readInt() throws java.io.IOException;
- method public final deprecated java.lang.String readLine() throws java.io.IOException;
+ method @Deprecated public final String readLine() throws java.io.IOException;
method public final long readLong() throws java.io.IOException;
method public final short readShort() throws java.io.IOException;
- method public final java.lang.String readUTF() throws java.io.IOException;
- method public static final java.lang.String readUTF(java.io.DataInput) throws java.io.IOException;
+ method public final String readUTF() throws java.io.IOException;
+ method public static final String readUTF(java.io.DataInput) throws java.io.IOException;
method public final int readUnsignedByte() throws java.io.IOException;
method public final int readUnsignedShort() throws java.io.IOException;
method public final int skipBytes(int) throws java.io.IOException;
}
- public abstract interface DataOutput {
- method public abstract void write(int) throws java.io.IOException;
- method public abstract void write(byte[]) throws java.io.IOException;
- method public abstract void write(byte[], int, int) throws java.io.IOException;
- method public abstract void writeBoolean(boolean) throws java.io.IOException;
- method public abstract void writeByte(int) throws java.io.IOException;
- method public abstract void writeBytes(java.lang.String) throws java.io.IOException;
- method public abstract void writeChar(int) throws java.io.IOException;
- method public abstract void writeChars(java.lang.String) throws java.io.IOException;
- method public abstract void writeDouble(double) throws java.io.IOException;
- method public abstract void writeFloat(float) throws java.io.IOException;
- method public abstract void writeInt(int) throws java.io.IOException;
- method public abstract void writeLong(long) throws java.io.IOException;
- method public abstract void writeShort(int) throws java.io.IOException;
- method public abstract void writeUTF(java.lang.String) throws java.io.IOException;
+ public interface DataOutput {
+ method public void write(int) throws java.io.IOException;
+ method public void write(byte[]) throws java.io.IOException;
+ method public void write(byte[], int, int) throws java.io.IOException;
+ method public void writeBoolean(boolean) throws java.io.IOException;
+ method public void writeByte(int) throws java.io.IOException;
+ method public void writeBytes(String) throws java.io.IOException;
+ method public void writeChar(int) throws java.io.IOException;
+ method public void writeChars(String) throws java.io.IOException;
+ method public void writeDouble(double) throws java.io.IOException;
+ method public void writeFloat(float) throws java.io.IOException;
+ method public void writeInt(int) throws java.io.IOException;
+ method public void writeLong(long) throws java.io.IOException;
+ method public void writeShort(int) throws java.io.IOException;
+ method public void writeUTF(String) throws java.io.IOException;
}
public class DataOutputStream extends java.io.FilterOutputStream implements java.io.DataOutput {
ctor public DataOutputStream(java.io.OutputStream);
method public final int size();
- method public synchronized void write(int) throws java.io.IOException;
- method public synchronized void write(byte[], int, int) throws java.io.IOException;
method public final void writeBoolean(boolean) throws java.io.IOException;
method public final void writeByte(int) throws java.io.IOException;
- method public final void writeBytes(java.lang.String) throws java.io.IOException;
+ method public final void writeBytes(String) throws java.io.IOException;
method public final void writeChar(int) throws java.io.IOException;
- method public final void writeChars(java.lang.String) throws java.io.IOException;
+ method public final void writeChars(String) throws java.io.IOException;
method public final void writeDouble(double) throws java.io.IOException;
method public final void writeFloat(float) throws java.io.IOException;
method public final void writeInt(int) throws java.io.IOException;
method public final void writeLong(long) throws java.io.IOException;
method public final void writeShort(int) throws java.io.IOException;
- method public final void writeUTF(java.lang.String) throws java.io.IOException;
+ method public final void writeUTF(String) throws java.io.IOException;
field protected int written;
}
public class EOFException extends java.io.IOException {
ctor public EOFException();
- ctor public EOFException(java.lang.String);
+ ctor public EOFException(String);
}
- public abstract interface Externalizable implements java.io.Serializable {
- method public abstract void readExternal(java.io.ObjectInput) throws java.lang.ClassNotFoundException, java.io.IOException;
- method public abstract void writeExternal(java.io.ObjectOutput) throws java.io.IOException;
+ public interface Externalizable extends java.io.Serializable {
+ method public void readExternal(java.io.ObjectInput) throws java.lang.ClassNotFoundException, java.io.IOException;
+ method public void writeExternal(java.io.ObjectOutput) throws java.io.IOException;
}
- public class File implements java.lang.Comparable java.io.Serializable {
- ctor public File(java.lang.String);
- ctor public File(java.lang.String, java.lang.String);
- ctor public File(java.io.File, java.lang.String);
- ctor public File(java.net.URI);
+ public class File implements java.lang.Comparable<java.io.File> java.io.Serializable {
+ ctor public File(@NonNull String);
+ ctor public File(@Nullable String, @NonNull String);
+ ctor public File(@Nullable java.io.File, @NonNull String);
+ ctor public File(@NonNull java.net.URI);
method public boolean canExecute();
method public boolean canRead();
method public boolean canWrite();
- method public int compareTo(java.io.File);
+ method public int compareTo(@NonNull java.io.File);
method public boolean createNewFile() throws java.io.IOException;
- method public static java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File) throws java.io.IOException;
- method public static java.io.File createTempFile(java.lang.String, java.lang.String) throws java.io.IOException;
+ method @NonNull public static java.io.File createTempFile(@NonNull String, @Nullable String, @Nullable java.io.File) throws java.io.IOException;
+ method @NonNull public static java.io.File createTempFile(@NonNull String, @Nullable String) throws java.io.IOException;
method public boolean delete();
method public void deleteOnExit();
method public boolean exists();
- method public java.io.File getAbsoluteFile();
- method public java.lang.String getAbsolutePath();
- method public java.io.File getCanonicalFile() throws java.io.IOException;
- method public java.lang.String getCanonicalPath() throws java.io.IOException;
+ method @NonNull public java.io.File getAbsoluteFile();
+ method @NonNull public String getAbsolutePath();
+ method @NonNull public java.io.File getCanonicalFile() throws java.io.IOException;
+ method @NonNull public String getCanonicalPath() throws java.io.IOException;
method public long getFreeSpace();
- method public java.lang.String getName();
- method public java.lang.String getParent();
- method public java.io.File getParentFile();
- method public java.lang.String getPath();
+ method @NonNull public String getName();
+ method @Nullable public String getParent();
+ method @Nullable public java.io.File getParentFile();
+ method @NonNull public String getPath();
method public long getTotalSpace();
method public long getUsableSpace();
method public boolean isAbsolute();
@@ -57736,15 +58001,15 @@ package java.io {
method public boolean isHidden();
method public long lastModified();
method public long length();
- method public java.lang.String[] list();
- method public java.lang.String[] list(java.io.FilenameFilter);
+ method public String[] list();
+ method public String[] list(@Nullable java.io.FilenameFilter);
method public java.io.File[] listFiles();
- method public java.io.File[] listFiles(java.io.FilenameFilter);
- method public java.io.File[] listFiles(java.io.FileFilter);
+ method public java.io.File[] listFiles(@Nullable java.io.FilenameFilter);
+ method public java.io.File[] listFiles(@Nullable java.io.FileFilter);
method public static java.io.File[] listRoots();
method public boolean mkdir();
method public boolean mkdirs();
- method public boolean renameTo(java.io.File);
+ method public boolean renameTo(@NonNull java.io.File);
method public boolean setExecutable(boolean, boolean);
method public boolean setExecutable(boolean);
method public boolean setLastModified(long);
@@ -57753,12 +58018,12 @@ package java.io {
method public boolean setReadable(boolean);
method public boolean setWritable(boolean, boolean);
method public boolean setWritable(boolean);
- method public java.nio.file.Path toPath();
- method public java.net.URI toURI();
- method public deprecated java.net.URL toURL() throws java.net.MalformedURLException;
- field public static final java.lang.String pathSeparator;
+ method @NonNull public java.nio.file.Path toPath();
+ method @NonNull public java.net.URI toURI();
+ method @Deprecated @NonNull public java.net.URL toURL() throws java.net.MalformedURLException;
+ field @NonNull public static final String pathSeparator;
field public static final char pathSeparatorChar;
- field public static final java.lang.String separator;
+ field @NonNull public static final String separator;
field public static final char separatorChar;
}
@@ -57771,12 +58036,12 @@ package java.io {
field public static final java.io.FileDescriptor out;
}
- public abstract interface FileFilter {
- method public abstract boolean accept(java.io.File);
+ @java.lang.FunctionalInterface public interface FileFilter {
+ method public boolean accept(java.io.File);
}
public class FileInputStream extends java.io.InputStream {
- ctor public FileInputStream(java.lang.String) throws java.io.FileNotFoundException;
+ ctor public FileInputStream(String) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.FileDescriptor);
method protected void finalize() throws java.io.IOException;
@@ -57787,12 +58052,12 @@ package java.io {
public class FileNotFoundException extends java.io.IOException {
ctor public FileNotFoundException();
- ctor public FileNotFoundException(java.lang.String);
+ ctor public FileNotFoundException(String);
}
public class FileOutputStream extends java.io.OutputStream {
- ctor public FileOutputStream(java.lang.String) throws java.io.FileNotFoundException;
- ctor public FileOutputStream(java.lang.String, boolean) throws java.io.FileNotFoundException;
+ ctor public FileOutputStream(String) throws java.io.FileNotFoundException;
+ ctor public FileOutputStream(String, boolean) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.File, boolean) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.FileDescriptor);
@@ -57803,27 +58068,27 @@ package java.io {
}
public final class FilePermission extends java.security.Permission implements java.io.Serializable {
- ctor public FilePermission(java.lang.String, java.lang.String);
- method public java.lang.String getActions();
+ ctor public FilePermission(String, String);
+ method public String getActions();
method public boolean implies(java.security.Permission);
}
public class FileReader extends java.io.InputStreamReader {
- ctor public FileReader(java.lang.String) throws java.io.FileNotFoundException;
+ ctor public FileReader(String) throws java.io.FileNotFoundException;
ctor public FileReader(java.io.File) throws java.io.FileNotFoundException;
ctor public FileReader(java.io.FileDescriptor);
}
public class FileWriter extends java.io.OutputStreamWriter {
- ctor public FileWriter(java.lang.String) throws java.io.IOException;
- ctor public FileWriter(java.lang.String, boolean) throws java.io.IOException;
+ ctor public FileWriter(String) throws java.io.IOException;
+ ctor public FileWriter(String, boolean) throws java.io.IOException;
ctor public FileWriter(java.io.File) throws java.io.IOException;
ctor public FileWriter(java.io.File, boolean) throws java.io.IOException;
ctor public FileWriter(java.io.FileDescriptor);
}
- public abstract interface FilenameFilter {
- method public abstract boolean accept(java.io.File, java.lang.String);
+ @java.lang.FunctionalInterface public interface FilenameFilter {
+ method public boolean accept(java.io.File, String);
}
public class FilterInputStream extends java.io.InputStream {
@@ -57853,66 +58118,64 @@ package java.io {
field protected java.io.Writer out;
}
- public abstract interface Flushable {
- method public abstract void flush() throws java.io.IOException;
+ public interface Flushable {
+ method public void flush() throws java.io.IOException;
}
public class IOError extends java.lang.Error {
- ctor public IOError(java.lang.Throwable);
+ ctor public IOError(Throwable);
}
public class IOException extends java.lang.Exception {
ctor public IOException();
- ctor public IOException(java.lang.String);
- ctor public IOException(java.lang.String, java.lang.Throwable);
- ctor public IOException(java.lang.Throwable);
+ ctor public IOException(String);
+ ctor public IOException(String, Throwable);
+ ctor public IOException(Throwable);
}
public abstract class InputStream implements java.io.Closeable {
ctor public InputStream();
method public int available() throws java.io.IOException;
method public void close() throws java.io.IOException;
- method public synchronized void mark(int);
+ method public void mark(int);
method public boolean markSupported();
method public abstract int read() throws java.io.IOException;
method public int read(byte[]) throws java.io.IOException;
method public int read(byte[], int, int) throws java.io.IOException;
- method public synchronized void reset() throws java.io.IOException;
+ method public void reset() throws java.io.IOException;
method public long skip(long) throws java.io.IOException;
}
public class InputStreamReader extends java.io.Reader {
ctor public InputStreamReader(java.io.InputStream);
- ctor public InputStreamReader(java.io.InputStream, java.lang.String) throws java.io.UnsupportedEncodingException;
+ ctor public InputStreamReader(java.io.InputStream, String) throws java.io.UnsupportedEncodingException;
ctor public InputStreamReader(java.io.InputStream, java.nio.charset.Charset);
ctor public InputStreamReader(java.io.InputStream, java.nio.charset.CharsetDecoder);
method public void close() throws java.io.IOException;
- method public java.lang.String getEncoding();
+ method public String getEncoding();
method public int read(char[], int, int) throws java.io.IOException;
}
public class InterruptedIOException extends java.io.IOException {
ctor public InterruptedIOException();
- ctor public InterruptedIOException(java.lang.String);
+ ctor public InterruptedIOException(String);
field public int bytesTransferred;
}
public class InvalidClassException extends java.io.ObjectStreamException {
- ctor public InvalidClassException(java.lang.String);
- ctor public InvalidClassException(java.lang.String, java.lang.String);
- field public java.lang.String classname;
+ ctor public InvalidClassException(String);
+ ctor public InvalidClassException(String, String);
+ field public String classname;
}
public class InvalidObjectException extends java.io.ObjectStreamException {
- ctor public InvalidObjectException(java.lang.String);
+ ctor public InvalidObjectException(String);
}
- public deprecated class LineNumberInputStream extends java.io.FilterInputStream {
- ctor public LineNumberInputStream(java.io.InputStream);
- method public int getLineNumber();
- method public void mark(int);
- method public void reset() throws java.io.IOException;
- method public void setLineNumber(int);
+ @Deprecated public class LineNumberInputStream extends java.io.FilterInputStream {
+ ctor @Deprecated public LineNumberInputStream(java.io.InputStream);
+ method @Deprecated public int getLineNumber();
+ method @Deprecated public void setLineNumber(int);
}
public class LineNumberReader extends java.io.BufferedReader {
@@ -57923,23 +58186,23 @@ package java.io {
}
public class NotActiveException extends java.io.ObjectStreamException {
- ctor public NotActiveException(java.lang.String);
+ ctor public NotActiveException(String);
ctor public NotActiveException();
}
public class NotSerializableException extends java.io.ObjectStreamException {
- ctor public NotSerializableException(java.lang.String);
+ ctor public NotSerializableException(String);
ctor public NotSerializableException();
}
- public abstract interface ObjectInput implements java.lang.AutoCloseable java.io.DataInput {
- method public abstract int available() throws java.io.IOException;
- method public abstract void close() throws java.io.IOException;
- method public abstract int read() throws java.io.IOException;
- method public abstract int read(byte[]) throws java.io.IOException;
- method public abstract int read(byte[], int, int) throws java.io.IOException;
- method public abstract java.lang.Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException;
- method public abstract long skip(long) throws java.io.IOException;
+ public interface ObjectInput extends java.io.DataInput java.lang.AutoCloseable {
+ method public int available() throws java.io.IOException;
+ method public void close() throws java.io.IOException;
+ method public int read() throws java.io.IOException;
+ method public int read(byte[]) throws java.io.IOException;
+ method public int read(byte[], int, int) throws java.io.IOException;
+ method public Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException;
+ method public long skip(long) throws java.io.IOException;
}
public class ObjectInputStream extends java.io.InputStream implements java.io.ObjectInput java.io.ObjectStreamConstants {
@@ -57958,106 +58221,106 @@ package java.io {
method public void readFully(byte[]) throws java.io.IOException;
method public void readFully(byte[], int, int) throws java.io.IOException;
method public int readInt() throws java.io.IOException;
- method public deprecated java.lang.String readLine() throws java.io.IOException;
+ method @Deprecated public String readLine() throws java.io.IOException;
method public long readLong() throws java.io.IOException;
- method public final java.lang.Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException;
- method protected java.lang.Object readObjectOverride() throws java.lang.ClassNotFoundException, java.io.IOException;
+ method public final Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException;
+ method protected Object readObjectOverride() throws java.lang.ClassNotFoundException, java.io.IOException;
method public short readShort() throws java.io.IOException;
method protected void readStreamHeader() throws java.io.IOException, java.io.StreamCorruptedException;
- method public java.lang.String readUTF() throws java.io.IOException;
- method public java.lang.Object readUnshared() throws java.lang.ClassNotFoundException, java.io.IOException;
+ method public String readUTF() throws java.io.IOException;
+ method public Object readUnshared() throws java.lang.ClassNotFoundException, java.io.IOException;
method public int readUnsignedByte() throws java.io.IOException;
method public int readUnsignedShort() throws java.io.IOException;
method public void registerValidation(java.io.ObjectInputValidation, int) throws java.io.InvalidObjectException, java.io.NotActiveException;
- method protected java.lang.Class<?> resolveClass(java.io.ObjectStreamClass) throws java.lang.ClassNotFoundException, java.io.IOException;
- method protected java.lang.Object resolveObject(java.lang.Object) throws java.io.IOException;
- method protected java.lang.Class<?> resolveProxyClass(java.lang.String[]) throws java.lang.ClassNotFoundException, java.io.IOException;
+ method protected Class<?> resolveClass(java.io.ObjectStreamClass) throws java.lang.ClassNotFoundException, java.io.IOException;
+ method protected Object resolveObject(Object) throws java.io.IOException;
+ method protected Class<?> resolveProxyClass(String[]) throws java.lang.ClassNotFoundException, java.io.IOException;
method public int skipBytes(int) throws java.io.IOException;
}
- public static abstract class ObjectInputStream.GetField {
+ public abstract static class ObjectInputStream.GetField {
ctor public ObjectInputStream.GetField();
- method public abstract boolean defaulted(java.lang.String) throws java.io.IOException;
- method public abstract boolean get(java.lang.String, boolean) throws java.io.IOException;
- method public abstract byte get(java.lang.String, byte) throws java.io.IOException;
- method public abstract char get(java.lang.String, char) throws java.io.IOException;
- method public abstract short get(java.lang.String, short) throws java.io.IOException;
- method public abstract int get(java.lang.String, int) throws java.io.IOException;
- method public abstract long get(java.lang.String, long) throws java.io.IOException;
- method public abstract float get(java.lang.String, float) throws java.io.IOException;
- method public abstract double get(java.lang.String, double) throws java.io.IOException;
- method public abstract java.lang.Object get(java.lang.String, java.lang.Object) throws java.io.IOException;
+ method public abstract boolean defaulted(String) throws java.io.IOException;
+ method public abstract boolean get(String, boolean) throws java.io.IOException;
+ method public abstract byte get(String, byte) throws java.io.IOException;
+ method public abstract char get(String, char) throws java.io.IOException;
+ method public abstract short get(String, short) throws java.io.IOException;
+ method public abstract int get(String, int) throws java.io.IOException;
+ method public abstract long get(String, long) throws java.io.IOException;
+ method public abstract float get(String, float) throws java.io.IOException;
+ method public abstract double get(String, double) throws java.io.IOException;
+ method public abstract Object get(String, Object) throws java.io.IOException;
method public abstract java.io.ObjectStreamClass getObjectStreamClass();
}
- public abstract interface ObjectInputValidation {
- method public abstract void validateObject() throws java.io.InvalidObjectException;
+ public interface ObjectInputValidation {
+ method public void validateObject() throws java.io.InvalidObjectException;
}
- public abstract interface ObjectOutput implements java.lang.AutoCloseable java.io.DataOutput {
- method public abstract void close() throws java.io.IOException;
- method public abstract void flush() throws java.io.IOException;
- method public abstract void writeObject(java.lang.Object) throws java.io.IOException;
+ public interface ObjectOutput extends java.io.DataOutput java.lang.AutoCloseable {
+ method public void close() throws java.io.IOException;
+ method public void flush() throws java.io.IOException;
+ method public void writeObject(Object) throws java.io.IOException;
}
public class ObjectOutputStream extends java.io.OutputStream implements java.io.ObjectOutput java.io.ObjectStreamConstants {
ctor public ObjectOutputStream(java.io.OutputStream) throws java.io.IOException;
ctor protected ObjectOutputStream() throws java.io.IOException, java.lang.SecurityException;
- method protected void annotateClass(java.lang.Class<?>) throws java.io.IOException;
- method protected void annotateProxyClass(java.lang.Class<?>) throws java.io.IOException;
+ method protected void annotateClass(Class<?>) throws java.io.IOException;
+ method protected void annotateProxyClass(Class<?>) throws java.io.IOException;
method public void defaultWriteObject() throws java.io.IOException;
method protected void drain() throws java.io.IOException;
method protected boolean enableReplaceObject(boolean) throws java.lang.SecurityException;
method public java.io.ObjectOutputStream.PutField putFields() throws java.io.IOException;
- method protected java.lang.Object replaceObject(java.lang.Object) throws java.io.IOException;
+ method protected Object replaceObject(Object) throws java.io.IOException;
method public void reset() throws java.io.IOException;
method public void useProtocolVersion(int) throws java.io.IOException;
method public void write(int) throws java.io.IOException;
method public void writeBoolean(boolean) throws java.io.IOException;
method public void writeByte(int) throws java.io.IOException;
- method public void writeBytes(java.lang.String) throws java.io.IOException;
+ method public void writeBytes(String) throws java.io.IOException;
method public void writeChar(int) throws java.io.IOException;
- method public void writeChars(java.lang.String) throws java.io.IOException;
+ method public void writeChars(String) throws java.io.IOException;
method protected void writeClassDescriptor(java.io.ObjectStreamClass) throws java.io.IOException;
method public void writeDouble(double) throws java.io.IOException;
method public void writeFields() throws java.io.IOException;
method public void writeFloat(float) throws java.io.IOException;
method public void writeInt(int) throws java.io.IOException;
method public void writeLong(long) throws java.io.IOException;
- method public final void writeObject(java.lang.Object) throws java.io.IOException;
- method protected void writeObjectOverride(java.lang.Object) throws java.io.IOException;
+ method public final void writeObject(Object) throws java.io.IOException;
+ method protected void writeObjectOverride(Object) throws java.io.IOException;
method public void writeShort(int) throws java.io.IOException;
method protected void writeStreamHeader() throws java.io.IOException;
- method public void writeUTF(java.lang.String) throws java.io.IOException;
- method public void writeUnshared(java.lang.Object) throws java.io.IOException;
+ method public void writeUTF(String) throws java.io.IOException;
+ method public void writeUnshared(Object) throws java.io.IOException;
}
- public static abstract class ObjectOutputStream.PutField {
+ public abstract static class ObjectOutputStream.PutField {
ctor public ObjectOutputStream.PutField();
- method public abstract void put(java.lang.String, boolean);
- method public abstract void put(java.lang.String, byte);
- method public abstract void put(java.lang.String, char);
- method public abstract void put(java.lang.String, short);
- method public abstract void put(java.lang.String, int);
- method public abstract void put(java.lang.String, long);
- method public abstract void put(java.lang.String, float);
- method public abstract void put(java.lang.String, double);
- method public abstract void put(java.lang.String, java.lang.Object);
- method public abstract deprecated void write(java.io.ObjectOutput) throws java.io.IOException;
+ method public abstract void put(String, boolean);
+ method public abstract void put(String, byte);
+ method public abstract void put(String, char);
+ method public abstract void put(String, short);
+ method public abstract void put(String, int);
+ method public abstract void put(String, long);
+ method public abstract void put(String, float);
+ method public abstract void put(String, double);
+ method public abstract void put(String, Object);
+ method @Deprecated public abstract void write(java.io.ObjectOutput) throws java.io.IOException;
}
public class ObjectStreamClass implements java.io.Serializable {
- method public java.lang.Class<?> forClass();
- method public java.io.ObjectStreamField getField(java.lang.String);
+ method public Class<?> forClass();
+ method public java.io.ObjectStreamField getField(String);
method public java.io.ObjectStreamField[] getFields();
- method public java.lang.String getName();
+ method public String getName();
method public long getSerialVersionUID();
- method public static java.io.ObjectStreamClass lookup(java.lang.Class<?>);
- method public static java.io.ObjectStreamClass lookupAny(java.lang.Class<?>);
+ method public static java.io.ObjectStreamClass lookup(Class<?>);
+ method public static java.io.ObjectStreamClass lookupAny(Class<?>);
field public static final java.io.ObjectStreamField[] NO_FIELDS;
}
- public abstract interface ObjectStreamConstants {
+ public interface ObjectStreamConstants {
field public static final int PROTOCOL_VERSION_1 = 1; // 0x1
field public static final int PROTOCOL_VERSION_2 = 2; // 0x2
field public static final byte SC_BLOCK_DATA = 8; // 0x8
@@ -58090,19 +58353,19 @@ package java.io {
}
public abstract class ObjectStreamException extends java.io.IOException {
- ctor protected ObjectStreamException(java.lang.String);
+ ctor protected ObjectStreamException(String);
ctor protected ObjectStreamException();
}
- public class ObjectStreamField implements java.lang.Comparable {
- ctor public ObjectStreamField(java.lang.String, java.lang.Class<?>);
- ctor public ObjectStreamField(java.lang.String, java.lang.Class<?>, boolean);
- method public int compareTo(java.lang.Object);
- method public java.lang.String getName();
+ public class ObjectStreamField implements java.lang.Comparable<java.lang.Object> {
+ ctor public ObjectStreamField(String, Class<?>);
+ ctor public ObjectStreamField(String, Class<?>, boolean);
+ method public int compareTo(Object);
+ method public String getName();
method public int getOffset();
- method public java.lang.Class<?> getType();
+ method public Class<?> getType();
method public char getTypeCode();
- method public java.lang.String getTypeString();
+ method public String getTypeString();
method public boolean isPrimitive();
method public boolean isUnshared();
method protected void setOffset(int);
@@ -58123,13 +58386,13 @@ package java.io {
}
public class OutputStreamWriter extends java.io.Writer {
- ctor public OutputStreamWriter(java.io.OutputStream, java.lang.String) throws java.io.UnsupportedEncodingException;
+ ctor public OutputStreamWriter(java.io.OutputStream, String) throws java.io.UnsupportedEncodingException;
ctor public OutputStreamWriter(java.io.OutputStream);
ctor public OutputStreamWriter(java.io.OutputStream, java.nio.charset.Charset);
ctor public OutputStreamWriter(java.io.OutputStream, java.nio.charset.CharsetEncoder);
method public void close() throws java.io.IOException;
method public void flush() throws java.io.IOException;
- method public java.lang.String getEncoding();
+ method public String getEncoding();
method public void write(char[], int, int) throws java.io.IOException;
}
@@ -58138,11 +58401,9 @@ package java.io {
ctor public PipedInputStream(java.io.PipedOutputStream, int) throws java.io.IOException;
ctor public PipedInputStream();
ctor public PipedInputStream(int);
- method public synchronized int available() throws java.io.IOException;
method public void connect(java.io.PipedOutputStream) throws java.io.IOException;
- method public synchronized int read() throws java.io.IOException;
- method public synchronized int read(byte[], int, int) throws java.io.IOException;
- method protected synchronized void receive(int) throws java.io.IOException;
+ method public int read() throws java.io.IOException;
+ method protected void receive(int) throws java.io.IOException;
field protected static final int PIPE_SIZE = 1024; // 0x400
field protected byte[] buffer;
field protected int in;
@@ -58152,8 +58413,7 @@ package java.io {
public class PipedOutputStream extends java.io.OutputStream {
ctor public PipedOutputStream(java.io.PipedInputStream) throws java.io.IOException;
ctor public PipedOutputStream();
- method public synchronized void connect(java.io.PipedInputStream) throws java.io.IOException;
- method public synchronized void flush() throws java.io.IOException;
+ method public void connect(java.io.PipedInputStream) throws java.io.IOException;
method public void write(int) throws java.io.IOException;
}
@@ -58164,37 +58424,35 @@ package java.io {
ctor public PipedReader(int);
method public void close() throws java.io.IOException;
method public void connect(java.io.PipedWriter) throws java.io.IOException;
- method public synchronized int read() throws java.io.IOException;
- method public synchronized int read(char[], int, int) throws java.io.IOException;
- method public synchronized boolean ready() throws java.io.IOException;
+ method public int read(char[], int, int) throws java.io.IOException;
}
public class PipedWriter extends java.io.Writer {
ctor public PipedWriter(java.io.PipedReader) throws java.io.IOException;
ctor public PipedWriter();
method public void close() throws java.io.IOException;
- method public synchronized void connect(java.io.PipedReader) throws java.io.IOException;
- method public synchronized void flush() throws java.io.IOException;
+ method public void connect(java.io.PipedReader) throws java.io.IOException;
+ method public void flush() throws java.io.IOException;
method public void write(char[], int, int) throws java.io.IOException;
}
public class PrintStream extends java.io.FilterOutputStream implements java.lang.Appendable java.io.Closeable {
ctor public PrintStream(java.io.OutputStream);
ctor public PrintStream(java.io.OutputStream, boolean);
- ctor public PrintStream(java.io.OutputStream, boolean, java.lang.String) throws java.io.UnsupportedEncodingException;
- ctor public PrintStream(java.lang.String) throws java.io.FileNotFoundException;
- ctor public PrintStream(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public PrintStream(java.io.OutputStream, boolean, String) throws java.io.UnsupportedEncodingException;
+ ctor public PrintStream(String) throws java.io.FileNotFoundException;
+ ctor public PrintStream(String, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public PrintStream(java.io.File) throws java.io.FileNotFoundException;
- ctor public PrintStream(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
- method public java.io.PrintStream append(java.lang.CharSequence);
- method public java.io.PrintStream append(java.lang.CharSequence, int, int);
+ ctor public PrintStream(java.io.File, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ method public java.io.PrintStream append(CharSequence);
+ method public java.io.PrintStream append(CharSequence, int, int);
method public java.io.PrintStream append(char);
method public boolean checkError();
method protected void clearError();
method public void close();
method public void flush();
- method public java.io.PrintStream format(java.lang.String, java.lang.Object...);
- method public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object...);
+ method public java.io.PrintStream format(String, java.lang.Object...);
+ method public java.io.PrintStream format(java.util.Locale, String, java.lang.Object...);
method public void print(boolean);
method public void print(char);
method public void print(int);
@@ -58202,10 +58460,10 @@ package java.io {
method public void print(float);
method public void print(double);
method public void print(char[]);
- method public void print(java.lang.String);
- method public void print(java.lang.Object);
- method public java.io.PrintStream printf(java.lang.String, java.lang.Object...);
- method public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object...);
+ method public void print(String);
+ method public void print(Object);
+ method public java.io.PrintStream printf(String, java.lang.Object...);
+ method public java.io.PrintStream printf(java.util.Locale, String, java.lang.Object...);
method public void println();
method public void println(boolean);
method public void println(char);
@@ -58214,31 +58472,31 @@ package java.io {
method public void println(float);
method public void println(double);
method public void println(char[]);
- method public void println(java.lang.String);
- method public void println(java.lang.Object);
+ method public void println(String);
+ method public void println(Object);
method protected void setError();
method public void write(int);
method public void write(byte[], int, int);
}
public class PrintWriter extends java.io.Writer {
- ctor public PrintWriter(java.io.Writer);
- ctor public PrintWriter(java.io.Writer, boolean);
- ctor public PrintWriter(java.io.OutputStream);
- ctor public PrintWriter(java.io.OutputStream, boolean);
- ctor public PrintWriter(java.lang.String) throws java.io.FileNotFoundException;
- ctor public PrintWriter(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
- ctor public PrintWriter(java.io.File) throws java.io.FileNotFoundException;
- ctor public PrintWriter(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
- method public java.io.PrintWriter append(java.lang.CharSequence);
- method public java.io.PrintWriter append(java.lang.CharSequence, int, int);
- method public java.io.PrintWriter append(char);
+ ctor public PrintWriter(@NonNull java.io.Writer);
+ ctor public PrintWriter(@NonNull java.io.Writer, boolean);
+ ctor public PrintWriter(@NonNull java.io.OutputStream);
+ ctor public PrintWriter(@NonNull java.io.OutputStream, boolean);
+ ctor public PrintWriter(@NonNull String) throws java.io.FileNotFoundException;
+ ctor public PrintWriter(@NonNull String, @NonNull String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public PrintWriter(@NonNull java.io.File) throws java.io.FileNotFoundException;
+ ctor public PrintWriter(@NonNull java.io.File, @NonNull String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ method @NonNull public java.io.PrintWriter append(@Nullable CharSequence);
+ method @NonNull public java.io.PrintWriter append(@Nullable CharSequence, int, int);
+ method @NonNull public java.io.PrintWriter append(char);
method public boolean checkError();
method protected void clearError();
method public void close();
method public void flush();
- method public java.io.PrintWriter format(java.lang.String, java.lang.Object...);
- method public java.io.PrintWriter format(java.util.Locale, java.lang.String, java.lang.Object...);
+ method @NonNull public java.io.PrintWriter format(@NonNull String, java.lang.Object...);
+ method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
method public void print(boolean);
method public void print(char);
method public void print(int);
@@ -58246,10 +58504,10 @@ package java.io {
method public void print(float);
method public void print(double);
method public void print(char[]);
- method public void print(java.lang.String);
- method public void print(java.lang.Object);
- method public java.io.PrintWriter printf(java.lang.String, java.lang.Object...);
- method public java.io.PrintWriter printf(java.util.Locale, java.lang.String, java.lang.Object...);
+ method public void print(@Nullable String);
+ method public void print(@Nullable Object);
+ method @NonNull public java.io.PrintWriter printf(@NonNull String, java.lang.Object...);
+ method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
method public void println();
method public void println(boolean);
method public void println(char);
@@ -58258,21 +58516,20 @@ package java.io {
method public void println(float);
method public void println(double);
method public void println(char[]);
- method public void println(java.lang.String);
- method public void println(java.lang.Object);
+ method public void println(@Nullable String);
+ method public void println(@Nullable Object);
method protected void setError();
method public void write(int);
method public void write(char[], int, int);
method public void write(char[]);
- method public void write(java.lang.String, int, int);
- method public void write(java.lang.String);
+ method public void write(@NonNull String, int, int);
+ method public void write(@NonNull String);
field protected java.io.Writer out;
}
public class PushbackInputStream extends java.io.FilterInputStream {
ctor public PushbackInputStream(java.io.InputStream, int);
ctor public PushbackInputStream(java.io.InputStream);
- method public synchronized void close() throws java.io.IOException;
method public void unread(int) throws java.io.IOException;
method public void unread(byte[], int, int) throws java.io.IOException;
method public void unread(byte[]) throws java.io.IOException;
@@ -58289,8 +58546,8 @@ package java.io {
}
public class RandomAccessFile implements java.io.Closeable java.io.DataInput java.io.DataOutput {
- ctor public RandomAccessFile(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
- ctor public RandomAccessFile(java.io.File, java.lang.String) throws java.io.FileNotFoundException;
+ ctor public RandomAccessFile(String, String) throws java.io.FileNotFoundException;
+ ctor public RandomAccessFile(java.io.File, String) throws java.io.FileNotFoundException;
method public void close() throws java.io.IOException;
method public final java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
@@ -58307,10 +58564,10 @@ package java.io {
method public final void readFully(byte[]) throws java.io.IOException;
method public final void readFully(byte[], int, int) throws java.io.IOException;
method public final int readInt() throws java.io.IOException;
- method public final java.lang.String readLine() throws java.io.IOException;
+ method public final String readLine() throws java.io.IOException;
method public final long readLong() throws java.io.IOException;
method public final short readShort() throws java.io.IOException;
- method public final java.lang.String readUTF() throws java.io.IOException;
+ method public final String readUTF() throws java.io.IOException;
method public final int readUnsignedByte() throws java.io.IOException;
method public final int readUnsignedShort() throws java.io.IOException;
method public void seek(long) throws java.io.IOException;
@@ -58321,20 +58578,20 @@ package java.io {
method public void write(byte[], int, int) throws java.io.IOException;
method public final void writeBoolean(boolean) throws java.io.IOException;
method public final void writeByte(int) throws java.io.IOException;
- method public final void writeBytes(java.lang.String) throws java.io.IOException;
+ method public final void writeBytes(String) throws java.io.IOException;
method public final void writeChar(int) throws java.io.IOException;
- method public final void writeChars(java.lang.String) throws java.io.IOException;
+ method public final void writeChars(String) throws java.io.IOException;
method public final void writeDouble(double) throws java.io.IOException;
method public final void writeFloat(float) throws java.io.IOException;
method public final void writeInt(int) throws java.io.IOException;
method public final void writeLong(long) throws java.io.IOException;
method public final void writeShort(int) throws java.io.IOException;
- method public final void writeUTF(java.lang.String) throws java.io.IOException;
+ method public final void writeUTF(String) throws java.io.IOException;
}
public abstract class Reader implements java.io.Closeable java.lang.Readable {
ctor protected Reader();
- ctor protected Reader(java.lang.Object);
+ ctor protected Reader(Object);
method public void mark(int) throws java.io.IOException;
method public boolean markSupported();
method public int read(java.nio.CharBuffer) throws java.io.IOException;
@@ -58344,7 +58601,7 @@ package java.io {
method public boolean ready() throws java.io.IOException;
method public void reset() throws java.io.IOException;
method public long skip(long) throws java.io.IOException;
- field protected java.lang.Object lock;
+ field protected Object lock;
}
public class SequenceInputStream extends java.io.InputStream {
@@ -58353,21 +58610,21 @@ package java.io {
method public int read() throws java.io.IOException;
}
- public abstract interface Serializable {
+ public interface Serializable {
}
public final class SerializablePermission extends java.security.BasicPermission {
- ctor public SerializablePermission(java.lang.String);
- ctor public SerializablePermission(java.lang.String, java.lang.String);
+ ctor public SerializablePermission(String);
+ ctor public SerializablePermission(String, String);
}
public class StreamCorruptedException extends java.io.ObjectStreamException {
- ctor public StreamCorruptedException(java.lang.String);
+ ctor public StreamCorruptedException(String);
ctor public StreamCorruptedException();
}
public class StreamTokenizer {
- ctor public deprecated StreamTokenizer(java.io.InputStream);
+ ctor @Deprecated public StreamTokenizer(java.io.InputStream);
ctor public StreamTokenizer(java.io.Reader);
method public void commentChar(int);
method public void eolIsSignificant(boolean);
@@ -58389,24 +58646,24 @@ package java.io {
field public static final int TT_NUMBER = -2; // 0xfffffffe
field public static final int TT_WORD = -3; // 0xfffffffd
field public double nval;
- field public java.lang.String sval;
+ field public String sval;
field public int ttype;
}
- public deprecated class StringBufferInputStream extends java.io.InputStream {
- ctor public StringBufferInputStream(java.lang.String);
- method public synchronized int available();
- method public synchronized int read();
- method public synchronized int read(byte[], int, int);
- method public synchronized void reset();
- method public synchronized long skip(long);
- field protected java.lang.String buffer;
- field protected int count;
- field protected int pos;
+ @Deprecated public class StringBufferInputStream extends java.io.InputStream {
+ ctor @Deprecated public StringBufferInputStream(String);
+ method @Deprecated public int available();
+ method @Deprecated public int read();
+ method @Deprecated public int read(byte[], int, int);
+ method @Deprecated public void reset();
+ method @Deprecated public long skip(long);
+ field @Deprecated protected String buffer;
+ field @Deprecated protected int count;
+ field @Deprecated protected int pos;
}
public class StringReader extends java.io.Reader {
- ctor public StringReader(java.lang.String);
+ ctor public StringReader(String);
method public void close();
method public int read(char[], int, int) throws java.io.IOException;
}
@@ -58414,56 +58671,55 @@ package java.io {
public class StringWriter extends java.io.Writer {
ctor public StringWriter();
ctor public StringWriter(int);
- method public java.io.StringWriter append(java.lang.CharSequence);
- method public java.io.StringWriter append(java.lang.CharSequence, int, int);
+ method public java.io.StringWriter append(CharSequence);
+ method public java.io.StringWriter append(CharSequence, int, int);
method public java.io.StringWriter append(char);
method public void close() throws java.io.IOException;
method public void flush();
- method public java.lang.StringBuffer getBuffer();
+ method public StringBuffer getBuffer();
method public void write(int);
method public void write(char[], int, int);
- method public void write(java.lang.String);
- method public void write(java.lang.String, int, int);
+ method public void write(String);
+ method public void write(String, int, int);
}
public class SyncFailedException extends java.io.IOException {
- ctor public SyncFailedException(java.lang.String);
+ ctor public SyncFailedException(String);
}
public class UTFDataFormatException extends java.io.IOException {
ctor public UTFDataFormatException();
- ctor public UTFDataFormatException(java.lang.String);
+ ctor public UTFDataFormatException(String);
}
public class UncheckedIOException extends java.lang.RuntimeException {
- ctor public UncheckedIOException(java.lang.String, java.io.IOException);
+ ctor public UncheckedIOException(String, java.io.IOException);
ctor public UncheckedIOException(java.io.IOException);
method public java.io.IOException getCause();
}
public class UnsupportedEncodingException extends java.io.IOException {
ctor public UnsupportedEncodingException();
- ctor public UnsupportedEncodingException(java.lang.String);
+ ctor public UnsupportedEncodingException(String);
}
public class WriteAbortedException extends java.io.ObjectStreamException {
- ctor public WriteAbortedException(java.lang.String, java.lang.Exception);
- method public java.lang.Throwable getCause();
- field public java.lang.Exception detail;
+ ctor public WriteAbortedException(String, Exception);
+ field public Exception detail;
}
public abstract class Writer implements java.lang.Appendable java.io.Closeable java.io.Flushable {
ctor protected Writer();
- ctor protected Writer(java.lang.Object);
- method public java.io.Writer append(java.lang.CharSequence) throws java.io.IOException;
- method public java.io.Writer append(java.lang.CharSequence, int, int) throws java.io.IOException;
+ ctor protected Writer(Object);
+ method public java.io.Writer append(CharSequence) throws java.io.IOException;
+ method public java.io.Writer append(CharSequence, int, int) throws java.io.IOException;
method public java.io.Writer append(char) throws java.io.IOException;
method public void write(int) throws java.io.IOException;
method public void write(char[]) throws java.io.IOException;
method public abstract void write(char[], int, int) throws java.io.IOException;
- method public void write(java.lang.String) throws java.io.IOException;
- method public void write(java.lang.String, int, int) throws java.io.IOException;
- field protected java.lang.Object lock;
+ method public void write(String) throws java.io.IOException;
+ method public void write(String, int, int) throws java.io.IOException;
+ field protected Object lock;
}
}
@@ -58472,129 +58728,129 @@ package java.lang {
public class AbstractMethodError extends java.lang.IncompatibleClassChangeError {
ctor public AbstractMethodError();
- ctor public AbstractMethodError(java.lang.String);
+ ctor public AbstractMethodError(String);
}
- public abstract interface Appendable {
- method public abstract java.lang.Appendable append(java.lang.CharSequence) throws java.io.IOException;
- method public abstract java.lang.Appendable append(java.lang.CharSequence, int, int) throws java.io.IOException;
- method public abstract java.lang.Appendable append(char) throws java.io.IOException;
+ public interface Appendable {
+ method @NonNull public Appendable append(@Nullable CharSequence) throws java.io.IOException;
+ method @NonNull public Appendable append(@Nullable CharSequence, int, int) throws java.io.IOException;
+ method @NonNull public Appendable append(char) throws java.io.IOException;
}
public class ArithmeticException extends java.lang.RuntimeException {
ctor public ArithmeticException();
- ctor public ArithmeticException(java.lang.String);
+ ctor public ArithmeticException(String);
}
public class ArrayIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
ctor public ArrayIndexOutOfBoundsException();
ctor public ArrayIndexOutOfBoundsException(int);
- ctor public ArrayIndexOutOfBoundsException(java.lang.String);
+ ctor public ArrayIndexOutOfBoundsException(String);
}
public class ArrayStoreException extends java.lang.RuntimeException {
ctor public ArrayStoreException();
- ctor public ArrayStoreException(java.lang.String);
+ ctor public ArrayStoreException(String);
}
public class AssertionError extends java.lang.Error {
ctor public AssertionError();
- ctor public AssertionError(java.lang.Object);
+ ctor public AssertionError(Object);
ctor public AssertionError(boolean);
ctor public AssertionError(char);
ctor public AssertionError(int);
ctor public AssertionError(long);
ctor public AssertionError(float);
ctor public AssertionError(double);
- ctor public AssertionError(java.lang.String, java.lang.Throwable);
+ ctor public AssertionError(String, Throwable);
}
- public abstract interface AutoCloseable {
- method public abstract void close() throws java.lang.Exception;
+ public interface AutoCloseable {
+ method public void close() throws java.lang.Exception;
}
- public final class Boolean implements java.lang.Comparable java.io.Serializable {
+ public final class Boolean implements java.lang.Comparable<java.lang.Boolean> java.io.Serializable {
ctor public Boolean(boolean);
- ctor public Boolean(java.lang.String);
+ ctor public Boolean(@Nullable String);
method public boolean booleanValue();
method public static int compare(boolean, boolean);
- method public int compareTo(java.lang.Boolean);
- method public static boolean getBoolean(java.lang.String);
+ method public int compareTo(@NonNull Boolean);
+ method public static boolean getBoolean(@NonNull String);
method public static int hashCode(boolean);
method public static boolean logicalAnd(boolean, boolean);
method public static boolean logicalOr(boolean, boolean);
method public static boolean logicalXor(boolean, boolean);
- method public static boolean parseBoolean(java.lang.String);
- method public static java.lang.String toString(boolean);
- method public static java.lang.Boolean valueOf(boolean);
- method public static java.lang.Boolean valueOf(java.lang.String);
- field public static final java.lang.Boolean FALSE;
- field public static final java.lang.Boolean TRUE;
- field public static final java.lang.Class<java.lang.Boolean> TYPE;
+ method public static boolean parseBoolean(@Nullable String);
+ method @NonNull public static String toString(boolean);
+ method @NonNull public static Boolean valueOf(boolean);
+ method @NonNull public static Boolean valueOf(@Nullable String);
+ field public static final Boolean FALSE;
+ field public static final Boolean TRUE;
+ field public static final Class<java.lang.Boolean> TYPE;
}
public class BootstrapMethodError extends java.lang.LinkageError {
ctor public BootstrapMethodError();
- ctor public BootstrapMethodError(java.lang.String);
- ctor public BootstrapMethodError(java.lang.String, java.lang.Throwable);
- ctor public BootstrapMethodError(java.lang.Throwable);
+ ctor public BootstrapMethodError(String);
+ ctor public BootstrapMethodError(String, Throwable);
+ ctor public BootstrapMethodError(Throwable);
}
- public final class Byte extends java.lang.Number implements java.lang.Comparable {
+ public final class Byte extends java.lang.Number implements java.lang.Comparable<java.lang.Byte> {
ctor public Byte(byte);
- ctor public Byte(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Byte(@NonNull String) throws java.lang.NumberFormatException;
method public static int compare(byte, byte);
- method public int compareTo(java.lang.Byte);
- method public static java.lang.Byte decode(java.lang.String) throws java.lang.NumberFormatException;
+ method public int compareTo(@NonNull Byte);
+ method @NonNull public static Byte decode(@NonNull String) throws java.lang.NumberFormatException;
method public double doubleValue();
method public float floatValue();
method public static int hashCode(byte);
method public int intValue();
method public long longValue();
- method public static byte parseByte(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static byte parseByte(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.String toString(byte);
+ method public static byte parseByte(@NonNull String, int) throws java.lang.NumberFormatException;
+ method public static byte parseByte(@NonNull String) throws java.lang.NumberFormatException;
+ method @NonNull public static String toString(byte);
method public static int toUnsignedInt(byte);
method public static long toUnsignedLong(byte);
- method public static java.lang.Byte valueOf(byte);
- method public static java.lang.Byte valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static java.lang.Byte valueOf(java.lang.String) throws java.lang.NumberFormatException;
+ method @NonNull public static Byte valueOf(byte);
+ method @NonNull public static Byte valueOf(@NonNull String, int) throws java.lang.NumberFormatException;
+ method @NonNull public static Byte valueOf(@NonNull String) throws java.lang.NumberFormatException;
field public static final int BYTES = 1; // 0x1
field public static final byte MAX_VALUE = 127; // 0x7f
field public static final byte MIN_VALUE = -128; // 0xffffff80
field public static final int SIZE = 8; // 0x8
- field public static final java.lang.Class<java.lang.Byte> TYPE;
+ field public static final Class<java.lang.Byte> TYPE;
}
- public abstract interface CharSequence {
- method public abstract char charAt(int);
- method public default java.util.stream.IntStream chars();
- method public default java.util.stream.IntStream codePoints();
- method public abstract int length();
- method public abstract java.lang.CharSequence subSequence(int, int);
- method public abstract java.lang.String toString();
+ public interface CharSequence {
+ method public char charAt(int);
+ method @NonNull public default java.util.stream.IntStream chars();
+ method @NonNull public default java.util.stream.IntStream codePoints();
+ method public int length();
+ method @NonNull public CharSequence subSequence(int, int);
+ method @NonNull public String toString();
}
- public final class Character implements java.lang.Comparable java.io.Serializable {
+ public final class Character implements java.lang.Comparable<java.lang.Character> java.io.Serializable {
ctor public Character(char);
method public static int charCount(int);
method public char charValue();
- method public static int codePointAt(java.lang.CharSequence, int);
+ method public static int codePointAt(@NonNull CharSequence, int);
method public static int codePointAt(char[], int);
method public static int codePointAt(char[], int, int);
- method public static int codePointBefore(java.lang.CharSequence, int);
+ method public static int codePointBefore(@NonNull CharSequence, int);
method public static int codePointBefore(char[], int);
method public static int codePointBefore(char[], int, int);
- method public static int codePointCount(java.lang.CharSequence, int, int);
+ method public static int codePointCount(@NonNull CharSequence, int, int);
method public static int codePointCount(char[], int, int);
method public static int compare(char, char);
- method public int compareTo(java.lang.Character);
+ method public int compareTo(@NonNull Character);
method public static int digit(char, int);
method public static int digit(int, int);
method public static char forDigit(int, int);
method public static byte getDirectionality(char);
method public static byte getDirectionality(int);
- method public static java.lang.String getName(int);
+ method @Nullable public static String getName(int);
method public static int getNumericValue(char);
method public static int getNumericValue(int);
method public static int getType(char);
@@ -58617,8 +58873,8 @@ package java.lang {
method public static boolean isJavaIdentifierPart(int);
method public static boolean isJavaIdentifierStart(char);
method public static boolean isJavaIdentifierStart(int);
- method public static deprecated boolean isJavaLetter(char);
- method public static deprecated boolean isJavaLetterOrDigit(char);
+ method @Deprecated public static boolean isJavaLetter(char);
+ method @Deprecated public static boolean isJavaLetterOrDigit(char);
method public static boolean isLetter(char);
method public static boolean isLetter(int);
method public static boolean isLetterOrDigit(char);
@@ -58628,7 +58884,7 @@ package java.lang {
method public static boolean isLowerCase(int);
method public static boolean isMirrored(char);
method public static boolean isMirrored(int);
- method public static deprecated boolean isSpace(char);
+ method @Deprecated public static boolean isSpace(char);
method public static boolean isSpaceChar(char);
method public static boolean isSpaceChar(int);
method public static boolean isSupplementaryCodePoint(int);
@@ -58646,7 +58902,7 @@ package java.lang {
method public static boolean isWhitespace(char);
method public static boolean isWhitespace(int);
method public static char lowSurrogate(int);
- method public static int offsetByCodePoints(java.lang.CharSequence, int, int);
+ method public static int offsetByCodePoints(@NonNull CharSequence, int, int);
method public static int offsetByCodePoints(char[], int, int, int, int);
method public static char reverseBytes(char);
method public static int toChars(int, char[], int);
@@ -58654,12 +58910,12 @@ package java.lang {
method public static int toCodePoint(char, char);
method public static char toLowerCase(char);
method public static int toLowerCase(int);
- method public static java.lang.String toString(char);
+ method @NonNull public static String toString(char);
method public static char toTitleCase(char);
method public static int toTitleCase(int);
method public static char toUpperCase(char);
method public static int toUpperCase(int);
- method public static java.lang.Character valueOf(char);
+ method @NonNull public static Character valueOf(char);
field public static final int BYTES = 2; // 0x2
field public static final byte COMBINING_SPACING_MARK = 8; // 0x8
field public static final byte CONNECTOR_PUNCTUATION = 23; // 0x17
@@ -58723,22 +58979,22 @@ package java.lang {
field public static final byte START_PUNCTUATION = 21; // 0x15
field public static final byte SURROGATE = 19; // 0x13
field public static final byte TITLECASE_LETTER = 3; // 0x3
- field public static final java.lang.Class<java.lang.Character> TYPE;
+ field public static final Class<java.lang.Character> TYPE;
field public static final byte UNASSIGNED = 0; // 0x0
field public static final byte UPPERCASE_LETTER = 1; // 0x1
}
public static class Character.Subset {
- ctor protected Character.Subset(java.lang.String);
- method public final boolean equals(java.lang.Object);
+ ctor protected Character.Subset(@NonNull String);
+ method public final boolean equals(@Nullable Object);
method public final int hashCode();
- method public final java.lang.String toString();
+ method @NonNull public final String toString();
}
public static final class Character.UnicodeBlock extends java.lang.Character.Subset {
- method public static java.lang.Character.UnicodeBlock forName(java.lang.String);
- method public static java.lang.Character.UnicodeBlock of(char);
- method public static java.lang.Character.UnicodeBlock of(int);
+ method @NonNull public static java.lang.Character.UnicodeBlock forName(@NonNull String);
+ method @Nullable public static java.lang.Character.UnicodeBlock of(char);
+ method @Nullable public static java.lang.Character.UnicodeBlock of(int);
field public static final java.lang.Character.UnicodeBlock AEGEAN_NUMBERS;
field public static final java.lang.Character.UnicodeBlock ALCHEMICAL_SYMBOLS;
field public static final java.lang.Character.UnicodeBlock ALPHABETIC_PRESENTATION_FORMS;
@@ -58931,7 +59187,7 @@ package java.lang {
field public static final java.lang.Character.UnicodeBlock SUPPLEMENTAL_PUNCTUATION;
field public static final java.lang.Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A;
field public static final java.lang.Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B;
- field public static final deprecated java.lang.Character.UnicodeBlock SURROGATES_AREA;
+ field @Deprecated public static final java.lang.Character.UnicodeBlock SURROGATES_AREA;
field public static final java.lang.Character.UnicodeBlock SYLOTI_NAGRI;
field public static final java.lang.Character.UnicodeBlock SYRIAC;
field public static final java.lang.Character.UnicodeBlock TAGALOG;
@@ -58962,11 +59218,9 @@ package java.lang {
field public static final java.lang.Character.UnicodeBlock YI_SYLLABLES;
}
- public static final class Character.UnicodeScript extends java.lang.Enum {
- method public static java.lang.Character.UnicodeScript forName(java.lang.String);
- method public static java.lang.Character.UnicodeScript of(int);
- method public static java.lang.Character.UnicodeScript valueOf(java.lang.String);
- method public static final java.lang.Character.UnicodeScript[] values();
+ public enum Character.UnicodeScript {
+ method @NonNull public static java.lang.Character.UnicodeScript forName(@NonNull String);
+ method @NonNull public static java.lang.Character.UnicodeScript of(int);
enum_constant public static final java.lang.Character.UnicodeScript ARABIC;
enum_constant public static final java.lang.Character.UnicodeScript ARMENIAN;
enum_constant public static final java.lang.Character.UnicodeScript AVESTAN;
@@ -59073,152 +59327,151 @@ package java.lang {
}
public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
- method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
- method public T cast(java.lang.Object);
+ method @NonNull public <U> Class<? extends U> asSubclass(@NonNull Class<U>);
+ method @Nullable public T cast(@Nullable Object);
method public boolean desiredAssertionStatus();
- method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException;
- method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
- method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
+ method @NonNull public static Class<?> forName(@NonNull String) throws java.lang.ClassNotFoundException;
+ method @NonNull public static Class<?> forName(@NonNull String, boolean, @Nullable ClassLoader) throws java.lang.ClassNotFoundException;
+ method @Nullable public <A extends java.lang.annotation.Annotation> A getAnnotation(@NonNull Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
- method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
- method public java.lang.String getCanonicalName();
- method public java.lang.ClassLoader getClassLoader();
- method public java.lang.Class<?>[] getClasses();
- method public java.lang.Class<?> getComponentType();
- method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(@NonNull Class<A>);
+ method @Nullable public String getCanonicalName();
+ method @Nullable public ClassLoader getClassLoader();
+ method public Class<?>[] getClasses();
+ method @Nullable public Class<?> getComponentType();
+ method @NonNull public java.lang.reflect.Constructor<T> getConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
- method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
+ method @Nullable public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(@NonNull Class<A>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public java.lang.Class<?>[] getDeclaredClasses();
- method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method public Class<?>[] getDeclaredClasses();
+ method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
- method public java.lang.reflect.Field getDeclaredField(java.lang.String) throws java.lang.NoSuchFieldException;
+ method @NonNull public java.lang.reflect.Field getDeclaredField(@NonNull String) throws java.lang.NoSuchFieldException;
method public java.lang.reflect.Field[] getDeclaredFields();
- method public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
- method public java.lang.Class<?> getDeclaringClass();
- method public java.lang.Class<?> getEnclosingClass();
- method public java.lang.reflect.Constructor<?> getEnclosingConstructor();
- method public java.lang.reflect.Method getEnclosingMethod();
+ method @Nullable public Class<?> getDeclaringClass();
+ method @Nullable public Class<?> getEnclosingClass();
+ method @Nullable public java.lang.reflect.Constructor<?> getEnclosingConstructor();
+ method @Nullable public java.lang.reflect.Method getEnclosingMethod();
method public T[] getEnumConstants();
- method public java.lang.reflect.Field getField(java.lang.String) throws java.lang.NoSuchFieldException;
+ method @NonNull public java.lang.reflect.Field getField(@NonNull String) throws java.lang.NoSuchFieldException;
method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
method public java.lang.reflect.Type[] getGenericInterfaces();
- method public java.lang.reflect.Type getGenericSuperclass();
- method public java.lang.Class<?>[] getInterfaces();
- method public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @Nullable public java.lang.reflect.Type getGenericSuperclass();
+ method public Class<?>[] getInterfaces();
+ method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
method public int getModifiers();
- method public java.lang.String getName();
- method public java.lang.Package getPackage();
- method public java.security.ProtectionDomain getProtectionDomain();
- method public java.net.URL getResource(java.lang.String);
- method public java.io.InputStream getResourceAsStream(java.lang.String);
- method public java.lang.Object[] getSigners();
- method public java.lang.String getSimpleName();
- method public java.lang.Class<? super T> getSuperclass();
- method public synchronized java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
+ method @NonNull public String getName();
+ method @Nullable public Package getPackage();
+ method @Nullable public java.security.ProtectionDomain getProtectionDomain();
+ method @Nullable public java.net.URL getResource(@NonNull String);
+ method @Nullable public java.io.InputStream getResourceAsStream(@NonNull String);
+ method public Object[] getSigners();
+ method @NonNull public String getSimpleName();
+ method @Nullable public Class<? super T> getSuperclass();
+ method public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
method public boolean isAnnotation();
method public boolean isAnonymousClass();
method public boolean isArray();
- method public boolean isAssignableFrom(java.lang.Class<?>);
+ method public boolean isAssignableFrom(@NonNull Class<?>);
method public boolean isEnum();
- method public boolean isInstance(java.lang.Object);
+ method public boolean isInstance(@Nullable Object);
method public boolean isInterface();
method public boolean isLocalClass();
method public boolean isMemberClass();
method public boolean isPrimitive();
method public boolean isSynthetic();
- method public T newInstance() throws java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public java.lang.String toGenericString();
+ method @NonNull public T newInstance() throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @NonNull public String toGenericString();
}
public class ClassCastException extends java.lang.RuntimeException {
ctor public ClassCastException();
- ctor public ClassCastException(java.lang.String);
+ ctor public ClassCastException(String);
}
public class ClassCircularityError extends java.lang.LinkageError {
ctor public ClassCircularityError();
- ctor public ClassCircularityError(java.lang.String);
+ ctor public ClassCircularityError(String);
}
public class ClassFormatError extends java.lang.LinkageError {
ctor public ClassFormatError();
- ctor public ClassFormatError(java.lang.String);
+ ctor public ClassFormatError(String);
}
public abstract class ClassLoader {
- ctor protected ClassLoader(java.lang.ClassLoader);
+ ctor protected ClassLoader(ClassLoader);
ctor protected ClassLoader();
method public void clearAssertionStatus();
- method protected final deprecated java.lang.Class<?> defineClass(byte[], int, int) throws java.lang.ClassFormatError;
- method protected final java.lang.Class<?> defineClass(java.lang.String, byte[], int, int) throws java.lang.ClassFormatError;
- method protected final java.lang.Class<?> defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
- method protected final java.lang.Class<?> defineClass(java.lang.String, java.nio.ByteBuffer, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
- method protected java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL) throws java.lang.IllegalArgumentException;
- method protected java.lang.Class<?> findClass(java.lang.String) throws java.lang.ClassNotFoundException;
- method protected java.lang.String findLibrary(java.lang.String);
- method protected final java.lang.Class<?> findLoadedClass(java.lang.String);
- method protected java.net.URL findResource(java.lang.String);
- method protected java.util.Enumeration<java.net.URL> findResources(java.lang.String) throws java.io.IOException;
- method protected final java.lang.Class<?> findSystemClass(java.lang.String) throws java.lang.ClassNotFoundException;
- method protected java.lang.Package getPackage(java.lang.String);
- method protected java.lang.Package[] getPackages();
- method public final java.lang.ClassLoader getParent();
- method public java.net.URL getResource(java.lang.String);
- method public java.io.InputStream getResourceAsStream(java.lang.String);
- method public java.util.Enumeration<java.net.URL> getResources(java.lang.String) throws java.io.IOException;
- method public static java.lang.ClassLoader getSystemClassLoader();
- method public static java.net.URL getSystemResource(java.lang.String);
- method public static java.io.InputStream getSystemResourceAsStream(java.lang.String);
- method public static java.util.Enumeration<java.net.URL> getSystemResources(java.lang.String) throws java.io.IOException;
- method public java.lang.Class<?> loadClass(java.lang.String) throws java.lang.ClassNotFoundException;
- method protected java.lang.Class<?> loadClass(java.lang.String, boolean) throws java.lang.ClassNotFoundException;
+ method @Deprecated protected final Class<?> defineClass(byte[], int, int) throws java.lang.ClassFormatError;
+ method protected final Class<?> defineClass(String, byte[], int, int) throws java.lang.ClassFormatError;
+ method protected final Class<?> defineClass(String, byte[], int, int, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
+ method protected final Class<?> defineClass(String, java.nio.ByteBuffer, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
+ method protected Package definePackage(String, String, String, String, String, String, String, java.net.URL) throws java.lang.IllegalArgumentException;
+ method protected Class<?> findClass(String) throws java.lang.ClassNotFoundException;
+ method protected String findLibrary(String);
+ method protected final Class<?> findLoadedClass(String);
+ method protected java.net.URL findResource(String);
+ method protected java.util.Enumeration<java.net.URL> findResources(String) throws java.io.IOException;
+ method protected final Class<?> findSystemClass(String) throws java.lang.ClassNotFoundException;
+ method protected Package getPackage(String);
+ method protected Package[] getPackages();
+ method public final ClassLoader getParent();
+ method public java.net.URL getResource(String);
+ method public java.io.InputStream getResourceAsStream(String);
+ method public java.util.Enumeration<java.net.URL> getResources(String) throws java.io.IOException;
+ method public static ClassLoader getSystemClassLoader();
+ method public static java.net.URL getSystemResource(String);
+ method public static java.io.InputStream getSystemResourceAsStream(String);
+ method public static java.util.Enumeration<java.net.URL> getSystemResources(String) throws java.io.IOException;
+ method public Class<?> loadClass(String) throws java.lang.ClassNotFoundException;
+ method protected Class<?> loadClass(String, boolean) throws java.lang.ClassNotFoundException;
method protected static boolean registerAsParallelCapable();
- method protected final void resolveClass(java.lang.Class<?>);
- method public void setClassAssertionStatus(java.lang.String, boolean);
+ method protected final void resolveClass(Class<?>);
+ method public void setClassAssertionStatus(String, boolean);
method public void setDefaultAssertionStatus(boolean);
- method public void setPackageAssertionStatus(java.lang.String, boolean);
- method protected final void setSigners(java.lang.Class<?>, java.lang.Object[]);
+ method public void setPackageAssertionStatus(String, boolean);
+ method protected final void setSigners(Class<?>, Object[]);
}
public class ClassNotFoundException extends java.lang.ReflectiveOperationException {
ctor public ClassNotFoundException();
- ctor public ClassNotFoundException(java.lang.String);
- ctor public ClassNotFoundException(java.lang.String, java.lang.Throwable);
- method public java.lang.Throwable getCause();
- method public java.lang.Throwable getException();
+ ctor public ClassNotFoundException(String);
+ ctor public ClassNotFoundException(String, Throwable);
+ method public Throwable getException();
}
public class CloneNotSupportedException extends java.lang.Exception {
ctor public CloneNotSupportedException();
- ctor public CloneNotSupportedException(java.lang.String);
+ ctor public CloneNotSupportedException(String);
}
- public abstract interface Cloneable {
+ public interface Cloneable {
}
- public abstract interface Comparable<T> {
- method public abstract int compareTo(T);
+ public interface Comparable<T> {
+ method public int compareTo(T);
}
public final class Compiler {
- method public static java.lang.Object command(java.lang.Object);
- method public static boolean compileClass(java.lang.Class<?>);
- method public static boolean compileClasses(java.lang.String);
+ method public static Object command(Object);
+ method public static boolean compileClass(Class<?>);
+ method public static boolean compileClasses(String);
method public static void disable();
method public static void enable();
}
- public abstract class Deprecated implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE}) public @interface Deprecated {
}
- public final class Double extends java.lang.Number implements java.lang.Comparable {
+ public final class Double extends java.lang.Number implements java.lang.Comparable<java.lang.Double> {
ctor public Double(double);
- ctor public Double(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Double(@NonNull String) throws java.lang.NumberFormatException;
method public static int compare(double, double);
- method public int compareTo(java.lang.Double);
+ method public int compareTo(@NonNull Double);
method public static long doubleToLongBits(double);
method public static long doubleToRawLongBits(double);
method public double doubleValue();
@@ -59234,12 +59487,12 @@ package java.lang {
method public long longValue();
method public static double max(double, double);
method public static double min(double, double);
- method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException;
+ method public static double parseDouble(@NonNull String) throws java.lang.NumberFormatException;
method public static double sum(double, double);
- method public static java.lang.String toHexString(double);
- method public static java.lang.String toString(double);
- method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.Double valueOf(double);
+ method @NonNull public static String toHexString(double);
+ method @NonNull public static String toString(double);
+ method @NonNull public static Double valueOf(@NonNull String) throws java.lang.NumberFormatException;
+ method @NonNull public static Double valueOf(double);
field public static final int BYTES = 8; // 0x8
field public static final int MAX_EXPONENT = 1023; // 0x3ff
field public static final double MAX_VALUE = 1.7976931348623157E308;
@@ -59250,58 +59503,57 @@ package java.lang {
field public static final double NaN = (0.0/0.0);
field public static final double POSITIVE_INFINITY = (1.0/0.0);
field public static final int SIZE = 64; // 0x40
- field public static final java.lang.Class<java.lang.Double> TYPE;
+ field public static final Class<java.lang.Double> TYPE;
}
- public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable {
- ctor protected Enum(java.lang.String, int);
- method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable<E> java.io.Serializable {
+ ctor protected Enum(@NonNull String, int);
+ method @NonNull protected final Object clone() throws java.lang.CloneNotSupportedException;
method public final int compareTo(E);
- method public final boolean equals(java.lang.Object);
+ method public final boolean equals(@Nullable Object);
method protected final void finalize();
- method public final java.lang.Class<E> getDeclaringClass();
+ method @NonNull public final Class<E> getDeclaringClass();
method public final int hashCode();
- method public final java.lang.String name();
+ method @NonNull public final String name();
method public final int ordinal();
- method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String);
+ method @NonNull public static <T extends java.lang.Enum<T>> T valueOf(@NonNull Class<T>, @NonNull String);
}
public class EnumConstantNotPresentException extends java.lang.RuntimeException {
- ctor public EnumConstantNotPresentException(java.lang.Class<? extends java.lang.Enum>, java.lang.String);
- method public java.lang.String constantName();
- method public java.lang.Class<? extends java.lang.Enum> enumType();
+ ctor public EnumConstantNotPresentException(Class<? extends java.lang.Enum>, String);
+ method public String constantName();
+ method public Class<? extends java.lang.Enum> enumType();
}
public class Error extends java.lang.Throwable {
ctor public Error();
- ctor public Error(java.lang.String);
- ctor public Error(java.lang.String, java.lang.Throwable);
- ctor public Error(java.lang.Throwable);
- ctor protected Error(java.lang.String, java.lang.Throwable, boolean, boolean);
+ ctor public Error(String);
+ ctor public Error(String, Throwable);
+ ctor public Error(Throwable);
+ ctor protected Error(String, Throwable, boolean, boolean);
}
public class Exception extends java.lang.Throwable {
ctor public Exception();
- ctor public Exception(java.lang.String);
- ctor public Exception(java.lang.String, java.lang.Throwable);
- ctor public Exception(java.lang.Throwable);
- ctor protected Exception(java.lang.String, java.lang.Throwable, boolean, boolean);
+ ctor public Exception(String);
+ ctor public Exception(String, Throwable);
+ ctor public Exception(Throwable);
+ ctor protected Exception(String, Throwable, boolean, boolean);
}
public class ExceptionInInitializerError extends java.lang.LinkageError {
ctor public ExceptionInInitializerError();
- ctor public ExceptionInInitializerError(java.lang.Throwable);
- ctor public ExceptionInInitializerError(java.lang.String);
- method public java.lang.Throwable getCause();
- method public java.lang.Throwable getException();
+ ctor public ExceptionInInitializerError(Throwable);
+ ctor public ExceptionInInitializerError(String);
+ method public Throwable getException();
}
- public final class Float extends java.lang.Number implements java.lang.Comparable {
+ public final class Float extends java.lang.Number implements java.lang.Comparable<java.lang.Float> {
ctor public Float(float);
ctor public Float(double);
- ctor public Float(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Float(@NonNull String) throws java.lang.NumberFormatException;
method public static int compare(float, float);
- method public int compareTo(java.lang.Float);
+ method public int compareTo(@NonNull Float);
method public double doubleValue();
method public static int floatToIntBits(float);
method public static int floatToRawIntBits(float);
@@ -59317,12 +59569,12 @@ package java.lang {
method public long longValue();
method public static float max(float, float);
method public static float min(float, float);
- method public static float parseFloat(java.lang.String) throws java.lang.NumberFormatException;
+ method public static float parseFloat(@NonNull String) throws java.lang.NumberFormatException;
method public static float sum(float, float);
- method public static java.lang.String toHexString(float);
- method public static java.lang.String toString(float);
- method public static java.lang.Float valueOf(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.Float valueOf(float);
+ method @NonNull public static String toHexString(float);
+ method @NonNull public static String toString(float);
+ method @NonNull public static Float valueOf(@NonNull String) throws java.lang.NumberFormatException;
+ method @NonNull public static Float valueOf(float);
field public static final int BYTES = 4; // 0x4
field public static final int MAX_EXPONENT = 127; // 0x7f
field public static final float MAX_VALUE = 3.4028235E38f;
@@ -59333,85 +59585,85 @@ package java.lang {
field public static final float NaN = (0.0f/0.0f);
field public static final float POSITIVE_INFINITY = (1.0f/0.0f);
field public static final int SIZE = 32; // 0x20
- field public static final java.lang.Class<java.lang.Float> TYPE;
+ field public static final Class<java.lang.Float> TYPE;
}
- public abstract class FunctionalInterface implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface FunctionalInterface {
}
public class IllegalAccessError extends java.lang.IncompatibleClassChangeError {
ctor public IllegalAccessError();
- ctor public IllegalAccessError(java.lang.String);
+ ctor public IllegalAccessError(String);
}
public class IllegalAccessException extends java.lang.ReflectiveOperationException {
ctor public IllegalAccessException();
- ctor public IllegalAccessException(java.lang.String);
+ ctor public IllegalAccessException(String);
}
public class IllegalArgumentException extends java.lang.RuntimeException {
ctor public IllegalArgumentException();
- ctor public IllegalArgumentException(java.lang.String);
- ctor public IllegalArgumentException(java.lang.String, java.lang.Throwable);
- ctor public IllegalArgumentException(java.lang.Throwable);
+ ctor public IllegalArgumentException(String);
+ ctor public IllegalArgumentException(String, Throwable);
+ ctor public IllegalArgumentException(Throwable);
}
public class IllegalMonitorStateException extends java.lang.RuntimeException {
ctor public IllegalMonitorStateException();
- ctor public IllegalMonitorStateException(java.lang.String);
+ ctor public IllegalMonitorStateException(String);
}
public class IllegalStateException extends java.lang.RuntimeException {
ctor public IllegalStateException();
- ctor public IllegalStateException(java.lang.String);
- ctor public IllegalStateException(java.lang.String, java.lang.Throwable);
- ctor public IllegalStateException(java.lang.Throwable);
+ ctor public IllegalStateException(String);
+ ctor public IllegalStateException(String, Throwable);
+ ctor public IllegalStateException(Throwable);
}
public class IllegalThreadStateException extends java.lang.IllegalArgumentException {
ctor public IllegalThreadStateException();
- ctor public IllegalThreadStateException(java.lang.String);
+ ctor public IllegalThreadStateException(String);
}
public class IncompatibleClassChangeError extends java.lang.LinkageError {
ctor public IncompatibleClassChangeError();
- ctor public IncompatibleClassChangeError(java.lang.String);
+ ctor public IncompatibleClassChangeError(String);
}
public class IndexOutOfBoundsException extends java.lang.RuntimeException {
ctor public IndexOutOfBoundsException();
- ctor public IndexOutOfBoundsException(java.lang.String);
+ ctor public IndexOutOfBoundsException(String);
}
- public class InheritableThreadLocal<T> extends java.lang.ThreadLocal {
+ public class InheritableThreadLocal<T> extends java.lang.ThreadLocal<T> {
ctor public InheritableThreadLocal();
method protected T childValue(T);
}
public class InstantiationError extends java.lang.IncompatibleClassChangeError {
ctor public InstantiationError();
- ctor public InstantiationError(java.lang.String);
+ ctor public InstantiationError(String);
}
public class InstantiationException extends java.lang.ReflectiveOperationException {
ctor public InstantiationException();
- ctor public InstantiationException(java.lang.String);
+ ctor public InstantiationException(String);
}
- public final class Integer extends java.lang.Number implements java.lang.Comparable {
+ public final class Integer extends java.lang.Number implements java.lang.Comparable<java.lang.Integer> {
ctor public Integer(int);
- ctor public Integer(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Integer(@NonNull String) throws java.lang.NumberFormatException;
method public static int bitCount(int);
method public static int compare(int, int);
- method public int compareTo(java.lang.Integer);
+ method public int compareTo(@NonNull Integer);
method public static int compareUnsigned(int, int);
- method public static java.lang.Integer decode(java.lang.String) throws java.lang.NumberFormatException;
+ method @NonNull public static Integer decode(@NonNull String) throws java.lang.NumberFormatException;
method public static int divideUnsigned(int, int);
method public double doubleValue();
method public float floatValue();
- method public static java.lang.Integer getInteger(java.lang.String);
- method public static java.lang.Integer getInteger(java.lang.String, int);
- method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
+ method @Nullable public static Integer getInteger(@NonNull String);
+ method @Nullable public static Integer getInteger(@NonNull String, int);
+ method @Nullable public static Integer getInteger(@NonNull String, @Nullable Integer);
method public static int hashCode(int);
method public static int highestOneBit(int);
method public int intValue();
@@ -59421,10 +59673,10 @@ package java.lang {
method public static int min(int, int);
method public static int numberOfLeadingZeros(int);
method public static int numberOfTrailingZeros(int);
- method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static int parseInt(java.lang.String) throws java.lang.NumberFormatException;
- method public static int parseUnsignedInt(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static int parseUnsignedInt(java.lang.String) throws java.lang.NumberFormatException;
+ method public static int parseInt(@NonNull String, int) throws java.lang.NumberFormatException;
+ method public static int parseInt(@NonNull String) throws java.lang.NumberFormatException;
+ method public static int parseUnsignedInt(@NonNull String, int) throws java.lang.NumberFormatException;
+ method public static int parseUnsignedInt(@NonNull String) throws java.lang.NumberFormatException;
method public static int remainderUnsigned(int, int);
method public static int reverse(int);
method public static int reverseBytes(int);
@@ -59432,62 +59684,62 @@ package java.lang {
method public static int rotateRight(int, int);
method public static int signum(int);
method public static int sum(int, int);
- method public static java.lang.String toBinaryString(int);
- method public static java.lang.String toHexString(int);
- method public static java.lang.String toOctalString(int);
- method public static java.lang.String toString(int, int);
- method public static java.lang.String toString(int);
+ method @NonNull public static String toBinaryString(int);
+ method @NonNull public static String toHexString(int);
+ method @NonNull public static String toOctalString(int);
+ method @NonNull public static String toString(int, int);
+ method @NonNull public static String toString(int);
method public static long toUnsignedLong(int);
- method public static java.lang.String toUnsignedString(int, int);
- method public static java.lang.String toUnsignedString(int);
- method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.Integer valueOf(int);
+ method @NonNull public static String toUnsignedString(int, int);
+ method @NonNull public static String toUnsignedString(int);
+ method @NonNull public static Integer valueOf(@NonNull String, int) throws java.lang.NumberFormatException;
+ method @NonNull public static Integer valueOf(@NonNull String) throws java.lang.NumberFormatException;
+ method @NonNull public static Integer valueOf(int);
field public static final int BYTES = 4; // 0x4
field public static final int MAX_VALUE = 2147483647; // 0x7fffffff
field public static final int MIN_VALUE = -2147483648; // 0x80000000
field public static final int SIZE = 32; // 0x20
- field public static final java.lang.Class<java.lang.Integer> TYPE;
+ field public static final Class<java.lang.Integer> TYPE;
}
public class InternalError extends java.lang.VirtualMachineError {
ctor public InternalError();
- ctor public InternalError(java.lang.String);
- ctor public InternalError(java.lang.String, java.lang.Throwable);
- ctor public InternalError(java.lang.Throwable);
+ ctor public InternalError(String);
+ ctor public InternalError(String, Throwable);
+ ctor public InternalError(Throwable);
}
public class InterruptedException extends java.lang.Exception {
ctor public InterruptedException();
- ctor public InterruptedException(java.lang.String);
+ ctor public InterruptedException(String);
}
- public abstract interface Iterable<T> {
- method public default void forEach(java.util.function.Consumer<? super T>);
- method public abstract java.util.Iterator<T> iterator();
- method public default java.util.Spliterator<T> spliterator();
+ public interface Iterable<T> {
+ method public default void forEach(@NonNull java.util.function.Consumer<? super T>);
+ method @NonNull public java.util.Iterator<T> iterator();
+ method @NonNull public default java.util.Spliterator<T> spliterator();
}
public class LinkageError extends java.lang.Error {
ctor public LinkageError();
- ctor public LinkageError(java.lang.String);
- ctor public LinkageError(java.lang.String, java.lang.Throwable);
+ ctor public LinkageError(String);
+ ctor public LinkageError(String, Throwable);
}
- public final class Long extends java.lang.Number implements java.lang.Comparable {
+ public final class Long extends java.lang.Number implements java.lang.Comparable<java.lang.Long> {
ctor public Long(long);
- ctor public Long(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Long(@NonNull String) throws java.lang.NumberFormatException;
method public static int bitCount(long);
method public static int compare(long, long);
- method public int compareTo(java.lang.Long);
+ method public int compareTo(@NonNull Long);
method public static int compareUnsigned(long, long);
- method public static java.lang.Long decode(java.lang.String) throws java.lang.NumberFormatException;
+ method @NonNull public static Long decode(@NonNull String) throws java.lang.NumberFormatException;
method public static long divideUnsigned(long, long);
method public double doubleValue();
method public float floatValue();
- method public static java.lang.Long getLong(java.lang.String);
- method public static java.lang.Long getLong(java.lang.String, long);
- method public static java.lang.Long getLong(java.lang.String, java.lang.Long);
+ method @Nullable public static Long getLong(@NonNull String);
+ method @Nullable public static Long getLong(@NonNull String, long);
+ method @Nullable public static Long getLong(@NonNull String, @Nullable Long);
method public static int hashCode(long);
method public static long highestOneBit(long);
method public int intValue();
@@ -59497,10 +59749,10 @@ package java.lang {
method public static long min(long, long);
method public static int numberOfLeadingZeros(long);
method public static int numberOfTrailingZeros(long);
- method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static long parseLong(java.lang.String) throws java.lang.NumberFormatException;
- method public static long parseUnsignedLong(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static long parseUnsignedLong(java.lang.String) throws java.lang.NumberFormatException;
+ method public static long parseLong(@NonNull String, int) throws java.lang.NumberFormatException;
+ method public static long parseLong(@NonNull String) throws java.lang.NumberFormatException;
+ method public static long parseUnsignedLong(@NonNull String, int) throws java.lang.NumberFormatException;
+ method public static long parseUnsignedLong(@NonNull String) throws java.lang.NumberFormatException;
method public static long remainderUnsigned(long, long);
method public static long reverse(long);
method public static long reverseBytes(long);
@@ -59508,21 +59760,21 @@ package java.lang {
method public static long rotateRight(long, int);
method public static int signum(long);
method public static long sum(long, long);
- method public static java.lang.String toBinaryString(long);
- method public static java.lang.String toHexString(long);
- method public static java.lang.String toOctalString(long);
- method public static java.lang.String toString(long, int);
- method public static java.lang.String toString(long);
- method public static java.lang.String toUnsignedString(long, int);
- method public static java.lang.String toUnsignedString(long);
- method public static java.lang.Long valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static java.lang.Long valueOf(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.Long valueOf(long);
+ method @NonNull public static String toBinaryString(long);
+ method @NonNull public static String toHexString(long);
+ method @NonNull public static String toOctalString(long);
+ method @NonNull public static String toString(long, int);
+ method @NonNull public static String toString(long);
+ method @NonNull public static String toUnsignedString(long, int);
+ method @NonNull public static String toUnsignedString(long);
+ method @NonNull public static Long valueOf(@NonNull String, int) throws java.lang.NumberFormatException;
+ method @NonNull public static Long valueOf(@NonNull String) throws java.lang.NumberFormatException;
+ method @NonNull public static Long valueOf(long);
field public static final int BYTES = 8; // 0x8
field public static final long MAX_VALUE = 9223372036854775807L; // 0x7fffffffffffffffL
field public static final long MIN_VALUE = -9223372036854775808L; // 0x8000000000000000L
field public static final int SIZE = 64; // 0x40
- field public static final java.lang.Class<java.lang.Long> TYPE;
+ field public static final Class<java.lang.Long> TYPE;
}
public final class Math {
@@ -59605,37 +59857,37 @@ package java.lang {
public class NegativeArraySizeException extends java.lang.RuntimeException {
ctor public NegativeArraySizeException();
- ctor public NegativeArraySizeException(java.lang.String);
+ ctor public NegativeArraySizeException(String);
}
public class NoClassDefFoundError extends java.lang.LinkageError {
ctor public NoClassDefFoundError();
- ctor public NoClassDefFoundError(java.lang.String);
+ ctor public NoClassDefFoundError(String);
}
public class NoSuchFieldError extends java.lang.IncompatibleClassChangeError {
ctor public NoSuchFieldError();
- ctor public NoSuchFieldError(java.lang.String);
+ ctor public NoSuchFieldError(String);
}
public class NoSuchFieldException extends java.lang.ReflectiveOperationException {
ctor public NoSuchFieldException();
- ctor public NoSuchFieldException(java.lang.String);
+ ctor public NoSuchFieldException(String);
}
public class NoSuchMethodError extends java.lang.IncompatibleClassChangeError {
ctor public NoSuchMethodError();
- ctor public NoSuchMethodError(java.lang.String);
+ ctor public NoSuchMethodError(String);
}
public class NoSuchMethodException extends java.lang.ReflectiveOperationException {
ctor public NoSuchMethodException();
- ctor public NoSuchMethodException(java.lang.String);
+ ctor public NoSuchMethodException(String);
}
public class NullPointerException extends java.lang.RuntimeException {
ctor public NullPointerException();
- ctor public NullPointerException(java.lang.String);
+ ctor public NullPointerException(String);
}
public abstract class Number implements java.io.Serializable {
@@ -59650,19 +59902,19 @@ package java.lang {
public class NumberFormatException extends java.lang.IllegalArgumentException {
ctor public NumberFormatException();
- ctor public NumberFormatException(java.lang.String);
+ ctor public NumberFormatException(String);
}
public class Object {
ctor public Object();
- method protected java.lang.Object clone() throws java.lang.CloneNotSupportedException;
- method public boolean equals(java.lang.Object);
+ method @NonNull protected Object clone() throws java.lang.CloneNotSupportedException;
+ method public boolean equals(@Nullable Object);
method protected void finalize() throws java.lang.Throwable;
- method public final java.lang.Class<?> getClass();
+ method @NonNull public final Class<?> getClass();
method public int hashCode();
method public final void notify();
method public final void notifyAll();
- method public java.lang.String toString();
+ method @NonNull public String toString();
method public final void wait(long) throws java.lang.InterruptedException;
method public final void wait(long, int) throws java.lang.InterruptedException;
method public final void wait() throws java.lang.InterruptedException;
@@ -59670,29 +59922,29 @@ package java.lang {
public class OutOfMemoryError extends java.lang.VirtualMachineError {
ctor public OutOfMemoryError();
- ctor public OutOfMemoryError(java.lang.String);
+ ctor public OutOfMemoryError(String);
}
- public abstract class Override implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface Override {
}
public class Package implements java.lang.reflect.AnnotatedElement {
- method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
+ method public <A extends java.lang.annotation.Annotation> A getAnnotation(Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
- method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
- method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
+ method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(Class<A>);
+ method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(Class<A>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
- method public java.lang.String getImplementationTitle();
- method public java.lang.String getImplementationVendor();
- method public java.lang.String getImplementationVersion();
- method public java.lang.String getName();
- method public static java.lang.Package getPackage(java.lang.String);
- method public static java.lang.Package[] getPackages();
- method public java.lang.String getSpecificationTitle();
- method public java.lang.String getSpecificationVendor();
- method public java.lang.String getSpecificationVersion();
- method public boolean isCompatibleWith(java.lang.String) throws java.lang.NumberFormatException;
+ method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(Class<A>);
+ method public String getImplementationTitle();
+ method public String getImplementationVendor();
+ method public String getImplementationVersion();
+ method public String getName();
+ method public static Package getPackage(String);
+ method public static Package[] getPackages();
+ method public String getSpecificationTitle();
+ method public String getSpecificationVendor();
+ method public String getSpecificationVersion();
+ method public boolean isCompatibleWith(String) throws java.lang.NumberFormatException;
method public boolean isSealed();
method public boolean isSealed(java.net.URL);
}
@@ -59700,7 +59952,7 @@ package java.lang {
public abstract class Process {
ctor public Process();
method public abstract void destroy();
- method public java.lang.Process destroyForcibly();
+ method public Process destroyForcibly();
method public abstract int exitValue();
method public abstract java.io.InputStream getErrorStream();
method public abstract java.io.InputStream getInputStream();
@@ -59713,28 +59965,28 @@ package java.lang {
public final class ProcessBuilder {
ctor public ProcessBuilder(java.util.List<java.lang.String>);
ctor public ProcessBuilder(java.lang.String...);
- method public java.lang.ProcessBuilder command(java.util.List<java.lang.String>);
- method public java.lang.ProcessBuilder command(java.lang.String...);
+ method public ProcessBuilder command(java.util.List<java.lang.String>);
+ method public ProcessBuilder command(java.lang.String...);
method public java.util.List<java.lang.String> command();
method public java.io.File directory();
- method public java.lang.ProcessBuilder directory(java.io.File);
- method public java.util.Map<java.lang.String, java.lang.String> environment();
- method public java.lang.ProcessBuilder inheritIO();
- method public java.lang.ProcessBuilder redirectError(java.lang.ProcessBuilder.Redirect);
- method public java.lang.ProcessBuilder redirectError(java.io.File);
+ method public ProcessBuilder directory(java.io.File);
+ method public java.util.Map<java.lang.String,java.lang.String> environment();
+ method public ProcessBuilder inheritIO();
+ method public ProcessBuilder redirectError(java.lang.ProcessBuilder.Redirect);
+ method public ProcessBuilder redirectError(java.io.File);
method public java.lang.ProcessBuilder.Redirect redirectError();
method public boolean redirectErrorStream();
- method public java.lang.ProcessBuilder redirectErrorStream(boolean);
- method public java.lang.ProcessBuilder redirectInput(java.lang.ProcessBuilder.Redirect);
- method public java.lang.ProcessBuilder redirectInput(java.io.File);
+ method public ProcessBuilder redirectErrorStream(boolean);
+ method public ProcessBuilder redirectInput(java.lang.ProcessBuilder.Redirect);
+ method public ProcessBuilder redirectInput(java.io.File);
method public java.lang.ProcessBuilder.Redirect redirectInput();
- method public java.lang.ProcessBuilder redirectOutput(java.lang.ProcessBuilder.Redirect);
- method public java.lang.ProcessBuilder redirectOutput(java.io.File);
+ method public ProcessBuilder redirectOutput(java.lang.ProcessBuilder.Redirect);
+ method public ProcessBuilder redirectOutput(java.io.File);
method public java.lang.ProcessBuilder.Redirect redirectOutput();
- method public java.lang.Process start() throws java.io.IOException;
+ method public Process start() throws java.io.IOException;
}
- public static abstract class ProcessBuilder.Redirect {
+ public abstract static class ProcessBuilder.Redirect {
method public static java.lang.ProcessBuilder.Redirect appendTo(java.io.File);
method public java.io.File file();
method public static java.lang.ProcessBuilder.Redirect from(java.io.File);
@@ -59744,9 +59996,7 @@ package java.lang {
field public static final java.lang.ProcessBuilder.Redirect PIPE;
}
- public static final class ProcessBuilder.Redirect.Type extends java.lang.Enum {
- method public static java.lang.ProcessBuilder.Redirect.Type valueOf(java.lang.String);
- method public static final java.lang.ProcessBuilder.Redirect.Type[] values();
+ public enum ProcessBuilder.Redirect.Type {
enum_constant public static final java.lang.ProcessBuilder.Redirect.Type APPEND;
enum_constant public static final java.lang.ProcessBuilder.Redirect.Type INHERIT;
enum_constant public static final java.lang.ProcessBuilder.Redirect.Type PIPE;
@@ -59754,43 +60004,43 @@ package java.lang {
enum_constant public static final java.lang.ProcessBuilder.Redirect.Type WRITE;
}
- public abstract interface Readable {
- method public abstract int read(java.nio.CharBuffer) throws java.io.IOException;
+ public interface Readable {
+ method public int read(java.nio.CharBuffer) throws java.io.IOException;
}
public class ReflectiveOperationException extends java.lang.Exception {
ctor public ReflectiveOperationException();
- ctor public ReflectiveOperationException(java.lang.String);
- ctor public ReflectiveOperationException(java.lang.String, java.lang.Throwable);
- ctor public ReflectiveOperationException(java.lang.Throwable);
+ ctor public ReflectiveOperationException(String);
+ ctor public ReflectiveOperationException(String, Throwable);
+ ctor public ReflectiveOperationException(Throwable);
}
- public abstract interface Runnable {
- method public abstract void run();
+ @java.lang.FunctionalInterface public interface Runnable {
+ method public void run();
}
public class Runtime {
- method public void addShutdownHook(java.lang.Thread);
+ method public void addShutdownHook(Thread);
method public int availableProcessors();
- method public java.lang.Process exec(java.lang.String) throws java.io.IOException;
- method public java.lang.Process exec(java.lang.String, java.lang.String[]) throws java.io.IOException;
- method public java.lang.Process exec(java.lang.String, java.lang.String[], java.io.File) throws java.io.IOException;
- method public java.lang.Process exec(java.lang.String[]) throws java.io.IOException;
- method public java.lang.Process exec(java.lang.String[], java.lang.String[]) throws java.io.IOException;
- method public java.lang.Process exec(java.lang.String[], java.lang.String[], java.io.File) throws java.io.IOException;
+ method public Process exec(String) throws java.io.IOException;
+ method public Process exec(String, String[]) throws java.io.IOException;
+ method public Process exec(String, String[], java.io.File) throws java.io.IOException;
+ method public Process exec(String[]) throws java.io.IOException;
+ method public Process exec(String[], String[]) throws java.io.IOException;
+ method public Process exec(String[], String[], java.io.File) throws java.io.IOException;
method public void exit(int);
method public long freeMemory();
method public void gc();
- method public deprecated java.io.InputStream getLocalizedInputStream(java.io.InputStream);
- method public deprecated java.io.OutputStream getLocalizedOutputStream(java.io.OutputStream);
- method public static java.lang.Runtime getRuntime();
+ method @Deprecated public java.io.InputStream getLocalizedInputStream(java.io.InputStream);
+ method @Deprecated public java.io.OutputStream getLocalizedOutputStream(java.io.OutputStream);
+ method public static Runtime getRuntime();
method public void halt(int);
- method public void load(java.lang.String);
- method public void loadLibrary(java.lang.String);
+ method public void load(String);
+ method public void loadLibrary(String);
method public long maxMemory();
- method public boolean removeShutdownHook(java.lang.Thread);
+ method public boolean removeShutdownHook(Thread);
method public void runFinalization();
- method public static deprecated void runFinalizersOnExit(boolean);
+ method @Deprecated public static void runFinalizersOnExit(boolean);
method public long totalMemory();
method public void traceInstructions(boolean);
method public void traceMethodCalls(boolean);
@@ -59798,111 +60048,111 @@ package java.lang {
public class RuntimeException extends java.lang.Exception {
ctor public RuntimeException();
- ctor public RuntimeException(java.lang.String);
- ctor public RuntimeException(java.lang.String, java.lang.Throwable);
- ctor public RuntimeException(java.lang.Throwable);
- ctor protected RuntimeException(java.lang.String, java.lang.Throwable, boolean, boolean);
+ ctor public RuntimeException(String);
+ ctor public RuntimeException(String, Throwable);
+ ctor public RuntimeException(Throwable);
+ ctor protected RuntimeException(String, Throwable, boolean, boolean);
}
public final class RuntimePermission extends java.security.BasicPermission {
- ctor public RuntimePermission(java.lang.String);
- ctor public RuntimePermission(java.lang.String, java.lang.String);
+ ctor public RuntimePermission(String);
+ ctor public RuntimePermission(String, String);
}
- public abstract class SafeVarargs implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD}) public @interface SafeVarargs {
}
public class SecurityException extends java.lang.RuntimeException {
ctor public SecurityException();
- ctor public SecurityException(java.lang.String);
- ctor public SecurityException(java.lang.String, java.lang.Throwable);
- ctor public SecurityException(java.lang.Throwable);
+ ctor public SecurityException(String);
+ ctor public SecurityException(String, Throwable);
+ ctor public SecurityException(Throwable);
}
public class SecurityManager {
ctor public SecurityManager();
- method public void checkAccept(java.lang.String, int);
- method public void checkAccess(java.lang.Thread);
- method public void checkAccess(java.lang.ThreadGroup);
+ method public void checkAccept(String, int);
+ method public void checkAccess(Thread);
+ method public void checkAccess(ThreadGroup);
method public void checkAwtEventQueueAccess();
- method public void checkConnect(java.lang.String, int);
- method public void checkConnect(java.lang.String, int, java.lang.Object);
+ method public void checkConnect(String, int);
+ method public void checkConnect(String, int, Object);
method public void checkCreateClassLoader();
- method public void checkDelete(java.lang.String);
- method public void checkExec(java.lang.String);
+ method public void checkDelete(String);
+ method public void checkExec(String);
method public void checkExit(int);
- method public void checkLink(java.lang.String);
+ method public void checkLink(String);
method public void checkListen(int);
- method public void checkMemberAccess(java.lang.Class<?>, int);
+ method public void checkMemberAccess(Class<?>, int);
method public void checkMulticast(java.net.InetAddress);
- method public deprecated void checkMulticast(java.net.InetAddress, byte);
- method public void checkPackageAccess(java.lang.String);
- method public void checkPackageDefinition(java.lang.String);
+ method @Deprecated public void checkMulticast(java.net.InetAddress, byte);
+ method public void checkPackageAccess(String);
+ method public void checkPackageDefinition(String);
method public void checkPermission(java.security.Permission);
- method public void checkPermission(java.security.Permission, java.lang.Object);
+ method public void checkPermission(java.security.Permission, Object);
method public void checkPrintJobAccess();
method public void checkPropertiesAccess();
- method public void checkPropertyAccess(java.lang.String);
+ method public void checkPropertyAccess(String);
method public void checkRead(java.io.FileDescriptor);
- method public void checkRead(java.lang.String);
- method public void checkRead(java.lang.String, java.lang.Object);
- method public void checkSecurityAccess(java.lang.String);
+ method public void checkRead(String);
+ method public void checkRead(String, Object);
+ method public void checkSecurityAccess(String);
method public void checkSetFactory();
method public void checkSystemClipboardAccess();
- method public boolean checkTopLevelWindow(java.lang.Object);
+ method public boolean checkTopLevelWindow(Object);
method public void checkWrite(java.io.FileDescriptor);
- method public void checkWrite(java.lang.String);
- method protected deprecated int classDepth(java.lang.String);
- method protected deprecated int classLoaderDepth();
- method protected deprecated java.lang.ClassLoader currentClassLoader();
- method protected deprecated java.lang.Class<?> currentLoadedClass();
- method protected java.lang.Class[] getClassContext();
- method public deprecated boolean getInCheck();
- method public java.lang.Object getSecurityContext();
- method public java.lang.ThreadGroup getThreadGroup();
- method protected deprecated boolean inClass(java.lang.String);
- method protected deprecated boolean inClassLoader();
- field protected deprecated boolean inCheck;
- }
-
- public final class Short extends java.lang.Number implements java.lang.Comparable {
+ method public void checkWrite(String);
+ method @Deprecated protected int classDepth(String);
+ method @Deprecated protected int classLoaderDepth();
+ method @Deprecated protected ClassLoader currentClassLoader();
+ method @Deprecated protected Class<?> currentLoadedClass();
+ method protected Class[] getClassContext();
+ method @Deprecated public boolean getInCheck();
+ method public Object getSecurityContext();
+ method public ThreadGroup getThreadGroup();
+ method @Deprecated protected boolean inClass(String);
+ method @Deprecated protected boolean inClassLoader();
+ field @Deprecated protected boolean inCheck;
+ }
+
+ public final class Short extends java.lang.Number implements java.lang.Comparable<java.lang.Short> {
ctor public Short(short);
- ctor public Short(java.lang.String) throws java.lang.NumberFormatException;
+ ctor public Short(String) throws java.lang.NumberFormatException;
method public static int compare(short, short);
- method public int compareTo(java.lang.Short);
- method public static java.lang.Short decode(java.lang.String) throws java.lang.NumberFormatException;
+ method public int compareTo(Short);
+ method public static Short decode(String) throws java.lang.NumberFormatException;
method public double doubleValue();
method public float floatValue();
method public static int hashCode(short);
method public int intValue();
method public long longValue();
- method public static short parseShort(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static short parseShort(java.lang.String) throws java.lang.NumberFormatException;
+ method public static short parseShort(String, int) throws java.lang.NumberFormatException;
+ method public static short parseShort(String) throws java.lang.NumberFormatException;
method public static short reverseBytes(short);
- method public static java.lang.String toString(short);
+ method public static String toString(short);
method public static int toUnsignedInt(short);
method public static long toUnsignedLong(short);
- method public static java.lang.Short valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
- method public static java.lang.Short valueOf(java.lang.String) throws java.lang.NumberFormatException;
- method public static java.lang.Short valueOf(short);
+ method public static Short valueOf(String, int) throws java.lang.NumberFormatException;
+ method public static Short valueOf(String) throws java.lang.NumberFormatException;
+ method public static Short valueOf(short);
field public static final int BYTES = 2; // 0x2
field public static final short MAX_VALUE = 32767; // 0x7fff
field public static final short MIN_VALUE = -32768; // 0xffff8000
field public static final int SIZE = 16; // 0x10
- field public static final java.lang.Class<java.lang.Short> TYPE;
+ field public static final Class<java.lang.Short> TYPE;
}
public class StackOverflowError extends java.lang.VirtualMachineError {
ctor public StackOverflowError();
- ctor public StackOverflowError(java.lang.String);
+ ctor public StackOverflowError(String);
}
public final class StackTraceElement implements java.io.Serializable {
- ctor public StackTraceElement(java.lang.String, java.lang.String, java.lang.String, int);
- method public java.lang.String getClassName();
- method public java.lang.String getFileName();
+ ctor public StackTraceElement(String, String, String, int);
+ method public String getClassName();
+ method public String getFileName();
method public int getLineNumber();
- method public java.lang.String getMethodName();
+ method public String getMethodName();
method public boolean isNativeMethod();
}
@@ -59978,224 +60228,239 @@ package java.lang {
field public static final double PI = 3.141592653589793;
}
- public final class String implements java.lang.CharSequence java.lang.Comparable java.io.Serializable {
+ public final class String implements java.lang.CharSequence java.lang.Comparable<java.lang.String> java.io.Serializable {
ctor public String();
- ctor public String(java.lang.String);
+ ctor public String(@NonNull String);
ctor public String(char[]);
ctor public String(char[], int, int);
ctor public String(int[], int, int);
- ctor public deprecated String(byte[], int, int, int);
- ctor public deprecated String(byte[], int);
- ctor public String(byte[], int, int, java.lang.String) throws java.io.UnsupportedEncodingException;
- ctor public String(byte[], int, int, java.nio.charset.Charset);
- ctor public String(byte[], java.lang.String) throws java.io.UnsupportedEncodingException;
- ctor public String(byte[], java.nio.charset.Charset);
+ ctor @Deprecated public String(byte[], int, int, int);
+ ctor @Deprecated public String(byte[], int);
+ ctor public String(byte[], int, int, @NonNull String) throws java.io.UnsupportedEncodingException;
+ ctor public String(byte[], int, int, @NonNull java.nio.charset.Charset);
+ ctor public String(byte[], @NonNull String) throws java.io.UnsupportedEncodingException;
+ ctor public String(byte[], @NonNull java.nio.charset.Charset);
ctor public String(byte[], int, int);
ctor public String(byte[]);
- ctor public String(java.lang.StringBuffer);
- ctor public String(java.lang.StringBuilder);
+ ctor public String(@NonNull StringBuffer);
+ ctor public String(@NonNull StringBuilder);
method public char charAt(int);
method public int codePointAt(int);
method public int codePointBefore(int);
method public int codePointCount(int, int);
- method public int compareTo(java.lang.String);
- method public int compareToIgnoreCase(java.lang.String);
- method public java.lang.String concat(java.lang.String);
- method public boolean contains(java.lang.CharSequence);
- method public boolean contentEquals(java.lang.StringBuffer);
- method public boolean contentEquals(java.lang.CharSequence);
- method public static java.lang.String copyValueOf(char[], int, int);
- method public static java.lang.String copyValueOf(char[]);
- method public boolean endsWith(java.lang.String);
- method public boolean equalsIgnoreCase(java.lang.String);
- method public static java.lang.String format(java.lang.String, java.lang.Object...);
- method public static java.lang.String format(java.util.Locale, java.lang.String, java.lang.Object...);
- method public deprecated void getBytes(int, int, byte[], int);
- method public byte[] getBytes(java.lang.String) throws java.io.UnsupportedEncodingException;
- method public byte[] getBytes(java.nio.charset.Charset);
+ method public int compareTo(@NonNull String);
+ method public int compareToIgnoreCase(@NonNull String);
+ method @NonNull public String concat(@NonNull String);
+ method public boolean contains(@NonNull CharSequence);
+ method public boolean contentEquals(@NonNull StringBuffer);
+ method public boolean contentEquals(@NonNull CharSequence);
+ method @NonNull public static String copyValueOf(char[], int, int);
+ method @NonNull public static String copyValueOf(char[]);
+ method public boolean endsWith(@NonNull String);
+ method public boolean equalsIgnoreCase(@Nullable String);
+ method @NonNull public static String format(@NonNull String, java.lang.Object...);
+ method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, java.lang.Object...);
+ method @Deprecated public void getBytes(int, int, byte[], int);
+ method public byte[] getBytes(@NonNull String) throws java.io.UnsupportedEncodingException;
+ method public byte[] getBytes(@NonNull java.nio.charset.Charset);
method public byte[] getBytes();
method public void getChars(int, int, char[], int);
method public int indexOf(int);
method public int indexOf(int, int);
- method public int indexOf(java.lang.String);
- method public int indexOf(java.lang.String, int);
- method public java.lang.String intern();
+ method public int indexOf(@NonNull String);
+ method public int indexOf(@NonNull String, int);
+ method @NonNull public String intern();
method public boolean isEmpty();
- method public static java.lang.String join(java.lang.CharSequence, java.lang.CharSequence...);
- method public static java.lang.String join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>);
+ method @NonNull public static String join(@NonNull CharSequence, java.lang.CharSequence...);
+ method @NonNull public static String join(@NonNull CharSequence, @NonNull Iterable<? extends java.lang.CharSequence>);
method public int lastIndexOf(int);
method public int lastIndexOf(int, int);
- method public int lastIndexOf(java.lang.String);
- method public int lastIndexOf(java.lang.String, int);
+ method public int lastIndexOf(@NonNull String);
+ method public int lastIndexOf(@NonNull String, int);
method public int length();
- method public boolean matches(java.lang.String);
+ method public boolean matches(@NonNull String);
method public int offsetByCodePoints(int, int);
- method public boolean regionMatches(int, java.lang.String, int, int);
- method public boolean regionMatches(boolean, int, java.lang.String, int, int);
- method public java.lang.String replace(char, char);
- method public java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence);
- method public java.lang.String replaceAll(java.lang.String, java.lang.String);
- method public java.lang.String replaceFirst(java.lang.String, java.lang.String);
- method public java.lang.String[] split(java.lang.String, int);
- method public java.lang.String[] split(java.lang.String);
- method public boolean startsWith(java.lang.String, int);
- method public boolean startsWith(java.lang.String);
- method public java.lang.CharSequence subSequence(int, int);
- method public java.lang.String substring(int);
- method public java.lang.String substring(int, int);
+ method public boolean regionMatches(int, @NonNull String, int, int);
+ method public boolean regionMatches(boolean, int, @NonNull String, int, int);
+ method @NonNull public String replace(char, char);
+ method @NonNull public String replace(@NonNull CharSequence, @NonNull CharSequence);
+ method @NonNull public String replaceAll(@NonNull String, @NonNull String);
+ method @NonNull public String replaceFirst(@NonNull String, @NonNull String);
+ method public String[] split(@NonNull String, int);
+ method public String[] split(@NonNull String);
+ method public boolean startsWith(@NonNull String, int);
+ method public boolean startsWith(@NonNull String);
+ method @NonNull public CharSequence subSequence(int, int);
+ method @NonNull public String substring(int);
+ method @NonNull public String substring(int, int);
method public char[] toCharArray();
- method public java.lang.String toLowerCase(java.util.Locale);
- method public java.lang.String toLowerCase();
- method public java.lang.String toUpperCase(java.util.Locale);
- method public java.lang.String toUpperCase();
- method public java.lang.String trim();
- method public static java.lang.String valueOf(java.lang.Object);
- method public static java.lang.String valueOf(char[]);
- method public static java.lang.String valueOf(char[], int, int);
- method public static java.lang.String valueOf(boolean);
- method public static java.lang.String valueOf(char);
- method public static java.lang.String valueOf(int);
- method public static java.lang.String valueOf(long);
- method public static java.lang.String valueOf(float);
- method public static java.lang.String valueOf(double);
+ method @NonNull public String toLowerCase(@NonNull java.util.Locale);
+ method @NonNull public String toLowerCase();
+ method @NonNull public String toUpperCase(@NonNull java.util.Locale);
+ method @NonNull public String toUpperCase();
+ method @NonNull public String trim();
+ method @NonNull public static String valueOf(@Nullable Object);
+ method @NonNull public static String valueOf(char[]);
+ method @NonNull public static String valueOf(char[], int, int);
+ method @NonNull public static String valueOf(boolean);
+ method @NonNull public static String valueOf(char);
+ method @NonNull public static String valueOf(int);
+ method @NonNull public static String valueOf(long);
+ method @NonNull public static String valueOf(float);
+ method @NonNull public static String valueOf(double);
field public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
}
public final class StringBuffer implements java.lang.Appendable java.lang.CharSequence java.io.Serializable {
ctor public StringBuffer();
ctor public StringBuffer(int);
- ctor public StringBuffer(java.lang.String);
- ctor public StringBuffer(java.lang.CharSequence);
- method public synchronized java.lang.StringBuffer append(java.lang.Object);
- method public synchronized java.lang.StringBuffer append(java.lang.String);
- method public synchronized java.lang.StringBuffer append(java.lang.StringBuffer);
- method public synchronized java.lang.StringBuffer append(java.lang.CharSequence);
- method public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
- method public synchronized java.lang.StringBuffer append(char[]);
- method public synchronized java.lang.StringBuffer append(char[], int, int);
- method public synchronized java.lang.StringBuffer append(boolean);
- method public synchronized java.lang.StringBuffer append(char);
- method public synchronized java.lang.StringBuffer append(int);
- method public synchronized java.lang.StringBuffer append(long);
- method public synchronized java.lang.StringBuffer append(float);
- method public synchronized java.lang.StringBuffer append(double);
- method public synchronized java.lang.StringBuffer appendCodePoint(int);
- method public synchronized int capacity();
- method public synchronized char charAt(int);
- method public synchronized int codePointAt(int);
- method public synchronized int codePointBefore(int);
- method public synchronized int codePointCount(int, int);
- method public synchronized java.lang.StringBuffer delete(int, int);
- method public synchronized java.lang.StringBuffer deleteCharAt(int);
- method public synchronized void ensureCapacity(int);
- method public synchronized void getChars(int, int, char[], int);
- method public int indexOf(java.lang.String);
- method public synchronized int indexOf(java.lang.String, int);
- method public synchronized java.lang.StringBuffer insert(int, char[], int, int);
- method public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
- method public synchronized java.lang.StringBuffer insert(int, java.lang.String);
- method public synchronized java.lang.StringBuffer insert(int, char[]);
- method public java.lang.StringBuffer insert(int, java.lang.CharSequence);
- method public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
- method public java.lang.StringBuffer insert(int, boolean);
- method public synchronized java.lang.StringBuffer insert(int, char);
- method public java.lang.StringBuffer insert(int, int);
- method public java.lang.StringBuffer insert(int, long);
- method public java.lang.StringBuffer insert(int, float);
- method public java.lang.StringBuffer insert(int, double);
- method public int lastIndexOf(java.lang.String);
- method public synchronized int lastIndexOf(java.lang.String, int);
- method public synchronized int length();
- method public synchronized int offsetByCodePoints(int, int);
- method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
- method public synchronized java.lang.StringBuffer reverse();
- method public synchronized void setCharAt(int, char);
- method public synchronized void setLength(int);
- method public synchronized java.lang.CharSequence subSequence(int, int);
- method public synchronized java.lang.String substring(int);
- method public synchronized java.lang.String substring(int, int);
- method public synchronized java.lang.String toString();
- method public synchronized void trimToSize();
+ ctor public StringBuffer(@NonNull String);
+ ctor public StringBuffer(@NonNull CharSequence);
+ method @NonNull public StringBuffer append(@Nullable Object);
+ method @NonNull public StringBuffer append(@Nullable String);
+ method @NonNull public StringBuffer append(@Nullable StringBuffer);
+ method @NonNull public StringBuffer append(@Nullable CharSequence);
+ method @NonNull public StringBuffer append(@Nullable CharSequence, int, int);
+ method @NonNull public StringBuffer append(char[]);
+ method @NonNull public StringBuffer append(char[], int, int);
+ method @NonNull public StringBuffer append(boolean);
+ method @NonNull public StringBuffer append(char);
+ method @NonNull public StringBuffer append(int);
+ method @NonNull public StringBuffer append(long);
+ method @NonNull public StringBuffer append(float);
+ method @NonNull public StringBuffer append(double);
+ method @NonNull public StringBuffer appendCodePoint(int);
+ method public int capacity();
+ method public char charAt(int);
+ method public int codePointAt(int);
+ method public int codePointBefore(int);
+ method public int codePointCount(int, int);
+ method @NonNull public StringBuffer delete(int, int);
+ method @NonNull public StringBuffer deleteCharAt(int);
+ method public void ensureCapacity(int);
+ method public void getChars(int, int, char[], int);
+ method public int indexOf(@NonNull String);
+ method public int indexOf(@NonNull String, int);
+ method @NonNull public StringBuffer insert(int, char[], int, int);
+ method @NonNull public StringBuffer insert(int, @Nullable Object);
+ method @NonNull public StringBuffer insert(int, @Nullable String);
+ method @NonNull public StringBuffer insert(int, char[]);
+ method @NonNull public StringBuffer insert(int, @Nullable CharSequence);
+ method @NonNull public StringBuffer insert(int, @Nullable CharSequence, int, int);
+ method @NonNull public StringBuffer insert(int, boolean);
+ method @NonNull public StringBuffer insert(int, char);
+ method @NonNull public StringBuffer insert(int, int);
+ method @NonNull public StringBuffer insert(int, long);
+ method @NonNull public StringBuffer insert(int, float);
+ method @NonNull public StringBuffer insert(int, double);
+ method public int lastIndexOf(@NonNull String);
+ method public int lastIndexOf(@NonNull String, int);
+ method public int length();
+ method public int offsetByCodePoints(int, int);
+ method @NonNull public StringBuffer replace(int, int, @NonNull String);
+ method @NonNull public StringBuffer reverse();
+ method public void setCharAt(int, char);
+ method public void setLength(int);
+ method @NonNull public CharSequence subSequence(int, int);
+ method @NonNull public String substring(int);
+ method @NonNull public String substring(int, int);
+ method public void trimToSize();
}
public final class StringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable {
ctor public StringBuilder();
ctor public StringBuilder(int);
- ctor public StringBuilder(java.lang.String);
- ctor public StringBuilder(java.lang.CharSequence);
- method public java.lang.StringBuilder append(java.lang.Object);
- method public java.lang.StringBuilder append(java.lang.String);
- method public java.lang.StringBuilder append(java.lang.StringBuffer);
- method public java.lang.StringBuilder append(java.lang.CharSequence);
- method public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
- method public java.lang.StringBuilder append(char[]);
- method public java.lang.StringBuilder append(char[], int, int);
- method public java.lang.StringBuilder append(boolean);
- method public java.lang.StringBuilder append(char);
- method public java.lang.StringBuilder append(int);
- method public java.lang.StringBuilder append(long);
- method public java.lang.StringBuilder append(float);
- method public java.lang.StringBuilder append(double);
- method public java.lang.StringBuilder appendCodePoint(int);
- method public java.lang.StringBuilder delete(int, int);
- method public java.lang.StringBuilder deleteCharAt(int);
- method public int indexOf(java.lang.String);
- method public int indexOf(java.lang.String, int);
- method public java.lang.StringBuilder insert(int, char[], int, int);
- method public java.lang.StringBuilder insert(int, java.lang.Object);
- method public java.lang.StringBuilder insert(int, java.lang.String);
- method public java.lang.StringBuilder insert(int, char[]);
- method public java.lang.StringBuilder insert(int, java.lang.CharSequence);
- method public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
- method public java.lang.StringBuilder insert(int, boolean);
- method public java.lang.StringBuilder insert(int, char);
- method public java.lang.StringBuilder insert(int, int);
- method public java.lang.StringBuilder insert(int, long);
- method public java.lang.StringBuilder insert(int, float);
- method public java.lang.StringBuilder insert(int, double);
- method public int lastIndexOf(java.lang.String);
- method public int lastIndexOf(java.lang.String, int);
- method public java.lang.StringBuilder replace(int, int, java.lang.String);
- method public java.lang.StringBuilder reverse();
+ ctor public StringBuilder(@NonNull String);
+ ctor public StringBuilder(@NonNull CharSequence);
+ method @NonNull public StringBuilder append(@Nullable Object);
+ method @NonNull public StringBuilder append(@Nullable String);
+ method @NonNull public StringBuilder append(@Nullable StringBuffer);
+ method @NonNull public StringBuilder append(@Nullable CharSequence);
+ method @NonNull public StringBuilder append(@Nullable CharSequence, int, int);
+ method @NonNull public StringBuilder append(char[]);
+ method @NonNull public StringBuilder append(char[], int, int);
+ method @NonNull public StringBuilder append(boolean);
+ method @NonNull public StringBuilder append(char);
+ method @NonNull public StringBuilder append(int);
+ method @NonNull public StringBuilder append(long);
+ method @NonNull public StringBuilder append(float);
+ method @NonNull public StringBuilder append(double);
+ method @NonNull public StringBuilder appendCodePoint(int);
+ method public int capacity();
+ method public char charAt(int);
+ method public int codePointAt(int);
+ method public int codePointBefore(int);
+ method public int codePointCount(int, int);
+ method @NonNull public StringBuilder delete(int, int);
+ method @NonNull public StringBuilder deleteCharAt(int);
+ method public void ensureCapacity(int);
+ method public void getChars(int, int, char[], int);
+ method public int indexOf(@NonNull String);
+ method public int indexOf(@NonNull String, int);
+ method @NonNull public StringBuilder insert(int, char[], int, int);
+ method @NonNull public StringBuilder insert(int, @Nullable Object);
+ method @NonNull public StringBuilder insert(int, @Nullable String);
+ method @NonNull public StringBuilder insert(int, char[]);
+ method @NonNull public StringBuilder insert(int, @Nullable CharSequence);
+ method @NonNull public StringBuilder insert(int, @Nullable CharSequence, int, int);
+ method @NonNull public StringBuilder insert(int, boolean);
+ method @NonNull public StringBuilder insert(int, char);
+ method @NonNull public StringBuilder insert(int, int);
+ method @NonNull public StringBuilder insert(int, long);
+ method @NonNull public StringBuilder insert(int, float);
+ method @NonNull public StringBuilder insert(int, double);
+ method public int lastIndexOf(@NonNull String);
+ method public int lastIndexOf(@NonNull String, int);
+ method public int length();
+ method public int offsetByCodePoints(int, int);
+ method @NonNull public StringBuilder replace(int, int, @NonNull String);
+ method @NonNull public StringBuilder reverse();
+ method public void setCharAt(int, char);
+ method public void setLength(int);
+ method public CharSequence subSequence(int, int);
+ method public String substring(int);
+ method public String substring(int, int);
+ method public void trimToSize();
}
public class StringIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
ctor public StringIndexOutOfBoundsException();
- ctor public StringIndexOutOfBoundsException(java.lang.String);
+ ctor public StringIndexOutOfBoundsException(String);
ctor public StringIndexOutOfBoundsException(int);
}
- public abstract class SuppressWarnings implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface SuppressWarnings {
+ method public abstract String[] value();
}
public final class System {
- method public static void arraycopy(java.lang.Object, int, java.lang.Object, int, int);
- method public static java.lang.String clearProperty(java.lang.String);
- method public static java.io.Console console();
+ method public static void arraycopy(@NonNull Object, int, @NonNull Object, int, int);
+ method @Nullable public static String clearProperty(@NonNull String);
+ method @Nullable public static java.io.Console console();
method public static long currentTimeMillis();
method public static void exit(int);
method public static void gc();
- method public static java.util.Properties getProperties();
- method public static java.lang.String getProperty(java.lang.String);
- method public static java.lang.String getProperty(java.lang.String, java.lang.String);
- method public static java.lang.SecurityManager getSecurityManager();
- method public static java.lang.String getenv(java.lang.String);
- method public static java.util.Map<java.lang.String, java.lang.String> getenv();
- method public static int identityHashCode(java.lang.Object);
- method public static java.nio.channels.Channel inheritedChannel() throws java.io.IOException;
- method public static java.lang.String lineSeparator();
- method public static void load(java.lang.String);
- method public static void loadLibrary(java.lang.String);
- method public static java.lang.String mapLibraryName(java.lang.String);
+ method @NonNull public static java.util.Properties getProperties();
+ method @Nullable public static String getProperty(@NonNull String);
+ method @Nullable public static String getProperty(@NonNull String, @Nullable String);
+ method @Nullable public static SecurityManager getSecurityManager();
+ method @Nullable public static String getenv(@NonNull String);
+ method @NonNull public static java.util.Map<java.lang.String,java.lang.String> getenv();
+ method public static int identityHashCode(@Nullable Object);
+ method @Nullable public static java.nio.channels.Channel inheritedChannel() throws java.io.IOException;
+ method @NonNull public static String lineSeparator();
+ method public static void load(@NonNull String);
+ method public static void loadLibrary(@NonNull String);
+ method @NonNull public static String mapLibraryName(@NonNull String);
method public static long nanoTime();
method public static void runFinalization();
- method public static deprecated void runFinalizersOnExit(boolean);
- method public static void setErr(java.io.PrintStream);
- method public static void setIn(java.io.InputStream);
- method public static void setOut(java.io.PrintStream);
- method public static void setProperties(java.util.Properties);
- method public static java.lang.String setProperty(java.lang.String, java.lang.String);
- method public static void setSecurityManager(java.lang.SecurityManager);
+ method @Deprecated public static void runFinalizersOnExit(boolean);
+ method public static void setErr(@Nullable java.io.PrintStream);
+ method public static void setIn(@Nullable java.io.InputStream);
+ method public static void setOut(@Nullable java.io.PrintStream);
+ method public static void setProperties(@Nullable java.util.Properties);
+ method @Nullable public static String setProperty(@NonNull String, @Nullable String);
+ method public static void setSecurityManager(@Nullable SecurityManager);
field public static final java.io.PrintStream err;
field public static final java.io.InputStream in;
field public static final java.io.PrintStream out;
@@ -60203,31 +60468,31 @@ package java.lang {
public class Thread implements java.lang.Runnable {
ctor public Thread();
- ctor public Thread(java.lang.Runnable);
- ctor public Thread(java.lang.ThreadGroup, java.lang.Runnable);
- ctor public Thread(java.lang.String);
- ctor public Thread(java.lang.ThreadGroup, java.lang.String);
- ctor public Thread(java.lang.Runnable, java.lang.String);
- ctor public Thread(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
- ctor public Thread(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);
+ ctor public Thread(@Nullable Runnable);
+ ctor public Thread(@Nullable ThreadGroup, @Nullable Runnable);
+ ctor public Thread(@NonNull String);
+ ctor public Thread(@Nullable ThreadGroup, @NonNull String);
+ ctor public Thread(@Nullable Runnable, @NonNull String);
+ ctor public Thread(@Nullable ThreadGroup, @Nullable Runnable, @NonNull String);
+ ctor public Thread(@Nullable ThreadGroup, @Nullable Runnable, @NonNull String, long);
method public static int activeCount();
method public final void checkAccess();
- method public deprecated int countStackFrames();
- method public static java.lang.Thread currentThread();
- method public deprecated void destroy();
+ method @Deprecated public int countStackFrames();
+ method @NonNull public static Thread currentThread();
+ method @Deprecated public void destroy();
method public static void dumpStack();
- method public static int enumerate(java.lang.Thread[]);
- method public static java.util.Map<java.lang.Thread, java.lang.StackTraceElement[]> getAllStackTraces();
- method public java.lang.ClassLoader getContextClassLoader();
- method public static java.lang.Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
+ method public static int enumerate(Thread[]);
+ method @NonNull public static java.util.Map<java.lang.Thread,java.lang.StackTraceElement[]> getAllStackTraces();
+ method @Nullable public ClassLoader getContextClassLoader();
+ method @Nullable public static java.lang.Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
method public long getId();
- method public final java.lang.String getName();
+ method @NonNull public final String getName();
method public final int getPriority();
- method public java.lang.StackTraceElement[] getStackTrace();
- method public java.lang.Thread.State getState();
- method public final java.lang.ThreadGroup getThreadGroup();
- method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
- method public static boolean holdsLock(java.lang.Object);
+ method public StackTraceElement[] getStackTrace();
+ method @NonNull public java.lang.Thread.State getState();
+ method @Nullable public final ThreadGroup getThreadGroup();
+ method @Nullable public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
+ method public static boolean holdsLock(@NonNull Object);
method public void interrupt();
method public static boolean interrupted();
method public final boolean isAlive();
@@ -60236,29 +60501,27 @@ package java.lang {
method public final void join(long) throws java.lang.InterruptedException;
method public final void join(long, int) throws java.lang.InterruptedException;
method public final void join() throws java.lang.InterruptedException;
- method public final deprecated void resume();
+ method @Deprecated public final void resume();
method public void run();
- method public void setContextClassLoader(java.lang.ClassLoader);
+ method public void setContextClassLoader(@Nullable ClassLoader);
method public final void setDaemon(boolean);
- method public static void setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler);
- method public final synchronized void setName(java.lang.String);
+ method public static void setDefaultUncaughtExceptionHandler(@Nullable java.lang.Thread.UncaughtExceptionHandler);
+ method public final void setName(@NonNull String);
method public final void setPriority(int);
- method public void setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler);
+ method public void setUncaughtExceptionHandler(@Nullable java.lang.Thread.UncaughtExceptionHandler);
method public static void sleep(long) throws java.lang.InterruptedException;
method public static void sleep(long, int) throws java.lang.InterruptedException;
- method public synchronized void start();
- method public final deprecated void stop();
- method public final deprecated synchronized void stop(java.lang.Throwable);
- method public final deprecated void suspend();
+ method public void start();
+ method @Deprecated public final void stop();
+ method @Deprecated public final void stop(@Nullable Throwable);
+ method @Deprecated public final void suspend();
method public static void yield();
field public static final int MAX_PRIORITY = 10; // 0xa
field public static final int MIN_PRIORITY = 1; // 0x1
field public static final int NORM_PRIORITY = 5; // 0x5
}
- public static final class Thread.State extends java.lang.Enum {
- method public static java.lang.Thread.State valueOf(java.lang.String);
- method public static final java.lang.Thread.State[] values();
+ public enum Thread.State {
enum_constant public static final java.lang.Thread.State BLOCKED;
enum_constant public static final java.lang.Thread.State NEW;
enum_constant public static final java.lang.Thread.State RUNNABLE;
@@ -60267,8 +60530,8 @@ package java.lang {
enum_constant public static final java.lang.Thread.State WAITING;
}
- public static abstract interface Thread.UncaughtExceptionHandler {
- method public abstract void uncaughtException(java.lang.Thread, java.lang.Throwable);
+ @java.lang.FunctionalInterface public static interface Thread.UncaughtExceptionHandler {
+ method public void uncaughtException(@NonNull Thread, @NonNull Throwable);
}
public class ThreadDeath extends java.lang.Error {
@@ -60276,134 +60539,132 @@ package java.lang {
}
public class ThreadGroup implements java.lang.Thread.UncaughtExceptionHandler {
- ctor public ThreadGroup(java.lang.String);
- ctor public ThreadGroup(java.lang.ThreadGroup, java.lang.String);
+ ctor public ThreadGroup(String);
+ ctor public ThreadGroup(ThreadGroup, String);
method public int activeCount();
method public int activeGroupCount();
- method public deprecated boolean allowThreadSuspension(boolean);
+ method @Deprecated public boolean allowThreadSuspension(boolean);
method public final void checkAccess();
method public final void destroy();
- method public int enumerate(java.lang.Thread[]);
- method public int enumerate(java.lang.Thread[], boolean);
- method public int enumerate(java.lang.ThreadGroup[]);
- method public int enumerate(java.lang.ThreadGroup[], boolean);
+ method public int enumerate(Thread[]);
+ method public int enumerate(Thread[], boolean);
+ method public int enumerate(ThreadGroup[]);
+ method public int enumerate(ThreadGroup[], boolean);
method public final int getMaxPriority();
- method public final java.lang.String getName();
- method public final java.lang.ThreadGroup getParent();
+ method public final String getName();
+ method public final ThreadGroup getParent();
method public final void interrupt();
method public final boolean isDaemon();
- method public synchronized boolean isDestroyed();
+ method public boolean isDestroyed();
method public void list();
- method public final boolean parentOf(java.lang.ThreadGroup);
- method public final deprecated void resume();
+ method public final boolean parentOf(ThreadGroup);
+ method @Deprecated public final void resume();
method public final void setDaemon(boolean);
method public final void setMaxPriority(int);
- method public final deprecated void stop();
- method public final deprecated void suspend();
- method public void uncaughtException(java.lang.Thread, java.lang.Throwable);
+ method @Deprecated public final void stop();
+ method @Deprecated public final void suspend();
+ method public void uncaughtException(Thread, Throwable);
}
public class ThreadLocal<T> {
ctor public ThreadLocal();
- method public T get();
- method protected T initialValue();
+ method @Nullable public T get();
+ method @Nullable protected T initialValue();
method public void remove();
method public void set(T);
- method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
+ method @NonNull public static <S> ThreadLocal<S> withInitial(@NonNull java.util.function.Supplier<? extends S>);
}
public class Throwable implements java.io.Serializable {
ctor public Throwable();
- ctor public Throwable(java.lang.String);
- ctor public Throwable(java.lang.String, java.lang.Throwable);
- ctor public Throwable(java.lang.Throwable);
- ctor protected Throwable(java.lang.String, java.lang.Throwable, boolean, boolean);
- method public final synchronized void addSuppressed(java.lang.Throwable);
- method public synchronized java.lang.Throwable fillInStackTrace();
- method public synchronized java.lang.Throwable getCause();
- method public java.lang.String getLocalizedMessage();
- method public java.lang.String getMessage();
- method public java.lang.StackTraceElement[] getStackTrace();
- method public final synchronized java.lang.Throwable[] getSuppressed();
- method public synchronized java.lang.Throwable initCause(java.lang.Throwable);
+ ctor public Throwable(@Nullable String);
+ ctor public Throwable(@Nullable String, @Nullable Throwable);
+ ctor public Throwable(@Nullable Throwable);
+ ctor protected Throwable(@Nullable String, @Nullable Throwable, boolean, boolean);
+ method public final void addSuppressed(@NonNull Throwable);
+ method @NonNull public Throwable fillInStackTrace();
+ method @Nullable public Throwable getCause();
+ method @Nullable public String getLocalizedMessage();
+ method @Nullable public String getMessage();
+ method public StackTraceElement[] getStackTrace();
+ method public final Throwable[] getSuppressed();
+ method @NonNull public Throwable initCause(@Nullable Throwable);
method public void printStackTrace();
- method public void printStackTrace(java.io.PrintStream);
- method public void printStackTrace(java.io.PrintWriter);
- method public void setStackTrace(java.lang.StackTraceElement[]);
+ method public void printStackTrace(@NonNull java.io.PrintStream);
+ method public void printStackTrace(@NonNull java.io.PrintWriter);
+ method public void setStackTrace(StackTraceElement[]);
}
public class TypeNotPresentException extends java.lang.RuntimeException {
- ctor public TypeNotPresentException(java.lang.String, java.lang.Throwable);
- method public java.lang.String typeName();
+ ctor public TypeNotPresentException(String, Throwable);
+ method public String typeName();
}
public class UnknownError extends java.lang.VirtualMachineError {
ctor public UnknownError();
- ctor public UnknownError(java.lang.String);
+ ctor public UnknownError(String);
}
public class UnsatisfiedLinkError extends java.lang.LinkageError {
ctor public UnsatisfiedLinkError();
- ctor public UnsatisfiedLinkError(java.lang.String);
+ ctor public UnsatisfiedLinkError(String);
}
public class UnsupportedClassVersionError extends java.lang.ClassFormatError {
ctor public UnsupportedClassVersionError();
- ctor public UnsupportedClassVersionError(java.lang.String);
+ ctor public UnsupportedClassVersionError(String);
}
public class UnsupportedOperationException extends java.lang.RuntimeException {
ctor public UnsupportedOperationException();
- ctor public UnsupportedOperationException(java.lang.String);
- ctor public UnsupportedOperationException(java.lang.String, java.lang.Throwable);
- ctor public UnsupportedOperationException(java.lang.Throwable);
+ ctor public UnsupportedOperationException(String);
+ ctor public UnsupportedOperationException(String, Throwable);
+ ctor public UnsupportedOperationException(Throwable);
}
public class VerifyError extends java.lang.LinkageError {
ctor public VerifyError();
- ctor public VerifyError(java.lang.String);
+ ctor public VerifyError(String);
}
public abstract class VirtualMachineError extends java.lang.Error {
ctor public VirtualMachineError();
- ctor public VirtualMachineError(java.lang.String);
- ctor public VirtualMachineError(java.lang.String, java.lang.Throwable);
- ctor public VirtualMachineError(java.lang.Throwable);
+ ctor public VirtualMachineError(String);
+ ctor public VirtualMachineError(String, Throwable);
+ ctor public VirtualMachineError(Throwable);
}
public final class Void {
- field public static final java.lang.Class<java.lang.Void> TYPE;
+ field public static final Class<java.lang.Void> TYPE;
}
}
package java.lang.annotation {
- public abstract interface Annotation {
- method public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType();
- method public abstract boolean equals(java.lang.Object);
- method public abstract int hashCode();
- method public abstract java.lang.String toString();
+ public interface Annotation {
+ method public Class<? extends java.lang.annotation.Annotation> annotationType();
+ method public boolean equals(Object);
+ method public int hashCode();
+ method public String toString();
}
public class AnnotationFormatError extends java.lang.Error {
- ctor public AnnotationFormatError(java.lang.String);
- ctor public AnnotationFormatError(java.lang.String, java.lang.Throwable);
- ctor public AnnotationFormatError(java.lang.Throwable);
+ ctor public AnnotationFormatError(String);
+ ctor public AnnotationFormatError(String, Throwable);
+ ctor public AnnotationFormatError(Throwable);
}
public class AnnotationTypeMismatchException extends java.lang.RuntimeException {
- ctor public AnnotationTypeMismatchException(java.lang.reflect.Method, java.lang.String);
+ ctor public AnnotationTypeMismatchException(java.lang.reflect.Method, String);
method public java.lang.reflect.Method element();
- method public java.lang.String foundType();
+ method public String foundType();
}
- public abstract class Documented implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.ANNOTATION_TYPE) public @interface Documented {
}
- public final class ElementType extends java.lang.Enum {
- method public static java.lang.annotation.ElementType valueOf(java.lang.String);
- method public static final java.lang.annotation.ElementType[] values();
+ public enum ElementType {
enum_constant public static final java.lang.annotation.ElementType ANNOTATION_TYPE;
enum_constant public static final java.lang.annotation.ElementType CONSTRUCTOR;
enum_constant public static final java.lang.annotation.ElementType FIELD;
@@ -60417,32 +60678,33 @@ package java.lang.annotation {
}
public class IncompleteAnnotationException extends java.lang.RuntimeException {
- ctor public IncompleteAnnotationException(java.lang.Class<? extends java.lang.annotation.Annotation>, java.lang.String);
- method public java.lang.Class<? extends java.lang.annotation.Annotation> annotationType();
- method public java.lang.String elementName();
+ ctor public IncompleteAnnotationException(Class<? extends java.lang.annotation.Annotation>, String);
+ method public Class<? extends java.lang.annotation.Annotation> annotationType();
+ method public String elementName();
}
- public abstract class Inherited implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.ANNOTATION_TYPE) public @interface Inherited {
}
- public abstract class Native implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.FIELD) public @interface Native {
}
- public abstract class Repeatable implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.ANNOTATION_TYPE) public @interface Repeatable {
+ method public abstract Class<? extends java.lang.annotation.Annotation> value();
}
- public abstract class Retention implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.ANNOTATION_TYPE) public @interface Retention {
+ method public abstract java.lang.annotation.RetentionPolicy value();
}
- public final class RetentionPolicy extends java.lang.Enum {
- method public static java.lang.annotation.RetentionPolicy valueOf(java.lang.String);
- method public static final java.lang.annotation.RetentionPolicy[] values();
+ public enum RetentionPolicy {
enum_constant public static final java.lang.annotation.RetentionPolicy CLASS;
enum_constant public static final java.lang.annotation.RetentionPolicy RUNTIME;
enum_constant public static final java.lang.annotation.RetentionPolicy SOURCE;
}
- public abstract class Target implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.ANNOTATION_TYPE) public @interface Target {
+ method public abstract java.lang.annotation.ElementType[] value();
}
}
@@ -60466,40 +60728,40 @@ package java.lang.invoke {
public class LambdaConversionException extends java.lang.Exception {
ctor public LambdaConversionException();
- ctor public LambdaConversionException(java.lang.String);
- ctor public LambdaConversionException(java.lang.String, java.lang.Throwable);
- ctor public LambdaConversionException(java.lang.Throwable);
- ctor public LambdaConversionException(java.lang.String, java.lang.Throwable, boolean, boolean);
+ ctor public LambdaConversionException(String);
+ ctor public LambdaConversionException(String, Throwable);
+ ctor public LambdaConversionException(Throwable);
+ ctor public LambdaConversionException(String, Throwable, boolean, boolean);
}
public abstract class MethodHandle {
- method public java.lang.invoke.MethodHandle asCollector(java.lang.Class<?>, int);
+ method public java.lang.invoke.MethodHandle asCollector(Class<?>, int);
method public java.lang.invoke.MethodHandle asFixedArity();
- method public java.lang.invoke.MethodHandle asSpreader(java.lang.Class<?>, int);
+ method public java.lang.invoke.MethodHandle asSpreader(Class<?>, int);
method public java.lang.invoke.MethodHandle asType(java.lang.invoke.MethodType);
- method public java.lang.invoke.MethodHandle asVarargsCollector(java.lang.Class<?>);
- method public java.lang.invoke.MethodHandle bindTo(java.lang.Object);
- method public final java.lang.Object invoke(java.lang.Object...) throws java.lang.Throwable;
- method public final java.lang.Object invokeExact(java.lang.Object...) throws java.lang.Throwable;
- method public java.lang.Object invokeWithArguments(java.lang.Object...) throws java.lang.Throwable;
- method public java.lang.Object invokeWithArguments(java.util.List<?>) throws java.lang.Throwable;
+ method public java.lang.invoke.MethodHandle asVarargsCollector(Class<?>);
+ method public java.lang.invoke.MethodHandle bindTo(Object);
+ method public final Object invoke(java.lang.Object...) throws java.lang.Throwable;
+ method public final Object invokeExact(java.lang.Object...) throws java.lang.Throwable;
+ method public Object invokeWithArguments(java.lang.Object...) throws java.lang.Throwable;
+ method public Object invokeWithArguments(java.util.List<?>) throws java.lang.Throwable;
method public boolean isVarargsCollector();
method public java.lang.invoke.MethodType type();
}
- public abstract interface MethodHandleInfo {
- method public abstract java.lang.Class<?> getDeclaringClass();
- method public abstract java.lang.invoke.MethodType getMethodType();
- method public abstract int getModifiers();
- method public abstract java.lang.String getName();
- method public abstract int getReferenceKind();
+ public interface MethodHandleInfo {
+ method public Class<?> getDeclaringClass();
+ method public java.lang.invoke.MethodType getMethodType();
+ method public int getModifiers();
+ method public String getName();
+ method public int getReferenceKind();
method public default boolean isVarArgs();
method public static boolean refKindIsField(int);
method public static boolean refKindIsValid(int);
- method public static java.lang.String refKindName(int);
- method public static java.lang.String referenceKindToString(int);
- method public abstract <T extends java.lang.reflect.Member> T reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup);
- method public static java.lang.String toString(int, java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType);
+ method public static String refKindName(int);
+ method public static String referenceKindToString(int);
+ method public <T extends java.lang.reflect.Member> T reflectAs(Class<T>, java.lang.invoke.MethodHandles.Lookup);
+ method public static String toString(int, Class<?>, String, java.lang.invoke.MethodType);
field public static final int REF_getField = 1; // 0x1
field public static final int REF_getStatic = 2; // 0x2
field public static final int REF_invokeInterface = 9; // 0x9
@@ -60512,49 +60774,49 @@ package java.lang.invoke {
}
public class MethodHandles {
- method public static java.lang.invoke.MethodHandle arrayElementGetter(java.lang.Class<?>) throws java.lang.IllegalArgumentException;
- method public static java.lang.invoke.MethodHandle arrayElementSetter(java.lang.Class<?>) throws java.lang.IllegalArgumentException;
- method public static java.lang.invoke.MethodHandle catchException(java.lang.invoke.MethodHandle, java.lang.Class<? extends java.lang.Throwable>, java.lang.invoke.MethodHandle);
+ method public static java.lang.invoke.MethodHandle arrayElementGetter(Class<?>) throws java.lang.IllegalArgumentException;
+ method public static java.lang.invoke.MethodHandle arrayElementSetter(Class<?>) throws java.lang.IllegalArgumentException;
+ method public static java.lang.invoke.MethodHandle catchException(java.lang.invoke.MethodHandle, Class<? extends java.lang.Throwable>, java.lang.invoke.MethodHandle);
method public static java.lang.invoke.MethodHandle collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle);
- method public static java.lang.invoke.MethodHandle constant(java.lang.Class<?>, java.lang.Object);
+ method public static java.lang.invoke.MethodHandle constant(Class<?>, Object);
method public static java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.util.List<java.lang.Class<?>>);
- method public static java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.lang.Class<?>...);
+ method public static java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, Class<?>...);
method public static java.lang.invoke.MethodHandle exactInvoker(java.lang.invoke.MethodType);
method public static java.lang.invoke.MethodHandle explicitCastArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType);
method public static java.lang.invoke.MethodHandle filterArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle...);
method public static java.lang.invoke.MethodHandle filterReturnValue(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle);
method public static java.lang.invoke.MethodHandle foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle);
method public static java.lang.invoke.MethodHandle guardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle);
- method public static java.lang.invoke.MethodHandle identity(java.lang.Class<?>);
+ method public static java.lang.invoke.MethodHandle identity(Class<?>);
method public static java.lang.invoke.MethodHandle insertArguments(java.lang.invoke.MethodHandle, int, java.lang.Object...);
method public static java.lang.invoke.MethodHandle invoker(java.lang.invoke.MethodType);
method public static java.lang.invoke.MethodHandles.Lookup lookup();
method public static java.lang.invoke.MethodHandle permuteArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int...);
method public static java.lang.invoke.MethodHandles.Lookup publicLookup();
- method public static <T extends java.lang.reflect.Member> T reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle);
+ method public static <T extends java.lang.reflect.Member> T reflectAs(Class<T>, java.lang.invoke.MethodHandle);
method public static java.lang.invoke.MethodHandle spreadInvoker(java.lang.invoke.MethodType, int);
- method public static java.lang.invoke.MethodHandle throwException(java.lang.Class<?>, java.lang.Class<? extends java.lang.Throwable>);
+ method public static java.lang.invoke.MethodHandle throwException(Class<?>, Class<? extends java.lang.Throwable>);
}
public static final class MethodHandles.Lookup {
- method public java.lang.invoke.MethodHandle bind(java.lang.Object, java.lang.String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
- method public java.lang.invoke.MethodHandle findConstructor(java.lang.Class<?>, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
- method public java.lang.invoke.MethodHandle findGetter(java.lang.Class<?>, java.lang.String, java.lang.Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
- method public java.lang.invoke.MethodHandle findSetter(java.lang.Class<?>, java.lang.String, java.lang.Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
- method public java.lang.invoke.MethodHandle findSpecial(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType, java.lang.Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
- method public java.lang.invoke.MethodHandle findStatic(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
- method public java.lang.invoke.MethodHandle findStaticGetter(java.lang.Class<?>, java.lang.String, java.lang.Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
- method public java.lang.invoke.MethodHandle findStaticSetter(java.lang.Class<?>, java.lang.String, java.lang.Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
- method public java.lang.invoke.MethodHandle findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
- method public java.lang.invoke.MethodHandles.Lookup in(java.lang.Class<?>);
- method public java.lang.Class<?> lookupClass();
+ method public java.lang.invoke.MethodHandle bind(Object, String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
+ method public java.lang.invoke.MethodHandle findConstructor(Class<?>, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
+ method public java.lang.invoke.MethodHandle findGetter(Class<?>, String, Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
+ method public java.lang.invoke.MethodHandle findSetter(Class<?>, String, Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
+ method public java.lang.invoke.MethodHandle findSpecial(Class<?>, String, java.lang.invoke.MethodType, Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
+ method public java.lang.invoke.MethodHandle findStatic(Class<?>, String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
+ method public java.lang.invoke.MethodHandle findStaticGetter(Class<?>, String, Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
+ method public java.lang.invoke.MethodHandle findStaticSetter(Class<?>, String, Class<?>) throws java.lang.IllegalAccessException, java.lang.NoSuchFieldException;
+ method public java.lang.invoke.MethodHandle findVirtual(Class<?>, String, java.lang.invoke.MethodType) throws java.lang.IllegalAccessException, java.lang.NoSuchMethodException;
+ method public java.lang.invoke.MethodHandles.Lookup in(Class<?>);
+ method public Class<?> lookupClass();
method public int lookupModes();
method public java.lang.invoke.MethodHandleInfo revealDirect(java.lang.invoke.MethodHandle);
method public java.lang.invoke.MethodHandle unreflect(java.lang.reflect.Method) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectConstructor(java.lang.reflect.Constructor<?>) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectGetter(java.lang.reflect.Field) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectSetter(java.lang.reflect.Field) throws java.lang.IllegalAccessException;
- method public java.lang.invoke.MethodHandle unreflectSpecial(java.lang.reflect.Method, java.lang.Class<?>) throws java.lang.IllegalAccessException;
+ method public java.lang.invoke.MethodHandle unreflectSpecial(java.lang.reflect.Method, Class<?>) throws java.lang.IllegalAccessException;
field public static final int PACKAGE = 8; // 0x8
field public static final int PRIVATE = 2; // 0x2
field public static final int PROTECTED = 4; // 0x4
@@ -60562,32 +60824,32 @@ package java.lang.invoke {
}
public final class MethodType implements java.io.Serializable {
- method public java.lang.invoke.MethodType appendParameterTypes(java.lang.Class<?>...);
+ method public java.lang.invoke.MethodType appendParameterTypes(Class<?>...);
method public java.lang.invoke.MethodType appendParameterTypes(java.util.List<java.lang.Class<?>>);
- method public java.lang.invoke.MethodType changeParameterType(int, java.lang.Class<?>);
- method public java.lang.invoke.MethodType changeReturnType(java.lang.Class<?>);
+ method public java.lang.invoke.MethodType changeParameterType(int, Class<?>);
+ method public java.lang.invoke.MethodType changeReturnType(Class<?>);
method public java.lang.invoke.MethodType dropParameterTypes(int, int);
method public java.lang.invoke.MethodType erase();
- method public static java.lang.invoke.MethodType fromMethodDescriptorString(java.lang.String, java.lang.ClassLoader) throws java.lang.IllegalArgumentException, java.lang.TypeNotPresentException;
+ method public static java.lang.invoke.MethodType fromMethodDescriptorString(String, ClassLoader) throws java.lang.IllegalArgumentException, java.lang.TypeNotPresentException;
method public java.lang.invoke.MethodType generic();
method public static java.lang.invoke.MethodType genericMethodType(int, boolean);
method public static java.lang.invoke.MethodType genericMethodType(int);
method public boolean hasPrimitives();
method public boolean hasWrappers();
- method public java.lang.invoke.MethodType insertParameterTypes(int, java.lang.Class<?>...);
+ method public java.lang.invoke.MethodType insertParameterTypes(int, Class<?>...);
method public java.lang.invoke.MethodType insertParameterTypes(int, java.util.List<java.lang.Class<?>>);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>, java.lang.Class<?>[]);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>, java.util.List<java.lang.Class<?>>);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>, java.lang.Class<?>, java.lang.Class<?>...);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>, java.lang.Class<?>);
- method public static java.lang.invoke.MethodType methodType(java.lang.Class<?>, java.lang.invoke.MethodType);
- method public java.lang.Class<?>[] parameterArray();
+ method public static java.lang.invoke.MethodType methodType(Class<?>, Class<?>[]);
+ method public static java.lang.invoke.MethodType methodType(Class<?>, java.util.List<java.lang.Class<?>>);
+ method public static java.lang.invoke.MethodType methodType(Class<?>, Class<?>, Class<?>...);
+ method public static java.lang.invoke.MethodType methodType(Class<?>);
+ method public static java.lang.invoke.MethodType methodType(Class<?>, Class<?>);
+ method public static java.lang.invoke.MethodType methodType(Class<?>, java.lang.invoke.MethodType);
+ method public Class<?>[] parameterArray();
method public int parameterCount();
method public java.util.List<java.lang.Class<?>> parameterList();
- method public java.lang.Class<?> parameterType(int);
- method public java.lang.Class<?> returnType();
- method public java.lang.String toMethodDescriptorString();
+ method public Class<?> parameterType(int);
+ method public Class<?> returnType();
+ method public String toMethodDescriptorString();
method public java.lang.invoke.MethodType unwrap();
method public java.lang.invoke.MethodType wrap();
}
@@ -60610,14 +60872,14 @@ package java.lang.invoke {
public class WrongMethodTypeException extends java.lang.RuntimeException {
ctor public WrongMethodTypeException();
- ctor public WrongMethodTypeException(java.lang.String);
+ ctor public WrongMethodTypeException(String);
}
}
package java.lang.ref {
- public class PhantomReference<T> extends java.lang.ref.Reference {
+ public class PhantomReference<T> extends java.lang.ref.Reference<T> {
ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>);
}
@@ -60626,7 +60888,7 @@ package java.lang.ref {
method public boolean enqueue();
method public T get();
method public boolean isEnqueued();
- method public static void reachabilityFence(java.lang.Object);
+ method public static void reachabilityFence(Object);
}
public class ReferenceQueue<T> {
@@ -60636,12 +60898,12 @@ package java.lang.ref {
method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
}
- public class SoftReference<T> extends java.lang.ref.Reference {
+ public class SoftReference<T> extends java.lang.ref.Reference<T> {
ctor public SoftReference(T);
ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>);
}
- public class WeakReference<T> extends java.lang.ref.Reference {
+ public class WeakReference<T> extends java.lang.ref.Reference<T> {
ctor public WeakReference(T);
ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>);
}
@@ -60652,7 +60914,7 @@ package java.lang.reflect {
public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
ctor protected AccessibleObject();
- method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
+ method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
method public java.lang.annotation.Annotation[] getAnnotations();
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
method public boolean isAccessible();
@@ -60660,118 +60922,117 @@ package java.lang.reflect {
method public void setAccessible(boolean) throws java.lang.SecurityException;
}
- public abstract interface AnnotatedElement {
- method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
- method public abstract java.lang.annotation.Annotation[] getAnnotations();
- method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>);
- method public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(java.lang.Class<T>);
- method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
- method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
+ public interface AnnotatedElement {
+ method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
+ method public java.lang.annotation.Annotation[] getAnnotations();
+ method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(@NonNull Class<T>);
+ method @Nullable public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(@NonNull Class<T>);
+ method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(@NonNull Class<T>);
+ method public default boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
}
public final class Array {
- method public static java.lang.Object get(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static boolean getBoolean(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static byte getByte(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static char getChar(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static double getDouble(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static float getFloat(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static int getInt(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static int getLength(java.lang.Object);
- method public static long getLong(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static short getShort(java.lang.Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static java.lang.Object newInstance(java.lang.Class<?>, int) throws java.lang.NegativeArraySizeException;
- method public static java.lang.Object newInstance(java.lang.Class<?>, int...) throws java.lang.IllegalArgumentException, java.lang.NegativeArraySizeException;
- method public static void set(java.lang.Object, int, java.lang.Object) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setBoolean(java.lang.Object, int, boolean);
- method public static void setByte(java.lang.Object, int, byte) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setChar(java.lang.Object, int, char) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setDouble(java.lang.Object, int, double) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setFloat(java.lang.Object, int, float) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setInt(java.lang.Object, int, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setLong(java.lang.Object, int, long) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
- method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method @Nullable public static Object get(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static boolean getBoolean(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static byte getByte(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static char getChar(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static double getDouble(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static float getFloat(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static int getInt(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static int getLength(@NonNull Object);
+ method public static long getLong(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static short getShort(@NonNull Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method @NonNull public static Object newInstance(@NonNull Class<?>, int) throws java.lang.NegativeArraySizeException;
+ method @NonNull public static Object newInstance(@NonNull Class<?>, int...) throws java.lang.IllegalArgumentException, java.lang.NegativeArraySizeException;
+ method public static void set(@NonNull Object, int, @Nullable Object) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setBoolean(@NonNull Object, int, boolean);
+ method public static void setByte(@NonNull Object, int, byte) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setChar(@NonNull Object, int, char) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setDouble(@NonNull Object, int, double) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setFloat(@NonNull Object, int, float) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setInt(@NonNull Object, int, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setLong(@NonNull Object, int, long) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
+ method public static void setShort(@NonNull Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
}
public final class Constructor<T> extends java.lang.reflect.Executable {
- method public java.lang.Class<T> getDeclaringClass();
- method public java.lang.Class<?>[] getExceptionTypes();
+ method @NonNull public Class<T> getDeclaringClass();
+ method public Class<?>[] getExceptionTypes();
method public int getModifiers();
- method public java.lang.String getName();
+ method @NonNull public String getName();
method public java.lang.annotation.Annotation[][] getParameterAnnotations();
- method public java.lang.Class<?>[] getParameterTypes();
+ method public Class<?>[] getParameterTypes();
method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
- method public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
- method public java.lang.String toGenericString();
+ method @NonNull public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
+ method @NonNull public String toGenericString();
}
public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public abstract java.lang.Class<?>[] getExceptionTypes();
+ method public abstract Class<?>[] getExceptionTypes();
method public java.lang.reflect.Type[] getGenericExceptionTypes();
method public java.lang.reflect.Type[] getGenericParameterTypes();
method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
method public int getParameterCount();
- method public abstract java.lang.Class<?>[] getParameterTypes();
+ method public abstract Class<?>[] getParameterTypes();
method public java.lang.reflect.Parameter[] getParameters();
- method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
+ method public final boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
method public boolean isSynthetic();
method public boolean isVarArgs();
- method public abstract java.lang.String toGenericString();
+ method @NonNull public abstract String toGenericString();
}
public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
- method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public boolean getBoolean(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public byte getByte(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public char getChar(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public java.lang.Class<?> getDeclaringClass();
- method public double getDouble(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public float getFloat(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public java.lang.reflect.Type getGenericType();
- method public int getInt(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public long getLong(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method @Nullable public Object get(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public boolean getBoolean(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public byte getByte(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public char getChar(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method @NonNull public Class<?> getDeclaringClass();
+ method public double getDouble(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public float getFloat(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method @NonNull public java.lang.reflect.Type getGenericType();
+ method public int getInt(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public long getLong(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public int getModifiers();
- method public java.lang.String getName();
- method public short getShort(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public java.lang.Class<?> getType();
+ method @NonNull public String getName();
+ method public short getShort(@Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method @NonNull public Class<?> getType();
method public boolean isEnumConstant();
method public boolean isSynthetic();
- method public void set(java.lang.Object, java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setBoolean(java.lang.Object, boolean) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setByte(java.lang.Object, byte) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setChar(java.lang.Object, char) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setDouble(java.lang.Object, double) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setFloat(java.lang.Object, float) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setInt(java.lang.Object, int) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setLong(java.lang.Object, long) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public void setShort(java.lang.Object, short) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
- method public java.lang.String toGenericString();
+ method public void set(@Nullable Object, @Nullable Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setBoolean(@Nullable Object, boolean) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setByte(@Nullable Object, byte) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setChar(@Nullable Object, char) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setDouble(@Nullable Object, double) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setFloat(@Nullable Object, float) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setInt(@Nullable Object, int) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setLong(@Nullable Object, long) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public void setShort(@Nullable Object, short) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method @NonNull public String toGenericString();
}
- public abstract interface GenericArrayType implements java.lang.reflect.Type {
- method public abstract java.lang.reflect.Type getGenericComponentType();
+ public interface GenericArrayType extends java.lang.reflect.Type {
+ method @NonNull public java.lang.reflect.Type getGenericComponentType();
}
- public abstract interface GenericDeclaration implements java.lang.reflect.AnnotatedElement {
- method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters();
+ public interface GenericDeclaration extends java.lang.reflect.AnnotatedElement {
+ method @NonNull public java.lang.reflect.TypeVariable<?>[] getTypeParameters();
}
public class GenericSignatureFormatError extends java.lang.ClassFormatError {
ctor public GenericSignatureFormatError();
- ctor public GenericSignatureFormatError(java.lang.String);
+ ctor public GenericSignatureFormatError(String);
}
- public abstract interface InvocationHandler {
- method public abstract java.lang.Object invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) throws java.lang.Throwable;
+ public interface InvocationHandler {
+ method public Object invoke(Object, java.lang.reflect.Method, Object[]) throws java.lang.Throwable;
}
public class InvocationTargetException extends java.lang.ReflectiveOperationException {
ctor protected InvocationTargetException();
- ctor public InvocationTargetException(java.lang.Throwable);
- ctor public InvocationTargetException(java.lang.Throwable, java.lang.String);
- method public java.lang.Throwable getCause();
- method public java.lang.Throwable getTargetException();
+ ctor public InvocationTargetException(Throwable);
+ ctor public InvocationTargetException(Throwable, String);
+ method public Throwable getTargetException();
}
public class MalformedParameterizedTypeException extends java.lang.RuntimeException {
@@ -60780,33 +61041,33 @@ package java.lang.reflect {
public class MalformedParametersException extends java.lang.RuntimeException {
ctor public MalformedParametersException();
- ctor public MalformedParametersException(java.lang.String);
+ ctor public MalformedParametersException(String);
}
- public abstract interface Member {
- method public abstract java.lang.Class<?> getDeclaringClass();
- method public abstract int getModifiers();
- method public abstract java.lang.String getName();
- method public abstract boolean isSynthetic();
+ public interface Member {
+ method @NonNull public Class<?> getDeclaringClass();
+ method public int getModifiers();
+ method @NonNull public String getName();
+ method public boolean isSynthetic();
field public static final int DECLARED = 1; // 0x1
field public static final int PUBLIC = 0; // 0x0
}
public final class Method extends java.lang.reflect.Executable {
- method public java.lang.Class<?> getDeclaringClass();
- method public java.lang.Object getDefaultValue();
- method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type getGenericReturnType();
+ method @NonNull public Class<?> getDeclaringClass();
+ method @Nullable public Object getDefaultValue();
+ method @NonNull public Class<?>[] getExceptionTypes();
+ method @NonNull public java.lang.reflect.Type getGenericReturnType();
method public int getModifiers();
- method public java.lang.String getName();
- method public java.lang.annotation.Annotation[][] getParameterAnnotations();
- method public java.lang.Class<?>[] getParameterTypes();
- method public java.lang.Class<?> getReturnType();
- method public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters();
- method public java.lang.Object invoke(java.lang.Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
+ method @NonNull public String getName();
+ method @NonNull public java.lang.annotation.Annotation[][] getParameterAnnotations();
+ method @NonNull public Class<?>[] getParameterTypes();
+ method @NonNull public Class<?> getReturnType();
+ method @NonNull public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters();
+ method @Nullable public Object invoke(@Nullable Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
method public boolean isBridge();
method public boolean isDefault();
- method public java.lang.String toGenericString();
+ method @NonNull public String toGenericString();
}
public class Modifier {
@@ -60829,7 +61090,7 @@ package java.lang.reflect {
method public static boolean isVolatile(int);
method public static int methodModifiers();
method public static int parameterModifiers();
- method public static java.lang.String toString(int);
+ method public static String toString(int);
field public static final int ABSTRACT = 1024; // 0x400
field public static final int FINAL = 16; // 0x10
field public static final int INTERFACE = 512; // 0x200
@@ -60845,73 +61106,72 @@ package java.lang.reflect {
}
public final class Parameter implements java.lang.reflect.AnnotatedElement {
- method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
+ method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
method public java.lang.annotation.Annotation[] getAnnotations();
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public java.lang.reflect.Executable getDeclaringExecutable();
+ method @NonNull public java.lang.reflect.Executable getDeclaringExecutable();
method public int getModifiers();
- method public java.lang.String getName();
- method public java.lang.reflect.Type getParameterizedType();
- method public java.lang.Class<?> getType();
+ method @NonNull public String getName();
+ method @NonNull public java.lang.reflect.Type getParameterizedType();
+ method @NonNull public Class<?> getType();
method public boolean isImplicit();
method public boolean isNamePresent();
method public boolean isSynthetic();
method public boolean isVarArgs();
}
- public abstract interface ParameterizedType implements java.lang.reflect.Type {
- method public abstract java.lang.reflect.Type[] getActualTypeArguments();
- method public abstract java.lang.reflect.Type getOwnerType();
- method public abstract java.lang.reflect.Type getRawType();
+ public interface ParameterizedType extends java.lang.reflect.Type {
+ method public java.lang.reflect.Type[] getActualTypeArguments();
+ method @Nullable public java.lang.reflect.Type getOwnerType();
+ method @NonNull public java.lang.reflect.Type getRawType();
}
public class Proxy implements java.io.Serializable {
- ctor protected Proxy(java.lang.reflect.InvocationHandler);
- method public static java.lang.reflect.InvocationHandler getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException;
- method public static java.lang.Class<?> getProxyClass(java.lang.ClassLoader, java.lang.Class<?>...) throws java.lang.IllegalArgumentException;
- method public static boolean isProxyClass(java.lang.Class<?>);
- method public static java.lang.Object newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
+ ctor protected Proxy(@NonNull java.lang.reflect.InvocationHandler);
+ method @NonNull public static java.lang.reflect.InvocationHandler getInvocationHandler(@NonNull Object) throws java.lang.IllegalArgumentException;
+ method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, Class<?>...) throws java.lang.IllegalArgumentException;
+ method public static boolean isProxyClass(@NonNull Class<?>);
+ method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
field protected java.lang.reflect.InvocationHandler h;
}
public final class ReflectPermission extends java.security.BasicPermission {
- ctor public ReflectPermission(java.lang.String);
- ctor public ReflectPermission(java.lang.String, java.lang.String);
+ ctor public ReflectPermission(String);
+ ctor public ReflectPermission(String, String);
}
- public abstract interface Type {
- method public default java.lang.String getTypeName();
+ public interface Type {
+ method @NonNull public default String getTypeName();
}
- public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type {
- method public abstract java.lang.reflect.Type[] getBounds();
- method public abstract D getGenericDeclaration();
- method public abstract java.lang.String getName();
+ public interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> extends java.lang.reflect.Type {
+ method public java.lang.reflect.Type[] getBounds();
+ method @NonNull public D getGenericDeclaration();
+ method @NonNull public String getName();
}
public class UndeclaredThrowableException extends java.lang.RuntimeException {
- ctor public UndeclaredThrowableException(java.lang.Throwable);
- ctor public UndeclaredThrowableException(java.lang.Throwable, java.lang.String);
- method public java.lang.Throwable getCause();
- method public java.lang.Throwable getUndeclaredThrowable();
+ ctor public UndeclaredThrowableException(Throwable);
+ ctor public UndeclaredThrowableException(Throwable, String);
+ method public Throwable getUndeclaredThrowable();
}
- public abstract interface WildcardType implements java.lang.reflect.Type {
- method public abstract java.lang.reflect.Type[] getLowerBounds();
- method public abstract java.lang.reflect.Type[] getUpperBounds();
+ public interface WildcardType extends java.lang.reflect.Type {
+ method public java.lang.reflect.Type[] getLowerBounds();
+ method public java.lang.reflect.Type[] getUpperBounds();
}
}
package java.math {
- public class BigDecimal extends java.lang.Number implements java.lang.Comparable java.io.Serializable {
+ public class BigDecimal extends java.lang.Number implements java.lang.Comparable<java.math.BigDecimal> java.io.Serializable {
ctor public BigDecimal(char[], int, int);
ctor public BigDecimal(char[], int, int, java.math.MathContext);
ctor public BigDecimal(char[]);
ctor public BigDecimal(char[], java.math.MathContext);
- ctor public BigDecimal(java.lang.String);
- ctor public BigDecimal(java.lang.String, java.math.MathContext);
+ ctor public BigDecimal(String);
+ ctor public BigDecimal(String, java.math.MathContext);
ctor public BigDecimal(double);
ctor public BigDecimal(double, java.math.MathContext);
ctor public BigDecimal(java.math.BigInteger);
@@ -60972,8 +61232,8 @@ package java.math {
method public java.math.BigDecimal subtract(java.math.BigDecimal, java.math.MathContext);
method public java.math.BigInteger toBigInteger();
method public java.math.BigInteger toBigIntegerExact();
- method public java.lang.String toEngineeringString();
- method public java.lang.String toPlainString();
+ method public String toEngineeringString();
+ method public String toPlainString();
method public java.math.BigDecimal ulp();
method public java.math.BigInteger unscaledValue();
method public static java.math.BigDecimal valueOf(long, int);
@@ -60992,63 +61252,63 @@ package java.math {
field public static final java.math.BigDecimal ZERO;
}
- public class BigInteger extends java.lang.Number implements java.lang.Comparable java.io.Serializable {
- ctor public BigInteger(int, java.util.Random);
- ctor public BigInteger(int, int, java.util.Random);
- ctor public BigInteger(java.lang.String);
- ctor public BigInteger(java.lang.String, int);
+ public class BigInteger extends java.lang.Number implements java.lang.Comparable<java.math.BigInteger> java.io.Serializable {
+ ctor public BigInteger(int, @NonNull java.util.Random);
+ ctor public BigInteger(int, int, @NonNull java.util.Random);
+ ctor public BigInteger(@NonNull String);
+ ctor public BigInteger(@NonNull String, int);
ctor public BigInteger(int, byte[]);
ctor public BigInteger(byte[]);
- method public java.math.BigInteger abs();
- method public java.math.BigInteger add(java.math.BigInteger);
- method public java.math.BigInteger and(java.math.BigInteger);
- method public java.math.BigInteger andNot(java.math.BigInteger);
+ method @NonNull public java.math.BigInteger abs();
+ method @NonNull public java.math.BigInteger add(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger and(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger andNot(@NonNull java.math.BigInteger);
method public int bitCount();
method public int bitLength();
- method public java.math.BigInteger clearBit(int);
- method public int compareTo(java.math.BigInteger);
- method public java.math.BigInteger divide(java.math.BigInteger);
- method public java.math.BigInteger[] divideAndRemainder(java.math.BigInteger);
+ method @NonNull public java.math.BigInteger clearBit(int);
+ method public int compareTo(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger divide(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger[] divideAndRemainder(@NonNull java.math.BigInteger);
method public double doubleValue();
- method public java.math.BigInteger flipBit(int);
+ method @NonNull public java.math.BigInteger flipBit(int);
method public float floatValue();
- method public java.math.BigInteger gcd(java.math.BigInteger);
+ method @NonNull public java.math.BigInteger gcd(@NonNull java.math.BigInteger);
method public int getLowestSetBit();
method public int intValue();
method public boolean isProbablePrime(int);
method public long longValue();
- method public java.math.BigInteger max(java.math.BigInteger);
- method public java.math.BigInteger min(java.math.BigInteger);
- method public java.math.BigInteger mod(java.math.BigInteger);
- method public java.math.BigInteger modInverse(java.math.BigInteger);
- method public java.math.BigInteger modPow(java.math.BigInteger, java.math.BigInteger);
- method public java.math.BigInteger multiply(java.math.BigInteger);
- method public java.math.BigInteger negate();
- method public java.math.BigInteger nextProbablePrime();
- method public java.math.BigInteger not();
- method public java.math.BigInteger or(java.math.BigInteger);
- method public java.math.BigInteger pow(int);
- method public static java.math.BigInteger probablePrime(int, java.util.Random);
- method public java.math.BigInteger remainder(java.math.BigInteger);
- method public java.math.BigInteger setBit(int);
- method public java.math.BigInteger shiftLeft(int);
- method public java.math.BigInteger shiftRight(int);
+ method @NonNull public java.math.BigInteger max(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger min(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger mod(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger modInverse(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger modPow(@NonNull java.math.BigInteger, @NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger multiply(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger negate();
+ method @NonNull public java.math.BigInteger nextProbablePrime();
+ method @NonNull public java.math.BigInteger not();
+ method @NonNull public java.math.BigInteger or(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger pow(int);
+ method @NonNull public static java.math.BigInteger probablePrime(int, @NonNull java.util.Random);
+ method @NonNull public java.math.BigInteger remainder(@NonNull java.math.BigInteger);
+ method @NonNull public java.math.BigInteger setBit(int);
+ method @NonNull public java.math.BigInteger shiftLeft(int);
+ method @NonNull public java.math.BigInteger shiftRight(int);
method public int signum();
- method public java.math.BigInteger subtract(java.math.BigInteger);
+ method @NonNull public java.math.BigInteger subtract(@NonNull java.math.BigInteger);
method public boolean testBit(int);
method public byte[] toByteArray();
- method public java.lang.String toString(int);
- method public static java.math.BigInteger valueOf(long);
- method public java.math.BigInteger xor(java.math.BigInteger);
- field public static final java.math.BigInteger ONE;
- field public static final java.math.BigInteger TEN;
- field public static final java.math.BigInteger ZERO;
+ method @NonNull public String toString(int);
+ method @NonNull public static java.math.BigInteger valueOf(long);
+ method @NonNull public java.math.BigInteger xor(@NonNull java.math.BigInteger);
+ field @NonNull public static final java.math.BigInteger ONE;
+ field @NonNull public static final java.math.BigInteger TEN;
+ field @NonNull public static final java.math.BigInteger ZERO;
}
public final class MathContext implements java.io.Serializable {
ctor public MathContext(int);
ctor public MathContext(int, java.math.RoundingMode);
- ctor public MathContext(java.lang.String);
+ ctor public MathContext(String);
method public int getPrecision();
method public java.math.RoundingMode getRoundingMode();
field public static final java.math.MathContext DECIMAL128;
@@ -61057,10 +61317,8 @@ package java.math {
field public static final java.math.MathContext UNLIMITED;
}
- public final class RoundingMode extends java.lang.Enum {
- method public static java.math.RoundingMode valueOf(java.lang.String);
+ public enum RoundingMode {
method public static java.math.RoundingMode valueOf(int);
- method public static final java.math.RoundingMode[] values();
enum_constant public static final java.math.RoundingMode CEILING;
enum_constant public static final java.math.RoundingMode DOWN;
enum_constant public static final java.math.RoundingMode FLOOR;
@@ -61078,29 +61336,27 @@ package java.net {
public abstract class Authenticator {
ctor public Authenticator();
method protected java.net.PasswordAuthentication getPasswordAuthentication();
- method protected final java.lang.String getRequestingHost();
+ method protected final String getRequestingHost();
method protected final int getRequestingPort();
- method protected final java.lang.String getRequestingPrompt();
- method protected final java.lang.String getRequestingProtocol();
- method protected final java.lang.String getRequestingScheme();
+ method protected final String getRequestingPrompt();
+ method protected final String getRequestingProtocol();
+ method protected final String getRequestingScheme();
method protected final java.net.InetAddress getRequestingSite();
method protected java.net.URL getRequestingURL();
method protected java.net.Authenticator.RequestorType getRequestorType();
- method public static java.net.PasswordAuthentication requestPasswordAuthentication(java.net.InetAddress, int, java.lang.String, java.lang.String, java.lang.String);
- method public static java.net.PasswordAuthentication requestPasswordAuthentication(java.lang.String, java.net.InetAddress, int, java.lang.String, java.lang.String, java.lang.String);
- method public static java.net.PasswordAuthentication requestPasswordAuthentication(java.lang.String, java.net.InetAddress, int, java.lang.String, java.lang.String, java.lang.String, java.net.URL, java.net.Authenticator.RequestorType);
- method public static synchronized void setDefault(java.net.Authenticator);
+ method public static java.net.PasswordAuthentication requestPasswordAuthentication(java.net.InetAddress, int, String, String, String);
+ method public static java.net.PasswordAuthentication requestPasswordAuthentication(String, java.net.InetAddress, int, String, String, String);
+ method public static java.net.PasswordAuthentication requestPasswordAuthentication(String, java.net.InetAddress, int, String, String, String, java.net.URL, java.net.Authenticator.RequestorType);
+ method public static void setDefault(java.net.Authenticator);
}
- public static final class Authenticator.RequestorType extends java.lang.Enum {
- method public static java.net.Authenticator.RequestorType valueOf(java.lang.String);
- method public static final java.net.Authenticator.RequestorType[] values();
+ public enum Authenticator.RequestorType {
enum_constant public static final java.net.Authenticator.RequestorType PROXY;
enum_constant public static final java.net.Authenticator.RequestorType SERVER;
}
public class BindException extends java.net.SocketException {
- ctor public BindException(java.lang.String);
+ ctor public BindException(String);
ctor public BindException();
}
@@ -61113,55 +61369,55 @@ package java.net {
public abstract class CacheResponse {
ctor public CacheResponse();
method public abstract java.io.InputStream getBody() throws java.io.IOException;
- method public abstract java.util.Map<java.lang.String, java.util.List<java.lang.String>> getHeaders() throws java.io.IOException;
+ method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> getHeaders() throws java.io.IOException;
}
public class ConnectException extends java.net.SocketException {
- ctor public ConnectException(java.lang.String);
+ ctor public ConnectException(String);
ctor public ConnectException();
}
public abstract class ContentHandler {
ctor public ContentHandler();
- method public abstract java.lang.Object getContent(java.net.URLConnection) throws java.io.IOException;
- method public java.lang.Object getContent(java.net.URLConnection, java.lang.Class[]) throws java.io.IOException;
+ method public abstract Object getContent(java.net.URLConnection) throws java.io.IOException;
+ method public Object getContent(java.net.URLConnection, Class[]) throws java.io.IOException;
}
- public abstract interface ContentHandlerFactory {
- method public abstract java.net.ContentHandler createContentHandler(java.lang.String);
+ public interface ContentHandlerFactory {
+ method public java.net.ContentHandler createContentHandler(String);
}
public abstract class CookieHandler {
ctor public CookieHandler();
- method public abstract java.util.Map<java.lang.String, java.util.List<java.lang.String>> get(java.net.URI, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
- method public static synchronized java.net.CookieHandler getDefault();
- method public abstract void put(java.net.URI, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
- method public static synchronized void setDefault(java.net.CookieHandler);
+ method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> get(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public static java.net.CookieHandler getDefault();
+ method public abstract void put(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public static void setDefault(java.net.CookieHandler);
}
public class CookieManager extends java.net.CookieHandler {
ctor public CookieManager();
ctor public CookieManager(java.net.CookieStore, java.net.CookiePolicy);
- method public java.util.Map<java.lang.String, java.util.List<java.lang.String>> get(java.net.URI, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public java.util.Map<java.lang.String,java.util.List<java.lang.String>> get(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
method public java.net.CookieStore getCookieStore();
- method public void put(java.net.URI, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public void put(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
method public void setCookiePolicy(java.net.CookiePolicy);
}
- public abstract interface CookiePolicy {
- method public abstract boolean shouldAccept(java.net.URI, java.net.HttpCookie);
+ public interface CookiePolicy {
+ method public boolean shouldAccept(java.net.URI, java.net.HttpCookie);
field public static final java.net.CookiePolicy ACCEPT_ALL;
field public static final java.net.CookiePolicy ACCEPT_NONE;
field public static final java.net.CookiePolicy ACCEPT_ORIGINAL_SERVER;
}
- public abstract interface CookieStore {
- method public abstract void add(java.net.URI, java.net.HttpCookie);
- method public abstract java.util.List<java.net.HttpCookie> get(java.net.URI);
- method public abstract java.util.List<java.net.HttpCookie> getCookies();
- method public abstract java.util.List<java.net.URI> getURIs();
- method public abstract boolean remove(java.net.URI, java.net.HttpCookie);
- method public abstract boolean removeAll();
+ public interface CookieStore {
+ method public void add(java.net.URI, java.net.HttpCookie);
+ method public java.util.List<java.net.HttpCookie> get(java.net.URI);
+ method public java.util.List<java.net.HttpCookie> getCookies();
+ method public java.util.List<java.net.URI> getURIs();
+ method public boolean remove(java.net.URI, java.net.HttpCookie);
+ method public boolean removeAll();
}
public final class DatagramPacket {
@@ -61171,18 +61427,18 @@ package java.net {
ctor public DatagramPacket(byte[], int, int, java.net.SocketAddress);
ctor public DatagramPacket(byte[], int, java.net.InetAddress, int);
ctor public DatagramPacket(byte[], int, java.net.SocketAddress);
- method public synchronized java.net.InetAddress getAddress();
- method public synchronized byte[] getData();
- method public synchronized int getLength();
- method public synchronized int getOffset();
- method public synchronized int getPort();
- method public synchronized java.net.SocketAddress getSocketAddress();
- method public synchronized void setAddress(java.net.InetAddress);
- method public synchronized void setData(byte[], int, int);
- method public synchronized void setData(byte[]);
- method public synchronized void setLength(int);
- method public synchronized void setPort(int);
- method public synchronized void setSocketAddress(java.net.SocketAddress);
+ method public java.net.InetAddress getAddress();
+ method public byte[] getData();
+ method public int getLength();
+ method public int getOffset();
+ method public int getPort();
+ method public java.net.SocketAddress getSocketAddress();
+ method public void setAddress(java.net.InetAddress);
+ method public void setData(byte[], int, int);
+ method public void setData(byte[]);
+ method public void setLength(int);
+ method public void setPort(int);
+ method public void setSocketAddress(java.net.SocketAddress);
}
public class DatagramSocket implements java.io.Closeable {
@@ -61191,36 +61447,36 @@ package java.net {
ctor public DatagramSocket(java.net.SocketAddress) throws java.net.SocketException;
ctor public DatagramSocket(int) throws java.net.SocketException;
ctor public DatagramSocket(int, java.net.InetAddress) throws java.net.SocketException;
- method public synchronized void bind(java.net.SocketAddress) throws java.net.SocketException;
+ method public void bind(java.net.SocketAddress) throws java.net.SocketException;
method public void close();
method public void connect(java.net.InetAddress, int);
method public void connect(java.net.SocketAddress) throws java.net.SocketException;
method public void disconnect();
- method public synchronized boolean getBroadcast() throws java.net.SocketException;
+ method public boolean getBroadcast() throws java.net.SocketException;
method public java.nio.channels.DatagramChannel getChannel();
method public java.net.InetAddress getInetAddress();
method public java.net.InetAddress getLocalAddress();
method public int getLocalPort();
method public java.net.SocketAddress getLocalSocketAddress();
method public int getPort();
- method public synchronized int getReceiveBufferSize() throws java.net.SocketException;
+ method public int getReceiveBufferSize() throws java.net.SocketException;
method public java.net.SocketAddress getRemoteSocketAddress();
- method public synchronized boolean getReuseAddress() throws java.net.SocketException;
- method public synchronized int getSendBufferSize() throws java.net.SocketException;
- method public synchronized int getSoTimeout() throws java.net.SocketException;
- method public synchronized int getTrafficClass() throws java.net.SocketException;
+ method public boolean getReuseAddress() throws java.net.SocketException;
+ method public int getSendBufferSize() throws java.net.SocketException;
+ method public int getSoTimeout() throws java.net.SocketException;
+ method public int getTrafficClass() throws java.net.SocketException;
method public boolean isBound();
method public boolean isClosed();
method public boolean isConnected();
- method public synchronized void receive(java.net.DatagramPacket) throws java.io.IOException;
+ method public void receive(java.net.DatagramPacket) throws java.io.IOException;
method public void send(java.net.DatagramPacket) throws java.io.IOException;
- method public synchronized void setBroadcast(boolean) throws java.net.SocketException;
- method public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory) throws java.io.IOException;
- method public synchronized void setReceiveBufferSize(int) throws java.net.SocketException;
- method public synchronized void setReuseAddress(boolean) throws java.net.SocketException;
- method public synchronized void setSendBufferSize(int) throws java.net.SocketException;
- method public synchronized void setSoTimeout(int) throws java.net.SocketException;
- method public synchronized void setTrafficClass(int) throws java.net.SocketException;
+ method public void setBroadcast(boolean) throws java.net.SocketException;
+ method public static void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory) throws java.io.IOException;
+ method public void setReceiveBufferSize(int) throws java.net.SocketException;
+ method public void setReuseAddress(boolean) throws java.net.SocketException;
+ method public void setSendBufferSize(int) throws java.net.SocketException;
+ method public void setSoTimeout(int) throws java.net.SocketException;
+ method public void setTrafficClass(int) throws java.net.SocketException;
}
public abstract class DatagramSocketImpl implements java.net.SocketOptions {
@@ -61232,7 +61488,7 @@ package java.net {
method protected void disconnect();
method protected java.io.FileDescriptor getFileDescriptor();
method protected int getLocalPort();
- method protected abstract deprecated byte getTTL() throws java.io.IOException;
+ method @Deprecated protected abstract byte getTTL() throws java.io.IOException;
method protected abstract int getTimeToLive() throws java.io.IOException;
method protected abstract void join(java.net.InetAddress) throws java.io.IOException;
method protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
@@ -61242,56 +61498,56 @@ package java.net {
method protected abstract int peekData(java.net.DatagramPacket) throws java.io.IOException;
method protected abstract void receive(java.net.DatagramPacket) throws java.io.IOException;
method protected abstract void send(java.net.DatagramPacket) throws java.io.IOException;
- method protected abstract deprecated void setTTL(byte) throws java.io.IOException;
+ method @Deprecated protected abstract void setTTL(byte) throws java.io.IOException;
method protected abstract void setTimeToLive(int) throws java.io.IOException;
field protected java.io.FileDescriptor fd;
field protected int localPort;
}
- public abstract interface DatagramSocketImplFactory {
- method public abstract java.net.DatagramSocketImpl createDatagramSocketImpl();
+ public interface DatagramSocketImplFactory {
+ method public java.net.DatagramSocketImpl createDatagramSocketImpl();
}
- public abstract interface FileNameMap {
- method public abstract java.lang.String getContentTypeFor(java.lang.String);
+ public interface FileNameMap {
+ method public String getContentTypeFor(String);
}
public final class HttpCookie implements java.lang.Cloneable {
- ctor public HttpCookie(java.lang.String, java.lang.String);
- method public java.lang.Object clone();
- method public static boolean domainMatches(java.lang.String, java.lang.String);
- method public java.lang.String getComment();
- method public java.lang.String getCommentURL();
+ ctor public HttpCookie(String, String);
+ method public Object clone();
+ method public static boolean domainMatches(String, String);
+ method public String getComment();
+ method public String getCommentURL();
method public boolean getDiscard();
- method public java.lang.String getDomain();
+ method public String getDomain();
method public long getMaxAge();
- method public java.lang.String getName();
- method public java.lang.String getPath();
- method public java.lang.String getPortlist();
+ method public String getName();
+ method public String getPath();
+ method public String getPortlist();
method public boolean getSecure();
- method public java.lang.String getValue();
+ method public String getValue();
method public int getVersion();
method public boolean hasExpired();
method public boolean isHttpOnly();
- method public static java.util.List<java.net.HttpCookie> parse(java.lang.String);
- method public void setComment(java.lang.String);
- method public void setCommentURL(java.lang.String);
+ method public static java.util.List<java.net.HttpCookie> parse(String);
+ method public void setComment(String);
+ method public void setCommentURL(String);
method public void setDiscard(boolean);
- method public void setDomain(java.lang.String);
+ method public void setDomain(String);
method public void setHttpOnly(boolean);
method public void setMaxAge(long);
- method public void setPath(java.lang.String);
- method public void setPortlist(java.lang.String);
+ method public void setPath(String);
+ method public void setPortlist(String);
method public void setSecure(boolean);
- method public void setValue(java.lang.String);
+ method public void setValue(String);
method public void setVersion(int);
}
public class HttpRetryException extends java.io.IOException {
- ctor public HttpRetryException(java.lang.String, int);
- ctor public HttpRetryException(java.lang.String, int, java.lang.String);
- method public java.lang.String getLocation();
- method public java.lang.String getReason();
+ ctor public HttpRetryException(String, int);
+ ctor public HttpRetryException(String, int, String);
+ method public String getLocation();
+ method public String getReason();
method public int responseCode();
}
@@ -61301,15 +61557,15 @@ package java.net {
method public java.io.InputStream getErrorStream();
method public static boolean getFollowRedirects();
method public boolean getInstanceFollowRedirects();
- method public java.lang.String getRequestMethod();
+ method public String getRequestMethod();
method public int getResponseCode() throws java.io.IOException;
- method public java.lang.String getResponseMessage() throws java.io.IOException;
+ method public String getResponseMessage() throws java.io.IOException;
method public void setChunkedStreamingMode(int);
method public void setFixedLengthStreamingMode(int);
method public void setFixedLengthStreamingMode(long);
method public static void setFollowRedirects(boolean);
method public void setInstanceFollowRedirects(boolean);
- method public void setRequestMethod(java.lang.String) throws java.net.ProtocolException;
+ method public void setRequestMethod(String) throws java.net.ProtocolException;
method public abstract boolean usingProxy();
field public static final int HTTP_ACCEPTED = 202; // 0xca
field public static final int HTTP_BAD_GATEWAY = 502; // 0x1f6
@@ -61341,7 +61597,7 @@ package java.net {
field public static final int HTTP_REQ_TOO_LONG = 414; // 0x19e
field public static final int HTTP_RESET = 205; // 0xcd
field public static final int HTTP_SEE_OTHER = 303; // 0x12f
- field public static final deprecated int HTTP_SERVER_ERROR = 500; // 0x1f4
+ field @Deprecated public static final int HTTP_SERVER_ERROR = 500; // 0x1f4
field public static final int HTTP_UNAUTHORIZED = 401; // 0x191
field public static final int HTTP_UNAVAILABLE = 503; // 0x1f7
field public static final int HTTP_UNSUPPORTED_TYPE = 415; // 0x19f
@@ -61351,16 +61607,16 @@ package java.net {
field protected int fixedContentLength;
field protected long fixedContentLengthLong;
field protected boolean instanceFollowRedirects;
- field protected java.lang.String method;
+ field protected String method;
field protected int responseCode;
- field protected java.lang.String responseMessage;
+ field protected String responseMessage;
}
public final class IDN {
- method public static java.lang.String toASCII(java.lang.String, int);
- method public static java.lang.String toASCII(java.lang.String);
- method public static java.lang.String toUnicode(java.lang.String, int);
- method public static java.lang.String toUnicode(java.lang.String);
+ method public static String toASCII(String, int);
+ method public static String toASCII(String);
+ method public static String toUnicode(String, int);
+ method public static String toUnicode(String);
field public static final int ALLOW_UNASSIGNED = 1; // 0x1
field public static final int USE_STD3_ASCII_RULES = 2; // 0x2
}
@@ -61369,8 +61625,8 @@ package java.net {
}
public final class Inet6Address extends java.net.InetAddress {
- method public static java.net.Inet6Address getByAddress(java.lang.String, byte[], java.net.NetworkInterface) throws java.net.UnknownHostException;
- method public static java.net.Inet6Address getByAddress(java.lang.String, byte[], int) throws java.net.UnknownHostException;
+ method public static java.net.Inet6Address getByAddress(String, byte[], java.net.NetworkInterface) throws java.net.UnknownHostException;
+ method public static java.net.Inet6Address getByAddress(String, byte[], int) throws java.net.UnknownHostException;
method public int getScopeId();
method public java.net.NetworkInterface getScopedInterface();
method public boolean isIPv4CompatibleAddress();
@@ -61378,13 +61634,13 @@ package java.net {
public class InetAddress implements java.io.Serializable {
method public byte[] getAddress();
- method public static java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
- method public static java.net.InetAddress getByAddress(java.lang.String, byte[]) throws java.net.UnknownHostException;
+ method public static java.net.InetAddress[] getAllByName(String) throws java.net.UnknownHostException;
+ method public static java.net.InetAddress getByAddress(String, byte[]) throws java.net.UnknownHostException;
method public static java.net.InetAddress getByAddress(byte[]) throws java.net.UnknownHostException;
- method public static java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
- method public java.lang.String getCanonicalHostName();
- method public java.lang.String getHostAddress();
- method public java.lang.String getHostName();
+ method public static java.net.InetAddress getByName(String) throws java.net.UnknownHostException;
+ method public String getCanonicalHostName();
+ method public String getHostAddress();
+ method public String getHostName();
method public static java.net.InetAddress getLocalHost() throws java.net.UnknownHostException;
method public static java.net.InetAddress getLoopbackAddress();
method public boolean isAnyLocalAddress();
@@ -61404,12 +61660,12 @@ package java.net {
public class InetSocketAddress extends java.net.SocketAddress {
ctor public InetSocketAddress(int);
ctor public InetSocketAddress(java.net.InetAddress, int);
- ctor public InetSocketAddress(java.lang.String, int);
- method public static java.net.InetSocketAddress createUnresolved(java.lang.String, int);
- method public final boolean equals(java.lang.Object);
+ ctor public InetSocketAddress(String, int);
+ method public static java.net.InetSocketAddress createUnresolved(String, int);
+ method public final boolean equals(Object);
method public final java.net.InetAddress getAddress();
- method public final java.lang.String getHostName();
- method public final java.lang.String getHostString();
+ method public final String getHostName();
+ method public final String getHostString();
method public final int getPort();
method public final int hashCode();
method public final boolean isUnresolved();
@@ -61425,7 +61681,7 @@ package java.net {
ctor protected JarURLConnection(java.net.URL) throws java.net.MalformedURLException;
method public java.util.jar.Attributes getAttributes() throws java.io.IOException;
method public java.security.cert.Certificate[] getCertificates() throws java.io.IOException;
- method public java.lang.String getEntryName();
+ method public String getEntryName();
method public java.util.jar.JarEntry getJarEntry() throws java.io.IOException;
method public abstract java.util.jar.JarFile getJarFile() throws java.io.IOException;
method public java.net.URL getJarFileURL();
@@ -61436,7 +61692,7 @@ package java.net {
public class MalformedURLException extends java.io.IOException {
ctor public MalformedURLException();
- ctor public MalformedURLException(java.lang.String);
+ ctor public MalformedURLException(String);
}
public class MulticastSocket extends java.net.DatagramSocket {
@@ -61446,36 +61702,36 @@ package java.net {
method public java.net.InetAddress getInterface() throws java.net.SocketException;
method public boolean getLoopbackMode() throws java.net.SocketException;
method public java.net.NetworkInterface getNetworkInterface() throws java.net.SocketException;
- method public deprecated byte getTTL() throws java.io.IOException;
+ method @Deprecated public byte getTTL() throws java.io.IOException;
method public int getTimeToLive() throws java.io.IOException;
method public void joinGroup(java.net.InetAddress) throws java.io.IOException;
method public void joinGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
method public void leaveGroup(java.net.InetAddress) throws java.io.IOException;
method public void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
- method public deprecated void send(java.net.DatagramPacket, byte) throws java.io.IOException;
+ method @Deprecated public void send(java.net.DatagramPacket, byte) throws java.io.IOException;
method public void setInterface(java.net.InetAddress) throws java.net.SocketException;
method public void setLoopbackMode(boolean) throws java.net.SocketException;
method public void setNetworkInterface(java.net.NetworkInterface) throws java.net.SocketException;
- method public deprecated void setTTL(byte) throws java.io.IOException;
+ method @Deprecated public void setTTL(byte) throws java.io.IOException;
method public void setTimeToLive(int) throws java.io.IOException;
}
public final class NetPermission extends java.security.BasicPermission {
- ctor public NetPermission(java.lang.String);
- ctor public NetPermission(java.lang.String, java.lang.String);
+ ctor public NetPermission(String);
+ ctor public NetPermission(String, String);
}
public final class NetworkInterface {
method public static java.net.NetworkInterface getByIndex(int) throws java.net.SocketException;
method public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress) throws java.net.SocketException;
- method public static java.net.NetworkInterface getByName(java.lang.String) throws java.net.SocketException;
- method public java.lang.String getDisplayName();
+ method public static java.net.NetworkInterface getByName(String) throws java.net.SocketException;
+ method public String getDisplayName();
method public byte[] getHardwareAddress() throws java.net.SocketException;
method public int getIndex();
method public java.util.Enumeration<java.net.InetAddress> getInetAddresses();
method public java.util.List<java.net.InterfaceAddress> getInterfaceAddresses();
method public int getMTU() throws java.net.SocketException;
- method public java.lang.String getName();
+ method public String getName();
method public static java.util.Enumeration<java.net.NetworkInterface> getNetworkInterfaces() throws java.net.SocketException;
method public java.net.NetworkInterface getParent();
method public java.util.Enumeration<java.net.NetworkInterface> getSubInterfaces();
@@ -61487,42 +61743,40 @@ package java.net {
}
public class NoRouteToHostException extends java.net.SocketException {
- ctor public NoRouteToHostException(java.lang.String);
+ ctor public NoRouteToHostException(String);
ctor public NoRouteToHostException();
}
public final class PasswordAuthentication {
- ctor public PasswordAuthentication(java.lang.String, char[]);
+ ctor public PasswordAuthentication(String, char[]);
method public char[] getPassword();
- method public java.lang.String getUserName();
+ method public String getUserName();
}
public class PortUnreachableException extends java.net.SocketException {
- ctor public PortUnreachableException(java.lang.String);
+ ctor public PortUnreachableException(String);
ctor public PortUnreachableException();
}
public class ProtocolException extends java.io.IOException {
- ctor public ProtocolException(java.lang.String);
+ ctor public ProtocolException(String);
ctor public ProtocolException();
}
- public abstract interface ProtocolFamily {
- method public abstract java.lang.String name();
+ public interface ProtocolFamily {
+ method public String name();
}
public class Proxy {
ctor public Proxy(java.net.Proxy.Type, java.net.SocketAddress);
method public java.net.SocketAddress address();
- method public final boolean equals(java.lang.Object);
+ method public final boolean equals(Object);
method public final int hashCode();
method public java.net.Proxy.Type type();
field public static final java.net.Proxy NO_PROXY;
}
- public static final class Proxy.Type extends java.lang.Enum {
- method public static java.net.Proxy.Type valueOf(java.lang.String);
- method public static final java.net.Proxy.Type[] values();
+ public enum Proxy.Type {
enum_constant public static final java.net.Proxy.Type DIRECT;
enum_constant public static final java.net.Proxy.Type HTTP;
enum_constant public static final java.net.Proxy.Type SOCKS;
@@ -61538,15 +61792,15 @@ package java.net {
public abstract class ResponseCache {
ctor public ResponseCache();
- method public abstract java.net.CacheResponse get(java.net.URI, java.lang.String, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
- method public static synchronized java.net.ResponseCache getDefault();
+ method public abstract java.net.CacheResponse get(java.net.URI, String, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public static java.net.ResponseCache getDefault();
method public abstract java.net.CacheRequest put(java.net.URI, java.net.URLConnection) throws java.io.IOException;
- method public static synchronized void setDefault(java.net.ResponseCache);
+ method public static void setDefault(java.net.ResponseCache);
}
public abstract class SecureCacheResponse extends java.net.CacheResponse {
ctor public SecureCacheResponse();
- method public abstract java.lang.String getCipherSuite();
+ method public abstract String getCipherSuite();
method public abstract java.util.List<java.security.cert.Certificate> getLocalCertificateChain();
method public abstract java.security.Principal getLocalPrincipal();
method public abstract java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
@@ -61566,31 +61820,31 @@ package java.net {
method public java.net.InetAddress getInetAddress();
method public int getLocalPort();
method public java.net.SocketAddress getLocalSocketAddress();
- method public synchronized int getReceiveBufferSize() throws java.net.SocketException;
+ method public int getReceiveBufferSize() throws java.net.SocketException;
method public boolean getReuseAddress() throws java.net.SocketException;
- method public synchronized int getSoTimeout() throws java.io.IOException;
+ method public int getSoTimeout() throws java.io.IOException;
method protected final void implAccept(java.net.Socket) throws java.io.IOException;
method public boolean isBound();
method public boolean isClosed();
method public void setPerformancePreferences(int, int, int);
- method public synchronized void setReceiveBufferSize(int) throws java.net.SocketException;
+ method public void setReceiveBufferSize(int) throws java.net.SocketException;
method public void setReuseAddress(boolean) throws java.net.SocketException;
- method public synchronized void setSoTimeout(int) throws java.net.SocketException;
- method public static synchronized void setSocketFactory(java.net.SocketImplFactory) throws java.io.IOException;
+ method public void setSoTimeout(int) throws java.net.SocketException;
+ method public static void setSocketFactory(java.net.SocketImplFactory) throws java.io.IOException;
}
public class Socket implements java.io.Closeable {
ctor public Socket();
ctor public Socket(java.net.Proxy);
ctor protected Socket(java.net.SocketImpl) throws java.net.SocketException;
- ctor public Socket(java.lang.String, int) throws java.io.IOException, java.net.UnknownHostException;
+ ctor public Socket(String, int) throws java.io.IOException, java.net.UnknownHostException;
ctor public Socket(java.net.InetAddress, int) throws java.io.IOException;
- ctor public Socket(java.lang.String, int, java.net.InetAddress, int) throws java.io.IOException;
+ ctor public Socket(String, int, java.net.InetAddress, int) throws java.io.IOException;
ctor public Socket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
- ctor public deprecated Socket(java.lang.String, int, boolean) throws java.io.IOException;
- ctor public deprecated Socket(java.net.InetAddress, int, boolean) throws java.io.IOException;
+ ctor @Deprecated public Socket(String, int, boolean) throws java.io.IOException;
+ ctor @Deprecated public Socket(java.net.InetAddress, int, boolean) throws java.io.IOException;
method public void bind(java.net.SocketAddress) throws java.io.IOException;
- method public synchronized void close() throws java.io.IOException;
+ method public void close() throws java.io.IOException;
method public void connect(java.net.SocketAddress) throws java.io.IOException;
method public void connect(java.net.SocketAddress, int) throws java.io.IOException;
method public java.nio.channels.SocketChannel getChannel();
@@ -61603,12 +61857,12 @@ package java.net {
method public boolean getOOBInline() throws java.net.SocketException;
method public java.io.OutputStream getOutputStream() throws java.io.IOException;
method public int getPort();
- method public synchronized int getReceiveBufferSize() throws java.net.SocketException;
+ method public int getReceiveBufferSize() throws java.net.SocketException;
method public java.net.SocketAddress getRemoteSocketAddress();
method public boolean getReuseAddress() throws java.net.SocketException;
- method public synchronized int getSendBufferSize() throws java.net.SocketException;
+ method public int getSendBufferSize() throws java.net.SocketException;
method public int getSoLinger() throws java.net.SocketException;
- method public synchronized int getSoTimeout() throws java.net.SocketException;
+ method public int getSoTimeout() throws java.net.SocketException;
method public boolean getTcpNoDelay() throws java.net.SocketException;
method public int getTrafficClass() throws java.net.SocketException;
method public boolean isBound();
@@ -61620,12 +61874,12 @@ package java.net {
method public void setKeepAlive(boolean) throws java.net.SocketException;
method public void setOOBInline(boolean) throws java.net.SocketException;
method public void setPerformancePreferences(int, int, int);
- method public synchronized void setReceiveBufferSize(int) throws java.net.SocketException;
+ method public void setReceiveBufferSize(int) throws java.net.SocketException;
method public void setReuseAddress(boolean) throws java.net.SocketException;
- method public synchronized void setSendBufferSize(int) throws java.net.SocketException;
+ method public void setSendBufferSize(int) throws java.net.SocketException;
method public void setSoLinger(boolean, int) throws java.net.SocketException;
- method public synchronized void setSoTimeout(int) throws java.net.SocketException;
- method public static synchronized void setSocketImplFactory(java.net.SocketImplFactory) throws java.io.IOException;
+ method public void setSoTimeout(int) throws java.net.SocketException;
+ method public static void setSocketImplFactory(java.net.SocketImplFactory) throws java.io.IOException;
method public void setTcpNoDelay(boolean) throws java.net.SocketException;
method public void setTrafficClass(int) throws java.net.SocketException;
method public void shutdownInput() throws java.io.IOException;
@@ -61637,7 +61891,7 @@ package java.net {
}
public class SocketException extends java.io.IOException {
- ctor public SocketException(java.lang.String);
+ ctor public SocketException(String);
ctor public SocketException();
}
@@ -61647,7 +61901,7 @@ package java.net {
method protected abstract int available() throws java.io.IOException;
method protected abstract void bind(java.net.InetAddress, int) throws java.io.IOException;
method protected abstract void close() throws java.io.IOException;
- method protected abstract void connect(java.lang.String, int) throws java.io.IOException;
+ method protected abstract void connect(String, int) throws java.io.IOException;
method protected abstract void connect(java.net.InetAddress, int) throws java.io.IOException;
method protected abstract void connect(java.net.SocketAddress, int) throws java.io.IOException;
method protected abstract void create(boolean) throws java.io.IOException;
@@ -61669,18 +61923,18 @@ package java.net {
field protected int port;
}
- public abstract interface SocketImplFactory {
- method public abstract java.net.SocketImpl createSocketImpl();
+ public interface SocketImplFactory {
+ method public java.net.SocketImpl createSocketImpl();
}
- public abstract interface SocketOption<T> {
- method public abstract java.lang.String name();
- method public abstract java.lang.Class<T> type();
+ public interface SocketOption<T> {
+ method public String name();
+ method public Class<T> type();
}
- public abstract interface SocketOptions {
- method public abstract java.lang.Object getOption(int) throws java.net.SocketException;
- method public abstract void setOption(int, java.lang.Object) throws java.net.SocketException;
+ public interface SocketOptions {
+ method public Object getOption(int) throws java.net.SocketException;
+ method public void setOption(int, Object) throws java.net.SocketException;
field public static final int IP_MULTICAST_IF = 16; // 0x10
field public static final int IP_MULTICAST_IF2 = 31; // 0x1f
field public static final int IP_MULTICAST_LOOP = 18; // 0x12
@@ -61698,19 +61952,17 @@ package java.net {
}
public final class SocketPermission extends java.security.Permission implements java.io.Serializable {
- ctor public SocketPermission(java.lang.String, java.lang.String);
- method public java.lang.String getActions();
+ ctor public SocketPermission(String, String);
+ method public String getActions();
method public boolean implies(java.security.Permission);
}
public class SocketTimeoutException extends java.io.InterruptedIOException {
- ctor public SocketTimeoutException(java.lang.String);
+ ctor public SocketTimeoutException(String);
ctor public SocketTimeoutException();
}
- public final class StandardProtocolFamily extends java.lang.Enum implements java.net.ProtocolFamily {
- method public static java.net.StandardProtocolFamily valueOf(java.lang.String);
- method public static final java.net.StandardProtocolFamily[] values();
+ public enum StandardProtocolFamily implements java.net.ProtocolFamily {
enum_constant public static final java.net.StandardProtocolFamily INET;
enum_constant public static final java.net.StandardProtocolFamily INET6;
}
@@ -61729,142 +61981,141 @@ package java.net {
field public static final java.net.SocketOption<java.lang.Boolean> TCP_NODELAY;
}
- public final class URI implements java.lang.Comparable java.io.Serializable {
- ctor public URI(java.lang.String) throws java.net.URISyntaxException;
- ctor public URI(java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String) throws java.net.URISyntaxException;
- ctor public URI(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.net.URISyntaxException;
- ctor public URI(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.net.URISyntaxException;
- ctor public URI(java.lang.String, java.lang.String, java.lang.String) throws java.net.URISyntaxException;
+ public final class URI implements java.lang.Comparable<java.net.URI> java.io.Serializable {
+ ctor public URI(String) throws java.net.URISyntaxException;
+ ctor public URI(String, String, String, int, String, String, String) throws java.net.URISyntaxException;
+ ctor public URI(String, String, String, String, String) throws java.net.URISyntaxException;
+ ctor public URI(String, String, String, String) throws java.net.URISyntaxException;
+ ctor public URI(String, String, String) throws java.net.URISyntaxException;
method public int compareTo(java.net.URI);
- method public static java.net.URI create(java.lang.String);
- method public java.lang.String getAuthority();
- method public java.lang.String getFragment();
- method public java.lang.String getHost();
- method public java.lang.String getPath();
+ method public static java.net.URI create(String);
+ method public String getAuthority();
+ method public String getFragment();
+ method public String getHost();
+ method public String getPath();
method public int getPort();
- method public java.lang.String getQuery();
- method public java.lang.String getRawAuthority();
- method public java.lang.String getRawFragment();
- method public java.lang.String getRawPath();
- method public java.lang.String getRawQuery();
- method public java.lang.String getRawSchemeSpecificPart();
- method public java.lang.String getRawUserInfo();
- method public java.lang.String getScheme();
- method public java.lang.String getSchemeSpecificPart();
- method public java.lang.String getUserInfo();
+ method public String getQuery();
+ method public String getRawAuthority();
+ method public String getRawFragment();
+ method public String getRawPath();
+ method public String getRawQuery();
+ method public String getRawSchemeSpecificPart();
+ method public String getRawUserInfo();
+ method public String getScheme();
+ method public String getSchemeSpecificPart();
+ method public String getUserInfo();
method public boolean isAbsolute();
method public boolean isOpaque();
method public java.net.URI normalize();
method public java.net.URI parseServerAuthority() throws java.net.URISyntaxException;
method public java.net.URI relativize(java.net.URI);
method public java.net.URI resolve(java.net.URI);
- method public java.net.URI resolve(java.lang.String);
- method public java.lang.String toASCIIString();
+ method public java.net.URI resolve(String);
+ method public String toASCIIString();
method public java.net.URL toURL() throws java.net.MalformedURLException;
}
public class URISyntaxException extends java.lang.Exception {
- ctor public URISyntaxException(java.lang.String, java.lang.String, int);
- ctor public URISyntaxException(java.lang.String, java.lang.String);
+ ctor public URISyntaxException(String, String, int);
+ ctor public URISyntaxException(String, String);
method public int getIndex();
- method public java.lang.String getInput();
- method public java.lang.String getReason();
+ method public String getInput();
+ method public String getReason();
}
public final class URL implements java.io.Serializable {
- ctor public URL(java.lang.String, java.lang.String, int, java.lang.String) throws java.net.MalformedURLException;
- ctor public URL(java.lang.String, java.lang.String, java.lang.String) throws java.net.MalformedURLException;
- ctor public URL(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
- ctor public URL(java.lang.String) throws java.net.MalformedURLException;
- ctor public URL(java.net.URL, java.lang.String) throws java.net.MalformedURLException;
- ctor public URL(java.net.URL, java.lang.String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
- method public java.lang.String getAuthority();
- method public java.lang.Object getContent() throws java.io.IOException;
- method public java.lang.Object getContent(java.lang.Class[]) throws java.io.IOException;
+ ctor public URL(String, String, int, String) throws java.net.MalformedURLException;
+ ctor public URL(String, String, String) throws java.net.MalformedURLException;
+ ctor public URL(String, String, int, String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
+ ctor public URL(String) throws java.net.MalformedURLException;
+ ctor public URL(java.net.URL, String) throws java.net.MalformedURLException;
+ ctor public URL(java.net.URL, String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
+ method public String getAuthority();
+ method public Object getContent() throws java.io.IOException;
+ method public Object getContent(Class[]) throws java.io.IOException;
method public int getDefaultPort();
- method public java.lang.String getFile();
- method public java.lang.String getHost();
- method public java.lang.String getPath();
+ method public String getFile();
+ method public String getHost();
+ method public String getPath();
method public int getPort();
- method public java.lang.String getProtocol();
- method public java.lang.String getQuery();
- method public java.lang.String getRef();
- method public java.lang.String getUserInfo();
- method public synchronized int hashCode();
+ method public String getProtocol();
+ method public String getQuery();
+ method public String getRef();
+ method public String getUserInfo();
method public java.net.URLConnection openConnection() throws java.io.IOException;
method public java.net.URLConnection openConnection(java.net.Proxy) throws java.io.IOException;
method public java.io.InputStream openStream() throws java.io.IOException;
method public boolean sameFile(java.net.URL);
method public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
- method public java.lang.String toExternalForm();
+ method public String toExternalForm();
method public java.net.URI toURI() throws java.net.URISyntaxException;
}
public class URLClassLoader extends java.security.SecureClassLoader implements java.io.Closeable {
- ctor public URLClassLoader(java.net.URL[], java.lang.ClassLoader);
+ ctor public URLClassLoader(java.net.URL[], ClassLoader);
ctor public URLClassLoader(java.net.URL[]);
- ctor public URLClassLoader(java.net.URL[], java.lang.ClassLoader, java.net.URLStreamHandlerFactory);
+ ctor public URLClassLoader(java.net.URL[], ClassLoader, java.net.URLStreamHandlerFactory);
method protected void addURL(java.net.URL);
method public void close() throws java.io.IOException;
- method protected java.lang.Package definePackage(java.lang.String, java.util.jar.Manifest, java.net.URL) throws java.lang.IllegalArgumentException;
- method public java.net.URL findResource(java.lang.String);
- method public java.util.Enumeration<java.net.URL> findResources(java.lang.String) throws java.io.IOException;
+ method protected Package definePackage(String, java.util.jar.Manifest, java.net.URL) throws java.lang.IllegalArgumentException;
+ method public java.net.URL findResource(String);
+ method public java.util.Enumeration<java.net.URL> findResources(String) throws java.io.IOException;
method public java.net.URL[] getURLs();
- method public static java.net.URLClassLoader newInstance(java.net.URL[], java.lang.ClassLoader);
+ method public static java.net.URLClassLoader newInstance(java.net.URL[], ClassLoader);
method public static java.net.URLClassLoader newInstance(java.net.URL[]);
}
public abstract class URLConnection {
ctor protected URLConnection(java.net.URL);
- method public void addRequestProperty(java.lang.String, java.lang.String);
+ method public void addRequestProperty(String, String);
method public abstract void connect() throws java.io.IOException;
method public boolean getAllowUserInteraction();
method public int getConnectTimeout();
- method public java.lang.Object getContent() throws java.io.IOException;
- method public java.lang.Object getContent(java.lang.Class[]) throws java.io.IOException;
- method public java.lang.String getContentEncoding();
+ method public Object getContent() throws java.io.IOException;
+ method public Object getContent(Class[]) throws java.io.IOException;
+ method public String getContentEncoding();
method public int getContentLength();
method public long getContentLengthLong();
- method public java.lang.String getContentType();
+ method public String getContentType();
method public long getDate();
method public static boolean getDefaultAllowUserInteraction();
- method public static deprecated java.lang.String getDefaultRequestProperty(java.lang.String);
+ method @Deprecated public static String getDefaultRequestProperty(String);
method public boolean getDefaultUseCaches();
method public boolean getDoInput();
method public boolean getDoOutput();
method public long getExpiration();
- method public static synchronized java.net.FileNameMap getFileNameMap();
- method public java.lang.String getHeaderField(java.lang.String);
- method public java.lang.String getHeaderField(int);
- method public long getHeaderFieldDate(java.lang.String, long);
- method public int getHeaderFieldInt(java.lang.String, int);
- method public java.lang.String getHeaderFieldKey(int);
- method public long getHeaderFieldLong(java.lang.String, long);
- method public java.util.Map<java.lang.String, java.util.List<java.lang.String>> getHeaderFields();
+ method public static java.net.FileNameMap getFileNameMap();
+ method public String getHeaderField(String);
+ method public String getHeaderField(int);
+ method public long getHeaderFieldDate(String, long);
+ method public int getHeaderFieldInt(String, int);
+ method public String getHeaderFieldKey(int);
+ method public long getHeaderFieldLong(String, long);
+ method public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getHeaderFields();
method public long getIfModifiedSince();
method public java.io.InputStream getInputStream() throws java.io.IOException;
method public long getLastModified();
method public java.io.OutputStream getOutputStream() throws java.io.IOException;
method public java.security.Permission getPermission() throws java.io.IOException;
method public int getReadTimeout();
- method public java.util.Map<java.lang.String, java.util.List<java.lang.String>> getRequestProperties();
- method public java.lang.String getRequestProperty(java.lang.String);
+ method public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getRequestProperties();
+ method public String getRequestProperty(String);
method public java.net.URL getURL();
method public boolean getUseCaches();
- method public static java.lang.String guessContentTypeFromName(java.lang.String);
- method public static java.lang.String guessContentTypeFromStream(java.io.InputStream) throws java.io.IOException;
+ method public static String guessContentTypeFromName(String);
+ method public static String guessContentTypeFromStream(java.io.InputStream) throws java.io.IOException;
method public void setAllowUserInteraction(boolean);
method public void setConnectTimeout(int);
- method public static synchronized void setContentHandlerFactory(java.net.ContentHandlerFactory);
+ method public static void setContentHandlerFactory(java.net.ContentHandlerFactory);
method public static void setDefaultAllowUserInteraction(boolean);
- method public static deprecated void setDefaultRequestProperty(java.lang.String, java.lang.String);
+ method @Deprecated public static void setDefaultRequestProperty(String, String);
method public void setDefaultUseCaches(boolean);
method public void setDoInput(boolean);
method public void setDoOutput(boolean);
method public static void setFileNameMap(java.net.FileNameMap);
method public void setIfModifiedSince(long);
method public void setReadTimeout(int);
- method public void setRequestProperty(java.lang.String, java.lang.String);
+ method public void setRequestProperty(String, String);
method public void setUseCaches(boolean);
field protected boolean allowUserInteraction;
field protected boolean connected;
@@ -61877,43 +62128,43 @@ package java.net {
public class URLDecoder {
ctor public URLDecoder();
- method public static deprecated java.lang.String decode(java.lang.String);
- method public static java.lang.String decode(java.lang.String, java.lang.String) throws java.io.UnsupportedEncodingException;
+ method @Deprecated public static String decode(String);
+ method public static String decode(String, String) throws java.io.UnsupportedEncodingException;
}
public class URLEncoder {
- method public static deprecated java.lang.String encode(java.lang.String);
- method public static java.lang.String encode(java.lang.String, java.lang.String) throws java.io.UnsupportedEncodingException;
+ method @Deprecated public static String encode(String);
+ method public static String encode(String, String) throws java.io.UnsupportedEncodingException;
}
public abstract class URLStreamHandler {
ctor public URLStreamHandler();
method protected boolean equals(java.net.URL, java.net.URL);
method protected int getDefaultPort();
- method protected synchronized java.net.InetAddress getHostAddress(java.net.URL);
+ method protected java.net.InetAddress getHostAddress(java.net.URL);
method protected int hashCode(java.net.URL);
method protected boolean hostsEqual(java.net.URL, java.net.URL);
method protected abstract java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
method protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy) throws java.io.IOException;
- method protected void parseURL(java.net.URL, java.lang.String, int, int);
+ method protected void parseURL(java.net.URL, String, int, int);
method protected boolean sameFile(java.net.URL, java.net.URL);
- method protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method protected deprecated void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
- method protected java.lang.String toExternalForm(java.net.URL);
+ method protected void setURL(java.net.URL, String, String, int, String, String, String, String, String);
+ method @Deprecated protected void setURL(java.net.URL, String, String, int, String, String);
+ method protected String toExternalForm(java.net.URL);
}
- public abstract interface URLStreamHandlerFactory {
- method public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String);
+ public interface URLStreamHandlerFactory {
+ method public java.net.URLStreamHandler createURLStreamHandler(String);
}
public class UnknownHostException extends java.io.IOException {
- ctor public UnknownHostException(java.lang.String);
+ ctor public UnknownHostException(String);
ctor public UnknownHostException();
}
public class UnknownServiceException extends java.io.IOException {
ctor public UnknownServiceException();
- ctor public UnknownServiceException(java.lang.String);
+ ctor public UnknownServiceException(String);
}
}
@@ -61921,7 +62172,7 @@ package java.net {
package java.nio {
public abstract class Buffer {
- method public abstract java.lang.Object array();
+ method public abstract Object array();
method public abstract int arrayOffset();
method public final int capacity();
method public final java.nio.Buffer clear();
@@ -61948,25 +62199,25 @@ package java.nio {
ctor public BufferUnderflowException();
}
- public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable {
- method public static java.nio.ByteBuffer allocate(int);
- method public static java.nio.ByteBuffer allocateDirect(int);
+ public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ByteBuffer> {
+ method @NonNull public static java.nio.ByteBuffer allocate(int);
+ method @NonNull public static java.nio.ByteBuffer allocateDirect(int);
method public final byte[] array();
method public final int arrayOffset();
- method public abstract java.nio.CharBuffer asCharBuffer();
- method public abstract java.nio.DoubleBuffer asDoubleBuffer();
- method public abstract java.nio.FloatBuffer asFloatBuffer();
- method public abstract java.nio.IntBuffer asIntBuffer();
- method public abstract java.nio.LongBuffer asLongBuffer();
- method public abstract java.nio.ByteBuffer asReadOnlyBuffer();
- method public abstract java.nio.ShortBuffer asShortBuffer();
- method public abstract java.nio.ByteBuffer compact();
- method public int compareTo(java.nio.ByteBuffer);
- method public abstract java.nio.ByteBuffer duplicate();
+ method @NonNull public abstract java.nio.CharBuffer asCharBuffer();
+ method @NonNull public abstract java.nio.DoubleBuffer asDoubleBuffer();
+ method @NonNull public abstract java.nio.FloatBuffer asFloatBuffer();
+ method @NonNull public abstract java.nio.IntBuffer asIntBuffer();
+ method @NonNull public abstract java.nio.LongBuffer asLongBuffer();
+ method @NonNull public abstract java.nio.ByteBuffer asReadOnlyBuffer();
+ method @NonNull public abstract java.nio.ShortBuffer asShortBuffer();
+ method @NonNull public abstract java.nio.ByteBuffer compact();
+ method public int compareTo(@NonNull java.nio.ByteBuffer);
+ method @NonNull public abstract java.nio.ByteBuffer duplicate();
method public abstract byte get();
method public abstract byte get(int);
- method public java.nio.ByteBuffer get(byte[], int, int);
- method public java.nio.ByteBuffer get(byte[]);
+ method @NonNull public java.nio.ByteBuffer get(byte[], int, int);
+ method @NonNull public java.nio.ByteBuffer get(byte[]);
method public abstract char getChar();
method public abstract char getChar(int);
method public abstract double getDouble();
@@ -61980,28 +62231,28 @@ package java.nio {
method public abstract short getShort();
method public abstract short getShort(int);
method public final boolean hasArray();
- method public final java.nio.ByteOrder order();
- method public final java.nio.ByteBuffer order(java.nio.ByteOrder);
- method public abstract java.nio.ByteBuffer put(byte);
- method public abstract java.nio.ByteBuffer put(int, byte);
- method public java.nio.ByteBuffer put(java.nio.ByteBuffer);
- method public java.nio.ByteBuffer put(byte[], int, int);
- method public final java.nio.ByteBuffer put(byte[]);
- method public abstract java.nio.ByteBuffer putChar(char);
- method public abstract java.nio.ByteBuffer putChar(int, char);
- method public abstract java.nio.ByteBuffer putDouble(double);
- method public abstract java.nio.ByteBuffer putDouble(int, double);
- method public abstract java.nio.ByteBuffer putFloat(float);
- method public abstract java.nio.ByteBuffer putFloat(int, float);
- method public abstract java.nio.ByteBuffer putInt(int);
- method public abstract java.nio.ByteBuffer putInt(int, int);
- method public abstract java.nio.ByteBuffer putLong(long);
- method public abstract java.nio.ByteBuffer putLong(int, long);
- method public abstract java.nio.ByteBuffer putShort(short);
- method public abstract java.nio.ByteBuffer putShort(int, short);
- method public abstract java.nio.ByteBuffer slice();
- method public static java.nio.ByteBuffer wrap(byte[], int, int);
- method public static java.nio.ByteBuffer wrap(byte[]);
+ method @NonNull public final java.nio.ByteOrder order();
+ method @NonNull public final java.nio.ByteBuffer order(@NonNull java.nio.ByteOrder);
+ method @NonNull public abstract java.nio.ByteBuffer put(byte);
+ method @NonNull public abstract java.nio.ByteBuffer put(int, byte);
+ method @NonNull public java.nio.ByteBuffer put(@NonNull java.nio.ByteBuffer);
+ method @NonNull public java.nio.ByteBuffer put(byte[], int, int);
+ method @NonNull public final java.nio.ByteBuffer put(byte[]);
+ method @NonNull public abstract java.nio.ByteBuffer putChar(char);
+ method @NonNull public abstract java.nio.ByteBuffer putChar(int, char);
+ method @NonNull public abstract java.nio.ByteBuffer putDouble(double);
+ method @NonNull public abstract java.nio.ByteBuffer putDouble(int, double);
+ method @NonNull public abstract java.nio.ByteBuffer putFloat(float);
+ method @NonNull public abstract java.nio.ByteBuffer putFloat(int, float);
+ method @NonNull public abstract java.nio.ByteBuffer putInt(int);
+ method @NonNull public abstract java.nio.ByteBuffer putInt(int, int);
+ method @NonNull public abstract java.nio.ByteBuffer putLong(long);
+ method @NonNull public abstract java.nio.ByteBuffer putLong(int, long);
+ method @NonNull public abstract java.nio.ByteBuffer putShort(short);
+ method @NonNull public abstract java.nio.ByteBuffer putShort(int, short);
+ method @NonNull public abstract java.nio.ByteBuffer slice();
+ method @NonNull public static java.nio.ByteBuffer wrap(byte[], int, int);
+ method @NonNull public static java.nio.ByteBuffer wrap(byte[]);
}
public final class ByteOrder {
@@ -62010,10 +62261,10 @@ package java.nio {
field public static final java.nio.ByteOrder LITTLE_ENDIAN;
}
- public abstract class CharBuffer extends java.nio.Buffer implements java.lang.Appendable java.lang.CharSequence java.lang.Comparable java.lang.Readable {
+ public abstract class CharBuffer extends java.nio.Buffer implements java.lang.Appendable java.lang.CharSequence java.lang.Comparable<java.nio.CharBuffer> java.lang.Readable {
method public static java.nio.CharBuffer allocate(int);
- method public java.nio.CharBuffer append(java.lang.CharSequence);
- method public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
+ method public java.nio.CharBuffer append(CharSequence);
+ method public java.nio.CharBuffer append(CharSequence, int, int);
method public java.nio.CharBuffer append(char);
method public final char[] array();
method public final int arrayOffset();
@@ -62034,18 +62285,18 @@ package java.nio {
method public java.nio.CharBuffer put(java.nio.CharBuffer);
method public java.nio.CharBuffer put(char[], int, int);
method public final java.nio.CharBuffer put(char[]);
- method public java.nio.CharBuffer put(java.lang.String, int, int);
- method public final java.nio.CharBuffer put(java.lang.String);
+ method public java.nio.CharBuffer put(String, int, int);
+ method public final java.nio.CharBuffer put(String);
method public int read(java.nio.CharBuffer) throws java.io.IOException;
method public abstract java.nio.CharBuffer slice();
method public abstract java.nio.CharBuffer subSequence(int, int);
method public static java.nio.CharBuffer wrap(char[], int, int);
method public static java.nio.CharBuffer wrap(char[]);
- method public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);
- method public static java.nio.CharBuffer wrap(java.lang.CharSequence);
+ method public static java.nio.CharBuffer wrap(CharSequence, int, int);
+ method public static java.nio.CharBuffer wrap(CharSequence);
}
- public abstract class DoubleBuffer extends java.nio.Buffer implements java.lang.Comparable {
+ public abstract class DoubleBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.DoubleBuffer> {
method public static java.nio.DoubleBuffer allocate(int);
method public final double[] array();
method public final int arrayOffset();
@@ -62069,7 +62320,7 @@ package java.nio {
method public static java.nio.DoubleBuffer wrap(double[]);
}
- public abstract class FloatBuffer extends java.nio.Buffer implements java.lang.Comparable {
+ public abstract class FloatBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.FloatBuffer> {
method public static java.nio.FloatBuffer allocate(int);
method public final float[] array();
method public final int arrayOffset();
@@ -62093,7 +62344,7 @@ package java.nio {
method public static java.nio.FloatBuffer wrap(float[]);
}
- public abstract class IntBuffer extends java.nio.Buffer implements java.lang.Comparable {
+ public abstract class IntBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.IntBuffer> {
method public static java.nio.IntBuffer allocate(int);
method public final int[] array();
method public final int arrayOffset();
@@ -62121,7 +62372,7 @@ package java.nio {
ctor public InvalidMarkException();
}
- public abstract class LongBuffer extends java.nio.Buffer implements java.lang.Comparable {
+ public abstract class LongBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.LongBuffer> {
method public static java.nio.LongBuffer allocate(int);
method public final long[] array();
method public final int arrayOffset();
@@ -62155,7 +62406,7 @@ package java.nio {
ctor public ReadOnlyBufferException();
}
- public abstract class ShortBuffer extends java.nio.Buffer implements java.lang.Comparable {
+ public abstract class ShortBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ShortBuffer> {
method public static java.nio.ShortBuffer allocate(int);
method public final short[] array();
method public final int arrayOffset();
@@ -62195,14 +62446,14 @@ package java.nio.channels {
ctor public AlreadyConnectedException();
}
- public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel {
- method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
- method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
+ public interface AsynchronousByteChannel extends java.nio.channels.AsynchronousChannel {
+ method public <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
+ method public <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
}
- public abstract interface AsynchronousChannel implements java.nio.channels.Channel {
+ public interface AsynchronousChannel extends java.nio.channels.Channel {
}
public abstract class AsynchronousChannelGroup {
@@ -62225,25 +62476,25 @@ package java.nio.channels {
public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel {
ctor protected AsynchronousFileChannel();
method public abstract void force(boolean) throws java.io.IOException;
- method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
- method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+ method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock,? super A>);
+ method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock,? super A>);
method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean);
method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock();
method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
- method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+ method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long);
method public abstract long size() throws java.io.IOException;
method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException;
method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException;
method public final java.nio.channels.FileLock tryLock() throws java.io.IOException;
- method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+ method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long);
}
public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel {
ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
- method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
+ method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel,? super A>);
method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept();
method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
@@ -62256,32 +62507,32 @@ package java.nio.channels {
public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel {
ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
- method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
+ method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void,? super A>);
method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress);
method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException;
method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException;
method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
- method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+ method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long,? super A>);
method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException;
method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException;
- method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
- method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+ method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer,? super A>);
+ method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long,? super A>);
}
- public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
+ public interface ByteChannel extends java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
}
public class CancelledKeyException extends java.lang.IllegalStateException {
ctor public CancelledKeyException();
}
- public abstract interface Channel implements java.io.Closeable {
- method public abstract boolean isOpen();
+ public interface Channel extends java.io.Closeable {
+ method public boolean isOpen();
}
public final class Channels {
@@ -62292,9 +62543,9 @@ package java.nio.channels {
method public static java.io.OutputStream newOutputStream(java.nio.channels.WritableByteChannel);
method public static java.io.OutputStream newOutputStream(java.nio.channels.AsynchronousByteChannel);
method public static java.io.Reader newReader(java.nio.channels.ReadableByteChannel, java.nio.charset.CharsetDecoder, int);
- method public static java.io.Reader newReader(java.nio.channels.ReadableByteChannel, java.lang.String);
+ method public static java.io.Reader newReader(java.nio.channels.ReadableByteChannel, String);
method public static java.io.Writer newWriter(java.nio.channels.WritableByteChannel, java.nio.charset.CharsetEncoder, int);
- method public static java.io.Writer newWriter(java.nio.channels.WritableByteChannel, java.lang.String);
+ method public static java.io.Writer newWriter(java.nio.channels.WritableByteChannel, String);
}
public class ClosedByInterruptException extends java.nio.channels.AsynchronousCloseException {
@@ -62309,9 +62560,9 @@ package java.nio.channels {
ctor public ClosedSelectorException();
}
- public abstract interface CompletionHandler<V, A> {
- method public abstract void completed(V, A);
- method public abstract void failed(java.lang.Throwable, A);
+ public interface CompletionHandler<V, A> {
+ method public void completed(V, A);
+ method public void failed(Throwable, A);
}
public class ConnectionPendingException extends java.lang.IllegalStateException {
@@ -62374,16 +62625,16 @@ package java.nio.channels {
method public final long position();
method public abstract void release() throws java.io.IOException;
method public final long size();
- method public final java.lang.String toString();
+ method public final String toString();
}
public class FileLockInterruptionException extends java.io.IOException {
ctor public FileLockInterruptionException();
}
- public abstract interface GatheringByteChannel implements java.nio.channels.WritableByteChannel {
- method public abstract long write(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
- method public abstract long write(java.nio.ByteBuffer[]) throws java.io.IOException;
+ public interface GatheringByteChannel extends java.nio.channels.WritableByteChannel {
+ method public long write(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
+ method public long write(java.nio.ByteBuffer[]) throws java.io.IOException;
}
public class IllegalBlockingModeException extends java.lang.IllegalStateException {
@@ -62402,7 +62653,7 @@ package java.nio.channels {
ctor public InterruptedByTimeoutException();
}
- public abstract interface InterruptibleChannel implements java.nio.channels.Channel {
+ public interface InterruptibleChannel extends java.nio.channels.Channel {
}
public abstract class MembershipKey {
@@ -62417,17 +62668,17 @@ package java.nio.channels {
method public abstract java.nio.channels.MembershipKey unblock(java.net.InetAddress);
}
- public abstract interface MulticastChannel implements java.nio.channels.NetworkChannel {
- method public abstract java.nio.channels.MembershipKey join(java.net.InetAddress, java.net.NetworkInterface) throws java.io.IOException;
- method public abstract java.nio.channels.MembershipKey join(java.net.InetAddress, java.net.NetworkInterface, java.net.InetAddress) throws java.io.IOException;
+ public interface MulticastChannel extends java.nio.channels.NetworkChannel {
+ method public java.nio.channels.MembershipKey join(java.net.InetAddress, java.net.NetworkInterface) throws java.io.IOException;
+ method public java.nio.channels.MembershipKey join(java.net.InetAddress, java.net.NetworkInterface, java.net.InetAddress) throws java.io.IOException;
}
- public abstract interface NetworkChannel implements java.nio.channels.Channel {
- method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException;
- method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
- method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException;
- method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
- method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions();
+ public interface NetworkChannel extends java.nio.channels.Channel {
+ method public java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException;
+ method public java.net.SocketAddress getLocalAddress() throws java.io.IOException;
+ method public <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException;
+ method public <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+ method public java.util.Set<java.net.SocketOption<?>> supportedOptions();
}
public class NoConnectionPendingException extends java.lang.IllegalStateException {
@@ -62461,12 +62712,12 @@ package java.nio.channels {
method public abstract java.nio.channels.Pipe.SourceChannel source();
}
- public static abstract class Pipe.SinkChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.GatheringByteChannel java.nio.channels.WritableByteChannel {
+ public abstract static class Pipe.SinkChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.GatheringByteChannel java.nio.channels.WritableByteChannel {
ctor protected Pipe.SinkChannel(java.nio.channels.spi.SelectorProvider);
method public final int validOps();
}
- public static abstract class Pipe.SourceChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.ScatteringByteChannel {
+ public abstract static class Pipe.SourceChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.ScatteringByteChannel {
ctor protected Pipe.SourceChannel(java.nio.channels.spi.SelectorProvider);
method public final int validOps();
}
@@ -62475,39 +62726,39 @@ package java.nio.channels {
ctor public ReadPendingException();
}
- public abstract interface ReadableByteChannel implements java.nio.channels.Channel {
- method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException;
+ public interface ReadableByteChannel extends java.nio.channels.Channel {
+ method public int read(java.nio.ByteBuffer) throws java.io.IOException;
}
- public abstract interface ScatteringByteChannel implements java.nio.channels.ReadableByteChannel {
- method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
- method public abstract long read(java.nio.ByteBuffer[]) throws java.io.IOException;
+ public interface ScatteringByteChannel extends java.nio.channels.ReadableByteChannel {
+ method public long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
+ method public long read(java.nio.ByteBuffer[]) throws java.io.IOException;
}
- public abstract interface SeekableByteChannel implements java.nio.channels.ByteChannel {
- method public abstract long position() throws java.io.IOException;
- method public abstract java.nio.channels.SeekableByteChannel position(long) throws java.io.IOException;
- method public abstract long size() throws java.io.IOException;
- method public abstract java.nio.channels.SeekableByteChannel truncate(long) throws java.io.IOException;
+ public interface SeekableByteChannel extends java.nio.channels.ByteChannel {
+ method public long position() throws java.io.IOException;
+ method public java.nio.channels.SeekableByteChannel position(long) throws java.io.IOException;
+ method public long size() throws java.io.IOException;
+ method public java.nio.channels.SeekableByteChannel truncate(long) throws java.io.IOException;
}
public abstract class SelectableChannel extends java.nio.channels.spi.AbstractInterruptibleChannel implements java.nio.channels.Channel {
ctor protected SelectableChannel();
- method public abstract java.lang.Object blockingLock();
+ method public abstract Object blockingLock();
method public abstract java.nio.channels.SelectableChannel configureBlocking(boolean) throws java.io.IOException;
method public abstract boolean isBlocking();
method public abstract boolean isRegistered();
method public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
method public abstract java.nio.channels.spi.SelectorProvider provider();
- method public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object) throws java.nio.channels.ClosedChannelException;
+ method public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, Object) throws java.nio.channels.ClosedChannelException;
method public final java.nio.channels.SelectionKey register(java.nio.channels.Selector, int) throws java.nio.channels.ClosedChannelException;
method public abstract int validOps();
}
public abstract class SelectionKey {
ctor protected SelectionKey();
- method public final java.lang.Object attach(java.lang.Object);
- method public final java.lang.Object attachment();
+ method public final Object attach(Object);
+ method public final Object attachment();
method public abstract void cancel();
method public abstract java.nio.channels.SelectableChannel channel();
method public abstract int interestOps();
@@ -62580,8 +62831,8 @@ package java.nio.channels {
ctor public UnsupportedAddressTypeException();
}
- public abstract interface WritableByteChannel implements java.nio.channels.Channel {
- method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException;
+ public interface WritableByteChannel extends java.nio.channels.Channel {
+ method public int write(java.nio.ByteBuffer) throws java.io.IOException;
}
public class WritePendingException extends java.lang.IllegalStateException {
@@ -62603,7 +62854,7 @@ package java.nio.channels.spi {
public abstract class AbstractSelectableChannel extends java.nio.channels.SelectableChannel {
ctor protected AbstractSelectableChannel(java.nio.channels.spi.SelectorProvider);
- method public final java.lang.Object blockingLock();
+ method public final Object blockingLock();
method public final java.nio.channels.SelectableChannel configureBlocking(boolean) throws java.io.IOException;
method protected final void implCloseChannel() throws java.io.IOException;
method protected abstract void implCloseSelectableChannel() throws java.io.IOException;
@@ -62612,7 +62863,7 @@ package java.nio.channels.spi {
method public final boolean isRegistered();
method public final java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
method public final java.nio.channels.spi.SelectorProvider provider();
- method public final java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object) throws java.nio.channels.ClosedChannelException;
+ method public final java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, Object) throws java.nio.channels.ClosedChannelException;
}
public abstract class AbstractSelectionKey extends java.nio.channels.SelectionKey {
@@ -62631,7 +62882,7 @@ package java.nio.channels.spi {
method protected abstract void implCloseSelector() throws java.io.IOException;
method public final boolean isOpen();
method public final java.nio.channels.spi.SelectorProvider provider();
- method protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, java.lang.Object);
+ method protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, Object);
}
public abstract class AsynchronousChannelProvider {
@@ -62663,28 +62914,28 @@ package java.nio.charset {
ctor public CharacterCodingException();
}
- public abstract class Charset implements java.lang.Comparable {
- ctor protected Charset(java.lang.String, java.lang.String[]);
+ public abstract class Charset implements java.lang.Comparable<java.nio.charset.Charset> {
+ ctor protected Charset(String, String[]);
method public final java.util.Set<java.lang.String> aliases();
- method public static java.util.SortedMap<java.lang.String, java.nio.charset.Charset> availableCharsets();
+ method public static java.util.SortedMap<java.lang.String,java.nio.charset.Charset> availableCharsets();
method public boolean canEncode();
method public final int compareTo(java.nio.charset.Charset);
method public abstract boolean contains(java.nio.charset.Charset);
method public final java.nio.CharBuffer decode(java.nio.ByteBuffer);
method public static java.nio.charset.Charset defaultCharset();
- method public java.lang.String displayName();
- method public java.lang.String displayName(java.util.Locale);
+ method public String displayName();
+ method public String displayName(java.util.Locale);
method public final java.nio.ByteBuffer encode(java.nio.CharBuffer);
- method public final java.nio.ByteBuffer encode(java.lang.String);
- method public final boolean equals(java.lang.Object);
- method public static java.nio.charset.Charset forName(java.lang.String);
+ method public final java.nio.ByteBuffer encode(String);
+ method public final boolean equals(Object);
+ method public static java.nio.charset.Charset forName(String);
method public final int hashCode();
method public final boolean isRegistered();
- method public static boolean isSupported(java.lang.String);
- method public final java.lang.String name();
+ method public static boolean isSupported(String);
+ method public final String name();
method public abstract java.nio.charset.CharsetDecoder newDecoder();
method public abstract java.nio.charset.CharsetEncoder newEncoder();
- method public final java.lang.String toString();
+ method public final String toString();
}
public abstract class CharsetDecoder {
@@ -62699,7 +62950,7 @@ package java.nio.charset {
method protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
method protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
method protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
- method protected void implReplaceWith(java.lang.String);
+ method protected void implReplaceWith(String);
method protected void implReset();
method public boolean isAutoDetecting();
method public boolean isCharsetDetected();
@@ -62707,8 +62958,8 @@ package java.nio.charset {
method public final float maxCharsPerByte();
method public final java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
method public final java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
- method public final java.nio.charset.CharsetDecoder replaceWith(java.lang.String);
- method public final java.lang.String replacement();
+ method public final java.nio.charset.CharsetDecoder replaceWith(String);
+ method public final String replacement();
method public final java.nio.charset.CharsetDecoder reset();
method public java.nio.charset.CodingErrorAction unmappableCharacterAction();
}
@@ -62718,7 +62969,7 @@ package java.nio.charset {
ctor protected CharsetEncoder(java.nio.charset.Charset, float, float);
method public final float averageBytesPerChar();
method public boolean canEncode(char);
- method public boolean canEncode(java.lang.CharSequence);
+ method public boolean canEncode(CharSequence);
method public final java.nio.charset.Charset charset();
method public final java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
method public final java.nio.ByteBuffer encode(java.nio.CharBuffer) throws java.nio.charset.CharacterCodingException;
@@ -62741,7 +62992,7 @@ package java.nio.charset {
}
public class CoderMalfunctionError extends java.lang.Error {
- ctor public CoderMalfunctionError(java.lang.Exception);
+ ctor public CoderMalfunctionError(Exception);
}
public class CoderResult {
@@ -62765,8 +63016,8 @@ package java.nio.charset {
}
public class IllegalCharsetNameException extends java.lang.IllegalArgumentException {
- ctor public IllegalCharsetNameException(java.lang.String);
- method public java.lang.String getCharsetName();
+ ctor public IllegalCharsetNameException(String);
+ method public String getCharsetName();
}
public class MalformedInputException extends java.nio.charset.CharacterCodingException {
@@ -62789,8 +63040,8 @@ package java.nio.charset {
}
public class UnsupportedCharsetException extends java.lang.IllegalArgumentException {
- ctor public UnsupportedCharsetException(java.lang.String);
- method public java.lang.String getCharsetName();
+ ctor public UnsupportedCharsetException(String);
+ method public String getCharsetName();
}
}
@@ -62799,7 +63050,7 @@ package java.nio.charset.spi {
public abstract class CharsetProvider {
ctor protected CharsetProvider();
- method public abstract java.nio.charset.Charset charsetForName(java.lang.String);
+ method public abstract java.nio.charset.Charset charsetForName(String);
method public abstract java.util.Iterator<java.nio.charset.Charset> charsets();
}
@@ -62808,20 +63059,18 @@ package java.nio.charset.spi {
package java.nio.file {
public class AccessDeniedException extends java.nio.file.FileSystemException {
- ctor public AccessDeniedException(java.lang.String);
- ctor public AccessDeniedException(java.lang.String, java.lang.String, java.lang.String);
+ ctor public AccessDeniedException(String);
+ ctor public AccessDeniedException(String, String, String);
}
- public final class AccessMode extends java.lang.Enum {
- method public static java.nio.file.AccessMode valueOf(java.lang.String);
- method public static final java.nio.file.AccessMode[] values();
+ public enum AccessMode {
enum_constant public static final java.nio.file.AccessMode EXECUTE;
enum_constant public static final java.nio.file.AccessMode READ;
enum_constant public static final java.nio.file.AccessMode WRITE;
}
public class AtomicMoveNotSupportedException extends java.nio.file.FileSystemException {
- ctor public AtomicMoveNotSupportedException(java.lang.String, java.lang.String, java.lang.String);
+ ctor public AtomicMoveNotSupportedException(String, String, String);
}
public class ClosedDirectoryStreamException extends java.lang.IllegalStateException {
@@ -62836,7 +63085,7 @@ package java.nio.file {
ctor public ClosedWatchServiceException();
}
- public abstract interface CopyOption {
+ public interface CopyOption {
}
public final class DirectoryIteratorException extends java.util.ConcurrentModificationException {
@@ -62845,42 +63094,42 @@ package java.nio.file {
}
public class DirectoryNotEmptyException extends java.nio.file.FileSystemException {
- ctor public DirectoryNotEmptyException(java.lang.String);
+ ctor public DirectoryNotEmptyException(String);
}
- public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable {
+ public interface DirectoryStream<T> extends java.io.Closeable java.lang.Iterable<T> {
}
- public static abstract interface DirectoryStream.Filter<T> {
- method public abstract boolean accept(T) throws java.io.IOException;
+ @java.lang.FunctionalInterface public static interface DirectoryStream.Filter<T> {
+ method public boolean accept(T) throws java.io.IOException;
}
public class FileAlreadyExistsException extends java.nio.file.FileSystemException {
- ctor public FileAlreadyExistsException(java.lang.String);
- ctor public FileAlreadyExistsException(java.lang.String, java.lang.String, java.lang.String);
+ ctor public FileAlreadyExistsException(String);
+ ctor public FileAlreadyExistsException(String, String, String);
}
public abstract class FileStore {
ctor protected FileStore();
- method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException;
- method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>);
+ method public abstract Object getAttribute(String) throws java.io.IOException;
+ method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(Class<V>);
method public abstract long getTotalSpace() throws java.io.IOException;
method public abstract long getUnallocatedSpace() throws java.io.IOException;
method public abstract long getUsableSpace() throws java.io.IOException;
method public abstract boolean isReadOnly();
- method public abstract java.lang.String name();
- method public abstract boolean supportsFileAttributeView(java.lang.Class<? extends java.nio.file.attribute.FileAttributeView>);
- method public abstract boolean supportsFileAttributeView(java.lang.String);
- method public abstract java.lang.String type();
+ method public abstract String name();
+ method public abstract boolean supportsFileAttributeView(Class<? extends java.nio.file.attribute.FileAttributeView>);
+ method public abstract boolean supportsFileAttributeView(String);
+ method public abstract String type();
}
public abstract class FileSystem implements java.io.Closeable {
ctor protected FileSystem();
- method public abstract java.lang.Iterable<java.nio.file.FileStore> getFileStores();
- method public abstract java.nio.file.Path getPath(java.lang.String, java.lang.String...);
- method public abstract java.nio.file.PathMatcher getPathMatcher(java.lang.String);
- method public abstract java.lang.Iterable<java.nio.file.Path> getRootDirectories();
- method public abstract java.lang.String getSeparator();
+ method public abstract Iterable<java.nio.file.FileStore> getFileStores();
+ method public abstract java.nio.file.Path getPath(String, java.lang.String...);
+ method public abstract java.nio.file.PathMatcher getPathMatcher(String);
+ method public abstract Iterable<java.nio.file.Path> getRootDirectories();
+ method public abstract String getSeparator();
method public abstract java.nio.file.attribute.UserPrincipalLookupService getUserPrincipalLookupService();
method public abstract boolean isOpen();
method public abstract boolean isReadOnly();
@@ -62891,54 +63140,50 @@ package java.nio.file {
public class FileSystemAlreadyExistsException extends java.lang.RuntimeException {
ctor public FileSystemAlreadyExistsException();
- ctor public FileSystemAlreadyExistsException(java.lang.String);
+ ctor public FileSystemAlreadyExistsException(String);
}
public class FileSystemException extends java.io.IOException {
- ctor public FileSystemException(java.lang.String);
- ctor public FileSystemException(java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String getFile();
- method public java.lang.String getOtherFile();
- method public java.lang.String getReason();
+ ctor public FileSystemException(String);
+ ctor public FileSystemException(String, String, String);
+ method public String getFile();
+ method public String getOtherFile();
+ method public String getReason();
}
public class FileSystemLoopException extends java.nio.file.FileSystemException {
- ctor public FileSystemLoopException(java.lang.String);
+ ctor public FileSystemLoopException(String);
}
public class FileSystemNotFoundException extends java.lang.RuntimeException {
ctor public FileSystemNotFoundException();
- ctor public FileSystemNotFoundException(java.lang.String);
+ ctor public FileSystemNotFoundException(String);
}
public final class FileSystems {
method public static java.nio.file.FileSystem getDefault();
method public static java.nio.file.FileSystem getFileSystem(java.net.URI);
- method public static java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
- method public static java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String, ?>, java.lang.ClassLoader) throws java.io.IOException;
- method public static java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.lang.ClassLoader) throws java.io.IOException;
+ method public static java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String,?>) throws java.io.IOException;
+ method public static java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String,?>, ClassLoader) throws java.io.IOException;
+ method public static java.nio.file.FileSystem newFileSystem(java.nio.file.Path, ClassLoader) throws java.io.IOException;
}
- public final class FileVisitOption extends java.lang.Enum {
- method public static java.nio.file.FileVisitOption valueOf(java.lang.String);
- method public static final java.nio.file.FileVisitOption[] values();
+ public enum FileVisitOption {
enum_constant public static final java.nio.file.FileVisitOption FOLLOW_LINKS;
}
- public final class FileVisitResult extends java.lang.Enum {
- method public static java.nio.file.FileVisitResult valueOf(java.lang.String);
- method public static final java.nio.file.FileVisitResult[] values();
+ public enum FileVisitResult {
enum_constant public static final java.nio.file.FileVisitResult CONTINUE;
enum_constant public static final java.nio.file.FileVisitResult SKIP_SIBLINGS;
enum_constant public static final java.nio.file.FileVisitResult SKIP_SUBTREE;
enum_constant public static final java.nio.file.FileVisitResult TERMINATE;
}
- public abstract interface FileVisitor<T> {
- method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
- method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
- method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
- method public abstract java.nio.file.FileVisitResult visitFileFailed(T, java.io.IOException) throws java.io.IOException;
+ public interface FileVisitor<T> {
+ method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
+ method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
+ method public java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
+ method public java.nio.file.FileVisitResult visitFileFailed(T, java.io.IOException) throws java.io.IOException;
}
public final class Files {
@@ -62950,16 +63195,16 @@ package java.nio.file {
method public static java.nio.file.Path createFile(java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public static java.nio.file.Path createLink(java.nio.file.Path, java.nio.file.Path) throws java.io.IOException;
method public static java.nio.file.Path createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public static java.nio.file.Path createTempDirectory(java.nio.file.Path, java.lang.String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public static java.nio.file.Path createTempDirectory(java.lang.String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public static java.nio.file.Path createTempFile(java.nio.file.Path, java.lang.String, java.lang.String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public static java.nio.file.Path createTempFile(java.lang.String, java.lang.String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
+ method public static java.nio.file.Path createTempDirectory(java.nio.file.Path, String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
+ method public static java.nio.file.Path createTempDirectory(String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
+ method public static java.nio.file.Path createTempFile(java.nio.file.Path, String, String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
+ method public static java.nio.file.Path createTempFile(String, String, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public static void delete(java.nio.file.Path) throws java.io.IOException;
method public static boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException;
method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...);
- method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException;
- method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
- method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+ method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path,java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException;
+ method public static Object getAttribute(java.nio.file.Path, String, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, Class<V>, java.nio.file.LinkOption...);
method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -62983,19 +63228,19 @@ package java.nio.file {
method public static java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public static java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
method public static java.nio.file.DirectoryStream<java.nio.file.Path> newDirectoryStream(java.nio.file.Path) throws java.io.IOException;
- method public static java.nio.file.DirectoryStream<java.nio.file.Path> newDirectoryStream(java.nio.file.Path, java.lang.String) throws java.io.IOException;
+ method public static java.nio.file.DirectoryStream<java.nio.file.Path> newDirectoryStream(java.nio.file.Path, String) throws java.io.IOException;
method public static java.nio.file.DirectoryStream<java.nio.file.Path> newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream.Filter<? super java.nio.file.Path>) throws java.io.IOException;
method public static java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
method public static java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
method public static boolean notExists(java.nio.file.Path, java.nio.file.LinkOption...);
- method public static java.lang.String probeContentType(java.nio.file.Path) throws java.io.IOException;
+ method public static String probeContentType(java.nio.file.Path) throws java.io.IOException;
method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException;
method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException;
method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException;
- method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
- method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public static java.util.Map<java.lang.String,java.lang.Object> readAttributes(java.nio.file.Path, String, java.nio.file.LinkOption...) throws java.io.IOException;
method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
- method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public static java.nio.file.Path setAttribute(java.nio.file.Path, String, Object, java.nio.file.LinkOption...) throws java.io.IOException;
method public static java.nio.file.Path setLastModifiedTime(java.nio.file.Path, java.nio.file.attribute.FileTime) throws java.io.IOException;
method public static java.nio.file.Path setOwner(java.nio.file.Path, java.nio.file.attribute.UserPrincipal) throws java.io.IOException;
method public static java.nio.file.Path setPosixFilePermissions(java.nio.file.Path, java.util.Set<java.nio.file.attribute.PosixFilePermission>) throws java.io.IOException;
@@ -63005,110 +63250,108 @@ package java.nio.file {
method public static java.nio.file.Path walkFileTree(java.nio.file.Path, java.util.Set<java.nio.file.FileVisitOption>, int, java.nio.file.FileVisitor<? super java.nio.file.Path>) throws java.io.IOException;
method public static java.nio.file.Path walkFileTree(java.nio.file.Path, java.nio.file.FileVisitor<? super java.nio.file.Path>) throws java.io.IOException;
method public static java.nio.file.Path write(java.nio.file.Path, byte[], java.nio.file.OpenOption...) throws java.io.IOException;
- method public static java.nio.file.Path write(java.nio.file.Path, java.lang.Iterable<? extends java.lang.CharSequence>, java.nio.charset.Charset, java.nio.file.OpenOption...) throws java.io.IOException;
- method public static java.nio.file.Path write(java.nio.file.Path, java.lang.Iterable<? extends java.lang.CharSequence>, java.nio.file.OpenOption...) throws java.io.IOException;
+ method public static java.nio.file.Path write(java.nio.file.Path, Iterable<? extends java.lang.CharSequence>, java.nio.charset.Charset, java.nio.file.OpenOption...) throws java.io.IOException;
+ method public static java.nio.file.Path write(java.nio.file.Path, Iterable<? extends java.lang.CharSequence>, java.nio.file.OpenOption...) throws java.io.IOException;
}
public class InvalidPathException extends java.lang.IllegalArgumentException {
- ctor public InvalidPathException(java.lang.String, java.lang.String, int);
- ctor public InvalidPathException(java.lang.String, java.lang.String);
+ ctor public InvalidPathException(String, String, int);
+ ctor public InvalidPathException(String, String);
method public int getIndex();
- method public java.lang.String getInput();
- method public java.lang.String getReason();
+ method public String getInput();
+ method public String getReason();
}
- public final class LinkOption extends java.lang.Enum implements java.nio.file.CopyOption java.nio.file.OpenOption {
- method public static java.nio.file.LinkOption valueOf(java.lang.String);
- method public static final java.nio.file.LinkOption[] values();
+ public enum LinkOption implements java.nio.file.CopyOption java.nio.file.OpenOption {
enum_constant public static final java.nio.file.LinkOption NOFOLLOW_LINKS;
}
public final class LinkPermission extends java.security.BasicPermission {
- ctor public LinkPermission(java.lang.String);
- ctor public LinkPermission(java.lang.String, java.lang.String);
+ ctor public LinkPermission(String);
+ ctor public LinkPermission(String, String);
}
public class NoSuchFileException extends java.nio.file.FileSystemException {
- ctor public NoSuchFileException(java.lang.String);
- ctor public NoSuchFileException(java.lang.String, java.lang.String, java.lang.String);
+ ctor public NoSuchFileException(String);
+ ctor public NoSuchFileException(String, String, String);
}
public class NotDirectoryException extends java.nio.file.FileSystemException {
- ctor public NotDirectoryException(java.lang.String);
+ ctor public NotDirectoryException(String);
}
public class NotLinkException extends java.nio.file.FileSystemException {
- ctor public NotLinkException(java.lang.String);
- ctor public NotLinkException(java.lang.String, java.lang.String, java.lang.String);
+ ctor public NotLinkException(String);
+ ctor public NotLinkException(String, String, String);
}
- public abstract interface OpenOption {
+ public interface OpenOption {
}
- public abstract interface Path implements java.lang.Comparable java.lang.Iterable java.nio.file.Watchable {
- method public abstract int compareTo(java.nio.file.Path);
- method public abstract boolean endsWith(java.nio.file.Path);
- method public abstract boolean endsWith(java.lang.String);
- method public abstract boolean equals(java.lang.Object);
- method public abstract java.nio.file.Path getFileName();
- method public abstract java.nio.file.FileSystem getFileSystem();
- method public abstract java.nio.file.Path getName(int);
- method public abstract int getNameCount();
- method public abstract java.nio.file.Path getParent();
- method public abstract java.nio.file.Path getRoot();
- method public abstract int hashCode();
- method public abstract boolean isAbsolute();
- method public abstract java.util.Iterator<java.nio.file.Path> iterator();
- method public abstract java.nio.file.Path normalize();
- method public abstract java.nio.file.Path relativize(java.nio.file.Path);
- method public abstract java.nio.file.Path resolve(java.nio.file.Path);
- method public abstract java.nio.file.Path resolve(java.lang.String);
- method public abstract java.nio.file.Path resolveSibling(java.nio.file.Path);
- method public abstract java.nio.file.Path resolveSibling(java.lang.String);
- method public abstract boolean startsWith(java.nio.file.Path);
- method public abstract boolean startsWith(java.lang.String);
- method public abstract java.nio.file.Path subpath(int, int);
- method public abstract java.nio.file.Path toAbsolutePath();
- method public abstract java.io.File toFile();
- method public abstract java.nio.file.Path toRealPath(java.nio.file.LinkOption...) throws java.io.IOException;
- method public abstract java.lang.String toString();
- method public abstract java.net.URI toUri();
- }
-
- public abstract interface PathMatcher {
- method public abstract boolean matches(java.nio.file.Path);
+ public interface Path extends java.lang.Comparable<java.nio.file.Path> java.lang.Iterable<java.nio.file.Path> java.nio.file.Watchable {
+ method public int compareTo(java.nio.file.Path);
+ method public boolean endsWith(java.nio.file.Path);
+ method public boolean endsWith(String);
+ method public boolean equals(Object);
+ method public java.nio.file.Path getFileName();
+ method public java.nio.file.FileSystem getFileSystem();
+ method public java.nio.file.Path getName(int);
+ method public int getNameCount();
+ method public java.nio.file.Path getParent();
+ method public java.nio.file.Path getRoot();
+ method public int hashCode();
+ method public boolean isAbsolute();
+ method public java.util.Iterator<java.nio.file.Path> iterator();
+ method public java.nio.file.Path normalize();
+ method public java.nio.file.Path relativize(java.nio.file.Path);
+ method public java.nio.file.Path resolve(java.nio.file.Path);
+ method public java.nio.file.Path resolve(String);
+ method public java.nio.file.Path resolveSibling(java.nio.file.Path);
+ method public java.nio.file.Path resolveSibling(String);
+ method public boolean startsWith(java.nio.file.Path);
+ method public boolean startsWith(String);
+ method public java.nio.file.Path subpath(int, int);
+ method public java.nio.file.Path toAbsolutePath();
+ method public java.io.File toFile();
+ method public java.nio.file.Path toRealPath(java.nio.file.LinkOption...) throws java.io.IOException;
+ method public String toString();
+ method public java.net.URI toUri();
+ }
+
+ @java.lang.FunctionalInterface public interface PathMatcher {
+ method public boolean matches(java.nio.file.Path);
}
public final class Paths {
- method public static java.nio.file.Path get(java.lang.String, java.lang.String...);
+ method public static java.nio.file.Path get(String, java.lang.String...);
method public static java.nio.file.Path get(java.net.URI);
}
public class ProviderMismatchException extends java.lang.IllegalArgumentException {
ctor public ProviderMismatchException();
- ctor public ProviderMismatchException(java.lang.String);
+ ctor public ProviderMismatchException(String);
}
public class ProviderNotFoundException extends java.lang.RuntimeException {
ctor public ProviderNotFoundException();
- ctor public ProviderNotFoundException(java.lang.String);
+ ctor public ProviderNotFoundException(String);
}
public class ReadOnlyFileSystemException extends java.lang.UnsupportedOperationException {
ctor public ReadOnlyFileSystemException();
}
- public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream {
- method public abstract void deleteDirectory(T) throws java.io.IOException;
- method public abstract void deleteFile(T) throws java.io.IOException;
- method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>);
- method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
- method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException;
- method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException;
+ public interface SecureDirectoryStream<T> extends java.nio.file.DirectoryStream<T> {
+ method public void deleteDirectory(T) throws java.io.IOException;
+ method public void deleteFile(T) throws java.io.IOException;
+ method public <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(Class<V>);
+ method public <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, Class<V>, java.nio.file.LinkOption...);
+ method public void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException;
+ method public java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
+ method public java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException;
}
- public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor {
+ public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor<T> {
ctor protected SimpleFileVisitor();
method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -63116,17 +63359,13 @@ package java.nio.file {
method public java.nio.file.FileVisitResult visitFileFailed(T, java.io.IOException) throws java.io.IOException;
}
- public final class StandardCopyOption extends java.lang.Enum implements java.nio.file.CopyOption {
- method public static java.nio.file.StandardCopyOption valueOf(java.lang.String);
- method public static final java.nio.file.StandardCopyOption[] values();
+ public enum StandardCopyOption implements java.nio.file.CopyOption {
enum_constant public static final java.nio.file.StandardCopyOption ATOMIC_MOVE;
enum_constant public static final java.nio.file.StandardCopyOption COPY_ATTRIBUTES;
enum_constant public static final java.nio.file.StandardCopyOption REPLACE_EXISTING;
}
- public final class StandardOpenOption extends java.lang.Enum implements java.nio.file.OpenOption {
- method public static java.nio.file.StandardOpenOption valueOf(java.lang.String);
- method public static final java.nio.file.StandardOpenOption[] values();
+ public enum StandardOpenOption implements java.nio.file.OpenOption {
enum_constant public static final java.nio.file.StandardOpenOption APPEND;
enum_constant public static final java.nio.file.StandardOpenOption CREATE;
enum_constant public static final java.nio.file.StandardOpenOption CREATE_NEW;
@@ -63146,38 +63385,38 @@ package java.nio.file {
field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW;
}
- public abstract interface WatchEvent<T> {
- method public abstract T context();
- method public abstract int count();
- method public abstract java.nio.file.WatchEvent.Kind<T> kind();
+ public interface WatchEvent<T> {
+ method public T context();
+ method public int count();
+ method public java.nio.file.WatchEvent.Kind<T> kind();
}
- public static abstract interface WatchEvent.Kind<T> {
- method public abstract java.lang.String name();
- method public abstract java.lang.Class<T> type();
+ public static interface WatchEvent.Kind<T> {
+ method public String name();
+ method public Class<T> type();
}
- public static abstract interface WatchEvent.Modifier {
- method public abstract java.lang.String name();
+ public static interface WatchEvent.Modifier {
+ method public String name();
}
- public abstract interface WatchKey {
- method public abstract void cancel();
- method public abstract boolean isValid();
- method public abstract java.util.List<java.nio.file.WatchEvent<?>> pollEvents();
- method public abstract boolean reset();
- method public abstract java.nio.file.Watchable watchable();
+ public interface WatchKey {
+ method public void cancel();
+ method public boolean isValid();
+ method public java.util.List<java.nio.file.WatchEvent<?>> pollEvents();
+ method public boolean reset();
+ method public java.nio.file.Watchable watchable();
}
- public abstract interface WatchService implements java.io.Closeable {
- method public abstract java.nio.file.WatchKey poll();
- method public abstract java.nio.file.WatchKey poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract java.nio.file.WatchKey take() throws java.lang.InterruptedException;
+ public interface WatchService extends java.io.Closeable {
+ method public java.nio.file.WatchKey poll();
+ method public java.nio.file.WatchKey poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public java.nio.file.WatchKey take() throws java.lang.InterruptedException;
}
- public abstract interface Watchable {
- method public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent.Kind<?>[], java.nio.file.WatchEvent.Modifier...) throws java.io.IOException;
- method public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent.Kind<?>...) throws java.io.IOException;
+ public interface Watchable {
+ method public java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent.Kind<?>[], java.nio.file.WatchEvent.Modifier...) throws java.io.IOException;
+ method public java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent.Kind<?>...) throws java.io.IOException;
}
}
@@ -63203,18 +63442,14 @@ package java.nio.file.attribute {
method public java.nio.file.attribute.AclEntry.Builder setType(java.nio.file.attribute.AclEntryType);
}
- public final class AclEntryFlag extends java.lang.Enum {
- method public static java.nio.file.attribute.AclEntryFlag valueOf(java.lang.String);
- method public static final java.nio.file.attribute.AclEntryFlag[] values();
+ public enum AclEntryFlag {
enum_constant public static final java.nio.file.attribute.AclEntryFlag DIRECTORY_INHERIT;
enum_constant public static final java.nio.file.attribute.AclEntryFlag FILE_INHERIT;
enum_constant public static final java.nio.file.attribute.AclEntryFlag INHERIT_ONLY;
enum_constant public static final java.nio.file.attribute.AclEntryFlag NO_PROPAGATE_INHERIT;
}
- public final class AclEntryPermission extends java.lang.Enum {
- method public static java.nio.file.attribute.AclEntryPermission valueOf(java.lang.String);
- method public static final java.nio.file.attribute.AclEntryPermission[] values();
+ public enum AclEntryPermission {
enum_constant public static final java.nio.file.attribute.AclEntryPermission APPEND_DATA;
enum_constant public static final java.nio.file.attribute.AclEntryPermission DELETE;
enum_constant public static final java.nio.file.attribute.AclEntryPermission DELETE_CHILD;
@@ -63234,73 +63469,71 @@ package java.nio.file.attribute {
field public static final java.nio.file.attribute.AclEntryPermission LIST_DIRECTORY;
}
- public final class AclEntryType extends java.lang.Enum {
- method public static java.nio.file.attribute.AclEntryType valueOf(java.lang.String);
- method public static final java.nio.file.attribute.AclEntryType[] values();
+ public enum AclEntryType {
enum_constant public static final java.nio.file.attribute.AclEntryType ALARM;
enum_constant public static final java.nio.file.attribute.AclEntryType ALLOW;
enum_constant public static final java.nio.file.attribute.AclEntryType AUDIT;
enum_constant public static final java.nio.file.attribute.AclEntryType DENY;
}
- public abstract interface AclFileAttributeView implements java.nio.file.attribute.FileOwnerAttributeView {
- method public abstract java.util.List<java.nio.file.attribute.AclEntry> getAcl() throws java.io.IOException;
- method public abstract void setAcl(java.util.List<java.nio.file.attribute.AclEntry>) throws java.io.IOException;
+ public interface AclFileAttributeView extends java.nio.file.attribute.FileOwnerAttributeView {
+ method public java.util.List<java.nio.file.attribute.AclEntry> getAcl() throws java.io.IOException;
+ method public void setAcl(java.util.List<java.nio.file.attribute.AclEntry>) throws java.io.IOException;
}
- public abstract interface AttributeView {
- method public abstract java.lang.String name();
+ public interface AttributeView {
+ method public String name();
}
- public abstract interface BasicFileAttributeView implements java.nio.file.attribute.FileAttributeView {
- method public abstract java.nio.file.attribute.BasicFileAttributes readAttributes() throws java.io.IOException;
- method public abstract void setTimes(java.nio.file.attribute.FileTime, java.nio.file.attribute.FileTime, java.nio.file.attribute.FileTime) throws java.io.IOException;
+ public interface BasicFileAttributeView extends java.nio.file.attribute.FileAttributeView {
+ method public java.nio.file.attribute.BasicFileAttributes readAttributes() throws java.io.IOException;
+ method public void setTimes(java.nio.file.attribute.FileTime, java.nio.file.attribute.FileTime, java.nio.file.attribute.FileTime) throws java.io.IOException;
}
- public abstract interface BasicFileAttributes {
- method public abstract java.nio.file.attribute.FileTime creationTime();
- method public abstract java.lang.Object fileKey();
- method public abstract boolean isDirectory();
- method public abstract boolean isOther();
- method public abstract boolean isRegularFile();
- method public abstract boolean isSymbolicLink();
- method public abstract java.nio.file.attribute.FileTime lastAccessTime();
- method public abstract java.nio.file.attribute.FileTime lastModifiedTime();
- method public abstract long size();
+ public interface BasicFileAttributes {
+ method public java.nio.file.attribute.FileTime creationTime();
+ method public Object fileKey();
+ method public boolean isDirectory();
+ method public boolean isOther();
+ method public boolean isRegularFile();
+ method public boolean isSymbolicLink();
+ method public java.nio.file.attribute.FileTime lastAccessTime();
+ method public java.nio.file.attribute.FileTime lastModifiedTime();
+ method public long size();
}
- public abstract interface DosFileAttributeView implements java.nio.file.attribute.BasicFileAttributeView {
- method public abstract java.nio.file.attribute.DosFileAttributes readAttributes() throws java.io.IOException;
- method public abstract void setArchive(boolean) throws java.io.IOException;
- method public abstract void setHidden(boolean) throws java.io.IOException;
- method public abstract void setReadOnly(boolean) throws java.io.IOException;
- method public abstract void setSystem(boolean) throws java.io.IOException;
+ public interface DosFileAttributeView extends java.nio.file.attribute.BasicFileAttributeView {
+ method public java.nio.file.attribute.DosFileAttributes readAttributes() throws java.io.IOException;
+ method public void setArchive(boolean) throws java.io.IOException;
+ method public void setHidden(boolean) throws java.io.IOException;
+ method public void setReadOnly(boolean) throws java.io.IOException;
+ method public void setSystem(boolean) throws java.io.IOException;
}
- public abstract interface DosFileAttributes implements java.nio.file.attribute.BasicFileAttributes {
- method public abstract boolean isArchive();
- method public abstract boolean isHidden();
- method public abstract boolean isReadOnly();
- method public abstract boolean isSystem();
+ public interface DosFileAttributes extends java.nio.file.attribute.BasicFileAttributes {
+ method public boolean isArchive();
+ method public boolean isHidden();
+ method public boolean isReadOnly();
+ method public boolean isSystem();
}
- public abstract interface FileAttribute<T> {
- method public abstract java.lang.String name();
- method public abstract T value();
+ public interface FileAttribute<T> {
+ method public String name();
+ method public T value();
}
- public abstract interface FileAttributeView implements java.nio.file.attribute.AttributeView {
+ public interface FileAttributeView extends java.nio.file.attribute.AttributeView {
}
- public abstract interface FileOwnerAttributeView implements java.nio.file.attribute.FileAttributeView {
- method public abstract java.nio.file.attribute.UserPrincipal getOwner() throws java.io.IOException;
- method public abstract void setOwner(java.nio.file.attribute.UserPrincipal) throws java.io.IOException;
+ public interface FileOwnerAttributeView extends java.nio.file.attribute.FileAttributeView {
+ method public java.nio.file.attribute.UserPrincipal getOwner() throws java.io.IOException;
+ method public void setOwner(java.nio.file.attribute.UserPrincipal) throws java.io.IOException;
}
- public abstract interface FileStoreAttributeView implements java.nio.file.attribute.AttributeView {
+ public interface FileStoreAttributeView extends java.nio.file.attribute.AttributeView {
}
- public final class FileTime implements java.lang.Comparable {
+ public final class FileTime implements java.lang.Comparable<java.nio.file.attribute.FileTime> {
method public int compareTo(java.nio.file.attribute.FileTime);
method public static java.nio.file.attribute.FileTime from(long, java.util.concurrent.TimeUnit);
method public static java.nio.file.attribute.FileTime from(java.time.Instant);
@@ -63310,24 +63543,22 @@ package java.nio.file.attribute {
method public long toMillis();
}
- public abstract interface GroupPrincipal implements java.nio.file.attribute.UserPrincipal {
+ public interface GroupPrincipal extends java.nio.file.attribute.UserPrincipal {
}
- public abstract interface PosixFileAttributeView implements java.nio.file.attribute.BasicFileAttributeView java.nio.file.attribute.FileOwnerAttributeView {
- method public abstract java.nio.file.attribute.PosixFileAttributes readAttributes() throws java.io.IOException;
- method public abstract void setGroup(java.nio.file.attribute.GroupPrincipal) throws java.io.IOException;
- method public abstract void setPermissions(java.util.Set<java.nio.file.attribute.PosixFilePermission>) throws java.io.IOException;
+ public interface PosixFileAttributeView extends java.nio.file.attribute.BasicFileAttributeView java.nio.file.attribute.FileOwnerAttributeView {
+ method public java.nio.file.attribute.PosixFileAttributes readAttributes() throws java.io.IOException;
+ method public void setGroup(java.nio.file.attribute.GroupPrincipal) throws java.io.IOException;
+ method public void setPermissions(java.util.Set<java.nio.file.attribute.PosixFilePermission>) throws java.io.IOException;
}
- public abstract interface PosixFileAttributes implements java.nio.file.attribute.BasicFileAttributes {
- method public abstract java.nio.file.attribute.GroupPrincipal group();
- method public abstract java.nio.file.attribute.UserPrincipal owner();
- method public abstract java.util.Set<java.nio.file.attribute.PosixFilePermission> permissions();
+ public interface PosixFileAttributes extends java.nio.file.attribute.BasicFileAttributes {
+ method public java.nio.file.attribute.GroupPrincipal group();
+ method public java.nio.file.attribute.UserPrincipal owner();
+ method public java.util.Set<java.nio.file.attribute.PosixFilePermission> permissions();
}
- public final class PosixFilePermission extends java.lang.Enum {
- method public static java.nio.file.attribute.PosixFilePermission valueOf(java.lang.String);
- method public static final java.nio.file.attribute.PosixFilePermission[] values();
+ public enum PosixFilePermission {
enum_constant public static final java.nio.file.attribute.PosixFilePermission GROUP_EXECUTE;
enum_constant public static final java.nio.file.attribute.PosixFilePermission GROUP_READ;
enum_constant public static final java.nio.file.attribute.PosixFilePermission GROUP_WRITE;
@@ -63341,30 +63572,30 @@ package java.nio.file.attribute {
public final class PosixFilePermissions {
method public static java.nio.file.attribute.FileAttribute<java.util.Set<java.nio.file.attribute.PosixFilePermission>> asFileAttribute(java.util.Set<java.nio.file.attribute.PosixFilePermission>);
- method public static java.util.Set<java.nio.file.attribute.PosixFilePermission> fromString(java.lang.String);
- method public static java.lang.String toString(java.util.Set<java.nio.file.attribute.PosixFilePermission>);
+ method public static java.util.Set<java.nio.file.attribute.PosixFilePermission> fromString(String);
+ method public static String toString(java.util.Set<java.nio.file.attribute.PosixFilePermission>);
}
- public abstract interface UserDefinedFileAttributeView implements java.nio.file.attribute.FileAttributeView {
- method public abstract void delete(java.lang.String) throws java.io.IOException;
- method public abstract java.util.List<java.lang.String> list() throws java.io.IOException;
- method public abstract int read(java.lang.String, java.nio.ByteBuffer) throws java.io.IOException;
- method public abstract int size(java.lang.String) throws java.io.IOException;
- method public abstract int write(java.lang.String, java.nio.ByteBuffer) throws java.io.IOException;
+ public interface UserDefinedFileAttributeView extends java.nio.file.attribute.FileAttributeView {
+ method public void delete(String) throws java.io.IOException;
+ method public java.util.List<java.lang.String> list() throws java.io.IOException;
+ method public int read(String, java.nio.ByteBuffer) throws java.io.IOException;
+ method public int size(String) throws java.io.IOException;
+ method public int write(String, java.nio.ByteBuffer) throws java.io.IOException;
}
- public abstract interface UserPrincipal implements java.security.Principal {
+ public interface UserPrincipal extends java.security.Principal {
}
public abstract class UserPrincipalLookupService {
ctor protected UserPrincipalLookupService();
- method public abstract java.nio.file.attribute.GroupPrincipal lookupPrincipalByGroupName(java.lang.String) throws java.io.IOException;
- method public abstract java.nio.file.attribute.UserPrincipal lookupPrincipalByName(java.lang.String) throws java.io.IOException;
+ method public abstract java.nio.file.attribute.GroupPrincipal lookupPrincipalByGroupName(String) throws java.io.IOException;
+ method public abstract java.nio.file.attribute.UserPrincipal lookupPrincipalByName(String) throws java.io.IOException;
}
public class UserPrincipalNotFoundException extends java.io.IOException {
- ctor public UserPrincipalNotFoundException(java.lang.String);
- method public java.lang.String getName();
+ ctor public UserPrincipalNotFoundException(String);
+ method public String getName();
}
}
@@ -63380,11 +63611,11 @@ package java.nio.file.spi {
method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public abstract void delete(java.nio.file.Path) throws java.io.IOException;
method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException;
- method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+ method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, Class<V>, java.nio.file.LinkOption...);
method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
method public abstract java.nio.file.Path getPath(java.net.URI);
- method public abstract java.lang.String getScheme();
+ method public abstract String getScheme();
method public static java.util.List<java.nio.file.spi.FileSystemProvider> installedProviders();
method public abstract boolean isHidden(java.nio.file.Path) throws java.io.IOException;
method public abstract boolean isSameFile(java.nio.file.Path, java.nio.file.Path) throws java.io.IOException;
@@ -63393,19 +63624,19 @@ package java.nio.file.spi {
method public abstract java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
method public abstract java.nio.file.DirectoryStream<java.nio.file.Path> newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream.Filter<? super java.nio.file.Path>) throws java.io.IOException;
method public java.nio.channels.FileChannel newFileChannel(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
- method public abstract java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
- method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
+ method public abstract java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String,?>) throws java.io.IOException;
+ method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String,?>) throws java.io.IOException;
method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
- method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
- method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public abstract java.util.Map<java.lang.String,java.lang.Object> readAttributes(java.nio.file.Path, String, java.nio.file.LinkOption...) throws java.io.IOException;
method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
- method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
+ method public abstract void setAttribute(java.nio.file.Path, String, Object, java.nio.file.LinkOption...) throws java.io.IOException;
}
public abstract class FileTypeDetector {
ctor protected FileTypeDetector();
- method public abstract java.lang.String probeContentType(java.nio.file.Path) throws java.io.IOException;
+ method public abstract String probeContentType(java.nio.file.Path) throws java.io.IOException;
}
}
@@ -63420,8 +63651,8 @@ package java.security {
}
public class AccessControlException extends java.lang.SecurityException {
- ctor public AccessControlException(java.lang.String);
- ctor public AccessControlException(java.lang.String, java.security.Permission);
+ ctor public AccessControlException(String);
+ ctor public AccessControlException(String, java.security.Permission);
method public java.security.Permission getPermission();
}
@@ -63436,19 +63667,19 @@ package java.security {
method public static java.security.AccessControlContext getContext();
}
- public abstract interface AlgorithmConstraints {
- method public abstract boolean permits(java.util.Set<java.security.CryptoPrimitive>, java.lang.String, java.security.AlgorithmParameters);
- method public abstract boolean permits(java.util.Set<java.security.CryptoPrimitive>, java.security.Key);
- method public abstract boolean permits(java.util.Set<java.security.CryptoPrimitive>, java.lang.String, java.security.Key, java.security.AlgorithmParameters);
+ public interface AlgorithmConstraints {
+ method public boolean permits(java.util.Set<java.security.CryptoPrimitive>, String, java.security.AlgorithmParameters);
+ method public boolean permits(java.util.Set<java.security.CryptoPrimitive>, java.security.Key);
+ method public boolean permits(java.util.Set<java.security.CryptoPrimitive>, String, java.security.Key, java.security.AlgorithmParameters);
}
public class AlgorithmParameterGenerator {
- ctor protected AlgorithmParameterGenerator(java.security.AlgorithmParameterGeneratorSpi, java.security.Provider, java.lang.String);
+ ctor protected AlgorithmParameterGenerator(java.security.AlgorithmParameterGeneratorSpi, java.security.Provider, String);
method public final java.security.AlgorithmParameters generateParameters();
- method public final java.lang.String getAlgorithm();
- method public static java.security.AlgorithmParameterGenerator getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.AlgorithmParameterGenerator getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.AlgorithmParameterGenerator getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getAlgorithm();
+ method public static java.security.AlgorithmParameterGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.AlgorithmParameterGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.AlgorithmParameterGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final void init(int);
method public final void init(int, java.security.SecureRandom);
@@ -63464,61 +63695,61 @@ package java.security {
}
public class AlgorithmParameters {
- ctor protected AlgorithmParameters(java.security.AlgorithmParametersSpi, java.security.Provider, java.lang.String);
- method public final java.lang.String getAlgorithm();
+ ctor protected AlgorithmParameters(java.security.AlgorithmParametersSpi, java.security.Provider, String);
+ method public final String getAlgorithm();
method public final byte[] getEncoded() throws java.io.IOException;
- method public final byte[] getEncoded(java.lang.String) throws java.io.IOException;
- method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+ method public final byte[] getEncoded(String) throws java.io.IOException;
+ method public static java.security.AlgorithmParameters getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.AlgorithmParameters getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.AlgorithmParameters getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(Class<T>) throws java.security.spec.InvalidParameterSpecException;
method public final java.security.Provider getProvider();
method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
method public final void init(byte[]) throws java.io.IOException;
- method public final void init(byte[], java.lang.String) throws java.io.IOException;
- method public final java.lang.String toString();
+ method public final void init(byte[], String) throws java.io.IOException;
+ method public final String toString();
}
public abstract class AlgorithmParametersSpi {
ctor public AlgorithmParametersSpi();
method protected abstract byte[] engineGetEncoded() throws java.io.IOException;
- method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException;
- method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+ method protected abstract byte[] engineGetEncoded(String) throws java.io.IOException;
+ method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(Class<T>) throws java.security.spec.InvalidParameterSpecException;
method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
method protected abstract void engineInit(byte[]) throws java.io.IOException;
- method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException;
- method protected abstract java.lang.String engineToString();
+ method protected abstract void engineInit(byte[], String) throws java.io.IOException;
+ method protected abstract String engineToString();
}
public final class AllPermission extends java.security.Permission {
ctor public AllPermission();
- ctor public AllPermission(java.lang.String, java.lang.String);
- method public java.lang.String getActions();
+ ctor public AllPermission(String, String);
+ method public String getActions();
method public boolean implies(java.security.Permission);
}
public abstract class AuthProvider extends java.security.Provider {
- ctor protected AuthProvider(java.lang.String, double, java.lang.String);
+ ctor protected AuthProvider(String, double, String);
method public abstract void login(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler) throws javax.security.auth.login.LoginException;
method public abstract void logout() throws javax.security.auth.login.LoginException;
method public abstract void setCallbackHandler(javax.security.auth.callback.CallbackHandler);
}
public abstract class BasicPermission extends java.security.Permission implements java.io.Serializable {
- ctor public BasicPermission(java.lang.String);
- ctor public BasicPermission(java.lang.String, java.lang.String);
- method public java.lang.String getActions();
+ ctor public BasicPermission(String);
+ ctor public BasicPermission(String, String);
+ method public String getActions();
method public boolean implies(java.security.Permission);
}
- public abstract deprecated interface Certificate {
- method public abstract void decode(java.io.InputStream) throws java.io.IOException, java.security.KeyException;
- method public abstract void encode(java.io.OutputStream) throws java.io.IOException, java.security.KeyException;
- method public abstract java.lang.String getFormat();
- method public abstract java.security.Principal getGuarantor();
- method public abstract java.security.Principal getPrincipal();
- method public abstract java.security.PublicKey getPublicKey();
- method public abstract java.lang.String toString(boolean);
+ @Deprecated public interface Certificate {
+ method @Deprecated public void decode(java.io.InputStream) throws java.io.IOException, java.security.KeyException;
+ method @Deprecated public void encode(java.io.OutputStream) throws java.io.IOException, java.security.KeyException;
+ method @Deprecated public String getFormat();
+ method @Deprecated public java.security.Principal getGuarantor();
+ method @Deprecated public java.security.Principal getPrincipal();
+ method @Deprecated public java.security.PublicKey getPublicKey();
+ method @Deprecated public String toString(boolean);
}
public final class CodeSigner implements java.io.Serializable {
@@ -63536,9 +63767,7 @@ package java.security {
method public boolean implies(java.security.CodeSource);
}
- public final class CryptoPrimitive extends java.lang.Enum {
- method public static java.security.CryptoPrimitive valueOf(java.lang.String);
- method public static final java.security.CryptoPrimitive[] values();
+ public enum CryptoPrimitive {
enum_constant public static final java.security.CryptoPrimitive BLOCK_CIPHER;
enum_constant public static final java.security.CryptoPrimitive KEY_AGREEMENT;
enum_constant public static final java.security.CryptoPrimitive KEY_ENCAPSULATION;
@@ -63553,9 +63782,9 @@ package java.security {
public class DigestException extends java.security.GeneralSecurityException {
ctor public DigestException();
- ctor public DigestException(java.lang.String);
- ctor public DigestException(java.lang.String, java.lang.Throwable);
- ctor public DigestException(java.lang.Throwable);
+ ctor public DigestException(String);
+ ctor public DigestException(String, Throwable);
+ ctor public DigestException(Throwable);
}
public class DigestInputStream extends java.io.FilterInputStream {
@@ -63574,108 +63803,108 @@ package java.security {
field protected java.security.MessageDigest digest;
}
- public abstract interface DomainCombiner {
- method public abstract java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);
+ public interface DomainCombiner {
+ method public java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);
}
public final class DomainLoadStoreParameter implements java.security.KeyStore.LoadStoreParameter {
- ctor public DomainLoadStoreParameter(java.net.URI, java.util.Map<java.lang.String, java.security.KeyStore.ProtectionParameter>);
+ ctor public DomainLoadStoreParameter(java.net.URI, java.util.Map<java.lang.String,java.security.KeyStore.ProtectionParameter>);
method public java.net.URI getConfiguration();
method public java.security.KeyStore.ProtectionParameter getProtectionParameter();
- method public java.util.Map<java.lang.String, java.security.KeyStore.ProtectionParameter> getProtectionParams();
+ method public java.util.Map<java.lang.String,java.security.KeyStore.ProtectionParameter> getProtectionParams();
}
public class GeneralSecurityException extends java.lang.Exception {
ctor public GeneralSecurityException();
- ctor public GeneralSecurityException(java.lang.String);
- ctor public GeneralSecurityException(java.lang.String, java.lang.Throwable);
- ctor public GeneralSecurityException(java.lang.Throwable);
+ ctor public GeneralSecurityException(String);
+ ctor public GeneralSecurityException(String, Throwable);
+ ctor public GeneralSecurityException(Throwable);
}
- public abstract interface Guard {
- method public abstract void checkGuard(java.lang.Object) throws java.lang.SecurityException;
+ public interface Guard {
+ method public void checkGuard(Object) throws java.lang.SecurityException;
}
public class GuardedObject implements java.io.Serializable {
- ctor public GuardedObject(java.lang.Object, java.security.Guard);
- method public java.lang.Object getObject() throws java.lang.SecurityException;
- }
-
- public abstract deprecated class Identity implements java.security.Principal java.io.Serializable {
- ctor protected Identity();
- ctor public Identity(java.lang.String, java.security.IdentityScope) throws java.security.KeyManagementException;
- ctor public Identity(java.lang.String);
- method public void addCertificate(java.security.Certificate) throws java.security.KeyManagementException;
- method public java.security.Certificate[] certificates();
- method public final boolean equals(java.lang.Object);
- method public java.lang.String getInfo();
- method public final java.lang.String getName();
- method public java.security.PublicKey getPublicKey();
- method public final java.security.IdentityScope getScope();
- method protected boolean identityEquals(java.security.Identity);
- method public void removeCertificate(java.security.Certificate) throws java.security.KeyManagementException;
- method public void setInfo(java.lang.String);
- method public void setPublicKey(java.security.PublicKey) throws java.security.KeyManagementException;
- method public java.lang.String toString(boolean);
- }
-
- public abstract deprecated class IdentityScope extends java.security.Identity {
- ctor protected IdentityScope();
- ctor public IdentityScope(java.lang.String);
- ctor public IdentityScope(java.lang.String, java.security.IdentityScope) throws java.security.KeyManagementException;
- method public abstract void addIdentity(java.security.Identity) throws java.security.KeyManagementException;
- method public abstract java.security.Identity getIdentity(java.lang.String);
- method public java.security.Identity getIdentity(java.security.Principal);
- method public abstract java.security.Identity getIdentity(java.security.PublicKey);
- method public static java.security.IdentityScope getSystemScope();
- method public abstract java.util.Enumeration<java.security.Identity> identities();
- method public abstract void removeIdentity(java.security.Identity) throws java.security.KeyManagementException;
- method protected static void setSystemScope(java.security.IdentityScope);
- method public abstract int size();
+ ctor public GuardedObject(Object, java.security.Guard);
+ method public Object getObject() throws java.lang.SecurityException;
+ }
+
+ @Deprecated public abstract class Identity implements java.security.Principal java.io.Serializable {
+ ctor @Deprecated protected Identity();
+ ctor @Deprecated public Identity(String, java.security.IdentityScope) throws java.security.KeyManagementException;
+ ctor @Deprecated public Identity(String);
+ method @Deprecated public void addCertificate(java.security.Certificate) throws java.security.KeyManagementException;
+ method @Deprecated public java.security.Certificate[] certificates();
+ method @Deprecated public final boolean equals(Object);
+ method @Deprecated public String getInfo();
+ method @Deprecated public final String getName();
+ method @Deprecated public java.security.PublicKey getPublicKey();
+ method @Deprecated public final java.security.IdentityScope getScope();
+ method @Deprecated protected boolean identityEquals(java.security.Identity);
+ method @Deprecated public void removeCertificate(java.security.Certificate) throws java.security.KeyManagementException;
+ method @Deprecated public void setInfo(String);
+ method @Deprecated public void setPublicKey(java.security.PublicKey) throws java.security.KeyManagementException;
+ method @Deprecated public String toString(boolean);
+ }
+
+ @Deprecated public abstract class IdentityScope extends java.security.Identity {
+ ctor @Deprecated protected IdentityScope();
+ ctor @Deprecated public IdentityScope(String);
+ ctor @Deprecated public IdentityScope(String, java.security.IdentityScope) throws java.security.KeyManagementException;
+ method @Deprecated public abstract void addIdentity(java.security.Identity) throws java.security.KeyManagementException;
+ method @Deprecated public abstract java.security.Identity getIdentity(String);
+ method @Deprecated public java.security.Identity getIdentity(java.security.Principal);
+ method @Deprecated public abstract java.security.Identity getIdentity(java.security.PublicKey);
+ method @Deprecated public static java.security.IdentityScope getSystemScope();
+ method @Deprecated public abstract java.util.Enumeration<java.security.Identity> identities();
+ method @Deprecated public abstract void removeIdentity(java.security.Identity) throws java.security.KeyManagementException;
+ method @Deprecated protected static void setSystemScope(java.security.IdentityScope);
+ method @Deprecated public abstract int size();
}
public class InvalidAlgorithmParameterException extends java.security.GeneralSecurityException {
ctor public InvalidAlgorithmParameterException();
- ctor public InvalidAlgorithmParameterException(java.lang.String);
- ctor public InvalidAlgorithmParameterException(java.lang.String, java.lang.Throwable);
- ctor public InvalidAlgorithmParameterException(java.lang.Throwable);
+ ctor public InvalidAlgorithmParameterException(String);
+ ctor public InvalidAlgorithmParameterException(String, Throwable);
+ ctor public InvalidAlgorithmParameterException(Throwable);
}
public class InvalidKeyException extends java.security.KeyException {
ctor public InvalidKeyException();
- ctor public InvalidKeyException(java.lang.String);
- ctor public InvalidKeyException(java.lang.String, java.lang.Throwable);
- ctor public InvalidKeyException(java.lang.Throwable);
+ ctor public InvalidKeyException(String);
+ ctor public InvalidKeyException(String, Throwable);
+ ctor public InvalidKeyException(Throwable);
}
public class InvalidParameterException extends java.lang.IllegalArgumentException {
ctor public InvalidParameterException();
- ctor public InvalidParameterException(java.lang.String);
+ ctor public InvalidParameterException(String);
}
- public abstract interface Key implements java.io.Serializable {
- method public abstract java.lang.String getAlgorithm();
- method public abstract byte[] getEncoded();
- method public abstract java.lang.String getFormat();
+ public interface Key extends java.io.Serializable {
+ method public String getAlgorithm();
+ method public byte[] getEncoded();
+ method public String getFormat();
field public static final long serialVersionUID = 6603384152749567654L; // 0x5ba3eee69414eea6L
}
public class KeyException extends java.security.GeneralSecurityException {
ctor public KeyException();
- ctor public KeyException(java.lang.String);
- ctor public KeyException(java.lang.String, java.lang.Throwable);
- ctor public KeyException(java.lang.Throwable);
+ ctor public KeyException(String);
+ ctor public KeyException(String, Throwable);
+ ctor public KeyException(Throwable);
}
public class KeyFactory {
- ctor protected KeyFactory(java.security.KeyFactorySpi, java.security.Provider, java.lang.String);
+ ctor protected KeyFactory(java.security.KeyFactorySpi, java.security.Provider, String);
method public final java.security.PrivateKey generatePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
method public final java.security.PublicKey generatePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
- method public final java.lang.String getAlgorithm();
- method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+ method public final String getAlgorithm();
+ method public static java.security.KeyFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.KeyFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.KeyFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, Class<T>) throws java.security.spec.InvalidKeySpecException;
method public final java.security.Provider getProvider();
method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException;
}
@@ -63684,15 +63913,15 @@ package java.security {
ctor public KeyFactorySpi();
method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
- method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+ method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, Class<T>) throws java.security.spec.InvalidKeySpecException;
method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException;
}
public class KeyManagementException extends java.security.KeyException {
ctor public KeyManagementException();
- ctor public KeyManagementException(java.lang.String);
- ctor public KeyManagementException(java.lang.String, java.lang.Throwable);
- ctor public KeyManagementException(java.lang.Throwable);
+ ctor public KeyManagementException(String);
+ ctor public KeyManagementException(String, Throwable);
+ ctor public KeyManagementException(Throwable);
}
public final class KeyPair implements java.io.Serializable {
@@ -63702,13 +63931,13 @@ package java.security {
}
public abstract class KeyPairGenerator extends java.security.KeyPairGeneratorSpi {
- ctor protected KeyPairGenerator(java.lang.String);
+ ctor protected KeyPairGenerator(String);
method public final java.security.KeyPair genKeyPair();
method public java.security.KeyPair generateKeyPair();
- method public java.lang.String getAlgorithm();
- method public static java.security.KeyPairGenerator getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.KeyPairGenerator getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.KeyPairGenerator getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public String getAlgorithm();
+ method public static java.security.KeyPairGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.KeyPairGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.KeyPairGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public void initialize(int);
method public void initialize(int, java.security.SecureRandom);
@@ -63723,56 +63952,54 @@ package java.security {
}
public class KeyRep implements java.io.Serializable {
- ctor public KeyRep(java.security.KeyRep.Type, java.lang.String, java.lang.String, byte[]);
- method protected java.lang.Object readResolve() throws java.io.ObjectStreamException;
+ ctor public KeyRep(java.security.KeyRep.Type, String, String, byte[]);
+ method protected Object readResolve() throws java.io.ObjectStreamException;
}
- public static final class KeyRep.Type extends java.lang.Enum {
- method public static java.security.KeyRep.Type valueOf(java.lang.String);
- method public static final java.security.KeyRep.Type[] values();
+ public enum KeyRep.Type {
enum_constant public static final java.security.KeyRep.Type PRIVATE;
enum_constant public static final java.security.KeyRep.Type PUBLIC;
enum_constant public static final java.security.KeyRep.Type SECRET;
}
public class KeyStore {
- ctor protected KeyStore(java.security.KeyStoreSpi, java.security.Provider, java.lang.String);
+ ctor protected KeyStore(java.security.KeyStoreSpi, java.security.Provider, String);
method public final java.util.Enumeration<java.lang.String> aliases() throws java.security.KeyStoreException;
- method public final boolean containsAlias(java.lang.String) throws java.security.KeyStoreException;
- method public final void deleteEntry(java.lang.String) throws java.security.KeyStoreException;
- method public final boolean entryInstanceOf(java.lang.String, java.lang.Class<? extends java.security.KeyStore.Entry>) throws java.security.KeyStoreException;
- method public final java.security.cert.Certificate getCertificate(java.lang.String) throws java.security.KeyStoreException;
- method public final java.lang.String getCertificateAlias(java.security.cert.Certificate) throws java.security.KeyStoreException;
- method public final java.security.cert.Certificate[] getCertificateChain(java.lang.String) throws java.security.KeyStoreException;
- method public final java.util.Date getCreationDate(java.lang.String) throws java.security.KeyStoreException;
- method public static final java.lang.String getDefaultType();
- method public final java.security.KeyStore.Entry getEntry(java.lang.String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
- method public static java.security.KeyStore getInstance(java.lang.String) throws java.security.KeyStoreException;
- method public static java.security.KeyStore getInstance(java.lang.String, java.lang.String) throws java.security.KeyStoreException, java.security.NoSuchProviderException;
- method public static java.security.KeyStore getInstance(java.lang.String, java.security.Provider) throws java.security.KeyStoreException;
- method public final java.security.Key getKey(java.lang.String, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ method public final boolean containsAlias(String) throws java.security.KeyStoreException;
+ method public final void deleteEntry(String) throws java.security.KeyStoreException;
+ method public final boolean entryInstanceOf(String, Class<? extends java.security.KeyStore.Entry>) throws java.security.KeyStoreException;
+ method public final java.security.cert.Certificate getCertificate(String) throws java.security.KeyStoreException;
+ method public final String getCertificateAlias(java.security.cert.Certificate) throws java.security.KeyStoreException;
+ method public final java.security.cert.Certificate[] getCertificateChain(String) throws java.security.KeyStoreException;
+ method public final java.util.Date getCreationDate(String) throws java.security.KeyStoreException;
+ method public static final String getDefaultType();
+ method public final java.security.KeyStore.Entry getEntry(String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
+ method public static java.security.KeyStore getInstance(String) throws java.security.KeyStoreException;
+ method public static java.security.KeyStore getInstance(String, String) throws java.security.KeyStoreException, java.security.NoSuchProviderException;
+ method public static java.security.KeyStore getInstance(String, java.security.Provider) throws java.security.KeyStoreException;
+ method public final java.security.Key getKey(String, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
method public final java.security.Provider getProvider();
- method public final java.lang.String getType();
- method public final boolean isCertificateEntry(java.lang.String) throws java.security.KeyStoreException;
- method public final boolean isKeyEntry(java.lang.String) throws java.security.KeyStoreException;
+ method public final String getType();
+ method public final boolean isCertificateEntry(String) throws java.security.KeyStoreException;
+ method public final boolean isKeyEntry(String) throws java.security.KeyStoreException;
method public final void load(java.io.InputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
method public final void load(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
- method public final void setCertificateEntry(java.lang.String, java.security.cert.Certificate) throws java.security.KeyStoreException;
- method public final void setEntry(java.lang.String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
- method public final void setKeyEntry(java.lang.String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
- method public final void setKeyEntry(java.lang.String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
+ method public final void setCertificateEntry(String, java.security.cert.Certificate) throws java.security.KeyStoreException;
+ method public final void setEntry(String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
+ method public final void setKeyEntry(String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
+ method public final void setKeyEntry(String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
method public final int size() throws java.security.KeyStoreException;
method public final void store(java.io.OutputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException;
method public final void store(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException;
}
- public static abstract class KeyStore.Builder {
+ public abstract static class KeyStore.Builder {
ctor protected KeyStore.Builder();
method public abstract java.security.KeyStore getKeyStore() throws java.security.KeyStoreException;
- method public abstract java.security.KeyStore.ProtectionParameter getProtectionParameter(java.lang.String) throws java.security.KeyStoreException;
+ method public abstract java.security.KeyStore.ProtectionParameter getProtectionParameter(String) throws java.security.KeyStoreException;
method public static java.security.KeyStore.Builder newInstance(java.security.KeyStore, java.security.KeyStore.ProtectionParameter);
- method public static java.security.KeyStore.Builder newInstance(java.lang.String, java.security.Provider, java.io.File, java.security.KeyStore.ProtectionParameter);
- method public static java.security.KeyStore.Builder newInstance(java.lang.String, java.security.Provider, java.security.KeyStore.ProtectionParameter);
+ method public static java.security.KeyStore.Builder newInstance(String, java.security.Provider, java.io.File, java.security.KeyStore.ProtectionParameter);
+ method public static java.security.KeyStore.Builder newInstance(String, java.security.Provider, java.security.KeyStore.ProtectionParameter);
}
public static class KeyStore.CallbackHandlerProtection implements java.security.KeyStore.ProtectionParameter {
@@ -63780,27 +64007,25 @@ package java.security {
method public javax.security.auth.callback.CallbackHandler getCallbackHandler();
}
- public static abstract interface KeyStore.Entry {
+ public static interface KeyStore.Entry {
method public default java.util.Set<java.security.KeyStore.Entry.Attribute> getAttributes();
}
- public static abstract interface KeyStore.Entry.Attribute {
- method public abstract java.lang.String getName();
- method public abstract java.lang.String getValue();
+ public static interface KeyStore.Entry.Attribute {
+ method public String getName();
+ method public String getValue();
}
- public static abstract interface KeyStore.LoadStoreParameter {
- method public abstract java.security.KeyStore.ProtectionParameter getProtectionParameter();
+ public static interface KeyStore.LoadStoreParameter {
+ method public java.security.KeyStore.ProtectionParameter getProtectionParameter();
}
public static class KeyStore.PasswordProtection implements javax.security.auth.Destroyable java.security.KeyStore.ProtectionParameter {
ctor public KeyStore.PasswordProtection(char[]);
- ctor public KeyStore.PasswordProtection(char[], java.lang.String, java.security.spec.AlgorithmParameterSpec);
- method public synchronized void destroy() throws javax.security.auth.DestroyFailedException;
- method public synchronized char[] getPassword();
- method public java.lang.String getProtectionAlgorithm();
+ ctor public KeyStore.PasswordProtection(char[], String, java.security.spec.AlgorithmParameterSpec);
+ method public char[] getPassword();
+ method public String getProtectionAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getProtectionParameters();
- method public synchronized boolean isDestroyed();
}
public static final class KeyStore.PrivateKeyEntry implements java.security.KeyStore.Entry {
@@ -63811,7 +64036,7 @@ package java.security {
method public java.security.PrivateKey getPrivateKey();
}
- public static abstract interface KeyStore.ProtectionParameter {
+ public static interface KeyStore.ProtectionParameter {
}
public static final class KeyStore.SecretKeyEntry implements java.security.KeyStore.Entry {
@@ -63828,58 +64053,58 @@ package java.security {
public class KeyStoreException extends java.security.GeneralSecurityException {
ctor public KeyStoreException();
- ctor public KeyStoreException(java.lang.String);
- ctor public KeyStoreException(java.lang.String, java.lang.Throwable);
- ctor public KeyStoreException(java.lang.Throwable);
+ ctor public KeyStoreException(String);
+ ctor public KeyStoreException(String, Throwable);
+ ctor public KeyStoreException(Throwable);
}
public abstract class KeyStoreSpi {
ctor public KeyStoreSpi();
method public abstract java.util.Enumeration<java.lang.String> engineAliases();
- method public abstract boolean engineContainsAlias(java.lang.String);
- method public abstract void engineDeleteEntry(java.lang.String) throws java.security.KeyStoreException;
- method public boolean engineEntryInstanceOf(java.lang.String, java.lang.Class<? extends java.security.KeyStore.Entry>);
- method public abstract java.security.cert.Certificate engineGetCertificate(java.lang.String);
- method public abstract java.lang.String engineGetCertificateAlias(java.security.cert.Certificate);
- method public abstract java.security.cert.Certificate[] engineGetCertificateChain(java.lang.String);
- method public abstract java.util.Date engineGetCreationDate(java.lang.String);
- method public java.security.KeyStore.Entry engineGetEntry(java.lang.String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
- method public abstract java.security.Key engineGetKey(java.lang.String, char[]) throws java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
- method public abstract boolean engineIsCertificateEntry(java.lang.String);
- method public abstract boolean engineIsKeyEntry(java.lang.String);
+ method public abstract boolean engineContainsAlias(String);
+ method public abstract void engineDeleteEntry(String) throws java.security.KeyStoreException;
+ method public boolean engineEntryInstanceOf(String, Class<? extends java.security.KeyStore.Entry>);
+ method public abstract java.security.cert.Certificate engineGetCertificate(String);
+ method public abstract String engineGetCertificateAlias(java.security.cert.Certificate);
+ method public abstract java.security.cert.Certificate[] engineGetCertificateChain(String);
+ method public abstract java.util.Date engineGetCreationDate(String);
+ method public java.security.KeyStore.Entry engineGetEntry(String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
+ method public abstract java.security.Key engineGetKey(String, char[]) throws java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ method public abstract boolean engineIsCertificateEntry(String);
+ method public abstract boolean engineIsKeyEntry(String);
method public abstract void engineLoad(java.io.InputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
method public void engineLoad(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
- method public abstract void engineSetCertificateEntry(java.lang.String, java.security.cert.Certificate) throws java.security.KeyStoreException;
- method public void engineSetEntry(java.lang.String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
- method public abstract void engineSetKeyEntry(java.lang.String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
- method public abstract void engineSetKeyEntry(java.lang.String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
+ method public abstract void engineSetCertificateEntry(String, java.security.cert.Certificate) throws java.security.KeyStoreException;
+ method public void engineSetEntry(String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
+ method public abstract void engineSetKeyEntry(String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
+ method public abstract void engineSetKeyEntry(String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
method public abstract int engineSize();
method public abstract void engineStore(java.io.OutputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
method public void engineStore(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
}
public abstract class MessageDigest extends java.security.MessageDigestSpi {
- ctor protected MessageDigest(java.lang.String);
+ ctor protected MessageDigest(@NonNull String);
method public byte[] digest();
method public int digest(byte[], int, int) throws java.security.DigestException;
method public byte[] digest(byte[]);
- method public final java.lang.String getAlgorithm();
+ method @NonNull public final String getAlgorithm();
method public final int getDigestLength();
- method public static java.security.MessageDigest getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.MessageDigest getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.MessageDigest getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final java.security.Provider getProvider();
+ method @NonNull public static java.security.MessageDigest getInstance(@NonNull String) throws java.security.NoSuchAlgorithmException;
+ method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method @NonNull public final java.security.Provider getProvider();
method public static boolean isEqual(byte[], byte[]);
method public void reset();
method public void update(byte);
method public void update(byte[], int, int);
method public void update(byte[]);
- method public final void update(java.nio.ByteBuffer);
+ method public final void update(@NonNull java.nio.ByteBuffer);
}
public abstract class MessageDigestSpi {
ctor public MessageDigestSpi();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
method protected abstract byte[] engineDigest();
method protected int engineDigest(byte[], int, int) throws java.security.DigestException;
method protected int engineGetDigestLength();
@@ -63891,29 +64116,29 @@ package java.security {
public class NoSuchAlgorithmException extends java.security.GeneralSecurityException {
ctor public NoSuchAlgorithmException();
- ctor public NoSuchAlgorithmException(java.lang.String);
- ctor public NoSuchAlgorithmException(java.lang.String, java.lang.Throwable);
- ctor public NoSuchAlgorithmException(java.lang.Throwable);
+ ctor public NoSuchAlgorithmException(String);
+ ctor public NoSuchAlgorithmException(String, Throwable);
+ ctor public NoSuchAlgorithmException(Throwable);
}
public class NoSuchProviderException extends java.security.GeneralSecurityException {
ctor public NoSuchProviderException();
- ctor public NoSuchProviderException(java.lang.String);
+ ctor public NoSuchProviderException(String);
}
public final class PKCS12Attribute implements java.security.KeyStore.Entry.Attribute {
- ctor public PKCS12Attribute(java.lang.String, java.lang.String);
+ ctor public PKCS12Attribute(String, String);
ctor public PKCS12Attribute(byte[]);
method public byte[] getEncoded();
- method public java.lang.String getName();
- method public java.lang.String getValue();
+ method public String getName();
+ method public String getValue();
}
public abstract class Permission implements java.security.Guard java.io.Serializable {
- ctor public Permission(java.lang.String);
- method public void checkGuard(java.lang.Object) throws java.lang.SecurityException;
- method public abstract java.lang.String getActions();
- method public final java.lang.String getName();
+ ctor public Permission(String);
+ method public void checkGuard(Object) throws java.lang.SecurityException;
+ method public abstract String getActions();
+ method public final String getName();
method public abstract boolean implies(java.security.Permission);
method public java.security.PermissionCollection newPermissionCollection();
}
@@ -63936,22 +64161,22 @@ package java.security {
public abstract class Policy {
ctor public Policy();
- method public static java.security.Policy getInstance(java.lang.String, java.security.Policy.Parameters) throws java.security.NoSuchAlgorithmException;
- method public static java.security.Policy getInstance(java.lang.String, java.security.Policy.Parameters, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.Policy getInstance(java.lang.String, java.security.Policy.Parameters, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.Policy getInstance(String, java.security.Policy.Parameters) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.Policy getInstance(String, java.security.Policy.Parameters, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.Policy getInstance(String, java.security.Policy.Parameters, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public java.security.Policy.Parameters getParameters();
method public java.security.PermissionCollection getPermissions(java.security.CodeSource);
method public java.security.PermissionCollection getPermissions(java.security.ProtectionDomain);
method public static java.security.Policy getPolicy();
method public java.security.Provider getProvider();
- method public java.lang.String getType();
+ method public String getType();
method public boolean implies(java.security.ProtectionDomain, java.security.Permission);
method public void refresh();
method public static void setPolicy(java.security.Policy);
field public static final java.security.PermissionCollection UNSUPPORTED_EMPTY_COLLECTION;
}
- public static abstract interface Policy.Parameters {
+ public static interface Policy.Parameters {
}
public abstract class PolicySpi {
@@ -63962,36 +64187,35 @@ package java.security {
method protected void engineRefresh();
}
- public abstract interface Principal {
- method public abstract boolean equals(java.lang.Object);
- method public abstract java.lang.String getName();
- method public abstract int hashCode();
+ public interface Principal {
+ method public boolean equals(Object);
+ method public String getName();
+ method public int hashCode();
method public default boolean implies(javax.security.auth.Subject);
- method public abstract java.lang.String toString();
+ method public String toString();
}
- public abstract interface PrivateKey implements javax.security.auth.Destroyable java.security.Key {
+ public interface PrivateKey extends java.security.Key javax.security.auth.Destroyable {
field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L
}
- public abstract interface PrivilegedAction<T> {
- method public abstract T run();
+ public interface PrivilegedAction<T> {
+ method public T run();
}
public class PrivilegedActionException extends java.lang.Exception {
- ctor public PrivilegedActionException(java.lang.Exception);
- method public java.lang.Throwable getCause();
- method public java.lang.Exception getException();
+ ctor public PrivilegedActionException(Exception);
+ method public Exception getException();
}
- public abstract interface PrivilegedExceptionAction<T> {
- method public abstract T run() throws java.lang.Exception;
+ public interface PrivilegedExceptionAction<T> {
+ method public T run() throws java.lang.Exception;
}
public class ProtectionDomain {
ctor public ProtectionDomain(java.security.CodeSource, java.security.PermissionCollection);
- ctor public ProtectionDomain(java.security.CodeSource, java.security.PermissionCollection, java.lang.ClassLoader, java.security.Principal[]);
- method public final java.lang.ClassLoader getClassLoader();
+ ctor public ProtectionDomain(java.security.CodeSource, java.security.PermissionCollection, ClassLoader, java.security.Principal[]);
+ method public final ClassLoader getClassLoader();
method public final java.security.CodeSource getCodeSource();
method public final java.security.PermissionCollection getPermissions();
method public final java.security.Principal[] getPrincipals();
@@ -63999,62 +64223,62 @@ package java.security {
}
public abstract class Provider extends java.util.Properties {
- ctor protected Provider(java.lang.String, double, java.lang.String);
- method public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
- method public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function<? super java.lang.Object, ? extends java.lang.Object>);
- method public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ ctor protected Provider(String, double, String);
+ method public Object compute(Object, java.util.function.BiFunction<? super java.lang.Object,? super java.lang.Object,?>);
+ method public Object computeIfAbsent(Object, java.util.function.Function<? super java.lang.Object,?>);
+ method public Object computeIfPresent(Object, java.util.function.BiFunction<? super java.lang.Object,? super java.lang.Object,?>);
method public java.util.Enumeration<java.lang.Object> elements();
- method public synchronized java.util.Set<java.util.Map.Entry<java.lang.Object, java.lang.Object>> entrySet();
- method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
- method public java.lang.Object get(java.lang.Object);
- method public java.lang.String getInfo();
- method public java.lang.String getName();
- method public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
- method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
- method public synchronized java.util.Set<java.security.Provider.Service> getServices();
+ method public java.util.Set<java.util.Map.Entry<java.lang.Object,java.lang.Object>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super java.lang.Object,? super java.lang.Object>);
+ method public Object get(Object);
+ method public String getInfo();
+ method public String getName();
+ method public Object getOrDefault(Object, Object);
+ method public java.security.Provider.Service getService(String, String);
+ method public java.util.Set<java.security.Provider.Service> getServices();
method public double getVersion();
method public java.util.Set<java.lang.Object> keySet();
method public java.util.Enumeration<java.lang.Object> keys();
- method public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
- method public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
- method public synchronized void putAll(java.util.Map<?, ?>);
- method public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
- method protected synchronized void putService(java.security.Provider.Service);
- method public synchronized java.lang.Object remove(java.lang.Object);
- method protected synchronized void removeService(java.security.Provider.Service);
- method public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
- method public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
- method public synchronized void replaceAll(java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public Object merge(Object, Object, java.util.function.BiFunction<? super java.lang.Object,? super java.lang.Object,?>);
+ method public Object put(Object, Object);
+ method public void putAll(java.util.Map<?,?>);
+ method public Object putIfAbsent(Object, Object);
+ method protected void putService(java.security.Provider.Service);
+ method public Object remove(Object);
+ method protected void removeService(java.security.Provider.Service);
+ method public boolean replace(Object, Object, Object);
+ method public Object replace(Object, Object);
+ method public void replaceAll(java.util.function.BiFunction<? super java.lang.Object,? super java.lang.Object,?>);
method public java.util.Collection<java.lang.Object> values();
}
public static class Provider.Service {
- ctor public Provider.Service(java.security.Provider, java.lang.String, java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.Map<java.lang.String, java.lang.String>);
- method public final java.lang.String getAlgorithm();
- method public final java.lang.String getAttribute(java.lang.String);
- method public final java.lang.String getClassName();
+ ctor public Provider.Service(java.security.Provider, String, String, String, java.util.List<java.lang.String>, java.util.Map<java.lang.String,java.lang.String>);
+ method public final String getAlgorithm();
+ method public final String getAttribute(String);
+ method public final String getClassName();
method public final java.security.Provider getProvider();
- method public final java.lang.String getType();
- method public java.lang.Object newInstance(java.lang.Object) throws java.security.NoSuchAlgorithmException;
- method public boolean supportsParameter(java.lang.Object);
+ method public final String getType();
+ method public Object newInstance(Object) throws java.security.NoSuchAlgorithmException;
+ method public boolean supportsParameter(Object);
}
public class ProviderException extends java.lang.RuntimeException {
ctor public ProviderException();
- ctor public ProviderException(java.lang.String);
- ctor public ProviderException(java.lang.String, java.lang.Throwable);
- ctor public ProviderException(java.lang.Throwable);
+ ctor public ProviderException(String);
+ ctor public ProviderException(String, Throwable);
+ ctor public ProviderException(Throwable);
}
- public abstract interface PublicKey implements java.security.Key {
+ public interface PublicKey extends java.security.Key {
field public static final long serialVersionUID = 7187392471159151072L; // 0x63bebf5f40c219e0L
}
public class SecureClassLoader extends java.lang.ClassLoader {
- ctor protected SecureClassLoader(java.lang.ClassLoader);
+ ctor protected SecureClassLoader(ClassLoader);
ctor protected SecureClassLoader();
- method protected final java.lang.Class<?> defineClass(java.lang.String, byte[], int, int, java.security.CodeSource);
- method protected final java.lang.Class<?> defineClass(java.lang.String, java.nio.ByteBuffer, java.security.CodeSource);
+ method protected final Class<?> defineClass(String, byte[], int, int, java.security.CodeSource);
+ method protected final Class<?> defineClass(String, java.nio.ByteBuffer, java.security.CodeSource);
method protected java.security.PermissionCollection getPermissions(java.security.CodeSource);
}
@@ -64063,17 +64287,15 @@ package java.security {
ctor public SecureRandom(byte[]);
ctor protected SecureRandom(java.security.SecureRandomSpi, java.security.Provider);
method public byte[] generateSeed(int);
- method public java.lang.String getAlgorithm();
- method public static java.security.SecureRandom getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.SecureRandom getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.SecureRandom getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public String getAlgorithm();
+ method public static java.security.SecureRandom getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.SecureRandom getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.SecureRandom getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public static java.security.SecureRandom getInstanceStrong() throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public static byte[] getSeed(int);
method protected final int next(int);
- method public synchronized void nextBytes(byte[]);
- method public synchronized void setSeed(byte[]);
- method public void setSeed(long);
+ method public void setSeed(byte[]);
}
public abstract class SecureRandomSpi implements java.io.Serializable {
@@ -64085,37 +64307,37 @@ package java.security {
public final class Security {
method public static int addProvider(java.security.Provider);
- method public static deprecated java.lang.String getAlgorithmProperty(java.lang.String, java.lang.String);
- method public static java.util.Set<java.lang.String> getAlgorithms(java.lang.String);
- method public static java.lang.String getProperty(java.lang.String);
- method public static java.security.Provider getProvider(java.lang.String);
+ method @Deprecated public static String getAlgorithmProperty(String, String);
+ method public static java.util.Set<java.lang.String> getAlgorithms(String);
+ method public static String getProperty(String);
+ method public static java.security.Provider getProvider(String);
method public static java.security.Provider[] getProviders();
- method public static java.security.Provider[] getProviders(java.lang.String);
- method public static java.security.Provider[] getProviders(java.util.Map<java.lang.String, java.lang.String>);
- method public static synchronized int insertProviderAt(java.security.Provider, int);
- method public static synchronized void removeProvider(java.lang.String);
- method public static void setProperty(java.lang.String, java.lang.String);
+ method public static java.security.Provider[] getProviders(String);
+ method public static java.security.Provider[] getProviders(java.util.Map<java.lang.String,java.lang.String>);
+ method public static int insertProviderAt(java.security.Provider, int);
+ method public static void removeProvider(String);
+ method public static void setProperty(String, String);
}
public final class SecurityPermission extends java.security.BasicPermission {
- ctor public SecurityPermission(java.lang.String);
- ctor public SecurityPermission(java.lang.String, java.lang.String);
+ ctor public SecurityPermission(String);
+ ctor public SecurityPermission(String, String);
}
public abstract class Signature extends java.security.SignatureSpi {
- ctor protected Signature(java.lang.String);
- method public final java.lang.String getAlgorithm();
- method public static java.security.Signature getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.Signature getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.Signature getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final deprecated java.lang.Object getParameter(java.lang.String) throws java.security.InvalidParameterException;
+ ctor protected Signature(String);
+ method public final String getAlgorithm();
+ method public static java.security.Signature getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.Signature getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.Signature getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method @Deprecated public final Object getParameter(String) throws java.security.InvalidParameterException;
method public final java.security.AlgorithmParameters getParameters();
method public final java.security.Provider getProvider();
method public final void initSign(java.security.PrivateKey) throws java.security.InvalidKeyException;
method public final void initSign(java.security.PrivateKey, java.security.SecureRandom) throws java.security.InvalidKeyException;
method public final void initVerify(java.security.PublicKey) throws java.security.InvalidKeyException;
method public final void initVerify(java.security.cert.Certificate) throws java.security.InvalidKeyException;
- method public final deprecated void setParameter(java.lang.String, java.lang.Object) throws java.security.InvalidParameterException;
+ method @Deprecated public final void setParameter(String, Object) throws java.security.InvalidParameterException;
method public final void setParameter(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
method public final byte[] sign() throws java.security.SignatureException;
method public final int sign(byte[], int, int) throws java.security.SignatureException;
@@ -64133,20 +64355,20 @@ package java.security {
public class SignatureException extends java.security.GeneralSecurityException {
ctor public SignatureException();
- ctor public SignatureException(java.lang.String);
- ctor public SignatureException(java.lang.String, java.lang.Throwable);
- ctor public SignatureException(java.lang.Throwable);
+ ctor public SignatureException(String);
+ ctor public SignatureException(String, Throwable);
+ ctor public SignatureException(Throwable);
}
public abstract class SignatureSpi {
ctor public SignatureSpi();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
- method protected abstract deprecated java.lang.Object engineGetParameter(java.lang.String) throws java.security.InvalidParameterException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
+ method @Deprecated protected abstract Object engineGetParameter(String) throws java.security.InvalidParameterException;
method protected java.security.AlgorithmParameters engineGetParameters();
method protected abstract void engineInitSign(java.security.PrivateKey) throws java.security.InvalidKeyException;
method protected void engineInitSign(java.security.PrivateKey, java.security.SecureRandom) throws java.security.InvalidKeyException;
method protected abstract void engineInitVerify(java.security.PublicKey) throws java.security.InvalidKeyException;
- method protected abstract deprecated void engineSetParameter(java.lang.String, java.lang.Object) throws java.security.InvalidParameterException;
+ method @Deprecated protected abstract void engineSetParameter(String, Object) throws java.security.InvalidParameterException;
method protected void engineSetParameter(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
method protected abstract byte[] engineSign() throws java.security.SignatureException;
method protected int engineSign(byte[], int, int) throws java.security.SignatureException;
@@ -64160,18 +64382,18 @@ package java.security {
public final class SignedObject implements java.io.Serializable {
ctor public SignedObject(java.io.Serializable, java.security.PrivateKey, java.security.Signature) throws java.io.IOException, java.security.InvalidKeyException, java.security.SignatureException;
- method public java.lang.String getAlgorithm();
- method public java.lang.Object getObject() throws java.lang.ClassNotFoundException, java.io.IOException;
+ method public String getAlgorithm();
+ method public Object getObject() throws java.lang.ClassNotFoundException, java.io.IOException;
method public byte[] getSignature();
method public boolean verify(java.security.PublicKey, java.security.Signature) throws java.security.InvalidKeyException, java.security.SignatureException;
}
- public abstract deprecated class Signer extends java.security.Identity {
- ctor protected Signer();
- ctor public Signer(java.lang.String);
- ctor public Signer(java.lang.String, java.security.IdentityScope) throws java.security.KeyManagementException;
- method public java.security.PrivateKey getPrivateKey();
- method public final void setKeyPair(java.security.KeyPair) throws java.security.InvalidParameterException, java.security.KeyException;
+ @Deprecated public abstract class Signer extends java.security.Identity {
+ ctor @Deprecated protected Signer();
+ ctor @Deprecated public Signer(String);
+ ctor @Deprecated public Signer(String, java.security.IdentityScope) throws java.security.KeyManagementException;
+ method @Deprecated public java.security.PrivateKey getPrivateKey();
+ method @Deprecated public final void setKeyPair(java.security.KeyPair) throws java.security.InvalidParameterException, java.security.KeyException;
}
public final class Timestamp implements java.io.Serializable {
@@ -64182,21 +64404,21 @@ package java.security {
public class UnrecoverableEntryException extends java.security.GeneralSecurityException {
ctor public UnrecoverableEntryException();
- ctor public UnrecoverableEntryException(java.lang.String);
+ ctor public UnrecoverableEntryException(String);
}
public class UnrecoverableKeyException extends java.security.UnrecoverableEntryException {
ctor public UnrecoverableKeyException();
- ctor public UnrecoverableKeyException(java.lang.String);
+ ctor public UnrecoverableKeyException(String);
}
public final class UnresolvedPermission extends java.security.Permission implements java.io.Serializable {
- ctor public UnresolvedPermission(java.lang.String, java.lang.String, java.lang.String, java.security.cert.Certificate[]);
- method public java.lang.String getActions();
- method public java.lang.String getUnresolvedActions();
+ ctor public UnresolvedPermission(String, String, String, java.security.cert.Certificate[]);
+ method public String getActions();
+ method public String getUnresolvedActions();
method public java.security.cert.Certificate[] getUnresolvedCerts();
- method public java.lang.String getUnresolvedName();
- method public java.lang.String getUnresolvedType();
+ method public String getUnresolvedName();
+ method public String getUnresolvedType();
method public boolean implies(java.security.Permission);
}
@@ -64204,39 +64426,39 @@ package java.security {
package java.security.acl {
- public abstract interface Acl implements java.security.acl.Owner {
- method public abstract boolean addEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
- method public abstract boolean checkPermission(java.security.Principal, java.security.acl.Permission);
- method public abstract java.util.Enumeration<java.security.acl.AclEntry> entries();
- method public abstract java.lang.String getName();
- method public abstract java.util.Enumeration<java.security.acl.Permission> getPermissions(java.security.Principal);
- method public abstract boolean removeEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
- method public abstract void setName(java.security.Principal, java.lang.String) throws java.security.acl.NotOwnerException;
- method public abstract java.lang.String toString();
- }
-
- public abstract interface AclEntry implements java.lang.Cloneable {
- method public abstract boolean addPermission(java.security.acl.Permission);
- method public abstract boolean checkPermission(java.security.acl.Permission);
- method public abstract java.lang.Object clone();
- method public abstract java.security.Principal getPrincipal();
- method public abstract boolean isNegative();
- method public abstract java.util.Enumeration<java.security.acl.Permission> permissions();
- method public abstract boolean removePermission(java.security.acl.Permission);
- method public abstract void setNegativePermissions();
- method public abstract boolean setPrincipal(java.security.Principal);
- method public abstract java.lang.String toString();
+ public interface Acl extends java.security.acl.Owner {
+ method public boolean addEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
+ method public boolean checkPermission(java.security.Principal, java.security.acl.Permission);
+ method public java.util.Enumeration<java.security.acl.AclEntry> entries();
+ method public String getName();
+ method public java.util.Enumeration<java.security.acl.Permission> getPermissions(java.security.Principal);
+ method public boolean removeEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
+ method public void setName(java.security.Principal, String) throws java.security.acl.NotOwnerException;
+ method public String toString();
+ }
+
+ public interface AclEntry extends java.lang.Cloneable {
+ method public boolean addPermission(java.security.acl.Permission);
+ method public boolean checkPermission(java.security.acl.Permission);
+ method public Object clone();
+ method public java.security.Principal getPrincipal();
+ method public boolean isNegative();
+ method public java.util.Enumeration<java.security.acl.Permission> permissions();
+ method public boolean removePermission(java.security.acl.Permission);
+ method public void setNegativePermissions();
+ method public boolean setPrincipal(java.security.Principal);
+ method public String toString();
}
public class AclNotFoundException extends java.lang.Exception {
ctor public AclNotFoundException();
}
- public abstract interface Group implements java.security.Principal {
- method public abstract boolean addMember(java.security.Principal);
- method public abstract boolean isMember(java.security.Principal);
- method public abstract java.util.Enumeration<? extends java.security.Principal> members();
- method public abstract boolean removeMember(java.security.Principal);
+ public interface Group extends java.security.Principal {
+ method public boolean addMember(java.security.Principal);
+ method public boolean isMember(java.security.Principal);
+ method public java.util.Enumeration<? extends java.security.Principal> members();
+ method public boolean removeMember(java.security.Principal);
}
public class LastOwnerException extends java.lang.Exception {
@@ -64247,13 +64469,13 @@ package java.security.acl {
ctor public NotOwnerException();
}
- public abstract interface Owner {
- method public abstract boolean addOwner(java.security.Principal, java.security.Principal) throws java.security.acl.NotOwnerException;
- method public abstract boolean deleteOwner(java.security.Principal, java.security.Principal) throws java.security.acl.LastOwnerException, java.security.acl.NotOwnerException;
- method public abstract boolean isOwner(java.security.Principal);
+ public interface Owner {
+ method public boolean addOwner(java.security.Principal, java.security.Principal) throws java.security.acl.NotOwnerException;
+ method public boolean deleteOwner(java.security.Principal, java.security.Principal) throws java.security.acl.LastOwnerException, java.security.acl.NotOwnerException;
+ method public boolean isOwner(java.security.Principal);
}
- public abstract interface Permission {
+ public interface Permission {
}
}
@@ -64261,22 +64483,20 @@ package java.security.acl {
package java.security.cert {
public abstract class CRL {
- ctor protected CRL(java.lang.String);
- method public final java.lang.String getType();
+ ctor protected CRL(String);
+ method public final String getType();
method public abstract boolean isRevoked(java.security.cert.Certificate);
- method public abstract java.lang.String toString();
+ method public abstract String toString();
}
public class CRLException extends java.security.GeneralSecurityException {
ctor public CRLException();
- ctor public CRLException(java.lang.String);
- ctor public CRLException(java.lang.String, java.lang.Throwable);
- ctor public CRLException(java.lang.Throwable);
+ ctor public CRLException(String);
+ ctor public CRLException(String, Throwable);
+ ctor public CRLException(Throwable);
}
- public final class CRLReason extends java.lang.Enum {
- method public static java.security.cert.CRLReason valueOf(java.lang.String);
- method public static final java.security.cert.CRLReason[] values();
+ public enum CRLReason {
enum_constant public static final java.security.cert.CRLReason AA_COMPROMISE;
enum_constant public static final java.security.cert.CRLReason AFFILIATION_CHANGED;
enum_constant public static final java.security.cert.CRLReason CA_COMPROMISE;
@@ -64290,48 +64510,48 @@ package java.security.cert {
enum_constant public static final java.security.cert.CRLReason UNUSED;
}
- public abstract interface CRLSelector implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
- method public abstract boolean match(java.security.cert.CRL);
+ public interface CRLSelector extends java.lang.Cloneable {
+ method public Object clone();
+ method public boolean match(java.security.cert.CRL);
}
public abstract class CertPath implements java.io.Serializable {
- ctor protected CertPath(java.lang.String);
+ ctor protected CertPath(String);
method public abstract java.util.List<? extends java.security.cert.Certificate> getCertificates();
method public abstract byte[] getEncoded() throws java.security.cert.CertificateEncodingException;
- method public abstract byte[] getEncoded(java.lang.String) throws java.security.cert.CertificateEncodingException;
+ method public abstract byte[] getEncoded(String) throws java.security.cert.CertificateEncodingException;
method public abstract java.util.Iterator<java.lang.String> getEncodings();
- method public java.lang.String getType();
- method protected java.lang.Object writeReplace() throws java.io.ObjectStreamException;
+ method public String getType();
+ method protected Object writeReplace() throws java.io.ObjectStreamException;
}
protected static class CertPath.CertPathRep implements java.io.Serializable {
- ctor protected CertPath.CertPathRep(java.lang.String, byte[]);
- method protected java.lang.Object readResolve() throws java.io.ObjectStreamException;
+ ctor protected CertPath.CertPathRep(String, byte[]);
+ method protected Object readResolve() throws java.io.ObjectStreamException;
}
public class CertPathBuilder {
- ctor protected CertPathBuilder(java.security.cert.CertPathBuilderSpi, java.security.Provider, java.lang.String);
+ ctor protected CertPathBuilder(java.security.cert.CertPathBuilderSpi, java.security.Provider, String);
method public final java.security.cert.CertPathBuilderResult build(java.security.cert.CertPathParameters) throws java.security.cert.CertPathBuilderException, java.security.InvalidAlgorithmParameterException;
- method public final java.lang.String getAlgorithm();
- method public static final java.lang.String getDefaultType();
- method public static java.security.cert.CertPathBuilder getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.cert.CertPathBuilder getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.cert.CertPathBuilder getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getAlgorithm();
+ method public static final String getDefaultType();
+ method public static java.security.cert.CertPathBuilder getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.cert.CertPathBuilder getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.cert.CertPathBuilder getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final java.security.cert.CertPathChecker getRevocationChecker();
}
public class CertPathBuilderException extends java.security.GeneralSecurityException {
ctor public CertPathBuilderException();
- ctor public CertPathBuilderException(java.lang.String);
- ctor public CertPathBuilderException(java.lang.Throwable);
- ctor public CertPathBuilderException(java.lang.String, java.lang.Throwable);
+ ctor public CertPathBuilderException(String);
+ ctor public CertPathBuilderException(Throwable);
+ ctor public CertPathBuilderException(String, Throwable);
}
- public abstract interface CertPathBuilderResult implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
- method public abstract java.security.cert.CertPath getCertPath();
+ public interface CertPathBuilderResult extends java.lang.Cloneable {
+ method public Object clone();
+ method public java.security.cert.CertPath getCertPath();
}
public abstract class CertPathBuilderSpi {
@@ -64340,23 +64560,23 @@ package java.security.cert {
method public java.security.cert.CertPathChecker engineGetRevocationChecker();
}
- public abstract interface CertPathChecker {
- method public abstract void check(java.security.cert.Certificate) throws java.security.cert.CertPathValidatorException;
- method public abstract void init(boolean) throws java.security.cert.CertPathValidatorException;
- method public abstract boolean isForwardCheckingSupported();
+ public interface CertPathChecker {
+ method public void check(java.security.cert.Certificate) throws java.security.cert.CertPathValidatorException;
+ method public void init(boolean) throws java.security.cert.CertPathValidatorException;
+ method public boolean isForwardCheckingSupported();
}
- public abstract interface CertPathParameters implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
+ public interface CertPathParameters extends java.lang.Cloneable {
+ method public Object clone();
}
public class CertPathValidator {
- ctor protected CertPathValidator(java.security.cert.CertPathValidatorSpi, java.security.Provider, java.lang.String);
- method public final java.lang.String getAlgorithm();
- method public static final java.lang.String getDefaultType();
- method public static java.security.cert.CertPathValidator getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static java.security.cert.CertPathValidator getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.cert.CertPathValidator getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ ctor protected CertPathValidator(java.security.cert.CertPathValidatorSpi, java.security.Provider, String);
+ method public final String getAlgorithm();
+ method public static final String getDefaultType();
+ method public static java.security.cert.CertPathValidator getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static java.security.cert.CertPathValidator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.cert.CertPathValidator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final java.security.cert.CertPathChecker getRevocationChecker();
method public final java.security.cert.CertPathValidatorResult validate(java.security.cert.CertPath, java.security.cert.CertPathParameters) throws java.security.cert.CertPathValidatorException, java.security.InvalidAlgorithmParameterException;
@@ -64364,19 +64584,17 @@ package java.security.cert {
public class CertPathValidatorException extends java.security.GeneralSecurityException {
ctor public CertPathValidatorException();
- ctor public CertPathValidatorException(java.lang.String);
- ctor public CertPathValidatorException(java.lang.Throwable);
- ctor public CertPathValidatorException(java.lang.String, java.lang.Throwable);
- ctor public CertPathValidatorException(java.lang.String, java.lang.Throwable, java.security.cert.CertPath, int);
- ctor public CertPathValidatorException(java.lang.String, java.lang.Throwable, java.security.cert.CertPath, int, java.security.cert.CertPathValidatorException.Reason);
+ ctor public CertPathValidatorException(String);
+ ctor public CertPathValidatorException(Throwable);
+ ctor public CertPathValidatorException(String, Throwable);
+ ctor public CertPathValidatorException(String, Throwable, java.security.cert.CertPath, int);
+ ctor public CertPathValidatorException(String, Throwable, java.security.cert.CertPath, int, java.security.cert.CertPathValidatorException.Reason);
method public java.security.cert.CertPath getCertPath();
method public int getIndex();
method public java.security.cert.CertPathValidatorException.Reason getReason();
}
- public static final class CertPathValidatorException.BasicReason extends java.lang.Enum implements java.security.cert.CertPathValidatorException.Reason {
- method public static java.security.cert.CertPathValidatorException.BasicReason valueOf(java.lang.String);
- method public static final java.security.cert.CertPathValidatorException.BasicReason[] values();
+ public enum CertPathValidatorException.BasicReason implements java.security.cert.CertPathValidatorException.Reason {
enum_constant public static final java.security.cert.CertPathValidatorException.BasicReason ALGORITHM_CONSTRAINED;
enum_constant public static final java.security.cert.CertPathValidatorException.BasicReason EXPIRED;
enum_constant public static final java.security.cert.CertPathValidatorException.BasicReason INVALID_SIGNATURE;
@@ -64386,11 +64604,11 @@ package java.security.cert {
enum_constant public static final java.security.cert.CertPathValidatorException.BasicReason UNSPECIFIED;
}
- public static abstract interface CertPathValidatorException.Reason implements java.io.Serializable {
+ public static interface CertPathValidatorException.Reason extends java.io.Serializable {
}
- public abstract interface CertPathValidatorResult implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
+ public interface CertPathValidatorResult extends java.lang.Cloneable {
+ method public Object clone();
}
public abstract class CertPathValidatorSpi {
@@ -64399,33 +64617,33 @@ package java.security.cert {
method public abstract java.security.cert.CertPathValidatorResult engineValidate(java.security.cert.CertPath, java.security.cert.CertPathParameters) throws java.security.cert.CertPathValidatorException, java.security.InvalidAlgorithmParameterException;
}
- public abstract interface CertSelector implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
- method public abstract boolean match(java.security.cert.Certificate);
+ public interface CertSelector extends java.lang.Cloneable {
+ method public Object clone();
+ method public boolean match(java.security.cert.Certificate);
}
public class CertStore {
- ctor protected CertStore(java.security.cert.CertStoreSpi, java.security.Provider, java.lang.String, java.security.cert.CertStoreParameters);
+ ctor protected CertStore(java.security.cert.CertStoreSpi, java.security.Provider, String, java.security.cert.CertStoreParameters);
method public final java.util.Collection<? extends java.security.cert.CRL> getCRLs(java.security.cert.CRLSelector) throws java.security.cert.CertStoreException;
method public final java.security.cert.CertStoreParameters getCertStoreParameters();
method public final java.util.Collection<? extends java.security.cert.Certificate> getCertificates(java.security.cert.CertSelector) throws java.security.cert.CertStoreException;
- method public static final java.lang.String getDefaultType();
- method public static java.security.cert.CertStore getInstance(java.lang.String, java.security.cert.CertStoreParameters) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
- method public static java.security.cert.CertStore getInstance(java.lang.String, java.security.cert.CertStoreParameters, java.lang.String) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static java.security.cert.CertStore getInstance(java.lang.String, java.security.cert.CertStoreParameters, java.security.Provider) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
+ method public static final String getDefaultType();
+ method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
+ method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters, String) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters, java.security.Provider) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
- method public final java.lang.String getType();
+ method public final String getType();
}
public class CertStoreException extends java.security.GeneralSecurityException {
ctor public CertStoreException();
- ctor public CertStoreException(java.lang.String);
- ctor public CertStoreException(java.lang.Throwable);
- ctor public CertStoreException(java.lang.String, java.lang.Throwable);
+ ctor public CertStoreException(String);
+ ctor public CertStoreException(Throwable);
+ ctor public CertStoreException(String, Throwable);
}
- public abstract interface CertStoreParameters implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
+ public interface CertStoreParameters extends java.lang.Cloneable {
+ method public Object clone();
}
public abstract class CertStoreSpi {
@@ -64435,56 +64653,56 @@ package java.security.cert {
}
public abstract class Certificate implements java.io.Serializable {
- ctor protected Certificate(java.lang.String);
+ ctor protected Certificate(String);
method public abstract byte[] getEncoded() throws java.security.cert.CertificateEncodingException;
method public abstract java.security.PublicKey getPublicKey();
- method public final java.lang.String getType();
- method public abstract java.lang.String toString();
+ method public final String getType();
+ method public abstract String toString();
method public abstract void verify(java.security.PublicKey) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
- method public abstract void verify(java.security.PublicKey, java.lang.String) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
+ method public abstract void verify(java.security.PublicKey, String) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
method public void verify(java.security.PublicKey, java.security.Provider) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.SignatureException;
- method protected java.lang.Object writeReplace() throws java.io.ObjectStreamException;
+ method protected Object writeReplace() throws java.io.ObjectStreamException;
}
protected static class Certificate.CertificateRep implements java.io.Serializable {
- ctor protected Certificate.CertificateRep(java.lang.String, byte[]);
- method protected java.lang.Object readResolve() throws java.io.ObjectStreamException;
+ ctor protected Certificate.CertificateRep(String, byte[]);
+ method protected Object readResolve() throws java.io.ObjectStreamException;
}
public class CertificateEncodingException extends java.security.cert.CertificateException {
ctor public CertificateEncodingException();
- ctor public CertificateEncodingException(java.lang.String);
- ctor public CertificateEncodingException(java.lang.String, java.lang.Throwable);
- ctor public CertificateEncodingException(java.lang.Throwable);
+ ctor public CertificateEncodingException(String);
+ ctor public CertificateEncodingException(String, Throwable);
+ ctor public CertificateEncodingException(Throwable);
}
public class CertificateException extends java.security.GeneralSecurityException {
ctor public CertificateException();
- ctor public CertificateException(java.lang.String);
- ctor public CertificateException(java.lang.String, java.lang.Throwable);
- ctor public CertificateException(java.lang.Throwable);
+ ctor public CertificateException(String);
+ ctor public CertificateException(String, Throwable);
+ ctor public CertificateException(Throwable);
}
public class CertificateExpiredException extends java.security.cert.CertificateException {
ctor public CertificateExpiredException();
- ctor public CertificateExpiredException(java.lang.String);
+ ctor public CertificateExpiredException(String);
}
public class CertificateFactory {
- ctor protected CertificateFactory(java.security.cert.CertificateFactorySpi, java.security.Provider, java.lang.String);
+ ctor protected CertificateFactory(java.security.cert.CertificateFactorySpi, java.security.Provider, String);
method public final java.security.cert.CRL generateCRL(java.io.InputStream) throws java.security.cert.CRLException;
method public final java.util.Collection<? extends java.security.cert.CRL> generateCRLs(java.io.InputStream) throws java.security.cert.CRLException;
method public final java.security.cert.CertPath generateCertPath(java.io.InputStream) throws java.security.cert.CertificateException;
- method public final java.security.cert.CertPath generateCertPath(java.io.InputStream, java.lang.String) throws java.security.cert.CertificateException;
+ method public final java.security.cert.CertPath generateCertPath(java.io.InputStream, String) throws java.security.cert.CertificateException;
method public final java.security.cert.CertPath generateCertPath(java.util.List<? extends java.security.cert.Certificate>) throws java.security.cert.CertificateException;
method public final java.security.cert.Certificate generateCertificate(java.io.InputStream) throws java.security.cert.CertificateException;
method public final java.util.Collection<? extends java.security.cert.Certificate> generateCertificates(java.io.InputStream) throws java.security.cert.CertificateException;
method public final java.util.Iterator<java.lang.String> getCertPathEncodings();
- method public static final java.security.cert.CertificateFactory getInstance(java.lang.String) throws java.security.cert.CertificateException;
- method public static final java.security.cert.CertificateFactory getInstance(java.lang.String, java.lang.String) throws java.security.cert.CertificateException, java.security.NoSuchProviderException;
- method public static final java.security.cert.CertificateFactory getInstance(java.lang.String, java.security.Provider) throws java.security.cert.CertificateException;
+ method public static final java.security.cert.CertificateFactory getInstance(String) throws java.security.cert.CertificateException;
+ method public static final java.security.cert.CertificateFactory getInstance(String, String) throws java.security.cert.CertificateException, java.security.NoSuchProviderException;
+ method public static final java.security.cert.CertificateFactory getInstance(String, java.security.Provider) throws java.security.cert.CertificateException;
method public final java.security.Provider getProvider();
- method public final java.lang.String getType();
+ method public final String getType();
}
public abstract class CertificateFactorySpi {
@@ -64492,7 +64710,7 @@ package java.security.cert {
method public abstract java.security.cert.CRL engineGenerateCRL(java.io.InputStream) throws java.security.cert.CRLException;
method public abstract java.util.Collection<? extends java.security.cert.CRL> engineGenerateCRLs(java.io.InputStream) throws java.security.cert.CRLException;
method public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream) throws java.security.cert.CertificateException;
- method public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, java.lang.String) throws java.security.cert.CertificateException;
+ method public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, String) throws java.security.cert.CertificateException;
method public java.security.cert.CertPath engineGenerateCertPath(java.util.List<? extends java.security.cert.Certificate>) throws java.security.cert.CertificateException;
method public abstract java.security.cert.Certificate engineGenerateCertificate(java.io.InputStream) throws java.security.cert.CertificateException;
method public abstract java.util.Collection<? extends java.security.cert.Certificate> engineGenerateCertificates(java.io.InputStream) throws java.security.cert.CertificateException;
@@ -64501,20 +64719,20 @@ package java.security.cert {
public class CertificateNotYetValidException extends java.security.cert.CertificateException {
ctor public CertificateNotYetValidException();
- ctor public CertificateNotYetValidException(java.lang.String);
+ ctor public CertificateNotYetValidException(String);
}
public class CertificateParsingException extends java.security.cert.CertificateException {
ctor public CertificateParsingException();
- ctor public CertificateParsingException(java.lang.String);
- ctor public CertificateParsingException(java.lang.String, java.lang.Throwable);
- ctor public CertificateParsingException(java.lang.Throwable);
+ ctor public CertificateParsingException(String);
+ ctor public CertificateParsingException(String, Throwable);
+ ctor public CertificateParsingException(Throwable);
}
public class CertificateRevokedException extends java.security.cert.CertificateException {
- ctor public CertificateRevokedException(java.util.Date, java.security.cert.CRLReason, javax.security.auth.x500.X500Principal, java.util.Map<java.lang.String, java.security.cert.Extension>);
+ ctor public CertificateRevokedException(java.util.Date, java.security.cert.CRLReason, javax.security.auth.x500.X500Principal, java.util.Map<java.lang.String,java.security.cert.Extension>);
method public javax.security.auth.x500.X500Principal getAuthorityName();
- method public java.util.Map<java.lang.String, java.security.cert.Extension> getExtensions();
+ method public java.util.Map<java.lang.String,java.security.cert.Extension> getExtensions();
method public java.util.Date getInvalidityDate();
method public java.util.Date getRevocationDate();
method public java.security.cert.CRLReason getRevocationReason();
@@ -64523,24 +64741,24 @@ package java.security.cert {
public class CollectionCertStoreParameters implements java.security.cert.CertStoreParameters {
ctor public CollectionCertStoreParameters(java.util.Collection<?>);
ctor public CollectionCertStoreParameters();
- method public java.lang.Object clone();
+ method public Object clone();
method public java.util.Collection<?> getCollection();
}
- public abstract interface Extension {
- method public abstract void encode(java.io.OutputStream) throws java.io.IOException;
- method public abstract java.lang.String getId();
- method public abstract byte[] getValue();
- method public abstract boolean isCritical();
+ public interface Extension {
+ method public void encode(java.io.OutputStream) throws java.io.IOException;
+ method public String getId();
+ method public byte[] getValue();
+ method public boolean isCritical();
}
public class LDAPCertStoreParameters implements java.security.cert.CertStoreParameters {
- ctor public LDAPCertStoreParameters(java.lang.String, int);
- ctor public LDAPCertStoreParameters(java.lang.String);
+ ctor public LDAPCertStoreParameters(String, int);
+ ctor public LDAPCertStoreParameters(String);
ctor public LDAPCertStoreParameters();
- method public java.lang.Object clone();
+ method public Object clone();
method public int getPort();
- method public java.lang.String getServerName();
+ method public String getServerName();
}
public class PKIXBuilderParameters extends java.security.cert.PKIXParameters {
@@ -64559,13 +64777,13 @@ package java.security.cert {
ctor protected PKIXCertPathChecker();
method public abstract void check(java.security.cert.Certificate, java.util.Collection<java.lang.String>) throws java.security.cert.CertPathValidatorException;
method public void check(java.security.cert.Certificate) throws java.security.cert.CertPathValidatorException;
- method public java.lang.Object clone();
+ method public Object clone();
method public abstract java.util.Set<java.lang.String> getSupportedExtensions();
}
public class PKIXCertPathValidatorResult implements java.security.cert.CertPathValidatorResult {
ctor public PKIXCertPathValidatorResult(java.security.cert.TrustAnchor, java.security.cert.PolicyNode, java.security.PublicKey);
- method public java.lang.Object clone();
+ method public Object clone();
method public java.security.cert.PolicyNode getPolicyTree();
method public java.security.PublicKey getPublicKey();
method public java.security.cert.TrustAnchor getTrustAnchor();
@@ -64576,13 +64794,13 @@ package java.security.cert {
ctor public PKIXParameters(java.security.KeyStore) throws java.security.InvalidAlgorithmParameterException, java.security.KeyStoreException;
method public void addCertPathChecker(java.security.cert.PKIXCertPathChecker);
method public void addCertStore(java.security.cert.CertStore);
- method public java.lang.Object clone();
+ method public Object clone();
method public java.util.List<java.security.cert.PKIXCertPathChecker> getCertPathCheckers();
method public java.util.List<java.security.cert.CertStore> getCertStores();
method public java.util.Date getDate();
method public java.util.Set<java.lang.String> getInitialPolicies();
method public boolean getPolicyQualifiersRejected();
- method public java.lang.String getSigProvider();
+ method public String getSigProvider();
method public java.security.cert.CertSelector getTargetCertConstraints();
method public java.util.Set<java.security.cert.TrustAnchor> getTrustAnchors();
method public boolean isAnyPolicyInhibited();
@@ -64598,14 +64816,12 @@ package java.security.cert {
method public void setPolicyMappingInhibited(boolean);
method public void setPolicyQualifiersRejected(boolean);
method public void setRevocationEnabled(boolean);
- method public void setSigProvider(java.lang.String);
+ method public void setSigProvider(String);
method public void setTargetCertConstraints(java.security.cert.CertSelector);
method public void setTrustAnchors(java.util.Set<java.security.cert.TrustAnchor>) throws java.security.InvalidAlgorithmParameterException;
}
- public final class PKIXReason extends java.lang.Enum implements java.security.cert.CertPathValidatorException.Reason {
- method public static java.security.cert.PKIXReason valueOf(java.lang.String);
- method public static final java.security.cert.PKIXReason[] values();
+ public enum PKIXReason implements java.security.cert.CertPathValidatorException.Reason {
enum_constant public static final java.security.cert.PKIXReason INVALID_KEY_USAGE;
enum_constant public static final java.security.cert.PKIXReason INVALID_NAME;
enum_constant public static final java.security.cert.PKIXReason INVALID_POLICY;
@@ -64622,48 +64838,46 @@ package java.security.cert {
method public java.util.List<java.security.cert.Extension> getOcspExtensions();
method public java.net.URI getOcspResponder();
method public java.security.cert.X509Certificate getOcspResponderCert();
- method public java.util.Map<java.security.cert.X509Certificate, byte[]> getOcspResponses();
+ method public java.util.Map<java.security.cert.X509Certificate,byte[]> getOcspResponses();
method public java.util.Set<java.security.cert.PKIXRevocationChecker.Option> getOptions();
method public abstract java.util.List<java.security.cert.CertPathValidatorException> getSoftFailExceptions();
method public void setOcspExtensions(java.util.List<java.security.cert.Extension>);
method public void setOcspResponder(java.net.URI);
method public void setOcspResponderCert(java.security.cert.X509Certificate);
- method public void setOcspResponses(java.util.Map<java.security.cert.X509Certificate, byte[]>);
+ method public void setOcspResponses(java.util.Map<java.security.cert.X509Certificate,byte[]>);
method public void setOptions(java.util.Set<java.security.cert.PKIXRevocationChecker.Option>);
}
- public static final class PKIXRevocationChecker.Option extends java.lang.Enum {
- method public static java.security.cert.PKIXRevocationChecker.Option valueOf(java.lang.String);
- method public static final java.security.cert.PKIXRevocationChecker.Option[] values();
+ public enum PKIXRevocationChecker.Option {
enum_constant public static final java.security.cert.PKIXRevocationChecker.Option NO_FALLBACK;
enum_constant public static final java.security.cert.PKIXRevocationChecker.Option ONLY_END_ENTITY;
enum_constant public static final java.security.cert.PKIXRevocationChecker.Option PREFER_CRLS;
enum_constant public static final java.security.cert.PKIXRevocationChecker.Option SOFT_FAIL;
}
- public abstract interface PolicyNode {
- method public abstract java.util.Iterator<? extends java.security.cert.PolicyNode> getChildren();
- method public abstract int getDepth();
- method public abstract java.util.Set<java.lang.String> getExpectedPolicies();
- method public abstract java.security.cert.PolicyNode getParent();
- method public abstract java.util.Set<? extends java.security.cert.PolicyQualifierInfo> getPolicyQualifiers();
- method public abstract java.lang.String getValidPolicy();
- method public abstract boolean isCritical();
+ public interface PolicyNode {
+ method public java.util.Iterator<? extends java.security.cert.PolicyNode> getChildren();
+ method public int getDepth();
+ method public java.util.Set<java.lang.String> getExpectedPolicies();
+ method public java.security.cert.PolicyNode getParent();
+ method public java.util.Set<? extends java.security.cert.PolicyQualifierInfo> getPolicyQualifiers();
+ method public String getValidPolicy();
+ method public boolean isCritical();
}
public class PolicyQualifierInfo {
ctor public PolicyQualifierInfo(byte[]) throws java.io.IOException;
method public final byte[] getEncoded();
method public final byte[] getPolicyQualifier();
- method public final java.lang.String getPolicyQualifierId();
+ method public final String getPolicyQualifierId();
}
public class TrustAnchor {
ctor public TrustAnchor(java.security.cert.X509Certificate, byte[]);
ctor public TrustAnchor(javax.security.auth.x500.X500Principal, java.security.PublicKey, byte[]);
- ctor public TrustAnchor(java.lang.String, java.security.PublicKey, byte[]);
+ ctor public TrustAnchor(String, java.security.PublicKey, byte[]);
method public final javax.security.auth.x500.X500Principal getCA();
- method public final java.lang.String getCAName();
+ method public final String getCAName();
method public final java.security.PublicKey getCAPublicKey();
method public final byte[] getNameConstraints();
method public final java.security.cert.X509Certificate getTrustedCert();
@@ -64678,15 +64892,15 @@ package java.security.cert {
method public abstract java.security.cert.X509CRLEntry getRevokedCertificate(java.math.BigInteger);
method public java.security.cert.X509CRLEntry getRevokedCertificate(java.security.cert.X509Certificate);
method public abstract java.util.Set<? extends java.security.cert.X509CRLEntry> getRevokedCertificates();
- method public abstract java.lang.String getSigAlgName();
- method public abstract java.lang.String getSigAlgOID();
+ method public abstract String getSigAlgName();
+ method public abstract String getSigAlgOID();
method public abstract byte[] getSigAlgParams();
method public abstract byte[] getSignature();
method public abstract byte[] getTBSCertList() throws java.security.cert.CRLException;
method public abstract java.util.Date getThisUpdate();
method public abstract int getVersion();
method public abstract void verify(java.security.PublicKey) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
- method public abstract void verify(java.security.PublicKey, java.lang.String) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
+ method public abstract void verify(java.security.PublicKey, String) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
method public void verify(java.security.PublicKey, java.security.Provider) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.SignatureException;
}
@@ -64698,15 +64912,15 @@ package java.security.cert {
method public java.security.cert.CRLReason getRevocationReason();
method public abstract java.math.BigInteger getSerialNumber();
method public abstract boolean hasExtensions();
- method public abstract java.lang.String toString();
+ method public abstract String toString();
}
public class X509CRLSelector implements java.security.cert.CRLSelector {
ctor public X509CRLSelector();
method public void addIssuer(javax.security.auth.x500.X500Principal);
- method public void addIssuerName(java.lang.String) throws java.io.IOException;
+ method public void addIssuerName(String) throws java.io.IOException;
method public void addIssuerName(byte[]) throws java.io.IOException;
- method public java.lang.Object clone();
+ method public Object clone();
method public java.security.cert.X509Certificate getCertificateChecking();
method public java.util.Date getDateAndTime();
method public java.util.Collection<java.lang.Object> getIssuerNames();
@@ -64724,11 +64938,11 @@ package java.security.cert {
public class X509CertSelector implements java.security.cert.CertSelector {
ctor public X509CertSelector();
- method public void addPathToName(int, java.lang.String) throws java.io.IOException;
+ method public void addPathToName(int, String) throws java.io.IOException;
method public void addPathToName(int, byte[]) throws java.io.IOException;
- method public void addSubjectAlternativeName(int, java.lang.String) throws java.io.IOException;
+ method public void addSubjectAlternativeName(int, String) throws java.io.IOException;
method public void addSubjectAlternativeName(int, byte[]) throws java.io.IOException;
- method public java.lang.Object clone();
+ method public Object clone();
method public byte[] getAuthorityKeyIdentifier();
method public int getBasicConstraints();
method public java.security.cert.X509Certificate getCertificate();
@@ -64736,7 +64950,7 @@ package java.security.cert {
method public java.util.Set<java.lang.String> getExtendedKeyUsage();
method public javax.security.auth.x500.X500Principal getIssuer();
method public byte[] getIssuerAsBytes() throws java.io.IOException;
- method public java.lang.String getIssuerAsString();
+ method public String getIssuerAsString();
method public boolean[] getKeyUsage();
method public boolean getMatchAllSubjectAltNames();
method public byte[] getNameConstraints();
@@ -64747,10 +64961,10 @@ package java.security.cert {
method public javax.security.auth.x500.X500Principal getSubject();
method public java.util.Collection<java.util.List<?>> getSubjectAlternativeNames();
method public byte[] getSubjectAsBytes() throws java.io.IOException;
- method public java.lang.String getSubjectAsString();
+ method public String getSubjectAsString();
method public byte[] getSubjectKeyIdentifier();
method public java.security.PublicKey getSubjectPublicKey();
- method public java.lang.String getSubjectPublicKeyAlgID();
+ method public String getSubjectPublicKeyAlgID();
method public boolean match(java.security.cert.Certificate);
method public void setAuthorityKeyIdentifier(byte[]);
method public void setBasicConstraints(int);
@@ -64758,7 +64972,7 @@ package java.security.cert {
method public void setCertificateValid(java.util.Date);
method public void setExtendedKeyUsage(java.util.Set<java.lang.String>) throws java.io.IOException;
method public void setIssuer(javax.security.auth.x500.X500Principal);
- method public void setIssuer(java.lang.String) throws java.io.IOException;
+ method public void setIssuer(String) throws java.io.IOException;
method public void setIssuer(byte[]) throws java.io.IOException;
method public void setKeyUsage(boolean[]);
method public void setMatchAllSubjectAltNames(boolean);
@@ -64768,13 +64982,13 @@ package java.security.cert {
method public void setPrivateKeyValid(java.util.Date);
method public void setSerialNumber(java.math.BigInteger);
method public void setSubject(javax.security.auth.x500.X500Principal);
- method public void setSubject(java.lang.String) throws java.io.IOException;
+ method public void setSubject(String) throws java.io.IOException;
method public void setSubject(byte[]) throws java.io.IOException;
method public void setSubjectAlternativeNames(java.util.Collection<java.util.List<?>>) throws java.io.IOException;
method public void setSubjectKeyIdentifier(byte[]);
method public void setSubjectPublicKey(java.security.PublicKey);
method public void setSubjectPublicKey(byte[]) throws java.io.IOException;
- method public void setSubjectPublicKeyAlgID(java.lang.String) throws java.io.IOException;
+ method public void setSubjectPublicKeyAlgID(String) throws java.io.IOException;
}
public abstract class X509Certificate extends java.security.cert.Certificate implements java.security.cert.X509Extension {
@@ -64791,8 +65005,8 @@ package java.security.cert {
method public abstract java.util.Date getNotAfter();
method public abstract java.util.Date getNotBefore();
method public abstract java.math.BigInteger getSerialNumber();
- method public abstract java.lang.String getSigAlgName();
- method public abstract java.lang.String getSigAlgOID();
+ method public abstract String getSigAlgName();
+ method public abstract String getSigAlgOID();
method public abstract byte[] getSigAlgParams();
method public abstract byte[] getSignature();
method public java.util.Collection<java.util.List<?>> getSubjectAlternativeNames() throws java.security.cert.CertificateParsingException;
@@ -64803,88 +65017,88 @@ package java.security.cert {
method public abstract int getVersion();
}
- public abstract interface X509Extension {
- method public abstract java.util.Set<java.lang.String> getCriticalExtensionOIDs();
- method public abstract byte[] getExtensionValue(java.lang.String);
- method public abstract java.util.Set<java.lang.String> getNonCriticalExtensionOIDs();
- method public abstract boolean hasUnsupportedCriticalExtension();
+ public interface X509Extension {
+ method public java.util.Set<java.lang.String> getCriticalExtensionOIDs();
+ method public byte[] getExtensionValue(String);
+ method public java.util.Set<java.lang.String> getNonCriticalExtensionOIDs();
+ method public boolean hasUnsupportedCriticalExtension();
}
}
package java.security.interfaces {
- public abstract interface DSAKey {
- method public abstract java.security.interfaces.DSAParams getParams();
+ public interface DSAKey {
+ method public java.security.interfaces.DSAParams getParams();
}
- public abstract interface DSAKeyPairGenerator {
- method public abstract void initialize(java.security.interfaces.DSAParams, java.security.SecureRandom) throws java.security.InvalidParameterException;
- method public abstract void initialize(int, boolean, java.security.SecureRandom) throws java.security.InvalidParameterException;
+ public interface DSAKeyPairGenerator {
+ method public void initialize(java.security.interfaces.DSAParams, java.security.SecureRandom) throws java.security.InvalidParameterException;
+ method public void initialize(int, boolean, java.security.SecureRandom) throws java.security.InvalidParameterException;
}
- public abstract interface DSAParams {
- method public abstract java.math.BigInteger getG();
- method public abstract java.math.BigInteger getP();
- method public abstract java.math.BigInteger getQ();
+ public interface DSAParams {
+ method public java.math.BigInteger getG();
+ method public java.math.BigInteger getP();
+ method public java.math.BigInteger getQ();
}
- public abstract interface DSAPrivateKey implements java.security.interfaces.DSAKey java.security.PrivateKey {
- method public abstract java.math.BigInteger getX();
+ public interface DSAPrivateKey extends java.security.interfaces.DSAKey java.security.PrivateKey {
+ method public java.math.BigInteger getX();
field public static final long serialVersionUID = 7776497482533790279L; // 0x6bebab423b256247L
}
- public abstract interface DSAPublicKey implements java.security.interfaces.DSAKey java.security.PublicKey {
- method public abstract java.math.BigInteger getY();
+ public interface DSAPublicKey extends java.security.interfaces.DSAKey java.security.PublicKey {
+ method public java.math.BigInteger getY();
field public static final long serialVersionUID = 1234526332779022332L; // 0x1121eb28ab28c7fcL
}
- public abstract interface ECKey {
- method public abstract java.security.spec.ECParameterSpec getParams();
+ public interface ECKey {
+ method public java.security.spec.ECParameterSpec getParams();
}
- public abstract interface ECPrivateKey implements java.security.interfaces.ECKey java.security.PrivateKey {
- method public abstract java.math.BigInteger getS();
+ public interface ECPrivateKey extends java.security.PrivateKey java.security.interfaces.ECKey {
+ method public java.math.BigInteger getS();
field public static final long serialVersionUID = -7896394956925609184L; // 0x926a5e9fa2435b20L
}
- public abstract interface ECPublicKey implements java.security.interfaces.ECKey java.security.PublicKey {
- method public abstract java.security.spec.ECPoint getW();
+ public interface ECPublicKey extends java.security.PublicKey java.security.interfaces.ECKey {
+ method public java.security.spec.ECPoint getW();
field public static final long serialVersionUID = -3314988629879632826L; // 0xd1fecb679990cc46L
}
- public abstract interface RSAKey {
- method public abstract java.math.BigInteger getModulus();
+ public interface RSAKey {
+ method public java.math.BigInteger getModulus();
}
- public abstract interface RSAMultiPrimePrivateCrtKey implements java.security.interfaces.RSAPrivateKey {
- method public abstract java.math.BigInteger getCrtCoefficient();
- method public abstract java.security.spec.RSAOtherPrimeInfo[] getOtherPrimeInfo();
- method public abstract java.math.BigInteger getPrimeExponentP();
- method public abstract java.math.BigInteger getPrimeExponentQ();
- method public abstract java.math.BigInteger getPrimeP();
- method public abstract java.math.BigInteger getPrimeQ();
- method public abstract java.math.BigInteger getPublicExponent();
+ public interface RSAMultiPrimePrivateCrtKey extends java.security.interfaces.RSAPrivateKey {
+ method public java.math.BigInteger getCrtCoefficient();
+ method public java.security.spec.RSAOtherPrimeInfo[] getOtherPrimeInfo();
+ method public java.math.BigInteger getPrimeExponentP();
+ method public java.math.BigInteger getPrimeExponentQ();
+ method public java.math.BigInteger getPrimeP();
+ method public java.math.BigInteger getPrimeQ();
+ method public java.math.BigInteger getPublicExponent();
field public static final long serialVersionUID = 618058533534628008L; // 0x893c8f62dbaf8a8L
}
- public abstract interface RSAPrivateCrtKey implements java.security.interfaces.RSAPrivateKey {
- method public abstract java.math.BigInteger getCrtCoefficient();
- method public abstract java.math.BigInteger getPrimeExponentP();
- method public abstract java.math.BigInteger getPrimeExponentQ();
- method public abstract java.math.BigInteger getPrimeP();
- method public abstract java.math.BigInteger getPrimeQ();
- method public abstract java.math.BigInteger getPublicExponent();
+ public interface RSAPrivateCrtKey extends java.security.interfaces.RSAPrivateKey {
+ method public java.math.BigInteger getCrtCoefficient();
+ method public java.math.BigInteger getPrimeExponentP();
+ method public java.math.BigInteger getPrimeExponentQ();
+ method public java.math.BigInteger getPrimeP();
+ method public java.math.BigInteger getPrimeQ();
+ method public java.math.BigInteger getPublicExponent();
field public static final long serialVersionUID = -5682214253527700368L; // 0xb124b83df8d1ec70L
}
- public abstract interface RSAPrivateKey implements java.security.PrivateKey java.security.interfaces.RSAKey {
- method public abstract java.math.BigInteger getPrivateExponent();
+ public interface RSAPrivateKey extends java.security.PrivateKey java.security.interfaces.RSAKey {
+ method public java.math.BigInteger getPrivateExponent();
field public static final long serialVersionUID = 5187144804936595022L; // 0x47fc70b7a8c2364eL
}
- public abstract interface RSAPublicKey implements java.security.PublicKey java.security.interfaces.RSAKey {
- method public abstract java.math.BigInteger getPublicExponent();
+ public interface RSAPublicKey extends java.security.PublicKey java.security.interfaces.RSAKey {
+ method public java.math.BigInteger getPublicExponent();
field public static final long serialVersionUID = -8727434096241101194L; // 0x86e1ecedeceab676L
}
@@ -64892,7 +65106,7 @@ package java.security.interfaces {
package java.security.spec {
- public abstract interface AlgorithmParameterSpec {
+ public interface AlgorithmParameterSpec {
}
public class DSAParameterSpec implements java.security.spec.AlgorithmParameterSpec java.security.interfaces.DSAParams {
@@ -64918,8 +65132,8 @@ package java.security.spec {
method public java.math.BigInteger getY();
}
- public abstract interface ECField {
- method public abstract int getFieldSize();
+ public interface ECField {
+ method public int getFieldSize();
}
public class ECFieldF2m implements java.security.spec.ECField {
@@ -64939,8 +65153,8 @@ package java.security.spec {
}
public class ECGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
- ctor public ECGenParameterSpec(java.lang.String);
- method public java.lang.String getName();
+ ctor public ECGenParameterSpec(String);
+ method public String getName();
}
public class ECParameterSpec implements java.security.spec.AlgorithmParameterSpec {
@@ -64982,27 +65196,27 @@ package java.security.spec {
public abstract class EncodedKeySpec implements java.security.spec.KeySpec {
ctor public EncodedKeySpec(byte[]);
method public byte[] getEncoded();
- method public abstract java.lang.String getFormat();
+ method public abstract String getFormat();
}
public class InvalidKeySpecException extends java.security.GeneralSecurityException {
ctor public InvalidKeySpecException();
- ctor public InvalidKeySpecException(java.lang.String);
- ctor public InvalidKeySpecException(java.lang.String, java.lang.Throwable);
- ctor public InvalidKeySpecException(java.lang.Throwable);
+ ctor public InvalidKeySpecException(String);
+ ctor public InvalidKeySpecException(String, Throwable);
+ ctor public InvalidKeySpecException(Throwable);
}
public class InvalidParameterSpecException extends java.security.GeneralSecurityException {
ctor public InvalidParameterSpecException();
- ctor public InvalidParameterSpecException(java.lang.String);
+ ctor public InvalidParameterSpecException(String);
}
- public abstract interface KeySpec {
+ public interface KeySpec {
}
public class MGF1ParameterSpec implements java.security.spec.AlgorithmParameterSpec {
- ctor public MGF1ParameterSpec(java.lang.String);
- method public java.lang.String getDigestAlgorithm();
+ ctor public MGF1ParameterSpec(String);
+ method public String getDigestAlgorithm();
field public static final java.security.spec.MGF1ParameterSpec SHA1;
field public static final java.security.spec.MGF1ParameterSpec SHA224;
field public static final java.security.spec.MGF1ParameterSpec SHA256;
@@ -65012,14 +65226,14 @@ package java.security.spec {
public class PKCS8EncodedKeySpec extends java.security.spec.EncodedKeySpec {
ctor public PKCS8EncodedKeySpec(byte[]);
- method public final java.lang.String getFormat();
+ method public final String getFormat();
}
public class PSSParameterSpec implements java.security.spec.AlgorithmParameterSpec {
- ctor public PSSParameterSpec(java.lang.String, java.lang.String, java.security.spec.AlgorithmParameterSpec, int, int);
+ ctor public PSSParameterSpec(String, String, java.security.spec.AlgorithmParameterSpec, int, int);
ctor public PSSParameterSpec(int);
- method public java.lang.String getDigestAlgorithm();
- method public java.lang.String getMGFAlgorithm();
+ method public String getDigestAlgorithm();
+ method public String getMGFAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getMGFParameters();
method public int getSaltLength();
method public int getTrailerField();
@@ -65076,242 +65290,240 @@ package java.security.spec {
public class X509EncodedKeySpec extends java.security.spec.EncodedKeySpec {
ctor public X509EncodedKeySpec(byte[]);
- method public final java.lang.String getFormat();
+ method public final String getFormat();
}
}
package java.sql {
- public abstract interface Array {
- method public abstract void free() throws java.sql.SQLException;
- method public abstract java.lang.Object getArray() throws java.sql.SQLException;
- method public abstract java.lang.Object getArray(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.lang.Object getArray(long, int) throws java.sql.SQLException;
- method public abstract java.lang.Object getArray(long, int, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract int getBaseType() throws java.sql.SQLException;
- method public abstract java.lang.String getBaseTypeName() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getResultSet() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getResultSet(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getResultSet(long, int) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getResultSet(long, int, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
+ public interface Array {
+ method public void free() throws java.sql.SQLException;
+ method public Object getArray() throws java.sql.SQLException;
+ method public Object getArray(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public Object getArray(long, int) throws java.sql.SQLException;
+ method public Object getArray(long, int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public int getBaseType() throws java.sql.SQLException;
+ method public String getBaseTypeName() throws java.sql.SQLException;
+ method public java.sql.ResultSet getResultSet() throws java.sql.SQLException;
+ method public java.sql.ResultSet getResultSet(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public java.sql.ResultSet getResultSet(long, int) throws java.sql.SQLException;
+ method public java.sql.ResultSet getResultSet(long, int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
}
public class BatchUpdateException extends java.sql.SQLException {
- ctor public BatchUpdateException(java.lang.String, java.lang.String, int, int[]);
- ctor public BatchUpdateException(java.lang.String, java.lang.String, int[]);
- ctor public BatchUpdateException(java.lang.String, int[]);
+ ctor public BatchUpdateException(String, String, int, int[]);
+ ctor public BatchUpdateException(String, String, int[]);
+ ctor public BatchUpdateException(String, int[]);
ctor public BatchUpdateException(int[]);
ctor public BatchUpdateException();
- ctor public BatchUpdateException(java.lang.Throwable);
- ctor public BatchUpdateException(int[], java.lang.Throwable);
- ctor public BatchUpdateException(java.lang.String, int[], java.lang.Throwable);
- ctor public BatchUpdateException(java.lang.String, java.lang.String, int[], java.lang.Throwable);
- ctor public BatchUpdateException(java.lang.String, java.lang.String, int, int[], java.lang.Throwable);
+ ctor public BatchUpdateException(Throwable);
+ ctor public BatchUpdateException(int[], Throwable);
+ ctor public BatchUpdateException(String, int[], Throwable);
+ ctor public BatchUpdateException(String, String, int[], Throwable);
+ ctor public BatchUpdateException(String, String, int, int[], Throwable);
method public int[] getUpdateCounts();
}
- public abstract interface Blob {
- method public abstract void free() throws java.sql.SQLException;
- method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException;
- method public abstract java.io.InputStream getBinaryStream(long, long) throws java.sql.SQLException;
- method public abstract byte[] getBytes(long, int) throws java.sql.SQLException;
- method public abstract long length() throws java.sql.SQLException;
- method public abstract long position(byte[], long) throws java.sql.SQLException;
- method public abstract long position(java.sql.Blob, long) throws java.sql.SQLException;
- method public abstract java.io.OutputStream setBinaryStream(long) throws java.sql.SQLException;
- method public abstract int setBytes(long, byte[]) throws java.sql.SQLException;
- method public abstract int setBytes(long, byte[], int, int) throws java.sql.SQLException;
- method public abstract void truncate(long) throws java.sql.SQLException;
- }
-
- public abstract interface CallableStatement implements java.sql.PreparedStatement {
- method public abstract java.sql.Array getArray(int) throws java.sql.SQLException;
- method public abstract java.sql.Array getArray(java.lang.String) throws java.sql.SQLException;
- method public abstract deprecated java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
- method public abstract java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
- method public abstract java.math.BigDecimal getBigDecimal(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Blob getBlob(int) throws java.sql.SQLException;
- method public abstract java.sql.Blob getBlob(java.lang.String) throws java.sql.SQLException;
- method public abstract boolean getBoolean(int) throws java.sql.SQLException;
- method public abstract boolean getBoolean(java.lang.String) throws java.sql.SQLException;
- method public abstract byte getByte(int) throws java.sql.SQLException;
- method public abstract byte getByte(java.lang.String) throws java.sql.SQLException;
- method public abstract byte[] getBytes(int) throws java.sql.SQLException;
- method public abstract byte[] getBytes(java.lang.String) throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream(int) throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Clob getClob(int) throws java.sql.SQLException;
- method public abstract java.sql.Clob getClob(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(int) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract double getDouble(int) throws java.sql.SQLException;
- method public abstract double getDouble(java.lang.String) throws java.sql.SQLException;
- method public abstract float getFloat(int) throws java.sql.SQLException;
- method public abstract float getFloat(java.lang.String) throws java.sql.SQLException;
- method public abstract int getInt(int) throws java.sql.SQLException;
- method public abstract int getInt(java.lang.String) throws java.sql.SQLException;
- method public abstract long getLong(int) throws java.sql.SQLException;
- method public abstract long getLong(java.lang.String) throws java.sql.SQLException;
- method public abstract java.io.Reader getNCharacterStream(int) throws java.sql.SQLException;
- method public abstract java.io.Reader getNCharacterStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.NClob getNClob(int) throws java.sql.SQLException;
- method public abstract java.sql.NClob getNClob(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getNString(int) throws java.sql.SQLException;
- method public abstract java.lang.String getNString(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(int) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(int, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(java.lang.String, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.sql.Ref getRef(int) throws java.sql.SQLException;
- method public abstract java.sql.Ref getRef(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.RowId getRowId(int) throws java.sql.SQLException;
- method public abstract java.sql.RowId getRowId(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.SQLXML getSQLXML(int) throws java.sql.SQLException;
- method public abstract java.sql.SQLXML getSQLXML(java.lang.String) throws java.sql.SQLException;
- method public abstract short getShort(int) throws java.sql.SQLException;
- method public abstract short getShort(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getString(int) throws java.sql.SQLException;
- method public abstract java.lang.String getString(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(int) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.net.URL getURL(int) throws java.sql.SQLException;
- method public abstract java.net.URL getURL(java.lang.String) throws java.sql.SQLException;
- method public abstract void registerOutParameter(int, int) throws java.sql.SQLException;
- method public abstract void registerOutParameter(int, int, int) throws java.sql.SQLException;
- method public abstract void registerOutParameter(int, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void registerOutParameter(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void registerOutParameter(java.lang.String, int, int) throws java.sql.SQLException;
- method public abstract void registerOutParameter(java.lang.String, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setAsciiStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setAsciiStream(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setAsciiStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBigDecimal(java.lang.String, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void setBinaryStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setBinaryStream(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBinaryStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBoolean(java.lang.String, boolean) throws java.sql.SQLException;
- method public abstract void setByte(java.lang.String, byte) throws java.sql.SQLException;
- method public abstract void setBytes(java.lang.String, byte[]) throws java.sql.SQLException;
- method public abstract void setCharacterStream(java.lang.String, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void setCharacterStream(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setDate(java.lang.String, java.sql.Date) throws java.sql.SQLException;
- method public abstract void setDate(java.lang.String, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setDouble(java.lang.String, double) throws java.sql.SQLException;
- method public abstract void setFloat(java.lang.String, float) throws java.sql.SQLException;
- method public abstract void setInt(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void setLong(java.lang.String, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void setNull(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void setNull(java.lang.String, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object, int, int) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object) throws java.sql.SQLException;
- method public abstract void setRowId(java.lang.String, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void setSQLXML(java.lang.String, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void setShort(java.lang.String, short) throws java.sql.SQLException;
- method public abstract void setString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void setTime(java.lang.String, java.sql.Time) throws java.sql.SQLException;
- method public abstract void setTime(java.lang.String, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTimestamp(java.lang.String, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void setTimestamp(java.lang.String, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setURL(java.lang.String, java.net.URL) throws java.sql.SQLException;
- method public abstract boolean wasNull() throws java.sql.SQLException;
- }
-
- public final class ClientInfoStatus extends java.lang.Enum {
- method public static java.sql.ClientInfoStatus valueOf(java.lang.String);
- method public static final java.sql.ClientInfoStatus[] values();
+ public interface Blob {
+ method public void free() throws java.sql.SQLException;
+ method public java.io.InputStream getBinaryStream() throws java.sql.SQLException;
+ method public java.io.InputStream getBinaryStream(long, long) throws java.sql.SQLException;
+ method public byte[] getBytes(long, int) throws java.sql.SQLException;
+ method public long length() throws java.sql.SQLException;
+ method public long position(byte[], long) throws java.sql.SQLException;
+ method public long position(java.sql.Blob, long) throws java.sql.SQLException;
+ method public java.io.OutputStream setBinaryStream(long) throws java.sql.SQLException;
+ method public int setBytes(long, byte[]) throws java.sql.SQLException;
+ method public int setBytes(long, byte[], int, int) throws java.sql.SQLException;
+ method public void truncate(long) throws java.sql.SQLException;
+ }
+
+ public interface CallableStatement extends java.sql.PreparedStatement {
+ method public java.sql.Array getArray(int) throws java.sql.SQLException;
+ method public java.sql.Array getArray(String) throws java.sql.SQLException;
+ method @Deprecated public java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
+ method public java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
+ method public java.math.BigDecimal getBigDecimal(String) throws java.sql.SQLException;
+ method public java.sql.Blob getBlob(int) throws java.sql.SQLException;
+ method public java.sql.Blob getBlob(String) throws java.sql.SQLException;
+ method public boolean getBoolean(int) throws java.sql.SQLException;
+ method public boolean getBoolean(String) throws java.sql.SQLException;
+ method public byte getByte(int) throws java.sql.SQLException;
+ method public byte getByte(String) throws java.sql.SQLException;
+ method public byte[] getBytes(int) throws java.sql.SQLException;
+ method public byte[] getBytes(String) throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream(int) throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream(String) throws java.sql.SQLException;
+ method public java.sql.Clob getClob(int) throws java.sql.SQLException;
+ method public java.sql.Clob getClob(String) throws java.sql.SQLException;
+ method public java.sql.Date getDate(int) throws java.sql.SQLException;
+ method public java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Date getDate(String) throws java.sql.SQLException;
+ method public java.sql.Date getDate(String, java.util.Calendar) throws java.sql.SQLException;
+ method public double getDouble(int) throws java.sql.SQLException;
+ method public double getDouble(String) throws java.sql.SQLException;
+ method public float getFloat(int) throws java.sql.SQLException;
+ method public float getFloat(String) throws java.sql.SQLException;
+ method public int getInt(int) throws java.sql.SQLException;
+ method public int getInt(String) throws java.sql.SQLException;
+ method public long getLong(int) throws java.sql.SQLException;
+ method public long getLong(String) throws java.sql.SQLException;
+ method public java.io.Reader getNCharacterStream(int) throws java.sql.SQLException;
+ method public java.io.Reader getNCharacterStream(String) throws java.sql.SQLException;
+ method public java.sql.NClob getNClob(int) throws java.sql.SQLException;
+ method public java.sql.NClob getNClob(String) throws java.sql.SQLException;
+ method public String getNString(int) throws java.sql.SQLException;
+ method public String getNString(String) throws java.sql.SQLException;
+ method public Object getObject(int) throws java.sql.SQLException;
+ method public Object getObject(int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public Object getObject(String) throws java.sql.SQLException;
+ method public Object getObject(String, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public java.sql.Ref getRef(int) throws java.sql.SQLException;
+ method public java.sql.Ref getRef(String) throws java.sql.SQLException;
+ method public java.sql.RowId getRowId(int) throws java.sql.SQLException;
+ method public java.sql.RowId getRowId(String) throws java.sql.SQLException;
+ method public java.sql.SQLXML getSQLXML(int) throws java.sql.SQLException;
+ method public java.sql.SQLXML getSQLXML(String) throws java.sql.SQLException;
+ method public short getShort(int) throws java.sql.SQLException;
+ method public short getShort(String) throws java.sql.SQLException;
+ method public String getString(int) throws java.sql.SQLException;
+ method public String getString(String) throws java.sql.SQLException;
+ method public java.sql.Time getTime(int) throws java.sql.SQLException;
+ method public java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Time getTime(String) throws java.sql.SQLException;
+ method public java.sql.Time getTime(String, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(String) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(String, java.util.Calendar) throws java.sql.SQLException;
+ method public java.net.URL getURL(int) throws java.sql.SQLException;
+ method public java.net.URL getURL(String) throws java.sql.SQLException;
+ method public void registerOutParameter(int, int) throws java.sql.SQLException;
+ method public void registerOutParameter(int, int, int) throws java.sql.SQLException;
+ method public void registerOutParameter(int, int, String) throws java.sql.SQLException;
+ method public void registerOutParameter(String, int) throws java.sql.SQLException;
+ method public void registerOutParameter(String, int, int) throws java.sql.SQLException;
+ method public void registerOutParameter(String, int, String) throws java.sql.SQLException;
+ method public void setAsciiStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setAsciiStream(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setAsciiStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBigDecimal(String, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void setBinaryStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setBinaryStream(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBinaryStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBlob(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBlob(String, java.sql.Blob) throws java.sql.SQLException;
+ method public void setBlob(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBoolean(String, boolean) throws java.sql.SQLException;
+ method public void setByte(String, byte) throws java.sql.SQLException;
+ method public void setBytes(String, byte[]) throws java.sql.SQLException;
+ method public void setCharacterStream(String, java.io.Reader, int) throws java.sql.SQLException;
+ method public void setCharacterStream(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setClob(String, java.sql.Clob) throws java.sql.SQLException;
+ method public void setClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setDate(String, java.sql.Date) throws java.sql.SQLException;
+ method public void setDate(String, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
+ method public void setDouble(String, double) throws java.sql.SQLException;
+ method public void setFloat(String, float) throws java.sql.SQLException;
+ method public void setInt(String, int) throws java.sql.SQLException;
+ method public void setLong(String, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setNClob(String, java.sql.NClob) throws java.sql.SQLException;
+ method public void setNClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setNString(String, String) throws java.sql.SQLException;
+ method public void setNull(String, int) throws java.sql.SQLException;
+ method public void setNull(String, int, String) throws java.sql.SQLException;
+ method public void setObject(String, Object, int, int) throws java.sql.SQLException;
+ method public void setObject(String, Object, int) throws java.sql.SQLException;
+ method public void setObject(String, Object) throws java.sql.SQLException;
+ method public void setRowId(String, java.sql.RowId) throws java.sql.SQLException;
+ method public void setSQLXML(String, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void setShort(String, short) throws java.sql.SQLException;
+ method public void setString(String, String) throws java.sql.SQLException;
+ method public void setTime(String, java.sql.Time) throws java.sql.SQLException;
+ method public void setTime(String, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTimestamp(String, java.sql.Timestamp) throws java.sql.SQLException;
+ method public void setTimestamp(String, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
+ method public void setURL(String, java.net.URL) throws java.sql.SQLException;
+ method public boolean wasNull() throws java.sql.SQLException;
+ }
+
+ public enum ClientInfoStatus {
enum_constant public static final java.sql.ClientInfoStatus REASON_UNKNOWN;
enum_constant public static final java.sql.ClientInfoStatus REASON_UNKNOWN_PROPERTY;
enum_constant public static final java.sql.ClientInfoStatus REASON_VALUE_INVALID;
enum_constant public static final java.sql.ClientInfoStatus REASON_VALUE_TRUNCATED;
}
- public abstract interface Clob {
- method public abstract void free() throws java.sql.SQLException;
- method public abstract java.io.InputStream getAsciiStream() throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream(long, long) throws java.sql.SQLException;
- method public abstract java.lang.String getSubString(long, int) throws java.sql.SQLException;
- method public abstract long length() throws java.sql.SQLException;
- method public abstract long position(java.lang.String, long) throws java.sql.SQLException;
- method public abstract long position(java.sql.Clob, long) throws java.sql.SQLException;
- method public abstract java.io.OutputStream setAsciiStream(long) throws java.sql.SQLException;
- method public abstract java.io.Writer setCharacterStream(long) throws java.sql.SQLException;
- method public abstract int setString(long, java.lang.String) throws java.sql.SQLException;
- method public abstract int setString(long, java.lang.String, int, int) throws java.sql.SQLException;
- method public abstract void truncate(long) throws java.sql.SQLException;
- }
-
- public abstract interface Connection implements java.lang.AutoCloseable java.sql.Wrapper {
- method public abstract void clearWarnings() throws java.sql.SQLException;
- method public abstract void close() throws java.sql.SQLException;
- method public abstract void commit() throws java.sql.SQLException;
- method public abstract java.sql.Array createArrayOf(java.lang.String, java.lang.Object[]) throws java.sql.SQLException;
- method public abstract java.sql.Blob createBlob() throws java.sql.SQLException;
- method public abstract java.sql.Clob createClob() throws java.sql.SQLException;
- method public abstract java.sql.NClob createNClob() throws java.sql.SQLException;
- method public abstract java.sql.SQLXML createSQLXML() throws java.sql.SQLException;
- method public abstract java.sql.Statement createStatement() throws java.sql.SQLException;
- method public abstract java.sql.Statement createStatement(int, int) throws java.sql.SQLException;
- method public abstract java.sql.Statement createStatement(int, int, int) throws java.sql.SQLException;
- method public abstract java.sql.Struct createStruct(java.lang.String, java.lang.Object[]) throws java.sql.SQLException;
- method public abstract boolean getAutoCommit() throws java.sql.SQLException;
- method public abstract java.lang.String getCatalog() throws java.sql.SQLException;
- method public abstract java.lang.String getClientInfo(java.lang.String) throws java.sql.SQLException;
- method public abstract java.util.Properties getClientInfo() throws java.sql.SQLException;
- method public abstract int getHoldability() throws java.sql.SQLException;
- method public abstract java.sql.DatabaseMetaData getMetaData() throws java.sql.SQLException;
- method public abstract int getTransactionIsolation() throws java.sql.SQLException;
- method public abstract java.util.Map<java.lang.String, java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
- method public abstract java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
- method public abstract boolean isClosed() throws java.sql.SQLException;
- method public abstract boolean isReadOnly() throws java.sql.SQLException;
- method public abstract boolean isValid(int) throws java.sql.SQLException;
- method public abstract java.lang.String nativeSQL(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.CallableStatement prepareCall(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.CallableStatement prepareCall(java.lang.String, int, int) throws java.sql.SQLException;
- method public abstract java.sql.CallableStatement prepareCall(java.lang.String, int, int, int) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String, int, int) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String, int, int, int) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String, int) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String, int[]) throws java.sql.SQLException;
- method public abstract java.sql.PreparedStatement prepareStatement(java.lang.String, java.lang.String[]) throws java.sql.SQLException;
- method public abstract void releaseSavepoint(java.sql.Savepoint) throws java.sql.SQLException;
- method public abstract void rollback() throws java.sql.SQLException;
- method public abstract void rollback(java.sql.Savepoint) throws java.sql.SQLException;
- method public abstract void setAutoCommit(boolean) throws java.sql.SQLException;
- method public abstract void setCatalog(java.lang.String) throws java.sql.SQLException;
- method public abstract void setClientInfo(java.lang.String, java.lang.String) throws java.sql.SQLClientInfoException;
- method public abstract void setClientInfo(java.util.Properties) throws java.sql.SQLClientInfoException;
- method public abstract void setHoldability(int) throws java.sql.SQLException;
- method public abstract void setReadOnly(boolean) throws java.sql.SQLException;
- method public abstract java.sql.Savepoint setSavepoint() throws java.sql.SQLException;
- method public abstract java.sql.Savepoint setSavepoint(java.lang.String) throws java.sql.SQLException;
- method public abstract void setTransactionIsolation(int) throws java.sql.SQLException;
- method public abstract void setTypeMap(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
+ public interface Clob {
+ method public void free() throws java.sql.SQLException;
+ method public java.io.InputStream getAsciiStream() throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream() throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream(long, long) throws java.sql.SQLException;
+ method public String getSubString(long, int) throws java.sql.SQLException;
+ method public long length() throws java.sql.SQLException;
+ method public long position(String, long) throws java.sql.SQLException;
+ method public long position(java.sql.Clob, long) throws java.sql.SQLException;
+ method public java.io.OutputStream setAsciiStream(long) throws java.sql.SQLException;
+ method public java.io.Writer setCharacterStream(long) throws java.sql.SQLException;
+ method public int setString(long, String) throws java.sql.SQLException;
+ method public int setString(long, String, int, int) throws java.sql.SQLException;
+ method public void truncate(long) throws java.sql.SQLException;
+ }
+
+ public interface Connection extends java.sql.Wrapper java.lang.AutoCloseable {
+ method public void clearWarnings() throws java.sql.SQLException;
+ method public void close() throws java.sql.SQLException;
+ method public void commit() throws java.sql.SQLException;
+ method public java.sql.Array createArrayOf(String, Object[]) throws java.sql.SQLException;
+ method public java.sql.Blob createBlob() throws java.sql.SQLException;
+ method public java.sql.Clob createClob() throws java.sql.SQLException;
+ method public java.sql.NClob createNClob() throws java.sql.SQLException;
+ method public java.sql.SQLXML createSQLXML() throws java.sql.SQLException;
+ method public java.sql.Statement createStatement() throws java.sql.SQLException;
+ method public java.sql.Statement createStatement(int, int) throws java.sql.SQLException;
+ method public java.sql.Statement createStatement(int, int, int) throws java.sql.SQLException;
+ method public java.sql.Struct createStruct(String, Object[]) throws java.sql.SQLException;
+ method public boolean getAutoCommit() throws java.sql.SQLException;
+ method public String getCatalog() throws java.sql.SQLException;
+ method public String getClientInfo(String) throws java.sql.SQLException;
+ method public java.util.Properties getClientInfo() throws java.sql.SQLException;
+ method public int getHoldability() throws java.sql.SQLException;
+ method public java.sql.DatabaseMetaData getMetaData() throws java.sql.SQLException;
+ method public int getTransactionIsolation() throws java.sql.SQLException;
+ method public java.util.Map<java.lang.String,java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
+ method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
+ method public boolean isClosed() throws java.sql.SQLException;
+ method public boolean isReadOnly() throws java.sql.SQLException;
+ method public boolean isValid(int) throws java.sql.SQLException;
+ method public String nativeSQL(String) throws java.sql.SQLException;
+ method public java.sql.CallableStatement prepareCall(String) throws java.sql.SQLException;
+ method public java.sql.CallableStatement prepareCall(String, int, int) throws java.sql.SQLException;
+ method public java.sql.CallableStatement prepareCall(String, int, int, int) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String, int, int) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String, int, int, int) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String, int) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String, int[]) throws java.sql.SQLException;
+ method public java.sql.PreparedStatement prepareStatement(String, String[]) throws java.sql.SQLException;
+ method public void releaseSavepoint(java.sql.Savepoint) throws java.sql.SQLException;
+ method public void rollback() throws java.sql.SQLException;
+ method public void rollback(java.sql.Savepoint) throws java.sql.SQLException;
+ method public void setAutoCommit(boolean) throws java.sql.SQLException;
+ method public void setCatalog(String) throws java.sql.SQLException;
+ method public void setClientInfo(String, String) throws java.sql.SQLClientInfoException;
+ method public void setClientInfo(java.util.Properties) throws java.sql.SQLClientInfoException;
+ method public void setHoldability(int) throws java.sql.SQLException;
+ method public void setReadOnly(boolean) throws java.sql.SQLException;
+ method public java.sql.Savepoint setSavepoint() throws java.sql.SQLException;
+ method public java.sql.Savepoint setSavepoint(String) throws java.sql.SQLException;
+ method public void setTransactionIsolation(int) throws java.sql.SQLException;
+ method public void setTypeMap(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
field public static final int TRANSACTION_NONE = 0; // 0x0
field public static final int TRANSACTION_READ_COMMITTED = 2; // 0x2
field public static final int TRANSACTION_READ_UNCOMMITTED = 1; // 0x1
@@ -65321,7 +65533,7 @@ package java.sql {
public class DataTruncation extends java.sql.SQLWarning {
ctor public DataTruncation(int, boolean, boolean, int, int);
- ctor public DataTruncation(int, boolean, boolean, int, int, java.lang.Throwable);
+ ctor public DataTruncation(int, boolean, boolean, int, int, Throwable);
method public int getDataSize();
method public int getIndex();
method public boolean getParameter();
@@ -65329,179 +65541,179 @@ package java.sql {
method public int getTransferSize();
}
- public abstract interface DatabaseMetaData implements java.sql.Wrapper {
- method public abstract boolean allProceduresAreCallable() throws java.sql.SQLException;
- method public abstract boolean allTablesAreSelectable() throws java.sql.SQLException;
- method public abstract boolean autoCommitFailureClosesAllResultSets() throws java.sql.SQLException;
- method public abstract boolean dataDefinitionCausesTransactionCommit() throws java.sql.SQLException;
- method public abstract boolean dataDefinitionIgnoredInTransactions() throws java.sql.SQLException;
- method public abstract boolean deletesAreDetected(int) throws java.sql.SQLException;
- method public abstract boolean doesMaxRowSizeIncludeBlobs() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getAttributes(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getBestRowIdentifier(java.lang.String, java.lang.String, java.lang.String, int, boolean) throws java.sql.SQLException;
- method public abstract java.lang.String getCatalogSeparator() throws java.sql.SQLException;
- method public abstract java.lang.String getCatalogTerm() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getCatalogs() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getClientInfoProperties() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getColumnPrivileges(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Connection getConnection() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getCrossReference(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract int getDatabaseMajorVersion() throws java.sql.SQLException;
- method public abstract int getDatabaseMinorVersion() throws java.sql.SQLException;
- method public abstract java.lang.String getDatabaseProductName() throws java.sql.SQLException;
- method public abstract java.lang.String getDatabaseProductVersion() throws java.sql.SQLException;
- method public abstract int getDefaultTransactionIsolation() throws java.sql.SQLException;
- method public abstract int getDriverMajorVersion();
- method public abstract int getDriverMinorVersion();
- method public abstract java.lang.String getDriverName() throws java.sql.SQLException;
- method public abstract java.lang.String getDriverVersion() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getExportedKeys(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getExtraNameCharacters() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getFunctionColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getFunctions(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getIdentifierQuoteString() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getImportedKeys(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getIndexInfo(java.lang.String, java.lang.String, java.lang.String, boolean, boolean) throws java.sql.SQLException;
- method public abstract int getJDBCMajorVersion() throws java.sql.SQLException;
- method public abstract int getJDBCMinorVersion() throws java.sql.SQLException;
- method public abstract int getMaxBinaryLiteralLength() throws java.sql.SQLException;
- method public abstract int getMaxCatalogNameLength() throws java.sql.SQLException;
- method public abstract int getMaxCharLiteralLength() throws java.sql.SQLException;
- method public abstract int getMaxColumnNameLength() throws java.sql.SQLException;
- method public abstract int getMaxColumnsInGroupBy() throws java.sql.SQLException;
- method public abstract int getMaxColumnsInIndex() throws java.sql.SQLException;
- method public abstract int getMaxColumnsInOrderBy() throws java.sql.SQLException;
- method public abstract int getMaxColumnsInSelect() throws java.sql.SQLException;
- method public abstract int getMaxColumnsInTable() throws java.sql.SQLException;
- method public abstract int getMaxConnections() throws java.sql.SQLException;
- method public abstract int getMaxCursorNameLength() throws java.sql.SQLException;
- method public abstract int getMaxIndexLength() throws java.sql.SQLException;
- method public abstract int getMaxProcedureNameLength() throws java.sql.SQLException;
- method public abstract int getMaxRowSize() throws java.sql.SQLException;
- method public abstract int getMaxSchemaNameLength() throws java.sql.SQLException;
- method public abstract int getMaxStatementLength() throws java.sql.SQLException;
- method public abstract int getMaxStatements() throws java.sql.SQLException;
- method public abstract int getMaxTableNameLength() throws java.sql.SQLException;
- method public abstract int getMaxTablesInSelect() throws java.sql.SQLException;
- method public abstract int getMaxUserNameLength() throws java.sql.SQLException;
- method public abstract java.lang.String getNumericFunctions() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getPrimaryKeys(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getProcedureColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getProcedureTerm() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getProcedures(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract int getResultSetHoldability() throws java.sql.SQLException;
- method public abstract java.sql.RowIdLifetime getRowIdLifetime() throws java.sql.SQLException;
- method public abstract java.lang.String getSQLKeywords() throws java.sql.SQLException;
- method public abstract int getSQLStateType() throws java.sql.SQLException;
- method public abstract java.lang.String getSchemaTerm() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getSchemas() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getSchemas(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getSearchStringEscape() throws java.sql.SQLException;
- method public abstract java.lang.String getStringFunctions() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getSuperTables(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getSuperTypes(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getSystemFunctions() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getTablePrivileges(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getTableTypes() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getTables(java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) throws java.sql.SQLException;
- method public abstract java.lang.String getTimeDateFunctions() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getTypeInfo() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getUDTs(java.lang.String, java.lang.String, java.lang.String, int[]) throws java.sql.SQLException;
- method public abstract java.lang.String getURL() throws java.sql.SQLException;
- method public abstract java.lang.String getUserName() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getVersionColumns(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract boolean insertsAreDetected(int) throws java.sql.SQLException;
- method public abstract boolean isCatalogAtStart() throws java.sql.SQLException;
- method public abstract boolean isReadOnly() throws java.sql.SQLException;
- method public abstract boolean locatorsUpdateCopy() throws java.sql.SQLException;
- method public abstract boolean nullPlusNonNullIsNull() throws java.sql.SQLException;
- method public abstract boolean nullsAreSortedAtEnd() throws java.sql.SQLException;
- method public abstract boolean nullsAreSortedAtStart() throws java.sql.SQLException;
- method public abstract boolean nullsAreSortedHigh() throws java.sql.SQLException;
- method public abstract boolean nullsAreSortedLow() throws java.sql.SQLException;
- method public abstract boolean othersDeletesAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean othersInsertsAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean othersUpdatesAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean ownDeletesAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean ownInsertsAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean ownUpdatesAreVisible(int) throws java.sql.SQLException;
- method public abstract boolean storesLowerCaseIdentifiers() throws java.sql.SQLException;
- method public abstract boolean storesLowerCaseQuotedIdentifiers() throws java.sql.SQLException;
- method public abstract boolean storesMixedCaseIdentifiers() throws java.sql.SQLException;
- method public abstract boolean storesMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
- method public abstract boolean storesUpperCaseIdentifiers() throws java.sql.SQLException;
- method public abstract boolean storesUpperCaseQuotedIdentifiers() throws java.sql.SQLException;
- method public abstract boolean supportsANSI92EntryLevelSQL() throws java.sql.SQLException;
- method public abstract boolean supportsANSI92FullSQL() throws java.sql.SQLException;
- method public abstract boolean supportsANSI92IntermediateSQL() throws java.sql.SQLException;
- method public abstract boolean supportsAlterTableWithAddColumn() throws java.sql.SQLException;
- method public abstract boolean supportsAlterTableWithDropColumn() throws java.sql.SQLException;
- method public abstract boolean supportsBatchUpdates() throws java.sql.SQLException;
- method public abstract boolean supportsCatalogsInDataManipulation() throws java.sql.SQLException;
- method public abstract boolean supportsCatalogsInIndexDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsCatalogsInPrivilegeDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsCatalogsInProcedureCalls() throws java.sql.SQLException;
- method public abstract boolean supportsCatalogsInTableDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsColumnAliasing() throws java.sql.SQLException;
- method public abstract boolean supportsConvert() throws java.sql.SQLException;
- method public abstract boolean supportsConvert(int, int) throws java.sql.SQLException;
- method public abstract boolean supportsCoreSQLGrammar() throws java.sql.SQLException;
- method public abstract boolean supportsCorrelatedSubqueries() throws java.sql.SQLException;
- method public abstract boolean supportsDataDefinitionAndDataManipulationTransactions() throws java.sql.SQLException;
- method public abstract boolean supportsDataManipulationTransactionsOnly() throws java.sql.SQLException;
- method public abstract boolean supportsDifferentTableCorrelationNames() throws java.sql.SQLException;
- method public abstract boolean supportsExpressionsInOrderBy() throws java.sql.SQLException;
- method public abstract boolean supportsExtendedSQLGrammar() throws java.sql.SQLException;
- method public abstract boolean supportsFullOuterJoins() throws java.sql.SQLException;
- method public abstract boolean supportsGetGeneratedKeys() throws java.sql.SQLException;
- method public abstract boolean supportsGroupBy() throws java.sql.SQLException;
- method public abstract boolean supportsGroupByBeyondSelect() throws java.sql.SQLException;
- method public abstract boolean supportsGroupByUnrelated() throws java.sql.SQLException;
- method public abstract boolean supportsIntegrityEnhancementFacility() throws java.sql.SQLException;
- method public abstract boolean supportsLikeEscapeClause() throws java.sql.SQLException;
- method public abstract boolean supportsLimitedOuterJoins() throws java.sql.SQLException;
- method public abstract boolean supportsMinimumSQLGrammar() throws java.sql.SQLException;
- method public abstract boolean supportsMixedCaseIdentifiers() throws java.sql.SQLException;
- method public abstract boolean supportsMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
- method public abstract boolean supportsMultipleOpenResults() throws java.sql.SQLException;
- method public abstract boolean supportsMultipleResultSets() throws java.sql.SQLException;
- method public abstract boolean supportsMultipleTransactions() throws java.sql.SQLException;
- method public abstract boolean supportsNamedParameters() throws java.sql.SQLException;
- method public abstract boolean supportsNonNullableColumns() throws java.sql.SQLException;
- method public abstract boolean supportsOpenCursorsAcrossCommit() throws java.sql.SQLException;
- method public abstract boolean supportsOpenCursorsAcrossRollback() throws java.sql.SQLException;
- method public abstract boolean supportsOpenStatementsAcrossCommit() throws java.sql.SQLException;
- method public abstract boolean supportsOpenStatementsAcrossRollback() throws java.sql.SQLException;
- method public abstract boolean supportsOrderByUnrelated() throws java.sql.SQLException;
- method public abstract boolean supportsOuterJoins() throws java.sql.SQLException;
- method public abstract boolean supportsPositionedDelete() throws java.sql.SQLException;
- method public abstract boolean supportsPositionedUpdate() throws java.sql.SQLException;
- method public abstract boolean supportsResultSetConcurrency(int, int) throws java.sql.SQLException;
- method public abstract boolean supportsResultSetHoldability(int) throws java.sql.SQLException;
- method public abstract boolean supportsResultSetType(int) throws java.sql.SQLException;
- method public abstract boolean supportsSavepoints() throws java.sql.SQLException;
- method public abstract boolean supportsSchemasInDataManipulation() throws java.sql.SQLException;
- method public abstract boolean supportsSchemasInIndexDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsSchemasInPrivilegeDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsSchemasInProcedureCalls() throws java.sql.SQLException;
- method public abstract boolean supportsSchemasInTableDefinitions() throws java.sql.SQLException;
- method public abstract boolean supportsSelectForUpdate() throws java.sql.SQLException;
- method public abstract boolean supportsStatementPooling() throws java.sql.SQLException;
- method public abstract boolean supportsStoredFunctionsUsingCallSyntax() throws java.sql.SQLException;
- method public abstract boolean supportsStoredProcedures() throws java.sql.SQLException;
- method public abstract boolean supportsSubqueriesInComparisons() throws java.sql.SQLException;
- method public abstract boolean supportsSubqueriesInExists() throws java.sql.SQLException;
- method public abstract boolean supportsSubqueriesInIns() throws java.sql.SQLException;
- method public abstract boolean supportsSubqueriesInQuantifieds() throws java.sql.SQLException;
- method public abstract boolean supportsTableCorrelationNames() throws java.sql.SQLException;
- method public abstract boolean supportsTransactionIsolationLevel(int) throws java.sql.SQLException;
- method public abstract boolean supportsTransactions() throws java.sql.SQLException;
- method public abstract boolean supportsUnion() throws java.sql.SQLException;
- method public abstract boolean supportsUnionAll() throws java.sql.SQLException;
- method public abstract boolean updatesAreDetected(int) throws java.sql.SQLException;
- method public abstract boolean usesLocalFilePerTable() throws java.sql.SQLException;
- method public abstract boolean usesLocalFiles() throws java.sql.SQLException;
+ public interface DatabaseMetaData extends java.sql.Wrapper {
+ method public boolean allProceduresAreCallable() throws java.sql.SQLException;
+ method public boolean allTablesAreSelectable() throws java.sql.SQLException;
+ method public boolean autoCommitFailureClosesAllResultSets() throws java.sql.SQLException;
+ method public boolean dataDefinitionCausesTransactionCommit() throws java.sql.SQLException;
+ method public boolean dataDefinitionIgnoredInTransactions() throws java.sql.SQLException;
+ method public boolean deletesAreDetected(int) throws java.sql.SQLException;
+ method public boolean doesMaxRowSizeIncludeBlobs() throws java.sql.SQLException;
+ method public java.sql.ResultSet getAttributes(String, String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getBestRowIdentifier(String, String, String, int, boolean) throws java.sql.SQLException;
+ method public String getCatalogSeparator() throws java.sql.SQLException;
+ method public String getCatalogTerm() throws java.sql.SQLException;
+ method public java.sql.ResultSet getCatalogs() throws java.sql.SQLException;
+ method public java.sql.ResultSet getClientInfoProperties() throws java.sql.SQLException;
+ method public java.sql.ResultSet getColumnPrivileges(String, String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getColumns(String, String, String, String) throws java.sql.SQLException;
+ method public java.sql.Connection getConnection() throws java.sql.SQLException;
+ method public java.sql.ResultSet getCrossReference(String, String, String, String, String, String) throws java.sql.SQLException;
+ method public int getDatabaseMajorVersion() throws java.sql.SQLException;
+ method public int getDatabaseMinorVersion() throws java.sql.SQLException;
+ method public String getDatabaseProductName() throws java.sql.SQLException;
+ method public String getDatabaseProductVersion() throws java.sql.SQLException;
+ method public int getDefaultTransactionIsolation() throws java.sql.SQLException;
+ method public int getDriverMajorVersion();
+ method public int getDriverMinorVersion();
+ method public String getDriverName() throws java.sql.SQLException;
+ method public String getDriverVersion() throws java.sql.SQLException;
+ method public java.sql.ResultSet getExportedKeys(String, String, String) throws java.sql.SQLException;
+ method public String getExtraNameCharacters() throws java.sql.SQLException;
+ method public java.sql.ResultSet getFunctionColumns(String, String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getFunctions(String, String, String) throws java.sql.SQLException;
+ method public String getIdentifierQuoteString() throws java.sql.SQLException;
+ method public java.sql.ResultSet getImportedKeys(String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getIndexInfo(String, String, String, boolean, boolean) throws java.sql.SQLException;
+ method public int getJDBCMajorVersion() throws java.sql.SQLException;
+ method public int getJDBCMinorVersion() throws java.sql.SQLException;
+ method public int getMaxBinaryLiteralLength() throws java.sql.SQLException;
+ method public int getMaxCatalogNameLength() throws java.sql.SQLException;
+ method public int getMaxCharLiteralLength() throws java.sql.SQLException;
+ method public int getMaxColumnNameLength() throws java.sql.SQLException;
+ method public int getMaxColumnsInGroupBy() throws java.sql.SQLException;
+ method public int getMaxColumnsInIndex() throws java.sql.SQLException;
+ method public int getMaxColumnsInOrderBy() throws java.sql.SQLException;
+ method public int getMaxColumnsInSelect() throws java.sql.SQLException;
+ method public int getMaxColumnsInTable() throws java.sql.SQLException;
+ method public int getMaxConnections() throws java.sql.SQLException;
+ method public int getMaxCursorNameLength() throws java.sql.SQLException;
+ method public int getMaxIndexLength() throws java.sql.SQLException;
+ method public int getMaxProcedureNameLength() throws java.sql.SQLException;
+ method public int getMaxRowSize() throws java.sql.SQLException;
+ method public int getMaxSchemaNameLength() throws java.sql.SQLException;
+ method public int getMaxStatementLength() throws java.sql.SQLException;
+ method public int getMaxStatements() throws java.sql.SQLException;
+ method public int getMaxTableNameLength() throws java.sql.SQLException;
+ method public int getMaxTablesInSelect() throws java.sql.SQLException;
+ method public int getMaxUserNameLength() throws java.sql.SQLException;
+ method public String getNumericFunctions() throws java.sql.SQLException;
+ method public java.sql.ResultSet getPrimaryKeys(String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getProcedureColumns(String, String, String, String) throws java.sql.SQLException;
+ method public String getProcedureTerm() throws java.sql.SQLException;
+ method public java.sql.ResultSet getProcedures(String, String, String) throws java.sql.SQLException;
+ method public int getResultSetHoldability() throws java.sql.SQLException;
+ method public java.sql.RowIdLifetime getRowIdLifetime() throws java.sql.SQLException;
+ method public String getSQLKeywords() throws java.sql.SQLException;
+ method public int getSQLStateType() throws java.sql.SQLException;
+ method public String getSchemaTerm() throws java.sql.SQLException;
+ method public java.sql.ResultSet getSchemas() throws java.sql.SQLException;
+ method public java.sql.ResultSet getSchemas(String, String) throws java.sql.SQLException;
+ method public String getSearchStringEscape() throws java.sql.SQLException;
+ method public String getStringFunctions() throws java.sql.SQLException;
+ method public java.sql.ResultSet getSuperTables(String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getSuperTypes(String, String, String) throws java.sql.SQLException;
+ method public String getSystemFunctions() throws java.sql.SQLException;
+ method public java.sql.ResultSet getTablePrivileges(String, String, String) throws java.sql.SQLException;
+ method public java.sql.ResultSet getTableTypes() throws java.sql.SQLException;
+ method public java.sql.ResultSet getTables(String, String, String, String[]) throws java.sql.SQLException;
+ method public String getTimeDateFunctions() throws java.sql.SQLException;
+ method public java.sql.ResultSet getTypeInfo() throws java.sql.SQLException;
+ method public java.sql.ResultSet getUDTs(String, String, String, int[]) throws java.sql.SQLException;
+ method public String getURL() throws java.sql.SQLException;
+ method public String getUserName() throws java.sql.SQLException;
+ method public java.sql.ResultSet getVersionColumns(String, String, String) throws java.sql.SQLException;
+ method public boolean insertsAreDetected(int) throws java.sql.SQLException;
+ method public boolean isCatalogAtStart() throws java.sql.SQLException;
+ method public boolean isReadOnly() throws java.sql.SQLException;
+ method public boolean locatorsUpdateCopy() throws java.sql.SQLException;
+ method public boolean nullPlusNonNullIsNull() throws java.sql.SQLException;
+ method public boolean nullsAreSortedAtEnd() throws java.sql.SQLException;
+ method public boolean nullsAreSortedAtStart() throws java.sql.SQLException;
+ method public boolean nullsAreSortedHigh() throws java.sql.SQLException;
+ method public boolean nullsAreSortedLow() throws java.sql.SQLException;
+ method public boolean othersDeletesAreVisible(int) throws java.sql.SQLException;
+ method public boolean othersInsertsAreVisible(int) throws java.sql.SQLException;
+ method public boolean othersUpdatesAreVisible(int) throws java.sql.SQLException;
+ method public boolean ownDeletesAreVisible(int) throws java.sql.SQLException;
+ method public boolean ownInsertsAreVisible(int) throws java.sql.SQLException;
+ method public boolean ownUpdatesAreVisible(int) throws java.sql.SQLException;
+ method public boolean storesLowerCaseIdentifiers() throws java.sql.SQLException;
+ method public boolean storesLowerCaseQuotedIdentifiers() throws java.sql.SQLException;
+ method public boolean storesMixedCaseIdentifiers() throws java.sql.SQLException;
+ method public boolean storesMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
+ method public boolean storesUpperCaseIdentifiers() throws java.sql.SQLException;
+ method public boolean storesUpperCaseQuotedIdentifiers() throws java.sql.SQLException;
+ method public boolean supportsANSI92EntryLevelSQL() throws java.sql.SQLException;
+ method public boolean supportsANSI92FullSQL() throws java.sql.SQLException;
+ method public boolean supportsANSI92IntermediateSQL() throws java.sql.SQLException;
+ method public boolean supportsAlterTableWithAddColumn() throws java.sql.SQLException;
+ method public boolean supportsAlterTableWithDropColumn() throws java.sql.SQLException;
+ method public boolean supportsBatchUpdates() throws java.sql.SQLException;
+ method public boolean supportsCatalogsInDataManipulation() throws java.sql.SQLException;
+ method public boolean supportsCatalogsInIndexDefinitions() throws java.sql.SQLException;
+ method public boolean supportsCatalogsInPrivilegeDefinitions() throws java.sql.SQLException;
+ method public boolean supportsCatalogsInProcedureCalls() throws java.sql.SQLException;
+ method public boolean supportsCatalogsInTableDefinitions() throws java.sql.SQLException;
+ method public boolean supportsColumnAliasing() throws java.sql.SQLException;
+ method public boolean supportsConvert() throws java.sql.SQLException;
+ method public boolean supportsConvert(int, int) throws java.sql.SQLException;
+ method public boolean supportsCoreSQLGrammar() throws java.sql.SQLException;
+ method public boolean supportsCorrelatedSubqueries() throws java.sql.SQLException;
+ method public boolean supportsDataDefinitionAndDataManipulationTransactions() throws java.sql.SQLException;
+ method public boolean supportsDataManipulationTransactionsOnly() throws java.sql.SQLException;
+ method public boolean supportsDifferentTableCorrelationNames() throws java.sql.SQLException;
+ method public boolean supportsExpressionsInOrderBy() throws java.sql.SQLException;
+ method public boolean supportsExtendedSQLGrammar() throws java.sql.SQLException;
+ method public boolean supportsFullOuterJoins() throws java.sql.SQLException;
+ method public boolean supportsGetGeneratedKeys() throws java.sql.SQLException;
+ method public boolean supportsGroupBy() throws java.sql.SQLException;
+ method public boolean supportsGroupByBeyondSelect() throws java.sql.SQLException;
+ method public boolean supportsGroupByUnrelated() throws java.sql.SQLException;
+ method public boolean supportsIntegrityEnhancementFacility() throws java.sql.SQLException;
+ method public boolean supportsLikeEscapeClause() throws java.sql.SQLException;
+ method public boolean supportsLimitedOuterJoins() throws java.sql.SQLException;
+ method public boolean supportsMinimumSQLGrammar() throws java.sql.SQLException;
+ method public boolean supportsMixedCaseIdentifiers() throws java.sql.SQLException;
+ method public boolean supportsMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
+ method public boolean supportsMultipleOpenResults() throws java.sql.SQLException;
+ method public boolean supportsMultipleResultSets() throws java.sql.SQLException;
+ method public boolean supportsMultipleTransactions() throws java.sql.SQLException;
+ method public boolean supportsNamedParameters() throws java.sql.SQLException;
+ method public boolean supportsNonNullableColumns() throws java.sql.SQLException;
+ method public boolean supportsOpenCursorsAcrossCommit() throws java.sql.SQLException;
+ method public boolean supportsOpenCursorsAcrossRollback() throws java.sql.SQLException;
+ method public boolean supportsOpenStatementsAcrossCommit() throws java.sql.SQLException;
+ method public boolean supportsOpenStatementsAcrossRollback() throws java.sql.SQLException;
+ method public boolean supportsOrderByUnrelated() throws java.sql.SQLException;
+ method public boolean supportsOuterJoins() throws java.sql.SQLException;
+ method public boolean supportsPositionedDelete() throws java.sql.SQLException;
+ method public boolean supportsPositionedUpdate() throws java.sql.SQLException;
+ method public boolean supportsResultSetConcurrency(int, int) throws java.sql.SQLException;
+ method public boolean supportsResultSetHoldability(int) throws java.sql.SQLException;
+ method public boolean supportsResultSetType(int) throws java.sql.SQLException;
+ method public boolean supportsSavepoints() throws java.sql.SQLException;
+ method public boolean supportsSchemasInDataManipulation() throws java.sql.SQLException;
+ method public boolean supportsSchemasInIndexDefinitions() throws java.sql.SQLException;
+ method public boolean supportsSchemasInPrivilegeDefinitions() throws java.sql.SQLException;
+ method public boolean supportsSchemasInProcedureCalls() throws java.sql.SQLException;
+ method public boolean supportsSchemasInTableDefinitions() throws java.sql.SQLException;
+ method public boolean supportsSelectForUpdate() throws java.sql.SQLException;
+ method public boolean supportsStatementPooling() throws java.sql.SQLException;
+ method public boolean supportsStoredFunctionsUsingCallSyntax() throws java.sql.SQLException;
+ method public boolean supportsStoredProcedures() throws java.sql.SQLException;
+ method public boolean supportsSubqueriesInComparisons() throws java.sql.SQLException;
+ method public boolean supportsSubqueriesInExists() throws java.sql.SQLException;
+ method public boolean supportsSubqueriesInIns() throws java.sql.SQLException;
+ method public boolean supportsSubqueriesInQuantifieds() throws java.sql.SQLException;
+ method public boolean supportsTableCorrelationNames() throws java.sql.SQLException;
+ method public boolean supportsTransactionIsolationLevel(int) throws java.sql.SQLException;
+ method public boolean supportsTransactions() throws java.sql.SQLException;
+ method public boolean supportsUnion() throws java.sql.SQLException;
+ method public boolean supportsUnionAll() throws java.sql.SQLException;
+ method public boolean updatesAreDetected(int) throws java.sql.SQLException;
+ method public boolean usesLocalFilePerTable() throws java.sql.SQLException;
+ method public boolean usesLocalFiles() throws java.sql.SQLException;
field public static final short attributeNoNulls = 0; // 0x0
field public static final short attributeNullable = 1; // 0x1
field public static final short attributeNullableUnknown = 2; // 0x2
@@ -65566,59 +65778,59 @@ package java.sql {
}
public class Date extends java.util.Date {
- ctor public deprecated Date(int, int, int);
+ ctor @Deprecated public Date(int, int, int);
ctor public Date(long);
- method public static java.sql.Date valueOf(java.lang.String);
+ method public static java.sql.Date valueOf(String);
}
- public abstract interface Driver {
- method public abstract boolean acceptsURL(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Connection connect(java.lang.String, java.util.Properties) throws java.sql.SQLException;
- method public abstract int getMajorVersion();
- method public abstract int getMinorVersion();
- method public abstract java.sql.DriverPropertyInfo[] getPropertyInfo(java.lang.String, java.util.Properties) throws java.sql.SQLException;
- method public abstract boolean jdbcCompliant();
+ public interface Driver {
+ method public boolean acceptsURL(String) throws java.sql.SQLException;
+ method public java.sql.Connection connect(String, java.util.Properties) throws java.sql.SQLException;
+ method public int getMajorVersion();
+ method public int getMinorVersion();
+ method public java.sql.DriverPropertyInfo[] getPropertyInfo(String, java.util.Properties) throws java.sql.SQLException;
+ method public boolean jdbcCompliant();
}
public class DriverManager {
- method public static synchronized void deregisterDriver(java.sql.Driver) throws java.sql.SQLException;
- method public static java.sql.Connection getConnection(java.lang.String, java.util.Properties) throws java.sql.SQLException;
- method public static java.sql.Connection getConnection(java.lang.String, java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public static java.sql.Connection getConnection(java.lang.String) throws java.sql.SQLException;
- method public static java.sql.Driver getDriver(java.lang.String) throws java.sql.SQLException;
+ method public static void deregisterDriver(java.sql.Driver) throws java.sql.SQLException;
+ method public static java.sql.Connection getConnection(String, java.util.Properties) throws java.sql.SQLException;
+ method public static java.sql.Connection getConnection(String, String, String) throws java.sql.SQLException;
+ method public static java.sql.Connection getConnection(String) throws java.sql.SQLException;
+ method public static java.sql.Driver getDriver(String) throws java.sql.SQLException;
method public static java.util.Enumeration<java.sql.Driver> getDrivers();
- method public static deprecated java.io.PrintStream getLogStream();
+ method @Deprecated public static java.io.PrintStream getLogStream();
method public static java.io.PrintWriter getLogWriter();
method public static int getLoginTimeout();
- method public static void println(java.lang.String);
- method public static synchronized void registerDriver(java.sql.Driver) throws java.sql.SQLException;
- method public static deprecated void setLogStream(java.io.PrintStream);
+ method public static void println(String);
+ method public static void registerDriver(java.sql.Driver) throws java.sql.SQLException;
+ method @Deprecated public static void setLogStream(java.io.PrintStream);
method public static void setLogWriter(java.io.PrintWriter);
method public static void setLoginTimeout(int);
}
public class DriverPropertyInfo {
- ctor public DriverPropertyInfo(java.lang.String, java.lang.String);
- field public java.lang.String[] choices;
- field public java.lang.String description;
- field public java.lang.String name;
+ ctor public DriverPropertyInfo(String, String);
+ field public String[] choices;
+ field public String description;
+ field public String name;
field public boolean required;
- field public java.lang.String value;
+ field public String value;
}
- public abstract interface NClob implements java.sql.Clob {
+ public interface NClob extends java.sql.Clob {
}
- public abstract interface ParameterMetaData implements java.sql.Wrapper {
- method public abstract java.lang.String getParameterClassName(int) throws java.sql.SQLException;
- method public abstract int getParameterCount() throws java.sql.SQLException;
- method public abstract int getParameterMode(int) throws java.sql.SQLException;
- method public abstract int getParameterType(int) throws java.sql.SQLException;
- method public abstract java.lang.String getParameterTypeName(int) throws java.sql.SQLException;
- method public abstract int getPrecision(int) throws java.sql.SQLException;
- method public abstract int getScale(int) throws java.sql.SQLException;
- method public abstract int isNullable(int) throws java.sql.SQLException;
- method public abstract boolean isSigned(int) throws java.sql.SQLException;
+ public interface ParameterMetaData extends java.sql.Wrapper {
+ method public String getParameterClassName(int) throws java.sql.SQLException;
+ method public int getParameterCount() throws java.sql.SQLException;
+ method public int getParameterMode(int) throws java.sql.SQLException;
+ method public int getParameterType(int) throws java.sql.SQLException;
+ method public String getParameterTypeName(int) throws java.sql.SQLException;
+ method public int getPrecision(int) throws java.sql.SQLException;
+ method public int getScale(int) throws java.sql.SQLException;
+ method public int isNullable(int) throws java.sql.SQLException;
+ method public boolean isSigned(int) throws java.sql.SQLException;
field public static final int parameterModeIn = 1; // 0x1
field public static final int parameterModeInOut = 2; // 0x2
field public static final int parameterModeOut = 4; // 0x4
@@ -65628,259 +65840,259 @@ package java.sql {
field public static final int parameterNullableUnknown = 2; // 0x2
}
- public abstract interface PreparedStatement implements java.sql.Statement {
- method public abstract void addBatch() throws java.sql.SQLException;
- method public abstract void clearParameters() throws java.sql.SQLException;
- method public abstract boolean execute() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet executeQuery() throws java.sql.SQLException;
- method public abstract int executeUpdate() throws java.sql.SQLException;
- method public abstract java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
- method public abstract java.sql.ParameterMetaData getParameterMetaData() throws java.sql.SQLException;
- method public abstract void setArray(int, java.sql.Array) throws java.sql.SQLException;
- method public abstract void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setAsciiStream(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setBinaryStream(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBoolean(int, boolean) throws java.sql.SQLException;
- method public abstract void setByte(int, byte) throws java.sql.SQLException;
- method public abstract void setBytes(int, byte[]) throws java.sql.SQLException;
- method public abstract void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void setCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setClob(int, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void setClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setDate(int, java.sql.Date) throws java.sql.SQLException;
- method public abstract void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setDouble(int, double) throws java.sql.SQLException;
- method public abstract void setFloat(int, float) throws java.sql.SQLException;
- method public abstract void setInt(int, int) throws java.sql.SQLException;
- method public abstract void setLong(int, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setNull(int, int) throws java.sql.SQLException;
- method public abstract void setNull(int, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object, int, int) throws java.sql.SQLException;
- method public abstract void setRef(int, java.sql.Ref) throws java.sql.SQLException;
- method public abstract void setRowId(int, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void setSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void setShort(int, short) throws java.sql.SQLException;
- method public abstract void setString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setTime(int, java.sql.Time) throws java.sql.SQLException;
- method public abstract void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setURL(int, java.net.URL) throws java.sql.SQLException;
- method public abstract deprecated void setUnicodeStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- }
-
- public abstract interface Ref {
- method public abstract java.lang.String getBaseTypeName() throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject() throws java.sql.SQLException;
- method public abstract void setObject(java.lang.Object) throws java.sql.SQLException;
- }
-
- public abstract interface ResultSet implements java.lang.AutoCloseable java.sql.Wrapper {
- method public abstract boolean absolute(int) throws java.sql.SQLException;
- method public abstract void afterLast() throws java.sql.SQLException;
- method public abstract void beforeFirst() throws java.sql.SQLException;
- method public abstract void cancelRowUpdates() throws java.sql.SQLException;
- method public abstract void clearWarnings() throws java.sql.SQLException;
- method public abstract void close() throws java.sql.SQLException;
- method public abstract void deleteRow() throws java.sql.SQLException;
- method public abstract int findColumn(java.lang.String) throws java.sql.SQLException;
- method public abstract boolean first() throws java.sql.SQLException;
- method public abstract java.sql.Array getArray(int) throws java.sql.SQLException;
- method public abstract java.sql.Array getArray(java.lang.String) throws java.sql.SQLException;
- method public abstract java.io.InputStream getAsciiStream(int) throws java.sql.SQLException;
- method public abstract java.io.InputStream getAsciiStream(java.lang.String) throws java.sql.SQLException;
- method public abstract deprecated java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
- method public abstract deprecated java.math.BigDecimal getBigDecimal(java.lang.String, int) throws java.sql.SQLException;
- method public abstract java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
- method public abstract java.math.BigDecimal getBigDecimal(java.lang.String) throws java.sql.SQLException;
- method public abstract java.io.InputStream getBinaryStream(int) throws java.sql.SQLException;
- method public abstract java.io.InputStream getBinaryStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Blob getBlob(int) throws java.sql.SQLException;
- method public abstract java.sql.Blob getBlob(java.lang.String) throws java.sql.SQLException;
- method public abstract boolean getBoolean(int) throws java.sql.SQLException;
- method public abstract boolean getBoolean(java.lang.String) throws java.sql.SQLException;
- method public abstract byte getByte(int) throws java.sql.SQLException;
- method public abstract byte getByte(java.lang.String) throws java.sql.SQLException;
- method public abstract byte[] getBytes(int) throws java.sql.SQLException;
- method public abstract byte[] getBytes(java.lang.String) throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream(int) throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Clob getClob(int) throws java.sql.SQLException;
- method public abstract java.sql.Clob getClob(java.lang.String) throws java.sql.SQLException;
- method public abstract int getConcurrency() throws java.sql.SQLException;
- method public abstract java.lang.String getCursorName() throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(int) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Date getDate(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract double getDouble(int) throws java.sql.SQLException;
- method public abstract double getDouble(java.lang.String) throws java.sql.SQLException;
- method public abstract int getFetchDirection() throws java.sql.SQLException;
- method public abstract int getFetchSize() throws java.sql.SQLException;
- method public abstract float getFloat(int) throws java.sql.SQLException;
- method public abstract float getFloat(java.lang.String) throws java.sql.SQLException;
- method public abstract int getHoldability() throws java.sql.SQLException;
- method public abstract int getInt(int) throws java.sql.SQLException;
- method public abstract int getInt(java.lang.String) throws java.sql.SQLException;
- method public abstract long getLong(int) throws java.sql.SQLException;
- method public abstract long getLong(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
- method public abstract java.io.Reader getNCharacterStream(int) throws java.sql.SQLException;
- method public abstract java.io.Reader getNCharacterStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.NClob getNClob(int) throws java.sql.SQLException;
- method public abstract java.sql.NClob getNClob(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.String getNString(int) throws java.sql.SQLException;
- method public abstract java.lang.String getNString(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(int) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(java.lang.String) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(int, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.lang.Object getObject(java.lang.String, java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.sql.Ref getRef(int) throws java.sql.SQLException;
- method public abstract java.sql.Ref getRef(java.lang.String) throws java.sql.SQLException;
- method public abstract int getRow() throws java.sql.SQLException;
- method public abstract java.sql.RowId getRowId(int) throws java.sql.SQLException;
- method public abstract java.sql.RowId getRowId(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.SQLXML getSQLXML(int) throws java.sql.SQLException;
- method public abstract java.sql.SQLXML getSQLXML(java.lang.String) throws java.sql.SQLException;
- method public abstract short getShort(int) throws java.sql.SQLException;
- method public abstract short getShort(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Statement getStatement() throws java.sql.SQLException;
- method public abstract java.lang.String getString(int) throws java.sql.SQLException;
- method public abstract java.lang.String getString(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(int) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Time getTime(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
- method public abstract java.sql.Timestamp getTimestamp(java.lang.String, java.util.Calendar) throws java.sql.SQLException;
- method public abstract int getType() throws java.sql.SQLException;
- method public abstract java.net.URL getURL(int) throws java.sql.SQLException;
- method public abstract java.net.URL getURL(java.lang.String) throws java.sql.SQLException;
- method public abstract deprecated java.io.InputStream getUnicodeStream(int) throws java.sql.SQLException;
- method public abstract deprecated java.io.InputStream getUnicodeStream(java.lang.String) throws java.sql.SQLException;
- method public abstract java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
- method public abstract void insertRow() throws java.sql.SQLException;
- method public abstract boolean isAfterLast() throws java.sql.SQLException;
- method public abstract boolean isBeforeFirst() throws java.sql.SQLException;
- method public abstract boolean isClosed() throws java.sql.SQLException;
- method public abstract boolean isFirst() throws java.sql.SQLException;
- method public abstract boolean isLast() throws java.sql.SQLException;
- method public abstract boolean last() throws java.sql.SQLException;
- method public abstract void moveToCurrentRow() throws java.sql.SQLException;
- method public abstract void moveToInsertRow() throws java.sql.SQLException;
- method public abstract boolean next() throws java.sql.SQLException;
- method public abstract boolean previous() throws java.sql.SQLException;
- method public abstract void refreshRow() throws java.sql.SQLException;
- method public abstract boolean relative(int) throws java.sql.SQLException;
- method public abstract boolean rowDeleted() throws java.sql.SQLException;
- method public abstract boolean rowInserted() throws java.sql.SQLException;
- method public abstract boolean rowUpdated() throws java.sql.SQLException;
- method public abstract void setFetchDirection(int) throws java.sql.SQLException;
- method public abstract void setFetchSize(int) throws java.sql.SQLException;
- method public abstract void updateArray(int, java.sql.Array) throws java.sql.SQLException;
- method public abstract void updateArray(java.lang.String, java.sql.Array) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateAsciiStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void updateBigDecimal(java.lang.String, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateBinaryStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateBlob(int, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void updateBlob(java.lang.String, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void updateBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateBlob(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void updateBlob(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateBlob(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void updateBoolean(int, boolean) throws java.sql.SQLException;
- method public abstract void updateBoolean(java.lang.String, boolean) throws java.sql.SQLException;
- method public abstract void updateByte(int, byte) throws java.sql.SQLException;
- method public abstract void updateByte(java.lang.String, byte) throws java.sql.SQLException;
- method public abstract void updateBytes(int, byte[]) throws java.sql.SQLException;
- method public abstract void updateBytes(java.lang.String, byte[]) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(java.lang.String, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateClob(int, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void updateClob(java.lang.String, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void updateClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateDate(int, java.sql.Date) throws java.sql.SQLException;
- method public abstract void updateDate(java.lang.String, java.sql.Date) throws java.sql.SQLException;
- method public abstract void updateDouble(int, double) throws java.sql.SQLException;
- method public abstract void updateDouble(java.lang.String, double) throws java.sql.SQLException;
- method public abstract void updateFloat(int, float) throws java.sql.SQLException;
- method public abstract void updateFloat(java.lang.String, float) throws java.sql.SQLException;
- method public abstract void updateInt(int, int) throws java.sql.SQLException;
- method public abstract void updateInt(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void updateLong(int, long) throws java.sql.SQLException;
- method public abstract void updateLong(java.lang.String, long) throws java.sql.SQLException;
- method public abstract void updateNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateNCharacterStream(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateNCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateNClob(int, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void updateNClob(java.lang.String, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void updateNClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateNClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void updateNClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateNClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void updateNString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void updateNString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void updateNull(int) throws java.sql.SQLException;
- method public abstract void updateNull(java.lang.String) throws java.sql.SQLException;
- method public abstract void updateObject(int, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void updateObject(int, java.lang.Object) throws java.sql.SQLException;
- method public abstract void updateObject(java.lang.String, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void updateObject(java.lang.String, java.lang.Object) throws java.sql.SQLException;
- method public abstract void updateRef(int, java.sql.Ref) throws java.sql.SQLException;
- method public abstract void updateRef(java.lang.String, java.sql.Ref) throws java.sql.SQLException;
- method public abstract void updateRow() throws java.sql.SQLException;
- method public abstract void updateRowId(int, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void updateRowId(java.lang.String, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void updateSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void updateSQLXML(java.lang.String, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void updateShort(int, short) throws java.sql.SQLException;
- method public abstract void updateShort(java.lang.String, short) throws java.sql.SQLException;
- method public abstract void updateString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void updateString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void updateTime(int, java.sql.Time) throws java.sql.SQLException;
- method public abstract void updateTime(java.lang.String, java.sql.Time) throws java.sql.SQLException;
- method public abstract void updateTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void updateTimestamp(java.lang.String, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract boolean wasNull() throws java.sql.SQLException;
+ public interface PreparedStatement extends java.sql.Statement {
+ method public void addBatch() throws java.sql.SQLException;
+ method public void clearParameters() throws java.sql.SQLException;
+ method public boolean execute() throws java.sql.SQLException;
+ method public java.sql.ResultSet executeQuery() throws java.sql.SQLException;
+ method public int executeUpdate() throws java.sql.SQLException;
+ method public java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
+ method public java.sql.ParameterMetaData getParameterMetaData() throws java.sql.SQLException;
+ method public void setArray(int, java.sql.Array) throws java.sql.SQLException;
+ method public void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setAsciiStream(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setBinaryStream(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
+ method public void setBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBlob(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBoolean(int, boolean) throws java.sql.SQLException;
+ method public void setByte(int, byte) throws java.sql.SQLException;
+ method public void setBytes(int, byte[]) throws java.sql.SQLException;
+ method public void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
+ method public void setCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setClob(int, java.sql.Clob) throws java.sql.SQLException;
+ method public void setClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setDate(int, java.sql.Date) throws java.sql.SQLException;
+ method public void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
+ method public void setDouble(int, double) throws java.sql.SQLException;
+ method public void setFloat(int, float) throws java.sql.SQLException;
+ method public void setInt(int, int) throws java.sql.SQLException;
+ method public void setLong(int, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setNClob(int, java.sql.NClob) throws java.sql.SQLException;
+ method public void setNClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setNString(int, String) throws java.sql.SQLException;
+ method public void setNull(int, int) throws java.sql.SQLException;
+ method public void setNull(int, int, String) throws java.sql.SQLException;
+ method public void setObject(int, Object, int) throws java.sql.SQLException;
+ method public void setObject(int, Object) throws java.sql.SQLException;
+ method public void setObject(int, Object, int, int) throws java.sql.SQLException;
+ method public void setRef(int, java.sql.Ref) throws java.sql.SQLException;
+ method public void setRowId(int, java.sql.RowId) throws java.sql.SQLException;
+ method public void setSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void setShort(int, short) throws java.sql.SQLException;
+ method public void setString(int, String) throws java.sql.SQLException;
+ method public void setTime(int, java.sql.Time) throws java.sql.SQLException;
+ method public void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
+ method public void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
+ method public void setURL(int, java.net.URL) throws java.sql.SQLException;
+ method @Deprecated public void setUnicodeStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ }
+
+ public interface Ref {
+ method public String getBaseTypeName() throws java.sql.SQLException;
+ method public Object getObject(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public Object getObject() throws java.sql.SQLException;
+ method public void setObject(Object) throws java.sql.SQLException;
+ }
+
+ public interface ResultSet extends java.sql.Wrapper java.lang.AutoCloseable {
+ method public boolean absolute(int) throws java.sql.SQLException;
+ method public void afterLast() throws java.sql.SQLException;
+ method public void beforeFirst() throws java.sql.SQLException;
+ method public void cancelRowUpdates() throws java.sql.SQLException;
+ method public void clearWarnings() throws java.sql.SQLException;
+ method public void close() throws java.sql.SQLException;
+ method public void deleteRow() throws java.sql.SQLException;
+ method public int findColumn(String) throws java.sql.SQLException;
+ method public boolean first() throws java.sql.SQLException;
+ method public java.sql.Array getArray(int) throws java.sql.SQLException;
+ method public java.sql.Array getArray(String) throws java.sql.SQLException;
+ method public java.io.InputStream getAsciiStream(int) throws java.sql.SQLException;
+ method public java.io.InputStream getAsciiStream(String) throws java.sql.SQLException;
+ method @Deprecated public java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
+ method @Deprecated public java.math.BigDecimal getBigDecimal(String, int) throws java.sql.SQLException;
+ method public java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
+ method public java.math.BigDecimal getBigDecimal(String) throws java.sql.SQLException;
+ method public java.io.InputStream getBinaryStream(int) throws java.sql.SQLException;
+ method public java.io.InputStream getBinaryStream(String) throws java.sql.SQLException;
+ method public java.sql.Blob getBlob(int) throws java.sql.SQLException;
+ method public java.sql.Blob getBlob(String) throws java.sql.SQLException;
+ method public boolean getBoolean(int) throws java.sql.SQLException;
+ method public boolean getBoolean(String) throws java.sql.SQLException;
+ method public byte getByte(int) throws java.sql.SQLException;
+ method public byte getByte(String) throws java.sql.SQLException;
+ method public byte[] getBytes(int) throws java.sql.SQLException;
+ method public byte[] getBytes(String) throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream(int) throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream(String) throws java.sql.SQLException;
+ method public java.sql.Clob getClob(int) throws java.sql.SQLException;
+ method public java.sql.Clob getClob(String) throws java.sql.SQLException;
+ method public int getConcurrency() throws java.sql.SQLException;
+ method public String getCursorName() throws java.sql.SQLException;
+ method public java.sql.Date getDate(int) throws java.sql.SQLException;
+ method public java.sql.Date getDate(String) throws java.sql.SQLException;
+ method public java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Date getDate(String, java.util.Calendar) throws java.sql.SQLException;
+ method public double getDouble(int) throws java.sql.SQLException;
+ method public double getDouble(String) throws java.sql.SQLException;
+ method public int getFetchDirection() throws java.sql.SQLException;
+ method public int getFetchSize() throws java.sql.SQLException;
+ method public float getFloat(int) throws java.sql.SQLException;
+ method public float getFloat(String) throws java.sql.SQLException;
+ method public int getHoldability() throws java.sql.SQLException;
+ method public int getInt(int) throws java.sql.SQLException;
+ method public int getInt(String) throws java.sql.SQLException;
+ method public long getLong(int) throws java.sql.SQLException;
+ method public long getLong(String) throws java.sql.SQLException;
+ method public java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
+ method public java.io.Reader getNCharacterStream(int) throws java.sql.SQLException;
+ method public java.io.Reader getNCharacterStream(String) throws java.sql.SQLException;
+ method public java.sql.NClob getNClob(int) throws java.sql.SQLException;
+ method public java.sql.NClob getNClob(String) throws java.sql.SQLException;
+ method public String getNString(int) throws java.sql.SQLException;
+ method public String getNString(String) throws java.sql.SQLException;
+ method public Object getObject(int) throws java.sql.SQLException;
+ method public Object getObject(String) throws java.sql.SQLException;
+ method public Object getObject(int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public Object getObject(String, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public java.sql.Ref getRef(int) throws java.sql.SQLException;
+ method public java.sql.Ref getRef(String) throws java.sql.SQLException;
+ method public int getRow() throws java.sql.SQLException;
+ method public java.sql.RowId getRowId(int) throws java.sql.SQLException;
+ method public java.sql.RowId getRowId(String) throws java.sql.SQLException;
+ method public java.sql.SQLXML getSQLXML(int) throws java.sql.SQLException;
+ method public java.sql.SQLXML getSQLXML(String) throws java.sql.SQLException;
+ method public short getShort(int) throws java.sql.SQLException;
+ method public short getShort(String) throws java.sql.SQLException;
+ method public java.sql.Statement getStatement() throws java.sql.SQLException;
+ method public String getString(int) throws java.sql.SQLException;
+ method public String getString(String) throws java.sql.SQLException;
+ method public java.sql.Time getTime(int) throws java.sql.SQLException;
+ method public java.sql.Time getTime(String) throws java.sql.SQLException;
+ method public java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Time getTime(String, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(String) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
+ method public java.sql.Timestamp getTimestamp(String, java.util.Calendar) throws java.sql.SQLException;
+ method public int getType() throws java.sql.SQLException;
+ method public java.net.URL getURL(int) throws java.sql.SQLException;
+ method public java.net.URL getURL(String) throws java.sql.SQLException;
+ method @Deprecated public java.io.InputStream getUnicodeStream(int) throws java.sql.SQLException;
+ method @Deprecated public java.io.InputStream getUnicodeStream(String) throws java.sql.SQLException;
+ method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
+ method public void insertRow() throws java.sql.SQLException;
+ method public boolean isAfterLast() throws java.sql.SQLException;
+ method public boolean isBeforeFirst() throws java.sql.SQLException;
+ method public boolean isClosed() throws java.sql.SQLException;
+ method public boolean isFirst() throws java.sql.SQLException;
+ method public boolean isLast() throws java.sql.SQLException;
+ method public boolean last() throws java.sql.SQLException;
+ method public void moveToCurrentRow() throws java.sql.SQLException;
+ method public void moveToInsertRow() throws java.sql.SQLException;
+ method public boolean next() throws java.sql.SQLException;
+ method public boolean previous() throws java.sql.SQLException;
+ method public void refreshRow() throws java.sql.SQLException;
+ method public boolean relative(int) throws java.sql.SQLException;
+ method public boolean rowDeleted() throws java.sql.SQLException;
+ method public boolean rowInserted() throws java.sql.SQLException;
+ method public boolean rowUpdated() throws java.sql.SQLException;
+ method public void setFetchDirection(int) throws java.sql.SQLException;
+ method public void setFetchSize(int) throws java.sql.SQLException;
+ method public void updateArray(int, java.sql.Array) throws java.sql.SQLException;
+ method public void updateArray(String, java.sql.Array) throws java.sql.SQLException;
+ method public void updateAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void updateAsciiStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void updateAsciiStream(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateAsciiStream(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateAsciiStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void updateBigDecimal(String, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void updateBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void updateBinaryStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void updateBinaryStream(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateBinaryStream(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateBinaryStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateBlob(int, java.sql.Blob) throws java.sql.SQLException;
+ method public void updateBlob(String, java.sql.Blob) throws java.sql.SQLException;
+ method public void updateBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateBlob(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void updateBlob(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateBlob(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void updateBoolean(int, boolean) throws java.sql.SQLException;
+ method public void updateBoolean(String, boolean) throws java.sql.SQLException;
+ method public void updateByte(int, byte) throws java.sql.SQLException;
+ method public void updateByte(String, byte) throws java.sql.SQLException;
+ method public void updateBytes(int, byte[]) throws java.sql.SQLException;
+ method public void updateBytes(String, byte[]) throws java.sql.SQLException;
+ method public void updateCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
+ method public void updateCharacterStream(String, java.io.Reader, int) throws java.sql.SQLException;
+ method public void updateCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateCharacterStream(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void updateCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void updateClob(int, java.sql.Clob) throws java.sql.SQLException;
+ method public void updateClob(String, java.sql.Clob) throws java.sql.SQLException;
+ method public void updateClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void updateClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void updateDate(int, java.sql.Date) throws java.sql.SQLException;
+ method public void updateDate(String, java.sql.Date) throws java.sql.SQLException;
+ method public void updateDouble(int, double) throws java.sql.SQLException;
+ method public void updateDouble(String, double) throws java.sql.SQLException;
+ method public void updateFloat(int, float) throws java.sql.SQLException;
+ method public void updateFloat(String, float) throws java.sql.SQLException;
+ method public void updateInt(int, int) throws java.sql.SQLException;
+ method public void updateInt(String, int) throws java.sql.SQLException;
+ method public void updateLong(int, long) throws java.sql.SQLException;
+ method public void updateLong(String, long) throws java.sql.SQLException;
+ method public void updateNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateNCharacterStream(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void updateNCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void updateNClob(int, java.sql.NClob) throws java.sql.SQLException;
+ method public void updateNClob(String, java.sql.NClob) throws java.sql.SQLException;
+ method public void updateNClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateNClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void updateNClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void updateNClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void updateNString(int, String) throws java.sql.SQLException;
+ method public void updateNString(String, String) throws java.sql.SQLException;
+ method public void updateNull(int) throws java.sql.SQLException;
+ method public void updateNull(String) throws java.sql.SQLException;
+ method public void updateObject(int, Object, int) throws java.sql.SQLException;
+ method public void updateObject(int, Object) throws java.sql.SQLException;
+ method public void updateObject(String, Object, int) throws java.sql.SQLException;
+ method public void updateObject(String, Object) throws java.sql.SQLException;
+ method public void updateRef(int, java.sql.Ref) throws java.sql.SQLException;
+ method public void updateRef(String, java.sql.Ref) throws java.sql.SQLException;
+ method public void updateRow() throws java.sql.SQLException;
+ method public void updateRowId(int, java.sql.RowId) throws java.sql.SQLException;
+ method public void updateRowId(String, java.sql.RowId) throws java.sql.SQLException;
+ method public void updateSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void updateSQLXML(String, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void updateShort(int, short) throws java.sql.SQLException;
+ method public void updateShort(String, short) throws java.sql.SQLException;
+ method public void updateString(int, String) throws java.sql.SQLException;
+ method public void updateString(String, String) throws java.sql.SQLException;
+ method public void updateTime(int, java.sql.Time) throws java.sql.SQLException;
+ method public void updateTime(String, java.sql.Time) throws java.sql.SQLException;
+ method public void updateTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
+ method public void updateTimestamp(String, java.sql.Timestamp) throws java.sql.SQLException;
+ method public boolean wasNull() throws java.sql.SQLException;
field public static final int CLOSE_CURSORS_AT_COMMIT = 2; // 0x2
field public static final int CONCUR_READ_ONLY = 1007; // 0x3ef
field public static final int CONCUR_UPDATABLE = 1008; // 0x3f0
@@ -65893,43 +66105,41 @@ package java.sql {
field public static final int TYPE_SCROLL_SENSITIVE = 1005; // 0x3ed
}
- public abstract interface ResultSetMetaData implements java.sql.Wrapper {
- method public abstract java.lang.String getCatalogName(int) throws java.sql.SQLException;
- method public abstract java.lang.String getColumnClassName(int) throws java.sql.SQLException;
- method public abstract int getColumnCount() throws java.sql.SQLException;
- method public abstract int getColumnDisplaySize(int) throws java.sql.SQLException;
- method public abstract java.lang.String getColumnLabel(int) throws java.sql.SQLException;
- method public abstract java.lang.String getColumnName(int) throws java.sql.SQLException;
- method public abstract int getColumnType(int) throws java.sql.SQLException;
- method public abstract java.lang.String getColumnTypeName(int) throws java.sql.SQLException;
- method public abstract int getPrecision(int) throws java.sql.SQLException;
- method public abstract int getScale(int) throws java.sql.SQLException;
- method public abstract java.lang.String getSchemaName(int) throws java.sql.SQLException;
- method public abstract java.lang.String getTableName(int) throws java.sql.SQLException;
- method public abstract boolean isAutoIncrement(int) throws java.sql.SQLException;
- method public abstract boolean isCaseSensitive(int) throws java.sql.SQLException;
- method public abstract boolean isCurrency(int) throws java.sql.SQLException;
- method public abstract boolean isDefinitelyWritable(int) throws java.sql.SQLException;
- method public abstract int isNullable(int) throws java.sql.SQLException;
- method public abstract boolean isReadOnly(int) throws java.sql.SQLException;
- method public abstract boolean isSearchable(int) throws java.sql.SQLException;
- method public abstract boolean isSigned(int) throws java.sql.SQLException;
- method public abstract boolean isWritable(int) throws java.sql.SQLException;
+ public interface ResultSetMetaData extends java.sql.Wrapper {
+ method public String getCatalogName(int) throws java.sql.SQLException;
+ method public String getColumnClassName(int) throws java.sql.SQLException;
+ method public int getColumnCount() throws java.sql.SQLException;
+ method public int getColumnDisplaySize(int) throws java.sql.SQLException;
+ method public String getColumnLabel(int) throws java.sql.SQLException;
+ method public String getColumnName(int) throws java.sql.SQLException;
+ method public int getColumnType(int) throws java.sql.SQLException;
+ method public String getColumnTypeName(int) throws java.sql.SQLException;
+ method public int getPrecision(int) throws java.sql.SQLException;
+ method public int getScale(int) throws java.sql.SQLException;
+ method public String getSchemaName(int) throws java.sql.SQLException;
+ method public String getTableName(int) throws java.sql.SQLException;
+ method public boolean isAutoIncrement(int) throws java.sql.SQLException;
+ method public boolean isCaseSensitive(int) throws java.sql.SQLException;
+ method public boolean isCurrency(int) throws java.sql.SQLException;
+ method public boolean isDefinitelyWritable(int) throws java.sql.SQLException;
+ method public int isNullable(int) throws java.sql.SQLException;
+ method public boolean isReadOnly(int) throws java.sql.SQLException;
+ method public boolean isSearchable(int) throws java.sql.SQLException;
+ method public boolean isSigned(int) throws java.sql.SQLException;
+ method public boolean isWritable(int) throws java.sql.SQLException;
field public static final int columnNoNulls = 0; // 0x0
field public static final int columnNullable = 1; // 0x1
field public static final int columnNullableUnknown = 2; // 0x2
}
- public abstract interface RowId {
- method public abstract boolean equals(java.lang.Object);
- method public abstract byte[] getBytes();
- method public abstract int hashCode();
- method public abstract java.lang.String toString();
+ public interface RowId {
+ method public boolean equals(Object);
+ method public byte[] getBytes();
+ method public int hashCode();
+ method public String toString();
}
- public final class RowIdLifetime extends java.lang.Enum {
- method public static java.sql.RowIdLifetime valueOf(java.lang.String);
- method public static final java.sql.RowIdLifetime[] values();
+ public enum RowIdLifetime {
enum_constant public static final java.sql.RowIdLifetime ROWID_UNSUPPORTED;
enum_constant public static final java.sql.RowIdLifetime ROWID_VALID_FOREVER;
enum_constant public static final java.sql.RowIdLifetime ROWID_VALID_OTHER;
@@ -65939,307 +66149,307 @@ package java.sql {
public class SQLClientInfoException extends java.sql.SQLException {
ctor public SQLClientInfoException();
- ctor public SQLClientInfoException(java.util.Map<java.lang.String, java.sql.ClientInfoStatus>);
- ctor public SQLClientInfoException(java.util.Map<java.lang.String, java.sql.ClientInfoStatus>, java.lang.Throwable);
- ctor public SQLClientInfoException(java.lang.String, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>);
- ctor public SQLClientInfoException(java.lang.String, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>, java.lang.Throwable);
- ctor public SQLClientInfoException(java.lang.String, java.lang.String, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>);
- ctor public SQLClientInfoException(java.lang.String, java.lang.String, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>, java.lang.Throwable);
- ctor public SQLClientInfoException(java.lang.String, java.lang.String, int, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>);
- ctor public SQLClientInfoException(java.lang.String, java.lang.String, int, java.util.Map<java.lang.String, java.sql.ClientInfoStatus>, java.lang.Throwable);
- method public java.util.Map<java.lang.String, java.sql.ClientInfoStatus> getFailedProperties();
+ ctor public SQLClientInfoException(java.util.Map<java.lang.String,java.sql.ClientInfoStatus>);
+ ctor public SQLClientInfoException(java.util.Map<java.lang.String,java.sql.ClientInfoStatus>, Throwable);
+ ctor public SQLClientInfoException(String, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>);
+ ctor public SQLClientInfoException(String, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>, Throwable);
+ ctor public SQLClientInfoException(String, String, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>);
+ ctor public SQLClientInfoException(String, String, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>, Throwable);
+ ctor public SQLClientInfoException(String, String, int, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>);
+ ctor public SQLClientInfoException(String, String, int, java.util.Map<java.lang.String,java.sql.ClientInfoStatus>, Throwable);
+ method public java.util.Map<java.lang.String,java.sql.ClientInfoStatus> getFailedProperties();
}
- public abstract interface SQLData {
- method public abstract java.lang.String getSQLTypeName() throws java.sql.SQLException;
- method public abstract void readSQL(java.sql.SQLInput, java.lang.String) throws java.sql.SQLException;
- method public abstract void writeSQL(java.sql.SQLOutput) throws java.sql.SQLException;
+ public interface SQLData {
+ method public String getSQLTypeName() throws java.sql.SQLException;
+ method public void readSQL(java.sql.SQLInput, String) throws java.sql.SQLException;
+ method public void writeSQL(java.sql.SQLOutput) throws java.sql.SQLException;
}
public class SQLDataException extends java.sql.SQLNonTransientException {
ctor public SQLDataException();
- ctor public SQLDataException(java.lang.String);
- ctor public SQLDataException(java.lang.String, java.lang.String);
- ctor public SQLDataException(java.lang.String, java.lang.String, int);
- ctor public SQLDataException(java.lang.Throwable);
- ctor public SQLDataException(java.lang.String, java.lang.Throwable);
- ctor public SQLDataException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLDataException(java.lang.String, java.lang.String, int, java.lang.Throwable);
- }
-
- public class SQLException extends java.lang.Exception implements java.lang.Iterable {
- ctor public SQLException(java.lang.String, java.lang.String, int);
- ctor public SQLException(java.lang.String, java.lang.String);
- ctor public SQLException(java.lang.String);
+ ctor public SQLDataException(String);
+ ctor public SQLDataException(String, String);
+ ctor public SQLDataException(String, String, int);
+ ctor public SQLDataException(Throwable);
+ ctor public SQLDataException(String, Throwable);
+ ctor public SQLDataException(String, String, Throwable);
+ ctor public SQLDataException(String, String, int, Throwable);
+ }
+
+ public class SQLException extends java.lang.Exception implements java.lang.Iterable<java.lang.Throwable> {
+ ctor public SQLException(String, String, int);
+ ctor public SQLException(String, String);
+ ctor public SQLException(String);
ctor public SQLException();
- ctor public SQLException(java.lang.Throwable);
- ctor public SQLException(java.lang.String, java.lang.Throwable);
- ctor public SQLException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLException(Throwable);
+ ctor public SQLException(String, Throwable);
+ ctor public SQLException(String, String, Throwable);
+ ctor public SQLException(String, String, int, Throwable);
method public int getErrorCode();
method public java.sql.SQLException getNextException();
- method public java.lang.String getSQLState();
+ method public String getSQLState();
method public java.util.Iterator<java.lang.Throwable> iterator();
method public void setNextException(java.sql.SQLException);
}
public class SQLFeatureNotSupportedException extends java.sql.SQLNonTransientException {
ctor public SQLFeatureNotSupportedException();
- ctor public SQLFeatureNotSupportedException(java.lang.String);
- ctor public SQLFeatureNotSupportedException(java.lang.String, java.lang.String);
- ctor public SQLFeatureNotSupportedException(java.lang.String, java.lang.String, int);
- ctor public SQLFeatureNotSupportedException(java.lang.Throwable);
- ctor public SQLFeatureNotSupportedException(java.lang.String, java.lang.Throwable);
- ctor public SQLFeatureNotSupportedException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLFeatureNotSupportedException(java.lang.String, java.lang.String, int, java.lang.Throwable);
- }
-
- public abstract interface SQLInput {
- method public abstract java.sql.Array readArray() throws java.sql.SQLException;
- method public abstract java.io.InputStream readAsciiStream() throws java.sql.SQLException;
- method public abstract java.math.BigDecimal readBigDecimal() throws java.sql.SQLException;
- method public abstract java.io.InputStream readBinaryStream() throws java.sql.SQLException;
- method public abstract java.sql.Blob readBlob() throws java.sql.SQLException;
- method public abstract boolean readBoolean() throws java.sql.SQLException;
- method public abstract byte readByte() throws java.sql.SQLException;
- method public abstract byte[] readBytes() throws java.sql.SQLException;
- method public abstract java.io.Reader readCharacterStream() throws java.sql.SQLException;
- method public abstract java.sql.Clob readClob() throws java.sql.SQLException;
- method public abstract java.sql.Date readDate() throws java.sql.SQLException;
- method public abstract double readDouble() throws java.sql.SQLException;
- method public abstract float readFloat() throws java.sql.SQLException;
- method public abstract int readInt() throws java.sql.SQLException;
- method public abstract long readLong() throws java.sql.SQLException;
- method public abstract java.sql.NClob readNClob() throws java.sql.SQLException;
- method public abstract java.lang.String readNString() throws java.sql.SQLException;
- method public abstract java.lang.Object readObject() throws java.sql.SQLException;
- method public abstract java.sql.Ref readRef() throws java.sql.SQLException;
- method public abstract java.sql.RowId readRowId() throws java.sql.SQLException;
- method public abstract java.sql.SQLXML readSQLXML() throws java.sql.SQLException;
- method public abstract short readShort() throws java.sql.SQLException;
- method public abstract java.lang.String readString() throws java.sql.SQLException;
- method public abstract java.sql.Time readTime() throws java.sql.SQLException;
- method public abstract java.sql.Timestamp readTimestamp() throws java.sql.SQLException;
- method public abstract java.net.URL readURL() throws java.sql.SQLException;
- method public abstract boolean wasNull() throws java.sql.SQLException;
+ ctor public SQLFeatureNotSupportedException(String);
+ ctor public SQLFeatureNotSupportedException(String, String);
+ ctor public SQLFeatureNotSupportedException(String, String, int);
+ ctor public SQLFeatureNotSupportedException(Throwable);
+ ctor public SQLFeatureNotSupportedException(String, Throwable);
+ ctor public SQLFeatureNotSupportedException(String, String, Throwable);
+ ctor public SQLFeatureNotSupportedException(String, String, int, Throwable);
+ }
+
+ public interface SQLInput {
+ method public java.sql.Array readArray() throws java.sql.SQLException;
+ method public java.io.InputStream readAsciiStream() throws java.sql.SQLException;
+ method public java.math.BigDecimal readBigDecimal() throws java.sql.SQLException;
+ method public java.io.InputStream readBinaryStream() throws java.sql.SQLException;
+ method public java.sql.Blob readBlob() throws java.sql.SQLException;
+ method public boolean readBoolean() throws java.sql.SQLException;
+ method public byte readByte() throws java.sql.SQLException;
+ method public byte[] readBytes() throws java.sql.SQLException;
+ method public java.io.Reader readCharacterStream() throws java.sql.SQLException;
+ method public java.sql.Clob readClob() throws java.sql.SQLException;
+ method public java.sql.Date readDate() throws java.sql.SQLException;
+ method public double readDouble() throws java.sql.SQLException;
+ method public float readFloat() throws java.sql.SQLException;
+ method public int readInt() throws java.sql.SQLException;
+ method public long readLong() throws java.sql.SQLException;
+ method public java.sql.NClob readNClob() throws java.sql.SQLException;
+ method public String readNString() throws java.sql.SQLException;
+ method public Object readObject() throws java.sql.SQLException;
+ method public java.sql.Ref readRef() throws java.sql.SQLException;
+ method public java.sql.RowId readRowId() throws java.sql.SQLException;
+ method public java.sql.SQLXML readSQLXML() throws java.sql.SQLException;
+ method public short readShort() throws java.sql.SQLException;
+ method public String readString() throws java.sql.SQLException;
+ method public java.sql.Time readTime() throws java.sql.SQLException;
+ method public java.sql.Timestamp readTimestamp() throws java.sql.SQLException;
+ method public java.net.URL readURL() throws java.sql.SQLException;
+ method public boolean wasNull() throws java.sql.SQLException;
}
public class SQLIntegrityConstraintViolationException extends java.sql.SQLNonTransientException {
ctor public SQLIntegrityConstraintViolationException();
- ctor public SQLIntegrityConstraintViolationException(java.lang.String);
- ctor public SQLIntegrityConstraintViolationException(java.lang.String, java.lang.String);
- ctor public SQLIntegrityConstraintViolationException(java.lang.String, java.lang.String, int);
- ctor public SQLIntegrityConstraintViolationException(java.lang.Throwable);
- ctor public SQLIntegrityConstraintViolationException(java.lang.String, java.lang.Throwable);
- ctor public SQLIntegrityConstraintViolationException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLIntegrityConstraintViolationException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLIntegrityConstraintViolationException(String);
+ ctor public SQLIntegrityConstraintViolationException(String, String);
+ ctor public SQLIntegrityConstraintViolationException(String, String, int);
+ ctor public SQLIntegrityConstraintViolationException(Throwable);
+ ctor public SQLIntegrityConstraintViolationException(String, Throwable);
+ ctor public SQLIntegrityConstraintViolationException(String, String, Throwable);
+ ctor public SQLIntegrityConstraintViolationException(String, String, int, Throwable);
}
public class SQLInvalidAuthorizationSpecException extends java.sql.SQLNonTransientException {
ctor public SQLInvalidAuthorizationSpecException();
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String, java.lang.String);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String, java.lang.String, int);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.Throwable);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String, java.lang.Throwable);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLInvalidAuthorizationSpecException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLInvalidAuthorizationSpecException(String);
+ ctor public SQLInvalidAuthorizationSpecException(String, String);
+ ctor public SQLInvalidAuthorizationSpecException(String, String, int);
+ ctor public SQLInvalidAuthorizationSpecException(Throwable);
+ ctor public SQLInvalidAuthorizationSpecException(String, Throwable);
+ ctor public SQLInvalidAuthorizationSpecException(String, String, Throwable);
+ ctor public SQLInvalidAuthorizationSpecException(String, String, int, Throwable);
}
public class SQLNonTransientConnectionException extends java.sql.SQLNonTransientException {
ctor public SQLNonTransientConnectionException();
- ctor public SQLNonTransientConnectionException(java.lang.String);
- ctor public SQLNonTransientConnectionException(java.lang.String, java.lang.String);
- ctor public SQLNonTransientConnectionException(java.lang.String, java.lang.String, int);
- ctor public SQLNonTransientConnectionException(java.lang.Throwable);
- ctor public SQLNonTransientConnectionException(java.lang.String, java.lang.Throwable);
- ctor public SQLNonTransientConnectionException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLNonTransientConnectionException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLNonTransientConnectionException(String);
+ ctor public SQLNonTransientConnectionException(String, String);
+ ctor public SQLNonTransientConnectionException(String, String, int);
+ ctor public SQLNonTransientConnectionException(Throwable);
+ ctor public SQLNonTransientConnectionException(String, Throwable);
+ ctor public SQLNonTransientConnectionException(String, String, Throwable);
+ ctor public SQLNonTransientConnectionException(String, String, int, Throwable);
}
public class SQLNonTransientException extends java.sql.SQLException {
ctor public SQLNonTransientException();
- ctor public SQLNonTransientException(java.lang.String);
- ctor public SQLNonTransientException(java.lang.String, java.lang.String);
- ctor public SQLNonTransientException(java.lang.String, java.lang.String, int);
- ctor public SQLNonTransientException(java.lang.Throwable);
- ctor public SQLNonTransientException(java.lang.String, java.lang.Throwable);
- ctor public SQLNonTransientException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLNonTransientException(java.lang.String, java.lang.String, int, java.lang.Throwable);
- }
-
- public abstract interface SQLOutput {
- method public abstract void writeArray(java.sql.Array) throws java.sql.SQLException;
- method public abstract void writeAsciiStream(java.io.InputStream) throws java.sql.SQLException;
- method public abstract void writeBigDecimal(java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void writeBinaryStream(java.io.InputStream) throws java.sql.SQLException;
- method public abstract void writeBlob(java.sql.Blob) throws java.sql.SQLException;
- method public abstract void writeBoolean(boolean) throws java.sql.SQLException;
- method public abstract void writeByte(byte) throws java.sql.SQLException;
- method public abstract void writeBytes(byte[]) throws java.sql.SQLException;
- method public abstract void writeCharacterStream(java.io.Reader) throws java.sql.SQLException;
- method public abstract void writeClob(java.sql.Clob) throws java.sql.SQLException;
- method public abstract void writeDate(java.sql.Date) throws java.sql.SQLException;
- method public abstract void writeDouble(double) throws java.sql.SQLException;
- method public abstract void writeFloat(float) throws java.sql.SQLException;
- method public abstract void writeInt(int) throws java.sql.SQLException;
- method public abstract void writeLong(long) throws java.sql.SQLException;
- method public abstract void writeNClob(java.sql.NClob) throws java.sql.SQLException;
- method public abstract void writeNString(java.lang.String) throws java.sql.SQLException;
- method public abstract void writeObject(java.sql.SQLData) throws java.sql.SQLException;
- method public abstract void writeRef(java.sql.Ref) throws java.sql.SQLException;
- method public abstract void writeRowId(java.sql.RowId) throws java.sql.SQLException;
- method public abstract void writeSQLXML(java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void writeShort(short) throws java.sql.SQLException;
- method public abstract void writeString(java.lang.String) throws java.sql.SQLException;
- method public abstract void writeStruct(java.sql.Struct) throws java.sql.SQLException;
- method public abstract void writeTime(java.sql.Time) throws java.sql.SQLException;
- method public abstract void writeTimestamp(java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void writeURL(java.net.URL) throws java.sql.SQLException;
+ ctor public SQLNonTransientException(String);
+ ctor public SQLNonTransientException(String, String);
+ ctor public SQLNonTransientException(String, String, int);
+ ctor public SQLNonTransientException(Throwable);
+ ctor public SQLNonTransientException(String, Throwable);
+ ctor public SQLNonTransientException(String, String, Throwable);
+ ctor public SQLNonTransientException(String, String, int, Throwable);
+ }
+
+ public interface SQLOutput {
+ method public void writeArray(java.sql.Array) throws java.sql.SQLException;
+ method public void writeAsciiStream(java.io.InputStream) throws java.sql.SQLException;
+ method public void writeBigDecimal(java.math.BigDecimal) throws java.sql.SQLException;
+ method public void writeBinaryStream(java.io.InputStream) throws java.sql.SQLException;
+ method public void writeBlob(java.sql.Blob) throws java.sql.SQLException;
+ method public void writeBoolean(boolean) throws java.sql.SQLException;
+ method public void writeByte(byte) throws java.sql.SQLException;
+ method public void writeBytes(byte[]) throws java.sql.SQLException;
+ method public void writeCharacterStream(java.io.Reader) throws java.sql.SQLException;
+ method public void writeClob(java.sql.Clob) throws java.sql.SQLException;
+ method public void writeDate(java.sql.Date) throws java.sql.SQLException;
+ method public void writeDouble(double) throws java.sql.SQLException;
+ method public void writeFloat(float) throws java.sql.SQLException;
+ method public void writeInt(int) throws java.sql.SQLException;
+ method public void writeLong(long) throws java.sql.SQLException;
+ method public void writeNClob(java.sql.NClob) throws java.sql.SQLException;
+ method public void writeNString(String) throws java.sql.SQLException;
+ method public void writeObject(java.sql.SQLData) throws java.sql.SQLException;
+ method public void writeRef(java.sql.Ref) throws java.sql.SQLException;
+ method public void writeRowId(java.sql.RowId) throws java.sql.SQLException;
+ method public void writeSQLXML(java.sql.SQLXML) throws java.sql.SQLException;
+ method public void writeShort(short) throws java.sql.SQLException;
+ method public void writeString(String) throws java.sql.SQLException;
+ method public void writeStruct(java.sql.Struct) throws java.sql.SQLException;
+ method public void writeTime(java.sql.Time) throws java.sql.SQLException;
+ method public void writeTimestamp(java.sql.Timestamp) throws java.sql.SQLException;
+ method public void writeURL(java.net.URL) throws java.sql.SQLException;
}
public final class SQLPermission extends java.security.BasicPermission {
- ctor public SQLPermission(java.lang.String);
- ctor public SQLPermission(java.lang.String, java.lang.String);
+ ctor public SQLPermission(String);
+ ctor public SQLPermission(String, String);
}
public class SQLRecoverableException extends java.sql.SQLException {
ctor public SQLRecoverableException();
- ctor public SQLRecoverableException(java.lang.String);
- ctor public SQLRecoverableException(java.lang.String, java.lang.String);
- ctor public SQLRecoverableException(java.lang.String, java.lang.String, int);
- ctor public SQLRecoverableException(java.lang.Throwable);
- ctor public SQLRecoverableException(java.lang.String, java.lang.Throwable);
- ctor public SQLRecoverableException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLRecoverableException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLRecoverableException(String);
+ ctor public SQLRecoverableException(String, String);
+ ctor public SQLRecoverableException(String, String, int);
+ ctor public SQLRecoverableException(Throwable);
+ ctor public SQLRecoverableException(String, Throwable);
+ ctor public SQLRecoverableException(String, String, Throwable);
+ ctor public SQLRecoverableException(String, String, int, Throwable);
}
public class SQLSyntaxErrorException extends java.sql.SQLNonTransientException {
ctor public SQLSyntaxErrorException();
- ctor public SQLSyntaxErrorException(java.lang.String);
- ctor public SQLSyntaxErrorException(java.lang.String, java.lang.String);
- ctor public SQLSyntaxErrorException(java.lang.String, java.lang.String, int);
- ctor public SQLSyntaxErrorException(java.lang.Throwable);
- ctor public SQLSyntaxErrorException(java.lang.String, java.lang.Throwable);
- ctor public SQLSyntaxErrorException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLSyntaxErrorException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLSyntaxErrorException(String);
+ ctor public SQLSyntaxErrorException(String, String);
+ ctor public SQLSyntaxErrorException(String, String, int);
+ ctor public SQLSyntaxErrorException(Throwable);
+ ctor public SQLSyntaxErrorException(String, Throwable);
+ ctor public SQLSyntaxErrorException(String, String, Throwable);
+ ctor public SQLSyntaxErrorException(String, String, int, Throwable);
}
public class SQLTimeoutException extends java.sql.SQLTransientException {
ctor public SQLTimeoutException();
- ctor public SQLTimeoutException(java.lang.String);
- ctor public SQLTimeoutException(java.lang.String, java.lang.String);
- ctor public SQLTimeoutException(java.lang.String, java.lang.String, int);
- ctor public SQLTimeoutException(java.lang.Throwable);
- ctor public SQLTimeoutException(java.lang.String, java.lang.Throwable);
- ctor public SQLTimeoutException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLTimeoutException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLTimeoutException(String);
+ ctor public SQLTimeoutException(String, String);
+ ctor public SQLTimeoutException(String, String, int);
+ ctor public SQLTimeoutException(Throwable);
+ ctor public SQLTimeoutException(String, Throwable);
+ ctor public SQLTimeoutException(String, String, Throwable);
+ ctor public SQLTimeoutException(String, String, int, Throwable);
}
public class SQLTransactionRollbackException extends java.sql.SQLTransientException {
ctor public SQLTransactionRollbackException();
- ctor public SQLTransactionRollbackException(java.lang.String);
- ctor public SQLTransactionRollbackException(java.lang.String, java.lang.String);
- ctor public SQLTransactionRollbackException(java.lang.String, java.lang.String, int);
- ctor public SQLTransactionRollbackException(java.lang.Throwable);
- ctor public SQLTransactionRollbackException(java.lang.String, java.lang.Throwable);
- ctor public SQLTransactionRollbackException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLTransactionRollbackException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLTransactionRollbackException(String);
+ ctor public SQLTransactionRollbackException(String, String);
+ ctor public SQLTransactionRollbackException(String, String, int);
+ ctor public SQLTransactionRollbackException(Throwable);
+ ctor public SQLTransactionRollbackException(String, Throwable);
+ ctor public SQLTransactionRollbackException(String, String, Throwable);
+ ctor public SQLTransactionRollbackException(String, String, int, Throwable);
}
public class SQLTransientConnectionException extends java.sql.SQLTransientException {
ctor public SQLTransientConnectionException();
- ctor public SQLTransientConnectionException(java.lang.String);
- ctor public SQLTransientConnectionException(java.lang.String, java.lang.String);
- ctor public SQLTransientConnectionException(java.lang.String, java.lang.String, int);
- ctor public SQLTransientConnectionException(java.lang.Throwable);
- ctor public SQLTransientConnectionException(java.lang.String, java.lang.Throwable);
- ctor public SQLTransientConnectionException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLTransientConnectionException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLTransientConnectionException(String);
+ ctor public SQLTransientConnectionException(String, String);
+ ctor public SQLTransientConnectionException(String, String, int);
+ ctor public SQLTransientConnectionException(Throwable);
+ ctor public SQLTransientConnectionException(String, Throwable);
+ ctor public SQLTransientConnectionException(String, String, Throwable);
+ ctor public SQLTransientConnectionException(String, String, int, Throwable);
}
public class SQLTransientException extends java.sql.SQLException {
ctor public SQLTransientException();
- ctor public SQLTransientException(java.lang.String);
- ctor public SQLTransientException(java.lang.String, java.lang.String);
- ctor public SQLTransientException(java.lang.String, java.lang.String, int);
- ctor public SQLTransientException(java.lang.Throwable);
- ctor public SQLTransientException(java.lang.String, java.lang.Throwable);
- ctor public SQLTransientException(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLTransientException(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLTransientException(String);
+ ctor public SQLTransientException(String, String);
+ ctor public SQLTransientException(String, String, int);
+ ctor public SQLTransientException(Throwable);
+ ctor public SQLTransientException(String, Throwable);
+ ctor public SQLTransientException(String, String, Throwable);
+ ctor public SQLTransientException(String, String, int, Throwable);
}
public class SQLWarning extends java.sql.SQLException {
- ctor public SQLWarning(java.lang.String, java.lang.String, int);
- ctor public SQLWarning(java.lang.String, java.lang.String);
- ctor public SQLWarning(java.lang.String);
+ ctor public SQLWarning(String, String, int);
+ ctor public SQLWarning(String, String);
+ ctor public SQLWarning(String);
ctor public SQLWarning();
- ctor public SQLWarning(java.lang.Throwable);
- ctor public SQLWarning(java.lang.String, java.lang.Throwable);
- ctor public SQLWarning(java.lang.String, java.lang.String, java.lang.Throwable);
- ctor public SQLWarning(java.lang.String, java.lang.String, int, java.lang.Throwable);
+ ctor public SQLWarning(Throwable);
+ ctor public SQLWarning(String, Throwable);
+ ctor public SQLWarning(String, String, Throwable);
+ ctor public SQLWarning(String, String, int, Throwable);
method public java.sql.SQLWarning getNextWarning();
method public void setNextWarning(java.sql.SQLWarning);
}
- public abstract interface SQLXML {
- method public abstract void free() throws java.sql.SQLException;
- method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException;
- method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException;
- method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException;
- method public abstract java.lang.String getString() throws java.sql.SQLException;
- method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException;
- method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException;
- method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException;
- method public abstract void setString(java.lang.String) throws java.sql.SQLException;
- }
-
- public abstract interface Savepoint {
- method public abstract int getSavepointId() throws java.sql.SQLException;
- method public abstract java.lang.String getSavepointName() throws java.sql.SQLException;
- }
-
- public abstract interface Statement implements java.lang.AutoCloseable java.sql.Wrapper {
- method public abstract void addBatch(java.lang.String) throws java.sql.SQLException;
- method public abstract void cancel() throws java.sql.SQLException;
- method public abstract void clearBatch() throws java.sql.SQLException;
- method public abstract void clearWarnings() throws java.sql.SQLException;
- method public abstract void close() throws java.sql.SQLException;
- method public abstract boolean execute(java.lang.String) throws java.sql.SQLException;
- method public abstract boolean execute(java.lang.String, int) throws java.sql.SQLException;
- method public abstract boolean execute(java.lang.String, int[]) throws java.sql.SQLException;
- method public abstract boolean execute(java.lang.String, java.lang.String[]) throws java.sql.SQLException;
- method public abstract int[] executeBatch() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet executeQuery(java.lang.String) throws java.sql.SQLException;
- method public abstract int executeUpdate(java.lang.String) throws java.sql.SQLException;
- method public abstract int executeUpdate(java.lang.String, int) throws java.sql.SQLException;
- method public abstract int executeUpdate(java.lang.String, int[]) throws java.sql.SQLException;
- method public abstract int executeUpdate(java.lang.String, java.lang.String[]) throws java.sql.SQLException;
- method public abstract java.sql.Connection getConnection() throws java.sql.SQLException;
- method public abstract int getFetchDirection() throws java.sql.SQLException;
- method public abstract int getFetchSize() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getGeneratedKeys() throws java.sql.SQLException;
- method public abstract int getMaxFieldSize() throws java.sql.SQLException;
- method public abstract int getMaxRows() throws java.sql.SQLException;
- method public abstract boolean getMoreResults() throws java.sql.SQLException;
- method public abstract boolean getMoreResults(int) throws java.sql.SQLException;
- method public abstract int getQueryTimeout() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getResultSet() throws java.sql.SQLException;
- method public abstract int getResultSetConcurrency() throws java.sql.SQLException;
- method public abstract int getResultSetHoldability() throws java.sql.SQLException;
- method public abstract int getResultSetType() throws java.sql.SQLException;
- method public abstract int getUpdateCount() throws java.sql.SQLException;
- method public abstract java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
- method public abstract boolean isClosed() throws java.sql.SQLException;
- method public abstract boolean isPoolable() throws java.sql.SQLException;
- method public abstract void setCursorName(java.lang.String) throws java.sql.SQLException;
- method public abstract void setEscapeProcessing(boolean) throws java.sql.SQLException;
- method public abstract void setFetchDirection(int) throws java.sql.SQLException;
- method public abstract void setFetchSize(int) throws java.sql.SQLException;
- method public abstract void setMaxFieldSize(int) throws java.sql.SQLException;
- method public abstract void setMaxRows(int) throws java.sql.SQLException;
- method public abstract void setPoolable(boolean) throws java.sql.SQLException;
- method public abstract void setQueryTimeout(int) throws java.sql.SQLException;
+ public interface SQLXML {
+ method public void free() throws java.sql.SQLException;
+ method public java.io.InputStream getBinaryStream() throws java.sql.SQLException;
+ method public java.io.Reader getCharacterStream() throws java.sql.SQLException;
+ method public <T extends javax.xml.transform.Source> T getSource(Class<T>) throws java.sql.SQLException;
+ method public String getString() throws java.sql.SQLException;
+ method public java.io.OutputStream setBinaryStream() throws java.sql.SQLException;
+ method public java.io.Writer setCharacterStream() throws java.sql.SQLException;
+ method public <T extends javax.xml.transform.Result> T setResult(Class<T>) throws java.sql.SQLException;
+ method public void setString(String) throws java.sql.SQLException;
+ }
+
+ public interface Savepoint {
+ method public int getSavepointId() throws java.sql.SQLException;
+ method public String getSavepointName() throws java.sql.SQLException;
+ }
+
+ public interface Statement extends java.sql.Wrapper java.lang.AutoCloseable {
+ method public void addBatch(String) throws java.sql.SQLException;
+ method public void cancel() throws java.sql.SQLException;
+ method public void clearBatch() throws java.sql.SQLException;
+ method public void clearWarnings() throws java.sql.SQLException;
+ method public void close() throws java.sql.SQLException;
+ method public boolean execute(String) throws java.sql.SQLException;
+ method public boolean execute(String, int) throws java.sql.SQLException;
+ method public boolean execute(String, int[]) throws java.sql.SQLException;
+ method public boolean execute(String, String[]) throws java.sql.SQLException;
+ method public int[] executeBatch() throws java.sql.SQLException;
+ method public java.sql.ResultSet executeQuery(String) throws java.sql.SQLException;
+ method public int executeUpdate(String) throws java.sql.SQLException;
+ method public int executeUpdate(String, int) throws java.sql.SQLException;
+ method public int executeUpdate(String, int[]) throws java.sql.SQLException;
+ method public int executeUpdate(String, String[]) throws java.sql.SQLException;
+ method public java.sql.Connection getConnection() throws java.sql.SQLException;
+ method public int getFetchDirection() throws java.sql.SQLException;
+ method public int getFetchSize() throws java.sql.SQLException;
+ method public java.sql.ResultSet getGeneratedKeys() throws java.sql.SQLException;
+ method public int getMaxFieldSize() throws java.sql.SQLException;
+ method public int getMaxRows() throws java.sql.SQLException;
+ method public boolean getMoreResults() throws java.sql.SQLException;
+ method public boolean getMoreResults(int) throws java.sql.SQLException;
+ method public int getQueryTimeout() throws java.sql.SQLException;
+ method public java.sql.ResultSet getResultSet() throws java.sql.SQLException;
+ method public int getResultSetConcurrency() throws java.sql.SQLException;
+ method public int getResultSetHoldability() throws java.sql.SQLException;
+ method public int getResultSetType() throws java.sql.SQLException;
+ method public int getUpdateCount() throws java.sql.SQLException;
+ method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
+ method public boolean isClosed() throws java.sql.SQLException;
+ method public boolean isPoolable() throws java.sql.SQLException;
+ method public void setCursorName(String) throws java.sql.SQLException;
+ method public void setEscapeProcessing(boolean) throws java.sql.SQLException;
+ method public void setFetchDirection(int) throws java.sql.SQLException;
+ method public void setFetchSize(int) throws java.sql.SQLException;
+ method public void setMaxFieldSize(int) throws java.sql.SQLException;
+ method public void setMaxRows(int) throws java.sql.SQLException;
+ method public void setPoolable(boolean) throws java.sql.SQLException;
+ method public void setQueryTimeout(int) throws java.sql.SQLException;
field public static final int CLOSE_ALL_RESULTS = 3; // 0x3
field public static final int CLOSE_CURRENT_RESULT = 1; // 0x1
field public static final int EXECUTE_FAILED = -3; // 0xfffffffd
@@ -66249,20 +66459,20 @@ package java.sql {
field public static final int SUCCESS_NO_INFO = -2; // 0xfffffffe
}
- public abstract interface Struct {
- method public abstract java.lang.Object[] getAttributes() throws java.sql.SQLException;
- method public abstract java.lang.Object[] getAttributes(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract java.lang.String getSQLTypeName() throws java.sql.SQLException;
+ public interface Struct {
+ method public Object[] getAttributes() throws java.sql.SQLException;
+ method public Object[] getAttributes(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public String getSQLTypeName() throws java.sql.SQLException;
}
public class Time extends java.util.Date {
- ctor public deprecated Time(int, int, int);
+ ctor @Deprecated public Time(int, int, int);
ctor public Time(long);
- method public static java.sql.Time valueOf(java.lang.String);
+ method public static java.sql.Time valueOf(String);
}
public class Timestamp extends java.util.Date {
- ctor public deprecated Timestamp(int, int, int, int, int, int, int);
+ ctor @Deprecated public Timestamp(int, int, int, int, int, int, int);
ctor public Timestamp(long);
method public boolean after(java.sql.Timestamp);
method public boolean before(java.sql.Timestamp);
@@ -66270,7 +66480,7 @@ package java.sql {
method public boolean equals(java.sql.Timestamp);
method public int getNanos();
method public void setNanos(int);
- method public static java.sql.Timestamp valueOf(java.lang.String);
+ method public static java.sql.Timestamp valueOf(String);
}
public class Types {
@@ -66312,9 +66522,9 @@ package java.sql {
field public static final int VARCHAR = 12; // 0xc
}
- public abstract interface Wrapper {
- method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
- method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
+ public interface Wrapper {
+ method public boolean isWrapperFor(Class<?>) throws java.sql.SQLException;
+ method public <T> T unwrap(Class<T>) throws java.sql.SQLException;
}
}
@@ -66322,49 +66532,49 @@ package java.sql {
package java.text {
public class Annotation {
- ctor public Annotation(java.lang.Object);
- method public java.lang.Object getValue();
+ ctor public Annotation(Object);
+ method public Object getValue();
}
- public abstract interface AttributedCharacterIterator implements java.text.CharacterIterator {
- method public abstract java.util.Set<java.text.AttributedCharacterIterator.Attribute> getAllAttributeKeys();
- method public abstract java.lang.Object getAttribute(java.text.AttributedCharacterIterator.Attribute);
- method public abstract java.util.Map<java.text.AttributedCharacterIterator.Attribute, java.lang.Object> getAttributes();
- method public abstract int getRunLimit();
- method public abstract int getRunLimit(java.text.AttributedCharacterIterator.Attribute);
- method public abstract int getRunLimit(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
- method public abstract int getRunStart();
- method public abstract int getRunStart(java.text.AttributedCharacterIterator.Attribute);
- method public abstract int getRunStart(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
+ public interface AttributedCharacterIterator extends java.text.CharacterIterator {
+ method public java.util.Set<java.text.AttributedCharacterIterator.Attribute> getAllAttributeKeys();
+ method public Object getAttribute(java.text.AttributedCharacterIterator.Attribute);
+ method public java.util.Map<java.text.AttributedCharacterIterator.Attribute,java.lang.Object> getAttributes();
+ method public int getRunLimit();
+ method public int getRunLimit(java.text.AttributedCharacterIterator.Attribute);
+ method public int getRunLimit(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
+ method public int getRunStart();
+ method public int getRunStart(java.text.AttributedCharacterIterator.Attribute);
+ method public int getRunStart(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
}
public static class AttributedCharacterIterator.Attribute implements java.io.Serializable {
- ctor protected AttributedCharacterIterator.Attribute(java.lang.String);
- method public final boolean equals(java.lang.Object);
- method protected java.lang.String getName();
+ ctor protected AttributedCharacterIterator.Attribute(String);
+ method public final boolean equals(Object);
+ method protected String getName();
method public final int hashCode();
- method protected java.lang.Object readResolve() throws java.io.InvalidObjectException;
+ method protected Object readResolve() throws java.io.InvalidObjectException;
field public static final java.text.AttributedCharacterIterator.Attribute INPUT_METHOD_SEGMENT;
field public static final java.text.AttributedCharacterIterator.Attribute LANGUAGE;
field public static final java.text.AttributedCharacterIterator.Attribute READING;
}
public class AttributedString {
- ctor public AttributedString(java.lang.String);
- ctor public AttributedString(java.lang.String, java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute, ?>);
+ ctor public AttributedString(String);
+ ctor public AttributedString(String, java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute,?>);
ctor public AttributedString(java.text.AttributedCharacterIterator);
ctor public AttributedString(java.text.AttributedCharacterIterator, int, int);
ctor public AttributedString(java.text.AttributedCharacterIterator, int, int, java.text.AttributedCharacterIterator.Attribute[]);
- method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, java.lang.Object);
- method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, java.lang.Object, int, int);
- method public void addAttributes(java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute, ?>, int, int);
+ method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, Object);
+ method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, Object, int, int);
+ method public void addAttributes(java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute,?>, int, int);
method public java.text.AttributedCharacterIterator getIterator();
method public java.text.AttributedCharacterIterator getIterator(java.text.AttributedCharacterIterator.Attribute[]);
method public java.text.AttributedCharacterIterator getIterator(java.text.AttributedCharacterIterator.Attribute[], int, int);
}
public final class Bidi {
- ctor public Bidi(java.lang.String, int);
+ ctor public Bidi(String, int);
ctor public Bidi(java.text.AttributedCharacterIterator);
ctor public Bidi(char[], int, byte[], int, int, int);
method public boolean baseIsLeftToRight();
@@ -66379,7 +66589,7 @@ package java.text {
method public boolean isLeftToRight();
method public boolean isMixed();
method public boolean isRightToLeft();
- method public static void reorderVisually(byte[], int, java.lang.Object[], int, int);
+ method public static void reorderVisually(byte[], int, Object[], int, int);
method public static boolean requiresBidi(char[], int, int);
field public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2; // 0xfffffffe
field public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1; // 0xffffffff
@@ -66389,11 +66599,11 @@ package java.text {
public abstract class BreakIterator implements java.lang.Cloneable {
ctor protected BreakIterator();
- method public java.lang.Object clone();
+ method public Object clone();
method public abstract int current();
method public abstract int first();
method public abstract int following(int);
- method public static synchronized java.util.Locale[] getAvailableLocales();
+ method public static java.util.Locale[] getAvailableLocales();
method public static java.text.BreakIterator getCharacterInstance();
method public static java.text.BreakIterator getCharacterInstance(java.util.Locale);
method public static java.text.BreakIterator getLineInstance();
@@ -66409,39 +66619,39 @@ package java.text {
method public abstract int next();
method public int preceding(int);
method public abstract int previous();
- method public void setText(java.lang.String);
+ method public void setText(String);
method public abstract void setText(java.text.CharacterIterator);
field public static final int DONE = -1; // 0xffffffff
}
- public abstract interface CharacterIterator implements java.lang.Cloneable {
- method public abstract java.lang.Object clone();
- method public abstract char current();
- method public abstract char first();
- method public abstract int getBeginIndex();
- method public abstract int getEndIndex();
- method public abstract int getIndex();
- method public abstract char last();
- method public abstract char next();
- method public abstract char previous();
- method public abstract char setIndex(int);
+ public interface CharacterIterator extends java.lang.Cloneable {
+ method public Object clone();
+ method public char current();
+ method public char first();
+ method public int getBeginIndex();
+ method public int getEndIndex();
+ method public int getIndex();
+ method public char last();
+ method public char next();
+ method public char previous();
+ method public char setIndex(int);
field public static final char DONE = 65535; // 0xffff '\uffff'
}
public class ChoiceFormat extends java.text.NumberFormat {
- ctor public ChoiceFormat(java.lang.String);
- ctor public ChoiceFormat(double[], java.lang.String[]);
- method public void applyPattern(java.lang.String);
- method public java.lang.StringBuffer format(long, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(double, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.Object[] getFormats();
+ ctor public ChoiceFormat(String);
+ ctor public ChoiceFormat(double[], String[]);
+ method public void applyPattern(String);
+ method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
+ method public Object[] getFormats();
method public double[] getLimits();
method public static final double nextDouble(double);
method public static double nextDouble(double, boolean);
- method public java.lang.Number parse(java.lang.String, java.text.ParsePosition);
+ method public Number parse(String, java.text.ParsePosition);
method public static final double previousDouble(double);
- method public void setChoices(double[], java.lang.String[]);
- method public java.lang.String toPattern();
+ method public void setChoices(double[], String[]);
+ method public String toPattern();
}
public final class CollationElementIterator {
@@ -66453,34 +66663,34 @@ package java.text {
method public void reset();
method public static short secondaryOrder(int);
method public void setOffset(int);
- method public void setText(java.lang.String);
+ method public void setText(String);
method public void setText(java.text.CharacterIterator);
method public static short tertiaryOrder(int);
field public static final int NULLORDER = -1; // 0xffffffff
}
- public abstract class CollationKey implements java.lang.Comparable {
- ctor protected CollationKey(java.lang.String);
+ public abstract class CollationKey implements java.lang.Comparable<java.text.CollationKey> {
+ ctor protected CollationKey(String);
method public abstract int compareTo(java.text.CollationKey);
- method public java.lang.String getSourceString();
+ method public String getSourceString();
method public abstract byte[] toByteArray();
}
- public abstract class Collator implements java.lang.Cloneable java.util.Comparator {
+ public abstract class Collator implements java.lang.Cloneable java.util.Comparator<java.lang.Object> {
ctor protected Collator();
- method public java.lang.Object clone();
- method public abstract int compare(java.lang.String, java.lang.String);
- method public int compare(java.lang.Object, java.lang.Object);
- method public boolean equals(java.lang.String, java.lang.String);
- method public static synchronized java.util.Locale[] getAvailableLocales();
- method public abstract java.text.CollationKey getCollationKey(java.lang.String);
- method public synchronized int getDecomposition();
- method public static synchronized java.text.Collator getInstance();
- method public static synchronized java.text.Collator getInstance(java.util.Locale);
- method public synchronized int getStrength();
+ method public Object clone();
+ method public abstract int compare(String, String);
+ method public int compare(Object, Object);
+ method public boolean equals(String, String);
+ method public static java.util.Locale[] getAvailableLocales();
+ method public abstract java.text.CollationKey getCollationKey(String);
+ method public int getDecomposition();
+ method public static java.text.Collator getInstance();
+ method public static java.text.Collator getInstance(java.util.Locale);
+ method public int getStrength();
method public abstract int hashCode();
- method public synchronized void setDecomposition(int);
- method public synchronized void setStrength(int);
+ method public void setDecomposition(int);
+ method public void setStrength(int);
field public static final int CANONICAL_DECOMPOSITION = 1; // 0x1
field public static final int FULL_DECOMPOSITION = 2; // 0x2
field public static final int IDENTICAL = 3; // 0x3
@@ -66492,31 +66702,31 @@ package java.text {
public abstract class DateFormat extends java.text.Format {
ctor protected DateFormat();
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(java.util.Date, java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.String format(java.util.Date);
+ method @NonNull public final StringBuffer format(@NonNull Object, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
+ method @NonNull public abstract StringBuffer format(@NonNull java.util.Date, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
+ method @NonNull public final String format(@NonNull java.util.Date);
method public static java.util.Locale[] getAvailableLocales();
- method public java.util.Calendar getCalendar();
- method public static final java.text.DateFormat getDateInstance();
- method public static final java.text.DateFormat getDateInstance(int);
- method public static final java.text.DateFormat getDateInstance(int, java.util.Locale);
- method public static final java.text.DateFormat getDateTimeInstance();
- method public static final java.text.DateFormat getDateTimeInstance(int, int);
- method public static final java.text.DateFormat getDateTimeInstance(int, int, java.util.Locale);
- method public static final java.text.DateFormat getInstance();
- method public java.text.NumberFormat getNumberFormat();
- method public static final java.text.DateFormat getTimeInstance();
- method public static final java.text.DateFormat getTimeInstance(int);
- method public static final java.text.DateFormat getTimeInstance(int, java.util.Locale);
- method public java.util.TimeZone getTimeZone();
+ method @NonNull public java.util.Calendar getCalendar();
+ method @NonNull public static final java.text.DateFormat getDateInstance();
+ method @NonNull public static final java.text.DateFormat getDateInstance(int);
+ method @NonNull public static final java.text.DateFormat getDateInstance(int, @NonNull java.util.Locale);
+ method @NonNull public static final java.text.DateFormat getDateTimeInstance();
+ method @NonNull public static final java.text.DateFormat getDateTimeInstance(int, int);
+ method @NonNull public static final java.text.DateFormat getDateTimeInstance(int, int, @NonNull java.util.Locale);
+ method @NonNull public static final java.text.DateFormat getInstance();
+ method @NonNull public java.text.NumberFormat getNumberFormat();
+ method @NonNull public static final java.text.DateFormat getTimeInstance();
+ method @NonNull public static final java.text.DateFormat getTimeInstance(int);
+ method @NonNull public static final java.text.DateFormat getTimeInstance(int, @NonNull java.util.Locale);
+ method @NonNull public java.util.TimeZone getTimeZone();
method public boolean isLenient();
- method public java.util.Date parse(java.lang.String) throws java.text.ParseException;
- method public abstract java.util.Date parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public void setCalendar(java.util.Calendar);
+ method @Nullable public java.util.Date parse(@NonNull String) throws java.text.ParseException;
+ method @Nullable public abstract java.util.Date parse(@NonNull String, @NonNull java.text.ParsePosition);
+ method @Nullable public Object parseObject(@NonNull String, @NonNull java.text.ParsePosition);
+ method public void setCalendar(@NonNull java.util.Calendar);
method public void setLenient(boolean);
- method public void setNumberFormat(java.text.NumberFormat);
- method public void setTimeZone(java.util.TimeZone);
+ method public void setNumberFormat(@NonNull java.text.NumberFormat);
+ method public void setTimeZone(@NonNull java.util.TimeZone);
field public static final int AM_PM_FIELD = 14; // 0xe
field public static final int DATE_FIELD = 3; // 0x3
field public static final int DAY_OF_WEEK_FIELD = 9; // 0x9
@@ -66540,124 +66750,124 @@ package java.text {
field public static final int WEEK_OF_MONTH_FIELD = 13; // 0xd
field public static final int WEEK_OF_YEAR_FIELD = 12; // 0xc
field public static final int YEAR_FIELD = 1; // 0x1
- field protected java.util.Calendar calendar;
- field protected java.text.NumberFormat numberFormat;
+ field @NonNull protected java.util.Calendar calendar;
+ field @NonNull protected java.text.NumberFormat numberFormat;
}
public static class DateFormat.Field extends java.text.Format.Field {
- ctor protected DateFormat.Field(java.lang.String, int);
+ ctor protected DateFormat.Field(@NonNull String, int);
method public int getCalendarField();
- method public static java.text.DateFormat.Field ofCalendarField(int);
- field public static final java.text.DateFormat.Field AM_PM;
- field public static final java.text.DateFormat.Field DAY_OF_MONTH;
- field public static final java.text.DateFormat.Field DAY_OF_WEEK;
- field public static final java.text.DateFormat.Field DAY_OF_WEEK_IN_MONTH;
- field public static final java.text.DateFormat.Field DAY_OF_YEAR;
- field public static final java.text.DateFormat.Field ERA;
- field public static final java.text.DateFormat.Field HOUR0;
- field public static final java.text.DateFormat.Field HOUR1;
- field public static final java.text.DateFormat.Field HOUR_OF_DAY0;
- field public static final java.text.DateFormat.Field HOUR_OF_DAY1;
- field public static final java.text.DateFormat.Field MILLISECOND;
- field public static final java.text.DateFormat.Field MINUTE;
- field public static final java.text.DateFormat.Field MONTH;
- field public static final java.text.DateFormat.Field SECOND;
- field public static final java.text.DateFormat.Field TIME_ZONE;
- field public static final java.text.DateFormat.Field WEEK_OF_MONTH;
- field public static final java.text.DateFormat.Field WEEK_OF_YEAR;
- field public static final java.text.DateFormat.Field YEAR;
+ method @NonNull public static java.text.DateFormat.Field ofCalendarField(int);
+ field @NonNull public static final java.text.DateFormat.Field AM_PM;
+ field @NonNull public static final java.text.DateFormat.Field DAY_OF_MONTH;
+ field @NonNull public static final java.text.DateFormat.Field DAY_OF_WEEK;
+ field @NonNull public static final java.text.DateFormat.Field DAY_OF_WEEK_IN_MONTH;
+ field @NonNull public static final java.text.DateFormat.Field DAY_OF_YEAR;
+ field @NonNull public static final java.text.DateFormat.Field ERA;
+ field @NonNull public static final java.text.DateFormat.Field HOUR0;
+ field @NonNull public static final java.text.DateFormat.Field HOUR1;
+ field @NonNull public static final java.text.DateFormat.Field HOUR_OF_DAY0;
+ field @NonNull public static final java.text.DateFormat.Field HOUR_OF_DAY1;
+ field @NonNull public static final java.text.DateFormat.Field MILLISECOND;
+ field @NonNull public static final java.text.DateFormat.Field MINUTE;
+ field @NonNull public static final java.text.DateFormat.Field MONTH;
+ field @NonNull public static final java.text.DateFormat.Field SECOND;
+ field @NonNull public static final java.text.DateFormat.Field TIME_ZONE;
+ field @NonNull public static final java.text.DateFormat.Field WEEK_OF_MONTH;
+ field @NonNull public static final java.text.DateFormat.Field WEEK_OF_YEAR;
+ field @NonNull public static final java.text.DateFormat.Field YEAR;
}
public class DateFormatSymbols implements java.lang.Cloneable java.io.Serializable {
ctor public DateFormatSymbols();
ctor public DateFormatSymbols(java.util.Locale);
- method public java.lang.Object clone();
- method public java.lang.String[] getAmPmStrings();
+ method public Object clone();
+ method public String[] getAmPmStrings();
method public static java.util.Locale[] getAvailableLocales();
- method public java.lang.String[] getEras();
+ method public String[] getEras();
method public static final java.text.DateFormatSymbols getInstance();
method public static final java.text.DateFormatSymbols getInstance(java.util.Locale);
- method public java.lang.String getLocalPatternChars();
- method public java.lang.String[] getMonths();
- method public java.lang.String[] getShortMonths();
- method public java.lang.String[] getShortWeekdays();
- method public java.lang.String[] getWeekdays();
- method public java.lang.String[][] getZoneStrings();
- method public void setAmPmStrings(java.lang.String[]);
- method public void setEras(java.lang.String[]);
- method public void setLocalPatternChars(java.lang.String);
- method public void setMonths(java.lang.String[]);
- method public void setShortMonths(java.lang.String[]);
- method public void setShortWeekdays(java.lang.String[]);
- method public void setWeekdays(java.lang.String[]);
- method public void setZoneStrings(java.lang.String[][]);
+ method public String getLocalPatternChars();
+ method public String[] getMonths();
+ method public String[] getShortMonths();
+ method public String[] getShortWeekdays();
+ method public String[] getWeekdays();
+ method public String[][] getZoneStrings();
+ method public void setAmPmStrings(String[]);
+ method public void setEras(String[]);
+ method public void setLocalPatternChars(String);
+ method public void setMonths(String[]);
+ method public void setShortMonths(String[]);
+ method public void setShortWeekdays(String[]);
+ method public void setWeekdays(String[]);
+ method public void setZoneStrings(String[][]);
}
public class DecimalFormat extends java.text.NumberFormat {
ctor public DecimalFormat();
- ctor public DecimalFormat(java.lang.String);
- ctor public DecimalFormat(java.lang.String, java.text.DecimalFormatSymbols);
- method public void applyLocalizedPattern(java.lang.String);
- method public void applyPattern(java.lang.String);
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(double, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.lang.StringBuffer format(long, java.lang.StringBuffer, java.text.FieldPosition);
+ ctor public DecimalFormat(String);
+ ctor public DecimalFormat(String, java.text.DecimalFormatSymbols);
+ method public void applyLocalizedPattern(String);
+ method public void applyPattern(String);
+ method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
+ method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
method public java.text.DecimalFormatSymbols getDecimalFormatSymbols();
method public int getGroupingSize();
method public int getMultiplier();
- method public java.lang.String getNegativePrefix();
- method public java.lang.String getNegativeSuffix();
- method public java.lang.String getPositivePrefix();
- method public java.lang.String getPositiveSuffix();
+ method public String getNegativePrefix();
+ method public String getNegativeSuffix();
+ method public String getPositivePrefix();
+ method public String getPositiveSuffix();
method public boolean isDecimalSeparatorAlwaysShown();
method public boolean isParseBigDecimal();
- method public java.lang.Number parse(java.lang.String, java.text.ParsePosition);
+ method public Number parse(String, java.text.ParsePosition);
method public void setDecimalFormatSymbols(java.text.DecimalFormatSymbols);
method public void setDecimalSeparatorAlwaysShown(boolean);
method public void setGroupingSize(int);
method public void setMultiplier(int);
- method public void setNegativePrefix(java.lang.String);
- method public void setNegativeSuffix(java.lang.String);
+ method public void setNegativePrefix(String);
+ method public void setNegativeSuffix(String);
method public void setParseBigDecimal(boolean);
- method public void setPositivePrefix(java.lang.String);
- method public void setPositiveSuffix(java.lang.String);
- method public java.lang.String toLocalizedPattern();
- method public java.lang.String toPattern();
+ method public void setPositivePrefix(String);
+ method public void setPositiveSuffix(String);
+ method public String toLocalizedPattern();
+ method public String toPattern();
}
public class DecimalFormatSymbols implements java.lang.Cloneable java.io.Serializable {
ctor public DecimalFormatSymbols();
ctor public DecimalFormatSymbols(java.util.Locale);
- method public java.lang.Object clone();
+ method public Object clone();
method public static java.util.Locale[] getAvailableLocales();
method public java.util.Currency getCurrency();
- method public java.lang.String getCurrencySymbol();
+ method public String getCurrencySymbol();
method public char getDecimalSeparator();
method public char getDigit();
- method public java.lang.String getExponentSeparator();
+ method public String getExponentSeparator();
method public char getGroupingSeparator();
- method public java.lang.String getInfinity();
+ method public String getInfinity();
method public static final java.text.DecimalFormatSymbols getInstance();
method public static final java.text.DecimalFormatSymbols getInstance(java.util.Locale);
- method public java.lang.String getInternationalCurrencySymbol();
+ method public String getInternationalCurrencySymbol();
method public char getMinusSign();
method public char getMonetaryDecimalSeparator();
- method public java.lang.String getNaN();
+ method public String getNaN();
method public char getPatternSeparator();
method public char getPerMill();
method public char getPercent();
method public char getZeroDigit();
method public void setCurrency(java.util.Currency);
- method public void setCurrencySymbol(java.lang.String);
+ method public void setCurrencySymbol(String);
method public void setDecimalSeparator(char);
method public void setDigit(char);
- method public void setExponentSeparator(java.lang.String);
+ method public void setExponentSeparator(String);
method public void setGroupingSeparator(char);
- method public void setInfinity(java.lang.String);
- method public void setInternationalCurrencySymbol(java.lang.String);
+ method public void setInfinity(String);
+ method public void setInternationalCurrencySymbol(String);
method public void setMinusSign(char);
method public void setMonetaryDecimalSeparator(char);
- method public void setNaN(java.lang.String);
+ method public void setNaN(String);
method public void setPatternSeparator(char);
method public void setPerMill(char);
method public void setPercent(char);
@@ -66678,52 +66888,50 @@ package java.text {
public abstract class Format implements java.lang.Cloneable java.io.Serializable {
ctor protected Format();
- method public java.lang.Object clone();
- method public final java.lang.String format(java.lang.Object);
- method public abstract java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public java.text.AttributedCharacterIterator formatToCharacterIterator(java.lang.Object);
- method public abstract java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object parseObject(java.lang.String) throws java.text.ParseException;
+ method public Object clone();
+ method public final String format(Object);
+ method public abstract StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
+ method public java.text.AttributedCharacterIterator formatToCharacterIterator(Object);
+ method public abstract Object parseObject(String, java.text.ParsePosition);
+ method public Object parseObject(String) throws java.text.ParseException;
}
public static class Format.Field extends java.text.AttributedCharacterIterator.Attribute {
- ctor protected Format.Field(java.lang.String);
+ ctor protected Format.Field(String);
}
public class MessageFormat extends java.text.Format {
- ctor public MessageFormat(java.lang.String);
- ctor public MessageFormat(java.lang.String, java.util.Locale);
- method public void applyPattern(java.lang.String);
- method public final java.lang.StringBuffer format(java.lang.Object[], java.lang.StringBuffer, java.text.FieldPosition);
- method public static java.lang.String format(java.lang.String, java.lang.Object...);
- method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
+ ctor public MessageFormat(String);
+ ctor public MessageFormat(String, java.util.Locale);
+ method public void applyPattern(String);
+ method public final StringBuffer format(Object[], StringBuffer, java.text.FieldPosition);
+ method public static String format(String, java.lang.Object...);
+ method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
method public java.text.Format[] getFormats();
method public java.text.Format[] getFormatsByArgumentIndex();
method public java.util.Locale getLocale();
- method public java.lang.Object[] parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Object[] parse(java.lang.String) throws java.text.ParseException;
- method public java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
+ method public Object[] parse(String, java.text.ParsePosition);
+ method public Object[] parse(String) throws java.text.ParseException;
+ method public Object parseObject(String, java.text.ParsePosition);
method public void setFormat(int, java.text.Format);
method public void setFormatByArgumentIndex(int, java.text.Format);
method public void setFormats(java.text.Format[]);
method public void setFormatsByArgumentIndex(java.text.Format[]);
method public void setLocale(java.util.Locale);
- method public java.lang.String toPattern();
+ method public String toPattern();
}
public static class MessageFormat.Field extends java.text.Format.Field {
- ctor protected MessageFormat.Field(java.lang.String);
+ ctor protected MessageFormat.Field(String);
field public static final java.text.MessageFormat.Field ARGUMENT;
}
public final class Normalizer {
- method public static boolean isNormalized(java.lang.CharSequence, java.text.Normalizer.Form);
- method public static java.lang.String normalize(java.lang.CharSequence, java.text.Normalizer.Form);
+ method public static boolean isNormalized(CharSequence, java.text.Normalizer.Form);
+ method public static String normalize(CharSequence, java.text.Normalizer.Form);
}
- public static final class Normalizer.Form extends java.lang.Enum {
- method public static java.text.Normalizer.Form valueOf(java.lang.String);
- method public static final java.text.Normalizer.Form[] values();
+ public enum Normalizer.Form {
enum_constant public static final java.text.Normalizer.Form NFC;
enum_constant public static final java.text.Normalizer.Form NFD;
enum_constant public static final java.text.Normalizer.Form NFKC;
@@ -66732,62 +66940,62 @@ package java.text {
public abstract class NumberFormat extends java.text.Format {
ctor protected NumberFormat();
- method public java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- method public final java.lang.String format(double);
- method public final java.lang.String format(long);
- method public abstract java.lang.StringBuffer format(double, java.lang.StringBuffer, java.text.FieldPosition);
- method public abstract java.lang.StringBuffer format(long, java.lang.StringBuffer, java.text.FieldPosition);
+ method @NonNull public StringBuffer format(@NonNull Object, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
+ method @NonNull public final String format(double);
+ method @NonNull public final String format(long);
+ method @NonNull public abstract StringBuffer format(double, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
+ method @NonNull public abstract StringBuffer format(long, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
method public static java.util.Locale[] getAvailableLocales();
- method public java.util.Currency getCurrency();
- method public static final java.text.NumberFormat getCurrencyInstance();
- method public static java.text.NumberFormat getCurrencyInstance(java.util.Locale);
- method public static final java.text.NumberFormat getInstance();
- method public static java.text.NumberFormat getInstance(java.util.Locale);
- method public static final java.text.NumberFormat getIntegerInstance();
- method public static java.text.NumberFormat getIntegerInstance(java.util.Locale);
+ method @Nullable public java.util.Currency getCurrency();
+ method @NonNull public static final java.text.NumberFormat getCurrencyInstance();
+ method @NonNull public static java.text.NumberFormat getCurrencyInstance(@NonNull java.util.Locale);
+ method @NonNull public static final java.text.NumberFormat getInstance();
+ method @NonNull public static java.text.NumberFormat getInstance(@NonNull java.util.Locale);
+ method @NonNull public static final java.text.NumberFormat getIntegerInstance();
+ method @NonNull public static java.text.NumberFormat getIntegerInstance(@NonNull java.util.Locale);
method public int getMaximumFractionDigits();
method public int getMaximumIntegerDigits();
method public int getMinimumFractionDigits();
method public int getMinimumIntegerDigits();
- method public static final java.text.NumberFormat getNumberInstance();
- method public static java.text.NumberFormat getNumberInstance(java.util.Locale);
- method public static final java.text.NumberFormat getPercentInstance();
- method public static java.text.NumberFormat getPercentInstance(java.util.Locale);
- method public java.math.RoundingMode getRoundingMode();
+ method @NonNull public static final java.text.NumberFormat getNumberInstance();
+ method @NonNull public static java.text.NumberFormat getNumberInstance(@NonNull java.util.Locale);
+ method @NonNull public static final java.text.NumberFormat getPercentInstance();
+ method @NonNull public static java.text.NumberFormat getPercentInstance(@NonNull java.util.Locale);
+ method @NonNull public java.math.RoundingMode getRoundingMode();
method public boolean isGroupingUsed();
method public boolean isParseIntegerOnly();
- method public abstract java.lang.Number parse(java.lang.String, java.text.ParsePosition);
- method public java.lang.Number parse(java.lang.String) throws java.text.ParseException;
- method public final java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- method public void setCurrency(java.util.Currency);
+ method @Nullable public abstract Number parse(@NonNull String, @NonNull java.text.ParsePosition);
+ method @Nullable public Number parse(@NonNull String) throws java.text.ParseException;
+ method @Nullable public final Object parseObject(@NonNull String, @NonNull java.text.ParsePosition);
+ method public void setCurrency(@NonNull java.util.Currency);
method public void setGroupingUsed(boolean);
method public void setMaximumFractionDigits(int);
method public void setMaximumIntegerDigits(int);
method public void setMinimumFractionDigits(int);
method public void setMinimumIntegerDigits(int);
method public void setParseIntegerOnly(boolean);
- method public void setRoundingMode(java.math.RoundingMode);
+ method public void setRoundingMode(@Nullable java.math.RoundingMode);
field public static final int FRACTION_FIELD = 1; // 0x1
field public static final int INTEGER_FIELD = 0; // 0x0
}
public static class NumberFormat.Field extends java.text.Format.Field {
- ctor protected NumberFormat.Field(java.lang.String);
- field public static final java.text.NumberFormat.Field CURRENCY;
- field public static final java.text.NumberFormat.Field DECIMAL_SEPARATOR;
- field public static final java.text.NumberFormat.Field EXPONENT;
- field public static final java.text.NumberFormat.Field EXPONENT_SIGN;
- field public static final java.text.NumberFormat.Field EXPONENT_SYMBOL;
- field public static final java.text.NumberFormat.Field FRACTION;
- field public static final java.text.NumberFormat.Field GROUPING_SEPARATOR;
- field public static final java.text.NumberFormat.Field INTEGER;
- field public static final java.text.NumberFormat.Field PERCENT;
- field public static final java.text.NumberFormat.Field PERMILLE;
- field public static final java.text.NumberFormat.Field SIGN;
+ ctor protected NumberFormat.Field(@NonNull String);
+ field @NonNull public static final java.text.NumberFormat.Field CURRENCY;
+ field @NonNull public static final java.text.NumberFormat.Field DECIMAL_SEPARATOR;
+ field @NonNull public static final java.text.NumberFormat.Field EXPONENT;
+ field @NonNull public static final java.text.NumberFormat.Field EXPONENT_SIGN;
+ field @NonNull public static final java.text.NumberFormat.Field EXPONENT_SYMBOL;
+ field @NonNull public static final java.text.NumberFormat.Field FRACTION;
+ field @NonNull public static final java.text.NumberFormat.Field GROUPING_SEPARATOR;
+ field @NonNull public static final java.text.NumberFormat.Field INTEGER;
+ field @NonNull public static final java.text.NumberFormat.Field PERCENT;
+ field @NonNull public static final java.text.NumberFormat.Field PERMILLE;
+ field @NonNull public static final java.text.NumberFormat.Field SIGN;
}
public class ParseException extends java.lang.Exception {
- ctor public ParseException(java.lang.String, int);
+ ctor public ParseException(String, int);
method public int getErrorOffset();
}
@@ -66800,36 +67008,36 @@ package java.text {
}
public class RuleBasedCollator extends java.text.Collator {
- ctor public RuleBasedCollator(java.lang.String) throws java.text.ParseException;
- method public synchronized int compare(java.lang.String, java.lang.String);
- method public java.text.CollationElementIterator getCollationElementIterator(java.lang.String);
+ ctor public RuleBasedCollator(String) throws java.text.ParseException;
+ method public int compare(String, String);
+ method public java.text.CollationElementIterator getCollationElementIterator(String);
method public java.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
- method public synchronized java.text.CollationKey getCollationKey(java.lang.String);
- method public java.lang.String getRules();
+ method public java.text.CollationKey getCollationKey(String);
+ method public String getRules();
}
public class SimpleDateFormat extends java.text.DateFormat {
ctor public SimpleDateFormat();
- ctor public SimpleDateFormat(java.lang.String);
- ctor public SimpleDateFormat(java.lang.String, java.util.Locale);
- ctor public SimpleDateFormat(java.lang.String, java.text.DateFormatSymbols);
- method public void applyLocalizedPattern(java.lang.String);
- method public void applyPattern(java.lang.String);
- method public java.lang.StringBuffer format(java.util.Date, java.lang.StringBuffer, java.text.FieldPosition);
+ ctor public SimpleDateFormat(String);
+ ctor public SimpleDateFormat(String, java.util.Locale);
+ ctor public SimpleDateFormat(String, java.text.DateFormatSymbols);
+ method public void applyLocalizedPattern(String);
+ method public void applyPattern(String);
+ method public StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition);
method public java.util.Date get2DigitYearStart();
method public java.text.DateFormatSymbols getDateFormatSymbols();
- method public java.util.Date parse(java.lang.String, java.text.ParsePosition);
+ method public java.util.Date parse(String, java.text.ParsePosition);
method public void set2DigitYearStart(java.util.Date);
method public void setDateFormatSymbols(java.text.DateFormatSymbols);
- method public java.lang.String toLocalizedPattern();
- method public java.lang.String toPattern();
+ method public String toLocalizedPattern();
+ method public String toPattern();
}
public final class StringCharacterIterator implements java.text.CharacterIterator {
- ctor public StringCharacterIterator(java.lang.String);
- ctor public StringCharacterIterator(java.lang.String, int);
- ctor public StringCharacterIterator(java.lang.String, int, int, int);
- method public java.lang.Object clone();
+ ctor public StringCharacterIterator(String);
+ ctor public StringCharacterIterator(String, int);
+ ctor public StringCharacterIterator(String, int, int, int);
+ method public Object clone();
method public char current();
method public char first();
method public int getBeginIndex();
@@ -66839,7 +67047,7 @@ package java.text {
method public char next();
method public char previous();
method public char setIndex(int);
- method public void setText(java.lang.String);
+ method public void setText(String);
}
}
@@ -66863,22 +67071,20 @@ package java.time {
}
public class DateTimeException extends java.lang.RuntimeException {
- ctor public DateTimeException(java.lang.String);
- ctor public DateTimeException(java.lang.String, java.lang.Throwable);
+ ctor public DateTimeException(String);
+ ctor public DateTimeException(String, Throwable);
}
- public final class DayOfWeek extends java.lang.Enum implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
+ public enum DayOfWeek implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
- method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
+ method public String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
method public boolean isSupported(java.time.temporal.TemporalField);
method public java.time.DayOfWeek minus(long);
method public static java.time.DayOfWeek of(int);
method public java.time.DayOfWeek plus(long);
- method public static java.time.DayOfWeek valueOf(java.lang.String);
- method public static final java.time.DayOfWeek[] values();
enum_constant public static final java.time.DayOfWeek FRIDAY;
enum_constant public static final java.time.DayOfWeek MONDAY;
enum_constant public static final java.time.DayOfWeek SATURDAY;
@@ -66888,7 +67094,7 @@ package java.time {
enum_constant public static final java.time.DayOfWeek WEDNESDAY;
}
- public final class Duration implements java.lang.Comparable java.io.Serializable java.time.temporal.TemporalAmount {
+ public final class Duration implements java.lang.Comparable<java.time.Duration> java.io.Serializable java.time.temporal.TemporalAmount {
method public java.time.Duration abs();
method public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
method public static java.time.Duration between(java.time.temporal.Temporal, java.time.temporal.Temporal);
@@ -66919,7 +67125,7 @@ package java.time {
method public static java.time.Duration ofNanos(long);
method public static java.time.Duration ofSeconds(long);
method public static java.time.Duration ofSeconds(long, long);
- method public static java.time.Duration parse(java.lang.CharSequence);
+ method public static java.time.Duration parse(CharSequence);
method public java.time.Duration plus(java.time.Duration);
method public java.time.Duration plus(long, java.time.temporal.TemporalUnit);
method public java.time.Duration plusDays(long);
@@ -66939,7 +67145,7 @@ package java.time {
field public static final java.time.Duration ZERO;
}
- public final class Instant implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class Instant implements java.lang.Comparable<java.time.Instant> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
method public java.time.ZonedDateTime atZone(java.time.ZoneId);
@@ -66962,7 +67168,7 @@ package java.time {
method public static java.time.Instant ofEpochMilli(long);
method public static java.time.Instant ofEpochSecond(long);
method public static java.time.Instant ofEpochSecond(long, long);
- method public static java.time.Instant parse(java.lang.CharSequence);
+ method public static java.time.Instant parse(CharSequence);
method public java.time.Instant plus(java.time.temporal.TemporalAmount);
method public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant plusMillis(long);
@@ -67009,8 +67215,8 @@ package java.time {
method public static java.time.LocalDate of(int, int, int);
method public static java.time.LocalDate ofEpochDay(long);
method public static java.time.LocalDate ofYearDay(int, int);
- method public static java.time.LocalDate parse(java.lang.CharSequence);
- method public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.LocalDate parse(CharSequence);
+ method public static java.time.LocalDate parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
method public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate plusDays(long);
@@ -67029,7 +67235,7 @@ package java.time {
field public static final java.time.LocalDate MIN;
}
- public final class LocalDateTime implements java.time.chrono.ChronoLocalDateTime java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class LocalDateTime implements java.time.chrono.ChronoLocalDateTime<java.time.LocalDate> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
method public java.time.ZonedDateTime atZone(java.time.ZoneId);
method public static java.time.LocalDateTime from(java.time.temporal.TemporalAccessor);
@@ -67067,8 +67273,8 @@ package java.time {
method public static java.time.LocalDateTime of(java.time.LocalDate, java.time.LocalTime);
method public static java.time.LocalDateTime ofEpochSecond(long, int, java.time.ZoneOffset);
method public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
- method public static java.time.LocalDateTime parse(java.lang.CharSequence);
- method public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.LocalDateTime parse(CharSequence);
+ method public static java.time.LocalDateTime parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime plusDays(long);
@@ -67097,12 +67303,12 @@ package java.time {
field public static final java.time.LocalDateTime MIN;
}
- public final class LocalTime implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class LocalTime implements java.lang.Comparable<java.time.LocalTime> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.LocalDateTime atDate(java.time.LocalDate);
method public java.time.OffsetTime atOffset(java.time.ZoneOffset);
method public int compareTo(java.time.LocalTime);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.LocalTime from(java.time.temporal.TemporalAccessor);
method public int getHour();
method public long getLong(java.time.temporal.TemporalField);
@@ -67127,8 +67333,8 @@ package java.time {
method public static java.time.LocalTime of(int, int, int, int);
method public static java.time.LocalTime ofNanoOfDay(long);
method public static java.time.LocalTime ofSecondOfDay(long);
- method public static java.time.LocalTime parse(java.lang.CharSequence);
- method public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.LocalTime parse(CharSequence);
+ method public static java.time.LocalTime parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime plusHours(long);
@@ -67151,12 +67357,12 @@ package java.time {
field public static final java.time.LocalTime NOON;
}
- public final class Month extends java.lang.Enum implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
+ public enum Month implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public int firstDayOfYear(boolean);
method public java.time.Month firstMonthOfQuarter();
method public static java.time.Month from(java.time.temporal.TemporalAccessor);
- method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
+ method public String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
method public boolean isSupported(java.time.temporal.TemporalField);
@@ -67166,8 +67372,6 @@ package java.time {
method public java.time.Month minus(long);
method public static java.time.Month of(int);
method public java.time.Month plus(long);
- method public static java.time.Month valueOf(java.lang.String);
- method public static final java.time.Month[] values();
enum_constant public static final java.time.Month APRIL;
enum_constant public static final java.time.Month AUGUST;
enum_constant public static final java.time.Month DECEMBER;
@@ -67182,11 +67386,11 @@ package java.time {
enum_constant public static final java.time.Month SEPTEMBER;
}
- public final class MonthDay implements java.lang.Comparable java.io.Serializable java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
+ public final class MonthDay implements java.lang.Comparable<java.time.MonthDay> java.io.Serializable java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.LocalDate atYear(int);
method public int compareTo(java.time.MonthDay);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.MonthDay from(java.time.temporal.TemporalAccessor);
method public int getDayOfMonth();
method public long getLong(java.time.temporal.TemporalField);
@@ -67201,19 +67405,19 @@ package java.time {
method public static java.time.MonthDay now(java.time.Clock);
method public static java.time.MonthDay of(java.time.Month, int);
method public static java.time.MonthDay of(int, int);
- method public static java.time.MonthDay parse(java.lang.CharSequence);
- method public static java.time.MonthDay parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.MonthDay parse(CharSequence);
+ method public static java.time.MonthDay parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.MonthDay with(java.time.Month);
method public java.time.MonthDay withDayOfMonth(int);
method public java.time.MonthDay withMonth(int);
}
- public final class OffsetDateTime implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class OffsetDateTime implements java.lang.Comparable<java.time.OffsetDateTime> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.ZonedDateTime atZoneSameInstant(java.time.ZoneId);
method public java.time.ZonedDateTime atZoneSimilarLocal(java.time.ZoneId);
method public int compareTo(java.time.OffsetDateTime);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.OffsetDateTime from(java.time.temporal.TemporalAccessor);
method public int getDayOfMonth();
method public java.time.DayOfWeek getDayOfWeek();
@@ -67249,8 +67453,8 @@ package java.time {
method public static java.time.OffsetDateTime of(java.time.LocalDateTime, java.time.ZoneOffset);
method public static java.time.OffsetDateTime of(int, int, int, int, int, int, int, java.time.ZoneOffset);
method public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
- method public static java.time.OffsetDateTime parse(java.lang.CharSequence);
- method public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.OffsetDateTime parse(CharSequence);
+ method public static java.time.OffsetDateTime parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime plusDays(long);
@@ -67287,11 +67491,11 @@ package java.time {
field public static final java.time.OffsetDateTime MIN;
}
- public final class OffsetTime implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class OffsetTime implements java.lang.Comparable<java.time.OffsetTime> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.OffsetDateTime atDate(java.time.LocalDate);
method public int compareTo(java.time.OffsetTime);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.OffsetTime from(java.time.temporal.TemporalAccessor);
method public int getHour();
method public long getLong(java.time.temporal.TemporalField);
@@ -67316,8 +67520,8 @@ package java.time {
method public static java.time.OffsetTime of(java.time.LocalTime, java.time.ZoneOffset);
method public static java.time.OffsetTime of(int, int, int, int, java.time.ZoneOffset);
method public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
- method public static java.time.OffsetTime parse(java.lang.CharSequence);
- method public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.OffsetTime parse(CharSequence);
+ method public static java.time.OffsetTime parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime plusHours(long);
@@ -67361,7 +67565,7 @@ package java.time {
method public static java.time.Period ofMonths(int);
method public static java.time.Period ofWeeks(int);
method public static java.time.Period ofYears(int);
- method public static java.time.Period parse(java.lang.CharSequence);
+ method public static java.time.Period parse(CharSequence);
method public java.time.Period plus(java.time.temporal.TemporalAmount);
method public java.time.Period plusDays(long);
method public java.time.Period plusMonths(long);
@@ -67374,14 +67578,14 @@ package java.time {
field public static final java.time.Period ZERO;
}
- public final class Year implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class Year implements java.lang.Comparable<java.time.Year> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.LocalDate atDay(int);
method public java.time.YearMonth atMonth(java.time.Month);
method public java.time.YearMonth atMonth(int);
method public java.time.LocalDate atMonthDay(java.time.MonthDay);
method public int compareTo(java.time.Year);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.Year from(java.time.temporal.TemporalAccessor);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -67400,8 +67604,8 @@ package java.time {
method public static java.time.Year now(java.time.ZoneId);
method public static java.time.Year now(java.time.Clock);
method public static java.time.Year of(int);
- method public static java.time.Year parse(java.lang.CharSequence);
- method public static java.time.Year parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.Year parse(CharSequence);
+ method public static java.time.Year parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.Year plus(java.time.temporal.TemporalAmount);
method public java.time.Year plus(long, java.time.temporal.TemporalUnit);
method public java.time.Year plusYears(long);
@@ -67412,12 +67616,12 @@ package java.time {
field public static final int MIN_VALUE = -999999999; // 0xc4653601
}
- public final class YearMonth implements java.lang.Comparable java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public final class YearMonth implements java.lang.Comparable<java.time.YearMonth> java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public java.time.LocalDate atDay(int);
method public java.time.LocalDate atEndOfMonth();
method public int compareTo(java.time.YearMonth);
- method public java.lang.String format(java.time.format.DateTimeFormatter);
+ method public String format(java.time.format.DateTimeFormatter);
method public static java.time.YearMonth from(java.time.temporal.TemporalAccessor);
method public long getLong(java.time.temporal.TemporalField);
method public java.time.Month getMonth();
@@ -67440,8 +67644,8 @@ package java.time {
method public static java.time.YearMonth now(java.time.Clock);
method public static java.time.YearMonth of(int, java.time.Month);
method public static java.time.YearMonth of(int, int);
- method public static java.time.YearMonth parse(java.lang.CharSequence);
- method public static java.time.YearMonth parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.YearMonth parse(CharSequence);
+ method public static java.time.YearMonth parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.YearMonth plus(java.time.temporal.TemporalAmount);
method public java.time.YearMonth plus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth plusMonths(long);
@@ -67456,27 +67660,27 @@ package java.time {
public abstract class ZoneId implements java.io.Serializable {
method public static java.time.ZoneId from(java.time.temporal.TemporalAccessor);
method public static java.util.Set<java.lang.String> getAvailableZoneIds();
- method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- method public abstract java.lang.String getId();
+ method public String getDisplayName(java.time.format.TextStyle, java.util.Locale);
+ method public abstract String getId();
method public abstract java.time.zone.ZoneRules getRules();
method public java.time.ZoneId normalized();
- method public static java.time.ZoneId of(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
- method public static java.time.ZoneId of(java.lang.String);
- method public static java.time.ZoneId ofOffset(java.lang.String, java.time.ZoneOffset);
+ method public static java.time.ZoneId of(String, java.util.Map<java.lang.String,java.lang.String>);
+ method public static java.time.ZoneId of(String);
+ method public static java.time.ZoneId ofOffset(String, java.time.ZoneOffset);
method public static java.time.ZoneId systemDefault();
- field public static final java.util.Map<java.lang.String, java.lang.String> SHORT_IDS;
+ field public static final java.util.Map<java.lang.String,java.lang.String> SHORT_IDS;
}
- public final class ZoneOffset extends java.time.ZoneId implements java.lang.Comparable java.io.Serializable java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
+ public final class ZoneOffset extends java.time.ZoneId implements java.lang.Comparable<java.time.ZoneOffset> java.io.Serializable java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public int compareTo(java.time.ZoneOffset);
method public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
- method public java.lang.String getId();
+ method public String getId();
method public long getLong(java.time.temporal.TemporalField);
method public java.time.zone.ZoneRules getRules();
method public int getTotalSeconds();
method public boolean isSupported(java.time.temporal.TemporalField);
- method public static java.time.ZoneOffset of(java.lang.String);
+ method public static java.time.ZoneOffset of(String);
method public static java.time.ZoneOffset ofHours(int);
method public static java.time.ZoneOffset ofHoursMinutes(int, int);
method public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
@@ -67486,7 +67690,7 @@ package java.time {
field public static final java.time.ZoneOffset UTC;
}
- public final class ZonedDateTime implements java.time.chrono.ChronoZonedDateTime java.io.Serializable java.time.temporal.Temporal {
+ public final class ZonedDateTime implements java.time.chrono.ChronoZonedDateTime<java.time.LocalDate> java.io.Serializable java.time.temporal.Temporal {
method public static java.time.ZonedDateTime from(java.time.temporal.TemporalAccessor);
method public int getDayOfMonth();
method public java.time.DayOfWeek getDayOfWeek();
@@ -67521,8 +67725,8 @@ package java.time {
method public static java.time.ZonedDateTime ofInstant(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
method public static java.time.ZonedDateTime ofLocal(java.time.LocalDateTime, java.time.ZoneId, java.time.ZoneOffset);
method public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
- method public static java.time.ZonedDateTime parse(java.lang.CharSequence);
- method public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public static java.time.ZonedDateTime parse(CharSequence);
+ method public static java.time.ZonedDateTime parse(CharSequence, java.time.format.DateTimeFormatter);
method public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime plusDays(long);
@@ -67562,26 +67766,26 @@ package java.time.chrono {
public abstract class AbstractChronology implements java.time.chrono.Chronology {
ctor protected AbstractChronology();
method public int compareTo(java.time.chrono.Chronology);
- method public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
}
- public abstract interface ChronoLocalDate implements java.lang.Comparable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public interface ChronoLocalDate extends java.time.temporal.Temporal java.lang.Comparable<java.time.chrono.ChronoLocalDate> java.time.temporal.TemporalAdjuster {
method public default java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public default java.time.chrono.ChronoLocalDateTime<?> atTime(java.time.LocalTime);
method public default int compareTo(java.time.chrono.ChronoLocalDate);
- method public abstract boolean equals(java.lang.Object);
- method public default java.lang.String format(java.time.format.DateTimeFormatter);
+ method public boolean equals(Object);
+ method public default String format(java.time.format.DateTimeFormatter);
method public static java.time.chrono.ChronoLocalDate from(java.time.temporal.TemporalAccessor);
- method public abstract java.time.chrono.Chronology getChronology();
+ method public java.time.chrono.Chronology getChronology();
method public default java.time.chrono.Era getEra();
- method public abstract int hashCode();
+ method public int hashCode();
method public default boolean isAfter(java.time.chrono.ChronoLocalDate);
method public default boolean isBefore(java.time.chrono.ChronoLocalDate);
method public default boolean isEqual(java.time.chrono.ChronoLocalDate);
method public default boolean isLeapYear();
method public default boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
- method public abstract int lengthOfMonth();
+ method public int lengthOfMonth();
method public default int lengthOfYear();
method public default java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
@@ -67589,21 +67793,21 @@ package java.time.chrono {
method public default java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDate> timeLineOrder();
method public default long toEpochDay();
- method public abstract java.lang.String toString();
- method public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public String toString();
+ method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
}
- public abstract interface ChronoLocalDateTime<D extends java.time.chrono.ChronoLocalDate> implements java.lang.Comparable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ public interface ChronoLocalDateTime<D extends java.time.chrono.ChronoLocalDate> extends java.time.temporal.Temporal java.lang.Comparable<java.time.chrono.ChronoLocalDateTime<?>> java.time.temporal.TemporalAdjuster {
method public default java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- method public abstract java.time.chrono.ChronoZonedDateTime<D> atZone(java.time.ZoneId);
+ method public java.time.chrono.ChronoZonedDateTime<D> atZone(java.time.ZoneId);
method public default int compareTo(java.time.chrono.ChronoLocalDateTime<?>);
- method public abstract boolean equals(java.lang.Object);
- method public default java.lang.String format(java.time.format.DateTimeFormatter);
+ method public boolean equals(Object);
+ method public default String format(java.time.format.DateTimeFormatter);
method public static java.time.chrono.ChronoLocalDateTime<?> from(java.time.temporal.TemporalAccessor);
method public default java.time.chrono.Chronology getChronology();
- method public abstract int hashCode();
+ method public int hashCode();
method public default boolean isAfter(java.time.chrono.ChronoLocalDateTime<?>);
method public default boolean isBefore(java.time.chrono.ChronoLocalDateTime<?>);
method public default boolean isEqual(java.time.chrono.ChronoLocalDateTime<?>);
@@ -67611,42 +67815,42 @@ package java.time.chrono {
method public default java.time.chrono.ChronoLocalDateTime<D> minus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoLocalDateTime<D> minus(long, java.time.temporal.TemporalUnit);
method public default java.time.chrono.ChronoLocalDateTime<D> plus(java.time.temporal.TemporalAmount);
- method public abstract java.time.chrono.ChronoLocalDateTime<D> plus(long, java.time.temporal.TemporalUnit);
+ method public java.time.chrono.ChronoLocalDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDateTime<?>> timeLineOrder();
method public default long toEpochSecond(java.time.ZoneOffset);
method public default java.time.Instant toInstant(java.time.ZoneOffset);
- method public abstract D toLocalDate();
- method public abstract java.time.LocalTime toLocalTime();
- method public abstract java.lang.String toString();
+ method public D toLocalDate();
+ method public java.time.LocalTime toLocalTime();
+ method public String toString();
method public default java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalAdjuster);
- method public abstract java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalField, long);
}
- public abstract interface ChronoPeriod implements java.time.temporal.TemporalAmount {
+ public interface ChronoPeriod extends java.time.temporal.TemporalAmount {
method public static java.time.chrono.ChronoPeriod between(java.time.chrono.ChronoLocalDate, java.time.chrono.ChronoLocalDate);
- method public abstract boolean equals(java.lang.Object);
- method public abstract java.time.chrono.Chronology getChronology();
- method public abstract int hashCode();
+ method public boolean equals(Object);
+ method public java.time.chrono.Chronology getChronology();
+ method public int hashCode();
method public default boolean isNegative();
method public default boolean isZero();
- method public abstract java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
- method public abstract java.time.chrono.ChronoPeriod multipliedBy(int);
+ method public java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ChronoPeriod multipliedBy(int);
method public default java.time.chrono.ChronoPeriod negated();
- method public abstract java.time.chrono.ChronoPeriod normalized();
- method public abstract java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
- method public abstract java.lang.String toString();
+ method public java.time.chrono.ChronoPeriod normalized();
+ method public java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
+ method public String toString();
}
- public abstract interface ChronoZonedDateTime<D extends java.time.chrono.ChronoLocalDate> implements java.lang.Comparable java.time.temporal.Temporal {
+ public interface ChronoZonedDateTime<D extends java.time.chrono.ChronoLocalDate> extends java.time.temporal.Temporal java.lang.Comparable<java.time.chrono.ChronoZonedDateTime<?>> {
method public default int compareTo(java.time.chrono.ChronoZonedDateTime<?>);
- method public abstract boolean equals(java.lang.Object);
- method public default java.lang.String format(java.time.format.DateTimeFormatter);
+ method public boolean equals(Object);
+ method public default String format(java.time.format.DateTimeFormatter);
method public static java.time.chrono.ChronoZonedDateTime<?> from(java.time.temporal.TemporalAccessor);
method public default java.time.chrono.Chronology getChronology();
method public default long getLong(java.time.temporal.TemporalField);
- method public abstract java.time.ZoneOffset getOffset();
- method public abstract java.time.ZoneId getZone();
- method public abstract int hashCode();
+ method public java.time.ZoneOffset getOffset();
+ method public java.time.ZoneId getZone();
+ method public int hashCode();
method public default boolean isAfter(java.time.chrono.ChronoZonedDateTime<?>);
method public default boolean isBefore(java.time.chrono.ChronoZonedDateTime<?>);
method public default boolean isEqual(java.time.chrono.ChronoZonedDateTime<?>);
@@ -67654,60 +67858,60 @@ package java.time.chrono {
method public default java.time.chrono.ChronoZonedDateTime<D> minus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoZonedDateTime<D> minus(long, java.time.temporal.TemporalUnit);
method public default java.time.chrono.ChronoZonedDateTime<D> plus(java.time.temporal.TemporalAmount);
- method public abstract java.time.chrono.ChronoZonedDateTime<D> plus(long, java.time.temporal.TemporalUnit);
+ method public java.time.chrono.ChronoZonedDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoZonedDateTime<?>> timeLineOrder();
method public default long toEpochSecond();
method public default java.time.Instant toInstant();
method public default D toLocalDate();
- method public abstract java.time.chrono.ChronoLocalDateTime<D> toLocalDateTime();
+ method public java.time.chrono.ChronoLocalDateTime<D> toLocalDateTime();
method public default java.time.LocalTime toLocalTime();
- method public abstract java.lang.String toString();
+ method public String toString();
method public default java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalAdjuster);
- method public abstract java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalField, long);
- method public abstract java.time.chrono.ChronoZonedDateTime<D> withEarlierOffsetAtOverlap();
- method public abstract java.time.chrono.ChronoZonedDateTime<D> withLaterOffsetAtOverlap();
- method public abstract java.time.chrono.ChronoZonedDateTime<D> withZoneSameInstant(java.time.ZoneId);
- method public abstract java.time.chrono.ChronoZonedDateTime<D> withZoneSameLocal(java.time.ZoneId);
+ method public java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.ChronoZonedDateTime<D> withEarlierOffsetAtOverlap();
+ method public java.time.chrono.ChronoZonedDateTime<D> withLaterOffsetAtOverlap();
+ method public java.time.chrono.ChronoZonedDateTime<D> withZoneSameInstant(java.time.ZoneId);
+ method public java.time.chrono.ChronoZonedDateTime<D> withZoneSameLocal(java.time.ZoneId);
}
- public abstract interface Chronology implements java.lang.Comparable {
- method public abstract int compareTo(java.time.chrono.Chronology);
+ public interface Chronology extends java.lang.Comparable<java.time.chrono.Chronology> {
+ method public int compareTo(java.time.chrono.Chronology);
method public default java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
- method public abstract java.time.chrono.ChronoLocalDate date(int, int, int);
- method public abstract java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
- method public abstract java.time.chrono.ChronoLocalDate dateEpochDay(long);
+ method public java.time.chrono.ChronoLocalDate date(int, int, int);
+ method public java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
+ method public java.time.chrono.ChronoLocalDate dateEpochDay(long);
method public default java.time.chrono.ChronoLocalDate dateNow();
method public default java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
method public default java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
method public default java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
- method public abstract java.time.chrono.ChronoLocalDate dateYearDay(int, int);
- method public abstract boolean equals(java.lang.Object);
- method public abstract java.time.chrono.Era eraOf(int);
- method public abstract java.util.List<java.time.chrono.Era> eras();
+ method public java.time.chrono.ChronoLocalDate dateYearDay(int, int);
+ method public boolean equals(Object);
+ method public java.time.chrono.Era eraOf(int);
+ method public java.util.List<java.time.chrono.Era> eras();
method public static java.time.chrono.Chronology from(java.time.temporal.TemporalAccessor);
method public static java.util.Set<java.time.chrono.Chronology> getAvailableChronologies();
- method public abstract java.lang.String getCalendarType();
- method public default java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- method public abstract java.lang.String getId();
- method public abstract int hashCode();
- method public abstract boolean isLeapYear(long);
+ method public String getCalendarType();
+ method public default String getDisplayName(java.time.format.TextStyle, java.util.Locale);
+ method public String getId();
+ method public int hashCode();
+ method public boolean isLeapYear(long);
method public default java.time.chrono.ChronoLocalDateTime<? extends java.time.chrono.ChronoLocalDate> localDateTime(java.time.temporal.TemporalAccessor);
- method public static java.time.chrono.Chronology of(java.lang.String);
+ method public static java.time.chrono.Chronology of(String);
method public static java.time.chrono.Chronology ofLocale(java.util.Locale);
method public default java.time.chrono.ChronoPeriod period(int, int, int);
- method public abstract int prolepticYear(java.time.chrono.Era, int);
- method public abstract java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public abstract java.time.chrono.ChronoLocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
- method public abstract java.lang.String toString();
+ method public int prolepticYear(java.time.chrono.Era, int);
+ method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
+ method public String toString();
method public default java.time.chrono.ChronoZonedDateTime<? extends java.time.chrono.ChronoLocalDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public default java.time.chrono.ChronoZonedDateTime<? extends java.time.chrono.ChronoLocalDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
}
- public abstract interface Era implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
+ public interface Era extends java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public default java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- method public default java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
+ method public default String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public default long getLong(java.time.temporal.TemporalField);
- method public abstract int getValue();
+ method public int getValue();
method public default boolean isSupported(java.time.temporal.TemporalField);
}
@@ -67723,13 +67927,13 @@ package java.time.chrono {
method public java.time.chrono.HijrahDate dateYearDay(int, int);
method public java.time.chrono.HijrahEra eraOf(int);
method public java.util.List<java.time.chrono.Era> eras();
- method public java.lang.String getCalendarType();
- method public java.lang.String getId();
+ method public String getCalendarType();
+ method public String getId();
method public boolean isLeapYear(long);
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.HijrahDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public java.time.chrono.HijrahDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.chrono.HijrahDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.HijrahChronology INSTANCE;
@@ -67751,16 +67955,15 @@ package java.time.chrono {
method public java.time.chrono.HijrahDate plus(java.time.temporal.TemporalAmount);
method public java.time.chrono.HijrahDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalField, long);
method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalAdjuster);
method public java.time.chrono.HijrahDate withVariant(java.time.chrono.HijrahChronology);
}
- public final class HijrahEra extends java.lang.Enum implements java.time.chrono.Era {
+ public enum HijrahEra implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.HijrahEra of(int);
- method public static java.time.chrono.HijrahEra valueOf(java.lang.String);
- method public static final java.time.chrono.HijrahEra[] values();
enum_constant public static final java.time.chrono.HijrahEra AH;
}
@@ -67776,24 +67979,22 @@ package java.time.chrono {
method public java.time.LocalDate dateYearDay(int, int);
method public java.time.chrono.IsoEra eraOf(int);
method public java.util.List<java.time.chrono.Era> eras();
- method public java.lang.String getCalendarType();
- method public java.lang.String getId();
+ method public String getCalendarType();
+ method public String getId();
method public boolean isLeapYear(long);
method public java.time.LocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
method public java.time.Period period(int, int, int);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public java.time.LocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.LocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.IsoChronology INSTANCE;
}
- public final class IsoEra extends java.lang.Enum implements java.time.chrono.Era {
+ public enum IsoEra implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.IsoEra of(int);
- method public static java.time.chrono.IsoEra valueOf(java.lang.String);
- method public static final java.time.chrono.IsoEra[] values();
enum_constant public static final java.time.chrono.IsoEra BCE;
enum_constant public static final java.time.chrono.IsoEra CE;
}
@@ -67810,13 +68011,13 @@ package java.time.chrono {
method public java.time.chrono.JapaneseDate dateYearDay(int, int);
method public java.time.chrono.JapaneseEra eraOf(int);
method public java.util.List<java.time.chrono.Era> eras();
- method public java.lang.String getCalendarType();
- method public java.lang.String getId();
+ method public String getCalendarType();
+ method public String getId();
method public boolean isLeapYear(long);
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.JapaneseDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public java.time.chrono.JapaneseDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.chrono.JapaneseDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.JapaneseChronology INSTANCE;
@@ -67839,6 +68040,7 @@ package java.time.chrono {
method public java.time.chrono.JapaneseDate plus(java.time.temporal.TemporalAmount);
method public java.time.chrono.JapaneseDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalField, long);
method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalAdjuster);
}
@@ -67846,7 +68048,7 @@ package java.time.chrono {
public final class JapaneseEra implements java.time.chrono.Era java.io.Serializable {
method public int getValue();
method public static java.time.chrono.JapaneseEra of(int);
- method public static java.time.chrono.JapaneseEra valueOf(java.lang.String);
+ method public static java.time.chrono.JapaneseEra valueOf(String);
method public static java.time.chrono.JapaneseEra[] values();
field public static final java.time.chrono.JapaneseEra HEISEI;
field public static final java.time.chrono.JapaneseEra MEIJI;
@@ -67866,13 +68068,13 @@ package java.time.chrono {
method public java.time.chrono.MinguoDate dateYearDay(int, int);
method public java.time.chrono.MinguoEra eraOf(int);
method public java.util.List<java.time.chrono.Era> eras();
- method public java.lang.String getCalendarType();
- method public java.lang.String getId();
+ method public String getCalendarType();
+ method public String getId();
method public boolean isLeapYear(long);
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.MinguoDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public java.time.chrono.MinguoDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.chrono.MinguoDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.MinguoChronology INSTANCE;
@@ -67894,15 +68096,14 @@ package java.time.chrono {
method public java.time.chrono.MinguoDate plus(java.time.temporal.TemporalAmount);
method public java.time.chrono.MinguoDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalField, long);
method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalAdjuster);
}
- public final class MinguoEra extends java.lang.Enum implements java.time.chrono.Era {
+ public enum MinguoEra implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.MinguoEra of(int);
- method public static java.time.chrono.MinguoEra valueOf(java.lang.String);
- method public static final java.time.chrono.MinguoEra[] values();
enum_constant public static final java.time.chrono.MinguoEra BEFORE_ROC;
enum_constant public static final java.time.chrono.MinguoEra ROC;
}
@@ -67919,13 +68120,13 @@ package java.time.chrono {
method public java.time.chrono.ThaiBuddhistDate dateYearDay(int, int);
method public java.time.chrono.ThaiBuddhistEra eraOf(int);
method public java.util.List<java.time.chrono.Era> eras();
- method public java.lang.String getCalendarType();
- method public java.lang.String getId();
+ method public String getCalendarType();
+ method public String getId();
method public boolean isLeapYear(long);
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.ThaiBuddhistDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- method public java.time.chrono.ThaiBuddhistDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
+ method public java.time.chrono.ThaiBuddhistDate resolveDate(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.ThaiBuddhistChronology INSTANCE;
@@ -67947,15 +68148,14 @@ package java.time.chrono {
method public java.time.chrono.ThaiBuddhistDate plus(java.time.temporal.TemporalAmount);
method public java.time.chrono.ThaiBuddhistDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalField, long);
method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalAdjuster);
}
- public final class ThaiBuddhistEra extends java.lang.Enum implements java.time.chrono.Era {
+ public enum ThaiBuddhistEra implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.ThaiBuddhistEra of(int);
- method public static java.time.chrono.ThaiBuddhistEra valueOf(java.lang.String);
- method public static final java.time.chrono.ThaiBuddhistEra[] values();
enum_constant public static final java.time.chrono.ThaiBuddhistEra BE;
enum_constant public static final java.time.chrono.ThaiBuddhistEra BEFORE_BE;
}
@@ -67965,8 +68165,8 @@ package java.time.chrono {
package java.time.format {
public final class DateTimeFormatter {
- method public java.lang.String format(java.time.temporal.TemporalAccessor);
- method public void formatTo(java.time.temporal.TemporalAccessor, java.lang.Appendable);
+ method public String format(java.time.temporal.TemporalAccessor);
+ method public void formatTo(java.time.temporal.TemporalAccessor, Appendable);
method public java.time.chrono.Chronology getChronology();
method public java.time.format.DecimalStyle getDecimalStyle();
method public java.util.Locale getLocale();
@@ -67977,13 +68177,13 @@ package java.time.format {
method public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle);
method public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle, java.time.format.FormatStyle);
method public static java.time.format.DateTimeFormatter ofLocalizedTime(java.time.format.FormatStyle);
- method public static java.time.format.DateTimeFormatter ofPattern(java.lang.String);
- method public static java.time.format.DateTimeFormatter ofPattern(java.lang.String, java.util.Locale);
- method public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence);
- method public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence, java.text.ParsePosition);
- method public <T> T parse(java.lang.CharSequence, java.time.temporal.TemporalQuery<T>);
- method public java.time.temporal.TemporalAccessor parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...);
- method public java.time.temporal.TemporalAccessor parseUnresolved(java.lang.CharSequence, java.text.ParsePosition);
+ method public static java.time.format.DateTimeFormatter ofPattern(String);
+ method public static java.time.format.DateTimeFormatter ofPattern(String, java.util.Locale);
+ method public java.time.temporal.TemporalAccessor parse(CharSequence);
+ method public java.time.temporal.TemporalAccessor parse(CharSequence, java.text.ParsePosition);
+ method public <T> T parse(CharSequence, java.time.temporal.TemporalQuery<T>);
+ method public java.time.temporal.TemporalAccessor parseBest(CharSequence, java.time.temporal.TemporalQuery<?>...);
+ method public java.time.temporal.TemporalAccessor parseUnresolved(CharSequence, java.text.ParsePosition);
method public static java.time.temporal.TemporalQuery<java.time.Period> parsedExcessDays();
method public static java.time.temporal.TemporalQuery<java.lang.Boolean> parsedLeapSecond();
method public java.text.Format toFormat();
@@ -68021,16 +68221,16 @@ package java.time.format {
method public java.time.format.DateTimeFormatterBuilder appendInstant();
method public java.time.format.DateTimeFormatterBuilder appendInstant(int);
method public java.time.format.DateTimeFormatterBuilder appendLiteral(char);
- method public java.time.format.DateTimeFormatterBuilder appendLiteral(java.lang.String);
+ method public java.time.format.DateTimeFormatterBuilder appendLiteral(String);
method public java.time.format.DateTimeFormatterBuilder appendLocalized(java.time.format.FormatStyle, java.time.format.FormatStyle);
method public java.time.format.DateTimeFormatterBuilder appendLocalizedOffset(java.time.format.TextStyle);
- method public java.time.format.DateTimeFormatterBuilder appendOffset(java.lang.String, java.lang.String);
+ method public java.time.format.DateTimeFormatterBuilder appendOffset(String, String);
method public java.time.format.DateTimeFormatterBuilder appendOffsetId();
method public java.time.format.DateTimeFormatterBuilder appendOptional(java.time.format.DateTimeFormatter);
- method public java.time.format.DateTimeFormatterBuilder appendPattern(java.lang.String);
+ method public java.time.format.DateTimeFormatterBuilder appendPattern(String);
method public java.time.format.DateTimeFormatterBuilder appendText(java.time.temporal.TemporalField);
method public java.time.format.DateTimeFormatterBuilder appendText(java.time.temporal.TemporalField, java.time.format.TextStyle);
- method public java.time.format.DateTimeFormatterBuilder appendText(java.time.temporal.TemporalField, java.util.Map<java.lang.Long, java.lang.String>);
+ method public java.time.format.DateTimeFormatterBuilder appendText(java.time.temporal.TemporalField, java.util.Map<java.lang.Long,java.lang.String>);
method public java.time.format.DateTimeFormatterBuilder appendValue(java.time.temporal.TemporalField);
method public java.time.format.DateTimeFormatterBuilder appendValue(java.time.temporal.TemporalField, int);
method public java.time.format.DateTimeFormatterBuilder appendValue(java.time.temporal.TemporalField, int, int, java.time.format.SignStyle);
@@ -68041,7 +68241,7 @@ package java.time.format {
method public java.time.format.DateTimeFormatterBuilder appendZoneRegionId();
method public java.time.format.DateTimeFormatterBuilder appendZoneText(java.time.format.TextStyle);
method public java.time.format.DateTimeFormatterBuilder appendZoneText(java.time.format.TextStyle, java.util.Set<java.time.ZoneId>);
- method public static java.lang.String getLocalizedDateTimePattern(java.time.format.FormatStyle, java.time.format.FormatStyle, java.time.chrono.Chronology, java.util.Locale);
+ method public static String getLocalizedDateTimePattern(java.time.format.FormatStyle, java.time.format.FormatStyle, java.time.chrono.Chronology, java.util.Locale);
method public java.time.format.DateTimeFormatterBuilder optionalEnd();
method public java.time.format.DateTimeFormatterBuilder optionalStart();
method public java.time.format.DateTimeFormatterBuilder padNext(int);
@@ -68056,10 +68256,10 @@ package java.time.format {
}
public class DateTimeParseException extends java.time.DateTimeException {
- ctor public DateTimeParseException(java.lang.String, java.lang.CharSequence, int);
- ctor public DateTimeParseException(java.lang.String, java.lang.CharSequence, int, java.lang.Throwable);
+ ctor public DateTimeParseException(String, CharSequence, int);
+ ctor public DateTimeParseException(String, CharSequence, int, Throwable);
method public int getErrorIndex();
- method public java.lang.String getParsedString();
+ method public String getParsedString();
}
public final class DecimalStyle {
@@ -68077,26 +68277,20 @@ package java.time.format {
field public static final java.time.format.DecimalStyle STANDARD;
}
- public final class FormatStyle extends java.lang.Enum {
- method public static java.time.format.FormatStyle valueOf(java.lang.String);
- method public static final java.time.format.FormatStyle[] values();
+ public enum FormatStyle {
enum_constant public static final java.time.format.FormatStyle FULL;
enum_constant public static final java.time.format.FormatStyle LONG;
enum_constant public static final java.time.format.FormatStyle MEDIUM;
enum_constant public static final java.time.format.FormatStyle SHORT;
}
- public final class ResolverStyle extends java.lang.Enum {
- method public static java.time.format.ResolverStyle valueOf(java.lang.String);
- method public static final java.time.format.ResolverStyle[] values();
+ public enum ResolverStyle {
enum_constant public static final java.time.format.ResolverStyle LENIENT;
enum_constant public static final java.time.format.ResolverStyle SMART;
enum_constant public static final java.time.format.ResolverStyle STRICT;
}
- public final class SignStyle extends java.lang.Enum {
- method public static java.time.format.SignStyle valueOf(java.lang.String);
- method public static final java.time.format.SignStyle[] values();
+ public enum SignStyle {
enum_constant public static final java.time.format.SignStyle ALWAYS;
enum_constant public static final java.time.format.SignStyle EXCEEDS_PAD;
enum_constant public static final java.time.format.SignStyle NEVER;
@@ -68104,12 +68298,10 @@ package java.time.format {
enum_constant public static final java.time.format.SignStyle NOT_NEGATIVE;
}
- public final class TextStyle extends java.lang.Enum {
+ public enum TextStyle {
method public java.time.format.TextStyle asNormal();
method public java.time.format.TextStyle asStandalone();
method public boolean isStandalone();
- method public static java.time.format.TextStyle valueOf(java.lang.String);
- method public static final java.time.format.TextStyle[] values();
enum_constant public static final java.time.format.TextStyle FULL;
enum_constant public static final java.time.format.TextStyle FULL_STANDALONE;
enum_constant public static final java.time.format.TextStyle NARROW;
@@ -68122,7 +68314,7 @@ package java.time.format {
package java.time.temporal {
- public final class ChronoField extends java.lang.Enum implements java.time.temporal.TemporalField {
+ public enum ChronoField implements java.time.temporal.TemporalField {
method public <R extends java.time.temporal.Temporal> R adjustInto(R, long);
method public int checkValidIntValue(long);
method public long checkValidValue(long);
@@ -68134,8 +68326,6 @@ package java.time.temporal {
method public boolean isTimeBased();
method public java.time.temporal.ValueRange range();
method public java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
- method public static java.time.temporal.ChronoField valueOf(java.lang.String);
- method public static final java.time.temporal.ChronoField[] values();
enum_constant public static final java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_MONTH;
enum_constant public static final java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_YEAR;
enum_constant public static final java.time.temporal.ChronoField ALIGNED_WEEK_OF_MONTH;
@@ -68168,15 +68358,13 @@ package java.time.temporal {
enum_constant public static final java.time.temporal.ChronoField YEAR_OF_ERA;
}
- public final class ChronoUnit extends java.lang.Enum implements java.time.temporal.TemporalUnit {
+ public enum ChronoUnit implements java.time.temporal.TemporalUnit {
method public <R extends java.time.temporal.Temporal> R addTo(R, long);
method public long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
method public java.time.Duration getDuration();
method public boolean isDateBased();
method public boolean isDurationEstimated();
method public boolean isTimeBased();
- method public static java.time.temporal.ChronoUnit valueOf(java.lang.String);
- method public static final java.time.temporal.ChronoUnit[] values();
enum_constant public static final java.time.temporal.ChronoUnit CENTURIES;
enum_constant public static final java.time.temporal.ChronoUnit DAYS;
enum_constant public static final java.time.temporal.ChronoUnit DECADES;
@@ -68210,27 +68398,27 @@ package java.time.temporal {
field public static final java.time.temporal.TemporalField RATA_DIE;
}
- public abstract interface Temporal implements java.time.temporal.TemporalAccessor {
- method public abstract boolean isSupported(java.time.temporal.TemporalUnit);
+ public interface Temporal extends java.time.temporal.TemporalAccessor {
+ method public boolean isSupported(java.time.temporal.TemporalUnit);
method public default java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
method public default java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
method public default java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- method public abstract java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- method public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
+ method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public default java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- method public abstract java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
+ method public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
}
- public abstract interface TemporalAccessor {
+ public interface TemporalAccessor {
method public default int get(java.time.temporal.TemporalField);
- method public abstract long getLong(java.time.temporal.TemporalField);
- method public abstract boolean isSupported(java.time.temporal.TemporalField);
+ method public long getLong(java.time.temporal.TemporalField);
+ method public boolean isSupported(java.time.temporal.TemporalField);
method public default <R> R query(java.time.temporal.TemporalQuery<R>);
method public default java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
}
- public abstract interface TemporalAdjuster {
- method public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
+ @java.lang.FunctionalInterface public interface TemporalAdjuster {
+ method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
}
public final class TemporalAdjusters {
@@ -68250,26 +68438,26 @@ package java.time.temporal {
method public static java.time.temporal.TemporalAdjuster previousOrSame(java.time.DayOfWeek);
}
- public abstract interface TemporalAmount {
- method public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
- method public abstract long get(java.time.temporal.TemporalUnit);
- method public abstract java.util.List<java.time.temporal.TemporalUnit> getUnits();
- method public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
+ public interface TemporalAmount {
+ method public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
+ method public long get(java.time.temporal.TemporalUnit);
+ method public java.util.List<java.time.temporal.TemporalUnit> getUnits();
+ method public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
}
- public abstract interface TemporalField {
- method public abstract <R extends java.time.temporal.Temporal> R adjustInto(R, long);
- method public abstract java.time.temporal.TemporalUnit getBaseUnit();
- method public default java.lang.String getDisplayName(java.util.Locale);
- method public abstract long getFrom(java.time.temporal.TemporalAccessor);
- method public abstract java.time.temporal.TemporalUnit getRangeUnit();
- method public abstract boolean isDateBased();
- method public abstract boolean isSupportedBy(java.time.temporal.TemporalAccessor);
- method public abstract boolean isTimeBased();
- method public abstract java.time.temporal.ValueRange range();
- method public abstract java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
- method public default java.time.temporal.TemporalAccessor resolve(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.temporal.TemporalAccessor, java.time.format.ResolverStyle);
- method public abstract java.lang.String toString();
+ public interface TemporalField {
+ method public <R extends java.time.temporal.Temporal> R adjustInto(R, long);
+ method public java.time.temporal.TemporalUnit getBaseUnit();
+ method public default String getDisplayName(java.util.Locale);
+ method public long getFrom(java.time.temporal.TemporalAccessor);
+ method public java.time.temporal.TemporalUnit getRangeUnit();
+ method public boolean isDateBased();
+ method public boolean isSupportedBy(java.time.temporal.TemporalAccessor);
+ method public boolean isTimeBased();
+ method public java.time.temporal.ValueRange range();
+ method public java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
+ method public default java.time.temporal.TemporalAccessor resolve(java.util.Map<java.time.temporal.TemporalField,java.lang.Long>, java.time.temporal.TemporalAccessor, java.time.format.ResolverStyle);
+ method public String toString();
}
public final class TemporalQueries {
@@ -68282,24 +68470,24 @@ package java.time.temporal {
method public static java.time.temporal.TemporalQuery<java.time.ZoneId> zoneId();
}
- public abstract interface TemporalQuery<R> {
- method public abstract R queryFrom(java.time.temporal.TemporalAccessor);
+ @java.lang.FunctionalInterface public interface TemporalQuery<R> {
+ method public R queryFrom(java.time.temporal.TemporalAccessor);
}
- public abstract interface TemporalUnit {
- method public abstract <R extends java.time.temporal.Temporal> R addTo(R, long);
- method public abstract long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
- method public abstract java.time.Duration getDuration();
- method public abstract boolean isDateBased();
- method public abstract boolean isDurationEstimated();
+ public interface TemporalUnit {
+ method public <R extends java.time.temporal.Temporal> R addTo(R, long);
+ method public long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
+ method public java.time.Duration getDuration();
+ method public boolean isDateBased();
+ method public boolean isDurationEstimated();
method public default boolean isSupportedBy(java.time.temporal.Temporal);
- method public abstract boolean isTimeBased();
- method public abstract java.lang.String toString();
+ method public boolean isTimeBased();
+ method public String toString();
}
public class UnsupportedTemporalTypeException extends java.time.DateTimeException {
- ctor public UnsupportedTemporalTypeException(java.lang.String);
- ctor public UnsupportedTemporalTypeException(java.lang.String, java.lang.Throwable);
+ ctor public UnsupportedTemporalTypeException(String);
+ ctor public UnsupportedTemporalTypeException(String, Throwable);
}
public final class ValueRange implements java.io.Serializable {
@@ -68337,7 +68525,7 @@ package java.time.temporal {
package java.time.zone {
- public final class ZoneOffsetTransition implements java.lang.Comparable java.io.Serializable {
+ public final class ZoneOffsetTransition implements java.lang.Comparable<java.time.zone.ZoneOffsetTransition> java.io.Serializable {
method public int compareTo(java.time.zone.ZoneOffsetTransition);
method public java.time.LocalDateTime getDateTimeAfter();
method public java.time.LocalDateTime getDateTimeBefore();
@@ -68366,10 +68554,8 @@ package java.time.zone {
method public static java.time.zone.ZoneOffsetTransitionRule of(java.time.Month, int, java.time.DayOfWeek, java.time.LocalTime, boolean, java.time.zone.ZoneOffsetTransitionRule.TimeDefinition, java.time.ZoneOffset, java.time.ZoneOffset, java.time.ZoneOffset);
}
- public static final class ZoneOffsetTransitionRule.TimeDefinition extends java.lang.Enum {
+ public enum ZoneOffsetTransitionRule.TimeDefinition {
method public java.time.LocalDateTime createDateTime(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
- method public static java.time.zone.ZoneOffsetTransitionRule.TimeDefinition valueOf(java.lang.String);
- method public static final java.time.zone.ZoneOffsetTransitionRule.TimeDefinition[] values();
enum_constant public static final java.time.zone.ZoneOffsetTransitionRule.TimeDefinition STANDARD;
enum_constant public static final java.time.zone.ZoneOffsetTransitionRule.TimeDefinition UTC;
enum_constant public static final java.time.zone.ZoneOffsetTransitionRule.TimeDefinition WALL;
@@ -68394,136 +68580,136 @@ package java.time.zone {
}
public class ZoneRulesException extends java.time.DateTimeException {
- ctor public ZoneRulesException(java.lang.String);
- ctor public ZoneRulesException(java.lang.String, java.lang.Throwable);
+ ctor public ZoneRulesException(String);
+ ctor public ZoneRulesException(String, Throwable);
}
}
package java.util {
- public abstract class AbstractCollection<E> implements java.util.Collection {
+ public abstract class AbstractCollection<E> implements java.util.Collection<E> {
ctor protected AbstractCollection();
method public boolean add(E);
- method public boolean addAll(java.util.Collection<? extends E>);
+ method public boolean addAll(@NonNull java.util.Collection<? extends E>);
method public void clear();
- method public boolean contains(java.lang.Object);
- method public boolean containsAll(java.util.Collection<?>);
+ method public boolean contains(@Nullable Object);
+ method public boolean containsAll(@NonNull java.util.Collection<?>);
method public boolean isEmpty();
- method public boolean remove(java.lang.Object);
- method public boolean removeAll(java.util.Collection<?>);
- method public boolean retainAll(java.util.Collection<?>);
- method public java.lang.Object[] toArray();
+ method public boolean remove(@Nullable Object);
+ method public boolean removeAll(@NonNull java.util.Collection<?>);
+ method public boolean retainAll(@NonNull java.util.Collection<?>);
+ method public Object[] toArray();
method public <T> T[] toArray(T[]);
}
- public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List {
+ public abstract class AbstractList<E> extends java.util.AbstractCollection<E> implements java.util.List<E> {
ctor protected AbstractList();
method public void add(int, E);
- method public boolean addAll(int, java.util.Collection<? extends E>);
- method public int indexOf(java.lang.Object);
- method public java.util.Iterator<E> iterator();
- method public int lastIndexOf(java.lang.Object);
- method public java.util.ListIterator<E> listIterator();
- method public java.util.ListIterator<E> listIterator(int);
+ method public boolean addAll(int, @NonNull java.util.Collection<? extends E>);
+ method public int indexOf(@Nullable Object);
+ method @NonNull public java.util.Iterator<E> iterator();
+ method public int lastIndexOf(@Nullable Object);
+ method @NonNull public java.util.ListIterator<E> listIterator();
+ method @NonNull public java.util.ListIterator<E> listIterator(int);
method public E remove(int);
method protected void removeRange(int, int);
method public E set(int, E);
- method public java.util.List<E> subList(int, int);
+ method @NonNull public java.util.List<E> subList(int, int);
field protected transient int modCount;
}
- public abstract class AbstractMap<K, V> implements java.util.Map {
+ public abstract class AbstractMap<K, V> implements java.util.Map<K,V> {
ctor protected AbstractMap();
method public void clear();
- method public boolean containsKey(java.lang.Object);
- method public boolean containsValue(java.lang.Object);
- method public V get(java.lang.Object);
+ method public boolean containsKey(@Nullable Object);
+ method public boolean containsValue(@Nullable Object);
+ method @Nullable public V get(@Nullable Object);
method public boolean isEmpty();
- method public java.util.Set<K> keySet();
- method public V put(K, V);
- method public void putAll(java.util.Map<? extends K, ? extends V>);
- method public V remove(java.lang.Object);
+ method @NonNull public java.util.Set<K> keySet();
+ method @Nullable public V put(K, V);
+ method public void putAll(@NonNull java.util.Map<? extends K,? extends V>);
+ method @Nullable public V remove(@Nullable Object);
method public int size();
- method public java.util.Collection<V> values();
+ method @NonNull public java.util.Collection<V> values();
}
- public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
+ public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry<K,V> java.io.Serializable {
ctor public AbstractMap.SimpleEntry(K, V);
- ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>);
+ ctor public AbstractMap.SimpleEntry(@NonNull java.util.Map.Entry<? extends K,? extends V>);
method public K getKey();
method public V getValue();
method public V setValue(V);
}
- public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
+ public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry<K,V> java.io.Serializable {
ctor public AbstractMap.SimpleImmutableEntry(K, V);
- ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>);
+ ctor public AbstractMap.SimpleImmutableEntry(@NonNull java.util.Map.Entry<? extends K,? extends V>);
method public K getKey();
method public V getValue();
method public V setValue(V);
}
- public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue {
+ public abstract class AbstractQueue<E> extends java.util.AbstractCollection<E> implements java.util.Queue<E> {
ctor protected AbstractQueue();
method public E element();
method public E remove();
}
- public abstract class AbstractSequentialList<E> extends java.util.AbstractList {
+ public abstract class AbstractSequentialList<E> extends java.util.AbstractList<E> {
ctor protected AbstractSequentialList();
method public E get(int);
}
- public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set {
+ public abstract class AbstractSet<E> extends java.util.AbstractCollection<E> implements java.util.Set<E> {
ctor protected AbstractSet();
}
- public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
+ public class ArrayDeque<E> extends java.util.AbstractCollection<E> implements java.lang.Cloneable java.util.Deque<E> java.io.Serializable {
ctor public ArrayDeque();
ctor public ArrayDeque(int);
- ctor public ArrayDeque(java.util.Collection<? extends E>);
+ ctor public ArrayDeque(@NonNull java.util.Collection<? extends E>);
method public void addFirst(E);
method public void addLast(E);
- method public java.util.ArrayDeque<E> clone();
- method public java.util.Iterator<E> descendingIterator();
+ method @NonNull public java.util.ArrayDeque<E> clone();
+ method @NonNull public java.util.Iterator<E> descendingIterator();
method public E element();
method public E getFirst();
method public E getLast();
- method public java.util.Iterator<E> iterator();
+ method @NonNull public java.util.Iterator<E> iterator();
method public boolean offer(E);
method public boolean offerFirst(E);
method public boolean offerLast(E);
- method public E peek();
- method public E peekFirst();
- method public E peekLast();
- method public E poll();
- method public E pollFirst();
- method public E pollLast();
+ method @Nullable public E peek();
+ method @Nullable public E peekFirst();
+ method @Nullable public E peekLast();
+ method @Nullable public E poll();
+ method @Nullable public E pollFirst();
+ method @Nullable public E pollLast();
method public E pop();
method public void push(E);
method public E remove();
method public E removeFirst();
- method public boolean removeFirstOccurrence(java.lang.Object);
+ method public boolean removeFirstOccurrence(@Nullable Object);
method public E removeLast();
- method public boolean removeLastOccurrence(java.lang.Object);
+ method public boolean removeLastOccurrence(@Nullable Object);
method public int size();
}
- public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+ public class ArrayList<E> extends java.util.AbstractList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
ctor public ArrayList(int);
ctor public ArrayList();
- ctor public ArrayList(java.util.Collection<? extends E>);
- method public java.lang.Object clone();
+ ctor public ArrayList(@NonNull java.util.Collection<? extends E>);
+ method @NonNull public Object clone();
method public void ensureCapacity(int);
- method public void forEach(java.util.function.Consumer<? super E>);
+ method public void forEach(@NonNull java.util.function.Consumer<? super E>);
method public E get(int);
method public int size();
method public void trimToSize();
}
public class Arrays {
- method public static <T> java.util.List<T> asList(T...);
+ method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(T...);
method public static int binarySearch(long[], long);
method public static int binarySearch(long[], int, int, long);
method public static int binarySearch(int[], int);
@@ -68538,12 +68724,12 @@ package java.util {
method public static int binarySearch(double[], int, int, double);
method public static int binarySearch(float[], float);
method public static int binarySearch(float[], int, int, float);
- method public static int binarySearch(java.lang.Object[], java.lang.Object);
- method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object);
- method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>);
- method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
+ method public static int binarySearch(Object[], @NonNull Object);
+ method public static int binarySearch(Object[], int, int, @NonNull Object);
+ method public static <T> int binarySearch(T[], T, @Nullable java.util.Comparator<? super T>);
+ method public static <T> int binarySearch(T[], int, int, T, @Nullable java.util.Comparator<? super T>);
method public static <T> T[] copyOf(T[], int);
- method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
+ method public static <T, U> T[] copyOf(U[], int, @NonNull Class<? extends T[]>);
method public static byte[] copyOf(byte[], int);
method public static short[] copyOf(short[], int);
method public static int[] copyOf(int[], int);
@@ -68553,7 +68739,7 @@ package java.util {
method public static double[] copyOf(double[], int);
method public static boolean[] copyOf(boolean[], int);
method public static <T> T[] copyOfRange(T[], int, int);
- method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
+ method public static <T, U> T[] copyOfRange(U[], int, int, @NonNull Class<? extends T[]>);
method public static byte[] copyOfRange(byte[], int, int);
method public static short[] copyOfRange(short[], int, int);
method public static int[] copyOfRange(int[], int, int);
@@ -68562,9 +68748,9 @@ package java.util {
method public static float[] copyOfRange(float[], int, int);
method public static double[] copyOfRange(double[], int, int);
method public static boolean[] copyOfRange(boolean[], int, int);
- method public static boolean deepEquals(java.lang.Object[], java.lang.Object[]);
- method public static int deepHashCode(java.lang.Object[]);
- method public static java.lang.String deepToString(java.lang.Object[]);
+ method public static boolean deepEquals(Object[], Object[]);
+ method public static int deepHashCode(Object[]);
+ method @NonNull public static String deepToString(Object[]);
method public static boolean equals(long[], long[]);
method public static boolean equals(int[], int[]);
method public static boolean equals(short[], short[]);
@@ -68573,7 +68759,7 @@ package java.util {
method public static boolean equals(boolean[], boolean[]);
method public static boolean equals(double[], double[]);
method public static boolean equals(float[], float[]);
- method public static boolean equals(java.lang.Object[], java.lang.Object[]);
+ method public static boolean equals(Object[], Object[]);
method public static void fill(long[], long);
method public static void fill(long[], int, int, long);
method public static void fill(int[], int);
@@ -68590,8 +68776,8 @@ package java.util {
method public static void fill(double[], int, int, double);
method public static void fill(float[], float);
method public static void fill(float[], int, int, float);
- method public static void fill(java.lang.Object[], java.lang.Object);
- method public static void fill(java.lang.Object[], int, int, java.lang.Object);
+ method public static void fill(Object[], @Nullable Object);
+ method public static void fill(Object[], int, int, @Nullable Object);
method public static int hashCode(long[]);
method public static int hashCode(int[]);
method public static int hashCode(short[]);
@@ -68600,19 +68786,19 @@ package java.util {
method public static int hashCode(boolean[]);
method public static int hashCode(float[]);
method public static int hashCode(double[]);
- method public static int hashCode(java.lang.Object[]);
- method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
- method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
- method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator);
- method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator);
- method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator);
- method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator);
- method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator);
- method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator);
- method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
- method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator);
- method public static void parallelSetAll(long[], java.util.function.IntToLongFunction);
- method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction);
+ method public static int hashCode(Object[]);
+ method public static <T> void parallelPrefix(T[], @NonNull java.util.function.BinaryOperator<T>);
+ method public static <T> void parallelPrefix(T[], int, int, @NonNull java.util.function.BinaryOperator<T>);
+ method public static void parallelPrefix(long[], @NonNull java.util.function.LongBinaryOperator);
+ method public static void parallelPrefix(long[], int, int, @NonNull java.util.function.LongBinaryOperator);
+ method public static void parallelPrefix(double[], @NonNull java.util.function.DoubleBinaryOperator);
+ method public static void parallelPrefix(double[], int, int, @NonNull java.util.function.DoubleBinaryOperator);
+ method public static void parallelPrefix(int[], @NonNull java.util.function.IntBinaryOperator);
+ method public static void parallelPrefix(int[], int, int, @NonNull java.util.function.IntBinaryOperator);
+ method public static <T> void parallelSetAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
+ method public static void parallelSetAll(int[], @NonNull java.util.function.IntUnaryOperator);
+ method public static void parallelSetAll(long[], @NonNull java.util.function.IntToLongFunction);
+ method public static void parallelSetAll(double[], @NonNull java.util.function.IntToDoubleFunction);
method public static void parallelSort(byte[]);
method public static void parallelSort(byte[], int, int);
method public static void parallelSort(char[]);
@@ -68629,12 +68815,12 @@ package java.util {
method public static void parallelSort(double[], int, int);
method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
- method public static <T> void parallelSort(T[], java.util.Comparator<? super T>);
- method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>);
- method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>);
- method public static void setAll(int[], java.util.function.IntUnaryOperator);
- method public static void setAll(long[], java.util.function.IntToLongFunction);
- method public static void setAll(double[], java.util.function.IntToDoubleFunction);
+ method public static <T> void parallelSort(T[], @Nullable java.util.Comparator<? super T>);
+ method public static <T> void parallelSort(T[], int, int, @Nullable java.util.Comparator<? super T>);
+ method public static <T> void setAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
+ method public static void setAll(int[], @NonNull java.util.function.IntUnaryOperator);
+ method public static void setAll(long[], @NonNull java.util.function.IntToLongFunction);
+ method public static void setAll(double[], @NonNull java.util.function.IntToDoubleFunction);
method public static void sort(int[]);
method public static void sort(int[], int, int);
method public static void sort(long[]);
@@ -68649,35 +68835,35 @@ package java.util {
method public static void sort(float[], int, int);
method public static void sort(double[]);
method public static void sort(double[], int, int);
- method public static void sort(java.lang.Object[]);
- method public static void sort(java.lang.Object[], int, int);
- method public static <T> void sort(T[], java.util.Comparator<? super T>);
- method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>);
- method public static <T> java.util.Spliterator<T> spliterator(T[]);
- method public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
- method public static java.util.Spliterator.OfInt spliterator(int[]);
- method public static java.util.Spliterator.OfInt spliterator(int[], int, int);
- method public static java.util.Spliterator.OfLong spliterator(long[]);
- method public static java.util.Spliterator.OfLong spliterator(long[], int, int);
- method public static java.util.Spliterator.OfDouble spliterator(double[]);
- method public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
- method public static <T> java.util.stream.Stream<T> stream(T[]);
- method public static <T> java.util.stream.Stream<T> stream(T[], int, int);
- method public static java.util.stream.IntStream stream(int[]);
- method public static java.util.stream.IntStream stream(int[], int, int);
- method public static java.util.stream.LongStream stream(long[]);
- method public static java.util.stream.LongStream stream(long[], int, int);
- method public static java.util.stream.DoubleStream stream(double[]);
- method public static java.util.stream.DoubleStream stream(double[], int, int);
- method public static java.lang.String toString(long[]);
- method public static java.lang.String toString(int[]);
- method public static java.lang.String toString(short[]);
- method public static java.lang.String toString(char[]);
- method public static java.lang.String toString(byte[]);
- method public static java.lang.String toString(boolean[]);
- method public static java.lang.String toString(float[]);
- method public static java.lang.String toString(double[]);
- method public static java.lang.String toString(java.lang.Object[]);
+ method public static void sort(Object[]);
+ method public static void sort(Object[], int, int);
+ method public static <T> void sort(T[], @Nullable java.util.Comparator<? super T>);
+ method public static <T> void sort(T[], int, int, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[]);
+ method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
+ method @NonNull public static java.util.Spliterator.OfInt spliterator(int[]);
+ method @NonNull public static java.util.Spliterator.OfInt spliterator(int[], int, int);
+ method @NonNull public static java.util.Spliterator.OfLong spliterator(long[]);
+ method @NonNull public static java.util.Spliterator.OfLong spliterator(long[], int, int);
+ method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[]);
+ method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
+ method @NonNull public static <T> java.util.stream.Stream<T> stream(T[]);
+ method @NonNull public static <T> java.util.stream.Stream<T> stream(T[], int, int);
+ method @NonNull public static java.util.stream.IntStream stream(int[]);
+ method @NonNull public static java.util.stream.IntStream stream(int[], int, int);
+ method @NonNull public static java.util.stream.LongStream stream(long[]);
+ method @NonNull public static java.util.stream.LongStream stream(long[], int, int);
+ method @NonNull public static java.util.stream.DoubleStream stream(double[]);
+ method @NonNull public static java.util.stream.DoubleStream stream(double[], int, int);
+ method @NonNull public static String toString(long[]);
+ method @NonNull public static String toString(int[]);
+ method @NonNull public static String toString(short[]);
+ method @NonNull public static String toString(char[]);
+ method @NonNull public static String toString(byte[]);
+ method @NonNull public static String toString(boolean[]);
+ method @NonNull public static String toString(float[]);
+ method @NonNull public static String toString(double[]);
+ method @NonNull public static String toString(Object[]);
}
public class Base64 {
@@ -68692,7 +68878,7 @@ package java.util {
public static class Base64.Decoder {
method public byte[] decode(byte[]);
- method public byte[] decode(java.lang.String);
+ method public byte[] decode(String);
method public int decode(byte[], byte[]);
method public java.nio.ByteBuffer decode(java.nio.ByteBuffer);
method public java.io.InputStream wrap(java.io.InputStream);
@@ -68702,7 +68888,7 @@ package java.util {
method public byte[] encode(byte[]);
method public int encode(byte[], byte[]);
method public java.nio.ByteBuffer encode(java.nio.ByteBuffer);
- method public java.lang.String encodeToString(byte[]);
+ method public String encodeToString(byte[]);
method public java.util.Base64.Encoder withoutPadding();
method public java.io.OutputStream wrap(java.io.OutputStream);
}
@@ -68716,7 +68902,7 @@ package java.util {
method public void clear(int);
method public void clear(int, int);
method public void clear();
- method public java.lang.Object clone();
+ method public Object clone();
method public void flip(int);
method public void flip(int, int);
method public boolean get(int);
@@ -68744,40 +68930,40 @@ package java.util {
method public void xor(java.util.BitSet);
}
- public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable java.io.Serializable {
+ public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable<java.util.Calendar> java.io.Serializable {
ctor protected Calendar();
- ctor protected Calendar(java.util.TimeZone, java.util.Locale);
+ ctor protected Calendar(@NonNull java.util.TimeZone, @NonNull java.util.Locale);
method public abstract void add(int, int);
- method public boolean after(java.lang.Object);
- method public boolean before(java.lang.Object);
+ method public boolean after(@Nullable Object);
+ method public boolean before(@Nullable Object);
method public final void clear();
method public final void clear(int);
- method public java.lang.Object clone();
- method public int compareTo(java.util.Calendar);
+ method @NonNull public Object clone();
+ method public int compareTo(@NonNull java.util.Calendar);
method protected void complete();
method protected abstract void computeFields();
method protected abstract void computeTime();
method public int get(int);
method public int getActualMaximum(int);
method public int getActualMinimum(int);
- method public static java.util.Set<java.lang.String> getAvailableCalendarTypes();
- method public static synchronized java.util.Locale[] getAvailableLocales();
- method public java.lang.String getCalendarType();
- method public java.lang.String getDisplayName(int, int, java.util.Locale);
- method public java.util.Map<java.lang.String, java.lang.Integer> getDisplayNames(int, int, java.util.Locale);
+ method @NonNull public static java.util.Set<java.lang.String> getAvailableCalendarTypes();
+ method public static java.util.Locale[] getAvailableLocales();
+ method @NonNull public String getCalendarType();
+ method @Nullable public String getDisplayName(int, int, @NonNull java.util.Locale);
+ method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDisplayNames(int, int, @NonNull java.util.Locale);
method public int getFirstDayOfWeek();
method public abstract int getGreatestMinimum(int);
- method public static java.util.Calendar getInstance();
- method public static java.util.Calendar getInstance(java.util.TimeZone);
- method public static java.util.Calendar getInstance(java.util.Locale);
- method public static java.util.Calendar getInstance(java.util.TimeZone, java.util.Locale);
+ method @NonNull public static java.util.Calendar getInstance();
+ method @NonNull public static java.util.Calendar getInstance(@NonNull java.util.TimeZone);
+ method @NonNull public static java.util.Calendar getInstance(@NonNull java.util.Locale);
+ method @NonNull public static java.util.Calendar getInstance(@NonNull java.util.TimeZone, @NonNull java.util.Locale);
method public abstract int getLeastMaximum(int);
method public abstract int getMaximum(int);
method public int getMinimalDaysInFirstWeek();
method public abstract int getMinimum(int);
- method public final java.util.Date getTime();
+ method @NonNull public final java.util.Date getTime();
method public long getTimeInMillis();
- method public java.util.TimeZone getTimeZone();
+ method @NonNull public java.util.TimeZone getTimeZone();
method public int getWeekYear();
method public int getWeeksInWeekYear();
method protected final int internalGet(int);
@@ -68793,11 +68979,11 @@ package java.util {
method public void setFirstDayOfWeek(int);
method public void setLenient(boolean);
method public void setMinimalDaysInFirstWeek(int);
- method public final void setTime(java.util.Date);
+ method public final void setTime(@NonNull java.util.Date);
method public void setTimeInMillis(long);
- method public void setTimeZone(java.util.TimeZone);
+ method public void setTimeZone(@NonNull java.util.TimeZone);
method public void setWeekDate(int, int, int);
- method public final java.time.Instant toInstant();
+ method @NonNull public final java.time.Instant toInstant();
field public static final int ALL_STYLES = 0; // 0x0
field public static final int AM = 0; // 0x0
field public static final int AM_PM = 9; // 0x9
@@ -68857,132 +69043,132 @@ package java.util {
public static class Calendar.Builder {
ctor public Calendar.Builder();
- method public java.util.Calendar build();
- method public java.util.Calendar.Builder set(int, int);
- method public java.util.Calendar.Builder setCalendarType(java.lang.String);
- method public java.util.Calendar.Builder setDate(int, int, int);
- method public java.util.Calendar.Builder setFields(int...);
- method public java.util.Calendar.Builder setInstant(long);
- method public java.util.Calendar.Builder setInstant(java.util.Date);
- method public java.util.Calendar.Builder setLenient(boolean);
- method public java.util.Calendar.Builder setLocale(java.util.Locale);
- method public java.util.Calendar.Builder setTimeOfDay(int, int, int);
- method public java.util.Calendar.Builder setTimeOfDay(int, int, int, int);
- method public java.util.Calendar.Builder setTimeZone(java.util.TimeZone);
- method public java.util.Calendar.Builder setWeekDate(int, int, int);
- method public java.util.Calendar.Builder setWeekDefinition(int, int);
- }
-
- public abstract interface Collection<E> implements java.lang.Iterable {
- method public abstract boolean add(E);
- method public abstract boolean addAll(java.util.Collection<? extends E>);
- method public abstract void clear();
- method public abstract boolean contains(java.lang.Object);
- method public abstract boolean containsAll(java.util.Collection<?>);
- method public abstract boolean equals(java.lang.Object);
- method public abstract int hashCode();
- method public abstract boolean isEmpty();
- method public abstract java.util.Iterator<E> iterator();
- method public default java.util.stream.Stream<E> parallelStream();
- method public abstract boolean remove(java.lang.Object);
- method public abstract boolean removeAll(java.util.Collection<?>);
- method public default boolean removeIf(java.util.function.Predicate<? super E>);
- method public abstract boolean retainAll(java.util.Collection<?>);
- method public abstract int size();
- method public default java.util.Spliterator<E> spliterator();
- method public default java.util.stream.Stream<E> stream();
- method public abstract java.lang.Object[] toArray();
- method public abstract <T> T[] toArray(T[]);
+ method @NonNull public java.util.Calendar build();
+ method @NonNull public java.util.Calendar.Builder set(int, int);
+ method @NonNull public java.util.Calendar.Builder setCalendarType(@NonNull String);
+ method @NonNull public java.util.Calendar.Builder setDate(int, int, int);
+ method @NonNull public java.util.Calendar.Builder setFields(int...);
+ method @NonNull public java.util.Calendar.Builder setInstant(long);
+ method @NonNull public java.util.Calendar.Builder setInstant(@NonNull java.util.Date);
+ method @NonNull public java.util.Calendar.Builder setLenient(boolean);
+ method @NonNull public java.util.Calendar.Builder setLocale(@NonNull java.util.Locale);
+ method @NonNull public java.util.Calendar.Builder setTimeOfDay(int, int, int);
+ method @NonNull public java.util.Calendar.Builder setTimeOfDay(int, int, int, int);
+ method @NonNull public java.util.Calendar.Builder setTimeZone(@NonNull java.util.TimeZone);
+ method @NonNull public java.util.Calendar.Builder setWeekDate(int, int, int);
+ method @NonNull public java.util.Calendar.Builder setWeekDefinition(int, int);
+ }
+
+ public interface Collection<E> extends java.lang.Iterable<E> {
+ method public boolean add(E);
+ method public boolean addAll(@NonNull java.util.Collection<? extends E>);
+ method public void clear();
+ method public boolean contains(@Nullable Object);
+ method public boolean containsAll(@NonNull java.util.Collection<?>);
+ method public boolean equals(@Nullable Object);
+ method public int hashCode();
+ method public boolean isEmpty();
+ method @NonNull public java.util.Iterator<E> iterator();
+ method @NonNull public default java.util.stream.Stream<E> parallelStream();
+ method public boolean remove(@Nullable Object);
+ method public boolean removeAll(@NonNull java.util.Collection<?>);
+ method public default boolean removeIf(@NonNull java.util.function.Predicate<? super E>);
+ method public boolean retainAll(@NonNull java.util.Collection<?>);
+ method public int size();
+ method @NonNull public default java.util.Spliterator<E> spliterator();
+ method @NonNull public default java.util.stream.Stream<E> stream();
+ method public Object[] toArray();
+ method public <T> T[] toArray(T[]);
}
public class Collections {
- method public static <T> boolean addAll(java.util.Collection<? super T>, T...);
- method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
- method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
- method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
- method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
- method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
- method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
- method public static <K, V> java.util.NavigableMap<K, V> checkedNavigableMap(java.util.NavigableMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
- method public static <E> java.util.NavigableSet<E> checkedNavigableSet(java.util.NavigableSet<E>, java.lang.Class<E>);
- method public static <E> java.util.Queue<E> checkedQueue(java.util.Queue<E>, java.lang.Class<E>);
- method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
- method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
- method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
- method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>);
- method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>);
- method public static <T> java.util.Enumeration<T> emptyEnumeration();
- method public static <T> java.util.Iterator<T> emptyIterator();
- method public static final <T> java.util.List<T> emptyList();
- method public static <T> java.util.ListIterator<T> emptyListIterator();
- method public static final <K, V> java.util.Map<K, V> emptyMap();
- method public static final <K, V> java.util.NavigableMap<K, V> emptyNavigableMap();
- method public static <E> java.util.NavigableSet<E> emptyNavigableSet();
- method public static final <T> java.util.Set<T> emptySet();
- method public static final <K, V> java.util.SortedMap<K, V> emptySortedMap();
- method public static <E> java.util.SortedSet<E> emptySortedSet();
- method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>);
- method public static <T> void fill(java.util.List<? super T>, T);
- method public static int frequency(java.util.Collection<?>, java.lang.Object);
- method public static int indexOfSubList(java.util.List<?>, java.util.List<?>);
- method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>);
- method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>);
- method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
- method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
- method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>);
- method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
- method public static <T> java.util.List<T> nCopies(int, T);
- method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
- method public static <T> boolean replaceAll(java.util.List<T>, T, T);
- method public static void reverse(java.util.List<?>);
- method public static <T> java.util.Comparator<T> reverseOrder();
- method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
- method public static void rotate(java.util.List<?>, int);
- method public static void shuffle(java.util.List<?>);
- method public static void shuffle(java.util.List<?>, java.util.Random);
- method public static <T> java.util.Set<T> singleton(T);
- method public static <T> java.util.List<T> singletonList(T);
- method public static <K, V> java.util.Map<K, V> singletonMap(K, V);
- method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>);
- method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>);
- method public static void swap(java.util.List<?>, int, int);
- method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
- method public static <T> java.util.List<T> synchronizedList(java.util.List<T>);
- method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
- method public static <K, V> java.util.NavigableMap<K, V> synchronizedNavigableMap(java.util.NavigableMap<K, V>);
- method public static <T> java.util.NavigableSet<T> synchronizedNavigableSet(java.util.NavigableSet<T>);
- method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>);
- method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
- method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
- method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
- method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>);
- method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
- method public static <K, V> java.util.NavigableMap<K, V> unmodifiableNavigableMap(java.util.NavigableMap<K, ? extends V>);
- method public static <T> java.util.NavigableSet<T> unmodifiableNavigableSet(java.util.NavigableSet<T>);
- method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
- method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
- method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
- field public static final java.util.List EMPTY_LIST;
- field public static final java.util.Map EMPTY_MAP;
- field public static final java.util.Set EMPTY_SET;
- }
-
- public abstract interface Comparator<T> {
- method public abstract int compare(T, T);
- method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
- method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
+ method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, T...);
+ method @NonNull public static <T> java.util.Queue<T> asLifoQueue(@NonNull java.util.Deque<T>);
+ method public static <T> int binarySearch(@NonNull java.util.List<? extends java.lang.Comparable<? super T>>, @NonNull T);
+ method public static <T> int binarySearch(@NonNull java.util.List<? extends T>, T, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <E> java.util.Collection<E> checkedCollection(@NonNull java.util.Collection<E>, @NonNull Class<E>);
+ method @NonNull public static <E> java.util.List<E> checkedList(@NonNull java.util.List<E>, @NonNull Class<E>);
+ method @NonNull public static <K, V> java.util.Map<K,V> checkedMap(@NonNull java.util.Map<K,V>, @NonNull Class<K>, @NonNull Class<V>);
+ method @NonNull public static <K, V> java.util.NavigableMap<K,V> checkedNavigableMap(@NonNull java.util.NavigableMap<K,V>, @NonNull Class<K>, @NonNull Class<V>);
+ method @NonNull public static <E> java.util.NavigableSet<E> checkedNavigableSet(@NonNull java.util.NavigableSet<E>, @NonNull Class<E>);
+ method @NonNull public static <E> java.util.Queue<E> checkedQueue(@NonNull java.util.Queue<E>, @NonNull Class<E>);
+ method @NonNull public static <E> java.util.Set<E> checkedSet(@NonNull java.util.Set<E>, @NonNull Class<E>);
+ method @NonNull public static <K, V> java.util.SortedMap<K,V> checkedSortedMap(@NonNull java.util.SortedMap<K,V>, @NonNull Class<K>, @NonNull Class<V>);
+ method @NonNull public static <E> java.util.SortedSet<E> checkedSortedSet(@NonNull java.util.SortedSet<E>, @NonNull Class<E>);
+ method public static <T> void copy(@NonNull java.util.List<? super T>, @NonNull java.util.List<? extends T>);
+ method public static boolean disjoint(@NonNull java.util.Collection<?>, @NonNull java.util.Collection<?>);
+ method @NonNull public static <T> java.util.Enumeration<T> emptyEnumeration();
+ method @NonNull public static <T> java.util.Iterator<T> emptyIterator();
+ method @NonNull public static final <T> java.util.List<T> emptyList();
+ method @NonNull public static <T> java.util.ListIterator<T> emptyListIterator();
+ method @NonNull public static final <K, V> java.util.Map<K,V> emptyMap();
+ method @NonNull public static final <K, V> java.util.NavigableMap<K,V> emptyNavigableMap();
+ method @NonNull public static <E> java.util.NavigableSet<E> emptyNavigableSet();
+ method @NonNull public static final <T> java.util.Set<T> emptySet();
+ method @NonNull public static final <K, V> java.util.SortedMap<K,V> emptySortedMap();
+ method @NonNull public static <E> java.util.SortedSet<E> emptySortedSet();
+ method @NonNull public static <T> java.util.Enumeration<T> enumeration(@NonNull java.util.Collection<T>);
+ method public static <T> void fill(@NonNull java.util.List<? super T>, T);
+ method public static int frequency(@NonNull java.util.Collection<?>, @Nullable Object);
+ method public static int indexOfSubList(@NonNull java.util.List<?>, @NonNull java.util.List<?>);
+ method public static int lastIndexOfSubList(@NonNull java.util.List<?>, @NonNull java.util.List<?>);
+ method @NonNull public static <T> java.util.ArrayList<T> list(@NonNull java.util.Enumeration<T>);
+ method @NonNull public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(@NonNull java.util.Collection<? extends T>);
+ method public static <T> T max(@NonNull java.util.Collection<? extends T>, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(@NonNull java.util.Collection<? extends T>);
+ method public static <T> T min(@NonNull java.util.Collection<? extends T>, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <T> java.util.List<T> nCopies(int, T);
+ method @NonNull public static <E> java.util.Set<E> newSetFromMap(@NonNull java.util.Map<E,java.lang.Boolean>);
+ method public static <T> boolean replaceAll(@NonNull java.util.List<T>, T, T);
+ method public static void reverse(@NonNull java.util.List<?>);
+ method @NonNull public static <T> java.util.Comparator<T> reverseOrder();
+ method @NonNull public static <T> java.util.Comparator<T> reverseOrder(@Nullable java.util.Comparator<T>);
+ method public static void rotate(@NonNull java.util.List<?>, int);
+ method public static void shuffle(@NonNull java.util.List<?>);
+ method public static void shuffle(@NonNull java.util.List<?>, @NonNull java.util.Random);
+ method @NonNull public static <T> java.util.Set<T> singleton(T);
+ method @NonNull public static <T> java.util.List<T> singletonList(T);
+ method @NonNull public static <K, V> java.util.Map<K,V> singletonMap(K, V);
+ method public static <T extends java.lang.Comparable<? super T>> void sort(@NonNull java.util.List<T>);
+ method public static <T> void sort(@NonNull java.util.List<T>, @Nullable java.util.Comparator<? super T>);
+ method public static void swap(@NonNull java.util.List<?>, int, int);
+ method @NonNull public static <T> java.util.Collection<T> synchronizedCollection(@NonNull java.util.Collection<T>);
+ method @NonNull public static <T> java.util.List<T> synchronizedList(@NonNull java.util.List<T>);
+ method @NonNull public static <K, V> java.util.Map<K,V> synchronizedMap(@NonNull java.util.Map<K,V>);
+ method @NonNull public static <K, V> java.util.NavigableMap<K,V> synchronizedNavigableMap(@NonNull java.util.NavigableMap<K,V>);
+ method @NonNull public static <T> java.util.NavigableSet<T> synchronizedNavigableSet(@NonNull java.util.NavigableSet<T>);
+ method @NonNull public static <T> java.util.Set<T> synchronizedSet(@NonNull java.util.Set<T>);
+ method @NonNull public static <K, V> java.util.SortedMap<K,V> synchronizedSortedMap(@NonNull java.util.SortedMap<K,V>);
+ method @NonNull public static <T> java.util.SortedSet<T> synchronizedSortedSet(@NonNull java.util.SortedSet<T>);
+ method @NonNull public static <T> java.util.Collection<T> unmodifiableCollection(@NonNull java.util.Collection<? extends T>);
+ method @NonNull public static <T> java.util.List<T> unmodifiableList(@NonNull java.util.List<? extends T>);
+ method @NonNull public static <K, V> java.util.Map<K,V> unmodifiableMap(@NonNull java.util.Map<? extends K,? extends V>);
+ method @NonNull public static <K, V> java.util.NavigableMap<K,V> unmodifiableNavigableMap(@NonNull java.util.NavigableMap<K,? extends V>);
+ method @NonNull public static <T> java.util.NavigableSet<T> unmodifiableNavigableSet(@NonNull java.util.NavigableSet<T>);
+ method @NonNull public static <T> java.util.Set<T> unmodifiableSet(@NonNull java.util.Set<? extends T>);
+ method @NonNull public static <K, V> java.util.SortedMap<K,V> unmodifiableSortedMap(@NonNull java.util.SortedMap<K,? extends V>);
+ method @NonNull public static <T> java.util.SortedSet<T> unmodifiableSortedSet(@NonNull java.util.SortedSet<T>);
+ field @NonNull public static final java.util.List EMPTY_LIST;
+ field @NonNull public static final java.util.Map EMPTY_MAP;
+ field @NonNull public static final java.util.Set EMPTY_SET;
+ }
+
+ @java.lang.FunctionalInterface public interface Comparator<T> {
+ method public int compare(T, T);
+ method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T,? extends U>, java.util.Comparator<? super U>);
+ method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T,? extends U>);
method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
- method public abstract boolean equals(java.lang.Object);
+ method public boolean equals(Object);
method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder();
method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder();
method public default java.util.Comparator<T> reversed();
method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>);
- method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
- method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
+ method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T,? extends U>, java.util.Comparator<? super U>);
+ method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T,? extends U>);
method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>);
method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>);
method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>);
@@ -68990,87 +69176,87 @@ package java.util {
public class ConcurrentModificationException extends java.lang.RuntimeException {
ctor public ConcurrentModificationException();
- ctor public ConcurrentModificationException(java.lang.String);
- ctor public ConcurrentModificationException(java.lang.Throwable);
- ctor public ConcurrentModificationException(java.lang.String, java.lang.Throwable);
+ ctor public ConcurrentModificationException(String);
+ ctor public ConcurrentModificationException(Throwable);
+ ctor public ConcurrentModificationException(String, Throwable);
}
public final class Currency implements java.io.Serializable {
method public static java.util.Set<java.util.Currency> getAvailableCurrencies();
- method public java.lang.String getCurrencyCode();
+ method public String getCurrencyCode();
method public int getDefaultFractionDigits();
- method public java.lang.String getDisplayName();
- method public java.lang.String getDisplayName(java.util.Locale);
- method public static java.util.Currency getInstance(java.lang.String);
+ method public String getDisplayName();
+ method public String getDisplayName(java.util.Locale);
+ method public static java.util.Currency getInstance(String);
method public static java.util.Currency getInstance(java.util.Locale);
method public int getNumericCode();
- method public java.lang.String getSymbol();
- method public java.lang.String getSymbol(java.util.Locale);
+ method public String getSymbol();
+ method public String getSymbol(java.util.Locale);
}
- public class Date implements java.lang.Cloneable java.lang.Comparable java.io.Serializable {
+ public class Date implements java.lang.Cloneable java.lang.Comparable<java.util.Date> java.io.Serializable {
ctor public Date();
ctor public Date(long);
- ctor public deprecated Date(int, int, int);
- ctor public deprecated Date(int, int, int, int, int);
- ctor public deprecated Date(int, int, int, int, int, int);
- ctor public deprecated Date(java.lang.String);
- method public static deprecated long UTC(int, int, int, int, int, int);
+ ctor @Deprecated public Date(int, int, int);
+ ctor @Deprecated public Date(int, int, int, int, int);
+ ctor @Deprecated public Date(int, int, int, int, int, int);
+ ctor @Deprecated public Date(String);
+ method @Deprecated public static long UTC(int, int, int, int, int, int);
method public boolean after(java.util.Date);
method public boolean before(java.util.Date);
- method public java.lang.Object clone();
+ method public Object clone();
method public int compareTo(java.util.Date);
method public static java.util.Date from(java.time.Instant);
- method public deprecated int getDate();
- method public deprecated int getDay();
- method public deprecated int getHours();
- method public deprecated int getMinutes();
- method public deprecated int getMonth();
- method public deprecated int getSeconds();
+ method @Deprecated public int getDate();
+ method @Deprecated public int getDay();
+ method @Deprecated public int getHours();
+ method @Deprecated public int getMinutes();
+ method @Deprecated public int getMonth();
+ method @Deprecated public int getSeconds();
method public long getTime();
- method public deprecated int getTimezoneOffset();
- method public deprecated int getYear();
- method public static deprecated long parse(java.lang.String);
- method public deprecated void setDate(int);
- method public deprecated void setHours(int);
- method public deprecated void setMinutes(int);
- method public deprecated void setMonth(int);
- method public deprecated void setSeconds(int);
+ method @Deprecated public int getTimezoneOffset();
+ method @Deprecated public int getYear();
+ method @Deprecated public static long parse(String);
+ method @Deprecated public void setDate(int);
+ method @Deprecated public void setHours(int);
+ method @Deprecated public void setMinutes(int);
+ method @Deprecated public void setMonth(int);
+ method @Deprecated public void setSeconds(int);
method public void setTime(long);
- method public deprecated void setYear(int);
- method public deprecated java.lang.String toGMTString();
+ method @Deprecated public void setYear(int);
+ method @Deprecated public String toGMTString();
method public java.time.Instant toInstant();
- method public deprecated java.lang.String toLocaleString();
- }
-
- public abstract interface Deque<E> implements java.util.Queue {
- method public abstract void addFirst(E);
- method public abstract void addLast(E);
- method public abstract java.util.Iterator<E> descendingIterator();
- method public abstract E getFirst();
- method public abstract E getLast();
- method public abstract boolean offerFirst(E);
- method public abstract boolean offerLast(E);
- method public abstract E peekFirst();
- method public abstract E peekLast();
- method public abstract E pollFirst();
- method public abstract E pollLast();
- method public abstract E pop();
- method public abstract void push(E);
- method public abstract E removeFirst();
- method public abstract boolean removeFirstOccurrence(java.lang.Object);
- method public abstract E removeLast();
- method public abstract boolean removeLastOccurrence(java.lang.Object);
+ method @Deprecated public String toLocaleString();
+ }
+
+ public interface Deque<E> extends java.util.Queue<E> {
+ method public void addFirst(E);
+ method public void addLast(E);
+ method @NonNull public java.util.Iterator<E> descendingIterator();
+ method public E getFirst();
+ method public E getLast();
+ method public boolean offerFirst(E);
+ method public boolean offerLast(E);
+ method @Nullable public E peekFirst();
+ method @Nullable public E peekLast();
+ method @Nullable public E pollFirst();
+ method @Nullable public E pollLast();
+ method public E pop();
+ method public void push(E);
+ method public E removeFirst();
+ method public boolean removeFirstOccurrence(@Nullable Object);
+ method public E removeLast();
+ method public boolean removeLastOccurrence(@Nullable Object);
}
public abstract class Dictionary<K, V> {
ctor public Dictionary();
method public abstract java.util.Enumeration<V> elements();
- method public abstract V get(java.lang.Object);
+ method public abstract V get(Object);
method public abstract boolean isEmpty();
method public abstract java.util.Enumeration<K> keys();
method public abstract V put(K, V);
- method public abstract V remove(java.lang.Object);
+ method public abstract V remove(Object);
method public abstract int size();
}
@@ -69086,44 +69272,44 @@ package java.util {
}
public class DuplicateFormatFlagsException extends java.util.IllegalFormatException {
- ctor public DuplicateFormatFlagsException(java.lang.String);
- method public java.lang.String getFlags();
+ ctor public DuplicateFormatFlagsException(String);
+ method public String getFlags();
}
public class EmptyStackException extends java.lang.RuntimeException {
ctor public EmptyStackException();
}
- public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
- ctor public EnumMap(java.lang.Class<K>);
- ctor public EnumMap(java.util.EnumMap<K, ? extends V>);
- ctor public EnumMap(java.util.Map<K, ? extends V>);
- method public java.util.EnumMap<K, V> clone();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.io.Serializable {
+ ctor public EnumMap(Class<K>);
+ ctor public EnumMap(java.util.EnumMap<K,? extends V>);
+ ctor public EnumMap(java.util.Map<K,? extends V>);
+ method public java.util.EnumMap<K,V> clone();
+ method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
}
- public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
- method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>);
+ public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.io.Serializable {
+ method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(Class<E>);
method public java.util.EnumSet<E> clone();
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>);
- method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>);
+ method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(Class<E>);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E);
- method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
+ method @java.lang.SafeVarargs public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E);
}
- public abstract interface Enumeration<E> {
- method public abstract boolean hasMoreElements();
- method public abstract E nextElement();
+ public interface Enumeration<E> {
+ method public boolean hasMoreElements();
+ method public E nextElement();
}
- public abstract interface EventListener {
+ public interface EventListener {
}
public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener {
@@ -69132,19 +69318,19 @@ package java.util {
}
public class EventObject implements java.io.Serializable {
- ctor public EventObject(java.lang.Object);
- method public java.lang.Object getSource();
- field protected transient java.lang.Object source;
+ ctor public EventObject(Object);
+ method public Object getSource();
+ field protected transient Object source;
}
public class FormatFlagsConversionMismatchException extends java.util.IllegalFormatException {
- ctor public FormatFlagsConversionMismatchException(java.lang.String, char);
+ ctor public FormatFlagsConversionMismatchException(String, char);
method public char getConversion();
- method public java.lang.String getFlags();
+ method public String getFlags();
}
- public abstract interface Formattable {
- method public abstract void formatTo(java.util.Formatter, int, int, int);
+ public interface Formattable {
+ method public void formatTo(java.util.Formatter, int, int, int);
}
public class FormattableFlags {
@@ -69155,31 +69341,29 @@ package java.util {
public final class Formatter implements java.io.Closeable java.io.Flushable {
ctor public Formatter();
- ctor public Formatter(java.lang.Appendable);
+ ctor public Formatter(Appendable);
ctor public Formatter(java.util.Locale);
- ctor public Formatter(java.lang.Appendable, java.util.Locale);
- ctor public Formatter(java.lang.String) throws java.io.FileNotFoundException;
- ctor public Formatter(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
- ctor public Formatter(java.lang.String, java.lang.String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public Formatter(Appendable, java.util.Locale);
+ ctor public Formatter(String) throws java.io.FileNotFoundException;
+ ctor public Formatter(String, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public Formatter(String, String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public Formatter(java.io.File) throws java.io.FileNotFoundException;
- ctor public Formatter(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
- ctor public Formatter(java.io.File, java.lang.String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public Formatter(java.io.File, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ ctor public Formatter(java.io.File, String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public Formatter(java.io.PrintStream);
ctor public Formatter(java.io.OutputStream);
- ctor public Formatter(java.io.OutputStream, java.lang.String) throws java.io.UnsupportedEncodingException;
- ctor public Formatter(java.io.OutputStream, java.lang.String, java.util.Locale) throws java.io.UnsupportedEncodingException;
+ ctor public Formatter(java.io.OutputStream, String) throws java.io.UnsupportedEncodingException;
+ ctor public Formatter(java.io.OutputStream, String, java.util.Locale) throws java.io.UnsupportedEncodingException;
method public void close();
method public void flush();
- method public java.util.Formatter format(java.lang.String, java.lang.Object...);
- method public java.util.Formatter format(java.util.Locale, java.lang.String, java.lang.Object...);
+ method public java.util.Formatter format(String, java.lang.Object...);
+ method public java.util.Formatter format(java.util.Locale, String, java.lang.Object...);
method public java.io.IOException ioException();
method public java.util.Locale locale();
- method public java.lang.Appendable out();
+ method public Appendable out();
}
- public static final class Formatter.BigDecimalLayoutForm extends java.lang.Enum {
- method public static java.util.Formatter.BigDecimalLayoutForm valueOf(java.lang.String);
- method public static final java.util.Formatter.BigDecimalLayoutForm[] values();
+ public enum Formatter.BigDecimalLayoutForm {
enum_constant public static final java.util.Formatter.BigDecimalLayoutForm DECIMAL_FLOAT;
enum_constant public static final java.util.Formatter.BigDecimalLayoutForm SCIENTIFIC;
}
@@ -69214,69 +69398,55 @@ package java.util {
field public static final int BC = 0; // 0x0
}
- public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+ public class HashMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
ctor public HashMap(int, float);
ctor public HashMap(int);
ctor public HashMap();
- ctor public HashMap(java.util.Map<? extends K, ? extends V>);
- method public java.lang.Object clone();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ ctor public HashMap(@NonNull java.util.Map<? extends K,? extends V>);
+ method @NonNull public Object clone();
+ method @NonNull public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
}
- public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+ public class HashSet<E> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.io.Serializable java.util.Set<E> {
ctor public HashSet();
- ctor public HashSet(java.util.Collection<? extends E>);
+ ctor public HashSet(@NonNull java.util.Collection<? extends E>);
ctor public HashSet(int, float);
ctor public HashSet(int);
- method public java.lang.Object clone();
- method public java.util.Iterator<E> iterator();
+ method @NonNull public Object clone();
+ method @NonNull public java.util.Iterator<E> iterator();
method public int size();
}
- public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
+ public class Hashtable<K, V> extends java.util.Dictionary<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
ctor public Hashtable(int, float);
ctor public Hashtable(int);
ctor public Hashtable();
- ctor public Hashtable(java.util.Map<? extends K, ? extends V>);
- method public synchronized void clear();
- method public synchronized java.lang.Object clone();
- method public synchronized V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public synchronized V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public synchronized V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public synchronized boolean contains(java.lang.Object);
- method public synchronized boolean containsKey(java.lang.Object);
- method public boolean containsValue(java.lang.Object);
- method public synchronized java.util.Enumeration<V> elements();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public synchronized boolean equals(java.lang.Object);
- method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public synchronized V get(java.lang.Object);
- method public synchronized V getOrDefault(java.lang.Object, V);
- method public synchronized int hashCode();
- method public synchronized boolean isEmpty();
+ ctor public Hashtable(java.util.Map<? extends K,? extends V>);
+ method public void clear();
+ method public Object clone();
+ method public boolean contains(Object);
+ method public boolean containsKey(Object);
+ method public boolean containsValue(Object);
+ method public java.util.Enumeration<V> elements();
+ method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method public V get(Object);
+ method public boolean isEmpty();
method public java.util.Set<K> keySet();
- method public synchronized java.util.Enumeration<K> keys();
- method public synchronized V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public synchronized V put(K, V);
- method public synchronized void putAll(java.util.Map<? extends K, ? extends V>);
- method public synchronized V putIfAbsent(K, V);
+ method public java.util.Enumeration<K> keys();
+ method public V put(K, V);
+ method public void putAll(java.util.Map<? extends K,? extends V>);
method protected void rehash();
- method public synchronized V remove(java.lang.Object);
- method public synchronized boolean remove(java.lang.Object, java.lang.Object);
- method public synchronized boolean replace(K, V, V);
- method public synchronized V replace(K, V);
- method public synchronized void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public synchronized int size();
- method public synchronized java.lang.String toString();
+ method public V remove(Object);
+ method public int size();
method public java.util.Collection<V> values();
}
- public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+ public class IdentityHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
ctor public IdentityHashMap();
ctor public IdentityHashMap(int);
- ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
- method public java.lang.Object clone();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ ctor public IdentityHashMap(java.util.Map<? extends K,? extends V>);
+ method public Object clone();
+ method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -69285,8 +69455,8 @@ package java.util {
}
public class IllegalFormatConversionException extends java.util.IllegalFormatException {
- ctor public IllegalFormatConversionException(char, java.lang.Class<?>);
- method public java.lang.Class<?> getArgumentClass();
+ ctor public IllegalFormatConversionException(char, Class<?>);
+ method public Class<?> getArgumentClass();
method public char getConversion();
}
@@ -69294,8 +69464,8 @@ package java.util {
}
public class IllegalFormatFlagsException extends java.util.IllegalFormatException {
- ctor public IllegalFormatFlagsException(java.lang.String);
- method public java.lang.String getFlags();
+ ctor public IllegalFormatFlagsException(String);
+ method public String getFlags();
}
public class IllegalFormatPrecisionException extends java.util.IllegalFormatException {
@@ -69310,14 +69480,14 @@ package java.util {
public class IllformedLocaleException extends java.lang.RuntimeException {
ctor public IllformedLocaleException();
- ctor public IllformedLocaleException(java.lang.String);
- ctor public IllformedLocaleException(java.lang.String, int);
+ ctor public IllformedLocaleException(String);
+ ctor public IllformedLocaleException(String, int);
method public int getErrorIndex();
}
public class InputMismatchException extends java.util.NoSuchElementException {
ctor public InputMismatchException();
- ctor public InputMismatchException(java.lang.String);
+ ctor public InputMismatchException(String);
}
public class IntSummaryStatistics implements java.util.function.IntConsumer {
@@ -69332,190 +69502,186 @@ package java.util {
}
public class InvalidPropertiesFormatException extends java.io.IOException {
- ctor public InvalidPropertiesFormatException(java.lang.Throwable);
- ctor public InvalidPropertiesFormatException(java.lang.String);
+ ctor public InvalidPropertiesFormatException(Throwable);
+ ctor public InvalidPropertiesFormatException(String);
}
- public abstract interface Iterator<E> {
- method public default void forEachRemaining(java.util.function.Consumer<? super E>);
- method public abstract boolean hasNext();
- method public abstract E next();
+ public interface Iterator<E> {
+ method public default void forEachRemaining(@NonNull java.util.function.Consumer<? super E>);
+ method public boolean hasNext();
+ method public E next();
method public default void remove();
}
- public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map {
+ public class LinkedHashMap<K, V> extends java.util.HashMap<K,V> implements java.util.Map<K,V> {
ctor public LinkedHashMap(int, float);
ctor public LinkedHashMap(int);
ctor public LinkedHashMap();
- ctor public LinkedHashMap(java.util.Map<? extends K, ? extends V>);
+ ctor public LinkedHashMap(java.util.Map<? extends K,? extends V>);
ctor public LinkedHashMap(int, float, boolean);
- method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>);
+ method protected boolean removeEldestEntry(java.util.Map.Entry<K,V>);
}
- public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+ public class LinkedHashSet<E> extends java.util.HashSet<E> implements java.lang.Cloneable java.io.Serializable java.util.Set<E> {
ctor public LinkedHashSet(int, float);
ctor public LinkedHashSet(int);
ctor public LinkedHashSet();
ctor public LinkedHashSet(java.util.Collection<? extends E>);
}
- public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
+ public class LinkedList<E> extends java.util.AbstractSequentialList<E> implements java.lang.Cloneable java.util.Deque<E> java.util.List<E> java.io.Serializable {
ctor public LinkedList();
- ctor public LinkedList(java.util.Collection<? extends E>);
+ ctor public LinkedList(@NonNull java.util.Collection<? extends E>);
method public void addFirst(E);
method public void addLast(E);
- method public java.lang.Object clone();
- method public java.util.Iterator<E> descendingIterator();
+ method @NonNull public Object clone();
+ method @NonNull public java.util.Iterator<E> descendingIterator();
method public E element();
method public E getFirst();
method public E getLast();
method public boolean offer(E);
method public boolean offerFirst(E);
method public boolean offerLast(E);
- method public E peek();
- method public E peekFirst();
- method public E peekLast();
- method public E poll();
- method public E pollFirst();
- method public E pollLast();
+ method @Nullable public E peek();
+ method @Nullable public E peekFirst();
+ method @Nullable public E peekLast();
+ method @Nullable public E poll();
+ method @Nullable public E pollFirst();
+ method @Nullable public E pollLast();
method public E pop();
method public void push(E);
method public E remove();
method public E removeFirst();
- method public boolean removeFirstOccurrence(java.lang.Object);
+ method public boolean removeFirstOccurrence(@Nullable Object);
method public E removeLast();
- method public boolean removeLastOccurrence(java.lang.Object);
+ method public boolean removeLastOccurrence(@Nullable Object);
method public int size();
}
- public abstract interface List<E> implements java.util.Collection {
- method public abstract void add(int, E);
- method public abstract boolean addAll(int, java.util.Collection<? extends E>);
- method public abstract E get(int);
- method public abstract int indexOf(java.lang.Object);
- method public abstract int lastIndexOf(java.lang.Object);
- method public abstract java.util.ListIterator<E> listIterator();
- method public abstract java.util.ListIterator<E> listIterator(int);
- method public abstract E remove(int);
- method public default void replaceAll(java.util.function.UnaryOperator<E>);
- method public abstract E set(int, E);
- method public default void sort(java.util.Comparator<? super E>);
- method public abstract java.util.List<E> subList(int, int);
+ public interface List<E> extends java.util.Collection<E> {
+ method public void add(int, E);
+ method public boolean addAll(int, @NonNull java.util.Collection<? extends E>);
+ method public E get(int);
+ method public int indexOf(@Nullable Object);
+ method public int lastIndexOf(@Nullable Object);
+ method @NonNull public java.util.ListIterator<E> listIterator();
+ method @NonNull public java.util.ListIterator<E> listIterator(int);
+ method public E remove(int);
+ method public default void replaceAll(@NonNull java.util.function.UnaryOperator<E>);
+ method public E set(int, E);
+ method public default void sort(@Nullable java.util.Comparator<? super E>);
+ method @NonNull public java.util.List<E> subList(int, int);
}
- public abstract interface ListIterator<E> implements java.util.Iterator {
- method public abstract void add(E);
- method public abstract boolean hasPrevious();
- method public abstract int nextIndex();
- method public abstract E previous();
- method public abstract int previousIndex();
- method public abstract void remove();
- method public abstract void set(E);
+ public interface ListIterator<E> extends java.util.Iterator<E> {
+ method public void add(E);
+ method public boolean hasPrevious();
+ method public int nextIndex();
+ method public E previous();
+ method public int previousIndex();
+ method public void remove();
+ method public void set(E);
}
public abstract class ListResourceBundle extends java.util.ResourceBundle {
ctor public ListResourceBundle();
- method protected abstract java.lang.Object[][] getContents();
+ method protected abstract Object[][] getContents();
method public java.util.Enumeration<java.lang.String> getKeys();
- method public final java.lang.Object handleGetObject(java.lang.String);
+ method public final Object handleGetObject(String);
}
public final class Locale implements java.lang.Cloneable java.io.Serializable {
- ctor public Locale(java.lang.String, java.lang.String, java.lang.String);
- ctor public Locale(java.lang.String, java.lang.String);
- ctor public Locale(java.lang.String);
- method public java.lang.Object clone();
- method public static java.util.List<java.util.Locale> filter(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.util.Locale>, java.util.Locale.FilteringMode);
- method public static java.util.List<java.util.Locale> filter(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.util.Locale>);
- method public static java.util.List<java.lang.String> filterTags(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.lang.String>, java.util.Locale.FilteringMode);
- method public static java.util.List<java.lang.String> filterTags(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.lang.String>);
- method public static java.util.Locale forLanguageTag(java.lang.String);
+ ctor public Locale(@NonNull String, @NonNull String, @NonNull String);
+ ctor public Locale(@NonNull String, @NonNull String);
+ ctor public Locale(@NonNull String);
+ method @NonNull public Object clone();
+ method @NonNull public static java.util.List<java.util.Locale> filter(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.util.Locale>, @NonNull java.util.Locale.FilteringMode);
+ method @NonNull public static java.util.List<java.util.Locale> filter(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.util.Locale>);
+ method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>, @NonNull java.util.Locale.FilteringMode);
+ method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>);
+ method @NonNull public static java.util.Locale forLanguageTag(@NonNull String);
method public static java.util.Locale[] getAvailableLocales();
- method public java.lang.String getCountry();
- method public static java.util.Locale getDefault();
- method public static java.util.Locale getDefault(java.util.Locale.Category);
- method public java.lang.String getDisplayCountry();
- method public java.lang.String getDisplayCountry(java.util.Locale);
- method public java.lang.String getDisplayLanguage();
- method public java.lang.String getDisplayLanguage(java.util.Locale);
- method public java.lang.String getDisplayName();
- method public java.lang.String getDisplayName(java.util.Locale);
- method public java.lang.String getDisplayScript();
- method public java.lang.String getDisplayScript(java.util.Locale);
- method public java.lang.String getDisplayVariant();
- method public java.lang.String getDisplayVariant(java.util.Locale);
- method public java.lang.String getExtension(char);
- method public java.util.Set<java.lang.Character> getExtensionKeys();
- method public java.lang.String getISO3Country() throws java.util.MissingResourceException;
- method public java.lang.String getISO3Language() throws java.util.MissingResourceException;
- method public static java.lang.String[] getISOCountries();
- method public static java.lang.String[] getISOLanguages();
- method public java.lang.String getLanguage();
- method public java.lang.String getScript();
- method public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
- method public java.util.Set<java.lang.String> getUnicodeLocaleKeys();
- method public java.lang.String getUnicodeLocaleType(java.lang.String);
- method public java.lang.String getVariant();
+ method @NonNull public String getCountry();
+ method @NonNull public static java.util.Locale getDefault();
+ method @NonNull public static java.util.Locale getDefault(@NonNull java.util.Locale.Category);
+ method @NonNull public String getDisplayCountry();
+ method @NonNull public String getDisplayCountry(@NonNull java.util.Locale);
+ method @NonNull public String getDisplayLanguage();
+ method @NonNull public String getDisplayLanguage(@NonNull java.util.Locale);
+ method @NonNull public String getDisplayName();
+ method @NonNull public String getDisplayName(@NonNull java.util.Locale);
+ method @NonNull public String getDisplayScript();
+ method @NonNull public String getDisplayScript(@NonNull java.util.Locale);
+ method @NonNull public String getDisplayVariant();
+ method @NonNull public String getDisplayVariant(@NonNull java.util.Locale);
+ method @Nullable public String getExtension(char);
+ method @NonNull public java.util.Set<java.lang.Character> getExtensionKeys();
+ method @NonNull public String getISO3Country() throws java.util.MissingResourceException;
+ method @NonNull public String getISO3Language() throws java.util.MissingResourceException;
+ method public static String[] getISOCountries();
+ method public static String[] getISOLanguages();
+ method @NonNull public String getLanguage();
+ method @NonNull public String getScript();
+ method @NonNull public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
+ method @NonNull public java.util.Set<java.lang.String> getUnicodeLocaleKeys();
+ method @Nullable public String getUnicodeLocaleType(@NonNull String);
+ method @NonNull public String getVariant();
method public boolean hasExtensions();
- method public static java.util.Locale lookup(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.util.Locale>);
- method public static java.lang.String lookupTag(java.util.List<java.util.Locale.LanguageRange>, java.util.Collection<java.lang.String>);
- method public static synchronized void setDefault(java.util.Locale);
- method public static synchronized void setDefault(java.util.Locale.Category, java.util.Locale);
- method public java.util.Locale stripExtensions();
- method public java.lang.String toLanguageTag();
- field public static final java.util.Locale CANADA;
- field public static final java.util.Locale CANADA_FRENCH;
- field public static final java.util.Locale CHINA;
- field public static final java.util.Locale CHINESE;
- field public static final java.util.Locale ENGLISH;
- field public static final java.util.Locale FRANCE;
- field public static final java.util.Locale FRENCH;
- field public static final java.util.Locale GERMAN;
- field public static final java.util.Locale GERMANY;
- field public static final java.util.Locale ITALIAN;
- field public static final java.util.Locale ITALY;
- field public static final java.util.Locale JAPAN;
- field public static final java.util.Locale JAPANESE;
- field public static final java.util.Locale KOREA;
- field public static final java.util.Locale KOREAN;
- field public static final java.util.Locale PRC;
+ method @Nullable public static java.util.Locale lookup(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.util.Locale>);
+ method @Nullable public static String lookupTag(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>);
+ method public static void setDefault(@NonNull java.util.Locale);
+ method public static void setDefault(@NonNull java.util.Locale.Category, @NonNull java.util.Locale);
+ method @NonNull public java.util.Locale stripExtensions();
+ method @NonNull public String toLanguageTag();
+ field @NonNull public static final java.util.Locale CANADA;
+ field @NonNull public static final java.util.Locale CANADA_FRENCH;
+ field @NonNull public static final java.util.Locale CHINA;
+ field @NonNull public static final java.util.Locale CHINESE;
+ field @NonNull public static final java.util.Locale ENGLISH;
+ field @NonNull public static final java.util.Locale FRANCE;
+ field @NonNull public static final java.util.Locale FRENCH;
+ field @NonNull public static final java.util.Locale GERMAN;
+ field @NonNull public static final java.util.Locale GERMANY;
+ field @NonNull public static final java.util.Locale ITALIAN;
+ field @NonNull public static final java.util.Locale ITALY;
+ field @NonNull public static final java.util.Locale JAPAN;
+ field @NonNull public static final java.util.Locale JAPANESE;
+ field @NonNull public static final java.util.Locale KOREA;
+ field @NonNull public static final java.util.Locale KOREAN;
+ field @NonNull public static final java.util.Locale PRC;
field public static final char PRIVATE_USE_EXTENSION = 120; // 0x0078 'x'
- field public static final java.util.Locale ROOT;
- field public static final java.util.Locale SIMPLIFIED_CHINESE;
- field public static final java.util.Locale TAIWAN;
- field public static final java.util.Locale TRADITIONAL_CHINESE;
- field public static final java.util.Locale UK;
+ field @NonNull public static final java.util.Locale ROOT;
+ field @NonNull public static final java.util.Locale SIMPLIFIED_CHINESE;
+ field @NonNull public static final java.util.Locale TAIWAN;
+ field @NonNull public static final java.util.Locale TRADITIONAL_CHINESE;
+ field @NonNull public static final java.util.Locale UK;
field public static final char UNICODE_LOCALE_EXTENSION = 117; // 0x0075 'u'
- field public static final java.util.Locale US;
+ field @NonNull public static final java.util.Locale US;
}
public static final class Locale.Builder {
ctor public Locale.Builder();
- method public java.util.Locale.Builder addUnicodeLocaleAttribute(java.lang.String);
- method public java.util.Locale build();
- method public java.util.Locale.Builder clear();
- method public java.util.Locale.Builder clearExtensions();
- method public java.util.Locale.Builder removeUnicodeLocaleAttribute(java.lang.String);
- method public java.util.Locale.Builder setExtension(char, java.lang.String);
- method public java.util.Locale.Builder setLanguage(java.lang.String);
- method public java.util.Locale.Builder setLanguageTag(java.lang.String);
- method public java.util.Locale.Builder setLocale(java.util.Locale);
- method public java.util.Locale.Builder setRegion(java.lang.String);
- method public java.util.Locale.Builder setScript(java.lang.String);
- method public java.util.Locale.Builder setUnicodeLocaleKeyword(java.lang.String, java.lang.String);
- method public java.util.Locale.Builder setVariant(java.lang.String);
- }
-
- public static final class Locale.Category extends java.lang.Enum {
- method public static java.util.Locale.Category valueOf(java.lang.String);
- method public static final java.util.Locale.Category[] values();
+ method @NonNull public java.util.Locale.Builder addUnicodeLocaleAttribute(@NonNull String);
+ method @NonNull public java.util.Locale build();
+ method @NonNull public java.util.Locale.Builder clear();
+ method @NonNull public java.util.Locale.Builder clearExtensions();
+ method @NonNull public java.util.Locale.Builder removeUnicodeLocaleAttribute(@NonNull String);
+ method @NonNull public java.util.Locale.Builder setExtension(char, @Nullable String);
+ method @NonNull public java.util.Locale.Builder setLanguage(@Nullable String);
+ method @NonNull public java.util.Locale.Builder setLanguageTag(@NonNull String);
+ method @NonNull public java.util.Locale.Builder setLocale(@NonNull java.util.Locale);
+ method @NonNull public java.util.Locale.Builder setRegion(@Nullable String);
+ method @NonNull public java.util.Locale.Builder setScript(@Nullable String);
+ method @NonNull public java.util.Locale.Builder setUnicodeLocaleKeyword(@NonNull String, @Nullable String);
+ method @NonNull public java.util.Locale.Builder setVariant(@Nullable String);
+ }
+
+ public enum Locale.Category {
enum_constant public static final java.util.Locale.Category DISPLAY;
enum_constant public static final java.util.Locale.Category FORMAT;
}
- public static final class Locale.FilteringMode extends java.lang.Enum {
- method public static java.util.Locale.FilteringMode valueOf(java.lang.String);
- method public static final java.util.Locale.FilteringMode[] values();
+ public enum Locale.FilteringMode {
enum_constant public static final java.util.Locale.FilteringMode AUTOSELECT_FILTERING;
enum_constant public static final java.util.Locale.FilteringMode EXTENDED_FILTERING;
enum_constant public static final java.util.Locale.FilteringMode IGNORE_EXTENDED_RANGES;
@@ -69524,13 +69690,13 @@ package java.util {
}
public static final class Locale.LanguageRange {
- ctor public Locale.LanguageRange(java.lang.String);
- ctor public Locale.LanguageRange(java.lang.String, double);
- method public java.lang.String getRange();
+ ctor public Locale.LanguageRange(@NonNull String);
+ ctor public Locale.LanguageRange(@NonNull String, double);
+ method @NonNull public String getRange();
method public double getWeight();
- method public static java.util.List<java.util.Locale.LanguageRange> mapEquivalents(java.util.List<java.util.Locale.LanguageRange>, java.util.Map<java.lang.String, java.util.List<java.lang.String>>);
- method public static java.util.List<java.util.Locale.LanguageRange> parse(java.lang.String);
- method public static java.util.List<java.util.Locale.LanguageRange> parse(java.lang.String, java.util.Map<java.lang.String, java.util.List<java.lang.String>>);
+ method @NonNull public static java.util.List<java.util.Locale.LanguageRange> mapEquivalents(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
+ method @NonNull public static java.util.List<java.util.Locale.LanguageRange> parse(@NonNull String);
+ method @NonNull public static java.util.List<java.util.Locale.LanguageRange> parse(@NonNull String, @NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
field public static final double MAX_WEIGHT = 1.0;
field public static final double MIN_WEIGHT = 0.0;
}
@@ -69547,147 +69713,147 @@ package java.util {
method public final long getSum();
}
- public abstract interface Map<K, V> {
- method public abstract void clear();
- method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public default V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public abstract boolean containsKey(java.lang.Object);
- method public abstract boolean containsValue(java.lang.Object);
- method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public abstract boolean equals(java.lang.Object);
- method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public abstract V get(java.lang.Object);
- method public default V getOrDefault(java.lang.Object, V);
- method public abstract int hashCode();
- method public abstract boolean isEmpty();
- method public abstract java.util.Set<K> keySet();
- method public default V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public abstract V put(K, V);
- method public abstract void putAll(java.util.Map<? extends K, ? extends V>);
- method public default V putIfAbsent(K, V);
- method public abstract V remove(java.lang.Object);
- method public default boolean remove(java.lang.Object, java.lang.Object);
- method public default boolean replace(K, V, V);
- method public default V replace(K, V);
- method public default void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public abstract int size();
- method public abstract java.util.Collection<V> values();
+ public interface Map<K, V> {
+ method public void clear();
+ method @Nullable public default V compute(K, @NonNull java.util.function.BiFunction<? super K,? super V,? extends V>);
+ method @Nullable public default V computeIfAbsent(K, @NonNull java.util.function.Function<? super K,? extends V>);
+ method @Nullable public default V computeIfPresent(K, @NonNull java.util.function.BiFunction<? super K,? super V,? extends V>);
+ method public boolean containsKey(@Nullable Object);
+ method public boolean containsValue(@Nullable Object);
+ method @NonNull public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method public boolean equals(@Nullable Object);
+ method public default void forEach(@NonNull java.util.function.BiConsumer<? super K,? super V>);
+ method @Nullable public V get(@Nullable Object);
+ method @Nullable public default V getOrDefault(@Nullable Object, @Nullable V);
+ method public int hashCode();
+ method public boolean isEmpty();
+ method @NonNull public java.util.Set<K> keySet();
+ method @Nullable public default V merge(K, @NonNull V, @NonNull java.util.function.BiFunction<? super V,? super V,? extends V>);
+ method @Nullable public V put(K, V);
+ method public void putAll(@NonNull java.util.Map<? extends K,? extends V>);
+ method @Nullable public default V putIfAbsent(K, V);
+ method @Nullable public V remove(@Nullable Object);
+ method public default boolean remove(@Nullable Object, @Nullable Object);
+ method public default boolean replace(K, @Nullable V, V);
+ method @Nullable public default V replace(K, V);
+ method public default void replaceAll(@NonNull java.util.function.BiFunction<? super K,? super V,? extends V>);
+ method public int size();
+ method @NonNull public java.util.Collection<V> values();
}
- public static abstract interface Map.Entry<K, V> {
- method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
- method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
- method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
- method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
- method public abstract boolean equals(java.lang.Object);
- method public abstract K getKey();
- method public abstract V getValue();
- method public abstract int hashCode();
- method public abstract V setValue(V);
+ public static interface Map.Entry<K, V> {
+ method @NonNull public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K,V>> comparingByKey();
+ method @NonNull public static <K, V> java.util.Comparator<java.util.Map.Entry<K,V>> comparingByKey(@NonNull java.util.Comparator<? super K>);
+ method @NonNull public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K,V>> comparingByValue();
+ method @NonNull public static <K, V> java.util.Comparator<java.util.Map.Entry<K,V>> comparingByValue(@NonNull java.util.Comparator<? super V>);
+ method public boolean equals(@Nullable Object);
+ method public K getKey();
+ method public V getValue();
+ method public int hashCode();
+ method public V setValue(V);
}
public class MissingFormatArgumentException extends java.util.IllegalFormatException {
- ctor public MissingFormatArgumentException(java.lang.String);
- method public java.lang.String getFormatSpecifier();
+ ctor public MissingFormatArgumentException(String);
+ method public String getFormatSpecifier();
}
public class MissingFormatWidthException extends java.util.IllegalFormatException {
- ctor public MissingFormatWidthException(java.lang.String);
- method public java.lang.String getFormatSpecifier();
+ ctor public MissingFormatWidthException(String);
+ method public String getFormatSpecifier();
}
public class MissingResourceException extends java.lang.RuntimeException {
- ctor public MissingResourceException(java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String getClassName();
- method public java.lang.String getKey();
- }
-
- public abstract interface NavigableMap<K, V> implements java.util.SortedMap {
- method public abstract java.util.Map.Entry<K, V> ceilingEntry(K);
- method public abstract K ceilingKey(K);
- method public abstract java.util.NavigableSet<K> descendingKeySet();
- method public abstract java.util.NavigableMap<K, V> descendingMap();
- method public abstract java.util.Map.Entry<K, V> firstEntry();
- method public abstract java.util.Map.Entry<K, V> floorEntry(K);
- method public abstract K floorKey(K);
- method public abstract java.util.NavigableMap<K, V> headMap(K, boolean);
- method public abstract java.util.Map.Entry<K, V> higherEntry(K);
- method public abstract K higherKey(K);
- method public abstract java.util.Map.Entry<K, V> lastEntry();
- method public abstract java.util.Map.Entry<K, V> lowerEntry(K);
- method public abstract K lowerKey(K);
- method public abstract java.util.NavigableSet<K> navigableKeySet();
- method public abstract java.util.Map.Entry<K, V> pollFirstEntry();
- method public abstract java.util.Map.Entry<K, V> pollLastEntry();
- method public abstract java.util.NavigableMap<K, V> subMap(K, boolean, K, boolean);
- method public abstract java.util.NavigableMap<K, V> tailMap(K, boolean);
- }
-
- public abstract interface NavigableSet<E> implements java.util.SortedSet {
- method public abstract E ceiling(E);
- method public abstract java.util.Iterator<E> descendingIterator();
- method public abstract java.util.NavigableSet<E> descendingSet();
- method public abstract E floor(E);
- method public abstract java.util.NavigableSet<E> headSet(E, boolean);
- method public abstract E higher(E);
- method public abstract E lower(E);
- method public abstract E pollFirst();
- method public abstract E pollLast();
- method public abstract java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
- method public abstract java.util.NavigableSet<E> tailSet(E, boolean);
+ ctor public MissingResourceException(String, String, String);
+ method public String getClassName();
+ method public String getKey();
+ }
+
+ public interface NavigableMap<K, V> extends java.util.SortedMap<K,V> {
+ method @Nullable public java.util.Map.Entry<K,V> ceilingEntry(K);
+ method @Nullable public K ceilingKey(K);
+ method @NonNull public java.util.NavigableSet<K> descendingKeySet();
+ method @NonNull public java.util.NavigableMap<K,V> descendingMap();
+ method @Nullable public java.util.Map.Entry<K,V> firstEntry();
+ method @Nullable public java.util.Map.Entry<K,V> floorEntry(K);
+ method @Nullable public K floorKey(K);
+ method @NonNull public java.util.NavigableMap<K,V> headMap(K, boolean);
+ method @Nullable public java.util.Map.Entry<K,V> higherEntry(K);
+ method @Nullable public K higherKey(K);
+ method @Nullable public java.util.Map.Entry<K,V> lastEntry();
+ method @Nullable public java.util.Map.Entry<K,V> lowerEntry(K);
+ method @Nullable public K lowerKey(K);
+ method @NonNull public java.util.NavigableSet<K> navigableKeySet();
+ method @Nullable public java.util.Map.Entry<K,V> pollFirstEntry();
+ method @Nullable public java.util.Map.Entry<K,V> pollLastEntry();
+ method @NonNull public java.util.NavigableMap<K,V> subMap(K, boolean, K, boolean);
+ method @NonNull public java.util.NavigableMap<K,V> tailMap(K, boolean);
+ }
+
+ public interface NavigableSet<E> extends java.util.SortedSet<E> {
+ method public E ceiling(E);
+ method public java.util.Iterator<E> descendingIterator();
+ method public java.util.NavigableSet<E> descendingSet();
+ method public E floor(E);
+ method public java.util.NavigableSet<E> headSet(E, boolean);
+ method public E higher(E);
+ method public E lower(E);
+ method public E pollFirst();
+ method public E pollLast();
+ method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
+ method public java.util.NavigableSet<E> tailSet(E, boolean);
}
public class NoSuchElementException extends java.lang.RuntimeException {
ctor public NoSuchElementException();
- ctor public NoSuchElementException(java.lang.String);
+ ctor public NoSuchElementException(String);
}
public final class Objects {
- method public static <T> int compare(T, T, java.util.Comparator<? super T>);
- method public static boolean deepEquals(java.lang.Object, java.lang.Object);
- method public static boolean equals(java.lang.Object, java.lang.Object);
+ method public static <T> int compare(T, T, @NonNull java.util.Comparator<? super T>);
+ method public static boolean deepEquals(@Nullable Object, @Nullable Object);
+ method public static boolean equals(@Nullable Object, @Nullable Object);
method public static int hash(java.lang.Object...);
- method public static int hashCode(java.lang.Object);
- method public static boolean isNull(java.lang.Object);
- method public static boolean nonNull(java.lang.Object);
- method public static <T> T requireNonNull(T);
- method public static <T> T requireNonNull(T, java.lang.String);
- method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
- method public static java.lang.String toString(java.lang.Object);
- method public static java.lang.String toString(java.lang.Object, java.lang.String);
+ method public static int hashCode(@Nullable Object);
+ method public static boolean isNull(@Nullable Object);
+ method public static boolean nonNull(@Nullable Object);
+ method @NonNull public static <T> T requireNonNull(@Nullable T);
+ method @NonNull public static <T> T requireNonNull(@Nullable T, @NonNull String);
+ method @NonNull public static <T> T requireNonNull(@Nullable T, @NonNull java.util.function.Supplier<java.lang.String>);
+ method @NonNull public static String toString(@Nullable Object);
+ method @NonNull public static String toString(@Nullable Object, @NonNull String);
}
public class Observable {
ctor public Observable();
- method public synchronized void addObserver(java.util.Observer);
- method protected synchronized void clearChanged();
- method public synchronized int countObservers();
- method public synchronized void deleteObserver(java.util.Observer);
- method public synchronized void deleteObservers();
- method public synchronized boolean hasChanged();
+ method public void addObserver(java.util.Observer);
+ method protected void clearChanged();
+ method public int countObservers();
+ method public void deleteObserver(java.util.Observer);
+ method public void deleteObservers();
+ method public boolean hasChanged();
method public void notifyObservers();
- method public void notifyObservers(java.lang.Object);
- method protected synchronized void setChanged();
+ method public void notifyObservers(Object);
+ method protected void setChanged();
}
- public abstract interface Observer {
- method public abstract void update(java.util.Observable, java.lang.Object);
+ public interface Observer {
+ method public void update(java.util.Observable, Object);
}
public final class Optional<T> {
method public static <T> java.util.Optional<T> empty();
method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>);
- method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
+ method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T,java.util.Optional<U>>);
method public T get();
method public void ifPresent(java.util.function.Consumer<? super T>);
method public boolean isPresent();
- method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
+ method public <U> java.util.Optional<U> map(java.util.function.Function<? super T,? extends U>);
method public static <T> java.util.Optional<T> of(T);
method public static <T> java.util.Optional<T> ofNullable(T);
method public T orElse(T);
method public T orElseGet(java.util.function.Supplier<? extends T>);
- method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
+ method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws X;
}
public final class OptionalDouble {
@@ -69698,7 +69864,7 @@ package java.util {
method public static java.util.OptionalDouble of(double);
method public double orElse(double);
method public double orElseGet(java.util.function.DoubleSupplier);
- method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+ method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws X;
}
public final class OptionalInt {
@@ -69709,7 +69875,7 @@ package java.util {
method public static java.util.OptionalInt of(int);
method public int orElse(int);
method public int orElseGet(java.util.function.IntSupplier);
- method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+ method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws X;
}
public final class OptionalLong {
@@ -69720,35 +69886,35 @@ package java.util {
method public static java.util.OptionalLong of(long);
method public long orElse(long);
method public long orElseGet(java.util.function.LongSupplier);
- method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+ method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws X;
}
- public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator {
- method public abstract void forEachRemaining(T_CONS);
+ public interface PrimitiveIterator<T, T_CONS> extends java.util.Iterator<T> {
+ method public void forEachRemaining(T_CONS);
}
- public static abstract interface PrimitiveIterator.OfDouble implements java.util.PrimitiveIterator {
+ public static interface PrimitiveIterator.OfDouble extends java.util.PrimitiveIterator<java.lang.Double,java.util.function.DoubleConsumer> {
method public default void forEachRemaining(java.util.function.DoubleConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Double>);
- method public default java.lang.Double next();
- method public abstract double nextDouble();
+ method public default Double next();
+ method public double nextDouble();
}
- public static abstract interface PrimitiveIterator.OfInt implements java.util.PrimitiveIterator {
+ public static interface PrimitiveIterator.OfInt extends java.util.PrimitiveIterator<java.lang.Integer,java.util.function.IntConsumer> {
method public default void forEachRemaining(java.util.function.IntConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Integer>);
- method public default java.lang.Integer next();
- method public abstract int nextInt();
+ method public default Integer next();
+ method public int nextInt();
}
- public static abstract interface PrimitiveIterator.OfLong implements java.util.PrimitiveIterator {
+ public static interface PrimitiveIterator.OfLong extends java.util.PrimitiveIterator<java.lang.Long,java.util.function.LongConsumer> {
method public default void forEachRemaining(java.util.function.LongConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Long>);
- method public default java.lang.Long next();
- method public abstract long nextLong();
+ method public default Long next();
+ method public long nextLong();
}
- public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable {
+ public class PriorityQueue<E> extends java.util.AbstractQueue<E> implements java.io.Serializable {
ctor public PriorityQueue();
ctor public PriorityQueue(int);
ctor public PriorityQueue(java.util.Comparator<? super E>);
@@ -69765,44 +69931,44 @@ package java.util {
method public final java.util.Spliterator<E> spliterator();
}
- public class Properties extends java.util.Hashtable {
+ public class Properties extends java.util.Hashtable<java.lang.Object,java.lang.Object> {
ctor public Properties();
ctor public Properties(java.util.Properties);
- method public java.lang.String getProperty(java.lang.String);
- method public java.lang.String getProperty(java.lang.String, java.lang.String);
+ method public String getProperty(String);
+ method public String getProperty(String, String);
method public void list(java.io.PrintStream);
method public void list(java.io.PrintWriter);
- method public synchronized void load(java.io.Reader) throws java.io.IOException;
- method public synchronized void load(java.io.InputStream) throws java.io.IOException;
- method public synchronized void loadFromXML(java.io.InputStream) throws java.io.IOException, java.util.InvalidPropertiesFormatException;
+ method public void load(java.io.Reader) throws java.io.IOException;
+ method public void load(java.io.InputStream) throws java.io.IOException;
+ method public void loadFromXML(java.io.InputStream) throws java.io.IOException, java.util.InvalidPropertiesFormatException;
method public java.util.Enumeration<?> propertyNames();
- method public deprecated void save(java.io.OutputStream, java.lang.String);
- method public synchronized java.lang.Object setProperty(java.lang.String, java.lang.String);
- method public void store(java.io.Writer, java.lang.String) throws java.io.IOException;
- method public void store(java.io.OutputStream, java.lang.String) throws java.io.IOException;
- method public void storeToXML(java.io.OutputStream, java.lang.String) throws java.io.IOException;
- method public void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String) throws java.io.IOException;
+ method @Deprecated public void save(java.io.OutputStream, String);
+ method public Object setProperty(String, String);
+ method public void store(java.io.Writer, String) throws java.io.IOException;
+ method public void store(java.io.OutputStream, String) throws java.io.IOException;
+ method public void storeToXML(java.io.OutputStream, String) throws java.io.IOException;
+ method public void storeToXML(java.io.OutputStream, String, String) throws java.io.IOException;
method public java.util.Set<java.lang.String> stringPropertyNames();
field protected java.util.Properties defaults;
}
public final class PropertyPermission extends java.security.BasicPermission {
- ctor public PropertyPermission(java.lang.String, java.lang.String);
+ ctor public PropertyPermission(String, String);
}
public class PropertyResourceBundle extends java.util.ResourceBundle {
ctor public PropertyResourceBundle(java.io.InputStream) throws java.io.IOException;
ctor public PropertyResourceBundle(java.io.Reader) throws java.io.IOException;
method public java.util.Enumeration<java.lang.String> getKeys();
- method public java.lang.Object handleGetObject(java.lang.String);
+ method public Object handleGetObject(String);
}
- public abstract interface Queue<E> implements java.util.Collection {
- method public abstract E element();
- method public abstract boolean offer(E);
- method public abstract E peek();
- method public abstract E poll();
- method public abstract E remove();
+ public interface Queue<E> extends java.util.Collection<E> {
+ method public E element();
+ method public boolean offer(E);
+ method @Nullable public E peek();
+ method @Nullable public E poll();
+ method public E remove();
}
public class Random implements java.io.Serializable {
@@ -69825,34 +69991,34 @@ package java.util {
method public void nextBytes(byte[]);
method public double nextDouble();
method public float nextFloat();
- method public synchronized double nextGaussian();
+ method public double nextGaussian();
method public int nextInt();
method public int nextInt(int);
method public long nextLong();
- method public synchronized void setSeed(long);
+ method public void setSeed(long);
}
- public abstract interface RandomAccess {
+ public interface RandomAccess {
}
public abstract class ResourceBundle {
ctor public ResourceBundle();
method public static final void clearCache();
- method public static final void clearCache(java.lang.ClassLoader);
- method public boolean containsKey(java.lang.String);
- method public java.lang.String getBaseBundleName();
- method public static final java.util.ResourceBundle getBundle(java.lang.String);
- method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control);
- method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale);
- method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale, java.util.ResourceBundle.Control);
- method public static java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader);
- method public static java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader, java.util.ResourceBundle.Control);
+ method public static final void clearCache(ClassLoader);
+ method public boolean containsKey(String);
+ method public String getBaseBundleName();
+ method public static final java.util.ResourceBundle getBundle(String);
+ method public static final java.util.ResourceBundle getBundle(String, java.util.ResourceBundle.Control);
+ method public static final java.util.ResourceBundle getBundle(String, java.util.Locale);
+ method public static final java.util.ResourceBundle getBundle(String, java.util.Locale, java.util.ResourceBundle.Control);
+ method public static java.util.ResourceBundle getBundle(String, java.util.Locale, ClassLoader);
+ method public static java.util.ResourceBundle getBundle(String, java.util.Locale, ClassLoader, java.util.ResourceBundle.Control);
method public abstract java.util.Enumeration<java.lang.String> getKeys();
method public java.util.Locale getLocale();
- method public final java.lang.Object getObject(java.lang.String);
- method public final java.lang.String getString(java.lang.String);
- method public final java.lang.String[] getStringArray(java.lang.String);
- method protected abstract java.lang.Object handleGetObject(java.lang.String);
+ method public final Object getObject(String);
+ method public final String getString(String);
+ method public final String[] getStringArray(String);
+ method protected abstract Object handleGetObject(String);
method protected java.util.Set<java.lang.String> handleKeySet();
method public java.util.Set<java.lang.String> keySet();
method protected void setParent(java.util.ResourceBundle);
@@ -69861,16 +70027,16 @@ package java.util {
public static class ResourceBundle.Control {
ctor protected ResourceBundle.Control();
- method public java.util.List<java.util.Locale> getCandidateLocales(java.lang.String, java.util.Locale);
+ method public java.util.List<java.util.Locale> getCandidateLocales(String, java.util.Locale);
method public static final java.util.ResourceBundle.Control getControl(java.util.List<java.lang.String>);
- method public java.util.Locale getFallbackLocale(java.lang.String, java.util.Locale);
- method public java.util.List<java.lang.String> getFormats(java.lang.String);
+ method public java.util.Locale getFallbackLocale(String, java.util.Locale);
+ method public java.util.List<java.lang.String> getFormats(String);
method public static final java.util.ResourceBundle.Control getNoFallbackControl(java.util.List<java.lang.String>);
- method public long getTimeToLive(java.lang.String, java.util.Locale);
- method public boolean needsReload(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, java.util.ResourceBundle, long);
- method public java.util.ResourceBundle newBundle(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, boolean) throws java.io.IOException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public java.lang.String toBundleName(java.lang.String, java.util.Locale);
- method public final java.lang.String toResourceName(java.lang.String, java.lang.String);
+ method public long getTimeToLive(String, java.util.Locale);
+ method public boolean needsReload(String, java.util.Locale, String, ClassLoader, java.util.ResourceBundle, long);
+ method public java.util.ResourceBundle newBundle(String, java.util.Locale, String, ClassLoader, boolean) throws java.io.IOException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public String toBundleName(String, java.util.Locale);
+ method public final String toResourceName(String, String);
field public static final java.util.List<java.lang.String> FORMAT_CLASS;
field public static final java.util.List<java.lang.String> FORMAT_DEFAULT;
field public static final java.util.List<java.lang.String> FORMAT_PROPERTIES;
@@ -69878,25 +70044,25 @@ package java.util {
field public static final long TTL_NO_EXPIRATION_CONTROL = -2L; // 0xfffffffffffffffeL
}
- public final class Scanner implements java.io.Closeable java.util.Iterator {
- ctor public Scanner(java.lang.Readable);
+ public final class Scanner implements java.io.Closeable java.util.Iterator<java.lang.String> {
+ ctor public Scanner(Readable);
ctor public Scanner(java.io.InputStream);
- ctor public Scanner(java.io.InputStream, java.lang.String);
+ ctor public Scanner(java.io.InputStream, String);
ctor public Scanner(java.io.File) throws java.io.FileNotFoundException;
- ctor public Scanner(java.io.File, java.lang.String) throws java.io.FileNotFoundException;
+ ctor public Scanner(java.io.File, String) throws java.io.FileNotFoundException;
ctor public Scanner(java.nio.file.Path) throws java.io.IOException;
- ctor public Scanner(java.nio.file.Path, java.lang.String) throws java.io.IOException;
- ctor public Scanner(java.lang.String);
+ ctor public Scanner(java.nio.file.Path, String) throws java.io.IOException;
+ ctor public Scanner(String);
ctor public Scanner(java.nio.channels.ReadableByteChannel);
- ctor public Scanner(java.nio.channels.ReadableByteChannel, java.lang.String);
+ ctor public Scanner(java.nio.channels.ReadableByteChannel, String);
method public void close();
method public java.util.regex.Pattern delimiter();
- method public java.lang.String findInLine(java.lang.String);
- method public java.lang.String findInLine(java.util.regex.Pattern);
- method public java.lang.String findWithinHorizon(java.lang.String, int);
- method public java.lang.String findWithinHorizon(java.util.regex.Pattern, int);
+ method public String findInLine(String);
+ method public String findInLine(java.util.regex.Pattern);
+ method public String findWithinHorizon(String, int);
+ method public String findWithinHorizon(java.util.regex.Pattern, int);
method public boolean hasNext();
- method public boolean hasNext(java.lang.String);
+ method public boolean hasNext(String);
method public boolean hasNext(java.util.regex.Pattern);
method public boolean hasNextBigDecimal();
method public boolean hasNextBigInteger();
@@ -69916,9 +70082,9 @@ package java.util {
method public java.io.IOException ioException();
method public java.util.Locale locale();
method public java.util.regex.MatchResult match();
- method public java.lang.String next();
- method public java.lang.String next(java.lang.String);
- method public java.lang.String next(java.util.regex.Pattern);
+ method public String next();
+ method public String next(String);
+ method public String next(java.util.regex.Pattern);
method public java.math.BigDecimal nextBigDecimal();
method public java.math.BigInteger nextBigInteger();
method public java.math.BigInteger nextBigInteger(int);
@@ -69929,7 +70095,7 @@ package java.util {
method public float nextFloat();
method public int nextInt();
method public int nextInt(int);
- method public java.lang.String nextLine();
+ method public String nextLine();
method public long nextLong();
method public long nextLong(int);
method public short nextShort();
@@ -69937,37 +70103,36 @@ package java.util {
method public int radix();
method public java.util.Scanner reset();
method public java.util.Scanner skip(java.util.regex.Pattern);
- method public java.util.Scanner skip(java.lang.String);
+ method public java.util.Scanner skip(String);
method public java.util.Scanner useDelimiter(java.util.regex.Pattern);
- method public java.util.Scanner useDelimiter(java.lang.String);
+ method public java.util.Scanner useDelimiter(String);
method public java.util.Scanner useLocale(java.util.Locale);
method public java.util.Scanner useRadix(int);
}
public class ServiceConfigurationError extends java.lang.Error {
- ctor public ServiceConfigurationError(java.lang.String);
- ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable);
+ ctor public ServiceConfigurationError(String);
+ ctor public ServiceConfigurationError(String, Throwable);
}
- public final class ServiceLoader<S> implements java.lang.Iterable {
+ public final class ServiceLoader<S> implements java.lang.Iterable<S> {
method public java.util.Iterator<S> iterator();
- method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
- method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>);
- method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
+ method public static <S> java.util.ServiceLoader<S> load(Class<S>, ClassLoader);
+ method public static <S> java.util.ServiceLoader<S> load(Class<S>);
+ method public static <S> java.util.ServiceLoader<S> loadInstalled(Class<S>);
method public void reload();
}
- public abstract interface Set<E> implements java.util.Collection {
+ public interface Set<E> extends java.util.Collection<E> {
}
public class SimpleTimeZone extends java.util.TimeZone {
- ctor public SimpleTimeZone(int, java.lang.String);
- ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int);
- ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int, int);
- ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int);
+ ctor public SimpleTimeZone(int, String);
+ ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int);
+ ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int, int);
+ ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int, int, int, int);
method public int getOffset(int, int, int, int, int, int);
method public int getRawOffset();
- method public synchronized int hashCode();
method public boolean inDaylightTime(java.util.Date);
method public void setDSTSavings(int);
method public void setEndRule(int, int, int, int);
@@ -69984,33 +70149,33 @@ package java.util {
field public static final int WALL_TIME = 0; // 0x0
}
- public abstract interface SortedMap<K, V> implements java.util.Map {
- method public abstract java.util.Comparator<? super K> comparator();
- method public abstract K firstKey();
- method public abstract java.util.SortedMap<K, V> headMap(K);
- method public abstract K lastKey();
- method public abstract java.util.SortedMap<K, V> subMap(K, K);
- method public abstract java.util.SortedMap<K, V> tailMap(K);
+ public interface SortedMap<K, V> extends java.util.Map<K,V> {
+ method @Nullable public java.util.Comparator<? super K> comparator();
+ method public K firstKey();
+ method @NonNull public java.util.SortedMap<K,V> headMap(K);
+ method public K lastKey();
+ method @NonNull public java.util.SortedMap<K,V> subMap(K, K);
+ method @NonNull public java.util.SortedMap<K,V> tailMap(K);
}
- public abstract interface SortedSet<E> implements java.util.Set {
- method public abstract java.util.Comparator<? super E> comparator();
- method public abstract E first();
- method public abstract java.util.SortedSet<E> headSet(E);
- method public abstract E last();
- method public abstract java.util.SortedSet<E> subSet(E, E);
- method public abstract java.util.SortedSet<E> tailSet(E);
+ public interface SortedSet<E> extends java.util.Set<E> {
+ method public java.util.Comparator<? super E> comparator();
+ method public E first();
+ method public java.util.SortedSet<E> headSet(E);
+ method public E last();
+ method public java.util.SortedSet<E> subSet(E, E);
+ method public java.util.SortedSet<E> tailSet(E);
}
- public abstract interface Spliterator<T> {
- method public abstract int characteristics();
- method public abstract long estimateSize();
+ public interface Spliterator<T> {
+ method public int characteristics();
+ method public long estimateSize();
method public default void forEachRemaining(java.util.function.Consumer<? super T>);
method public default java.util.Comparator<? super T> getComparator();
method public default long getExactSizeIfKnown();
method public default boolean hasCharacteristics(int);
- method public abstract boolean tryAdvance(java.util.function.Consumer<? super T>);
- method public abstract java.util.Spliterator<T> trySplit();
+ method public boolean tryAdvance(java.util.function.Consumer<? super T>);
+ method public java.util.Spliterator<T> trySplit();
field public static final int CONCURRENT = 4096; // 0x1000
field public static final int DISTINCT = 1; // 0x1
field public static final int IMMUTABLE = 1024; // 0x400
@@ -70021,34 +70186,34 @@ package java.util {
field public static final int SUBSIZED = 16384; // 0x4000
}
- public static abstract interface Spliterator.OfDouble implements java.util.Spliterator.OfPrimitive {
+ public static interface Spliterator.OfDouble extends java.util.Spliterator.OfPrimitive<java.lang.Double,java.util.function.DoubleConsumer,java.util.Spliterator.OfDouble> {
method public default void forEachRemaining(java.util.function.DoubleConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Double>);
- method public abstract boolean tryAdvance(java.util.function.DoubleConsumer);
+ method public boolean tryAdvance(java.util.function.DoubleConsumer);
method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Double>);
- method public abstract java.util.Spliterator.OfDouble trySplit();
+ method public java.util.Spliterator.OfDouble trySplit();
}
- public static abstract interface Spliterator.OfInt implements java.util.Spliterator.OfPrimitive {
+ public static interface Spliterator.OfInt extends java.util.Spliterator.OfPrimitive<java.lang.Integer,java.util.function.IntConsumer,java.util.Spliterator.OfInt> {
method public default void forEachRemaining(java.util.function.IntConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Integer>);
- method public abstract boolean tryAdvance(java.util.function.IntConsumer);
+ method public boolean tryAdvance(java.util.function.IntConsumer);
method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Integer>);
- method public abstract java.util.Spliterator.OfInt trySplit();
+ method public java.util.Spliterator.OfInt trySplit();
}
- public static abstract interface Spliterator.OfLong implements java.util.Spliterator.OfPrimitive {
+ public static interface Spliterator.OfLong extends java.util.Spliterator.OfPrimitive<java.lang.Long,java.util.function.LongConsumer,java.util.Spliterator.OfLong> {
method public default void forEachRemaining(java.util.function.LongConsumer);
method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Long>);
- method public abstract boolean tryAdvance(java.util.function.LongConsumer);
+ method public boolean tryAdvance(java.util.function.LongConsumer);
method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Long>);
- method public abstract java.util.Spliterator.OfLong trySplit();
+ method public java.util.Spliterator.OfLong trySplit();
}
- public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator {
+ public static interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> extends java.util.Spliterator<T> {
method public default void forEachRemaining(T_CONS);
- method public abstract boolean tryAdvance(T_CONS);
- method public abstract T_SPLITR trySplit();
+ method public boolean tryAdvance(T_CONS);
+ method public T_SPLITR trySplit();
}
public final class Spliterators {
@@ -70060,8 +70225,8 @@ package java.util {
method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt);
method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong);
method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble);
- method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int);
- method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
+ method public static <T> java.util.Spliterator<T> spliterator(Object[], int);
+ method public static <T> java.util.Spliterator<T> spliterator(Object[], int, int, int);
method public static java.util.Spliterator.OfInt spliterator(int[], int);
method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int);
method public static java.util.Spliterator.OfLong spliterator(long[], int);
@@ -70079,28 +70244,28 @@ package java.util {
method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int);
}
- public static abstract class Spliterators.AbstractDoubleSpliterator implements java.util.Spliterator.OfDouble {
+ public abstract static class Spliterators.AbstractDoubleSpliterator implements java.util.Spliterator.OfDouble {
ctor protected Spliterators.AbstractDoubleSpliterator(long, int);
method public int characteristics();
method public long estimateSize();
method public java.util.Spliterator.OfDouble trySplit();
}
- public static abstract class Spliterators.AbstractIntSpliterator implements java.util.Spliterator.OfInt {
+ public abstract static class Spliterators.AbstractIntSpliterator implements java.util.Spliterator.OfInt {
ctor protected Spliterators.AbstractIntSpliterator(long, int);
method public int characteristics();
method public long estimateSize();
method public java.util.Spliterator.OfInt trySplit();
}
- public static abstract class Spliterators.AbstractLongSpliterator implements java.util.Spliterator.OfLong {
+ public abstract static class Spliterators.AbstractLongSpliterator implements java.util.Spliterator.OfLong {
ctor protected Spliterators.AbstractLongSpliterator(long, int);
method public int characteristics();
method public long estimateSize();
method public java.util.Spliterator.OfLong trySplit();
}
- public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator {
+ public abstract static class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator<T> {
ctor protected Spliterators.AbstractSpliterator(long, int);
method public int characteristics();
method public long estimateSize();
@@ -70135,58 +70300,58 @@ package java.util {
method public java.util.SplittableRandom split();
}
- public class Stack<E> extends java.util.Vector {
+ public class Stack<E> extends java.util.Vector<E> {
ctor public Stack();
method public boolean empty();
- method public synchronized E peek();
- method public synchronized E pop();
+ method public E peek();
+ method public E pop();
method public E push(E);
- method public synchronized int search(java.lang.Object);
+ method public int search(Object);
}
public final class StringJoiner {
- ctor public StringJoiner(java.lang.CharSequence);
- ctor public StringJoiner(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
- method public java.util.StringJoiner add(java.lang.CharSequence);
+ ctor public StringJoiner(CharSequence);
+ ctor public StringJoiner(CharSequence, CharSequence, CharSequence);
+ method public java.util.StringJoiner add(CharSequence);
method public int length();
method public java.util.StringJoiner merge(java.util.StringJoiner);
- method public java.util.StringJoiner setEmptyValue(java.lang.CharSequence);
+ method public java.util.StringJoiner setEmptyValue(CharSequence);
}
- public class StringTokenizer implements java.util.Enumeration {
- ctor public StringTokenizer(java.lang.String, java.lang.String, boolean);
- ctor public StringTokenizer(java.lang.String, java.lang.String);
- ctor public StringTokenizer(java.lang.String);
+ public class StringTokenizer implements java.util.Enumeration<java.lang.Object> {
+ ctor public StringTokenizer(String, String, boolean);
+ ctor public StringTokenizer(String, String);
+ ctor public StringTokenizer(String);
method public int countTokens();
method public boolean hasMoreElements();
method public boolean hasMoreTokens();
- method public java.lang.Object nextElement();
- method public java.lang.String nextToken();
- method public java.lang.String nextToken(java.lang.String);
+ method public Object nextElement();
+ method public String nextToken();
+ method public String nextToken(String);
}
public abstract class TimeZone implements java.lang.Cloneable java.io.Serializable {
ctor public TimeZone();
- method public java.lang.Object clone();
- method public static synchronized java.lang.String[] getAvailableIDs(int);
- method public static synchronized java.lang.String[] getAvailableIDs();
+ method public Object clone();
+ method public static String[] getAvailableIDs(int);
+ method public static String[] getAvailableIDs();
method public int getDSTSavings();
method public static java.util.TimeZone getDefault();
- method public final java.lang.String getDisplayName();
- method public final java.lang.String getDisplayName(java.util.Locale);
- method public final java.lang.String getDisplayName(boolean, int);
- method public java.lang.String getDisplayName(boolean, int, java.util.Locale);
- method public java.lang.String getID();
+ method public final String getDisplayName();
+ method public final String getDisplayName(java.util.Locale);
+ method public final String getDisplayName(boolean, int);
+ method public String getDisplayName(boolean, int, java.util.Locale);
+ method public String getID();
method public abstract int getOffset(int, int, int, int, int, int);
method public int getOffset(long);
method public abstract int getRawOffset();
- method public static synchronized java.util.TimeZone getTimeZone(java.lang.String);
+ method public static java.util.TimeZone getTimeZone(String);
method public static java.util.TimeZone getTimeZone(java.time.ZoneId);
method public boolean hasSameRules(java.util.TimeZone);
method public abstract boolean inDaylightTime(java.util.Date);
method public boolean observesDaylightTime();
- method public static synchronized void setDefault(java.util.TimeZone);
- method public void setID(java.lang.String);
+ method public static void setDefault(java.util.TimeZone);
+ method public void setID(String);
method public abstract void setRawOffset(int);
method public java.time.ZoneId toZoneId();
method public abstract boolean useDaylightTime();
@@ -70197,8 +70362,8 @@ package java.util {
public class Timer {
ctor public Timer();
ctor public Timer(boolean);
- ctor public Timer(java.lang.String);
- ctor public Timer(java.lang.String, boolean);
+ ctor public Timer(String);
+ ctor public Timer(String, boolean);
method public void cancel();
method public int purge();
method public void schedule(java.util.TimerTask, long);
@@ -70217,49 +70382,49 @@ package java.util {
public class TooManyListenersException extends java.lang.Exception {
ctor public TooManyListenersException();
- ctor public TooManyListenersException(java.lang.String);
+ ctor public TooManyListenersException(String);
}
- public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
+ public class TreeMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.NavigableMap<K,V> java.io.Serializable {
ctor public TreeMap();
- ctor public TreeMap(java.util.Comparator<? super K>);
- ctor public TreeMap(java.util.Map<? extends K, ? extends V>);
- ctor public TreeMap(java.util.SortedMap<K, ? extends V>);
- method public java.util.Map.Entry<K, V> ceilingEntry(K);
- method public K ceilingKey(K);
- method public java.lang.Object clone();
- method public java.util.Comparator<? super K> comparator();
- method public java.util.NavigableSet<K> descendingKeySet();
- method public java.util.NavigableMap<K, V> descendingMap();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public java.util.Map.Entry<K, V> firstEntry();
+ ctor public TreeMap(@Nullable java.util.Comparator<? super K>);
+ ctor public TreeMap(@NonNull java.util.Map<? extends K,? extends V>);
+ ctor public TreeMap(@NonNull java.util.SortedMap<K,? extends V>);
+ method @Nullable public java.util.Map.Entry<K,V> ceilingEntry(K);
+ method @Nullable public K ceilingKey(K);
+ method @NonNull public Object clone();
+ method @Nullable public java.util.Comparator<? super K> comparator();
+ method @NonNull public java.util.NavigableSet<K> descendingKeySet();
+ method @NonNull public java.util.NavigableMap<K,V> descendingMap();
+ method @NonNull public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method @Nullable public java.util.Map.Entry<K,V> firstEntry();
method public K firstKey();
- method public java.util.Map.Entry<K, V> floorEntry(K);
- method public K floorKey(K);
- method public java.util.NavigableMap<K, V> headMap(K, boolean);
- method public java.util.SortedMap<K, V> headMap(K);
- method public java.util.Map.Entry<K, V> higherEntry(K);
- method public K higherKey(K);
- method public java.util.Map.Entry<K, V> lastEntry();
+ method @Nullable public java.util.Map.Entry<K,V> floorEntry(K);
+ method @Nullable public K floorKey(K);
+ method @NonNull public java.util.NavigableMap<K,V> headMap(K, boolean);
+ method @NonNull public java.util.SortedMap<K,V> headMap(K);
+ method @Nullable public java.util.Map.Entry<K,V> higherEntry(K);
+ method @Nullable public K higherKey(K);
+ method @Nullable public java.util.Map.Entry<K,V> lastEntry();
method public K lastKey();
- method public java.util.Map.Entry<K, V> lowerEntry(K);
- method public K lowerKey(K);
- method public java.util.NavigableSet<K> navigableKeySet();
- method public java.util.Map.Entry<K, V> pollFirstEntry();
- method public java.util.Map.Entry<K, V> pollLastEntry();
- method public java.util.NavigableMap<K, V> subMap(K, boolean, K, boolean);
- method public java.util.SortedMap<K, V> subMap(K, K);
- method public java.util.NavigableMap<K, V> tailMap(K, boolean);
- method public java.util.SortedMap<K, V> tailMap(K);
- }
-
- public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+ method @Nullable public java.util.Map.Entry<K,V> lowerEntry(K);
+ method @Nullable public K lowerKey(K);
+ method @NonNull public java.util.NavigableSet<K> navigableKeySet();
+ method @Nullable public java.util.Map.Entry<K,V> pollFirstEntry();
+ method @Nullable public java.util.Map.Entry<K,V> pollLastEntry();
+ method @NonNull public java.util.NavigableMap<K,V> subMap(K, boolean, K, boolean);
+ method @NonNull public java.util.SortedMap<K,V> subMap(K, K);
+ method @NonNull public java.util.NavigableMap<K,V> tailMap(K, boolean);
+ method @NonNull public java.util.SortedMap<K,V> tailMap(K);
+ }
+
+ public class TreeSet<E> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.util.NavigableSet<E> java.io.Serializable {
ctor public TreeSet();
ctor public TreeSet(java.util.Comparator<? super E>);
ctor public TreeSet(java.util.Collection<? extends E>);
ctor public TreeSet(java.util.SortedSet<E>);
method public E ceiling(E);
- method public java.lang.Object clone();
+ method public Object clone();
method public java.util.Comparator<? super E> comparator();
method public java.util.Iterator<E> descendingIterator();
method public java.util.NavigableSet<E> descendingSet();
@@ -70280,11 +70445,11 @@ package java.util {
method public java.util.SortedSet<E> tailSet(E);
}
- public final class UUID implements java.lang.Comparable java.io.Serializable {
+ public final class UUID implements java.lang.Comparable<java.util.UUID> java.io.Serializable {
ctor public UUID(long, long);
method public int clockSequence();
method public int compareTo(java.util.UUID);
- method public static java.util.UUID fromString(java.lang.String);
+ method public static java.util.UUID fromString(String);
method public long getLeastSignificantBits();
method public long getMostSignificantBits();
method public static java.util.UUID nameUUIDFromBytes(byte[]);
@@ -70296,75 +70461,52 @@ package java.util {
}
public class UnknownFormatConversionException extends java.util.IllegalFormatException {
- ctor public UnknownFormatConversionException(java.lang.String);
- method public java.lang.String getConversion();
+ ctor public UnknownFormatConversionException(String);
+ method public String getConversion();
}
public class UnknownFormatFlagsException extends java.util.IllegalFormatException {
- ctor public UnknownFormatFlagsException(java.lang.String);
- method public java.lang.String getFlags();
+ ctor public UnknownFormatFlagsException(String);
+ method public String getFlags();
}
- public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+ public class Vector<E> extends java.util.AbstractList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
ctor public Vector(int, int);
ctor public Vector(int);
ctor public Vector();
- ctor public Vector(java.util.Collection<? extends E>);
- method public synchronized boolean add(E);
- method public synchronized boolean addAll(java.util.Collection<? extends E>);
- method public synchronized boolean addAll(int, java.util.Collection<? extends E>);
- method public synchronized void addElement(E);
- method public synchronized int capacity();
- method public synchronized java.lang.Object clone();
- method public synchronized boolean containsAll(java.util.Collection<?>);
- method public synchronized void copyInto(java.lang.Object[]);
- method public synchronized E elementAt(int);
- method public java.util.Enumeration<E> elements();
- method public synchronized void ensureCapacity(int);
- method public synchronized boolean equals(java.lang.Object);
- method public synchronized E firstElement();
- method public synchronized void forEach(java.util.function.Consumer<? super E>);
- method public synchronized E get(int);
- method public synchronized int hashCode();
- method public synchronized int indexOf(java.lang.Object, int);
- method public synchronized void insertElementAt(E, int);
- method public synchronized boolean isEmpty();
- method public synchronized java.util.Iterator<E> iterator();
- method public synchronized E lastElement();
- method public synchronized int lastIndexOf(java.lang.Object);
- method public synchronized int lastIndexOf(java.lang.Object, int);
- method public synchronized java.util.ListIterator<E> listIterator(int);
- method public synchronized java.util.ListIterator<E> listIterator();
- method public synchronized E remove(int);
- method public synchronized boolean removeAll(java.util.Collection<?>);
- method public synchronized void removeAllElements();
- method public synchronized boolean removeElement(java.lang.Object);
- method public synchronized void removeElementAt(int);
- method public synchronized boolean removeIf(java.util.function.Predicate<? super E>);
- method protected synchronized void removeRange(int, int);
- method public synchronized void replaceAll(java.util.function.UnaryOperator<E>);
- method public synchronized boolean retainAll(java.util.Collection<?>);
- method public synchronized E set(int, E);
- method public synchronized void setElementAt(E, int);
- method public synchronized void setSize(int);
- method public synchronized int size();
- method public synchronized void sort(java.util.Comparator<? super E>);
- method public synchronized java.util.List<E> subList(int, int);
- method public synchronized java.lang.Object[] toArray();
- method public synchronized <T> T[] toArray(T[]);
- method public synchronized java.lang.String toString();
- method public synchronized void trimToSize();
+ ctor public Vector(@NonNull java.util.Collection<? extends E>);
+ method public void addElement(E);
+ method public int capacity();
+ method @NonNull public Object clone();
+ method public void copyInto(Object[]);
+ method public E elementAt(int);
+ method @NonNull public java.util.Enumeration<E> elements();
+ method public void ensureCapacity(int);
+ method public E firstElement();
+ method public void forEach(@NonNull java.util.function.Consumer<? super E>);
+ method public E get(int);
+ method public int indexOf(@Nullable Object, int);
+ method public void insertElementAt(E, int);
+ method public E lastElement();
+ method public int lastIndexOf(@Nullable Object, int);
+ method public void removeAllElements();
+ method public boolean removeElement(@Nullable Object);
+ method public void removeElementAt(int);
+ method public void setElementAt(E, int);
+ method public void setSize(int);
+ method public int size();
+ method public void trimToSize();
field protected int capacityIncrement;
field protected int elementCount;
- field protected java.lang.Object[] elementData;
+ field protected Object[] elementData;
}
- public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map {
+ public class WeakHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.Map<K,V> {
ctor public WeakHashMap(int, float);
ctor public WeakHashMap(int);
ctor public WeakHashMap();
- ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ ctor public WeakHashMap(@NonNull java.util.Map<? extends K,? extends V>);
+ method @NonNull public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
}
}
@@ -70377,14 +70519,14 @@ package java.util.concurrent {
method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
- method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
+ method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(Runnable, T);
method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
- method public java.util.concurrent.Future<?> submit(java.lang.Runnable);
- method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+ method public java.util.concurrent.Future<?> submit(Runnable);
+ method public <T> java.util.concurrent.Future<T> submit(Runnable, T);
method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
}
- public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+ public class ArrayBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
ctor public ArrayBlockingQueue(int);
ctor public ArrayBlockingQueue(int, boolean);
ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>);
@@ -70402,221 +70544,231 @@ package java.util.concurrent {
method public E take() throws java.lang.InterruptedException;
}
- public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque {
- method public abstract boolean offerFirst(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract boolean offerLast(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract E pollFirst(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract E pollLast(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract void putFirst(E) throws java.lang.InterruptedException;
- method public abstract void putLast(E) throws java.lang.InterruptedException;
- method public abstract E takeFirst() throws java.lang.InterruptedException;
- method public abstract E takeLast() throws java.lang.InterruptedException;
+ public interface BlockingDeque<E> extends java.util.concurrent.BlockingQueue<E> java.util.Deque<E> {
+ method public boolean offerFirst(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public boolean offerLast(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public E pollFirst(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public E pollLast(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public void putFirst(E) throws java.lang.InterruptedException;
+ method public void putLast(E) throws java.lang.InterruptedException;
+ method public E takeFirst() throws java.lang.InterruptedException;
+ method public E takeLast() throws java.lang.InterruptedException;
}
- public abstract interface BlockingQueue<E> implements java.util.Queue {
- method public abstract int drainTo(java.util.Collection<? super E>);
- method public abstract int drainTo(java.util.Collection<? super E>, int);
- method public abstract boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract void put(E) throws java.lang.InterruptedException;
- method public abstract int remainingCapacity();
- method public abstract E take() throws java.lang.InterruptedException;
+ public interface BlockingQueue<E> extends java.util.Queue<E> {
+ method public int drainTo(java.util.Collection<? super E>);
+ method public int drainTo(java.util.Collection<? super E>, int);
+ method public boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public void put(E) throws java.lang.InterruptedException;
+ method public int remainingCapacity();
+ method public E take() throws java.lang.InterruptedException;
}
public class BrokenBarrierException extends java.lang.Exception {
ctor public BrokenBarrierException();
- ctor public BrokenBarrierException(java.lang.String);
+ ctor public BrokenBarrierException(String);
}
- public abstract interface Callable<V> {
- method public abstract V call() throws java.lang.Exception;
+ @java.lang.FunctionalInterface public interface Callable<V> {
+ method public V call() throws java.lang.Exception;
}
public class CancellationException extends java.lang.IllegalStateException {
ctor public CancellationException();
- ctor public CancellationException(java.lang.String);
+ ctor public CancellationException(String);
}
- public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
+ public class CompletableFuture<T> implements java.util.concurrent.CompletionStage<T> java.util.concurrent.Future<T> {
ctor public CompletableFuture();
method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...);
method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...);
- method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
- method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
- method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>, java.util.concurrent.Executor);
method public boolean cancel(boolean);
method public boolean complete(T);
- method public boolean completeExceptionally(java.lang.Throwable);
+ method public boolean completeExceptionally(Throwable);
method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U);
- method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
+ method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable,? extends T>);
method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
method public T getNow(T);
method public int getNumberOfDependents();
- method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
- method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
- method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>, java.util.concurrent.Executor);
method public boolean isCancelled();
method public boolean isCompletedExceptionally();
method public boolean isDone();
method public T join();
- method public void obtrudeException(java.lang.Throwable);
+ method public void obtrudeException(Throwable);
method public void obtrudeValue(T);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
- method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable);
- method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, Runnable, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, Runnable, java.util.concurrent.Executor);
+ method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(Runnable);
+ method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(Runnable, java.util.concurrent.Executor);
method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
- method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
- method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
- method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
- method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
- method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
- method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
- method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
- method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
- method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
- method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
- method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
- method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable);
- method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>);
+ method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>);
+ method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T,? extends U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T,? extends U>);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T,? extends U>, java.util.concurrent.Executor);
+ method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>);
+ method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>);
+ method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>);
+ method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(Runnable);
+ method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(Runnable, java.util.concurrent.Executor);
method public java.util.concurrent.CompletableFuture<T> toCompletableFuture();
- method public java.util.concurrent.CompletableFuture<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>);
- method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>);
- method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletableFuture<T> whenComplete(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>);
+ method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>);
+ method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>, java.util.concurrent.Executor);
}
- public static abstract interface CompletableFuture.AsynchronousCompletionTask {
+ public static interface CompletableFuture.AsynchronousCompletionTask {
}
public class CompletionException extends java.lang.RuntimeException {
ctor protected CompletionException();
- ctor protected CompletionException(java.lang.String);
- ctor public CompletionException(java.lang.String, java.lang.Throwable);
- ctor public CompletionException(java.lang.Throwable);
- }
-
- public abstract interface CompletionService<V> {
- method public abstract java.util.concurrent.Future<V> poll();
- method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
- method public abstract java.util.concurrent.Future<V> submit(java.lang.Runnable, V);
- method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
- }
-
- public abstract interface CompletionStage<T> {
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
- method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
- method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
- method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
- method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
- method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
- method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
- method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
- method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable);
- method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
- method public abstract java.util.concurrent.CompletableFuture<T> toCompletableFuture();
- method public abstract java.util.concurrent.CompletionStage<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>);
- method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>);
- method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor);
- }
-
- public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
+ ctor protected CompletionException(String);
+ ctor public CompletionException(String, Throwable);
+ ctor public CompletionException(Throwable);
+ }
+
+ public interface CompletionService<V> {
+ method public java.util.concurrent.Future<V> poll();
+ method public java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
+ method public java.util.concurrent.Future<V> submit(Runnable, V);
+ method public java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
+ }
+
+ public interface CompletionStage<T> {
+ method public java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>);
+ method public <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>);
+ method public <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T,U>, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable,? extends T>);
+ method public <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>);
+ method public <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>);
+ method public <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T,java.lang.Throwable,? extends U>, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, Runnable, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, Runnable, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>);
+ method public <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>);
+ method public <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T,? super U>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T,? extends U>);
+ method public <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T,? extends U>);
+ method public <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T,? extends U>, java.util.concurrent.Executor);
+ method public <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>);
+ method public <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>);
+ method public <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T,? super U,? extends V>, java.util.concurrent.Executor);
+ method public <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>);
+ method public <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>);
+ method public <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T,? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenRun(Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(Runnable);
+ method public java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(Runnable, java.util.concurrent.Executor);
+ method public java.util.concurrent.CompletableFuture<T> toCompletableFuture();
+ method public java.util.concurrent.CompletionStage<T> whenComplete(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>);
+ method public java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>);
+ method public java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T,? super java.lang.Throwable>, java.util.concurrent.Executor);
+ }
+
+ public class ConcurrentHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.concurrent.ConcurrentMap<K,V> java.io.Serializable {
ctor public ConcurrentHashMap();
ctor public ConcurrentHashMap(int);
- ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
+ ctor public ConcurrentHashMap(@NonNull java.util.Map<? extends K,? extends V>);
ctor public ConcurrentHashMap(int, float);
ctor public ConcurrentHashMap(int, float, int);
- method public boolean contains(java.lang.Object);
- method public java.util.Enumeration<V> elements();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
- method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
- method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
- method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
- method public void forEachKey(long, java.util.function.Consumer<? super K>);
- method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
- method public void forEachValue(long, java.util.function.Consumer<? super V>);
- method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
- method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
- method public java.util.Enumeration<K> keys();
+ method public boolean contains(@NonNull Object);
+ method @NonNull public java.util.Enumeration<V> elements();
+ method @NonNull public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method public void forEach(long, @NonNull java.util.function.BiConsumer<? super K,? super V>);
+ method public <U> void forEach(long, @NonNull java.util.function.BiFunction<? super K,? super V,? extends U>, @NonNull java.util.function.Consumer<? super U>);
+ method public void forEachEntry(long, @NonNull java.util.function.Consumer<? super java.util.Map.Entry<K,V>>);
+ method public <U> void forEachEntry(long, @NonNull java.util.function.Function<java.util.Map.Entry<K,V>,? extends U>, @NonNull java.util.function.Consumer<? super U>);
+ method public void forEachKey(long, @NonNull java.util.function.Consumer<? super K>);
+ method public <U> void forEachKey(long, @NonNull java.util.function.Function<? super K,? extends U>, @NonNull java.util.function.Consumer<? super U>);
+ method public void forEachValue(long, @NonNull java.util.function.Consumer<? super V>);
+ method public <U> void forEachValue(long, @NonNull java.util.function.Function<? super V,? extends U>, @NonNull java.util.function.Consumer<? super U>);
+ method @NonNull public java.util.concurrent.ConcurrentHashMap.KeySetView<K,V> keySet(@NonNull V);
+ method @NonNull public java.util.Enumeration<K> keys();
method public long mappingCount();
- method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
- method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
- method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
- method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
- method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
- method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator);
- method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator);
- method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator);
- method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>);
- method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
- method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator);
- method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator);
- method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator);
- method public double reduceToDouble(long, java.util.function.ToDoubleBiFunction<? super K, ? super V>, double, java.util.function.DoubleBinaryOperator);
- method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator);
- method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator);
- method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
- method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
- method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
- method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
- method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
- method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
- method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
- method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>);
- }
-
- public static class ConcurrentHashMap.KeySetView<K, V> implements java.util.Collection java.io.Serializable java.util.Set {
- method public boolean add(K);
- method public boolean addAll(java.util.Collection<? extends K>);
- method public boolean contains(java.lang.Object);
- method public void forEach(java.util.function.Consumer<? super K>);
- method public V getMappedValue();
- method public java.util.Iterator<K> iterator();
- method public boolean remove(java.lang.Object);
- method public java.util.Spliterator<K> spliterator();
- }
-
- public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
+ method @NonNull public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K,java.lang.Boolean> newKeySet();
+ method @NonNull public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K,java.lang.Boolean> newKeySet(int);
+ method @Nullable public <U> U reduce(long, @NonNull java.util.function.BiFunction<? super K,? super V,? extends U>, @NonNull java.util.function.BiFunction<? super U,? super U,? extends U>);
+ method @Nullable public java.util.Map.Entry<K,V> reduceEntries(long, @NonNull java.util.function.BiFunction<java.util.Map.Entry<K,V>,java.util.Map.Entry<K,V>,? extends java.util.Map.Entry<K,V>>);
+ method @Nullable public <U> U reduceEntries(long, @NonNull java.util.function.Function<java.util.Map.Entry<K,V>,? extends U>, @NonNull java.util.function.BiFunction<? super U,? super U,? extends U>);
+ method public double reduceEntriesToDouble(long, @NonNull java.util.function.ToDoubleFunction<java.util.Map.Entry<K,V>>, double, @NonNull java.util.function.DoubleBinaryOperator);
+ method public int reduceEntriesToInt(long, @NonNull java.util.function.ToIntFunction<java.util.Map.Entry<K,V>>, int, @NonNull java.util.function.IntBinaryOperator);
+ method public long reduceEntriesToLong(long, @NonNull java.util.function.ToLongFunction<java.util.Map.Entry<K,V>>, long, @NonNull java.util.function.LongBinaryOperator);
+ method @Nullable public K reduceKeys(long, @NonNull java.util.function.BiFunction<? super K,? super K,? extends K>);
+ method @Nullable public <U> U reduceKeys(long, @NonNull java.util.function.Function<? super K,? extends U>, @NonNull java.util.function.BiFunction<? super U,? super U,? extends U>);
+ method public double reduceKeysToDouble(long, @NonNull java.util.function.ToDoubleFunction<? super K>, double, @NonNull java.util.function.DoubleBinaryOperator);
+ method public int reduceKeysToInt(long, @NonNull java.util.function.ToIntFunction<? super K>, int, @NonNull java.util.function.IntBinaryOperator);
+ method public long reduceKeysToLong(long, @NonNull java.util.function.ToLongFunction<? super K>, long, @NonNull java.util.function.LongBinaryOperator);
+ method public double reduceToDouble(long, @NonNull java.util.function.ToDoubleBiFunction<? super K,? super V>, double, @NonNull java.util.function.DoubleBinaryOperator);
+ method public int reduceToInt(long, @NonNull java.util.function.ToIntBiFunction<? super K,? super V>, int, @NonNull java.util.function.IntBinaryOperator);
+ method public long reduceToLong(long, @NonNull java.util.function.ToLongBiFunction<? super K,? super V>, long, @NonNull java.util.function.LongBinaryOperator);
+ method @Nullable public V reduceValues(long, @NonNull java.util.function.BiFunction<? super V,? super V,? extends V>);
+ method @Nullable public <U> U reduceValues(long, @NonNull java.util.function.Function<? super V,? extends U>, @NonNull java.util.function.BiFunction<? super U,? super U,? extends U>);
+ method public double reduceValuesToDouble(long, @NonNull java.util.function.ToDoubleFunction<? super V>, double, @NonNull java.util.function.DoubleBinaryOperator);
+ method public int reduceValuesToInt(long, @NonNull java.util.function.ToIntFunction<? super V>, int, @NonNull java.util.function.IntBinaryOperator);
+ method public long reduceValuesToLong(long, @NonNull java.util.function.ToLongFunction<? super V>, long, @NonNull java.util.function.LongBinaryOperator);
+ method @Nullable public <U> U search(long, @NonNull java.util.function.BiFunction<? super K,? super V,? extends U>);
+ method @Nullable public <U> U searchEntries(long, @NonNull java.util.function.Function<java.util.Map.Entry<K,V>,? extends U>);
+ method @Nullable public <U> U searchKeys(long, @NonNull java.util.function.Function<? super K,? extends U>);
+ method @Nullable public <U> U searchValues(long, @NonNull java.util.function.Function<? super V,? extends U>);
+ }
+
+ public static class ConcurrentHashMap.KeySetView<K, V> implements java.util.Collection<K> java.io.Serializable java.util.Set<K> {
+ method public boolean add(@NonNull K);
+ method public boolean addAll(@NonNull java.util.Collection<? extends K>);
+ method public final void clear();
+ method public boolean contains(@NonNull Object);
+ method public final boolean containsAll(java.util.Collection<?>);
+ method public void forEach(@NonNull java.util.function.Consumer<? super K>);
+ method public java.util.concurrent.ConcurrentHashMap<K,V> getMap();
+ method @Nullable public V getMappedValue();
+ method public final boolean isEmpty();
+ method @NonNull public java.util.Iterator<K> iterator();
+ method public boolean remove(@NonNull Object);
+ method public final boolean removeAll(java.util.Collection<?>);
+ method public final boolean retainAll(java.util.Collection<?>);
+ method public final int size();
+ method @NonNull public java.util.Spliterator<K> spliterator();
+ method public final Object[] toArray();
+ method public final <T> T[] toArray(T[]);
+ method public final String toString();
+ }
+
+ public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection<E> implements java.util.Deque<E> java.io.Serializable {
ctor public ConcurrentLinkedDeque();
ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>);
method public void addFirst(E);
@@ -70639,13 +70791,13 @@ package java.util.concurrent {
method public void push(E);
method public E remove();
method public E removeFirst();
- method public boolean removeFirstOccurrence(java.lang.Object);
+ method public boolean removeFirstOccurrence(Object);
method public E removeLast();
- method public boolean removeLastOccurrence(java.lang.Object);
+ method public boolean removeLastOccurrence(Object);
method public int size();
}
- public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
+ public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue<E> implements java.util.Queue<E> java.io.Serializable {
ctor public ConcurrentLinkedQueue();
ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>);
method public java.util.Iterator<E> iterator();
@@ -70655,59 +70807,59 @@ package java.util.concurrent {
method public int size();
}
- public abstract interface ConcurrentMap<K, V> implements java.util.Map {
- method public abstract V putIfAbsent(K, V);
- method public abstract boolean remove(java.lang.Object, java.lang.Object);
- method public abstract boolean replace(K, V, V);
- method public abstract V replace(K, V);
+ public interface ConcurrentMap<K, V> extends java.util.Map<K,V> {
+ method public V putIfAbsent(K, V);
+ method public boolean remove(Object, Object);
+ method public boolean replace(K, V, V);
+ method public V replace(K, V);
}
- public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K);
- method public abstract java.util.NavigableSet<K> keySet();
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean);
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K);
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean);
- method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
+ public interface ConcurrentNavigableMap<K, V> extends java.util.concurrent.ConcurrentMap<K,V> java.util.NavigableMap<K,V> {
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> descendingMap();
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> headMap(K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> headMap(K);
+ method public java.util.NavigableSet<K> keySet();
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> subMap(K, boolean, K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> subMap(K, K);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> tailMap(K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> tailMap(K);
}
- public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
+ public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap<K,V> java.io.Serializable {
ctor public ConcurrentSkipListMap();
ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>);
- ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>);
- ctor public ConcurrentSkipListMap(java.util.SortedMap<K, ? extends V>);
- method public java.util.Map.Entry<K, V> ceilingEntry(K);
+ ctor public ConcurrentSkipListMap(java.util.Map<? extends K,? extends V>);
+ ctor public ConcurrentSkipListMap(java.util.SortedMap<K,? extends V>);
+ method public java.util.Map.Entry<K,V> ceilingEntry(K);
method public K ceilingKey(K);
- method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone();
+ method public java.util.concurrent.ConcurrentSkipListMap<K,V> clone();
method public java.util.Comparator<? super K> comparator();
method public java.util.NavigableSet<K> descendingKeySet();
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public java.util.Map.Entry<K, V> firstEntry();
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> descendingMap();
+ method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
+ method public java.util.Map.Entry<K,V> firstEntry();
method public K firstKey();
- method public java.util.Map.Entry<K, V> floorEntry(K);
+ method public java.util.Map.Entry<K,V> floorEntry(K);
method public K floorKey(K);
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K);
- method public java.util.Map.Entry<K, V> higherEntry(K);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> headMap(K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> headMap(K);
+ method public java.util.Map.Entry<K,V> higherEntry(K);
method public K higherKey(K);
method public java.util.NavigableSet<K> keySet();
- method public java.util.Map.Entry<K, V> lastEntry();
+ method public java.util.Map.Entry<K,V> lastEntry();
method public K lastKey();
- method public java.util.Map.Entry<K, V> lowerEntry(K);
+ method public java.util.Map.Entry<K,V> lowerEntry(K);
method public K lowerKey(K);
method public java.util.NavigableSet<K> navigableKeySet();
- method public java.util.Map.Entry<K, V> pollFirstEntry();
- method public java.util.Map.Entry<K, V> pollLastEntry();
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean);
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K);
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean);
- method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
+ method public java.util.Map.Entry<K,V> pollFirstEntry();
+ method public java.util.Map.Entry<K,V> pollLastEntry();
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> subMap(K, boolean, K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> subMap(K, K);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> tailMap(K, boolean);
+ method public java.util.concurrent.ConcurrentNavigableMap<K,V> tailMap(K);
}
- public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+ public class ConcurrentSkipListSet<E> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.util.NavigableSet<E> java.io.Serializable {
ctor public ConcurrentSkipListSet();
ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>);
ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>);
@@ -70734,42 +70886,42 @@ package java.util.concurrent {
method public java.util.NavigableSet<E> tailSet(E);
}
- public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+ public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
ctor public CopyOnWriteArrayList();
- ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>);
+ ctor public CopyOnWriteArrayList(@NonNull java.util.Collection<? extends E>);
ctor public CopyOnWriteArrayList(E[]);
method public boolean add(E);
method public void add(int, E);
- method public boolean addAll(java.util.Collection<? extends E>);
- method public boolean addAll(int, java.util.Collection<? extends E>);
- method public int addAllAbsent(java.util.Collection<? extends E>);
+ method public boolean addAll(@NonNull java.util.Collection<? extends E>);
+ method public boolean addAll(int, @NonNull java.util.Collection<? extends E>);
+ method public int addAllAbsent(@NonNull java.util.Collection<? extends E>);
method public boolean addIfAbsent(E);
method public void clear();
- method public java.lang.Object clone();
- method public boolean contains(java.lang.Object);
- method public boolean containsAll(java.util.Collection<?>);
- method public void forEach(java.util.function.Consumer<? super E>);
+ method @NonNull public Object clone();
+ method public boolean contains(@Nullable Object);
+ method public boolean containsAll(@NonNull java.util.Collection<?>);
+ method public void forEach(@NonNull java.util.function.Consumer<? super E>);
method public E get(int);
- method public int indexOf(java.lang.Object);
- method public int indexOf(E, int);
+ method public int indexOf(@Nullable Object);
+ method public int indexOf(@Nullable E, int);
method public boolean isEmpty();
- method public java.util.Iterator<E> iterator();
- method public int lastIndexOf(java.lang.Object);
- method public int lastIndexOf(E, int);
- method public java.util.ListIterator<E> listIterator();
- method public java.util.ListIterator<E> listIterator(int);
+ method @NonNull public java.util.Iterator<E> iterator();
+ method public int lastIndexOf(@Nullable Object);
+ method public int lastIndexOf(@Nullable E, int);
+ method @NonNull public java.util.ListIterator<E> listIterator();
+ method @NonNull public java.util.ListIterator<E> listIterator(int);
method public E remove(int);
- method public boolean remove(java.lang.Object);
- method public boolean removeAll(java.util.Collection<?>);
- method public boolean retainAll(java.util.Collection<?>);
+ method public boolean remove(@Nullable Object);
+ method public boolean removeAll(@NonNull java.util.Collection<?>);
+ method public boolean retainAll(@NonNull java.util.Collection<?>);
method public E set(int, E);
method public int size();
- method public java.util.List<E> subList(int, int);
- method public java.lang.Object[] toArray();
+ method @NonNull public java.util.List<E> subList(int, int);
+ method public Object[] toArray();
method public <T> T[] toArray(T[]);
}
- public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable {
+ public class CopyOnWriteArraySet<E> extends java.util.AbstractSet<E> implements java.io.Serializable {
ctor public CopyOnWriteArraySet();
ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
method public void forEach(java.util.function.Consumer<? super E>);
@@ -70785,7 +70937,7 @@ package java.util.concurrent {
method public long getCount();
}
- public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask {
+ public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask<T> {
ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int);
ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>);
ctor protected CountedCompleter();
@@ -70803,7 +70955,7 @@ package java.util.concurrent {
method public final void helpComplete(int);
method public final java.util.concurrent.CountedCompleter<?> nextComplete();
method public void onCompletion(java.util.concurrent.CountedCompleter<?>);
- method public boolean onExceptionalCompletion(java.lang.Throwable, java.util.concurrent.CountedCompleter<?>);
+ method public boolean onExceptionalCompletion(Throwable, java.util.concurrent.CountedCompleter<?>);
method public final void propagateCompletion();
method public final void quietlyCompleteRoot();
method public final void setPendingCount(int);
@@ -70812,7 +70964,7 @@ package java.util.concurrent {
}
public class CyclicBarrier {
- ctor public CyclicBarrier(int, java.lang.Runnable);
+ ctor public CyclicBarrier(int, Runnable);
ctor public CyclicBarrier(int);
method public int await() throws java.util.concurrent.BrokenBarrierException, java.lang.InterruptedException;
method public int await(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.BrokenBarrierException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -70822,7 +70974,7 @@ package java.util.concurrent {
method public void reset();
}
- public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
+ public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> {
ctor public DelayQueue();
ctor public DelayQueue(java.util.Collection<? extends E>);
method public int drainTo(java.util.Collection<? super E>);
@@ -70839,8 +70991,8 @@ package java.util.concurrent {
method public E take() throws java.lang.InterruptedException;
}
- public abstract interface Delayed implements java.lang.Comparable {
- method public abstract long getDelay(java.util.concurrent.TimeUnit);
+ public interface Delayed extends java.lang.Comparable<java.util.concurrent.Delayed> {
+ method public long getDelay(java.util.concurrent.TimeUnit);
}
public class Exchanger<V> {
@@ -70851,43 +71003,43 @@ package java.util.concurrent {
public class ExecutionException extends java.lang.Exception {
ctor protected ExecutionException();
- ctor protected ExecutionException(java.lang.String);
- ctor public ExecutionException(java.lang.String, java.lang.Throwable);
- ctor public ExecutionException(java.lang.Throwable);
+ ctor protected ExecutionException(String);
+ ctor public ExecutionException(String, Throwable);
+ ctor public ExecutionException(Throwable);
}
- public abstract interface Executor {
- method public abstract void execute(java.lang.Runnable);
+ public interface Executor {
+ method public void execute(Runnable);
}
- public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService {
+ public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService<V> {
ctor public ExecutorCompletionService(java.util.concurrent.Executor);
ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>);
method public java.util.concurrent.Future<V> poll();
method public java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
method public java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
- method public java.util.concurrent.Future<V> submit(java.lang.Runnable, V);
+ method public java.util.concurrent.Future<V> submit(Runnable, V);
method public java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
}
- public abstract interface ExecutorService implements java.util.concurrent.Executor {
- method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
- method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
- method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
- method public abstract boolean isShutdown();
- method public abstract boolean isTerminated();
- method public abstract void shutdown();
- method public abstract java.util.List<java.lang.Runnable> shutdownNow();
- method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
- method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
- method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable);
+ public interface ExecutorService extends java.util.concurrent.Executor {
+ method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+ method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+ method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+ method public boolean isShutdown();
+ method public boolean isTerminated();
+ method public void shutdown();
+ method public java.util.List<java.lang.Runnable> shutdownNow();
+ method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+ method public <T> java.util.concurrent.Future<T> submit(Runnable, T);
+ method public java.util.concurrent.Future<?> submit(Runnable);
}
public class Executors {
- method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
- method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable);
+ method public static <T> java.util.concurrent.Callable<T> callable(Runnable, T);
+ method public static java.util.concurrent.Callable<java.lang.Object> callable(Runnable);
method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>);
method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>);
method public static java.util.concurrent.ThreadFactory defaultThreadFactory();
@@ -70919,7 +71071,7 @@ package java.util.concurrent {
method public static java.util.concurrent.ForkJoinPool commonPool();
method protected int drainTasksTo(java.util.Collection<? super java.util.concurrent.ForkJoinTask<?>>);
method public void execute(java.util.concurrent.ForkJoinTask<?>);
- method public void execute(java.lang.Runnable);
+ method public void execute(Runnable);
method public int getActiveThreadCount();
method public boolean getAsyncMode();
method public static int getCommonPoolParallelism();
@@ -70944,34 +71096,34 @@ package java.util.concurrent {
method public java.util.List<java.lang.Runnable> shutdownNow();
method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.Callable<T>);
- method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.lang.Runnable, T);
- method public java.util.concurrent.ForkJoinTask<?> submit(java.lang.Runnable);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(Runnable, T);
+ method public java.util.concurrent.ForkJoinTask<?> submit(Runnable);
field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
}
- public static abstract interface ForkJoinPool.ForkJoinWorkerThreadFactory {
- method public abstract java.util.concurrent.ForkJoinWorkerThread newThread(java.util.concurrent.ForkJoinPool);
+ public static interface ForkJoinPool.ForkJoinWorkerThreadFactory {
+ method public java.util.concurrent.ForkJoinWorkerThread newThread(java.util.concurrent.ForkJoinPool);
}
- public static abstract interface ForkJoinPool.ManagedBlocker {
- method public abstract boolean block() throws java.lang.InterruptedException;
- method public abstract boolean isReleasable();
+ public static interface ForkJoinPool.ManagedBlocker {
+ method public boolean block() throws java.lang.InterruptedException;
+ method public boolean isReleasable();
}
- public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable {
+ public abstract class ForkJoinTask<V> implements java.util.concurrent.Future<V> java.io.Serializable {
ctor public ForkJoinTask();
- method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable);
- method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
+ method public static java.util.concurrent.ForkJoinTask<?> adapt(Runnable);
+ method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(Runnable, T);
method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
method public boolean cancel(boolean);
method public final boolean compareAndSetForkJoinTaskTag(short, short);
method public void complete(V);
- method public void completeExceptionally(java.lang.Throwable);
+ method public void completeExceptionally(Throwable);
method protected abstract boolean exec();
method public final java.util.concurrent.ForkJoinTask<V> fork();
method public final V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
method public final V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
- method public final java.lang.Throwable getException();
+ method public final Throwable getException();
method public final short getForkJoinTaskTag();
method public static java.util.concurrent.ForkJoinPool getPool();
method public static int getQueuedTaskCount();
@@ -71005,20 +71157,20 @@ package java.util.concurrent {
method public java.util.concurrent.ForkJoinPool getPool();
method public int getPoolIndex();
method protected void onStart();
- method protected void onTermination(java.lang.Throwable);
+ method protected void onTermination(Throwable);
}
- public abstract interface Future<V> {
- method public abstract boolean cancel(boolean);
- method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
- method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
- method public abstract boolean isCancelled();
- method public abstract boolean isDone();
+ public interface Future<V> {
+ method public boolean cancel(boolean);
+ method public V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+ method public V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+ method public boolean isCancelled();
+ method public boolean isDone();
}
- public class FutureTask<V> implements java.util.concurrent.RunnableFuture {
+ public class FutureTask<V> implements java.util.concurrent.RunnableFuture<V> {
ctor public FutureTask(java.util.concurrent.Callable<V>);
- ctor public FutureTask(java.lang.Runnable, V);
+ ctor public FutureTask(Runnable, V);
method public boolean cancel(boolean);
method protected void done();
method public V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
@@ -71028,10 +71180,10 @@ package java.util.concurrent {
method public void run();
method protected boolean runAndReset();
method protected void set(V);
- method protected void setException(java.lang.Throwable);
+ method protected void setException(Throwable);
}
- public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
+ public class LinkedBlockingDeque<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingDeque<E> java.io.Serializable {
ctor public LinkedBlockingDeque();
ctor public LinkedBlockingDeque(int);
ctor public LinkedBlockingDeque(java.util.Collection<? extends E>);
@@ -71065,16 +71217,16 @@ package java.util.concurrent {
method public void putLast(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public E removeFirst();
- method public boolean removeFirstOccurrence(java.lang.Object);
+ method public boolean removeFirstOccurrence(Object);
method public E removeLast();
- method public boolean removeLastOccurrence(java.lang.Object);
+ method public boolean removeLastOccurrence(Object);
method public int size();
method public E take() throws java.lang.InterruptedException;
method public E takeFirst() throws java.lang.InterruptedException;
method public E takeLast() throws java.lang.InterruptedException;
}
- public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+ public class LinkedBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
ctor public LinkedBlockingQueue();
ctor public LinkedBlockingQueue(int);
ctor public LinkedBlockingQueue(java.util.Collection<? extends E>);
@@ -71092,7 +71244,7 @@ package java.util.concurrent {
method public E take() throws java.lang.InterruptedException;
}
- public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
+ public class LinkedTransferQueue<E> extends java.util.AbstractQueue<E> implements java.io.Serializable java.util.concurrent.TransferQueue<E> {
ctor public LinkedTransferQueue();
ctor public LinkedTransferQueue(java.util.Collection<? extends E>);
method public int drainTo(java.util.Collection<? super E>);
@@ -71138,7 +71290,7 @@ package java.util.concurrent {
method public int register();
}
- public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+ public class PriorityBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
ctor public PriorityBlockingQueue();
ctor public PriorityBlockingQueue(int);
ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>);
@@ -71158,15 +71310,15 @@ package java.util.concurrent {
method public E take() throws java.lang.InterruptedException;
}
- public abstract class RecursiveAction extends java.util.concurrent.ForkJoinTask {
+ public abstract class RecursiveAction extends java.util.concurrent.ForkJoinTask<java.lang.Void> {
ctor public RecursiveAction();
method protected abstract void compute();
method protected final boolean exec();
- method public final java.lang.Void getRawResult();
- method protected final void setRawResult(java.lang.Void);
+ method public final Void getRawResult();
+ method protected final void setRawResult(Void);
}
- public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask {
+ public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask<V> {
ctor public RecursiveTask();
method protected abstract V compute();
method protected final boolean exec();
@@ -71176,30 +71328,30 @@ package java.util.concurrent {
public class RejectedExecutionException extends java.lang.RuntimeException {
ctor public RejectedExecutionException();
- ctor public RejectedExecutionException(java.lang.String);
- ctor public RejectedExecutionException(java.lang.String, java.lang.Throwable);
- ctor public RejectedExecutionException(java.lang.Throwable);
+ ctor public RejectedExecutionException(String);
+ ctor public RejectedExecutionException(String, Throwable);
+ ctor public RejectedExecutionException(Throwable);
}
- public abstract interface RejectedExecutionHandler {
- method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
+ public interface RejectedExecutionHandler {
+ method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
}
- public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable {
+ public interface RunnableFuture<V> extends java.lang.Runnable java.util.concurrent.Future<V> {
}
- public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
- method public abstract boolean isPeriodic();
+ public interface RunnableScheduledFuture<V> extends java.util.concurrent.RunnableFuture<V> java.util.concurrent.ScheduledFuture<V> {
+ method public boolean isPeriodic();
}
- public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService {
- method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
- method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
- method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
- method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
+ public interface ScheduledExecutorService extends java.util.concurrent.ExecutorService {
+ method public java.util.concurrent.ScheduledFuture<?> schedule(Runnable, long, java.util.concurrent.TimeUnit);
+ method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+ method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(Runnable, long, long, java.util.concurrent.TimeUnit);
+ method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(Runnable, long, long, java.util.concurrent.TimeUnit);
}
- public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future {
+ public interface ScheduledFuture<V> extends java.util.concurrent.Delayed java.util.concurrent.Future<V> {
}
public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService {
@@ -71207,15 +71359,15 @@ package java.util.concurrent {
ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory);
ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler);
ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
- method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
+ method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
method public boolean getRemoveOnCancelPolicy();
- method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
+ method public java.util.concurrent.ScheduledFuture<?> schedule(Runnable, long, java.util.concurrent.TimeUnit);
method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
- method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
- method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
+ method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(Runnable, long, long, java.util.concurrent.TimeUnit);
+ method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(Runnable, long, long, java.util.concurrent.TimeUnit);
method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean);
method public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean);
method public void setRemoveOnCancelPolicy(boolean);
@@ -71243,7 +71395,7 @@ package java.util.concurrent {
method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
}
- public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+ public class SynchronousQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
ctor public SynchronousQueue();
ctor public SynchronousQueue(boolean);
method public int drainTo(java.util.Collection<? super E>);
@@ -71260,19 +71412,17 @@ package java.util.concurrent {
method public E take() throws java.lang.InterruptedException;
}
- public abstract interface ThreadFactory {
- method public abstract java.lang.Thread newThread(java.lang.Runnable);
+ public interface ThreadFactory {
+ method public Thread newThread(Runnable);
}
public class ThreadLocalRandom extends java.util.Random {
method public static java.util.concurrent.ThreadLocalRandom current();
method public double nextDouble(double);
method public double nextDouble(double, double);
- method public double nextGaussian();
method public int nextInt(int, int);
method public long nextLong(long);
method public long nextLong(long, long);
- method public void setSeed(long);
}
public class ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService {
@@ -71280,12 +71430,12 @@ package java.util.concurrent {
ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory);
ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.RejectedExecutionHandler);
ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
- method protected void afterExecute(java.lang.Runnable, java.lang.Throwable);
+ method protected void afterExecute(Runnable, Throwable);
method public void allowCoreThreadTimeOut(boolean);
method public boolean allowsCoreThreadTimeOut();
method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method protected void beforeExecute(java.lang.Thread, java.lang.Runnable);
- method public void execute(java.lang.Runnable);
+ method protected void beforeExecute(Thread, Runnable);
+ method public void execute(Runnable);
method protected void finalize();
method public int getActiveCount();
method public long getCompletedTaskCount();
@@ -71304,7 +71454,7 @@ package java.util.concurrent {
method public int prestartAllCoreThreads();
method public boolean prestartCoreThread();
method public void purge();
- method public boolean remove(java.lang.Runnable);
+ method public boolean remove(Runnable);
method public void setCorePoolSize(int);
method public void setKeepAliveTime(long, java.util.concurrent.TimeUnit);
method public void setMaximumPoolSize(int);
@@ -71317,29 +71467,29 @@ package java.util.concurrent {
public static class ThreadPoolExecutor.AbortPolicy implements java.util.concurrent.RejectedExecutionHandler {
ctor public ThreadPoolExecutor.AbortPolicy();
- method public void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
+ method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
}
public static class ThreadPoolExecutor.CallerRunsPolicy implements java.util.concurrent.RejectedExecutionHandler {
ctor public ThreadPoolExecutor.CallerRunsPolicy();
- method public void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
+ method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
}
public static class ThreadPoolExecutor.DiscardOldestPolicy implements java.util.concurrent.RejectedExecutionHandler {
ctor public ThreadPoolExecutor.DiscardOldestPolicy();
- method public void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
+ method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
}
public static class ThreadPoolExecutor.DiscardPolicy implements java.util.concurrent.RejectedExecutionHandler {
ctor public ThreadPoolExecutor.DiscardPolicy();
- method public void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
+ method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
}
- public class TimeUnit extends java.lang.Enum {
+ public enum TimeUnit {
method public long convert(long, java.util.concurrent.TimeUnit);
method public void sleep(long) throws java.lang.InterruptedException;
- method public void timedJoin(java.lang.Thread, long) throws java.lang.InterruptedException;
- method public void timedWait(java.lang.Object, long) throws java.lang.InterruptedException;
+ method public void timedJoin(Thread, long) throws java.lang.InterruptedException;
+ method public void timedWait(Object, long) throws java.lang.InterruptedException;
method public long toDays(long);
method public long toHours(long);
method public long toMicros(long);
@@ -71347,8 +71497,6 @@ package java.util.concurrent {
method public long toMinutes(long);
method public long toNanos(long);
method public long toSeconds(long);
- method public static java.util.concurrent.TimeUnit valueOf(java.lang.String);
- method public static final java.util.concurrent.TimeUnit[] values();
enum_constant public static final java.util.concurrent.TimeUnit DAYS;
enum_constant public static final java.util.concurrent.TimeUnit HOURS;
enum_constant public static final java.util.concurrent.TimeUnit MICROSECONDS;
@@ -71360,15 +71508,15 @@ package java.util.concurrent {
public class TimeoutException extends java.lang.Exception {
ctor public TimeoutException();
- ctor public TimeoutException(java.lang.String);
+ ctor public TimeoutException(String);
}
- public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue {
- method public abstract int getWaitingConsumerCount();
- method public abstract boolean hasWaitingConsumer();
- method public abstract void transfer(E) throws java.lang.InterruptedException;
- method public abstract boolean tryTransfer(E);
- method public abstract boolean tryTransfer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ public interface TransferQueue<E> extends java.util.concurrent.BlockingQueue<E> {
+ method public int getWaitingConsumerCount();
+ method public boolean hasWaitingConsumer();
+ method public void transfer(E) throws java.lang.InterruptedException;
+ method public boolean tryTransfer(E);
+ method public boolean tryTransfer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
}
}
@@ -71448,7 +71596,7 @@ package java.util.concurrent.atomic {
method public final int getAndUpdate(T, java.util.function.IntUnaryOperator);
method public int incrementAndGet(T);
method public abstract void lazySet(T, int);
- method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+ method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(Class<U>, String);
method public abstract void set(T, int);
method public final int updateAndGet(T, java.util.function.IntUnaryOperator);
method public abstract boolean weakCompareAndSet(T, int, int);
@@ -71516,7 +71664,7 @@ package java.util.concurrent.atomic {
method public final long getAndUpdate(T, java.util.function.LongUnaryOperator);
method public long incrementAndGet(T);
method public abstract void lazySet(T, long);
- method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+ method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(Class<U>, String);
method public abstract void set(T, long);
method public final long updateAndGet(T, java.util.function.LongUnaryOperator);
method public abstract boolean weakCompareAndSet(T, long, long);
@@ -71573,7 +71721,7 @@ package java.util.concurrent.atomic {
method public V getAndSet(T, V);
method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>);
method public abstract void lazySet(T, V);
- method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
+ method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U>, Class<W>, String);
method public abstract void set(T, V);
method public final V updateAndGet(T, java.util.function.UnaryOperator<V>);
method public abstract boolean weakCompareAndSet(T, V, V);
@@ -71646,8 +71794,8 @@ package java.util.concurrent.locks {
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable {
ctor protected AbstractOwnableSynchronizer();
- method protected final java.lang.Thread getExclusiveOwnerThread();
- method protected final void setExclusiveOwnerThread(java.lang.Thread);
+ method protected final Thread getExclusiveOwnerThread();
+ method protected final void setExclusiveOwnerThread(Thread);
}
public abstract class AbstractQueuedLongSynchronizer extends java.util.concurrent.locks.AbstractOwnableSynchronizer implements java.io.Serializable {
@@ -71658,7 +71806,7 @@ package java.util.concurrent.locks {
method public final void acquireSharedInterruptibly(long) throws java.lang.InterruptedException;
method protected final boolean compareAndSetState(long, long);
method public final java.util.Collection<java.lang.Thread> getExclusiveQueuedThreads();
- method public final java.lang.Thread getFirstQueuedThread();
+ method public final Thread getFirstQueuedThread();
method public final int getQueueLength();
method public final java.util.Collection<java.lang.Thread> getQueuedThreads();
method public final java.util.Collection<java.lang.Thread> getSharedQueuedThreads();
@@ -71670,7 +71818,7 @@ package java.util.concurrent.locks {
method public final boolean hasQueuedThreads();
method public final boolean hasWaiters(java.util.concurrent.locks.AbstractQueuedLongSynchronizer.ConditionObject);
method protected boolean isHeldExclusively();
- method public final boolean isQueued(java.lang.Thread);
+ method public final boolean isQueued(Thread);
method public final boolean owns(java.util.concurrent.locks.AbstractQueuedLongSynchronizer.ConditionObject);
method public final boolean release(long);
method public final boolean releaseShared(long);
@@ -71705,7 +71853,7 @@ package java.util.concurrent.locks {
method public final void acquireSharedInterruptibly(int) throws java.lang.InterruptedException;
method protected final boolean compareAndSetState(int, int);
method public final java.util.Collection<java.lang.Thread> getExclusiveQueuedThreads();
- method public final java.lang.Thread getFirstQueuedThread();
+ method public final Thread getFirstQueuedThread();
method public final int getQueueLength();
method public final java.util.Collection<java.lang.Thread> getQueuedThreads();
method public final java.util.Collection<java.lang.Thread> getSharedQueuedThreads();
@@ -71717,7 +71865,7 @@ package java.util.concurrent.locks {
method public final boolean hasQueuedThreads();
method public final boolean hasWaiters(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
method protected boolean isHeldExclusively();
- method public final boolean isQueued(java.lang.Thread);
+ method public final boolean isQueued(Thread);
method public final boolean owns(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
method public final boolean release(int);
method public final boolean releaseShared(int);
@@ -71744,51 +71892,51 @@ package java.util.concurrent.locks {
method public final void signalAll();
}
- public abstract interface Condition {
- method public abstract void await() throws java.lang.InterruptedException;
- method public abstract boolean await(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract long awaitNanos(long) throws java.lang.InterruptedException;
- method public abstract void awaitUninterruptibly();
- method public abstract boolean awaitUntil(java.util.Date) throws java.lang.InterruptedException;
- method public abstract void signal();
- method public abstract void signalAll();
+ public interface Condition {
+ method public void await() throws java.lang.InterruptedException;
+ method public boolean await(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public long awaitNanos(long) throws java.lang.InterruptedException;
+ method public void awaitUninterruptibly();
+ method public boolean awaitUntil(java.util.Date) throws java.lang.InterruptedException;
+ method public void signal();
+ method public void signalAll();
}
- public abstract interface Lock {
- method public abstract void lock();
- method public abstract void lockInterruptibly() throws java.lang.InterruptedException;
- method public abstract java.util.concurrent.locks.Condition newCondition();
- method public abstract boolean tryLock();
- method public abstract boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
- method public abstract void unlock();
+ public interface Lock {
+ method public void lock();
+ method public void lockInterruptibly() throws java.lang.InterruptedException;
+ method public java.util.concurrent.locks.Condition newCondition();
+ method public boolean tryLock();
+ method public boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+ method public void unlock();
}
public class LockSupport {
- method public static java.lang.Object getBlocker(java.lang.Thread);
- method public static void park(java.lang.Object);
+ method public static Object getBlocker(Thread);
+ method public static void park(Object);
method public static void park();
- method public static void parkNanos(java.lang.Object, long);
+ method public static void parkNanos(Object, long);
method public static void parkNanos(long);
- method public static void parkUntil(java.lang.Object, long);
+ method public static void parkUntil(Object, long);
method public static void parkUntil(long);
- method public static void unpark(java.lang.Thread);
+ method public static void unpark(Thread);
}
- public abstract interface ReadWriteLock {
- method public abstract java.util.concurrent.locks.Lock readLock();
- method public abstract java.util.concurrent.locks.Lock writeLock();
+ public interface ReadWriteLock {
+ method public java.util.concurrent.locks.Lock readLock();
+ method public java.util.concurrent.locks.Lock writeLock();
}
public class ReentrantLock implements java.util.concurrent.locks.Lock java.io.Serializable {
ctor public ReentrantLock();
ctor public ReentrantLock(boolean);
method public int getHoldCount();
- method protected java.lang.Thread getOwner();
+ method protected Thread getOwner();
method public final int getQueueLength();
method protected java.util.Collection<java.lang.Thread> getQueuedThreads();
method public int getWaitQueueLength(java.util.concurrent.locks.Condition);
method protected java.util.Collection<java.lang.Thread> getWaitingThreads(java.util.concurrent.locks.Condition);
- method public final boolean hasQueuedThread(java.lang.Thread);
+ method public final boolean hasQueuedThread(Thread);
method public final boolean hasQueuedThreads();
method public boolean hasWaiters(java.util.concurrent.locks.Condition);
method public final boolean isFair();
@@ -71805,7 +71953,7 @@ package java.util.concurrent.locks {
public class ReentrantReadWriteLock implements java.util.concurrent.locks.ReadWriteLock java.io.Serializable {
ctor public ReentrantReadWriteLock();
ctor public ReentrantReadWriteLock(boolean);
- method protected java.lang.Thread getOwner();
+ method protected Thread getOwner();
method public final int getQueueLength();
method protected java.util.Collection<java.lang.Thread> getQueuedReaderThreads();
method protected java.util.Collection<java.lang.Thread> getQueuedThreads();
@@ -71815,7 +71963,7 @@ package java.util.concurrent.locks {
method public int getWaitQueueLength(java.util.concurrent.locks.Condition);
method protected java.util.Collection<java.lang.Thread> getWaitingThreads(java.util.concurrent.locks.Condition);
method public int getWriteHoldCount();
- method public final boolean hasQueuedThread(java.lang.Thread);
+ method public final boolean hasQueuedThread(Thread);
method public final boolean hasQueuedThreads();
method public boolean hasWaiters(java.util.concurrent.locks.Condition);
method public final boolean isFair();
@@ -71879,210 +72027,210 @@ package java.util.concurrent.locks {
package java.util.function {
- public abstract interface BiConsumer<T, U> {
- method public abstract void accept(T, U);
- method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
+ @java.lang.FunctionalInterface public interface BiConsumer<T, U> {
+ method public void accept(T, U);
+ method public default java.util.function.BiConsumer<T,U> andThen(java.util.function.BiConsumer<? super T,? super U>);
}
- public abstract interface BiFunction<T, U, R> {
- method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
- method public abstract R apply(T, U);
+ @java.lang.FunctionalInterface public interface BiFunction<T, U, R> {
+ method public default <V> java.util.function.BiFunction<T,U,V> andThen(java.util.function.Function<? super R,? extends V>);
+ method public R apply(T, U);
}
- public abstract interface BiPredicate<T, U> {
- method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
- method public default java.util.function.BiPredicate<T, U> negate();
- method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
- method public abstract boolean test(T, U);
+ @java.lang.FunctionalInterface public interface BiPredicate<T, U> {
+ method public default java.util.function.BiPredicate<T,U> and(java.util.function.BiPredicate<? super T,? super U>);
+ method public default java.util.function.BiPredicate<T,U> negate();
+ method public default java.util.function.BiPredicate<T,U> or(java.util.function.BiPredicate<? super T,? super U>);
+ method public boolean test(T, U);
}
- public abstract interface BinaryOperator<T> implements java.util.function.BiFunction {
+ @java.lang.FunctionalInterface public interface BinaryOperator<T> extends java.util.function.BiFunction<T,T,T> {
method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
}
- public abstract interface BooleanSupplier {
- method public abstract boolean getAsBoolean();
+ @java.lang.FunctionalInterface public interface BooleanSupplier {
+ method public boolean getAsBoolean();
}
- public abstract interface Consumer<T> {
- method public abstract void accept(T);
+ @java.lang.FunctionalInterface public interface Consumer<T> {
+ method public void accept(T);
method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
}
- public abstract interface DoubleBinaryOperator {
- method public abstract double applyAsDouble(double, double);
+ @java.lang.FunctionalInterface public interface DoubleBinaryOperator {
+ method public double applyAsDouble(double, double);
}
- public abstract interface DoubleConsumer {
- method public abstract void accept(double);
+ @java.lang.FunctionalInterface public interface DoubleConsumer {
+ method public void accept(double);
method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
}
- public abstract interface DoubleFunction<R> {
- method public abstract R apply(double);
+ @java.lang.FunctionalInterface public interface DoubleFunction<R> {
+ method public R apply(double);
}
- public abstract interface DoublePredicate {
+ @java.lang.FunctionalInterface public interface DoublePredicate {
method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
method public default java.util.function.DoublePredicate negate();
method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
- method public abstract boolean test(double);
+ method public boolean test(double);
}
- public abstract interface DoubleSupplier {
- method public abstract double getAsDouble();
+ @java.lang.FunctionalInterface public interface DoubleSupplier {
+ method public double getAsDouble();
}
- public abstract interface DoubleToIntFunction {
- method public abstract int applyAsInt(double);
+ @java.lang.FunctionalInterface public interface DoubleToIntFunction {
+ method public int applyAsInt(double);
}
- public abstract interface DoubleToLongFunction {
- method public abstract long applyAsLong(double);
+ @java.lang.FunctionalInterface public interface DoubleToLongFunction {
+ method public long applyAsLong(double);
}
- public abstract interface DoubleUnaryOperator {
+ @java.lang.FunctionalInterface public interface DoubleUnaryOperator {
method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
- method public abstract double applyAsDouble(double);
+ method public double applyAsDouble(double);
method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
method public static java.util.function.DoubleUnaryOperator identity();
}
- public abstract interface Function<T, R> {
- method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
- method public abstract R apply(T);
- method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
- method public static <T> java.util.function.Function<T, T> identity();
+ @java.lang.FunctionalInterface public interface Function<T, R> {
+ method public default <V> java.util.function.Function<T,V> andThen(java.util.function.Function<? super R,? extends V>);
+ method public R apply(T);
+ method public default <V> java.util.function.Function<V,R> compose(java.util.function.Function<? super V,? extends T>);
+ method public static <T> java.util.function.Function<T,T> identity();
}
- public abstract interface IntBinaryOperator {
- method public abstract int applyAsInt(int, int);
+ @java.lang.FunctionalInterface public interface IntBinaryOperator {
+ method public int applyAsInt(int, int);
}
- public abstract interface IntConsumer {
- method public abstract void accept(int);
+ @java.lang.FunctionalInterface public interface IntConsumer {
+ method public void accept(int);
method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
}
- public abstract interface IntFunction<R> {
- method public abstract R apply(int);
+ @java.lang.FunctionalInterface public interface IntFunction<R> {
+ method public R apply(int);
}
- public abstract interface IntPredicate {
+ @java.lang.FunctionalInterface public interface IntPredicate {
method public default java.util.function.IntPredicate and(java.util.function.IntPredicate);
method public default java.util.function.IntPredicate negate();
method public default java.util.function.IntPredicate or(java.util.function.IntPredicate);
- method public abstract boolean test(int);
+ method public boolean test(int);
}
- public abstract interface IntSupplier {
- method public abstract int getAsInt();
+ @java.lang.FunctionalInterface public interface IntSupplier {
+ method public int getAsInt();
}
- public abstract interface IntToDoubleFunction {
- method public abstract double applyAsDouble(int);
+ @java.lang.FunctionalInterface public interface IntToDoubleFunction {
+ method public double applyAsDouble(int);
}
- public abstract interface IntToLongFunction {
- method public abstract long applyAsLong(int);
+ @java.lang.FunctionalInterface public interface IntToLongFunction {
+ method public long applyAsLong(int);
}
- public abstract interface IntUnaryOperator {
+ @java.lang.FunctionalInterface public interface IntUnaryOperator {
method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
- method public abstract int applyAsInt(int);
+ method public int applyAsInt(int);
method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
method public static java.util.function.IntUnaryOperator identity();
}
- public abstract interface LongBinaryOperator {
- method public abstract long applyAsLong(long, long);
+ @java.lang.FunctionalInterface public interface LongBinaryOperator {
+ method public long applyAsLong(long, long);
}
- public abstract interface LongConsumer {
- method public abstract void accept(long);
+ @java.lang.FunctionalInterface public interface LongConsumer {
+ method public void accept(long);
method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
}
- public abstract interface LongFunction<R> {
- method public abstract R apply(long);
+ @java.lang.FunctionalInterface public interface LongFunction<R> {
+ method public R apply(long);
}
- public abstract interface LongPredicate {
+ @java.lang.FunctionalInterface public interface LongPredicate {
method public default java.util.function.LongPredicate and(java.util.function.LongPredicate);
method public default java.util.function.LongPredicate negate();
method public default java.util.function.LongPredicate or(java.util.function.LongPredicate);
- method public abstract boolean test(long);
+ method public boolean test(long);
}
- public abstract interface LongSupplier {
- method public abstract long getAsLong();
+ @java.lang.FunctionalInterface public interface LongSupplier {
+ method public long getAsLong();
}
- public abstract interface LongToDoubleFunction {
- method public abstract double applyAsDouble(long);
+ @java.lang.FunctionalInterface public interface LongToDoubleFunction {
+ method public double applyAsDouble(long);
}
- public abstract interface LongToIntFunction {
- method public abstract int applyAsInt(long);
+ @java.lang.FunctionalInterface public interface LongToIntFunction {
+ method public int applyAsInt(long);
}
- public abstract interface LongUnaryOperator {
+ @java.lang.FunctionalInterface public interface LongUnaryOperator {
method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
- method public abstract long applyAsLong(long);
+ method public long applyAsLong(long);
method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
method public static java.util.function.LongUnaryOperator identity();
}
- public abstract interface ObjDoubleConsumer<T> {
- method public abstract void accept(T, double);
+ @java.lang.FunctionalInterface public interface ObjDoubleConsumer<T> {
+ method public void accept(T, double);
}
- public abstract interface ObjIntConsumer<T> {
- method public abstract void accept(T, int);
+ @java.lang.FunctionalInterface public interface ObjIntConsumer<T> {
+ method public void accept(T, int);
}
- public abstract interface ObjLongConsumer<T> {
- method public abstract void accept(T, long);
+ @java.lang.FunctionalInterface public interface ObjLongConsumer<T> {
+ method public void accept(T, long);
}
- public abstract interface Predicate<T> {
+ @java.lang.FunctionalInterface public interface Predicate<T> {
method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
- method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object);
+ method public static <T> java.util.function.Predicate<T> isEqual(Object);
method public default java.util.function.Predicate<T> negate();
method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
- method public abstract boolean test(T);
+ method public boolean test(T);
}
- public abstract interface Supplier<T> {
- method public abstract T get();
+ @java.lang.FunctionalInterface public interface Supplier<T> {
+ method public T get();
}
- public abstract interface ToDoubleBiFunction<T, U> {
- method public abstract double applyAsDouble(T, U);
+ @java.lang.FunctionalInterface public interface ToDoubleBiFunction<T, U> {
+ method public double applyAsDouble(T, U);
}
- public abstract interface ToDoubleFunction<T> {
- method public abstract double applyAsDouble(T);
+ @java.lang.FunctionalInterface public interface ToDoubleFunction<T> {
+ method public double applyAsDouble(T);
}
- public abstract interface ToIntBiFunction<T, U> {
- method public abstract int applyAsInt(T, U);
+ @java.lang.FunctionalInterface public interface ToIntBiFunction<T, U> {
+ method public int applyAsInt(T, U);
}
- public abstract interface ToIntFunction<T> {
- method public abstract int applyAsInt(T);
+ @java.lang.FunctionalInterface public interface ToIntFunction<T> {
+ method public int applyAsInt(T);
}
- public abstract interface ToLongBiFunction<T, U> {
- method public abstract long applyAsLong(T, U);
+ @java.lang.FunctionalInterface public interface ToLongBiFunction<T, U> {
+ method public long applyAsLong(T, U);
}
- public abstract interface ToLongFunction<T> {
- method public abstract long applyAsLong(T);
+ @java.lang.FunctionalInterface public interface ToLongFunction<T> {
+ method public long applyAsLong(T);
}
- public abstract interface UnaryOperator<T> implements java.util.function.Function {
+ @java.lang.FunctionalInterface public interface UnaryOperator<T> extends java.util.function.Function<T,T> {
method public static <T> java.util.function.UnaryOperator<T> identity();
}
@@ -72090,40 +72238,40 @@ package java.util.function {
package java.util.jar {
- public class Attributes implements java.lang.Cloneable java.util.Map {
+ public class Attributes implements java.lang.Cloneable java.util.Map<java.lang.Object,java.lang.Object> {
ctor public Attributes();
ctor public Attributes(int);
ctor public Attributes(java.util.jar.Attributes);
method public void clear();
- method public java.lang.Object clone();
- method public boolean containsKey(java.lang.Object);
- method public boolean containsValue(java.lang.Object);
- method public java.util.Set<java.util.Map.Entry<java.lang.Object, java.lang.Object>> entrySet();
- method public java.lang.Object get(java.lang.Object);
- method public java.lang.String getValue(java.lang.String);
- method public java.lang.String getValue(java.util.jar.Attributes.Name);
+ method public Object clone();
+ method public boolean containsKey(Object);
+ method public boolean containsValue(Object);
+ method public java.util.Set<java.util.Map.Entry<java.lang.Object,java.lang.Object>> entrySet();
+ method public Object get(Object);
+ method public String getValue(String);
+ method public String getValue(java.util.jar.Attributes.Name);
method public boolean isEmpty();
method public java.util.Set<java.lang.Object> keySet();
- method public java.lang.Object put(java.lang.Object, java.lang.Object);
- method public void putAll(java.util.Map<?, ?>);
- method public java.lang.String putValue(java.lang.String, java.lang.String);
- method public java.lang.Object remove(java.lang.Object);
+ method public Object put(Object, Object);
+ method public void putAll(java.util.Map<?,?>);
+ method public String putValue(String, String);
+ method public Object remove(Object);
method public int size();
method public java.util.Collection<java.lang.Object> values();
- field protected java.util.Map<java.lang.Object, java.lang.Object> map;
+ field protected java.util.Map<java.lang.Object,java.lang.Object> map;
}
public static class Attributes.Name {
- ctor public Attributes.Name(java.lang.String);
+ ctor public Attributes.Name(String);
field public static final java.util.jar.Attributes.Name CLASS_PATH;
field public static final java.util.jar.Attributes.Name CONTENT_TYPE;
- field public static final deprecated java.util.jar.Attributes.Name EXTENSION_INSTALLATION;
+ field @Deprecated public static final java.util.jar.Attributes.Name EXTENSION_INSTALLATION;
field public static final java.util.jar.Attributes.Name EXTENSION_LIST;
field public static final java.util.jar.Attributes.Name EXTENSION_NAME;
field public static final java.util.jar.Attributes.Name IMPLEMENTATION_TITLE;
- field public static final deprecated java.util.jar.Attributes.Name IMPLEMENTATION_URL;
+ field @Deprecated public static final java.util.jar.Attributes.Name IMPLEMENTATION_URL;
field public static final java.util.jar.Attributes.Name IMPLEMENTATION_VENDOR;
- field public static final deprecated java.util.jar.Attributes.Name IMPLEMENTATION_VENDOR_ID;
+ field @Deprecated public static final java.util.jar.Attributes.Name IMPLEMENTATION_VENDOR_ID;
field public static final java.util.jar.Attributes.Name IMPLEMENTATION_VERSION;
field public static final java.util.jar.Attributes.Name MAIN_CLASS;
field public static final java.util.jar.Attributes.Name MANIFEST_VERSION;
@@ -72135,7 +72283,7 @@ package java.util.jar {
}
public class JarEntry extends java.util.zip.ZipEntry {
- ctor public JarEntry(java.lang.String);
+ ctor public JarEntry(String);
ctor public JarEntry(java.util.zip.ZipEntry);
ctor public JarEntry(java.util.jar.JarEntry);
method public java.util.jar.Attributes getAttributes() throws java.io.IOException;
@@ -72185,18 +72333,17 @@ package java.util.jar {
public class JarException extends java.util.zip.ZipException {
ctor public JarException();
- ctor public JarException(java.lang.String);
+ ctor public JarException(String);
}
public class JarFile extends java.util.zip.ZipFile {
- ctor public JarFile(java.lang.String) throws java.io.IOException;
- ctor public JarFile(java.lang.String, boolean) throws java.io.IOException;
+ ctor public JarFile(String) throws java.io.IOException;
+ ctor public JarFile(String, boolean) throws java.io.IOException;
ctor public JarFile(java.io.File) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean, int) throws java.io.IOException;
method public java.util.Enumeration<java.util.jar.JarEntry> entries();
- method public synchronized java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
- method public java.util.jar.JarEntry getJarEntry(java.lang.String);
+ method public java.util.jar.JarEntry getJarEntry(String);
method public java.util.jar.Manifest getManifest() throws java.io.IOException;
method public java.util.stream.Stream<java.util.jar.JarEntry> stream();
field public static final int CENATT = 36; // 0x24
@@ -72239,7 +72386,7 @@ package java.util.jar {
field public static final int LOCSIZ = 18; // 0x12
field public static final int LOCTIM = 10; // 0xa
field public static final int LOCVER = 4; // 0x4
- field public static final java.lang.String MANIFEST_NAME = "META-INF/MANIFEST.MF";
+ field public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";
}
public class JarInputStream extends java.util.zip.ZipInputStream {
@@ -72339,57 +72486,57 @@ package java.util.jar {
ctor public Manifest(java.io.InputStream) throws java.io.IOException;
ctor public Manifest(java.util.jar.Manifest);
method public void clear();
- method public java.lang.Object clone();
- method public java.util.jar.Attributes getAttributes(java.lang.String);
- method public java.util.Map<java.lang.String, java.util.jar.Attributes> getEntries();
+ method public Object clone();
+ method public java.util.jar.Attributes getAttributes(String);
+ method public java.util.Map<java.lang.String,java.util.jar.Attributes> getEntries();
method public java.util.jar.Attributes getMainAttributes();
method public void read(java.io.InputStream) throws java.io.IOException;
method public void write(java.io.OutputStream) throws java.io.IOException;
}
public abstract class Pack200 {
- method public static synchronized java.util.jar.Pack200.Packer newPacker();
+ method public static java.util.jar.Pack200.Packer newPacker();
method public static java.util.jar.Pack200.Unpacker newUnpacker();
}
- public static abstract interface Pack200.Packer {
- method public default deprecated void addPropertyChangeListener(java.beans.PropertyChangeListener);
- method public abstract void pack(java.util.jar.JarFile, java.io.OutputStream) throws java.io.IOException;
- method public abstract void pack(java.util.jar.JarInputStream, java.io.OutputStream) throws java.io.IOException;
- method public abstract java.util.SortedMap<java.lang.String, java.lang.String> properties();
- method public default deprecated void removePropertyChangeListener(java.beans.PropertyChangeListener);
- field public static final java.lang.String CLASS_ATTRIBUTE_PFX = "pack.class.attribute.";
- field public static final java.lang.String CODE_ATTRIBUTE_PFX = "pack.code.attribute.";
- field public static final java.lang.String DEFLATE_HINT = "pack.deflate.hint";
- field public static final java.lang.String EFFORT = "pack.effort";
- field public static final java.lang.String ERROR = "error";
- field public static final java.lang.String FALSE = "false";
- field public static final java.lang.String FIELD_ATTRIBUTE_PFX = "pack.field.attribute.";
- field public static final java.lang.String KEEP = "keep";
- field public static final java.lang.String KEEP_FILE_ORDER = "pack.keep.file.order";
- field public static final java.lang.String LATEST = "latest";
- field public static final java.lang.String METHOD_ATTRIBUTE_PFX = "pack.method.attribute.";
- field public static final java.lang.String MODIFICATION_TIME = "pack.modification.time";
- field public static final java.lang.String PASS = "pass";
- field public static final java.lang.String PASS_FILE_PFX = "pack.pass.file.";
- field public static final java.lang.String PROGRESS = "pack.progress";
- field public static final java.lang.String SEGMENT_LIMIT = "pack.segment.limit";
- field public static final java.lang.String STRIP = "strip";
- field public static final java.lang.String TRUE = "true";
- field public static final java.lang.String UNKNOWN_ATTRIBUTE = "pack.unknown.attribute";
- }
-
- public static abstract interface Pack200.Unpacker {
- method public default deprecated void addPropertyChangeListener(java.beans.PropertyChangeListener);
- method public abstract java.util.SortedMap<java.lang.String, java.lang.String> properties();
- method public default deprecated void removePropertyChangeListener(java.beans.PropertyChangeListener);
- method public abstract void unpack(java.io.InputStream, java.util.jar.JarOutputStream) throws java.io.IOException;
- method public abstract void unpack(java.io.File, java.util.jar.JarOutputStream) throws java.io.IOException;
- field public static final java.lang.String DEFLATE_HINT = "unpack.deflate.hint";
- field public static final java.lang.String FALSE = "false";
- field public static final java.lang.String KEEP = "keep";
- field public static final java.lang.String PROGRESS = "unpack.progress";
- field public static final java.lang.String TRUE = "true";
+ public static interface Pack200.Packer {
+ method @Deprecated public default void addPropertyChangeListener(java.beans.PropertyChangeListener);
+ method public void pack(java.util.jar.JarFile, java.io.OutputStream) throws java.io.IOException;
+ method public void pack(java.util.jar.JarInputStream, java.io.OutputStream) throws java.io.IOException;
+ method public java.util.SortedMap<java.lang.String,java.lang.String> properties();
+ method @Deprecated public default void removePropertyChangeListener(java.beans.PropertyChangeListener);
+ field public static final String CLASS_ATTRIBUTE_PFX = "pack.class.attribute.";
+ field public static final String CODE_ATTRIBUTE_PFX = "pack.code.attribute.";
+ field public static final String DEFLATE_HINT = "pack.deflate.hint";
+ field public static final String EFFORT = "pack.effort";
+ field public static final String ERROR = "error";
+ field public static final String FALSE = "false";
+ field public static final String FIELD_ATTRIBUTE_PFX = "pack.field.attribute.";
+ field public static final String KEEP = "keep";
+ field public static final String KEEP_FILE_ORDER = "pack.keep.file.order";
+ field public static final String LATEST = "latest";
+ field public static final String METHOD_ATTRIBUTE_PFX = "pack.method.attribute.";
+ field public static final String MODIFICATION_TIME = "pack.modification.time";
+ field public static final String PASS = "pass";
+ field public static final String PASS_FILE_PFX = "pack.pass.file.";
+ field public static final String PROGRESS = "pack.progress";
+ field public static final String SEGMENT_LIMIT = "pack.segment.limit";
+ field public static final String STRIP = "strip";
+ field public static final String TRUE = "true";
+ field public static final String UNKNOWN_ATTRIBUTE = "pack.unknown.attribute";
+ }
+
+ public static interface Pack200.Unpacker {
+ method @Deprecated public default void addPropertyChangeListener(java.beans.PropertyChangeListener);
+ method public java.util.SortedMap<java.lang.String,java.lang.String> properties();
+ method @Deprecated public default void removePropertyChangeListener(java.beans.PropertyChangeListener);
+ method public void unpack(java.io.InputStream, java.util.jar.JarOutputStream) throws java.io.IOException;
+ method public void unpack(java.io.File, java.util.jar.JarOutputStream) throws java.io.IOException;
+ field public static final String DEFLATE_HINT = "unpack.deflate.hint";
+ field public static final String FALSE = "false";
+ field public static final String KEEP = "keep";
+ field public static final String PROGRESS = "unpack.progress";
+ field public static final String TRUE = "true";
}
}
@@ -72399,12 +72546,11 @@ package java.util.logging {
public class ConsoleHandler extends java.util.logging.StreamHandler {
ctor public ConsoleHandler();
method public void close();
- method public void publish(java.util.logging.LogRecord);
}
public class ErrorManager {
ctor public ErrorManager();
- method public synchronized void error(java.lang.String, java.lang.Exception, int);
+ method public void error(String, Exception, int);
field public static final int CLOSE_FAILURE = 3; // 0x3
field public static final int FLUSH_FAILURE = 2; // 0x2
field public static final int FORMAT_FAILURE = 5; // 0x5
@@ -72415,183 +72561,183 @@ package java.util.logging {
public class FileHandler extends java.util.logging.StreamHandler {
ctor public FileHandler() throws java.io.IOException, java.lang.SecurityException;
- ctor public FileHandler(java.lang.String) throws java.io.IOException, java.lang.SecurityException;
- ctor public FileHandler(java.lang.String, boolean) throws java.io.IOException, java.lang.SecurityException;
- ctor public FileHandler(java.lang.String, int, int) throws java.io.IOException, java.lang.SecurityException;
- ctor public FileHandler(java.lang.String, int, int, boolean) throws java.io.IOException, java.lang.SecurityException;
+ ctor public FileHandler(String) throws java.io.IOException, java.lang.SecurityException;
+ ctor public FileHandler(String, boolean) throws java.io.IOException, java.lang.SecurityException;
+ ctor public FileHandler(String, int, int) throws java.io.IOException, java.lang.SecurityException;
+ ctor public FileHandler(String, int, int, boolean) throws java.io.IOException, java.lang.SecurityException;
}
- public abstract interface Filter {
- method public abstract boolean isLoggable(java.util.logging.LogRecord);
+ @java.lang.FunctionalInterface public interface Filter {
+ method public boolean isLoggable(java.util.logging.LogRecord);
}
public abstract class Formatter {
ctor protected Formatter();
- method public abstract java.lang.String format(java.util.logging.LogRecord);
- method public synchronized java.lang.String formatMessage(java.util.logging.LogRecord);
- method public java.lang.String getHead(java.util.logging.Handler);
- method public java.lang.String getTail(java.util.logging.Handler);
+ method public abstract String format(java.util.logging.LogRecord);
+ method public String formatMessage(java.util.logging.LogRecord);
+ method public String getHead(java.util.logging.Handler);
+ method public String getTail(java.util.logging.Handler);
}
public abstract class Handler {
ctor protected Handler();
method public abstract void close() throws java.lang.SecurityException;
method public abstract void flush();
- method public java.lang.String getEncoding();
+ method public String getEncoding();
method public java.util.logging.ErrorManager getErrorManager();
method public java.util.logging.Filter getFilter();
method public java.util.logging.Formatter getFormatter();
method public java.util.logging.Level getLevel();
method public boolean isLoggable(java.util.logging.LogRecord);
method public abstract void publish(java.util.logging.LogRecord);
- method protected void reportError(java.lang.String, java.lang.Exception, int);
- method public synchronized void setEncoding(java.lang.String) throws java.lang.SecurityException, java.io.UnsupportedEncodingException;
- method public synchronized void setErrorManager(java.util.logging.ErrorManager);
- method public synchronized void setFilter(java.util.logging.Filter) throws java.lang.SecurityException;
- method public synchronized void setFormatter(java.util.logging.Formatter) throws java.lang.SecurityException;
- method public synchronized void setLevel(java.util.logging.Level) throws java.lang.SecurityException;
+ method protected void reportError(String, Exception, int);
+ method public void setEncoding(String) throws java.lang.SecurityException, java.io.UnsupportedEncodingException;
+ method public void setErrorManager(java.util.logging.ErrorManager);
+ method public void setFilter(java.util.logging.Filter) throws java.lang.SecurityException;
+ method public void setFormatter(java.util.logging.Formatter) throws java.lang.SecurityException;
+ method public void setLevel(java.util.logging.Level) throws java.lang.SecurityException;
}
public class Level implements java.io.Serializable {
- ctor protected Level(java.lang.String, int);
- ctor protected Level(java.lang.String, int, java.lang.String);
- method public java.lang.String getLocalizedName();
- method public java.lang.String getName();
- method public java.lang.String getResourceBundleName();
+ ctor protected Level(@NonNull String, int);
+ ctor protected Level(@NonNull String, int, @Nullable String);
+ method @NonNull public String getLocalizedName();
+ method @NonNull public String getName();
+ method @Nullable public String getResourceBundleName();
method public final int intValue();
- method public static synchronized java.util.logging.Level parse(java.lang.String) throws java.lang.IllegalArgumentException;
- method public final java.lang.String toString();
- field public static final java.util.logging.Level ALL;
- field public static final java.util.logging.Level CONFIG;
- field public static final java.util.logging.Level FINE;
- field public static final java.util.logging.Level FINER;
- field public static final java.util.logging.Level FINEST;
- field public static final java.util.logging.Level INFO;
- field public static final java.util.logging.Level OFF;
- field public static final java.util.logging.Level SEVERE;
- field public static final java.util.logging.Level WARNING;
+ method @NonNull public static java.util.logging.Level parse(@NonNull String) throws java.lang.IllegalArgumentException;
+ method @NonNull public final String toString();
+ field @NonNull public static final java.util.logging.Level ALL;
+ field @NonNull public static final java.util.logging.Level CONFIG;
+ field @NonNull public static final java.util.logging.Level FINE;
+ field @NonNull public static final java.util.logging.Level FINER;
+ field @NonNull public static final java.util.logging.Level FINEST;
+ field @NonNull public static final java.util.logging.Level INFO;
+ field @NonNull public static final java.util.logging.Level OFF;
+ field @NonNull public static final java.util.logging.Level SEVERE;
+ field @NonNull public static final java.util.logging.Level WARNING;
}
public class LogManager {
ctor protected LogManager();
method public boolean addLogger(java.util.logging.Logger);
- method public deprecated void addPropertyChangeListener(java.beans.PropertyChangeListener) throws java.lang.SecurityException;
+ method @Deprecated public void addPropertyChangeListener(java.beans.PropertyChangeListener) throws java.lang.SecurityException;
method public void checkAccess() throws java.lang.SecurityException;
method public static java.util.logging.LogManager getLogManager();
- method public java.util.logging.Logger getLogger(java.lang.String);
+ method public java.util.logging.Logger getLogger(String);
method public java.util.Enumeration<java.lang.String> getLoggerNames();
- method public static synchronized java.util.logging.LoggingMXBean getLoggingMXBean();
- method public java.lang.String getProperty(java.lang.String);
+ method public static java.util.logging.LoggingMXBean getLoggingMXBean();
+ method public String getProperty(String);
method public void readConfiguration() throws java.io.IOException, java.lang.SecurityException;
method public void readConfiguration(java.io.InputStream) throws java.io.IOException, java.lang.SecurityException;
- method public deprecated void removePropertyChangeListener(java.beans.PropertyChangeListener) throws java.lang.SecurityException;
+ method @Deprecated public void removePropertyChangeListener(java.beans.PropertyChangeListener) throws java.lang.SecurityException;
method public void reset() throws java.lang.SecurityException;
- field public static final java.lang.String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging";
+ field public static final String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging";
}
public class LogRecord implements java.io.Serializable {
- ctor public LogRecord(java.util.logging.Level, java.lang.String);
+ ctor public LogRecord(java.util.logging.Level, String);
method public java.util.logging.Level getLevel();
- method public java.lang.String getLoggerName();
- method public java.lang.String getMessage();
+ method public String getLoggerName();
+ method public String getMessage();
method public long getMillis();
- method public java.lang.Object[] getParameters();
+ method public Object[] getParameters();
method public java.util.ResourceBundle getResourceBundle();
- method public java.lang.String getResourceBundleName();
+ method public String getResourceBundleName();
method public long getSequenceNumber();
- method public java.lang.String getSourceClassName();
- method public java.lang.String getSourceMethodName();
+ method public String getSourceClassName();
+ method public String getSourceMethodName();
method public int getThreadID();
- method public java.lang.Throwable getThrown();
+ method public Throwable getThrown();
method public void setLevel(java.util.logging.Level);
- method public void setLoggerName(java.lang.String);
- method public void setMessage(java.lang.String);
+ method public void setLoggerName(String);
+ method public void setMessage(String);
method public void setMillis(long);
- method public void setParameters(java.lang.Object[]);
+ method public void setParameters(Object[]);
method public void setResourceBundle(java.util.ResourceBundle);
- method public void setResourceBundleName(java.lang.String);
+ method public void setResourceBundleName(String);
method public void setSequenceNumber(long);
- method public void setSourceClassName(java.lang.String);
- method public void setSourceMethodName(java.lang.String);
+ method public void setSourceClassName(String);
+ method public void setSourceMethodName(String);
method public void setThreadID(int);
- method public void setThrown(java.lang.Throwable);
+ method public void setThrown(Throwable);
}
public class Logger {
- ctor protected Logger(java.lang.String, java.lang.String);
- method public void addHandler(java.util.logging.Handler) throws java.lang.SecurityException;
- method public void config(java.lang.String);
- method public void config(java.util.function.Supplier<java.lang.String>);
- method public void entering(java.lang.String, java.lang.String);
- method public void entering(java.lang.String, java.lang.String, java.lang.Object);
- method public void entering(java.lang.String, java.lang.String, java.lang.Object[]);
- method public void exiting(java.lang.String, java.lang.String);
- method public void exiting(java.lang.String, java.lang.String, java.lang.Object);
- method public void fine(java.lang.String);
- method public void fine(java.util.function.Supplier<java.lang.String>);
- method public void finer(java.lang.String);
- method public void finer(java.util.function.Supplier<java.lang.String>);
- method public void finest(java.lang.String);
- method public void finest(java.util.function.Supplier<java.lang.String>);
- method public static java.util.logging.Logger getAnonymousLogger();
- method public static java.util.logging.Logger getAnonymousLogger(java.lang.String);
- method public java.util.logging.Filter getFilter();
- method public static final java.util.logging.Logger getGlobal();
+ ctor protected Logger(@Nullable String, @Nullable String);
+ method public void addHandler(@NonNull java.util.logging.Handler) throws java.lang.SecurityException;
+ method public void config(@Nullable String);
+ method public void config(@NonNull java.util.function.Supplier<java.lang.String>);
+ method public void entering(@Nullable String, @Nullable String);
+ method public void entering(@Nullable String, @Nullable String, @Nullable Object);
+ method public void entering(@Nullable String, @Nullable String, Object[]);
+ method public void exiting(@Nullable String, @Nullable String);
+ method public void exiting(@Nullable String, @Nullable String, @Nullable Object);
+ method public void fine(@Nullable String);
+ method public void fine(@NonNull java.util.function.Supplier<java.lang.String>);
+ method public void finer(@Nullable String);
+ method public void finer(@NonNull java.util.function.Supplier<java.lang.String>);
+ method public void finest(@Nullable String);
+ method public void finest(@NonNull java.util.function.Supplier<java.lang.String>);
+ method @NonNull public static java.util.logging.Logger getAnonymousLogger();
+ method @NonNull public static java.util.logging.Logger getAnonymousLogger(@Nullable String);
+ method @Nullable public java.util.logging.Filter getFilter();
+ method @NonNull public static final java.util.logging.Logger getGlobal();
method public java.util.logging.Handler[] getHandlers();
- method public java.util.logging.Level getLevel();
- method public static java.util.logging.Logger getLogger(java.lang.String);
- method public static java.util.logging.Logger getLogger(java.lang.String, java.lang.String);
- method public java.lang.String getName();
- method public java.util.logging.Logger getParent();
- method public java.util.ResourceBundle getResourceBundle();
- method public java.lang.String getResourceBundleName();
+ method @Nullable public java.util.logging.Level getLevel();
+ method @NonNull public static java.util.logging.Logger getLogger(@NonNull String);
+ method @NonNull public static java.util.logging.Logger getLogger(@NonNull String, @Nullable String);
+ method @Nullable public String getName();
+ method @Nullable public java.util.logging.Logger getParent();
+ method @Nullable public java.util.ResourceBundle getResourceBundle();
+ method @Nullable public String getResourceBundleName();
method public boolean getUseParentHandlers();
- method public void info(java.lang.String);
- method public void info(java.util.function.Supplier<java.lang.String>);
- method public boolean isLoggable(java.util.logging.Level);
- method public void log(java.util.logging.LogRecord);
- method public void log(java.util.logging.Level, java.lang.String);
- method public void log(java.util.logging.Level, java.util.function.Supplier<java.lang.String>);
- method public void log(java.util.logging.Level, java.lang.String, java.lang.Object);
- method public void log(java.util.logging.Level, java.lang.String, java.lang.Object[]);
- method public void log(java.util.logging.Level, java.lang.String, java.lang.Throwable);
- method public void log(java.util.logging.Level, java.lang.Throwable, java.util.function.Supplier<java.lang.String>);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.util.function.Supplier<java.lang.String>);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Object);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Object[]);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Throwable);
- method public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.Throwable, java.util.function.Supplier<java.lang.String>);
- method public deprecated void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public deprecated void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Object);
- method public deprecated void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Object[]);
- method public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.util.ResourceBundle, java.lang.String, java.lang.Object...);
- method public deprecated void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Throwable);
- method public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.util.ResourceBundle, java.lang.String, java.lang.Throwable);
- method public void removeHandler(java.util.logging.Handler) throws java.lang.SecurityException;
- method public void setFilter(java.util.logging.Filter) throws java.lang.SecurityException;
- method public void setLevel(java.util.logging.Level) throws java.lang.SecurityException;
- method public void setParent(java.util.logging.Logger);
- method public void setResourceBundle(java.util.ResourceBundle);
+ method public void info(@Nullable String);
+ method public void info(@NonNull java.util.function.Supplier<java.lang.String>);
+ method public boolean isLoggable(@NonNull java.util.logging.Level);
+ method public void log(@NonNull java.util.logging.LogRecord);
+ method public void log(@NonNull java.util.logging.Level, @Nullable String);
+ method public void log(@NonNull java.util.logging.Level, @NonNull java.util.function.Supplier<java.lang.String>);
+ method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object);
+ method public void log(@NonNull java.util.logging.Level, @Nullable String, Object[]);
+ method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Throwable);
+ method public void log(@NonNull java.util.logging.Level, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @NonNull java.util.function.Supplier<java.lang.String>);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable Object);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, Object[]);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable Throwable);
+ method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
+ method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String);
+ method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object);
+ method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, Object[]);
+ method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, java.lang.Object...);
+ method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Throwable);
+ method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable Throwable);
+ method public void removeHandler(@Nullable java.util.logging.Handler) throws java.lang.SecurityException;
+ method public void setFilter(@Nullable java.util.logging.Filter) throws java.lang.SecurityException;
+ method public void setLevel(@Nullable java.util.logging.Level) throws java.lang.SecurityException;
+ method public void setParent(@NonNull java.util.logging.Logger);
+ method public void setResourceBundle(@NonNull java.util.ResourceBundle);
method public void setUseParentHandlers(boolean);
- method public void severe(java.lang.String);
- method public void severe(java.util.function.Supplier<java.lang.String>);
- method public void throwing(java.lang.String, java.lang.String, java.lang.Throwable);
- method public void warning(java.lang.String);
- method public void warning(java.util.function.Supplier<java.lang.String>);
- field public static final java.lang.String GLOBAL_LOGGER_NAME = "global";
- field public static final deprecated java.util.logging.Logger global;
+ method public void severe(@Nullable String);
+ method public void severe(@NonNull java.util.function.Supplier<java.lang.String>);
+ method public void throwing(@Nullable String, @Nullable String, @Nullable Throwable);
+ method public void warning(@Nullable String);
+ method public void warning(@NonNull java.util.function.Supplier<java.lang.String>);
+ field @NonNull public static final String GLOBAL_LOGGER_NAME = "global";
+ field @Deprecated @NonNull public static final java.util.logging.Logger global;
}
- public abstract interface LoggingMXBean {
- method public abstract java.lang.String getLoggerLevel(java.lang.String);
- method public abstract java.util.List<java.lang.String> getLoggerNames();
- method public abstract java.lang.String getParentLoggerName(java.lang.String);
- method public abstract void setLoggerLevel(java.lang.String, java.lang.String);
+ public interface LoggingMXBean {
+ method public String getLoggerLevel(String);
+ method public java.util.List<java.lang.String> getLoggerNames();
+ method public String getParentLoggerName(String);
+ method public void setLoggerLevel(String, String);
}
public final class LoggingPermission extends java.security.BasicPermission {
- ctor public LoggingPermission(java.lang.String, java.lang.String) throws java.lang.IllegalArgumentException;
+ ctor public LoggingPermission(String, String) throws java.lang.IllegalArgumentException;
}
public class MemoryHandler extends java.util.logging.Handler {
@@ -72600,33 +72746,33 @@ package java.util.logging {
method public void close() throws java.lang.SecurityException;
method public void flush();
method public java.util.logging.Level getPushLevel();
- method public synchronized void publish(java.util.logging.LogRecord);
- method public synchronized void push();
- method public synchronized void setPushLevel(java.util.logging.Level) throws java.lang.SecurityException;
+ method public void publish(java.util.logging.LogRecord);
+ method public void push();
+ method public void setPushLevel(java.util.logging.Level) throws java.lang.SecurityException;
}
public class SimpleFormatter extends java.util.logging.Formatter {
ctor public SimpleFormatter();
- method public synchronized java.lang.String format(java.util.logging.LogRecord);
+ method public String format(java.util.logging.LogRecord);
}
public class SocketHandler extends java.util.logging.StreamHandler {
ctor public SocketHandler() throws java.io.IOException;
- ctor public SocketHandler(java.lang.String, int) throws java.io.IOException;
+ ctor public SocketHandler(String, int) throws java.io.IOException;
}
public class StreamHandler extends java.util.logging.Handler {
ctor public StreamHandler();
ctor public StreamHandler(java.io.OutputStream, java.util.logging.Formatter);
- method public synchronized void close() throws java.lang.SecurityException;
- method public synchronized void flush();
- method public synchronized void publish(java.util.logging.LogRecord);
- method protected synchronized void setOutputStream(java.io.OutputStream) throws java.lang.SecurityException;
+ method public void close() throws java.lang.SecurityException;
+ method public void flush();
+ method public void publish(java.util.logging.LogRecord);
+ method protected void setOutputStream(java.io.OutputStream) throws java.lang.SecurityException;
}
public class XMLFormatter extends java.util.logging.Formatter {
ctor public XMLFormatter();
- method public java.lang.String format(java.util.logging.LogRecord);
+ method public String format(java.util.logging.LogRecord);
}
}
@@ -72634,65 +72780,65 @@ package java.util.logging {
package java.util.prefs {
public abstract class AbstractPreferences extends java.util.prefs.Preferences {
- ctor protected AbstractPreferences(java.util.prefs.AbstractPreferences, java.lang.String);
- method public java.lang.String absolutePath();
+ ctor protected AbstractPreferences(java.util.prefs.AbstractPreferences, String);
+ method public String absolutePath();
method public void addNodeChangeListener(java.util.prefs.NodeChangeListener);
method public void addPreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
method protected final java.util.prefs.AbstractPreferences[] cachedChildren();
- method protected abstract java.util.prefs.AbstractPreferences childSpi(java.lang.String);
- method public java.lang.String[] childrenNames() throws java.util.prefs.BackingStoreException;
- method protected abstract java.lang.String[] childrenNamesSpi() throws java.util.prefs.BackingStoreException;
+ method protected abstract java.util.prefs.AbstractPreferences childSpi(String);
+ method public String[] childrenNames() throws java.util.prefs.BackingStoreException;
+ method protected abstract String[] childrenNamesSpi() throws java.util.prefs.BackingStoreException;
method public void clear() throws java.util.prefs.BackingStoreException;
method public void exportNode(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
method public void exportSubtree(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
method public void flush() throws java.util.prefs.BackingStoreException;
method protected abstract void flushSpi() throws java.util.prefs.BackingStoreException;
- method public java.lang.String get(java.lang.String, java.lang.String);
- method public boolean getBoolean(java.lang.String, boolean);
- method public byte[] getByteArray(java.lang.String, byte[]);
- method protected java.util.prefs.AbstractPreferences getChild(java.lang.String) throws java.util.prefs.BackingStoreException;
- method public double getDouble(java.lang.String, double);
- method public float getFloat(java.lang.String, float);
- method public int getInt(java.lang.String, int);
- method public long getLong(java.lang.String, long);
- method protected abstract java.lang.String getSpi(java.lang.String);
+ method public String get(String, String);
+ method public boolean getBoolean(String, boolean);
+ method public byte[] getByteArray(String, byte[]);
+ method protected java.util.prefs.AbstractPreferences getChild(String) throws java.util.prefs.BackingStoreException;
+ method public double getDouble(String, double);
+ method public float getFloat(String, float);
+ method public int getInt(String, int);
+ method public long getLong(String, long);
+ method protected abstract String getSpi(String);
method protected boolean isRemoved();
method public boolean isUserNode();
- method public java.lang.String[] keys() throws java.util.prefs.BackingStoreException;
- method protected abstract java.lang.String[] keysSpi() throws java.util.prefs.BackingStoreException;
- method public java.lang.String name();
- method public java.util.prefs.Preferences node(java.lang.String);
- method public boolean nodeExists(java.lang.String) throws java.util.prefs.BackingStoreException;
+ method public String[] keys() throws java.util.prefs.BackingStoreException;
+ method protected abstract String[] keysSpi() throws java.util.prefs.BackingStoreException;
+ method public String name();
+ method public java.util.prefs.Preferences node(String);
+ method public boolean nodeExists(String) throws java.util.prefs.BackingStoreException;
method public java.util.prefs.Preferences parent();
- method public void put(java.lang.String, java.lang.String);
- method public void putBoolean(java.lang.String, boolean);
- method public void putByteArray(java.lang.String, byte[]);
- method public void putDouble(java.lang.String, double);
- method public void putFloat(java.lang.String, float);
- method public void putInt(java.lang.String, int);
- method public void putLong(java.lang.String, long);
- method protected abstract void putSpi(java.lang.String, java.lang.String);
- method public void remove(java.lang.String);
+ method public void put(String, String);
+ method public void putBoolean(String, boolean);
+ method public void putByteArray(String, byte[]);
+ method public void putDouble(String, double);
+ method public void putFloat(String, float);
+ method public void putInt(String, int);
+ method public void putLong(String, long);
+ method protected abstract void putSpi(String, String);
+ method public void remove(String);
method public void removeNode() throws java.util.prefs.BackingStoreException;
method public void removeNodeChangeListener(java.util.prefs.NodeChangeListener);
method protected abstract void removeNodeSpi() throws java.util.prefs.BackingStoreException;
method public void removePreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
- method protected abstract void removeSpi(java.lang.String);
+ method protected abstract void removeSpi(String);
method public void sync() throws java.util.prefs.BackingStoreException;
method protected abstract void syncSpi() throws java.util.prefs.BackingStoreException;
- field protected final java.lang.Object lock;
+ field protected final Object lock;
field protected boolean newNode;
}
public class BackingStoreException extends java.lang.Exception {
- ctor public BackingStoreException(java.lang.String);
- ctor public BackingStoreException(java.lang.Throwable);
+ ctor public BackingStoreException(String);
+ ctor public BackingStoreException(Throwable);
}
public class InvalidPreferencesFormatException extends java.lang.Exception {
- ctor public InvalidPreferencesFormatException(java.lang.Throwable);
- ctor public InvalidPreferencesFormatException(java.lang.String);
- ctor public InvalidPreferencesFormatException(java.lang.String, java.lang.Throwable);
+ ctor public InvalidPreferencesFormatException(Throwable);
+ ctor public InvalidPreferencesFormatException(String);
+ ctor public InvalidPreferencesFormatException(String, Throwable);
}
public class NodeChangeEvent extends java.util.EventObject {
@@ -72701,135 +72847,135 @@ package java.util.prefs {
method public java.util.prefs.Preferences getParent();
}
- public abstract interface NodeChangeListener implements java.util.EventListener {
- method public abstract void childAdded(java.util.prefs.NodeChangeEvent);
- method public abstract void childRemoved(java.util.prefs.NodeChangeEvent);
+ public interface NodeChangeListener extends java.util.EventListener {
+ method public void childAdded(java.util.prefs.NodeChangeEvent);
+ method public void childRemoved(java.util.prefs.NodeChangeEvent);
}
public class PreferenceChangeEvent extends java.util.EventObject {
- ctor public PreferenceChangeEvent(java.util.prefs.Preferences, java.lang.String, java.lang.String);
- method public java.lang.String getKey();
- method public java.lang.String getNewValue();
+ ctor public PreferenceChangeEvent(java.util.prefs.Preferences, String, String);
+ method public String getKey();
+ method public String getNewValue();
method public java.util.prefs.Preferences getNode();
}
- public abstract interface PreferenceChangeListener implements java.util.EventListener {
- method public abstract void preferenceChange(java.util.prefs.PreferenceChangeEvent);
+ @java.lang.FunctionalInterface public interface PreferenceChangeListener extends java.util.EventListener {
+ method public void preferenceChange(java.util.prefs.PreferenceChangeEvent);
}
public abstract class Preferences {
ctor protected Preferences();
- method public abstract java.lang.String absolutePath();
+ method public abstract String absolutePath();
method public abstract void addNodeChangeListener(java.util.prefs.NodeChangeListener);
method public abstract void addPreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
- method public abstract java.lang.String[] childrenNames() throws java.util.prefs.BackingStoreException;
+ method public abstract String[] childrenNames() throws java.util.prefs.BackingStoreException;
method public abstract void clear() throws java.util.prefs.BackingStoreException;
method public abstract void exportNode(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
method public abstract void exportSubtree(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
method public abstract void flush() throws java.util.prefs.BackingStoreException;
- method public abstract java.lang.String get(java.lang.String, java.lang.String);
- method public abstract boolean getBoolean(java.lang.String, boolean);
- method public abstract byte[] getByteArray(java.lang.String, byte[]);
- method public abstract double getDouble(java.lang.String, double);
- method public abstract float getFloat(java.lang.String, float);
- method public abstract int getInt(java.lang.String, int);
- method public abstract long getLong(java.lang.String, long);
+ method public abstract String get(String, String);
+ method public abstract boolean getBoolean(String, boolean);
+ method public abstract byte[] getByteArray(String, byte[]);
+ method public abstract double getDouble(String, double);
+ method public abstract float getFloat(String, float);
+ method public abstract int getInt(String, int);
+ method public abstract long getLong(String, long);
method public static void importPreferences(java.io.InputStream) throws java.io.IOException, java.util.prefs.InvalidPreferencesFormatException;
method public abstract boolean isUserNode();
- method public abstract java.lang.String[] keys() throws java.util.prefs.BackingStoreException;
- method public abstract java.lang.String name();
- method public abstract java.util.prefs.Preferences node(java.lang.String);
- method public abstract boolean nodeExists(java.lang.String) throws java.util.prefs.BackingStoreException;
+ method public abstract String[] keys() throws java.util.prefs.BackingStoreException;
+ method public abstract String name();
+ method public abstract java.util.prefs.Preferences node(String);
+ method public abstract boolean nodeExists(String) throws java.util.prefs.BackingStoreException;
method public abstract java.util.prefs.Preferences parent();
- method public abstract void put(java.lang.String, java.lang.String);
- method public abstract void putBoolean(java.lang.String, boolean);
- method public abstract void putByteArray(java.lang.String, byte[]);
- method public abstract void putDouble(java.lang.String, double);
- method public abstract void putFloat(java.lang.String, float);
- method public abstract void putInt(java.lang.String, int);
- method public abstract void putLong(java.lang.String, long);
- method public abstract void remove(java.lang.String);
+ method public abstract void put(String, String);
+ method public abstract void putBoolean(String, boolean);
+ method public abstract void putByteArray(String, byte[]);
+ method public abstract void putDouble(String, double);
+ method public abstract void putFloat(String, float);
+ method public abstract void putInt(String, int);
+ method public abstract void putLong(String, long);
+ method public abstract void remove(String);
method public abstract void removeNode() throws java.util.prefs.BackingStoreException;
method public abstract void removeNodeChangeListener(java.util.prefs.NodeChangeListener);
method public abstract void removePreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
method public abstract void sync() throws java.util.prefs.BackingStoreException;
- method public static java.util.prefs.Preferences systemNodeForPackage(java.lang.Class<?>);
+ method public static java.util.prefs.Preferences systemNodeForPackage(Class<?>);
method public static java.util.prefs.Preferences systemRoot();
- method public abstract java.lang.String toString();
- method public static java.util.prefs.Preferences userNodeForPackage(java.lang.Class<?>);
+ method public abstract String toString();
+ method public static java.util.prefs.Preferences userNodeForPackage(Class<?>);
method public static java.util.prefs.Preferences userRoot();
field public static final int MAX_KEY_LENGTH = 80; // 0x50
field public static final int MAX_NAME_LENGTH = 80; // 0x50
field public static final int MAX_VALUE_LENGTH = 8192; // 0x2000
}
- public abstract interface PreferencesFactory {
- method public abstract java.util.prefs.Preferences systemRoot();
- method public abstract java.util.prefs.Preferences userRoot();
+ public interface PreferencesFactory {
+ method public java.util.prefs.Preferences systemRoot();
+ method public java.util.prefs.Preferences userRoot();
}
}
package java.util.regex {
- public abstract interface MatchResult {
- method public abstract int end();
- method public abstract int end(int);
- method public abstract java.lang.String group();
- method public abstract java.lang.String group(int);
- method public abstract int groupCount();
- method public abstract int start();
- method public abstract int start(int);
+ public interface MatchResult {
+ method public int end();
+ method public int end(int);
+ method public String group();
+ method public String group(int);
+ method public int groupCount();
+ method public int start();
+ method public int start(int);
}
public final class Matcher implements java.util.regex.MatchResult {
- method public java.util.regex.Matcher appendReplacement(java.lang.StringBuffer, java.lang.String);
- method public java.lang.StringBuffer appendTail(java.lang.StringBuffer);
+ method @NonNull public java.util.regex.Matcher appendReplacement(@NonNull StringBuffer, @NonNull String);
+ method @NonNull public StringBuffer appendTail(@NonNull StringBuffer);
method public int end();
method public int end(int);
- method public int end(java.lang.String);
+ method public int end(@NonNull String);
method public boolean find();
method public boolean find(int);
- method public java.lang.String group();
- method public java.lang.String group(int);
- method public java.lang.String group(java.lang.String);
+ method @NonNull public String group();
+ method @Nullable public String group(int);
+ method @Nullable public String group(@NonNull String);
method public int groupCount();
method public boolean hasAnchoringBounds();
method public boolean hasTransparentBounds();
method public boolean hitEnd();
method public boolean lookingAt();
method public boolean matches();
- method public java.util.regex.Pattern pattern();
- method public static java.lang.String quoteReplacement(java.lang.String);
- method public java.util.regex.Matcher region(int, int);
+ method @NonNull public java.util.regex.Pattern pattern();
+ method @NonNull public static String quoteReplacement(@NonNull String);
+ method @NonNull public java.util.regex.Matcher region(int, int);
method public int regionEnd();
method public int regionStart();
- method public java.lang.String replaceAll(java.lang.String);
- method public java.lang.String replaceFirst(java.lang.String);
+ method @NonNull public String replaceAll(@NonNull String);
+ method @NonNull public String replaceFirst(@NonNull String);
method public boolean requireEnd();
- method public java.util.regex.Matcher reset();
- method public java.util.regex.Matcher reset(java.lang.CharSequence);
+ method @NonNull public java.util.regex.Matcher reset();
+ method @NonNull public java.util.regex.Matcher reset(@NonNull CharSequence);
method public int start();
method public int start(int);
- method public int start(java.lang.String);
- method public java.util.regex.MatchResult toMatchResult();
- method public java.util.regex.Matcher useAnchoringBounds(boolean);
- method public java.util.regex.Matcher usePattern(java.util.regex.Pattern);
- method public java.util.regex.Matcher useTransparentBounds(boolean);
+ method public int start(@NonNull String);
+ method @NonNull public java.util.regex.MatchResult toMatchResult();
+ method @NonNull public java.util.regex.Matcher useAnchoringBounds(boolean);
+ method @NonNull public java.util.regex.Matcher usePattern(@NonNull java.util.regex.Pattern);
+ method @NonNull public java.util.regex.Matcher useTransparentBounds(boolean);
}
public final class Pattern implements java.io.Serializable {
- method public java.util.function.Predicate<java.lang.String> asPredicate();
- method public static java.util.regex.Pattern compile(java.lang.String);
- method public static java.util.regex.Pattern compile(java.lang.String, int);
+ method @NonNull public java.util.function.Predicate<java.lang.String> asPredicate();
+ method @NonNull public static java.util.regex.Pattern compile(@NonNull String);
+ method @NonNull public static java.util.regex.Pattern compile(@NonNull String, int);
method public int flags();
- method public java.util.regex.Matcher matcher(java.lang.CharSequence);
- method public static boolean matches(java.lang.String, java.lang.CharSequence);
- method public java.lang.String pattern();
- method public static java.lang.String quote(java.lang.String);
- method public java.lang.String[] split(java.lang.CharSequence, int);
- method public java.lang.String[] split(java.lang.CharSequence);
- method public java.util.stream.Stream<java.lang.String> splitAsStream(java.lang.CharSequence);
+ method @NonNull public java.util.regex.Matcher matcher(@NonNull CharSequence);
+ method public static boolean matches(@NonNull String, @NonNull CharSequence);
+ method @NonNull public String pattern();
+ method @NonNull public static String quote(@NonNull String);
+ method public String[] split(@NonNull CharSequence, int);
+ method public String[] split(@NonNull CharSequence);
+ method @NonNull public java.util.stream.Stream<java.lang.String> splitAsStream(@NonNull CharSequence);
field public static final int CANON_EQ = 128; // 0x80
field public static final int CASE_INSENSITIVE = 2; // 0x2
field public static final int COMMENTS = 4; // 0x4
@@ -72842,281 +72988,279 @@ package java.util.regex {
}
public class PatternSyntaxException extends java.lang.IllegalArgumentException {
- ctor public PatternSyntaxException(java.lang.String, java.lang.String, int);
- method public java.lang.String getDescription();
+ ctor public PatternSyntaxException(String, String, int);
+ method public String getDescription();
method public int getIndex();
- method public java.lang.String getPattern();
+ method public String getPattern();
}
}
package java.util.stream {
- public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable {
- method public abstract void close();
- method public abstract boolean isParallel();
- method public abstract java.util.Iterator<T> iterator();
- method public abstract S onClose(java.lang.Runnable);
- method public abstract S parallel();
- method public abstract S sequential();
- method public abstract java.util.Spliterator<T> spliterator();
- method public abstract S unordered();
- }
-
- public abstract interface Collector<T, A, R> {
- method public abstract java.util.function.BiConsumer<A, T> accumulator();
- method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics();
- method public abstract java.util.function.BinaryOperator<A> combiner();
- method public abstract java.util.function.Function<A, R> finisher();
- method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
- method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
- method public abstract java.util.function.Supplier<A> supplier();
- }
-
- public static final class Collector.Characteristics extends java.lang.Enum {
- method public static java.util.stream.Collector.Characteristics valueOf(java.lang.String);
- method public static final java.util.stream.Collector.Characteristics[] values();
+ public interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> extends java.lang.AutoCloseable {
+ method public void close();
+ method public boolean isParallel();
+ method public java.util.Iterator<T> iterator();
+ method public S onClose(Runnable);
+ method public S parallel();
+ method public S sequential();
+ method public java.util.Spliterator<T> spliterator();
+ method public S unordered();
+ }
+
+ public interface Collector<T, A, R> {
+ method public java.util.function.BiConsumer<A,T> accumulator();
+ method public java.util.Set<java.util.stream.Collector.Characteristics> characteristics();
+ method public java.util.function.BinaryOperator<A> combiner();
+ method public java.util.function.Function<A,R> finisher();
+ method public static <T, R> java.util.stream.Collector<T,R,R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R,T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
+ method public static <T, A, R> java.util.stream.Collector<T,A,R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A,T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A,R>, java.util.stream.Collector.Characteristics...);
+ method public java.util.function.Supplier<A> supplier();
+ }
+
+ public enum Collector.Characteristics {
enum_constant public static final java.util.stream.Collector.Characteristics CONCURRENT;
enum_constant public static final java.util.stream.Collector.Characteristics IDENTITY_FINISH;
enum_constant public static final java.util.stream.Collector.Characteristics UNORDERED;
}
public final class Collectors {
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
- method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting();
- method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
- method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
- method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
- method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
- method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
- method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
- method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining();
- method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence);
- method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
- method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
- method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
- method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
- method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
- method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
- method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
- method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
- method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
- method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList();
- method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
- method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
- method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
- method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
- }
-
- public abstract interface DoubleStream implements java.util.stream.BaseStream {
- method public abstract boolean allMatch(java.util.function.DoublePredicate);
- method public abstract boolean anyMatch(java.util.function.DoublePredicate);
- method public abstract java.util.OptionalDouble average();
- method public abstract java.util.stream.Stream<java.lang.Double> boxed();
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
+ method public static <T, A, R, RR> java.util.stream.Collector<T,A,RR> collectingAndThen(java.util.stream.Collector<T,A,R>, java.util.function.Function<R,RR>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Long> counting();
+ method public static <T, K> java.util.stream.Collector<T,?,java.util.Map<K,java.util.List<T>>> groupingBy(java.util.function.Function<? super T,? extends K>);
+ method public static <T, K, A, D> java.util.stream.Collector<T,?,java.util.Map<K,D>> groupingBy(java.util.function.Function<? super T,? extends K>, java.util.stream.Collector<? super T,A,D>);
+ method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T,?,M> groupingBy(java.util.function.Function<? super T,? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T,A,D>);
+ method public static <T, K> java.util.stream.Collector<T,?,java.util.concurrent.ConcurrentMap<K,java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T,? extends K>);
+ method public static <T, K, A, D> java.util.stream.Collector<T,?,java.util.concurrent.ConcurrentMap<K,D>> groupingByConcurrent(java.util.function.Function<? super T,? extends K>, java.util.stream.Collector<? super T,A,D>);
+ method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T,?,M> groupingByConcurrent(java.util.function.Function<? super T,? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T,A,D>);
+ method public static java.util.stream.Collector<java.lang.CharSequence,?,java.lang.String> joining();
+ method public static java.util.stream.Collector<java.lang.CharSequence,?,java.lang.String> joining(CharSequence);
+ method public static java.util.stream.Collector<java.lang.CharSequence,?,java.lang.String> joining(CharSequence, CharSequence, CharSequence);
+ method public static <T, U, A, R> java.util.stream.Collector<T,?,R> mapping(java.util.function.Function<? super T,? extends U>, java.util.stream.Collector<? super U,A,R>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.Map<java.lang.Boolean,java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
+ method public static <T, D, A> java.util.stream.Collector<T,?,java.util.Map<java.lang.Boolean,D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T,A,D>);
+ method public static <T> java.util.stream.Collector<T,?,T> reducing(T, java.util.function.BinaryOperator<T>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
+ method public static <T, U> java.util.stream.Collector<T,?,U> reducing(U, java.util.function.Function<? super T,? extends U>, java.util.function.BinaryOperator<U>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
+ method public static <T> java.util.stream.Collector<T,?,java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
+ method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T,?,C> toCollection(java.util.function.Supplier<C>);
+ method public static <T, K, U> java.util.stream.Collector<T,?,java.util.concurrent.ConcurrentMap<K,U>> toConcurrentMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>);
+ method public static <T, K, U> java.util.stream.Collector<T,?,java.util.concurrent.ConcurrentMap<K,U>> toConcurrentMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>, java.util.function.BinaryOperator<U>);
+ method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T,?,M> toConcurrentMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.List<T>> toList();
+ method public static <T, K, U> java.util.stream.Collector<T,?,java.util.Map<K,U>> toMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>);
+ method public static <T, K, U> java.util.stream.Collector<T,?,java.util.Map<K,U>> toMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>, java.util.function.BinaryOperator<U>);
+ method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T,?,M> toMap(java.util.function.Function<? super T,? extends K>, java.util.function.Function<? super T,? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+ method public static <T> java.util.stream.Collector<T,?,java.util.Set<T>> toSet();
+ }
+
+ public interface DoubleStream extends java.util.stream.BaseStream<java.lang.Double,java.util.stream.DoubleStream> {
+ method public boolean allMatch(java.util.function.DoublePredicate);
+ method public boolean anyMatch(java.util.function.DoublePredicate);
+ method public java.util.OptionalDouble average();
+ method public java.util.stream.Stream<java.lang.Double> boxed();
method public static java.util.stream.DoubleStream.Builder builder();
- method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
+ method public <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R,R>);
method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
- method public abstract long count();
- method public abstract java.util.stream.DoubleStream distinct();
+ method public long count();
+ method public java.util.stream.DoubleStream distinct();
method public static java.util.stream.DoubleStream empty();
- method public abstract java.util.stream.DoubleStream filter(java.util.function.DoublePredicate);
- method public abstract java.util.OptionalDouble findAny();
- method public abstract java.util.OptionalDouble findFirst();
- method public abstract java.util.stream.DoubleStream flatMap(java.util.function.DoubleFunction<? extends java.util.stream.DoubleStream>);
- method public abstract void forEach(java.util.function.DoubleConsumer);
- method public abstract void forEachOrdered(java.util.function.DoubleConsumer);
+ method public java.util.stream.DoubleStream filter(java.util.function.DoublePredicate);
+ method public java.util.OptionalDouble findAny();
+ method public java.util.OptionalDouble findFirst();
+ method public java.util.stream.DoubleStream flatMap(java.util.function.DoubleFunction<? extends java.util.stream.DoubleStream>);
+ method public void forEach(java.util.function.DoubleConsumer);
+ method public void forEachOrdered(java.util.function.DoubleConsumer);
method public static java.util.stream.DoubleStream generate(java.util.function.DoubleSupplier);
method public static java.util.stream.DoubleStream iterate(double, java.util.function.DoubleUnaryOperator);
- method public abstract java.util.PrimitiveIterator.OfDouble iterator();
- method public abstract java.util.stream.DoubleStream limit(long);
- method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
- method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
- method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
- method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
- method public abstract java.util.OptionalDouble max();
- method public abstract java.util.OptionalDouble min();
- method public abstract boolean noneMatch(java.util.function.DoublePredicate);
+ method public java.util.PrimitiveIterator.OfDouble iterator();
+ method public java.util.stream.DoubleStream limit(long);
+ method public java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
+ method public java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
+ method public java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
+ method public <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
+ method public java.util.OptionalDouble max();
+ method public java.util.OptionalDouble min();
+ method public boolean noneMatch(java.util.function.DoublePredicate);
method public static java.util.stream.DoubleStream of(double);
method public static java.util.stream.DoubleStream of(double...);
- method public abstract java.util.stream.DoubleStream parallel();
- method public abstract java.util.stream.DoubleStream peek(java.util.function.DoubleConsumer);
- method public abstract double reduce(double, java.util.function.DoubleBinaryOperator);
- method public abstract java.util.OptionalDouble reduce(java.util.function.DoubleBinaryOperator);
- method public abstract java.util.stream.DoubleStream sequential();
- method public abstract java.util.stream.DoubleStream skip(long);
- method public abstract java.util.stream.DoubleStream sorted();
- method public abstract java.util.Spliterator.OfDouble spliterator();
- method public abstract double sum();
- method public abstract java.util.DoubleSummaryStatistics summaryStatistics();
- method public abstract double[] toArray();
- }
-
- public static abstract interface DoubleStream.Builder implements java.util.function.DoubleConsumer {
+ method public java.util.stream.DoubleStream parallel();
+ method public java.util.stream.DoubleStream peek(java.util.function.DoubleConsumer);
+ method public double reduce(double, java.util.function.DoubleBinaryOperator);
+ method public java.util.OptionalDouble reduce(java.util.function.DoubleBinaryOperator);
+ method public java.util.stream.DoubleStream sequential();
+ method public java.util.stream.DoubleStream skip(long);
+ method public java.util.stream.DoubleStream sorted();
+ method public java.util.Spliterator.OfDouble spliterator();
+ method public double sum();
+ method public java.util.DoubleSummaryStatistics summaryStatistics();
+ method public double[] toArray();
+ }
+
+ public static interface DoubleStream.Builder extends java.util.function.DoubleConsumer {
method public default java.util.stream.DoubleStream.Builder add(double);
- method public abstract java.util.stream.DoubleStream build();
+ method public java.util.stream.DoubleStream build();
}
- public abstract interface IntStream implements java.util.stream.BaseStream {
- method public abstract boolean allMatch(java.util.function.IntPredicate);
- method public abstract boolean anyMatch(java.util.function.IntPredicate);
- method public abstract java.util.stream.DoubleStream asDoubleStream();
- method public abstract java.util.stream.LongStream asLongStream();
- method public abstract java.util.OptionalDouble average();
- method public abstract java.util.stream.Stream<java.lang.Integer> boxed();
+ public interface IntStream extends java.util.stream.BaseStream<java.lang.Integer,java.util.stream.IntStream> {
+ method public boolean allMatch(java.util.function.IntPredicate);
+ method public boolean anyMatch(java.util.function.IntPredicate);
+ method public java.util.stream.DoubleStream asDoubleStream();
+ method public java.util.stream.LongStream asLongStream();
+ method public java.util.OptionalDouble average();
+ method public java.util.stream.Stream<java.lang.Integer> boxed();
method public static java.util.stream.IntStream.Builder builder();
- method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
+ method public <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R,R>);
method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
- method public abstract long count();
- method public abstract java.util.stream.IntStream distinct();
+ method public long count();
+ method public java.util.stream.IntStream distinct();
method public static java.util.stream.IntStream empty();
- method public abstract java.util.stream.IntStream filter(java.util.function.IntPredicate);
- method public abstract java.util.OptionalInt findAny();
- method public abstract java.util.OptionalInt findFirst();
- method public abstract java.util.stream.IntStream flatMap(java.util.function.IntFunction<? extends java.util.stream.IntStream>);
- method public abstract void forEach(java.util.function.IntConsumer);
- method public abstract void forEachOrdered(java.util.function.IntConsumer);
+ method public java.util.stream.IntStream filter(java.util.function.IntPredicate);
+ method public java.util.OptionalInt findAny();
+ method public java.util.OptionalInt findFirst();
+ method public java.util.stream.IntStream flatMap(java.util.function.IntFunction<? extends java.util.stream.IntStream>);
+ method public void forEach(java.util.function.IntConsumer);
+ method public void forEachOrdered(java.util.function.IntConsumer);
method public static java.util.stream.IntStream generate(java.util.function.IntSupplier);
method public static java.util.stream.IntStream iterate(int, java.util.function.IntUnaryOperator);
- method public abstract java.util.PrimitiveIterator.OfInt iterator();
- method public abstract java.util.stream.IntStream limit(long);
- method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
- method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
- method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
- method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
- method public abstract java.util.OptionalInt max();
- method public abstract java.util.OptionalInt min();
- method public abstract boolean noneMatch(java.util.function.IntPredicate);
+ method public java.util.PrimitiveIterator.OfInt iterator();
+ method public java.util.stream.IntStream limit(long);
+ method public java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
+ method public java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
+ method public java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
+ method public <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
+ method public java.util.OptionalInt max();
+ method public java.util.OptionalInt min();
+ method public boolean noneMatch(java.util.function.IntPredicate);
method public static java.util.stream.IntStream of(int);
method public static java.util.stream.IntStream of(int...);
- method public abstract java.util.stream.IntStream parallel();
- method public abstract java.util.stream.IntStream peek(java.util.function.IntConsumer);
+ method public java.util.stream.IntStream parallel();
+ method public java.util.stream.IntStream peek(java.util.function.IntConsumer);
method public static java.util.stream.IntStream range(int, int);
method public static java.util.stream.IntStream rangeClosed(int, int);
- method public abstract int reduce(int, java.util.function.IntBinaryOperator);
- method public abstract java.util.OptionalInt reduce(java.util.function.IntBinaryOperator);
- method public abstract java.util.stream.IntStream sequential();
- method public abstract java.util.stream.IntStream skip(long);
- method public abstract java.util.stream.IntStream sorted();
- method public abstract java.util.Spliterator.OfInt spliterator();
- method public abstract int sum();
- method public abstract java.util.IntSummaryStatistics summaryStatistics();
- method public abstract int[] toArray();
- }
-
- public static abstract interface IntStream.Builder implements java.util.function.IntConsumer {
+ method public int reduce(int, java.util.function.IntBinaryOperator);
+ method public java.util.OptionalInt reduce(java.util.function.IntBinaryOperator);
+ method public java.util.stream.IntStream sequential();
+ method public java.util.stream.IntStream skip(long);
+ method public java.util.stream.IntStream sorted();
+ method public java.util.Spliterator.OfInt spliterator();
+ method public int sum();
+ method public java.util.IntSummaryStatistics summaryStatistics();
+ method public int[] toArray();
+ }
+
+ public static interface IntStream.Builder extends java.util.function.IntConsumer {
method public default java.util.stream.IntStream.Builder add(int);
- method public abstract java.util.stream.IntStream build();
+ method public java.util.stream.IntStream build();
}
- public abstract interface LongStream implements java.util.stream.BaseStream {
- method public abstract boolean allMatch(java.util.function.LongPredicate);
- method public abstract boolean anyMatch(java.util.function.LongPredicate);
- method public abstract java.util.stream.DoubleStream asDoubleStream();
- method public abstract java.util.OptionalDouble average();
- method public abstract java.util.stream.Stream<java.lang.Long> boxed();
+ public interface LongStream extends java.util.stream.BaseStream<java.lang.Long,java.util.stream.LongStream> {
+ method public boolean allMatch(java.util.function.LongPredicate);
+ method public boolean anyMatch(java.util.function.LongPredicate);
+ method public java.util.stream.DoubleStream asDoubleStream();
+ method public java.util.OptionalDouble average();
+ method public java.util.stream.Stream<java.lang.Long> boxed();
method public static java.util.stream.LongStream.Builder builder();
- method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
+ method public <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R,R>);
method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
- method public abstract long count();
- method public abstract java.util.stream.LongStream distinct();
+ method public long count();
+ method public java.util.stream.LongStream distinct();
method public static java.util.stream.LongStream empty();
- method public abstract java.util.stream.LongStream filter(java.util.function.LongPredicate);
- method public abstract java.util.OptionalLong findAny();
- method public abstract java.util.OptionalLong findFirst();
- method public abstract java.util.stream.LongStream flatMap(java.util.function.LongFunction<? extends java.util.stream.LongStream>);
- method public abstract void forEach(java.util.function.LongConsumer);
- method public abstract void forEachOrdered(java.util.function.LongConsumer);
+ method public java.util.stream.LongStream filter(java.util.function.LongPredicate);
+ method public java.util.OptionalLong findAny();
+ method public java.util.OptionalLong findFirst();
+ method public java.util.stream.LongStream flatMap(java.util.function.LongFunction<? extends java.util.stream.LongStream>);
+ method public void forEach(java.util.function.LongConsumer);
+ method public void forEachOrdered(java.util.function.LongConsumer);
method public static java.util.stream.LongStream generate(java.util.function.LongSupplier);
method public static java.util.stream.LongStream iterate(long, java.util.function.LongUnaryOperator);
- method public abstract java.util.PrimitiveIterator.OfLong iterator();
- method public abstract java.util.stream.LongStream limit(long);
- method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
- method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
- method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
- method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
- method public abstract java.util.OptionalLong max();
- method public abstract java.util.OptionalLong min();
- method public abstract boolean noneMatch(java.util.function.LongPredicate);
+ method public java.util.PrimitiveIterator.OfLong iterator();
+ method public java.util.stream.LongStream limit(long);
+ method public java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
+ method public java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
+ method public java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
+ method public <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
+ method public java.util.OptionalLong max();
+ method public java.util.OptionalLong min();
+ method public boolean noneMatch(java.util.function.LongPredicate);
method public static java.util.stream.LongStream of(long);
method public static java.util.stream.LongStream of(long...);
- method public abstract java.util.stream.LongStream parallel();
- method public abstract java.util.stream.LongStream peek(java.util.function.LongConsumer);
+ method public java.util.stream.LongStream parallel();
+ method public java.util.stream.LongStream peek(java.util.function.LongConsumer);
method public static java.util.stream.LongStream range(long, long);
method public static java.util.stream.LongStream rangeClosed(long, long);
- method public abstract long reduce(long, java.util.function.LongBinaryOperator);
- method public abstract java.util.OptionalLong reduce(java.util.function.LongBinaryOperator);
- method public abstract java.util.stream.LongStream sequential();
- method public abstract java.util.stream.LongStream skip(long);
- method public abstract java.util.stream.LongStream sorted();
- method public abstract java.util.Spliterator.OfLong spliterator();
- method public abstract long sum();
- method public abstract java.util.LongSummaryStatistics summaryStatistics();
- method public abstract long[] toArray();
- }
-
- public static abstract interface LongStream.Builder implements java.util.function.LongConsumer {
+ method public long reduce(long, java.util.function.LongBinaryOperator);
+ method public java.util.OptionalLong reduce(java.util.function.LongBinaryOperator);
+ method public java.util.stream.LongStream sequential();
+ method public java.util.stream.LongStream skip(long);
+ method public java.util.stream.LongStream sorted();
+ method public java.util.Spliterator.OfLong spliterator();
+ method public long sum();
+ method public java.util.LongSummaryStatistics summaryStatistics();
+ method public long[] toArray();
+ }
+
+ public static interface LongStream.Builder extends java.util.function.LongConsumer {
method public default java.util.stream.LongStream.Builder add(long);
- method public abstract java.util.stream.LongStream build();
+ method public java.util.stream.LongStream build();
}
- public abstract interface Stream<T> implements java.util.stream.BaseStream {
- method public abstract boolean allMatch(java.util.function.Predicate<? super T>);
- method public abstract boolean anyMatch(java.util.function.Predicate<? super T>);
+ public interface Stream<T> extends java.util.stream.BaseStream<T,java.util.stream.Stream<T>> {
+ method public boolean allMatch(java.util.function.Predicate<? super T>);
+ method public boolean anyMatch(java.util.function.Predicate<? super T>);
method public static <T> java.util.stream.Stream.Builder<T> builder();
- method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
- method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>);
+ method public <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R,? super T>, java.util.function.BiConsumer<R,R>);
+ method public <R, A> R collect(java.util.stream.Collector<? super T,A,R>);
method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
- method public abstract long count();
- method public abstract java.util.stream.Stream<T> distinct();
+ method public long count();
+ method public java.util.stream.Stream<T> distinct();
method public static <T> java.util.stream.Stream<T> empty();
- method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>);
- method public abstract java.util.Optional<T> findAny();
- method public abstract java.util.Optional<T> findFirst();
- method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
- method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>);
- method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>);
- method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>);
- method public abstract void forEach(java.util.function.Consumer<? super T>);
- method public abstract void forEachOrdered(java.util.function.Consumer<? super T>);
+ method public java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>);
+ method public java.util.Optional<T> findAny();
+ method public java.util.Optional<T> findFirst();
+ method public <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T,? extends java.util.stream.Stream<? extends R>>);
+ method public java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T,? extends java.util.stream.DoubleStream>);
+ method public java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T,? extends java.util.stream.IntStream>);
+ method public java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T,? extends java.util.stream.LongStream>);
+ method public void forEach(java.util.function.Consumer<? super T>);
+ method public void forEachOrdered(java.util.function.Consumer<? super T>);
method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
- method public abstract java.util.stream.Stream<T> limit(long);
- method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
- method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>);
- method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>);
- method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>);
- method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>);
- method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>);
- method public abstract boolean noneMatch(java.util.function.Predicate<? super T>);
+ method public java.util.stream.Stream<T> limit(long);
+ method public <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T,? extends R>);
+ method public java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>);
+ method public java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>);
+ method public java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>);
+ method public java.util.Optional<T> max(java.util.Comparator<? super T>);
+ method public java.util.Optional<T> min(java.util.Comparator<? super T>);
+ method public boolean noneMatch(java.util.function.Predicate<? super T>);
method public static <T> java.util.stream.Stream<T> of(T);
- method public static <T> java.util.stream.Stream<T> of(T...);
- method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>);
- method public abstract T reduce(T, java.util.function.BinaryOperator<T>);
- method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>);
- method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
- method public abstract java.util.stream.Stream<T> skip(long);
- method public abstract java.util.stream.Stream<T> sorted();
- method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>);
- method public abstract java.lang.Object[] toArray();
- method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>);
- }
-
- public static abstract interface Stream.Builder<T> implements java.util.function.Consumer {
+ method @java.lang.SafeVarargs public static <T> java.util.stream.Stream<T> of(T...);
+ method public java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>);
+ method public T reduce(T, java.util.function.BinaryOperator<T>);
+ method public java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>);
+ method public <U> U reduce(U, java.util.function.BiFunction<U,? super T,U>, java.util.function.BinaryOperator<U>);
+ method public java.util.stream.Stream<T> skip(long);
+ method public java.util.stream.Stream<T> sorted();
+ method public java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>);
+ method public Object[] toArray();
+ method public <A> A[] toArray(java.util.function.IntFunction<A[]>);
+ }
+
+ public static interface Stream.Builder<T> extends java.util.function.Consumer<T> {
method public default java.util.stream.Stream.Builder<T> add(T);
- method public abstract java.util.stream.Stream<T> build();
+ method public java.util.stream.Stream<T> build();
}
public final class StreamSupport {
@@ -73164,16 +73308,16 @@ package java.util.zip {
method public java.util.zip.Checksum getChecksum();
}
- public abstract interface Checksum {
- method public abstract long getValue();
- method public abstract void reset();
- method public abstract void update(int);
- method public abstract void update(byte[], int, int);
+ public interface Checksum {
+ method public long getValue();
+ method public void reset();
+ method public void update(int);
+ method public void update(byte[], int, int);
}
public class DataFormatException extends java.lang.Exception {
ctor public DataFormatException();
- ctor public DataFormatException(java.lang.String);
+ ctor public DataFormatException(String);
}
public class Deflater {
@@ -73217,8 +73361,6 @@ package java.util.zip {
ctor public DeflaterInputStream(java.io.InputStream);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater, int);
- method public void mark(int);
- method public void reset() throws java.io.IOException;
field protected final byte[] buf;
field protected final java.util.zip.Deflater def;
}
@@ -73249,7 +73391,6 @@ package java.util.zip {
ctor public GZIPOutputStream(java.io.OutputStream, int, boolean) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream, boolean) throws java.io.IOException;
- method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected java.util.zip.CRC32 crc;
}
@@ -73282,7 +73423,7 @@ package java.util.zip {
ctor public InflaterInputStream(java.io.InputStream);
method protected void fill() throws java.io.IOException;
field protected byte[] buf;
- field protected deprecated boolean closed;
+ field @Deprecated protected boolean closed;
field protected java.util.zip.Inflater inf;
field protected int len;
}
@@ -73297,10 +73438,10 @@ package java.util.zip {
}
public class ZipEntry implements java.lang.Cloneable {
- ctor public ZipEntry(java.lang.String);
+ ctor public ZipEntry(String);
ctor public ZipEntry(java.util.zip.ZipEntry);
- method public java.lang.Object clone();
- method public java.lang.String getComment();
+ method public Object clone();
+ method public String getComment();
method public long getCompressedSize();
method public long getCrc();
method public java.nio.file.attribute.FileTime getCreationTime();
@@ -73308,11 +73449,11 @@ package java.util.zip {
method public java.nio.file.attribute.FileTime getLastAccessTime();
method public java.nio.file.attribute.FileTime getLastModifiedTime();
method public int getMethod();
- method public java.lang.String getName();
+ method public String getName();
method public long getSize();
method public long getTime();
method public boolean isDirectory();
- method public void setComment(java.lang.String);
+ method public void setComment(String);
method public void setCompressedSize(long);
method public void setCrc(long);
method public java.util.zip.ZipEntry setCreationTime(java.nio.file.attribute.FileTime);
@@ -73367,28 +73508,28 @@ package java.util.zip {
}
public class ZipError extends java.lang.InternalError {
- ctor public ZipError(java.lang.String);
+ ctor public ZipError(String);
}
public class ZipException extends java.io.IOException {
ctor public ZipException();
- ctor public ZipException(java.lang.String);
+ ctor public ZipException(String);
}
public class ZipFile implements java.io.Closeable {
- ctor public ZipFile(java.lang.String) throws java.io.IOException;
+ ctor public ZipFile(String) throws java.io.IOException;
ctor public ZipFile(java.io.File, int) throws java.io.IOException;
ctor public ZipFile(java.io.File) throws java.io.IOException, java.util.zip.ZipException;
ctor public ZipFile(java.io.File, int, java.nio.charset.Charset) throws java.io.IOException;
- ctor public ZipFile(java.lang.String, java.nio.charset.Charset) throws java.io.IOException;
+ ctor public ZipFile(String, java.nio.charset.Charset) throws java.io.IOException;
ctor public ZipFile(java.io.File, java.nio.charset.Charset) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<? extends java.util.zip.ZipEntry> entries();
method protected void finalize() throws java.io.IOException;
- method public java.lang.String getComment();
- method public java.util.zip.ZipEntry getEntry(java.lang.String);
+ method public String getComment();
+ method public java.util.zip.ZipEntry getEntry(String);
method public java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
- method public java.lang.String getName();
+ method public String getName();
method public int size();
method public java.util.stream.Stream<? extends java.util.zip.ZipEntry> stream();
field public static final int CENATT = 36; // 0x24
@@ -73439,7 +73580,7 @@ package java.util.zip {
ctor public ZipInputStream(java.io.InputStream);
ctor public ZipInputStream(java.io.InputStream, java.nio.charset.Charset);
method public void closeEntry() throws java.io.IOException;
- method protected java.util.zip.ZipEntry createZipEntry(java.lang.String);
+ method protected java.util.zip.ZipEntry createZipEntry(String);
method public java.util.zip.ZipEntry getNextEntry() throws java.io.IOException;
field public static final int CENATT = 36; // 0x24
field public static final int CENATX = 38; // 0x26
@@ -73488,10 +73629,9 @@ package java.util.zip {
ctor public ZipOutputStream(java.io.OutputStream, java.nio.charset.Charset);
method public void closeEntry() throws java.io.IOException;
method public void putNextEntry(java.util.zip.ZipEntry) throws java.io.IOException;
- method public void setComment(java.lang.String);
+ method public void setComment(String);
method public void setLevel(int);
method public void setMethod(int);
- method public synchronized void write(byte[], int, int) throws java.io.IOException;
field public static final int CENATT = 36; // 0x24
field public static final int CENATX = 38; // 0x26
field public static final int CENCOM = 32; // 0x20
@@ -73542,16 +73682,16 @@ package javax.crypto {
public class AEADBadTagException extends javax.crypto.BadPaddingException {
ctor public AEADBadTagException();
- ctor public AEADBadTagException(java.lang.String);
+ ctor public AEADBadTagException(String);
}
public class BadPaddingException extends java.security.GeneralSecurityException {
ctor public BadPaddingException();
- ctor public BadPaddingException(java.lang.String);
+ ctor public BadPaddingException(String);
}
public class Cipher {
- ctor protected Cipher(javax.crypto.CipherSpi, java.security.Provider, java.lang.String);
+ ctor protected Cipher(javax.crypto.CipherSpi, java.security.Provider, String);
method public final byte[] doFinal() throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
method public final int doFinal(byte[], int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
method public final byte[] doFinal(byte[]) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
@@ -73559,15 +73699,15 @@ package javax.crypto {
method public final int doFinal(byte[], int, int, byte[]) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
method public final int doFinal(byte[], int, int, byte[], int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
method public final int doFinal(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
- method public final java.lang.String getAlgorithm();
+ method public final String getAlgorithm();
method public final int getBlockSize();
method public final javax.crypto.ExemptionMechanism getExemptionMechanism();
method public final byte[] getIV();
- method public static final javax.crypto.Cipher getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
- method public static final javax.crypto.Cipher getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException, java.security.NoSuchProviderException;
- method public static final javax.crypto.Cipher getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
- method public static final int getMaxAllowedKeyLength(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final java.security.spec.AlgorithmParameterSpec getMaxAllowedParameterSpec(java.lang.String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.Cipher getInstance(String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
+ method public static final javax.crypto.Cipher getInstance(String, String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.Cipher getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
+ method public static final int getMaxAllowedKeyLength(String) throws java.security.NoSuchAlgorithmException;
+ method public static final java.security.spec.AlgorithmParameterSpec getMaxAllowedParameterSpec(String) throws java.security.NoSuchAlgorithmException;
method public final int getOutputSize(int);
method public final java.security.AlgorithmParameters getParameters();
method public final java.security.Provider getProvider();
@@ -73579,7 +73719,7 @@ package javax.crypto {
method public final void init(int, java.security.Key, java.security.AlgorithmParameters, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
method public final void init(int, java.security.cert.Certificate) throws java.security.InvalidKeyException;
method public final void init(int, java.security.cert.Certificate, java.security.SecureRandom) throws java.security.InvalidKeyException;
- method public final java.security.Key unwrap(byte[], java.lang.String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
+ method public final java.security.Key unwrap(byte[], String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
method public final byte[] update(byte[]);
method public final byte[] update(byte[], int, int);
method public final int update(byte[], int, int, byte[]) throws javax.crypto.ShortBufferException;
@@ -73621,9 +73761,9 @@ package javax.crypto {
method protected abstract void engineInit(int, java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
method protected abstract void engineInit(int, java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
method protected abstract void engineInit(int, java.security.Key, java.security.AlgorithmParameters, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
- method protected abstract void engineSetMode(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method protected abstract void engineSetPadding(java.lang.String) throws javax.crypto.NoSuchPaddingException;
- method protected java.security.Key engineUnwrap(byte[], java.lang.String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
+ method protected abstract void engineSetMode(String) throws java.security.NoSuchAlgorithmException;
+ method protected abstract void engineSetPadding(String) throws javax.crypto.NoSuchPaddingException;
+ method protected java.security.Key engineUnwrap(byte[], String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
method protected abstract byte[] engineUpdate(byte[], int, int);
method protected abstract int engineUpdate(byte[], int, int, byte[], int) throws javax.crypto.ShortBufferException;
method protected int engineUpdate(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.ShortBufferException;
@@ -73634,27 +73774,27 @@ package javax.crypto {
public class EncryptedPrivateKeyInfo {
ctor public EncryptedPrivateKeyInfo(byte[]) throws java.io.IOException;
- ctor public EncryptedPrivateKeyInfo(java.lang.String, byte[]) throws java.security.NoSuchAlgorithmException;
+ ctor public EncryptedPrivateKeyInfo(String, byte[]) throws java.security.NoSuchAlgorithmException;
ctor public EncryptedPrivateKeyInfo(java.security.AlgorithmParameters, byte[]) throws java.security.NoSuchAlgorithmException;
- method public java.lang.String getAlgName();
+ method public String getAlgName();
method public java.security.AlgorithmParameters getAlgParameters();
method public byte[] getEncoded() throws java.io.IOException;
method public byte[] getEncryptedData();
method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(javax.crypto.Cipher) throws java.security.spec.InvalidKeySpecException;
method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
- method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key, java.lang.String) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key, String) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key, java.security.Provider) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
}
public class ExemptionMechanism {
- ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, java.lang.String);
+ ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, String);
method public final byte[] genExemptionBlob() throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException;
method public final int genExemptionBlob(byte[]) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
method public final int genExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
- method public static final javax.crypto.ExemptionMechanism getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.crypto.ExemptionMechanism getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.crypto.ExemptionMechanism getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final java.lang.String getName();
+ method public static final javax.crypto.ExemptionMechanism getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.ExemptionMechanism getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.ExemptionMechanism getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getName();
method public final int getOutputSize(int) throws java.lang.IllegalStateException;
method public final java.security.Provider getProvider();
method public final void init(java.security.Key) throws javax.crypto.ExemptionMechanismException, java.security.InvalidKeyException;
@@ -73665,7 +73805,7 @@ package javax.crypto {
public class ExemptionMechanismException extends java.security.GeneralSecurityException {
ctor public ExemptionMechanismException();
- ctor public ExemptionMechanismException(java.lang.String);
+ ctor public ExemptionMechanismException(String);
}
public abstract class ExemptionMechanismSpi {
@@ -73680,19 +73820,19 @@ package javax.crypto {
public class IllegalBlockSizeException extends java.security.GeneralSecurityException {
ctor public IllegalBlockSizeException();
- ctor public IllegalBlockSizeException(java.lang.String);
+ ctor public IllegalBlockSizeException(String);
}
public class KeyAgreement {
- ctor protected KeyAgreement(javax.crypto.KeyAgreementSpi, java.security.Provider, java.lang.String);
+ ctor protected KeyAgreement(javax.crypto.KeyAgreementSpi, java.security.Provider, String);
method public final java.security.Key doPhase(java.security.Key, boolean) throws java.lang.IllegalStateException, java.security.InvalidKeyException;
method public final byte[] generateSecret() throws java.lang.IllegalStateException;
method public final int generateSecret(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
- method public final javax.crypto.SecretKey generateSecret(java.lang.String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
- method public final java.lang.String getAlgorithm();
- method public static final javax.crypto.KeyAgreement getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.crypto.KeyAgreement getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.crypto.KeyAgreement getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final javax.crypto.SecretKey generateSecret(String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
+ method public final String getAlgorithm();
+ method public static final javax.crypto.KeyAgreement getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.KeyAgreement getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.KeyAgreement getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final void init(java.security.Key) throws java.security.InvalidKeyException;
method public final void init(java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
@@ -73705,18 +73845,18 @@ package javax.crypto {
method protected abstract java.security.Key engineDoPhase(java.security.Key, boolean) throws java.lang.IllegalStateException, java.security.InvalidKeyException;
method protected abstract byte[] engineGenerateSecret() throws java.lang.IllegalStateException;
method protected abstract int engineGenerateSecret(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
- method protected abstract javax.crypto.SecretKey engineGenerateSecret(java.lang.String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
+ method protected abstract javax.crypto.SecretKey engineGenerateSecret(String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
method protected abstract void engineInit(java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
method protected abstract void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
}
public class KeyGenerator {
- ctor protected KeyGenerator(javax.crypto.KeyGeneratorSpi, java.security.Provider, java.lang.String);
+ ctor protected KeyGenerator(javax.crypto.KeyGeneratorSpi, java.security.Provider, String);
method public final javax.crypto.SecretKey generateKey();
- method public final java.lang.String getAlgorithm();
- method public static final javax.crypto.KeyGenerator getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.crypto.KeyGenerator getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.crypto.KeyGenerator getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getAlgorithm();
+ method public static final javax.crypto.KeyGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.KeyGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.KeyGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final void init(java.security.SecureRandom);
method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
@@ -73734,15 +73874,15 @@ package javax.crypto {
}
public class Mac implements java.lang.Cloneable {
- ctor protected Mac(javax.crypto.MacSpi, java.security.Provider, java.lang.String);
- method public final java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ ctor protected Mac(javax.crypto.MacSpi, java.security.Provider, String);
+ method public final Object clone() throws java.lang.CloneNotSupportedException;
method public final byte[] doFinal() throws java.lang.IllegalStateException;
method public final void doFinal(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
method public final byte[] doFinal(byte[]) throws java.lang.IllegalStateException;
- method public final java.lang.String getAlgorithm();
- method public static final javax.crypto.Mac getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.crypto.Mac getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.crypto.Mac getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getAlgorithm();
+ method public static final javax.crypto.Mac getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.Mac getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.Mac getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final int getMacLength();
method public final java.security.Provider getProvider();
method public final void init(java.security.Key) throws java.security.InvalidKeyException;
@@ -73756,7 +73896,7 @@ package javax.crypto {
public abstract class MacSpi {
ctor public MacSpi();
- method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
+ method public Object clone() throws java.lang.CloneNotSupportedException;
method protected abstract byte[] engineDoFinal();
method protected abstract int engineGetMacLength();
method protected abstract void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
@@ -73768,7 +73908,7 @@ package javax.crypto {
public class NoSuchPaddingException extends java.security.GeneralSecurityException {
ctor public NoSuchPaddingException();
- ctor public NoSuchPaddingException(java.lang.String);
+ ctor public NoSuchPaddingException(String);
}
public class NullCipher extends javax.crypto.Cipher {
@@ -73778,25 +73918,25 @@ package javax.crypto {
public class SealedObject implements java.io.Serializable {
ctor public SealedObject(java.io.Serializable, javax.crypto.Cipher) throws java.io.IOException, javax.crypto.IllegalBlockSizeException;
ctor protected SealedObject(javax.crypto.SealedObject);
- method public final java.lang.String getAlgorithm();
- method public final java.lang.Object getObject(java.security.Key) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
- method public final java.lang.Object getObject(javax.crypto.Cipher) throws javax.crypto.BadPaddingException, java.lang.ClassNotFoundException, java.io.IOException, javax.crypto.IllegalBlockSizeException;
- method public final java.lang.Object getObject(java.security.Key, java.lang.String) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public final String getAlgorithm();
+ method public final Object getObject(java.security.Key) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
+ method public final Object getObject(javax.crypto.Cipher) throws javax.crypto.BadPaddingException, java.lang.ClassNotFoundException, java.io.IOException, javax.crypto.IllegalBlockSizeException;
+ method public final Object getObject(java.security.Key, String) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
field protected byte[] encodedParams;
}
- public abstract interface SecretKey implements javax.security.auth.Destroyable java.security.Key {
+ public interface SecretKey extends java.security.Key javax.security.auth.Destroyable {
field public static final long serialVersionUID = -4795878709595146952L; // 0xbd719db928b8f538L
}
public class SecretKeyFactory {
- ctor protected SecretKeyFactory(javax.crypto.SecretKeyFactorySpi, java.security.Provider, java.lang.String);
+ ctor protected SecretKeyFactory(javax.crypto.SecretKeyFactorySpi, java.security.Provider, String);
method public final javax.crypto.SecretKey generateSecret(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
- method public final java.lang.String getAlgorithm();
- method public static final javax.crypto.SecretKeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.crypto.SecretKeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.crypto.SecretKeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final java.security.spec.KeySpec getKeySpec(javax.crypto.SecretKey, java.lang.Class<?>) throws java.security.spec.InvalidKeySpecException;
+ method public final String getAlgorithm();
+ method public static final javax.crypto.SecretKeyFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.crypto.SecretKeyFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.crypto.SecretKeyFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final java.security.spec.KeySpec getKeySpec(javax.crypto.SecretKey, Class<?>) throws java.security.spec.InvalidKeySpecException;
method public final java.security.Provider getProvider();
method public final javax.crypto.SecretKey translateKey(javax.crypto.SecretKey) throws java.security.InvalidKeyException;
}
@@ -73804,37 +73944,37 @@ package javax.crypto {
public abstract class SecretKeyFactorySpi {
ctor public SecretKeyFactorySpi();
method protected abstract javax.crypto.SecretKey engineGenerateSecret(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
- method protected abstract java.security.spec.KeySpec engineGetKeySpec(javax.crypto.SecretKey, java.lang.Class<?>) throws java.security.spec.InvalidKeySpecException;
+ method protected abstract java.security.spec.KeySpec engineGetKeySpec(javax.crypto.SecretKey, Class<?>) throws java.security.spec.InvalidKeySpecException;
method protected abstract javax.crypto.SecretKey engineTranslateKey(javax.crypto.SecretKey) throws java.security.InvalidKeyException;
}
public class ShortBufferException extends java.security.GeneralSecurityException {
ctor public ShortBufferException();
- ctor public ShortBufferException(java.lang.String);
+ ctor public ShortBufferException(String);
}
}
package javax.crypto.interfaces {
- public abstract interface DHKey {
- method public abstract javax.crypto.spec.DHParameterSpec getParams();
+ public interface DHKey {
+ method public javax.crypto.spec.DHParameterSpec getParams();
}
- public abstract interface DHPrivateKey implements javax.crypto.interfaces.DHKey java.security.PrivateKey {
- method public abstract java.math.BigInteger getX();
+ public interface DHPrivateKey extends javax.crypto.interfaces.DHKey java.security.PrivateKey {
+ method public java.math.BigInteger getX();
field public static final long serialVersionUID = 2211791113380396553L; // 0x1eb1dc4c8e677e09L
}
- public abstract interface DHPublicKey implements javax.crypto.interfaces.DHKey java.security.PublicKey {
- method public abstract java.math.BigInteger getY();
+ public interface DHPublicKey extends javax.crypto.interfaces.DHKey java.security.PublicKey {
+ method public java.math.BigInteger getY();
field public static final long serialVersionUID = -6628103563352519193L; // 0xa4043eed23df4de7L
}
- public abstract interface PBEKey implements javax.crypto.SecretKey {
- method public abstract int getIterationCount();
- method public abstract char[] getPassword();
- method public abstract byte[] getSalt();
+ public interface PBEKey extends javax.crypto.SecretKey {
+ method public int getIterationCount();
+ method public char[] getPassword();
+ method public byte[] getSalt();
field public static final long serialVersionUID = -1430015993304333921L; // 0xec279007d7f7c19fL
}
@@ -73901,9 +74041,9 @@ package javax.crypto.spec {
}
public class OAEPParameterSpec implements java.security.spec.AlgorithmParameterSpec {
- ctor public OAEPParameterSpec(java.lang.String, java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.spec.PSource);
- method public java.lang.String getDigestAlgorithm();
- method public java.lang.String getMGFAlgorithm();
+ ctor public OAEPParameterSpec(String, String, java.security.spec.AlgorithmParameterSpec, javax.crypto.spec.PSource);
+ method public String getDigestAlgorithm();
+ method public String getMGFAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getMGFParameters();
method public javax.crypto.spec.PSource getPSource();
field public static final javax.crypto.spec.OAEPParameterSpec DEFAULT;
@@ -73929,8 +74069,8 @@ package javax.crypto.spec {
}
public class PSource {
- ctor protected PSource(java.lang.String);
- method public java.lang.String getAlgorithm();
+ ctor protected PSource(String);
+ method public String getAlgorithm();
}
public static final class PSource.PSpecified extends javax.crypto.spec.PSource {
@@ -73958,45 +74098,45 @@ package javax.crypto.spec {
}
public class SecretKeySpec implements java.security.spec.KeySpec javax.crypto.SecretKey {
- ctor public SecretKeySpec(byte[], java.lang.String);
- ctor public SecretKeySpec(byte[], int, int, java.lang.String);
- method public java.lang.String getAlgorithm();
+ ctor public SecretKeySpec(byte[], String);
+ ctor public SecretKeySpec(byte[], int, int, String);
+ method public String getAlgorithm();
method public byte[] getEncoded();
- method public java.lang.String getFormat();
+ method public String getFormat();
}
}
package javax.microedition.khronos.egl {
- public abstract interface EGL {
- }
-
- public abstract interface EGL10 implements javax.microedition.khronos.egl.EGL {
- method public abstract boolean eglChooseConfig(javax.microedition.khronos.egl.EGLDisplay, int[], javax.microedition.khronos.egl.EGLConfig[], int, int[]);
- method public abstract boolean eglCopyBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, java.lang.Object);
- method public abstract javax.microedition.khronos.egl.EGLContext eglCreateContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, javax.microedition.khronos.egl.EGLContext, int[]);
- method public abstract javax.microedition.khronos.egl.EGLSurface eglCreatePbufferSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int[]);
- method public abstract deprecated javax.microedition.khronos.egl.EGLSurface eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, java.lang.Object, int[]);
- method public abstract javax.microedition.khronos.egl.EGLSurface eglCreateWindowSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, java.lang.Object, int[]);
- method public abstract boolean eglDestroyContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext);
- method public abstract boolean eglDestroySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
- method public abstract boolean eglGetConfigAttrib(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int, int[]);
- method public abstract boolean eglGetConfigs(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig[], int, int[]);
- method public abstract javax.microedition.khronos.egl.EGLContext eglGetCurrentContext();
- method public abstract javax.microedition.khronos.egl.EGLDisplay eglGetCurrentDisplay();
- method public abstract javax.microedition.khronos.egl.EGLSurface eglGetCurrentSurface(int);
- method public abstract javax.microedition.khronos.egl.EGLDisplay eglGetDisplay(java.lang.Object);
- method public abstract int eglGetError();
- method public abstract boolean eglInitialize(javax.microedition.khronos.egl.EGLDisplay, int[]);
- method public abstract boolean eglMakeCurrent(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLContext);
- method public abstract boolean eglQueryContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext, int, int[]);
- method public abstract java.lang.String eglQueryString(javax.microedition.khronos.egl.EGLDisplay, int);
- method public abstract boolean eglQuerySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, int, int[]);
- method public abstract boolean eglSwapBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
- method public abstract boolean eglTerminate(javax.microedition.khronos.egl.EGLDisplay);
- method public abstract boolean eglWaitGL();
- method public abstract boolean eglWaitNative(int, java.lang.Object);
+ public interface EGL {
+ }
+
+ public interface EGL10 extends javax.microedition.khronos.egl.EGL {
+ method public boolean eglChooseConfig(javax.microedition.khronos.egl.EGLDisplay, int[], javax.microedition.khronos.egl.EGLConfig[], int, int[]);
+ method public boolean eglCopyBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, Object);
+ method public javax.microedition.khronos.egl.EGLContext eglCreateContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, javax.microedition.khronos.egl.EGLContext, int[]);
+ method public javax.microedition.khronos.egl.EGLSurface eglCreatePbufferSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int[]);
+ method @Deprecated public javax.microedition.khronos.egl.EGLSurface eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]);
+ method public javax.microedition.khronos.egl.EGLSurface eglCreateWindowSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]);
+ method public boolean eglDestroyContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext);
+ method public boolean eglDestroySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
+ method public boolean eglGetConfigAttrib(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int, int[]);
+ method public boolean eglGetConfigs(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig[], int, int[]);
+ method public javax.microedition.khronos.egl.EGLContext eglGetCurrentContext();
+ method public javax.microedition.khronos.egl.EGLDisplay eglGetCurrentDisplay();
+ method public javax.microedition.khronos.egl.EGLSurface eglGetCurrentSurface(int);
+ method public javax.microedition.khronos.egl.EGLDisplay eglGetDisplay(Object);
+ method public int eglGetError();
+ method public boolean eglInitialize(javax.microedition.khronos.egl.EGLDisplay, int[]);
+ method public boolean eglMakeCurrent(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLContext);
+ method public boolean eglQueryContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext, int, int[]);
+ method public String eglQueryString(javax.microedition.khronos.egl.EGLDisplay, int);
+ method public boolean eglQuerySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, int, int[]);
+ method public boolean eglSwapBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
+ method public boolean eglTerminate(javax.microedition.khronos.egl.EGLDisplay);
+ method public boolean eglWaitGL();
+ method public boolean eglWaitNative(int, Object);
field public static final int EGL_ALPHA_FORMAT = 12424; // 0x3088
field public static final int EGL_ALPHA_MASK_SIZE = 12350; // 0x303e
field public static final int EGL_ALPHA_SIZE = 12321; // 0x3021
@@ -74019,7 +74159,7 @@ package javax.microedition.khronos.egl {
field public static final int EGL_CONFIG_CAVEAT = 12327; // 0x3027
field public static final int EGL_CONFIG_ID = 12328; // 0x3028
field public static final int EGL_CORE_NATIVE_ENGINE = 12379; // 0x305b
- field public static final java.lang.Object EGL_DEFAULT_DISPLAY;
+ field public static final Object EGL_DEFAULT_DISPLAY;
field public static final int EGL_DEPTH_SIZE = 12325; // 0x3025
field public static final int EGL_DONT_CARE = -1; // 0xffffffff
field public static final int EGL_DRAW = 12377; // 0x3059
@@ -74070,7 +74210,7 @@ package javax.microedition.khronos.egl {
field public static final int EGL_WINDOW_BIT = 4; // 0x4
}
- public abstract interface EGL11 implements javax.microedition.khronos.egl.EGL10 {
+ public interface EGL11 extends javax.microedition.khronos.egl.EGL10 {
field public static final int EGL_CONTEXT_LOST = 12302; // 0x300e
}
@@ -74096,133 +74236,133 @@ package javax.microedition.khronos.egl {
package javax.microedition.khronos.opengles {
- public abstract interface GL {
- }
-
- public abstract interface GL10 implements javax.microedition.khronos.opengles.GL {
- method public abstract void glActiveTexture(int);
- method public abstract void glAlphaFunc(int, float);
- method public abstract void glAlphaFuncx(int, int);
- method public abstract void glBindTexture(int, int);
- method public abstract void glBlendFunc(int, int);
- method public abstract void glClear(int);
- method public abstract void glClearColor(float, float, float, float);
- method public abstract void glClearColorx(int, int, int, int);
- method public abstract void glClearDepthf(float);
- method public abstract void glClearDepthx(int);
- method public abstract void glClearStencil(int);
- method public abstract void glClientActiveTexture(int);
- method public abstract void glColor4f(float, float, float, float);
- method public abstract void glColor4x(int, int, int, int);
- method public abstract void glColorMask(boolean, boolean, boolean, boolean);
- method public abstract void glColorPointer(int, int, int, java.nio.Buffer);
- method public abstract void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glCompressedTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glCopyTexImage2D(int, int, int, int, int, int, int, int);
- method public abstract void glCopyTexSubImage2D(int, int, int, int, int, int, int, int);
- method public abstract void glCullFace(int);
- method public abstract void glDeleteTextures(int, int[], int);
- method public abstract void glDeleteTextures(int, java.nio.IntBuffer);
- method public abstract void glDepthFunc(int);
- method public abstract void glDepthMask(boolean);
- method public abstract void glDepthRangef(float, float);
- method public abstract void glDepthRangex(int, int);
- method public abstract void glDisable(int);
- method public abstract void glDisableClientState(int);
- method public abstract void glDrawArrays(int, int, int);
- method public abstract void glDrawElements(int, int, int, java.nio.Buffer);
- method public abstract void glEnable(int);
- method public abstract void glEnableClientState(int);
- method public abstract void glFinish();
- method public abstract void glFlush();
- method public abstract void glFogf(int, float);
- method public abstract void glFogfv(int, float[], int);
- method public abstract void glFogfv(int, java.nio.FloatBuffer);
- method public abstract void glFogx(int, int);
- method public abstract void glFogxv(int, int[], int);
- method public abstract void glFogxv(int, java.nio.IntBuffer);
- method public abstract void glFrontFace(int);
- method public abstract void glFrustumf(float, float, float, float, float, float);
- method public abstract void glFrustumx(int, int, int, int, int, int);
- method public abstract void glGenTextures(int, int[], int);
- method public abstract void glGenTextures(int, java.nio.IntBuffer);
- method public abstract int glGetError();
- method public abstract void glGetIntegerv(int, int[], int);
- method public abstract void glGetIntegerv(int, java.nio.IntBuffer);
- method public abstract java.lang.String glGetString(int);
- method public abstract void glHint(int, int);
- method public abstract void glLightModelf(int, float);
- method public abstract void glLightModelfv(int, float[], int);
- method public abstract void glLightModelfv(int, java.nio.FloatBuffer);
- method public abstract void glLightModelx(int, int);
- method public abstract void glLightModelxv(int, int[], int);
- method public abstract void glLightModelxv(int, java.nio.IntBuffer);
- method public abstract void glLightf(int, int, float);
- method public abstract void glLightfv(int, int, float[], int);
- method public abstract void glLightfv(int, int, java.nio.FloatBuffer);
- method public abstract void glLightx(int, int, int);
- method public abstract void glLightxv(int, int, int[], int);
- method public abstract void glLightxv(int, int, java.nio.IntBuffer);
- method public abstract void glLineWidth(float);
- method public abstract void glLineWidthx(int);
- method public abstract void glLoadIdentity();
- method public abstract void glLoadMatrixf(float[], int);
- method public abstract void glLoadMatrixf(java.nio.FloatBuffer);
- method public abstract void glLoadMatrixx(int[], int);
- method public abstract void glLoadMatrixx(java.nio.IntBuffer);
- method public abstract void glLogicOp(int);
- method public abstract void glMaterialf(int, int, float);
- method public abstract void glMaterialfv(int, int, float[], int);
- method public abstract void glMaterialfv(int, int, java.nio.FloatBuffer);
- method public abstract void glMaterialx(int, int, int);
- method public abstract void glMaterialxv(int, int, int[], int);
- method public abstract void glMaterialxv(int, int, java.nio.IntBuffer);
- method public abstract void glMatrixMode(int);
- method public abstract void glMultMatrixf(float[], int);
- method public abstract void glMultMatrixf(java.nio.FloatBuffer);
- method public abstract void glMultMatrixx(int[], int);
- method public abstract void glMultMatrixx(java.nio.IntBuffer);
- method public abstract void glMultiTexCoord4f(int, float, float, float, float);
- method public abstract void glMultiTexCoord4x(int, int, int, int, int);
- method public abstract void glNormal3f(float, float, float);
- method public abstract void glNormal3x(int, int, int);
- method public abstract void glNormalPointer(int, int, java.nio.Buffer);
- method public abstract void glOrthof(float, float, float, float, float, float);
- method public abstract void glOrthox(int, int, int, int, int, int);
- method public abstract void glPixelStorei(int, int);
- method public abstract void glPointSize(float);
- method public abstract void glPointSizex(int);
- method public abstract void glPolygonOffset(float, float);
- method public abstract void glPolygonOffsetx(int, int);
- method public abstract void glPopMatrix();
- method public abstract void glPushMatrix();
- method public abstract void glReadPixels(int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glRotatef(float, float, float, float);
- method public abstract void glRotatex(int, int, int, int);
- method public abstract void glSampleCoverage(float, boolean);
- method public abstract void glSampleCoveragex(int, boolean);
- method public abstract void glScalef(float, float, float);
- method public abstract void glScalex(int, int, int);
- method public abstract void glScissor(int, int, int, int);
- method public abstract void glShadeModel(int);
- method public abstract void glStencilFunc(int, int, int);
- method public abstract void glStencilMask(int);
- method public abstract void glStencilOp(int, int, int);
- method public abstract void glTexCoordPointer(int, int, int, java.nio.Buffer);
- method public abstract void glTexEnvf(int, int, float);
- method public abstract void glTexEnvfv(int, int, float[], int);
- method public abstract void glTexEnvfv(int, int, java.nio.FloatBuffer);
- method public abstract void glTexEnvx(int, int, int);
- method public abstract void glTexEnvxv(int, int, int[], int);
- method public abstract void glTexEnvxv(int, int, java.nio.IntBuffer);
- method public abstract void glTexImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glTexParameterf(int, int, float);
- method public abstract void glTexParameterx(int, int, int);
- method public abstract void glTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glTranslatef(float, float, float);
- method public abstract void glTranslatex(int, int, int);
- method public abstract void glVertexPointer(int, int, int, java.nio.Buffer);
- method public abstract void glViewport(int, int, int, int);
+ public interface GL {
+ }
+
+ public interface GL10 extends javax.microedition.khronos.opengles.GL {
+ method public void glActiveTexture(int);
+ method public void glAlphaFunc(int, float);
+ method public void glAlphaFuncx(int, int);
+ method public void glBindTexture(int, int);
+ method public void glBlendFunc(int, int);
+ method public void glClear(int);
+ method public void glClearColor(float, float, float, float);
+ method public void glClearColorx(int, int, int, int);
+ method public void glClearDepthf(float);
+ method public void glClearDepthx(int);
+ method public void glClearStencil(int);
+ method public void glClientActiveTexture(int);
+ method public void glColor4f(float, float, float, float);
+ method public void glColor4x(int, int, int, int);
+ method public void glColorMask(boolean, boolean, boolean, boolean);
+ method public void glColorPointer(int, int, int, java.nio.Buffer);
+ method public void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
+ method public void glCompressedTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
+ method public void glCopyTexImage2D(int, int, int, int, int, int, int, int);
+ method public void glCopyTexSubImage2D(int, int, int, int, int, int, int, int);
+ method public void glCullFace(int);
+ method public void glDeleteTextures(int, int[], int);
+ method public void glDeleteTextures(int, java.nio.IntBuffer);
+ method public void glDepthFunc(int);
+ method public void glDepthMask(boolean);
+ method public void glDepthRangef(float, float);
+ method public void glDepthRangex(int, int);
+ method public void glDisable(int);
+ method public void glDisableClientState(int);
+ method public void glDrawArrays(int, int, int);
+ method public void glDrawElements(int, int, int, java.nio.Buffer);
+ method public void glEnable(int);
+ method public void glEnableClientState(int);
+ method public void glFinish();
+ method public void glFlush();
+ method public void glFogf(int, float);
+ method public void glFogfv(int, float[], int);
+ method public void glFogfv(int, java.nio.FloatBuffer);
+ method public void glFogx(int, int);
+ method public void glFogxv(int, int[], int);
+ method public void glFogxv(int, java.nio.IntBuffer);
+ method public void glFrontFace(int);
+ method public void glFrustumf(float, float, float, float, float, float);
+ method public void glFrustumx(int, int, int, int, int, int);
+ method public void glGenTextures(int, int[], int);
+ method public void glGenTextures(int, java.nio.IntBuffer);
+ method public int glGetError();
+ method public void glGetIntegerv(int, int[], int);
+ method public void glGetIntegerv(int, java.nio.IntBuffer);
+ method public String glGetString(int);
+ method public void glHint(int, int);
+ method public void glLightModelf(int, float);
+ method public void glLightModelfv(int, float[], int);
+ method public void glLightModelfv(int, java.nio.FloatBuffer);
+ method public void glLightModelx(int, int);
+ method public void glLightModelxv(int, int[], int);
+ method public void glLightModelxv(int, java.nio.IntBuffer);
+ method public void glLightf(int, int, float);
+ method public void glLightfv(int, int, float[], int);
+ method public void glLightfv(int, int, java.nio.FloatBuffer);
+ method public void glLightx(int, int, int);
+ method public void glLightxv(int, int, int[], int);
+ method public void glLightxv(int, int, java.nio.IntBuffer);
+ method public void glLineWidth(float);
+ method public void glLineWidthx(int);
+ method public void glLoadIdentity();
+ method public void glLoadMatrixf(float[], int);
+ method public void glLoadMatrixf(java.nio.FloatBuffer);
+ method public void glLoadMatrixx(int[], int);
+ method public void glLoadMatrixx(java.nio.IntBuffer);
+ method public void glLogicOp(int);
+ method public void glMaterialf(int, int, float);
+ method public void glMaterialfv(int, int, float[], int);
+ method public void glMaterialfv(int, int, java.nio.FloatBuffer);
+ method public void glMaterialx(int, int, int);
+ method public void glMaterialxv(int, int, int[], int);
+ method public void glMaterialxv(int, int, java.nio.IntBuffer);
+ method public void glMatrixMode(int);
+ method public void glMultMatrixf(float[], int);
+ method public void glMultMatrixf(java.nio.FloatBuffer);
+ method public void glMultMatrixx(int[], int);
+ method public void glMultMatrixx(java.nio.IntBuffer);
+ method public void glMultiTexCoord4f(int, float, float, float, float);
+ method public void glMultiTexCoord4x(int, int, int, int, int);
+ method public void glNormal3f(float, float, float);
+ method public void glNormal3x(int, int, int);
+ method public void glNormalPointer(int, int, java.nio.Buffer);
+ method public void glOrthof(float, float, float, float, float, float);
+ method public void glOrthox(int, int, int, int, int, int);
+ method public void glPixelStorei(int, int);
+ method public void glPointSize(float);
+ method public void glPointSizex(int);
+ method public void glPolygonOffset(float, float);
+ method public void glPolygonOffsetx(int, int);
+ method public void glPopMatrix();
+ method public void glPushMatrix();
+ method public void glReadPixels(int, int, int, int, int, int, java.nio.Buffer);
+ method public void glRotatef(float, float, float, float);
+ method public void glRotatex(int, int, int, int);
+ method public void glSampleCoverage(float, boolean);
+ method public void glSampleCoveragex(int, boolean);
+ method public void glScalef(float, float, float);
+ method public void glScalex(int, int, int);
+ method public void glScissor(int, int, int, int);
+ method public void glShadeModel(int);
+ method public void glStencilFunc(int, int, int);
+ method public void glStencilMask(int);
+ method public void glStencilOp(int, int, int);
+ method public void glTexCoordPointer(int, int, int, java.nio.Buffer);
+ method public void glTexEnvf(int, int, float);
+ method public void glTexEnvfv(int, int, float[], int);
+ method public void glTexEnvfv(int, int, java.nio.FloatBuffer);
+ method public void glTexEnvx(int, int, int);
+ method public void glTexEnvxv(int, int, int[], int);
+ method public void glTexEnvxv(int, int, java.nio.IntBuffer);
+ method public void glTexImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
+ method public void glTexParameterf(int, int, float);
+ method public void glTexParameterx(int, int, int);
+ method public void glTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
+ method public void glTranslatef(float, float, float);
+ method public void glTranslatex(int, int, int);
+ method public void glVertexPointer(int, int, int, java.nio.Buffer);
+ method public void glViewport(int, int, int, int);
field public static final int GL_ADD = 260; // 0x104
field public static final int GL_ALIASED_LINE_WIDTH_RANGE = 33902; // 0x846e
field public static final int GL_ALIASED_POINT_SIZE_RANGE = 33901; // 0x846d
@@ -74462,80 +74602,80 @@ package javax.microedition.khronos.opengles {
field public static final int GL_ZERO = 0; // 0x0
}
- public abstract interface GL10Ext implements javax.microedition.khronos.opengles.GL {
- method public abstract int glQueryMatrixxOES(int[], int, int[], int);
- method public abstract int glQueryMatrixxOES(java.nio.IntBuffer, java.nio.IntBuffer);
- }
-
- public abstract interface GL11 implements javax.microedition.khronos.opengles.GL10 {
- method public abstract void glBindBuffer(int, int);
- method public abstract void glBufferData(int, int, java.nio.Buffer, int);
- method public abstract void glBufferSubData(int, int, int, java.nio.Buffer);
- method public abstract void glClipPlanef(int, float[], int);
- method public abstract void glClipPlanef(int, java.nio.FloatBuffer);
- method public abstract void glClipPlanex(int, int[], int);
- method public abstract void glClipPlanex(int, java.nio.IntBuffer);
- method public abstract void glColor4ub(byte, byte, byte, byte);
- method public abstract void glColorPointer(int, int, int, int);
- method public abstract void glDeleteBuffers(int, int[], int);
- method public abstract void glDeleteBuffers(int, java.nio.IntBuffer);
- method public abstract void glDrawElements(int, int, int, int);
- method public abstract void glGenBuffers(int, int[], int);
- method public abstract void glGenBuffers(int, java.nio.IntBuffer);
- method public abstract void glGetBooleanv(int, boolean[], int);
- method public abstract void glGetBooleanv(int, java.nio.IntBuffer);
- method public abstract void glGetBufferParameteriv(int, int, int[], int);
- method public abstract void glGetBufferParameteriv(int, int, java.nio.IntBuffer);
- method public abstract void glGetClipPlanef(int, float[], int);
- method public abstract void glGetClipPlanef(int, java.nio.FloatBuffer);
- method public abstract void glGetClipPlanex(int, int[], int);
- method public abstract void glGetClipPlanex(int, java.nio.IntBuffer);
- method public abstract void glGetFixedv(int, int[], int);
- method public abstract void glGetFixedv(int, java.nio.IntBuffer);
- method public abstract void glGetFloatv(int, float[], int);
- method public abstract void glGetFloatv(int, java.nio.FloatBuffer);
- method public abstract void glGetLightfv(int, int, float[], int);
- method public abstract void glGetLightfv(int, int, java.nio.FloatBuffer);
- method public abstract void glGetLightxv(int, int, int[], int);
- method public abstract void glGetLightxv(int, int, java.nio.IntBuffer);
- method public abstract void glGetMaterialfv(int, int, float[], int);
- method public abstract void glGetMaterialfv(int, int, java.nio.FloatBuffer);
- method public abstract void glGetMaterialxv(int, int, int[], int);
- method public abstract void glGetMaterialxv(int, int, java.nio.IntBuffer);
- method public abstract void glGetPointerv(int, java.nio.Buffer[]);
- method public abstract void glGetTexEnviv(int, int, int[], int);
- method public abstract void glGetTexEnviv(int, int, java.nio.IntBuffer);
- method public abstract void glGetTexEnvxv(int, int, int[], int);
- method public abstract void glGetTexEnvxv(int, int, java.nio.IntBuffer);
- method public abstract void glGetTexParameterfv(int, int, float[], int);
- method public abstract void glGetTexParameterfv(int, int, java.nio.FloatBuffer);
- method public abstract void glGetTexParameteriv(int, int, int[], int);
- method public abstract void glGetTexParameteriv(int, int, java.nio.IntBuffer);
- method public abstract void glGetTexParameterxv(int, int, int[], int);
- method public abstract void glGetTexParameterxv(int, int, java.nio.IntBuffer);
- method public abstract boolean glIsBuffer(int);
- method public abstract boolean glIsEnabled(int);
- method public abstract boolean glIsTexture(int);
- method public abstract void glNormalPointer(int, int, int);
- method public abstract void glPointParameterf(int, float);
- method public abstract void glPointParameterfv(int, float[], int);
- method public abstract void glPointParameterfv(int, java.nio.FloatBuffer);
- method public abstract void glPointParameterx(int, int);
- method public abstract void glPointParameterxv(int, int[], int);
- method public abstract void glPointParameterxv(int, java.nio.IntBuffer);
- method public abstract void glPointSizePointerOES(int, int, java.nio.Buffer);
- method public abstract void glTexCoordPointer(int, int, int, int);
- method public abstract void glTexEnvi(int, int, int);
- method public abstract void glTexEnviv(int, int, int[], int);
- method public abstract void glTexEnviv(int, int, java.nio.IntBuffer);
- method public abstract void glTexParameterfv(int, int, float[], int);
- method public abstract void glTexParameterfv(int, int, java.nio.FloatBuffer);
- method public abstract void glTexParameteri(int, int, int);
- method public abstract void glTexParameteriv(int, int, int[], int);
- method public abstract void glTexParameteriv(int, int, java.nio.IntBuffer);
- method public abstract void glTexParameterxv(int, int, int[], int);
- method public abstract void glTexParameterxv(int, int, java.nio.IntBuffer);
- method public abstract void glVertexPointer(int, int, int, int);
+ public interface GL10Ext extends javax.microedition.khronos.opengles.GL {
+ method public int glQueryMatrixxOES(int[], int, int[], int);
+ method public int glQueryMatrixxOES(java.nio.IntBuffer, java.nio.IntBuffer);
+ }
+
+ public interface GL11 extends javax.microedition.khronos.opengles.GL10 {
+ method public void glBindBuffer(int, int);
+ method public void glBufferData(int, int, java.nio.Buffer, int);
+ method public void glBufferSubData(int, int, int, java.nio.Buffer);
+ method public void glClipPlanef(int, float[], int);
+ method public void glClipPlanef(int, java.nio.FloatBuffer);
+ method public void glClipPlanex(int, int[], int);
+ method public void glClipPlanex(int, java.nio.IntBuffer);
+ method public void glColor4ub(byte, byte, byte, byte);
+ method public void glColorPointer(int, int, int, int);
+ method public void glDeleteBuffers(int, int[], int);
+ method public void glDeleteBuffers(int, java.nio.IntBuffer);
+ method public void glDrawElements(int, int, int, int);
+ method public void glGenBuffers(int, int[], int);
+ method public void glGenBuffers(int, java.nio.IntBuffer);
+ method public void glGetBooleanv(int, boolean[], int);
+ method public void glGetBooleanv(int, java.nio.IntBuffer);
+ method public void glGetBufferParameteriv(int, int, int[], int);
+ method public void glGetBufferParameteriv(int, int, java.nio.IntBuffer);
+ method public void glGetClipPlanef(int, float[], int);
+ method public void glGetClipPlanef(int, java.nio.FloatBuffer);
+ method public void glGetClipPlanex(int, int[], int);
+ method public void glGetClipPlanex(int, java.nio.IntBuffer);
+ method public void glGetFixedv(int, int[], int);
+ method public void glGetFixedv(int, java.nio.IntBuffer);
+ method public void glGetFloatv(int, float[], int);
+ method public void glGetFloatv(int, java.nio.FloatBuffer);
+ method public void glGetLightfv(int, int, float[], int);
+ method public void glGetLightfv(int, int, java.nio.FloatBuffer);
+ method public void glGetLightxv(int, int, int[], int);
+ method public void glGetLightxv(int, int, java.nio.IntBuffer);
+ method public void glGetMaterialfv(int, int, float[], int);
+ method public void glGetMaterialfv(int, int, java.nio.FloatBuffer);
+ method public void glGetMaterialxv(int, int, int[], int);
+ method public void glGetMaterialxv(int, int, java.nio.IntBuffer);
+ method public void glGetPointerv(int, java.nio.Buffer[]);
+ method public void glGetTexEnviv(int, int, int[], int);
+ method public void glGetTexEnviv(int, int, java.nio.IntBuffer);
+ method public void glGetTexEnvxv(int, int, int[], int);
+ method public void glGetTexEnvxv(int, int, java.nio.IntBuffer);
+ method public void glGetTexParameterfv(int, int, float[], int);
+ method public void glGetTexParameterfv(int, int, java.nio.FloatBuffer);
+ method public void glGetTexParameteriv(int, int, int[], int);
+ method public void glGetTexParameteriv(int, int, java.nio.IntBuffer);
+ method public void glGetTexParameterxv(int, int, int[], int);
+ method public void glGetTexParameterxv(int, int, java.nio.IntBuffer);
+ method public boolean glIsBuffer(int);
+ method public boolean glIsEnabled(int);
+ method public boolean glIsTexture(int);
+ method public void glNormalPointer(int, int, int);
+ method public void glPointParameterf(int, float);
+ method public void glPointParameterfv(int, float[], int);
+ method public void glPointParameterfv(int, java.nio.FloatBuffer);
+ method public void glPointParameterx(int, int);
+ method public void glPointParameterxv(int, int[], int);
+ method public void glPointParameterxv(int, java.nio.IntBuffer);
+ method public void glPointSizePointerOES(int, int, java.nio.Buffer);
+ method public void glTexCoordPointer(int, int, int, int);
+ method public void glTexEnvi(int, int, int);
+ method public void glTexEnviv(int, int, int[], int);
+ method public void glTexEnviv(int, int, java.nio.IntBuffer);
+ method public void glTexParameterfv(int, int, float[], int);
+ method public void glTexParameterfv(int, int, java.nio.FloatBuffer);
+ method public void glTexParameteri(int, int, int);
+ method public void glTexParameteriv(int, int, int[], int);
+ method public void glTexParameteriv(int, int, java.nio.IntBuffer);
+ method public void glTexParameterxv(int, int, int[], int);
+ method public void glTexParameterxv(int, int, java.nio.IntBuffer);
+ method public void glVertexPointer(int, int, int, int);
field public static final int GL_ACTIVE_TEXTURE = 34016; // 0x84e0
field public static final int GL_ADD_SIGNED = 34164; // 0x8574
field public static final int GL_ALPHA_SCALE = 3356; // 0xd1c
@@ -74660,28 +74800,28 @@ package javax.microedition.khronos.opengles {
field public static final int GL_WRITE_ONLY = 35001; // 0x88b9
}
- public abstract interface GL11Ext implements javax.microedition.khronos.opengles.GL {
- method public abstract void glCurrentPaletteMatrixOES(int);
- method public abstract void glDrawTexfOES(float, float, float, float, float);
- method public abstract void glDrawTexfvOES(float[], int);
- method public abstract void glDrawTexfvOES(java.nio.FloatBuffer);
- method public abstract void glDrawTexiOES(int, int, int, int, int);
- method public abstract void glDrawTexivOES(int[], int);
- method public abstract void glDrawTexivOES(java.nio.IntBuffer);
- method public abstract void glDrawTexsOES(short, short, short, short, short);
- method public abstract void glDrawTexsvOES(short[], int);
- method public abstract void glDrawTexsvOES(java.nio.ShortBuffer);
- method public abstract void glDrawTexxOES(int, int, int, int, int);
- method public abstract void glDrawTexxvOES(int[], int);
- method public abstract void glDrawTexxvOES(java.nio.IntBuffer);
- method public abstract void glEnable(int);
- method public abstract void glEnableClientState(int);
- method public abstract void glLoadPaletteFromModelViewMatrixOES();
- method public abstract void glMatrixIndexPointerOES(int, int, int, java.nio.Buffer);
- method public abstract void glMatrixIndexPointerOES(int, int, int, int);
- method public abstract void glTexParameterfv(int, int, float[], int);
- method public abstract void glWeightPointerOES(int, int, int, java.nio.Buffer);
- method public abstract void glWeightPointerOES(int, int, int, int);
+ public interface GL11Ext extends javax.microedition.khronos.opengles.GL {
+ method public void glCurrentPaletteMatrixOES(int);
+ method public void glDrawTexfOES(float, float, float, float, float);
+ method public void glDrawTexfvOES(float[], int);
+ method public void glDrawTexfvOES(java.nio.FloatBuffer);
+ method public void glDrawTexiOES(int, int, int, int, int);
+ method public void glDrawTexivOES(int[], int);
+ method public void glDrawTexivOES(java.nio.IntBuffer);
+ method public void glDrawTexsOES(short, short, short, short, short);
+ method public void glDrawTexsvOES(short[], int);
+ method public void glDrawTexsvOES(java.nio.ShortBuffer);
+ method public void glDrawTexxOES(int, int, int, int, int);
+ method public void glDrawTexxvOES(int[], int);
+ method public void glDrawTexxvOES(java.nio.IntBuffer);
+ method public void glEnable(int);
+ method public void glEnableClientState(int);
+ method public void glLoadPaletteFromModelViewMatrixOES();
+ method public void glMatrixIndexPointerOES(int, int, int, java.nio.Buffer);
+ method public void glMatrixIndexPointerOES(int, int, int, int);
+ method public void glTexParameterfv(int, int, float[], int);
+ method public void glWeightPointerOES(int, int, int, java.nio.Buffer);
+ method public void glWeightPointerOES(int, int, int, int);
field public static final int GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES = 35742; // 0x8b9e
field public static final int GL_MATRIX_INDEX_ARRAY_OES = 34884; // 0x8844
field public static final int GL_MATRIX_INDEX_ARRAY_POINTER_OES = 34889; // 0x8849
@@ -74700,60 +74840,60 @@ package javax.microedition.khronos.opengles {
field public static final int GL_WEIGHT_ARRAY_TYPE_OES = 34473; // 0x86a9
}
- public abstract interface GL11ExtensionPack implements javax.microedition.khronos.opengles.GL {
- method public abstract void glBindFramebufferOES(int, int);
- method public abstract void glBindRenderbufferOES(int, int);
- method public abstract void glBindTexture(int, int);
- method public abstract void glBlendEquation(int);
- method public abstract void glBlendEquationSeparate(int, int);
- method public abstract void glBlendFuncSeparate(int, int, int, int);
- method public abstract int glCheckFramebufferStatusOES(int);
- method public abstract void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
- method public abstract void glCopyTexImage2D(int, int, int, int, int, int, int, int);
- method public abstract void glDeleteFramebuffersOES(int, int[], int);
- method public abstract void glDeleteFramebuffersOES(int, java.nio.IntBuffer);
- method public abstract void glDeleteRenderbuffersOES(int, int[], int);
- method public abstract void glDeleteRenderbuffersOES(int, java.nio.IntBuffer);
- method public abstract void glEnable(int);
- method public abstract void glFramebufferRenderbufferOES(int, int, int, int);
- method public abstract void glFramebufferTexture2DOES(int, int, int, int, int);
- method public abstract void glGenFramebuffersOES(int, int[], int);
- method public abstract void glGenFramebuffersOES(int, java.nio.IntBuffer);
- method public abstract void glGenRenderbuffersOES(int, int[], int);
- method public abstract void glGenRenderbuffersOES(int, java.nio.IntBuffer);
- method public abstract void glGenerateMipmapOES(int);
- method public abstract void glGetFramebufferAttachmentParameterivOES(int, int, int, int[], int);
- method public abstract void glGetFramebufferAttachmentParameterivOES(int, int, int, java.nio.IntBuffer);
- method public abstract void glGetIntegerv(int, int[], int);
- method public abstract void glGetIntegerv(int, java.nio.IntBuffer);
- method public abstract void glGetRenderbufferParameterivOES(int, int, int[], int);
- method public abstract void glGetRenderbufferParameterivOES(int, int, java.nio.IntBuffer);
- method public abstract void glGetTexGenfv(int, int, float[], int);
- method public abstract void glGetTexGenfv(int, int, java.nio.FloatBuffer);
- method public abstract void glGetTexGeniv(int, int, int[], int);
- method public abstract void glGetTexGeniv(int, int, java.nio.IntBuffer);
- method public abstract void glGetTexGenxv(int, int, int[], int);
- method public abstract void glGetTexGenxv(int, int, java.nio.IntBuffer);
- method public abstract boolean glIsFramebufferOES(int);
- method public abstract boolean glIsRenderbufferOES(int);
- method public abstract void glRenderbufferStorageOES(int, int, int, int);
- method public abstract void glStencilOp(int, int, int);
- method public abstract void glTexEnvf(int, int, float);
- method public abstract void glTexEnvfv(int, int, float[], int);
- method public abstract void glTexEnvfv(int, int, java.nio.FloatBuffer);
- method public abstract void glTexEnvx(int, int, int);
- method public abstract void glTexEnvxv(int, int, int[], int);
- method public abstract void glTexEnvxv(int, int, java.nio.IntBuffer);
- method public abstract void glTexGenf(int, int, float);
- method public abstract void glTexGenfv(int, int, float[], int);
- method public abstract void glTexGenfv(int, int, java.nio.FloatBuffer);
- method public abstract void glTexGeni(int, int, int);
- method public abstract void glTexGeniv(int, int, int[], int);
- method public abstract void glTexGeniv(int, int, java.nio.IntBuffer);
- method public abstract void glTexGenx(int, int, int);
- method public abstract void glTexGenxv(int, int, int[], int);
- method public abstract void glTexGenxv(int, int, java.nio.IntBuffer);
- method public abstract void glTexParameterf(int, int, float);
+ public interface GL11ExtensionPack extends javax.microedition.khronos.opengles.GL {
+ method public void glBindFramebufferOES(int, int);
+ method public void glBindRenderbufferOES(int, int);
+ method public void glBindTexture(int, int);
+ method public void glBlendEquation(int);
+ method public void glBlendEquationSeparate(int, int);
+ method public void glBlendFuncSeparate(int, int, int, int);
+ method public int glCheckFramebufferStatusOES(int);
+ method public void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
+ method public void glCopyTexImage2D(int, int, int, int, int, int, int, int);
+ method public void glDeleteFramebuffersOES(int, int[], int);
+ method public void glDeleteFramebuffersOES(int, java.nio.IntBuffer);
+ method public void glDeleteRenderbuffersOES(int, int[], int);
+ method public void glDeleteRenderbuffersOES(int, java.nio.IntBuffer);
+ method public void glEnable(int);
+ method public void glFramebufferRenderbufferOES(int, int, int, int);
+ method public void glFramebufferTexture2DOES(int, int, int, int, int);
+ method public void glGenFramebuffersOES(int, int[], int);
+ method public void glGenFramebuffersOES(int, java.nio.IntBuffer);
+ method public void glGenRenderbuffersOES(int, int[], int);
+ method public void glGenRenderbuffersOES(int, java.nio.IntBuffer);
+ method public void glGenerateMipmapOES(int);
+ method public void glGetFramebufferAttachmentParameterivOES(int, int, int, int[], int);
+ method public void glGetFramebufferAttachmentParameterivOES(int, int, int, java.nio.IntBuffer);
+ method public void glGetIntegerv(int, int[], int);
+ method public void glGetIntegerv(int, java.nio.IntBuffer);
+ method public void glGetRenderbufferParameterivOES(int, int, int[], int);
+ method public void glGetRenderbufferParameterivOES(int, int, java.nio.IntBuffer);
+ method public void glGetTexGenfv(int, int, float[], int);
+ method public void glGetTexGenfv(int, int, java.nio.FloatBuffer);
+ method public void glGetTexGeniv(int, int, int[], int);
+ method public void glGetTexGeniv(int, int, java.nio.IntBuffer);
+ method public void glGetTexGenxv(int, int, int[], int);
+ method public void glGetTexGenxv(int, int, java.nio.IntBuffer);
+ method public boolean glIsFramebufferOES(int);
+ method public boolean glIsRenderbufferOES(int);
+ method public void glRenderbufferStorageOES(int, int, int, int);
+ method public void glStencilOp(int, int, int);
+ method public void glTexEnvf(int, int, float);
+ method public void glTexEnvfv(int, int, float[], int);
+ method public void glTexEnvfv(int, int, java.nio.FloatBuffer);
+ method public void glTexEnvx(int, int, int);
+ method public void glTexEnvxv(int, int, int[], int);
+ method public void glTexEnvxv(int, int, java.nio.IntBuffer);
+ method public void glTexGenf(int, int, float);
+ method public void glTexGenfv(int, int, float[], int);
+ method public void glTexGenfv(int, int, java.nio.FloatBuffer);
+ method public void glTexGeni(int, int, int);
+ method public void glTexGeniv(int, int, int[], int);
+ method public void glTexGeniv(int, int, java.nio.IntBuffer);
+ method public void glTexGenx(int, int, int);
+ method public void glTexGenxv(int, int, int[], int);
+ method public void glTexGenxv(int, int, java.nio.IntBuffer);
+ method public void glTexParameterf(int, int, float);
field public static final int GL_BLEND_DST_ALPHA = 32970; // 0x80ca
field public static final int GL_BLEND_DST_RGB = 32968; // 0x80c8
field public static final int GL_BLEND_EQUATION = 32777; // 0x8009
@@ -74858,8 +74998,8 @@ package javax.net {
public abstract class SocketFactory {
ctor protected SocketFactory();
method public java.net.Socket createSocket() throws java.io.IOException;
- method public abstract java.net.Socket createSocket(java.lang.String, int) throws java.io.IOException, java.net.UnknownHostException;
- method public abstract java.net.Socket createSocket(java.lang.String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
+ method public abstract java.net.Socket createSocket(String, int) throws java.io.IOException, java.net.UnknownHostException;
+ method public abstract java.net.Socket createSocket(String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
method public abstract java.net.Socket createSocket(java.net.InetAddress, int) throws java.io.IOException;
method public abstract java.net.Socket createSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
method public static javax.net.SocketFactory getDefault();
@@ -74876,14 +75016,14 @@ package javax.net.ssl {
public abstract class ExtendedSSLSession implements javax.net.ssl.SSLSession {
ctor public ExtendedSSLSession();
- method public abstract java.lang.String[] getLocalSupportedSignatureAlgorithms();
- method public abstract java.lang.String[] getPeerSupportedSignatureAlgorithms();
+ method public abstract String[] getLocalSupportedSignatureAlgorithms();
+ method public abstract String[] getPeerSupportedSignatureAlgorithms();
method public java.util.List<javax.net.ssl.SNIServerName> getRequestedServerNames();
}
public class HandshakeCompletedEvent extends java.util.EventObject {
ctor public HandshakeCompletedEvent(javax.net.ssl.SSLSocket, javax.net.ssl.SSLSession);
- method public java.lang.String getCipherSuite();
+ method public String getCipherSuite();
method public java.security.cert.Certificate[] getLocalCertificates();
method public java.security.Principal getLocalPrincipal();
method public javax.security.cert.X509Certificate[] getPeerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
@@ -74893,17 +75033,17 @@ package javax.net.ssl {
method public javax.net.ssl.SSLSocket getSocket();
}
- public abstract interface HandshakeCompletedListener implements java.util.EventListener {
- method public abstract void handshakeCompleted(javax.net.ssl.HandshakeCompletedEvent);
+ public interface HandshakeCompletedListener extends java.util.EventListener {
+ method public void handshakeCompleted(javax.net.ssl.HandshakeCompletedEvent);
}
- public abstract interface HostnameVerifier {
- method public abstract boolean verify(java.lang.String, javax.net.ssl.SSLSession);
+ public interface HostnameVerifier {
+ method public boolean verify(String, javax.net.ssl.SSLSession);
}
public abstract class HttpsURLConnection extends java.net.HttpURLConnection {
ctor protected HttpsURLConnection(java.net.URL);
- method public abstract java.lang.String getCipherSuite();
+ method public abstract String getCipherSuite();
method public static javax.net.ssl.HostnameVerifier getDefaultHostnameVerifier();
method public static javax.net.ssl.SSLSocketFactory getDefaultSSLSocketFactory();
method public javax.net.ssl.HostnameVerifier getHostnameVerifier();
@@ -74919,16 +75059,16 @@ package javax.net.ssl {
field protected javax.net.ssl.HostnameVerifier hostnameVerifier;
}
- public abstract interface KeyManager {
+ public interface KeyManager {
}
public class KeyManagerFactory {
- ctor protected KeyManagerFactory(javax.net.ssl.KeyManagerFactorySpi, java.security.Provider, java.lang.String);
- method public final java.lang.String getAlgorithm();
- method public static final java.lang.String getDefaultAlgorithm();
- method public static final javax.net.ssl.KeyManagerFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.net.ssl.KeyManagerFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.net.ssl.KeyManagerFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ ctor protected KeyManagerFactory(javax.net.ssl.KeyManagerFactorySpi, java.security.Provider, String);
+ method public final String getAlgorithm();
+ method public static final String getDefaultAlgorithm();
+ method public static final javax.net.ssl.KeyManagerFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.net.ssl.KeyManagerFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.net.ssl.KeyManagerFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final javax.net.ssl.KeyManager[] getKeyManagers();
method public final java.security.Provider getProvider();
method public final void init(java.security.KeyStore, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
@@ -74948,14 +75088,14 @@ package javax.net.ssl {
method public java.util.List<java.security.KeyStore.Builder> getParameters();
}
- public abstract interface ManagerFactoryParameters {
+ public interface ManagerFactoryParameters {
}
public final class SNIHostName extends javax.net.ssl.SNIServerName {
- ctor public SNIHostName(java.lang.String);
+ ctor public SNIHostName(String);
ctor public SNIHostName(byte[]);
- method public static javax.net.ssl.SNIMatcher createSNIMatcher(java.lang.String);
- method public java.lang.String getAsciiName();
+ method public static javax.net.ssl.SNIMatcher createSNIMatcher(String);
+ method public String getAsciiName();
}
public abstract class SNIMatcher {
@@ -74971,29 +75111,29 @@ package javax.net.ssl {
}
public class SSLContext {
- ctor protected SSLContext(javax.net.ssl.SSLContextSpi, java.security.Provider, java.lang.String);
+ ctor protected SSLContext(javax.net.ssl.SSLContextSpi, java.security.Provider, String);
method public final javax.net.ssl.SSLEngine createSSLEngine();
- method public final javax.net.ssl.SSLEngine createSSLEngine(java.lang.String, int);
+ method public final javax.net.ssl.SSLEngine createSSLEngine(String, int);
method public final javax.net.ssl.SSLSessionContext getClientSessionContext();
- method public static synchronized javax.net.ssl.SSLContext getDefault() throws java.security.NoSuchAlgorithmException;
+ method public static javax.net.ssl.SSLContext getDefault() throws java.security.NoSuchAlgorithmException;
method public final javax.net.ssl.SSLParameters getDefaultSSLParameters();
- method public static javax.net.ssl.SSLContext getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static javax.net.ssl.SSLContext getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static javax.net.ssl.SSLContext getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
- method public final java.lang.String getProtocol();
+ method public static javax.net.ssl.SSLContext getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static javax.net.ssl.SSLContext getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static javax.net.ssl.SSLContext getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ method public final String getProtocol();
method public final java.security.Provider getProvider();
method public final javax.net.ssl.SSLSessionContext getServerSessionContext();
method public final javax.net.ssl.SSLServerSocketFactory getServerSocketFactory();
method public final javax.net.ssl.SSLSocketFactory getSocketFactory();
method public final javax.net.ssl.SSLParameters getSupportedSSLParameters();
method public final void init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) throws java.security.KeyManagementException;
- method public static synchronized void setDefault(javax.net.ssl.SSLContext);
+ method public static void setDefault(javax.net.ssl.SSLContext);
}
public abstract class SSLContextSpi {
ctor public SSLContextSpi();
method protected abstract javax.net.ssl.SSLEngine engineCreateSSLEngine();
- method protected abstract javax.net.ssl.SSLEngine engineCreateSSLEngine(java.lang.String, int);
+ method protected abstract javax.net.ssl.SSLEngine engineCreateSSLEngine(String, int);
method protected abstract javax.net.ssl.SSLSessionContext engineGetClientSessionContext();
method protected javax.net.ssl.SSLParameters engineGetDefaultSSLParameters();
method protected abstract javax.net.ssl.SSLSessionContext engineGetServerSessionContext();
@@ -75005,34 +75145,34 @@ package javax.net.ssl {
public abstract class SSLEngine {
ctor protected SSLEngine();
- ctor protected SSLEngine(java.lang.String, int);
+ ctor protected SSLEngine(String, int);
method public abstract void beginHandshake() throws javax.net.ssl.SSLException;
method public abstract void closeInbound() throws javax.net.ssl.SSLException;
method public abstract void closeOutbound();
- method public java.lang.String getApplicationProtocol();
- method public abstract java.lang.Runnable getDelegatedTask();
+ method public String getApplicationProtocol();
+ method public abstract Runnable getDelegatedTask();
method public abstract boolean getEnableSessionCreation();
- method public abstract java.lang.String[] getEnabledCipherSuites();
- method public abstract java.lang.String[] getEnabledProtocols();
- method public java.lang.String getHandshakeApplicationProtocol();
- method public java.util.function.BiFunction<javax.net.ssl.SSLEngine, java.util.List<java.lang.String>, java.lang.String> getHandshakeApplicationProtocolSelector();
+ method public abstract String[] getEnabledCipherSuites();
+ method public abstract String[] getEnabledProtocols();
+ method public String getHandshakeApplicationProtocol();
+ method public java.util.function.BiFunction<javax.net.ssl.SSLEngine,java.util.List<java.lang.String>,java.lang.String> getHandshakeApplicationProtocolSelector();
method public javax.net.ssl.SSLSession getHandshakeSession();
method public abstract javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus();
method public abstract boolean getNeedClientAuth();
- method public java.lang.String getPeerHost();
+ method public String getPeerHost();
method public int getPeerPort();
method public javax.net.ssl.SSLParameters getSSLParameters();
method public abstract javax.net.ssl.SSLSession getSession();
- method public abstract java.lang.String[] getSupportedCipherSuites();
- method public abstract java.lang.String[] getSupportedProtocols();
+ method public abstract String[] getSupportedCipherSuites();
+ method public abstract String[] getSupportedProtocols();
method public abstract boolean getUseClientMode();
method public abstract boolean getWantClientAuth();
method public abstract boolean isInboundDone();
method public abstract boolean isOutboundDone();
method public abstract void setEnableSessionCreation(boolean);
- method public abstract void setEnabledCipherSuites(java.lang.String[]);
- method public abstract void setEnabledProtocols(java.lang.String[]);
- method public void setHandshakeApplicationProtocolSelector(java.util.function.BiFunction<javax.net.ssl.SSLEngine, java.util.List<java.lang.String>, java.lang.String>);
+ method public abstract void setEnabledCipherSuites(String[]);
+ method public abstract void setEnabledProtocols(String[]);
+ method public void setHandshakeApplicationProtocolSelector(java.util.function.BiFunction<javax.net.ssl.SSLEngine,java.util.List<java.lang.String>,java.lang.String>);
method public abstract void setNeedClientAuth(boolean);
method public void setSSLParameters(javax.net.ssl.SSLParameters);
method public abstract void setUseClientMode(boolean);
@@ -75053,9 +75193,7 @@ package javax.net.ssl {
method public final javax.net.ssl.SSLEngineResult.Status getStatus();
}
- public static final class SSLEngineResult.HandshakeStatus extends java.lang.Enum {
- method public static javax.net.ssl.SSLEngineResult.HandshakeStatus valueOf(java.lang.String);
- method public static final javax.net.ssl.SSLEngineResult.HandshakeStatus[] values();
+ public enum SSLEngineResult.HandshakeStatus {
enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus FINISHED;
enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NEED_TASK;
enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NEED_UNWRAP;
@@ -75063,9 +75201,7 @@ package javax.net.ssl {
enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NOT_HANDSHAKING;
}
- public static final class SSLEngineResult.Status extends java.lang.Enum {
- method public static javax.net.ssl.SSLEngineResult.Status valueOf(java.lang.String);
- method public static final javax.net.ssl.SSLEngineResult.Status[] values();
+ public enum SSLEngineResult.Status {
enum_constant public static final javax.net.ssl.SSLEngineResult.Status BUFFER_OVERFLOW;
enum_constant public static final javax.net.ssl.SSLEngineResult.Status BUFFER_UNDERFLOW;
enum_constant public static final javax.net.ssl.SSLEngineResult.Status CLOSED;
@@ -75073,39 +75209,39 @@ package javax.net.ssl {
}
public class SSLException extends java.io.IOException {
- ctor public SSLException(java.lang.String);
- ctor public SSLException(java.lang.String, java.lang.Throwable);
- ctor public SSLException(java.lang.Throwable);
+ ctor public SSLException(String);
+ ctor public SSLException(String, Throwable);
+ ctor public SSLException(Throwable);
}
public class SSLHandshakeException extends javax.net.ssl.SSLException {
- ctor public SSLHandshakeException(java.lang.String);
+ ctor public SSLHandshakeException(String);
}
public class SSLKeyException extends javax.net.ssl.SSLException {
- ctor public SSLKeyException(java.lang.String);
+ ctor public SSLKeyException(String);
}
public class SSLParameters {
ctor public SSLParameters();
- ctor public SSLParameters(java.lang.String[]);
- ctor public SSLParameters(java.lang.String[], java.lang.String[]);
+ ctor public SSLParameters(String[]);
+ ctor public SSLParameters(String[], String[]);
method public java.security.AlgorithmConstraints getAlgorithmConstraints();
- method public java.lang.String[] getApplicationProtocols();
- method public java.lang.String[] getCipherSuites();
- method public java.lang.String getEndpointIdentificationAlgorithm();
+ method public String[] getApplicationProtocols();
+ method public String[] getCipherSuites();
+ method public String getEndpointIdentificationAlgorithm();
method public boolean getNeedClientAuth();
- method public java.lang.String[] getProtocols();
+ method public String[] getProtocols();
method public final java.util.Collection<javax.net.ssl.SNIMatcher> getSNIMatchers();
method public final java.util.List<javax.net.ssl.SNIServerName> getServerNames();
method public final boolean getUseCipherSuitesOrder();
method public boolean getWantClientAuth();
method public void setAlgorithmConstraints(java.security.AlgorithmConstraints);
- method public void setApplicationProtocols(java.lang.String[]);
- method public void setCipherSuites(java.lang.String[]);
- method public void setEndpointIdentificationAlgorithm(java.lang.String);
+ method public void setApplicationProtocols(String[]);
+ method public void setCipherSuites(String[]);
+ method public void setEndpointIdentificationAlgorithm(String);
method public void setNeedClientAuth(boolean);
- method public void setProtocols(java.lang.String[]);
+ method public void setProtocols(String[]);
method public final void setSNIMatchers(java.util.Collection<javax.net.ssl.SNIMatcher>);
method public final void setServerNames(java.util.List<javax.net.ssl.SNIServerName>);
method public final void setUseCipherSuitesOrder(boolean);
@@ -75113,16 +75249,16 @@ package javax.net.ssl {
}
public class SSLPeerUnverifiedException extends javax.net.ssl.SSLException {
- ctor public SSLPeerUnverifiedException(java.lang.String);
+ ctor public SSLPeerUnverifiedException(String);
}
public final class SSLPermission extends java.security.BasicPermission {
- ctor public SSLPermission(java.lang.String);
- ctor public SSLPermission(java.lang.String, java.lang.String);
+ ctor public SSLPermission(String);
+ ctor public SSLPermission(String, String);
}
public class SSLProtocolException extends javax.net.ssl.SSLException {
- ctor public SSLProtocolException(java.lang.String);
+ ctor public SSLProtocolException(String);
}
public abstract class SSLServerSocket extends java.net.ServerSocket {
@@ -75131,17 +75267,17 @@ package javax.net.ssl {
ctor protected SSLServerSocket(int, int) throws java.io.IOException;
ctor protected SSLServerSocket(int, int, java.net.InetAddress) throws java.io.IOException;
method public abstract boolean getEnableSessionCreation();
- method public abstract java.lang.String[] getEnabledCipherSuites();
- method public abstract java.lang.String[] getEnabledProtocols();
+ method public abstract String[] getEnabledCipherSuites();
+ method public abstract String[] getEnabledProtocols();
method public abstract boolean getNeedClientAuth();
method public javax.net.ssl.SSLParameters getSSLParameters();
- method public abstract java.lang.String[] getSupportedCipherSuites();
- method public abstract java.lang.String[] getSupportedProtocols();
+ method public abstract String[] getSupportedCipherSuites();
+ method public abstract String[] getSupportedProtocols();
method public abstract boolean getUseClientMode();
method public abstract boolean getWantClientAuth();
method public abstract void setEnableSessionCreation(boolean);
- method public abstract void setEnabledCipherSuites(java.lang.String[]);
- method public abstract void setEnabledProtocols(java.lang.String[]);
+ method public abstract void setEnabledCipherSuites(String[]);
+ method public abstract void setEnabledProtocols(String[]);
method public abstract void setNeedClientAuth(boolean);
method public void setSSLParameters(javax.net.ssl.SSLParameters);
method public abstract void setUseClientMode(boolean);
@@ -75150,81 +75286,81 @@ package javax.net.ssl {
public abstract class SSLServerSocketFactory extends javax.net.ServerSocketFactory {
ctor protected SSLServerSocketFactory();
- method public static synchronized javax.net.ServerSocketFactory getDefault();
- method public abstract java.lang.String[] getDefaultCipherSuites();
- method public abstract java.lang.String[] getSupportedCipherSuites();
+ method public static javax.net.ServerSocketFactory getDefault();
+ method public abstract String[] getDefaultCipherSuites();
+ method public abstract String[] getSupportedCipherSuites();
}
- public abstract interface SSLSession {
- method public abstract int getApplicationBufferSize();
- method public abstract java.lang.String getCipherSuite();
- method public abstract long getCreationTime();
- method public abstract byte[] getId();
- method public abstract long getLastAccessedTime();
- method public abstract java.security.cert.Certificate[] getLocalCertificates();
- method public abstract java.security.Principal getLocalPrincipal();
- method public abstract int getPacketBufferSize();
- method public abstract javax.security.cert.X509Certificate[] getPeerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
- method public abstract java.security.cert.Certificate[] getPeerCertificates() throws javax.net.ssl.SSLPeerUnverifiedException;
- method public abstract java.lang.String getPeerHost();
- method public abstract int getPeerPort();
- method public abstract java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
- method public abstract java.lang.String getProtocol();
- method public abstract javax.net.ssl.SSLSessionContext getSessionContext();
- method public abstract java.lang.Object getValue(java.lang.String);
- method public abstract java.lang.String[] getValueNames();
- method public abstract void invalidate();
- method public abstract boolean isValid();
- method public abstract void putValue(java.lang.String, java.lang.Object);
- method public abstract void removeValue(java.lang.String);
+ public interface SSLSession {
+ method public int getApplicationBufferSize();
+ method public String getCipherSuite();
+ method public long getCreationTime();
+ method public byte[] getId();
+ method public long getLastAccessedTime();
+ method public java.security.cert.Certificate[] getLocalCertificates();
+ method public java.security.Principal getLocalPrincipal();
+ method public int getPacketBufferSize();
+ method public javax.security.cert.X509Certificate[] getPeerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
+ method public java.security.cert.Certificate[] getPeerCertificates() throws javax.net.ssl.SSLPeerUnverifiedException;
+ method public String getPeerHost();
+ method public int getPeerPort();
+ method public java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
+ method public String getProtocol();
+ method public javax.net.ssl.SSLSessionContext getSessionContext();
+ method public Object getValue(String);
+ method public String[] getValueNames();
+ method public void invalidate();
+ method public boolean isValid();
+ method public void putValue(String, Object);
+ method public void removeValue(String);
}
public class SSLSessionBindingEvent extends java.util.EventObject {
- ctor public SSLSessionBindingEvent(javax.net.ssl.SSLSession, java.lang.String);
- method public java.lang.String getName();
+ ctor public SSLSessionBindingEvent(javax.net.ssl.SSLSession, String);
+ method public String getName();
method public javax.net.ssl.SSLSession getSession();
}
- public abstract interface SSLSessionBindingListener implements java.util.EventListener {
- method public abstract void valueBound(javax.net.ssl.SSLSessionBindingEvent);
- method public abstract void valueUnbound(javax.net.ssl.SSLSessionBindingEvent);
+ public interface SSLSessionBindingListener extends java.util.EventListener {
+ method public void valueBound(javax.net.ssl.SSLSessionBindingEvent);
+ method public void valueUnbound(javax.net.ssl.SSLSessionBindingEvent);
}
- public abstract interface SSLSessionContext {
- method public abstract java.util.Enumeration<byte[]> getIds();
- method public abstract javax.net.ssl.SSLSession getSession(byte[]);
- method public abstract int getSessionCacheSize();
- method public abstract int getSessionTimeout();
- method public abstract void setSessionCacheSize(int) throws java.lang.IllegalArgumentException;
- method public abstract void setSessionTimeout(int) throws java.lang.IllegalArgumentException;
+ public interface SSLSessionContext {
+ method public java.util.Enumeration<byte[]> getIds();
+ method public javax.net.ssl.SSLSession getSession(byte[]);
+ method public int getSessionCacheSize();
+ method public int getSessionTimeout();
+ method public void setSessionCacheSize(int) throws java.lang.IllegalArgumentException;
+ method public void setSessionTimeout(int) throws java.lang.IllegalArgumentException;
}
public abstract class SSLSocket extends java.net.Socket {
ctor protected SSLSocket();
- ctor protected SSLSocket(java.lang.String, int) throws java.io.IOException, java.net.UnknownHostException;
+ ctor protected SSLSocket(String, int) throws java.io.IOException, java.net.UnknownHostException;
ctor protected SSLSocket(java.net.InetAddress, int) throws java.io.IOException;
- ctor protected SSLSocket(java.lang.String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
+ ctor protected SSLSocket(String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
ctor protected SSLSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
method public abstract void addHandshakeCompletedListener(javax.net.ssl.HandshakeCompletedListener);
- method public java.lang.String getApplicationProtocol();
+ method public String getApplicationProtocol();
method public abstract boolean getEnableSessionCreation();
- method public abstract java.lang.String[] getEnabledCipherSuites();
- method public abstract java.lang.String[] getEnabledProtocols();
- method public java.lang.String getHandshakeApplicationProtocol();
- method public java.util.function.BiFunction<javax.net.ssl.SSLSocket, java.util.List<java.lang.String>, java.lang.String> getHandshakeApplicationProtocolSelector();
+ method public abstract String[] getEnabledCipherSuites();
+ method public abstract String[] getEnabledProtocols();
+ method public String getHandshakeApplicationProtocol();
+ method public java.util.function.BiFunction<javax.net.ssl.SSLSocket,java.util.List<java.lang.String>,java.lang.String> getHandshakeApplicationProtocolSelector();
method public javax.net.ssl.SSLSession getHandshakeSession();
method public abstract boolean getNeedClientAuth();
method public javax.net.ssl.SSLParameters getSSLParameters();
method public abstract javax.net.ssl.SSLSession getSession();
- method public abstract java.lang.String[] getSupportedCipherSuites();
- method public abstract java.lang.String[] getSupportedProtocols();
+ method public abstract String[] getSupportedCipherSuites();
+ method public abstract String[] getSupportedProtocols();
method public abstract boolean getUseClientMode();
method public abstract boolean getWantClientAuth();
method public abstract void removeHandshakeCompletedListener(javax.net.ssl.HandshakeCompletedListener);
method public abstract void setEnableSessionCreation(boolean);
- method public abstract void setEnabledCipherSuites(java.lang.String[]);
- method public abstract void setEnabledProtocols(java.lang.String[]);
- method public void setHandshakeApplicationProtocolSelector(java.util.function.BiFunction<javax.net.ssl.SSLSocket, java.util.List<java.lang.String>, java.lang.String>);
+ method public abstract void setEnabledCipherSuites(String[]);
+ method public abstract void setEnabledProtocols(String[]);
+ method public void setHandshakeApplicationProtocolSelector(java.util.function.BiFunction<javax.net.ssl.SSLSocket,java.util.List<java.lang.String>,java.lang.String>);
method public abstract void setNeedClientAuth(boolean);
method public void setSSLParameters(javax.net.ssl.SSLParameters);
method public abstract void setUseClientMode(boolean);
@@ -75234,26 +75370,26 @@ package javax.net.ssl {
public abstract class SSLSocketFactory extends javax.net.SocketFactory {
ctor public SSLSocketFactory();
- method public abstract java.net.Socket createSocket(java.net.Socket, java.lang.String, int, boolean) throws java.io.IOException;
- method public static synchronized javax.net.SocketFactory getDefault();
- method public abstract java.lang.String[] getDefaultCipherSuites();
- method public abstract java.lang.String[] getSupportedCipherSuites();
+ method public abstract java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException;
+ method public static javax.net.SocketFactory getDefault();
+ method public abstract String[] getDefaultCipherSuites();
+ method public abstract String[] getSupportedCipherSuites();
}
public final class StandardConstants {
field public static final int SNI_HOST_NAME = 0; // 0x0
}
- public abstract interface TrustManager {
+ public interface TrustManager {
}
public class TrustManagerFactory {
- ctor protected TrustManagerFactory(javax.net.ssl.TrustManagerFactorySpi, java.security.Provider, java.lang.String);
- method public final java.lang.String getAlgorithm();
- method public static final java.lang.String getDefaultAlgorithm();
- method public static final javax.net.ssl.TrustManagerFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
- method public static final javax.net.ssl.TrustManagerFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
- method public static final javax.net.ssl.TrustManagerFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
+ ctor protected TrustManagerFactory(javax.net.ssl.TrustManagerFactorySpi, java.security.Provider, String);
+ method public final String getAlgorithm();
+ method public static final String getDefaultAlgorithm();
+ method public static final javax.net.ssl.TrustManagerFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
+ method public static final javax.net.ssl.TrustManagerFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
+ method public static final javax.net.ssl.TrustManagerFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
method public final java.security.Provider getProvider();
method public final javax.net.ssl.TrustManager[] getTrustManagers();
method public final void init(java.security.KeyStore) throws java.security.KeyStoreException;
@@ -75269,31 +75405,31 @@ package javax.net.ssl {
public abstract class X509ExtendedKeyManager implements javax.net.ssl.X509KeyManager {
ctor protected X509ExtendedKeyManager();
- method public java.lang.String chooseEngineClientAlias(java.lang.String[], java.security.Principal[], javax.net.ssl.SSLEngine);
- method public java.lang.String chooseEngineServerAlias(java.lang.String, java.security.Principal[], javax.net.ssl.SSLEngine);
+ method public String chooseEngineClientAlias(String[], java.security.Principal[], javax.net.ssl.SSLEngine);
+ method public String chooseEngineServerAlias(String, java.security.Principal[], javax.net.ssl.SSLEngine);
}
public abstract class X509ExtendedTrustManager implements javax.net.ssl.X509TrustManager {
ctor public X509ExtendedTrustManager();
- method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String, java.net.Socket) throws java.security.cert.CertificateException;
- method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException;
- method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, java.net.Socket) throws java.security.cert.CertificateException;
- method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException;
+ method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], String, java.net.Socket) throws java.security.cert.CertificateException;
+ method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException;
+ method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], String, java.net.Socket) throws java.security.cert.CertificateException;
+ method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException;
}
- public abstract interface X509KeyManager implements javax.net.ssl.KeyManager {
- method public abstract java.lang.String chooseClientAlias(java.lang.String[], java.security.Principal[], java.net.Socket);
- method public abstract java.lang.String chooseServerAlias(java.lang.String, java.security.Principal[], java.net.Socket);
- method public abstract java.security.cert.X509Certificate[] getCertificateChain(java.lang.String);
- method public abstract java.lang.String[] getClientAliases(java.lang.String, java.security.Principal[]);
- method public abstract java.security.PrivateKey getPrivateKey(java.lang.String);
- method public abstract java.lang.String[] getServerAliases(java.lang.String, java.security.Principal[]);
+ public interface X509KeyManager extends javax.net.ssl.KeyManager {
+ method public String chooseClientAlias(String[], java.security.Principal[], java.net.Socket);
+ method public String chooseServerAlias(String, java.security.Principal[], java.net.Socket);
+ method public java.security.cert.X509Certificate[] getCertificateChain(String);
+ method public String[] getClientAliases(String, java.security.Principal[]);
+ method public java.security.PrivateKey getPrivateKey(String);
+ method public String[] getServerAliases(String, java.security.Principal[]);
}
- public abstract interface X509TrustManager implements javax.net.ssl.TrustManager {
- method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String) throws java.security.cert.CertificateException;
- method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String) throws java.security.cert.CertificateException;
- method public abstract java.security.cert.X509Certificate[] getAcceptedIssuers();
+ public interface X509TrustManager extends javax.net.ssl.TrustManager {
+ method public void checkClientTrusted(java.security.cert.X509Certificate[], String) throws java.security.cert.CertificateException;
+ method public void checkServerTrusted(java.security.cert.X509Certificate[], String) throws java.security.cert.CertificateException;
+ method public java.security.cert.X509Certificate[] getAcceptedIssuers();
}
}
@@ -75301,25 +75437,25 @@ package javax.net.ssl {
package javax.security.auth {
public final class AuthPermission extends java.security.BasicPermission {
- ctor public AuthPermission(java.lang.String);
- ctor public AuthPermission(java.lang.String, java.lang.String);
+ ctor public AuthPermission(String);
+ ctor public AuthPermission(String, String);
}
public class DestroyFailedException extends java.lang.Exception {
ctor public DestroyFailedException();
- ctor public DestroyFailedException(java.lang.String);
+ ctor public DestroyFailedException(String);
}
- public abstract interface Destroyable {
+ public interface Destroyable {
method public default void destroy() throws javax.security.auth.DestroyFailedException;
method public default boolean isDestroyed();
}
public final class PrivateCredentialPermission extends java.security.Permission {
- ctor public PrivateCredentialPermission(java.lang.String, java.lang.String);
- method public java.lang.String getActions();
- method public java.lang.String getCredentialClass();
- method public java.lang.String[][] getPrincipals();
+ ctor public PrivateCredentialPermission(String, String);
+ method public String getActions();
+ method public String getCredentialClass();
+ method public String[][] getPrincipals();
method public boolean implies(java.security.Permission);
}
@@ -75331,11 +75467,11 @@ package javax.security.auth {
method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
method public java.util.Set<java.security.Principal> getPrincipals();
- method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>);
+ method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(Class<T>);
method public java.util.Set<java.lang.Object> getPrivateCredentials();
- method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
+ method public <T> java.util.Set<T> getPrivateCredentials(Class<T>);
method public java.util.Set<java.lang.Object> getPublicCredentials();
- method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
+ method public <T> java.util.Set<T> getPublicCredentials(Class<T>);
method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
method public boolean isReadOnly();
method public void setReadOnly();
@@ -75351,25 +75487,25 @@ package javax.security.auth {
package javax.security.auth.callback {
- public abstract interface Callback {
+ public interface Callback {
}
- public abstract interface CallbackHandler {
- method public abstract void handle(javax.security.auth.callback.Callback[]) throws java.io.IOException, javax.security.auth.callback.UnsupportedCallbackException;
+ public interface CallbackHandler {
+ method public void handle(javax.security.auth.callback.Callback[]) throws java.io.IOException, javax.security.auth.callback.UnsupportedCallbackException;
}
public class PasswordCallback implements javax.security.auth.callback.Callback java.io.Serializable {
- ctor public PasswordCallback(java.lang.String, boolean);
+ ctor public PasswordCallback(String, boolean);
method public void clearPassword();
method public char[] getPassword();
- method public java.lang.String getPrompt();
+ method public String getPrompt();
method public boolean isEchoOn();
method public void setPassword(char[]);
}
public class UnsupportedCallbackException extends java.lang.Exception {
ctor public UnsupportedCallbackException(javax.security.auth.callback.Callback);
- ctor public UnsupportedCallbackException(javax.security.auth.callback.Callback, java.lang.String);
+ ctor public UnsupportedCallbackException(javax.security.auth.callback.Callback, String);
method public javax.security.auth.callback.Callback getCallback();
}
@@ -75379,7 +75515,7 @@ package javax.security.auth.login {
public class LoginException extends java.security.GeneralSecurityException {
ctor public LoginException();
- ctor public LoginException(java.lang.String);
+ ctor public LoginException(String);
}
}
@@ -75387,17 +75523,17 @@ package javax.security.auth.login {
package javax.security.auth.x500 {
public final class X500Principal implements java.security.Principal java.io.Serializable {
- ctor public X500Principal(java.lang.String);
- ctor public X500Principal(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
+ ctor public X500Principal(String);
+ ctor public X500Principal(String, java.util.Map<java.lang.String,java.lang.String>);
ctor public X500Principal(byte[]);
ctor public X500Principal(java.io.InputStream);
method public byte[] getEncoded();
- method public java.lang.String getName();
- method public java.lang.String getName(java.lang.String);
- method public java.lang.String getName(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
- field public static final java.lang.String CANONICAL = "CANONICAL";
- field public static final java.lang.String RFC1779 = "RFC1779";
- field public static final java.lang.String RFC2253 = "RFC2253";
+ method public String getName();
+ method public String getName(String);
+ method public String getName(String, java.util.Map<java.lang.String,java.lang.String>);
+ field public static final String CANONICAL = "CANONICAL";
+ field public static final String RFC1779 = "RFC1779";
+ field public static final String RFC2253 = "RFC2253";
}
}
@@ -75408,34 +75544,34 @@ package javax.security.cert {
ctor public Certificate();
method public abstract byte[] getEncoded() throws javax.security.cert.CertificateEncodingException;
method public abstract java.security.PublicKey getPublicKey();
- method public abstract java.lang.String toString();
+ method public abstract String toString();
method public abstract void verify(java.security.PublicKey) throws javax.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
- method public abstract void verify(java.security.PublicKey, java.lang.String) throws javax.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
+ method public abstract void verify(java.security.PublicKey, String) throws javax.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
}
public class CertificateEncodingException extends javax.security.cert.CertificateException {
ctor public CertificateEncodingException();
- ctor public CertificateEncodingException(java.lang.String);
+ ctor public CertificateEncodingException(String);
}
public class CertificateException extends java.lang.Exception {
ctor public CertificateException();
- ctor public CertificateException(java.lang.String);
+ ctor public CertificateException(String);
}
public class CertificateExpiredException extends javax.security.cert.CertificateException {
ctor public CertificateExpiredException();
- ctor public CertificateExpiredException(java.lang.String);
+ ctor public CertificateExpiredException(String);
}
public class CertificateNotYetValidException extends javax.security.cert.CertificateException {
ctor public CertificateNotYetValidException();
- ctor public CertificateNotYetValidException(java.lang.String);
+ ctor public CertificateNotYetValidException(String);
}
public class CertificateParsingException extends javax.security.cert.CertificateException {
ctor public CertificateParsingException();
- ctor public CertificateParsingException(java.lang.String);
+ ctor public CertificateParsingException(String);
}
public abstract class X509Certificate extends javax.security.cert.Certificate {
@@ -75448,8 +75584,8 @@ package javax.security.cert {
method public abstract java.util.Date getNotAfter();
method public abstract java.util.Date getNotBefore();
method public abstract java.math.BigInteger getSerialNumber();
- method public abstract java.lang.String getSigAlgName();
- method public abstract java.lang.String getSigAlgOID();
+ method public abstract String getSigAlgName();
+ method public abstract String getSigAlgOID();
method public abstract byte[] getSigAlgParams();
method public abstract java.security.Principal getSubjectDN();
method public abstract int getVersion();
@@ -75459,12 +75595,12 @@ package javax.security.cert {
package javax.sql {
- public abstract interface CommonDataSource {
- method public abstract java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
- method public abstract int getLoginTimeout() throws java.sql.SQLException;
- method public abstract java.util.logging.Logger getParentLogger() throws java.sql.SQLFeatureNotSupportedException;
- method public abstract void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
- method public abstract void setLoginTimeout(int) throws java.sql.SQLException;
+ public interface CommonDataSource {
+ method public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
+ method public int getLoginTimeout() throws java.sql.SQLException;
+ method public java.util.logging.Logger getParentLogger() throws java.sql.SQLFeatureNotSupportedException;
+ method public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
+ method public void setLoginTimeout(int) throws java.sql.SQLException;
}
public class ConnectionEvent extends java.util.EventObject {
@@ -75473,192 +75609,192 @@ package javax.sql {
method public java.sql.SQLException getSQLException();
}
- public abstract interface ConnectionEventListener implements java.util.EventListener {
- method public abstract void connectionClosed(javax.sql.ConnectionEvent);
- method public abstract void connectionErrorOccurred(javax.sql.ConnectionEvent);
+ public interface ConnectionEventListener extends java.util.EventListener {
+ method public void connectionClosed(javax.sql.ConnectionEvent);
+ method public void connectionErrorOccurred(javax.sql.ConnectionEvent);
}
- public abstract interface ConnectionPoolDataSource implements javax.sql.CommonDataSource {
- method public abstract javax.sql.PooledConnection getPooledConnection() throws java.sql.SQLException;
- method public abstract javax.sql.PooledConnection getPooledConnection(java.lang.String, java.lang.String) throws java.sql.SQLException;
+ public interface ConnectionPoolDataSource extends javax.sql.CommonDataSource {
+ method public javax.sql.PooledConnection getPooledConnection() throws java.sql.SQLException;
+ method public javax.sql.PooledConnection getPooledConnection(String, String) throws java.sql.SQLException;
}
- public abstract interface DataSource implements javax.sql.CommonDataSource java.sql.Wrapper {
- method public abstract java.sql.Connection getConnection() throws java.sql.SQLException;
- method public abstract java.sql.Connection getConnection(java.lang.String, java.lang.String) throws java.sql.SQLException;
+ public interface DataSource extends javax.sql.CommonDataSource java.sql.Wrapper {
+ method public java.sql.Connection getConnection() throws java.sql.SQLException;
+ method public java.sql.Connection getConnection(String, String) throws java.sql.SQLException;
}
- public abstract interface PooledConnection {
- method public abstract void addConnectionEventListener(javax.sql.ConnectionEventListener);
- method public abstract void addStatementEventListener(javax.sql.StatementEventListener);
- method public abstract void close() throws java.sql.SQLException;
- method public abstract java.sql.Connection getConnection() throws java.sql.SQLException;
- method public abstract void removeConnectionEventListener(javax.sql.ConnectionEventListener);
- method public abstract void removeStatementEventListener(javax.sql.StatementEventListener);
+ public interface PooledConnection {
+ method public void addConnectionEventListener(javax.sql.ConnectionEventListener);
+ method public void addStatementEventListener(javax.sql.StatementEventListener);
+ method public void close() throws java.sql.SQLException;
+ method public java.sql.Connection getConnection() throws java.sql.SQLException;
+ method public void removeConnectionEventListener(javax.sql.ConnectionEventListener);
+ method public void removeStatementEventListener(javax.sql.StatementEventListener);
}
- public abstract interface RowSet implements java.sql.ResultSet {
- method public abstract void addRowSetListener(javax.sql.RowSetListener);
- method public abstract void clearParameters() throws java.sql.SQLException;
- method public abstract void execute() throws java.sql.SQLException;
- method public abstract java.lang.String getCommand();
- method public abstract java.lang.String getDataSourceName();
- method public abstract boolean getEscapeProcessing() throws java.sql.SQLException;
- method public abstract int getMaxFieldSize() throws java.sql.SQLException;
- method public abstract int getMaxRows() throws java.sql.SQLException;
- method public abstract java.lang.String getPassword();
- method public abstract int getQueryTimeout() throws java.sql.SQLException;
- method public abstract int getTransactionIsolation();
- method public abstract java.util.Map<java.lang.String, java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
- method public abstract java.lang.String getUrl() throws java.sql.SQLException;
- method public abstract java.lang.String getUsername();
- method public abstract boolean isReadOnly();
- method public abstract void removeRowSetListener(javax.sql.RowSetListener);
- method public abstract void setArray(int, java.sql.Array) throws java.sql.SQLException;
- method public abstract void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setAsciiStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setAsciiStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void setBigDecimal(java.lang.String, java.math.BigDecimal) throws java.sql.SQLException;
- method public abstract void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setBinaryStream(java.lang.String, java.io.InputStream, int) throws java.sql.SQLException;
- method public abstract void setBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBinaryStream(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBlob(int, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.io.InputStream, long) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.sql.Blob) throws java.sql.SQLException;
- method public abstract void setBlob(java.lang.String, java.io.InputStream) throws java.sql.SQLException;
- method public abstract void setBoolean(int, boolean) throws java.sql.SQLException;
- method public abstract void setBoolean(java.lang.String, boolean) throws java.sql.SQLException;
- method public abstract void setByte(int, byte) throws java.sql.SQLException;
- method public abstract void setByte(java.lang.String, byte) throws java.sql.SQLException;
- method public abstract void setBytes(int, byte[]) throws java.sql.SQLException;
- method public abstract void setBytes(java.lang.String, byte[]) throws java.sql.SQLException;
- method public abstract void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void setCharacterStream(java.lang.String, java.io.Reader, int) throws java.sql.SQLException;
- method public abstract void setCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setClob(int, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void setClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.sql.Clob) throws java.sql.SQLException;
- method public abstract void setClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setCommand(java.lang.String) throws java.sql.SQLException;
- method public abstract void setConcurrency(int) throws java.sql.SQLException;
- method public abstract void setDataSourceName(java.lang.String) throws java.sql.SQLException;
- method public abstract void setDate(int, java.sql.Date) throws java.sql.SQLException;
- method public abstract void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setDate(java.lang.String, java.sql.Date) throws java.sql.SQLException;
- method public abstract void setDate(java.lang.String, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setDouble(int, double) throws java.sql.SQLException;
- method public abstract void setDouble(java.lang.String, double) throws java.sql.SQLException;
- method public abstract void setEscapeProcessing(boolean) throws java.sql.SQLException;
- method public abstract void setFloat(int, float) throws java.sql.SQLException;
- method public abstract void setFloat(java.lang.String, float) throws java.sql.SQLException;
- method public abstract void setInt(int, int) throws java.sql.SQLException;
- method public abstract void setInt(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void setLong(int, long) throws java.sql.SQLException;
- method public abstract void setLong(java.lang.String, long) throws java.sql.SQLException;
- method public abstract void setMaxFieldSize(int) throws java.sql.SQLException;
- method public abstract void setMaxRows(int) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNCharacterStream(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNClob(java.lang.String, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.io.Reader, long) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.sql.NClob) throws java.sql.SQLException;
- method public abstract void setNClob(int, java.io.Reader) throws java.sql.SQLException;
- method public abstract void setNString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setNString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void setNull(int, int) throws java.sql.SQLException;
- method public abstract void setNull(java.lang.String, int) throws java.sql.SQLException;
- method public abstract void setNull(int, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setNull(java.lang.String, int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object, int, int) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object, int, int) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object, int) throws java.sql.SQLException;
- method public abstract void setObject(java.lang.String, java.lang.Object) throws java.sql.SQLException;
- method public abstract void setObject(int, java.lang.Object) throws java.sql.SQLException;
- method public abstract void setPassword(java.lang.String) throws java.sql.SQLException;
- method public abstract void setQueryTimeout(int) throws java.sql.SQLException;
- method public abstract void setReadOnly(boolean) throws java.sql.SQLException;
- method public abstract void setRef(int, java.sql.Ref) throws java.sql.SQLException;
- method public abstract void setRowId(int, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void setRowId(java.lang.String, java.sql.RowId) throws java.sql.SQLException;
- method public abstract void setSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void setSQLXML(java.lang.String, java.sql.SQLXML) throws java.sql.SQLException;
- method public abstract void setShort(int, short) throws java.sql.SQLException;
- method public abstract void setShort(java.lang.String, short) throws java.sql.SQLException;
- method public abstract void setString(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setString(java.lang.String, java.lang.String) throws java.sql.SQLException;
- method public abstract void setTime(int, java.sql.Time) throws java.sql.SQLException;
- method public abstract void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTime(java.lang.String, java.sql.Time) throws java.sql.SQLException;
- method public abstract void setTime(java.lang.String, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void setTimestamp(java.lang.String, java.sql.Timestamp) throws java.sql.SQLException;
- method public abstract void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTimestamp(java.lang.String, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
- method public abstract void setTransactionIsolation(int) throws java.sql.SQLException;
- method public abstract void setType(int) throws java.sql.SQLException;
- method public abstract void setTypeMap(java.util.Map<java.lang.String, java.lang.Class<?>>) throws java.sql.SQLException;
- method public abstract void setURL(int, java.net.URL) throws java.sql.SQLException;
- method public abstract void setUrl(java.lang.String) throws java.sql.SQLException;
- method public abstract void setUsername(java.lang.String) throws java.sql.SQLException;
+ public interface RowSet extends java.sql.ResultSet {
+ method public void addRowSetListener(javax.sql.RowSetListener);
+ method public void clearParameters() throws java.sql.SQLException;
+ method public void execute() throws java.sql.SQLException;
+ method public String getCommand();
+ method public String getDataSourceName();
+ method public boolean getEscapeProcessing() throws java.sql.SQLException;
+ method public int getMaxFieldSize() throws java.sql.SQLException;
+ method public int getMaxRows() throws java.sql.SQLException;
+ method public String getPassword();
+ method public int getQueryTimeout() throws java.sql.SQLException;
+ method public int getTransactionIsolation();
+ method public java.util.Map<java.lang.String,java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
+ method public String getUrl() throws java.sql.SQLException;
+ method public String getUsername();
+ method public boolean isReadOnly();
+ method public void removeRowSetListener(javax.sql.RowSetListener);
+ method public void setArray(int, java.sql.Array) throws java.sql.SQLException;
+ method public void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setAsciiStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setAsciiStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setAsciiStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void setBigDecimal(String, java.math.BigDecimal) throws java.sql.SQLException;
+ method public void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setBinaryStream(String, java.io.InputStream, int) throws java.sql.SQLException;
+ method public void setBinaryStream(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBinaryStream(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
+ method public void setBlob(int, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBlob(int, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBlob(String, java.io.InputStream, long) throws java.sql.SQLException;
+ method public void setBlob(String, java.sql.Blob) throws java.sql.SQLException;
+ method public void setBlob(String, java.io.InputStream) throws java.sql.SQLException;
+ method public void setBoolean(int, boolean) throws java.sql.SQLException;
+ method public void setBoolean(String, boolean) throws java.sql.SQLException;
+ method public void setByte(int, byte) throws java.sql.SQLException;
+ method public void setByte(String, byte) throws java.sql.SQLException;
+ method public void setBytes(int, byte[]) throws java.sql.SQLException;
+ method public void setBytes(String, byte[]) throws java.sql.SQLException;
+ method public void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
+ method public void setCharacterStream(String, java.io.Reader, int) throws java.sql.SQLException;
+ method public void setCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setClob(int, java.sql.Clob) throws java.sql.SQLException;
+ method public void setClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setClob(String, java.sql.Clob) throws java.sql.SQLException;
+ method public void setClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setCommand(String) throws java.sql.SQLException;
+ method public void setConcurrency(int) throws java.sql.SQLException;
+ method public void setDataSourceName(String) throws java.sql.SQLException;
+ method public void setDate(int, java.sql.Date) throws java.sql.SQLException;
+ method public void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
+ method public void setDate(String, java.sql.Date) throws java.sql.SQLException;
+ method public void setDate(String, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
+ method public void setDouble(int, double) throws java.sql.SQLException;
+ method public void setDouble(String, double) throws java.sql.SQLException;
+ method public void setEscapeProcessing(boolean) throws java.sql.SQLException;
+ method public void setFloat(int, float) throws java.sql.SQLException;
+ method public void setFloat(String, float) throws java.sql.SQLException;
+ method public void setInt(int, int) throws java.sql.SQLException;
+ method public void setInt(String, int) throws java.sql.SQLException;
+ method public void setLong(int, long) throws java.sql.SQLException;
+ method public void setLong(String, long) throws java.sql.SQLException;
+ method public void setMaxFieldSize(int) throws java.sql.SQLException;
+ method public void setMaxRows(int) throws java.sql.SQLException;
+ method public void setNCharacterStream(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setNCharacterStream(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNCharacterStream(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setNClob(String, java.sql.NClob) throws java.sql.SQLException;
+ method public void setNClob(String, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNClob(String, java.io.Reader) throws java.sql.SQLException;
+ method public void setNClob(int, java.io.Reader, long) throws java.sql.SQLException;
+ method public void setNClob(int, java.sql.NClob) throws java.sql.SQLException;
+ method public void setNClob(int, java.io.Reader) throws java.sql.SQLException;
+ method public void setNString(int, String) throws java.sql.SQLException;
+ method public void setNString(String, String) throws java.sql.SQLException;
+ method public void setNull(int, int) throws java.sql.SQLException;
+ method public void setNull(String, int) throws java.sql.SQLException;
+ method public void setNull(int, int, String) throws java.sql.SQLException;
+ method public void setNull(String, int, String) throws java.sql.SQLException;
+ method public void setObject(int, Object, int, int) throws java.sql.SQLException;
+ method public void setObject(String, Object, int, int) throws java.sql.SQLException;
+ method public void setObject(int, Object, int) throws java.sql.SQLException;
+ method public void setObject(String, Object, int) throws java.sql.SQLException;
+ method public void setObject(String, Object) throws java.sql.SQLException;
+ method public void setObject(int, Object) throws java.sql.SQLException;
+ method public void setPassword(String) throws java.sql.SQLException;
+ method public void setQueryTimeout(int) throws java.sql.SQLException;
+ method public void setReadOnly(boolean) throws java.sql.SQLException;
+ method public void setRef(int, java.sql.Ref) throws java.sql.SQLException;
+ method public void setRowId(int, java.sql.RowId) throws java.sql.SQLException;
+ method public void setRowId(String, java.sql.RowId) throws java.sql.SQLException;
+ method public void setSQLXML(int, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void setSQLXML(String, java.sql.SQLXML) throws java.sql.SQLException;
+ method public void setShort(int, short) throws java.sql.SQLException;
+ method public void setShort(String, short) throws java.sql.SQLException;
+ method public void setString(int, String) throws java.sql.SQLException;
+ method public void setString(String, String) throws java.sql.SQLException;
+ method public void setTime(int, java.sql.Time) throws java.sql.SQLException;
+ method public void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTime(String, java.sql.Time) throws java.sql.SQLException;
+ method public void setTime(String, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
+ method public void setTimestamp(String, java.sql.Timestamp) throws java.sql.SQLException;
+ method public void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTimestamp(String, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
+ method public void setTransactionIsolation(int) throws java.sql.SQLException;
+ method public void setType(int) throws java.sql.SQLException;
+ method public void setTypeMap(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
+ method public void setURL(int, java.net.URL) throws java.sql.SQLException;
+ method public void setUrl(String) throws java.sql.SQLException;
+ method public void setUsername(String) throws java.sql.SQLException;
}
public class RowSetEvent extends java.util.EventObject {
ctor public RowSetEvent(javax.sql.RowSet);
}
- public abstract interface RowSetInternal {
- method public abstract java.sql.Connection getConnection() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getOriginal() throws java.sql.SQLException;
- method public abstract java.sql.ResultSet getOriginalRow() throws java.sql.SQLException;
- method public abstract java.lang.Object[] getParams() throws java.sql.SQLException;
- method public abstract void setMetaData(javax.sql.RowSetMetaData) throws java.sql.SQLException;
+ public interface RowSetInternal {
+ method public java.sql.Connection getConnection() throws java.sql.SQLException;
+ method public java.sql.ResultSet getOriginal() throws java.sql.SQLException;
+ method public java.sql.ResultSet getOriginalRow() throws java.sql.SQLException;
+ method public Object[] getParams() throws java.sql.SQLException;
+ method public void setMetaData(javax.sql.RowSetMetaData) throws java.sql.SQLException;
}
- public abstract interface RowSetListener implements java.util.EventListener {
- method public abstract void cursorMoved(javax.sql.RowSetEvent);
- method public abstract void rowChanged(javax.sql.RowSetEvent);
- method public abstract void rowSetChanged(javax.sql.RowSetEvent);
+ public interface RowSetListener extends java.util.EventListener {
+ method public void cursorMoved(javax.sql.RowSetEvent);
+ method public void rowChanged(javax.sql.RowSetEvent);
+ method public void rowSetChanged(javax.sql.RowSetEvent);
}
- public abstract interface RowSetMetaData implements java.sql.ResultSetMetaData {
- method public abstract void setAutoIncrement(int, boolean) throws java.sql.SQLException;
- method public abstract void setCaseSensitive(int, boolean) throws java.sql.SQLException;
- method public abstract void setCatalogName(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setColumnCount(int) throws java.sql.SQLException;
- method public abstract void setColumnDisplaySize(int, int) throws java.sql.SQLException;
- method public abstract void setColumnLabel(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setColumnName(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setColumnType(int, int) throws java.sql.SQLException;
- method public abstract void setColumnTypeName(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setCurrency(int, boolean) throws java.sql.SQLException;
- method public abstract void setNullable(int, int) throws java.sql.SQLException;
- method public abstract void setPrecision(int, int) throws java.sql.SQLException;
- method public abstract void setScale(int, int) throws java.sql.SQLException;
- method public abstract void setSchemaName(int, java.lang.String) throws java.sql.SQLException;
- method public abstract void setSearchable(int, boolean) throws java.sql.SQLException;
- method public abstract void setSigned(int, boolean) throws java.sql.SQLException;
- method public abstract void setTableName(int, java.lang.String) throws java.sql.SQLException;
+ public interface RowSetMetaData extends java.sql.ResultSetMetaData {
+ method public void setAutoIncrement(int, boolean) throws java.sql.SQLException;
+ method public void setCaseSensitive(int, boolean) throws java.sql.SQLException;
+ method public void setCatalogName(int, String) throws java.sql.SQLException;
+ method public void setColumnCount(int) throws java.sql.SQLException;
+ method public void setColumnDisplaySize(int, int) throws java.sql.SQLException;
+ method public void setColumnLabel(int, String) throws java.sql.SQLException;
+ method public void setColumnName(int, String) throws java.sql.SQLException;
+ method public void setColumnType(int, int) throws java.sql.SQLException;
+ method public void setColumnTypeName(int, String) throws java.sql.SQLException;
+ method public void setCurrency(int, boolean) throws java.sql.SQLException;
+ method public void setNullable(int, int) throws java.sql.SQLException;
+ method public void setPrecision(int, int) throws java.sql.SQLException;
+ method public void setScale(int, int) throws java.sql.SQLException;
+ method public void setSchemaName(int, String) throws java.sql.SQLException;
+ method public void setSearchable(int, boolean) throws java.sql.SQLException;
+ method public void setSigned(int, boolean) throws java.sql.SQLException;
+ method public void setTableName(int, String) throws java.sql.SQLException;
}
- public abstract interface RowSetReader {
- method public abstract void readData(javax.sql.RowSetInternal) throws java.sql.SQLException;
+ public interface RowSetReader {
+ method public void readData(javax.sql.RowSetInternal) throws java.sql.SQLException;
}
- public abstract interface RowSetWriter {
- method public abstract boolean writeData(javax.sql.RowSetInternal) throws java.sql.SQLException;
+ public interface RowSetWriter {
+ method public boolean writeData(javax.sql.RowSetInternal) throws java.sql.SQLException;
}
public class StatementEvent extends java.util.EventObject {
@@ -75668,9 +75804,9 @@ package javax.sql {
method public java.sql.PreparedStatement getStatement();
}
- public abstract interface StatementEventListener implements java.util.EventListener {
- method public abstract void statementClosed(javax.sql.StatementEvent);
- method public abstract void statementErrorOccurred(javax.sql.StatementEvent);
+ public interface StatementEventListener extends java.util.EventListener {
+ method public void statementClosed(javax.sql.StatementEvent);
+ method public void statementErrorOccurred(javax.sql.StatementEvent);
}
}
@@ -75678,18 +75814,18 @@ package javax.sql {
package javax.xml {
public final class XMLConstants {
- field public static final java.lang.String DEFAULT_NS_PREFIX = "";
- field public static final java.lang.String FEATURE_SECURE_PROCESSING = "http://javax.xml.XMLConstants/feature/secure-processing";
- field public static final java.lang.String NULL_NS_URI = "";
- field public static final java.lang.String RELAXNG_NS_URI = "http://relaxng.org/ns/structure/1.0";
- field public static final java.lang.String W3C_XML_SCHEMA_INSTANCE_NS_URI = "http://www.w3.org/2001/XMLSchema-instance";
- field public static final java.lang.String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema";
- field public static final java.lang.String W3C_XPATH_DATATYPE_NS_URI = "http://www.w3.org/2003/11/xpath-datatypes";
- field public static final java.lang.String XMLNS_ATTRIBUTE = "xmlns";
- field public static final java.lang.String XMLNS_ATTRIBUTE_NS_URI = "http://www.w3.org/2000/xmlns/";
- field public static final java.lang.String XML_DTD_NS_URI = "http://www.w3.org/TR/REC-xml";
- field public static final java.lang.String XML_NS_PREFIX = "xml";
- field public static final java.lang.String XML_NS_URI = "http://www.w3.org/XML/1998/namespace";
+ field public static final String DEFAULT_NS_PREFIX = "";
+ field public static final String FEATURE_SECURE_PROCESSING = "http://javax.xml.XMLConstants/feature/secure-processing";
+ field public static final String NULL_NS_URI = "";
+ field public static final String RELAXNG_NS_URI = "http://relaxng.org/ns/structure/1.0";
+ field public static final String W3C_XML_SCHEMA_INSTANCE_NS_URI = "http://www.w3.org/2001/XMLSchema-instance";
+ field public static final String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema";
+ field public static final String W3C_XPATH_DATATYPE_NS_URI = "http://www.w3.org/2003/11/xpath-datatypes";
+ field public static final String XMLNS_ATTRIBUTE = "xmlns";
+ field public static final String XMLNS_ATTRIBUTE_NS_URI = "http://www.w3.org/2000/xmlns/";
+ field public static final String XML_DTD_NS_URI = "http://www.w3.org/TR/REC-xml";
+ field public static final String XML_NS_PREFIX = "xml";
+ field public static final String XML_NS_URI = "http://www.w3.org/XML/1998/namespace";
}
}
@@ -75698,9 +75834,9 @@ package javax.xml.datatype {
public class DatatypeConfigurationException extends java.lang.Exception {
ctor public DatatypeConfigurationException();
- ctor public DatatypeConfigurationException(java.lang.String);
- ctor public DatatypeConfigurationException(java.lang.String, java.lang.Throwable);
- ctor public DatatypeConfigurationException(java.lang.Throwable);
+ ctor public DatatypeConfigurationException(String);
+ ctor public DatatypeConfigurationException(String, Throwable);
+ ctor public DatatypeConfigurationException(Throwable);
}
public final class DatatypeConstants {
@@ -75748,22 +75884,22 @@ package javax.xml.datatype {
public abstract class DatatypeFactory {
ctor protected DatatypeFactory();
- method public abstract javax.xml.datatype.Duration newDuration(java.lang.String);
+ method public abstract javax.xml.datatype.Duration newDuration(String);
method public abstract javax.xml.datatype.Duration newDuration(long);
method public abstract javax.xml.datatype.Duration newDuration(boolean, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigDecimal);
method public javax.xml.datatype.Duration newDuration(boolean, int, int, int, int, int, int);
- method public javax.xml.datatype.Duration newDurationDayTime(java.lang.String);
+ method public javax.xml.datatype.Duration newDurationDayTime(String);
method public javax.xml.datatype.Duration newDurationDayTime(long);
method public javax.xml.datatype.Duration newDurationDayTime(boolean, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
method public javax.xml.datatype.Duration newDurationDayTime(boolean, int, int, int, int);
- method public javax.xml.datatype.Duration newDurationYearMonth(java.lang.String);
+ method public javax.xml.datatype.Duration newDurationYearMonth(String);
method public javax.xml.datatype.Duration newDurationYearMonth(long);
method public javax.xml.datatype.Duration newDurationYearMonth(boolean, java.math.BigInteger, java.math.BigInteger);
method public javax.xml.datatype.Duration newDurationYearMonth(boolean, int, int);
method public static javax.xml.datatype.DatatypeFactory newInstance() throws javax.xml.datatype.DatatypeConfigurationException;
- method public static javax.xml.datatype.DatatypeFactory newInstance(java.lang.String, java.lang.ClassLoader) throws javax.xml.datatype.DatatypeConfigurationException;
+ method public static javax.xml.datatype.DatatypeFactory newInstance(String, ClassLoader) throws javax.xml.datatype.DatatypeConfigurationException;
method public abstract javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar();
- method public abstract javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar(java.lang.String);
+ method public abstract javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar(String);
method public abstract javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar(java.util.GregorianCalendar);
method public abstract javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar(java.math.BigInteger, int, int, int, int, int, java.math.BigDecimal, int);
method public javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendar(int, int, int, int, int, int, int, int);
@@ -75771,8 +75907,8 @@ package javax.xml.datatype {
method public javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendarTime(int, int, int, int);
method public javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendarTime(int, int, int, java.math.BigDecimal, int);
method public javax.xml.datatype.XMLGregorianCalendar newXMLGregorianCalendarTime(int, int, int, int, int);
- field public static final java.lang.String DATATYPEFACTORY_IMPLEMENTATION_CLASS;
- field public static final java.lang.String DATATYPEFACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
+ field public static final String DATATYPEFACTORY_IMPLEMENTATION_CLASS;
+ field public static final String DATATYPEFACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
}
public abstract class Duration {
@@ -75782,7 +75918,7 @@ package javax.xml.datatype {
method public void addTo(java.util.Date);
method public abstract int compare(javax.xml.datatype.Duration);
method public int getDays();
- method public abstract java.lang.Number getField(javax.xml.datatype.DatatypeConstants.Field);
+ method public abstract Number getField(javax.xml.datatype.DatatypeConstants.Field);
method public int getHours();
method public int getMinutes();
method public int getMonths();
@@ -75807,7 +75943,7 @@ package javax.xml.datatype {
ctor public XMLGregorianCalendar();
method public abstract void add(javax.xml.datatype.Duration);
method public abstract void clear();
- method public abstract java.lang.Object clone();
+ method public abstract Object clone();
method public abstract int compare(javax.xml.datatype.XMLGregorianCalendar);
method public abstract int getDay();
method public abstract java.math.BigInteger getEon();
@@ -75840,29 +75976,29 @@ package javax.xml.datatype {
method public abstract void setYear(int);
method public abstract java.util.GregorianCalendar toGregorianCalendar();
method public abstract java.util.GregorianCalendar toGregorianCalendar(java.util.TimeZone, java.util.Locale, javax.xml.datatype.XMLGregorianCalendar);
- method public abstract java.lang.String toXMLFormat();
+ method public abstract String toXMLFormat();
}
}
package javax.xml.namespace {
- public abstract interface NamespaceContext {
- method public abstract java.lang.String getNamespaceURI(java.lang.String);
- method public abstract java.lang.String getPrefix(java.lang.String);
- method public abstract java.util.Iterator getPrefixes(java.lang.String);
+ public interface NamespaceContext {
+ method public String getNamespaceURI(String);
+ method public String getPrefix(String);
+ method public java.util.Iterator getPrefixes(String);
}
public class QName implements java.io.Serializable {
- ctor public QName(java.lang.String, java.lang.String);
- ctor public QName(java.lang.String, java.lang.String, java.lang.String);
- ctor public QName(java.lang.String);
- method public final boolean equals(java.lang.Object);
- method public java.lang.String getLocalPart();
- method public java.lang.String getNamespaceURI();
- method public java.lang.String getPrefix();
+ ctor public QName(String, String);
+ ctor public QName(String, String, String);
+ ctor public QName(String);
+ method public final boolean equals(Object);
+ method public String getLocalPart();
+ method public String getNamespaceURI();
+ method public String getPrefix();
method public final int hashCode();
- method public static javax.xml.namespace.QName valueOf(java.lang.String);
+ method public static javax.xml.namespace.QName valueOf(String);
}
}
@@ -75878,8 +76014,8 @@ package javax.xml.parsers {
method public boolean isXIncludeAware();
method public abstract org.w3c.dom.Document newDocument();
method public org.w3c.dom.Document parse(java.io.InputStream) throws java.io.IOException, org.xml.sax.SAXException;
- method public org.w3c.dom.Document parse(java.io.InputStream, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public org.w3c.dom.Document parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public org.w3c.dom.Document parse(java.io.InputStream, String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public org.w3c.dom.Document parse(String) throws java.io.IOException, org.xml.sax.SAXException;
method public org.w3c.dom.Document parse(java.io.File) throws java.io.IOException, org.xml.sax.SAXException;
method public abstract org.w3c.dom.Document parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
method public void reset();
@@ -75889,8 +76025,8 @@ package javax.xml.parsers {
public abstract class DocumentBuilderFactory {
ctor protected DocumentBuilderFactory();
- method public abstract java.lang.Object getAttribute(java.lang.String) throws java.lang.IllegalArgumentException;
- method public abstract boolean getFeature(java.lang.String) throws javax.xml.parsers.ParserConfigurationException;
+ method public abstract Object getAttribute(String) throws java.lang.IllegalArgumentException;
+ method public abstract boolean getFeature(String) throws javax.xml.parsers.ParserConfigurationException;
method public javax.xml.validation.Schema getSchema();
method public boolean isCoalescing();
method public boolean isExpandEntityReferences();
@@ -75901,11 +76037,11 @@ package javax.xml.parsers {
method public boolean isXIncludeAware();
method public abstract javax.xml.parsers.DocumentBuilder newDocumentBuilder() throws javax.xml.parsers.ParserConfigurationException;
method public static javax.xml.parsers.DocumentBuilderFactory newInstance();
- method public static javax.xml.parsers.DocumentBuilderFactory newInstance(java.lang.String, java.lang.ClassLoader);
- method public abstract void setAttribute(java.lang.String, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public static javax.xml.parsers.DocumentBuilderFactory newInstance(String, ClassLoader);
+ method public abstract void setAttribute(String, Object) throws java.lang.IllegalArgumentException;
method public void setCoalescing(boolean);
method public void setExpandEntityReferences(boolean);
- method public abstract void setFeature(java.lang.String, boolean) throws javax.xml.parsers.ParserConfigurationException;
+ method public abstract void setFeature(String, boolean) throws javax.xml.parsers.ParserConfigurationException;
method public void setIgnoringComments(boolean);
method public void setIgnoringElementContentWhitespace(boolean);
method public void setNamespaceAware(boolean);
@@ -75916,51 +76052,51 @@ package javax.xml.parsers {
public class FactoryConfigurationError extends java.lang.Error {
ctor public FactoryConfigurationError();
- ctor public FactoryConfigurationError(java.lang.String);
- ctor public FactoryConfigurationError(java.lang.Exception);
- ctor public FactoryConfigurationError(java.lang.Exception, java.lang.String);
- method public java.lang.Exception getException();
+ ctor public FactoryConfigurationError(String);
+ ctor public FactoryConfigurationError(Exception);
+ ctor public FactoryConfigurationError(Exception, String);
+ method public Exception getException();
}
public class ParserConfigurationException extends java.lang.Exception {
ctor public ParserConfigurationException();
- ctor public ParserConfigurationException(java.lang.String);
+ ctor public ParserConfigurationException(String);
}
public abstract class SAXParser {
ctor protected SAXParser();
method public abstract org.xml.sax.Parser getParser() throws org.xml.sax.SAXException;
- method public abstract java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public abstract Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public javax.xml.validation.Schema getSchema();
method public abstract org.xml.sax.XMLReader getXMLReader() throws org.xml.sax.SAXException;
method public abstract boolean isNamespaceAware();
method public abstract boolean isValidating();
method public boolean isXIncludeAware();
method public void parse(java.io.InputStream, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.io.InputStream, org.xml.sax.HandlerBase, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(java.io.InputStream, org.xml.sax.HandlerBase, String) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(java.io.InputStream, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.io.InputStream, org.xml.sax.helpers.DefaultHandler, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.lang.String, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.lang.String, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(java.io.InputStream, org.xml.sax.helpers.DefaultHandler, String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(java.io.File, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(java.io.File, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(org.xml.sax.InputSource, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(org.xml.sax.InputSource, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
method public void reset();
- method public abstract void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public abstract void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
}
public abstract class SAXParserFactory {
ctor protected SAXParserFactory();
- method public abstract boolean getFeature(java.lang.String) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public abstract boolean getFeature(String) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public javax.xml.validation.Schema getSchema();
method public boolean isNamespaceAware();
method public boolean isValidating();
method public boolean isXIncludeAware();
method public static javax.xml.parsers.SAXParserFactory newInstance();
- method public static javax.xml.parsers.SAXParserFactory newInstance(java.lang.String, java.lang.ClassLoader);
+ method public static javax.xml.parsers.SAXParserFactory newInstance(String, ClassLoader);
method public abstract javax.xml.parsers.SAXParser newSAXParser() throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXException;
- method public abstract void setFeature(java.lang.String, boolean) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public abstract void setFeature(String, boolean) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public void setNamespaceAware(boolean);
method public void setSchema(javax.xml.validation.Schema);
method public void setValidating(boolean);
@@ -75971,47 +76107,47 @@ package javax.xml.parsers {
package javax.xml.transform {
- public abstract interface ErrorListener {
- method public abstract void error(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
- method public abstract void fatalError(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
- method public abstract void warning(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
+ public interface ErrorListener {
+ method public void error(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
+ method public void fatalError(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
+ method public void warning(javax.xml.transform.TransformerException) throws javax.xml.transform.TransformerException;
}
public class OutputKeys {
- field public static final java.lang.String CDATA_SECTION_ELEMENTS = "cdata-section-elements";
- field public static final java.lang.String DOCTYPE_PUBLIC = "doctype-public";
- field public static final java.lang.String DOCTYPE_SYSTEM = "doctype-system";
- field public static final java.lang.String ENCODING = "encoding";
- field public static final java.lang.String INDENT = "indent";
- field public static final java.lang.String MEDIA_TYPE = "media-type";
- field public static final java.lang.String METHOD = "method";
- field public static final java.lang.String OMIT_XML_DECLARATION = "omit-xml-declaration";
- field public static final java.lang.String STANDALONE = "standalone";
- field public static final java.lang.String VERSION = "version";
+ field public static final String CDATA_SECTION_ELEMENTS = "cdata-section-elements";
+ field public static final String DOCTYPE_PUBLIC = "doctype-public";
+ field public static final String DOCTYPE_SYSTEM = "doctype-system";
+ field public static final String ENCODING = "encoding";
+ field public static final String INDENT = "indent";
+ field public static final String MEDIA_TYPE = "media-type";
+ field public static final String METHOD = "method";
+ field public static final String OMIT_XML_DECLARATION = "omit-xml-declaration";
+ field public static final String STANDALONE = "standalone";
+ field public static final String VERSION = "version";
}
- public abstract interface Result {
- method public abstract java.lang.String getSystemId();
- method public abstract void setSystemId(java.lang.String);
- field public static final java.lang.String PI_DISABLE_OUTPUT_ESCAPING = "javax.xml.transform.disable-output-escaping";
- field public static final java.lang.String PI_ENABLE_OUTPUT_ESCAPING = "javax.xml.transform.enable-output-escaping";
+ public interface Result {
+ method public String getSystemId();
+ method public void setSystemId(String);
+ field public static final String PI_DISABLE_OUTPUT_ESCAPING = "javax.xml.transform.disable-output-escaping";
+ field public static final String PI_ENABLE_OUTPUT_ESCAPING = "javax.xml.transform.enable-output-escaping";
}
- public abstract interface Source {
- method public abstract java.lang.String getSystemId();
- method public abstract void setSystemId(java.lang.String);
+ public interface Source {
+ method public String getSystemId();
+ method public void setSystemId(String);
}
- public abstract interface SourceLocator {
- method public abstract int getColumnNumber();
- method public abstract int getLineNumber();
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getSystemId();
+ public interface SourceLocator {
+ method public int getColumnNumber();
+ method public int getLineNumber();
+ method public String getPublicId();
+ method public String getSystemId();
}
- public abstract interface Templates {
- method public abstract java.util.Properties getOutputProperties();
- method public abstract javax.xml.transform.Transformer newTransformer() throws javax.xml.transform.TransformerConfigurationException;
+ public interface Templates {
+ method public java.util.Properties getOutputProperties();
+ method public javax.xml.transform.Transformer newTransformer() throws javax.xml.transform.TransformerConfigurationException;
}
public abstract class Transformer {
@@ -76019,103 +76155,102 @@ package javax.xml.transform {
method public abstract void clearParameters();
method public abstract javax.xml.transform.ErrorListener getErrorListener();
method public abstract java.util.Properties getOutputProperties();
- method public abstract java.lang.String getOutputProperty(java.lang.String) throws java.lang.IllegalArgumentException;
- method public abstract java.lang.Object getParameter(java.lang.String);
+ method public abstract String getOutputProperty(String) throws java.lang.IllegalArgumentException;
+ method public abstract Object getParameter(String);
method public abstract javax.xml.transform.URIResolver getURIResolver();
method public void reset();
method public abstract void setErrorListener(javax.xml.transform.ErrorListener) throws java.lang.IllegalArgumentException;
method public abstract void setOutputProperties(java.util.Properties);
- method public abstract void setOutputProperty(java.lang.String, java.lang.String) throws java.lang.IllegalArgumentException;
- method public abstract void setParameter(java.lang.String, java.lang.Object);
+ method public abstract void setOutputProperty(String, String) throws java.lang.IllegalArgumentException;
+ method public abstract void setParameter(String, Object);
method public abstract void setURIResolver(javax.xml.transform.URIResolver);
method public abstract void transform(javax.xml.transform.Source, javax.xml.transform.Result) throws javax.xml.transform.TransformerException;
}
public class TransformerConfigurationException extends javax.xml.transform.TransformerException {
ctor public TransformerConfigurationException();
- ctor public TransformerConfigurationException(java.lang.String);
- ctor public TransformerConfigurationException(java.lang.Throwable);
- ctor public TransformerConfigurationException(java.lang.String, java.lang.Throwable);
- ctor public TransformerConfigurationException(java.lang.String, javax.xml.transform.SourceLocator);
- ctor public TransformerConfigurationException(java.lang.String, javax.xml.transform.SourceLocator, java.lang.Throwable);
+ ctor public TransformerConfigurationException(String);
+ ctor public TransformerConfigurationException(Throwable);
+ ctor public TransformerConfigurationException(String, Throwable);
+ ctor public TransformerConfigurationException(String, javax.xml.transform.SourceLocator);
+ ctor public TransformerConfigurationException(String, javax.xml.transform.SourceLocator, Throwable);
}
public class TransformerException extends java.lang.Exception {
- ctor public TransformerException(java.lang.String);
- ctor public TransformerException(java.lang.Throwable);
- ctor public TransformerException(java.lang.String, java.lang.Throwable);
- ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator);
- ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator, java.lang.Throwable);
- method public java.lang.Throwable getCause();
- method public java.lang.Throwable getException();
- method public java.lang.String getLocationAsString();
+ ctor public TransformerException(String);
+ ctor public TransformerException(Throwable);
+ ctor public TransformerException(String, Throwable);
+ ctor public TransformerException(String, javax.xml.transform.SourceLocator);
+ ctor public TransformerException(String, javax.xml.transform.SourceLocator, Throwable);
+ method public Throwable getException();
+ method public String getLocationAsString();
method public javax.xml.transform.SourceLocator getLocator();
- method public java.lang.String getMessageAndLocation();
+ method public String getMessageAndLocation();
method public void setLocator(javax.xml.transform.SourceLocator);
}
public abstract class TransformerFactory {
ctor protected TransformerFactory();
- method public abstract javax.xml.transform.Source getAssociatedStylesheet(javax.xml.transform.Source, java.lang.String, java.lang.String, java.lang.String) throws javax.xml.transform.TransformerConfigurationException;
- method public abstract java.lang.Object getAttribute(java.lang.String);
+ method public abstract javax.xml.transform.Source getAssociatedStylesheet(javax.xml.transform.Source, String, String, String) throws javax.xml.transform.TransformerConfigurationException;
+ method public abstract Object getAttribute(String);
method public abstract javax.xml.transform.ErrorListener getErrorListener();
- method public abstract boolean getFeature(java.lang.String);
+ method public abstract boolean getFeature(String);
method public abstract javax.xml.transform.URIResolver getURIResolver();
method public static javax.xml.transform.TransformerFactory newInstance() throws javax.xml.transform.TransformerFactoryConfigurationError;
- method public static javax.xml.transform.TransformerFactory newInstance(java.lang.String, java.lang.ClassLoader) throws javax.xml.transform.TransformerFactoryConfigurationError;
+ method public static javax.xml.transform.TransformerFactory newInstance(String, ClassLoader) throws javax.xml.transform.TransformerFactoryConfigurationError;
method public abstract javax.xml.transform.Templates newTemplates(javax.xml.transform.Source) throws javax.xml.transform.TransformerConfigurationException;
method public abstract javax.xml.transform.Transformer newTransformer(javax.xml.transform.Source) throws javax.xml.transform.TransformerConfigurationException;
method public abstract javax.xml.transform.Transformer newTransformer() throws javax.xml.transform.TransformerConfigurationException;
- method public abstract void setAttribute(java.lang.String, java.lang.Object);
+ method public abstract void setAttribute(String, Object);
method public abstract void setErrorListener(javax.xml.transform.ErrorListener);
- method public abstract void setFeature(java.lang.String, boolean) throws javax.xml.transform.TransformerConfigurationException;
+ method public abstract void setFeature(String, boolean) throws javax.xml.transform.TransformerConfigurationException;
method public abstract void setURIResolver(javax.xml.transform.URIResolver);
}
public class TransformerFactoryConfigurationError extends java.lang.Error {
ctor public TransformerFactoryConfigurationError();
- ctor public TransformerFactoryConfigurationError(java.lang.String);
- ctor public TransformerFactoryConfigurationError(java.lang.Exception);
- ctor public TransformerFactoryConfigurationError(java.lang.Exception, java.lang.String);
- method public java.lang.Exception getException();
+ ctor public TransformerFactoryConfigurationError(String);
+ ctor public TransformerFactoryConfigurationError(Exception);
+ ctor public TransformerFactoryConfigurationError(Exception, String);
+ method public Exception getException();
}
- public abstract interface URIResolver {
- method public abstract javax.xml.transform.Source resolve(java.lang.String, java.lang.String) throws javax.xml.transform.TransformerException;
+ public interface URIResolver {
+ method public javax.xml.transform.Source resolve(String, String) throws javax.xml.transform.TransformerException;
}
}
package javax.xml.transform.dom {
- public abstract interface DOMLocator implements javax.xml.transform.SourceLocator {
- method public abstract org.w3c.dom.Node getOriginatingNode();
+ public interface DOMLocator extends javax.xml.transform.SourceLocator {
+ method public org.w3c.dom.Node getOriginatingNode();
}
public class DOMResult implements javax.xml.transform.Result {
ctor public DOMResult();
ctor public DOMResult(org.w3c.dom.Node);
- ctor public DOMResult(org.w3c.dom.Node, java.lang.String);
+ ctor public DOMResult(org.w3c.dom.Node, String);
ctor public DOMResult(org.w3c.dom.Node, org.w3c.dom.Node);
- ctor public DOMResult(org.w3c.dom.Node, org.w3c.dom.Node, java.lang.String);
+ ctor public DOMResult(org.w3c.dom.Node, org.w3c.dom.Node, String);
method public org.w3c.dom.Node getNextSibling();
method public org.w3c.dom.Node getNode();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public void setNextSibling(org.w3c.dom.Node);
method public void setNode(org.w3c.dom.Node);
- method public void setSystemId(java.lang.String);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.dom.DOMResult/feature";
+ method public void setSystemId(String);
+ field public static final String FEATURE = "http://javax.xml.transform.dom.DOMResult/feature";
}
public class DOMSource implements javax.xml.transform.Source {
ctor public DOMSource();
ctor public DOMSource(org.w3c.dom.Node);
- ctor public DOMSource(org.w3c.dom.Node, java.lang.String);
+ ctor public DOMSource(org.w3c.dom.Node, String);
method public org.w3c.dom.Node getNode();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public void setNode(org.w3c.dom.Node);
- method public void setSystemId(java.lang.String);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.dom.DOMSource/feature";
+ method public void setSystemId(String);
+ field public static final String FEATURE = "http://javax.xml.transform.dom.DOMSource/feature";
}
}
@@ -76127,11 +76262,11 @@ package javax.xml.transform.sax {
ctor public SAXResult(org.xml.sax.ContentHandler);
method public org.xml.sax.ContentHandler getHandler();
method public org.xml.sax.ext.LexicalHandler getLexicalHandler();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public void setHandler(org.xml.sax.ContentHandler);
method public void setLexicalHandler(org.xml.sax.ext.LexicalHandler);
- method public void setSystemId(java.lang.String);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.sax.SAXResult/feature";
+ method public void setSystemId(String);
+ field public static final String FEATURE = "http://javax.xml.transform.sax.SAXResult/feature";
}
public class SAXSource implements javax.xml.transform.Source {
@@ -76139,13 +76274,13 @@ package javax.xml.transform.sax {
ctor public SAXSource(org.xml.sax.XMLReader, org.xml.sax.InputSource);
ctor public SAXSource(org.xml.sax.InputSource);
method public org.xml.sax.InputSource getInputSource();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public org.xml.sax.XMLReader getXMLReader();
method public void setInputSource(org.xml.sax.InputSource);
- method public void setSystemId(java.lang.String);
+ method public void setSystemId(String);
method public void setXMLReader(org.xml.sax.XMLReader);
method public static org.xml.sax.InputSource sourceToInputSource(javax.xml.transform.Source);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.sax.SAXSource/feature";
+ field public static final String FEATURE = "http://javax.xml.transform.sax.SAXSource/feature";
}
public abstract class SAXTransformerFactory extends javax.xml.transform.TransformerFactory {
@@ -76156,21 +76291,21 @@ package javax.xml.transform.sax {
method public abstract javax.xml.transform.sax.TransformerHandler newTransformerHandler() throws javax.xml.transform.TransformerConfigurationException;
method public abstract org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Source) throws javax.xml.transform.TransformerConfigurationException;
method public abstract org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Templates) throws javax.xml.transform.TransformerConfigurationException;
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.sax.SAXTransformerFactory/feature";
- field public static final java.lang.String FEATURE_XMLFILTER = "http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter";
+ field public static final String FEATURE = "http://javax.xml.transform.sax.SAXTransformerFactory/feature";
+ field public static final String FEATURE_XMLFILTER = "http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter";
}
- public abstract interface TemplatesHandler implements org.xml.sax.ContentHandler {
- method public abstract java.lang.String getSystemId();
- method public abstract javax.xml.transform.Templates getTemplates();
- method public abstract void setSystemId(java.lang.String);
+ public interface TemplatesHandler extends org.xml.sax.ContentHandler {
+ method public String getSystemId();
+ method public javax.xml.transform.Templates getTemplates();
+ method public void setSystemId(String);
}
- public abstract interface TransformerHandler implements org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.ext.LexicalHandler {
- method public abstract java.lang.String getSystemId();
- method public abstract javax.xml.transform.Transformer getTransformer();
- method public abstract void setResult(javax.xml.transform.Result) throws java.lang.IllegalArgumentException;
- method public abstract void setSystemId(java.lang.String);
+ public interface TransformerHandler extends org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.ext.LexicalHandler {
+ method public String getSystemId();
+ method public javax.xml.transform.Transformer getTransformer();
+ method public void setResult(javax.xml.transform.Result) throws java.lang.IllegalArgumentException;
+ method public void setSystemId(String);
}
}
@@ -76181,36 +76316,36 @@ package javax.xml.transform.stream {
ctor public StreamResult();
ctor public StreamResult(java.io.OutputStream);
ctor public StreamResult(java.io.Writer);
- ctor public StreamResult(java.lang.String);
+ ctor public StreamResult(String);
ctor public StreamResult(java.io.File);
method public java.io.OutputStream getOutputStream();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public java.io.Writer getWriter();
method public void setOutputStream(java.io.OutputStream);
- method public void setSystemId(java.lang.String);
+ method public void setSystemId(String);
method public void setSystemId(java.io.File);
method public void setWriter(java.io.Writer);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.stream.StreamResult/feature";
+ field public static final String FEATURE = "http://javax.xml.transform.stream.StreamResult/feature";
}
public class StreamSource implements javax.xml.transform.Source {
ctor public StreamSource();
ctor public StreamSource(java.io.InputStream);
- ctor public StreamSource(java.io.InputStream, java.lang.String);
+ ctor public StreamSource(java.io.InputStream, String);
ctor public StreamSource(java.io.Reader);
- ctor public StreamSource(java.io.Reader, java.lang.String);
- ctor public StreamSource(java.lang.String);
+ ctor public StreamSource(java.io.Reader, String);
+ ctor public StreamSource(String);
ctor public StreamSource(java.io.File);
method public java.io.InputStream getInputStream();
- method public java.lang.String getPublicId();
+ method public String getPublicId();
method public java.io.Reader getReader();
- method public java.lang.String getSystemId();
+ method public String getSystemId();
method public void setInputStream(java.io.InputStream);
- method public void setPublicId(java.lang.String);
+ method public void setPublicId(String);
method public void setReader(java.io.Reader);
- method public void setSystemId(java.lang.String);
+ method public void setSystemId(String);
method public void setSystemId(java.io.File);
- field public static final java.lang.String FEATURE = "http://javax.xml.transform.stream.StreamSource/feature";
+ field public static final String FEATURE = "http://javax.xml.transform.stream.StreamSource/feature";
}
}
@@ -76226,26 +76361,26 @@ package javax.xml.validation {
public abstract class SchemaFactory {
ctor protected SchemaFactory();
method public abstract org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract org.w3c.dom.ls.LSResourceResolver getResourceResolver();
- method public abstract boolean isSchemaLanguageSupported(java.lang.String);
- method public static javax.xml.validation.SchemaFactory newInstance(java.lang.String);
- method public static javax.xml.validation.SchemaFactory newInstance(java.lang.String, java.lang.String, java.lang.ClassLoader);
+ method public abstract boolean isSchemaLanguageSupported(String);
+ method public static javax.xml.validation.SchemaFactory newInstance(String);
+ method public static javax.xml.validation.SchemaFactory newInstance(String, String, ClassLoader);
method public javax.xml.validation.Schema newSchema(javax.xml.transform.Source) throws org.xml.sax.SAXException;
method public javax.xml.validation.Schema newSchema(java.io.File) throws org.xml.sax.SAXException;
method public javax.xml.validation.Schema newSchema(java.net.URL) throws org.xml.sax.SAXException;
method public abstract javax.xml.validation.Schema newSchema(javax.xml.transform.Source[]) throws org.xml.sax.SAXException;
method public abstract javax.xml.validation.Schema newSchema() throws org.xml.sax.SAXException;
method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract void setResourceResolver(org.w3c.dom.ls.LSResourceResolver);
}
public abstract class SchemaFactoryLoader {
ctor protected SchemaFactoryLoader();
- method public abstract javax.xml.validation.SchemaFactory newFactory(java.lang.String);
+ method public abstract javax.xml.validation.SchemaFactory newFactory(String);
}
public abstract class TypeInfoProvider {
@@ -76259,13 +76394,13 @@ package javax.xml.validation {
public abstract class Validator {
ctor protected Validator();
method public abstract org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract org.w3c.dom.ls.LSResourceResolver getResourceResolver();
method public abstract void reset();
method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract void setResourceResolver(org.w3c.dom.ls.LSResourceResolver);
method public void validate(javax.xml.transform.Source) throws java.io.IOException, org.xml.sax.SAXException;
method public abstract void validate(javax.xml.transform.Source, javax.xml.transform.Result) throws java.io.IOException, org.xml.sax.SAXException;
@@ -76275,14 +76410,14 @@ package javax.xml.validation {
ctor protected ValidatorHandler();
method public abstract org.xml.sax.ContentHandler getContentHandler();
method public abstract org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract org.w3c.dom.ls.LSResourceResolver getResourceResolver();
method public abstract javax.xml.validation.TypeInfoProvider getTypeInfoProvider();
method public abstract void setContentHandler(org.xml.sax.ContentHandler);
method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public abstract void setResourceResolver(org.w3c.dom.ls.LSResourceResolver);
}
@@ -76290,24 +76425,24 @@ package javax.xml.validation {
package javax.xml.xpath {
- public abstract interface XPath {
- method public abstract javax.xml.xpath.XPathExpression compile(java.lang.String) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.Object evaluate(java.lang.String, java.lang.Object, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.String evaluate(java.lang.String, java.lang.Object) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.Object evaluate(java.lang.String, org.xml.sax.InputSource, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.String evaluate(java.lang.String, org.xml.sax.InputSource) throws javax.xml.xpath.XPathExpressionException;
- method public abstract javax.xml.namespace.NamespaceContext getNamespaceContext();
- method public abstract javax.xml.xpath.XPathFunctionResolver getXPathFunctionResolver();
- method public abstract javax.xml.xpath.XPathVariableResolver getXPathVariableResolver();
- method public abstract void reset();
- method public abstract void setNamespaceContext(javax.xml.namespace.NamespaceContext);
- method public abstract void setXPathFunctionResolver(javax.xml.xpath.XPathFunctionResolver);
- method public abstract void setXPathVariableResolver(javax.xml.xpath.XPathVariableResolver);
+ public interface XPath {
+ method public javax.xml.xpath.XPathExpression compile(String) throws javax.xml.xpath.XPathExpressionException;
+ method public Object evaluate(String, Object, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
+ method public String evaluate(String, Object) throws javax.xml.xpath.XPathExpressionException;
+ method public Object evaluate(String, org.xml.sax.InputSource, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
+ method public String evaluate(String, org.xml.sax.InputSource) throws javax.xml.xpath.XPathExpressionException;
+ method public javax.xml.namespace.NamespaceContext getNamespaceContext();
+ method public javax.xml.xpath.XPathFunctionResolver getXPathFunctionResolver();
+ method public javax.xml.xpath.XPathVariableResolver getXPathVariableResolver();
+ method public void reset();
+ method public void setNamespaceContext(javax.xml.namespace.NamespaceContext);
+ method public void setXPathFunctionResolver(javax.xml.xpath.XPathFunctionResolver);
+ method public void setXPathVariableResolver(javax.xml.xpath.XPathVariableResolver);
}
public class XPathConstants {
field public static final javax.xml.namespace.QName BOOLEAN;
- field public static final java.lang.String DOM_OBJECT_MODEL = "http://java.sun.com/jaxp/xpath/dom";
+ field public static final String DOM_OBJECT_MODEL = "http://java.sun.com/jaxp/xpath/dom";
field public static final javax.xml.namespace.QName NODE;
field public static final javax.xml.namespace.QName NODESET;
field public static final javax.xml.namespace.QName NUMBER;
@@ -76315,192 +76450,191 @@ package javax.xml.xpath {
}
public class XPathException extends java.lang.Exception {
- ctor public XPathException(java.lang.String);
- ctor public XPathException(java.lang.Throwable);
- method public java.lang.Throwable getCause();
+ ctor public XPathException(String);
+ ctor public XPathException(Throwable);
}
- public abstract interface XPathExpression {
- method public abstract java.lang.Object evaluate(java.lang.Object, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.String evaluate(java.lang.Object) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.Object evaluate(org.xml.sax.InputSource, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
- method public abstract java.lang.String evaluate(org.xml.sax.InputSource) throws javax.xml.xpath.XPathExpressionException;
+ public interface XPathExpression {
+ method public Object evaluate(Object, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
+ method public String evaluate(Object) throws javax.xml.xpath.XPathExpressionException;
+ method public Object evaluate(org.xml.sax.InputSource, javax.xml.namespace.QName) throws javax.xml.xpath.XPathExpressionException;
+ method public String evaluate(org.xml.sax.InputSource) throws javax.xml.xpath.XPathExpressionException;
}
public class XPathExpressionException extends javax.xml.xpath.XPathException {
- ctor public XPathExpressionException(java.lang.String);
- ctor public XPathExpressionException(java.lang.Throwable);
+ ctor public XPathExpressionException(String);
+ ctor public XPathExpressionException(Throwable);
}
public abstract class XPathFactory {
ctor protected XPathFactory();
- method public abstract boolean getFeature(java.lang.String) throws javax.xml.xpath.XPathFactoryConfigurationException;
- method public abstract boolean isObjectModelSupported(java.lang.String);
+ method public abstract boolean getFeature(String) throws javax.xml.xpath.XPathFactoryConfigurationException;
+ method public abstract boolean isObjectModelSupported(String);
method public static final javax.xml.xpath.XPathFactory newInstance();
- method public static final javax.xml.xpath.XPathFactory newInstance(java.lang.String) throws javax.xml.xpath.XPathFactoryConfigurationException;
- method public static javax.xml.xpath.XPathFactory newInstance(java.lang.String, java.lang.String, java.lang.ClassLoader) throws javax.xml.xpath.XPathFactoryConfigurationException;
+ method public static final javax.xml.xpath.XPathFactory newInstance(String) throws javax.xml.xpath.XPathFactoryConfigurationException;
+ method public static javax.xml.xpath.XPathFactory newInstance(String, String, ClassLoader) throws javax.xml.xpath.XPathFactoryConfigurationException;
method public abstract javax.xml.xpath.XPath newXPath();
- method public abstract void setFeature(java.lang.String, boolean) throws javax.xml.xpath.XPathFactoryConfigurationException;
+ method public abstract void setFeature(String, boolean) throws javax.xml.xpath.XPathFactoryConfigurationException;
method public abstract void setXPathFunctionResolver(javax.xml.xpath.XPathFunctionResolver);
method public abstract void setXPathVariableResolver(javax.xml.xpath.XPathVariableResolver);
- field public static final java.lang.String DEFAULT_OBJECT_MODEL_URI = "http://java.sun.com/jaxp/xpath/dom";
- field public static final java.lang.String DEFAULT_PROPERTY_NAME = "javax.xml.xpath.XPathFactory";
+ field public static final String DEFAULT_OBJECT_MODEL_URI = "http://java.sun.com/jaxp/xpath/dom";
+ field public static final String DEFAULT_PROPERTY_NAME = "javax.xml.xpath.XPathFactory";
}
public class XPathFactoryConfigurationException extends javax.xml.xpath.XPathException {
- ctor public XPathFactoryConfigurationException(java.lang.String);
- ctor public XPathFactoryConfigurationException(java.lang.Throwable);
+ ctor public XPathFactoryConfigurationException(String);
+ ctor public XPathFactoryConfigurationException(Throwable);
}
- public abstract interface XPathFunction {
- method public abstract java.lang.Object evaluate(java.util.List) throws javax.xml.xpath.XPathFunctionException;
+ public interface XPathFunction {
+ method public Object evaluate(java.util.List) throws javax.xml.xpath.XPathFunctionException;
}
public class XPathFunctionException extends javax.xml.xpath.XPathExpressionException {
- ctor public XPathFunctionException(java.lang.String);
- ctor public XPathFunctionException(java.lang.Throwable);
+ ctor public XPathFunctionException(String);
+ ctor public XPathFunctionException(Throwable);
}
- public abstract interface XPathFunctionResolver {
- method public abstract javax.xml.xpath.XPathFunction resolveFunction(javax.xml.namespace.QName, int);
+ public interface XPathFunctionResolver {
+ method public javax.xml.xpath.XPathFunction resolveFunction(javax.xml.namespace.QName, int);
}
- public abstract interface XPathVariableResolver {
- method public abstract java.lang.Object resolveVariable(javax.xml.namespace.QName);
+ public interface XPathVariableResolver {
+ method public Object resolveVariable(javax.xml.namespace.QName);
}
}
package org.apache.http.conn {
- public deprecated class ConnectTimeoutException extends java.io.InterruptedIOException {
- ctor public ConnectTimeoutException();
- ctor public ConnectTimeoutException(java.lang.String);
+ @Deprecated public class ConnectTimeoutException extends java.io.InterruptedIOException {
+ ctor @Deprecated public ConnectTimeoutException();
+ ctor @Deprecated public ConnectTimeoutException(String);
}
}
package org.apache.http.conn.scheme {
- public abstract deprecated interface HostNameResolver {
- method public abstract java.net.InetAddress resolve(java.lang.String) throws java.io.IOException;
+ @Deprecated public interface HostNameResolver {
+ method @Deprecated public java.net.InetAddress resolve(String) throws java.io.IOException;
}
- public abstract deprecated interface LayeredSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
- method public abstract java.net.Socket createSocket(java.net.Socket, java.lang.String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
+ @Deprecated public interface LayeredSocketFactory extends org.apache.http.conn.scheme.SocketFactory {
+ method @Deprecated public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
}
- public abstract deprecated interface SocketFactory {
- method public abstract java.net.Socket connectSocket(java.net.Socket, java.lang.String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws org.apache.http.conn.ConnectTimeoutException, java.io.IOException, java.net.UnknownHostException;
- method public abstract java.net.Socket createSocket() throws java.io.IOException;
- method public abstract boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
+ @Deprecated public interface SocketFactory {
+ method @Deprecated public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws org.apache.http.conn.ConnectTimeoutException, java.io.IOException, java.net.UnknownHostException;
+ method @Deprecated public java.net.Socket createSocket() throws java.io.IOException;
+ method @Deprecated public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
}
}
package org.apache.http.conn.ssl {
- public abstract deprecated class AbstractVerifier implements org.apache.http.conn.ssl.X509HostnameVerifier {
- ctor public AbstractVerifier();
- method public static boolean acceptableCountryWildcard(java.lang.String);
- method public static int countDots(java.lang.String);
- method public static java.lang.String[] getCNs(java.security.cert.X509Certificate);
- method public static java.lang.String[] getDNSSubjectAlts(java.security.cert.X509Certificate);
- method public final void verify(java.lang.String, javax.net.ssl.SSLSocket) throws java.io.IOException;
- method public final boolean verify(java.lang.String, javax.net.ssl.SSLSession);
- method public final void verify(java.lang.String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
- method public final void verify(java.lang.String, java.lang.String[], java.lang.String[], boolean) throws javax.net.ssl.SSLException;
- }
-
- public deprecated class AllowAllHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
- ctor public AllowAllHostnameVerifier();
- method public final java.lang.String toString();
- method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]);
- }
-
- public deprecated class BrowserCompatHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
- ctor public BrowserCompatHostnameVerifier();
- method public final java.lang.String toString();
- method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]) throws javax.net.ssl.SSLException;
- }
-
- public deprecated class SSLSocketFactory implements org.apache.http.conn.scheme.LayeredSocketFactory {
- ctor public SSLSocketFactory(java.lang.String, java.security.KeyStore, java.lang.String, java.security.KeyStore, java.security.SecureRandom, org.apache.http.conn.scheme.HostNameResolver) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
- ctor public SSLSocketFactory(java.security.KeyStore, java.lang.String, java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
- ctor public SSLSocketFactory(java.security.KeyStore, java.lang.String) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
- ctor public SSLSocketFactory(java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
- method public java.net.Socket connectSocket(java.net.Socket, java.lang.String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
- method public java.net.Socket createSocket() throws java.io.IOException;
- method public java.net.Socket createSocket(java.net.Socket, java.lang.String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
- method public org.apache.http.conn.ssl.X509HostnameVerifier getHostnameVerifier();
- method public static org.apache.http.conn.ssl.SSLSocketFactory getSocketFactory();
- method public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
- method public void setHostnameVerifier(org.apache.http.conn.ssl.X509HostnameVerifier);
- field public static final org.apache.http.conn.ssl.X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER;
- field public static final org.apache.http.conn.ssl.X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
- field public static final java.lang.String SSL = "SSL";
- field public static final java.lang.String SSLV2 = "SSLv2";
- field public static final org.apache.http.conn.ssl.X509HostnameVerifier STRICT_HOSTNAME_VERIFIER;
- field public static final java.lang.String TLS = "TLS";
- }
-
- public deprecated class StrictHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
- ctor public StrictHostnameVerifier();
- method public final java.lang.String toString();
- method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]) throws javax.net.ssl.SSLException;
- }
-
- public abstract deprecated interface X509HostnameVerifier implements javax.net.ssl.HostnameVerifier {
- method public abstract void verify(java.lang.String, javax.net.ssl.SSLSocket) throws java.io.IOException;
- method public abstract void verify(java.lang.String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
- method public abstract void verify(java.lang.String, java.lang.String[], java.lang.String[]) throws javax.net.ssl.SSLException;
+ @Deprecated public abstract class AbstractVerifier implements org.apache.http.conn.ssl.X509HostnameVerifier {
+ ctor @Deprecated public AbstractVerifier();
+ method @Deprecated public static boolean acceptableCountryWildcard(String);
+ method @Deprecated public static int countDots(String);
+ method @Deprecated public static String[] getCNs(java.security.cert.X509Certificate);
+ method @Deprecated public static String[] getDNSSubjectAlts(java.security.cert.X509Certificate);
+ method @Deprecated public final void verify(String, javax.net.ssl.SSLSocket) throws java.io.IOException;
+ method @Deprecated public final boolean verify(String, javax.net.ssl.SSLSession);
+ method @Deprecated public final void verify(String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
+ method @Deprecated public final void verify(String, String[], String[], boolean) throws javax.net.ssl.SSLException;
+ }
+
+ @Deprecated public class AllowAllHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ ctor @Deprecated public AllowAllHostnameVerifier();
+ method @Deprecated public final String toString();
+ method @Deprecated public final void verify(String, String[], String[]);
+ }
+
+ @Deprecated public class BrowserCompatHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ ctor @Deprecated public BrowserCompatHostnameVerifier();
+ method @Deprecated public final String toString();
+ method @Deprecated public final void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
+ }
+
+ @Deprecated public class SSLSocketFactory implements org.apache.http.conn.scheme.LayeredSocketFactory {
+ ctor @Deprecated public SSLSocketFactory(String, java.security.KeyStore, String, java.security.KeyStore, java.security.SecureRandom, org.apache.http.conn.scheme.HostNameResolver) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ ctor @Deprecated public SSLSocketFactory(java.security.KeyStore, String, java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ ctor @Deprecated public SSLSocketFactory(java.security.KeyStore, String) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ ctor @Deprecated public SSLSocketFactory(java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
+ method @Deprecated public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
+ method @Deprecated public java.net.Socket createSocket() throws java.io.IOException;
+ method @Deprecated public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
+ method @Deprecated public org.apache.http.conn.ssl.X509HostnameVerifier getHostnameVerifier();
+ method @Deprecated public static org.apache.http.conn.ssl.SSLSocketFactory getSocketFactory();
+ method @Deprecated public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
+ method @Deprecated public void setHostnameVerifier(org.apache.http.conn.ssl.X509HostnameVerifier);
+ field @Deprecated public static final org.apache.http.conn.ssl.X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER;
+ field @Deprecated public static final org.apache.http.conn.ssl.X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
+ field @Deprecated public static final String SSL = "SSL";
+ field @Deprecated public static final String SSLV2 = "SSLv2";
+ field @Deprecated public static final org.apache.http.conn.ssl.X509HostnameVerifier STRICT_HOSTNAME_VERIFIER;
+ field @Deprecated public static final String TLS = "TLS";
+ }
+
+ @Deprecated public class StrictHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ ctor @Deprecated public StrictHostnameVerifier();
+ method @Deprecated public final String toString();
+ method @Deprecated public final void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
+ }
+
+ @Deprecated public interface X509HostnameVerifier extends javax.net.ssl.HostnameVerifier {
+ method @Deprecated public void verify(String, javax.net.ssl.SSLSocket) throws java.io.IOException;
+ method @Deprecated public void verify(String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
+ method @Deprecated public void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
}
}
package org.apache.http.params {
- public abstract deprecated interface CoreConnectionPNames {
- field public static final java.lang.String CONNECTION_TIMEOUT = "http.connection.timeout";
- field public static final java.lang.String MAX_HEADER_COUNT = "http.connection.max-header-count";
- field public static final java.lang.String MAX_LINE_LENGTH = "http.connection.max-line-length";
- field public static final java.lang.String SOCKET_BUFFER_SIZE = "http.socket.buffer-size";
- field public static final java.lang.String SO_LINGER = "http.socket.linger";
- field public static final java.lang.String SO_TIMEOUT = "http.socket.timeout";
- field public static final java.lang.String STALE_CONNECTION_CHECK = "http.connection.stalecheck";
- field public static final java.lang.String TCP_NODELAY = "http.tcp.nodelay";
- }
-
- public final deprecated class HttpConnectionParams implements org.apache.http.params.CoreConnectionPNames {
- method public static int getConnectionTimeout(org.apache.http.params.HttpParams);
- method public static int getLinger(org.apache.http.params.HttpParams);
- method public static int getSoTimeout(org.apache.http.params.HttpParams);
- method public static int getSocketBufferSize(org.apache.http.params.HttpParams);
- method public static boolean getTcpNoDelay(org.apache.http.params.HttpParams);
- method public static boolean isStaleCheckingEnabled(org.apache.http.params.HttpParams);
- method public static void setConnectionTimeout(org.apache.http.params.HttpParams, int);
- method public static void setLinger(org.apache.http.params.HttpParams, int);
- method public static void setSoTimeout(org.apache.http.params.HttpParams, int);
- method public static void setSocketBufferSize(org.apache.http.params.HttpParams, int);
- method public static void setStaleCheckingEnabled(org.apache.http.params.HttpParams, boolean);
- method public static void setTcpNoDelay(org.apache.http.params.HttpParams, boolean);
- }
-
- public abstract deprecated interface HttpParams {
- method public abstract org.apache.http.params.HttpParams copy();
- method public abstract boolean getBooleanParameter(java.lang.String, boolean);
- method public abstract double getDoubleParameter(java.lang.String, double);
- method public abstract int getIntParameter(java.lang.String, int);
- method public abstract long getLongParameter(java.lang.String, long);
- method public abstract java.lang.Object getParameter(java.lang.String);
- method public abstract boolean isParameterFalse(java.lang.String);
- method public abstract boolean isParameterTrue(java.lang.String);
- method public abstract boolean removeParameter(java.lang.String);
- method public abstract org.apache.http.params.HttpParams setBooleanParameter(java.lang.String, boolean);
- method public abstract org.apache.http.params.HttpParams setDoubleParameter(java.lang.String, double);
- method public abstract org.apache.http.params.HttpParams setIntParameter(java.lang.String, int);
- method public abstract org.apache.http.params.HttpParams setLongParameter(java.lang.String, long);
- method public abstract org.apache.http.params.HttpParams setParameter(java.lang.String, java.lang.Object);
+ @Deprecated public interface CoreConnectionPNames {
+ field @Deprecated public static final String CONNECTION_TIMEOUT = "http.connection.timeout";
+ field @Deprecated public static final String MAX_HEADER_COUNT = "http.connection.max-header-count";
+ field @Deprecated public static final String MAX_LINE_LENGTH = "http.connection.max-line-length";
+ field @Deprecated public static final String SOCKET_BUFFER_SIZE = "http.socket.buffer-size";
+ field @Deprecated public static final String SO_LINGER = "http.socket.linger";
+ field @Deprecated public static final String SO_TIMEOUT = "http.socket.timeout";
+ field @Deprecated public static final String STALE_CONNECTION_CHECK = "http.connection.stalecheck";
+ field @Deprecated public static final String TCP_NODELAY = "http.tcp.nodelay";
+ }
+
+ @Deprecated public final class HttpConnectionParams implements org.apache.http.params.CoreConnectionPNames {
+ method @Deprecated public static int getConnectionTimeout(org.apache.http.params.HttpParams);
+ method @Deprecated public static int getLinger(org.apache.http.params.HttpParams);
+ method @Deprecated public static int getSoTimeout(org.apache.http.params.HttpParams);
+ method @Deprecated public static int getSocketBufferSize(org.apache.http.params.HttpParams);
+ method @Deprecated public static boolean getTcpNoDelay(org.apache.http.params.HttpParams);
+ method @Deprecated public static boolean isStaleCheckingEnabled(org.apache.http.params.HttpParams);
+ method @Deprecated public static void setConnectionTimeout(org.apache.http.params.HttpParams, int);
+ method @Deprecated public static void setLinger(org.apache.http.params.HttpParams, int);
+ method @Deprecated public static void setSoTimeout(org.apache.http.params.HttpParams, int);
+ method @Deprecated public static void setSocketBufferSize(org.apache.http.params.HttpParams, int);
+ method @Deprecated public static void setStaleCheckingEnabled(org.apache.http.params.HttpParams, boolean);
+ method @Deprecated public static void setTcpNoDelay(org.apache.http.params.HttpParams, boolean);
+ }
+
+ @Deprecated public interface HttpParams {
+ method @Deprecated public org.apache.http.params.HttpParams copy();
+ method @Deprecated public boolean getBooleanParameter(String, boolean);
+ method @Deprecated public double getDoubleParameter(String, double);
+ method @Deprecated public int getIntParameter(String, int);
+ method @Deprecated public long getLongParameter(String, long);
+ method @Deprecated public Object getParameter(String);
+ method @Deprecated public boolean isParameterFalse(String);
+ method @Deprecated public boolean isParameterTrue(String);
+ method @Deprecated public boolean removeParameter(String);
+ method @Deprecated public org.apache.http.params.HttpParams setBooleanParameter(String, boolean);
+ method @Deprecated public org.apache.http.params.HttpParams setDoubleParameter(String, double);
+ method @Deprecated public org.apache.http.params.HttpParams setIntParameter(String, int);
+ method @Deprecated public org.apache.http.params.HttpParams setLongParameter(String, long);
+ method @Deprecated public org.apache.http.params.HttpParams setParameter(String, Object);
}
}
@@ -76511,20 +76645,20 @@ package org.json {
ctor public JSONArray();
ctor public JSONArray(java.util.Collection);
ctor public JSONArray(org.json.JSONTokener) throws org.json.JSONException;
- ctor public JSONArray(java.lang.String) throws org.json.JSONException;
- ctor public JSONArray(java.lang.Object) throws org.json.JSONException;
- method public java.lang.Object get(int) throws org.json.JSONException;
+ ctor public JSONArray(String) throws org.json.JSONException;
+ ctor public JSONArray(Object) throws org.json.JSONException;
+ method public Object get(int) throws org.json.JSONException;
method public boolean getBoolean(int) throws org.json.JSONException;
method public double getDouble(int) throws org.json.JSONException;
method public int getInt(int) throws org.json.JSONException;
method public org.json.JSONArray getJSONArray(int) throws org.json.JSONException;
method public org.json.JSONObject getJSONObject(int) throws org.json.JSONException;
method public long getLong(int) throws org.json.JSONException;
- method public java.lang.String getString(int) throws org.json.JSONException;
+ method public String getString(int) throws org.json.JSONException;
method public boolean isNull(int);
- method public java.lang.String join(java.lang.String) throws org.json.JSONException;
+ method public String join(String) throws org.json.JSONException;
method public int length();
- method public java.lang.Object opt(int);
+ method public Object opt(int);
method public boolean optBoolean(int);
method public boolean optBoolean(int, boolean);
method public double optDouble(int);
@@ -76535,75 +76669,75 @@ package org.json {
method public org.json.JSONObject optJSONObject(int);
method public long optLong(int);
method public long optLong(int, long);
- method public java.lang.String optString(int);
- method public java.lang.String optString(int, java.lang.String);
+ method public String optString(int);
+ method public String optString(int, String);
method public org.json.JSONArray put(boolean);
method public org.json.JSONArray put(double) throws org.json.JSONException;
method public org.json.JSONArray put(int);
method public org.json.JSONArray put(long);
- method public org.json.JSONArray put(java.lang.Object);
+ method public org.json.JSONArray put(Object);
method public org.json.JSONArray put(int, boolean) throws org.json.JSONException;
method public org.json.JSONArray put(int, double) throws org.json.JSONException;
method public org.json.JSONArray put(int, int) throws org.json.JSONException;
method public org.json.JSONArray put(int, long) throws org.json.JSONException;
- method public org.json.JSONArray put(int, java.lang.Object) throws org.json.JSONException;
- method public java.lang.Object remove(int);
+ method public org.json.JSONArray put(int, Object) throws org.json.JSONException;
+ method public Object remove(int);
method public org.json.JSONObject toJSONObject(org.json.JSONArray) throws org.json.JSONException;
- method public java.lang.String toString(int) throws org.json.JSONException;
+ method public String toString(int) throws org.json.JSONException;
}
public class JSONException extends java.lang.Exception {
- ctor public JSONException(java.lang.String);
- ctor public JSONException(java.lang.String, java.lang.Throwable);
- ctor public JSONException(java.lang.Throwable);
+ ctor public JSONException(String);
+ ctor public JSONException(String, Throwable);
+ ctor public JSONException(Throwable);
}
public class JSONObject {
ctor public JSONObject();
- ctor public JSONObject(java.util.Map);
- ctor public JSONObject(org.json.JSONTokener) throws org.json.JSONException;
- ctor public JSONObject(java.lang.String) throws org.json.JSONException;
- ctor public JSONObject(org.json.JSONObject, java.lang.String[]) throws org.json.JSONException;
- method public org.json.JSONObject accumulate(java.lang.String, java.lang.Object) throws org.json.JSONException;
- method public java.lang.Object get(java.lang.String) throws org.json.JSONException;
- method public boolean getBoolean(java.lang.String) throws org.json.JSONException;
- method public double getDouble(java.lang.String) throws org.json.JSONException;
- method public int getInt(java.lang.String) throws org.json.JSONException;
- method public org.json.JSONArray getJSONArray(java.lang.String) throws org.json.JSONException;
- method public org.json.JSONObject getJSONObject(java.lang.String) throws org.json.JSONException;
- method public long getLong(java.lang.String) throws org.json.JSONException;
- method public java.lang.String getString(java.lang.String) throws org.json.JSONException;
- method public boolean has(java.lang.String);
- method public boolean isNull(java.lang.String);
- method public java.util.Iterator<java.lang.String> keys();
+ ctor public JSONObject(@NonNull java.util.Map);
+ ctor public JSONObject(@NonNull org.json.JSONTokener) throws org.json.JSONException;
+ ctor public JSONObject(@NonNull String) throws org.json.JSONException;
+ ctor public JSONObject(@NonNull org.json.JSONObject, @NonNull String[]) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject accumulate(@NonNull String, @Nullable Object) throws org.json.JSONException;
+ method @NonNull public Object get(@NonNull String) throws org.json.JSONException;
+ method public boolean getBoolean(@NonNull String) throws org.json.JSONException;
+ method public double getDouble(@NonNull String) throws org.json.JSONException;
+ method public int getInt(@NonNull String) throws org.json.JSONException;
+ method @NonNull public org.json.JSONArray getJSONArray(@NonNull String) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject getJSONObject(@NonNull String) throws org.json.JSONException;
+ method public long getLong(@NonNull String) throws org.json.JSONException;
+ method @NonNull public String getString(@NonNull String) throws org.json.JSONException;
+ method public boolean has(@Nullable String);
+ method public boolean isNull(@Nullable String);
+ method @NonNull public java.util.Iterator<java.lang.String> keys();
method public int length();
- method public org.json.JSONArray names();
- method public static java.lang.String numberToString(java.lang.Number) throws org.json.JSONException;
- method public java.lang.Object opt(java.lang.String);
- method public boolean optBoolean(java.lang.String);
- method public boolean optBoolean(java.lang.String, boolean);
- method public double optDouble(java.lang.String);
- method public double optDouble(java.lang.String, double);
- method public int optInt(java.lang.String);
- method public int optInt(java.lang.String, int);
- method public org.json.JSONArray optJSONArray(java.lang.String);
- method public org.json.JSONObject optJSONObject(java.lang.String);
- method public long optLong(java.lang.String);
- method public long optLong(java.lang.String, long);
- method public java.lang.String optString(java.lang.String);
- method public java.lang.String optString(java.lang.String, java.lang.String);
- method public org.json.JSONObject put(java.lang.String, boolean) throws org.json.JSONException;
- method public org.json.JSONObject put(java.lang.String, double) throws org.json.JSONException;
- method public org.json.JSONObject put(java.lang.String, int) throws org.json.JSONException;
- method public org.json.JSONObject put(java.lang.String, long) throws org.json.JSONException;
- method public org.json.JSONObject put(java.lang.String, java.lang.Object) throws org.json.JSONException;
- method public org.json.JSONObject putOpt(java.lang.String, java.lang.Object) throws org.json.JSONException;
- method public static java.lang.String quote(java.lang.String);
- method public java.lang.Object remove(java.lang.String);
- method public org.json.JSONArray toJSONArray(org.json.JSONArray) throws org.json.JSONException;
- method public java.lang.String toString(int) throws org.json.JSONException;
- method public static java.lang.Object wrap(java.lang.Object);
- field public static final java.lang.Object NULL;
+ method @Nullable public org.json.JSONArray names();
+ method @NonNull public static String numberToString(@NonNull Number) throws org.json.JSONException;
+ method @Nullable public Object opt(@Nullable String);
+ method public boolean optBoolean(@Nullable String);
+ method public boolean optBoolean(@Nullable String, boolean);
+ method public double optDouble(@Nullable String);
+ method public double optDouble(@Nullable String, double);
+ method public int optInt(@Nullable String);
+ method public int optInt(@Nullable String, int);
+ method @Nullable public org.json.JSONArray optJSONArray(@Nullable String);
+ method @Nullable public org.json.JSONObject optJSONObject(@Nullable String);
+ method public long optLong(@Nullable String);
+ method public long optLong(@Nullable String, long);
+ method @NonNull public String optString(@Nullable String);
+ method @NonNull public String optString(@Nullable String, @NonNull String);
+ method @NonNull public org.json.JSONObject put(@NonNull String, boolean) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject put(@NonNull String, double) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject put(@NonNull String, int) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject put(@NonNull String, long) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject put(@NonNull String, @Nullable Object) throws org.json.JSONException;
+ method @NonNull public org.json.JSONObject putOpt(@Nullable String, @Nullable Object) throws org.json.JSONException;
+ method @NonNull public static String quote(@Nullable String);
+ method @Nullable public Object remove(@Nullable String);
+ method @Nullable public org.json.JSONArray toJSONArray(@Nullable org.json.JSONArray) throws org.json.JSONException;
+ method @NonNull public String toString(int) throws org.json.JSONException;
+ method @Nullable public static Object wrap(@Nullable Object);
+ field @NonNull public static final Object NULL;
}
public class JSONStringer {
@@ -76611,88 +76745,88 @@ package org.json {
method public org.json.JSONStringer array() throws org.json.JSONException;
method public org.json.JSONStringer endArray() throws org.json.JSONException;
method public org.json.JSONStringer endObject() throws org.json.JSONException;
- method public org.json.JSONStringer key(java.lang.String) throws org.json.JSONException;
+ method public org.json.JSONStringer key(String) throws org.json.JSONException;
method public org.json.JSONStringer object() throws org.json.JSONException;
- method public org.json.JSONStringer value(java.lang.Object) throws org.json.JSONException;
+ method public org.json.JSONStringer value(Object) throws org.json.JSONException;
method public org.json.JSONStringer value(boolean) throws org.json.JSONException;
method public org.json.JSONStringer value(double) throws org.json.JSONException;
method public org.json.JSONStringer value(long) throws org.json.JSONException;
}
public class JSONTokener {
- ctor public JSONTokener(java.lang.String);
+ ctor public JSONTokener(String);
method public void back();
method public static int dehexchar(char);
method public boolean more();
method public char next();
method public char next(char) throws org.json.JSONException;
- method public java.lang.String next(int) throws org.json.JSONException;
+ method public String next(int) throws org.json.JSONException;
method public char nextClean() throws org.json.JSONException;
- method public java.lang.String nextString(char) throws org.json.JSONException;
- method public java.lang.String nextTo(java.lang.String);
- method public java.lang.String nextTo(char);
- method public java.lang.Object nextValue() throws org.json.JSONException;
- method public void skipPast(java.lang.String);
+ method public String nextString(char) throws org.json.JSONException;
+ method public String nextTo(String);
+ method public String nextTo(char);
+ method public Object nextValue() throws org.json.JSONException;
+ method public void skipPast(String);
method public char skipTo(char);
- method public org.json.JSONException syntaxError(java.lang.String);
+ method public org.json.JSONException syntaxError(String);
}
}
package org.w3c.dom {
- public abstract interface Attr implements org.w3c.dom.Node {
- method public abstract java.lang.String getName();
- method public abstract org.w3c.dom.Element getOwnerElement();
- method public abstract org.w3c.dom.TypeInfo getSchemaTypeInfo();
- method public abstract boolean getSpecified();
- method public abstract java.lang.String getValue();
- method public abstract boolean isId();
- method public abstract void setValue(java.lang.String) throws org.w3c.dom.DOMException;
+ public interface Attr extends org.w3c.dom.Node {
+ method public String getName();
+ method public org.w3c.dom.Element getOwnerElement();
+ method public org.w3c.dom.TypeInfo getSchemaTypeInfo();
+ method public boolean getSpecified();
+ method public String getValue();
+ method public boolean isId();
+ method public void setValue(String) throws org.w3c.dom.DOMException;
}
- public abstract interface CDATASection implements org.w3c.dom.Text {
+ public interface CDATASection extends org.w3c.dom.Text {
}
- public abstract interface CharacterData implements org.w3c.dom.Node {
- method public abstract void appendData(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void deleteData(int, int) throws org.w3c.dom.DOMException;
- method public abstract java.lang.String getData() throws org.w3c.dom.DOMException;
- method public abstract int getLength();
- method public abstract void insertData(int, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void replaceData(int, int, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void setData(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract java.lang.String substringData(int, int) throws org.w3c.dom.DOMException;
+ public interface CharacterData extends org.w3c.dom.Node {
+ method public void appendData(String) throws org.w3c.dom.DOMException;
+ method public void deleteData(int, int) throws org.w3c.dom.DOMException;
+ method public String getData() throws org.w3c.dom.DOMException;
+ method public int getLength();
+ method public void insertData(int, String) throws org.w3c.dom.DOMException;
+ method public void replaceData(int, int, String) throws org.w3c.dom.DOMException;
+ method public void setData(String) throws org.w3c.dom.DOMException;
+ method public String substringData(int, int) throws org.w3c.dom.DOMException;
}
- public abstract interface Comment implements org.w3c.dom.CharacterData {
+ public interface Comment extends org.w3c.dom.CharacterData {
}
- public abstract interface DOMConfiguration {
- method public abstract boolean canSetParameter(java.lang.String, java.lang.Object);
- method public abstract java.lang.Object getParameter(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.DOMStringList getParameterNames();
- method public abstract void setParameter(java.lang.String, java.lang.Object) throws org.w3c.dom.DOMException;
+ public interface DOMConfiguration {
+ method public boolean canSetParameter(String, Object);
+ method public Object getParameter(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.DOMStringList getParameterNames();
+ method public void setParameter(String, Object) throws org.w3c.dom.DOMException;
}
- public abstract interface DOMError {
- method public abstract org.w3c.dom.DOMLocator getLocation();
- method public abstract java.lang.String getMessage();
- method public abstract java.lang.Object getRelatedData();
- method public abstract java.lang.Object getRelatedException();
- method public abstract short getSeverity();
- method public abstract java.lang.String getType();
+ public interface DOMError {
+ method public org.w3c.dom.DOMLocator getLocation();
+ method public String getMessage();
+ method public Object getRelatedData();
+ method public Object getRelatedException();
+ method public short getSeverity();
+ method public String getType();
field public static final short SEVERITY_ERROR = 2; // 0x2
field public static final short SEVERITY_FATAL_ERROR = 3; // 0x3
field public static final short SEVERITY_WARNING = 1; // 0x1
}
- public abstract interface DOMErrorHandler {
- method public abstract boolean handleError(org.w3c.dom.DOMError);
+ public interface DOMErrorHandler {
+ method public boolean handleError(org.w3c.dom.DOMError);
}
public class DOMException extends java.lang.RuntimeException {
- ctor public DOMException(short, java.lang.String);
+ ctor public DOMException(short, String);
field public static final short DOMSTRING_SIZE_ERR = 2; // 0x2
field public static final short HIERARCHY_REQUEST_ERR = 3; // 0x3
field public static final short INDEX_SIZE_ERR = 1; // 0x1
@@ -76713,176 +76847,176 @@ package org.w3c.dom {
field public short code;
}
- public abstract interface DOMImplementation {
- method public abstract org.w3c.dom.Document createDocument(java.lang.String, java.lang.String, org.w3c.dom.DocumentType) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.DocumentType createDocumentType(java.lang.String, java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract java.lang.Object getFeature(java.lang.String, java.lang.String);
- method public abstract boolean hasFeature(java.lang.String, java.lang.String);
+ public interface DOMImplementation {
+ method public org.w3c.dom.Document createDocument(String, String, org.w3c.dom.DocumentType) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.DocumentType createDocumentType(String, String, String) throws org.w3c.dom.DOMException;
+ method public Object getFeature(String, String);
+ method public boolean hasFeature(String, String);
}
- public abstract interface DOMImplementationList {
- method public abstract int getLength();
- method public abstract org.w3c.dom.DOMImplementation item(int);
+ public interface DOMImplementationList {
+ method public int getLength();
+ method public org.w3c.dom.DOMImplementation item(int);
}
- public abstract interface DOMImplementationSource {
- method public abstract org.w3c.dom.DOMImplementation getDOMImplementation(java.lang.String);
- method public abstract org.w3c.dom.DOMImplementationList getDOMImplementationList(java.lang.String);
+ public interface DOMImplementationSource {
+ method public org.w3c.dom.DOMImplementation getDOMImplementation(String);
+ method public org.w3c.dom.DOMImplementationList getDOMImplementationList(String);
}
- public abstract interface DOMLocator {
- method public abstract int getByteOffset();
- method public abstract int getColumnNumber();
- method public abstract int getLineNumber();
- method public abstract org.w3c.dom.Node getRelatedNode();
- method public abstract java.lang.String getUri();
- method public abstract int getUtf16Offset();
+ public interface DOMLocator {
+ method public int getByteOffset();
+ method public int getColumnNumber();
+ method public int getLineNumber();
+ method public org.w3c.dom.Node getRelatedNode();
+ method public String getUri();
+ method public int getUtf16Offset();
}
- public abstract interface DOMStringList {
- method public abstract boolean contains(java.lang.String);
- method public abstract int getLength();
- method public abstract java.lang.String item(int);
- }
-
- public abstract interface Document implements org.w3c.dom.Node {
- method public abstract org.w3c.dom.Node adoptNode(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr createAttribute(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr createAttributeNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.CDATASection createCDATASection(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Comment createComment(java.lang.String);
- method public abstract org.w3c.dom.DocumentFragment createDocumentFragment();
- method public abstract org.w3c.dom.Element createElement(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Element createElementNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.EntityReference createEntityReference(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.ProcessingInstruction createProcessingInstruction(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Text createTextNode(java.lang.String);
- method public abstract org.w3c.dom.DocumentType getDoctype();
- method public abstract org.w3c.dom.Element getDocumentElement();
- method public abstract java.lang.String getDocumentURI();
- method public abstract org.w3c.dom.DOMConfiguration getDomConfig();
- method public abstract org.w3c.dom.Element getElementById(java.lang.String);
- method public abstract org.w3c.dom.NodeList getElementsByTagName(java.lang.String);
- method public abstract org.w3c.dom.NodeList getElementsByTagNameNS(java.lang.String, java.lang.String);
- method public abstract org.w3c.dom.DOMImplementation getImplementation();
- method public abstract java.lang.String getInputEncoding();
- method public abstract boolean getStrictErrorChecking();
- method public abstract java.lang.String getXmlEncoding();
- method public abstract boolean getXmlStandalone();
- method public abstract java.lang.String getXmlVersion();
- method public abstract org.w3c.dom.Node importNode(org.w3c.dom.Node, boolean) throws org.w3c.dom.DOMException;
- method public abstract void normalizeDocument();
- method public abstract org.w3c.dom.Node renameNode(org.w3c.dom.Node, java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void setDocumentURI(java.lang.String);
- method public abstract void setStrictErrorChecking(boolean);
- method public abstract void setXmlStandalone(boolean) throws org.w3c.dom.DOMException;
- method public abstract void setXmlVersion(java.lang.String) throws org.w3c.dom.DOMException;
- }
-
- public abstract interface DocumentFragment implements org.w3c.dom.Node {
- }
-
- public abstract interface DocumentType implements org.w3c.dom.Node {
- method public abstract org.w3c.dom.NamedNodeMap getEntities();
- method public abstract java.lang.String getInternalSubset();
- method public abstract java.lang.String getName();
- method public abstract org.w3c.dom.NamedNodeMap getNotations();
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getSystemId();
- }
-
- public abstract interface Element implements org.w3c.dom.Node {
- method public abstract java.lang.String getAttribute(java.lang.String);
- method public abstract java.lang.String getAttributeNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr getAttributeNode(java.lang.String);
- method public abstract org.w3c.dom.Attr getAttributeNodeNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.NodeList getElementsByTagName(java.lang.String);
- method public abstract org.w3c.dom.NodeList getElementsByTagNameNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.TypeInfo getSchemaTypeInfo();
- method public abstract java.lang.String getTagName();
- method public abstract boolean hasAttribute(java.lang.String);
- method public abstract boolean hasAttributeNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void removeAttribute(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void removeAttributeNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr removeAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
- method public abstract void setAttribute(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void setAttributeNS(java.lang.String, java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr setAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Attr setAttributeNodeNS(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
- method public abstract void setIdAttribute(java.lang.String, boolean) throws org.w3c.dom.DOMException;
- method public abstract void setIdAttributeNS(java.lang.String, java.lang.String, boolean) throws org.w3c.dom.DOMException;
- method public abstract void setIdAttributeNode(org.w3c.dom.Attr, boolean) throws org.w3c.dom.DOMException;
- }
-
- public abstract interface Entity implements org.w3c.dom.Node {
- method public abstract java.lang.String getInputEncoding();
- method public abstract java.lang.String getNotationName();
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getSystemId();
- method public abstract java.lang.String getXmlEncoding();
- method public abstract java.lang.String getXmlVersion();
- }
-
- public abstract interface EntityReference implements org.w3c.dom.Node {
- }
-
- public abstract interface NameList {
- method public abstract boolean contains(java.lang.String);
- method public abstract boolean containsNS(java.lang.String, java.lang.String);
- method public abstract int getLength();
- method public abstract java.lang.String getName(int);
- method public abstract java.lang.String getNamespaceURI(int);
+ public interface DOMStringList {
+ method public boolean contains(String);
+ method public int getLength();
+ method public String item(int);
+ }
+
+ public interface Document extends org.w3c.dom.Node {
+ method public org.w3c.dom.Node adoptNode(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr createAttribute(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr createAttributeNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.CDATASection createCDATASection(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Comment createComment(String);
+ method public org.w3c.dom.DocumentFragment createDocumentFragment();
+ method public org.w3c.dom.Element createElement(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Element createElementNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.EntityReference createEntityReference(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.ProcessingInstruction createProcessingInstruction(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Text createTextNode(String);
+ method public org.w3c.dom.DocumentType getDoctype();
+ method public org.w3c.dom.Element getDocumentElement();
+ method public String getDocumentURI();
+ method public org.w3c.dom.DOMConfiguration getDomConfig();
+ method public org.w3c.dom.Element getElementById(String);
+ method public org.w3c.dom.NodeList getElementsByTagName(String);
+ method public org.w3c.dom.NodeList getElementsByTagNameNS(String, String);
+ method public org.w3c.dom.DOMImplementation getImplementation();
+ method public String getInputEncoding();
+ method public boolean getStrictErrorChecking();
+ method public String getXmlEncoding();
+ method public boolean getXmlStandalone();
+ method public String getXmlVersion();
+ method public org.w3c.dom.Node importNode(org.w3c.dom.Node, boolean) throws org.w3c.dom.DOMException;
+ method public void normalizeDocument();
+ method public org.w3c.dom.Node renameNode(org.w3c.dom.Node, String, String) throws org.w3c.dom.DOMException;
+ method public void setDocumentURI(String);
+ method public void setStrictErrorChecking(boolean);
+ method public void setXmlStandalone(boolean) throws org.w3c.dom.DOMException;
+ method public void setXmlVersion(String) throws org.w3c.dom.DOMException;
+ }
+
+ public interface DocumentFragment extends org.w3c.dom.Node {
+ }
+
+ public interface DocumentType extends org.w3c.dom.Node {
+ method public org.w3c.dom.NamedNodeMap getEntities();
+ method public String getInternalSubset();
+ method public String getName();
+ method public org.w3c.dom.NamedNodeMap getNotations();
+ method public String getPublicId();
+ method public String getSystemId();
+ }
+
+ public interface Element extends org.w3c.dom.Node {
+ method public String getAttribute(String);
+ method public String getAttributeNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr getAttributeNode(String);
+ method public org.w3c.dom.Attr getAttributeNodeNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.NodeList getElementsByTagName(String);
+ method public org.w3c.dom.NodeList getElementsByTagNameNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.TypeInfo getSchemaTypeInfo();
+ method public String getTagName();
+ method public boolean hasAttribute(String);
+ method public boolean hasAttributeNS(String, String) throws org.w3c.dom.DOMException;
+ method public void removeAttribute(String) throws org.w3c.dom.DOMException;
+ method public void removeAttributeNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr removeAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
+ method public void setAttribute(String, String) throws org.w3c.dom.DOMException;
+ method public void setAttributeNS(String, String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr setAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Attr setAttributeNodeNS(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
+ method public void setIdAttribute(String, boolean) throws org.w3c.dom.DOMException;
+ method public void setIdAttributeNS(String, String, boolean) throws org.w3c.dom.DOMException;
+ method public void setIdAttributeNode(org.w3c.dom.Attr, boolean) throws org.w3c.dom.DOMException;
+ }
+
+ public interface Entity extends org.w3c.dom.Node {
+ method public String getInputEncoding();
+ method public String getNotationName();
+ method public String getPublicId();
+ method public String getSystemId();
+ method public String getXmlEncoding();
+ method public String getXmlVersion();
+ }
+
+ public interface EntityReference extends org.w3c.dom.Node {
+ }
+
+ public interface NameList {
+ method public boolean contains(String);
+ method public boolean containsNS(String, String);
+ method public int getLength();
+ method public String getName(int);
+ method public String getNamespaceURI(int);
}
- public abstract interface NamedNodeMap {
- method public abstract int getLength();
- method public abstract org.w3c.dom.Node getNamedItem(java.lang.String);
- method public abstract org.w3c.dom.Node getNamedItemNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node item(int);
- method public abstract org.w3c.dom.Node removeNamedItem(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node removeNamedItemNS(java.lang.String, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node setNamedItem(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node setNamedItemNS(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- }
-
- public abstract interface Node {
- method public abstract org.w3c.dom.Node appendChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node cloneNode(boolean);
- method public abstract short compareDocumentPosition(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.NamedNodeMap getAttributes();
- method public abstract java.lang.String getBaseURI();
- method public abstract org.w3c.dom.NodeList getChildNodes();
- method public abstract java.lang.Object getFeature(java.lang.String, java.lang.String);
- method public abstract org.w3c.dom.Node getFirstChild();
- method public abstract org.w3c.dom.Node getLastChild();
- method public abstract java.lang.String getLocalName();
- method public abstract java.lang.String getNamespaceURI();
- method public abstract org.w3c.dom.Node getNextSibling();
- method public abstract java.lang.String getNodeName();
- method public abstract short getNodeType();
- method public abstract java.lang.String getNodeValue() throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Document getOwnerDocument();
- method public abstract org.w3c.dom.Node getParentNode();
- method public abstract java.lang.String getPrefix();
- method public abstract org.w3c.dom.Node getPreviousSibling();
- method public abstract java.lang.String getTextContent() throws org.w3c.dom.DOMException;
- method public abstract java.lang.Object getUserData(java.lang.String);
- method public abstract boolean hasAttributes();
- method public abstract boolean hasChildNodes();
- method public abstract org.w3c.dom.Node insertBefore(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract boolean isDefaultNamespace(java.lang.String);
- method public abstract boolean isEqualNode(org.w3c.dom.Node);
- method public abstract boolean isSameNode(org.w3c.dom.Node);
- method public abstract boolean isSupported(java.lang.String, java.lang.String);
- method public abstract java.lang.String lookupNamespaceURI(java.lang.String);
- method public abstract java.lang.String lookupPrefix(java.lang.String);
- method public abstract void normalize();
- method public abstract org.w3c.dom.Node removeChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Node replaceChild(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
- method public abstract void setNodeValue(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void setPrefix(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract void setTextContent(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract java.lang.Object setUserData(java.lang.String, java.lang.Object, org.w3c.dom.UserDataHandler);
+ public interface NamedNodeMap {
+ method public int getLength();
+ method public org.w3c.dom.Node getNamedItem(String);
+ method public org.w3c.dom.Node getNamedItemNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node item(int);
+ method public org.w3c.dom.Node removeNamedItem(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node removeNamedItemNS(String, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node setNamedItem(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node setNamedItemNS(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ }
+
+ public interface Node {
+ method public org.w3c.dom.Node appendChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node cloneNode(boolean);
+ method public short compareDocumentPosition(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.NamedNodeMap getAttributes();
+ method public String getBaseURI();
+ method public org.w3c.dom.NodeList getChildNodes();
+ method public Object getFeature(String, String);
+ method public org.w3c.dom.Node getFirstChild();
+ method public org.w3c.dom.Node getLastChild();
+ method public String getLocalName();
+ method public String getNamespaceURI();
+ method public org.w3c.dom.Node getNextSibling();
+ method public String getNodeName();
+ method public short getNodeType();
+ method public String getNodeValue() throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Document getOwnerDocument();
+ method public org.w3c.dom.Node getParentNode();
+ method public String getPrefix();
+ method public org.w3c.dom.Node getPreviousSibling();
+ method public String getTextContent() throws org.w3c.dom.DOMException;
+ method public Object getUserData(String);
+ method public boolean hasAttributes();
+ method public boolean hasChildNodes();
+ method public org.w3c.dom.Node insertBefore(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public boolean isDefaultNamespace(String);
+ method public boolean isEqualNode(org.w3c.dom.Node);
+ method public boolean isSameNode(org.w3c.dom.Node);
+ method public boolean isSupported(String, String);
+ method public String lookupNamespaceURI(String);
+ method public String lookupPrefix(String);
+ method public void normalize();
+ method public org.w3c.dom.Node removeChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Node replaceChild(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
+ method public void setNodeValue(String) throws org.w3c.dom.DOMException;
+ method public void setPrefix(String) throws org.w3c.dom.DOMException;
+ method public void setTextContent(String) throws org.w3c.dom.DOMException;
+ method public Object setUserData(String, Object, org.w3c.dom.UserDataHandler);
field public static final short ATTRIBUTE_NODE = 2; // 0x2
field public static final short CDATA_SECTION_NODE = 4; // 0x4
field public static final short COMMENT_NODE = 8; // 0x8
@@ -76903,41 +77037,41 @@ package org.w3c.dom {
field public static final short TEXT_NODE = 3; // 0x3
}
- public abstract interface NodeList {
- method public abstract int getLength();
- method public abstract org.w3c.dom.Node item(int);
+ public interface NodeList {
+ method public int getLength();
+ method public org.w3c.dom.Node item(int);
}
- public abstract interface Notation implements org.w3c.dom.Node {
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getSystemId();
+ public interface Notation extends org.w3c.dom.Node {
+ method public String getPublicId();
+ method public String getSystemId();
}
- public abstract interface ProcessingInstruction implements org.w3c.dom.Node {
- method public abstract java.lang.String getData();
- method public abstract java.lang.String getTarget();
- method public abstract void setData(java.lang.String) throws org.w3c.dom.DOMException;
+ public interface ProcessingInstruction extends org.w3c.dom.Node {
+ method public String getData();
+ method public String getTarget();
+ method public void setData(String) throws org.w3c.dom.DOMException;
}
- public abstract interface Text implements org.w3c.dom.CharacterData {
- method public abstract java.lang.String getWholeText();
- method public abstract boolean isElementContentWhitespace();
- method public abstract org.w3c.dom.Text replaceWholeText(java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.Text splitText(int) throws org.w3c.dom.DOMException;
+ public interface Text extends org.w3c.dom.CharacterData {
+ method public String getWholeText();
+ method public boolean isElementContentWhitespace();
+ method public org.w3c.dom.Text replaceWholeText(String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.Text splitText(int) throws org.w3c.dom.DOMException;
}
- public abstract interface TypeInfo {
- method public abstract java.lang.String getTypeName();
- method public abstract java.lang.String getTypeNamespace();
- method public abstract boolean isDerivedFrom(java.lang.String, java.lang.String, int);
+ public interface TypeInfo {
+ method public String getTypeName();
+ method public String getTypeNamespace();
+ method public boolean isDerivedFrom(String, String, int);
field public static final int DERIVATION_EXTENSION = 2; // 0x2
field public static final int DERIVATION_LIST = 8; // 0x8
field public static final int DERIVATION_RESTRICTION = 1; // 0x1
field public static final int DERIVATION_UNION = 4; // 0x4
}
- public abstract interface UserDataHandler {
- method public abstract void handle(short, java.lang.String, java.lang.Object, org.w3c.dom.Node, org.w3c.dom.Node);
+ public interface UserDataHandler {
+ method public void handle(short, String, Object, org.w3c.dom.Node, org.w3c.dom.Node);
field public static final short NODE_ADOPTED = 5; // 0x5
field public static final short NODE_CLONED = 1; // 0x1
field public static final short NODE_DELETED = 3; // 0x3
@@ -76949,62 +77083,62 @@ package org.w3c.dom {
package org.w3c.dom.ls {
- public abstract interface DOMImplementationLS {
- method public abstract org.w3c.dom.ls.LSInput createLSInput();
- method public abstract org.w3c.dom.ls.LSOutput createLSOutput();
- method public abstract org.w3c.dom.ls.LSParser createLSParser(short, java.lang.String) throws org.w3c.dom.DOMException;
- method public abstract org.w3c.dom.ls.LSSerializer createLSSerializer();
+ public interface DOMImplementationLS {
+ method public org.w3c.dom.ls.LSInput createLSInput();
+ method public org.w3c.dom.ls.LSOutput createLSOutput();
+ method public org.w3c.dom.ls.LSParser createLSParser(short, String) throws org.w3c.dom.DOMException;
+ method public org.w3c.dom.ls.LSSerializer createLSSerializer();
field public static final short MODE_ASYNCHRONOUS = 2; // 0x2
field public static final short MODE_SYNCHRONOUS = 1; // 0x1
}
public class LSException extends java.lang.RuntimeException {
- ctor public LSException(short, java.lang.String);
+ ctor public LSException(short, String);
field public static final short PARSE_ERR = 81; // 0x51
field public static final short SERIALIZE_ERR = 82; // 0x52
field public short code;
}
- public abstract interface LSInput {
- method public abstract java.lang.String getBaseURI();
- method public abstract java.io.InputStream getByteStream();
- method public abstract boolean getCertifiedText();
- method public abstract java.io.Reader getCharacterStream();
- method public abstract java.lang.String getEncoding();
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getStringData();
- method public abstract java.lang.String getSystemId();
- method public abstract void setBaseURI(java.lang.String);
- method public abstract void setByteStream(java.io.InputStream);
- method public abstract void setCertifiedText(boolean);
- method public abstract void setCharacterStream(java.io.Reader);
- method public abstract void setEncoding(java.lang.String);
- method public abstract void setPublicId(java.lang.String);
- method public abstract void setStringData(java.lang.String);
- method public abstract void setSystemId(java.lang.String);
- }
-
- public abstract interface LSOutput {
- method public abstract java.io.OutputStream getByteStream();
- method public abstract java.io.Writer getCharacterStream();
- method public abstract java.lang.String getEncoding();
- method public abstract java.lang.String getSystemId();
- method public abstract void setByteStream(java.io.OutputStream);
- method public abstract void setCharacterStream(java.io.Writer);
- method public abstract void setEncoding(java.lang.String);
- method public abstract void setSystemId(java.lang.String);
- }
-
- public abstract interface LSParser {
- method public abstract void abort();
- method public abstract boolean getAsync();
- method public abstract boolean getBusy();
- method public abstract org.w3c.dom.DOMConfiguration getDomConfig();
- method public abstract org.w3c.dom.ls.LSParserFilter getFilter();
- method public abstract org.w3c.dom.Document parse(org.w3c.dom.ls.LSInput) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
- method public abstract org.w3c.dom.Document parseURI(java.lang.String) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
- method public abstract org.w3c.dom.Node parseWithContext(org.w3c.dom.ls.LSInput, org.w3c.dom.Node, short) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
- method public abstract void setFilter(org.w3c.dom.ls.LSParserFilter);
+ public interface LSInput {
+ method public String getBaseURI();
+ method public java.io.InputStream getByteStream();
+ method public boolean getCertifiedText();
+ method public java.io.Reader getCharacterStream();
+ method public String getEncoding();
+ method public String getPublicId();
+ method public String getStringData();
+ method public String getSystemId();
+ method public void setBaseURI(String);
+ method public void setByteStream(java.io.InputStream);
+ method public void setCertifiedText(boolean);
+ method public void setCharacterStream(java.io.Reader);
+ method public void setEncoding(String);
+ method public void setPublicId(String);
+ method public void setStringData(String);
+ method public void setSystemId(String);
+ }
+
+ public interface LSOutput {
+ method public java.io.OutputStream getByteStream();
+ method public java.io.Writer getCharacterStream();
+ method public String getEncoding();
+ method public String getSystemId();
+ method public void setByteStream(java.io.OutputStream);
+ method public void setCharacterStream(java.io.Writer);
+ method public void setEncoding(String);
+ method public void setSystemId(String);
+ }
+
+ public interface LSParser {
+ method public void abort();
+ method public boolean getAsync();
+ method public boolean getBusy();
+ method public org.w3c.dom.DOMConfiguration getDomConfig();
+ method public org.w3c.dom.ls.LSParserFilter getFilter();
+ method public org.w3c.dom.Document parse(org.w3c.dom.ls.LSInput) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
+ method public org.w3c.dom.Document parseURI(String) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
+ method public org.w3c.dom.Node parseWithContext(org.w3c.dom.ls.LSInput, org.w3c.dom.Node, short) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
+ method public void setFilter(org.w3c.dom.ls.LSParserFilter);
field public static final short ACTION_APPEND_AS_CHILDREN = 1; // 0x1
field public static final short ACTION_INSERT_AFTER = 4; // 0x4
field public static final short ACTION_INSERT_BEFORE = 3; // 0x3
@@ -77012,343 +77146,343 @@ package org.w3c.dom.ls {
field public static final short ACTION_REPLACE_CHILDREN = 2; // 0x2
}
- public abstract interface LSParserFilter {
- method public abstract short acceptNode(org.w3c.dom.Node);
- method public abstract int getWhatToShow();
- method public abstract short startElement(org.w3c.dom.Element);
+ public interface LSParserFilter {
+ method public short acceptNode(org.w3c.dom.Node);
+ method public int getWhatToShow();
+ method public short startElement(org.w3c.dom.Element);
field public static final short FILTER_ACCEPT = 1; // 0x1
field public static final short FILTER_INTERRUPT = 4; // 0x4
field public static final short FILTER_REJECT = 2; // 0x2
field public static final short FILTER_SKIP = 3; // 0x3
}
- public abstract interface LSResourceResolver {
- method public abstract org.w3c.dom.ls.LSInput resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ public interface LSResourceResolver {
+ method public org.w3c.dom.ls.LSInput resolveResource(String, String, String, String, String);
}
- public abstract interface LSSerializer {
- method public abstract org.w3c.dom.DOMConfiguration getDomConfig();
- method public abstract java.lang.String getNewLine();
- method public abstract void setNewLine(java.lang.String);
- method public abstract boolean write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput) throws org.w3c.dom.ls.LSException;
- method public abstract java.lang.String writeToString(org.w3c.dom.Node) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
- method public abstract boolean writeToURI(org.w3c.dom.Node, java.lang.String) throws org.w3c.dom.ls.LSException;
+ public interface LSSerializer {
+ method public org.w3c.dom.DOMConfiguration getDomConfig();
+ method public String getNewLine();
+ method public void setNewLine(String);
+ method public boolean write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput) throws org.w3c.dom.ls.LSException;
+ method public String writeToString(org.w3c.dom.Node) throws org.w3c.dom.DOMException, org.w3c.dom.ls.LSException;
+ method public boolean writeToURI(org.w3c.dom.Node, String) throws org.w3c.dom.ls.LSException;
}
}
package org.xml.sax {
- public abstract deprecated interface AttributeList {
- method public abstract int getLength();
- method public abstract java.lang.String getName(int);
- method public abstract java.lang.String getType(int);
- method public abstract java.lang.String getType(java.lang.String);
- method public abstract java.lang.String getValue(int);
- method public abstract java.lang.String getValue(java.lang.String);
+ @Deprecated public interface AttributeList {
+ method @Deprecated public int getLength();
+ method @Deprecated public String getName(int);
+ method @Deprecated public String getType(int);
+ method @Deprecated public String getType(String);
+ method @Deprecated public String getValue(int);
+ method @Deprecated public String getValue(String);
}
- public abstract interface Attributes {
- method public abstract int getIndex(java.lang.String, java.lang.String);
- method public abstract int getIndex(java.lang.String);
- method public abstract int getLength();
- method public abstract java.lang.String getLocalName(int);
- method public abstract java.lang.String getQName(int);
- method public abstract java.lang.String getType(int);
- method public abstract java.lang.String getType(java.lang.String, java.lang.String);
- method public abstract java.lang.String getType(java.lang.String);
- method public abstract java.lang.String getURI(int);
- method public abstract java.lang.String getValue(int);
- method public abstract java.lang.String getValue(java.lang.String, java.lang.String);
- method public abstract java.lang.String getValue(java.lang.String);
- }
-
- public abstract interface ContentHandler {
- method public abstract void characters(char[], int, int) throws org.xml.sax.SAXException;
- method public abstract void endDocument() throws org.xml.sax.SAXException;
- method public abstract void endElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void endPrefixMapping(java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public abstract void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void setDocumentLocator(org.xml.sax.Locator);
- method public abstract void skippedEntity(java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void startDocument() throws org.xml.sax.SAXException;
- method public abstract void startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
- method public abstract void startPrefixMapping(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- }
-
- public abstract interface DTDHandler {
- method public abstract void notationDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- }
-
- public abstract deprecated interface DocumentHandler {
- method public abstract void characters(char[], int, int) throws org.xml.sax.SAXException;
- method public abstract void endDocument() throws org.xml.sax.SAXException;
- method public abstract void endElement(java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public abstract void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void setDocumentLocator(org.xml.sax.Locator);
- method public abstract void startDocument() throws org.xml.sax.SAXException;
- method public abstract void startElement(java.lang.String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
- }
-
- public abstract interface EntityResolver {
- method public abstract org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- }
-
- public abstract interface ErrorHandler {
- method public abstract void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
- method public abstract void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
- method public abstract void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
- }
-
- public deprecated class HandlerBase implements org.xml.sax.DTDHandler org.xml.sax.DocumentHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler {
- ctor public HandlerBase();
+ public interface Attributes {
+ method public int getIndex(String, String);
+ method public int getIndex(String);
+ method public int getLength();
+ method public String getLocalName(int);
+ method public String getQName(int);
+ method public String getType(int);
+ method public String getType(String, String);
+ method public String getType(String);
+ method public String getURI(int);
+ method public String getValue(int);
+ method public String getValue(String, String);
+ method public String getValue(String);
+ }
+
+ public interface ContentHandler {
method public void characters(char[], int, int) throws org.xml.sax.SAXException;
method public void endDocument() throws org.xml.sax.SAXException;
- method public void endElement(java.lang.String) throws org.xml.sax.SAXException;
- method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
- method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
+ method public void endElement(String, String, String) throws org.xml.sax.SAXException;
+ method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public void notationDecl(java.lang.String, java.lang.String, java.lang.String);
- method public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
method public void setDocumentLocator(org.xml.sax.Locator);
+ method public void skippedEntity(String) throws org.xml.sax.SAXException;
method public void startDocument() throws org.xml.sax.SAXException;
- method public void startElement(java.lang.String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
- method public void unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
+ method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
+ }
+
+ public interface DTDHandler {
+ method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
+ method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
+ }
+
+ @Deprecated public interface DocumentHandler {
+ method @Deprecated public void characters(char[], int, int) throws org.xml.sax.SAXException;
+ method @Deprecated public void endDocument() throws org.xml.sax.SAXException;
+ method @Deprecated public void endElement(String) throws org.xml.sax.SAXException;
+ method @Deprecated public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
+ method @Deprecated public void processingInstruction(String, String) throws org.xml.sax.SAXException;
+ method @Deprecated public void setDocumentLocator(org.xml.sax.Locator);
+ method @Deprecated public void startDocument() throws org.xml.sax.SAXException;
+ method @Deprecated public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
+ }
+
+ public interface EntityResolver {
+ method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
+ }
+
+ public interface ErrorHandler {
+ method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
+ method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
}
+ @Deprecated public class HandlerBase implements org.xml.sax.DTDHandler org.xml.sax.DocumentHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler {
+ ctor @Deprecated public HandlerBase();
+ method @Deprecated public void characters(char[], int, int) throws org.xml.sax.SAXException;
+ method @Deprecated public void endDocument() throws org.xml.sax.SAXException;
+ method @Deprecated public void endElement(String) throws org.xml.sax.SAXException;
+ method @Deprecated public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
+ method @Deprecated public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
+ method @Deprecated public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
+ method @Deprecated public void notationDecl(String, String, String);
+ method @Deprecated public void processingInstruction(String, String) throws org.xml.sax.SAXException;
+ method @Deprecated public org.xml.sax.InputSource resolveEntity(String, String) throws org.xml.sax.SAXException;
+ method @Deprecated public void setDocumentLocator(org.xml.sax.Locator);
+ method @Deprecated public void startDocument() throws org.xml.sax.SAXException;
+ method @Deprecated public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
+ method @Deprecated public void unparsedEntityDecl(String, String, String, String);
+ method @Deprecated public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
+ }
+
public class InputSource {
ctor public InputSource();
- ctor public InputSource(java.lang.String);
+ ctor public InputSource(String);
ctor public InputSource(java.io.InputStream);
ctor public InputSource(java.io.Reader);
method public java.io.InputStream getByteStream();
method public java.io.Reader getCharacterStream();
- method public java.lang.String getEncoding();
- method public java.lang.String getPublicId();
- method public java.lang.String getSystemId();
+ method public String getEncoding();
+ method public String getPublicId();
+ method public String getSystemId();
method public void setByteStream(java.io.InputStream);
method public void setCharacterStream(java.io.Reader);
- method public void setEncoding(java.lang.String);
- method public void setPublicId(java.lang.String);
- method public void setSystemId(java.lang.String);
+ method public void setEncoding(String);
+ method public void setPublicId(String);
+ method public void setSystemId(String);
}
- public abstract interface Locator {
- method public abstract int getColumnNumber();
- method public abstract int getLineNumber();
- method public abstract java.lang.String getPublicId();
- method public abstract java.lang.String getSystemId();
+ public interface Locator {
+ method public int getColumnNumber();
+ method public int getLineNumber();
+ method public String getPublicId();
+ method public String getSystemId();
}
- public abstract deprecated interface Parser {
- method public abstract void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public abstract void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public abstract void setDTDHandler(org.xml.sax.DTDHandler);
- method public abstract void setDocumentHandler(org.xml.sax.DocumentHandler);
- method public abstract void setEntityResolver(org.xml.sax.EntityResolver);
- method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
- method public abstract void setLocale(java.util.Locale) throws org.xml.sax.SAXException;
+ @Deprecated public interface Parser {
+ method @Deprecated public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
+ method @Deprecated public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
+ method @Deprecated public void setDTDHandler(org.xml.sax.DTDHandler);
+ method @Deprecated public void setDocumentHandler(org.xml.sax.DocumentHandler);
+ method @Deprecated public void setEntityResolver(org.xml.sax.EntityResolver);
+ method @Deprecated public void setErrorHandler(org.xml.sax.ErrorHandler);
+ method @Deprecated public void setLocale(java.util.Locale) throws org.xml.sax.SAXException;
}
public class SAXException extends java.lang.Exception {
ctor public SAXException();
- ctor public SAXException(java.lang.String);
- ctor public SAXException(java.lang.Exception);
- ctor public SAXException(java.lang.String, java.lang.Exception);
- method public java.lang.Exception getException();
+ ctor public SAXException(String);
+ ctor public SAXException(Exception);
+ ctor public SAXException(String, Exception);
+ method public Exception getException();
}
public class SAXNotRecognizedException extends org.xml.sax.SAXException {
ctor public SAXNotRecognizedException();
- ctor public SAXNotRecognizedException(java.lang.String);
+ ctor public SAXNotRecognizedException(String);
}
public class SAXNotSupportedException extends org.xml.sax.SAXException {
ctor public SAXNotSupportedException();
- ctor public SAXNotSupportedException(java.lang.String);
+ ctor public SAXNotSupportedException(String);
}
public class SAXParseException extends org.xml.sax.SAXException {
- ctor public SAXParseException(java.lang.String, org.xml.sax.Locator);
- ctor public SAXParseException(java.lang.String, org.xml.sax.Locator, java.lang.Exception);
- ctor public SAXParseException(java.lang.String, java.lang.String, java.lang.String, int, int);
- ctor public SAXParseException(java.lang.String, java.lang.String, java.lang.String, int, int, java.lang.Exception);
+ ctor public SAXParseException(String, org.xml.sax.Locator);
+ ctor public SAXParseException(String, org.xml.sax.Locator, Exception);
+ ctor public SAXParseException(String, String, String, int, int);
+ ctor public SAXParseException(String, String, String, int, int, Exception);
method public int getColumnNumber();
method public int getLineNumber();
- method public java.lang.String getPublicId();
- method public java.lang.String getSystemId();
+ method public String getPublicId();
+ method public String getSystemId();
}
- public abstract interface XMLFilter implements org.xml.sax.XMLReader {
- method public abstract org.xml.sax.XMLReader getParent();
- method public abstract void setParent(org.xml.sax.XMLReader);
+ public interface XMLFilter extends org.xml.sax.XMLReader {
+ method public org.xml.sax.XMLReader getParent();
+ method public void setParent(org.xml.sax.XMLReader);
}
- public abstract interface XMLReader {
- method public abstract org.xml.sax.ContentHandler getContentHandler();
- method public abstract org.xml.sax.DTDHandler getDTDHandler();
- method public abstract org.xml.sax.EntityResolver getEntityResolver();
- method public abstract org.xml.sax.ErrorHandler getErrorHandler();
- method public abstract boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public abstract java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public abstract void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public abstract void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public abstract void setContentHandler(org.xml.sax.ContentHandler);
- method public abstract void setDTDHandler(org.xml.sax.DTDHandler);
- method public abstract void setEntityResolver(org.xml.sax.EntityResolver);
- method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
- method public abstract void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public abstract void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ public interface XMLReader {
+ method public org.xml.sax.ContentHandler getContentHandler();
+ method public org.xml.sax.DTDHandler getDTDHandler();
+ method public org.xml.sax.EntityResolver getEntityResolver();
+ method public org.xml.sax.ErrorHandler getErrorHandler();
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void setContentHandler(org.xml.sax.ContentHandler);
+ method public void setDTDHandler(org.xml.sax.DTDHandler);
+ method public void setEntityResolver(org.xml.sax.EntityResolver);
+ method public void setErrorHandler(org.xml.sax.ErrorHandler);
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
}
}
package org.xml.sax.ext {
- public abstract interface Attributes2 implements org.xml.sax.Attributes {
- method public abstract boolean isDeclared(int);
- method public abstract boolean isDeclared(java.lang.String);
- method public abstract boolean isDeclared(java.lang.String, java.lang.String);
- method public abstract boolean isSpecified(int);
- method public abstract boolean isSpecified(java.lang.String, java.lang.String);
- method public abstract boolean isSpecified(java.lang.String);
+ public interface Attributes2 extends org.xml.sax.Attributes {
+ method public boolean isDeclared(int);
+ method public boolean isDeclared(String);
+ method public boolean isDeclared(String, String);
+ method public boolean isSpecified(int);
+ method public boolean isSpecified(String, String);
+ method public boolean isSpecified(String);
}
public class Attributes2Impl extends org.xml.sax.helpers.AttributesImpl implements org.xml.sax.ext.Attributes2 {
ctor public Attributes2Impl();
ctor public Attributes2Impl(org.xml.sax.Attributes);
method public boolean isDeclared(int);
- method public boolean isDeclared(java.lang.String, java.lang.String);
- method public boolean isDeclared(java.lang.String);
+ method public boolean isDeclared(String, String);
+ method public boolean isDeclared(String);
method public boolean isSpecified(int);
- method public boolean isSpecified(java.lang.String, java.lang.String);
- method public boolean isSpecified(java.lang.String);
+ method public boolean isSpecified(String, String);
+ method public boolean isSpecified(String);
method public void setDeclared(int, boolean);
method public void setSpecified(int, boolean);
}
- public abstract interface DeclHandler {
- method public abstract void attributeDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void elementDecl(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void externalEntityDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void internalEntityDecl(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ public interface DeclHandler {
+ method public void attributeDecl(String, String, String, String, String) throws org.xml.sax.SAXException;
+ method public void elementDecl(String, String) throws org.xml.sax.SAXException;
+ method public void externalEntityDecl(String, String, String) throws org.xml.sax.SAXException;
+ method public void internalEntityDecl(String, String) throws org.xml.sax.SAXException;
}
public class DefaultHandler2 extends org.xml.sax.helpers.DefaultHandler implements org.xml.sax.ext.DeclHandler org.xml.sax.ext.EntityResolver2 org.xml.sax.ext.LexicalHandler {
ctor public DefaultHandler2();
- method public void attributeDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void attributeDecl(String, String, String, String, String) throws org.xml.sax.SAXException;
method public void comment(char[], int, int) throws org.xml.sax.SAXException;
- method public void elementDecl(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void elementDecl(String, String) throws org.xml.sax.SAXException;
method public void endCDATA() throws org.xml.sax.SAXException;
method public void endDTD() throws org.xml.sax.SAXException;
- method public void endEntity(java.lang.String) throws org.xml.sax.SAXException;
- method public void externalEntityDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public org.xml.sax.InputSource getExternalSubset(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public void internalEntityDecl(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void endEntity(String) throws org.xml.sax.SAXException;
+ method public void externalEntityDecl(String, String, String) throws org.xml.sax.SAXException;
+ method public org.xml.sax.InputSource getExternalSubset(String, String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void internalEntityDecl(String, String) throws org.xml.sax.SAXException;
+ method public org.xml.sax.InputSource resolveEntity(String, String, String, String) throws java.io.IOException, org.xml.sax.SAXException;
method public void startCDATA() throws org.xml.sax.SAXException;
- method public void startDTD(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void startEntity(java.lang.String) throws org.xml.sax.SAXException;
+ method public void startDTD(String, String, String) throws org.xml.sax.SAXException;
+ method public void startEntity(String) throws org.xml.sax.SAXException;
}
- public abstract interface EntityResolver2 implements org.xml.sax.EntityResolver {
- method public abstract org.xml.sax.InputSource getExternalSubset(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public abstract org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ public interface EntityResolver2 extends org.xml.sax.EntityResolver {
+ method public org.xml.sax.InputSource getExternalSubset(String, String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public org.xml.sax.InputSource resolveEntity(String, String, String, String) throws java.io.IOException, org.xml.sax.SAXException;
}
- public abstract interface LexicalHandler {
- method public abstract void comment(char[], int, int) throws org.xml.sax.SAXException;
- method public abstract void endCDATA() throws org.xml.sax.SAXException;
- method public abstract void endDTD() throws org.xml.sax.SAXException;
- method public abstract void endEntity(java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void startCDATA() throws org.xml.sax.SAXException;
- method public abstract void startDTD(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public abstract void startEntity(java.lang.String) throws org.xml.sax.SAXException;
+ public interface LexicalHandler {
+ method public void comment(char[], int, int) throws org.xml.sax.SAXException;
+ method public void endCDATA() throws org.xml.sax.SAXException;
+ method public void endDTD() throws org.xml.sax.SAXException;
+ method public void endEntity(String) throws org.xml.sax.SAXException;
+ method public void startCDATA() throws org.xml.sax.SAXException;
+ method public void startDTD(String, String, String) throws org.xml.sax.SAXException;
+ method public void startEntity(String) throws org.xml.sax.SAXException;
}
- public abstract interface Locator2 implements org.xml.sax.Locator {
- method public abstract java.lang.String getEncoding();
- method public abstract java.lang.String getXMLVersion();
+ public interface Locator2 extends org.xml.sax.Locator {
+ method public String getEncoding();
+ method public String getXMLVersion();
}
public class Locator2Impl extends org.xml.sax.helpers.LocatorImpl implements org.xml.sax.ext.Locator2 {
ctor public Locator2Impl();
ctor public Locator2Impl(org.xml.sax.Locator);
- method public java.lang.String getEncoding();
- method public java.lang.String getXMLVersion();
- method public void setEncoding(java.lang.String);
- method public void setXMLVersion(java.lang.String);
+ method public String getEncoding();
+ method public String getXMLVersion();
+ method public void setEncoding(String);
+ method public void setXMLVersion(String);
}
}
package org.xml.sax.helpers {
- public deprecated class AttributeListImpl implements org.xml.sax.AttributeList {
- ctor public AttributeListImpl();
- ctor public AttributeListImpl(org.xml.sax.AttributeList);
- method public void addAttribute(java.lang.String, java.lang.String, java.lang.String);
- method public void clear();
- method public int getLength();
- method public java.lang.String getName(int);
- method public java.lang.String getType(int);
- method public java.lang.String getType(java.lang.String);
- method public java.lang.String getValue(int);
- method public java.lang.String getValue(java.lang.String);
- method public void removeAttribute(java.lang.String);
- method public void setAttributeList(org.xml.sax.AttributeList);
+ @Deprecated public class AttributeListImpl implements org.xml.sax.AttributeList {
+ ctor @Deprecated public AttributeListImpl();
+ ctor @Deprecated public AttributeListImpl(org.xml.sax.AttributeList);
+ method @Deprecated public void addAttribute(String, String, String);
+ method @Deprecated public void clear();
+ method @Deprecated public int getLength();
+ method @Deprecated public String getName(int);
+ method @Deprecated public String getType(int);
+ method @Deprecated public String getType(String);
+ method @Deprecated public String getValue(int);
+ method @Deprecated public String getValue(String);
+ method @Deprecated public void removeAttribute(String);
+ method @Deprecated public void setAttributeList(org.xml.sax.AttributeList);
}
public class AttributesImpl implements org.xml.sax.Attributes {
ctor public AttributesImpl();
ctor public AttributesImpl(org.xml.sax.Attributes);
- method public void addAttribute(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public void addAttribute(String, String, String, String, String);
method public void clear();
- method public int getIndex(java.lang.String, java.lang.String);
- method public int getIndex(java.lang.String);
+ method public int getIndex(String, String);
+ method public int getIndex(String);
method public int getLength();
- method public java.lang.String getLocalName(int);
- method public java.lang.String getQName(int);
- method public java.lang.String getType(int);
- method public java.lang.String getType(java.lang.String, java.lang.String);
- method public java.lang.String getType(java.lang.String);
- method public java.lang.String getURI(int);
- method public java.lang.String getValue(int);
- method public java.lang.String getValue(java.lang.String, java.lang.String);
- method public java.lang.String getValue(java.lang.String);
+ method public String getLocalName(int);
+ method public String getQName(int);
+ method public String getType(int);
+ method public String getType(String, String);
+ method public String getType(String);
+ method public String getURI(int);
+ method public String getValue(int);
+ method public String getValue(String, String);
+ method public String getValue(String);
method public void removeAttribute(int);
- method public void setAttribute(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public void setAttribute(int, String, String, String, String, String);
method public void setAttributes(org.xml.sax.Attributes);
- method public void setLocalName(int, java.lang.String);
- method public void setQName(int, java.lang.String);
- method public void setType(int, java.lang.String);
- method public void setURI(int, java.lang.String);
- method public void setValue(int, java.lang.String);
+ method public void setLocalName(int, String);
+ method public void setQName(int, String);
+ method public void setType(int, String);
+ method public void setURI(int, String);
+ method public void setValue(int, String);
}
public class DefaultHandler implements org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler {
ctor public DefaultHandler();
method public void characters(char[], int, int) throws org.xml.sax.SAXException;
method public void endDocument() throws org.xml.sax.SAXException;
- method public void endElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void endPrefixMapping(java.lang.String) throws org.xml.sax.SAXException;
+ method public void endElement(String, String, String) throws org.xml.sax.SAXException;
+ method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public void notationDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
+ method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
+ method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
method public void setDocumentLocator(org.xml.sax.Locator);
- method public void skippedEntity(java.lang.String) throws org.xml.sax.SAXException;
+ method public void skippedEntity(String) throws org.xml.sax.SAXException;
method public void startDocument() throws org.xml.sax.SAXException;
- method public void startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
- method public void startPrefixMapping(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
+ method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
+ method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
}
@@ -77357,30 +77491,30 @@ package org.xml.sax.helpers {
ctor public LocatorImpl(org.xml.sax.Locator);
method public int getColumnNumber();
method public int getLineNumber();
- method public java.lang.String getPublicId();
- method public java.lang.String getSystemId();
+ method public String getPublicId();
+ method public String getSystemId();
method public void setColumnNumber(int);
method public void setLineNumber(int);
- method public void setPublicId(java.lang.String);
- method public void setSystemId(java.lang.String);
+ method public void setPublicId(String);
+ method public void setSystemId(String);
}
public class NamespaceSupport {
ctor public NamespaceSupport();
- method public boolean declarePrefix(java.lang.String, java.lang.String);
+ method public boolean declarePrefix(String, String);
method public java.util.Enumeration getDeclaredPrefixes();
- method public java.lang.String getPrefix(java.lang.String);
+ method public String getPrefix(String);
method public java.util.Enumeration getPrefixes();
- method public java.util.Enumeration getPrefixes(java.lang.String);
- method public java.lang.String getURI(java.lang.String);
+ method public java.util.Enumeration getPrefixes(String);
+ method public String getURI(String);
method public boolean isNamespaceDeclUris();
method public void popContext();
- method public java.lang.String[] processName(java.lang.String, java.lang.String[], boolean);
+ method public String[] processName(String, String[], boolean);
method public void pushContext();
method public void reset();
method public void setNamespaceDeclUris(boolean);
- field public static final java.lang.String NSDECL = "http://www.w3.org/xmlns/2000/";
- field public static final java.lang.String XMLNS = "http://www.w3.org/XML/1998/namespace";
+ field public static final String NSDECL = "http://www.w3.org/xmlns/2000/";
+ field public static final String XMLNS = "http://www.w3.org/XML/1998/namespace";
}
public class ParserAdapter implements org.xml.sax.DocumentHandler org.xml.sax.XMLReader {
@@ -77388,31 +77522,31 @@ package org.xml.sax.helpers {
ctor public ParserAdapter(org.xml.sax.Parser);
method public void characters(char[], int, int) throws org.xml.sax.SAXException;
method public void endDocument() throws org.xml.sax.SAXException;
- method public void endElement(java.lang.String) throws org.xml.sax.SAXException;
+ method public void endElement(String) throws org.xml.sax.SAXException;
method public org.xml.sax.ContentHandler getContentHandler();
method public org.xml.sax.DTDHandler getDTDHandler();
method public org.xml.sax.EntityResolver getEntityResolver();
method public org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
method public void setContentHandler(org.xml.sax.ContentHandler);
method public void setDTDHandler(org.xml.sax.DTDHandler);
method public void setDocumentLocator(org.xml.sax.Locator);
method public void setEntityResolver(org.xml.sax.EntityResolver);
method public void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public void startDocument() throws org.xml.sax.SAXException;
- method public void startElement(java.lang.String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
+ method public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
}
- public deprecated class ParserFactory {
- method public static org.xml.sax.Parser makeParser() throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NullPointerException;
- method public static org.xml.sax.Parser makeParser(java.lang.String) throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ @Deprecated public class ParserFactory {
+ method @Deprecated public static org.xml.sax.Parser makeParser() throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NullPointerException;
+ method @Deprecated public static org.xml.sax.Parser makeParser(String) throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
}
public class XMLFilterImpl implements org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler org.xml.sax.XMLFilter {
@@ -77420,36 +77554,36 @@ package org.xml.sax.helpers {
ctor public XMLFilterImpl(org.xml.sax.XMLReader);
method public void characters(char[], int, int) throws org.xml.sax.SAXException;
method public void endDocument() throws org.xml.sax.SAXException;
- method public void endElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void endPrefixMapping(java.lang.String) throws org.xml.sax.SAXException;
+ method public void endElement(String, String, String) throws org.xml.sax.SAXException;
+ method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
method public org.xml.sax.ContentHandler getContentHandler();
method public org.xml.sax.DTDHandler getDTDHandler();
method public org.xml.sax.EntityResolver getEntityResolver();
method public org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public org.xml.sax.XMLReader getParent();
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public void notationDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
- method public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
+ method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
method public void setContentHandler(org.xml.sax.ContentHandler);
method public void setDTDHandler(org.xml.sax.DTDHandler);
method public void setDocumentLocator(org.xml.sax.Locator);
method public void setEntityResolver(org.xml.sax.EntityResolver);
method public void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
method public void setParent(org.xml.sax.XMLReader);
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void skippedEntity(java.lang.String) throws org.xml.sax.SAXException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void skippedEntity(String) throws org.xml.sax.SAXException;
method public void startDocument() throws org.xml.sax.SAXException;
- method public void startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
- method public void startPrefixMapping(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
+ method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
+ method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
}
@@ -77458,146 +77592,146 @@ package org.xml.sax.helpers {
ctor public XMLReaderAdapter(org.xml.sax.XMLReader);
method public void characters(char[], int, int) throws org.xml.sax.SAXException;
method public void endDocument() throws org.xml.sax.SAXException;
- method public void endElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- method public void endPrefixMapping(java.lang.String);
+ method public void endElement(String, String, String) throws org.xml.sax.SAXException;
+ method public void endPrefixMapping(String);
method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
- method public void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
+ method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
method public void setDTDHandler(org.xml.sax.DTDHandler);
method public void setDocumentHandler(org.xml.sax.DocumentHandler);
method public void setDocumentLocator(org.xml.sax.Locator);
method public void setEntityResolver(org.xml.sax.EntityResolver);
method public void setErrorHandler(org.xml.sax.ErrorHandler);
method public void setLocale(java.util.Locale) throws org.xml.sax.SAXException;
- method public void skippedEntity(java.lang.String) throws org.xml.sax.SAXException;
+ method public void skippedEntity(String) throws org.xml.sax.SAXException;
method public void startDocument() throws org.xml.sax.SAXException;
- method public void startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
- method public void startPrefixMapping(java.lang.String, java.lang.String);
+ method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
+ method public void startPrefixMapping(String, String);
}
public final class XMLReaderFactory {
method public static org.xml.sax.XMLReader createXMLReader() throws org.xml.sax.SAXException;
- method public static org.xml.sax.XMLReader createXMLReader(java.lang.String) throws org.xml.sax.SAXException;
+ method public static org.xml.sax.XMLReader createXMLReader(String) throws org.xml.sax.SAXException;
}
}
package org.xmlpull.v1 {
- public abstract interface XmlPullParser {
- method public abstract void defineEntityReplacementText(java.lang.String, java.lang.String) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract int getAttributeCount();
- method public abstract java.lang.String getAttributeName(int);
- method public abstract java.lang.String getAttributeNamespace(int);
- method public abstract java.lang.String getAttributePrefix(int);
- method public abstract java.lang.String getAttributeType(int);
- method public abstract java.lang.String getAttributeValue(int);
- method public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
- method public abstract int getColumnNumber();
- method public abstract int getDepth();
- method public abstract int getEventType() throws org.xmlpull.v1.XmlPullParserException;
- method public abstract boolean getFeature(java.lang.String);
- method public abstract java.lang.String getInputEncoding();
- method public abstract int getLineNumber();
- method public abstract java.lang.String getName();
- method public abstract java.lang.String getNamespace(java.lang.String);
- method public abstract java.lang.String getNamespace();
- method public abstract int getNamespaceCount(int) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract java.lang.String getNamespacePrefix(int) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract java.lang.String getNamespaceUri(int) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract java.lang.String getPositionDescription();
- method public abstract java.lang.String getPrefix();
- method public abstract java.lang.Object getProperty(java.lang.String);
- method public abstract java.lang.String getText();
- method public abstract char[] getTextCharacters(int[]);
- method public abstract boolean isAttributeDefault(int);
- method public abstract boolean isEmptyElementTag() throws org.xmlpull.v1.XmlPullParserException;
- method public abstract boolean isWhitespace() throws org.xmlpull.v1.XmlPullParserException;
- method public abstract int next() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract int nextTag() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract java.lang.String nextText() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract int nextToken() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract void require(int, java.lang.String, java.lang.String) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public abstract void setFeature(java.lang.String, boolean) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract void setInput(java.io.Reader) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract void setInput(java.io.InputStream, java.lang.String) throws org.xmlpull.v1.XmlPullParserException;
- method public abstract void setProperty(java.lang.String, java.lang.Object) throws org.xmlpull.v1.XmlPullParserException;
+ public interface XmlPullParser {
+ method public void defineEntityReplacementText(String, String) throws org.xmlpull.v1.XmlPullParserException;
+ method public int getAttributeCount();
+ method public String getAttributeName(int);
+ method public String getAttributeNamespace(int);
+ method public String getAttributePrefix(int);
+ method public String getAttributeType(int);
+ method public String getAttributeValue(int);
+ method public String getAttributeValue(String, String);
+ method public int getColumnNumber();
+ method public int getDepth();
+ method public int getEventType() throws org.xmlpull.v1.XmlPullParserException;
+ method public boolean getFeature(String);
+ method public String getInputEncoding();
+ method public int getLineNumber();
+ method public String getName();
+ method public String getNamespace(String);
+ method public String getNamespace();
+ method public int getNamespaceCount(int) throws org.xmlpull.v1.XmlPullParserException;
+ method public String getNamespacePrefix(int) throws org.xmlpull.v1.XmlPullParserException;
+ method public String getNamespaceUri(int) throws org.xmlpull.v1.XmlPullParserException;
+ method public String getPositionDescription();
+ method public String getPrefix();
+ method public Object getProperty(String);
+ method public String getText();
+ method public char[] getTextCharacters(int[]);
+ method public boolean isAttributeDefault(int);
+ method public boolean isEmptyElementTag() throws org.xmlpull.v1.XmlPullParserException;
+ method public boolean isWhitespace() throws org.xmlpull.v1.XmlPullParserException;
+ method public int next() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public int nextTag() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public String nextText() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public int nextToken() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void require(int, String, String) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void setFeature(String, boolean) throws org.xmlpull.v1.XmlPullParserException;
+ method public void setInput(java.io.Reader) throws org.xmlpull.v1.XmlPullParserException;
+ method public void setInput(java.io.InputStream, String) throws org.xmlpull.v1.XmlPullParserException;
+ method public void setProperty(String, Object) throws org.xmlpull.v1.XmlPullParserException;
field public static final int CDSECT = 5; // 0x5
field public static final int COMMENT = 9; // 0x9
field public static final int DOCDECL = 10; // 0xa
field public static final int END_DOCUMENT = 1; // 0x1
field public static final int END_TAG = 3; // 0x3
field public static final int ENTITY_REF = 6; // 0x6
- field public static final java.lang.String FEATURE_PROCESS_DOCDECL = "http://xmlpull.org/v1/doc/features.html#process-docdecl";
- field public static final java.lang.String FEATURE_PROCESS_NAMESPACES = "http://xmlpull.org/v1/doc/features.html#process-namespaces";
- field public static final java.lang.String FEATURE_REPORT_NAMESPACE_ATTRIBUTES = "http://xmlpull.org/v1/doc/features.html#report-namespace-prefixes";
- field public static final java.lang.String FEATURE_VALIDATION = "http://xmlpull.org/v1/doc/features.html#validation";
+ field public static final String FEATURE_PROCESS_DOCDECL = "http://xmlpull.org/v1/doc/features.html#process-docdecl";
+ field public static final String FEATURE_PROCESS_NAMESPACES = "http://xmlpull.org/v1/doc/features.html#process-namespaces";
+ field public static final String FEATURE_REPORT_NAMESPACE_ATTRIBUTES = "http://xmlpull.org/v1/doc/features.html#report-namespace-prefixes";
+ field public static final String FEATURE_VALIDATION = "http://xmlpull.org/v1/doc/features.html#validation";
field public static final int IGNORABLE_WHITESPACE = 7; // 0x7
- field public static final java.lang.String NO_NAMESPACE = "";
+ field public static final String NO_NAMESPACE = "";
field public static final int PROCESSING_INSTRUCTION = 8; // 0x8
field public static final int START_DOCUMENT = 0; // 0x0
field public static final int START_TAG = 2; // 0x2
field public static final int TEXT = 4; // 0x4
- field public static final java.lang.String[] TYPES;
+ field public static final String[] TYPES;
}
public class XmlPullParserException extends java.lang.Exception {
- ctor public XmlPullParserException(java.lang.String);
- ctor public XmlPullParserException(java.lang.String, org.xmlpull.v1.XmlPullParser, java.lang.Throwable);
+ ctor public XmlPullParserException(String);
+ ctor public XmlPullParserException(String, org.xmlpull.v1.XmlPullParser, Throwable);
method public int getColumnNumber();
- method public java.lang.Throwable getDetail();
+ method public Throwable getDetail();
method public int getLineNumber();
field protected int column;
- field protected java.lang.Throwable detail;
+ field protected Throwable detail;
field protected int row;
}
public class XmlPullParserFactory {
ctor protected XmlPullParserFactory();
- method public boolean getFeature(java.lang.String);
+ method public boolean getFeature(String);
method public boolean isNamespaceAware();
method public boolean isValidating();
method public static org.xmlpull.v1.XmlPullParserFactory newInstance() throws org.xmlpull.v1.XmlPullParserException;
- method public static org.xmlpull.v1.XmlPullParserFactory newInstance(java.lang.String, java.lang.Class) throws org.xmlpull.v1.XmlPullParserException;
+ method public static org.xmlpull.v1.XmlPullParserFactory newInstance(String, Class) throws org.xmlpull.v1.XmlPullParserException;
method public org.xmlpull.v1.XmlPullParser newPullParser() throws org.xmlpull.v1.XmlPullParserException;
method public org.xmlpull.v1.XmlSerializer newSerializer() throws org.xmlpull.v1.XmlPullParserException;
- method public void setFeature(java.lang.String, boolean) throws org.xmlpull.v1.XmlPullParserException;
+ method public void setFeature(String, boolean) throws org.xmlpull.v1.XmlPullParserException;
method public void setNamespaceAware(boolean);
method public void setValidating(boolean);
- field public static final java.lang.String PROPERTY_NAME = "org.xmlpull.v1.XmlPullParserFactory";
- field protected java.lang.String classNamesLocation;
- field protected java.util.HashMap<java.lang.String, java.lang.Boolean> features;
+ field public static final String PROPERTY_NAME = "org.xmlpull.v1.XmlPullParserFactory";
+ field protected String classNamesLocation;
+ field protected java.util.HashMap<java.lang.String,java.lang.Boolean> features;
field protected java.util.ArrayList parserClasses;
field protected java.util.ArrayList serializerClasses;
}
- public abstract interface XmlSerializer {
- method public abstract org.xmlpull.v1.XmlSerializer attribute(java.lang.String, java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void cdsect(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void comment(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void docdecl(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void endDocument() throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract org.xmlpull.v1.XmlSerializer endTag(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void entityRef(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void flush() throws java.io.IOException;
- method public abstract int getDepth();
- method public abstract boolean getFeature(java.lang.String);
- method public abstract java.lang.String getName();
- method public abstract java.lang.String getNamespace();
- method public abstract java.lang.String getPrefix(java.lang.String, boolean) throws java.lang.IllegalArgumentException;
- method public abstract java.lang.Object getProperty(java.lang.String);
- method public abstract void ignorableWhitespace(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void processingInstruction(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void setFeature(java.lang.String, boolean) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void setOutput(java.io.OutputStream, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void setOutput(java.io.Writer) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void setPrefix(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void setProperty(java.lang.String, java.lang.Object) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract void startDocument(java.lang.String, java.lang.Boolean) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract org.xmlpull.v1.XmlSerializer startTag(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract org.xmlpull.v1.XmlSerializer text(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public abstract org.xmlpull.v1.XmlSerializer text(char[], int, int) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ public interface XmlSerializer {
+ method public org.xmlpull.v1.XmlSerializer attribute(String, String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void cdsect(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void comment(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void docdecl(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void endDocument() throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public org.xmlpull.v1.XmlSerializer endTag(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void entityRef(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void flush() throws java.io.IOException;
+ method public int getDepth();
+ method public boolean getFeature(String);
+ method public String getName();
+ method public String getNamespace();
+ method public String getPrefix(String, boolean) throws java.lang.IllegalArgumentException;
+ method public Object getProperty(String);
+ method public void ignorableWhitespace(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void processingInstruction(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setFeature(String, boolean) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setOutput(java.io.OutputStream, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setOutput(java.io.Writer) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setPrefix(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setProperty(String, Object) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void startDocument(String, Boolean) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public org.xmlpull.v1.XmlSerializer startTag(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public org.xmlpull.v1.XmlSerializer text(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public org.xmlpull.v1.XmlSerializer text(char[], int, int) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
}
}
@@ -77612,44 +77746,44 @@ package org.xmlpull.v1.sax2 {
method public org.xml.sax.DTDHandler getDTDHandler();
method public org.xml.sax.EntityResolver getEntityResolver();
method public org.xml.sax.ErrorHandler getErrorHandler();
- method public boolean getFeature(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public int getIndex(java.lang.String, java.lang.String);
- method public int getIndex(java.lang.String);
+ method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public int getIndex(String, String);
+ method public int getIndex(String);
method public int getLength();
method public int getLineNumber();
- method public java.lang.String getLocalName(int);
- method public java.lang.Object getProperty(java.lang.String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public java.lang.String getPublicId();
- method public java.lang.String getQName(int);
- method public java.lang.String getSystemId();
- method public java.lang.String getType(int);
- method public java.lang.String getType(java.lang.String, java.lang.String);
- method public java.lang.String getType(java.lang.String);
- method public java.lang.String getURI(int);
- method public java.lang.String getValue(int);
- method public java.lang.String getValue(java.lang.String, java.lang.String);
- method public java.lang.String getValue(java.lang.String);
+ method public String getLocalName(int);
+ method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public String getPublicId();
+ method public String getQName(int);
+ method public String getSystemId();
+ method public String getType(int);
+ method public String getType(String, String);
+ method public String getType(String);
+ method public String getURI(int);
+ method public String getValue(int);
+ method public String getValue(String, String);
+ method public String getValue(String);
method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
- method public void parse(java.lang.String) throws java.io.IOException, org.xml.sax.SAXException;
+ method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
method public void parseSubTree(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xml.sax.SAXException;
method public void setContentHandler(org.xml.sax.ContentHandler);
method public void setDTDHandler(org.xml.sax.DTDHandler);
method public void setEntityResolver(org.xml.sax.EntityResolver);
method public void setErrorHandler(org.xml.sax.ErrorHandler);
- method public void setFeature(java.lang.String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method public void setProperty(java.lang.String, java.lang.Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
- method protected void startElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException;
- field protected static final java.lang.String APACHE_DYNAMIC_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/dynamic";
- field protected static final java.lang.String APACHE_SCHEMA_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/schema";
- field protected static final java.lang.String DECLARATION_HANDLER_PROPERTY = "http://xml.org/sax/properties/declaration-handler";
- field protected static final java.lang.String LEXICAL_HANDLER_PROPERTY = "http://xml.org/sax/properties/lexical-handler";
- field protected static final java.lang.String NAMESPACES_FEATURE = "http://xml.org/sax/features/namespaces";
- field protected static final java.lang.String NAMESPACE_PREFIXES_FEATURE = "http://xml.org/sax/features/namespace-prefixes";
- field protected static final java.lang.String VALIDATION_FEATURE = "http://xml.org/sax/features/validation";
+ method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
+ method protected void startElement(String, String, String) throws org.xml.sax.SAXException;
+ field protected static final String APACHE_DYNAMIC_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/dynamic";
+ field protected static final String APACHE_SCHEMA_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/schema";
+ field protected static final String DECLARATION_HANDLER_PROPERTY = "http://xml.org/sax/properties/declaration-handler";
+ field protected static final String LEXICAL_HANDLER_PROPERTY = "http://xml.org/sax/properties/lexical-handler";
+ field protected static final String NAMESPACES_FEATURE = "http://xml.org/sax/features/namespaces";
+ field protected static final String NAMESPACE_PREFIXES_FEATURE = "http://xml.org/sax/features/namespace-prefixes";
+ field protected static final String VALIDATION_FEATURE = "http://xml.org/sax/features/validation";
field protected org.xml.sax.ContentHandler contentHandler;
field protected org.xml.sax.ErrorHandler errorHandler;
field protected org.xmlpull.v1.XmlPullParser pp;
- field protected java.lang.String systemId;
+ field protected String systemId;
}
}
diff --git a/api/removed.txt b/api/removed.txt
index f7106d2207ec..2c567e05ca0b 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -1,31 +1,32 @@
+// Signature format: 2.0
package android.app {
public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
- method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
- method public deprecated void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ method @Deprecated public boolean enterPictureInPictureMode(@NonNull android.app.PictureInPictureArgs);
+ method @Deprecated public void setPictureInPictureArgs(@NonNull android.app.PictureInPictureArgs);
}
public class ActivityManager {
- method public static deprecated int getMaxNumPictureInPictureActions();
+ method @Deprecated public static int getMaxNumPictureInPictureActions();
}
public class KeyguardManager {
- method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ method @Deprecated public void dismissKeyguard(@NonNull android.app.Activity, @Nullable android.app.KeyguardManager.KeyguardDismissCallback, @Nullable android.os.Handler);
}
public class Notification implements android.os.Parcelable {
- method public deprecated java.lang.String getChannel();
- method public static java.lang.Class<? extends android.app.Notification.Style> getNotificationStyleClass(java.lang.String);
- method public deprecated long getTimeout();
- method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
+ method @Deprecated public String getChannel();
+ method public static Class<? extends android.app.Notification.Style> getNotificationStyleClass(String);
+ method @Deprecated public long getTimeout();
+ method @Deprecated public void setLatestEventInfo(android.content.Context, CharSequence, CharSequence, android.app.PendingIntent);
}
public static class Notification.Builder {
- method public deprecated android.app.Notification.Builder setChannel(java.lang.String);
- method public deprecated android.app.Notification.Builder setTimeout(long);
+ method @Deprecated public android.app.Notification.Builder setChannel(String);
+ method @Deprecated public android.app.Notification.Builder setTimeout(long);
}
- public final deprecated class PictureInPictureArgs implements android.os.Parcelable {
+ @Deprecated public final class PictureInPictureArgs implements android.os.Parcelable {
method public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
method public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
method public int describeContents();
@@ -48,8 +49,8 @@ package android.app {
package android.app.admin {
public class DevicePolicyManager {
- method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
- method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
+ method @Deprecated @Nullable public android.os.UserHandle createAndInitializeUser(@NonNull android.content.ComponentName, String, String, @NonNull android.content.ComponentName, android.os.Bundle);
+ method @Deprecated @Nullable public android.os.UserHandle createUser(@NonNull android.content.ComponentName, String);
}
}
@@ -57,17 +58,17 @@ package android.app.admin {
package android.app.job {
public class JobInfo implements android.os.Parcelable {
- method public deprecated long getEstimatedNetworkBytes();
+ method @Deprecated public long getEstimatedNetworkBytes();
}
public static final class JobInfo.Builder {
- method public deprecated android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long);
- method public deprecated android.app.job.JobInfo.Builder setIsPrefetch(boolean);
+ method @Deprecated public android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long);
+ method @Deprecated public android.app.job.JobInfo.Builder setIsPrefetch(boolean);
}
public final class JobWorkItem implements android.os.Parcelable {
- ctor public deprecated JobWorkItem(android.content.Intent, long);
- method public deprecated long getEstimatedNetworkBytes();
+ ctor @Deprecated public JobWorkItem(android.content.Intent, long);
+ method @Deprecated public long getEstimatedNetworkBytes();
}
}
@@ -75,29 +76,29 @@ package android.app.job {
package android.app.slice {
public final class Slice implements android.os.Parcelable {
- field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
- field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
+ field @Deprecated public static final String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
+ field @Deprecated public static final String SUBTYPE_SLIDER = "slider";
}
public static class Slice.Builder {
- ctor public deprecated Slice.Builder(android.net.Uri);
- method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
- method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
+ ctor @Deprecated public Slice.Builder(@NonNull android.net.Uri);
+ method @Deprecated public android.app.slice.Slice.Builder addTimestamp(long, @Nullable String, java.util.List<java.lang.String>);
+ method @Deprecated public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
}
public final class SliceItem implements android.os.Parcelable {
- method public deprecated long getTimestamp();
- field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
+ method @Deprecated public long getTimestamp();
+ field @Deprecated public static final String FORMAT_TIMESTAMP = "long";
}
public class SliceManager {
- method public deprecated android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
- method public deprecated android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
- method public deprecated void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.net.Uri, @NonNull java.util.List<android.app.slice.SliceSpec>);
+ method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.content.Intent, @NonNull java.util.List<android.app.slice.SliceSpec>);
+ method @Deprecated public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.List<android.app.slice.SliceSpec>);
}
public abstract class SliceProvider extends android.content.ContentProvider {
- method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ method @Deprecated public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
}
}
@@ -105,17 +106,17 @@ package android.app.slice {
package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
- method public deprecated long getCodeBytes();
+ method @Deprecated public long getCodeBytes();
}
public class StorageStatsManager {
- method public deprecated long getFreeBytes(java.lang.String) throws java.io.IOException;
- method public deprecated long getTotalBytes(java.lang.String) throws java.io.IOException;
- method public deprecated boolean isQuotaSupported(java.lang.String);
- method public deprecated android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle) throws java.io.IOException;
- method public deprecated android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
- method public deprecated android.app.usage.StorageStats queryStatsForUid(java.lang.String, int) throws java.io.IOException;
- method public deprecated android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle) throws java.io.IOException;
+ method @Deprecated public long getFreeBytes(String) throws java.io.IOException;
+ method @Deprecated public long getTotalBytes(String) throws java.io.IOException;
+ method @Deprecated public boolean isQuotaSupported(String);
+ method @Deprecated public android.app.usage.ExternalStorageStats queryExternalStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
+ method @Deprecated public android.app.usage.StorageStats queryStatsForPackage(String, String, android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.app.usage.StorageStats queryStatsForUid(String, int) throws java.io.IOException;
+ method @Deprecated public android.app.usage.StorageStats queryStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
}
}
@@ -123,21 +124,21 @@ package android.app.usage {
package android.content {
public class ClipData implements android.os.Parcelable {
- method public deprecated void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ method @Deprecated public void addItem(android.content.ClipData.Item, android.content.ContentResolver);
}
public abstract class Context {
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
+ method public abstract java.io.File getSharedPreferencesPath(String);
}
public class ContextWrapper extends android.content.Context {
method public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- method public java.io.File getSharedPreferencesPath(java.lang.String);
+ method public java.io.File getSharedPreferencesPath(String);
}
public class Intent implements java.lang.Cloneable android.os.Parcelable {
- field public static final deprecated java.lang.String EXTRA_QUICK_VIEW_ADVANCED = "android.intent.extra.QUICK_VIEW_ADVANCED";
+ field @Deprecated public static final String EXTRA_QUICK_VIEW_ADVANCED = "android.intent.extra.QUICK_VIEW_ADVANCED";
}
}
@@ -145,11 +146,11 @@ package android.content {
package android.content.pm {
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- field public deprecated java.lang.String volumeUuid;
+ field @Deprecated public String volumeUuid;
}
public class ComponentInfo extends android.content.pm.PackageItemInfo {
- field public deprecated boolean encryptionAware;
+ field @Deprecated public boolean encryptionAware;
}
public class PackageInfo implements android.os.Parcelable {
@@ -157,11 +158,11 @@ package android.content.pm {
}
public abstract class PackageManager {
- method public abstract boolean setInstantAppCookie(byte[]);
+ method public abstract boolean setInstantAppCookie(@Nullable byte[]);
}
public class ResolveInfo implements android.os.Parcelable {
- field public deprecated boolean instantAppAvailable;
+ field @Deprecated public boolean instantAppAvailable;
}
public final class SharedLibraryInfo implements android.os.Parcelable {
@@ -175,76 +176,74 @@ package android.content.pm {
package android.database {
public abstract class AbstractCursor implements android.database.CrossProcessCursor {
- field protected java.lang.Long mCurrentRowID;
+ field protected Long mCurrentRowID;
field protected int mRowIdColumnIndex;
- field protected java.util.HashMap<java.lang.Long, java.util.Map<java.lang.String, java.lang.Object>> mUpdatedRows;
+ field protected java.util.HashMap<java.lang.Long,java.util.Map<java.lang.String,java.lang.Object>> mUpdatedRows;
}
}
package android.graphics {
- public deprecated class AvoidXfermode extends android.graphics.Xfermode {
+ @Deprecated public class AvoidXfermode extends android.graphics.Xfermode {
ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode);
}
- public static final class AvoidXfermode.Mode extends java.lang.Enum {
- method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String);
- method public static final android.graphics.AvoidXfermode.Mode[] values();
+ public enum AvoidXfermode.Mode {
enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID;
enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET;
}
public class Canvas {
- method public deprecated boolean clipRegion(android.graphics.Region, android.graphics.Region.Op);
- method public deprecated boolean clipRegion(android.graphics.Region);
- method public deprecated int save(int);
- field public static final deprecated int CLIP_SAVE_FLAG = 2; // 0x2
- field public static final deprecated int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
- field public static final deprecated int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
- field public static final deprecated int HAS_ALPHA_LAYER_SAVE_FLAG = 4; // 0x4
- field public static final deprecated int MATRIX_SAVE_FLAG = 1; // 0x1
+ method @Deprecated public boolean clipRegion(@NonNull android.graphics.Region, @NonNull android.graphics.Region.Op);
+ method @Deprecated public boolean clipRegion(@NonNull android.graphics.Region);
+ method @Deprecated public int save(int);
+ field @Deprecated public static final int CLIP_SAVE_FLAG = 2; // 0x2
+ field @Deprecated public static final int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
+ field @Deprecated public static final int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
+ field @Deprecated public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 4; // 0x4
+ field @Deprecated public static final int MATRIX_SAVE_FLAG = 1; // 0x1
}
public final class ImageDecoder implements java.lang.AutoCloseable {
- method public deprecated boolean getAsAlphaMask();
- method public deprecated boolean getConserveMemory();
- method public deprecated boolean getDecodeAsAlphaMask();
- method public deprecated boolean getMutable();
- method public deprecated boolean getRequireUnpremultiplied();
- method public deprecated android.graphics.ImageDecoder setAsAlphaMask(boolean);
- method public deprecated void setConserveMemory(boolean);
- method public deprecated android.graphics.ImageDecoder setDecodeAsAlphaMask(boolean);
- method public deprecated android.graphics.ImageDecoder setMutable(boolean);
- method public deprecated android.graphics.ImageDecoder setRequireUnpremultiplied(boolean);
- method public deprecated android.graphics.ImageDecoder setResize(int, int);
- method public deprecated android.graphics.ImageDecoder setResize(int);
- field public static final deprecated int ERROR_SOURCE_ERROR = 3; // 0x3
- field public static final deprecated int ERROR_SOURCE_EXCEPTION = 1; // 0x1
- field public static final deprecated int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
- }
-
- public static deprecated class ImageDecoder.IncompleteException extends java.io.IOException {
+ method @Deprecated public boolean getAsAlphaMask();
+ method @Deprecated public boolean getConserveMemory();
+ method @Deprecated public boolean getDecodeAsAlphaMask();
+ method @Deprecated public boolean getMutable();
+ method @Deprecated public boolean getRequireUnpremultiplied();
+ method @Deprecated public android.graphics.ImageDecoder setAsAlphaMask(boolean);
+ method @Deprecated public void setConserveMemory(boolean);
+ method @Deprecated public android.graphics.ImageDecoder setDecodeAsAlphaMask(boolean);
+ method @Deprecated public android.graphics.ImageDecoder setMutable(boolean);
+ method @Deprecated public android.graphics.ImageDecoder setRequireUnpremultiplied(boolean);
+ method @Deprecated public android.graphics.ImageDecoder setResize(int, int);
+ method @Deprecated public android.graphics.ImageDecoder setResize(int);
+ field @Deprecated public static final int ERROR_SOURCE_ERROR = 3; // 0x3
+ field @Deprecated public static final int ERROR_SOURCE_EXCEPTION = 1; // 0x1
+ field @Deprecated public static final int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
+ }
+
+ @Deprecated public static class ImageDecoder.IncompleteException extends java.io.IOException {
ctor public ImageDecoder.IncompleteException();
}
- public deprecated class LayerRasterizer extends android.graphics.Rasterizer {
+ @Deprecated public class LayerRasterizer extends android.graphics.Rasterizer {
ctor public LayerRasterizer();
method public void addLayer(android.graphics.Paint, float, float);
method public void addLayer(android.graphics.Paint);
}
public class Paint {
- method public deprecated android.graphics.Rasterizer getRasterizer();
- method public deprecated android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
+ method @Deprecated public android.graphics.Rasterizer getRasterizer();
+ method @Deprecated public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
}
public class Picture {
- method public static deprecated android.graphics.Picture createFromStream(java.io.InputStream);
- method public deprecated void writeToStream(java.io.OutputStream);
+ method @Deprecated public static android.graphics.Picture createFromStream(java.io.InputStream);
+ method @Deprecated public void writeToStream(java.io.OutputStream);
}
- public deprecated class PixelXorXfermode extends android.graphics.Xfermode {
+ @Deprecated public class PixelXorXfermode extends android.graphics.Xfermode {
ctor public PixelXorXfermode(int);
}
@@ -257,9 +256,9 @@ package android.graphics {
package android.graphics.drawable {
public class AnimatedImageDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
- method public deprecated int getLoopCount(int);
- method public deprecated void setLoopCount(int);
- field public static final deprecated int LOOP_INFINITE = -1; // 0xffffffff
+ method @Deprecated public int getLoopCount(int);
+ method @Deprecated public void setLoopCount(int);
+ field @Deprecated public static final int LOOP_INFINITE = -1; // 0xffffffff
}
}
@@ -267,16 +266,16 @@ package android.graphics.drawable {
package android.hardware {
public final class HardwareBuffer implements java.lang.AutoCloseable android.os.Parcelable {
- method public deprecated void destroy();
- method public deprecated boolean isDestroyed();
+ method @Deprecated public void destroy();
+ method @Deprecated public boolean isDestroyed();
}
public final class SensorDirectChannel implements java.nio.channels.Channel {
- method public deprecated boolean isValid();
+ method @Deprecated public boolean isValid();
}
public abstract class SensorManager {
- method public deprecated int configureDirectChannel(android.hardware.SensorDirectChannel, android.hardware.Sensor, int);
+ method @Deprecated public int configureDirectChannel(android.hardware.SensorDirectChannel, android.hardware.Sensor, int);
}
}
@@ -284,9 +283,9 @@ package android.hardware {
package android.location {
public class Location implements android.os.Parcelable {
- method public deprecated void removeBearingAccuracy();
- method public deprecated void removeSpeedAccuracy();
- method public deprecated void removeVerticalAccuracy();
+ method @Deprecated public void removeBearingAccuracy();
+ method @Deprecated public void removeSpeedAccuracy();
+ method @Deprecated public void removeVerticalAccuracy();
}
}
@@ -310,28 +309,28 @@ package android.media.tv {
package android.net {
public class ConnectivityManager {
- method public deprecated boolean requestRouteToHost(int, int);
- method public deprecated int startUsingNetworkFeature(int, java.lang.String);
- method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
+ method @Deprecated public boolean requestRouteToHost(int, int);
+ method @Deprecated public int startUsingNetworkFeature(int, String);
+ method @Deprecated public int stopUsingNetworkFeature(int, String);
}
- public deprecated class NetworkBadging {
- method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
+ @Deprecated public class NetworkBadging {
+ method @NonNull public static android.graphics.drawable.Drawable getWifiIcon(@IntRange(from=0, to=4) int, int, @Nullable android.content.res.Resources.Theme);
field public static final int BADGING_4K = 30; // 0x1e
field public static final int BADGING_HD = 20; // 0x14
field public static final int BADGING_NONE = 0; // 0x0
field public static final int BADGING_SD = 10; // 0xa
}
- public static abstract class NetworkBadging.Badging implements java.lang.annotation.Annotation {
+ @IntDef({0x0, 0xa, 0x14, 0x1e}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NetworkBadging.Badging {
}
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
- method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
+ method @Deprecated public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
}
public class TrafficStats {
- method public static deprecated void setThreadStatsUidSelf();
+ method @Deprecated public static void setThreadStatsUidSelf();
}
}
@@ -344,7 +343,7 @@ package android.os {
public final class PowerManager {
method public void goToSleep(long);
- method public deprecated void userActivity(long, boolean);
+ method @Deprecated public void userActivity(long, boolean);
method public void wakeUp(long);
}
@@ -353,27 +352,27 @@ package android.os {
}
public static final class StrictMode.ThreadPolicy.Builder {
- method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(android.os.StrictMode.OnThreadViolationListener, java.util.concurrent.Executor);
+ method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnThreadViolationListener, @NonNull java.util.concurrent.Executor);
}
public static final class StrictMode.VmPolicy.Builder {
- method public android.os.StrictMode.VmPolicy.Builder penaltyListener(android.os.StrictMode.OnVmViolationListener, java.util.concurrent.Executor);
+ method public android.os.StrictMode.VmPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnVmViolationListener, @NonNull java.util.concurrent.Executor);
}
public final class SystemClock {
- method public static java.time.Clock elapsedRealtimeClock();
- method public static java.time.Clock uptimeClock();
- method public static deprecated java.time.Clock uptimeMillisClock();
+ method @NonNull public static java.time.Clock elapsedRealtimeClock();
+ method @NonNull public static java.time.Clock uptimeClock();
+ method @Deprecated @NonNull public static java.time.Clock uptimeMillisClock();
}
public class TestLooperManager {
- method public deprecated android.os.MessageQueue getQueue();
+ method @Deprecated public android.os.MessageQueue getQueue();
}
public class UserManager {
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
- method public java.lang.CharSequence getBadgedLabelForUser(java.lang.CharSequence, android.os.UserHandle);
+ method public CharSequence getBadgedLabelForUser(CharSequence, android.os.UserHandle);
}
}
@@ -381,8 +380,8 @@ package android.os {
package android.os.storage {
public class StorageManager {
- method public android.os.storage.StorageVolume getPrimaryVolume();
- method public android.os.storage.StorageVolume[] getVolumeList();
+ method @NonNull public android.os.storage.StorageVolume getPrimaryVolume();
+ method @NonNull public android.os.storage.StorageVolume[] getVolumeList();
}
}
@@ -390,20 +389,20 @@ package android.os.storage {
package android.provider {
public class Browser {
- method public static final void addSearchUrl(android.content.ContentResolver, java.lang.String);
- method public static final boolean canClearHistory(android.content.ContentResolver);
- method public static final void clearHistory(android.content.ContentResolver);
- method public static final void clearSearches(android.content.ContentResolver);
- method public static final void deleteFromHistory(android.content.ContentResolver, java.lang.String);
- method public static final void deleteHistoryTimeFrame(android.content.ContentResolver, long, long);
- method public static final android.database.Cursor getAllBookmarks(android.content.ContentResolver) throws java.lang.IllegalStateException;
- method public static final android.database.Cursor getAllVisitedUrls(android.content.ContentResolver) throws java.lang.IllegalStateException;
- method public static final void requestAllIcons(android.content.ContentResolver, java.lang.String, android.webkit.WebIconDatabase.IconListener);
- method public static final void saveBookmark(android.content.Context, java.lang.String, java.lang.String);
- method public static final void truncateHistory(android.content.ContentResolver);
- method public static final void updateVisitedHistory(android.content.ContentResolver, java.lang.String, boolean);
- field public static final android.net.Uri BOOKMARKS_URI;
- field public static final java.lang.String[] HISTORY_PROJECTION;
+ method @RequiresPermission(allOf={"com.android.browser.permission.READ_HISTORY_BOOKMARKS", "com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"}, apis="..22") public static final void addSearchUrl(android.content.ContentResolver, String);
+ method @RequiresPermission(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") public static final boolean canClearHistory(android.content.ContentResolver);
+ method @RequiresPermission(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final void clearHistory(android.content.ContentResolver);
+ method @RequiresPermission(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final void clearSearches(android.content.ContentResolver);
+ method @RequiresPermission(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final void deleteFromHistory(android.content.ContentResolver, String);
+ method @RequiresPermission(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final void deleteHistoryTimeFrame(android.content.ContentResolver, long, long);
+ method @RequiresPermission(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") public static final android.database.Cursor getAllBookmarks(android.content.ContentResolver) throws java.lang.IllegalStateException;
+ method @RequiresPermission(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") public static final android.database.Cursor getAllVisitedUrls(android.content.ContentResolver) throws java.lang.IllegalStateException;
+ method @RequiresPermission(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") public static final void requestAllIcons(android.content.ContentResolver, String, android.webkit.WebIconDatabase.IconListener);
+ method public static final void saveBookmark(android.content.Context, String, String);
+ method @RequiresPermission(allOf={"com.android.browser.permission.READ_HISTORY_BOOKMARKS", "com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"}, apis="..22") public static final void truncateHistory(android.content.ContentResolver);
+ method @RequiresPermission(allOf={"com.android.browser.permission.READ_HISTORY_BOOKMARKS", "com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"}, apis="..22") public static final void updateVisitedHistory(android.content.ContentResolver, String, boolean);
+ field @RequiresPermission.Read(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") @RequiresPermission.Write(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final android.net.Uri BOOKMARKS_URI;
+ field public static final String[] HISTORY_PROJECTION;
field public static final int HISTORY_PROJECTION_BOOKMARK_INDEX = 4; // 0x4
field public static final int HISTORY_PROJECTION_DATE_INDEX = 3; // 0x3
field public static final int HISTORY_PROJECTION_FAVICON_INDEX = 6; // 0x6
@@ -411,121 +410,121 @@ package android.provider {
field public static final int HISTORY_PROJECTION_TITLE_INDEX = 5; // 0x5
field public static final int HISTORY_PROJECTION_URL_INDEX = 1; // 0x1
field public static final int HISTORY_PROJECTION_VISITS_INDEX = 2; // 0x2
- field public static final java.lang.String[] SEARCHES_PROJECTION;
+ field public static final String[] SEARCHES_PROJECTION;
field public static final int SEARCHES_PROJECTION_DATE_INDEX = 2; // 0x2
field public static final int SEARCHES_PROJECTION_SEARCH_INDEX = 1; // 0x1
- field public static final android.net.Uri SEARCHES_URI;
- field public static final java.lang.String[] TRUNCATE_HISTORY_PROJECTION;
+ field @RequiresPermission.Read(value="com.android.browser.permission.READ_HISTORY_BOOKMARKS", apis="..22") @RequiresPermission.Write(value="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS", apis="..22") public static final android.net.Uri SEARCHES_URI;
+ field public static final String[] TRUNCATE_HISTORY_PROJECTION;
field public static final int TRUNCATE_HISTORY_PROJECTION_ID_INDEX = 0; // 0x0
field public static final int TRUNCATE_N_OLDEST = 5; // 0x5
}
public static class Browser.BookmarkColumns implements android.provider.BaseColumns {
ctor public Browser.BookmarkColumns();
- field public static final java.lang.String BOOKMARK = "bookmark";
- field public static final java.lang.String CREATED = "created";
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String FAVICON = "favicon";
- field public static final java.lang.String TITLE = "title";
- field public static final java.lang.String URL = "url";
- field public static final java.lang.String VISITS = "visits";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
+ field public static final String BOOKMARK = "bookmark";
+ field public static final String CREATED = "created";
+ field public static final String DATE = "date";
+ field public static final String FAVICON = "favicon";
+ field public static final String TITLE = "title";
+ field public static final String URL = "url";
+ field public static final String VISITS = "visits";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
}
public static class Browser.SearchColumns implements android.provider.BaseColumns {
ctor public Browser.SearchColumns();
- field public static final java.lang.String DATE = "date";
- field public static final java.lang.String SEARCH = "search";
- field public static final deprecated java.lang.String URL = "url";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
- }
-
- public static final deprecated class ContactsContract.Contacts.StreamItems implements android.provider.ContactsContract.StreamItemsColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "stream_items";
- }
-
- public static final deprecated class ContactsContract.RawContacts.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "stream_items";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
- }
-
- public static final deprecated class ContactsContract.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
- field public static final deprecated java.lang.String PHOTO = "photo";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
- }
-
- protected static abstract deprecated interface ContactsContract.StreamItemPhotosColumns {
- field public static final deprecated java.lang.String PHOTO_FILE_ID = "photo_file_id";
- field public static final deprecated java.lang.String PHOTO_URI = "photo_uri";
- field public static final deprecated java.lang.String SORT_INDEX = "sort_index";
- field public static final deprecated java.lang.String STREAM_ITEM_ID = "stream_item_id";
- field public static final deprecated java.lang.String SYNC1 = "stream_item_photo_sync1";
- field public static final deprecated java.lang.String SYNC2 = "stream_item_photo_sync2";
- field public static final deprecated java.lang.String SYNC3 = "stream_item_photo_sync3";
- field public static final deprecated java.lang.String SYNC4 = "stream_item_photo_sync4";
- }
-
- public static final deprecated class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item";
- field public static final deprecated android.net.Uri CONTENT_LIMIT_URI;
- field public static final deprecated android.net.Uri CONTENT_PHOTO_URI;
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item";
- field public static final deprecated android.net.Uri CONTENT_URI;
- field public static final deprecated java.lang.String MAX_ITEMS = "max_items";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
- }
-
- public static final deprecated class ContactsContract.StreamItems.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
- field public static final deprecated java.lang.String CONTENT_DIRECTORY = "photo";
- field public static final deprecated java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item_photo";
- field public static final deprecated java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item_photo";
- field public static final java.lang.String _COUNT = "_count";
- field public static final java.lang.String _ID = "_id";
- }
-
- protected static abstract deprecated interface ContactsContract.StreamItemsColumns {
- field public static final deprecated java.lang.String ACCOUNT_NAME = "account_name";
- field public static final deprecated java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final deprecated java.lang.String COMMENTS = "comments";
- field public static final deprecated java.lang.String CONTACT_ID = "contact_id";
- field public static final deprecated java.lang.String CONTACT_LOOKUP_KEY = "contact_lookup";
- field public static final deprecated java.lang.String DATA_SET = "data_set";
- field public static final deprecated java.lang.String RAW_CONTACT_ID = "raw_contact_id";
- field public static final deprecated java.lang.String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
- field public static final deprecated java.lang.String RES_ICON = "icon";
- field public static final deprecated java.lang.String RES_LABEL = "label";
- field public static final deprecated java.lang.String RES_PACKAGE = "res_package";
- field public static final deprecated java.lang.String SYNC1 = "stream_item_sync1";
- field public static final deprecated java.lang.String SYNC2 = "stream_item_sync2";
- field public static final deprecated java.lang.String SYNC3 = "stream_item_sync3";
- field public static final deprecated java.lang.String SYNC4 = "stream_item_sync4";
- field public static final deprecated java.lang.String TEXT = "text";
- field public static final deprecated java.lang.String TIMESTAMP = "timestamp";
+ field public static final String DATE = "date";
+ field public static final String SEARCH = "search";
+ field @Deprecated public static final String URL = "url";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
+ }
+
+ @Deprecated public static final class ContactsContract.Contacts.StreamItems implements android.provider.ContactsContract.StreamItemsColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "stream_items";
+ }
+
+ @Deprecated public static final class ContactsContract.RawContacts.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "stream_items";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
+ }
+
+ @Deprecated public static final class ContactsContract.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field @Deprecated public static final String PHOTO = "photo";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
+ }
+
+ @Deprecated protected static interface ContactsContract.StreamItemPhotosColumns {
+ field @Deprecated public static final String PHOTO_FILE_ID = "photo_file_id";
+ field @Deprecated public static final String PHOTO_URI = "photo_uri";
+ field @Deprecated public static final String SORT_INDEX = "sort_index";
+ field @Deprecated public static final String STREAM_ITEM_ID = "stream_item_id";
+ field @Deprecated public static final String SYNC1 = "stream_item_photo_sync1";
+ field @Deprecated public static final String SYNC2 = "stream_item_photo_sync2";
+ field @Deprecated public static final String SYNC3 = "stream_item_photo_sync3";
+ field @Deprecated public static final String SYNC4 = "stream_item_photo_sync4";
+ }
+
+ @Deprecated public static final class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item";
+ field @Deprecated public static final android.net.Uri CONTENT_LIMIT_URI;
+ field @Deprecated public static final android.net.Uri CONTENT_PHOTO_URI;
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item";
+ field @Deprecated public static final android.net.Uri CONTENT_URI;
+ field @Deprecated public static final String MAX_ITEMS = "max_items";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
+ }
+
+ @Deprecated public static final class ContactsContract.StreamItems.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field @Deprecated public static final String CONTENT_DIRECTORY = "photo";
+ field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item_photo";
+ field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item_photo";
+ field public static final String _COUNT = "_count";
+ field public static final String _ID = "_id";
+ }
+
+ @Deprecated protected static interface ContactsContract.StreamItemsColumns {
+ field @Deprecated public static final String ACCOUNT_NAME = "account_name";
+ field @Deprecated public static final String ACCOUNT_TYPE = "account_type";
+ field @Deprecated public static final String COMMENTS = "comments";
+ field @Deprecated public static final String CONTACT_ID = "contact_id";
+ field @Deprecated public static final String CONTACT_LOOKUP_KEY = "contact_lookup";
+ field @Deprecated public static final String DATA_SET = "data_set";
+ field @Deprecated public static final String RAW_CONTACT_ID = "raw_contact_id";
+ field @Deprecated public static final String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
+ field @Deprecated public static final String RES_ICON = "icon";
+ field @Deprecated public static final String RES_LABEL = "label";
+ field @Deprecated public static final String RES_PACKAGE = "res_package";
+ field @Deprecated public static final String SYNC1 = "stream_item_sync1";
+ field @Deprecated public static final String SYNC2 = "stream_item_sync2";
+ field @Deprecated public static final String SYNC3 = "stream_item_sync3";
+ field @Deprecated public static final String SYNC4 = "stream_item_sync4";
+ field @Deprecated public static final String TEXT = "text";
+ field @Deprecated public static final String TIMESTAMP = "timestamp";
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
- field public static final deprecated java.lang.String CONTACT_METADATA_SYNC = "contact_metadata_sync";
+ field @Deprecated public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
public static final class Settings.System extends android.provider.Settings.NameValueTable {
- field public static final java.lang.String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
- field public static final java.lang.String VOLUME_ALARM = "volume_alarm";
- field public static final java.lang.String VOLUME_BLUETOOTH_SCO = "volume_bluetooth_sco";
- field public static final java.lang.String VOLUME_MUSIC = "volume_music";
- field public static final java.lang.String VOLUME_NOTIFICATION = "volume_notification";
- field public static final java.lang.String VOLUME_RING = "volume_ring";
- field public static final java.lang.String[] VOLUME_SETTINGS;
- field public static final java.lang.String VOLUME_SYSTEM = "volume_system";
- field public static final java.lang.String VOLUME_VOICE = "volume_voice";
+ field public static final String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
+ field public static final String VOLUME_ALARM = "volume_alarm";
+ field public static final String VOLUME_BLUETOOTH_SCO = "volume_bluetooth_sco";
+ field public static final String VOLUME_MUSIC = "volume_music";
+ field public static final String VOLUME_NOTIFICATION = "volume_notification";
+ field public static final String VOLUME_RING = "volume_ring";
+ field public static final String[] VOLUME_SETTINGS;
+ field public static final String VOLUME_SYSTEM = "volume_system";
+ field public static final String VOLUME_VOICE = "volume_voice";
}
public static final class Telephony.Sms.Intents {
- field public static final java.lang.String SMS_EMERGENCY_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED";
+ field public static final String SMS_EMERGENCY_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED";
}
}
@@ -533,7 +532,7 @@ package android.provider {
package android.speech.tts {
public abstract class UtteranceProgressListener {
- method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
+ method @Deprecated public void onUtteranceRangeStart(String, int, int);
}
}
@@ -541,12 +540,12 @@ package android.speech.tts {
package android.telephony {
public class NetworkScan {
- method public deprecated void stop() throws android.os.RemoteException;
+ method @Deprecated public void stop() throws android.os.RemoteException;
}
public class TelephonyManager {
- method public deprecated java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo();
- method public deprecated android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
}
}
@@ -554,19 +553,19 @@ package android.telephony {
package android.text.format {
public class DateFormat {
- field public static final deprecated char AM_PM = 97; // 0x0061 'a'
- field public static final deprecated char CAPITAL_AM_PM = 65; // 0x0041 'A'
- field public static final deprecated char DATE = 100; // 0x0064 'd'
- field public static final deprecated char DAY = 69; // 0x0045 'E'
- field public static final deprecated char HOUR = 104; // 0x0068 'h'
- field public static final deprecated char HOUR_OF_DAY = 107; // 0x006b 'k'
- field public static final deprecated char MINUTE = 109; // 0x006d 'm'
- field public static final deprecated char MONTH = 77; // 0x004d 'M'
- field public static final deprecated char QUOTE = 39; // 0x0027 '\''
- field public static final deprecated char SECONDS = 115; // 0x0073 's'
- field public static final deprecated char STANDALONE_MONTH = 76; // 0x004c 'L'
- field public static final deprecated char TIME_ZONE = 122; // 0x007a 'z'
- field public static final deprecated char YEAR = 121; // 0x0079 'y'
+ field @Deprecated public static final char AM_PM = 97; // 0x0061 'a'
+ field @Deprecated public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
+ field @Deprecated public static final char DATE = 100; // 0x0064 'd'
+ field @Deprecated public static final char DAY = 69; // 0x0045 'E'
+ field @Deprecated public static final char HOUR = 104; // 0x0068 'h'
+ field @Deprecated public static final char HOUR_OF_DAY = 107; // 0x006b 'k'
+ field @Deprecated public static final char MINUTE = 109; // 0x006d 'm'
+ field @Deprecated public static final char MONTH = 77; // 0x004d 'M'
+ field @Deprecated public static final char QUOTE = 39; // 0x0027 '\''
+ field @Deprecated public static final char SECONDS = 115; // 0x0073 's'
+ field @Deprecated public static final char STANDALONE_MONTH = 76; // 0x004c 'L'
+ field @Deprecated public static final char TIME_ZONE = 122; // 0x007a 'z'
+ field @Deprecated public static final char YEAR = 121; // 0x0079 'y'
}
}
@@ -583,7 +582,7 @@ package android.text.style {
package android.util {
- public deprecated class FloatMath {
+ @Deprecated public class FloatMath {
method public static float ceil(float);
method public static float cos(float);
method public static float exp(float);
@@ -598,7 +597,7 @@ package android.util {
package android.view {
- public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
+ @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
method protected void initializeFadingEdge(android.content.res.TypedArray);
method protected void initializeScrollbars(android.content.res.TypedArray);
}
@@ -623,12 +622,12 @@ package android.webkit {
package android.widget {
- public class ListView extends android.widget.AbsListView {
- method protected <T extends android.view.View> T findViewTraversal(int);
- method protected <T extends android.view.View> T findViewWithTagTraversal(java.lang.Object);
+ @android.widget.RemoteViews.RemoteView public class ListView extends android.widget.AbsListView {
+ method protected <T extends android.view.View> T findViewTraversal(@IdRes int);
+ method protected <T extends android.view.View> T findViewWithTagTraversal(Object);
}
- public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
+ @android.widget.RemoteViews.RemoteView public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
method public static int getTextColor(android.content.Context, android.content.res.TypedArray, int);
method public static android.content.res.ColorStateList getTextColors(android.content.Context, android.content.res.TypedArray);
}
diff --git a/api/system-current.txt b/api/system-current.txt
index d87fe1dec4e9..af3b97781e6e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1,202 +1,210 @@
+// Signature format: 2.0
package android {
public static final class Manifest.permission {
- field public static final java.lang.String ACCESS_AMBIENT_LIGHT_STATS = "android.permission.ACCESS_AMBIENT_LIGHT_STATS";
- field public static final java.lang.String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
- field public static final java.lang.String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
- field public static final java.lang.String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
- field public static final deprecated java.lang.String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
- field public static final java.lang.String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS";
- field public static final java.lang.String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
- field public static final java.lang.String ACCESS_MTP = "android.permission.ACCESS_MTP";
- field public static final java.lang.String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS";
- field public static final java.lang.String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
- field public static final java.lang.String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS";
- field public static final java.lang.String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
- field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
- field public static final java.lang.String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
- field public static final java.lang.String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
- field public static final java.lang.String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER";
- field public static final java.lang.String BACKUP = "android.permission.BACKUP";
- field public static final java.lang.String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE";
- field public static final deprecated java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE";
- field public static final java.lang.String BIND_CONTENT_CAPTURE_SERVICE = "android.permission.BIND_CONTENT_CAPTURE_SERVICE";
- field public static final java.lang.String BIND_DIRECTORY_SEARCH = "android.permission.BIND_DIRECTORY_SEARCH";
- field public static final java.lang.String BIND_EUICC_SERVICE = "android.permission.BIND_EUICC_SERVICE";
- field public static final java.lang.String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE";
- field public static final java.lang.String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET";
- field public static final java.lang.String BIND_NETWORK_RECOMMENDATION_SERVICE = "android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE";
- field public static final java.lang.String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
- field public static final java.lang.String BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE = "android.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE";
- field public static final java.lang.String BIND_PRINT_RECOMMENDATION_SERVICE = "android.permission.BIND_PRINT_RECOMMENDATION_SERVICE";
- field public static final java.lang.String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
- field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE";
- field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE";
- field public static final java.lang.String BIND_SOUND_TRIGGER_DETECTION_SERVICE = "android.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE";
- field public static final java.lang.String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
- field public static final java.lang.String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE";
- field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE";
- field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
- field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
- field public static final java.lang.String BRICK = "android.permission.BRICK";
- field public static final java.lang.String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
- field public static final deprecated java.lang.String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
- field public static final java.lang.String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
- field public static final java.lang.String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
- field public static final java.lang.String CAPTURE_TV_INPUT = "android.permission.CAPTURE_TV_INPUT";
- field public static final java.lang.String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
- field public static final java.lang.String CHANGE_DEVICE_IDLE_TEMP_WHITELIST = "android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST";
- field public static final java.lang.String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
- field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
- field public static final java.lang.String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
- field public static final java.lang.String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
- field public static final java.lang.String CONTROL_DISPLAY_COLOR_TRANSFORMS = "android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS";
- field public static final java.lang.String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION";
- field public static final java.lang.String CONTROL_INCALL_EXPERIENCE = "android.permission.CONTROL_INCALL_EXPERIENCE";
- field public static final java.lang.String CONTROL_KEYGUARD_SECURE_NOTIFICATIONS = "android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS";
- field public static final java.lang.String CONTROL_VPN = "android.permission.CONTROL_VPN";
- field public static final java.lang.String CRYPT_KEEPER = "android.permission.CRYPT_KEEPER";
- field public static final java.lang.String DEVICE_POWER = "android.permission.DEVICE_POWER";
- field public static final java.lang.String DISPATCH_PROVISIONING_MESSAGE = "android.permission.DISPATCH_PROVISIONING_MESSAGE";
- field public static final java.lang.String FORCE_BACK = "android.permission.FORCE_BACK";
- field public static final java.lang.String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
- field public static final java.lang.String GET_APP_OPS_STATS = "android.permission.GET_APP_OPS_STATS";
- field public static final java.lang.String GET_PROCESS_STATE_AND_OOM_SCORE = "android.permission.GET_PROCESS_STATE_AND_OOM_SCORE";
- field public static final java.lang.String GET_RUNTIME_PERMISSIONS = "android.permission.GET_RUNTIME_PERMISSIONS";
- field public static final java.lang.String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
- field public static final java.lang.String GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS = "android.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS";
- field public static final java.lang.String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
- field public static final java.lang.String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
- field public static final java.lang.String HDMI_CEC = "android.permission.HDMI_CEC";
- field public static final java.lang.String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
- field public static final java.lang.String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
- field public static final java.lang.String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
- field public static final java.lang.String INSTALL_PACKAGE_UPDATES = "android.permission.INSTALL_PACKAGE_UPDATES";
- field public static final java.lang.String INSTALL_SELF_UPDATES = "android.permission.INSTALL_SELF_UPDATES";
- field public static final java.lang.String INTENT_FILTER_VERIFICATION_AGENT = "android.permission.INTENT_FILTER_VERIFICATION_AGENT";
- field public static final java.lang.String INTERACT_ACROSS_PROFILES = "android.permission.INTERACT_ACROSS_PROFILES";
- field public static final java.lang.String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS";
- field public static final java.lang.String INTERACT_ACROSS_USERS_FULL = "android.permission.INTERACT_ACROSS_USERS_FULL";
- field public static final java.lang.String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW";
- field public static final java.lang.String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
- field public static final java.lang.String KILL_UID = "android.permission.KILL_UID";
- field public static final java.lang.String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS";
- field public static final java.lang.String LOCK_DEVICE = "android.permission.LOCK_DEVICE";
- field public static final java.lang.String LOOP_RADIO = "android.permission.LOOP_RADIO";
- field public static final java.lang.String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY";
- field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
- field public static final java.lang.String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS";
- field public static final java.lang.String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS";
- field public static final java.lang.String MANAGE_AUTO_FILL = "android.permission.MANAGE_AUTO_FILL";
- field public static final java.lang.String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
- field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
- field public static final java.lang.String MANAGE_CONTENT_CAPTURE = "android.permission.MANAGE_CONTENT_CAPTURE";
- field public static final java.lang.String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
- field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
- field public static final java.lang.String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
- field public static final java.lang.String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
- field public static final java.lang.String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
- field public static final java.lang.String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY";
- field public static final java.lang.String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
- field public static final java.lang.String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
- field public static final java.lang.String MANAGE_USB = "android.permission.MANAGE_USB";
- field public static final java.lang.String MANAGE_USERS = "android.permission.MANAGE_USERS";
- field public static final java.lang.String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE";
- field public static final java.lang.String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS";
- field public static final java.lang.String MODIFY_AUDIO_ROUTING = "android.permission.MODIFY_AUDIO_ROUTING";
- field public static final java.lang.String MODIFY_CELL_BROADCASTS = "android.permission.MODIFY_CELL_BROADCASTS";
- field public static final java.lang.String MODIFY_DAY_NIGHT_MODE = "android.permission.MODIFY_DAY_NIGHT_MODE";
- field public static final deprecated java.lang.String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING";
- field public static final java.lang.String MODIFY_PARENTAL_CONTROLS = "android.permission.MODIFY_PARENTAL_CONTROLS";
- field public static final java.lang.String MODIFY_QUIET_MODE = "android.permission.MODIFY_QUIET_MODE";
- field public static final java.lang.String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
- field public static final java.lang.String NETWORK_MANAGED_PROVISIONING = "android.permission.NETWORK_MANAGED_PROVISIONING";
- field public static final java.lang.String NETWORK_SETUP_WIZARD = "android.permission.NETWORK_SETUP_WIZARD";
- field public static final java.lang.String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
- field public static final java.lang.String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
- field public static final java.lang.String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
- field public static final java.lang.String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
- field public static final java.lang.String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
- field public static final java.lang.String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
- field public static final java.lang.String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS";
- field public static final java.lang.String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING";
- field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION";
- field public static final java.lang.String POWER_SAVER = "android.permission.POWER_SAVER";
- field public static final java.lang.String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
- field public static final java.lang.String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT";
- field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES";
- field public static final java.lang.String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
- field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
- field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
- field public static final java.lang.String READ_INSTALL_SESSIONS = "android.permission.READ_INSTALL_SESSIONS";
- field public static final java.lang.String READ_NETWORK_USAGE_HISTORY = "android.permission.READ_NETWORK_USAGE_HISTORY";
- field public static final java.lang.String READ_OEM_UNLOCK_STATE = "android.permission.READ_OEM_UNLOCK_STATE";
- field public static final java.lang.String READ_PRINT_SERVICES = "android.permission.READ_PRINT_SERVICES";
- field public static final java.lang.String READ_PRINT_SERVICE_RECOMMENDATIONS = "android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS";
- field public static final java.lang.String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
- field public static final java.lang.String READ_RUNTIME_PROFILES = "android.permission.READ_RUNTIME_PROFILES";
- field public static final java.lang.String READ_SEARCH_INDEXABLES = "android.permission.READ_SEARCH_INDEXABLES";
- field public static final java.lang.String READ_SYSTEM_UPDATE_INFO = "android.permission.READ_SYSTEM_UPDATE_INFO";
- field public static final java.lang.String READ_WALLPAPER_INTERNAL = "android.permission.READ_WALLPAPER_INTERNAL";
- field public static final java.lang.String READ_WIFI_CREDENTIAL = "android.permission.READ_WIFI_CREDENTIAL";
- field public static final java.lang.String REAL_GET_TASKS = "android.permission.REAL_GET_TASKS";
- field public static final java.lang.String RECEIVE_DATA_ACTIVITY_CHANGE = "android.permission.RECEIVE_DATA_ACTIVITY_CHANGE";
- field public static final java.lang.String RECEIVE_DEVICE_CUSTOMIZATION_READY = "android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY";
- field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
- field public static final java.lang.String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE";
- field public static final java.lang.String RECOVERY = "android.permission.RECOVERY";
- field public static final java.lang.String RECOVER_KEYSTORE = "android.permission.RECOVER_KEYSTORE";
- field public static final java.lang.String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER";
- field public static final java.lang.String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER";
- field public static final java.lang.String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
- field public static final java.lang.String REMOVE_DRM_CERTIFICATES = "android.permission.REMOVE_DRM_CERTIFICATES";
- field public static final java.lang.String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
- field public static final java.lang.String RESET_PASSWORD = "android.permission.RESET_PASSWORD";
- field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
- field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
- field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
- field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
- field public static final java.lang.String SEND_DEVICE_CUSTOMIZATION_READY = "android.permission.SEND_DEVICE_CUSTOMIZATION_READY";
- field public static final java.lang.String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS";
- field public static final java.lang.String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION";
- field public static final java.lang.String SERIAL_PORT = "android.permission.SERIAL_PORT";
- field public static final java.lang.String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
- field public static final java.lang.String SET_HARMFUL_APP_WARNINGS = "android.permission.SET_HARMFUL_APP_WARNINGS";
- field public static final java.lang.String SET_MEDIA_KEY_LISTENER = "android.permission.SET_MEDIA_KEY_LISTENER";
- field public static final java.lang.String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
- field public static final java.lang.String SET_POINTER_SPEED = "android.permission.SET_POINTER_SPEED";
- field public static final java.lang.String SET_SCREEN_COMPATIBILITY = "android.permission.SET_SCREEN_COMPATIBILITY";
- field public static final java.lang.String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER";
- field public static final java.lang.String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT";
- field public static final java.lang.String SHOW_KEYGUARD_MESSAGE = "android.permission.SHOW_KEYGUARD_MESSAGE";
- field public static final java.lang.String SHUTDOWN = "android.permission.SHUTDOWN";
- field public static final java.lang.String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES";
- field public static final java.lang.String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME";
- field public static final java.lang.String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
- field public static final java.lang.String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
- field public static final java.lang.String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
- field public static final java.lang.String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER";
- field public static final java.lang.String UNLIMITED_SHORTCUTS_API_CALLS = "android.permission.UNLIMITED_SHORTCUTS_API_CALLS";
- field public static final java.lang.String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS";
- field public static final java.lang.String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
- field public static final java.lang.String UPDATE_TIME_ZONE_RULES = "android.permission.UPDATE_TIME_ZONE_RULES";
- field public static final java.lang.String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
- field public static final java.lang.String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
- field public static final java.lang.String WRITE_DREAM_STATE = "android.permission.WRITE_DREAM_STATE";
- field public static final java.lang.String WRITE_EMBEDDED_SUBSCRIPTIONS = "android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS";
- field public static final java.lang.String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE";
- field public static final java.lang.String WRITE_OBB = "android.permission.WRITE_OBB";
+ field public static final String ACCESS_AMBIENT_LIGHT_STATS = "android.permission.ACCESS_AMBIENT_LIGHT_STATS";
+ field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
+ field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
+ field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
+ field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
+ field public static final String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS";
+ field public static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
+ field public static final String ACCESS_MTP = "android.permission.ACCESS_MTP";
+ field public static final String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS";
+ field public static final String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
+ field public static final String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS";
+ field public static final String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
+ field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
+ field public static final String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
+ field public static final String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
+ field public static final String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER";
+ field public static final String BACKUP = "android.permission.BACKUP";
+ field public static final String BIND_ATTENTION_SERVICE = "android.permission.BIND_ATTENTION_SERVICE";
+ field public static final String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE";
+ field @Deprecated public static final String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE";
+ field public static final String BIND_CONTENT_CAPTURE_SERVICE = "android.permission.BIND_CONTENT_CAPTURE_SERVICE";
+ field public static final String BIND_DIRECTORY_SEARCH = "android.permission.BIND_DIRECTORY_SEARCH";
+ field public static final String BIND_EUICC_SERVICE = "android.permission.BIND_EUICC_SERVICE";
+ field public static final String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE";
+ field public static final String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET";
+ field public static final String BIND_NETWORK_RECOMMENDATION_SERVICE = "android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE";
+ field public static final String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
+ field public static final String BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE = "android.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE";
+ field public static final String BIND_PRINT_RECOMMENDATION_SERVICE = "android.permission.BIND_PRINT_RECOMMENDATION_SERVICE";
+ field public static final String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
+ field public static final String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE";
+ field public static final String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE";
+ field public static final String BIND_SOUND_TRIGGER_DETECTION_SERVICE = "android.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE";
+ field public static final String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
+ field public static final String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE";
+ field public static final String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE";
+ field public static final String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
+ field public static final String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
+ field public static final String BRICK = "android.permission.BRICK";
+ field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
+ field @Deprecated public static final String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
+ field public static final String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
+ field public static final String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
+ field public static final String CAPTURE_TV_INPUT = "android.permission.CAPTURE_TV_INPUT";
+ field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
+ field public static final String CHANGE_DEVICE_IDLE_TEMP_WHITELIST = "android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST";
+ field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
+ field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
+ field public static final String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
+ field public static final String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
+ field public static final String CONTROL_DISPLAY_COLOR_TRANSFORMS = "android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS";
+ field public static final String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION";
+ field public static final String CONTROL_INCALL_EXPERIENCE = "android.permission.CONTROL_INCALL_EXPERIENCE";
+ field public static final String CONTROL_KEYGUARD_SECURE_NOTIFICATIONS = "android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS";
+ field public static final String CONTROL_VPN = "android.permission.CONTROL_VPN";
+ field public static final String CRYPT_KEEPER = "android.permission.CRYPT_KEEPER";
+ field public static final String DEVICE_POWER = "android.permission.DEVICE_POWER";
+ field public static final String DISPATCH_PROVISIONING_MESSAGE = "android.permission.DISPATCH_PROVISIONING_MESSAGE";
+ field public static final String FORCE_BACK = "android.permission.FORCE_BACK";
+ field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
+ field public static final String GET_APP_OPS_STATS = "android.permission.GET_APP_OPS_STATS";
+ field public static final String GET_PROCESS_STATE_AND_OOM_SCORE = "android.permission.GET_PROCESS_STATE_AND_OOM_SCORE";
+ field public static final String GET_RUNTIME_PERMISSIONS = "android.permission.GET_RUNTIME_PERMISSIONS";
+ field public static final String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
+ field public static final String GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS = "android.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS";
+ field public static final String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
+ field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
+ field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
+ field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
+ field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
+ field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
+ field public static final String INSTALL_PACKAGE_UPDATES = "android.permission.INSTALL_PACKAGE_UPDATES";
+ field public static final String INSTALL_SELF_UPDATES = "android.permission.INSTALL_SELF_UPDATES";
+ field public static final String INTENT_FILTER_VERIFICATION_AGENT = "android.permission.INTENT_FILTER_VERIFICATION_AGENT";
+ field public static final String INTERACT_ACROSS_PROFILES = "android.permission.INTERACT_ACROSS_PROFILES";
+ field public static final String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS";
+ field public static final String INTERACT_ACROSS_USERS_FULL = "android.permission.INTERACT_ACROSS_USERS_FULL";
+ field public static final String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW";
+ field public static final String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
+ field public static final String KILL_UID = "android.permission.KILL_UID";
+ field public static final String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS";
+ field public static final String LOCK_DEVICE = "android.permission.LOCK_DEVICE";
+ field public static final String LOOP_RADIO = "android.permission.LOOP_RADIO";
+ field public static final String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY";
+ field public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
+ field public static final String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS";
+ field public static final String MANAGE_APP_PREDICTIONS = "android.permission.MANAGE_APP_PREDICTIONS";
+ field public static final String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS";
+ field public static final String MANAGE_AUTO_FILL = "android.permission.MANAGE_AUTO_FILL";
+ field public static final String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
+ field public static final String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
+ field public static final String MANAGE_CONTENT_CAPTURE = "android.permission.MANAGE_CONTENT_CAPTURE";
+ field public static final String MANAGE_CONTENT_SUGGESTIONS = "android.permission.MANAGE_CONTENT_SUGGESTIONS";
+ field public static final String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
+ field public static final String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
+ field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
+ field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
+ field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY";
+ field public static final String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
+ field public static final String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
+ field public static final String MANAGE_USB = "android.permission.MANAGE_USB";
+ field public static final String MANAGE_USERS = "android.permission.MANAGE_USERS";
+ field public static final String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE";
+ field public static final String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS";
+ field public static final String MODIFY_AUDIO_ROUTING = "android.permission.MODIFY_AUDIO_ROUTING";
+ field public static final String MODIFY_CELL_BROADCASTS = "android.permission.MODIFY_CELL_BROADCASTS";
+ field public static final String MODIFY_DAY_NIGHT_MODE = "android.permission.MODIFY_DAY_NIGHT_MODE";
+ field @Deprecated public static final String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING";
+ field public static final String MODIFY_PARENTAL_CONTROLS = "android.permission.MODIFY_PARENTAL_CONTROLS";
+ field public static final String MODIFY_QUIET_MODE = "android.permission.MODIFY_QUIET_MODE";
+ field public static final String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
+ field public static final String NETWORK_MANAGED_PROVISIONING = "android.permission.NETWORK_MANAGED_PROVISIONING";
+ field public static final String NETWORK_SETUP_WIZARD = "android.permission.NETWORK_SETUP_WIZARD";
+ field public static final String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
+ field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
+ field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
+ field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
+ field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
+ field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
+ field public static final String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS";
+ field public static final String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING";
+ field public static final String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION";
+ field public static final String POWER_SAVER = "android.permission.POWER_SAVER";
+ field public static final String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
+ field public static final String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT";
+ field public static final String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES";
+ field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
+ field public static final String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
+ field public static final String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG";
+ field public static final String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
+ field public static final String READ_INSTALL_SESSIONS = "android.permission.READ_INSTALL_SESSIONS";
+ field public static final String READ_NETWORK_USAGE_HISTORY = "android.permission.READ_NETWORK_USAGE_HISTORY";
+ field public static final String READ_OEM_UNLOCK_STATE = "android.permission.READ_OEM_UNLOCK_STATE";
+ field public static final String READ_PRINT_SERVICES = "android.permission.READ_PRINT_SERVICES";
+ field public static final String READ_PRINT_SERVICE_RECOMMENDATIONS = "android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS";
+ field public static final String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
+ field public static final String READ_RUNTIME_PROFILES = "android.permission.READ_RUNTIME_PROFILES";
+ field public static final String READ_SEARCH_INDEXABLES = "android.permission.READ_SEARCH_INDEXABLES";
+ field public static final String READ_SYSTEM_UPDATE_INFO = "android.permission.READ_SYSTEM_UPDATE_INFO";
+ field public static final String READ_WALLPAPER_INTERNAL = "android.permission.READ_WALLPAPER_INTERNAL";
+ field public static final String READ_WIFI_CREDENTIAL = "android.permission.READ_WIFI_CREDENTIAL";
+ field public static final String REAL_GET_TASKS = "android.permission.REAL_GET_TASKS";
+ field public static final String RECEIVE_DATA_ACTIVITY_CHANGE = "android.permission.RECEIVE_DATA_ACTIVITY_CHANGE";
+ field public static final String RECEIVE_DEVICE_CUSTOMIZATION_READY = "android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY";
+ field public static final String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
+ field public static final String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE";
+ field public static final String RECOVERY = "android.permission.RECOVERY";
+ field public static final String RECOVER_KEYSTORE = "android.permission.RECOVER_KEYSTORE";
+ field public static final String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER";
+ field public static final String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER";
+ field public static final String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
+ field public static final String REMOTE_DISPLAY_PROVIDER = "android.permission.REMOTE_DISPLAY_PROVIDER";
+ field public static final String REMOVE_DRM_CERTIFICATES = "android.permission.REMOVE_DRM_CERTIFICATES";
+ field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
+ field public static final String RESET_PASSWORD = "android.permission.RESET_PASSWORD";
+ field public static final String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
+ field public static final String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
+ field public static final String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
+ field public static final String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
+ field public static final String SEND_DEVICE_CUSTOMIZATION_READY = "android.permission.SEND_DEVICE_CUSTOMIZATION_READY";
+ field public static final String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS";
+ field public static final String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION";
+ field public static final String SERIAL_PORT = "android.permission.SERIAL_PORT";
+ field public static final String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
+ field public static final String SET_HARMFUL_APP_WARNINGS = "android.permission.SET_HARMFUL_APP_WARNINGS";
+ field public static final String SET_MEDIA_KEY_LISTENER = "android.permission.SET_MEDIA_KEY_LISTENER";
+ field public static final String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
+ field public static final String SET_POINTER_SPEED = "android.permission.SET_POINTER_SPEED";
+ field public static final String SET_SCREEN_COMPATIBILITY = "android.permission.SET_SCREEN_COMPATIBILITY";
+ field public static final String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER";
+ field public static final String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT";
+ field public static final String SHOW_KEYGUARD_MESSAGE = "android.permission.SHOW_KEYGUARD_MESSAGE";
+ field public static final String SHUTDOWN = "android.permission.SHUTDOWN";
+ field public static final String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES";
+ field public static final String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME";
+ field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
+ field public static final String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
+ field public static final String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
+ field public static final String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER";
+ field public static final String UNLIMITED_SHORTCUTS_API_CALLS = "android.permission.UNLIMITED_SHORTCUTS_API_CALLS";
+ field public static final String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS";
+ field public static final String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
+ field public static final String UPDATE_TIME_ZONE_RULES = "android.permission.UPDATE_TIME_ZONE_RULES";
+ field public static final String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
+ field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
+ field public static final String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG";
+ field public static final String WRITE_DREAM_STATE = "android.permission.WRITE_DREAM_STATE";
+ field public static final String WRITE_EMBEDDED_SUBSCRIPTIONS = "android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS";
+ field public static final String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE";
+ field public static final String WRITE_OBB = "android.permission.WRITE_OBB";
}
public static final class Manifest.permission_group {
- field public static final java.lang.String UNDEFINED = "android.permission-group.UNDEFINED";
+ field public static final String UNDEFINED = "android.permission-group.UNDEFINED";
}
public static final class R.array {
+ field public static final int config_defaultRoleHolders = 17235974; // 0x1070006
field public static final int config_keySystemUuidMapping = 17235973; // 0x1070005
}
public static final class R.attr {
+ field public static final int inheritShowWhenLocked = 16844194; // 0x10105a2
field public static final int isVrOnly = 16844152; // 0x1010578
field public static final int requiredSystemPropertyName = 16844133; // 0x1010565
field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566
@@ -244,7 +252,7 @@ package android {
package android.accounts {
public class AccountManager {
- method public android.accounts.AccountManagerFuture<android.os.Bundle> finishSessionAsUser(android.os.Bundle, android.app.Activity, android.os.UserHandle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public android.accounts.AccountManagerFuture<android.os.Bundle> finishSessionAsUser(android.os.Bundle, android.app.Activity, android.os.UserHandle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
}
}
@@ -254,87 +262,89 @@ package android.app {
public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
method public void convertFromTranslucent();
method public boolean convertToTranslucent(android.app.Activity.TranslucentConversionListener, android.app.ActivityOptions);
- method public deprecated boolean isBackgroundVisibleBehind();
- method public deprecated void onBackgroundVisibleBehindChanged(boolean);
+ method @Deprecated public boolean isBackgroundVisibleBehind();
+ method @Deprecated public void onBackgroundVisibleBehindChanged(boolean);
+ method public void setInheritShowWhenLocked(boolean);
}
- public static abstract interface Activity.TranslucentConversionListener {
- method public abstract void onTranslucentConversionComplete(boolean);
+ public static interface Activity.TranslucentConversionListener {
+ method public void onTranslucentConversionComplete(boolean);
}
public class ActivityManager {
- method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
- method public void forceStopPackage(java.lang.String);
- method public static int getCurrentUser();
- method public int getPackageImportance(java.lang.String);
- method public int getUidImportance(int);
- method public void killUid(int, java.lang.String);
- method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
- method public static void setPersistentVrThread(int);
- method public boolean switchUser(android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
+ method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String);
+ method @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public static int getCurrentUser();
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
+ method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public static void setPersistentVrThread(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull android.os.UserHandle);
}
- public static abstract interface ActivityManager.OnUidImportanceListener {
- method public abstract void onUidImportance(int, int);
+ public static interface ActivityManager.OnUidImportanceListener {
+ method public void onUidImportance(int, int);
}
public class AlarmManager {
- method public void set(int, long, long, long, android.app.PendingIntent, android.os.WorkSource);
- method public void set(int, long, long, long, android.app.AlarmManager.OnAlarmListener, android.os.Handler, android.os.WorkSource);
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, android.app.PendingIntent, android.os.WorkSource);
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, android.app.AlarmManager.OnAlarmListener, android.os.Handler, android.os.WorkSource);
}
public class AppOpsManager {
- method public java.util.List<android.app.AppOpsManager.HistoricalPackageOps> getAllHistoricPackagesOps(java.lang.String[], long, long);
- method public android.app.AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int, java.lang.String, java.lang.String[], long, long);
- method public static java.lang.String[] getOpStrs();
- method public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, java.lang.String, int[]);
- method public static int opToDefaultMode(java.lang.String);
- method public static java.lang.String opToPermission(java.lang.String);
- method public void setMode(java.lang.String, int, java.lang.String, int);
- method public void setUidMode(java.lang.String, int, int);
- field public static final java.lang.String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
- field public static final java.lang.String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
- field public static final java.lang.String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
- field public static final java.lang.String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot";
- field public static final java.lang.String OPSTR_ASSIST_STRUCTURE = "android:assist_structure";
- field public static final java.lang.String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume";
- field public static final java.lang.String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume";
- field public static final java.lang.String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume";
- field public static final java.lang.String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume";
- field public static final java.lang.String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume";
- field public static final java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
- field public static final java.lang.String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
- field public static final java.lang.String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
- field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
- field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
- field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
- field public static final java.lang.String OPSTR_GPS = "android:gps";
- field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
- field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
- field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
- field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
- field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
- field public static final java.lang.String OPSTR_POST_NOTIFICATION = "android:post_notification";
- field public static final java.lang.String OPSTR_PROJECT_MEDIA = "android:project_media";
- field public static final java.lang.String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
- field public static final java.lang.String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
- field public static final java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
- field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
- field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
- field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
- field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
- field public static final java.lang.String OPSTR_START_FOREGROUND = "android:start_foreground";
- field public static final java.lang.String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
- field public static final java.lang.String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
- field public static final java.lang.String OPSTR_TOAST_WINDOW = "android:toast_window";
- field public static final java.lang.String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on";
- field public static final java.lang.String OPSTR_VIBRATE = "android:vibrate";
- field public static final java.lang.String OPSTR_WAKE_LOCK = "android:wake_lock";
- field public static final java.lang.String OPSTR_WIFI_SCAN = "android:wifi_scan";
- field public static final java.lang.String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard";
- field public static final java.lang.String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
- field public static final java.lang.String OPSTR_WRITE_SMS = "android:write_sms";
- field public static final java.lang.String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
+ method @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public void getHistoricalOps(int, @Nullable String, @Nullable String[], long, long, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>);
+ method public static String[] getOpStrs();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, String, int[]);
+ method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable java.lang.String...);
+ method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getPackagesForOps(@Nullable String[]);
+ method public static int opToDefaultMode(@NonNull String);
+ method @Nullable public static String opToPermission(@NonNull String);
+ method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(String, int, String, int);
+ method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(String, int, int);
+ field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
+ field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
+ field public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
+ field public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot";
+ field public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure";
+ field public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume";
+ field public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume";
+ field public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume";
+ field public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume";
+ field public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume";
+ field public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
+ field public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
+ field public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
+ field public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
+ field public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
+ field public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts";
+ field public static final String OPSTR_GPS = "android:gps";
+ field public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
+ field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
+ field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
+ field public static final String OPSTR_PLAY_AUDIO = "android:play_audio";
+ field public static final String OPSTR_POST_NOTIFICATION = "android:post_notification";
+ field public static final String OPSTR_PROJECT_MEDIA = "android:project_media";
+ field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
+ field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
+ field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
+ field public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
+ field public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
+ field public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
+ field public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
+ field public static final String OPSTR_START_FOREGROUND = "android:start_foreground";
+ field public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
+ field public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
+ field public static final String OPSTR_TOAST_WINDOW = "android:toast_window";
+ field public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on";
+ field public static final String OPSTR_VIBRATE = "android:vibrate";
+ field public static final String OPSTR_WAKE_LOCK = "android:wake_lock";
+ field public static final String OPSTR_WIFI_SCAN = "android:wifi_scan";
+ field public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard";
+ field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
+ field public static final String OPSTR_WRITE_SMS = "android:write_sms";
+ field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
field public static final int UID_STATE_BACKGROUND = 4; // 0x4
field public static final int UID_STATE_CACHED = 5; // 0x5
field public static final int UID_STATE_FOREGROUND = 3; // 0x3
@@ -343,7 +353,7 @@ package android.app {
field public static final int UID_STATE_TOP = 1; // 0x1
}
- public static final class AppOpsManager.HistoricalOpEntry implements android.os.Parcelable {
+ public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable {
method public int describeContents();
method public long getAccessCount(int);
method public long getAccessDuration(int);
@@ -353,21 +363,41 @@ package android.app {
method public long getForegroundAccessCount();
method public long getForegroundAccessDuration();
method public long getForegroundRejectCount();
- method public java.lang.String getOp();
+ method @NonNull public String getOpName();
method public long getRejectCount(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOpEntry> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getBeginTimeMillis();
+ method public long getEndTimeMillis();
+ method public int getUidCount();
+ method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int);
+ method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR;
}
public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable {
method public int describeContents();
- method public android.app.AppOpsManager.HistoricalOpEntry getEntry(java.lang.String);
- method public android.app.AppOpsManager.HistoricalOpEntry getEntryAt(int);
- method public int getEntryCount();
- method public java.lang.String getPackageName();
+ method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String);
+ method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(int);
+ method public int getOpCount();
+ method @NonNull public String getPackageName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalUidOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getPackageCount();
+ method @Nullable public android.app.AppOpsManager.HistoricalPackageOps getPackageOps(@NonNull String);
+ method @NonNull public android.app.AppOpsManager.HistoricalPackageOps getPackageOpsAt(int);
method public int getUid();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalUidOps> CREATOR;
}
public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
@@ -380,8 +410,8 @@ package android.app {
method public long getLastRejectForegroundTime();
method public long getLastRejectTime();
method public int getMode();
- method public java.lang.String getOpStr();
- method public java.lang.String getProxyPackageName();
+ method public String getOpStr();
+ method public String getProxyPackageName();
method public int getProxyUid();
method public boolean isRunning();
method public void writeToParcel(android.os.Parcel, int);
@@ -391,7 +421,7 @@ package android.app {
public static final class AppOpsManager.PackageOps implements android.os.Parcelable {
method public int describeContents();
method public java.util.List<android.app.AppOpsManager.OpEntry> getOps();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public int getUid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR;
@@ -400,24 +430,24 @@ package android.app {
public class BroadcastOptions {
method public static android.app.BroadcastOptions makeBasic();
method public void setDontSendToRestrictedApps(boolean);
- method public void setTemporaryAppWhitelistDuration(long);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void setTemporaryAppWhitelistDuration(long);
method public android.os.Bundle toBundle();
}
public class DownloadManager {
- field public static final java.lang.String ACTION_DOWNLOAD_COMPLETED = "android.intent.action.DOWNLOAD_COMPLETED";
+ field public static final String ACTION_DOWNLOAD_COMPLETED = "android.intent.action.DOWNLOAD_COMPLETED";
}
public abstract class InstantAppResolverService extends android.app.Service {
ctor public InstantAppResolverService();
method public final void attachBaseContext(android.content.Context);
method public final android.os.IBinder onBind(android.content.Intent);
- method public deprecated void onGetInstantAppIntentFilter(int[], java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
- method public deprecated void onGetInstantAppIntentFilter(android.content.Intent, int[], java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
- method public void onGetInstantAppIntentFilter(android.content.Intent, int[], android.os.UserHandle, java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
- method public deprecated void onGetInstantAppResolveInfo(int[], java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
- method public deprecated void onGetInstantAppResolveInfo(android.content.Intent, int[], java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
- method public void onGetInstantAppResolveInfo(android.content.Intent, int[], android.os.UserHandle, java.lang.String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method @Deprecated public void onGetInstantAppIntentFilter(int[], String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method @Deprecated public void onGetInstantAppIntentFilter(android.content.Intent, int[], String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method public void onGetInstantAppIntentFilter(android.content.Intent, int[], android.os.UserHandle, String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method @Deprecated public void onGetInstantAppResolveInfo(int[], String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method @Deprecated public void onGetInstantAppResolveInfo(android.content.Intent, int[], String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
+ method public void onGetInstantAppResolveInfo(android.content.Intent, int[], android.os.UserHandle, String, android.app.InstantAppResolverService.InstantAppResolutionCallback);
}
public static final class InstantAppResolverService.InstantAppResolutionCallback {
@@ -425,18 +455,18 @@ package android.app {
}
public class KeyguardManager {
- method public android.content.Intent createConfirmFactoryResetCredentialIntent(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
- method public boolean getPrivateNotificationsAllowed();
- method public void requestDismissKeyguard(android.app.Activity, java.lang.CharSequence, android.app.KeyguardManager.KeyguardDismissCallback);
- method public void setPrivateNotificationsAllowed(boolean);
+ method public android.content.Intent createConfirmFactoryResetCredentialIntent(CharSequence, CharSequence, CharSequence);
+ method @RequiresPermission(android.Manifest.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS) public boolean getPrivateNotificationsAllowed();
+ method @RequiresPermission(android.Manifest.permission.SHOW_KEYGUARD_MESSAGE) public void requestDismissKeyguard(@NonNull android.app.Activity, @Nullable CharSequence, @Nullable android.app.KeyguardManager.KeyguardDismissCallback);
+ method @RequiresPermission(android.Manifest.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS) public void setPrivateNotificationsAllowed(boolean);
}
public class Notification implements android.os.Parcelable {
- field public static final java.lang.String CATEGORY_CAR_EMERGENCY = "car_emergency";
- field public static final java.lang.String CATEGORY_CAR_INFORMATION = "car_information";
- field public static final java.lang.String CATEGORY_CAR_WARNING = "car_warning";
- field public static final java.lang.String EXTRA_ALLOW_DURING_SETUP = "android.allowDuringSetup";
- field public static final java.lang.String EXTRA_SUBSTITUTE_APP_NAME = "android.substName";
+ field public static final String CATEGORY_CAR_EMERGENCY = "car_emergency";
+ field public static final String CATEGORY_CAR_INFORMATION = "car_information";
+ field public static final String CATEGORY_CAR_WARNING = "car_warning";
+ field @RequiresPermission(android.Manifest.permission.NOTIFICATION_DURING_SETUP) public static final String EXTRA_ALLOW_DURING_SETUP = "android.allowDuringSetup";
+ field @RequiresPermission(android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME) public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName";
field public static final int FLAG_AUTOGROUP_SUMMARY = 1024; // 0x400
}
@@ -444,13 +474,13 @@ package android.app {
ctor public Notification.TvExtender();
ctor public Notification.TvExtender(android.app.Notification);
method public android.app.Notification.Builder extend(android.app.Notification.Builder);
- method public java.lang.String getChannelId();
+ method public String getChannelId();
method public android.app.PendingIntent getContentIntent();
method public android.app.PendingIntent getDeleteIntent();
method public boolean getSuppressShowOverApps();
method public boolean isAvailableOnTv();
- method public android.app.Notification.TvExtender setChannel(java.lang.String);
- method public android.app.Notification.TvExtender setChannelId(java.lang.String);
+ method public android.app.Notification.TvExtender setChannel(String);
+ method public android.app.Notification.TvExtender setChannelId(String);
method public android.app.Notification.TvExtender setContentIntent(android.app.PendingIntent);
method public android.app.Notification.TvExtender setDeleteIntent(android.app.PendingIntent);
method public android.app.Notification.TvExtender setSuppressShowOverApps(boolean);
@@ -469,36 +499,36 @@ package android.app {
}
public final class StatsManager {
- method public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
- method public deprecated boolean addConfiguration(long, byte[]);
- method public deprecated byte[] getData(long);
- method public deprecated byte[] getMetadata();
- method public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
- method public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
- method public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
- method public deprecated boolean removeConfiguration(long);
- method public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
- method public deprecated boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
- method public deprecated boolean setDataFetchOperation(long, android.app.PendingIntent);
- method public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
- field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
- field public static final java.lang.String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
- field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
- field public static final java.lang.String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
- field public static final java.lang.String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
- field public static final java.lang.String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID";
- field public static final java.lang.String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
+ method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long);
+ method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata();
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
+ field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
+ field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
+ field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
+ field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
+ field public static final String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
+ field public static final String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID";
+ field public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
}
public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
- ctor public StatsManager.StatsUnavailableException(java.lang.String);
- ctor public StatsManager.StatsUnavailableException(java.lang.String, java.lang.Throwable);
+ ctor public StatsManager.StatsUnavailableException(String);
+ ctor public StatsManager.StatsUnavailableException(String, Throwable);
}
public final class Vr2dDisplayProperties implements android.os.Parcelable {
ctor public Vr2dDisplayProperties(int, int, int);
method public int describeContents();
- method public void dump(java.io.PrintWriter, java.lang.String);
+ method public void dump(java.io.PrintWriter, String);
method public int getAddedFlags();
method public int getDpi();
method public int getHeight();
@@ -519,16 +549,16 @@ package android.app {
}
public class VrManager {
- method public int getVr2dDisplayId();
- method public boolean isPersistentVrModeEnabled();
- method public boolean isVrModeEnabled();
- method public void registerVrStateCallback(java.util.concurrent.Executor, android.app.VrStateCallback);
- method public void setAndBindVrCompositor(android.content.ComponentName);
- method public void setPersistentVrModeEnabled(boolean);
- method public void setStandbyEnabled(boolean);
- method public void setVr2dDisplayProperties(android.app.Vr2dDisplayProperties);
- method public void setVrInputMethod(android.content.ComponentName);
- method public void unregisterVrStateCallback(android.app.VrStateCallback);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public int getVr2dDisplayId();
+ method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public boolean isPersistentVrModeEnabled();
+ method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public boolean isVrModeEnabled();
+ method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public void registerVrStateCallback(@NonNull java.util.concurrent.Executor, android.app.VrStateCallback);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setAndBindVrCompositor(android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setPersistentVrModeEnabled(boolean);
+ method @RequiresPermission("android.permission.ACCESS_VR_MANAGER") public void setStandbyEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setVr2dDisplayProperties(android.app.Vr2dDisplayProperties);
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setVrInputMethod(android.content.ComponentName);
+ method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public void unregisterVrStateCallback(android.app.VrStateCallback);
}
public abstract class VrStateCallback {
@@ -537,14 +567,21 @@ package android.app {
method public void onVrStateChanged(boolean);
}
+ public final class WallpaperColors implements android.os.Parcelable {
+ ctor public WallpaperColors(@NonNull android.graphics.Color, @Nullable android.graphics.Color, @Nullable android.graphics.Color, int);
+ method public int getColorHints();
+ field public static final int HINT_SUPPORTS_DARK_TEXT = 1; // 0x1
+ field public static final int HINT_SUPPORTS_DARK_THEME = 2; // 0x2
+ }
+
public final class WallpaperInfo implements android.os.Parcelable {
method public boolean supportsAmbientMode();
}
public class WallpaperManager {
- method public void clearWallpaper(int, int);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void clearWallpaper(int, int);
method public void setDisplayOffset(android.os.IBinder, int, int);
- method public boolean setWallpaperComponent(android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(android.content.ComponentName);
}
}
@@ -552,41 +589,41 @@ package android.app {
package android.app.admin {
public class DevicePolicyManager {
- method public java.lang.String getDeviceOwner();
- method public android.content.ComponentName getDeviceOwnerComponentOnAnyUser();
- method public java.lang.String getDeviceOwnerNameOnAnyUser();
- method public java.lang.CharSequence getDeviceOwnerOrganizationName();
- method public android.os.UserHandle getDeviceOwnerUser();
- method public java.util.List<java.lang.String> getPermittedAccessibilityServices(int);
- method public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
- method public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
- method public android.content.ComponentName getProfileOwnerAsUser(android.os.UserHandle);
- method public java.lang.String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
- method public int getUserProvisioningState();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getDeviceOwner();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.content.ComponentName getDeviceOwnerComponentOnAnyUser();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getDeviceOwnerNameOnAnyUser();
+ method @Nullable public CharSequence getDeviceOwnerOrganizationName();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.UserHandle getDeviceOwnerUser();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<java.lang.String> getPermittedAccessibilityServices(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
+ method @Nullable public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
+ method @Nullable @RequiresPermission(value=android.Manifest.permission.INTERACT_ACROSS_USERS, conditional=true) public android.content.ComponentName getProfileOwnerAsUser(@NonNull android.os.UserHandle);
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int getUserProvisioningState();
method public boolean isDeviceManaged();
- method public boolean isDeviceProvisioned();
- method public boolean isDeviceProvisioningConfigApplied();
- method public boolean isManagedKiosk();
- method public boolean isUnattendedManagedKiosk();
- method public void notifyPendingSystemUpdate(long);
- method public void notifyPendingSystemUpdate(long, boolean);
- method public boolean packageHasActiveAdmins(java.lang.String);
- method public deprecated boolean setActiveProfileOwner(android.content.ComponentName, java.lang.String) throws java.lang.IllegalArgumentException;
- method public void setDeviceProvisioningConfigApplied();
- method public void setProfileOwnerCanAccessDeviceIdsForUser(android.content.ComponentName, android.os.UserHandle);
- field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
- field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
- field public static final java.lang.String ACTION_PROVISION_FINALIZATION = "android.app.action.PROVISION_FINALIZATION";
- field public static final java.lang.String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE = "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE";
- field public static final java.lang.String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER";
- field public static final java.lang.String ACTION_STATE_USER_SETUP_COMPLETE = "android.app.action.STATE_USER_SETUP_COMPLETE";
- field public static final java.lang.String EXTRA_PROFILE_OWNER_NAME = "android.app.extra.PROFILE_OWNER_NAME";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL";
- field public static final java.lang.String EXTRA_PROVISIONING_ORGANIZATION_NAME = "android.app.extra.PROVISIONING_ORGANIZATION_NAME";
- field public static final java.lang.String EXTRA_PROVISIONING_SUPPORT_URL = "android.app.extra.PROVISIONING_SUPPORT_URL";
- field public static final java.lang.String EXTRA_PROVISIONING_TRIGGER = "android.app.extra.PROVISIONING_TRIGGER";
- field public static final java.lang.String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioned();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioningConfigApplied();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedKiosk();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUnattendedManagedKiosk();
+ method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long);
+ method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long, boolean);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public boolean packageHasActiveAdmins(String);
+ method @Deprecated @RequiresPermission("android.permission.MANAGE_DEVICE_ADMINS") public boolean setActiveProfileOwner(@NonNull android.content.ComponentName, String) throws java.lang.IllegalArgumentException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setDeviceProvisioningConfigApplied();
+ method public void setProfileOwnerCanAccessDeviceIdsForUser(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
+ field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
+ field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
+ field public static final String ACTION_PROVISION_FINALIZATION = "android.app.action.PROVISION_FINALIZATION";
+ field public static final String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE = "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE";
+ field public static final String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER";
+ field public static final String ACTION_STATE_USER_SETUP_COMPLETE = "android.app.action.STATE_USER_SETUP_COMPLETE";
+ field public static final String EXTRA_PROFILE_OWNER_NAME = "android.app.extra.PROFILE_OWNER_NAME";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI";
+ field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL";
+ field public static final String EXTRA_PROVISIONING_ORGANIZATION_NAME = "android.app.extra.PROVISIONING_ORGANIZATION_NAME";
+ field public static final String EXTRA_PROVISIONING_SUPPORT_URL = "android.app.extra.PROVISIONING_SUPPORT_URL";
+ field public static final String EXTRA_PROVISIONING_TRIGGER = "android.app.extra.PROVISIONING_TRIGGER";
+ field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
field public static final int PROVISIONING_TRIGGER_CLOUD_ENROLLMENT = 1; // 0x1
field public static final int PROVISIONING_TRIGGER_PERSISTENT_DEVICE_OWNER = 3; // 0x3
field public static final int PROVISIONING_TRIGGER_QR_CODE = 2; // 0x2
@@ -630,28 +667,28 @@ package android.app.backup {
}
public class BackupManager {
- method public void backupNow();
- method public android.app.backup.RestoreSession beginRestoreSession();
- method public void cancelBackups();
- method public long getAvailableRestoreToken(java.lang.String);
- method public android.content.Intent getConfigurationIntent(java.lang.String);
- method public java.lang.String getCurrentTransport();
- method public android.content.ComponentName getCurrentTransportComponent();
- method public android.content.Intent getDataManagementIntent(java.lang.String);
- method public java.lang.String getDataManagementLabel(java.lang.String);
- method public java.lang.String getDestinationString(java.lang.String);
- method public boolean isAppEligibleForBackup(java.lang.String);
- method public boolean isBackupEnabled();
- method public boolean isBackupServiceActive(android.os.UserHandle);
- method public java.lang.String[] listAllTransports();
- method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver);
- method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int);
- method public deprecated int requestRestore(android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
- method public deprecated java.lang.String selectBackupTransport(java.lang.String);
- method public void selectBackupTransport(android.content.ComponentName, android.app.backup.SelectBackupTransportCallback);
- method public void setAutoRestore(boolean);
- method public void setBackupEnabled(boolean);
- method public void updateTransportAttributes(android.content.ComponentName, java.lang.String, android.content.Intent, java.lang.String, android.content.Intent, java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void backupNow();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public android.app.backup.RestoreSession beginRestoreSession();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void cancelBackups();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public long getAvailableRestoreToken(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getConfigurationIntent(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public String getCurrentTransport();
+ method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.ComponentName getCurrentTransportComponent();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getDataManagementIntent(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isAppEligibleForBackup(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupEnabled();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public String[] listAllTransports();
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int);
+ method @Deprecated public int requestRestore(android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.BACKUP) public String selectBackupTransport(String);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void selectBackupTransport(android.content.ComponentName, android.app.backup.SelectBackupTransportCallback);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void setAutoRestore(boolean);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void setBackupEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(android.content.ComponentName, String, @Nullable android.content.Intent, String, @Nullable android.content.Intent, @Nullable String);
field public static final int ERROR_AGENT_FAILURE = -1003; // 0xfffffc15
field public static final int ERROR_BACKUP_CANCELLED = -2003; // 0xfffff82d
field public static final int ERROR_BACKUP_NOT_ALLOWED = -2001; // 0xfffff82f
@@ -662,28 +699,28 @@ package android.app.backup {
field public static final int ERROR_TRANSPORT_QUOTA_EXCEEDED = -1005; // 0xfffffc13
field public static final int ERROR_TRANSPORT_UNAVAILABLE = -1; // 0xffffffff
field public static final int FLAG_NON_INCREMENTAL_BACKUP = 1; // 0x1
- field public static final java.lang.String PACKAGE_MANAGER_SENTINEL = "@pm@";
+ field public static final String PACKAGE_MANAGER_SENTINEL = "@pm@";
field public static final int SUCCESS = 0; // 0x0
}
public class BackupManagerMonitor {
ctor public BackupManagerMonitor();
method public void onEvent(android.os.Bundle);
- field public static final java.lang.String EXTRA_LOG_CANCEL_ALL = "android.app.backup.extra.LOG_CANCEL_ALL";
- field public static final java.lang.String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY";
- field public static final java.lang.String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
- field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_FULL_VERSION";
- field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
- field public static final deprecated java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
- field public static final java.lang.String EXTRA_LOG_EXCEPTION_FULL_BACKUP = "android.app.backup.extra.LOG_EXCEPTION_FULL_BACKUP";
- field public static final java.lang.String EXTRA_LOG_ILLEGAL_KEY = "android.app.backup.extra.LOG_ILLEGAL_KEY";
- field public static final java.lang.String EXTRA_LOG_MANIFEST_PACKAGE_NAME = "android.app.backup.extra.LOG_MANIFEST_PACKAGE_NAME";
- field public static final java.lang.String EXTRA_LOG_OLD_VERSION = "android.app.backup.extra.LOG_OLD_VERSION";
- field public static final java.lang.String EXTRA_LOG_POLICY_ALLOW_APKS = "android.app.backup.extra.LOG_POLICY_ALLOW_APKS";
- field public static final java.lang.String EXTRA_LOG_PREFLIGHT_ERROR = "android.app.backup.extra.LOG_PREFLIGHT_ERROR";
- field public static final java.lang.String EXTRA_LOG_RESTORE_ANYWAY = "android.app.backup.extra.LOG_RESTORE_ANYWAY";
- field public static final java.lang.String EXTRA_LOG_RESTORE_VERSION = "android.app.backup.extra.LOG_RESTORE_VERSION";
- field public static final java.lang.String EXTRA_LOG_WIDGET_PACKAGE_NAME = "android.app.backup.extra.LOG_WIDGET_PACKAGE_NAME";
+ field public static final String EXTRA_LOG_CANCEL_ALL = "android.app.backup.extra.LOG_CANCEL_ALL";
+ field public static final String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY";
+ field public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
+ field public static final String EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_FULL_VERSION";
+ field public static final String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
+ field @Deprecated public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
+ field public static final String EXTRA_LOG_EXCEPTION_FULL_BACKUP = "android.app.backup.extra.LOG_EXCEPTION_FULL_BACKUP";
+ field public static final String EXTRA_LOG_ILLEGAL_KEY = "android.app.backup.extra.LOG_ILLEGAL_KEY";
+ field public static final String EXTRA_LOG_MANIFEST_PACKAGE_NAME = "android.app.backup.extra.LOG_MANIFEST_PACKAGE_NAME";
+ field public static final String EXTRA_LOG_OLD_VERSION = "android.app.backup.extra.LOG_OLD_VERSION";
+ field public static final String EXTRA_LOG_POLICY_ALLOW_APKS = "android.app.backup.extra.LOG_POLICY_ALLOW_APKS";
+ field public static final String EXTRA_LOG_PREFLIGHT_ERROR = "android.app.backup.extra.LOG_PREFLIGHT_ERROR";
+ field public static final String EXTRA_LOG_RESTORE_ANYWAY = "android.app.backup.extra.LOG_RESTORE_ANYWAY";
+ field public static final String EXTRA_LOG_RESTORE_VERSION = "android.app.backup.extra.LOG_RESTORE_VERSION";
+ field public static final String EXTRA_LOG_WIDGET_PACKAGE_NAME = "android.app.backup.extra.LOG_WIDGET_PACKAGE_NAME";
field public static final int LOG_EVENT_CATEGORY_AGENT = 2; // 0x2
field public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; // 0x3
field public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; // 0x1
@@ -734,8 +771,8 @@ package android.app.backup {
public abstract class BackupObserver {
ctor public BackupObserver();
method public void backupFinished(int);
- method public void onResult(java.lang.String, int);
- method public void onUpdate(java.lang.String, android.app.backup.BackupProgress);
+ method public void onResult(String, int);
+ method public void onUpdate(String, android.app.backup.BackupProgress);
}
public class BackupProgress implements android.os.Parcelable {
@@ -754,13 +791,13 @@ package android.app.backup {
method public int checkFullBackupSize(long);
method public int clearBackupData(android.content.pm.PackageInfo);
method public android.content.Intent configurationIntent();
- method public java.lang.String currentDestinationString();
+ method public String currentDestinationString();
method public android.content.Intent dataManagementIntent();
- method public java.lang.String dataManagementLabel();
+ method public String dataManagementLabel();
method public int finishBackup();
method public void finishRestore();
method public android.app.backup.RestoreSet[] getAvailableRestoreSets();
- method public long getBackupQuota(java.lang.String, boolean);
+ method public long getBackupQuota(String, boolean);
method public android.os.IBinder getBinder();
method public long getCurrentRestoreSet();
method public int getNextFullRestoreDataChunk(android.os.ParcelFileDescriptor);
@@ -768,7 +805,7 @@ package android.app.backup {
method public int getTransportFlags();
method public int initializeDevice();
method public boolean isAppEligibleForBackup(android.content.pm.PackageInfo, boolean);
- method public java.lang.String name();
+ method public String name();
method public android.app.backup.RestoreDescription nextRestorePackage();
method public int performBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor, int);
method public int performBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor);
@@ -778,10 +815,10 @@ package android.app.backup {
method public long requestFullBackupTime();
method public int sendBackupData(int);
method public int startRestore(long, android.content.pm.PackageInfo[]);
- method public java.lang.String transportDirName();
+ method public String transportDirName();
field public static final int AGENT_ERROR = -1003; // 0xfffffc15
field public static final int AGENT_UNKNOWN = -1004; // 0xfffffc14
- field public static final java.lang.String EXTRA_TRANSPORT_REGISTRATION = "android.app.backup.extra.TRANSPORT_REGISTRATION";
+ field public static final String EXTRA_TRANSPORT_REGISTRATION = "android.app.backup.extra.TRANSPORT_REGISTRATION";
field public static final int FLAG_INCREMENTAL = 2; // 0x2
field public static final int FLAG_NON_INCREMENTAL = 4; // 0x4
field public static final int FLAG_USER_INITIATED = 1; // 0x1
@@ -795,10 +832,10 @@ package android.app.backup {
}
public class RestoreDescription implements android.os.Parcelable {
- ctor public RestoreDescription(java.lang.String, int);
+ ctor public RestoreDescription(String, int);
method public int describeContents();
method public int getDataType();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.backup.RestoreDescription> CREATOR;
field public static final android.app.backup.RestoreDescription NO_MORE_PACKAGES;
@@ -816,27 +853,94 @@ package android.app.backup {
method public int getAvailableRestoreSets(android.app.backup.RestoreObserver);
method public int restoreAll(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
method public int restoreAll(long, android.app.backup.RestoreObserver);
- method public int restorePackage(java.lang.String, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
- method public int restorePackage(java.lang.String, android.app.backup.RestoreObserver);
- method public int restoreSome(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor, java.lang.String[]);
- method public int restoreSome(long, android.app.backup.RestoreObserver, java.lang.String[]);
+ method public int restorePackage(String, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
+ method public int restorePackage(String, android.app.backup.RestoreObserver);
+ method public int restoreSome(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor, String[]);
+ method public int restoreSome(long, android.app.backup.RestoreObserver, String[]);
}
public class RestoreSet implements android.os.Parcelable {
ctor public RestoreSet();
- ctor public RestoreSet(java.lang.String, java.lang.String, long);
+ ctor public RestoreSet(String, String, long);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.backup.RestoreSet> CREATOR;
- field public java.lang.String device;
- field public java.lang.String name;
+ field public String device;
+ field public String name;
field public long token;
}
public abstract class SelectBackupTransportCallback {
ctor public SelectBackupTransportCallback();
method public void onFailure(int);
- method public void onSuccess(java.lang.String);
+ method public void onSuccess(String);
+ }
+
+}
+
+package android.app.contentsuggestions {
+
+ public final class ClassificationsRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.os.Bundle getExtras();
+ method public java.util.List<android.app.contentsuggestions.ContentSelection> getSelections();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ClassificationsRequest> CREATOR;
+ }
+
+ public static final class ClassificationsRequest.Builder {
+ ctor public ClassificationsRequest.Builder(@NonNull java.util.List<android.app.contentsuggestions.ContentSelection>);
+ method public android.app.contentsuggestions.ClassificationsRequest build();
+ method public android.app.contentsuggestions.ClassificationsRequest.Builder setExtras(@NonNull android.os.Bundle);
+ }
+
+ public final class ContentClassification implements android.os.Parcelable {
+ ctor public ContentClassification(@NonNull String, @NonNull android.os.Bundle);
+ method public int describeContents();
+ method public android.os.Bundle getExtras();
+ method public String getId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ContentClassification> CREATOR;
+ }
+
+ public final class ContentSelection implements android.os.Parcelable {
+ ctor public ContentSelection(@NonNull String, @NonNull android.os.Bundle);
+ method public int describeContents();
+ method public android.os.Bundle getExtras();
+ method public String getId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ContentSelection> CREATOR;
+ }
+
+ public final class ContentSuggestionsManager {
+ method public void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback);
+ method public void notifyInteraction(@NonNull String, @NonNull android.os.Bundle);
+ method public void provideContextImage(int, @NonNull android.os.Bundle);
+ method public void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback);
+ }
+
+ public static interface ContentSuggestionsManager.ClassificationsCallback {
+ method public void onContentClassificationsAvailable(int, @NonNull java.util.List<android.app.contentsuggestions.ContentClassification>);
+ }
+
+ public static interface ContentSuggestionsManager.SelectionsCallback {
+ method public void onContentSelectionsAvailable(int, @NonNull java.util.List<android.app.contentsuggestions.ContentSelection>);
+ }
+
+ public final class SelectionsRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.os.Bundle getExtras();
+ method public android.graphics.Point getInterestPoint();
+ method public int getTaskId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.contentsuggestions.SelectionsRequest> CREATOR;
+ }
+
+ public static final class SelectionsRequest.Builder {
+ ctor public SelectionsRequest.Builder(int);
+ method public android.app.contentsuggestions.SelectionsRequest build();
+ method public android.app.contentsuggestions.SelectionsRequest.Builder setExtras(@NonNull android.os.Bundle);
+ method public android.app.contentsuggestions.SelectionsRequest.Builder setInterestPoint(@NonNull android.graphics.Point);
}
}
@@ -844,35 +948,115 @@ package android.app.backup {
package android.app.job {
public abstract class JobScheduler {
- method public abstract int scheduleAsPackage(android.app.job.JobInfo, java.lang.String, int, java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public abstract int scheduleAsPackage(@NonNull android.app.job.JobInfo, @NonNull String, int, String);
+ }
+
+}
+
+package android.app.prediction {
+
+ public final class AppPredictionContext implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.os.Bundle getExtras();
+ method @NonNull public String getPackageName();
+ method public int getPredictedTargetCount();
+ method public String getUiSurface();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR;
+ }
+
+ public static final class AppPredictionContext.Builder {
+ method public android.app.prediction.AppPredictionContext build();
+ method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
+ method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int);
+ method public android.app.prediction.AppPredictionContext.Builder setUiSurface(@Nullable String);
+ }
+
+ public final class AppPredictionManager {
+ method public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext);
+ }
+
+ public final class AppPredictionSessionId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR;
+ }
+
+ public final class AppPredictor {
+ method public void destroy();
+ method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent);
+ method public void notifyLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+ method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback);
+ method public void requestPredictionUpdate();
+ method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+ method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback);
+ }
+
+ public static interface AppPredictor.Callback {
+ method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>);
+ }
+
+ public final class AppTarget implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public String getClassName();
+ method @NonNull public android.app.prediction.AppTargetId getId();
+ method @NonNull public String getPackageName();
+ method public int getRank();
+ method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
+ method @NonNull public android.os.UserHandle getUser();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR;
+ }
+
+ public final class AppTargetEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public int getAction();
+ method @NonNull public String getLaunchLocation();
+ method @Nullable public android.app.prediction.AppTarget getTarget();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ACTION_DISMISS = 2; // 0x2
+ field public static final int ACTION_LAUNCH = 1; // 0x1
+ field public static final int ACTION_PIN = 3; // 0x3
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR;
+ }
+
+ public static final class AppTargetEvent.Builder {
+ ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int);
+ method public android.app.prediction.AppTargetEvent build();
+ method public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(String);
+ }
+
+ public final class AppTargetId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
}
}
package android.app.role {
- public abstract interface OnRoleHoldersChangedListener {
- method public abstract void onRoleHoldersChanged(java.lang.String, android.os.UserHandle);
+ public interface OnRoleHoldersChangedListener {
+ method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle);
}
public final class RoleManager {
- method public void addOnRoleHoldersChangedListenerAsUser(java.util.concurrent.Executor, android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle);
- method public void addRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public boolean addRoleHolderFromController(java.lang.String, java.lang.String);
- method public void clearRoleHoldersAsUser(java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public java.util.List<java.lang.String> getHeldRolesFromController(java.lang.String);
- method public java.util.List<java.lang.String> getRoleHolders(java.lang.String);
- method public java.util.List<java.lang.String> getRoleHoldersAsUser(java.lang.String, android.os.UserHandle);
- method public void removeOnRoleHoldersChangedListenerAsUser(android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle);
- method public void removeRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public boolean removeRoleHolderFromController(java.lang.String, java.lang.String);
- method public void setRoleNamesFromController(java.util.List<java.lang.String>);
- field public static final java.lang.String EXTRA_REQUEST_ROLE_NAME = "android.app.role.extra.REQUEST_ROLE_NAME";
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void clearRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void removeRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>);
}
- public abstract interface RoleManagerCallback {
- method public abstract void onFailure();
- method public abstract void onSuccess();
+ public interface RoleManagerCallback {
+ method public void onFailure();
+ method public void onSuccess();
}
}
@@ -885,7 +1069,7 @@ package android.app.usage {
method public long getQuota();
method public int getUid();
method public android.app.usage.UsageStats getUsageStats();
- method public java.lang.String getVolumeUuid();
+ method public String getVolumeUuid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.CacheQuotaHint> CREATOR;
field public static final long QUOTA_NOT_SET = -1L; // 0xffffffffffffffffL
@@ -894,23 +1078,23 @@ package android.app.usage {
public static final class CacheQuotaHint.Builder {
ctor public CacheQuotaHint.Builder();
ctor public CacheQuotaHint.Builder(android.app.usage.CacheQuotaHint);
- method public android.app.usage.CacheQuotaHint build();
- method public android.app.usage.CacheQuotaHint.Builder setQuota(long);
- method public android.app.usage.CacheQuotaHint.Builder setUid(int);
- method public android.app.usage.CacheQuotaHint.Builder setUsageStats(android.app.usage.UsageStats);
- method public android.app.usage.CacheQuotaHint.Builder setVolumeUuid(java.lang.String);
+ method @NonNull public android.app.usage.CacheQuotaHint build();
+ method @NonNull public android.app.usage.CacheQuotaHint.Builder setQuota(long);
+ method @NonNull public android.app.usage.CacheQuotaHint.Builder setUid(int);
+ method @NonNull public android.app.usage.CacheQuotaHint.Builder setUsageStats(@Nullable android.app.usage.UsageStats);
+ method @NonNull public android.app.usage.CacheQuotaHint.Builder setVolumeUuid(@Nullable String);
}
public abstract class CacheQuotaService extends android.app.Service {
ctor public CacheQuotaService();
method public android.os.IBinder onBind(android.content.Intent);
method public abstract java.util.List<android.app.usage.CacheQuotaHint> onComputeCacheQuotaHints(java.util.List<android.app.usage.CacheQuotaHint>);
- field public static final java.lang.String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService";
+ field public static final String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService";
}
public static final class UsageEvents.Event {
method public int getInstanceId();
- method public java.lang.String getNotificationChannelId();
+ method public String getNotificationChannelId();
field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc
field public static final int NOTIFICATION_SEEN = 10; // 0xa
field public static final int SLICE_PINNED = 14; // 0xe
@@ -923,18 +1107,21 @@ package android.app.usage {
}
public final class UsageStatsManager {
- method public int getAppStandbyBucket(java.lang.String);
- method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets();
- method public void registerAppUsageObserver(int, java.lang.String[], long, java.util.concurrent.TimeUnit, android.app.PendingIntent);
- method public void registerUsageSessionObserver(int, java.lang.String[], long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit, android.app.PendingIntent, android.app.PendingIntent);
- method public void setAppStandbyBucket(java.lang.String, int);
- method public void setAppStandbyBuckets(java.util.Map<java.lang.String, java.lang.Integer>);
- method public void unregisterAppUsageObserver(int);
- method public void unregisterUsageSessionObserver(int);
- method public void whitelistAppTemporarily(java.lang.String, long, android.os.UserHandle);
- field public static final java.lang.String EXTRA_OBSERVER_ID = "android.app.usage.extra.OBSERVER_ID";
- field public static final java.lang.String EXTRA_TIME_LIMIT = "android.app.usage.extra.TIME_LIMIT";
- field public static final java.lang.String EXTRA_TIME_USED = "android.app.usage.extra.TIME_USED";
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
+ method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String);
+ method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String, long);
+ method public void reportUsageStop(@NonNull android.app.Activity, @NonNull String);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBucket(String, int);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(java.util.Map<java.lang.String,java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void unregisterAppUsageObserver(int);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void unregisterUsageSessionObserver(int);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void whitelistAppTemporarily(String, long, android.os.UserHandle);
+ field public static final String EXTRA_OBSERVER_ID = "android.app.usage.extra.OBSERVER_ID";
+ field public static final String EXTRA_TIME_LIMIT = "android.app.usage.extra.TIME_LIMIT";
+ field public static final String EXTRA_TIME_USED = "android.app.usage.extra.TIME_USED";
field public static final int STANDBY_BUCKET_EXEMPTED = 5; // 0x5
field public static final int STANDBY_BUCKET_NEVER = 50; // 0x32
}
@@ -946,31 +1133,31 @@ package android.bluetooth {
public final class BluetoothAdapter {
method public boolean disableBLE();
method public boolean enableBLE();
- method public boolean enableNoAutoConnect();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean enableNoAutoConnect();
method public boolean isBleScanAlwaysAvailable();
method public boolean isLeEnabled();
- field public static final java.lang.String ACTION_BLE_STATE_CHANGED = "android.bluetooth.adapter.action.BLE_STATE_CHANGED";
- field public static final java.lang.String ACTION_REQUEST_BLE_SCAN_ALWAYS_AVAILABLE = "android.bluetooth.adapter.action.REQUEST_BLE_SCAN_ALWAYS_AVAILABLE";
+ field public static final String ACTION_BLE_STATE_CHANGED = "android.bluetooth.adapter.action.BLE_STATE_CHANGED";
+ field public static final String ACTION_REQUEST_BLE_SCAN_ALWAYS_AVAILABLE = "android.bluetooth.adapter.action.REQUEST_BLE_SCAN_ALWAYS_AVAILABLE";
}
public final class BluetoothDevice implements android.os.Parcelable {
- method public boolean cancelBondProcess();
- method public boolean isConnected();
- method public boolean isEncrypted();
- method public boolean removeBond();
- method public boolean setPhonebookAccessPermission(int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean cancelBondProcess();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEncrypted();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean removeBond();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPhonebookAccessPermission(int);
field public static final int ACCESS_ALLOWED = 1; // 0x1
field public static final int ACCESS_REJECTED = 2; // 0x2
field public static final int ACCESS_UNKNOWN = 0; // 0x0
}
public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
- method public boolean connect(android.bluetooth.BluetoothDevice);
- method public boolean disconnect(android.bluetooth.BluetoothDevice);
- method public boolean setPriority(android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean connect(android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean disconnect(android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPriority(android.bluetooth.BluetoothDevice, int);
}
- public abstract interface BluetoothProfile {
+ public interface BluetoothProfile {
field public static final int PRIORITY_OFF = 0; // 0x0
field public static final int PRIORITY_ON = 100; // 0x64
}
@@ -980,8 +1167,8 @@ package android.bluetooth {
package android.bluetooth.le {
public final class BluetoothLeScanner {
- method public void startScanFromSource(android.os.WorkSource, android.bluetooth.le.ScanCallback);
- method public void startScanFromSource(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.os.WorkSource, android.bluetooth.le.ScanCallback);
+ method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_ADMIN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(android.os.WorkSource, android.bluetooth.le.ScanCallback);
+ method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_ADMIN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.os.WorkSource, android.bluetooth.le.ScanCallback);
method public void startTruncatedScan(java.util.List<android.bluetooth.le.TruncatedFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback);
}
@@ -1015,96 +1202,102 @@ package android.bluetooth.le {
package android.content {
public class ContentProviderClient implements java.lang.AutoCloseable android.content.ContentInterface {
- method public void setDetectNotResponding(long);
+ method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long);
}
public abstract class ContentResolver implements android.content.ContentInterface {
- method public android.graphics.drawable.Drawable getTypeDrawable(java.lang.String);
+ method public android.graphics.drawable.Drawable getTypeDrawable(String);
}
public abstract class Context {
- method public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public boolean bindServiceAsUser(@RequiresPermission android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
method public abstract android.content.Context createCredentialProtectedStorageContext();
- method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract java.io.File getPreloadsFileCache();
+ method public android.content.Context createPackageContextAsUser(String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Nullable public abstract java.io.File getPreloadsFileCache();
method public abstract boolean isCredentialProtectedStorage();
- method public abstract void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- method public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- method public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
- field public static final java.lang.String BACKUP_SERVICE = "backup";
- field public static final java.lang.String CONTEXTHUB_SERVICE = "contexthub";
- field public static final java.lang.String EUICC_CARD_SERVICE = "euicc_card";
- field public static final java.lang.String HDMI_CONTROL_SERVICE = "hdmi_control";
- field public static final java.lang.String NETWORK_SCORE_SERVICE = "network_score";
- field public static final java.lang.String OEM_LOCK_SERVICE = "oem_lock";
- field public static final java.lang.String PERMISSION_SERVICE = "permission";
- field public static final java.lang.String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
- field public static final java.lang.String ROLLBACK_SERVICE = "rollback";
- field public static final java.lang.String SECURE_ELEMENT_SERVICE = "secure_element";
- field public static final java.lang.String STATS_MANAGER = "stats";
- field public static final java.lang.String SYSTEM_UPDATE_SERVICE = "system_update";
- field public static final java.lang.String VR_SERVICE = "vrmanager";
- field public static final deprecated java.lang.String WIFI_RTT_SERVICE = "rttmanager";
- field public static final java.lang.String WIFI_SCANNING_SERVICE = "wifiscanner";
+ method public abstract void sendBroadcast(android.content.Intent, @Nullable String, @Nullable android.os.Bundle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, @Nullable android.os.Bundle);
+ method public abstract void sendOrderedBroadcast(@NonNull android.content.Intent, @Nullable String, @Nullable android.os.Bundle, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void startActivityAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
+ field public static final String APP_PREDICTION_SERVICE = "app_prediction";
+ field public static final String BACKUP_SERVICE = "backup";
+ field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
+ field public static final String CONTEXTHUB_SERVICE = "contexthub";
+ field public static final String EUICC_CARD_SERVICE = "euicc_card";
+ field public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
+ field public static final String NETWORK_SCORE_SERVICE = "network_score";
+ field public static final String OEM_LOCK_SERVICE = "oem_lock";
+ field public static final String PERMISSION_SERVICE = "permission";
+ field public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
+ field public static final String ROLLBACK_SERVICE = "rollback";
+ field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
+ field public static final String STATS_MANAGER = "stats";
+ field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
+ field public static final String VR_SERVICE = "vrmanager";
+ field @Deprecated public static final String WIFI_RTT_SERVICE = "rttmanager";
+ field public static final String WIFI_SCANNING_SERVICE = "wifiscanner";
}
public class ContextWrapper extends android.content.Context {
method public android.content.Context createCredentialProtectedStorageContext();
method public java.io.File getPreloadsFileCache();
method public boolean isCredentialProtectedStorage();
- method public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendBroadcast(android.content.Intent, String, android.os.Bundle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, String, android.os.Bundle);
+ method public void sendOrderedBroadcast(android.content.Intent, String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
}
public class Intent implements java.lang.Cloneable android.os.Parcelable {
- field public static final java.lang.String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED";
- field public static final java.lang.String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
- field public static final java.lang.String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED";
- field public static final java.lang.String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY";
- field public static final java.lang.String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
- field public static final java.lang.String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
- field public static final java.lang.String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
- field public static final java.lang.String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
- field public static final java.lang.String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
- field public static final java.lang.String ACTION_MANAGE_APP_PERMISSIONS = "android.intent.action.MANAGE_APP_PERMISSIONS";
- field public static final java.lang.String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS";
- field public static final java.lang.String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
- field public static final java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
- field public static final java.lang.String ACTION_PACKAGE_ROLLBACK_EXECUTED = "android.intent.action.PACKAGE_ROLLBACK_EXECUTED";
- field public static final java.lang.String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
- field public static final java.lang.String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
- field public static final java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
- field public static final java.lang.String ACTION_REVIEW_APP_PERMISSION_USAGE = "android.intent.action.REVIEW_APP_PERMISSION_USAGE";
- field public static final java.lang.String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS";
- field public static final java.lang.String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE";
- field public static final java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
- field public static final deprecated java.lang.String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
- field public static final java.lang.String ACTION_SPLIT_CONFIGURATION_CHANGED = "android.intent.action.SPLIT_CONFIGURATION_CHANGED";
- field public static final java.lang.String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
- field public static final java.lang.String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
- field public static final java.lang.String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
- field public static final java.lang.String CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS";
- field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.intent.extra.CALLING_PACKAGE";
- field public static final java.lang.String EXTRA_FORCE_FACTORY_RESET = "android.intent.extra.FORCE_FACTORY_RESET";
- field public static final java.lang.String EXTRA_INSTANT_APP_ACTION = "android.intent.extra.INSTANT_APP_ACTION";
- field public static final java.lang.String EXTRA_INSTANT_APP_BUNDLES = "android.intent.extra.INSTANT_APP_BUNDLES";
- field public static final java.lang.String EXTRA_INSTANT_APP_EXTRAS = "android.intent.extra.INSTANT_APP_EXTRAS";
- field public static final java.lang.String EXTRA_INSTANT_APP_FAILURE = "android.intent.extra.INSTANT_APP_FAILURE";
- field public static final java.lang.String EXTRA_INSTANT_APP_HOSTNAME = "android.intent.extra.INSTANT_APP_HOSTNAME";
- field public static final java.lang.String EXTRA_INSTANT_APP_SUCCESS = "android.intent.extra.INSTANT_APP_SUCCESS";
- field public static final java.lang.String EXTRA_INSTANT_APP_TOKEN = "android.intent.extra.INSTANT_APP_TOKEN";
- field public static final java.lang.String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE";
- field public static final java.lang.String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID";
- field public static final java.lang.String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";
- field public static final java.lang.String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
- field public static final java.lang.String EXTRA_REASON = "android.intent.extra.REASON";
- field public static final java.lang.String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK";
- field public static final java.lang.String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
- field public static final java.lang.String EXTRA_UNKNOWN_INSTANT_APP = "android.intent.extra.UNKNOWN_INSTANT_APP";
- field public static final java.lang.String EXTRA_VERIFICATION_BUNDLE = "android.intent.extra.VERIFICATION_BUNDLE";
- field public static final java.lang.String METADATA_SETUP_VERSION = "android.SETUP_VERSION";
+ field public static final String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED";
+ field public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
+ field public static final String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED";
+ field public static final String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY";
+ field public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
+ field public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
+ field public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
+ field public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
+ field public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
+ field public static final String ACTION_MANAGE_APP_PERMISSIONS = "android.intent.action.MANAGE_APP_PERMISSIONS";
+ field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP";
+ field public static final String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS";
+ field public static final String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
+ field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_SPECIAL_APP_ACCESSES = "android.intent.action.MANAGE_SPECIAL_APP_ACCESSES";
+ field public static final String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
+ field public static final String ACTION_PACKAGE_ROLLBACK_EXECUTED = "android.intent.action.PACKAGE_ROLLBACK_EXECUTED";
+ field public static final String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
+ field public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
+ field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
+ field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_APP_PERMISSION_USAGE = "android.intent.action.REVIEW_APP_PERMISSION_USAGE";
+ field public static final String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS";
+ field public static final String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE";
+ field public static final String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
+ field @Deprecated public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
+ field public static final String ACTION_SPLIT_CONFIGURATION_CHANGED = "android.intent.action.SPLIT_CONFIGURATION_CHANGED";
+ field public static final String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
+ field public static final String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
+ field public static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
+ field public static final String CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS";
+ field public static final String EXTRA_CALLING_PACKAGE = "android.intent.extra.CALLING_PACKAGE";
+ field public static final String EXTRA_FORCE_FACTORY_RESET = "android.intent.extra.FORCE_FACTORY_RESET";
+ field public static final String EXTRA_INSTANT_APP_ACTION = "android.intent.extra.INSTANT_APP_ACTION";
+ field public static final String EXTRA_INSTANT_APP_BUNDLES = "android.intent.extra.INSTANT_APP_BUNDLES";
+ field public static final String EXTRA_INSTANT_APP_EXTRAS = "android.intent.extra.INSTANT_APP_EXTRAS";
+ field public static final String EXTRA_INSTANT_APP_FAILURE = "android.intent.extra.INSTANT_APP_FAILURE";
+ field public static final String EXTRA_INSTANT_APP_HOSTNAME = "android.intent.extra.INSTANT_APP_HOSTNAME";
+ field public static final String EXTRA_INSTANT_APP_SUCCESS = "android.intent.extra.INSTANT_APP_SUCCESS";
+ field public static final String EXTRA_INSTANT_APP_TOKEN = "android.intent.extra.INSTANT_APP_TOKEN";
+ field public static final String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE";
+ field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID";
+ field public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";
+ field public static final String EXTRA_PERMISSION_GROUP_NAME = "android.intent.extra.PERMISSION_GROUP_NAME";
+ field public static final String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
+ field public static final String EXTRA_REASON = "android.intent.extra.REASON";
+ field public static final String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK";
+ field public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
+ field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
+ field public static final String EXTRA_UNKNOWN_INSTANT_APP = "android.intent.extra.UNKNOWN_INSTANT_APP";
+ field public static final String EXTRA_VERIFICATION_BUNDLE = "android.intent.extra.VERIFICATION_BUNDLE";
+ field public static final String METADATA_SETUP_VERSION = "android.SETUP_VERSION";
}
public class IntentFilter implements android.os.Parcelable {
@@ -1114,61 +1307,82 @@ package android.content {
}
+package android.content.om {
+
+ public final class OverlayInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public boolean isEnabled();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.content.om.OverlayInfo> CREATOR;
+ field public final String category;
+ field public final String packageName;
+ field public final String targetPackageName;
+ field public final int userId;
+ }
+
+ public class OverlayManager {
+ method public java.util.List<android.content.om.OverlayInfo> getOverlayInfosForTarget(@Nullable String, int);
+ method public boolean setEnabledExclusiveInCategory(@Nullable String, int);
+ }
+
+}
+
package android.content.pm {
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
+ method public boolean isEncryptionAware();
method public boolean isInstantApp();
- field public java.lang.String credentialProtectedDataDir;
+ field public String credentialProtectedDataDir;
field public int targetSandboxVersion;
}
public class CrossProfileApps {
- method public void startAnyActivity(android.content.ComponentName, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES) public void startActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
}
public final class InstantAppInfo implements android.os.Parcelable {
- ctor public InstantAppInfo(android.content.pm.ApplicationInfo, java.lang.String[], java.lang.String[]);
- ctor public InstantAppInfo(java.lang.String, java.lang.CharSequence, java.lang.String[], java.lang.String[]);
+ ctor public InstantAppInfo(android.content.pm.ApplicationInfo, String[], String[]);
+ ctor public InstantAppInfo(String, CharSequence, String[], String[]);
method public int describeContents();
- method public android.content.pm.ApplicationInfo getApplicationInfo();
- method public java.lang.String[] getGrantedPermissions();
- method public java.lang.String getPackageName();
- method public java.lang.String[] getRequestedPermissions();
- method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method @Nullable public android.content.pm.ApplicationInfo getApplicationInfo();
+ method @Nullable public String[] getGrantedPermissions();
+ method @NonNull public String getPackageName();
+ method @Nullable public String[] getRequestedPermissions();
+ method @NonNull public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.pm.PackageManager);
+ method @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.InstantAppInfo> CREATOR;
}
public final class InstantAppIntentFilter implements android.os.Parcelable {
- ctor public InstantAppIntentFilter(java.lang.String, java.util.List<android.content.IntentFilter>);
+ ctor public InstantAppIntentFilter(@Nullable String, @NonNull java.util.List<android.content.IntentFilter>);
method public int describeContents();
method public java.util.List<android.content.IntentFilter> getFilters();
- method public java.lang.String getSplitName();
+ method public String getSplitName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.InstantAppIntentFilter> CREATOR;
}
public final class InstantAppResolveInfo implements android.os.Parcelable {
- ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>, int);
- ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>, long, android.os.Bundle);
- ctor public InstantAppResolveInfo(java.lang.String, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>);
- ctor public InstantAppResolveInfo(android.os.Bundle);
+ ctor public InstantAppResolveInfo(@NonNull android.content.pm.InstantAppResolveInfo.InstantAppDigest, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>, int);
+ ctor public InstantAppResolveInfo(@NonNull android.content.pm.InstantAppResolveInfo.InstantAppDigest, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>, long, @Nullable android.os.Bundle);
+ ctor public InstantAppResolveInfo(@NonNull String, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>);
+ ctor public InstantAppResolveInfo(@Nullable android.os.Bundle);
method public int describeContents();
method public byte[] getDigestBytes();
method public int getDigestPrefix();
- method public android.os.Bundle getExtras();
+ method @Nullable public android.os.Bundle getExtras();
method public java.util.List<android.content.pm.InstantAppIntentFilter> getIntentFilters();
method public long getLongVersionCode();
- method public java.lang.String getPackageName();
- method public deprecated int getVersionCode();
+ method public String getPackageName();
+ method @Deprecated public int getVersionCode();
method public boolean shouldLetInstallerDecide();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.InstantAppResolveInfo> CREATOR;
}
public static final class InstantAppResolveInfo.InstantAppDigest implements android.os.Parcelable {
- ctor public InstantAppResolveInfo.InstantAppDigest(java.lang.String);
+ ctor public InstantAppResolveInfo.InstantAppDigest(@NonNull String);
method public int describeContents();
method public byte[][] getDigestBytes();
method public int[] getDigestPrefix();
@@ -1180,91 +1394,92 @@ package android.content.pm {
public final class IntentFilterVerificationInfo implements android.os.Parcelable {
method public int describeContents();
method public java.util.Set<java.lang.String> getDomains();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.IntentFilterVerificationInfo> CREATOR;
}
public class PackageInstaller {
- method public void setPermissionsResult(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
}
public static class PackageInstaller.Session implements java.io.Closeable {
- method public void commitTransferred(android.content.IntentSender);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void commitTransferred(@NonNull android.content.IntentSender);
}
public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
method public boolean getAllocateAggressive();
method public boolean getAllowDowngrade();
method public boolean getDontKillApp();
- method public java.lang.String[] getGrantedRuntimePermissions();
+ method @Nullable public String[] getGrantedRuntimePermissions();
method public boolean getInstallAsFullApp(boolean);
method public boolean getInstallAsInstantApp(boolean);
method public boolean getInstallAsVirtualPreload();
}
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
- method public void setAllocateAggressive(boolean);
+ method @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public void setAllocateAggressive(boolean);
method public void setAllowDowngrade(boolean);
method public void setDontKillApp(boolean);
method public void setEnableRollback();
- method public void setGrantedRuntimePermissions(java.lang.String[]);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]);
method public void setInstallAsInstantApp(boolean);
method public void setInstallAsVirtualPreload();
}
public class PackageItemInfo {
method public static void forceSafeLabels();
- method public deprecated java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
- method public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int);
- field public static final deprecated int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4
- field public static final deprecated int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2
- field public static final deprecated int SAFE_LABEL_FLAG_TRIM = 1; // 0x1
+ method @Deprecated @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager);
+ method @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager, @FloatRange(from=0) float, int);
+ field @Deprecated public static final int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4
+ field @Deprecated public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2
+ field @Deprecated public static final int SAFE_LABEL_FLAG_TRIM = 1; // 0x1
}
public abstract class PackageManager {
- method public abstract void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
+ method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
method public abstract boolean arePermissionsIndividuallyControlled();
- method public abstract java.util.List<android.content.IntentFilter> getAllIntentFilters(java.lang.String);
- method public android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.dex.ArtManager getArtManager();
- method public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
- method public java.lang.CharSequence getHarmfulAppWarning(java.lang.String);
- method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
- method public abstract android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
+ method public abstract java.util.List<android.content.IntentFilter> getAllIntentFilters(String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @NonNull public android.content.pm.dex.ArtManager getArtManager();
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public CharSequence getHarmfulAppWarning(@NonNull String);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract android.graphics.drawable.Drawable getInstantAppIcon(String);
method public abstract android.content.ComponentName getInstantAppInstallerComponent();
method public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
- method public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps();
- method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
- method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
- method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
- method public java.lang.String[] getUnsuspendablePackages(java.lang.String[]);
- method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivitiesAsUser(android.content.Intent, int, android.os.UserHandle);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProvidersAsUser(android.content.Intent, int, android.os.UserHandle);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentServicesAsUser(android.content.Intent, int, android.os.UserHandle);
- method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
- method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
- method public deprecated void replacePreferredActivity(android.content.IntentFilter, int, java.util.List<android.content.ComponentName>, android.content.ComponentName);
- method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps();
+ method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(String);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract int getIntentVerificationStatusAsUser(String, int);
+ method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle);
+ method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] getUnsuspendablePackages(@NonNull String[]);
+ method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
+ method public abstract int installExistingPackage(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract int installExistingPackage(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
+ method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentActivitiesAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
+ method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProvidersAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
+ method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentServicesAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
+ method public abstract void registerDexModule(String, @Nullable android.content.pm.PackageManager.DexModuleRegisterCallback);
+ method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
+ method @Deprecated public void replacePreferredActivity(@NonNull android.content.IntentFilter, int, @NonNull java.util.List<android.content.ComponentName>, @NonNull android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
method public void sendDeviceCustomizationReadyBroadcast();
- method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
- method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
- method public deprecated java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
- method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, android.content.pm.SuspendDialogInfo);
- method public abstract void setUpdateAvailable(java.lang.String, boolean);
- method public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
- method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
- method public abstract void verifyIntentFilter(int, int, java.util.List<java.lang.String>);
- field public static final java.lang.String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
- field public static final java.lang.String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
- field public static final java.lang.String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
- field public static final java.lang.String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
- field public static final java.lang.String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
+ method @RequiresPermission(allOf={android.Manifest.permission.SET_PREFERRED_APPLICATIONS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public abstract boolean setDefaultBrowserPackageNameAsUser(String, int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setDistractingPackageRestrictions(@NonNull String[], @android.content.pm.PackageManager.DistractionRestriction int);
+ method @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public void setHarmfulAppWarning(@NonNull String, @Nullable CharSequence);
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setPackagesSuspended(@Nullable String[], boolean, @Nullable android.os.PersistableBundle, @Nullable android.os.PersistableBundle, @Nullable String);
+ method @Nullable @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setPackagesSuspended(@Nullable String[], boolean, @Nullable android.os.PersistableBundle, @Nullable android.os.PersistableBundle, @Nullable android.content.pm.SuspendDialogInfo);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public abstract void setUpdateAvailable(String, boolean);
+ method @RequiresPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS) public abstract boolean updateIntentVerificationStatusAsUser(String, int, int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract void updatePermissionFlags(String, String, @android.content.pm.PackageManager.PermissionFlags int, @android.content.pm.PackageManager.PermissionFlags int, @NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, java.util.List<java.lang.String>);
+ field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
+ field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
+ field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
+ field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
+ field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
field public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 32; // 0x20
field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40
@@ -1320,37 +1535,60 @@ package android.content.pm {
field public static final int MATCH_ANY_USER = 4194304; // 0x400000
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
field public static final int MATCH_INSTANT = 8388608; // 0x800000
+ field public static final int RESTRICTION_HIDE_FROM_SUGGESTIONS = 1; // 0x1
+ field public static final int RESTRICTION_HIDE_NOTIFICATIONS = 2; // 0x2
+ field public static final int RESTRICTION_NONE = 0; // 0x0
}
- public static abstract class PackageManager.DexModuleRegisterCallback {
+ public abstract static class PackageManager.DexModuleRegisterCallback {
ctor public PackageManager.DexModuleRegisterCallback();
- method public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);
+ method public abstract void onDexModuleRegistered(String, boolean, String);
+ }
+
+ @IntDef(flag=true, prefix={"RESTRICTION_"}, value={android.content.pm.PackageManager.RESTRICTION_NONE, android.content.pm.PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS, android.content.pm.PackageManager.RESTRICTION_HIDE_NOTIFICATIONS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.DistractionRestriction {
}
- public static abstract interface PackageManager.OnPermissionsChangedListener {
- method public abstract void onPermissionsChanged(int);
+ public static interface PackageManager.OnPermissionsChangedListener {
+ method public void onPermissionsChanged(int);
}
- public static abstract class PackageManager.PermissionFlags implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
}
public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- field public int backgroundRequestDetailResourceId;
- field public int backgroundRequestResourceId;
- field public int requestDetailResourceId;
- field public int requestRes;
+ field @StringRes public int backgroundRequestDetailResourceId;
+ field @StringRes public int backgroundRequestResourceId;
+ field @StringRes public int requestDetailResourceId;
+ field @StringRes public int requestRes;
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
field public static final int FLAG_REMOVED = 2; // 0x2
+ field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000
field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000
field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000
- field public java.lang.String backgroundPermission;
+ field public String backgroundPermission;
field public int requestRes;
}
+ public class ResolveInfo implements android.os.Parcelable {
+ field public boolean handleAllWebDataURI;
+ }
+
+ public class ShortcutManager {
+ method @NonNull public java.util.List<android.content.pm.ShortcutManager.ShareShortcutInfo> getShareTargets(@NonNull android.content.IntentFilter);
+ }
+
+ public static final class ShortcutManager.ShareShortcutInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.content.pm.ShortcutInfo getShortcutInfo();
+ method public android.content.ComponentName getTargetComponent();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.content.pm.ShortcutManager.ShareShortcutInfo> CREATOR;
+ }
+
public final class SuspendDialogInfo implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
@@ -1359,12 +1597,12 @@ package android.content.pm {
public static final class SuspendDialogInfo.Builder {
ctor public SuspendDialogInfo.Builder();
- method public android.content.pm.SuspendDialogInfo build();
- method public android.content.pm.SuspendDialogInfo.Builder setIcon(int);
- method public android.content.pm.SuspendDialogInfo.Builder setMessage(java.lang.String);
- method public android.content.pm.SuspendDialogInfo.Builder setMessage(int);
- method public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonText(int);
- method public android.content.pm.SuspendDialogInfo.Builder setTitle(int);
+ method @NonNull public android.content.pm.SuspendDialogInfo build();
+ method @NonNull public android.content.pm.SuspendDialogInfo.Builder setIcon(@DrawableRes int);
+ method @NonNull public android.content.pm.SuspendDialogInfo.Builder setMessage(@NonNull String);
+ method @NonNull public android.content.pm.SuspendDialogInfo.Builder setMessage(@StringRes int);
+ method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonText(@StringRes int);
+ method @NonNull public android.content.pm.SuspendDialogInfo.Builder setTitle(@StringRes int);
}
}
@@ -1372,8 +1610,8 @@ package android.content.pm {
package android.content.pm.dex {
public class ArtManager {
- method public boolean isRuntimeProfilingEnabled(int);
- method public void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, java.util.concurrent.Executor, android.content.pm.dex.ArtManager.SnapshotRuntimeProfileCallback);
+ method @RequiresPermission(allOf={android.Manifest.permission.READ_RUNTIME_PROFILES, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean isRuntimeProfilingEnabled(int);
+ method @RequiresPermission(allOf={android.Manifest.permission.READ_RUNTIME_PROFILES, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void snapshotRuntimeProfile(int, @Nullable String, @Nullable String, @NonNull java.util.concurrent.Executor, @NonNull android.content.pm.dex.ArtManager.SnapshotRuntimeProfileCallback);
field public static final int PROFILE_APPS = 0; // 0x0
field public static final int PROFILE_BOOT_IMAGE = 1; // 0x1
field public static final int SNAPSHOT_FAILED_CODE_PATH_NOT_FOUND = 1; // 0x1
@@ -1381,7 +1619,7 @@ package android.content.pm.dex {
field public static final int SNAPSHOT_FAILED_PACKAGE_NOT_FOUND = 0; // 0x0
}
- public static abstract class ArtManager.SnapshotRuntimeProfileCallback {
+ public abstract static class ArtManager.SnapshotRuntimeProfileCallback {
ctor public ArtManager.SnapshotRuntimeProfileCallback();
method public abstract void onError(int);
method public abstract void onSuccess(android.os.ParcelFileDescriptor);
@@ -1391,14 +1629,14 @@ package android.content.pm.dex {
package android.content.pm.permission {
- public final deprecated class RuntimePermissionPresentationInfo implements android.os.Parcelable {
- ctor public RuntimePermissionPresentationInfo(java.lang.CharSequence, boolean, boolean);
- method public int describeContents();
- method public java.lang.CharSequence getLabel();
- method public boolean isGranted();
- method public boolean isStandard();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.content.pm.permission.RuntimePermissionPresentationInfo> CREATOR;
+ @Deprecated public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
+ ctor @Deprecated public RuntimePermissionPresentationInfo(CharSequence, boolean, boolean);
+ method @Deprecated public int describeContents();
+ method @Deprecated @NonNull public CharSequence getLabel();
+ method @Deprecated public boolean isGranted();
+ method @Deprecated public boolean isStandard();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.content.pm.permission.RuntimePermissionPresentationInfo> CREATOR;
}
}
@@ -1406,13 +1644,13 @@ package android.content.pm.permission {
package android.content.rollback {
public final class PackageRollbackInfo implements android.os.Parcelable {
- ctor public PackageRollbackInfo(java.lang.String, android.content.rollback.PackageRollbackInfo.PackageVersion, android.content.rollback.PackageRollbackInfo.PackageVersion);
+ ctor public PackageRollbackInfo(String, android.content.rollback.PackageRollbackInfo.PackageVersion, android.content.rollback.PackageRollbackInfo.PackageVersion);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.rollback.PackageRollbackInfo> CREATOR;
field public final android.content.rollback.PackageRollbackInfo.PackageVersion higherVersion;
field public final android.content.rollback.PackageRollbackInfo.PackageVersion lowerVersion;
- field public final java.lang.String packageName;
+ field public final String packageName;
}
public static class PackageRollbackInfo.PackageVersion {
@@ -1428,12 +1666,12 @@ package android.content.rollback {
}
public final class RollbackManager {
- method public void executeRollback(android.content.rollback.RollbackInfo, android.content.IntentSender);
- method public void expireRollbackForPackage(java.lang.String);
- method public android.content.rollback.RollbackInfo getAvailableRollback(java.lang.String);
- method public java.util.List<java.lang.String> getPackagesWithAvailableRollbacks();
- method public java.util.List<android.content.rollback.RollbackInfo> getRecentlyExecutedRollbacks();
- method public void reloadPersistedData();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void executeRollback(@NonNull android.content.rollback.RollbackInfo, @NonNull android.content.IntentSender);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @Nullable public android.content.rollback.RollbackInfo getAvailableRollback(@NonNull String);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @NonNull public java.util.List<java.lang.String> getPackagesWithAvailableRollbacks();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getRecentlyExecutedRollbacks();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void reloadPersistedData();
}
}
@@ -1443,8 +1681,8 @@ package android.hardware {
public final class Sensor {
method public java.util.UUID getUuid();
method public boolean isDataInjectionSupported();
- field public static final java.lang.String STRING_TYPE_DYNAMIC_SENSOR_META = "android.sensor.dynamic_sensor_meta";
- field public static final java.lang.String STRING_TYPE_WRIST_TILT_GESTURE = "android.sensor.wrist_tilt_gesture";
+ field public static final String STRING_TYPE_DYNAMIC_SENSOR_META = "android.sensor.dynamic_sensor_meta";
+ field public static final String STRING_TYPE_WRIST_TILT_GESTURE = "android.sensor.wrist_tilt_gesture";
field public static final int TYPE_DYNAMIC_SENSOR_META = 32; // 0x20
field public static final int TYPE_WRIST_TILT_GESTURE = 26; // 0x1a
}
@@ -1459,7 +1697,7 @@ package android.hardware {
package android.hardware.camera2 {
public abstract class CameraDevice implements java.lang.AutoCloseable {
- method public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
field public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // 0x1
field public static final int SESSION_OPERATION_MODE_NORMAL = 0; // 0x0
field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000
@@ -1470,8 +1708,8 @@ package android.hardware.camera2 {
package android.hardware.camera2.params {
public final class OutputConfiguration implements android.os.Parcelable {
- ctor public OutputConfiguration(android.view.Surface, int);
- ctor public OutputConfiguration(int, android.view.Surface, int);
+ ctor public OutputConfiguration(@NonNull android.view.Surface, int);
+ ctor public OutputConfiguration(int, @NonNull android.view.Surface, int);
method public int getRotation();
field public static final int ROTATION_0 = 0; // 0x0
field public static final int ROTATION_180 = 2; // 0x2
@@ -1505,33 +1743,52 @@ package android.hardware.display {
field public final long[] luxTimestamps;
field public final float[] luxValues;
field public final boolean nightMode;
- field public final java.lang.String packageName;
+ field public final String packageName;
field public final float powerBrightnessFactor;
field public final long timeStamp;
}
public final class BrightnessConfiguration implements android.os.Parcelable {
method public int describeContents();
- method public android.util.Pair<float[], float[]> getCurve();
+ method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int);
+ method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(String);
+ method public android.util.Pair<float[],float[]> getCurve();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
}
public static class BrightnessConfiguration.Builder {
ctor public BrightnessConfiguration.Builder(float[], float[]);
+ method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, android.hardware.display.BrightnessCorrection);
+ method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(String, android.hardware.display.BrightnessCorrection);
method public android.hardware.display.BrightnessConfiguration build();
- method public android.hardware.display.BrightnessConfiguration.Builder setDescription(java.lang.String);
+ method public int getMaxCorrectionsByCategory();
+ method public int getMaxCorrectionsByPackageName();
+ method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
+ }
+
+ public final class BrightnessCorrection implements android.os.Parcelable {
+ method public float apply(float);
+ method @NonNull public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR;
+ }
+
+ public final class ColorDisplayManager {
+ method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setAppSaturationLevel(@NonNull String, @IntRange(from=0, to=100) int);
+ method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setSaturationLevel(@IntRange(from=0, to=100) int);
}
public final class DisplayManager {
- method public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
- method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
- method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
- method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
- method public android.util.Pair<float[], float[]> getMinimumBrightnessCurve();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS) public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
+ method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
+ method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
+ method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
+ method public android.util.Pair<float[],float[]> getMinimumBrightnessCurve();
method public android.graphics.Point getStableDisplaySize();
- method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
- method public void setSaturationLevel(float);
+ method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_SATURATION) public void setSaturationLevel(float);
}
}
@@ -1542,17 +1799,17 @@ package android.hardware.hdmi {
method public android.hardware.hdmi.HdmiDeviceInfo getActiveSource();
method public void sendKeyEvent(int, boolean);
method public void sendVendorCommand(int, byte[], boolean);
- method public void setVendorCommandListener(android.hardware.hdmi.HdmiControlManager.VendorCommandListener);
+ method public void setVendorCommandListener(@NonNull android.hardware.hdmi.HdmiControlManager.VendorCommandListener);
}
public final class HdmiControlManager {
- method public void addHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
- method public android.hardware.hdmi.HdmiClient getClient(int);
- method public android.hardware.hdmi.HdmiPlaybackClient getPlaybackClient();
- method public android.hardware.hdmi.HdmiTvClient getTvClient();
- method public void removeHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
- method public void setStandbyMode(boolean);
- field public static final java.lang.String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE";
+ method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
+ method @Nullable public android.hardware.hdmi.HdmiClient getClient(int);
+ method @Nullable public android.hardware.hdmi.HdmiPlaybackClient getPlaybackClient();
+ method @Nullable public android.hardware.hdmi.HdmiTvClient getTvClient();
+ method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
+ method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setStandbyMode(boolean);
+ field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE";
field public static final int AVR_VOLUME_MUTED = 101; // 0x65
field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2
field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0
@@ -1568,8 +1825,8 @@ package android.hardware.hdmi {
field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1
field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2
field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3
- field public static final java.lang.String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1";
- field public static final java.lang.String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID";
+ field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1";
+ field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID";
field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12
field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33
field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31
@@ -1605,7 +1862,7 @@ package android.hardware.hdmi {
field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2
field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3
field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff
- field public static final deprecated int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4
+ field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4
field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7
field public static final int RESULT_EXCEPTION = 5; // 0x5
field public static final int RESULT_INCORRECT_MODE = 6; // 0x6
@@ -1640,13 +1897,13 @@ package android.hardware.hdmi {
field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa
}
- public static abstract interface HdmiControlManager.HotplugEventListener {
- method public abstract void onReceived(android.hardware.hdmi.HdmiHotplugEvent);
+ public static interface HdmiControlManager.HotplugEventListener {
+ method public void onReceived(android.hardware.hdmi.HdmiHotplugEvent);
}
- public static abstract interface HdmiControlManager.VendorCommandListener {
- method public abstract void onControlStateChanged(boolean, int);
- method public abstract void onReceived(int, int, byte[], boolean);
+ public static interface HdmiControlManager.VendorCommandListener {
+ method public void onControlStateChanged(boolean, int);
+ method public void onReceived(int, int, byte[], boolean);
}
public class HdmiDeviceInfo implements android.os.Parcelable {
@@ -1656,7 +1913,7 @@ package android.hardware.hdmi {
method public int getDeviceId();
method public int getDevicePowerStatus();
method public int getDeviceType();
- method public java.lang.String getDisplayName();
+ method public String getDisplayName();
method public int getId();
method public int getLogicalAddress();
method public int getPhysicalAddress();
@@ -1701,12 +1958,12 @@ package android.hardware.hdmi {
method public void sendStandby();
}
- public static abstract interface HdmiPlaybackClient.DisplayStatusCallback {
- method public abstract void onComplete(int);
+ public static interface HdmiPlaybackClient.DisplayStatusCallback {
+ method public void onComplete(int);
}
- public static abstract interface HdmiPlaybackClient.OneTouchPlayCallback {
- method public abstract void onComplete(int);
+ public static interface HdmiPlaybackClient.OneTouchPlayCallback {
+ method public void onComplete(int);
}
public final class HdmiPortInfo implements android.os.Parcelable {
@@ -1763,7 +2020,7 @@ package android.hardware.hdmi {
public static final class HdmiRecordSources.OwnSource extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
}
- public static abstract class HdmiRecordSources.RecordSource {
+ public abstract static class HdmiRecordSources.RecordSource {
}
public class HdmiTimerRecordSources {
@@ -1799,34 +2056,34 @@ package android.hardware.hdmi {
public final class HdmiTvClient extends android.hardware.hdmi.HdmiClient {
method public void clearTimerRecording(int, int, android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource);
- method public void deviceSelect(int, android.hardware.hdmi.HdmiTvClient.SelectCallback);
+ method public void deviceSelect(int, @NonNull android.hardware.hdmi.HdmiTvClient.SelectCallback);
method public java.util.List<android.hardware.hdmi.HdmiDeviceInfo> getDeviceList();
method public int getDeviceType();
- method public void portSelect(int, android.hardware.hdmi.HdmiTvClient.SelectCallback);
+ method public void portSelect(int, @NonNull android.hardware.hdmi.HdmiTvClient.SelectCallback);
method public void sendMhlVendorCommand(int, int, int, byte[]);
method public void sendStandby(int);
method public void setHdmiMhlVendorCommandListener(android.hardware.hdmi.HdmiTvClient.HdmiMhlVendorCommandListener);
method public void setInputChangeListener(android.hardware.hdmi.HdmiTvClient.InputChangeListener);
- method public void setRecordListener(android.hardware.hdmi.HdmiRecordListener);
+ method public void setRecordListener(@NonNull android.hardware.hdmi.HdmiRecordListener);
method public void setSystemAudioMode(boolean, android.hardware.hdmi.HdmiTvClient.SelectCallback);
method public void setSystemAudioMute(boolean);
method public void setSystemAudioVolume(int, int, int);
- method public void startOneTouchRecord(int, android.hardware.hdmi.HdmiRecordSources.RecordSource);
+ method public void startOneTouchRecord(int, @NonNull android.hardware.hdmi.HdmiRecordSources.RecordSource);
method public void startTimerRecording(int, int, android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource);
method public void stopOneTouchRecord(int);
field public static final int VENDOR_DATA_SIZE = 16; // 0x10
}
- public static abstract interface HdmiTvClient.HdmiMhlVendorCommandListener {
- method public abstract void onReceived(int, int, int, byte[]);
+ public static interface HdmiTvClient.HdmiMhlVendorCommandListener {
+ method public void onReceived(int, int, int, byte[]);
}
- public static abstract interface HdmiTvClient.InputChangeListener {
- method public abstract void onChanged(android.hardware.hdmi.HdmiDeviceInfo);
+ public static interface HdmiTvClient.InputChangeListener {
+ method public void onChanged(android.hardware.hdmi.HdmiDeviceInfo);
}
- public static abstract interface HdmiTvClient.SelectCallback {
- method public abstract void onComplete(int);
+ public static interface HdmiTvClient.SelectCallback {
+ method public void onComplete(int);
}
}
@@ -1835,8 +2092,8 @@ package android.hardware.location {
public class ContextHubClient implements java.io.Closeable {
method public void close();
- method public android.hardware.location.ContextHubInfo getAttachedHub();
- method public int sendMessageToNanoApp(android.hardware.location.NanoAppMessage);
+ method @NonNull public android.hardware.location.ContextHubInfo getAttachedHub();
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int sendMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage);
}
public class ContextHubClientCallback {
@@ -1860,7 +2117,7 @@ package android.hardware.location {
method public int getId();
method public int getMaxPacketLengthBytes();
method public android.hardware.location.MemoryRegion[] getMemoryRegions();
- method public java.lang.String getName();
+ method public String getName();
method public float getPeakMips();
method public float getPeakPowerDrawMw();
method public int getPlatformVersion();
@@ -1868,42 +2125,42 @@ package android.hardware.location {
method public int getStaticSwVersion();
method public float getStoppedPowerDrawMw();
method public int[] getSupportedSensors();
- method public java.lang.String getToolchain();
+ method public String getToolchain();
method public int getToolchainVersion();
- method public java.lang.String getVendor();
+ method public String getVendor();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubInfo> CREATOR;
}
public class ContextHubIntentEvent {
- method public static android.hardware.location.ContextHubIntentEvent fromIntent(android.content.Intent);
- method public android.hardware.location.ContextHubInfo getContextHubInfo();
+ method @NonNull public static android.hardware.location.ContextHubIntentEvent fromIntent(@NonNull android.content.Intent);
+ method @NonNull public android.hardware.location.ContextHubInfo getContextHubInfo();
method public int getEventType();
method public int getNanoAppAbortCode();
method public long getNanoAppId();
- method public android.hardware.location.NanoAppMessage getNanoAppMessage();
+ method @NonNull public android.hardware.location.NanoAppMessage getNanoAppMessage();
}
public final class ContextHubManager {
- method public android.hardware.location.ContextHubClient createClient(android.hardware.location.ContextHubInfo, android.hardware.location.ContextHubClientCallback, java.util.concurrent.Executor);
- method public android.hardware.location.ContextHubClient createClient(android.hardware.location.ContextHubInfo, android.hardware.location.ContextHubClientCallback);
- method public android.hardware.location.ContextHubClient createClient(android.hardware.location.ContextHubInfo, android.app.PendingIntent, long);
- method public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(android.hardware.location.ContextHubInfo, long);
- method public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(android.hardware.location.ContextHubInfo, long);
- method public deprecated int[] findNanoAppOnHub(int, android.hardware.location.NanoAppFilter);
- method public deprecated int[] getContextHubHandles();
- method public deprecated android.hardware.location.ContextHubInfo getContextHubInfo(int);
- method public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
- method public deprecated android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
- method public deprecated int loadNanoApp(int, android.hardware.location.NanoApp);
- method public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(android.hardware.location.ContextHubInfo, android.hardware.location.NanoAppBinary);
- method public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(android.hardware.location.ContextHubInfo);
- method public deprecated int registerCallback(android.hardware.location.ContextHubManager.Callback);
- method public deprecated int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
- method public deprecated int sendMessage(int, int, android.hardware.location.ContextHubMessage);
- method public deprecated int unloadNanoApp(int);
- method public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(android.hardware.location.ContextHubInfo, long);
- method public deprecated int unregisterCallback(android.hardware.location.ContextHubManager.Callback);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] getContextHubHandles();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
+ method @Deprecated public int registerCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
+ method @Deprecated public int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int sendMessage(int, int, @NonNull android.hardware.location.ContextHubMessage);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int unloadNanoApp(int);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @Deprecated public int unregisterCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
field public static final int EVENT_HUB_RESET = 6; // 0x6
field public static final int EVENT_NANOAPP_ABORTED = 4; // 0x4
field public static final int EVENT_NANOAPP_DISABLED = 3; // 0x3
@@ -1911,36 +2168,36 @@ package android.hardware.location {
field public static final int EVENT_NANOAPP_LOADED = 0; // 0x0
field public static final int EVENT_NANOAPP_MESSAGE = 5; // 0x5
field public static final int EVENT_NANOAPP_UNLOADED = 1; // 0x1
- field public static final java.lang.String EXTRA_CONTEXT_HUB_INFO = "android.hardware.location.extra.CONTEXT_HUB_INFO";
- field public static final java.lang.String EXTRA_EVENT_TYPE = "android.hardware.location.extra.EVENT_TYPE";
- field public static final java.lang.String EXTRA_MESSAGE = "android.hardware.location.extra.MESSAGE";
- field public static final java.lang.String EXTRA_NANOAPP_ABORT_CODE = "android.hardware.location.extra.NANOAPP_ABORT_CODE";
- field public static final java.lang.String EXTRA_NANOAPP_ID = "android.hardware.location.extra.NANOAPP_ID";
+ field public static final String EXTRA_CONTEXT_HUB_INFO = "android.hardware.location.extra.CONTEXT_HUB_INFO";
+ field public static final String EXTRA_EVENT_TYPE = "android.hardware.location.extra.EVENT_TYPE";
+ field public static final String EXTRA_MESSAGE = "android.hardware.location.extra.MESSAGE";
+ field public static final String EXTRA_NANOAPP_ABORT_CODE = "android.hardware.location.extra.NANOAPP_ABORT_CODE";
+ field public static final String EXTRA_NANOAPP_ID = "android.hardware.location.extra.NANOAPP_ID";
}
- public static abstract deprecated class ContextHubManager.Callback {
- ctor protected ContextHubManager.Callback();
- method public abstract void onMessageReceipt(int, int, android.hardware.location.ContextHubMessage);
+ @Deprecated public abstract static class ContextHubManager.Callback {
+ ctor @Deprecated protected ContextHubManager.Callback();
+ method @Deprecated public abstract void onMessageReceipt(int, int, @NonNull android.hardware.location.ContextHubMessage);
}
- public deprecated class ContextHubMessage implements android.os.Parcelable {
- ctor public ContextHubMessage(int, int, byte[]);
- method public int describeContents();
- method public byte[] getData();
- method public int getMsgType();
- method public int getVersion();
- method public void setMsgData(byte[]);
- method public void setMsgType(int);
- method public void setVersion(int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubMessage> CREATOR;
+ @Deprecated public class ContextHubMessage implements android.os.Parcelable {
+ ctor @Deprecated public ContextHubMessage(int, int, byte[]);
+ method @Deprecated public int describeContents();
+ method @Deprecated public byte[] getData();
+ method @Deprecated public int getMsgType();
+ method @Deprecated public int getVersion();
+ method @Deprecated public void setMsgData(byte[]);
+ method @Deprecated public void setMsgType(int);
+ method @Deprecated public void setVersion(int);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubMessage> CREATOR;
}
public class ContextHubTransaction<T> {
method public int getType();
- method public void setOnCompleteListener(android.hardware.location.ContextHubTransaction.OnCompleteListener<T>, java.util.concurrent.Executor);
- method public void setOnCompleteListener(android.hardware.location.ContextHubTransaction.OnCompleteListener<T>);
- method public static java.lang.String typeToString(int, boolean);
+ method public void setOnCompleteListener(@NonNull android.hardware.location.ContextHubTransaction.OnCompleteListener<T>, @NonNull java.util.concurrent.Executor);
+ method public void setOnCompleteListener(@NonNull android.hardware.location.ContextHubTransaction.OnCompleteListener<T>);
+ method public static String typeToString(int, boolean);
method public android.hardware.location.ContextHubTransaction.Response<T> waitForResponse(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
field public static final int RESULT_FAILED_AT_HUB = 5; // 0x5
field public static final int RESULT_FAILED_BAD_PARAMS = 2; // 0x2
@@ -1958,8 +2215,8 @@ package android.hardware.location {
field public static final int TYPE_UNLOAD_NANOAPP = 1; // 0x1
}
- public static abstract interface ContextHubTransaction.OnCompleteListener<L> {
- method public abstract void onComplete(android.hardware.location.ContextHubTransaction<L>, android.hardware.location.ContextHubTransaction.Response<L>);
+ @java.lang.FunctionalInterface public static interface ContextHubTransaction.OnCompleteListener<L> {
+ method public void onComplete(android.hardware.location.ContextHubTransaction<L>, android.hardware.location.ContextHubTransaction.Response<L>);
}
public static class ContextHubTransaction.Response<R> {
@@ -2009,7 +2266,7 @@ package android.hardware.location {
public abstract class GeofenceHardwareMonitorCallback {
ctor public GeofenceHardwareMonitorCallback();
- method public deprecated void onMonitoringSystemChange(int, boolean, android.location.Location);
+ method @Deprecated public void onMonitoringSystemChange(int, boolean, android.location.Location);
method public void onMonitoringSystemChange(android.hardware.location.GeofenceHardwareMonitorEvent);
}
@@ -2054,33 +2311,33 @@ package android.hardware.location {
field public static final android.os.Parcelable.Creator<android.hardware.location.MemoryRegion> CREATOR;
}
- public deprecated class NanoApp implements android.os.Parcelable {
- ctor public NanoApp();
- ctor public deprecated NanoApp(int, byte[]);
- ctor public NanoApp(long, byte[]);
- method public int describeContents();
- method public byte[] getAppBinary();
- method public long getAppId();
- method public int getAppVersion();
- method public java.lang.String getName();
- method public int getNeededExecMemBytes();
- method public int getNeededReadMemBytes();
- method public int[] getNeededSensors();
- method public int getNeededWriteMemBytes();
- method public int[] getOutputEvents();
- method public java.lang.String getPublisher();
- method public void setAppBinary(byte[]);
- method public void setAppId(long);
- method public void setAppVersion(int);
- method public void setName(java.lang.String);
- method public void setNeededExecMemBytes(int);
- method public void setNeededReadMemBytes(int);
- method public void setNeededSensors(int[]);
- method public void setNeededWriteMemBytes(int);
- method public void setOutputEvents(int[]);
- method public void setPublisher(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.hardware.location.NanoApp> CREATOR;
+ @Deprecated public class NanoApp implements android.os.Parcelable {
+ ctor @Deprecated public NanoApp();
+ ctor @Deprecated public NanoApp(int, byte[]);
+ ctor @Deprecated public NanoApp(long, byte[]);
+ method @Deprecated public int describeContents();
+ method @Deprecated public byte[] getAppBinary();
+ method @Deprecated public long getAppId();
+ method @Deprecated public int getAppVersion();
+ method @Deprecated public String getName();
+ method @Deprecated public int getNeededExecMemBytes();
+ method @Deprecated public int getNeededReadMemBytes();
+ method @Deprecated public int[] getNeededSensors();
+ method @Deprecated public int getNeededWriteMemBytes();
+ method @Deprecated public int[] getOutputEvents();
+ method @Deprecated public String getPublisher();
+ method @Deprecated public void setAppBinary(byte[]);
+ method @Deprecated public void setAppId(long);
+ method @Deprecated public void setAppVersion(int);
+ method @Deprecated public void setName(String);
+ method @Deprecated public void setNeededExecMemBytes(int);
+ method @Deprecated public void setNeededReadMemBytes(int);
+ method @Deprecated public void setNeededSensors(int[]);
+ method @Deprecated public void setNeededWriteMemBytes(int);
+ method @Deprecated public void setOutputEvents(int[]);
+ method @Deprecated public void setPublisher(String);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.hardware.location.NanoApp> CREATOR;
}
public final class NanoAppBinary implements android.os.Parcelable {
@@ -2102,37 +2359,37 @@ package android.hardware.location {
field public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppBinary> CREATOR;
}
- public deprecated class NanoAppFilter implements android.os.Parcelable {
- ctor public NanoAppFilter(long, int, int, long);
- method public int describeContents();
- method public boolean testMatch(android.hardware.location.NanoAppInstanceInfo);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int APP_ANY = -1; // 0xffffffff
- field public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppFilter> CREATOR;
- field public static final int FLAGS_VERSION_ANY = -1; // 0xffffffff
- field public static final int FLAGS_VERSION_GREAT_THAN = 2; // 0x2
- field public static final int FLAGS_VERSION_LESS_THAN = 4; // 0x4
- field public static final int FLAGS_VERSION_STRICTLY_EQUAL = 8; // 0x8
- field public static final int HUB_ANY = -1; // 0xffffffff
- field public static final int VENDOR_ANY = -1; // 0xffffffff
- }
-
- public deprecated class NanoAppInstanceInfo implements android.os.Parcelable {
- ctor public NanoAppInstanceInfo();
- method public int describeContents();
- method public long getAppId();
- method public int getAppVersion();
- method public int getContexthubId();
- method public int getHandle();
- method public java.lang.String getName();
- method public int getNeededExecMemBytes();
- method public int getNeededReadMemBytes();
- method public int[] getNeededSensors();
- method public int getNeededWriteMemBytes();
- method public int[] getOutputEvents();
- method public java.lang.String getPublisher();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppInstanceInfo> CREATOR;
+ @Deprecated public class NanoAppFilter implements android.os.Parcelable {
+ ctor @Deprecated public NanoAppFilter(long, int, int, long);
+ method @Deprecated public int describeContents();
+ method @Deprecated public boolean testMatch(android.hardware.location.NanoAppInstanceInfo);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final int APP_ANY = -1; // 0xffffffff
+ field @Deprecated public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppFilter> CREATOR;
+ field @Deprecated public static final int FLAGS_VERSION_ANY = -1; // 0xffffffff
+ field @Deprecated public static final int FLAGS_VERSION_GREAT_THAN = 2; // 0x2
+ field @Deprecated public static final int FLAGS_VERSION_LESS_THAN = 4; // 0x4
+ field @Deprecated public static final int FLAGS_VERSION_STRICTLY_EQUAL = 8; // 0x8
+ field @Deprecated public static final int HUB_ANY = -1; // 0xffffffff
+ field @Deprecated public static final int VENDOR_ANY = -1; // 0xffffffff
+ }
+
+ @Deprecated public class NanoAppInstanceInfo implements android.os.Parcelable {
+ ctor @Deprecated public NanoAppInstanceInfo();
+ method @Deprecated public int describeContents();
+ method @Deprecated public long getAppId();
+ method @Deprecated public int getAppVersion();
+ method @Deprecated public int getContexthubId();
+ method @Deprecated public int getHandle();
+ method @Deprecated public String getName();
+ method @Deprecated public int getNeededExecMemBytes();
+ method @Deprecated public int getNeededReadMemBytes();
+ method @Deprecated @NonNull public int[] getNeededSensors();
+ method @Deprecated public int getNeededWriteMemBytes();
+ method @Deprecated @NonNull public int[] getOutputEvents();
+ method @Deprecated public String getPublisher();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppInstanceInfo> CREATOR;
}
public final class NanoAppMessage implements android.os.Parcelable {
@@ -2163,9 +2420,9 @@ package android.hardware.radio {
public final class Announcement implements android.os.Parcelable {
method public int describeContents();
- method public android.hardware.radio.ProgramSelector getSelector();
+ method @NonNull public android.hardware.radio.ProgramSelector getSelector();
method public int getType();
- method public java.util.Map<java.lang.String, java.lang.String> getVendorInfo();
+ method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.Announcement> CREATOR;
field public static final int TYPE_EMERGENCY = 1; // 0x1
@@ -2178,55 +2435,55 @@ package android.hardware.radio {
field public static final int TYPE_WEATHER = 4; // 0x4
}
- public static abstract interface Announcement.OnListUpdatedListener {
- method public abstract void onListUpdated(java.util.Collection<android.hardware.radio.Announcement>);
+ public static interface Announcement.OnListUpdatedListener {
+ method public void onListUpdated(java.util.Collection<android.hardware.radio.Announcement>);
}
public final class ProgramList implements java.lang.AutoCloseable {
- method public void addOnCompleteListener(java.util.concurrent.Executor, android.hardware.radio.ProgramList.OnCompleteListener);
- method public void addOnCompleteListener(android.hardware.radio.ProgramList.OnCompleteListener);
+ method public void addOnCompleteListener(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.radio.ProgramList.OnCompleteListener);
+ method public void addOnCompleteListener(@NonNull android.hardware.radio.ProgramList.OnCompleteListener);
method public void close();
- method public android.hardware.radio.RadioManager.ProgramInfo get(android.hardware.radio.ProgramSelector.Identifier);
- method public void registerListCallback(java.util.concurrent.Executor, android.hardware.radio.ProgramList.ListCallback);
- method public void registerListCallback(android.hardware.radio.ProgramList.ListCallback);
- method public void removeOnCompleteListener(android.hardware.radio.ProgramList.OnCompleteListener);
- method public java.util.List<android.hardware.radio.RadioManager.ProgramInfo> toList();
- method public void unregisterListCallback(android.hardware.radio.ProgramList.ListCallback);
+ method @Nullable public android.hardware.radio.RadioManager.ProgramInfo get(@NonNull android.hardware.radio.ProgramSelector.Identifier);
+ method public void registerListCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.radio.ProgramList.ListCallback);
+ method public void registerListCallback(@NonNull android.hardware.radio.ProgramList.ListCallback);
+ method public void removeOnCompleteListener(@NonNull android.hardware.radio.ProgramList.OnCompleteListener);
+ method @NonNull public java.util.List<android.hardware.radio.RadioManager.ProgramInfo> toList();
+ method public void unregisterListCallback(@NonNull android.hardware.radio.ProgramList.ListCallback);
}
public static final class ProgramList.Filter implements android.os.Parcelable {
- ctor public ProgramList.Filter(java.util.Set<java.lang.Integer>, java.util.Set<android.hardware.radio.ProgramSelector.Identifier>, boolean, boolean);
+ ctor public ProgramList.Filter(@NonNull java.util.Set<java.lang.Integer>, @NonNull java.util.Set<android.hardware.radio.ProgramSelector.Identifier>, boolean, boolean);
method public boolean areCategoriesIncluded();
method public boolean areModificationsExcluded();
method public int describeContents();
- method public java.util.Set<java.lang.Integer> getIdentifierTypes();
- method public java.util.Set<android.hardware.radio.ProgramSelector.Identifier> getIdentifiers();
+ method @NonNull public java.util.Set<java.lang.Integer> getIdentifierTypes();
+ method @NonNull public java.util.Set<android.hardware.radio.ProgramSelector.Identifier> getIdentifiers();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramList.Filter> CREATOR;
}
- public static abstract class ProgramList.ListCallback {
+ public abstract static class ProgramList.ListCallback {
ctor public ProgramList.ListCallback();
- method public void onItemChanged(android.hardware.radio.ProgramSelector.Identifier);
- method public void onItemRemoved(android.hardware.radio.ProgramSelector.Identifier);
+ method public void onItemChanged(@NonNull android.hardware.radio.ProgramSelector.Identifier);
+ method public void onItemRemoved(@NonNull android.hardware.radio.ProgramSelector.Identifier);
}
- public static abstract interface ProgramList.OnCompleteListener {
- method public abstract void onComplete();
+ public static interface ProgramList.OnCompleteListener {
+ method public void onComplete();
}
public final class ProgramSelector implements android.os.Parcelable {
- ctor public ProgramSelector(int, android.hardware.radio.ProgramSelector.Identifier, android.hardware.radio.ProgramSelector.Identifier[], long[]);
- method public static android.hardware.radio.ProgramSelector createAmFmSelector(int, int);
- method public static android.hardware.radio.ProgramSelector createAmFmSelector(int, int, int);
- method public int describeContents();
- method public android.hardware.radio.ProgramSelector.Identifier[] getAllIds(int);
- method public long getFirstId(int);
- method public android.hardware.radio.ProgramSelector.Identifier getPrimaryId();
- method public deprecated int getProgramType();
- method public android.hardware.radio.ProgramSelector.Identifier[] getSecondaryIds();
- method public deprecated long[] getVendorIds();
- method public android.hardware.radio.ProgramSelector withSecondaryPreferred(android.hardware.radio.ProgramSelector.Identifier);
+ ctor public ProgramSelector(@android.hardware.radio.ProgramSelector.ProgramType int, @NonNull android.hardware.radio.ProgramSelector.Identifier, @Nullable android.hardware.radio.ProgramSelector.Identifier[], @Nullable long[]);
+ method @NonNull public static android.hardware.radio.ProgramSelector createAmFmSelector(@android.hardware.radio.RadioManager.Band int, int);
+ method @NonNull public static android.hardware.radio.ProgramSelector createAmFmSelector(@android.hardware.radio.RadioManager.Band int, int, int);
+ method public int describeContents();
+ method @NonNull public android.hardware.radio.ProgramSelector.Identifier[] getAllIds(@android.hardware.radio.ProgramSelector.IdentifierType int);
+ method public long getFirstId(@android.hardware.radio.ProgramSelector.IdentifierType int);
+ method @NonNull public android.hardware.radio.ProgramSelector.Identifier getPrimaryId();
+ method @Deprecated @android.hardware.radio.ProgramSelector.ProgramType public int getProgramType();
+ method @NonNull public android.hardware.radio.ProgramSelector.Identifier[] getSecondaryIds();
+ method @Deprecated @NonNull public long[] getVendorIds();
+ method @NonNull public android.hardware.radio.ProgramSelector withSecondaryPreferred(@NonNull android.hardware.radio.ProgramSelector.Identifier);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector> CREATOR;
field public static final int IDENTIFIER_TYPE_AMFM_FREQUENCY = 1; // 0x1
@@ -2236,52 +2493,52 @@ package android.hardware.radio {
field public static final int IDENTIFIER_TYPE_DAB_SIDECC = 5; // 0x5
field public static final int IDENTIFIER_TYPE_DAB_SID_EXT = 5; // 0x5
field public static final int IDENTIFIER_TYPE_DRMO_FREQUENCY = 10; // 0xa
- field public static final deprecated int IDENTIFIER_TYPE_DRMO_MODULATION = 11; // 0xb
+ field @Deprecated public static final int IDENTIFIER_TYPE_DRMO_MODULATION = 11; // 0xb
field public static final int IDENTIFIER_TYPE_DRMO_SERVICE_ID = 9; // 0x9
field public static final int IDENTIFIER_TYPE_HD_STATION_ID_EXT = 3; // 0x3
field public static final int IDENTIFIER_TYPE_HD_STATION_NAME = 10004; // 0x2714
- field public static final deprecated int IDENTIFIER_TYPE_HD_SUBCHANNEL = 4; // 0x4
+ field @Deprecated public static final int IDENTIFIER_TYPE_HD_SUBCHANNEL = 4; // 0x4
field public static final int IDENTIFIER_TYPE_INVALID = 0; // 0x0
field public static final int IDENTIFIER_TYPE_RDS_PI = 2; // 0x2
field public static final int IDENTIFIER_TYPE_SXM_CHANNEL = 13; // 0xd
field public static final int IDENTIFIER_TYPE_SXM_SERVICE_ID = 12; // 0xc
field public static final int IDENTIFIER_TYPE_VENDOR_END = 1999; // 0x7cf
- field public static final deprecated int IDENTIFIER_TYPE_VENDOR_PRIMARY_END = 1999; // 0x7cf
- field public static final deprecated int IDENTIFIER_TYPE_VENDOR_PRIMARY_START = 1000; // 0x3e8
+ field @Deprecated public static final int IDENTIFIER_TYPE_VENDOR_PRIMARY_END = 1999; // 0x7cf
+ field @Deprecated public static final int IDENTIFIER_TYPE_VENDOR_PRIMARY_START = 1000; // 0x3e8
field public static final int IDENTIFIER_TYPE_VENDOR_START = 1000; // 0x3e8
- field public static final deprecated int PROGRAM_TYPE_AM = 1; // 0x1
- field public static final deprecated int PROGRAM_TYPE_AM_HD = 3; // 0x3
- field public static final deprecated int PROGRAM_TYPE_DAB = 5; // 0x5
- field public static final deprecated int PROGRAM_TYPE_DRMO = 6; // 0x6
- field public static final deprecated int PROGRAM_TYPE_FM = 2; // 0x2
- field public static final deprecated int PROGRAM_TYPE_FM_HD = 4; // 0x4
- field public static final deprecated int PROGRAM_TYPE_INVALID = 0; // 0x0
- field public static final deprecated int PROGRAM_TYPE_SXM = 7; // 0x7
- field public static final deprecated int PROGRAM_TYPE_VENDOR_END = 1999; // 0x7cf
- field public static final deprecated int PROGRAM_TYPE_VENDOR_START = 1000; // 0x3e8
+ field @Deprecated public static final int PROGRAM_TYPE_AM = 1; // 0x1
+ field @Deprecated public static final int PROGRAM_TYPE_AM_HD = 3; // 0x3
+ field @Deprecated public static final int PROGRAM_TYPE_DAB = 5; // 0x5
+ field @Deprecated public static final int PROGRAM_TYPE_DRMO = 6; // 0x6
+ field @Deprecated public static final int PROGRAM_TYPE_FM = 2; // 0x2
+ field @Deprecated public static final int PROGRAM_TYPE_FM_HD = 4; // 0x4
+ field @Deprecated public static final int PROGRAM_TYPE_INVALID = 0; // 0x0
+ field @Deprecated public static final int PROGRAM_TYPE_SXM = 7; // 0x7
+ field @Deprecated public static final int PROGRAM_TYPE_VENDOR_END = 1999; // 0x7cf
+ field @Deprecated public static final int PROGRAM_TYPE_VENDOR_START = 1000; // 0x3e8
}
public static final class ProgramSelector.Identifier implements android.os.Parcelable {
- ctor public ProgramSelector.Identifier(int, long);
+ ctor public ProgramSelector.Identifier(@android.hardware.radio.ProgramSelector.IdentifierType int, long);
method public int describeContents();
- method public int getType();
+ method @android.hardware.radio.ProgramSelector.IdentifierType public int getType();
method public long getValue();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector.Identifier> CREATOR;
}
- public static abstract class ProgramSelector.IdentifierType implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"IDENTIFIER_TYPE_"}, value={android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_INVALID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_RDS_PI, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_SUBCHANNEL, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_STATION_NAME, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SCID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_MODULATION, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL}) @IntRange(from=android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_VENDOR_START, to=android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_VENDOR_END) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ProgramSelector.IdentifierType {
}
- public static abstract deprecated class ProgramSelector.ProgramType implements java.lang.annotation.Annotation {
+ @Deprecated @IntDef(prefix={"PROGRAM_TYPE_"}, value={android.hardware.radio.ProgramSelector.PROGRAM_TYPE_INVALID, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_AM, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_FM, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_AM_HD, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_FM_HD, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_DAB, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_DRMO, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_SXM}) @IntRange(from=android.hardware.radio.ProgramSelector.PROGRAM_TYPE_VENDOR_START, to=android.hardware.radio.ProgramSelector.PROGRAM_TYPE_VENDOR_END) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ProgramSelector.ProgramType {
}
public class RadioManager {
- method public void addAnnouncementListener(java.util.Set<java.lang.Integer>, android.hardware.radio.Announcement.OnListUpdatedListener);
- method public void addAnnouncementListener(java.util.concurrent.Executor, java.util.Set<java.lang.Integer>, android.hardware.radio.Announcement.OnListUpdatedListener);
- method public int listModules(java.util.List<android.hardware.radio.RadioManager.ModuleProperties>);
- method public android.hardware.radio.RadioTuner openTuner(int, android.hardware.radio.RadioManager.BandConfig, boolean, android.hardware.radio.RadioTuner.Callback, android.os.Handler);
- method public void removeAnnouncementListener(android.hardware.radio.Announcement.OnListUpdatedListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.Set<java.lang.Integer>, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.Set<java.lang.Integer>, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public int listModules(java.util.List<android.hardware.radio.RadioManager.ModuleProperties>);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public android.hardware.radio.RadioTuner openTuner(int, android.hardware.radio.RadioManager.BandConfig, boolean, android.hardware.radio.RadioTuner.Callback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void removeAnnouncementListener(@NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
field public static final int BAND_AM = 0; // 0x0
field public static final int BAND_AM_HD = 3; // 0x3
field public static final int BAND_FM = 1; // 0x1
@@ -2331,7 +2588,7 @@ package android.hardware.radio {
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.AmBandDescriptor> CREATOR;
}
- public static abstract class RadioManager.Band implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"BAND_"}, value={android.hardware.radio.RadioManager.BAND_INVALID, android.hardware.radio.RadioManager.BAND_AM, android.hardware.radio.RadioManager.BAND_FM, android.hardware.radio.RadioManager.BAND_AM_HD, android.hardware.radio.RadioManager.BAND_FM_HD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RadioManager.Band {
}
public static class RadioManager.BandConfig implements android.os.Parcelable {
@@ -2391,37 +2648,37 @@ package android.hardware.radio {
method public int describeContents();
method public android.hardware.radio.RadioManager.BandDescriptor[] getBands();
method public int getClassId();
- method public java.util.Map<java.lang.String, java.lang.Integer> getDabFrequencyTable();
+ method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDabFrequencyTable();
method public int getId();
- method public java.lang.String getImplementor();
+ method public String getImplementor();
method public int getNumAudioSources();
method public int getNumTuners();
- method public java.lang.String getProduct();
- method public java.lang.String getSerial();
- method public java.lang.String getServiceName();
- method public java.util.Map<java.lang.String, java.lang.String> getVendorInfo();
- method public java.lang.String getVersion();
+ method public String getProduct();
+ method public String getSerial();
+ method @NonNull public String getServiceName();
+ method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
+ method public String getVersion();
method public boolean isBackgroundScanningSupported();
method public boolean isCaptureSupported();
method public boolean isInitializationRequired();
- method public boolean isProgramIdentifierSupported(int);
- method public boolean isProgramTypeSupported(int);
+ method public boolean isProgramIdentifierSupported(@android.hardware.radio.ProgramSelector.IdentifierType int);
+ method public boolean isProgramTypeSupported(@android.hardware.radio.ProgramSelector.ProgramType int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.ModuleProperties> CREATOR;
}
public static class RadioManager.ProgramInfo implements android.os.Parcelable {
method public int describeContents();
- method public deprecated int getChannel();
- method public android.hardware.radio.ProgramSelector.Identifier getLogicallyTunedTo();
+ method @Deprecated public int getChannel();
+ method @Nullable public android.hardware.radio.ProgramSelector.Identifier getLogicallyTunedTo();
method public android.hardware.radio.RadioMetadata getMetadata();
- method public android.hardware.radio.ProgramSelector.Identifier getPhysicallyTunedTo();
- method public java.util.Collection<android.hardware.radio.ProgramSelector.Identifier> getRelatedContent();
- method public android.hardware.radio.ProgramSelector getSelector();
+ method @Nullable public android.hardware.radio.ProgramSelector.Identifier getPhysicallyTunedTo();
+ method @Nullable public java.util.Collection<android.hardware.radio.ProgramSelector.Identifier> getRelatedContent();
+ method @NonNull public android.hardware.radio.ProgramSelector getSelector();
method public int getSignalStrength();
- method public deprecated int getSubChannel();
- method public java.util.Map<java.lang.String, java.lang.String> getVendorInfo();
- method public deprecated boolean isDigital();
+ method @Deprecated public int getSubChannel();
+ method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
+ method @Deprecated public boolean isDigital();
method public boolean isLive();
method public boolean isMuted();
method public boolean isStereo();
@@ -2433,45 +2690,45 @@ package android.hardware.radio {
}
public final class RadioMetadata implements android.os.Parcelable {
- method public boolean containsKey(java.lang.String);
+ method public boolean containsKey(String);
method public int describeContents();
- method public deprecated android.graphics.Bitmap getBitmap(java.lang.String);
- method public android.hardware.radio.RadioMetadata.Clock getClock(java.lang.String);
- method public int getInt(java.lang.String);
- method public java.lang.String getString(java.lang.String);
+ method @Deprecated public android.graphics.Bitmap getBitmap(String);
+ method public android.hardware.radio.RadioMetadata.Clock getClock(String);
+ method public int getInt(String);
+ method public String getString(String);
method public java.util.Set<java.lang.String> keySet();
method public int size();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioMetadata> CREATOR;
- field public static final java.lang.String METADATA_KEY_ALBUM = "android.hardware.radio.metadata.ALBUM";
- field public static final java.lang.String METADATA_KEY_ART = "android.hardware.radio.metadata.ART";
- field public static final java.lang.String METADATA_KEY_ARTIST = "android.hardware.radio.metadata.ARTIST";
- field public static final java.lang.String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK";
- field public static final java.lang.String METADATA_KEY_DAB_COMPONENT_NAME = "android.hardware.radio.metadata.DAB_COMPONENT_NAME";
- field public static final java.lang.String METADATA_KEY_DAB_COMPONENT_NAME_SHORT = "android.hardware.radio.metadata.DAB_COMPONENT_NAME_SHORT";
- field public static final java.lang.String METADATA_KEY_DAB_ENSEMBLE_NAME = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME";
- field public static final java.lang.String METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME_SHORT";
- field public static final java.lang.String METADATA_KEY_DAB_SERVICE_NAME = "android.hardware.radio.metadata.DAB_SERVICE_NAME";
- field public static final java.lang.String METADATA_KEY_DAB_SERVICE_NAME_SHORT = "android.hardware.radio.metadata.DAB_SERVICE_NAME_SHORT";
- field public static final java.lang.String METADATA_KEY_GENRE = "android.hardware.radio.metadata.GENRE";
- field public static final java.lang.String METADATA_KEY_ICON = "android.hardware.radio.metadata.ICON";
- field public static final java.lang.String METADATA_KEY_PROGRAM_NAME = "android.hardware.radio.metadata.PROGRAM_NAME";
- field public static final java.lang.String METADATA_KEY_RBDS_PTY = "android.hardware.radio.metadata.RBDS_PTY";
- field public static final java.lang.String METADATA_KEY_RDS_PI = "android.hardware.radio.metadata.RDS_PI";
- field public static final java.lang.String METADATA_KEY_RDS_PS = "android.hardware.radio.metadata.RDS_PS";
- field public static final java.lang.String METADATA_KEY_RDS_PTY = "android.hardware.radio.metadata.RDS_PTY";
- field public static final java.lang.String METADATA_KEY_RDS_RT = "android.hardware.radio.metadata.RDS_RT";
- field public static final java.lang.String METADATA_KEY_TITLE = "android.hardware.radio.metadata.TITLE";
+ field public static final String METADATA_KEY_ALBUM = "android.hardware.radio.metadata.ALBUM";
+ field public static final String METADATA_KEY_ART = "android.hardware.radio.metadata.ART";
+ field public static final String METADATA_KEY_ARTIST = "android.hardware.radio.metadata.ARTIST";
+ field public static final String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK";
+ field public static final String METADATA_KEY_DAB_COMPONENT_NAME = "android.hardware.radio.metadata.DAB_COMPONENT_NAME";
+ field public static final String METADATA_KEY_DAB_COMPONENT_NAME_SHORT = "android.hardware.radio.metadata.DAB_COMPONENT_NAME_SHORT";
+ field public static final String METADATA_KEY_DAB_ENSEMBLE_NAME = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME";
+ field public static final String METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME_SHORT";
+ field public static final String METADATA_KEY_DAB_SERVICE_NAME = "android.hardware.radio.metadata.DAB_SERVICE_NAME";
+ field public static final String METADATA_KEY_DAB_SERVICE_NAME_SHORT = "android.hardware.radio.metadata.DAB_SERVICE_NAME_SHORT";
+ field public static final String METADATA_KEY_GENRE = "android.hardware.radio.metadata.GENRE";
+ field public static final String METADATA_KEY_ICON = "android.hardware.radio.metadata.ICON";
+ field public static final String METADATA_KEY_PROGRAM_NAME = "android.hardware.radio.metadata.PROGRAM_NAME";
+ field public static final String METADATA_KEY_RBDS_PTY = "android.hardware.radio.metadata.RBDS_PTY";
+ field public static final String METADATA_KEY_RDS_PI = "android.hardware.radio.metadata.RDS_PI";
+ field public static final String METADATA_KEY_RDS_PS = "android.hardware.radio.metadata.RDS_PS";
+ field public static final String METADATA_KEY_RDS_PTY = "android.hardware.radio.metadata.RDS_PTY";
+ field public static final String METADATA_KEY_RDS_RT = "android.hardware.radio.metadata.RDS_RT";
+ field public static final String METADATA_KEY_TITLE = "android.hardware.radio.metadata.TITLE";
}
public static final class RadioMetadata.Builder {
ctor public RadioMetadata.Builder();
ctor public RadioMetadata.Builder(android.hardware.radio.RadioMetadata);
method public android.hardware.radio.RadioMetadata build();
- method public android.hardware.radio.RadioMetadata.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
- method public android.hardware.radio.RadioMetadata.Builder putClock(java.lang.String, long, int);
- method public android.hardware.radio.RadioMetadata.Builder putInt(java.lang.String, int);
- method public android.hardware.radio.RadioMetadata.Builder putString(java.lang.String, java.lang.String);
+ method public android.hardware.radio.RadioMetadata.Builder putBitmap(String, android.graphics.Bitmap);
+ method public android.hardware.radio.RadioMetadata.Builder putClock(String, long, int);
+ method public android.hardware.radio.RadioMetadata.Builder putInt(String, int);
+ method public android.hardware.radio.RadioMetadata.Builder putString(String, String);
}
public static final class RadioMetadata.Clock implements android.os.Parcelable {
@@ -2488,53 +2745,53 @@ package android.hardware.radio {
method public abstract int cancel();
method public abstract void cancelAnnouncement();
method public abstract void close();
- method public abstract deprecated int getConfiguration(android.hardware.radio.RadioManager.BandConfig[]);
- method public android.hardware.radio.ProgramList getDynamicProgramList(android.hardware.radio.ProgramList.Filter);
+ method @Deprecated public abstract int getConfiguration(android.hardware.radio.RadioManager.BandConfig[]);
+ method @Nullable public android.hardware.radio.ProgramList getDynamicProgramList(@Nullable android.hardware.radio.ProgramList.Filter);
method public abstract boolean getMute();
- method public java.util.Map<java.lang.String, java.lang.String> getParameters(java.util.List<java.lang.String>);
- method public abstract deprecated int getProgramInformation(android.hardware.radio.RadioManager.ProgramInfo[]);
- method public abstract deprecated java.util.List<android.hardware.radio.RadioManager.ProgramInfo> getProgramList(java.util.Map<java.lang.String, java.lang.String>);
+ method @NonNull public java.util.Map<java.lang.String,java.lang.String> getParameters(@NonNull java.util.List<java.lang.String>);
+ method @Deprecated public abstract int getProgramInformation(android.hardware.radio.RadioManager.ProgramInfo[]);
+ method @Deprecated @NonNull public abstract java.util.List<android.hardware.radio.RadioManager.ProgramInfo> getProgramList(@Nullable java.util.Map<java.lang.String,java.lang.String>);
method public abstract boolean hasControl();
- method public abstract deprecated boolean isAnalogForced();
- method public abstract deprecated boolean isAntennaConnected();
+ method @Deprecated public abstract boolean isAnalogForced();
+ method @Deprecated public abstract boolean isAntennaConnected();
method public boolean isConfigFlagSet(int);
method public boolean isConfigFlagSupported(int);
method public abstract int scan(int, boolean);
- method public abstract deprecated void setAnalogForced(boolean);
+ method @Deprecated public abstract void setAnalogForced(boolean);
method public void setConfigFlag(int, boolean);
- method public abstract deprecated int setConfiguration(android.hardware.radio.RadioManager.BandConfig);
+ method @Deprecated public abstract int setConfiguration(android.hardware.radio.RadioManager.BandConfig);
method public abstract int setMute(boolean);
- method public java.util.Map<java.lang.String, java.lang.String> setParameters(java.util.Map<java.lang.String, java.lang.String>);
+ method @NonNull public java.util.Map<java.lang.String,java.lang.String> setParameters(@NonNull java.util.Map<java.lang.String,java.lang.String>);
method public abstract boolean startBackgroundScan();
method public abstract int step(int, boolean);
- method public abstract deprecated int tune(int, int);
- method public abstract void tune(android.hardware.radio.ProgramSelector);
+ method @Deprecated public abstract int tune(int, int);
+ method public abstract void tune(@NonNull android.hardware.radio.ProgramSelector);
field public static final int DIRECTION_DOWN = 1; // 0x1
field public static final int DIRECTION_UP = 0; // 0x0
- field public static final deprecated int ERROR_BACKGROUND_SCAN_FAILED = 6; // 0x6
- field public static final deprecated int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5; // 0x5
- field public static final deprecated int ERROR_CANCELLED = 2; // 0x2
- field public static final deprecated int ERROR_CONFIG = 4; // 0x4
- field public static final deprecated int ERROR_HARDWARE_FAILURE = 0; // 0x0
- field public static final deprecated int ERROR_SCAN_TIMEOUT = 3; // 0x3
- field public static final deprecated int ERROR_SERVER_DIED = 1; // 0x1
+ field @Deprecated public static final int ERROR_BACKGROUND_SCAN_FAILED = 6; // 0x6
+ field @Deprecated public static final int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5; // 0x5
+ field @Deprecated public static final int ERROR_CANCELLED = 2; // 0x2
+ field @Deprecated public static final int ERROR_CONFIG = 4; // 0x4
+ field @Deprecated public static final int ERROR_HARDWARE_FAILURE = 0; // 0x0
+ field @Deprecated public static final int ERROR_SCAN_TIMEOUT = 3; // 0x3
+ field @Deprecated public static final int ERROR_SERVER_DIED = 1; // 0x1
}
- public static abstract class RadioTuner.Callback {
+ public abstract static class RadioTuner.Callback {
ctor public RadioTuner.Callback();
method public void onAntennaState(boolean);
method public void onBackgroundScanAvailabilityChange(boolean);
method public void onBackgroundScanComplete();
- method public deprecated void onConfigurationChanged(android.hardware.radio.RadioManager.BandConfig);
+ method @Deprecated public void onConfigurationChanged(android.hardware.radio.RadioManager.BandConfig);
method public void onControlChanged(boolean);
method public void onEmergencyAnnouncement(boolean);
- method public deprecated void onError(int);
- method public deprecated void onMetadataChanged(android.hardware.radio.RadioMetadata);
- method public void onParametersUpdated(java.util.Map<java.lang.String, java.lang.String>);
+ method @Deprecated public void onError(int);
+ method @Deprecated public void onMetadataChanged(android.hardware.radio.RadioMetadata);
+ method public void onParametersUpdated(@NonNull java.util.Map<java.lang.String,java.lang.String>);
method public void onProgramInfoChanged(android.hardware.radio.RadioManager.ProgramInfo);
method public void onProgramListChanged();
method public void onTrafficAnnouncement(boolean);
- method public void onTuneFailed(int, android.hardware.radio.ProgramSelector);
+ method public void onTuneFailed(int, @Nullable android.hardware.radio.ProgramSelector);
}
}
@@ -2546,7 +2803,7 @@ package android.hardware.soundtrigger {
}
public static class SoundTrigger.RecognitionEvent {
- method public android.media.AudioFormat getCaptureFormat();
+ method @Nullable public android.media.AudioFormat getCaptureFormat();
method public int getCaptureSession();
method public byte[] getData();
method public boolean isCaptureAvailable();
@@ -2561,14 +2818,14 @@ package android.hardware.usb {
}
public class UsbManager {
- method public java.util.List<android.hardware.usb.UsbPort> getPorts();
- method public void grantPermission(android.hardware.usb.UsbDevice, java.lang.String);
- field public static final java.lang.String ACTION_USB_PORT_CHANGED = "android.hardware.usb.action.USB_PORT_CHANGED";
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_USB) public java.util.List<android.hardware.usb.UsbPort> getPorts();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void grantPermission(android.hardware.usb.UsbDevice, String);
+ field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_PORT_CHANGED = "android.hardware.usb.action.USB_PORT_CHANGED";
}
public final class UsbPort {
- method public android.hardware.usb.UsbPortStatus getStatus();
- method public void setRoles(int, int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USB) @Nullable public android.hardware.usb.UsbPortStatus getStatus();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setRoles(int, int);
}
public final class UsbPortStatus implements android.os.Parcelable {
@@ -2608,7 +2865,7 @@ package android.location {
method public double getAltitudeMeters();
method public double getLatitudeDegrees();
method public double getLongitudeDegrees();
- method public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatCorrectionList();
+ method @Nullable public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatCorrectionList();
method public long getToaGpsNanosecondsOfWeek();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR;
@@ -2620,7 +2877,7 @@ package android.location {
method public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(double);
method public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(double);
method public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(double);
- method public android.location.GnssMeasurementCorrections.Builder setSingleSatCorrectionList(java.util.List<android.location.GnssSingleSatCorrection>);
+ method public android.location.GnssMeasurementCorrections.Builder setSingleSatCorrectionList(@Nullable java.util.List<android.location.GnssSingleSatCorrection>);
method public android.location.GnssMeasurementCorrections.Builder setToaGpsNanosecondsOfWeek(long);
}
@@ -2649,20 +2906,20 @@ package android.location {
method public int getConstellationType();
method public float getExcessPathLengthMeters();
method public float getExcessPathLengthUncertaintyMeters();
- method public android.location.GnssReflectingPlane getReflectingPlane();
+ method @FloatRange(from=0.0f, to=1.0f) public float getProbSatIsLos();
+ method @Nullable public android.location.GnssReflectingPlane getReflectingPlane();
method public int getSatId();
method public int getSingleSatCorrectionFlags();
method public boolean hasExcessPathLength();
method public boolean hasExcessPathLengthUncertainty();
method public boolean hasReflectingPlane();
method public boolean hasSatelliteLineOfSight();
- method public boolean isSatelliteLineOfSight();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GnssSingleSatCorrection> CREATOR;
field public static final int HAS_EXCESS_PATH_LENGTH_MASK = 2; // 0x2
field public static final int HAS_EXCESS_PATH_LENGTH_UNC_MASK = 4; // 0x4
+ field public static final int HAS_PROB_SAT_IS_LOS_MASK = 1; // 0x1
field public static final int HAS_REFLECTING_PLANE_MASK = 8; // 0x8
- field public static final int HAS_SAT_IS_LOS_MASK = 1; // 0x1
}
public static class GnssSingleSatCorrection.Builder {
@@ -2672,9 +2929,9 @@ package android.location {
method public android.location.GnssSingleSatCorrection.Builder setConstellationType(int);
method public android.location.GnssSingleSatCorrection.Builder setExcessPathLengthMeters(float);
method public android.location.GnssSingleSatCorrection.Builder setExcessPathLengthUncertaintyMeters(float);
+ method public android.location.GnssSingleSatCorrection.Builder setProbSatIsLos(@FloatRange(from=0.0f, to=1.0f) float);
method public android.location.GnssSingleSatCorrection.Builder setReflectingPlane(android.location.GnssReflectingPlane);
method public android.location.GnssSingleSatCorrection.Builder setSatId(int);
- method public android.location.GnssSingleSatCorrection.Builder setSatIsLos(boolean);
method public android.location.GnssSingleSatCorrection.Builder setSingleSatCorrectionFlags(int);
}
@@ -2845,8 +3102,8 @@ package android.location {
public class GpsMeasurementsEvent implements android.os.Parcelable {
ctor public GpsMeasurementsEvent(android.location.GpsClock, android.location.GpsMeasurement[]);
method public int describeContents();
- method public android.location.GpsClock getClock();
- method public java.util.Collection<android.location.GpsMeasurement> getMeasurements();
+ method @NonNull public android.location.GpsClock getClock();
+ method @NonNull public java.util.Collection<android.location.GpsMeasurement> getMeasurements();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GpsMeasurementsEvent> CREATOR;
field public static final int STATUS_GPS_LOCATION_DISABLED = 2; // 0x2
@@ -2854,14 +3111,14 @@ package android.location {
field public static final int STATUS_READY = 1; // 0x1
}
- public static abstract interface GpsMeasurementsEvent.Listener {
- method public abstract void onGpsMeasurementsReceived(android.location.GpsMeasurementsEvent);
- method public abstract void onStatusChanged(int);
+ public static interface GpsMeasurementsEvent.Listener {
+ method public void onGpsMeasurementsReceived(android.location.GpsMeasurementsEvent);
+ method public void onStatusChanged(int);
}
public class GpsNavigationMessage implements android.os.Parcelable {
method public int describeContents();
- method public byte[] getData();
+ method @NonNull public byte[] getData();
method public short getMessageId();
method public byte getPrn();
method public short getStatus();
@@ -2890,7 +3147,7 @@ package android.location {
public class GpsNavigationMessageEvent implements android.os.Parcelable {
ctor public GpsNavigationMessageEvent(android.location.GpsNavigationMessage);
method public int describeContents();
- method public android.location.GpsNavigationMessage getNavigationMessage();
+ method @NonNull public android.location.GpsNavigationMessage getNavigationMessage();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GpsNavigationMessageEvent> CREATOR;
field public static int STATUS_GPS_LOCATION_DISABLED;
@@ -2898,9 +3155,9 @@ package android.location {
field public static int STATUS_READY;
}
- public static abstract interface GpsNavigationMessageEvent.Listener {
- method public abstract void onGpsNavigationMessageReceived(android.location.GpsNavigationMessageEvent);
- method public abstract void onStatusChanged(int);
+ public static interface GpsNavigationMessageEvent.Listener {
+ method public void onGpsNavigationMessageReceived(android.location.GpsNavigationMessageEvent);
+ method public void onStatusChanged(int);
}
public class Location implements android.os.Parcelable {
@@ -2910,40 +3167,40 @@ package android.location {
}
public class LocationManager {
- method public deprecated boolean addGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
- method public deprecated boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
- method public void flushGnssBatch();
- method public int getGnssBatchSize();
+ method @Deprecated public boolean addGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
+ method @Deprecated public boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void flushGnssBatch();
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int getGnssBatchSize();
method public int getGnssCapabilities();
- method public java.lang.String getLocationControllerExtraPackage();
- method public java.lang.String getNetworkProviderPackage();
- method public void injectGnssMeasurementCorrections(android.location.GnssMeasurementCorrections);
+ method @Nullable public String getLocationControllerExtraPackage();
+ method @Nullable public String getNetworkProviderPackage();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void injectGnssMeasurementCorrections(@NonNull android.location.GnssMeasurementCorrections);
method public boolean isLocationControllerExtraPackageEnabled();
method public boolean isLocationEnabledForUser(android.os.UserHandle);
- method public boolean isProviderEnabledForUser(java.lang.String, android.os.UserHandle);
- method public boolean registerGnssBatchedLocationCallback(long, boolean, android.location.BatchedLocationCallback, android.os.Handler);
- method public deprecated void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
- method public deprecated void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
- method public void requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper);
- method public void requestLocationUpdates(android.location.LocationRequest, android.app.PendingIntent);
- method public void setLocationControllerExtraPackage(java.lang.String);
- method public void setLocationControllerExtraPackageEnabled(boolean);
- method public void setLocationEnabledForUser(boolean, android.os.UserHandle);
- method public boolean setProviderEnabledForUser(java.lang.String, boolean, android.os.UserHandle);
- method public boolean unregisterGnssBatchedLocationCallback(android.location.BatchedLocationCallback);
+ method public boolean isProviderEnabledForUser(String, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean registerGnssBatchedLocationCallback(long, boolean, android.location.BatchedLocationCallback, android.os.Handler);
+ method @Deprecated public void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
+ method @Deprecated public void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(android.location.LocationRequest, android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(String);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackageEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, android.os.UserHandle);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(String, boolean, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(android.location.BatchedLocationCallback);
}
public final class LocationRequest implements android.os.Parcelable {
method public static android.location.LocationRequest create();
method public static android.location.LocationRequest createFromDeprecatedCriteria(android.location.Criteria, long, float, boolean);
- method public static android.location.LocationRequest createFromDeprecatedProvider(java.lang.String, long, float, boolean);
+ method public static android.location.LocationRequest createFromDeprecatedProvider(String, long, float, boolean);
method public int describeContents();
method public long getExpireAt();
method public long getFastestInterval();
method public boolean getHideFromAppOps();
method public long getInterval();
method public int getNumUpdates();
- method public java.lang.String getProvider();
+ method public String getProvider();
method public int getQuality();
method public float getSmallestDisplacement();
method public android.os.WorkSource getWorkSource();
@@ -2955,7 +3212,7 @@ package android.location {
method public android.location.LocationRequest setInterval(long);
method public android.location.LocationRequest setLowPowerMode(boolean);
method public android.location.LocationRequest setNumUpdates(int);
- method public android.location.LocationRequest setProvider(java.lang.String);
+ method public android.location.LocationRequest setProvider(String);
method public android.location.LocationRequest setQuality(int);
method public android.location.LocationRequest setSmallestDisplacement(float);
method public void setWorkSource(android.os.WorkSource);
@@ -2984,7 +3241,7 @@ package android.media {
}
public static class AudioAttributes.Builder {
- method public android.media.AudioAttributes.Builder addBundle(android.os.Bundle);
+ method public android.media.AudioAttributes.Builder addBundle(@NonNull android.os.Bundle);
method public android.media.AudioAttributes.Builder setCapturePreset(int);
method public android.media.AudioAttributes.Builder setInternalCapturePreset(int);
}
@@ -2992,12 +3249,12 @@ package android.media {
public final class AudioFocusInfo implements android.os.Parcelable {
method public int describeContents();
method public android.media.AudioAttributes getAttributes();
- method public java.lang.String getClientId();
+ method public String getClientId();
method public int getClientUid();
method public int getFlags();
method public int getGainRequest();
method public int getLossReceived();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR;
}
@@ -3007,22 +3264,22 @@ package android.media {
}
public static final class AudioFocusRequest.Builder {
- method public android.media.AudioFocusRequest.Builder setLocksFocus(boolean);
+ method @NonNull public android.media.AudioFocusRequest.Builder setLocksFocus(boolean);
}
public class AudioManager {
- method public deprecated int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
+ method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
method public void clearAudioServerStateCallback();
- method public int dispatchAudioFocusChange(android.media.AudioFocusInfo, int, android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
method public boolean isAudioServerRunning();
method public boolean isHdmiSystemAudioSupported();
- method public int registerAudioPolicy(android.media.audiopolicy.AudioPolicy);
- method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
- method public deprecated int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
- method public int requestAudioFocus(android.media.AudioFocusRequest, android.media.audiopolicy.AudioPolicy);
- method public void setAudioServerStateCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioServerStateCallback);
- method public void setFocusRequestResult(android.media.AudioFocusInfo, int, android.media.audiopolicy.AudioPolicy);
- method public void unregisterAudioPolicyAsync(android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy);
+ method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy);
field public static final int AUDIOFOCUS_FLAG_DELAY_OK = 1; // 0x1
field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4
field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2
@@ -3030,7 +3287,7 @@ package android.media {
field public static final int SUCCESS = 0; // 0x0
}
- public static abstract class AudioManager.AudioServerStateCallback {
+ public abstract static class AudioManager.AudioServerStateCallback {
ctor public AudioManager.AudioServerStateCallback();
method public void onAudioServerDown();
method public void onAudioServerUp();
@@ -3062,20 +3319,21 @@ package android.media {
}
public static class AudioRecord.Builder {
- method public android.media.AudioRecord.Builder setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
+ method public android.media.AudioRecord.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method public android.media.AudioRecord.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
}
public final class MediaRecorder.AudioSource {
- field public static final int HOTWORD = 1999; // 0x7cf
+ field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int ECHO_REFERENCE = 1997; // 0x7cd
+ field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public static final int HOTWORD = 1999; // 0x7cf
field public static final int RADIO_TUNER = 1998; // 0x7ce
}
public static class MediaTimestamp.Builder {
ctor public MediaTimestamp.Builder();
- ctor public MediaTimestamp.Builder(android.media.MediaTimestamp);
- method public android.media.MediaTimestamp build();
- method public android.media.MediaTimestamp.Builder setMediaTimestamp(long, long, float);
+ ctor public MediaTimestamp.Builder(@NonNull android.media.MediaTimestamp);
+ method @NonNull public android.media.MediaTimestamp build();
+ method @NonNull public android.media.MediaTimestamp.Builder setMediaTimestamp(long, long, float);
}
public class PlayerProxy {
@@ -3089,16 +3347,16 @@ package android.media {
public static class SubtitleData.Builder {
ctor public SubtitleData.Builder();
- ctor public SubtitleData.Builder(android.media.SubtitleData);
- method public android.media.SubtitleData build();
- method public android.media.SubtitleData.Builder setSubtitleData(int, long, long, byte[]);
+ ctor public SubtitleData.Builder(@NonNull android.media.SubtitleData);
+ method @NonNull public android.media.SubtitleData build();
+ method @NonNull public android.media.SubtitleData.Builder setSubtitleData(int, long, long, @NonNull byte[]);
}
public static class TimedMetaData.Builder {
ctor public TimedMetaData.Builder();
- ctor public TimedMetaData.Builder(android.media.TimedMetaData);
- method public android.media.TimedMetaData build();
- method public android.media.TimedMetaData.Builder setTimedMetaData(long, byte[]);
+ ctor public TimedMetaData.Builder(@NonNull android.media.TimedMetaData);
+ method @NonNull public android.media.TimedMetaData build();
+ method @NonNull public android.media.TimedMetaData.Builder setTimedMetaData(long, @NonNull byte[]);
}
}
@@ -3117,7 +3375,7 @@ package android.media.audiopolicy {
public static class AudioMix.Builder {
ctor public AudioMix.Builder(android.media.audiopolicy.AudioMixingRule) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMix build() throws java.lang.IllegalArgumentException;
- method public android.media.audiopolicy.AudioMix.Builder setDevice(android.media.AudioDeviceInfo) throws java.lang.IllegalArgumentException;
+ method public android.media.audiopolicy.AudioMix.Builder setDevice(@NonNull android.media.AudioDeviceInfo) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMix.Builder setFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMix.Builder setRouteFlags(int) throws java.lang.IllegalArgumentException;
}
@@ -3130,25 +3388,25 @@ package android.media.audiopolicy {
public static class AudioMixingRule.Builder {
ctor public AudioMixingRule.Builder();
- method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, Object) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMixingRule.Builder addRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMixingRule build();
- method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, Object) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMixingRule.Builder excludeRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
}
public class AudioPolicy {
- method public int attachMixes(java.util.List<android.media.audiopolicy.AudioMix>);
+ method public int attachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>);
method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
- method public int detachMixes(java.util.List<android.media.audiopolicy.AudioMix>);
+ method public int detachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>);
method public int getFocusDuckingBehavior();
method public int getStatus();
method public int removeUidDeviceAffinity(int);
method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
- method public void setRegistration(java.lang.String);
- method public int setUidDeviceAffinity(int, java.util.List<android.media.AudioDeviceInfo>);
- method public java.lang.String toLogFriendlyString();
+ method public void setRegistration(String);
+ method public int setUidDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>);
+ method public String toLogFriendlyString();
field public static final int FOCUS_POLICY_DUCKING_DEFAULT = 0; // 0x0
field public static final int FOCUS_POLICY_DUCKING_IN_APP = 0; // 0x0
field public static final int FOCUS_POLICY_DUCKING_IN_POLICY = 1; // 0x1
@@ -3156,7 +3414,7 @@ package android.media.audiopolicy {
field public static final int POLICY_STATUS_UNREGISTERED = 1; // 0x1
}
- public static abstract class AudioPolicy.AudioPolicyFocusListener {
+ public abstract static class AudioPolicy.AudioPolicyFocusListener {
ctor public AudioPolicy.AudioPolicyFocusListener();
method public void onAudioFocusAbandon(android.media.AudioFocusInfo);
method public void onAudioFocusGrant(android.media.AudioFocusInfo, int);
@@ -3164,42 +3422,58 @@ package android.media.audiopolicy {
method public void onAudioFocusRequest(android.media.AudioFocusInfo, int);
}
- public static abstract class AudioPolicy.AudioPolicyStatusListener {
+ public abstract static class AudioPolicy.AudioPolicyStatusListener {
ctor public AudioPolicy.AudioPolicyStatusListener();
method public void onMixStateUpdate(android.media.audiopolicy.AudioMix);
method public void onStatusChange();
}
- public static abstract class AudioPolicy.AudioPolicyVolumeCallback {
+ public abstract static class AudioPolicy.AudioPolicyVolumeCallback {
method public void onVolumeAdjustment(int);
}
public static class AudioPolicy.Builder {
ctor public AudioPolicy.Builder(android.content.Context);
- method public android.media.audiopolicy.AudioPolicy.Builder addMix(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
+ method public android.media.audiopolicy.AudioPolicy.Builder addMix(@NonNull android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioPolicy build();
method public void setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener);
method public void setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener);
- method public android.media.audiopolicy.AudioPolicy.Builder setAudioPolicyVolumeCallback(android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback);
+ method public android.media.audiopolicy.AudioPolicy.Builder setAudioPolicyVolumeCallback(@NonNull android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback);
method public android.media.audiopolicy.AudioPolicy.Builder setIsAudioFocusPolicy(boolean);
- method public android.media.audiopolicy.AudioPolicy.Builder setLooper(android.os.Looper) throws java.lang.IllegalArgumentException;
+ method public android.media.audiopolicy.AudioPolicy.Builder setLooper(@NonNull android.os.Looper) throws java.lang.IllegalArgumentException;
}
}
package android.media.session {
+ public final class ControllerCallbackLink implements android.os.Parcelable {
+ ctor public ControllerCallbackLink(@NonNull android.media.session.ControllerCallbackLink.CallbackStub);
+ }
+
+ public abstract static class ControllerCallbackLink.CallbackStub {
+ ctor public ControllerCallbackLink.CallbackStub();
+ method public void onEvent(@NonNull String, @Nullable android.os.Bundle);
+ method public void onExtrasChanged(@Nullable android.os.Bundle);
+ method public void onMetadataChanged(@Nullable android.media.MediaMetadata);
+ method public void onPlaybackStateChanged(@Nullable android.media.session.PlaybackState);
+ method public void onQueueChanged(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
+ method public void onQueueTitleChanged(@Nullable CharSequence);
+ method public void onSessionDestroyed();
+ method public void onVolumeInfoChanged(@NonNull android.media.session.MediaController.PlaybackInfo);
+ }
+
public final class MediaSessionManager {
- method public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, android.os.Handler);
- method public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.SET_MEDIA_KEY_LISTENER) public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, @Nullable android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER) public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, @Nullable android.os.Handler);
}
- public static abstract interface MediaSessionManager.OnMediaKeyListener {
- method public abstract boolean onMediaKey(android.view.KeyEvent);
+ public static interface MediaSessionManager.OnMediaKeyListener {
+ method public boolean onMediaKey(android.view.KeyEvent);
}
- public static abstract interface MediaSessionManager.OnVolumeKeyLongPressListener {
- method public abstract void onVolumeKeyLongPress(android.view.KeyEvent);
+ public static interface MediaSessionManager.OnVolumeKeyLongPressListener {
+ method public void onVolumeKeyLongPress(android.view.KeyEvent);
}
}
@@ -3208,41 +3482,41 @@ package android.media.soundtrigger {
public abstract class SoundTriggerDetectionService extends android.app.Service {
ctor public SoundTriggerDetectionService();
- method public void onConnected(java.util.UUID, android.os.Bundle);
- method public void onDisconnected(java.util.UUID, android.os.Bundle);
- method public void onError(java.util.UUID, android.os.Bundle, int, int);
- method public void onGenericRecognitionEvent(java.util.UUID, android.os.Bundle, int, android.hardware.soundtrigger.SoundTrigger.RecognitionEvent);
- method public abstract void onStopOperation(java.util.UUID, android.os.Bundle, int);
- method public final void operationFinished(java.util.UUID, int);
+ method @MainThread public void onConnected(@NonNull java.util.UUID, @Nullable android.os.Bundle);
+ method @MainThread public void onDisconnected(@NonNull java.util.UUID, @Nullable android.os.Bundle);
+ method @MainThread public void onError(@NonNull java.util.UUID, @Nullable android.os.Bundle, int, int);
+ method @MainThread public void onGenericRecognitionEvent(@NonNull java.util.UUID, @Nullable android.os.Bundle, int, @NonNull android.hardware.soundtrigger.SoundTrigger.RecognitionEvent);
+ method @MainThread public abstract void onStopOperation(@NonNull java.util.UUID, @Nullable android.os.Bundle, int);
+ method public final void operationFinished(@Nullable java.util.UUID, int);
}
public final class SoundTriggerDetector {
- method public boolean startRecognition(int);
- method public boolean stopRecognition();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public boolean startRecognition(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public boolean stopRecognition();
field public static final int RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS = 2; // 0x2
field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
}
- public static abstract class SoundTriggerDetector.Callback {
+ public abstract static class SoundTriggerDetector.Callback {
ctor public SoundTriggerDetector.Callback();
method public abstract void onAvailabilityChanged(int);
- method public abstract void onDetected(android.media.soundtrigger.SoundTriggerDetector.EventPayload);
+ method public abstract void onDetected(@NonNull android.media.soundtrigger.SoundTriggerDetector.EventPayload);
method public abstract void onError();
method public abstract void onRecognitionPaused();
method public abstract void onRecognitionResumed();
}
public static class SoundTriggerDetector.EventPayload {
- method public android.media.AudioFormat getCaptureAudioFormat();
- method public byte[] getTriggerAudio();
+ method @Nullable public android.media.AudioFormat getCaptureAudioFormat();
+ method @Nullable public byte[] getTriggerAudio();
}
public final class SoundTriggerManager {
- method public android.media.soundtrigger.SoundTriggerDetector createSoundTriggerDetector(java.util.UUID, android.media.soundtrigger.SoundTriggerDetector.Callback, android.os.Handler);
- method public void deleteModel(java.util.UUID);
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerDetector createSoundTriggerDetector(java.util.UUID, @NonNull android.media.soundtrigger.SoundTriggerDetector.Callback, @Nullable android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void deleteModel(java.util.UUID);
method public int getDetectionServiceOperationsTimeout();
- method public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
- method public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
}
public static class SoundTriggerManager.Model {
@@ -3265,44 +3539,44 @@ package android.media.tv {
}
public final class TvContract {
- method public static android.net.Uri buildChannelsUriForInput(java.lang.String, boolean);
- method public static android.net.Uri buildChannelsUriForInput(java.lang.String, java.lang.String, boolean);
- field public static final java.lang.String ACTION_CHANNEL_BROWSABLE_REQUESTED = "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
- field public static final java.lang.String EXTRA_BLOCKED_PACKAGES = "android.media.tv.extra.BLOCKED_PACKAGES";
- field public static final java.lang.String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
- field public static final java.lang.String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
- field public static final java.lang.String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
- field public static final java.lang.String EXTRA_EXISTING_COLUMN_NAMES = "android.media.tv.extra.EXISTING_COLUMN_NAMES";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
- field public static final java.lang.String EXTRA_RESULT_CODE = "android.media.tv.extra.RESULT_CODE";
- field public static final java.lang.String METHOD_ADD_COLUMN = "add_column";
- field public static final java.lang.String METHOD_BLOCK_PACKAGE = "block_package";
- field public static final java.lang.String METHOD_GET_BLOCKED_PACKAGES = "get_blocked_packages";
- field public static final java.lang.String METHOD_GET_COLUMNS = "get_columns";
- field public static final java.lang.String METHOD_UNBLOCK_PACKAGE = "unblock_package";
+ method public static android.net.Uri buildChannelsUriForInput(@Nullable String, boolean);
+ method public static android.net.Uri buildChannelsUriForInput(@Nullable String, @Nullable String, boolean);
+ field public static final String ACTION_CHANNEL_BROWSABLE_REQUESTED = "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
+ field public static final String EXTRA_BLOCKED_PACKAGES = "android.media.tv.extra.BLOCKED_PACKAGES";
+ field public static final String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
+ field public static final String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
+ field public static final String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
+ field public static final String EXTRA_EXISTING_COLUMN_NAMES = "android.media.tv.extra.EXISTING_COLUMN_NAMES";
+ field public static final String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
+ field public static final String EXTRA_RESULT_CODE = "android.media.tv.extra.RESULT_CODE";
+ field public static final String METHOD_ADD_COLUMN = "add_column";
+ field public static final String METHOD_BLOCK_PACKAGE = "block_package";
+ field public static final String METHOD_GET_BLOCKED_PACKAGES = "get_blocked_packages";
+ field public static final String METHOD_GET_COLUMNS = "get_columns";
+ field public static final String METHOD_UNBLOCK_PACKAGE = "unblock_package";
field public static final int RESULT_ERROR_INVALID_ARGUMENT = 2; // 0x2
field public static final int RESULT_ERROR_IO = 1; // 0x1
field public static final int RESULT_OK = 0; // 0x0
}
public static final class TvContract.WatchedPrograms implements android.media.tv.TvContract.BaseTvColumns {
- field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
- field public static final java.lang.String COLUMN_DESCRIPTION = "description";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final java.lang.String COLUMN_INTERNAL_SESSION_TOKEN = "session_token";
- field public static final java.lang.String COLUMN_INTERNAL_TUNE_PARAMS = "tune_params";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_WATCH_END_TIME_UTC_MILLIS = "watch_end_time_utc_millis";
- field public static final java.lang.String COLUMN_WATCH_START_TIME_UTC_MILLIS = "watch_start_time_utc_millis";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watched_program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watched_program";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_DESCRIPTION = "description";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_INTERNAL_SESSION_TOKEN = "session_token";
+ field public static final String COLUMN_INTERNAL_TUNE_PARAMS = "tune_params";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_WATCH_END_TIME_UTC_MILLIS = "watch_end_time_utc_millis";
+ field public static final String COLUMN_WATCH_START_TIME_UTC_MILLIS = "watch_start_time_utc_millis";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watched_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/watched_program";
field public static final android.net.Uri CONTENT_URI;
}
public final class TvInputHardwareInfo implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getAudioAddress();
+ method public String getAudioAddress();
method public int getAudioType();
method public int getCableConnectionStatus();
method public int getDeviceId();
@@ -3328,7 +3602,7 @@ package android.media.tv {
public static final class TvInputHardwareInfo.Builder {
ctor public TvInputHardwareInfo.Builder();
- method public android.media.tv.TvInputHardwareInfo.Builder audioAddress(java.lang.String);
+ method public android.media.tv.TvInputHardwareInfo.Builder audioAddress(String);
method public android.media.tv.TvInputHardwareInfo.Builder audioType(int);
method public android.media.tv.TvInputHardwareInfo build();
method public android.media.tv.TvInputHardwareInfo.Builder cableConnectionStatus(int);
@@ -3338,79 +3612,79 @@ package android.media.tv {
}
public final class TvInputInfo implements android.os.Parcelable {
- method public static deprecated android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, java.lang.String, java.lang.String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static deprecated android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, java.lang.String, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static deprecated android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, java.lang.String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static deprecated android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, String, String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, String, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public android.hardware.hdmi.HdmiDeviceInfo getHdmiDeviceInfo();
method public boolean isConnectedToHdmiSwitch();
method public boolean isHardwareInput();
- method public android.graphics.drawable.Drawable loadIcon(android.content.Context, int);
+ method public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.Context, int);
}
public static final class TvInputInfo.Builder {
method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo);
method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon);
method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon, int);
- method public android.media.tv.TvInputInfo.Builder setLabel(java.lang.CharSequence);
- method public android.media.tv.TvInputInfo.Builder setLabel(int);
- method public android.media.tv.TvInputInfo.Builder setParentId(java.lang.String);
+ method public android.media.tv.TvInputInfo.Builder setLabel(CharSequence);
+ method public android.media.tv.TvInputInfo.Builder setLabel(@StringRes int);
+ method public android.media.tv.TvInputInfo.Builder setParentId(String);
method public android.media.tv.TvInputInfo.Builder setTvInputHardwareInfo(android.media.tv.TvInputHardwareInfo);
}
public static final class TvInputInfo.TvInputSettings {
- method public static java.util.Map<java.lang.String, java.lang.String> getCustomLabels(android.content.Context, int);
+ method public static java.util.Map<java.lang.String,java.lang.String> getCustomLabels(android.content.Context, int);
method public static java.util.Set<java.lang.String> getHiddenTvInputIds(android.content.Context, int);
- method public static void putCustomLabels(android.content.Context, java.util.Map<java.lang.String, java.lang.String>, int);
+ method public static void putCustomLabels(android.content.Context, java.util.Map<java.lang.String,java.lang.String>, int);
method public static void putHiddenTvInputs(android.content.Context, java.util.Set<java.lang.String>, int);
}
public final class TvInputManager {
- method public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputInfo, android.media.tv.TvInputManager.HardwareCallback);
- method public void addBlockedRating(android.media.tv.TvContentRating);
- method public boolean captureFrame(java.lang.String, android.view.Surface, android.media.tv.TvStreamConfig);
- method public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(java.lang.String);
- method public java.util.List<android.media.tv.TvInputHardwareInfo> getHardwareList();
- method public java.util.List<android.media.tv.TvContentRatingSystemInfo> getTvContentRatingSystemList();
- method public boolean isSingleSessionActive();
- method public void notifyPreviewProgramAddedToWatchNext(java.lang.String, long, long);
- method public void notifyPreviewProgramBrowsableDisabled(java.lang.String, long);
- method public void notifyWatchNextProgramBrowsableDisabled(java.lang.String, long);
- method public void releaseTvInputHardware(int, android.media.tv.TvInputManager.Hardware);
- method public void removeBlockedRating(android.media.tv.TvContentRating);
- method public void setParentalControlsEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputInfo, android.media.tv.TvInputManager.HardwareCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating);
+ method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig);
+ method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(String);
+ method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public java.util.List<android.media.tv.TvInputHardwareInfo> getHardwareList();
+ method @RequiresPermission(android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS) public java.util.List<android.media.tv.TvContentRatingSystemInfo> getTvContentRatingSystemList();
+ method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean isSingleSessionActive();
+ method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramAddedToWatchNext(String, long, long);
+ method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramBrowsableDisabled(String, long);
+ method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyWatchNextProgramBrowsableDisabled(String, long);
+ method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public void releaseTvInputHardware(int, android.media.tv.TvInputManager.Hardware);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void removeBlockedRating(@NonNull android.media.tv.TvContentRating);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void setParentalControlsEnabled(boolean);
}
public static final class TvInputManager.Hardware {
- method public void overrideAudioSink(int, java.lang.String, int, int, int);
+ method public void overrideAudioSink(int, String, int, int, int);
method public void setStreamVolume(float);
method public boolean setSurface(android.view.Surface, android.media.tv.TvStreamConfig);
}
- public static abstract class TvInputManager.HardwareCallback {
+ public abstract static class TvInputManager.HardwareCallback {
ctor public TvInputManager.HardwareCallback();
method public abstract void onReleased();
method public abstract void onStreamConfigChanged(android.media.tv.TvStreamConfig[]);
}
public abstract class TvInputService extends android.app.Service {
- method public android.media.tv.TvInputInfo onHardwareAdded(android.media.tv.TvInputHardwareInfo);
- method public java.lang.String onHardwareRemoved(android.media.tv.TvInputHardwareInfo);
- method public android.media.tv.TvInputInfo onHdmiDeviceAdded(android.hardware.hdmi.HdmiDeviceInfo);
- method public java.lang.String onHdmiDeviceRemoved(android.hardware.hdmi.HdmiDeviceInfo);
+ method @Nullable public android.media.tv.TvInputInfo onHardwareAdded(android.media.tv.TvInputHardwareInfo);
+ method @Nullable public String onHardwareRemoved(android.media.tv.TvInputHardwareInfo);
+ method @Nullable public android.media.tv.TvInputInfo onHdmiDeviceAdded(android.hardware.hdmi.HdmiDeviceInfo);
+ method @Nullable public String onHdmiDeviceRemoved(android.hardware.hdmi.HdmiDeviceInfo);
}
- public static abstract class TvInputService.RecordingSession {
- method public void notifySessionEvent(java.lang.String, android.os.Bundle);
+ public abstract static class TvInputService.RecordingSession {
+ method public void notifySessionEvent(@NonNull String, android.os.Bundle);
}
- public static abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
- method public void notifySessionEvent(java.lang.String, android.os.Bundle);
+ public abstract static class TvInputService.Session implements android.view.KeyEvent.Callback {
+ method public void notifySessionEvent(@NonNull String, android.os.Bundle);
method public void onSetMain(boolean);
}
- public static abstract class TvRecordingClient.RecordingCallback {
- method public void onEvent(java.lang.String, java.lang.String, android.os.Bundle);
+ public abstract static class TvRecordingClient.RecordingCallback {
+ method public void onEvent(String, String, android.os.Bundle);
}
public class TvStreamConfig implements android.os.Parcelable {
@@ -3437,12 +3711,12 @@ package android.media.tv {
}
public class TvView extends android.view.ViewGroup {
- method public void setMain();
- method public void unblockContent(android.media.tv.TvContentRating);
+ method @RequiresPermission("android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE") public void setMain();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void unblockContent(android.media.tv.TvContentRating);
}
- public static abstract class TvView.TvInputCallback {
- method public void onEvent(java.lang.String, java.lang.String, android.os.Bundle);
+ public abstract static class TvView.TvInputCallback {
+ method public void onEvent(String, String, android.os.Bundle);
}
}
@@ -3451,31 +3725,31 @@ package android.metrics {
public class LogMaker {
ctor public LogMaker(int);
- ctor public LogMaker(java.lang.Object[]);
- method public android.metrics.LogMaker addTaggedData(int, java.lang.Object);
+ ctor public LogMaker(Object[]);
+ method public android.metrics.LogMaker addTaggedData(int, Object);
method public android.metrics.LogMaker clearCategory();
method public android.metrics.LogMaker clearPackageName();
method public android.metrics.LogMaker clearSubtype();
method public android.metrics.LogMaker clearTaggedData(int);
method public android.metrics.LogMaker clearType();
- method public void deserialize(java.lang.Object[]);
+ method public void deserialize(Object[]);
method public int getCategory();
method public long getCounterBucket();
- method public java.lang.String getCounterName();
+ method public String getCounterName();
method public int getCounterValue();
- method public java.lang.String getPackageName();
+ method public String getPackageName();
method public int getProcessId();
method public int getSubtype();
- method public java.lang.Object getTaggedData(int);
+ method public Object getTaggedData(int);
method public long getTimestamp();
method public int getType();
method public int getUid();
method public boolean isLongCounterBucket();
method public boolean isSubsetOf(android.metrics.LogMaker);
- method public boolean isValidValue(java.lang.Object);
- method public java.lang.Object[] serialize();
+ method public boolean isValidValue(Object);
+ method public Object[] serialize();
method public android.metrics.LogMaker setCategory(int);
- method public android.metrics.LogMaker setPackageName(java.lang.String);
+ method public android.metrics.LogMaker setPackageName(String);
method public android.metrics.LogMaker setSubtype(int);
method public android.metrics.LogMaker setType(int);
}
@@ -3493,43 +3767,51 @@ package android.metrics {
package android.net {
+ public class CaptivePortal implements android.os.Parcelable {
+ field public static final int APP_RETURN_DISMISSED = 0; // 0x0
+ field public static final int APP_RETURN_UNWANTED = 1; // 0x1
+ field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2
+ }
+
public class ConnectivityManager {
- method public java.lang.String getCaptivePortalServerUrl();
- method public boolean isTetheringSupported();
- method public void setAirplaneMode(boolean);
- method public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
- method public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
- method public void stopTethering(int);
+ method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl();
+ method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int);
+ field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
+ field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
field public static final int TETHERING_BLUETOOTH = 2; // 0x2
field public static final int TETHERING_USB = 1; // 0x1
field public static final int TETHERING_WIFI = 0; // 0x0
}
- public static abstract class ConnectivityManager.OnStartTetheringCallback {
+ public abstract static class ConnectivityManager.OnStartTetheringCallback {
ctor public ConnectivityManager.OnStartTetheringCallback();
method public void onTetheringFailed();
method public void onTetheringStarted();
}
public final class IpSecManager {
- method public void applyTunnelModeTransform(android.net.IpSecManager.IpSecTunnelInterface, int, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.IpSecTunnelInterface createIpSecTunnelInterface(java.net.InetAddress, java.net.InetAddress, android.net.Network) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void applyTunnelModeTransform(@NonNull android.net.IpSecManager.IpSecTunnelInterface, int, @NonNull android.net.IpSecTransform) throws java.io.IOException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public android.net.IpSecManager.IpSecTunnelInterface createIpSecTunnelInterface(@NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull android.net.Network) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
}
public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
- method public void addAddress(java.net.InetAddress, int) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void addAddress(@NonNull java.net.InetAddress, int) throws java.io.IOException;
method public void close();
- method public java.lang.String getInterfaceName();
- method public void removeAddress(java.net.InetAddress, int) throws java.io.IOException;
+ method @NonNull public String getInterfaceName();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void removeAddress(@NonNull java.net.InetAddress, int) throws java.io.IOException;
}
public final class IpSecTransform implements java.lang.AutoCloseable {
- method public void startNattKeepalive(android.net.IpSecTransform.NattKeepaliveCallback, int, android.os.Handler) throws java.io.IOException;
- method public void stopNattKeepalive();
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "android.permission.PACKET_KEEPALIVE_OFFLOAD"}) public void startNattKeepalive(@NonNull android.net.IpSecTransform.NattKeepaliveCallback, int, @NonNull android.os.Handler) throws java.io.IOException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "android.permission.PACKET_KEEPALIVE_OFFLOAD"}) public void stopNattKeepalive();
}
public static class IpSecTransform.Builder {
- method public android.net.IpSecTransform buildTunnelModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public android.net.IpSecTransform buildTunnelModeTransform(@NonNull java.net.InetAddress, @NonNull android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
}
public static class IpSecTransform.NattKeepaliveCallback {
@@ -3544,7 +3826,11 @@ package android.net {
public class LinkAddress implements android.os.Parcelable {
ctor public LinkAddress(java.net.InetAddress, int);
- ctor public LinkAddress(java.lang.String);
+ ctor public LinkAddress(String);
+ method public boolean isGlobalPreferred();
+ method public boolean isIPv4();
+ method public boolean isIPv6();
+ method public boolean isSameAddressAs(android.net.LinkAddress);
}
public final class LinkProperties implements android.os.Parcelable {
@@ -3552,13 +3838,17 @@ package android.net {
method public boolean addRoute(android.net.RouteInfo);
method public void clear();
method public void setDnsServers(java.util.Collection<java.net.InetAddress>);
- method public void setDomains(java.lang.String);
+ method public void setDomains(String);
method public void setHttpProxy(android.net.ProxyInfo);
- method public void setInterfaceName(java.lang.String);
+ method public void setInterfaceName(String);
method public void setLinkAddresses(java.util.Collection<android.net.LinkAddress>);
method public void setMtu(int);
}
+ public class Network implements android.os.Parcelable {
+ method public android.net.Network getPrivateDnsBypassingCopy();
+ }
+
public final class NetworkCapabilities implements android.os.Parcelable {
method public int getSignalStrength();
field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
@@ -3585,19 +3875,26 @@ package android.net {
}
public class NetworkScoreManager {
- method public boolean clearScores() throws java.lang.SecurityException;
- method public void disableScoring() throws java.lang.SecurityException;
- method public java.lang.String getActiveScorerPackage();
- method public boolean setActiveScorer(java.lang.String) throws java.lang.SecurityException;
- method public boolean updateScores(android.net.ScoredNetwork[]) throws java.lang.SecurityException;
- field public static final java.lang.String ACTION_CHANGE_ACTIVE = "android.net.scoring.CHANGE_ACTIVE";
- field public static final java.lang.String ACTION_CUSTOM_ENABLE = "android.net.scoring.CUSTOM_ENABLE";
- field public static final java.lang.String ACTION_RECOMMEND_NETWORKS = "android.net.action.RECOMMEND_NETWORKS";
- field public static final java.lang.String ACTION_SCORER_CHANGED = "android.net.scoring.SCORER_CHANGED";
- field public static final java.lang.String ACTION_SCORE_NETWORKS = "android.net.scoring.SCORE_NETWORKS";
- field public static final java.lang.String EXTRA_NETWORKS_TO_SCORE = "networksToScore";
- field public static final java.lang.String EXTRA_NEW_SCORER = "newScorer";
- field public static final java.lang.String EXTRA_PACKAGE_NAME = "packageName";
+ method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, "android.permission.REQUEST_NETWORK_SCORES"}) public boolean clearScores() throws java.lang.SecurityException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, "android.permission.REQUEST_NETWORK_SCORES"}) public void disableScoring() throws java.lang.SecurityException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, "android.permission.REQUEST_NETWORK_SCORES"}) public String getActiveScorerPackage();
+ method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, "android.permission.REQUEST_NETWORK_SCORES"}) public boolean setActiveScorer(String) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.SCORE_NETWORKS) public boolean updateScores(android.net.ScoredNetwork[]) throws java.lang.SecurityException;
+ field public static final String ACTION_CHANGE_ACTIVE = "android.net.scoring.CHANGE_ACTIVE";
+ field public static final String ACTION_CUSTOM_ENABLE = "android.net.scoring.CUSTOM_ENABLE";
+ field public static final String ACTION_RECOMMEND_NETWORKS = "android.net.action.RECOMMEND_NETWORKS";
+ field public static final String ACTION_SCORER_CHANGED = "android.net.scoring.SCORER_CHANGED";
+ field public static final String ACTION_SCORE_NETWORKS = "android.net.scoring.SCORE_NETWORKS";
+ field public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore";
+ field public static final String EXTRA_NEW_SCORER = "newScorer";
+ field public static final String EXTRA_PACKAGE_NAME = "packageName";
+ }
+
+ public final class RouteInfo implements android.os.Parcelable {
+ method public int getType();
+ field public static final int RTN_THROW = 9; // 0x9
+ field public static final int RTN_UNICAST = 1; // 0x1
+ field public static final int RTN_UNREACHABLE = 7; // 0x7
}
public class RssiCurve implements android.os.Parcelable {
@@ -3617,15 +3914,15 @@ package android.net {
public class ScoredNetwork implements android.os.Parcelable {
ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve);
ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve, boolean);
- ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve, boolean, android.os.Bundle);
+ ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve, boolean, @Nullable android.os.Bundle);
method public int calculateBadge(int);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String ATTRIBUTES_KEY_BADGING_CURVE = "android.net.attributes.key.BADGING_CURVE";
- field public static final java.lang.String ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL = "android.net.attributes.key.HAS_CAPTIVE_PORTAL";
- field public static final java.lang.String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET = "android.net.attributes.key.RANKING_SCORE_OFFSET";
+ field public static final String ATTRIBUTES_KEY_BADGING_CURVE = "android.net.attributes.key.BADGING_CURVE";
+ field public static final String ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL = "android.net.attributes.key.HAS_CAPTIVE_PORTAL";
+ field public static final String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET = "android.net.attributes.key.RANKING_SCORE_OFFSET";
field public static final android.os.Parcelable.Creator<android.net.ScoredNetwork> CREATOR;
- field public final android.os.Bundle attributes;
+ field @Nullable public final android.os.Bundle attributes;
field public final boolean meteredHint;
field public final android.net.NetworkKey networkKey;
field public final android.net.RssiCurve rssiCurve;
@@ -3638,324 +3935,333 @@ package android.net {
}
public class VpnService extends android.app.Service {
- method public static void prepareAndAuthorize(android.content.Context);
+ method @RequiresPermission(android.Manifest.permission.CONTROL_VPN) public static void prepareAndAuthorize(android.content.Context);
}
public class WebAddress {
- ctor public WebAddress(java.lang.String) throws android.net.ParseException;
+ ctor public WebAddress(String) throws android.net.ParseException;
}
public class WifiKey implements android.os.Parcelable {
- ctor public WifiKey(java.lang.String, java.lang.String);
+ ctor public WifiKey(String, String);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.WifiKey> CREATOR;
- field public final java.lang.String bssid;
- field public final java.lang.String ssid;
+ field public final String bssid;
+ field public final String ssid;
}
}
package android.net.wifi {
- public abstract class DppStatusCallback {
- ctor public DppStatusCallback();
+ public abstract class EasyConnectStatusCallback {
+ ctor public EasyConnectStatusCallback();
method public abstract void onConfiguratorSuccess(int);
method public abstract void onEnrolleeSuccess(int);
method public abstract void onFailure(int);
method public abstract void onProgress(int);
- field public static final int DPP_EVENT_FAILURE = -7; // 0xfffffff9
- field public static final int DPP_EVENT_FAILURE_AUTHENTICATION = -2; // 0xfffffffe
- field public static final int DPP_EVENT_FAILURE_BUSY = -5; // 0xfffffffb
- field public static final int DPP_EVENT_FAILURE_CONFIGURATION = -4; // 0xfffffffc
- field public static final int DPP_EVENT_FAILURE_INVALID_NETWORK = -9; // 0xfffffff7
- field public static final int DPP_EVENT_FAILURE_INVALID_URI = -1; // 0xffffffff
- field public static final int DPP_EVENT_FAILURE_NOT_COMPATIBLE = -3; // 0xfffffffd
- field public static final int DPP_EVENT_FAILURE_NOT_SUPPORTED = -8; // 0xfffffff8
- field public static final int DPP_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa
- field public static final int DPP_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0; // 0x0
- field public static final int DPP_EVENT_PROGRESS_RESPONSE_PENDING = 1; // 0x1
- field public static final int DPP_EVENT_SUCCESS_CONFIGURATION_SENT = 0; // 0x0
- }
-
- public deprecated class RttManager {
- method public void disableResponder(android.net.wifi.RttManager.ResponderCallback);
- method public void enableResponder(android.net.wifi.RttManager.ResponderCallback);
- method public deprecated android.net.wifi.RttManager.Capabilities getCapabilities();
- method public android.net.wifi.RttManager.RttCapabilities getRttCapabilities();
- method public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener);
- method public void stopRanging(android.net.wifi.RttManager.RttListener);
- field public static final int BASE = 160256; // 0x27200
- field public static final int CMD_OP_ABORTED = 160260; // 0x27204
- field public static final int CMD_OP_DISABLE_RESPONDER = 160262; // 0x27206
- field public static final int CMD_OP_ENABLE_RESPONDER = 160261; // 0x27205
- field public static final int CMD_OP_ENALBE_RESPONDER_FAILED = 160264; // 0x27208
- field public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED = 160263; // 0x27207
- field public static final int CMD_OP_FAILED = 160258; // 0x27202
- field public static final int CMD_OP_START_RANGING = 160256; // 0x27200
- field public static final int CMD_OP_STOP_RANGING = 160257; // 0x27201
- field public static final int CMD_OP_SUCCEEDED = 160259; // 0x27203
- field public static final java.lang.String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description";
- field public static final int PREAMBLE_HT = 2; // 0x2
- field public static final int PREAMBLE_LEGACY = 1; // 0x1
- field public static final int PREAMBLE_VHT = 4; // 0x4
- field public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa
- field public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd
- field public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc
- field public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe
- field public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb
- field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
- field public static final int RTT_BW_10_SUPPORT = 2; // 0x2
- field public static final int RTT_BW_160_SUPPORT = 32; // 0x20
- field public static final int RTT_BW_20_SUPPORT = 4; // 0x4
- field public static final int RTT_BW_40_SUPPORT = 8; // 0x8
- field public static final int RTT_BW_5_SUPPORT = 1; // 0x1
- field public static final int RTT_BW_80_SUPPORT = 16; // 0x10
- field public static final deprecated int RTT_CHANNEL_WIDTH_10 = 6; // 0x6
- field public static final deprecated int RTT_CHANNEL_WIDTH_160 = 3; // 0x3
- field public static final deprecated int RTT_CHANNEL_WIDTH_20 = 0; // 0x0
- field public static final deprecated int RTT_CHANNEL_WIDTH_40 = 1; // 0x1
- field public static final deprecated int RTT_CHANNEL_WIDTH_5 = 5; // 0x5
- field public static final deprecated int RTT_CHANNEL_WIDTH_80 = 2; // 0x2
- field public static final deprecated int RTT_CHANNEL_WIDTH_80P80 = 4; // 0x4
- field public static final deprecated int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1; // 0xffffffff
- field public static final int RTT_PEER_NAN = 5; // 0x5
- field public static final int RTT_PEER_P2P_CLIENT = 4; // 0x4
- field public static final int RTT_PEER_P2P_GO = 3; // 0x3
- field public static final int RTT_PEER_TYPE_AP = 1; // 0x1
- field public static final int RTT_PEER_TYPE_STA = 2; // 0x2
- field public static final deprecated int RTT_PEER_TYPE_UNSPECIFIED = 0; // 0x0
- field public static final int RTT_STATUS_ABORTED = 8; // 0x8
- field public static final int RTT_STATUS_FAILURE = 1; // 0x1
- field public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6; // 0x6
- field public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER = 12; // 0xc
- field public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15; // 0xf
- field public static final int RTT_STATUS_FAIL_INVALID_TS = 9; // 0x9
- field public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4; // 0x4
- field public static final int RTT_STATUS_FAIL_NO_CAPABILITY = 7; // 0x7
- field public static final int RTT_STATUS_FAIL_NO_RSP = 2; // 0x2
- field public static final int RTT_STATUS_FAIL_PROTOCOL = 10; // 0xa
- field public static final int RTT_STATUS_FAIL_REJECTED = 3; // 0x3
- field public static final int RTT_STATUS_FAIL_SCHEDULE = 11; // 0xb
- field public static final int RTT_STATUS_FAIL_TM_TIMEOUT = 5; // 0x5
- field public static final int RTT_STATUS_INVALID_REQ = 13; // 0xd
- field public static final int RTT_STATUS_NO_WIFI = 14; // 0xe
- field public static final int RTT_STATUS_SUCCESS = 0; // 0x0
- field public static final deprecated int RTT_TYPE_11_MC = 4; // 0x4
- field public static final deprecated int RTT_TYPE_11_V = 2; // 0x2
- field public static final int RTT_TYPE_ONE_SIDED = 1; // 0x1
- field public static final int RTT_TYPE_TWO_SIDED = 2; // 0x2
- field public static final deprecated int RTT_TYPE_UNSPECIFIED = 0; // 0x0
- }
-
- public deprecated class RttManager.Capabilities {
- ctor public RttManager.Capabilities();
- field public int supportedPeerType;
- field public int supportedType;
- }
-
- public static deprecated class RttManager.ParcelableRttParams implements android.os.Parcelable {
- field public android.net.wifi.RttManager.RttParams[] mParams;
- }
-
- public static deprecated class RttManager.ParcelableRttResults implements android.os.Parcelable {
- ctor public RttManager.ParcelableRttResults(android.net.wifi.RttManager.RttResult[]);
- field public android.net.wifi.RttManager.RttResult[] mResults;
- }
-
- public static abstract deprecated class RttManager.ResponderCallback {
- ctor public RttManager.ResponderCallback();
- method public abstract void onResponderEnableFailure(int);
- method public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig);
- }
-
- public static deprecated class RttManager.ResponderConfig implements android.os.Parcelable {
- ctor public RttManager.ResponderConfig();
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR;
- field public int centerFreq0;
- field public int centerFreq1;
- field public int channelWidth;
- field public int frequency;
- field public java.lang.String macAddress;
- field public int preamble;
- }
-
- public static deprecated class RttManager.RttCapabilities implements android.os.Parcelable {
- ctor public RttManager.RttCapabilities();
- field public int bwSupported;
- field public boolean lciSupported;
- field public boolean lcrSupported;
- field public int mcVersion;
- field public boolean oneSidedRttSupported;
- field public int preambleSupported;
- field public boolean responderSupported;
- field public boolean secureRttSupported;
- field public deprecated boolean supportedPeerType;
- field public deprecated boolean supportedType;
- field public boolean twoSided11McRttSupported;
- }
-
- public static abstract deprecated interface RttManager.RttListener {
- method public abstract void onAborted();
- method public abstract void onFailure(int, java.lang.String);
- method public abstract void onSuccess(android.net.wifi.RttManager.RttResult[]);
- }
-
- public static deprecated class RttManager.RttParams {
- ctor public RttManager.RttParams();
- field public boolean LCIRequest;
- field public boolean LCRRequest;
- field public int bandwidth;
- field public java.lang.String bssid;
- field public int burstTimeout;
- field public int centerFreq0;
- field public int centerFreq1;
- field public int channelWidth;
- field public int deviceType;
- field public int frequency;
- field public int interval;
- field public int numRetriesPerFTMR;
- field public int numRetriesPerMeasurementFrame;
- field public int numSamplesPerBurst;
- field public deprecated int num_retries;
- field public deprecated int num_samples;
- field public int numberBurst;
- field public int preamble;
- field public int requestType;
- field public boolean secure;
- }
-
- public static deprecated class RttManager.RttResult {
- ctor public RttManager.RttResult();
- field public android.net.wifi.RttManager.WifiInformationElement LCI;
- field public android.net.wifi.RttManager.WifiInformationElement LCR;
- field public java.lang.String bssid;
- field public int burstDuration;
- field public int burstNumber;
- field public int distance;
- field public int distanceSpread;
- field public int distanceStandardDeviation;
- field public deprecated int distance_cm;
- field public deprecated int distance_sd_cm;
- field public deprecated int distance_spread_cm;
- field public int frameNumberPerBurstPeer;
- field public int measurementFrameNumber;
- field public int measurementType;
- field public int negotiatedBurstNum;
- field public deprecated int requestType;
- field public int retryAfterDuration;
- field public int rssi;
- field public int rssiSpread;
- field public deprecated int rssi_spread;
- field public long rtt;
- field public long rttSpread;
- field public long rttStandardDeviation;
- field public deprecated long rtt_ns;
- field public deprecated long rtt_sd_ns;
- field public deprecated long rtt_spread_ns;
- field public int rxRate;
- field public boolean secure;
- field public int status;
- field public int successMeasurementFrameNumber;
- field public long ts;
- field public int txRate;
- field public deprecated int tx_rate;
- }
-
- public static deprecated class RttManager.WifiInformationElement {
- ctor public RttManager.WifiInformationElement();
- field public byte[] data;
- field public byte id;
- }
-
- public deprecated class WifiConfiguration implements android.os.Parcelable {
- method public boolean hasNoInternetAccess();
- method public boolean isEphemeral();
- method public boolean isNoInternetAccessExpected();
- field public java.lang.String creatorName;
- field public int creatorUid;
- field public java.lang.String lastUpdateName;
- field public int lastUpdateUid;
- field public boolean meteredHint;
- field public int numAssociation;
- field public int numScorerOverride;
- field public int numScorerOverrideAndSwitchedNetwork;
- field public boolean useExternalScores;
- }
-
- public static class WifiConfiguration.KeyMgmt {
- field public static final int WPA2_PSK = 4; // 0x4
+ field public static final int EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = -2; // 0xfffffffe
+ field public static final int EASY_CONNECT_EVENT_FAILURE_BUSY = -5; // 0xfffffffb
+ field public static final int EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = -4; // 0xfffffffc
+ field public static final int EASY_CONNECT_EVENT_FAILURE_GENERIC = -7; // 0xfffffff9
+ field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = -9; // 0xfffffff7
+ field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_URI = -1; // 0xffffffff
+ field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = -3; // 0xfffffffd
+ field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = -8; // 0xfffffff8
+ field public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa
+ field public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0; // 0x0
+ field public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1; // 0x1
+ field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0; // 0x0
+ }
+
+ @Deprecated public class RttManager {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void disableResponder(android.net.wifi.RttManager.ResponderCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void enableResponder(android.net.wifi.RttManager.ResponderCallback);
+ method @Deprecated public android.net.wifi.RttManager.Capabilities getCapabilities();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.net.wifi.RttManager.RttCapabilities getRttCapabilities();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopRanging(android.net.wifi.RttManager.RttListener);
+ field @Deprecated public static final int BASE = 160256; // 0x27200
+ field @Deprecated public static final int CMD_OP_ABORTED = 160260; // 0x27204
+ field @Deprecated public static final int CMD_OP_DISABLE_RESPONDER = 160262; // 0x27206
+ field @Deprecated public static final int CMD_OP_ENABLE_RESPONDER = 160261; // 0x27205
+ field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_FAILED = 160264; // 0x27208
+ field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED = 160263; // 0x27207
+ field @Deprecated public static final int CMD_OP_FAILED = 160258; // 0x27202
+ field @Deprecated public static final int CMD_OP_START_RANGING = 160256; // 0x27200
+ field @Deprecated public static final int CMD_OP_STOP_RANGING = 160257; // 0x27201
+ field @Deprecated public static final int CMD_OP_SUCCEEDED = 160259; // 0x27203
+ field @Deprecated public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description";
+ field @Deprecated public static final int PREAMBLE_HT = 2; // 0x2
+ field @Deprecated public static final int PREAMBLE_LEGACY = 1; // 0x1
+ field @Deprecated public static final int PREAMBLE_VHT = 4; // 0x4
+ field @Deprecated public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa
+ field @Deprecated public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd
+ field @Deprecated public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc
+ field @Deprecated public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe
+ field @Deprecated public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb
+ field @Deprecated public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
+ field @Deprecated public static final int RTT_BW_10_SUPPORT = 2; // 0x2
+ field @Deprecated public static final int RTT_BW_160_SUPPORT = 32; // 0x20
+ field @Deprecated public static final int RTT_BW_20_SUPPORT = 4; // 0x4
+ field @Deprecated public static final int RTT_BW_40_SUPPORT = 8; // 0x8
+ field @Deprecated public static final int RTT_BW_5_SUPPORT = 1; // 0x1
+ field @Deprecated public static final int RTT_BW_80_SUPPORT = 16; // 0x10
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_10 = 6; // 0x6
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_160 = 3; // 0x3
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_20 = 0; // 0x0
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_40 = 1; // 0x1
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_5 = 5; // 0x5
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_80 = 2; // 0x2
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_80P80 = 4; // 0x4
+ field @Deprecated public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1; // 0xffffffff
+ field @Deprecated public static final int RTT_PEER_NAN = 5; // 0x5
+ field @Deprecated public static final int RTT_PEER_P2P_CLIENT = 4; // 0x4
+ field @Deprecated public static final int RTT_PEER_P2P_GO = 3; // 0x3
+ field @Deprecated public static final int RTT_PEER_TYPE_AP = 1; // 0x1
+ field @Deprecated public static final int RTT_PEER_TYPE_STA = 2; // 0x2
+ field @Deprecated public static final int RTT_PEER_TYPE_UNSPECIFIED = 0; // 0x0
+ field @Deprecated public static final int RTT_STATUS_ABORTED = 8; // 0x8
+ field @Deprecated public static final int RTT_STATUS_FAILURE = 1; // 0x1
+ field @Deprecated public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6; // 0x6
+ field @Deprecated public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER = 12; // 0xc
+ field @Deprecated public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15; // 0xf
+ field @Deprecated public static final int RTT_STATUS_FAIL_INVALID_TS = 9; // 0x9
+ field @Deprecated public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4; // 0x4
+ field @Deprecated public static final int RTT_STATUS_FAIL_NO_CAPABILITY = 7; // 0x7
+ field @Deprecated public static final int RTT_STATUS_FAIL_NO_RSP = 2; // 0x2
+ field @Deprecated public static final int RTT_STATUS_FAIL_PROTOCOL = 10; // 0xa
+ field @Deprecated public static final int RTT_STATUS_FAIL_REJECTED = 3; // 0x3
+ field @Deprecated public static final int RTT_STATUS_FAIL_SCHEDULE = 11; // 0xb
+ field @Deprecated public static final int RTT_STATUS_FAIL_TM_TIMEOUT = 5; // 0x5
+ field @Deprecated public static final int RTT_STATUS_INVALID_REQ = 13; // 0xd
+ field @Deprecated public static final int RTT_STATUS_NO_WIFI = 14; // 0xe
+ field @Deprecated public static final int RTT_STATUS_SUCCESS = 0; // 0x0
+ field @Deprecated public static final int RTT_TYPE_11_MC = 4; // 0x4
+ field @Deprecated public static final int RTT_TYPE_11_V = 2; // 0x2
+ field @Deprecated public static final int RTT_TYPE_ONE_SIDED = 1; // 0x1
+ field @Deprecated public static final int RTT_TYPE_TWO_SIDED = 2; // 0x2
+ field @Deprecated public static final int RTT_TYPE_UNSPECIFIED = 0; // 0x0
+ }
+
+ @Deprecated public class RttManager.Capabilities {
+ ctor @Deprecated public RttManager.Capabilities();
+ field @Deprecated public int supportedPeerType;
+ field @Deprecated public int supportedType;
+ }
+
+ @Deprecated public static class RttManager.ParcelableRttParams implements android.os.Parcelable {
+ field @Deprecated @NonNull public android.net.wifi.RttManager.RttParams[] mParams;
+ }
+
+ @Deprecated public static class RttManager.ParcelableRttResults implements android.os.Parcelable {
+ ctor @Deprecated public RttManager.ParcelableRttResults(android.net.wifi.RttManager.RttResult[]);
+ field @Deprecated public android.net.wifi.RttManager.RttResult[] mResults;
+ }
+
+ @Deprecated public abstract static class RttManager.ResponderCallback {
+ ctor @Deprecated public RttManager.ResponderCallback();
+ method @Deprecated public abstract void onResponderEnableFailure(int);
+ method @Deprecated public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig);
+ }
+
+ @Deprecated public static class RttManager.ResponderConfig implements android.os.Parcelable {
+ ctor @Deprecated public RttManager.ResponderConfig();
+ method @Deprecated public int describeContents();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR;
+ field @Deprecated public int centerFreq0;
+ field @Deprecated public int centerFreq1;
+ field @Deprecated public int channelWidth;
+ field @Deprecated public int frequency;
+ field @Deprecated public String macAddress;
+ field @Deprecated public int preamble;
+ }
+
+ @Deprecated public static class RttManager.RttCapabilities implements android.os.Parcelable {
+ ctor @Deprecated public RttManager.RttCapabilities();
+ field @Deprecated public int bwSupported;
+ field @Deprecated public boolean lciSupported;
+ field @Deprecated public boolean lcrSupported;
+ field @Deprecated public int mcVersion;
+ field @Deprecated public boolean oneSidedRttSupported;
+ field @Deprecated public int preambleSupported;
+ field @Deprecated public boolean responderSupported;
+ field @Deprecated public boolean secureRttSupported;
+ field @Deprecated public boolean supportedPeerType;
+ field @Deprecated public boolean supportedType;
+ field @Deprecated public boolean twoSided11McRttSupported;
+ }
+
+ @Deprecated public static interface RttManager.RttListener {
+ method @Deprecated public void onAborted();
+ method @Deprecated public void onFailure(int, String);
+ method @Deprecated public void onSuccess(android.net.wifi.RttManager.RttResult[]);
+ }
+
+ @Deprecated public static class RttManager.RttParams {
+ ctor @Deprecated public RttManager.RttParams();
+ field @Deprecated public boolean LCIRequest;
+ field @Deprecated public boolean LCRRequest;
+ field @Deprecated public int bandwidth;
+ field @Deprecated public String bssid;
+ field @Deprecated public int burstTimeout;
+ field @Deprecated public int centerFreq0;
+ field @Deprecated public int centerFreq1;
+ field @Deprecated public int channelWidth;
+ field @Deprecated public int deviceType;
+ field @Deprecated public int frequency;
+ field @Deprecated public int interval;
+ field @Deprecated public int numRetriesPerFTMR;
+ field @Deprecated public int numRetriesPerMeasurementFrame;
+ field @Deprecated public int numSamplesPerBurst;
+ field @Deprecated public int num_retries;
+ field @Deprecated public int num_samples;
+ field @Deprecated public int numberBurst;
+ field @Deprecated public int preamble;
+ field @Deprecated public int requestType;
+ field @Deprecated public boolean secure;
+ }
+
+ @Deprecated public static class RttManager.RttResult {
+ ctor @Deprecated public RttManager.RttResult();
+ field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCI;
+ field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCR;
+ field @Deprecated public String bssid;
+ field @Deprecated public int burstDuration;
+ field @Deprecated public int burstNumber;
+ field @Deprecated public int distance;
+ field @Deprecated public int distanceSpread;
+ field @Deprecated public int distanceStandardDeviation;
+ field @Deprecated public int distance_cm;
+ field @Deprecated public int distance_sd_cm;
+ field @Deprecated public int distance_spread_cm;
+ field @Deprecated public int frameNumberPerBurstPeer;
+ field @Deprecated public int measurementFrameNumber;
+ field @Deprecated public int measurementType;
+ field @Deprecated public int negotiatedBurstNum;
+ field @Deprecated public int requestType;
+ field @Deprecated public int retryAfterDuration;
+ field @Deprecated public int rssi;
+ field @Deprecated public int rssiSpread;
+ field @Deprecated public int rssi_spread;
+ field @Deprecated public long rtt;
+ field @Deprecated public long rttSpread;
+ field @Deprecated public long rttStandardDeviation;
+ field @Deprecated public long rtt_ns;
+ field @Deprecated public long rtt_sd_ns;
+ field @Deprecated public long rtt_spread_ns;
+ field @Deprecated public int rxRate;
+ field @Deprecated public boolean secure;
+ field @Deprecated public int status;
+ field @Deprecated public int successMeasurementFrameNumber;
+ field @Deprecated public long ts;
+ field @Deprecated public int txRate;
+ field @Deprecated public int tx_rate;
+ }
+
+ @Deprecated public static class RttManager.WifiInformationElement {
+ ctor @Deprecated public RttManager.WifiInformationElement();
+ field @Deprecated public byte[] data;
+ field @Deprecated public byte id;
+ }
+
+ @Deprecated public class WifiConfiguration implements android.os.Parcelable {
+ method @Deprecated public boolean hasNoInternetAccess();
+ method @Deprecated public boolean isEphemeral();
+ method @Deprecated public boolean isNoInternetAccessExpected();
+ field @Deprecated public String creatorName;
+ field @Deprecated public int creatorUid;
+ field @Deprecated public String lastUpdateName;
+ field @Deprecated public int lastUpdateUid;
+ field @Deprecated public boolean meteredHint;
+ field @Deprecated public int numAssociation;
+ field @Deprecated public int numScorerOverride;
+ field @Deprecated public int numScorerOverrideAndSwitchedNetwork;
+ field @Deprecated public boolean useExternalScores;
+ }
+
+ @Deprecated public static class WifiConfiguration.KeyMgmt {
+ field @Deprecated public static final int WPA2_PSK = 4; // 0x4
+ }
+
+ public class WifiInfo implements android.os.Parcelable {
+ method public boolean isOsuAp();
}
public class WifiManager {
- method public void connect(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
- method public void connect(int, android.net.wifi.WifiManager.ActionListener);
- method public void disable(int, android.net.wifi.WifiManager.ActionListener);
- method public void disableEphemeralNetwork(java.lang.String);
- method public void forget(int, android.net.wifi.WifiManager.ActionListener);
- method public java.util.List<android.net.wifi.WifiConfiguration> getAllMatchingWifiConfigs(java.util.List<android.net.wifi.ScanResult>);
- method public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks();
- method public android.net.wifi.WifiConfiguration getWifiApConfiguration();
- method public int getWifiApState();
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disableEphemeralNetwork(String);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(java.util.List<android.net.wifi.ScanResult>);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
+ method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState();
method public boolean isDeviceToDeviceRttSupported();
method public boolean isPortableHotspotSupported();
- method public boolean isWifiApEnabled();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled();
method public boolean isWifiScannerSupported();
- method public void registerNetworkRequestMatchCallback(android.net.wifi.WifiManager.NetworkRequestMatchCallback, android.os.Handler);
- method public void save(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
- method public void setDeviceMobilityState(int);
- method public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
- method public void startDppAsConfiguratorInitiator(java.lang.String, int, int, android.os.Handler, android.net.wifi.DppStatusCallback);
- method public void startDppAsEnrolleeInitiator(java.lang.String, android.os.Handler, android.net.wifi.DppStatusCallback);
- method public boolean startScan(android.os.WorkSource);
- method public void stopDppSession();
- method public void unregisterNetworkRequestMatchCallback(android.net.wifi.WifiManager.NetworkRequestMatchCallback);
+ method @RequiresPermission("android.permission.NETWORK_SETTINGS") public void registerNetworkRequestMatchCallback(@NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback, @Nullable android.os.Handler);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission("android.permission.WIFI_SET_DEVICE_MOBILITY_STATE") public void setDeviceMobilityState(int);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsEnrolleeInitiator(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
+ method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public boolean startScan(android.os.WorkSource);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startSubscriptionProvisioning(android.net.wifi.hotspot2.OsuProvider, android.net.wifi.hotspot2.ProvisioningCallback, @Nullable android.os.Handler);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void stopEasyConnectSession();
+ method @RequiresPermission("android.permission.NETWORK_SETTINGS") public void unregisterNetworkRequestMatchCallback(@NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback);
field public static final int CHANGE_REASON_ADDED = 0; // 0x0
field public static final int CHANGE_REASON_CONFIG_CHANGE = 2; // 0x2
field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
- field public static final java.lang.String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
+ field public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
field public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1; // 0x1
field public static final int DEVICE_MOBILITY_STATE_LOW_MVMT = 2; // 0x2
field public static final int DEVICE_MOBILITY_STATE_STATIONARY = 3; // 0x3
field public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0; // 0x0
- field public static final int DPP_NETWORK_ROLE_AP = 1; // 0x1
- field public static final int DPP_NETWORK_ROLE_STA = 0; // 0x0
- field public static final java.lang.String EXTRA_CHANGE_REASON = "changeReason";
- field public static final java.lang.String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
- field public static final java.lang.String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
- field public static final java.lang.String EXTRA_WIFI_AP_STATE = "wifi_state";
- field public static final java.lang.String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
- field public static final java.lang.String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
- field public static final java.lang.String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
- field public static final java.lang.String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
+ field public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1; // 0x1
+ field public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0; // 0x0
+ field public static final String EXTRA_CHANGE_REASON = "changeReason";
+ field public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
+ field public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
+ field public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
+ field public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
+ field public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
+ field public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
+ field public static final int PASSPOINT_HOME_NETWORK = 0; // 0x0
+ field public static final int PASSPOINT_ROAMING_NETWORK = 1; // 0x1
+ field public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
field public static final int WIFI_AP_STATE_DISABLED = 11; // 0xb
field public static final int WIFI_AP_STATE_DISABLING = 10; // 0xa
field public static final int WIFI_AP_STATE_ENABLED = 13; // 0xd
field public static final int WIFI_AP_STATE_ENABLING = 12; // 0xc
field public static final int WIFI_AP_STATE_FAILED = 14; // 0xe
- field public static final java.lang.String WIFI_CREDENTIAL_CHANGED_ACTION = "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
+ field public static final String WIFI_CREDENTIAL_CHANGED_ACTION = "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
field public static final int WIFI_CREDENTIAL_FORGOT = 1; // 0x1
field public static final int WIFI_CREDENTIAL_SAVED = 0; // 0x0
}
- public static abstract interface WifiManager.ActionListener {
- method public abstract void onFailure(int);
- method public abstract void onSuccess();
+ public static interface WifiManager.ActionListener {
+ method public void onFailure(int);
+ method public void onSuccess();
}
- public static abstract interface WifiManager.NetworkRequestMatchCallback {
- method public abstract void onAbort();
- method public abstract void onMatch(java.util.List<android.net.wifi.ScanResult>);
- method public abstract void onUserSelectionCallbackRegistration(android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback);
- method public abstract void onUserSelectionConnectFailure(android.net.wifi.WifiConfiguration);
- method public abstract void onUserSelectionConnectSuccess(android.net.wifi.WifiConfiguration);
+ public static interface WifiManager.NetworkRequestMatchCallback {
+ method public void onAbort();
+ method public void onMatch(@NonNull java.util.List<android.net.wifi.ScanResult>);
+ method public void onUserSelectionCallbackRegistration(@NonNull android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback);
+ method public void onUserSelectionConnectFailure(@NonNull android.net.wifi.WifiConfiguration);
+ method public void onUserSelectionConnectSuccess(@NonNull android.net.wifi.WifiConfiguration);
}
- public static abstract interface WifiManager.NetworkRequestUserSelectionCallback {
- method public abstract void reject();
- method public abstract void select(android.net.wifi.WifiConfiguration);
+ public static interface WifiManager.NetworkRequestUserSelectionCallback {
+ method public void reject();
+ method public void select(@NonNull android.net.wifi.WifiConfiguration);
}
public class WifiNetworkConnectionStatistics implements android.os.Parcelable {
@@ -3970,19 +4276,19 @@ package android.net.wifi {
}
public class WifiScanner {
- method public deprecated void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]);
- method public deprecated void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings);
- method public boolean getScanResults();
- method public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
- method public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
- method public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
- method public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
- method public deprecated void startTrackingBssids(android.net.wifi.WifiScanner.BssidInfo[], int, android.net.wifi.WifiScanner.BssidListener);
- method public deprecated void startTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
- method public void stopBackgroundScan(android.net.wifi.WifiScanner.ScanListener);
- method public void stopScan(android.net.wifi.WifiScanner.ScanListener);
- method public deprecated void stopTrackingBssids(android.net.wifi.WifiScanner.BssidListener);
- method public deprecated void stopTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
+ method @Deprecated public void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]);
+ method @Deprecated public void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean getScanResults();
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
+ method @Deprecated public void startTrackingBssids(android.net.wifi.WifiScanner.BssidInfo[], int, android.net.wifi.WifiScanner.BssidListener);
+ method @Deprecated public void startTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopBackgroundScan(android.net.wifi.WifiScanner.ScanListener);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopScan(android.net.wifi.WifiScanner.ScanListener);
+ method @Deprecated public void stopTrackingBssids(android.net.wifi.WifiScanner.BssidListener);
+ method @Deprecated public void stopTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
field public static final int MAX_SCAN_PERIOD_MS = 1024000; // 0xfa000
field public static final int MIN_SCAN_PERIOD_MS = 1000; // 0x3e8
field public static final int REASON_DUPLICATE_REQEUST = -5; // 0xfffffffb
@@ -3991,7 +4297,7 @@ package android.net.wifi {
field public static final int REASON_NOT_AUTHORIZED = -4; // 0xfffffffc
field public static final int REASON_SUCCEEDED = 0; // 0x0
field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
- field public static final deprecated int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0
+ field @Deprecated public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0
field public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1; // 0x1
field public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2; // 0x2
field public static final int REPORT_EVENT_NO_BATCH = 4; // 0x4
@@ -4004,22 +4310,22 @@ package android.net.wifi {
field public static final int WIFI_BAND_UNSPECIFIED = 0; // 0x0
}
- public static abstract interface WifiScanner.ActionListener {
- method public abstract void onFailure(int, java.lang.String);
- method public abstract void onSuccess();
+ public static interface WifiScanner.ActionListener {
+ method public void onFailure(int, String);
+ method public void onSuccess();
}
- public static deprecated class WifiScanner.BssidInfo {
- ctor public WifiScanner.BssidInfo();
- field public java.lang.String bssid;
- field public int frequencyHint;
- field public int high;
- field public int low;
+ @Deprecated public static class WifiScanner.BssidInfo {
+ ctor @Deprecated public WifiScanner.BssidInfo();
+ field @Deprecated public String bssid;
+ field @Deprecated public int frequencyHint;
+ field @Deprecated public int high;
+ field @Deprecated public int low;
}
- public static abstract deprecated interface WifiScanner.BssidListener implements android.net.wifi.WifiScanner.ActionListener {
- method public abstract void onFound(android.net.wifi.ScanResult[]);
- method public abstract void onLost(android.net.wifi.ScanResult[]);
+ @Deprecated public static interface WifiScanner.BssidListener extends android.net.wifi.WifiScanner.ActionListener {
+ method @Deprecated public void onFound(android.net.wifi.ScanResult[]);
+ method @Deprecated public void onLost(android.net.wifi.ScanResult[]);
}
public static class WifiScanner.ChannelSpec {
@@ -4027,10 +4333,10 @@ package android.net.wifi {
field public int frequency;
}
- public static deprecated class WifiScanner.HotlistSettings implements android.os.Parcelable {
- ctor public WifiScanner.HotlistSettings();
- field public int apLostThreshold;
- field public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
+ @Deprecated public static class WifiScanner.HotlistSettings implements android.os.Parcelable {
+ ctor @Deprecated public WifiScanner.HotlistSettings();
+ field @Deprecated public int apLostThreshold;
+ field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
}
public static class WifiScanner.ParcelableScanData implements android.os.Parcelable {
@@ -4053,17 +4359,17 @@ package android.net.wifi {
method public android.net.wifi.ScanResult[] getResults();
}
- public static abstract interface WifiScanner.ScanListener implements android.net.wifi.WifiScanner.ActionListener {
- method public abstract void onFullResult(android.net.wifi.ScanResult);
- method public abstract void onPeriodChanged(int);
- method public abstract void onResults(android.net.wifi.WifiScanner.ScanData[]);
+ public static interface WifiScanner.ScanListener extends android.net.wifi.WifiScanner.ActionListener {
+ method public void onFullResult(android.net.wifi.ScanResult);
+ method public void onPeriodChanged(int);
+ method public void onResults(android.net.wifi.WifiScanner.ScanData[]);
}
public static class WifiScanner.ScanSettings implements android.os.Parcelable {
ctor public WifiScanner.ScanSettings();
field public int band;
field public android.net.wifi.WifiScanner.ChannelSpec[] channels;
- field public boolean ignoreLocationSettings;
+ field @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean ignoreLocationSettings;
field public int maxPeriodInMs;
field public int maxScansToCache;
field public int numBssidsPerScan;
@@ -4072,19 +4378,19 @@ package android.net.wifi {
field public int stepCount;
}
- public static abstract deprecated interface WifiScanner.WifiChangeListener implements android.net.wifi.WifiScanner.ActionListener {
- method public abstract void onChanging(android.net.wifi.ScanResult[]);
- method public abstract void onQuiescence(android.net.wifi.ScanResult[]);
+ @Deprecated public static interface WifiScanner.WifiChangeListener extends android.net.wifi.WifiScanner.ActionListener {
+ method @Deprecated public void onChanging(android.net.wifi.ScanResult[]);
+ method @Deprecated public void onQuiescence(android.net.wifi.ScanResult[]);
}
- public static deprecated class WifiScanner.WifiChangeSettings implements android.os.Parcelable {
- ctor public WifiScanner.WifiChangeSettings();
- field public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
- field public int lostApSampleSize;
- field public int minApsBreachingThreshold;
- field public int periodInMs;
- field public int rssiSampleSize;
- field public int unchangedSampleSize;
+ @Deprecated public static class WifiScanner.WifiChangeSettings implements android.os.Parcelable {
+ ctor @Deprecated public WifiScanner.WifiChangeSettings();
+ field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
+ field @Deprecated public int lostApSampleSize;
+ field @Deprecated public int minApsBreachingThreshold;
+ field @Deprecated public int periodInMs;
+ field @Deprecated public int rssiSampleSize;
+ field @Deprecated public int unchangedSampleSize;
}
}
@@ -4092,15 +4398,68 @@ package android.net.wifi {
package android.net.wifi.aware {
public class DiscoverySession implements java.lang.AutoCloseable {
- method public deprecated android.net.NetworkSpecifier createNetworkSpecifierPmk(android.net.wifi.aware.PeerHandle, byte[]);
+ method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]);
}
public static class WifiAwareManager.NetworkSpecifierBuilder {
- method public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPmk(byte[]);
+ method @NonNull public android.net.wifi.aware.WifiAwareManager.NetworkSpecifierBuilder setPmk(@NonNull byte[]);
}
public class WifiAwareSession implements java.lang.AutoCloseable {
- method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, byte[], byte[]);
+ method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]);
+ }
+
+}
+
+package android.net.wifi.hotspot2 {
+
+ public final class OsuProvider implements android.os.Parcelable {
+ method public int describeContents();
+ method public String getFriendlyName();
+ method public android.net.Uri getServerUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.OsuProvider> CREATOR;
+ }
+
+ public abstract class ProvisioningCallback {
+ ctor public ProvisioningCallback();
+ method public abstract void onProvisioningComplete();
+ method public abstract void onProvisioningFailure(int);
+ method public abstract void onProvisioningStatus(int);
+ field public static final int OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22; // 0x16
+ field public static final int OSU_FAILURE_AP_CONNECTION = 1; // 0x1
+ field public static final int OSU_FAILURE_INVALID_SERVER_URL = 8; // 0x8
+ field public static final int OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17; // 0x11
+ field public static final int OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21; // 0x15
+ field public static final int OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14; // 0xe
+ field public static final int OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19; // 0x13
+ field public static final int OSU_FAILURE_NO_PPS_MO = 16; // 0x10
+ field public static final int OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18; // 0x12
+ field public static final int OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23; // 0x17
+ field public static final int OSU_FAILURE_PROVISIONING_ABORTED = 6; // 0x6
+ field public static final int OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7; // 0x7
+ field public static final int OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20; // 0x14
+ field public static final int OSU_FAILURE_SERVER_CONNECTION = 3; // 0x3
+ field public static final int OSU_FAILURE_SERVER_URL_INVALID = 2; // 0x2
+ field public static final int OSU_FAILURE_SERVER_VALIDATION = 4; // 0x4
+ field public static final int OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5; // 0x5
+ field public static final int OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11; // 0xb
+ field public static final int OSU_FAILURE_START_REDIRECT_LISTENER = 12; // 0xc
+ field public static final int OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13; // 0xd
+ field public static final int OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9; // 0x9
+ field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15; // 0xf
+ field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10; // 0xa
+ field public static final int OSU_STATUS_AP_CONNECTED = 2; // 0x2
+ field public static final int OSU_STATUS_AP_CONNECTING = 1; // 0x1
+ field public static final int OSU_STATUS_INIT_SOAP_EXCHANGE = 6; // 0x6
+ field public static final int OSU_STATUS_REDIRECT_RESPONSE_RECEIVED = 8; // 0x8
+ field public static final int OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS = 11; // 0xb
+ field public static final int OSU_STATUS_SECOND_SOAP_EXCHANGE = 9; // 0x9
+ field public static final int OSU_STATUS_SERVER_CONNECTED = 5; // 0x5
+ field public static final int OSU_STATUS_SERVER_CONNECTING = 3; // 0x3
+ field public static final int OSU_STATUS_SERVER_VALIDATED = 4; // 0x4
+ field public static final int OSU_STATUS_THIRD_SOAP_EXCHANGE = 10; // 0xa
+ field public static final int OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE = 7; // 0x7
}
}
@@ -4108,17 +4467,17 @@ package android.net.wifi.aware {
package android.net.wifi.rtt {
public static final class RangingRequest.Builder {
- method public android.net.wifi.rtt.RangingRequest.Builder addResponder(android.net.wifi.rtt.ResponderConfig);
+ method public android.net.wifi.rtt.RangingRequest.Builder addResponder(@NonNull android.net.wifi.rtt.ResponderConfig);
}
public final class RangingResult implements android.os.Parcelable {
- method public byte[] getLci();
- method public byte[] getLcr();
+ method @NonNull public byte[] getLci();
+ method @NonNull public byte[] getLcr();
}
public final class ResponderConfig implements android.os.Parcelable {
- ctor public ResponderConfig(android.net.MacAddress, int, boolean, int, int, int, int, int);
- ctor public ResponderConfig(android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int);
+ ctor public ResponderConfig(@NonNull android.net.MacAddress, int, boolean, int, int, int, int, int);
+ ctor public ResponderConfig(@NonNull android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int);
method public int describeContents();
method public static android.net.wifi.rtt.ResponderConfig fromScanResult(android.net.wifi.ScanResult);
method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerHandleWithDefaults(android.net.wifi.aware.PeerHandle);
@@ -4150,8 +4509,8 @@ package android.net.wifi.rtt {
}
public class WifiRttManager {
- method public void cancelRanging(android.os.WorkSource);
- method public void startRanging(android.os.WorkSource, android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback);
+ method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE}) public void cancelRanging(@Nullable android.os.WorkSource);
+ method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@Nullable android.os.WorkSource, @NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback);
}
}
@@ -4159,19 +4518,19 @@ package android.net.wifi.rtt {
package android.nfc {
public final class NfcAdapter {
- method public boolean addNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler, java.lang.String[]);
- method public boolean disable();
- method public boolean disable(boolean);
- method public boolean disableNdefPush();
- method public boolean enable();
- method public boolean enableNdefPush();
- method public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean addNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler, String[]);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disable();
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disable(boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disableNdefPush();
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enable();
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableNdefPush();
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler);
method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, int);
field public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 1; // 0x1
}
- public static abstract interface NfcAdapter.NfcUnlockHandler {
- method public abstract boolean onUnlockAttempted(android.nfc.Tag);
+ public static interface NfcAdapter.NfcUnlockHandler {
+ method public boolean onUnlockAttempted(android.nfc.Tag);
}
}
@@ -4179,8 +4538,8 @@ package android.nfc {
package android.os {
public class BatteryManager {
- field public static final java.lang.String EXTRA_EVENTS = "android.os.extra.EVENTS";
- field public static final java.lang.String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";
+ field public static final String EXTRA_EVENTS = "android.os.extra.EVENTS";
+ field public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";
}
public class Binder implements android.os.IBinder {
@@ -4188,25 +4547,29 @@ package android.os {
method public static final int getCallingWorkSourceUid();
method public static final void restoreCallingWorkSource(long);
method public static final long setCallingWorkSourceUid(int);
- method public static void setProxyTransactListener(android.os.Binder.ProxyTransactListener);
+ method public static void setProxyTransactListener(@Nullable android.os.Binder.ProxyTransactListener);
}
- public static abstract interface Binder.ProxyTransactListener {
- method public abstract void onTransactEnded(java.lang.Object);
- method public abstract java.lang.Object onTransactStarted(android.os.IBinder, int);
+ public static interface Binder.ProxyTransactListener {
+ method public void onTransactEnded(@Nullable Object);
+ method public Object onTransactStarted(android.os.IBinder, int);
+ }
+
+ public static class Build.VERSION {
+ field public static final String PREVIEW_SDK_FINGERPRINT;
}
public final class ConfigUpdate {
- field public static final java.lang.String ACTION_UPDATE_CARRIER_ID_DB = "android.os.action.UPDATE_CARRIER_ID_DB";
- field public static final java.lang.String ACTION_UPDATE_CARRIER_PROVISIONING_URLS = "android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS";
- field public static final java.lang.String ACTION_UPDATE_CONVERSATION_ACTIONS = "android.intent.action.UPDATE_CONVERSATION_ACTIONS";
- field public static final java.lang.String ACTION_UPDATE_CT_LOGS = "android.intent.action.UPDATE_CT_LOGS";
- field public static final java.lang.String ACTION_UPDATE_INTENT_FIREWALL = "android.intent.action.UPDATE_INTENT_FIREWALL";
- field public static final java.lang.String ACTION_UPDATE_LANG_ID = "android.intent.action.UPDATE_LANG_ID";
- field public static final java.lang.String ACTION_UPDATE_NETWORK_WATCHLIST = "android.intent.action.UPDATE_NETWORK_WATCHLIST";
- field public static final java.lang.String ACTION_UPDATE_PINS = "android.intent.action.UPDATE_PINS";
- field public static final java.lang.String ACTION_UPDATE_SMART_SELECTION = "android.intent.action.UPDATE_SMART_SELECTION";
- field public static final java.lang.String ACTION_UPDATE_SMS_SHORT_CODES = "android.intent.action.UPDATE_SMS_SHORT_CODES";
+ field public static final String ACTION_UPDATE_CARRIER_ID_DB = "android.os.action.UPDATE_CARRIER_ID_DB";
+ field public static final String ACTION_UPDATE_CARRIER_PROVISIONING_URLS = "android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS";
+ field public static final String ACTION_UPDATE_CONVERSATION_ACTIONS = "android.intent.action.UPDATE_CONVERSATION_ACTIONS";
+ field public static final String ACTION_UPDATE_CT_LOGS = "android.intent.action.UPDATE_CT_LOGS";
+ field public static final String ACTION_UPDATE_INTENT_FIREWALL = "android.intent.action.UPDATE_INTENT_FIREWALL";
+ field public static final String ACTION_UPDATE_LANG_ID = "android.intent.action.UPDATE_LANG_ID";
+ field public static final String ACTION_UPDATE_NETWORK_WATCHLIST = "android.intent.action.UPDATE_NETWORK_WATCHLIST";
+ field public static final String ACTION_UPDATE_PINS = "android.intent.action.UPDATE_PINS";
+ field public static final String ACTION_UPDATE_SMART_SELECTION = "android.intent.action.UPDATE_SMART_SELECTION";
+ field public static final String ACTION_UPDATE_SMS_SHORT_CODES = "android.intent.action.UPDATE_SMS_SHORT_CODES";
}
public class Environment {
@@ -4218,21 +4581,21 @@ package android.os {
}
public class HidlSupport {
- method public static boolean deepEquals(java.lang.Object, java.lang.Object);
- method public static int deepHashCode(java.lang.Object);
+ method public static boolean deepEquals(Object, Object);
+ method public static int deepHashCode(Object);
method public static int getPidIfSharable();
- method public static boolean interfacesEqual(android.os.IHwInterface, java.lang.Object);
+ method public static boolean interfacesEqual(android.os.IHwInterface, Object);
}
public abstract class HwBinder implements android.os.IHwBinder {
ctor public HwBinder();
method public static final void configureRpcThreadpool(long, boolean);
method public static void enableInstrumentation();
- method public static final android.os.IHwBinder getService(java.lang.String, java.lang.String) throws java.util.NoSuchElementException, android.os.RemoteException;
- method public static final android.os.IHwBinder getService(java.lang.String, java.lang.String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException;
+ method public static final android.os.IHwBinder getService(String, String) throws java.util.NoSuchElementException, android.os.RemoteException;
+ method public static final android.os.IHwBinder getService(String, String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException;
method public static final void joinRpcThreadpool();
method public abstract void onTransact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
- method public final void registerService(java.lang.String) throws android.os.RemoteException;
+ method public final void registerService(String) throws android.os.RemoteException;
method public final void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
}
@@ -4252,7 +4615,7 @@ package android.os {
method public final int getInt32(long);
method public final long getInt64(long);
method public final byte getInt8(long);
- method public final java.lang.String getString(long);
+ method public final String getString(long);
method public final long handle();
method public final void putBlob(long, android.os.HwBlob);
method public final void putBool(long, boolean);
@@ -4270,19 +4633,19 @@ package android.os {
method public final void putInt8(long, byte);
method public final void putInt8Array(long, byte[]);
method public final void putNativeHandle(long, android.os.NativeHandle);
- method public final void putString(long, java.lang.String);
- method public static java.lang.Boolean[] wrapArray(boolean[]);
- method public static java.lang.Long[] wrapArray(long[]);
- method public static java.lang.Byte[] wrapArray(byte[]);
- method public static java.lang.Short[] wrapArray(short[]);
- method public static java.lang.Integer[] wrapArray(int[]);
- method public static java.lang.Float[] wrapArray(float[]);
- method public static java.lang.Double[] wrapArray(double[]);
+ method public final void putString(long, String);
+ method public static Boolean[] wrapArray(@NonNull boolean[]);
+ method public static Long[] wrapArray(@NonNull long[]);
+ method public static Byte[] wrapArray(@NonNull byte[]);
+ method public static Short[] wrapArray(@NonNull short[]);
+ method public static Integer[] wrapArray(@NonNull int[]);
+ method public static Float[] wrapArray(@NonNull float[]);
+ method public static Double[] wrapArray(@NonNull double[]);
}
public class HwParcel {
ctor public HwParcel();
- method public final void enforceInterface(java.lang.String);
+ method public final void enforceInterface(String);
method public final boolean readBool();
method public final java.util.ArrayList<java.lang.Boolean> readBoolVector();
method public final android.os.HwBlob readBuffer(long);
@@ -4302,7 +4665,7 @@ package android.os {
method public final java.util.ArrayList<java.lang.Byte> readInt8Vector();
method public final android.os.NativeHandle readNativeHandle();
method public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector();
- method public final java.lang.String readString();
+ method public final String readString();
method public final java.util.ArrayList<java.lang.String> readStringVector();
method public final android.os.IHwBinder readStrongBinder();
method public final void release();
@@ -4324,36 +4687,36 @@ package android.os {
method public final void writeInt64Vector(java.util.ArrayList<java.lang.Long>);
method public final void writeInt8(byte);
method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>);
- method public final void writeInterfaceToken(java.lang.String);
+ method public final void writeInterfaceToken(String);
method public final void writeNativeHandle(android.os.NativeHandle);
method public final void writeNativeHandleVector(java.util.ArrayList<android.os.NativeHandle>);
method public final void writeStatus(int);
- method public final void writeString(java.lang.String);
+ method public final void writeString(String);
method public final void writeStringVector(java.util.ArrayList<java.lang.String>);
method public final void writeStrongBinder(android.os.IHwBinder);
field public static final int STATUS_SUCCESS = 0; // 0x0
}
- public static abstract class HwParcel.Status implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"STATUS_"}, value={android.os.HwParcel.STATUS_SUCCESS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface HwParcel.Status {
}
- public abstract interface IHwBinder {
- method public abstract boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long);
- method public abstract android.os.IHwInterface queryLocalInterface(java.lang.String);
- method public abstract void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
- method public abstract boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient);
+ public interface IHwBinder {
+ method public boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long);
+ method public android.os.IHwInterface queryLocalInterface(String);
+ method public void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
+ method public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient);
}
- public static abstract interface IHwBinder.DeathRecipient {
- method public abstract void serviceDied(long);
+ public static interface IHwBinder.DeathRecipient {
+ method public void serviceDied(long);
}
- public abstract interface IHwInterface {
- method public abstract android.os.IHwBinder asBinder();
+ public interface IHwInterface {
+ method public android.os.IHwBinder asBinder();
}
public class IncidentManager {
- method public void reportIncident(android.os.IncidentReportArgs);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
}
public final class IncidentReportArgs implements android.os.Parcelable {
@@ -4374,8 +4737,8 @@ package android.os {
public final class NativeHandle implements java.io.Closeable {
ctor public NativeHandle();
- ctor public NativeHandle(java.io.FileDescriptor, boolean);
- ctor public NativeHandle(java.io.FileDescriptor[], int[], boolean);
+ ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean);
+ ctor public NativeHandle(@NonNull java.io.FileDescriptor[], @NonNull int[], boolean);
method public void close() throws java.io.IOException;
method public android.os.NativeHandle dup() throws java.io.IOException;
method public java.io.FileDescriptor getFileDescriptor();
@@ -4385,11 +4748,11 @@ package android.os {
}
public final class PowerManager {
- method public void dream(long);
- method public int getPowerSaveMode();
- method public boolean setDynamicPowerSavings(boolean, int);
- method public boolean setPowerSaveMode(boolean);
- method public void userActivity(long, int, int);
+ method @RequiresPermission(allOf={android.Manifest.permission.READ_DREAM_STATE, android.Manifest.permission.WRITE_DREAM_STATE}) public void dream(long);
+ method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveMode();
+ method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setDynamicPowerSavings(boolean, int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setPowerSaveMode(boolean);
+ method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.USER_ACTIVITY}) public void userActivity(long, int, int);
field public static final int POWER_SAVER_MODE_DYNAMIC = 1; // 0x1
field public static final int POWER_SAVER_MODE_PERCENTAGE = 0; // 0x0
field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3
@@ -4401,26 +4764,26 @@ package android.os {
}
public class RecoverySystem {
- method public static void cancelScheduledUpdate(android.content.Context) throws java.io.IOException;
- method public static void installPackage(android.content.Context, java.io.File, boolean) throws java.io.IOException;
- method public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener, android.os.Handler) throws java.io.IOException;
- method public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener) throws java.io.IOException;
- method public static void rebootWipeAb(android.content.Context, java.io.File, java.lang.String) throws java.io.IOException;
- method public static void scheduleUpdateOnBoot(android.content.Context, java.io.File) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void cancelScheduledUpdate(android.content.Context) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void installPackage(android.content.Context, java.io.File, boolean) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener, android.os.Handler) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener) throws java.io.IOException;
+ method @RequiresPermission(allOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootWipeAb(android.content.Context, java.io.File, String) throws java.io.IOException;
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void scheduleUpdateOnBoot(android.content.Context, java.io.File) throws java.io.IOException;
method public static boolean verifyPackageCompatibility(java.io.File) throws java.io.IOException;
}
public final class RemoteCallback implements android.os.Parcelable {
ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener);
- ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener, android.os.Handler);
+ ctor public RemoteCallback(@NonNull android.os.RemoteCallback.OnResultListener, @Nullable android.os.Handler);
method public int describeContents();
- method public void sendResult(android.os.Bundle);
+ method public void sendResult(@Nullable android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.RemoteCallback> CREATOR;
}
- public static abstract interface RemoteCallback.OnResultListener {
- method public abstract void onResult(android.os.Bundle);
+ public static interface RemoteCallback.OnResultListener {
+ method public void onResult(android.os.Bundle);
}
public final class StatsDimensionsValue implements android.os.Parcelable {
@@ -4430,7 +4793,7 @@ package android.os {
method public float getFloatValue();
method public int getIntValue();
method public long getLongValue();
- method public java.lang.String getStringValue();
+ method public String getStringValue();
method public java.util.List<android.os.StatsDimensionsValue> getTupleValueList();
method public int getValueType();
method public boolean isValueType(int);
@@ -4445,21 +4808,21 @@ package android.os {
}
public class SystemProperties {
- method public static java.lang.String get(java.lang.String);
- method public static java.lang.String get(java.lang.String, java.lang.String);
- method public static boolean getBoolean(java.lang.String, boolean);
- method public static int getInt(java.lang.String, int);
- method public static long getLong(java.lang.String, long);
+ method @NonNull public static String get(@NonNull String);
+ method @NonNull public static String get(@NonNull String, @Nullable String);
+ method public static boolean getBoolean(@NonNull String, boolean);
+ method public static int getInt(@NonNull String, int);
+ method public static long getLong(@NonNull String, long);
}
public class SystemUpdateManager {
- method public android.os.Bundle retrieveSystemUpdateInfo();
- method public void updateSystemUpdateInfo(android.os.PersistableBundle);
- field public static final java.lang.String KEY_IS_SECURITY_UPDATE = "is_security_update";
- field public static final java.lang.String KEY_STATUS = "status";
- field public static final java.lang.String KEY_TARGET_BUILD_FINGERPRINT = "target_build_fingerprint";
- field public static final java.lang.String KEY_TARGET_SECURITY_PATCH_LEVEL = "target_security_patch_level";
- field public static final java.lang.String KEY_TITLE = "title";
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_SYSTEM_UPDATE_INFO, android.Manifest.permission.RECOVERY}) public android.os.Bundle retrieveSystemUpdateInfo();
+ method @RequiresPermission(android.Manifest.permission.RECOVERY) public void updateSystemUpdateInfo(android.os.PersistableBundle);
+ field public static final String KEY_IS_SECURITY_UPDATE = "is_security_update";
+ field public static final String KEY_STATUS = "status";
+ field public static final String KEY_TARGET_BUILD_FINGERPRINT = "target_build_fingerprint";
+ field public static final String KEY_TARGET_SECURITY_PATCH_LEVEL = "target_security_patch_level";
+ field public static final String KEY_TITLE = "title";
field public static final int STATUS_IDLE = 1; // 0x1
field public static final int STATUS_IN_PROGRESS = 3; // 0x3
field public static final int STATUS_UNKNOWN = 0; // 0x0
@@ -4470,7 +4833,7 @@ package android.os {
public class UpdateEngine {
ctor public UpdateEngine();
- method public void applyPayload(java.lang.String, long, long, java.lang.String[]);
+ method public void applyPayload(String, long, long, String[]);
method public boolean bind(android.os.UpdateEngineCallback, android.os.Handler);
method public boolean bind(android.os.UpdateEngineCallback);
method public void cancel();
@@ -4478,7 +4841,7 @@ package android.os {
method public void resume();
method public void suspend();
method public boolean unbind();
- method public boolean verifyPayloadMetadata(java.lang.String);
+ method public boolean verifyPayloadMetadata(String);
}
public static final class UpdateEngine.ErrorCodeConstants {
@@ -4492,6 +4855,7 @@ package android.os {
field public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10; // 0xa
field public static final int PAYLOAD_MISMATCHED_TYPE_ERROR = 6; // 0x6
field public static final int PAYLOAD_SIZE_MISMATCH_ERROR = 11; // 0xb
+ field public static final int PAYLOAD_TIMESTAMP_ERROR = 51; // 0x33
field public static final int POST_INSTALL_RUNNER_ERROR = 5; // 0x5
field public static final int SUCCESS = 0; // 0x0
field public static final int UPDATED_BUT_NOT_ACTIVE = 52; // 0x34
@@ -4519,7 +4883,7 @@ package android.os {
public final class UserHandle implements android.os.Parcelable {
method public int getIdentifier();
- method public deprecated boolean isOwner();
+ method @Deprecated public boolean isOwner();
method public boolean isSystem();
method public static int myUserId();
method public static android.os.UserHandle of(int);
@@ -4529,26 +4893,26 @@ package android.os {
}
public class UserManager {
- method public boolean canSwitchUsers();
- method public void clearSeedAccountData();
- method public android.os.UserHandle getProfileParent(android.os.UserHandle);
- method public java.lang.String getSeedAccountName();
- method public android.os.PersistableBundle getSeedAccountOptions();
- method public java.lang.String getSeedAccountType();
- method public long[] getSerialNumbersOfUsers(boolean);
- method public deprecated int getUserRestrictionSource(java.lang.String, android.os.UserHandle);
- method public java.util.List<android.os.UserManager.EnforcingUser> getUserRestrictionSources(java.lang.String, android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean canSwitchUsers();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void clearSeedAccountData();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.UserHandle getProfileParent(@NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountName();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.PersistableBundle getSeedAccountOptions();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountType();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public long[] getSerialNumbersOfUsers(boolean);
+ method @Deprecated @android.os.UserManager.UserRestrictionSource @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int getUserRestrictionSource(String, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<android.os.UserManager.EnforcingUser> getUserRestrictionSources(String, android.os.UserHandle);
method public boolean hasRestrictedProfiles();
- method public boolean isAdminUser();
- method public boolean isGuestUser();
- method public boolean isManagedProfile();
- method public boolean isManagedProfile(int);
- method public boolean isPrimaryUser();
- method public boolean isRestrictedProfile();
- method public boolean removeUser(android.os.UserHandle);
- field public static final java.lang.String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
- field public static final deprecated java.lang.String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
- field public static final java.lang.String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isAdminUser();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isGuestUser();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedProfile();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedProfile(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isPrimaryUser();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isRestrictedProfile();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean removeUser(android.os.UserHandle);
+ field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
+ field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
+ field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
field public static final int RESTRICTION_NOT_SET = 0; // 0x0
field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2
field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4
@@ -4558,12 +4922,12 @@ package android.os {
public static final class UserManager.EnforcingUser implements android.os.Parcelable {
method public int describeContents();
method public android.os.UserHandle getUserHandle();
- method public int getUserRestrictionSource();
+ method @android.os.UserManager.UserRestrictionSource public int getUserRestrictionSource();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.UserManager.EnforcingUser> CREATOR;
}
- public static abstract class UserManager.UserRestrictionSource implements java.lang.annotation.Annotation {
+ @IntDef(flag=true, prefix={"RESTRICTION_"}, value={android.os.UserManager.RESTRICTION_NOT_SET, android.os.UserManager.RESTRICTION_SOURCE_SYSTEM, android.os.UserManager.RESTRICTION_SOURCE_DEVICE_OWNER, android.os.UserManager.RESTRICTION_SOURCE_PROFILE_OWNER}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface UserManager.UserRestrictionSource {
}
public class WorkSource implements android.os.Parcelable {
@@ -4572,9 +4936,9 @@ package android.os {
public static final class WorkSource.WorkChain implements android.os.Parcelable {
ctor public WorkSource.WorkChain();
- method public android.os.WorkSource.WorkChain addNode(int, java.lang.String);
+ method public android.os.WorkSource.WorkChain addNode(int, @Nullable String);
method public int describeContents();
- method public java.lang.String getAttributionTag();
+ method public String getAttributionTag();
method public int getAttributionUid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.WorkSource.WorkChain> CREATOR;
@@ -4585,67 +4949,90 @@ package android.os {
package android.os.storage {
public class StorageManager {
- method public void allocateBytes(java.util.UUID, long, int) throws java.io.IOException;
- method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
- method public long getAllocatableBytes(java.util.UUID, int) throws java.io.IOException;
+ method @WorkerThread public void allocateBytes(@NonNull java.util.UUID, long, @RequiresPermission int) throws java.io.IOException;
+ method @WorkerThread public void allocateBytes(java.io.FileDescriptor, long, @RequiresPermission int) throws java.io.IOException;
+ method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException;
method public static boolean hasIsolatedStorage();
- field public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
+ field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
}
}
package android.permission {
+ public final class PermissionControllerManager {
+ method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
+ field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2
+ field public static final int REASON_MALWARE = 1; // 0x1
+ }
+
+ public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback {
+ ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback();
+ method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
+ }
+
public abstract class PermissionControllerService extends android.app.Service {
ctor public PermissionControllerService();
method public final void attachBaseContext(android.content.Context);
method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract int onCountPermissionApps(java.util.List<java.lang.String>, boolean, boolean);
- method public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(java.lang.String);
- method public abstract void onRevokeRuntimePermission(java.lang.String, java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.permission.PermissionControllerService";
+ method public abstract int onCountPermissionApps(@NonNull java.util.List<java.lang.String>, boolean, boolean);
+ method @NonNull public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String);
+ method public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream);
+ method @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onPermissionUsageResult(boolean, long);
+ method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String);
+ method @NonNull public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull String);
+ field public static final String SERVICE_INTERFACE = "android.permission.PermissionControllerService";
}
public final class PermissionManager {
- method public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();
+ method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();
}
public static final class PermissionManager.SplitPermissionInfo {
- method public java.util.List<java.lang.String> getNewPermissions();
- method public java.lang.String getSplitPermission();
+ method @NonNull public java.util.List<java.lang.String> getNewPermissions();
+ method @NonNull public String getSplitPermission();
method public int getTargetSdk();
}
public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
- ctor public RuntimePermissionPresentationInfo(java.lang.CharSequence, boolean, boolean);
+ ctor public RuntimePermissionPresentationInfo(CharSequence, boolean, boolean);
method public int describeContents();
- method public java.lang.CharSequence getLabel();
+ method @NonNull public CharSequence getLabel();
method public boolean isGranted();
method public boolean isStandard();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR;
}
+ public final class RuntimePermissionUsageInfo implements android.os.Parcelable {
+ ctor public RuntimePermissionUsageInfo(@NonNull CharSequence, int);
+ method public int describeContents();
+ method public int getAppAccessCount();
+ method @NonNull public CharSequence getName();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR;
+ }
+
}
package android.permissionpresenterservice {
- public abstract deprecated class RuntimePermissionPresenterService extends android.app.Service {
- ctor public RuntimePermissionPresenterService();
- method public final void attachBaseContext(android.content.Context);
- method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract java.util.List<android.content.pm.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(java.lang.String);
- method public abstract void onRevokeRuntimePermission(java.lang.String, java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.permissionpresenterservice.RuntimePermissionPresenterService";
+ @Deprecated public abstract class RuntimePermissionPresenterService extends android.app.Service {
+ ctor @Deprecated public RuntimePermissionPresenterService();
+ method @Deprecated public final void attachBaseContext(android.content.Context);
+ method @Deprecated public final android.os.IBinder onBind(android.content.Intent);
+ method @Deprecated public abstract java.util.List<android.content.pm.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String);
+ method @Deprecated public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String);
+ field @Deprecated public static final String SERVICE_INTERFACE = "android.permissionpresenterservice.RuntimePermissionPresenterService";
}
}
package android.preference {
- public deprecated class PreferenceManager {
- method public boolean isStorageCredentialProtected();
- method public void setStorageCredentialProtected();
+ @Deprecated public class PreferenceManager {
+ method @Deprecated public boolean isStorageCredentialProtected();
+ method @Deprecated public void setStorageCredentialProtected();
}
}
@@ -4653,21 +5040,21 @@ package android.preference {
package android.print {
public final class PrintManager {
- method public void addPrintServiceRecommendationsChangeListener(android.print.PrintManager.PrintServiceRecommendationsChangeListener, android.os.Handler);
- method public void addPrintServicesChangeListener(android.print.PrintManager.PrintServicesChangeListener, android.os.Handler);
- method public java.util.List<android.printservice.recommendation.RecommendationInfo> getPrintServiceRecommendations();
- method public java.util.List<android.printservice.PrintServiceInfo> getPrintServices(int);
- method public void removePrintServiceRecommendationsChangeListener(android.print.PrintManager.PrintServiceRecommendationsChangeListener);
- method public void removePrintServicesChangeListener(android.print.PrintManager.PrintServicesChangeListener);
+ method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public void addPrintServiceRecommendationsChangeListener(@NonNull android.print.PrintManager.PrintServiceRecommendationsChangeListener, @Nullable android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public void addPrintServicesChangeListener(@NonNull android.print.PrintManager.PrintServicesChangeListener, @Nullable android.os.Handler);
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public java.util.List<android.printservice.recommendation.RecommendationInfo> getPrintServiceRecommendations();
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public java.util.List<android.printservice.PrintServiceInfo> getPrintServices(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public void removePrintServiceRecommendationsChangeListener(@NonNull android.print.PrintManager.PrintServiceRecommendationsChangeListener);
+ method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public void removePrintServicesChangeListener(@NonNull android.print.PrintManager.PrintServicesChangeListener);
field public static final int ENABLED_SERVICES = 1; // 0x1
}
- public static abstract interface PrintManager.PrintServiceRecommendationsChangeListener {
- method public abstract void onPrintServiceRecommendationsChanged();
+ public static interface PrintManager.PrintServiceRecommendationsChangeListener {
+ method public void onPrintServiceRecommendationsChanged();
}
- public static abstract interface PrintManager.PrintServicesChangeListener {
- method public abstract void onPrintServicesChanged();
+ public static interface PrintManager.PrintServicesChangeListener {
+ method public void onPrintServicesChanged();
}
}
@@ -4676,7 +5063,7 @@ package android.printservice {
public final class PrintServiceInfo implements android.os.Parcelable {
method public int describeContents();
- method public android.content.ComponentName getComponentName();
+ method @NonNull public android.content.ComponentName getComponentName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.printservice.PrintServiceInfo> CREATOR;
}
@@ -4686,13 +5073,13 @@ package android.printservice {
package android.printservice.recommendation {
public final class RecommendationInfo implements android.os.Parcelable {
- ctor public RecommendationInfo(java.lang.CharSequence, java.lang.CharSequence, java.util.List<java.net.InetAddress>, boolean);
- ctor public deprecated RecommendationInfo(java.lang.CharSequence, java.lang.CharSequence, int, boolean);
+ ctor public RecommendationInfo(@NonNull CharSequence, @NonNull CharSequence, @NonNull java.util.List<java.net.InetAddress>, boolean);
+ ctor @Deprecated public RecommendationInfo(@NonNull CharSequence, @NonNull CharSequence, @IntRange(from=0) int, boolean);
method public int describeContents();
- method public java.util.List<java.net.InetAddress> getDiscoveredPrinters();
- method public java.lang.CharSequence getName();
+ method @NonNull public java.util.List<java.net.InetAddress> getDiscoveredPrinters();
+ method public CharSequence getName();
method public int getNumDiscoveredPrinters();
- method public java.lang.CharSequence getPackageName();
+ method public CharSequence getPackageName();
method public boolean recommendsMultiVendorService();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.printservice.recommendation.RecommendationInfo> CREATOR;
@@ -4703,8 +5090,8 @@ package android.printservice.recommendation {
method public final android.os.IBinder onBind(android.content.Intent);
method public abstract void onConnected();
method public abstract void onDisconnected();
- method public final void updateRecommendations(java.util.List<android.printservice.recommendation.RecommendationInfo>);
- field public static final java.lang.String SERVICE_INTERFACE = "android.printservice.recommendation.RecommendationService";
+ method public final void updateRecommendations(@Nullable java.util.List<android.printservice.recommendation.RecommendationInfo>);
+ field public static final String SERVICE_INTERFACE = "android.printservice.recommendation.RecommendationService";
}
}
@@ -4712,53 +5099,57 @@ package android.printservice.recommendation {
package android.provider {
public static final class ContactsContract.MetadataSync implements android.provider.BaseColumns android.provider.ContactsContract.MetadataSyncColumns {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String METADATA_AUTHORITY = "com.android.contacts.metadata";
+ field public static final String METADATA_AUTHORITY = "com.android.contacts.metadata";
field public static final android.net.Uri METADATA_AUTHORITY_URI;
}
- protected static abstract interface ContactsContract.MetadataSyncColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String DATA = "data";
- field public static final java.lang.String DATA_SET = "data_set";
- field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String RAW_CONTACT_BACKUP_ID = "raw_contact_backup_id";
+ protected static interface ContactsContract.MetadataSyncColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String DATA = "data";
+ field public static final String DATA_SET = "data_set";
+ field public static final String DELETED = "deleted";
+ field public static final String RAW_CONTACT_BACKUP_ID = "raw_contact_backup_id";
}
public static final class ContactsContract.MetadataSyncState implements android.provider.BaseColumns android.provider.ContactsContract.MetadataSyncStateColumns {
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata_sync_state";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata_sync_state";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata_sync_state";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata_sync_state";
field public static final android.net.Uri CONTENT_URI;
}
- protected static abstract interface ContactsContract.MetadataSyncStateColumns {
- field public static final java.lang.String ACCOUNT_NAME = "account_name";
- field public static final java.lang.String ACCOUNT_TYPE = "account_type";
- field public static final java.lang.String DATA_SET = "data_set";
- field public static final java.lang.String STATE = "state";
+ protected static interface ContactsContract.MetadataSyncStateColumns {
+ field public static final String ACCOUNT_NAME = "account_name";
+ field public static final String ACCOUNT_TYPE = "account_type";
+ field public static final String DATA_SET = "data_set";
+ field public static final String STATE = "state";
}
public final class DeviceConfig {
- method public static void addOnPropertyChangedListener(java.lang.String, java.util.concurrent.Executor, android.provider.DeviceConfig.OnPropertyChangedListener);
- method public static java.lang.String getProperty(java.lang.String, java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(String, String);
method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener);
- method public static void resetToDefaults(int, java.lang.String);
- method public static boolean setProperty(java.lang.String, java.lang.String, java.lang.String, boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean);
+ field public static final String NAMESPACE_AUTOFILL = "autofill";
+ field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
+ field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
+ field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
}
- public static abstract interface DeviceConfig.OnPropertyChangedListener {
- method public abstract void onPropertyChanged(java.lang.String, java.lang.String, java.lang.String);
+ public static interface DeviceConfig.OnPropertyChangedListener {
+ method public void onPropertyChanged(String, String, String);
}
public final class DocumentsContract {
method public static boolean isManageMode(android.net.Uri);
method public static android.net.Uri setManageMode(android.net.Uri);
- field public static final java.lang.String ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT";
- field public static final java.lang.String EXTRA_SHOW_ADVANCED = "android.provider.extra.SHOW_ADVANCED";
+ field public static final String ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS";
+ field public static final String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT";
+ field public static final String EXTRA_SHOW_ADVANCED = "android.provider.extra.SHOW_ADVANCED";
}
public static final class DocumentsContract.Root {
@@ -4771,22 +5162,22 @@ package android.provider {
public abstract class SearchIndexableData {
ctor public SearchIndexableData();
ctor public SearchIndexableData(android.content.Context);
- field public java.lang.String className;
+ field public String className;
field public android.content.Context context;
field public boolean enabled;
field public int iconResId;
- field public java.lang.String intentAction;
- field public java.lang.String intentTargetClass;
- field public java.lang.String intentTargetPackage;
- field public java.lang.String key;
+ field public String intentAction;
+ field public String intentTargetClass;
+ field public String intentTargetPackage;
+ field public String key;
field public java.util.Locale locale;
- field public java.lang.String packageName;
+ field public String packageName;
field public int rank;
field public int userId;
}
public class SearchIndexableResource extends android.provider.SearchIndexableData {
- ctor public SearchIndexableResource(int, int, java.lang.String, int);
+ ctor public SearchIndexableResource(int, int, String, int);
ctor public SearchIndexableResource(android.content.Context);
field public int xmlResId;
}
@@ -4815,150 +5206,165 @@ package android.provider {
field public static final int COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE = 5; // 0x5
field public static final int COLUMN_INDEX_XML_RES_RANK = 0; // 0x0
field public static final int COLUMN_INDEX_XML_RES_RESID = 1; // 0x1
- field public static final java.lang.String INDEXABLES_RAW = "indexables_raw";
- field public static final java.lang.String[] INDEXABLES_RAW_COLUMNS;
- field public static final java.lang.String INDEXABLES_RAW_PATH = "settings/indexables_raw";
- field public static final java.lang.String INDEXABLES_XML_RES = "indexables_xml_res";
- field public static final java.lang.String[] INDEXABLES_XML_RES_COLUMNS;
- field public static final java.lang.String INDEXABLES_XML_RES_PATH = "settings/indexables_xml_res";
- field public static final java.lang.String NON_INDEXABLES_KEYS = "non_indexables_key";
- field public static final java.lang.String[] NON_INDEXABLES_KEYS_COLUMNS;
- field public static final java.lang.String NON_INDEXABLES_KEYS_PATH = "settings/non_indexables_key";
- field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.SEARCH_INDEXABLES_PROVIDER";
+ field public static final String INDEXABLES_RAW = "indexables_raw";
+ field public static final String[] INDEXABLES_RAW_COLUMNS;
+ field public static final String INDEXABLES_RAW_PATH = "settings/indexables_raw";
+ field public static final String INDEXABLES_XML_RES = "indexables_xml_res";
+ field public static final String[] INDEXABLES_XML_RES_COLUMNS;
+ field public static final String INDEXABLES_XML_RES_PATH = "settings/indexables_xml_res";
+ field public static final String NON_INDEXABLES_KEYS = "non_indexables_key";
+ field public static final String[] NON_INDEXABLES_KEYS_COLUMNS;
+ field public static final String NON_INDEXABLES_KEYS_PATH = "settings/non_indexables_key";
+ field public static final String PROVIDER_INTERFACE = "android.content.action.SEARCH_INDEXABLES_PROVIDER";
}
public static class SearchIndexablesContract.BaseColumns {
- field public static final java.lang.String COLUMN_CLASS_NAME = "className";
- field public static final java.lang.String COLUMN_ICON_RESID = "iconResId";
- field public static final java.lang.String COLUMN_INTENT_ACTION = "intentAction";
- field public static final java.lang.String COLUMN_INTENT_TARGET_CLASS = "intentTargetClass";
- field public static final java.lang.String COLUMN_INTENT_TARGET_PACKAGE = "intentTargetPackage";
- field public static final java.lang.String COLUMN_RANK = "rank";
+ field public static final String COLUMN_CLASS_NAME = "className";
+ field public static final String COLUMN_ICON_RESID = "iconResId";
+ field public static final String COLUMN_INTENT_ACTION = "intentAction";
+ field public static final String COLUMN_INTENT_TARGET_CLASS = "intentTargetClass";
+ field public static final String COLUMN_INTENT_TARGET_PACKAGE = "intentTargetPackage";
+ field public static final String COLUMN_RANK = "rank";
}
public static final class SearchIndexablesContract.NonIndexableKey extends android.provider.SearchIndexablesContract.BaseColumns {
- field public static final java.lang.String COLUMN_KEY_VALUE = "key";
- field public static final java.lang.String MIME_TYPE = "vnd.android.cursor.dir/non_indexables_key";
+ field public static final String COLUMN_KEY_VALUE = "key";
+ field public static final String MIME_TYPE = "vnd.android.cursor.dir/non_indexables_key";
}
public static final class SearchIndexablesContract.RawData extends android.provider.SearchIndexablesContract.BaseColumns {
- field public static final java.lang.String COLUMN_ENTRIES = "entries";
- field public static final java.lang.String COLUMN_KEY = "key";
- field public static final java.lang.String COLUMN_KEYWORDS = "keywords";
- field public static final java.lang.String COLUMN_SCREEN_TITLE = "screenTitle";
- field public static final java.lang.String COLUMN_SUMMARY_OFF = "summaryOff";
- field public static final java.lang.String COLUMN_SUMMARY_ON = "summaryOn";
- field public static final java.lang.String COLUMN_TITLE = "title";
- field public static final java.lang.String COLUMN_USER_ID = "user_id";
- field public static final java.lang.String MIME_TYPE = "vnd.android.cursor.dir/indexables_raw";
+ field public static final String COLUMN_ENTRIES = "entries";
+ field public static final String COLUMN_KEY = "key";
+ field public static final String COLUMN_KEYWORDS = "keywords";
+ field public static final String COLUMN_SCREEN_TITLE = "screenTitle";
+ field public static final String COLUMN_SUMMARY_OFF = "summaryOff";
+ field public static final String COLUMN_SUMMARY_ON = "summaryOn";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_USER_ID = "user_id";
+ field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_raw";
}
public static final class SearchIndexablesContract.XmlResource extends android.provider.SearchIndexablesContract.BaseColumns {
- field public static final java.lang.String COLUMN_XML_RESID = "xmlResId";
- field public static final java.lang.String MIME_TYPE = "vnd.android.cursor.dir/indexables_xml_res";
+ field public static final String COLUMN_XML_RESID = "xmlResId";
+ field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_xml_res";
}
public abstract class SearchIndexablesProvider extends android.content.ContentProvider {
ctor public SearchIndexablesProvider();
- method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public java.lang.String getType(android.net.Uri);
+ method public final int delete(android.net.Uri, String, String[]);
+ method public String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public abstract android.database.Cursor queryNonIndexableKeys(java.lang.String[]);
- method public abstract android.database.Cursor queryRawData(java.lang.String[]);
- method public abstract android.database.Cursor queryXmlResources(java.lang.String[]);
- method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+ method public abstract android.database.Cursor queryNonIndexableKeys(String[]);
+ method public abstract android.database.Cursor queryRawData(String[]);
+ method public abstract android.database.Cursor queryXmlResources(String[]);
+ method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
}
public final class Settings {
- field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
- field public static final java.lang.String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS";
- field public static final java.lang.String ACTION_SHOW_ADMIN_SUPPORT_DETAILS = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
+ field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
+ field public static final String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS";
+ field public static final String ACTION_SHOW_ADMIN_SUPPORT_DETAILS = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
- method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
- method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
- field public static final java.lang.String APP_STANDBY_ENABLED = "app_standby_enabled";
- field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
- field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
- field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
- field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
- field public static final java.lang.String DEVICE_DEMO_MODE = "device_demo_mode";
- field public static final java.lang.String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED = "device_provisioning_mobile_data";
- field public static final java.lang.String EUICC_PROVISIONED = "euicc_provisioned";
- field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent";
- field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis";
- field public static final java.lang.String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
- field public static final java.lang.String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
- field public static final java.lang.String SMS_ACCESS_RESTRICTION_ENABLED = "sms_access_restriction_enabled";
- field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on";
- field public static final java.lang.String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
- field public static final java.lang.String WIFI_BADGING_THRESHOLDS = "wifi_badging_thresholds";
- field public static final java.lang.String WIFI_WAKEUP_ENABLED = "wifi_wakeup_enabled";
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, @Nullable String, boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String);
+ field public static final String APP_STANDBY_ENABLED = "app_standby_enabled";
+ field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
+ field public static final String CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS = "captive_portal_fallback_probe_specs";
+ field public static final String CAPTIVE_PORTAL_FALLBACK_URL = "captive_portal_fallback_url";
+ field public static final String CAPTIVE_PORTAL_HTTPS_URL = "captive_portal_https_url";
+ field public static final String CAPTIVE_PORTAL_HTTP_URL = "captive_portal_http_url";
+ field public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode";
+ field public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; // 0x2
+ field public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; // 0x0
+ field public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; // 0x1
+ field public static final String CAPTIVE_PORTAL_OTHER_FALLBACK_URLS = "captive_portal_other_fallback_urls";
+ field public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent";
+ field public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https";
+ field public static final String CARRIER_APP_NAMES = "carrier_app_names";
+ field public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
+ field public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = "data_stall_consecutive_dns_timeout_threshold";
+ field public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type";
+ field public static final String DATA_STALL_MIN_EVALUATE_INTERVAL = "data_stall_min_evaluate_interval";
+ field public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD = "data_stall_valid_dns_time_threshold";
+ field public static final String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
+ field public static final String DEVICE_DEMO_MODE = "device_demo_mode";
+ field public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED = "device_provisioning_mobile_data";
+ field public static final String EUICC_PROVISIONED = "euicc_provisioned";
+ field public static final String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent";
+ field public static final String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis";
+ field public static final String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
+ field public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
+ field public static final String SMS_ACCESS_RESTRICTION_ENABLED = "sms_access_restriction_enabled";
+ field public static final String THEATER_MODE_ON = "theater_mode_on";
+ field public static final String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
+ field public static final String WIFI_BADGING_THRESHOLDS = "wifi_badging_thresholds";
+ field public static final String WIFI_WAKEUP_ENABLED = "wifi_wakeup_enabled";
}
public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
- method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
- method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
- field public static final java.lang.String ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED = "accessibility_display_magnification_navbar_enabled";
- field public static final java.lang.String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
- field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
- field public static final java.lang.String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
- field public static final java.lang.String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
- field public static final java.lang.String DOZE_ALWAYS_ON = "doze_always_on";
- field public static final java.lang.String HUSH_GESTURE_USED = "hush_gesture_used";
- field public static final java.lang.String INSTANT_APPS_ENABLED = "instant_apps_enabled";
- field public static final java.lang.String LAST_SETUP_SHOWN = "last_setup_shown";
- field public static final java.lang.String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
- field public static final java.lang.String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
- field public static final java.lang.String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
- field public static final java.lang.String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
- field public static final java.lang.String MANUAL_RINGER_TOGGLE_COUNT = "manual_ringer_toggle_count";
- field public static final java.lang.String USER_SETUP_COMPLETE = "user_setup_complete";
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, @Nullable String, boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String);
+ field public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED = "accessibility_display_magnification_navbar_enabled";
+ field public static final String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
+ field public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
+ field public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
+ field public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
+ field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
+ field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
+ field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
+ field public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
+ field public static final String DOZE_ALWAYS_ON = "doze_always_on";
+ field public static final String HUSH_GESTURE_USED = "hush_gesture_used";
+ field public static final String INSTANT_APPS_ENABLED = "instant_apps_enabled";
+ field public static final String LAST_SETUP_SHOWN = "last_setup_shown";
+ field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
+ field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
+ field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
+ field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
+ field public static final String MANUAL_RINGER_TOGGLE_COUNT = "manual_ringer_toggle_count";
+ field public static final String USER_SETUP_COMPLETE = "user_setup_complete";
field public static final int USER_SETUP_PERSONALIZATION_COMPLETE = 10; // 0xa
field public static final int USER_SETUP_PERSONALIZATION_NOT_STARTED = 0; // 0x0
field public static final int USER_SETUP_PERSONALIZATION_PAUSED = 2; // 0x2
field public static final int USER_SETUP_PERSONALIZATION_STARTED = 1; // 0x1
- field public static final java.lang.String USER_SETUP_PERSONALIZATION_STATE = "user_setup_personalization_state";
- field public static final java.lang.String VOLUME_HUSH_GESTURE = "volume_hush_gesture";
+ field public static final String USER_SETUP_PERSONALIZATION_STATE = "user_setup_personalization_state";
+ field public static final String VOLUME_HUSH_GESTURE = "volume_hush_gesture";
}
public static final class Telephony.Carriers implements android.provider.BaseColumns {
- field public static final java.lang.String APN_SET_ID = "apn_set_id";
+ field public static final String APN_SET_ID = "apn_set_id";
field public static final int CARRIER_EDITED = 4; // 0x4
- field public static final java.lang.String EDITED_STATUS = "edited";
- field public static final java.lang.String MAX_CONNECTIONS = "max_conns";
- field public static final java.lang.String MODEM_PERSIST = "modem_cognitive";
- field public static final java.lang.String MTU = "mtu";
+ field public static final String EDITED_STATUS = "edited";
+ field public static final String MAX_CONNECTIONS = "max_conns";
+ field public static final String MODEM_PERSIST = "modem_cognitive";
+ field public static final String MTU = "mtu";
field public static final int NO_APN_SET_ID = 0; // 0x0
- field public static final java.lang.String TIME_LIMIT_FOR_MAX_CONNECTIONS = "max_conns_time";
+ field public static final String TIME_LIMIT_FOR_MAX_CONNECTIONS = "max_conns_time";
field public static final int UNEDITED = 0; // 0x0
field public static final int USER_DELETED = 2; // 0x2
- field public static final java.lang.String USER_EDITABLE = "user_editable";
+ field public static final String USER_EDITABLE = "user_editable";
field public static final int USER_EDITED = 1; // 0x1
- field public static final java.lang.String USER_VISIBLE = "user_visible";
- field public static final java.lang.String WAIT_TIME_RETRY = "wait_time";
+ field public static final String USER_VISIBLE = "user_visible";
+ field public static final String WAIT_TIME_RETRY = "wait_time";
}
public final class TimeZoneRulesDataContract {
- field public static final java.lang.String AUTHORITY = "com.android.timezone";
+ field public static final String AUTHORITY = "com.android.timezone";
}
public static final class TimeZoneRulesDataContract.Operation {
- field public static final java.lang.String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
- field public static final java.lang.String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
- field public static final java.lang.String COLUMN_REVISION = "revision";
- field public static final java.lang.String COLUMN_RULES_VERSION = "rules_version";
- field public static final java.lang.String COLUMN_TYPE = "type";
+ field public static final String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
+ field public static final String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
+ field public static final String COLUMN_REVISION = "revision";
+ field public static final String COLUMN_RULES_VERSION = "rules_version";
+ field public static final String COLUMN_TYPE = "type";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String TYPE_INSTALL = "INSTALL";
- field public static final java.lang.String TYPE_NO_OP = "NOOP";
- field public static final java.lang.String TYPE_UNINSTALL = "UNINSTALL";
+ field public static final String TYPE_INSTALL = "INSTALL";
+ field public static final String TYPE_NO_OP = "NOOP";
+ field public static final String TYPE_UNINSTALL = "UNINSTALL";
}
}
@@ -4967,12 +5373,12 @@ package android.rolecontrollerservice {
public abstract class RoleControllerService extends android.app.Service {
ctor public RoleControllerService();
- method public abstract void onAddRoleHolder(java.lang.String, java.lang.String, android.app.role.RoleManagerCallback);
- method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract void onClearRoleHolders(java.lang.String, android.app.role.RoleManagerCallback);
- method public abstract void onGrantDefaultRoles(android.app.role.RoleManagerCallback);
- method public abstract void onRemoveRoleHolder(java.lang.String, java.lang.String, android.app.role.RoleManagerCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.rolecontrollerservice.RoleControllerService";
+ method public abstract void onAddRoleHolder(@NonNull String, @NonNull String, @NonNull android.app.role.RoleManagerCallback);
+ method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
+ method public abstract void onClearRoleHolders(@NonNull String, @NonNull android.app.role.RoleManagerCallback);
+ method public abstract void onGrantDefaultRoles(@NonNull android.app.role.RoleManagerCallback);
+ method public abstract void onRemoveRoleHolder(@NonNull String, @NonNull String, @NonNull android.app.role.RoleManagerCallback);
+ field public static final String SERVICE_INTERFACE = "android.rolecontrollerservice.RoleControllerService";
}
}
@@ -4980,15 +5386,15 @@ package android.rolecontrollerservice {
package android.security.keystore {
public abstract class AttestationUtils {
- method public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, int[], byte[]) throws android.security.keystore.DeviceIdAttestationException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @NonNull public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
field public static final int ID_TYPE_IMEI = 2; // 0x2
field public static final int ID_TYPE_MEID = 3; // 0x3
field public static final int ID_TYPE_SERIAL = 1; // 0x1
}
public class DeviceIdAttestationException extends java.lang.Exception {
- ctor public DeviceIdAttestationException(java.lang.String);
- ctor public DeviceIdAttestationException(java.lang.String, java.lang.Throwable);
+ ctor public DeviceIdAttestationException(String);
+ ctor public DeviceIdAttestationException(String, Throwable);
}
}
@@ -4996,20 +5402,20 @@ package android.security.keystore {
package android.security.keystore.recovery {
public class DecryptionFailedException extends java.security.GeneralSecurityException {
- ctor public DecryptionFailedException(java.lang.String);
+ ctor public DecryptionFailedException(String);
}
public class InternalRecoveryServiceException extends java.security.GeneralSecurityException {
- ctor public InternalRecoveryServiceException(java.lang.String);
- ctor public InternalRecoveryServiceException(java.lang.String, java.lang.Throwable);
+ ctor public InternalRecoveryServiceException(String);
+ ctor public InternalRecoveryServiceException(String, Throwable);
}
public final class KeyChainProtectionParams implements android.os.Parcelable {
method public void clearSecret();
method public int describeContents();
- method public android.security.keystore.recovery.KeyDerivationParams getKeyDerivationParams();
+ method @NonNull public android.security.keystore.recovery.KeyDerivationParams getKeyDerivationParams();
method public int getLockScreenUiFormat();
- method public byte[] getSecret();
+ method @NonNull public byte[] getSecret();
method public int getUserSecretType();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainProtectionParams> CREATOR;
@@ -5021,34 +5427,34 @@ package android.security.keystore.recovery {
public static class KeyChainProtectionParams.Builder {
ctor public KeyChainProtectionParams.Builder();
- method public android.security.keystore.recovery.KeyChainProtectionParams build();
- method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setKeyDerivationParams(android.security.keystore.recovery.KeyDerivationParams);
+ method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams build();
+ method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setKeyDerivationParams(@NonNull android.security.keystore.recovery.KeyDerivationParams);
method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setLockScreenUiFormat(int);
- method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setSecret(byte[]);
+ method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setSecret(@NonNull byte[]);
method public android.security.keystore.recovery.KeyChainProtectionParams.Builder setUserSecretType(int);
}
public final class KeyChainSnapshot implements android.os.Parcelable {
method public int describeContents();
method public long getCounterId();
- method public byte[] getEncryptedRecoveryKeyBlob();
- method public java.util.List<android.security.keystore.recovery.KeyChainProtectionParams> getKeyChainProtectionParams();
+ method @NonNull public byte[] getEncryptedRecoveryKeyBlob();
+ method @NonNull public java.util.List<android.security.keystore.recovery.KeyChainProtectionParams> getKeyChainProtectionParams();
method public int getMaxAttempts();
- method public byte[] getServerParams();
+ method @NonNull public byte[] getServerParams();
method public int getSnapshotVersion();
- method public java.security.cert.CertPath getTrustedHardwareCertPath();
- method public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
+ method @NonNull public java.security.cert.CertPath getTrustedHardwareCertPath();
+ method @NonNull public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR;
}
public final class KeyDerivationParams implements android.os.Parcelable {
- method public static android.security.keystore.recovery.KeyDerivationParams createScryptParams(byte[], int);
- method public static android.security.keystore.recovery.KeyDerivationParams createSha256Params(byte[]);
+ method @NonNull public static android.security.keystore.recovery.KeyDerivationParams createScryptParams(@NonNull byte[], int);
+ method @NonNull public static android.security.keystore.recovery.KeyDerivationParams createSha256Params(@NonNull byte[]);
method public int describeContents();
method public int getAlgorithm();
method public int getMemoryDifficulty();
- method public byte[] getSalt();
+ method @NonNull public byte[] getSalt();
method public void writeToParcel(android.os.Parcel, int);
field public static final int ALGORITHM_SCRYPT = 2; // 0x2
field public static final int ALGORITHM_SHA256 = 1; // 0x1
@@ -5056,55 +5462,99 @@ package android.security.keystore.recovery {
}
public class LockScreenRequiredException extends java.security.GeneralSecurityException {
- ctor public LockScreenRequiredException(java.lang.String);
+ ctor public LockScreenRequiredException(String);
}
public class RecoveryController {
- method public android.security.keystore.recovery.RecoverySession createRecoverySession();
- method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
- method public java.security.Key getKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
- method public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public java.util.Map<java.lang.String, java.security.cert.X509Certificate> getRootCertificates();
- method public java.security.Key importKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public void initRecoveryService(java.lang.String, byte[], byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
- method public static boolean isRecoverableKeyStoreEnabled(android.content.Context);
- method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void setRecoveryStatus(java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void setServerParams(byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void setSnapshotCreatedPendingIntent(android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public android.security.keystore.recovery.RecoverySession createRecoverySession();
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.security.Key generateKey(@NonNull String, @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public static android.security.keystore.recovery.RecoveryController getInstance(@NonNull android.content.Context);
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @Nullable public java.security.Key getKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @Nullable public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int getRecoveryStatus(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.Map<java.lang.String,java.security.cert.X509Certificate> getRootCertificates();
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key importKey(@NonNull String, @NonNull byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.security.Key importKey(@NonNull String, @NonNull byte[], @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void initRecoveryService(@NonNull String, @NonNull byte[], @NonNull byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public static boolean isRecoverableKeyStoreEnabled(@NonNull android.content.Context);
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void removeKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoverySecretTypes(@NonNull int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoveryStatus(@NonNull String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setServerParams(@NonNull byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setSnapshotCreatedPendingIntent(@Nullable android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
field public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3; // 0x3
field public static final int RECOVERY_STATUS_SYNCED = 0; // 0x0
field public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1; // 0x1
}
public class RecoverySession implements java.lang.AutoCloseable {
- method public void close();
- method public java.util.Map<java.lang.String, java.security.Key> recoverKeyChainSnapshot(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
- method public byte[] start(java.lang.String, java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void close();
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.Map<java.lang.String,java.security.Key> recoverKeyChainSnapshot(@NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public byte[] start(@NonNull String, @NonNull java.security.cert.CertPath, @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public class SessionExpiredException extends java.security.GeneralSecurityException {
- ctor public SessionExpiredException(java.lang.String);
+ ctor public SessionExpiredException(String);
}
public final class WrappedApplicationKey implements android.os.Parcelable {
method public int describeContents();
- method public java.lang.String getAlias();
- method public byte[] getEncryptedKeyMaterial();
+ method @NonNull public String getAlias();
+ method @NonNull public byte[] getEncryptedKeyMaterial();
+ method @Nullable public byte[] getMetadata();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.WrappedApplicationKey> CREATOR;
}
public static class WrappedApplicationKey.Builder {
ctor public WrappedApplicationKey.Builder();
- method public android.security.keystore.recovery.WrappedApplicationKey build();
- method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String);
- method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]);
+ method @NonNull public android.security.keystore.recovery.WrappedApplicationKey build();
+ method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(@NonNull String);
+ method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(@NonNull byte[]);
+ method public android.security.keystore.recovery.WrappedApplicationKey.Builder setMetadata(@Nullable byte[]);
+ }
+
+}
+
+package android.service.appprediction {
+
+ public abstract class AppPredictionService extends android.app.Service {
+ ctor public AppPredictionService();
+ method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent);
+ method public final android.os.IBinder onBind(android.content.Intent);
+ method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public abstract void onLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+ method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+ method @MainThread public void onStartPredictionUpdates();
+ method @MainThread public void onStopPredictionUpdates();
+ method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>);
+ }
+
+}
+
+package android.service.attention {
+
+ public abstract class AttentionService extends android.app.Service {
+ ctor public AttentionService();
+ method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract void onCancelAttentionCheck(int);
+ method public abstract void onCheckAttention(int, @NonNull android.service.attention.AttentionService.AttentionCallback);
+ field public static final int ATTENTION_FAILURE_PREEMPTED = 2; // 0x2
+ field public static final int ATTENTION_FAILURE_TIMED_OUT = 3; // 0x3
+ field public static final int ATTENTION_FAILURE_UNKNOWN = 4; // 0x4
+ field public static final int ATTENTION_SUCCESS_ABSENT = 0; // 0x0
+ field public static final int ATTENTION_SUCCESS_PRESENT = 1; // 0x1
+ field public static final String SERVICE_INTERFACE = "android.service.attention.AttentionService";
+ }
+
+ public static final class AttentionService.AttentionCallback {
+ method public void onFailure(int, int);
+ method public void onSuccess(int, int, long);
}
}
@@ -5113,13 +5563,13 @@ package android.service.autofill {
public abstract class AutofillFieldClassificationService extends android.app.Service {
method public android.os.IBinder onBind(android.content.Intent);
- method public float[][] onCalculateScores(java.util.List<android.view.autofill.AutofillValue>, java.util.List<java.lang.String>, java.util.List<java.lang.String>, java.lang.String, android.os.Bundle, java.util.Map, java.util.Map);
- method public deprecated float[][] onGetScores(java.lang.String, android.os.Bundle, java.util.List<android.view.autofill.AutofillValue>, java.util.List<java.lang.String>);
- field public static final java.lang.String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE";
- field public static final java.lang.String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService";
- field public static final java.lang.String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms";
- field public static final java.lang.String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm";
+ method @Nullable public float[][] onCalculateScores(@NonNull java.util.List<android.view.autofill.AutofillValue>, @NonNull java.util.List<java.lang.String>, @NonNull java.util.List<java.lang.String>, @Nullable String, @Nullable android.os.Bundle, @Nullable java.util.Map, @Nullable java.util.Map);
+ method @Deprecated @Nullable public float[][] onGetScores(@Nullable String, @Nullable android.os.Bundle, @NonNull java.util.List<android.view.autofill.AutofillValue>, @NonNull java.util.List<java.lang.String>);
+ field public static final String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE";
+ field public static final String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH";
+ field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService";
+ field public static final String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms";
+ field public static final String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm";
}
}
@@ -5128,23 +5578,25 @@ package android.service.autofill.augmented {
public abstract class AugmentedAutofillService extends android.app.Service {
ctor public AugmentedAutofillService();
- method public void onFillRequest(android.service.autofill.augmented.FillRequest, android.os.CancellationSignal, android.service.autofill.augmented.FillController, android.service.autofill.augmented.FillCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService";
+ method protected final void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method protected void dump(@NonNull java.io.PrintWriter, @NonNull String[]);
+ method public void onFillRequest(@NonNull android.service.autofill.augmented.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.augmented.FillController, @NonNull android.service.autofill.augmented.FillCallback);
+ field public static final String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService";
}
public final class FillCallback {
- method public void onSuccess(android.service.autofill.augmented.FillResponse);
+ method public void onSuccess(@Nullable android.service.autofill.augmented.FillResponse);
}
public final class FillController {
- method public void autofill(java.util.List<android.util.Pair<android.view.autofill.AutofillId, android.view.autofill.AutofillValue>>);
+ method public void autofill(@NonNull java.util.List<android.util.Pair<android.view.autofill.AutofillId,android.view.autofill.AutofillValue>>);
}
public final class FillRequest {
- method public android.content.ComponentName getActivityComponent();
- method public android.view.autofill.AutofillId getFocusedId();
- method public android.view.autofill.AutofillValue getFocusedValue();
- method public android.service.autofill.augmented.PresentationParams getPresentationParams();
+ method @NonNull public android.content.ComponentName getActivityComponent();
+ method @NonNull public android.view.autofill.AutofillId getFocusedId();
+ method @NonNull public android.view.autofill.AutofillValue getFocusedValue();
+ method @Nullable public android.service.autofill.augmented.PresentationParams getPresentationParams();
method public int getTaskId();
}
@@ -5157,21 +5609,21 @@ package android.service.autofill.augmented {
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
method public android.service.autofill.augmented.FillResponse build();
- method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(android.service.autofill.augmented.FillWindow);
- method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(java.util.List<android.view.autofill.AutofillId>);
+ method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
+ method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>);
}
public final class FillWindow implements java.lang.AutoCloseable {
ctor public FillWindow();
method public void destroy();
- method public boolean update(android.service.autofill.augmented.PresentationParams.Area, android.view.View, long);
+ method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long);
field public static final long FLAG_METADATA_ADDRESS = 1L; // 0x1L
}
public abstract class PresentationParams {
method public int getFlags();
- method public android.service.autofill.augmented.PresentationParams.Area getFullArea();
- method public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getFullArea();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea();
field public static final int FLAG_HINT_GRAVITY_BOTTOM = 2; // 0x2
field public static final int FLAG_HINT_GRAVITY_LEFT = 4; // 0x4
field public static final int FLAG_HINT_GRAVITY_RIGHT = 8; // 0x8
@@ -5180,9 +5632,9 @@ package android.service.autofill.augmented {
field public static final int FLAG_HOST_SYSTEM = 32; // 0x20
}
- public static abstract class PresentationParams.Area {
- method public android.graphics.Rect getBounds();
- method public android.service.autofill.augmented.PresentationParams.Area getSubArea(android.graphics.Rect);
+ public abstract static class PresentationParams.Area {
+ method @NonNull public android.graphics.Rect getBounds();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSubArea(@NonNull android.graphics.Rect);
}
}
@@ -5192,35 +5644,36 @@ package android.service.carrier {
public abstract class ApnService extends android.app.Service {
ctor public ApnService();
method public android.os.IBinder onBind(android.content.Intent);
- method public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
+ method @WorkerThread public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
}
}
package android.service.contentcapture {
- public final deprecated class ContentCaptureEventsRequest implements android.os.Parcelable {
- method public int describeContents();
- method public java.util.List<android.view.contentcapture.ContentCaptureEvent> getEvents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.service.contentcapture.ContentCaptureEventsRequest> CREATOR;
+ @Deprecated public final class ContentCaptureEventsRequest implements android.os.Parcelable {
+ method @Deprecated public int describeContents();
+ method @Deprecated @NonNull public java.util.List<android.view.contentcapture.ContentCaptureEvent> getEvents();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.service.contentcapture.ContentCaptureEventsRequest> CREATOR;
}
public abstract class ContentCaptureService extends android.app.Service {
ctor public ContentCaptureService();
- method public final java.util.Set<android.content.ComponentName> getContentCaptureDisabledActivities();
- method public final java.util.Set<java.lang.String> getContentCaptureDisabledPackages();
- method public void onActivitySnapshot(android.view.contentcapture.ContentCaptureSessionId, android.service.contentcapture.SnapshotData);
+ method @NonNull public final java.util.Set<android.content.ComponentName> getContentCaptureDisabledActivities();
+ method @NonNull public final java.util.Set<java.lang.String> getContentCaptureDisabledPackages();
+ method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData);
method public void onConnected();
- method public void onContentCaptureEvent(android.view.contentcapture.ContentCaptureSessionId, android.view.contentcapture.ContentCaptureEvent);
- method public deprecated void onContentCaptureEventsRequest(android.view.contentcapture.ContentCaptureSessionId, android.service.contentcapture.ContentCaptureEventsRequest);
- method public void onCreateContentCaptureSession(android.view.contentcapture.ContentCaptureContext, android.view.contentcapture.ContentCaptureSessionId);
- method public void onDestroyContentCaptureSession(android.view.contentcapture.ContentCaptureSessionId);
+ method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
+ method @Deprecated public void onContentCaptureEventsRequest(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.ContentCaptureEventsRequest);
+ method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId);
+ method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
method public void onDisconnected();
- method public final void setActivityContentCaptureEnabled(android.content.ComponentName, boolean);
- method public final void setContentCaptureWhitelist(java.util.List<java.lang.String>, java.util.List<android.content.ComponentName>);
- method public final void setPackageContentCaptureEnabled(java.lang.String, boolean);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
+ method public void onUserDataRemovalRequest(@NonNull android.view.contentcapture.UserDataRemovalRequest);
+ method public final void setActivityContentCaptureEnabled(@NonNull android.content.ComponentName, boolean);
+ method public final void setContentCaptureWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>);
+ method public final void setPackageContentCaptureEnabled(@NonNull String, boolean);
+ field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
}
public final class SnapshotData implements android.os.Parcelable {
@@ -5228,12 +5681,25 @@ package android.service.contentcapture {
method public android.app.assist.AssistContent getAssistContent();
method public android.os.Bundle getAssistData();
method public android.app.assist.AssistStructure getAssistStructure();
- method public void writeToParcel(android.os.Parcel, int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR;
}
}
+package android.service.contentsuggestions {
+
+ public abstract class ContentSuggestionsService extends android.app.Service {
+ ctor public ContentSuggestionsService();
+ method public abstract void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback);
+ method public abstract void notifyInteraction(@NonNull String, @NonNull android.os.Bundle);
+ method public abstract void processContextImage(int, @Nullable android.graphics.Bitmap, @NonNull android.os.Bundle);
+ method public abstract void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback);
+ field public static final String SERVICE_INTERFACE = "android.service.contentsuggestions.ContentSuggestionsService";
+ }
+
+}
+
package android.service.euicc {
public final class DownloadSubscriptionResult implements android.os.Parcelable {
@@ -5249,15 +5715,15 @@ package android.service.euicc {
public final class EuiccProfileInfo implements android.os.Parcelable {
method public int describeContents();
method public android.service.carrier.CarrierIdentifier getCarrierIdentifier();
- method public java.lang.String getIccid();
- method public java.lang.String getNickname();
- method public int getPolicyRules();
- method public int getProfileClass();
- method public java.lang.String getProfileName();
- method public java.lang.String getServiceProviderName();
- method public int getState();
- method public java.util.List<android.telephony.UiccAccessRule> getUiccAccessRules();
- method public boolean hasPolicyRule(int);
+ method public String getIccid();
+ method @Nullable public String getNickname();
+ method @android.service.euicc.EuiccProfileInfo.PolicyRule public int getPolicyRules();
+ method @android.service.euicc.EuiccProfileInfo.ProfileClass public int getProfileClass();
+ method public String getProfileName();
+ method public String getServiceProviderName();
+ method @android.service.euicc.EuiccProfileInfo.ProfileState public int getState();
+ method @Nullable public java.util.List<android.telephony.UiccAccessRule> getUiccAccessRules();
+ method public boolean hasPolicyRule(@android.service.euicc.EuiccProfileInfo.PolicyRule int);
method public boolean hasPolicyRules();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.euicc.EuiccProfileInfo> CREATOR;
@@ -5272,98 +5738,99 @@ package android.service.euicc {
}
public static final class EuiccProfileInfo.Builder {
- ctor public EuiccProfileInfo.Builder(java.lang.String);
+ ctor public EuiccProfileInfo.Builder(String);
ctor public EuiccProfileInfo.Builder(android.service.euicc.EuiccProfileInfo);
method public android.service.euicc.EuiccProfileInfo build();
method public android.service.euicc.EuiccProfileInfo.Builder setCarrierIdentifier(android.service.carrier.CarrierIdentifier);
- method public android.service.euicc.EuiccProfileInfo.Builder setIccid(java.lang.String);
- method public android.service.euicc.EuiccProfileInfo.Builder setNickname(java.lang.String);
- method public android.service.euicc.EuiccProfileInfo.Builder setPolicyRules(int);
- method public android.service.euicc.EuiccProfileInfo.Builder setProfileClass(int);
- method public android.service.euicc.EuiccProfileInfo.Builder setProfileName(java.lang.String);
- method public android.service.euicc.EuiccProfileInfo.Builder setServiceProviderName(java.lang.String);
- method public android.service.euicc.EuiccProfileInfo.Builder setState(int);
- method public android.service.euicc.EuiccProfileInfo.Builder setUiccAccessRule(java.util.List<android.telephony.UiccAccessRule>);
+ method public android.service.euicc.EuiccProfileInfo.Builder setIccid(String);
+ method public android.service.euicc.EuiccProfileInfo.Builder setNickname(String);
+ method public android.service.euicc.EuiccProfileInfo.Builder setPolicyRules(@android.service.euicc.EuiccProfileInfo.PolicyRule int);
+ method public android.service.euicc.EuiccProfileInfo.Builder setProfileClass(@android.service.euicc.EuiccProfileInfo.ProfileClass int);
+ method public android.service.euicc.EuiccProfileInfo.Builder setProfileName(String);
+ method public android.service.euicc.EuiccProfileInfo.Builder setServiceProviderName(String);
+ method public android.service.euicc.EuiccProfileInfo.Builder setState(@android.service.euicc.EuiccProfileInfo.ProfileState int);
+ method public android.service.euicc.EuiccProfileInfo.Builder setUiccAccessRule(@Nullable java.util.List<android.telephony.UiccAccessRule>);
}
- public static abstract class EuiccProfileInfo.PolicyRule implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"POLICY_RULE_"}, value={android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DELETE_AFTER_DISABLING}) public static @interface EuiccProfileInfo.PolicyRule {
}
- public static abstract class EuiccProfileInfo.ProfileClass implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"PROFILE_CLASS_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_TESTING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_PROVISIONING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_OPERATIONAL, 0xffffffff}) public static @interface EuiccProfileInfo.ProfileClass {
}
- public static abstract class EuiccProfileInfo.ProfileState implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"PROFILE_STATE_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_STATE_DISABLED, android.service.euicc.EuiccProfileInfo.PROFILE_STATE_ENABLED, 0xffffffff}) public static @interface EuiccProfileInfo.ProfileState {
}
public abstract class EuiccService extends android.app.Service {
ctor public EuiccService();
- method public android.os.IBinder onBind(android.content.Intent);
- method public abstract int onDeleteSubscription(int, java.lang.String);
- method public abstract android.service.euicc.DownloadSubscriptionResult onDownloadSubscription(int, android.telephony.euicc.DownloadableSubscription, boolean, boolean, android.os.Bundle);
- method public deprecated int onDownloadSubscription(int, android.telephony.euicc.DownloadableSubscription, boolean, boolean);
+ method @CallSuper public android.os.IBinder onBind(android.content.Intent);
+ method public abstract int onDeleteSubscription(int, String);
+ method public abstract android.service.euicc.DownloadSubscriptionResult onDownloadSubscription(int, @NonNull android.telephony.euicc.DownloadableSubscription, boolean, boolean, @Nullable android.os.Bundle);
+ method @Deprecated public int onDownloadSubscription(int, @NonNull android.telephony.euicc.DownloadableSubscription, boolean, boolean);
method public abstract int onEraseSubscriptions(int);
method public abstract android.service.euicc.GetDefaultDownloadableSubscriptionListResult onGetDefaultDownloadableSubscriptionList(int, boolean);
method public abstract android.service.euicc.GetDownloadableSubscriptionMetadataResult onGetDownloadableSubscriptionMetadata(int, android.telephony.euicc.DownloadableSubscription, boolean);
- method public abstract java.lang.String onGetEid(int);
- method public abstract android.telephony.euicc.EuiccInfo onGetEuiccInfo(int);
- method public abstract android.service.euicc.GetEuiccProfileInfoListResult onGetEuiccProfileInfoList(int);
- method public abstract int onGetOtaStatus(int);
+ method public abstract String onGetEid(int);
+ method @NonNull public abstract android.telephony.euicc.EuiccInfo onGetEuiccInfo(int);
+ method @NonNull public abstract android.service.euicc.GetEuiccProfileInfoListResult onGetEuiccProfileInfoList(int);
+ method @android.telephony.euicc.EuiccManager.OtaStatus public abstract int onGetOtaStatus(int);
method public abstract int onRetainSubscriptionsForFactoryReset(int);
method public abstract void onStartOtaIfNecessary(int, android.service.euicc.EuiccService.OtaStatusChangedCallback);
- method public abstract int onSwitchToSubscription(int, java.lang.String, boolean);
- method public abstract int onUpdateSubscriptionNickname(int, java.lang.String, java.lang.String);
- field public static final java.lang.String ACTION_BIND_CARRIER_PROVISIONING_SERVICE = "android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE";
- field public static final java.lang.String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS";
- field public static final java.lang.String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
- field public static final deprecated java.lang.String ACTION_RESOLVE_CONFIRMATION_CODE = "android.service.euicc.action.RESOLVE_CONFIRMATION_CODE";
- field public static final java.lang.String ACTION_RESOLVE_DEACTIVATE_SIM = "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
- field public static final java.lang.String ACTION_RESOLVE_NO_PRIVILEGES = "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";
- field public static final java.lang.String ACTION_RESOLVE_RESOLVABLE_ERRORS = "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";
- field public static final java.lang.String CATEGORY_EUICC_UI = "android.service.euicc.category.EUICC_UI";
- field public static final java.lang.String EUICC_SERVICE_INTERFACE = "android.service.euicc.EuiccService";
- field public static final java.lang.String EXTRA_RESOLUTION_ALLOW_POLICY_RULES = "android.service.euicc.extra.RESOLUTION_ALLOW_POLICY_RULES";
- field public static final java.lang.String EXTRA_RESOLUTION_CALLING_PACKAGE = "android.service.euicc.extra.RESOLUTION_CALLING_PACKAGE";
- field public static final java.lang.String EXTRA_RESOLUTION_CONFIRMATION_CODE = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE";
- field public static final java.lang.String EXTRA_RESOLUTION_CONFIRMATION_CODE_RETRIED = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE_RETRIED";
- field public static final java.lang.String EXTRA_RESOLUTION_CONSENT = "android.service.euicc.extra.RESOLUTION_CONSENT";
- field public static final java.lang.String EXTRA_RESOLVABLE_ERRORS = "android.service.euicc.extra.RESOLVABLE_ERRORS";
+ method public abstract int onSwitchToSubscription(int, @Nullable String, boolean);
+ method public abstract int onUpdateSubscriptionNickname(int, String, String);
+ field public static final String ACTION_BIND_CARRIER_PROVISIONING_SERVICE = "android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE";
+ field public static final String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS";
+ field public static final String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
+ field @Deprecated public static final String ACTION_RESOLVE_CONFIRMATION_CODE = "android.service.euicc.action.RESOLVE_CONFIRMATION_CODE";
+ field public static final String ACTION_RESOLVE_DEACTIVATE_SIM = "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
+ field public static final String ACTION_RESOLVE_NO_PRIVILEGES = "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";
+ field public static final String ACTION_RESOLVE_RESOLVABLE_ERRORS = "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";
+ field public static final String CATEGORY_EUICC_UI = "android.service.euicc.category.EUICC_UI";
+ field public static final String EUICC_SERVICE_INTERFACE = "android.service.euicc.EuiccService";
+ field public static final String EXTRA_RESOLUTION_ALLOW_POLICY_RULES = "android.service.euicc.extra.RESOLUTION_ALLOW_POLICY_RULES";
+ field public static final String EXTRA_RESOLUTION_CALLING_PACKAGE = "android.service.euicc.extra.RESOLUTION_CALLING_PACKAGE";
+ field public static final String EXTRA_RESOLUTION_CARD_ID = "android.service.euicc.extra.RESOLUTION_CARD_ID";
+ field public static final String EXTRA_RESOLUTION_CONFIRMATION_CODE = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE";
+ field public static final String EXTRA_RESOLUTION_CONFIRMATION_CODE_RETRIED = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE_RETRIED";
+ field public static final String EXTRA_RESOLUTION_CONSENT = "android.service.euicc.extra.RESOLUTION_CONSENT";
+ field public static final String EXTRA_RESOLVABLE_ERRORS = "android.service.euicc.extra.RESOLVABLE_ERRORS";
field public static final int RESOLVABLE_ERROR_CONFIRMATION_CODE = 1; // 0x1
field public static final int RESOLVABLE_ERROR_POLICY_RULES = 2; // 0x2
field public static final int RESULT_FIRST_USER = 1; // 0x1
field public static final int RESULT_MUST_DEACTIVATE_SIM = -1; // 0xffffffff
- field public static final deprecated int RESULT_NEED_CONFIRMATION_CODE = -2; // 0xfffffffe
+ field @Deprecated public static final int RESULT_NEED_CONFIRMATION_CODE = -2; // 0xfffffffe
field public static final int RESULT_OK = 0; // 0x0
field public static final int RESULT_RESOLVABLE_ERRORS = -2; // 0xfffffffe
}
- public static abstract class EuiccService.OtaStatusChangedCallback {
+ public abstract static class EuiccService.OtaStatusChangedCallback {
ctor public EuiccService.OtaStatusChangedCallback();
method public abstract void onOtaStatusChanged(int);
}
public final class GetDefaultDownloadableSubscriptionListResult implements android.os.Parcelable {
- ctor public GetDefaultDownloadableSubscriptionListResult(int, android.telephony.euicc.DownloadableSubscription[]);
+ ctor public GetDefaultDownloadableSubscriptionListResult(int, @Nullable android.telephony.euicc.DownloadableSubscription[]);
method public int describeContents();
- method public java.util.List<android.telephony.euicc.DownloadableSubscription> getDownloadableSubscriptions();
+ method @Nullable public java.util.List<android.telephony.euicc.DownloadableSubscription> getDownloadableSubscriptions();
method public int getResult();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.euicc.GetDefaultDownloadableSubscriptionListResult> CREATOR;
}
public final class GetDownloadableSubscriptionMetadataResult implements android.os.Parcelable {
- ctor public GetDownloadableSubscriptionMetadataResult(int, android.telephony.euicc.DownloadableSubscription);
+ ctor public GetDownloadableSubscriptionMetadataResult(int, @Nullable android.telephony.euicc.DownloadableSubscription);
method public int describeContents();
- method public android.telephony.euicc.DownloadableSubscription getDownloadableSubscription();
+ method @Nullable public android.telephony.euicc.DownloadableSubscription getDownloadableSubscription();
method public int getResult();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.euicc.GetDownloadableSubscriptionMetadataResult> CREATOR;
}
public final class GetEuiccProfileInfoListResult implements android.os.Parcelable {
- ctor public GetEuiccProfileInfoListResult(int, android.service.euicc.EuiccProfileInfo[], boolean);
+ ctor public GetEuiccProfileInfoListResult(int, @Nullable android.service.euicc.EuiccProfileInfo[], boolean);
method public int describeContents();
method public boolean getIsRemovable();
- method public java.util.List<android.service.euicc.EuiccProfileInfo> getProfiles();
+ method @Nullable public java.util.List<android.service.euicc.EuiccProfileInfo> getProfiles();
method public int getResult();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.euicc.GetEuiccProfileInfoListResult> CREATOR;
@@ -5374,40 +5841,40 @@ package android.service.euicc {
package android.service.notification {
public final class Adjustment implements android.os.Parcelable {
- ctor public Adjustment(java.lang.String, java.lang.String, android.os.Bundle, java.lang.CharSequence, int);
+ ctor public Adjustment(String, String, android.os.Bundle, CharSequence, int);
ctor protected Adjustment(android.os.Parcel);
method public int describeContents();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getKey();
- method public java.lang.String getPackage();
+ method public CharSequence getExplanation();
+ method public String getKey();
+ method public String getPackage();
method public android.os.Bundle getSignals();
method public int getUser();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
- field public static final java.lang.String KEY_IMPORTANCE = "key_importance";
- field public static final java.lang.String KEY_PEOPLE = "key_people";
- field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
- field public static final java.lang.String KEY_SMART_REPLIES = "key_smart_replies";
- field public static final java.lang.String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
- field public static final java.lang.String KEY_USER_SENTIMENT = "key_user_sentiment";
+ field public static final String KEY_IMPORTANCE = "key_importance";
+ field public static final String KEY_PEOPLE = "key_people";
+ field public static final String KEY_SMART_ACTIONS = "key_smart_actions";
+ field public static final String KEY_SMART_REPLIES = "key_smart_replies";
+ field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
+ field public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
}
public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService {
ctor public NotificationAssistantService();
method public final void adjustNotification(android.service.notification.Adjustment);
method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
- method public void onActionClicked(java.lang.String, android.app.Notification.Action, int);
+ method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int);
method public final android.os.IBinder onBind(android.content.Intent);
- method public void onNotificationDirectReply(java.lang.String);
+ method public void onNotificationDirectReplied(@NonNull String);
method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, android.app.NotificationChannel);
- method public void onNotificationExpansionChanged(java.lang.String, boolean, boolean);
+ method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean);
method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, android.service.notification.NotificationStats, int);
- method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, java.lang.String);
+ method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, String);
method public void onNotificationsSeen(java.util.List<java.lang.String>);
- method public void onSuggestedReplySent(java.lang.String, java.lang.CharSequence, int);
- method public final void unsnoozeNotification(java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
+ method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
+ method public final void unsnoozeNotification(String);
+ field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
field public static final int SOURCE_FROM_APP = 0; // 0x0
field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1
}
@@ -5445,12 +5912,12 @@ package android.service.notification {
}
public final class SnoozeCriterion implements android.os.Parcelable {
- ctor public SnoozeCriterion(java.lang.String, java.lang.CharSequence, java.lang.CharSequence);
+ ctor public SnoozeCriterion(String, CharSequence, CharSequence);
ctor protected SnoozeCriterion(android.os.Parcel);
method public int describeContents();
- method public java.lang.CharSequence getConfirmation();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getId();
+ method public CharSequence getConfirmation();
+ method public CharSequence getExplanation();
+ method public String getId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR;
}
@@ -5460,11 +5927,11 @@ package android.service.notification {
package android.service.oemlock {
public class OemLockManager {
- method public java.lang.String getLockName();
- method public boolean isOemUnlockAllowedByCarrier();
- method public boolean isOemUnlockAllowedByUser();
- method public void setOemUnlockAllowedByCarrier(boolean, byte[]);
- method public void setOemUnlockAllowedByUser(boolean);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) @Nullable public String getLockName();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByCarrier();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByUser();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public void setOemUnlockAllowedByCarrier(boolean, @Nullable byte[]);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE) public void setOemUnlockAllowedByUser(boolean);
}
}
@@ -5472,20 +5939,20 @@ package android.service.oemlock {
package android.service.persistentdata {
public class PersistentDataBlockManager {
- method public int getDataBlockSize();
- method public int getFlashLockState();
+ method @RequiresPermission("android.permission.ACCESS_PDB_STATE") public int getDataBlockSize();
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) @android.service.persistentdata.PersistentDataBlockManager.FlashLockState public int getFlashLockState();
method public long getMaximumDataBlockSize();
- method public deprecated boolean getOemUnlockEnabled();
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public boolean getOemUnlockEnabled();
method public byte[] read();
- method public deprecated void setOemUnlockEnabled(boolean);
- method public void wipe();
+ method @Deprecated @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void setOemUnlockEnabled(boolean);
+ method @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void wipe();
method public int write(byte[]);
field public static final int FLASH_LOCK_LOCKED = 1; // 0x1
field public static final int FLASH_LOCK_UNKNOWN = -1; // 0xffffffff
field public static final int FLASH_LOCK_UNLOCKED = 0; // 0x0
}
- public static abstract class PersistentDataBlockManager.FlashLockState implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"FLASH_LOCK_"}, value={android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_UNKNOWN, android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_LOCKED, android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_UNLOCKED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PersistentDataBlockManager.FlashLockState {
}
}
@@ -5493,7 +5960,7 @@ package android.service.persistentdata {
package android.service.quicksettings {
public class TileService extends android.app.Service {
- method public final void setStatusIcon(android.graphics.drawable.Icon, java.lang.String);
+ method public final void setStatusIcon(android.graphics.drawable.Icon, String);
}
}
@@ -5505,9 +5972,9 @@ package android.service.resolver {
method public android.os.IBinder onBind(android.content.Intent);
method public void onPredictSharingProbabilities(java.util.List<android.service.resolver.ResolverTarget>);
method public void onTrainRankingModel(java.util.List<android.service.resolver.ResolverTarget>, int);
- field public static final java.lang.String BIND_PERMISSION = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
- field public static final java.lang.String HOLD_PERMISSION = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.resolver.ResolverRankerService";
+ field public static final String BIND_PERMISSION = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
+ field public static final String HOLD_PERMISSION = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
+ field public static final String SERVICE_INTERFACE = "android.service.resolver.ResolverRankerService";
}
public final class ResolverTarget implements android.os.Parcelable {
@@ -5535,23 +6002,23 @@ package android.service.settings.suggestions {
method public int describeContents();
method public int getFlags();
method public android.graphics.drawable.Icon getIcon();
- method public java.lang.String getId();
+ method public String getId();
method public android.app.PendingIntent getPendingIntent();
- method public java.lang.CharSequence getSummary();
- method public java.lang.CharSequence getTitle();
+ method public CharSequence getSummary();
+ method public CharSequence getTitle();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.settings.suggestions.Suggestion> CREATOR;
field public static final int FLAG_HAS_BUTTON = 1; // 0x1
}
public static class Suggestion.Builder {
- ctor public Suggestion.Builder(java.lang.String);
+ ctor public Suggestion.Builder(String);
method public android.service.settings.suggestions.Suggestion build();
method public android.service.settings.suggestions.Suggestion.Builder setFlags(int);
method public android.service.settings.suggestions.Suggestion.Builder setIcon(android.graphics.drawable.Icon);
method public android.service.settings.suggestions.Suggestion.Builder setPendingIntent(android.app.PendingIntent);
- method public android.service.settings.suggestions.Suggestion.Builder setSummary(java.lang.CharSequence);
- method public android.service.settings.suggestions.Suggestion.Builder setTitle(java.lang.CharSequence);
+ method public android.service.settings.suggestions.Suggestion.Builder setSummary(CharSequence);
+ method public android.service.settings.suggestions.Suggestion.Builder setTitle(CharSequence);
}
public abstract class SuggestionService extends android.app.Service {
@@ -5568,8 +6035,8 @@ package android.service.sms {
public abstract class FinancialSmsService extends android.app.Service {
method public android.os.IBinder onBind(android.content.Intent);
- method public abstract android.database.CursorWindow onGetSmsMessages(android.os.Bundle);
- field public static final java.lang.String ACTION_FINANCIAL_SERVICE_INTENT = "android.service.sms.action.FINANCIAL_SERVICE_INTENT";
+ method @Nullable public abstract android.database.CursorWindow onGetSmsMessages(@NonNull android.os.Bundle);
+ field public static final String ACTION_FINANCIAL_SERVICE_INTENT = "android.service.sms.action.FINANCIAL_SERVICE_INTENT";
}
}
@@ -5579,22 +6046,22 @@ package android.service.textclassifier {
public abstract class TextClassifierService extends android.app.Service {
ctor public TextClassifierService();
method public final android.view.textclassifier.TextClassifier getLocalTextClassifier();
- method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract void onClassifyText(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextClassification.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
- method public void onCreateTextClassificationSession(android.view.textclassifier.TextClassificationContext, android.view.textclassifier.TextClassificationSessionId);
- method public void onDestroyTextClassificationSession(android.view.textclassifier.TextClassificationSessionId);
- method public void onDetectLanguage(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextLanguage.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>);
- method public abstract void onGenerateLinks(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextLinks.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
- method public deprecated void onSelectionEvent(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.SelectionEvent);
- method public void onSuggestConversationActions(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.ConversationActions.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>);
- method public abstract void onSuggestSelection(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextSelection.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
- method public void onTextClassifierEvent(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextClassifierEvent);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
+ method @Nullable public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
+ method public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId);
+ method public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId);
+ method public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>);
+ method public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
+ method @Deprecated public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent);
+ method public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>);
+ method public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
+ method public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent);
+ field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
}
- public static abstract interface TextClassifierService.Callback<T> {
- method public abstract void onFailure(java.lang.CharSequence);
- method public abstract void onSuccess(T);
+ public static interface TextClassifierService.Callback<T> {
+ method public void onFailure(CharSequence);
+ method public void onSuccess(T);
}
}
@@ -5604,8 +6071,8 @@ package android.service.trust {
public class TrustAgentService extends android.app.Service {
ctor public TrustAgentService();
method public final void addEscrowToken(byte[], android.os.UserHandle);
- method public final deprecated void grantTrust(java.lang.CharSequence, long, boolean);
- method public final void grantTrust(java.lang.CharSequence, long, int);
+ method @Deprecated public final void grantTrust(CharSequence, long, boolean);
+ method public final void grantTrust(CharSequence, long, int);
method public final void isEscrowTokenActive(long, android.os.UserHandle);
method public final android.os.IBinder onBind(android.content.Intent);
method public boolean onConfigure(java.util.List<android.os.PersistableBundle>);
@@ -5620,14 +6087,14 @@ package android.service.trust {
method public final void removeEscrowToken(long, android.os.UserHandle);
method public final void revokeTrust();
method public final void setManagingTrust(boolean);
- method public final void showKeyguardErrorMessage(java.lang.CharSequence);
+ method public final void showKeyguardErrorMessage(@NonNull CharSequence);
method public final void unlockUserWithToken(long, byte[], android.os.UserHandle);
field public static final int FLAG_GRANT_TRUST_DISMISS_KEYGUARD = 2; // 0x2
field public static final int FLAG_GRANT_TRUST_INITIATED_BY_USER = 1; // 0x1
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.trust.TrustAgentService";
+ field public static final String SERVICE_INTERFACE = "android.service.trust.TrustAgentService";
field public static final int TOKEN_STATE_ACTIVE = 1; // 0x1
field public static final int TOKEN_STATE_INACTIVE = 0; // 0x0
- field public static final java.lang.String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
+ field public static final String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
}
}
@@ -5643,55 +6110,55 @@ package android.service.wallpaper {
package android.telecom {
- public deprecated class AudioState implements android.os.Parcelable {
- ctor public AudioState(boolean, int, int);
- ctor public AudioState(android.telecom.AudioState);
- ctor public AudioState(android.telecom.CallAudioState);
- method public static java.lang.String audioRouteToString(int);
- method public int describeContents();
- method public int getRoute();
- method public int getSupportedRouteMask();
- method public boolean isMuted();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.AudioState> CREATOR;
- field public static final int ROUTE_BLUETOOTH = 2; // 0x2
- field public static final int ROUTE_EARPIECE = 1; // 0x1
- field public static final int ROUTE_SPEAKER = 8; // 0x8
- field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
- field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
+ @Deprecated public class AudioState implements android.os.Parcelable {
+ ctor @Deprecated public AudioState(boolean, int, int);
+ ctor @Deprecated public AudioState(android.telecom.AudioState);
+ ctor @Deprecated public AudioState(android.telecom.CallAudioState);
+ method @Deprecated public static String audioRouteToString(int);
+ method @Deprecated public int describeContents();
+ method @Deprecated public int getRoute();
+ method @Deprecated public int getSupportedRouteMask();
+ method @Deprecated public boolean isMuted();
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated public static final android.os.Parcelable.Creator<android.telecom.AudioState> CREATOR;
+ field @Deprecated public static final int ROUTE_BLUETOOTH = 2; // 0x2
+ field @Deprecated public static final int ROUTE_EARPIECE = 1; // 0x1
+ field @Deprecated public static final int ROUTE_SPEAKER = 8; // 0x8
+ field @Deprecated public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
+ field @Deprecated public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
}
public final class Call {
- method public deprecated void addListener(android.telecom.Call.Listener);
- method public deprecated void removeListener(android.telecom.Call.Listener);
- field public static final deprecated int STATE_PRE_DIAL_WAIT = 8; // 0x8
+ method @Deprecated public void addListener(android.telecom.Call.Listener);
+ method @Deprecated public void removeListener(android.telecom.Call.Listener);
+ field @Deprecated public static final int STATE_PRE_DIAL_WAIT = 8; // 0x8
}
- public static abstract deprecated class Call.Listener extends android.telecom.Call.Callback {
- ctor public Call.Listener();
+ @Deprecated public abstract static class Call.Listener extends android.telecom.Call.Callback {
+ ctor @Deprecated public Call.Listener();
}
public abstract class Conference extends android.telecom.Conferenceable {
- method public final deprecated android.telecom.AudioState getAudioState();
- method public final deprecated long getConnectTimeMillis();
+ method @Deprecated public final android.telecom.AudioState getAudioState();
+ method @Deprecated public final long getConnectTimeMillis();
method public android.telecom.Connection getPrimaryConnection();
- method public deprecated void onAudioStateChanged(android.telecom.AudioState);
- method public final deprecated void setConnectTimeMillis(long);
+ method @Deprecated public void onAudioStateChanged(android.telecom.AudioState);
+ method @Deprecated public final void setConnectTimeMillis(long);
}
public abstract class Connection extends android.telecom.Conferenceable {
- method public final deprecated android.telecom.AudioState getAudioState();
- method public deprecated void onAudioStateChanged(android.telecom.AudioState);
+ method @Deprecated public final android.telecom.AudioState getAudioState();
+ method @Deprecated public void onAudioStateChanged(android.telecom.AudioState);
}
public abstract class InCallService extends android.app.Service {
- method public deprecated android.telecom.Phone getPhone();
- method public deprecated void onPhoneCreated(android.telecom.Phone);
- method public deprecated void onPhoneDestroyed(android.telecom.Phone);
+ method @Deprecated public android.telecom.Phone getPhone();
+ method @Deprecated public void onPhoneCreated(android.telecom.Phone);
+ method @Deprecated public void onPhoneDestroyed(android.telecom.Phone);
}
public class ParcelableCallAnalytics implements android.os.Parcelable {
- ctor public ParcelableCallAnalytics(long, long, int, boolean, boolean, int, int, boolean, java.lang.String, boolean, java.util.List<android.telecom.ParcelableCallAnalytics.AnalyticsEvent>, java.util.List<android.telecom.ParcelableCallAnalytics.EventTiming>);
+ ctor public ParcelableCallAnalytics(long, long, int, boolean, boolean, int, int, boolean, String, boolean, java.util.List<android.telecom.ParcelableCallAnalytics.AnalyticsEvent>, java.util.List<android.telecom.ParcelableCallAnalytics.EventTiming>);
ctor public ParcelableCallAnalytics(android.os.Parcel);
method public java.util.List<android.telecom.ParcelableCallAnalytics.AnalyticsEvent> analyticsEvents();
method public int describeContents();
@@ -5699,7 +6166,7 @@ package android.telecom {
method public int getCallTechnologies();
method public int getCallTerminationCode();
method public int getCallType();
- method public java.lang.String getConnectionService();
+ method public String getConnectionService();
method public java.util.List<android.telecom.ParcelableCallAnalytics.EventTiming> getEventTimings();
method public long getStartTimeMillis();
method public boolean isAdditionalCall();
@@ -5788,27 +6255,27 @@ package android.telecom {
field public static final int UNHOLD_TIMING = 4; // 0x4
}
- public final deprecated class Phone {
- method public void addListener(android.telecom.Phone.Listener);
- method public boolean canAddCall();
- method public deprecated android.telecom.AudioState getAudioState();
- method public android.telecom.CallAudioState getCallAudioState();
- method public java.util.List<android.telecom.Call> getCalls();
- method public void removeListener(android.telecom.Phone.Listener);
- method public void requestBluetoothAudio(java.lang.String);
- method public void setAudioRoute(int);
- method public void setMuted(boolean);
+ @Deprecated public final class Phone {
+ method @Deprecated public void addListener(android.telecom.Phone.Listener);
+ method @Deprecated public boolean canAddCall();
+ method @Deprecated public android.telecom.AudioState getAudioState();
+ method @Deprecated public android.telecom.CallAudioState getCallAudioState();
+ method @Deprecated public java.util.List<android.telecom.Call> getCalls();
+ method @Deprecated public void removeListener(android.telecom.Phone.Listener);
+ method @Deprecated public void requestBluetoothAudio(String);
+ method @Deprecated public void setAudioRoute(int);
+ method @Deprecated public void setMuted(boolean);
}
- public static abstract class Phone.Listener {
- ctor public Phone.Listener();
- method public deprecated void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState);
- method public void onBringToForeground(android.telecom.Phone, boolean);
- method public void onCallAdded(android.telecom.Phone, android.telecom.Call);
- method public void onCallAudioStateChanged(android.telecom.Phone, android.telecom.CallAudioState);
- method public void onCallRemoved(android.telecom.Phone, android.telecom.Call);
- method public void onCanAddCallChanged(android.telecom.Phone, boolean);
- method public void onSilenceRinger(android.telecom.Phone);
+ @Deprecated public abstract static class Phone.Listener {
+ ctor @Deprecated public Phone.Listener();
+ method @Deprecated public void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState);
+ method @Deprecated public void onBringToForeground(android.telecom.Phone, boolean);
+ method @Deprecated public void onCallAdded(android.telecom.Phone, android.telecom.Call);
+ method @Deprecated public void onCallAudioStateChanged(android.telecom.Phone, android.telecom.CallAudioState);
+ method @Deprecated public void onCallRemoved(android.telecom.Phone, android.telecom.Call);
+ method @Deprecated public void onCanAddCallChanged(android.telecom.Phone, boolean);
+ method @Deprecated public void onSilenceRinger(android.telecom.Phone);
}
public final class PhoneAccount implements android.os.Parcelable {
@@ -5821,25 +6288,25 @@ package android.telecom {
public class PhoneAccountSuggestionService extends android.app.Service {
ctor public PhoneAccountSuggestionService();
- method public void onAccountSuggestionRequest(java.lang.String);
+ method public void onAccountSuggestionRequest(@NonNull String);
method public android.os.IBinder onBind(android.content.Intent);
- method public final void suggestPhoneAccounts(java.lang.String, java.util.List<android.telecom.PhoneAccountSuggestion>);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService";
+ method public final void suggestPhoneAccounts(@NonNull String, @NonNull java.util.List<android.telecom.PhoneAccountSuggestion>);
+ field public static final String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService";
}
public final class RemoteConference {
- method public deprecated void setAudioState(android.telecom.AudioState);
+ method @Deprecated public void setAudioState(android.telecom.AudioState);
}
public final class RemoteConnection {
- method public deprecated void setAudioState(android.telecom.AudioState);
+ method @Deprecated public void setAudioState(android.telecom.AudioState);
}
public final class StatusHints implements android.os.Parcelable {
- ctor public deprecated StatusHints(android.content.ComponentName, java.lang.CharSequence, int, android.os.Bundle);
- method public deprecated android.graphics.drawable.Drawable getIcon(android.content.Context);
- method public deprecated int getIconResId();
- method public deprecated android.content.ComponentName getPackageName();
+ ctor @Deprecated public StatusHints(android.content.ComponentName, CharSequence, int, android.os.Bundle);
+ method @Deprecated public android.graphics.drawable.Drawable getIcon(android.content.Context);
+ method @Deprecated public int getIconResId();
+ method @Deprecated public android.content.ComponentName getPackageName();
}
public final class TelecomAnalytics implements android.os.Parcelable {
@@ -5854,7 +6321,7 @@ package android.telecom {
public static final class TelecomAnalytics.SessionTiming implements android.os.Parcelable {
ctor public TelecomAnalytics.SessionTiming(int, long);
method public int describeContents();
- method public java.lang.Integer getKey();
+ method public Integer getKey();
method public long getTime();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telecom.TelecomAnalytics.SessionTiming> CREATOR;
@@ -5879,25 +6346,25 @@ package android.telecom {
public class TelecomManager {
method public void addNewUnknownCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
- method public deprecated void clearAccounts();
+ method @Deprecated public void clearAccounts();
method public void clearPhoneAccounts();
- method public android.telecom.TelecomAnalytics dumpAnalytics();
- method public void enablePhoneAccount(android.telecom.PhoneAccountHandle, boolean);
+ method @RequiresPermission(android.Manifest.permission.DUMP) public android.telecom.TelecomAnalytics dumpAnalytics();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enablePhoneAccount(android.telecom.PhoneAccountHandle, boolean);
method public java.util.List<android.telecom.PhoneAccountHandle> getAllPhoneAccountHandles();
method public java.util.List<android.telecom.PhoneAccount> getAllPhoneAccounts();
method public int getAllPhoneAccountsCount();
method public int getCallState();
method public android.telecom.PhoneAccountHandle getConnectionManager();
- method public int getCurrentTtyMode();
- method public deprecated android.content.ComponentName getDefaultPhoneApp();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCurrentTtyMode();
+ method @Deprecated public android.content.ComponentName getDefaultPhoneApp();
method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage();
- method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(java.lang.String);
- method public boolean isInEmergencyCall();
- method public boolean isRinging();
- method public deprecated boolean setDefaultDialer(java.lang.String);
- field public static final java.lang.String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT";
- field public static final java.lang.String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT";
- field public static final java.lang.String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall();
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.WRITE_SECURE_SETTINGS}) public boolean setDefaultDialer(String);
+ field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT";
+ field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT";
+ field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
field public static final int TTY_MODE_FULL = 1; // 0x1
field public static final int TTY_MODE_HCO = 2; // 0x2
field public static final int TTY_MODE_OFF = 0; // 0x0
@@ -5913,11 +6380,150 @@ package android.telephony {
field public static final int WWAN = 1; // 0x1
}
+ public class CallAttributes implements android.os.Parcelable {
+ ctor public CallAttributes(android.telephony.PreciseCallState, int, android.telephony.CallQuality);
+ method public int describeContents();
+ method public android.telephony.CallQuality getCallQuality();
+ method public int getNetworkType();
+ method public android.telephony.PreciseCallState getPreciseCallState();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.CallAttributes> CREATOR;
+ }
+
+ public final class CallQuality implements android.os.Parcelable {
+ ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int);
+ method public int describeContents();
+ method public int getAverageRelativeJitter();
+ method public int getAverageRoundTripTime();
+ method public int getCallDuration();
+ method public int getCodecType();
+ method public int getDownlinkCallQualityLevel();
+ method public int getMaxRelativeJitter();
+ method public int getNumRtpPacketsNotReceived();
+ method public int getNumRtpPacketsReceived();
+ method public int getNumRtpPacketsTransmitted();
+ method public int getNumRtpPacketsTransmittedLost();
+ method public int getUplinkCallQualityLevel();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int CALL_QUALITY_BAD = 4; // 0x4
+ field public static final int CALL_QUALITY_EXCELLENT = 0; // 0x0
+ field public static final int CALL_QUALITY_FAIR = 2; // 0x2
+ field public static final int CALL_QUALITY_GOOD = 1; // 0x1
+ field public static final int CALL_QUALITY_NOT_AVAILABLE = 5; // 0x5
+ field public static final int CALL_QUALITY_POOR = 3; // 0x3
+ field public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR;
+ }
+
public class CarrierConfigManager {
- method public static android.os.PersistableBundle getDefaultConfig();
- method public void overrideConfig(int, android.os.PersistableBundle);
- method public void updateConfigForPhoneId(int, java.lang.String);
- field public static final java.lang.String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string";
+ method @NonNull public static android.os.PersistableBundle getDefaultConfig();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void updateConfigForPhoneId(int, String);
+ field public static final String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string";
+ }
+
+ public final class CarrierRestrictionRules implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers();
+ method public int getDefaultCarrierRestriction();
+ method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getExcludedCarriers();
+ method public int getMultiSimPolicy();
+ method public boolean isAllCarriersAllowed();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int CARRIER_RESTRICTION_DEFAULT_ALLOWED = 1; // 0x1
+ field public static final int CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED = 0; // 0x0
+ field public static final android.os.Parcelable.Creator<android.telephony.CarrierRestrictionRules> CREATOR;
+ field public static final int MULTISIM_POLICY_NONE = 0; // 0x0
+ field public static final int MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT = 1; // 0x1
+ }
+
+ public static class CarrierRestrictionRules.Builder {
+ method public android.telephony.CarrierRestrictionRules build();
+ method public android.telephony.CarrierRestrictionRules.Builder setAllCarriersAllowed();
+ method public android.telephony.CarrierRestrictionRules.Builder setAllowedCarriers(java.util.List<android.service.carrier.CarrierIdentifier>);
+ method public android.telephony.CarrierRestrictionRules.Builder setDefaultCarrierRestriction(int);
+ method public android.telephony.CarrierRestrictionRules.Builder setExcludedCarriers(java.util.List<android.service.carrier.CarrierIdentifier>);
+ method public android.telephony.CarrierRestrictionRules.Builder setMultiSimPolicy(int);
+ }
+
+ public final class DataFailCause {
+ field public static final int ACTIVATION_REJECT_GGSN = 30; // 0x1e
+ field public static final int ACTIVATION_REJECT_UNSPECIFIED = 31; // 0x1f
+ field public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 65; // 0x41
+ field public static final int APN_TYPE_CONFLICT = 112; // 0x70
+ field public static final int AUTH_FAILURE_ON_EMERGENCY_CALL = 122; // 0x7a
+ field public static final int COMPANION_IFACE_IN_USE = 118; // 0x76
+ field public static final int CONDITIONAL_IE_ERROR = 100; // 0x64
+ field public static final int EMERGENCY_IFACE_ONLY = 116; // 0x74
+ field public static final int EMM_ACCESS_BARRED = 115; // 0x73
+ field public static final int EMM_ACCESS_BARRED_INFINITE_RETRY = 121; // 0x79
+ field public static final int ERROR_UNSPECIFIED = 65535; // 0xffff
+ field public static final int ESM_INFO_NOT_RECEIVED = 53; // 0x35
+ field public static final int FEATURE_NOT_SUPP = 40; // 0x28
+ field public static final int FILTER_SEMANTIC_ERROR = 44; // 0x2c
+ field public static final int FILTER_SYTAX_ERROR = 45; // 0x2d
+ field public static final int GPRS_REGISTRATION_FAIL = -2; // 0xfffffffe
+ field public static final int IFACE_AND_POL_FAMILY_MISMATCH = 120; // 0x78
+ field public static final int IFACE_MISMATCH = 117; // 0x75
+ field public static final int INSUFFICIENT_RESOURCES = 26; // 0x1a
+ field public static final int INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 114; // 0x72
+ field public static final int INVALID_MANDATORY_INFO = 96; // 0x60
+ field public static final int INVALID_PCSCF_ADDR = 113; // 0x71
+ field public static final int INVALID_TRANSACTION_ID = 81; // 0x51
+ field public static final int IP_ADDRESS_MISMATCH = 119; // 0x77
+ field public static final int LLC_SNDCP = 25; // 0x19
+ field public static final int LOST_CONNECTION = 65540; // 0x10004
+ field public static final int MESSAGE_INCORRECT_SEMANTIC = 95; // 0x5f
+ field public static final int MESSAGE_TYPE_UNSUPPORTED = 97; // 0x61
+ field public static final int MISSING_UNKNOWN_APN = 27; // 0x1b
+ field public static final int MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 101; // 0x65
+ field public static final int MSG_TYPE_NONCOMPATIBLE_STATE = 98; // 0x62
+ field public static final int MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 55; // 0x37
+ field public static final int NAS_SIGNALLING = 14; // 0xe
+ field public static final int NETWORK_FAILURE = 38; // 0x26
+ field public static final int NONE = 0; // 0x0
+ field public static final int NSAPI_IN_USE = 35; // 0x23
+ field public static final int OEM_DCFAILCAUSE_1 = 4097; // 0x1001
+ field public static final int OEM_DCFAILCAUSE_10 = 4106; // 0x100a
+ field public static final int OEM_DCFAILCAUSE_11 = 4107; // 0x100b
+ field public static final int OEM_DCFAILCAUSE_12 = 4108; // 0x100c
+ field public static final int OEM_DCFAILCAUSE_13 = 4109; // 0x100d
+ field public static final int OEM_DCFAILCAUSE_14 = 4110; // 0x100e
+ field public static final int OEM_DCFAILCAUSE_15 = 4111; // 0x100f
+ field public static final int OEM_DCFAILCAUSE_2 = 4098; // 0x1002
+ field public static final int OEM_DCFAILCAUSE_3 = 4099; // 0x1003
+ field public static final int OEM_DCFAILCAUSE_4 = 4100; // 0x1004
+ field public static final int OEM_DCFAILCAUSE_5 = 4101; // 0x1005
+ field public static final int OEM_DCFAILCAUSE_6 = 4102; // 0x1006
+ field public static final int OEM_DCFAILCAUSE_7 = 4103; // 0x1007
+ field public static final int OEM_DCFAILCAUSE_8 = 4104; // 0x1008
+ field public static final int OEM_DCFAILCAUSE_9 = 4105; // 0x1009
+ field public static final int ONLY_IPV4_ALLOWED = 50; // 0x32
+ field public static final int ONLY_IPV6_ALLOWED = 51; // 0x33
+ field public static final int ONLY_SINGLE_BEARER_ALLOWED = 52; // 0x34
+ field public static final int OPERATOR_BARRED = 8; // 0x8
+ field public static final int PDN_CONN_DOES_NOT_EXIST = 54; // 0x36
+ field public static final int PDP_WITHOUT_ACTIVE_TFT = 46; // 0x2e
+ field public static final int PREF_RADIO_TECH_CHANGED = -4; // 0xfffffffc
+ field public static final int PROTOCOL_ERRORS = 111; // 0x6f
+ field public static final int QOS_NOT_ACCEPTED = 37; // 0x25
+ field public static final int RADIO_NOT_AVAILABLE = 65537; // 0x10001
+ field public static final int RADIO_POWER_OFF = -5; // 0xfffffffb
+ field public static final int REGISTRATION_FAIL = -1; // 0xffffffff
+ field public static final int REGULAR_DEACTIVATION = 36; // 0x24
+ field public static final int SERVICE_OPTION_NOT_SUBSCRIBED = 33; // 0x21
+ field public static final int SERVICE_OPTION_NOT_SUPPORTED = 32; // 0x20
+ field public static final int SERVICE_OPTION_OUT_OF_ORDER = 34; // 0x22
+ field public static final int SIGNAL_LOST = -3; // 0xfffffffd
+ field public static final int TETHERED_CALL_ACTIVE = -6; // 0xfffffffa
+ field public static final int TFT_SEMANTIC_ERROR = 41; // 0x29
+ field public static final int TFT_SYTAX_ERROR = 42; // 0x2a
+ field public static final int UMTS_REACTIVATION_REQ = 39; // 0x27
+ field public static final int UNKNOWN = 65536; // 0x10000
+ field public static final int UNKNOWN_INFO_ELEMENT = 99; // 0x63
+ field public static final int UNKNOWN_PDP_ADDRESS_TYPE = 28; // 0x1c
+ field public static final int UNKNOWN_PDP_CONTEXT = 43; // 0x2b
+ field public static final int UNSUPPORTED_APN_IN_CURRENT_PLMN = 66; // 0x42
+ field public static final int USER_AUTHENTICATION = 29; // 0x1d
}
public class DisconnectCause {
@@ -5997,20 +6603,32 @@ package android.telephony {
field public static final int WIFI_LOST = 59; // 0x3b
}
+ public final class LteVopsSupportInfo implements android.os.Parcelable {
+ ctor public LteVopsSupportInfo(int, int);
+ method public int describeContents();
+ method public int getEmcBearerSupport();
+ method public int getVopsSupport();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.LteVopsSupportInfo> CREATOR;
+ field public static final int LTE_STATUS_NOT_AVAILABLE = 1; // 0x1
+ field public static final int LTE_STATUS_NOT_SUPPORTED = 3; // 0x3
+ field public static final int LTE_STATUS_SUPPORTED = 2; // 0x2
+ }
+
public class MbmsDownloadSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_DOWNLOAD_SERVICE_ACTION = "android.telephony.action.EmbmsDownload";
+ field public static final String MBMS_DOWNLOAD_SERVICE_ACTION = "android.telephony.action.EmbmsDownload";
}
public class MbmsGroupCallSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_GROUP_CALL_SERVICE_ACTION = "android.telephony.action.EmbmsGroupCall";
+ field public static final String MBMS_GROUP_CALL_SERVICE_ACTION = "android.telephony.action.EmbmsGroupCall";
}
public class MbmsStreamingSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
+ field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
public class NetworkRegistrationState implements android.os.Parcelable {
- ctor public NetworkRegistrationState(int, int, int, int, int, boolean, int[], android.telephony.CellIdentity);
+ ctor public NetworkRegistrationState(int, int, int, int, int, boolean, int[], @Nullable android.telephony.CellIdentity);
ctor protected NetworkRegistrationState(android.os.Parcel);
method public int describeContents();
method public int getAccessNetworkTechnology();
@@ -6043,7 +6661,7 @@ package android.telephony {
public abstract class NetworkService extends android.app.Service {
ctor public NetworkService();
method protected abstract android.telephony.NetworkService.NetworkServiceProvider createNetworkServiceProvider(int);
- field public static final java.lang.String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService";
+ field public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService";
}
public abstract class NetworkService.NetworkServiceProvider implements java.lang.AutoCloseable {
@@ -6064,8 +6682,8 @@ package android.telephony {
field public static final int RESULT_SUCCESS = 0; // 0x0
}
- public abstract interface NumberVerificationCallback {
- method public default void onCallReceived(java.lang.String);
+ public interface NumberVerificationCallback {
+ method public default void onCallReceived(@NonNull String);
method public default void onVerificationFailed(int);
field public static final int REASON_CONCURRENT_REQUESTS = 4; // 0x4
field public static final int REASON_IN_ECBM = 5; // 0x5
@@ -6077,23 +6695,27 @@ package android.telephony {
}
public final class PhoneNumberRange implements android.os.Parcelable {
- ctor public PhoneNumberRange(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ ctor public PhoneNumberRange(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
method public int describeContents();
- method public boolean matches(java.lang.String);
+ method public boolean matches(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.PhoneNumberRange> CREATOR;
}
public class PhoneStateListener {
+ method public void onCallAttributesChanged(android.telephony.CallAttributes);
method public void onCallDisconnectCauseChanged(int, int);
method public void onPreciseCallStateChanged(android.telephony.PreciseCallState);
+ method public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState);
method public void onRadioPowerStateChanged(int);
method public void onSrvccStateChanged(int);
method public void onVoiceActivationStateChanged(int);
+ field public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000
field public static final int LISTEN_CALL_DISCONNECT_CAUSES = 33554432; // 0x2000000
field public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800
+ field public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 4096; // 0x1000
field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
- field public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000
+ field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000
field public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000
}
@@ -6116,6 +6738,16 @@ package android.telephony {
field public static final int PRECISE_CALL_STATE_WAITING = 6; // 0x6
}
+ public final class PreciseDataConnectionState implements android.os.Parcelable {
+ method public int describeContents();
+ method public String getDataConnectionApn();
+ method public int getDataConnectionApnTypeBitMask();
+ method public int getDataConnectionFailCause();
+ method public int getDataConnectionState();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.PreciseDataConnectionState> CREATOR;
+ }
+
public class PreciseDisconnectCause {
field public static final int ACCESS_CLASS_BLOCKED = 260; // 0x104
field public static final int ACCESS_INFORMATION_DISCARDED = 43; // 0x2b
@@ -6216,8 +6848,8 @@ package android.telephony {
public class ServiceState implements android.os.Parcelable {
method public android.telephony.NetworkRegistrationState getNetworkRegistrationState(int, int);
method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
- method public deprecated java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
- method public deprecated android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
+ method @Deprecated public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
+ method @Deprecated public android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForDomain(int);
method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForTransportType(int);
field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
@@ -6227,7 +6859,7 @@ package android.telephony {
}
public final class SmsManager {
- method public void sendMultipartTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
field public static final int RESULT_CANCELLED = 23; // 0x17
field public static final int RESULT_ENCODING_ERROR = 18; // 0x12
field public static final int RESULT_ERROR_FDN_CHECK_FAILURE = 6; // 0x6
@@ -6249,17 +6881,23 @@ package android.telephony {
}
public class SubscriptionInfo implements android.os.Parcelable {
- method public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
+ method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
method public int getCardId();
+ method public int getProfileClass();
}
public class SubscriptionManager {
method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList();
method public void requestEmbeddedSubscriptionInfoListRefresh();
method public void requestEmbeddedSubscriptionInfoListRefresh(int);
- method public void setDefaultDataSubId(int);
- method public void setDefaultSmsSubId(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int);
field public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI;
+ field public static final int PROFILE_CLASS_DEFAULT = -1; // 0xffffffff
+ field public static final int PROFILE_CLASS_OPERATIONAL = 2; // 0x2
+ field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1
+ field public static final int PROFILE_CLASS_TESTING = 0; // 0x0
+ field public static final int PROFILE_CLASS_UNSET = -1; // 0xffffffff
field public static final android.net.Uri VT_ENABLED_CONTENT_URI;
field public static final android.net.Uri WFC_ENABLED_CONTENT_URI;
field public static final android.net.Uri WFC_MODE_CONTENT_URI;
@@ -6268,9 +6906,9 @@ package android.telephony {
}
public static class SubscriptionPlan.Builder {
- method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
- method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
- method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+ method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
+ method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
+ method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
}
public final class TelephonyHistogram implements android.os.Parcelable {
@@ -6294,84 +6932,88 @@ package android.telephony {
}
public class TelephonyManager {
- method public deprecated void call(java.lang.String, java.lang.String);
- method public int checkCarrierPrivilegesForPackage(java.lang.String);
- method public int checkCarrierPrivilegesForPackageAnyPhone(java.lang.String);
- method public void dial(java.lang.String);
- method public boolean disableDataConnectivity();
- method public boolean enableDataConnectivity();
- method public void enableVideoCalling(boolean);
- method public java.lang.String getAidForAppType(int);
- method public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
- method public int getCardIdForDefaultEuicc();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
+ method public int checkCarrierPrivilegesForPackage(String);
+ method public int checkCarrierPrivilegesForPackageAnyPhone(String);
+ method public void dial(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean disableDataConnectivity();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableDataConnectivity();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableModemForSlot(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getCardIdForDefaultEuicc();
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
- method public java.lang.String getCdmaMdn();
- method public java.lang.String getCdmaMdn(int);
- method public java.lang.String getCdmaMin();
- method public java.lang.String getCdmaMin(int);
- method public java.lang.String getCdmaPrlVersion();
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin(int);
+ method public String getCdmaPrlVersion();
method public int getCurrentPhoneType();
method public int getCurrentPhoneType(int);
- method public int getDataActivationState();
- method public deprecated boolean getDataEnabled();
- method public deprecated boolean getDataEnabled(int);
- method public boolean getEmergencyCallbackMode();
- method public java.lang.String getIsimDomain();
- method public int getPreferredNetworkTypeBitmap();
- method public int getRadioPowerState();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getDataActivationState();
+ method @Deprecated public boolean getDataEnabled();
+ method @Deprecated public boolean getDataEnabled(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPreferredNetworkTypeBitmap();
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState();
method public int getSimApplicationState();
method public int getSimCardState();
- method public int getSupportedRadioAccessFamily();
- method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
- method public android.telephony.UiccCardInfo[] getUiccCardsInfo();
- method public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
- method public android.os.Bundle getVisualVoicemailSettings();
- method public int getVoiceActivationState();
- method public boolean handlePinMmi(java.lang.String);
- method public boolean handlePinMmiForSubscriber(int, java.lang.String);
- method public boolean isCurrentPotentialEmergencyNumber(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSupportedRadioAccessFamily();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccCardInfo[] getUiccCardsInfo();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
+ method @Nullable public android.os.Bundle getVisualVoicemailSettings();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmi(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmiForSubscriber(int, String);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCurrentPotentialEmergencyNumber(@NonNull String);
method public boolean isDataConnectivityPossible();
- method public deprecated boolean isIdle();
- method public deprecated boolean isOffhook();
- method public deprecated boolean isRadioOn();
- method public deprecated boolean isRinging();
- method public boolean isVideoCallingEnabled();
- method public deprecated boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle();
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook();
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRadioOn();
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
+ method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isVideoCallingEnabled();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
method public boolean needsOtaServiceProvisioning();
- method public boolean rebootRadio();
- method public void requestCellInfoUpdate(android.os.WorkSource, java.util.concurrent.Executor, android.telephony.TelephonyManager.CellInfoCallback);
- method public void requestNumberVerification(android.telephony.PhoneNumberRange, long, java.util.concurrent.Executor, android.telephony.NumberVerificationCallback);
- method public boolean resetRadioConfig();
- method public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
- method public void setCarrierDataEnabled(boolean);
- method public void setDataActivationState(int);
- method public deprecated void setDataEnabled(int, boolean);
- method public void setDataRoamingEnabled(boolean);
- method public boolean setPreferredNetworkTypeBitmap(int);
- method public boolean setRadio(boolean);
- method public boolean setRadioPower(boolean);
- method public void setSimPowerState(int);
- method public void setSimPowerStateForSlot(int, int);
- method public deprecated void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
- method public void setVoiceActivationState(int);
- method public boolean supplyPin(java.lang.String);
- method public int[] supplyPinReportResult(java.lang.String);
- method public boolean supplyPuk(java.lang.String, java.lang.String);
- method public int[] supplyPukReportResult(java.lang.String, java.lang.String);
- method public boolean switchSlots(int[]);
- method public void toggleRadioOnOff();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
+ method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int);
+ method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPin(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
method public void updateServiceLocation();
- field public static final java.lang.String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED";
- field public static final java.lang.String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED";
- field public static final java.lang.String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED";
+ field public static final String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED";
+ field public static final String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED";
+ field public static final String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED";
field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe
field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1
field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0
field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff
- field public static final java.lang.String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
- field public static final java.lang.String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
- field public static final java.lang.String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
+ field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
+ field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
+ field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
field public static final int INVALID_CARD_ID = -1; // 0xffffffff
field public static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000L; // 0xea60L
field public static final int NETWORK_TYPE_BITMASK_1xRTT = 128; // 0x80
@@ -6396,6 +7038,9 @@ package android.telephony {
field public static final int RADIO_POWER_OFF = 0; // 0x0
field public static final int RADIO_POWER_ON = 1; // 0x1
field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
+ field public static final int SET_CARRIER_RESTRICTION_ERROR = 2; // 0x2
+ field public static final int SET_CARRIER_RESTRICTION_NOT_SUPPORTED = 1; // 0x1
+ field public static final int SET_CARRIER_RESTRICTION_SUCCESS = 0; // 0x0
field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2
field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1
field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3
@@ -6411,22 +7056,22 @@ package android.telephony {
}
public final class UiccAccessRule implements android.os.Parcelable {
- ctor public UiccAccessRule(byte[], java.lang.String, long);
+ ctor public UiccAccessRule(byte[], @Nullable String, long);
method public int describeContents();
method public int getCarrierPrivilegeStatus(android.content.pm.PackageInfo);
- method public int getCarrierPrivilegeStatus(android.content.pm.Signature, java.lang.String);
- method public java.lang.String getCertificateHexString();
- method public java.lang.String getPackageName();
+ method public int getCarrierPrivilegeStatus(android.content.pm.Signature, String);
+ method public String getCertificateHexString();
+ method @Nullable public String getPackageName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR;
}
public class UiccCardInfo implements android.os.Parcelable {
- ctor public UiccCardInfo(boolean, int, java.lang.String, java.lang.String, int);
+ ctor public UiccCardInfo(boolean, int, String, String, int);
method public int describeContents();
method public int getCardId();
- method public java.lang.String getEid();
- method public java.lang.String getIccId();
+ method public String getEid();
+ method public String getIccId();
method public int getSlotIndex();
method public boolean isEuicc();
method public void writeToParcel(android.os.Parcel, int);
@@ -6434,9 +7079,9 @@ package android.telephony {
}
public class UiccSlotInfo implements android.os.Parcelable {
- ctor public UiccSlotInfo(boolean, boolean, java.lang.String, int, int, boolean);
+ ctor public UiccSlotInfo(boolean, boolean, String, int, int, boolean);
method public int describeContents();
- method public java.lang.String getCardId();
+ method public String getCardId();
method public int getCardStateInfo();
method public boolean getIsActive();
method public boolean getIsEuicc();
@@ -6451,7 +7096,7 @@ package android.telephony {
}
public abstract class VisualVoicemailService extends android.app.Service {
- method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent);
+ method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, String, short, String, android.app.PendingIntent);
method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings);
}
@@ -6460,38 +7105,38 @@ package android.telephony {
package android.telephony.data {
public final class DataCallResponse implements android.os.Parcelable {
- ctor public DataCallResponse(int, int, int, int, java.lang.String, java.lang.String, java.util.List<android.net.LinkAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.lang.String>, int);
+ ctor public DataCallResponse(int, int, int, int, @Nullable String, @Nullable String, @Nullable java.util.List<android.net.LinkAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.lang.String>, int);
ctor public DataCallResponse(android.os.Parcel);
method public int describeContents();
method public int getActive();
- method public java.util.List<android.net.LinkAddress> getAddresses();
+ method @NonNull public java.util.List<android.net.LinkAddress> getAddresses();
method public int getCallId();
- method public java.util.List<java.net.InetAddress> getDnses();
- method public java.util.List<java.net.InetAddress> getGateways();
- method public java.lang.String getIfname();
+ method @NonNull public java.util.List<java.net.InetAddress> getDnses();
+ method @NonNull public java.util.List<java.net.InetAddress> getGateways();
+ method @NonNull public String getIfname();
method public int getMtu();
- method public java.util.List<java.lang.String> getPcscfs();
+ method @NonNull public java.util.List<java.lang.String> getPcscfs();
method public int getStatus();
method public int getSuggestedRetryTime();
- method public java.lang.String getType();
+ method @NonNull public String getType();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
}
public final class DataProfile implements android.os.Parcelable {
- method public java.lang.String getApn();
+ method public String getApn();
method public int getAuthType();
method public int getBearerBitmap();
method public int getMaxConns();
method public int getMaxConnsTime();
method public int getMtu();
- method public java.lang.String getPassword();
+ method public String getPassword();
method public int getProfileId();
- method public java.lang.String getProtocol();
- method public java.lang.String getRoamingProtocol();
+ method public String getProtocol();
+ method public String getRoamingProtocol();
method public int getSupportedApnTypesBitmap();
method public int getType();
- method public java.lang.String getUserName();
+ method public String getUserName();
method public int getWaitTime();
method public boolean isEnabled();
method public boolean isPersistent();
@@ -6504,7 +7149,7 @@ package android.telephony.data {
public abstract class DataService extends android.app.Service {
ctor public DataService();
method public abstract android.telephony.data.DataService.DataServiceProvider createDataServiceProvider(int);
- field public static final java.lang.String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService";
+ field public static final String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService";
field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3
field public static final int REQUEST_REASON_NORMAL = 1; // 0x1
field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2
@@ -6513,13 +7158,13 @@ package android.telephony.data {
public abstract class DataService.DataServiceProvider implements java.lang.AutoCloseable {
ctor public DataService.DataServiceProvider(int);
method public abstract void close();
- method public void deactivateDataCall(int, int, android.telephony.data.DataServiceCallback);
- method public void getDataCallList(android.telephony.data.DataServiceCallback);
+ method public void deactivateDataCall(int, int, @Nullable android.telephony.data.DataServiceCallback);
+ method public void getDataCallList(@NonNull android.telephony.data.DataServiceCallback);
method public final int getSlotId();
method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
- method public void setDataProfile(java.util.List<android.telephony.data.DataProfile>, boolean, android.telephony.data.DataServiceCallback);
- method public void setInitialAttachApn(android.telephony.data.DataProfile, boolean, android.telephony.data.DataServiceCallback);
- method public void setupDataCall(int, android.telephony.data.DataProfile, boolean, boolean, int, android.net.LinkProperties, android.telephony.data.DataServiceCallback);
+ method public void setDataProfile(java.util.List<android.telephony.data.DataProfile>, boolean, @Nullable android.telephony.data.DataServiceCallback);
+ method public void setInitialAttachApn(android.telephony.data.DataProfile, boolean, @Nullable android.telephony.data.DataServiceCallback);
+ method public void setupDataCall(int, android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @Nullable android.telephony.data.DataServiceCallback);
}
public class DataServiceCallback {
@@ -6539,7 +7184,7 @@ package android.telephony.data {
public abstract class QualifiedNetworksService extends android.app.Service {
ctor public QualifiedNetworksService();
method public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int);
- field public static final java.lang.String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService";
+ field public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService";
}
public abstract class QualifiedNetworksService.NetworkAvailabilityUpdater implements java.lang.AutoCloseable {
@@ -6555,7 +7200,7 @@ package android.telephony.euicc {
public final class DownloadableSubscription implements android.os.Parcelable {
method public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
- method public java.lang.String getCarrierName();
+ method @Nullable public String getCarrierName();
}
public static final class DownloadableSubscription.Builder {
@@ -6563,34 +7208,34 @@ package android.telephony.euicc {
ctor public DownloadableSubscription.Builder(android.telephony.euicc.DownloadableSubscription);
method public android.telephony.euicc.DownloadableSubscription build();
method public android.telephony.euicc.DownloadableSubscription.Builder setAccessRules(java.util.List<android.telephony.UiccAccessRule>);
- method public android.telephony.euicc.DownloadableSubscription.Builder setCarrierName(java.lang.String);
- method public android.telephony.euicc.DownloadableSubscription.Builder setConfirmationCode(java.lang.String);
- method public android.telephony.euicc.DownloadableSubscription.Builder setEncodedActivationCode(java.lang.String);
+ method public android.telephony.euicc.DownloadableSubscription.Builder setCarrierName(String);
+ method public android.telephony.euicc.DownloadableSubscription.Builder setConfirmationCode(String);
+ method public android.telephony.euicc.DownloadableSubscription.Builder setEncodedActivationCode(String);
}
public class EuiccCardManager {
- method public void authenticateServer(java.lang.String, java.lang.String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void cancelSession(java.lang.String, byte[], int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void deleteProfile(java.lang.String, java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void disableProfile(java.lang.String, java.lang.String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void listNotifications(java.lang.String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
- method public void loadBoundProfilePackage(java.lang.String, byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void prepareDownload(java.lang.String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void removeNotificationFromList(java.lang.String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void requestAllProfiles(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo[]>);
- method public void requestDefaultSmdpAddress(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
- method public void requestEuiccChallenge(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void requestEuiccInfo1(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void requestEuiccInfo2(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
- method public void requestProfile(java.lang.String, java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
- method public void requestRulesAuthTable(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccRulesAuthTable>);
- method public void requestSmdsAddress(java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
- method public void resetMemory(java.lang.String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void retrieveNotification(java.lang.String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification>);
- method public void retrieveNotificationList(java.lang.String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
- method public void setDefaultSmdpAddress(java.lang.String, java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void setNickname(java.lang.String, java.lang.String, java.lang.String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
- method public void switchToProfile(java.lang.String, java.lang.String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
+ method public void authenticateServer(String, String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void cancelSession(String, byte[], @android.telephony.euicc.EuiccCardManager.CancelReason int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void deleteProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void disableProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void listNotifications(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
+ method public void loadBoundProfilePackage(String, byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void prepareDownload(String, @Nullable byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void removeNotificationFromList(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void requestAllProfiles(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo[]>);
+ method public void requestDefaultSmdpAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
+ method public void requestEuiccChallenge(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void requestEuiccInfo1(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void requestEuiccInfo2(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
+ method public void requestProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
+ method public void requestRulesAuthTable(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccRulesAuthTable>);
+ method public void requestSmdsAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
+ method public void resetMemory(String, @android.telephony.euicc.EuiccCardManager.ResetOption int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void retrieveNotification(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification>);
+ method public void retrieveNotificationList(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
+ method public void setDefaultSmdpAddress(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void setNickname(String, String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
+ method public void switchToProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
field public static final int CANCEL_REASON_END_USER_REJECTED = 0; // 0x0
field public static final int CANCEL_REASON_POSTPONED = 1; // 0x1
field public static final int CANCEL_REASON_PPR_NOT_ALLOWED = 3; // 0x3
@@ -6604,25 +7249,25 @@ package android.telephony.euicc {
field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff
}
- public static abstract class EuiccCardManager.CancelReason implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"CANCEL_REASON_"}, value={android.telephony.euicc.EuiccCardManager.CANCEL_REASON_END_USER_REJECTED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_POSTPONED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_TIMEOUT, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_PPR_NOT_ALLOWED}) public static @interface EuiccCardManager.CancelReason {
}
- public static abstract class EuiccCardManager.ResetOption implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"RESET_OPTION_"}, value={android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS}) public static @interface EuiccCardManager.ResetOption {
}
- public static abstract interface EuiccCardManager.ResultCallback<T> {
- method public abstract void onComplete(int, T);
+ public static interface EuiccCardManager.ResultCallback<T> {
+ method public void onComplete(int, T);
}
public class EuiccManager {
- method public void continueOperation(android.content.Intent, android.os.Bundle);
- method public void eraseSubscriptions(android.app.PendingIntent);
- method public void getDefaultDownloadableSubscriptionList(android.app.PendingIntent);
- method public void getDownloadableSubscriptionMetadata(android.telephony.euicc.DownloadableSubscription, android.app.PendingIntent);
- method public int getOtaStatus();
- field public static final java.lang.String ACTION_OTA_STATUS_CHANGED = "android.telephony.euicc.action.OTA_STATUS_CHANGED";
- field public static final java.lang.String ACTION_PROFILE_SELECTION = "android.telephony.euicc.action.PROFILE_SELECTION";
- field public static final java.lang.String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.telephony.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
+ method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void continueOperation(android.content.Intent, android.os.Bundle);
+ method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void eraseSubscriptions(android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDefaultDownloadableSubscriptionList(android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDownloadableSubscriptionMetadata(android.telephony.euicc.DownloadableSubscription, android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public int getOtaStatus();
+ field @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public static final String ACTION_OTA_STATUS_CHANGED = "android.telephony.euicc.action.OTA_STATUS_CHANGED";
+ field public static final String ACTION_PROFILE_SELECTION = "android.telephony.euicc.action.PROFILE_SELECTION";
+ field public static final String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.telephony.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
field public static final int EUICC_ACTIVATION_TYPE_BACKUP = 2; // 0x2
field public static final int EUICC_ACTIVATION_TYPE_DEFAULT = 1; // 0x1
field public static final int EUICC_ACTIVATION_TYPE_TRANSFER = 3; // 0x3
@@ -6631,23 +7276,23 @@ package android.telephony.euicc {
field public static final int EUICC_OTA_NOT_NEEDED = 4; // 0x4
field public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5; // 0x5
field public static final int EUICC_OTA_SUCCEEDED = 3; // 0x3
- field public static final java.lang.String EXTRA_ACTIVATION_TYPE = "android.telephony.euicc.extra.ACTIVATION_TYPE";
- field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS";
- field public static final java.lang.String EXTRA_FORCE_PROVISION = "android.telephony.euicc.extra.FORCE_PROVISION";
+ field public static final String EXTRA_ACTIVATION_TYPE = "android.telephony.euicc.extra.ACTIVATION_TYPE";
+ field public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS";
+ field public static final String EXTRA_FORCE_PROVISION = "android.telephony.euicc.extra.FORCE_PROVISION";
}
- public static abstract class EuiccManager.OtaStatus implements java.lang.annotation.Annotation {
+ @IntDef(prefix={"EUICC_OTA_"}, value={android.telephony.euicc.EuiccManager.EUICC_OTA_IN_PROGRESS, android.telephony.euicc.EuiccManager.EUICC_OTA_FAILED, android.telephony.euicc.EuiccManager.EUICC_OTA_SUCCEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_NOT_NEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_STATUS_UNAVAILABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccManager.OtaStatus {
}
public final class EuiccNotification implements android.os.Parcelable {
- ctor public EuiccNotification(int, java.lang.String, int, byte[]);
+ ctor public EuiccNotification(int, String, @android.telephony.euicc.EuiccNotification.Event int, @Nullable byte[]);
method public int describeContents();
- method public byte[] getData();
- method public int getEvent();
+ method @Nullable public byte[] getData();
+ method @android.telephony.euicc.EuiccNotification.Event public int getEvent();
method public int getSeq();
- method public java.lang.String getTargetAddr();
+ method public String getTargetAddr();
method public void writeToParcel(android.os.Parcel, int);
- field public static final int ALL_EVENTS = 15; // 0xf
+ field @android.telephony.euicc.EuiccNotification.Event public static final int ALL_EVENTS = 15; // 0xf
field public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccNotification> CREATOR;
field public static final int EVENT_DELETE = 8; // 0x8
field public static final int EVENT_DISABLE = 4; // 0x4
@@ -6655,13 +7300,13 @@ package android.telephony.euicc {
field public static final int EVENT_INSTALL = 1; // 0x1
}
- public static abstract class EuiccNotification.Event implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"EVENT_"}, value={android.telephony.euicc.EuiccNotification.EVENT_INSTALL, android.telephony.euicc.EuiccNotification.EVENT_ENABLE, android.telephony.euicc.EuiccNotification.EVENT_DISABLE, android.telephony.euicc.EuiccNotification.EVENT_DELETE}) public static @interface EuiccNotification.Event {
}
public final class EuiccRulesAuthTable implements android.os.Parcelable {
method public int describeContents();
- method public int findIndex(int, android.service.carrier.CarrierIdentifier);
- method public boolean hasPolicyRuleFlag(int, int);
+ method public int findIndex(@android.service.euicc.EuiccProfileInfo.PolicyRule int, android.service.carrier.CarrierIdentifier);
+ method public boolean hasPolicyRuleFlag(int, @android.telephony.euicc.EuiccRulesAuthTable.PolicyRuleFlag int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccRulesAuthTable> CREATOR;
field public static final int POLICY_RULE_FLAG_CONSENT_REQUIRED = 1; // 0x1
@@ -6673,7 +7318,7 @@ package android.telephony.euicc {
method public android.telephony.euicc.EuiccRulesAuthTable build();
}
- public static abstract class EuiccRulesAuthTable.PolicyRuleFlag implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"POLICY_RULE_FLAG_"}, value={android.telephony.euicc.EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED}) public static @interface EuiccRulesAuthTable.PolicyRuleFlag {
}
}
@@ -6681,10 +7326,10 @@ package android.telephony.euicc {
package android.telephony.ims {
public final class ImsCallForwardInfo implements android.os.Parcelable {
- ctor public ImsCallForwardInfo(int, int, int, int, java.lang.String, int);
+ ctor public ImsCallForwardInfo(int, int, int, int, @NonNull String, int);
method public int describeContents();
method public int getCondition();
- method public java.lang.String getNumber();
+ method public String getNumber();
method public int getServiceClass();
method public int getStatus();
method public int getTimeSeconds();
@@ -6709,29 +7354,35 @@ package android.telephony.ims {
ctor public ImsCallProfile(int, int);
ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile);
method public int describeContents();
- method public java.lang.String getCallExtra(java.lang.String);
- method public java.lang.String getCallExtra(java.lang.String, java.lang.String);
- method public boolean getCallExtraBoolean(java.lang.String);
- method public boolean getCallExtraBoolean(java.lang.String, boolean);
- method public int getCallExtraInt(java.lang.String);
- method public int getCallExtraInt(java.lang.String, int);
+ method public String getCallExtra(String);
+ method public String getCallExtra(String, String);
+ method public boolean getCallExtraBoolean(String);
+ method public boolean getCallExtraBoolean(String, boolean);
+ method public int getCallExtraInt(String);
+ method public int getCallExtraInt(String, int);
method public android.os.Bundle getCallExtras();
method public int getCallType();
method public static int getCallTypeFromVideoState(int);
+ method public int getEmergencyCallRouting();
method public int getEmergencyServiceCategories();
+ method public java.util.List<java.lang.String> getEmergencyUrns();
method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile();
method public int getRestrictCause();
method public int getServiceType();
method public static int getVideoStateFromCallType(int);
method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile);
+ method public boolean isEmergencyCallTesting();
method public boolean isVideoCall();
method public boolean isVideoPaused();
method public static int presentationToOir(int);
- method public void setCallExtra(java.lang.String, java.lang.String);
- method public void setCallExtraBoolean(java.lang.String, boolean);
- method public void setCallExtraInt(java.lang.String, int);
+ method public void setCallExtra(String, String);
+ method public void setCallExtraBoolean(String, boolean);
+ method public void setCallExtraInt(String, int);
method public void setCallRestrictCause(int);
+ method public void setEmergencyCallRouting(int);
+ method public void setEmergencyCallTesting(boolean);
method public void setEmergencyServiceCategories(int);
+ method public void setEmergencyUrns(java.util.List<java.lang.String>);
method public void updateCallExtras(android.telephony.ims.ImsCallProfile);
method public void updateCallType(android.telephony.ims.ImsCallProfile);
method public void updateMediaProfile(android.telephony.ims.ImsCallProfile);
@@ -6754,21 +7405,21 @@ package android.telephony.ims {
field public static final int DIALSTRING_NORMAL = 0; // 0x0
field public static final int DIALSTRING_SS_CONF = 1; // 0x1
field public static final int DIALSTRING_USSD = 2; // 0x2
- field public static final java.lang.String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo";
- field public static final java.lang.String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS";
- field public static final java.lang.String EXTRA_CALL_RAT_TYPE = "CallRadioTech";
- field public static final java.lang.String EXTRA_CHILD_NUMBER = "ChildNum";
- field public static final java.lang.String EXTRA_CNA = "cna";
- field public static final java.lang.String EXTRA_CNAP = "cnap";
- field public static final java.lang.String EXTRA_CODEC = "Codec";
- field public static final java.lang.String EXTRA_DIALSTRING = "dialstring";
- field public static final java.lang.String EXTRA_DISPLAY_TEXT = "DisplayText";
- field public static final java.lang.String EXTRA_EMERGENCY_CALL = "e_call";
- field public static final java.lang.String EXTRA_IS_CALL_PULL = "CallPull";
- field public static final java.lang.String EXTRA_OI = "oi";
- field public static final java.lang.String EXTRA_OIR = "oir";
- field public static final java.lang.String EXTRA_REMOTE_URI = "remote_uri";
- field public static final java.lang.String EXTRA_USSD = "ussd";
+ field public static final String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo";
+ field public static final String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS";
+ field public static final String EXTRA_CALL_RAT_TYPE = "CallRadioTech";
+ field public static final String EXTRA_CHILD_NUMBER = "ChildNum";
+ field public static final String EXTRA_CNA = "cna";
+ field public static final String EXTRA_CNAP = "cnap";
+ field public static final String EXTRA_CODEC = "Codec";
+ field public static final String EXTRA_DIALSTRING = "dialstring";
+ field public static final String EXTRA_DISPLAY_TEXT = "DisplayText";
+ field public static final String EXTRA_EMERGENCY_CALL = "e_call";
+ field public static final String EXTRA_IS_CALL_PULL = "CallPull";
+ field public static final String EXTRA_OI = "oi";
+ field public static final String EXTRA_OIR = "oir";
+ field public static final String EXTRA_REMOTE_URI = "remote_uri";
+ field public static final String EXTRA_USSD = "ussd";
field public static final int OIR_DEFAULT = 0; // 0x0
field public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; // 0x2
field public static final int OIR_PRESENTATION_PAYPHONE = 4; // 0x4
@@ -6780,6 +7431,7 @@ package android.telephony.ims {
}
public class ImsCallSessionListener {
+ method public void callQualityChanged(android.telephony.CallQuality);
method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo);
method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
@@ -6804,8 +7456,9 @@ package android.telephony.ims {
method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo);
method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile);
method public void callSessionResumed(android.telephony.ims.ImsCallProfile);
+ method public void callSessionRttAudioIndicatorChanged(android.telephony.ims.ImsStreamMediaProfile);
+ method public void callSessionRttMessageReceived(String);
method public void callSessionPropertyChanged(int);
- method public void callSessionRttMessageReceived(java.lang.String);
method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile);
method public void callSessionRttModifyResponseReceived(int);
method public void callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification);
@@ -6814,36 +7467,36 @@ package android.telephony.ims {
method public void callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo);
method public void callSessionUpdateReceived(android.telephony.ims.ImsCallProfile);
method public void callSessionUpdated(android.telephony.ims.ImsCallProfile);
- method public void callSessionUssdMessageReceived(int, java.lang.String);
+ method public void callSessionUssdMessageReceived(int, String);
}
public final class ImsConferenceState implements android.os.Parcelable {
method public int describeContents();
- method public static int getConnectionStateForStatus(java.lang.String);
+ method public static int getConnectionStateForStatus(String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.ims.ImsConferenceState> CREATOR;
- field public static final java.lang.String DISPLAY_TEXT = "display-text";
- field public static final java.lang.String ENDPOINT = "endpoint";
- field public static final java.lang.String SIP_STATUS_CODE = "sipstatuscode";
- field public static final java.lang.String STATUS = "status";
- field public static final java.lang.String STATUS_ALERTING = "alerting";
- field public static final java.lang.String STATUS_CONNECTED = "connected";
- field public static final java.lang.String STATUS_CONNECT_FAIL = "connect-fail";
- field public static final java.lang.String STATUS_DIALING_IN = "dialing-in";
- field public static final java.lang.String STATUS_DIALING_OUT = "dialing-out";
- field public static final java.lang.String STATUS_DISCONNECTED = "disconnected";
- field public static final java.lang.String STATUS_DISCONNECTING = "disconnecting";
- field public static final java.lang.String STATUS_MUTED_VIA_FOCUS = "muted-via-focus";
- field public static final java.lang.String STATUS_ON_HOLD = "on-hold";
- field public static final java.lang.String STATUS_PENDING = "pending";
- field public static final java.lang.String STATUS_SEND_ONLY = "sendonly";
- field public static final java.lang.String STATUS_SEND_RECV = "sendrecv";
- field public static final java.lang.String USER = "user";
- field public final java.util.HashMap<java.lang.String, android.os.Bundle> mParticipants;
+ field public static final String DISPLAY_TEXT = "display-text";
+ field public static final String ENDPOINT = "endpoint";
+ field public static final String SIP_STATUS_CODE = "sipstatuscode";
+ field public static final String STATUS = "status";
+ field public static final String STATUS_ALERTING = "alerting";
+ field public static final String STATUS_CONNECTED = "connected";
+ field public static final String STATUS_CONNECT_FAIL = "connect-fail";
+ field public static final String STATUS_DIALING_IN = "dialing-in";
+ field public static final String STATUS_DIALING_OUT = "dialing-out";
+ field public static final String STATUS_DISCONNECTED = "disconnected";
+ field public static final String STATUS_DISCONNECTING = "disconnecting";
+ field public static final String STATUS_MUTED_VIA_FOCUS = "muted-via-focus";
+ field public static final String STATUS_ON_HOLD = "on-hold";
+ field public static final String STATUS_PENDING = "pending";
+ field public static final String STATUS_SEND_ONLY = "sendonly";
+ field public static final String STATUS_SEND_RECV = "sendrecv";
+ field public static final String USER = "user";
+ field public final java.util.HashMap<java.lang.String,android.os.Bundle> mParticipants;
}
public final class ImsExternalCallState implements android.os.Parcelable {
- ctor public ImsExternalCallState(java.lang.String, android.net.Uri, android.net.Uri, boolean, int, int, boolean);
+ ctor public ImsExternalCallState(String, android.net.Uri, android.net.Uri, boolean, int, int, boolean);
method public int describeContents();
method public android.net.Uri getAddress();
method public int getCallId();
@@ -6860,25 +7513,26 @@ package android.telephony.ims {
public class ImsMmTelManager {
method public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(android.content.Context, int);
- method public int getVoWiFiModeSetting();
- method public boolean isAdvancedCallingSettingEnabled();
- method public boolean isAvailable(int, int);
- method public boolean isCapable(int, int);
- method public boolean isVoWiFiRoamingSettingEnabled();
- method public boolean isVoWiFiSettingEnabled();
- method public boolean isVtSettingEnabled();
- method public void registerImsRegistrationCallback(java.util.concurrent.Executor, android.telephony.ims.ImsMmTelManager.RegistrationCallback);
- method public void registerMmTelCapabilityCallback(java.util.concurrent.Executor, android.telephony.ims.ImsMmTelManager.CapabilityCallback);
- method public void setAdvancedCallingSetting(boolean);
- method public void setRttCapabilitySetting(boolean);
- method public void setVoWiFiModeSetting(int);
- method public void setVoWiFiNonPersistent(boolean, int);
- method public void setVoWiFiRoamingModeSetting(int);
- method public void setVoWiFiRoamingSetting(boolean);
- method public void setVoWiFiSetting(boolean);
- method public void setVtSetting(boolean);
- method public void unregisterImsRegistrationCallback(android.telephony.ims.ImsMmTelManager.RegistrationCallback);
- method public void unregisterMmTelCapabilityCallback(android.telephony.ims.ImsMmTelManager.CapabilityCallback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiModeSetting();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiRoamingModeSetting();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAdvancedCallingSettingEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiRoamingSettingEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiSettingEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVtSettingEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1
field public static final int WIFI_MODE_WIFI_ONLY = 0; // 0x0
field public static final int WIFI_MODE_WIFI_PREFERRED = 2; // 0x2
@@ -6898,11 +7552,11 @@ package android.telephony.ims {
}
public final class ImsReasonInfo implements android.os.Parcelable {
- ctor public ImsReasonInfo(int, int, java.lang.String);
+ ctor public ImsReasonInfo(int, int, String);
method public int describeContents();
method public int getCode();
method public int getExtraCode();
- method public java.lang.String getExtraMessage();
+ method public String getExtraMessage();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CODE_ACCESS_CLASS_BLOCKED = 1512; // 0x5e8
field public static final int CODE_ANSWERED_ELSEWHERE = 1014; // 0x3f6
@@ -7078,7 +7732,7 @@ package android.telephony.ims {
field public static final int EXTRA_CODE_CALL_RETRY_BY_SETTINGS = 3; // 0x3
field public static final int EXTRA_CODE_CALL_RETRY_NORMAL = 1; // 0x1
field public static final int EXTRA_CODE_CALL_RETRY_SILENT_REDIAL = 2; // 0x2
- field public static final java.lang.String EXTRA_MSG_SERVICE_NOT_AUTHORIZED = "Forbidden. Not Authorized for Service";
+ field public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED = "Forbidden. Not Authorized for Service";
}
public class ImsService extends android.app.Service {
@@ -7102,7 +7756,7 @@ package android.telephony.ims {
method public int getResult();
method public int getServiceClass();
method public int getServiceType();
- method public android.telephony.ims.ImsSsInfo[] getSuppServiceInfo();
+ method @NonNull public android.telephony.ims.ImsSsInfo[] getSuppServiceInfo();
method public int getTeleserviceType();
method public boolean isTypeBarring();
method public boolean isTypeCf();
@@ -7164,18 +7818,18 @@ package android.telephony.ims {
public static class ImsSsData.Builder {
ctor public ImsSsData.Builder(int, int, int, int, int);
- method public android.telephony.ims.ImsSsData build();
- method public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(android.telephony.ims.ImsCallForwardInfo[]);
- method public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(android.telephony.ims.ImsSsInfo[]);
+ method @NonNull public android.telephony.ims.ImsSsData build();
+ method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull android.telephony.ims.ImsCallForwardInfo[]);
+ method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull android.telephony.ims.ImsSsInfo[]);
}
public final class ImsSsInfo implements android.os.Parcelable {
- ctor public deprecated ImsSsInfo(int, java.lang.String);
+ ctor @Deprecated public ImsSsInfo(int, @Nullable String);
method public int describeContents();
method public int getClirInterrogationStatus();
method public int getClirOutgoingState();
- method public deprecated java.lang.String getIcbNum();
- method public java.lang.String getIncomingCommunicationBarringNumber();
+ method @Deprecated public String getIcbNum();
+ method public String getIncomingCommunicationBarringNumber();
method public int getProvisionStatus();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
@@ -7198,11 +7852,11 @@ package android.telephony.ims {
public static class ImsSsInfo.Builder {
ctor public ImsSsInfo.Builder(int);
- method public android.telephony.ims.ImsSsInfo build();
- method public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int);
- method public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int);
- method public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(java.lang.String);
- method public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int);
+ method @NonNull public android.telephony.ims.ImsSsInfo build();
+ method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int);
+ method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int);
+ method @NonNull public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(@NonNull String);
+ method @NonNull public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int);
}
public final class ImsStreamMediaProfile implements android.os.Parcelable {
@@ -7211,10 +7865,12 @@ package android.telephony.ims {
method public int describeContents();
method public int getAudioDirection();
method public int getAudioQuality();
+ method public boolean getRttAudioSpeech();
method public int getRttMode();
method public int getVideoDirection();
method public int getVideoQuality();
method public boolean isRttCall();
+ method public void setRttAudioSpeech(boolean);
method public void setRttMode(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int AUDIO_QUALITY_AMR = 1; // 0x1
@@ -7255,15 +7911,15 @@ package android.telephony.ims {
}
public final class ImsSuppServiceNotification implements android.os.Parcelable {
- ctor public ImsSuppServiceNotification(int, int, int, int, java.lang.String, java.lang.String[]);
+ ctor public ImsSuppServiceNotification(int, int, int, int, String, String[]);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR;
field public final int code;
- field public final java.lang.String[] history;
+ field public final String[] history;
field public final int index;
field public final int notificationType;
- field public final java.lang.String number;
+ field public final String number;
field public final int type;
}
@@ -7289,8 +7945,8 @@ package android.telephony.ims {
method public abstract void onRequestCameraCapabilities();
method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile);
method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile);
- method public abstract void onSetCamera(java.lang.String);
- method public void onSetCamera(java.lang.String, int);
+ method public abstract void onSetCamera(String);
+ method public void onSetCamera(String, int);
method public abstract void onSetDeviceOrientation(int);
method public abstract void onSetDisplaySurface(android.view.Surface);
method public abstract void onSetPauseImage(android.net.Uri);
@@ -7302,18 +7958,18 @@ package android.telephony.ims {
public class ProvisioningManager {
method public static android.telephony.ims.ProvisioningManager createForSubscriptionId(android.content.Context, int);
- method public int getProvisioningIntValue(int);
- method public java.lang.String getProvisioningStringValue(int);
- method public void registerProvisioningChangedCallback(java.util.concurrent.Executor, android.telephony.ims.ProvisioningManager.Callback);
- method public int setProvisioningIntValue(int, int);
- method public int setProvisioningStringValue(int, java.lang.String);
- method public void unregisterProvisioningChangedCallback(android.telephony.ims.ProvisioningManager.Callback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getProvisioningIntValue(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getProvisioningStringValue(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setProvisioningIntValue(int, int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setProvisioningStringValue(int, String);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback);
}
public static class ProvisioningManager.Callback {
ctor public ProvisioningManager.Callback();
method public void onProvisioningIntChanged(int, int);
- method public void onProvisioningStringChanged(int, java.lang.String);
+ method public void onProvisioningStringChanged(int, String);
}
}
@@ -7321,8 +7977,8 @@ package android.telephony.ims {
package android.telephony.ims.feature {
public final class CapabilityChangeRequest implements android.os.Parcelable {
- method public void addCapabilitiesToDisableForTech(int, int);
- method public void addCapabilitiesToEnableForTech(int, int);
+ method public void addCapabilitiesToDisableForTech(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
+ method public void addCapabilitiesToEnableForTech(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method public int describeContents();
method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToDisable();
method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToEnable();
@@ -7331,8 +7987,8 @@ package android.telephony.ims.feature {
}
public static class CapabilityChangeRequest.CapabilityPair {
- ctor public CapabilityChangeRequest.CapabilityPair(int, int);
- method public int getCapability();
+ ctor public CapabilityChangeRequest.CapabilityPair(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
+ method @android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability public int getCapability();
method public int getRadioTech();
}
@@ -7362,44 +8018,44 @@ package android.telephony.ims.feature {
public class MmTelFeature extends android.telephony.ims.feature.ImsFeature {
ctor public MmTelFeature();
- method public void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
- method public android.telephony.ims.ImsCallProfile createCallProfile(int, int);
- method public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(android.telephony.ims.ImsCallProfile);
- method public android.telephony.ims.stub.ImsEcbmImplBase getEcbm();
- method public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint();
- method public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation();
- method public android.telephony.ims.stub.ImsUtImplBase getUt();
- method public final void notifyCapabilitiesStatusChanged(android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
- method public final void notifyIncomingCall(android.telephony.ims.stub.ImsCallSessionImplBase, android.os.Bundle);
- method public final void notifyRejectedCall(android.telephony.ims.ImsCallProfile, android.telephony.ims.ImsReasonInfo);
+ method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+ method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int);
+ method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile);
+ method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm();
+ method @NonNull public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint();
+ method @NonNull public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation();
+ method @NonNull public android.telephony.ims.stub.ImsUtImplBase getUt();
+ method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
+ method public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle);
+ method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo);
method public final void notifyVoiceMessageCountUpdate(int);
method public void onFeatureReady();
method public void onFeatureRemoved();
- method public boolean queryCapabilityConfiguration(int, int);
+ method public boolean queryCapabilityConfiguration(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
- method public void setUiTtyMode(int, android.os.Message);
- method public int shouldProcessCall(java.lang.String[]);
+ method public void setUiTtyMode(int, @Nullable android.os.Message);
+ method @android.telephony.ims.feature.MmTelFeature.ProcessCallResult public int shouldProcessCall(@NonNull String[]);
field public static final int PROCESS_CALL_CSFB = 1; // 0x1
field public static final int PROCESS_CALL_IMS = 0; // 0x0
}
public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities {
ctor public MmTelFeature.MmTelCapabilities();
- ctor public deprecated MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities);
+ ctor @Deprecated public MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities);
ctor public MmTelFeature.MmTelCapabilities(int);
- method public final void addCapabilities(int);
- method public final boolean isCapable(int);
- method public final void removeCapabilities(int);
+ method public final void addCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
+ method public final boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
+ method public final void removeCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
field public static final int CAPABILITY_TYPE_SMS = 8; // 0x8
field public static final int CAPABILITY_TYPE_UT = 4; // 0x4
field public static final int CAPABILITY_TYPE_VIDEO = 2; // 0x2
field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1
}
- public static abstract class MmTelFeature.MmTelCapabilities.MmTelCapability implements java.lang.annotation.Annotation {
+ @IntDef(flag=true, value={android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface MmTelFeature.MmTelCapabilities.MmTelCapability {
}
- public static abstract class MmTelFeature.ProcessCallResult implements java.lang.annotation.Annotation {
+ @IntDef(flag=true, value={android.telephony.ims.feature.MmTelFeature.PROCESS_CALL_IMS, android.telephony.ims.feature.MmTelFeature.PROCESS_CALL_CSFB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface MmTelFeature.ProcessCallResult {
}
public class RcsFeature extends android.telephony.ims.feature.ImsFeature {
@@ -7417,32 +8073,32 @@ package android.telephony.ims.stub {
ctor public ImsCallSessionImplBase();
method public void accept(int, android.telephony.ims.ImsStreamMediaProfile);
method public void close();
- method public void deflect(java.lang.String);
- method public void extendToConference(java.lang.String[]);
- method public java.lang.String getCallId();
+ method public void deflect(String);
+ method public void extendToConference(String[]);
+ method public String getCallId();
method public android.telephony.ims.ImsCallProfile getCallProfile();
method public android.telephony.ims.ImsVideoCallProvider getImsVideoCallProvider();
method public android.telephony.ims.ImsCallProfile getLocalCallProfile();
- method public java.lang.String getProperty(java.lang.String);
+ method public String getProperty(String);
method public android.telephony.ims.ImsCallProfile getRemoteCallProfile();
method public int getState();
method public void hold(android.telephony.ims.ImsStreamMediaProfile);
- method public void inviteParticipants(java.lang.String[]);
+ method public void inviteParticipants(String[]);
method public boolean isInCall();
method public boolean isMultiparty();
method public void merge();
method public void reject(int);
- method public void removeParticipants(java.lang.String[]);
+ method public void removeParticipants(String[]);
method public void resume(android.telephony.ims.ImsStreamMediaProfile);
method public void sendDtmf(char, android.os.Message);
- method public void sendRttMessage(java.lang.String);
+ method public void sendRttMessage(String);
method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile);
method public void sendRttModifyResponse(boolean);
- method public void sendUssd(java.lang.String);
+ method public void sendUssd(String);
method public void setListener(android.telephony.ims.ImsCallSessionListener);
method public void setMute(boolean);
- method public void start(java.lang.String, android.telephony.ims.ImsCallProfile);
- method public void startConference(java.lang.String[], android.telephony.ims.ImsCallProfile);
+ method public void start(String, android.telephony.ims.ImsCallProfile);
+ method public void startConference(String[], android.telephony.ims.ImsCallProfile);
method public void startDtmf(char);
method public void stopDtmf();
method public void terminate(int);
@@ -7452,7 +8108,7 @@ package android.telephony.ims.stub {
}
public static class ImsCallSessionImplBase.State {
- method public static java.lang.String toString(int);
+ method public static String toString(int);
field public static final int ESTABLISHED = 4; // 0x4
field public static final int ESTABLISHING = 3; // 0x3
field public static final int IDLE = 0; // 0x0
@@ -7468,11 +8124,11 @@ package android.telephony.ims.stub {
public class ImsConfigImplBase {
ctor public ImsConfigImplBase();
method public int getConfigInt(int);
- method public java.lang.String getConfigString(int);
+ method public String getConfigString(int);
method public final void notifyProvisionedValueChanged(int, int);
- method public final void notifyProvisionedValueChanged(int, java.lang.String);
+ method public final void notifyProvisionedValueChanged(int, String);
method public int setConfig(int, int);
- method public int setConfig(int, java.lang.String);
+ method public int setConfig(int, String);
field public static final int CONFIG_RESULT_FAILED = 1; // 0x1
field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0
field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff
@@ -7526,12 +8182,12 @@ package android.telephony.ims.stub {
ctor public ImsSmsImplBase();
method public void acknowledgeSms(int, int, int);
method public void acknowledgeSmsReport(int, int, int);
- method public java.lang.String getSmsFormat();
+ method public String getSmsFormat();
method public void onReady();
method public final void onSendSmsResult(int, int, int, int) throws java.lang.RuntimeException;
- method public final void onSmsReceived(int, java.lang.String, byte[]) throws java.lang.RuntimeException;
- method public final void onSmsStatusReportReceived(int, int, java.lang.String, byte[]) throws java.lang.RuntimeException;
- method public void sendSms(int, int, java.lang.String, java.lang.String, boolean, byte[]);
+ method public final void onSmsReceived(int, String, byte[]) throws java.lang.RuntimeException;
+ method public final void onSmsStatusReportReceived(int, int, String, byte[]) throws java.lang.RuntimeException;
+ method public void sendSms(int, int, String, String, boolean, byte[]);
field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2
field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3
field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4
@@ -7550,7 +8206,7 @@ package android.telephony.ims.stub {
method public int queryCFForServiceClass(int, java.lang.String, int);
method public int queryCallBarring(int);
method public int queryCallBarringForServiceClass(int, int);
- method public int queryCallForward(int, java.lang.String);
+ method public int queryCallForward(int, String);
method public int queryCallWaiting();
method public int queryClip();
method public int queryClir();
@@ -7558,9 +8214,9 @@ package android.telephony.ims.stub {
method public int queryColr();
method public void setListener(android.telephony.ims.ImsUtListener);
method public int transact(android.os.Bundle);
- method public int updateCallBarring(int, int, java.lang.String[]);
- method public int updateCallBarringForServiceClass(int, int, java.lang.String[], int);
- method public int updateCallForward(int, int, java.lang.String, int, int);
+ method public int updateCallBarring(int, int, String[]);
+ method public int updateCallBarringForServiceClass(int, int, String[], int);
+ method public int updateCallForward(int, int, String, int, int);
method public int updateCallWaiting(boolean, int);
method public int updateClip(boolean);
method public int updateClir(int);
@@ -7573,15 +8229,15 @@ package android.telephony.ims.stub {
package android.telephony.mbms {
public static class DownloadRequest.Builder {
- method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String);
}
public final class FileInfo implements android.os.Parcelable {
- ctor public FileInfo(android.net.Uri, java.lang.String);
+ ctor public FileInfo(android.net.Uri, String);
}
public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
- ctor public FileServiceInfo(java.util.Map<java.util.Locale, java.lang.String>, java.lang.String, java.util.List<java.util.Locale>, java.lang.String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
+ ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
}
public class MbmsDownloadReceiver extends android.content.BroadcastReceiver {
@@ -7595,7 +8251,7 @@ package android.telephony.mbms {
}
public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
- ctor public StreamingServiceInfo(java.util.Map<java.util.Locale, java.lang.String>, java.lang.String, java.util.List<java.util.Locale>, java.lang.String, java.util.Date, java.util.Date);
+ ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date);
}
public final class UriPathPair implements android.os.Parcelable {
@@ -7614,18 +8270,22 @@ package android.telephony.mbms.vendor {
ctor public MbmsDownloadServiceBase();
method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
+ method public android.os.IBinder asBinder();
method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
method public void dispose(int) throws android.os.RemoteException;
method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
+ method public static String getDefaultTransactionName(int);
+ method public String getTransactionName(int);
method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException;
- method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
+ method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
+ method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException;
method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
- method public int setTempFileRootDirectory(int, java.lang.String) throws android.os.RemoteException;
+ method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException;
}
public class MbmsGroupCallServiceBase extends android.app.Service {
@@ -7641,30 +8301,34 @@ package android.telephony.mbms.vendor {
public class MbmsStreamingServiceBase extends android.os.Binder {
ctor public MbmsStreamingServiceBase();
+ method public android.os.IBinder asBinder();
method public void dispose(int) throws android.os.RemoteException;
- method public android.net.Uri getPlaybackUri(int, java.lang.String) throws android.os.RemoteException;
+ method public static String getDefaultTransactionName(int);
+ method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException;
+ method public String getTransactionName(int);
method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
+ method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
- method public int startStreaming(int, java.lang.String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
- method public void stopStreaming(int, java.lang.String) throws android.os.RemoteException;
+ method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
+ method public void stopStreaming(int, String) throws android.os.RemoteException;
}
public class VendorUtils {
ctor public VendorUtils();
- method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, java.lang.String);
- field public static final java.lang.String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
- field public static final java.lang.String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
- field public static final java.lang.String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
- field public static final java.lang.String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
- field public static final java.lang.String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
- field public static final java.lang.String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
- field public static final java.lang.String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
- field public static final java.lang.String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
- field public static final java.lang.String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
- field public static final java.lang.String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
- field public static final java.lang.String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
- field public static final java.lang.String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
+ method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String);
+ field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
+ field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
+ field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
+ field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
+ field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
+ field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
+ field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
+ field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
+ field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
+ field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
+ field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
+ field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
}
}
@@ -7684,20 +8348,20 @@ package android.util {
package android.view {
public abstract class Window {
- method public void addSystemFlags(int);
+ method public void addSystemFlags(@android.view.WindowManager.LayoutParams.SystemFlags int);
}
- public abstract interface WindowManager implements android.view.ViewManager {
- method public abstract android.graphics.Region getCurrentImeTouchRegion();
+ public interface WindowManager extends android.view.ViewManager {
+ method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public android.graphics.Region getCurrentImeTouchRegion();
}
public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
method public final long getUserActivityTimeout();
method public final void setUserActivityTimeout(long);
- field public static final int SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 524288; // 0x80000
+ field @RequiresPermission(android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS) public static final int SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 524288; // 0x80000
}
- public static abstract class WindowManager.LayoutParams.SystemFlags implements java.lang.annotation.Annotation {
+ @IntDef(flag=true, prefix={"SYSTEM_FLAG_"}, value={android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowManager.LayoutParams.SystemFlags {
}
}
@@ -7706,7 +8370,7 @@ package android.view.accessibility {
public final class AccessibilityManager {
method public int getAccessibilityWindowId(android.os.IBinder);
- method public void performAccessibilityShortcut();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut();
}
}
@@ -7714,13 +8378,13 @@ package android.view.accessibility {
package android.view.contentcapture {
public final class ContentCaptureContext implements android.os.Parcelable {
- method public android.content.ComponentName getActivityComponent();
+ method @Nullable public android.content.ComponentName getActivityComponent();
method public int getDisplayId();
- method public android.os.Bundle getExtras();
+ method @Nullable public android.os.Bundle getExtras();
method public int getFlags();
- method public android.view.contentcapture.ContentCaptureSessionId getParentSessionId();
+ method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId();
method public int getTaskId();
- method public android.net.Uri getUri();
+ method @Nullable public android.net.Uri getUri();
field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1
field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2
}
@@ -7728,11 +8392,11 @@ package android.view.contentcapture {
public final class ContentCaptureEvent implements android.os.Parcelable {
method public int describeContents();
method public long getEventTime();
- method public int getFlags();
- method public android.view.autofill.AutofillId getId();
- method public java.lang.CharSequence getText();
+ method @Nullable public android.view.autofill.AutofillId getId();
+ method @Nullable public java.util.List<android.view.autofill.AutofillId> getIds();
+ method @Nullable public CharSequence getText();
method public int getType();
- method public android.view.contentcapture.ViewNode getViewNode();
+ method @Nullable public android.view.contentcapture.ViewNode getViewNode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureEvent> CREATOR;
field public static final int TYPE_VIEW_APPEARED = 1; // 0x1
@@ -7741,18 +8405,18 @@ package android.view.contentcapture {
}
public final class UserDataRemovalRequest implements android.os.Parcelable {
- method public java.lang.String getPackageName();
- method public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
+ method @NonNull public String getPackageName();
+ method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
method public boolean isForEverything();
}
public final class UserDataRemovalRequest.UriRequest {
- method public android.net.Uri getUri();
- method public boolean isRecursive();
+ method @NonNull public android.net.Uri getUri();
+ method @NonNull public boolean isRecursive();
}
public final class ViewNode extends android.app.assist.AssistStructure.ViewNode {
- method public android.view.autofill.AutofillId getParentAutofillId();
+ method @Nullable public android.view.autofill.AutofillId getParentAutofillId();
}
}
@@ -7761,8 +8425,8 @@ package android.webkit {
public abstract class CookieManager {
method protected abstract boolean allowFileSchemeCookiesImpl();
- method public abstract java.lang.String getCookie(java.lang.String, boolean);
- method public synchronized java.lang.String getCookie(android.net.WebAddress);
+ method public abstract String getCookie(String, boolean);
+ method public String getCookie(android.net.WebAddress);
method public abstract boolean hasCookies(boolean);
method protected abstract void setAcceptFileSchemeCookiesImpl(boolean);
}
@@ -7770,7 +8434,7 @@ package android.webkit {
public class FindActionModeCallback implements android.view.ActionMode.Callback android.text.TextWatcher android.view.View.OnClickListener android.webkit.WebView.FindListener {
ctor public FindActionModeCallback(android.content.Context);
method public void afterTextChanged(android.text.Editable);
- method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
+ method public void beforeTextChanged(CharSequence, int, int, int);
method public void findAll();
method public void finish();
method public int getActionModeGlobalBottom();
@@ -7780,9 +8444,9 @@ package android.webkit {
method public void onDestroyActionMode(android.view.ActionMode);
method public void onFindResultReceived(int, int, boolean);
method public boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
- method public void onTextChanged(java.lang.CharSequence, int, int, int);
- method public void setText(java.lang.String);
- method public void setWebView(android.webkit.WebView);
+ method public void onTextChanged(CharSequence, int, int, int);
+ method public void setText(String);
+ method public void setWebView(@NonNull android.webkit.WebView);
method public void showSoftInput();
method public void updateMatchCount(int, int, boolean);
}
@@ -7804,7 +8468,7 @@ package android.webkit {
}
public class JsDialogHelper {
- ctor public JsDialogHelper(android.webkit.JsPromptResult, int, java.lang.String, java.lang.String, java.lang.String);
+ ctor public JsDialogHelper(android.webkit.JsPromptResult, int, String, String, String);
ctor public JsDialogHelper(android.webkit.JsPromptResult, android.os.Message);
method public boolean invokeCallback(android.webkit.WebChromeClient, android.webkit.WebView);
method public void showDialog(android.content.Context);
@@ -7816,7 +8480,7 @@ package android.webkit {
public class JsPromptResult extends android.webkit.JsResult {
ctor public JsPromptResult(android.webkit.JsResult.ResultReceiver);
- method public java.lang.String getStringResult();
+ method public String getStringResult();
}
public class JsResult {
@@ -7824,28 +8488,28 @@ package android.webkit {
method public final boolean getResult();
}
- public static abstract interface JsResult.ResultReceiver {
- method public abstract void onJsResultComplete(android.webkit.JsResult);
+ public static interface JsResult.ResultReceiver {
+ method public void onJsResultComplete(android.webkit.JsResult);
}
public class SslErrorHandler extends android.os.Handler {
ctor public SslErrorHandler();
}
- public abstract deprecated class TokenBindingService {
- ctor public TokenBindingService();
+ @Deprecated public abstract class TokenBindingService {
+ ctor @Deprecated public TokenBindingService();
}
public class WebChromeClient {
- method public deprecated void openFileChooser(android.webkit.ValueCallback<android.net.Uri>, java.lang.String, java.lang.String);
+ method @Deprecated public void openFileChooser(android.webkit.ValueCallback<android.net.Uri>, String, String);
}
public abstract class WebHistoryItem implements java.lang.Cloneable {
- method public abstract deprecated int getId();
+ method @Deprecated public abstract int getId();
}
- public abstract deprecated class WebIconDatabase {
- method public abstract void bulkRequestIconForPageUrl(android.content.ContentResolver, java.lang.String, android.webkit.WebIconDatabase.IconListener);
+ @Deprecated public abstract class WebIconDatabase {
+ method @Deprecated public abstract void bulkRequestIconForPageUrl(android.content.ContentResolver, String, android.webkit.WebIconDatabase.IconListener);
}
public abstract class WebMessagePort {
@@ -7857,21 +8521,21 @@ package android.webkit {
}
public class WebResourceResponse {
- ctor public WebResourceResponse(boolean, java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream);
+ ctor public WebResourceResponse(boolean, String, String, int, String, java.util.Map<java.lang.String,java.lang.String>, java.io.InputStream);
}
public abstract class WebSettings {
method public abstract boolean getAcceptThirdPartyCookies();
- method public abstract deprecated boolean getNavDump();
- method public abstract deprecated boolean getPluginsEnabled();
- method public abstract deprecated boolean getUseWebViewBackgroundForOverscrollBackground();
- method public abstract deprecated int getUserAgent();
+ method @Deprecated public abstract boolean getNavDump();
+ method @Deprecated public abstract boolean getPluginsEnabled();
+ method @Deprecated public abstract boolean getUseWebViewBackgroundForOverscrollBackground();
+ method @Deprecated public abstract int getUserAgent();
method public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
method public abstract void setAcceptThirdPartyCookies(boolean);
- method public abstract deprecated void setNavDump(boolean);
- method public abstract deprecated void setPluginsEnabled(boolean);
- method public abstract deprecated void setUseWebViewBackgroundForOverscrollBackground(boolean);
- method public abstract deprecated void setUserAgent(int);
+ method @Deprecated public abstract void setNavDump(boolean);
+ method @Deprecated public abstract void setPluginsEnabled(boolean);
+ method @Deprecated public abstract void setUseWebViewBackgroundForOverscrollBackground(boolean);
+ method @Deprecated public abstract void setUserAgent(int);
method public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean);
}
@@ -7880,7 +8544,7 @@ package android.webkit {
}
public static class WebStorage.Origin {
- ctor protected WebStorage.Origin(java.lang.String, long, long);
+ ctor protected WebStorage.Origin(String, long, long);
}
public class WebView extends android.widget.AbsoluteLayout implements android.view.ViewGroup.OnHierarchyChangeListener android.view.ViewTreeObserver.OnGlobalFocusChangeListener {
@@ -7889,7 +8553,7 @@ package android.webkit {
public static class WebView.HitTestResult {
ctor public WebView.HitTestResult();
- method public void setExtra(java.lang.String);
+ method public void setExtra(String);
method public void setType(int);
}
@@ -7923,28 +8587,28 @@ package android.webkit {
public final class WebViewDelegate {
method public void addWebViewAssetPath(android.content.Context);
method public void callDrawGlFunction(android.graphics.Canvas, long);
- method public void callDrawGlFunction(android.graphics.Canvas, long, java.lang.Runnable);
+ method public void callDrawGlFunction(@NonNull android.graphics.Canvas, long, @Nullable Runnable);
method public boolean canInvokeDrawGlFunctor(android.view.View);
method public void detachDrawGlFunctor(android.view.View, long);
- method public void drawWebViewFunctor(android.graphics.Canvas, int);
+ method public void drawWebViewFunctor(@NonNull android.graphics.Canvas, int);
method public android.app.Application getApplication();
- method public java.lang.String getDataDirectorySuffix();
- method public java.lang.String getErrorString(android.content.Context, int);
- method public int getPackageId(android.content.res.Resources, java.lang.String);
+ method public String getDataDirectorySuffix();
+ method public String getErrorString(android.content.Context, int);
+ method public int getPackageId(android.content.res.Resources, String);
method public void invokeDrawGlFunctor(android.view.View, long, boolean);
method public boolean isMultiProcessEnabled();
method public boolean isTraceTagEnabled();
method public void setOnTraceEnabledChangeListener(android.webkit.WebViewDelegate.OnTraceEnabledChangeListener);
}
- public static abstract interface WebViewDelegate.OnTraceEnabledChangeListener {
- method public abstract void onTraceEnabledChange(boolean);
+ public static interface WebViewDelegate.OnTraceEnabledChangeListener {
+ method public void onTraceEnabledChange(boolean);
}
public final class WebViewFactory {
ctor public WebViewFactory();
method public static android.content.pm.PackageInfo getLoadedPackageInfo();
- method public static int loadWebViewNativeLibraryFromPackage(java.lang.String, java.lang.ClassLoader);
+ method public static int loadWebViewNativeLibraryFromPackage(String, ClassLoader);
method public static void prepareWebViewInZygote();
field public static final int LIBLOAD_ADDRESS_SPACE_NOT_RESERVED = 2; // 0x2
field public static final int LIBLOAD_FAILED_JNI_CALL = 7; // 0x7
@@ -7958,214 +8622,217 @@ package android.webkit {
field public static final int LIBLOAD_WRONG_PACKAGE_NAME = 1; // 0x1
}
- public abstract interface WebViewFactoryProvider {
- method public abstract android.webkit.WebViewProvider createWebView(android.webkit.WebView, android.webkit.WebView.PrivateAccess);
- method public abstract android.webkit.CookieManager getCookieManager();
- method public abstract android.webkit.GeolocationPermissions getGeolocationPermissions();
- method public abstract android.webkit.ServiceWorkerController getServiceWorkerController();
- method public abstract android.webkit.WebViewFactoryProvider.Statics getStatics();
- method public abstract deprecated android.webkit.TokenBindingService getTokenBindingService();
- method public abstract android.webkit.TracingController getTracingController();
- method public abstract android.webkit.WebIconDatabase getWebIconDatabase();
- method public abstract android.webkit.WebStorage getWebStorage();
- method public abstract java.lang.ClassLoader getWebViewClassLoader();
- method public abstract android.webkit.WebViewDatabase getWebViewDatabase(android.content.Context);
- }
-
- public static abstract interface WebViewFactoryProvider.Statics {
- method public abstract void clearClientCertPreferences(java.lang.Runnable);
- method public abstract void enableSlowWholeDocumentDraw();
- method public abstract java.lang.String findAddress(java.lang.String);
- method public abstract void freeMemoryForTests();
- method public abstract java.lang.String getDefaultUserAgent(android.content.Context);
- method public abstract android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
- method public abstract void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
- method public abstract android.net.Uri[] parseFileChooserResult(int, android.content.Intent);
- method public abstract void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
- method public abstract void setWebContentsDebuggingEnabled(boolean);
- }
-
- public abstract interface WebViewProvider {
- method public abstract void addJavascriptInterface(java.lang.Object, java.lang.String);
- method public abstract boolean canGoBack();
- method public abstract boolean canGoBackOrForward(int);
- method public abstract boolean canGoForward();
- method public abstract boolean canZoomIn();
- method public abstract boolean canZoomOut();
- method public abstract android.graphics.Picture capturePicture();
- method public abstract void clearCache(boolean);
- method public abstract void clearFormData();
- method public abstract void clearHistory();
- method public abstract void clearMatches();
- method public abstract void clearSslPreferences();
- method public abstract void clearView();
- method public abstract android.webkit.WebBackForwardList copyBackForwardList();
- method public abstract android.print.PrintDocumentAdapter createPrintDocumentAdapter(java.lang.String);
- method public abstract android.webkit.WebMessagePort[] createWebMessageChannel();
- method public abstract void destroy();
- method public abstract void documentHasImages(android.os.Message);
- method public abstract void dumpViewHierarchyWithProperties(java.io.BufferedWriter, int);
- method public abstract void evaluateJavaScript(java.lang.String, android.webkit.ValueCallback<java.lang.String>);
- method public abstract int findAll(java.lang.String);
- method public abstract void findAllAsync(java.lang.String);
- method public abstract android.view.View findHierarchyView(java.lang.String, int);
- method public abstract void findNext(boolean);
- method public abstract void flingScroll(int, int);
- method public abstract void freeMemory();
- method public abstract android.net.http.SslCertificate getCertificate();
- method public abstract int getContentHeight();
- method public abstract int getContentWidth();
- method public abstract android.graphics.Bitmap getFavicon();
- method public abstract android.webkit.WebView.HitTestResult getHitTestResult();
- method public abstract java.lang.String[] getHttpAuthUsernamePassword(java.lang.String, java.lang.String);
- method public abstract java.lang.String getOriginalUrl();
- method public abstract int getProgress();
- method public abstract boolean getRendererPriorityWaivedWhenNotVisible();
- method public abstract int getRendererRequestedPriority();
- method public abstract float getScale();
- method public abstract android.webkit.WebViewProvider.ScrollDelegate getScrollDelegate();
- method public abstract android.webkit.WebSettings getSettings();
- method public default android.view.textclassifier.TextClassifier getTextClassifier();
- method public abstract java.lang.String getTitle();
- method public abstract java.lang.String getTouchIconUrl();
- method public abstract java.lang.String getUrl();
- method public abstract android.webkit.WebViewProvider.ViewDelegate getViewDelegate();
- method public abstract int getVisibleTitleHeight();
- method public abstract android.webkit.WebChromeClient getWebChromeClient();
- method public abstract android.webkit.WebViewClient getWebViewClient();
- method public abstract android.view.View getZoomControls();
- method public abstract void goBack();
- method public abstract void goBackOrForward(int);
- method public abstract void goForward();
- method public abstract void init(java.util.Map<java.lang.String, java.lang.Object>, boolean);
- method public abstract void insertVisualStateCallback(long, android.webkit.WebView.VisualStateCallback);
- method public abstract void invokeZoomPicker();
- method public abstract boolean isPaused();
- method public abstract boolean isPrivateBrowsingEnabled();
- method public abstract void loadData(java.lang.String, java.lang.String, java.lang.String);
- method public abstract void loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public abstract void loadUrl(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
- method public abstract void loadUrl(java.lang.String);
- method public abstract void notifyFindDialogDismissed();
- method public abstract void onPause();
- method public abstract void onResume();
- method public abstract boolean overlayHorizontalScrollbar();
- method public abstract boolean overlayVerticalScrollbar();
- method public abstract boolean pageDown(boolean);
- method public abstract boolean pageUp(boolean);
- method public abstract void pauseTimers();
- method public abstract void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
- method public abstract void postUrl(java.lang.String, byte[]);
- method public abstract void reload();
- method public abstract void removeJavascriptInterface(java.lang.String);
- method public abstract void requestFocusNodeHref(android.os.Message);
- method public abstract void requestImageRef(android.os.Message);
- method public abstract boolean restorePicture(android.os.Bundle, java.io.File);
- method public abstract android.webkit.WebBackForwardList restoreState(android.os.Bundle);
- method public abstract void resumeTimers();
- method public abstract void savePassword(java.lang.String, java.lang.String, java.lang.String);
- method public abstract boolean savePicture(android.os.Bundle, java.io.File);
- method public abstract android.webkit.WebBackForwardList saveState(android.os.Bundle);
- method public abstract void saveWebArchive(java.lang.String);
- method public abstract void saveWebArchive(java.lang.String, boolean, android.webkit.ValueCallback<java.lang.String>);
- method public abstract void setCertificate(android.net.http.SslCertificate);
- method public abstract void setDownloadListener(android.webkit.DownloadListener);
- method public abstract void setFindListener(android.webkit.WebView.FindListener);
- method public abstract void setHorizontalScrollbarOverlay(boolean);
- method public abstract void setHttpAuthUsernamePassword(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- method public abstract void setInitialScale(int);
- method public abstract void setMapTrackballToArrowKeys(boolean);
- method public abstract void setNetworkAvailable(boolean);
- method public abstract void setPictureListener(android.webkit.WebView.PictureListener);
- method public abstract void setRendererPriorityPolicy(int, boolean);
- method public default void setTextClassifier(android.view.textclassifier.TextClassifier);
- method public abstract void setVerticalScrollbarOverlay(boolean);
- method public abstract void setWebChromeClient(android.webkit.WebChromeClient);
- method public abstract void setWebViewClient(android.webkit.WebViewClient);
- method public abstract boolean showFindDialog(java.lang.String, boolean);
- method public abstract void stopLoading();
- method public abstract boolean zoomBy(float);
- method public abstract boolean zoomIn();
- method public abstract boolean zoomOut();
- }
-
- public static abstract interface WebViewProvider.ScrollDelegate {
- method public abstract int computeHorizontalScrollOffset();
- method public abstract int computeHorizontalScrollRange();
- method public abstract void computeScroll();
- method public abstract int computeVerticalScrollExtent();
- method public abstract int computeVerticalScrollOffset();
- method public abstract int computeVerticalScrollRange();
- }
-
- public static abstract interface WebViewProvider.ViewDelegate {
+ public interface WebViewFactoryProvider {
+ method public android.webkit.WebViewProvider createWebView(android.webkit.WebView, android.webkit.WebView.PrivateAccess);
+ method public android.webkit.CookieManager getCookieManager();
+ method public android.webkit.GeolocationPermissions getGeolocationPermissions();
+ method public android.webkit.ServiceWorkerController getServiceWorkerController();
+ method public android.webkit.WebViewFactoryProvider.Statics getStatics();
+ method @Deprecated public android.webkit.TokenBindingService getTokenBindingService();
+ method public android.webkit.TracingController getTracingController();
+ method public android.webkit.WebIconDatabase getWebIconDatabase();
+ method public android.webkit.WebStorage getWebStorage();
+ method public ClassLoader getWebViewClassLoader();
+ method public android.webkit.WebViewDatabase getWebViewDatabase(android.content.Context);
+ }
+
+ public static interface WebViewFactoryProvider.Statics {
+ method public void clearClientCertPreferences(Runnable);
+ method public void enableSlowWholeDocumentDraw();
+ method public String findAddress(String);
+ method public void freeMemoryForTests();
+ method public String getDefaultUserAgent(android.content.Context);
+ method @NonNull public android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
+ method public void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public android.net.Uri[] parseFileChooserResult(int, android.content.Intent);
+ method public void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setWebContentsDebuggingEnabled(boolean);
+ }
+
+ public interface WebViewProvider {
+ method public void addJavascriptInterface(Object, String);
+ method public boolean canGoBack();
+ method public boolean canGoBackOrForward(int);
+ method public boolean canGoForward();
+ method public boolean canZoomIn();
+ method public boolean canZoomOut();
+ method public android.graphics.Picture capturePicture();
+ method public void clearCache(boolean);
+ method public void clearFormData();
+ method public void clearHistory();
+ method public void clearMatches();
+ method public void clearSslPreferences();
+ method public void clearView();
+ method public android.webkit.WebBackForwardList copyBackForwardList();
+ method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(String);
+ method public android.webkit.WebMessagePort[] createWebMessageChannel();
+ method public void destroy();
+ method public void documentHasImages(android.os.Message);
+ method public void dumpViewHierarchyWithProperties(java.io.BufferedWriter, int);
+ method public void evaluateJavaScript(String, android.webkit.ValueCallback<java.lang.String>);
+ method public int findAll(String);
+ method public void findAllAsync(String);
+ method public android.view.View findHierarchyView(String, int);
+ method public void findNext(boolean);
+ method public void flingScroll(int, int);
+ method public void freeMemory();
+ method public android.net.http.SslCertificate getCertificate();
+ method public int getContentHeight();
+ method public int getContentWidth();
+ method public android.graphics.Bitmap getFavicon();
+ method public android.webkit.WebView.HitTestResult getHitTestResult();
+ method public String[] getHttpAuthUsernamePassword(String, String);
+ method public String getOriginalUrl();
+ method public int getProgress();
+ method public boolean getRendererPriorityWaivedWhenNotVisible();
+ method public int getRendererRequestedPriority();
+ method public float getScale();
+ method public android.webkit.WebViewProvider.ScrollDelegate getScrollDelegate();
+ method public android.webkit.WebSettings getSettings();
+ method @NonNull public default android.view.textclassifier.TextClassifier getTextClassifier();
+ method public String getTitle();
+ method public String getTouchIconUrl();
+ method public String getUrl();
+ method public android.webkit.WebViewProvider.ViewDelegate getViewDelegate();
+ method public int getVisibleTitleHeight();
+ method public android.webkit.WebChromeClient getWebChromeClient();
+ method public android.webkit.WebViewClient getWebViewClient();
+ method public android.webkit.WebViewRenderer getWebViewRenderer();
+ method public android.webkit.WebViewRendererClient getWebViewRendererClient();
+ method public android.view.View getZoomControls();
+ method public void goBack();
+ method public void goBackOrForward(int);
+ method public void goForward();
+ method public void init(java.util.Map<java.lang.String,java.lang.Object>, boolean);
+ method public void insertVisualStateCallback(long, android.webkit.WebView.VisualStateCallback);
+ method public void invokeZoomPicker();
+ method public boolean isPaused();
+ method public boolean isPrivateBrowsingEnabled();
+ method public void loadData(String, String, String);
+ method public void loadDataWithBaseURL(String, String, String, String, String);
+ method public void loadUrl(String, java.util.Map<java.lang.String,java.lang.String>);
+ method public void loadUrl(String);
+ method public void notifyFindDialogDismissed();
+ method public void onPause();
+ method public void onResume();
+ method public boolean overlayHorizontalScrollbar();
+ method public boolean overlayVerticalScrollbar();
+ method public boolean pageDown(boolean);
+ method public boolean pageUp(boolean);
+ method public void pauseTimers();
+ method public void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
+ method public void postUrl(String, byte[]);
+ method public void reload();
+ method public void removeJavascriptInterface(String);
+ method public void requestFocusNodeHref(android.os.Message);
+ method public void requestImageRef(android.os.Message);
+ method public boolean restorePicture(android.os.Bundle, java.io.File);
+ method public android.webkit.WebBackForwardList restoreState(android.os.Bundle);
+ method public void resumeTimers();
+ method public void savePassword(String, String, String);
+ method public boolean savePicture(android.os.Bundle, java.io.File);
+ method public android.webkit.WebBackForwardList saveState(android.os.Bundle);
+ method public void saveWebArchive(String);
+ method public void saveWebArchive(String, boolean, android.webkit.ValueCallback<java.lang.String>);
+ method public void setCertificate(android.net.http.SslCertificate);
+ method public void setDownloadListener(android.webkit.DownloadListener);
+ method public void setFindListener(android.webkit.WebView.FindListener);
+ method public void setHorizontalScrollbarOverlay(boolean);
+ method public void setHttpAuthUsernamePassword(String, String, String, String);
+ method public void setInitialScale(int);
+ method public void setMapTrackballToArrowKeys(boolean);
+ method public void setNetworkAvailable(boolean);
+ method public void setPictureListener(android.webkit.WebView.PictureListener);
+ method public void setRendererPriorityPolicy(int, boolean);
+ method public default void setTextClassifier(@Nullable android.view.textclassifier.TextClassifier);
+ method public void setVerticalScrollbarOverlay(boolean);
+ method public void setWebChromeClient(android.webkit.WebChromeClient);
+ method public void setWebViewClient(android.webkit.WebViewClient);
+ method public void setWebViewRendererClient(@Nullable java.util.concurrent.Executor, @Nullable android.webkit.WebViewRendererClient);
+ method public boolean showFindDialog(String, boolean);
+ method public void stopLoading();
+ method public boolean zoomBy(float);
+ method public boolean zoomIn();
+ method public boolean zoomOut();
+ }
+
+ public static interface WebViewProvider.ScrollDelegate {
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public void computeScroll();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ }
+
+ public static interface WebViewProvider.ViewDelegate {
method public default void autofill(android.util.SparseArray<android.view.autofill.AutofillValue>);
- method public abstract boolean dispatchKeyEvent(android.view.KeyEvent);
- method public abstract android.view.View findFocus(android.view.View);
- method public abstract android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
- method public abstract android.os.Handler getHandler(android.os.Handler);
+ method public boolean dispatchKeyEvent(android.view.KeyEvent);
+ method public android.view.View findFocus(android.view.View);
+ method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
+ method public android.os.Handler getHandler(android.os.Handler);
method public default boolean isVisibleToUserForAutofill(int);
- method public abstract void onActivityResult(int, int, android.content.Intent);
- method public abstract void onAttachedToWindow();
+ method public void onActivityResult(int, int, android.content.Intent);
+ method public void onAttachedToWindow();
method public default boolean onCheckIsTextEditor();
- method public abstract void onConfigurationChanged(android.content.res.Configuration);
- method public abstract android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
- method public abstract void onDetachedFromWindow();
- method public abstract boolean onDragEvent(android.view.DragEvent);
- method public abstract void onDraw(android.graphics.Canvas);
- method public abstract void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
- method public abstract void onFinishTemporaryDetach();
- method public abstract void onFocusChanged(boolean, int, android.graphics.Rect);
- method public abstract boolean onGenericMotionEvent(android.view.MotionEvent);
- method public abstract boolean onHoverEvent(android.view.MotionEvent);
- method public abstract void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public abstract void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
- method public abstract boolean onKeyDown(int, android.view.KeyEvent);
- method public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
- method public abstract boolean onKeyUp(int, android.view.KeyEvent);
- method public abstract void onMeasure(int, int);
+ method public void onConfigurationChanged(android.content.res.Configuration);
+ method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
+ method public void onDetachedFromWindow();
+ method public boolean onDragEvent(android.view.DragEvent);
+ method public void onDraw(android.graphics.Canvas);
+ method public void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
+ method public void onFinishTemporaryDetach();
+ method public void onFocusChanged(boolean, int, android.graphics.Rect);
+ method public boolean onGenericMotionEvent(android.view.MotionEvent);
+ method public boolean onHoverEvent(android.view.MotionEvent);
+ method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public void onMeasure(int, int);
method public default void onMovedToDisplay(int, android.content.res.Configuration);
- method public abstract void onOverScrolled(int, int, boolean, boolean);
+ method public void onOverScrolled(int, int, boolean, boolean);
method public default void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
method public default void onProvideContentCaptureStructure(android.view.ViewStructure, int);
- method public abstract void onProvideVirtualStructure(android.view.ViewStructure);
- method public abstract void onScrollChanged(int, int, int, int);
- method public abstract void onSizeChanged(int, int, int, int);
- method public abstract void onStartTemporaryDetach();
- method public abstract boolean onTouchEvent(android.view.MotionEvent);
- method public abstract boolean onTrackballEvent(android.view.MotionEvent);
- method public abstract void onVisibilityChanged(android.view.View, int);
- method public abstract void onWindowFocusChanged(boolean);
- method public abstract void onWindowVisibilityChanged(int);
- method public abstract boolean performAccessibilityAction(int, android.os.Bundle);
- method public abstract boolean performLongClick();
- method public abstract void preDispatchDraw(android.graphics.Canvas);
- method public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- method public abstract boolean requestFocus(int, android.graphics.Rect);
- method public abstract void setBackgroundColor(int);
- method public abstract boolean setFrame(int, int, int, int);
- method public abstract void setLayerType(int, android.graphics.Paint);
- method public abstract void setLayoutParams(android.view.ViewGroup.LayoutParams);
- method public abstract void setOverScrollMode(int);
- method public abstract void setScrollBarStyle(int);
- method public abstract boolean shouldDelayChildPressedState();
+ method public void onProvideVirtualStructure(android.view.ViewStructure);
+ method public void onScrollChanged(int, int, int, int);
+ method public void onSizeChanged(int, int, int, int);
+ method public void onStartTemporaryDetach();
+ method public boolean onTouchEvent(android.view.MotionEvent);
+ method public boolean onTrackballEvent(android.view.MotionEvent);
+ method public void onVisibilityChanged(android.view.View, int);
+ method public void onWindowFocusChanged(boolean);
+ method public void onWindowVisibilityChanged(int);
+ method public boolean performAccessibilityAction(int, android.os.Bundle);
+ method public boolean performLongClick();
+ method public void preDispatchDraw(android.graphics.Canvas);
+ method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
+ method public boolean requestFocus(int, android.graphics.Rect);
+ method public void setBackgroundColor(int);
+ method public boolean setFrame(int, int, int, int);
+ method public void setLayerType(int, android.graphics.Paint);
+ method public void setLayoutParams(android.view.ViewGroup.LayoutParams);
+ method public void setOverScrollMode(int);
+ method public void setScrollBarStyle(int);
+ method public boolean shouldDelayChildPressedState();
}
public final class WebViewProviderInfo implements android.os.Parcelable {
- ctor public WebViewProviderInfo(java.lang.String, java.lang.String, boolean, boolean, java.lang.String[]);
+ ctor public WebViewProviderInfo(String, String, boolean, boolean, String[]);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.webkit.WebViewProviderInfo> CREATOR;
field public final boolean availableByDefault;
- field public final java.lang.String description;
+ field public final String description;
field public final boolean isFallback;
- field public final java.lang.String packageName;
+ field public final String packageName;
field public final android.content.pm.Signature[] signatures;
}
public final class WebViewUpdateService {
method public static android.webkit.WebViewProviderInfo[] getAllWebViewPackages();
- method public static java.lang.String getCurrentWebViewPackageName();
+ method public static String getCurrentWebViewPackageName();
method public static android.webkit.WebViewProviderInfo[] getValidWebViewPackages();
}
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 4beb69920e28..22a3fb39d2f6 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -1,11 +1,20 @@
+// Signature format: 2.0
+package android {
+
+ public static final class Manifest.permission {
+ field public static final String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
+ }
+
+}
+
package android.app {
public class Notification implements android.os.Parcelable {
- method public static java.lang.Class<? extends android.app.Notification.Style> getNotificationStyleClass(java.lang.String);
+ method public static Class<? extends android.app.Notification.Style> getNotificationStyleClass(String);
}
public static final class Notification.TvExtender implements android.app.Notification.Extender {
- method public deprecated java.lang.String getChannel();
+ method @Deprecated public String getChannel();
}
}
@@ -13,8 +22,8 @@ package android.app {
package android.app.admin {
public class DevicePolicyManager {
- method public deprecated java.lang.String getDeviceInitializerApp();
- method public deprecated android.content.ComponentName getDeviceInitializerComponent();
+ method @Deprecated @Nullable public String getDeviceInitializerApp();
+ method @Deprecated @Nullable public android.content.ComponentName getDeviceInitializerComponent();
}
}
@@ -22,31 +31,31 @@ package android.app.admin {
package android.content {
public class Intent implements java.lang.Cloneable android.os.Parcelable {
- field public static final deprecated java.lang.String ACTION_DEVICE_INITIALIZATION_WIZARD = "android.intent.action.DEVICE_INITIALIZATION_WIZARD";
- field public static final deprecated java.lang.String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
- field public static final deprecated java.lang.String ACTION_SERVICE_STATE = "android.intent.action.SERVICE_STATE";
- field public static final deprecated java.lang.String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR = "cdmaDefaultRoamingIndicator";
- field public static final deprecated java.lang.String EXTRA_CDMA_ROAMING_INDICATOR = "cdmaRoamingIndicator";
- field public static final deprecated java.lang.String EXTRA_CSS_INDICATOR = "cssIndicator";
- field public static final deprecated java.lang.String EXTRA_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
- field public static final deprecated java.lang.String EXTRA_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
- field public static final deprecated java.lang.String EXTRA_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
- field public static final deprecated java.lang.String EXTRA_DATA_RADIO_TECH = "dataRadioTechnology";
- field public static final deprecated java.lang.String EXTRA_DATA_REG_STATE = "dataRegState";
- field public static final deprecated java.lang.String EXTRA_DATA_ROAMING_TYPE = "dataRoamingType";
- field public static final deprecated java.lang.String EXTRA_EMERGENCY_ONLY = "emergencyOnly";
- field public static final deprecated java.lang.String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION = "isDataRoamingFromRegistration";
- field public static final deprecated java.lang.String EXTRA_IS_USING_CARRIER_AGGREGATION = "isUsingCarrierAggregation";
- field public static final deprecated java.lang.String EXTRA_LTE_EARFCN_RSRP_BOOST = "LteEarfcnRsrpBoost";
- field public static final deprecated java.lang.String EXTRA_MANUAL = "manual";
- field public static final deprecated java.lang.String EXTRA_NETWORK_ID = "networkId";
- field public static final deprecated java.lang.String EXTRA_OPERATOR_ALPHA_LONG = "operator-alpha-long";
- field public static final deprecated java.lang.String EXTRA_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
- field public static final deprecated java.lang.String EXTRA_OPERATOR_NUMERIC = "operator-numeric";
- field public static final deprecated java.lang.String EXTRA_SYSTEM_ID = "systemId";
- field public static final deprecated java.lang.String EXTRA_VOICE_RADIO_TECH = "radioTechnology";
- field public static final deprecated java.lang.String EXTRA_VOICE_REG_STATE = "voiceRegState";
- field public static final deprecated java.lang.String EXTRA_VOICE_ROAMING_TYPE = "voiceRoamingType";
+ field @Deprecated public static final String ACTION_DEVICE_INITIALIZATION_WIZARD = "android.intent.action.DEVICE_INITIALIZATION_WIZARD";
+ field @Deprecated public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
+ field @Deprecated public static final String ACTION_SERVICE_STATE = "android.intent.action.SERVICE_STATE";
+ field @Deprecated public static final String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR = "cdmaDefaultRoamingIndicator";
+ field @Deprecated public static final String EXTRA_CDMA_ROAMING_INDICATOR = "cdmaRoamingIndicator";
+ field @Deprecated public static final String EXTRA_CSS_INDICATOR = "cssIndicator";
+ field @Deprecated public static final String EXTRA_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
+ field @Deprecated public static final String EXTRA_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
+ field @Deprecated public static final String EXTRA_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
+ field @Deprecated public static final String EXTRA_DATA_RADIO_TECH = "dataRadioTechnology";
+ field @Deprecated public static final String EXTRA_DATA_REG_STATE = "dataRegState";
+ field @Deprecated public static final String EXTRA_DATA_ROAMING_TYPE = "dataRoamingType";
+ field @Deprecated public static final String EXTRA_EMERGENCY_ONLY = "emergencyOnly";
+ field @Deprecated public static final String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION = "isDataRoamingFromRegistration";
+ field @Deprecated public static final String EXTRA_IS_USING_CARRIER_AGGREGATION = "isUsingCarrierAggregation";
+ field @Deprecated public static final String EXTRA_LTE_EARFCN_RSRP_BOOST = "LteEarfcnRsrpBoost";
+ field @Deprecated public static final String EXTRA_MANUAL = "manual";
+ field @Deprecated public static final String EXTRA_NETWORK_ID = "networkId";
+ field @Deprecated public static final String EXTRA_OPERATOR_ALPHA_LONG = "operator-alpha-long";
+ field @Deprecated public static final String EXTRA_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
+ field @Deprecated public static final String EXTRA_OPERATOR_NUMERIC = "operator-numeric";
+ field @Deprecated public static final String EXTRA_SYSTEM_ID = "systemId";
+ field @Deprecated public static final String EXTRA_VOICE_RADIO_TECH = "radioTechnology";
+ field @Deprecated public static final String EXTRA_VOICE_REG_STATE = "voiceRegState";
+ field @Deprecated public static final String EXTRA_VOICE_ROAMING_TYPE = "voiceRoamingType";
}
}
@@ -54,7 +63,7 @@ package android.content {
package android.media.tv {
public final class TvInputManager {
- method public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputManager.HardwareCallback, android.media.tv.TvInputInfo);
+ method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputManager.HardwareCallback, android.media.tv.TvInputInfo);
}
public static final class TvInputManager.Hardware {
@@ -65,7 +74,7 @@ package android.media.tv {
package android.net.wifi {
- public deprecated class BatchedScanResult implements android.os.Parcelable {
+ @Deprecated public class BatchedScanResult implements android.os.Parcelable {
ctor public BatchedScanResult();
ctor public BatchedScanResult(android.net.wifi.BatchedScanResult);
field public final java.util.List<android.net.wifi.ScanResult> scanResults;
@@ -85,8 +94,8 @@ package android.os {
}
public final class PowerManager {
- method public deprecated boolean isScreenBrightnessBoosted();
- field public static final deprecated java.lang.String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
+ method @Deprecated public boolean isScreenBrightnessBoosted();
+ field @Deprecated public static final String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
}
}
@@ -95,10 +104,10 @@ package android.service.notification {
public abstract class NotificationListenerService extends android.app.Service {
method public android.service.notification.StatusBarNotification[] getActiveNotifications(int);
- method public android.service.notification.StatusBarNotification[] getActiveNotifications(java.lang.String[], int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(String[], int);
method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException;
method public final void setOnNotificationPostedTrim(int);
- method public final void snoozeNotification(java.lang.String, java.lang.String);
+ method public final void snoozeNotification(String, String);
method public void unregisterAsSystemService() throws android.os.RemoteException;
field public static final int TRIM_FULL = 0; // 0x0
field public static final int TRIM_LIGHT = 1; // 0x1
@@ -114,9 +123,9 @@ package android.service.notification {
package android.telephony {
public class TelephonyManager {
- method public deprecated void answerRingingCall();
- method public deprecated boolean endCall();
- method public deprecated void silenceRinger();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void answerRingingCall();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public boolean endCall();
+ method @Deprecated public void silenceRinger();
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 1401cbb4211e..b82975857f7a 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1,16 +1,17 @@
+// Signature format: 2.0
package android {
public static final class Manifest.permission {
- field public static final java.lang.String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
- field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
- field public static final java.lang.String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
- field public static final java.lang.String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
- field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
- field public static final java.lang.String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
- field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
- field public static final java.lang.String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
- field public static final java.lang.String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
- field public static final java.lang.String WRITE_OBB = "android.permission.WRITE_OBB";
+ field public static final String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
+ field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
+ field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
+ field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
+ field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
+ field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
+ field public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
+ field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
+ field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
+ field public static final String WRITE_OBB = "android.permission.WRITE_OBB";
}
}
@@ -28,21 +29,22 @@ package android.app {
public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
method public void onMovedToDisplay(int, android.content.res.Configuration);
+ method public void setInheritShowWhenLocked(boolean);
}
public class ActivityManager {
- method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
- method public void forceStopPackage(java.lang.String);
- method public int getPackageImportance(java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String);
method public long getTotalRam();
- method public int getUidImportance(int);
- method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
- method public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
+ method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
}
- public static abstract interface ActivityManager.OnUidImportanceListener {
- method public abstract void onUidImportance(int, int);
+ public static interface ActivityManager.OnUidImportanceListener {
+ method public void onUidImportance(int, int);
}
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
@@ -50,7 +52,7 @@ package android.app {
}
public static class ActivityManager.TaskDescription implements android.os.Parcelable {
- method public java.lang.String getIconFilename();
+ method public String getIconFilename();
method public int getIconResource();
}
@@ -62,21 +64,21 @@ package android.app {
}
public class ActivityTaskManager {
- method public void clearLaunchParamsForPackages(java.util.List<java.lang.String>);
- method public java.lang.String listAllStacks();
- method public void moveTaskToStack(int, int, boolean);
- method public boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
- method public void removeStacksInWindowingModes(int[]) throws java.lang.SecurityException;
- method public void removeStacksWithActivityTypes(int[]) throws java.lang.SecurityException;
- method public void resizeDockedStack(android.graphics.Rect, android.graphics.Rect);
- method public void resizeStack(int, android.graphics.Rect) throws java.lang.SecurityException;
- method public void resizeStack(int, android.graphics.Rect, boolean);
- method public void resizeTask(int, android.graphics.Rect);
- method public void setDisplayToSingleTaskInstance(int);
- method public void setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
- method public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) throws java.lang.SecurityException;
- method public void startSystemLockTaskMode(int);
- method public void stopSystemLockTaskMode();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void clearLaunchParamsForPackages(java.util.List<java.lang.String>);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public String listAllStacks();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void moveTaskToStack(int, int, boolean);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void removeStacksInWindowingModes(int[]) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void removeStacksWithActivityTypes(int[]) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void resizeDockedStack(android.graphics.Rect, android.graphics.Rect);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void resizeStack(int, android.graphics.Rect) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void resizeStack(int, android.graphics.Rect, boolean);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void resizeTask(int, android.graphics.Rect);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void setDisplayToSingleTaskInstance(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void startSystemLockTaskMode(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void stopSystemLockTaskMode();
method public static boolean supportsMultiWindow(android.content.Context);
method public static boolean supportsSplitScreenMultiWindow(android.content.Context);
field public static final int INVALID_STACK_ID = -1; // 0xffffffff
@@ -89,66 +91,81 @@ package android.app {
}
public class AppOpsManager {
- method public java.util.List<android.app.AppOpsManager.HistoricalPackageOps> getAllHistoricPackagesOps(java.lang.String[], long, long);
- method public android.app.AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int, java.lang.String, java.lang.String[], long, long);
+ method @RequiresPermission("android.permission.MANAGE_APPOPS") public void addHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOps);
+ method @RequiresPermission("android.permission.MANAGE_APPOPS") public void clearHistory();
+ method @RequiresPermission("android.permission.GET_APP_OPS_STATS") public void getHistoricalOps(int, @Nullable String, @Nullable String[], long, long, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>);
+ method @RequiresPermission("android.permission.GET_APP_OPS_STATS") public void getHistoricalOpsFromDiskRaw(int, @Nullable String, @Nullable String[], long, long, @Nullable java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>);
method public static int getNumOps();
- method public static java.lang.String[] getOpStrs();
- method public boolean isOperationActive(int, int, java.lang.String);
- method public static java.lang.String opToPermission(int);
- method public static int permissionToOpCode(java.lang.String);
- method public void setMode(int, int, java.lang.String, int);
- method public void setUidMode(java.lang.String, int, int);
- method public void startWatchingActive(int[], android.app.AppOpsManager.OnOpActiveChangedListener);
- method public void stopWatchingActive(android.app.AppOpsManager.OnOpActiveChangedListener);
- method public static int strOpToOp(java.lang.String);
- field public static final java.lang.String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
- field public static final java.lang.String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
- field public static final java.lang.String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
- field public static final java.lang.String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot";
- field public static final java.lang.String OPSTR_ASSIST_STRUCTURE = "android:assist_structure";
- field public static final java.lang.String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume";
- field public static final java.lang.String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume";
- field public static final java.lang.String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume";
- field public static final java.lang.String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume";
- field public static final java.lang.String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume";
- field public static final java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
- field public static final java.lang.String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
- field public static final java.lang.String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
- field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
- field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
- field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
- field public static final java.lang.String OPSTR_GPS = "android:gps";
- field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
- field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
- field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
- field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
- field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
- field public static final java.lang.String OPSTR_POST_NOTIFICATION = "android:post_notification";
- field public static final java.lang.String OPSTR_PROJECT_MEDIA = "android:project_media";
- field public static final java.lang.String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
- field public static final java.lang.String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
- field public static final java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
- field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
- field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
- field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
- field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
- field public static final java.lang.String OPSTR_START_FOREGROUND = "android:start_foreground";
- field public static final java.lang.String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
- field public static final java.lang.String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
- field public static final java.lang.String OPSTR_TOAST_WINDOW = "android:toast_window";
- field public static final java.lang.String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on";
- field public static final java.lang.String OPSTR_VIBRATE = "android:vibrate";
- field public static final java.lang.String OPSTR_WAKE_LOCK = "android:wake_lock";
- field public static final java.lang.String OPSTR_WIFI_SCAN = "android:wifi_scan";
- field public static final java.lang.String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard";
- field public static final java.lang.String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
- field public static final java.lang.String OPSTR_WRITE_SMS = "android:write_sms";
- field public static final java.lang.String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
+ method public static String[] getOpStrs();
+ method public boolean isOperationActive(int, int, String);
+ method @RequiresPermission("android.permission.MANAGE_APPOPS") public void offsetHistory(long);
+ method public static String opToPermission(int);
+ method public static int permissionToOpCode(String);
+ method @RequiresPermission("android.permission.MANAGE_APPOPS") public void resetHistoryParameters();
+ method @RequiresPermission("android.permission.MANAGE_APPOPS") public void setHistoryParameters(int, long, int);
+ method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(int, int, String, int);
+ method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(String, int, int);
+ method public void startWatchingActive(@NonNull int[], @NonNull android.app.AppOpsManager.OnOpActiveChangedListener);
+ method public void stopWatchingActive(@NonNull android.app.AppOpsManager.OnOpActiveChangedListener);
+ method public static int strOpToOp(String);
+ field public static final int HISTORICAL_MODE_DISABLED = 0; // 0x0
+ field public static final int HISTORICAL_MODE_ENABLED_ACTIVE = 1; // 0x1
+ field public static final int HISTORICAL_MODE_ENABLED_PASSIVE = 2; // 0x2
+ field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
+ field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
+ field public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
+ field public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot";
+ field public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure";
+ field public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume";
+ field public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume";
+ field public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume";
+ field public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume";
+ field public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume";
+ field public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
+ field public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
+ field public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
+ field public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
+ field public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
+ field public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts";
+ field public static final String OPSTR_GPS = "android:gps";
+ field public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
+ field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
+ field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
+ field public static final String OPSTR_PLAY_AUDIO = "android:play_audio";
+ field public static final String OPSTR_POST_NOTIFICATION = "android:post_notification";
+ field public static final String OPSTR_PROJECT_MEDIA = "android:project_media";
+ field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
+ field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
+ field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
+ field public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
+ field public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
+ field public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
+ field public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
+ field public static final String OPSTR_START_FOREGROUND = "android:start_foreground";
+ field public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
+ field public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
+ field public static final String OPSTR_TOAST_WINDOW = "android:toast_window";
+ field public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on";
+ field public static final String OPSTR_VIBRATE = "android:vibrate";
+ field public static final String OPSTR_WAKE_LOCK = "android:wake_lock";
+ field public static final String OPSTR_WIFI_SCAN = "android:wifi_scan";
+ field public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard";
+ field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
+ field public static final String OPSTR_WRITE_SMS = "android:write_sms";
+ field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
+ field public static final int OP_COARSE_LOCATION = 0; // 0x0
field public static final int OP_RECORD_AUDIO = 27; // 0x1b
field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
+ field public static final int UID_STATE_BACKGROUND = 4; // 0x4
+ field public static final int UID_STATE_CACHED = 5; // 0x5
+ field public static final int UID_STATE_FOREGROUND = 3; // 0x3
+ field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
+ field public static final int UID_STATE_PERSISTENT = 0; // 0x0
+ field public static final int UID_STATE_TOP = 1; // 0x1
}
- public static final class AppOpsManager.HistoricalOpEntry implements android.os.Parcelable {
+ public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable {
method public int describeContents();
method public long getAccessCount(int);
method public long getAccessDuration(int);
@@ -158,25 +175,55 @@ package android.app {
method public long getForegroundAccessCount();
method public long getForegroundAccessDuration();
method public long getForegroundRejectCount();
- method public java.lang.String getOp();
+ method @NonNull public String getOpName();
method public long getRejectCount(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOpEntry> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable {
+ ctor public AppOpsManager.HistoricalOps(long, long);
+ method public int describeContents();
+ method public long getBeginTimeMillis();
+ method public long getEndTimeMillis();
+ method public int getUidCount();
+ method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int);
+ method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(int);
+ method public void increaseAccessCount(int, int, @NonNull String, int, long);
+ method public void increaseAccessDuration(int, int, @NonNull String, int, long);
+ method public void increaseRejectCount(int, int, @NonNull String, int, long);
+ method public void offsetBeginAndEndTime(long);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR;
}
public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable {
method public int describeContents();
- method public android.app.AppOpsManager.HistoricalOpEntry getEntry(java.lang.String);
- method public android.app.AppOpsManager.HistoricalOpEntry getEntryAt(int);
- method public int getEntryCount();
- method public java.lang.String getPackageName();
+ method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String);
+ method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(int);
+ method public int getOpCount();
+ method @NonNull public String getPackageName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalUidOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getPackageCount();
+ method @Nullable public android.app.AppOpsManager.HistoricalPackageOps getPackageOps(@NonNull String);
+ method @NonNull public android.app.AppOpsManager.HistoricalPackageOps getPackageOpsAt(int);
method public int getUid();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalUidOps> CREATOR;
+ }
+
+ public static interface AppOpsManager.OnOpActiveChangedListener {
+ method public void onOpActiveChanged(int, int, String, boolean);
}
- public static abstract interface AppOpsManager.OnOpActiveChangedListener {
- method public abstract void onOpActiveChanged(int, int, java.lang.String, boolean);
+ public final class NotificationChannel implements android.os.Parcelable {
+ method public boolean isImportanceLockedByOEM();
+ method public void setImportanceLockedByOEM(boolean);
}
public final class NotificationChannelGroup implements android.os.Parcelable {
@@ -201,9 +248,9 @@ package android.app {
public final class UiAutomation {
method public void destroy();
- method public android.os.ParcelFileDescriptor[] executeShellCommandRw(java.lang.String);
- method public deprecated boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public deprecated boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public android.os.ParcelFileDescriptor[] executeShellCommandRw(String);
+ method @Deprecated public boolean grantRuntimePermission(String, String, android.os.UserHandle);
+ method @Deprecated public boolean revokeRuntimePermission(String, String, android.os.UserHandle);
}
public class UiModeManager {
@@ -211,7 +258,7 @@ package android.app {
method public boolean isUiModeLocked();
}
- public class WindowConfiguration implements java.lang.Comparable android.os.Parcelable {
+ public class WindowConfiguration implements java.lang.Comparable<android.app.WindowConfiguration> android.os.Parcelable {
ctor public WindowConfiguration();
method public int compareTo(android.app.WindowConfiguration);
method public int describeContents();
@@ -247,17 +294,17 @@ package android.app {
package android.app.admin {
public class DevicePolicyManager {
- method public java.lang.CharSequence getDeviceOwnerOrganizationName();
+ method @Nullable public CharSequence getDeviceOwnerOrganizationName();
method public long getLastBugReportRequestTime();
method public long getLastNetworkLogRetrievalTime();
method public long getLastSecurityLogRetrievalTime();
- method public java.util.List<java.lang.String> getOwnerInstalledCaCerts(android.os.UserHandle);
+ method public java.util.List<java.lang.String> getOwnerInstalledCaCerts(@NonNull android.os.UserHandle);
method public boolean isCurrentInputMethodSetByOwner();
method public boolean isDeviceManaged();
- field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
- field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
- field public static final java.lang.String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED";
- field public static final java.lang.String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
+ field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
+ field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
+ field public static final String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED";
+ field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
}
public static final class SecurityLog.SecurityEvent implements android.os.Parcelable {
@@ -269,10 +316,10 @@ package android.app.admin {
package android.app.backup {
public class BackupManager {
- method public android.content.Intent getConfigurationIntent(java.lang.String);
- method public android.content.Intent getDataManagementIntent(java.lang.String);
- method public java.lang.String getDataManagementLabel(java.lang.String);
- method public java.lang.String getDestinationString(java.lang.String);
+ method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getConfigurationIntent(String);
+ method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getDataManagementIntent(String);
+ method @RequiresPermission("android.permission.BACKUP") public String getDataManagementLabel(String);
+ method @RequiresPermission("android.permission.BACKUP") public String getDestinationString(String);
}
}
@@ -280,16 +327,16 @@ package android.app.backup {
package android.app.role {
public final class RoleManager {
- method public void addRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public void clearRoleHoldersAsUser(java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public java.util.List<java.lang.String> getRoleHolders(java.lang.String);
- method public java.util.List<java.lang.String> getRoleHoldersAsUser(java.lang.String, android.os.UserHandle);
- method public void removeRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
+ method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void clearRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
+ method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
+ method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
}
- public abstract interface RoleManagerCallback {
- method public abstract void onFailure();
- method public abstract void onSuccess();
+ public interface RoleManagerCallback {
+ method public void onFailure();
+ method public void onSuccess();
}
}
@@ -301,8 +348,8 @@ package android.app.usage {
}
public class StorageStatsManager {
- method public boolean isQuotaSupported(java.util.UUID);
- method public boolean isReservedSupported(java.util.UUID);
+ method public boolean isQuotaSupported(@NonNull java.util.UUID);
+ method public boolean isReservedSupported(@NonNull java.util.UUID);
}
}
@@ -318,15 +365,15 @@ package android.bluetooth {
package android.content {
public class ContentProviderClient implements java.lang.AutoCloseable android.content.ContentInterface {
- method public void setDetectNotResponding(long);
+ method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long);
}
public abstract class ContentResolver implements android.content.ContentInterface {
- method public static java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
+ method public static String[] getSyncAdapterPackagesForAuthorityAsUser(String, int);
}
public abstract class Context {
- method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createPackageContextAsUser(String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.os.UserHandle getUser();
method public int getUserId();
method public void setAutofillCompatibilityEnabled(boolean);
@@ -354,31 +401,33 @@ package android.content.pm {
public abstract class PackageManager {
method public abstract boolean arePermissionsIndividuallyControlled();
- method public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
- method public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
+ method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract String getDefaultBrowserPackageNameAsUser(int);
+ method public abstract int getInstallReason(String, @NonNull android.os.UserHandle);
method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
- method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
- method public abstract java.lang.String[] getNamesForUids(int[]);
- method public abstract java.lang.String getPermissionControllerPackageName();
- method public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
- method public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
- method public java.lang.String getWellbeingPackageName();
- method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- field public static final java.lang.String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
- field public static final java.lang.String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
+ method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
+ method @Nullable public abstract String[] getNamesForUids(int[]);
+ method public abstract String getPermissionControllerPackageName();
+ method @NonNull public abstract String getServicesSystemSharedLibraryPackageName();
+ method @NonNull public abstract String getSharedSystemSharedLibraryPackageName();
+ method public String getWellbeingPackageName();
+ method @RequiresPermission("android.permission.GRANT_RUNTIME_PERMISSIONS") public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
+ method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
+ field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
+ field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000
- field public static final java.lang.String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
- field public static final java.lang.String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
+ field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
+ field public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
+ field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000
field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000
+ field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000
field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000
- field public java.lang.String backgroundPermission;
+ field public String backgroundPermission;
}
public final class ShortcutInfo implements android.os.Parcelable {
@@ -393,7 +442,8 @@ package android.content.pm {
package android.content.res {
- public final class Configuration implements java.lang.Comparable android.os.Parcelable {
+ public final class Configuration implements java.lang.Comparable<android.content.res.Configuration> android.os.Parcelable {
+ field public int assetsSeq;
field public final android.app.WindowConfiguration windowConfiguration;
}
@@ -406,14 +456,14 @@ package android.database.sqlite {
}
public final class SQLiteDebug {
- method public static void dump(android.util.Printer, java.lang.String[]);
+ method public static void dump(android.util.Printer, String[]);
method public static android.database.sqlite.SQLiteDebug.PagerStats getDatabaseInfo();
}
public static class SQLiteDebug.DbStats {
- ctor public SQLiteDebug.DbStats(java.lang.String, long, long, int, int, int, int);
- field public java.lang.String cache;
- field public java.lang.String dbName;
+ ctor public SQLiteDebug.DbStats(String, long, long, int, int, int, int);
+ field public String cache;
+ field public String dbName;
field public long dbSize;
field public int lookaside;
field public long pageSize;
@@ -428,23 +478,23 @@ package android.database.sqlite {
}
public final class SQLiteDirectCursorDriver implements android.database.sqlite.SQLiteCursorDriver {
- ctor public SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String, android.os.CancellationSignal);
+ ctor public SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal);
method public void cursorClosed();
method public void cursorDeactivated();
method public void cursorRequeried(android.database.Cursor);
- method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String[]);
- method public void setBindArguments(java.lang.String[]);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]);
+ method public void setBindArguments(String[]);
}
public final class SQLiteGlobal {
- method public static java.lang.String getDefaultJournalMode();
+ method public static String getDefaultJournalMode();
method public static int getDefaultPageSize();
- method public static java.lang.String getDefaultSyncMode();
+ method public static String getDefaultSyncMode();
method public static int getIdleConnectionTimeout();
method public static int getJournalSizeLimit();
method public static int getWALAutoCheckpoint();
method public static int getWALConnectionPoolSize();
- method public static java.lang.String getWALSyncMode();
+ method public static String getWALSyncMode();
method public static boolean isCompatibilityWalSupported();
method public static int releaseMemory();
}
@@ -453,8 +503,19 @@ package android.database.sqlite {
package android.graphics {
+ public final class Bitmap implements android.os.Parcelable {
+ method public void eraseColor(@ColorLong long);
+ }
+
public final class ImageDecoder implements java.lang.AutoCloseable {
- method public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int);
+ method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int);
+ }
+
+ public class Paint {
+ method @ColorLong public long getColorLong();
+ method @ColorLong public long getShadowLayerColorLong();
+ method public void setColor(@ColorLong long);
+ method public void setShadowLayer(float, float, float, @ColorLong long);
}
}
@@ -475,7 +536,7 @@ package android.graphics.drawable {
}
public class ShapeDrawable extends android.graphics.drawable.Drawable {
- method public void setXfermode(android.graphics.Xfermode);
+ method public void setXfermode(@Nullable android.graphics.Xfermode);
}
}
@@ -483,7 +544,7 @@ package android.graphics.drawable {
package android.hardware.camera2 {
public abstract class CameraDevice implements java.lang.AutoCloseable {
- method public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
field public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // 0x1
field public static final int SESSION_OPERATION_MODE_NORMAL = 0; // 0x0
field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000
@@ -515,31 +576,45 @@ package android.hardware.display {
field public final long[] luxTimestamps;
field public final float[] luxValues;
field public final boolean nightMode;
- field public final java.lang.String packageName;
+ field public final String packageName;
field public final float powerBrightnessFactor;
field public final long timeStamp;
}
public final class BrightnessConfiguration implements android.os.Parcelable {
method public int describeContents();
- method public android.util.Pair<float[], float[]> getCurve();
+ method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int);
+ method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(String);
+ method public android.util.Pair<float[],float[]> getCurve();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
}
public static class BrightnessConfiguration.Builder {
ctor public BrightnessConfiguration.Builder(float[], float[]);
+ method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, android.hardware.display.BrightnessCorrection);
+ method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(String, android.hardware.display.BrightnessCorrection);
method public android.hardware.display.BrightnessConfiguration build();
- method public android.hardware.display.BrightnessConfiguration.Builder setDescription(java.lang.String);
+ method public int getMaxCorrectionsByCategory();
+ method public int getMaxCorrectionsByPackageName();
+ method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
+ }
+
+ public final class BrightnessCorrection implements android.os.Parcelable {
+ method public float apply(float);
+ method @NonNull public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR;
}
public final class DisplayManager {
- method public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
- method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
- method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
- method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
+ method @RequiresPermission("android.permission.ACCESS_AMBIENT_LIGHT_STATS") public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
+ method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
+ method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
+ method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
method public android.graphics.Point getStableDisplaySize();
- method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
+ method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
}
}
@@ -572,21 +647,23 @@ package android.location {
ctor public GnssMeasurement();
method public void reset();
method public void resetAutomaticGainControlLevel();
- method public deprecated void resetCarrierCycles();
+ method @Deprecated public void resetCarrierCycles();
method public void resetCarrierFrequencyHz();
- method public deprecated void resetCarrierPhase();
- method public deprecated void resetCarrierPhaseUncertainty();
+ method @Deprecated public void resetCarrierPhase();
+ method @Deprecated public void resetCarrierPhaseUncertainty();
+ method public void resetCodeType();
method public void resetSnrInDb();
method public void set(android.location.GnssMeasurement);
method public void setAccumulatedDeltaRangeMeters(double);
method public void setAccumulatedDeltaRangeState(int);
method public void setAccumulatedDeltaRangeUncertaintyMeters(double);
method public void setAutomaticGainControlLevelInDb(double);
- method public deprecated void setCarrierCycles(long);
+ method @Deprecated public void setCarrierCycles(long);
method public void setCarrierFrequencyHz(float);
- method public deprecated void setCarrierPhase(double);
- method public deprecated void setCarrierPhaseUncertainty(double);
+ method @Deprecated public void setCarrierPhase(double);
+ method @Deprecated public void setCarrierPhaseUncertainty(double);
method public void setCn0DbHz(double);
+ method public void setCodeType(int);
method public void setConstellationType(int);
method public void setMultipathIndicator(int);
method public void setPseudorangeRateMetersPerSecond(double);
@@ -621,7 +698,7 @@ package android.location {
}
public class LocationManager {
- method public java.lang.String[] getBackgroundThrottlingWhitelist();
+ method public String[] getBackgroundThrottlingWhitelist();
}
}
@@ -629,7 +706,7 @@ package android.location {
package android.media {
public final class AudioFocusRequest {
- method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+ method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
}
public final class AudioFormat implements android.os.Parcelable {
@@ -640,8 +717,8 @@ package android.media {
}
public final class AudioRecordingConfiguration implements android.os.Parcelable {
- ctor public AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, java.lang.String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]);
- ctor public AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, java.lang.String);
+ ctor public 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[]);
+ ctor public AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String);
}
public final class BufferingParams implements android.os.Parcelable {
@@ -666,7 +743,7 @@ package android.media {
}
public static final class VolumeShaper.Configuration.Builder {
- method public android.media.VolumeShaper.Configuration.Builder setOptionFlags(int);
+ method @NonNull public android.media.VolumeShaper.Configuration.Builder setOptionFlags(int);
}
}
@@ -695,23 +772,52 @@ package android.media.audiofx {
field public static final java.util.UUID EFFECT_TYPE_NULL;
}
- public static abstract interface AudioEffect.OnParameterChangeListener {
- method public abstract void onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]);
+ public static interface AudioEffect.OnParameterChangeListener {
+ method public void onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]);
}
}
package android.net {
+ public class CaptivePortal implements android.os.Parcelable {
+ field public static final int APP_RETURN_DISMISSED = 0; // 0x0
+ field public static final int APP_RETURN_UNWANTED = 1; // 0x1
+ field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2
+ }
+
+ public class ConnectivityManager {
+ field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
+ field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
+ }
+
public final class IpSecManager {
field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0
}
+ public class LinkAddress implements android.os.Parcelable {
+ method public boolean isGlobalPreferred();
+ method public boolean isIPv4();
+ method public boolean isIPv6();
+ method public boolean isSameAddressAs(android.net.LinkAddress);
+ }
+
+ public class Network implements android.os.Parcelable {
+ method public android.net.Network getPrivateDnsBypassingCopy();
+ }
+
public final class NetworkCapabilities implements android.os.Parcelable {
method public int[] getCapabilities();
method public int[] getTransportTypes();
}
+ public final class RouteInfo implements android.os.Parcelable {
+ method public int getType();
+ field public static final int RTN_THROW = 9; // 0x9
+ field public static final int RTN_UNICAST = 1; // 0x1
+ field public static final int RTN_UNREACHABLE = 7; // 0x7
+ }
+
public class TrafficStats {
method public static long getLoopbackRxBytes();
method public static long getLoopbackRxPackets();
@@ -724,7 +830,7 @@ package android.net {
package android.os {
public class Build {
- method public static boolean is64BitAbi(java.lang.String);
+ method public static boolean is64BitAbi(String);
}
public static class Build.VERSION {
@@ -733,8 +839,8 @@ package android.os {
}
public class DeviceIdleManager {
- method public java.lang.String[] getSystemPowerWhitelist();
- method public java.lang.String[] getSystemPowerWhitelistExceptIdle();
+ method @NonNull public String[] getSystemPowerWhitelist();
+ method @NonNull public String[] getSystemPowerWhitelistExceptIdle();
}
public class Environment {
@@ -743,8 +849,136 @@ package android.os {
method public static java.io.File getStorageDirectory();
}
+ public abstract class HwBinder implements android.os.IHwBinder {
+ ctor public HwBinder();
+ method public static final void configureRpcThreadpool(long, boolean);
+ method public static void enableInstrumentation();
+ method public static final android.os.IHwBinder getService(String, String) throws java.util.NoSuchElementException, android.os.RemoteException;
+ method public static final android.os.IHwBinder getService(String, String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException;
+ method public static final void joinRpcThreadpool();
+ method public abstract void onTransact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
+ method public final void registerService(String) throws android.os.RemoteException;
+ method public final void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
+ }
+
+ public class HwBlob {
+ ctor public HwBlob(int);
+ method public final void copyToBoolArray(long, boolean[], int);
+ method public final void copyToDoubleArray(long, double[], int);
+ method public final void copyToFloatArray(long, float[], int);
+ method public final void copyToInt16Array(long, short[], int);
+ method public final void copyToInt32Array(long, int[], int);
+ method public final void copyToInt64Array(long, long[], int);
+ method public final void copyToInt8Array(long, byte[], int);
+ method public final boolean getBool(long);
+ method public final double getDouble(long);
+ method public final float getFloat(long);
+ method public final short getInt16(long);
+ method public final int getInt32(long);
+ method public final long getInt64(long);
+ method public final byte getInt8(long);
+ method public final String getString(long);
+ method public final long handle();
+ method public final void putBlob(long, android.os.HwBlob);
+ method public final void putBool(long, boolean);
+ method public final void putBoolArray(long, boolean[]);
+ method public final void putDouble(long, double);
+ method public final void putDoubleArray(long, double[]);
+ method public final void putFloat(long, float);
+ method public final void putFloatArray(long, float[]);
+ method public final void putInt16(long, short);
+ method public final void putInt16Array(long, short[]);
+ method public final void putInt32(long, int);
+ method public final void putInt32Array(long, int[]);
+ method public final void putInt64(long, long);
+ method public final void putInt64Array(long, long[]);
+ method public final void putInt8(long, byte);
+ method public final void putInt8Array(long, byte[]);
+ method public final void putNativeHandle(long, android.os.NativeHandle);
+ method public final void putString(long, String);
+ method public static Boolean[] wrapArray(@NonNull boolean[]);
+ method public static Long[] wrapArray(@NonNull long[]);
+ method public static Byte[] wrapArray(@NonNull byte[]);
+ method public static Short[] wrapArray(@NonNull short[]);
+ method public static Integer[] wrapArray(@NonNull int[]);
+ method public static Float[] wrapArray(@NonNull float[]);
+ method public static Double[] wrapArray(@NonNull double[]);
+ }
+
+ public class HwParcel {
+ ctor public HwParcel();
+ method public final void enforceInterface(String);
+ method public final boolean readBool();
+ method public final java.util.ArrayList<java.lang.Boolean> readBoolVector();
+ method public final android.os.HwBlob readBuffer(long);
+ method public final double readDouble();
+ method public final java.util.ArrayList<java.lang.Double> readDoubleVector();
+ method public final android.os.HwBlob readEmbeddedBuffer(long, long, long, boolean);
+ method public final android.os.NativeHandle readEmbeddedNativeHandle(long, long);
+ method public final float readFloat();
+ method public final java.util.ArrayList<java.lang.Float> readFloatVector();
+ method public final short readInt16();
+ method public final java.util.ArrayList<java.lang.Short> readInt16Vector();
+ method public final int readInt32();
+ method public final java.util.ArrayList<java.lang.Integer> readInt32Vector();
+ method public final long readInt64();
+ method public final java.util.ArrayList<java.lang.Long> readInt64Vector();
+ method public final byte readInt8();
+ method public final java.util.ArrayList<java.lang.Byte> readInt8Vector();
+ method public final android.os.NativeHandle readNativeHandle();
+ method public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector();
+ method public final String readString();
+ method public final java.util.ArrayList<java.lang.String> readStringVector();
+ method public final android.os.IHwBinder readStrongBinder();
+ method public final void release();
+ method public final void releaseTemporaryStorage();
+ method public final void send();
+ method public final void verifySuccess();
+ method public final void writeBool(boolean);
+ method public final void writeBoolVector(java.util.ArrayList<java.lang.Boolean>);
+ method public final void writeBuffer(android.os.HwBlob);
+ method public final void writeDouble(double);
+ method public final void writeDoubleVector(java.util.ArrayList<java.lang.Double>);
+ method public final void writeFloat(float);
+ method public final void writeFloatVector(java.util.ArrayList<java.lang.Float>);
+ method public final void writeInt16(short);
+ method public final void writeInt16Vector(java.util.ArrayList<java.lang.Short>);
+ method public final void writeInt32(int);
+ method public final void writeInt32Vector(java.util.ArrayList<java.lang.Integer>);
+ method public final void writeInt64(long);
+ method public final void writeInt64Vector(java.util.ArrayList<java.lang.Long>);
+ method public final void writeInt8(byte);
+ method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>);
+ method public final void writeInterfaceToken(String);
+ method public final void writeNativeHandle(android.os.NativeHandle);
+ method public final void writeNativeHandleVector(java.util.ArrayList<android.os.NativeHandle>);
+ method public final void writeStatus(int);
+ method public final void writeString(String);
+ method public final void writeStringVector(java.util.ArrayList<java.lang.String>);
+ method public final void writeStrongBinder(android.os.IHwBinder);
+ field public static final int STATUS_SUCCESS = 0; // 0x0
+ }
+
+ @IntDef(prefix={"STATUS_"}, value={android.os.HwParcel.STATUS_SUCCESS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface HwParcel.Status {
+ }
+
+ public interface IHwBinder {
+ method public boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long);
+ method public android.os.IHwInterface queryLocalInterface(String);
+ method public void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
+ method public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient);
+ }
+
+ public static interface IHwBinder.DeathRecipient {
+ method public void serviceDied(long);
+ }
+
+ public interface IHwInterface {
+ method public android.os.IHwBinder asBinder();
+ }
+
public class IncidentManager {
- method public void reportIncident(android.os.IncidentReportArgs);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
}
public final class IncidentReportArgs implements android.os.Parcelable {
@@ -768,29 +1002,46 @@ package android.os {
method public void removeSyncBarrier(int);
}
+ public final class NativeHandle implements java.io.Closeable {
+ ctor public NativeHandle();
+ ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean);
+ ctor public NativeHandle(@NonNull java.io.FileDescriptor[], @NonNull int[], boolean);
+ method public void close() throws java.io.IOException;
+ method public android.os.NativeHandle dup() throws java.io.IOException;
+ method public java.io.FileDescriptor getFileDescriptor();
+ method public java.io.FileDescriptor[] getFileDescriptors();
+ method public int[] getInts();
+ method public boolean hasSingleFileDescriptor();
+ }
+
public final class PowerManager {
- method public int getPowerSaveMode();
- method public boolean setDynamicPowerSavings(boolean, int);
- method public boolean setPowerSaveMode(boolean);
+ method @RequiresPermission("android.permission.POWER_SAVER") public int getPowerSaveMode();
+ method @RequiresPermission("android.permission.POWER_SAVER") public boolean setDynamicPowerSavings(boolean, int);
+ method @RequiresPermission(anyOf={"android.permission.DEVICE_POWER", "android.permission.POWER_SAVER"}) public boolean setPowerSaveMode(boolean);
field public static final int POWER_SAVER_MODE_DYNAMIC = 1; // 0x1
field public static final int POWER_SAVER_MODE_PERCENTAGE = 0; // 0x0
}
public class Process {
method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException;
+ field public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000; // 0x15f90
+ field public static final int FIRST_ISOLATED_UID = 99000; // 0x182b8
+ field public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999; // 0x182b7
+ field public static final int LAST_ISOLATED_UID = 99999; // 0x1869f
+ field public static final int NUM_UIDS_PER_APP_ZYGOTE = 100; // 0x64
}
public final class RemoteCallback implements android.os.Parcelable {
ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener);
- ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener, android.os.Handler);
+ ctor public RemoteCallback(@NonNull android.os.RemoteCallback.OnResultListener, @Nullable android.os.Handler);
method public int describeContents();
- method public void sendResult(android.os.Bundle);
+ method public void sendResult(@Nullable android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.RemoteCallback> CREATOR;
}
- public static abstract interface RemoteCallback.OnResultListener {
- method public abstract void onResult(android.os.Bundle);
+ public static interface RemoteCallback.OnResultListener {
+ method public void onResult(android.os.Bundle);
}
public final class StrictMode {
@@ -806,28 +1057,28 @@ package android.os {
ctor public StrictMode.ViolationInfo(android.os.Parcel);
ctor public StrictMode.ViolationInfo(android.os.Parcel, boolean);
method public int describeContents();
- method public void dump(android.util.Printer, java.lang.String);
- method public java.lang.String getStackTrace();
- method public java.lang.Class<? extends android.os.strictmode.Violation> getViolationClass();
- method public java.lang.String getViolationDetails();
+ method public void dump(android.util.Printer, String);
+ method public String getStackTrace();
+ method public Class<? extends android.os.strictmode.Violation> getViolationClass();
+ method public String getViolationDetails();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.StrictMode.ViolationInfo> CREATOR;
- field public java.lang.String broadcastIntentAction;
+ field public String broadcastIntentAction;
field public int durationMillis;
field public int numAnimationsRunning;
field public long numInstances;
- field public java.lang.String[] tags;
+ field public String[] tags;
field public int violationNumThisLoop;
field public long violationUptimeMillis;
}
- public static abstract interface StrictMode.ViolationLogger {
- method public abstract void log(android.os.StrictMode.ViolationInfo);
+ public static interface StrictMode.ViolationLogger {
+ method public void log(android.os.StrictMode.ViolationInfo);
}
public class SystemProperties {
- method public static java.lang.String get(java.lang.String);
- method public static java.lang.String get(java.lang.String, java.lang.String);
+ method @NonNull public static String get(@NonNull String);
+ method @NonNull public static String get(@NonNull String, @Nullable String);
}
public final class UserHandle implements android.os.Parcelable {
@@ -841,13 +1092,13 @@ package android.os {
public class UserManager {
method public static boolean isSplitSystemUser();
- field public static final java.lang.String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
+ field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
}
public abstract class VibrationEffect implements android.os.Parcelable {
method public static android.os.VibrationEffect get(int);
method public static android.os.VibrationEffect get(int, boolean);
- method public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
+ method @Nullable public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
method public abstract long getDuration();
method protected static int scale(int, float, int);
field public static final int EFFECT_CLICK = 0; // 0x0
@@ -899,14 +1150,32 @@ package android.os {
field public static final android.os.Parcelable.Creator<android.os.VibrationEffect.Waveform> CREATOR;
}
+ public class VintfObject {
+ method public static String[] getHalNamesAndVersions();
+ method public static String getSepolicyVersion();
+ method public static Long getTargetFrameworkCompatibilityMatrixVersion();
+ method public static java.util.Map<java.lang.String,java.lang.String[]> getVndkSnapshots();
+ method public static String[] report();
+ }
+
+ public class VintfRuntimeInfo {
+ method public static String getCpuInfo();
+ method public static String getHardwareId();
+ method public static String getKernelVersion();
+ method public static String getNodeName();
+ method public static String getOsName();
+ method public static String getOsRelease();
+ method public static String getOsVersion();
+ }
+
public class WorkSource implements android.os.Parcelable {
ctor public WorkSource(int);
method public boolean add(int);
- method public boolean add(int, java.lang.String);
- method public deprecated android.os.WorkSource addReturningNewbs(android.os.WorkSource);
+ method public boolean add(int, String);
+ method @Deprecated public android.os.WorkSource addReturningNewbs(android.os.WorkSource);
method public int get(int);
- method public java.lang.String getName(int);
- method public deprecated android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
+ method public String getName(int);
+ method @Deprecated public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
method public int size();
}
@@ -930,12 +1199,13 @@ package android.os.health {
field public static final int UNKNOWN_KEY = 0; // 0x0
}
- public static abstract class HealthKeys.Constant implements java.lang.annotation.Annotation {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD}) public static @interface HealthKeys.Constant {
+ method public abstract int type();
}
public static class HealthKeys.Constants {
- ctor public HealthKeys.Constants(java.lang.Class);
- method public java.lang.String getDataType();
+ ctor public HealthKeys.Constants(Class);
+ method public String getDataType();
method public int getIndex(int, int);
method public int[] getKeys(int);
method public int getSize(int);
@@ -957,10 +1227,10 @@ package android.os.health {
public class HealthStatsWriter {
ctor public HealthStatsWriter(android.os.health.HealthKeys.Constants);
method public void addMeasurement(int, long);
- method public void addMeasurements(int, java.lang.String, long);
- method public void addStats(int, java.lang.String, android.os.health.HealthStatsWriter);
+ method public void addMeasurements(int, String, long);
+ method public void addStats(int, String, android.os.health.HealthStatsWriter);
method public void addTimer(int, int, long);
- method public void addTimers(int, java.lang.String, android.os.health.TimerStat);
+ method public void addTimers(int, String, android.os.health.TimerStat);
method public void flattenToParcel(android.os.Parcel);
}
@@ -973,7 +1243,7 @@ package android.os.storage {
}
public final class StorageVolume implements android.os.Parcelable {
- method public java.lang.String getPath();
+ method public String getPath();
}
}
@@ -985,15 +1255,30 @@ package android.os.strictmode {
}
+package android.permission {
+
+ public final class PermissionControllerManager {
+ method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
+ field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2
+ field public static final int REASON_MALWARE = 1; // 0x1
+ }
+
+ public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback {
+ ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback();
+ method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
+ }
+
+}
+
package android.print {
public final class PrintJobInfo implements android.os.Parcelable {
method public float getProgress();
- method public java.lang.CharSequence getStatus(android.content.pm.PackageManager);
+ method @Nullable public CharSequence getStatus(@NonNull android.content.pm.PackageManager);
}
public final class PrinterInfo implements android.os.Parcelable {
- method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
+ method @Nullable public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.Context);
}
}
@@ -1009,50 +1294,65 @@ package android.provider {
}
public final class MediaStore {
- method public static void deleteContributedMedia(android.content.Context, java.lang.String, android.os.UserHandle) throws java.io.IOException;
- method public static long getContributedMediaSize(android.content.Context, java.lang.String, android.os.UserHandle) throws java.io.IOException;
+ method @RequiresPermission("android.permission.CLEAR_APP_USER_DATA") public static void deleteContributedMedia(android.content.Context, String, android.os.UserHandle) throws java.io.IOException;
+ method @RequiresPermission("android.permission.CLEAR_APP_USER_DATA") public static long getContributedMediaSize(android.content.Context, String, android.os.UserHandle) throws java.io.IOException;
}
public final class Settings {
- field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
+ field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
- field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
- field public static final java.lang.String AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS = "autofill_smart_suggestion_emulation_flags";
- field public static final java.lang.String AUTOMATIC_POWER_SAVER_MODE = "automatic_power_saver_mode";
- field public static final java.lang.String DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD = "dynamic_power_savings_disable_threshold";
- field public static final java.lang.String DYNAMIC_POWER_SAVINGS_ENABLED = "dynamic_power_savings_enabled";
- field public static final java.lang.String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
- field public static final java.lang.String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
- field public static final java.lang.String LOW_POWER_MODE = "low_power";
- field public static final java.lang.String LOW_POWER_MODE_STICKY = "low_power_sticky";
- field public static final java.lang.String SMS_ACCESS_RESTRICTION_ENABLED = "sms_access_restriction_enabled";
- field public static final java.lang.String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
+ field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
+ field public static final String AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS = "autofill_smart_suggestion_emulation_flags";
+ field public static final String AUTOMATIC_POWER_SAVER_MODE = "automatic_power_saver_mode";
+ field public static final String CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS = "captive_portal_fallback_probe_specs";
+ field public static final String CAPTIVE_PORTAL_FALLBACK_URL = "captive_portal_fallback_url";
+ field public static final String CAPTIVE_PORTAL_HTTPS_URL = "captive_portal_https_url";
+ field public static final String CAPTIVE_PORTAL_HTTP_URL = "captive_portal_http_url";
+ field public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode";
+ field public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; // 0x2
+ field public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; // 0x0
+ field public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; // 0x1
+ field public static final String CAPTIVE_PORTAL_OTHER_FALLBACK_URLS = "captive_portal_other_fallback_urls";
+ field public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent";
+ field public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https";
+ field public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = "data_stall_consecutive_dns_timeout_threshold";
+ field public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type";
+ field public static final String DATA_STALL_MIN_EVALUATE_INTERVAL = "data_stall_min_evaluate_interval";
+ field public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD = "data_stall_valid_dns_time_threshold";
+ field public static final String DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD = "dynamic_power_savings_disable_threshold";
+ field public static final String DYNAMIC_POWER_SAVINGS_ENABLED = "dynamic_power_savings_enabled";
+ field public static final String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
+ field public static final String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
+ field public static final String LOW_POWER_MODE = "low_power";
+ field public static final String LOW_POWER_MODE_STICKY = "low_power_sticky";
+ field public static final String SMS_ACCESS_RESTRICTION_ENABLED = "sms_access_restriction_enabled";
+ field public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
}
public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
- method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
- field public static final java.lang.String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled";
- field public static final java.lang.String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service";
- field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
- field public static final java.lang.String AUTOFILL_SERVICE = "autofill_service";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
- field public static final java.lang.String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
- field public static final java.lang.String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
- field public static final java.lang.String DISABLED_PRINT_SERVICES = "disabled_print_services";
- field public static final deprecated java.lang.String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
- field public static final java.lang.String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
- field public static final java.lang.String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
- field public static final java.lang.String SYNC_PARENT_SOUNDS = "sync_parent_sounds";
- field public static final java.lang.String USER_SETUP_COMPLETE = "user_setup_complete";
- field public static final java.lang.String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String);
+ field public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled";
+ field public static final String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service";
+ field public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
+ field public static final String AUTOFILL_SERVICE = "autofill_service";
+ field public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
+ field public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
+ field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
+ field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
+ field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
+ field public static final String DISABLED_PRINT_SERVICES = "disabled_print_services";
+ field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
+ field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
+ field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
+ field @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds";
+ field public static final String USER_SETUP_COMPLETE = "user_setup_complete";
+ field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
}
public static final class Telephony.Sms.Intents {
- field public static final java.lang.String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION";
+ field public static final String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION";
}
}
@@ -1060,7 +1360,7 @@ package android.provider {
package android.security {
public class KeyStoreException extends java.lang.Exception {
- ctor public KeyStoreException(int, java.lang.String);
+ ctor public KeyStoreException(int, String);
method public int getErrorCode();
}
@@ -1069,19 +1369,19 @@ package android.security {
package android.security.keystore {
public abstract class AttestationUtils {
- method public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, int[], byte[]) throws android.security.keystore.DeviceIdAttestationException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
field public static final int ID_TYPE_IMEI = 2; // 0x2
field public static final int ID_TYPE_MEID = 3; // 0x3
field public static final int ID_TYPE_SERIAL = 1; // 0x1
}
public class DeviceIdAttestationException extends java.lang.Exception {
- ctor public DeviceIdAttestationException(java.lang.String);
- ctor public DeviceIdAttestationException(java.lang.String, java.lang.Throwable);
+ ctor public DeviceIdAttestationException(String);
+ ctor public DeviceIdAttestationException(String, Throwable);
}
public static final class KeyGenParameterSpec.Builder {
- method public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean);
+ method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean);
}
public final class KeyProtection implements java.security.KeyStore.ProtectionParameter {
@@ -1098,41 +1398,41 @@ package android.service.autofill {
public abstract class AutofillFieldClassificationService extends android.app.Service {
method public android.os.IBinder onBind(android.content.Intent);
- field public static final java.lang.String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE";
- field public static final java.lang.String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH";
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService";
- field public static final java.lang.String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms";
- field public static final java.lang.String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm";
+ field public static final String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE";
+ field public static final String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH";
+ field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService";
+ field public static final String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms";
+ field public static final String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm";
}
public final class CharSequenceTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation {
- method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception;
+ method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception;
}
public final class CompositeUserData implements android.os.Parcelable {
- ctor public CompositeUserData(android.service.autofill.UserData, android.service.autofill.UserData);
+ ctor public CompositeUserData(@Nullable android.service.autofill.UserData, @NonNull android.service.autofill.UserData);
method public int describeContents();
- method public java.lang.String[] getCategoryIds();
+ method public String[] getCategoryIds();
method public android.os.Bundle getDefaultFieldClassificationArgs();
- method public java.lang.String getFieldClassificationAlgorithm();
- method public java.lang.String getFieldClassificationAlgorithmForCategory(java.lang.String);
- method public android.util.ArrayMap<java.lang.String, java.lang.String> getFieldClassificationAlgorithms();
- method public android.util.ArrayMap<java.lang.String, android.os.Bundle> getFieldClassificationArgs();
- method public java.lang.String[] getValues();
+ method @Nullable public String getFieldClassificationAlgorithm();
+ method @Nullable public String getFieldClassificationAlgorithmForCategory(@NonNull String);
+ method public android.util.ArrayMap<java.lang.String,java.lang.String> getFieldClassificationAlgorithms();
+ method public android.util.ArrayMap<java.lang.String,android.os.Bundle> getFieldClassificationArgs();
+ method public String[] getValues();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.CompositeUserData> CREATOR;
}
public final class CustomDescription implements android.os.Parcelable {
- method public android.util.SparseArray<android.service.autofill.InternalOnClickAction> getActions();
+ method @Nullable public android.util.SparseArray<android.service.autofill.InternalOnClickAction> getActions();
}
public final class DateTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation {
- method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception;
+ method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception;
}
public final class DateValueSanitizer extends android.service.autofill.InternalSanitizer implements android.os.Parcelable android.service.autofill.Sanitizer {
- method public android.view.autofill.AutofillValue sanitize(android.view.autofill.AutofillValue);
+ method @Nullable public android.view.autofill.AutofillValue sanitize(@NonNull android.view.autofill.AutofillValue);
}
public final class FillResponse implements android.os.Parcelable {
@@ -1140,52 +1440,117 @@ package android.service.autofill {
}
public final class ImageTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation {
- method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception;
+ method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception;
}
public abstract class InternalOnClickAction implements android.service.autofill.OnClickAction android.os.Parcelable {
ctor public InternalOnClickAction();
- method public abstract void onClick(android.view.ViewGroup);
+ method public abstract void onClick(@NonNull android.view.ViewGroup);
}
public abstract class InternalSanitizer implements android.os.Parcelable android.service.autofill.Sanitizer {
ctor public InternalSanitizer();
- method public abstract android.view.autofill.AutofillValue sanitize(android.view.autofill.AutofillValue);
+ method @Nullable public abstract android.view.autofill.AutofillValue sanitize(@NonNull android.view.autofill.AutofillValue);
}
public abstract class InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation {
ctor public InternalTransformation();
- method public static boolean batchApply(android.service.autofill.ValueFinder, android.widget.RemoteViews, java.util.ArrayList<android.util.Pair<java.lang.Integer, android.service.autofill.InternalTransformation>>);
+ method public static boolean batchApply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, @NonNull java.util.ArrayList<android.util.Pair<java.lang.Integer,android.service.autofill.InternalTransformation>>);
}
public abstract class InternalValidator implements android.os.Parcelable android.service.autofill.Validator {
ctor public InternalValidator();
- method public abstract boolean isValid(android.service.autofill.ValueFinder);
+ method public abstract boolean isValid(@NonNull android.service.autofill.ValueFinder);
}
public final class LuhnChecksumValidator extends android.service.autofill.InternalValidator implements android.os.Parcelable android.service.autofill.Validator {
- method public boolean isValid(android.service.autofill.ValueFinder);
+ method public boolean isValid(@NonNull android.service.autofill.ValueFinder);
}
public final class RegexValidator extends android.service.autofill.InternalValidator implements android.os.Parcelable android.service.autofill.Validator {
- method public boolean isValid(android.service.autofill.ValueFinder);
+ method public boolean isValid(@NonNull android.service.autofill.ValueFinder);
}
public final class TextValueSanitizer extends android.service.autofill.InternalSanitizer implements android.os.Parcelable android.service.autofill.Sanitizer {
- method public android.view.autofill.AutofillValue sanitize(android.view.autofill.AutofillValue);
+ method @Nullable public android.view.autofill.AutofillValue sanitize(@NonNull android.view.autofill.AutofillValue);
}
public final class UserData implements android.os.Parcelable {
- method public android.util.ArrayMap<java.lang.String, java.lang.String> getFieldClassificationAlgorithms();
+ method public android.util.ArrayMap<java.lang.String,java.lang.String> getFieldClassificationAlgorithms();
}
- public abstract interface ValueFinder {
- method public default java.lang.String findByAutofillId(android.view.autofill.AutofillId);
- method public abstract android.view.autofill.AutofillValue findRawValueByAutofillId(android.view.autofill.AutofillId);
+ public interface ValueFinder {
+ method @Nullable public default String findByAutofillId(@NonNull android.view.autofill.AutofillId);
+ method @Nullable public android.view.autofill.AutofillValue findRawValueByAutofillId(@NonNull android.view.autofill.AutofillId);
}
public final class VisibilitySetterAction extends android.service.autofill.InternalOnClickAction implements android.service.autofill.OnClickAction android.os.Parcelable {
- method public void onClick(android.view.ViewGroup);
+ method public void onClick(@NonNull android.view.ViewGroup);
+ }
+
+}
+
+package android.service.autofill.augmented {
+
+ public abstract class AugmentedAutofillService extends android.app.Service {
+ ctor public AugmentedAutofillService();
+ method protected final void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method protected void dump(@NonNull java.io.PrintWriter, @NonNull String[]);
+ method public void onFillRequest(@NonNull android.service.autofill.augmented.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.augmented.FillController, @NonNull android.service.autofill.augmented.FillCallback);
+ field public static final String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService";
+ }
+
+ public final class FillCallback {
+ method public void onSuccess(@Nullable android.service.autofill.augmented.FillResponse);
+ }
+
+ public final class FillController {
+ method public void autofill(@NonNull java.util.List<android.util.Pair<android.view.autofill.AutofillId,android.view.autofill.AutofillValue>>);
+ }
+
+ public final class FillRequest {
+ method @NonNull public android.content.ComponentName getActivityComponent();
+ method @NonNull public android.view.autofill.AutofillId getFocusedId();
+ method @NonNull public android.view.autofill.AutofillValue getFocusedValue();
+ method @Nullable public android.service.autofill.augmented.PresentationParams getPresentationParams();
+ method public int getTaskId();
+ }
+
+ public final class FillResponse implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.augmented.FillResponse> CREATOR;
+ }
+
+ public static final class FillResponse.Builder {
+ ctor public FillResponse.Builder();
+ method public android.service.autofill.augmented.FillResponse build();
+ method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
+ method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>);
+ }
+
+ public final class FillWindow implements java.lang.AutoCloseable {
+ ctor public FillWindow();
+ method public void destroy();
+ method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long);
+ field public static final long FLAG_METADATA_ADDRESS = 1L; // 0x1L
+ }
+
+ public abstract class PresentationParams {
+ method public int getFlags();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getFullArea();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea();
+ field public static final int FLAG_HINT_GRAVITY_BOTTOM = 2; // 0x2
+ field public static final int FLAG_HINT_GRAVITY_LEFT = 4; // 0x4
+ field public static final int FLAG_HINT_GRAVITY_RIGHT = 8; // 0x8
+ field public static final int FLAG_HINT_GRAVITY_TOP = 1; // 0x1
+ field public static final int FLAG_HOST_IME = 16; // 0x10
+ field public static final int FLAG_HOST_SYSTEM = 32; // 0x20
+ }
+
+ public abstract static class PresentationParams.Area {
+ method @NonNull public android.graphics.Rect getBounds();
+ method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSubArea(@NonNull android.graphics.Rect);
}
}
@@ -1193,43 +1558,43 @@ package android.service.autofill {
package android.service.notification {
public final class Adjustment implements android.os.Parcelable {
- ctor public Adjustment(java.lang.String, java.lang.String, android.os.Bundle, java.lang.CharSequence, int);
+ ctor public Adjustment(String, String, android.os.Bundle, CharSequence, int);
ctor protected Adjustment(android.os.Parcel);
method public int describeContents();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getKey();
- method public java.lang.String getPackage();
+ method public CharSequence getExplanation();
+ method public String getKey();
+ method public String getPackage();
method public android.os.Bundle getSignals();
method public int getUser();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
- field public static final java.lang.String KEY_IMPORTANCE = "key_importance";
- field public static final java.lang.String KEY_PEOPLE = "key_people";
- field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
- field public static final java.lang.String KEY_SMART_REPLIES = "key_smart_replies";
- field public static final java.lang.String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
- field public static final java.lang.String KEY_USER_SENTIMENT = "key_user_sentiment";
+ field public static final String KEY_IMPORTANCE = "key_importance";
+ field public static final String KEY_PEOPLE = "key_people";
+ field public static final String KEY_SMART_ACTIONS = "key_smart_actions";
+ field public static final String KEY_SMART_REPLIES = "key_smart_replies";
+ field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
+ field public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
}
- public abstract deprecated class ConditionProviderService extends android.app.Service {
- method public boolean isBound();
+ @Deprecated public abstract class ConditionProviderService extends android.app.Service {
+ method @Deprecated public boolean isBound();
}
public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService {
ctor public NotificationAssistantService();
method public final void adjustNotification(android.service.notification.Adjustment);
method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
- method public void onActionClicked(java.lang.String, android.app.Notification.Action, int);
+ method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int);
method public final android.os.IBinder onBind(android.content.Intent);
- method public void onNotificationDirectReply(java.lang.String);
+ method public void onNotificationDirectReplied(@NonNull String);
method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, android.app.NotificationChannel);
- method public void onNotificationExpansionChanged(java.lang.String, boolean, boolean);
- method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, java.lang.String);
+ method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean);
+ method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, String);
method public void onNotificationsSeen(java.util.List<java.lang.String>);
- method public void onSuggestedReplySent(java.lang.String, java.lang.CharSequence, int);
- method public final void unsnoozeNotification(java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
+ method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
+ method public final void unsnoozeNotification(String);
+ field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
field public static final int SOURCE_FROM_APP = 0; // 0x0
field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1
}
@@ -1271,12 +1636,12 @@ package android.service.notification {
}
public final class SnoozeCriterion implements android.os.Parcelable {
- ctor public SnoozeCriterion(java.lang.String, java.lang.CharSequence, java.lang.CharSequence);
+ ctor public SnoozeCriterion(String, CharSequence, CharSequence);
ctor protected SnoozeCriterion(android.os.Parcel);
method public int describeContents();
- method public java.lang.CharSequence getConfirmation();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getId();
+ method public CharSequence getConfirmation();
+ method public CharSequence getExplanation();
+ method public String getId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR;
}
@@ -1294,7 +1659,7 @@ package android.service.quicksettings {
package android.telecom {
public final class CallAudioState implements android.os.Parcelable {
- ctor public CallAudioState(boolean, int, int, android.bluetooth.BluetoothDevice, java.util.Collection<android.bluetooth.BluetoothDevice>);
+ ctor public CallAudioState(boolean, int, int, @Nullable android.bluetooth.BluetoothDevice, @NonNull java.util.Collection<android.bluetooth.BluetoothDevice>);
}
public final class PhoneAccountSuggestion implements android.os.Parcelable {
@@ -1303,10 +1668,10 @@ package android.telecom {
public class PhoneAccountSuggestionService extends android.app.Service {
ctor public PhoneAccountSuggestionService();
- method public void onAccountSuggestionRequest(java.lang.String);
+ method public void onAccountSuggestionRequest(@NonNull String);
method public android.os.IBinder onBind(android.content.Intent);
- method public final void suggestPhoneAccounts(java.lang.String, java.util.List<android.telecom.PhoneAccountSuggestion>);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService";
+ method public final void suggestPhoneAccounts(@NonNull String, @NonNull java.util.List<android.telecom.PhoneAccountSuggestion>);
+ field public static final String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService";
}
}
@@ -1314,19 +1679,19 @@ package android.telecom {
package android.telephony {
public class CarrierConfigManager {
- method public void overrideConfig(int, android.os.PersistableBundle);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle);
}
public class MbmsDownloadSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_DOWNLOAD_SERVICE_OVERRIDE_METADATA = "mbms-download-service-override";
+ field public static final String MBMS_DOWNLOAD_SERVICE_OVERRIDE_METADATA = "mbms-download-service-override";
}
public class MbmsGroupCallSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_GROUP_CALL_SERVICE_OVERRIDE_METADATA = "mbms-group-call-service-override";
+ field public static final String MBMS_GROUP_CALL_SERVICE_OVERRIDE_METADATA = "mbms-group-call-service-override";
}
public class MbmsStreamingSession implements java.lang.AutoCloseable {
- field public static final java.lang.String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override";
+ field public static final String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override";
}
public class ServiceState implements android.os.Parcelable {
@@ -1340,8 +1705,8 @@ package android.telephony {
public class TelephonyManager {
method public int getCarrierIdListVersion();
method public boolean isRttSupported();
- method public void refreshUiccProfile();
- method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile();
+ method public void setCarrierTestOverride(String, String, String, String, String, String, String);
field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff
}
@@ -1350,19 +1715,19 @@ package android.telephony {
package android.telephony.mbms {
public static class DownloadRequest.Builder {
- method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String);
}
public final class FileInfo implements android.os.Parcelable {
- ctor public FileInfo(android.net.Uri, java.lang.String);
+ ctor public FileInfo(android.net.Uri, String);
}
public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
- ctor public FileServiceInfo(java.util.Map<java.util.Locale, java.lang.String>, java.lang.String, java.util.List<java.util.Locale>, java.lang.String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
+ ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
}
public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
- ctor public StreamingServiceInfo(java.util.Map<java.util.Locale, java.lang.String>, java.lang.String, java.util.List<java.util.Locale>, java.lang.String, java.util.Date, java.util.Date);
+ ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date);
}
public final class UriPathPair implements android.os.Parcelable {
@@ -1381,18 +1746,22 @@ package android.telephony.mbms.vendor {
ctor public MbmsDownloadServiceBase();
method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
+ method public android.os.IBinder asBinder();
method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
method public void dispose(int) throws android.os.RemoteException;
method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
+ method public static String getDefaultTransactionName(int);
+ method public String getTransactionName(int);
method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException;
- method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
+ method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
+ method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException;
method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
- method public int setTempFileRootDirectory(int, java.lang.String) throws android.os.RemoteException;
+ method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException;
}
public class MbmsGroupCallServiceBase extends android.app.Service {
@@ -1408,30 +1777,34 @@ package android.telephony.mbms.vendor {
public class MbmsStreamingServiceBase extends android.os.Binder {
ctor public MbmsStreamingServiceBase();
+ method public android.os.IBinder asBinder();
method public void dispose(int) throws android.os.RemoteException;
- method public android.net.Uri getPlaybackUri(int, java.lang.String) throws android.os.RemoteException;
+ method public static String getDefaultTransactionName(int);
+ method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException;
+ method public String getTransactionName(int);
method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
+ method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
- method public int startStreaming(int, java.lang.String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
- method public void stopStreaming(int, java.lang.String) throws android.os.RemoteException;
+ method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
+ method public void stopStreaming(int, String) throws android.os.RemoteException;
}
public class VendorUtils {
ctor public VendorUtils();
- method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, java.lang.String);
- field public static final java.lang.String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
- field public static final java.lang.String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
- field public static final java.lang.String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
- field public static final java.lang.String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
- field public static final java.lang.String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
- field public static final java.lang.String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
- field public static final java.lang.String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
- field public static final java.lang.String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
- field public static final java.lang.String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
- field public static final java.lang.String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
- field public static final java.lang.String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
- field public static final java.lang.String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
+ method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String);
+ field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
+ field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
+ field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
+ field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
+ field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
+ field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
+ field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
+ field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
+ field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
+ field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
+ field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
+ field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
}
}
@@ -1441,8 +1814,8 @@ package android.text {
public static final class Selection.MemoryTextWatcher implements android.text.TextWatcher {
ctor public Selection.MemoryTextWatcher();
method public void afterTextChanged(android.text.Editable);
- method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
- method public void onTextChanged(java.lang.CharSequence, int, int, int);
+ method public void beforeTextChanged(CharSequence, int, int, int);
+ method public void onTextChanged(CharSequence, int, int, int);
}
}
@@ -1457,7 +1830,7 @@ package android.transition {
package android.util {
- public final class ArraySet<E> implements java.util.Collection java.util.Set {
+ public final class ArraySet<E> implements java.util.Collection<E> java.util.Set<E> {
method public E valueAtUnchecked(int);
}
@@ -1468,12 +1841,12 @@ package android.util.proto {
public final class EncodedBuffer {
ctor public EncodedBuffer();
ctor public EncodedBuffer(int);
- method public void dumpBuffers(java.lang.String);
- method public static void dumpByteString(java.lang.String, java.lang.String, byte[]);
+ method public void dumpBuffers(String);
+ method public static void dumpByteString(String, String, byte[]);
method public void editRawFixed32(int, int);
method public byte[] getBytes(int);
method public int getChunkCount();
- method public java.lang.String getDebugString();
+ method public String getDebugString();
method public int getRawFixed32At(int);
method public static int getRawVarint32Size(int);
method public static int getRawVarint64Size(long);
@@ -1509,7 +1882,7 @@ package android.util.proto {
ctor public ProtoInputStream(byte[]);
method public int decodeZigZag32(int);
method public long decodeZigZag64(long);
- method public java.lang.String dumpDebugData();
+ method public String dumpDebugData();
method public void end(long);
method public int getFieldNumber();
method public int getOffset();
@@ -1522,7 +1895,7 @@ package android.util.proto {
method public float readFloat(long) throws java.io.IOException;
method public int readInt(long) throws java.io.IOException;
method public long readLong(long) throws java.io.IOException;
- method public java.lang.String readString(long) throws java.io.IOException;
+ method public String readString(long) throws java.io.IOException;
method public void skip() throws java.io.IOException;
method public long start(long) throws java.io.IOException;
field public static final int NO_MORE_FIELDS = -1; // 0xffffffff
@@ -1534,93 +1907,93 @@ package android.util.proto {
ctor public ProtoOutputStream(java.io.OutputStream);
ctor public ProtoOutputStream(java.io.FileDescriptor);
method public static int checkFieldId(long, long);
- method public void dump(java.lang.String);
+ method public void dump(String);
method public void end(long);
- method public deprecated void endObject(long);
- method public deprecated void endRepeatedObject(long);
+ method @Deprecated public void endObject(long);
+ method @Deprecated public void endRepeatedObject(long);
method public void flush();
method public byte[] getBytes();
method public static long makeFieldId(int, long);
method public long start(long);
- method public deprecated long startObject(long);
- method public deprecated long startRepeatedObject(long);
+ method @Deprecated public long startObject(long);
+ method @Deprecated public long startRepeatedObject(long);
method public void write(long, double);
method public void write(long, float);
method public void write(long, int);
method public void write(long, long);
method public void write(long, boolean);
- method public void write(long, java.lang.String);
+ method public void write(long, String);
method public void write(long, byte[]);
- method public deprecated void writeBool(long, boolean);
- method public deprecated void writeBytes(long, byte[]);
- method public deprecated void writeDouble(long, double);
- method public deprecated void writeEnum(long, int);
- method public deprecated void writeFixed32(long, int);
- method public deprecated void writeFixed64(long, long);
- method public deprecated void writeFloat(long, float);
- method public deprecated void writeInt32(long, int);
- method public deprecated void writeInt64(long, long);
- method public deprecated void writeObject(long, byte[]);
- method public deprecated void writePackedBool(long, boolean[]);
- method public deprecated void writePackedDouble(long, double[]);
- method public deprecated void writePackedEnum(long, int[]);
- method public deprecated void writePackedFixed32(long, int[]);
- method public deprecated void writePackedFixed64(long, long[]);
- method public deprecated void writePackedFloat(long, float[]);
- method public deprecated void writePackedInt32(long, int[]);
- method public deprecated void writePackedInt64(long, long[]);
- method public deprecated void writePackedSFixed32(long, int[]);
- method public deprecated void writePackedSFixed64(long, long[]);
- method public deprecated void writePackedSInt32(long, int[]);
- method public deprecated void writePackedSInt64(long, long[]);
- method public deprecated void writePackedUInt32(long, int[]);
- method public deprecated void writePackedUInt64(long, long[]);
- method public deprecated void writeRepeatedBool(long, boolean);
- method public deprecated void writeRepeatedBytes(long, byte[]);
- method public deprecated void writeRepeatedDouble(long, double);
- method public deprecated void writeRepeatedEnum(long, int);
- method public deprecated void writeRepeatedFixed32(long, int);
- method public deprecated void writeRepeatedFixed64(long, long);
- method public deprecated void writeRepeatedFloat(long, float);
- method public deprecated void writeRepeatedInt32(long, int);
- method public deprecated void writeRepeatedInt64(long, long);
- method public deprecated void writeRepeatedObject(long, byte[]);
- method public deprecated void writeRepeatedSFixed32(long, int);
- method public deprecated void writeRepeatedSFixed64(long, long);
- method public deprecated void writeRepeatedSInt32(long, int);
- method public deprecated void writeRepeatedSInt64(long, long);
- method public deprecated void writeRepeatedString(long, java.lang.String);
- method public deprecated void writeRepeatedUInt32(long, int);
- method public deprecated void writeRepeatedUInt64(long, long);
- method public deprecated void writeSFixed32(long, int);
- method public deprecated void writeSFixed64(long, long);
- method public deprecated void writeSInt32(long, int);
- method public deprecated void writeSInt64(long, long);
- method public deprecated void writeString(long, java.lang.String);
+ method @Deprecated public void writeBool(long, boolean);
+ method @Deprecated public void writeBytes(long, byte[]);
+ method @Deprecated public void writeDouble(long, double);
+ method @Deprecated public void writeEnum(long, int);
+ method @Deprecated public void writeFixed32(long, int);
+ method @Deprecated public void writeFixed64(long, long);
+ method @Deprecated public void writeFloat(long, float);
+ method @Deprecated public void writeInt32(long, int);
+ method @Deprecated public void writeInt64(long, long);
+ method @Deprecated public void writeObject(long, byte[]);
+ method @Deprecated public void writePackedBool(long, boolean[]);
+ method @Deprecated public void writePackedDouble(long, double[]);
+ method @Deprecated public void writePackedEnum(long, int[]);
+ method @Deprecated public void writePackedFixed32(long, int[]);
+ method @Deprecated public void writePackedFixed64(long, long[]);
+ method @Deprecated public void writePackedFloat(long, float[]);
+ method @Deprecated public void writePackedInt32(long, int[]);
+ method @Deprecated public void writePackedInt64(long, long[]);
+ method @Deprecated public void writePackedSFixed32(long, int[]);
+ method @Deprecated public void writePackedSFixed64(long, long[]);
+ method @Deprecated public void writePackedSInt32(long, int[]);
+ method @Deprecated public void writePackedSInt64(long, long[]);
+ method @Deprecated public void writePackedUInt32(long, int[]);
+ method @Deprecated public void writePackedUInt64(long, long[]);
+ method @Deprecated public void writeRepeatedBool(long, boolean);
+ method @Deprecated public void writeRepeatedBytes(long, byte[]);
+ method @Deprecated public void writeRepeatedDouble(long, double);
+ method @Deprecated public void writeRepeatedEnum(long, int);
+ method @Deprecated public void writeRepeatedFixed32(long, int);
+ method @Deprecated public void writeRepeatedFixed64(long, long);
+ method @Deprecated public void writeRepeatedFloat(long, float);
+ method @Deprecated public void writeRepeatedInt32(long, int);
+ method @Deprecated public void writeRepeatedInt64(long, long);
+ method @Deprecated public void writeRepeatedObject(long, byte[]);
+ method @Deprecated public void writeRepeatedSFixed32(long, int);
+ method @Deprecated public void writeRepeatedSFixed64(long, long);
+ method @Deprecated public void writeRepeatedSInt32(long, int);
+ method @Deprecated public void writeRepeatedSInt64(long, long);
+ method @Deprecated public void writeRepeatedString(long, String);
+ method @Deprecated public void writeRepeatedUInt32(long, int);
+ method @Deprecated public void writeRepeatedUInt64(long, long);
+ method @Deprecated public void writeSFixed32(long, int);
+ method @Deprecated public void writeSFixed64(long, long);
+ method @Deprecated public void writeSInt32(long, int);
+ method @Deprecated public void writeSInt64(long, long);
+ method @Deprecated public void writeString(long, String);
method public void writeTag(int, int);
- method public deprecated void writeUInt32(long, int);
- method public deprecated void writeUInt64(long, long);
+ method @Deprecated public void writeUInt32(long, int);
+ method @Deprecated public void writeUInt64(long, long);
}
public class ProtoParseException extends java.lang.RuntimeException {
- ctor public ProtoParseException(java.lang.String);
+ ctor public ProtoParseException(String);
}
public abstract class ProtoStream {
ctor public ProtoStream();
method public static int convertObjectIdToOrdinal(int);
method public static int getDepthFromToken(long);
- method public static java.lang.String getFieldCountString(long);
- method public static java.lang.String getFieldIdString(long);
- method public static java.lang.String getFieldTypeString(long);
+ method public static String getFieldCountString(long);
+ method public static String getFieldIdString(long);
+ method public static String getFieldTypeString(long);
method public static int getObjectIdFromToken(long);
method public static int getOffsetFromToken(long);
method public static boolean getRepeatedFromToken(long);
method public static int getTagSizeFromToken(long);
- method public static java.lang.String getWireTypeString(int);
+ method public static String getWireTypeString(int);
method public static long makeFieldId(int, long);
method public static long makeToken(int, boolean, int, int, int);
- method public static java.lang.String token2String(long);
+ method public static String token2String(long);
field public static final long FIELD_COUNT_MASK = 16492674416640L; // 0xf0000000000L
field public static final long FIELD_COUNT_PACKED = 5497558138880L; // 0x50000000000L
field public static final long FIELD_COUNT_REPEATED = 2199023255552L; // 0x20000000000L
@@ -1640,7 +2013,7 @@ package android.util.proto {
field public static final long FIELD_TYPE_INT64 = 12884901888L; // 0x300000000L
field public static final long FIELD_TYPE_MASK = 1095216660480L; // 0xff00000000L
field public static final long FIELD_TYPE_MESSAGE = 47244640256L; // 0xb00000000L
- field protected static final java.lang.String[] FIELD_TYPE_NAMES;
+ field protected static final String[] FIELD_TYPE_NAMES;
field public static final long FIELD_TYPE_SFIXED32 = 64424509440L; // 0xf00000000L
field public static final long FIELD_TYPE_SFIXED64 = 68719476736L; // 0x1000000000L
field public static final int FIELD_TYPE_SHIFT = 32; // 0x20
@@ -1660,7 +2033,7 @@ package android.util.proto {
}
public class WireTypeMismatchException extends android.util.proto.ProtoParseException {
- ctor public WireTypeMismatchException(java.lang.String);
+ ctor public WireTypeMismatchException(String);
}
}
@@ -1673,9 +2046,9 @@ package android.view {
public final class Choreographer {
method public static long getFrameDelay();
- method public void postCallback(int, java.lang.Runnable, java.lang.Object);
- method public void postCallbackDelayed(int, java.lang.Runnable, java.lang.Object, long);
- method public void removeCallbacks(int, java.lang.Runnable, java.lang.Object);
+ method public void postCallback(int, Runnable, Object);
+ method public void postCallbackDelayed(int, Runnable, Object, long);
+ method public void removeCallbacks(int, Runnable, Object);
method public static void setFrameDelay(long);
field public static final int CALLBACK_ANIMATION = 1; // 0x1
}
@@ -1685,19 +2058,19 @@ package android.view {
}
public final class InputDevice implements android.os.Parcelable {
- method public void disable();
- method public void enable();
+ method @RequiresPermission("android.permission.DISABLE_INPUT_DEVICE") public void disable();
+ method @RequiresPermission("android.permission.DISABLE_INPUT_DEVICE") public void enable();
}
public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable {
- method public static java.lang.String actionToString(int);
+ method public static String actionToString(int);
method public final void setDisplayId(int);
field public static final int LAST_KEYCODE = 288; // 0x120
}
public final class KeyboardShortcutGroup implements android.os.Parcelable {
- ctor public KeyboardShortcutGroup(java.lang.CharSequence, java.util.List<android.view.KeyboardShortcutInfo>, boolean);
- ctor public KeyboardShortcutGroup(java.lang.CharSequence, boolean);
+ ctor public KeyboardShortcutGroup(@Nullable CharSequence, @NonNull java.util.List<android.view.KeyboardShortcutInfo>, boolean);
+ ctor public KeyboardShortcutGroup(@Nullable CharSequence, boolean);
method public boolean isSystemGroup();
}
@@ -1707,7 +2080,7 @@ package android.view {
method public void setDisplayId(int);
}
- public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
+ @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
method public android.view.View getTooltipView();
method public static boolean isDefaultFocusHighlightEnabled();
method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
@@ -1732,7 +2105,7 @@ package android.view {
method public static int getLongPressTooltipHideTimeout();
}
- public abstract interface WindowManager implements android.view.ViewManager {
+ public interface WindowManager extends android.view.ViewManager {
method public default void setShouldShowIme(int, boolean);
method public default void setShouldShowSystemDecors(int, boolean);
method public default void setShouldShowWithInsecureKeyguard(int, boolean);
@@ -1741,8 +2114,8 @@ package android.view {
public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
field public static final int ACCESSIBILITY_TITLE_CHANGED = 33554432; // 0x2000000
field public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 64; // 0x40
- field public java.lang.CharSequence accessibilityTitle;
- field public int privateFlags;
+ field public CharSequence accessibilityTitle;
+ field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=0x1, equals=0x1, name="FAKE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x2, equals=0x2, name="FORCE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x4, equals=0x4, name="WANTS_OFFSET_NOTIFICATIONS"), @android.view.ViewDebug.FlagToString(mask=0x10, equals=0x10, name="SHOW_FOR_ALL_USERS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, equals=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, name="NO_MOVE_ANIMATION"), @android.view.ViewDebug.FlagToString(mask=0x80, equals=0x80, name="COMPATIBLE_WINDOW"), @android.view.ViewDebug.FlagToString(mask=0x100, equals=0x100, name="SYSTEM_ERROR"), @android.view.ViewDebug.FlagToString(mask=0x200, equals=0x200, name="INHERIT_TRANSLUCENT_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x400, equals=0x400, name="KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=0x800, equals=0x800, name="DISABLE_WALLPAPER_TOUCH_EVENTS"), @android.view.ViewDebug.FlagToString(mask=0x1000, equals=0x1000, name="FORCE_STATUS_BAR_VISIBLE_TRANSPARENT"), @android.view.ViewDebug.FlagToString(mask=0x2000, equals=0x2000, name="PRESERVE_GEOMETRY"), @android.view.ViewDebug.FlagToString(mask=0x4000, equals=0x4000, name="FORCE_DECOR_VIEW_VISIBILITY"), @android.view.ViewDebug.FlagToString(mask=0x8000, equals=0x8000, name="WILL_NOT_REPLACE_ON_RELAUNCH"), @android.view.ViewDebug.FlagToString(mask=0x10000, equals=0x10000, name="LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME"), @android.view.ViewDebug.FlagToString(mask=0x20000, equals=0x20000, name="FORCE_DRAW_STATUS_BAR_BACKGROUND"), @android.view.ViewDebug.FlagToString(mask=0x40000, equals=0x40000, name="SUSTAINED_PERFORMANCE_MODE"), @android.view.ViewDebug.FlagToString(mask=0x80000, equals=0x80000, name="HIDE_NON_SYSTEM_OVERLAY_WINDOWS"), @android.view.ViewDebug.FlagToString(mask=0x100000, equals=0x100000, name="IS_ROUNDED_CORNERS_OVERLAY"), @android.view.ViewDebug.FlagToString(mask=0x400000, equals=0x400000, name="IS_SCREEN_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x800000, equals=0x800000, name="STATUS_FORCE_SHOW_NAVIGATION")}) public int privateFlags;
}
}
@@ -1750,14 +2123,14 @@ package android.view {
package android.view.accessibility {
public final class AccessibilityManager {
- method public void addAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, android.os.Handler);
- method public java.lang.String getAccessibilityShortcutService();
- method public void performAccessibilityShortcut();
- method public void removeAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener);
+ method public void addAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, @Nullable android.os.Handler);
+ method @Nullable @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public String getAccessibilityShortcutService();
+ method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void performAccessibilityShortcut();
+ method public void removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener);
}
- public static abstract interface AccessibilityManager.AccessibilityServicesStateChangeListener {
- method public abstract void onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager);
+ public static interface AccessibilityManager.AccessibilityServicesStateChangeListener {
+ method public void onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager);
}
public class AccessibilityNodeInfo implements android.os.Parcelable {
@@ -1766,7 +2139,7 @@ package android.view.accessibility {
}
public static final class AccessibilityNodeInfo.TouchDelegateInfo implements android.os.Parcelable {
- method public long getAccessibilityIdForRegion(android.graphics.Region);
+ method public long getAccessibilityIdForRegion(@NonNull android.graphics.Region);
}
public final class AccessibilityWindowInfo implements android.os.Parcelable {
@@ -1788,7 +2161,11 @@ package android.view.autofill {
public final class AutofillId implements android.os.Parcelable {
ctor public AutofillId(int);
- ctor public AutofillId(android.view.autofill.AutofillId, int);
+ ctor public AutofillId(@NonNull android.view.autofill.AutofillId, int);
+ }
+
+ public final class AutofillManager {
+ field public static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 120000; // 0x1d4c0
}
}
@@ -1801,9 +2178,46 @@ package android.view.inputmethod {
}
+package android.view.inspector {
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public @interface InspectableNodeName {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface InspectableProperty {
+ method public abstract int attributeId() default android.content.res.Resources.ID_NULL;
+ method public abstract android.view.inspector.InspectableProperty.EnumMap[] enumMapping() default {};
+ method public abstract android.view.inspector.InspectableProperty.FlagMap[] flagMapping() default {};
+ method public abstract boolean hasAttributeId() default true;
+ method public abstract String name() default "";
+ method public abstract android.view.inspector.InspectableProperty.ValueType valueType() default android.view.inspector.InspectableProperty.ValueType.INFERRED;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.EnumMap {
+ method public abstract String name();
+ method public abstract int value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.FlagMap {
+ method public abstract int mask() default 0;
+ method public abstract String name();
+ method public abstract int target();
+ }
+
+ public enum InspectableProperty.ValueType {
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType COLOR;
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType GRAVITY;
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType INFERRED;
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType INT_ENUM;
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType INT_FLAG;
+ enum_constant public static final android.view.inspector.InspectableProperty.ValueType NONE;
+ }
+
+}
+
package android.widget {
- public abstract class AbsListView extends android.widget.AdapterView implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener {
+ public abstract class AbsListView extends android.widget.AdapterView<android.widget.ListAdapter> implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener {
method public final boolean shouldDrawSelector();
}
@@ -1817,19 +2231,19 @@ package android.widget {
field public static final int MODE_SPINNER = 1; // 0x1
}
- public final class Magnifier {
- method public android.graphics.Bitmap getContent();
+ @UiThread public final class Magnifier {
+ method @Nullable public android.graphics.Bitmap getContent();
method public static android.graphics.PointF getMagnifierDefaultSize();
- method public android.graphics.Bitmap getOriginalContent();
+ method @Nullable public android.graphics.Bitmap getOriginalContent();
method public void setOnOperationCompleteCallback(android.widget.Magnifier.Callback);
}
- public static abstract interface Magnifier.Callback {
- method public abstract void onOperationComplete();
+ public static interface Magnifier.Callback {
+ method public void onOperationComplete();
}
public class NumberPicker extends android.widget.LinearLayout {
- method public java.lang.CharSequence getDisplayedValueForCurrentSelection();
+ method public CharSequence getDisplayedValueForCurrentSelection();
}
public class PopupMenu {
@@ -1840,7 +2254,7 @@ package android.widget {
method public boolean isPopupShowing();
}
- public class TextClock extends android.widget.TextView {
+ @android.widget.RemoteViews.RemoteView public class TextClock extends android.widget.TextView {
method public void disableClockTick();
}
@@ -1855,7 +2269,7 @@ package android.widget {
}
public class Toolbar extends android.view.ViewGroup {
- method public android.view.View getNavigationView();
+ method @Nullable public android.view.View getNavigationView();
}
}
diff --git a/api/test-removed.txt b/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp
index abe18ba8a415..803f83c0bc6f 100644
--- a/cmds/idmap2/Android.bp
+++ b/cmds/idmap2/Android.bp
@@ -20,6 +20,7 @@ cc_defaults {
"misc-*",
"modernize-*",
"readability-*",
+ "-modernize-avoid-c-arrays",
],
tidy_flags: [
"-system-headers",
@@ -38,6 +39,7 @@ cc_library {
"libidmap2/CommandLineOptions.cpp",
"libidmap2/FileUtils.cpp",
"libidmap2/Idmap.cpp",
+ "libidmap2/Policies.cpp",
"libidmap2/PrettyPrintVisitor.cpp",
"libidmap2/RawPrintVisitor.cpp",
"libidmap2/ResourceUtils.cpp",
@@ -87,6 +89,7 @@ cc_test {
"tests/Idmap2BinaryTests.cpp",
"tests/IdmapTests.cpp",
"tests/Main.cpp",
+ "tests/PoliciesTests.cpp",
"tests/PrettyPrintVisitorTests.cpp",
"tests/RawPrintVisitorTests.cpp",
"tests/ResourceUtilsTests.cpp",
diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp
index b07567331e85..c455ac0f83af 100644
--- a/cmds/idmap2/idmap2/Create.cpp
+++ b/cmds/idmap2/idmap2/Create.cpp
@@ -27,17 +27,25 @@
#include "idmap2/CommandLineOptions.h"
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
+#include "idmap2/Policies.h"
+#include "idmap2/Result.h"
using android::ApkAssets;
using android::idmap2::BinaryStreamVisitor;
using android::idmap2::CommandLineOptions;
using android::idmap2::Idmap;
+using android::idmap2::PoliciesToBitmask;
+using android::idmap2::PolicyBitmask;
+using android::idmap2::PolicyFlags;
+using android::idmap2::Result;
using android::idmap2::utils::kIdmapFilePermissionMask;
bool Create(const std::vector<std::string>& args, std::ostream& out_error) {
std::string target_apk_path;
std::string overlay_apk_path;
std::string idmap_path;
+ std::vector<std::string> policies;
+ bool ignore_overlayable;
const CommandLineOptions opts =
CommandLineOptions("idmap2 create")
@@ -47,12 +55,28 @@ bool Create(const std::vector<std::string>& args, std::ostream& out_error) {
.MandatoryOption("--overlay-apk-path",
"input: path to apk which contains the new resource values",
&overlay_apk_path)
- .MandatoryOption("--idmap-path", "output: path to where to write idmap file",
- &idmap_path);
+ .MandatoryOption("--idmap-path", "output: path to where to write idmap file", &idmap_path)
+ .OptionalOption("--policy",
+ "input: an overlayable policy this overlay fulfills "
+ "(if none or supplied, the overlay policy will default to \"public\")",
+ &policies)
+ .OptionalFlag("--ignore-overlayable", "disables overlayable and policy checks",
+ &ignore_overlayable);
if (!opts.Parse(args, out_error)) {
return false;
}
+ PolicyBitmask fulfilled_policies = 0;
+ if (auto result = PoliciesToBitmask(policies, out_error)) {
+ fulfilled_policies |= *result;
+ } else {
+ return false;
+ }
+
+ if (fulfilled_policies == 0) {
+ fulfilled_policies |= PolicyFlags::POLICY_PUBLIC;
+ }
+
const std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
if (!target_apk) {
out_error << "error: failed to load apk " << target_apk_path << std::endl;
@@ -66,7 +90,8 @@ bool Create(const std::vector<std::string>& args, std::ostream& out_error) {
}
const std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, out_error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ fulfilled_policies, !ignore_overlayable, out_error);
if (!idmap) {
return false;
}
diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp
index 49187475ccdb..b1ed42a3e624 100644
--- a/cmds/idmap2/idmap2/Scan.cpp
+++ b/cmds/idmap2/idmap2/Scan.cpp
@@ -21,11 +21,15 @@
#include <set>
#include <sstream>
#include <string>
+#include <utility>
#include <vector>
+#include "android-base/properties.h"
+
#include "idmap2/CommandLineOptions.h"
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
+#include "idmap2/ResourceUtils.h"
#include "idmap2/Xml.h"
#include "idmap2/ZipFile.h"
@@ -33,12 +37,34 @@
using android::idmap2::CommandLineOptions;
using android::idmap2::Idmap;
-using android::idmap2::MemoryChunk;
-using android::idmap2::Xml;
-using android::idmap2::ZipFile;
+using android::idmap2::PoliciesToBitmask;
+using android::idmap2::PolicyBitmask;
+using android::idmap2::PolicyFlags;
+using android::idmap2::Result;
+using android::idmap2::utils::ExtractOverlayManifestInfo;
using android::idmap2::utils::FindFiles;
+using android::idmap2::utils::OverlayManifestInfo;
namespace {
+
+struct InputOverlay {
+ bool operator<(InputOverlay const& rhs) const {
+ return priority < rhs.priority || (priority == rhs.priority && apk_path < rhs.apk_path);
+ }
+
+ std::string apk_path; // NOLINT(misc-non-private-member-variables-in-classes)
+ std::string idmap_path; // NOLINT(misc-non-private-member-variables-in-classes)
+ int priority; // NOLINT(misc-non-private-member-variables-in-classes)
+ std::vector<std::string> policies; // NOLINT(misc-non-private-member-variables-in-classes)
+ bool ignore_overlayable; // NOLINT(misc-non-private-member-variables-in-classes)
+};
+
+bool VendorIsQOrLater() {
+ // STOPSHIP(b/119390857): Check api version once Q sdk version is finalized
+ std::string version = android::base::GetProperty("ro.vndk.version", "Q");
+ return version == "Q" || version == "q";
+}
+
std::unique_ptr<std::vector<std::string>> FindApkFiles(const std::vector<std::string>& dirs,
bool recursive, std::ostream& out_error) {
const auto predicate = [](unsigned char type, const std::string& path) -> bool {
@@ -58,6 +84,23 @@ std::unique_ptr<std::vector<std::string>> FindApkFiles(const std::vector<std::st
}
return std::make_unique<std::vector<std::string>>(paths.cbegin(), paths.cend());
}
+
+PolicyBitmask PolicyForPath(const std::string& apk_path) {
+ static const std::vector<std::pair<std::string, PolicyBitmask>> values = {
+ {"/product/", PolicyFlags::POLICY_PRODUCT_PARTITION},
+ {"/system/", PolicyFlags::POLICY_SYSTEM_PARTITION},
+ {"/vendor/", PolicyFlags::POLICY_VENDOR_PARTITION},
+ };
+
+ for (auto const& pair : values) {
+ if (apk_path.compare(0, pair.first.size(), pair.first) == 0) {
+ return pair.second | PolicyFlags::POLICY_PUBLIC;
+ }
+ }
+
+ return PolicyFlags::POLICY_PUBLIC;
+}
+
} // namespace
bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
@@ -65,6 +108,7 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
std::string target_package_name;
std::string target_apk_path;
std::string output_directory;
+ std::vector<std::string> override_policies;
bool recursive = false;
const CommandLineOptions opts =
@@ -77,7 +121,12 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
.MandatoryOption("--target-apk-path", "path to target apk", &target_apk_path)
.MandatoryOption("--output-directory",
"directory in which to write artifacts (idmap files and overlays.list)",
- &output_directory);
+ &output_directory)
+ .OptionalOption(
+ "--override-policy",
+ "input: an overlayable policy this overlay fulfills "
+ "(if none or supplied, the overlays will not have their policies overriden",
+ &override_policies);
if (!opts.Parse(args, out_error)) {
return false;
}
@@ -87,72 +136,86 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
return false;
}
- std::vector<std::string> interesting_apks;
+ std::vector<InputOverlay> interesting_apks;
for (const std::string& path : *apk_paths) {
- std::unique_ptr<const ZipFile> zip = ZipFile::Open(path);
- if (!zip) {
- out_error << "error: failed to open " << path << " as a zip file" << std::endl;
- return false;
- }
-
- std::unique_ptr<const MemoryChunk> entry = zip->Uncompress("AndroidManifest.xml");
- if (!entry) {
- out_error << "error: failed to uncompress AndroidManifest.xml from " << path << std::endl;
+ Result<OverlayManifestInfo> overlay_info =
+ ExtractOverlayManifestInfo(path, out_error,
+ /* assert_overlay */ false);
+ if (!overlay_info) {
return false;
}
- std::unique_ptr<const Xml> xml = Xml::Create(entry->buf, entry->size);
- if (!xml) {
- out_error << "error: failed to parse AndroidManifest.xml from " << path << std::endl;
+ if (!overlay_info->is_static) {
continue;
}
- const auto tag = xml->FindTag("overlay");
- if (!tag) {
+ if (overlay_info->target_package.empty() ||
+ overlay_info->target_package != target_package_name) {
continue;
}
- auto iter = tag->find("isStatic");
- if (iter == tag->end() || std::stoul(iter->second) == 0U) {
+ if (overlay_info->priority < 0) {
continue;
}
- iter = tag->find("targetPackage");
- if (iter == tag->end() || iter->second != target_package_name) {
- continue;
+ PolicyBitmask fulfilled_policies;
+ if (!override_policies.empty()) {
+ if (Result<PolicyBitmask> result = PoliciesToBitmask(override_policies, out_error)) {
+ fulfilled_policies = *result;
+ } else {
+ return false;
+ }
+ } else {
+ fulfilled_policies = PolicyForPath(path);
}
- iter = tag->find("priority");
- if (iter == tag->end()) {
- continue;
+ bool ignore_overlayable = false;
+ if ((fulfilled_policies & PolicyFlags::POLICY_VENDOR_PARTITION) != 0 && !VendorIsQOrLater()) {
+ // If the overlay is on a pre-Q vendor partition, do not enforce overlayable
+ // restrictions on this overlay because the pre-Q platform has no understanding of
+ // overlayable.
+ ignore_overlayable = true;
}
- const int priority = std::stoi(iter->second);
- if (priority < 0) {
- continue;
- }
+ std::string idmap_path = Idmap::CanonicalIdmapPathFor(output_directory, path);
+ // Sort the static overlays in ascending priority order
+ InputOverlay input{path, idmap_path, overlay_info->priority, override_policies,
+ ignore_overlayable};
interesting_apks.insert(
- std::lower_bound(interesting_apks.begin(), interesting_apks.end(), path), path);
+ std::lower_bound(interesting_apks.begin(), interesting_apks.end(), input), input);
}
std::stringstream stream;
- for (const auto& apk : interesting_apks) {
- const std::string idmap_path = Idmap::CanonicalIdmapPathFor(output_directory, apk);
+ for (const auto& overlay : interesting_apks) {
+ // Create the idmap for the overlay if it currently does not exist or if it is not up to date.
std::stringstream dev_null;
- if (!Verify(std::vector<std::string>({"--idmap-path", idmap_path}), dev_null) &&
- !Create(std::vector<std::string>({
- "--target-apk-path",
- target_apk_path,
- "--overlay-apk-path",
- apk,
- "--idmap-path",
- idmap_path,
- }),
- out_error)) {
- return false;
+
+ std::vector<std::string> verify_args = {"--idmap-path", overlay.idmap_path};
+ for (const std::string& policy : overlay.policies) {
+ verify_args.emplace_back("--policy");
+ verify_args.emplace_back(policy);
}
- stream << idmap_path << std::endl;
+
+ if (!Verify(std::vector<std::string>(verify_args), dev_null)) {
+ std::vector<std::string> create_args = {"--target-apk-path", target_apk_path,
+ "--overlay-apk-path", overlay.apk_path,
+ "--idmap-path", overlay.idmap_path};
+ if (overlay.ignore_overlayable) {
+ create_args.emplace_back("--ignore-overlayable");
+ }
+
+ for (const std::string& policy : overlay.policies) {
+ verify_args.emplace_back("--policy");
+ verify_args.emplace_back(policy);
+ }
+
+ if (!Create(create_args, out_error)) {
+ return false;
+ }
+ }
+
+ stream << overlay.idmap_path << std::endl;
}
std::cout << stream.str();
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp
index d2e46e15fc59..a3c752718ee2 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.cpp
+++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp
@@ -26,12 +26,15 @@
#include <string>
#include "android-base/macros.h"
+#include "android-base/stringprintf.h"
#include "utils/String8.h"
#include "utils/Trace.h"
#include "idmap2/BinaryStreamVisitor.h"
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
+#include "idmap2/Policies.h"
+#include "idmap2/Result.h"
#include "idmap2d/Idmap2Service.h"
@@ -39,6 +42,8 @@ using android::binder::Status;
using android::idmap2::BinaryStreamVisitor;
using android::idmap2::Idmap;
using android::idmap2::IdmapHeader;
+using android::idmap2::PolicyBitmask;
+using android::idmap2::Result;
using android::idmap2::utils::kIdmapFilePermissionMask;
namespace {
@@ -54,6 +59,10 @@ Status error(const std::string& msg) {
return Status::fromExceptionCode(Status::EX_NONE, msg.c_str());
}
+PolicyBitmask ConvertAidlArgToPolicyBitmask(int32_t arg) {
+ return static_cast<PolicyBitmask>(arg);
+}
+
} // namespace
namespace android::os {
@@ -78,6 +87,8 @@ Status Idmap2Service::removeIdmap(const std::string& overlay_apk_path,
}
Status Idmap2Service::verifyIdmap(const std::string& overlay_apk_path,
+ int32_t fulfilled_policies ATTRIBUTE_UNUSED,
+ bool enforce_overlayable ATTRIBUTE_UNUSED,
int32_t user_id ATTRIBUTE_UNUSED, bool* _aidl_return) {
assert(_aidl_return);
const std::string idmap_path = Idmap::CanonicalIdmapPathFor(kIdmapCacheDir, overlay_apk_path);
@@ -86,11 +97,15 @@ Status Idmap2Service::verifyIdmap(const std::string& overlay_apk_path,
fin.close();
std::stringstream dev_null;
*_aidl_return = header && header->IsUpToDate(dev_null);
+
+ // TODO(b/119328308): Check that the set of fulfilled policies of the overlay has not changed
+
return ok();
}
Status Idmap2Service::createIdmap(const std::string& target_apk_path,
- const std::string& overlay_apk_path, int32_t user_id,
+ const std::string& overlay_apk_path, int32_t fulfilled_policies,
+ bool enforce_overlayable, int32_t user_id,
std::unique_ptr<std::string>* _aidl_return) {
assert(_aidl_return);
std::stringstream trace;
@@ -101,6 +116,8 @@ Status Idmap2Service::createIdmap(const std::string& target_apk_path,
_aidl_return->reset(nullptr);
+ const PolicyBitmask policy_bitmask = ConvertAidlArgToPolicyBitmask(fulfilled_policies);
+
const std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
if (!target_apk) {
return error("failed to load apk " + target_apk_path);
@@ -113,7 +130,8 @@ Status Idmap2Service::createIdmap(const std::string& target_apk_path,
std::stringstream err;
const std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, err);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ policy_bitmask, enforce_overlayable, err);
if (!idmap) {
return error(err.str());
}
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.h b/cmds/idmap2/idmap2d/Idmap2Service.h
index e0bc22e9e9e6..1aab0598449b 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.h
+++ b/cmds/idmap2/idmap2d/Idmap2Service.h
@@ -39,11 +39,12 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 {
binder::Status removeIdmap(const std::string& overlay_apk_path, int32_t user_id,
bool* _aidl_return);
- binder::Status verifyIdmap(const std::string& overlay_apk_path, int32_t user_id,
- bool* _aidl_return);
+ binder::Status verifyIdmap(const std::string& overlay_apk_path, int32_t fulfilled_policies,
+ bool enforce_overlayable, int32_t user_id, bool* _aidl_return);
binder::Status createIdmap(const std::string& target_apk_path,
- const std::string& overlay_apk_path, int32_t user_id,
+ const std::string& overlay_apk_path, int32_t fulfilled_policies,
+ bool enforce_overlayable, int32_t user_id,
std::unique_ptr<std::string>* _aidl_return);
};
diff --git a/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl b/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl
index d475417a0935..ea7274f3ea58 100644
--- a/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl
+++ b/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl
@@ -20,9 +20,18 @@ package android.os;
* @hide
*/
interface IIdmap2 {
+ const int POLICY_PUBLIC = 0x00000001;
+ const int POLICY_SYSTEM_PARTITION = 0x00000002;
+ const int POLICY_VENDOR_PARTITION = 0x00000004;
+ const int POLICY_PRODUCT_PARTITION = 0x00000008;
+
@utf8InCpp String getIdmapPath(@utf8InCpp String overlayApkPath, int userId);
boolean removeIdmap(@utf8InCpp String overlayApkPath, int userId);
- boolean verifyIdmap(@utf8InCpp String overlayApkPath, int userId);
+ boolean verifyIdmap(@utf8InCpp String overlayApkPath, int fulfilledPolicies,
+ boolean enforceOverlayable, int userId);
@nullable @utf8InCpp String createIdmap(@utf8InCpp String targetApkPath,
- @utf8InCpp String overlayApkPath, int userId);
+ @utf8InCpp String overlayApkPath,
+ int fulfilledPolicies,
+ boolean enforceOverlayable,
+ int userId);
}
diff --git a/cmds/idmap2/include/idmap2/CommandLineOptions.h b/cmds/idmap2/include/idmap2/CommandLineOptions.h
index b93e71631d08..6db6bf9ea8ad 100644
--- a/cmds/idmap2/include/idmap2/CommandLineOptions.h
+++ b/cmds/idmap2/include/idmap2/CommandLineOptions.h
@@ -44,6 +44,8 @@ class CommandLineOptions {
std::vector<std::string>* value);
CommandLineOptions& OptionalOption(const std::string& name, const std::string& description,
std::string* value);
+ CommandLineOptions& OptionalOption(const std::string& name, const std::string& description,
+ std::vector<std::string>* value);
bool Parse(const std::vector<std::string>& argv, std::ostream& outError) const;
void Usage(std::ostream& out) const;
@@ -56,6 +58,7 @@ class CommandLineOptions {
COUNT_OPTIONAL,
COUNT_EXACTLY_ONCE,
COUNT_ONCE_OR_MORE,
+ COUNT_OPTIONAL_ONCE_OR_MORE,
} count;
bool argument;
};
diff --git a/cmds/idmap2/include/idmap2/Idmap.h b/cmds/idmap2/include/idmap2/Idmap.h
index b989e4c3f9d1..1666dc8a3bbd 100644
--- a/cmds/idmap2/include/idmap2/Idmap.h
+++ b/cmds/idmap2/include/idmap2/Idmap.h
@@ -57,6 +57,8 @@
#include "androidfw/ResourceTypes.h"
#include "androidfw/StringPiece.h"
+#include "idmap2/Policies.h"
+
namespace android::idmap2 {
class Idmap;
@@ -233,11 +235,10 @@ class Idmap {
// file is used; change this in the next version of idmap to use a named
// package instead; also update FromApkAssets to take additional parameters:
// the target and overlay package names
- static std::unique_ptr<const Idmap> FromApkAssets(const std::string& target_apk_path,
- const ApkAssets& target_apk_assets,
- const std::string& overlay_apk_path,
- const ApkAssets& overlay_apk_assets,
- std::ostream& out_error);
+ static std::unique_ptr<const Idmap> FromApkAssets(
+ const std::string& target_apk_path, const ApkAssets& target_apk_assets,
+ const std::string& overlay_apk_path, const ApkAssets& overlay_apk_assets,
+ const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, std::ostream& out_error);
inline const std::unique_ptr<const IdmapHeader>& GetHeader() const {
return header_;
diff --git a/cmds/idmap2/include/idmap2/Policies.h b/cmds/idmap2/include/idmap2/Policies.h
new file mode 100644
index 000000000000..eecee25445e2
--- /dev/null
+++ b/cmds/idmap2/include/idmap2/Policies.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include "androidfw/ResourceTypes.h"
+#include "androidfw/StringPiece.h"
+
+#include "Result.h"
+
+#ifndef IDMAP2_INCLUDE_IDMAP2_POLICIES_H_
+#define IDMAP2_INCLUDE_IDMAP2_POLICIES_H_
+
+namespace android::idmap2 {
+
+using PolicyFlags = ResTable_overlayable_policy_header::PolicyFlags;
+using PolicyBitmask = uint32_t;
+
+// Parses a the string representation of a set of policies into a bitmask. The format of the string
+// is the same as for the <policy> element.
+Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies,
+ std::ostream& err);
+
+} // namespace android::idmap2
+
+#endif // IDMAP2_INCLUDE_IDMAP2_POLICIES_H_
diff --git a/cmds/idmap2/include/idmap2/ResourceUtils.h b/cmds/idmap2/include/idmap2/ResourceUtils.h
index 323796b05986..22827ac45f9b 100644
--- a/cmds/idmap2/include/idmap2/ResourceUtils.h
+++ b/cmds/idmap2/include/idmap2/ResourceUtils.h
@@ -17,6 +17,8 @@
#ifndef IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_
#define IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_
+#include <optional>
+#include <ostream>
#include <string>
#include "android-base/macros.h"
@@ -24,9 +26,21 @@
#include "idmap2/Idmap.h"
#include "idmap2/Result.h"
+#include "idmap2/ZipFile.h"
namespace android::idmap2::utils {
+struct OverlayManifestInfo {
+ std::string target_package; // NOLINT(misc-non-private-member-variables-in-classes)
+ std::string target_name; // NOLINT(misc-non-private-member-variables-in-classes)
+ bool is_static; // NOLINT(misc-non-private-member-variables-in-classes)
+ int priority = -1; // NOLINT(misc-non-private-member-variables-in-classes)
+};
+
+Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
+ std::ostream& out_error,
+ bool assert_overlay = true);
+
Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, ResourceId resid);
} // namespace android::idmap2::utils
diff --git a/cmds/idmap2/libidmap2/CommandLineOptions.cpp b/cmds/idmap2/libidmap2/CommandLineOptions.cpp
index cabc8f398c46..a49a607091a4 100644
--- a/cmds/idmap2/libidmap2/CommandLineOptions.cpp
+++ b/cmds/idmap2/libidmap2/CommandLineOptions.cpp
@@ -68,9 +68,18 @@ CommandLineOptions& CommandLineOptions::OptionalOption(const std::string& name,
return *this;
}
+CommandLineOptions& CommandLineOptions::OptionalOption(const std::string& name,
+ const std::string& description,
+ std::vector<std::string>* value) {
+ assert(value != nullptr);
+ auto func = [value](const std::string& arg) -> void { value->push_back(arg); };
+ options_.push_back(Option{name, description, func, Option::COUNT_OPTIONAL_ONCE_OR_MORE, true});
+ return *this;
+}
+
bool CommandLineOptions::Parse(const std::vector<std::string>& argv, std::ostream& outError) const {
const auto pivot = std::partition(options_.begin(), options_.end(), [](const Option& opt) {
- return opt.count != Option::COUNT_OPTIONAL;
+ return opt.count != Option::COUNT_OPTIONAL && opt.count != Option::COUNT_OPTIONAL_ONCE_OR_MORE;
});
std::set<std::string> mandatory_opts;
std::transform(options_.begin(), pivot, std::inserter(mandatory_opts, mandatory_opts.end()),
@@ -122,7 +131,8 @@ void CommandLineOptions::Usage(std::ostream& out) const {
size_t maxLength = 0;
out << "usage: " << name_;
for (const Option& opt : options_) {
- const bool mandatory = opt.count != Option::COUNT_OPTIONAL;
+ const bool mandatory =
+ opt.count != Option::COUNT_OPTIONAL && opt.count != Option::COUNT_OPTIONAL_ONCE_OR_MORE;
out << " ";
if (!mandatory) {
out << "[";
@@ -134,9 +144,15 @@ void CommandLineOptions::Usage(std::ostream& out) const {
out << opt.name;
maxLength = std::max(maxLength, opt.name.size());
}
+
+ if (opt.count == Option::COUNT_OPTIONAL_ONCE_OR_MORE) {
+ out << " [..]";
+ }
+
if (!mandatory) {
out << "]";
}
+
if (opt.count == Option::COUNT_ONCE_OR_MORE) {
out << " [" << opt.name << " arg [..]]";
}
@@ -150,7 +166,8 @@ void CommandLineOptions::Usage(std::ostream& out) const {
out << opt.name;
}
out << " " << opt.description;
- if (opt.count == Option::COUNT_ONCE_OR_MORE) {
+ if (opt.count == Option::COUNT_ONCE_OR_MORE ||
+ opt.count == Option::COUNT_OPTIONAL_ONCE_OR_MORE) {
out << " (can be provided multiple times)";
}
out << std::endl;
diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp
index 37d6af8fa477..5d449e96663e 100644
--- a/cmds/idmap2/libidmap2/Idmap.cpp
+++ b/cmds/idmap2/libidmap2/Idmap.cpp
@@ -274,11 +274,30 @@ std::unique_ptr<const Idmap> Idmap::FromBinaryStream(std::istream& stream,
return std::move(idmap);
}
-std::unique_ptr<const Idmap> Idmap::FromApkAssets(const std::string& target_apk_path,
- const ApkAssets& target_apk_assets,
- const std::string& overlay_apk_path,
- const ApkAssets& overlay_apk_assets,
- std::ostream& out_error) {
+bool CheckOverlayable(const LoadedPackage& target_package,
+ const utils::OverlayManifestInfo& overlay_info,
+ const PolicyBitmask& fulfilled_polices, const ResourceId& resid) {
+ const OverlayableInfo* overlayable_info = target_package.GetOverlayableInfo(resid);
+ if (overlayable_info == nullptr) {
+ // If the resource does not have an overlayable definition, allow the resource to be overlaid.
+ // Once overlayable enforcement is turned on, this check will return false.
+ return true;
+ }
+
+ if (!overlay_info.target_name.empty() && overlay_info.target_name != overlayable_info->name) {
+ // If the overlay supplies a target overlayable name, the resource must belong to the
+ // overlayable defined with the specified name to be overlaid.
+ return false;
+ }
+
+ // Enforce policy restrictions if the resource is declared as overlayable.
+ return (overlayable_info->policy_flags & fulfilled_polices) != 0;
+}
+
+std::unique_ptr<const Idmap> Idmap::FromApkAssets(
+ const std::string& target_apk_path, const ApkAssets& target_apk_assets,
+ const std::string& overlay_apk_path, const ApkAssets& overlay_apk_assets,
+ const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, std::ostream& out_error) {
AssetManager2 target_asset_manager;
if (!target_asset_manager.SetApkAssets({&target_apk_assets}, true, false)) {
out_error << "error: failed to create target asset manager" << std::endl;
@@ -327,6 +346,12 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets(const std::string& target_apk_
return nullptr;
}
+ Result<utils::OverlayManifestInfo> overlay_info =
+ utils::ExtractOverlayManifestInfo(overlay_apk_path, out_error);
+ if (!overlay_info) {
+ return nullptr;
+ }
+
std::unique_ptr<IdmapHeader> header(new IdmapHeader());
header->magic_ = kIdmapMagic;
header->version_ = kIdmapCurrentVersion;
@@ -380,6 +405,14 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets(const std::string& target_apk_
if (target_resid == 0) {
continue;
}
+
+ if (enforce_overlayable &&
+ !CheckOverlayable(*target_pkg, *overlay_info, fulfilled_policies, target_resid)) {
+ LOG(WARNING) << "overlay \"" << overlay_apk_path << "\" is not allowed to overlay resource \""
+ << full_name << "\"" << std::endl;
+ continue;
+ }
+
matching_resources.Add(target_resid, overlay_resid);
}
diff --git a/cmds/idmap2/libidmap2/Policies.cpp b/cmds/idmap2/libidmap2/Policies.cpp
new file mode 100644
index 000000000000..0f87ef0c4ea9
--- /dev/null
+++ b/cmds/idmap2/libidmap2/Policies.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include <iterator>
+#include <map>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "androidfw/ResourceTypes.h"
+
+#include "idmap2/Idmap.h"
+#include "idmap2/Policies.h"
+#include "idmap2/Result.h"
+
+namespace android::idmap2 {
+
+namespace {
+
+const std::map<android::StringPiece, PolicyFlags> kStringToFlag = {
+ {"public", PolicyFlags::POLICY_PUBLIC},
+ {"product", PolicyFlags::POLICY_PRODUCT_PARTITION},
+ {"system", PolicyFlags::POLICY_SYSTEM_PARTITION},
+ {"vendor", PolicyFlags::POLICY_VENDOR_PARTITION},
+};
+} // namespace
+
+Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies,
+ std::ostream& err) {
+ PolicyBitmask bitmask = 0;
+ for (const std::string& policy : policies) {
+ const auto iter = kStringToFlag.find(policy);
+ if (iter != kStringToFlag.end()) {
+ bitmask |= iter->second;
+ } else {
+ err << "error: unknown policy \"" << policy << "\"";
+ return kResultError;
+ }
+ }
+
+ return Result<PolicyBitmask>(bitmask);
+}
+
+} // namespace android::idmap2
diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
index ec2decf782e2..b78e942d4049 100644
--- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
+++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
@@ -89,6 +89,7 @@ void RawPrintVisitor::visit(const IdmapData::TypeEntry& type_entry) {
}
}
+// NOLINTNEXTLINE(cert-dcl50-cpp)
void RawPrintVisitor::print(uint16_t value, const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
@@ -101,6 +102,7 @@ void RawPrintVisitor::print(uint16_t value, const char* fmt, ...) {
offset_ += sizeof(uint16_t);
}
+// NOLINTNEXTLINE(cert-dcl50-cpp)
void RawPrintVisitor::print(uint32_t value, const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
@@ -113,6 +115,7 @@ void RawPrintVisitor::print(uint32_t value, const char* fmt, ...) {
offset_ += sizeof(uint32_t);
}
+// NOLINTNEXTLINE(cert-dcl50-cpp)
void RawPrintVisitor::print(const std::string& value, const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp
index 04e0ec756045..7a984f3f98ad 100644
--- a/cmds/idmap2/libidmap2/ResourceUtils.cpp
+++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include <memory>
#include <string>
#include "androidfw/StringPiece.h"
@@ -21,8 +22,13 @@
#include "idmap2/ResourceUtils.h"
#include "idmap2/Result.h"
+#include "idmap2/Xml.h"
+#include "idmap2/ZipFile.h"
using android::StringPiece16;
+using android::idmap2::Result;
+using android::idmap2::Xml;
+using android::idmap2::ZipFile;
using android::util::Utf16ToUtf8;
namespace android::idmap2::utils {
@@ -47,4 +53,63 @@ Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, Reso
return {out};
}
+Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
+ std::ostream& out_error,
+ bool assert_overlay) {
+ std::unique_ptr<const ZipFile> zip = ZipFile::Open(path);
+ if (!zip) {
+ out_error << "error: failed to open " << path << " as a zip file" << std::endl;
+ return kResultError;
+ }
+
+ std::unique_ptr<const MemoryChunk> entry = zip->Uncompress("AndroidManifest.xml");
+ if (!entry) {
+ out_error << "error: failed to uncompress AndroidManifest.xml from " << path << std::endl;
+ return kResultError;
+ }
+
+ std::unique_ptr<const Xml> xml = Xml::Create(entry->buf, entry->size);
+ if (!xml) {
+ out_error << "error: failed to parse AndroidManifest.xml from " << path << std::endl;
+ return kResultError;
+ }
+
+ OverlayManifestInfo info{};
+ const auto tag = xml->FindTag("overlay");
+ if (!tag) {
+ if (assert_overlay) {
+ out_error << "error: <overlay> missing from AndroidManifest.xml of " << path << std::endl;
+ return kResultError;
+ }
+ return info;
+ }
+
+ auto iter = tag->find("targetPackage");
+ if (iter == tag->end()) {
+ if (assert_overlay) {
+ out_error << "error: android:targetPackage missing from <overlay> of " << path << std::endl;
+ return kResultError;
+ }
+ } else {
+ info.target_package = iter->second;
+ }
+
+ iter = tag->find("targetName");
+ if (iter != tag->end()) {
+ info.target_name = iter->second;
+ }
+
+ iter = tag->find("isStatic");
+ if (iter != tag->end()) {
+ info.is_static = std::stoul(iter->second) != 0U;
+ }
+
+ iter = tag->find("priority");
+ if (iter != tag->end()) {
+ info.priority = std::stoi(iter->second);
+ }
+
+ return info;
+}
+
} // namespace android::idmap2::utils
diff --git a/cmds/idmap2/static-checks.sh b/cmds/idmap2/static-checks.sh
index 560ccb692bb1..ad9830b8a096 100755
--- a/cmds/idmap2/static-checks.sh
+++ b/cmds/idmap2/static-checks.sh
@@ -70,7 +70,15 @@ function _bpfmt()
function _cpplint()
{
local cpplint="${ANDROID_BUILD_TOP}/tools/repohooks/tools/cpplint.py"
- $cpplint --quiet $cpp_files
+ local output="$($cpplint --quiet $cpp_files 2>&1 >/dev/null | grep -v \
+ -e 'Found C system header after C++ system header.' \
+ -e 'Unknown NOLINT error category: misc-non-private-member-variables-in-classes' \
+ )"
+ if [[ "$output" ]]; then
+ echo "$output"
+ return 1
+ fi
+ return 0
}
function _parse_args()
diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp
index 2698ac0a734d..0e0e25f4f0f3 100644
--- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp
+++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp
@@ -78,7 +78,8 @@ TEST(BinaryStreamVisitorTests, CreateIdmapFromApkAssetsInteropWithLoadedIdmap) {
std::stringstream error;
std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
std::stringstream stream;
@@ -101,25 +102,55 @@ TEST(BinaryStreamVisitorTests, CreateIdmapFromApkAssetsInteropWithLoadedIdmap) {
header = loaded_idmap->GetEntryMapForType(0x02);
ASSERT_THAT(header, NotNull());
- success = LoadedIdmap::Lookup(header, 0x0002, &entry);
+ success = LoadedIdmap::Lookup(header, 0x0000, &entry); // string/a
ASSERT_FALSE(success);
- success = LoadedIdmap::Lookup(header, 0x0003, &entry);
+ success = LoadedIdmap::Lookup(header, 0x0001, &entry); // string/b
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0002, &entry); // string/c
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0003, &entry); // string/other
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0004, &entry); // string/not_overlayable
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0005, &entry); // string/policy_product
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0006, &entry); // string/policy_public
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0007, &entry); // string/policy_system
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0008, &entry); // string/policy_system_vendor
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x0009, &entry); // string/str1
ASSERT_TRUE(success);
ASSERT_EQ(entry, 0x0000);
- success = LoadedIdmap::Lookup(header, 0x0004, &entry);
+ success = LoadedIdmap::Lookup(header, 0x000a, &entry); // string/str2
ASSERT_FALSE(success);
- success = LoadedIdmap::Lookup(header, 0x0005, &entry);
+ success = LoadedIdmap::Lookup(header, 0x000b, &entry); // string/str3
ASSERT_TRUE(success);
ASSERT_EQ(entry, 0x0001);
- success = LoadedIdmap::Lookup(header, 0x0006, &entry);
+ success = LoadedIdmap::Lookup(header, 0x000c, &entry); // string/str4
ASSERT_TRUE(success);
ASSERT_EQ(entry, 0x0002);
- success = LoadedIdmap::Lookup(header, 0x0007, &entry);
+ success = LoadedIdmap::Lookup(header, 0x000d, &entry); // string/x
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x000e, &entry); // string/y
+ ASSERT_FALSE(success);
+
+ success = LoadedIdmap::Lookup(header, 0x000f, &entry); // string/z
ASSERT_FALSE(success);
}
diff --git a/cmds/idmap2/tests/CommandLineOptionsTests.cpp b/cmds/idmap2/tests/CommandLineOptionsTests.cpp
index c27d27a16b94..39f18d3336af 100644
--- a/cmds/idmap2/tests/CommandLineOptionsTests.cpp
+++ b/cmds/idmap2/tests/CommandLineOptionsTests.cpp
@@ -121,6 +121,56 @@ TEST(CommandLineOptionsTests, OptionalOption) {
ASSERT_FALSE(success);
}
+TEST(CommandLineOptionsTests, OptionalOptionList) {
+ std::vector<std::string> foo;
+ std::vector<std::string> bar;
+ CommandLineOptions opts = CommandLineOptions("test")
+ .OptionalOption("--foo", "", &foo)
+ .OptionalOption("--bar", "", &bar);
+ std::ostream fakeStdErr(nullptr);
+ bool success = opts.Parse({"--foo", "FOO", "--bar", "BAR"}, fakeStdErr);
+ ASSERT_TRUE(success);
+ ASSERT_EQ(foo.size(), 1U);
+ ASSERT_EQ(foo[0], "FOO");
+ ASSERT_EQ(bar.size(), 1U);
+ ASSERT_EQ(bar[0], "BAR");
+
+ foo.clear();
+ bar.clear();
+ success = opts.Parse({"--foo", "BAZ"}, fakeStdErr);
+ ASSERT_TRUE(success);
+ ASSERT_EQ(foo.size(), 1U);
+ ASSERT_EQ(foo[0], "BAZ");
+ ASSERT_EQ(bar.size(), 0U);
+
+ foo.clear();
+ bar.clear();
+ success =
+ opts.Parse({"--foo", "BAZ", "--foo", "BIZ", "--bar", "FIZ", "--bar", "FUZZ"}, fakeStdErr);
+ ASSERT_TRUE(success);
+ ASSERT_EQ(foo.size(), 2U);
+ ASSERT_EQ(foo[0], "BAZ");
+ ASSERT_EQ(foo[1], "BIZ");
+ ASSERT_EQ(bar.size(), 2U);
+ ASSERT_EQ(bar[0], "FIZ");
+ ASSERT_EQ(bar[1], "FUZZ");
+
+ foo.clear();
+ bar.clear();
+ success = opts.Parse({"--foo"}, fakeStdErr);
+ ASSERT_FALSE(success);
+
+ foo.clear();
+ bar.clear();
+ success = opts.Parse({"--foo", "--bar", "BAR"}, fakeStdErr);
+ ASSERT_FALSE(success);
+
+ foo.clear();
+ bar.clear();
+ success = opts.Parse({"--foo", "FOO", "--bar"}, fakeStdErr);
+ ASSERT_FALSE(success);
+}
+
TEST(CommandLineOptionsTests, CornerCases) {
std::string foo;
std::string bar;
@@ -172,6 +222,7 @@ TEST(CommandLineOptionsTests, Usage) {
bool arg5 = false;
bool arg6 = false;
std::vector<std::string> arg7;
+ std::vector<std::string> arg8;
CommandLineOptions opts = CommandLineOptions("test")
.MandatoryOption("--aa", "description-aa", &arg1)
.OptionalFlag("--bb", "description-bb", &arg5)
@@ -179,12 +230,13 @@ TEST(CommandLineOptionsTests, Usage) {
.OptionalOption("--dd", "description-dd", &arg3)
.MandatoryOption("--ee", "description-ee", &arg4)
.OptionalFlag("--ff", "description-ff", &arg6)
- .MandatoryOption("--gg", "description-gg", &arg7);
+ .MandatoryOption("--gg", "description-gg", &arg7)
+ .OptionalOption("--hh", "description-hh", &arg8);
std::stringstream stream;
opts.Usage(stream);
const std::string s = stream.str();
ASSERT_NE(s.find("usage: test --aa arg [--bb] [--cc arg] [--dd arg] --ee arg [--ff] --gg arg "
- "[--gg arg [..]]"),
+ "[--gg arg [..]] [--hh arg [..]]"),
std::string::npos);
ASSERT_NE(s.find("--aa arg description-aa"), std::string::npos);
ASSERT_NE(s.find("--ff description-ff"), std::string::npos);
diff --git a/cmds/idmap2/tests/FileUtilsTests.cpp b/cmds/idmap2/tests/FileUtilsTests.cpp
index 4bf832a34691..d9d9a7f829cf 100644
--- a/cmds/idmap2/tests/FileUtilsTests.cpp
+++ b/cmds/idmap2/tests/FileUtilsTests.cpp
@@ -37,10 +37,10 @@ TEST(FileUtilsTests, FindFilesFindEverythingNonRecursive) {
[](unsigned char type ATTRIBUTE_UNUSED,
const std::string& path ATTRIBUTE_UNUSED) -> bool { return true; });
ASSERT_THAT(v, NotNull());
- ASSERT_EQ(v->size(), 4U);
- ASSERT_EQ(
- std::set<std::string>(v->begin(), v->end()),
- std::set<std::string>({root + "/.", root + "/..", root + "/overlay", root + "/target"}));
+ ASSERT_EQ(v->size(), 6U);
+ ASSERT_EQ(std::set<std::string>(v->begin(), v->end()),
+ std::set<std::string>({root + "/.", root + "/..", root + "/overlay", root + "/target",
+ root + "/system-overlay", root + "/system-overlay-invalid"}));
}
TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) {
@@ -49,11 +49,13 @@ TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) {
return type == DT_REG && path.size() > 4 && path.compare(path.size() - 4, 4, ".apk") == 0;
});
ASSERT_THAT(v, NotNull());
- ASSERT_EQ(v->size(), 4U);
+ ASSERT_EQ(v->size(), 6U);
ASSERT_EQ(std::set<std::string>(v->begin(), v->end()),
std::set<std::string>({root + "/target/target.apk", root + "/overlay/overlay.apk",
root + "/overlay/overlay-static-1.apk",
- root + "/overlay/overlay-static-2.apk"}));
+ root + "/overlay/overlay-static-2.apk",
+ root + "/system-overlay/system-overlay.apk",
+ root + "/system-overlay-invalid/system-overlay-invalid.apk"}));
}
TEST(FileUtilsTests, ReadFile) {
diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
index 22f48e9a396f..4334fa60767b 100644
--- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp
+++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
@@ -38,6 +38,7 @@
#include "gtest/gtest.h"
#include "androidfw/PosixUtils.h"
+
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
@@ -114,8 +115,9 @@ TEST_F(Idmap2BinaryTests, Dump) {
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
ASSERT_NE(result->stdout.find("0x7f010000 -> 0x7f010000 integer/int1"), std::string::npos);
- ASSERT_NE(result->stdout.find("0x7f020003 -> 0x7f020000 string/str1"), std::string::npos);
- ASSERT_NE(result->stdout.find("0x7f020005 -> 0x7f020001 string/str3"), std::string::npos);
+ ASSERT_NE(result->stdout.find("0x7f020009 -> 0x7f020000 string/str1"), std::string::npos);
+ ASSERT_NE(result->stdout.find("0x7f02000b -> 0x7f020001 string/str3"), std::string::npos);
+ ASSERT_NE(result->stdout.find("0x7f02000c -> 0x7f020002 string/str4"), std::string::npos);
ASSERT_EQ(result->stdout.find("00000210: 007f target package id"), std::string::npos);
// clang-format off
@@ -157,7 +159,8 @@ TEST_F(Idmap2BinaryTests, Scan) {
"--recursive",
"--target-package-name", "test.target",
"--target-apk-path", GetTargetApkPath(),
- "--output-directory", GetTempDirPath()});
+ "--output-directory", GetTempDirPath(),
+ "--override-policy", "public"});
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
@@ -190,7 +193,8 @@ TEST_F(Idmap2BinaryTests, Scan) {
"--input-directory", GetTestDataPath() + "/overlay",
"--target-package-name", "test.target",
"--target-apk-path", GetTargetApkPath(),
- "--output-directory", GetTempDirPath()});
+ "--output-directory", GetTempDirPath(),
+ "--override-policy", "public"});
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
@@ -207,7 +211,8 @@ TEST_F(Idmap2BinaryTests, Scan) {
"--recursive",
"--target-package-name", "test.target",
"--target-apk-path", GetTargetApkPath(),
- "--output-directory", GetTempDirPath()});
+ "--output-directory", GetTempDirPath(),
+ "--override-policy", "public"});
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
@@ -222,7 +227,8 @@ TEST_F(Idmap2BinaryTests, Scan) {
"--input-directory", GetTempDirPath(),
"--target-package-name", "test.target",
"--target-apk-path", GetTargetApkPath(),
- "--output-directory", GetTempDirPath()});
+ "--output-directory", GetTempDirPath(),
+ "--override-policy", "public"});
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
@@ -245,7 +251,7 @@ TEST_F(Idmap2BinaryTests, Lookup) {
"lookup",
"--idmap-path", GetIdmapPath(),
"--config", "",
- "--resid", "0x7f020003"}); // string/str1
+ "--resid", "0x7f020009"}); // string/str1
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
@@ -310,6 +316,18 @@ TEST_F(Idmap2BinaryTests, InvalidCommandLineOptions) {
// clang-format on
ASSERT_THAT(result, NotNull());
ASSERT_NE(result->status, EXIT_SUCCESS);
+
+ // unknown policy
+ // clang-format off
+ result = ExecuteBinary({"idmap2",
+ "create",
+ "--target-apk-path", GetTargetApkPath(),
+ "--overlay-apk-path", GetOverlayApkPath(),
+ "--idmap-path", GetIdmapPath(),
+ "--policy", "this-does-not-exist"});
+ // clang-format on
+ ASSERT_THAT(result, NotNull());
+ ASSERT_NE(result->status, EXIT_SUCCESS);
}
} // namespace android::idmap2
diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp
index 963f22ec8d72..df28918ac9b4 100644
--- a/cmds/idmap2/tests/IdmapTests.cpp
+++ b/cmds/idmap2/tests/IdmapTests.cpp
@@ -184,13 +184,14 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) {
std::stringstream error;
std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
ASSERT_THAT(idmap->GetHeader(), NotNull());
ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U);
ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x01U);
- ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0xf5ad1d1d);
+ ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0xab7cf70d);
ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0xd470336b);
ASSERT_EQ(idmap->GetHeader()->GetTargetPath().to_string(), target_apk_path);
ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path);
@@ -216,13 +217,129 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) {
ASSERT_EQ(types[1]->GetTargetTypeId(), 0x02U);
ASSERT_EQ(types[1]->GetOverlayTypeId(), 0x02U);
ASSERT_EQ(types[1]->GetEntryCount(), 4U);
- ASSERT_EQ(types[1]->GetEntryOffset(), 3U);
+ ASSERT_EQ(types[1]->GetEntryOffset(), 9U);
ASSERT_EQ(types[1]->GetEntry(0), 0x0000U);
ASSERT_EQ(types[1]->GetEntry(1), kNoEntry);
ASSERT_EQ(types[1]->GetEntry(2), 0x0001U);
ASSERT_EQ(types[1]->GetEntry(3), 0x0002U);
}
+TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublic) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() + "/system-overlay/system-overlay.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ true, error);
+ ASSERT_THAT(idmap, NotNull());
+
+ const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
+ ASSERT_EQ(dataBlocks.size(), 1U);
+
+ const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
+
+ ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
+ ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U);
+
+ const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
+ ASSERT_EQ(types.size(), 1U);
+
+ ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U);
+ ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
+ ASSERT_EQ(types[0]->GetEntryCount(), 3U);
+ ASSERT_EQ(types[0]->GetEntryOffset(), 6U);
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_system_vendor
+}
+
+TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/system-overlay-invalid/system-overlay-invalid.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ true, error);
+ ASSERT_THAT(idmap, NotNull());
+
+ const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
+ ASSERT_EQ(dataBlocks.size(), 1U);
+
+ const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
+
+ ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
+ ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U);
+
+ const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
+ ASSERT_EQ(types.size(), 1U);
+
+ ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U);
+ ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
+ ASSERT_EQ(types[0]->GetEntryCount(), 6U);
+ ASSERT_EQ(types[0]->GetEntryOffset(), 3U);
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable
+ ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/other
+ ASSERT_EQ(types[0]->GetEntry(2), kNoEntry); // string/policy_product
+ ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system_vendor
+}
+
+TEST(IdmapTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgnoreOverlayable) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/system-overlay-invalid/system-overlay-invalid.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ false, error);
+ ASSERT_THAT(idmap, NotNull());
+
+ const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
+ ASSERT_EQ(dataBlocks.size(), 1U);
+
+ const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
+
+ ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
+ ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U);
+
+ const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
+ ASSERT_EQ(types.size(), 1U);
+
+ ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U);
+ ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
+ ASSERT_EQ(types[0]->GetEntryCount(), 6U);
+ ASSERT_EQ(types[0]->GetEntryOffset(), 3U);
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable
+ ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other
+ ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product
+ ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system_vendor
+}
+
TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) {
std::string target_apk_path(GetTestDataPath());
for (int i = 0; i < 32; i++) {
@@ -239,7 +356,8 @@ TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) {
std::stringstream error;
std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, IsNull());
}
@@ -255,8 +373,9 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) {
ASSERT_THAT(overlay_apk, NotNull());
std::stringstream error;
- std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ std::unique_ptr<const Idmap> idmap = Idmap::FromApkAssets(
+ target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
std::stringstream stream;
diff --git a/cmds/idmap2/tests/PoliciesTests.cpp b/cmds/idmap2/tests/PoliciesTests.cpp
new file mode 100644
index 000000000000..ab567adc6f19
--- /dev/null
+++ b/cmds/idmap2/tests/PoliciesTests.cpp
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include <string>
+
+#include "gtest/gtest.h"
+
+#include "TestHelpers.h"
+#include "idmap2/Policies.h"
+
+using android::idmap2::PolicyBitmask;
+using android::idmap2::PolicyFlags;
+
+namespace android::idmap2 {
+
+TEST(PoliciesTests, PoliciesToBitmasks) {
+ const Result<PolicyBitmask> bitmask1 = PoliciesToBitmask({"system"}, std::cerr);
+ ASSERT_NE(bitmask1, kResultError);
+ ASSERT_EQ(bitmask1, PolicyFlags::POLICY_SYSTEM_PARTITION);
+
+ const Result<PolicyBitmask> bitmask2 = PoliciesToBitmask({"system", "vendor"}, std::cerr);
+ ASSERT_NE(bitmask2, kResultError);
+ ASSERT_EQ(bitmask2, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
+
+ const Result<PolicyBitmask> bitmask3 = PoliciesToBitmask({"vendor", "system"}, std::cerr);
+ ASSERT_NE(bitmask3, kResultError);
+ ASSERT_EQ(bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
+
+ const Result<PolicyBitmask> bitmask4 =
+ PoliciesToBitmask({"public", "product", "system", "vendor"}, std::cerr);
+ ASSERT_NE(bitmask4, kResultError);
+ ASSERT_EQ(bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION |
+ PolicyFlags::POLICY_SYSTEM_PARTITION |
+ PolicyFlags::POLICY_VENDOR_PARTITION);
+
+ const Result<PolicyBitmask> bitmask5 =
+ PoliciesToBitmask({"system", "system", "system"}, std::cerr);
+ ASSERT_NE(bitmask5, kResultError);
+ ASSERT_EQ(bitmask5, PolicyFlags::POLICY_SYSTEM_PARTITION);
+
+ const Result<PolicyBitmask> bitmask6 = PoliciesToBitmask({""}, std::cerr);
+ ASSERT_EQ(bitmask6, kResultError);
+
+ const Result<PolicyBitmask> bitmask7 = PoliciesToBitmask({"foo"}, std::cerr);
+ ASSERT_EQ(bitmask7, kResultError);
+
+ const Result<PolicyBitmask> bitmask8 = PoliciesToBitmask({"system", "foo"}, std::cerr);
+ ASSERT_EQ(bitmask8, kResultError);
+
+ const Result<PolicyBitmask> bitmask9 = PoliciesToBitmask({"system", ""}, std::cerr);
+ ASSERT_EQ(bitmask9, kResultError);
+
+ const Result<PolicyBitmask> bitmask10 = PoliciesToBitmask({"system "}, std::cerr);
+ ASSERT_EQ(bitmask10, kResultError);
+}
+
+} // namespace android::idmap2
diff --git a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp
index 7736bc063131..eaa47cd79533 100644
--- a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp
+++ b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp
@@ -25,6 +25,7 @@
#include "androidfw/Idmap.h"
#include "idmap2/Idmap.h"
+#include "idmap2/Policies.h"
#include "idmap2/PrettyPrintVisitor.h"
#include "TestHelpers.h"
@@ -32,6 +33,7 @@
using ::testing::NotNull;
using android::ApkAssets;
+using android::idmap2::PolicyBitmask;
namespace android::idmap2 {
@@ -46,7 +48,8 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitor) {
std::stringstream error;
std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
std::stringstream stream;
diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp
index 0318cd20a9bb..b1ca12557dcb 100644
--- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp
+++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp
@@ -42,7 +42,8 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) {
std::stringstream error;
std::unique_ptr<const Idmap> idmap =
- Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, error);
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
std::stringstream stream;
@@ -51,7 +52,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) {
ASSERT_NE(stream.str().find("00000000: 504d4449 magic\n"), std::string::npos);
ASSERT_NE(stream.str().find("00000004: 00000001 version\n"), std::string::npos);
- ASSERT_NE(stream.str().find("00000008: f5ad1d1d target crc\n"), std::string::npos);
+ ASSERT_NE(stream.str().find("00000008: ab7cf70d target crc\n"), std::string::npos);
ASSERT_NE(stream.str().find("0000000c: d470336b overlay crc\n"), std::string::npos);
ASSERT_NE(stream.str().find("0000021c: 00000000 0x7f010000 -> 0x7f010000 integer/int1\n"),
std::string::npos);
diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml b/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml
new file mode 100644
index 000000000000..ae687d375e7f
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay-invalid/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="test.overlay.system.invalid">
+ <overlay
+ android:targetPackage="test.target"
+ android:targetName="TestResources"/>
+</manifest>
diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/build b/cmds/idmap2/tests/data/system-overlay-invalid/build
new file mode 100644
index 000000000000..920e1f8ad6f3
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay-invalid/build
@@ -0,0 +1,26 @@
+# Copyright (C) 2019 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.
+
+FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
+
+aapt2 compile --dir res -o compiled.flata
+
+aapt2 link \
+ --no-resource-removal \
+ -I "$FRAMEWORK_RES_APK" \
+ --manifest AndroidManifest.xml \
+ -o system-overlay-invalid.apk \
+ compiled.flata
+
+rm compiled.flata
diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml b/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml
new file mode 100644
index 000000000000..af1bea16daee
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<resources>
+ <!-- This overlay will fulfill the policies "public|system". This allows it overlay the
+ following resources. -->
+ <string name="policy_system">policy_system</string>
+ <string name="policy_system_vendor">policy_system_vendor</string>
+ <string name="policy_public">policy_public</string>
+
+ <!-- Requests to overlay a resource that belongs to a policy the overlay does not fulfill. -->
+ <string name="policy_product">policy_product</string>
+
+ <!-- Requests to overlay a resource that is not declared as overlayable. -->
+ <string name="not_overlayable">not_overlayable</string>
+
+ <!-- Requests to overlay a resource that is defined in an overlayable with a name other than
+ the targetName in the manifest. -->
+ <string name="other">other</string>
+</resources>
diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk b/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk
new file mode 100644
index 000000000000..710ed9067f69
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk
Binary files differ
diff --git a/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml b/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml
new file mode 100644
index 000000000000..8af9064ba64f
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="test.overlay.system">
+ <overlay
+ android:targetPackage="test.target" />
+</manifest>
diff --git a/cmds/idmap2/tests/data/system-overlay/build b/cmds/idmap2/tests/data/system-overlay/build
new file mode 100644
index 000000000000..be0d2390f535
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay/build
@@ -0,0 +1,26 @@
+# Copyright (C) 2019 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.
+
+FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
+
+aapt2 compile --dir res -o compiled.flata
+
+aapt2 link \
+ --no-resource-removal \
+ -I "$FRAMEWORK_RES_APK" \
+ --manifest AndroidManifest.xml \
+ -o system-overlay.apk \
+ compiled.flata
+
+rm compiled.flata
diff --git a/cmds/idmap2/tests/data/system-overlay/res/values/values.xml b/cmds/idmap2/tests/data/system-overlay/res/values/values.xml
new file mode 100644
index 000000000000..6aaa0b02639e
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay/res/values/values.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<resources>
+ <!-- This overlay will fulfill the policies "public|system". This allows it overlay the
+ following resources. -->
+ <string name="policy_system">policy_system</string>
+ <string name="policy_system_vendor">policy_system_vendor</string>
+ <string name="policy_public">policy_public</string>
+</resources>
diff --git a/cmds/idmap2/tests/data/system-overlay/system-overlay.apk b/cmds/idmap2/tests/data/system-overlay/system-overlay.apk
new file mode 100644
index 000000000000..90f30eb68c15
--- /dev/null
+++ b/cmds/idmap2/tests/data/system-overlay/system-overlay.apk
Binary files differ
diff --git a/cmds/idmap2/tests/data/target/res/values/overlayable.xml b/cmds/idmap2/tests/data/target/res/values/overlayable.xml
new file mode 100644
index 000000000000..02d25630546f
--- /dev/null
+++ b/cmds/idmap2/tests/data/target/res/values/overlayable.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<resources>
+<overlayable name="TestResources">
+ <!-- Publicly overlayable resources -->
+ <item type="string" name="a" />
+ <item type="string" name="b" />
+ <item type="string" name="c" />
+ <item type="string" name="str1" />
+ <item type="string" name="str2" />
+ <item type="string" name="str3" />
+ <item type="string" name="str4" />
+ <item type="string" name="x" />
+ <item type="string" name="y" />
+ <item type="string" name="z" />
+ <item type="integer" name="int1" />
+
+ <!-- Resources with partition restrictins -->
+ <policy type="system">
+ <item type="string" name="policy_system" />
+ </policy>
+
+ <policy type="system|vendor">
+ <item type="string" name="policy_system_vendor" />
+ </policy>
+
+ <policy type="product">
+ <item type="string" name="policy_product" />
+ </policy>
+
+ <policy type="public">
+ <item type="string" name="policy_public" />
+ </policy>
+</overlayable>
+
+<overlayable name="OtherResources">
+ <item type="string" name="other" />
+</overlayable>
+</resources> \ No newline at end of file
diff --git a/cmds/idmap2/tests/data/target/res/values/values.xml b/cmds/idmap2/tests/data/target/res/values/values.xml
index 56bf0d60021a..0d337f3890a8 100644
--- a/cmds/idmap2/tests/data/target/res/values/values.xml
+++ b/cmds/idmap2/tests/data/target/res/values/values.xml
@@ -25,4 +25,14 @@
<string name="y">y</string>
<string name="z">z</string>
<integer name="int1">1</integer>
+
+ <!-- This resources is not marked as overlayable -->
+ <string name="not_overlayable">not_overlayable</string>
+
+ <string name="policy_system">policy_system</string>
+ <string name="policy_system_vendor">policy_system_vendor</string>
+ <string name="policy_product">policy_product</string>
+ <string name="policy_public">policy_public</string>
+
+ <item type="string" name="other" />
</resources>
diff --git a/cmds/idmap2/tests/data/target/target.apk b/cmds/idmap2/tests/data/target/target.apk
index 18ecc276caae..ecbe87578684 100644
--- a/cmds/idmap2/tests/data/target/target.apk
+++ b/cmds/idmap2/tests/data/target/target.apk
Binary files differ
diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java
index 74edffb4738d..0c861cfd3e63 100644
--- a/cmds/input/src/com/android/commands/input/Input.java
+++ b/cmds/input/src/com/android/commands/input/Input.java
@@ -16,15 +16,20 @@
package com.android.commands.input;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
+
import android.hardware.input.InputManager;
import android.os.SystemClock;
-import android.util.Log;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
+import com.android.internal.os.BaseCommand;
+
+import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
@@ -33,9 +38,14 @@ import java.util.Map;
* desired character output.
*/
-public class Input {
+public class Input extends BaseCommand {
private static final String TAG = "Input";
private static final String INVALID_ARGUMENTS = "Error: Invalid arguments for command: ";
+ private static final String INVALID_DISPLAY_ARGUMENTS =
+ "Error: Invalid arguments for display ID.";
+
+ private static final float DEFAULT_PRESSURE = 1.0f;
+ private static final float NO_PRESSURE = 0.0f;
private static final Map<String, Integer> SOURCES = new HashMap<String, Integer>() {{
put("keyboard", InputDevice.SOURCE_KEYBOARD);
@@ -50,6 +60,7 @@ public class Input {
put("joystick", InputDevice.SOURCE_JOYSTICK);
}};
+ private static final Map<String, InputCmd> COMMANDS = new HashMap<String, InputCmd>();
/**
* Command-line entry point.
@@ -60,217 +71,292 @@ public class Input {
(new Input()).run(args);
}
- private void run(String[] args) {
- if (args.length < 1) {
- showUsage();
- return;
- }
+ Input() {
+ COMMANDS.put("text", new InputText());
+ COMMANDS.put("keyevent", new InputKeyEvent());
+ COMMANDS.put("tap", new InputTap());
+ COMMANDS.put("swipe", new InputSwipe());
+ COMMANDS.put("draganddrop", new InputDragAndDrop());
+ COMMANDS.put("press", new InputPress());
+ COMMANDS.put("roll", new InputRoll());
+ COMMANDS.put("motionevent", new InputMotionEvent());
+ }
- int index = 0;
- String command = args[index];
+ @Override
+ public void onRun() throws Exception {
+ String arg = nextArgRequired();
int inputSource = InputDevice.SOURCE_UNKNOWN;
- if (SOURCES.containsKey(command)) {
- inputSource = SOURCES.get(command);
- index++;
- command = args[index];
+
+ // Get source (optional).
+ if (SOURCES.containsKey(arg)) {
+ inputSource = SOURCES.get(arg);
+ arg = nextArgRequired();
}
- final int length = args.length - index;
-
- try {
- if (command.equals("text")) {
- if (length == 2) {
- inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD);
- sendText(inputSource, args[index+1]);
- return;
- }
- } else if (command.equals("keyevent")) {
- if (length >= 2) {
- final boolean longpress = "--longpress".equals(args[index + 1]);
- final int start = longpress ? index + 2 : index + 1;
- inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD);
- if (args.length > start) {
- for (int i = start; i < args.length; i++) {
- int keyCode = KeyEvent.keyCodeFromString(args[i]);
- sendKeyEvent(inputSource, keyCode, longpress);
- }
- return;
- }
- }
- } else if (command.equals("tap")) {
- if (length == 3) {
- inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
- sendTap(inputSource, Float.parseFloat(args[index+1]),
- Float.parseFloat(args[index+2]));
- return;
- }
- } else if (command.equals("swipe")) {
- int duration = -1;
- inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
- switch (length) {
- case 6:
- duration = Integer.parseInt(args[index+5]);
- case 5:
- sendSwipe(inputSource,
- Float.parseFloat(args[index+1]), Float.parseFloat(args[index+2]),
- Float.parseFloat(args[index+3]), Float.parseFloat(args[index+4]),
- duration);
- return;
- }
- } else if (command.equals("draganddrop")) {
- int duration = -1;
- inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
- switch (length) {
- case 6:
- duration = Integer.parseInt(args[index+5]);
- case 5:
- sendDragAndDrop(inputSource,
- Float.parseFloat(args[index+1]), Float.parseFloat(args[index+2]),
- Float.parseFloat(args[index+3]), Float.parseFloat(args[index+4]),
- duration);
- return;
- }
- } else if (command.equals("press")) {
- inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL);
- if (length == 1) {
- sendTap(inputSource, 0.0f, 0.0f);
- return;
- }
- } else if (command.equals("roll")) {
- inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL);
- if (length == 3) {
- sendMove(inputSource, Float.parseFloat(args[index+1]),
- Float.parseFloat(args[index+2]));
- return;
- }
- } else {
- System.err.println("Error: Unknown command: " + command);
- showUsage();
+
+ // Get displayId (optional).
+ int displayId = INVALID_DISPLAY;
+ if ("-d".equals(arg)) {
+ displayId = getDisplayId();
+ arg = nextArgRequired();
+ }
+
+ // Get command and run.
+ InputCmd cmd = COMMANDS.get(arg);
+ if (cmd != null) {
+ try {
+ cmd.run(inputSource, displayId);
return;
+ } catch (NumberFormatException ex) {
+ throw new IllegalArgumentException(INVALID_ARGUMENTS + arg);
}
- } catch (NumberFormatException ex) {
}
- System.err.println(INVALID_ARGUMENTS + command);
- showUsage();
+
+ throw new IllegalArgumentException("Error: Unknown command: " + arg);
}
- /**
- * Convert the characters of string text into key event's and send to
- * device.
- *
- * @param text is a string of characters you want to input to the device.
- */
- private void sendText(int source, String text) {
+ private int getDisplayId() {
+ String displayArg = nextArgRequired();
+ if ("INVALID_DISPLAY".equalsIgnoreCase(displayArg)) {
+ return INVALID_DISPLAY;
+ } else if ("DEFAULT_DISPLAY".equalsIgnoreCase(displayArg)) {
+ return DEFAULT_DISPLAY;
+ } else {
+ try {
+ final int displayId = Integer.parseInt(displayArg);
+ if (displayId == INVALID_DISPLAY) {
+ return INVALID_DISPLAY;
+ }
+ return Math.max(displayId, 0);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException(INVALID_DISPLAY_ARGUMENTS);
+ }
+ }
+ }
- StringBuffer buff = new StringBuffer(text);
+ class InputText implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD);
+ sendText(inputSource, nextArgRequired(), displayId);
+ }
- boolean escapeFlag = false;
- for (int i=0; i<buff.length(); i++) {
- if (escapeFlag) {
- escapeFlag = false;
- if (buff.charAt(i) == 's') {
- buff.setCharAt(i, ' ');
- buff.deleteCharAt(--i);
+ /**
+ * Convert the characters of string text into key event's and send to
+ * device.
+ *
+ * @param text is a string of characters you want to input to the device.
+ */
+ private void sendText(int source, final String text, int displayId) {
+ final StringBuffer buff = new StringBuffer(text);
+ boolean escapeFlag = false;
+ for (int i = 0; i < buff.length(); i++) {
+ if (escapeFlag) {
+ escapeFlag = false;
+ if (buff.charAt(i) == 's') {
+ buff.setCharAt(i, ' ');
+ buff.deleteCharAt(--i);
+ }
+ }
+ if (buff.charAt(i) == '%') {
+ escapeFlag = true;
}
}
- if (buff.charAt(i) == '%') {
- escapeFlag = true;
+
+ final char[] chars = buff.toString().toCharArray();
+ final KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
+ final KeyEvent[] events = kcm.getEvents(chars);
+ for (int i = 0; i < events.length; i++) {
+ KeyEvent e = events[i];
+ if (source != e.getSource()) {
+ e.setSource(source);
+ }
+ e.setDisplayId(displayId);
+ injectKeyEvent(e);
}
}
+ }
+
+ class InputKeyEvent implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ String arg = nextArgRequired();
+ final boolean longpress = "--longpress".equals(arg);
+ if (longpress) {
+ arg = nextArgRequired();
+ }
+
+ do {
+ final int keycode = KeyEvent.keyCodeFromString(arg);
+ sendKeyEvent(inputSource, keycode, longpress, displayId);
+ } while ((arg = nextArg()) != null);
+ }
+
+ private void sendKeyEvent(int inputSource, int keyCode, boolean longpress, int displayId) {
+ final long now = SystemClock.uptimeMillis();
+ int repeatCount = 0;
- char[] chars = buff.toString().toCharArray();
+ KeyEvent event = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, repeatCount,
+ 0 /*metaState*/, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /*scancode*/, 0/*flags*/,
+ inputSource);
+ event.setDisplayId(displayId);
- KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
- KeyEvent[] events = kcm.getEvents(chars);
- for(int i = 0; i < events.length; i++) {
- KeyEvent e = events[i];
- if (source != e.getSource()) {
- e.setSource(source);
+ injectKeyEvent(event);
+ if (longpress) {
+ repeatCount++;
+ injectKeyEvent(KeyEvent.changeTimeRepeat(event, now, repeatCount,
+ KeyEvent.FLAG_LONG_PRESS));
}
- injectKeyEvent(e);
+ injectKeyEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP));
}
}
- private void sendKeyEvent(int inputSource, int keyCode, boolean longpress) {
- long now = SystemClock.uptimeMillis();
- injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0,
- KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, inputSource));
- if (longpress) {
- injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 1, 0,
- KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_LONG_PRESS,
- inputSource));
+ class InputTap implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
+ sendTap(inputSource, Float.parseFloat(nextArgRequired()),
+ Float.parseFloat(nextArgRequired()), displayId);
+ }
+
+ void sendTap(int inputSource, float x, float y, int displayId) {
+ final long now = SystemClock.uptimeMillis();
+ injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, now, x, y, 1.0f,
+ displayId);
+ injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, now, x, y, 0.0f, displayId);
}
- injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0,
- KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, inputSource));
}
- private void sendTap(int inputSource, float x, float y) {
- long now = SystemClock.uptimeMillis();
- injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x, y, 1.0f);
- injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x, y, 0.0f);
+ class InputPress extends InputTap {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL);
+ sendTap(inputSource, 0.0f, 0.0f, displayId);
+ }
}
- private void sendSwipe(int inputSource, float x1, float y1, float x2, float y2, int duration) {
- if (duration < 0) {
- duration = 300;
+ class InputSwipe implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
+ sendSwipe(inputSource, displayId, false);
}
- long now = SystemClock.uptimeMillis();
- injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f);
- long startTime = now;
- long endTime = startTime + duration;
- while (now < endTime) {
- long elapsedTime = now - startTime;
- float alpha = (float) elapsedTime / duration;
- injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha),
- lerp(y1, y2, alpha), 1.0f);
- now = SystemClock.uptimeMillis();
+
+ void sendSwipe(int inputSource, int displayId, boolean isDragDrop) {
+ // Parse two points and duration.
+ final float x1 = Float.parseFloat(nextArgRequired());
+ final float y1 = Float.parseFloat(nextArgRequired());
+ final float x2 = Float.parseFloat(nextArgRequired());
+ final float y2 = Float.parseFloat(nextArgRequired());
+ String durationArg = nextArg();
+ int duration = durationArg != null ? Integer.parseInt(durationArg) : -1;
+ if (duration < 0) {
+ duration = 300;
+ }
+
+ final long down = SystemClock.uptimeMillis();
+ injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, down, down, x1, y1, 1.0f,
+ displayId);
+ if (isDragDrop) {
+ // long press until drag start.
+ try {
+ Thread.sleep(ViewConfiguration.getLongPressTimeout());
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ long now = SystemClock.uptimeMillis();
+ final long endTime = down + duration;
+ while (now < endTime) {
+ final long elapsedTime = now - down;
+ final float alpha = (float) elapsedTime / duration;
+ injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, down, now,
+ lerp(x1, x2, alpha), lerp(y1, y2, alpha), 1.0f, displayId);
+ now = SystemClock.uptimeMillis();
+ }
+ injectMotionEvent(inputSource, MotionEvent.ACTION_UP, down, now, x2, y2, 0.0f,
+ displayId);
}
- injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x2, y2, 0.0f);
}
- private void sendDragAndDrop(int inputSource, float x1, float y1, float x2, float y2,
- int dragDuration) {
- if (dragDuration < 0) {
- dragDuration = 300;
+ class InputDragAndDrop extends InputSwipe {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
+ sendSwipe(inputSource, displayId, true);
}
- long now = SystemClock.uptimeMillis();
- injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f);
- try {
- Thread.sleep(ViewConfiguration.getLongPressTimeout());
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ }
+
+ class InputRoll implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL);
+ sendMove(inputSource, Float.parseFloat(nextArgRequired()),
+ Float.parseFloat(nextArgRequired()), displayId);
+ }
+
+ /**
+ * Sends a simple zero-pressure move event.
+ *
+ * @param inputSource the InputDevice.SOURCE_* sending the input event
+ * @param dx change in x coordinate due to move
+ * @param dy change in y coordinate due to move
+ */
+ private void sendMove(int inputSource, float dx, float dy, int displayId) {
+ final long now = SystemClock.uptimeMillis();
+ injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, now, dx, dy, 0.0f,
+ displayId);
+ }
+ }
+
+ class InputMotionEvent implements InputCmd {
+ @Override
+ public void run(int inputSource, int displayId) {
+ inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN);
+ sendMotionEvent(inputSource, nextArgRequired(), Float.parseFloat(nextArgRequired()),
+ Float.parseFloat(nextArgRequired()), displayId);
}
- now = SystemClock.uptimeMillis();
- long startTime = now;
- long endTime = startTime + dragDuration;
- while (now < endTime) {
- long elapsedTime = now - startTime;
- float alpha = (float) elapsedTime / dragDuration;
- injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha),
- lerp(y1, y2, alpha), 1.0f);
- now = SystemClock.uptimeMillis();
+
+ private void sendMotionEvent(int inputSource, String motionEventType, float x, float y,
+ int displayId) {
+ final int action;
+ final float pressure;
+
+ switch (motionEventType.toUpperCase()) {
+ case "DOWN":
+ action = MotionEvent.ACTION_DOWN;
+ pressure = DEFAULT_PRESSURE;
+ break;
+ case "UP":
+ action = MotionEvent.ACTION_UP;
+ pressure = NO_PRESSURE;
+ break;
+ case "MOVE":
+ action = MotionEvent.ACTION_MOVE;
+ pressure = DEFAULT_PRESSURE;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown motionevent " + motionEventType);
+ }
+
+ final long now = SystemClock.uptimeMillis();
+ injectMotionEvent(inputSource, action, now, now, x, y, pressure, displayId);
}
- injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x2, y2, 0.0f);
}
/**
- * Sends a simple zero-pressure move event.
- *
- * @param inputSource the InputDevice.SOURCE_* sending the input event
- * @param dx change in x coordinate due to move
- * @param dy change in y coordinate due to move
+ * Abstract class for command
+ * use nextArgRequired or nextArg to check next argument if necessary.
*/
- private void sendMove(int inputSource, float dx, float dy) {
- long now = SystemClock.uptimeMillis();
- injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, dx, dy, 0.0f);
+ private interface InputCmd {
+ void run(int inputSource, int displayId);
}
- private void injectKeyEvent(KeyEvent event) {
- Log.i(TAG, "injectKeyEvent: " + event);
+ private static void injectKeyEvent(KeyEvent event) {
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
- private int getInputDeviceId(int inputSource) {
+ private static int getInputDeviceId(int inputSource) {
final int DEFAULT_DEVICE_ID = 0;
int[] devIds = InputDevice.getDeviceIds();
for (int devId : devIds) {
@@ -287,22 +373,27 @@ public class Input {
*
* @param inputSource the InputDevice.SOURCE_* sending the input event
* @param action the MotionEvent.ACTION_* for the event
+ * @param downTime the value of the ACTION_DOWN event happened
* @param when the value of SystemClock.uptimeMillis() at which the event happened
* @param x x coordinate of event
* @param y y coordinate of event
* @param pressure pressure of event
*/
- private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) {
+ private static void injectMotionEvent(int inputSource, int action, long downTime, long when,
+ float x, float y, float pressure, int displayId) {
final float DEFAULT_SIZE = 1.0f;
final int DEFAULT_META_STATE = 0;
final float DEFAULT_PRECISION_X = 1.0f;
final float DEFAULT_PRECISION_Y = 1.0f;
final int DEFAULT_EDGE_FLAGS = 0;
- MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE,
+ MotionEvent event = MotionEvent.obtain(downTime, when, action, x, y, pressure, DEFAULT_SIZE,
DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y,
getInputDeviceId(inputSource), DEFAULT_EDGE_FLAGS);
event.setSource(inputSource);
- Log.i(TAG, "injectMotionEvent: " + event);
+ if (displayId == INVALID_DISPLAY && (inputSource & InputDevice.SOURCE_CLASS_POINTER) != 0) {
+ displayId = DEFAULT_DISPLAY;
+ }
+ event.setDisplayId(displayId);
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
@@ -315,24 +406,30 @@ public class Input {
return inputSource == InputDevice.SOURCE_UNKNOWN ? defaultSource : inputSource;
}
- private void showUsage() {
- System.err.println("Usage: input [<source>] <command> [<arg>...]");
- System.err.println();
- System.err.println("The sources are: ");
+ @Override
+ public void onShowUsage(PrintStream out) {
+ out.println("Usage: input [<source>] [-d DISPLAY_ID] <command> [<arg>...]");
+ out.println();
+ out.println("The sources are: ");
for (String src : SOURCES.keySet()) {
- System.err.println(" " + src);
+ out.println(" " + src);
}
- System.err.println();
- System.err.println("The commands and default sources are:");
- System.err.println(" text <string> (Default: touchscreen)");
- System.err.println(" keyevent [--longpress] <key code number or name> ..."
+ out.println();
+ out.printf("-d: specify the display ID.\n"
+ + " (Default: %d for key event, %d for motion event if not specified.)",
+ INVALID_DISPLAY, DEFAULT_DISPLAY);
+ out.println();
+ out.println("The commands and default sources are:");
+ out.println(" text <string> (Default: touchscreen)");
+ out.println(" keyevent [--longpress] <key code number or name> ..."
+ " (Default: keyboard)");
- System.err.println(" tap <x> <y> (Default: touchscreen)");
- System.err.println(" swipe <x1> <y1> <x2> <y2> [duration(ms)]"
+ out.println(" tap <x> <y> (Default: touchscreen)");
+ out.println(" swipe <x1> <y1> <x2> <y2> [duration(ms)]"
+ " (Default: touchscreen)");
- System.err.println(" draganddrop <x1> <y1> <x2> <y2> [duration(ms)]"
+ out.println(" draganddrop <x1> <y1> <x2> <y2> [duration(ms)]"
+ " (Default: touchscreen)");
- System.err.println(" press (Default: trackball)");
- System.err.println(" roll <dx> <dy> (Default: trackball)");
+ out.println(" press (Default: trackball)");
+ out.println(" roll <dx> <dy> (Default: trackball)");
+ out.println(" event <DOWN|UP|MOVE> <x> <y> (Default: touchscreen)");
}
}
diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java
index c6d2bc891b18..1e915f8232d3 100644
--- a/cmds/media/src/com/android/commands/media/Media.java
+++ b/cmds/media/src/com/android/commands/media/Media.java
@@ -17,18 +17,18 @@
package com.android.commands.media;
-import android.app.ActivityManager;
+import android.app.ActivityThread;
import android.content.Context;
-import android.content.pm.ParceledListSlice;
import android.media.MediaMetadata;
-import android.media.session.ISessionController;
-import android.media.session.ISessionControllerCallback;
import android.media.session.ISessionManager;
-import android.media.session.ParcelableVolumeInfo;
+import android.media.session.MediaController;
+import android.media.session.MediaController.PlaybackInfo;
+import android.media.session.MediaSession.QueueItem;
+import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.os.HandlerThread;
-import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -48,6 +48,8 @@ import java.util.List;
public class Media extends BaseCommand {
// This doesn't belongs to any package. Setting the package name to empty string.
private static final String PACKAGE_NAME = "";
+ private static ActivityThread sThread;
+ private static MediaSessionManager sMediaSessionManager;
private ISessionManager mSessionService;
/**
@@ -80,6 +82,13 @@ public class Media extends BaseCommand {
@Override
public void onRun() throws Exception {
+ if (sThread == null) {
+ Looper.prepareMainLooper();
+ sThread = ActivityThread.systemMain();
+ Context context = sThread.getSystemContext();
+ sMediaSessionManager =
+ (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
+ }
mSessionService = ISessionManager.Stub.asInterface(ServiceManager.checkService(
Context.MEDIA_SESSION_SERVICE));
if (mSessionService == null) {
@@ -117,12 +126,11 @@ public class Media extends BaseCommand {
showError("Error: must include a session id");
return;
}
+
boolean success = false;
try {
- List<IBinder> sessions = mSessionService
- .getSessions(null, ActivityManager.getCurrentUser());
- for (IBinder session : sessions) {
- ISessionController controller = ISessionController.Stub.asInterface(session);
+ List<MediaController> controllers = sMediaSessionManager.getActiveSessions(null);
+ for (MediaController controller : controllers) {
try {
if (controller != null && id.equals(controller.getTag())) {
ControllerMonitor monitor = new ControllerMonitor(controller);
@@ -178,20 +186,14 @@ public class Media extends BaseCommand {
KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
}
- class ControllerMonitor extends ISessionControllerCallback.Stub {
- private final ISessionController mController;
-
- public ControllerMonitor(ISessionController controller) {
- mController = controller;
- }
-
+ class ControllerCallback extends MediaController.Callback {
@Override
public void onSessionDestroyed() {
System.out.println("onSessionDestroyed. Enter q to quit.");
}
@Override
- public void onEvent(String event, Bundle extras) {
+ public void onSessionEvent(String event, Bundle extras) {
System.out.println("onSessionEvent event=" + event + ", extras=" + extras);
}
@@ -208,31 +210,41 @@ public class Media extends BaseCommand {
}
@Override
- public void onQueueChanged(ParceledListSlice queue) throws RemoteException {
+ public void onQueueChanged(List<QueueItem> queue) {
System.out.println("onQueueChanged, "
- + (queue == null ? "null queue" : " size=" + queue.getList().size()));
+ + (queue == null ? "null queue" : " size=" + queue.size()));
}
@Override
- public void onQueueTitleChanged(CharSequence title) throws RemoteException {
+ public void onQueueTitleChanged(CharSequence title) {
System.out.println("onQueueTitleChange " + title);
}
@Override
- public void onExtrasChanged(Bundle extras) throws RemoteException {
+ public void onExtrasChanged(Bundle extras) {
System.out.println("onExtrasChanged " + extras);
}
@Override
- public void onVolumeInfoChanged(ParcelableVolumeInfo info) throws RemoteException {
- System.out.println("onVolumeInfoChanged " + info);
+ public void onAudioInfoChanged(PlaybackInfo info) {
+ System.out.println("onAudioInfoChanged " + info);
+ }
+ }
+
+ private class ControllerMonitor {
+ private final MediaController mController;
+ private final ControllerCallback mControllerCallback;
+
+ ControllerMonitor(MediaController controller) {
+ mController = controller;
+ mControllerCallback = new ControllerCallback();
}
void printUsageMessage() {
try {
System.out.println("V2Monitoring session " + mController.getTag()
+ "... available commands: play, pause, next, previous");
- } catch (RemoteException e) {
+ } catch (RuntimeException e) {
System.out.println("Error trying to monitor session!");
}
System.out.println("(q)uit: finish monitoring");
@@ -244,8 +256,8 @@ public class Media extends BaseCommand {
@Override
protected void onLooperPrepared() {
try {
- mController.registerCallbackListener(PACKAGE_NAME, ControllerMonitor.this);
- } catch (RemoteException e) {
+ mController.registerCallback(mControllerCallback);
+ } catch (RuntimeException e) {
System.out.println("Error registering monitor callback");
}
}
@@ -287,7 +299,7 @@ public class Media extends BaseCommand {
} finally {
cbThread.getLooper().quit();
try {
- mController.unregisterCallbackListener(this);
+ mController.unregisterCallback(mControllerCallback);
} catch (Exception e) {
// ignoring
}
@@ -301,9 +313,9 @@ public class Media extends BaseCommand {
KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD);
try {
- mController.sendMediaButton(PACKAGE_NAME, null, false, down);
- mController.sendMediaButton(PACKAGE_NAME, null, false, up);
- } catch (RemoteException e) {
+ mController.dispatchMediaButtonEvent(down);
+ mController.dispatchMediaButtonEvent(up);
+ } catch (RuntimeException e) {
System.out.println("Failed to dispatch " + keyCode);
}
}
@@ -312,16 +324,13 @@ public class Media extends BaseCommand {
private void runListSessions() {
System.out.println("Sessions:");
try {
- List<IBinder> sessions = mSessionService
- .getSessions(null, ActivityManager.getCurrentUser());
- for (IBinder session : sessions) {
-
- ISessionController controller = ISessionController.Stub.asInterface(session);
+ List<MediaController> controllers = sMediaSessionManager.getActiveSessions(null);
+ for (MediaController controller : controllers) {
if (controller != null) {
try {
System.out.println(" tag=" + controller.getTag()
+ ", package=" + controller.getPackageName());
- } catch (RemoteException e) {
+ } catch (RuntimeException e) {
// ignore
}
}
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp
index 8fa298060d60..3d74f8b207af 100644
--- a/cmds/screencap/screencap.cpp
+++ b/cmds/screencap/screencap.cpp
@@ -81,8 +81,7 @@ static sk_sp<SkColorSpace> dataSpaceToColorSpace(ui::Dataspace d)
case ui::Dataspace::V0_SRGB:
return SkColorSpace::MakeSRGB();
case ui::Dataspace::DISPLAY_P3:
- return SkColorSpace::MakeRGB(
- SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kDCIP3_D65_Gamut);
+ return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
default:
return nullptr;
}
diff --git a/cmds/statsd/src/anomaly/subscriber_util.cpp b/cmds/statsd/src/anomaly/subscriber_util.cpp
index 9d37cdb2d4d7..ad5eae361f1c 100644
--- a/cmds/statsd/src/anomaly/subscriber_util.cpp
+++ b/cmds/statsd/src/anomaly/subscriber_util.cpp
@@ -57,7 +57,7 @@ void triggerSubscribers(const int64_t rule_id,
break;
case Subscription::SubscriberInformationCase::kPerfettoDetails:
if (!CollectPerfettoTraceAndUploadToDropbox(subscription.perfetto_details(),
- rule_id, configKey)) {
+ subscription.id(), rule_id, configKey)) {
ALOGW("Failed to generate perfetto traces.");
}
break;
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 5c53a3a585f8..ef3eac017192 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -25,7 +25,11 @@ import "frameworks/base/core/proto/android/app/enums.proto";
import "frameworks/base/core/proto/android/app/settings_enums.proto";
import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/enums.proto";
+import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto";
+import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto";
+import "frameworks/base/core/proto/android/net/networkcapabilities.proto";
import "frameworks/base/core/proto/android/os/enums.proto";
+import "frameworks/base/core/proto/android/server/connectivity/data_stall_event.proto";
import "frameworks/base/core/proto/android/server/enums.proto";
import "frameworks/base/core/proto/android/server/location/enums.proto";
import "frameworks/base/core/proto/android/service/procstats_enum.proto";
@@ -172,7 +176,23 @@ message Atom {
WifiEnabledStateChanged wifi_enabled_state_changed = 113;
WifiRunningStateChanged wifi_running_state_changed = 114;
AppCompacted app_compacted = 115;
- NetworkDnsEventReported network_dns_event_Reported = 116;
+ NetworkDnsEventReported network_dns_event_reported = 116;
+ DocsUIPickerLaunchedFromReported docs_ui_picker_launched_from_reported = 117;
+ DocsUIPickResultReported docs_ui_pick_result_reported = 118;
+ DocsUISearchModeReported docs_ui_search_mode_reported = 119;
+ DocsUISearchTypeReported docs_ui_search_type_reported = 120;
+ DataStallEvent data_stall_event = 121;
+ RescuePartyResetReported rescue_party_reset_reported = 122;
+ SignedConfigReported signed_config_reported = 123;
+ GnssNiEventReported gnss_ni_event_reported = 124;
+ BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = 125;
+ BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed = 126;
+ BluetoothScoConnectionStateChanged bluetooth_sco_connection_state_changed = 127;
+ AppDowngraded app_downgraded = 128;
+ AppOptimizedAfterDowngraded app_optimized_after_downgraded = 129;
+ LowStorageStateChanged low_storage_state_changed = 130;
+ GnssNfwNotificationReported gnss_nfw_notification_reported = 131;
+ GnssConfigurationReported gnss_configuration_reported = 132;
}
// Pulled events will start at field 10000.
@@ -212,7 +232,7 @@ message Atom {
NumFingerprints num_fingerprints = 10031;
DiskIo disk_io = 10032;
PowerProfile power_profile = 10033;
- ProcStats proc_stats_pkg_proc = 10034;
+ ProcStatsPkgProc proc_stats_pkg_proc = 10034;
ProcessCpuTime process_cpu_time = 10035;
NativeProcessMemoryState native_process_memory_state = 10036;
CpuTimePerThreadFreq cpu_time_per_thread_freq = 10037;
@@ -1288,10 +1308,12 @@ message BluetoothEnabledStateChanged {
}
/**
- * Logs when a Bluetooth device connects and disconnects.
+ * Logs when profiles on a Bluetooth device connects and disconnects.
*
* Logged from:
- * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java
+ * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java
+ *
+ * Next Tag: 5
*/
message BluetoothConnectionStateChanged {
// The state of the connection.
@@ -1300,13 +1322,152 @@ message BluetoothConnectionStateChanged {
// An identifier that can be used to match connect and disconnect events.
// Currently is last two bytes of a hash of a device level ID and
// the mac address of the bluetooth device that is connected.
- optional int32 obfuscated_id = 2;
+ // Deprecated: use obfuscated_id instead, this one is always 0 for Q+
+ optional int32 OBSOLETE_obfuscated_id = 2 [deprecated = true];
// The profile that is connected. Eg. GATT, A2DP, HEADSET.
// From android.bluetooth.BluetoothAdapter.java
+ // Default: 0 when not used
optional int32 bt_profile = 3;
+ // An identifier that can be used to match events for this device.
+ // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+ // Salt: Randomly generated 256 bit value
+ // Hash algorithm: HMAC-SHA256
+ // Size: 32 byte
+ // Default: null or empty if the device identifier is not known
+ optional bytes obfuscated_id = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Logs when a Bluetooth device connects and disconnects over ACL
+ *
+ * Logged from:
+ * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java
+ *
+ * Next Tag: 3
+ */
+message BluetoothAclConnectionStateChanged {
+ // An identifier that can be used to match events for this device.
+ // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+ // Salt: Randomly generated 256 bit value
+ // Hash algorithm: HMAC-SHA256
+ // Size: 32 byte
+ // Default: null or empty if the device identifier is not known
+ optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+ // The state of the connection.
+ // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED.
+ optional android.bluetooth.ConnectionStateEnum state = 2;
}
/**
+ * Logs when a Bluetooth device connects and disconnects over SCO
+ *
+ * Logged from:
+ * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+ * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetClientStateMachine.java
+ *
+ * Next Tag: 4
+ */
+message BluetoothScoConnectionStateChanged {
+ // An identifier that can be used to match events for this device.
+ // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+ // Salt: Randomly generated 256 bit value
+ // Hash algorithm: HMAC-SHA256
+ // Size: 32 byte
+ // Default: null or empty if the device identifier is not known
+ optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+ // The state of the connection.
+ // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED.
+ optional android.bluetooth.ConnectionStateEnum state = 2;
+ // Codec used for this SCO connection
+ // Default: UNKNOWN
+ optional android.bluetooth.hfp.ScoCodec codec = 3;
+}
+
+// Logs when there is an event affecting Bluetooth device's link layer connection.
+// - This event is triggered when there is a related HCI command or event
+// - Users of this metrics can deduce Bluetooth device's connection state from these events
+// - HCI commands are logged before the command is sent, after receiving command status, and after
+// receiving command complete
+// - HCI events are logged when they arrive
+//
+// Low level log from system/bt
+//
+// Bluetooth classic commands:
+// - CMD_CREATE_CONNECTION
+// - CMD_DISCONNECT
+// - CMD_CREATE_CONNECTION_CANCEL
+// - CMD_ACCEPT_CONNECTION_REQUEST
+// - CMD_REJECT_CONNECTION_REQUEST
+// - CMD_SETUP_ESCO_CONNECTION
+// - CMD_ACCEPT_ESCO_CONNECTION
+// - CMD_REJECT_ESCO_CONNECTION
+// - CMD_ENH_SETUP_ESCO_CONNECTION
+// - CMD_ENH_ACCEPT_ESCO_CONNECTION
+//
+// Bluetooth low energy commands:
+// - CMD_BLE_CREATE_LL_CONN [Only logged on error or when initiator filter policy is 0x00]
+// - CMD_BLE_CREATE_CONN_CANCEL [Only logged when there is an error]
+// - CMD_BLE_EXTENDED_CREATE_CONNECTION [Only logged on error or when initiator filter policy is 0x00]
+// - CMD_BLE_CLEAR_WHITE_LIST
+// - CMD_BLE_ADD_WHITE_LIST
+// - CMD_BLE_REMOVE_WHITE_LIST
+//
+// Bluetooth classic events:
+// - EVT_CONNECTION_COMP
+// - EVT_CONNECTION_REQUEST
+// - EVT_DISCONNECTION_COMP
+// - EVT_ESCO_CONNECTION_COMP
+// - EVT_ESCO_CONNECTION_CHANGED
+//
+// Bluetooth low energy meta events:
+// - BLE_EVT_CONN_COMPLETE_EVT
+// - BLE_EVT_ENHANCED_CONN_COMPLETE_EVT
+//
+// Next tag: 10
+message BluetoothLinkLayerConnectionEvent {
+ // An identifier that can be used to match events for this device.
+ // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+ // Salt: Randomly generated 256 bit value
+ // Hash algorithm: HMAC-SHA256
+ // Size: 32 byte
+ // Default: null or empty if the device identifier is not known
+ optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+ // Connection handle of this connection if available
+ // Range: 0x0000 - 0x0EFF (12 bits)
+ // Default: 0xFFFF if the handle is unknown
+ optional int32 connection_handle = 2;
+ // Direction of the link
+ // Default: DIRECTION_UNKNOWN
+ optional android.bluetooth.DirectionEnum direction = 3;
+ // Type of this link
+ // Default: LINK_TYPE_UNKNOWN
+ optional android.bluetooth.LinkTypeEnum type = 4;
+
+ // Reason metadata for this link layer connection event, rules for interpretation:
+ // 1. If hci_cmd is set and valid, hci_event can be either EVT_COMMAND_STATUS or
+ // EVT_COMMAND_COMPLETE, ignore hci_ble_event in this case
+ // 2. If hci_event is set to EVT_BLE_META, look at hci_ble_event; otherwise, if hci_event is
+ // set and valid, ignore hci_ble_event
+
+ // HCI command associated with this event
+ // Default: CMD_UNKNOWN
+ optional android.bluetooth.hci.CommandEnum hci_cmd = 5;
+ // HCI event associated with this event
+ // Default: EVT_UNKNOWN
+ optional android.bluetooth.hci.EventEnum hci_event = 6;
+ // HCI BLE meta event associated with this event
+ // Default: BLE_EVT_UNKNOWN
+ optional android.bluetooth.hci.BleMetaEventEnum hci_ble_event = 7;
+ // HCI command status code if this is triggerred by hci_cmd
+ // Default: STATUS_UNKNOWN
+ optional android.bluetooth.hci.StatusEnum cmd_status = 8;
+ // HCI reason code associated with this event
+ // Default: STATUS_UNKNOWN
+ optional android.bluetooth.hci.StatusEnum reason_code = 9;
+}
+
+
+/**
* Logs when something is plugged into or removed from the USB-C connector.
*
* Logged from:
@@ -1631,6 +1792,47 @@ message ActivityForegroundStateChanged {
}
/**
+ * Logs when a volume entered low Storage state.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+ */
+message LowStorageStateChanged {
+ // Volume that ran out of storage.
+ optional string volume_description = 1;
+
+ enum State {
+ UNKNOWN = 0;
+ OFF = 1;
+ ON = 2;
+ }
+ optional State state = 2;
+}
+
+/**
+ * Logs when an app is downgraded.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+ */
+message AppDowngraded {
+ optional string package_name = 1;
+ // Size of the package (all data) before being downgraded.
+ optional int64 size_in_bytes_before = 2;
+ // Size of the package (all data) after being downgraded.
+ optional int64 size_in_bytes_after = 3;
+
+ optional bool aggressive = 4;
+}
+
+/**
+ * Logs when an app is optimized after being downgraded.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+ */
+message AppOptimizedAfterDowngraded {
+ optional string package_name = 1;
+}
+
+/**
* Logs when an app crashes.
* Logged from:
* frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3175,7 +3377,8 @@ message PackageAssociationSourceProcessStatsProto {
optional int32 process_uid = 1;
// Process name.
optional string process_name = 2;
-
+ // Package name.
+ optional string package_name = 7;
// Total count of the times this association appeared.
optional int32 total_count = 3;
@@ -3254,6 +3457,9 @@ message ProcessStatsSectionProto {
}
repeated Status status = 7;
+ // Number of pages available of various types and sizes, representation fragmentation.
+ repeated ProcessStatsAvailablePagesProto available_pages = 10;
+
// Stats for each process.
repeated ProcessStatsProto process_stats = 8;
@@ -3261,6 +3467,21 @@ message ProcessStatsSectionProto {
repeated ProcessStatsPackageProto package_stats = 9;
}
+message ProcessStatsAvailablePagesProto {
+ // Node these pages are in (as per /proc/pagetypeinfo)
+ optional int32 node = 1;
+
+ // Zone these pages are in (as per /proc/pagetypeinfo)
+ optional string zone = 2;
+
+ // Label for the type of these pages (as per /proc/pagetypeinfo)
+ optional string label = 3;
+
+ // Distribution of number of pages available by order size. First entry in array is
+ // order 0, second is order 1, etc. Each order increase is a doubling of page size.
+ repeated int32 pages_per_order = 4;
+}
+
/**
* Pulled from ProcessStatsService.java
*/
@@ -3268,6 +3489,13 @@ message ProcStats {
optional ProcessStatsSectionProto proc_stats_section = 1;
}
+/**
+ * Pulled from ProcessStatsService.java
+ */
+message ProcStatsPkgProc {
+ optional ProcessStatsSectionProto proc_stats_section = 1;
+}
+
message PowerProfileProto {
optional double cpu_suspend = 1;
@@ -3656,6 +3884,52 @@ message DocsUIInvalidScopedAccessRequestReported {
}
/**
+ * Logs the package name that launches docsui picker mode.
+ *
+ * Logged from:
+ * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
+ */
+message DocsUIPickerLaunchedFromReported {
+ optional string package_name = 1;
+}
+
+/**
+ * Logs the search type.
+ *
+ * Logged from:
+ * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
+ */
+message DocsUISearchTypeReported {
+ optional android.stats.docsui.SearchType search_type = 1;
+}
+
+/**
+ * Logs the search mode.
+ *
+ * Logged from:
+ * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
+ */
+message DocsUISearchModeReported {
+ optional android.stats.docsui.SearchMode search_mode = 1;
+}
+
+/**
+ * Logs the pick result information.
+ *
+ * Logged from:
+ * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
+ */
+message DocsUIPickResultReported {
+ optional int32 total_action_count = 1;
+ optional int64 duration_millis = 2;
+ optional int32 file_count= 3;
+ optional bool is_searching = 4;
+ optional android.stats.docsui.Root picked_from = 5;
+ optional android.stats.docsui.MimeType mime_type = 6;
+ optional int32 repeatedly_pick_times = 7;
+}
+
+/**
* Logs when an app's memory is compacted.
*
* Logged from:
@@ -3741,7 +4015,7 @@ message NetworkDnsEventReported {
//bionic/libc/include/netdb.h
//system/netd/resolv/include/netd_resolv/resolv.h
enum ReturnCode {
- EAI_NOERR = 0;
+ EAI_NO_ERROR = 0;
EAI_ADDRFAMILY = 1;
EAI_AGAIN = 2;
EAI_BADFLAGS = 3;
@@ -3764,3 +4038,228 @@ message NetworkDnsEventReported {
// The latency period(in microseconds) it took for this DNS lookup to complete.
optional int32 latency_micros = 3;
}
+
+/**
+ * Logs when a data stall event occurs.
+ *
+ * Log from:
+ * frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+ */
+message DataStallEvent {
+ // Data stall evaluation type.
+ // See frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+ // Refer to the definition of DATA_STALL_EVALUATION_TYPE_*.
+ optional int32 evaluation_type = 1;
+ // See definition in data_stall_event.proto.
+ optional com.android.server.connectivity.ProbeResult validation_result = 2;
+ // See definition in data_stall_event.proto.
+ optional android.net.NetworkCapabilitiesProto.Transport network_type = 3;
+ // See definition in data_stall_event.proto.
+ optional com.android.server.connectivity.WifiData wifi_info = 4 [(log_mode) = MODE_BYTES];
+ // See definition in data_stall_event.proto.
+ optional com.android.server.connectivity.CellularData cell_info = 5 [(log_mode) = MODE_BYTES];
+ // See definition in data_stall_event.proto.
+ optional com.android.server.connectivity.DnsEvent dns_event = 6 [(log_mode) = MODE_BYTES];
+}
+
+/*
+ * Logs when RescueParty resets some set of experiment flags.
+ *
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/RescueParty.java
+ */
+message RescuePartyResetReported {
+ // The rescue level of this reset. A value of 0 indicates missing or unknown level information.
+ optional int32 rescue_level = 1;
+}
+
+/**
+ * Logs when signed config is received from an APK, and if that config was applied successfully.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/signedconfig/SignedConfigService.java
+ */
+message SignedConfigReported {
+ enum Type {
+ UNKNOWN_TYPE = 0;
+ GLOBAL_SETTINGS = 1;
+ }
+ optional Type type = 1;
+
+ // The final status of the signed config received.
+ enum Status {
+ UNKNOWN_STATUS = 0;
+ APPLIED = 1;
+ BASE64_FAILURE_CONFIG = 2;
+ BASE64_FAILURE_SIGNATURE = 3;
+ SECURITY_EXCEPTION = 4;
+ INVALID_CONFIG = 5;
+ OLD_CONFIG = 6;
+ SIGNATURE_CHECK_FAILED = 7;
+ NOT_APPLICABLE = 8;
+ SIGNATURE_CHECK_FAILED_PROD_KEY_ABSENT = 9;
+ }
+ optional Status status = 2;
+
+ // The version of the signed config processed.
+ optional int32 version = 3;
+
+ // The package name that the config was extracted from.
+ optional string from_package = 4;
+
+ enum Key {
+ NO_KEY = 0;
+ DEBUG = 1;
+ PRODUCTION = 2;
+ }
+ // Which key was used to verify the config.
+ optional Key verified_with = 5;
+}
+
+/*
+ * Logs GNSS Network-Initiated (NI) location events.
+ *
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java
+ */
+message GnssNiEventReported {
+ // The type of GnssNiEvent.
+ enum EventType {
+ UNKNOWN = 0;
+ NI_REQUEST = 1;
+ NI_RESPONSE = 2;
+ }
+ optional EventType event_type = 1;
+
+ // An ID generated by HAL to associate NI notifications and UI responses.
+ optional int32 notification_id = 2;
+
+ // A type which distinguishes different categories of NI request, such as VOICE, UMTS_SUPL etc.
+ optional android.server.location.GnssNiType ni_type = 3;
+
+ // NI requires notification.
+ optional bool need_notify = 4;
+
+ // NI requires verification.
+ optional bool need_verify = 5;
+
+ // NI requires privacy override, no notification/minimal trace.
+ optional bool privacy_override = 6;
+
+ // Timeout period to wait for user response. Set to 0 for no timeout limit. Specified in
+ // seconds.
+ optional int32 timeout = 7;
+
+ // Default response when timeout.
+ optional android.server.location.GnssUserResponseType default_response = 8;
+
+ // String representing the requester of the network inititated location request.
+ optional string requestor_id = 9;
+
+ // Notification message text string representing the service(for eg. SUPL-service) who sent the
+ // network initiated location request.
+ optional string text = 10;
+
+ // requestorId decoding scheme.
+ optional android.server.location.GnssNiEncodingType requestor_id_encoding = 11;
+
+ // Notification message text decoding scheme.
+ optional android.server.location.GnssNiEncodingType text_encoding = 12;
+
+ // True if SUPL ES is enabled.
+ optional bool is_supl_es_enabled = 13;
+
+ // True if GNSS location is enabled.
+ optional bool is_location_enabled = 14;
+
+ // GNSS NI responses which define the response in NI structures.
+ optional android.server.location.GnssUserResponseType user_response = 15;
+}
+
+/**
+ * Logs GNSS non-framework (NFW) location notification.
+ *
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java
+ */
+message GnssNfwNotificationReported {
+ // Package name of the Android proxy application representing the non-framework entity that
+ // requested location. Set to empty string if unknown.
+ optional string proxy_app_package_name = 1;
+
+ // Protocol stack that initiated the non-framework location request.
+ optional android.server.location.NfwProtocolStack protocol_stack = 2;
+
+ // Name of the protocol stack if protocol_stack field is set to OTHER_PROTOCOL_STACK. Otherwise,
+ // set to empty string. This field is opaque to the framework and used for logging purposes.
+ optional string other_protocol_stack_name = 3;
+
+ // Source initiating/receiving the location information.
+ optional android.server.location.NfwRequestor requestor = 4;
+
+ // Identity of the endpoint receiving the location information. For example, carrier name, OEM
+ // name, SUPL SLP/E-SLP FQDN, chipset vendor name, etc. This field is opaque to the framework
+ // and used for logging purposes.
+ optional string requestor_id = 5;
+
+ // Indicates whether location information was provided for this request.
+ optional android.server.location.NfwResponseType response_type = 6;
+
+ // True if the device is in user initiated emergency session.
+ optional bool in_emergency_mode = 7;
+
+ // True if cached location is provided.
+ optional bool is_cached_location = 8;
+
+ // True if proxy app permission mismatch between framework and GNSS HAL.
+ optional bool is_permission_mismatched = 9;
+}
+
+/**
+ * Logs GNSS configuration as defined in IGnssConfiguration.hal.
+ *
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/location/GnssConfiguration.java
+ */
+message GnssConfigurationReported {
+ // SUPL host name.
+ optional string supl_host = 1;
+
+ // SUPL port number.
+ optional int32 supl_port = 2;
+
+ // C2K host name.
+ optional string c2k_host = 3;
+
+ // C2K port number.
+ optional int32 c2k_port = 4;
+
+ // The SUPL version requested by Carrier.
+ optional int32 supl_ver = 5;
+
+ // The SUPL mode.
+ optional android.server.location.SuplMode supl_mode = 6;
+
+ // True if NI emergency SUPL restrictions is enabled.
+ optional bool supl_es = 7;
+
+ // LTE Positioning Profile settings
+ optional android.server.location.LppProfile lpp_profile = 8;
+
+ // Positioning protocol on A-Glonass system.
+ optional android.server.location.GlonassPosProtocol a_glonass_pos_protocol_select = 9;
+
+ // True if emergency PDN is used. Otherwise, regular PDN is used.
+ optional bool use_emergency_pdn_for_emergency_supl= 10;
+
+ // Configurations of how GPS functionalities should be locked when user turns off GPS On setting.
+ optional android.server.location.GpsLock gps_lock = 11;
+
+ // Number of seconds to extend the emergency session duration post emergency call.
+ optional int32 es_extension_sec = 12;
+
+ // The full list of package names of proxy Android applications representing the non-framework
+ // location access entities (on/off the device) for which the framework user has granted
+ // non-framework location access permission. The package names are concatenated in one string
+ // with spaces as separators.
+ optional string enabled_proxy_app_package_name_list = 13;
+}
diff --git a/cmds/statsd/src/external/Perfetto.cpp b/cmds/statsd/src/external/Perfetto.cpp
index 42cc543f18a8..0c4c3301e61e 100644
--- a/cmds/statsd/src/external/Perfetto.cpp
+++ b/cmds/statsd/src/external/Perfetto.cpp
@@ -39,6 +39,7 @@ namespace os {
namespace statsd {
bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
+ int64_t subscription_id,
int64_t alert_id,
const ConfigKey& configKey) {
VLOG("Starting trace collection through perfetto");
@@ -48,9 +49,11 @@ bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
return false;
}
- char alertId[20];
- char configId[20];
- char configUid[20];
+ char subscriptionId[25];
+ char alertId[25];
+ char configId[25];
+ char configUid[25];
+ snprintf(subscriptionId, sizeof(subscriptionId), "%" PRId64, subscription_id);
snprintf(alertId, sizeof(alertId), "%" PRId64, alert_id);
snprintf(configId, sizeof(configId), "%" PRId64, configKey.GetId());
snprintf(configUid, sizeof(configUid), "%d", configKey.GetUid());
@@ -94,7 +97,7 @@ bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
execl("/system/bin/perfetto", "perfetto", "--background", "--config", "-", "--dropbox",
kDropboxTag, "--alert-id", alertId, "--config-id", configId, "--config-uid",
- configUid, nullptr);
+ configUid, "--subscription-id", subscriptionId, nullptr);
// execl() doesn't return in case of success, if we get here something
// failed.
diff --git a/cmds/statsd/src/external/Perfetto.h b/cmds/statsd/src/external/Perfetto.h
index 1e7f728e1357..ab2c1954e2a0 100644
--- a/cmds/statsd/src/external/Perfetto.h
+++ b/cmds/statsd/src/external/Perfetto.h
@@ -32,6 +32,7 @@ class PerfettoDetails; // Declared in statsd_config.pb.h
// This method returns immediately after passing the config and does NOT wait
// for the full duration of the trace.
bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
+ int64_t subscription_id,
int64_t alert_id,
const ConfigKey& configKey);
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 67a1a4720576..c2878f02a691 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -93,7 +93,8 @@ GaugeMetricProducer::GaugeMetricProducer(
StatsdStats::kAtomDimensionKeySizeLimitMap.end()
? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second
: StatsdStats::kDimensionKeySizeHardLimit),
- mGaugeAtomsPerDimensionLimit(metric.max_num_gauge_atoms_per_bucket()) {
+ mGaugeAtomsPerDimensionLimit(metric.max_num_gauge_atoms_per_bucket()),
+ mSplitBucketForAppUpgrade(metric.split_bucket_for_app_upgrade()) {
mCurrentSlicedBucket = std::make_shared<DimToGaugeAtomsMap>();
mCurrentSlicedBucketForAnomaly = std::make_shared<DimToValMap>();
int64_t bucketSizeMills = 0;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index a1a506144d43..df0877954d70 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -74,6 +74,9 @@ public:
const int64_t version) override {
std::lock_guard<std::mutex> lock(mMutex);
+ if (!mSplitBucketForAppUpgrade) {
+ return;
+ }
if (eventTimeNs > getCurrentBucketEndTimeNs()) {
// Flush full buckets on the normal path up to the latest bucket boundary.
flushIfNeededLocked(eventTimeNs);
@@ -176,11 +179,14 @@ private:
const size_t mGaugeAtomsPerDimensionLimit;
+ const bool mSplitBucketForAppUpgrade;
+
FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition);
FRIEND_TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithUpgrade);
+ FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection);
FRIEND_TEST(GaugeMetricProducerTest, TestFirstBucket);
FRIEND_TEST(GaugeMetricProducerTest, TestPullOnTrigger);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 9a8e3bd7b3eb..4122d8440959 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -105,7 +105,8 @@ ValueMetricProducer::ValueMetricProducer(
mUseZeroDefaultBase(metric.use_zero_default_base()),
mHasGlobalBase(false),
mMaxPullDelayNs(metric.max_pull_delay_sec() > 0 ? metric.max_pull_delay_sec() * NS_PER_SEC
- : StatsdStats::kPullMaxDelayNs) {
+ : StatsdStats::kPullMaxDelayNs),
+ mSplitBucketForAppUpgrade(metric.split_bucket_for_app_upgrade()) {
int64_t bucketSizeMills = 0;
if (metric.has_bucket()) {
bucketSizeMills = TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket());
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index 4865aee57187..69eb0afaf7c4 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -57,6 +57,9 @@ public:
void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
const int64_t version) override {
std::lock_guard<std::mutex> lock(mMutex);
+ if (!mSplitBucketForAppUpgrade) {
+ return;
+ }
if (mIsPulled && mCondition) {
pullAndMatchEventsLocked(eventTimeNs - 1);
}
@@ -185,6 +188,8 @@ private:
const int64_t mMaxPullDelayNs;
+ const bool mSplitBucketForAppUpgrade;
+
FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsNoCondition);
FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsWithFiltering);
FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset);
@@ -193,6 +198,7 @@ private:
FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade);
FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade);
FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse);
+ FRIEND_TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled);
FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition);
FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithCondition);
FRIEND_TEST(ValueMetricProducerTest, TestAnomalyDetection);
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
index 381ac321a77a..9d3a66902804 100644
--- a/cmds/statsd/src/statsd_config.proto
+++ b/cmds/statsd/src/statsd_config.proto
@@ -244,6 +244,8 @@ message GaugeMetric {
optional int64 max_num_gauge_atoms_per_bucket = 11 [default = 10];
optional int32 max_pull_delay_sec = 13 [default = 10];
+
+ optional bool split_bucket_for_app_upgrade = 14 [default = true];
}
message ValueMetric {
@@ -290,6 +292,8 @@ message ValueMetric {
optional bool skip_zero_diff_output = 14 [default = true];
optional int32 max_pull_delay_sec = 16 [default = 10];
+
+ optional bool split_bucket_for_app_upgrade = 17 [default = true];
}
message Alert {
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 2799107c53d2..0ffbb54c8d48 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -276,8 +276,9 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
UidMap uidMap;
SimpleAtomMatcher atomMatcher;
atomMatcher.set_atom_id(tagId);
- sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({
- new SimpleLogMatchingTracker(atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
+ sp<EventMatcherWizard> eventMatcherWizard =
+ new EventMatcherWizard({new SimpleLogMatchingTracker(
+ atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
@@ -295,9 +296,8 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
}));
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- logEventMatcherIndex, eventMatcherWizard,
- tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
- pullerManager);
+ logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId,
+ bucketStartTimeNs, bucketStartTimeNs, pullerManager);
vector<shared_ptr<LogEvent>> allData;
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
@@ -337,6 +337,58 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
->mValue.int_value);
}
+TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled) {
+ GaugeMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.set_max_pull_delay_sec(INT_MAX);
+ metric.set_split_bucket_for_app_upgrade(false);
+ auto gaugeFieldMatcher = metric.mutable_gauge_fields_filter()->mutable_fields();
+ gaugeFieldMatcher->set_field(tagId);
+ gaugeFieldMatcher->add_child()->set_field(2);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+
+ UidMap uidMap;
+ SimpleAtomMatcher atomMatcher;
+ atomMatcher.set_atom_id(tagId);
+ sp<EventMatcherWizard> eventMatcherWizard = new EventMatcherWizard({
+ new SimpleLogMatchingTracker(atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, Pull(tagId, _)).WillOnce(Return(false));
+
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
+ logEventMatcherIndex, eventMatcherWizard,
+ tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
+
+ vector<shared_ptr<LogEvent>> allData;
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
+ event->write("some value");
+ event->write(1);
+ event->init();
+ allData.push_back(event);
+ gaugeProducer.onDataPulled(allData);
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ EXPECT_EQ(1, gaugeProducer.mCurrentSlicedBucket->begin()
+ ->second.front()
+ .mFields->begin()
+ ->mValue.int_value);
+
+ gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+ EXPECT_EQ(0UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
+ EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
+ EXPECT_EQ(bucketStartTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ EXPECT_EQ(1, gaugeProducer.mCurrentSlicedBucket->begin()
+ ->second.front()
+ .mFields->begin()
+ ->mValue.int_value);
+}
+
TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition) {
GaugeMetric metric;
metric.set_id(metricId);
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 67570fc2ab51..9cfe3436ada7 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -641,7 +641,8 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
valueProducer.notifyAppUpgrade(bucket2StartTimeNs + 150, "ANY.APP", 1, 1);
EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
EXPECT_EQ(bucket2StartTimeNs + 150, valueProducer.mCurrentBucketStartTimeNs);
- EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].values[0].long_value);
+ EXPECT_EQ(20L,
+ valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].values[0].long_value);
allData.clear();
event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 1);
@@ -652,7 +653,48 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
valueProducer.onDataPulled(allData);
EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
EXPECT_EQ(bucket2StartTimeNs + 150, valueProducer.mCurrentBucketStartTimeNs);
- EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].values[0].long_value);
+ EXPECT_EQ(20L,
+ valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].values[0].long_value);
+}
+
+TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_max_pull_delay_sec(INT_MAX);
+ metric.set_split_bucket_for_app_upgrade(false);
+
+ UidMap uidMap;
+ SimpleAtomMatcher atomMatcher;
+ atomMatcher.set_atom_id(tagId);
+ sp<EventMatcherWizard> eventMatcherWizard =
+ new EventMatcherWizard({new SimpleLogMatchingTracker(
+ atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, Pull(tagId, _)).WillOnce(Return(true));
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
+ eventMatcherWizard, tagId, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
+ event->write(tagId);
+ event->write(100);
+ event->init();
+ allData.push_back(event);
+
+ valueProducer.onDataPulled(allData);
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+
+ valueProducer.notifyAppUpgrade(bucket2StartTimeNs + 150, "ANY.APP", 1, 1);
+ EXPECT_EQ(0UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
+ EXPECT_EQ(bucketStartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
}
TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) {
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index c2e441b35f48..3ec0db4d99ce 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -2768,11 +2768,6 @@ HPLandroid/hardware/location/GeofenceHardwareService$1;->getStatusOfMonitoringTy
HPLandroid/hardware/location/GeofenceHardwareService$1;->registerForMonitorStateChangeCallback(ILandroid/hardware/location/IGeofenceHardwareMonitorCallback;)Z
HPLandroid/hardware/location/GeofenceHardwareService$1;->removeGeofence(II)Z
HPLandroid/hardware/location/GeofenceHardwareService;->checkPermission(III)V
-HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
-HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V
-HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IActivityRecognitionHardwareClient;
-HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HPLandroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
HPLandroid/hardware/location/IContextHubCallback$Stub;->asBinder()Landroid/os/IBinder;
HPLandroid/hardware/location/IContextHubCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
HPLandroid/hardware/location/IContextHubService$Stub$Proxy;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
@@ -21782,7 +21777,6 @@ HSPLandroid/hardware/input/KeyboardLayout$1;-><init>()V
HSPLandroid/hardware/input/TouchCalibration$1;-><init>()V
HSPLandroid/hardware/input/TouchCalibration;-><init>()V
HSPLandroid/hardware/input/TouchCalibration;->getAffineTransform()[F
-HSPLandroid/hardware/location/ActivityRecognitionHardware;->isSupported()Z
HSPLandroid/hardware/location/ContextHubInfo$1;-><init>()V
HSPLandroid/hardware/location/ContextHubInfo;-><init>(Landroid/hardware/contexthub/V1_0/ContextHub;)V
HSPLandroid/hardware/location/ContextHubMessage$1;-><init>()V
@@ -21802,13 +21796,6 @@ HSPLandroid/hardware/location/GeofenceHardwareService$1;->setGpsGeofenceHardware
HSPLandroid/hardware/location/GeofenceHardwareService;-><init>()V
HSPLandroid/hardware/location/GeofenceHardwareService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
HSPLandroid/hardware/location/GeofenceHardwareService;->onCreate()V
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->disableActivityEvent(Ljava/lang/String;I)Z
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->enableActivityEvent(Ljava/lang/String;IJ)Z
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->flush()Z
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->getSupportedActivities()[Ljava/lang/String;
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->isActivitySupported(Ljava/lang/String;)Z
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->registerSink(Landroid/hardware/location/IActivityRecognitionHardwareSink;)Z
-HSPLandroid/hardware/location/IActivityRecognitionHardware;->unregisterSink(Landroid/hardware/location/IActivityRecognitionHardwareSink;)Z
HSPLandroid/hardware/location/IContextHubCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
HSPLandroid/hardware/location/IContextHubCallback$Stub$Proxy;->onMessageReceipt(IILandroid/hardware/location/ContextHubMessage;)V
HSPLandroid/hardware/location/IContextHubCallback;->onMessageReceipt(IILandroid/hardware/location/ContextHubMessage;)V
@@ -55650,7 +55637,6 @@ Landroid/hardware/input/InputManagerInternal;
Landroid/hardware/input/KeyboardLayout$1;
Landroid/hardware/input/TouchCalibration$1;
Landroid/hardware/input/TouchCalibration;
-Landroid/hardware/location/ActivityRecognitionHardware;
Landroid/hardware/location/ContextHubInfo$1;
Landroid/hardware/location/ContextHubInfo;
Landroid/hardware/location/ContextHubManager;
@@ -55666,11 +55652,6 @@ Landroid/hardware/location/GeofenceHardwareMonitorEvent;
Landroid/hardware/location/GeofenceHardwareRequestParcelable$1;
Landroid/hardware/location/GeofenceHardwareService$1;
Landroid/hardware/location/GeofenceHardwareService;
-Landroid/hardware/location/IActivityRecognitionHardware$Stub;
-Landroid/hardware/location/IActivityRecognitionHardware;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;
-Landroid/hardware/location/IActivityRecognitionHardwareClient;
Landroid/hardware/location/IContextHubCallback$Stub$Proxy;
Landroid/hardware/location/IContextHubCallback;
Landroid/hardware/location/IContextHubClient$Stub;
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index a4452a08daf5..765b7f991e90 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -56,7 +56,6 @@ Landroid/app/IActivityManager$Stub$Proxy;->getConfiguration()Landroid/content/re
Landroid/app/IActivityManager$Stub$Proxy;->getLaunchedFromUid(Landroid/os/IBinder;)I
Landroid/app/IActivityManager$Stub$Proxy;->getProcessLimit()I
Landroid/app/IActivityManager$Stub$Proxy;->getProcessPss([I)[J
-Landroid/app/IActivityManager$Stub$Proxy;->isAppForeground(I)Z
Landroid/app/IActivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/app/IActivityManager$Stub$Proxy;->setActivityController(Landroid/app/IActivityController;Z)V
Landroid/app/IActivityManager$Stub$Proxy;->updatePersistentConfiguration(Landroid/content/res/Configuration;)V
@@ -463,8 +462,6 @@ Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
Landroid/hardware/input/IInputManager$Stub;->TRANSACTION_injectInputEvent:I
Landroid/hardware/input/IInputManager;->injectInputEvent(Landroid/view/InputEvent;I)Z
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V
-Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService;
Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager;
@@ -491,7 +488,6 @@ Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landr
Landroid/location/ILocationManager$Stub;->TRANSACTION_getAllProviders:I
Landroid/location/ILocationManager;->getAllProviders()Ljava/util/List;
Landroid/location/ILocationManager;->getNetworkProviderPackage()Ljava/lang/String;
-Landroid/location/ILocationManager;->reportLocation(Landroid/location/Location;Z)V
Landroid/location/INetInitiatedListener$Stub;-><init>()V
Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z
Landroid/location/LocationManager$ListenerTransport;-><init>(Landroid/location/LocationManager;Landroid/location/LocationListener;Landroid/os/Looper;)V
@@ -1110,18 +1106,6 @@ Landroid/os/UserManager;->isUserUnlocked(I)Z
Landroid/os/UserManager;->mService:Landroid/os/IUserManager;
Landroid/os/UserManager;->removeUser(I)Z
Landroid/os/Vibrator;-><init>()V
-Landroid/os/VintfObject;->getHalNamesAndVersions()[Ljava/lang/String;
-Landroid/os/VintfObject;->getSepolicyVersion()Ljava/lang/String;
-Landroid/os/VintfObject;->getTargetFrameworkCompatibilityMatrixVersion()Ljava/lang/Long;
-Landroid/os/VintfObject;->getVndkSnapshots()Ljava/util/Map;
-Landroid/os/VintfObject;->report()[Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getCpuInfo()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getHardwareId()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getKernelVersion()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getNodeName()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getOsName()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getOsRelease()Ljava/lang/String;
-Landroid/os/VintfRuntimeInfo;->getOsVersion()Ljava/lang/String;
Landroid/os/WorkSource;-><init>(Landroid/os/Parcel;)V
Landroid/os/WorkSource;->mNames:[Ljava/lang/String;
Landroid/os/WorkSource;->mNum:I
@@ -1494,7 +1478,6 @@ Landroid/telephony/TelephonyManager$MultiSimVariants;->values()[Landroid/telepho
Landroid/test/AndroidTestCase;->getTestContext()Landroid/content/Context;
Landroid/test/AndroidTestCase;->setTestContext(Landroid/content/Context;)V
Landroid/test/InstrumentationTestCase;->runMethod(Ljava/lang/reflect/Method;I)V
-Landroid/test/RepetitiveTest;->numIterations()I
Landroid/util/Singleton;-><init>()V
Landroid/util/XmlPullAttributes;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
Landroid/util/XmlPullAttributes;->mParser:Lorg/xmlpull/v1/XmlPullParser;
@@ -1827,22 +1810,10 @@ Lcom/android/internal/os/RuntimeInit;->getApplicationObject()Landroid/os/IBinder
Lcom/android/internal/os/RuntimeInit;->initialized:Z
Lcom/android/internal/os/RuntimeInit;->main([Ljava/lang/String;)V
Lcom/android/internal/os/RuntimeInit;->mApplicationObject:Landroid/os/IBinder;
-Lcom/android/internal/os/ZygoteConnection$Arguments;-><init>([Ljava/lang/String;)V
-Lcom/android/internal/os/ZygoteConnection$Arguments;->effectiveCapabilities:J
-Lcom/android/internal/os/ZygoteConnection$Arguments;->gid:I
-Lcom/android/internal/os/ZygoteConnection$Arguments;->gids:[I
-Lcom/android/internal/os/ZygoteConnection$Arguments;->permittedCapabilities:J
-Lcom/android/internal/os/ZygoteConnection$Arguments;->remainingArgs:[Ljava/lang/String;
-Lcom/android/internal/os/ZygoteConnection$Arguments;->rlimits:Ljava/util/ArrayList;
-Lcom/android/internal/os/ZygoteConnection$Arguments;->uid:I
-Lcom/android/internal/os/ZygoteConnection;->applyUidSecurityPolicy(Lcom/android/internal/os/ZygoteConnection$Arguments;Landroid/net/Credentials;)V
Lcom/android/internal/os/ZygoteConnection;->closeSocket()V
-Lcom/android/internal/os/ZygoteConnection;->getFileDesciptor()Ljava/io/FileDescriptor;
-Lcom/android/internal/os/ZygoteConnection;->intArray2d:[[I
Lcom/android/internal/os/ZygoteConnection;->mSocket:Landroid/net/LocalSocket;
Lcom/android/internal/os/ZygoteConnection;->mSocketOutStream:Ljava/io/DataOutputStream;
Lcom/android/internal/os/ZygoteConnection;->peer:Landroid/net/Credentials;
-Lcom/android/internal/os/ZygoteConnection;->readArgumentList()[Ljava/lang/String;
Lcom/android/internal/os/ZygoteInit;->main([Ljava/lang/String;)V
Lcom/android/internal/os/ZygoteInit;->mResources:Landroid/content/res/Resources;
Lcom/android/internal/os/ZygoteSecurityException;-><init>(Ljava/lang/String;)V
@@ -2768,92 +2739,6 @@ Lcom/android/internal/telephony/Connection;->mDuration:J
Lcom/android/internal/telephony/Connection;->mIsIncoming:Z
Lcom/android/internal/telephony/Connection;->mNumberPresentation:I
Lcom/android/internal/telephony/Connection;->setVideoState(I)V
-Lcom/android/internal/telephony/dataconnection/ApnContext;->getApnType()Ljava/lang/String;
-Lcom/android/internal/telephony/dataconnection/ApnContext;->getReason()Ljava/lang/String;
-Lcom/android/internal/telephony/dataconnection/ApnContext;->getState()Lcom/android/internal/telephony/DctConstants$State;
-Lcom/android/internal/telephony/dataconnection/ApnContext;->isConnectable()Z
-Lcom/android/internal/telephony/dataconnection/ApnContext;->isDisconnected()Z
-Lcom/android/internal/telephony/dataconnection/ApnContext;->isEnabled()Z
-Lcom/android/internal/telephony/dataconnection/ApnContext;->isReady()Z
-Lcom/android/internal/telephony/dataconnection/ApnContext;->log(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/ApnContext;->mApnType:Ljava/lang/String;
-Lcom/android/internal/telephony/dataconnection/ApnContext;->mRefCount:I
-Lcom/android/internal/telephony/dataconnection/ApnContext;->mRefCountLock:Ljava/lang/Object;
-Lcom/android/internal/telephony/dataconnection/ApnContext;->setState(Lcom/android/internal/telephony/DctConstants$State;)V
-Lcom/android/internal/telephony/dataconnection/DataConnection$ConnectionParams;->mApnContext:Lcom/android/internal/telephony/dataconnection/ApnContext;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->clearSettings()V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->dumpToLog()V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->initConnection(Lcom/android/internal/telephony/dataconnection/DataConnection$ConnectionParams;)Z
-Lcom/android/internal/telephony/dataconnection/DataConnection;->log(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mActivatingState:Lcom/android/internal/telephony/dataconnection/DataConnection$DcActivatingState;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mActiveState:Lcom/android/internal/telephony/dataconnection/DataConnection$DcActiveState;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mConnectionParams:Lcom/android/internal/telephony/dataconnection/DataConnection$ConnectionParams;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mDataRegState:I
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mDct:Lcom/android/internal/telephony/dataconnection/DcTracker;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mDisconnectingErrorCreatingConnection:Lcom/android/internal/telephony/dataconnection/DataConnection$DcDisconnectionErrorCreatingConnection;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mDisconnectingState:Lcom/android/internal/telephony/dataconnection/DataConnection$DcDisconnectingState;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mDisconnectParams:Lcom/android/internal/telephony/dataconnection/DataConnection$DisconnectParams;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mId:I
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mInactiveState:Lcom/android/internal/telephony/dataconnection/DataConnection$DcInactiveState;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mLinkProperties:Landroid/net/LinkProperties;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mNetworkInfo:Landroid/net/NetworkInfo;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mPhone:Lcom/android/internal/telephony/Phone;
-Lcom/android/internal/telephony/dataconnection/DataConnection;->mRilRat:I
-Lcom/android/internal/telephony/dataconnection/DataConnection;->notifyAllOfConnected(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->notifyDisconnectCompleted(Lcom/android/internal/telephony/dataconnection/DataConnection$DisconnectParams;Z)V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->onConnect(Lcom/android/internal/telephony/dataconnection/DataConnection$ConnectionParams;)V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->tearDownData(Ljava/lang/Object;)V
-Lcom/android/internal/telephony/dataconnection/DataConnection;->updateTcpBufferSizes(I)V
-Lcom/android/internal/telephony/dataconnection/DcController;->lr(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DcController;->mDcListActiveByCid:Ljava/util/HashMap;
-Lcom/android/internal/telephony/dataconnection/DcController;->mDct:Lcom/android/internal/telephony/dataconnection/DcTracker;
-Lcom/android/internal/telephony/dataconnection/DcController;->mDcTesterDeactivateAll:Lcom/android/internal/telephony/dataconnection/DcTesterDeactivateAll;
-Lcom/android/internal/telephony/dataconnection/DcTracker$RecoveryAction;->isAggressiveRecovery(I)Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->cancelReconnectAlarm(Lcom/android/internal/telephony/dataconnection/ApnContext;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->cleanUpAllConnections(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->createAllApnList()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->getActiveApnTypes()[Ljava/lang/String;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->getOverallState()Lcom/android/internal/telephony/DctConstants$State;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->getUiccRecords(I)Lcom/android/internal/telephony/uicc/IccRecords;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->isConnected()Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->isDisconnected()Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->isOnlySingleDcAllowed(I)Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->log(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->loge(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mAllApnSettings:Ljava/util/ArrayList;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mApnContexts:Ljava/util/concurrent/ConcurrentHashMap;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mAttached:Ljava/util/concurrent/atomic/AtomicBoolean;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mAutoAttachOnCreation:Ljava/util/concurrent/atomic/AtomicBoolean;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mDataConnectionTracker:Landroid/os/Handler;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mDisconnectPendingCount:I
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mIccRecords:Ljava/util/concurrent/atomic/AtomicReference;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mIsPsRestricted:Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mIsScreenOn:Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mNetStatPollEnabled:Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mNetStatPollPeriod:I
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mPhone:Lcom/android/internal/telephony/Phone;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mPrioritySortedApnContexts:Ljava/util/PriorityQueue;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mProvisioningSpinner:Landroid/app/ProgressDialog;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mResolver:Landroid/content/ContentResolver;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mState:Lcom/android/internal/telephony/DctConstants$State;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->mSubscriptionManager:Landroid/telephony/SubscriptionManager;
-Lcom/android/internal/telephony/dataconnection/DcTracker;->onActionIntentDataStallAlarm(Landroid/content/Intent;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->onActionIntentProvisioningApnAlarm(Landroid/content/Intent;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->onRecordsLoadedOrSubIdChanged()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->onTrySetupData(Lcom/android/internal/telephony/dataconnection/ApnContext;)Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->onTrySetupData(Ljava/lang/String;)Z
-Lcom/android/internal/telephony/dataconnection/DcTracker;->registerSettingsObserver()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->resetPollStats()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->restartDataStallAlarm()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->setInitialAttachApn()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->setPreferredApn(I)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->setRadio(Z)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->setupDataOnConnectableApns(Ljava/lang/String;)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->startDataStallAlarm(Z)V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->startNetStatPoll()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->stopDataStallAlarm()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->stopNetStatPoll()V
-Lcom/android/internal/telephony/dataconnection/DcTracker;->unregisterForAllDataDisconnected(Landroid/os/Handler;)V
Lcom/android/internal/telephony/DctConstants$Activity;->DATAIN:Lcom/android/internal/telephony/DctConstants$Activity;
Lcom/android/internal/telephony/DctConstants$Activity;->DATAINANDOUT:Lcom/android/internal/telephony/DctConstants$Activity;
Lcom/android/internal/telephony/DctConstants$Activity;->DATAOUT:Lcom/android/internal/telephony/DctConstants$Activity;
@@ -3651,11 +3536,9 @@ Lcom/android/internal/telephony/SubscriptionInfoUpdater;->logd(Ljava/lang/String
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mContext:Landroid/content/Context;
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mCurrentlyActiveUserId:I
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mIccId:[Ljava/lang/String;
-Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mInsertSimState:[I
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mPackageManager:Landroid/content/pm/IPackageManager;
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->mPhone:[Lcom/android/internal/telephony/Phone;
Lcom/android/internal/telephony/SubscriptionInfoUpdater;->PROJECT_SIM_NUM:I
-Lcom/android/internal/telephony/SubscriptionInfoUpdater;->updateSubscriptionInfoByIccId()V
Lcom/android/internal/telephony/TelephonyCapabilities;->supportsAdn(I)Z
Lcom/android/internal/telephony/TelephonyProperties;->PROPERTY_ICC_OPERATOR_NUMERIC:Ljava/lang/String;
Lcom/android/internal/telephony/test/InterpreterEx;-><init>(Ljava/lang/String;)V
diff --git a/config/preloaded-classes b/config/preloaded-classes
index c8a2a9c19b28..cd798adf5d44 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -1405,10 +1405,7 @@ android.hardware.input.InputManager
android.hardware.input.InputManager$InputDeviceListener
android.hardware.input.InputManager$InputDeviceListenerDelegate
android.hardware.input.InputManager$InputDevicesChangedListener
-android.hardware.location.ActivityRecognitionHardware
android.hardware.location.ContextHubManager
-android.hardware.location.IActivityRecognitionHardware
-android.hardware.location.IActivityRecognitionHardware$Stub
android.hardware.radio.RadioManager
android.hardware.soundtrigger.SoundTrigger
android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index f2ad2683f4e0..35098a0ff5d9 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -1090,7 +1090,7 @@ public abstract class AccessibilityService extends Service {
* called) or the service has been disconnected, this method will have
* no effect and return {@code false}.
*
- * @param scale the magnification scale to set, must be >= 1 and <= 5
+ * @param scale the magnification scale to set, must be >= 1 and <= 8
* @param animate {@code true} to animate from the current scale or
* {@code false} to set the scale immediately
* @return {@code true} on success, {@code false} on failure
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 5b8261e38f1e..836627efb379 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -17,6 +17,7 @@
package android.app;
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
+import static android.os.Process.myUid;
import static java.lang.Character.MIN_VALUE;
@@ -121,7 +122,9 @@ import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillManager.AutofillClient;
import android.view.autofill.AutofillPopupWindow;
import android.view.autofill.IAutofillWindowPresenter;
+import android.view.contentcapture.ContentCaptureContext;
import android.view.contentcapture.ContentCaptureManager;
+import android.view.contentcapture.ContentCaptureSession;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.Toolbar;
@@ -1022,7 +1025,9 @@ public class Activity extends ContextThemeWrapper
*
* @return The content capture manager
*/
- @NonNull private ContentCaptureManager getContentCaptureManager() {
+ @Nullable private ContentCaptureManager getContentCaptureManager() {
+ // ContextCapture disabled for system apps
+ if (!UserHandle.isApp(myUid())) return null;
if (mContentCaptureManager == null) {
mContentCaptureManager = getSystemService(ContentCaptureManager.class);
}
@@ -1030,13 +1035,15 @@ public class Activity extends ContextThemeWrapper
}
/** @hide */ private static final int CONTENT_CAPTURE_START = 1;
- /** @hide */ private static final int CONTENT_CAPTURE_FLUSH = 2;
- /** @hide */ private static final int CONTENT_CAPTURE_STOP = 3;
+ /** @hide */ private static final int CONTENT_CAPTURE_PAUSE = 2;
+ /** @hide */ private static final int CONTENT_CAPTURE_RESUME = 3;
+ /** @hide */ private static final int CONTENT_CAPTURE_STOP = 4;
/** @hide */
@IntDef(prefix = { "CONTENT_CAPTURE_" }, value = {
CONTENT_CAPTURE_START,
- CONTENT_CAPTURE_FLUSH,
+ CONTENT_CAPTURE_PAUSE,
+ CONTENT_CAPTURE_RESUME,
CONTENT_CAPTURE_STOP
})
@Retention(RetentionPolicy.SOURCE)
@@ -1045,17 +1052,24 @@ public class Activity extends ContextThemeWrapper
private void notifyContentCaptureManagerIfNeeded(@ContentCaptureNotificationType int type) {
final ContentCaptureManager cm = getContentCaptureManager();
- if (cm == null || !cm.isContentCaptureEnabled()) {
- return;
- }
+ if (cm == null) return;
+
switch (type) {
case CONTENT_CAPTURE_START:
//TODO(b/111276913): decide whether the InteractionSessionId should be
// saved / restored in the activity bundle - probably not
- cm.onActivityStarted(mToken, getComponentName());
+ int flags = 0;
+ if ((getWindow().getAttributes().flags
+ & WindowManager.LayoutParams.FLAG_SECURE) != 0) {
+ flags |= ContentCaptureContext.FLAG_DISABLED_BY_FLAG_SECURE;
+ }
+ cm.onActivityStarted(mToken, getComponentName(), flags);
+ break;
+ case CONTENT_CAPTURE_PAUSE:
+ cm.flush(ContentCaptureSession.FLUSH_REASON_ACTIVITY_PAUSED);
break;
- case CONTENT_CAPTURE_FLUSH:
- cm.flush();
+ case CONTENT_CAPTURE_RESUME:
+ cm.flush(ContentCaptureSession.FLUSH_REASON_ACTIVITY_RESUMED);
break;
case CONTENT_CAPTURE_STOP:
cm.onActivityStopped();
@@ -1747,7 +1761,7 @@ public class Activity extends ContextThemeWrapper
}
}
mCalled = true;
- notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_FLUSH);
+ notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_RESUME);
}
/**
@@ -2141,7 +2155,7 @@ public class Activity extends ContextThemeWrapper
}
}
mCalled = true;
- notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_FLUSH);
+ notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_PAUSE);
}
/**
@@ -2158,6 +2172,7 @@ public class Activity extends ContextThemeWrapper
* for helping activities determine the proper time to cancel a notification.
*
* @see #onUserInteraction()
+ * @see android.content.Intent#FLAG_ACTIVITY_NO_USER_ACTION
*/
protected void onUserLeaveHint() {
}
@@ -8282,6 +8297,33 @@ public class Activity extends ContextThemeWrapper
}
/**
+ * Specifies whether this {@link Activity} should be shown on top of the lock screen whenever
+ * the lockscreen is up and this activity has another activity behind it with the showWhenLock
+ * attribute set. That is, this activity is only visible on the lock screen if there is another
+ * activity with the showWhenLock attribute visible at the same time on the lock screen. A use
+ * case for this is permission dialogs, that should only be visible on the lock screen if their
+ * requesting activity is also visible. This value can be set as a manifest attribute using
+ * android.R.attr#inheritShowWhenLocked.
+ *
+ * @param inheritShowWhenLocked {@code true} to show the {@link Activity} on top of the lock
+ * screen when this activity has another activity behind it with
+ * the showWhenLock attribute set; {@code false} otherwise.
+ * @see #setShowWhenLocked(boolean)
+ * See android.R.attr#inheritShowWhenLocked
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public void setInheritShowWhenLocked(boolean inheritShowWhenLocked) {
+ try {
+ ActivityTaskManager.getService().setInheritShowWhenLocked(
+ mToken, inheritShowWhenLocked);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to call setInheritShowWhenLocked", e);
+ }
+ }
+
+ /**
* Specifies whether the screen should be turned on when the {@link Activity} is resumed.
* Normally an activity will be transitioned to the stopped state if it is started while the
* screen if off, but with this flag set the activity will cause the screen to turn on if the
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index d42326020323..e0b8d78ebabc 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -3705,11 +3705,16 @@ public class ActivityManager {
* Returns whether switching to provided user was successful.
*
* @param user the user to switch to.
+ *
+ * @throws IllegalArgumentException if the user is null.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_USERS)
- public boolean switchUser(UserHandle user) {
+ public boolean switchUser(@NonNull UserHandle user) {
+ if (user == null) {
+ throw new IllegalArgumentException("UserHandle cannot be null.");
+ }
return switchUser(user.getIdentifier());
}
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 0b509169010c..5cac0489e8df 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -258,8 +258,8 @@ public abstract class ActivityManagerInternal {
Bundle resultExtras, String requiredPermission, Bundle bOptions, boolean serialized,
boolean sticky, int userId, boolean allowBackgroundActivityStarts);
public abstract ComponentName startServiceInPackage(int uid, Intent service,
- String resolvedType, boolean fgRequired, String callingPackage, int userId)
- throws TransactionTooLargeException;
+ String resolvedType, boolean fgRequired, String callingPackage, int userId,
+ boolean allowBackgroundActivityStarts) throws TransactionTooLargeException;
public abstract void disconnectActivityFromServices(Object connectionHolder);
public abstract void cleanUpServices(int userId, ComponentName component, Intent baseIntent);
@@ -314,4 +314,16 @@ public abstract class ActivityManagerInternal {
/** Returns mount mode for process running with given pid */
public abstract int getStorageMountMode(int pid, int uid);
+
+ /** Returns true if the given uid is the app in the foreground. */
+ public abstract boolean isAppForeground(int uid);
+
+ /** Remove pending backup for the given userId. */
+ public abstract void clearPendingBackup(int userId);
+
+ /**
+ * When power button is very long pressed, call this interface to do some pre-shutdown work
+ * like persisting database etc.
+ */
+ public abstract void prepareForPossibleShutdown();
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 35fd0d90b9e6..b4d20c35e6e3 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -272,6 +272,13 @@ public final class ActivityThread extends ClientTransactionHandler {
@UnsupportedAppUsage
final H mH = new H();
final Executor mExecutor = new HandlerExecutor(mH);
+ /**
+ * Maps from activity token to local record of running activities in this process.
+ *
+ * This variable is readable if the code is running in activity thread or holding {@link
+ * #mResourcesManager}. It's only writable if the code is running in activity thread and holding
+ * {@link #mResourcesManager}.
+ */
@UnsupportedAppUsage
final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
/** The activities to be truly destroyed (not include relaunch). */
@@ -435,6 +442,10 @@ public final class ActivityThread extends ClientTransactionHandler {
Configuration newConfig;
Configuration createdConfig;
Configuration overrideConfig;
+ // Used to save the last reported configuration from server side so that activity
+ // configuration transactions can always use the latest configuration.
+ @GuardedBy("this")
+ private Configuration mPendingOverrideConfig;
// Used for consolidating configs before sending on to Activity.
private Configuration tmpConfig = new Configuration();
// Callback used for updating activity override config.
@@ -3065,7 +3076,12 @@ public final class ActivityThread extends ClientTransactionHandler {
}
r.setState(ON_CREATE);
- mActivities.put(r.token, r);
+ // updatePendingActivityConfiguration() reads from mActivities to update
+ // ActivityClientRecord which runs in a different thread. Protect modifications to
+ // mActivities to avoid race.
+ synchronized (mResourcesManager) {
+ mActivities.put(r.token, r);
+ }
} catch (SuperNotCalledException e) {
throw e;
@@ -4640,7 +4656,12 @@ public final class ActivityThread extends ClientTransactionHandler {
r.setState(ON_DESTROY);
}
schedulePurgeIdler();
- mActivities.remove(token);
+ // updatePendingActivityConfiguration() reads from mActivities to update
+ // ActivityClientRecord which runs in a different thread. Protect modifications to
+ // mActivities to avoid race.
+ synchronized (mResourcesManager) {
+ mActivities.remove(token);
+ }
StrictMode.decrementExpectedActivityCount(activityClass);
return r;
}
@@ -5383,6 +5404,26 @@ public final class ActivityThread extends ClientTransactionHandler {
}
}
+ @Override
+ public void updatePendingActivityConfiguration(IBinder activityToken,
+ Configuration overrideConfig) {
+ final ActivityClientRecord r;
+ synchronized (mResourcesManager) {
+ r = mActivities.get(activityToken);
+ }
+
+ if (r == null) {
+ if (DEBUG_CONFIGURATION) {
+ Slog.w(TAG, "Not found target activity to update its pending config.");
+ }
+ return;
+ }
+
+ synchronized (r) {
+ r.mPendingOverrideConfig = overrideConfig;
+ }
+ }
+
/**
* Handle new activity configuration and/or move to a different display.
* @param activityToken Target activity token.
@@ -5402,6 +5443,24 @@ public final class ActivityThread extends ClientTransactionHandler {
final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY
&& displayId != r.activity.getDisplayId();
+ synchronized (r) {
+ if (r.mPendingOverrideConfig != null
+ && !r.mPendingOverrideConfig.isOtherSeqNewer(overrideConfig)) {
+ overrideConfig = r.mPendingOverrideConfig;
+ }
+ r.mPendingOverrideConfig = null;
+ }
+
+ if (r.overrideConfig != null && !r.overrideConfig.isOtherSeqNewer(overrideConfig)
+ && !movedToDifferentDisplay) {
+ if (DEBUG_CONFIGURATION) {
+ Slog.v(TAG, "Activity already handled newer configuration so drop this"
+ + " transaction. overrideConfig=" + overrideConfig + " r.overrideConfig="
+ + r.overrideConfig);
+ }
+ return;
+ }
+
// Perform updates.
r.overrideConfig = overrideConfig;
final ViewRootImpl viewRoot = r.activity.mDecor != null
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 0b5776e89524..ab8f234766d6 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -16,6 +16,10 @@
package android.app;
+import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
+import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
+import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
+
import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
import android.app.ActivityManager.StackInfo;
@@ -32,11 +36,11 @@ import android.util.Log;
import android.view.IWindowManager;
import android.view.InputDevice;
import android.view.MotionEvent;
-import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceHolder;
import android.view.SurfaceSession;
import android.view.SurfaceView;
+import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -81,7 +85,6 @@ public class ActivityView extends ViewGroup {
private boolean mOpened; // Protected by mGuard.
private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
- private Surface mTmpSurface = new Surface();
/** The ActivityView is only allowed to contain one task. */
private final boolean mSingleTaskInstance;
@@ -318,20 +321,20 @@ public class ActivityView extends ViewGroup {
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
- mTmpSurface = new Surface();
if (mVirtualDisplay == null) {
- initVirtualDisplay(new SurfaceSession(surfaceHolder.getSurface()));
+ initVirtualDisplay(new SurfaceSession());
if (mVirtualDisplay != null && mActivityViewCallback != null) {
mActivityViewCallback.onActivityViewReady(ActivityView.this);
}
} else {
- // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by
- // whether it has a surface. Setting a fake surface here so DisplayManager will
- // consider this display on.
- mVirtualDisplay.setSurface(mTmpSurface);
mTmpTransaction.reparent(mRootSurfaceControl,
mSurfaceView.getSurfaceControl().getHandle()).apply();
}
+
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.setDisplayState(true);
+ }
+
updateLocation();
}
@@ -345,15 +348,19 @@ public class ActivityView extends ViewGroup {
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
- mTmpSurface.release();
- mTmpSurface = null;
if (mVirtualDisplay != null) {
- mVirtualDisplay.setSurface(null);
+ mVirtualDisplay.setDisplayState(false);
}
cleanTapExcludeRegion();
}
}
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ mSurfaceView.setVisibility(visibility);
+ }
+
private void initVirtualDisplay(SurfaceSession surfaceSession) {
if (mVirtualDisplay != null) {
throw new IllegalStateException("Trying to initialize for the second time.");
@@ -363,15 +370,11 @@ public class ActivityView extends ViewGroup {
final int height = mSurfaceView.getHeight();
final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
- // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by
- // whether it has a surface. Setting a fake surface here so DisplayManager will consider
- // this display on.
mVirtualDisplay = displayManager.createVirtualDisplay(
- DISPLAY_NAME + "@" + System.identityHashCode(this),
- width, height, getBaseDisplayDensity(), mTmpSurface,
- DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC
- | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
- | DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL);
+ DISPLAY_NAME + "@" + System.identityHashCode(this), width, height,
+ getBaseDisplayDensity(), null,
+ VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
+ | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL);
if (mVirtualDisplay == null) {
Log.e(TAG, "Failed to initialize ActivityView");
return;
@@ -382,6 +385,7 @@ public class ActivityView extends ViewGroup {
mRootSurfaceControl = new SurfaceControl.Builder(surfaceSession)
.setContainerLayer(true)
+ .setParent(mSurfaceView.getSurfaceControl())
.setName(DISPLAY_NAME)
.build();
@@ -435,11 +439,6 @@ public class ActivityView extends ViewGroup {
displayReleased = false;
}
- if (mTmpSurface != null) {
- mTmpSurface.release();
- mTmpSurface = null;
- }
-
if (displayReleased && mActivityViewCallback != null) {
mActivityViewCallback.onActivityViewDestroyed(this);
}
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index cf40e067e5b1..bfc216a24c1b 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -25,6 +25,7 @@ import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.ResourceId;
+import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -465,7 +466,7 @@ public class AlertDialog extends Dialog implements DialogInterface {
* @param context the parent context
*/
public Builder(Context context) {
- this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
+ this(context, resolveDialogTheme(context, Resources.ID_NULL));
}
/**
diff --git a/core/java/android/app/AppOpsManager.aidl b/core/java/android/app/AppOpsManager.aidl
index 9329fbc83376..224030202e08 100644
--- a/core/java/android/app/AppOpsManager.aidl
+++ b/core/java/android/app/AppOpsManager.aidl
@@ -19,5 +19,7 @@ package android.app;
parcelable AppOpsManager.PackageOps;
parcelable AppOpsManager.OpEntry;
+parcelable AppOpsManager.HistoricalOp;
+parcelable AppOpsManager.HistoricalOps;
parcelable AppOpsManager.HistoricalPackageOps;
-parcelable AppOpsManager.HistoricalOpEntry;
+parcelable AppOpsManager.HistoricalUidOps;
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 78fe0024b0b0..e155fe201f98 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -36,26 +36,33 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.UserManager;
import android.provider.Settings;
import android.util.ArrayMap;
import com.android.internal.annotations.GuardedBy;
+import android.util.SparseArray;
import com.android.internal.app.IAppOpsActiveCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsNotedCallback;
import com.android.internal.app.IAppOpsService;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
/**
* API for interacting with "application operation" tracking.
@@ -106,6 +113,51 @@ public class AppOpsManager {
static IBinder sToken;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, prefix = { "HISTORICAL_MODE_" }, value = {
+ HISTORICAL_MODE_DISABLED,
+ HISTORICAL_MODE_ENABLED_ACTIVE,
+ HISTORICAL_MODE_ENABLED_PASSIVE
+ })
+ public @interface HistoricalMode {}
+
+ /**
+ * Mode in which app op history is completely disabled.
+ * @hide
+ */
+ @TestApi
+ public static final int HISTORICAL_MODE_DISABLED = 0;
+
+ /**
+ * Mode in which app op history is enabled and app ops performed by apps would
+ * be tracked. This is the mode in which the feature is completely enabled.
+ * @hide
+ */
+ @TestApi
+ public static final int HISTORICAL_MODE_ENABLED_ACTIVE = 1;
+
+ /**
+ * Mode in which app op history is enabled but app ops performed by apps would
+ * not be tracked and the only way to add ops to the history is via explicit calls
+ * to dedicated APIs. This mode is useful for testing to allow full control of
+ * the historical content.
+ * @hide
+ */
+ @TestApi
+ public static final int HISTORICAL_MODE_ENABLED_PASSIVE = 2;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, prefix = { "MODE_" }, value = {
+ MODE_ALLOWED,
+ MODE_IGNORED,
+ MODE_ERRORED,
+ MODE_DEFAULT,
+ MODE_FOREGROUND
+ })
+ public @interface Mode {}
+
/**
* Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is
* allowed to perform the given operation.
@@ -159,7 +211,6 @@ public class AppOpsManager {
"foreground", // MODE_FOREGROUND
};
-
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, prefix = { "UID_STATE_" }, value = {
@@ -173,9 +224,16 @@ public class AppOpsManager {
public @interface UidState {}
/**
+ * Invalid UID state.
+ * @hide
+ */
+ public static final int UID_STATE_INVALID = -1;
+
+ /**
* Metrics about an op when its uid is persistent.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_PERSISTENT = 0;
@@ -183,6 +241,7 @@ public class AppOpsManager {
* Metrics about an op when its uid is at the top.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_TOP = 1;
@@ -190,6 +249,7 @@ public class AppOpsManager {
* Metrics about an op when its uid is running a foreground service.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_FOREGROUND_SERVICE = 2;
@@ -203,6 +263,7 @@ public class AppOpsManager {
* Metrics about an op when its uid is in the foreground for any other reasons.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_FOREGROUND = 3;
@@ -210,6 +271,7 @@ public class AppOpsManager {
* Metrics about an op when its uid is in the background for any reason.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_BACKGROUND = 4;
@@ -217,6 +279,7 @@ public class AppOpsManager {
* Metrics about an op when its uid is cached.
* @hide
*/
+ @TestApi
@SystemApi
public static final int UID_STATE_CACHED = 5;
@@ -237,7 +300,7 @@ public class AppOpsManager {
@UnsupportedAppUsage
public static final int OP_NONE = -1;
/** @hide Access to coarse location information. */
- @UnsupportedAppUsage
+ @TestApi
public static final int OP_COARSE_LOCATION = 0;
/** @hide Access to fine location information. */
@UnsupportedAppUsage
@@ -1645,6 +1708,9 @@ public class AppOpsManager {
}
}
+ /** @hide */
+ public static final String KEY_HISTORICAL_OPS = "historical_ops";
+
/**
* Retrieve the op switch that controls the given operation.
* @hide
@@ -1731,7 +1797,7 @@ public class AppOpsManager {
* Retrieve the default mode for the operation.
* @hide
*/
- public static int opToDefaultMode(int op) {
+ public static @Mode int opToDefaultMode(int op) {
// STOPSHIP b/118520006: Hardcode the default values once the feature is stable.
switch (op) {
// SMS permissions
@@ -1795,7 +1861,7 @@ public class AppOpsManager {
* Retrieve the human readable mode.
* @hide
*/
- public static String modeToName(int mode) {
+ public static String modeToName(@Mode int mode) {
if (mode >= 0 && mode < MODE_NAMES.length) {
return MODE_NAMES[mode];
}
@@ -1885,7 +1951,7 @@ public class AppOpsManager {
@SystemApi
public static final class OpEntry implements Parcelable {
private final int mOp;
- private final int mMode;
+ private final @Mode int mMode;
private final long[] mTimes;
private final long[] mRejectTimes;
private final int mDuration;
@@ -1896,7 +1962,7 @@ public class AppOpsManager {
/**
* @hide
*/
- public OpEntry(int op, int mode, long time, long rejectTime, int duration,
+ public OpEntry(int op, @Mode int mode, long time, long rejectTime, int duration,
int proxyUid, String proxyPackage) {
mOp = op;
mMode = mode;
@@ -1913,7 +1979,7 @@ public class AppOpsManager {
/**
* @hide
*/
- public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration,
+ public OpEntry(int op, @Mode int mode, long[] times, long[] rejectTimes, int duration,
boolean running, int proxyUid, String proxyPackage) {
mOp = op;
mMode = mode;
@@ -1930,7 +1996,7 @@ public class AppOpsManager {
/**
* @hide
*/
- public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration,
+ public OpEntry(int op, @Mode int mode, long[] times, long[] rejectTimes, int duration,
int proxyUid, String proxyPackage) {
this(op, mode, times, rejectTimes, duration, duration == -1, proxyUid, proxyPackage);
}
@@ -1953,7 +2019,7 @@ public class AppOpsManager {
/**
* Return this entry's current mode, such as {@link #MODE_ALLOWED}.
*/
- public int getMode() {
+ public @Mode int getMode() {
return mMode;
}
@@ -2086,83 +2152,813 @@ public class AppOpsManager {
};
}
+ /** @hide */
+ public interface HistoricalOpsVisitor {
+ void visitHistoricalOps(@NonNull HistoricalOps ops);
+ void visitHistoricalUidOps(@NonNull HistoricalUidOps ops);
+ void visitHistoricalPackageOps(@NonNull HistoricalPackageOps ops);
+ void visitHistoricalOp(@NonNull HistoricalOp ops);
+ }
+
/**
- * This class represents historical app op information about a package. The history
- * is aggregated information about ops for a certain amount of time such
- * as the times the op was accessed, the times the op was rejected, the total
- * duration the app op has been accessed.
+ * This class represents historical app op state of all UIDs for a given time interval.
*
* @hide
*/
@TestApi
@SystemApi
- public static final class HistoricalPackageOps implements Parcelable {
- private final int mUid;
- private final @NonNull String mPackageName;
- private final @NonNull List<HistoricalOpEntry> mEntries;
+ public static final class HistoricalOps implements Parcelable {
+ private long mBeginTimeMillis;
+ private long mEndTimeMillis;
+ private @Nullable SparseArray<HistoricalUidOps> mHistoricalUidOps;
+
+ /** @hide */
+ @TestApi
+ public HistoricalOps(long beginTimeMillis, long endTimeMillis) {
+ Preconditions.checkState(beginTimeMillis <= endTimeMillis);
+ mBeginTimeMillis = beginTimeMillis;
+ mEndTimeMillis = endTimeMillis;
+ }
+
+ /** @hide */
+ public HistoricalOps(@NonNull HistoricalOps other) {
+ mBeginTimeMillis = other.mBeginTimeMillis;
+ mEndTimeMillis = other.mEndTimeMillis;
+ Preconditions.checkState(mBeginTimeMillis <= mEndTimeMillis);
+ if (other.mHistoricalUidOps != null) {
+ final int opCount = other.getUidCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalUidOps origOps = other.getUidOpsAt(i);
+ final HistoricalUidOps clonedOps = new HistoricalUidOps(origOps);
+ if (mHistoricalUidOps == null) {
+ mHistoricalUidOps = new SparseArray<>(opCount);
+ }
+ mHistoricalUidOps.put(clonedOps.getUid(), clonedOps);
+ }
+ }
+ }
+
+ private HistoricalOps(Parcel parcel) {
+ mBeginTimeMillis = parcel.readLong();
+ mEndTimeMillis = parcel.readLong();
+ final int[] uids = parcel.createIntArray();
+ if (!ArrayUtils.isEmpty(uids)) {
+ final ParceledListSlice<HistoricalUidOps> listSlice = parcel.readParcelable(
+ HistoricalOps.class.getClassLoader());
+ final List<HistoricalUidOps> uidOps = (listSlice != null)
+ ? listSlice.getList() : null;
+ if (uidOps == null) {
+ return;
+ }
+ for (int i = 0; i < uids.length; i++) {
+ if (mHistoricalUidOps == null) {
+ mHistoricalUidOps = new SparseArray<>();
+ }
+ mHistoricalUidOps.put(uids[i], uidOps.get(i));
+ }
+ }
+ }
/**
+ * Splice a piece from the beginning of these ops.
+ *
+ * @param splicePoint The fraction of the data to be spliced off.
+ *
* @hide
*/
- public HistoricalPackageOps(int uid, @NonNull String packageName) {
- mUid = uid;
- mPackageName = packageName;
- mEntries = new ArrayList<>();
+ public @NonNull HistoricalOps spliceFromBeginning(double splicePoint) {
+ return splice(splicePoint, true);
}
- HistoricalPackageOps(@NonNull Parcel parcel) {
- mUid = parcel.readInt();
- mPackageName = parcel.readString();
- mEntries = parcel.createTypedArrayList(HistoricalOpEntry.CREATOR);
+ /**
+ * Splice a piece from the end of these ops.
+ *
+ * @param fractionToRemove The fraction of the data to be spliced off.
+ *
+ * @hide
+ */
+ public @NonNull HistoricalOps spliceFromEnd(double fractionToRemove) {
+ return splice(fractionToRemove, false);
}
/**
+ * Splice a piece from the beginning or end of these ops.
+ *
+ * @param fractionToRemove The fraction of the data to be spliced off.
+ * @param beginning Whether to splice off the beginning or the end.
+ *
+ * @return The spliced off part.
+ *
* @hide
*/
- public void addEntry(@NonNull HistoricalOpEntry entry) {
- mEntries.add(entry);
+ private @Nullable HistoricalOps splice(double fractionToRemove, boolean beginning) {
+ final long spliceBeginTimeMills;
+ final long spliceEndTimeMills;
+ if (beginning) {
+ spliceBeginTimeMills = mBeginTimeMillis;
+ spliceEndTimeMills = (long) (mBeginTimeMillis
+ + getDurationMillis() * fractionToRemove);
+ mBeginTimeMillis = spliceEndTimeMills;
+ } else {
+ spliceBeginTimeMills = (long) (mEndTimeMillis
+ - getDurationMillis() * fractionToRemove);
+ spliceEndTimeMills = mEndTimeMillis;
+ mEndTimeMillis = spliceBeginTimeMills;
+ }
+
+ HistoricalOps splice = null;
+ final int uidCount = getUidCount();
+ for (int i = 0; i < uidCount; i++) {
+ final HistoricalUidOps origOps = getUidOpsAt(i);
+ final HistoricalUidOps spliceOps = origOps.splice(fractionToRemove);
+ if (spliceOps != null) {
+ if (splice == null) {
+ splice = new HistoricalOps(spliceBeginTimeMills, spliceEndTimeMills);
+ }
+ if (splice.mHistoricalUidOps == null) {
+ splice.mHistoricalUidOps = new SparseArray<>();
+ }
+ splice.mHistoricalUidOps.put(spliceOps.getUid(), spliceOps);
+ }
+ }
+ return splice;
}
/**
- * Gets the package name which the data represents.
+ * Merge the passed ops into the current ones. The time interval is a
+ * union of the current and passed in one and the passed in data is
+ * folded into the data of this instance.
*
- * @return The package name which the data represents.
+ * @hide
*/
- public @NonNull String getPackageName() {
- return mPackageName;
+ public void merge(@NonNull HistoricalOps other) {
+ mBeginTimeMillis = Math.min(mBeginTimeMillis, other.mBeginTimeMillis);
+ mEndTimeMillis = Math.max(mEndTimeMillis, other.mEndTimeMillis);
+ final int uidCount = other.getUidCount();
+ for (int i = 0; i < uidCount; i++) {
+ final HistoricalUidOps otherUidOps = other.getUidOpsAt(i);
+ final HistoricalUidOps thisUidOps = getUidOps(otherUidOps.getUid());
+ if (thisUidOps != null) {
+ thisUidOps.merge(otherUidOps);
+ } else {
+ if (mHistoricalUidOps == null) {
+ mHistoricalUidOps = new SparseArray<>();
+ }
+ mHistoricalUidOps.put(otherUidOps.getUid(), otherUidOps);
+ }
+ }
+ }
+
+ /**
+ * AppPermissionUsage the ops to leave only the data we filter for.
+ *
+ * @param uid Uid to filter for or {@link android.os.Process#INCIDENTD_UID} for all.
+ * @param packageName Package to filter for or null for all.
+ * @param opNames Ops to filter for or null for all.
+ * @param beginTimeMillis The begin time to filter for or {@link Long#MIN_VALUE} for all.
+ * @param endTimeMillis The end time to filter for or {@link Long#MAX_VALUE} for all.
+ *
+ * @hide
+ */
+ public void filter(int uid, @Nullable String packageName, @Nullable String[] opNames,
+ long beginTimeMillis, long endTimeMillis) {
+ final long durationMillis = getDurationMillis();
+ mBeginTimeMillis = Math.max(mBeginTimeMillis, beginTimeMillis);
+ mEndTimeMillis = Math.min(mEndTimeMillis, endTimeMillis);
+ final double scaleFactor = Math.min((double) (endTimeMillis - beginTimeMillis)
+ / (double) durationMillis, 1);
+ final int uidCount = getUidCount();
+ for (int i = uidCount - 1; i >= 0; i--) {
+ final HistoricalUidOps uidOp = mHistoricalUidOps.valueAt(i);
+ if (uid != Process.INVALID_UID && uid != uidOp.getUid()) {
+ mHistoricalUidOps.removeAt(i);
+ } else {
+ uidOp.filter(packageName, opNames, scaleFactor);
+ }
+ }
+ }
+
+ /** @hide */
+ public boolean isEmpty() {
+ if (getBeginTimeMillis() >= getEndTimeMillis()) {
+ return true;
+ }
+ final int uidCount = getUidCount();
+ for (int i = uidCount - 1; i >= 0; i--) {
+ final HistoricalUidOps uidOp = mHistoricalUidOps.valueAt(i);
+ if (!uidOp.isEmpty()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /** @hide */
+ public long getDurationMillis() {
+ return mEndTimeMillis - mBeginTimeMillis;
+ }
+
+ /** @hide */
+ @TestApi
+ public void increaseAccessCount(int opCode, int uid, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalUidOps(uid).increaseAccessCount(opCode,
+ packageName, uidState, increment);
+ }
+
+ /** @hide */
+ @TestApi
+ public void increaseRejectCount(int opCode, int uid, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalUidOps(uid).increaseRejectCount(opCode,
+ packageName, uidState, increment);
+ }
+
+ /** @hide */
+ @TestApi
+ public void increaseAccessDuration(int opCode, int uid, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalUidOps(uid).increaseAccessDuration(opCode,
+ packageName, uidState, increment);
+ }
+
+ /** @hide */
+ @TestApi
+ public void offsetBeginAndEndTime(long offsetMillis) {
+ mBeginTimeMillis += offsetMillis;
+ mEndTimeMillis += offsetMillis;
+ }
+
+ /** @hide */
+ public void setBeginAndEndTime(long beginTimeMillis, long endTimeMillis) {
+ mBeginTimeMillis = beginTimeMillis;
+ mEndTimeMillis = endTimeMillis;
+ }
+
+ /** @hide */
+ public void setBeginTime(long beginTimeMillis) {
+ mBeginTimeMillis = beginTimeMillis;
+ }
+
+ /** @hide */
+ public void setEndTime(long endTimeMillis) {
+ mEndTimeMillis = endTimeMillis;
+ }
+
+ /**
+ * @return The beginning of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ */
+ public long getBeginTimeMillis() {
+ return mBeginTimeMillis;
+ }
+
+ /**
+ * @return The end of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ */
+ public long getEndTimeMillis() {
+ return mEndTimeMillis;
+ }
+
+ /**
+ * Gets number of UIDs with historical ops.
+ *
+ * @return The number of UIDs with historical ops.
+ *
+ * @see #getUidOpsAt(int)
+ */
+ public int getUidCount() {
+ if (mHistoricalUidOps == null) {
+ return 0;
+ }
+ return mHistoricalUidOps.size();
+ }
+
+ /**
+ * Gets the historical UID ops at a given index.
+ *
+ * @param index The index.
+ *
+ * @return The historical UID ops at the given index.
+ *
+ * @see #getUidCount()
+ */
+ public @NonNull HistoricalUidOps getUidOpsAt(int index) {
+ if (mHistoricalUidOps == null) {
+ throw new IndexOutOfBoundsException();
+ }
+ return mHistoricalUidOps.valueAt(index);
+ }
+
+ /**
+ * Gets the historical UID ops for a given UID.
+ *
+ * @param uid The UID.
+ *
+ * @return The historical ops for the UID.
+ */
+ public @Nullable HistoricalUidOps getUidOps(int uid) {
+ if (mHistoricalUidOps == null) {
+ return null;
+ }
+ return mHistoricalUidOps.get(uid);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeLong(mBeginTimeMillis);
+ parcel.writeLong(mEndTimeMillis);
+ if (mHistoricalUidOps != null) {
+ final int uidCount = mHistoricalUidOps.size();
+ parcel.writeInt(uidCount);
+ for (int i = 0; i < uidCount; i++) {
+ parcel.writeInt(mHistoricalUidOps.keyAt(i));
+ }
+ final List<HistoricalUidOps> opsList = new ArrayList<>(uidCount);
+ for (int i = 0; i < uidCount; i++) {
+ opsList.add(mHistoricalUidOps.valueAt(i));
+ }
+ parcel.writeParcelable(new ParceledListSlice<>(opsList), flags);
+ } else {
+ parcel.writeInt(-1);
+ }
+ }
+
+ /**
+ * Accepts a visitor to traverse the ops tree.
+ *
+ * @param visitor The visitor.
+ *
+ * @hide
+ */
+ public void accept(@NonNull HistoricalOpsVisitor visitor) {
+ visitor.visitHistoricalOps(this);
+ final int uidCount = getUidCount();
+ for (int i = 0; i < uidCount; i++) {
+ getUidOpsAt(i).accept(visitor);
+ }
+ }
+
+ private @NonNull HistoricalUidOps getOrCreateHistoricalUidOps(int uid) {
+ if (mHistoricalUidOps == null) {
+ mHistoricalUidOps = new SparseArray<>();
+ }
+ HistoricalUidOps historicalUidOp = mHistoricalUidOps.get(uid);
+ if (historicalUidOp == null) {
+ historicalUidOp = new HistoricalUidOps(uid);
+ mHistoricalUidOps.put(uid, historicalUidOp);
+ }
+ return historicalUidOp;
}
/**
- * Gets the UID which the data represents.
+ * @return Rounded value up at the 0.5 boundary.
*
- * @return The UID which the data represents.
+ * @hide
+ */
+ public static double round(double value) {
+ final BigDecimal decimalScale = new BigDecimal(value);
+ return decimalScale.setScale(0, RoundingMode.HALF_UP).doubleValue();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final HistoricalOps other = (HistoricalOps) obj;
+ if (mBeginTimeMillis != other.mBeginTimeMillis) {
+ return false;
+ }
+ if (mEndTimeMillis != other.mEndTimeMillis) {
+ return false;
+ }
+ if (mHistoricalUidOps == null) {
+ if (other.mHistoricalUidOps != null) {
+ return false;
+ }
+ } else if (!mHistoricalUidOps.equals(other.mHistoricalUidOps)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (int) (mBeginTimeMillis ^ (mBeginTimeMillis >>> 32));
+ result = 31 * result + mHistoricalUidOps.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[from:"
+ + mBeginTimeMillis + " to:" + mEndTimeMillis + "]";
+ }
+
+ public static final Creator<HistoricalOps> CREATOR = new Creator<HistoricalOps>() {
+ @Override
+ public @NonNull HistoricalOps createFromParcel(@NonNull Parcel parcel) {
+ return new HistoricalOps(parcel);
+ }
+
+ @Override
+ public @NonNull HistoricalOps[] newArray(int size) {
+ return new HistoricalOps[size];
+ }
+ };
+ }
+
+ /**
+ * This class represents historical app op state for a UID.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final class HistoricalUidOps implements Parcelable {
+ private final int mUid;
+ private @Nullable ArrayMap<String, HistoricalPackageOps> mHistoricalPackageOps;
+
+ /** @hide */
+ public HistoricalUidOps(int uid) {
+ mUid = uid;
+ }
+
+ private HistoricalUidOps(@NonNull HistoricalUidOps other) {
+ mUid = other.mUid;
+ final int opCount = other.getPackageCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalPackageOps origOps = other.getPackageOpsAt(i);
+ final HistoricalPackageOps cloneOps = new HistoricalPackageOps(origOps);
+ if (mHistoricalPackageOps == null) {
+ mHistoricalPackageOps = new ArrayMap<>(opCount);
+ }
+ mHistoricalPackageOps.put(cloneOps.getPackageName(), cloneOps);
+ }
+ }
+
+ private HistoricalUidOps(@NonNull Parcel parcel) {
+ // No arg check since we always read from a trusted source.
+ mUid = parcel.readInt();
+ mHistoricalPackageOps = parcel.createTypedArrayMap(HistoricalPackageOps.CREATOR);
+ }
+
+ private @Nullable HistoricalUidOps splice(double fractionToRemove) {
+ HistoricalUidOps splice = null;
+ final int packageCount = getPackageCount();
+ for (int i = 0; i < packageCount; i++) {
+ final HistoricalPackageOps origOps = getPackageOpsAt(i);
+ final HistoricalPackageOps spliceOps = origOps.splice(fractionToRemove);
+ if (spliceOps != null) {
+ if (splice == null) {
+ splice = new HistoricalUidOps(mUid);
+ }
+ if (splice.mHistoricalPackageOps == null) {
+ splice.mHistoricalPackageOps = new ArrayMap<>();
+ }
+ splice.mHistoricalPackageOps.put(spliceOps.getPackageName(), spliceOps);
+ }
+ }
+ return splice;
+ }
+
+ private void merge(@NonNull HistoricalUidOps other) {
+ final int packageCount = other.getPackageCount();
+ for (int i = 0; i < packageCount; i++) {
+ final HistoricalPackageOps otherPackageOps = other.getPackageOpsAt(i);
+ final HistoricalPackageOps thisPackageOps = getPackageOps(
+ otherPackageOps.getPackageName());
+ if (thisPackageOps != null) {
+ thisPackageOps.merge(otherPackageOps);
+ } else {
+ if (mHistoricalPackageOps == null) {
+ mHistoricalPackageOps = new ArrayMap<>();
+ }
+ mHistoricalPackageOps.put(otherPackageOps.getPackageName(), otherPackageOps);
+ }
+ }
+ }
+
+ private void filter(@Nullable String packageName, @Nullable String[] opNames,
+ double fractionToRemove) {
+ final int packageCount = getPackageCount();
+ for (int i = packageCount - 1; i >= 0; i--) {
+ final HistoricalPackageOps packageOps = getPackageOpsAt(i);
+ if (packageName != null && !packageName.equals(packageOps.getPackageName())) {
+ mHistoricalPackageOps.removeAt(i);
+ } else {
+ packageOps.filter(opNames, fractionToRemove);
+ }
+ }
+ }
+
+ private boolean isEmpty() {
+ final int packageCount = getPackageCount();
+ for (int i = packageCount - 1; i >= 0; i--) {
+ final HistoricalPackageOps packageOps = mHistoricalPackageOps.valueAt(i);
+ if (!packageOps.isEmpty()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void increaseAccessCount(int opCode, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalPackageOps(packageName).increaseAccessCount(
+ opCode, uidState, increment);
+ }
+
+ private void increaseRejectCount(int opCode, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalPackageOps(packageName).increaseRejectCount(
+ opCode, uidState, increment);
+ }
+
+ private void increaseAccessDuration(int opCode, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ getOrCreateHistoricalPackageOps(packageName).increaseAccessDuration(
+ opCode, uidState, increment);
+ }
+
+ /**
+ * @return The UID for which the data is related.
*/
public int getUid() {
return mUid;
}
/**
- * Gets number historical app op entries.
+ * Gets number of packages with historical ops.
+ *
+ * @return The number of packages with historical ops.
+ *
+ * @see #getPackageOpsAt(int)
+ */
+ public int getPackageCount() {
+ if (mHistoricalPackageOps == null) {
+ return 0;
+ }
+ return mHistoricalPackageOps.size();
+ }
+
+ /**
+ * Gets the historical package ops at a given index.
+ *
+ * @param index The index.
*
- * @return The number historical app op entries.
+ * @return The historical package ops at the given index.
*
- * @see #getEntryAt(int)
+ * @see #getPackageCount()
*/
- public int getEntryCount() {
- return mEntries.size();
+ public @NonNull HistoricalPackageOps getPackageOpsAt(int index) {
+ if (mHistoricalPackageOps == null) {
+ throw new IndexOutOfBoundsException();
+ }
+ return mHistoricalPackageOps.valueAt(index);
}
/**
- * Gets the historical at a given index.
+ * Gets the historical package ops for a given package.
+ *
+ * @param packageName The package.
+ *
+ * @return The historical ops for the package.
+ */
+ public @Nullable HistoricalPackageOps getPackageOps(@NonNull String packageName) {
+ if (mHistoricalPackageOps == null) {
+ return null;
+ }
+ return mHistoricalPackageOps.get(packageName);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mUid);
+ parcel.writeTypedArrayMap(mHistoricalPackageOps, flags);
+ }
+
+ private void accept(@NonNull HistoricalOpsVisitor visitor) {
+ visitor.visitHistoricalUidOps(this);
+ final int packageCount = getPackageCount();
+ for (int i = 0; i < packageCount; i++) {
+ getPackageOpsAt(i).accept(visitor);
+ }
+ }
+
+ private @NonNull HistoricalPackageOps getOrCreateHistoricalPackageOps(
+ @NonNull String packageName) {
+ if (mHistoricalPackageOps == null) {
+ mHistoricalPackageOps = new ArrayMap<>();
+ }
+ HistoricalPackageOps historicalPackageOp = mHistoricalPackageOps.get(packageName);
+ if (historicalPackageOp == null) {
+ historicalPackageOp = new HistoricalPackageOps(packageName);
+ mHistoricalPackageOps.put(packageName, historicalPackageOp);
+ }
+ return historicalPackageOp;
+ }
+
+
+ public static final Creator<HistoricalUidOps> CREATOR = new Creator<HistoricalUidOps>() {
+ @Override
+ public @NonNull HistoricalUidOps createFromParcel(@NonNull Parcel parcel) {
+ return new HistoricalUidOps(parcel);
+ }
+
+ @Override
+ public @NonNull HistoricalUidOps[] newArray(int size) {
+ return new HistoricalUidOps[size];
+ }
+ };
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final HistoricalUidOps other = (HistoricalUidOps) obj;
+ if (mUid != other.mUid) {
+ return false;
+ }
+ if (mHistoricalPackageOps == null) {
+ if (other.mHistoricalPackageOps != null) {
+ return false;
+ }
+ } else if (!mHistoricalPackageOps.equals(other.mHistoricalPackageOps)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mUid;
+ result = 31 * result + (mHistoricalPackageOps != null
+ ? mHistoricalPackageOps.hashCode() : 0);
+ return result;
+ }
+ }
+
+ /**
+ * This class represents historical app op information about a package.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final class HistoricalPackageOps implements Parcelable {
+ private final @NonNull String mPackageName;
+ private @Nullable ArrayMap<String, HistoricalOp> mHistoricalOps;
+
+ /** @hide */
+ public HistoricalPackageOps(@NonNull String packageName) {
+ mPackageName = packageName;
+ }
+
+ private HistoricalPackageOps(@NonNull HistoricalPackageOps other) {
+ mPackageName = other.mPackageName;
+ final int opCount = other.getOpCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOp origOp = other.getOpAt(i);
+ final HistoricalOp cloneOp = new HistoricalOp(origOp);
+ if (mHistoricalOps == null) {
+ mHistoricalOps = new ArrayMap<>(opCount);
+ }
+ mHistoricalOps.put(cloneOp.getOpName(), cloneOp);
+ }
+ }
+
+ private HistoricalPackageOps(@NonNull Parcel parcel) {
+ mPackageName = parcel.readString();
+ mHistoricalOps = parcel.createTypedArrayMap(HistoricalOp.CREATOR);
+ }
+
+ private @Nullable HistoricalPackageOps splice(double fractionToRemove) {
+ HistoricalPackageOps splice = null;
+ final int opCount = getOpCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOp origOps = getOpAt(i);
+ final HistoricalOp spliceOps = origOps.splice(fractionToRemove);
+ if (spliceOps != null) {
+ if (splice == null) {
+ splice = new HistoricalPackageOps(mPackageName);
+ }
+ if (splice.mHistoricalOps == null) {
+ splice.mHistoricalOps = new ArrayMap<>();
+ }
+ splice.mHistoricalOps.put(spliceOps.getOpName(), spliceOps);
+ }
+ }
+ return splice;
+ }
+
+ private void merge(@NonNull HistoricalPackageOps other) {
+ final int opCount = other.getOpCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOp otherOp = other.getOpAt(i);
+ final HistoricalOp thisOp = getOp(otherOp.getOpName());
+ if (thisOp != null) {
+ thisOp.merge(otherOp);
+ } else {
+ if (mHistoricalOps == null) {
+ mHistoricalOps = new ArrayMap<>();
+ }
+ mHistoricalOps.put(otherOp.getOpName(), otherOp);
+ }
+ }
+ }
+
+ private void filter(@Nullable String[] opNames, double scaleFactor) {
+ final int opCount = getOpCount();
+ for (int i = opCount - 1; i >= 0; i--) {
+ final HistoricalOp op = mHistoricalOps.valueAt(i);
+ if (opNames != null && !ArrayUtils.contains(opNames, op.getOpName())) {
+ mHistoricalOps.removeAt(i);
+ } else {
+ op.filter(scaleFactor);
+ }
+ }
+ }
+
+ private boolean isEmpty() {
+ final int opCount = getOpCount();
+ for (int i = opCount - 1; i >= 0; i--) {
+ final HistoricalOp op = mHistoricalOps.valueAt(i);
+ if (!op.isEmpty()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void increaseAccessCount(int opCode, @UidState int uidState, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseAccessCount(uidState, increment);
+ }
+
+ private void increaseRejectCount(int opCode, @UidState int uidState, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseRejectCount(uidState, increment);
+ }
+
+ private void increaseAccessDuration(int opCode, @UidState int uidState, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseAccessDuration(uidState, increment);
+ }
+
+ /**
+ * Gets the package name which the data represents.
+ *
+ * @return The package name which the data represents.
+ */
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Gets number historical app ops.
+ *
+ * @return The number historical app ops.
+ *
+ * @see #getOpAt(int)
+ */
+ public int getOpCount() {
+ if (mHistoricalOps == null) {
+ return 0;
+ }
+ return mHistoricalOps.size();
+ }
+
+ /**
+ * Gets the historical op at a given index.
*
* @param index The index to lookup.
*
- * @return The entry at the given index.
+ * @return The op at the given index.
*
- * @see #getEntryCount()
+ * @see #getOpCount()
*/
- public @NonNull HistoricalOpEntry getEntryAt(int index) {
- return mEntries.get(index);
+ public @NonNull HistoricalOp getOpAt(int index) {
+ if (mHistoricalOps == null) {
+ throw new IndexOutOfBoundsException();
+ }
+ return mHistoricalOps.valueAt(index);
}
/**
@@ -2172,15 +2968,11 @@ public class AppOpsManager {
*
* @return The historical entry for that op name.
*/
- public @Nullable HistoricalOpEntry getEntry(@NonNull String opName) {
- final int entryCount = mEntries.size();
- for (int i = 0; i < entryCount; i++) {
- final HistoricalOpEntry entry = mEntries.get(i);
- if (entry.getOp().equals(opName)) {
- return entry;
- }
+ public @Nullable HistoricalOp getOp(@NonNull String opName) {
+ if (mHistoricalOps == null) {
+ return null;
}
- return null;
+ return mHistoricalOps.get(opName);
}
@Override
@@ -2190,9 +2982,29 @@ public class AppOpsManager {
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
- parcel.writeInt(mUid);
parcel.writeString(mPackageName);
- parcel.writeTypedList(mEntries, flags);
+ parcel.writeTypedArrayMap(mHistoricalOps, flags);
+ }
+
+ private void accept(@NonNull HistoricalOpsVisitor visitor) {
+ visitor.visitHistoricalPackageOps(this);
+ final int opCount = getOpCount();
+ for (int i = 0; i < opCount; i++) {
+ getOpAt(i).accept(visitor);
+ }
+ }
+
+ private @NonNull HistoricalOp getOrCreateHistoricalOp(int opCode) {
+ if (mHistoricalOps == null) {
+ mHistoricalOps = new ArrayMap<>();
+ }
+ final String opStr = sOpToString[opCode];
+ HistoricalOp op = mHistoricalOps.get(opStr);
+ if (op == null) {
+ op = new HistoricalOp(opCode);
+ mHistoricalOps.put(opStr, op);
+ }
+ return op;
}
public static final Creator<HistoricalPackageOps> CREATOR =
@@ -2207,49 +3019,177 @@ public class AppOpsManager {
return new HistoricalPackageOps[size];
}
};
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final HistoricalPackageOps other = (HistoricalPackageOps) obj;
+ if (!mPackageName.equals(other.mPackageName)) {
+ return false;
+ }
+ if (mHistoricalOps == null) {
+ if (other.mHistoricalOps != null) {
+ return false;
+ }
+ } else if (!mHistoricalOps.equals(other.mHistoricalOps)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mPackageName != null ? mPackageName.hashCode() : 0;
+ result = 31 * result + (mHistoricalOps != null ? mHistoricalOps.hashCode() : 0);
+ return result;
+ }
}
/**
- * This class represents historical information about an app op. The history
- * is aggregated information about the op for a certain amount of time such
- * as the times the op was accessed, the times the op was rejected, the total
- * duration the app op has been accessed.
+ * This class represents historical information about an app op.
*
* @hide
*/
@TestApi
@SystemApi
- public static final class HistoricalOpEntry implements Parcelable {
+ public static final class HistoricalOp implements Parcelable {
private final int mOp;
- private final long[] mAccessCount;
- private final long[] mRejectCount;
- private final long[] mAccessDuration;
+ private @Nullable long[] mAccessCount;
+ private @Nullable long[] mRejectCount;
+ private @Nullable long[] mAccessDuration;
- /**
- * @hide
- */
- public HistoricalOpEntry(int op) {
+ /** @hide */
+ public HistoricalOp(int op) {
mOp = op;
mAccessCount = new long[_NUM_UID_STATE];
mRejectCount = new long[_NUM_UID_STATE];
mAccessDuration = new long[_NUM_UID_STATE];
}
- HistoricalOpEntry(@NonNull Parcel parcel) {
+ private HistoricalOp(@NonNull HistoricalOp other) {
+ mOp = other.mOp;
+ if (other.mAccessCount != null) {
+ System.arraycopy(other.mAccessCount, 0, getOrCreateAccessCount(),
+ 0, other.mAccessCount.length);
+ }
+ if (other.mRejectCount != null) {
+ System.arraycopy(other.mRejectCount, 0, getOrCreateRejectCount(),
+ 0, other.mRejectCount.length);
+ }
+ if (other.mAccessDuration != null) {
+ System.arraycopy(other.mAccessDuration, 0, getOrCreateAccessDuration(),
+ 0, other.mAccessDuration.length);
+ }
+ }
+
+ private HistoricalOp(@NonNull Parcel parcel) {
mOp = parcel.readInt();
mAccessCount = parcel.createLongArray();
mRejectCount = parcel.createLongArray();
mAccessDuration = parcel.createLongArray();
}
- /**
- * @hide
- */
- public void addEntry(@UidState int uidState, long accessCount,
- long rejectCount, long accessDuration) {
- mAccessCount[uidState] = accessCount;
- mRejectCount[uidState] = rejectCount;
- mAccessDuration[uidState] = accessDuration;
+ private void filter(double scaleFactor) {
+ scale(mAccessCount, scaleFactor);
+ scale(mRejectCount, scaleFactor);
+ scale(mAccessDuration, scaleFactor);
+ }
+
+ private boolean isEmpty() {
+ return !hasData(mAccessCount)
+ && !hasData(mRejectCount)
+ && !hasData(mAccessDuration);
+ }
+
+ private boolean hasData(@NonNull long[] array) {
+ for (long value : array) {
+ if (value != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private @Nullable HistoricalOp splice(double fractionToRemove) {
+ HistoricalOp splice = null;
+ if (mAccessCount != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ final long spliceAccessCount = Math.round(
+ mAccessCount[i] * fractionToRemove);
+ if (spliceAccessCount > 0) {
+ if (splice == null) {
+ splice = new HistoricalOp(mOp);
+ }
+ splice.getOrCreateAccessCount()[i] = spliceAccessCount;
+ mAccessCount[i] -= spliceAccessCount;
+ }
+ }
+ }
+
+ if (mRejectCount != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ final long spliceRejectCount = Math.round(
+ mRejectCount[i] * fractionToRemove);
+
+ if (spliceRejectCount > 0) {
+ if (splice == null) {
+ splice = new HistoricalOp(mOp);
+ }
+ splice.getOrCreateRejectCount()[i] = spliceRejectCount;
+ mRejectCount[i] -= spliceRejectCount;
+ }
+ }
+ }
+
+ if (mAccessDuration != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ final long spliceAccessDuration = Math.round(
+ mAccessDuration[i] * fractionToRemove);
+ if (spliceAccessDuration > 0) {
+ if (splice == null) {
+ splice = new HistoricalOp(mOp);
+ }
+ splice.getOrCreateAccessDuration()[i] = spliceAccessDuration;
+ mAccessDuration[i] -= spliceAccessDuration;
+ }
+ }
+ }
+ return splice;
+ }
+
+ private void merge(@NonNull HistoricalOp other) {
+ if (other.mAccessCount != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ getOrCreateAccessCount()[i] += other.mAccessCount[i];
+ }
+ }
+ if (other.mRejectCount != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ getOrCreateRejectCount()[i] += other.mRejectCount[i];
+ }
+ }
+ if (other.mAccessDuration != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ getOrCreateAccessDuration()[i] += other.mAccessDuration[i];
+ }
+ }
+ }
+
+ private void increaseAccessCount(@UidState int uidState, long increment) {
+ getOrCreateAccessCount()[uidState] += increment;
+ }
+
+ private void increaseRejectCount(@UidState int uidState, long increment) {
+ getOrCreateRejectCount()[uidState] += increment;
+ }
+
+ private void increaseAccessDuration(@UidState int uidState, long increment) {
+ getOrCreateAccessDuration()[uidState] += increment;
}
/**
@@ -2257,10 +3197,15 @@ public class AppOpsManager {
*
* @return The op name.
*/
- public @NonNull String getOp() {
+ public @NonNull String getOpName() {
return sOpToString[mOp];
}
+ /** @hide */
+ public int getOpCode() {
+ return mOp;
+ }
+
/**
* Gets the number times the op was accessed (performed) in the foreground.
*
@@ -2270,6 +3215,9 @@ public class AppOpsManager {
* @see #getAccessCount(int)
*/
public long getForegroundAccessCount() {
+ if (mAccessCount == null) {
+ return 0;
+ }
return sum(mAccessCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
}
@@ -2282,6 +3230,9 @@ public class AppOpsManager {
* @see #getAccessCount(int)
*/
public long getBackgroundAccessCount() {
+ if (mAccessCount == null) {
+ return 0;
+ }
return sum(mAccessCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
}
@@ -2299,6 +3250,9 @@ public class AppOpsManager {
* @see #getBackgroundAccessCount()
*/
public long getAccessCount(@UidState int uidState) {
+ if (mAccessCount == null) {
+ return 0;
+ }
return mAccessCount[uidState];
}
@@ -2311,6 +3265,9 @@ public class AppOpsManager {
* @see #getRejectCount(int)
*/
public long getForegroundRejectCount() {
+ if (mRejectCount == null) {
+ return 0;
+ }
return sum(mRejectCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
}
@@ -2323,6 +3280,9 @@ public class AppOpsManager {
* @see #getRejectCount(int)
*/
public long getBackgroundRejectCount() {
+ if (mRejectCount == null) {
+ return 0;
+ }
return sum(mRejectCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
}
@@ -2340,6 +3300,9 @@ public class AppOpsManager {
* @see #getBackgroundRejectCount()
*/
public long getRejectCount(@UidState int uidState) {
+ if (mRejectCount == null) {
+ return 0;
+ }
return mRejectCount[uidState];
}
@@ -2352,6 +3315,9 @@ public class AppOpsManager {
* @see #getAccessDuration(int)
*/
public long getForegroundAccessDuration() {
+ if (mAccessDuration == null) {
+ return 0;
+ }
return sum(mAccessDuration, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
}
@@ -2364,6 +3330,9 @@ public class AppOpsManager {
* @see #getAccessDuration(int)
*/
public long getBackgroundAccessDuration() {
+ if (mAccessDuration == null) {
+ return 0;
+ }
return sum(mAccessDuration, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
}
@@ -2381,6 +3350,9 @@ public class AppOpsManager {
* @see #getBackgroundAccessDuration()
*/
public long getAccessDuration(@UidState int uidState) {
+ if (mAccessDuration == null) {
+ return 0;
+ }
return mAccessDuration[uidState];
}
@@ -2397,34 +3369,29 @@ public class AppOpsManager {
parcel.writeLongArray(mAccessDuration);
}
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other == null || getClass() != other.getClass()) {
- return false;
- }
- final HistoricalOpEntry otherInstance = (HistoricalOpEntry) other;
- if (mOp != otherInstance.mOp) {
- return false;
- }
- if (!Arrays.equals(mAccessCount, otherInstance.mAccessCount)) {
- return false;
+ private void accept(@NonNull HistoricalOpsVisitor visitor) {
+ visitor.visitHistoricalOp(this);
+ }
+
+ private @NonNull long[] getOrCreateAccessCount() {
+ if (mAccessCount == null) {
+ mAccessCount = new long[_NUM_UID_STATE];
}
- if (!Arrays.equals(mRejectCount, otherInstance.mRejectCount)) {
- return false;
+ return mAccessCount;
+ }
+
+ private @NonNull long[] getOrCreateRejectCount() {
+ if (mRejectCount == null) {
+ mRejectCount = new long[_NUM_UID_STATE];
}
- return Arrays.equals(mAccessDuration, otherInstance.mAccessDuration);
+ return mRejectCount;
}
- @Override
- public int hashCode() {
- int result = mOp;
- result = 31 * result + Arrays.hashCode(mAccessCount);
- result = 31 * result + Arrays.hashCode(mRejectCount);
- result = 31 * result + Arrays.hashCode(mAccessDuration);
- return result;
+ private @NonNull long[] getOrCreateAccessDuration() {
+ if (mAccessDuration == null) {
+ mAccessDuration = new long[_NUM_UID_STATE];
+ }
+ return mAccessDuration;
}
/**
@@ -2444,17 +3411,62 @@ public class AppOpsManager {
return totalCount;
}
- public static final Creator<HistoricalOpEntry> CREATOR = new Creator<HistoricalOpEntry>() {
+ /**
+ * Multiplies the entries in the array with the passed in scale factor and
+ * rounds the result at up 0.5 boundary.
+ *
+ * @param data The data to scale.
+ * @param scaleFactor The scale factor.
+ */
+ private static void scale(@NonNull long[] data, double scaleFactor) {
+ if (data != null) {
+ for (int i = 0; i < _NUM_UID_STATE; i++) {
+ data[i] = (long) HistoricalOps.round((double) data[i] * scaleFactor);
+ }
+ }
+ }
+
+ public static final Creator<HistoricalOp> CREATOR = new Creator<HistoricalOp>() {
@Override
- public @NonNull HistoricalOpEntry createFromParcel(@NonNull Parcel source) {
- return new HistoricalOpEntry(source);
+ public @NonNull HistoricalOp createFromParcel(@NonNull Parcel source) {
+ return new HistoricalOp(source);
}
@Override
- public @NonNull HistoricalOpEntry[] newArray(int size) {
- return new HistoricalOpEntry[size];
+ public @NonNull HistoricalOp[] newArray(int size) {
+ return new HistoricalOp[size];
}
};
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final HistoricalOp other = (HistoricalOp) obj;
+ if (mOp != other.mOp) {
+ return false;
+ }
+ if (!Arrays.equals(mAccessCount, other.mAccessCount)) {
+ return false;
+ }
+ if (!Arrays.equals(mRejectCount, other.mRejectCount)) {
+ return false;
+ }
+ return Arrays.equals(mAccessDuration, other.mAccessDuration);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mOp;
+ result = 31 * result + Arrays.hashCode(mAccessCount);
+ result = 31 * result + Arrays.hashCode(mRejectCount);
+ result = 31 * result + Arrays.hashCode(mAccessDuration);
+ return result;
+ }
}
/**
@@ -2520,6 +3532,24 @@ public class AppOpsManager {
* @param ops The set of operations you are interested in, or null if you want all of them.
* @hide
*/
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
+ public @NonNull List<AppOpsManager.PackageOps> getPackagesForOps(@Nullable String[] ops) {
+ final int opCount = ops.length;
+ final int[] opCodes = new int[opCount];
+ for (int i = 0; i < opCount; i++) {
+ opCodes[i] = sOpStrToOp.get(ops[i]);
+ }
+ final List<AppOpsManager.PackageOps> result = getPackagesForOps(opCodes);
+ return (result != null) ? result : Collections.emptyList();
+ }
+
+ /**
+ * Retrieve current operation state for all applications.
+ *
+ * @param ops The set of operations you are interested in, or null if you want all of them.
+ * @hide
+ */
@RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
@UnsupportedAppUsage
public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
@@ -2536,11 +3566,17 @@ public class AppOpsManager {
* @param uid The uid of the application of interest.
* @param packageName The name of the application of interest.
* @param ops The set of operations you are interested in, or null if you want all of them.
+ *
+ * @deprecated The int op codes are not stable and you should use the string based op
+ * names which are stable and namespaced. Use
+ * {@link #getOpsForPackage(int, String, String...)})}.
+ *
* @hide
*/
+ @Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
- public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
+ public List<PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
try {
return mService.getOpsForPackage(uid, packageName, ops);
} catch (RemoteException e) {
@@ -2549,7 +3585,49 @@ public class AppOpsManager {
}
/**
- * Retrieve historical app op stats for a package.
+ * Retrieve current operation state for one application. The UID and the
+ * package must match.
+ *
+ * @param uid The uid of the application of interest.
+ * @param packageName The name of the application of interest.
+ * @param ops The set of operations you are interested in, or null if you want all of them.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
+ public @NonNull List<AppOpsManager.PackageOps> getOpsForPackage(int uid,
+ @NonNull String packageName, @Nullable String... ops) {
+ int[] opCodes = null;
+ if (ops != null) {
+ opCodes = new int[ops.length];
+ for (int i = 0; i < ops.length; i++) {
+ opCodes[i] = strOpToOp(ops[i]);
+ }
+ }
+ try {
+ final List<PackageOps> result = mService.getOpsForPackage(uid, packageName, opCodes);
+ if (result == null) {
+ return Collections.emptyList();
+ }
+ return result;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve historical app op stats for a period.
+ *
+ * <p>Historical data can be obtained
+ * for a specific package by specifying the <code>packageName</code> argument,
+ * for a specific UID if specifying the <code>uid</code> argument, for a
+ * specific package in a UID by specifying the <code>packageName</code>
+ * and the <code>uid</code> arguments, for all packages by passing
+ * {@link android.os.Process#INVALID_UID} and <code>null</code> for the
+ * <code>uid</code> and <code>packageName</code> arguments, respectively.
+ * Similarly, you can specify the <code>opNames</code> argument to get
+ * data only for these ops or <code>null</code> for all ops.
*
* @param uid The UID to query for.
* @param packageName The package to query for.
@@ -2558,10 +3636,12 @@ public class AppOpsManager {
* negative.
* @param endTimeMillis The end of the interval in milliseconds since
* epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be after
- * {@code beginTimeMillis}.
+ * {@code beginTimeMillis}. Pass {@link Long#MAX_VALUE} to get the most recent
+ * history including ops that happen while this call is in flight.
* @param opNames The ops to query for. Pass {@code null} for all ops.
- *
- * @return The historical ops or {@code null} if there are no ops for this package.
+ * @param executor Executor on which to run the callback. If <code>null</code>
+ * the callback is executed on the default executor running on the main thread.
+ * @param callback Callback on which to deliver the result.
*
* @throws IllegalArgumentException If any of the argument contracts is violated.
*
@@ -2570,47 +3650,78 @@ public class AppOpsManager {
@TestApi
@SystemApi
@RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
- public @Nullable HistoricalPackageOps getHistoricalPackagesOps(
- int uid, @NonNull String packageName, @Nullable String[] opNames,
- long beginTimeMillis, long endTimeMillis) {
+ public void getHistoricalOps(int uid, @Nullable String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull Executor executor, @NonNull Consumer<HistoricalOps> callback) {
+ Preconditions.checkNotNull(executor, "executor cannot be null");
+ Preconditions.checkNotNull(callback, "callback cannot be null");
try {
- return mService.getHistoricalPackagesOps(uid, packageName, opNames,
- beginTimeMillis, endTimeMillis);
+ mService.getHistoricalOps(uid, packageName, opNames, beginTimeMillis, endTimeMillis,
+ new RemoteCallback((result) -> {
+ final HistoricalOps ops = result.getParcelable(KEY_HISTORICAL_OPS);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.accept(ops));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Retrieve historical app op stats for all packages.
+ * Retrieve historical app op stats for a period.
+ *
+ * <p>Historical data can be obtained
+ * for a specific package by specifying the <code>packageName</code> argument,
+ * for a specific UID if specifying the <code>uid</code> argument, for a
+ * specific package in a UID by specifying the <code>packageName</code>
+ * and the <code>uid</code> arguments, for all packages by passing
+ * {@link android.os.Process#INVALID_UID} and <code>null</code> for the
+ * <code>uid</code> and <code>packageName</code> arguments, respectively.
+ * Similarly, you can specify the <code>opNames</code> argument to get
+ * data only for these ops or <code>null</code> for all ops.
+ * <p>
+ * This method queries only the on disk state and the returned ops are raw,
+ * which is their times are relative to the history start as opposed to the
+ * epoch start.
*
+ * @param uid The UID to query for.
+ * @param packageName The package to query for.
* @param beginTimeMillis The beginning of the interval in milliseconds since
- * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be non
- * negative.
+ * history start. History time grows as one goes into the past.
* @param endTimeMillis The end of the interval in milliseconds since
- * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be after
+ * history start. History time grows as one goes into the past. Must be after
* {@code beginTimeMillis}.
* @param opNames The ops to query for. Pass {@code null} for all ops.
- *
- * @return The historical ops or an empty list if there are no ops for any package.
+ * @param executor Executor on which to run the callback. If <code>null</code>
+ * the callback is executed on the default executor running on the main thread.
+ * @param callback Callback on which to deliver the result.
*
* @throws IllegalArgumentException If any of the argument contracts is violated.
*
* @hide
*/
@TestApi
- @SystemApi
@RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
- public @NonNull List<HistoricalPackageOps> getAllHistoricPackagesOps(
- @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis) {
+ public void getHistoricalOpsFromDiskRaw(int uid, @Nullable String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @Nullable Executor executor, @NonNull Consumer<HistoricalOps> callback) {
+ Preconditions.checkNotNull(executor, "executor cannot be null");
+ Preconditions.checkNotNull(callback, "callback cannot be null");
try {
- @SuppressWarnings("unchecked")
- final ParceledListSlice<HistoricalPackageOps> payload =
- mService.getAllHistoricalPackagesOps(opNames, beginTimeMillis, endTimeMillis);
- if (payload != null) {
- return payload.getList();
- }
- return Collections.emptyList();
+ mService.getHistoricalOpsFromDiskRaw(uid, packageName, opNames, beginTimeMillis,
+ endTimeMillis, new RemoteCallback((result) -> {
+ final HistoricalOps ops = result.getParcelable(KEY_HISTORICAL_OPS);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.accept(ops));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2627,7 +3738,7 @@ public class AppOpsManager {
* @hide
*/
@RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
- public void setUidMode(int code, int uid, int mode) {
+ public void setUidMode(int code, int uid, @Mode int mode) {
try {
mService.setUidMode(code, uid, mode);
} catch (RemoteException e) {
@@ -2648,7 +3759,7 @@ public class AppOpsManager {
@SystemApi
@TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
- public void setUidMode(String appOp, int uid, int mode) {
+ public void setUidMode(String appOp, int uid, @Mode int mode) {
try {
mService.setUidMode(AppOpsManager.strOpToOp(appOp), uid, mode);
} catch (RemoteException e) {
@@ -2680,7 +3791,7 @@ public class AppOpsManager {
/** @hide */
@TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
- public void setMode(int code, int uid, String packageName, int mode) {
+ public void setMode(int code, int uid, String packageName, @Mode int mode) {
try {
mService.setMode(code, uid, packageName, mode);
} catch (RemoteException e) {
@@ -2701,7 +3812,7 @@ public class AppOpsManager {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
- public void setMode(String op, int uid, String packageName, int mode) {
+ public void setMode(String op, int uid, String packageName, @Mode int mode) {
try {
mService.setMode(strOpToOp(op), uid, packageName, mode);
} catch (RemoteException e) {
@@ -2722,7 +3833,7 @@ public class AppOpsManager {
*/
@RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
@UnsupportedAppUsage
- public void setRestriction(int code, @AttributeUsage int usage, int mode,
+ public void setRestriction(int code, @AttributeUsage int usage, @Mode int mode,
String[] exceptionPackages) {
try {
final int uid = Binder.getCallingUid();
@@ -3507,6 +4618,104 @@ public class AppOpsManager {
}
/**
+ * Configures the app ops persistence for testing.
+ *
+ * @param mode The mode in which the historical registry operates.
+ * @param baseSnapshotInterval The base interval on which we would be persisting a snapshot of
+ * the historical data. The history is recursive where every subsequent step encompasses
+ * {@code compressionStep} longer interval with {@code compressionStep} distance between
+ * snapshots.
+ * @param compressionStep The compression step in every iteration.
+ *
+ * @see #HISTORICAL_MODE_DISABLED
+ * @see #HISTORICAL_MODE_ENABLED_ACTIVE
+ * @see #HISTORICAL_MODE_ENABLED_PASSIVE
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_APPOPS)
+ public void setHistoryParameters(@HistoricalMode int mode, long baseSnapshotInterval,
+ int compressionStep) {
+ try {
+ mService.setHistoryParameters(mode, baseSnapshotInterval, compressionStep);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Offsets the history by the given duration.
+ *
+ * @param offsetMillis The offset duration.
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_APPOPS)
+ public void offsetHistory(long offsetMillis) {
+ try {
+ mService.offsetHistory(offsetMillis);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Adds ops to the history directly. This could be useful for testing especially
+ * when the historical registry operates in {@link #HISTORICAL_MODE_ENABLED_PASSIVE}
+ * mode.
+ *
+ * @param ops The ops to add to the history.
+ *
+ * @see #setHistoryParameters(int, long, int)
+ * @see #HISTORICAL_MODE_ENABLED_PASSIVE
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_APPOPS)
+ public void addHistoricalOps(@NonNull HistoricalOps ops) {
+ try {
+ mService.addHistoricalOps(ops);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Resets the app ops persistence for testing.
+ *
+ * @see #setHistoryParameters(int, long, int)
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_APPOPS)
+ public void resetHistoryParameters() {
+ try {
+ mService.resetHistoryParameters();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Clears all app ops history.
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_APPOPS)
+ public void clearHistory() {
+ try {
+ mService.clearHistory();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns all supported operation names.
* @hide
*/
@@ -3538,4 +4747,64 @@ public class AppOpsManager {
}
return time;
}
+
+ /** @hide */
+ public static String uidStateToString(@UidState int uidState) {
+ switch (uidState) {
+ case UID_STATE_PERSISTENT: {
+ return "UID_STATE_PERSISTENT";
+ }
+ case UID_STATE_TOP: {
+ return "UID_STATE_TOP";
+ }
+ case UID_STATE_FOREGROUND_SERVICE: {
+ return "UID_STATE_FOREGROUND_SERVICE";
+ }
+ case UID_STATE_FOREGROUND: {
+ return "UID_STATE_FOREGROUND";
+ }
+ case UID_STATE_BACKGROUND: {
+ return "UID_STATE_BACKGROUND";
+ }
+ case UID_STATE_CACHED: {
+ return "UID_STATE_CACHED";
+ }
+ default: {
+ return "UNKNOWN";
+ }
+ }
+ }
+
+ /** @hide */
+ public static int parseHistoricalMode(@NonNull String mode) {
+ switch (mode) {
+ case "HISTORICAL_MODE_ENABLED_ACTIVE": {
+ return HISTORICAL_MODE_ENABLED_ACTIVE;
+ }
+ case "HISTORICAL_MODE_ENABLED_PASSIVE": {
+ return HISTORICAL_MODE_ENABLED_PASSIVE;
+ }
+ default: {
+ return HISTORICAL_MODE_DISABLED;
+ }
+ }
+ }
+
+ /** @hide */
+ public static String historicalModeToString(@HistoricalMode int mode) {
+ switch (mode) {
+ case HISTORICAL_MODE_DISABLED: {
+ return "HISTORICAL_MODE_DISABLED";
+ }
+ case HISTORICAL_MODE_ENABLED_ACTIVE: {
+ return "HISTORICAL_MODE_ENABLED_ACTIVE";
+ }
+ case HISTORICAL_MODE_ENABLED_PASSIVE: {
+ return "HISTORICAL_MODE_ENABLED_PASSIVE";
+ }
+ default: {
+ return "UNKNOWN";
+ }
+ }
+ }
}
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 94983e1c3672..9bcb36f28d17 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2276,6 +2276,16 @@ public class ApplicationPackageManager extends PackageManager {
}
@Override
+ public String[] setDistractingPackageRestrictions(String[] packages, int distractionFlags) {
+ try {
+ return mPM.setDistractingPackageRestrictionsAsUser(packages, distractionFlags,
+ mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ @Override
public String[] setPackagesSuspended(String[] packageNames, boolean suspended,
PersistableBundle appExtras, PersistableBundle launcherExtras,
String dialogMessage) {
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index b5295d15ee8d..07dbb6bee9fd 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -124,6 +124,10 @@ public abstract class ClientTransactionHandler {
/** Restart the activity after it was stopped. */
public abstract void performRestartActivity(IBinder token, boolean start);
+ /** Set pending activity configuration in case it will be updated by other transaction item. */
+ public abstract void updatePendingActivityConfiguration(IBinder activityToken,
+ Configuration overrideConfig);
+
/** Deliver activity (override) configuration change. */
public abstract void handleActivityConfigurationChanged(IBinder activityToken,
Configuration overrideConfig, int displayId);
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 4bd935c0e924..088c245c9c2c 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -31,7 +31,7 @@ import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
-import android.content.res.ResourceId;
+import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
@@ -183,7 +183,7 @@ public class Dialog implements DialogInterface, Window.Callback,
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
if (createContextThemeWrapper) {
- if (themeResId == ResourceId.ID_NULL) {
+ if (themeResId == Resources.ID_NULL) {
final TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
themeResId = outValue.resourceId;
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index fb519b625012..fb65da14a087 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -317,7 +317,6 @@ interface IActivityManager {
*/
void requestWifiBugReport(in String shareTitle, in String shareDescription);
- void clearPendingBackup();
Intent getIntentForIntentSender(in IIntentSender sender);
// This is not public because you need to be very careful in how you
// manage your activity to make sure it is always the uid you expect.
@@ -421,7 +420,6 @@ interface IActivityManager {
void resizeDockedStack(in Rect dockedBounds, in Rect tempDockedTaskBounds,
in Rect tempDockedTaskInsetBounds,
in Rect tempOtherTaskBounds, in Rect tempOtherTaskInsetBounds);
- boolean isAppForeground(int uid);
void removeStack(int stackId);
void makePackageIdle(String packageName, int userId);
int getMemoryTrimLevel();
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index dd87dc330b65..cc6c999ed255 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -419,6 +419,7 @@ interface IActivityTaskManager {
void updateLockTaskFeatures(int userId, int flags);
void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
+ void setInheritShowWhenLocked(in IBinder token, boolean setInheritShownWhenLocked);
void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
/**
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 163be8efc8fd..199c1338c50c 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -65,9 +65,9 @@ interface INotificationManager
boolean areNotificationsEnabled(String pkg);
int getPackageImportance(String pkg);
- void setAppOverlaysAllowed(String pkg, int uid, boolean allowed);
- boolean areAppOverlaysAllowed(String pkg);
- boolean areAppOverlaysAllowedForPackage(String pkg, int uid);
+ void setBubblesAllowed(String pkg, int uid, boolean allowed);
+ boolean areBubblesAllowed(String pkg);
+ boolean areBubblesAllowedForPackage(String pkg, int uid);
void createNotificationChannelGroups(String pkg, in ParceledListSlice channelGroupList);
void createNotificationChannels(String pkg, in ParceledListSlice channelsList);
diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl
index 3a2038d40952..666f7218a4f2 100644
--- a/core/java/android/app/IWallpaperManager.aidl
+++ b/core/java/android/app/IWallpaperManager.aidl
@@ -142,19 +142,20 @@ interface IWallpaperManager {
*
* @param which either {@link WallpaperManager#FLAG_LOCK}
* or {@link WallpaperManager#FLAG_SYSTEM}
+ * @param displayId Which display is interested
* @return colors of chosen wallpaper
*/
- WallpaperColors getWallpaperColors(int which, int userId);
+ WallpaperColors getWallpaperColors(int which, int userId, int displayId);
/**
- * Register a callback to receive color updates
+ * Register a callback to receive color updates from a display
*/
- void registerWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId);
+ void registerWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId, int displayId);
/**
- * Unregister a callback that was receiving color updates
+ * Unregister a callback that was receiving color updates from a display
*/
- void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId);
+ void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId, int displayId);
/**
* Called from SystemUI when it shows the AoD UI.
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index e066f06542c3..b8d748dce9e6 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -384,9 +384,7 @@ public class Notification implements Parcelable
STANDARD_LAYOUTS.add(R.layout.notification_template_material_messaging);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_media);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_media);
- STANDARD_LAYOUTS.add(R.layout.notification_template_ambient_header);
STANDARD_LAYOUTS.add(R.layout.notification_template_header);
- STANDARD_LAYOUTS.add(R.layout.notification_template_material_ambient);
}
/**
@@ -1276,7 +1274,7 @@ public class Notification implements Parcelable
private String mShortcutId;
private CharSequence mSettingsText;
- private PendingIntent mAppOverlayIntent;
+ private BubbleMetadata mBubbleMetadata;
/** @hide */
@IntDef(prefix = { "GROUP_ALERT_" }, value = {
@@ -1427,18 +1425,13 @@ public class Notification implements Parcelable
*/
public static final int SEMANTIC_ACTION_CALL = 10;
- /**
- * {@code SemanticAction}: Contextual action - dependent on the current notification. E.g.
- * open a Map application with an address shown in the notification.
- */
- public static final int SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION = 11;
-
private final Bundle mExtras;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
private Icon mIcon;
private final RemoteInput[] mRemoteInputs;
private boolean mAllowGeneratedReplies = true;
private final @SemanticAction int mSemanticAction;
+ private final boolean mIsContextual;
/**
* Small icon representing the action.
@@ -1474,6 +1467,7 @@ public class Notification implements Parcelable
mRemoteInputs = in.createTypedArray(RemoteInput.CREATOR);
mAllowGeneratedReplies = in.readInt() == 1;
mSemanticAction = in.readInt();
+ mIsContextual = in.readInt() == 1;
}
/**
@@ -1482,13 +1476,13 @@ public class Notification implements Parcelable
@Deprecated
public Action(int icon, CharSequence title, PendingIntent intent) {
this(Icon.createWithResource("", icon), title, intent, new Bundle(), null, true,
- SEMANTIC_ACTION_NONE);
+ SEMANTIC_ACTION_NONE, false /* isContextual */);
}
/** Keep in sync with {@link Notification.Action.Builder#Builder(Action)}! */
private Action(Icon icon, CharSequence title, PendingIntent intent, Bundle extras,
RemoteInput[] remoteInputs, boolean allowGeneratedReplies,
- @SemanticAction int semanticAction) {
+ @SemanticAction int semanticAction, boolean isContextual) {
this.mIcon = icon;
if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) {
this.icon = icon.getResId();
@@ -1499,6 +1493,7 @@ public class Notification implements Parcelable
this.mRemoteInputs = remoteInputs;
this.mAllowGeneratedReplies = allowGeneratedReplies;
this.mSemanticAction = semanticAction;
+ this.mIsContextual = isContextual;
}
/**
@@ -1546,6 +1541,15 @@ public class Notification implements Parcelable
}
/**
+ * Returns whether this is a contextual Action, i.e. whether the action is dependent on the
+ * notification message body. An example of a contextual action could be an action opening a
+ * map application with an address shown in the notification.
+ */
+ public boolean isContextual() {
+ return mIsContextual;
+ }
+
+ /**
* Get the list of inputs to be collected from the user that ONLY accept data when this
* action is sent. These remote inputs are guaranteed to return true on a call to
* {@link RemoteInput#isDataOnly}.
@@ -1570,6 +1574,7 @@ public class Notification implements Parcelable
private final Bundle mExtras;
private ArrayList<RemoteInput> mRemoteInputs;
private @SemanticAction int mSemanticAction;
+ private boolean mIsContextual;
/**
* Construct a new builder for {@link Action} object.
@@ -1684,6 +1689,16 @@ public class Notification implements Parcelable
}
/**
+ * Sets whether this {@link Action} is a contextual action, i.e. whether the action is
+ * dependent on the notification message body. An example of a contextual action could
+ * be an action opening a map application with an address shown in the notification.
+ */
+ public Builder setContextual(boolean isContextual) {
+ mIsContextual = isContextual;
+ return this;
+ }
+
+ /**
* Apply an extender to this action builder. Extenders may be used to add
* metadata or change options on this builder.
*/
@@ -1697,7 +1712,7 @@ public class Notification implements Parcelable
* necessary to display the action.
*/
private void checkContextualActionNullFields() {
- if (mSemanticAction != SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION) return;
+ if (!mIsContextual) return;
if (mIcon == null) {
throw new NullPointerException("Contextual Actions must contain a valid icon");
@@ -1743,7 +1758,7 @@ public class Notification implements Parcelable
RemoteInput[] textInputsArr = textInputs.isEmpty()
? null : textInputs.toArray(new RemoteInput[textInputs.size()]);
return new Action(mIcon, mTitle, mIntent, mExtras, textInputsArr,
- mAllowGeneratedReplies, mSemanticAction);
+ mAllowGeneratedReplies, mSemanticAction, mIsContextual);
}
}
@@ -1756,7 +1771,8 @@ public class Notification implements Parcelable
mExtras == null ? new Bundle() : new Bundle(mExtras),
getRemoteInputs(),
getAllowGeneratedReplies(),
- getSemanticAction());
+ getSemanticAction(),
+ isContextual());
}
@Override
@@ -1784,6 +1800,7 @@ public class Notification implements Parcelable
out.writeTypedArray(mRemoteInputs, flags);
out.writeInt(mAllowGeneratedReplies ? 1 : 0);
out.writeInt(mSemanticAction);
+ out.writeInt(mIsContextual ? 1 : 0);
}
public static final Parcelable.Creator<Action> CREATOR =
@@ -2073,8 +2090,7 @@ public class Notification implements Parcelable
SEMANTIC_ACTION_UNMUTE,
SEMANTIC_ACTION_THUMBS_UP,
SEMANTIC_ACTION_THUMBS_DOWN,
- SEMANTIC_ACTION_CALL,
- SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION
+ SEMANTIC_ACTION_CALL
})
@Retention(RetentionPolicy.SOURCE)
public @interface SemanticAction {}
@@ -2260,7 +2276,7 @@ public class Notification implements Parcelable
mGroupAlertBehavior = parcel.readInt();
if (parcel.readInt() != 0) {
- mAppOverlayIntent = PendingIntent.CREATOR.createFromParcel(parcel);
+ mBubbleMetadata = BubbleMetadata.CREATOR.createFromParcel(parcel);
}
mAllowSystemGeneratedContextualActions = parcel.readBoolean();
@@ -2378,7 +2394,7 @@ public class Notification implements Parcelable
that.mBadgeIcon = this.mBadgeIcon;
that.mSettingsText = this.mSettingsText;
that.mGroupAlertBehavior = this.mGroupAlertBehavior;
- that.mAppOverlayIntent = this.mAppOverlayIntent;
+ that.mBubbleMetadata = this.mBubbleMetadata;
that.mAllowSystemGeneratedContextualActions = this.mAllowSystemGeneratedContextualActions;
if (!heavy) {
@@ -2701,9 +2717,9 @@ public class Notification implements Parcelable
parcel.writeInt(mGroupAlertBehavior);
- if (mAppOverlayIntent != null) {
+ if (mBubbleMetadata != null) {
parcel.writeInt(1);
- mAppOverlayIntent.writeToParcel(parcel, 0);
+ mBubbleMetadata.writeToParcel(parcel, 0);
} else {
parcel.writeInt(0);
}
@@ -3123,11 +3139,11 @@ public class Notification implements Parcelable
}
/**
- * Returns the intent that will be used to display app content in a floating window over the
- * existing foreground activity.
+ * Returns the bubble metadata that will be used to display app content in a floating window
+ * over the existing foreground activity.
*/
- public PendingIntent getAppOverlayIntent() {
- return mAppOverlayIntent;
+ public BubbleMetadata getBubbleMetadata() {
+ return mBubbleMetadata;
}
/**
@@ -3230,8 +3246,7 @@ public class Notification implements Parcelable
}
/**
- * Returns the actions that are contextual (marked as SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION) out
- * of the actions in this notification.
+ * Returns the actions that are contextual out of the actions in this notification.
*
* @hide
*/
@@ -3240,8 +3255,7 @@ public class Notification implements Parcelable
List<Notification.Action> contextualActions = new ArrayList<>();
for (Notification.Action action : actions) {
- if (action.getSemanticAction()
- == Notification.Action.SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION) {
+ if (action.isContextual()) {
contextualActions.add(action);
}
}
@@ -3492,19 +3506,18 @@ public class Notification implements Parcelable
}
/**
- * Sets the intent that will be used to display app content in a floating window
- * over the existing foreground activity.
+ * Sets the {@link BubbleMetadata} that will be used to display app content in a floating
+ * window over the existing foreground activity.
*
- * <p>This intent will be ignored unless this notification is posted to a channel that
- * allows {@link NotificationChannel#canOverlayApps() app overlays}.</p>
+ * <p>This data will be ignored unless the notification is posted to a channel that
+ * allows {@link NotificationChannel#canBubble() bubbles}.</p>
*
- * <p>Notifications with a valid and allowed app overlay intent will be displayed as
- * floating windows outside of the notification shade on unlocked devices. When a user
- * interacts with one of these windows, this app overlay intent will be invoked and
- * displayed.</p>
+ * <b>Notifications with a valid and allowed bubble metadata will display in collapsed state
+ * outside of the notification shade on unlocked devices. When a user interacts with the
+ * collapsed state, the bubble intent will be invoked and displayed.</b>
*/
- public Builder setAppOverlayIntent(PendingIntent intent) {
- mN.mAppOverlayIntent = intent;
+ public Builder setBubbleMetadata(BubbleMetadata data) {
+ mN.mBubbleMetadata = data;
return this;
}
@@ -4555,9 +4568,7 @@ public class Notification implements Parcelable
if (p.title != null) {
contentView.setViewVisibility(R.id.title, View.VISIBLE);
contentView.setTextViewText(R.id.title, processTextSpans(p.title));
- if (!p.ambient) {
- setTextViewColorPrimary(contentView, R.id.title, p);
- }
+ setTextViewColorPrimary(contentView, R.id.title, p);
contentView.setViewLayoutWidth(R.id.title, showProgress
? ViewGroup.LayoutParams.WRAP_CONTENT
: ViewGroup.LayoutParams.MATCH_PARENT);
@@ -4566,9 +4577,7 @@ public class Notification implements Parcelable
int textId = showProgress ? com.android.internal.R.id.text_line_1
: com.android.internal.R.id.text;
contentView.setTextViewText(textId, processTextSpans(p.text));
- if (!p.ambient) {
- setTextViewColorSecondary(contentView, textId, p);
- }
+ setTextViewColorSecondary(contentView, textId, p);
contentView.setViewVisibility(textId, View.VISIBLE);
}
@@ -4827,7 +4836,7 @@ public class Notification implements Parcelable
if (mN.mLargeIcon == null && mN.largeIcon != null) {
mN.mLargeIcon = Icon.createWithBitmap(mN.largeIcon);
}
- boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon && !p.ambient;
+ boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon;
if (showLargeIcon) {
contentView.setViewVisibility(R.id.right_icon, View.VISIBLE);
contentView.setImageViewIcon(R.id.right_icon, mN.mLargeIcon);
@@ -4841,7 +4850,7 @@ public class Notification implements Parcelable
* @return if the reply icon is visible
*/
private boolean bindReplyIcon(RemoteViews contentView, StandardTemplateParams p) {
- boolean actionVisible = !p.hideReplyIcon && !p.ambient;
+ boolean actionVisible = !p.hideReplyIcon;
Action action = null;
if (actionVisible) {
action = findReplyAction();
@@ -4881,21 +4890,18 @@ public class Notification implements Parcelable
private void bindNotificationHeader(RemoteViews contentView, StandardTemplateParams p) {
bindSmallIcon(contentView, p);
bindHeaderAppName(contentView, p);
- if (!p.ambient) {
- // Ambient view does not have these
- bindHeaderText(contentView, p);
- bindHeaderTextSecondary(contentView, p);
- bindHeaderChronometerAndTime(contentView, p);
- bindProfileBadge(contentView, p);
- bindAlertedIcon(contentView, p);
- }
+ bindHeaderText(contentView, p);
+ bindHeaderTextSecondary(contentView, p);
+ bindHeaderChronometerAndTime(contentView, p);
+ bindProfileBadge(contentView, p);
+ bindAlertedIcon(contentView, p);
bindActivePermissions(contentView, p);
bindExpandButton(contentView, p);
mN.mUsesStandardHeader = true;
}
private void bindActivePermissions(RemoteViews contentView, StandardTemplateParams p) {
- int color = p.ambient ? resolveAmbientColor(p) : getNeutralColor(p);
+ int color = getNeutralColor(p);
contentView.setDrawableTint(R.id.camera, false, color, PorterDuff.Mode.SRC_ATOP);
contentView.setDrawableTint(R.id.mic, false, color, PorterDuff.Mode.SRC_ATOP);
contentView.setDrawableTint(R.id.overlay, false, color, PorterDuff.Mode.SRC_ATOP);
@@ -5006,13 +5012,12 @@ public class Notification implements Parcelable
if (isColorized(p)) {
setTextViewColorPrimary(contentView, R.id.app_name_text, p);
} else {
- contentView.setTextColor(R.id.app_name_text,
- p.ambient ? resolveAmbientColor(p) : getSecondaryTextColor(p));
+ contentView.setTextColor(R.id.app_name_text, getSecondaryTextColor(p));
}
}
private boolean isColorized(StandardTemplateParams p) {
- return p.allowColorization && !p.ambient && mN.isColorized();
+ return p.allowColorization && mN.isColorized();
}
private void bindSmallIcon(RemoteViews contentView, StandardTemplateParams p) {
@@ -5062,8 +5067,7 @@ public class Notification implements Parcelable
List<Notification.Action> actions) {
List<Notification.Action> nonContextualActions = new ArrayList<>();
for (Notification.Action action : actions) {
- if (action.getSemanticAction()
- != Action.SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION) {
+ if (!action.isContextual()) {
nonContextualActions.add(action);
}
}
@@ -5083,7 +5087,7 @@ public class Notification implements Parcelable
List<Notification.Action> nonContextualActions = filterOutContextualActions(mActions);
int N = nonContextualActions.size();
- boolean emphazisedMode = mN.fullScreenIntent != null && !p.ambient;
+ boolean emphazisedMode = mN.fullScreenIntent != null;
big.setBoolean(R.id.actions, "setEmphasizedMode", emphazisedMode);
if (N > 0) {
big.setViewVisibility(R.id.actions_container, View.VISIBLE);
@@ -5108,7 +5112,7 @@ public class Notification implements Parcelable
}
CharSequence[] replyText = mN.extras.getCharSequenceArray(EXTRA_REMOTE_INPUT_HISTORY);
- if (!p.ambient && validRemoteInput && replyText != null
+ if (validRemoteInput && replyText != null
&& replyText.length > 0 && !TextUtils.isEmpty(replyText[0])
&& p.maxRemoteInputHistory > 0) {
boolean showSpinner = mN.extras.getBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER);
@@ -5225,11 +5229,10 @@ public class Notification implements Parcelable
* Construct a RemoteViews for the final notification header only. This will not be
* colorized.
*
- * @param ambient if true, generate the header for the ambient display layout.
* @hide
*/
- public RemoteViews makeNotificationHeader(boolean ambient) {
- return makeNotificationHeader(mParams.reset().ambient(ambient).fillTextsFrom(this));
+ public RemoteViews makeNotificationHeader() {
+ return makeNotificationHeader(mParams.reset().fillTextsFrom(this));
}
/**
@@ -5242,8 +5245,7 @@ public class Notification implements Parcelable
// Headers on their own are never colorized
p.disallowColorization();
RemoteViews header = new BuilderRemoteViews(mContext.getApplicationInfo(),
- p.ambient ? R.layout.notification_template_ambient_header
- : R.layout.notification_template_header);
+ R.layout.notification_template_header);
resetNotificationHeader(header);
bindNotificationHeader(header, p);
return header;
@@ -5255,11 +5257,7 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeAmbientNotification() {
- RemoteViews ambient = applyStandardTemplateWithActions(
- R.layout.notification_template_material_ambient,
- mParams.reset().ambient(true).fillTextsFrom(this).hasProgress(false),
- null /* result */);
- return ambient;
+ return createHeadsUpContentView(false /* increasedHeight */);
}
private void hideLine1Text(RemoteViews result) {
@@ -5363,14 +5361,8 @@ public class Notification implements Parcelable
}
mN.extras = publicExtras;
RemoteViews view;
- if (ambient) {
- publicExtras.putCharSequence(EXTRA_TITLE,
- mContext.getString(com.android.internal.R.string.notification_hidden_text));
- view = makeAmbientNotification();
- } else{
- view = makeNotificationHeader(false /* ambient */);
- view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true);
- }
+ view = makeNotificationHeader();
+ view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true);
mN.extras = savedBundle;
mN.mLargeIcon = largeIcon;
mN.largeIcon = largeIconLegacy;
@@ -5390,7 +5382,6 @@ public class Notification implements Parcelable
public RemoteViews makeLowPriorityContentView(boolean useRegularSubtext) {
StandardTemplateParams p = mParams.reset()
.forceDefaultColor()
- .ambient(false)
.fillTextsFrom(this);
if (!useRegularSubtext || TextUtils.isEmpty(mParams.summaryText)) {
p.summaryText(createSummaryText());
@@ -5481,8 +5472,7 @@ public class Notification implements Parcelable
if (isColorized(p)) {
setTextViewColorPrimary(button, R.id.action0, p);
} else if (getRawColor(p) != COLOR_DEFAULT && mTintActionButtons) {
- button.setTextColor(R.id.action0,
- p.ambient ? resolveAmbientColor(p) : resolveContrastColor(p));
+ button.setTextColor(R.id.action0, resolveContrastColor(p));
}
}
button.setIntTag(R.id.action0, R.id.notification_action_index_tag,
@@ -5575,13 +5565,8 @@ public class Notification implements Parcelable
}
private CharSequence processLegacyText(CharSequence charSequence) {
- return processLegacyText(charSequence, false /* ambient */);
- }
-
- private CharSequence processLegacyText(CharSequence charSequence, boolean ambient) {
boolean isAlreadyLightText = isLegacy() || textColorsNeedInversion();
- boolean wantLightText = ambient;
- if (isAlreadyLightText != wantLightText) {
+ if (isAlreadyLightText) {
return getColorUtil().invertCharSequenceColors(charSequence);
} else {
return charSequence;
@@ -5595,9 +5580,7 @@ public class Notification implements Parcelable
StandardTemplateParams p) {
boolean colorable = !isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon);
int color;
- if (p.ambient) {
- color = resolveAmbientColor(p);
- } else if (isColorized(p)) {
+ if (isColorized(p)) {
color = getPrimaryTextColor(p);
} else {
color = resolveContrastColor(p);
@@ -5684,17 +5667,6 @@ public class Notification implements Parcelable
return mNeutralColor;
}
- int resolveAmbientColor(StandardTemplateParams p) {
- int rawColor = getRawColor(p);
- if (mCachedAmbientColorIsFor == rawColor && mCachedAmbientColorIsFor != COLOR_INVALID) {
- return mCachedAmbientColor;
- }
- final int contrasted = ContrastColorUtil.resolveAmbientColor(mContext, rawColor);
-
- mCachedAmbientColorIsFor = rawColor;
- return mCachedAmbientColor = contrasted;
- }
-
/**
* Apply the unstyled operations and return a new {@link Notification} object.
* @hide
@@ -8407,6 +8379,186 @@ public class Notification implements Parcelable
}
}
+ /**
+ * Encapsulates the information needed to display a notification as a bubble.
+ *
+ * <p>A bubble is used to display app content in a floating window over the existing
+ * foreground activity. A bubble has a collapsed state represented by an icon,
+ * {@link BubbleMetadata.Builder#setIcon(Icon)} and an expanded state which is populated
+ * via {@link BubbleMetadata.Builder#setIntent(PendingIntent)}.</p>
+ *
+ * <b>Notifications with a valid and allowed bubble will display in collapsed state
+ * outside of the notification shade on unlocked devices. When a user interacts with the
+ * collapsed bubble, the bubble intent will be invoked and displayed.</b>
+ *
+ * @see Notification.Builder#setBubbleMetadata(BubbleMetadata)
+ */
+ public static final class BubbleMetadata implements Parcelable {
+
+ private PendingIntent mPendingIntent;
+ private CharSequence mTitle;
+ private Icon mIcon;
+ private int mDesiredHeight;
+
+ private BubbleMetadata(PendingIntent intent, CharSequence title, Icon icon, int height) {
+ mPendingIntent = intent;
+ mTitle = title;
+ mIcon = icon;
+ mDesiredHeight = height;
+ }
+
+ private BubbleMetadata(Parcel in) {
+ mPendingIntent = PendingIntent.CREATOR.createFromParcel(in);
+ mTitle = in.readCharSequence();
+ mIcon = Icon.CREATOR.createFromParcel(in);
+ mDesiredHeight = in.readInt();
+ }
+
+ /**
+ * @return the pending intent used to populate the floating window for this bubble.
+ */
+ public PendingIntent getIntent() {
+ return mPendingIntent;
+ }
+
+ /**
+ * @return the title that will appear along with the app content defined by
+ * {@link #getIntent()} for this bubble.
+ */
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * @return the icon that will be displayed for this bubble when it is collapsed.
+ */
+ public Icon getIcon() {
+ return mIcon;
+ }
+
+ /**
+ * @return the ideal height for the floating window that app content defined by
+ * {@link #getIntent()} for this bubble.
+ */
+ public int getDesiredHeight() {
+ return mDesiredHeight;
+ }
+
+ public static final Parcelable.Creator<BubbleMetadata> CREATOR =
+ new Parcelable.Creator<BubbleMetadata>() {
+
+ @Override
+ public BubbleMetadata createFromParcel(Parcel source) {
+ return new BubbleMetadata(source);
+ }
+
+ @Override
+ public BubbleMetadata[] newArray(int size) {
+ return new BubbleMetadata[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ mPendingIntent.writeToParcel(out, 0);
+ out.writeCharSequence(mTitle);
+ mIcon.writeToParcel(out, 0);
+ out.writeInt(mDesiredHeight);
+ }
+
+ /**
+ * Builder to construct a {@link BubbleMetadata} object.
+ */
+ public static class Builder {
+
+ private PendingIntent mPendingIntent;
+ private CharSequence mTitle;
+ private Icon mIcon;
+ private int mDesiredHeight;
+
+ /**
+ * Constructs a new builder object.
+ */
+ public Builder() {
+ }
+
+ /**
+ * Sets the intent that will be used when the bubble is expanded. This will display the
+ * app content in a floating window over the existing foreground activity.
+ */
+ public BubbleMetadata.Builder setIntent(PendingIntent intent) {
+ if (intent == null) {
+ throw new IllegalArgumentException("Bubble requires non-null pending intent");
+ }
+ mPendingIntent = intent;
+ return this;
+ }
+
+ /**
+ * Sets the title that will appear along with the app content for this bubble.
+ *
+ * <p>A title is required and should expect to fit on a single line and make sense when
+ * shown with the content defined by {@link #setIntent(PendingIntent)}.</p>
+ */
+ public BubbleMetadata.Builder setTitle(CharSequence title) {
+ if (TextUtils.isEmpty(title)) {
+ throw new IllegalArgumentException("Bubbles require non-null or empty title");
+ }
+ mTitle = title;
+ return this;
+ }
+
+ /**
+ * Sets the icon that will represent the bubble when it is collapsed.
+ *
+ * <p>An icon is required and should be representative of the content within the bubble.
+ * If your app produces multiple bubbles, the image should be unique for each of them.
+ * </p>
+ */
+ public BubbleMetadata.Builder setIcon(Icon icon) {
+ if (icon == null) {
+ throw new IllegalArgumentException("Bubbles require non-null icon");
+ }
+ mIcon = icon;
+ return this;
+ }
+
+ /**
+ * Sets the desired height for the app content defined by
+ * {@link #setIntent(PendingIntent)}, this height may not be respected if there is not
+ * enough space on the screen or if the provided height is too small to be useful.
+ */
+ public BubbleMetadata.Builder setDesiredHeight(int height) {
+ mDesiredHeight = Math.max(height, 0);
+ return this;
+ }
+
+ /**
+ * Creates the {@link BubbleMetadata} defined by this builder.
+ * <p>Will throw {@link IllegalStateException} if required fields have not been set
+ * on this builder.</p>
+ */
+ public BubbleMetadata build() {
+ if (mPendingIntent == null) {
+ throw new IllegalStateException("Must supply pending intent to bubble");
+ }
+ if (TextUtils.isEmpty(mTitle)) {
+ throw new IllegalStateException("Must supply a title for the bubble");
+ }
+ if (mIcon == null) {
+ throw new IllegalStateException("Must supply an icon for the bubble");
+ }
+ return new BubbleMetadata(mPendingIntent, mTitle, mIcon, mDesiredHeight);
+ }
+ }
+ }
+
+
// When adding a new Style subclass here, don't forget to update
// Builder.getNotificationStyleClass.
@@ -9950,7 +10102,6 @@ public class Notification implements Parcelable
private static class StandardTemplateParams {
boolean hasProgress = true;
- boolean ambient = false;
CharSequence title;
CharSequence text;
CharSequence headerTextSecondary;
@@ -9963,7 +10114,6 @@ public class Notification implements Parcelable
final StandardTemplateParams reset() {
hasProgress = true;
- ambient = false;
title = null;
text = null;
summaryText = null;
@@ -10019,22 +10169,15 @@ public class Notification implements Parcelable
return this;
}
- final StandardTemplateParams ambient(boolean ambient) {
- Preconditions.checkState(title == null && text == null, "must set ambient before text");
- this.ambient = ambient;
- return this;
- }
-
final StandardTemplateParams fillTextsFrom(Builder b) {
Bundle extras = b.mN.extras;
- this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE), ambient);
+ this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE));
- // Big text notifications should contain their content when viewed in ambient mode.
CharSequence text = extras.getCharSequence(EXTRA_BIG_TEXT);
- if (!ambient || TextUtils.isEmpty(text)) {
+ if (TextUtils.isEmpty(text)) {
text = extras.getCharSequence(EXTRA_TEXT);
}
- this.text = b.processLegacyText(text, ambient);
+ this.text = b.processLegacyText(text);
this.summaryText = extras.getCharSequence(EXTRA_SUB_TEXT);
return this;
}
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 41ceaafa56a9..e95d62fc96eb 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -19,6 +19,7 @@ import static android.app.NotificationManager.IMPORTANCE_HIGH;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.app.NotificationManager.Importance;
import android.content.ContentResolver;
@@ -84,7 +85,7 @@ public final class NotificationChannel implements Parcelable {
private static final String ATT_FG_SERVICE_SHOWN = "fgservice";
private static final String ATT_GROUP = "group";
private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
- private static final String ATT_ALLOW_APP_OVERLAY = "app_overlay";
+ private static final String ATT_ALLOW_BUBBLE = "allow_bubble";
private static final String DELIMITER = ",";
/**
@@ -120,7 +121,7 @@ public final class NotificationChannel implements Parcelable {
/**
* @hide
*/
- public static final int USER_LOCKED_ALLOW_APP_OVERLAY = 0x00000100;
+ public static final int USER_LOCKED_ALLOW_BUBBLE = 0x00000100;
/**
* @hide
@@ -133,7 +134,7 @@ public final class NotificationChannel implements Parcelable {
USER_LOCKED_VIBRATION,
USER_LOCKED_SOUND,
USER_LOCKED_SHOW_BADGE,
- USER_LOCKED_ALLOW_APP_OVERLAY
+ USER_LOCKED_ALLOW_BUBBLE
};
private static final int DEFAULT_LIGHT_COLOR = 0;
@@ -143,7 +144,7 @@ public final class NotificationChannel implements Parcelable {
NotificationManager.IMPORTANCE_UNSPECIFIED;
private static final boolean DEFAULT_DELETED = false;
private static final boolean DEFAULT_SHOW_BADGE = true;
- private static final boolean DEFAULT_ALLOW_APP_OVERLAY = true;
+ private static final boolean DEFAULT_ALLOW_BUBBLE = true;
@UnsupportedAppUsage
private final String mId;
@@ -167,7 +168,8 @@ public final class NotificationChannel implements Parcelable {
private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
// If this is a blockable system notification channel.
private boolean mBlockableSystem = false;
- private boolean mAllowAppOverlay = DEFAULT_ALLOW_APP_OVERLAY;
+ private boolean mAllowBubbles = DEFAULT_ALLOW_BUBBLE;
+ private boolean mImportanceLockedByOEM;
/**
* Creates a notification channel.
@@ -229,7 +231,8 @@ public final class NotificationChannel implements Parcelable {
mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
mLightColor = in.readInt();
mBlockableSystem = in.readBoolean();
- mAllowAppOverlay = in.readBoolean();
+ mAllowBubbles = in.readBoolean();
+ mImportanceLockedByOEM = in.readBoolean();
}
@Override
@@ -282,7 +285,8 @@ public final class NotificationChannel implements Parcelable {
}
dest.writeInt(mLightColor);
dest.writeBoolean(mBlockableSystem);
- dest.writeBoolean(mAllowAppOverlay);
+ dest.writeBoolean(mAllowBubbles);
+ dest.writeBoolean(mImportanceLockedByOEM);
}
/**
@@ -476,7 +480,7 @@ public final class NotificationChannel implements Parcelable {
/**
* Sets whether notifications posted to this channel can appear outside of the notification
- * shade, floating over other apps' content.
+ * shade, floating over other apps' content as a bubble.
*
* <p>This value will be ignored for channels that aren't allowed to pop on screen (that is,
* channels whose {@link #getImportance() importance} is <
@@ -484,10 +488,10 @@ public final class NotificationChannel implements Parcelable {
*
* <p>Only modifiable before the channel is submitted to
* * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.</p>
- * @see Notification#getAppOverlayIntent()
+ * @see Notification#getBubbleMetadata()
*/
- public void setAllowAppOverlay(boolean allowAppOverlay) {
- mAllowAppOverlay = allowAppOverlay;
+ public void setAllowBubbles(boolean allowBubbles) {
+ mAllowBubbles = allowBubbles;
}
/**
@@ -606,16 +610,16 @@ public final class NotificationChannel implements Parcelable {
* Returns whether notifications posted to this channel can display outside of the notification
* shade, in a floating window on top of other apps.
*/
- public boolean canOverlayApps() {
- return isAppOverlayAllowed() && getImportance() >= IMPORTANCE_HIGH;
+ public boolean canBubble() {
+ return isBubbleAllowed() && getImportance() >= IMPORTANCE_HIGH;
}
/**
- * Like {@link #canOverlayApps()}, but only checks the permission, not the importance.
+ * Like {@link #canBubble()}, but only checks the permission, not the importance.
* @hide
*/
- public boolean isAppOverlayAllowed() {
- return mAllowAppOverlay;
+ public boolean isBubbleAllowed() {
+ return mAllowBubbles;
}
/**
@@ -649,6 +653,22 @@ public final class NotificationChannel implements Parcelable {
}
/**
+ * @hide
+ */
+ @TestApi
+ public void setImportanceLockedByOEM(boolean locked) {
+ mImportanceLockedByOEM = locked;
+ }
+
+ /**
+ * @hide
+ */
+ @TestApi
+ public boolean isImportanceLockedByOEM() {
+ return mImportanceLockedByOEM;
+ }
+
+ /**
* Returns whether the user has chosen the importance of this channel, either to affirm the
* initial selection from the app, or changed it to be higher or lower.
* @see #getImportance()
@@ -699,7 +719,7 @@ public final class NotificationChannel implements Parcelable {
lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
setFgServiceShown(safeBool(parser, ATT_FG_SERVICE_SHOWN, false));
setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
- setAllowAppOverlay(safeBool(parser, ATT_ALLOW_APP_OVERLAY, DEFAULT_ALLOW_APP_OVERLAY));
+ setAllowBubbles(safeBool(parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
}
@Nullable
@@ -818,8 +838,8 @@ public final class NotificationChannel implements Parcelable {
if (isBlockableSystem()) {
out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
}
- if (canOverlayApps() != DEFAULT_ALLOW_APP_OVERLAY) {
- out.attribute(null, ATT_ALLOW_APP_OVERLAY, Boolean.toString(canOverlayApps()));
+ if (canBubble() != DEFAULT_ALLOW_BUBBLE) {
+ out.attribute(null, ATT_ALLOW_BUBBLE, Boolean.toString(canBubble()));
}
out.endTag(null, TAG_CHANNEL);
@@ -863,7 +883,7 @@ public final class NotificationChannel implements Parcelable {
record.put(ATT_DELETED, Boolean.toString(isDeleted()));
record.put(ATT_GROUP, getGroup());
record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
- record.put(ATT_ALLOW_APP_OVERLAY, canOverlayApps());
+ record.put(ATT_ALLOW_BUBBLE, canBubble());
return record;
}
@@ -952,25 +972,26 @@ public final class NotificationChannel implements Parcelable {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NotificationChannel that = (NotificationChannel) o;
- return getImportance() == that.getImportance() &&
- mBypassDnd == that.mBypassDnd &&
- getLockscreenVisibility() == that.getLockscreenVisibility() &&
- mLights == that.mLights &&
- getLightColor() == that.getLightColor() &&
- getUserLockedFields() == that.getUserLockedFields() &&
- isFgServiceShown() == that.isFgServiceShown() &&
- mVibrationEnabled == that.mVibrationEnabled &&
- mShowBadge == that.mShowBadge &&
- isDeleted() == that.isDeleted() &&
- isBlockableSystem() == that.isBlockableSystem() &&
- mAllowAppOverlay == that.mAllowAppOverlay &&
- Objects.equals(getId(), that.getId()) &&
- Objects.equals(getName(), that.getName()) &&
- Objects.equals(mDesc, that.mDesc) &&
- Objects.equals(getSound(), that.getSound()) &&
- Arrays.equals(mVibration, that.mVibration) &&
- Objects.equals(getGroup(), that.getGroup()) &&
- Objects.equals(getAudioAttributes(), that.getAudioAttributes());
+ return getImportance() == that.getImportance()
+ && mBypassDnd == that.mBypassDnd
+ && getLockscreenVisibility() == that.getLockscreenVisibility()
+ && mLights == that.mLights
+ && getLightColor() == that.getLightColor()
+ && getUserLockedFields() == that.getUserLockedFields()
+ && isFgServiceShown() == that.isFgServiceShown()
+ && mVibrationEnabled == that.mVibrationEnabled
+ && mShowBadge == that.mShowBadge
+ && isDeleted() == that.isDeleted()
+ && isBlockableSystem() == that.isBlockableSystem()
+ && mAllowBubbles == that.mAllowBubbles
+ && Objects.equals(getId(), that.getId())
+ && Objects.equals(getName(), that.getName())
+ && Objects.equals(mDesc, that.mDesc)
+ && Objects.equals(getSound(), that.getSound())
+ && Arrays.equals(mVibration, that.mVibration)
+ && Objects.equals(getGroup(), that.getGroup())
+ && Objects.equals(getAudioAttributes(), that.getAudioAttributes())
+ && mImportanceLockedByOEM == that.mImportanceLockedByOEM;
}
@Override
@@ -979,7 +1000,8 @@ public final class NotificationChannel implements Parcelable {
getLockscreenVisibility(), getSound(), mLights, getLightColor(),
getUserLockedFields(),
isFgServiceShown(), mVibrationEnabled, mShowBadge, isDeleted(), getGroup(),
- getAudioAttributes(), isBlockableSystem(), mAllowAppOverlay);
+ getAudioAttributes(), isBlockableSystem(), mAllowBubbles,
+ mImportanceLockedByOEM);
result = 31 * result + Arrays.hashCode(mVibration);
return result;
}
@@ -1006,7 +1028,8 @@ public final class NotificationChannel implements Parcelable {
+ ", mGroup='" + mGroup + '\''
+ ", mAudioAttributes=" + mAudioAttributes
+ ", mBlockableSystem=" + mBlockableSystem
- + ", mAllowAppOverlay=" + mAllowAppOverlay
+ + ", mAllowBubbles=" + mAllowBubbles
+ + ", mImportanceLockedByOEM=" + mImportanceLockedByOEM
+ '}';
pw.println(prefix + output);
}
@@ -1032,7 +1055,8 @@ public final class NotificationChannel implements Parcelable {
+ ", mGroup='" + mGroup + '\''
+ ", mAudioAttributes=" + mAudioAttributes
+ ", mBlockableSystem=" + mBlockableSystem
- + ", mAllowAppOverlay=" + mAllowAppOverlay
+ + ", mAllowBubbles=" + mAllowBubbles
+ + ", mImportanceLockedByOEM=" + mImportanceLockedByOEM
+ '}';
}
@@ -1066,7 +1090,7 @@ public final class NotificationChannel implements Parcelable {
mAudioAttributes.writeToProto(proto, NotificationChannelProto.AUDIO_ATTRIBUTES);
}
proto.write(NotificationChannelProto.IS_BLOCKABLE_SYSTEM, mBlockableSystem);
- proto.write(NotificationChannelProto.ALLOW_APP_OVERLAY, mAllowAppOverlay);
+ proto.write(NotificationChannelProto.ALLOW_APP_OVERLAY, mAllowBubbles);
proto.end(token);
}
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index aad32532bbe8..43614feb28a4 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -1080,14 +1080,14 @@ public class NotificationManager {
* notification shade, floating over other apps' content.
*
* <p>This value will be ignored for notifications that are posted to channels that do not
- * allow app overlays ({@link NotificationChannel#canOverlayApps()}.
+ * allow bubbles ({@link NotificationChannel#canBubble()}.
*
- * @see Notification#getAppOverlayIntent()
+ * @see Notification#getBubbleMetadata()
*/
- public boolean areAppOverlaysAllowed() {
+ public boolean areBubblesAllowed() {
INotificationManager service = getService();
try {
- return service.areAppOverlaysAllowed(mContext.getPackageName());
+ return service.areBubblesAllowed(mContext.getPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 9ddf4bd0870c..2dc225af6482 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -21,8 +21,11 @@ import android.accounts.IAccountManager;
import android.app.ContextImpl.ServiceInitializationState;
import android.app.admin.DevicePolicyManager;
import android.app.admin.IDevicePolicyManager;
+import android.app.contentsuggestions.ContentSuggestionsManager;
+import android.app.contentsuggestions.IContentSuggestionsManager;
import android.app.job.IJobScheduler;
import android.app.job.JobScheduler;
+import android.app.prediction.AppPredictionManager;
import android.app.role.RoleManager;
import android.app.slice.SliceManager;
import android.app.timedetector.TimeDetector;
@@ -42,6 +45,8 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.IRestrictionsManager;
import android.content.RestrictionsManager;
+import android.content.om.IOverlayManager;
+import android.content.om.OverlayManager;
import android.content.pm.CrossProfileApps;
import android.content.pm.ICrossProfileApps;
import android.content.pm.IShortcutService;
@@ -95,8 +100,10 @@ import android.net.ConnectivityThread;
import android.net.EthernetManager;
import android.net.IConnectivityManager;
import android.net.IEthernetManager;
+import android.net.IIpMemoryStore;
import android.net.IIpSecService;
import android.net.INetworkPolicyManager;
+import android.net.IpMemoryStore;
import android.net.IpSecManager;
import android.net.NetworkPolicyManager;
import android.net.NetworkScoreManager;
@@ -120,6 +127,7 @@ import android.net.wifi.rtt.WifiRttManager;
import android.nfc.NfcManager;
import android.os.BatteryManager;
import android.os.BatteryStats;
+import android.os.BugreportManager;
import android.os.Build;
import android.os.DeviceIdleManager;
import android.os.DropBoxManager;
@@ -127,6 +135,7 @@ import android.os.HardwarePropertiesManager;
import android.os.IBatteryPropertiesRegistrar;
import android.os.IBinder;
import android.os.IDeviceIdleController;
+import android.os.IDumpstate;
import android.os.IHardwarePropertiesManager;
import android.os.IPowerManager;
import android.os.IRecoverySystem;
@@ -321,10 +330,21 @@ final class SystemServiceRegistry {
registerService(Context.NETWORK_STACK_SERVICE, NetworkStack.class,
new StaticServiceFetcher<NetworkStack>() {
- @Override
- public NetworkStack createService() {
- return new NetworkStack();
- }});
+ @Override
+ public NetworkStack createService() {
+ return new NetworkStack();
+ }});
+
+ registerService(Context.IP_MEMORY_STORE_SERVICE, IpMemoryStore.class,
+ new CachedServiceFetcher<IpMemoryStore>() {
+ @Override
+ public IpMemoryStore createService(final ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(
+ Context.IP_MEMORY_STORE_SERVICE);
+ IIpMemoryStore service = IIpMemoryStore.Stub.asInterface(b);
+ return new IpMemoryStore(ctx, service);
+ }});
registerService(Context.IPSEC_SERVICE, IpSecManager.class,
new CachedServiceFetcher<IpSecManager>() {
@@ -419,10 +439,11 @@ final class SystemServiceRegistry {
}});
registerService(Context.TEXT_SERVICES_MANAGER_SERVICE, TextServicesManager.class,
- new StaticServiceFetcher<TextServicesManager>() {
+ new CachedServiceFetcher<TextServicesManager>() {
@Override
- public TextServicesManager createService() {
- return TextServicesManager.getInstance();
+ public TextServicesManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ return TextServicesManager.createInstance(ctx);
}});
registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class,
@@ -1035,6 +1056,14 @@ final class SystemServiceRegistry {
return new ShortcutManager(ctx, IShortcutService.Stub.asInterface(b));
}});
+ registerService(Context.OVERLAY_SERVICE, OverlayManager.class,
+ new CachedServiceFetcher<OverlayManager>() {
+ @Override
+ public OverlayManager createService(ContextImpl ctx) throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(Context.OVERLAY_SERVICE);
+ return new OverlayManager(ctx, IOverlayManager.Stub.asInterface(b));
+ }});
+
registerService(Context.NETWORK_WATCHLIST_SERVICE, NetworkWatchlistManager.class,
new CachedServiceFetcher<NetworkWatchlistManager>() {
@Override
@@ -1069,6 +1098,16 @@ final class SystemServiceRegistry {
return new IncidentManager(ctx);
}});
+ registerService(Context.BUGREPORT_SERVICE, BugreportManager.class,
+ new CachedServiceFetcher<BugreportManager>() {
+ @Override
+ public BugreportManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(Context.BUGREPORT_SERVICE);
+ return new BugreportManager(ctx.getOuterContext(),
+ IDumpstate.Stub.asInterface(b));
+ }});
+
registerService(Context.AUTOFILL_MANAGER_SERVICE, AutofillManager.class,
new CachedServiceFetcher<AutofillManager>() {
@Override
@@ -1095,6 +1134,29 @@ final class SystemServiceRegistry {
return null;
}});
+ registerService(Context.APP_PREDICTION_SERVICE, AppPredictionManager.class,
+ new CachedServiceFetcher<AppPredictionManager>() {
+ @Override
+ public AppPredictionManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ return new AppPredictionManager(ctx);
+ }
+ });
+
+ registerService(Context.CONTENT_SUGGESTIONS_SERVICE,
+ ContentSuggestionsManager.class,
+ new CachedServiceFetcher<ContentSuggestionsManager>() {
+ @Override
+ public ContentSuggestionsManager createService(ContextImpl ctx) {
+ // No throw as this is an optional service
+ IBinder b = ServiceManager.getService(
+ Context.CONTENT_SUGGESTIONS_SERVICE);
+ IContentSuggestionsManager service =
+ IContentSuggestionsManager.Stub.asInterface(b);
+ return new ContentSuggestionsManager(service);
+ }
+ });
+
registerService(Context.VR_SERVICE, VrManager.class, new CachedServiceFetcher<VrManager>() {
@Override
public VrManager createService(ContextImpl ctx) throws ServiceNotFoundException {
diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java
index ace814ab4fe0..38a98d3c8807 100644
--- a/core/java/android/app/WallpaperColors.java
+++ b/core/java/android/app/WallpaperColors.java
@@ -18,7 +18,7 @@ package android.app;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.UnsupportedAppUsage;
+import android.annotation.SystemApi;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -56,6 +56,7 @@ public final class WallpaperColors implements Parcelable {
* eg. A launcher may set its text color to black if this flag is specified.
* @hide
*/
+ @SystemApi
public static final int HINT_SUPPORTS_DARK_TEXT = 1 << 0;
/**
@@ -64,6 +65,7 @@ public final class WallpaperColors implements Parcelable {
* eg. A launcher may set its drawer color to black if this flag is specified.
* @hide
*/
+ @SystemApi
public static final int HINT_SUPPORTS_DARK_THEME = 1 << 1;
/**
@@ -234,7 +236,7 @@ public final class WallpaperColors implements Parcelable {
* @see WallpaperColors#fromDrawable(Drawable)
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public WallpaperColors(@NonNull Color primaryColor, @Nullable Color secondaryColor,
@Nullable Color tertiaryColor, int colorHints) {
@@ -349,7 +351,7 @@ public final class WallpaperColors implements Parcelable {
* @return True if dark text is supported.
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public int getColorHints() {
return mColorHints;
}
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 27ae0b0314d0..a929fe0f688e 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -307,13 +307,14 @@ public class WallpaperManager {
* @param callback Listener
* @param handler Thread to call it from. Main thread if null.
* @param userId Owner of the wallpaper or UserHandle.USER_ALL
+ * @param displayId Caller comes from which display
*/
public void addOnColorsChangedListener(@NonNull OnColorsChangedListener callback,
- @Nullable Handler handler, int userId) {
+ @Nullable Handler handler, int userId, int displayId) {
synchronized (this) {
if (!mColorCallbackRegistered) {
try {
- mService.registerWallpaperColorsCallback(this, userId);
+ mService.registerWallpaperColorsCallback(this, userId, displayId);
mColorCallbackRegistered = true;
} catch (RemoteException e) {
// Failed, service is gone
@@ -329,16 +330,17 @@ public class WallpaperManager {
*
* @param callback listener
* @param userId Owner of the wallpaper or UserHandle.USER_ALL
+ * @param displayId Which display is interested
*/
public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback,
- int userId) {
+ int userId, int displayId) {
synchronized (this) {
mColorListeners.removeIf(pair -> pair.first == callback);
if (mColorListeners.size() == 0 && mColorCallbackRegistered) {
mColorCallbackRegistered = false;
try {
- mService.unregisterWallpaperColorsCallback(this, userId);
+ mService.unregisterWallpaperColorsCallback(this, userId, displayId);
} catch (RemoteException e) {
// Failed, service is gone
Log.w(TAG, "Can't unregister color updates", e);
@@ -370,14 +372,14 @@ public class WallpaperManager {
}
}
- WallpaperColors getWallpaperColors(int which, int userId) {
+ WallpaperColors getWallpaperColors(int which, int userId, int displayId) {
if (which != FLAG_LOCK && which != FLAG_SYSTEM) {
throw new IllegalArgumentException(
"Must request colors for exactly one kind of wallpaper");
}
try {
- return mService.getWallpaperColors(which, userId);
+ return mService.getWallpaperColors(which, userId, displayId);
} catch (RemoteException e) {
// Can't get colors, connection lost.
}
@@ -894,7 +896,7 @@ public class WallpaperManager {
@UnsupportedAppUsage
public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener,
@NonNull Handler handler, int userId) {
- sGlobals.addOnColorsChangedListener(listener, handler, userId);
+ sGlobals.addOnColorsChangedListener(listener, handler, userId, mContext.getDisplayId());
}
/**
@@ -913,7 +915,7 @@ public class WallpaperManager {
*/
public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback,
int userId) {
- sGlobals.removeOnColorsChangedListener(callback, userId);
+ sGlobals.removeOnColorsChangedListener(callback, userId, mContext.getDisplayId());
}
/**
@@ -947,7 +949,7 @@ public class WallpaperManager {
*/
@UnsupportedAppUsage
public @Nullable WallpaperColors getWallpaperColors(int which, int userId) {
- return sGlobals.getWallpaperColors(which, userId);
+ return sGlobals.getWallpaperColors(which, userId, mContext.getDisplayId());
}
/**
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index 2990b577e09d..e0a15a5a7f89 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -19,6 +19,7 @@ package android.app;
import static android.app.ActivityThread.isSystem;
import static android.app.WindowConfigurationProto.ACTIVITY_TYPE;
import static android.app.WindowConfigurationProto.APP_BOUNDS;
+import static android.app.WindowConfigurationProto.BOUNDS;
import static android.app.WindowConfigurationProto.WINDOWING_MODE;
import static android.view.Surface.rotationToString;
@@ -585,6 +586,9 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
}
protoOutputStream.write(WINDOWING_MODE, mWindowingMode);
protoOutputStream.write(ACTIVITY_TYPE, mActivityType);
+ if (mBounds != null) {
+ mBounds.writeToProto(protoOutputStream, BOUNDS);
+ }
protoOutputStream.end(token);
}
@@ -606,6 +610,10 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
mAppBounds = new Rect();
mAppBounds.readFromProto(proto, APP_BOUNDS);
break;
+ case (int) BOUNDS:
+ mBounds = new Rect();
+ mBounds.readFromProto(proto, BOUNDS);
+ break;
case (int) WINDOWING_MODE:
mWindowingMode = proto.readInt(WINDOWING_MODE);
break;
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 7da67d9e14e4..6d7c547f7cf1 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2168,6 +2168,74 @@ public class DevicePolicyManager {
public @interface SetPrivateDnsModeResultConstants {}
/**
+ * Activity action: Starts the administrator to get the mode for the provisioning.
+ * This intent may contain the following extras:
+ * <ul>
+ * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}</li>
+ * <li>{@link #EXTRA_PROVISIONING_IMEI}</li>
+ * <li>{@link #EXTRA_PROVISIONING_SERIAL_NUMBER}</li>
+ * </ul>
+ *
+ * <p>The target activity should return one of the following values in
+ * {@link #EXTRA_PROVISIONING_MODE} as result:
+ * <ul>
+ * <li>{@link #PROVISIONING_MODE_FULLY_MANAGED_DEVICE}</li>
+ * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE}</li>
+ * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE}</li>
+ * </ul>
+ *
+ * <p>The target activity may also return the account that needs to be migrated from primary
+ * user to managed profile in case of a profile owner provisioning in
+ * {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE} as result.
+ */
+ public static final String ACTION_GET_PROVISIONING_MODE =
+ "android.app.action.GET_PROVISIONING_MODE";
+
+ /**
+ * A string extra holding the IMEI (International Mobile Equipment Identity) of the device.
+ */
+ public static final String EXTRA_PROVISIONING_IMEI = "android.app.extra.PROVISIONING_IMEI";
+
+ /**
+ * A string extra holding the serial number of the device.
+ */
+ public static final String EXTRA_PROVISIONING_SERIAL_NUMBER =
+ "android.app.extra.PROVISIONING_SERIAL_NUMBER";
+
+ /**
+ * An intent extra holding the provisioning mode returned by the administrator.
+ * The value for this extra should be one of the following:
+ * <ul>
+ * <li>{@link #PROVISIONING_MODE_FULLY_MANAGED_DEVICE}</li>
+ * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE}</li>
+ * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE}</li>
+ * </ul>
+ */
+ public static final String EXTRA_PROVISIONING_MODE =
+ "android.app.extra.PROVISIONING_MODE";
+
+ /**
+ * The provisioning mode for fully managed device.
+ */
+ public static final int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1;
+
+ /**
+ * The provisioning mode for managed profile.
+ */
+ public static final int PROVISIONING_MODE_MANAGED_PROFILE = 2;
+
+ /**
+ * The provisioning mode for managed profile on a fully managed device.
+ */
+ public static final int PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 3;
+
+ /**
+ * Activity action: Starts the administrator to show policy compliance for the provisioning.
+ */
+ public static final String ACTION_ADMIN_POLICY_COMPLIANCE =
+ "android.app.action.ADMIN_POLICY_COMPLIANCE";
+
+ /**
* Return true if the given administrator component is currently active (enabled) in the system.
*
* @param admin The administrator component to check for.
@@ -6815,8 +6883,12 @@ public class DevicePolicyManager {
}
/**
- * Returns the list of input methods permitted by the device or profiles
- * owners of the current user. (*Not* calling user, due to a limitation in InputMethodManager.)
+ * Returns the list of input methods permitted by the device or profiles owners.
+ *
+ * <p>On {@link android.os.Build.VERSION_CODES#Q} and later devices, this method returns the
+ * result for the calling user.</p>
+ *
+ * <p>On Android P and prior devices, this method returns the result for the current user.</p>
*
* <p>Null means all input methods are allowed, if a non-null list is returned
* it will contain the intersection of the permitted lists for any device or profile
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index cc4d4b1ae7ec..7d03f00611d4 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1699,7 +1699,8 @@ public class AssistStructure implements Parcelable {
@Override
public void setVisibility(int visibility) {
- mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_VISIBILITY_MASK) | visibility;
+ mNode.mFlags = (mNode.mFlags & ~ViewNode.FLAGS_VISIBILITY_MASK)
+ | (visibility & ViewNode.FLAGS_VISIBILITY_MASK);
}
@Override
diff --git a/core/java/android/app/contentsuggestions/ClassificationsRequest.aidl b/core/java/android/app/contentsuggestions/ClassificationsRequest.aidl
new file mode 100644
index 000000000000..a66413becc29
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ClassificationsRequest.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+parcelable ClassificationsRequest;
diff --git a/core/java/android/app/contentsuggestions/ClassificationsRequest.java b/core/java/android/app/contentsuggestions/ClassificationsRequest.java
new file mode 100644
index 000000000000..3f715186abfb
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ClassificationsRequest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.List;
+
+/**
+ * @hide
+ */
+@SystemApi
+public final class ClassificationsRequest implements Parcelable {
+ @NonNull
+ private final List<ContentSelection> mSelections;
+ @Nullable
+ private final Bundle mExtras;
+
+ private ClassificationsRequest(@NonNull List<ContentSelection> selections,
+ @Nullable Bundle extras) {
+ mSelections = selections;
+ mExtras = extras;
+ }
+
+ /**
+ * Return request selections.
+ */
+ public List<ContentSelection> getSelections() {
+ return mSelections;
+ }
+
+ /**
+ * Return the request extras.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeTypedList(mSelections);
+ dest.writeBundle(mExtras);
+ }
+
+ public static final Creator<ClassificationsRequest> CREATOR =
+ new Creator<ClassificationsRequest>() {
+ @Override
+ public ClassificationsRequest createFromParcel(Parcel source) {
+ return new ClassificationsRequest(
+ source.createTypedArrayList(ContentSelection.CREATOR),
+ source.readBundle());
+ }
+
+ @Override
+ public ClassificationsRequest[] newArray(int size) {
+ return new ClassificationsRequest[size];
+ }
+ };
+
+ /**
+ * A builder for classifications request events.
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+
+ private final List<ContentSelection> mSelections;
+ private Bundle mExtras;
+
+ public Builder(@NonNull List<ContentSelection> selections) {
+ mSelections = selections;
+ }
+
+ /**
+ * Sets the request extras.
+ */
+ public Builder setExtras(@NonNull Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Builds a new request instance.
+ */
+ public ClassificationsRequest build() {
+ return new ClassificationsRequest(mSelections, mExtras);
+ }
+ }
+}
diff --git a/core/java/android/app/contentsuggestions/ContentClassification.aidl b/core/java/android/app/contentsuggestions/ContentClassification.aidl
new file mode 100644
index 000000000000..f67b2c8cea36
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ContentClassification.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+parcelable ContentClassification;
diff --git a/core/java/android/app/contentsuggestions/ContentClassification.java b/core/java/android/app/contentsuggestions/ContentClassification.java
new file mode 100644
index 000000000000..f18520f1053c
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ContentClassification.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @hide
+ */
+@SystemApi
+public final class ContentClassification implements Parcelable {
+ @NonNull
+ private final String mClassificationId;
+ @NonNull
+ private final Bundle mExtras;
+
+ public ContentClassification(@NonNull String classificationId, @NonNull Bundle extras) {
+ mClassificationId = classificationId;
+ mExtras = extras;
+ }
+
+ /**
+ * Return the classification id.
+ */
+ public String getId() {
+ return mClassificationId;
+ }
+
+ /**
+ * Return the classification extras.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mClassificationId);
+ dest.writeBundle(mExtras);
+ }
+
+ public static final Creator<ContentClassification> CREATOR =
+ new Creator<ContentClassification>() {
+ @Override
+ public ContentClassification createFromParcel(Parcel source) {
+ return new ContentClassification(
+ source.readString(),
+ source.readBundle());
+ }
+
+ @Override
+ public ContentClassification[] newArray(int size) {
+ return new ContentClassification[size];
+ }
+ };
+}
diff --git a/core/java/android/app/contentsuggestions/ContentSelection.aidl b/core/java/android/app/contentsuggestions/ContentSelection.aidl
new file mode 100644
index 000000000000..e626d69278a4
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ContentSelection.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+parcelable ContentSelection;
diff --git a/core/java/android/app/contentsuggestions/ContentSelection.java b/core/java/android/app/contentsuggestions/ContentSelection.java
new file mode 100644
index 000000000000..a8917f782e83
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ContentSelection.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @hide
+ */
+@SystemApi
+public final class ContentSelection implements Parcelable {
+ @NonNull
+ private final String mSelectionId;
+ @NonNull
+ private final Bundle mExtras;
+
+ public ContentSelection(@NonNull String selectionId, @NonNull Bundle extras) {
+ mSelectionId = selectionId;
+ mExtras = extras;
+ }
+
+ /**
+ * Return the selection id.
+ */
+ public String getId() {
+ return mSelectionId;
+ }
+
+ /**
+ * Return the selection extras.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mSelectionId);
+ dest.writeBundle(mExtras);
+ }
+
+ public static final Creator<ContentSelection> CREATOR =
+ new Creator<ContentSelection>() {
+ @Override
+ public ContentSelection createFromParcel(Parcel source) {
+ return new ContentSelection(
+ source.readString(),
+ source.readBundle());
+ }
+
+ @Override
+ public ContentSelection[] newArray(int size) {
+ return new ContentSelection[size];
+ }
+ };
+}
diff --git a/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java
new file mode 100644
index 000000000000..b4d89774cc3b
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ContentSuggestionsManager.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * When provided with content from an app, can suggest selections and classifications of that
+ * content.
+ *
+ * <p>The content is mainly a snapshot of a running task, the selections will be text and image
+ * selections with that image content. These mSelections can then be classified to find actions and
+ * entities on those selections.
+ *
+ * <p>Only accessible to blessed components such as Overview.
+ *
+ * @hide
+ */
+@SystemApi
+public final class ContentSuggestionsManager {
+ private static final String TAG = ContentSuggestionsManager.class.getSimpleName();
+
+ @Nullable
+ private final IContentSuggestionsManager mService;
+
+ /** @hide */
+ public ContentSuggestionsManager(@Nullable IContentSuggestionsManager service) {
+ mService = service;
+ }
+
+ /**
+ * Hints to the system that a new context image for the provided task should be sent to the
+ * system content suggestions service.
+ *
+ * @param taskId of the task to snapshot.
+ * @param imageContextRequestExtras sent with with request to provide implementation specific
+ * extra information.
+ */
+ public void provideContextImage(int taskId, @NonNull Bundle imageContextRequestExtras) {
+ if (mService == null) {
+ Log.e(TAG, "provideContextImage called, but no ContentSuggestionsManager configured");
+ return;
+ }
+
+ try {
+ mService.provideContextImage(taskId, imageContextRequestExtras);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Suggest content selections, based on the provided task id and optional
+ * location on screen provided in the request. Called after provideContextImage().
+ * The result can be passed to
+ * {@link #classifyContentSelections(ClassificationsRequest, Executor, ClassificationsCallback)}
+ * to classify actions and entities on these selections.
+ *
+ * @param request containing the task and point location.
+ * @param callbackExecutor to execute the provided callback on.
+ * @param callback to receive the selections.
+ */
+ public void suggestContentSelections(
+ @NonNull SelectionsRequest request,
+ @NonNull @CallbackExecutor Executor callbackExecutor,
+ @NonNull SelectionsCallback callback) {
+ if (mService == null) {
+ Log.e(TAG,
+ "suggestContentSelections called, but no ContentSuggestionsManager configured");
+ return;
+ }
+
+ try {
+ mService.suggestContentSelections(
+ request, new SelectionsCallbackWrapper(callback, callbackExecutor));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Classify actions and entities in content selections, as returned from
+ * suggestContentSelections. Note these selections may be modified by the
+ * caller before being passed here.
+ *
+ * @param request containing the selections to classify.
+ * @param callbackExecutor to execute the provided callback on.
+ * @param callback to receive the classifications.
+ */
+ public void classifyContentSelections(
+ @NonNull ClassificationsRequest request,
+ @NonNull @CallbackExecutor Executor callbackExecutor,
+ @NonNull ClassificationsCallback callback) {
+ if (mService == null) {
+ Log.e(TAG, "classifyContentSelections called, "
+ + "but no ContentSuggestionsManager configured");
+ return;
+ }
+
+ try {
+ mService.classifyContentSelections(
+ request, new ClassificationsCallbackWrapper(callback, callbackExecutor));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Report telemetry for interaction with suggestions / classifications.
+ *
+ * @param requestId the id for the associated interaction
+ * @param interaction to report back to the system content suggestions service.
+ */
+ public void notifyInteraction(@NonNull String requestId, @NonNull Bundle interaction) {
+ if (mService == null) {
+ Log.e(TAG, "notifyInteraction called, but no ContentSuggestionsManager configured");
+ return;
+ }
+
+ try {
+ mService.notifyInteraction(requestId, interaction);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Callback to receive content selections from
+ * {@link #suggestContentSelections(SelectionsRequest, Executor, SelectionsCallback)}.
+ */
+ public interface SelectionsCallback {
+ /**
+ * Async callback called when the content suggestions service has selections available.
+ * These can be modified and sent back to the manager for classification. The contents of
+ * the selection is implementation dependent.
+ *
+ * @param statusCode as defined by the implementation of content suggestions service.
+ * @param selections not {@code null}, but can be size {@code 0}.
+ */
+ void onContentSelectionsAvailable(
+ int statusCode, @NonNull List<ContentSelection> selections);
+ }
+
+ /**
+ * Callback to receive classifications from
+ * {@link #classifyContentSelections(ClassificationsRequest, Executor, ClassificationsCallback)}
+ */
+ public interface ClassificationsCallback {
+ /**
+ * Async callback called when the content suggestions service has classified selections. The
+ * contents of the classification is implementation dependent.
+ *
+ * @param statusCode as defined by the implementation of content suggestions service.
+ * @param classifications not {@code null}, but can be size {@code 0}.
+ */
+ void onContentClassificationsAvailable(int statusCode,
+ @NonNull List<ContentClassification> classifications);
+ }
+
+ private static class SelectionsCallbackWrapper extends ISelectionsCallback.Stub {
+ private final SelectionsCallback mCallback;
+ private final Executor mExecutor;
+
+ SelectionsCallbackWrapper(
+ @NonNull SelectionsCallback callback, @NonNull Executor executor) {
+ mCallback = callback;
+ mExecutor = executor;
+ }
+
+ @Override
+ public void onContentSelectionsAvailable(
+ int statusCode, List<ContentSelection> selections) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() ->
+ mCallback.onContentSelectionsAvailable(statusCode, selections));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+
+ private static final class ClassificationsCallbackWrapper extends
+ IClassificationsCallback.Stub {
+ private final ClassificationsCallback mCallback;
+ private final Executor mExecutor;
+
+ ClassificationsCallbackWrapper(@NonNull ClassificationsCallback callback,
+ @NonNull Executor executor) {
+ mCallback = callback;
+ mExecutor = executor;
+ }
+
+ @Override
+ public void onContentClassificationsAvailable(
+ int statusCode, List<ContentClassification> classifications) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() ->
+ mCallback.onContentClassificationsAvailable(statusCode, classifications));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+}
diff --git a/core/java/android/app/contentsuggestions/IClassificationsCallback.aidl b/core/java/android/app/contentsuggestions/IClassificationsCallback.aidl
new file mode 100644
index 000000000000..69f5d5595986
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/IClassificationsCallback.aidl
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.app.contentsuggestions.ContentClassification;
+
+/** @hide */
+oneway interface IClassificationsCallback {
+ void onContentClassificationsAvailable(
+ int statusCode, in List<ContentClassification> classifications);
+}
diff --git a/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl
new file mode 100644
index 000000000000..24f5ad866635
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.os.Bundle;
+
+/** @hide */
+oneway interface IContentSuggestionsManager {
+ void provideContextImage(
+ int taskId,
+ in Bundle imageContextRequestExtras);
+ void suggestContentSelections(
+ in SelectionsRequest request,
+ in ISelectionsCallback callback);
+ void classifyContentSelections(
+ in ClassificationsRequest request,
+ in IClassificationsCallback callback);
+ void notifyInteraction(in String requestId, in Bundle interaction);
+}
diff --git a/core/java/android/app/contentsuggestions/ISelectionsCallback.aidl b/core/java/android/app/contentsuggestions/ISelectionsCallback.aidl
new file mode 100644
index 000000000000..19525832a4cd
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/ISelectionsCallback.aidl
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.app.contentsuggestions.ContentSelection;
+import android.os.Bundle;
+
+/** @hide */
+oneway interface ISelectionsCallback {
+ void onContentSelectionsAvailable(int statusCode, in List<ContentSelection> selections);
+}
diff --git a/core/java/android/app/contentsuggestions/SelectionsRequest.aidl b/core/java/android/app/contentsuggestions/SelectionsRequest.aidl
new file mode 100644
index 000000000000..f5ce7c31bd94
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/SelectionsRequest.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+parcelable SelectionsRequest;
diff --git a/core/java/android/app/contentsuggestions/SelectionsRequest.java b/core/java/android/app/contentsuggestions/SelectionsRequest.java
new file mode 100644
index 000000000000..16f3e6b35aa4
--- /dev/null
+++ b/core/java/android/app/contentsuggestions/SelectionsRequest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @hide
+ */
+@SystemApi
+public final class SelectionsRequest implements Parcelable {
+ private final int mTaskId;
+ @Nullable
+ private final Point mInterestPoint;
+ @Nullable
+ private final Bundle mExtras;
+
+ private SelectionsRequest(int taskId, @Nullable Point interestPoint, @Nullable Bundle extras) {
+ mTaskId = taskId;
+ mInterestPoint = interestPoint;
+ mExtras = extras;
+ }
+
+ /**
+ * Return the request task id.
+ */
+ public int getTaskId() {
+ return mTaskId;
+ }
+
+ /**
+ * Return the request point of interest.
+ */
+ public Point getInterestPoint() {
+ return mInterestPoint;
+ }
+
+ /**
+ * Return the request extras.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mTaskId);
+ dest.writeTypedObject(mInterestPoint, flags);
+ dest.writeBundle(mExtras);
+ }
+
+ public static final Creator<SelectionsRequest> CREATOR =
+ new Creator<SelectionsRequest>() {
+ @Override
+ public SelectionsRequest createFromParcel(Parcel source) {
+ return new SelectionsRequest(
+ source.readInt(), source.readTypedObject(Point.CREATOR), source.readBundle());
+ }
+
+ @Override
+ public SelectionsRequest[] newArray(int size) {
+ return new SelectionsRequest[size];
+ }
+ };
+
+ /**
+ * A builder for selections requests events.
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+
+ private final int mTaskId;
+ private Point mInterestPoint;
+ private Bundle mExtras;
+
+ public Builder(int taskId) {
+ mTaskId = taskId;
+ }
+
+ /**
+ * Sets the request extras.
+ */
+ public Builder setExtras(@NonNull Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Sets the request interest point.
+ */
+ public Builder setInterestPoint(@NonNull Point interestPoint) {
+ mInterestPoint = interestPoint;
+ return this;
+ }
+
+ /**
+ * Builds a new request instance.
+ */
+ public SelectionsRequest build() {
+ return new SelectionsRequest(mTaskId, mInterestPoint, mExtras);
+ }
+ }
+}
diff --git a/core/java/android/app/prediction/AppPredictionContext.aidl b/core/java/android/app/prediction/AppPredictionContext.aidl
new file mode 100644
index 000000000000..5767bf4dbc9a
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictionContext.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+parcelable AppPredictionContext;
diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java
new file mode 100644
index 000000000000..87ccb660e5bd
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictionContext.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * TODO(b/111701043): Add java docs
+ *
+ * @hide
+ */
+@SystemApi
+public final class AppPredictionContext implements Parcelable {
+
+ private final int mPredictedTargetCount;
+ @NonNull
+ private final String mUiSurface;
+ @NonNull
+ private final String mPackageName;
+ @Nullable
+ private final Bundle mExtras;
+
+ private AppPredictionContext(@NonNull String uiSurface, int numPredictedTargets,
+ @NonNull String packageName, @Nullable Bundle extras) {
+ mUiSurface = uiSurface;
+ mPredictedTargetCount = numPredictedTargets;
+ mPackageName = packageName;
+ mExtras = extras;
+ }
+
+ private AppPredictionContext(Parcel parcel) {
+ mUiSurface = parcel.readString();
+ mPredictedTargetCount = parcel.readInt();
+ mPackageName = parcel.readString();
+ mExtras = parcel.readBundle();
+ }
+
+ public String getUiSurface() {
+ return mUiSurface;
+ }
+
+ public int getPredictedTargetCount() {
+ return mPredictedTargetCount;
+ }
+
+ @NonNull
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ @Nullable
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mUiSurface);
+ dest.writeInt(mPredictedTargetCount);
+ dest.writeString(mPackageName);
+ dest.writeBundle(mExtras);
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ public static final Parcelable.Creator<AppPredictionContext> CREATOR =
+ new Parcelable.Creator<AppPredictionContext>() {
+ public AppPredictionContext createFromParcel(Parcel parcel) {
+ return new AppPredictionContext(parcel);
+ }
+
+ public AppPredictionContext[] newArray(int size) {
+ return new AppPredictionContext[size];
+ }
+ };
+
+ /**
+ * A builder for app prediction contexts.
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+
+ @NonNull
+ private final String mPackageName;
+
+ private int mPredictedTargetCount;
+ @Nullable
+ private String mUiSurface;
+ @Nullable
+ private Bundle mExtras;
+
+ /**
+ * @hide
+ */
+ public Builder(@NonNull Context context) {
+ mPackageName = context.getPackageName();
+ }
+
+
+ /**
+ * Sets the number of prediction targets as a hint.
+ */
+ public Builder setPredictedTargetCount(int predictedTargetCount) {
+ mPredictedTargetCount = predictedTargetCount;
+ return this;
+ }
+
+ /**
+ * Sets the UI surface.
+ */
+ public Builder setUiSurface(@Nullable String uiSurface) {
+ mUiSurface = uiSurface;
+ return this;
+ }
+
+ /**
+ * Sets the extras.
+ */
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Builds a new context instance.
+ */
+ public AppPredictionContext build() {
+ return new AppPredictionContext(mUiSurface, mPredictedTargetCount, mPackageName,
+ mExtras);
+ }
+ }
+}
diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java
new file mode 100644
index 000000000000..f8578d4533ef
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictionManager.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.content.Context;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * TODO (b/111701043) : Add java doc
+ * @hide
+ */
+@SystemApi
+public final class AppPredictionManager {
+
+ private final Context mContext;
+
+ /**
+ * @hide
+ */
+ public AppPredictionManager(Context context) {
+ mContext = Preconditions.checkNotNull(context);
+ }
+
+ /**
+ * Creates a new app prediction session.
+ */
+ public AppPredictor createAppPredictionSession(
+ @NonNull AppPredictionContext predictionContext) {
+ return new AppPredictor(mContext, predictionContext);
+ }
+}
diff --git a/core/java/android/app/prediction/AppPredictionSessionId.aidl b/core/java/android/app/prediction/AppPredictionSessionId.aidl
new file mode 100644
index 000000000000..e8295261ae2a
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictionSessionId.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+parcelable AppPredictionSessionId;
diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java
new file mode 100644
index 000000000000..1d7308ec2404
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictionSessionId.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * TODO (b/111701043) : Add java doc
+ *
+ * @hide
+ */
+@SystemApi
+public final class AppPredictionSessionId implements Parcelable {
+
+ private final String mId;
+
+ /**
+ * @hide
+ */
+ public AppPredictionSessionId(@NonNull String id) {
+ mId = id;
+ }
+
+ private AppPredictionSessionId(Parcel p) {
+ mId = p.readString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+ AppPredictionSessionId other = (AppPredictionSessionId) o;
+ return mId.equals(other.mId);
+ }
+
+ @Override
+ public @NonNull String toString() {
+ return mId;
+ }
+
+ @Override
+ public int hashCode() {
+ // Ensure that the id has a consistent hash
+ return mId.hashCode();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mId);
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ public static final Parcelable.Creator<AppPredictionSessionId> CREATOR =
+ new Parcelable.Creator<AppPredictionSessionId>() {
+ public AppPredictionSessionId createFromParcel(Parcel parcel) {
+ return new AppPredictionSessionId(parcel);
+ }
+
+ public AppPredictionSessionId[] newArray(int size) {
+ return new AppPredictionSessionId[size];
+ }
+ };
+}
diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java
new file mode 100644
index 000000000000..2ddbd08c7477
--- /dev/null
+++ b/core/java/android/app/prediction/AppPredictor.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.prediction.IPredictionCallback.Stub;
+import android.content.Context;
+import android.content.pm.ParceledListSlice;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import dalvik.system.CloseGuard;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+
+/**
+ * TODO (b/111701043) : Add java doc
+ *
+ * <p>
+ * Usage: <pre> {@code
+ *
+ * class MyActivity {
+ * private AppPredictor mClient
+ *
+ * void onCreate() {
+ * mClient = new AppPredictor(...)
+ * }
+ *
+ * void onStart() {
+ * mClient.requestPredictionUpdate();
+ * }
+ *
+ * void onDestroy() {
+ * mClient.close();
+ * }
+ *
+ * }</pre>
+ *
+ * @hide
+ */
+@SystemApi
+public final class AppPredictor {
+
+ private static final String TAG = AppPredictor.class.getSimpleName();
+
+
+ private final IPredictionManager mPredictionManager;
+ private final CloseGuard mCloseGuard = CloseGuard.get();
+ private final AtomicBoolean mIsClosed = new AtomicBoolean(false);
+
+ private final AppPredictionSessionId mSessionId;
+ private final ArrayMap<Callback, CallbackWrapper> mRegisteredCallbacks = new ArrayMap<>();
+
+ /**
+ * Creates a new Prediction client.
+ * <p>
+ * The caller should call {@link AppPredictor#destroy()} to dispose the client once it
+ * no longer used.
+ *
+ * @param predictionContext The prediction context
+ */
+ AppPredictor(@NonNull Context context, @NonNull AppPredictionContext predictionContext) {
+ IBinder b = ServiceManager.getService(Context.APP_PREDICTION_SERVICE);
+ mPredictionManager = IPredictionManager.Stub.asInterface(b);
+ mSessionId = new AppPredictionSessionId(
+ context.getPackageName() + ":" + UUID.randomUUID().toString());
+ try {
+ mPredictionManager.createPredictionSession(predictionContext, mSessionId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to create predictor", e);
+ return;
+ }
+
+ mCloseGuard.open("close");
+ }
+
+ /**
+ * Notifies the prediction service of an app target event.
+ */
+ public void notifyAppTargetEvent(@NonNull AppTargetEvent event) {
+ try {
+ mPredictionManager.notifyAppTargetEvent(mSessionId, event);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to notify app target event", e);
+ }
+ }
+
+ /**
+ * Notifies the prediction service when the targets in a launch location are shown to the user.
+ */
+ public void notifyLocationShown(@NonNull String launchLocation,
+ @NonNull List<AppTargetId> targetIds) {
+ try {
+ mPredictionManager.notifyLocationShown(mSessionId, launchLocation,
+ new ParceledListSlice<>(targetIds));
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to notify location shown event", e);
+ }
+ }
+
+ /**
+ * Requests the prediction service provide continuous updates of App predictions via the
+ * provided callback, until the given callback is unregistered.
+ *
+ * @see Callback#onTargetsAvailable(List)
+ */
+ public void registerPredictionUpdates(@NonNull @CallbackExecutor Executor callbackExecutor,
+ @NonNull AppPredictor.Callback callback) {
+ if (mRegisteredCallbacks.containsKey(callback)) {
+ // Skip if this callback is already registered
+ return;
+ }
+ try {
+ final CallbackWrapper callbackWrapper = new CallbackWrapper(callbackExecutor,
+ callback::onTargetsAvailable);
+ mPredictionManager.registerPredictionUpdates(mSessionId, callbackWrapper);
+ mRegisteredCallbacks.put(callback, callbackWrapper);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to register for prediction updates", e);
+ }
+ }
+
+ /**
+ * Requests the prediction service to stop providing continuous updates to the provided
+ * callback until the callback is re-registered.
+ */
+ public void unregisterPredictionUpdates(@NonNull AppPredictor.Callback callback) {
+ if (!mRegisteredCallbacks.containsKey(callback)) {
+ // Skip if this callback was never registered
+ return;
+ }
+ try {
+ final CallbackWrapper callbackWrapper = mRegisteredCallbacks.remove(callback);
+ mPredictionManager.unregisterPredictionUpdates(mSessionId, callbackWrapper);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to unregister for prediction updates", e);
+ }
+ }
+
+ /**
+ * Requests the prediction service to dispatch a new set of App predictions via the provided
+ * callback.
+ *
+ * @see Callback#onTargetsAvailable(List)
+ */
+ public void requestPredictionUpdate() {
+ try {
+ mPredictionManager.requestPredictionUpdate(mSessionId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to request prediction update", e);
+ }
+ }
+
+ /**
+ * Returns a new list of AppTargets sorted based on prediction rank or {@code null} if the
+ * ranker is not available.
+ */
+ @Nullable
+ public void sortTargets(@NonNull List<AppTarget> targets,
+ @NonNull Executor callbackExecutor, @NonNull Consumer<List<AppTarget>> callback) {
+ try {
+ mPredictionManager.sortAppTargets(mSessionId, new ParceledListSlice(targets),
+ new CallbackWrapper(callbackExecutor, callback));
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to sort targets", e);
+ }
+ }
+
+ /**
+ * Destroys the client and unregisters the callback. Any method on this class after this call
+ * with throw {@link IllegalStateException}.
+ *
+ * TODO(b/111701043): Add state check in other methods.
+ */
+ public void destroy() {
+ if (!mIsClosed.getAndSet(true)) {
+ mCloseGuard.close();
+
+ // Do destroy;
+ try {
+ mPredictionManager.onDestroyPredictionSession(mSessionId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to notify app target event", e);
+ }
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mCloseGuard != null) {
+ mCloseGuard.warnIfOpen();
+ }
+ destroy();
+ } finally {
+ super.finalize();
+ }
+ }
+
+ /**
+ * Callback for receiving prediction updates.
+ */
+ public interface Callback {
+
+ /**
+ * Called when a new set of predicted app targets are available.
+ * @param targets Sorted list of predicted targets
+ */
+ void onTargetsAvailable(@NonNull List<AppTarget> targets);
+ }
+
+ static class CallbackWrapper extends Stub {
+
+ private final Consumer<List<AppTarget>> mCallback;
+ private final Executor mExecutor;
+
+ CallbackWrapper(@NonNull Executor callbackExecutor,
+ @NonNull Consumer<List<AppTarget>> callback) {
+ mCallback = callback;
+ mExecutor = callbackExecutor;
+ }
+
+ @Override
+ public void onResult(ParceledListSlice result) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.accept(result.getList()));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+}
diff --git a/core/java/android/app/prediction/AppTarget.aidl b/core/java/android/app/prediction/AppTarget.aidl
new file mode 100644
index 000000000000..e4e2bc2aaaf5
--- /dev/null
+++ b/core/java/android/app/prediction/AppTarget.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+parcelable AppTarget;
diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java
new file mode 100644
index 000000000000..99c1c44866fe
--- /dev/null
+++ b/core/java/android/app/prediction/AppTarget.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.content.pm.ShortcutInfo;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.UserHandle;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A representation of a launchable target.
+ * @hide
+ */
+@SystemApi
+public final class AppTarget implements Parcelable {
+
+ private final AppTargetId mId;
+ private final String mPackageName;
+ private final String mClassName;
+ private final UserHandle mUser;
+
+ private final ShortcutInfo mShortcutInfo;
+
+ private int mRank;
+
+ /**
+ * @hide
+ */
+ public AppTarget(@NonNull AppTargetId id, @NonNull String packageName,
+ @Nullable String className, @NonNull UserHandle user) {
+ mId = id;
+ mShortcutInfo = null;
+
+ mPackageName = Preconditions.checkNotNull(packageName);
+ mClassName = className;
+ mUser = Preconditions.checkNotNull(user);
+ }
+
+ /**
+ * @hide
+ */
+ public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo) {
+ mId = id;
+ mShortcutInfo = Preconditions.checkNotNull(shortcutInfo);
+
+ mPackageName = mShortcutInfo.getPackage();
+ mUser = mShortcutInfo.getUserHandle();
+ mClassName = null;
+ }
+
+ private AppTarget(Parcel parcel) {
+ mId = parcel.readTypedObject(AppTargetId.CREATOR);
+ mShortcutInfo = parcel.readTypedObject(ShortcutInfo.CREATOR);
+ if (mShortcutInfo == null) {
+ mPackageName = parcel.readString();
+ mClassName = parcel.readString();
+ mUser = UserHandle.of(parcel.readInt());
+ } else {
+ mPackageName = mShortcutInfo.getPackage();
+ mUser = mShortcutInfo.getUserHandle();
+ mClassName = null;
+ }
+ mRank = parcel.readInt();
+ }
+
+ /**
+ * Returns the target id.
+ */
+ @NonNull
+ public AppTargetId getId() {
+ return mId;
+ }
+
+ /**
+ * Returns the class name for the app target.
+ */
+ @Nullable
+ public String getClassName() {
+ return mClassName;
+ }
+
+ /**
+ * Returns the package name for the app target.
+ */
+ @NonNull
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Returns the user for the app target.
+ */
+ @NonNull
+ public UserHandle getUser() {
+ return mUser;
+ }
+
+ /**
+ * Returns the shortcut info for the target.
+ */
+ @Nullable
+ public ShortcutInfo getShortcutInfo() {
+ return mShortcutInfo;
+ }
+
+ /**
+ * Sets the rank of the for the target.
+ * @hide
+ */
+ public void setRank(int rank) {
+ mRank = rank;
+ }
+
+ public int getRank() {
+ return mRank;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeTypedObject(mId, flags);
+ dest.writeTypedObject(mShortcutInfo, flags);
+ if (mShortcutInfo == null) {
+ dest.writeString(mPackageName);
+ dest.writeString(mClassName);
+ dest.writeInt(mUser.getIdentifier());
+ }
+ dest.writeInt(mRank);
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ public static final Parcelable.Creator<AppTarget> CREATOR =
+ new Parcelable.Creator<AppTarget>() {
+ public AppTarget createFromParcel(Parcel parcel) {
+ return new AppTarget(parcel);
+ }
+
+ public AppTarget[] newArray(int size) {
+ return new AppTarget[size];
+ }
+ };
+}
diff --git a/core/java/android/app/prediction/AppTargetEvent.aidl b/core/java/android/app/prediction/AppTargetEvent.aidl
new file mode 100644
index 000000000000..ebed2dadbee6
--- /dev/null
+++ b/core/java/android/app/prediction/AppTargetEvent.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+parcelable AppTargetEvent;
diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java
new file mode 100644
index 000000000000..18317e1bf99d
--- /dev/null
+++ b/core/java/android/app/prediction/AppTargetEvent.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A representation of an app target event.
+ * @hide
+ */
+@SystemApi
+public final class AppTargetEvent implements Parcelable {
+
+ /**
+ * @hide
+ */
+ @IntDef({ACTION_LAUNCH, ACTION_DISMISS, ACTION_PIN})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ActionType {}
+
+ /**
+ * Event type constant indicating an app target has been launched.
+ */
+ public static final int ACTION_LAUNCH = 1;
+
+ /**
+ * Event type constant indicating an app target has been dismissed.
+ */
+ public static final int ACTION_DISMISS = 2;
+
+ /**
+ * Event type constant indicating an app target has been pinned.
+ */
+ public static final int ACTION_PIN = 3;
+
+ private final AppTarget mTarget;
+ private final String mLocation;
+ private final int mAction;
+
+ private AppTargetEvent(@Nullable AppTarget target, @Nullable String location,
+ @ActionType int actionType) {
+ mTarget = target;
+ mLocation = location;
+ mAction = actionType;
+ }
+
+ private AppTargetEvent(Parcel parcel) {
+ mTarget = parcel.readParcelable(null);
+ mLocation = parcel.readString();
+ mAction = parcel.readInt();
+ }
+
+ /**
+ * Returns the app target.
+ */
+ @Nullable
+ public AppTarget getTarget() {
+ return mTarget;
+ }
+
+ /**
+ * Returns the launch location.
+ */
+ @NonNull
+ public String getLaunchLocation() {
+ return mLocation;
+ }
+
+ /**
+ * Returns the action type.
+ */
+ @NonNull
+ public int getAction() {
+ return mAction;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(mTarget, 0);
+ dest.writeString(mLocation);
+ dest.writeInt(mAction);
+ }
+
+ /**
+ * @see Creator
+ */
+ public static final Creator<AppTargetEvent> CREATOR =
+ new Creator<AppTargetEvent>() {
+ public AppTargetEvent createFromParcel(Parcel parcel) {
+ return new AppTargetEvent(parcel);
+ }
+
+ public AppTargetEvent[] newArray(int size) {
+ return new AppTargetEvent[size];
+ }
+ };
+
+ /**
+ * A builder for app target events.
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+ private AppTarget mTarget;
+ private String mLocation;
+ private @ActionType int mAction;
+
+ public Builder(@Nullable AppTarget target, @ActionType int actionType) {
+ mTarget = target;
+ mAction = actionType;
+ }
+
+ /**
+ * Sets the launch location.
+ */
+ public Builder setLaunchLocation(String location) {
+ mLocation = location;
+ return this;
+ }
+
+ /**
+ * Builds a new event instance.
+ */
+ public AppTargetEvent build() {
+ return new AppTargetEvent(mTarget, mLocation, mAction);
+ }
+ }
+}
diff --git a/core/java/android/app/prediction/AppTargetId.aidl b/core/java/android/app/prediction/AppTargetId.aidl
new file mode 100644
index 000000000000..bf69eeaca691
--- /dev/null
+++ b/core/java/android/app/prediction/AppTargetId.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+parcelable AppTargetId;
diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java
new file mode 100644
index 000000000000..0b8fb47377d2
--- /dev/null
+++ b/core/java/android/app/prediction/AppTargetId.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.prediction;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The id for a prediction target.
+ * @hide
+ */
+@SystemApi
+public final class AppTargetId implements Parcelable {
+
+ @NonNull
+ private final String mId;
+
+ /**
+ * @hide
+ */
+ public AppTargetId(@NonNull String id) {
+ mId = id;
+ }
+
+ private AppTargetId(Parcel parcel) {
+ mId = parcel.readString();
+ }
+
+ /**
+ * Returns the id.
+ * @hide
+ */
+ @NonNull
+ public String getId() {
+ return mId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+ AppTargetId other = (AppTargetId) o;
+ return mId.equals(other.mId);
+ }
+
+ @Override
+ public int hashCode() {
+ // Ensure that the id has a consistent hash
+ return mId.hashCode();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mId);
+ }
+
+ /**
+ * @see Creator
+ */
+ public static final Creator<AppTargetId> CREATOR =
+ new Creator<AppTargetId>() {
+ public AppTargetId createFromParcel(Parcel parcel) {
+ return new AppTargetId(parcel);
+ }
+
+ public AppTargetId[] newArray(int size) {
+ return new AppTargetId[size];
+ }
+ };
+}
diff --git a/services/core/java/com/android/server/wm/StackWindowListener.java b/core/java/android/app/prediction/IPredictionCallback.aidl
index c763c175687f..f6f241e5560d 100644
--- a/services/core/java/com/android/server/wm/StackWindowListener.java
+++ b/core/java/android/app/prediction/IPredictionCallback.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -11,19 +11,17 @@
* 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
+ * limitations under the License.
*/
-package com.android.server.wm;
+package android.app.prediction;
-import android.graphics.Rect;
+import android.content.pm.ParceledListSlice;
/**
- * Interface used by the creator of {@link StackWindowController} to listen to changes with
- * the stack container.
+ * @hide
*/
-public interface StackWindowListener extends WindowContainerListener {
+oneway interface IPredictionCallback {
- /** Called when the stack container would like its controller to resize. */
- void requestResize(Rect bounds);
+ void onResult(in ParceledListSlice result);
}
diff --git a/core/java/android/app/prediction/IPredictionManager.aidl b/core/java/android/app/prediction/IPredictionManager.aidl
new file mode 100644
index 000000000000..114a1ffb0eb2
--- /dev/null
+++ b/core/java/android/app/prediction/IPredictionManager.aidl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.prediction;
+
+import android.app.prediction.AppTarget;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.IPredictionCallback;
+import android.content.pm.ParceledListSlice;
+
+/**
+ * @hide
+ */
+interface IPredictionManager {
+
+ void createPredictionSession(in AppPredictionContext context,
+ in AppPredictionSessionId sessionId);
+
+ void notifyAppTargetEvent(in AppPredictionSessionId sessionId, in AppTargetEvent event);
+
+ void notifyLocationShown(in AppPredictionSessionId sessionId, in String launchLocation,
+ in ParceledListSlice targetIds);
+
+ void sortAppTargets(in AppPredictionSessionId sessionId, in ParceledListSlice targets,
+ in IPredictionCallback callback);
+
+ void registerPredictionUpdates(in AppPredictionSessionId sessionId,
+ in IPredictionCallback callback);
+
+ void unregisterPredictionUpdates(in AppPredictionSessionId sessionId,
+ in IPredictionCallback callback);
+
+ void requestPredictionUpdate(in AppPredictionSessionId sessionId);
+
+ void onDestroyPredictionSession(in AppPredictionSessionId sessionId);
+}
diff --git a/core/java/android/app/role/IRoleManager.aidl b/core/java/android/app/role/IRoleManager.aidl
index 0c9b41bf8d68..2964fbc0084b 100644
--- a/core/java/android/app/role/IRoleManager.aidl
+++ b/core/java/android/app/role/IRoleManager.aidl
@@ -50,4 +50,6 @@ interface IRoleManager {
boolean removeRoleHolderFromController(in String roleName, in String packageName);
List<String> getHeldRolesFromController(in String packageName);
+
+ String getDefaultSmsPackage(int userId);
}
diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java
index 2d630a61a1c3..a6abe0b30f79 100644
--- a/core/java/android/app/role/RoleManager.java
+++ b/core/java/android/app/role/RoleManager.java
@@ -19,6 +19,7 @@ package android.app.role;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -68,6 +69,8 @@ public final class RoleManager {
/**
* The name of the dialer role.
+ *
+ * @see Intent#ACTION_DIAL
*/
public static final String ROLE_DIALER = "android.app.role.DIALER";
@@ -100,21 +103,80 @@ public final class RoleManager {
public static final String ROLE_MUSIC = "android.app.role.MUSIC";
/**
- * The action used to request user approval of a role for an application.
+ * The name of the home role.
+ *
+ * @see Intent#CATEGORY_HOME
+ */
+ public static final String ROLE_HOME = "android.app.role.HOME";
+
+ /**
+ * The name of the emergency role
+ *
+ * @see android.telephony.TelephonyManager#ACTION_EMERGENCY_ASSISTANCE
+ */
+ public static final String ROLE_EMERGENCY = "android.app.role.EMERGENCY";
+
+ /**
+ * The name of the car mode dialer app role.
+ * <p>
+ * Similar to the {@link #ROLE_DIALER dialer} role, this role determines which app is
+ * responsible for showing the user interface for ongoing calls on the device. It is only used
+ * when the device is in car mode.
+ *
+ * @see #ROLE_DIALER
+ * @see android.app.UiModeManager#ACTION_ENTER_CAR_MODE
+ * @see android.telecom.InCallService
*
+ * TODO: STOPSHIP: Make name of required roles public API
* @hide
*/
- public static final String ACTION_REQUEST_ROLE = "android.app.role.action.REQUEST_ROLE";
+ public static final String ROLE_CAR_MODE_DIALER_APP = "android.app.role.CAR_MODE_DIALER_APP";
/**
- * The name of the requested role.
+ * The name of the proxy calling role.
* <p>
- * <strong>Type:</strong> String
+ * A proxy calling app provides a means to re-write the phone number for an outgoing call to
+ * place the call through a proxy calling service.
+ *
+ * @see android.telecom.CallRedirectionService
*
+ * TODO: STOPSHIP: Make name of required roles public API
* @hide
*/
- @SystemApi
- public static final String EXTRA_REQUEST_ROLE_NAME = "android.app.role.extra.REQUEST_ROLE_NAME";
+ public static final String ROLE_PROXY_CALLING_APP = "android.app.role.PROXY_CALLING_APP";
+
+ /**
+ * The name of the call screening and caller id role.
+ *
+ * @see android.telecom.CallScreeningService
+ *
+ * TODO: STOPSHIP: Make name of required roles public API
+ * @hide
+ */
+ public static final String ROLE_CALL_SCREENING_APP = "android.app.role.CALL_SCREENING_APP";
+
+ /**
+ * The name of the call companion app role.
+ * <p>
+ * A call companion app provides no user interface for calls, but will be bound to by Telecom
+ * when there are active calls on the device. Companion apps for wearable devices are an
+ * acceptable use-case.
+ * <p>
+ * Multiple apps may hold this role at the same time.
+ *
+ * @see android.telecom.InCallService
+ *
+ * TODO: STOPSHIP: Make name of required roles public API
+ * @hide
+ */
+ public static final String ROLE_CALL_COMPANION_APP = "android.app.role.CALL_COMPANION_APP";
+
+ /**
+ * The action used to request user approval of a role for an application.
+ *
+ * @hide
+ */
+ public static final String ACTION_REQUEST_ROLE = "android.app.role.action.REQUEST_ROLE";
/**
* The permission required to manage records of role holders in {@link RoleManager} directly.
@@ -164,7 +226,7 @@ public final class RoleManager {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Intent intent = new Intent(ACTION_REQUEST_ROLE);
intent.setPackage(mContext.getPackageManager().getPermissionControllerPackageName());
- intent.putExtra(EXTRA_REQUEST_ROLE_NAME, roleName);
+ intent.putExtra(Intent.EXTRA_ROLE_NAME, roleName);
return intent;
}
@@ -542,7 +604,6 @@ public final class RoleManager {
}
}
-
/**
* Returns the list of all roles that the given package is currently holding
*
@@ -563,6 +624,22 @@ public final class RoleManager {
}
}
+ /**
+ * Allows getting the role holder for {@link #ROLE_SMS} without
+ * {@link Manifest.permission#OBSERVE_ROLE_HOLDERS}, as required by
+ * {@link android.provider.Telephony.Sms#getDefaultSmsPackage(Context)}
+ *
+ * @hide
+ */
+ @Nullable
+ public String getDefaultSmsPackage(@UserIdInt int userId) {
+ try {
+ return mService.getDefaultSmsPackage(userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private static class RoleManagerCallbackDelegate extends IRoleManagerCallback.Stub {
@NonNull
diff --git a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java
index a2b7d5809c4d..8ee9e5381b86 100644
--- a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java
+++ b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java
@@ -36,6 +36,11 @@ public class ActivityConfigurationChangeItem extends ClientTransactionItem {
private Configuration mConfiguration;
@Override
+ public void preExecute(android.app.ClientTransactionHandler client, IBinder token) {
+ client.updatePendingActivityConfiguration(token, mConfiguration);
+ }
+
+ @Override
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
// TODO(lifecycler): detect if PIP or multi-window mode changed and report it here.
diff --git a/core/java/android/app/usage/EventList.java b/core/java/android/app/usage/EventList.java
index a79ad2fc8607..aaae57e526a0 100644
--- a/core/java/android/app/usage/EventList.java
+++ b/core/java/android/app/usage/EventList.java
@@ -103,21 +103,4 @@ public class EventList {
}
return result;
}
-
- /**
- * Remove events of certain type on or after a timestamp.
- * @param type The type of event to remove.
- * @param timeStamp the timeStamp on or after which to remove the event.
- */
- public void removeOnOrAfter(int type, long timeStamp) {
- for (int i = mEvents.size() - 1; i >= 0; i--) {
- UsageEvents.Event event = mEvents.get(i);
- if (event.mTimeStamp < timeStamp) {
- break;
- }
- if (event.mEventType == type) {
- mEvents.remove(i);
- }
- }
- }
}
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index 4d52263c1d78..bbae7d3463ae 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -55,4 +55,8 @@ interface IUsageStatsManager {
long sessionThresholdTimeMs, in PendingIntent limitReachedCallbackIntent,
in PendingIntent sessionEndCallbackIntent, String callingPackage);
void unregisterUsageSessionObserver(int sessionObserverId, String callingPackage);
+ void reportUsageStart(in IBinder activity, String token, String callingPackage);
+ void reportPastUsageStart(in IBinder activity, String token, long timeAgoMs,
+ String callingPackage);
+ void reportUsageStop(in IBinder activity, String token, String callingPackage);
}
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index d7a53281bc56..2c5fe046faad 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -245,10 +245,18 @@ public final class UsageEvents implements Parcelable {
public static final int FLUSH_TO_DISK = 25;
/**
+ * An event type denoting that the device underwent a shutdown process.
+ * A DEVICE_SHUTDOWN event should be treated as if all started activities and foreground
+ * services are now stopped and no explicit {@link #ACTIVITY_STOPPED} and
+ * {@link #FOREGROUND_SERVICE_STOP} events will be generated for them.
+ */
+ public static final int DEVICE_SHUTDOWN = 26;
+
+ /**
* Keep in sync with the greatest event type value.
* @hide
*/
- public static final int MAX_EVENT_TYPE = 25;
+ public static final int MAX_EVENT_TYPE = 26;
/** @hide */
public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index 308180badbb8..94a2a3eaae7f 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -21,6 +21,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_PAUSED;
import static android.app.usage.UsageEvents.Event.ACTIVITY_RESUMED;
import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED;
import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE;
+import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageEvents.Event.END_OF_DAY;
import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK;
import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START;
@@ -119,12 +120,9 @@ public final class UsageStats implements Parcelable {
public int mLastEvent;
/**
- * If an activity is visible(onStart(), onPause() states) or in foreground (onResume() state),
- * it has one entry in this map. When an activity becomes invisible (onStop() or onDestroy()),
- * it is removed from this map.
* Key is instanceId of the activity (ActivityRecode appToken hashCode)..
- * Value is this activity's last event, one of ACTIVITY_RESUMED or
- * ACTIVITY_PAUSED.
+ * Value is this activity's last event, one of ACTIVITY_RESUMED, ACTIVITY_PAUSED or
+ * ACTIVITY_STOPPED.
* {@hide}
*/
public SparseIntArray mActivities = new SparseIntArray();
@@ -560,6 +558,7 @@ public final class UsageStats implements Parcelable {
mLastTimeForegroundServiceUsed = timeStamp;
mForegroundServices.put(className, eventType);
break;
+ case DEVICE_SHUTDOWN:
case FLUSH_TO_DISK:
// update usage of all active activities/services.
if (hasForegroundActivity()) {
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 26beb45be13f..605deac80994 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -23,6 +23,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
+import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.pm.ParceledListSlice;
@@ -579,15 +580,18 @@ public final class UsageStatsManager {
/**
* @hide
* Register an app usage limit observer that receives a callback on the provided intent when
- * the sum of usages of apps in the packages array exceeds the {@code timeLimit} specified. The
- * observer will automatically be unregistered when the time limit is reached and the intent
- * is delivered. Registering an {@code observerId} that was already registered will override
- * the previous one. No more than 1000 unique {@code observerId} may be registered by a single
- * uid at any one time.
+ * the sum of usages of apps and tokens in the {@code observed} array exceeds the
+ * {@code timeLimit} specified. The structure of a token is a String with the reporting
+ * package's name and a token the reporting app will use, separated by the forward slash
+ * character. Example: com.reporting.package/5OM3*0P4QU3-7OK3N
+ * The observer will automatically be unregistered when the time limit is reached and the
+ * intent is delivered. Registering an {@code observerId} that was already registered will
+ * override the previous one. No more than 1000 unique {@code observerId} may be registered by
+ * a single uid at any one time.
* @param observerId A unique id associated with the group of apps to be monitored. There can
* be multiple groups with common packages and different time limits.
- * @param packages The list of packages to observe for foreground activity time. Cannot be null
- * and must include at least one package.
+ * @param observedEntities The list of packages and token to observe for usage time. Cannot be
+ * null and must include at least one package or token.
* @param timeLimit The total time the set of apps can be in the foreground before the
* callbackIntent is delivered. Must be at least one minute.
* @param timeUnit The unit for time specified in {@code timeLimit}. Cannot be null.
@@ -600,11 +604,11 @@ public final class UsageStatsManager {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
- public void registerAppUsageObserver(int observerId, @NonNull String[] packages, long timeLimit,
- @NonNull TimeUnit timeUnit, @NonNull PendingIntent callbackIntent) {
+ public void registerAppUsageObserver(int observerId, @NonNull String[] observedEntities,
+ long timeLimit, @NonNull TimeUnit timeUnit, @NonNull PendingIntent callbackIntent) {
try {
- mService.registerAppUsageObserver(observerId, packages, timeUnit.toMillis(timeLimit),
- callbackIntent, mContext.getOpPackageName());
+ mService.registerAppUsageObserver(observerId, observedEntities,
+ timeUnit.toMillis(timeLimit), callbackIntent, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -631,18 +635,21 @@ public final class UsageStatsManager {
/**
* Register a usage session observer that receives a callback on the provided {@code
- * limitReachedCallbackIntent} when the sum of usages of apps in the packages array exceeds
- * the {@code timeLimit} specified within a usage session. After the {@code timeLimit} has
- * been reached, the usage session observer will receive a callback on the provided {@code
- * sessionEndCallbackIntent} when the usage session ends. Registering another session
- * observer against a {@code sessionObserverId} that has already been registered will
- * override the previous session observer.
+ * limitReachedCallbackIntent} when the sum of usages of apps and tokens in the {@code
+ * observed} array exceeds the {@code timeLimit} specified within a usage session. The
+ * structure of a token is a String with the reporting packages' name and a token the
+ * reporting app will use, separated by the forward slash character.
+ * Example: com.reporting.package/5OM3*0P4QU3-7OK3N
+ * After the {@code timeLimit} has been reached, the usage session observer will receive a
+ * callback on the provided {@code sessionEndCallbackIntent} when the usage session ends.
+ * Registering another session observer against a {@code sessionObserverId} that has already
+ * been registered will override the previous session observer.
*
* @param sessionObserverId A unique id associated with the group of apps to be
* monitored. There can be multiple groups with common
* packages and different time limits.
- * @param packages The list of packages to observe for foreground activity time. Cannot be null
- * and must include at least one package.
+ * @param observedEntities The list of packages and token to observe for usage time. Cannot be
+ * null and must include at least one package or token.
* @param timeLimit The total time the set of apps can be used continuously before the {@code
* limitReachedCallbackIntent} is delivered. Must be at least one minute.
* @param timeUnit The unit for time specified in {@code timeLimit}. Cannot be null.
@@ -668,13 +675,13 @@ public final class UsageStatsManager {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
- public void registerUsageSessionObserver(int sessionObserverId, @NonNull String[] packages,
- long timeLimit, @NonNull TimeUnit timeUnit, long sessionThresholdTime,
- @NonNull TimeUnit sessionThresholdTimeUnit,
+ public void registerUsageSessionObserver(int sessionObserverId,
+ @NonNull String[] observedEntities, long timeLimit, @NonNull TimeUnit timeUnit,
+ long sessionThresholdTime, @NonNull TimeUnit sessionThresholdTimeUnit,
@NonNull PendingIntent limitReachedCallbackIntent,
@Nullable PendingIntent sessionEndCallbackIntent) {
try {
- mService.registerUsageSessionObserver(sessionObserverId, packages,
+ mService.registerUsageSessionObserver(sessionObserverId, observedEntities,
timeUnit.toMillis(timeLimit),
sessionThresholdTimeUnit.toMillis(sessionThresholdTime),
limitReachedCallbackIntent, sessionEndCallbackIntent,
@@ -704,6 +711,71 @@ public final class UsageStatsManager {
}
}
+ /**
+ * Report usage associated with a particular {@code token} has started. Tokens are app defined
+ * strings used to represent usage of in-app features. Apps with the {@link
+ * android.Manifest.permission#OBSERVE_APP_USAGE} permission can register time limit observers
+ * to monitor the usage of a token. In app usage can only associated with an {@code activity}
+ * and usage will be considered stopped if the activity stops or crashes.
+ * @see #registerAppUsageObserver
+ * @see #registerUsageSessionObserver
+ *
+ * @param activity The activity {@code token} is associated with.
+ * @param token The token to report usage against.
+ * @hide
+ */
+ @SystemApi
+ public void reportUsageStart(@NonNull Activity activity, @NonNull String token) {
+ try {
+ mService.reportUsageStart(activity.getActivityToken(), token,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Report usage associated with a particular {@code token} had started some amount of time in
+ * the past. Tokens are app defined strings used to represent usage of in-app features. Apps
+ * with the {@link android.Manifest.permission#OBSERVE_APP_USAGE} permission can register time
+ * limit observers to monitor the usage of a token. In app usage can only associated with an
+ * {@code activity} and usage will be considered stopped if the activity stops or crashes.
+ * @see #registerAppUsageObserver
+ * @see #registerUsageSessionObserver
+ *
+ * @param activity The activity {@code token} is associated with.
+ * @param token The token to report usage against.
+ * @param timeAgoMs How long ago the start of usage took place
+ * @hide
+ */
+ @SystemApi
+ public void reportUsageStart(@NonNull Activity activity, @NonNull String token,
+ long timeAgoMs) {
+ try {
+ mService.reportPastUsageStart(activity.getActivityToken(), token, timeAgoMs,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Report the usage associated with a particular {@code token} has stopped.
+ *
+ * @param activity The activity {@code token} is associated with.
+ * @param token The token to report usage against.
+ * @hide
+ */
+ @SystemApi
+ public void reportUsageStop(@NonNull Activity activity, @NonNull String token) {
+ try {
+ mService.reportUsageStop(activity.getActivityToken(), token,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public static String reasonToString(int standbyReason) {
StringBuilder sb = new StringBuilder();
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 2edad350e18e..cc3ab0025864 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -98,6 +98,12 @@ public abstract class UsageStatsManagerInternal {
public abstract void prepareShutdown();
/**
+ * When the device power button is long pressed for 3.5 seconds, prepareForPossibleShutdown()
+ * is called.
+ */
+ public abstract void prepareForPossibleShutdown();
+
+ /**
* Returns true if the app has not been used for a certain amount of time. How much time?
* Could be hours, could be days, who knows?
*
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index c740c42c9c0d..3e9dd2882600 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -375,12 +375,12 @@ public class AppWidgetHostView extends FrameLayout {
}
/**
- * Sets whether the widget should is being displayed on a light/white background and use an
+ * Sets whether the widget is being displayed on a light/white background and use an
* alternate UI if available.
* @see RemoteViews#setLightBackgroundLayoutId(int)
*/
- public void setOnLightBackground(boolean useDarkTextLayout) {
- mOnLightBackground = useDarkTextLayout;
+ public void setOnLightBackground(boolean onLightBackground) {
+ mOnLightBackground = onLightBackground;
}
/**
diff --git a/core/java/android/attention/AttentionManagerInternal.java b/core/java/android/attention/AttentionManagerInternal.java
new file mode 100644
index 000000000000..6b7f10e8d426
--- /dev/null
+++ b/core/java/android/attention/AttentionManagerInternal.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.attention;
+
+/**
+ * Attention manager local system server interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class AttentionManagerInternal {
+ /**
+ * Returns {@code true} if attention service is supported on this device.
+ */
+ public abstract boolean isAttentionServiceSupported();
+
+ /**
+ * Checks whether user attention is at the screen and calls in the provided callback.
+ *
+ * @param requestCode a code associated with the attention check request; this code would be
+ * used to call back in {@link AttentionCallbackInternal#onSuccess} and
+ * {@link AttentionCallbackInternal#onFailure}
+ * @param timeoutMillis a budget for the attention check; if it takes longer - {@link
+ * AttentionCallbackInternal#onFailure} would be called with the {@link
+ * android.service.attention.AttentionService#ATTENTION_FAILURE_TIMED_OUT}
+ * code
+ * @param callback a callback for when the attention check has completed
+ * @return {@code true} if the attention check should succeed; {@false} otherwise.
+ */
+ public abstract boolean checkAttention(int requestCode,
+ long timeoutMillis, AttentionCallbackInternal callback);
+
+ /**
+ * Cancels the specified attention check in case it's no longer needed.
+ *
+ * @param requestCode a code provided during {@link #checkAttention}
+ */
+ public abstract void cancelAttentionCheck(int requestCode);
+
+ /** Internal interface for attention callback. */
+ public abstract static class AttentionCallbackInternal {
+ /**
+ * Provides the result of the attention check, if the check was successful.
+ *
+ * @param requestCode a code provided in {@link #checkAttention}
+ * @param result an int with the result of the check
+ * @param timestamp a {@code SystemClock.uptimeMillis()} timestamp associated with the
+ * attention check
+ */
+ public abstract void onSuccess(int requestCode, int result, long timestamp);
+
+ /**
+ * Provides the explanation for why the attention check had failed.
+ *
+ * @param requestCode a code provided in {@link #checkAttention}
+ * @param error an int with the reason for failure
+ */
+ public abstract void onFailure(int requestCode, int error);
+ }
+}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index eaa0bcfc0754..d94b188fbebe 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -2074,8 +2074,7 @@ public final class BluetoothAdapter {
* Get the current connection state of a profile.
* This function can be used to check whether the local Bluetooth adapter
* is connected to any remote device for a specific profile.
- * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET},
- * {@link BluetoothProfile#A2DP}.
+ * Profile can be one of {@link BluetoothProfile#HEADSET}, {@link BluetoothProfile#A2DP}.
*
* <p> Return value can be one of
* {@link BluetoothProfile#STATE_DISCONNECTED},
@@ -2451,16 +2450,15 @@ public final class BluetoothAdapter {
/**
* Get the profile proxy object associated with the profile.
*
- * <p>Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET},
- * {@link BluetoothProfile#A2DP}, {@link BluetoothProfile#GATT}, or
- * {@link BluetoothProfile#GATT_SERVER}. Clients must implement
- * {@link BluetoothProfile.ServiceListener} to get notified of
- * the connection status and to get the proxy object.
+ * <p>Profile can be one of {@link BluetoothProfile#HEADSET}, {@link BluetoothProfile#A2DP},
+ * {@link BluetoothProfile#GATT}, or {@link BluetoothProfile#GATT_SERVER}. Clients must
+ * implement {@link BluetoothProfile.ServiceListener} to get notified of the connection status
+ * and to get the proxy object.
*
* @param context Context of the application
* @param listener The service Listener for connection callbacks.
- * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEALTH}, {@link
- * BluetoothProfile#HEADSET}, {@link BluetoothProfile#A2DP}. {@link BluetoothProfile#GATT} or
+ * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEADSET},
+ * {@link BluetoothProfile#A2DP}. {@link BluetoothProfile#GATT} or
* {@link BluetoothProfile#GATT_SERVER}.
* @return true on success, false on error
*/
@@ -2492,8 +2490,8 @@ public final class BluetoothAdapter {
BluetoothDun dun = new BluetoothDun(context, listener);
return true;
} else if (profile == BluetoothProfile.HEALTH) {
- BluetoothHealth health = new BluetoothHealth(context, listener);
- return true;
+ Log.e(TAG, "getProfileProxy(): BluetoothHealth is deprecated");
+ return false;
} else if (profile == BluetoothProfile.MAP) {
BluetoothMap map = new BluetoothMap(context, listener);
return true;
@@ -2528,8 +2526,7 @@ public final class BluetoothAdapter {
*
* <p> Clients should call this when they are no longer using
* the proxy obtained from {@link #getProfileProxy}.
- * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET} or
- * {@link BluetoothProfile#A2DP}
+ * Profile can be one of {@link BluetoothProfile#HEADSET} or {@link BluetoothProfile#A2DP}
*
* @param profile
* @param proxy Profile proxy object
@@ -2568,10 +2565,6 @@ public final class BluetoothAdapter {
BluetoothDun dun = (BluetoothDun)proxy;
dun.close();
break;
- case BluetoothProfile.HEALTH:
- BluetoothHealth health = (BluetoothHealth) proxy;
- health.close();
- break;
case BluetoothProfile.GATT:
BluetoothGatt gatt = (BluetoothGatt) proxy;
gatt.close();
diff --git a/core/java/android/bluetooth/BluetoothCodecConfig.java b/core/java/android/bluetooth/BluetoothCodecConfig.java
index 579ebf0a69f3..5a8270e45092 100644
--- a/core/java/android/bluetooth/BluetoothCodecConfig.java
+++ b/core/java/android/bluetooth/BluetoothCodecConfig.java
@@ -116,6 +116,19 @@ public final class BluetoothCodecConfig implements Parcelable {
mCodecSpecific4 = codecSpecific4;
}
+ @UnsupportedAppUsage
+ public BluetoothCodecConfig(int codecType) {
+ mCodecType = codecType;
+ mCodecPriority = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT;
+ mSampleRate = BluetoothCodecConfig.SAMPLE_RATE_NONE;
+ mBitsPerSample = BluetoothCodecConfig.BITS_PER_SAMPLE_NONE;
+ mChannelMode = BluetoothCodecConfig.CHANNEL_MODE_NONE;
+ mCodecSpecific1 = 0;
+ mCodecSpecific2 = 0;
+ mCodecSpecific3 = 0;
+ mCodecSpecific4 = 0;
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof BluetoothCodecConfig) {
diff --git a/core/java/android/bluetooth/BluetoothHealth.java b/core/java/android/bluetooth/BluetoothHealth.java
index 22d41d9c896e..e2e56fd02ab7 100644
--- a/core/java/android/bluetooth/BluetoothHealth.java
+++ b/core/java/android/bluetooth/BluetoothHealth.java
@@ -16,15 +16,7 @@
package android.bluetooth;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Binder;
-import android.os.IBinder;
import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.Log;
import java.util.ArrayList;
@@ -54,79 +46,59 @@ import java.util.List;
* <li> When done, close the health channel by calling {@link #disconnectChannel}
* and unregister the application configuration calling
* {@link #unregisterAppConfiguration}
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps
+ * should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+@Deprecated
public final class BluetoothHealth implements BluetoothProfile {
private static final String TAG = "BluetoothHealth";
- private static final boolean DBG = true;
- private static final boolean VDBG = false;
-
/**
* Health Profile Source Role - the health device.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public static final int SOURCE_ROLE = 1 << 0;
/**
* Health Profile Sink Role the device talking to the health device.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public static final int SINK_ROLE = 1 << 1;
/**
* Health Profile - Channel Type used - Reliable
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public static final int CHANNEL_TYPE_RELIABLE = 10;
/**
* Health Profile - Channel Type used - Streaming
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public static final int CHANNEL_TYPE_STREAMING = 11;
- /**
- * @hide
- */
- public static final int CHANNEL_TYPE_ANY = 12;
-
- /** @hide */
- public static final int HEALTH_OPERATION_SUCCESS = 6000;
- /** @hide */
- public static final int HEALTH_OPERATION_ERROR = 6001;
- /** @hide */
- public static final int HEALTH_OPERATION_INVALID_ARGS = 6002;
- /** @hide */
- public static final int HEALTH_OPERATION_GENERIC_FAILURE = 6003;
- /** @hide */
- public static final int HEALTH_OPERATION_NOT_FOUND = 6004;
- /** @hide */
- public static final int HEALTH_OPERATION_NOT_ALLOWED = 6005;
-
- private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
- new IBluetoothStateChangeCallback.Stub() {
- public void onBluetoothStateChange(boolean up) {
- if (DBG) Log.d(TAG, "onBluetoothStateChange: up=" + up);
- if (!up) {
- if (VDBG) Log.d(TAG, "Unbinding service...");
- synchronized (mConnection) {
- try {
- mService = null;
- mContext.unbindService(mConnection);
- } catch (Exception re) {
- Log.e(TAG, "", re);
- }
- }
- } else {
- synchronized (mConnection) {
- try {
- if (mService == null) {
- if (VDBG) Log.d(TAG, "Binding service...");
- doBind();
- }
- } catch (Exception re) {
- Log.e(TAG, "", re);
- }
- }
- }
- }
- };
-
/**
* Register an application configuration that acts as a Health SINK.
@@ -142,53 +114,17 @@ public final class BluetoothHealth implements BluetoothProfile {
* @param callback A callback to indicate success or failure of the registration and all
* operations done on this application configuration.
* @return If true, callback will be called.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public boolean registerSinkAppConfiguration(String name, int dataType,
BluetoothHealthCallback callback) {
- if (!isEnabled() || name == null) return false;
-
- if (VDBG) log("registerSinkApplication(" + name + ":" + dataType + ")");
- return registerAppConfiguration(name, dataType, SINK_ROLE,
- CHANNEL_TYPE_ANY, callback);
- }
-
- /**
- * Register an application configuration that acts as a Health SINK or in a Health
- * SOURCE role.This is an asynchronous call and so
- * the callback is used to notify success or failure if the function returns true.
- *
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
- *
- * @param name The friendly name associated with the application or configuration.
- * @param dataType The dataType of the Source role of Health Profile.
- * @param channelType The channel type. Will be one of {@link #CHANNEL_TYPE_RELIABLE} or {@link
- * #CHANNEL_TYPE_STREAMING}
- * @param callback - A callback to indicate success or failure.
- * @return If true, callback will be called.
- * @hide
- */
- public boolean registerAppConfiguration(String name, int dataType, int role,
- int channelType, BluetoothHealthCallback callback) {
- boolean result = false;
- if (!isEnabled() || !checkAppParam(name, role, channelType, callback)) return result;
-
- if (VDBG) log("registerApplication(" + name + ":" + dataType + ")");
- BluetoothHealthCallbackWrapper wrapper = new BluetoothHealthCallbackWrapper(callback);
- BluetoothHealthAppConfiguration config =
- new BluetoothHealthAppConfiguration(name, dataType, role, channelType);
-
- final IBluetoothHealth service = mService;
- if (service != null) {
- try {
- result = service.registerAppConfiguration(config, wrapper);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
- return result;
+ Log.e(TAG, "registerSinkAppConfiguration(): BluetoothHealth is deprecated");
+ return false;
}
/**
@@ -199,22 +135,16 @@ public final class BluetoothHealth implements BluetoothProfile {
*
* @param config The health app configuration
* @return Success or failure.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public boolean unregisterAppConfiguration(BluetoothHealthAppConfiguration config) {
- boolean result = false;
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && config != null) {
- try {
- result = service.unregisterAppConfiguration(config);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
-
- return result;
+ Log.e(TAG, "unregisterAppConfiguration(): BluetoothHealth is deprecated");
+ return false;
}
/**
@@ -228,49 +158,16 @@ public final class BluetoothHealth implements BluetoothProfile {
* @param config The application configuration which has been registered using {@link
* #registerSinkAppConfiguration(String, int, BluetoothHealthCallback) }
* @return If true, the callback associated with the application config will be called.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public boolean connectChannelToSource(BluetoothDevice device,
BluetoothHealthAppConfiguration config) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && isValidDevice(device) && config != null) {
- try {
- return service.connectChannelToSource(device, config);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
- return false;
- }
-
- /**
- * Connect to a health device which has the {@link #SINK_ROLE}.
- * This is an asynchronous call. If this function returns true, the callback
- * associated with the application configuration will be called.
- *
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
- *
- * @param device The remote Bluetooth device.
- * @param config The application configuration which has been registered using {@link
- * #registerSinkAppConfiguration(String, int, BluetoothHealthCallback) }
- * @return If true, the callback associated with the application config will be called.
- * @hide
- */
- public boolean connectChannelToSink(BluetoothDevice device,
- BluetoothHealthAppConfiguration config, int channelType) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && isValidDevice(device) && config != null) {
- try {
- return service.connectChannelToSink(device, config, channelType);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
+ Log.e(TAG, "connectChannelToSource(): BluetoothHealth is deprecated");
return false;
}
@@ -286,20 +183,16 @@ public final class BluetoothHealth implements BluetoothProfile {
* #registerSinkAppConfiguration(String, int, BluetoothHealthCallback) }
* @param channelId The channel id associated with the channel
* @return If true, the callback associated with the application config will be called.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public boolean disconnectChannel(BluetoothDevice device,
BluetoothHealthAppConfiguration config, int channelId) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && isValidDevice(device) && config != null) {
- try {
- return service.disconnectChannel(device, config, channelId);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
+ Log.e(TAG, "disconnectChannel(): BluetoothHealth is deprecated");
return false;
}
@@ -315,20 +208,16 @@ public final class BluetoothHealth implements BluetoothProfile {
* @param device The remote Bluetooth health device
* @param config The application configuration
* @return null on failure, ParcelFileDescriptor on success.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public ParcelFileDescriptor getMainChannelFd(BluetoothDevice device,
BluetoothHealthAppConfiguration config) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && isValidDevice(device) && config != null) {
- try {
- return service.getMainChannelFd(device, config);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
+ Log.e(TAG, "getMainChannelFd(): BluetoothHealth is deprecated");
return null;
}
@@ -348,17 +237,7 @@ public final class BluetoothHealth implements BluetoothProfile {
*/
@Override
public int getConnectionState(BluetoothDevice device) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled() && isValidDevice(device)) {
- try {
- return service.getHealthDeviceConnectionState(device);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
- }
+ Log.e(TAG, "getConnectionState(): BluetoothHealth is deprecated");
return STATE_DISCONNECTED;
}
@@ -378,17 +257,8 @@ public final class BluetoothHealth implements BluetoothProfile {
*/
@Override
public List<BluetoothDevice> getConnectedDevices() {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled()) {
- try {
- return service.getConnectedHealthDevices();
- } catch (RemoteException e) {
- Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
- return new ArrayList<BluetoothDevice>();
- }
- }
- if (service == null) Log.w(TAG, "Proxy not attached to service");
- return new ArrayList<BluetoothDevice>();
+ Log.e(TAG, "getConnectedDevices(): BluetoothHealth is deprecated");
+ return new ArrayList<>();
}
/**
@@ -410,163 +280,81 @@ public final class BluetoothHealth implements BluetoothProfile {
*/
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
- final IBluetoothHealth service = mService;
- if (service != null && isEnabled()) {
- try {
- return service.getHealthDevicesMatchingConnectionStates(states);
- } catch (RemoteException e) {
- Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
- return new ArrayList<BluetoothDevice>();
- }
- }
- if (service == null) Log.w(TAG, "Proxy not attached to service");
- return new ArrayList<BluetoothDevice>();
+ Log.e(TAG, "getDevicesMatchingConnectionStates(): BluetoothHealth is deprecated");
+ return new ArrayList<>();
}
- private static class BluetoothHealthCallbackWrapper extends IBluetoothHealthCallback.Stub {
- private BluetoothHealthCallback mCallback;
-
- public BluetoothHealthCallbackWrapper(BluetoothHealthCallback callback) {
- mCallback = callback;
- }
-
- @Override
- public void onHealthAppConfigurationStatusChange(BluetoothHealthAppConfiguration config,
- int status) {
- mCallback.onHealthAppConfigurationStatusChange(config, status);
- }
-
- @Override
- public void onHealthChannelStateChange(BluetoothHealthAppConfiguration config,
- BluetoothDevice device, int prevState, int newState,
- ParcelFileDescriptor fd, int channelId) {
- mCallback.onHealthChannelStateChange(config, device, prevState, newState, fd,
- channelId);
- }
- }
-
- /** Health Channel Connection State - Disconnected */
+ /** Health Channel Connection State - Disconnected
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int STATE_CHANNEL_DISCONNECTED = 0;
- /** Health Channel Connection State - Connecting */
+ /** Health Channel Connection State - Connecting
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int STATE_CHANNEL_CONNECTING = 1;
- /** Health Channel Connection State - Connected */
+ /** Health Channel Connection State - Connected
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int STATE_CHANNEL_CONNECTED = 2;
- /** Health Channel Connection State - Disconnecting */
+ /** Health Channel Connection State - Disconnecting
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int STATE_CHANNEL_DISCONNECTING = 3;
- /** Health App Configuration registration success */
+ /** Health App Configuration registration success
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int APP_CONFIG_REGISTRATION_SUCCESS = 0;
- /** Health App Configuration registration failure */
+ /** Health App Configuration registration failure
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int APP_CONFIG_REGISTRATION_FAILURE = 1;
- /** Health App Configuration un-registration success */
+ /** Health App Configuration un-registration success
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
+ */
+ @Deprecated
public static final int APP_CONFIG_UNREGISTRATION_SUCCESS = 2;
- /** Health App Configuration un-registration failure */
- public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3;
-
- private Context mContext;
- private ServiceListener mServiceListener;
- private volatile IBluetoothHealth mService;
- BluetoothAdapter mAdapter;
-
- /**
- * Create a BluetoothHealth proxy object.
+ /** Health App Configuration un-registration failure
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
- /*package*/ BluetoothHealth(Context context, ServiceListener l) {
- mContext = context;
- mServiceListener = l;
- mAdapter = BluetoothAdapter.getDefaultAdapter();
- IBluetoothManager mgr = mAdapter.getBluetoothManager();
- if (mgr != null) {
- try {
- mgr.registerStateChangeCallback(mBluetoothStateChangeCallback);
- } catch (RemoteException e) {
- Log.e(TAG, "", e);
- }
- }
-
- doBind();
- }
-
- boolean doBind() {
- Intent intent = new Intent(IBluetoothHealth.class.getName());
- ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
- intent.setComponent(comp);
- if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0,
- UserHandle.CURRENT_OR_SELF)) {
- Log.e(TAG, "Could not bind to Bluetooth Health Service with " + intent);
- return false;
- }
- return true;
- }
-
- /*package*/ void close() {
- if (VDBG) log("close()");
- IBluetoothManager mgr = mAdapter.getBluetoothManager();
- if (mgr != null) {
- try {
- mgr.unregisterStateChangeCallback(mBluetoothStateChangeCallback);
- } catch (Exception e) {
- Log.e(TAG, "", e);
- }
- }
-
- synchronized (mConnection) {
- if (mService != null) {
- try {
- mService = null;
- mContext.unbindService(mConnection);
- } catch (Exception re) {
- Log.e(TAG, "", re);
- }
- }
- }
- mServiceListener = null;
- }
-
- private final ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
- if (DBG) Log.d(TAG, "Proxy object connected");
- mService = IBluetoothHealth.Stub.asInterface(Binder.allowBlocking(service));
-
- if (mServiceListener != null) {
- mServiceListener.onServiceConnected(BluetoothProfile.HEALTH, BluetoothHealth.this);
- }
- }
-
- public void onServiceDisconnected(ComponentName className) {
- if (DBG) Log.d(TAG, "Proxy object disconnected");
- mService = null;
- if (mServiceListener != null) {
- mServiceListener.onServiceDisconnected(BluetoothProfile.HEALTH);
- }
- }
- };
-
- private boolean isEnabled() {
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-
- if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) return true;
- log("Bluetooth is Not enabled");
- return false;
- }
-
- private static boolean isValidDevice(BluetoothDevice device) {
- return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
- }
-
- private boolean checkAppParam(String name, int role, int channelType,
- BluetoothHealthCallback callback) {
- if (name == null || (role != SOURCE_ROLE && role != SINK_ROLE)
- || (channelType != CHANNEL_TYPE_RELIABLE && channelType != CHANNEL_TYPE_STREAMING
- && channelType != CHANNEL_TYPE_ANY)
- || callback == null) {
- return false;
- }
- if (role == SOURCE_ROLE && channelType == CHANNEL_TYPE_ANY) return false;
- return true;
- }
-
- private static void log(String msg) {
- Log.d(TAG, msg);
- }
+ @Deprecated
+ public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3;
}
diff --git a/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java b/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java
index 7c9db6f7213c..9788bbf74e3e 100644
--- a/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java
+++ b/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java
@@ -25,72 +25,14 @@ import android.os.Parcelable;
* the {@link BluetoothHealth} class. This class represents an application configuration
* that the Bluetooth Health third party application will register to communicate with the
* remote Bluetooth health device.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+@Deprecated
public final class BluetoothHealthAppConfiguration implements Parcelable {
- private final String mName;
- private final int mDataType;
- private final int mRole;
- private final int mChannelType;
-
- /**
- * Constructor to register the SINK role
- *
- * @param name Friendly name associated with the application configuration
- * @param dataType Data Type of the remote Bluetooth Health device
- * @hide
- */
- BluetoothHealthAppConfiguration(String name, int dataType) {
- mName = name;
- mDataType = dataType;
- mRole = BluetoothHealth.SINK_ROLE;
- mChannelType = BluetoothHealth.CHANNEL_TYPE_ANY;
- }
-
- /**
- * Constructor to register the application configuration.
- *
- * @param name Friendly name associated with the application configuration
- * @param dataType Data Type of the remote Bluetooth Health device
- * @param role {@link BluetoothHealth#SOURCE_ROLE} or {@link BluetoothHealth#SINK_ROLE}
- * @hide
- */
- BluetoothHealthAppConfiguration(String name, int dataType, int role, int
- channelType) {
- mName = name;
- mDataType = dataType;
- mRole = role;
- mChannelType = channelType;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof BluetoothHealthAppConfiguration) {
- BluetoothHealthAppConfiguration config = (BluetoothHealthAppConfiguration) o;
-
- if (mName == null) return false;
-
- return mName.equals(config.getName()) && mDataType == config.getDataType()
- && mRole == config.getRole() && mChannelType == config.getChannelType();
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- int result = 17;
- result = 31 * result + (mName != null ? mName.hashCode() : 0);
- result = 31 * result + mDataType;
- result = 31 * result + mRole;
- result = 31 * result + mChannelType;
- return result;
- }
-
- @Override
- public String toString() {
- return "BluetoothHealthAppConfiguration [mName = " + mName + ",mDataType = " + mDataType
- + ", mRole = " + mRole + ",mChannelType = " + mChannelType + "]";
- }
-
@Override
public int describeContents() {
return 0;
@@ -100,50 +42,59 @@ public final class BluetoothHealthAppConfiguration implements Parcelable {
* Return the data type associated with this application configuration.
*
* @return dataType
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public int getDataType() {
- return mDataType;
+ return 0;
}
/**
* Return the name of the application configuration.
*
* @return String name
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public String getName() {
- return mName;
+ return null;
}
/**
* Return the role associated with this application configuration.
*
* @return One of {@link BluetoothHealth#SOURCE_ROLE} or {@link BluetoothHealth#SINK_ROLE}
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
public int getRole() {
- return mRole;
+ return 0;
}
/**
- * Return the channel type associated with this application configuration.
- *
- * @return One of {@link BluetoothHealth#CHANNEL_TYPE_RELIABLE} or {@link
- * BluetoothHealth#CHANNEL_TYPE_STREAMING} or {@link BluetoothHealth#CHANNEL_TYPE_ANY}.
- * @hide
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
- public int getChannelType() {
- return mChannelType;
- }
-
+ @Deprecated
public static final Parcelable.Creator<BluetoothHealthAppConfiguration> CREATOR =
new Parcelable.Creator<BluetoothHealthAppConfiguration>() {
@Override
public BluetoothHealthAppConfiguration createFromParcel(Parcel in) {
- String name = in.readString();
- int type = in.readInt();
- int role = in.readInt();
- int channelType = in.readInt();
- return new BluetoothHealthAppConfiguration(name, type, role,
- channelType);
+ return new BluetoothHealthAppConfiguration();
}
@Override
@@ -153,10 +104,5 @@ public final class BluetoothHealthAppConfiguration implements Parcelable {
};
@Override
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(mName);
- out.writeInt(mDataType);
- out.writeInt(mRole);
- out.writeInt(mChannelType);
- }
+ public void writeToParcel(Parcel out, int flags) {}
}
diff --git a/core/java/android/bluetooth/BluetoothHealthCallback.java b/core/java/android/bluetooth/BluetoothHealthCallback.java
index 40234856b8ad..4769212c5361 100644
--- a/core/java/android/bluetooth/BluetoothHealthCallback.java
+++ b/core/java/android/bluetooth/BluetoothHealthCallback.java
@@ -23,7 +23,13 @@ import android.util.Log;
/**
* This abstract class is used to implement {@link BluetoothHealth} callbacks.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+@Deprecated
public abstract class BluetoothHealthCallback {
private static final String TAG = "BluetoothHealthCallback";
@@ -38,8 +44,14 @@ public abstract class BluetoothHealthCallback {
* BluetoothHealth#APP_CONFIG_REGISTRATION_FAILURE} or
* {@link BluetoothHealth#APP_CONFIG_UNREGISTRATION_SUCCESS}
* or {@link BluetoothHealth#APP_CONFIG_UNREGISTRATION_FAILURE}
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
@BinderThread
+ @Deprecated
public void onHealthAppConfigurationStatusChange(BluetoothHealthAppConfiguration config,
int status) {
Log.d(TAG, "onHealthAppConfigurationStatusChange: " + config + "Status: " + status);
@@ -58,8 +70,14 @@ public abstract class BluetoothHealthCallback {
* @param fd The Parcel File Descriptor when the channel state is connected.
* @param channelId The id associated with the channel. This id will be used in future calls
* like when disconnecting the channel.
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()(int)}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
@BinderThread
+ @Deprecated
public void onHealthChannelStateChange(BluetoothHealthAppConfiguration config,
BluetoothDevice device, int prevState, int newState, ParcelFileDescriptor fd,
int channelId) {
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index 71081c75cea5..7302756507a4 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -72,7 +72,13 @@ public interface BluetoothProfile {
/**
* Health Profile
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New
+ * apps should use Bluetooth Low Energy based solutions such as {@link BluetoothGatt},
+ * {@link BluetoothAdapter#listenUsingL2capChannel()}, or
+ * {@link BluetoothDevice#createL2capChannel(int)}
*/
+ @Deprecated
int HEALTH = 3;
/**
@@ -281,9 +287,8 @@ public interface BluetoothProfile {
* Called to notify the client when the proxy object has been
* connected to the service.
*
- * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or {@link #A2DP}
- * @param proxy - One of {@link BluetoothHealth}, {@link BluetoothHeadset} or {@link
- * BluetoothA2dp}
+ * @param profile - One of {@link #HEADSET} or {@link #A2DP}
+ * @param proxy - One of {@link BluetoothHeadset} or {@link BluetoothA2dp}
*/
public void onServiceConnected(int profile, BluetoothProfile proxy);
@@ -291,7 +296,7 @@ public interface BluetoothProfile {
* Called to notify the client that this proxy object has been
* disconnected from the service.
*
- * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or {@link #A2DP}
+ * @param profile - One of {@link #HEADSET} or {@link #A2DP}
*/
public void onServiceDisconnected(int profile);
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index eb7be6f8a6b0..cefc700d372a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -337,6 +337,15 @@ public abstract class Context {
public static final int BIND_ADJUST_BELOW_PERCEPTIBLE = 0x0100;
/**
+ * @hide Flag for {@link #bindService}: the service being bound to represents a
+ * protected system component, so must have association restrictions applied to it.
+ * That is, a system config must have one or more allow-association tags limiting
+ * which packages it can interact with. If it does not have any such association
+ * restrictions, a default empty set will be created.
+ */
+ public static final int BIND_RESTRICT_ASSOCIATIONS = 0x00200000;
+
+ /**
* @hide Flag for {@link #bindService}: allows binding to a service provided
* by an instant app. Note that the caller may not have access to the instant
* app providing the service which is a violation of the instant app sandbox.
@@ -3093,6 +3102,7 @@ public abstract class Context {
VIBRATOR_SERVICE,
//@hide: STATUS_BAR_SERVICE,
CONNECTIVITY_SERVICE,
+ //@hide: IP_MEMORY_STORE_SERVICE,
IPSEC_SERVICE,
//@hide: UPDATE_LOCK_SERVICE,
//@hide: NETWORKMANAGEMENT_SERVICE,
@@ -3630,6 +3640,14 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.net.IpMemoryStore} to store and read information about
+ * known networks.
+ * @hide
+ */
+ public static final String IP_MEMORY_STORE_SERVICE = "ipmemorystore";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a
* {@link android.net.IpSecManager} for encrypting Sockets or Networks with
* IPSec.
*
@@ -3975,6 +3993,24 @@ public abstract class Context {
public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture";
/**
+ * Used for getting content selections and classifications for task snapshots.
+ *
+ * @hide
+ * @see #getSystemService(String)
+ */
+ @SystemApi
+ public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
+
+ /**
+ * Official published name of the app prediction service.
+ *
+ * @hide
+ * @see #getSystemService(String)
+ */
+ @SystemApi
+ public static final String APP_PREDICTION_SERVICE = "app_prediction";
+
+ /**
* Use with {@link #getSystemService(String)} to access the
* {@link com.android.server.voiceinteraction.SoundTriggerService}.
*
@@ -4427,6 +4463,16 @@ public abstract class Context {
public static final String STATS_MANAGER = "stats";
/**
+ * Service to capture a bugreport.
+ * @see #getSystemService(String)
+ * @see android.os.BugreportManager
+ * @hide
+ */
+ // TODO: Expose API when the implementation is more complete.
+ // @SystemApi
+ public static final String BUGREPORT_SERVICE = "bugreport";
+
+ /**
* Use with {@link #getSystemService(String)} to retrieve a {@link
* android.content.om.OverlayManager} for managing overlay packages.
*
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index e93109b32ccf..795ed36a4a39 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -33,6 +33,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.pm.ShortcutInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Rect;
@@ -816,6 +817,28 @@ public class Intent implements Parcelable, Cloneable {
= "android.intent.action.SHOW_APP_INFO";
/**
+ * Activity Action: Start an activity to show the app's detailed usage information for
+ * permission protected data.
+ *
+ * The Intent contains an extra {@link #EXTRA_PERMISSION_USAGE_PERMISSIONS} that is of
+ * type {@code String[]} and contains the specific permissions to show information for.
+ *
+ * Apps should handle this intent if they want to provide more information about permission
+ * usage to users beyond the information provided in the manifest.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_PERMISSION_USAGE_DETAILS =
+ "android.intent.action.PERMISSION_USAGE_DETAILS";
+
+ /**
+ * The name of the extra used to contain the permissions in
+ * {@link #ACTION_PERMISSION_USAGE_DETAILS}.
+ * @see #ACTION_PERMISSION_USAGE_DETAILS
+ */
+ public static final String EXTRA_PERMISSION_USAGE_PERMISSIONS =
+ "android.intent.extra.PERMISSION_USAGE_PERMISSIONS";
+
+ /**
* Represents a shortcut/live folder icon resource.
*
* @see Intent#ACTION_CREATE_SHORTCUT
@@ -1811,6 +1834,54 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.action.REVIEW_PERMISSIONS";
/**
+ * Activity action: Launch UI to manage a default app.
+ * <p>
+ * Input: {@link #EXTRA_ROLE_NAME} specifies the role of the default app which will be managed
+ * by the launched UI.
+ * </p>
+ * <p>
+ * Output: Nothing.
+ * </p>
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS)
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ @SystemApi
+ public static final String ACTION_MANAGE_DEFAULT_APP =
+ "android.intent.action.MANAGE_DEFAULT_APP";
+
+ /**
+ * Intent extra: A role name.
+ * <p>
+ * Type: String
+ * </p>
+ *
+ * @see android.app.role.RoleManager
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
+
+ /**
+ * Activity action: Launch UI to manage special app accesses.
+ * <p>
+ * Input: Nothing.
+ * </p>
+ * <p>
+ * Output: Nothing.
+ * </p>
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS)
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ @SystemApi
+ public static final String ACTION_MANAGE_SPECIAL_APP_ACCESSES =
+ "android.intent.action.MANAGE_SPECIAL_APP_ACCESSES";
+
+ /**
* Intent extra: A callback for reporting remote result as a bundle.
* <p>
* Type: IRemoteCallback
@@ -1884,6 +1955,17 @@ public class Intent implements Parcelable, Cloneable {
public static final String EXTRA_LAUNCHER_EXTRAS = "android.intent.extra.LAUNCHER_EXTRAS";
/**
+ * Intent extra: ID of the shortcut used to send the share intent.
+ *
+ * @see ShortcutInfo#getId()
+ *
+ * <p>
+ * Type: String
+ * </p>
+ */
+ public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+
+ /**
* Activity action: Launch UI to manage which apps have a given permission.
* <p>
* Input: {@link #EXTRA_PERMISSION_NAME} specifies the permission group
@@ -1914,16 +1996,35 @@ public class Intent implements Parcelable, Cloneable {
public static final String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
/**
+ * Intent extra: The name of a permission group.
+ * <p>
+ * Type: String
+ * </p>
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_PERMISSION_GROUP_NAME =
+ "android.intent.extra.PERMISSION_GROUP_NAME";
+
+ /**
* Activity action: Launch UI to review app uses of permissions.
* <p>
* Input: {@link #EXTRA_PERMISSION_NAME} specifies the permission name
- * that will be displayed by the launched UI.
+ * that will be displayed by the launched UI. Do not pass both this and
+ * {@link #EXTRA_PERMISSION_GROUP_NAME} .
+ * </p>
+ * <p>
+ * Input: {@link #EXTRA_PERMISSION_GROUP_NAME} specifies the permission group name
+ * that will be displayed by the launched UI. Do not pass both this and
+ * {@link #EXTRA_PERMISSION_NAME}.
* </p>
* <p>
* Output: Nothing.
* </p>
*
* @see #EXTRA_PERMISSION_NAME
+ * @see #EXTRA_PERMISSION_GROUP_NAME
*
* @hide
*/
@@ -2353,6 +2454,25 @@ public class Intent implements Parcelable, Cloneable {
public static final String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
/**
+ * Broadcast Action: Distracting packages have been changed.
+ * <p>Includes the following extras:
+ * <ul>
+ * <li> {@link #EXTRA_CHANGED_PACKAGE_LIST} is the set of packages which have been changed.
+ * <li> {@link #EXTRA_CHANGED_UID_LIST} is the set of uids which have been changed.
+ * <li> {@link #EXTRA_DISTRACTION_RESTRICTIONS} the new restrictions set on these packages.
+ * </ul>
+ *
+ * <p class="note">This is a protected intent that can only be sent
+ * by the system. It is only sent to registered receivers.
+ *
+ * @see PackageManager#setDistractingPackageRestrictions(String[], int)
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_DISTRACTING_PACKAGES_CHANGED =
+ "android.intent.action.DISTRACTING_PACKAGES_CHANGED";
+
+ /**
* Broadcast Action: Sent to a package that has been suspended by the system. This is sent
* whenever a package is put into a suspended state or any of its app extras change while in the
* suspended state.
@@ -5074,6 +5194,17 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.extra.changed_uid_list";
/**
+ * An integer denoting a bitwise combination of restrictions set on distracting packages via
+ * {@link PackageManager#setDistractingPackageRestrictions(String[], int)}
+ *
+ * @hide
+ * @see PackageManager.DistractionRestriction
+ * @see PackageManager#setDistractingPackageRestrictions(String[], int)
+ */
+ public static final String EXTRA_DISTRACTION_RESTRICTIONS =
+ "android.intent.extra.distraction_restrictions";
+
+ /**
* @hide
* Magic extra system code can use when binding, to give a label for
* who it is that has bound to a service. This is an integer giving
diff --git a/core/java/android/content/om/OverlayInfo.java b/core/java/android/content/om/OverlayInfo.java
index dd550032df7c..1989f06ca76b 100644
--- a/core/java/android/content/om/OverlayInfo.java
+++ b/core/java/android/content/om/OverlayInfo.java
@@ -18,8 +18,7 @@ package android.content.om;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.UnsupportedAppUsage;
-import android.os.Build;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,8 +31,10 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@SystemApi
public final class OverlayInfo implements Parcelable {
+ /** @hide */
@IntDef(prefix = "STATE_", value = {
STATE_UNKNOWN,
STATE_MISSING_TARGET,
@@ -44,6 +45,7 @@ public final class OverlayInfo implements Parcelable {
STATE_TARGET_UPGRADING,
STATE_OVERLAY_UPGRADING,
})
+ /** @hide */
@Retention(RetentionPolicy.SOURCE)
public @interface State {}
@@ -52,17 +54,23 @@ public final class OverlayInfo implements Parcelable {
* objects exposed outside the {@link
* com.android.server.om.OverlayManagerService} should never have this
* state.
+ *
+ * @hide
*/
public static final int STATE_UNKNOWN = -1;
/**
* The target package of the overlay is not installed. The overlay cannot be enabled.
+ *
+ * @hide
*/
public static final int STATE_MISSING_TARGET = 0;
/**
* Creation of idmap file failed (e.g. no matching resources). The overlay
* cannot be enabled.
+ *
+ * @hide
*/
public static final int STATE_NO_IDMAP = 1;
@@ -70,6 +78,7 @@ public final class OverlayInfo implements Parcelable {
* The overlay is currently disabled. It can be enabled.
*
* @see IOverlayManager#setEnabled
+ * @hide
*/
public static final int STATE_DISABLED = 2;
@@ -77,18 +86,21 @@ public final class OverlayInfo implements Parcelable {
* The overlay is currently enabled. It can be disabled.
*
* @see IOverlayManager#setEnabled
+ * @hide
*/
public static final int STATE_ENABLED = 3;
/**
* The target package is currently being upgraded; the state will change
* once the package installation has finished.
+ * @hide
*/
public static final int STATE_TARGET_UPGRADING = 4;
/**
* The overlay package is currently being upgraded; the state will change
* once the package installation has finished.
+ * @hide
*/
public static final int STATE_OVERLAY_UPGRADING = 5;
@@ -96,6 +108,7 @@ public final class OverlayInfo implements Parcelable {
* The overlay package is currently enabled because it is marked as
* 'static'. It cannot be disabled but will change state if for instance
* its target is uninstalled.
+ * @hide
*/
public static final int STATE_ENABLED_STATIC = 6;
@@ -103,40 +116,52 @@ public final class OverlayInfo implements Parcelable {
* Overlay category: theme.
* <p>
* Change how Android (including the status bar, dialogs, ...) looks.
+ *
+ * @hide
*/
public static final String CATEGORY_THEME = "android.theme";
/**
* Package name of the overlay package
+ *
+ * @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public final String packageName;
/**
* Package name of the target package
+ *
+ * @hide
*/
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
+ @SystemApi
public final String targetPackageName;
/**
* Category of the overlay package
+ *
+ * @hide
*/
+ @SystemApi
public final String category;
/**
* Full path to the base APK for this overlay package
+ * @hide
*/
public final String baseCodePath;
/**
* The state of this OverlayInfo as defined by the STATE_* constants in this class.
+ * @hide
*/
- @UnsupportedAppUsage
public final @State int state;
/**
* User handle for which this overlay applies
+ * @hide
*/
+ @SystemApi
public final int userId;
/**
@@ -161,12 +186,15 @@ public final class OverlayInfo implements Parcelable {
*
* @param source the source OverlayInfo to base the new instance on
* @param state the new state for the source OverlayInfo
+ *
+ * @hide
*/
public OverlayInfo(@NonNull OverlayInfo source, @State int state) {
this(source.packageName, source.targetPackageName, source.category, source.baseCodePath,
state, source.userId, source.priority, source.isStatic);
}
+ /** @hide */
public OverlayInfo(@NonNull String packageName, @NonNull String targetPackageName,
@NonNull String category, @NonNull String baseCodePath, int state, int userId,
int priority, boolean isStatic) {
@@ -181,6 +209,7 @@ public final class OverlayInfo implements Parcelable {
ensureValidState();
}
+ /** @hide */
public OverlayInfo(Parcel source) {
packageName = source.readString();
targetPackageName = source.readString();
@@ -255,8 +284,9 @@ public final class OverlayInfo implements Parcelable {
* Disabled overlay packages are installed but are currently not in use.
*
* @return true if the overlay is enabled, else false.
+ * @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public boolean isEnabled() {
switch (state) {
case STATE_ENABLED:
@@ -272,6 +302,7 @@ public final class OverlayInfo implements Parcelable {
* debugging purposes.
*
* @return a human readable String representing the state.
+ * @hide
*/
public static String stateToString(@State int state) {
switch (state) {
diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java
new file mode 100644
index 000000000000..7a2220bfddb6
--- /dev/null
+++ b/core/java/android/content/om/OverlayManager.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.om;
+
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+import java.util.List;
+
+/**
+ * Updates OverlayManager state; gets information about installed overlay packages.
+ * @hide
+ */
+@SystemApi
+@SystemService(Context.OVERLAY_SERVICE)
+public class OverlayManager {
+
+ private final IOverlayManager mService;
+ private final Context mContext;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param context The current context in which to operate.
+ * @param service The backing system service.
+ *
+ * @hide
+ */
+ public OverlayManager(Context context, IOverlayManager service) {
+ mContext = context;
+ mService = service;
+ }
+
+ /** @hide */
+ public OverlayManager(Context context) {
+ this(context, IOverlayManager.Stub.asInterface(
+ ServiceManager.getService(Context.OVERLAY_SERVICE)));
+ }
+ /**
+ * Request that an overlay package is enabled and any other overlay packages with the same
+ * target package and category are disabled.
+ *
+ * @param packageName the name of the overlay package to enable.
+ * @param userId The user for which to change the overlay.
+ * @return true if the system successfully registered the request, false otherwise.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean setEnabledExclusiveInCategory(@Nullable final String packageName,
+ int userId) {
+ try {
+ return mService.setEnabledExclusiveInCategory(packageName, userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns information about all overlays for the given target package for
+ * the specified user. The returned list is ordered according to the
+ * overlay priority with the highest priority at the end of the list.
+ *
+ * @param targetPackageName The name of the target package.
+ * @param userId The user to get the OverlayInfos for.
+ * @return A list of OverlayInfo objects; if no overlays exist for the
+ * requested package, an empty list is returned.
+ *
+ * @hide
+ */
+ @SystemApi
+ public List<OverlayInfo> getOverlayInfosForTarget(@Nullable final String targetPackageName,
+ int userId) {
+ try {
+ return mService.getOverlayInfosForTarget(targetPackageName, userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+}
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 0edb36c5daff..3cfbe0c6f08a 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -505,6 +505,22 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
*/
public int flags;
+ /**
+ * Bit in {@link #privateFlags} indicating if the activity should be shown when locked in case
+ * an activity behind this can also be shown when locked.
+ * See android.R.attr#inheritShowWhenLocked
+ * @hide
+ */
+ public static final int FLAG_INHERIT_SHOW_WHEN_LOCKED = 0x1;
+
+ /**
+ * Options that have been set in the activity declaration in the manifest.
+ * These include:
+ * {@link #FLAG_INHERIT_SHOW_WHEN_LOCKED}.
+ * @hide
+ */
+ public int privateFlags;
+
/** @hide */
@IntDef(prefix = { "SCREEN_ORIENTATION_" }, value = {
SCREEN_ORIENTATION_UNSET,
@@ -975,6 +991,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
taskAffinity = orig.taskAffinity;
targetActivity = orig.targetActivity;
flags = orig.flags;
+ privateFlags = orig.privateFlags;
screenOrientation = orig.screenOrientation;
configChanges = orig.configChanges;
softInputMode = orig.softInputMode;
@@ -1122,9 +1139,10 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
+ " targetActivity=" + targetActivity
+ " persistableMode=" + persistableModeToString());
}
- if (launchMode != 0 || flags != 0 || theme != 0) {
+ if (launchMode != 0 || flags != 0 || privateFlags != 0 || theme != 0) {
pw.println(prefix + "launchMode=" + launchMode
+ " flags=0x" + Integer.toHexString(flags)
+ + " privateFlags=0x" + Integer.toHexString(privateFlags)
+ " theme=0x" + Integer.toHexString(theme));
}
if (screenOrientation != SCREEN_ORIENTATION_UNSPECIFIED
@@ -1178,6 +1196,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
dest.writeString(targetActivity);
dest.writeString(launchToken);
dest.writeInt(flags);
+ dest.writeInt(privateFlags);
dest.writeInt(screenOrientation);
dest.writeInt(configChanges);
dest.writeInt(softInputMode);
@@ -1307,6 +1326,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
targetActivity = source.readString();
launchToken = source.readString();
flags = source.readInt();
+ privateFlags = source.readInt();
screenOrientation = source.readInt();
configChanges = source.readInt();
softInputMode = source.readInt();
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0151ae49a35f..027e1be9d3c6 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1887,7 +1887,15 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
return (privateFlags & ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) != 0;
}
- /** @hide */
+ /**
+ * Check whether the application is encryption aware.
+ *
+ * @see #isDirectBootAware()
+ * @see #isPartiallyDirectBootAware()
+ *
+ * @hide
+ */
+ @SystemApi
public boolean isEncryptionAware() {
return isDirectBootAware() || isPartiallyDirectBootAware();
}
diff --git a/core/java/android/content/pm/CrossProfileApps.java b/core/java/android/content/pm/CrossProfileApps.java
index 740fd7f963f9..b7366f1bbafc 100644
--- a/core/java/android/content/pm/CrossProfileApps.java
+++ b/core/java/android/content/pm/CrossProfileApps.java
@@ -18,6 +18,7 @@ package android.content.pm;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
@@ -76,9 +77,23 @@ public class CrossProfileApps {
}
/**
- * Starts the specified activity of the caller package in the specified profile if the caller
- * has {@link android.Manifest.permission#INTERACT_ACROSS_PROFILES} permission and
- * both the caller and target user profiles are in the same user group.
+ * @deprecated use {@link #startActivity(ComponentName, UserHandle)} instead.
+ *
+ * @removed
+ * @hide
+ */
+ @Deprecated
+ @UnsupportedAppUsage
+ public void startAnyActivity(@NonNull ComponentName component, @NonNull UserHandle targetUser) {
+ startActivity(component, targetUser);
+ }
+
+ /**
+ * Starts the specified activity of the caller package in the specified profile. Unlike
+ * {@link #startMainActivity}, this can start any activity of the caller package, not just
+ * the main activity.
+ * The caller must have the {@link android.Manifest.permission#INTERACT_ACROSS_PROFILES}
+ * permission and both the caller and target user profiles must be in the same profile group.
*
* @param component The ComponentName of the activity to launch. It must be exported.
* @param targetUser The UserHandle of the profile, must be one of the users returned by
@@ -88,7 +103,7 @@ public class CrossProfileApps {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES)
- public void startAnyActivity(@NonNull ComponentName component, @NonNull UserHandle targetUser) {
+ public void startActivity(@NonNull ComponentName component, @NonNull UserHandle targetUser) {
try {
mService.startActivityAsUser(mContext.getIApplicationThread(),
mContext.getPackageName(), component, targetUser.getIdentifier(), false);
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index ba7710b8ef48..db2b6fd235d3 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -69,6 +69,7 @@ interface ILauncherApps {
int userId);
boolean hasShortcutHostPermission(String callingPackage);
+ boolean shouldHideFromSuggestions(String packageName, in UserHandle user);
ParceledListSlice getShortcutConfigActivities(
String callingPackage, String packageName, in UserHandle user);
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 64a4479be7ee..4b130b2371bf 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -273,6 +273,9 @@ interface IPackageManager {
void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage);
+ String[] setDistractingPackageRestrictionsAsUser(in String[] packageNames, int restrictionFlags,
+ int userId);
+
String[] setPackagesSuspendedAsUser(in String[] packageNames, boolean suspended,
in PersistableBundle appExtras, in PersistableBundle launcherExtras,
in SuspendDialogInfo dialogInfo, String callingPackage, int userId);
@@ -537,6 +540,11 @@ interface IPackageManager {
String targetCompilerFilter, boolean force);
/**
+ * Ask the package manager to compile layouts in the given package.
+ */
+ boolean compileLayouts(String packageName);
+
+ /**
* Ask the package manager to dump profiles associated with a package.
*/
void dumpProfiles(String packageName);
diff --git a/core/java/android/content/pm/IShortcutService.aidl b/core/java/android/content/pm/IShortcutService.aidl
index 03124be7ab7d..c702b16c97f6 100644
--- a/core/java/android/content/pm/IShortcutService.aidl
+++ b/core/java/android/content/pm/IShortcutService.aidl
@@ -16,6 +16,7 @@
package android.content.pm;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
@@ -72,4 +73,7 @@ interface IShortcutService {
void applyRestore(in byte[] payload, int user);
boolean isRequestPinItemSupported(int user, int requestType);
+
+ // System API used by framework's ShareSheet (ChooserActivity)
+ ParceledListSlice getShareTargets(String packageName, in IntentFilter filter, int userId);
} \ No newline at end of file
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 44e652f10094..983ea9f847cd 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -697,6 +697,26 @@ public class LauncherApps {
}
/**
+ * Returns whether a package should be hidden from suggestions to the user. Currently, this
+ * could be done because the package was marked as distracting to the user via
+ * {@code PackageManager.setDistractingPackageRestrictions(String[], int)}.
+ *
+ * @param packageName The package for which to check.
+ * @param user the {@link UserHandle} of the profile.
+ * @return
+ */
+ public boolean shouldHideFromSuggestions(@NonNull String packageName,
+ @NonNull UserHandle user) {
+ Preconditions.checkNotNull(packageName, "packageName");
+ Preconditions.checkNotNull(user, "user");
+ try {
+ return mService.shouldHideFromSuggestions(packageName, user);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns {@link ApplicationInfo} about an application installed for a specific user profile.
*
* @param packageName The package name of the application
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index b8d7889c86ff..6d22277a5384 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -18,14 +18,10 @@ package android.content.pm;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
-import android.apex.ApexInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Overall information about the contents of a package. This corresponds
* to all of the information collected from AndroidManifest.xml.
@@ -374,6 +370,14 @@ public class PackageInfo implements Parcelable {
public String overlayTarget;
/**
+ * What overlayable set of elements package, if any, this package will overlay.
+ *
+ * Overlayable name defined within the target package, or null.
+ * @hide
+ */
+ public String overlayTargetName;
+
+ /**
* The overlay category, if any, of this package
*
* @hide
@@ -573,15 +577,6 @@ public class PackageInfo implements Parcelable {
}
}
- /**
- * @hide
- */
- public PackageInfo(ApexInfo apexInfo) {
- packageName = apexInfo.packageName;
- setLongVersionCode(apexInfo.versionCode);
- isApex = true;
- }
-
private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
if (components != null) {
for (ComponentInfo ci : components) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 2aeb68da365b..b84567383bfb 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -5555,26 +5555,24 @@ public abstract class PackageManager {
}
/**
- * @deprecated This function no longer does anything; it was an old
- * approach to managing preferred activities, which has been superseded
- * by (and conflicts with) the modern activity-based preferences.
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract void addPackageToPreferred(String packageName);
/**
- * @deprecated This function no longer does anything; it was an old
- * approach to managing preferred activities, which has been superseded
- * by (and conflicts with) the modern activity-based preferences.
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract void removePackageFromPreferred(String packageName);
/**
- * @deprecated This function no longer does anything; it was an old
- * approach to managing preferred activities, which has been superseded
- * by (and conflicts with) the modern activity-based preferences.
- *
* Retrieve the list of all currently configured preferred packages. The
* first package on the list is the most preferred, the last is the least
* preferred.
@@ -5582,15 +5580,16 @@ public abstract class PackageManager {
* @param flags Additional option flags to modify the data returned.
* @return A List of PackageInfo objects, one for each preferred
* application, in order of preference.
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract List<PackageInfo> getPreferredPackages(@PackageInfoFlags int flags);
/**
- * @deprecated This is a protected API that should not have been available
- * to third party applications. It is the platform's responsibility for
- * assigning preferred activities and this cannot be directly modified.
- *
* Add a new preferred activity mapping to the system. This will be used
* to automatically select the given activity component when
* {@link Context#startActivity(Intent) Context.startActivity()} finds
@@ -5604,20 +5603,26 @@ public abstract class PackageManager {
* this preference was made.
* @param activity The component name of the activity that is to be
* preferred.
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract void addPreferredActivity(IntentFilter filter, int match,
ComponentName[] set, ComponentName activity);
/**
- * @deprecated This is a protected API that should not have been available
- * to third party applications. It is the platform's responsibility for
- * assigning preferred activities and this cannot be directly modified.
- *
* Same as {@link #addPreferredActivity(IntentFilter, int,
ComponentName[], ComponentName)}, but with a specific userId to apply the preference
to.
* @hide
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
@UnsupportedAppUsage
@@ -5627,10 +5632,6 @@ public abstract class PackageManager {
}
/**
- * @deprecated This is a protected API that should not have been available
- * to third party applications. It is the platform's responsibility for
- * assigning preferred activities and this cannot be directly modified.
- *
* Replaces an existing preferred activity mapping to the system, and if that were not present
* adds a new preferred activity. This will be used
* to automatically select the given activity component when
@@ -5645,7 +5646,13 @@ public abstract class PackageManager {
* this preference was made.
* @param activity The component name of the activity that is to be
* preferred.
+ *
* @hide
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
@UnsupportedAppUsage
@@ -5653,10 +5660,6 @@ public abstract class PackageManager {
ComponentName[] set, ComponentName activity);
/**
- * @deprecated This is a protected API that should not have been available
- * to third party applications. It is the platform's responsibility for
- * assigning preferred activities and this cannot be directly modified.
- *
* Replaces an existing preferred activity mapping to the system, and if that were not present
* adds a new preferred activity. This will be used to automatically select the given activity
* component when {@link Context#startActivity(Intent) Context.startActivity()} finds multiple
@@ -5671,6 +5674,11 @@ public abstract class PackageManager {
* @param activity The component name of the activity that is to be preferred.
*
* @hide
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
@SystemApi
@@ -5681,6 +5689,11 @@ public abstract class PackageManager {
/**
* @hide
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
@UnsupportedAppUsage
@@ -5690,10 +5703,6 @@ public abstract class PackageManager {
}
/**
- * @deprecated This function no longer does anything; it was an old
- * approach to managing preferred activities, which has been superseded
- * by (and conflicts with) the modern activity-based preferences.
- *
* Remove all preferred activity mappings, previously added with
* {@link #addPreferredActivity}, from the
* system whose activities are implemented in the given package name.
@@ -5701,15 +5710,16 @@ public abstract class PackageManager {
*
* @param packageName The name of the package whose preferred activity
* mappings are to be removed.
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract void clearPackagePreferredActivities(String packageName);
/**
- * @deprecated This function no longer does anything; it was an old
- * approach to managing preferred activities, which has been superseded
- * by (and conflicts with) the modern activity-based preferences.
- *
* Retrieve all preferred activities, previously added with
* {@link #addPreferredActivity}, that are
* currently registered with the system.
@@ -5725,6 +5735,11 @@ public abstract class PackageManager {
* @return Returns the total number of registered preferred activities
* (the number of distinct IntentFilter records, not the number of unique
* activity components) that were found.
+ *
+ * @deprecated This function no longer does anything. It is the platform's
+ * responsibility to assign preferred activities and this cannot be modified
+ * directly. To determine the activities resolved by the platform, use
+ * {@link #resolveActivity} or {@link #queryIntentActivities}.
*/
@Deprecated
public abstract int getPreferredActivities(@NonNull List<IntentFilter> outFilters,
@@ -5889,6 +5904,74 @@ public abstract class PackageManager {
public abstract boolean isSignedByExactly(String packageName, KeySet ks);
/**
+ * Flag to denote no restrictions. This should be used to clear any restrictions that may have
+ * been previously set for the package.
+ * @see PackageManager.DistractionRestriction
+ * @hide
+ */
+ @SystemApi
+ public static final int RESTRICTION_NONE = 0x0;
+
+ /**
+ * Flag to denote that a package should be hidden from any suggestions to the user.
+ * @see PackageManager.DistractionRestriction
+ * @hide
+ */
+ @SystemApi
+ public static final int RESTRICTION_HIDE_FROM_SUGGESTIONS = 0x00000001;
+
+ /**
+ * Flag to denote that a package's notifications should be hidden.
+ * @see PackageManager.DistractionRestriction
+ * @hide
+ */
+ @SystemApi
+ public static final int RESTRICTION_HIDE_NOTIFICATIONS = 0x00000002;
+
+ /**
+ * Restriction flags to set on a package that is considered as distracting to the user.
+ * These should help the user to restrict their usage of these apps.
+ *
+ * @see #setDistractingPackageRestrictions(String[], int)
+ * @hide
+ */
+ @SystemApi
+ @IntDef(flag = true, prefix = {"RESTRICTION_"}, value = {
+ RESTRICTION_NONE,
+ RESTRICTION_HIDE_FROM_SUGGESTIONS,
+ RESTRICTION_HIDE_NOTIFICATIONS
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DistractionRestriction {}
+
+ /**
+ * Mark or unmark the given packages as distracting to the user.
+ * These packages can have certain restrictions set that should discourage the user to launch
+ * them often. For example, notifications from such an app can be hidden, or the app can be
+ * removed from launcher suggestions, so the user is able to restrict their use of these apps.
+ *
+ * <p>The caller must hold {@link android.Manifest.permission#SUSPEND_APPS} to use this API.
+ *
+ * @param packages Packages to mark as distracting.
+ * @param restrictionFlags Any combination of {@link DistractionRestriction restrictions} to
+ * impose on the given packages. {@link #RESTRICTION_NONE} can be used
+ * to clear any existing restrictions.
+ * @return A list of packages that could not have the {@code restrictionFlags} set. The system
+ * may prevent restricting critical packages to preserve normal device function.
+ *
+ * @see DistractionRestriction
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.SUSPEND_APPS)
+ @NonNull
+ public String[] setDistractingPackageRestrictions(@NonNull String[] packages,
+ @DistractionRestriction int restrictionFlags) {
+ throw new UnsupportedOperationException(
+ "setDistractingPackageRestrictions not implemented");
+ }
+
+ /**
* Puts the package in a suspended state, where attempts at starting activities are denied.
*
* <p>It doesn't remove the data or the actual package file. The application's notifications
@@ -5911,8 +5994,7 @@ public abstract class PackageManager {
* {@link PersistableBundle} objects to be shared with the apps being suspended and the
* launcher to support customization that they might need to handle the suspended state.
*
- * <p>The caller must hold {@link Manifest.permission#SUSPEND_APPS} or
- * {@link Manifest.permission#MANAGE_USERS} to use this api.</p>
+ * <p>The caller must hold {@link Manifest.permission#SUSPEND_APPS} to use this API.
*
* @param packageNames The names of the packages to set the suspended status.
* @param suspended If set to {@code true}, the packages will be suspended, if set to
@@ -5955,7 +6037,7 @@ public abstract class PackageManager {
* <p>When the user tries to launch a suspended app, a system dialog alerting them that the app
* is suspended will be shown instead.
* The caller can optionally customize the dialog by passing a {@link SuspendDialogInfo} object
- * to this api. This dialog will have a button that starts the
+ * to this API. This dialog will have a button that starts the
* {@link Intent#ACTION_SHOW_SUSPENDED_APP_DETAILS} intent if the suspending app declares an
* activity which handles this action.
*
@@ -5966,7 +6048,7 @@ public abstract class PackageManager {
* {@link PersistableBundle} objects to be shared with the apps being suspended and the
* launcher to support customization that they might need to handle the suspended state.
*
- * <p>The caller must hold {@link Manifest.permission#SUSPEND_APPS} to use this api.
+ * <p>The caller must hold {@link Manifest.permission#SUSPEND_APPS} to use this API.
*
* @param packageNames The names of the packages to set the suspended status.
* @param suspended If set to {@code true}, the packages will be suspended, if set to
@@ -6005,7 +6087,7 @@ public abstract class PackageManager {
* #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
* SuspendDialogInfo) setPackagesSuspended}. The platform prevents suspending certain critical
* packages to keep the device in a functioning state, e.g. the default dialer.
- * Apps need to hold {@link Manifest.permission#SUSPEND_APPS SUSPEND_APPS} to call this api.
+ * Apps need to hold {@link Manifest.permission#SUSPEND_APPS SUSPEND_APPS} to call this API.
*
* <p>
* Note that this set of critical packages can change with time, so even though a package name
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 83979e925be1..c7320b0d6ccf 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -55,6 +55,7 @@ public abstract class PackageManagerInternal {
public static final int PACKAGE_PERMISSION_CONTROLLER = 6;
public static final int PACKAGE_WELLBEING = 7;
public static final int PACKAGE_DOCUMENTER = 8;
+ public static final int PACKAGE_CONFIGURATOR = 9;
@IntDef(value = {
PACKAGE_SYSTEM,
PACKAGE_SETUP_WIZARD,
@@ -65,6 +66,7 @@ public abstract class PackageManagerInternal {
PACKAGE_PERMISSION_CONTROLLER,
PACKAGE_WELLBEING,
PACKAGE_DOCUMENTER,
+ PACKAGE_CONFIGURATOR,
})
@Retention(RetentionPolicy.SOURCE)
public @interface KnownPackage {}
@@ -137,6 +139,12 @@ public abstract class PackageManagerInternal {
public abstract void setLocationPackagesProvider(PackagesProvider provider);
/**
+ * Set the location extra packages provider.
+ * @param provider The packages provider.
+ */
+ public abstract void setLocationExtraPackagesProvider(PackagesProvider provider);
+
+ /**
* Sets the voice interaction packages provider.
* @param provider The packages provider.
*/
@@ -284,6 +292,17 @@ public abstract class PackageManagerInternal {
public abstract SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, int userId);
/**
+ * Gets any distraction flags set via
+ * {@link PackageManager#setDistractingPackageRestrictions(String[], int)}
+ *
+ * @param packageName
+ * @param userId
+ * @return A bitwise OR of any of the {@link PackageManager.DistractionRestriction}
+ */
+ public abstract @PackageManager.DistractionRestriction int getDistractingPackageRestrictions(
+ String packageName, int userId);
+
+ /**
* Do a straight uid lookup for the given package/application in the given user.
* @see PackageManager#getPackageUidAsUser(String, int, int)
* @return The app's uid, or < 0 if the package was not found in that user
@@ -803,4 +822,9 @@ public abstract class PackageManagerInternal {
* PACKAGE_ROLLBACK_AGENT permission.
*/
public abstract void setEnableRollbackCode(int token, int enableRollbackCode);
+
+ /**
+ * Ask the package manager to compile layouts in the given package.
+ */
+ public abstract boolean compileLayouts(String packageName);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 2b266b730485..a185c8a60f9b 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -689,6 +689,7 @@ public class PackageParser {
pi.restrictedAccountType = p.mRestrictedAccountType;
pi.requiredAccountType = p.mRequiredAccountType;
pi.overlayTarget = p.mOverlayTarget;
+ pi.overlayTargetName = p.mOverlayTargetName;
pi.overlayCategory = p.mOverlayCategory;
pi.overlayPriority = p.mOverlayPriority;
pi.mOverlayIsStatic = p.mOverlayIsStatic;
@@ -1621,7 +1622,7 @@ public class PackageParser {
}
final AttributeSet attrs = parser;
- return parseApkLite(apkPath, parser, attrs, signingDetails);
+ return parseApkLite(apkPath, parser, attrs, signingDetails, flags);
} catch (XmlPullParserException | IOException | RuntimeException e) {
Slog.w(TAG, "Failed to parse " + apkPath, e);
@@ -1708,7 +1709,7 @@ public class PackageParser {
}
private static ApkLite parseApkLite(String codePath, XmlPullParser parser, AttributeSet attrs,
- SigningDetails signingDetails)
+ SigningDetails signingDetails, int flags)
throws IOException, XmlPullParserException, PackageParserException {
final Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs);
@@ -1716,11 +1717,12 @@ public class PackageParser {
int versionCode = 0;
int versionCodeMajor = 0;
int revisionCode = 0;
+ int targetSdkVersion = 0;
boolean coreApp = false;
boolean debuggable = false;
boolean multiArch = false;
boolean use32bitAbi = false;
- boolean extractNativeLibs = true;
+ Boolean extractNativeLibsProvided = null;
boolean isolatedSplits = false;
boolean isFeatureSplit = false;
boolean isSplitRequired = false;
@@ -1785,7 +1787,8 @@ public class PackageParser {
use32bitAbi = attrs.getAttributeBooleanValue(i, false);
}
if ("extractNativeLibs".equals(attr)) {
- extractNativeLibs = attrs.getAttributeBooleanValue(i, true);
+ extractNativeLibsProvided = Boolean.valueOf(
+ attrs.getAttributeBooleanValue(i, true));
}
if ("preferCodeIntegrity".equals(attr)) {
preferCodeIntegrity = attrs.getAttributeBooleanValue(i, false);
@@ -1803,9 +1806,51 @@ public class PackageParser {
PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
"<uses-split> tag requires 'android:name' attribute");
}
+ } else if (TAG_USES_SDK.equals(parser.getName())) {
+ final String[] errorMsg = new String[1];
+ Pair<Integer, Integer> versions = deriveSdkVersions(new AbstractVersionsAccessor() {
+ @Override public String getMinSdkVersionCode() {
+ return getAttributeAsString("minSdkVersion");
+ }
+
+ @Override public int getMinSdkVersion() {
+ return getAttributeAsInt("minSdkVersion");
+ }
+
+ @Override public String getTargetSdkVersionCode() {
+ return getAttributeAsString("targetSdkVersion");
+ }
+
+ @Override public int getTargetSdkVersion() {
+ return getAttributeAsInt("targetSdkVersion");
+ }
+
+ private String getAttributeAsString(String name) {
+ return attrs.getAttributeValue(ANDROID_RESOURCES, name);
+ }
+
+ private int getAttributeAsInt(String name) {
+ try {
+ return attrs.getAttributeIntValue(ANDROID_RESOURCES, name, -1);
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+ }, flags, errorMsg);
+
+ if (versions == null) {
+ throw new PackageParserException(
+ PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, errorMsg[0]);
+ }
+
+ targetSdkVersion = versions.second;
}
}
+ final boolean extractNativeLibsDefault = targetSdkVersion < Build.VERSION_CODES.Q;
+ final boolean extractNativeLibs = (extractNativeLibsProvided != null)
+ ? extractNativeLibsProvided : extractNativeLibsDefault;
+
if (preferCodeIntegrity && extractNativeLibs) {
throw new PackageParserException(
PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
@@ -2078,6 +2123,8 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestResourceOverlay);
pkg.mOverlayTarget = sa.getString(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_targetPackage);
+ pkg.mOverlayTargetName = sa.getString(
+ com.android.internal.R.styleable.AndroidManifestResourceOverlay_targetName);
pkg.mOverlayCategory = sa.getString(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_category);
pkg.mOverlayPriority = sa.getInt(
@@ -2215,65 +2262,60 @@ public class PackageParser {
} else if (tagName.equals(TAG_USES_SDK)) {
if (SDK_VERSION > 0) {
- sa = res.obtainAttributes(parser,
- com.android.internal.R.styleable.AndroidManifestUsesSdk);
-
- int minVers = 1;
- String minCode = null;
- int targetVers = 0;
- String targetCode = null;
-
- TypedValue val = sa.peekValue(
- com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
- if (val != null) {
- if (val.type == TypedValue.TYPE_STRING && val.string != null) {
- minCode = val.string.toString();
- } else {
- // If it's not a string, it's an integer.
- minVers = val.data;
- }
- }
-
- val = sa.peekValue(
- com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
- if (val != null) {
- if (val.type == TypedValue.TYPE_STRING && val.string != null) {
- targetCode = val.string.toString();
- if (minCode == null) {
- minCode = targetCode;
- }
- } else {
- // If it's not a string, it's an integer.
- targetVers = val.data;
- }
- } else {
- targetVers = minVers;
- targetCode = minCode;
- }
-
- sa.recycle();
-
- final int minSdkVersion = PackageParser.computeMinSdkVersion(minVers, minCode,
- SDK_VERSION, SDK_CODENAMES, outError);
- if (minSdkVersion < 0) {
+ sa = res.obtainAttributes(parser, R.styleable.AndroidManifestUsesSdk);
+ final TypedArray saFinal = sa;
+ Pair<Integer, Integer> versions = deriveSdkVersions(
+ new AbstractVersionsAccessor() {
+ @Override public String getMinSdkVersionCode() {
+ return getAttributeAsString(
+ R.styleable.AndroidManifestUsesSdk_minSdkVersion);
+ }
+
+ @Override public int getMinSdkVersion() {
+ return getAttributeAsInt(
+ R.styleable.AndroidManifestUsesSdk_minSdkVersion);
+ }
+
+ @Override public String getTargetSdkVersionCode() {
+ return getAttributeAsString(
+ R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
+ }
+
+ @Override public int getTargetSdkVersion() {
+ return getAttributeAsInt(
+ R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
+ }
+
+ private String getAttributeAsString(int index) {
+ TypedValue val = saFinal.peekValue(index);
+ if (val != null && val.type == TypedValue.TYPE_STRING
+ && val.string != null) {
+ return val.string.toString();
+ }
+ return null;
+ }
+
+ private int getAttributeAsInt(int index) {
+ TypedValue val = saFinal.peekValue(index);
+ if (val != null && val.type != TypedValue.TYPE_STRING) {
+ // If it's not a string, it's an integer.
+ return val.data;
+ }
+ return -1;
+ }
+ }, flags, outError);
+
+ if (versions == null) {
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
}
- boolean defaultToCurrentDevBranch = (flags & PARSE_FORCE_SDK) != 0;
- final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers,
- targetCode, SDK_CODENAMES, outError, defaultToCurrentDevBranch);
- if (targetSdkVersion < 0) {
- mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
- return null;
- }
+ pkg.applicationInfo.minSdkVersion = versions.first;
+ pkg.applicationInfo.targetSdkVersion = versions.second;
- pkg.applicationInfo.minSdkVersion = minSdkVersion;
- pkg.applicationInfo.targetSdkVersion = targetSdkVersion;
+ sa.recycle();
}
-
XmlUtils.skipCurrentTag(parser);
-
} else if (tagName.equals(TAG_SUPPORT_SCREENS)) {
sa = res.obtainAttributes(parser,
com.android.internal.R.styleable.AndroidManifestSupportsScreens);
@@ -2617,6 +2659,23 @@ public class PackageParser {
}
/**
+ * Matches a given {@code targetCode} against a set of release codeNames. Target codes can
+ * either be of the form {@code [codename]}" (e.g {@code "Q"}) or of the form
+ * {@code [codename].[fingerprint]} (e.g {@code "Q.cafebc561"}).
+ */
+ private static boolean matchTargetCode(@NonNull String[] codeNames,
+ @NonNull String targetCode) {
+ final String targetCodeName;
+ final int targetCodeIdx = targetCode.indexOf('.');
+ if (targetCodeIdx == -1) {
+ targetCodeName = targetCode;
+ } else {
+ targetCodeName = targetCode.substring(0, targetCodeIdx);
+ }
+ return ArrayUtils.contains(codeNames, targetCodeName);
+ }
+
+ /**
* Computes the targetSdkVersion to use at runtime. If the package is not
* compatible with this platform, populates {@code outError[0]} with an
* error message.
@@ -2659,7 +2718,7 @@ public class PackageParser {
// If it's a pre-release SDK and the codename matches this platform, it
// definitely targets this SDK.
- if (ArrayUtils.contains(platformSdkCodenames, targetCode) || forceCurrentDev) {
+ if (matchTargetCode(platformSdkCodenames, targetCode) || forceCurrentDev) {
return Build.VERSION_CODES.CUR_DEVELOPMENT;
}
@@ -2675,6 +2734,67 @@ public class PackageParser {
return -1;
}
+ private interface AbstractVersionsAccessor {
+ /** Returns minimum SDK version code string, or null if absent. */
+ String getMinSdkVersionCode();
+
+ /** Returns minimum SDK version code, or -1 if absent. */
+ int getMinSdkVersion();
+
+ /** Returns target SDK version code string, or null if absent. */
+ String getTargetSdkVersionCode();
+
+ /** Returns target SDK version code, or -1 if absent. */
+ int getTargetSdkVersion();
+ }
+
+ private static @Nullable Pair<Integer, Integer> deriveSdkVersions(
+ @NonNull AbstractVersionsAccessor accessor, int flags, String[] outError) {
+ int minVers = 1;
+ String minCode = null;
+ int targetVers = 0;
+ String targetCode = null;
+
+ String code = accessor.getMinSdkVersionCode();
+ int version = accessor.getMinSdkVersion();
+ // Check integer first since code is almost never a null string (e.g. "28").
+ if (version >= 0) {
+ minVers = version;
+ } else if (code != null) {
+ minCode = code;
+ }
+
+ code = accessor.getTargetSdkVersionCode();
+ version = accessor.getTargetSdkVersion();
+ // Check integer first since code is almost never a null string (e.g. "28").
+ if (version >= 0) {
+ targetVers = version;
+ } else if (code != null) {
+ targetCode = code;
+ if (minCode == null) {
+ minCode = targetCode;
+ }
+ } else {
+ targetVers = minVers;
+ targetCode = minCode;
+ }
+
+ final int minSdkVersion = computeMinSdkVersion(minVers, minCode,
+ SDK_VERSION, SDK_CODENAMES, outError);
+ if (minSdkVersion < 0) {
+ return null;
+ }
+
+ boolean defaultToCurrentDevBranch = (flags & PARSE_FORCE_SDK) != 0;
+ final int targetSdkVersion = computeTargetSdkVersion(targetVers,
+ targetCode, SDK_CODENAMES, outError, defaultToCurrentDevBranch);
+ if (targetSdkVersion < 0) {
+ return null;
+ }
+
+ return Pair.create(minSdkVersion, targetSdkVersion);
+ }
+
/**
* Computes the minSdkVersion to use at runtime. If the package is not
* compatible with this platform, populates {@code outError[0]} with an
@@ -2731,7 +2851,7 @@ public class PackageParser {
// If it's a pre-release SDK and the codename matches this platform, we
// definitely meet the minimum SDK requirement.
- if (ArrayUtils.contains(platformSdkCodenames, minCode)) {
+ if (matchTargetCode(platformSdkCodenames, minCode)) {
return Build.VERSION_CODES.CUR_DEVELOPMENT;
}
@@ -3660,9 +3780,11 @@ public class PackageParser {
ai.flags |= ApplicationInfo.FLAG_MULTIARCH;
}
+ final boolean extractNativeLibsDefault =
+ owner.applicationInfo.targetSdkVersion < Build.VERSION_CODES.Q;
if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestApplication_extractNativeLibs,
- true)) {
+ extractNativeLibsDefault)) {
ai.flags |= ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS;
}
@@ -4546,6 +4668,9 @@ public class PackageParser {
a.info.flags |= ActivityInfo.FLAG_TURN_SCREEN_ON;
}
+ if (sa.getBoolean(R.styleable.AndroidManifestActivity_inheritShowWhenLocked, false)) {
+ a.info.privateFlags |= ActivityInfo.FLAG_INHERIT_SHOW_WHEN_LOCKED;
+ }
} else {
a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
a.info.configChanges = 0;
@@ -4925,6 +5050,7 @@ public class PackageParser {
info.targetActivity = targetActivity;
info.configChanges = target.info.configChanges;
info.flags = target.info.flags;
+ info.privateFlags = target.info.privateFlags;
info.icon = target.info.icon;
info.logo = target.info.logo;
info.banner = target.info.banner;
@@ -6607,6 +6733,7 @@ public class PackageParser {
public String mRequiredAccountType;
public String mOverlayTarget;
+ public String mOverlayTargetName;
public String mOverlayCategory;
public int mOverlayPriority;
public boolean mOverlayIsStatic;
@@ -7130,6 +7257,7 @@ public class PackageParser {
mRestrictedAccountType = dest.readString();
mRequiredAccountType = dest.readString();
mOverlayTarget = dest.readString();
+ mOverlayTargetName = dest.readString();
mOverlayCategory = dest.readString();
mOverlayPriority = dest.readInt();
mOverlayIsStatic = (dest.readInt() == 1);
@@ -7257,6 +7385,7 @@ public class PackageParser {
dest.writeString(mRestrictedAccountType);
dest.writeString(mRequiredAccountType);
dest.writeString(mOverlayTarget);
+ dest.writeString(mOverlayTargetName);
dest.writeString(mOverlayCategory);
dest.writeInt(mOverlayPriority);
dest.writeInt(mOverlayIsStatic ? 1 : 0);
@@ -8361,4 +8490,42 @@ public class PackageParser {
this.error = error;
}
}
+
+ public static PackageInfo generatePackageInfoFromApex(File apexFile, boolean collectCerts)
+ throws PackageParserException {
+ PackageInfo pi = new PackageInfo();
+ // TODO(b/123052859): We should avoid these repeated calls to parseApkLite each time
+ // we want to generate information for APEX modules.
+ PackageParser.ApkLite apk = PackageParser.parseApkLite(apexFile,
+ collectCerts ? PackageParser.PARSE_COLLECT_CERTIFICATES : 0);
+
+ pi.packageName = apk.packageName;
+ pi.setLongVersionCode(apk.getLongVersionCode());
+
+ if (collectCerts) {
+ if (apk.signingDetails.hasPastSigningCertificates()) {
+ // Package has included signing certificate rotation information. Return
+ // the oldest cert so that programmatic checks keep working even if unaware
+ // of key rotation.
+ pi.signatures = new Signature[1];
+ pi.signatures[0] = apk.signingDetails.pastSigningCertificates[0];
+ } else if (apk.signingDetails.hasSignatures()) {
+ // otherwise keep old behavior
+ int numberOfSigs = apk.signingDetails.signatures.length;
+ pi.signatures = new Signature[numberOfSigs];
+ System.arraycopy(apk.signingDetails.signatures, 0, pi.signatures, 0,
+ numberOfSigs);
+ }
+
+ if (apk.signingDetails != SigningDetails.UNKNOWN) {
+ // only return a valid SigningInfo if there is signing information to report
+ pi.signingInfo = new SigningInfo(apk.signingDetails);
+ } else {
+ pi.signingInfo = null;
+ }
+ }
+
+ pi.isApex = true;
+ return pi;
+ }
}
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index be6ed51e3c89..249b6919fc28 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -29,8 +29,11 @@ import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import android.annotation.UnsupportedAppUsage;
import android.os.BaseBundle;
+import android.os.Debug;
import android.os.PersistableBundle;
import android.util.ArraySet;
+import android.util.DebugUtils;
+import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -43,11 +46,15 @@ import java.util.Objects;
* @hide
*/
public class PackageUserState {
+ private static final boolean DEBUG = false;
+ private static final String LOG_TAG = "PackageUserState";
+
public long ceDataInode;
public boolean installed;
public boolean stopped;
public boolean notLaunched;
public boolean hidden; // Is the app restricted by owner / admin
+ public int distractionFlags;
public boolean suspended;
public String suspendingPackage;
public SuspendDialogInfo dialogInfo;
@@ -86,6 +93,7 @@ public class PackageUserState {
stopped = o.stopped;
notLaunched = o.notLaunched;
hidden = o.hidden;
+ distractionFlags = o.distractionFlags;
suspended = o.suspended;
suspendingPackage = o.suspendingPackage;
dialogInfo = o.dialogInfo;
@@ -132,12 +140,12 @@ public class PackageUserState {
final boolean isSystemApp = componentInfo.applicationInfo.isSystemApp();
final boolean matchUninstalled = (flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0;
if (!isAvailable(flags)
- && !(isSystemApp && matchUninstalled)) return false;
- if (!isEnabled(componentInfo, flags)) return false;
+ && !(isSystemApp && matchUninstalled)) return reportIfDebug(false, flags);
+ if (!isEnabled(componentInfo, flags)) return reportIfDebug(false, flags);
if ((flags & MATCH_SYSTEM_ONLY) != 0) {
if (!isSystemApp) {
- return false;
+ return reportIfDebug(false, flags);
}
}
@@ -145,7 +153,16 @@ public class PackageUserState {
&& !componentInfo.directBootAware;
final boolean matchesAware = ((flags & MATCH_DIRECT_BOOT_AWARE) != 0)
&& componentInfo.directBootAware;
- return matchesUnaware || matchesAware;
+ return reportIfDebug(matchesUnaware || matchesAware, flags);
+ }
+
+ private boolean reportIfDebug(boolean result, int flags) {
+ if (DEBUG && !result) {
+ Slog.i(LOG_TAG, "No match!; flags: "
+ + DebugUtils.flagsToString(PackageManager.class, "MATCH_", flags) + " "
+ + Debug.getCaller());
+ }
+ return result;
}
/**
@@ -207,6 +224,9 @@ public class PackageUserState {
if (hidden != oldState.hidden) {
return false;
}
+ if (distractionFlags != oldState.distractionFlags) {
+ return false;
+ }
if (suspended != oldState.suspended) {
return false;
}
diff --git a/core/java/android/content/pm/PermissionGroupInfo.java b/core/java/android/content/pm/PermissionGroupInfo.java
index 8cf66d81972f..f21612a58a53 100644
--- a/core/java/android/content/pm/PermissionGroupInfo.java
+++ b/core/java/android/content/pm/PermissionGroupInfo.java
@@ -49,7 +49,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
* only access while in the foreground.
*
* From the "requestDetail" attribute or, if not set, {@link
- * android.content.res.ResourceId#ID_NULL}.
+ * android.content.res.Resources#ID_NULL}.
*
* @hide
*/
@@ -61,7 +61,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
* access. Also used when requesting both foreground and background access.
*
* From the "backgroundRequest" attribute or, if not set, {@link
- * android.content.res.ResourceId#ID_NULL}.
+ * android.content.res.Resources#ID_NULL}.
*
* @hide
*/
@@ -73,7 +73,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
* background access.
*
* From the "backgroundRequestDetail" attribute or, if not set, {@link
- * android.content.res.ResourceId#ID_NULL}.
+ * android.content.res.Resources#ID_NULL}.
*
* @hide
*/
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index bb8c92dba71a..5d2cf0a7d101 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -158,6 +158,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
* @hide
*/
@SystemApi
+ @TestApi
public static final int PROTECTION_FLAG_OEM = 0x4000;
/**
@@ -202,6 +203,16 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
@TestApi
public static final int PROTECTION_FLAG_DOCUMENTER = 0x40000;
+ /**
+ * Additional flag for {@link #protectionLevel}, corresponding to the
+ * {@code configurator} value of {@link android.R.attr#protectionLevel}.
+ *
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public static final int PROTECTION_FLAG_CONFIGURATOR = 0x80000;
+
/** @hide */
@IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = {
@@ -221,6 +232,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER,
PROTECTION_FLAG_WELLBEING,
PROTECTION_FLAG_DOCUMENTER,
+ PROTECTION_FLAG_CONFIGURATOR,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ProtectionFlags {}
@@ -416,6 +428,9 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
if ((level & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0) {
protLevel += "|documenter";
}
+ if ((level & PROTECTION_FLAG_CONFIGURATOR) != 0) {
+ protLevel += "|configurator";
+ }
return protLevel;
}
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index a8c3b889421b..6e519c1863e8 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -475,6 +475,14 @@ public abstract class RegisteredServicesCache<V> {
final List<ResolveInfo> resolveInfos = queryIntentServices(userId);
for (ResolveInfo resolveInfo : resolveInfos) {
try {
+ // if this package is not one of those changedUids, we don't need to scan it,
+ // since nothing in it changed, so save a call to parseServiceInfo, which
+ // can cause a large amount of the package apk to be loaded into memory.
+ // if this is the initial scan, changedUids will be null, and containsUid will
+ // trivially return true, and will call parseServiceInfo
+ if (!containsUid(changedUids, resolveInfo.serviceInfo.applicationInfo.uid)) {
+ continue;
+ }
ServiceInfo<V> info = parseServiceInfo(resolveInfo);
if (info == null) {
Log.w(TAG, "Unable to load service info " + resolveInfo.toString());
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index 701c5dbc8398..894de94a47a0 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -16,6 +16,7 @@
package android.content.pm;
+import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.IntentFilter;
@@ -175,9 +176,12 @@ public class ResolveInfo implements Parcelable {
public boolean system;
/**
- * @hide Does the associated IntentFilter comes from a Browser ?
+ * Will be set to {@code true} if the {@link IntentFilter} responsible for intent
+ * resolution is classified as a "browser".
+ *
+ * @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public boolean handleAllWebDataURI;
/** {@hide} */
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index ec2e2fd474a2..fe68b8a048c2 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.annotation.UserIdInt;
+import android.app.Person;
import android.app.TaskStackBuilder;
import android.content.ComponentName;
import android.content.Context;
@@ -111,6 +112,9 @@ public final class ShortcutInfo implements Parcelable {
public static final int FLAG_SHADOW = 1 << 12;
/** @hide */
+ public static final int FLAG_LONG_LIVED = 1 << 13;
+
+ /** @hide */
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
FLAG_DYNAMIC,
FLAG_PINNED,
@@ -124,6 +128,8 @@ public final class ShortcutInfo implements Parcelable {
FLAG_ADAPTIVE_BITMAP,
FLAG_RETURNED_BY_SERVICE,
FLAG_ICON_FILE_PENDING_SAVE,
+ FLAG_SHADOW,
+ FLAG_LONG_LIVED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ShortcutFlags {}
@@ -344,6 +350,9 @@ public final class ShortcutInfo implements Parcelable {
@Nullable
private PersistableBundle[] mIntentPersistableExtrases;
+ @Nullable
+ private Person[] mPersons;
+
private int mRank;
/**
@@ -399,6 +408,10 @@ public final class ShortcutInfo implements Parcelable {
mCategories = cloneCategories(b.mCategories);
mIntents = cloneIntents(b.mIntents);
fixUpIntentExtras();
+ mPersons = clonePersons(b.mPersons);
+ if (b.mIsLongLived) {
+ setLongLived();
+ }
mRank = b.mRank;
mExtras = b.mExtras;
updateTimestamp();
@@ -465,6 +478,20 @@ public final class ShortcutInfo implements Parcelable {
return ret;
}
+ private static Person[] clonePersons(Person[] persons) {
+ if (persons == null) {
+ return null;
+ }
+ final Person[] ret = new Person[persons.length];
+ for (int i = 0; i < ret.length; i++) {
+ if (persons[i] != null) {
+ // Don't need to keep the icon, remove it to save space
+ ret[i] = persons[i].toBuilder().setIcon(null).build();
+ }
+ }
+ return ret;
+ }
+
/**
* Throws if any of the mandatory fields is not set.
*
@@ -511,6 +538,7 @@ public final class ShortcutInfo implements Parcelable {
mDisabledMessage = source.mDisabledMessage;
mDisabledMessageResId = source.mDisabledMessageResId;
mCategories = cloneCategories(source.mCategories);
+ mPersons = clonePersons(source.mPersons);
if ((cloneFlags & CLONE_REMOVE_INTENT) == 0) {
mIntents = cloneIntents(source.mIntents);
mIntentPersistableExtrases =
@@ -833,6 +861,9 @@ public final class ShortcutInfo implements Parcelable {
if (source.mCategories != null) {
mCategories = cloneCategories(source.mCategories);
}
+ if (source.mPersons != null) {
+ mPersons = clonePersons(source.mPersons);
+ }
if (source.mIntents != null) {
mIntents = cloneIntents(source.mIntents);
mIntentPersistableExtrases =
@@ -901,6 +932,10 @@ public final class ShortcutInfo implements Parcelable {
private Intent[] mIntents;
+ private Person[] mPersons;
+
+ private boolean mIsLongLived;
+
private int mRank = RANK_NOT_SET;
private PersistableBundle mExtras;
@@ -1165,6 +1200,53 @@ public final class ShortcutInfo implements Parcelable {
}
/**
+ * Add a person that is relevant to this shortcut. Alternatively,
+ * {@link #setPersons(Person[])} can be used to add multiple persons to a shortcut.
+ *
+ * <p> This is an optional field, but the addition of person may cause this shortcut to
+ * appear more prominently in the user interface (e.g. ShareSheet).
+ *
+ * <p> A person should usually contain a uri in order to benefit from the ranking boost.
+ * However, even if no uri is provided, it's beneficial to provide people in the shortcut,
+ * such that listeners and voice only devices can announce and handle them properly.
+ *
+ * @see Person
+ * @see #setPersons(Person[])
+ */
+ @NonNull
+ public Builder setPerson(@NonNull Person person) {
+ return setPersons(new Person[]{person});
+ }
+
+ /**
+ * Sets multiple persons instead of a single person.
+ *
+ * @see Person
+ * @see #setPerson(Person)
+ */
+ @NonNull
+ public Builder setPersons(@NonNull Person[] persons) {
+ Preconditions.checkNotNull(persons, "persons cannot be null");
+ Preconditions.checkNotNull(persons.length, "persons cannot be empty");
+ for (Person person : persons) {
+ Preconditions.checkNotNull(person, "persons cannot contain null");
+ }
+ mPersons = clonePersons(persons);
+ return this;
+ }
+
+ /**
+ * Sets if a shortcut would be valid even if it has been unpublished/invisible by the app
+ * (as a dynamic or pinned shortcut). If it is long lived, it can be cached by various
+ * system services even after it has been unpublished as a dynamic shortcut.
+ */
+ @NonNull
+ public Builder setLongLived() {
+ mIsLongLived = true;
+ return this;
+ }
+
+ /**
* "Rank" of a shortcut, which is a non-negative value that's used by the launcher app
* to sort shortcuts.
*
@@ -1395,6 +1477,16 @@ public final class ShortcutInfo implements Parcelable {
}
/**
+ * Return the Persons set with {@link Builder#setPersons(Person[])}.
+ *
+ * @hide
+ */
+ @Nullable
+ public Person[] getPersons() {
+ return clonePersons(mPersons);
+ }
+
+ /**
* The extras in the intents. We convert extras into {@link PersistableBundle} so we can
* persist them.
* @hide
@@ -1525,6 +1617,16 @@ public final class ShortcutInfo implements Parcelable {
addFlags(FLAG_RETURNED_BY_SERVICE);
}
+ /** @hide */
+ public boolean isLongLived() {
+ return hasFlags(FLAG_LONG_LIVED);
+ }
+
+ /** @hide */
+ public void setLongLived() {
+ addFlags(FLAG_LONG_LIVED);
+ }
+
/** Return whether a shortcut is dynamic. */
public boolean isDynamic() {
return hasFlags(FLAG_DYNAMIC);
@@ -1893,6 +1995,8 @@ public final class ShortcutInfo implements Parcelable {
mCategories.add(source.readString().intern());
}
}
+
+ mPersons = source.readParcelableArray(cl, Person.class);
}
@Override
@@ -1940,6 +2044,8 @@ public final class ShortcutInfo implements Parcelable {
} else {
dest.writeInt(0);
}
+
+ dest.writeParcelableArray(mPersons, flags);
}
public static final Creator<ShortcutInfo> CREATOR =
@@ -2040,6 +2146,9 @@ public final class ShortcutInfo implements Parcelable {
if (isReturnedByServer()) {
sb.append("Rets");
}
+ if (isLongLived()) {
+ sb.append("Liv");
+ }
sb.append("]");
addIndentOrComma(sb, indent);
@@ -2094,6 +2203,11 @@ public final class ShortcutInfo implements Parcelable {
addIndentOrComma(sb, indent);
+ sb.append("persons=");
+ sb.append(mPersons);
+
+ addIndentOrComma(sb, indent);
+
sb.append("icon=");
sb.append(mIcon);
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index 2d590033259f..4f7acd96aa6b 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -17,17 +17,22 @@ package android.content.pm;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.annotation.UserIdInt;
import android.app.usage.UsageStatsManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.IntentSender;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.os.Build;
import android.os.Build.VERSION_CODES;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -549,4 +554,85 @@ public class ShortcutManager {
protected int injectMyUserId() {
return mContext.getUserId();
}
+
+ /**
+ * Used by framework's ShareSheet (ChooserActivity.java) to retrieve all of the direct share
+ * targets that match the given IntentFilter.
+ *
+ * @param filter IntentFilter that will be used to retrieve the matching {@link ShortcutInfo}s.
+ * @return List of {@link ShareShortcutInfo}s that match the given IntentFilter.
+ * @hide
+ */
+ @NonNull
+ @SystemApi
+ public List<ShareShortcutInfo> getShareTargets(@NonNull IntentFilter filter) {
+ try {
+ return mService.getShareTargets(mContext.getPackageName(), filter,
+ injectMyUserId()).getList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Represents the result of a query return by {@link #getShareTargets(IntentFilter)}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class ShareShortcutInfo implements Parcelable {
+ private final ShortcutInfo mShortcutInfo;
+ private final ComponentName mTargetComponent;
+
+ /**
+ * @hide
+ */
+ public ShareShortcutInfo(@NonNull ShortcutInfo shortcutInfo,
+ @NonNull ComponentName targetComponent) {
+ if (shortcutInfo == null) {
+ throw new NullPointerException("shortcut info is null");
+ }
+ if (targetComponent == null) {
+ throw new NullPointerException("target component is null");
+ }
+
+ mShortcutInfo = shortcutInfo;
+ mTargetComponent = targetComponent;
+ }
+
+ private ShareShortcutInfo(Parcel in) {
+ mShortcutInfo = in.readParcelable(ShortcutInfo.class.getClassLoader());
+ mTargetComponent = in.readParcelable(ComponentName.class.getClassLoader());
+ }
+
+ public ShortcutInfo getShortcutInfo() {
+ return mShortcutInfo;
+ }
+
+ public ComponentName getTargetComponent() {
+ return mTargetComponent;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(mShortcutInfo, flags);
+ dest.writeParcelable(mTargetComponent, flags);
+ }
+
+ public static final Parcelable.Creator<ShareShortcutInfo> CREATOR =
+ new Parcelable.Creator<ShareShortcutInfo>() {
+ public ShareShortcutInfo createFromParcel(Parcel in) {
+ return new ShareShortcutInfo(in);
+ }
+
+ public ShareShortcutInfo[] newArray(int size) {
+ return new ShareShortcutInfo[size];
+ }
+ };
+ }
}
diff --git a/core/java/android/content/pm/SuspendDialogInfo.java b/core/java/android/content/pm/SuspendDialogInfo.java
index c798c99fed90..53b52f535fa0 100644
--- a/core/java/android/content/pm/SuspendDialogInfo.java
+++ b/core/java/android/content/pm/SuspendDialogInfo.java
@@ -16,7 +16,7 @@
package android.content.pm;
-import static android.content.res.ResourceId.ID_NULL;
+import static android.content.res.Resources.ID_NULL;
import android.annotation.DrawableRes;
import android.annotation.NonNull;
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index f1a4db25cd14..9e0a9ba0dc7b 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -732,6 +732,38 @@ public final class AssetManager implements AutoCloseable {
}
}
+ /**
+ * Enable resource resolution logging to track the steps taken to resolve the last resource
+ * entry retrieved. Stores the configuration and package names for each step.
+ *
+ * Default disabled.
+ *
+ * @param enabled Boolean indicating whether to enable or disable logging.
+ *
+ * @hide
+ */
+ public void setResourceResolutionLoggingEnabled(boolean enabled) {
+ synchronized (this) {
+ ensureValidLocked();
+ nativeSetResourceResolutionLoggingEnabled(mObject, enabled);
+ }
+ }
+
+ /**
+ * Retrieve the last resource resolution path logged.
+ *
+ * @return Formatted string containing last resource ID/name and steps taken to resolve final
+ * entry, including configuration and package names.
+ *
+ * @hide
+ */
+ public @Nullable String getLastResourceResolution() {
+ synchronized (this) {
+ ensureValidLocked();
+ return nativeGetLastResourceResolution(mObject);
+ }
+ }
+
CharSequence getPooledStringForCookie(int cookie, int id) {
// Cookies map to ApkAssets starting at 1.
return getApkAssets()[cookie - 1].getStringFromPool(id);
@@ -1383,6 +1415,8 @@ public final class AssetManager implements AutoCloseable {
private static native @Nullable String nativeGetResourceEntryName(long ptr, @AnyRes int resid);
private static native @Nullable String[] nativeGetLocales(long ptr, boolean excludeSystem);
private static native @Nullable Configuration[] nativeGetSizeConfigurations(long ptr);
+ private static native void nativeSetResourceResolutionLoggingEnabled(long ptr, boolean enabled);
+ private static native @Nullable String nativeGetLastResourceResolution(long ptr);
// Style attribute retrieval native methods.
private static native void nativeApplyStyle(long ptr, long themePtr, @AttrRes int defStyleAttr,
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 799f8e55cd18..536a1b7ab6e5 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -794,6 +794,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration
* {@link ActivityInfo#CONFIG_ASSETS_PATHS}.
* @hide
*/
+ @TestApi
public int assetsSeq;
/**
diff --git a/core/java/android/content/res/ResourceId.java b/core/java/android/content/res/ResourceId.java
index adb9cf1c8015..3c7b5fc11164 100644
--- a/core/java/android/content/res/ResourceId.java
+++ b/core/java/android/content/res/ResourceId.java
@@ -22,12 +22,6 @@ import android.annotation.AnyRes;
* @hide
*/
public final class ResourceId {
-
- /**
- * The {@code null} resource ID.
- */
- public static final @AnyRes int ID_NULL = 0;
-
/**
* Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
* <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 365ceac68ee1..baf64ad72a51 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -98,6 +98,12 @@ import java.util.ArrayList;
* href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</p>
*/
public class Resources {
+ /**
+ * The {@code null} resource ID. This denotes an invalid resource ID that is returned by the
+ * system when a resource is not found or the value is set to {@code @null} in XML.
+ */
+ public static final @AnyRes int ID_NULL = 0;
+
static final String TAG = "Resources";
private static final Object sSync = new Object();
@@ -168,7 +174,7 @@ public class Resources {
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
int dark, int deviceDefault) {
- if (curTheme != ResourceId.ID_NULL) {
+ if (curTheme != ID_NULL) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
@@ -2010,22 +2016,36 @@ public class Resources {
public String getResourceTypeName(@AnyRes int resid) throws NotFoundException {
return mResourcesImpl.getResourceTypeName(resid);
}
-
+
/**
* Return the entry name for a given resource identifier.
- *
+ *
* @param resid The resource identifier whose entry name is to be
* retrieved.
- *
+ *
* @return A string holding the entry name of the resource.
- *
+ *
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
- *
+ *
* @see #getResourceName
*/
public String getResourceEntryName(@AnyRes int resid) throws NotFoundException {
return mResourcesImpl.getResourceEntryName(resid);
}
+
+ /**
+ * Return formatted log of the last retrieved resource's resolution path.
+ *
+ * @return A string holding a formatted log of the steps taken to resolve the last resource.
+ *
+ * @throws NotFoundException Throws NotFoundException if there hasn't been a resource
+ * resolved yet.
+ *
+ * @hide
+ */
+ public String getLastResourceResolution() throws NotFoundException {
+ return mResourcesImpl.getLastResourceResolution();
+ }
/**
* Parse a series of {@link android.R.styleable#Extra &lt;extra&gt;} tags from
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 2ad4f625ef8c..d8564d570a4d 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -299,6 +299,13 @@ public class ResourcesImpl {
}
@NonNull
+ String getLastResourceResolution() throws NotFoundException {
+ String str = mAssets.getLastResourceResolution();
+ if (str != null) return str;
+ throw new NotFoundException("Associated AssetManager hasn't resolved a resource");
+ }
+
+ @NonNull
CharSequence getQuantityText(@PluralsRes int id, int quantity) throws NotFoundException {
PluralRules rule = getPluralRule();
CharSequence res = mAssets.getResourceBagText(id,
@@ -848,13 +855,9 @@ public class ResourcesImpl {
try {
if (file.endsWith(".xml")) {
if (file.startsWith("res/color/")) {
- ColorStateList csl = loadColorStateList(wrapper, value, id, null);
- dr = (csl != null ? new ColorStateListDrawable(csl) : null);
+ dr = loadColorOrXmlDrawable(wrapper, value, id, density, file);
} else {
- final XmlResourceParser rp = loadXmlResourceParser(
- file, id, value.assetCookie, "drawable");
- dr = Drawable.createFromXmlForDensity(wrapper, rp, density, null);
- rp.close();
+ dr = loadXmlDrawable(wrapper, value, id, density, file);
}
} else {
final InputStream is = mAssets.openNonAsset(
@@ -908,6 +911,33 @@ public class ResourcesImpl {
return dr;
}
+ private Drawable loadColorOrXmlDrawable(@NonNull Resources wrapper, @NonNull TypedValue value,
+ int id, int density, String file) {
+ try {
+ ColorStateList csl = loadColorStateList(wrapper, value, id, null);
+ return new ColorStateListDrawable(csl);
+ } catch (NotFoundException originalException) {
+ // If we fail to load as color, try as normal XML drawable
+ try {
+ return loadXmlDrawable(wrapper, value, id, density, file);
+ } catch (Exception ignored) {
+ // If fallback also fails, throw the original exception
+ throw originalException;
+ }
+ }
+ }
+
+ private Drawable loadXmlDrawable(@NonNull Resources wrapper, @NonNull TypedValue value,
+ int id, int density, String file)
+ throws IOException, XmlPullParserException {
+ try (
+ XmlResourceParser rp =
+ loadXmlResourceParser(file, id, value.assetCookie, "drawable")
+ ) {
+ return Drawable.createFromXmlForDensity(wrapper, rp, density, null);
+ }
+ }
+
/**
* Loads a font from XML or resources stream.
*/
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 508626bdd869..d53834c657cc 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -19,6 +19,7 @@ package android.content.res;
import android.annotation.AnyRes;
import android.annotation.ColorInt;
import android.annotation.Nullable;
+import android.annotation.StyleRes;
import android.annotation.StyleableRes;
import android.annotation.UnsupportedAppUsage;
import android.content.pm.ActivityInfo;
@@ -63,13 +64,15 @@ public class TypedArray {
}
// STYLE_ prefixed constants are offsets within the typed data array.
- static final int STYLE_NUM_ENTRIES = 6;
+ // Keep this in sync with libs/androidfw/include/androidfw/AttributeResolution.h
+ static final int STYLE_NUM_ENTRIES = 7;
static final int STYLE_TYPE = 0;
static final int STYLE_DATA = 1;
static final int STYLE_ASSET_COOKIE = 2;
static final int STYLE_RESOURCE_ID = 3;
static final int STYLE_CHANGING_CONFIGURATIONS = 4;
static final int STYLE_DENSITY = 5;
+ static final int SYTLE_SOURCE_STYLE_RESOURCE_ID = 6;
@UnsupportedAppUsage
private final Resources mResources;
@@ -1098,6 +1101,31 @@ public class TypedArray {
}
/**
+ * Returns the resource ID of the style against which the specified attribute was resolved,
+ * otherwise returns defValue.
+ *
+ * @param index Index of attribute whose source style to retrieve.
+ * @param defValue Value to return if the attribute is not defined or
+ * not a resource.
+ *
+ * @return Attribute source style resource ID or defValue if it was not resolved in any style.
+ * @throws RuntimeException if the TypedArray has already been recycled.
+ */
+ @StyleRes
+ public int getSourceStyleResourceId(@StyleableRes int index, @StyleRes int defValue) {
+ if (mRecycled) {
+ throw new RuntimeException("Cannot make calls to a recycled instance!");
+ }
+
+ index *= STYLE_NUM_ENTRIES;
+ final int resid = mData[index + SYTLE_SOURCE_STYLE_RESOURCE_ID];
+ if (resid != 0) {
+ return resid;
+ }
+ return defValue;
+ }
+
+ /**
* Determines whether there is an attribute at <var>index</var>.
* <p>
* <strong>Note:</strong> If the attribute was set to {@code @empty} or
@@ -1309,6 +1337,7 @@ public class TypedArray {
data[index + STYLE_CHANGING_CONFIGURATIONS]);
outValue.density = data[index + STYLE_DENSITY];
outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null;
+ outValue.sourceStyleResourceId = data[index + SYTLE_SOURCE_STYLE_RESOURCE_ID];
return true;
}
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index eb3414d2ca48..8aac1bfa1f8d 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -42,13 +42,13 @@ public class BiometricManager {
/**
* The hardware is unavailable. Try again later.
*/
- public static final int BIOMETRIC_ERROR_UNAVAILABLE =
+ public static final int BIOMETRIC_ERROR_HW_UNAVAILABLE =
BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE;
/**
* The user does not have any biometrics enrolled.
*/
- public static final int BIOMETRIC_ERROR_NO_BIOMETRICS =
+ public static final int BIOMETRIC_ERROR_NONE_ENROLLED =
BiometricConstants.BIOMETRIC_ERROR_NO_BIOMETRICS;
/**
@@ -58,8 +58,8 @@ public class BiometricManager {
BiometricConstants.BIOMETRIC_ERROR_HW_NOT_PRESENT;
@IntDef({BIOMETRIC_SUCCESS,
- BIOMETRIC_ERROR_UNAVAILABLE,
- BIOMETRIC_ERROR_NO_BIOMETRICS,
+ BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ BIOMETRIC_ERROR_NONE_ENROLLED,
BIOMETRIC_ERROR_NO_HARDWARE})
@interface BiometricError {}
@@ -95,8 +95,8 @@ public class BiometricManager {
* Determine if biometrics can be used. In other words, determine if {@link BiometricPrompt}
* can be expected to be shown (hardware available, templates enrolled, user-enabled).
*
- * @return Returns {@link #BIOMETRIC_ERROR_NO_BIOMETRICS} if the user does not have any
- * enrolled, or {@link #BIOMETRIC_ERROR_UNAVAILABLE} if none are currently
+ * @return Returns {@link #BIOMETRIC_ERROR_NONE_ENROLLED} if the user does not have any
+ * enrolled, or {@link #BIOMETRIC_ERROR_HW_UNAVAILABLE} if none are currently
* supported/enabled. Returns {@link #BIOMETRIC_SUCCESS} if a biometric can currently be
* used (enrolled and available).
*/
@@ -113,7 +113,7 @@ public class BiometricManager {
return BIOMETRIC_ERROR_NO_HARDWARE;
} else {
Slog.w(TAG, "hasEnrolledBiometrics(): Service not connected");
- return BIOMETRIC_ERROR_UNAVAILABLE;
+ return BIOMETRIC_ERROR_HW_UNAVAILABLE;
}
}
}
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index b238d778f55a..c69b68e4360a 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -73,6 +73,10 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @hide
*/
public static final String KEY_NEGATIVE_TEXT = "negative_text";
+ /**
+ * @hide
+ */
+ public static final String KEY_REQUIRE_CONFIRMATION = "require_confirmation";
/**
* Error/help message will show for this amount of time.
@@ -215,6 +219,29 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
}
/**
+ * Optional: A hint to the system to require user confirmation after a biometric has been
+ * authenticated. For example, implicit modalities like Face and Iris authentication are
+ * passive, meaning they don't require an explicit user action to complete. When set to
+ * 'false', the user action (e.g. pressing a button) will not be required. BiometricPrompt
+ * will require confirmation by default.
+ *
+ * A typical use case for not requiring confirmation would be for low-risk transactions,
+ * such as re-authenticating a recently authenticated application. A typical use case for
+ * requiring confirmation would be for authorizing a purchase.
+ *
+ * Note that this is a hint to the system. The system may choose to ignore the flag. For
+ * example, if the user disables implicit authentication in Settings, or if it does not
+ * apply to a modality (e.g. Fingerprint). When ignored, the system will default to
+ * requiring confirmation.
+ *
+ * @param requireConfirmation
+ */
+ public Builder setRequireConfirmation(boolean requireConfirmation) {
+ mBundle.putBoolean(KEY_REQUIRE_CONFIRMATION, requireConfirmation);
+ return this;
+ }
+
+ /**
* Creates a {@link BiometricPrompt}.
* @return a {@link BiometricPrompt}
* @throws IllegalArgumentException if any of the required fields are not set.
diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java
index 7e52ca331f9f..8c74ddc7698c 100644
--- a/core/java/android/hardware/display/BrightnessConfiguration.java
+++ b/core/java/android/hardware/display/BrightnessConfiguration.java
@@ -19,26 +19,54 @@ package android.hardware.display;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.content.pm.ApplicationInfo;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pair;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
/** @hide */
@SystemApi
@TestApi
public final class BrightnessConfiguration implements Parcelable {
+ private static final String TAG_BRIGHTNESS_CURVE = "brightness-curve";
+ private static final String TAG_BRIGHTNESS_POINT = "brightness-point";
+ private static final String TAG_BRIGHTNESS_CORRECTIONS = "brightness-corrections";
+ private static final String TAG_BRIGHTNESS_CORRECTION = "brightness-correction";
+ private static final String ATTR_LUX = "lux";
+ private static final String ATTR_NITS = "nits";
+ private static final String ATTR_DESCRIPTION = "description";
+ private static final String ATTR_PACKAGE_NAME = "package-name";
+ private static final String ATTR_CATEGORY = "category";
+
private final float[] mLux;
private final float[] mNits;
+ private final Map<String, BrightnessCorrection> mCorrectionsByPackageName;
+ private final Map<Integer, BrightnessCorrection> mCorrectionsByCategory;
private final String mDescription;
- private BrightnessConfiguration(float[] lux, float[] nits, String description) {
+ private BrightnessConfiguration(float[] lux, float[] nits,
+ Map<String, BrightnessCorrection> correctionsByPackageName,
+ Map<Integer, BrightnessCorrection> correctionsByCategory, String description) {
mLux = lux;
mNits = nits;
+ mCorrectionsByPackageName = correctionsByPackageName;
+ mCorrectionsByCategory = correctionsByCategory;
mDescription = description;
}
@@ -56,6 +84,33 @@ public final class BrightnessConfiguration implements Parcelable {
}
/**
+ * Returns a brightness correction by app, or null.
+ *
+ * @param packageName
+ * The app's package name.
+ *
+ * @return The matching brightness correction, or null.
+ *
+ */
+ @Nullable
+ public BrightnessCorrection getCorrectionByPackageName(String packageName) {
+ return mCorrectionsByPackageName.get(packageName);
+ }
+
+ /**
+ * Returns a brightness correction by app category, or null.
+ *
+ * @param category
+ * The app category.
+ *
+ * @return The matching brightness correction, or null.
+ */
+ @Nullable
+ public BrightnessCorrection getCorrectionByCategory(int category) {
+ return mCorrectionsByCategory.get(category);
+ }
+
+ /**
* Returns description string.
* @hide
*/
@@ -67,6 +122,20 @@ public final class BrightnessConfiguration implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloatArray(mLux);
dest.writeFloatArray(mNits);
+ dest.writeInt(mCorrectionsByPackageName.size());
+ for (Entry<String, BrightnessCorrection> entry : mCorrectionsByPackageName.entrySet()) {
+ final String packageName = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ dest.writeString(packageName);
+ correction.writeToParcel(dest, flags);
+ }
+ dest.writeInt(mCorrectionsByCategory.size());
+ for (Entry<Integer, BrightnessCorrection> entry : mCorrectionsByCategory.entrySet()) {
+ final int category = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ dest.writeInt(category);
+ correction.writeToParcel(dest, flags);
+ }
dest.writeString(mDescription);
}
@@ -85,7 +154,14 @@ public final class BrightnessConfiguration implements Parcelable {
}
sb.append("(").append(mLux[i]).append(", ").append(mNits[i]).append(")");
}
- sb.append("], '");
+ sb.append("], {");
+ for (Entry<String, BrightnessCorrection> entry : mCorrectionsByPackageName.entrySet()) {
+ sb.append("'" + entry.getKey() + "': " + entry.getValue() + ", ");
+ }
+ for (Entry<Integer, BrightnessCorrection> entry : mCorrectionsByCategory.entrySet()) {
+ sb.append(entry.getKey() + ": " + entry.getValue() + ", ");
+ }
+ sb.append("}, '");
if (mDescription != null) {
sb.append(mDescription);
}
@@ -98,6 +174,8 @@ public final class BrightnessConfiguration implements Parcelable {
int result = 1;
result = result * 31 + Arrays.hashCode(mLux);
result = result * 31 + Arrays.hashCode(mNits);
+ result = result * 31 + mCorrectionsByPackageName.hashCode();
+ result = result * 31 + mCorrectionsByCategory.hashCode();
if (mDescription != null) {
result = result * 31 + mDescription.hashCode();
}
@@ -114,6 +192,8 @@ public final class BrightnessConfiguration implements Parcelable {
}
final BrightnessConfiguration other = (BrightnessConfiguration) o;
return Arrays.equals(mLux, other.mLux) && Arrays.equals(mNits, other.mNits)
+ && mCorrectionsByPackageName.equals(other.mCorrectionsByPackageName)
+ && mCorrectionsByCategory.equals(other.mCorrectionsByCategory)
&& Objects.equals(mDescription, other.mDescription);
}
@@ -123,7 +203,25 @@ public final class BrightnessConfiguration implements Parcelable {
float[] lux = in.createFloatArray();
float[] nits = in.createFloatArray();
Builder builder = new Builder(lux, nits);
- builder.setDescription(in.readString());
+
+ int n = in.readInt();
+ for (int i = 0; i < n; i++) {
+ final String packageName = in.readString();
+ final BrightnessCorrection correction =
+ BrightnessCorrection.CREATOR.createFromParcel(in);
+ builder.addCorrectionByPackageName(packageName, correction);
+ }
+
+ n = in.readInt();
+ for (int i = 0; i < n; i++) {
+ final int category = in.readInt();
+ final BrightnessCorrection correction =
+ BrightnessCorrection.CREATOR.createFromParcel(in);
+ builder.addCorrectionByCategory(category, correction);
+ }
+
+ final String description = in.readString();
+ builder.setDescription(description);
return builder.build();
}
@@ -133,11 +231,146 @@ public final class BrightnessConfiguration implements Parcelable {
};
/**
+ * Writes the configuration to an XML serializer.
+ *
+ * @param serializer
+ * The XML serializer.
+ *
+ * @hide
+ */
+ public void saveToXml(XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_BRIGHTNESS_CURVE);
+ if (mDescription != null) {
+ serializer.attribute(null, ATTR_DESCRIPTION, mDescription);
+ }
+ for (int i = 0; i < mLux.length; i++) {
+ serializer.startTag(null, TAG_BRIGHTNESS_POINT);
+ serializer.attribute(null, ATTR_LUX, Float.toString(mLux[i]));
+ serializer.attribute(null, ATTR_NITS, Float.toString(mNits[i]));
+ serializer.endTag(null, TAG_BRIGHTNESS_POINT);
+ }
+ serializer.endTag(null, TAG_BRIGHTNESS_CURVE);
+ serializer.startTag(null, TAG_BRIGHTNESS_CORRECTIONS);
+ for (Map.Entry<String, BrightnessCorrection> entry :
+ mCorrectionsByPackageName.entrySet()) {
+ final String packageName = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ serializer.startTag(null, TAG_BRIGHTNESS_CORRECTION);
+ serializer.attribute(null, ATTR_PACKAGE_NAME, packageName);
+ correction.saveToXml(serializer);
+ serializer.endTag(null, TAG_BRIGHTNESS_CORRECTION);
+ }
+ for (Map.Entry<Integer, BrightnessCorrection> entry : mCorrectionsByCategory.entrySet()) {
+ final int category = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ serializer.startTag(null, TAG_BRIGHTNESS_CORRECTION);
+ serializer.attribute(null, ATTR_CATEGORY, Integer.toString(category));
+ correction.saveToXml(serializer);
+ serializer.endTag(null, TAG_BRIGHTNESS_CORRECTION);
+ }
+ serializer.endTag(null, TAG_BRIGHTNESS_CORRECTIONS);
+ }
+
+ /**
+ * Read a configuration from an XML parser.
+ *
+ * @param parser
+ * The XML parser.
+ *
+ * @throws IOException
+ * The parser failed to read the XML file.
+ * @throws XmlPullParserException
+ * The parser failed to parse the XML file.
+ *
+ * @hide
+ */
+ public static BrightnessConfiguration loadFromXml(XmlPullParser parser)
+ throws IOException, XmlPullParserException {
+ String description = null;
+ List<Float> luxList = new ArrayList<>();
+ List<Float> nitsList = new ArrayList<>();
+ Map<String, BrightnessCorrection> correctionsByPackageName = new HashMap<>();
+ Map<Integer, BrightnessCorrection> correctionsByCategory = new HashMap<>();
+ final int configDepth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, configDepth)) {
+ if (TAG_BRIGHTNESS_CURVE.equals(parser.getName())) {
+ description = parser.getAttributeValue(null, ATTR_DESCRIPTION);
+ final int curveDepth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, curveDepth)) {
+ if (!TAG_BRIGHTNESS_POINT.equals(parser.getName())) {
+ continue;
+ }
+ final float lux = loadFloatFromXml(parser, ATTR_LUX);
+ final float nits = loadFloatFromXml(parser, ATTR_NITS);
+ luxList.add(lux);
+ nitsList.add(nits);
+ }
+ }
+ if (TAG_BRIGHTNESS_CORRECTIONS.equals(parser.getName())) {
+ final int correctionsDepth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, correctionsDepth)) {
+ if (!TAG_BRIGHTNESS_CORRECTION.equals(parser.getName())) {
+ continue;
+ }
+ final String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
+ final String categoryText = parser.getAttributeValue(null, ATTR_CATEGORY);
+ BrightnessCorrection correction = BrightnessCorrection.loadFromXml(parser);
+ if (packageName != null) {
+ correctionsByPackageName.put(packageName, correction);
+ } else if (categoryText != null) {
+ try {
+ final int category = Integer.parseInt(categoryText);
+ correctionsByCategory.put(category, correction);
+ } catch (NullPointerException | NumberFormatException e) {
+ continue;
+ }
+ }
+ }
+ }
+ }
+ final int n = luxList.size();
+ float[] lux = new float[n];
+ float[] nits = new float[n];
+ for (int i = 0; i < n; i++) {
+ lux[i] = luxList.get(i);
+ nits[i] = nitsList.get(i);
+ }
+ final BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(lux,
+ nits);
+ builder.setDescription(description);
+ for (Map.Entry<String, BrightnessCorrection> entry : correctionsByPackageName.entrySet()) {
+ final String packageName = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ builder.addCorrectionByPackageName(packageName, correction);
+ }
+ for (Map.Entry<Integer, BrightnessCorrection> entry : correctionsByCategory.entrySet()) {
+ final int category = entry.getKey();
+ final BrightnessCorrection correction = entry.getValue();
+ builder.addCorrectionByCategory(category, correction);
+ }
+ return builder.build();
+ }
+
+ private static float loadFloatFromXml(XmlPullParser parser, String attribute) {
+ final String string = parser.getAttributeValue(null, attribute);
+ try {
+ return Float.parseFloat(string);
+ } catch (NullPointerException | NumberFormatException e) {
+ return Float.NaN;
+ }
+ }
+
+ /**
* A builder class for {@link BrightnessConfiguration}s.
*/
public static class Builder {
+ private static final int MAX_CORRECTIONS_BY_PACKAGE_NAME = 20;
+ private static final int MAX_CORRECTIONS_BY_CATEGORY = 20;
+
private float[] mCurveLux;
private float[] mCurveNits;
+ private Map<String, BrightnessCorrection> mCorrectionsByPackageName;
+ private Map<Integer, BrightnessCorrection> mCorrectionsByCategory;
private String mDescription;
/**
@@ -169,6 +402,80 @@ public final class BrightnessConfiguration implements Parcelable {
checkMonotonic(nits, false /*strictly increasing*/, "nits");
mCurveLux = lux;
mCurveNits = nits;
+ mCorrectionsByPackageName = new HashMap<>();
+ mCorrectionsByCategory = new HashMap<>();
+ }
+
+ /**
+ * Returns the maximum number of corrections by package name allowed.
+ *
+ * @return The maximum number of corrections by package name allowed.
+ *
+ */
+ public int getMaxCorrectionsByPackageName() {
+ return MAX_CORRECTIONS_BY_PACKAGE_NAME;
+ }
+
+ /**
+ * Returns the maximum number of corrections by category allowed.
+ *
+ * @return The maximum number of corrections by category allowed.
+ *
+ */
+ public int getMaxCorrectionsByCategory() {
+ return MAX_CORRECTIONS_BY_CATEGORY;
+ }
+
+ /**
+ * Add a brightness correction by app package name.
+ * This correction is applied whenever an app with this package name has the top activity
+ * of the focused stack.
+ *
+ * @param packageName
+ * The app's package name.
+ * @param correction
+ * The brightness correction.
+ *
+ * @return The builder.
+ *
+ * @throws IllegalArgumentExceptions
+ * Maximum number of corrections by package name exceeded (see
+ * {@link #getMaxCorrectionsByPackageName}).
+ *
+ */
+ public Builder addCorrectionByPackageName(String packageName,
+ BrightnessCorrection correction) {
+ if (mCorrectionsByPackageName.size() >= getMaxCorrectionsByPackageName()) {
+ throw new IllegalArgumentException("Too many corrections by package name");
+ }
+ mCorrectionsByPackageName.put(packageName, correction);
+ return this;
+ }
+
+ /**
+ * Add a brightness correction by app category.
+ * This correction is applied whenever an app with this category has the top activity of
+ * the focused stack, and only if a correction by package name has not been applied.
+ *
+ * @param category
+ * The {@link android.content.pm.ApplicationInfo#category app category}.
+ * @param correction
+ * The brightness correction.
+ *
+ * @return The builder.
+ *
+ * @throws IllegalArgumentException
+ * Maximum number of corrections by category exceeded (see
+ * {@link #getMaxCorrectionsByCategory}).
+ *
+ */
+ public Builder addCorrectionByCategory(@ApplicationInfo.Category int category,
+ BrightnessCorrection correction) {
+ if (mCorrectionsByCategory.size() >= getMaxCorrectionsByCategory()) {
+ throw new IllegalArgumentException("Too many corrections by category");
+ }
+ mCorrectionsByCategory.put(category, correction);
+ return this;
}
/**
@@ -184,14 +491,13 @@ public final class BrightnessConfiguration implements Parcelable {
/**
* Builds the {@link BrightnessConfiguration}.
- *
- * A brightness curve <b>must</b> be set before calling this.
*/
public BrightnessConfiguration build() {
if (mCurveLux == null || mCurveNits == null) {
throw new IllegalStateException("A curve must be set!");
}
- return new BrightnessConfiguration(mCurveLux, mCurveNits, mDescription);
+ return new BrightnessConfiguration(mCurveLux, mCurveNits, mCorrectionsByPackageName,
+ mCorrectionsByCategory, mDescription);
}
private static void checkMonotonic(float[] vals, boolean strictlyIncreasing, String name) {
diff --git a/core/java/android/hardware/display/BrightnessCorrection.aidl b/core/java/android/hardware/display/BrightnessCorrection.aidl
new file mode 100644
index 000000000000..3abe29cc0076
--- /dev/null
+++ b/core/java/android/hardware/display/BrightnessCorrection.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.display;
+
+parcelable BrightnessCorrection;
diff --git a/core/java/android/hardware/display/BrightnessCorrection.java b/core/java/android/hardware/display/BrightnessCorrection.java
new file mode 100644
index 000000000000..6a073ffaaa5b
--- /dev/null
+++ b/core/java/android/hardware/display/BrightnessCorrection.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.display;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.MathUtils;
+
+import com.android.internal.util.XmlUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+
+/**
+ * BrightnessCorrection encapsulates a correction to the brightness, without comitting to the
+ * actual correction scheme.
+ * It is used by the BrightnessConfiguration, which maps context (e.g. the foreground app's package
+ * name and category) to corrections that need to be applied to the brightness within that context.
+ * Corrections are currently done by the app that has the top activity of the focused stack, either
+ * by its package name, or (if its package name is not mapped to any correction) by its category.
+ *
+ * @hide
+ */
+@SystemApi
+@TestApi
+public final class BrightnessCorrection implements Parcelable {
+
+ private static final int SCALE_AND_TRANSLATE_LOG = 1;
+
+ private static final String TAG_SCALE_AND_TRANSLATE_LOG = "scale-and-translate-log";
+
+ private BrightnessCorrectionImplementation mImplementation;
+
+ // Parcelable classes must be final, and protected methods are not allowed in APIs, so we can't
+ // make this class abstract and use composition instead of inheritence.
+ private BrightnessCorrection(BrightnessCorrectionImplementation implementation) {
+ mImplementation = implementation;
+ }
+
+ /**
+ * Creates a BrightnessCorrection that given {@code brightness}, corrects it to be
+ * {@code exp(scale * log(brightness) + translate)}.
+ *
+ * @param scale
+ * How much to scale the log brightness.
+ * @param translate
+ * How much to translate the log brightness.
+ *
+ * @return A BrightnessCorrection that given {@code brightness}, corrects it to be
+ * {@code exp(scale * log(brightness) + translate)}.
+ *
+ * @throws IllegalArgumentException
+ * - scale or translate are NaN.
+ */
+ @NonNull
+ public static BrightnessCorrection createScaleAndTranslateLog(float scale, float translate) {
+ BrightnessCorrectionImplementation implementation =
+ new ScaleAndTranslateLog(scale, translate);
+ return new BrightnessCorrection(implementation);
+ }
+
+ /**
+ * Applies the brightness correction to a given brightness.
+ *
+ * @param brightness
+ * The brightness.
+ *
+ * @return The corrected brightness.
+ */
+ public float apply(float brightness) {
+ return mImplementation.apply(brightness);
+ }
+
+ /**
+ * Returns a string representation.
+ *
+ * @return A string representation.
+ */
+ public String toString() {
+ return mImplementation.toString();
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof BrightnessCorrection)) {
+ return false;
+ }
+ BrightnessCorrection other = (BrightnessCorrection) o;
+ return other.mImplementation.equals(mImplementation);
+ }
+
+ @Override
+ public int hashCode() {
+ return mImplementation.hashCode();
+ }
+
+ public static final Creator<BrightnessCorrection> CREATOR =
+ new Creator<BrightnessCorrection>() {
+ public BrightnessCorrection createFromParcel(Parcel in) {
+ final int type = in.readInt();
+ switch (type) {
+ case SCALE_AND_TRANSLATE_LOG:
+ return ScaleAndTranslateLog.readFromParcel(in);
+ }
+ return null;
+ }
+
+ public BrightnessCorrection[] newArray(int size) {
+ return new BrightnessCorrection[size];
+ }
+ };
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ mImplementation.writeToParcel(dest);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Writes the correction to an XML serializer.
+ *
+ * @param serializer
+ * The XML serializer.
+ *
+ * @hide
+ */
+ public void saveToXml(XmlSerializer serializer) throws IOException {
+ mImplementation.saveToXml(serializer);
+ }
+
+ /**
+ * Read a correction from an XML parser.
+ *
+ * @param parser
+ * The XML parser.
+ *
+ * @throws IOException
+ * The parser failed to read the XML file.
+ * @throws XmlPullParserException
+ * The parser failed to parse the XML file.
+ *
+ * @hide
+ */
+ public static BrightnessCorrection loadFromXml(XmlPullParser parser) throws IOException,
+ XmlPullParserException {
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_SCALE_AND_TRANSLATE_LOG.equals(parser.getName())) {
+ return ScaleAndTranslateLog.loadFromXml(parser);
+ }
+ }
+ return null;
+ }
+
+ private static float loadFloatFromXml(XmlPullParser parser, String attribute) {
+ final String string = parser.getAttributeValue(null, attribute);
+ try {
+ return Float.parseFloat(string);
+ } catch (NullPointerException | NumberFormatException e) {
+ return Float.NaN;
+ }
+ }
+
+ private interface BrightnessCorrectionImplementation {
+ float apply(float brightness);
+ String toString();
+ void writeToParcel(Parcel dest);
+ void saveToXml(XmlSerializer serializer) throws IOException;
+ // Package-private static methods:
+ // static BrightnessCorrection readFromParcel(Parcel in);
+ // static BrightnessCorrection loadFromXml(XmlPullParser parser) throws IOException,
+ // XmlPullParserException;
+ }
+
+ /**
+ * A BrightnessCorrection that given {@code brightness}, corrects it to be
+ * {@code exp(scale * log(brightness) + translate)}.
+ */
+ private static class ScaleAndTranslateLog implements BrightnessCorrectionImplementation {
+ private static final float MIN_SCALE = 0.5f;
+ private static final float MAX_SCALE = 2.0f;
+ private static final float MIN_TRANSLATE = -0.6f;
+ private static final float MAX_TRANSLATE = 0.7f;
+
+ private static final String ATTR_SCALE = "scale";
+ private static final String ATTR_TRANSLATE = "translate";
+
+ private final float mScale;
+ private final float mTranslate;
+
+ ScaleAndTranslateLog(float scale, float translate) {
+ if (Float.isNaN(scale) || Float.isNaN(translate)) {
+ throw new IllegalArgumentException("scale and translate must be numbers");
+ }
+ mScale = MathUtils.constrain(scale, MIN_SCALE, MAX_SCALE);
+ mTranslate = MathUtils.constrain(translate, MIN_TRANSLATE, MAX_TRANSLATE);
+ }
+
+ @Override
+ public float apply(float brightness) {
+ return MathUtils.exp(mScale * MathUtils.log(brightness) + mTranslate);
+ }
+
+ @Override
+ public String toString() {
+ return "ScaleAndTranslateLog(" + mScale + ", " + mTranslate + ")";
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof ScaleAndTranslateLog)) {
+ return false;
+ }
+ ScaleAndTranslateLog other = (ScaleAndTranslateLog) o;
+ return other.mScale == mScale && other.mTranslate == mTranslate;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 1;
+ result = result * 31 + Float.hashCode(mScale);
+ result = result * 31 + Float.hashCode(mTranslate);
+ return result;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest) {
+ dest.writeInt(SCALE_AND_TRANSLATE_LOG);
+ dest.writeFloat(mScale);
+ dest.writeFloat(mTranslate);
+ }
+
+ @Override
+ public void saveToXml(XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_SCALE_AND_TRANSLATE_LOG);
+ serializer.attribute(null, ATTR_SCALE, Float.toString(mScale));
+ serializer.attribute(null, ATTR_TRANSLATE, Float.toString(mTranslate));
+ serializer.endTag(null, TAG_SCALE_AND_TRANSLATE_LOG);
+ }
+
+ static BrightnessCorrection readFromParcel(Parcel in) {
+ float scale = in.readFloat();
+ float translate = in.readFloat();
+ return BrightnessCorrection.createScaleAndTranslateLog(scale, translate);
+ }
+
+ static BrightnessCorrection loadFromXml(XmlPullParser parser) throws IOException,
+ XmlPullParserException {
+ final float scale = loadFloatFromXml(parser, ATTR_SCALE);
+ final float translate = loadFloatFromXml(parser, ATTR_TRANSLATE);
+ return BrightnessCorrection.createScaleAndTranslateLog(scale, translate);
+ }
+ }
+}
diff --git a/core/java/android/hardware/display/ColorDisplayManager.java b/core/java/android/hardware/display/ColorDisplayManager.java
index dd782ec3a42f..70a9f08ea58a 100644
--- a/core/java/android/hardware/display/ColorDisplayManager.java
+++ b/core/java/android/hardware/display/ColorDisplayManager.java
@@ -16,7 +16,11 @@
package android.hardware.display;
+import android.Manifest;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
import android.os.IBinder;
@@ -31,6 +35,7 @@ import com.android.internal.R;
*
* @hide
*/
+@SystemApi
@SystemService(Context.COLOR_DISPLAY_SERVICE)
public final class ColorDisplayManager {
@@ -48,13 +53,43 @@ public final class ColorDisplayManager {
*
* @hide
*/
- @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
+ @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
public boolean isDeviceColorManaged() {
return mManager.isDeviceColorManaged();
}
/**
+ * Set the level of color saturation to apply to the display.
+ *
+ * @param saturationLevel 0-100 (inclusive), where 100 is full saturation
+ * @return whether the saturation level change was applied successfully
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
+ public boolean setSaturationLevel(@IntRange(from = 0, to = 100) int saturationLevel) {
+ return mManager.setSaturationLevel(saturationLevel);
+ }
+
+ /**
+ * Set the level of color saturation to apply to a specific app.
+ *
+ * @param packageName the package name of the app whose windows should be desaturated
+ * @param saturationLevel 0-100 (inclusive), where 100 is full saturation
+ * @return whether the saturation level change was applied successfully
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
+ public boolean setAppSaturationLevel(@NonNull String packageName,
+ @IntRange(from = 0, to = 100) int saturationLevel) {
+ return mManager.setAppSaturationLevel(packageName, saturationLevel);
+ }
+
+ /**
* Returns {@code true} if Night Display is supported by the device.
+ *
+ * @hide
*/
public static boolean isNightDisplayAvailable(Context context) {
return context.getResources().getBoolean(R.bool.config_nightDisplayAvailable);
@@ -62,11 +97,23 @@ public final class ColorDisplayManager {
/**
* Returns {@code true} if display white balance is supported by the device.
+ *
+ * @hide
*/
public static boolean isDisplayWhiteBalanceAvailable(Context context) {
return context.getResources().getBoolean(R.bool.config_displayWhiteBalanceAvailable);
}
+ /**
+ * Check if the color transforms are color accelerated. Some transforms are experimental only
+ * on non-accelerated platforms due to the performance implications.
+ *
+ * @hide
+ */
+ public static boolean isColorTransformAccelerated(Context context) {
+ return context.getResources().getBoolean(R.bool.config_setColorTransformAccelerated);
+ }
+
private static class ColorDisplayManagerInternal {
private static ColorDisplayManagerInternal sInstance;
@@ -99,5 +146,21 @@ public final class ColorDisplayManager {
throw e.rethrowFromSystemServer();
}
}
+
+ boolean setSaturationLevel(int saturationLevel) {
+ try {
+ return mCdm.setSaturationLevel(saturationLevel);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ boolean setAppSaturationLevel(String packageName, int saturationLevel) {
+ try {
+ return mCdm.setAppSaturationLevel(packageName, saturationLevel);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 82e765dee447..44b653c314ad 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -563,11 +563,16 @@ public final class DisplayManager {
* 0 produces a grayscale image, 1 is normal.
*
* @hide
+ * @deprecated use {@link ColorDisplayManager#setSaturationLevel(int)}.
*/
@SystemApi
@RequiresPermission(Manifest.permission.CONTROL_DISPLAY_SATURATION)
public void setSaturationLevel(float level) {
- mGlobal.setSaturationLevel(level);
+ if (level < 0f || level > 1f) {
+ throw new IllegalArgumentException("Saturation level must be between 0 and 1");
+ }
+ final ColorDisplayManager cdm = mContext.getSystemService(ColorDisplayManager.class);
+ cdm.setSaturationLevel(Math.round(level * 100f));
}
/**
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 7304ab4aa1df..7e45441c804a 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -394,17 +394,6 @@ public final class DisplayManagerGlobal {
}
}
- /**
- * Set the level of color saturation to apply to the display.
- */
- public void setSaturationLevel(float level) {
- try {
- mDm.setSaturationLevel(level);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
- }
-
public VirtualDisplay createVirtualDisplay(Context context, MediaProjection projection,
String name, int width, int height, int densityDpi, Surface surface, int flags,
VirtualDisplay.Callback callback, Handler handler, String uniqueId) {
@@ -447,6 +436,7 @@ public final class DisplayManagerGlobal {
public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) {
try {
mDm.setVirtualDisplaySurface(token, surface);
+ setVirtualDisplayState(token, surface != null);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
@@ -469,6 +459,14 @@ public final class DisplayManagerGlobal {
}
}
+ void setVirtualDisplayState(IVirtualDisplayCallback token, boolean isOn) {
+ try {
+ mDm.setVirtualDisplayState(token, isOn);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
/**
* Gets the stable device display size, in pixels.
*/
diff --git a/core/java/android/hardware/display/IColorDisplayManager.aidl b/core/java/android/hardware/display/IColorDisplayManager.aidl
index f7865899812a..644f510d45f9 100644
--- a/core/java/android/hardware/display/IColorDisplayManager.aidl
+++ b/core/java/android/hardware/display/IColorDisplayManager.aidl
@@ -19,4 +19,7 @@ package android.hardware.display;
/** @hide */
interface IColorDisplayManager {
boolean isDeviceColorManaged();
+
+ boolean setSaturationLevel(int saturationLevel);
+ boolean setAppSaturationLevel(String packageName, int saturationLevel);
} \ No newline at end of file
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index b57599724ad5..aae8afbcad49 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -66,9 +66,6 @@ interface IDisplayManager {
// Requires CONFIGURE_DISPLAY_COLOR_MODE
void requestColorMode(int displayId, int colorMode);
- // Requires CONTROL_DISPLAY_SATURATION
- void setSaturationLevel(float level);
-
// Requires CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT, or an appropriate
// MediaProjection token for certain combinations of flags.
int createVirtualDisplay(in IVirtualDisplayCallback callback,
@@ -85,6 +82,9 @@ interface IDisplayManager {
// No permissions required but must be same Uid as the creator.
void releaseVirtualDisplay(in IVirtualDisplayCallback token);
+ // No permissions required but must be same Uid as the creator.
+ void setVirtualDisplayState(in IVirtualDisplayCallback token, boolean isOn);
+
// Get a stable metric for the device's display size. No permissions required.
Point getStableDisplaySize();
diff --git a/core/java/android/hardware/display/VirtualDisplay.java b/core/java/android/hardware/display/VirtualDisplay.java
index d35466605162..bf62c95cf6db 100644
--- a/core/java/android/hardware/display/VirtualDisplay.java
+++ b/core/java/android/hardware/display/VirtualDisplay.java
@@ -104,6 +104,18 @@ public final class VirtualDisplay {
}
}
+ /**
+ * Sets the on/off state for a virtual display.
+ *
+ * @param isOn Whether the display should be on or off.
+ * @hide
+ */
+ public void setDisplayState(boolean isOn) {
+ if (mToken != null) {
+ mGlobal.setVirtualDisplayState(mToken, isOn);
+ }
+ }
+
@Override
public String toString() {
return "VirtualDisplay{display=" + mDisplay + ", token=" + mToken
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
index 1630b0603f3a..c9a7830d50f5 100644
--- a/core/java/android/hardware/face/FaceManager.java
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -163,8 +163,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
mAuthenticationCallback = callback;
mCryptoObject = crypto;
long sessionId = crypto != null ? crypto.getOpId() : 0;
- mService.authenticate(mToken, sessionId, mServiceReceiver, flags,
- mContext.getOpPackageName());
+ mService.authenticate(mToken, sessionId, mContext.getUserId(), mServiceReceiver,
+ flags, mContext.getOpPackageName());
} catch (RemoteException e) {
Log.w(TAG, "Remote exception while authenticating: ", e);
if (callback != null) {
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
index a1c88f81e3e7..f67760a8fafc 100644
--- a/core/java/android/hardware/face/IFaceService.aidl
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -27,7 +27,7 @@ import android.hardware.face.Face;
*/
interface IFaceService {
// Authenticate the given sessionId with a face
- void authenticate(IBinder token, long sessionId,
+ void authenticate(IBinder token, long sessionId, int userid,
IFaceServiceReceiver receiver, int flags, String opPackageName);
// This method prepares the service to start authenticating, but doesn't start authentication.
diff --git a/core/java/android/hardware/hdmi/HdmiAudioSystemClient.java b/core/java/android/hardware/hdmi/HdmiAudioSystemClient.java
index d382eb9310d9..bdd5ab67af48 100644
--- a/core/java/android/hardware/hdmi/HdmiAudioSystemClient.java
+++ b/core/java/android/hardware/hdmi/HdmiAudioSystemClient.java
@@ -15,10 +15,12 @@
*/
package android.hardware.hdmi;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
@@ -56,6 +58,21 @@ public final class HdmiAudioSystemClient extends HdmiClient {
mHandler = handler == null ? new Handler(Looper.getMainLooper()) : handler;
}
+ /**
+ * Callback interface used to get the set System Audio Mode result.
+ *
+ * @hide
+ */
+ // TODO(b/110094868): unhide and add @SystemApi for Q
+ public interface SetSystemAudioModeCallback {
+ /**
+ * Called when the input was changed.
+ *
+ * @param result the result of the set System Audio Mode
+ */
+ void onComplete(int result);
+ }
+
/** @hide */
// TODO(b/110094868): unhide and add @SystemApi for Q
@Override
@@ -117,4 +134,34 @@ public final class HdmiAudioSystemClient extends HdmiClient {
mPendingReportAudioStatus = true;
}
}
+
+ /**
+ * Set System Audio Mode on/off with audio system device.
+ *
+ * @param state true to set System Audio Mode on. False to set off.
+ * @param callback callback offer the setting result.
+ *
+ * @hide
+ */
+ // TODO(b/110094868): unhide and add @SystemApi for Q
+ public void setSystemAudioMode(boolean state, @NonNull SetSystemAudioModeCallback callback) {
+ // TODO(amyjojo): implement this when needed.
+ }
+
+ /**
+ * When device is switching to an audio only source, this method is called to broadcast
+ * a setSystemAudioMode on message to the HDMI CEC system without querying Active Source or
+ * TV supporting System Audio Control or not. This is to get volume control passthrough
+ * from STB even if TV does not support it.
+ *
+ * @hide
+ */
+ // TODO(b/110094868): unhide and add @SystemApi for Q
+ public void setSystemAudioModeOnForAudioOnlySource() {
+ try {
+ mService.setSystemAudioModeOnForAudioOnlySource();
+ } catch (RemoteException e) {
+ Log.d(TAG, "Failed to set System Audio Mode on for Audio Only source");
+ }
+ }
}
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index b520d2c14edc..a98b31ad6a5e 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -16,6 +16,8 @@
package android.hardware.hdmi;
+import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH;
+
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
@@ -27,9 +29,12 @@ import android.annotation.SystemService;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.RemoteException;
+import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.Log;
+import java.util.List;
+
/**
* The {@link HdmiControlManager} class is used to send HDMI control messages
* to attached CEC devices.
@@ -50,6 +55,10 @@ public final class HdmiControlManager {
@Nullable private final IHdmiControlService mService;
+ private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF;
+
+ private int mPhysicalAddress = INVALID_PHYSICAL_ADDRESS;
+
/**
* Broadcast Action: Display OSD message.
* <p>Send when the service has a message to display on screen for events
@@ -264,6 +273,10 @@ public final class HdmiControlManager {
private final boolean mHasTvDevice;
// True if we have a logical device of type audio system hosted in the system.
private final boolean mHasAudioSystemDevice;
+ // True if we have a logical device of type audio system hosted in the system.
+ private final boolean mHasSwitchDevice;
+ // True if it's a switch device.
+ private final boolean mIsSwitchDevice;
/**
* {@hide} - hide this constructor because it has a parameter of type IHdmiControlService,
@@ -283,6 +296,9 @@ public final class HdmiControlManager {
mHasTvDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_TV);
mHasPlaybackDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_PLAYBACK);
mHasAudioSystemDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
+ mHasSwitchDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH);
+ mIsSwitchDevice = SystemProperties.getBoolean(
+ PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH, false);
}
private static boolean hasDeviceType(int[] types, int type) {
@@ -319,6 +335,9 @@ public final class HdmiControlManager {
return mHasPlaybackDevice ? new HdmiPlaybackClient(mService) : null;
case HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM:
return mHasAudioSystemDevice ? new HdmiAudioSystemClient(mService) : null;
+ case HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH:
+ return (mHasSwitchDevice || mIsSwitchDevice)
+ ? new HdmiSwitchClient(mService) : null;
default:
return null;
}
@@ -373,6 +392,90 @@ public final class HdmiControlManager {
}
/**
+ * Gets an object that represents an HDMI-CEC logical device of type switch on the system.
+ *
+ * <p>Used to send HDMI control messages to other devices like TV through HDMI bus. It is also
+ * possible to communicate with other logical devices hosted in the same system if the system is
+ * configured to host more than one type of HDMI-CEC logical devices.
+ *
+ * @return {@link HdmiSwitchClient} instance. {@code null} on failure.
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ @Nullable
+ @SuppressLint("Doclava125")
+ public HdmiSwitchClient getSwitchClient() {
+ return (HdmiSwitchClient) getClient(HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH);
+ }
+
+ /**
+ * Get a snapshot of the real-time status of the remote devices.
+ *
+ * @return a list of {@link HdmiDeviceInfo} of the devices connected to the current device.
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ public List<HdmiDeviceInfo> getConnectedDevicesList() {
+ try {
+ return mService.getDeviceList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Power off the target device.
+ *
+ * @param deviceInfo HdmiDeviceInfo of the device to be powered off
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ public void powerOffRemoteDevice(HdmiDeviceInfo deviceInfo) {
+ try {
+ mService.powerOffRemoteDevice(
+ deviceInfo.getLogicalAddress(), deviceInfo.getDevicePowerStatus());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Power on the target device.
+ *
+ * @param deviceInfo HdmiDeviceInfo of the device to be powered on
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ public void powerOnRemoteDevice(HdmiDeviceInfo deviceInfo) {
+ try {
+ mService.powerOnRemoteDevice(
+ deviceInfo.getLogicalAddress(), deviceInfo.getDevicePowerStatus());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Ask the target device to be the new Active Source.
+ *
+ * @param deviceInfo HdmiDeviceInfo of the target device
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ public void askRemoteDeviceToBecomeActiveSource(HdmiDeviceInfo deviceInfo) {
+ try {
+ mService.askRemoteDeviceToBecomeActiveSource(deviceInfo.getPhysicalAddress());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Controls standby mode of the system. It will also try to turn on/off the connected devices if
* necessary.
*
@@ -401,6 +504,46 @@ public final class HdmiControlManager {
}
/**
+ * Get the physical address of the device.
+ *
+ * @hide
+ */
+ public int getPhysicalAddress() {
+ if (mPhysicalAddress != INVALID_PHYSICAL_ADDRESS) {
+ return mPhysicalAddress;
+ }
+ try {
+ mPhysicalAddress = mService.getPhysicalAddress();
+ return mPhysicalAddress;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Check if the target device is connected to the current device. The
+ * API also returns true if the current device is the target.
+ *
+ * @param targetDevice {@link HdmiDeviceInfo} of the target device.
+ * @return true if {@code device} is directly or indirectly connected to the
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+ public boolean isTargetDeviceConnected(HdmiDeviceInfo targetDevice) {
+ mPhysicalAddress = getPhysicalAddress();
+ if (mPhysicalAddress == INVALID_PHYSICAL_ADDRESS) {
+ return false;
+ }
+ int targetPhysicalAddress = targetDevice.getPhysicalAddress();
+ if (targetPhysicalAddress == INVALID_PHYSICAL_ADDRESS) {
+ return false;
+ }
+ return HdmiUtils.getLocalPortFromPhysicalAddress(targetPhysicalAddress, mPhysicalAddress)
+ != HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE;
+ }
+
+ /**
* Listener used to get hotplug event from HDMI port.
*/
public interface HotplugEventListener {
diff --git a/core/java/android/hardware/hdmi/HdmiSwitchClient.java b/core/java/android/hardware/hdmi/HdmiSwitchClient.java
new file mode 100644
index 000000000000..1ac29736f964
--- /dev/null
+++ b/core/java/android/hardware/hdmi/HdmiSwitchClient.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.hdmi;
+
+import android.annotation.NonNull;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * HdmiSwitchClient represents HDMI-CEC logical device of type Switch in the Android system which
+ * acts as switch.
+ *
+ * <p>HdmiSwitchClient has a CEC device type of HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH,
+ * but it is used by all Android TV devices that have multiple HDMI inputs,
+ * even if it is not a "pure" swicth and has another device type like TV or Player.
+ *
+ * @hide
+ * TODO(b/110094868): unhide and add @SystemApi for Q
+ */
+public class HdmiSwitchClient extends HdmiClient {
+
+ private static final String TAG = "HdmiSwitchClient";
+
+ /* package */ HdmiSwitchClient(IHdmiControlService service) {
+ super(service);
+ }
+
+ private static IHdmiControlCallback getCallbackWrapper(final SelectCallback callback) {
+ return new IHdmiControlCallback.Stub() {
+ @Override
+ public void onComplete(int result) {
+ callback.onComplete(result);
+ }
+ };
+ }
+
+ /** @hide */
+ // TODO(b/110094868): unhide for Q
+ @Override
+ public int getDeviceType() {
+ return HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH;
+ }
+
+ /**
+ * Selects a CEC logical device to be a new active source.
+ *
+ * @param logicalAddress logical address of the device to select
+ * @param callback callback to get the result with
+ * @throws {@link IllegalArgumentException} if the {@code callback} is null
+ *
+ * @hide
+ * TODO(b/110094868): unhide and add @SystemApi for Q
+ */
+ public void deviceSelect(int logicalAddress, @NonNull SelectCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null.");
+ }
+ try {
+ mService.deviceSelect(logicalAddress, getCallbackWrapper(callback));
+ } catch (RemoteException e) {
+ Log.e(TAG, "failed to select device: ", e);
+ }
+ }
+
+ /**
+ * Selects a HDMI port to be a new route path.
+ *
+ * @param portId HDMI port to select
+ * @param callback callback to get the result with
+ * @throws {@link IllegalArgumentException} if the {@code callback} is null
+ *
+ * @hide
+ * TODO(b/110094868): unhide and add @SystemApi for Q
+ */
+ public void portSelect(int portId, @NonNull SelectCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("Callback must not be null");
+ }
+ try {
+ mService.portSelect(portId, getCallbackWrapper(callback));
+ } catch (RemoteException e) {
+ Log.e(TAG, "failed to select port: ", e);
+ }
+ }
+
+ /**
+ * Returns all the CEC devices connected to the device.
+ *
+ * <p>This only applies to device with multiple HDMI inputs
+ *
+ * @return list of {@link HdmiDeviceInfo} for connected CEC devices. Empty list is returned if
+ * there is none.
+ *
+ * @hide
+ * TODO(b/110094868): unhide and add @SystemApi for Q
+ */
+ public List<HdmiDeviceInfo> getDeviceList() {
+ try {
+ return mService.getDeviceList();
+ } catch (RemoteException e) {
+ Log.e("TAG", "Failed to call getDeviceList():", e);
+ return Collections.<HdmiDeviceInfo>emptyList();
+ }
+ }
+
+ /**
+ * Callback interface used to get the result of {@link #deviceSelect} or {@link #portSelect}.
+ *
+ * @hide
+ * TODO(b/110094868): unhide and add @SystemApi for Q
+ */
+ public interface SelectCallback {
+
+ /**
+ * Called when the operation is finished.
+ *
+ * @param result the result value of {@link #deviceSelect} or {@link #portSelect}.
+ */
+ void onComplete(int result);
+ }
+}
diff --git a/core/java/android/hardware/hdmi/HdmiUtils.java b/core/java/android/hardware/hdmi/HdmiUtils.java
new file mode 100644
index 000000000000..308173816f13
--- /dev/null
+++ b/core/java/android/hardware/hdmi/HdmiUtils.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.hdmi;
+
+/**
+ * Various utilities to handle HDMI CEC messages.
+ *
+ * TODO(b/110094868): unhide for Q
+ * @hide
+ */
+public class HdmiUtils {
+
+ /**
+ * Return value of {@link #getLocalPortFromPhysicalAddress(int, int)}
+ */
+ static final int TARGET_NOT_UNDER_LOCAL_DEVICE = -1;
+ static final int TARGET_SAME_PHYSICAL_ADDRESS = 0;
+
+ private HdmiUtils() { /* cannot be instantiated */ }
+
+ /**
+ * Method to parse target physical address to the port number on the current device.
+ *
+ * <p>This check assumes target address is valid.
+ *
+ * @param targetPhysicalAddress is the physical address of the target device
+ * @param myPhysicalAddress is the physical address of the current device
+ * @return
+ * If the target device is under the current device, return the port number of current device
+ * that the target device is connected to. This also applies to the devices that are indirectly
+ * connected to the current device.
+ *
+ * <p>If the target device has the same physical address as the current device, return
+ * {@link #TARGET_SAME_PHYSICAL_ADDRESS}.
+ *
+ * <p>If the target device is not under the current device, return
+ * {@link #TARGET_NOT_UNDER_LOCAL_DEVICE}.
+ */
+ public static int getLocalPortFromPhysicalAddress(
+ int targetPhysicalAddress, int myPhysicalAddress) {
+ if (myPhysicalAddress == targetPhysicalAddress) {
+ return TARGET_SAME_PHYSICAL_ADDRESS;
+ }
+
+ int mask = 0xF000;
+ int finalMask = 0xF000;
+ int maskedAddress = myPhysicalAddress;
+
+ while (maskedAddress != 0) {
+ maskedAddress = myPhysicalAddress & mask;
+ finalMask |= mask;
+ mask >>= 4;
+ }
+
+ int portAddress = targetPhysicalAddress & finalMask;
+ if ((portAddress & (finalMask << 4)) != myPhysicalAddress) {
+ return TARGET_NOT_UNDER_LOCAL_DEVICE;
+ }
+
+ mask <<= 4;
+ int port = portAddress & mask;
+ while ((port >> 4) != 0) {
+ port >>= 4;
+ }
+ return port;
+ }
+}
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 2b8d00b73b7e..1cd9920aa250 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -50,6 +50,7 @@ interface IHdmiControlService {
List<HdmiPortInfo> getPortInfo();
boolean canChangeSystemAudioMode();
boolean getSystemAudioMode();
+ int getPhysicalAddress();
void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback);
void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener);
void removeSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener);
@@ -60,6 +61,9 @@ interface IHdmiControlService {
void setInputChangeListener(IHdmiInputChangeListener listener);
List<HdmiDeviceInfo> getInputDevices();
List<HdmiDeviceInfo> getDeviceList();
+ void powerOffRemoteDevice(int logicalAddress, int powerStatus);
+ void powerOnRemoteDevice(int logicalAddress, int powerStatus);
+ void askRemoteDeviceToBecomeActiveSource(int physicalAddress);
void sendVendorCommand(int deviceType, int targetAddress, in byte[] params,
boolean hasVendorId);
void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType);
@@ -73,4 +77,5 @@ interface IHdmiControlService {
void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener);
void setStandbyMode(boolean isStandbyModeOn);
void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute);
+ void setSystemAudioModeOnForAudioOnlySource();
}
diff --git a/core/java/android/hardware/location/ActivityChangedEvent.java b/core/java/android/hardware/location/ActivityChangedEvent.java
deleted file mode 100644
index 16cfe6e23e88..000000000000
--- a/core/java/android/hardware/location/ActivityChangedEvent.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.hardware.location;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.security.InvalidParameterException;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * A class representing an event for Activity changes.
- *
- * @hide
- */
-public class ActivityChangedEvent implements Parcelable {
- private final List<ActivityRecognitionEvent> mActivityRecognitionEvents;
-
- public ActivityChangedEvent(ActivityRecognitionEvent[] activityRecognitionEvents) {
- if (activityRecognitionEvents == null) {
- throw new InvalidParameterException(
- "Parameter 'activityRecognitionEvents' must not be null.");
- }
-
- mActivityRecognitionEvents = Arrays.asList(activityRecognitionEvents);
- }
-
- @NonNull
- public Iterable<ActivityRecognitionEvent> getActivityRecognitionEvents() {
- return mActivityRecognitionEvents;
- }
-
- public static final Creator<ActivityChangedEvent> CREATOR =
- new Creator<ActivityChangedEvent>() {
- @Override
- public ActivityChangedEvent createFromParcel(Parcel source) {
- int activityRecognitionEventsLength = source.readInt();
- ActivityRecognitionEvent[] activityRecognitionEvents =
- new ActivityRecognitionEvent[activityRecognitionEventsLength];
- source.readTypedArray(activityRecognitionEvents, ActivityRecognitionEvent.CREATOR);
-
- return new ActivityChangedEvent(activityRecognitionEvents);
- }
-
- @Override
- public ActivityChangedEvent[] newArray(int size) {
- return new ActivityChangedEvent[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- ActivityRecognitionEvent[] activityRecognitionEventArray =
- mActivityRecognitionEvents.toArray(new ActivityRecognitionEvent[0]);
- parcel.writeInt(activityRecognitionEventArray.length);
- parcel.writeTypedArray(activityRecognitionEventArray, flags);
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder("[ ActivityChangedEvent:");
-
- for (ActivityRecognitionEvent event : mActivityRecognitionEvents) {
- builder.append("\n ");
- builder.append(event.toString());
- }
- builder.append("\n]");
-
- return builder.toString();
- }
-}
diff --git a/core/java/android/hardware/location/ActivityRecognitionEvent.java b/core/java/android/hardware/location/ActivityRecognitionEvent.java
deleted file mode 100644
index 190030a82d6b..000000000000
--- a/core/java/android/hardware/location/ActivityRecognitionEvent.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * A class that represents an Activity Recognition Event.
- *
- * @hide
- */
-public class ActivityRecognitionEvent implements Parcelable {
- private final String mActivity;
- private final int mEventType;
- private final long mTimestampNs;
-
- public ActivityRecognitionEvent(String activity, int eventType, long timestampNs) {
- mActivity = activity;
- mEventType = eventType;
- mTimestampNs = timestampNs;
- }
-
- public String getActivity() {
- return mActivity;
- }
-
- public int getEventType() {
- return mEventType;
- }
-
- public long getTimestampNs() {
- return mTimestampNs;
- }
-
- public static final Creator<ActivityRecognitionEvent> CREATOR =
- new Creator<ActivityRecognitionEvent>() {
- @Override
- public ActivityRecognitionEvent createFromParcel(Parcel source) {
- String activity = source.readString();
- int eventType = source.readInt();
- long timestampNs = source.readLong();
-
- return new ActivityRecognitionEvent(activity, eventType, timestampNs);
- }
-
- @Override
- public ActivityRecognitionEvent[] newArray(int size) {
- return new ActivityRecognitionEvent[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeString(mActivity);
- parcel.writeInt(mEventType);
- parcel.writeLong(mTimestampNs);
- }
-
- @Override
- public String toString() {
- return String.format(
- "Activity='%s', EventType=%s, TimestampNs=%s",
- mActivity,
- mEventType,
- mTimestampNs);
- }
-}
diff --git a/core/java/android/hardware/location/ActivityRecognitionHardware.java b/core/java/android/hardware/location/ActivityRecognitionHardware.java
deleted file mode 100644
index 8acd1ff27917..000000000000
--- a/core/java/android/hardware/location/ActivityRecognitionHardware.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.hardware.location;
-
-import android.Manifest;
-import android.content.Context;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-/**
- * A class that implements an {@link IActivityRecognitionHardware} backed up by the Activity
- * Recognition HAL.
- *
- * @hide
- */
-public class ActivityRecognitionHardware extends IActivityRecognitionHardware.Stub {
- private static final String TAG = "ActivityRecognitionHW";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private static final String HARDWARE_PERMISSION = Manifest.permission.LOCATION_HARDWARE;
- private static final String ENFORCE_HW_PERMISSION_MESSAGE = "Permission '"
- + HARDWARE_PERMISSION + "' not granted to access ActivityRecognitionHardware";
-
- private static final int INVALID_ACTIVITY_TYPE = -1;
- private static final int NATIVE_SUCCESS_RESULT = 0;
- private static final int EVENT_TYPE_DISABLED = 0;
- private static final int EVENT_TYPE_ENABLED = 1;
-
- /**
- * Contains the number of supported Event Types.
- *
- * NOTE: increment this counter every time a new EVENT_TYPE_ is added to
- * com.android.location.provider.ActivityRecognitionProvider
- */
- private static final int EVENT_TYPE_COUNT = 3;
-
- private static ActivityRecognitionHardware sSingletonInstance;
- private static final Object sSingletonInstanceLock = new Object();
-
- private final Context mContext;
- private final int mSupportedActivitiesCount;
- private final String[] mSupportedActivities;
- private final int[][] mSupportedActivitiesEnabledEvents;
- private final SinkList mSinks = new SinkList();
-
- private static class Event {
- public int activity;
- public int type;
- public long timestamp;
- }
-
- private ActivityRecognitionHardware(Context context) {
- nativeInitialize();
-
- mContext = context;
- mSupportedActivities = fetchSupportedActivities();
- mSupportedActivitiesCount = mSupportedActivities.length;
- mSupportedActivitiesEnabledEvents = new int[mSupportedActivitiesCount][EVENT_TYPE_COUNT];
- }
-
- public static ActivityRecognitionHardware getInstance(Context context) {
- synchronized (sSingletonInstanceLock) {
- if (sSingletonInstance == null) {
- sSingletonInstance = new ActivityRecognitionHardware(context);
- }
-
- return sSingletonInstance;
- }
- }
-
- public static boolean isSupported() {
- return nativeIsSupported();
- }
-
- @Override
- public String[] getSupportedActivities() {
- checkPermissions();
- return mSupportedActivities;
- }
-
- @Override
- public boolean isActivitySupported(String activity) {
- checkPermissions();
- int activityType = getActivityType(activity);
- return activityType != INVALID_ACTIVITY_TYPE;
- }
-
- @Override
- public boolean registerSink(IActivityRecognitionHardwareSink sink) {
- checkPermissions();
- return mSinks.register(sink);
- }
-
- @Override
- public boolean unregisterSink(IActivityRecognitionHardwareSink sink) {
- checkPermissions();
- return mSinks.unregister(sink);
- }
-
- @Override
- public boolean enableActivityEvent(String activity, int eventType, long reportLatencyNs) {
- checkPermissions();
-
- int activityType = getActivityType(activity);
- if (activityType == INVALID_ACTIVITY_TYPE) {
- return false;
- }
-
- int result = nativeEnableActivityEvent(activityType, eventType, reportLatencyNs);
- if (result == NATIVE_SUCCESS_RESULT) {
- mSupportedActivitiesEnabledEvents[activityType][eventType] = EVENT_TYPE_ENABLED;
- return true;
- }
- return false;
- }
-
- @Override
- public boolean disableActivityEvent(String activity, int eventType) {
- checkPermissions();
-
- int activityType = getActivityType(activity);
- if (activityType == INVALID_ACTIVITY_TYPE) {
- return false;
- }
-
- int result = nativeDisableActivityEvent(activityType, eventType);
- if (result == NATIVE_SUCCESS_RESULT) {
- mSupportedActivitiesEnabledEvents[activityType][eventType] = EVENT_TYPE_DISABLED;
- return true;
- }
- return false;
- }
-
- @Override
- public boolean flush() {
- checkPermissions();
- int result = nativeFlush();
- return result == NATIVE_SUCCESS_RESULT;
- }
-
- /**
- * Called by the Activity-Recognition HAL.
- */
- private void onActivityChanged(Event[] events) {
- if (events == null || events.length == 0) {
- if (DEBUG) Log.d(TAG, "No events to broadcast for onActivityChanged.");
- return;
- }
-
- int eventsLength = events.length;
- ActivityRecognitionEvent activityRecognitionEventArray[] =
- new ActivityRecognitionEvent[eventsLength];
- for (int i = 0; i < eventsLength; ++i) {
- Event event = events[i];
- String activityName = getActivityName(event.activity);
- activityRecognitionEventArray[i] =
- new ActivityRecognitionEvent(activityName, event.type, event.timestamp);
- }
- ActivityChangedEvent activityChangedEvent =
- new ActivityChangedEvent(activityRecognitionEventArray);
-
- int size = mSinks.beginBroadcast();
- for (int i = 0; i < size; ++i) {
- IActivityRecognitionHardwareSink sink = mSinks.getBroadcastItem(i);
- try {
- sink.onActivityChanged(activityChangedEvent);
- } catch (RemoteException e) {
- Log.e(TAG, "Error delivering activity changed event.", e);
- }
- }
- mSinks.finishBroadcast();
- }
-
- private String getActivityName(int activityType) {
- if (activityType < 0 || activityType >= mSupportedActivities.length) {
- String message = String.format(
- "Invalid ActivityType: %d, SupportedActivities: %d",
- activityType,
- mSupportedActivities.length);
- Log.e(TAG, message);
- return null;
- }
-
- return mSupportedActivities[activityType];
- }
-
- private int getActivityType(String activity) {
- if (TextUtils.isEmpty(activity)) {
- return INVALID_ACTIVITY_TYPE;
- }
-
- int supportedActivitiesLength = mSupportedActivities.length;
- for (int i = 0; i < supportedActivitiesLength; ++i) {
- if (activity.equals(mSupportedActivities[i])) {
- return i;
- }
- }
-
- return INVALID_ACTIVITY_TYPE;
- }
-
- private void checkPermissions() {
- mContext.enforceCallingPermission(HARDWARE_PERMISSION, ENFORCE_HW_PERMISSION_MESSAGE);
- }
-
- private String[] fetchSupportedActivities() {
- String[] supportedActivities = nativeGetSupportedActivities();
- if (supportedActivities != null) {
- return supportedActivities;
- }
-
- return new String[0];
- }
-
- private class SinkList extends RemoteCallbackList<IActivityRecognitionHardwareSink> {
- @Override
- public void onCallbackDied(IActivityRecognitionHardwareSink callback) {
- int callbackCount = mSinks.getRegisteredCallbackCount();
- if (DEBUG) Log.d(TAG, "RegisteredCallbackCount: " + callbackCount);
- if (callbackCount != 0) {
- return;
- }
- // currently there is only one client for this, so if all its sinks have died, we clean
- // up after them, this ensures that the AR HAL is not out of sink
- for (int activity = 0; activity < mSupportedActivitiesCount; ++activity) {
- for (int event = 0; event < EVENT_TYPE_COUNT; ++event) {
- disableActivityEventIfEnabled(activity, event);
- }
- }
- }
-
- private void disableActivityEventIfEnabled(int activityType, int eventType) {
- if (mSupportedActivitiesEnabledEvents[activityType][eventType] != EVENT_TYPE_ENABLED) {
- return;
- }
-
- int result = nativeDisableActivityEvent(activityType, eventType);
- mSupportedActivitiesEnabledEvents[activityType][eventType] = EVENT_TYPE_DISABLED;
- String message = String.format(
- "DisableActivityEvent: activityType=%d, eventType=%d, result=%d",
- activityType,
- eventType,
- result);
- Log.e(TAG, message);
- }
- }
-
- // native bindings
- static { nativeClassInit(); }
-
- private static native void nativeClassInit();
- private static native boolean nativeIsSupported();
-
- private native void nativeInitialize();
- private native void nativeRelease();
- private native String[] nativeGetSupportedActivities();
- private native int nativeEnableActivityEvent(
- int activityType,
- int eventType,
- long reportLatenceNs);
- private native int nativeDisableActivityEvent(int activityType, int eventType);
- private native int nativeFlush();
-}
diff --git a/core/java/android/hardware/location/IActivityRecognitionHardware.aidl b/core/java/android/hardware/location/IActivityRecognitionHardware.aidl
deleted file mode 100644
index bc6b1830cd4f..000000000000
--- a/core/java/android/hardware/location/IActivityRecognitionHardware.aidl
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/license/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.hardware.location.IActivityRecognitionHardwareSink;
-
-/**
- * Activity Recognition Hardware provider interface.
- * This interface can be used to implement hardware based activity recognition.
- *
- * @hide
- */
-interface IActivityRecognitionHardware {
- /**
- * Gets an array of supported activities by hardware.
- */
- String[] getSupportedActivities();
-
- /**
- * Returns true if the given activity is supported, false otherwise.
- */
- boolean isActivitySupported(in String activityType);
-
- /**
- * Registers a sink with Hardware Activity-Recognition.
- */
- boolean registerSink(in IActivityRecognitionHardwareSink sink);
-
- /**
- * Unregisters a sink with Hardware Activity-Recognition.
- */
- boolean unregisterSink(in IActivityRecognitionHardwareSink sink);
-
- /**
- * Enables tracking of a given activity/event type, if the activity is supported.
- */
- boolean enableActivityEvent(in String activityType, int eventType, long reportLatencyNs);
-
- /**
- * Disables tracking of a given activity/eventy type.
- */
- boolean disableActivityEvent(in String activityType, int eventType);
-
- /**
- * Requests hardware for all the activity events detected up to the given point in time.
- */
- boolean flush();
-} \ No newline at end of file
diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl
deleted file mode 100644
index 3fe645c59a30..000000000000
--- a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/license/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.hardware.location.IActivityRecognitionHardware;
-
-/**
- * Activity Recognition Hardware client interface.
- * This interface can be used to receive interfaces to implementations of
- * {@link IActivityRecognitionHardware}.
- *
- * @hide
- */
-oneway interface IActivityRecognitionHardwareClient {
- /**
- * Hardware Activity-Recognition availability event.
- *
- * @param isSupported whether the platform has hardware support for the feature
- * @param instance the available instance to provide access to the feature
- */
- void onAvailabilityChanged(in boolean isSupported, in IActivityRecognitionHardware instance);
-}
diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl
deleted file mode 100644
index 12e3117259e1..000000000000
--- a/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/license/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.hardware.location.IActivityRecognitionHardware;
-
-/**
- * Activity Recognition Hardware watcher. This interface can be used to receive interfaces to
- * implementations of {@link IActivityRecognitionHardware}.
- *
- * @deprecated use {@link IActivityRecognitionHardwareClient} instead.
-
- * @hide
- */
-interface IActivityRecognitionHardwareWatcher {
- /**
- * Hardware Activity-Recognition availability event.
- */
- void onInstanceChanged(in IActivityRecognitionHardware instance);
-}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 7d40227f9c7d..d3509d5eb289 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -2856,7 +2856,7 @@ public class InputMethodService extends AbstractInputMethodService {
if (mNotifyUserActionSent) {
return;
}
- mPrivOps.notifyUserActionAsync();
+ mPrivOps.notifyUserAction();
mNotifyUserActionSent = true;
}
}
diff --git a/core/java/android/net/ApfCapabilitiesParcelable.aidl b/core/java/android/net/ApfCapabilitiesParcelable.aidl
new file mode 100644
index 000000000000..f0645d2782d2
--- /dev/null
+++ b/core/java/android/net/ApfCapabilitiesParcelable.aidl
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+parcelable ApfCapabilitiesParcelable {
+ int apfVersionSupported;
+ int maximumApfProgramSize;
+ int apfPacketFormat;
+} \ No newline at end of file
diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java
index ee05f2832a9a..4047068f1c7b 100644
--- a/core/java/android/net/CaptivePortal.java
+++ b/core/java/android/net/CaptivePortal.java
@@ -15,6 +15,8 @@
*/
package android.net;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -28,10 +30,16 @@ import android.os.RemoteException;
*/
public class CaptivePortal implements Parcelable {
/** @hide */
+ @SystemApi
+ @TestApi
public static final int APP_RETURN_DISMISSED = 0;
/** @hide */
+ @SystemApi
+ @TestApi
public static final int APP_RETURN_UNWANTED = 1;
/** @hide */
+ @SystemApi
+ @TestApi
public static final int APP_RETURN_WANTED_AS_IS = 2;
private final IBinder mBinder;
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 4b74f4675ad9..34275dd17ecf 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -16,12 +16,14 @@
package android.net;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.app.PendingIntent;
import android.content.Context;
@@ -254,6 +256,8 @@ public class ConnectivityManager {
* portal login activity.
* {@hide}
*/
+ @SystemApi
+ @TestApi
public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC =
"android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
@@ -261,6 +265,8 @@ public class ConnectivityManager {
* Key for passing a user agent string to the captive portal login activity.
* {@hide}
*/
+ @SystemApi
+ @TestApi
public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT =
"android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
@@ -916,6 +922,7 @@ public class ConnectivityManager {
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @Nullable
public NetworkInfo getActiveNetworkInfo() {
try {
return mService.getActiveNetworkInfo();
@@ -935,6 +942,7 @@ public class ConnectivityManager {
* {@code null} if no default network is currently active
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @Nullable
public Network getActiveNetwork() {
try {
return mService.getActiveNetwork();
@@ -956,6 +964,7 @@ public class ConnectivityManager {
* @hide
*/
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
+ @Nullable
public Network getActiveNetworkForUid(int uid) {
return getActiveNetworkForUid(uid, false);
}
@@ -1081,6 +1090,7 @@ public class ConnectivityManager {
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @Nullable
public NetworkInfo getNetworkInfo(int networkType) {
try {
return mService.getNetworkInfo(networkType);
@@ -1102,7 +1112,8 @@ public class ConnectivityManager {
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public NetworkInfo getNetworkInfo(Network network) {
+ @Nullable
+ public NetworkInfo getNetworkInfo(@Nullable Network network) {
return getNetworkInfoForUid(network, Process.myUid(), false);
}
@@ -1128,6 +1139,7 @@ public class ConnectivityManager {
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @NonNull
public NetworkInfo[] getAllNetworkInfo() {
try {
return mService.getAllNetworkInfo();
@@ -1163,6 +1175,7 @@ public class ConnectivityManager {
* @return an array of {@link Network} objects.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @NonNull
public Network[] getAllNetworks() {
try {
return mService.getAllNetworks();
@@ -1237,7 +1250,8 @@ public class ConnectivityManager {
* @return The {@link LinkProperties} for the network, or {@code null}.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public LinkProperties getLinkProperties(Network network) {
+ @Nullable
+ public LinkProperties getLinkProperties(@Nullable Network network) {
try {
return mService.getLinkProperties(network);
} catch (RemoteException e) {
@@ -1253,7 +1267,8 @@ public class ConnectivityManager {
* @return The {@link android.net.NetworkCapabilities} for the network, or {@code null}.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public NetworkCapabilities getNetworkCapabilities(Network network) {
+ @Nullable
+ public NetworkCapabilities getNetworkCapabilities(@Nullable Network network) {
try {
return mService.getNetworkCapabilities(network);
} catch (RemoteException e) {
@@ -2007,7 +2022,7 @@ public class ConnectivityManager {
*
* @param l Previously registered listener.
*/
- public void removeDefaultNetworkActiveListener(OnNetworkActiveListener l) {
+ public void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) {
INetworkActivityListener rl = mNetworkActivityListeners.get(l);
Preconditions.checkArgument(rl != null, "Listener was not registered.");
try {
@@ -2048,6 +2063,16 @@ public class ConnectivityManager {
return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
+ /** @hide */
+ public NetworkRequest getDefaultRequest() {
+ try {
+ // This is not racy as the default request is final in ConnectivityService.
+ return mService.getDefaultRequest();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/* TODO: These permissions checks don't belong in client-side code. Move them to
* services.jar, possibly in com.android.server.net. */
@@ -2482,6 +2507,8 @@ public class ConnectivityManager {
public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10;
/** {@hide} */
public static final int TETHER_ERROR_PROVISION_FAILED = 11;
+ /** {@hide} */
+ public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12;
/**
* Get a more detailed error code after a Tethering or Untethering
@@ -2535,7 +2562,7 @@ public class ConnectivityManager {
* working and non-working connectivity.
*/
@Deprecated
- public void reportBadNetwork(Network network) {
+ public void reportBadNetwork(@Nullable Network network) {
printStackTrace();
try {
// One of these will be ignored because it matches system's current state.
@@ -2558,7 +2585,7 @@ public class ConnectivityManager {
* @param hasConnectivity {@code true} if the application was able to successfully access the
* Internet using {@code network} or {@code false} if not.
*/
- public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
+ public void reportNetworkConnectivity(@Nullable Network network, boolean hasConnectivity) {
printStackTrace();
try {
mService.reportNetworkConnectivity(network, hasConnectivity);
@@ -2632,6 +2659,7 @@ public class ConnectivityManager {
* @return the {@link ProxyInfo} for the current HTTP proxy, or {@code null} if no
* HTTP proxy is active.
*/
+ @Nullable
public ProxyInfo getDefaultProxy() {
return getProxyForNetwork(getBoundNetworkForProcess());
}
@@ -3163,8 +3191,9 @@ public class ConnectivityManager {
*
* @hide
*/
- public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- int timeoutMs, int legacyType, Handler handler) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback, int timeoutMs, int legacyType,
+ @NonNull Handler handler) {
CallbackHandler cbHandler = new CallbackHandler(handler);
NetworkCapabilities nc = request.networkCapabilities;
sendRequestForNetwork(nc, networkCallback, timeoutMs, REQUEST, legacyType, cbHandler);
@@ -3201,7 +3230,8 @@ public class ConnectivityManager {
* @throws IllegalArgumentException if {@code request} specifies any mutable
* {@code NetworkCapabilities}.
*/
- public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback) {
requestNetwork(request, networkCallback, getDefaultHandler());
}
@@ -3236,8 +3266,8 @@ public class ConnectivityManager {
* @throws IllegalArgumentException if {@code request} specifies any mutable
* {@code NetworkCapabilities}.
*/
- public void requestNetwork(
- NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
CallbackHandler cbHandler = new CallbackHandler(handler);
requestNetwork(request, networkCallback, 0, legacyType, cbHandler);
@@ -3271,8 +3301,8 @@ public class ConnectivityManager {
* before {@link NetworkCallback#onUnavailable()} is called. The timeout must
* be a positive value (i.e. >0).
*/
- public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- int timeoutMs) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback, int timeoutMs) {
checkTimeout(timeoutMs);
int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
requestNetwork(request, networkCallback, timeoutMs, legacyType, getDefaultHandler());
@@ -3305,8 +3335,8 @@ public class ConnectivityManager {
* @param timeoutMs The time in milliseconds to attempt looking for a suitable network
* before {@link NetworkCallback#onUnavailable} is called.
*/
- public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- Handler handler, int timeoutMs) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler, int timeoutMs) {
checkTimeout(timeoutMs);
int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
CallbackHandler cbHandler = new CallbackHandler(handler);
@@ -3378,7 +3408,8 @@ public class ConnectivityManager {
* {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
* {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}.
*/
- public void requestNetwork(NetworkRequest request, PendingIntent operation) {
+ public void requestNetwork(@NonNull NetworkRequest request,
+ @NonNull PendingIntent operation) {
printStackTrace();
checkPendingIntentNotNull(operation);
try {
@@ -3402,7 +3433,7 @@ public class ConnectivityManager {
* {@link #requestNetwork(NetworkRequest, android.app.PendingIntent)} with the
* corresponding NetworkRequest you'd like to remove. Cannot be null.
*/
- public void releaseNetworkRequest(PendingIntent operation) {
+ public void releaseNetworkRequest(@NonNull PendingIntent operation) {
printStackTrace();
checkPendingIntentNotNull(operation);
try {
@@ -3435,7 +3466,8 @@ public class ConnectivityManager {
* The callback is invoked on the default internal Handler.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public void registerNetworkCallback(NetworkRequest request, NetworkCallback networkCallback) {
+ public void registerNetworkCallback(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback) {
registerNetworkCallback(request, networkCallback, getDefaultHandler());
}
@@ -3450,8 +3482,8 @@ public class ConnectivityManager {
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public void registerNetworkCallback(
- NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
+ public void registerNetworkCallback(@NonNull NetworkRequest request,
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
CallbackHandler cbHandler = new CallbackHandler(handler);
NetworkCapabilities nc = request.networkCapabilities;
sendRequestForNetwork(nc, networkCallback, 0, LISTEN, TYPE_NONE, cbHandler);
@@ -3487,7 +3519,8 @@ public class ConnectivityManager {
* comes from {@link PendingIntent#getBroadcast}. Cannot be null.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public void registerNetworkCallback(NetworkRequest request, PendingIntent operation) {
+ public void registerNetworkCallback(@NonNull NetworkRequest request,
+ @NonNull PendingIntent operation) {
printStackTrace();
checkPendingIntentNotNull(operation);
try {
@@ -3509,7 +3542,7 @@ public class ConnectivityManager {
* The callback is invoked on the default internal Handler.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public void registerDefaultNetworkCallback(NetworkCallback networkCallback) {
+ public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback) {
registerDefaultNetworkCallback(networkCallback, getDefaultHandler());
}
@@ -3523,7 +3556,8 @@ public class ConnectivityManager {
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public void registerDefaultNetworkCallback(NetworkCallback networkCallback, Handler handler) {
+ public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
+ @NonNull Handler handler) {
// This works because if the NetworkCapabilities are null,
// ConnectivityService takes them from the default request.
//
@@ -3548,7 +3582,7 @@ public class ConnectivityManager {
* @param network {@link Network} specifying which network you're interested.
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
*/
- public boolean requestBandwidthUpdate(Network network) {
+ public boolean requestBandwidthUpdate(@NonNull Network network) {
try {
return mService.requestBandwidthUpdate(network);
} catch (RemoteException e) {
@@ -3569,7 +3603,7 @@ public class ConnectivityManager {
*
* @param networkCallback The {@link NetworkCallback} used when making the request.
*/
- public void unregisterNetworkCallback(NetworkCallback networkCallback) {
+ public void unregisterNetworkCallback(@NonNull NetworkCallback networkCallback) {
printStackTrace();
checkCallbackNotNull(networkCallback);
final List<NetworkRequest> reqs = new ArrayList<>();
@@ -3608,7 +3642,7 @@ public class ConnectivityManager {
* {@link #registerNetworkCallback(NetworkRequest, android.app.PendingIntent)}.
* Cannot be null.
*/
- public void unregisterNetworkCallback(PendingIntent operation) {
+ public void unregisterNetworkCallback(@NonNull PendingIntent operation) {
checkPendingIntentNotNull(operation);
releaseNetworkRequest(operation);
}
@@ -3730,7 +3764,7 @@ public class ConnectivityManager {
* @return a bitwise OR of zero or more of the {@code MULTIPATH_PREFERENCE_*} constants.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public @MultipathPreference int getMultipathPreference(Network network) {
+ public @MultipathPreference int getMultipathPreference(@Nullable Network network) {
try {
return mService.getMultipathPreference(network);
} catch (RemoteException e) {
@@ -3768,7 +3802,7 @@ public class ConnectivityManager {
* the current binding.
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
*/
- public boolean bindProcessToNetwork(Network network) {
+ public boolean bindProcessToNetwork(@Nullable Network network) {
// Forcing callers to call through non-static function ensures ConnectivityManager
// instantiated.
return setProcessDefaultNetwork(network);
@@ -3796,7 +3830,7 @@ public class ConnectivityManager {
* is a direct replacement.
*/
@Deprecated
- public static boolean setProcessDefaultNetwork(Network network) {
+ public static boolean setProcessDefaultNetwork(@Nullable Network network) {
int netId = (network == null) ? NETID_UNSET : network.netId;
if (netId == NetworkUtils.getBoundNetworkForProcess()) {
return true;
@@ -3827,6 +3861,7 @@ public class ConnectivityManager {
*
* @return {@code Network} to which this process is bound, or {@code null}.
*/
+ @Nullable
public Network getBoundNetworkForProcess() {
// Forcing callers to call thru non-static function ensures ConnectivityManager
// instantiated.
@@ -3843,6 +3878,7 @@ public class ConnectivityManager {
* {@code getBoundNetworkForProcess} is a direct replacement.
*/
@Deprecated
+ @Nullable
public static Network getProcessDefaultNetwork() {
int netId = NetworkUtils.getBoundNetworkForProcess();
if (netId == NETID_UNSET) return null;
@@ -3969,6 +4005,7 @@ public class ConnectivityManager {
*
* @return Hash of network watchlist config file. Null if config does not exist.
*/
+ @Nullable
public byte[] getNetworkWatchlistConfigHash() {
try {
return mService.getNetworkWatchlistConfigHash();
@@ -3990,8 +4027,8 @@ public class ConnectivityManager {
* (e.g., if it is associated with the calling VPN app's tunnel) or
* {@link android.os.Process#INVALID_UID} if the connection is not found.
*/
- public int getConnectionOwnerUid(int protocol, InetSocketAddress local,
- InetSocketAddress remote) {
+ public int getConnectionOwnerUid(int protocol, @NonNull InetSocketAddress local,
+ @NonNull InetSocketAddress remote) {
ConnectionInfo connectionInfo = new ConnectionInfo(protocol, local, remote);
try {
return mService.getConnectionOwnerUid(connectionInfo);
diff --git a/core/java/android/net/DhcpResultsParcelable.aidl b/core/java/android/net/DhcpResultsParcelable.aidl
new file mode 100644
index 000000000000..cf5629b6f792
--- /dev/null
+++ b/core/java/android/net/DhcpResultsParcelable.aidl
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2019, 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 perNmissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.StaticIpConfigurationParcelable;
+
+parcelable DhcpResultsParcelable {
+ StaticIpConfigurationParcelable baseConfiguration;
+ int leaseDuration;
+ int mtu;
+ String serverAddress;
+ String vendorInfo;
+} \ No newline at end of file
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index e7d441df82a6..da5d96e49d02 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -167,6 +167,8 @@ interface IConnectivityManager
int getMultipathPreference(in Network Network);
+ NetworkRequest getDefaultRequest();
+
int getRestoreDefaultNetworkDelay(int networkType);
boolean addVpnAddress(String address, int prefixLength);
diff --git a/core/java/android/net/IIpMemoryStore.aidl b/core/java/android/net/IIpMemoryStore.aidl
new file mode 100644
index 000000000000..6f88dec8dee9
--- /dev/null
+++ b/core/java/android/net/IIpMemoryStore.aidl
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.ipmemorystore.Blob;
+import android.net.ipmemorystore.NetworkAttributesParcelable;
+import android.net.ipmemorystore.IOnBlobRetrievedListener;
+import android.net.ipmemorystore.IOnL2KeyResponseListener;
+import android.net.ipmemorystore.IOnNetworkAttributesRetrieved;
+import android.net.ipmemorystore.IOnSameNetworkResponseListener;
+import android.net.ipmemorystore.IOnStatusListener;
+
+/** {@hide} */
+oneway interface IIpMemoryStore {
+ /**
+ * Store network attributes for a given L2 key.
+ * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to
+ * calling findL2Key with the attributes and storing in the returned value.
+ *
+ * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2
+ * key and only care about grouping can pass a unique ID here like the ones
+ * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low
+ * relevance of such a network will lead to it being evicted soon if it's not
+ * refreshed. Use findL2Key to try and find a similar L2Key to these attributes.
+ * @param attributes The attributes for this network.
+ * @param listener A listener that will be invoked to inform of the completion of this call,
+ * or null if the client is not interested in learning about success/failure.
+ * @return (through the listener) The L2 key. This is useful if the L2 key was not specified.
+ * If the call failed, the L2 key will be null.
+ */
+ void storeNetworkAttributes(String l2Key, in NetworkAttributesParcelable attributes,
+ IOnStatusListener listener);
+
+ /**
+ * Store a binary blob associated with an L2 key and a name.
+ *
+ * @param l2Key The L2 key for this network.
+ * @param clientId The ID of the client.
+ * @param name The name of this data.
+ * @param data The data to store.
+ * @param listener A listener to inform of the completion of this call, or null if the client
+ * is not interested in learning about success/failure.
+ * @return (through the listener) A status to indicate success or failure.
+ */
+ void storeBlob(String l2Key, String clientId, String name, in Blob data,
+ IOnStatusListener listener);
+
+ /**
+ * Returns the best L2 key associated with the attributes.
+ *
+ * This will find a record that would be in the same group as the passed attributes. This is
+ * useful to choose the key for storing a sample or private data when the L2 key is not known.
+ * If multiple records are group-close to these attributes, the closest match is returned.
+ * If multiple records have the same closeness, the one with the smaller (unicode codepoint
+ * order) L2 key is returned.
+ * If no record matches these attributes, null is returned.
+ *
+ * @param attributes The attributes of the network to find.
+ * @param listener The listener that will be invoked to return the answer.
+ * @return (through the listener) The L2 key if one matched, or null.
+ */
+ void findL2Key(in NetworkAttributesParcelable attributes, IOnL2KeyResponseListener listener);
+
+ /**
+ * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point
+ * to the same L3 network. Group-closeness is used to determine this.
+ *
+ * @param l2Key1 The key for the first network.
+ * @param l2Key2 The key for the second network.
+ * @param listener The listener that will be invoked to return the answer.
+ * @return (through the listener) A SameL3NetworkResponse containing the answer and confidence.
+ */
+ void isSameNetwork(String l2Key1, String l2Key2, IOnSameNetworkResponseListener listener);
+
+ /**
+ * Retrieve the network attributes for a key.
+ * If no record is present for this key, this will return null attributes.
+ *
+ * @param l2Key The key of the network to query.
+ * @param listener The listener that will be invoked to return the answer.
+ * @return (through the listener) The network attributes and the L2 key associated with
+ * the query.
+ */
+ void retrieveNetworkAttributes(String l2Key, IOnNetworkAttributesRetrieved listener);
+
+ /**
+ * Retrieve previously stored private data.
+ * If no data was stored for this L2 key and name this will return null.
+ *
+ * @param l2Key The L2 key.
+ * @param clientId The id of the client that stored this data.
+ * @param name The name of the data.
+ * @param listener The listener that will be invoked to return the answer.
+ * @return (through the listener) The private data (or null), with the L2 key
+ * and the name of the data associated with the query.
+ */
+ void retrieveBlob(String l2Key, String clientId, String name,
+ IOnBlobRetrievedListener listener);
+}
diff --git a/core/java/android/net/INetworkMonitor.aidl b/core/java/android/net/INetworkMonitor.aidl
new file mode 100644
index 000000000000..41f969acad6f
--- /dev/null
+++ b/core/java/android/net/INetworkMonitor.aidl
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2018, 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 perNmissions and
+ * limitations under the License.
+ */
+package android.net;
+
+import android.net.PrivateDnsConfigParcel;
+
+/** @hide */
+oneway interface INetworkMonitor {
+ // After a network has been tested this result can be sent with EVENT_NETWORK_TESTED.
+ // The network should be used as a default internet connection. It was found to be:
+ // 1. a functioning network providing internet access, or
+ // 2. a captive portal and the user decided to use it as is.
+ const int NETWORK_TEST_RESULT_VALID = 0;
+
+ // After a network has been tested this result can be sent with EVENT_NETWORK_TESTED.
+ // The network should not be used as a default internet connection. It was found to be:
+ // 1. a captive portal and the user is prompted to sign-in, or
+ // 2. a captive portal and the user did not want to use it, or
+ // 3. a broken network (e.g. DNS failed, connect failed, HTTP request failed).
+ const int NETWORK_TEST_RESULT_INVALID = 1;
+
+ void start();
+ void launchCaptivePortalApp();
+ void forceReevaluation(int uid);
+ void notifyPrivateDnsChanged(in PrivateDnsConfigParcel config);
+ void notifyDnsResponse(int returnCode);
+ void notifySystemReady();
+ void notifyNetworkConnected();
+ void notifyNetworkDisconnected();
+ void notifyLinkPropertiesChanged();
+ void notifyNetworkCapabilitiesChanged();
+} \ No newline at end of file
diff --git a/core/java/android/net/INetworkMonitorCallbacks.aidl b/core/java/android/net/INetworkMonitorCallbacks.aidl
new file mode 100644
index 000000000000..0bc25750129b
--- /dev/null
+++ b/core/java/android/net/INetworkMonitorCallbacks.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.INetworkMonitor;
+import android.net.PrivateDnsConfigParcel;
+
+/** @hide */
+oneway interface INetworkMonitorCallbacks {
+ void onNetworkMonitorCreated(in INetworkMonitor networkMonitor);
+ void notifyNetworkTested(int testResult, @nullable String redirectUrl);
+ void notifyPrivateDnsConfigResolved(in PrivateDnsConfigParcel config);
+ void showProvisioningNotification(String action);
+ void hideProvisioningNotification();
+} \ No newline at end of file
diff --git a/core/java/android/net/INetworkStackConnector.aidl b/core/java/android/net/INetworkStackConnector.aidl
index 29f882858c05..2df8ab7ec198 100644
--- a/core/java/android/net/INetworkStackConnector.aidl
+++ b/core/java/android/net/INetworkStackConnector.aidl
@@ -15,7 +15,13 @@
*/
package android.net;
+import android.net.INetworkMonitorCallbacks;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServerCallbacks;
+
/** @hide */
oneway interface INetworkStackConnector {
- // TODO: requestDhcpServer(), etc. will go here
+ void makeDhcpServer(in String ifName, in DhcpServingParamsParcel params,
+ in IDhcpServerCallbacks cb);
+ void makeNetworkMonitor(int netId, String name, in INetworkMonitorCallbacks cb);
} \ No newline at end of file
diff --git a/core/java/android/net/INetworkStackStatusCallback.aidl b/core/java/android/net/INetworkStackStatusCallback.aidl
new file mode 100644
index 000000000000..51032d80a172
--- /dev/null
+++ b/core/java/android/net/INetworkStackStatusCallback.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+/** @hide */
+oneway interface INetworkStackStatusCallback {
+ void onStatusAvailable(int statusCode);
+} \ No newline at end of file
diff --git a/core/java/android/net/InitialConfigurationParcelable.aidl b/core/java/android/net/InitialConfigurationParcelable.aidl
new file mode 100644
index 000000000000..bdda355955a5
--- /dev/null
+++ b/core/java/android/net/InitialConfigurationParcelable.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.IpPrefixParcelable;
+import android.net.LinkAddressParcelable;
+
+parcelable InitialConfigurationParcelable {
+ LinkAddressParcelable[] ipAddresses;
+ IpPrefixParcelable[] directlyConnectedRoutes;
+ String[] dnsServers;
+ String gateway;
+} \ No newline at end of file
diff --git a/core/java/android/net/IpMemoryStore.java b/core/java/android/net/IpMemoryStore.java
new file mode 100644
index 000000000000..b35f09743877
--- /dev/null
+++ b/core/java/android/net/IpMemoryStore.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.net.ipmemorystore.Blob;
+import android.net.ipmemorystore.IOnBlobRetrievedListener;
+import android.net.ipmemorystore.IOnL2KeyResponseListener;
+import android.net.ipmemorystore.IOnNetworkAttributesRetrieved;
+import android.net.ipmemorystore.IOnSameNetworkResponseListener;
+import android.net.ipmemorystore.IOnStatusListener;
+import android.net.ipmemorystore.NetworkAttributes;
+import android.os.RemoteException;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * The interface for system components to access the IP memory store.
+ * @see com.android.server.net.ipmemorystore.IpMemoryStoreService
+ * @hide
+ */
+@SystemService(Context.IP_MEMORY_STORE_SERVICE)
+public class IpMemoryStore {
+ @NonNull final Context mContext;
+ @NonNull final IIpMemoryStore mService;
+
+ public IpMemoryStore(@NonNull final Context context, @NonNull final IIpMemoryStore service) {
+ mContext = Preconditions.checkNotNull(context, "missing context");
+ mService = Preconditions.checkNotNull(service, "missing IIpMemoryStore");
+ }
+
+ /**
+ * Store network attributes for a given L2 key.
+ * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to
+ * calling findL2Key with the attributes and storing in the returned value.
+ *
+ * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2
+ * key and only care about grouping can pass a unique ID here like the ones
+ * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low
+ * relevance of such a network will lead to it being evicted soon if it's not
+ * refreshed. Use findL2Key to try and find a similar L2Key to these attributes.
+ * @param attributes The attributes for this network.
+ * @param listener A listener that will be invoked to inform of the completion of this call,
+ * or null if the client is not interested in learning about success/failure.
+ * Through the listener, returns the L2 key. This is useful if the L2 key was not specified.
+ * If the call failed, the L2 key will be null.
+ */
+ public void storeNetworkAttributes(@NonNull final String l2Key,
+ @NonNull final NetworkAttributes attributes,
+ @Nullable final IOnStatusListener listener) {
+ try {
+ mService.storeNetworkAttributes(l2Key, attributes.toParcelable(), listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Store a binary blob associated with an L2 key and a name.
+ *
+ * @param l2Key The L2 key for this network.
+ * @param clientId The ID of the client.
+ * @param name The name of this data.
+ * @param data The data to store.
+ * @param listener A listener to inform of the completion of this call, or null if the client
+ * is not interested in learning about success/failure.
+ * Through the listener, returns a status to indicate success or failure.
+ */
+ public void storeBlob(@NonNull final String l2Key, @NonNull final String clientId,
+ @NonNull final String name, @NonNull final Blob data,
+ @Nullable final IOnStatusListener listener) {
+ try {
+ mService.storeBlob(l2Key, clientId, name, data, listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns the best L2 key associated with the attributes.
+ *
+ * This will find a record that would be in the same group as the passed attributes. This is
+ * useful to choose the key for storing a sample or private data when the L2 key is not known.
+ * If multiple records are group-close to these attributes, the closest match is returned.
+ * If multiple records have the same closeness, the one with the smaller (unicode codepoint
+ * order) L2 key is returned.
+ * If no record matches these attributes, null is returned.
+ *
+ * @param attributes The attributes of the network to find.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the L2 key if one matched, or null.
+ */
+ public void findL2Key(@NonNull final NetworkAttributes attributes,
+ @NonNull final IOnL2KeyResponseListener listener) {
+ try {
+ mService.findL2Key(attributes.toParcelable(), listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point
+ * to the same L3 network. Group-closeness is used to determine this.
+ *
+ * @param l2Key1 The key for the first network.
+ * @param l2Key2 The key for the second network.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, a SameL3NetworkResponse containing the answer and confidence.
+ */
+ public void isSameNetwork(@NonNull final String l2Key1, @NonNull final String l2Key2,
+ @NonNull final IOnSameNetworkResponseListener listener) {
+ try {
+ mService.isSameNetwork(l2Key1, l2Key2, listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve the network attributes for a key.
+ * If no record is present for this key, this will return null attributes.
+ *
+ * @param l2Key The key of the network to query.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the network attributes and the L2 key associated with
+ * the query.
+ */
+ public void retrieveNetworkAttributes(@NonNull final String l2Key,
+ @NonNull final IOnNetworkAttributesRetrieved listener) {
+ try {
+ mService.retrieveNetworkAttributes(l2Key, listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve previously stored private data.
+ * If no data was stored for this L2 key and name this will return null.
+ *
+ * @param l2Key The L2 key.
+ * @param clientId The id of the client that stored this data.
+ * @param name The name of the data.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the private data (or null), with the L2 key
+ * and the name of the data associated with the query.
+ */
+ public void retrieveBlob(@NonNull final String l2Key, @NonNull final String clientId,
+ @NonNull final String name, @NonNull final IOnBlobRetrievedListener listener) {
+ try {
+ mService.retrieveBlob(l2Key, clientId, name, listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+}
diff --git a/core/java/android/net/IpPrefixParcelable.aidl b/core/java/android/net/IpPrefixParcelable.aidl
new file mode 100644
index 000000000000..93a8d41936cc
--- /dev/null
+++ b/core/java/android/net/IpPrefixParcelable.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package android.net;
+
+parcelable IpPrefixParcelable {
+ String address;
+ int prefixLength;
+} \ No newline at end of file
diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java
index b40f15ae17ba..a536d08876d6 100644
--- a/core/java/android/net/LinkAddress.java
+++ b/core/java/android/net/LinkAddress.java
@@ -26,6 +26,7 @@ import static android.system.OsConstants.RT_SCOPE_SITE;
import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
@@ -117,7 +118,8 @@ public class LinkAddress implements Parcelable {
* @return true if the address is IPv6.
* @hide
*/
- @UnsupportedAppUsage
+ @TestApi
+ @SystemApi
public boolean isIPv6() {
return address instanceof Inet6Address;
}
@@ -126,6 +128,8 @@ public class LinkAddress implements Parcelable {
* @return true if the address is IPv4 or is a mapped IPv4 address.
* @hide
*/
+ @TestApi
+ @SystemApi
public boolean isIPv4() {
return address instanceof Inet4Address;
}
@@ -263,7 +267,8 @@ public class LinkAddress implements Parcelable {
* otherwise.
* @hide
*/
- @UnsupportedAppUsage
+ @TestApi
+ @SystemApi
public boolean isSameAddressAs(LinkAddress other) {
return address.equals(other.address) && prefixLength == other.prefixLength;
}
@@ -310,6 +315,8 @@ public class LinkAddress implements Parcelable {
* Returns true if this {@code LinkAddress} is global scope and preferred.
* @hide
*/
+ @TestApi
+ @SystemApi
public boolean isGlobalPreferred() {
/**
* Note that addresses flagged as IFA_F_OPTIMISTIC are
diff --git a/core/java/android/net/LinkAddressParcelable.aidl b/core/java/android/net/LinkAddressParcelable.aidl
new file mode 100644
index 000000000000..af8e79b21f69
--- /dev/null
+++ b/core/java/android/net/LinkAddressParcelable.aidl
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package android.net;
+
+parcelable LinkAddressParcelable {
+ String address;
+ int prefixLength;
+ int flags;
+ int scope;
+} \ No newline at end of file
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 3a792065155e..c2963fd605c0 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -55,6 +55,8 @@ public final class LinkProperties implements Parcelable {
private String mIfaceName;
private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>();
private ArrayList<InetAddress> mDnses = new ArrayList<>();
+ // PCSCF addresses are addresses of SIP proxies that only exist for the IMS core service.
+ private ArrayList<InetAddress> mPcscfs = new ArrayList<InetAddress>();
private ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<>();
private boolean mUsePrivateDns;
private String mPrivateDnsServerName;
@@ -64,6 +66,7 @@ public final class LinkProperties implements Parcelable {
private int mMtu;
// in the format "rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max"
private String mTcpBufferSizes;
+ private IpPrefix mNat64Prefix;
private static final int MIN_MTU = 68;
private static final int MIN_MTU_V6 = 1280;
@@ -179,6 +182,7 @@ public final class LinkProperties implements Parcelable {
mValidatedPrivateDnses.addAll(source.mValidatedPrivateDnses);
mUsePrivateDns = source.mUsePrivateDns;
mPrivateDnsServerName = source.mPrivateDnsServerName;
+ mPcscfs.addAll(source.mPcscfs);
mDomains = source.mDomains;
mRoutes.addAll(source.mRoutes);
mHttpProxy = (source.mHttpProxy == null) ? null : new ProxyInfo(source.mHttpProxy);
@@ -187,6 +191,7 @@ public final class LinkProperties implements Parcelable {
}
setMtu(source.mMtu);
mTcpBufferSizes = source.mTcpBufferSizes;
+ mNat64Prefix = source.mNat64Prefix;
}
}
@@ -525,6 +530,60 @@ public final class LinkProperties implements Parcelable {
}
/**
+ * Adds the given {@link InetAddress} to the list of PCSCF servers, if not present.
+ *
+ * @param pcscfServer The {@link InetAddress} to add to the list of PCSCF servers.
+ * @return true if the PCSCF server was added, false otherwise.
+ * @hide
+ */
+ public boolean addPcscfServer(InetAddress pcscfServer) {
+ if (pcscfServer != null && !mPcscfs.contains(pcscfServer)) {
+ mPcscfs.add(pcscfServer);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Removes the given {@link InetAddress} from the list of PCSCF servers.
+ *
+ * @param pcscf Server The {@link InetAddress} to remove from the list of PCSCF servers.
+ * @return true if the PCSCF server was removed, false otherwise.
+ * @hide
+ */
+ public boolean removePcscfServer(InetAddress pcscfServer) {
+ if (pcscfServer != null) {
+ return mPcscfs.remove(pcscfServer);
+ }
+ return false;
+ }
+
+ /**
+ * Replaces the PCSCF servers in this {@code LinkProperties} with
+ * the given {@link Collection} of {@link InetAddress} objects.
+ *
+ * @param addresses The {@link Collection} of PCSCF servers to set in this object.
+ * @hide
+ */
+ public void setPcscfServers(Collection<InetAddress> pcscfServers) {
+ mPcscfs.clear();
+ for (InetAddress pcscfServer: pcscfServers) {
+ addPcscfServer(pcscfServer);
+ }
+ }
+
+ /**
+ * Returns all the {@link InetAddress} for PCSCF servers on this link.
+ *
+ * @return An unmodifiable {@link List} of {@link InetAddress} for PCSCF servers on
+ * this link.
+ * @hide
+ */
+ public List<InetAddress> getPcscfServers() {
+ return Collections.unmodifiableList(mPcscfs);
+ }
+
+ /**
* Sets the DNS domain search path used on this link.
*
* @param domains A {@link String} listing in priority order the comma separated
@@ -703,6 +762,32 @@ public final class LinkProperties implements Parcelable {
}
/**
+ * Returns the NAT64 prefix in use on this link, if any.
+ *
+ * @return the NAT64 prefix.
+ * @hide
+ */
+ public @Nullable IpPrefix getNat64Prefix() {
+ return mNat64Prefix;
+ }
+
+ /**
+ * Sets the NAT64 prefix in use on this link.
+ *
+ * Currently, only 96-bit prefixes (i.e., where the 32-bit IPv4 address is at the end of the
+ * 128-bit IPv6 address) are supported.
+ *
+ * @param prefix the NAT64 prefix.
+ * @hide
+ */
+ public void setNat64Prefix(IpPrefix prefix) {
+ if (prefix != null && prefix.getPrefixLength() != 96) {
+ throw new IllegalArgumentException("Only 96-bit prefixes are supported: " + prefix);
+ }
+ mNat64Prefix = prefix; // IpPrefix objects are immutable.
+ }
+
+ /**
* Adds a stacked link.
*
* If there is already a stacked link with the same interface name as link,
@@ -767,12 +852,14 @@ public final class LinkProperties implements Parcelable {
mDnses.clear();
mUsePrivateDns = false;
mPrivateDnsServerName = null;
+ mPcscfs.clear();
mDomains = null;
mRoutes.clear();
mHttpProxy = null;
mStackedLinks.clear();
mMtu = 0;
mTcpBufferSizes = null;
+ mNat64Prefix = null;
}
/**
@@ -813,6 +900,12 @@ public final class LinkProperties implements Parcelable {
resultJoiner.add(mPrivateDnsServerName);
}
+ if (!mPcscfs.isEmpty()) {
+ resultJoiner.add("PcscfAddresses: [");
+ resultJoiner.add(TextUtils.join(",", mPcscfs));
+ resultJoiner.add("]");
+ }
+
if (!mValidatedPrivateDnses.isEmpty()) {
final StringJoiner validatedPrivateDnsesJoiner =
new StringJoiner(",", "ValidatedPrivateDnsAddresses: [", "]");
@@ -844,6 +937,11 @@ public final class LinkProperties implements Parcelable {
resultJoiner.add(mHttpProxy.toString());
}
+ if (mNat64Prefix != null) {
+ resultJoiner.add("Nat64Prefix:");
+ resultJoiner.add(mNat64Prefix.toString());
+ }
+
final Collection<LinkProperties> stackedLinksValues = mStackedLinks.values();
if (!stackedLinksValues.isEmpty()) {
final StringJoiner stackedLinksJoiner = new StringJoiner(",", "Stacked: [", "]");
@@ -965,6 +1063,36 @@ public final class LinkProperties implements Parcelable {
}
/**
+ * Returns true if this link has an IPv4 PCSCF server.
+ *
+ * @return {@code true} if there is an IPv4 PCSCF server, {@code false} otherwise.
+ * @hide
+ */
+ public boolean hasIPv4PcscfServer() {
+ for (InetAddress ia : mPcscfs) {
+ if (ia instanceof Inet4Address) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this link has an IPv6 PCSCF server.
+ *
+ * @return {@code true} if there is an IPv6 PCSCF server, {@code false} otherwise.
+ * @hide
+ */
+ public boolean hasIPv6PcscfServer() {
+ for (InetAddress ia : mPcscfs) {
+ if (ia instanceof Inet6Address) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Returns true if this link is provisioned for global IPv4 connectivity.
* This requires an IP address, default route, and DNS server.
*
@@ -1117,6 +1245,19 @@ public final class LinkProperties implements Parcelable {
}
/**
+ * Compares this {@code LinkProperties} PCSCF addresses against the target
+ *
+ * @param target LinkProperties to compare.
+ * @return {@code true} if both are identical, {@code false} otherwise.
+ * @hide
+ */
+ public boolean isIdenticalPcscfs(LinkProperties target) {
+ Collection<InetAddress> targetPcscfs = target.getPcscfServers();
+ return (mPcscfs.size() == targetPcscfs.size()) ?
+ mPcscfs.containsAll(targetPcscfs) : false;
+ }
+
+ /**
* Compares this {@code LinkProperties} Routes against the target
*
* @param target LinkProperties to compare.
@@ -1188,6 +1329,17 @@ public final class LinkProperties implements Parcelable {
}
/**
+ * Compares this {@code LinkProperties} NAT64 prefix against the target.
+ *
+ * @param target LinkProperties to compare.
+ * @return {@code true} if both are identical, {@code false} otherwise.
+ * @hide
+ */
+ public boolean isIdenticalNat64Prefix(LinkProperties target) {
+ return Objects.equals(mNat64Prefix, target.mNat64Prefix);
+ }
+
+ /**
* Compares this {@code LinkProperties} instance against the target
* LinkProperties in {@code obj}. Two LinkPropertieses are equal if
* all their fields are equal in values.
@@ -1218,11 +1370,13 @@ public final class LinkProperties implements Parcelable {
&& isIdenticalDnses(target)
&& isIdenticalPrivateDns(target)
&& isIdenticalValidatedPrivateDnses(target)
+ && isIdenticalPcscfs(target)
&& isIdenticalRoutes(target)
&& isIdenticalHttpProxy(target)
&& isIdenticalStackedLinks(target)
&& isIdenticalMtu(target)
- && isIdenticalTcpBufferSizes(target);
+ && isIdenticalTcpBufferSizes(target)
+ && isIdenticalNat64Prefix(target);
}
/**
@@ -1334,7 +1488,9 @@ public final class LinkProperties implements Parcelable {
+ mMtu * 51
+ ((null == mTcpBufferSizes) ? 0 : mTcpBufferSizes.hashCode())
+ (mUsePrivateDns ? 57 : 0)
- + ((null == mPrivateDnsServerName) ? 0 : mPrivateDnsServerName.hashCode());
+ + mPcscfs.size() * 67
+ + ((null == mPrivateDnsServerName) ? 0 : mPrivateDnsServerName.hashCode())
+ + Objects.hash(mNat64Prefix);
}
/**
@@ -1357,6 +1513,10 @@ public final class LinkProperties implements Parcelable {
}
dest.writeBoolean(mUsePrivateDns);
dest.writeString(mPrivateDnsServerName);
+ dest.writeInt(mPcscfs.size());
+ for (InetAddress d : mPcscfs) {
+ dest.writeByteArray(d.getAddress());
+ }
dest.writeString(mDomains);
dest.writeInt(mMtu);
dest.writeString(mTcpBufferSizes);
@@ -1371,6 +1531,8 @@ public final class LinkProperties implements Parcelable {
} else {
dest.writeByte((byte)0);
}
+ dest.writeParcelable(mNat64Prefix, 0);
+
ArrayList<LinkProperties> stackedLinks = new ArrayList<>(mStackedLinks.values());
dest.writeList(stackedLinks);
}
@@ -1406,6 +1568,12 @@ public final class LinkProperties implements Parcelable {
}
netProp.setUsePrivateDns(in.readBoolean());
netProp.setPrivateDnsServerName(in.readString());
+ addressCount = in.readInt();
+ for (int i = 0; i < addressCount; i++) {
+ try {
+ netProp.addPcscfServer(InetAddress.getByAddress(in.createByteArray()));
+ } catch (UnknownHostException e) { }
+ }
netProp.setDomains(in.readString());
netProp.setMtu(in.readInt());
netProp.setTcpBufferSizes(in.readString());
@@ -1416,6 +1584,7 @@ public final class LinkProperties implements Parcelable {
if (in.readByte() == 1) {
netProp.setHttpProxy(in.readParcelable(null));
}
+ netProp.setNat64Prefix(in.readParcelable(null));
ArrayList<LinkProperties> stackedLinks = new ArrayList<LinkProperties>();
in.readList(stackedLinks, LinkProperties.class.getClassLoader());
for (LinkProperties stackedLink: stackedLinks) {
diff --git a/core/java/android/net/LinkPropertiesParcelable.aidl b/core/java/android/net/LinkPropertiesParcelable.aidl
new file mode 100644
index 000000000000..b153dc70e1b8
--- /dev/null
+++ b/core/java/android/net/LinkPropertiesParcelable.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package android.net;
+
+import android.net.IpPrefixParcelable;
+import android.net.LinkAddressParcelable;
+import android.net.ProxyInfoParcelable;
+import android.net.RouteInfoParcelable;
+
+parcelable LinkPropertiesParcelable {
+ String ifaceName;
+ LinkAddressParcelable[] linkAddresses;
+ String[] dnses;
+ String[] pcscfs;
+ String[] validatedPrivateDnses;
+ boolean usePrivateDns;
+ String privateDnsServerName;
+ String domains;
+ RouteInfoParcelable[] routes;
+ ProxyInfoParcelable httpProxy;
+ int mtu;
+ String tcpBufferSizes;
+ IpPrefixParcelable nat64Prefix;
+ LinkPropertiesParcelable[] stackedLinks;
+} \ No newline at end of file
diff --git a/core/java/android/net/MacAddress.java b/core/java/android/net/MacAddress.java
index 4e551756198e..77d83f5ff377 100644
--- a/core/java/android/net/MacAddress.java
+++ b/core/java/android/net/MacAddress.java
@@ -52,6 +52,8 @@ public final class MacAddress implements Parcelable {
/**
* The MacAddress zero MAC address.
+ *
+ * <p>Not publicly exposed or treated specially since the OUI 00:00:00 is registered.
* @hide
*/
@UnsupportedAppUsage
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index bf2344d4a9f6..2c831de72051 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -16,6 +16,8 @@
package android.net;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -157,6 +159,8 @@ public class Network implements Parcelable {
*
* @hide
*/
+ @TestApi
+ @SystemApi
public Network getPrivateDnsBypassingCopy() {
return new Network(netId, true);
}
diff --git a/core/java/android/net/NetworkParcelable.aidl b/core/java/android/net/NetworkParcelable.aidl
new file mode 100644
index 000000000000..c26352efb078
--- /dev/null
+++ b/core/java/android/net/NetworkParcelable.aidl
@@ -0,0 +1,22 @@
+/*
+**
+** Copyright (C) 2019 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.net;
+
+parcelable NetworkParcelable {
+ long networkHandle;
+}
diff --git a/core/java/android/net/NetworkSpecifier.java b/core/java/android/net/NetworkSpecifier.java
index be2f9551daff..fcfb72035c19 100644
--- a/core/java/android/net/NetworkSpecifier.java
+++ b/core/java/android/net/NetworkSpecifier.java
@@ -17,7 +17,7 @@
package android.net;
/**
- * Describes specific properties of a network for use in a {@link NetworkRequest}.
+ * Describes specific properties of a requested network for use in a {@link NetworkRequest}.
*
* Applications cannot instantiate this class by themselves, but can obtain instances of
* subclasses of this class via other APIs.
@@ -49,4 +49,29 @@ public abstract class NetworkSpecifier {
public void assertValidFromUid(int requestorUid) {
// empty
}
+
+ /**
+ * Optional method which can be overridden by concrete implementations of NetworkSpecifier to
+ * perform any redaction of information from the NetworkSpecifier, e.g. if it contains
+ * sensitive information. The default implementation simply returns the object itself - i.e.
+ * no information is redacted. A concrete implementation may return a modified (copy) of the
+ * NetworkSpecifier, or even return a null to fully remove all information.
+ * <p>
+ * This method is relevant to NetworkSpecifier objects used by agents - those are shared with
+ * apps by default. Some agents may store sensitive matching information in the specifier,
+ * e.g. a Wi-Fi SSID (which should not be shared since it may leak location). Those classes
+ * can redact to a null. Other agents use the Network Specifier to share public information
+ * with apps - those should not be redacted.
+ * <p>
+ * The default implementation redacts no information.
+ *
+ * @return A NetworkSpecifier object to be passed along to the requesting app.
+ *
+ * @hide
+ */
+ public NetworkSpecifier redact() {
+ // TODO (b/122160111): convert default to null once all platform NetworkSpecifiers
+ // implement this method.
+ return this;
+ }
}
diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java
index 82a4e31a81dd..af043eeccde2 100644
--- a/core/java/android/net/NetworkStack.java
+++ b/core/java/android/net/NetworkStack.java
@@ -25,9 +25,12 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServerCallbacks;
import android.os.Binder;
import android.os.IBinder;
import android.os.Process;
+import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.util.Slog;
@@ -45,19 +48,56 @@ import java.util.ArrayList;
public class NetworkStack {
private static final String TAG = NetworkStack.class.getSimpleName();
+ public static final String NETWORKSTACK_PACKAGE_NAME = "com.android.mainline.networkstack";
+
+ private static final int NETWORKSTACK_TIMEOUT_MS = 10_000;
+
@NonNull
@GuardedBy("mPendingNetStackRequests")
- private final ArrayList<NetworkStackRequest> mPendingNetStackRequests = new ArrayList<>();
+ private final ArrayList<NetworkStackCallback> mPendingNetStackRequests = new ArrayList<>();
@Nullable
@GuardedBy("mPendingNetStackRequests")
private INetworkStackConnector mConnector;
- private interface NetworkStackRequest {
+ private volatile boolean mNetworkStackStartRequested = false;
+
+ private interface NetworkStackCallback {
void onNetworkStackConnected(INetworkStackConnector connector);
}
public NetworkStack() { }
+ /**
+ * Create a DHCP server according to the specified parameters.
+ *
+ * <p>The server will be returned asynchronously through the provided callbacks.
+ */
+ public void makeDhcpServer(final String ifName, final DhcpServingParamsParcel params,
+ final IDhcpServerCallbacks cb) {
+ requestConnector(connector -> {
+ try {
+ connector.makeDhcpServer(ifName, params, cb);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ });
+ }
+
+ /**
+ * Create a NetworkMonitor.
+ *
+ * <p>The INetworkMonitor will be returned asynchronously through the provided callbacks.
+ */
+ public void makeNetworkMonitor(Network network, String name, INetworkMonitorCallbacks cb) {
+ requestConnector(connector -> {
+ try {
+ connector.makeNetworkMonitor(network.netId, name, cb);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ });
+ }
+
private class NetworkStackConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
@@ -77,14 +117,14 @@ public class NetworkStack {
ServiceManager.addService(Context.NETWORK_STACK_SERVICE, service, false /* allowIsolated */,
DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
- final ArrayList<NetworkStackRequest> requests;
+ final ArrayList<NetworkStackCallback> requests;
synchronized (mPendingNetStackRequests) {
requests = new ArrayList<>(mPendingNetStackRequests);
mPendingNetStackRequests.clear();
mConnector = connector;
}
- for (NetworkStackRequest r : requests) {
+ for (NetworkStackCallback r : requests) {
r.onNetworkStackConnected(connector);
}
}
@@ -98,6 +138,7 @@ public class NetworkStack {
* started.
*/
public void start(Context context) {
+ mNetworkStackStartRequested = true;
// Try to bind in-process if the library is available
IBinder connector = null;
try {
@@ -105,7 +146,8 @@ public class NetworkStack {
"com.android.server.NetworkStackService",
true /* initialize */,
context.getClassLoader());
- connector = (IBinder) service.getMethod("makeConnector").invoke(null);
+ connector = (IBinder) service.getMethod("makeConnector", Context.class)
+ .invoke(null, context);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
Slog.wtf(TAG, "Could not create network stack connector from NetworkStackService");
// TODO: crash/reboot system here ?
@@ -133,15 +175,54 @@ public class NetworkStack {
}
}
- // TODO: use this method to obtain the connector when implementing network stack operations
- private void requestConnector(@NonNull NetworkStackRequest request) {
+ /**
+ * For non-system server clients, get the connector registered by the system server.
+ */
+ private INetworkStackConnector getRemoteConnector() {
+ // Block until the NetworkStack connector is registered in ServiceManager.
+ // <p>This is only useful for non-system processes that do not have a way to be notified of
+ // registration completion. Adding a callback system would be too heavy weight considering
+ // that the connector is registered on boot, so it is unlikely that a client would request
+ // it before it is registered.
+ // TODO: consider blocking boot on registration and simplify much of the logic in this class
+ IBinder connector;
+ try {
+ final long before = System.currentTimeMillis();
+ while ((connector = ServiceManager.getService(Context.NETWORK_STACK_SERVICE)) == null) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) {
+ Slog.e(TAG, "Timeout waiting for NetworkStack connector");
+ return null;
+ }
+ }
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Error waiting for NetworkStack connector", e);
+ return null;
+ }
+
+ return INetworkStackConnector.Stub.asInterface(connector);
+ }
+
+ private void requestConnector(@NonNull NetworkStackCallback request) {
// TODO: PID check.
- if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+ final int caller = Binder.getCallingUid();
+ if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
// Don't even attempt to obtain the connector and give a nice error message
throw new SecurityException(
"Only the system server should try to bind to the network stack.");
}
+ if (!mNetworkStackStartRequested) {
+ // The network stack is not being started in this process, e.g. this process is not
+ // the system server. Get a remote connector registered by the system server.
+ final INetworkStackConnector connector = getRemoteConnector();
+ synchronized (mPendingNetStackRequests) {
+ mConnector = connector;
+ }
+ request.onNetworkStackConnected(connector);
+ return;
+ }
+
final INetworkStackConnector connector;
synchronized (mPendingNetStackRequests) {
connector = mConnector;
diff --git a/core/java/android/net/PrivateDnsConfigParcel.aidl b/core/java/android/net/PrivateDnsConfigParcel.aidl
new file mode 100644
index 000000000000..b52fce643302
--- /dev/null
+++ b/core/java/android/net/PrivateDnsConfigParcel.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+parcelable PrivateDnsConfigParcel {
+ String hostname;
+ String[] ips;
+}
diff --git a/core/java/android/net/ProvisioningConfigurationParcelable.aidl b/core/java/android/net/ProvisioningConfigurationParcelable.aidl
new file mode 100644
index 000000000000..2a144f2aae3b
--- /dev/null
+++ b/core/java/android/net/ProvisioningConfigurationParcelable.aidl
@@ -0,0 +1,38 @@
+/*
+**
+** Copyright (C) 2019 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.net;
+
+import android.net.ApfCapabilitiesParcelable;
+import android.net.InitialConfigurationParcelable;
+import android.net.NetworkParcelable;
+import android.net.StaticIpConfigurationParcelable;
+
+parcelable ProvisioningConfigurationParcelable {
+ boolean enableIPv4;
+ boolean enableIPv6;
+ boolean usingMultinetworkPolicyTracker;
+ boolean usingIpReachabilityMonitor;
+ int requestedPreDhcpActionMs;
+ InitialConfigurationParcelable initialConfig;
+ StaticIpConfigurationParcelable staticIpConfig;
+ ApfCapabilitiesParcelable apfCapabilities;
+ int provisioningTimeoutMs;
+ int ipv6AddrGenMode;
+ NetworkParcelable network;
+ String displayName;
+}
diff --git a/core/java/android/net/ProxyInfoParcelable.aidl b/core/java/android/net/ProxyInfoParcelable.aidl
new file mode 100644
index 000000000000..59fd8467b820
--- /dev/null
+++ b/core/java/android/net/ProxyInfoParcelable.aidl
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package android.net;
+
+parcelable ProxyInfoParcelable {
+ String host;
+ int port;
+ String[] exclusionList;
+ String pacFileUrl;
+}
diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java
index 37ab9ffb1f5b..6bf2c67da990 100644
--- a/core/java/android/net/RouteInfo.java
+++ b/core/java/android/net/RouteInfo.java
@@ -16,16 +16,17 @@
package android.net;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
-import java.net.UnknownHostException;
-import java.net.InetAddress;
import java.net.Inet4Address;
import java.net.Inet6Address;
-
+import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.Collection;
import java.util.Objects;
@@ -67,12 +68,18 @@ public final class RouteInfo implements Parcelable {
/** Unicast route. @hide */
+ @SystemApi
+ @TestApi
public static final int RTN_UNICAST = 1;
/** Unreachable route. @hide */
+ @SystemApi
+ @TestApi
public static final int RTN_UNREACHABLE = 7;
/** Throw route. @hide */
+ @SystemApi
+ @TestApi
public static final int RTN_THROW = 9;
/**
@@ -317,6 +324,8 @@ public final class RouteInfo implements Parcelable {
*
* @hide
*/
+ @TestApi
+ @SystemApi
public int getType() {
return mType;
}
@@ -362,9 +371,7 @@ public final class RouteInfo implements Parcelable {
* ({@code false}).
*
* @return {@code true} if a gateway is specified
- * @hide
*/
- @UnsupportedAppUsage
public boolean hasGateway() {
return mHasGateway;
}
diff --git a/core/java/android/net/RouteInfoParcelable.aidl b/core/java/android/net/RouteInfoParcelable.aidl
new file mode 100644
index 000000000000..15bcdcfc2000
--- /dev/null
+++ b/core/java/android/net/RouteInfoParcelable.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package android.net;
+
+import android.net.IpPrefixParcelable;
+
+parcelable RouteInfoParcelable {
+ IpPrefixParcelable destination;
+ String gatewayAddr;
+ String ifaceName;
+ int type;
+}
diff --git a/core/java/android/net/StaticIpConfigurationParcelable.aidl b/core/java/android/net/StaticIpConfigurationParcelable.aidl
new file mode 100644
index 000000000000..45dc0210dfba
--- /dev/null
+++ b/core/java/android/net/StaticIpConfigurationParcelable.aidl
@@ -0,0 +1,27 @@
+/*
+**
+** Copyright (C) 2019 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.net;
+
+import android.net.LinkAddressParcelable;
+
+parcelable StaticIpConfigurationParcelable {
+ LinkAddressParcelable ipAddress;
+ String gateway;
+ String[] dnsServers;
+ String domains;
+}
diff --git a/services/net/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java
index dec8ca207343..f28cdc902848 100644
--- a/services/net/java/android/net/apf/ApfCapabilities.java
+++ b/core/java/android/net/apf/ApfCapabilities.java
@@ -38,18 +38,28 @@ public class ApfCapabilities {
*/
public final int apfPacketFormat;
- public ApfCapabilities(int apfVersionSupported, int maximumApfProgramSize, int apfPacketFormat)
- {
+ public ApfCapabilities(
+ int apfVersionSupported, int maximumApfProgramSize, int apfPacketFormat) {
this.apfVersionSupported = apfVersionSupported;
this.maximumApfProgramSize = maximumApfProgramSize;
this.apfPacketFormat = apfPacketFormat;
}
+ @Override
public String toString() {
return String.format("%s{version: %d, maxSize: %d, format: %d}", getClass().getSimpleName(),
apfVersionSupported, maximumApfProgramSize, apfPacketFormat);
}
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof ApfCapabilities)) return false;
+ final ApfCapabilities other = (ApfCapabilities) obj;
+ return apfVersionSupported == other.apfVersionSupported
+ && maximumApfProgramSize == other.maximumApfProgramSize
+ && apfPacketFormat == other.apfPacketFormat;
+ }
+
/**
* Returns true if the APF interpreter advertises support for the data buffer access opcodes
* LDDW and STDW.
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRuleTest.java b/core/java/android/net/dhcp/DhcpServerCallbacks.java
index 343d35959df4..bb56876c77f5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
+++ b/core/java/android/net/dhcp/DhcpServerCallbacks.java
@@ -14,31 +14,20 @@
* limitations under the License.
*/
-package com.android.server.wm;
-
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Rule;
-import org.junit.Test;
+package android.net.dhcp;
/**
- * Build/InstallRun:
- * atest FrameworksServicesTests:WindowManagerServiceRuleTest
+ * Convenience wrapper around IDhcpServerCallbacks.Stub that implements getInterfaceVersion().
+ * @hide
*/
-@Presubmit
-@SmallTest
-public class WindowManagerServiceRuleTest {
-
- @Rule
- public final WindowManagerServiceRule mRule = new WindowManagerServiceRule();
-
- @Test
- public void testWindowManagerSetUp() {
- assertThat(mRule.getWindowManagerService(), notNullValue());
+public abstract class DhcpServerCallbacks extends IDhcpServerCallbacks.Stub {
+ // TODO: add @Override here once the API is versioned
+
+ /**
+ * Get the version of the aidl interface implemented by the callbacks.
+ */
+ public int getInterfaceVersion() {
+ // TODO: return IDhcpServerCallbacks.VERSION;
+ return 0;
}
}
diff --git a/core/java/android/net/dhcp/DhcpServingParamsParcel.aidl b/core/java/android/net/dhcp/DhcpServingParamsParcel.aidl
new file mode 100644
index 000000000000..7b8b9ee324bc
--- /dev/null
+++ b/core/java/android/net/dhcp/DhcpServingParamsParcel.aidl
@@ -0,0 +1,30 @@
+/**
+ *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.dhcp;
+
+parcelable DhcpServingParamsParcel {
+ int serverAddr;
+ int serverAddrPrefixLength;
+ int[] defaultRouters;
+ int[] dnsServers;
+ int[] excludedAddrs;
+ long dhcpLeaseTimeSecs;
+ int linkMtu;
+ boolean metered;
+}
+
diff --git a/core/java/android/net/dhcp/IDhcpServer.aidl b/core/java/android/net/dhcp/IDhcpServer.aidl
new file mode 100644
index 000000000000..559433b13962
--- /dev/null
+++ b/core/java/android/net/dhcp/IDhcpServer.aidl
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2018, 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 perNmissions and
+ * limitations under the License.
+ */
+
+package android.net.dhcp;
+
+import android.net.INetworkStackStatusCallback;
+import android.net.dhcp.DhcpServingParamsParcel;
+
+/** @hide */
+oneway interface IDhcpServer {
+ const int STATUS_UNKNOWN = 0;
+ const int STATUS_SUCCESS = 1;
+ const int STATUS_INVALID_ARGUMENT = 2;
+ const int STATUS_UNKNOWN_ERROR = 3;
+
+ void start(in INetworkStackStatusCallback cb);
+ void updateParams(in DhcpServingParamsParcel params, in INetworkStackStatusCallback cb);
+ void stop(in INetworkStackStatusCallback cb);
+}
diff --git a/core/java/android/net/dhcp/IDhcpServerCallbacks.aidl b/core/java/android/net/dhcp/IDhcpServerCallbacks.aidl
new file mode 100644
index 000000000000..7ab4dcdbe584
--- /dev/null
+++ b/core/java/android/net/dhcp/IDhcpServerCallbacks.aidl
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2018, 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 perNmissions and
+ * limitations under the License.
+ */
+
+package android.net.dhcp;
+
+import android.net.dhcp.IDhcpServer;
+
+/** @hide */
+oneway interface IDhcpServerCallbacks {
+ void onDhcpServerCreated(int statusCode, in IDhcpServer server);
+}
diff --git a/core/java/android/net/ip/IIpClient.aidl b/core/java/android/net/ip/IIpClient.aidl
new file mode 100644
index 000000000000..7769ec2b65ac
--- /dev/null
+++ b/core/java/android/net/ip/IIpClient.aidl
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2019, 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 perNmissions and
+ * limitations under the License.
+ */
+package android.net.ip;
+
+import android.net.ProxyInfoParcelable;
+import android.net.ProvisioningConfigurationParcelable;
+
+/** @hide */
+oneway interface IIpClient {
+ void completedPreDhcpAction();
+ void confirmConfiguration();
+ void readPacketFilterComplete(in byte[] data);
+ void shutdown();
+ void startProvisioning(in ProvisioningConfigurationParcelable req);
+ void stop();
+ void setTcpBufferSizes(in String tcpBufferSizes);
+ void setHttpProxy(in ProxyInfoParcelable proxyInfo);
+ void setMulticastFilter(boolean enabled);
+}
diff --git a/core/java/android/net/ip/IIpClientCallbacks.aidl b/core/java/android/net/ip/IIpClientCallbacks.aidl
new file mode 100644
index 000000000000..f077e3b77ac7
--- /dev/null
+++ b/core/java/android/net/ip/IIpClientCallbacks.aidl
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2019, 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 perNmissions and
+ * limitations under the License.
+ */
+package android.net.ip;
+
+import android.net.LinkPropertiesParcelable;
+import android.net.ip.IIpClient;
+import android.net.DhcpResultsParcelable;
+
+/** @hide */
+oneway interface IIpClientCallbacks {
+ void onIpClientCreated(in IIpClient ipClient);
+
+ void onPreDhcpAction();
+ void onPostDhcpAction();
+
+ // This is purely advisory and not an indication of provisioning
+ // success or failure. This is only here for callers that want to
+ // expose DHCPv4 results to other APIs (e.g., WifiInfo#setInetAddress).
+ // DHCPv4 or static IPv4 configuration failure or success can be
+ // determined by whether or not the passed-in DhcpResults object is
+ // null or not.
+ void onNewDhcpResults(in DhcpResultsParcelable dhcpResults);
+
+ void onProvisioningSuccess(in LinkPropertiesParcelable newLp);
+ void onProvisioningFailure(in LinkPropertiesParcelable newLp);
+
+ // Invoked on LinkProperties changes.
+ void onLinkPropertiesChange(in LinkPropertiesParcelable newLp);
+
+ // Called when the internal IpReachabilityMonitor (if enabled) has
+ // detected the loss of a critical number of required neighbors.
+ void onReachabilityLost(in String logMsg);
+
+ // Called when the IpClient state machine terminates.
+ void onQuit();
+
+ // Install an APF program to filter incoming packets.
+ void installPacketFilter(in byte[] filter);
+
+ // Asynchronously read back the APF program & data buffer from the wifi driver.
+ // Due to Wifi HAL limitations, the current implementation only supports dumping the entire
+ // buffer. In response to this request, the driver returns the data buffer asynchronously
+ // by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message.
+ void startReadPacketFilter();
+
+ // If multicast filtering cannot be accomplished with APF, this function will be called to
+ // actuate multicast filtering using another means.
+ void setFallbackMulticastFilter(boolean enabled);
+
+ // Enabled/disable Neighbor Discover offload functionality. This is
+ // called, for example, whenever 464xlat is being started or stopped.
+ void setNeighborDiscoveryOffload(boolean enable);
+} \ No newline at end of file
diff --git a/core/java/android/net/ip/IpClientCallbacks.java b/core/java/android/net/ip/IpClientCallbacks.java
new file mode 100644
index 000000000000..db01ae4d4d9c
--- /dev/null
+++ b/core/java/android/net/ip/IpClientCallbacks.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ip;
+
+import android.net.DhcpResults;
+import android.net.LinkProperties;
+
+/**
+ * Callbacks for handling IpClient events.
+ *
+ * This is a convenience class to allow clients not to override all methods of IIpClientCallbacks,
+ * and avoid unparceling arguments.
+ * These methods are called asynchronously on a Binder thread, as IpClient lives in a different
+ * process.
+ * @hide
+ */
+public class IpClientCallbacks {
+
+ /**
+ * Callback called upon IpClient creation.
+ *
+ * @param ipClient The Binder token to communicate with IpClient.
+ */
+ public void onIpClientCreated(IIpClient ipClient) {}
+
+ /**
+ * Callback called prior to DHCP discovery/renewal.
+ *
+ * <p>In order to receive onPreDhcpAction(), call #withPreDhcpAction() when constructing a
+ * ProvisioningConfiguration.
+ *
+ * <p>Implementations of onPreDhcpAction() must call IpClient#completedPreDhcpAction() to
+ * indicate that DHCP is clear to proceed.
+ */
+ public void onPreDhcpAction() {}
+
+ /**
+ * Callback called after DHCP discovery/renewal.
+ */
+ public void onPostDhcpAction() {}
+
+ /**
+ * Callback called when new DHCP results are available.
+ *
+ * <p>This is purely advisory and not an indication of provisioning success or failure. This is
+ * only here for callers that want to expose DHCPv4 results to other APIs
+ * (e.g., WifiInfo#setInetAddress).
+ *
+ * <p>DHCPv4 or static IPv4 configuration failure or success can be determined by whether or not
+ * the passed-in DhcpResults object is null.
+ */
+ public void onNewDhcpResults(DhcpResults dhcpResults) {}
+
+ /**
+ * Indicates that provisioning was successful.
+ */
+ public void onProvisioningSuccess(LinkProperties newLp) {}
+
+ /**
+ * Indicates that provisioning failed.
+ */
+ public void onProvisioningFailure(LinkProperties newLp) {}
+
+ /**
+ * Invoked on LinkProperties changes.
+ */
+ public void onLinkPropertiesChange(LinkProperties newLp) {}
+
+ /**Called when the internal IpReachabilityMonitor (if enabled) has
+ * detected the loss of a critical number of required neighbors.
+ */
+ public void onReachabilityLost(String logMsg) {}
+
+ /**
+ * Called when the IpClient state machine terminates.
+ */
+ public void onQuit() {}
+
+ /**
+ * Called to indicate that a new APF program must be installed to filter incoming packets.
+ */
+ public void installPacketFilter(byte[] filter) {}
+
+ /**
+ * Called to indicate that the APF Program & data buffer must be read asynchronously from the
+ * wifi driver.
+ *
+ * <p>Due to Wifi HAL limitations, the current implementation only supports dumping the entire
+ * buffer. In response to this request, the driver returns the data buffer asynchronously
+ * by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message.
+ */
+ public void startReadPacketFilter() {}
+
+ /**
+ * If multicast filtering cannot be accomplished with APF, this function will be called to
+ * actuate multicast filtering using another means.
+ */
+ public void setFallbackMulticastFilter(boolean enabled) {}
+
+ /**
+ * Enabled/disable Neighbor Discover offload functionality. This is called, for example,
+ * whenever 464xlat is being started or stopped.
+ */
+ public void setNeighborDiscoveryOffload(boolean enable) {}
+}
diff --git a/core/java/android/net/ipmemorystore/Blob.aidl b/core/java/android/net/ipmemorystore/Blob.aidl
new file mode 100644
index 000000000000..9dbef117f8a4
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/Blob.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+/**
+ * A blob of data opaque to the memory store. The client mutates this at its own risk,
+ * and it is strongly suggested to never do it at all and treat this as immutable.
+ * {@hide}
+ */
+parcelable Blob {
+ byte[] data;
+}
diff --git a/core/java/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl b/core/java/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl
new file mode 100644
index 000000000000..4926feb06e55
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.net.ipmemorystore.Blob;
+import android.net.ipmemorystore.StatusParcelable;
+
+/** {@hide} */
+oneway interface IOnBlobRetrievedListener {
+ /**
+ * Private data was retrieved for the L2 key and name specified.
+ * Note this does not return the client ID, as clients are expected to only ever use one ID.
+ */
+ void onBlobRetrieved(in StatusParcelable status, in String l2Key, in String name,
+ in Blob data);
+}
diff --git a/core/java/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl b/core/java/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl
new file mode 100644
index 000000000000..dea0cc4e2586
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.net.ipmemorystore.StatusParcelable;
+
+/** {@hide} */
+oneway interface IOnL2KeyResponseListener {
+ /**
+ * The operation completed with the specified L2 key.
+ */
+ void onL2KeyResponse(in StatusParcelable status, in String l2Key);
+}
diff --git a/core/java/android/net/ipmemorystore/IOnNetworkAttributesRetrieved.aidl b/core/java/android/net/ipmemorystore/IOnNetworkAttributesRetrieved.aidl
new file mode 100644
index 000000000000..57f59a17cfe7
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/IOnNetworkAttributesRetrieved.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.net.ipmemorystore.NetworkAttributesParcelable;
+import android.net.ipmemorystore.StatusParcelable;
+
+/** {@hide} */
+oneway interface IOnNetworkAttributesRetrieved {
+ /**
+ * Network attributes were fetched for the specified L2 key. While the L2 key will never
+ * be null, the attributes may be if no data is stored about this L2 key.
+ */
+ void onL2KeyResponse(in StatusParcelable status, in String l2Key,
+ in NetworkAttributesParcelable attributes);
+}
diff --git a/core/java/android/net/ipmemorystore/IOnSameNetworkResponseListener.aidl b/core/java/android/net/ipmemorystore/IOnSameNetworkResponseListener.aidl
new file mode 100644
index 000000000000..294bd3bd4012
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/IOnSameNetworkResponseListener.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.net.ipmemorystore.SameL3NetworkResponseParcelable;
+import android.net.ipmemorystore.StatusParcelable;
+
+/** {@hide} */
+oneway interface IOnSameNetworkResponseListener {
+ /**
+ * The memory store has come up with the answer to a query that was sent.
+ */
+ void onSameNetworkResponse(in StatusParcelable status,
+ in SameL3NetworkResponseParcelable response);
+}
diff --git a/core/java/android/net/ipmemorystore/IOnStatusListener.aidl b/core/java/android/net/ipmemorystore/IOnStatusListener.aidl
new file mode 100644
index 000000000000..5d0750449ec5
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/IOnStatusListener.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.net.ipmemorystore.StatusParcelable;
+
+/** {@hide} */
+oneway interface IOnStatusListener {
+ /**
+ * The operation has completed with the specified status.
+ */
+ void onComplete(in StatusParcelable status);
+}
diff --git a/core/java/android/net/ipmemorystore/NetworkAttributes.java b/core/java/android/net/ipmemorystore/NetworkAttributes.java
new file mode 100644
index 000000000000..b932d2197f85
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/NetworkAttributes.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * A POD object to represent attributes of a single L2 network entry.
+ * @hide
+ */
+public class NetworkAttributes {
+ private static final boolean DBG = true;
+
+ // The v4 address that was assigned to this device the last time it joined this network.
+ // This typically comes from DHCP but could be something else like static configuration.
+ // This does not apply to IPv6.
+ // TODO : add a list of v6 prefixes for the v6 case.
+ @Nullable
+ public final Inet4Address assignedV4Address;
+
+ // Optionally supplied by the client if it has an opinion on L3 network. For example, this
+ // could be a hash of the SSID + security type on WiFi.
+ @Nullable
+ public final String groupHint;
+
+ // The list of DNS server addresses.
+ @Nullable
+ public final List<InetAddress> dnsAddresses;
+
+ // The mtu on this network.
+ @Nullable
+ public final Integer mtu;
+
+ NetworkAttributes(
+ @Nullable final Inet4Address assignedV4Address,
+ @Nullable final String groupHint,
+ @Nullable final List<InetAddress> dnsAddresses,
+ @Nullable final Integer mtu) {
+ if (mtu != null && mtu < 0) throw new IllegalArgumentException("MTU can't be negative");
+ this.assignedV4Address = assignedV4Address;
+ this.groupHint = groupHint;
+ this.dnsAddresses = null == dnsAddresses ? null :
+ Collections.unmodifiableList(new ArrayList<>(dnsAddresses));
+ this.mtu = mtu;
+ }
+
+ @VisibleForTesting
+ public NetworkAttributes(@NonNull final NetworkAttributesParcelable parcelable) {
+ // The call to the other constructor must be the first statement of this constructor,
+ // so everything has to be inline
+ this((Inet4Address) getByAddressOrNull(parcelable.assignedV4Address),
+ parcelable.groupHint,
+ blobArrayToInetAddressList(parcelable.dnsAddresses),
+ parcelable.mtu >= 0 ? parcelable.mtu : null);
+ }
+
+ @Nullable
+ private static InetAddress getByAddressOrNull(@Nullable final byte[] address) {
+ try {
+ return InetAddress.getByAddress(address);
+ } catch (UnknownHostException e) {
+ return null;
+ }
+ }
+
+ @Nullable
+ private static List<InetAddress> blobArrayToInetAddressList(@Nullable final Blob[] blobs) {
+ if (null == blobs) return null;
+ final ArrayList<InetAddress> list = new ArrayList<>(blobs.length);
+ for (final Blob b : blobs) {
+ final InetAddress addr = getByAddressOrNull(b.data);
+ if (null != addr) list.add(addr);
+ }
+ return list;
+ }
+
+ @Nullable
+ private static Blob[] inetAddressListToBlobArray(@Nullable final List<InetAddress> addresses) {
+ if (null == addresses) return null;
+ final ArrayList<Blob> blobs = new ArrayList<>();
+ for (int i = 0; i < addresses.size(); ++i) {
+ final InetAddress addr = addresses.get(i);
+ if (null == addr) continue;
+ final Blob b = new Blob();
+ b.data = addr.getAddress();
+ blobs.add(b);
+ }
+ return blobs.toArray(new Blob[0]);
+ }
+
+ /** Converts this NetworkAttributes to a parcelable object */
+ @NonNull
+ public NetworkAttributesParcelable toParcelable() {
+ final NetworkAttributesParcelable parcelable = new NetworkAttributesParcelable();
+ parcelable.assignedV4Address =
+ (null == assignedV4Address) ? null : assignedV4Address.getAddress();
+ parcelable.groupHint = groupHint;
+ parcelable.dnsAddresses = inetAddressListToBlobArray(dnsAddresses);
+ parcelable.mtu = (null == mtu) ? -1 : mtu;
+ return parcelable;
+ }
+
+ /** @hide */
+ public static class Builder {
+ @Nullable
+ private Inet4Address mAssignedAddress;
+ @Nullable
+ private String mGroupHint;
+ @Nullable
+ private List<InetAddress> mDnsAddresses;
+ @Nullable
+ private Integer mMtu;
+
+ /**
+ * Set the assigned address.
+ * @param assignedV4Address The assigned address.
+ * @return This builder.
+ */
+ public Builder setAssignedV4Address(@Nullable final Inet4Address assignedV4Address) {
+ mAssignedAddress = assignedV4Address;
+ return this;
+ }
+
+ /**
+ * Set the group hint.
+ * @param groupHint The group hint.
+ * @return This builder.
+ */
+ public Builder setGroupHint(@Nullable final String groupHint) {
+ mGroupHint = groupHint;
+ return this;
+ }
+
+ /**
+ * Set the DNS addresses.
+ * @param dnsAddresses The DNS addresses.
+ * @return This builder.
+ */
+ public Builder setDnsAddresses(@Nullable final List<InetAddress> dnsAddresses) {
+ if (DBG && null != dnsAddresses) {
+ // Parceling code crashes if one of the addresses is null, therefore validate
+ // them when running in debug.
+ for (final InetAddress address : dnsAddresses) {
+ if (null == address) throw new IllegalArgumentException("Null DNS address");
+ }
+ }
+ this.mDnsAddresses = dnsAddresses;
+ return this;
+ }
+
+ /**
+ * Set the MTU.
+ * @param mtu The MTU.
+ * @return This builder.
+ */
+ public Builder setMtu(@Nullable final Integer mtu) {
+ if (null != mtu && mtu < 0) throw new IllegalArgumentException("MTU can't be negative");
+ mMtu = mtu;
+ return this;
+ }
+
+ /**
+ * Return the built NetworkAttributes object.
+ * @return The built NetworkAttributes object.
+ */
+ public NetworkAttributes build() {
+ return new NetworkAttributes(mAssignedAddress, mGroupHint, mDnsAddresses, mMtu);
+ }
+ }
+
+ @Override
+ public boolean equals(@Nullable final Object o) {
+ if (!(o instanceof NetworkAttributes)) return false;
+ final NetworkAttributes other = (NetworkAttributes) o;
+ return Objects.equals(assignedV4Address, other.assignedV4Address)
+ && Objects.equals(groupHint, other.groupHint)
+ && Objects.equals(dnsAddresses, other.dnsAddresses)
+ && Objects.equals(mtu, other.mtu);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(assignedV4Address, groupHint, dnsAddresses, mtu);
+ }
+
+ /** Pretty print */
+ @Override
+ public String toString() {
+ final StringJoiner resultJoiner = new StringJoiner(" ", "{", "}");
+ final ArrayList<String> nullFields = new ArrayList<>();
+
+ if (null != assignedV4Address) {
+ resultJoiner.add("assignedV4Addr :");
+ resultJoiner.add(assignedV4Address.toString());
+ } else {
+ nullFields.add("assignedV4Addr");
+ }
+
+ if (null != groupHint) {
+ resultJoiner.add("groupHint :");
+ resultJoiner.add(groupHint);
+ } else {
+ nullFields.add("groupHint");
+ }
+
+ if (null != dnsAddresses) {
+ resultJoiner.add("dnsAddr : [");
+ for (final InetAddress addr : dnsAddresses) {
+ resultJoiner.add(addr.getHostAddress());
+ }
+ resultJoiner.add("]");
+ } else {
+ nullFields.add("dnsAddr");
+ }
+
+ if (null != mtu) {
+ resultJoiner.add("mtu :");
+ resultJoiner.add(mtu.toString());
+ } else {
+ nullFields.add("mtu");
+ }
+
+ if (!nullFields.isEmpty()) {
+ resultJoiner.add("; Null fields : [");
+ for (final String field : nullFields) {
+ resultJoiner.add(field);
+ }
+ resultJoiner.add("]");
+ }
+
+ return resultJoiner.toString();
+ }
+}
diff --git a/core/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl b/core/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl
new file mode 100644
index 000000000000..0894d7260915
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+// Blob[] is used to represent an array of byte[], as structured AIDL does not support arrays
+// of arrays.
+import android.net.ipmemorystore.Blob;
+
+/**
+ * An object to represent attributes of a single L2 network entry.
+ * See NetworkAttributes.java for a description of each field. The types used in this class
+ * are structured parcelable types instead of the richer types of the NetworkAttributes object,
+ * but they have the same purpose. The NetworkAttributes.java file also contains the code
+ * to convert the richer types to the parcelable types and back.
+ * @hide
+ */
+parcelable NetworkAttributesParcelable {
+ byte[] assignedV4Address;
+ String groupHint;
+ Blob[] dnsAddresses;
+ int mtu;
+}
diff --git a/core/java/android/net/ipmemorystore/SameL3NetworkResponse.java b/core/java/android/net/ipmemorystore/SameL3NetworkResponse.java
new file mode 100644
index 000000000000..d040dcc3d608
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/SameL3NetworkResponse.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * An object representing the answer to a query whether two given L2 networks represent the
+ * same L3 network. Parcels as a SameL3NetworkResponseParceled object.
+ * @hide
+ */
+public class SameL3NetworkResponse {
+ @IntDef(prefix = "NETWORK_",
+ value = {NETWORK_SAME, NETWORK_DIFFERENT, NETWORK_NEVER_CONNECTED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface NetworkSameness {}
+
+ /**
+ * Both L2 networks represent the same L3 network.
+ */
+ public static final int NETWORK_SAME = 1;
+
+ /**
+ * The two L2 networks represent a different L3 network.
+ */
+ public static final int NETWORK_DIFFERENT = 2;
+
+ /**
+ * The device has never connected to at least one of these two L2 networks, or data
+ * has been wiped. Therefore the device has never seen the L3 network behind at least
+ * one of these two L2 networks, and can't evaluate whether it's the same as the other.
+ */
+ public static final int NETWORK_NEVER_CONNECTED = 3;
+
+ /**
+ * The first L2 key specified in the query.
+ */
+ @NonNull
+ public final String l2Key1;
+
+ /**
+ * The second L2 key specified in the query.
+ */
+ @NonNull
+ public final String l2Key2;
+
+ /**
+ * A confidence value indicating whether the two L2 networks represent the same L3 network.
+ *
+ * If both L2 networks were known, this value will be between 0.0 and 1.0, with 0.0
+ * representing complete confidence that the given L2 networks represent a different
+ * L3 network, and 1.0 representing complete confidence that the given L2 networks
+ * represent the same L3 network.
+ * If at least one of the L2 networks was not known, this value will be outside of the
+ * 0.0~1.0 range.
+ *
+ * Most apps should not be interested in this, and are encouraged to use the collapsing
+ * {@link #getNetworkSameness()} function below.
+ */
+ public final float confidence;
+
+ /**
+ * @return whether the two L2 networks represent the same L3 network. Either
+ * {@code NETWORK_SAME}, {@code NETWORK_DIFFERENT} or {@code NETWORK_NEVER_CONNECTED}.
+ */
+ @NetworkSameness
+ public final int getNetworkSameness() {
+ if (confidence > 1.0 || confidence < 0.0) return NETWORK_NEVER_CONNECTED;
+ return confidence > 0.5 ? NETWORK_SAME : NETWORK_DIFFERENT;
+ }
+
+ SameL3NetworkResponse(@NonNull final String l2Key1, @NonNull final String l2Key2,
+ final float confidence) {
+ this.l2Key1 = l2Key1;
+ this.l2Key2 = l2Key2;
+ this.confidence = confidence;
+ }
+
+ /** Builds a SameL3NetworkResponse from a parcelable object */
+ @VisibleForTesting
+ public SameL3NetworkResponse(@NonNull final SameL3NetworkResponseParcelable parceled) {
+ this(parceled.l2Key1, parceled.l2Key2, parceled.confidence);
+ }
+
+ /** Converts this SameL3NetworkResponse to a parcelable object */
+ @NonNull
+ public SameL3NetworkResponseParcelable toParcelable() {
+ final SameL3NetworkResponseParcelable parcelable = new SameL3NetworkResponseParcelable();
+ parcelable.l2Key1 = l2Key1;
+ parcelable.l2Key2 = l2Key2;
+ parcelable.confidence = confidence;
+ return parcelable;
+ }
+
+ // Note key1 and key2 have to match each other for this to return true. If
+ // key1 matches o.key2 and the other way around this returns false.
+ @Override
+ public boolean equals(@Nullable final Object o) {
+ if (!(o instanceof SameL3NetworkResponse)) return false;
+ final SameL3NetworkResponse other = (SameL3NetworkResponse) o;
+ return l2Key1.equals(other.l2Key1) && l2Key2.equals(other.l2Key2)
+ && confidence == other.confidence;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(l2Key1, l2Key2, confidence);
+ }
+
+ @Override
+ /** Pretty print */
+ public String toString() {
+ switch (getNetworkSameness()) {
+ case NETWORK_SAME:
+ return "\"" + l2Key1 + "\" same L3 network as \"" + l2Key2 + "\"";
+ case NETWORK_DIFFERENT:
+ return "\"" + l2Key1 + "\" different L3 network from \"" + l2Key2 + "\"";
+ case NETWORK_NEVER_CONNECTED:
+ return "\"" + l2Key1 + "\" can't be tested against \"" + l2Key2 + "\"";
+ default:
+ return "Buggy sameness value ? \"" + l2Key1 + "\", \"" + l2Key2 + "\"";
+ }
+ }
+}
diff --git a/core/java/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl b/core/java/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl
new file mode 100644
index 000000000000..71966998a68a
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+/** {@hide} */
+parcelable SameL3NetworkResponseParcelable {
+ String l2Key1;
+ String l2Key2;
+ float confidence;
+}
diff --git a/core/java/android/net/ipmemorystore/Status.java b/core/java/android/net/ipmemorystore/Status.java
new file mode 100644
index 000000000000..cacd42d713c2
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/Status.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * A parcelable status representing the result of an operation.
+ * Parcels as StatusParceled.
+ * @hide
+ */
+public class Status {
+ public static final int SUCCESS = 0;
+
+ public static final int ERROR_GENERIC = -1;
+ public static final int ERROR_ILLEGAL_ARGUMENT = -2;
+ public static final int ERROR_DATABASE_CANNOT_BE_OPENED = -3;
+ public static final int ERROR_STORAGE = -4;
+
+ public final int resultCode;
+
+ public Status(final int resultCode) {
+ this.resultCode = resultCode;
+ }
+
+ @VisibleForTesting
+ public Status(@NonNull final StatusParcelable parcelable) {
+ this(parcelable.resultCode);
+ }
+
+ /** Converts this Status to a parcelable object */
+ @NonNull
+ public StatusParcelable toParcelable() {
+ final StatusParcelable parcelable = new StatusParcelable();
+ parcelable.resultCode = resultCode;
+ return parcelable;
+ }
+
+ public boolean isSuccess() {
+ return SUCCESS == resultCode;
+ }
+
+ /** Pretty print */
+ @Override
+ public String toString() {
+ switch (resultCode) {
+ case SUCCESS: return "SUCCESS";
+ case ERROR_GENERIC: return "GENERIC ERROR";
+ case ERROR_ILLEGAL_ARGUMENT: return "ILLEGAL ARGUMENT";
+ case ERROR_DATABASE_CANNOT_BE_OPENED: return "DATABASE CANNOT BE OPENED";
+ // "DB storage error" is not very helpful but SQLite does not provide specific error
+ // codes upon store failure. Thus this indicates SQLite returned some error upon store
+ case ERROR_STORAGE: return "DATABASE STORAGE ERROR";
+ default: return "Unknown value ?!";
+ }
+ }
+}
diff --git a/core/java/android/net/ipmemorystore/StatusParcelable.aidl b/core/java/android/net/ipmemorystore/StatusParcelable.aidl
new file mode 100644
index 000000000000..fb36ef4a56ff
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/StatusParcelable.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+/** {@hide} */
+parcelable StatusParcelable {
+ int resultCode;
+}
diff --git a/core/java/android/net/ipmemorystore/Utils.java b/core/java/android/net/ipmemorystore/Utils.java
new file mode 100644
index 000000000000..b361aca5a6f7
--- /dev/null
+++ b/core/java/android/net/ipmemorystore/Utils.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+/** {@hide} */
+public class Utils {
+ /** Pretty print */
+ public static String blobToString(@Nullable final Blob blob) {
+ return "Blob : " + byteArrayToString(null == blob ? null : blob.data);
+ }
+
+ /** Pretty print */
+ public static String byteArrayToString(@Nullable final byte[] data) {
+ if (null == data) return "null";
+ final StringBuilder sb = new StringBuilder("[");
+ if (data.length <= 24) {
+ appendByteArray(sb, data, 0, data.length);
+ } else {
+ appendByteArray(sb, data, 0, 16);
+ sb.append("...");
+ appendByteArray(sb, data, data.length - 8, data.length);
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ // Adds the hex representation of the array between the specified indices (inclusive, exclusive)
+ private static void appendByteArray(@NonNull final StringBuilder sb, @NonNull final byte[] ar,
+ final int from, final int to) {
+ for (int i = from; i < to; ++i) {
+ sb.append(String.format("%02X", ar[i]));
+ }
+ }
+}
diff --git a/core/java/android/os/AppZygote.java b/core/java/android/os/AppZygote.java
new file mode 100644
index 000000000000..950f38167754
--- /dev/null
+++ b/core/java/android/os/AppZygote.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.content.pm.ApplicationInfo;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+/**
+ * AppZygote is responsible for interfacing with an application-specific zygote.
+ *
+ * Application zygotes can pre-load app-specific code and data, and this interface can
+ * be used to spawn isolated services from such an application zygote.
+ *
+ * Note that we'll have only one instance of this per application / uid combination.
+ *
+ * @hide
+ */
+public class AppZygote {
+ private static final String LOG_TAG = "AppZygote";
+
+ // UID of the Zygote itself
+ private final int mZygoteUid;
+
+ // First UID/GID of the range the AppZygote can setuid()/setgid() to
+ private final int mZygoteUidGidMin;
+
+ // Last UID/GID of the range the AppZygote can setuid()/setgid() to
+ private final int mZygoteUidGidMax;
+
+ private final Object mLock = new Object();
+
+ /**
+ * Instance that maintains the socket connection to the zygote. This is {@code null} if the
+ * zygote is not running or is not connected.
+ */
+ @GuardedBy("mLock")
+ private ChildZygoteProcess mZygote;
+
+ private final ApplicationInfo mAppInfo;
+
+ public AppZygote(ApplicationInfo appInfo, int zygoteUid, int uidGidMin, int uidGidMax) {
+ mAppInfo = appInfo;
+ mZygoteUid = zygoteUid;
+ mZygoteUidGidMin = uidGidMin;
+ mZygoteUidGidMax = uidGidMax;
+ }
+
+ /**
+ * Returns the zygote process associated with this app zygote.
+ * Creates the process if it's not already running.
+ */
+ public ChildZygoteProcess getProcess() {
+ synchronized (mLock) {
+ if (mZygote != null) return mZygote;
+
+ connectToZygoteIfNeededLocked();
+ return mZygote;
+ }
+ }
+
+ /**
+ * Stops the Zygote and kills the zygote process.
+ */
+ public void stopZygote() {
+ synchronized (mLock) {
+ stopZygoteLocked();
+ }
+ }
+
+ public ApplicationInfo getAppInfo() {
+ return mAppInfo;
+ }
+
+ @GuardedBy("mLock")
+ private void stopZygoteLocked() {
+ if (mZygote != null) {
+ // Close the connection and kill the zygote process. This will not cause
+ // child processes to be killed by itself.
+ mZygote.close();
+ Process.killProcess(mZygote.getPid());
+ mZygote = null;
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void connectToZygoteIfNeededLocked() {
+ String abi = mAppInfo.primaryCpuAbi != null ? mAppInfo.primaryCpuAbi :
+ Build.SUPPORTED_ABIS[0];
+ try {
+ mZygote = Process.zygoteProcess.startChildZygote(
+ "com.android.internal.os.AppZygoteInit",
+ mAppInfo.processName + "_zygote",
+ mZygoteUid,
+ mZygoteUid,
+ null, // gids
+ 0, // runtimeFlags
+ "app_zygote", // seInfo
+ abi, // abi
+ abi, // acceptedAbiList
+ null, // instructionSet
+ mZygoteUidGidMin,
+ mZygoteUidGidMax);
+
+ ZygoteProcess.waitForConnectionToZygote(mZygote.getPrimarySocketAddress());
+ // preload application code in the zygote
+ Log.i(LOG_TAG, "Starting application preload.");
+ mZygote.preloadApp(mAppInfo, abi);
+ Log.i(LOG_TAG, "Application preload done.");
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Error connecting to app zygote", e);
+ stopZygoteLocked();
+ }
+ }
+}
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 9939a3c8f36d..1ebb551df961 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -273,6 +273,30 @@ public class Binder implements IBinder {
public static final native int getCallingUid();
/**
+ * Returns {@code true} if the current thread is currently executing an
+ * incoming transaction.
+ *
+ * @hide
+ */
+ @CriticalNative
+ public static final native boolean isHandlingTransaction();
+
+ /**
+ * Return the Linux uid assigned to the process that sent the transaction
+ * currently being processed.
+ *
+ * @throws IllegalStateException if the current thread is not currently
+ * executing an incoming transaction.
+ */
+ public static final int getCallingUidOrThrow() {
+ if (!isHandlingTransaction()) {
+ throw new IllegalStateException(
+ "Thread is not in a binder transcation");
+ }
+ return getCallingUid();
+ }
+
+ /**
* Return the UserHandle assigned to the process that sent you the
* current transaction that is being processed. This is the user
* of the caller. It is distinct from {@link #getCallingUid()} in that a
diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java
new file mode 100644
index 000000000000..c5a51f133047
--- /dev/null
+++ b/core/java/android/os/BugreportManager.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.os.IBinder.DeathRecipient;
+
+import java.io.FileDescriptor;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Class that provides a privileged API to capture and consume bugreports.
+ *
+ * @hide
+ */
+// TODO: Expose API when the implementation is more complete.
+// @SystemApi
+@SystemService(Context.BUGREPORT_SERVICE)
+public class BugreportManager {
+ private final Context mContext;
+ private final IDumpstate mBinder;
+
+ /** @hide */
+ public BugreportManager(@NonNull Context context, IDumpstate binder) {
+ mContext = context;
+ mBinder = binder;
+ }
+
+ /**
+ * An interface describing the listener for bugreport progress and status.
+ */
+ public interface BugreportListener {
+ /**
+ * Called when there is a progress update.
+ * @param progress the progress in [0.0, 100.0]
+ */
+ void onProgress(float progress);
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "BUGREPORT_ERROR_" }, value = {
+ BUGREPORT_ERROR_INVALID_INPUT,
+ BUGREPORT_ERROR_RUNTIME
+ })
+
+ /** Possible error codes taking a bugreport can encounter */
+ @interface BugreportErrorCode {}
+
+ /** The input options were invalid */
+ int BUGREPORT_ERROR_INVALID_INPUT = IDumpstateListener.BUGREPORT_ERROR_INVALID_INPUT;
+
+ /** A runtime error occured */
+ int BUGREPORT_ERROR_RUNTIME = IDumpstateListener.BUGREPORT_ERROR_RUNTIME_ERROR;
+
+ /** User denied consent to share the bugreport */
+ int BUGREPORT_ERROR_USER_DENIED_CONSENT =
+ IDumpstateListener.BUGREPORT_ERROR_USER_DENIED_CONSENT;
+
+ /**
+ * Called when taking bugreport resulted in an error.
+ *
+ * @param errorCode the error that occurred. Possible values are
+ * {@code BUGREPORT_ERROR_INVALID_INPUT}, {@code BUGREPORT_ERROR_RUNTIME}.
+ */
+ void onError(@BugreportErrorCode int errorCode);
+
+ /**
+ * Called when taking bugreport finishes successfully
+ *
+ * @param durationMs time capturing bugreport took in milliseconds
+ * @param title title for the bugreport; helpful in reminding the user why they took it
+ * @param description detailed description for the bugreport
+ */
+ void onFinished(long durationMs, @NonNull String title,
+ @NonNull String description);
+ }
+
+ /**
+ * Starts a bugreport asynchronously.
+ *
+ * @param bugreportFd file to write the bugreport. This should be opened in write-only,
+ * append mode.
+ * @param screenshotFd file to write the screenshot, if necessary. This should be opened
+ * in write-only, append mode.
+ * @param params options that specify what kind of a bugreport should be taken
+ * @param listener callback for progress and status updates
+ */
+ @RequiresPermission(android.Manifest.permission.DUMP)
+ public void startBugreport(@NonNull FileDescriptor bugreportFd,
+ @Nullable FileDescriptor screenshotFd,
+ @NonNull BugreportParams params, @Nullable BugreportListener listener) {
+ // TODO(b/111441001): Enforce android.Manifest.permission.DUMP if necessary.
+ DumpstateListener dsListener = new DumpstateListener(listener);
+
+ try {
+ // Note: mBinder can get callingUid from the binder transaction.
+ mBinder.startBugreport(-1 /* callingUid */,
+ mContext.getOpPackageName(), bugreportFd, screenshotFd,
+ params.getMode(), dsListener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ private final class DumpstateListener extends IDumpstateListener.Stub
+ implements DeathRecipient {
+ private final BugreportListener mListener;
+
+ DumpstateListener(@Nullable BugreportListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void binderDied() {
+ // TODO(b/111441001): implement
+ }
+
+ @Override
+ public void onProgress(int progress) throws RemoteException {
+ mListener.onProgress(progress);
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ mListener.onError(errorCode);
+ }
+
+ @Override
+ public void onFinished(long durationMs, String title, String description)
+ throws RemoteException {
+ mListener.onFinished(durationMs, title, description);
+ }
+
+ // Old methods; should go away
+ @Override
+ public void onProgressUpdated(int progress) throws RemoteException {
+ // TODO(b/111441001): remove from interface
+ }
+
+ @Override
+ public void onMaxProgressUpdated(int maxProgress) throws RemoteException {
+ // TODO(b/111441001): remove from interface
+ }
+
+ @Override
+ public void onSectionComplete(String title, int status, int size, int durationMs)
+ throws RemoteException {
+ // TODO(b/111441001): remove from interface
+ }
+ }
+}
diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java
new file mode 100644
index 000000000000..4e696aed1fa8
--- /dev/null
+++ b/core/java/android/os/BugreportParams.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Parameters that specify what kind of bugreport should be taken.
+ *
+ * @hide
+ */
+// TODO: Expose API when the implementation is more complete.
+// @SystemApi
+public final class BugreportParams {
+ private final int mMode;
+
+ public BugreportParams(@BugreportMode int mode) {
+ mMode = mode;
+ }
+
+ public int getMode() {
+ return mMode;
+ }
+
+ /**
+ * Defines acceptable types of bugreports.
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "BUGREPORT_MODE_" }, value = {
+ BUGREPORT_MODE_FULL,
+ BUGREPORT_MODE_INTERACTIVE,
+ BUGREPORT_MODE_REMOTE,
+ BUGREPORT_MODE_WEAR,
+ BUGREPORT_MODE_TELEPHONY,
+ BUGREPORT_MODE_WIFI
+ })
+ public @interface BugreportMode {}
+
+ /**
+ * Options for a bugreport without user interference (and hence causing less
+ * interference to the system), but includes all sections.
+ */
+ public static final int BUGREPORT_MODE_FULL = IDumpstate.BUGREPORT_MODE_FULL;
+
+ /**
+ * Options that allow user to monitor progress and enter additional data; might not
+ * include all sections.
+ */
+ public static final int BUGREPORT_MODE_INTERACTIVE = IDumpstate.BUGREPORT_MODE_INTERACTIVE;
+
+ /**
+ * Options for a bugreport requested remotely by administrator of the Device Owner app,
+ * not the device's user.
+ */
+ public static final int BUGREPORT_MODE_REMOTE = IDumpstate.BUGREPORT_MODE_REMOTE;
+
+ /**
+ * Options for a bugreport on a wearable device.
+ */
+ public static final int BUGREPORT_MODE_WEAR = IDumpstate.BUGREPORT_MODE_WEAR;
+
+ /**
+ * Options for a lightweight version of bugreport that only includes a few, urgent
+ * sections used to report telephony bugs.
+ */
+ public static final int BUGREPORT_MODE_TELEPHONY = IDumpstate.BUGREPORT_MODE_TELEPHONY;
+
+ /**
+ * Options for a lightweight bugreport that only includes a few sections related to
+ * Wifi.
+ */
+ public static final int BUGREPORT_MODE_WIFI = IDumpstate.BUGREPORT_MODE_WIFI;
+}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 9fea873d34a8..2d61a4ee95d9 100755
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -289,6 +289,26 @@ public class Build {
"ro.build.version.preview_sdk", 0);
/**
+ * The SDK fingerprint for a given prerelease SDK. This value will always be
+ * {@code REL} on production platform builds/devices.
+ *
+ * <p>When this value is not {@code REL}, it contains a string fingerprint of the API
+ * surface exposed by the preview SDK. Preview platforms with different API surfaces
+ * will have different {@code PREVIEW_SDK_FINGERPRINT}.
+ *
+ * <p>This attribute is intended for use by installers for finer grained targeting of
+ * packages. Applications targeting preview APIs should not use this field and should
+ * instead use {@code PREVIEW_SDK_INT} or use reflection or other runtime checks to
+ * detect the presence of an API or guard themselves against unexpected runtime
+ * behavior.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String PREVIEW_SDK_FINGERPRINT = SystemProperties.get(
+ "ro.build.version.preview_sdk_fingerprint", "REL");
+
+ /**
* The current development codename, or the string "REL" if this is
* a release build.
*/
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index e84a518c4986..ca3905148ede 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -846,7 +846,16 @@ public class FileUtils {
return contains(dir.getAbsolutePath(), file.getAbsolutePath());
}
- /** {@hide} */
+ /**
+ * Test if a file lives under the given directory, either as a direct child
+ * or a distant grandchild.
+ * <p>
+ * Both files <em>must</em> have been resolved using
+ * {@link File#getCanonicalFile()} to avoid symlink or path traversal
+ * attacks.
+ *
+ * @hide
+ */
public static boolean contains(String dirPath, String filePath) {
if (dirPath.equals(filePath)) {
return true;
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index d9793097fc3a..f51ba9a41a2b 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -306,9 +306,18 @@ public class GraphicsEnvironment {
String packageName,
String paths,
String devOptIn) {
- // Check for temporary rules if debuggable or root
- if (!isDebuggable(context) && !(getCanLoadSystemLibraries() == 1)) {
- Log.v(TAG, "Skipping loading temporary rules file");
+ /**
+ * We only want to load a temp rules file for:
+ * - apps that are marked 'debuggable' in their manifest
+ * - devices that are running a userdebug build (ro.debuggable) or can inject libraries for
+ * debugging (PR_SET_DUMPABLE).
+ */
+ boolean appIsDebuggable = isDebuggable(context);
+ boolean deviceIsDebuggable = getCanLoadSystemLibraries() == 1;
+ if (!(appIsDebuggable || deviceIsDebuggable)) {
+ Log.v(TAG, "Skipping loading temporary rules file: "
+ + "appIsDebuggable = " + appIsDebuggable + ", "
+ + "adbRootEnabled = " + deviceIsDebuggable);
return false;
}
@@ -480,18 +489,38 @@ public class GraphicsEnvironment {
return;
}
- String applicationPackageName = context.getPackageName();
- String devOptInApplicationName = coreSettings.getString(
- Settings.Global.GUP_DEV_OPT_IN_APPS);
- boolean devOptIn = applicationPackageName.equals(devOptInApplicationName);
- boolean whitelisted = onWhitelist(context, driverPackageName, ai.packageName);
- if (!devOptIn && !whitelisted) {
+ // GUP_DEV_ALL_APPS
+ // 0: Default (Invalid values fallback to default as well)
+ // 1: All apps use Game Update Package
+ // 2: All apps use system graphics driver
+ int gupDevAllApps = coreSettings.getInt(Settings.Global.GUP_DEV_ALL_APPS, 0);
+ if (gupDevAllApps == 2) {
if (DEBUG) {
- Log.w(TAG, applicationPackageName + " is not on the whitelist.");
+ Log.w(TAG, "GUP is turned off on this device");
}
return;
}
+ if (gupDevAllApps != 1) {
+ // GUP_DEV_OPT_OUT_APPS has higher priority than GUP_DEV_OPT_IN_APPS
+ if (getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_OUT_APPS)
+ .contains(ai.packageName)) {
+ if (DEBUG) {
+ Log.w(TAG, ai.packageName + " opts out from GUP.");
+ }
+ return;
+ }
+
+ if (!getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_IN_APPS)
+ .contains(ai.packageName)
+ && !onWhitelist(context, driverPackageName, ai.packageName)) {
+ if (DEBUG) {
+ Log.w(TAG, ai.packageName + " is not on the whitelist.");
+ }
+ return;
+ }
+ }
+
ApplicationInfo driverInfo;
try {
driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName,
diff --git a/core/java/android/os/HwBinder.java b/core/java/android/os/HwBinder.java
index 3de3494e7ea7..9e3e83e14a48 100644
--- a/core/java/android/os/HwBinder.java
+++ b/core/java/android/os/HwBinder.java
@@ -17,6 +17,7 @@
package android.os;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import libcore.util.NativeAllocationRegistry;
@@ -24,6 +25,7 @@ import java.util.NoSuchElementException;
/** @hide */
@SystemApi
+@TestApi
public abstract class HwBinder implements IHwBinder {
private static final String TAG = "HwBinder";
diff --git a/core/java/android/os/HwBlob.java b/core/java/android/os/HwBlob.java
index 6a5bb1c0a988..0ec63b5815f1 100644
--- a/core/java/android/os/HwBlob.java
+++ b/core/java/android/os/HwBlob.java
@@ -18,6 +18,7 @@ package android.os;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import libcore.util.NativeAllocationRegistry;
@@ -28,6 +29,7 @@ import libcore.util.NativeAllocationRegistry;
* @hide
*/
@SystemApi
+@TestApi
public class HwBlob {
private static final String TAG = "HwBlob";
diff --git a/core/java/android/os/HwParcel.java b/core/java/android/os/HwParcel.java
index 7a51db2dc5f9..7919a00166bf 100644
--- a/core/java/android/os/HwParcel.java
+++ b/core/java/android/os/HwParcel.java
@@ -18,6 +18,7 @@ package android.os;
import android.annotation.IntDef;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import libcore.util.NativeAllocationRegistry;
@@ -28,6 +29,7 @@ import java.util.Arrays;
/** @hide */
@SystemApi
+@TestApi
public class HwParcel {
private static final String TAG = "HwParcel";
diff --git a/core/java/android/os/IHwBinder.java b/core/java/android/os/IHwBinder.java
index 249eb3aa3456..46fa6ef3b783 100644
--- a/core/java/android/os/IHwBinder.java
+++ b/core/java/android/os/IHwBinder.java
@@ -17,9 +17,11 @@
package android.os;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
/** @hide */
@SystemApi
+@TestApi
public interface IHwBinder {
/**
* Process a hwbinder transaction.
diff --git a/core/java/android/os/IHwInterface.java b/core/java/android/os/IHwInterface.java
index f9edd5bf8883..0a5a71550b06 100644
--- a/core/java/android/os/IHwInterface.java
+++ b/core/java/android/os/IHwInterface.java
@@ -17,8 +17,11 @@
package android.os;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
+
/** @hide */
@SystemApi
+@TestApi
public interface IHwInterface {
/**
* @return the binder object that corresponds to this interface.
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index fdd74882eb39..8ced7225b0d4 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -356,16 +356,6 @@ interface INetworkManagementService
void removeVpnUidRanges(int netId, in UidRange[] ranges);
/**
- * Start the clatd (464xlat) service on the given interface.
- */
- void startClatd(String interfaceName);
-
- /**
- * Stop the clatd (464xlat) service on the given interface.
- */
- void stopClatd(String interfaceName);
-
- /**
* Start listening for mobile activity state changes.
*/
void registerNetworkActivityListener(INetworkActivityListener listener);
diff --git a/core/java/android/os/NativeHandle.java b/core/java/android/os/NativeHandle.java
index f7ffc37f085f..f13bf5fccd38 100644
--- a/core/java/android/os/NativeHandle.java
+++ b/core/java/android/os/NativeHandle.java
@@ -20,6 +20,7 @@ import static android.system.OsConstants.F_DUPFD_CLOEXEC;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.system.ErrnoException;
import android.system.Os;
@@ -32,6 +33,7 @@ import java.io.FileDescriptor;
* @hide
*/
@SystemApi
+@TestApi
public final class NativeHandle implements Closeable {
// whether this object owns mFds
private boolean mOwn = false;
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index cc6bb12a0894..b9cdcc096962 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -899,6 +899,33 @@ public final class Parcel {
}
/**
+ * Flatten an {@link ArrayMap} with string keys containing a particular object
+ * type into the parcel at the current dataPosition() and growing dataCapacity()
+ * if needed. The type of the objects in the array must be one that implements
+ * Parcelable. Only the raw data of the objects is written and not their type,
+ * so you must use the corresponding {@link #createTypedArrayMap(Parcelable.Creator)}
+ *
+ * @param val The map of objects to be written.
+ * @param parcelableFlags The parcelable flags to use.
+ *
+ * @see #createTypedArrayMap(Parcelable.Creator)
+ * @see Parcelable
+ */
+ public <T extends Parcelable> void writeTypedArrayMap(@Nullable ArrayMap<String, T> val,
+ int parcelableFlags) {
+ if (val == null) {
+ writeInt(-1);
+ return;
+ }
+ final int count = val.size();
+ writeInt(count);
+ for (int i = 0; i < count; i++) {
+ writeString(val.keyAt(i));
+ writeTypedObject(val.valueAt(i), parcelableFlags);
+ }
+ }
+
+ /**
* Write an array set to the parcel.
*
* @param val The array set to write.
@@ -1001,7 +1028,7 @@ public final class Parcel {
* values are written using {@link #writeValue} and must follow the
* specification there.
*/
- public final void writeSparseArray(@Nullable SparseArray<Object> val) {
+ public final <T> void writeSparseArray(@Nullable SparseArray<T> val) {
if (val == null) {
writeInt(-1);
return;
@@ -1400,6 +1427,34 @@ public final class Parcel {
}
/**
+ * Flatten a {@link SparseArray} containing a particular object type into the parcel
+ * at the current dataPosition() and growing dataCapacity() if needed. The
+ * type of the objects in the array must be one that implements Parcelable.
+ * Unlike the generic {@link #writeSparseArray(SparseArray)} method, however, only
+ * the raw data of the objects is written and not their type, so you must use the
+ * corresponding {@link #createTypedSparseArray(Parcelable.Creator)}.
+ *
+ * @param val The list of objects to be written.
+ * @param parcelableFlags The parcelable flags to use.
+ *
+ * @see #createTypedSparseArray(Parcelable.Creator)
+ * @see Parcelable
+ */
+ public final <T extends Parcelable> void writeTypedSparseArray(@Nullable SparseArray<T> val,
+ int parcelableFlags) {
+ if (val == null) {
+ writeInt(-1);
+ return;
+ }
+ final int count = val.size();
+ writeInt(count);
+ for (int i = 0; i < count; i++) {
+ writeInt(val.keyAt(i));
+ writeTypedObject(val.valueAt(i), parcelableFlags);
+ }
+ }
+
+ /**
* @hide
*/
public <T extends Parcelable> void writeTypedList(@Nullable List<T> val, int parcelableFlags) {
@@ -2369,7 +2424,7 @@ public final class Parcel {
* Parcelables.
*/
@Nullable
- public final SparseArray readSparseArray(@Nullable ClassLoader loader) {
+ public final <T> SparseArray<T> readSparseArray(@Nullable ClassLoader loader) {
int N = readInt();
if (N < 0) {
return null;
@@ -2466,6 +2521,62 @@ public final class Parcel {
}
/**
+ * Read into a new {@link SparseArray} items containing a particular object type
+ * that were written with {@link #writeTypedSparseArray(SparseArray, int)} at the
+ * current dataPosition(). The list <em>must</em> have previously been written
+ * via {@link #writeTypedSparseArray(SparseArray, int)} with the same object type.
+ *
+ * @param creator The creator to use when for instantiation.
+ *
+ * @return A newly created {@link SparseArray} containing objects with the same data
+ * as those that were previously written.
+ *
+ * @see #writeTypedSparseArray(SparseArray, int)
+ */
+ public final @Nullable <T extends Parcelable> SparseArray<T> createTypedSparseArray(
+ @NonNull Parcelable.Creator<T> creator) {
+ final int count = readInt();
+ if (count < 0) {
+ return null;
+ }
+ final SparseArray<T> array = new SparseArray<>(count);
+ for (int i = 0; i < count; i++) {
+ final int index = readInt();
+ final T value = readTypedObject(creator);
+ array.append(index, value);
+ }
+ return array;
+ }
+
+ /**
+ * Read into a new {@link ArrayMap} with string keys items containing a particular
+ * object type that were written with {@link #writeTypedArrayMap(ArrayMap, int)} at the
+ * current dataPosition(). The list <em>must</em> have previously been written
+ * via {@link #writeTypedArrayMap(ArrayMap, int)} with the same object type.
+ *
+ * @param creator The creator to use when for instantiation.
+ *
+ * @return A newly created {@link ArrayMap} containing objects with the same data
+ * as those that were previously written.
+ *
+ * @see #writeTypedArrayMap(ArrayMap, int)
+ */
+ public final @Nullable <T extends Parcelable> ArrayMap<String, T> createTypedArrayMap(
+ @NonNull Parcelable.Creator<T> creator) {
+ final int count = readInt();
+ if (count < 0) {
+ return null;
+ }
+ final ArrayMap<String, T> map = new ArrayMap<>(count);
+ for (int i = 0; i < count; i++) {
+ final String key = readString();
+ final T value = readTypedObject(creator);
+ map.append(key, value);
+ }
+ return map;
+ }
+
+ /**
* Read and return a new ArrayList containing String objects from
* the parcel that was written with {@link #writeStringList} at the
* current dataPosition(). Returns null if the
diff --git a/core/java/android/os/ParcelableException.aidl b/core/java/android/os/ParcelableException.aidl
new file mode 100644
index 000000000000..d21492212341
--- /dev/null
+++ b/core/java/android/os/ParcelableException.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.os;
+
+parcelable ParcelableException;
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index c3e04894c6c9..0942d97df6c7 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -1326,7 +1326,7 @@ public final class PowerManager {
* @return Battery saver state data.
*
* @hide
- * @see com.android.server.power.BatterySaverPolicy
+ * @see com.android.server.power.batterysaver.BatterySaverPolicy
* @see PowerSaveState
*/
public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
diff --git a/core/java/android/os/PowerSaveState.java b/core/java/android/os/PowerSaveState.java
index de1128dfdef5..4918ad107763 100644
--- a/core/java/android/os/PowerSaveState.java
+++ b/core/java/android/os/PowerSaveState.java
@@ -27,7 +27,7 @@ public class PowerSaveState implements Parcelable {
/**
* Whether we should enable battery saver for this service.
*
- * @see com.android.server.power.BatterySaverPolicy
+ * @see com.android.server.power.batterysaver.BatterySaverPolicy
*/
public final boolean batterySaverEnabled;
/**
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 3f064eeac374..b133dcaa22b6 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -205,15 +205,38 @@ public class Process {
public static final int LAST_APPLICATION_UID = 19999;
/**
+ * First uid used for fully isolated sandboxed processes spawned from an app zygote
+ * @hide
+ */
+ @TestApi
+ public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000;
+
+ /**
+ * Number of UIDs we allocate per application zygote
+ * @hide
+ */
+ @TestApi
+ public static final int NUM_UIDS_PER_APP_ZYGOTE = 100;
+
+ /**
+ * Last uid used for fully isolated sandboxed processes spawned from an app zygote
+ * @hide
+ */
+ @TestApi
+ public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999;
+
+ /**
* First uid used for fully isolated sandboxed processes (with no permissions of their own)
* @hide
*/
+ @TestApi
public static final int FIRST_ISOLATED_UID = 99000;
/**
* Last uid used for fully isolated sandboxed processes (with no permissions of their own)
* @hide
*/
+ @TestApi
public static final int LAST_ISOLATED_UID = 99999;
/**
@@ -650,7 +673,8 @@ public class Process {
/** {@hide} */
public static final boolean isIsolated(int uid) {
uid = UserHandle.getAppId(uid);
- return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
+ return (uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID)
+ || (uid >= FIRST_APP_ZYGOTE_ISOLATED_UID && uid <= LAST_APP_ZYGOTE_ISOLATED_UID);
}
/**
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 6ea155fe70f8..68d6d85775e4 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -16,6 +16,8 @@
package android.os;
+import android.annotation.NonNull;
+
import com.android.internal.os.Zygote;
import dalvik.annotation.optimization.FastNative;
@@ -95,6 +97,8 @@ public final class Trace {
public static final long TRACE_TAG_AIDL = 1L << 24;
/** @hide */
public static final long TRACE_TAG_NNAPI = 1L << 25;
+ /** @hide */
+ public static final long TRACE_TAG_RRO = 1L << 26;
private static final long TRACE_TAG_NOT_READY = 1L << 63;
private static final int MAX_SECTION_NAME_LEN = 127;
@@ -311,7 +315,7 @@ public final class Trace {
* @param sectionName The name of the code section to appear in the trace. This may be at
* most 127 Unicode code units long.
*/
- public static void beginSection(String sectionName) {
+ public static void beginSection(@NonNull String sectionName) {
if (isTagEnabled(TRACE_TAG_APP)) {
if (sectionName.length() > MAX_SECTION_NAME_LEN) {
throw new IllegalArgumentException("sectionName is too long");
@@ -343,7 +347,7 @@ public final class Trace {
* @param methodName The method name to appear in the trace.
* @param cookie Unique identifier for distinguishing simultaneous events
*/
- public static void beginAsyncSection(String methodName, int cookie) {
+ public static void beginAsyncSection(@NonNull String methodName, int cookie) {
asyncTraceBegin(TRACE_TAG_APP, methodName, cookie);
}
@@ -355,7 +359,7 @@ public final class Trace {
* @param methodName The method name to appear in the trace.
* @param cookie Unique identifier for distinguishing simultaneous events
*/
- public static void endAsyncSection(String methodName, int cookie) {
+ public static void endAsyncSection(@NonNull String methodName, int cookie) {
asyncTraceEnd(TRACE_TAG_APP, methodName, cookie);
}
@@ -365,7 +369,7 @@ public final class Trace {
* @param counterName The counter name to appear in the trace.
* @param counterValue The counter value.
*/
- public static void setCounter(String counterName, long counterValue) {
+ public static void setCounter(@NonNull String counterName, long counterValue) {
if (isTagEnabled(TRACE_TAG_APP)) {
nativeTraceCounter(TRACE_TAG_APP, counterName, counterValue);
}
diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java
index 8f2826c16b63..1df3dad9530b 100644
--- a/core/java/android/os/UpdateEngine.java
+++ b/core/java/android/os/UpdateEngine.java
@@ -66,6 +66,7 @@ public class UpdateEngine {
public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10;
public static final int PAYLOAD_SIZE_MISMATCH_ERROR = 11;
public static final int DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 12;
+ public static final int PAYLOAD_TIMESTAMP_ERROR = 51;
public static final int UPDATED_BUT_NOT_ACTIVE = 52;
}
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index f8feb7b4a693..ad8a4d5645bc 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -138,8 +138,7 @@ public final class UserHandle implements Parcelable {
*/
public static boolean isIsolated(int uid) {
if (uid > 0) {
- final int appId = getAppId(uid);
- return appId >= Process.FIRST_ISOLATED_UID && appId <= Process.LAST_ISOLATED_UID;
+ return Process.isIsolated(uid);
} else {
return false;
}
@@ -294,9 +293,14 @@ public final class UserHandle implements Parcelable {
sb.append('u');
sb.append(getUserId(uid));
final int appId = getAppId(uid);
- if (appId >= Process.FIRST_ISOLATED_UID && appId <= Process.LAST_ISOLATED_UID) {
- sb.append('i');
- sb.append(appId - Process.FIRST_ISOLATED_UID);
+ if (isIsolated(appId)) {
+ if (appId > Process.FIRST_ISOLATED_UID) {
+ sb.append('i');
+ sb.append(appId - Process.FIRST_ISOLATED_UID);
+ } else {
+ sb.append("ai");
+ sb.append(appId - Process.FIRST_APP_ZYGOTE_ISOLATED_UID);
+ }
} else if (appId >= Process.FIRST_APPLICATION_UID) {
sb.append('a');
sb.append(appId - Process.FIRST_APPLICATION_UID);
@@ -330,9 +334,14 @@ public final class UserHandle implements Parcelable {
pw.print('u');
pw.print(getUserId(uid));
final int appId = getAppId(uid);
- if (appId >= Process.FIRST_ISOLATED_UID && appId <= Process.LAST_ISOLATED_UID) {
- pw.print('i');
- pw.print(appId - Process.FIRST_ISOLATED_UID);
+ if (isIsolated(appId)) {
+ if (appId > Process.FIRST_ISOLATED_UID) {
+ pw.print('i');
+ pw.print(appId - Process.FIRST_ISOLATED_UID);
+ } else {
+ pw.print("ai");
+ pw.print(appId - Process.FIRST_APP_ZYGOTE_ISOLATED_UID);
+ }
} else if (appId >= Process.FIRST_APPLICATION_UID) {
pw.print('a');
pw.print(appId - Process.FIRST_APPLICATION_UID);
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index b5aeba0c5f16..226d1d0a1241 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -74,10 +74,13 @@ public abstract class Vibrator {
private final String mPackageName;
// The default vibration intensity level for haptic feedback.
@VibrationIntensity
- private final int mDefaultHapticFeedbackIntensity;
+ private int mDefaultHapticFeedbackIntensity;
// The default vibration intensity level for notifications.
@VibrationIntensity
- private final int mDefaultNotificationVibrationIntensity;
+ private int mDefaultNotificationVibrationIntensity;
+ // The default vibration intensity level for ringtones.
+ @VibrationIntensity
+ private int mDefaultRingVibrationIntensity;
/**
* @hide to prevent subclassing from outside of the framework
@@ -85,10 +88,7 @@ public abstract class Vibrator {
public Vibrator() {
mPackageName = ActivityThread.currentPackageName();
final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
- mDefaultHapticFeedbackIntensity = loadDefaultIntensity(ctx,
- com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
- mDefaultNotificationVibrationIntensity = loadDefaultIntensity(ctx,
- com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
+ loadVibrationIntensities(ctx);
}
/**
@@ -96,10 +96,16 @@ public abstract class Vibrator {
*/
protected Vibrator(Context context) {
mPackageName = context.getOpPackageName();
+ loadVibrationIntensities(context);
+ }
+
+ private void loadVibrationIntensities(Context context) {
mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context,
com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context,
com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
+ mDefaultRingVibrationIntensity = loadDefaultIntensity(context,
+ com.android.internal.R.integer.config_defaultRingVibrationIntensity);
}
private int loadDefaultIntensity(Context ctx, int resId) {
@@ -115,13 +121,20 @@ public abstract class Vibrator {
}
/**
- * Get the default vibration intensity for notifications and ringtones.
+ * Get the default vibration intensity for notifications.
* @hide
*/
public int getDefaultNotificationVibrationIntensity() {
return mDefaultNotificationVibrationIntensity;
}
+ /** Get the default vibration intensity for ringtones.
+ * @hide
+ */
+ public int getDefaultRingVibrationIntensity() {
+ return mDefaultRingVibrationIntensity;
+ }
+
/**
* Check whether the hardware has a vibrator.
*
diff --git a/core/java/android/os/VintfObject.java b/core/java/android/os/VintfObject.java
index fb22194098b6..23c54f450a67 100644
--- a/core/java/android/os/VintfObject.java
+++ b/core/java/android/os/VintfObject.java
@@ -16,23 +16,27 @@
package android.os;
-import java.util.Map;
+import android.annotation.TestApi;
+import java.util.Map;
/**
* Java API for libvintf.
+ *
* @hide
*/
+@TestApi
public class VintfObject {
- /// ---------- OTA
-
/**
* Slurps all device information (both manifests and both matrices)
* and report them.
* If any error in getting one of the manifests, it is not included in
* the list.
+ *
+ * @hide
*/
+ @TestApi
public static native String[] report();
/**
@@ -44,6 +48,8 @@ public class VintfObject {
* @return = 0 if success (compatible)
* > 0 if incompatible
* < 0 if any error (mount partition fails, illformed XML, etc.)
+ *
+ * @hide
*/
public static native int verify(String[] packageInfo);
@@ -55,22 +61,28 @@ public class VintfObject {
* @return = 0 if success (compatible)
* > 0 if incompatible
* < 0 if any error (mount partition fails, illformed XML, etc.)
+ *
+ * @hide
*/
public static native int verifyWithoutAvb();
- /// ---------- CTS Device Info
-
/**
* @return a list of HAL names and versions that is supported by this
* device as stated in device and framework manifests. For example,
* ["android.hidl.manager@1.0", "android.hardware.camera.device@1.0",
* "android.hardware.camera.device@3.2"]. There are no duplicates.
+ *
+ * @hide
*/
+ @TestApi
public static native String[] getHalNamesAndVersions();
/**
* @return the BOARD_SEPOLICY_VERS build flag available in device manifest.
+ *
+ * @hide
*/
+ @TestApi
public static native String getSepolicyVersion();
/**
@@ -78,13 +90,22 @@ public class VintfObject {
* specified in framework manifest. For example,
* [("27", ["libjpeg.so", "libbase.so"]),
* ("28", ["libjpeg.so", "libbase.so"])]
+ *
+ * @hide
*/
+ @TestApi
public static native Map<String, String[]> getVndkSnapshots();
/**
- * @return target FCM version, a number specified in the device manifest
- * indicating the FCM version that the device manifest implements. Null if
- * device manifest doesn't specify this number (for legacy devices).
+ * @return Target Framework Compatibility Matrix (FCM) version, a number
+ * specified in the device manifest indicating the FCM version that the
+ * device manifest implements. Null if device manifest doesn't specify this
+ * number (for legacy devices).
+ *
+ * @hide
*/
+ @TestApi
public static native Long getTargetFrameworkCompatibilityMatrixVersion();
+
+ private VintfObject() {}
}
diff --git a/core/java/android/os/VintfRuntimeInfo.java b/core/java/android/os/VintfRuntimeInfo.java
index 29698b9fa684..f17039ba9bf4 100644
--- a/core/java/android/os/VintfRuntimeInfo.java
+++ b/core/java/android/os/VintfRuntimeInfo.java
@@ -16,55 +16,84 @@
package android.os;
+import android.annotation.TestApi;
+
/**
* Java API for ::android::vintf::RuntimeInfo. Methods return null / 0 on any error.
*
* @hide
*/
+@TestApi
public class VintfRuntimeInfo {
private VintfRuntimeInfo() {}
/**
* @return /sys/fs/selinux/policyvers, via security_policyvers() native call
+ *
+ * @hide
*/
public static native long getKernelSepolicyVersion();
/**
* @return content of /proc/cpuinfo
+ *
+ * @hide
*/
+ @TestApi
public static native String getCpuInfo();
/**
* @return os name extracted from uname() native call
+ *
+ * @hide
*/
+ @TestApi
public static native String getOsName();
/**
* @return node name extracted from uname() native call
+ *
+ * @hide
*/
+ @TestApi
public static native String getNodeName();
/**
* @return os release extracted from uname() native call
+ *
+ * @hide
*/
+ @TestApi
public static native String getOsRelease();
/**
* @return os version extracted from uname() native call
+ *
+ * @hide
*/
+ @TestApi
public static native String getOsVersion();
/**
* @return hardware id extracted from uname() native call
+ *
+ * @hide
*/
+ @TestApi
public static native String getHardwareId();
/**
* @return kernel version extracted from uname() native call. Format is
* {@code x.y.z}.
+ *
+ * @hide
*/
+ @TestApi
public static native String getKernelVersion();
/**
* @return libavb version in OS. Format is {@code x.y}.
+ *
+ * @hide
*/
public static native String getBootAvbVersion();
/**
* @return libavb version in bootloader. Format is {@code x.y}.
+ *
+ * @hide
*/
public static native String getBootVbmetaAvbVersion();
-
}
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index f136cd6699a7..ec7782177c73 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -18,6 +18,7 @@ package android.os;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.pm.ApplicationInfo;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.util.Log;
@@ -34,6 +35,7 @@ import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@@ -400,6 +402,8 @@ public class ZygoteProcess {
argsForZygote.add("--mount-external-full");
} else if (mountExternal == Zygote.MOUNT_EXTERNAL_INSTALLER) {
argsForZygote.add("--mount-external-installer");
+ } else if (mountExternal == Zygote.MOUNT_EXTERNAL_LEGACY) {
+ argsForZygote.add("--mount-external-legacy");
}
argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
@@ -673,6 +677,36 @@ public class ZygoteProcess {
}
/**
+ * Instructs the zygote to pre-load the application code for the given Application.
+ * Only the app zygote supports this function.
+ * TODO preloadPackageForAbi() can probably be removed and the callers an use this instead.
+ */
+ public boolean preloadApp(ApplicationInfo appInfo, String abi) throws ZygoteStartFailedEx,
+ IOException {
+ synchronized (mLock) {
+ ZygoteState state = openZygoteSocketIfNeeded(abi);
+ state.writer.write("2");
+ state.writer.newLine();
+
+ state.writer.write("--preload-app");
+ state.writer.newLine();
+
+ // Zygote args needs to be strings, so in order to pass ApplicationInfo,
+ // write it to a Parcel, and base64 the raw Parcel bytes to the other side.
+ Parcel parcel = Parcel.obtain();
+ appInfo.writeToParcel(parcel, 0 /* flags */);
+ String encodedParcelData = Base64.getEncoder().encodeToString(parcel.marshall());
+ parcel.recycle();
+ state.writer.write(encodedParcelData);
+ state.writer.newLine();
+
+ state.writer.flush();
+
+ return (state.inputStream.readInt() == 0);
+ }
+ }
+
+ /**
* Instructs the zygote to pre-load the classes and native libraries at the given paths
* for the specified abi. Not all zygotes support this function.
*/
@@ -763,6 +797,22 @@ public class ZygoteProcess {
* secondary zygotes that inherit data from the zygote that this object
* communicates with. This returns a new ZygoteProcess representing a connection
* to the newly created zygote. Throws an exception if the zygote cannot be started.
+ *
+ * @param processClass The class to use as the child zygote's main entry
+ * point.
+ * @param niceName A more readable name to use for the process.
+ * @param uid The user-id under which the child zygote will run.
+ * @param gid The group-id under which the child zygote will run.
+ * @param gids Additional group-ids associated with the child zygote process.
+ * @param runtimeFlags Additional flags.
+ * @param seInfo null-ok SELinux information for the child zygote process.
+ * @param abi non-null the ABI of the child zygote
+ * @param acceptedAbiList ABIs this child zygote will accept connections for; this
+ * may be different from <code>abi</code> in case the children
+ * spawned from this Zygote only communicate using ABI-safe methods.
+ * @param instructionSet null-ok the instruction set to use.
+ * @param uidRangeStart The first UID in the range the child zygote may setuid()/setgid() to
+ * @param uidRangeEnd The last UID in the range the child zygote may setuid()/setgid() to
*/
public ChildZygoteProcess startChildZygote(final String processClass,
final String niceName,
@@ -770,12 +820,18 @@ public class ZygoteProcess {
int runtimeFlags,
String seInfo,
String abi,
- String instructionSet) {
+ String acceptedAbiList,
+ String instructionSet,
+ int uidRangeStart,
+ int uidRangeEnd) {
// Create an unguessable address in the global abstract namespace.
final LocalSocketAddress serverAddress = new LocalSocketAddress(
processClass + "/" + UUID.randomUUID().toString());
- final String[] extraArgs = {Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG + serverAddress.getName()};
+ final String[] extraArgs = {Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG + serverAddress.getName(),
+ Zygote.CHILD_ZYGOTE_ABI_LIST_ARG + acceptedAbiList,
+ Zygote.CHILD_ZYGOTE_UID_RANGE_START + uidRangeStart,
+ Zygote.CHILD_ZYGOTE_UID_RANGE_END + uidRangeEnd};
Process.ProcessStartResult result;
try {
diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl
index 38951d5466c7..249b622dac4d 100644
--- a/core/java/android/permission/IPermissionController.aidl
+++ b/core/java/android/permission/IPermissionController.aidl
@@ -17,6 +17,9 @@
package android.permission;
import android.os.RemoteCallback;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
/**
* Interface for system apps to communication with the permission controller.
@@ -24,8 +27,12 @@ import android.os.RemoteCallback;
* @hide
*/
oneway interface IPermissionController {
+ void revokeRuntimePermissions(in Bundle request, boolean doDryRun, int reason,
+ String callerPackageName, in RemoteCallback callback);
+ void getRuntimePermissionBackup(in UserHandle user, in ParcelFileDescriptor pipe);
void getAppPermissions(String packageName, in RemoteCallback callback);
void revokeRuntimePermission(String packageName, String permissionName);
void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted,
boolean countSystem, in RemoteCallback callback);
+ void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback);
}
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index 66e8666a8a70..bfcca7c10151 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -18,50 +18,131 @@ package android.permission;
import static android.permission.PermissionControllerService.SERVICE_INTERFACE;
+import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import android.Manifest;
+import android.annotation.CallbackExecutor;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.os.AsyncTask;
+import android.os.Binder;
+import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService;
import com.android.internal.infra.AbstractRemoteService;
+import com.android.internal.util.Preconditions;
+import libcore.io.IoUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
/**
- * Interface for communicating with the permission controller from system apps. All UI operations
- * regarding permissions and any changes to the permission state should flow through this
- * interface.
+ * Interface for communicating with the permission controller.
*
* @hide
*/
+@TestApi
+@SystemApi
@SystemService(Context.PERMISSION_CONTROLLER_SERVICE)
public final class PermissionControllerManager {
private static final String TAG = PermissionControllerManager.class.getSimpleName();
+ private static final Object sLock = new Object();
+
+ /** App global remote service used by all {@link PermissionControllerManager managers} */
+ @GuardedBy("sLock")
+ private static RemoteService sRemoteService;
+
/**
* The key for retrieving the result from the returned bundle.
+ *
+ * @hide
*/
public static final String KEY_RESULT =
"android.permission.PermissionControllerManager.key.result";
+ /** @hide */
+ @IntDef(prefix = { "REASON_" }, value = {
+ REASON_MALWARE,
+ REASON_INSTALLER_POLICY_VIOLATION,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Reason {}
+
+ /** The permissions are revoked because the apps holding the permissions are malware */
+ public static final int REASON_MALWARE = 1;
+
+ /**
+ * The permissions are revoked because the apps holding the permissions violate a policy of the
+ * app that installed it.
+ *
+ * <p>If this reason is used only permissions of apps that are installed by the caller of the
+ * API can be revoked.
+ */
+ public static final int REASON_INSTALLER_POLICY_VIOLATION = 2;
+
+ /**
+ * Callback for delivering the result of {@link #revokeRuntimePermissions}.
+ */
+ public abstract static class OnRevokeRuntimePermissionsCallback {
+ /**
+ * The result for {@link #revokeRuntimePermissions}.
+ *
+ * @param revoked The actually revoked permissions as
+ * {@code Map<packageName, List<permission>>}
+ */
+ public abstract void onRevokeRuntimePermissions(@NonNull Map<String, List<String>> revoked);
+ }
+
+ /**
+ * Callback for delivering the result of {@link #getRuntimePermissionBackup}.
+ *
+ * @hide
+ */
+ public interface OnGetRuntimePermissionBackupCallback {
+ /**
+ * The result for {@link #getRuntimePermissionBackup}.
+ *
+ * @param backup The backup file
+ */
+ void onGetRuntimePermissionsBackup(@NonNull byte[] backup);
+ }
+
/**
* Callback for delivering the result of {@link #getAppPermissions}.
+ *
+ * @hide
*/
public interface OnGetAppPermissionResultCallback {
/**
@@ -75,6 +156,8 @@ public final class PermissionControllerManager {
/**
* Callback for delivering the result of {@link #countPermissionApps}.
+ *
+ * @hide
*/
public interface OnCountPermissionAppsResultCallback {
/**
@@ -86,15 +169,95 @@ public final class PermissionControllerManager {
void onCountPermissionApps(int numApps);
}
- private final RemoteService mRemoteService;
+ /**
+ * Callback for delivering the result of {@link #getPermissionUsages}.
+ *
+ * @hide
+ */
+ public interface OnPermissionUsageResultCallback {
+ /**
+ * The result for {@link #getPermissionUsages}.
+ *
+ * @param users The users list.
+ */
+ void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> users);
+ }
+
+ private final @NonNull Context mContext;
+ /**
+ * Create a new {@link PermissionControllerManager}.
+ *
+ * @param context to create the manager for
+ *
+ * @hide
+ */
public PermissionControllerManager(@NonNull Context context) {
- Intent intent = new Intent(SERVICE_INTERFACE);
- intent.setPackage(context.getPackageManager().getPermissionControllerPackageName());
- ResolveInfo serviceInfo = context.getPackageManager().resolveService(intent, 0);
+ synchronized (sLock) {
+ if (sRemoteService == null) {
+ Intent intent = new Intent(SERVICE_INTERFACE);
+ intent.setPackage(context.getPackageManager().getPermissionControllerPackageName());
+ ResolveInfo serviceInfo = context.getPackageManager().resolveService(intent, 0);
+
+ sRemoteService = new RemoteService(context.getApplicationContext(),
+ serviceInfo.getComponentInfo().getComponentName());
+ }
+ }
+
+ mContext = context;
+ }
+
+ /**
+ * Revoke a set of runtime permissions for various apps.
+ *
+ * @param request The permissions to revoke as {@code Map<packageName, List<permission>>}
+ * @param doDryRun Compute the permissions that would be revoked, but not actually revoke them
+ * @param reason Why the permission should be revoked
+ * @param executor Executor on which to invoke the callback
+ * @param callback Callback to receive the result
+ */
+ @RequiresPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
+ public void revokeRuntimePermissions(@NonNull Map<String, List<String>> request,
+ boolean doDryRun, @Reason int reason, @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnRevokeRuntimePermissionsCallback callback) {
+ // Check input to fail immediately instead of inside the async request
+ checkNotNull(executor);
+ checkNotNull(callback);
+ checkNotNull(request);
+ for (Map.Entry<String, List<String>> appRequest : request.entrySet()) {
+ checkNotNull(appRequest.getKey());
+ checkCollectionElementsNotNull(appRequest.getValue(), "permissions");
+ }
+
+ // Check required permission to fail immediately instead of inside the oneway binder call
+ if (mContext.checkSelfPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS
+ + " required");
+ }
- mRemoteService = new RemoteService(context,
- serviceInfo.getComponentInfo().getComponentName());
+ sRemoteService.scheduleRequest(new PendingRevokeRuntimePermissionRequest(sRemoteService,
+ request, doDryRun, reason, mContext.getPackageName(), executor, callback));
+ }
+
+ /**
+ * Create a backup of the runtime permissions.
+ *
+ * @param user The user to be backed up
+ * @param executor Executor on which to invoke the callback
+ * @param callback Callback to receive the result
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS)
+ public void getRuntimePermissionBackup(@NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnGetRuntimePermissionBackupCallback callback) {
+ checkNotNull(executor);
+ checkNotNull(callback);
+
+ sRemoteService.scheduleRequest(new PendingGetRuntimePermissionBackup(sRemoteService,
+ user, executor, callback));
}
/**
@@ -103,6 +266,8 @@ public final class PermissionControllerManager {
* @param packageName The package for which to query.
* @param callback Callback to receive the result.
* @param handler Handler on which to invoke the callback.
+ *
+ * @hide
*/
@RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS)
public void getAppPermissions(@NonNull String packageName,
@@ -110,8 +275,8 @@ public final class PermissionControllerManager {
checkNotNull(packageName);
checkNotNull(callback);
- mRemoteService.scheduleRequest(new PendingGetAppPermissionRequest(mRemoteService,
- packageName, callback, handler == null ? mRemoteService.getHandler() : handler));
+ sRemoteService.scheduleRequest(new PendingGetAppPermissionRequest(sRemoteService,
+ packageName, callback, handler == null ? sRemoteService.getHandler() : handler));
}
/**
@@ -119,6 +284,8 @@ public final class PermissionControllerManager {
*
* @param packageName The package for which to revoke
* @param permissionName The permission to revoke
+ *
+ * @hide
*/
@RequiresPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
public void revokeRuntimePermission(@NonNull String packageName,
@@ -126,7 +293,7 @@ public final class PermissionControllerManager {
checkNotNull(packageName);
checkNotNull(permissionName);
- mRemoteService.scheduleAsyncRequest(new PendingRevokeAppPermissionRequest(packageName,
+ sRemoteService.scheduleAsyncRequest(new PendingRevokeAppPermissionRequest(packageName,
permissionName));
}
@@ -138,6 +305,8 @@ public final class PermissionControllerManager {
* @param countSystem Also count system apps
* @param callback Callback to receive the result
* @param handler Handler on which to invoke the callback
+ *
+ * @hide
*/
@RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS)
public void countPermissionApps(@NonNull List<String> permissionNames,
@@ -146,9 +315,31 @@ public final class PermissionControllerManager {
checkCollectionElementsNotNull(permissionNames, "permissionNames");
checkNotNull(callback);
- mRemoteService.scheduleRequest(new PendingCountPermissionAppsRequest(mRemoteService,
+ sRemoteService.scheduleRequest(new PendingCountPermissionAppsRequest(sRemoteService,
permissionNames, countOnlyGranted, countSystem, callback,
- handler == null ? mRemoteService.getHandler() : handler));
+ handler == null ? sRemoteService.getHandler() : handler));
+ }
+
+ /**
+ * Count how many apps have used permissions.
+ *
+ * @param countSystem Also count system apps
+ * @param numMillis The number of milliseconds in the past to check for uses
+ * @param executor Executor on which to invoke the callback
+ * @param callback Callback to receive the result
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS)
+ public void getPermissionUsages(boolean countSystem, long numMillis,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnPermissionUsageResultCallback callback) {
+ checkArgumentNonnegative(numMillis);
+ checkNotNull(executor);
+ checkNotNull(callback);
+
+ sRemoteService.scheduleRequest(new PendingGetPermissionUsagesRequest(sRemoteService,
+ countSystem, numMillis, executor, callback));
}
/**
@@ -206,6 +397,237 @@ public final class PermissionControllerManager {
}
/**
+ * Task to read a large amount of data from a remote service.
+ */
+ private static class FileReaderTask<Callback extends Consumer<byte[]>>
+ extends AsyncTask<Void, Void, byte[]> {
+ private ParcelFileDescriptor mLocalPipe;
+ private ParcelFileDescriptor mRemotePipe;
+
+ private final @NonNull Callback mCallback;
+
+ FileReaderTask(@NonNull Callback callback) {
+ mCallback = callback;
+ }
+
+ @Override
+ protected void onPreExecute() {
+ ParcelFileDescriptor[] pipe;
+ try {
+ pipe = ParcelFileDescriptor.createPipe();
+ } catch (IOException e) {
+ Log.e(TAG, "Could not create pipe needed to get runtime permission backup", e);
+ return;
+ }
+
+ mLocalPipe = pipe[0];
+ mRemotePipe = pipe[1];
+ }
+
+ /**
+ * Get the file descriptor the remote service should write the data to.
+ *
+ * <p>Needs to be closed <u>locally</u> before the FileReader can finish.
+ *
+ * @return The file the data should be written to
+ */
+ ParcelFileDescriptor getRemotePipe() {
+ return mRemotePipe;
+ }
+
+ @Override
+ protected byte[] doInBackground(Void... ignored) {
+ ByteArrayOutputStream combinedBuffer = new ByteArrayOutputStream();
+
+ try (InputStream in = new ParcelFileDescriptor.AutoCloseInputStream(mLocalPipe)) {
+ byte[] buffer = new byte[16 * 1024];
+
+ while (!isCancelled()) {
+ int numRead = in.read(buffer);
+ if (numRead == -1) {
+ break;
+ }
+
+ combinedBuffer.write(buffer, 0, numRead);
+ }
+ } catch (IOException | NullPointerException e) {
+ Log.e(TAG, "Error reading runtime permission backup", e);
+ combinedBuffer.reset();
+ }
+
+ return combinedBuffer.toByteArray();
+ }
+
+ /**
+ * Interrupt the reading of the data.
+ *
+ * <p>Needs to be called when canceling this task as it might be hung.
+ */
+ void interruptRead() {
+ IoUtils.closeQuietly(mLocalPipe);
+ }
+
+ @Override
+ protected void onCancelled() {
+ onPostExecute(new byte[]{});
+ }
+
+ @Override
+ protected void onPostExecute(byte[] backup) {
+ IoUtils.closeQuietly(mLocalPipe);
+ mCallback.accept(backup);
+ }
+ }
+
+ /**
+ * Request for {@link #revokeRuntimePermissions}
+ */
+ private static final class PendingRevokeRuntimePermissionRequest extends
+ AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> {
+ private final @NonNull Map<String, List<String>> mRequest;
+ private final boolean mDoDryRun;
+ private final int mReason;
+ private final @NonNull String mCallingPackage;
+ private final @NonNull Executor mExecutor;
+ private final @NonNull OnRevokeRuntimePermissionsCallback mCallback;
+
+ private final @NonNull RemoteCallback mRemoteCallback;
+
+ private PendingRevokeRuntimePermissionRequest(@NonNull RemoteService service,
+ @NonNull Map<String, List<String>> request, boolean doDryRun,
+ @Reason int reason, @NonNull String callingPackage,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnRevokeRuntimePermissionsCallback callback) {
+ super(service);
+
+ mRequest = request;
+ mDoDryRun = doDryRun;
+ mReason = reason;
+ mCallingPackage = callingPackage;
+ mExecutor = executor;
+ mCallback = callback;
+
+ mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> {
+ long token = Binder.clearCallingIdentity();
+ try {
+ Map<String, List<String>> revoked = new ArrayMap<>();
+ try {
+ Bundle bundleizedRevoked = result.getBundle(KEY_RESULT);
+
+ for (String packageName : bundleizedRevoked.keySet()) {
+ Preconditions.checkNotNull(packageName);
+
+ ArrayList<String> permissions =
+ bundleizedRevoked.getStringArrayList(packageName);
+ Preconditions.checkCollectionElementsNotNull(permissions,
+ "permissions");
+
+ revoked.put(packageName, permissions);
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Could not read result when revoking runtime permissions", e);
+ }
+
+ callback.onRevokeRuntimePermissions(revoked);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+
+ finish();
+ }
+ }), null);
+ }
+
+ @Override
+ protected void onTimeout(RemoteService remoteService) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(
+ () -> mCallback.onRevokeRuntimePermissions(Collections.emptyMap()));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void run() {
+ Bundle bundledizedRequest = new Bundle();
+ for (Map.Entry<String, List<String>> appRequest : mRequest.entrySet()) {
+ bundledizedRequest.putStringArrayList(appRequest.getKey(),
+ new ArrayList<>(appRequest.getValue()));
+ }
+
+ try {
+ getService().getServiceInterface().revokeRuntimePermissions(bundledizedRequest,
+ mDoDryRun, mReason, mCallingPackage, mRemoteCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error revoking runtime permission", e);
+ }
+ }
+ }
+
+ /**
+ * Request for {@link #getRuntimePermissionBackup}
+ */
+ private static final class PendingGetRuntimePermissionBackup extends
+ AbstractRemoteService.PendingRequest<RemoteService, IPermissionController>
+ implements Consumer<byte[]> {
+ private final @NonNull FileReaderTask<PendingGetRuntimePermissionBackup> mBackupReader;
+ private final @NonNull Executor mExecutor;
+ private final @NonNull OnGetRuntimePermissionBackupCallback mCallback;
+ private final @NonNull UserHandle mUser;
+
+ private PendingGetRuntimePermissionBackup(@NonNull RemoteService service,
+ @NonNull UserHandle user, @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnGetRuntimePermissionBackupCallback callback) {
+ super(service);
+
+ mUser = user;
+ mExecutor = executor;
+ mCallback = callback;
+
+ mBackupReader = new FileReaderTask<>(this);
+ }
+
+ @Override
+ protected void onTimeout(RemoteService remoteService) {
+ mBackupReader.cancel(true);
+ mBackupReader.interruptRead();
+ }
+
+ @Override
+ public void run() {
+ mBackupReader.execute();
+
+ ParcelFileDescriptor remotePipe = mBackupReader.getRemotePipe();
+ try {
+ getService().getServiceInterface().getRuntimePermissionBackup(mUser, remotePipe);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error getting runtime permission backup", e);
+ } finally {
+ // Remote pipe end is duped by binder call. Local copy is not needed anymore
+ IoUtils.closeQuietly(remotePipe);
+ }
+ }
+
+ /**
+ * Called when the {@link #mBackupReader} finished reading the file.
+ *
+ * @param backup The data read
+ */
+ @Override
+ public void accept(byte[] backup) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onGetRuntimePermissionsBackup(backup));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ finish();
+ }
+ }
+
+ /**
* Request for {@link #getAppPermissions}
*/
private static final class PendingGetAppPermissionRequest extends
@@ -331,4 +753,61 @@ public final class PermissionControllerManager {
}
}
}
+
+ /**
+ * Request for {@link #getPermissionUsages}
+ */
+ private static final class PendingGetPermissionUsagesRequest extends
+ AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> {
+ private final @NonNull OnPermissionUsageResultCallback mCallback;
+ private final boolean mCountSystem;
+ private final long mNumMillis;
+
+ private final @NonNull RemoteCallback mRemoteCallback;
+
+ private PendingGetPermissionUsagesRequest(@NonNull RemoteService service,
+ boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnPermissionUsageResultCallback callback) {
+ super(service);
+
+ mCountSystem = countSystem;
+ mNumMillis = numMillis;
+ mCallback = callback;
+
+ mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> {
+ long token = Binder.clearCallingIdentity();
+ try {
+ final List<RuntimePermissionUsageInfo> reportedUsers;
+ List<RuntimePermissionUsageInfo> users = null;
+ if (result != null) {
+ users = result.getParcelableArrayList(KEY_RESULT);
+ } else {
+ users = Collections.emptyList();
+ }
+ reportedUsers = users;
+
+ callback.onPermissionUsageResult(reportedUsers);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+
+ finish();
+ }
+ }), null);
+ }
+
+ @Override
+ protected void onTimeout(RemoteService remoteService) {
+ mCallback.onPermissionUsageResult(Collections.emptyList());
+ }
+
+ @Override
+ public void run() {
+ try {
+ getService().getServiceInterface().getPermissionUsages(mCountSystem, mNumMillis,
+ mRemoteCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error counting permission users", e);
+ }
+ }
+ }
}
diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java
index 5dad07178e53..10e8c8d5b8dd 100644
--- a/core/java/android/permission/PermissionControllerService.java
+++ b/core/java/android/permission/PermissionControllerService.java
@@ -16,6 +16,8 @@
package android.permission;
+import static com.android.internal.util.Preconditions.checkArgument;
+import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -26,12 +28,24 @@ import android.annotation.SystemApi;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteCallback;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.Log;
+import com.android.internal.util.Preconditions;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* This service is meant to be implemented by the app controlling permissions.
@@ -42,6 +56,7 @@ import java.util.List;
*/
@SystemApi
public abstract class PermissionControllerService extends Service {
+ private static final String LOG_TAG = PermissionControllerService.class.getSimpleName();
/**
* The {@link Intent} action that must be declared as handled by a service
@@ -60,6 +75,29 @@ public abstract class PermissionControllerService extends Service {
}
/**
+ * Revoke a set of runtime permissions for various apps.
+ *
+ * @param requests The permissions to revoke as {@code Map<packageName, List<permission>>}
+ * @param doDryRun Compute the permissions that would be revoked, but not actually revoke them
+ * @param reason Why the permission should be revoked
+ * @param callerPackageName The package name of the calling app
+ *
+ * @return the actually removed permissions as {@code Map<packageName, List<permission>>}
+ */
+ public abstract @NonNull Map<String, List<String>> onRevokeRuntimePermissions(
+ @NonNull Map<String, List<String>> requests, boolean doDryRun,
+ @PermissionControllerManager.Reason int reason, @NonNull String callerPackageName);
+
+ /**
+ * Create a backup of the runtime permissions.
+ *
+ * @param user The user to back up
+ * @param out The stream to write the backup to
+ */
+ public abstract void onGetRuntimePermissionsBackup(@NonNull UserHandle user,
+ @NonNull OutputStream out);
+
+ /**
* Gets the runtime permissions for an app.
*
* @param packageName The package for which to query.
@@ -90,10 +128,68 @@ public abstract class PermissionControllerService extends Service {
public abstract int onCountPermissionApps(@NonNull List<String> permissionNames,
boolean countOnlyGranted, boolean countSystem);
+ /**
+ * Count how many apps have used permissions.
+ *
+ * @param countSystem Also count system apps
+ * @param numMillis The number of milliseconds in the past to check for uses
+ *
+ * @return descriptions of the users of permissions
+ */
+ public abstract @NonNull List<RuntimePermissionUsageInfo>
+ onPermissionUsageResult(boolean countSystem, long numMillis);
+
@Override
public final IBinder onBind(Intent intent) {
return new IPermissionController.Stub() {
@Override
+ public void revokeRuntimePermissions(
+ Bundle bundleizedRequest, boolean doDryRun, int reason,
+ String callerPackageName, RemoteCallback callback) {
+ checkNotNull(bundleizedRequest, "bundleizedRequest");
+ checkNotNull(callerPackageName);
+ checkNotNull(callback);
+
+ Map<String, List<String>> request = new ArrayMap<>();
+ for (String packageName : bundleizedRequest.keySet()) {
+ Preconditions.checkNotNull(packageName);
+
+ ArrayList<String> permissions =
+ bundleizedRequest.getStringArrayList(packageName);
+ Preconditions.checkCollectionElementsNotNull(permissions, "permissions");
+
+ request.put(packageName, permissions);
+ }
+
+ enforceCallingPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, null);
+
+ // Verify callerPackageName
+ try {
+ PackageInfo pkgInfo = getPackageManager().getPackageInfo(callerPackageName, 0);
+ checkArgument(getCallingUid() == pkgInfo.applicationInfo.uid);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+ mHandler.sendMessage(obtainMessage(
+ PermissionControllerService::revokeRuntimePermissions,
+ PermissionControllerService.this, request, doDryRun, reason,
+ callerPackageName, callback));
+ }
+
+ @Override
+ public void getRuntimePermissionBackup(UserHandle user, ParcelFileDescriptor pipe) {
+ checkNotNull(user);
+ checkNotNull(pipe);
+
+ enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null);
+
+ mHandler.sendMessage(obtainMessage(
+ PermissionControllerService::getRuntimePermissionsBackup,
+ PermissionControllerService.this, user, pipe));
+ }
+
+ @Override
public void getAppPermissions(String packageName, RemoteCallback callback) {
checkNotNull(packageName, "packageName");
checkNotNull(callback, "callback");
@@ -130,9 +226,53 @@ public abstract class PermissionControllerService extends Service {
PermissionControllerService.this, permissionNames, countOnlyGranted,
countSystem, callback));
}
+
+ @Override
+ public void getPermissionUsages(boolean countSystem, long numMillis,
+ RemoteCallback callback) {
+ checkArgumentNonnegative(numMillis);
+ checkNotNull(callback, "callback");
+
+ enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null);
+
+ mHandler.sendMessage(
+ obtainMessage(PermissionControllerService::getPermissionUsages,
+ PermissionControllerService.this, countSystem, numMillis,
+ callback));
+ }
};
}
+ private void revokeRuntimePermissions(@NonNull Map<String, List<String>> requests,
+ boolean doDryRun, @PermissionControllerManager.Reason int reason,
+ @NonNull String callerPackageName, @NonNull RemoteCallback callback) {
+ Map<String, List<String>> revoked = onRevokeRuntimePermissions(requests,
+ doDryRun, reason, callerPackageName);
+
+ checkNotNull(revoked);
+ Bundle bundledizedRevoked = new Bundle();
+ for (Map.Entry<String, List<String>> appRevocation : revoked.entrySet()) {
+ checkNotNull(appRevocation.getKey());
+ checkCollectionElementsNotNull(appRevocation.getValue(), "permissions");
+
+ bundledizedRevoked.putStringArrayList(appRevocation.getKey(),
+ new ArrayList<>(appRevocation.getValue()));
+ }
+
+ Bundle result = new Bundle();
+ result.putBundle(PermissionControllerManager.KEY_RESULT, bundledizedRevoked);
+ callback.sendResult(result);
+ }
+
+ private void getRuntimePermissionsBackup(@NonNull UserHandle user,
+ @NonNull ParcelFileDescriptor outFile) {
+ try (OutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream(outFile)) {
+ onGetRuntimePermissionsBackup(user, out);
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Could not open pipe to write backup tp", e);
+ }
+ }
+
private void getAppPermissions(@NonNull String packageName, @NonNull RemoteCallback callback) {
List<RuntimePermissionPresentationInfo> permissions = onGetAppPermissions(packageName);
if (permissions != null && !permissions.isEmpty()) {
@@ -152,4 +292,17 @@ public abstract class PermissionControllerService extends Service {
result.putInt(PermissionControllerManager.KEY_RESULT, numApps);
callback.sendResult(result);
}
+
+ private void getPermissionUsages(boolean countSystem, long numMillis,
+ @NonNull RemoteCallback callback) {
+ List<RuntimePermissionUsageInfo> users =
+ onPermissionUsageResult(countSystem, numMillis);
+ if (users != null && !users.isEmpty()) {
+ Bundle result = new Bundle();
+ result.putParcelableList(PermissionControllerManager.KEY_RESULT, users);
+ callback.sendResult(result);
+ } else {
+ callback.sendResult(null);
+ }
+ }
}
diff --git a/core/java/android/permission/RuntimePermissionUsageInfo.aidl b/core/java/android/permission/RuntimePermissionUsageInfo.aidl
new file mode 100644
index 000000000000..88820ddbc092
--- /dev/null
+++ b/core/java/android/permission/RuntimePermissionUsageInfo.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permission;
+
+parcelable RuntimePermissionUsageInfo; \ No newline at end of file
diff --git a/core/java/android/permission/RuntimePermissionUsageInfo.java b/core/java/android/permission/RuntimePermissionUsageInfo.java
new file mode 100644
index 000000000000..af1a1bec37cf
--- /dev/null
+++ b/core/java/android/permission/RuntimePermissionUsageInfo.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permission;
+
+import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
+import static com.android.internal.util.Preconditions.checkNotNull;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * This class contains information about how a runtime permission
+ * is used. A single runtime permission presented to the user may
+ * correspond to multiple platform defined permissions, e.g. the
+ * location permission may control both the coarse and fine platform
+ * permissions.
+ *
+ * @hide
+ */
+@SystemApi
+public final class RuntimePermissionUsageInfo implements Parcelable {
+ private final @NonNull CharSequence mName;
+ private final int mNumUsers;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param name The permission group name.
+ * @param numUsers The number of apps that have used this permission.
+ */
+ public RuntimePermissionUsageInfo(@NonNull CharSequence name, int numUsers) {
+ checkNotNull(name);
+ checkArgumentNonnegative(numUsers);
+
+ mName = name;
+ mNumUsers = numUsers;
+ }
+
+ private RuntimePermissionUsageInfo(Parcel parcel) {
+ this(parcel.readCharSequence(), parcel.readInt());
+ }
+
+ /**
+ * @return The number of apps that accessed this permission
+ */
+ public int getAppAccessCount() {
+ return mNumUsers;
+ }
+
+ /**
+ * Gets the permission group name.
+ *
+ * @return The name.
+ */
+ public @NonNull CharSequence getName() {
+ return mName;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeCharSequence(mName);
+ parcel.writeInt(mNumUsers);
+ }
+
+ public static final Creator<RuntimePermissionUsageInfo> CREATOR =
+ new Creator<RuntimePermissionUsageInfo>() {
+ public RuntimePermissionUsageInfo createFromParcel(Parcel source) {
+ return new RuntimePermissionUsageInfo(source);
+ }
+
+ public RuntimePermissionUsageInfo[] newArray(int size) {
+ return new RuntimePermissionUsageInfo[size];
+ }
+ };
+}
diff --git a/core/java/android/permission/TEST_MAPPING b/core/java/android/permission/TEST_MAPPING
new file mode 100644
index 000000000000..ba9f36a31f2e
--- /dev/null
+++ b/core/java/android/permission/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsPermissionTestCases",
+ "options": [
+ {
+ "include-filter": "android.permission.cts.PermissionControllerTest"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index 4e207ed6556e..901570389957 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -16,9 +16,13 @@
package android.provider;
+import static android.Manifest.permission.READ_DEVICE_CONFIG;
+import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
+
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.content.ContentResolver;
@@ -48,6 +52,40 @@ public final class DeviceConfig {
*/
public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config");
+ /**
+ * Namespace for all Game Driver features.
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_GAME_DRIVER = "game_driver";
+
+ /**
+ * Namespace for autofill feature that provides suggestions across all apps when
+ * the user interacts with input fields.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_AUTOFILL = "autofill";
+
+ /**
+ * Namespace for content capture feature used by on-device machine intelligence
+ * to provide suggestions in a privacy-safe manner.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
+
+ /**
+ * Namespace for all input-related features that are used at the native level.
+ * These features are applied at reboot.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
+
private static final Object sLock = new Object();
@GuardedBy("sLock")
private static Map<OnPropertyChangedListener, Pair<String, Executor>> sListeners =
@@ -69,6 +107,7 @@ public final class DeviceConfig {
* @hide
*/
@SystemApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
public static String getProperty(String namespace, String name) {
ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver();
String compositeName = createCompositeName(namespace, name);
@@ -96,6 +135,7 @@ public final class DeviceConfig {
* @hide
*/
@SystemApi
+ @RequiresPermission(WRITE_DEVICE_CONFIG)
public static boolean setProperty(
String namespace, String name, String value, boolean makeDefault) {
ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver();
@@ -116,6 +156,7 @@ public final class DeviceConfig {
* @hide
*/
@SystemApi
+ @RequiresPermission(WRITE_DEVICE_CONFIG)
public static void resetToDefaults(@ResetMode int resetMode, @Nullable String namespace) {
ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver();
Settings.Config.resetToDefaults(contentResolver, resetMode, namespace);
@@ -137,10 +178,12 @@ public final class DeviceConfig {
* @hide
*/
@SystemApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
public static void addOnPropertyChangedListener(
@NonNull String namespace,
@NonNull @CallbackExecutor Executor executor,
@NonNull OnPropertyChangedListener onPropertyChangedListener) {
+ // TODO enforce READ_DEVICE_CONFIG permission
synchronized (sLock) {
Pair<String, Executor> oldNamespace = sListeners.get(onPropertyChangedListener);
if (oldNamespace == null) {
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index 8e37559001db..e931826d2455 100644
--- a/core/java/android/provider/FontsContract.java
+++ b/core/java/android/provider/FontsContract.java
@@ -34,6 +34,7 @@ import android.graphics.fonts.FontFamily;
import android.graphics.fonts.FontStyle;
import android.graphics.fonts.FontVariationAxis;
import android.net.Uri;
+import android.os.Build.VERSION_CODES;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.HandlerThread;
@@ -651,7 +652,16 @@ public class FontsContract {
if (familyBuilder == null) {
familyBuilder = new FontFamily.Builder(font);
} else {
- familyBuilder.addFont(font);
+ try {
+ familyBuilder.addFont(font);
+ } catch (IllegalArgumentException e) {
+ if (context.getApplicationInfo().targetSdkVersion <= VERSION_CODES.P) {
+ // Surpress the IllegalArgumentException for keeping the backward
+ // compatibility.
+ continue;
+ }
+ throw e;
+ }
}
} catch (IOException e) {
continue;
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index cdbc9790c952..3a4998630544 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -46,6 +46,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Environment;
+import android.os.FileUtils;
import android.os.OperationCanceledException;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -86,8 +87,10 @@ public final class MediaStore {
/** A content:// style uri to the authority for the media provider */
public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
- private static final String VOLUME_INTERNAL = "internal";
- private static final String VOLUME_EXTERNAL = "external";
+ /** {@hide} */
+ public static final String VOLUME_INTERNAL = "internal";
+ /** {@hide} */
+ public static final String VOLUME_EXTERNAL = "external";
/**
* The method name used by the media scanner and mtp to tell the media provider to
@@ -1027,7 +1030,7 @@ public final class MediaStore {
/** @hide */
public static final Uri getContentUriForPath(String path) {
- return getContentUri(getVolumeNameForPath(path));
+ return getContentUri(getVolumeName(new File(path)));
}
/**
@@ -1197,7 +1200,7 @@ public final class MediaStore {
/** @hide */
public static Uri getContentUriForPath(@NonNull String path) {
- return getContentUri(getVolumeNameForPath(path));
+ return getContentUri(getVolumeName(new File(path)));
}
/** @hide */
@@ -1211,16 +1214,20 @@ public final class MediaStore {
}
}
- private static String getVolumeNameForPath(@NonNull String path) {
- final StorageManager sm = AppGlobals.getInitialApplication()
- .getSystemService(StorageManager.class);
- final StorageVolume sv = sm.getStorageVolume(new File(path));
- if (sv != null) {
- if (sv.isPrimary()) {
- return VOLUME_EXTERNAL;
- } else {
- return sv.getUuid();
+ /** {@hide} */
+ public static @NonNull String getVolumeName(@NonNull File path) {
+ if (FileUtils.contains(Environment.getStorageDirectory(), path)) {
+ final StorageManager sm = AppGlobals.getInitialApplication()
+ .getSystemService(StorageManager.class);
+ final StorageVolume sv = sm.getStorageVolume(path);
+ if (sv != null) {
+ if (sv.isPrimary()) {
+ return VOLUME_EXTERNAL;
+ } else {
+ return checkArgumentVolumeName(sv.getUuid());
+ }
}
+ throw new IllegalStateException("Unknown volume at " + path);
} else {
return VOLUME_INTERNAL;
}
@@ -1991,7 +1998,7 @@ public final class MediaStore {
* access this path.
*/
public static @Nullable Uri getContentUriForPath(@NonNull String path) {
- return getContentUri(getVolumeNameForPath(path));
+ return getContentUri(getVolumeName(new File(path)));
}
/**
@@ -2908,7 +2915,7 @@ public final class MediaStore {
final Set<String> volumeNames = new ArraySet<>();
volumeNames.add(VOLUME_INTERNAL);
for (VolumeInfo vi : sm.getVolumes()) {
- if (vi.isMountedReadable()) {
+ if (vi.isVisibleForUser(UserHandle.myUserId()) && vi.isMountedReadable()) {
if (vi.isPrimary()) {
volumeNames.add(VOLUME_EXTERNAL);
} else {
@@ -2927,14 +2934,41 @@ public final class MediaStore {
if (uri.getAuthority().equals(AUTHORITY) && segments != null && segments.size() > 0) {
return segments.get(0);
} else {
- throw new IllegalArgumentException("Not a media Uri: " + uri);
+ throw new IllegalArgumentException("Missing volume name: " + uri);
+ }
+ }
+
+ /** {@hide} */
+ public static @NonNull String checkArgumentVolumeName(@NonNull String volumeName) {
+ if (TextUtils.isEmpty(volumeName)) {
+ throw new IllegalArgumentException();
+ }
+
+ if (VOLUME_INTERNAL.equals(volumeName)) {
+ return volumeName;
+ } else if (VOLUME_EXTERNAL.equals(volumeName)) {
+ return volumeName;
+ }
+
+ // When not one of the well-known values above, it must be a hex UUID
+ for (int i = 0; i < volumeName.length(); i++) {
+ final char c = volumeName.charAt(i);
+ if (('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
+ || ('0' <= c && c <= '9') || (c == '-')) {
+ continue;
+ } else {
+ throw new IllegalArgumentException("Invalid volume name: " + volumeName);
+ }
}
+ return volumeName;
}
/** {@hide} */
public static @NonNull File getVolumePath(@NonNull String volumeName)
throws FileNotFoundException {
- Objects.requireNonNull(volumeName);
+ if (TextUtils.isEmpty(volumeName)) {
+ throw new IllegalArgumentException();
+ }
if (VOLUME_INTERNAL.equals(volumeName)) {
return Environment.getDataDirectory();
@@ -2947,7 +2981,9 @@ public final class MediaStore {
for (VolumeInfo vi : sm.getVolumes()) {
if (Objects.equals(vi.getFsUuid(), volumeName)) {
final File path = vi.getPathForUser(UserHandle.myUserId());
- if (path == null) {
+ if (path != null) {
+ return path;
+ } else {
throw new FileNotFoundException("Failed to find path for " + vi);
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7e348e42719c..6263293e0ec3 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -86,7 +86,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.MemoryIntArray;
-import android.view.textservice.TextServicesManager;
+import android.view.inputmethod.InputMethodSystemProperty;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.ColorDisplayController;
@@ -1190,7 +1190,8 @@ public final class Settings {
/**
* Activity Action: Show Do Not Disturb access settings.
* <p>
- * Users can grant and deny access to Do Not Disturb configuration from here.
+ * Users can grant and deny access to Do Not Disturb configuration from here. Managed
+ * profiles cannot grant Do Not Disturb access.
* See {@link android.app.NotificationManager#isNotificationPolicyAccessGranted()} for more
* details.
* <p>
@@ -3379,6 +3380,22 @@ public final class Settings {
*/
public static final String NOTIFICATION_VIBRATION_INTENSITY =
"notification_vibration_intensity";
+ /**
+ * The intensity of ringtone vibrations, if configurable.
+ *
+ * Not all devices are capable of changing their vibration intensity; on these devices
+ * there will likely be no difference between the various vibration intensities except for
+ * intensity 0 (off) and the rest.
+ *
+ * <b>Values:</b><br/>
+ * 0 - Vibration is disabled<br/>
+ * 1 - Weak vibrations<br/>
+ * 2 - Medium vibrations<br/>
+ * 3 - Strong vibrations
+ * @hide
+ */
+ public static final String RING_VIBRATION_INTENSITY =
+ "ring_vibration_intensity";
/**
* The intensity of haptic feedback vibrations, if configurable.
@@ -4248,6 +4265,7 @@ public final class Settings {
ACCELEROMETER_ROTATION,
SHOW_BATTERY_PERCENT,
NOTIFICATION_VIBRATION_INTENSITY,
+ RING_VIBRATION_INTENSITY,
HAPTIC_FEEDBACK_INTENSITY,
DISPLAY_COLOR_MODE,
ALARM_ALERT,
@@ -4399,6 +4417,7 @@ public final class Settings {
VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR);
VALIDATORS.put(VIBRATE_ON, VIBRATE_ON_VALIDATOR);
VALIDATORS.put(NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
+ VALIDATORS.put(RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR);
VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR);
@@ -5034,10 +5053,6 @@ public final class Settings {
public static boolean putStringForUser(@NonNull ContentResolver resolver,
@NonNull String name, @Nullable String value, @Nullable String tag,
boolean makeDefault, @UserIdInt int userHandle) {
- if (LOCATION_MODE.equals(name)) {
- // Map LOCATION_MODE to underlying location provider storage API
- return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
- }
if (MOVED_TO_GLOBAL.contains(name)) {
Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
+ " to android.provider.Settings.Global");
@@ -5190,10 +5205,6 @@ public final class Settings {
/** @hide */
@UnsupportedAppUsage
public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
- if (LOCATION_MODE.equals(name)) {
- // Map from to underlying location provider storage API to location mode
- return getLocationModeForUser(cr, userHandle);
- }
String v = getStringForUser(cr, name, userHandle);
try {
return v != null ? Integer.parseInt(v) : def;
@@ -5228,10 +5239,6 @@ public final class Settings {
/** @hide */
public static int getIntForUser(ContentResolver cr, String name, int userHandle)
throws SettingNotFoundException {
- if (LOCATION_MODE.equals(name)) {
- // Map from to underlying location provider storage API to location mode
- return getLocationModeForUser(cr, userHandle);
- }
String v = getStringForUser(cr, name, userHandle);
try {
return Integer.parseInt(v);
@@ -5814,9 +5821,8 @@ public final class Settings {
* this value being present in settings.db or on ContentObserver notifications on the
* corresponding Uri.
*
- * @deprecated use {@link #LOCATION_MODE} and
- * {@link LocationManager#MODE_CHANGED_ACTION} (or
- * {@link LocationManager#PROVIDERS_CHANGED_ACTION})
+ * @deprecated Providers should not be controlled individually. See {@link #LOCATION_MODE}
+ * documentation for information on reading/writing location information.
*/
@Deprecated
public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
@@ -5834,9 +5840,7 @@ public final class Settings {
* notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION}
* to receive changes in this value.
*
- * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
- * get the status of a location provider, use
- * {@link LocationManager#isProviderEnabled(String)}.
+ * @deprecated To check location mode, use {@link LocationManager#isLocationEnabled()}.
*/
@Deprecated
public static final String LOCATION_MODE = "location_mode";
@@ -5875,9 +5879,7 @@ public final class Settings {
/**
* Location access disabled.
*
- * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
- * get the status of a location provider, use
- * {@link LocationManager#isProviderEnabled(String)}.
+ * @deprecated See {@link #LOCATION_MODE}.
*/
@Deprecated
public static final int LOCATION_MODE_OFF = 0;
@@ -5897,9 +5899,7 @@ public final class Settings {
* with {@link android.location.Criteria#POWER_HIGH} may be downgraded to
* {@link android.location.Criteria#POWER_MEDIUM}.
*
- * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
- * get the status of a location provider, use
- * {@link LocationManager#isProviderEnabled(String)}.
+ * @deprecated See {@link #LOCATION_MODE}.
*/
@Deprecated
public static final int LOCATION_MODE_BATTERY_SAVING = 2;
@@ -5907,9 +5907,7 @@ public final class Settings {
/**
* Best-effort location computation allowed.
*
- * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
- * get the status of a location provider, use
- * {@link LocationManager#isProviderEnabled(String)}.
+ * @deprecated See {@link #LOCATION_MODE}.
*/
@Deprecated
public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
@@ -6033,6 +6031,21 @@ public final class Settings {
"lock_screen_allow_remote_input";
/**
+ * Indicates which clock face to show on lock screen and AOD.
+ * @hide
+ */
+ public static final String LOCK_SCREEN_CUSTOM_CLOCK_FACE = "lock_screen_custom_clock_face";
+
+ private static final Validator LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR =
+ ANY_STRING_VALIDATOR;
+
+ /**
+ * Indicates which clock face to show on lock screen and AOD while docked.
+ * @hide
+ */
+ private static final String DOCKED_CLOCK_FACE = "docked_clock_face";
+
+ /**
* Set by the system to track if the user needs to see the call to action for
* the lockscreen notification policy.
* @hide
@@ -6221,7 +6234,7 @@ public final class Settings {
public static final String CHARGING_SOUNDS_ENABLED = "charging_sounds_enabled";
/**
- * Whether to vibrate for wireless charging events.
+ * Whether to vibrate for charging events.
* @hide
*/
public static final String CHARGING_VIBRATION_ENABLED = "charging_vibration_enabled";
@@ -7398,6 +7411,14 @@ public final class Settings {
private static final Validator DOZE_DOUBLE_TAP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
+ * Whether the device should respond to the SLPI tap gesture.
+ * @hide
+ */
+ public static final String DOZE_TAP_SCREEN_GESTURE = "doze_tap_gesture";
+
+ private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
+
+ /**
* Gesture that wakes up the lock screen.
* @hide
*/
@@ -7414,6 +7435,22 @@ public final class Settings {
private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
+ * Gesture that skips media.
+ * @hide
+ */
+ public static final String SKIP_GESTURE = "skip_gesture";
+
+ private static final Validator SKIP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
+
+ /**
+ * Gesture that silences sound (alarms, notification, calls).
+ * @hide
+ */
+ public static final String SILENCE_GESTURE = "silence_gesture";
+
+ private static final Validator SILENCE_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
+
+ /**
* The current night mode that has been selected by the user. Owned
* and controlled by UiModeManagerService. Constants are as per
* UiModeManager.
@@ -7715,6 +7752,23 @@ public final class Settings {
public static final String TV_INPUT_CUSTOM_LABELS = "tv_input_custom_labels";
/**
+ * Whether TV app uses non-system inputs.
+ *
+ * <p>
+ * The value is boolean (1 or 0), where 1 means non-system TV inputs are allowed,
+ * and 0 means non-system TV inputs are not allowed.
+ *
+ * <p>
+ * Devices such as sound bars may have changed the system property allow_third_party_inputs
+ * to false so the TV Application only uses HDMI and other built in inputs. This setting
+ * allows user to override the default and have the TV Application use third party TV inputs
+ * available on play store.
+ *
+ * @hide
+ */
+ public static final String TV_APP_USES_NON_SYSTEM_INPUTS = "tv_app_uses_non_system_inputs";
+
+ /**
* Whether automatic routing of system audio to USB audio peripheral is disabled.
* The value is boolean (1 or 0), where 1 means automatic routing is disabled,
* and 0 means automatic routing is enabled.
@@ -7849,6 +7903,19 @@ public final class Settings {
BOOLEAN_VALIDATOR;
/**
+ * Whether or not face unlock always requires user confirmation, meaning {@link
+ * android.hardware.biometrics.BiometricPrompt.Builder#setRequireConfirmation(boolean)}
+ * is always 'true'. This overrides the behavior that apps choose in the
+ * setRequireConfirmation API.
+ * @hide
+ */
+ public static final String FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION =
+ "face_unlock_always_require_confirmation";
+
+ private static final Validator FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR =
+ BOOLEAN_VALIDATOR;
+
+ /**
* Whether the assist gesture should be enabled.
*
* @hide
@@ -8439,12 +8506,14 @@ public final class Settings {
DOZE_ALWAYS_ON,
DOZE_PICK_UP_GESTURE,
DOZE_DOUBLE_TAP_GESTURE,
+ DOZE_TAP_SCREEN_GESTURE,
DOZE_WAKE_LOCK_SCREEN_GESTURE,
DOZE_WAKE_SCREEN_GESTURE,
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
FACE_UNLOCK_KEYGUARD_ENABLED,
FACE_UNLOCK_APP_ENABLED,
+ FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
ASSIST_GESTURE_ENABLED,
ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
ASSIST_GESTURE_WAKE_ENABLED,
@@ -8462,6 +8531,7 @@ public final class Settings {
HUSH_GESTURE_USED,
IN_CALL_NOTIFICATION_ENABLED,
LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
+ LOCK_SCREEN_CUSTOM_CLOCK_FACE,
LOCK_SCREEN_SHOW_NOTIFICATIONS,
ZEN_DURATION,
SHOW_ZEN_UPGRADE_NOTIFICATION,
@@ -8476,6 +8546,8 @@ public final class Settings {
NOTIFICATION_NEW_INTERRUPTION_MODEL,
TRUST_AGENTS_EXTEND_UNLOCK,
LOCK_SCREEN_WHEN_TRUST_LOST,
+ SKIP_GESTURE,
+ SILENCE_GESTURE,
};
/**
@@ -8592,6 +8664,7 @@ public final class Settings {
VALIDATORS.put(DOZE_ALWAYS_ON, DOZE_ALWAYS_ON_VALIDATOR);
VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR);
VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR);
+ VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR);
VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR);
VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR);
VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR);
@@ -8599,6 +8672,8 @@ public final class Settings {
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR);
VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR);
VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR);
+ VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
+ FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR);
VALIDATORS.put(ASSIST_GESTURE_ENABLED, ASSIST_GESTURE_ENABLED_VALIDATOR);
VALIDATORS.put(ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
ASSIST_GESTURE_SILENCE_ALERTS_ENABLED_VALIDATOR);
@@ -8640,7 +8715,10 @@ public final class Settings {
VALIDATORS.put(ASSIST_GESTURE_SETUP_COMPLETE, BOOLEAN_VALIDATOR);
VALIDATORS.put(NOTIFICATION_NEW_INTERRUPTION_MODEL, BOOLEAN_VALIDATOR);
VALIDATORS.put(TRUST_AGENTS_EXTEND_UNLOCK, TRUST_AGENTS_EXTEND_UNLOCK_VALIDATOR);
+ VALIDATORS.put(LOCK_SCREEN_CUSTOM_CLOCK_FACE, LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR);
VALIDATORS.put(LOCK_SCREEN_WHEN_TRUST_LOST, LOCK_SCREEN_WHEN_TRUST_LOST_VALIDATOR);
+ VALIDATORS.put(SKIP_GESTURE, SKIP_GESTURE_VALIDATOR);
+ VALIDATORS.put(SILENCE_GESTURE, SILENCE_GESTURE_VALIDATOR);
}
/**
@@ -8668,14 +8746,14 @@ public final class Settings {
CLONE_TO_MANAGED_PROFILE.add(ACCESSIBILITY_ENABLED);
CLONE_TO_MANAGED_PROFILE.add(ALLOW_MOCK_LOCATION);
CLONE_TO_MANAGED_PROFILE.add(ALLOWED_GEOLOCATION_ORIGINS);
- CLONE_TO_MANAGED_PROFILE.add(DEFAULT_INPUT_METHOD);
CLONE_TO_MANAGED_PROFILE.add(ENABLED_ACCESSIBILITY_SERVICES);
- CLONE_TO_MANAGED_PROFILE.add(ENABLED_INPUT_METHODS);
CLONE_TO_MANAGED_PROFILE.add(LOCATION_CHANGER);
CLONE_TO_MANAGED_PROFILE.add(LOCATION_MODE);
CLONE_TO_MANAGED_PROFILE.add(LOCATION_PROVIDERS_ALLOWED);
- CLONE_TO_MANAGED_PROFILE.add(SELECTED_INPUT_METHOD_SUBTYPE);
- if (TextServicesManager.DISABLE_PER_PROFILE_SPELL_CHECKER) {
+ if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) {
+ CLONE_TO_MANAGED_PROFILE.add(DEFAULT_INPUT_METHOD);
+ CLONE_TO_MANAGED_PROFILE.add(ENABLED_INPUT_METHODS);
+ CLONE_TO_MANAGED_PROFILE.add(SELECTED_INPUT_METHOD_SUBTYPE);
CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER);
CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER_SUBTYPE);
}
@@ -8794,84 +8872,6 @@ public final class Settings {
userId);
}
}
-
- /**
- * Thread-safe method for setting the location mode to one of
- * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
- * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}.
- * Necessary because the mode is a composite of the underlying location provider
- * settings.
- *
- * @param cr the content resolver to use
- * @param mode such as {@link #LOCATION_MODE_HIGH_ACCURACY}
- * @param userId the userId for which to change mode
- * @return true if the value was set, false on database errors
- *
- * @throws IllegalArgumentException if mode is not one of the supported values
- *
- * @deprecated To enable/disable location, use
- * {@link LocationManager#setLocationEnabledForUser(boolean, int)}.
- * To enable/disable a specific location provider, use
- * {@link LocationManager#setProviderEnabledForUser(String, boolean, int)}.
- */
- @Deprecated
- private static boolean setLocationModeForUser(
- ContentResolver cr, int mode, int userId) {
- synchronized (mLocationSettingsLock) {
- boolean gps = false;
- boolean network = false;
- switch (mode) {
- case LOCATION_MODE_OFF:
- break;
- case LOCATION_MODE_SENSORS_ONLY:
- gps = true;
- break;
- case LOCATION_MODE_BATTERY_SAVING:
- network = true;
- break;
- case LOCATION_MODE_HIGH_ACCURACY:
- gps = true;
- network = true;
- break;
- default:
- throw new IllegalArgumentException("Invalid location mode: " + mode);
- }
-
- boolean nlpSuccess = Settings.Secure.setLocationProviderEnabledForUser(
- cr, LocationManager.NETWORK_PROVIDER, network, userId);
- boolean gpsSuccess = Settings.Secure.setLocationProviderEnabledForUser(
- cr, LocationManager.GPS_PROVIDER, gps, userId);
- return gpsSuccess && nlpSuccess;
- }
- }
-
- /**
- * Thread-safe method for reading the location mode, returns one of
- * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
- * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. Necessary
- * because the mode is a composite of the underlying location provider settings.
- *
- * @param cr the content resolver to use
- * @param userId the userId for which to read the mode
- * @return the location mode
- */
- private static final int getLocationModeForUser(ContentResolver cr, int userId) {
- synchronized (mLocationSettingsLock) {
- boolean gpsEnabled = Settings.Secure.isLocationProviderEnabledForUser(
- cr, LocationManager.GPS_PROVIDER, userId);
- boolean networkEnabled = Settings.Secure.isLocationProviderEnabledForUser(
- cr, LocationManager.NETWORK_PROVIDER, userId);
- if (gpsEnabled && networkEnabled) {
- return LOCATION_MODE_HIGH_ACCURACY;
- } else if (gpsEnabled) {
- return LOCATION_MODE_SENSORS_ONLY;
- } else if (networkEnabled) {
- return LOCATION_MODE_BATTERY_SAVING;
- } else {
- return LOCATION_MODE_OFF;
- }
- }
- }
}
/**
@@ -8898,6 +8898,14 @@ public final class Settings {
public static final String ADD_USERS_WHEN_LOCKED = "add_users_when_locked";
/**
+ * Whether applying ramping ringer on incoming phone call ringtone.
+ * <p>1 = apply ramping ringer
+ * <p>0 = do not apply ramping ringer
+ * @hide
+ */
+ public static final String APPLY_RAMPING_RINGER = "apply_ramping_ringer";
+
+ /**
* Setting whether the global gesture for enabling accessibility is enabled.
* If this gesture is enabled the user will be able to perfrom it to enable
* the accessibility state without visiting the settings app.
@@ -9422,6 +9430,15 @@ public final class Settings {
"hdmi_system_audio_control_enabled";
/**
+ * Whether HDMI Routing Control feature is enabled. If enabled, the switch device will
+ * route to the correct input source on receiving Routing Control related messages. If
+ * disabled, you can only switch the input via controls on this device.
+ * @hide
+ */
+ public static final String HDMI_CEC_SWITCH_ENABLED =
+ "hdmi_cec_switch_enabled";
+
+ /**
* Whether TV will automatically turn on upon reception of the CEC command
* &lt;Text View On&gt; or &lt;Image View On&gt;. (0 = false, 1 = true)
*
@@ -10825,6 +10842,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0;
/**
@@ -10833,6 +10852,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1;
/**
@@ -10841,6 +10862,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final int CAPTIVE_PORTAL_MODE_AVOID = 2;
/**
@@ -10850,6 +10873,8 @@ public final class Settings {
* The default for this setting is CAPTIVE_PORTAL_MODE_PROMPT.
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode";
/**
@@ -10878,6 +10903,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_HTTPS_URL = "captive_portal_https_url";
/**
@@ -10886,6 +10913,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_HTTP_URL = "captive_portal_http_url";
/**
@@ -10894,6 +10923,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_FALLBACK_URL = "captive_portal_fallback_url";
/**
@@ -10902,6 +10933,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_OTHER_FALLBACK_URLS =
"captive_portal_other_fallback_urls";
@@ -10911,6 +10944,8 @@ public final class Settings {
* by "@@,@@".
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS =
"captive_portal_fallback_probe_specs";
@@ -10921,6 +10956,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https";
/**
@@ -10929,6 +10966,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent";
/**
@@ -10938,6 +10977,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD =
"data_stall_consecutive_dns_timeout_threshold";
@@ -10946,6 +10987,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String DATA_STALL_MIN_EVALUATE_INTERVAL =
"data_stall_min_evaluate_interval";
@@ -10955,6 +10998,8 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD =
"data_stall_valid_dns_time_threshold";
@@ -10964,9 +11009,26 @@ public final class Settings {
*
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type";
/**
+ * Whether to try cellular data recovery when a bad network is reported.
+ *
+ * @hide
+ */
+ public static final String DATA_STALL_RECOVERY_ON_BAD_NETWORK =
+ "data_stall_recovery_on_bad_network";
+
+ /**
+ * Minumim duration in millisecodns between cellular data recovery attempts
+ *
+ * @hide
+ */
+ public static final String MIN_DURATION_BETWEEN_RECOVERY_STEPS_IN_MS =
+ "min_duration_between_recovery_steps";
+ /**
* Whether network service discovery is enabled.
*
* @hide
@@ -11097,6 +11159,10 @@ public final class Settings {
*/
public static final String PRIVATE_DNS_DEFAULT_MODE = "private_dns_default_mode";
+
+ /** {@hide} */
+ public static final String
+ BLUETOOTH_BTSNOOP_DEFAULT_MODE = "bluetooth_btsnoop_default_mode";
/** {@hide} */
public static final String
BLUETOOTH_HEADSET_PRIORITY_PREFIX = "bluetooth_headset_priority_";
@@ -11133,6 +11199,31 @@ public final class Settings {
/** {@hide} */
public static final String
BLUETOOTH_HEARING_AID_PRIORITY_PREFIX = "bluetooth_hearing_aid_priority_";
+ /**
+ * Enable/disable radio bug detection
+ *
+ * {@hide}
+ */
+ public static final String
+ ENABLE_RADIO_BUG_DETECTION = "enable_radio_bug_detection";
+
+ /**
+ * Count threshold of RIL wakelock timeout for radio bug detection
+ *
+ * {@hide}
+ */
+ public static final String
+ RADIO_BUG_WAKELOCK_TIMEOUT_COUNT_THRESHOLD =
+ "radio_bug_wakelock_timeout_count_threshold";
+
+ /**
+ * Count threshold of RIL system error for radio bug detection
+ *
+ * {@hide}
+ */
+ public static final String
+ RADIO_BUG_SYSTEM_ERROR_COUNT_THRESHOLD =
+ "radio_bug_system_error_count_threshold";
/**
* Activity manager specific settings.
@@ -11280,14 +11371,14 @@ public final class Settings {
* quick_doze_enabled (boolean)
* </pre>
* @hide
- * @see com.android.server.power.BatterySaverPolicy
+ * @see com.android.server.power.batterysaver.BatterySaverPolicy
*/
public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants";
/**
* Battery Saver device specific settings
* This is encoded as a key=value list, separated by commas.
- * See {@link com.android.server.power.BatterySaverPolicy} for the details.
+ * See {@link com.android.server.power.batterysaver.BatterySaverPolicy} for the details.
*
* @hide
*/
@@ -11623,6 +11714,7 @@ public final class Settings {
* battery_level_collection_delay_ms (long)
* max_history_files (int)
* max_history_buffer_kb (int)
+ * battery_charged_delay_ms (int)
* </pre>
*
* <p>
@@ -12008,16 +12100,33 @@ public final class Settings {
"angle_gl_driver_selection_values";
/**
- * Apps that are selected to use Game Update Package.
+ * Game Update Package global preference for all Apps.
+ * 0 = Default
+ * 1 = All Apps use Game Update Package
+ * 2 = All Apps use system graphics driver
+ * @hide
+ */
+ public static final String GUP_DEV_ALL_APPS = "gup_dev_all_apps";
+
+ /**
+ * List of Apps selected to use Game Update Package.
+ * i.e. <pkg1>,<pkg2>,...,<pkgN>
* @hide
*/
public static final String GUP_DEV_OPT_IN_APPS = "gup_dev_opt_in_apps";
/**
- * Apps on the black list that are forbidden to useGame Update Package.
+ * List of Apps selected not to use Game Update Package.
+ * i.e. <pkg1>,<pkg2>,...,<pkgN>
+ * @hide
+ */
+ public static final String GUP_DEV_OPT_OUT_APPS = "gup_dev_opt_out_apps";
+
+ /**
+ * Apps on the blacklist that are forbidden to use Game Update Package.
* @hide
*/
- public static final String GUP_BLACK_LIST = "gup_black_list";
+ public static final String GUP_BLACKLIST = "gup_blacklist";
/**
* Ordered GPU debug layer list for Vulkan
@@ -13837,6 +13946,8 @@ public final class Settings {
* enabled (boolean)
* requires_targeting_p (boolean)
* max_squeeze_remeasure_attempts (int)
+ * edit_choices_before_sending (boolean)
+ * show_in_heads_up (boolean)
* </pre>
* @see com.android.systemui.statusbar.policy.SmartReplyConstants
* @hide
@@ -14021,6 +14132,53 @@ public final class Settings {
*/
public static final String NATIVE_FLAGS_HEALTH_CHECK_ENABLED =
"native_flags_health_check_enabled";
+
+ /**
+ * Parameter for {@link #APPOP_HISTORY_PARAMETERS} that controls the mode
+ * in which the historical registry operates.
+ *
+ * @hide
+ */
+ public static final String APPOP_HISTORY_MODE = "mode";
+
+ /**
+ * Parameter for {@link #APPOP_HISTORY_PARAMETERS} that controls how long
+ * is the interval between snapshots in the base case i.e. the most recent
+ * part of the history.
+ *
+ * @hide
+ */
+ public static final String APPOP_HISTORY_BASE_INTERVAL_MILLIS = "baseIntervalMillis";
+
+ /**
+ * Parameter for {@link #APPOP_HISTORY_PARAMETERS} that controls the base
+ * for the logarithmic step when building app op history.
+ *
+ * @hide
+ */
+ public static final String APPOP_HISTORY_INTERVAL_MULTIPLIER = "intervalMultiplier";
+
+ /**
+ * Appop history parameters. These parameters are represented by
+ * a comma-delimited key-value list.
+ *
+ * The following strings are supported as keys:
+ * <pre>
+ * mode (int)
+ * baseIntervalMillis (long)
+ * intervalMultiplier (int)
+ * </pre>
+ *
+ * Ex: "enabled=true,baseIntervalMillis=1000,intervalMultiplier=10"
+ *
+ * @see #APPOP_HISTORY_MODE
+ * @see #APPOP_HISTORY_BASE_INTERVAL_MILLIS
+ * @see #APPOP_HISTORY_INTERVAL_MULTIPLIER
+ *
+ * @hide
+ */
+ public static final String APPOP_HISTORY_PARAMETERS =
+ "appop_history_parameters";
}
/**
@@ -14049,7 +14207,7 @@ public final class Settings {
*
* @hide
*/
- // TODO(b/117663715): require a new read permission
+ @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
static String getString(ContentResolver resolver, String name) {
return sNameValueCache.getStringForUser(resolver, name, resolver.getUserId());
}
@@ -14072,8 +14230,7 @@ public final class Settings {
*
* @hide
*/
- // TODO(b/117663715): require a new write permission restricted to a single source
- @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+ @RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
static boolean putString(@NonNull ContentResolver resolver, @NonNull String name,
@Nullable String value, boolean makeDefault) {
return sNameValueCache.putStringForUser(resolver, name, value, null, makeDefault,
@@ -14095,7 +14252,7 @@ public final class Settings {
* @hide
*/
// TODO(b/117663715): require a new write permission restricted to a single source
- @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+ @RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
static void resetToDefaults(@NonNull ContentResolver resolver, @ResetMode int resetMode,
@Nullable String prefix) {
try {
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 31a5962c7e9a..c43a6668b9c3 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -533,7 +533,10 @@ public class RecoveryController {
* service.
* @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
* screen is required to generate recoverable keys.
+ *
+ * @deprecated Use the method {@link #generateKey(String, byte[])} instead.
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public @NonNull Key generateKey(@NonNull String alias) throws InternalRecoveryServiceException,
LockScreenRequiredException {
@@ -556,6 +559,47 @@ public class RecoveryController {
}
/**
+ * Generates a recoverable key with the given {@code alias} and {@code metadata}.
+ *
+ * <p>The metadata should contain any data that needs to be cryptographically bound to the
+ * generated key, but does not need to be encrypted by the key. For example, the metadata can
+ * be a byte string describing the algorithms and non-secret parameters to be used with the
+ * key. The supplied metadata can later be obtained via
+ * {@link WrappedApplicationKey#getMetadata()}.
+ *
+ * <p>During the key recovery process, the same metadata has to be supplied via
+ * {@link WrappedApplicationKey.Builder#setMetadata(byte[])}; otherwise, the recovery process
+ * will fail due to the checking of the cryptographic binding. This can help prevent
+ * potential attacks that try to swap key materials on the backup server and trick the
+ * application to use keys with different algorithms or parameters.
+ *
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ * @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
+ * screen is required to generate recoverable keys.
+ */
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ public @NonNull Key generateKey(@NonNull String alias, @Nullable byte[] metadata)
+ throws InternalRecoveryServiceException, LockScreenRequiredException {
+ try {
+ String grantAlias = mBinder.generateKeyWithMetadata(alias, metadata);
+ if (grantAlias == null) {
+ throw new InternalRecoveryServiceException("null grant alias");
+ }
+ return getKeyFromGrant(grantAlias);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (UnrecoverableKeyException e) {
+ throw new InternalRecoveryServiceException("Failed to get key from keystore", e);
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == ERROR_INSECURE_USER) {
+ throw new LockScreenRequiredException(e.getMessage());
+ }
+ throw wrapUnexpectedServiceSpecificException(e);
+ }
+ }
+
+ /**
* Imports a 256-bit recoverable AES key with the given {@code alias} and the raw bytes {@code
* keyBytes}.
*
@@ -564,7 +608,9 @@ public class RecoveryController {
* @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
* screen is required to generate recoverable keys.
*
+ * @deprecated Use the method {@link #importKey(String, byte[], byte[])} instead.
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public @NonNull Key importKey(@NonNull String alias, @NonNull byte[] keyBytes)
throws InternalRecoveryServiceException, LockScreenRequiredException {
@@ -587,6 +633,49 @@ public class RecoveryController {
}
/**
+ * Imports a recoverable 256-bit AES key with the given {@code alias}, the raw bytes {@code
+ * keyBytes}, and the {@code metadata}.
+ *
+ * <p>The metadata should contain any data that needs to be cryptographically bound to the
+ * imported key, but does not need to be encrypted by the key. For example, the metadata can
+ * be a byte string describing the algorithms and non-secret parameters to be used with the
+ * key. The supplied metadata can later be obtained via
+ * {@link WrappedApplicationKey#getMetadata()}.
+ *
+ * <p>During the key recovery process, the same metadata has to be supplied via
+ * {@link WrappedApplicationKey.Builder#setMetadata(byte[])}; otherwise, the recovery process
+ * will fail due to the checking of the cryptographic binding. This can help prevent
+ * potential attacks that try to swap key materials on the backup server and trick the
+ * application to use keys with different algorithms or parameters.
+ *
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ * @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
+ * screen is required to generate recoverable keys.
+ */
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ public @NonNull Key importKey(@NonNull String alias, @NonNull byte[] keyBytes,
+ @Nullable byte[] metadata)
+ throws InternalRecoveryServiceException, LockScreenRequiredException {
+ try {
+ String grantAlias = mBinder.importKeyWithMetadata(alias, keyBytes, metadata);
+ if (grantAlias == null) {
+ throw new InternalRecoveryServiceException("Null grant alias");
+ }
+ return getKeyFromGrant(grantAlias);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (UnrecoverableKeyException e) {
+ throw new InternalRecoveryServiceException("Failed to get key from keystore", e);
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == ERROR_INSECURE_USER) {
+ throw new LockScreenRequiredException(e.getMessage());
+ }
+ throw wrapUnexpectedServiceSpecificException(e);
+ }
+ }
+
+ /**
* Gets a key called {@code alias} from the recoverable key store.
*
* @param alias The key alias.
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index ae4448f9c908..dbfd655953d6 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -17,6 +17,7 @@
package android.security.keystore.recovery;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -41,6 +42,8 @@ public final class WrappedApplicationKey implements Parcelable {
private String mAlias;
// The only supported format is AES-256 symmetric key.
private byte[] mEncryptedKeyMaterial;
+ // The optional metadata that's authenticated (but unencrypted) with the key material.
+ private byte[] mMetadata;
// IMPORTANT! PLEASE READ!
// -----------------------
@@ -80,13 +83,23 @@ public final class WrappedApplicationKey implements Parcelable {
* @param encryptedKeyMaterial The key material
* @return This builder
*/
-
public Builder setEncryptedKeyMaterial(@NonNull byte[] encryptedKeyMaterial) {
mInstance.mEncryptedKeyMaterial = encryptedKeyMaterial;
return this;
}
/**
+ * Sets the metadata that is authenticated (but unecrypted) with the key material.
+ *
+ * @param metadata The metadata
+ * @return This builder
+ */
+ public Builder setMetadata(@Nullable byte[] metadata) {
+ mInstance.mMetadata = metadata;
+ return this;
+ }
+
+ /**
* Creates a new {@link WrappedApplicationKey} instance.
*
* @return new instance
@@ -102,9 +115,10 @@ public final class WrappedApplicationKey implements Parcelable {
private WrappedApplicationKey() { }
/**
- * Deprecated - consider using Builder.
+ * @deprecated Use the builder instead.
* @hide
*/
+ @Deprecated
public WrappedApplicationKey(@NonNull String alias, @NonNull byte[] encryptedKeyMaterial) {
mAlias = Preconditions.checkNotNull(alias);
mEncryptedKeyMaterial = Preconditions.checkNotNull(encryptedKeyMaterial);
@@ -124,6 +138,11 @@ public final class WrappedApplicationKey implements Parcelable {
return mEncryptedKeyMaterial;
}
+ /** The metadata with the key. */
+ public @Nullable byte[] getMetadata() {
+ return mMetadata;
+ }
+
public static final Parcelable.Creator<WrappedApplicationKey> CREATOR =
new Parcelable.Creator<WrappedApplicationKey>() {
public WrappedApplicationKey createFromParcel(Parcel in) {
@@ -139,6 +158,7 @@ public final class WrappedApplicationKey implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeString(mAlias);
out.writeByteArray(mEncryptedKeyMaterial);
+ out.writeByteArray(mMetadata);
}
/**
@@ -147,6 +167,10 @@ public final class WrappedApplicationKey implements Parcelable {
protected WrappedApplicationKey(Parcel in) {
mAlias = in.readString();
mEncryptedKeyMaterial = in.createByteArray();
+ // Check if there is still data to be read.
+ if (in.dataAvail() > 0) {
+ mMetadata = in.createByteArray();
+ }
}
@Override
diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java
new file mode 100644
index 000000000000..b77405affaec
--- /dev/null
+++ b/core/java/android/service/appprediction/AppPredictionService.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.appprediction;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
+import android.annotation.CallSuper;
+import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.AppTarget;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.AppTargetId;
+import android.app.prediction.IPredictionCallback;
+import android.content.Intent;
+import android.content.pm.ParceledListSlice;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.service.appprediction.IPredictionService.Stub;
+import android.util.ArrayMap;
+import android.util.Slog;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * TODO(b/111701043): Add java docs
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class AppPredictionService extends Service {
+
+ private static final String TAG = "AppPredictionService";
+
+ /**
+ * The {@link Intent} that must be declared as handled by the service.
+ * TODO(b/111701043): Add any docs about permissions the service must hold
+ *
+ * @hide
+ */
+ public static final String SERVICE_INTERFACE =
+ "android.service.appprediction.AppPredictionService";
+
+ private final ArrayMap<AppPredictionSessionId, ArrayList<CallbackWrapper>> mSessionCallbacks =
+ new ArrayMap<>();
+ private Handler mHandler;
+
+ private final IPredictionService mInterface = new Stub() {
+
+ @Override
+ public void onCreatePredictionSession(AppPredictionContext context,
+ AppPredictionSessionId sessionId) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::doCreatePredictionSession,
+ AppPredictionService.this, context, sessionId));
+ }
+
+ @Override
+ public void notifyAppTargetEvent(AppPredictionSessionId sessionId, AppTargetEvent event) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::onAppTargetEvent,
+ AppPredictionService.this, sessionId, event));
+ }
+
+ @Override
+ public void notifyLocationShown(AppPredictionSessionId sessionId, String launchLocation,
+ ParceledListSlice targetIds) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::onLocationShown, AppPredictionService.this,
+ sessionId, launchLocation, targetIds.getList()));
+ }
+
+ @Override
+ public void sortAppTargets(AppPredictionSessionId sessionId, ParceledListSlice targets,
+ IPredictionCallback callback) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::onSortAppTargets,
+ AppPredictionService.this, sessionId, targets.getList(), null,
+ new CallbackWrapper(callback)));
+ }
+
+ @Override
+ public void registerPredictionUpdates(AppPredictionSessionId sessionId,
+ IPredictionCallback callback) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::doRegisterPredictionUpdates,
+ AppPredictionService.this, sessionId, callback));
+ }
+
+ @Override
+ public void unregisterPredictionUpdates(AppPredictionSessionId sessionId,
+ IPredictionCallback callback) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::doUnregisterPredictionUpdates,
+ AppPredictionService.this, sessionId, callback));
+ }
+
+ @Override
+ public void requestPredictionUpdate(AppPredictionSessionId sessionId) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::doRequestPredictionUpdate,
+ AppPredictionService.this, sessionId));
+ }
+
+ @Override
+ public void onDestroyPredictionSession(AppPredictionSessionId sessionId) {
+ mHandler.sendMessage(
+ obtainMessage(AppPredictionService::doDestroyPredictionSession,
+ AppPredictionService.this, sessionId));
+ }
+ };
+
+ @CallSuper
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mHandler = new Handler(Looper.getMainLooper(), null, true);
+ }
+
+ @Override
+ public final IBinder onBind(Intent intent) {
+ return mInterface.asBinder();
+ }
+
+ /**
+ * Called by a client app to indicate a target launch
+ */
+ @MainThread
+ public abstract void onAppTargetEvent(@NonNull AppPredictionSessionId sessionId,
+ @NonNull AppTargetEvent event);
+
+ /**
+ * Called by a client app to indication a particular location has been shown to the user.
+ */
+ @MainThread
+ public abstract void onLocationShown(@NonNull AppPredictionSessionId sessionId,
+ @NonNull String launchLocation, @NonNull List<AppTargetId> targetIds);
+
+ private void doCreatePredictionSession(@NonNull AppPredictionContext context,
+ @NonNull AppPredictionSessionId sessionId) {
+ mSessionCallbacks.put(sessionId, new ArrayList<>());
+ onCreatePredictionSession(context, sessionId);
+ }
+
+ /**
+ * Creates a new interaction session.
+ *
+ * @param context interaction context
+ * @param sessionId the session's Id
+ */
+ public void onCreatePredictionSession(@NonNull AppPredictionContext context,
+ @NonNull AppPredictionSessionId sessionId) {}
+
+ /**
+ * Called by the client app to request sorting of targets based on prediction rank.
+ * TODO(b/111701043): Implement CancellationSignal so caller can cancel a long running request
+ */
+ @MainThread
+ public abstract void onSortAppTargets(@NonNull AppPredictionSessionId sessionId,
+ @NonNull List<AppTarget> targets, @NonNull CancellationSignal cancellationSignal,
+ @NonNull Consumer<List<AppTarget>> callback);
+
+ private void doRegisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
+ if (callbacks == null) {
+ Slog.e(TAG, "Failed to register for updates for unknown session: " + sessionId);
+ return;
+ }
+
+ final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
+ if (wrapper == null) {
+ callbacks.add(new CallbackWrapper(callback));
+ if (callbacks.size() == 1) {
+ onStartPredictionUpdates();
+ }
+ }
+ }
+
+ /**
+ * Called when any continuous prediction callback is registered.
+ */
+ @MainThread
+ public void onStartPredictionUpdates() {}
+
+ private void doUnregisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
+ if (callbacks == null) {
+ Slog.e(TAG, "Failed to unregister for updates for unknown session: " + sessionId);
+ return;
+ }
+
+ final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
+ if (wrapper != null) {
+ callbacks.remove(wrapper);
+ if (callbacks.isEmpty()) {
+ onStopPredictionUpdates();
+ }
+ }
+ }
+
+ /**
+ * Called when there are no longer any continuous prediction callbacks registered.
+ */
+ @MainThread
+ public void onStopPredictionUpdates() {}
+
+ private void doRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) {
+ final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
+ if (callbacks != null && !callbacks.isEmpty()) {
+ onRequestPredictionUpdate(sessionId);
+ }
+ }
+
+ /**
+ * Called by the client app to request target predictions. This method is only called if there
+ * are one or more prediction callbacks registered.
+ * TODO(b/111701043): Add java docs
+ *
+ * @see #updatePredictions(AppPredictionSessionId, List)
+ */
+ @MainThread
+ public abstract void onRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId);
+
+ private void doDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) {
+ mSessionCallbacks.remove(sessionId);
+ onDestroyPredictionSession(sessionId);
+ }
+
+ /**
+ * Destroys the interaction session.
+ *
+ * @param sessionId the id of the session to destroy
+ */
+ @MainThread
+ public void onDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) {}
+
+ /**
+ * Used by the prediction factory to send back results the client app. The can be called
+ * in response to {@link #onRequestPredictionUpdate(AppPredictionSessionId)} or proactively as
+ * a result of changes in predictions.
+ */
+ public final void updatePredictions(@NonNull AppPredictionSessionId sessionId,
+ @NonNull List<AppTarget> targets) {
+ List<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
+ if (callbacks != null) {
+ for (CallbackWrapper callback : callbacks) {
+ callback.accept(targets);
+ }
+ }
+ }
+
+ /**
+ * Finds the callback wrapper for the given callback.
+ */
+ private CallbackWrapper findCallbackWrapper(ArrayList<CallbackWrapper> callbacks,
+ IPredictionCallback callback) {
+ for (int i = callbacks.size() - 1; i >= 0; i--) {
+ if (callbacks.get(i).isCallback(callback)) {
+ return callbacks.get(i);
+ }
+ }
+ return null;
+ }
+
+ private static final class CallbackWrapper implements Consumer<List<AppTarget>>,
+ IBinder.DeathRecipient {
+
+ private IPredictionCallback mCallback;
+
+ CallbackWrapper(IPredictionCallback callback) {
+ mCallback = callback;
+ try {
+ mCallback.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to link to death: " + e);
+ }
+ }
+
+ public boolean isCallback(@NonNull IPredictionCallback callback) {
+ return mCallback.equals(callback);
+ }
+
+ @Override
+ public void accept(List<AppTarget> ts) {
+ try {
+ if (mCallback != null) {
+ mCallback.onResult(new ParceledListSlice(ts));
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error sending result:" + e);
+ }
+ }
+
+ @Override
+ public void binderDied() {
+ mCallback = null;
+ }
+ }
+}
diff --git a/core/java/android/service/appprediction/IPredictionService.aidl b/core/java/android/service/appprediction/IPredictionService.aidl
new file mode 100644
index 000000000000..3a6d1666f4b9
--- /dev/null
+++ b/core/java/android/service/appprediction/IPredictionService.aidl
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.appprediction;
+
+import android.app.prediction.AppTarget;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.IPredictionCallback;
+import android.content.pm.ParceledListSlice;
+
+/**
+ * Interface from the system to a prediction service.
+ *
+ * @hide
+ */
+oneway interface IPredictionService {
+
+ void onCreatePredictionSession(in AppPredictionContext context,
+ in AppPredictionSessionId sessionId);
+
+ void notifyAppTargetEvent(in AppPredictionSessionId sessionId, in AppTargetEvent event);
+
+ void notifyLocationShown(in AppPredictionSessionId sessionId, in String launchLocation,
+ in ParceledListSlice targetIds);
+
+ void sortAppTargets(in AppPredictionSessionId sessionId, in ParceledListSlice targets,
+ in IPredictionCallback callback);
+
+ void registerPredictionUpdates(in AppPredictionSessionId sessionId,
+ in IPredictionCallback callback);
+
+ void unregisterPredictionUpdates(in AppPredictionSessionId sessionId,
+ in IPredictionCallback callback);
+
+ void requestPredictionUpdate(in AppPredictionSessionId sessionId);
+
+ void onDestroyPredictionSession(in AppPredictionSessionId sessionId);
+}
diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java
new file mode 100644
index 000000000000..f6e448dc4757
--- /dev/null
+++ b/core/java/android/service/attention/AttentionService.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.attention;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+
+/**
+ * Abstract base class for Attention service.
+ *
+ * <p> An attention service provides attention estimation related features to the system.
+ * The system's default AttentionService implementation is configured in
+ * {@code config_AttentionComponent}. If this config has no value, a stub is returned.
+ *
+ * See: {@link AttentionManagerService}.
+ *
+ * <pre>
+ * {@literal
+ * <service android:name=".YourAttentionService"
+ * android:permission="android.permission.BIND_ATTENTION_SERVICE">
+ * </service>}
+ * </pre>
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class AttentionService extends Service {
+ /**
+ * The {@link Intent} that must be declared as handled by the service. To be supported, the
+ * service must also require the {@link android.Manifest.permission#BIND_ATTENTION_SERVICE}
+ * permission so that other applications can not abuse it.
+ */
+ public static final String SERVICE_INTERFACE =
+ "android.service.attention.AttentionService";
+
+ /** Attention is absent. */
+ public static final int ATTENTION_SUCCESS_ABSENT = 0;
+
+ /** Attention is present. */
+ public static final int ATTENTION_SUCCESS_PRESENT = 1;
+
+ /** Preempted by other camera user. */
+ public static final int ATTENTION_FAILURE_PREEMPTED = 2;
+
+ /** Preempted by other camera user. */
+ public static final int ATTENTION_FAILURE_TIMED_OUT = 3;
+
+ /** Unknown reasons for failing to determine the attention. */
+ public static final int ATTENTION_FAILURE_UNKNOWN = 4;
+
+ /**
+ * Result codes for when attention check was successful.
+ *
+ * @hide
+ */
+ @IntDef(prefix = {"ATTENTION_SUCCESS_"}, value = {ATTENTION_SUCCESS_ABSENT,
+ ATTENTION_SUCCESS_PRESENT})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AttentionSuccessCodes {
+ }
+
+ /**
+ * Result codes explaining why attention check was not successful.
+ *
+ * @hide
+ */
+ @IntDef(prefix = {"ATTENTION_FAILURE_"}, value = {ATTENTION_FAILURE_PREEMPTED,
+ ATTENTION_FAILURE_TIMED_OUT, ATTENTION_FAILURE_UNKNOWN})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AttentionFailureCodes {
+ }
+
+ private final IAttentionService.Stub mBinder = new IAttentionService.Stub() {
+
+ /** {@inheritDoc} */
+ @Override
+ public void checkAttention(int requestCode, IAttentionCallback callback) {
+ Preconditions.checkNotNull(callback);
+ AttentionService.this.onCheckAttention(requestCode, new AttentionCallback(callback));
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void cancelAttentionCheck(int requestCode) {
+ AttentionService.this.onCancelAttentionCheck(requestCode);
+ }
+ };
+
+ @Override
+ public final IBinder onBind(Intent intent) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mBinder;
+ }
+ return null;
+ }
+
+ /**
+ * Checks the user attention and calls into the provided callback.
+ *
+ * @param requestCode an identifier that could be used to cancel the request
+ * @param callback the callback to return the result to
+ */
+ public abstract void onCheckAttention(int requestCode, @NonNull AttentionCallback callback);
+
+ /** Cancels the attention check for a given request code. */
+ public abstract void onCancelAttentionCheck(int requestCode);
+
+
+ /** Callbacks for AttentionService results. */
+ public static final class AttentionCallback {
+ private final IAttentionCallback mCallback;
+
+ private AttentionCallback(IAttentionCallback callback) {
+ mCallback = callback;
+ }
+
+ /** Returns the result. */
+ public void onSuccess(int requestCode, @AttentionSuccessCodes int result, long timestamp) {
+ try {
+ mCallback.onSuccess(requestCode, result, timestamp);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /** Signals a failure. */
+ public void onFailure(int requestCode, @AttentionFailureCodes int error) {
+ try {
+ mCallback.onFailure(requestCode, error);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+}
diff --git a/core/java/android/service/attention/IAttentionCallback.aidl b/core/java/android/service/attention/IAttentionCallback.aidl
new file mode 100644
index 000000000000..0e8a1e75c14b
--- /dev/null
+++ b/core/java/android/service/attention/IAttentionCallback.aidl
@@ -0,0 +1,27 @@
+ /*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.attention;
+
+/**
+ * Callback for onCheckAttention request.
+ *
+ * @hide
+ */
+oneway interface IAttentionCallback {
+ void onSuccess(int requestCode, int result, long timestamp);
+ void onFailure(int requestCode, int error);
+}
diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl b/core/java/android/service/attention/IAttentionService.aidl
index 21c8e87e6c6d..c3b6f48a5b2e 100644
--- a/core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl
+++ b/core/java/android/service/attention/IAttentionService.aidl
@@ -1,11 +1,11 @@
/*
- * Copyright (C) 2014, The Android Open Source Project
+ * Copyright (C) 2019 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/license/LICENSE-2.0
+ * 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,
@@ -14,19 +14,16 @@
* limitations under the License.
*/
-package android.hardware.location;
+package android.service.attention;
-import android.hardware.location.ActivityChangedEvent;
+import android.service.attention.IAttentionCallback;
/**
- * Activity Recognition Hardware provider Sink interface.
- * This interface can be used to implement sinks to receive activity notifications.
+ * Interface for a concrete implementation to provide to the AttentionManagerService.
*
* @hide
*/
-interface IActivityRecognitionHardwareSink {
- /**
- * Activity changed event.
- */
- void onActivityChanged(in ActivityChangedEvent event);
+oneway interface IAttentionService {
+ void checkAttention(int requestCode, IAttentionCallback callback);
+ void cancelAttentionCheck(int requestCode);
} \ No newline at end of file
diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
index 7683b8ae08b2..aaba85bd36a7 100644
--- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
+++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
@@ -22,6 +22,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
@@ -41,6 +42,7 @@ import android.util.TimeUtils;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
import android.view.autofill.IAugmentedAutofillManagerClient;
+import android.view.autofill.IAutofillWindowPresenter;
import com.android.internal.annotations.GuardedBy;
@@ -58,6 +60,9 @@ import java.util.List;
* @hide
*/
@SystemApi
+@TestApi
+// TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+// in the same package as the test, and that module is compiled with SDK=test_current
public abstract class AugmentedAutofillService extends Service {
private static final String TAG = AugmentedAutofillService.class.getSimpleName();
@@ -91,10 +96,10 @@ public abstract class AugmentedAutofillService extends Service {
}
@Override
- public void onDestroyFillWindowRequest(int sessionId) {
+ public void onDestroyAllFillWindowsRequest() {
mHandler.sendMessage(
- obtainMessage(AugmentedAutofillService::handleOnDestroyFillWindowRequest,
- AugmentedAutofillService.this, sessionId));
+ obtainMessage(AugmentedAutofillService::handleOnDestroyAllFillWindowsRequest,
+ AugmentedAutofillService.this));
}
};
@@ -181,18 +186,21 @@ public abstract class AugmentedAutofillService extends Service {
new FillCallback(proxy));
}
- private void handleOnDestroyFillWindowRequest(@NonNull int sessionId) {
- AutofillProxy proxy = null;
+ private void handleOnDestroyAllFillWindowsRequest() {
if (mAutofillProxies != null) {
- proxy = mAutofillProxies.get(sessionId);
- }
- if (proxy == null) {
- // TODO(b/111330312): this might be fine, in which case we should logv it
- Log.w(TAG, "No proxy for session " + sessionId);
- return;
+ final int size = mAutofillProxies.size();
+ for (int i = 0; i < size; i++) {
+ final int sessionId = mAutofillProxies.keyAt(i);
+ final AutofillProxy proxy = mAutofillProxies.valueAt(i);
+ if (proxy == null) {
+ // TODO(b/111330312): this might be fine, in which case we should logv it
+ Log.w(TAG, "No proxy for session " + sessionId);
+ return;
+ }
+ proxy.destroy();
+ }
+ mAutofillProxies.clear();
}
- proxy.destroy();
- mAutofillProxies.remove(sessionId);
}
private void handleOnUnbind() {
@@ -214,7 +222,7 @@ public abstract class AugmentedAutofillService extends Service {
}
@Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ protected final void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (mAutofillProxies != null) {
final int size = mAutofillProxies.size();
pw.print("Number proxies: "); pw.println(size);
@@ -225,6 +233,15 @@ public abstract class AugmentedAutofillService extends Service {
proxy.dump(" ", pw);
}
}
+ dump(pw, args);
+ }
+
+ /**
+ * Implementation specific {@code dump}.
+ */
+ protected void dump(@NonNull PrintWriter pw,
+ @SuppressWarnings("unused") @NonNull String[] args) {
+ pw.print(getClass().getName()); pw.println(": nothing to dump");
}
/** @hide */
@@ -259,7 +276,6 @@ public abstract class AugmentedAutofillService extends Service {
*
* <p>Used to make sure the SmartSuggestionsParams is updated when a new fields is focused.
*/
- // TODO(b/111330312): might not be needed when using IME
@GuardedBy("mLock")
private AutofillId mLastShownId;
@@ -338,6 +354,16 @@ public abstract class AugmentedAutofillService extends Service {
}
}
+ public void requestShowFillUi(int width, int height, Rect anchorBounds,
+ IAutofillWindowPresenter presenter) throws RemoteException {
+ mClient.requestShowFillUi(mSessionId, mFocusedId, width, height, anchorBounds,
+ presenter);
+ }
+
+ public void requestHideFillUi() throws RemoteException {
+ mClient.requestHideFillUi(mSessionId, mFocusedId);
+ }
+
private void update(@NonNull AutofillId focusedId, @NonNull AutofillValue focusedValue) {
synchronized (mLock) {
// TODO(b/111330312): should we close the popupwindow if the focused id changed?
diff --git a/core/java/android/service/autofill/augmented/FillCallback.java b/core/java/android/service/autofill/augmented/FillCallback.java
index 620ec59c9e55..bfb4aadaeed9 100644
--- a/core/java/android/service/autofill/augmented/FillCallback.java
+++ b/core/java/android/service/autofill/augmented/FillCallback.java
@@ -20,6 +20,7 @@ import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
import android.util.Log;
@@ -29,6 +30,9 @@ import android.util.Log;
* @hide
*/
@SystemApi
+@TestApi
+//TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+//in the same package as the test, and that module is compiled with SDK=test_current
public final class FillCallback {
private static final String TAG = FillCallback.class.getSimpleName();
diff --git a/core/java/android/service/autofill/augmented/FillController.java b/core/java/android/service/autofill/augmented/FillController.java
index e65cf47e1645..d7bc893f884a 100644
--- a/core/java/android/service/autofill/augmented/FillController.java
+++ b/core/java/android/service/autofill/augmented/FillController.java
@@ -19,6 +19,7 @@ import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.RemoteException;
import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
import android.util.Log;
@@ -36,6 +37,9 @@ import java.util.List;
* @hide
*/
@SystemApi
+@TestApi
+//TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+//in the same package as the test, and that module is compiled with SDK=test_current
public final class FillController {
private static final String TAG = "FillController";
diff --git a/core/java/android/service/autofill/augmented/FillRequest.java b/core/java/android/service/autofill/augmented/FillRequest.java
index 57d2cc85f7ea..dad506763641 100644
--- a/core/java/android/service/autofill/augmented/FillRequest.java
+++ b/core/java/android/service/autofill/augmented/FillRequest.java
@@ -18,6 +18,7 @@ package android.service.autofill.augmented;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.ComponentName;
import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
import android.view.autofill.AutofillId;
@@ -29,6 +30,9 @@ import android.view.autofill.AutofillValue;
*/
@SystemApi
// TODO(b/111330312): pass a requestId and/or sessionId
+@TestApi
+// TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+// in the same package as the test, and that module is compiled with SDK=test_current
public final class FillRequest {
final AutofillProxy mProxy;
diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java
index 1ecfab4edc12..5285132b31a5 100644
--- a/core/java/android/service/autofill/augmented/FillResponse.java
+++ b/core/java/android/service/autofill/augmented/FillResponse.java
@@ -18,6 +18,7 @@ package android.service.autofill.augmented;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.autofill.AutofillId;
@@ -30,6 +31,9 @@ import java.util.List;
* @hide
*/
@SystemApi
+@TestApi
+//TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+//in the same package as the test, and that module is compiled with SDK=test_current
public final class FillResponse implements Parcelable {
private final FillWindow mFillWindow;
@@ -50,6 +54,9 @@ public final class FillResponse implements Parcelable {
* @hide
*/
@SystemApi
+ @TestApi
+ //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+ //in the same package as the test, and that module is compiled with SDK=test_current
public static final class Builder {
private FillWindow mFillWindow;
diff --git a/core/java/android/service/autofill/augmented/FillWindow.java b/core/java/android/service/autofill/augmented/FillWindow.java
index bad7ddd3193b..51b0f01af6ae 100644
--- a/core/java/android/service/autofill/augmented/FillWindow.java
+++ b/core/java/android/service/autofill/augmented/FillWindow.java
@@ -16,21 +16,25 @@
package android.service.autofill.augmented;
import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
+import static android.service.autofill.augmented.AugmentedAutofillService.VERBOSE;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import android.annotation.LongDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
-import android.app.Dialog;
+import android.annotation.TestApi;
import android.graphics.Rect;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteException;
import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
import android.service.autofill.augmented.PresentationParams.Area;
import android.util.Log;
-import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
import android.view.WindowManager;
+import android.view.autofill.IAutofillWindowPresenter;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
@@ -61,13 +65,16 @@ import java.lang.annotation.RetentionPolicy;
* @hide
*/
@SystemApi
+@TestApi
+//TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+//in the same package as the test, and that module is compiled with SDK=test_current
public final class FillWindow implements AutoCloseable {
private static final String TAG = "FillWindow";
/** Indicates the data being shown is a physical address */
public static final long FLAG_METADATA_ADDRESS = 0x1;
- // TODO(b/111330312): add moar flags
+ // TODO(b/111330312): add more flags
/** @hide */
@LongDef(prefix = { "FLAG" }, value = {
@@ -79,8 +86,17 @@ public final class FillWindow implements AutoCloseable {
private final Object mLock = new Object();
private final CloseGuard mCloseGuard = CloseGuard.get();
+ private final @NonNull Handler mUiThreadHandler = new Handler(Looper.getMainLooper());
+ private final @NonNull FillWindowPresenter mFillWindowPresenter = new FillWindowPresenter();
+
+ @GuardedBy("mLock")
+ private WindowManager mWm;
@GuardedBy("mLock")
- private Dialog mDialog;
+ private View mFillView;
+ @GuardedBy("mLock")
+ private boolean mShowing;
+ @GuardedBy("mLock")
+ private Rect mBounds;
@GuardedBy("mLock")
private boolean mDestroyed;
@@ -136,51 +152,28 @@ public final class FillWindow implements AutoCloseable {
// window instead of destroying. In fact, it might be better to allocate a full window
// initially, which is transparent (and let touches get through) everywhere but in the
// rect boundaries.
- destroy();
// TODO(b/111330312): make sure all touch events are handled, window is always closed,
// etc.
- mDialog = new Dialog(rootView.getContext()) {
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
- FillWindow.this.destroy();
+ mWm = rootView.getContext().getSystemService(WindowManager.class);
+ mFillView = rootView;
+ // Listen to the touch outside to destroy the window when typing is detected.
+ mFillView.setOnTouchListener(
+ (view, motionEvent) -> {
+ if (motionEvent.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ if (VERBOSE) Log.v(TAG, "Outside touch detected, hiding the window");
+ hide();
+ }
+ return false;
}
- return false;
- }
- };
- mCloseGuard.open("destroy");
- final Window window = mDialog.getWindow();
- window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
- // Makes sure touch outside the dialog is received by the window behind the dialog.
- window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
- // Makes sure the touch outside the dialog is received by the dialog to dismiss it.
- window.addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
- // Makes sure keyboard shows up.
- window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
-
- final int height = rect.bottom - rect.top;
- final int width = rect.right - rect.left;
- final WindowManager.LayoutParams windowParams = window.getAttributes();
- windowParams.gravity = Gravity.TOP | Gravity.LEFT;
- windowParams.y = rect.top + height;
- windowParams.height = height;
- windowParams.x = rect.left;
- windowParams.width = width;
-
- window.setAttributes(windowParams);
- window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- window.setBackgroundDrawableResource(android.R.color.transparent);
-
- mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
- final ViewGroup.LayoutParams diagParams = new ViewGroup.LayoutParams(width, height);
- mDialog.setContentView(rootView, diagParams);
-
+ );
+ mShowing = false;
+ mBounds = new Rect(area.getBounds());
if (DEBUG) {
Log.d(TAG, "Created FillWindow: params= " + smartSuggestion + " view=" + rootView);
}
-
+ mDestroyed = false;
mProxy.setFillWindow(this);
return true;
}
@@ -190,36 +183,87 @@ public final class FillWindow implements AutoCloseable {
void show() {
// TODO(b/111330312): check if updated first / throw exception
if (DEBUG) Log.d(TAG, "show()");
-
synchronized (mLock) {
checkNotDestroyedLocked();
- if (mDialog == null) {
+ if (mWm == null || mFillView == null) {
throw new IllegalStateException("update() not called yet, or already destroyed()");
}
-
- mDialog.show();
if (mProxy != null) {
+ try {
+ mProxy.requestShowFillUi(mBounds.right - mBounds.left,
+ mBounds.bottom - mBounds.top,
+ /*anchorBounds=*/ null, mFillWindowPresenter);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error requesting to show fill window", e);
+ }
mProxy.report(AutofillProxy.REPORT_EVENT_UI_SHOWN);
}
}
}
/**
- * Destroys the window.
+ * Hides the window.
*
- * <p>Once destroyed, this window cannot be used anymore
+ * <p>The window is not destroyed and can be shown again
*/
- public void destroy() {
- if (DEBUG) Log.d(TAG, "destroy(): mDestroyed=" + mDestroyed + " mDialog=" + mDialog);
+ private void hide() {
+ if (DEBUG) Log.d(TAG, "hide()");
+ synchronized (mLock) {
+ checkNotDestroyedLocked();
+ if (mWm == null || mFillView == null) {
+ throw new IllegalStateException("update() not called yet, or already destroyed()");
+ }
+ if (mProxy != null && mShowing) {
+ try {
+ mProxy.requestHideFillUi();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error requesting to hide fill window", e);
+ }
+ }
+ }
+ }
- synchronized (this) {
- if (mDestroyed || mDialog == null) return;
+ private void handleShow(WindowManager.LayoutParams p) {
+ if (DEBUG) Log.d(TAG, "handleShow()");
+ synchronized (mLock) {
+ if (mWm != null && mFillView != null) {
+ p.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
+ if (!mShowing) {
+ mWm.addView(mFillView, p);
+ mShowing = true;
+ } else {
+ mWm.updateViewLayout(mFillView, p);
+ }
+ }
+ }
+ }
- mDialog.dismiss();
- mDialog = null;
- if (mProxy != null) {
- mProxy.report(AutofillProxy.REPORT_EVENT_UI_DESTROYED);
+ private void handleHide() {
+ if (DEBUG) Log.d(TAG, "handleHide()");
+ synchronized (mLock) {
+ if (mWm != null && mFillView != null && mShowing) {
+ mWm.removeView(mFillView);
+ mShowing = false;
}
+ }
+ }
+
+ /**
+ * Destroys the window.
+ *
+ * <p>Once destroyed, this window cannot be used anymore
+ */
+ public void destroy() {
+ if (DEBUG) {
+ Log.d(TAG,
+ "destroy(): mDestroyed=" + mDestroyed + " mShowing=" + mShowing + " mFillView="
+ + mFillView);
+ }
+ synchronized (mLock) {
+ if (mDestroyed) return;
+ hide();
+ mProxy.report(AutofillProxy.REPORT_EVENT_UI_DESTROYED);
+ mDestroyed = true;
mCloseGuard.close();
}
}
@@ -246,11 +290,15 @@ public final class FillWindow implements AutoCloseable {
public void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
synchronized (this) {
pw.print(prefix); pw.print("destroyed: "); pw.println(mDestroyed);
- if (mDialog != null) {
- pw.print(prefix); pw.print("dialog: ");
- pw.println(mDialog.isShowing() ? "shown" : "hidden");
- pw.print(prefix); pw.print("window: ");
- pw.println(mDialog.getWindow().getAttributes());
+ if (mFillView != null) {
+ pw.print(prefix); pw.print("fill window: ");
+ pw.println(mShowing ? "shown" : "hidden");
+ pw.print(prefix); pw.print("fill view: ");
+ pw.println(mFillView);
+ pw.print(prefix); pw.print("mBounds: ");
+ pw.println(mBounds);
+ pw.print(prefix); pw.print("mWm: ");
+ pw.println(mWm);
}
}
}
@@ -260,4 +308,19 @@ public final class FillWindow implements AutoCloseable {
public void close() throws Exception {
destroy();
}
+
+ private final class FillWindowPresenter extends IAutofillWindowPresenter.Stub {
+ @Override
+ public void show(WindowManager.LayoutParams p, Rect transitionEpicenter,
+ boolean fitsSystemWindows, int layoutDirection) {
+ if (DEBUG) Log.d(TAG, "FillWindowPresenter.show()");
+ mUiThreadHandler.sendMessage(obtainMessage(FillWindow::handleShow, FillWindow.this, p));
+ }
+
+ @Override
+ public void hide(Rect transitionEpicenter) {
+ if (DEBUG) Log.d(TAG, "FillWindowPresenter.hide()");
+ mUiThreadHandler.sendMessage(obtainMessage(FillWindow::handleHide, FillWindow.this));
+ }
+ }
}
diff --git a/core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl b/core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl
index b3ac2da1c17e..fb6912ac6752 100644
--- a/core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl
+++ b/core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl
@@ -36,5 +36,5 @@ oneway interface IAugmentedAutofillService {
in ComponentName activityComponent, in AutofillId focusedId,
in AutofillValue focusedValue, long requestTime, in IFillCallback callback);
- void onDestroyFillWindowRequest(int sessionId);
+ void onDestroyAllFillWindowsRequest();
}
diff --git a/core/java/android/service/autofill/augmented/PresentationParams.java b/core/java/android/service/autofill/augmented/PresentationParams.java
index 0124ecca740d..b60064e9dd69 100644
--- a/core/java/android/service/autofill/augmented/PresentationParams.java
+++ b/core/java/android/service/autofill/augmented/PresentationParams.java
@@ -19,6 +19,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.graphics.Rect;
import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
import android.util.DebugUtils;
@@ -48,6 +49,9 @@ import java.lang.annotation.RetentionPolicy;
* @hide
*/
@SystemApi
+@TestApi
+//TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+//in the same package as the test, and that module is compiled with SDK=test_current
public abstract class PresentationParams {
/**
@@ -147,8 +151,11 @@ public abstract class PresentationParams {
* Area associated with a {@link PresentationParams Smart Suggestions} provider.
*
* @hide
- * */
+ */
@SystemApi
+ @TestApi
+ //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service
+ //in the same package as the test, and that module is compiled with SDK=test_current
public abstract static class Area {
/** @hide */
diff --git a/core/java/android/service/contentcapture/ContentCaptureEventsRequest.java b/core/java/android/service/contentcapture/ContentCaptureEventsRequest.java
index 784e71993815..db242a2e265e 100644
--- a/core/java/android/service/contentcapture/ContentCaptureEventsRequest.java
+++ b/core/java/android/service/contentcapture/ContentCaptureEventsRequest.java
@@ -34,7 +34,7 @@ import java.util.List;
@SystemApi
@Deprecated
public final class ContentCaptureEventsRequest implements Parcelable {
-// TODO(b/121033016): remove .java and .aidl once service implementation doesn't use it anymore
+// TODO(b/121051220): remove .java and .aidl once service implementation doesn't use it anymore
private final ContentCaptureEvent mEvent;
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index c9d46dd701b5..302e1a656833 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -42,11 +42,13 @@ import android.view.contentcapture.ContentCaptureSession;
import android.view.contentcapture.ContentCaptureSessionId;
import android.view.contentcapture.IContentCaptureDirectManager;
import android.view.contentcapture.MainContentCaptureSession;
+import android.view.contentcapture.UserDataRemovalRequest;
import com.android.internal.os.IResultReceiver;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -76,6 +78,7 @@ public abstract class ContentCaptureService extends Service {
"android.service.contentcapture.ContentCaptureService";
private Handler mHandler;
+ private IContentCaptureServiceCallback mCallback;
/**
* Binder that receives calls from the system server.
@@ -83,9 +86,15 @@ public abstract class ContentCaptureService extends Service {
private final IContentCaptureService mServerInterface = new IContentCaptureService.Stub() {
@Override
- public void onConnectedStateChanged(boolean state) {
- mHandler.sendMessage(obtainMessage(ContentCaptureService::handleOnConnectedStateChanged,
- ContentCaptureService.this, state));
+ public void onConnected(IBinder callback) {
+ mHandler.sendMessage(obtainMessage(ContentCaptureService::handleOnConnected,
+ ContentCaptureService.this, callback));
+ }
+
+ @Override
+ public void onDisconnected() {
+ mHandler.sendMessage(obtainMessage(ContentCaptureService::handleOnDisconnected,
+ ContentCaptureService.this));
}
@Override
@@ -123,12 +132,12 @@ public abstract class ContentCaptureService extends Service {
};
/**
- * List of sessions per UID.
+ * UIDs associated with each session.
*
* <p>This map is populated when an session is started, which is called by the system server
* and can be trusted. Then subsequent calls made by the app are verified against this map.
*/
- private final ArrayMap<String, Integer> mSessionsByUid = new ArrayMap<>();
+ private final ArrayMap<String, Integer> mSessionUids = new ArrayMap<>();
@CallSuper
@Override
@@ -165,7 +174,16 @@ public abstract class ContentCaptureService extends Service {
*/
public final void setContentCaptureWhitelist(@Nullable List<String> packages,
@Nullable List<ComponentName> activities) {
- //TODO(b/111276913): implement
+ final IContentCaptureServiceCallback callback = mCallback;
+ if (callback == null) {
+ Log.w(TAG, "setContentCaptureWhitelist(): no server callback");
+ return;
+ }
+ try {
+ callback.setContentCaptureWhitelist(packages, activities);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
/**
@@ -176,7 +194,16 @@ public abstract class ContentCaptureService extends Service {
*/
public final void setActivityContentCaptureEnabled(@NonNull ComponentName activity,
boolean enabled) {
- //TODO(b/111276913): implement
+ final IContentCaptureServiceCallback callback = mCallback;
+ if (callback == null) {
+ Log.w(TAG, "setActivityContentCaptureEnabled(): no server callback");
+ return;
+ }
+ try {
+ callback.setActivityContentCaptureEnabled(activity, enabled);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
/**
@@ -187,7 +214,16 @@ public abstract class ContentCaptureService extends Service {
*/
public final void setPackageContentCaptureEnabled(@NonNull String packageName,
boolean enabled) {
- //TODO(b/111276913): implement
+ final IContentCaptureServiceCallback callback = mCallback;
+ if (callback == null) {
+ Log.w(TAG, "setPackageContentCaptureEnabled(): no server callback");
+ return;
+ }
+ try {
+ callback.setPackageContentCaptureEnabled(packageName, enabled);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
/**
@@ -196,7 +232,12 @@ public abstract class ContentCaptureService extends Service {
*/
@NonNull
public final Set<ComponentName> getContentCaptureDisabledActivities() {
- //TODO(b/111276913): implement
+ final IContentCaptureServiceCallback callback = mCallback;
+ if (callback == null) {
+ Log.w(TAG, "getContentCaptureDisabledActivities(): no server callback");
+ return Collections.emptySet();
+ }
+ //TODO(b/122595322): implement (using SyncResultReceiver)
return null;
}
@@ -206,7 +247,12 @@ public abstract class ContentCaptureService extends Service {
*/
@NonNull
public final Set<String> getContentCaptureDisabledPackages() {
- //TODO(b/111276913): implement
+ final IContentCaptureServiceCallback callback = mCallback;
+ if (callback == null) {
+ Log.w(TAG, "getContentCaptureDisabledPackages(): no server callback");
+ return Collections.emptySet();
+ }
+ //TODO(b/122595322): implement (using SyncResultReceiver)
return null;
}
@@ -255,6 +301,16 @@ public abstract class ContentCaptureService extends Service {
if (VERBOSE) Log.v(TAG, "onContentCaptureEventsRequest(id=" + sessionId + ")");
onContentCaptureEventsRequest(sessionId, new ContentCaptureEventsRequest(event));
}
+
+ /**
+ * Notifies the service that the app requested to remove data associated with the user.
+ *
+ * @param request the user data requested to be removed
+ */
+ public void onUserDataRemovalRequest(@NonNull UserDataRemovalRequest request) {
+ if (VERBOSE) Log.v(TAG, "onUserDataRemovalRequest()");
+ }
+
/**
* Notifies the service of {@link SnapshotData snapshot data} associated with a session.
*
@@ -285,23 +341,25 @@ public abstract class ContentCaptureService extends Service {
@Override
@CallSuper
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- final int size = mSessionsByUid.size();
+ final int size = mSessionUids.size();
pw.print("Number sessions: "); pw.println(size);
if (size > 0) {
final String prefix = " ";
for (int i = 0; i < size; i++) {
- pw.print(prefix); pw.print(mSessionsByUid.keyAt(i));
- pw.print(": uid="); pw.println(mSessionsByUid.valueAt(i));
+ pw.print(prefix); pw.print(mSessionUids.keyAt(i));
+ pw.print(": uid="); pw.println(mSessionUids.valueAt(i));
}
}
}
- private void handleOnConnectedStateChanged(boolean state) {
- if (state) {
- onConnected();
- } else {
- onDisconnected();
- }
+ private void handleOnConnected(@NonNull IBinder callback) {
+ mCallback = IContentCaptureServiceCallback.Stub.asInterface(callback);
+ onConnected();
+ }
+
+ private void handleOnDisconnected() {
+ onDisconnected();
+ mCallback = null;
}
//TODO(b/111276913): consider caching the InteractionSessionId for the lifetime of the session,
@@ -309,10 +367,24 @@ public abstract class ContentCaptureService extends Service {
private void handleOnCreateSession(@NonNull ContentCaptureContext context,
@NonNull String sessionId, int uid, IResultReceiver clientReceiver) {
- mSessionsByUid.put(sessionId, uid);
+ mSessionUids.put(sessionId, uid);
onCreateContentCaptureSession(context, new ContentCaptureSessionId(sessionId));
- setClientState(clientReceiver, ContentCaptureSession.STATE_ACTIVE,
- mClientInterface.asBinder());
+
+ final int clientFlags = context.getFlags();
+ int stateFlags = 0;
+ if ((clientFlags & ContentCaptureContext.FLAG_DISABLED_BY_FLAG_SECURE) != 0) {
+ stateFlags |= ContentCaptureSession.STATE_FLAG_SECURE;
+ }
+ if ((clientFlags & ContentCaptureContext.FLAG_DISABLED_BY_APP) != 0) {
+ stateFlags |= ContentCaptureSession.STATE_BY_APP;
+ }
+ if (stateFlags == 0) {
+ stateFlags = ContentCaptureSession.STATE_ACTIVE;
+ } else {
+ stateFlags |= ContentCaptureSession.STATE_DISABLED;
+
+ }
+ setClientState(clientReceiver, stateFlags, mClientInterface.asBinder());
}
private void handleSendEvents(int uid,
@@ -336,11 +408,11 @@ public abstract class ContentCaptureService extends Service {
case ContentCaptureEvent.TYPE_SESSION_STARTED:
final ContentCaptureContext clientContext = event.getClientContext();
clientContext.setParentSessionId(event.getParentSessionId());
- mSessionsByUid.put(sessionIdString, uid);
+ mSessionUids.put(sessionIdString, uid);
onCreateContentCaptureSession(clientContext, sessionId);
break;
case ContentCaptureEvent.TYPE_SESSION_FINISHED:
- mSessionsByUid.remove(sessionIdString);
+ mSessionUids.remove(sessionIdString);
onDestroyContentCaptureSession(sessionId);
break;
default:
@@ -355,7 +427,7 @@ public abstract class ContentCaptureService extends Service {
}
private void handleFinishSession(@NonNull String sessionId) {
- mSessionsByUid.remove(sessionId);
+ mSessionUids.remove(sessionId);
onDestroyContentCaptureSession(new ContentCaptureSessionId(sessionId));
}
@@ -372,10 +444,13 @@ public abstract class ContentCaptureService extends Service {
default:
sessionId = event.getSessionId();
}
- final Integer rightUid = mSessionsByUid.get(sessionId);
+ final Integer rightUid = mSessionUids.get(sessionId);
if (rightUid == null) {
- if (VERBOSE) Log.v(TAG, "No session for " + sessionId);
- // Just ignore, as the session could have finished
+ if (DEBUG) {
+ Log.d(TAG, "handleIsRightCallerFor(" + event + "): no session for " + sessionId
+ + ": " + mSessionUids);
+ }
+ // Just ignore, as the session could have been finished already
return false;
}
if (rightUid != uid) {
@@ -389,15 +464,16 @@ public abstract class ContentCaptureService extends Service {
}
/**
- * Sends the state of the {@link ContentCaptureManager} in the cleint app.
+ * Sends the state of the {@link ContentCaptureManager} in the client app.
*
* @param clientReceiver receiver in the client app.
+ * @param sessionState state of the session
* @param binder handle to the {@code IContentCaptureDirectManager} object that resides in the
* service.
* @hide
*/
public static void setClientState(@NonNull IResultReceiver clientReceiver,
- int sessionStatus, @Nullable IBinder binder) {
+ int sessionState, @Nullable IBinder binder) {
try {
final Bundle extras;
if (binder != null) {
@@ -406,7 +482,7 @@ public abstract class ContentCaptureService extends Service {
} else {
extras = null;
}
- clientReceiver.send(sessionStatus, extras);
+ clientReceiver.send(sessionState, extras);
} catch (RemoteException e) {
Slog.w(TAG, "Error async reporting result to client: " + e);
}
diff --git a/core/java/android/service/contentcapture/IContentCaptureService.aidl b/core/java/android/service/contentcapture/IContentCaptureService.aidl
index 1b4cccf630a0..a8dd21392337 100644
--- a/core/java/android/service/contentcapture/IContentCaptureService.aidl
+++ b/core/java/android/service/contentcapture/IContentCaptureService.aidl
@@ -16,6 +16,7 @@
package android.service.contentcapture;
+import android.os.IBinder;
import android.service.contentcapture.SnapshotData;
import android.view.contentcapture.ContentCaptureContext;
@@ -29,7 +30,8 @@ import java.util.List;
* @hide
*/
oneway interface IContentCaptureService {
- void onConnectedStateChanged(boolean state);
+ void onConnected(IBinder callback);
+ void onDisconnected();
void onSessionStarted(in ContentCaptureContext context, String sessionId, int uid,
in IResultReceiver clientReceiver);
void onSessionFinished(String sessionId);
diff --git a/core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl b/core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl
new file mode 100644
index 000000000000..e84bd6fdf2b6
--- /dev/null
+++ b/core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.contentcapture;
+
+import android.content.ComponentName;
+import com.android.internal.os.IResultReceiver;
+
+import java.util.List;
+
+/**
+ * Interface from the Content Capture service to the system.
+ *
+ * @hide
+ */
+oneway interface IContentCaptureServiceCallback {
+ void setContentCaptureWhitelist(in List<String> packages, in List<ComponentName> activities);
+ void setActivityContentCaptureEnabled(in ComponentName activity, boolean enabled);
+ void setPackageContentCaptureEnabled(in String packageName, boolean enabled);
+ void getContentCaptureDisabledActivities(in IResultReceiver receiver);
+ void getContentCaptureDisabledPackages(in IResultReceiver receiver);
+}
diff --git a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
new file mode 100644
index 000000000000..0da80397ec75
--- /dev/null
+++ b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.contentsuggestions;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
+import android.annotation.CallSuper;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.ContentSuggestionsManager;
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Slog;
+
+/**
+ * @hide
+ */
+@SystemApi
+public abstract class ContentSuggestionsService extends Service {
+
+ private static final String TAG = ContentSuggestionsService.class.getSimpleName();
+
+ private Handler mHandler;
+
+ /**
+ * The action for the intent used to define the content suggestions service.
+ */
+ public static final String SERVICE_INTERFACE =
+ "android.service.contentsuggestions.ContentSuggestionsService";
+
+ private final IContentSuggestionsService mInterface = new IContentSuggestionsService.Stub() {
+ @Override
+ public void provideContextImage(int taskId, GraphicBuffer contextImage,
+ Bundle imageContextRequestExtras) {
+ mHandler.sendMessage(
+ obtainMessage(ContentSuggestionsService::processContextImage,
+ ContentSuggestionsService.this, taskId,
+ Bitmap.createHardwareBitmap(contextImage),
+ imageContextRequestExtras));
+ }
+
+ @Override
+ public void suggestContentSelections(SelectionsRequest request,
+ ISelectionsCallback callback) {
+ mHandler.sendMessage(obtainMessage(ContentSuggestionsService::suggestContentSelections,
+ ContentSuggestionsService.this, request, wrapSelectionsCallback(callback)));
+
+ }
+
+ @Override
+ public void classifyContentSelections(ClassificationsRequest request,
+ IClassificationsCallback callback) {
+ mHandler.sendMessage(obtainMessage(ContentSuggestionsService::classifyContentSelections,
+ ContentSuggestionsService.this, request, wrapClassificationCallback(callback)));
+ }
+
+ @Override
+ public void notifyInteraction(String requestId, Bundle interaction) {
+ mHandler.sendMessage(
+ obtainMessage(ContentSuggestionsService::notifyInteraction,
+ ContentSuggestionsService.this, requestId, interaction));
+ }
+ };
+
+ @CallSuper
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mHandler = new Handler(Looper.getMainLooper(), null, true);
+ }
+
+ /** @hide */
+ @Override
+ public final IBinder onBind(Intent intent) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mInterface.asBinder();
+ }
+ Log.w(TAG, "Tried to bind to wrong intent (should be " + SERVICE_INTERFACE + ": " + intent);
+ return null;
+ }
+
+ /**
+ * Called by the system to provide the snapshot for the task associated with the given
+ * {@param taskId}.
+ */
+ public abstract void processContextImage(
+ int taskId, @Nullable Bitmap contextImage, @NonNull Bundle extras);
+
+ /**
+ * Called by a client app to make a request for content selections.
+ */
+ public abstract void suggestContentSelections(@NonNull SelectionsRequest request,
+ @NonNull ContentSuggestionsManager.SelectionsCallback callback);
+
+ /**
+ * Called by a client app to classify the provided content selections.
+ */
+ public abstract void classifyContentSelections(@NonNull ClassificationsRequest request,
+ @NonNull ContentSuggestionsManager.ClassificationsCallback callback);
+
+ /**
+ * Called by a client app to report an interaction.
+ */
+ public abstract void notifyInteraction(@NonNull String requestId, @NonNull Bundle interaction);
+
+ private ContentSuggestionsManager.SelectionsCallback wrapSelectionsCallback(
+ ISelectionsCallback callback) {
+ return (statusCode, selections) -> {
+ try {
+ callback.onContentSelectionsAvailable(statusCode, selections);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error sending result: " + e);
+ }
+ };
+ }
+
+ private ContentSuggestionsManager.ClassificationsCallback wrapClassificationCallback(
+ IClassificationsCallback callback) {
+ return ((statusCode, classifications) -> {
+ try {
+ callback.onContentClassificationsAvailable(statusCode, classifications);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error sending result: " + e);
+ }
+ });
+ }
+}
diff --git a/core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl b/core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl
new file mode 100644
index 000000000000..1926478322c8
--- /dev/null
+++ b/core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.contentsuggestions;
+
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.graphics.GraphicBuffer;
+import android.os.Bundle;
+
+/**
+ * Interface from the system to an implementation of a content suggestions service.
+ *
+ * @hide
+ */
+oneway interface IContentSuggestionsService {
+ void provideContextImage(
+ int taskId,
+ in GraphicBuffer contextImage,
+ in Bundle imageContextRequestExtras);
+ void suggestContentSelections(
+ in SelectionsRequest request,
+ in ISelectionsCallback callback);
+ void classifyContentSelections(
+ in ClassificationsRequest request,
+ in IClassificationsCallback callback);
+ void notifyInteraction(in String requestId, in Bundle interaction);
+}
diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl
index be3f3b345824..b84e6c9bc962 100644
--- a/core/java/android/service/dreams/IDreamManager.aidl
+++ b/core/java/android/service/dreams/IDreamManager.aidl
@@ -33,4 +33,5 @@ interface IDreamManager {
void finishSelf(in IBinder token, boolean immediate);
void startDozing(in IBinder token, int screenState, int screenBrightness);
void stopDozing(in IBinder token);
+ void forceAmbientDisplayEnabled(boolean enabled);
}
diff --git a/core/java/android/service/euicc/EuiccService.java b/core/java/android/service/euicc/EuiccService.java
index 4be1f9cd6ae5..4dc10cd2e4cc 100644
--- a/core/java/android/service/euicc/EuiccService.java
+++ b/core/java/android/service/euicc/EuiccService.java
@@ -184,6 +184,12 @@ public abstract class EuiccService extends Service {
public static final String EXTRA_RESOLUTION_CONFIRMATION_CODE_RETRIED =
"android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE_RETRIED";
+ /**
+ * Intent extra set for resolution requests containing an int indicating the current card Id.
+ */
+ public static final String EXTRA_RESOLUTION_CARD_ID =
+ "android.service.euicc.extra.RESOLUTION_CARD_ID";
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = { "RESULT_" }, value = {
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index dd0242ae2dc8..ad34ab3bddb1 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -173,7 +173,8 @@ public abstract class NotificationAssistantService extends NotificationListenerS
}
/**
- * Implement this to know when a notification is expanded / collapsed.
+ * Implement this to know when a notification change (expanded / collapsed) is visible to user.
+ *
* @param key the notification key
* @param isUserAction whether the expanded change is caused by user action.
* @param isExpanded whether the notification is expanded.
@@ -185,7 +186,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* Implement this to know when a direct reply is sent from a notification.
* @param key the notification key
*/
- public void onNotificationDirectReply(@NonNull String key) {}
+ public void onNotificationDirectReplied(@NonNull String key) {}
/**
* Implement this to know when a suggested reply is sent.
@@ -203,7 +204,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* @param action the action that is just clicked
* @param source the source that provided the action, e.g. SOURCE_FROM_APP
*/
- public void onActionClicked(@NonNull String key, @NonNull Notification.Action action,
+ public void onActionInvoked(@NonNull String key, @NonNull Notification.Action action,
@Source int source) {
}
@@ -338,7 +339,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
args.arg1 = key;
args.arg2 = action;
args.argi2 = source;
- mHandler.obtainMessage(MyHandler.MSG_ON_ACTION_CLICKED, args).sendToTarget();
+ mHandler.obtainMessage(MyHandler.MSG_ON_ACTION_INVOKED, args).sendToTarget();
}
}
@@ -349,7 +350,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
public static final int MSG_ON_NOTIFICATION_EXPANSION_CHANGED = 4;
public static final int MSG_ON_NOTIFICATION_DIRECT_REPLY_SENT = 5;
public static final int MSG_ON_SUGGESTED_REPLY_SENT = 6;
- public static final int MSG_ON_ACTION_CLICKED = 7;
+ public static final int MSG_ON_ACTION_INVOKED = 7;
public MyHandler(Looper looper) {
super(looper, null, false);
@@ -407,7 +408,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
SomeArgs args = (SomeArgs) msg.obj;
String key = (String) args.arg1;
args.recycle();
- onNotificationDirectReply(key);
+ onNotificationDirectReplied(key);
break;
}
case MSG_ON_SUGGESTED_REPLY_SENT: {
@@ -419,13 +420,13 @@ public abstract class NotificationAssistantService extends NotificationListenerS
onSuggestedReplySent(key, reply, source);
break;
}
- case MSG_ON_ACTION_CLICKED: {
+ case MSG_ON_ACTION_INVOKED: {
SomeArgs args = (SomeArgs) msg.obj;
String key = (String) args.arg1;
Notification.Action action = (Notification.Action) args.arg2;
int source = args.argi2;
args.recycle();
- onActionClicked(key, action, source);
+ onActionInvoked(key, action, source);
break;
}
}
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index ad10cc91f34c..3a644d4cd12a 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -22,16 +22,21 @@ import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.metrics.LogMaker;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
/**
* Class encapsulating a Notification. Sent by the NotificationManagerService to clients including
* the status bar and any {@link android.service.notification.NotificationListenerService}s.
*/
public class StatusBarNotification implements Parcelable {
+ static final int MAX_LOG_TAG_LENGTH = 36;
+
@UnsupportedAppUsage
private final String pkg;
@UnsupportedAppUsage
@@ -56,6 +61,9 @@ public class StatusBarNotification implements Parcelable {
private Context mContext; // used for inflation & icon expansion
+ // Contains the basic logging data of the notification.
+ private LogMaker mLogMaker;
+
/** @hide */
public StatusBarNotification(String pkg, String opPkg, int id,
String tag, int uid, int initialPid, Notification notification, UserHandle user,
@@ -381,4 +389,51 @@ public class StatusBarNotification implements Parcelable {
}
return mContext;
}
+
+ /**
+ * Returns a LogMaker that contains all basic information of the notification.
+ * @hide
+ */
+ public LogMaker getLogMaker() {
+ if (mLogMaker == null) {
+ // Initialize fields that only change on update (so a new record).
+ mLogMaker = new LogMaker(MetricsEvent.VIEW_UNKNOWN)
+ .setPackageName(getPackageName())
+ .addTaggedData(MetricsEvent.NOTIFICATION_ID, getId())
+ .addTaggedData(MetricsEvent.NOTIFICATION_TAG, getTag())
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID, getChannelIdLogTag());
+ }
+ // Reset fields that can change between updates, or are used by multiple logs.
+ return mLogMaker
+ .clearCategory()
+ .clearType()
+ .clearSubtype()
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID, getGroupLogTag())
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY,
+ getNotification().isGroupSummary() ? 1 : 0);
+ }
+
+ private String getGroupLogTag() {
+ return shortenTag(getGroup());
+ }
+
+ private String getChannelIdLogTag() {
+ if (notification.getChannelId() == null) {
+ return null;
+ }
+ return shortenTag(notification.getChannelId());
+ }
+
+ // Make logTag with max size MAX_LOG_TAG_LENGTH.
+ // For shorter or equal tags, returns the tag.
+ // For longer tags, truncate the tag and append a hash of the full tag to
+ // fill the maximum size.
+ private String shortenTag(String logTag) {
+ if (logTag == null || logTag.length() <= MAX_LOG_TAG_LENGTH) {
+ return logTag;
+ }
+ String hash = Integer.toHexString(logTag.hashCode());
+ return logTag.substring(0, MAX_LOG_TAG_LENGTH - hash.length() - 1) + "-"
+ + hash;
+ }
}
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index 163e3d5fab56..6f274477431f 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -121,6 +121,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
*/
public static final int SHOW_SOURCE_NOTIFICATION = 1 << 6;
+ /**
+ * Flag for use with {@link #onShow}: indicates that the voice interaction service was invoked
+ * from an Android automotive system Ui.
+ */
+ public static final int SHOW_SOURCE_AUTOMOTIVE_SYSTEM_UI = 1 << 7;
+
final Context mContext;
final HandlerCaller mHandlerCaller;
diff --git a/core/java/android/service/wallpaper/IWallpaperConnection.aidl b/core/java/android/service/wallpaper/IWallpaperConnection.aidl
index a976d0e40423..f334d9d3e874 100644
--- a/core/java/android/service/wallpaper/IWallpaperConnection.aidl
+++ b/core/java/android/service/wallpaper/IWallpaperConnection.aidl
@@ -27,5 +27,5 @@ interface IWallpaperConnection {
void attachEngine(IWallpaperEngine engine, int displayId);
void engineShown(IWallpaperEngine engine);
ParcelFileDescriptor setWallpaper(String name);
- void onWallpaperColorsChanged(in WallpaperColors colors);
+ void onWallpaperColorsChanged(in WallpaperColors colors, int displayId);
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index a3cdca16e1ca..5625051a0d31 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -56,6 +56,7 @@ import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InsetsState;
import android.view.MotionEvent;
+import android.view.SurfaceControl;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.ViewGroup;
@@ -217,6 +218,8 @@ public abstract class WallpaperService extends Service {
private Context mDisplayContext;
private int mDisplayState;
+ SurfaceControl mSurfaceControl = new SurfaceControl();
+
final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
{
mRequestedFormat = PixelFormat.RGBX_8888;
@@ -642,7 +645,7 @@ public abstract class WallpaperService extends Service {
try {
final WallpaperColors newColors = onComputeColors();
if (mConnection != null) {
- mConnection.onWallpaperColorsChanged(newColors);
+ mConnection.onWallpaperColorsChanged(newColors, mDisplay.getDisplayId());
} else {
Log.w(TAG, "Can't notify system because wallpaper connection "
+ "was not established.");
@@ -843,8 +846,12 @@ public abstract class WallpaperService extends Service {
mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
View.VISIBLE, 0, -1, mWinFrame, mOverscanInsets, mContentInsets,
mVisibleInsets, mStableInsets, mOutsets, mBackdropFrame,
- mDisplayCutout, mMergedConfiguration, mSurfaceHolder.mSurface,
+ mDisplayCutout, mMergedConfiguration, mSurfaceControl,
mInsetsState);
+ if (mSurfaceControl.isValid()) {
+ mSurfaceHolder.mSurface.copyFrom(mSurfaceControl);
+ mSurfaceControl.release();
+ }
if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
+ ", frame=" + mWinFrame);
@@ -963,7 +970,7 @@ public abstract class WallpaperService extends Service {
mFinalSystemInsets.set(mDispatchedOverscanInsets);
mFinalStableInsets.set(mDispatchedStableInsets);
WindowInsets insets = new WindowInsets(mFinalSystemInsets,
- null, mFinalStableInsets,
+ mFinalStableInsets,
getResources().getConfiguration().isScreenRound(), false,
mDispatchedDisplayCutout);
if (DEBUG) {
@@ -1466,7 +1473,7 @@ public abstract class WallpaperService extends Service {
break;
}
try {
- mConnection.onWallpaperColorsChanged(mEngine.onComputeColors());
+ mConnection.onWallpaperColorsChanged(mEngine.onComputeColors(), mDisplayId);
} catch (RemoteException e) {
// Connection went away, nothing to do in here.
}
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 3d0c6622d8af..24d746e0dfe2 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -376,9 +376,13 @@ public class StaticLayout extends Layout {
* Set paragraph justification mode. The default value is
* {@link Layout#JUSTIFICATION_MODE_NONE}. If the last line is too short for justification,
* the last line will be displayed with the alignment set by {@link #setAlignment}.
+ * When Justification mode is JUSTIFICATION_MODE_INTER_WORD, wordSpacing on the given
+ * {@link Paint} will be ignored. This behavior also affects Spans which change the
+ * wordSpacing.
*
* @param justificationMode justification mode for the paragraph.
* @return this builder, useful for chaining.
+ * @see Paint#setWordSpacing(float)
*/
@NonNull
public Builder setJustificationMode(@JustificationMode int justificationMode) {
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 6eb433abf16c..949328fd3a99 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -75,8 +75,9 @@ public class TextLine {
private int mEllipsisEnd;
// Additional width of whitespace for justification. This value is per whitespace, thus
- // the line width will increase by mAddedWidth x (number of stretchable whitespaces).
- private float mAddedWidth;
+ // the line width will increase by mAddedWidthForJustify x (number of stretchable whitespaces).
+ private float mAddedWidthForJustify;
+ private boolean mIsJustifying;
private final TextPaint mWorkPaint = new TextPaint();
private final TextPaint mActivePaint = new TextPaint();
@@ -229,7 +230,8 @@ public class TextLine {
}
}
mTabs = tabStops;
- mAddedWidth = 0;
+ mAddedWidthForJustify = 0;
+ mIsJustifying = false;
mEllipsisStart = ellipsisStart != ellipsisEnd ? ellipsisStart : 0;
mEllipsisEnd = ellipsisStart != ellipsisEnd ? ellipsisEnd : 0;
@@ -255,7 +257,8 @@ public class TextLine {
return;
}
final float width = Math.abs(measure(end, false, null));
- mAddedWidth = (justifyWidth - width) / spaces;
+ mAddedWidthForJustify = (justifyWidth - width) / spaces;
+ mIsJustifying = true;
}
/**
@@ -713,7 +716,9 @@ public class TextLine {
TextPaint wp = mWorkPaint;
wp.set(mPaint);
- wp.setWordSpacing(mAddedWidth);
+ if (mIsJustifying) {
+ wp.setWordSpacing(mAddedWidthForJustify);
+ }
int spanStart = runStart;
int spanLimit;
@@ -849,7 +854,9 @@ public class TextLine {
FontMetricsInt fmi, boolean needWidth, int offset,
@Nullable ArrayList<DecorationInfo> decorations) {
- wp.setWordSpacing(mAddedWidth);
+ if (mIsJustifying) {
+ wp.setWordSpacing(mAddedWidthForJustify);
+ }
// Get metrics first (even for empty strings or "0" width runs)
if (fmi != null) {
expandMetricsFromPaint(fmi, wp);
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 85b6b889be33..44353b1609b7 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -33,8 +33,7 @@ import android.icu.text.Edits;
import android.icu.util.ULocale;
import android.os.Parcel;
import android.os.Parcelable;
-import android.os.SystemProperties;
-import android.provider.Settings;
+import android.sysprop.DisplayProperties;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AccessibilityClickableSpan;
import android.text.style.AccessibilityURLSpan;
@@ -2059,7 +2058,7 @@ public class TextUtils {
return ((locale != null && !locale.equals(Locale.ROOT)
&& ULocale.forLocale(locale).isRightToLeft())
// If forcing into RTL layout mode, return RTL as default
- || SystemProperties.getBoolean(Settings.Global.DEVELOPMENT_FORCE_RTL, false))
+ || DisplayProperties.debug_force_rtl().orElse(false))
? View.LAYOUT_DIRECTION_RTL
: View.LAYOUT_DIRECTION_LTR;
}
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index 433483f717fa..dd073e9142b1 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -16,11 +16,11 @@
package android.text.style;
+import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
-import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Parcel;
@@ -30,7 +30,6 @@ import android.text.ParcelableSpan;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.Log;
-import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import java.util.Arrays;
@@ -71,9 +70,37 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
*/
public static final int FLAG_AUTO_CORRECTION = 0x0004;
+ /**
+ * This action is deprecated in {@link android.os.Build.VERSION_CODES#Q}.
+ *
+ * @deprecated For IMEs to receive this kind of user interaction signals, implement IMEs' own
+ * suggestion picker UI instead of relying on {@link SuggestionSpan}. To retrieve
+ * bounding boxes for each character of the composing text, use
+ * {@link android.view.inputmethod.CursorAnchorInfo}.
+ */
+ @Deprecated
public static final String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
+
+ /**
+ * This is deprecated in {@link android.os.Build.VERSION_CODES#Q}.
+ *
+ * @deprecated See {@link #ACTION_SUGGESTION_PICKED}.
+ */
+ @Deprecated
public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
+ /**
+ * This is deprecated in {@link android.os.Build.VERSION_CODES#Q}.
+ *
+ * @deprecated See {@link #ACTION_SUGGESTION_PICKED}.
+ */
+ @Deprecated
public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+ /**
+ * This is deprecated in {@link android.os.Build.VERSION_CODES#Q}.
+ *
+ * @deprecated See {@link #ACTION_SUGGESTION_PICKED}.
+ */
+ @Deprecated
public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
public static final int SUGGESTIONS_MAX_SIZE = 5;
@@ -96,8 +123,6 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
private final String mLocaleStringForCompatibility;
@NonNull
private final String mLanguageTag;
- private final String mNotificationTargetClassName;
- private final String mNotificationTargetPackageName;
private final int mHashCode;
@UnsupportedAppUsage
@@ -136,7 +161,9 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
* {@link SuggestionSpan#SUGGESTIONS_MAX_SIZE} will be considered. Null values not permitted.
* @param flags Additional flags indicating how this span is handled in TextView
* @param notificationTargetClass if not null, this class will get notified when the user
- * selects one of the suggestions.
+ * selects one of the suggestions. On Android
+ * {@link android.os.Build.VERSION_CODES#Q} and later this
+ * parameter is always ignored.
*/
public SuggestionSpan(Context context, Locale locale, String[] suggestions, int flags,
Class<?> notificationTargetClass) {
@@ -155,20 +182,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
}
mLocaleStringForCompatibility = sourceLocale == null ? "" : sourceLocale.toString();
mLanguageTag = sourceLocale == null ? "" : sourceLocale.toLanguageTag();
-
- if (context != null) {
- mNotificationTargetPackageName = context.getPackageName();
- } else {
- mNotificationTargetPackageName = null;
- }
-
- if (notificationTargetClass != null) {
- mNotificationTargetClassName = notificationTargetClass.getCanonicalName();
- } else {
- mNotificationTargetClassName = "";
- }
- mHashCode = hashCodeInternal(mSuggestions, mLanguageTag, mLocaleStringForCompatibility,
- mNotificationTargetClassName);
+ mHashCode = hashCodeInternal(mSuggestions, mLanguageTag, mLocaleStringForCompatibility);
initStyle(context);
}
@@ -214,8 +228,6 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
mFlags = src.readInt();
mLocaleStringForCompatibility = src.readString();
mLanguageTag = src.readString();
- mNotificationTargetClassName = src.readString();
- mNotificationTargetPackageName = src.readString();
mHashCode = src.readInt();
mEasyCorrectUnderlineColor = src.readInt();
mEasyCorrectUnderlineThickness = src.readFloat();
@@ -259,17 +271,15 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
}
/**
- * @return The name of the class to notify. The class of the original IME package will receive
- * a notification when the user selects one of the suggestions. The notification will include
- * the original string, the suggested replacement string as well as the hashCode of this span.
- * The class will get notified by an intent that has those information.
- * This is an internal API because only the framework should know the class name.
+ * @return {@code null}.
*
* @hide
+ * @deprecated Do not use. Always returns {@code null}.
*/
+ @Deprecated
@UnsupportedAppUsage
public String getNotificationTargetClassName() {
- return mNotificationTargetClassName;
+ return null;
}
public int getFlags() {
@@ -296,8 +306,6 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
dest.writeInt(mFlags);
dest.writeString(mLocaleStringForCompatibility);
dest.writeString(mLanguageTag);
- dest.writeString(mNotificationTargetClassName);
- dest.writeString(mNotificationTargetPackageName);
dest.writeInt(mHashCode);
dest.writeInt(mEasyCorrectUnderlineColor);
dest.writeFloat(mEasyCorrectUnderlineThickness);
@@ -331,9 +339,9 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
}
private static int hashCodeInternal(String[] suggestions, @NonNull String languageTag,
- @NonNull String localeStringForCompatibility, String notificationTargetClassName) {
+ @NonNull String localeStringForCompatibility) {
return Arrays.hashCode(new Object[] {Long.valueOf(SystemClock.uptimeMillis()), suggestions,
- languageTag, localeStringForCompatibility, notificationTargetClassName});
+ languageTag, localeStringForCompatibility});
}
public static final Parcelable.Creator<SuggestionSpan> CREATOR =
@@ -370,6 +378,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
/**
* @return The color of the underline for that span, or 0 if there is no underline
*/
+ @ColorInt
public int getUnderlineColor() {
// The order here should match what is used in updateDrawState
final boolean misspelled = (mFlags & FLAG_MISSPELLED) != 0;
@@ -388,39 +397,14 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
}
/**
- * Notifies a suggestion selection.
+ * Does nothing.
*
+ * @deprecated this is deprecated in {@link android.os.Build.VERSION_CODES#Q}.
* @hide
*/
@UnsupportedAppUsage
+ @Deprecated
public void notifySelection(Context context, String original, int index) {
- final Intent intent = new Intent();
-
- if (context == null || mNotificationTargetClassName == null) {
- return;
- }
- // Ensures that only a class in the original IME package will receive the
- // notification.
- if (mSuggestions == null || index < 0 || index >= mSuggestions.length) {
- Log.w(TAG, "Unable to notify the suggestion as the index is out of range index=" + index
- + " length=" + mSuggestions.length);
- return;
- }
-
- // The package name is not mandatory (legacy from JB), and if the package name
- // is missing, we try to notify the suggestion through the input method manager.
- if (mNotificationTargetPackageName != null) {
- intent.setClassName(mNotificationTargetPackageName, mNotificationTargetClassName);
- intent.setAction(SuggestionSpan.ACTION_SUGGESTION_PICKED);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_BEFORE, original);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_AFTER, mSuggestions[index]);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_HASHCODE, hashCode());
- context.sendBroadcast(intent);
- } else {
- InputMethodManager imm = context.getSystemService(InputMethodManager.class);
- if (imm != null) {
- imm.notifySuggestionPicked(this, original, index);
- }
- }
+ Log.w(TAG, "notifySelection() is deprecated. Does nothing.");
}
}
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index eef7ea232d43..50e7ec30ec3a 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -37,7 +37,6 @@ import android.widget.TextView;
import com.android.i18n.phonenumbers.PhoneNumberMatch;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
-import com.android.internal.annotations.GuardedBy;
import libcore.util.EmptyArray;
@@ -49,6 +48,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;
+import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -69,7 +69,6 @@ import java.util.regex.Pattern;
*
* @see MatchFilter
* @see TransformFilter
- * @see UrlSpanFactory
*/
public class Linkify {
@@ -228,44 +227,6 @@ public class Linkify {
}
/**
- * Factory class to create {@link URLSpan}s. While adding spans to a {@link Spannable},
- * {@link Linkify} will call {@link UrlSpanFactory#create(String)} function to create a
- * {@link URLSpan}.
- *
- * @see #addLinks(Spannable, int, UrlSpanFactory)
- * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
- * UrlSpanFactory)
- */
- public static class UrlSpanFactory {
- private static final Object sInstanceLock = new Object();
-
- @GuardedBy("sInstanceLock")
- private static volatile UrlSpanFactory sInstance = null;
-
- private static synchronized UrlSpanFactory getInstance() {
- if (sInstance == null) {
- synchronized (sInstanceLock) {
- if (sInstance == null) {
- sInstance = new UrlSpanFactory();
- }
- }
- }
- return sInstance;
- }
-
- /**
- * Factory function that will called by {@link Linkify} in order to create a
- * {@link URLSpan}.
- *
- * @param url URL found
- * @return a URLSpan instance
- */
- public URLSpan create(final String url) {
- return new URLSpan(url);
- }
- }
-
- /**
* Scans the text of the provided Spannable and turns all occurrences
* of the link types indicated in the mask into clickable links.
* If the mask is nonzero, it also removes any existing URLSpans
@@ -277,7 +238,7 @@ public class Linkify {
*
* @return True if at least one link is found and applied.
*
- * @see #addLinks(Spannable, int, UrlSpanFactory)
+ * @see #addLinks(Spannable, int, Function)
*/
public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
return addLinks(text, mask, null, null);
@@ -292,11 +253,11 @@ public class Linkify {
*
* @param text Spannable whose text is to be marked-up with links
* @param mask mask to define which kinds of links will be searched
- * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ * @param urlSpanFactory function used to create {@link URLSpan}s
* @return True if at least one link is found and applied.
*/
public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask,
- @Nullable UrlSpanFactory urlSpanFactory) {
+ @Nullable Function<String, URLSpan> urlSpanFactory) {
return addLinks(text, mask, null, urlSpanFactory);
}
@@ -309,11 +270,11 @@ public class Linkify {
* @param text Spannable whose text is to be marked-up with links
* @param mask mask to define which kinds of links will be searched
* @param context Context to be used while identifying phone numbers
- * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ * @param urlSpanFactory function used to create {@link URLSpan}s
* @return true if at least one link is found and applied.
*/
private static boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask,
- @Nullable Context context, @Nullable UrlSpanFactory urlSpanFactory) {
+ @Nullable Context context, @Nullable Function<String, URLSpan> urlSpanFactory) {
if (text != null && containsUnsupportedCharacters(text.toString())) {
android.util.EventLog.writeEvent(0x534e4554, "116321860", -1, "");
return false;
@@ -398,7 +359,7 @@ public class Linkify {
*
* @return True if at least one link is found and applied.
*
- * @see #addLinks(Spannable, int, UrlSpanFactory)
+ * @see #addLinks(Spannable, int, Function)
*/
public static final boolean addLinks(@NonNull TextView text, @LinkifyMask int mask) {
if (mask == 0) {
@@ -512,8 +473,7 @@ public class Linkify {
* @param pattern Regex pattern to be used for finding links
* @param scheme URL scheme string (eg <code>http://</code>) to be
* prepended to the links that do not start with this scheme.
- * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
- * UrlSpanFactory)
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter, Function)
*/
public static final boolean addLinks(@NonNull Spannable text, @NonNull Pattern pattern,
@Nullable String scheme) {
@@ -534,8 +494,7 @@ public class Linkify {
* @param transformFilter Filter to allow the client code to update the link found.
*
* @return True if at least one link is found and applied.
- * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
- * UrlSpanFactory)
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter, Function)
*/
public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String scheme, @Nullable MatchFilter matchFilter,
@@ -560,8 +519,7 @@ public class Linkify {
*
* @return True if at least one link is found and applied.
*
- * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
- * UrlSpanFactory)
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter, Function)
*/
public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String defaultScheme, @Nullable String[] schemes,
@@ -584,14 +542,14 @@ public class Linkify {
* @param matchFilter the filter that is used to allow the client code additional control
* over which pattern matches are to be converted into links.
* @param transformFilter filter to allow the client code to update the link found.
- * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ * @param urlSpanFactory function used to create {@link URLSpan}s
*
* @return True if at least one link is found and applied.
*/
public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String defaultScheme, @Nullable String[] schemes,
@Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter,
- @Nullable UrlSpanFactory urlSpanFactory) {
+ @Nullable Function<String, URLSpan> urlSpanFactory) {
if (spannable != null && containsUnsupportedCharacters(spannable.toString())) {
android.util.EventLog.writeEvent(0x534e4554, "116321860", -1, "");
return false;
@@ -634,11 +592,11 @@ public class Linkify {
}
private static void applyLink(String url, int start, int end, Spannable text,
- @Nullable UrlSpanFactory urlSpanFactory) {
+ @Nullable Function<String, URLSpan> urlSpanFactory) {
if (urlSpanFactory == null) {
- urlSpanFactory = UrlSpanFactory.getInstance();
+ urlSpanFactory = DEFAULT_SPAN_FACTORY;
}
- final URLSpan span = urlSpanFactory.create(url);
+ final URLSpan span = urlSpanFactory.apply(url);
text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
@@ -805,6 +763,13 @@ public class Linkify {
i++;
}
}
+
+ /**
+ * Default factory function to create {@link URLSpan}s. While adding spans to a
+ * {@link Spannable}, {@link Linkify} will call this function to create a {@link URLSpan}.
+ */
+ private static final Function<String, URLSpan> DEFAULT_SPAN_FACTORY =
+ (String string) -> new URLSpan(string);
}
class LinkSpec {
diff --git a/core/java/android/util/DebugUtils.java b/core/java/android/util/DebugUtils.java
index af73a16e012a..265b0d303f7f 100644
--- a/core/java/android/util/DebugUtils.java
+++ b/core/java/android/util/DebugUtils.java
@@ -18,6 +18,7 @@ package android.util;
import android.annotation.UnsupportedAppUsage;
import android.os.Build;
+
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -250,7 +251,7 @@ public class DebugUtils {
if (value == 0 && flagsWasZero) {
return constNameWithoutPrefix(prefix, field);
}
- if ((flags & value) != 0) {
+ if ((flags & value) == value) {
flags &= ~value;
res.append(constNameWithoutPrefix(prefix, field)).append('|');
}
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 8b97e0e4a107..0edcb3d8eb6a 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -22,7 +22,9 @@ import android.provider.Settings;
import android.text.TextUtils;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
/**
* Util class to get feature flag information.
@@ -37,8 +39,11 @@ public class FeatureFlagUtils {
public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
public static final String SAFETY_HUB = "settings_safety_hub";
public static final String SCREENRECORD_LONG_PRESS = "settings_screenrecord_long_press";
+ public static final String AOD_IMAGEWALLPAPER_ENABLED = "settings_aod_imagewallpaper_enabled";
private static final Map<String, String> DEFAULT_FLAGS;
+ private static final Set<String> OBSERVABLE_FLAGS;
+
static {
DEFAULT_FLAGS = new HashMap<>();
DEFAULT_FLAGS.put("settings_audio_switcher", "true");
@@ -54,6 +59,10 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
DEFAULT_FLAGS.put(SAFETY_HUB, "false");
DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false");
+ DEFAULT_FLAGS.put(AOD_IMAGEWALLPAPER_ENABLED, "false");
+
+ OBSERVABLE_FLAGS = new HashSet<>();
+ OBSERVABLE_FLAGS.add(AOD_IMAGEWALLPAPER_ENABLED);
}
/**
@@ -90,6 +99,16 @@ public class FeatureFlagUtils {
*/
public static void setEnabled(Context context, String feature, boolean enabled) {
SystemProperties.set(FFLAG_OVERRIDE_PREFIX + feature, enabled ? "true" : "false");
+
+ // Also update Settings.Global if needed so that we can observe it via observer.
+ if (OBSERVABLE_FLAGS.contains(feature)) {
+ setObservableFlag(context, feature, enabled);
+ }
+ }
+
+ private static void setObservableFlag(Context context, String feature, boolean enabled) {
+ Settings.Global.putString(
+ context.getContentResolver(), feature, enabled ? "true" : "false");
}
/**
diff --git a/core/java/android/util/Half.java b/core/java/android/util/Half.java
index 5718d994620d..70d049a6e985 100644
--- a/core/java/android/util/Half.java
+++ b/core/java/android/util/Half.java
@@ -162,6 +162,7 @@ public final class Half extends Number implements Comparable<Half> {
private static final int FP32_EXPONENT_MASK = 0xff;
private static final int FP32_SIGNIFICAND_MASK = 0x7fffff;
private static final int FP32_EXPONENT_BIAS = 127;
+ private static final int FP32_QNAN_MASK = 0x400000;
private static final int FP32_DENORMAL_MAGIC = 126 << 23;
private static final float FP32_DENORMAL_FLOAT = Float.intBitsToFloat(FP32_DENORMAL_MAGIC);
@@ -903,6 +904,9 @@ public final class Half extends Number implements Comparable<Half> {
outM = m << 13;
if (e == 0x1f) { // Infinite or NaN
outE = 0xff;
+ if (outM != 0) { // SNaNs are quieted
+ outM |= FP32_QNAN_MASK;
+ }
} else {
outE = e - FP16_EXPONENT_BIAS + FP32_EXPONENT_BIAS;
}
diff --git a/core/java/android/util/KeyValueListParser.java b/core/java/android/util/KeyValueListParser.java
index 7eef63efd14d..d051ed84dd7c 100644
--- a/core/java/android/util/KeyValueListParser.java
+++ b/core/java/android/util/KeyValueListParser.java
@@ -16,7 +16,9 @@
package android.util;
import android.text.TextUtils;
+import android.util.proto.ProtoOutputStream;
+import java.io.PrintWriter;
import java.time.Duration;
import java.time.format.DateTimeParseException;
@@ -212,4 +214,163 @@ public class KeyValueListParser {
}
return def;
}
+
+ /** Represents an integer config value. */
+ public static class IntValue {
+ private final String mKey;
+ private final int mDefaultValue;
+ private int mValue;
+
+ /** Constructor, initialize with a config key and a default value. */
+ public IntValue(String key, int defaultValue) {
+ mKey = key;
+ mDefaultValue = defaultValue;
+ mValue = mDefaultValue;
+ }
+
+ /** Read a value from {@link KeyValueListParser} */
+ public void parse(KeyValueListParser parser) {
+ mValue = parser.getInt(mKey, mDefaultValue);
+ }
+
+ /** Return the config key. */
+ public String getKey() {
+ return mKey;
+ }
+
+ /** Return the default value. */
+ public int getDefaultValue() {
+ return mDefaultValue;
+ }
+
+ /** Return the actual config value. */
+ public int getValue() {
+ return mValue;
+ }
+
+ /** Overwrites with a value. */
+ public void setValue(int value) {
+ mValue = value;
+ }
+
+ /** Used for dumpsys */
+ public void dump(PrintWriter pw, String prefix) {
+ pw.print(prefix);
+ pw.print(mKey);
+ pw.print("=");
+ pw.print(mValue);
+ pw.println();
+ }
+
+ /** Used for proto dumpsys */
+ public void dumpProto(ProtoOutputStream proto, long tag) {
+ proto.write(tag, mValue);
+ }
+ }
+
+ /** Represents an long config value. */
+ public static class LongValue {
+ private final String mKey;
+ private final long mDefaultValue;
+ private long mValue;
+
+ /** Constructor, initialize with a config key and a default value. */
+ public LongValue(String key, long defaultValue) {
+ mKey = key;
+ mDefaultValue = defaultValue;
+ mValue = mDefaultValue;
+ }
+
+ /** Read a value from {@link KeyValueListParser} */
+ public void parse(KeyValueListParser parser) {
+ mValue = parser.getLong(mKey, mDefaultValue);
+ }
+
+ /** Return the config key. */
+ public String getKey() {
+ return mKey;
+ }
+
+ /** Return the default value. */
+ public long getDefaultValue() {
+ return mDefaultValue;
+ }
+
+ /** Return the actual config value. */
+ public long getValue() {
+ return mValue;
+ }
+
+ /** Overwrites with a value. */
+ public void setValue(long value) {
+ mValue = value;
+ }
+
+ /** Used for dumpsys */
+ public void dump(PrintWriter pw, String prefix) {
+ pw.print(prefix);
+ pw.print(mKey);
+ pw.print("=");
+ pw.print(mValue);
+ pw.println();
+ }
+
+ /** Used for proto dumpsys */
+ public void dumpProto(ProtoOutputStream proto, long tag) {
+ proto.write(tag, mValue);
+ }
+ }
+
+ /** Represents an string config value. */
+ public static class StringValue {
+ private final String mKey;
+ private final String mDefaultValue;
+ private String mValue;
+
+ /** Constructor, initialize with a config key and a default value. */
+ public StringValue(String key, String defaultValue) {
+ mKey = key;
+ mDefaultValue = defaultValue;
+ mValue = mDefaultValue;
+ }
+
+ /** Read a value from {@link KeyValueListParser} */
+ public void parse(KeyValueListParser parser) {
+ mValue = parser.getString(mKey, mDefaultValue);
+ }
+
+ /** Return the config key. */
+ public String getKey() {
+ return mKey;
+ }
+
+ /** Return the default value. */
+ public String getDefaultValue() {
+ return mDefaultValue;
+ }
+
+ /** Return the actual config value. */
+ public String getValue() {
+ return mValue;
+ }
+
+ /** Overwrites with a value. */
+ public void setValue(String value) {
+ mValue = value;
+ }
+
+ /** Used for dumpsys */
+ public void dump(PrintWriter pw, String prefix) {
+ pw.print(prefix);
+ pw.print(mKey);
+ pw.print("=");
+ pw.print(mValue);
+ pw.println();
+ }
+
+ /** Used for proto dumpsys */
+ public void dumpProto(ProtoOutputStream proto, long tag) {
+ proto.write(tag, mValue);
+ }
+ }
}
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java
index 91bc3eb5f83a..e4c8eeb3b9b0 100644
--- a/core/java/android/util/TimeUtils.java
+++ b/core/java/android/util/TimeUtils.java
@@ -43,6 +43,9 @@ public class TimeUtils {
/** {@hide} */
private static SimpleDateFormat sLoggingFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ /** @hide */
+ public static final SimpleDateFormat sDumpDateFormat =
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
/**
* Tries to return a time zone that would have had the specified offset
* and DST value at the specified moment in the specified country.
@@ -360,4 +363,28 @@ public class TimeUtils {
return sLoggingFormat.format(new Date(millis));
}
}
-}
+
+ /**
+ * Dump a currentTimeMillis style timestamp for dumpsys.
+ *
+ * @hide
+ */
+ public static void dumpTime(PrintWriter pw, long time) {
+ pw.print(sDumpDateFormat.format(new Date(time)));
+ }
+
+ /**
+ * Dump a currentTimeMillis style timestamp for dumpsys, with the delta time from now.
+ *
+ * @hide
+ */
+ public static void dumpTimeWithDelta(PrintWriter pw, long time, long now) {
+ pw.print(sDumpDateFormat.format(new Date(time)));
+ if (time == now) {
+ pw.print(" (now)");
+ } else {
+ pw.print(" (");
+ TimeUtils.formatDuration(time, now, pw);
+ pw.print(")");
+ }
+ }}
diff --git a/core/java/android/util/TypedValue.java b/core/java/android/util/TypedValue.java
index ea4464daf1e2..99106bedb314 100644
--- a/core/java/android/util/TypedValue.java
+++ b/core/java/android/util/TypedValue.java
@@ -216,6 +216,12 @@ public class TypedValue {
* */
public int density;
+ /**
+ * If the Value came from a style resource, this holds the corresponding style resource id
+ * against which the attribute was resolved.
+ */
+ public int sourceStyleResourceId;
+
/* ------------------------------------------------------------ */
/** Return the data for this value as a float. Only use for values
diff --git a/core/java/android/view/AccessibilityIterators.java b/core/java/android/view/AccessibilityIterators.java
index 9f7560c79166..54cfc00cb5b3 100644
--- a/core/java/android/view/AccessibilityIterators.java
+++ b/core/java/android/view/AccessibilityIterators.java
@@ -147,6 +147,9 @@ public final class AccessibilityIterators {
@Override
public void onConfigurationChanged(Configuration globalConfig) {
final Locale locale = globalConfig.getLocales().get(0);
+ if (locale == null) {
+ return;
+ }
if (!mLocale.equals(locale)) {
mLocale = locale;
onLocaleChanged(locale);
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index 691312b13a09..d2ae0f84b8aa 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -22,6 +22,7 @@ import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.graphics.FrameInfo;
+import android.graphics.Insets;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Build;
import android.os.Handler;
@@ -208,7 +209,7 @@ public final class Choreographer {
* @hide
*/
private static final String[] CALLBACK_TRACE_TITLES = {
- "input", "animation", "traversal", "commit"
+ "input", "animation", "insets_animation", "traversal", "commit"
};
/**
@@ -218,18 +219,33 @@ public final class Choreographer {
public static final int CALLBACK_INPUT = 0;
/**
- * Callback type: Animation callback. Runs before traversals.
+ * Callback type: Animation callback. Runs before {@link #CALLBACK_INSETS_ANIMATION}.
* @hide
*/
@TestApi
public static final int CALLBACK_ANIMATION = 1;
/**
+ * Callback type: Animation callback to handle inset updates. This is separate from
+ * {@link #CALLBACK_ANIMATION} as we need to "gather" all inset animation updates via
+ * {@link WindowInsetsAnimationController#changeInsets} for multiple ongoing animations but then
+ * update the whole view system with a single callback to {@link View#dispatchWindowInsetsAnimationProgress}
+ * that contains all the combined updated insets.
+ * <p>
+ * Both input and animation may change insets, so we need to run this after these callbacks, but
+ * before traversals.
+ * <p>
+ * Runs before traversals.
+ * @hide
+ */
+ public static final int CALLBACK_INSETS_ANIMATION = 2;
+
+ /**
* Callback type: Traversal callback. Handles layout and draw. Runs
* after all other asynchronous messages have been handled.
* @hide
*/
- public static final int CALLBACK_TRAVERSAL = 2;
+ public static final int CALLBACK_TRAVERSAL = 3;
/**
* Callback type: Commit callback. Handles post-draw operations for the frame.
@@ -241,7 +257,7 @@ public final class Choreographer {
* to the view hierarchy state) actually took effect.
* @hide
*/
- public static final int CALLBACK_COMMIT = 3;
+ public static final int CALLBACK_COMMIT = 4;
private static final int CALLBACK_LAST = CALLBACK_COMMIT;
@@ -759,6 +775,7 @@ public final class Choreographer {
mFrameInfo.markAnimationsStart();
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
+ doCallbacks(Choreographer.CALLBACK_INSETS_ANIMATION, frameTimeNanos);
mFrameInfo.markPerformTraversalsStart();
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 4ead34ed2f97..f58efc900427 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -1391,11 +1391,17 @@ public final class Display {
*/
public static final int HDR_TYPE_HLG = 3;
+ /**
+ * HDR10+ display.
+ */
+ public static final int HDR_TYPE_HDR10_PLUS = 4;
+
/** @hide */
@IntDef(prefix = { "HDR_TYPE_" }, value = {
HDR_TYPE_DOLBY_VISION,
HDR_TYPE_HDR10,
HDR_TYPE_HLG,
+ HDR_TYPE_HDR10_PLUS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface HdrType {}
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index d1115c7b4d1d..658f06ad21f9 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -99,7 +99,7 @@ interface IWindowSession {
out Rect outContentInsets, out Rect outVisibleInsets, out Rect outStableInsets,
out Rect outOutsets, out Rect outBackdropFrame,
out DisplayCutout.ParcelableWrapper displayCutout,
- out MergedConfiguration outMergedConfiguration, out Surface outSurface,
+ out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl,
out InsetsState insetsState);
/*
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java
index 7b9f78e70050..ce71b07da805 100644
--- a/core/java/android/view/InsetsAnimationControlImpl.java
+++ b/core/java/android/view/InsetsAnimationControlImpl.java
@@ -45,7 +45,9 @@ import java.util.function.Supplier;
* @hide
*/
@VisibleForTesting
-public class InsetsAnimationControlImpl implements WindowInsetsAnimationController {
+public class InsetsAnimationControlImpl implements WindowInsetsAnimationController {
+
+ private final Rect mTmpFrame = new Rect();
private final WindowInsetsAnimationControlListener mListener;
private final SparseArray<InsetsSourceConsumer> mConsumers;
@@ -61,19 +63,23 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
private final InsetsState mInitialInsetsState;
private final @InsetType int mTypes;
private final Supplier<SyncRtSurfaceTransactionApplier> mTransactionApplierSupplier;
-
+ private final InsetsController mController;
+ private final WindowInsetsAnimationListener.InsetsAnimation mAnimation;
private Insets mCurrentInsets;
+ private Insets mPendingInsets;
@VisibleForTesting
public InsetsAnimationControlImpl(SparseArray<InsetsSourceConsumer> consumers, Rect frame,
InsetsState state, WindowInsetsAnimationControlListener listener,
@InsetType int types,
- Supplier<SyncRtSurfaceTransactionApplier> transactionApplierSupplier) {
+ Supplier<SyncRtSurfaceTransactionApplier> transactionApplierSupplier,
+ InsetsController controller) {
mConsumers = consumers;
mListener = listener;
mTypes = types;
mTransactionApplierSupplier = transactionApplierSupplier;
- mInitialInsetsState = new InsetsState(state);
+ mController = controller;
+ mInitialInsetsState = new InsetsState(state, true /* copySources */);
mCurrentInsets = getInsetsFromState(mInitialInsetsState, frame, null /* typeSideMap */);
mHiddenInsets = calculateInsets(mInitialInsetsState, frame, consumers, false /* shown */,
null /* typeSideMap */);
@@ -83,6 +89,10 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
// TODO: Check for controllability first and wait for IME if needed.
listener.onReady(this, types);
+
+ mAnimation = new WindowInsetsAnimationListener.InsetsAnimation(mTypes, mHiddenInsets,
+ mShownInsets);
+ mController.dispatchAnimationStarted(mAnimation);
}
@Override
@@ -108,29 +118,35 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
@Override
public void changeInsets(Insets insets) {
- insets = sanitize(insets);
- final Insets offset = Insets.subtract(mShownInsets, insets);
+ mPendingInsets = sanitize(insets);
+ mController.scheduleApplyChangeInsets();
+ }
+
+ void applyChangeInsets(InsetsState state) {
+ final Insets offset = Insets.subtract(mShownInsets, mPendingInsets);
ArrayList<SurfaceParams> params = new ArrayList<>();
if (offset.left != 0) {
- updateLeashesForSide(INSET_SIDE_LEFT, offset.left, params);
+ updateLeashesForSide(INSET_SIDE_LEFT, offset.left, params, state);
}
if (offset.top != 0) {
- updateLeashesForSide(INSET_SIDE_TOP, offset.top, params);
+ updateLeashesForSide(INSET_SIDE_TOP, offset.top, params, state);
}
if (offset.right != 0) {
- updateLeashesForSide(INSET_SIDE_RIGHT, offset.right, params);
+ updateLeashesForSide(INSET_SIDE_RIGHT, offset.right, params, state);
}
if (offset.bottom != 0) {
- updateLeashesForSide(INSET_SIDE_BOTTOM, offset.bottom, params);
+ updateLeashesForSide(INSET_SIDE_BOTTOM, offset.bottom, params, state);
}
SyncRtSurfaceTransactionApplier applier = mTransactionApplierSupplier.get();
applier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
- mCurrentInsets = insets;
+ mCurrentInsets = mPendingInsets;
}
@Override
public void finish(int shownTypes) {
// TODO
+
+ mController.dispatchAnimationFinished(mAnimation);
}
private Insets calculateInsets(InsetsState state, Rect frame,
@@ -146,7 +162,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
@Nullable @InsetSide SparseIntArray typeSideMap) {
return state.calculateInsets(frame, false /* isScreenRound */,
false /* alwaysConsumerNavBar */, null /* displayCutout */, typeSideMap)
- .getSystemWindowInsets();
+ .getInsets(mTypes);
}
private Insets sanitize(Insets insets) {
@@ -154,7 +170,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
}
private void updateLeashesForSide(@InsetSide int side, int inset,
- ArrayList<SurfaceParams> surfaceParams) {
+ ArrayList<SurfaceParams> surfaceParams, InsetsState state) {
ArraySet<InsetsSourceConsumer> items = mSideSourceMap.get(side);
// TODO: Implement behavior when inset spans over multiple types
for (int i = items.size() - 1; i >= 0; i--) {
@@ -162,24 +178,32 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
final InsetsSource source = mInitialInsetsState.getSource(consumer.getType());
final SurfaceControl leash = consumer.getControl().getLeash();
mTmpMatrix.setTranslate(source.getFrame().left, source.getFrame().top);
- addTranslationToMatrix(side, inset, mTmpMatrix);
+
+ mTmpFrame.set(source.getFrame());
+ addTranslationToMatrix(side, inset, mTmpMatrix, mTmpFrame);
+
+ state.getSource(source.getType()).setFrame(mTmpFrame);
surfaceParams.add(new SurfaceParams(leash, 1f, mTmpMatrix, null, 0, 0f));
}
}
- private void addTranslationToMatrix(@InsetSide int side, int inset, Matrix m) {
+ private void addTranslationToMatrix(@InsetSide int side, int inset, Matrix m, Rect frame) {
switch (side) {
case INSET_SIDE_LEFT:
m.postTranslate(-inset, 0);
+ frame.offset(-inset, 0);
break;
case INSET_SIDE_TOP:
m.postTranslate(0, -inset);
+ frame.offset(0, -inset);
break;
case INSET_SIDE_RIGHT:
m.postTranslate(inset, 0);
+ frame.offset(inset, 0);
break;
case INSET_SIDE_BOTTOM:
m.postTranslate(0, inset);
+ frame.offset(0, inset);
break;
}
}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index 01af37e75cb9..c2ade764ca81 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -18,6 +18,7 @@ package android.view;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.graphics.Insets;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.ArraySet;
@@ -49,9 +50,29 @@ public class InsetsController implements WindowInsetsController {
private final SparseArray<InsetsSourceControl> mTmpControlArray = new SparseArray<>();
private final ArrayList<InsetsAnimationControlImpl> mAnimationControls = new ArrayList<>();
+ private WindowInsets mLastInsets;
+
+ private boolean mAnimCallbackScheduled;
+
+ private final Runnable mAnimCallback;
public InsetsController(ViewRootImpl viewRoot) {
mViewRoot = viewRoot;
+ mAnimCallback = () -> {
+ mAnimCallbackScheduled = false;
+ if (mAnimationControls.isEmpty()) {
+ return;
+ }
+
+ InsetsState state = new InsetsState(mState, true /* copySources */);
+ for (int i = mAnimationControls.size() - 1; i >= 0; i--) {
+ mAnimationControls.get(i).applyChangeInsets(state);
+ }
+ WindowInsets insets = state.calculateInsets(mFrame, mLastInsets.isRound(),
+ mLastInsets.shouldAlwaysConsumeNavBar(), mLastInsets.getDisplayCutout(),
+ null /* typeSideMap */);
+ mViewRoot.mView.dispatchWindowInsetsAnimationProgress(insets);
+ };
}
void onFrameChanged(Rect frame) {
@@ -82,8 +103,9 @@ public class InsetsController implements WindowInsetsController {
@VisibleForTesting
public WindowInsets calculateInsets(boolean isScreenRound,
boolean alwaysConsumeNavBar, DisplayCutout cutout) {
- return mState.calculateInsets(mFrame, isScreenRound, alwaysConsumeNavBar, cutout,
+ mLastInsets = mState.calculateInsets(mFrame, isScreenRound, alwaysConsumeNavBar, cutout,
null /* typeSideMap */);
+ return mLastInsets;
}
/**
@@ -148,7 +170,7 @@ public class InsetsController implements WindowInsetsController {
}
final InsetsAnimationControlImpl controller = new InsetsAnimationControlImpl(consumers,
mFrame, mState, listener, types,
- () -> new SyncRtSurfaceTransactionApplier(mViewRoot.mView));
+ () -> new SyncRtSurfaceTransactionApplier(mViewRoot.mView), this);
mAnimationControls.add(controller);
}
@@ -200,4 +222,20 @@ public class InsetsController implements WindowInsetsController {
pw.println(prefix); pw.println("InsetsController:");
mState.dump(prefix + " ", pw);
}
+
+ void dispatchAnimationStarted(WindowInsetsAnimationListener.InsetsAnimation animation) {
+ mViewRoot.mView.dispatchWindowInsetsAnimationStarted(animation);
+ }
+
+ void dispatchAnimationFinished(WindowInsetsAnimationListener.InsetsAnimation animation) {
+ mViewRoot.mView.dispatchWindowInsetsAnimationFinished(animation);
+ }
+
+ void scheduleApplyChangeInsets() {
+ if (!mAnimCallbackScheduled) {
+ mViewRoot.mChoreographer.postCallback(Choreographer.CALLBACK_INSETS_ANIMATION,
+ mAnimCallback, null /* token*/);
+ mAnimCallbackScheduled = true;
+ }
+ }
}
diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java
index 885b3e94c593..cf8c0707828d 100644
--- a/core/java/android/view/InsetsState.java
+++ b/core/java/android/view/InsetsState.java
@@ -16,6 +16,8 @@
package android.view;
+import static android.view.WindowInsets.Type.indexOf;
+
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.graphics.Insets;
@@ -105,6 +107,10 @@ public class InsetsState implements Parcelable {
set(copy);
}
+ public InsetsState(InsetsState copy, boolean copySources) {
+ set(copy, copySources);
+ }
+
/**
* Calculates {@link WindowInsets} based on the current source configuration.
*
@@ -114,8 +120,8 @@ public class InsetsState implements Parcelable {
public WindowInsets calculateInsets(Rect frame, boolean isScreenRound,
boolean alwaysConsumeNavBar, DisplayCutout cutout,
@Nullable @InsetSide SparseIntArray typeSideMap) {
- Insets systemInsets = Insets.NONE;
- Insets maxInsets = Insets.NONE;
+ Insets[] typeInsetsMap = new Insets[Type.SIZE];
+ Insets[] typeMaxInsetsMap = new Insets[Type.SIZE];
final Rect relativeFrame = new Rect(frame);
final Rect relativeFrameMax = new Rect(frame);
for (int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
@@ -123,32 +129,38 @@ public class InsetsState implements Parcelable {
if (source == null) {
continue;
}
- systemInsets = processSource(source, systemInsets, relativeFrame,
- false /* ignoreVisibility */, typeSideMap);
+ processSource(source, relativeFrame, false /* ignoreVisibility */, typeInsetsMap,
+ typeSideMap);
// IME won't be reported in max insets as the size depends on the EditorInfo of the IME
// target.
if (source.getType() != TYPE_IME) {
- maxInsets = processSource(source, maxInsets, relativeFrameMax,
- true /* ignoreVisibility */, null /* typeSideMap */);
+ processSource(source, relativeFrameMax, true /* ignoreVisibility */,
+ typeMaxInsetsMap, null /* typeSideMap */);
}
}
- return new WindowInsets(new Rect(systemInsets), null, new Rect(maxInsets), isScreenRound,
+ return new WindowInsets(typeInsetsMap, typeMaxInsetsMap, isScreenRound,
alwaysConsumeNavBar, cutout);
}
- private Insets processSource(InsetsSource source, Insets insets, Rect relativeFrame,
- boolean ignoreVisibility, @Nullable @InsetSide SparseIntArray typeSideMap) {
- Insets currentInsets = source.calculateInsets(relativeFrame, ignoreVisibility);
- insets = Insets.add(currentInsets, insets);
- relativeFrame.inset(insets);
- if (typeSideMap != null && !Insets.NONE.equals(currentInsets)) {
- @InsetSide int insetSide = getInsetSide(currentInsets);
+ private void processSource(InsetsSource source, Rect relativeFrame, boolean ignoreVisibility,
+ Insets[] typeInsetsMap, @Nullable @InsetSide SparseIntArray typeSideMap) {
+ Insets insets = source.calculateInsets(relativeFrame, ignoreVisibility);
+
+ int index = indexOf(toPublicType(source.getType()));
+ Insets existing = typeInsetsMap[index];
+ if (existing == null) {
+ typeInsetsMap[index] = insets;
+ } else {
+ typeInsetsMap[index] = Insets.max(existing, insets);
+ }
+
+ if (typeSideMap != null && !Insets.NONE.equals(insets)) {
+ @InsetSide int insetSide = getInsetSide(insets);
if (insetSide != INSET_SIDE_UNKNWON) {
- typeSideMap.put(source.getType(), getInsetSide(currentInsets));
+ typeSideMap.put(source.getType(), getInsetSide(insets));
}
}
- return insets;
}
/**
@@ -229,6 +241,21 @@ public class InsetsState implements Parcelable {
return result;
}
+ static @InsetType int toPublicType(@InternalInsetType int type) {
+ switch (type) {
+ case TYPE_TOP_BAR:
+ return Type.TOP_BAR;
+ case TYPE_SIDE_BAR_1:
+ case TYPE_SIDE_BAR_2:
+ case TYPE_SIDE_BAR_3:
+ return Type.SIDE_BARS;
+ case TYPE_IME:
+ return Type.IME;
+ default:
+ throw new IllegalArgumentException("Unknown type: " + type);
+ }
+ }
+
public static boolean getDefaultVisibly(@InsetType int type) {
switch (type) {
case TYPE_TOP_BAR:
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index 9cced4e0052f..f9a46b13d0e1 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -818,7 +818,10 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int KEYCODE_THUMBS_UP = 286;
/** Key code constant: Thumbs down key. Apps can use this to let user downvote content. */
public static final int KEYCODE_THUMBS_DOWN = 287;
- /** Key code constant: Consumed by system to switch current viewer profile. */
+ /**
+ * Key code constant: Used to switch current {@link android.accounts.Account} that is
+ * consuming content. May be consumed by system to set account globally.
+ */
public static final int KEYCODE_PROFILE_SWITCH = 288;
/**
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index ffd4156b5bfd..dc7c343c2c3e 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
@@ -29,6 +30,7 @@ import android.graphics.Canvas;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
+import android.os.SystemProperties;
import android.os.Trace;
import android.util.AttributeSet;
import android.util.Log;
@@ -38,6 +40,9 @@ import android.widget.FrameLayout;
import com.android.internal.R;
+import dalvik.system.PathClassLoader;
+import java.io.File;
+import java.lang.reflect.Method;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -72,6 +77,10 @@ public abstract class LayoutInflater {
private static final String TAG = LayoutInflater.class.getSimpleName();
private static final boolean DEBUG = false;
+ private static final String USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY
+ = "view.precompiled_layout_enabled";
+ private static final String COMPILED_VIEW_DEX_FILE_NAME = "/compiled_view.dex";
+
/** Empty stack trace used to avoid log spam in re-throw exceptions. */
private static final StackTraceElement[] EMPTY_STACK_TRACE = new StackTraceElement[0];
@@ -93,6 +102,13 @@ public abstract class LayoutInflater {
private Factory2 mPrivateFactory;
private Filter mFilter;
+ // Indicates whether we should try to inflate layouts using a precompiled layout instead of
+ // inflating from the XML resource.
+ private boolean mUseCompiledView;
+ // This variable holds the classloader that will be used to look for precompiled layouts. The
+ // The classloader includes the generated compiled_view.dex file.
+ private ClassLoader mPrecompiledClassLoader;
+
@UnsupportedAppUsage
final Object[] mConstructorArgs = new Object[2];
@@ -223,6 +239,7 @@ public abstract class LayoutInflater {
*/
protected LayoutInflater(Context context) {
mContext = context;
+ initPrecompiledViews();
}
/**
@@ -239,6 +256,7 @@ public abstract class LayoutInflater {
mFactory2 = original.mFactory2;
mPrivateFactory = original.mPrivateFactory;
setFilter(original.mFilter);
+ initPrecompiledViews();
}
/**
@@ -380,6 +398,41 @@ public abstract class LayoutInflater {
}
}
+ private void initPrecompiledViews() {
+ // Check if precompiled layouts are enabled by a system property.
+ mUseCompiledView =
+ SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false);
+ if (!mUseCompiledView) {
+ return;
+ }
+
+ // Make sure the application allows code generation
+ ApplicationInfo appInfo = mContext.getApplicationInfo();
+ if ((appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PREFER_CODE_INTEGRITY) != 0
+ || appInfo.isPrivilegedApp()) {
+ mUseCompiledView = false;
+ return;
+ }
+
+ // Try to load the precompiled layout file.
+ try {
+ mPrecompiledClassLoader = mContext.getClassLoader();
+ String dexFile = mContext.getCodeCacheDir() + COMPILED_VIEW_DEX_FILE_NAME;
+ if (new File(dexFile).exists()) {
+ mPrecompiledClassLoader = new PathClassLoader(dexFile, mPrecompiledClassLoader);
+ } else {
+ // If the precompiled layout file doesn't exist, then disable precompiled
+ // layouts.
+ mUseCompiledView = false;
+ }
+ } catch (Throwable e) {
+ if (DEBUG) {
+ Log.e(TAG, "Failed to initialized precompiled views layouts", e);
+ }
+ mUseCompiledView = false;
+ }
+ }
+
/**
* Inflate a new view hierarchy from the specified xml resource. Throws
* {@link InflateException} if there is an error.
@@ -436,10 +489,14 @@ public abstract class LayoutInflater {
final Resources res = getContext().getResources();
if (DEBUG) {
Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" ("
- + Integer.toHexString(resource) + ")");
+ + Integer.toHexString(resource) + ")");
}
- final XmlResourceParser parser = res.getLayout(resource);
+ View view = tryInflatePrecompiled(resource, res, root, attachToRoot);
+ if (view != null) {
+ return view;
+ }
+ XmlResourceParser parser = res.getLayout(resource);
try {
return inflate(parser, root, attachToRoot);
} finally {
@@ -447,6 +504,73 @@ public abstract class LayoutInflater {
}
}
+ private @Nullable
+ View tryInflatePrecompiled(@LayoutRes int resource, Resources res, @Nullable ViewGroup root,
+ boolean attachToRoot) {
+ if (!mUseCompiledView) {
+ return null;
+ }
+
+ Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate (precompiled)");
+
+ // Try to inflate using a precompiled layout.
+ String pkg = res.getResourcePackageName(resource);
+ String layout = res.getResourceEntryName(resource);
+
+ try {
+ Class clazz = mPrecompiledClassLoader.loadClass("" + pkg + ".CompiledView");
+ Method inflater = clazz.getMethod(layout, Context.class, int.class);
+ View view = (View) inflater.invoke(null, mContext, resource);
+
+ if (view != null && root != null) {
+ // We were able to use the precompiled inflater, but now we need to do some work to
+ // attach the view to the root correctly.
+ XmlResourceParser parser = res.getLayout(resource);
+ try {
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+ advanceToRootNode(parser);
+ ViewGroup.LayoutParams params = root.generateLayoutParams(attrs);
+
+ if (attachToRoot) {
+ root.addView(view, params);
+ } else {
+ view.setLayoutParams(params);
+ }
+ } finally {
+ parser.close();
+ }
+ }
+
+ return view;
+ } catch (Throwable e) {
+ if (DEBUG) {
+ Log.e(TAG, "Failed to use precompiled view", e);
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIEW);
+ }
+ return null;
+ }
+
+ /**
+ * Advances the given parser to the first START_TAG. Throws InflateException if no start tag is
+ * found.
+ */
+ private void advanceToRootNode(XmlPullParser parser)
+ throws InflateException, IOException, XmlPullParserException {
+ // Look for the root node.
+ int type;
+ while ((type = parser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty
+ }
+
+ if (type != XmlPullParser.START_TAG) {
+ throw new InflateException(parser.getPositionDescription()
+ + ": No start tag found!");
+ }
+ }
+
/**
* Inflate a new view hierarchy from the specified XML node. Throws
* {@link InflateException} if there is an error.
@@ -480,18 +604,7 @@ public abstract class LayoutInflater {
View result = root;
try {
- // Look for the root node.
- int type;
- while ((type = parser.next()) != XmlPullParser.START_TAG &&
- type != XmlPullParser.END_DOCUMENT) {
- // Empty
- }
-
- if (type != XmlPullParser.START_TAG) {
- throw new InflateException(parser.getPositionDescription()
- + ": No start tag found!");
- }
-
+ advanceToRootNode(parser);
final String name = parser.getName();
if (DEBUG) {
@@ -994,82 +1107,85 @@ public abstract class LayoutInflater {
+ "reference. The layout ID " + value + " is not valid.");
}
- final XmlResourceParser childParser = context.getResources().getLayout(layout);
+ final View precompiled = tryInflatePrecompiled(layout, context.getResources(),
+ (ViewGroup) parent, /*attachToRoot=*/true);
+ if (precompiled == null) {
+ final XmlResourceParser childParser = context.getResources().getLayout(layout);
- try {
- final AttributeSet childAttrs = Xml.asAttributeSet(childParser);
+ try {
+ final AttributeSet childAttrs = Xml.asAttributeSet(childParser);
- while ((type = childParser.next()) != XmlPullParser.START_TAG &&
- type != XmlPullParser.END_DOCUMENT) {
- // Empty.
- }
+ while ((type = childParser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty.
+ }
- if (type != XmlPullParser.START_TAG) {
- throw new InflateException(childParser.getPositionDescription() +
- ": No start tag found!");
- }
+ if (type != XmlPullParser.START_TAG) {
+ throw new InflateException(childParser.getPositionDescription() +
+ ": No start tag found!");
+ }
- final String childName = childParser.getName();
+ final String childName = childParser.getName();
- if (TAG_MERGE.equals(childName)) {
- // The <merge> tag doesn't support android:theme, so
- // nothing special to do here.
- rInflate(childParser, parent, context, childAttrs, false);
- } else {
- final View view = createViewFromTag(parent, childName,
- context, childAttrs, hasThemeOverride);
- final ViewGroup group = (ViewGroup) parent;
-
- final TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.Include);
- final int id = a.getResourceId(R.styleable.Include_id, View.NO_ID);
- final int visibility = a.getInt(R.styleable.Include_visibility, -1);
- a.recycle();
-
- // We try to load the layout params set in the <include /> tag.
- // If the parent can't generate layout params (ex. missing width
- // or height for the framework ViewGroups, though this is not
- // necessarily true of all ViewGroups) then we expect it to throw
- // a runtime exception.
- // We catch this exception and set localParams accordingly: true
- // means we successfully loaded layout params from the <include>
- // tag, false means we need to rely on the included layout params.
- ViewGroup.LayoutParams params = null;
- try {
- params = group.generateLayoutParams(attrs);
- } catch (RuntimeException e) {
- // Ignore, just fail over to child attrs.
- }
- if (params == null) {
- params = group.generateLayoutParams(childAttrs);
- }
- view.setLayoutParams(params);
+ if (TAG_MERGE.equals(childName)) {
+ // The <merge> tag doesn't support android:theme, so
+ // nothing special to do here.
+ rInflate(childParser, parent, context, childAttrs, false);
+ } else {
+ final View view = createViewFromTag(parent, childName,
+ context, childAttrs, hasThemeOverride);
+ final ViewGroup group = (ViewGroup) parent;
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.Include);
+ final int id = a.getResourceId(R.styleable.Include_id, View.NO_ID);
+ final int visibility = a.getInt(R.styleable.Include_visibility, -1);
+ a.recycle();
+
+ // We try to load the layout params set in the <include /> tag.
+ // If the parent can't generate layout params (ex. missing width
+ // or height for the framework ViewGroups, though this is not
+ // necessarily true of all ViewGroups) then we expect it to throw
+ // a runtime exception.
+ // We catch this exception and set localParams accordingly: true
+ // means we successfully loaded layout params from the <include>
+ // tag, false means we need to rely on the included layout params.
+ ViewGroup.LayoutParams params = null;
+ try {
+ params = group.generateLayoutParams(attrs);
+ } catch (RuntimeException e) {
+ // Ignore, just fail over to child attrs.
+ }
+ if (params == null) {
+ params = group.generateLayoutParams(childAttrs);
+ }
+ view.setLayoutParams(params);
- // Inflate all children.
- rInflateChildren(childParser, view, childAttrs, true);
+ // Inflate all children.
+ rInflateChildren(childParser, view, childAttrs, true);
- if (id != View.NO_ID) {
- view.setId(id);
- }
+ if (id != View.NO_ID) {
+ view.setId(id);
+ }
- switch (visibility) {
- case 0:
- view.setVisibility(View.VISIBLE);
- break;
- case 1:
- view.setVisibility(View.INVISIBLE);
- break;
- case 2:
- view.setVisibility(View.GONE);
- break;
- }
+ switch (visibility) {
+ case 0:
+ view.setVisibility(View.VISIBLE);
+ break;
+ case 1:
+ view.setVisibility(View.INVISIBLE);
+ break;
+ case 2:
+ view.setVisibility(View.GONE);
+ break;
+ }
- group.addView(view);
+ group.addView(view);
+ }
+ } finally {
+ childParser.close();
}
- } finally {
- childParser.close();
}
-
LayoutInflater.consumeChildElements(parser);
}
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index a86abe517b6a..9d3552f71f1f 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -18,6 +18,9 @@ package android.view;
import static android.view.Display.DEFAULT_DISPLAY;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.IntDef;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.graphics.Matrix;
@@ -30,6 +33,7 @@ import android.util.SparseArray;
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
+import java.lang.annotation.Retention;
import java.util.Objects;
/**
@@ -462,7 +466,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
/**
* This flag indicates that the event has been generated by a gesture generator. It
- * provides a hint to the GestureDector to not apply any touch slop.
+ * provides a hint to the GestureDetector to not apply any touch slop.
*
* @hide
*/
@@ -1391,6 +1395,42 @@ public final class MotionEvent extends InputEvent implements Parcelable {
};
/**
+ * Classification constant: None.
+ *
+ * No additional information is available about the current motion event stream.
+ *
+ * @see #getClassification
+ */
+ public static final int CLASSIFICATION_NONE = 0;
+
+ /**
+ * Classification constant: Ambiguous gesture.
+ *
+ * The user's intent with respect to the current event stream is not yet determined.
+ * Gestural actions, such as scrolling, should be inhibited until the classification resolves
+ * to another value or the event stream ends.
+ *
+ * @see #getClassification
+ */
+ public static final int CLASSIFICATION_AMBIGUOUS_GESTURE = 1;
+
+ /**
+ * Classification constant: Deep press.
+ *
+ * The current event stream represents the user intentionally pressing harder on the screen.
+ * This classification type should be used to accelerate the long press behaviour.
+ *
+ * @see #getClassification
+ */
+ public static final int CLASSIFICATION_DEEP_PRESS = 2;
+
+ /** @hide */
+ @Retention(SOURCE)
+ @IntDef(prefix = { "CLASSIFICATION" }, value = {
+ CLASSIFICATION_NONE, CLASSIFICATION_AMBIGUOUS_GESTURE, CLASSIFICATION_DEEP_PRESS})
+ public @interface Classification {};
+
+ /**
* Tool type constant: Unknown tool type.
* This constant is used when the tool type is not known or is not relevant,
* such as for a trackball or other non-pointing device.
@@ -1478,7 +1518,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
private static native long nativeInitialize(long nativePtr,
int deviceId, int source, int displayId, int action, int flags, int edgeFlags,
- int metaState, int buttonState,
+ int metaState, int buttonState, @Classification int classification,
float xOffset, float yOffset, float xPrecision, float yPrecision,
long downTimeNanos, long eventTimeNanos,
int pointerCount, PointerProperties[] pointerIds, PointerCoords[] pointerCoords);
@@ -1548,6 +1588,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
@CriticalNative
private static native void nativeSetButtonState(long nativePtr, int buttonState);
@CriticalNative
+ private static native int nativeGetClassification(long nativePtr);
+ @CriticalNative
private static native int nativeGetActionButton(long nativePtr);
@CriticalNative
private static native void nativeSetActionButton(long nativePtr, int actionButton);
@@ -1648,7 +1690,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
MotionEvent ev = obtain();
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
deviceId, source, displayId, action, flags, edgeFlags, metaState, buttonState,
- 0, 0, xPrecision, yPrecision,
+ CLASSIFICATION_NONE, 0, 0, xPrecision, yPrecision,
downTime * NS_PER_MS, eventTime * NS_PER_MS,
pointerCount, pointerProperties, pointerCoords);
if (ev.mNativePtr == 0) {
@@ -1833,7 +1875,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
deviceId, source, displayId,
- action, 0, edgeFlags, metaState, 0,
+ action, 0, edgeFlags, metaState, 0 /*buttonState*/, CLASSIFICATION_NONE,
0, 0, xPrecision, yPrecision,
downTime * NS_PER_MS, eventTime * NS_PER_MS,
1, pp, pc);
@@ -2539,6 +2581,18 @@ public final class MotionEvent extends InputEvent implements Parcelable {
}
/**
+ * Returns the classification for the current gesture.
+ * The classification may change as more events become available for the same gesture.
+ *
+ * @see #CLASSIFICATION_NONE
+ * @see #CLASSIFICATION_AMBIGUOUS_GESTURE
+ * @see #CLASSIFICATION_DEEP_PRESS
+ */
+ public @Classification int getClassification() {
+ return nativeGetClassification(mNativePtr);
+ }
+
+ /**
* Gets which button has been modified during a press or release action.
*
* For actions other than {@link #ACTION_BUTTON_PRESS} and {@link #ACTION_BUTTON_RELEASE}
@@ -3172,7 +3226,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
/**
* Adds all of the movement samples of the specified event to this one if
* it is compatible. To be compatible, the event must have the same device id,
- * source, display id, action, flags, pointer count, pointer properties.
+ * source, display id, action, flags, classification, pointer count, pointer properties.
*
* Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events.
*
@@ -3194,7 +3248,9 @@ public final class MotionEvent extends InputEvent implements Parcelable {
if (nativeGetDeviceId(mNativePtr) != nativeGetDeviceId(event.mNativePtr)
|| nativeGetSource(mNativePtr) != nativeGetSource(event.mNativePtr)
|| nativeGetDisplayId(mNativePtr) != nativeGetDisplayId(event.mNativePtr)
- || nativeGetFlags(mNativePtr) != nativeGetFlags(event.mNativePtr)) {
+ || nativeGetFlags(mNativePtr) != nativeGetFlags(event.mNativePtr)
+ || nativeGetClassification(mNativePtr)
+ != nativeGetClassification(event.mNativePtr)) {
return false;
}
@@ -3282,7 +3338,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
nativeGetDisplayId(mNativePtr),
nativeGetAction(mNativePtr), nativeGetFlags(mNativePtr),
nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
- nativeGetButtonState(mNativePtr),
+ nativeGetButtonState(mNativePtr), nativeGetClassification(mNativePtr),
nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr),
nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr),
nativeGetDownTimeNanos(mNativePtr),
@@ -3376,7 +3432,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
nativeGetDisplayId(mNativePtr),
newAction, nativeGetFlags(mNativePtr),
nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
- nativeGetButtonState(mNativePtr),
+ nativeGetButtonState(mNativePtr), nativeGetClassification(mNativePtr),
nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr),
nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr),
nativeGetDownTimeNanos(mNativePtr), eventTimeNanos,
@@ -3409,6 +3465,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
}
appendUnless("0", msg, ", buttonState=", MotionEvent.buttonStateToString(getButtonState()));
+ appendUnless(classificationToString(CLASSIFICATION_NONE), msg, ", classification=",
+ classificationToString(getClassification()));
appendUnless("0", msg, ", metaState=", KeyEvent.metaStateToString(getMetaState()));
appendUnless("0", msg, ", flags=0x", Integer.toHexString(getFlags()));
appendUnless("0", msg, ", edgeFlags=0x", Integer.toHexString(getEdgeFlags()));
@@ -3547,6 +3605,26 @@ public final class MotionEvent extends InputEvent implements Parcelable {
}
/**
+ * Returns a string that represents the symbolic name of the specified classification.
+ *
+ * @param classification The classification type.
+ * @return The symbolic name of this classification.
+ * @hide
+ */
+ public static String classificationToString(@Classification int classification) {
+ switch (classification) {
+ case CLASSIFICATION_NONE:
+ return "NONE";
+ case CLASSIFICATION_AMBIGUOUS_GESTURE:
+ return "AMBIGUOUS_GESTURE";
+ case CLASSIFICATION_DEEP_PRESS:
+ return "DEEP_PRESS";
+
+ }
+ return "NONE";
+ }
+
+ /**
* Returns a string that represents the symbolic name of the specified tool type
* such as "TOOL_TYPE_FINGER" or an equivalent numeric constant such as "42" if unknown.
*
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index cf11fd04efdf..c3d13bd46eb3 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -31,6 +31,7 @@ import android.graphics.RectF;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.hardware.display.DisplayManager;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -144,7 +145,8 @@ public final class PointerIcon implements Parcelable {
public static final int TYPE_DEFAULT = TYPE_ARROW;
private static final PointerIcon gNullIcon = new PointerIcon(TYPE_NULL);
- private static final SparseArray<PointerIcon> gSystemIcons = new SparseArray<PointerIcon>();
+ private static final SparseArray<SparseArray<PointerIcon>> gSystemIconsByDisplay =
+ new SparseArray<SparseArray<PointerIcon>>();
private static boolean sUseLargeIcons = false;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
@@ -163,6 +165,12 @@ public final class PointerIcon implements Parcelable {
@UnsupportedAppUsage
private int mDurationPerFrame;
+ /**
+ * Listener for displays lifecycle.
+ * @hide
+ */
+ private static DisplayManager.DisplayListener sDisplayListener;
+
private PointerIcon(int type) {
mType = type;
}
@@ -211,7 +219,19 @@ public final class PointerIcon implements Parcelable {
return gNullIcon;
}
- PointerIcon icon = gSystemIcons.get(type);
+ if (sDisplayListener == null) {
+ registerDisplayListener(context);
+ }
+
+ final int displayId = context.getDisplayId();
+ SparseArray<PointerIcon> systemIcons = gSystemIconsByDisplay.get(displayId);
+ if (systemIcons == null) {
+ systemIcons = new SparseArray<>();
+ gSystemIconsByDisplay.put(displayId, systemIcons);
+ }
+
+ PointerIcon icon = systemIcons.get(type);
+ // Reload if not in the same display.
if (icon != null) {
return icon;
}
@@ -240,7 +260,7 @@ public final class PointerIcon implements Parcelable {
} else {
icon.loadResource(context, context.getResources(), resourceId);
}
- gSystemIcons.append(type, icon);
+ systemIcons.append(type, icon);
return icon;
}
@@ -250,7 +270,7 @@ public final class PointerIcon implements Parcelable {
*/
public static void setUseLargeIcons(boolean use) {
sUseLargeIcons = use;
- gSystemIcons.clear();
+ gSystemIconsByDisplay.clear();
}
/**
@@ -576,4 +596,30 @@ public final class PointerIcon implements Parcelable {
return 0;
}
}
+
+ /**
+ * Manage system icon cache handled by display lifecycle.
+ * @param context The context.
+ */
+ private static void registerDisplayListener(@NonNull Context context) {
+ sDisplayListener = new DisplayManager.DisplayListener() {
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ gSystemIconsByDisplay.remove(displayId);
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ gSystemIconsByDisplay.remove(displayId);
+ }
+ };
+
+ DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+ displayManager.registerDisplayListener(sDisplayListener, null /* handler */);
+ }
+
}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index c423812dedea..aba71d52c5fb 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -30,6 +30,7 @@ import static android.view.SurfaceControlProto.NAME;
import android.annotation.Size;
import android.annotation.UnsupportedAppUsage;
import android.graphics.Bitmap;
+import android.graphics.ColorSpace;
import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
@@ -58,7 +59,7 @@ import java.io.Closeable;
/**
* SurfaceControl
- * @hide
+ * @hide
*/
public class SurfaceControl implements Parcelable {
private static final String TAG = "SurfaceControl";
@@ -67,6 +68,7 @@ public class SurfaceControl implements Parcelable {
int w, int h, int format, int flags, long parentObject, int windowType, int ownerUid)
throws OutOfResourcesException;
private static native long nativeReadFromParcel(Parcel in);
+ private static native long nativeCopyFromSurfaceControl(long nativeObject);
private static native void nativeWriteToParcel(long nativeObject, Parcel out);
private static native void nativeRelease(long nativeObject);
private static native void nativeDestroy(long nativeObject);
@@ -140,6 +142,7 @@ public class SurfaceControl implements Parcelable {
private static native int nativeGetActiveConfig(IBinder displayToken);
private static native boolean nativeSetActiveConfig(IBinder displayToken, int id);
private static native int[] nativeGetDisplayColorModes(IBinder displayToken);
+ private static native int[] nativeGetCompositionDataspaces();
private static native int nativeGetActiveColorMode(IBinder displayToken);
private static native boolean nativeSetActiveColorMode(IBinder displayToken,
int colorMode);
@@ -157,7 +160,6 @@ public class SurfaceControl implements Parcelable {
private static native void nativeSeverChildren(long transactionObj, long nativeObject);
private static native void nativeSetOverrideScalingMode(long transactionObj, long nativeObject,
int scalingMode);
- private static native void nativeDestroy(long transactionObj, long nativeObject);
private static native IBinder nativeGetHandle(long nativeObject);
private static native boolean nativeGetTransformToDisplayInverse(long nativeObject);
@@ -167,9 +169,10 @@ public class SurfaceControl implements Parcelable {
InputWindowHandle handle);
private static native void nativeTransferTouchFocus(long transactionObj, IBinder fromToken,
IBinder toToken);
+ private static native boolean nativeGetProtectedContentSupport();
private final CloseGuard mCloseGuard = CloseGuard.get();
- private final String mName;
+ private String mName;
long mNativeObject; // package visibility only for Surface.java access
// TODO: Move this to native.
@@ -186,6 +189,7 @@ public class SurfaceControl implements Parcelable {
/**
* Surface creation flag: Surface is created hidden
+ * @hide
*/
@UnsupportedAppUsage
public static final int HIDDEN = 0x00000004;
@@ -196,7 +200,7 @@ public class SurfaceControl implements Parcelable {
* from another process. In particular, screenshots and VNC servers will
* be disabled, but other measures can take place, for instance the
* surface might not be hardware accelerated.
- *
+ * @hide
*/
public static final int SECURE = 0x00000080;
@@ -220,7 +224,7 @@ public class SurfaceControl implements Parcelable {
* pixel.
* <p>
* In some rare situations, a non pre-multiplied surface is preferable.
- *
+ * @hide
*/
public static final int NON_PREMULTIPLIED = 0x00000100;
@@ -240,6 +244,7 @@ public class SurfaceControl implements Parcelable {
* </ul>
* If the underlying buffer lacks an alpha channel, the OPAQUE flag is effectively
* set automatically.
+ * @hide
*/
public static final int OPAQUE = 0x00000400;
@@ -248,6 +253,7 @@ public class SurfaceControl implements Parcelable {
* external display sink. If a hardware-protected path is not available,
* then this surface will not be displayed on the external sink.
*
+ * @hide
*/
public static final int PROTECTED_APP = 0x00000800;
@@ -255,6 +261,7 @@ public class SurfaceControl implements Parcelable {
/**
* Surface creation flag: Window represents a cursor glyph.
+ * @hide
*/
public static final int CURSOR_WINDOW = 0x00002000;
@@ -262,6 +269,7 @@ public class SurfaceControl implements Parcelable {
* Surface creation flag: Creates a normal surface.
* This is the default.
*
+ * @hide
*/
public static final int FX_SURFACE_NORMAL = 0x00000000;
@@ -271,6 +279,7 @@ public class SurfaceControl implements Parcelable {
* in {@link #setAlpha}. It is an error to lock a Dim surface, since it
* doesn't have a backing store.
*
+ * @hide
*/
public static final int FX_SURFACE_DIM = 0x00020000;
@@ -278,12 +287,14 @@ public class SurfaceControl implements Parcelable {
* Surface creation flag: Creates a container surface.
* This surface will have no buffers and will only be used
* as a container for other surfaces, or for its InputInfo.
+ * @hide
*/
public static final int FX_SURFACE_CONTAINER = 0x00080000;
/**
* Mask used for FX values above.
*
+ * @hide
*/
public static final int FX_SURFACE_MASK = 0x000F0000;
@@ -309,12 +320,14 @@ public class SurfaceControl implements Parcelable {
/**
* Built-in physical display id: Main display.
* Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
+ * @hide
*/
public static final int BUILT_IN_DISPLAY_ID_MAIN = 0;
/**
* Built-in physical display id: Attached HDMI display.
* Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
+ * @hide
*/
public static final int BUILT_IN_DISPLAY_ID_HDMI = 1;
@@ -332,30 +345,35 @@ public class SurfaceControl implements Parcelable {
/**
* Display power mode off: used while blanking the screen.
* Use only with {@link SurfaceControl#setDisplayPowerMode}.
+ * @hide
*/
public static final int POWER_MODE_OFF = 0;
/**
* Display power mode doze: used while putting the screen into low power mode.
* Use only with {@link SurfaceControl#setDisplayPowerMode}.
+ * @hide
*/
public static final int POWER_MODE_DOZE = 1;
/**
* Display power mode normal: used while unblanking the screen.
* Use only with {@link SurfaceControl#setDisplayPowerMode}.
+ * @hide
*/
public static final int POWER_MODE_NORMAL = 2;
/**
* Display power mode doze: used while putting the screen into a suspended
* low power mode. Use only with {@link SurfaceControl#setDisplayPowerMode}.
+ * @hide
*/
public static final int POWER_MODE_DOZE_SUSPEND = 3;
/**
* Display power mode on: used while putting the screen into a suspended
* full power mode. Use only with {@link SurfaceControl#setDisplayPowerMode}.
+ * @hide
*/
public static final int POWER_MODE_ON_SUSPEND = 4;
@@ -369,7 +387,32 @@ public class SurfaceControl implements Parcelable {
public static final int WINDOW_TYPE_DONT_SCREENSHOT = 441731;
/**
+ * internal representation of how to interpret pixel value, used only to convert to ColorSpace.
+ */
+ private static final int INTERNAL_DATASPACE_SRGB = 142671872;
+ private static final int INTERNAL_DATASPACE_DISPLAY_P3 = 143261696;
+ private static final int INTERNAL_DATASPACE_SCRGB = 411107328;
+
+ private void assignNativeObject(long nativeObject) {
+ if (mNativeObject != 0) {
+ release();
+ }
+ mNativeObject = nativeObject;
+ }
+
+ /**
+ * @hide
+ */
+ public void copyFrom(SurfaceControl other) {
+ mName = other.mName;
+ mWidth = other.mWidth;
+ mHeight = other.mHeight;
+ assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject));
+ }
+
+ /**
* Builder class for {@link SurfaceControl} objects.
+ * @hide
*/
public static class Builder {
private SurfaceSession mSession;
@@ -386,6 +429,7 @@ public class SurfaceControl implements Parcelable {
* Begin building a SurfaceControl with a given {@link SurfaceSession}.
*
* @param session The {@link SurfaceSession} with which to eventually construct the surface.
+ * @hide
*/
public Builder(SurfaceSession session) {
mSession = session;
@@ -393,6 +437,7 @@ public class SurfaceControl implements Parcelable {
/**
* Construct a new {@link SurfaceControl} with the set parameters.
+ * @hide
*/
public SurfaceControl build() {
if (mWidth < 0 || mHeight < 0) {
@@ -411,6 +456,7 @@ public class SurfaceControl implements Parcelable {
* Set a debugging-name for the SurfaceControl.
*
* @param name A name to identify the Surface in debugging.
+ * @hide
*/
public Builder setName(String name) {
mName = name;
@@ -422,6 +468,7 @@ public class SurfaceControl implements Parcelable {
*
* @param width The buffer width in pixels.
* @param height The buffer height in pixels.
+ * @hide
*/
public Builder setBufferSize(int width, int height) {
if (width < 0 || height < 0) {
@@ -436,6 +483,7 @@ public class SurfaceControl implements Parcelable {
/**
* Set the pixel format of the controlled surface's buffers, using constants from
* {@link android.graphics.PixelFormat}.
+ * @hide
*/
public Builder setFormat(@PixelFormat.Format int format) {
mFormat = format;
@@ -449,6 +497,7 @@ public class SurfaceControl implements Parcelable {
* not be displayed.
*
* @param protectedContent Whether to require a protected sink.
+ * @hide
*/
public Builder setProtected(boolean protectedContent) {
if (protectedContent) {
@@ -464,6 +513,7 @@ public class SurfaceControl implements Parcelable {
* will prevent the surfaces content from being copied by another process. In
* particular screenshots and VNC servers will be disabled. This is however
* not a complete prevention of readback as {@link #setProtected}.
+ * @hide
*/
public Builder setSecure(boolean secure) {
if (secure) {
@@ -496,6 +546,7 @@ public class SurfaceControl implements Parcelable {
* If the underlying buffer lacks an alpha channel, it is as if setOpaque(true)
* were set automatically.
* @param opaque Whether the Surface is OPAQUE.
+ * @hide
*/
public Builder setOpaque(boolean opaque) {
if (opaque) {
@@ -514,6 +565,7 @@ public class SurfaceControl implements Parcelable {
* of the parent.
*
* @param parent The parent control.
+ * @hide
*/
public Builder setParent(SurfaceControl parent) {
mParent = parent;
@@ -529,6 +581,7 @@ public class SurfaceControl implements Parcelable {
*
* @param windowType A window-type
* @param ownerUid UID of the window owner.
+ * @hide
*/
public Builder setMetadata(int windowType, int ownerUid) {
if (UserHandle.getAppId(Process.myUid()) != Process.SYSTEM_UID) {
@@ -547,6 +600,7 @@ public class SurfaceControl implements Parcelable {
* solid color (that is, solid before plane alpha). Currently that color is black.
*
* @param isColorLayer Whether to create a color layer.
+ * @hide
*/
public Builder setColorLayer(boolean isColorLayer) {
if (isColorLayer) {
@@ -568,6 +622,7 @@ public class SurfaceControl implements Parcelable {
* as a parent of renderable layers.
*
* @param isContainerLayer Whether to create a container layer.
+ * @hide
*/
public Builder setContainerLayer(boolean isContainerLayer) {
if (isContainerLayer) {
@@ -587,6 +642,7 @@ public class SurfaceControl implements Parcelable {
*
* TODO: Finish conversion to individual builder methods?
* @param flags The combined flags
+ * @hide
*/
public Builder setFlags(int flags) {
mFlags = flags;
@@ -655,9 +711,11 @@ public class SurfaceControl implements Parcelable {
mCloseGuard.open("release");
}
- // This is a transfer constructor, useful for transferring a live SurfaceControl native
- // object to another Java wrapper which could have some different behavior, e.g.
- // event logging.
+ /** This is a transfer constructor, useful for transferring a live SurfaceControl native
+ * object to another Java wrapper which could have some different behavior, e.g.
+ * event logging.
+ * @hide
+ */
public SurfaceControl(SurfaceControl other) {
mName = other.mName;
mWidth = other.mWidth;
@@ -669,27 +727,62 @@ public class SurfaceControl implements Parcelable {
}
private SurfaceControl(Parcel in) {
+ readFromParcel(in);
+ mCloseGuard.open("release");
+ }
+
+ /**
+ * @hide
+ */
+ public SurfaceControl() {
+ mCloseGuard.open("release");
+ }
+
+ /**
+ * @hide
+ */
+ public void readFromParcel(Parcel in) {
+ if (in == null) {
+ throw new IllegalArgumentException("source must not be null");
+ }
+
mName = in.readString();
mWidth = in.readInt();
mHeight = in.readInt();
- mNativeObject = nativeReadFromParcel(in);
- if (mNativeObject == 0) {
- throw new IllegalArgumentException("Couldn't read SurfaceControl from parcel=" + in);
+
+ long object = 0;
+ if (in.readInt() != 0) {
+ object = nativeReadFromParcel(in);
}
- mCloseGuard.open("release");
+ assignNativeObject(object);
}
+ /**
+ * @hide
+ */
@Override
public int describeContents() {
return 0;
}
+ /**
+ * @hide
+ */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mName);
dest.writeInt(mWidth);
dest.writeInt(mHeight);
+ if (mNativeObject == 0) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(1);
+ }
nativeWriteToParcel(mNativeObject, dest);
+
+ if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) {
+ release();
+ }
}
/**
@@ -707,6 +800,9 @@ public class SurfaceControl implements Parcelable {
proto.end(token);
}
+ /**
+ * @hide
+ */
public static final Creator<SurfaceControl> CREATOR
= new Creator<SurfaceControl>() {
public SurfaceControl createFromParcel(Parcel in) {
@@ -718,6 +814,9 @@ public class SurfaceControl implements Parcelable {
}
};
+ /**
+ * @hide
+ */
@Override
protected void finalize() throws Throwable {
try {
@@ -736,6 +835,7 @@ public class SurfaceControl implements Parcelable {
* Release the local reference to the server-side surface.
* Always call release() when you're done with a Surface.
* This will make the surface invalid.
+ * @hide
*/
public void release() {
if (mNativeObject != 0) {
@@ -749,6 +849,7 @@ public class SurfaceControl implements Parcelable {
* Free all server-side state associated with this surface and
* release this object's reference. This method can only be
* called from the process that created the service.
+ * @hide
*/
public void destroy() {
if (mNativeObject != 0) {
@@ -760,6 +861,7 @@ public class SurfaceControl implements Parcelable {
/**
* Disconnect any client still connected to the surface.
+ * @hide
*/
public void disconnect() {
if (mNativeObject != 0) {
@@ -772,12 +874,21 @@ public class SurfaceControl implements Parcelable {
"mNativeObject is null. Have you called release() already?");
}
+ /**
+ * @hide
+ */
+ public boolean isValid() {
+ return mNativeObject != 0;
+ }
+
/*
* set surface parameters.
* needs to be inside open/closeTransaction block
*/
- /** start a transaction */
+ /** start a transaction
+ * @hide
+ */
@UnsupportedAppUsage
public static void openTransaction() {
synchronized (SurfaceControl.class) {
@@ -806,6 +917,7 @@ public class SurfaceControl implements Parcelable {
* This clears the supplied transaction in an identical fashion to {@link Transaction#merge}.
* <p>
* This is a utility for interop with legacy-code and will go away with the Global Transaction.
+ * @hide
*/
@Deprecated
public static void mergeToGlobalTransaction(Transaction t) {
@@ -814,46 +926,69 @@ public class SurfaceControl implements Parcelable {
}
}
- /** end a transaction */
+ /** end a transaction
+ * @hide
+ */
@UnsupportedAppUsage
public static void closeTransaction() {
closeTransaction(false);
}
+ /**
+ * @hide
+ */
public static void closeTransactionSync() {
closeTransaction(true);
}
+ /**
+ * @hide
+ */
public void deferTransactionUntil(IBinder handle, long frame) {
synchronized(SurfaceControl.class) {
sGlobalTransaction.deferTransactionUntil(this, handle, frame);
}
}
+ /**
+ * @hide
+ */
public void deferTransactionUntil(Surface barrier, long frame) {
synchronized(SurfaceControl.class) {
sGlobalTransaction.deferTransactionUntilSurface(this, barrier, frame);
}
}
+ /**
+ * @hide
+ */
public void reparentChildren(IBinder newParentHandle) {
synchronized(SurfaceControl.class) {
sGlobalTransaction.reparentChildren(this, newParentHandle);
}
}
+ /**
+ * @hide
+ */
public void reparent(IBinder newParentHandle) {
synchronized(SurfaceControl.class) {
sGlobalTransaction.reparent(this, newParentHandle);
}
}
+ /**
+ * @hide
+ */
public void detachChildren() {
synchronized(SurfaceControl.class) {
sGlobalTransaction.detachChildren(this);
}
}
+ /**
+ * @hide
+ */
public void setOverrideScalingMode(int scalingMode) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -861,16 +996,25 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public IBinder getHandle() {
return nativeGetHandle(mNativeObject);
}
+ /**
+ * @hide
+ */
public static void setAnimationTransaction() {
synchronized (SurfaceControl.class) {
sGlobalTransaction.setAnimationTransaction();
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public void setLayer(int zorder) {
checkNotReleased();
@@ -879,6 +1023,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setRelativeLayer(SurfaceControl relativeTo, int zorder) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -886,6 +1033,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public void setPosition(float x, float y) {
checkNotReleased();
@@ -894,6 +1044,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setGeometryAppliesWithResize() {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -901,6 +1054,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setBufferSize(int w, int h) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -908,6 +1064,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public void hide() {
checkNotReleased();
@@ -916,6 +1075,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public void show() {
checkNotReleased();
@@ -924,6 +1086,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setTransparentRegionHint(Region region) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -931,24 +1096,39 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public boolean clearContentFrameStats() {
checkNotReleased();
return nativeClearContentFrameStats(mNativeObject);
}
+ /**
+ * @hide
+ */
public boolean getContentFrameStats(WindowContentFrameStats outStats) {
checkNotReleased();
return nativeGetContentFrameStats(mNativeObject, outStats);
}
+ /**
+ * @hide
+ */
public static boolean clearAnimationFrameStats() {
return nativeClearAnimationFrameStats();
}
+ /**
+ * @hide
+ */
public static boolean getAnimationFrameStats(WindowAnimationFrameStats outStats) {
return nativeGetAnimationFrameStats(outStats);
}
+ /**
+ * @hide
+ */
public void setAlpha(float alpha) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -956,6 +1136,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setColor(@Size(3) float[] color) {
checkNotReleased();
synchronized (SurfaceControl.class) {
@@ -963,6 +1146,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -975,6 +1161,7 @@ public class SurfaceControl implements Parcelable {
*
* @param matrix The matrix to apply.
* @param float9 An array of 9 floats to be used to extract the values from the matrix.
+ * @hide
*/
public void setMatrix(Matrix matrix, float[] float9) {
checkNotReleased();
@@ -990,6 +1177,7 @@ public class SurfaceControl implements Parcelable {
* Sets the color transform for the Surface.
* @param matrix A float array with 9 values represents a 3x3 transform matrix
* @param translation A float array with 3 values represents a translation vector
+ * @hide
*/
public void setColorTransform(@Size(9) float[] matrix, @Size(3) float[] translation) {
checkNotReleased();
@@ -1005,6 +1193,7 @@ public class SurfaceControl implements Parcelable {
* constrained by the size of its parent bounds.
*
* @param crop Bounds of the crop to apply.
+ * @hide
*/
public void setWindowCrop(Rect crop) {
checkNotReleased();
@@ -1018,6 +1207,7 @@ public class SurfaceControl implements Parcelable {
*
* @param width width of crop rect
* @param height height of crop rect
+ * @hide
*/
public void setWindowCrop(int width, int height) {
checkNotReleased();
@@ -1030,6 +1220,7 @@ public class SurfaceControl implements Parcelable {
* Sets the corner radius of a {@link SurfaceControl}.
*
* @param cornerRadius Corner radius in pixels.
+ * @hide
*/
public void setCornerRadius(float cornerRadius) {
checkNotReleased();
@@ -1038,6 +1229,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setLayerStack(int layerStack) {
checkNotReleased();
synchronized(SurfaceControl.class) {
@@ -1045,6 +1239,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setOpaque(boolean isOpaque) {
checkNotReleased();
@@ -1053,6 +1250,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public void setSecure(boolean isSecure) {
checkNotReleased();
@@ -1061,18 +1261,27 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public int getWidth() {
synchronized (mSizeLock) {
return mWidth;
}
}
+ /**
+ * @hide
+ */
public int getHeight() {
synchronized (mSizeLock) {
return mHeight;
}
}
+ /**
+ * @hide
+ */
@Override
public String toString() {
return "Surface(name=" + mName + ")/@0x" +
@@ -1088,38 +1297,85 @@ public class SurfaceControl implements Parcelable {
* Describes the properties of a physical display known to surface flinger.
*/
public static final class PhysicalDisplayInfo {
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public int width;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public int height;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public float refreshRate;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public float density;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public float xDpi;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public float yDpi;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public boolean secure;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public long appVsyncOffsetNanos;
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public long presentationDeadlineNanos;
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public PhysicalDisplayInfo() {
}
+ /**
+ * @hide
+ */
public PhysicalDisplayInfo(PhysicalDisplayInfo other) {
copyFrom(other);
}
+ /**
+ * @hide
+ */
@Override
public boolean equals(Object o) {
return o instanceof PhysicalDisplayInfo && equals((PhysicalDisplayInfo)o);
}
+ /**
+ * @hide
+ */
public boolean equals(PhysicalDisplayInfo other) {
return other != null
&& width == other.width
@@ -1133,11 +1389,17 @@ public class SurfaceControl implements Parcelable {
&& presentationDeadlineNanos == other.presentationDeadlineNanos;
}
+ /**
+ * @hide
+ */
@Override
public int hashCode() {
return 0; // don't care
}
+ /**
+ * @hide
+ */
public void copyFrom(PhysicalDisplayInfo other) {
width = other.width;
height = other.height;
@@ -1150,7 +1412,9 @@ public class SurfaceControl implements Parcelable {
presentationDeadlineNanos = other.presentationDeadlineNanos;
}
- // For debugging purposes
+ /**
+ * @hide
+ */
@Override
public String toString() {
return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, "
@@ -1160,6 +1424,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public static void setDisplayPowerMode(IBinder displayToken, int mode) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1167,6 +1434,9 @@ public class SurfaceControl implements Parcelable {
nativeSetDisplayPowerMode(displayToken, mode);
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static SurfaceControl.PhysicalDisplayInfo[] getDisplayConfigs(IBinder displayToken) {
if (displayToken == null) {
@@ -1175,6 +1445,9 @@ public class SurfaceControl implements Parcelable {
return nativeGetDisplayConfigs(displayToken);
}
+ /**
+ * @hide
+ */
public static int getActiveConfig(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1221,6 +1494,9 @@ public class SurfaceControl implements Parcelable {
}
+ /**
+ * @hide
+ */
public static boolean setActiveConfig(IBinder displayToken, int id) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1228,6 +1504,9 @@ public class SurfaceControl implements Parcelable {
return nativeSetActiveConfig(displayToken, id);
}
+ /**
+ * @hide
+ */
public static int[] getDisplayColorModes(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1235,6 +1514,9 @@ public class SurfaceControl implements Parcelable {
return nativeGetDisplayColorModes(displayToken);
}
+ /**
+ * @hide
+ */
public static int getActiveColorMode(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1242,6 +1524,9 @@ public class SurfaceControl implements Parcelable {
return nativeGetActiveColorMode(displayToken);
}
+ /**
+ * @hide
+ */
public static boolean setActiveColorMode(IBinder displayToken, int colorMode) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1249,6 +1534,38 @@ public class SurfaceControl implements Parcelable {
return nativeSetActiveColorMode(displayToken, colorMode);
}
+ /**
+ * Returns an array of color spaces with 2 elements. The first color space is the
+ * default color space and second one is wide color gamut color space.
+ * @hide
+ */
+ public static ColorSpace[] getCompositionColorSpaces() {
+ int[] dataspaces = nativeGetCompositionDataspaces();
+ ColorSpace srgb = ColorSpace.get(ColorSpace.Named.SRGB);
+ ColorSpace[] colorSpaces = { srgb, srgb };
+ if (dataspaces.length == 2) {
+ for (int i = 0; i < 2; ++i) {
+ switch(dataspaces[i]) {
+ case INTERNAL_DATASPACE_DISPLAY_P3:
+ colorSpaces[i] = ColorSpace.get(ColorSpace.Named.DISPLAY_P3);
+ break;
+ case INTERNAL_DATASPACE_SCRGB:
+ colorSpaces[i] = ColorSpace.get(ColorSpace.Named.EXTENDED_SRGB);
+ break;
+ case INTERNAL_DATASPACE_SRGB:
+ // Other dataspace is not recognized, use SRGB color space instead,
+ // the default value of the array is already SRGB, thus do nothing.
+ default:
+ break;
+ }
+ }
+ }
+ return colorSpaces;
+ }
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static void setDisplayProjection(IBinder displayToken,
int orientation, Rect layerStackRect, Rect displayRect) {
@@ -1258,6 +1575,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static void setDisplayLayerStack(IBinder displayToken, int layerStack) {
synchronized (SurfaceControl.class) {
@@ -1265,6 +1585,9 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static void setDisplaySurface(IBinder displayToken, Surface surface) {
synchronized (SurfaceControl.class) {
@@ -1272,12 +1595,18 @@ public class SurfaceControl implements Parcelable {
}
}
+ /**
+ * @hide
+ */
public static void setDisplaySize(IBinder displayToken, int width, int height) {
synchronized (SurfaceControl.class) {
sGlobalTransaction.setDisplaySize(displayToken, width, height);
}
}
+ /**
+ * @hide
+ */
public static Display.HdrCapabilities getHdrCapabilities(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1285,6 +1614,9 @@ public class SurfaceControl implements Parcelable {
return nativeGetHdrCapabilities(displayToken);
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static IBinder createDisplay(String name, boolean secure) {
if (name == null) {
@@ -1293,6 +1625,9 @@ public class SurfaceControl implements Parcelable {
return nativeCreateDisplay(name, secure);
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static void destroyDisplay(IBinder displayToken) {
if (displayToken == null) {
@@ -1301,6 +1636,9 @@ public class SurfaceControl implements Parcelable {
nativeDestroyDisplay(displayToken);
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public static IBinder getBuiltInDisplay(int builtInDisplayId) {
return nativeGetBuiltInDisplay(builtInDisplayId);
@@ -1308,6 +1646,7 @@ public class SurfaceControl implements Parcelable {
/**
* @see SurfaceControl#screenshot(IBinder, Surface, Rect, int, int, boolean, int)
+ * @hide
*/
public static void screenshot(IBinder display, Surface consumer) {
screenshot(display, consumer, new Rect(), 0, 0, false, 0);
@@ -1318,6 +1657,7 @@ public class SurfaceControl implements Parcelable {
*
* @param consumer The {@link Surface} to take the screenshot into.
* @see SurfaceControl#screenshotToBuffer(IBinder, Rect, int, int, boolean, int)
+ * @hide
*/
public static void screenshot(IBinder display, Surface consumer, Rect sourceCrop, int width,
int height, boolean useIdentityTransform, int rotation) {
@@ -1336,6 +1676,7 @@ public class SurfaceControl implements Parcelable {
/**
* @see SurfaceControl#screenshot(Rect, int, int, boolean, int)}
+ * @hide
*/
@UnsupportedAppUsage
public static Bitmap screenshot(Rect sourceCrop, int width, int height, int rotation) {
@@ -1353,6 +1694,7 @@ public class SurfaceControl implements Parcelable {
* {@link SurfaceControl#screenshotToBuffer(IBinder, Rect, int, int, boolean, int)}.
*
* @see SurfaceControl#screenshotToBuffer(IBinder, Rect, int, int, boolean, int)}
+ * @hide
*/
@UnsupportedAppUsage
public static Bitmap screenshot(Rect sourceCrop, int width, int height,
@@ -1396,6 +1738,7 @@ public class SurfaceControl implements Parcelable {
* this is useful for returning screenshots that are independent of
* device orientation.
* @return Returns a GraphicBuffer that contains the captured content.
+ * @hide
*/
public static GraphicBuffer screenshotToBuffer(IBinder display, Rect sourceCrop, int width,
int height, boolean useIdentityTransform, int rotation) {
@@ -1427,12 +1770,24 @@ public class SurfaceControl implements Parcelable {
* screen will be scaled up/down.
*
* @return Returns a GraphicBuffer that contains the layer capture.
+ * @hide
*/
public static GraphicBuffer captureLayers(IBinder layerHandleToken, Rect sourceCrop,
float frameScale) {
return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale);
}
+ /**
+ * Returns whether protected content is supported in GPU composition.
+ * @hide
+ */
+ public static boolean getProtectedContentSupport() {
+ return nativeGetProtectedContentSupport();
+ }
+
+ /**
+ * @hide
+ */
public static class Transaction implements Closeable {
public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
Transaction.class.getClassLoader(),
@@ -1442,6 +1797,9 @@ public class SurfaceControl implements Parcelable {
private final ArrayMap<SurfaceControl, Point> mResizedSurfaces = new ArrayMap<>();
Runnable mFreeNativeResources;
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction() {
mNativeObject = nativeCreateTransaction();
@@ -1452,6 +1810,7 @@ public class SurfaceControl implements Parcelable {
/**
* Apply the transaction, clearing it's state, and making it usable
* as a new transaction.
+ * @hide
*/
@UnsupportedAppUsage
public void apply() {
@@ -1461,6 +1820,7 @@ public class SurfaceControl implements Parcelable {
/**
* Close the transaction, if the transaction was not already applied this will cancel the
* transaction.
+ * @hide
*/
@Override
public void close() {
@@ -1470,6 +1830,7 @@ public class SurfaceControl implements Parcelable {
/**
* Jankier version of apply. Avoid use (b/28068298).
+ * @hide
*/
public void apply(boolean sync) {
applyResizedSurfaces();
@@ -1488,6 +1849,9 @@ public class SurfaceControl implements Parcelable {
mResizedSurfaces.clear();
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction show(SurfaceControl sc) {
sc.checkNotReleased();
@@ -1495,6 +1859,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction hide(SurfaceControl sc) {
sc.checkNotReleased();
@@ -1502,6 +1869,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setPosition(SurfaceControl sc, float x, float y) {
sc.checkNotReleased();
@@ -1509,6 +1879,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setBufferSize(SurfaceControl sc, int w, int h) {
sc.checkNotReleased();
@@ -1517,6 +1890,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setLayer(SurfaceControl sc, int z) {
sc.checkNotReleased();
@@ -1524,6 +1900,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setRelativeLayer(SurfaceControl sc, SurfaceControl relativeTo, int z) {
sc.checkNotReleased();
nativeSetRelativeLayer(mNativeObject, sc.mNativeObject,
@@ -1531,6 +1910,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setTransparentRegionHint(SurfaceControl sc, Region transparentRegion) {
sc.checkNotReleased();
nativeSetTransparentRegionHint(mNativeObject,
@@ -1538,6 +1920,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setAlpha(SurfaceControl sc, float alpha) {
sc.checkNotReleased();
@@ -1545,6 +1930,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setInputWindowInfo(SurfaceControl sc, InputWindowHandle handle) {
sc.checkNotReleased();
nativeSetInputWindowInfo(mNativeObject, sc.mNativeObject, handle);
@@ -1560,12 +1948,16 @@ public class SurfaceControl implements Parcelable {
* @param fromToken The token of a window that currently has touch focus.
* @param toToken The token of the window that should receive touch focus in
* place of the first.
+ * @hide
*/
public Transaction transferTouchFocus(IBinder fromToken, IBinder toToken) {
nativeTransferTouchFocus(mNativeObject, fromToken, toToken);
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setMatrix(SurfaceControl sc,
float dsdx, float dtdx, float dtdy, float dsdy) {
@@ -1575,6 +1967,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setMatrix(SurfaceControl sc, Matrix matrix, float[] float9) {
matrix.getValues(float9);
@@ -1588,6 +1983,7 @@ public class SurfaceControl implements Parcelable {
* Sets the color transform for the Surface.
* @param matrix A float array with 9 values represents a 3x3 transform matrix
* @param translation A float array with 3 values represents a translation vector
+ * @hide
*/
public Transaction setColorTransform(SurfaceControl sc, @Size(9) float[] matrix,
@Size(3) float[] translation) {
@@ -1596,6 +1992,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public Transaction setWindowCrop(SurfaceControl sc, Rect crop) {
sc.checkNotReleased();
@@ -1609,6 +2008,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setWindowCrop(SurfaceControl sc, int width, int height) {
sc.checkNotReleased();
nativeSetWindowCrop(mNativeObject, sc.mNativeObject, 0, 0, width, height);
@@ -1620,6 +2022,7 @@ public class SurfaceControl implements Parcelable {
* @param sc SurfaceControl
* @param cornerRadius Corner radius in pixels.
* @return Itself.
+ * @hide
*/
@UnsupportedAppUsage
public Transaction setCornerRadius(SurfaceControl sc, float cornerRadius) {
@@ -1630,6 +2033,9 @@ public class SurfaceControl implements Parcelable {
}
@UnsupportedAppUsage
+ /**
+ * @hide
+ */
public Transaction setLayerStack(SurfaceControl sc, int layerStack) {
sc.checkNotReleased();
nativeSetLayerStack(mNativeObject, sc.mNativeObject, layerStack);
@@ -1637,6 +2043,9 @@ public class SurfaceControl implements Parcelable {
}
@UnsupportedAppUsage
+ /**
+ * @hide
+ */
public Transaction deferTransactionUntil(SurfaceControl sc, IBinder handle,
long frameNumber) {
if (frameNumber < 0) {
@@ -1648,6 +2057,9 @@ public class SurfaceControl implements Parcelable {
}
@UnsupportedAppUsage
+ /**
+ * @hide
+ */
public Transaction deferTransactionUntilSurface(SurfaceControl sc, Surface barrierSurface,
long frameNumber) {
if (frameNumber < 0) {
@@ -1659,13 +2071,18 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction reparentChildren(SurfaceControl sc, IBinder newParentHandle) {
sc.checkNotReleased();
nativeReparentChildren(mNativeObject, sc.mNativeObject, newParentHandle);
return this;
}
- /** Re-parents a specific child layer to a new parent */
+ /** Re-parents a specific child layer to a new parent
+ * @hide
+ */
public Transaction reparent(SurfaceControl sc, IBinder newParentHandle) {
sc.checkNotReleased();
nativeReparent(mNativeObject, sc.mNativeObject,
@@ -1673,12 +2090,18 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction detachChildren(SurfaceControl sc) {
sc.checkNotReleased();
nativeSeverChildren(mNativeObject, sc.mNativeObject);
return this;
}
+ /**
+ * @hide
+ */
public Transaction setOverrideScalingMode(SurfaceControl sc, int overrideScalingMode) {
sc.checkNotReleased();
nativeSetOverrideScalingMode(mNativeObject, sc.mNativeObject,
@@ -1689,6 +2112,7 @@ public class SurfaceControl implements Parcelable {
/**
* Sets a color for the Surface.
* @param color A float array with three values to represent r, g, b in range [0..1]
+ * @hide
*/
@UnsupportedAppUsage
public Transaction setColor(SurfaceControl sc, @Size(3) float[] color) {
@@ -1703,6 +2127,7 @@ public class SurfaceControl implements Parcelable {
* arrives. As transform matrix and size are already frozen in this fashion,
* this enables totally freezing the surface until the resize has completed
* (at which point the geometry influencing aspects of this transaction will then occur)
+ * @hide
*/
public Transaction setGeometryAppliesWithResize(SurfaceControl sc) {
sc.checkNotReleased();
@@ -1713,6 +2138,7 @@ public class SurfaceControl implements Parcelable {
/**
* Sets the security of the surface. Setting the flag is equivalent to creating the
* Surface with the {@link #SECURE} flag.
+ * @hide
*/
public Transaction setSecure(SurfaceControl sc, boolean isSecure) {
sc.checkNotReleased();
@@ -1727,6 +2153,7 @@ public class SurfaceControl implements Parcelable {
/**
* Sets the opacity of the surface. Setting the flag is equivalent to creating the
* Surface with the {@link #OPAQUE} flag.
+ * @hide
*/
public Transaction setOpaque(SurfaceControl sc, boolean isOpaque) {
sc.checkNotReleased();
@@ -1739,29 +2166,8 @@ public class SurfaceControl implements Parcelable {
}
/**
- * Same as {@link #destroy()} except this is invoked in a transaction instead of
- * immediately.
+ * @hide
*/
- public Transaction destroy(SurfaceControl sc) {
- sc.checkNotReleased();
-
- /**
- * Perhaps it's safer to transfer the close guard to the Transaction
- * but then we have a whole wonky scenario regarding merging, multiple
- * close-guards per transaction etc...the whole scenario is kind of wonky
- * and it seems really we'd like to just be able to call release here
- * but the WindowManager has some code that looks like
- * --- destroyInTransaction(a)
- * --- reparentChildrenInTransaction(a)
- * so we need to ensure the SC remains valid until the transaction
- * is applied.
- */
- sc.mCloseGuard.close();
-
- nativeDestroy(mNativeObject, sc.mNativeObject);
- return this;
- }
-
public Transaction setDisplaySurface(IBinder displayToken, Surface surface) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1777,6 +2183,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setDisplayLayerStack(IBinder displayToken, int layerStack) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1785,6 +2194,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setDisplayProjection(IBinder displayToken,
int orientation, Rect layerStackRect, Rect displayRect) {
if (displayToken == null) {
@@ -1802,6 +2214,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
+ /**
+ * @hide
+ */
public Transaction setDisplaySize(IBinder displayToken, int width, int height) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
@@ -1814,7 +2229,9 @@ public class SurfaceControl implements Parcelable {
return this;
}
- /** flag the transaction as an animation */
+ /** flag the transaction as an animation
+ * @hide
+ */
public Transaction setAnimationTransaction() {
nativeSetAnimationTransaction(mNativeObject);
return this;
@@ -1827,6 +2244,7 @@ public class SurfaceControl implements Parcelable {
* order not to miss frame deadlines.
* <p>
* Corresponds to setting ISurfaceComposer::eEarlyWakeup
+ * @hide
*/
public Transaction setEarlyWakeup() {
nativeSetEarlyWakeup(mNativeObject);
@@ -1836,6 +2254,7 @@ public class SurfaceControl implements Parcelable {
/**
* Merge the other transaction into this transaction, clearing the
* other transaction as if it had been applied.
+ * @hide
*/
public Transaction merge(Transaction other) {
mResizedSurfaces.putAll(other.mResizedSurfaces);
diff --git a/core/java/android/view/SurfaceSession.java b/core/java/android/view/SurfaceSession.java
index a4fa12a57e93..361ac932758e 100644
--- a/core/java/android/view/SurfaceSession.java
+++ b/core/java/android/view/SurfaceSession.java
@@ -30,7 +30,6 @@ public final class SurfaceSession {
private long mNativeClient; // SurfaceComposerClient*
private static native long nativeCreate();
- private static native long nativeCreateScoped(long surfacePtr);
private static native void nativeDestroy(long ptr);
private static native void nativeKill(long ptr);
@@ -40,15 +39,6 @@ public final class SurfaceSession {
mNativeClient = nativeCreate();
}
- public SurfaceSession(Surface root) {
- synchronized (root.mLock) {
- if (root.mNativeObject == 0) {
- throw new IllegalStateException("Surface is not initialized or has been released");
- }
- mNativeClient = nativeCreateScoped(root.mNativeObject);
- }
- }
-
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index a0af83d17abd..61fb00d3fe59 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -547,7 +547,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
if (creating) {
viewRoot.createBoundsSurface(mSubLayer);
- mSurfaceSession = new SurfaceSession(viewRoot.mBoundsSurface);
+ mSurfaceSession = new SurfaceSession();
mDeferredDestroySurfaceControl = mSurfaceControl;
updateOpaqueFlag();
@@ -559,6 +559,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
new SurfaceControl.Builder(mSurfaceSession)
.setBufferSize(mSurfaceWidth, mSurfaceHeight)
.setFormat(mFormat)
+ .setParent(viewRoot.getSurfaceControl())
.setFlags(mSurfaceFlags));
} else if (mSurfaceControl == null) {
return;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 76485f3fd3b7..d8a69d07b995 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -76,8 +76,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.Trace;
+import android.sysprop.DisplayProperties;
import android.text.InputType;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -96,6 +96,7 @@ import android.view.AccessibilityIterators.ParagraphTextSegmentIterator;
import android.view.AccessibilityIterators.TextSegmentIterator;
import android.view.AccessibilityIterators.WordTextSegmentIterator;
import android.view.ContextMenu.ContextMenuInfo;
+import android.view.WindowInsetsAnimationListener.InsetsAnimation;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEventSource;
import android.view.accessibility.AccessibilityManager;
@@ -811,14 +812,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private static final String CONTENT_CAPTURE_LOG_TAG = "View.ContentCapture";
/**
- * When set to true, apps will draw debugging information about their layouts.
- *
- * @hide
- */
- @UnsupportedAppUsage
- public static final String DEBUG_LAYOUT_PROPERTY = "debug.layout";
-
- /**
* When set to true, this view will save its attribute data.
*
* @hide
@@ -939,6 +932,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
private static boolean sAcceptZeroSizeDragShadow;
+ /**
+ * Prior to Q, {@link #dispatchApplyWindowInsets} had some issues:
+ * <ul>
+ * <li>The modified insets changed by {@link #onApplyWindowInsets} were passed to the
+ * entire view hierarchy in prefix order, including siblings as well as siblings of parents
+ * further down the hierarchy. This violates the basic concepts of the view hierarchy, and
+ * thus, the hierarchical dispatching mechanism was hard to use for apps.</li>
+ *
+ * <li>Dispatch was stopped after the insets were fully consumed. This is somewhat confusing
+ * for developers, but more importantly, by adding more granular information to
+ * {@link WindowInsets} it becomes really cumbersome to define what consumed actually means
+ * </li>
+ * </ul>
+ *
+ * In order to make window inset dispatching work properly, we dispatch window insets
+ * in the view hierarchy in a proper hierarchical manner and don't stop dispatching if the
+ * insets are consumed if this flag is set to {@code false}.
+ */
+ static boolean sBrokenInsetsDispatch;
+
/** @hide */
@IntDef({NOT_FOCUSABLE, FOCUSABLE, FOCUSABLE_AUTO})
@Retention(RetentionPolicy.SOURCE)
@@ -4527,6 +4540,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
OnCapturedPointerListener mOnCapturedPointerListener;
private ArrayList<OnUnhandledKeyEventListener> mUnhandledKeyListeners;
+
+ private WindowInsetsAnimationListener mWindowInsetsAnimationListener;
}
@UnsupportedAppUsage
@@ -5108,6 +5123,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
sAcceptZeroSizeDragShadow = targetSdkVersion < Build.VERSION_CODES.P;
+ sBrokenInsetsDispatch = !ViewRootImpl.USE_NEW_INSETS
+ || targetSdkVersion < Build.VERSION_CODES.Q;
+
sCompatibilityDone = true;
}
}
@@ -7660,10 +7678,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Convenience method for sending a {@link AccessibilityEvent#TYPE_ANNOUNCEMENT}
- * {@link AccessibilityEvent} to make an announcement which is related to some
- * sort of a context change for which none of the events representing UI transitions
- * is a good fit. For example, announcing a new page in a book. If accessibility
- * is not enabled this method does nothing.
+ * {@link AccessibilityEvent} to suggest that an accessibility service announce the
+ * specified text to its users.
+ * <p>
+ * Note: The event generated with this API carries no semantic meaning, and is appropriate only
+ * in exceptional situations. Apps can generally achieve correct behavior for accessibility by
+ * accurately supplying the semantics of their UI.
+ * They should not need to specify what exactly is announced to users.
*
* @param text The announcement text.
*/
@@ -8173,6 +8194,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* <p>The populated structure is then passed to the service through
* {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}.
*
+ * <p><b>Note: </b>views that manage a virtual structure under this view must populate just
+ * the node representing this view and return right away, then asynchronously report (not
+ * necessarily in the UI thread) when the children nodes appear, disappear or have their text
+ * changed by calling
+ * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)},
+ * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and
+ * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence, int)}
+ * respectively. The structure for the a child must be created using
+ * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, int)}, and the
+ * {@code autofillId} for a child can be obtained either through
+ * {@code childStructure.getAutofillId()} or
+ * {@link ContentCaptureSession#newAutofillId(AutofillId, int)}.
+ *
* <p><b>Note: </b>the following methods of the {@code structure} will be ignored:
* <ul>
* <li>{@link ViewStructure#setChildCount(int)}
@@ -8185,6 +8219,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* <li>{@link ViewStructure#newHtmlInfoBuilder(String)}
* <li>{@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}
* <li>{@link ViewStructure#setDataIsSensitive(boolean)}
+ * <li>{@link ViewStructure#setAlpha(float)}
+ * <li>{@link ViewStructure#setElevation(float)}
+ * <li>{@link ViewStructure#setTransformation(Matrix)}
+ *
* </ul>
*/
public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) {
@@ -8209,10 +8247,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
} else {
structure.setId(id, null, null, null);
}
- if (viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
- //TODO(b/111276913): STOPSHIP - don't set it if not needed
- structure.setDataIsSensitive(false);
- }
if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL
|| viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
@@ -8253,8 +8287,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
structure.setDimens(ignoredParentLeft + mLeft, ignoredParentTop + mTop, mScrollX, mScrollY,
mRight - mLeft, mBottom - mTop);
- if (viewFor == VIEW_STRUCTURE_FOR_ASSIST
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (viewFor == VIEW_STRUCTURE_FOR_ASSIST) {
if (!hasIdentityMatrix()) {
structure.setTransformation(getMatrix());
}
@@ -8998,11 +9031,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (session == null) return;
if (appeared) {
- if (!isLaidOut() || !isVisibleToUser()
+ if (!isLaidOut() || getVisibility() != VISIBLE
|| (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) {
if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid="
- + isLaidOut() + ", visible=" + isVisibleToUser()
+ + isLaidOut() + ", visibleToUser=" + isVisibleToUser()
+ + ", visible=" + (getVisibility() == VISIBLE)
+ ": alreadyNotifiedAppeared="
+ ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0));
}
@@ -10453,6 +10487,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
+ * Sets a {@link WindowInsetsAnimationListener} to be notified about animations of windows that
+ * cause insets.
+ *
+ * @param listener The listener to set.
+ * @hide pending unhide
+ */
+ public void setWindowInsetsAnimationListener(WindowInsetsAnimationListener listener) {
+ getListenerInfo().mWindowInsetsAnimationListener = listener;
+ }
+
+ void dispatchWindowInsetsAnimationStarted(InsetsAnimation animation) {
+ if (mListenerInfo != null && mListenerInfo.mWindowInsetsAnimationListener != null) {
+ mListenerInfo.mWindowInsetsAnimationListener.onStarted(animation);
+ }
+ }
+
+ WindowInsets dispatchWindowInsetsAnimationProgress(WindowInsets insets) {
+ if (mListenerInfo != null && mListenerInfo.mWindowInsetsAnimationListener != null) {
+ return mListenerInfo.mWindowInsetsAnimationListener.onProgress(insets);
+ } else {
+ return insets;
+ }
+ }
+
+ void dispatchWindowInsetsAnimationFinished(InsetsAnimation animation) {
+ if (mListenerInfo != null && mListenerInfo.mOnApplyWindowInsetsListener != null) {
+ mListenerInfo.mWindowInsetsAnimationListener.onFinished(animation);
+ }
+ }
+
+ /**
* Compute the view's coordinate within the surface.
*
* <p>Computes the coordinates of this view in its surface. The argument
@@ -25057,9 +25122,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
final ViewRootImpl root = mAttachInfo.mViewRootImpl;
- final SurfaceSession session = new SurfaceSession(root.mSurface);
+ final SurfaceSession session = new SurfaceSession();
final SurfaceControl surfaceControl = new SurfaceControl.Builder(session)
.setName("drag surface")
+ .setParent(root.getSurfaceControl())
.setBufferSize(shadowSize.x, shadowSize.y)
.setFormat(PixelFormat.TRANSLUCENT)
.build();
@@ -27767,7 +27833,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Show where the margins, bounds and layout bounds are for each view.
*/
- boolean mDebugLayout = SystemProperties.getBoolean(DEBUG_LAYOUT_PROPERTY, false);
+ boolean mDebugLayout = DisplayProperties.debug_layout().orElse(false);
/**
* Point used to compute visible regions.
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 8372032593b0..0986cfa454b6 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -51,6 +51,7 @@ import android.util.Pools;
import android.util.Pools.SynchronizedPool;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
+import android.view.WindowInsetsAnimationListener.InsetsAnimation;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -7111,6 +7112,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
@Override
public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
insets = super.dispatchApplyWindowInsets(insets);
+ if (View.sBrokenInsetsDispatch) {
+ return brokenDispatchApplyWindowInsets(insets);
+ } else {
+ return newDispatchApplyWindowInsets(insets);
+ }
+ }
+
+ private WindowInsets brokenDispatchApplyWindowInsets(WindowInsets insets) {
if (!insets.isConsumed()) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
@@ -7123,6 +7132,42 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return insets;
}
+ private WindowInsets newDispatchApplyWindowInsets(WindowInsets insets) {
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).dispatchApplyWindowInsets(insets);
+ }
+ return insets;
+ }
+
+ @Override
+ void dispatchWindowInsetsAnimationStarted(InsetsAnimation animation) {
+ super.dispatchWindowInsetsAnimationStarted(animation);
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).dispatchWindowInsetsAnimationStarted(animation);
+ }
+ }
+
+ @Override
+ WindowInsets dispatchWindowInsetsAnimationProgress(WindowInsets insets) {
+ insets = super.dispatchWindowInsetsAnimationProgress(insets);
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).dispatchWindowInsetsAnimationProgress(insets);
+ }
+ return insets;
+ }
+
+ @Override
+ void dispatchWindowInsetsAnimationFinished(InsetsAnimation animation) {
+ super.dispatchWindowInsetsAnimationFinished(animation);
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).dispatchWindowInsetsAnimationFinished(animation);
+ }
+ }
+
/**
* Returns the animation listener to which layout animation events are
* sent.
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 4453613a9bd9..61064a230d8d 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -75,6 +75,7 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
+import android.sysprop.DisplayProperties;
import android.util.AndroidRuntimeException;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -436,6 +437,7 @@ public final class ViewRootImpl implements ViewParent,
// Surface can never be reassigned or cleared (use Surface.clear()).
@UnsupportedAppUsage
public final Surface mSurface = new Surface();
+ private final SurfaceControl mSurfaceControl = new SurfaceControl();
/**
* Child surface of {@code mSurface} with the same bounds as its parent, and crop bounds
@@ -1534,7 +1536,7 @@ public final class ViewRootImpl implements ViewParent,
*/
public void createBoundsSurface(int zOrderLayer) {
if (mSurfaceSession == null) {
- mSurfaceSession = new SurfaceSession(mSurface);
+ mSurfaceSession = new SurfaceSession();
}
if (mBoundsSurfaceControl != null && mBoundsSurface.isValid()) {
return; // surface control for bounds surface already exists.
@@ -1542,6 +1544,7 @@ public final class ViewRootImpl implements ViewParent,
mBoundsSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
.setName("Bounds for - " + getTitle().toString())
+ .setParent(mSurfaceControl)
.build();
setBoundsSurfaceCrop();
@@ -1575,6 +1578,8 @@ public final class ViewRootImpl implements ViewParent,
private void destroySurface() {
mSurface.release();
+ mSurfaceControl.release();
+
mSurfaceSession = null;
if (mBoundsSurfaceControl != null) {
@@ -1863,8 +1868,7 @@ public final class ViewRootImpl implements ViewParent,
mContext.getResources().getConfiguration().isScreenRound(),
mAttachInfo.mAlwaysConsumeNavBar, displayCutout);
} else {
- mLastWindowInsets = new WindowInsets(contentInsets,
- null /* windowDecorInsets */, stableInsets,
+ mLastWindowInsets = new WindowInsets(contentInsets, stableInsets,
mContext.getResources().getConfiguration().isScreenRound(),
mAttachInfo.mAlwaysConsumeNavBar, displayCutout);
}
@@ -6825,7 +6829,12 @@ public final class ViewRootImpl implements ViewParent,
insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
- mPendingMergedConfiguration, mSurface, mTempInsets);
+ mPendingMergedConfiguration, mSurfaceControl, mTempInsets);
+ if (mSurfaceControl.isValid()) {
+ mSurface.copyFrom(mSurfaceControl);
+ } else {
+ destroySurface();
+ }
mPendingAlwaysConsumeNavBar =
(relayoutResult & WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_NAV_BAR) != 0;
@@ -7087,7 +7096,7 @@ public final class ViewRootImpl implements ViewParent,
}
// Layout debugging
- boolean layout = SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false);
+ boolean layout = DisplayProperties.debug_layout().orElse(false);
if (layout != mAttachInfo.mDebugLayout) {
mAttachInfo.mDebugLayout = layout;
if (!mHandler.hasMessages(MSG_INVALIDATE_WORLD)) {
@@ -8507,6 +8516,10 @@ public final class ViewRootImpl implements ViewParent,
mActivityRelaunched = true;
}
+ public SurfaceControl getSurfaceControl() {
+ return mSurfaceControl;
+ }
+
/**
* Class for managing the accessibility interaction connection
* based on the global accessibility state.
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 572d33103cf4..9ac0ca96ce63 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -17,18 +17,33 @@
package android.view;
-import android.annotation.NonNull;
+import static android.view.WindowInsets.Type.FIRST;
+import static android.view.WindowInsets.Type.IME;
+import static android.view.WindowInsets.Type.LAST;
+import static android.view.WindowInsets.Type.SIDE_BARS;
+import static android.view.WindowInsets.Type.SIZE;
+import static android.view.WindowInsets.Type.TOP_BAR;
+import static android.view.WindowInsets.Type.all;
+import static android.view.WindowInsets.Type.compatSystemInsets;
+import static android.view.WindowInsets.Type.indexOf;
+
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.graphics.Insets;
import android.graphics.Rect;
+import android.util.SparseArray;
+import android.view.InsetsState.InternalInsetType;
+import android.view.WindowInsets.Type.InsetType;
+import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethod;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
import java.util.Objects;
/**
@@ -49,9 +64,9 @@ import java.util.Objects;
*/
public final class WindowInsets {
- @NonNull private final Insets mSystemWindowInsets;
- @NonNull private final Insets mWindowDecorInsets;
- @NonNull private final Insets mStableInsets;
+ private final Insets[] mTypeInsetsMap;
+ private final Insets[] mTypeMaxInsetsMap;
+
@Nullable private Rect mTempRect;
private final boolean mIsRound;
@Nullable private final DisplayCutout mDisplayCutout;
@@ -64,7 +79,6 @@ public final class WindowInsets {
private final boolean mAlwaysConsumeNavBar;
private final boolean mSystemWindowInsetsConsumed;
- private final boolean mWindowDecorInsetsConsumed;
private final boolean mStableInsetsConsumed;
private final boolean mDisplayCutoutConsumed;
@@ -78,7 +92,7 @@ public final class WindowInsets {
public static final WindowInsets CONSUMED;
static {
- CONSUMED = new WindowInsets((Insets) null, null, null, false, false, null);
+ CONSUMED = new WindowInsets((Rect) null, null, false, false, null);
}
/**
@@ -87,24 +101,38 @@ public final class WindowInsets {
* A {@code null} inset indicates that the respective inset is consumed.
*
* @hide
+ * @deprecated Use {@link WindowInsets(SparseArray, SparseArray, boolean, boolean, DisplayCutout)}
*/
- public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets, Rect stableInsets,
+ public WindowInsets(Rect systemWindowInsetsRect, Rect stableInsetsRect,
boolean isRound, boolean alwaysConsumeNavBar, DisplayCutout displayCutout) {
- this(insetsOrNull(systemWindowInsets), insetsOrNull(windowDecorInsets),
- insetsOrNull(stableInsets), isRound, alwaysConsumeNavBar, displayCutout);
+ this(createCompatTypeMap(systemWindowInsetsRect), createCompatTypeMap(stableInsetsRect),
+ isRound, alwaysConsumeNavBar, displayCutout);
}
- private WindowInsets(Insets systemWindowInsets, Insets windowDecorInsets,
- Insets stableInsets, boolean isRound, boolean alwaysConsumeNavBar,
- DisplayCutout displayCutout) {
- mSystemWindowInsetsConsumed = systemWindowInsets == null;
- mSystemWindowInsets = mSystemWindowInsetsConsumed ? Insets.NONE : systemWindowInsets;
-
- mWindowDecorInsetsConsumed = windowDecorInsets == null;
- mWindowDecorInsets = mWindowDecorInsetsConsumed ? Insets.NONE : windowDecorInsets;
+ /**
+ * Construct a new WindowInsets from individual insets.
+ *
+ * {@code typeInsetsMap} and {@code typeMaxInsetsMap} are a map of indexOf(type) -> insets that
+ * contain the information what kind of system bars causes how much insets. The insets in this
+ * map are non-additive; i.e. they have the same origin. In other words: If two system bars
+ * overlap on one side, the insets of the larger bar will also include the insets of the smaller
+ * bar.
+ *
+ * {@code null} type inset map indicates that the respective inset is fully consumed.
+ * @hide
+ */
+ public WindowInsets(@Nullable Insets[] typeInsetsMap,
+ @Nullable Insets[] typeMaxInsetsMap, boolean isRound,
+ boolean alwaysConsumeNavBar, DisplayCutout displayCutout) {
+ mSystemWindowInsetsConsumed = typeInsetsMap == null;
+ mTypeInsetsMap = mSystemWindowInsetsConsumed
+ ? new Insets[SIZE]
+ : typeInsetsMap.clone();
- mStableInsetsConsumed = stableInsets == null;
- mStableInsets = mStableInsetsConsumed ? Insets.NONE : stableInsets;
+ mStableInsetsConsumed = typeMaxInsetsMap == null;
+ mTypeMaxInsetsMap = mStableInsetsConsumed
+ ? new Insets[SIZE]
+ : typeMaxInsetsMap.clone();
mIsRound = isRound;
mAlwaysConsumeNavBar = alwaysConsumeNavBar;
@@ -120,10 +148,7 @@ public final class WindowInsets {
* @param src Source to copy insets from
*/
public WindowInsets(WindowInsets src) {
- this(src.mSystemWindowInsetsConsumed ? null : src.mSystemWindowInsets,
- src.mWindowDecorInsetsConsumed ? null : src.mWindowDecorInsets,
- src.mStableInsetsConsumed ? null : src.mStableInsets,
- src.mIsRound, src.mAlwaysConsumeNavBar,
+ this(src.mTypeInsetsMap, src.mTypeMaxInsetsMap, src.mIsRound, src.mAlwaysConsumeNavBar,
displayCutoutCopyConstructorArgument(src));
}
@@ -137,10 +162,64 @@ public final class WindowInsets {
}
}
+ /**
+ * @return The insets that include system bars indicated by {@code typeMask}, taken from
+ * {@code typeInsetMap}.
+ */
+ private static Insets getInsets(Insets[] typeInsetsMap, @InsetType int typeMask) {
+ Insets result = null;
+ for (int i = FIRST; i <= LAST; i = i << 1) {
+ if ((typeMask & i) == 0) {
+ continue;
+ }
+ Insets insets = typeInsetsMap[indexOf(i)];
+ if (insets == null) {
+ continue;
+ }
+ if (result == null) {
+ result = insets;
+ } else {
+ result = Insets.max(result, insets);
+ }
+ }
+ return result == null ? Insets.NONE : result;
+ }
+
+ /**
+ * Sets all entries in {@code typeInsetsMap} that belong to {@code typeMask} to {@code insets},
+ */
+ private static void setInsets(Insets[] typeInsetsMap, @InsetType int typeMask, Insets insets) {
+ for (int i = FIRST; i <= LAST; i = i << 1) {
+ if ((typeMask & i) == 0) {
+ continue;
+ }
+ typeInsetsMap[indexOf(i)] = insets;
+ }
+ }
+
/** @hide */
@UnsupportedAppUsage
public WindowInsets(Rect systemWindowInsets) {
- this(systemWindowInsets, null, null, false, false, null);
+ this(createCompatTypeMap(systemWindowInsets), null, false, false, null);
+ }
+
+ /**
+ * Creates a indexOf(type) -> inset map for which the {@code insets} is just mapped to
+ * {@link InsetType#topBar()} and {@link InsetType#sideBars()}, depending on the location of the
+ * inset.
+ */
+ private static Insets[] createCompatTypeMap(@Nullable Rect insets) {
+ if (insets == null) {
+ return null;
+ }
+ Insets[] typeInsetMap = new Insets[SIZE];
+ assignCompatInsets(typeInsetMap, insets);
+ return typeInsetMap;
+ }
+
+ private static void assignCompatInsets(Insets[] typeInsetMap, Rect insets) {
+ typeInsetMap[indexOf(TOP_BAR)] = Insets.of(0, insets.top, 0, 0);
+ typeInsetMap[indexOf(SIDE_BARS)] = Insets.of(insets.left, 0, insets.right, insets.bottom);
}
/**
@@ -156,8 +235,8 @@ public final class WindowInsets {
if (mTempRect == null) {
mTempRect = new Rect();
}
- mTempRect.set(mSystemWindowInsets.left, mSystemWindowInsets.top,
- mSystemWindowInsets.right, mSystemWindowInsets.bottom);
+ Insets insets = getSystemWindowInsets();
+ mTempRect.set(insets.left, insets.top, insets.right, insets.bottom);
return mTempRect;
}
@@ -172,7 +251,46 @@ public final class WindowInsets {
*/
@NonNull
public Insets getSystemWindowInsets() {
- return mSystemWindowInsets;
+ return getInsets(mTypeInsetsMap, compatSystemInsets());
+ }
+
+ /**
+ * Returns the insets of a specific set of windows causing insets, denoted by the
+ * {@code typeMask} bit mask of {@link InsetType}s.
+ *
+ * @param typeMask Bit mask of {@link InsetType}s to query the insets for.
+ * @return The insets.
+ *
+ * @hide pending unhide
+ */
+ public Insets getInsets(@InsetType int typeMask) {
+ return getInsets(mTypeInsetsMap, typeMask);
+ }
+
+ /**
+ * Returns the maximum amount of insets a specific set of windows can cause, denoted by the
+ * {@code typeMask} bit mask of {@link InsetType}s.
+ *
+ * <p>The maximum insets represents the area of a a window that that <b>may</b> be partially
+ * or fully obscured by the system window identified by {@code type}. This value does not
+ * change based on the visibility state of those elements. for example, if the status bar is
+ * normally shown, but temporarily hidden, the maximum inset will still provide the inset
+ * associated with the status bar being shown.</p>
+ *
+ * @param typeMask Bit mask of {@link InsetType}s to query the insets for.
+ * @return The insets.
+ *
+ * @throws IllegalArgumentException If the caller tries to query {@link Type#ime()}. Maximum
+ * insets are not available for this type as the height of the
+ * IME is dynamic depending on the {@link EditorInfo} of the
+ * currently focused view, as well as the UI state of the IME.
+ * @hide pending unhide
+ */
+ public Insets getMaxInsets(@InsetType int typeMask) throws IllegalArgumentException {
+ if ((typeMask & IME) != 0) {
+ throw new IllegalArgumentException("Unable to query the maximum insets for IME");
+ }
+ return getInsets(mTypeMaxInsetsMap, typeMask);
}
/**
@@ -185,7 +303,7 @@ public final class WindowInsets {
* @return The left system window inset
*/
public int getSystemWindowInsetLeft() {
- return mSystemWindowInsets.left;
+ return getSystemWindowInsets().left;
}
/**
@@ -198,7 +316,7 @@ public final class WindowInsets {
* @return The top system window inset
*/
public int getSystemWindowInsetTop() {
- return mSystemWindowInsets.top;
+ return getSystemWindowInsets().top;
}
/**
@@ -211,7 +329,7 @@ public final class WindowInsets {
* @return The right system window inset
*/
public int getSystemWindowInsetRight() {
- return mSystemWindowInsets.right;
+ return getSystemWindowInsets().right;
}
/**
@@ -224,63 +342,7 @@ public final class WindowInsets {
* @return The bottom system window inset
*/
public int getSystemWindowInsetBottom() {
- return mSystemWindowInsets.bottom;
- }
-
- /**
- * Returns the left window decor inset in pixels.
- *
- * <p>The window decor inset represents the area of the window content area that is
- * partially or fully obscured by decorations within the window provided by the framework.
- * This can include action bars, title bars, toolbars, etc.</p>
- *
- * @return The left window decor inset
- * @hide pending API
- */
- public int getWindowDecorInsetLeft() {
- return mWindowDecorInsets.left;
- }
-
- /**
- * Returns the top window decor inset in pixels.
- *
- * <p>The window decor inset represents the area of the window content area that is
- * partially or fully obscured by decorations within the window provided by the framework.
- * This can include action bars, title bars, toolbars, etc.</p>
- *
- * @return The top window decor inset
- * @hide pending API
- */
- public int getWindowDecorInsetTop() {
- return mWindowDecorInsets.top;
- }
-
- /**
- * Returns the right window decor inset in pixels.
- *
- * <p>The window decor inset represents the area of the window content area that is
- * partially or fully obscured by decorations within the window provided by the framework.
- * This can include action bars, title bars, toolbars, etc.</p>
- *
- * @return The right window decor inset
- * @hide pending API
- */
- public int getWindowDecorInsetRight() {
- return mWindowDecorInsets.right;
- }
-
- /**
- * Returns the bottom window decor inset in pixels.
- *
- * <p>The window decor inset represents the area of the window content area that is
- * partially or fully obscured by decorations within the window provided by the framework.
- * This can include action bars, title bars, toolbars, etc.</p>
- *
- * @return The bottom window decor inset
- * @hide pending API
- */
- public int getWindowDecorInsetBottom() {
- return mWindowDecorInsets.bottom;
+ return getSystemWindowInsets().bottom;
}
/**
@@ -293,23 +355,7 @@ public final class WindowInsets {
* @return true if any of the system window inset values are nonzero
*/
public boolean hasSystemWindowInsets() {
- return mSystemWindowInsets.left != 0 || mSystemWindowInsets.top != 0 ||
- mSystemWindowInsets.right != 0 || mSystemWindowInsets.bottom != 0;
- }
-
- /**
- * Returns true if this WindowInsets has nonzero window decor insets.
- *
- * <p>The window decor inset represents the area of the window content area that is
- * partially or fully obscured by decorations within the window provided by the framework.
- * This can include action bars, title bars, toolbars, etc.</p>
- *
- * @return true if any of the window decor inset values are nonzero
- * @hide pending API
- */
- public boolean hasWindowDecorInsets() {
- return mWindowDecorInsets.left != 0 || mWindowDecorInsets.top != 0 ||
- mWindowDecorInsets.right != 0 || mWindowDecorInsets.bottom != 0;
+ return !getSystemWindowInsets().equals(Insets.NONE);
}
/**
@@ -318,7 +364,8 @@ public final class WindowInsets {
* @return true if any inset values are nonzero
*/
public boolean hasInsets() {
- return hasSystemWindowInsets() || hasWindowDecorInsets() || hasStableInsets()
+ return !getInsets(mTypeInsetsMap, all()).equals(Insets.NONE)
+ || !getInsets(mTypeMaxInsetsMap, all()).equals(Insets.NONE)
|| mDisplayCutout != null;
}
@@ -340,9 +387,8 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets consumeDisplayCutout() {
- return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets,
- mWindowDecorInsetsConsumed ? null : mWindowDecorInsets,
- mStableInsetsConsumed ? null : mStableInsets,
+ return new WindowInsets(mSystemWindowInsetsConsumed ? null : mTypeInsetsMap,
+ mStableInsetsConsumed ? null : mTypeMaxInsetsMap,
mIsRound, mAlwaysConsumeNavBar,
null /* displayCutout */);
}
@@ -362,7 +408,7 @@ public final class WindowInsets {
* @return true if the insets have been fully consumed.
*/
public boolean isConsumed() {
- return mSystemWindowInsetsConsumed && mWindowDecorInsetsConsumed && mStableInsetsConsumed
+ return mSystemWindowInsetsConsumed && mStableInsetsConsumed
&& mDisplayCutoutConsumed;
}
@@ -387,9 +433,7 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets consumeSystemWindowInsets() {
- return new WindowInsets(null /* systemWindowInsets */,
- mWindowDecorInsetsConsumed ? null : mWindowDecorInsets,
- mStableInsetsConsumed ? null : mStableInsets,
+ return new WindowInsets(null, mStableInsetsConsumed ? null : mTypeMaxInsetsMap,
mIsRound, mAlwaysConsumeNavBar,
displayCutoutCopyConstructorArgument(this));
}
@@ -449,18 +493,6 @@ public final class WindowInsets {
}
/**
- * @hide
- */
- @NonNull
- public WindowInsets consumeWindowDecorInsets() {
- return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets,
- null /* windowDecorInsets */,
- mStableInsetsConsumed ? null : mStableInsets,
- mIsRound, mAlwaysConsumeNavBar,
- displayCutoutCopyConstructorArgument(this));
- }
-
- /**
* Returns the stable insets in pixels.
*
* <p>The stable inset represents the area of a full-screen window that <b>may</b> be
@@ -473,7 +505,7 @@ public final class WindowInsets {
*/
@NonNull
public Insets getStableInsets() {
- return mStableInsets;
+ return getInsets(mTypeMaxInsetsMap, compatSystemInsets());
}
/**
@@ -488,7 +520,7 @@ public final class WindowInsets {
* @return The top stable inset
*/
public int getStableInsetTop() {
- return mStableInsets.top;
+ return getStableInsets().top;
}
/**
@@ -503,7 +535,7 @@ public final class WindowInsets {
* @return The left stable inset
*/
public int getStableInsetLeft() {
- return mStableInsets.left;
+ return getStableInsets().left;
}
/**
@@ -518,7 +550,7 @@ public final class WindowInsets {
* @return The right stable inset
*/
public int getStableInsetRight() {
- return mStableInsets.right;
+ return getStableInsets().right;
}
/**
@@ -533,7 +565,7 @@ public final class WindowInsets {
* @return The bottom stable inset
*/
public int getStableInsetBottom() {
- return mStableInsets.bottom;
+ return getStableInsets().bottom;
}
/**
@@ -548,8 +580,7 @@ public final class WindowInsets {
* @return true if any of the stable inset values are nonzero
*/
public boolean hasStableInsets() {
- return mStableInsets.top != 0 || mStableInsets.left != 0 || mStableInsets.right != 0
- || mStableInsets.bottom != 0;
+ return !getStableInsets().equals(Insets.NONE);
}
/**
@@ -559,9 +590,7 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets consumeStableInsets() {
- return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets,
- mWindowDecorInsetsConsumed ? null : mWindowDecorInsets,
- null /* stableInsets */,
+ return new WindowInsets(mSystemWindowInsetsConsumed ? null : mTypeInsetsMap, null,
mIsRound, mAlwaysConsumeNavBar,
displayCutoutCopyConstructorArgument(this));
}
@@ -575,9 +604,8 @@ public final class WindowInsets {
@Override
public String toString() {
- return "WindowInsets{systemWindowInsets=" + mSystemWindowInsets
- + " windowDecorInsets=" + mWindowDecorInsets
- + " stableInsets=" + mStableInsets
+ return "WindowInsets{systemWindowInsets=" + getSystemWindowInsets()
+ + " stableInsets=" + getStableInsets()
+ (mDisplayCutout != null ? " cutout=" + mDisplayCutout : "")
+ (isRound() ? " round" : "")
+ "}";
@@ -634,16 +662,16 @@ public final class WindowInsets {
Preconditions.checkArgumentNonnegative(bottom);
return new WindowInsets(
- mSystemWindowInsetsConsumed ? null :
- insetInsets(mSystemWindowInsets, left, top, right, bottom),
- mWindowDecorInsetsConsumed ? null :
- insetInsets(mWindowDecorInsets, left, top, right, bottom),
- mStableInsetsConsumed ? null :
- insetInsets(mStableInsets, left, top, right, bottom),
+ mSystemWindowInsetsConsumed
+ ? null
+ : insetInsets(mTypeInsetsMap, left, top, right, bottom),
+ mStableInsetsConsumed
+ ? null
+ : insetInsets(mTypeMaxInsetsMap, left, top, right, bottom),
mIsRound, mAlwaysConsumeNavBar,
mDisplayCutoutConsumed
- ? null :
- mDisplayCutout == null
+ ? null
+ : mDisplayCutout == null
? DisplayCutout.NO_CUTOUT
: mDisplayCutout.inset(left, top, right, bottom));
}
@@ -653,23 +681,49 @@ public final class WindowInsets {
if (this == o) return true;
if (o == null || !(o instanceof WindowInsets)) return false;
WindowInsets that = (WindowInsets) o;
+
return mIsRound == that.mIsRound
&& mAlwaysConsumeNavBar == that.mAlwaysConsumeNavBar
&& mSystemWindowInsetsConsumed == that.mSystemWindowInsetsConsumed
- && mWindowDecorInsetsConsumed == that.mWindowDecorInsetsConsumed
&& mStableInsetsConsumed == that.mStableInsetsConsumed
&& mDisplayCutoutConsumed == that.mDisplayCutoutConsumed
- && Objects.equals(mSystemWindowInsets, that.mSystemWindowInsets)
- && Objects.equals(mWindowDecorInsets, that.mWindowDecorInsets)
- && Objects.equals(mStableInsets, that.mStableInsets)
+ && Arrays.equals(mTypeInsetsMap, that.mTypeInsetsMap)
+ && Arrays.equals(mTypeMaxInsetsMap, that.mTypeMaxInsetsMap)
&& Objects.equals(mDisplayCutout, that.mDisplayCutout);
}
@Override
public int hashCode() {
- return Objects.hash(mSystemWindowInsets, mWindowDecorInsets, mStableInsets, mIsRound,
- mDisplayCutout, mAlwaysConsumeNavBar, mSystemWindowInsetsConsumed,
- mWindowDecorInsetsConsumed, mStableInsetsConsumed, mDisplayCutoutConsumed);
+ return Objects.hash(Arrays.hashCode(mTypeInsetsMap), Arrays.hashCode(mTypeMaxInsetsMap),
+ mIsRound, mDisplayCutout, mAlwaysConsumeNavBar, mSystemWindowInsetsConsumed,
+ mStableInsetsConsumed, mDisplayCutoutConsumed);
+ }
+
+
+ /**
+ * Insets every inset in {@code typeInsetsMap} by the specified left, top, right, bottom.
+ *
+ * @return {@code typeInsetsMap} if no inset was modified; a copy of the map with the modified
+ * insets otherwise.
+ */
+ private static Insets[] insetInsets(
+ Insets[] typeInsetsMap, int left, int top, int right, int bottom) {
+ boolean cloned = false;
+ for (int i = 0; i < SIZE; i++) {
+ Insets insets = typeInsetsMap[i];
+ if (insets == null) {
+ continue;
+ }
+ Insets insetInsets = insetInsets(insets, left, top, right, bottom);
+ if (insetInsets != insets) {
+ if (!cloned) {
+ typeInsetsMap = typeInsetsMap.clone();
+ cloned = true;
+ }
+ typeInsetsMap[i] = insetInsets;
+ }
+ }
+ return typeInsetsMap;
}
private static Insets insetInsets(Insets insets, int left, int top, int right, int bottom) {
@@ -683,10 +737,6 @@ public final class WindowInsets {
return Insets.of(newLeft, newTop, newRight, newBottom);
}
- private static Insets insetsOrNull(Rect insets) {
- return insets != null ? Insets.of(insets) : null;
- }
-
/**
* @return whether system window insets have been consumed.
*/
@@ -699,11 +749,13 @@ public final class WindowInsets {
*/
public static class Builder {
- private Insets mSystemWindowInsets;
- private Insets mStableInsets;
+ private final Insets[] mTypeInsetsMap;
+ private final Insets[] mTypeMaxInsetsMap;
+ private boolean mSystemInsetsConsumed = true;
+ private boolean mStableInsetsConsumed = true;
+
private DisplayCutout mDisplayCutout;
- private Insets mWindowDecorInsets;
private boolean mIsRound;
private boolean mAlwaysConsumeNavBar;
@@ -711,6 +763,8 @@ public final class WindowInsets {
* Creates a builder where all insets are initially consumed.
*/
public Builder() {
+ mTypeInsetsMap = new Insets[SIZE];
+ mTypeMaxInsetsMap = new Insets[SIZE];
}
/**
@@ -719,12 +773,11 @@ public final class WindowInsets {
* @param insets the instance to initialize from.
*/
public Builder(WindowInsets insets) {
- mSystemWindowInsets = insets.mSystemWindowInsetsConsumed ? null
- : insets.mSystemWindowInsets;
- mStableInsets = insets.mStableInsetsConsumed ? null : insets.mStableInsets;
+ mTypeInsetsMap = insets.mTypeInsetsMap.clone();
+ mTypeMaxInsetsMap = insets.mTypeMaxInsetsMap.clone();
+ mSystemInsetsConsumed = insets.mSystemWindowInsetsConsumed;
+ mStableInsetsConsumed = insets.mStableInsetsConsumed;
mDisplayCutout = displayCutoutCopyConstructorArgument(insets);
- mWindowDecorInsets = insets.mWindowDecorInsetsConsumed ? null
- : insets.mWindowDecorInsets;
mIsRound = insets.mIsRound;
mAlwaysConsumeNavBar = insets.mAlwaysConsumeNavBar;
}
@@ -742,7 +795,66 @@ public final class WindowInsets {
@NonNull
public Builder setSystemWindowInsets(@NonNull Insets systemWindowInsets) {
Preconditions.checkNotNull(systemWindowInsets);
- mSystemWindowInsets = systemWindowInsets;
+ assignCompatInsets(mTypeInsetsMap, systemWindowInsets.toRect());
+ mSystemInsetsConsumed = false;
+ return this;
+ }
+
+ /**
+ * Sets the insets of a specific window type in pixels.
+ *
+ * <p>The insets represents the area of a a window that is partially or fully obscured by
+ * the system windows identified by {@code typeMask}.
+ * </p>
+ *
+ * @see #getInsets(int)
+ *
+ * @param typeMask The bitmask of {@link InsetType} to set the insets for.
+ * @param insets The insets to set.
+ *
+ * @return itself
+ * @hide pending unhide
+ */
+ @NonNull
+ public Builder setInsets(@InsetType int typeMask, @NonNull Insets insets) {
+ Preconditions.checkNotNull(insets);
+ WindowInsets.setInsets(mTypeInsetsMap, typeMask, insets);
+ mSystemInsetsConsumed = false;
+ return this;
+ }
+
+ /**
+ * Sets the maximum amount of insets a specific window type in pixels.
+ *
+ * <p>The maximum insets represents the area of a a window that that <b>may</b> be partially
+ * or fully obscured by the system windows identified by {@code typeMask}. This value does
+ * not change based on the visibility state of those elements. for example, if the status
+ * bar is normally shown, but temporarily hidden, the maximum inset will still provide the
+ * inset associated with the status bar being shown.</p>
+ *
+ * @see #getMaxInsets(int)
+ *
+ * @param typeMask The bitmask of {@link InsetType} to set the insets for.
+ * @param insets The insets to set.
+ *
+ * @return itself
+ *
+ * @throws IllegalArgumentException If {@code typeMask} contains {@link Type#ime()}. Maximum
+ * insets are not available for this type as the height of
+ * the IME is dynamic depending on the {@link EditorInfo}
+ * of the currently focused view, as well as the UI
+ * state of the IME.
+ * @hide pending unhide
+ */
+ @NonNull
+ public Builder setMaxInsets(@InsetType int typeMask, @NonNull Insets insets)
+ throws IllegalArgumentException{
+ if (typeMask == IME) {
+ throw new IllegalArgumentException("Maximum inset not available for IME");
+ }
+ Preconditions.checkNotNull(insets);
+ WindowInsets.setInsets(mTypeMaxInsetsMap, typeMask, insets);
+ mStableInsetsConsumed = false;
return this;
}
@@ -761,7 +873,8 @@ public final class WindowInsets {
@NonNull
public Builder setStableInsets(@NonNull Insets stableInsets) {
Preconditions.checkNotNull(stableInsets);
- mStableInsets = stableInsets;
+ assignCompatInsets(mTypeMaxInsetsMap, stableInsets.toRect());
+ mStableInsetsConsumed = false;
return this;
}
@@ -780,14 +893,6 @@ public final class WindowInsets {
/** @hide */
@NonNull
- public Builder setWindowDecorInsets(@NonNull Insets windowDecorInsets) {
- Preconditions.checkNotNull(windowDecorInsets);
- mWindowDecorInsets = windowDecorInsets;
- return this;
- }
-
- /** @hide */
- @NonNull
public Builder setRound(boolean round) {
mIsRound = round;
return this;
@@ -807,8 +912,9 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets build() {
- return new WindowInsets(mSystemWindowInsets, mWindowDecorInsets, mStableInsets,
- mIsRound, mAlwaysConsumeNavBar, mDisplayCutout);
+ return new WindowInsets(mSystemInsetsConsumed ? null : mTypeInsetsMap,
+ mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mIsRound,
+ mAlwaysConsumeNavBar, mDisplayCutout);
}
}
@@ -818,10 +924,31 @@ public final class WindowInsets {
*/
public static final class Type {
- static final int TOP_BAR = 0x1;
+ static final int FIRST = 0x1;
+ static final int TOP_BAR = FIRST;
+
static final int IME = 0x2;
static final int SIDE_BARS = 0x4;
- static final int WINDOW_DECOR = 0x8;
+
+ static final int LAST = 0x8;
+ static final int SIZE = 4;
+ static final int WINDOW_DECOR = LAST;
+
+ static int indexOf(@InsetType int type) {
+ switch (type) {
+ case TOP_BAR:
+ return 0;
+ case IME:
+ return 1;
+ case SIDE_BARS:
+ return 2;
+ case WINDOW_DECOR:
+ return 3;
+ default:
+ throw new IllegalArgumentException("type needs to be >= FIRST and <= LAST,"
+ + " type=" + type);
+ }
+ }
private Type() {
}
@@ -870,6 +997,15 @@ public final class WindowInsets {
}
/**
+ * @return Inset types representing the list of bars that traditionally were denoted as
+ * system insets.
+ * @hide
+ */
+ static @InsetType int compatSystemInsets() {
+ return TOP_BAR | SIDE_BARS | IME;
+ }
+
+ /**
* @return All inset types combined.
*/
public static @InsetType int all() {
diff --git a/core/java/android/view/WindowInsetsAnimationController.java b/core/java/android/view/WindowInsetsAnimationController.java
index 9de517dac5de..cf4415d2b2ba 100644
--- a/core/java/android/view/WindowInsetsAnimationController.java
+++ b/core/java/android/view/WindowInsetsAnimationController.java
@@ -19,6 +19,7 @@ package android.view;
import android.annotation.NonNull;
import android.graphics.Insets;
import android.view.WindowInsets.Type.InsetType;
+import android.view.WindowInsetsAnimationListener.InsetsAnimation;
/**
* Interface to control a window inset animation frame-by-frame.
@@ -28,8 +29,13 @@ public interface WindowInsetsAnimationController {
/**
* Retrieves the {@link Insets} when the windows this animation is controlling are fully hidden.
+ * <p>
+ * If there are any animation listeners registered, this value is the same as
+ * {@link InsetsAnimation#getLowerBound()} that will be passed into the callbacks.
*
* @return Insets when the windows this animation is controlling are fully hidden.
+ *
+ * @see InsetsAnimation#getLowerBound()
*/
@NonNull Insets getHiddenStateInsets();
@@ -38,8 +44,13 @@ public interface WindowInsetsAnimationController {
* <p>
* In case the size of a window causing insets is changing in the middle of the animation, we
* execute that height change after this animation has finished.
+ * <p>
+ * If there are any animation listeners registered, this value is the same as
+ * {@link InsetsAnimation#getUpperBound()} that will be passed into the callbacks.
*
* @return Insets when the windows this animation is controlling are fully shown.
+ *
+ * @see InsetsAnimation#getUpperBound()
*/
@NonNull Insets getShownStateInsets();
@@ -59,8 +70,11 @@ public interface WindowInsetsAnimationController {
* <p>
* Note that this will <b>not</b> inform the view system of a full inset change via
* {@link View#dispatchApplyWindowInsets} in order to avoid a full layout pass during the
- * animation. If you'd like to animate views during a window inset animation, use
- * TODO add link to animation listeners.
+ * animation. If you'd like to animate views during a window inset animation, register a
+ * {@link WindowInsetsAnimationListener} by calling
+ * {@link View#setWindowInsetsAnimationListener(WindowInsetsAnimationListener)} that will be
+ * notified about any insets change via {@link WindowInsetsAnimationListener#onProgress} during
+ * the animation.
* <p>
* {@link View#dispatchApplyWindowInsets} will instead be called once the animation has
* finished, i.e. once {@link #finish} has been called.
@@ -70,6 +84,9 @@ public interface WindowInsetsAnimationController {
* the resulting insets of that configuration will match the passed in parameter.
* Note that these insets are being clamped to the range from
* {@link #getHiddenStateInsets} to {@link #getShownStateInsets}
+ *
+ * @see WindowInsetsAnimationListener
+ * @see View#setWindowInsetsAnimationListener(WindowInsetsAnimationListener)
*/
void changeInsets(@NonNull Insets insets);
diff --git a/core/java/android/view/WindowInsetsAnimationListener.java b/core/java/android/view/WindowInsetsAnimationListener.java
new file mode 100644
index 000000000000..682ab5bfb63c
--- /dev/null
+++ b/core/java/android/view/WindowInsetsAnimationListener.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.graphics.Insets;
+
+/**
+ * Interface that allows the application to listen to animation events for windows that cause
+ * insets.
+ * @hide pending unhide
+ */
+public interface WindowInsetsAnimationListener {
+
+ /**
+ * Called when an inset animation gets started.
+ *
+ * @param animation The animation that is about to start.
+ */
+ void onStarted(InsetsAnimation animation);
+
+ /**
+ * Called when the insets change as part of running an animation. Note that even if multiple
+ * animations for different types are running, there will only be one progress callback per
+ * frame. The {@code insets} passed as an argument represents the overall state and will include
+ * all types, regardless of whether they are animating or not.
+ * <p>
+ * Note that insets dispatch is hierarchical: It will start at the root of the view hierarchy,
+ * and then traverse it and invoke the callback of the specific {@link View} being traversed.
+ * The callback may return a modified instance by calling {@link WindowInsets#inset(int, int, int, int)}
+ * to indicate that a part of the insets have been used to offset or clip its children, and the
+ * children shouldn't worry about that part anymore.
+ *
+ * @param insets The current insets.
+ * @return The insets to dispatch to the subtree of the hierarchy.
+ */
+ WindowInsets onProgress(WindowInsets insets);
+
+ /**
+ * Called when an inset animation has finished.
+ *
+ * @param animation The animation that has finished running.
+ */
+ void onFinished(InsetsAnimation animation);
+
+ /**
+ * Class representing an animation of a set of windows that cause insets.
+ */
+ class InsetsAnimation {
+
+ private final @WindowInsets.Type.InsetType int mTypeMask;
+ private final Insets mLowerBound;
+ private final Insets mUpperBound;
+
+ /**
+ * @hide
+ */
+ InsetsAnimation(int typeMask, Insets lowerBound, Insets upperBound) {
+ mTypeMask = typeMask;
+ mLowerBound = lowerBound;
+ mUpperBound = upperBound;
+ }
+
+ /**
+ * @return The bitmask of {@link WindowInsets.Type.InsetType}s that are animating.
+ */
+ public @WindowInsets.Type.InsetType int getTypeMask() {
+ return mTypeMask;
+ }
+
+ /**
+ * Queries the lower inset bound of the animation. If the animation is about showing or
+ * hiding a window that cause insets, the lower bound is {@link Insets#NONE} and the upper
+ * bound is the same as {@link WindowInsets#getInsets(int)} for the fully shown state. This
+ * is the same as {@link WindowInsetsAnimationController#getHiddenStateInsets} and
+ * {@link WindowInsetsAnimationController#getShownStateInsets} in case the listener gets
+ * invoked because of an animation that originates from
+ * {@link WindowInsetsAnimationController}.
+ * <p>
+ * However, if the size of a window that causes insets is changing, these are the
+ * lower/upper bounds of that size animation.
+ * <p>
+ * There are no overlapping animations for a specific type, but there may be two animations
+ * running at the same time for different inset types.
+ *
+ * @see #getUpperBound()
+ * @see WindowInsetsAnimationController#getHiddenStateInsets
+ * TODO: It's a bit weird that these are global per window but onProgress is hierarchical.
+ * TODO: If multiple types are animating, querying the bound per type isn't possible. Should
+ * we:
+ * 1. Offer bounds by type here?
+ * 2. Restrict one animation to one single type only?
+ * Returning WindowInsets here isn't feasible in case of overlapping animations: We can't
+ * fill in the insets for the types from the other animation into the WindowInsets object
+ * as it's changing as well.
+ */
+ public Insets getLowerBound() {
+ return mLowerBound;
+ }
+
+ /**
+ * @see #getLowerBound()
+ * @see WindowInsetsAnimationController#getShownStateInsets
+ */
+ public Insets getUpperBound() {
+ return mUpperBound;
+ }
+ }
+}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index d7c8aed8caec..793c31523023 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -43,6 +43,7 @@ import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Log;
import android.util.LongArray;
import android.util.Pools.SynchronizedPool;
import android.view.TouchDelegate;
@@ -91,6 +92,8 @@ public class AccessibilityNodeInfo implements Parcelable {
private static final boolean DEBUG = false;
+ private static final String TAG = "AccessibilityNodeInfo";
+
/** @hide */
public static final int UNDEFINED_CONNECTION_ID = -1;
@@ -990,6 +993,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* <strong>Note:</strong> Cannot be called from an
* {@link android.accessibilityservice.AccessibilityService}.
* This class is made immutable before being delivered to an AccessibilityService.
+ * Note that a view cannot be made its own child.
* </p>
*
* @param child The child.
@@ -1037,6 +1041,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* hierarchy for accessibility purposes. This enables custom views that draw complex
* content to report them selves as a tree of virtual views, thus conveying their
* logical structure.
+ * Note that a view cannot be made its own child.
* </p>
*
* @param root The root of the virtual subtree.
@@ -1054,6 +1059,11 @@ public class AccessibilityNodeInfo implements Parcelable {
final int rootAccessibilityViewId =
(root != null) ? root.getAccessibilityViewId() : UNDEFINED_ITEM_ID;
final long childNodeId = makeNodeId(rootAccessibilityViewId, virtualDescendantId);
+ if (childNodeId == mSourceNodeId) {
+ Log.e(TAG, "Rejecting attempt to make a View its own child");
+ return;
+ }
+
// If we're checking uniqueness and the ID already exists, abort.
if (checked && mChildNodeIds.indexOf(childNodeId) >= 0) {
return;
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index 95a346f34d24..dfd9a2e95cb7 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -187,6 +187,7 @@ public abstract class Animation implements Cloneable {
/**
* An animation listener to be notified when the animation starts, ends or repeats.
*/
+ @UnsupportedAppUsage
private AnimationListener mListener;
/**
@@ -794,7 +795,7 @@ public abstract class Animation implements Cloneable {
* @deprecated All window animations are running with detached wallpaper.
*/
public boolean getDetachWallpaper() {
- return false;
+ return true;
}
/**
diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java
index cb1d89c54d9a..9c935af09cca 100644
--- a/core/java/android/view/autofill/AutofillId.java
+++ b/core/java/android/view/autofill/AutofillId.java
@@ -15,6 +15,7 @@
*/
package android.view.autofill;
+import android.annotation.NonNull;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -25,33 +26,47 @@ import android.view.View;
*/
public final class AutofillId implements Parcelable {
+ /** @hide */
+ public static final int NO_SESSION = 0;
+
+ private static final int FLAG_IS_VIRTUAL = 0x1;
+ private static final int FLAG_HAS_SESSION = 0x2;
+
private final int mViewId;
- private final boolean mVirtual;
+ private final int mFlags;
private final int mVirtualId;
+ private final int mSessionId;
/** @hide */
@TestApi
public AutofillId(int id) {
- mVirtual = false;
- mViewId = id;
- mVirtualId = View.NO_ID;
+ this(/* flags= */ 0, id, View.NO_ID, NO_SESSION);
}
/** @hide */
@TestApi
- public AutofillId(AutofillId parent, int virtualChildId) {
- mVirtual = true;
- mViewId = parent.mViewId;
- mVirtualId = virtualChildId;
+ public AutofillId(@NonNull AutofillId parent, int virtualChildId) {
+ this(FLAG_IS_VIRTUAL, parent.mViewId, virtualChildId, NO_SESSION);
}
/** @hide */
public AutofillId(int parentId, int virtualChildId) {
- mVirtual = true;
+ this(FLAG_IS_VIRTUAL, parentId, virtualChildId, NO_SESSION);
+ }
+
+ /** @hide */
+ public AutofillId(@NonNull AutofillId parent, int virtualChildId, int sessionId) {
+ this(FLAG_IS_VIRTUAL | FLAG_HAS_SESSION, parent.mViewId, virtualChildId, sessionId);
+ }
+
+ private AutofillId(int flags, int parentId, int virtualChildId, int sessionId) {
+ mFlags = flags;
mViewId = parentId;
mVirtualId = virtualChildId;
+ mSessionId = sessionId;
}
+
/** @hide */
public int getViewId() {
return mViewId;
@@ -64,7 +79,16 @@ public final class AutofillId implements Parcelable {
/** @hide */
public boolean isVirtual() {
- return mVirtual;
+ return (mFlags & FLAG_IS_VIRTUAL) != 0;
+ }
+
+ private boolean hasSession() {
+ return (mFlags & FLAG_HAS_SESSION) != 0;
+ }
+
+ /** @hide */
+ public int getSessionId() {
+ return mSessionId;
}
/////////////////////////////////
@@ -77,6 +101,7 @@ public final class AutofillId implements Parcelable {
int result = 1;
result = prime * result + mViewId;
result = prime * result + mVirtualId;
+ result = prime * result + mSessionId;
return result;
}
@@ -88,15 +113,19 @@ public final class AutofillId implements Parcelable {
final AutofillId other = (AutofillId) obj;
if (mViewId != other.mViewId) return false;
if (mVirtualId != other.mVirtualId) return false;
+ if (mSessionId != other.mSessionId) return false;
return true;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder().append(mViewId);
- if (mVirtual) {
+ if (isVirtual()) {
builder.append(':').append(mVirtualId);
}
+ if (hasSession()) {
+ builder.append('@').append(mSessionId);
+ }
return builder.toString();
}
@@ -108,21 +137,24 @@ public final class AutofillId implements Parcelable {
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mViewId);
- parcel.writeInt(mVirtual ? 1 : 0);
- parcel.writeInt(mVirtualId);
- }
-
- private AutofillId(Parcel parcel) {
- mViewId = parcel.readInt();
- mVirtual = parcel.readInt() == 1;
- mVirtualId = parcel.readInt();
+ parcel.writeInt(mFlags);
+ if (isVirtual()) {
+ parcel.writeInt(mVirtualId);
+ }
+ if (hasSession()) {
+ parcel.writeInt(mSessionId);
+ }
}
public static final Parcelable.Creator<AutofillId> CREATOR =
new Parcelable.Creator<AutofillId>() {
@Override
public AutofillId createFromParcel(Parcel source) {
- return new AutofillId(source);
+ final int viewId = source.readInt();
+ final int flags = source.readInt();
+ final int virtualId = (flags & FLAG_IS_VIRTUAL) != 0 ? source.readInt() : View.NO_ID;
+ final int sessionId = (flags & FLAG_HAS_SESSION) != 0 ? source.readInt() : NO_SESSION;
+ return new AutofillId(flags, viewId, virtualId, sessionId);
}
@Override
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 56f973eb9e46..888a4c57751e 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -26,6 +26,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -62,6 +63,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.IResultReceiver;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.SyncResultReceiver;
import org.xmlpull.v1.XmlPullParserException;
@@ -75,8 +77,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+
//TODO: use java.lang.ref.Cleaner once Android supports Java 9
import sun.misc.Cleaner;
@@ -324,6 +325,17 @@ public final class AutofillManager {
public static final int FC_SERVICE_TIMEOUT = 5000;
/**
+ * Timeout for calls to system_server.
+ */
+ private static final int SYNC_CALLS_TIMEOUT_MS = 5000;
+
+ /**
+ * @hide
+ */
+ @TestApi
+ public static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes
+
+ /**
* Makes an authentication id from a request id and a dataset id.
*
* @param requestId The request id.
@@ -612,7 +624,8 @@ public final class AutofillManager {
final AutofillClient client = getClient();
if (client != null) {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(
+ SYNC_CALLS_TIMEOUT_MS);
try {
mService.restoreSession(mSessionId, client.autofillClientGetActivityToken(),
mServiceClient.asBinder(), receiver);
@@ -732,9 +745,9 @@ public final class AutofillManager {
*/
@Nullable public FillEventHistory getFillEventHistory() {
try {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
mService.getFillEventHistory(receiver);
- return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
+ return receiver.getParcelableResult();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1287,7 +1300,7 @@ public final class AutofillManager {
public boolean hasEnabledAutofillServices() {
if (mService == null) return false;
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.isServiceEnabled(mContext.getUserId(), mContext.getPackageName(), receiver);
return receiver.getIntResult() == 1;
@@ -1304,10 +1317,10 @@ public final class AutofillManager {
public ComponentName getAutofillServiceComponentName() {
if (mService == null) return null;
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.getAutofillServiceComponentName(receiver);
- return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
+ return receiver.getParcelableResult();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1330,9 +1343,9 @@ public final class AutofillManager {
*/
@Nullable public String getUserDataId() {
try {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
mService.getUserDataId(receiver);
- return receiver.getObjectResult(SyncResultReceiver.TYPE_STRING);
+ return receiver.getStringResult();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1352,9 +1365,9 @@ public final class AutofillManager {
*/
@Nullable public UserData getUserData() {
try {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
mService.getUserData(receiver);
- return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
+ return receiver.getParcelableResult();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1390,7 +1403,7 @@ public final class AutofillManager {
* the user.
*/
public boolean isFieldClassificationEnabled() {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.isFieldClassificationEnabled(receiver);
return receiver.getIntResult() == 1;
@@ -1413,10 +1426,10 @@ public final class AutofillManager {
*/
@Nullable
public String getDefaultFieldClassificationAlgorithm() {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.getDefaultFieldClassificationAlgorithm(receiver);
- return receiver.getObjectResult(SyncResultReceiver.TYPE_STRING);
+ return receiver.getStringResult();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1433,11 +1446,10 @@ public final class AutofillManager {
*/
@NonNull
public List<String> getAvailableFieldClassificationAlgorithms() {
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.getAvailableFieldClassificationAlgorithms(receiver);
- final String[] algorithms = receiver
- .getObjectResult(SyncResultReceiver.TYPE_STRING_ARRAY);
+ final String[] algorithms = receiver.getStringArrayResult();
return algorithms != null ? Arrays.asList(algorithms) : Collections.emptyList();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
@@ -1458,7 +1470,7 @@ public final class AutofillManager {
public boolean isAutofillSupported() {
if (mService == null) return false;
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
try {
mService.isServiceSupported(mContext.getUserId(), receiver);
return receiver.getIntResult() == 1;
@@ -1582,7 +1594,7 @@ public final class AutofillManager {
final AutofillClient client = getClient();
if (client == null) return; // NOTE: getClient() already logged it..
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
mService.startSession(client.autofillClientGetActivityToken(),
mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(),
mCallback != null, flags, client.autofillClientGetComponentName(),
@@ -1665,7 +1677,7 @@ public final class AutofillManager {
mServiceClient = new AutofillManagerClient(this);
try {
final int userId = mContext.getUserId();
- final SyncResultReceiver receiver = new SyncResultReceiver();
+ final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
mService.addClient(mServiceClient, userId, receiver);
final int flags = receiver.getIntResult();
mEnabled = (flags & FLAG_ADD_CLIENT_ENABLED) != 0;
@@ -2985,105 +2997,23 @@ public final class AutofillManager {
afm.post(() -> afm.autofill(sessionId, ids, values));
}
}
- }
-
- /**
- * @hide
- */
- public static final class SyncResultReceiver extends IResultReceiver.Stub {
-
- private static final String EXTRA = "EXTRA";
- /**
- * How long to block waiting for {@link IResultReceiver} callbacks when calling server.
- */
- private static final long BINDER_TIMEOUT_MS = 5000;
-
- private static final int TYPE_STRING = 0;
- private static final int TYPE_STRING_ARRAY = 1;
- private static final int TYPE_PARCELABLE = 2;
-
- private final CountDownLatch mLatch = new CountDownLatch(1);
- private int mResult;
- private Bundle mBundle;
-
- private void waitResult() {
- try {
- if (!mLatch.await(BINDER_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
- throw new IllegalStateException("Not called in " + BINDER_TIMEOUT_MS + "ms");
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
-
- /**
- * Gets the result from an operation that returns an {@code int}.
- */
- int getIntResult() {
- waitResult();
- return mResult;
- }
-
- /**
- * Gets the result from an operation that returns an {@code Object}.
- *
- * @param type type of expected object.
- */
- @Nullable
- @SuppressWarnings("unchecked")
- <T> T getObjectResult(int type) {
- waitResult();
- if (mBundle == null) {
- return null;
- }
- switch (type) {
- case TYPE_STRING:
- return (T) mBundle.getString(EXTRA);
- case TYPE_STRING_ARRAY:
- return (T) mBundle.getStringArray(EXTRA);
- case TYPE_PARCELABLE:
- return (T) mBundle.getParcelable(EXTRA);
- default:
- throw new IllegalArgumentException("unsupported type: " + type);
+ @Override
+ public void requestShowFillUi(int sessionId, AutofillId id, int width, int height,
+ Rect anchorBounds, IAutofillWindowPresenter presenter) {
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.post(() -> afm.requestShowFillUi(sessionId, id, width, height, anchorBounds,
+ presenter));
}
}
@Override
- public void send(int resultCode, Bundle resultData) {
- mResult = resultCode;
- mBundle = resultData;
- mLatch.countDown();
- }
-
- /**
- * Creates a bundle for a {@code String} value.
- */
- @NonNull
- public static Bundle bundleFor(@Nullable String value) {
- final Bundle bundle = new Bundle();
- bundle.putString(EXTRA, value);
- return bundle;
- }
-
- /**
- * Creates a bundle for a {@code String[]} value.
- */
- @NonNull
- public static Bundle bundleFor(@Nullable String[] value) {
- final Bundle bundle = new Bundle();
- bundle.putStringArray(EXTRA, value);
- return bundle;
- }
-
- /**
- * Creates a bundle for a {@code Parcelable} value.
- */
- @NonNull
- public static Bundle bundleFor(@Nullable Parcelable value) {
- final Bundle bundle = new Bundle();
- bundle.putParcelable(EXTRA, value);
- return bundle;
+ public void requestHideFillUi(int sessionId, AutofillId id) {
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.post(() -> afm.requestHideFillUi(id, false));
+ }
}
}
}
diff --git a/core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl b/core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl
index 67cd0bf87b99..140507c80ed0 100644
--- a/core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl
@@ -21,6 +21,7 @@ import java.util.List;
import android.graphics.Rect;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
+import android.view.autofill.IAutofillWindowPresenter;
/**
* Object running in the application process and responsible to provide the functionalities
@@ -29,6 +30,24 @@ import android.view.autofill.AutofillValue;
* @hide
*/
interface IAugmentedAutofillManagerClient {
- Rect getViewCoordinates(in AutofillId id);
- void autofill(int sessionId, in List<AutofillId> ids, in List<AutofillValue> values);
+ /**
+ * Gets the coordinates of the input field view.
+ */
+ Rect getViewCoordinates(in AutofillId id);
+
+ /**
+ * Autofills the activity with the contents of the values.
+ */
+ void autofill(int sessionId, in List<AutofillId> ids, in List<AutofillValue> values);
+
+ /**
+ * Requests showing the fill UI.
+ */
+ void requestShowFillUi(int sessionId, in AutofillId id, int width, int height,
+ in Rect anchorBounds, in IAutofillWindowPresenter presenter);
+
+ /**
+ * Requests hiding the fill UI.
+ */
+ void requestHideFillUi(int sessionId, in AutofillId id);
}
diff --git a/core/java/android/view/contentcapture/ChildContentCaptureSession.java b/core/java/android/view/contentcapture/ChildContentCaptureSession.java
index 51668319cde2..63c21f352e74 100644
--- a/core/java/android/view/contentcapture/ChildContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ChildContentCaptureSession.java
@@ -33,7 +33,7 @@ import java.io.PrintWriter;
final class ChildContentCaptureSession extends ContentCaptureSession {
@NonNull
- private final MainContentCaptureSession mParent;
+ private final ContentCaptureSession mParent;
/**
* {@link ContentCaptureContext} set by client, or {@code null} when it's the
@@ -46,46 +46,55 @@ final class ChildContentCaptureSession extends ContentCaptureSession {
private final ContentCaptureContext mClientContext;
/** @hide */
- protected ChildContentCaptureSession(@NonNull MainContentCaptureSession parent,
+ protected ChildContentCaptureSession(@NonNull ContentCaptureSession parent,
@NonNull ContentCaptureContext clientContext) {
mParent = parent;
mClientContext = Preconditions.checkNotNull(clientContext);
}
@Override
- ContentCaptureSession newChild(@NonNull ContentCaptureContext context) {
- // TODO(b/121033016): implement it
- throw new UnsupportedOperationException("grand-children not implemented yet");
+ MainContentCaptureSession getMainCaptureSession() {
+ if (mParent instanceof MainContentCaptureSession) {
+ return (MainContentCaptureSession) mParent;
+ }
+ return mParent.getMainCaptureSession();
}
@Override
- void flush() {
- mParent.flush();
+ ContentCaptureSession newChild(@NonNull ContentCaptureContext clientContext) {
+ final ContentCaptureSession child = new ChildContentCaptureSession(this, clientContext);
+ getMainCaptureSession().notifyChildSessionStarted(mId, child.mId, clientContext);
+ return child;
+ }
+
+ @Override
+ void flush(@FlushReason int reason) {
+ mParent.flush(reason);
}
@Override
void onDestroy() {
- mParent.notifyChildSessionFinished(mParent.mId, mId);
+ getMainCaptureSession().notifyChildSessionFinished(mParent.mId, mId);
}
@Override
void internalNotifyViewAppeared(@NonNull ViewStructureImpl node) {
- mParent.notifyViewAppeared(mId, node);
+ getMainCaptureSession().notifyViewAppeared(mId, node);
}
@Override
void internalNotifyViewDisappeared(@NonNull AutofillId id) {
- mParent.notifyViewDisappeared(mId, id);
+ getMainCaptureSession().notifyViewDisappeared(mId, id);
}
@Override
- void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
- int flags) {
- mParent.notifyViewTextChanged(mId, id, text, flags);
+ void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text) {
+ getMainCaptureSession().notifyViewTextChanged(mId, id, text);
}
+
@Override
boolean isContentCaptureEnabled() {
- return mParent.isContentCaptureEnabled();
+ return getMainCaptureSession().isContentCaptureEnabled();
}
@Override
diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java
index 9e3da9234b58..43963c3054e5 100644
--- a/core/java/android/view/contentcapture/ContentCaptureEvent.java
+++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Log;
import android.view.autofill.AutofillId;
import com.android.internal.util.Preconditions;
@@ -28,11 +29,15 @@ import com.android.internal.util.Preconditions;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
/** @hide */
@SystemApi
public final class ContentCaptureEvent implements Parcelable {
+ private static final String TAG = ContentCaptureEvent.class.getSimpleName();
+
/** @hide */
public static final int TYPE_SESSION_FINISHED = -2;
/** @hide */
@@ -46,9 +51,11 @@ public final class ContentCaptureEvent implements Parcelable {
public static final int TYPE_VIEW_APPEARED = 1;
/**
- * Called when a node has been removed from the screen and is not visible to the user anymore.
+ * Called when one or more nodes have been removed from the screen and is not visible to the
+ * user anymore.
*
- * <p>The id of the node is available through {@link #getId()}.
+ * <p>To get the id(s), first call {@link #getIds()} - if it returns {@code null}, then call
+ * {@link #getId()}.
*/
public static final int TYPE_VIEW_DISAPPEARED = 2;
@@ -74,29 +81,23 @@ public final class ContentCaptureEvent implements Parcelable {
private final @NonNull String mSessionId;
private final int mType;
private final long mEventTime;
- private final int mFlags;
private @Nullable AutofillId mId;
+ private @Nullable ArrayList<AutofillId> mIds;
private @Nullable ViewNode mNode;
private @Nullable CharSequence mText;
private @Nullable String mParentSessionId;
private @Nullable ContentCaptureContext mClientContext;
/** @hide */
- public ContentCaptureEvent(@NonNull String sessionId, int type, long eventTime, int flags) {
+ public ContentCaptureEvent(@NonNull String sessionId, int type, long eventTime) {
mSessionId = sessionId;
mType = type;
mEventTime = eventTime;
- mFlags = flags;
- }
-
- /** @hide */
- public ContentCaptureEvent(@NonNull String sessionId, int type, int flags) {
- this(sessionId, type, System.currentTimeMillis(), flags);
}
/** @hide */
public ContentCaptureEvent(@NonNull String sessionId, int type) {
- this(sessionId, type, /* flags= */ 0);
+ this(sessionId, type, System.currentTimeMillis());
}
/** @hide */
@@ -105,6 +106,27 @@ public final class ContentCaptureEvent implements Parcelable {
return this;
}
+ private void setAutofillIds(@NonNull ArrayList<AutofillId> ids) {
+ mIds = Preconditions.checkNotNull(ids);
+ }
+
+ /**
+ * Adds an autofill id to the this event, merging the single id into a list if necessary.
+ * @hide */
+ public ContentCaptureEvent addAutofillId(@NonNull AutofillId id) {
+ if (mIds == null) {
+ mIds = new ArrayList<>();
+ if (mId == null) {
+ Log.w(TAG, "addAutofillId(" + id + ") called without an initial id");
+ } else {
+ mIds.add(mId);
+ mId = null;
+ }
+ }
+ mIds.add(id);
+ return this;
+ }
+
/**
* Used by {@link #TYPE_SESSION_STARTED} and {@link #TYPE_SESSION_FINISHED}.
*
@@ -183,16 +205,6 @@ public final class ContentCaptureEvent implements Parcelable {
}
/**
- * Gets optional flags associated with the event.
- *
- * @return either {@code 0} or
- * {@link android.view.contentcapture.ContentCaptureSession#FLAG_USER_INPUT}.
- */
- public int getFlags() {
- return mFlags;
- }
-
- /**
* Gets the whole metadata of the node associated with the event.
*
* <p>Only set on {@link #TYPE_VIEW_APPEARED} events.
@@ -205,7 +217,9 @@ public final class ContentCaptureEvent implements Parcelable {
/**
* Gets the {@link AutofillId} of the node associated with the event.
*
- * <p>Only set on {@link #TYPE_VIEW_DISAPPEARED} and {@link #TYPE_VIEW_TEXT_CHANGED} events.
+ * <p>Only set on {@link #TYPE_VIEW_DISAPPEARED} (when the event contains just one node - if
+ * it contains more than one, this method returns {@code null} and the actual ids should be
+ * retrived by {@link #getIds()}) and {@link #TYPE_VIEW_TEXT_CHANGED} events.
*/
@Nullable
public AutofillId getId() {
@@ -213,6 +227,17 @@ public final class ContentCaptureEvent implements Parcelable {
}
/**
+ * Gets the {@link AutofillId AutofillIds} of the nodes associated with the event.
+ *
+ * <p>Only set on {@link #TYPE_VIEW_DISAPPEARED}, when the event contains more than one node
+ * (if it contains just one node, it's returned by {@link #getId()} instead.
+ */
+ @Nullable
+ public List<AutofillId> getIds() {
+ return mIds;
+ }
+
+ /**
* Gets the current text of the node associated with the event.
*
* <p>Only set on {@link #TYPE_VIEW_TEXT_CHANGED} events.
@@ -226,12 +251,12 @@ public final class ContentCaptureEvent implements Parcelable {
public void dump(@NonNull PrintWriter pw) {
pw.print("type="); pw.print(getTypeAsString(mType));
pw.print(", time="); pw.print(mEventTime);
- if (mFlags > 0) {
- pw.print(", flags="); pw.print(mFlags);
- }
if (mId != null) {
pw.print(", id="); pw.print(mId);
}
+ if (mIds != null) {
+ pw.print(", ids="); pw.print(mIds);
+ }
if (mNode != null) {
pw.print(", mNode.id="); pw.print(mNode.getAutofillId());
}
@@ -251,12 +276,16 @@ public final class ContentCaptureEvent implements Parcelable {
public String toString() {
final StringBuilder string = new StringBuilder("ContentCaptureEvent[type=")
.append(getTypeAsString(mType));
- if (mFlags > 0) {
- string.append(", flags=").append(mFlags);
+ string.append(", session=").append(mSessionId);
+ if (mType == TYPE_SESSION_STARTED && mParentSessionId != null) {
+ string.append(", parent=").append(mParentSessionId);
}
if (mId != null) {
string.append(", id=").append(mId);
}
+ if (mIds != null) {
+ string.append(", ids=").append(mIds);
+ }
if (mNode != null) {
final String className = mNode.getClassName();
if (mNode != null) {
@@ -277,8 +306,8 @@ public final class ContentCaptureEvent implements Parcelable {
parcel.writeString(mSessionId);
parcel.writeInt(mType);
parcel.writeLong(mEventTime);
- parcel.writeInt(mFlags);
parcel.writeParcelable(mId, flags);
+ parcel.writeTypedList(mIds);
ViewNode.writeToParcel(parcel, mNode, flags);
parcel.writeCharSequence(mText);
if (mType == TYPE_SESSION_STARTED || mType == TYPE_SESSION_FINISHED) {
@@ -297,13 +326,15 @@ public final class ContentCaptureEvent implements Parcelable {
final String sessionId = parcel.readString();
final int type = parcel.readInt();
final long eventTime = parcel.readLong();
- final int flags = parcel.readInt();
- final ContentCaptureEvent event =
- new ContentCaptureEvent(sessionId, type, eventTime, flags);
+ final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, type, eventTime);
final AutofillId id = parcel.readParcelable(null);
if (id != null) {
event.setAutofillId(id);
}
+ final ArrayList<AutofillId> ids = parcel.createTypedArrayList(AutofillId.CREATOR);
+ if (ids != null) {
+ event.setAutofillIds(ids);
+ }
final ViewNode node = ViewNode.readFromParcel(parcel);
if (node != null) {
event.setViewNode(node);
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 983079073d02..413f1a5a8955 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -15,6 +15,8 @@
*/
package android.view.contentcapture;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemService;
@@ -22,14 +24,18 @@ import android.annotation.UiThread;
import android.content.ComponentName;
import android.content.Context;
import android.os.Handler;
-import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
import android.util.Log;
+import android.view.contentcapture.ContentCaptureSession.FlushReason;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.IResultReceiver;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.SyncResultReceiver;
import java.io.PrintWriter;
-import java.util.concurrent.atomic.AtomicBoolean;
/*
* NOTE: all methods in this class should return right away, or do the real work in a handler
@@ -46,14 +52,19 @@ public final class ContentCaptureManager {
private static final String TAG = ContentCaptureManager.class.getSimpleName();
- private static final String BG_THREAD_NAME = "intel_svc_streamer_thread";
+ /**
+ * Timeout for calls to system_server.
+ */
+ private static final int SYNC_CALLS_TIMEOUT_MS = 5000;
// TODO(b/121044306): define a way to dynamically set them(for example, using settings?)
static final boolean VERBOSE = false;
static final boolean DEBUG = true; // STOPSHIP if not set to false
- @NonNull
- private final AtomicBoolean mDisabled = new AtomicBoolean();
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private boolean mDisabled;
@NonNull
private final Context mContext;
@@ -61,35 +72,29 @@ public final class ContentCaptureManager {
@Nullable
private final IContentCaptureManager mService;
+ // Flags used for starting session.
+ @GuardedBy("mLock")
+ private int mFlags;
+
// TODO(b/119220549): use UI Thread directly (as calls are one-way) or a shared thread / handler
// held at the Application level
@NonNull
private final Handler mHandler;
+ @GuardedBy("mLock")
private MainContentCaptureSession mMainSession;
/** @hide */
public ContentCaptureManager(@NonNull Context context,
@Nullable IContentCaptureManager service) {
mContext = Preconditions.checkNotNull(context, "context cannot be null");
- if (VERBOSE) {
- Log.v(TAG, "Constructor for " + context.getPackageName());
- }
- mService = service;
- // TODO(b/119220549): use an existing bg thread instead...
- final HandlerThread bgThread = new HandlerThread(BG_THREAD_NAME);
- bgThread.start();
- mHandler = Handler.createAsync(bgThread.getLooper());
- }
+ if (VERBOSE) Log.v(TAG, "Constructor for " + context.getPackageName());
- @NonNull
- private static Handler newHandler() {
- // TODO(b/119220549): use an existing bg thread instead...
- // TODO(b/119220549): use UI Thread directly (as calls are one-way) or an existing bgThread
- // or a shared thread / handler held at the Application level
- final HandlerThread bgThread = new HandlerThread(BG_THREAD_NAME);
- bgThread.start();
- return Handler.createAsync(bgThread.getLooper());
+ mService = service;
+ // TODO(b/119220549): we might not even need a handler, as the IPCs are oneway. But if we
+ // do, then we should optimize it to run the tests after the Choreographer finishes the most
+ // important steps of the frame.
+ mHandler = Handler.createAsync(Looper.getMainLooper());
}
/**
@@ -104,26 +109,29 @@ public final class ContentCaptureManager {
@NonNull
@UiThread
public MainContentCaptureSession getMainContentCaptureSession() {
- if (mMainSession == null) {
- mMainSession = new MainContentCaptureSession(mContext, mHandler, mService,
- mDisabled);
- if (VERBOSE) {
- Log.v(TAG, "getDefaultContentCaptureSession(): created " + mMainSession);
+ synchronized (mLock) {
+ if (mMainSession == null) {
+ mMainSession = new MainContentCaptureSession(mContext, mHandler, mService,
+ mDisabled);
+ if (VERBOSE) {
+ Log.v(TAG, "getDefaultContentCaptureSession(): created " + mMainSession);
+ }
}
+ return mMainSession;
}
- return mMainSession;
}
/** @hide */
public void onActivityStarted(@NonNull IBinder applicationToken,
- @NonNull ComponentName activityComponent) {
- // TODO(b/121033016): must start all sessions
- getMainContentCaptureSession().start(applicationToken, activityComponent);
+ @NonNull ComponentName activityComponent, int flags) {
+ synchronized (mLock) {
+ mFlags |= flags;
+ getMainContentCaptureSession().start(applicationToken, activityComponent, mFlags);
+ }
}
/** @hide */
public void onActivityStopped() {
- // TODO(b/121033016): must finish all sessions
getMainContentCaptureSession().destroy();
}
@@ -134,9 +142,8 @@ public final class ContentCaptureManager {
*
* @hide
*/
- public void flush() {
- // TODO(b/121033016): must flush all sessions
- getMainContentCaptureSession().flush();
+ public void flush(@FlushReason int reason) {
+ getMainContentCaptureSession().flush(reason);
}
/**
@@ -145,15 +152,30 @@ public final class ContentCaptureManager {
*/
@Nullable
public ComponentName getServiceComponentName() {
- //TODO(b/121047489): implement
- return null;
+ if (!isContentCaptureEnabled()) {
+ return null;
+ }
+ // Wait for system server to return the component name.
+ final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
+ mHandler.sendMessage(obtainMessage(
+ ContentCaptureManager::handleReceiverServiceComponentName,
+ this, mContext.getUserId(), resultReceiver));
+
+ try {
+ return resultReceiver.getParcelableResult();
+ } catch (RemoteException e) {
+ // Unable to retrieve component name in a reasonable amount of time.
+ throw e.rethrowFromSystemServer();
+ }
}
/**
* Checks whether content capture is enabled for this activity.
*/
public boolean isContentCaptureEnabled() {
- return mService != null && !mDisabled.get();
+ synchronized (mLock) {
+ return mService != null && !mDisabled;
+ }
}
/**
@@ -163,7 +185,9 @@ public final class ContentCaptureManager {
* it on {@link android.app.Activity#onCreate(android.os.Bundle, android.os.PersistableBundle)}.
*/
public void setContentCaptureEnabled(boolean enabled) {
- //TODO(b/111276913): implement (need to finish / disable all sessions)
+ synchronized (mLock) {
+ mFlags |= enabled ? 0 : ContentCaptureContext.FLAG_DISABLED_BY_APP;
+ }
}
/**
@@ -178,20 +202,32 @@ public final class ContentCaptureManager {
/** @hide */
public void dump(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.println("ContentCaptureManager");
-
- pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled.get());
- pw.print(prefix); pw.print("Context: "); pw.println(mContext);
- pw.print(prefix); pw.print("User: "); pw.println(mContext.getUserId());
- if (mService != null) {
- pw.print(prefix); pw.print("Service: "); pw.println(mService);
+ synchronized (mLock) {
+ pw.print(prefix); pw.println("ContentCaptureManager");
+ pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
+ pw.print(prefix); pw.print("Context: "); pw.println(mContext);
+ pw.print(prefix); pw.print("User: "); pw.println(mContext.getUserId());
+ if (mService != null) {
+ pw.print(prefix); pw.print("Service: "); pw.println(mService);
+ }
+ pw.print(prefix); pw.print("Flags: "); pw.println(mFlags);
+ if (mMainSession != null) {
+ final String prefix2 = prefix + " ";
+ pw.print(prefix); pw.println("Main session:");
+ mMainSession.dump(prefix2, pw);
+ } else {
+ pw.print(prefix); pw.println("No sessions");
+ }
}
- if (mMainSession != null) {
- final String prefix2 = prefix + " ";
- pw.print(prefix); pw.println("Main session:");
- mMainSession.dump(prefix2, pw);
- } else {
- pw.print(prefix); pw.println("No sessions");
+ }
+
+
+ /** Retrieves the component name of the target content capture service through system_server. */
+ private void handleReceiverServiceComponentName(int userId, IResultReceiver resultReceiver) {
+ try {
+ mService.getReceiverServiceComponentName(userId, resultReceiver);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to retrieve service component name: " + e);
}
}
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index 46e6882b8643..b620ab1eb7c3 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -19,22 +19,28 @@ import static android.view.contentcapture.ContentCaptureManager.DEBUG;
import static android.view.contentcapture.ContentCaptureManager.VERBOSE;
import android.annotation.CallSuper;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.util.DebugUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewStructure;
import android.view.autofill.AutofillId;
import android.view.contentcapture.ViewNode.ViewStructureImpl;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import dalvik.system.CloseGuard;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
/**
* Session used to notify a system-provided Content Capture service about events associated with
@@ -45,62 +51,120 @@ public abstract class ContentCaptureSession implements AutoCloseable {
private static final String TAG = ContentCaptureSession.class.getSimpleName();
/**
- * Used on {@link #notifyViewTextChanged(AutofillId, CharSequence, int)} to indicate that the
- *
- * thext change was caused by user input (for example, through IME).
- */
- public static final int FLAG_USER_INPUT = 0x1;
-
- /**
* Initial state, when there is no session.
*
* @hide
*/
- public static final int STATE_UNKNOWN = 0;
+ // NOTE: not prefixed by STATE_ so it's not printed on getStateAsString()
+ public static final int UNKNWON_STATE = 0x0;
/**
* Service's startSession() was called, but server didn't confirm it was created yet.
*
* @hide
*/
- public static final int STATE_WAITING_FOR_SERVER = 1;
+ public static final int STATE_WAITING_FOR_SERVER = 0x1;
/**
* Session is active.
*
* @hide
*/
- public static final int STATE_ACTIVE = 2;
+ public static final int STATE_ACTIVE = 0x2;
/**
- * Session is disabled.
+ * Session is disabled because there is no service for this user.
*
* @hide
*/
- public static final int STATE_DISABLED = 3;
+ public static final int STATE_DISABLED = 0x4;
/**
* Session is disabled because its id already existed on server.
*
* @hide
*/
- public static final int STATE_DISABLED_DUPLICATED_ID = 4;
+ public static final int STATE_DUPLICATED_ID = 0x8;
+
+ /**
+ * Session is disabled because service is not set for user.
+ *
+ * @hide
+ */
+ public static final int STATE_NO_SERVICE = 0x10;
+
+ /**
+ * Session is disabled by FLAG_SECURE
+ *
+ * @hide
+ */
+ public static final int STATE_FLAG_SECURE = 0x20;
+
+ /**
+ * Session is disabled manually by the specific app.
+ *
+ * @hide
+ */
+ public static final int STATE_BY_APP = 0x40;
+
+ /**
+ * Session is disabled because session start was never replied.
+ *
+ * @hide
+ */
+ public static final int STATE_NO_RESPONSE = 0x80;
+
+ /**
+ * Session is disabled because an internal error.
+ *
+ * @hide
+ */
+ public static final int STATE_INTERNAL_ERROR = 0x100;
private static final int INITIAL_CHILDREN_CAPACITY = 5;
+ /** @hide */
+ public static final int FLUSH_REASON_FULL = 1;
+ /** @hide */
+ public static final int FLUSH_REASON_ACTIVITY_PAUSED = 2;
+ /** @hide */
+ public static final int FLUSH_REASON_ACTIVITY_RESUMED = 3;
+ /** @hide */
+ public static final int FLUSH_REASON_SESSION_STARTED = 4;
+ /** @hide */
+ public static final int FLUSH_REASON_SESSION_FINISHED = 5;
+ /** @hide */
+ public static final int FLUSH_REASON_IDLE_TIMEOUT = 6;
+
+ /** @hide */
+ @IntDef(prefix = { "FLUSH_REASON_" }, value = {
+ FLUSH_REASON_FULL,
+ FLUSH_REASON_ACTIVITY_PAUSED,
+ FLUSH_REASON_ACTIVITY_RESUMED,
+ FLUSH_REASON_SESSION_STARTED,
+ FLUSH_REASON_SESSION_FINISHED,
+ FLUSH_REASON_IDLE_TIMEOUT
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface FlushReason{}
+
+
private final CloseGuard mCloseGuard = CloseGuard.get();
+ private final Object mLock = new Object();
+
/**
* Guard use to ignore events after it's destroyed.
*/
@NonNull
- private final AtomicBoolean mDestroyed = new AtomicBoolean();
+ @GuardedBy("mLock")
+ private boolean mDestroyed;
/** @hide */
@Nullable
- protected final String mId = UUID.randomUUID().toString();
+ protected final String mId;
- private int mState = STATE_UNKNOWN;
+ private int mState = UNKNWON_STATE;
// Lazily created on demand.
private ContentCaptureSessionId mContentCaptureSessionId;
@@ -108,18 +172,26 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* List of children session.
*/
- // TODO(b/121033016): need to synchonize access, either by changing on handler or UI thread
- // (for now there's no handler on this class, so we need to wait for the next refactoring),
- // most likely the former (as we have no guarantee that createContentCaptureSession()
- // it will be called in the UiThread; for example, WebView most likely won't call on it)
@Nullable
+ @GuardedBy("mLock")
private ArrayList<ContentCaptureSession> mChildren;
/** @hide */
protected ContentCaptureSession() {
+ this(UUID.randomUUID().toString());
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ public ContentCaptureSession(@NonNull String id) {
+ mId = Preconditions.checkNotNull(id);
mCloseGuard.open("destroy");
}
+ /** @hide */
+ @NonNull
+ abstract MainContentCaptureSession getMainCaptureSession();
+
/**
* Gets the id used to identify this session.
*/
@@ -130,6 +202,13 @@ public abstract class ContentCaptureSession implements AutoCloseable {
return mContentCaptureSessionId;
}
+ /** @hide */
+ @VisibleForTesting
+ public int getIdAsInt() {
+ // TODO(b/121197119): use sessionId instead of hashcode once it's changed to int
+ return mId.hashCode();
+ }
+
/**
* Creates a new {@link ContentCaptureSession}.
*
@@ -143,10 +222,12 @@ public abstract class ContentCaptureSession implements AutoCloseable {
Log.d(TAG, "createContentCaptureSession(" + context + ": parent=" + mId + ", child="
+ child.mId);
}
- if (mChildren == null) {
- mChildren = new ArrayList<>(INITIAL_CHILDREN_CAPACITY);
+ synchronized (mLock) {
+ if (mChildren == null) {
+ mChildren = new ArrayList<>(INITIAL_CHILDREN_CAPACITY);
+ }
+ mChildren.add(child);
}
- mChildren.add(child);
return child;
}
@@ -155,7 +236,7 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* Flushes the buffered events to the service.
*/
- abstract void flush();
+ abstract void flush(@FlushReason int reason);
/**
* Destroys this session, flushing out all pending notifications to the service.
@@ -163,35 +244,37 @@ public abstract class ContentCaptureSession implements AutoCloseable {
* <p>Once destroyed, any new notification will be dropped.
*/
public final void destroy() {
- if (!mDestroyed.compareAndSet(false, true)) {
- Log.e(TAG, "destroy(): already destroyed");
- return;
- }
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Log.e(TAG, "destroy(" + mId + "): already destroyed");
+ return;
+ }
+ mDestroyed = true;
- mCloseGuard.close();
+ mCloseGuard.close();
- //TODO(b/111276913): check state (for example, how to handle if it's waiting for remote
- // id) and send it to the cache of batched commands
- if (VERBOSE) {
- Log.v(TAG, "destroy(): state=" + getStateAsString(mState) + ", mId=" + mId);
- }
-
- // Finish children first
- if (mChildren != null) {
- final int numberChildren = mChildren.size();
- if (VERBOSE) Log.v(TAG, "Destroying " + numberChildren + " children first");
- for (int i = 0; i < numberChildren; i++) {
- final ContentCaptureSession child = mChildren.get(i);
- try {
- child.destroy();
- } catch (Exception e) {
- Log.w(TAG, "exception destroying child session #" + i + ": " + e);
+ // TODO(b/111276913): check state (for example, how to handle if it's waiting for remote
+ // id) and send it to the cache of batched commands
+ if (VERBOSE) {
+ Log.v(TAG, "destroy(): state=" + getStateAsString(mState) + ", mId=" + mId);
+ }
+ // Finish children first
+ if (mChildren != null) {
+ final int numberChildren = mChildren.size();
+ if (VERBOSE) Log.v(TAG, "Destroying " + numberChildren + " children first");
+ for (int i = 0; i < numberChildren; i++) {
+ final ContentCaptureSession child = mChildren.get(i);
+ try {
+ child.destroy();
+ } catch (Exception e) {
+ Log.w(TAG, "exception destroying child session #" + i + ": " + e);
+ }
}
}
}
try {
- flush();
+ flush(FLUSH_REASON_SESSION_FINISHED);
} finally {
onDestroy();
}
@@ -257,12 +340,36 @@ public abstract class ContentCaptureSession implements AutoCloseable {
abstract void internalNotifyViewDisappeared(@NonNull AutofillId id);
/**
+ * Notifies the Content Capture Service that many nodes has been removed from a virtual view
+ * structure.
+ *
+ * <p>Should only be called by views that handle their own virtual view hierarchy.
+ *
+ * @param hostId id of the view hosting the virtual hierarchy.
+ * @param virtualIds ids of the virtual children.
+ *
+ * @throws IllegalArgumentException if the {@code hostId} is an autofill id for a virtual view.
+ * @throws IllegalArgumentException if {@code virtualIds} is empty
+ */
+ public final void notifyViewsDisappeared(@NonNull AutofillId hostId,
+ @NonNull int[] virtualIds) {
+ Preconditions.checkArgument(!hostId.isVirtual(), "parent cannot be virtual");
+ Preconditions.checkArgument(!ArrayUtils.isEmpty(virtualIds), "virtual ids cannot be empty");
+ if (!isContentCaptureEnabled()) return;
+
+ // TODO(b/123036895): use a internalNotifyViewsDisappeared that optimizes how the event is
+ // parcelized
+ for (int id : virtualIds) {
+ internalNotifyViewDisappeared(new AutofillId(hostId, id, getIdAsInt()));
+ }
+ }
+
+ /**
* Notifies the Intelligence Service that the value of a text node has been changed.
*
* @param id of the node.
* @param text new text.
- * @param flags either {@code 0} or {@link #FLAG_USER_INPUT} when the value was explicitly
- * changed by the user (for example, through the keyboard).
+ * @param flags currently ignored.
*/
public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
int flags) {
@@ -270,11 +377,11 @@ public abstract class ContentCaptureSession implements AutoCloseable {
if (!isContentCaptureEnabled()) return;
- internalNotifyViewTextChanged(id, text, flags);
+ internalNotifyViewTextChanged(id, text);
}
- abstract void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
- int flags);
+ abstract void internalNotifyViewTextChanged(@NonNull AutofillId id,
+ @Nullable CharSequence text);
/**
* Creates a {@link ViewStructure} for a "standard" view.
@@ -287,6 +394,24 @@ public abstract class ContentCaptureSession implements AutoCloseable {
}
/**
+ * Creates a new {@link AutofillId} for a virtual child, so it can be used to uniquely identify
+ * the children in the session.
+ *
+ * @param parentId id of the virtual view parent (it can be obtained by calling
+ * {@link ViewStructure#getAutofillId()} on the parent).
+ * @param virtualChildId id of the virtual child, relative to the parent.
+ *
+ * @return if for the virtual child
+ *
+ * @throws IllegalArgumentException if the {@code parentId} is a virtual child id.
+ */
+ public @NonNull AutofillId newAutofillId(@NonNull AutofillId parentId, int virtualChildId) {
+ Preconditions.checkNotNull(parentId);
+ Preconditions.checkArgument(!parentId.isVirtual(), "virtual ids cannot have children");
+ return new AutofillId(parentId, virtualChildId, getIdAsInt());
+ }
+
+ /**
* Creates a {@link ViewStructure} for a "virtual" view, so it can be passed to
* {@link #notifyViewAppeared(ViewStructure)} by the view managing the virtual view hierarchy.
*
@@ -295,33 +420,34 @@ public abstract class ContentCaptureSession implements AutoCloseable {
* @param virtualId id of the virtual child, relative to the parent.
*
* @return a new {@link ViewStructure} that can be used for Content Capture purposes.
- *
- * @hide
*/
@NonNull
public final ViewStructure newVirtualViewStructure(@NonNull AutofillId parentId,
int virtualId) {
- return new ViewNode.ViewStructureImpl(parentId, virtualId);
+ return new ViewNode.ViewStructureImpl(parentId, virtualId, getIdAsInt());
}
boolean isContentCaptureEnabled() {
- return !mDestroyed.get();
+ synchronized (mLock) {
+ return !mDestroyed;
+ }
}
@CallSuper
void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
pw.print(prefix); pw.print("id: "); pw.println(mId);
- pw.print(prefix); pw.print("destroyed: "); pw.println(mDestroyed.get());
- if (mChildren != null && !mChildren.isEmpty()) {
- final String prefix2 = prefix + " ";
- final int numberChildren = mChildren.size();
- pw.print(prefix); pw.print("number children: "); pw.println(numberChildren);
- for (int i = 0; i < numberChildren; i++) {
- final ContentCaptureSession child = mChildren.get(i);
- pw.print(prefix); pw.print(i); pw.println(": "); child.dump(prefix2, pw);
+ synchronized (mLock) {
+ pw.print(prefix); pw.print("destroyed: "); pw.println(mDestroyed);
+ if (mChildren != null && !mChildren.isEmpty()) {
+ final String prefix2 = prefix + " ";
+ final int numberChildren = mChildren.size();
+ pw.print(prefix); pw.print("number children: "); pw.println(numberChildren);
+ for (int i = 0; i < numberChildren; i++) {
+ final ContentCaptureSession child = mChildren.get(i);
+ pw.print(prefix); pw.print(i); pw.println(": "); child.dump(prefix2, pw);
+ }
}
}
-
}
@Override
@@ -329,24 +455,31 @@ public abstract class ContentCaptureSession implements AutoCloseable {
return mId;
}
- /**
- * @hide
- */
+ /** @hide */
@NonNull
protected static String getStateAsString(int state) {
- switch (state) {
- case STATE_UNKNOWN:
- return "UNKNOWN";
- case STATE_WAITING_FOR_SERVER:
- return "WAITING_FOR_SERVER";
- case STATE_ACTIVE:
- return "ACTIVE";
- case STATE_DISABLED:
- return "DISABLED";
- case STATE_DISABLED_DUPLICATED_ID:
- return "DISABLED_DUPLICATED_ID";
+ return state + " (" + (state == UNKNWON_STATE ? "UNKNOWN"
+ : DebugUtils.flagsToString(ContentCaptureSession.class, "STATE_", state)) + ")";
+ }
+
+ /** @hide */
+ @NonNull
+ static String getflushReasonAsString(@FlushReason int reason) {
+ switch (reason) {
+ case FLUSH_REASON_FULL:
+ return "FULL";
+ case FLUSH_REASON_ACTIVITY_PAUSED:
+ return "PAUSED";
+ case FLUSH_REASON_ACTIVITY_RESUMED:
+ return "RESUMED";
+ case FLUSH_REASON_SESSION_STARTED:
+ return "STARTED";
+ case FLUSH_REASON_SESSION_FINISHED:
+ return "FINISHED";
+ case FLUSH_REASON_IDLE_TIMEOUT:
+ return "IDLE";
default:
- return "INVALID:" + state;
+ return "UNKOWN-" + reason;
}
}
}
diff --git a/core/java/android/view/contentcapture/IContentCaptureManager.aidl b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
index 01776f846434..be9c00f04d99 100644
--- a/core/java/android/view/contentcapture/IContentCaptureManager.aidl
+++ b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
@@ -32,7 +32,28 @@ import java.util.List;
* @hide
*/
oneway interface IContentCaptureManager {
+ /**
+ * Starts a new session for the provided {@code userId} running as part of the
+ * app's activity identified by {@code activityToken}/{@code componentName}.
+ *
+ * @param sessionId Unique session id as provided by the app.
+ * @param flags Meta flags that enable or disable content capture (see
+ * {@link IContentCaptureContext#flags}).
+ */
void startSession(int userId, IBinder activityToken, in ComponentName componentName,
String sessionId, int flags, in IResultReceiver result);
+
+ /**
+ * Marks the end of a session for the provided {@code userId} identified by
+ * the corresponding {@code startSession}'s {@code sessionId}.
+ */
void finishSession(int userId, String sessionId);
+
+ /**
+ * Returns the content capture service's component name (if enabled and
+ * connected).
+ * @param Receiver of the content capture service's @{code ComponentName}
+ * provided {@code Bundle} with key "{@code EXTRA}".
+ */
+ void getReceiverServiceComponentName(int userId, in IResultReceiver result);
}
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index baf4a35f179e..103d7e6dc256 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -35,7 +35,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
-import android.os.SystemClock;
+import android.util.LocalLog;
import android.util.Log;
import android.util.TimeUtils;
import android.view.autofill.AutofillId;
@@ -88,6 +88,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
*/
public static final String EXTRA_BINDER = "binder";
+ // TODO(b/111276913): make sure disabled state is in sync with manager's disabled
@NonNull
private final AtomicBoolean mDisabled;
@@ -113,7 +114,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
@Nullable
private DeathRecipient mDirectServiceVulture;
- private int mState = STATE_UNKNOWN;
+ private int mState = UNKNWON_STATE;
@Nullable
private IBinder mApplicationToken;
@@ -130,14 +131,22 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
// Used just for debugging purposes (on dump)
private long mNextFlush;
+ // TODO(b/121044064): use settings to set size
+ private final LocalLog mFlushHistory = new LocalLog(10);
+
/** @hide */
protected MainContentCaptureSession(@NonNull Context context, @NonNull Handler handler,
@Nullable IContentCaptureManager systemServerInterface,
- @NonNull AtomicBoolean disabled) {
+ @NonNull boolean disabled) {
mContext = context;
mHandler = handler;
mSystemServerInterface = systemServerInterface;
- mDisabled = disabled;
+ mDisabled = new AtomicBoolean(disabled);
+ }
+
+ @Override
+ MainContentCaptureSession getMainCaptureSession() {
+ return this;
}
@Override
@@ -152,7 +161,8 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
*
* @hide
*/
- void start(@NonNull IBinder applicationToken, @NonNull ComponentName activityComponent) {
+ void start(@NonNull IBinder applicationToken, @NonNull ComponentName activityComponent,
+ int flags) {
if (!isContentCaptureEnabled()) return;
if (VERBOSE) {
@@ -161,25 +171,31 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
mHandler.sendMessage(obtainMessage(MainContentCaptureSession::handleStartSession, this,
- applicationToken, activityComponent));
+ applicationToken, activityComponent, flags));
}
@Override
- void flush() {
- mHandler.sendMessage(obtainMessage(MainContentCaptureSession::handleForceFlush, this));
+ void flush(@FlushReason int reason) {
+ mHandler.sendMessage(
+ obtainMessage(MainContentCaptureSession::handleForceFlush, this, reason));
}
@Override
void onDestroy() {
+ mHandler.removeMessages(MSG_FLUSH);
mHandler.sendMessage(
obtainMessage(MainContentCaptureSession::handleDestroySession, this));
}
- private void handleStartSession(@NonNull IBinder token, @NonNull ComponentName componentName) {
- if (mState != STATE_UNKNOWN) {
- // TODO(b/111276913): revisit this scenario
- Log.w(TAG, "ignoring handleStartSession(" + token + ") while on state "
- + getStateAsString(mState));
+ private void handleStartSession(@NonNull IBinder token, @NonNull ComponentName componentName,
+ int flags) {
+ if (handleHasStarted()) {
+ // TODO(b/122959591): make sure this is expected (and when), or use Log.w
+ if (DEBUG) {
+ Log.d(TAG, "ignoring handleStartSession(" + token + "/"
+ + ComponentName.flattenToShortString(componentName) + " while on state "
+ + getStateAsString(mState));
+ }
return;
}
mState = STATE_WAITING_FOR_SERVER;
@@ -188,11 +204,12 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
if (VERBOSE) {
Log.v(TAG, "handleStartSession(): token=" + token + ", act="
- + getActivityDebugName() + ", id=" + mId);
+ + getDebugState() + ", id=" + mId);
}
- final int flags = 0; // TODO(b/111276913): get proper flags
try {
+ if (mSystemServerInterface == null) return;
+
mSystemServerInterface.startSession(mContext.getUserId(), mApplicationToken,
componentName, mId, flags, new IResultReceiver.Stub() {
@Override
@@ -202,7 +219,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
binder = resultData.getBinder(EXTRA_BINDER);
if (binder == null) {
Log.wtf(TAG, "No " + EXTRA_BINDER + " extra result");
- handleResetState();
+ handleResetSession(STATE_DISABLED | STATE_INTERNAL_ERROR);
return;
}
}
@@ -224,7 +241,6 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
* @param binder handle to {@code IContentCaptureDirectManager}
*/
private void handleSessionStarted(int resultCode, @Nullable IBinder binder) {
- mState = resultCode;
if (binder != null) {
mDirectServiceInterface = IContentCaptureDirectManager.Stub.asInterface(binder);
mDirectServiceVulture = () -> {
@@ -237,28 +253,43 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
Log.w(TAG, "Failed to link to death on " + binder + ": " + e);
}
}
- if (resultCode == STATE_DISABLED || resultCode == STATE_DISABLED_DUPLICATED_ID) {
- mDisabled.set(true);
- handleResetSession(/* resetState= */ false);
+
+ if ((resultCode & STATE_DISABLED) != 0) {
+ handleResetSession(resultCode);
} else {
+ mState = resultCode;
mDisabled.set(false);
}
if (VERBOSE) {
- Log.v(TAG, "handleSessionStarted() result: code=" + resultCode + ", id=" + mId
+ Log.v(TAG, "handleSessionStarted() result: id=" + mId + " resultCode=" + resultCode
+ ", state=" + getStateAsString(mState) + ", disabled=" + mDisabled.get()
- + ", binder=" + binder);
+ + ", binder=" + binder + ", events=" + (mEvents == null ? 0 : mEvents.size()));
}
}
private void handleSendEvent(@NonNull ContentCaptureEvent event, boolean forceFlush) {
+ final int eventType = event.getType();
+ if (!handleHasStarted() && eventType != ContentCaptureEvent.TYPE_SESSION_STARTED) {
+ // TODO(b/120494182): comment when this could happen (dialogs?)
+ Log.v(TAG, "handleSendEvent(" + getDebugState() + ", "
+ + ContentCaptureEvent.getTypeAsString(eventType)
+ + "): session not started yet");
+ return;
+ }
+ if (VERBOSE) Log.v(TAG, "handleSendEvent(" + getDebugState() + "): " + event);
if (mEvents == null) {
if (VERBOSE) {
- Log.v(TAG, "Creating buffer for " + MAX_BUFFER_SIZE + " events");
+ Log.v(TAG, "handleSendEvent(" + getDebugState() + ", "
+ + ContentCaptureEvent.getTypeAsString(eventType)
+ + "): creating buffer for " + MAX_BUFFER_SIZE + " events");
}
mEvents = new ArrayList<>(MAX_BUFFER_SIZE);
}
- if (!mEvents.isEmpty() && event.getType() == TYPE_VIEW_TEXT_CHANGED) {
+ // Some type of events can be merged together
+ boolean addEvent = true;
+
+ if (!mEvents.isEmpty() && eventType == TYPE_VIEW_TEXT_CHANGED) {
final ContentCaptureEvent lastEvent = mEvents.get(mEvents.size() - 1);
// TODO(b/121045053): check if flags match
@@ -269,10 +300,24 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
+ event.getText());
}
lastEvent.setText(event.getText());
- } else {
- mEvents.add(event);
+ addEvent = false;
}
- } else {
+ }
+
+ if (!mEvents.isEmpty() && eventType == TYPE_VIEW_DISAPPEARED) {
+ final ContentCaptureEvent lastEvent = mEvents.get(mEvents.size() - 1);
+ if (lastEvent.getType() == TYPE_VIEW_DISAPPEARED
+ && event.getSessionId().equals(lastEvent.getSessionId())) {
+ if (VERBOSE) {
+ Log.v(TAG, "Buffering TYPE_VIEW_DISAPPEARED events for session "
+ + lastEvent.getSessionId());
+ }
+ lastEvent.addAutofillId(event.getId());
+ addEvent = false;
+ }
+ }
+
+ if (addEvent) {
mEvents.add(event);
}
@@ -281,74 +326,104 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
final boolean bufferEvent = numberEvents < MAX_BUFFER_SIZE;
if (bufferEvent && !forceFlush) {
- handleScheduleFlush(/* checkExisting= */ true);
+ handleScheduleFlush(FLUSH_REASON_IDLE_TIMEOUT, /* checkExisting= */ true);
return;
}
- if (mState != STATE_ACTIVE) {
+ if (mState != STATE_ACTIVE && numberEvents >= MAX_BUFFER_SIZE) {
// Callback from startSession hasn't been called yet - typically happens on system
// apps that are started before the system service
- // TODO(b/111276913): try to ignore session while system is not ready / boot
+ // TODO(b/122959591): try to ignore session while system is not ready / boot
// not complete instead. Similarly, the manager service should return right away
// when the user does not have a service set
- if (VERBOSE) {
- Log.v(TAG, "Closing session for " + getActivityDebugName()
- + " after " + numberEvents + " delayed events and state "
- + getStateAsString(mState));
+ if (DEBUG) {
+ Log.d(TAG, "Closing session for " + getDebugState()
+ + " after " + numberEvents + " delayed events");
}
- handleResetState();
+ handleResetSession(STATE_DISABLED | STATE_NO_RESPONSE);
// TODO(b/111276913): blacklist activity / use special flag to indicate that
// when it's launched again
return;
}
+ final int flushReason;
+ switch (eventType) {
+ case ContentCaptureEvent.TYPE_SESSION_STARTED:
+ flushReason = FLUSH_REASON_SESSION_STARTED;
+ break;
+ case ContentCaptureEvent.TYPE_SESSION_FINISHED:
+ flushReason = FLUSH_REASON_SESSION_FINISHED;
+ break;
+ default:
+ flushReason = FLUSH_REASON_FULL;
+ }
+
+ handleForceFlush(flushReason);
+ }
- handleForceFlush();
+ private boolean handleHasStarted() {
+ return mState != UNKNWON_STATE;
}
- private void handleScheduleFlush(boolean checkExisting) {
+ private void handleScheduleFlush(@FlushReason int reason, boolean checkExisting) {
+ if (!handleHasStarted()) {
+ Log.v(TAG, "handleScheduleFlush(" + getDebugState() + "): session not started yet");
+ return;
+ }
if (checkExisting && mHandler.hasMessages(MSG_FLUSH)) {
// "Renew" the flush message by removing the previous one
mHandler.removeMessages(MSG_FLUSH);
}
- mNextFlush = SystemClock.elapsedRealtime() + FLUSHING_FREQUENCY_MS;
+ mNextFlush = System.currentTimeMillis() + FLUSHING_FREQUENCY_MS;
if (VERBOSE) {
- Log.v(TAG, "Scheduled to flush in " + FLUSHING_FREQUENCY_MS + "ms: " + mNextFlush);
+ Log.v(TAG, "handleScheduleFlush(" + getDebugState()
+ + ", reason=" + getflushReasonAsString(reason) + "): scheduled to flush in "
+ + FLUSHING_FREQUENCY_MS + "ms: " + TimeUtils.logTimeOfDay(mNextFlush));
}
mHandler.sendMessageDelayed(
- obtainMessage(MainContentCaptureSession::handleFlushIfNeeded, this)
+ obtainMessage(MainContentCaptureSession::handleFlushIfNeeded, this, reason)
.setWhat(MSG_FLUSH), FLUSHING_FREQUENCY_MS);
}
- private void handleFlushIfNeeded() {
+ private void handleFlushIfNeeded(@FlushReason int reason) {
if (mEvents.isEmpty()) {
if (VERBOSE) Log.v(TAG, "Nothing to flush");
return;
}
- handleForceFlush();
+ handleForceFlush(reason);
}
- private void handleForceFlush() {
+ private void handleForceFlush(@FlushReason int reason) {
if (mEvents == null) return;
if (mDirectServiceInterface == null) {
- if (DEBUG) Log.d(TAG, "handleForceFlush(): hold your horses, client not ready yet!");
+ if (VERBOSE) {
+ Log.v(TAG, "handleForceFlush(" + getDebugState()
+ + ", reason=" + getflushReasonAsString(reason)
+ + "): hold your horses, client not ready: " + mEvents);
+ }
if (!mHandler.hasMessages(MSG_FLUSH)) {
- handleScheduleFlush(/* checkExisting= */ false);
+ handleScheduleFlush(reason, /* checkExisting= */ false);
}
return;
}
final int numberEvents = mEvents.size();
+ final String reasonString = getflushReasonAsString(reason);
+ if (DEBUG) {
+ Log.d(TAG, "Flushing " + numberEvents + " event(s) for " + getDebugState()
+ + ". Reason: " + reasonString);
+ }
+ // Logs reason, size, max size, idle timeout
+ final String logRecord = "r=" + reasonString + " s=" + numberEvents
+ + " m=" + MAX_BUFFER_SIZE + " i=" + FLUSHING_FREQUENCY_MS;
try {
- if (DEBUG) {
- Log.d(TAG, "Flushing " + numberEvents + " event(s) for " + getActivityDebugName());
- }
+ mFlushHistory.log(logRecord);
mHandler.removeMessages(MSG_FLUSH);
final ParceledListSlice<ContentCaptureEvent> events = handleClearEvents();
mDirectServiceInterface.sendEvents(events);
} catch (RemoteException e) {
- Log.w(TAG, "Error sending " + numberEvents + " for " + getActivityDebugName()
+ Log.w(TAG, "Error sending " + numberEvents + " for " + getDebugState()
+ ": " + e);
}
}
@@ -371,29 +446,29 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
if (DEBUG) {
Log.d(TAG, "Destroying session (ctx=" + mContext + ", id=" + mId + ") with "
+ (mEvents == null ? 0 : mEvents.size()) + " event(s) for "
- + getActivityDebugName());
+ + getDebugState());
}
try {
+ if (mSystemServerInterface == null) return;
+
mSystemServerInterface.finishSession(mContext.getUserId(), mId);
} catch (RemoteException e) {
Log.e(TAG, "Error destroying system-service session " + mId + " for "
- + getActivityDebugName() + ": " + e);
+ + getDebugState() + ": " + e);
}
}
- private void handleResetState() {
- handleResetSession(/* resetState= */ true);
- }
-
- // TODO(b/121033016): once we support multiple sessions, we might need to move some of these
+ // TODO(b/122454205): once we support multiple sessions, we might need to move some of these
// clearings out.
- private void handleResetSession(boolean resetState) {
- if (resetState) {
- mState = STATE_UNKNOWN;
+ private void handleResetSession(int newState) {
+ if (VERBOSE) {
+ Log.v(TAG, "handleResetSession(" + getActivityName() + "): from "
+ + getStateAsString(mState) + " to " + getStateAsString(newState));
}
-
- // TODO(b/121033016): must reset children (which currently is owned by superclass)
+ mState = newState;
+ mDisabled.set((newState & STATE_DISABLED) != 0);
+ // TODO(b/122454205): must reset children (which currently is owned by superclass)
mApplicationToken = null;
mComponentName = null;
mEvents = null;
@@ -415,9 +490,8 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
@Override
- void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
- int flags) {
- notifyViewTextChanged(mId, id, text, flags);
+ void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text) {
+ notifyViewTextChanged(mId, id, text);
}
@Override
@@ -426,7 +500,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
&& !mDisabled.get();
}
- // TODO(b/121033016): refactor "notifyXXXX" methods below to a common "Buffer" object that is
+ // TODO(b/122454205): refactor "notifyXXXX" methods below to a common "Buffer" object that is
// shared between ActivityContentCaptureSession and ChildContentCaptureSession objects. Such
// change should also get get rid of the "internalNotifyXXXX" methods above
void notifyChildSessionStarted(@NonNull String parentSessionId,
@@ -435,14 +509,14 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
new ContentCaptureEvent(childSessionId, TYPE_SESSION_STARTED)
.setParentSessionId(parentSessionId)
.setClientContext(clientContext),
- /* forceFlush= */ false));
+ /* forceFlush= */ true));
}
void notifyChildSessionFinished(@NonNull String parentSessionId,
@NonNull String childSessionId) {
mHandler.sendMessage(obtainMessage(MainContentCaptureSession::handleSendEvent, this,
new ContentCaptureEvent(childSessionId, TYPE_SESSION_FINISHED)
- .setParentSessionId(parentSessionId), /* forceFlush= */ false));
+ .setParentSessionId(parentSessionId), /* forceFlush= */ true));
}
void notifyViewAppeared(@NonNull String sessionId, @NonNull ViewStructureImpl node) {
@@ -458,15 +532,14 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
void notifyViewTextChanged(@NonNull String sessionId, @NonNull AutofillId id,
- @Nullable CharSequence text, int flags) {
+ @Nullable CharSequence text) {
mHandler.sendMessage(obtainMessage(MainContentCaptureSession::handleSendEvent, this,
- new ContentCaptureEvent(sessionId, TYPE_VIEW_TEXT_CHANGED, flags).setAutofillId(id)
+ new ContentCaptureEvent(sessionId, TYPE_VIEW_TEXT_CHANGED).setAutofillId(id)
.setText(text), /* forceFlush= */ false));
}
@Override
void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
- pw.print(prefix); pw.print("id: "); pw.println(mId);
pw.print(prefix); pw.print("mContext: "); pw.println(mContext);
pw.print(prefix); pw.print("user: "); pw.println(mContext.getUserId());
if (mSystemServerInterface != null) {
@@ -479,8 +552,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
pw.print(prefix); pw.print("mDisabled: "); pw.println(mDisabled.get());
pw.print(prefix); pw.print("isEnabled(): "); pw.println(isContentCaptureEnabled());
- pw.print(prefix); pw.print("state: "); pw.print(mState); pw.print(" (");
- pw.print(getStateAsString(mState)); pw.println(")");
+ pw.print(prefix); pw.print("state: "); pw.println(getStateAsString(mState));
if (mApplicationToken != null) {
pw.print(prefix); pw.print("app token: "); pw.println(mApplicationToken);
}
@@ -502,16 +574,25 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
pw.print(prefix); pw.print("flush frequency: "); pw.println(FLUSHING_FREQUENCY_MS);
pw.print(prefix); pw.print("next flush: ");
- TimeUtils.formatDuration(mNextFlush - SystemClock.elapsedRealtime(), pw); pw.println();
+ TimeUtils.formatDuration(mNextFlush - System.currentTimeMillis(), pw);
+ pw.print(" ("); pw.print(TimeUtils.logTimeOfDay(mNextFlush)); pw.println(")");
}
+ pw.print(prefix); pw.println("flush history:");
+ mFlushHistory.reverseDump(/* fd= */ null, pw, /* args= */ null); pw.println();
+
super.dump(prefix, pw);
}
/**
* Gets a string that can be used to identify the activity on logging statements.
*/
- private String getActivityDebugName() {
- return mComponentName == null ? mContext.getPackageName()
- : mComponentName.flattenToShortString();
+ private String getActivityName() {
+ return mComponentName == null
+ ? "pkg:" + mContext.getPackageName()
+ : "act:" + mComponentName.flattenToShortString();
+ }
+
+ private String getDebugState() {
+ return getActivityName() + " (state=" + getStateAsString(mState) + ")";
}
}
diff --git a/core/java/android/view/contentcapture/ViewNode.java b/core/java/android/view/contentcapture/ViewNode.java
index 86b89adb5ce3..cbc946b773ca 100644
--- a/core/java/android/view/contentcapture/ViewNode.java
+++ b/core/java/android/view/contentcapture/ViewNode.java
@@ -24,6 +24,7 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewParent;
@@ -32,30 +33,169 @@ import android.view.ViewStructure.HtmlInfo.Builder;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
-//TODO(b/111276913): add javadocs / implement Parcelable / implement
-//TODO(b/111276913): for now it's extending ViewNode directly as it needs most of its properties,
+//TODO(b/122484602): add javadocs / implement Parcelable / implement
+//TODO(b/122484602): for now it's extending ViewNode directly as it needs most of its properties,
// but it might be better to create a common, abstract android.view.ViewNode class that both extend
// instead
/** @hide */
@SystemApi
public final class ViewNode extends AssistStructure.ViewNode {
- private static final String TAG = "ViewNode";
+ private static final String TAG = ViewNode.class.getSimpleName();
+
+ private static final long FLAGS_HAS_TEXT = 1L << 0;
+ private static final long FLAGS_HAS_COMPLEX_TEXT = 1L << 1;
+ private static final long FLAGS_VISIBILITY_MASK = View.VISIBLE | View.INVISIBLE | View.GONE;
+ private static final long FLAGS_HAS_CLASSNAME = 1L << 4;
+ private static final long FLAGS_HAS_AUTOFILL_ID = 1L << 5;
+ private static final long FLAGS_HAS_AUTOFILL_PARENT_ID = 1L << 6;
+ private static final long FLAGS_HAS_ID = 1L << 7;
+ private static final long FLAGS_HAS_LARGE_COORDS = 1L << 8;
+ private static final long FLAGS_HAS_SCROLL = 1L << 9;
+ private static final long FLAGS_ASSIST_BLOCKED = 1L << 10;
+ private static final long FLAGS_DISABLED = 1L << 11;
+ private static final long FLAGS_CLICKABLE = 1L << 12;
+ private static final long FLAGS_LONG_CLICKABLE = 1L << 13;
+ private static final long FLAGS_CONTEXT_CLICKABLE = 1L << 14;
+ private static final long FLAGS_FOCUSABLE = 1L << 15;
+ private static final long FLAGS_FOCUSED = 1L << 16;
+ private static final long FLAGS_ACCESSIBILITY_FOCUSED = 1L << 17;
+ private static final long FLAGS_CHECKABLE = 1L << 18;
+ private static final long FLAGS_CHECKED = 1L << 19;
+ private static final long FLAGS_SELECTED = 1L << 20;
+ private static final long FLAGS_ACTIVATED = 1L << 21;
+ private static final long FLAGS_OPAQUE = 1L << 22;
+ private static final long FLAGS_HAS_CONTENT_DESCRIPTION = 1L << 23;
+ private static final long FLAGS_HAS_EXTRAS = 1L << 24;
+ private static final long FLAGS_HAS_LOCALE_LIST = 1L << 25;
+ private static final long FLAGS_HAS_INPUT_TYPE = 1L << 26;
+ private static final long FLAGS_HAS_MIN_TEXT_EMS = 1L << 27;
+ private static final long FLAGS_HAS_MAX_TEXT_EMS = 1L << 28;
+ private static final long FLAGS_HAS_MAX_TEXT_LENGTH = 1L << 29;
+ private static final long FLAGS_HAS_TEXT_ID_ENTRY = 1L << 30;
+ private static final long FLAGS_HAS_AUTOFILL_TYPE = 1L << 31;
+ private static final long FLAGS_HAS_AUTOFILL_VALUE = 1L << 32;
+ private static final long FLAGS_HAS_AUTOFILL_HINTS = 1L << 33;
+ private static final long FLAGS_HAS_AUTOFILL_OPTIONS = 1L << 34;
+
+ /** Flags used to optimize what's written to the parcel */
+ private long mFlags;
private AutofillId mParentAutofillId;
- // TODO(b/111276913): temporarily setting some fields here while they're not accessible from the
- // superclass
private AutofillId mAutofillId;
- private CharSequence mText;
+ private ViewNodeText mText;
private String mClassName;
+ private int mId = View.NO_ID;
+ private String mIdPackage;
+ private String mIdType;
+ private String mIdEntry;
+ private int mX;
+ private int mY;
+ private int mScrollX;
+ private int mScrollY;
+ private int mWidth;
+ private int mHeight;
+ private CharSequence mContentDescription;
+ private Bundle mExtras;
+ private LocaleList mLocaleList;
+ private int mInputType;
+ private int mMinEms = -1;
+ private int mMaxEms = -1;
+ private int mMaxLength = -1;
+ private String mTextIdEntry;
+ private @View.AutofillType int mAutofillType = View.AUTOFILL_TYPE_NONE;
+ private String[] mAutofillHints;
+ private AutofillValue mAutofillValue;
+ private CharSequence[] mAutofillOptions;
/** @hide */
public ViewNode() {
}
+ private ViewNode(long nodeFlags, @NonNull Parcel parcel) {
+ mFlags = nodeFlags;
+
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_ID) != 0) {
+ mAutofillId = parcel.readParcelable(null);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_PARENT_ID) != 0) {
+ mParentAutofillId = parcel.readParcelable(null);
+ }
+ if ((nodeFlags & FLAGS_HAS_TEXT) != 0) {
+ mText = new ViewNodeText(parcel, (nodeFlags & FLAGS_HAS_COMPLEX_TEXT) == 0);
+ }
+ if ((nodeFlags & FLAGS_HAS_CLASSNAME) != 0) {
+ mClassName = parcel.readString();
+ }
+ if ((nodeFlags & FLAGS_HAS_ID) != 0) {
+ mId = parcel.readInt();
+ if (mId != View.NO_ID) {
+ mIdEntry = parcel.readString();
+ if (mIdEntry != null) {
+ mIdType = parcel.readString();
+ mIdPackage = parcel.readString();
+ }
+ }
+ }
+ if ((nodeFlags & FLAGS_HAS_LARGE_COORDS) != 0) {
+ mX = parcel.readInt();
+ mY = parcel.readInt();
+ mWidth = parcel.readInt();
+ mHeight = parcel.readInt();
+ } else {
+ int val = parcel.readInt();
+ mX = val & 0x7fff;
+ mY = (val >> 16) & 0x7fff;
+ val = parcel.readInt();
+ mWidth = val & 0x7fff;
+ mHeight = (val >> 16) & 0x7fff;
+ }
+ if ((nodeFlags & FLAGS_HAS_SCROLL) != 0) {
+ mScrollX = parcel.readInt();
+ mScrollY = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_CONTENT_DESCRIPTION) != 0) {
+ mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
+ }
+ if ((nodeFlags & FLAGS_HAS_EXTRAS) != 0) {
+ mExtras = parcel.readBundle();
+ }
+ if ((nodeFlags & FLAGS_HAS_LOCALE_LIST) != 0) {
+ mLocaleList = parcel.readParcelable(null);
+ }
+ if ((nodeFlags & FLAGS_HAS_INPUT_TYPE) != 0) {
+ mInputType = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_MIN_TEXT_EMS) != 0) {
+ mMinEms = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_MAX_TEXT_EMS) != 0) {
+ mMaxEms = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_MAX_TEXT_LENGTH) != 0) {
+ mMaxLength = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_TEXT_ID_ENTRY) != 0) {
+ mTextIdEntry = parcel.readString();
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_TYPE) != 0) {
+ mAutofillType = parcel.readInt();
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_HINTS) != 0) {
+ mAutofillHints = parcel.readStringArray();
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_VALUE) != 0) {
+ mAutofillValue = parcel.readParcelable(null);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_OPTIONS) != 0) {
+ mAutofillOptions = parcel.readCharSequenceArray();
+ }
+ }
+
/**
* Returns the {@link AutofillId} of this view's parent, if the parent is also part of the
* screen observation tree.
@@ -65,53 +205,410 @@ public final class ViewNode extends AssistStructure.ViewNode {
return mParentAutofillId;
}
- // TODO(b/111276913): temporarily overwriting some methods
@Override
public AutofillId getAutofillId() {
return mAutofillId;
}
+
@Override
public CharSequence getText() {
- return mText;
+ return mText != null ? mText.mText : null;
}
+
@Override
public String getClassName() {
return mClassName;
}
+ @Override
+ public int getId() {
+ return mId;
+ }
+
+ @Override
+ public String getIdPackage() {
+ return mIdPackage;
+ }
+
+ @Override
+ public String getIdType() {
+ return mIdType;
+ }
+
+ @Override
+ public String getIdEntry() {
+ return mIdEntry;
+ }
+
+ @Override
+ public int getLeft() {
+ return mX;
+ }
+
+ @Override
+ public int getTop() {
+ return mY;
+ }
+
+ @Override
+ public int getScrollX() {
+ return mScrollX;
+ }
+
+ @Override
+ public int getScrollY() {
+ return mScrollY;
+ }
+
+ @Override
+ public int getWidth() {
+ return mWidth;
+ }
+
+ @Override
+ public int getHeight() {
+ return mHeight;
+ }
+
+ @Override
+ public boolean isAssistBlocked() {
+ return (mFlags & FLAGS_ASSIST_BLOCKED) != 0;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return (mFlags & FLAGS_DISABLED) == 0;
+ }
+
+ @Override
+ public boolean isClickable() {
+ return (mFlags & FLAGS_CLICKABLE) != 0;
+ }
+
+ @Override
+ public boolean isLongClickable() {
+ return (mFlags & FLAGS_LONG_CLICKABLE) != 0;
+ }
+
+ @Override
+ public boolean isContextClickable() {
+ return (mFlags & FLAGS_CONTEXT_CLICKABLE) != 0;
+ }
+
+ @Override
+ public boolean isFocusable() {
+ return (mFlags & FLAGS_FOCUSABLE) != 0;
+ }
+
+ @Override
+ public boolean isFocused() {
+ return (mFlags & FLAGS_FOCUSED) != 0;
+ }
+
+ @Override
+ public boolean isAccessibilityFocused() {
+ return (mFlags & FLAGS_ACCESSIBILITY_FOCUSED) != 0;
+ }
+
+ @Override
+ public boolean isCheckable() {
+ return (mFlags & FLAGS_CHECKABLE) != 0;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return (mFlags & FLAGS_CHECKED) != 0;
+ }
+
+ @Override
+ public boolean isSelected() {
+ return (mFlags & FLAGS_SELECTED) != 0;
+ }
+
+ @Override
+ public boolean isActivated() {
+ return (mFlags & FLAGS_ACTIVATED) != 0;
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return (mFlags & FLAGS_OPAQUE) != 0;
+ }
+
+ @Override
+ public CharSequence getContentDescription() {
+ return mContentDescription;
+ }
+
+ @Override
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public String getHint() {
+ return mText != null ? mText.mHint : null;
+ }
+
+ @Override
+ public int getTextSelectionStart() {
+ return mText != null ? mText.mTextSelectionStart : -1;
+ }
+
+ @Override
+ public int getTextSelectionEnd() {
+ return mText != null ? mText.mTextSelectionEnd : -1;
+ }
+
+ @Override
+ public int getTextColor() {
+ return mText != null ? mText.mTextColor : TEXT_COLOR_UNDEFINED;
+ }
+
+ @Override
+ public int getTextBackgroundColor() {
+ return mText != null ? mText.mTextBackgroundColor : TEXT_COLOR_UNDEFINED;
+ }
+
+ @Override
+ public float getTextSize() {
+ return mText != null ? mText.mTextSize : 0;
+ }
+
+ @Override
+ public int getTextStyle() {
+ return mText != null ? mText.mTextStyle : 0;
+ }
+
+ @Override
+ public int[] getTextLineCharOffsets() {
+ return mText != null ? mText.mLineCharOffsets : null;
+ }
+
+ @Override
+ public int[] getTextLineBaselines() {
+ return mText != null ? mText.mLineBaselines : null;
+ }
+
+ @Override
+ public int getVisibility() {
+ return (int) (mFlags & FLAGS_VISIBILITY_MASK);
+ }
+
+ @Override
+ public int getInputType() {
+ return mInputType;
+ }
+
+ @Override
+ public int getMinTextEms() {
+ return mMinEms;
+ }
+
+ @Override
+ public int getMaxTextEms() {
+ return mMaxEms;
+ }
+
+ @Override
+ public int getMaxTextLength() {
+ return mMaxLength;
+ }
+
+ @Override
+ public String getTextIdEntry() {
+ return mTextIdEntry;
+ }
+
+ @Override
+ public @View.AutofillType int getAutofillType() {
+ return mAutofillType;
+ }
+
+ @Override
+ @Nullable public String[] getAutofillHints() {
+ return mAutofillHints;
+ }
+
+ @Override
+ @Nullable public AutofillValue getAutofillValue() {
+ return mAutofillValue;
+ }
+
+ @Override
+ @Nullable public CharSequence[] getAutofillOptions() {
+ return mAutofillOptions;
+ }
+
+ @Override
+ public LocaleList getLocaleList() {
+ return mLocaleList;
+ }
+
+ private void writeSelfToParcel(@NonNull Parcel parcel, int parcelFlags) {
+ long nodeFlags = mFlags;
+
+ if (mAutofillId != null) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_ID;
+ }
+
+ if (mParentAutofillId != null) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_PARENT_ID;
+ }
+
+ if (mText != null) {
+ nodeFlags |= FLAGS_HAS_TEXT;
+ if (!mText.isSimple()) {
+ nodeFlags |= FLAGS_HAS_COMPLEX_TEXT;
+ }
+ }
+ if (mClassName != null) {
+ nodeFlags |= FLAGS_HAS_CLASSNAME;
+ }
+ if (mId != View.NO_ID) {
+ nodeFlags |= FLAGS_HAS_ID;
+ }
+ if ((mX & ~0x7fff) != 0 || (mY & ~0x7fff) != 0
+ || (mWidth & ~0x7fff) != 0 | (mHeight & ~0x7fff) != 0) {
+ nodeFlags |= FLAGS_HAS_LARGE_COORDS;
+ }
+ if (mScrollX != 0 || mScrollY != 0) {
+ nodeFlags |= FLAGS_HAS_SCROLL;
+ }
+ if (mContentDescription != null) {
+ nodeFlags |= FLAGS_HAS_CONTENT_DESCRIPTION;
+ }
+ if (mExtras != null) {
+ nodeFlags |= FLAGS_HAS_EXTRAS;
+ }
+ if (mLocaleList != null) {
+ nodeFlags |= FLAGS_HAS_LOCALE_LIST;
+ }
+ if (mInputType != 0) {
+ nodeFlags |= FLAGS_HAS_INPUT_TYPE;
+ }
+ if (mMinEms > -1) {
+ nodeFlags |= FLAGS_HAS_MIN_TEXT_EMS;
+ }
+ if (mMaxEms > -1) {
+ nodeFlags |= FLAGS_HAS_MAX_TEXT_EMS;
+ }
+ if (mMaxLength > -1) {
+ nodeFlags |= FLAGS_HAS_MAX_TEXT_LENGTH;
+ }
+ if (mTextIdEntry != null) {
+ nodeFlags |= FLAGS_HAS_TEXT_ID_ENTRY;
+ }
+ if (mAutofillValue != null) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_VALUE;
+ }
+ if (mAutofillType != View.AUTOFILL_TYPE_NONE) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_TYPE;
+ }
+ if (mAutofillHints != null) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_HINTS;
+ }
+ if (mAutofillOptions != null) {
+ nodeFlags |= FLAGS_HAS_AUTOFILL_OPTIONS;
+ }
+ parcel.writeLong(nodeFlags);
+
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_ID) != 0) {
+ parcel.writeParcelable(mAutofillId, parcelFlags);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_PARENT_ID) != 0) {
+ parcel.writeParcelable(mParentAutofillId, parcelFlags);
+ }
+ if ((nodeFlags & FLAGS_HAS_TEXT) != 0) {
+ mText.writeToParcel(parcel, (nodeFlags & FLAGS_HAS_COMPLEX_TEXT) == 0);
+ }
+ if ((nodeFlags & FLAGS_HAS_CLASSNAME) != 0) {
+ parcel.writeString(mClassName);
+ }
+ if ((nodeFlags & FLAGS_HAS_ID) != 0) {
+ parcel.writeInt(mId);
+ if (mId != View.NO_ID) {
+ parcel.writeString(mIdEntry);
+ if (mIdEntry != null) {
+ parcel.writeString(mIdType);
+ parcel.writeString(mIdPackage);
+ }
+ }
+ }
+ if ((nodeFlags & FLAGS_HAS_LARGE_COORDS) != 0) {
+ parcel.writeInt(mX);
+ parcel.writeInt(mY);
+ parcel.writeInt(mWidth);
+ parcel.writeInt(mHeight);
+ } else {
+ parcel.writeInt((mY << 16) | mX);
+ parcel.writeInt((mHeight << 16) | mWidth);
+ }
+ if ((nodeFlags & FLAGS_HAS_SCROLL) != 0) {
+ parcel.writeInt(mScrollX);
+ parcel.writeInt(mScrollY);
+ }
+ if ((nodeFlags & FLAGS_HAS_CONTENT_DESCRIPTION) != 0) {
+ TextUtils.writeToParcel(mContentDescription, parcel, 0);
+ }
+ if ((nodeFlags & FLAGS_HAS_EXTRAS) != 0) {
+ parcel.writeBundle(mExtras);
+ }
+ if ((nodeFlags & FLAGS_HAS_LOCALE_LIST) != 0) {
+ parcel.writeParcelable(mLocaleList, 0);
+ }
+ if ((nodeFlags & FLAGS_HAS_INPUT_TYPE) != 0) {
+ parcel.writeInt(mInputType);
+ }
+ if ((nodeFlags & FLAGS_HAS_MIN_TEXT_EMS) != 0) {
+ parcel.writeInt(mMinEms);
+ }
+ if ((nodeFlags & FLAGS_HAS_MAX_TEXT_EMS) != 0) {
+ parcel.writeInt(mMaxEms);
+ }
+ if ((nodeFlags & FLAGS_HAS_MAX_TEXT_LENGTH) != 0) {
+ parcel.writeInt(mMaxLength);
+ }
+ if ((nodeFlags & FLAGS_HAS_TEXT_ID_ENTRY) != 0) {
+ parcel.writeString(mTextIdEntry);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_TYPE) != 0) {
+ parcel.writeInt(mAutofillType);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_HINTS) != 0) {
+ parcel.writeStringArray(mAutofillHints);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_VALUE) != 0) {
+ parcel.writeParcelable(mAutofillValue, 0);
+ }
+ if ((nodeFlags & FLAGS_HAS_AUTOFILL_OPTIONS) != 0) {
+ parcel.writeCharSequenceArray(mAutofillOptions);
+ }
+ }
+
/** @hide */
public static void writeToParcel(@NonNull Parcel parcel, @Nullable ViewNode node, int flags) {
if (node == null) {
- parcel.writeParcelable(null, flags);
- return;
+ parcel.writeLong(0);
+ } else {
+ node.writeSelfToParcel(parcel, flags);
}
- parcel.writeParcelable(node.mAutofillId, flags);
- parcel.writeParcelable(node.mParentAutofillId, flags);
- parcel.writeCharSequence(node.mText);
- parcel.writeString(node.mClassName);
}
/** @hide */
public static @Nullable ViewNode readFromParcel(@NonNull Parcel parcel) {
- final AutofillId id = parcel.readParcelable(null);
- if (id == null) return null;
-
- final ViewNode node = new ViewNode();
-
- node.mAutofillId = id;
- node.mParentAutofillId = parcel.readParcelable(null);
- node.mText = parcel.readCharSequence();
- node.mClassName = parcel.readString();
-
- return node;
+ final long nodeFlags = parcel.readLong();
+ return nodeFlags == 0 ? new ViewNode() : new ViewNode(nodeFlags, parcel);
}
/** @hide */
- static final class ViewStructureImpl extends ViewStructure {
+ @VisibleForTesting // Must be public to be accessed from FrameworkCoreTests' apk.
+ public static final class ViewStructureImpl extends ViewStructure {
final ViewNode mNode = new ViewNode();
- ViewStructureImpl(@NonNull View view) {
+ @VisibleForTesting // Must be public to be accessed from FrameworkCoreTests' apk.
+ public ViewStructureImpl(@NonNull View view) {
mNode.mAutofillId = Preconditions.checkNotNull(view).getAutofillId();
final ViewParent parent = view.getParent();
if (parent instanceof View) {
@@ -119,179 +616,208 @@ public final class ViewNode extends AssistStructure.ViewNode {
}
}
- ViewStructureImpl(@NonNull AutofillId parentId, int virtualId) {
+ @VisibleForTesting // Must be public to be accessed from FrameworkCoreTests' apk.
+ public ViewStructureImpl(@NonNull AutofillId parentId, int virtualId, int sessionId) {
mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
- mNode.mAutofillId = new AutofillId(parentId, virtualId);
+ mNode.mAutofillId = new AutofillId(parentId, virtualId, sessionId);
+ }
+
+ @VisibleForTesting // Must be public to be accessed from FrameworkCoreTests' apk.
+ public ViewNode getNode() {
+ return mNode;
}
@Override
public void setId(int id, String packageName, String typeName, String entryName) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mId = id;
+ mNode.mIdPackage = packageName;
+ mNode.mIdType = typeName;
+ mNode.mIdEntry = entryName;
}
@Override
public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mX = left;
+ mNode.mY = top;
+ mNode.mScrollX = scrollX;
+ mNode.mScrollY = scrollY;
+ mNode.mWidth = width;
+ mNode.mHeight = height;
}
@Override
public void setTransformation(Matrix matrix) {
- // TODO(b/111276913): implement or move to superclass
+ Log.w(TAG, "setTransformation() is not supported");
}
@Override
public void setElevation(float elevation) {
- // TODO(b/111276913): implement or move to superclass
+ Log.w(TAG, "setElevation() is not supported");
}
@Override
public void setAlpha(float alpha) {
- // TODO(b/111276913): implement or move to superclass
+ Log.w(TAG, "setAlpha() is not supported");
}
@Override
public void setVisibility(int visibility) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_VISIBILITY_MASK)
+ | (visibility & FLAGS_VISIBILITY_MASK);
}
@Override
public void setAssistBlocked(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_ASSIST_BLOCKED)
+ | (state ? FLAGS_ASSIST_BLOCKED : 0);
}
@Override
public void setEnabled(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_DISABLED) | (state ? 0 : FLAGS_DISABLED);
}
@Override
public void setClickable(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_CLICKABLE) | (state ? FLAGS_CLICKABLE : 0);
}
@Override
public void setLongClickable(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_LONG_CLICKABLE)
+ | (state ? FLAGS_LONG_CLICKABLE : 0);
}
@Override
public void setContextClickable(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_CONTEXT_CLICKABLE)
+ | (state ? FLAGS_CONTEXT_CLICKABLE : 0);
}
@Override
public void setFocusable(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_FOCUSABLE) | (state ? FLAGS_FOCUSABLE : 0);
}
@Override
public void setFocused(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_FOCUSED) | (state ? FLAGS_FOCUSED : 0);
}
@Override
public void setAccessibilityFocused(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_ACCESSIBILITY_FOCUSED)
+ | (state ? FLAGS_ACCESSIBILITY_FOCUSED : 0);
}
@Override
public void setCheckable(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_CHECKABLE) | (state ? FLAGS_CHECKABLE : 0);
}
@Override
public void setChecked(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_CHECKED) | (state ? FLAGS_CHECKED : 0);
}
@Override
public void setSelected(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_SELECTED) | (state ? FLAGS_SELECTED : 0);
}
@Override
public void setActivated(boolean state) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_ACTIVATED) | (state ? FLAGS_ACTIVATED : 0);
}
@Override
public void setOpaque(boolean opaque) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mFlags = (mNode.mFlags & ~FLAGS_OPAQUE) | (opaque ? FLAGS_OPAQUE : 0);
}
@Override
public void setClassName(String className) {
- // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mClassName = className;
}
@Override
public void setContentDescription(CharSequence contentDescription) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mContentDescription = contentDescription;
}
@Override
public void setText(CharSequence text) {
- // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
- mNode.mText = text;
+ final ViewNodeText t = getNodeText();
+ t.mText = TextUtils.trimNoCopySpans(text);
+ t.mTextSelectionStart = t.mTextSelectionEnd = -1;
}
@Override
public void setText(CharSequence text, int selectionStart, int selectionEnd) {
- // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
- mNode.mText = text;
- // TODO(b/111276913): implement or move to superclass
+ final ViewNodeText t = getNodeText();
+ t.mText = TextUtils.trimNoCopySpans(text);
+ t.mTextSelectionStart = selectionStart;
+ t.mTextSelectionEnd = selectionEnd;
}
@Override
public void setTextStyle(float size, int fgColor, int bgColor, int style) {
- // TODO(b/111276913): implement or move to superclass
+ final ViewNodeText t = getNodeText();
+ t.mTextColor = fgColor;
+ t.mTextBackgroundColor = bgColor;
+ t.mTextSize = size;
+ t.mTextStyle = style;
}
@Override
public void setTextLines(int[] charOffsets, int[] baselines) {
- // TODO(b/111276913): implement or move to superclass
+ final ViewNodeText t = getNodeText();
+ t.mLineCharOffsets = charOffsets;
+ t.mLineBaselines = baselines;
+ }
+
+ @Override
+ public void setTextIdEntry(String entryName) {
+ mNode.mTextIdEntry = Preconditions.checkNotNull(entryName);
}
@Override
public void setHint(CharSequence hint) {
- // TODO(b/111276913): implement or move to superclass
+ getNodeText().mHint = hint != null ? hint.toString() : null;
}
@Override
public CharSequence getText() {
- // TODO(b/111276913): temporarily getting directly; should be done on superclass instead
- return mNode.mText;
+ return mNode.getText();
}
@Override
public int getTextSelectionStart() {
- // TODO(b/111276913): implement or move to superclass
- return 0;
+ return mNode.getTextSelectionStart();
}
@Override
public int getTextSelectionEnd() {
- // TODO(b/111276913): implement or move to superclass
- return 0;
+ return mNode.getTextSelectionEnd();
}
@Override
public CharSequence getHint() {
- // TODO(b/111276913): implement or move to superclass
- return null;
+ return mNode.getHint();
}
@Override
public Bundle getExtras() {
- // TODO(b/111276913): implement or move to superclass
- return null;
+ if (mNode.mExtras != null) {
+ return mNode.mExtras;
+ }
+ mNode.mExtras = new Bundle();
+ return mNode.mExtras;
}
@Override
public boolean hasExtras() {
- // TODO(b/111276913): implement or move to superclass
- return false;
+ return mNode.mExtras != null;
}
@Override
@@ -325,50 +851,64 @@ public final class ViewNode extends AssistStructure.ViewNode {
@Override
public AutofillId getAutofillId() {
- // TODO(b/111276913): temporarily getting directly; should be done on superclass instead
return mNode.mAutofillId;
}
@Override
public void setAutofillId(AutofillId id) {
- // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
- mNode.mAutofillId = id;
+ mNode.mAutofillId = Preconditions.checkNotNull(id);
}
+
@Override
public void setAutofillId(AutofillId parentId, int virtualId) {
- // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
+ mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
mNode.mAutofillId = new AutofillId(parentId, virtualId);
}
@Override
- public void setAutofillType(int type) {
- // TODO(b/111276913): implement or move to superclass
+ public void setAutofillType(@View.AutofillType int type) {
+ mNode.mAutofillType = type;
}
@Override
- public void setAutofillHints(String[] hint) {
- // TODO(b/111276913): implement or move to superclass
+ public void setAutofillHints(String[] hints) {
+ mNode.mAutofillHints = hints;
}
@Override
public void setAutofillValue(AutofillValue value) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mAutofillValue = value;
}
@Override
public void setAutofillOptions(CharSequence[] options) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mAutofillOptions = options;
}
@Override
public void setInputType(int inputType) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mInputType = inputType;
+ }
+
+ @Override
+ public void setMinTextEms(int minEms) {
+ mNode.mMinEms = minEms;
+ }
+
+ @Override
+ public void setMaxTextEms(int maxEms) {
+ mNode.mMaxEms = maxEms;
+ }
+
+ @Override
+ public void setMaxTextLength(int maxLength) {
+ mNode.mMaxLength = maxLength;
}
@Override
public void setDataIsSensitive(boolean sensitive) {
- // TODO(b/111276913): implement or move to superclass
+ Log.w(TAG, "setDataIsSensitive() is not supported");
}
@Override
@@ -378,7 +918,7 @@ public final class ViewNode extends AssistStructure.ViewNode {
@Override
public Rect getTempRect() {
- // TODO(b/111276913): implement or move to superclass
+ Log.w(TAG, "getTempRect() is not supported");
return null;
}
@@ -389,7 +929,7 @@ public final class ViewNode extends AssistStructure.ViewNode {
@Override
public void setLocaleList(LocaleList localeList) {
- // TODO(b/111276913): implement or move to superclass
+ mNode.mLocaleList = localeList;
}
@Override
@@ -402,5 +942,66 @@ public final class ViewNode extends AssistStructure.ViewNode {
public void setHtmlInfo(HtmlInfo htmlInfo) {
Log.w(TAG, "setHtmlInfo() is not supported");
}
+
+ private ViewNodeText getNodeText() {
+ if (mNode.mText != null) {
+ return mNode.mText;
+ }
+ mNode.mText = new ViewNodeText();
+ return mNode.mText;
+ }
+ }
+
+ //TODO(b/122484602): copied 'as-is' from AssistStructure, except for writeSensitive
+ static final class ViewNodeText {
+ CharSequence mText;
+ float mTextSize;
+ int mTextStyle;
+ int mTextColor = ViewNode.TEXT_COLOR_UNDEFINED;
+ int mTextBackgroundColor = ViewNode.TEXT_COLOR_UNDEFINED;
+ int mTextSelectionStart;
+ int mTextSelectionEnd;
+ int[] mLineCharOffsets;
+ int[] mLineBaselines;
+ String mHint;
+
+ ViewNodeText() {
+ }
+
+ boolean isSimple() {
+ return mTextBackgroundColor == ViewNode.TEXT_COLOR_UNDEFINED
+ && mTextSelectionStart == 0 && mTextSelectionEnd == 0
+ && mLineCharOffsets == null && mLineBaselines == null && mHint == null;
+ }
+
+ ViewNodeText(Parcel in, boolean simple) {
+ mText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mTextSize = in.readFloat();
+ mTextStyle = in.readInt();
+ mTextColor = in.readInt();
+ if (!simple) {
+ mTextBackgroundColor = in.readInt();
+ mTextSelectionStart = in.readInt();
+ mTextSelectionEnd = in.readInt();
+ mLineCharOffsets = in.createIntArray();
+ mLineBaselines = in.createIntArray();
+ mHint = in.readString();
+ }
+ }
+
+ void writeToParcel(Parcel out, boolean simple) {
+ TextUtils.writeToParcel(mText, out, 0);
+ out.writeFloat(mTextSize);
+ out.writeInt(mTextStyle);
+ out.writeInt(mTextColor);
+ if (!simple) {
+ out.writeInt(mTextBackgroundColor);
+ out.writeInt(mTextSelectionStart);
+ out.writeInt(mTextSelectionEnd);
+ out.writeIntArray(mLineCharOffsets);
+ out.writeIntArray(mLineBaselines);
+ out.writeString(mHint);
+ }
+ }
}
}
diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java
index 28d9fcf57370..f99afe6cdab9 100644
--- a/core/java/android/view/inputmethod/EditorInfo.java
+++ b/core/java/android/view/inputmethod/EditorInfo.java
@@ -16,11 +16,15 @@
package android.view.inputmethod;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.UserHandle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Printer;
@@ -472,6 +476,26 @@ public class EditorInfo implements InputType, Parcelable {
public String[] contentMimeTypes = null;
/**
+ * If not {@code null}, this editor needs to talk to IMEs that run for the specified user, no
+ * matter what user ID the calling process has.
+ *
+ * <p>Note: This field is silently ignored when:</p>
+ * <ul>
+ * <li>{@link android.view.inputmethod.InputMethodSystemProperty#PER_PROFILE_IME_ENABLED} is
+ * {@code false}.</li>
+ * <li>{@link android.view.inputmethod.InputMethodSystemProperty#MULTI_CLIENT_IME_ENABLED}
+ * is {@code true}.</li>
+ * </ul>
+ *
+ * <p>Note also that pseudo handles such as {@link UserHandle#ALL} are not supported.</p>
+ *
+ * @hide
+ */
+ @RequiresPermission(INTERACT_ACROSS_USERS_FULL)
+ @Nullable
+ public UserHandle targetInputMethodUser = null;
+
+ /**
* Ensure that the data in this EditorInfo is compatible with an application
* that was developed against the given target API version. This can
* impact the following input types:
@@ -527,6 +551,9 @@ public class EditorInfo implements InputType, Parcelable {
pw.println(prefix + "extras=" + extras);
pw.println(prefix + "hintLocales=" + hintLocales);
pw.println(prefix + "contentMimeTypes=" + Arrays.toString(contentMimeTypes));
+ if (targetInputMethodUser != null) {
+ pw.println(prefix + "targetInputMethodUserId=" + targetInputMethodUser.getIdentifier());
+ }
}
/**
@@ -556,6 +583,7 @@ public class EditorInfo implements InputType, Parcelable {
LocaleList.getEmptyLocaleList().writeToParcel(dest, flags);
}
dest.writeStringArray(contentMimeTypes);
+ UserHandle.writeToParcel(targetInputMethodUser, dest);
}
/**
@@ -582,6 +610,7 @@ public class EditorInfo implements InputType, Parcelable {
LocaleList hintLocales = LocaleList.CREATOR.createFromParcel(source);
res.hintLocales = hintLocales.isEmpty() ? null : hintLocales;
res.contentMimeTypes = source.readStringArray();
+ res.targetInputMethodUser = UserHandle.readFromParcel(source);
return res;
}
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 1ba7d8ed5db2..86c5f188ffab 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -980,24 +980,30 @@ public final class InputMethodManager {
InputMethodPrivilegedOperationsRegistry.get(imeToken).updateStatusIcon(null, 0);
}
- /** @hide */
+ /**
+ * This hidden API is deprecated in {@link android.os.Build.VERSION_CODES#Q}. Does nothing.
+ *
+ * @param spans will be ignored.
+ *
+ * @deprecated Do not use.
+ * @hide
+ */
+ @Deprecated
@UnsupportedAppUsage
public void registerSuggestionSpansForNotification(SuggestionSpan[] spans) {
- try {
- mService.registerSuggestionSpansForNotification(spans);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ Log.w(TAG, "registerSuggestionSpansForNotification() is deprecated. Does nothing.");
}
- /** @hide */
+ /**
+ * This hidden API is deprecated in {@link android.os.Build.VERSION_CODES#Q}. Does nothing.
+ *
+ * @deprecated Do not use.
+ * @hide
+ */
+ @Deprecated
@UnsupportedAppUsage
public void notifySuggestionPicked(SuggestionSpan span, String originalString, int index) {
- try {
- mService.notifySuggestionPicked(span, originalString, index);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ Log.w(TAG, "notifySuggestionPicked() is deprecated. Does nothing.");
}
/**
diff --git a/core/java/android/view/inputmethod/InputMethodSystemProperty.java b/core/java/android/view/inputmethod/InputMethodSystemProperty.java
index b233b756686f..57ed7f923e88 100644
--- a/core/java/android/view/inputmethod/InputMethodSystemProperty.java
+++ b/core/java/android/view/inputmethod/InputMethodSystemProperty.java
@@ -41,6 +41,17 @@ public class InputMethodSystemProperty {
*/
private static final String PROP_DEBUG_MULTI_CLIENT_IME = "persist.debug.multi_client_ime";
+ /**
+ * System property key for debugging purpose. The value must be empty, "1", or "0".
+ *
+ * <p>Values 'y', 'yes', '1', 'true' or 'on' are considered true.</p>
+ *
+ * <p>To set, run "adb root && adb shell setprop persist.debug.per_profile_ime 1".</p>
+ *
+ * <p>This value will be ignored when {@link Build#IS_DEBUGGABLE} returns {@code false}.</p>
+ */
+ private static final String PROP_DEBUG_PER_PROFILE_IME = "persist.debug.per_profile_ime";
+
@Nullable
private static ComponentName getMultiClientImeComponentName() {
if (Build.IS_DEBUGGABLE) {
@@ -59,6 +70,9 @@ public class InputMethodSystemProperty {
/**
* {@link ComponentName} of multi-client IME to be used.
*
+ * <p>TODO: Move this back to MultiClientInputMethodManagerService once
+ * {@link #PER_PROFILE_IME_ENABLED} always becomes {@code true}.</p>
+ *
* @hide
*/
@Nullable
@@ -68,7 +82,19 @@ public class InputMethodSystemProperty {
/**
* {@code true} when multi-client IME is enabled.
*
+ * <p>TODO: Move this back to MultiClientInputMethodManagerService once
+ * {@link #PER_PROFILE_IME_ENABLED} always becomes {@code true}.</p>
+ *
* @hide
*/
public static final boolean MULTI_CLIENT_IME_ENABLED = (sMultiClientImeComponentName != null);
+
+ /**
+ * {@code true} when per-profile IME is enabled.
+ * @hide
+ */
+ public static final boolean PER_PROFILE_IME_ENABLED = MULTI_CLIENT_IME_ENABLED
+ || Build.IS_DEBUGGABLE && SystemProperties.getBoolean(
+ PROP_DEBUG_PER_PROFILE_IME, false);
+
}
diff --git a/core/java/android/view/inspector/InspectableNodeName.java b/core/java/android/view/inspector/InspectableNodeName.java
index ea94ad4c5df8..7b9a507ee45d 100644
--- a/core/java/android/view/inspector/InspectableNodeName.java
+++ b/core/java/android/view/inspector/InspectableNodeName.java
@@ -19,6 +19,8 @@ package android.view.inspector;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
+import android.annotation.TestApi;
+
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -39,6 +41,7 @@ import java.lang.annotation.Target;
*/
@Target({TYPE})
@Retention(SOURCE)
+@TestApi
public @interface InspectableNodeName {
/**
* The display name for nodes of this type.
diff --git a/core/java/android/view/inspector/InspectableProperty.java b/core/java/android/view/inspector/InspectableProperty.java
index 5b95715681fc..355ff1d85e1f 100644
--- a/core/java/android/view/inspector/InspectableProperty.java
+++ b/core/java/android/view/inspector/InspectableProperty.java
@@ -20,7 +20,8 @@ import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
-import android.content.res.ResourceId;
+import android.annotation.TestApi;
+import android.content.res.Resources;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -40,6 +41,7 @@ import java.lang.annotation.Target;
*/
@Target({METHOD})
@Retention(SOURCE)
+@TestApi
public @interface InspectableProperty {
/**
* The name of the property.
@@ -57,16 +59,16 @@ public @interface InspectableProperty {
* If left as {ID_NULL}, and {@link #hasAttributeId()} is true, the attribute ID will be
* inferred from {@link #name()}.
*
- * @return The attribute ID of the property or {@link ResourceId#ID_NULL}
+ * @return The attribute ID of the property or {@link Resources#ID_NULL}
*/
- int attributeId() default ResourceId.ID_NULL;
+ int attributeId() default Resources.ID_NULL;
/**
* If this property has an attribute ID.
*
* Set to false if the annotated property does not have an attribute ID, that is, it is not
* inflated from an XML attribute. This will prevent the automatic inference of the attribute
- * ID if {@link #attributeId()} is set to {@link ResourceId#ID_NULL}.
+ * ID if {@link #attributeId()} is set to {@link Resources#ID_NULL}.
*
* @return Whether to infer an attribute ID if not supplied
*/
@@ -86,7 +88,6 @@ public @interface InspectableProperty {
*
* @return An array of {@link EnumMap}, empty if not applicable
* @see android.annotation.IntDef
- * @see IntEnumMapping
*/
EnumMap[] enumMapping() default {};
@@ -105,11 +106,11 @@ public @interface InspectableProperty {
/**
* One entry in an enumeration packed into a primitive {int}.
*
- * @see IntEnumMapping
* @hide
*/
@Target({TYPE})
@Retention(SOURCE)
+ @TestApi
@interface EnumMap {
/**
* The string name of this enumeration value.
@@ -134,6 +135,7 @@ public @interface InspectableProperty {
*/
@Target({TYPE})
@Retention(SOURCE)
+ @TestApi
@interface FlagMap {
/**
* The string name of this flag.
@@ -168,15 +170,22 @@ public @interface InspectableProperty {
*
* @hide
*/
+ @TestApi
enum ValueType {
/**
* No special handling, property is considered to be a numeric value.
+ *
+ * @hide
*/
+ @TestApi
NONE,
/**
* The default the annotation processor infers the value type from context.
+ *
+ * @hide
*/
+ @TestApi
INFERRED,
/**
@@ -185,7 +194,9 @@ public @interface InspectableProperty {
* This is inferred if {@link #enumMapping()} is specified.
*
* @see EnumMap
+ * @hide
*/
+ @TestApi
INT_ENUM,
/**
@@ -194,7 +205,9 @@ public @interface InspectableProperty {
* This is inferred if {@link #flagMapping()} is specified.
*
* @see FlagMap
+ * @hide
*/
+ @TestApi
INT_FLAG,
/**
@@ -204,7 +217,9 @@ public @interface InspectableProperty {
* {@link android.annotation.ColorLong} on the getter method.
*
* @see android.graphics.Color
+ * @hide
*/
+ @TestApi
COLOR,
/**
@@ -213,7 +228,9 @@ public @interface InspectableProperty {
* This type is not inferred, and is non-trivial to represent using {@link FlagMap}.
*
* @see android.view.Gravity
+ * @hide
*/
+ @TestApi
GRAVITY
}
}
diff --git a/core/java/android/view/inspector/IntEnumMapping.java b/core/java/android/view/inspector/IntEnumMapping.java
deleted file mode 100644
index 69f6dce94a81..000000000000
--- a/core/java/android/view/inspector/IntEnumMapping.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.inspector;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-
-import java.util.ArrayList;
-
-/**
- * Maps the values of an {int} property to string names for properties that encode enumerations.
- *
- * An {@link InspectionCompanion} may provide an instance of this class to a {@link PropertyMapper}
- * for enumerations packed into primitive {int} properties.
- *
- * This class is immutable, and must be constructed by a {@link Builder}.
- *
- * @see PropertyMapper#mapIntEnum(String, int, IntEnumMapping)
- */
-public final class IntEnumMapping {
- private final Value[] mValues;
-
- /**
- * Map from a property value to a string name.
- *
- * @param value The value of a property
- * @return The name of the enumeration value, null if the value is not mapped
- */
- @Nullable
- public String nameOf(int value) {
- for (Value valueTuple : mValues) {
- if (valueTuple.mValue == value) {
- return valueTuple.mName;
- }
- }
-
- return null;
- }
-
- /**
- * Create a new instance from a builder.
- *
- * This constructor is private, use {@link Builder#build()} instead.
- *
- * @param builder A builder to create from
- */
- private IntEnumMapping(Builder builder) {
- mValues = builder.mValues.toArray(new Value[builder.mValues.size()]);
- }
-
- /**
- * A builder for {@link IntEnumMapping}
- */
- public static final class Builder {
- private final ArrayList<Value> mValues;
-
- public Builder() {
- mValues = new ArrayList<>();
- }
-
- /**
- * Add a new entry to this mapping.
- *
- * @param name Name of the enumeration value
- * @param value Int value of the enumeration value
- * @return This builder
- */
- @NonNull
- public Builder addValue(@NonNull String name, int value) {
- mValues.add(new Value(name, value));
- return this;
- }
-
- /**
- * Clear the builder, allowing for recycling.
- */
- public void clear() {
- mValues.clear();
- }
-
- /**
- * Build a new {@link IntEnumMapping} from this builder
- *
- * @return A new mapping
- */
- @NonNull
- public IntEnumMapping build() {
- return new IntEnumMapping(this);
- }
- }
-
- /**
- * Inner class that holds the name and value of an enumeration value.
- */
- private static final class Value {
- @NonNull private final String mName;
- private final int mValue;
-
- private Value(@NonNull String name, int value) {
- mName = name;
- mValue = value;
- }
- }
-}
diff --git a/core/java/android/view/inspector/IntFlagMapping.java b/core/java/android/view/inspector/IntFlagMapping.java
index dcb87e18ae5e..8f7dfd5c5144 100644
--- a/core/java/android/view/inspector/IntFlagMapping.java
+++ b/core/java/android/view/inspector/IntFlagMapping.java
@@ -19,14 +19,20 @@ package android.view.inspector;
import android.annotation.NonNull;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
/**
- * Maps the values of an {int} property to arrays of string for properties that encode flags.
+ * Maps the values of an {@code int} property to arrays of string for properties that encode flags.
*
* An {@link InspectionCompanion} may provide an instance of this class to a {@link PropertyMapper}
- * for flag values packed into primitive {int} properties.
+ * for flag values packed into primitive {@code int} properties.
*
- * Each flag has a
+ * Each flag has a mask and a target value, for non-exclusive flags, the target can also be used as
+ * the mask. A given integer value is compared against each flag to find what flags are active for
+ * it by bitwise anding it with the mask and comparing the result against the target, that is,
+ * {@code (value & mask) == target}.
*
* This class is immutable, and must be constructed by a {@link Builder}.
*
@@ -42,8 +48,8 @@ public final class IntFlagMapping {
* @return The names of the enabled flags
*/
@NonNull
- public String[] namesOf(int value) {
- ArrayList<String> enabledFlagNames = new ArrayList<>(mFlags.length);
+ public Set<String> get(int value) {
+ final Set<String> enabledFlagNames = new HashSet<>(mFlags.length);
for (Flag flag : mFlags) {
if (flag.isEnabledFor(value)) {
@@ -51,7 +57,7 @@ public final class IntFlagMapping {
}
}
- return enabledFlagNames.toArray(new String[enabledFlagNames.size()]);
+ return Collections.unmodifiableSet(enabledFlagNames);
}
/**
@@ -81,7 +87,7 @@ public final class IntFlagMapping {
* The target value will be used as a mask, to handle the common case where flag values
* are not mutually exclusive. The flag will be considered enabled for a property value if
* the result of bitwise anding the target and the value equals the target, that is:
- * {(value & target) == target}.
+ * {@code (value & target) == target}.
*
* @param name The name of the flag
* @param target The value to compare against
@@ -97,7 +103,7 @@ public final class IntFlagMapping {
* Add a new flag with a mask.
*
* The flag will be considered enabled for a property value if the result of bitwise anding
- * the value and the mask equals the target, that is: {(value & mask) == target}.
+ * the value and the mask equals the target, that is: {@code (value & mask) == target}.
*
* @param name The name of the flag
* @param target The value to compare against
@@ -111,13 +117,6 @@ public final class IntFlagMapping {
}
/**
- * Clear the builder, allowing for recycling.
- */
- public void clear() {
- mFlags.clear();
- }
-
- /**
* Build a new {@link IntFlagMapping} from this builder.
*
* @return A new mapping
@@ -143,7 +142,7 @@ public final class IntFlagMapping {
}
/**
- * Compare the supplied property value against the mask and taget.
+ * Compare the supplied property value against the mask and target.
*
* @param value The value to check
* @return True if this flag is enabled
diff --git a/core/java/android/view/inspector/PropertyMapper.java b/core/java/android/view/inspector/PropertyMapper.java
index 5fb291b34219..e20582bf3ee4 100644
--- a/core/java/android/view/inspector/PropertyMapper.java
+++ b/core/java/android/view/inspector/PropertyMapper.java
@@ -18,6 +18,7 @@ package android.view.inspector;
import android.annotation.AttrRes;
import android.annotation.NonNull;
+import android.util.SparseArray;
/**
* An interface for mapping the string names of inspectable properties to integer identifiers.
@@ -154,7 +155,7 @@ public interface PropertyMapper {
int mapIntEnum(
@NonNull String name,
@AttrRes int attributeId,
- @NonNull IntEnumMapping mapping);
+ @NonNull SparseArray<String> mapping);
/**
* Map a string name to an integer ID for a flag set packed into an int property.
diff --git a/core/java/android/view/inspector/PropertyReader.java b/core/java/android/view/inspector/PropertyReader.java
index fd83e8df6c3a..a8b7ecc3f57e 100644
--- a/core/java/android/view/inspector/PropertyReader.java
+++ b/core/java/android/view/inspector/PropertyReader.java
@@ -25,7 +25,13 @@ import android.graphics.Color;
/**
* An interface for reading the properties of an inspectable object.
*
- * Used as the parameter for {@link InspectionCompanion#readProperties(Object, PropertyReader)}.
+ * {@code PropertyReader} is defined as an interface that will be called by
+ * {@link InspectionCompanion#readProperties(Object, PropertyReader)}. This approach allows a
+ * client inspector to read the values of primitive properties without the overhead of
+ * instantiating a class to hold the property values for each inspection pass. If an inspectable
+ * remains unchanged between reading passes, it should be possible for a {@code PropertyReader} to
+ * avoid new allocations for subsequent reading passes.
+ *
* It has separate methods for all primitive types to avoid autoboxing overhead if a concrete
* implementation is able to work with primitives. Implementations should be prepared to accept
* {null} as the value of {@link PropertyReader#readObject(int, Object)}.
@@ -38,7 +44,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {boolean}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code boolean}
*/
void readBoolean(int id, boolean value);
@@ -47,7 +53,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {byte}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code byte}
*/
void readByte(int id, byte value);
@@ -56,7 +62,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {char}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code char}
*/
void readChar(int id, char value);
@@ -65,7 +71,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {double}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code double}
*/
void readDouble(int id, double value);
@@ -74,7 +80,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {float}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code float}
*/
void readFloat(int id, float value);
@@ -83,7 +89,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as an {int}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as an {@code int}
*/
void readInt(int id, int value);
@@ -92,7 +98,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {long}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code long}
*/
void readLong(int id, long value);
@@ -101,7 +107,7 @@ public interface PropertyReader {
*
* @param id Identifier of the property from a {@link PropertyMapper}
* @param value Value of the property
- * @throws PropertyTypeMismatchException If the property ID is not mapped as a {short}
+ * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code short}
*/
void readShort(int id, short value);
diff --git a/core/java/android/view/textclassifier/ConversationAction.java b/core/java/android/view/textclassifier/ConversationAction.java
new file mode 100644
index 000000000000..1a6e5d8e8b03
--- /dev/null
+++ b/core/java/android/view/textclassifier/ConversationAction.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.StringDef;
+import android.app.RemoteAction;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+
+/** Represents the action suggested by a {@link TextClassifier} on a given conversation. */
+public final class ConversationAction implements Parcelable {
+
+ /** @hide */
+ @Retention(SOURCE)
+ @StringDef(
+ value = {
+ TYPE_VIEW_CALENDAR,
+ TYPE_VIEW_MAP,
+ TYPE_TRACK_FLIGHT,
+ TYPE_OPEN_URL,
+ TYPE_SEND_SMS,
+ TYPE_CALL_PHONE,
+ TYPE_SEND_EMAIL,
+ TYPE_TEXT_REPLY,
+ TYPE_CREATE_REMINDER,
+ TYPE_SHARE_LOCATION
+ },
+ prefix = "TYPE_")
+ public @interface ActionType {}
+
+ /**
+ * Indicates an action to view a calendar at a specified time.
+ */
+ public static final String TYPE_VIEW_CALENDAR = "view_calendar";
+ /**
+ * Indicates an action to view the map at a specified location.
+ */
+ public static final String TYPE_VIEW_MAP = "view_map";
+ /**
+ * Indicates an action to track a flight.
+ */
+ public static final String TYPE_TRACK_FLIGHT = "track_flight";
+ /**
+ * Indicates an action to open an URL.
+ */
+ public static final String TYPE_OPEN_URL = "open_url";
+ /**
+ * Indicates an action to send a SMS.
+ */
+ public static final String TYPE_SEND_SMS = "send_sms";
+ /**
+ * Indicates an action to call a phone number.
+ */
+ public static final String TYPE_CALL_PHONE = "call_phone";
+ /**
+ * Indicates an action to send an email.
+ */
+ public static final String TYPE_SEND_EMAIL = "send_email";
+ /**
+ * Indicates an action to reply with a text message.
+ */
+ public static final String TYPE_TEXT_REPLY = "text_reply";
+ /**
+ * Indicates an action to create a reminder.
+ */
+ public static final String TYPE_CREATE_REMINDER = "create_reminder";
+ /**
+ * Indicates an action to reply with a location.
+ */
+ public static final String TYPE_SHARE_LOCATION = "share_location";
+
+ public static final Creator<ConversationAction> CREATOR =
+ new Creator<ConversationAction>() {
+ @Override
+ public ConversationAction createFromParcel(Parcel in) {
+ return new ConversationAction(in);
+ }
+
+ @Override
+ public ConversationAction[] newArray(int size) {
+ return new ConversationAction[size];
+ }
+ };
+
+ @NonNull
+ @ActionType
+ private final String mType;
+ @NonNull
+ private final CharSequence mTextReply;
+ @Nullable
+ private final RemoteAction mAction;
+
+ @FloatRange(from = 0, to = 1)
+ private final float mScore;
+
+ @NonNull
+ private final Bundle mExtras;
+
+ private ConversationAction(
+ @NonNull String type,
+ @Nullable RemoteAction action,
+ @Nullable CharSequence textReply,
+ float score,
+ @NonNull Bundle extras) {
+ mType = Preconditions.checkNotNull(type);
+ mAction = action;
+ mTextReply = textReply;
+ mScore = score;
+ mExtras = Preconditions.checkNotNull(extras);
+ }
+
+ private ConversationAction(Parcel in) {
+ mType = in.readString();
+ mAction = in.readParcelable(null);
+ mTextReply = in.readCharSequence();
+ mScore = in.readFloat();
+ mExtras = in.readBundle();
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mType);
+ parcel.writeParcelable(mAction, flags);
+ parcel.writeCharSequence(mTextReply);
+ parcel.writeFloat(mScore);
+ parcel.writeBundle(mExtras);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Returns the type of this action, for example, {@link #TYPE_VIEW_CALENDAR}. */
+ @NonNull
+ @ActionType
+ public String getType() {
+ return mType;
+ }
+
+ /**
+ * Returns a RemoteAction object, which contains the icon, label and a PendingIntent, for
+ * the specified action type.
+ */
+ @Nullable
+ public RemoteAction getAction() {
+ return mAction;
+ }
+
+ /**
+ * Returns the confidence score for the specified action. The value ranges from 0 (low
+ * confidence) to 1 (high confidence).
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getConfidenceScore() {
+ return mScore;
+ }
+
+ /**
+ * Returns the text reply that could be sent as a reply to the given conversation.
+ * <p>
+ * This is only available when the type of the action is {@link #TYPE_TEXT_REPLY}.
+ */
+ @Nullable
+ public CharSequence getTextReply() {
+ return mTextReply;
+ }
+
+ /**
+ * Returns the extended data related to this conversation action.
+ *
+ * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
+ * prefer to hold a reference to the returned bundle rather than frequently calling this
+ * method.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras.deepCopy();
+ }
+
+ /** Builder class to construct {@link ConversationAction}. */
+ public static final class Builder {
+ @Nullable
+ @ActionType
+ private String mType;
+ @Nullable
+ private RemoteAction mAction;
+ @Nullable
+ private CharSequence mTextReply;
+ private float mScore;
+ @Nullable
+ private Bundle mExtras;
+
+ public Builder(@NonNull @ActionType String actionType) {
+ mType = Preconditions.checkNotNull(actionType);
+ }
+
+ /**
+ * Sets an action that may be performed on the given conversation.
+ */
+ @NonNull
+ public Builder setAction(@Nullable RemoteAction action) {
+ mAction = action;
+ return this;
+ }
+
+ /**
+ * Sets a text reply that may be performed on the given conversation.
+ */
+ @NonNull
+ public Builder setTextReply(@Nullable CharSequence textReply) {
+ mTextReply = textReply;
+ return this;
+ }
+
+ /** Sets the confident score. */
+ @NonNull
+ public Builder setConfidenceScore(@FloatRange(from = 0, to = 1) float score) {
+ mScore = score;
+ return this;
+ }
+
+ /**
+ * Sets the extended data for the conversation action object.
+ */
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /** Builds the {@link ConversationAction} object. */
+ @NonNull
+ public ConversationAction build() {
+ return new ConversationAction(
+ mType,
+ mAction,
+ mTextReply,
+ mScore,
+ mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/ConversationActions.java b/core/java/android/view/textclassifier/ConversationActions.java
index 3f690f70d275..f7c1a2640dc5 100644
--- a/core/java/android/view/textclassifier/ConversationActions.java
+++ b/core/java/android/view/textclassifier/ConversationActions.java
@@ -17,18 +17,15 @@ package android.view.textclassifier;
import static java.lang.annotation.RetentionPolicy.SOURCE;
-import android.annotation.FloatRange;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.app.Person;
-import android.app.RemoteAction;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.SpannedString;
-import android.util.ArraySet;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
@@ -37,10 +34,8 @@ import java.lang.annotation.Retention;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.Set;
/**
* Represents a list of actions suggested by a {@link TextClassifier} on a given conversation.
@@ -62,83 +57,6 @@ public final class ConversationActions implements Parcelable {
}
};
- /** @hide */
- @Retention(SOURCE)
- @StringDef(
- value = {
- TYPE_VIEW_CALENDAR,
- TYPE_VIEW_MAP,
- TYPE_TRACK_FLIGHT,
- TYPE_OPEN_URL,
- TYPE_SEND_SMS,
- TYPE_CALL_PHONE,
- TYPE_SEND_EMAIL,
- TYPE_TEXT_REPLY,
- TYPE_CREATE_REMINDER,
- TYPE_SHARE_LOCATION
- },
- prefix = "TYPE_")
- public @interface ActionType {}
-
- /**
- * Indicates an action to view a calendar at a specified time.
- */
- public static final String TYPE_VIEW_CALENDAR = "view_calendar";
- /**
- * Indicates an action to view the map at a specified location.
- */
- public static final String TYPE_VIEW_MAP = "view_map";
- /**
- * Indicates an action to track a flight.
- */
- public static final String TYPE_TRACK_FLIGHT = "track_flight";
- /**
- * Indicates an action to open an URL.
- */
- public static final String TYPE_OPEN_URL = "open_url";
- /**
- * Indicates an action to send a SMS.
- */
- public static final String TYPE_SEND_SMS = "send_sms";
- /**
- * Indicates an action to call a phone number.
- */
- public static final String TYPE_CALL_PHONE = "call_phone";
- /**
- * Indicates an action to send an email.
- */
- public static final String TYPE_SEND_EMAIL = "send_email";
- /**
- * Indicates an action to reply with a text message.
- */
- public static final String TYPE_TEXT_REPLY = "text_reply";
- /**
- * Indicates an action to create a reminder.
- */
- public static final String TYPE_CREATE_REMINDER = "create_reminder";
- /**
- * Indicates an action to reply with a location.
- */
- public static final String TYPE_SHARE_LOCATION = "share_location";
-
- /** @hide */
- @Retention(SOURCE)
- @StringDef(
- value = {
- HINT_FOR_NOTIFICATION,
- HINT_FOR_IN_APP,
- },
- prefix = "HINT_")
- public @interface Hint {}
- /**
- * To indicate the generated actions will be used within the app.
- */
- public static final String HINT_FOR_IN_APP = "in_app";
- /**
- * To indicate the generated actions will be used for notification.
- */
- public static final String HINT_FOR_NOTIFICATION = "notification";
-
private final List<ConversationAction> mConversationActions;
private final String mId;
@@ -184,182 +102,6 @@ public final class ConversationActions implements Parcelable {
return mId;
}
- /** Represents the action suggested by a {@link TextClassifier} on a given conversation. */
- public static final class ConversationAction implements Parcelable {
-
- public static final Creator<ConversationAction> CREATOR =
- new Creator<ConversationAction>() {
- @Override
- public ConversationAction createFromParcel(Parcel in) {
- return new ConversationAction(in);
- }
-
- @Override
- public ConversationAction[] newArray(int size) {
- return new ConversationAction[size];
- }
- };
-
- @NonNull
- @ActionType
- private final String mType;
- @NonNull
- private final CharSequence mTextReply;
- @Nullable
- private final RemoteAction mAction;
-
- @FloatRange(from = 0, to = 1)
- private final float mScore;
-
- @NonNull
- private final Bundle mExtras;
-
- private ConversationAction(
- @NonNull String type,
- @Nullable RemoteAction action,
- @Nullable CharSequence textReply,
- float score,
- @NonNull Bundle extras) {
- mType = Preconditions.checkNotNull(type);
- mAction = action;
- mTextReply = textReply;
- mScore = score;
- mExtras = Preconditions.checkNotNull(extras);
- }
-
- private ConversationAction(Parcel in) {
- mType = in.readString();
- mAction = in.readParcelable(null);
- mTextReply = in.readCharSequence();
- mScore = in.readFloat();
- mExtras = in.readBundle();
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeString(mType);
- parcel.writeParcelable(mAction, flags);
- parcel.writeCharSequence(mTextReply);
- parcel.writeFloat(mScore);
- parcel.writeBundle(mExtras);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @NonNull
- @ActionType
- /** Returns the type of this action, for example, {@link #TYPE_VIEW_CALENDAR}. */
- public String getType() {
- return mType;
- }
-
- @Nullable
- /**
- * Returns a RemoteAction object, which contains the icon, label and a PendingIntent, for
- * the specified action type.
- */
- public RemoteAction getAction() {
- return mAction;
- }
-
- /**
- * Returns the confidence score for the specified action. The value ranges from 0 (low
- * confidence) to 1 (high confidence).
- */
- @FloatRange(from = 0, to = 1)
- public float getConfidenceScore() {
- return mScore;
- }
-
- /**
- * Returns the text reply that could be sent as a reply to the given conversation.
- * <p>
- * This is only available when the type of the action is {@link #TYPE_TEXT_REPLY}.
- */
- @Nullable
- public CharSequence getTextReply() {
- return mTextReply;
- }
-
- /**
- * Returns the extended data related to this conversation action.
- *
- * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
- * prefer to hold a reference to the returned bundle rather than frequently calling this
- * method.
- */
- @NonNull
- public Bundle getExtras() {
- return mExtras.deepCopy();
- }
-
- /** Builder class to construct {@link ConversationAction}. */
- public static final class Builder {
- @Nullable
- @ActionType
- private String mType;
- @Nullable
- private RemoteAction mAction;
- @Nullable
- private CharSequence mTextReply;
- private float mScore;
- @Nullable
- private Bundle mExtras;
-
- public Builder(@NonNull @ActionType String actionType) {
- mType = Preconditions.checkNotNull(actionType);
- }
-
- /**
- * Sets an action that may be performed on the given conversation.
- */
- @NonNull
- public Builder setAction(@Nullable RemoteAction action) {
- mAction = action;
- return this;
- }
-
- /**
- * Sets a text reply that may be performed on the given conversation.
- */
- @NonNull
- public Builder setTextReply(@Nullable CharSequence textReply) {
- mTextReply = textReply;
- return this;
- }
-
- /** Sets the confident score. */
- @NonNull
- public Builder setConfidenceScore(@FloatRange(from = 0, to = 1) float score) {
- mScore = score;
- return this;
- }
-
- /**
- * Sets the extended data for the conversation action object.
- */
- @NonNull
- public Builder setExtras(@Nullable Bundle extras) {
- mExtras = extras;
- return this;
- }
-
- /** Builds the {@link ConversationAction} object. */
- @NonNull
- public ConversationAction build() {
- return new ConversationAction(
- mType,
- mAction,
- mTextReply,
- mScore,
- mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
- }
- }
- }
-
/** Represents a message in the conversation. */
public static final class Message implements Parcelable {
/**
@@ -538,156 +280,36 @@ public final class ConversationActions implements Parcelable {
}
}
- /** Configuration object for specifying what action types to identify. */
- public static final class TypeConfig implements Parcelable {
- @NonNull
- @ActionType
- private final Set<String> mExcludedTypes;
- @NonNull
- @ActionType
- private final Set<String> mIncludedTypes;
- private final boolean mIncludeTypesFromTextClassifier;
-
- private TypeConfig(
- @NonNull Set<String> includedTypes,
- @NonNull Set<String> excludedTypes,
- boolean includeTypesFromTextClassifier) {
- mIncludedTypes = Preconditions.checkNotNull(includedTypes);
- mExcludedTypes = Preconditions.checkNotNull(excludedTypes);
- mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
- }
-
- private TypeConfig(Parcel in) {
- mIncludedTypes = new ArraySet<>(in.createStringArrayList());
- mExcludedTypes = new ArraySet<>(in.createStringArrayList());
- mIncludeTypesFromTextClassifier = in.readByte() != 0;
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeStringList(new ArrayList<>(mIncludedTypes));
- parcel.writeStringList(new ArrayList<>(mExcludedTypes));
- parcel.writeByte((byte) (mIncludeTypesFromTextClassifier ? 1 : 0));
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- public static final Creator<TypeConfig> CREATOR =
- new Creator<TypeConfig>() {
- @Override
- public TypeConfig createFromParcel(Parcel in) {
- return new TypeConfig(in);
- }
+ /**
+ * A request object for generating conversation action suggestions.
+ *
+ * @see TextClassifier#suggestConversationActions(Request)
+ */
+ public static final class Request implements Parcelable {
- @Override
- public TypeConfig[] newArray(int size) {
- return new TypeConfig[size];
- }
- };
+ /** @hide */
+ @Retention(SOURCE)
+ @StringDef(
+ value = {
+ HINT_FOR_NOTIFICATION,
+ HINT_FOR_IN_APP,
+ },
+ prefix = "HINT_")
+ public @interface Hint {}
/**
- * Returns a final list of types that the text classifier should look for.
- *
- * <p>NOTE: This method is intended for use by a text classifier.
- *
- * @param defaultTypes types the text classifier thinks should be included before factoring
- * in the included/excluded types given by the client.
+ * To indicate the generated actions will be used within the app.
*/
- @NonNull
- public Collection<String> resolveTypes(@Nullable Collection<String> defaultTypes) {
- Set<String> types = new ArraySet<>();
- if (mIncludeTypesFromTextClassifier && defaultTypes != null) {
- types.addAll(defaultTypes);
- }
- types.addAll(mIncludedTypes);
- types.removeAll(mExcludedTypes);
- return Collections.unmodifiableCollection(types);
- }
-
+ public static final String HINT_FOR_IN_APP = "in_app";
/**
- * Return whether the client allows the text classifier to include its own list of default
- * types. If this function returns {@code true}, the text classifier can consider specifying
- * a default list of entity types in {@link #resolveTypes(Collection)}.
- *
- * <p>NOTE: This method is intended for use by a text classifier.
- *
- * @see #resolveTypes(Collection)
+ * To indicate the generated actions will be used for notification.
*/
- public boolean shouldIncludeTypesFromTextClassifier() {
- return mIncludeTypesFromTextClassifier;
- }
-
- /** Builder class to construct the {@link TypeConfig} object. */
- public static final class Builder {
- @Nullable
- private Collection<String> mExcludedTypes;
- @Nullable
- private Collection<String> mIncludedTypes;
- private boolean mIncludeTypesFromTextClassifier = true;
-
- /**
- * Sets a collection of types that are explicitly included, for example, {@link
- * #TYPE_VIEW_CALENDAR}.
- */
- @NonNull
- public Builder setIncludedTypes(
- @Nullable @ActionType Collection<String> includedTypes) {
- mIncludedTypes = includedTypes;
- return this;
- }
-
- /**
- * Sets a collection of types that are explicitly excluded, for example, {@link
- * #TYPE_VIEW_CALENDAR}.
- */
- @NonNull
- public Builder setExcludedTypes(
- @Nullable @ActionType Collection<String> excludedTypes) {
- mExcludedTypes = excludedTypes;
- return this;
- }
-
- /**
- * Specifies whether or not to include the types suggested by the text classifier. By
- * default, it is included.
- */
- @NonNull
- public Builder includeTypesFromTextClassifier(boolean includeTypesFromTextClassifier) {
- mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
- return this;
- }
-
- /**
- * Combines all of the options that have been set and returns a new {@link TypeConfig}
- * object.
- */
- @NonNull
- public TypeConfig build() {
- return new TypeConfig(
- mIncludedTypes == null
- ? Collections.emptySet()
- : new ArraySet<>(mIncludedTypes),
- mExcludedTypes == null
- ? Collections.emptySet()
- : new ArraySet<>(mExcludedTypes),
- mIncludeTypesFromTextClassifier);
- }
- }
- }
+ public static final String HINT_FOR_NOTIFICATION = "notification";
- /**
- * A request object for generating conversation action suggestions.
- *
- * @see TextClassifier#suggestConversationActions(Request)
- */
- public static final class Request implements Parcelable {
@NonNull
private final List<Message> mConversation;
@NonNull
- private final TypeConfig mTypeConfig;
+ private final TextClassifier.EntityConfig mTypeConfig;
private final int mMaxSuggestions;
@NonNull
@Hint
@@ -699,7 +321,7 @@ public final class ConversationActions implements Parcelable {
private Request(
@NonNull List<Message> conversation,
- @NonNull TypeConfig typeConfig,
+ @NonNull TextClassifier.EntityConfig typeConfig,
int maxSuggestions,
String conversationId,
@Nullable @Hint List<String> hints) {
@@ -713,7 +335,7 @@ public final class ConversationActions implements Parcelable {
private static Request readFromParcel(Parcel in) {
List<Message> conversation = new ArrayList<>();
in.readParcelableList(conversation, null);
- TypeConfig typeConfig = in.readParcelable(null);
+ TextClassifier.EntityConfig typeConfig = in.readParcelable(null);
int maxSuggestions = in.readInt();
String conversationId = in.readString();
List<String> hints = new ArrayList<>();
@@ -760,7 +382,7 @@ public final class ConversationActions implements Parcelable {
/** Returns the type config. */
@NonNull
- public TypeConfig getTypeConfig() {
+ public TextClassifier.EntityConfig getTypeConfig() {
return mTypeConfig;
}
@@ -820,7 +442,7 @@ public final class ConversationActions implements Parcelable {
@NonNull
private List<Message> mConversation;
@Nullable
- private TypeConfig mTypeConfig;
+ private TextClassifier.EntityConfig mTypeConfig;
private int mMaxSuggestions;
@Nullable
private String mConversationId;
@@ -849,7 +471,7 @@ public final class ConversationActions implements Parcelable {
/** Sets the type config. */
@NonNull
- public Builder setTypeConfig(@Nullable TypeConfig typeConfig) {
+ public Builder setTypeConfig(@Nullable TextClassifier.EntityConfig typeConfig) {
mTypeConfig = typeConfig;
return this;
}
@@ -879,7 +501,9 @@ public final class ConversationActions implements Parcelable {
public Request build() {
return new Request(
Collections.unmodifiableList(mConversation),
- mTypeConfig == null ? new TypeConfig.Builder().build() : mTypeConfig,
+ mTypeConfig == null
+ ? new TextClassifier.EntityConfig.Builder().build()
+ : mTypeConfig,
mMaxSuggestions,
mConversationId,
mHints == null
diff --git a/core/java/android/view/textclassifier/GenerateLinksLogger.java b/core/java/android/view/textclassifier/GenerateLinksLogger.java
index 067513f1de67..3996b277aa1c 100644
--- a/core/java/android/view/textclassifier/GenerateLinksLogger.java
+++ b/core/java/android/view/textclassifier/GenerateLinksLogger.java
@@ -39,7 +39,6 @@ import java.util.UUID;
public final class GenerateLinksLogger {
private static final String LOG_TAG = "GenerateLinksLogger";
- private static final boolean DEBUG_LOG_ENABLED = false;
private static final String ZERO = "0";
private final MetricsLogger mMetricsLogger;
@@ -128,8 +127,9 @@ public final class GenerateLinksLogger {
}
private static void debugLog(LogMaker log) {
- if (!DEBUG_LOG_ENABLED) return;
-
+ if (!Log.ENABLE_FULL_LOGGING) {
+ return;
+ }
final String callId = Objects.toString(
log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID), "");
final String entityType = Objects.toString(
@@ -143,7 +143,7 @@ public final class GenerateLinksLogger {
final int latencyMs = Integer.parseInt(
Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY), ZERO));
- Log.d(LOG_TAG,
+ Log.v(LOG_TAG,
String.format(Locale.US, "%s:%s %d links (%d/%d chars) %dms %s", callId, entityType,
numLinks, linkLength, textLength, latencyMs, log.getPackageName()));
}
diff --git a/core/java/android/view/textclassifier/Log.java b/core/java/android/view/textclassifier/Log.java
index ef19ee56a843..5c60c09418b4 100644
--- a/core/java/android/view/textclassifier/Log.java
+++ b/core/java/android/view/textclassifier/Log.java
@@ -16,10 +16,12 @@
package android.view.textclassifier;
-import android.util.Slog;
-
/**
* Logging for android.view.textclassifier package.
+ * <p>
+ * To enable full log:
+ * 1. adb shell setprop log.tag.androidtc VERBOSE
+ * 2. adb shell stop && adb shell start
*/
final class Log {
@@ -27,24 +29,32 @@ final class Log {
* true: Enables full logging.
* false: Limits logging to debug level.
*/
- private static final boolean ENABLE_FULL_LOGGING = false;
+ static final boolean ENABLE_FULL_LOGGING =
+ android.util.Log.isLoggable(TextClassifier.DEFAULT_LOG_TAG, android.util.Log.VERBOSE);
+
+ private Log() {
+ }
- private Log() {}
+ public static void v(String tag, String msg) {
+ if (ENABLE_FULL_LOGGING) {
+ android.util.Log.v(tag, msg);
+ }
+ }
public static void d(String tag, String msg) {
- Slog.d(tag, msg);
+ android.util.Log.d(tag, msg);
}
public static void w(String tag, String msg) {
- Slog.w(tag, msg);
+ android.util.Log.w(tag, msg);
}
public static void e(String tag, String msg, Throwable tr) {
if (ENABLE_FULL_LOGGING) {
- Slog.e(tag, msg, tr);
+ android.util.Log.e(tag, msg, tr);
} else {
final String trString = (tr != null) ? tr.getClass().getSimpleName() : "??";
- Slog.d(tag, String.format("%s (%s)", msg, trString));
+ android.util.Log.d(tag, String.format("%s (%s)", msg, trString));
}
}
}
diff --git a/core/java/android/view/textclassifier/SelectionSessionLogger.java b/core/java/android/view/textclassifier/SelectionSessionLogger.java
index cdacdd504eeb..48a568abb169 100644
--- a/core/java/android/view/textclassifier/SelectionSessionLogger.java
+++ b/core/java/android/view/textclassifier/SelectionSessionLogger.java
@@ -39,7 +39,6 @@ import java.util.StringJoiner;
public final class SelectionSessionLogger {
private static final String LOG_TAG = "SelectionSessionLogger";
- private static final boolean DEBUG_LOG_ENABLED = false;
static final String CLASSIFIER_ID = "androidtc";
private static final int START_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_START;
@@ -195,8 +194,9 @@ public final class SelectionSessionLogger {
}
private static void debugLog(LogMaker log) {
- if (!DEBUG_LOG_ENABLED) return;
-
+ if (!Log.ENABLE_FULL_LOGGING) {
+ return;
+ }
final String widgetType = Objects.toString(log.getTaggedData(WIDGET_TYPE), UNKNOWN);
final String widgetVersion = Objects.toString(log.getTaggedData(WIDGET_VERSION), "");
final String widget = widgetVersion.isEmpty()
@@ -221,7 +221,7 @@ public final class SelectionSessionLogger {
final int eventEnd = Integer.parseInt(
Objects.toString(log.getTaggedData(EVENT_END), ZERO));
- Log.d(LOG_TAG,
+ Log.v(LOG_TAG,
String.format(Locale.US, "%2d: %s/%s/%s, range=%d,%d - smart_range=%d,%d (%s/%s)",
index, type, subType, entity, eventStart, eventEnd, smartStart, smartEnd,
widget, model));
diff --git a/core/java/android/view/textclassifier/TextClassificationConstants.java b/core/java/android/view/textclassifier/TextClassificationConstants.java
index 50801a2b3e3f..ce680ecbd119 100644
--- a/core/java/android/view/textclassifier/TextClassificationConstants.java
+++ b/core/java/android/view/textclassifier/TextClassificationConstants.java
@@ -117,15 +117,15 @@ public final class TextClassificationConstants {
.add(TextClassifier.TYPE_FLIGHT_NUMBER).toString();
private static final String CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES =
new StringJoiner(ENTITY_LIST_DELIMITER)
- .add(ConversationActions.TYPE_TEXT_REPLY)
- .add(ConversationActions.TYPE_CREATE_REMINDER)
- .add(ConversationActions.TYPE_CALL_PHONE)
- .add(ConversationActions.TYPE_OPEN_URL)
- .add(ConversationActions.TYPE_SEND_EMAIL)
- .add(ConversationActions.TYPE_SEND_SMS)
- .add(ConversationActions.TYPE_TRACK_FLIGHT)
- .add(ConversationActions.TYPE_VIEW_CALENDAR)
- .add(ConversationActions.TYPE_VIEW_MAP)
+ .add(ConversationAction.TYPE_TEXT_REPLY)
+ .add(ConversationAction.TYPE_CREATE_REMINDER)
+ .add(ConversationAction.TYPE_CALL_PHONE)
+ .add(ConversationAction.TYPE_OPEN_URL)
+ .add(ConversationAction.TYPE_SEND_EMAIL)
+ .add(ConversationAction.TYPE_SEND_SMS)
+ .add(ConversationAction.TYPE_TRACK_FLIGHT)
+ .add(ConversationAction.TYPE_VIEW_CALENDAR)
+ .add(ConversationAction.TYPE_VIEW_MAP)
.toString();
private final boolean mSystemTextClassifierEnabled;
diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java
index 4c6419855f7c..45668c01a8d3 100644
--- a/core/java/android/view/textclassifier/TextClassificationSession.java
+++ b/core/java/android/view/textclassifier/TextClassificationSession.java
@@ -27,7 +27,6 @@ import com.android.internal.util.Preconditions;
@WorkerThread
final class TextClassificationSession implements TextClassifier {
- /* package */ static final boolean DEBUG_LOG_ENABLED = true;
private static final String LOG_TAG = "TextClassificationSession";
private final TextClassifier mDelegate;
@@ -133,9 +132,7 @@ final class TextClassificationSession implements TextClassifier {
if (event.getEventType() != SelectionEvent.EVENT_SELECTION_STARTED
&& mStartEvent == null) {
- if (DEBUG_LOG_ENABLED) {
- Log.d(LOG_TAG, "Selection session not yet started. Ignoring event");
- }
+ Log.d(LOG_TAG, "Selection session not yet started. Ignoring event");
return false;
}
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 8709e09bbf55..5a5613605e36 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -32,7 +32,6 @@ import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.text.util.Linkify.LinkifyMask;
import android.util.ArrayMap;
-import android.util.ArraySet;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -43,6 +42,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -324,7 +324,7 @@ public interface TextClassifier {
}
/**
- * Detects the language of the specified text.
+ * Detects the language of the text in the given request.
*
* <p><strong>NOTE: </strong>Call on a worker thread.
*
@@ -403,42 +403,59 @@ public interface TextClassifier {
default void dump(@NonNull IndentingPrintWriter printWriter) {}
/**
- * Configuration object for specifying what entities to identify.
+ * Configuration object for specifying what entity types to identify.
*
* Configs are initially based on a predefined preset, and can be modified from there.
*/
final class EntityConfig implements Parcelable {
- private final Collection<String> mHints;
- private final Collection<String> mExcludedEntityTypes;
- private final Collection<String> mIncludedEntityTypes;
- private final boolean mUseHints;
-
- private EntityConfig(boolean useHints, Collection<String> hints,
- Collection<String> includedEntityTypes, Collection<String> excludedEntityTypes) {
- mHints = hints == null
- ? Collections.EMPTY_LIST
- : Collections.unmodifiableCollection(new ArraySet<>(hints));
- mExcludedEntityTypes = excludedEntityTypes == null
- ? Collections.EMPTY_LIST : new ArraySet<>(excludedEntityTypes);
- mIncludedEntityTypes = includedEntityTypes == null
- ? Collections.EMPTY_LIST : new ArraySet<>(includedEntityTypes);
- mUseHints = useHints;
+ private final List<String> mIncludedTypes;
+ private final List<String> mExcludedTypes;
+ private final List<String> mHints;
+ private final boolean mIncludeTypesFromTextClassifier;
+
+ private EntityConfig(
+ List<String> includedEntityTypes,
+ List<String> excludedEntityTypes,
+ List<String> hints,
+ boolean includeTypesFromTextClassifier) {
+ mIncludedTypes = Preconditions.checkNotNull(includedEntityTypes);
+ mExcludedTypes = Preconditions.checkNotNull(excludedEntityTypes);
+ mHints = Preconditions.checkNotNull(hints);
+ mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
+ }
+
+ private EntityConfig(Parcel in) {
+ mIncludedTypes = new ArrayList<>();
+ in.readStringList(mIncludedTypes);
+ mExcludedTypes = new ArrayList<>();
+ in.readStringList(mExcludedTypes);
+ List<String> tmpHints = new ArrayList<>();
+ in.readStringList(tmpHints);
+ mHints = Collections.unmodifiableList(tmpHints);
+ mIncludeTypesFromTextClassifier = in.readByte() != 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeStringList(mIncludedTypes);
+ parcel.writeStringList(mExcludedTypes);
+ parcel.writeStringList(mHints);
+ parcel.writeByte((byte) (mIncludeTypesFromTextClassifier ? 1 : 0));
}
/**
* Creates an EntityConfig.
*
* @param hints Hints for the TextClassifier to determine what types of entities to find.
+ *
+ * @deprecated Use {@link Builder} instead.
*/
+ @Deprecated
public static EntityConfig createWithHints(@Nullable Collection<String> hints) {
- return new EntityConfig(/* useHints */ true, hints,
- /* includedEntityTypes */null, /* excludedEntityTypes */ null);
- }
-
- // TODO: Remove once apps can build against the latest sdk.
- /** @hide */
- public static EntityConfig create(@Nullable Collection<String> hints) {
- return createWithHints(hints);
+ return new EntityConfig.Builder()
+ .includeTypesFromTextClassifier(true)
+ .setHints(hints)
+ .build();
}
/**
@@ -450,12 +467,19 @@ public interface TextClassifier {
*
*
* Note that if an entity has been excluded, the exclusion will take precedence.
+ *
+ * @deprecated Use {@link Builder} instead.
*/
+ @Deprecated
public static EntityConfig create(@Nullable Collection<String> hints,
@Nullable Collection<String> includedEntityTypes,
@Nullable Collection<String> excludedEntityTypes) {
- return new EntityConfig(/* useHints */ true, hints,
- includedEntityTypes, excludedEntityTypes);
+ return new EntityConfig.Builder()
+ .setIncludedTypes(includedEntityTypes)
+ .setExcludedTypes(excludedEntityTypes)
+ .setHints(hints)
+ .includeTypesFromTextClassifier(true)
+ .build();
}
/**
@@ -463,34 +487,33 @@ public interface TextClassifier {
*
* @param entityTypes Complete set of entities, e.g. {@link #TYPE_URL} to find.
*
+ * @deprecated Use {@link Builder} instead.
*/
+ @Deprecated
public static EntityConfig createWithExplicitEntityList(
@Nullable Collection<String> entityTypes) {
- return new EntityConfig(/* useHints */ false, /* hints */ null,
- /* includedEntityTypes */ entityTypes, /* excludedEntityTypes */ null);
- }
-
- // TODO: Remove once apps can build against the latest sdk.
- /** @hide */
- public static EntityConfig createWithEntityList(@Nullable Collection<String> entityTypes) {
- return createWithExplicitEntityList(entityTypes);
+ return new EntityConfig.Builder()
+ .setIncludedTypes(entityTypes)
+ .includeTypesFromTextClassifier(false)
+ .build();
}
/**
- * Returns a list of the final set of entities to find.
+ * Returns a final list of entity types to find.
*
- * @param entities Entities we think should be found before factoring in includes/excludes
+ * @param entityTypes Entity types we think should be found before factoring in
+ * includes/excludes
*
* This method is intended for use by TextClassifier implementations.
*/
public Collection<String> resolveEntityListModifications(
- @NonNull Collection<String> entities) {
- final Set<String> finalSet = new HashSet();
- if (mUseHints) {
- finalSet.addAll(entities);
+ @NonNull Collection<String> entityTypes) {
+ final Set<String> finalSet = new HashSet<>();
+ if (mIncludeTypesFromTextClassifier) {
+ finalSet.addAll(entityTypes);
}
- finalSet.addAll(mIncludedEntityTypes);
- finalSet.removeAll(mExcludedEntityTypes);
+ finalSet.addAll(mIncludedTypes);
+ finalSet.removeAll(mExcludedTypes);
return finalSet;
}
@@ -503,17 +526,22 @@ public interface TextClassifier {
return mHints;
}
- @Override
- public int describeContents() {
- return 0;
+ /**
+ * Return whether the client allows the text classifier to include its own list of
+ * default types. If this function returns {@code true}, a default list of types suggested
+ * from a text classifier will be taking into account.
+ *
+ * <p>NOTE: This method is intended for use by a text classifier.
+ *
+ * @see #resolveEntityListModifications(Collection)
+ */
+ public boolean shouldIncludeTypesFromTextClassifier() {
+ return mIncludeTypesFromTextClassifier;
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeStringList(new ArrayList<>(mHints));
- dest.writeStringList(new ArrayList<>(mExcludedEntityTypes));
- dest.writeStringList(new ArrayList<>(mIncludedEntityTypes));
- dest.writeInt(mUseHints ? 1 : 0);
+ public int describeContents() {
+ return 0;
}
public static final Parcelable.Creator<EntityConfig> CREATOR =
@@ -529,11 +557,75 @@ public interface TextClassifier {
}
};
- private EntityConfig(Parcel in) {
- mHints = new ArraySet<>(in.createStringArrayList());
- mExcludedEntityTypes = new ArraySet<>(in.createStringArrayList());
- mIncludedEntityTypes = new ArraySet<>(in.createStringArrayList());
- mUseHints = in.readInt() == 1;
+
+
+ /** Builder class to construct the {@link EntityConfig} object. */
+ public static final class Builder {
+ @Nullable
+ private Collection<String> mIncludedTypes;
+ @Nullable
+ private Collection<String> mExcludedTypes;
+ @Nullable
+ private Collection<String> mHints;
+ private boolean mIncludeTypesFromTextClassifier = true;
+
+ /**
+ * Sets a collection of types that are explicitly included.
+ */
+ @NonNull
+ public Builder setIncludedTypes(@Nullable Collection<String> includedTypes) {
+ mIncludedTypes = includedTypes;
+ return this;
+ }
+
+ /**
+ * Sets a collection of types that are explicitly excluded.
+ */
+ @NonNull
+ public Builder setExcludedTypes(@Nullable Collection<String> excludedTypes) {
+ mExcludedTypes = excludedTypes;
+ return this;
+ }
+
+ /**
+ * Specifies whether or not to include the types suggested by the text classifier. By
+ * default, it is included.
+ */
+ @NonNull
+ public Builder includeTypesFromTextClassifier(boolean includeTypesFromTextClassifier) {
+ mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
+ return this;
+ }
+
+
+ /**
+ * Sets the hints for the TextClassifier to determine what types of entities to find.
+ * These hints will only be used if {@link #includeTypesFromTextClassifier} is
+ * set to be true.
+ */
+ public Builder setHints(Collection<String> hints) {
+ mHints = hints;
+ return this;
+ }
+
+ /**
+ * Combines all of the options that have been set and returns a new {@link EntityConfig}
+ * object.
+ */
+ @NonNull
+ public EntityConfig build() {
+ return new EntityConfig(
+ mIncludedTypes == null
+ ? Collections.emptyList()
+ : new ArrayList<>(mIncludedTypes),
+ mExcludedTypes == null
+ ? Collections.emptyList()
+ : new ArrayList<>(mExcludedTypes),
+ mHints == null
+ ? Collections.emptyList()
+ : Collections.unmodifiableList(new ArrayList<>(mHints)),
+ mIncludeTypesFromTextClassifier);
+ }
}
}
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index f2fea02171f9..b84f6f07e414 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -116,6 +116,8 @@ public final class TextClassifierEvent implements Parcelable {
public static final int TYPE_SELECTION_RESET = 18;
/** User composed a reply. */
public static final int TYPE_MANUAL_REPLY = 19;
+ /** TextClassifier generated some actions */
+ public static final int TYPE_ACTIONS_GENERATED = 20;
@Category private final int mEventCategory;
@Type private final int mEventType;
diff --git a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
new file mode 100644
index 000000000000..439e594cc8fe
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_SESSION_ID;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_VERSION;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME;
+
+import android.metrics.LogMaker;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.Preconditions;
+
+
+/**
+ * Log {@link TextClassifierEvent} by using Tron, only support language detection and
+ * conversation actions.
+ *
+ * @hide
+ */
+public final class TextClassifierEventTronLogger {
+
+ private static final String TAG = "TCEventTronLogger";
+
+ private final MetricsLogger mMetricsLogger;
+
+ public TextClassifierEventTronLogger() {
+ mMetricsLogger = new MetricsLogger();
+ }
+
+ @VisibleForTesting
+ public TextClassifierEventTronLogger(MetricsLogger metricsLogger) {
+ mMetricsLogger = Preconditions.checkNotNull(metricsLogger);
+ }
+
+ /** Emits a text classifier event to the logs. */
+ public void writeEvent(TextClassifierEvent event) {
+ Preconditions.checkNotNull(event);
+ int category = getCategory(event);
+ if (category == -1) {
+ Log.w(TAG, "Unknown category: " + event.getEventCategory());
+ return;
+ }
+ final LogMaker log = new LogMaker(category)
+ .setType(getLogType(event))
+ .addTaggedData(FIELD_SELECTION_SESSION_ID, event.getResultId())
+ .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime())
+ .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL,
+ SelectionSessionLogger.SignatureParser.getModelName(event.getResultId()))
+ .addTaggedData(FIELD_SELECTION_ENTITY_TYPE, event.getEntityType());
+ TextClassificationContext eventContext = event.getEventContext();
+ if (eventContext != null) {
+ log.addTaggedData(FIELD_SELECTION_WIDGET_TYPE, eventContext.getWidgetType());
+ log.addTaggedData(FIELD_SELECTION_WIDGET_VERSION, eventContext.getWidgetVersion());
+ log.setPackageName(eventContext.getPackageName());
+ }
+ mMetricsLogger.write(log);
+ debugLog(log);
+ }
+
+ private static int getCategory(TextClassifierEvent event) {
+ switch (event.getEventCategory()) {
+ case TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS:
+ return MetricsEvent.CONVERSATION_ACTIONS;
+ case TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION:
+ return MetricsEvent.LANGUAGE_DETECTION;
+ }
+ return -1;
+ }
+
+ private static int getLogType(TextClassifierEvent event) {
+ switch (event.getEventType()) {
+ case TextClassifierEvent.TYPE_SMART_ACTION:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE;
+ case TextClassifierEvent.TYPE_ACTIONS_SHOWN:
+ return MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN;
+ case TextClassifierEvent.TYPE_MANUAL_REPLY:
+ return MetricsEvent.ACTION_TEXT_CLASSIFIER_MANUAL_REPLY;
+ default:
+ return MetricsEvent.VIEW_UNKNOWN;
+ }
+ }
+
+ private String toCategoryName(int category) {
+ switch (category) {
+ case MetricsEvent.CONVERSATION_ACTIONS:
+ return "conversation_actions";
+ case MetricsEvent.LANGUAGE_DETECTION:
+ return "language_detection";
+ }
+ return "unknown";
+ }
+
+ private String toEventName(int logType) {
+ switch (logType) {
+ case MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE:
+ return "smart_share";
+ case MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN:
+ return "actions_shown";
+ case MetricsEvent.ACTION_TEXT_CLASSIFIER_MANUAL_REPLY:
+ return "manual_reply";
+ case MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_GENERATED:
+ return "actions_generated";
+ }
+ return "unknown";
+ }
+
+ private void debugLog(LogMaker log) {
+ if (!Log.ENABLE_FULL_LOGGING) {
+ return;
+ }
+ final String id = String.valueOf(log.getTaggedData(FIELD_SELECTION_SESSION_ID));
+ final String categoryName = toCategoryName(log.getCategory());
+ final String eventName = toEventName(log.getType());
+ final String widgetType = String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_TYPE));
+ final String widgetVersion =
+ String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_VERSION));
+ final String model = String.valueOf(log.getTaggedData(FIELD_TEXTCLASSIFIER_MODEL));
+ final String entityType = String.valueOf(log.getTaggedData(FIELD_SELECTION_ENTITY_TYPE));
+
+ StringBuilder builder = new StringBuilder();
+ builder.append("writeEvent: ");
+ builder.append("id=").append(id);
+ builder.append(", category=").append(categoryName);
+ builder.append(", eventName=").append(eventName);
+ builder.append(", widgetType=").append(widgetType);
+ builder.append(", widgetVersion=").append(widgetVersion);
+ builder.append(", model=").append(model);
+ builder.append(", entityType=").append(entityType);
+
+ Log.v(TAG, builder.toString());
+ }
+}
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index fcd06c384921..9ab963e372b7 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -115,9 +115,9 @@ public final class TextClassifierImpl implements TextClassifier {
@GuardedBy("mLock") // Do not access outside this lock.
private ActionsSuggestionsModel mActionsImpl;
- private final Object mLoggerLock = new Object();
- @GuardedBy("mLoggerLock") // Do not access outside this lock.
- private SelectionSessionLogger mSessionLogger;
+ private final SelectionSessionLogger mSessionLogger = new SelectionSessionLogger();
+ private final TextClassifierEventTronLogger mTextClassifierEventTronLogger =
+ new TextClassifierEventTronLogger();
private final TextClassificationConstants mSettings;
@@ -337,12 +337,7 @@ public final class TextClassifierImpl implements TextClassifier {
@Override
public void onSelectionEvent(SelectionEvent event) {
Preconditions.checkNotNull(event);
- synchronized (mLoggerLock) {
- if (mSessionLogger == null) {
- mSessionLogger = new SelectionSessionLogger();
- }
- mSessionLogger.writeEvent(event);
- }
+ mSessionLogger.writeEvent(event);
}
@Override
@@ -350,6 +345,7 @@ public final class TextClassifierImpl implements TextClassifier {
if (DEBUG) {
Log.d(DEFAULT_LOG_TAG, "onTextClassifierEvent() called with: event = [" + event + "]");
}
+ mTextClassifierEventTronLogger.writeEvent(event);
}
/** @inheritDoc */
@@ -397,7 +393,7 @@ public final class TextClassifierImpl implements TextClassifier {
actionsImpl.suggestActions(nativeConversation, null);
Collection<String> expectedTypes = resolveActionTypesFromRequest(request);
- List<ConversationActions.ConversationAction> conversationActions = new ArrayList<>();
+ List<ConversationAction> conversationActions = new ArrayList<>();
int maxSuggestions = nativeSuggestions.length;
if (request.getMaxSuggestions() > 0) {
maxSuggestions = Math.min(request.getMaxSuggestions(), nativeSuggestions.length);
@@ -409,7 +405,7 @@ public final class TextClassifierImpl implements TextClassifier {
continue;
}
conversationActions.add(
- new ConversationActions.ConversationAction.Builder(actionType)
+ new ConversationAction.Builder(actionType)
.setTextReply(nativeSuggestion.getResponseText())
.setConfidenceScore(nativeSuggestion.getScore())
.build());
@@ -449,10 +445,10 @@ public final class TextClassifierImpl implements TextClassifier {
private Collection<String> resolveActionTypesFromRequest(ConversationActions.Request request) {
List<String> defaultActionTypes =
- request.getHints().contains(ConversationActions.HINT_FOR_NOTIFICATION)
+ request.getHints().contains(ConversationActions.Request.HINT_FOR_NOTIFICATION)
? mSettings.getNotificationConversationActionTypes()
: mSettings.getInAppConversationActionTypes();
- return request.getTypeConfig().resolveTypes(defaultActionTypes);
+ return request.getTypeConfig().resolveEntityListModifications(defaultActionTypes);
}
private AnnotatorModel getAnnotatorImpl(LocaleList localeList)
diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java
index 9733701ee0f0..f553ca512881 100644
--- a/core/java/android/view/textservice/SpellCheckerSession.java
+++ b/core/java/android/view/textservice/SpellCheckerSession.java
@@ -27,7 +27,6 @@ import android.util.Log;
import com.android.internal.textservice.ISpellCheckerSession;
import com.android.internal.textservice.ISpellCheckerSessionListener;
-import com.android.internal.textservice.ITextServicesManager;
import com.android.internal.textservice.ITextServicesSessionListener;
import dalvik.system.CloseGuard;
@@ -96,7 +95,7 @@ public class SpellCheckerSession {
private static final int MSG_ON_GET_SUGGESTION_MULTIPLE_FOR_SENTENCE = 2;
private final InternalListener mInternalListener;
- private final ITextServicesManager mTextServicesManager;
+ private final TextServicesManager mTextServicesManager;
private final SpellCheckerInfo mSpellCheckerInfo;
@UnsupportedAppUsage
private final SpellCheckerSessionListener mSpellCheckerSessionListener;
@@ -124,7 +123,7 @@ public class SpellCheckerSession {
* @hide
*/
public SpellCheckerSession(
- SpellCheckerInfo info, ITextServicesManager tsm, SpellCheckerSessionListener listener) {
+ SpellCheckerInfo info, TextServicesManager tsm, SpellCheckerSessionListener listener) {
if (info == null || listener == null || tsm == null) {
throw new NullPointerException();
}
@@ -166,12 +165,8 @@ public class SpellCheckerSession {
*/
public void close() {
mGuard.close();
- try {
- mSpellCheckerSessionListenerImpl.close();
- mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
- } catch (RemoteException e) {
- // do nothing
- }
+ mSpellCheckerSessionListenerImpl.close();
+ mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
}
/**
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java
index 4c6862c81cf2..9ff64d9b268a 100644
--- a/core/java/android/view/textservice/TextServicesManager.java
+++ b/core/java/android/view/textservice/TextServicesManager.java
@@ -16,16 +16,20 @@
package android.view.textservice;
+import android.annotation.NonNull;
import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
+import android.annotation.UserIdInt;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
+import android.os.UserHandle;
import android.util.Log;
import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
+import com.android.internal.textservice.ISpellCheckerSessionListener;
import com.android.internal.textservice.ITextServicesManager;
import java.util.Locale;
@@ -68,22 +72,40 @@ public final class TextServicesManager {
private static final boolean DBG = false;
/**
- * A compile time switch to control per-profile spell checker, which is not yet ready.
- * @hide
+ * @deprecated Do not use. Just kept because of {@link UnsupportedAppUsage} in
+ * {@link #getInstance()}.
*/
- public static final boolean DISABLE_PER_PROFILE_SPELL_CHECKER = true;
-
+ @Deprecated
private static TextServicesManager sInstance;
private final ITextServicesManager mService;
- private TextServicesManager() throws ServiceNotFoundException {
+ @UserIdInt
+ private final int mUserId;
+
+ private TextServicesManager(@UserIdInt int userId) throws ServiceNotFoundException {
mService = ITextServicesManager.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.TEXT_SERVICES_MANAGER_SERVICE));
+ mUserId = userId;
+ }
+
+ /**
+ * The factory method of {@link TextServicesManager}.
+ *
+ * @param context {@link Context} from which {@link TextServicesManager} should be instantiated.
+ * @return {@link TextServicesManager} that is associated with {@link Context#getUserId()}.
+ * @throws ServiceNotFoundException When {@link TextServicesManager} is not available.
+ * @hide
+ */
+ @NonNull
+ public static TextServicesManager createInstance(@NonNull Context context)
+ throws ServiceNotFoundException {
+ return new TextServicesManager(context.getUserId());
}
/**
- * Retrieve the global TextServicesManager instance, creating it if it doesn't already exist.
+ * @deprecated Do not use. Just kept because of {@link UnsupportedAppUsage} in
+ * {@link #getInstance()}.
* @hide
*/
@UnsupportedAppUsage
@@ -91,7 +113,7 @@ public final class TextServicesManager {
synchronized (TextServicesManager.class) {
if (sInstance == null) {
try {
- sInstance = new TextServicesManager();
+ sInstance = new TextServicesManager(UserHandle.myUserId());
} catch (ServiceNotFoundException e) {
throw new IllegalStateException(e);
}
@@ -142,7 +164,7 @@ public final class TextServicesManager {
final SpellCheckerInfo sci;
try {
- sci = mService.getCurrentSpellChecker(null);
+ sci = mService.getCurrentSpellChecker(mUserId, null);
} catch (RemoteException e) {
return null;
}
@@ -180,9 +202,9 @@ public final class TextServicesManager {
if (subtypeInUse == null) {
return null;
}
- final SpellCheckerSession session = new SpellCheckerSession(sci, mService, listener);
+ final SpellCheckerSession session = new SpellCheckerSession(sci, this, listener);
try {
- mService.getSpellCheckerService(sci.getId(), subtypeInUse.getLocale(),
+ mService.getSpellCheckerService(mUserId, sci.getId(), subtypeInUse.getLocale(),
session.getTextServicesSessionListener(),
session.getSpellCheckerSessionListener(), bundle);
} catch (RemoteException e) {
@@ -197,7 +219,7 @@ public final class TextServicesManager {
@UnsupportedAppUsage
public SpellCheckerInfo[] getEnabledSpellCheckers() {
try {
- final SpellCheckerInfo[] retval = mService.getEnabledSpellCheckers();
+ final SpellCheckerInfo[] retval = mService.getEnabledSpellCheckers(mUserId);
if (DBG) {
Log.d(TAG, "getEnabledSpellCheckers: " + (retval != null ? retval.length : "null"));
}
@@ -214,7 +236,7 @@ public final class TextServicesManager {
public SpellCheckerInfo getCurrentSpellChecker() {
try {
// Passing null as a locale for ICS
- return mService.getCurrentSpellChecker(null);
+ return mService.getCurrentSpellChecker(mUserId, null);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -227,7 +249,7 @@ public final class TextServicesManager {
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
boolean allowImplicitlySelectedSubtype) {
try {
- return mService.getCurrentSpellCheckerSubtype(allowImplicitlySelectedSubtype);
+ return mService.getCurrentSpellCheckerSubtype(mUserId, allowImplicitlySelectedSubtype);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -239,7 +261,15 @@ public final class TextServicesManager {
@UnsupportedAppUsage
public boolean isSpellCheckerEnabled() {
try {
- return mService.isSpellCheckerEnabled();
+ return mService.isSpellCheckerEnabled(mUserId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ void finishSpellCheckerService(ISpellCheckerSessionListener listener) {
+ try {
+ mService.finishSpellCheckerService(mUserId, listener);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index bad2dbfebdc5..60393502bbe7 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -16,6 +16,7 @@
package android.webkit;
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -69,6 +70,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executor;
/**
* A View that displays web pages.
@@ -1688,6 +1690,84 @@ public class WebView extends AbsoluteLayout
return mProvider.getWebViewClient();
}
+
+ /**
+ * Gets the WebView renderer associated with this WebView.
+ *
+ * <p>In {@link android.os.Build.VERSION_CODES#O} and above, WebView may
+ * run in "multiprocess" mode. In multiprocess mode, rendering of web
+ * content is performed by a sandboxed renderer process separate to the
+ * application process. This renderer process may be shared with other
+ * WebViews in the application, but is not shared with other application
+ * processes.
+ *
+ * <p>If WebView is running in multiprocess mode, this method returns a
+ * handle to the renderer process associated with the WebView, which can
+ * be used to control the renderer process.
+ *
+ * @return the {@link WebViewRenderer} renderer handle associated
+ * with this {@link WebView}, or {@code null} if
+ * WebView is not runing in multiprocess mode.
+ */
+ @Nullable
+ public WebViewRenderer getWebViewRenderer() {
+ checkThread();
+ return mProvider.getWebViewRenderer();
+ }
+
+ /**
+ * Sets the renderer client object associated with this WebView.
+ *
+ * <p>The renderer client encapsulates callbacks relevant to WebView renderer
+ * state. See {@link WebViewRendererClient} for details.
+ *
+ * <p>Although many WebView instances may share a single underlying
+ * renderer, and renderers may live either in the application
+ * process, or in a sandboxed process that is isolated from the
+ * application process, instances of {@link WebViewRendererClient}
+ * are set per-WebView. Callbacks represent renderer events from
+ * the perspective of this WebView, and may or may not be correlated
+ * with renderer events affecting other WebViews.
+ *
+ * @param executor the Executor on which {@link WebViewRendererClient} callbacks will execute.
+ * @param webViewRendererClient the {@link WebViewRendererClient} object.
+ */
+ public void setWebViewRendererClient(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull WebViewRendererClient webViewRendererClient) {
+ checkThread();
+ mProvider.setWebViewRendererClient(executor, webViewRendererClient);
+ }
+
+ /**
+ * Sets the renderer client object associated with this WebView.
+ *
+ * See {@link #setWebViewRendererClient(Executor,WebViewRendererClient)} for details.
+ *
+ * <p> {@link WebViewRendererClient} callbacks will run on the thread that this WebView was
+ * initialized on.
+ *
+ * @param webViewRendererClient the {@link WebViewRendererClient} object.
+ */
+ public void setWebViewRendererClient(
+ @Nullable WebViewRendererClient webViewRendererClient) {
+ checkThread();
+ mProvider.setWebViewRendererClient(null, webViewRendererClient);
+ }
+
+ /**
+ * Gets the renderer client object associated with this WebView.
+ *
+ * @return the {@link WebViewRendererClient} object associated with this WebView, if one has
+ * been set via {@link #setWebViewRendererClient(WebViewRendererClient)} or {@code null}
+ * otherwise.
+ */
+ @Nullable
+ public WebViewRendererClient getWebViewRendererClient() {
+ checkThread();
+ return mProvider.getWebViewRendererClient();
+ }
+
/**
* Registers the interface to be used when content can not be handled by
* the rendering engine, and should be downloaded instead. This will replace
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 300bb6fd4890..090640e48aec 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -379,11 +379,16 @@ public class WebViewClient {
/**
* Notify the host application that an SSL error occurred while loading a
- * resource. The host application must call either handler.cancel() or
- * handler.proceed(). Note that the decision may be retained for use in
+ * resource. The host application must call either {@link SslErrorHandler#cancel} or
+ * {@link SslErrorHandler#proceed}. Note that the decision may be retained for use in
* response to future SSL errors. The default behavior is to cancel the
* load.
* <p>
+ * This API is only called for recoverable SSL certificate errors. In the case of
+ * non-recoverable errors (such as when the server fails the client), WebView will call {@link
+ * #onReceivedError(WebView, WebResourceRequest, WebResourceError)} with {@link
+ * #ERROR_FAILED_SSL_HANDSHAKE}.
+ * <p>
* Applications are advised not to prompt the user about SSL errors, as
* the user is unlikely to be able to make an informed security decision
* and WebView does not provide any UI for showing the details of the
@@ -391,10 +396,10 @@ public class WebViewClient {
* <p>
* Application overrides of this method may display custom error pages or
* silently log issues, but it is strongly recommended to always call
- * handler.cancel() and never allow proceeding past errors.
+ * {@link SslErrorHandler#cancel} and never allow proceeding past errors.
*
* @param view The WebView that is initiating the callback.
- * @param handler An SslErrorHandler object that will handle the user's
+ * @param handler An {@link SslErrorHandler} that will handle the user's
* response.
* @param error The SSL error object.
*/
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 95e7a986efd2..baf582693bd8 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -54,6 +54,7 @@ import android.webkit.WebView.VisualStateCallback;
import java.io.BufferedWriter;
import java.io.File;
import java.util.Map;
+import java.util.concurrent.Executor;
/**
* WebView backend provider interface: this interface is the abstract backend to a WebView
@@ -237,6 +238,14 @@ public interface WebViewProvider {
public WebViewClient getWebViewClient();
+ public WebViewRenderer getWebViewRenderer();
+
+ public void setWebViewRendererClient(
+ @Nullable Executor executor,
+ @Nullable WebViewRendererClient client);
+
+ public WebViewRendererClient getWebViewRendererClient();
+
public void setDownloadListener(DownloadListener listener);
public void setWebChromeClient(WebChromeClient client);
diff --git a/core/java/android/webkit/WebViewRenderer.java b/core/java/android/webkit/WebViewRenderer.java
new file mode 100644
index 000000000000..532825485ed3
--- /dev/null
+++ b/core/java/android/webkit/WebViewRenderer.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+/**
+ * WebViewRenderer provides an opaque handle to a {@link WebView} renderer.
+ */
+public abstract class WebViewRenderer {
+ /**
+ * Cause this renderer to terminate.
+ *
+ * <p>Calling this on a not yet started, or an already terminated renderer will have no effect.
+ *
+ * <p>Terminating a renderer process may have an effect on multiple {@link WebView} instances.
+ *
+ * <p>Renderer termination must be handled by properly overriding
+ * {@link WebViewClient#onRenderProcessGone} for every WebView that shares this
+ * renderer. If termination is not handled by all associated WebViews, then the application
+ * process will also be terminated.
+ *
+ * @return {@code true} if it was possible to terminate this renderer, {@code false} otherwise.
+ */
+ public abstract boolean terminate();
+
+ /**
+ * This class cannot be created by applications.
+ * @hide
+ */
+ public WebViewRenderer() {
+ }
+}
diff --git a/core/java/android/webkit/WebViewRendererClient.java b/core/java/android/webkit/WebViewRendererClient.java
new file mode 100644
index 000000000000..2fadf54fd434
--- /dev/null
+++ b/core/java/android/webkit/WebViewRendererClient.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+/**
+ * Used to receive callbacks on {@link WebView} renderer events.
+ *
+ * WebViewRendererClient instances may be set or retrieved via {@link
+ * WebView#setWebViewRendererClient(WebViewRendererClient)} and {@link
+ * WebView#getWebViewRendererClient()}.
+ *
+ * Instances may be attached to multiple WebViews, and thus a single renderer event may cause
+ * a callback to be called multiple times with different WebView parameters.
+ */
+public abstract class WebViewRendererClient {
+ /**
+ * Called when the renderer currently associated with {@code view} becomes unresponsive as a
+ * result of a long running blocking task such as the execution of JavaScript.
+ *
+ * <p>If a WebView fails to process an input event, or successfully navigate to a new URL within
+ * a reasonable time frame, the renderer is considered to be unresponsive, and this callback
+ * will be called.
+ *
+ * <p>This callback will continue to be called at regular intervals as long as the renderer
+ * remains unresponsive. If the renderer becomes responsive again, {@link
+ * WebViewRendererClient#onRendererResponsive} will be called once, and this method will not
+ * subsequently be called unless another period of unresponsiveness is detected.
+ *
+ * <p>No action is taken by WebView as a result of this method call. Applications may
+ * choose to terminate the associated renderer via the object that is passed to this callback,
+ * if in multiprocess mode, however this must be accompanied by correctly handling
+ * {@link WebViewClient#onRenderProcessGone} for this WebView, and all other WebViews associated
+ * with the same renderer. Failure to do so will result in application termination.
+ *
+ * @param view The {@link WebView} for which unresponsiveness was detected.
+ * @param renderer The {@link WebViewRenderer} that has become unresponsive,
+ * or {@code null} if WebView is running in single process mode.
+ */
+ public abstract void onRendererUnresponsive(
+ @NonNull WebView view, @Nullable WebViewRenderer renderer);
+
+ /**
+ * Called once when an unresponsive renderer currently associated with {@code view} becomes
+ * responsive.
+ *
+ * <p>After a WebView renderer becomes unresponsive, which is notified to the application by
+ * {@link WebViewRendererClient#onRendererUnresponsive}, it is possible for the blocking
+ * renderer task to complete, returning the renderer to a responsive state. In that case,
+ * this method is called once to indicate responsiveness.
+ *
+ * <p>No action is taken by WebView as a result of this method call.
+ *
+ * @param view The {@link WebView} for which responsiveness was detected.
+ *
+ * @param renderer The {@link WebViewRenderer} that has become responsive, or {@code null} if
+ * WebView is running in single process mode.
+ */
+ public abstract void onRendererResponsive(
+ @NonNull WebView view, @Nullable WebViewRenderer renderer);
+}
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index 49e11b8baf51..29b3b3cff044 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -159,7 +159,10 @@ public class WebViewZygote {
0, // runtimeFlags
"webview_zygote", // seInfo
sPackage.applicationInfo.primaryCpuAbi, // abi
- null); // instructionSet
+ TextUtils.join(",", Build.SUPPORTED_ABIS),
+ null, // instructionSet
+ Process.FIRST_ISOLATED_UID,
+ Process.LAST_ISOLATED_UID);
// All the work below is usually done by LoadedApk, but the zygote can't talk to
// PackageManager or construct a LoadedApk since it's single-threaded pre-fork, so
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 3c32bb29cf66..4a60b6a8185a 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -2394,6 +2394,17 @@ public class Editor {
}
}
+ /**
+ * Called when {@link TextView#mTextOperationUser} has changed.
+ *
+ * <p>Any user-specific resources need to be refreshed here.</p>
+ */
+ final void onTextOperationUserChanged() {
+ if (mSpellChecker != null) {
+ mSpellChecker.resetSession();
+ }
+ }
+
protected void stopTextActionMode() {
if (mTextActionMode != null) {
// This will hide the mSelectionModifierCursorController
@@ -2890,10 +2901,6 @@ public class Editor {
}
}
- // Notify source IME of the suggestion pick. Do this before swapping texts.
- targetSuggestionSpan.notifySelection(
- mTextView.getContext(), originalText, suggestionInfo.mSuggestionIndex);
-
// Swap text content between actual text and Suggestion span
final int suggestionStart = suggestionInfo.mSuggestionStart;
final int suggestionEnd = suggestionInfo.mSuggestionEnd;
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 7d027574198d..afe467012307 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -104,8 +104,9 @@ public final class Magnifier {
private final int mDefaultHorizontalSourceToMagnifierOffset;
// The vertical offset between the source and window coords when #show(float, float) is used.
private final int mDefaultVerticalSourceToMagnifierOffset;
- // Whether the magnifier will be clamped inside the main surface and not overlap system insets.
- private final boolean mForcePositionWithinWindowSystemInsetsBounds;
+ // Whether the area where the magnifier can be positioned will be clipped to the main window
+ // and within system insets.
+ private final boolean mClippingEnabled;
// The behavior of the left bound of the rectangle where the content can be copied from.
private @SourceBound int mLeftContentBound;
// The behavior of the top bound of the rectangle where the content can be copied from.
@@ -165,7 +166,7 @@ public final class Magnifier {
params.mOverlay = new ColorDrawable(a.getColor(
R.styleable.Magnifier_magnifierColorOverlay, Color.TRANSPARENT));
a.recycle();
- params.mForcePositionWithinWindowSystemInsetsBounds = true;
+ params.mClippingEnabled = true;
params.mLeftContentBound = SOURCE_BOUND_MAX_VISIBLE;
params.mTopContentBound = SOURCE_BOUND_MAX_IN_SURFACE;
params.mRightContentBound = SOURCE_BOUND_MAX_VISIBLE;
@@ -203,8 +204,7 @@ public final class Magnifier {
params.mHorizontalDefaultSourceToMagnifierOffset;
mDefaultVerticalSourceToMagnifierOffset =
params.mVerticalDefaultSourceToMagnifierOffset;
- mForcePositionWithinWindowSystemInsetsBounds =
- params.mForcePositionWithinWindowSystemInsetsBounds;
+ mClippingEnabled = params.mClippingEnabled;
mLeftContentBound = params.mLeftContentBound;
mTopContentBound = params.mTopContentBound;
mRightContentBound = params.mRightContentBound;
@@ -271,7 +271,7 @@ public final class Magnifier {
if (mWindow == null) {
synchronized (mLock) {
mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(),
- mParentSurface.mSurface, mWindowWidth, mWindowHeight,
+ mParentSurface.mSurfaceControl, mWindowWidth, mWindowHeight,
mWindowElevation, mWindowCornerRadius,
mOverlay != null ? mOverlay : new ColorDrawable(Color.TRANSPARENT),
Handler.getMain() /* draw the magnifier on the UI thread */, mLock,
@@ -447,7 +447,7 @@ public final class Magnifier {
}
/**
- * Returns the overlay to be drawn on the top of the magnifier content, or
+ * Returns the overlay to be drawn on the top of the magnifier, or
* {@code null} if no overlay should be drawn.
* @return the overlay
* @see Magnifier.Builder#setOverlay(Drawable)
@@ -459,13 +459,15 @@ public final class Magnifier {
/**
* Returns whether the magnifier position will be adjusted such that the magnifier will be
- * fully within the bounds of the main application window, by also avoiding any overlap with
- * system insets (such as the one corresponding to the status bar).
+ * fully within the bounds of the main application window, by also avoiding any overlap
+ * with system insets (such as the one corresponding to the status bar) i.e. whether the
+ * area where the magnifier can be positioned will be clipped to the main application window
+ * and the system insets.
* @return whether the magnifier position will be adjusted
- * @see Magnifier.Builder#setForcePositionWithinWindowSystemInsetsBounds(boolean)
+ * @see Magnifier.Builder#setClippingEnabled(boolean)
*/
- public boolean isForcePositionWithinWindowSystemInsetsBounds() {
- return mForcePositionWithinWindowSystemInsetsBounds;
+ public boolean isClippingEnabled() {
+ return mClippingEnabled;
}
/**
@@ -528,17 +530,20 @@ public final class Magnifier {
final int surfaceHeight =
viewRootImpl.getHeight() + surfaceInsets.top + surfaceInsets.bottom;
validMainWindowSurface =
- new SurfaceInfo(mainWindowSurface, surfaceWidth, surfaceHeight, true);
+ new SurfaceInfo(viewRootImpl.getSurfaceControl(), mainWindowSurface,
+ surfaceWidth, surfaceHeight, true);
}
}
// Get the surface backing the magnified view, if it is a SurfaceView.
SurfaceInfo validSurfaceViewSurface = SurfaceInfo.NULL;
if (mView instanceof SurfaceView) {
+ final SurfaceControl sc = ((SurfaceView) mView).getSurfaceControl();
final SurfaceHolder surfaceHolder = ((SurfaceView) mView).getHolder();
final Surface surfaceViewSurface = surfaceHolder.getSurface();
- if (surfaceViewSurface != null && surfaceViewSurface.isValid()) {
+
+ if (sc != null && sc.isValid()) {
final Rect surfaceFrame = surfaceHolder.getSurfaceFrame();
- validSurfaceViewSurface = new SurfaceInfo(surfaceViewSurface,
+ validSurfaceViewSurface = new SurfaceInfo(sc, surfaceViewSurface,
surfaceFrame.right, surfaceFrame.bottom, false);
}
}
@@ -708,7 +713,7 @@ public final class Magnifier {
* @return the current window coordinates, after they are clamped inside the parent surface
*/
private Point getCurrentClampedWindowCoordinates() {
- if (!mForcePositionWithinWindowSystemInsetsBounds) {
+ if (!mClippingEnabled) {
// No position adjustment should be done, so return the raw coordinates.
return new Point(mWindowCoords);
}
@@ -733,15 +738,18 @@ public final class Magnifier {
* Contains a surface and metadata corresponding to it.
*/
private static class SurfaceInfo {
- public static final SurfaceInfo NULL = new SurfaceInfo(null, 0, 0, false);
+ public static final SurfaceInfo NULL = new SurfaceInfo(null, null, 0, 0, false);
private Surface mSurface;
+ private SurfaceControl mSurfaceControl;
private int mWidth;
private int mHeight;
private boolean mIsMainWindowSurface;
- SurfaceInfo(final Surface surface, final int width, final int height,
+ SurfaceInfo(final SurfaceControl surfaceControl, final Surface surface,
+ final int width, final int height,
final boolean isMainWindowSurface) {
+ mSurfaceControl = surfaceControl;
mSurface = surface;
mWidth = width;
mHeight = height;
@@ -819,7 +827,7 @@ public final class Magnifier {
private Bitmap mCurrentContent;
InternalPopupWindow(final Context context, final Display display,
- final Surface parentSurface, final int width, final int height,
+ final SurfaceControl parentSurfaceControl, final int width, final int height,
final float elevation, final float cornerRadius, final Drawable overlay,
final Handler handler, final Object lock, final Callback callback) {
mDisplay = display;
@@ -829,17 +837,18 @@ public final class Magnifier {
mContentWidth = width;
mContentHeight = height;
- mOffsetX = (int) (0.1f * width);
- mOffsetY = (int) (0.1f * height);
+ mOffsetX = (int) (1.05f * elevation);
+ mOffsetY = (int) (1.05f * elevation);
// Setup the surface we will use for drawing the content and shadow.
mSurfaceWidth = mContentWidth + 2 * mOffsetX;
mSurfaceHeight = mContentHeight + 2 * mOffsetY;
- mSurfaceSession = new SurfaceSession(parentSurface);
+ mSurfaceSession = new SurfaceSession();
mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
.setFormat(PixelFormat.TRANSLUCENT)
.setBufferSize(mSurfaceWidth, mSurfaceHeight)
.setName("magnifier surface")
.setFlags(SurfaceControl.HIDDEN)
+ .setParent(parentSurfaceControl)
.build();
mSurface = new Surface();
mSurface.copyFrom(mSurfaceControl);
@@ -1129,7 +1138,7 @@ public final class Magnifier {
private @Nullable Drawable mOverlay;
private int mHorizontalDefaultSourceToMagnifierOffset;
private int mVerticalDefaultSourceToMagnifierOffset;
- private boolean mForcePositionWithinWindowSystemInsetsBounds;
+ private boolean mClippingEnabled;
private @SourceBound int mLeftContentBound;
private @SourceBound int mTopContentBound;
private @SourceBound int mRightContentBound;
@@ -1157,7 +1166,7 @@ public final class Magnifier {
resources.getDimensionPixelSize(R.dimen.default_magnifier_vertical_offset);
mOverlay = new ColorDrawable(resources.getColor(
R.color.default_magnifier_color_overlay, null));
- mForcePositionWithinWindowSystemInsetsBounds = true;
+ mClippingEnabled = true;
mLeftContentBound = SOURCE_BOUND_MAX_VISIBLE;
mTopContentBound = SOURCE_BOUND_MAX_VISIBLE;
mRightContentBound = SOURCE_BOUND_MAX_VISIBLE;
@@ -1220,11 +1229,11 @@ public final class Magnifier {
}
/**
- * Sets an overlay that will be drawn on the top of the magnifier content.
- * In general, the overlay should not be opaque, in order to let the expected magnifier
- * content be partially visible. The default overlay is {@code null} (no overlay).
- * As an example, TextView applies a white {@link ColorDrawable} overlay with
- * 5% alpha, aiming to make the magnifier distinguishable when shown in dark
+ * Sets an overlay that will be drawn on the top of the magnifier.
+ * In general, the overlay should not be opaque, in order to let the magnified
+ * content be partially visible in the magnifier. The default overlay is {@code null}
+ * (no overlay). As an example, TextView applies a white {@link ColorDrawable}
+ * overlay with 5% alpha, aiming to make the magnifier distinguishable when shown in dark
* application regions. To disable the overlay, the parameter should be set
* to {@code null}. If not null, the overlay will be automatically redrawn
* when the drawable is invalidated. To achieve this, the magnifier will set a new
@@ -1258,22 +1267,24 @@ public final class Magnifier {
* Defines the behavior of the magnifier when it is requested to position outside the
* surface of the main application window. The default value is {@code true}, which means
* that the position will be adjusted such that the magnifier will be fully within the
- * bounds of the main application window, by also avoiding any overlap with system insets
- * (such as the one corresponding to the status bar). If you require a custom behavior, this
- * flag should be set to {@code false}, meaning that the magnifier will be able to cross the
- * main application surface boundaries (and also overlap the system insets). This should be
- * handled with care, when passing coordinates to {@link #show(float, float)}; note that:
+ * bounds of the main application window, while also avoiding any overlap with system insets
+ * (such as the one corresponding to the status bar). If this flag is set to {@code false},
+ * the area where the magnifier can be positioned will no longer be clipped, so the
+ * magnifier will be able to extend outside the main application window boundaries (and also
+ * overlap the system insets). This can be useful if you require a custom behavior, but it
+ * should be handled with care, when passing coordinates to {@link #show(float, float)};
+ * note that:
* <ul>
* <li>in a multiwindow context, if the magnifier crosses the boundary between the two
* windows, it will not be able to show over the window of the other application</li>
* <li>if the magnifier overlaps the status bar, there is no guarantee about which one
* will be displayed on top. This should be handled with care.</li>
* </ul>
- * @param force whether the magnifier position will be adjusted
+ * @param clip whether the magnifier position will be adjusted
*/
@NonNull
- public Builder setForcePositionWithinWindowSystemInsetsBounds(boolean force) {
- mForcePositionWithinWindowSystemInsetsBounds = force;
+ public Builder setClippingEnabled(boolean clip) {
+ mClippingEnabled = clip;
return this;
}
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index fc1172e0457a..d4aad752daa0 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -16,7 +16,7 @@
package android.widget;
-import android.content.Context;
+import android.annotation.Nullable;
import android.text.Editable;
import android.text.Selection;
import android.text.Spanned;
@@ -93,6 +93,7 @@ public class SpellChecker implements SpellCheckerSessionListener {
// concurrently due to the asynchronous nature of onGetSuggestions.
private WordIterator mWordIterator;
+ @Nullable
private TextServicesManager mTextServicesManager;
private Runnable mSpellRunnable;
@@ -114,12 +115,12 @@ public class SpellChecker implements SpellCheckerSessionListener {
mCookie = hashCode();
}
- private void resetSession() {
+ void resetSession() {
closeSession();
- mTextServicesManager = (TextServicesManager) mTextView.getContext().
- getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
+ mTextServicesManager = mTextView.getTextServicesManagerForUser();
if (mCurrentLocale == null
+ || mTextServicesManager == null
|| mTextView.length() == 0
|| !mTextServicesManager.isSpellCheckerEnabled()
|| mTextServicesManager.getCurrentSpellCheckerSubtype(true) == null) {
@@ -226,7 +227,8 @@ public class SpellChecker implements SpellCheckerSessionListener {
start = 0;
end = mTextView.getText().length();
} else {
- final boolean spellCheckerActivated = mTextServicesManager.isSpellCheckerEnabled();
+ final boolean spellCheckerActivated =
+ mTextServicesManager != null && mTextServicesManager.isSpellCheckerEnabled();
if (isSessionActive != spellCheckerActivated) {
// Spell checker has been turned of or off since last spellCheck
resetSession();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 0ea8579fafe6..1085e5dadb42 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -16,6 +16,7 @@
package android.widget;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH;
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX;
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;
@@ -31,6 +32,7 @@ import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Px;
+import android.annotation.RequiresPermission;
import android.annotation.Size;
import android.annotation.StringRes;
import android.annotation.StyleRes;
@@ -45,10 +47,10 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.UndoManager;
+import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
-import android.content.res.ResourceId;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
@@ -74,7 +76,9 @@ import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ParcelableParcel;
+import android.os.Process;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.BoringLayout;
import android.text.DynamicLayout;
@@ -195,6 +199,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
+import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -786,6 +791,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private InputFilter[] mFilters = NO_FILTERS;
+ /**
+ * {@link UserHandle} that represents the logical owner of the text. {@code null} when it is
+ * the same as {@link Process#myUserHandle()}.
+ *
+ * <p>Most of applications should not worry about this. Some privileged apps that host UI for
+ * other apps may need to set this so that the system can use right user's resources and
+ * services such as input methods and spell checkers.</p>
+ *
+ * @see #setTextOperationUser(UserHandle)
+ */
+ @Nullable
+ private UserHandle mTextOperationUser;
+
private volatile Locale mCurrentSpellCheckerLocaleCache;
// It is possible to have a selection even when mEditor is null (programmatically set, like when
@@ -889,7 +907,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
// sanitize autofill requests.
private boolean mTextSetFromXmlOrResourceId = false;
// Resource id used to set the text.
- private @StringRes int mTextId = ResourceId.ID_NULL;
+ private @StringRes int mTextId = Resources.ID_NULL;
//
// End of autofill-related attributes
@@ -1180,7 +1198,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
case com.android.internal.R.styleable.TextView_text:
textIsSetFromXml = true;
- mTextId = a.getResourceId(attr, ResourceId.ID_NULL);
+ mTextId = a.getResourceId(attr, Resources.ID_NULL);
text = a.getText(attr);
break;
@@ -3520,7 +3538,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@android.view.RemotableViewMethod
public void setTextSelectHandle(@DrawableRes int textSelectHandle) {
- Preconditions.checkArgumentPositive(textSelectHandle,
+ Preconditions.checkArgument(textSelectHandle != 0,
"The text select handle should be a valid drawable resource id.");
setTextSelectHandle(mContext.getDrawable(textSelectHandle));
}
@@ -3577,7 +3595,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@android.view.RemotableViewMethod
public void setTextSelectHandleLeft(@DrawableRes int textSelectHandleLeft) {
- Preconditions.checkArgumentPositive(textSelectHandleLeft,
+ Preconditions.checkArgument(textSelectHandleLeft != 0,
"The text select left handle should be a valid drawable resource id.");
setTextSelectHandleLeft(mContext.getDrawable(textSelectHandleLeft));
}
@@ -3634,7 +3652,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
@android.view.RemotableViewMethod
public void setTextSelectHandleRight(@DrawableRes int textSelectHandleRight) {
- Preconditions.checkArgumentPositive(textSelectHandleRight,
+ Preconditions.checkArgument(textSelectHandleRight != 0,
"The text select right handle should be a valid drawable resource id.");
setTextSelectHandleRight(mContext.getDrawable(textSelectHandleRight));
}
@@ -3667,9 +3685,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @see #setTextCursorDrawable(int)
* @attr ref android.R.styleable#TextView_textCursorDrawable
*/
- public void setTextCursorDrawable(@NonNull Drawable textCursorDrawable) {
- Preconditions.checkNotNull(textCursorDrawable,
- "The cursor drawable should not be null.");
+ public void setTextCursorDrawable(@Nullable Drawable textCursorDrawable) {
mCursorDrawable = textCursorDrawable;
mCursorDrawableRes = 0;
if (mEditor != null) {
@@ -3687,9 +3703,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @attr ref android.R.styleable#TextView_textCursorDrawable
*/
public void setTextCursorDrawable(@DrawableRes int textCursorDrawable) {
- Preconditions.checkArgumentPositive(textCursorDrawable,
- "The cursor drawable should be a valid drawable resource id.");
- setTextCursorDrawable(mContext.getDrawable(textCursorDrawable));
+ setTextCursorDrawable(
+ textCursorDrawable != 0 ? mContext.getDrawable(textCursorDrawable) : null);
}
/**
@@ -8061,6 +8076,26 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
break;
+
+ case KeyEvent.KEYCODE_FORWARD_DEL:
+ if (event.hasModifiers(KeyEvent.META_SHIFT_ON) && canCut()) {
+ if (onTextContextMenuItem(ID_CUT)) {
+ return KEY_EVENT_HANDLED;
+ }
+ }
+ break;
+
+ case KeyEvent.KEYCODE_INSERT:
+ if (event.hasModifiers(KeyEvent.META_CTRL_ON) && canCopy()) {
+ if (onTextContextMenuItem(ID_COPY)) {
+ return KEY_EVENT_HANDLED;
+ }
+ } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON) && canPaste()) {
+ if (onTextContextMenuItem(ID_PASTE)) {
+ return KEY_EVENT_HANDLED;
+ }
+ }
+ break;
}
if (mEditor != null && mEditor.mKeyListener != null) {
@@ -8308,6 +8343,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
outAttrs.hintText = mHint;
+ outAttrs.targetInputMethodUser = mTextOperationUser;
if (mText instanceof Editable) {
InputConnection ic = new EditableInputConnection(this);
outAttrs.initialSelStart = getSelectionStart();
@@ -10831,25 +10867,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return onTextContextMenuItem(ID_PASTE);
}
break;
- case KeyEvent.KEYCODE_INSERT:
- if (canCopy()) {
- return onTextContextMenuItem(ID_COPY);
- }
- break;
- }
- } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
- // Handle Shift-only shortcuts.
- switch (keyCode) {
- case KeyEvent.KEYCODE_FORWARD_DEL:
- if (canCut()) {
- return onTextContextMenuItem(ID_CUT);
- }
- break;
- case KeyEvent.KEYCODE_INSERT:
- if (canPaste()) {
- return onTextContextMenuItem(ID_PASTE);
- }
- break;
}
} else if (event.hasModifiers(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON)) {
// Handle Ctrl-Shift shortcuts.
@@ -10904,6 +10921,55 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
+ * Associate {@link UserHandle} who is considered to be the logical owner of the text shown in
+ * this {@link TextView}.
+ *
+ * <p>Most of applications should not worry about this. Some privileged apps that host UI for
+ * other apps may need to set this so that the system can user right user's resources and
+ * services such as input methods and spell checkers.</p>
+ *
+ * @param user {@link UserHandle} who is considered to be the owner of the text shown in this
+ * {@link TextView}. {@code null} to reset {@link #mTextOperationUser}.
+ * @hide
+ */
+ @RequiresPermission(INTERACT_ACROSS_USERS_FULL)
+ public final void setTextOperationUser(@Nullable UserHandle user) {
+ if (Objects.equals(mTextOperationUser, user)) {
+ return;
+ }
+ if (user != null && !Process.myUserHandle().equals(user)) {
+ // Just for preventing people from accidentally using this hidden API without
+ // the required permission. The same permission is also checked in the system server.
+ if (getContext().checkSelfPermission(INTERACT_ACROSS_USERS_FULL)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("INTERACT_ACROSS_USERS_FULL is required."
+ + " userId=" + user.getIdentifier()
+ + " callingUserId" + UserHandle.myUserId());
+ }
+ }
+ mTextOperationUser = user;
+ // Invalidate some resources
+ mCurrentSpellCheckerLocaleCache = null;
+ if (mEditor != null) {
+ mEditor.onTextOperationUserChanged();
+ }
+ }
+
+ @Nullable
+ final TextServicesManager getTextServicesManagerForUser() {
+ if (mTextOperationUser == null) {
+ return getContext().getSystemService(TextServicesManager.class);
+ }
+ try {
+ return getContext().createPackageContextAsUser(
+ "android", 0 /* flags */, mTextOperationUser)
+ .getSystemService(TextServicesManager.class);
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+
+ /**
* This is a temporary method. Future versions may support multi-locale text.
* Caveat: This method may not return the latest text services locale, but this should be
* acceptable and it's more important to make this method asynchronous.
@@ -10975,8 +11041,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@UnsupportedAppUsage
private void updateTextServicesLocaleLocked() {
- final TextServicesManager textServicesManager = (TextServicesManager)
- mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
+ final TextServicesManager textServicesManager = getTextServicesManagerForUser();
+ if (textServicesManager == null) {
+ return;
+ }
final SpellCheckerSubtype subtype = textServicesManager.getCurrentSpellCheckerSubtype(true);
final Locale locale;
if (subtype != null) {
@@ -11033,7 +11101,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
structure.setDataIsSensitive(!mTextSetFromXmlOrResourceId);
}
- if (mTextId != ResourceId.ID_NULL) {
+ if (mTextId != Resources.ID_NULL) {
try {
structure.setTextIdEntry(getResources().getResourceEntryName(mTextId));
} catch (Resources.NotFoundException e) {
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index 6a3a8f0821d8..dc9a585b56e2 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -454,6 +454,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
(RelativeLayout.LayoutParams) mAmPmLayout.getLayoutParams();
if (params.getRule(RelativeLayout.RIGHT_OF) != 0
|| params.getRule(RelativeLayout.LEFT_OF) != 0) {
+ final int margin = (int) (mContext.getResources().getDisplayMetrics().density * 8);
// Horizontal mode, with AM/PM appearing to left/right of hours and minutes.
final boolean isAmPmAtLeft;
if (TextUtils.getLayoutDirectionFromLocale(mLocale) == View.LAYOUT_DIRECTION_LTR) {
@@ -461,10 +462,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
} else {
isAmPmAtLeft = !isAmPmAtStart;
}
- if (mIsAmPmAtLeft == isAmPmAtLeft) {
- // AM/PM is already at the correct location. No change needed.
- return;
- }
if (isAmPmAtLeft) {
params.removeRule(RelativeLayout.RIGHT_OF);
@@ -473,6 +470,14 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
params.removeRule(RelativeLayout.LEFT_OF);
params.addRule(RelativeLayout.RIGHT_OF, mMinuteView.getId());
}
+
+ if (isAmPmAtStart) {
+ params.setMarginStart(0);
+ params.setMarginEnd(margin);
+ } else {
+ params.setMarginStart(margin);
+ params.setMarginEnd(0);
+ }
mIsAmPmAtLeft = isAmPmAtLeft;
} else if (params.getRule(RelativeLayout.BELOW) != 0
|| params.getRule(RelativeLayout.ABOVE) != 0) {
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 4523d3b2739f..b4d8322c7552 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -21,19 +21,24 @@ import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.LabeledIntent;
+import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
+import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
@@ -75,6 +80,7 @@ import com.google.android.collect.Lists;
import java.io.File;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -92,6 +98,15 @@ public class ChooserActivity extends ResolverActivity {
private static final boolean DEBUG = false;
+ /**
+ * If set to true, use ShortcutManager to retrieve the matching direct share targets, instead of
+ * binding to every ChooserTargetService implementation.
+ */
+ // TODO(b/121287573): Replace with a system flag (setprop?)
+ private static final boolean USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS = false;
+ // TODO(b/121287224): Re-evaluate this limit
+ private static final int SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20;
+
private static final int QUERY_TARGET_SERVICE_LIMIT = 5;
private static final int WATCHDOG_TIMEOUT_MILLIS = 2000;
@@ -120,6 +135,7 @@ public class ChooserActivity extends ResolverActivity {
private static final int CHOOSER_TARGET_SERVICE_RESULT = 1;
private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT = 2;
+ private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT = 3;
private final Handler mChooserHandler = new Handler() {
@Override
@@ -158,6 +174,18 @@ public class ChooserActivity extends ResolverActivity {
mChooserListAdapter.setShowServiceTargets(true);
break;
+ case SHORTCUT_MANAGER_SHARE_TARGET_RESULT:
+ if (DEBUG) Log.d(TAG, "SHORTCUT_MANAGER_SHARE_TARGET_RESULT");
+ if (isDestroyed()) break;
+ final ServiceResultInfo resultInfo = (ServiceResultInfo) msg.obj;
+ if (resultInfo.resultTargets != null) {
+ mChooserListAdapter.addServiceResults(resultInfo.originalTarget,
+ resultInfo.resultTargets);
+ }
+ sendVoiceChoicesIfNeeded();
+ mChooserListAdapter.setShowServiceTargets(true);
+ break;
+
default:
super.handleMessage(msg);
}
@@ -552,6 +580,94 @@ public class ChooserActivity extends ResolverActivity {
}
}
+ private IntentFilter getTargetIntentFilter() {
+ try {
+ final Intent intent = getTargetIntent();
+ String dataString = intent.getDataString();
+ if (TextUtils.isEmpty(dataString)) {
+ dataString = intent.getType();
+ }
+ return new IntentFilter(intent.getAction(), dataString);
+ } catch (Exception e) {
+ Log.e(TAG, "failed to get target intent filter " + e);
+ return null;
+ }
+ }
+
+ private void queryDirectShareTargets(ChooserListAdapter adapter) {
+ final IntentFilter filter = getTargetIntentFilter();
+ if (filter == null) {
+ return;
+ }
+
+ // Need to keep the original DisplayResolveInfos to be able to reconstruct ServiceResultInfo
+ // and use the old code path. This Ugliness should go away when Sharesheet is refactored.
+ final List<DisplayResolveInfo> driList = new ArrayList<>();
+ int targetsToQuery = 0;
+ for (int i = 0, n = adapter.getDisplayResolveInfoCount(); i < n; i++) {
+ final DisplayResolveInfo dri = adapter.getDisplayResolveInfo(i);
+ if (adapter.getScore(dri) == 0) {
+ // A score of 0 means the app hasn't been used in some time;
+ // don't query it as it's not likely to be relevant.
+ continue;
+ }
+ driList.add(dri);
+ targetsToQuery++;
+ // TODO(b/121287224): Do we need this here? (similar to queryTargetServices)
+ if (targetsToQuery >= SHARE_TARGET_QUERY_PACKAGE_LIMIT) {
+ if (DEBUG) {
+ Log.d(TAG, "queryTargets hit query target limit "
+ + SHARE_TARGET_QUERY_PACKAGE_LIMIT);
+ }
+ break;
+ }
+ }
+
+ AsyncTask.execute(() -> {
+ ShortcutManager sm = (ShortcutManager) getSystemService(Context.SHORTCUT_SERVICE);
+ List<ShortcutManager.ShareShortcutInfo> resultList = sm.getShareTargets(filter);
+
+ // Match ShareShortcutInfos with DisplayResolveInfos to be able to use the old code path
+ // for direct share targets. After ShareSheet is refactored we should use the
+ // ShareShortcutInfos directly.
+ for (int i = 0; i < driList.size(); i++) {
+ List<ChooserTarget> chooserTargets = new ArrayList<>();
+ for (int j = 0; j < resultList.size(); j++) {
+ if (driList.get(i).getResolvedComponentName().equals(
+ resultList.get(j).getTargetComponent())) {
+ chooserTargets.add(convertToChooserTarget(resultList.get(j)));
+ }
+ }
+ if (chooserTargets.isEmpty()) {
+ continue;
+ }
+
+ final Message msg = Message.obtain();
+ msg.what = SHORTCUT_MANAGER_SHARE_TARGET_RESULT;
+ msg.obj = new ServiceResultInfo(driList.get(i), chooserTargets, null);
+ mChooserHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private ChooserTarget convertToChooserTarget(ShortcutManager.ShareShortcutInfo shareShortcut) {
+ ShortcutInfo shortcutInfo = shareShortcut.getShortcutInfo();
+ Bundle extras = new Bundle();
+ extras.putString(Intent.EXTRA_SHORTCUT_ID, shortcutInfo.getId());
+ return new ChooserTarget(
+ // The name of this target.
+ shortcutInfo.getShortLabel(),
+ // Don't load the icon until it is selected to be shown
+ null,
+ // The ranking score for this target (0.0-1.0); the system will omit items with low
+ // scores when there are too many Direct Share items.
+ 0.5f,
+ // The name of the component to be launched if this target is chosen.
+ shareShortcut.getTargetComponent().clone(),
+ // The extra values here will be merged into the Intent when this target is chosen.
+ extras);
+ }
+
private String convertServiceName(String packageName, String serviceName) {
if (TextUtils.isEmpty(serviceName)) {
return null;
@@ -765,9 +881,8 @@ public class ChooserActivity extends ResolverActivity {
}
}
}
- final Icon icon = chooserTarget.getIcon();
- // TODO do this in the background
- mDisplayIcon = icon != null ? icon.loadDrawable(ChooserActivity.this) : null;
+ // TODO(b/121287224): do this in the background thread, and only for selected targets
+ mDisplayIcon = getChooserTargetIconDrawable(chooserTarget);
if (sourceInfo != null) {
mBackupResolveInfo = null;
@@ -791,6 +906,39 @@ public class ChooserActivity extends ResolverActivity {
mModifiedScore = other.mModifiedScore;
}
+ /**
+ * Since ShortcutInfos are returned by ShortcutManager, we can cache the shortcuts and skip
+ * the call to LauncherApps#getShortcuts(ShortcutQuery).
+ */
+ // TODO(121287224): Refactor code to apply the suggestion above
+ private Drawable getChooserTargetIconDrawable(ChooserTarget target) {
+ final Icon icon = target.getIcon();
+ if (icon != null) {
+ return icon.loadDrawable(ChooserActivity.this);
+ }
+ if (!USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS) {
+ return null;
+ }
+
+ Bundle extras = target.getIntentExtras();
+ if (extras == null || !extras.containsKey(Intent.EXTRA_SHORTCUT_ID)) {
+ return null;
+ }
+ CharSequence shortcutId = extras.getCharSequence(Intent.EXTRA_SHORTCUT_ID);
+ LauncherApps launcherApps = (LauncherApps) getSystemService(
+ Context.LAUNCHER_APPS_SERVICE);
+ final LauncherApps.ShortcutQuery q = new LauncherApps.ShortcutQuery();
+ q.setPackage(target.getComponentName().getPackageName());
+ q.setShortcutIds(Arrays.asList(shortcutId.toString()));
+ q.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC);
+ final List<ShortcutInfo> shortcuts = launcherApps.getShortcuts(q, getUser());
+ if (shortcuts != null && shortcuts.size() > 0) {
+ return launcherApps.getShortcutIconDrawable(shortcuts.get(0), 0);
+ }
+
+ return null;
+ }
+
public float getModifiedScore() {
return mModifiedScore;
}
@@ -1030,8 +1178,15 @@ public class ChooserActivity extends ResolverActivity {
mTargetsNeedPruning = true;
}
}
- if (DEBUG) Log.d(TAG, "List built querying services");
- queryTargetServices(this);
+ if (USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS) {
+ if (DEBUG) {
+ Log.d(TAG, "querying direct share targets from ShortcutManager");
+ }
+ queryDirectShareTargets(this);
+ } else {
+ if (DEBUG) Log.d(TAG, "List built querying services");
+ queryTargetServices(this);
+ }
}
@Override
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index e59bee42c21c..c4ab91f8b429 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -17,8 +17,10 @@
package com.android.internal.app;
import android.app.AppOpsManager;
+import android.app.AppOpsManager;
import android.content.pm.ParceledListSlice;
import android.os.Bundle;
+import android.os.RemoteCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsActiveCallback;
import com.android.internal.app.IAppOpsNotedCallback;
@@ -42,10 +44,15 @@ interface IAppOpsService {
int checkPackage(int uid, String packageName);
List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);
List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
- ParceledListSlice getAllHistoricalPackagesOps(in String[] ops,
- long beginTimeMillis, long endTimeMillis);
- AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int uid, String packageName,
- in String[] ops, long beginTimeMillis, long endTimeMillis);
+ void getHistoricalOps(int uid, String packageName, in String[] ops, long beginTimeMillis,
+ long endTimeMillis, in RemoteCallback callback);
+ void getHistoricalOpsFromDiskRaw(int uid, String packageName, in String[] ops,
+ long beginTimeMillis, long endTimeMillis, in RemoteCallback callback);
+ void offsetHistory(long duration);
+ void setHistoryParameters(int mode, long baseSnapshotInterval, int compressionStep);
+ void addHistoricalOps(in AppOpsManager.HistoricalOps ops);
+ void resetHistoryParameters();
+ void clearHistory();
List<AppOpsManager.PackageOps> getUidOps(int uid, in int[] ops);
void setUidMode(int code, int uid, int mode);
void setMode(int code, int uid, String packageName, int mode);
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index 96d3baf7cf0b..f61a03bccb78 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -22,44 +22,36 @@ import android.app.usage.UsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
-import android.content.SharedPreferences;
-import android.content.ServiceConnection;
import android.metrics.LogMaker;
-import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.os.storage.StorageManager;
import android.os.UserHandle;
-import android.service.resolver.IResolverRankerService;
import android.service.resolver.IResolverRankerResult;
+import android.service.resolver.IResolverRankerService;
import android.service.resolver.ResolverRankerService;
import android.service.resolver.ResolverTarget;
-import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
+
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import java.io.File;
-import java.lang.InterruptedException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* Ranks and compares packages based on usage stats.
@@ -90,6 +82,8 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
private final Collator mCollator;
private final boolean mHttp;
+ // can be null if mHttp == false or current user has no default browser package
+ private final String mDefaultBrowserPackageName;
private final PackageManager mPm;
private final UsageStatsManager mUsm;
private final Map<String, UsageStats> mStats;
@@ -184,6 +178,10 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
getContentAnnotations(intent);
mAction = intent.getAction();
mRankerServiceName = new ComponentName(mContext, this.getClass());
+
+ mDefaultBrowserPackageName = mHttp
+ ? mPm.getDefaultBrowserPackageNameAsUser(UserHandle.myUserId())
+ : null;
}
// get annotations of content from intent.
@@ -312,7 +310,14 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
if (mHttp) {
// Special case: we want filters that match URI paths/schemes to be
// ordered before others. This is for the case when opening URIs,
- // to make native apps go above browsers.
+ // to make native apps go above browsers - except for 1 even more special case
+ // which is the default browser, as we want that to go above them all.
+ if (isDefaultBrowser(lhs)) {
+ return -1;
+ }
+ if (isDefaultBrowser(rhs)) {
+ return 1;
+ }
final boolean lhsSpecific = ResolverActivity.isSpecificUriMatch(lhs.match);
final boolean rhsSpecific = ResolverActivity.isSpecificUriMatch(rhs.match);
if (lhsSpecific != rhsSpecific) {
@@ -419,6 +424,20 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
}
}
+ private boolean isDefaultBrowser(ResolveInfo ri) {
+ // It makes sense to prefer the default browser
+ // only if the targeted user is the current user
+ if (ri.targetUserId != UserHandle.USER_CURRENT) {
+ return false;
+ }
+
+ if (ri.activityInfo.packageName != null
+ && ri.activityInfo.packageName.equals(mDefaultBrowserPackageName)) {
+ return true;
+ }
+ return false;
+ }
+
// records metrics for evaluation.
private void logMetrics(int selectedPos) {
if (mRankerServiceName != null) {
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 498de53b65e9..70935d4ac076 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -16,7 +16,7 @@
package com.android.internal.app;
-import static android.content.res.ResourceId.ID_NULL;
+import static android.content.res.Resources.ID_NULL;
import android.Manifest;
import android.app.AlertDialog;
diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java
index 9b9b77196a53..8e88c510ec31 100644
--- a/core/java/com/android/internal/app/procstats/ProcessStats.java
+++ b/core/java/com/android/internal/app/procstats/ProcessStats.java
@@ -23,6 +23,7 @@ import android.os.Parcelable;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.service.procstats.ProcessStatsAvailablePagesProto;
import android.service.procstats.ProcessStatsPackageProto;
import android.service.procstats.ProcessStatsSectionProto;
import android.text.format.DateFormat;
@@ -178,7 +179,7 @@ public final class ProcessStats implements Parcelable {
{"proc", "pkg-proc", "pkg-svc", "pkg-asc", "pkg-all", "all"};
// Current version of the parcel format.
- private static final int PARCEL_VERSION = 35;
+ private static final int PARCEL_VERSION = 36;
// In-memory Parcel magic number, used to detect attempts to unmarshall bad data
private static final int MAGIC = 0x50535454;
@@ -237,10 +238,11 @@ public final class ProcessStats implements Parcelable {
ArrayList<String> mIndexToCommonString;
private static final Pattern sPageTypeRegex = Pattern.compile(
- "^Node\\s+(\\d+),.*. type\\s+(\\w+)\\s+([\\s\\d]+?)\\s*$");
- private final ArrayList<Integer> mPageTypeZones = new ArrayList<Integer>();
- private final ArrayList<String> mPageTypeLabels = new ArrayList<String>();
- private final ArrayList<int[]> mPageTypeSizes = new ArrayList<int[]>();
+ "^Node\\s+(\\d+),.* zone\\s+(\\w+),.* type\\s+(\\w+)\\s+([\\s\\d]+?)\\s*$");
+ private final ArrayList<Integer> mPageTypeNodes = new ArrayList<>();
+ private final ArrayList<String> mPageTypeZones = new ArrayList<>();
+ private final ArrayList<String> mPageTypeLabels = new ArrayList<>();
+ private final ArrayList<int[]> mPageTypeSizes = new ArrayList<>();
public ProcessStats(boolean running) {
mRunning = running;
@@ -621,6 +623,7 @@ public final class ProcessStats implements Parcelable {
try {
reader = new BufferedReader(new FileReader("/proc/pagetypeinfo"));
final Matcher matcher = sPageTypeRegex.matcher("");
+ mPageTypeNodes.clear();
mPageTypeZones.clear();
mPageTypeLabels.clear();
mPageTypeSizes.clear();
@@ -631,16 +634,18 @@ public final class ProcessStats implements Parcelable {
}
matcher.reset(line);
if (matcher.matches()) {
- final Integer zone = Integer.valueOf(matcher.group(1), 10);
- if (zone == null) {
+ final Integer node = Integer.valueOf(matcher.group(1), 10);
+ if (node == null) {
continue;
}
- mPageTypeZones.add(zone);
- mPageTypeLabels.add(matcher.group(2));
- mPageTypeSizes.add(splitAndParseNumbers(matcher.group(3)));
+ mPageTypeNodes.add(node);
+ mPageTypeZones.add(matcher.group(2));
+ mPageTypeLabels.add(matcher.group(3));
+ mPageTypeSizes.add(splitAndParseNumbers(matcher.group(4)));
}
}
} catch (IOException ex) {
+ mPageTypeNodes.clear();
mPageTypeZones.clear();
mPageTypeLabels.clear();
mPageTypeSizes.clear();
@@ -935,7 +940,8 @@ public final class ProcessStats implements Parcelable {
final int NPAGETYPES = mPageTypeLabels.size();
out.writeInt(NPAGETYPES);
for (int i=0; i<NPAGETYPES; i++) {
- out.writeInt(mPageTypeZones.get(i));
+ out.writeInt(mPageTypeNodes.get(i));
+ out.writeString(mPageTypeZones.get(i));
out.writeString(mPageTypeLabels.get(i));
out.writeIntArray(mPageTypeSizes.get(i));
}
@@ -1244,6 +1250,8 @@ public final class ProcessStats implements Parcelable {
// Fragmentation info
final int NPAGETYPES = in.readInt();
+ mPageTypeNodes.clear();
+ mPageTypeNodes.ensureCapacity(NPAGETYPES);
mPageTypeZones.clear();
mPageTypeZones.ensureCapacity(NPAGETYPES);
mPageTypeLabels.clear();
@@ -1251,7 +1259,8 @@ public final class ProcessStats implements Parcelable {
mPageTypeSizes.clear();
mPageTypeSizes.ensureCapacity(NPAGETYPES);
for (int i=0; i<NPAGETYPES; i++) {
- mPageTypeZones.add(in.readInt());
+ mPageTypeNodes.add(in.readInt());
+ mPageTypeZones.add(in.readString());
mPageTypeLabels.add(in.readString());
mPageTypeSizes.add(in.createIntArray());
}
@@ -1764,7 +1773,8 @@ public final class ProcessStats implements Parcelable {
pw.println("Available pages by page size:");
final int NPAGETYPES = mPageTypeLabels.size();
for (int i=0; i<NPAGETYPES; i++) {
- pw.format("Zone %3d %14s ", mPageTypeZones.get(i), mPageTypeLabels.get(i));
+ pw.format("Node %3d Zone %7s %14s ", mPageTypeNodes.get(i), mPageTypeZones.get(i),
+ mPageTypeLabels.get(i));
final int[] sizes = mPageTypeSizes.get(i);
final int N = sizes == null ? 0 : sizes.length;
for (int j=0; j<N; j++) {
@@ -2095,6 +2105,9 @@ public final class ProcessStats implements Parcelable {
pw.print(",");
pw.print(mPageTypeZones.get(i));
pw.print(",");
+ // Wasn't included in original output.
+ //pw.print(mPageTypeNodes.get(i));
+ //pw.print(",");
final int[] sizes = mPageTypeSizes.get(i);
final int N = sizes == null ? 0 : sizes.length;
for (int j=0; j<N; j++) {
@@ -2135,6 +2148,20 @@ public final class ProcessStats implements Parcelable {
proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_PARTIAL);
}
+ final int NPAGETYPES = mPageTypeLabels.size();
+ for (int i = 0; i < NPAGETYPES; i++) {
+ final long token = proto.start(ProcessStatsSectionProto.AVAILABLE_PAGES);
+ proto.write(ProcessStatsAvailablePagesProto.NODE, mPageTypeNodes.get(i));
+ proto.write(ProcessStatsAvailablePagesProto.ZONE, mPageTypeZones.get(i));
+ proto.write(ProcessStatsAvailablePagesProto.LABEL, mPageTypeLabels.get(i));
+ final int[] sizes = mPageTypeSizes.get(i);
+ final int N = sizes == null ? 0 : sizes.length;
+ for (int j = 0; j < N; j++) {
+ proto.write(ProcessStatsAvailablePagesProto.PAGES_PER_ORDER, sizes[j]);
+ }
+ proto.end(token);
+ }
+
final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
if ((section & REPORT_PROC_STATS) != 0) {
for (int ip = 0; ip < procMap.size(); ip++) {
diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
index 2995a8f43268..7a00a51647f6 100644
--- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -58,6 +58,15 @@ public class AmbientDisplayConfiguration {
return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup);
}
+ public boolean tapGestureEnabled(int user) {
+ return boolSettingDefaultOn(Settings.Secure.DOZE_TAP_SCREEN_GESTURE, user)
+ && tapSensorAvailable();
+ }
+
+ public boolean tapSensorAvailable() {
+ return !TextUtils.isEmpty(tapSensorType());
+ }
+
public boolean doubleTapGestureEnabled(int user) {
return boolSettingDefaultOn(Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, user)
&& doubleTapSensorAvailable();
@@ -86,6 +95,10 @@ public class AmbientDisplayConfiguration {
return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType);
}
+ public String tapSensorType() {
+ return mContext.getResources().getString(R.string.config_dozeTapSensorType);
+ }
+
public String longPressSensorType() {
return mContext.getResources().getString(R.string.config_dozeLongPressSensorType);
}
diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java
index c94c64a879b3..72c67d7ddc08 100644
--- a/core/java/com/android/internal/infra/AbstractRemoteService.java
+++ b/core/java/com/android/internal/infra/AbstractRemoteService.java
@@ -39,6 +39,7 @@ import com.android.internal.annotations.GuardedBy;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
/**
* Base class representing a remote service.
@@ -93,6 +94,9 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
// Used just for debugging purposes (on dump)
private long mNextUnbind;
+ /** Requests that have been scheduled, but that are not finished yet */
+ private final ArrayList<PendingRequest<S, I>> mUnfinishedRequests = new ArrayList<>();
+
/**
* Callback called when the service dies.
*
@@ -135,6 +139,14 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
return mDestroyed;
}
+ /**
+ * Gets the name of the service.
+ */
+ @NonNull
+ public final ComponentName getComponentName() {
+ return mComponentName;
+ }
+
private void handleOnConnectedStateChangedInternal(boolean connected) {
if (connected) {
handlePendingRequests();
@@ -209,6 +221,7 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
}
mService = null;
mServiceDied = true;
+ cancelScheduledUnbind();
@SuppressWarnings("unchecked") // TODO(b/117779333): fix this warning
final S castService = (S) this;
mVultureCallback.onServiceDied(castService);
@@ -229,6 +242,8 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
.append(mComponentName.flattenToString()).println();
pw.append(prefix).append(tab).append("destroyed=")
.append(String.valueOf(mDestroyed)).println();
+ pw.append(prefix).append(tab).append("numUnfinishedRequests=")
+ .append(String.valueOf(mUnfinishedRequests.size()));
final boolean bound = handleIsBound();
pw.append(prefix).append(tab).append("bound=")
.append(String.valueOf(bound));
@@ -257,23 +272,37 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
* <p>This request must be responded by the service somehow (typically using a callback),
* othewise it will trigger a {@link PendingRequest#onTimeout(AbstractRemoteService)} if the
* service doesn't respond.
- *
- * <p><b>NOTE: </b>this request is responsible for calling {@link #scheduleUnbind()}.
*/
protected void scheduleRequest(@NonNull PendingRequest<S, I> pendingRequest) {
- cancelScheduledUnbind();
mHandler.sendMessage(obtainMessage(
AbstractRemoteService::handlePendingRequest, this, pendingRequest));
}
/**
+ * Marks a pendingRequest as finished.
+ *
+ * @param finshedRequest The request that is finished
+ */
+ void finishRequest(@NonNull PendingRequest<S, I> finshedRequest) {
+ mHandler.sendMessage(
+ obtainMessage(AbstractRemoteService::handleFinishRequest, this, finshedRequest));
+ }
+
+ private void handleFinishRequest(@NonNull PendingRequest<S, I> finshedRequest) {
+ mUnfinishedRequests.remove(finshedRequest);
+
+ if (mUnfinishedRequests.isEmpty()) {
+ scheduleUnbind();
+ }
+ }
+
+ /**
* Schedules an async request.
*
* <p>This request is not expecting a callback from the service, hence it's represented by
* a simple {@link Runnable}.
*/
protected void scheduleAsyncRequest(@NonNull AsyncRequest<I> request) {
- scheduleUnbind();
// TODO(b/117779333): fix generics below
@SuppressWarnings({"unchecked", "rawtypes"})
final MyAsyncPendingRequest<S, I> asyncRequest = new MyAsyncPendingRequest(this, request);
@@ -341,6 +370,10 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
handleEnsureBound();
} else {
if (mVerbose) Slog.v(mTag, "handlePendingRequest(): " + pendingRequest);
+
+ mUnfinishedRequests.add(pendingRequest);
+ cancelScheduledUnbind();
+
pendingRequest.run();
if (pendingRequest.isFinal()) {
mCompleted = true;
@@ -504,6 +537,12 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
}
mCompleted = true;
}
+
+ S service = mWeakService.get();
+ if (service != null) {
+ service.finishRequest(this);
+ }
+
mServiceHandler.removeCallbacks(mTimeoutTrigger);
return true;
}
diff --git a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
index 2671781a60c1..d0272e08b53a 100644
--- a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
+++ b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
@@ -38,6 +38,5 @@ interface IInputMethodPrivilegedOperations {
boolean switchToPreviousInputMethod();
boolean switchToNextInputMethod(boolean onlyCurrentIme);
boolean shouldOfferSwitchingToNextInputMethod();
-
- oneway void notifyUserActionAsync();
+ void notifyUserAction();
}
diff --git a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
index cdb986ab1a78..7600dc9be447 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
@@ -332,16 +332,16 @@ public final class InputMethodPrivilegedOperations {
}
/**
- * Calls {@link IInputMethodPrivilegedOperations#notifyUserActionAsync()}
+ * Calls {@link IInputMethodPrivilegedOperations#notifyUserAction()}
*/
@AnyThread
- public void notifyUserActionAsync() {
+ public void notifyUserAction() {
final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull();
if (ops == null) {
return;
}
try {
- ops.notifyUserActionAsync();
+ ops.notifyUserAction();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java
index 0a7cff6856e5..9bacf9b6c2b9 100644
--- a/core/java/com/android/internal/net/NetworkStatsFactory.java
+++ b/core/java/com/android/internal/net/NetworkStatsFactory.java
@@ -20,6 +20,7 @@ import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
+
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
import android.annotation.Nullable;
@@ -33,10 +34,8 @@ import com.android.internal.util.ProcFileReader;
import libcore.io.IoUtils;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileReader;
import java.io.IOException;
import java.net.ProtocolException;
import java.util.Arrays;
@@ -127,7 +126,7 @@ public class NetworkStatsFactory {
}
public NetworkStatsFactory() {
- this(new File("/proc/"), new File("/sys/fs/bpf/traffic_uid_stats_map").exists());
+ this(new File("/proc/"), new File("/sys/fs/bpf/map_netd_app_uid_stats_map").exists());
}
@VisibleForTesting
diff --git a/core/java/com/android/internal/os/AppZygoteInit.java b/core/java/com/android/internal/os/AppZygoteInit.java
new file mode 100644
index 000000000000..afe6dade62ac
--- /dev/null
+++ b/core/java/com/android/internal/os/AppZygoteInit.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 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.internal.os;
+
+import android.app.LoadedApk;
+import android.content.pm.ApplicationInfo;
+import android.net.LocalSocket;
+import android.util.Log;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Startup class for an Application zygote process.
+ *
+ * See {@link ZygoteInit} for generic zygote startup documentation.
+ *
+ * @hide
+ */
+class AppZygoteInit {
+ public static final String TAG = "AppZygoteInit";
+
+ private static ZygoteServer sServer;
+
+ private static class AppZygoteServer extends ZygoteServer {
+ @Override
+ protected ZygoteConnection createNewConnection(LocalSocket socket, String abiList)
+ throws IOException {
+ return new AppZygoteConnection(socket, abiList);
+ }
+ }
+
+ private static class AppZygoteConnection extends ZygoteConnection {
+ AppZygoteConnection(LocalSocket socket, String abiList) throws IOException {
+ super(socket, abiList);
+ }
+
+ @Override
+ protected void preload() {
+ // Nothing to preload by default.
+ }
+
+ @Override
+ protected boolean isPreloadComplete() {
+ // App zygotes don't preload any classes or resources or defaults, all of their
+ // preloading is package specific.
+ return true;
+ }
+
+ @Override
+ protected boolean canPreloadApp() {
+ return true;
+ }
+
+ @Override
+ protected void handlePreloadApp(ApplicationInfo appInfo) {
+ Log.i(TAG, "Beginning application preload for " + appInfo.packageName);
+ LoadedApk loadedApk = new LoadedApk(null, appInfo, null, null, false, true, false);
+ ClassLoader loader = loadedApk.getClassLoader();
+ Class<?> cl;
+ Method m;
+ try {
+ cl = Class.forName(appInfo.packageName + ".ZygotePreload", true, loader);
+ m = cl.getMethod("doPreload");
+ m.setAccessible(true);
+ m.invoke(null);
+ } catch (ClassNotFoundException e) {
+ // Don't treat this as an error since an app may not want to do any preloads
+ Log.w(TAG, "No ZygotePreload class found for " + appInfo.packageName);
+ } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+ Log.e(TAG, "AppZygote application preload failed for "
+ + appInfo.packageName, e);
+ }
+ try {
+ DataOutputStream socketOut = getSocketOutputStream();
+ socketOut.writeInt(loader != null ? 1 : 0);
+ } catch (IOException e) {
+ throw new IllegalStateException("Error writing to command socket", e);
+ }
+
+ Log.i(TAG, "Application preload done");
+ }
+ }
+
+ public static void main(String[] argv) {
+ AppZygoteServer server = new AppZygoteServer();
+ ChildZygoteInit.runZygoteServer(server, argv);
+ }
+}
diff --git a/core/java/com/android/internal/os/AtomicDirectory.java b/core/java/com/android/internal/os/AtomicDirectory.java
new file mode 100644
index 000000000000..f24d12e0c3af
--- /dev/null
+++ b/core/java/com/android/internal/os/AtomicDirectory.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2018 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.internal.os;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.FileUtils;
+import android.util.ArrayMap;
+
+import com.android.internal.util.Preconditions;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * Helper class for performing atomic operations on a directory, by creating a
+ * backup directory until a write has successfully completed.
+ * <p>
+ * Atomic directory guarantees directory integrity by ensuring that a directory has
+ * been completely written and sync'd to disk before removing its backup.
+ * As long as the backup directory exists, the original directory is considered
+ * to be invalid (leftover from a previous attempt to write).
+ * <p>
+ * Atomic directory does not confer any file locking semantics. Do not use this
+ * class when the directory may be accessed or modified concurrently
+ * by multiple threads or processes. The caller is responsible for ensuring
+ * appropriate mutual exclusion invariants whenever it accesses the directory.
+ * <p>
+ * To ensure atomicity you must always use this class to interact with the
+ * backing directory when checking existence, making changes, and deleting.
+ */
+public final class AtomicDirectory {
+ private final @NonNull ArrayMap<File, FileOutputStream> mOpenFiles = new ArrayMap<>();
+ private final @NonNull File mBaseDirectory;
+ private final @NonNull File mBackupDirectory;
+
+ private int mBaseDirectoryFd = -1;
+ private int mBackupDirectoryFd = -1;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param baseDirectory The base directory to treat atomically.
+ */
+ public AtomicDirectory(@NonNull File baseDirectory) {
+ Preconditions.checkNotNull(baseDirectory, "baseDirectory cannot be null");
+ mBaseDirectory = baseDirectory;
+ mBackupDirectory = new File(baseDirectory.getPath() + "_bak");
+ }
+
+ /**
+ * Gets the backup directory if present. This could be useful if you are
+ * writing new state to the dir but need to access the last persisted state
+ * at the same time. This means that this call is useful in between
+ * {@link #startWrite()} and {@link #finishWrite()} or {@link #failWrite()}.
+ * You should not modify the content returned by this method.
+ *
+ * @see #startRead()
+ */
+ public @Nullable File getBackupDirectory() {
+ return mBackupDirectory;
+ }
+
+ /**
+ * Starts reading this directory. After calling this method you should
+ * not make any changes to its contents.
+ *
+ * @throws IOException If an error occurs.
+ *
+ * @see #finishRead()
+ * @see #startWrite()
+ */
+ public @NonNull File startRead() throws IOException {
+ restore();
+ return getOrCreateBaseDirectory();
+ }
+
+ /**
+ * Finishes reading this directory.
+ *
+ * @see #startRead()
+ * @see #startWrite()
+ */
+ public void finishRead() {
+ mBaseDirectoryFd = -1;
+ mBackupDirectoryFd = -1;
+ }
+
+ /**
+ * Starts editing this directory. After calling this method you should
+ * add content to the directory only via the APIs on this class. To open a
+ * file for writing in this directory you should use {@link #openWrite(File)}
+ * and to close the file {@link #closeWrite(FileOutputStream)}. Once all
+ * content has been written and all files closed you should commit via a
+ * call to {@link #finishWrite()} or discard via a call to {@link #failWrite()}.
+ *
+ * @throws IOException If an error occurs.
+ *
+ * @see #startRead()
+ * @see #openWrite(File)
+ * @see #finishWrite()
+ * @see #failWrite()
+ */
+ public @NonNull File startWrite() throws IOException {
+ backup();
+ return getOrCreateBaseDirectory();
+ }
+
+ /**
+ * Opens a file in this directory for writing.
+ *
+ * @param file The file to open. Must be a file in the base directory.
+ * @return An input stream for reading.
+ *
+ * @throws IOException If an I/O error occurs.
+ *
+ * @see #closeWrite(FileOutputStream)
+ */
+ public @NonNull FileOutputStream openWrite(@NonNull File file) throws IOException {
+ if (file.isDirectory() || !file.getParentFile().equals(getOrCreateBaseDirectory())) {
+ throw new IllegalArgumentException("Must be a file in " + getOrCreateBaseDirectory());
+ }
+ final FileOutputStream destination = new FileOutputStream(file);
+ if (mOpenFiles.put(file, destination) != null) {
+ throw new IllegalArgumentException("Already open file" + file.getCanonicalPath());
+ }
+ return destination;
+ }
+
+ /**
+ * Closes a previously opened file.
+ *
+ * @param destination The stream to the file returned by {@link #openWrite(File)}.
+ *
+ * @see #openWrite(File)
+ */
+ public void closeWrite(@NonNull FileOutputStream destination) {
+ final int indexOfValue = mOpenFiles.indexOfValue(destination);
+ if (mOpenFiles.removeAt(indexOfValue) == null) {
+ throw new IllegalArgumentException("Unknown file stream " + destination);
+ }
+ FileUtils.sync(destination);
+ try {
+ destination.close();
+ } catch (IOException ignored) {}
+ }
+
+ public void failWrite(@NonNull FileOutputStream destination) {
+ final int indexOfValue = mOpenFiles.indexOfValue(destination);
+ if (indexOfValue >= 0) {
+ mOpenFiles.removeAt(indexOfValue);
+ }
+ }
+
+ /**
+ * Finishes the edit and commits all changes.
+ *
+ * @see #startWrite()
+ *
+ * @throws IllegalStateException is some files are not closed.
+ */
+ public void finishWrite() {
+ throwIfSomeFilesOpen();
+ fsyncDirectoryFd(mBaseDirectoryFd);
+ deleteDirectory(mBackupDirectory);
+ fsyncDirectoryFd(mBackupDirectoryFd);
+ mBaseDirectoryFd = -1;
+ mBackupDirectoryFd = -1;
+ }
+
+ /**
+ * Finishes the edit and discards all changes.
+ *
+ * @see #startWrite()
+ */
+ public void failWrite() {
+ throwIfSomeFilesOpen();
+ try{
+ restore();
+ } catch (IOException ignored) {}
+ mBaseDirectoryFd = -1;
+ mBackupDirectoryFd = -1;
+ }
+
+ /**
+ * @return Whether this directory exists.
+ */
+ public boolean exists() {
+ return mBaseDirectory.exists() || mBackupDirectory.exists();
+ }
+
+ /**
+ * Deletes this directory.
+ */
+ public void delete() {
+ if (mBaseDirectory.exists()) {
+ deleteDirectory(mBaseDirectory);
+ fsyncDirectoryFd(mBaseDirectoryFd);
+ }
+ if (mBackupDirectory.exists()) {
+ deleteDirectory(mBackupDirectory);
+ fsyncDirectoryFd(mBackupDirectoryFd);
+ }
+ }
+
+ private @NonNull File getOrCreateBaseDirectory() throws IOException {
+ if (!mBaseDirectory.exists()) {
+ if (!mBaseDirectory.mkdirs()) {
+ throw new IOException("Couldn't create directory " + mBaseDirectory);
+ }
+ FileUtils.setPermissions(mBaseDirectory.getPath(),
+ FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH,
+ -1, -1);
+ }
+ if (mBaseDirectoryFd < 0) {
+ mBaseDirectoryFd = getDirectoryFd(mBaseDirectory.getCanonicalPath());
+ }
+ return mBaseDirectory;
+ }
+
+ private void throwIfSomeFilesOpen() {
+ if (!mOpenFiles.isEmpty()) {
+ throw new IllegalStateException("Unclosed files: "
+ + Arrays.toString(mOpenFiles.keySet().toArray()));
+ }
+ }
+
+ private void backup() throws IOException {
+ if (!mBaseDirectory.exists()) {
+ return;
+ }
+ if (mBaseDirectoryFd < 0) {
+ mBaseDirectoryFd = getDirectoryFd(mBaseDirectory.getCanonicalPath());
+ }
+ if (mBackupDirectory.exists()) {
+ deleteDirectory(mBackupDirectory);
+ }
+ if (!mBaseDirectory.renameTo(mBackupDirectory)) {
+ throw new IOException("Couldn't backup " + mBaseDirectory
+ + " to " + mBackupDirectory);
+ }
+ mBackupDirectoryFd = mBaseDirectoryFd;
+ mBaseDirectoryFd = -1;
+ fsyncDirectoryFd(mBackupDirectoryFd);
+ }
+
+ private void restore() throws IOException {
+ if (!mBackupDirectory.exists()) {
+ return;
+ }
+ if (mBackupDirectoryFd == -1) {
+ mBackupDirectoryFd = getDirectoryFd(mBackupDirectory.getCanonicalPath());
+ }
+ if (mBaseDirectory.exists()) {
+ deleteDirectory(mBaseDirectory);
+ }
+ if (!mBackupDirectory.renameTo(mBaseDirectory)) {
+ throw new IOException("Couldn't restore " + mBackupDirectory
+ + " to " + mBaseDirectory);
+ }
+ mBaseDirectoryFd = mBackupDirectoryFd;
+ mBackupDirectoryFd = -1;
+ fsyncDirectoryFd(mBaseDirectoryFd);
+ }
+
+ private static void deleteDirectory(@NonNull File file) {
+ final File[] children = file.listFiles();
+ if (children != null) {
+ for (File child : children) {
+ deleteDirectory(child);
+ }
+ }
+ file.delete();
+ }
+
+ private static native int getDirectoryFd(String path);
+ private static native void fsyncDirectoryFd(int fd);
+}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index cc8da5c6317f..17cc6afcd8f0 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -30,6 +30,7 @@ import android.content.IntentFilter;
import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
+import android.net.INetworkStatsService;
import android.net.NetworkStats;
import android.net.Uri;
import android.net.wifi.WifiActivityEnergyInfo;
@@ -86,7 +87,6 @@ import android.view.Display;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.location.gnssmetrics.GnssMetrics;
-import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
@@ -337,6 +337,25 @@ public class BatteryStatsImpl extends BatteryStats {
private final PlatformIdleStateCallback mPlatformIdleStateCallback;
+ private final Runnable mDeferSetCharging = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (BatteryStatsImpl.this) {
+ if (mOnBattery) {
+ // if the device gets unplugged in the time between this runnable being
+ // executed and the lock being taken, we don't want to set charging state
+ return;
+ }
+ boolean changed = setChargingLocked(true);
+ if (changed) {
+ final long uptime = mClocks.uptimeMillis();
+ final long elapsedRealtime = mClocks.elapsedRealtime();
+ addHistoryRecordLocked(elapsedRealtime, uptime);
+ }
+ }
+ }
+ };
+
/**
* This handler is running on {@link BackgroundThread}.
*/
@@ -11012,7 +11031,6 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
private final Pools.Pool<NetworkStats> mNetworkStatsPool = new Pools.SynchronizedPool<>(6);
private final Object mWifiNetworkLock = new Object();
@@ -11034,11 +11052,16 @@ public class BatteryStatsImpl extends BatteryStats {
private NetworkStats readNetworkStatsLocked(String[] ifaces) {
try {
if (!ArrayUtils.isEmpty(ifaces)) {
- return mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
- NetworkStats.TAG_NONE, mNetworkStatsPool.acquire());
+ INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
+ ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
+ if (statsService != null) {
+ return statsService.getDetailedUidStats(ifaces);
+ } else {
+ Slog.e(TAG, "Failed to get networkStatsService ");
+ }
}
- } catch (IOException e) {
- Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces));
+ } catch (RemoteException e) {
+ Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces) + e);
}
return null;
}
@@ -12336,6 +12359,14 @@ public class BatteryStatsImpl extends BatteryStats {
}
boolean setChargingLocked(boolean charging) {
+ // if the device is no longer charging, remove the callback
+ // if the device is now charging, it means that this is either called
+ // 1. directly when level >= 90
+ // 2. or from within the runnable that we deferred
+ // For 1. if we have an existing callback, remove it, since we will immediatelly send a
+ // ACTION_CHARGING
+ // For 2. we remove existing callback so we don't send multiple ACTION_CHARGING
+ mHandler.removeCallbacks(mDeferSetCharging);
if (mCharging != charging) {
mCharging = charging;
if (charging) {
@@ -12674,12 +12705,23 @@ public class BatteryStatsImpl extends BatteryStats {
// charging even if it happens to go down a level.
changed |= setChargingLocked(true);
mLastChargeStepLevel = level;
- } if (!mCharging) {
+ }
+ if (!mCharging) {
if (mLastChargeStepLevel < level) {
- // We have not reporting that we are charging, but the level has now
- // gone up, so consider the state to be charging.
- changed |= setChargingLocked(true);
+ // We have not reported that we are charging, but the level has gone up,
+ // but we would like to not have tons of activity from charging-constraint
+ // jobs, so instead of reporting ACTION_CHARGING immediately, we defer it.
mLastChargeStepLevel = level;
+ if (!mHandler.hasCallbacks(mDeferSetCharging)) {
+ mHandler.postDelayed(
+ mDeferSetCharging,
+ mConstants.BATTERY_CHARGED_DELAY_MS);
+ }
+ } else if (mLastChargeStepLevel > level) {
+ // if we had deferred a runnable due to charge level increasing, but then
+ // later the charge level drops (could be due to thermal issues), we don't
+ // want to trigger the deferred runnable, so remove it here
+ mHandler.removeCallbacks(mDeferSetCharging);
}
} else {
if (mLastChargeStepLevel > level) {
@@ -13296,6 +13338,8 @@ public class BatteryStatsImpl extends BatteryStats {
= "battery_level_collection_delay_ms";
public static final String KEY_MAX_HISTORY_FILES = "max_history_files";
public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb";
+ public static final String KEY_BATTERY_CHARGED_DELAY_MS =
+ "battery_charged_delay_ms";
private static final boolean DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE = false;
private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true;
@@ -13308,6 +13352,7 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int DEFAULT_MAX_HISTORY_BUFFER_KB = 128; /*Kilo Bytes*/
private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64;
private static final int DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB = 64; /*Kilo Bytes*/
+ private static final int DEFAULT_BATTERY_CHARGED_DELAY_MS = 900000; /* 15 min */
public boolean TRACK_CPU_TIMES_BY_PROC_STATE = DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE;
public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME;
@@ -13320,6 +13365,7 @@ public class BatteryStatsImpl extends BatteryStats {
= DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS;
public int MAX_HISTORY_FILES;
public int MAX_HISTORY_BUFFER; /*Bytes*/
+ public int BATTERY_CHARGED_DELAY_MS = DEFAULT_BATTERY_CHARGED_DELAY_MS;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -13388,6 +13434,9 @@ public class BatteryStatsImpl extends BatteryStats {
DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB
: DEFAULT_MAX_HISTORY_BUFFER_KB)
* 1024;
+ BATTERY_CHARGED_DELAY_MS = mParser.getInt(
+ KEY_BATTERY_CHARGED_DELAY_MS,
+ DEFAULT_BATTERY_CHARGED_DELAY_MS);
}
}
@@ -13445,6 +13494,8 @@ public class BatteryStatsImpl extends BatteryStats {
pw.println(MAX_HISTORY_FILES);
pw.print(KEY_MAX_HISTORY_BUFFER_KB); pw.print("=");
pw.println(MAX_HISTORY_BUFFER/1024);
+ pw.print(KEY_BATTERY_CHARGED_DELAY_MS); pw.print("=");
+ pw.println(BATTERY_CHARGED_DELAY_MS);
}
}
diff --git a/core/java/com/android/internal/os/ChildZygoteInit.java b/core/java/com/android/internal/os/ChildZygoteInit.java
new file mode 100644
index 000000000000..a052a3b3ab6a
--- /dev/null
+++ b/core/java/com/android/internal/os/ChildZygoteInit.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 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.internal.os;
+
+import android.os.Process;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.Log;
+
+/**
+ * ChildZygoteInit is shared by both the Application and WebView zygote to initialize
+ * and run a (child) Zygote server.
+ *
+ * @hide
+ */
+public class ChildZygoteInit {
+ private static final String TAG = "ChildZygoteInit";
+
+ static String parseSocketNameFromArgs(String[] argv) {
+ for (String arg : argv) {
+ if (arg.startsWith(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG)) {
+ return arg.substring(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG.length());
+ }
+ }
+
+ return null;
+ }
+
+ static String parseAbiListFromArgs(String[] argv) {
+ for (String arg : argv) {
+ if (arg.startsWith(Zygote.CHILD_ZYGOTE_ABI_LIST_ARG)) {
+ return arg.substring(Zygote.CHILD_ZYGOTE_ABI_LIST_ARG.length());
+ }
+ }
+
+ return null;
+ }
+
+ static int parseIntFromArg(String[] argv, String desiredArg) {
+ int value = -1;
+ for (String arg : argv) {
+ if (arg.startsWith(desiredArg)) {
+ String valueStr = arg.substring(arg.indexOf('=') + 1);
+ try {
+ value = Integer.parseInt(valueStr);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("Invalid int argument: "
+ + valueStr, e);
+ }
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Starts a ZygoteServer and listens for requests
+ *
+ * @param server An instance of a ZygoteServer to listen on
+ * @param args Passed in arguments for this ZygoteServer
+ */
+ static void runZygoteServer(ZygoteServer server, String[] args) {
+ String socketName = parseSocketNameFromArgs(args);
+ if (socketName == null) {
+ throw new NullPointerException("No socketName specified");
+ }
+
+ String abiList = parseAbiListFromArgs(args);
+ if (abiList == null) {
+ throw new NullPointerException("No abiList specified");
+ }
+
+ try {
+ Os.prctl(OsConstants.PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ } catch (ErrnoException ex) {
+ throw new RuntimeException("Failed to set PR_SET_NO_NEW_PRIVS", ex);
+ }
+
+ int uidGidMin = parseIntFromArg(args, Zygote.CHILD_ZYGOTE_UID_RANGE_START);
+ int uidGidMax = parseIntFromArg(args, Zygote.CHILD_ZYGOTE_UID_RANGE_END);
+ if (uidGidMin == -1 || uidGidMax == -1) {
+ throw new RuntimeException("Couldn't parse UID range start/end");
+ }
+ if (uidGidMin > uidGidMax) {
+ throw new RuntimeException("Passed in UID range is invalid, min > max.");
+ }
+
+ // Verify the UIDs are in the isolated UID range, as that's the only thing that we should
+ // be forking right now
+ if (!Process.isIsolated(uidGidMin) || !Process.isIsolated(uidGidMax)) {
+ throw new RuntimeException("Passed in UID range does not map to isolated processes.");
+ }
+
+ /**
+ * Install a seccomp filter that ensure this Zygote can only setuid()/setgid()
+ * to the passed in range.
+ */
+ Zygote.nativeInstallSeccompUidGidFilter(uidGidMin, uidGidMax);
+
+ final Runnable caller;
+ try {
+ server.registerServerSocketAtAbstractName(socketName);
+
+ // Add the abstract socket to the FD whitelist so that the native zygote code
+ // can properly detach it after forking.
+ Zygote.nativeAllowFileAcrossFork("ABSTRACT/" + socketName);
+
+ // The select loop returns early in the child process after a fork and
+ // loops forever in the zygote.
+ caller = server.runSelectLoop(abiList);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Fatal exception:", e);
+ throw e;
+ } finally {
+ server.closeServerSocket();
+ }
+
+ // We're in the child process and have exited the select loop. Proceed to execute the
+ // command.
+ if (caller != null) {
+ caller.run();
+ }
+ }
+}
diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java
index a319d83b077d..b529bbe51e93 100644
--- a/core/java/com/android/internal/os/RoSystemProperties.java
+++ b/core/java/com/android/internal/os/RoSystemProperties.java
@@ -30,6 +30,7 @@ public class RoSystemProperties {
public static final String CONTROL_PRIVAPP_PERMISSIONS =
SystemProperties.get("ro.control_privapp_permissions");
+ // ------ ro.hdmi.* -------- //
/**
* Property to indicate if a CEC audio device should forward volume keys when system audio
* mode is off.
@@ -38,6 +39,14 @@ public class RoSystemProperties {
SystemProperties.getBoolean(
"ro.hdmi.cec_audio_device_forward_volume_keys_system_audio_mode_off", false);
+ /**
+ * Property to indicate if the current device is a cec switch device.
+ *
+ * <p> Default is false.
+ */
+ public static final String PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH =
+ "ro.hdmi.property_is_device_hdmi_cec_switch";
+
// ------ ro.config.* -------- //
public static final boolean CONFIG_AVOID_GFX_ACCEL =
SystemProperties.getBoolean("ro.config.avoid_gfx_accel", false);
diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java
index 9f2434e97d7a..0b329d70f7af 100644
--- a/core/java/com/android/internal/os/WebViewZygoteInit.java
+++ b/core/java/com/android/internal/os/WebViewZygoteInit.java
@@ -18,11 +18,7 @@ package com.android.internal.os;
import android.app.ApplicationLoaders;
import android.net.LocalSocket;
-import android.net.LocalServerSocket;
import android.os.Build;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebViewFactory;
@@ -44,8 +40,6 @@ import java.lang.reflect.Method;
class WebViewZygoteInit {
public static final String TAG = "WebViewZygoteInit";
- private static ZygoteServer sServer;
-
private static class WebViewZygoteServer extends ZygoteServer {
@Override
protected ZygoteConnection createNewConnection(LocalSocket socket, String abiList)
@@ -127,48 +121,7 @@ class WebViewZygoteInit {
public static void main(String argv[]) {
Log.i(TAG, "Starting WebViewZygoteInit");
-
- String socketName = null;
- for (String arg : argv) {
- Log.i(TAG, arg);
- if (arg.startsWith(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG)) {
- socketName = arg.substring(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG.length());
- }
- }
- if (socketName == null) {
- throw new RuntimeException("No " + Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG + " specified");
- }
-
- try {
- Os.prctl(OsConstants.PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
- } catch (ErrnoException ex) {
- throw new RuntimeException("Failed to set PR_SET_NO_NEW_PRIVS", ex);
- }
-
- sServer = new WebViewZygoteServer();
-
- final Runnable caller;
- try {
- sServer.registerServerSocketAtAbstractName(socketName);
-
- // Add the abstract socket to the FD whitelist so that the native zygote code
- // can properly detach it after forking.
- Zygote.nativeAllowFileAcrossFork("ABSTRACT/" + socketName);
-
- // The select loop returns early in the child process after a fork and
- // loops forever in the zygote.
- caller = sServer.runSelectLoop(TextUtils.join(",", Build.SUPPORTED_ABIS));
- } catch (RuntimeException e) {
- Log.e(TAG, "Fatal exception:", e);
- throw e;
- } finally {
- sServer.closeServerSocket();
- }
-
- // We're in the child process and have exited the select loop. Proceed to execute the
- // command.
- if (caller != null) {
- caller.run();
- }
+ WebViewZygoteServer server = new WebViewZygoteServer();
+ ChildZygoteInit.runZygoteServer(server, argv);
}
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 65b9fad97d89..705bae4f24ef 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -82,6 +82,11 @@ public final class Zygote {
/** Read-write external storage should be mounted. */
public static final int MOUNT_EXTERNAL_WRITE = IVold.REMOUNT_MODE_WRITE;
/**
+ * Mount mode for apps that are already installed on the device before the isolated_storage
+ * feature is enabled.
+ */
+ public static final int MOUNT_EXTERNAL_LEGACY = IVold.REMOUNT_MODE_LEGACY;
+ /**
* Mount mode for package installers which should give them access to
* all obb dirs in addition to their package sandboxes
*/
@@ -98,6 +103,26 @@ public final class Zygote {
*/
public static final String CHILD_ZYGOTE_SOCKET_NAME_ARG = "--zygote-socket=";
+ /**
+ * An extraArg passed when a zygote process is forking a child-zygote, specifying the
+ * requested ABI for the child Zygote.
+ */
+ public static final String CHILD_ZYGOTE_ABI_LIST_ARG = "--abi-list=";
+
+ /**
+ * An extraArg passed when a zygote process is forking a child-zygote, specifying the
+ * start of the UID range the children of the Zygote may setuid()/setgid() to. This
+ * will be enforced with a seccomp filter.
+ */
+ public static final String CHILD_ZYGOTE_UID_RANGE_START = "--uid-range-start=";
+
+ /**
+ * An extraArg passed when a zygote process is forking a child-zygote, specifying the
+ * end of the UID range the children of the Zygote may setuid()/setgid() to. This
+ * will be enforced with a seccomp filter.
+ */
+ public static final String CHILD_ZYGOTE_UID_RANGE_END = "--uid-range-end=";
+
private Zygote() {}
/** Called for some security initialization before any fork. */
@@ -216,6 +241,13 @@ public final class Zygote {
native protected static void nativeAllowFileAcrossFork(String path);
/**
+ * Installs a seccomp filter that limits setresuid()/setresgid() to the passed-in range
+ * @param uidGidMin The smallest allowed uid/gid
+ * @param uidGidMax The largest allowed uid/gid
+ */
+ native protected static void nativeInstallSeccompUidGidFilter(int uidGidMin, int uidGidMax);
+
+ /**
* Zygote unmount storage space on initializing.
* This method is called once.
*/
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index f182c4d447df..ced798cb6445 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -27,9 +27,11 @@ import static com.android.internal.os.ZygoteConnectionConstants.CONNECTION_TIMEO
import static com.android.internal.os.ZygoteConnectionConstants.MAX_ZYGOTE_ARGC;
import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
+import android.content.pm.ApplicationInfo;
import android.net.Credentials;
import android.net.LocalSocket;
import android.os.FactoryTest;
+import android.os.Parcel;
import android.os.Process;
import android.os.SystemProperties;
import android.os.Trace;
@@ -52,6 +54,7 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Base64;
/**
* A connection that can make spawn requests.
@@ -168,6 +171,21 @@ class ZygoteConnection {
return null;
}
+ if (canPreloadApp() && parsedArgs.mPreloadApp != null) {
+ byte[] rawParcelData = Base64.getDecoder().decode(parsedArgs.mPreloadApp);
+ Parcel appInfoParcel = Parcel.obtain();
+ appInfoParcel.unmarshall(rawParcelData, 0, rawParcelData.length);
+ appInfoParcel.setDataPosition(0);
+ ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(appInfoParcel);
+ appInfoParcel.recycle();
+ if (appInfo != null) {
+ handlePreloadApp(appInfo);
+ } else {
+ throw new IllegalArgumentException("Failed to deserialize --preload-app");
+ }
+ return null;
+ }
+
if (parsedArgs.apiBlacklistExemptions != null) {
handleApiBlacklistExemptions(parsedArgs.apiBlacklistExemptions);
return null;
@@ -341,7 +359,15 @@ class ZygoteConnection {
protected void handlePreloadPackage(String packagePath, String libsPath, String libFileName,
String cacheKey) {
- throw new RuntimeException("Zyogte does not support package preloading");
+ throw new RuntimeException("Zygote does not support package preloading");
+ }
+
+ protected boolean canPreloadApp() {
+ return false;
+ }
+
+ protected void handlePreloadApp(ApplicationInfo aInfo) {
+ throw new RuntimeException("Zygote does not support app preloading");
}
/**
@@ -467,6 +493,12 @@ class ZygoteConnection {
String preloadPackage;
/**
+ * A Base64 string representing a serialize ApplicationInfo Parcel,
+ when using --preload-app.
+ */
+ String mPreloadApp;
+
+ /**
* The native library path of the package to preload, when using --preload-package.
*/
String preloadPackageLibs;
@@ -656,8 +688,10 @@ class ZygoteConnection {
mountExternal = Zygote.MOUNT_EXTERNAL_WRITE;
} else if (arg.equals("--mount-external-full")) {
mountExternal = Zygote.MOUNT_EXTERNAL_FULL;
- } else if (arg.equals("--mount-external-installer")) {
+ } else if (arg.equals("--mount-external-installer")) {
mountExternal = Zygote.MOUNT_EXTERNAL_INSTALLER;
+ } else if (arg.equals("--mount-external-legacy")) {
+ mountExternal = Zygote.MOUNT_EXTERNAL_LEGACY;
} else if (arg.equals("--query-abi-list")) {
abiListQuery = true;
} else if (arg.equals("--get-pid")) {
@@ -666,6 +700,8 @@ class ZygoteConnection {
instructionSet = arg.substring(arg.indexOf('=') + 1);
} else if (arg.startsWith("--app-data-dir=")) {
appDataDir = arg.substring(arg.indexOf('=') + 1);
+ } else if (arg.equals("--preload-app")) {
+ mPreloadApp = args[++curArg];
} else if (arg.equals("--preload-package")) {
preloadPackage = args[++curArg];
preloadPackageLibs = args[++curArg];
@@ -714,6 +750,11 @@ class ZygoteConnection {
throw new IllegalArgumentException(
"Unexpected arguments after --preload-package.");
}
+ } else if (mPreloadApp != null) {
+ if (args.length - curArg > 0) {
+ throw new IllegalArgumentException(
+ "Unexpected arguments after --preload-app.");
+ }
} else if (expectRuntimeArgs) {
if (!seenRuntimeArgs) {
throw new IllegalArgumentException("Unexpected argument : " + args[curArg]);
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index e2c23de70c00..cdaf33f03528 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -232,7 +232,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
// This is the caption view for the window, containing the caption and window control
// buttons. The visibility of this decor depends on the workspace and the window type.
// If the window type does not require such a view, this member might be null.
- DecorCaptionView mDecorCaptionView;
+ private DecorCaptionView mDecorCaptionView;
private boolean mWindowResizeCallbacksAdded = false;
private Drawable.Callback mLastBackgroundDrawableCb = null;
@@ -977,6 +977,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
@Override
public void onWindowSystemUiVisibilityChanged(int visible) {
updateColorViews(null /* insets */, true /* animate */);
+ updateDecorCaptionStatus(getResources().getConfiguration());
}
@Override
@@ -1855,8 +1856,27 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- final boolean displayWindowDecor =
- newConfig.windowConfiguration.hasWindowDecorCaption();
+ updateDecorCaptionStatus(newConfig);
+
+ updateAvailableWidth();
+ initializeElevation();
+ }
+
+ /**
+ * Determines if the workspace is entirely covered by the window.
+ * @return {@code true} when the window is filling the entire screen/workspace.
+ **/
+ private boolean isFillingScreen(Configuration config) {
+ final boolean isFullscreen = config.windowConfiguration.getWindowingMode()
+ == WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+ return isFullscreen && (0 != ((getWindowSystemUiVisibility() | getSystemUiVisibility())
+ & (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_LOW_PROFILE)));
+ }
+
+ private void updateDecorCaptionStatus(Configuration config) {
+ final boolean displayWindowDecor = config.windowConfiguration.hasWindowDecorCaption()
+ && !isFillingScreen(config);
if (mDecorCaptionView == null && displayWindowDecor) {
// Configuration now requires a caption.
final LayoutInflater inflater = mWindow.getLayoutInflater();
@@ -1875,9 +1895,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
mDecorCaptionView.onConfigurationChanged(displayWindowDecor);
enableCaption(displayWindowDecor);
}
-
- updateAvailableWidth();
- initializeElevation();
}
void onResourcesLoaded(LayoutInflater inflater, int layoutResource) {
diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java
index 100c6ee6763b..adf7692adc56 100644
--- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java
+++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java
@@ -16,10 +16,10 @@
package com.android.internal.policy;
-import com.android.internal.R;
-
import android.content.res.Resources;
+import com.android.internal.R;
+
/**
* Utility functions for screen decorations used by both window manager and System UI.
*/
@@ -31,15 +31,19 @@ public class ScreenDecorationsUtils {
* scaling, this means that we don't have to reload them on config changes.
*/
public static float getWindowCornerRadius(Resources resources) {
+ if (!supportsRoundedCornersOnWindows(resources)) {
+ return 0f;
+ }
+
// Radius that should be used in case top or bottom aren't defined.
float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius);
float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top);
- if (topRadius == 0) {
+ if (topRadius == 0f) {
topRadius = defaultRadius;
}
float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom);
- if (bottomRadius == 0) {
+ if (bottomRadius == 0f) {
bottomRadius = defaultRadius;
}
@@ -47,4 +51,11 @@ public class ScreenDecorationsUtils {
// completely cover the display.
return Math.min(topRadius, bottomRadius);
}
+
+ /**
+ * If live rounded corners are supported on windows.
+ */
+ public static boolean supportsRoundedCornersOnWindows(Resources resources) {
+ return resources.getBoolean(R.bool.config_supportsRoundedCornersOnWindows);
+ }
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 53b56f2e937a..6a28059d3fd0 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -153,13 +153,11 @@ oneway interface IStatusBar
void showBiometricDialog(in Bundle bundle, IBiometricServiceReceiverInternal receiver, int type,
boolean requireConfirmation, int userId);
// Used to hide the dialog when a biometric is authenticated
- void onBiometricAuthenticated();
+ void onBiometricAuthenticated(boolean authenticated);
// Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
void onBiometricHelp(String message);
// Used to set a message - the dialog will dismiss after a certain amount of time
void onBiometricError(String error);
// Used to hide the biometric dialog when the AuthenticationClient is stopped
void hideBiometricDialog();
- // Used to request the "try again" button for authentications which requireConfirmation=true
- void showBiometricTryAgain();
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 9087dd219d97..197e873a18bc 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -97,13 +97,11 @@ interface IStatusBarService
void showBiometricDialog(in Bundle bundle, IBiometricServiceReceiverInternal receiver, int type,
boolean requireConfirmation, int userId);
// Used to hide the dialog when a biometric is authenticated
- void onBiometricAuthenticated();
+ void onBiometricAuthenticated(boolean authenticated);
// Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
void onBiometricHelp(String message);
// Used to set a message - the dialog will dismiss after a certain amount of time
void onBiometricError(String error);
// Used to hide the biometric dialog when the AuthenticationClient is stopped
void hideBiometricDialog();
- // Used to request the "try again" button for authentications which requireConfirmation=true
- void showBiometricTryAgain();
}
diff --git a/core/java/com/android/internal/textservice/ITextServicesManager.aidl b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
index 20f2aa06cf1e..8022949d1728 100644
--- a/core/java/com/android/internal/textservice/ITextServicesManager.aidl
+++ b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
@@ -29,12 +29,13 @@ import android.view.textservice.SpellCheckerSubtype;
* @hide
*/
interface ITextServicesManager {
- SpellCheckerInfo getCurrentSpellChecker(String locale);
- SpellCheckerSubtype getCurrentSpellCheckerSubtype(boolean allowImplicitlySelectedSubtype);
- oneway void getSpellCheckerService(String sciId, in String locale,
+ SpellCheckerInfo getCurrentSpellChecker(int userId, String locale);
+ SpellCheckerSubtype getCurrentSpellCheckerSubtype(int userId,
+ boolean allowImplicitlySelectedSubtype);
+ oneway void getSpellCheckerService(int userId, String sciId, in String locale,
in ITextServicesSessionListener tsListener,
in ISpellCheckerSessionListener scListener, in Bundle bundle);
- oneway void finishSpellCheckerService(in ISpellCheckerSessionListener listener);
- boolean isSpellCheckerEnabled();
- SpellCheckerInfo[] getEnabledSpellCheckers();
+ oneway void finishSpellCheckerService(int userId, in ISpellCheckerSessionListener listener);
+ boolean isSpellCheckerEnabled(int userId);
+ SpellCheckerInfo[] getEnabledSpellCheckers(int userId);
}
diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java
index 470533f2d002..605df040da59 100644
--- a/core/java/com/android/internal/util/CollectionUtils.java
+++ b/core/java/com/android/internal/util/CollectionUtils.java
@@ -330,4 +330,18 @@ public class CollectionUtils {
public static @NonNull <T> List<T> defeatNullable(@Nullable List<T> val) {
return (val != null) ? val : Collections.emptyList();
}
+
+ /**
+ * @return the first element if not empty/null, null otherwise
+ */
+ public static @Nullable <T> T firstOrNull(@Nullable List<T> cur) {
+ return isEmpty(cur) ? null : cur.get(0);
+ }
+
+ /**
+ * @return list of single given element if it's not null, empty list otherwise
+ */
+ public static @NonNull <T> List<T> singletonOrEmpty(@Nullable T item) {
+ return item == null ? Collections.emptyList() : Collections.singletonList(item);
+ }
}
diff --git a/core/java/com/android/internal/util/ContrastColorUtil.java b/core/java/com/android/internal/util/ContrastColorUtil.java
index a403c068c7c4..e0ba317f5eaa 100644
--- a/core/java/com/android/internal/util/ContrastColorUtil.java
+++ b/core/java/com/android/internal/util/ContrastColorUtil.java
@@ -586,7 +586,7 @@ public class ContrastColorUtil {
*
* @param color the base color to use
* @param amount the amount from 1 to 100 how much to modify the color
- * @return the now color that was modified
+ * @return the new color that was modified
*/
public static int getShiftedColor(int color, int amount) {
final double[] result = ColorUtilsFromCompat.getTempDouble3Array();
@@ -599,6 +599,19 @@ public class ContrastColorUtil {
return ColorUtilsFromCompat.LABToColor(result[0], result[1], result[2]);
}
+ /**
+ * Blends the provided color with white to create a muted version.
+ *
+ * @param color the color to mute
+ * @param alpha the amount from 0 to 1 to set the alpha component of the white scrim
+ * @return the new color that was modified
+ */
+ public static int getMutedColor(int color, float alpha) {
+ int whiteScrim = ColorUtilsFromCompat.setAlphaComponent(
+ Color.WHITE, (int) (255 * alpha));
+ return compositeColors(whiteScrim, color);
+ }
+
private static boolean shouldUseDark(int backgroundColor, boolean defaultBackgroundIsDark) {
if (backgroundColor == Notification.COLOR_DEFAULT) {
return !defaultBackgroundIsDark;
@@ -675,6 +688,18 @@ public class ContrastColorUtil {
}
/**
+ * Set the alpha component of {@code color} to be {@code alpha}.
+ */
+ @ColorInt
+ public static int setAlphaComponent(@ColorInt int color,
+ @IntRange(from = 0x0, to = 0xFF) int alpha) {
+ if (alpha < 0 || alpha > 255) {
+ throw new IllegalArgumentException("alpha must be between 0 and 255.");
+ }
+ return (color & 0x00ffffff) | (alpha << 24);
+ }
+
+ /**
* Returns the luminance of a color as a float between {@code 0.0} and {@code 1.0}.
* <p>Defined as the Y component in the XYZ representation of {@code color}.</p>
*/
diff --git a/core/java/com/android/internal/util/SyncResultReceiver.java b/core/java/com/android/internal/util/SyncResultReceiver.java
new file mode 100644
index 000000000000..9a346ac93a8d
--- /dev/null
+++ b/core/java/com/android/internal/util/SyncResultReceiver.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2018 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.internal.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.os.RemoteException;
+
+import com.android.internal.os.IResultReceiver;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A {@code IResultReceiver} implementation that can be used to make "sync" Binder calls by blocking
+ * until it receives a result
+ *
+ * @hide
+ */
+public final class SyncResultReceiver extends IResultReceiver.Stub {
+
+ private static final String EXTRA = "EXTRA";
+
+ private final CountDownLatch mLatch = new CountDownLatch(1);
+ private final int mTimeoutMs;
+ private int mResult;
+ private Bundle mBundle;
+
+ /**
+ * Default constructor.
+ *
+ * @param timeoutMs how long to block waiting for {@link IResultReceiver} callbacks.
+ */
+ public SyncResultReceiver(int timeoutMs) {
+ mTimeoutMs = timeoutMs;
+ }
+
+ private void waitResult() throws TimeoutException {
+ try {
+ if (!mLatch.await(mTimeoutMs, TimeUnit.MILLISECONDS)) {
+ throw new TimeoutException("Not called in " + mTimeoutMs + "ms");
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new TimeoutException("Interrupted");
+ }
+ }
+
+ /**
+ * Gets the result from an operation that returns an {@code int}.
+ */
+ public int getIntResult() throws TimeoutException {
+ waitResult();
+ return mResult;
+ }
+
+ /**
+ * Gets the result from an operation that returns an {@code String}.
+ */
+ @Nullable
+ public String getStringResult() throws TimeoutException {
+ waitResult();
+ return mBundle == null ? null : mBundle.getString(EXTRA);
+ }
+
+ /**
+ * Gets the result from an operation that returns a {@code String[]}.
+ */
+ @Nullable
+ public String[] getStringArrayResult() throws TimeoutException {
+ waitResult();
+ return mBundle == null ? null : mBundle.getStringArray(EXTRA);
+ }
+
+ /**
+ * Gets the result from an operation that returns a {@code Parcelable}.
+ */
+ @Nullable
+ public <P extends Parcelable> P getParcelableResult() throws TimeoutException {
+ waitResult();
+ return mBundle == null ? null : mBundle.getParcelable(EXTRA);
+ }
+
+ @Override
+ public void send(int resultCode, Bundle resultData) {
+ mResult = resultCode;
+ mBundle = resultData;
+ mLatch.countDown();
+ }
+
+ /**
+ * Creates a bundle for a {@code String} value so it can be retrieved by
+ * {@link #getStringResult()}.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable String value) {
+ final Bundle bundle = new Bundle();
+ bundle.putString(EXTRA, value);
+ return bundle;
+ }
+
+ /**
+ * Creates a bundle for a {@code String[]} value so it can be retrieved by
+ * {@link #getStringArrayResult()}.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable String[] value) {
+ final Bundle bundle = new Bundle();
+ bundle.putStringArray(EXTRA, value);
+ return bundle;
+ }
+
+ /**
+ * Creates a bundle for a {@code Parcelable} value so it can be retrieved by
+ * {@link #getParcelableResult()}.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable Parcelable value) {
+ final Bundle bundle = new Bundle();
+ bundle.putParcelable(EXTRA, value);
+ return bundle;
+ }
+
+ /** @hide */
+ public static final class TimeoutException extends RemoteException {
+ private TimeoutException(String msg) {
+ super(msg);
+ }
+ }
+}
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 70f4ed2d529e..356d178cc4eb 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -17,7 +17,6 @@
package com.android.internal.view;
import android.os.ResultReceiver;
-import android.text.style.SuggestionSpan;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.EditorInfo;
@@ -65,8 +64,6 @@ interface IInputMethodManager {
int displayId);
void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId);
boolean isInputMethodPickerShownForTest();
- void registerSuggestionSpansForNotification(in SuggestionSpan[] spans);
- boolean notifySuggestionPicked(in SuggestionSpan span, String originalString, int index);
InputMethodSubtype getCurrentInputMethodSubtype();
boolean setCurrentInputMethodSubtype(in InputMethodSubtype subtype);
void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes);
diff --git a/core/java/com/android/internal/view/InputBindResult.java b/core/java/com/android/internal/view/InputBindResult.java
index 901cfe3602b1..9fe49b4b045d 100644
--- a/core/java/com/android/internal/view/InputBindResult.java
+++ b/core/java/com/android/internal/view/InputBindResult.java
@@ -127,8 +127,10 @@ public final class InputBindResult implements Parcelable {
*/
int ERROR_IME_NOT_CONNECTED = 8;
/**
- * Indicates that the caller is not the foreground user (or does not have
- * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission).
+ * Indicates that the caller is not the foreground user, does not have
+ * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission, or the user
+ * specified in {@link android.view.inputmethod.EditorInfo#targetInputMethodUser} is not
+ * running.
*/
int ERROR_INVALID_USER = 9;
/**
diff --git a/core/java/com/android/internal/widget/DecorCaptionView.java b/core/java/com/android/internal/widget/DecorCaptionView.java
index b41911360358..21558d3d3518 100644
--- a/core/java/com/android/internal/widget/DecorCaptionView.java
+++ b/core/java/com/android/internal/widget/DecorCaptionView.java
@@ -319,23 +319,12 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
mOwner.notifyRestrictedCaptionAreaCallback(mMaximize.getLeft(), mMaximize.getTop(),
mClose.getRight(), mClose.getBottom());
}
- /**
- * Determine if the workspace is entirely covered by the window.
- * @return Returns true when the window is filling the entire screen/workspace.
- **/
- private boolean isFillingScreen() {
- return (0 != ((getWindowSystemUiVisibility() | getSystemUiVisibility()) &
- (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
- View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_LOW_PROFILE)));
- }
/**
* Updates the visibility of the caption.
**/
private void updateCaptionVisibility() {
- // Don't show the caption if the window has e.g. entered full screen.
- boolean invisible = isFillingScreen() || !mShow;
- mCaption.setVisibility(invisible ? GONE : VISIBLE);
+ mCaption.setVisibility(mShow ? VISIBLE : GONE);
mCaption.setOnTouchListener(this);
}
diff --git a/core/java/com/android/internal/widget/EditableInputConnection.java b/core/java/com/android/internal/widget/EditableInputConnection.java
index 7f7528dd3de0..78688edb3f88 100644
--- a/core/java/com/android/internal/widget/EditableInputConnection.java
+++ b/core/java/com/android/internal/widget/EditableInputConnection.java
@@ -18,9 +18,7 @@ package com.android.internal.widget;
import android.os.Bundle;
import android.text.Editable;
-import android.text.Spanned;
import android.text.method.KeyListener;
-import android.text.style.SuggestionSpan;
import android.util.Log;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
@@ -173,12 +171,6 @@ public class EditableInputConnection extends BaseInputConnection {
if (mTextView == null) {
return super.commitText(text, newCursorPosition);
}
- if (text instanceof Spanned) {
- Spanned spanned = ((Spanned) text);
- SuggestionSpan[] spans = spanned.getSpans(0, text.length(), SuggestionSpan.class);
- mIMM.registerSuggestionSpansForNotification(spans);
- }
-
mTextView.resetErrorChangedFlag();
boolean success = super.commitText(text, newCursorPosition);
mTextView.hideErrorIfUnchanged();
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index f7fe87e6e9b5..e84768d0fc52 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -62,7 +62,9 @@ interface ILockSettings {
in byte[] recoveryServiceCertFile, in byte[] recoveryServiceSigFile);
KeyChainSnapshot getKeyChainSnapshot();
String generateKey(String alias);
+ String generateKeyWithMetadata(String alias, in byte[] metadata);
String importKey(String alias, in byte[] keyBytes);
+ String importKeyWithMetadata(String alias, in byte[] keyBytes, in byte[] metadata);
String getKey(String alias);
void removeKey(String alias);
void setSnapshotCreatedPendingIntent(in PendingIntent intent);
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 20331fa2e545..bc3d4e97a97c 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -42,7 +42,7 @@ cc_library_shared {
"com_google_android_gles_jni_EGLImpl.cpp",
"com_google_android_gles_jni_GLImpl.cpp", // TODO: .arm
"android_app_Activity.cpp",
- "android_app_ActivityThread.cpp",
+ "android_app_ActivityThread.cpp",
"android_app_NativeActivity.cpp",
"android_app_admin_SecurityLog.cpp",
"android_opengl_EGL14.cpp",
@@ -186,7 +186,6 @@ cc_library_shared {
"android_hardware_UsbDevice.cpp",
"android_hardware_UsbDeviceConnection.cpp",
"android_hardware_UsbRequest.cpp",
- "android_hardware_location_ActivityRecognitionHardware.cpp",
"android_util_FileObserver.cpp",
"android/opengl/poly_clip.cpp", // TODO: .arm
"android/opengl/util.cpp",
@@ -203,6 +202,7 @@ cc_library_shared {
"android_animation_PropertyValuesHolder.cpp",
"android_security_Scrypt.cpp",
"com_android_internal_net_NetworkStatsFactory.cpp",
+ "com_android_internal_os_AtomicDirectory.cpp",
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
"com_android_internal_os_Zygote.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index cb65cc188622..b4237a1d66b5 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -101,7 +101,6 @@ extern int register_android_hardware_SoundTrigger(JNIEnv *env);
extern int register_android_hardware_UsbDevice(JNIEnv *env);
extern int register_android_hardware_UsbDeviceConnection(JNIEnv *env);
extern int register_android_hardware_UsbRequest(JNIEnv *env);
-extern int register_android_hardware_location_ActivityRecognitionHardware(JNIEnv* env);
extern int register_android_media_AudioEffectDescriptor(JNIEnv *env);
extern int register_android_media_AudioRecord(JNIEnv *env);
@@ -219,6 +218,7 @@ extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
extern int register_android_security_Scrypt(JNIEnv *env);
extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env);
+extern int register_com_android_internal_os_AtomicDirectory(JNIEnv *env);
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
extern int register_com_android_internal_os_Zygote(JNIEnv *env);
@@ -1459,7 +1459,6 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_hardware_UsbDevice),
REG_JNI(register_android_hardware_UsbDeviceConnection),
REG_JNI(register_android_hardware_UsbRequest),
- REG_JNI(register_android_hardware_location_ActivityRecognitionHardware),
REG_JNI(register_android_media_AudioEffectDescriptor),
REG_JNI(register_android_media_AudioSystem),
REG_JNI(register_android_media_AudioRecord),
@@ -1498,6 +1497,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_security_Scrypt),
REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
REG_JNI(register_com_android_internal_net_NetworkStatsFactory),
+ REG_JNI(register_com_android_internal_os_AtomicDirectory),
REG_JNI(register_com_android_internal_os_FuseAppLoop),
REG_JNI(register_com_android_internal_app_ActivityTrigger),
};
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index eb7338a7ce58..876bd4fbfce4 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -8,7 +8,6 @@
#include "SkImageInfo.h"
#include "SkColor.h"
#include "SkColorSpace.h"
-#include "SkMatrix44.h"
#include "GraphicsJNI.h"
#include "SkStream.h"
@@ -356,8 +355,8 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
if (xyzD50 == nullptr || transferParameters == nullptr) {
colorSpace = SkColorSpace::MakeSRGB();
} else {
- SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
- SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
+ skcms_TransferFunction p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
+ skcms_Matrix3x3 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
colorSpace = SkColorSpace::MakeRGB(p, xyzMatrix);
}
@@ -549,8 +548,7 @@ static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle,
if (skbitmap.colorType() == kRGBA_F16_SkColorType) {
// Convert to P3 before encoding. This matches SkAndroidCodec::computeOutputColorSpace
// for wide gamuts.
- auto cs = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
- SkColorSpace::kDCIP3_D65_Gamut);
+ auto cs = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
auto info = skbitmap.info().makeColorType(kRGBA_8888_SkColorType)
.makeColorSpace(std::move(cs));
SkBitmap p3;
@@ -568,11 +566,34 @@ static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle,
return SkEncodeImage(strm.get(), skbitmap, fm, quality) ? JNI_TRUE : JNI_FALSE;
}
+static inline void bitmapErase(SkBitmap bitmap, const SkColor4f& color,
+ const sk_sp<SkColorSpace>& colorSpace) {
+ SkPaint p;
+ p.setColor4f(color, colorSpace.get());
+ p.setBlendMode(SkBlendMode::kSrc);
+ SkCanvas canvas(bitmap);
+ canvas.drawPaint(p);
+}
+
static void Bitmap_erase(JNIEnv* env, jobject, jlong bitmapHandle, jint color) {
LocalScopedBitmap bitmap(bitmapHandle);
SkBitmap skBitmap;
bitmap->getSkBitmap(&skBitmap);
- skBitmap.eraseColor(color);
+ bitmapErase(skBitmap, SkColor4f::FromColor(color), SkColorSpace::MakeSRGB());
+}
+
+static void Bitmap_eraseLong(JNIEnv* env, jobject, jlong bitmapHandle, jobject jColorSpace,
+ jfloat r, jfloat g, jfloat b, jfloat a) {
+ sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(env, jColorSpace);
+ if (GraphicsJNI::hasException(env)) {
+ return;
+ }
+
+ LocalScopedBitmap bitmap(bitmapHandle);
+ SkBitmap skBitmap;
+ bitmap->getSkBitmap(&skBitmap);
+ SkColor4f color = SkColor4f{r, g, b, a};
+ bitmapErase(skBitmap, color, cs);
}
static jint Bitmap_rowBytes(JNIEnv* env, jobject, jlong bitmapHandle) {
@@ -717,7 +738,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
#endif
// Dup the file descriptor so we can keep a reference to it after the Parcel
// is disposed.
- int dupFd = dup(blob.fd());
+ int dupFd = fcntl(blob.fd(), F_DUPFD_CLOEXEC, 0);
if (dupFd < 0) {
ALOGE("Error allocating dup fd. Error:%d", errno);
blob.release();
@@ -910,32 +931,32 @@ static jboolean Bitmap_getColorSpace(JNIEnv* env, jobject, jlong bitmapHandle,
SkColorSpace* colorSpace = bitmapHolder->info().colorSpace();
if (colorSpace == nullptr) return JNI_FALSE;
- SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor);
+ skcms_Matrix3x3 xyzMatrix;
if (!colorSpace->toXYZD50(&xyzMatrix)) return JNI_FALSE;
jfloat* xyz = env->GetFloatArrayElements(xyzArray, NULL);
- xyz[0] = xyzMatrix.getFloat(0, 0);
- xyz[1] = xyzMatrix.getFloat(1, 0);
- xyz[2] = xyzMatrix.getFloat(2, 0);
- xyz[3] = xyzMatrix.getFloat(0, 1);
- xyz[4] = xyzMatrix.getFloat(1, 1);
- xyz[5] = xyzMatrix.getFloat(2, 1);
- xyz[6] = xyzMatrix.getFloat(0, 2);
- xyz[7] = xyzMatrix.getFloat(1, 2);
- xyz[8] = xyzMatrix.getFloat(2, 2);
+ xyz[0] = xyzMatrix.vals[0][0];
+ xyz[1] = xyzMatrix.vals[1][0];
+ xyz[2] = xyzMatrix.vals[2][0];
+ xyz[3] = xyzMatrix.vals[0][1];
+ xyz[4] = xyzMatrix.vals[1][1];
+ xyz[5] = xyzMatrix.vals[2][1];
+ xyz[6] = xyzMatrix.vals[0][2];
+ xyz[7] = xyzMatrix.vals[1][2];
+ xyz[8] = xyzMatrix.vals[2][2];
env->ReleaseFloatArrayElements(xyzArray, xyz, 0);
- SkColorSpaceTransferFn transferParams;
+ skcms_TransferFunction transferParams;
if (!colorSpace->isNumericalTransferFn(&transferParams)) return JNI_FALSE;
jfloat* params = env->GetFloatArrayElements(paramsArray, NULL);
- params[0] = transferParams.fA;
- params[1] = transferParams.fB;
- params[2] = transferParams.fC;
- params[3] = transferParams.fD;
- params[4] = transferParams.fE;
- params[5] = transferParams.fF;
- params[6] = transferParams.fG;
+ params[0] = transferParams.a;
+ params[1] = transferParams.b;
+ params[2] = transferParams.c;
+ params[3] = transferParams.d;
+ params[4] = transferParams.e;
+ params[5] = transferParams.f;
+ params[6] = transferParams.g;
env->ReleaseFloatArrayElements(paramsArray, params, 0);
return JNI_TRUE;
@@ -1121,8 +1142,8 @@ static jobject Bitmap_createHardwareBitmap(JNIEnv* env, jobject, jobject graphic
static jobject Bitmap_wrapHardwareBufferBitmap(JNIEnv* env, jobject, jobject hardwareBuffer,
jfloatArray xyzD50, jobject transferParameters) {
- SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
- SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
+ skcms_TransferFunction p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
+ skcms_Matrix3x3 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(p, xyzMatrix);
AHardwareBuffer* hwBuf = android_hardware_HardwareBuffer_getNativeHardwareBuffer(env,
hardwareBuffer);
@@ -1183,6 +1204,7 @@ static const JNINativeMethod gBitmapMethods[] = {
{ "nativeCompress", "(JIILjava/io/OutputStream;[B)Z",
(void*)Bitmap_compress },
{ "nativeErase", "(JI)V", (void*)Bitmap_erase },
+ { "nativeErase", "(JLandroid/graphics/ColorSpace;FFFF)V", (void*)Bitmap_eraseLong },
{ "nativeRowBytes", "(J)I", (void*)Bitmap_rowBytes },
{ "nativeConfig", "(J)I", (void*)Bitmap_config },
{ "nativeHasAlpha", "(J)Z", (void*)Bitmap_hasAlpha },
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 9ae05f4c1e08..4b0ab5b2d6ce 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -231,7 +231,7 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr<SkStreamRewindable> stream,
}
if (isMutable && isHardware) {
- doThrowIAE(env, "Bitmaps with Config.HARWARE are always immutable");
+ doThrowIAE(env, "Bitmaps with Config.HARDWARE are always immutable");
return nullObjectReturn("Cannot create mutable hardware bitmap");
}
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 67d0c8aced61..9e74b883a298 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -424,30 +424,30 @@ jobject GraphicsJNI::createRegion(JNIEnv* env, SkRegion* region)
///////////////////////////////////////////////////////////////////////////////
-SkColorSpaceTransferFn GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) {
- SkColorSpaceTransferFn p;
- p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
- p.fB = (float) env->GetDoubleField(transferParams, gTransferParams_bFieldID);
- p.fC = (float) env->GetDoubleField(transferParams, gTransferParams_cFieldID);
- p.fD = (float) env->GetDoubleField(transferParams, gTransferParams_dFieldID);
- p.fE = (float) env->GetDoubleField(transferParams, gTransferParams_eFieldID);
- p.fF = (float) env->GetDoubleField(transferParams, gTransferParams_fFieldID);
- p.fG = (float) env->GetDoubleField(transferParams, gTransferParams_gFieldID);
+skcms_TransferFunction GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) {
+ skcms_TransferFunction p;
+ p.a = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
+ p.b = (float) env->GetDoubleField(transferParams, gTransferParams_bFieldID);
+ p.c = (float) env->GetDoubleField(transferParams, gTransferParams_cFieldID);
+ p.d = (float) env->GetDoubleField(transferParams, gTransferParams_dFieldID);
+ p.e = (float) env->GetDoubleField(transferParams, gTransferParams_eFieldID);
+ p.f = (float) env->GetDoubleField(transferParams, gTransferParams_fFieldID);
+ p.g = (float) env->GetDoubleField(transferParams, gTransferParams_gFieldID);
return p;
}
-SkMatrix44 GraphicsJNI::getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50) {
- SkMatrix44 xyzMatrix(SkMatrix44::kIdentity_Constructor);
+skcms_Matrix3x3 GraphicsJNI::getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50) {
+ skcms_Matrix3x3 xyzMatrix;
jfloat* array = env->GetFloatArrayElements(xyzD50, NULL);
- xyzMatrix.setFloat(0, 0, array[0]);
- xyzMatrix.setFloat(1, 0, array[1]);
- xyzMatrix.setFloat(2, 0, array[2]);
- xyzMatrix.setFloat(0, 1, array[3]);
- xyzMatrix.setFloat(1, 1, array[4]);
- xyzMatrix.setFloat(2, 1, array[5]);
- xyzMatrix.setFloat(0, 2, array[6]);
- xyzMatrix.setFloat(1, 2, array[7]);
- xyzMatrix.setFloat(2, 2, array[8]);
+ xyzMatrix.vals[0][0] = array[0];
+ xyzMatrix.vals[1][0] = array[1];
+ xyzMatrix.vals[2][0] = array[2];
+ xyzMatrix.vals[0][1] = array[3];
+ xyzMatrix.vals[1][1] = array[4];
+ xyzMatrix.vals[2][1] = array[5];
+ xyzMatrix.vals[0][2] = array[6];
+ xyzMatrix.vals[1][2] = array[7];
+ xyzMatrix.vals[2][2] = array[8];
env->ReleaseFloatArrayElements(xyzD50, array, 0);
return xyzMatrix;
}
@@ -456,12 +456,14 @@ sk_sp<SkColorSpace> GraphicsJNI::getNativeColorSpace(JNIEnv* env, jobject colorS
if (colorSpace == nullptr) return nullptr;
if (!env->IsInstanceOf(colorSpace, gColorSpaceRGB_class)) {
doThrowIAE(env, "The color space must be an RGB color space");
+ return nullptr;
}
jobject transferParams = env->CallObjectMethod(colorSpace,
gColorSpaceRGB_getTransferParametersMethodID);
if (transferParams == nullptr) {
doThrowIAE(env, "The color space must use an ICC parametric transfer function");
+ return nullptr;
}
jfloatArray illuminantD50 = (jfloatArray) env->GetStaticObjectField(gColorSpace_class,
@@ -472,8 +474,8 @@ sk_sp<SkColorSpace> GraphicsJNI::getNativeColorSpace(JNIEnv* env, jobject colorS
jfloatArray xyzD50 = (jfloatArray) env->CallObjectMethod(colorSpaceD50,
gColorSpaceRGB_getTransformMethodID);
- SkMatrix44 xyzMatrix = getNativeXYZMatrix(env, xyzD50);
- SkColorSpaceTransferFn transferFunction = getNativeTransferParameters(env, transferParams);
+ skcms_Matrix3x3 xyzMatrix = getNativeXYZMatrix(env, xyzD50);
+ skcms_TransferFunction transferFunction = getNativeTransferParameters(env, transferParams);
return SkColorSpace::MakeRGB(transferFunction, xyzMatrix);
}
@@ -499,30 +501,30 @@ jobject GraphicsJNI::getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColor
} else if (decodeColorSpace.get() != nullptr) {
// Try to match against known RGB color spaces using the CIE XYZ D50
// conversion matrix and numerical transfer function parameters
- SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor);
+ skcms_Matrix3x3 xyzMatrix;
LOG_ALWAYS_FATAL_IF(!decodeColorSpace->toXYZD50(&xyzMatrix));
- SkColorSpaceTransferFn transferParams;
+ skcms_TransferFunction transferParams;
// We can only handle numerical transfer functions at the moment
LOG_ALWAYS_FATAL_IF(!decodeColorSpace->isNumericalTransferFn(&transferParams));
jobject params = env->NewObject(gTransferParameters_class,
gTransferParameters_constructorMethodID,
- transferParams.fA, transferParams.fB, transferParams.fC,
- transferParams.fD, transferParams.fE, transferParams.fF,
- transferParams.fG);
+ transferParams.a, transferParams.b, transferParams.c,
+ transferParams.d, transferParams.e, transferParams.f,
+ transferParams.g);
jfloatArray xyzArray = env->NewFloatArray(9);
jfloat xyz[9] = {
- xyzMatrix.getFloat(0, 0),
- xyzMatrix.getFloat(1, 0),
- xyzMatrix.getFloat(2, 0),
- xyzMatrix.getFloat(0, 1),
- xyzMatrix.getFloat(1, 1),
- xyzMatrix.getFloat(2, 1),
- xyzMatrix.getFloat(0, 2),
- xyzMatrix.getFloat(1, 2),
- xyzMatrix.getFloat(2, 2)
+ xyzMatrix.vals[0][0],
+ xyzMatrix.vals[1][0],
+ xyzMatrix.vals[2][0],
+ xyzMatrix.vals[0][1],
+ xyzMatrix.vals[1][1],
+ xyzMatrix.vals[2][1],
+ xyzMatrix.vals[0][2],
+ xyzMatrix.vals[1][2],
+ xyzMatrix.vals[2][2]
};
env->SetFloatArrayRegion(xyzArray, 0, 9, xyz);
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index b0bd68336e08..699d153874a2 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -10,7 +10,6 @@
#include "SkPoint.h"
#include "SkRect.h"
#include "SkColorSpace.h"
-#include "SkMatrix44.h"
#include <jni.h>
#include <hwui/Canvas.h>
#include <hwui/Bitmap.h>
@@ -101,8 +100,8 @@ public:
int srcStride, int x, int y, int width, int height,
SkBitmap* dstBitmap);
- static SkColorSpaceTransferFn getNativeTransferParameters(JNIEnv* env, jobject transferParams);
- static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
+ static skcms_TransferFunction getNativeTransferParameters(JNIEnv* env, jobject transferParams);
+ static skcms_Matrix3x3 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
static sk_sp<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace);
static jobject getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColorSpace,
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index e97c9bc911dd..e2e3042ee5b9 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -557,6 +557,41 @@ namespace PaintGlue {
return result;
}
+ // FIXME: Make this CriticalNative when we no longer need to use JNIEnv. b/122514935 will allow
+ // passing the SkColorSpace directly from JNI.
+ static void setColor(JNIEnv* env, jobject clazz, jlong paintHandle, jobject jColorSpace,
+ jfloat r, jfloat g, jfloat b, jfloat a) {
+ sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(env, jColorSpace);
+ if (GraphicsJNI::hasException(env)) {
+ return;
+ }
+
+ SkColor4f color = SkColor4f{r, g, b, a};
+ reinterpret_cast<Paint*>(paintHandle)->setColor4f(color, cs.get());
+ }
+
+ // FIXME: Make this CriticalNative when we no longer need to use JNIEnv. b/122514935 will allow
+ // passing the SkColorSpace directly from JNI.
+ static void setShadowLayer(JNIEnv* env, jobject clazz, jlong paintHandle, jfloat radius,
+ jfloat dx, jfloat dy, jobject jColorSpace,
+ jfloat r, jfloat g, jfloat b, jfloat a) {
+ sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(env, jColorSpace);
+ if (GraphicsJNI::hasException(env)) {
+ return;
+ }
+
+ SkColor4f color = SkColor4f{r, g, b, a};
+
+ Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+ if (radius <= 0) {
+ paint->setLooper(nullptr);
+ }
+ else {
+ SkScalar sigma = android::uirenderer::Blur::convertRadiusToSigma(radius);
+ paint->setLooper(SkBlurDrawLooper::Make(color, cs.get(), sigma, dx, dy));
+ }
+ }
+
// ------------------ @FastNative ---------------------------
static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) {
@@ -752,22 +787,6 @@ namespace PaintGlue {
obj->setStyle(style);
}
- static jint getColor(jlong paintHandle) {
- int color;
- color = reinterpret_cast<Paint*>(paintHandle)->getColor();
- return static_cast<jint>(color);
- }
-
- static jint getAlpha(jlong paintHandle) {
- int alpha;
- alpha = reinterpret_cast<Paint*>(paintHandle)->getAlpha();
- return static_cast<jint>(alpha);
- }
-
- static void setColor(jlong paintHandle, jint color) {
- reinterpret_cast<Paint*>(paintHandle)->setColor(color);
- }
-
static void setAlpha(jlong paintHandle, jint a) {
reinterpret_cast<Paint*>(paintHandle)->setAlpha(a);
}
@@ -1015,18 +1034,6 @@ namespace PaintGlue {
return SkScalarToFloat(Paint::kStdStrikeThru_Thickness * textSize);
}
- static void setShadowLayer(jlong paintHandle, jfloat radius,
- jfloat dx, jfloat dy, jint color) {
- Paint* paint = reinterpret_cast<Paint*>(paintHandle);
- if (radius <= 0) {
- paint->setLooper(nullptr);
- }
- else {
- SkScalar sigma = android::uirenderer::Blur::convertRadiusToSigma(radius);
- paint->setLooper(SkBlurDrawLooper::Make((SkColor)color, sigma, dx, dy));
- }
- }
-
static jboolean hasShadowLayer(jlong paintHandle) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
return paint->getLooper() && paint->getLooper()->asABlurShadow(nullptr);
@@ -1075,6 +1082,9 @@ static const JNINativeMethod methods[] = {
{"nGetRunAdvance", "(J[CIIIIZI)F", (void*) PaintGlue::getRunAdvance___CIIIIZI_F},
{"nGetOffsetForAdvance", "(J[CIIIIZF)I",
(void*) PaintGlue::getOffsetForAdvance___CIIIIZF_I},
+ {"nSetColor","(JLandroid/graphics/ColorSpace;FFFF)V", (void*) PaintGlue::setColor},
+ {"nSetShadowLayer", "(JFFFLandroid/graphics/ColorSpace;FFFF)V",
+ (void*)PaintGlue::setShadowLayer},
// --------------- @FastNative ----------------------
@@ -1104,9 +1114,6 @@ static const JNINativeMethod methods[] = {
{"nSetDither","(JZ)V", (void*) PaintGlue::setDither},
{"nGetStyle","(J)I", (void*) PaintGlue::getStyle},
{"nSetStyle","(JI)V", (void*) PaintGlue::setStyle},
- {"nGetColor","(J)I", (void*) PaintGlue::getColor},
- {"nSetColor","(JI)V", (void*) PaintGlue::setColor},
- {"nGetAlpha","(J)I", (void*) PaintGlue::getAlpha},
{"nSetAlpha","(JI)V", (void*) PaintGlue::setAlpha},
{"nGetStrokeWidth","(J)F", (void*) PaintGlue::getStrokeWidth},
{"nSetStrokeWidth","(JF)V", (void*) PaintGlue::setStrokeWidth},
@@ -1147,7 +1154,6 @@ static const JNINativeMethod methods[] = {
{"nGetUnderlineThickness","(J)F", (void*) PaintGlue::getUnderlineThickness},
{"nGetStrikeThruPosition","(J)F", (void*) PaintGlue::getStrikeThruPosition},
{"nGetStrikeThruThickness","(J)F", (void*) PaintGlue::getStrikeThruThickness},
- {"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer},
{"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer},
{"nEqualsForTextMeasurement", "(JJ)Z", (void*)PaintGlue::equalsForTextMeasurement},
};
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index 49a24a30f77e..21369f9cf5f8 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -281,15 +281,19 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName
std::unique_ptr<NativeCode> code;
bool needs_native_bridge = false;
+ char* nativeloader_error_msg = nullptr;
void* handle = OpenNativeLibrary(env,
sdkVersion,
pathStr.c_str(),
classLoader,
+ nullptr,
libraryPath,
&needs_native_bridge,
- &g_error_msg);
+ &nativeloader_error_msg);
if (handle == nullptr) {
+ g_error_msg = nativeloader_error_msg;
+ NativeLoaderFreeErrorMessage(nativeloader_error_msg);
ALOGW("NativeActivity LoadNativeLibrary(\"%s\") failed: %s",
pathStr.c_str(),
g_error_msg.c_str());
diff --git a/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp b/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
deleted file mode 100644
index 1c9ab9403298..000000000000
--- a/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "ActivityRecognitionHardware"
-
-#include <jni.h>
-#include <nativehelper/JNIHelp.h>
-
-#include <android_runtime/AndroidRuntime.h>
-#include <android_runtime/Log.h>
-
-// #include <hardware/activity_recognition.h>
-// The activity recognition HAL is being deprecated. This means -
-// i) Android framework code shall not depend on activity recognition
-// being provided through the activity_recognition.h interface.
-// ii) activity recognition HAL will not be binderized as the other HALs.
-//
-
-/**
- * Initializes the ActivityRecognitionHardware class from the native side.
- */
-static void class_init(JNIEnv* /*env*/, jclass /*clazz*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
-}
-
-/**
- * Initializes and connect the callbacks handlers in the HAL.
- */
-static void initialize(JNIEnv* /*env*/, jobject /*obj*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
-}
-
-/**
- * De-initializes the ActivityRecognitionHardware from the native side.
- */
-static void release(JNIEnv* /*env*/, jobject /*obj*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
-}
-
-/**
- * Returns true if ActivityRecognition HAL is supported, false otherwise.
- */
-static jboolean is_supported(JNIEnv* /*env*/, jclass /*clazz*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
- return JNI_FALSE;
-}
-
-/**
- * Gets an array representing the supported activities.
- */
-static jobjectArray get_supported_activities(JNIEnv* /*env*/, jobject /*obj*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
- return NULL;
-}
-
-/**
- * Enables a given activity event to be actively monitored.
- */
-static int enable_activity_event(
- JNIEnv* /*env*/,
- jobject /*obj*/,
- jint /*activity_handle*/,
- jint /*event_type*/,
- jlong /*report_latency_ns*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
- return android::NO_INIT;
-}
-
-/**
- * Disables a given activity event from being actively monitored.
- */
-static int disable_activity_event(
- JNIEnv* /*env*/,
- jobject /*obj*/,
- jint /*activity_handle*/,
- jint /*event_type*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
- return android::NO_INIT;
-}
-
-/**
- * Request flush for al batch buffers.
- */
-static int flush(JNIEnv* /*env*/, jobject /*obj*/) {
- ALOGE("activity_recognition HAL is deprecated. %s is effectively a no-op",
- __FUNCTION__);
- return android::NO_INIT;
-}
-
-
-static const JNINativeMethod sMethods[] = {
- // {"name", "signature", (void*) functionPointer },
- { "nativeClassInit", "()V", (void*) class_init },
- { "nativeInitialize", "()V", (void*) initialize },
- { "nativeRelease", "()V", (void*) release },
- { "nativeIsSupported", "()Z", (void*) is_supported },
- { "nativeGetSupportedActivities", "()[Ljava/lang/String;", (void*) get_supported_activities },
- { "nativeEnableActivityEvent", "(IIJ)I", (void*) enable_activity_event },
- { "nativeDisableActivityEvent", "(II)I", (void*) disable_activity_event },
- { "nativeFlush", "()I", (void*) flush },
-};
-
-/**
- * Registration method invoked in JNI load.
- */
-int register_android_hardware_location_ActivityRecognitionHardware(JNIEnv* env) {
- return jniRegisterNativeMethods(
- env,
- "android/hardware/location/ActivityRecognitionHardware",
- sMethods,
- NELEM(sMethods));
-}
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 12a8343b4a5c..67c306413bb2 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -841,6 +841,43 @@ static jint android_media_AudioRecord_get_active_microphones(JNIEnv *env,
return jStatus;
}
+static int android_media_AudioRecord_set_microphone_direction(JNIEnv *env, jobject thiz,
+ jint direction) {
+ sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
+ if (lpRecorder == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Unable to retrieve AudioRecord pointer for setMicrophoneDirection()");
+ return (jint)AUDIO_JAVA_ERROR;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status =
+ lpRecorder->setMicrophoneDirection(static_cast<audio_microphone_direction_t>(direction));
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+}
+
+static int android_media_AudioRecord_set_microphone_field_dimension(JNIEnv *env, jobject thiz,
+ jfloat zoom) {
+ sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
+ if (lpRecorder == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Unable to retrieve AudioRecord pointer for setMicrophoneFieldDimension()");
+ return (jint)AUDIO_JAVA_ERROR;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status = lpRecorder->setMicrophoneFieldDimension(zoom);
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+}
+
// ----------------------------------------------------------------------------
static jint android_media_AudioRecord_get_port_id(JNIEnv *env, jobject thiz) {
sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
@@ -896,6 +933,10 @@ static const JNINativeMethod gMethods[] = {
{"native_get_active_microphones", "(Ljava/util/ArrayList;)I",
(void *)android_media_AudioRecord_get_active_microphones},
{"native_getPortId", "()I", (void *)android_media_AudioRecord_get_port_id},
+ {"native_set_microphone_direction", "(I)I",
+ (void *)android_media_AudioRecord_set_microphone_direction},
+ {"native_set_microphone_field_dimension", "(F)I",
+ (void *)android_media_AudioRecord_set_microphone_field_dimension},
};
// field names found in android/media/AudioRecord.java
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 80560f826235..0d8ede794b73 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -487,13 +487,15 @@ android_media_AudioSystem_recording_callback(int event,
}
static jint
-android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address, jstring device_name)
+android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address, jstring device_name,
+ jint codec)
{
const char *c_address = env->GetStringUTFChars(device_address, NULL);
const char *c_name = env->GetStringUTFChars(device_name, NULL);
int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device),
static_cast <audio_policy_dev_state_t>(state),
- c_address, c_name));
+ c_address, c_name,
+ static_cast <audio_format_t>(codec)));
env->ReleaseStringUTFChars(device_address, c_address);
env->ReleaseStringUTFChars(device_name, c_name);
return (jint) status;
@@ -510,12 +512,13 @@ android_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, ji
}
static jint
-android_media_AudioSystem_handleDeviceConfigChange(JNIEnv *env, jobject thiz, jint device, jstring device_address, jstring device_name)
+android_media_AudioSystem_handleDeviceConfigChange(JNIEnv *env, jobject thiz, jint device, jstring device_address, jstring device_name,
+ jint codec)
{
const char *c_address = env->GetStringUTFChars(device_address, NULL);
const char *c_name = env->GetStringUTFChars(device_name, NULL);
int status = check_AudioSystem_Command(AudioSystem::handleDeviceConfigChange(static_cast <audio_devices_t>(device),
- c_address, c_name));
+ c_address, c_name, static_cast <audio_format_t>(codec)));
env->ReleaseStringUTFChars(device_address, c_address);
env->ReleaseStringUTFChars(device_name, c_name);
return (jint) status;
@@ -2004,7 +2007,7 @@ android_media_AudioSystem_getMicrophones(JNIEnv *env, jobject thiz, jobject jMic
std::vector<media::MicrophoneInfo> microphones;
status_t status = AudioSystem::getMicrophones(&microphones);
if (status != NO_ERROR) {
- ALOGE_IF(status != NO_ERROR, "AudioSystem::getMicrophones error %d", status);
+ ALOGE("AudioSystem::getMicrophones error %d", status);
jStatus = nativeToJavaStatus(status);
return jStatus;
}
@@ -2026,6 +2029,34 @@ android_media_AudioSystem_getMicrophones(JNIEnv *env, jobject thiz, jobject jMic
}
static jint
+android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP(
+ JNIEnv *env, jobject thiz, jobject jEncodingFormatList)
+{
+ ALOGV("%s", __FUNCTION__);
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ if (!env->IsInstanceOf(jEncodingFormatList, gArrayListClass)) {
+ ALOGE("%s: jEncodingFormatList not an ArrayList", __FUNCTION__);
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+ std::vector<audio_format_t> encodingFormats;
+ status_t status = AudioSystem::getHwOffloadEncodingFormatsSupportedForA2DP(
+ &encodingFormats);
+ if (status != NO_ERROR) {
+ ALOGE("%s: error %d", __FUNCTION__, status);
+ jStatus = nativeToJavaStatus(status);
+ return jStatus;
+ }
+
+ for (size_t i = 0; i < encodingFormats.size(); i++) {
+ ScopedLocalRef<jobject> jEncodingFormat(
+ env, env->NewObject(gIntegerClass, gIntegerCstor, encodingFormats[i]));
+ env->CallBooleanMethod(jEncodingFormatList, gArrayListMethods.add,
+ jEncodingFormat.get());
+ }
+ return jStatus;
+}
+
+static jint
android_media_AudioSystem_getSurroundFormats(JNIEnv *env, jobject thiz,
jobject jSurroundFormats, jboolean reported)
{
@@ -2142,9 +2173,9 @@ static const JNINativeMethod gMethods[] = {
{"isSourceActive", "(I)Z", (void *)android_media_AudioSystem_isSourceActive},
{"newAudioSessionId", "()I", (void *)android_media_AudioSystem_newAudioSessionId},
{"newAudioPlayerId", "()I", (void *)android_media_AudioSystem_newAudioPlayerId},
- {"setDeviceConnectionState", "(IILjava/lang/String;Ljava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
+ {"setDeviceConnectionState", "(IILjava/lang/String;Ljava/lang/String;I)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
{"getDeviceConnectionState", "(ILjava/lang/String;)I", (void *)android_media_AudioSystem_getDeviceConnectionState},
- {"handleDeviceConfigChange", "(ILjava/lang/String;Ljava/lang/String;)I", (void *)android_media_AudioSystem_handleDeviceConfigChange},
+ {"handleDeviceConfigChange", "(ILjava/lang/String;Ljava/lang/String;I)I", (void *)android_media_AudioSystem_handleDeviceConfigChange},
{"setPhoneState", "(I)I", (void *)android_media_AudioSystem_setPhoneState},
{"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse},
{"getForceUse", "(I)I", (void *)android_media_AudioSystem_getForceUse},
@@ -2197,6 +2228,8 @@ static const JNINativeMethod gMethods[] = {
{"setAssistantUid", "(I)I", (void *)android_media_AudioSystem_setAssistantUid},
{"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids},
{"isHapticPlaybackSupported", "()Z", (void *)android_media_AudioSystem_isHapticPlaybackSupported},
+ {"getHwOffloadEncodingFormatsSupportedForA2DP", "(Ljava/util/ArrayList;)I",
+ (void*)android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP},
};
static const JNINativeMethod gEventHandlerMethods[] = {
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 888dab19c247..7d63ec9a2ecf 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -29,7 +29,6 @@
#include <time.h>
#include <unistd.h>
-#include <atomic>
#include <iomanip>
#include <string>
#include <vector>
@@ -42,6 +41,7 @@
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include "jni.h"
+#include <meminfo/procmeminfo.h>
#include <meminfo/sysmeminfo.h>
#include <memtrack/memtrack.h>
#include <memunreachable/memunreachable.h>
@@ -150,14 +150,6 @@ struct stats_t {
int swappedOutPss;
};
-enum pss_rollup_support {
- PSS_ROLLUP_UNTRIED,
- PSS_ROLLUP_SUPPORTED,
- PSS_ROLLUP_UNSUPPORTED
-};
-
-static std::atomic<pss_rollup_support> g_pss_rollup_support;
-
#define BINDER_STATS "/proc/binder/stats"
static jlong android_os_Debug_getNativeHeapSize(JNIEnv *env, jobject clazz)
@@ -555,37 +547,9 @@ static void android_os_Debug_getDirtyPages(JNIEnv *env, jobject clazz, jobject o
android_os_Debug_getDirtyPagesPid(env, clazz, getpid(), object);
}
-UniqueFile OpenSmapsOrRollup(int pid)
-{
- enum pss_rollup_support rollup_support =
- g_pss_rollup_support.load(std::memory_order_relaxed);
- if (rollup_support != PSS_ROLLUP_UNSUPPORTED) {
- std::string smaps_rollup_path =
- base::StringPrintf("/proc/%d/smaps_rollup", pid);
- UniqueFile fp_rollup = MakeUniqueFile(smaps_rollup_path.c_str(), "re");
- if (fp_rollup == nullptr && errno != ENOENT) {
- return fp_rollup; // Actual error, not just old kernel.
- }
- if (fp_rollup != nullptr) {
- if (rollup_support == PSS_ROLLUP_UNTRIED) {
- ALOGI("using rollup pss collection");
- g_pss_rollup_support.store(PSS_ROLLUP_SUPPORTED,
- std::memory_order_relaxed);
- }
- return fp_rollup;
- }
- g_pss_rollup_support.store(PSS_ROLLUP_UNSUPPORTED,
- std::memory_order_relaxed);
- }
-
- std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid);
- return MakeUniqueFile(smaps_path.c_str(), "re");
-}
-
static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid,
jlongArray outUssSwapPssRss, jlongArray outMemtrack)
{
- char lineBuffer[1024];
jlong pss = 0;
jlong rss = 0;
jlong swapPss = 0;
@@ -597,59 +561,14 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid,
pss = uss = rss = memtrack = graphics_mem.graphics + graphics_mem.gl + graphics_mem.other;
}
- {
- UniqueFile fp = OpenSmapsOrRollup(pid);
-
- if (fp != nullptr) {
- char* line;
-
- while (true) {
- if (fgets(lineBuffer, sizeof (lineBuffer), fp.get()) == NULL) {
- break;
- }
- line = lineBuffer;
-
- switch (line[0]) {
- case 'P':
- if (strncmp(line, "Pss:", 4) == 0) {
- char* c = line + 4;
- while (*c != 0 && (*c < '0' || *c > '9')) {
- c++;
- }
- pss += atoi(c);
- } else if (strncmp(line, "Private_Clean:", 14) == 0
- || strncmp(line, "Private_Dirty:", 14) == 0) {
- char* c = line + 14;
- while (*c != 0 && (*c < '0' || *c > '9')) {
- c++;
- }
- uss += atoi(c);
- }
- break;
- case 'R':
- if (strncmp(line, "Rss:", 4) == 0) {
- char* c = line + 4;
- while (*c != 0 && (*c < '0' || *c > '9')) {
- c++;
- }
- rss += atoi(c);
- }
- break;
- case 'S':
- if (strncmp(line, "SwapPss:", 8) == 0) {
- char* c = line + 8;
- jlong lSwapPss;
- while (*c != 0 && (*c < '0' || *c > '9')) {
- c++;
- }
- lSwapPss = atoi(c);
- swapPss += lSwapPss;
- pss += lSwapPss; // Also in swap, those pages would be accounted as Pss without SWAP
- }
- break;
- }
- }
- }
+ ::android::meminfo::ProcMemInfo proc_mem(pid);
+ ::android::meminfo::MemUsage stats;
+ if (proc_mem.SmapsOrRollup(&stats)) {
+ pss += stats.pss;
+ uss += stats.uss;
+ rss += stats.rss;
+ swapPss = stats.swap_pss;
+ pss += swapPss; // Also in swap, those pages would be accounted as Pss without SWAP
}
if (outUssSwapPssRss != NULL) {
@@ -686,34 +605,6 @@ static jlong android_os_Debug_getPss(JNIEnv *env, jobject clazz)
return android_os_Debug_getPssPid(env, clazz, getpid(), NULL, NULL);
}
-static long get_allocated_vmalloc_memory() {
- char line[1024];
-
- long vmalloc_allocated_size = 0;
-
- UniqueFile fp = MakeUniqueFile("/proc/vmallocinfo", "re");
- if (fp == nullptr) {
- return 0;
- }
-
- while (true) {
- if (fgets(line, 1024, fp.get()) == NULL) {
- break;
- }
-
- // check to see if there are pages mapped in vmalloc area
- if (!strstr(line, "pages=")) {
- continue;
- }
-
- long nr_pages;
- if (sscanf(line, "%*x-%*x %*ld %*s pages=%ld", &nr_pages) == 1) {
- vmalloc_allocated_size += (nr_pages * getpagesize());
- }
- }
- return vmalloc_allocated_size;
-}
-
// The 1:1 mapping of MEMINFO_* enums here must match with the constants from
// Debug.java.
enum {
@@ -763,9 +654,8 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o
if (outArray != NULL) {
outLen = MEMINFO_COUNT;
for (int i = 0; i < outLen; i++) {
- // TODO: move get_allocated_vmalloc_memory() to libmeminfo
if (i == MEMINFO_VMALLOC_USED) {
- outArray[i] = get_allocated_vmalloc_memory() / 1024;
+ outArray[i] = smi.ReadVmallocInfo() / 1024;
continue;
}
outArray[i] = mem[i];
@@ -775,7 +665,6 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o
env->ReleaseLongArrayElements(out, outArray, 0);
}
-
static jint read_binder_stat(const char* stat)
{
UniqueFile fp = MakeUniqueFile(BINDER_STATS, "re");
diff --git a/core/jni/android_os_Debug.h b/core/jni/android_os_Debug.h
index c7b731bdb615..747776a1b89b 100644
--- a/core/jni/android_os_Debug.h
+++ b/core/jni/android_os_Debug.h
@@ -19,6 +19,7 @@
#include <memory>
#include <stdio.h>
+#include <meminfo/meminfo.h>
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
@@ -34,8 +35,6 @@ inline UniqueFile MakeUniqueFile(const char* path, const char* mode) {
return UniqueFile(fopen(path, mode), safeFclose);
}
-UniqueFile OpenSmapsOrRollup(int pid);
-
} // namespace android
#endif // ANDROID_OS_HW_BLOB_H
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp
index 163b86b29030..42e3942eb350 100644
--- a/core/jni/android_os_HwBinder.cpp
+++ b/core/jni/android_os_HwBinder.cpp
@@ -329,7 +329,7 @@ static jobject JHwBinder_native_getService(
return NULL;
}
- LOG(INFO) << "HwBinder: Starting thread pool for " << serviceName << "::" << ifaceName;
+ LOG(INFO) << "HwBinder: Starting thread pool for getting: " << ifaceName << "/" << serviceName;
::android::hardware::ProcessState::self()->startThreadPool();
return JHwRemoteBinder::NewObject(env, service);
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 7ef06dc54945..3b59321024fd 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -473,7 +473,7 @@ static jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jclass clazz, j
if (parcel != NULL) {
int fd = parcel->readFileDescriptor();
if (fd < 0) return NULL;
- fd = dup(fd);
+ fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
if (fd < 0) return NULL;
return jniCreateFileDescriptor(env, fd);
}
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 7b564ae162ce..4101c04162af 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -44,6 +44,8 @@
#include "androidfw/MutexGuard.h"
#include "androidfw/PosixUtils.h"
#include "androidfw/ResourceTypes.h"
+#include "androidfw/ResourceUtils.h"
+
#include "core_jni_helpers.h"
#include "jni.h"
#include "nativehelper/JNIHelp.h"
@@ -975,34 +977,7 @@ static jstring NativeGetResourceName(JNIEnv* env, jclass /*clazz*/, jlong ptr, j
return nullptr;
}
- std::string result;
- if (name.package != nullptr) {
- result.append(name.package, name.package_len);
- }
-
- if (name.type != nullptr || name.type16 != nullptr) {
- if (!result.empty()) {
- result += ":";
- }
-
- if (name.type != nullptr) {
- result.append(name.type, name.type_len);
- } else {
- result += util::Utf16ToUtf8(StringPiece16(name.type16, name.type_len));
- }
- }
-
- if (name.entry != nullptr || name.entry16 != nullptr) {
- if (!result.empty()) {
- result += "/";
- }
-
- if (name.entry != nullptr) {
- result.append(name.entry, name.entry_len);
- } else {
- result += util::Utf16ToUtf8(StringPiece16(name.entry16, name.entry_len));
- }
- }
+ std::string result = ToFormattedResourceString(&name);
return env->NewStringUTF(result.c_str());
}
@@ -1049,6 +1024,26 @@ static jstring NativeGetResourceEntryName(JNIEnv* env, jclass /*clazz*/, jlong p
return nullptr;
}
+static void NativeSetResourceResolutionLoggingEnabled(JNIEnv* /*env*/,
+ jclass /*clazz*/,
+ jlong ptr,
+ jboolean enabled) {
+ ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
+ assetmanager->SetResourceResolutionLoggingEnabled(enabled);
+}
+
+static jstring NativeGetLastResourceResolution(JNIEnv* env,
+ jclass /*clazz*/,
+ jlong ptr) {
+ ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
+ std::string resolution = assetmanager->GetLastResourceResolution();
+ if (resolution.empty()) {
+ return nullptr;
+ } else {
+ return env->NewStringUTF(resolution.c_str());
+ }
+}
+
static jobjectArray NativeGetLocales(JNIEnv* env, jclass /*class*/, jlong ptr,
jboolean exclude_system) {
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
@@ -1452,6 +1447,10 @@ static const JNINativeMethod gAssetManagerMethods[] = {
{"nativeGetResourcePackageName", "(JI)Ljava/lang/String;", (void*)NativeGetResourcePackageName},
{"nativeGetResourceTypeName", "(JI)Ljava/lang/String;", (void*)NativeGetResourceTypeName},
{"nativeGetResourceEntryName", "(JI)Ljava/lang/String;", (void*)NativeGetResourceEntryName},
+ {"nativeSetResourceResolutionLoggingEnabled", "(JZ)V",
+ (void*) NativeSetResourceResolutionLoggingEnabled},
+ {"nativeGetLastResourceResolution", "(J)Ljava/lang/String;",
+ (void*) NativeGetLastResourceResolution},
{"nativeGetLocales", "(JZ)[Ljava/lang/String;", (void*)NativeGetLocales},
{"nativeGetSizeConfigurations", "(J)[Landroid/content/res/Configuration;",
(void*)NativeGetSizeConfigurations},
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 3329e2047085..f201ceb40ff4 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -875,6 +875,11 @@ static jint android_os_Binder_getCallingUid()
return IPCThreadState::self()->getCallingUid();
}
+static jboolean android_os_Binder_isHandlingTransaction()
+{
+ return IPCThreadState::self()->isServingCall();
+}
+
static jlong android_os_Binder_clearCallingIdentity()
{
return IPCThreadState::self()->clearCallingIdentity();
@@ -960,6 +965,8 @@ static const JNINativeMethod gBinderMethods[] = {
// @CriticalNative
{ "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid },
// @CriticalNative
+ { "isHandlingTransaction", "()Z", (void*)android_os_Binder_isHandlingTransaction },
+ // @CriticalNative
{ "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity },
{ "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity },
// @CriticalNative
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index b0f6bb9da5ab..7e0828336962 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -26,8 +26,10 @@
#include <cutils/properties.h>
#include <utils/String8.h>
#include <utils/Vector.h>
+#include <meminfo/procmeminfo.h>
#include <meminfo/sysmeminfo.h>
#include <processgroup/processgroup.h>
+#include <processgroup/sched_policy.h>
#include <string>
#include <vector>
@@ -1170,21 +1172,12 @@ static jlong android_os_Process_getElapsedCpuTime(JNIEnv* env, jobject clazz)
static jlong android_os_Process_getPss(JNIEnv* env, jobject clazz, jint pid)
{
- UniqueFile file = OpenSmapsOrRollup(pid);
- if (file == nullptr) {
+ ::android::meminfo::ProcMemInfo proc_mem(pid);
+ uint64_t pss;
+ if (!proc_mem.SmapsOrRollupPss(&pss)) {
return (jlong) -1;
}
- // Tally up all of the Pss from the various maps
- char line[256];
- jlong pss = 0;
- while (fgets(line, sizeof(line), file.get())) {
- jlong v;
- if (sscanf(line, "Pss: %" SCNd64 " kB", &v) == 1) {
- pss += v;
- }
- }
-
// Return the Pss value in bytes, not kilobytes
return pss * 1024;
}
diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp
index 10da89227f51..aa10a2f98a7e 100644
--- a/core/jni/android_view_InputEventSender.cpp
+++ b/core/jni/android_view_InputEventSender.cpp
@@ -138,6 +138,7 @@ status_t NativeInputEventSender::sendMotionEvent(uint32_t seq, const MotionEvent
event->getDeviceId(), event->getSource(), event->getDisplayId(),
event->getAction(), event->getActionButton(), event->getFlags(),
event->getEdgeFlags(), event->getMetaState(), event->getButtonState(),
+ event->getClassification(),
event->getXOffset(), event->getYOffset(),
event->getXPrecision(), event->getYPrecision(),
event->getDownTime(), event->getHistoricalEventTime(i),
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index ecf811970a99..50cff5c46da3 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -334,7 +334,7 @@ static void pointerPropertiesFromNative(JNIEnv* env, const PointerProperties* po
static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz,
jlong nativePtr,
jint deviceId, jint source, jint displayId, jint action, jint flags, jint edgeFlags,
- jint metaState, jint buttonState,
+ jint metaState, jint buttonState, jint classification,
jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision,
jlong downTimeNanos, jlong eventTimeNanos,
jint pointerCount, jobjectArray pointerPropertiesObjArray,
@@ -373,7 +373,8 @@ static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz
}
event->initialize(deviceId, source, displayId, action, 0, flags, edgeFlags, metaState,
- buttonState, xOffset, yOffset, xPrecision, yPrecision,
+ buttonState, static_cast<MotionClassification>(classification),
+ xOffset, yOffset, xPrecision, yPrecision,
downTimeNanos, eventTimeNanos, pointerCount, pointerProperties, rawPointerCoords);
return reinterpret_cast<jlong>(event);
@@ -668,6 +669,11 @@ static void android_view_MotionEvent_nativeSetButtonState(jlong nativePtr, jint
event->setButtonState(buttonState);
}
+static jint android_view_MotionEvent_nativeGetClassification(jlong nativePtr) {
+ MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
+ return static_cast<jint>(event->getClassification());
+}
+
static void android_view_MotionEvent_nativeOffsetLocation(jlong nativePtr, jfloat deltaX,
jfloat deltaY) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
@@ -747,7 +753,7 @@ static void android_view_MotionEvent_nativeTransform(jlong nativePtr, jlong matr
static const JNINativeMethod gMotionEventMethods[] = {
/* name, signature, funcPtr */
{ "nativeInitialize",
- "(JIIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;"
+ "(JIIIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;"
"[Landroid/view/MotionEvent$PointerCoords;)J",
(void*)android_view_MotionEvent_nativeInitialize },
{ "nativeDispose",
@@ -846,6 +852,9 @@ static const JNINativeMethod gMotionEventMethods[] = {
{ "nativeSetButtonState",
"(JI)V",
(void*)android_view_MotionEvent_nativeSetButtonState },
+ { "nativeGetClassification",
+ "(J)I",
+ (void*)android_view_MotionEvent_nativeGetClassification },
{ "nativeOffsetLocation",
"(JFF)V",
(void*)android_view_MotionEvent_nativeOffsetLocation },
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 6576587899be..897427fd8787 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -438,8 +438,9 @@ static jobject nativeGetDisplayedContentSamplingAttributes(JNIEnv* env, jclass c
static jboolean nativeSetDisplayedContentSamplingEnabled(JNIEnv* env, jclass clazz,
jobject tokenObj, jboolean enable, jint componentMask, jint maxFrames) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
- return SurfaceComposerClient::setDisplayContentSamplingEnabled(
+ status_t rc = SurfaceComposerClient::setDisplayContentSamplingEnabled(
token, enable, componentMask, maxFrames);
+ return rc == OK;
}
static jobject nativeGetDisplayedContentSample(JNIEnv* env, jclass clazz, jobject tokenObj,
@@ -641,6 +642,27 @@ static jint nativeGetActiveColorMode(JNIEnv* env, jclass, jobject tokenObj) {
return static_cast<jint>(SurfaceComposerClient::getActiveColorMode(token));
}
+static jintArray nativeGetCompositionDataspaces(JNIEnv* env, jclass) {
+ ui::Dataspace defaultDataspace, wcgDataspace;
+ ui::PixelFormat defaultPixelFormat, wcgPixelFormat;
+ if (SurfaceComposerClient::getCompositionPreference(&defaultDataspace,
+ &defaultPixelFormat,
+ &wcgDataspace,
+ &wcgPixelFormat) != NO_ERROR) {
+ return nullptr;
+ }
+ jintArray array = env->NewIntArray(2);
+ if (array == nullptr) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
+ return nullptr;
+ }
+ jint* arrayValues = env->GetIntArrayElements(array, 0);
+ arrayValues[0] = static_cast<jint>(defaultDataspace);
+ arrayValues[1] = static_cast<jint>(wcgDataspace);
+ env->ReleaseIntArrayElements(array, arrayValues, 0);
+ return array;
+}
+
static jboolean nativeSetActiveColorMode(JNIEnv* env, jclass,
jobject tokenObj, jint colorMode) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
@@ -659,6 +681,10 @@ static void nativeSetDisplayPowerMode(JNIEnv* env, jclass clazz, jobject tokenOb
if (t.duration() > 100ms) ALOGD("Excessive delay in setPowerMode()");
}
+static jboolean nativeGetProtectedContentSupport(JNIEnv* env, jclass) {
+ return static_cast<jboolean>(SurfaceComposerClient::getProtectedContentSupport());
+}
+
static jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) {
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
status_t err = ctrl->clearLayerFrameStats();
@@ -869,14 +895,6 @@ static void nativeSetOverrideScalingMode(JNIEnv* env, jclass clazz, jlong transa
transaction->setOverrideScalingMode(ctrl, scalingMode);
}
-static void nativeDestroyInTransaction(JNIEnv* env, jclass clazz,
- jlong transactionObj,
- jlong nativeObject) {
- auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
- auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
- transaction->destroySurface(ctrl);
-}
-
static jobject nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) {
auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
return javaObjectForIBinder(env, ctrl->getHandle());
@@ -916,6 +934,17 @@ static jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj)
return reinterpret_cast<jlong>(surface.get());
}
+static jlong nativeCopyFromSurfaceControl(JNIEnv* env, jclass clazz, jlong surfaceControlNativeObj) {
+ sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
+ if (surface == nullptr) {
+ return 0;
+ }
+
+ sp<SurfaceControl> newSurface = new SurfaceControl(surface);
+ newSurface->incStrong((void *)nativeCreate);
+ return reinterpret_cast<jlong>(newSurface.get());
+}
+
static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
jlong nativeObject, jobject parcelObj) {
Parcel* parcel = parcelForJavaObject(env, parcelObj);
@@ -924,7 +953,9 @@ static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
return;
}
SurfaceControl* const self = reinterpret_cast<SurfaceControl *>(nativeObject);
- self->writeToParcel(parcel);
+ if (self != nullptr) {
+ self->writeToParcel(parcel);
+ }
}
// ----------------------------------------------------------------------------
@@ -934,6 +965,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeCreate },
{"nativeReadFromParcel", "(Landroid/os/Parcel;)J",
(void*)nativeReadFromParcel },
+ {"nativeCopyFromSurfaceControl", "(J)J" ,
+ (void*)nativeCopyFromSurfaceControl },
{"nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
(void*)nativeWriteToParcel },
{"nativeRelease", "(J)V",
@@ -1008,6 +1041,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeGetActiveColorMode},
{"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z",
(void*)nativeSetActiveColorMode},
+ {"nativeGetCompositionDataspaces", "()[I",
+ (void*)nativeGetCompositionDataspaces},
{"nativeGetHdrCapabilities", "(Landroid/os/IBinder;)Landroid/view/Display$HdrCapabilities;",
(void*)nativeGetHdrCapabilities },
{"nativeClearContentFrameStats", "(J)Z",
@@ -1020,6 +1055,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeGetAnimationFrameStats },
{"nativeSetDisplayPowerMode", "(Landroid/os/IBinder;I)V",
(void*)nativeSetDisplayPowerMode },
+ {"nativeGetProtectedContentSupport", "()Z",
+ (void*)nativeGetProtectedContentSupport },
{"nativeDeferTransactionUntil", "(JJLandroid/os/IBinder;J)V",
(void*)nativeDeferTransactionUntil },
{"nativeDeferTransactionUntilSurface", "(JJJJ)V",
@@ -1032,8 +1069,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeSeverChildren } ,
{"nativeSetOverrideScalingMode", "(JJI)V",
(void*)nativeSetOverrideScalingMode },
- {"nativeDestroy", "(JJ)V",
- (void*)nativeDestroyInTransaction },
{"nativeGetHandle", "(J)Landroid/os/IBinder;",
(void*)nativeGetHandle },
{"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZI)Landroid/graphics/GraphicBuffer;",
diff --git a/core/jni/android_view_SurfaceSession.cpp b/core/jni/android_view_SurfaceSession.cpp
index 30c00302eefd..191f748d80bf 100644
--- a/core/jni/android_view_SurfaceSession.cpp
+++ b/core/jni/android_view_SurfaceSession.cpp
@@ -46,13 +46,6 @@ static jlong nativeCreate(JNIEnv* env, jclass clazz) {
return reinterpret_cast<jlong>(client);
}
-static jlong nativeCreateScoped(JNIEnv* env, jclass clazz, jlong surfaceObject) {
- Surface *parent = reinterpret_cast<Surface*>(surfaceObject);
- SurfaceComposerClient* client = new SurfaceComposerClient(parent->getIGraphicBufferProducer());
- client->incStrong((void*)nativeCreate);
- return reinterpret_cast<jlong>(client);
-}
-
static void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) {
SurfaceComposerClient* client = reinterpret_cast<SurfaceComposerClient*>(ptr);
client->decStrong((void*)nativeCreate);
@@ -67,8 +60,6 @@ static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "nativeCreate", "()J",
(void*)nativeCreate },
- { "nativeCreateScoped", "(J)J",
- (void*)nativeCreateScoped },
{ "nativeDestroy", "(J)V",
(void*)nativeDestroy },
{ "nativeKill", "(J)V",
diff --git a/core/jni/com_android_internal_os_AtomicDirectory.cpp b/core/jni/com_android_internal_os_AtomicDirectory.cpp
new file mode 100644
index 000000000000..50b2288a614a
--- /dev/null
+++ b/core/jni/com_android_internal_os_AtomicDirectory.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#include <nativehelper/ScopedUtfChars.h>
+#include "jni.h"
+
+#include "core_jni_helpers.h"
+
+namespace android {
+
+static jint com_android_internal_os_AtomicDirectory_getDirectoryFd(JNIEnv* env,
+ jobject /*clazz*/, jstring path) {
+ ScopedUtfChars path8(env, path);
+ if (path8.c_str() == NULL) {
+ ALOGE("Invalid path: %s", path8.c_str());
+ return -1;
+ }
+ int fd;
+ if ((fd = TEMP_FAILURE_RETRY(open(path8.c_str(), O_DIRECTORY | O_RDONLY))) == -1) {
+ ALOGE("Cannot open directory %s, error: %s\n", path8.c_str(), strerror(errno));
+ return -1;
+ }
+ return fd;
+}
+
+static void com_android_internal_os_AtomicDirectory_fsyncDirectoryFd(JNIEnv* env,
+ jobject /*clazz*/, jint fd) {
+ if (TEMP_FAILURE_RETRY(fsync(fd)) == -1) {
+ ALOGE("Cannot fsync directory %d, error: %s\n", fd, strerror(errno));
+ }
+}
+
+/*
+ * JNI registration.
+ */
+static const JNINativeMethod gRegisterMethods[] = {
+ /* name, signature, funcPtr */
+ { "fsyncDirectoryFd",
+ "(I)V",
+ (void*) com_android_internal_os_AtomicDirectory_fsyncDirectoryFd
+ },
+ { "getDirectoryFd",
+ "(Ljava/lang/String;)I",
+ (void*) com_android_internal_os_AtomicDirectory_getDirectoryFd
+ },
+};
+
+int register_com_android_internal_os_AtomicDirectory(JNIEnv* env) {
+ return RegisterMethodsOrDie(env, "com/android/internal/os/AtomicDirectory",
+ gRegisterMethods, NELEM(gRegisterMethods));
+}
+
+}; // namespace android
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index f74a236f4a5a..906080178479 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -14,6 +14,15 @@
* limitations under the License.
*/
+/*
+ * Disable optimization of this file if we are compiling with the address
+ * sanitizer. This is a mitigation for b/122921367 and can be removed once the
+ * bug is fixed.
+ */
+#if __has_feature(address_sanitizer)
+#pragma clang optimize off
+#endif
+
#define LOG_TAG "Zygote"
// sys/mount.h has to come before linux/fs.h due to redefinition of MS_RDONLY, MS_BIND, etc
@@ -61,6 +70,7 @@
#include <seccomp_policy.h>
#include <stats_event_list.h>
#include <processgroup/processgroup.h>
+#include <processgroup/sched_policy.h>
#include "core_jni_helpers.h"
#include <nativehelper/JNIHelp.h>
@@ -87,6 +97,7 @@ using android::base::GetBoolProperty;
static pid_t gSystemServerPid = 0;
static const char kIsolatedStorage[] = "persist.sys.isolated_storage";
+static const char kIsolatedStorageSnapshot[] = "sys.isolated_storage_snapshot";
static const char kZygoteClassName[] = "com/android/internal/os/Zygote";
static jclass gZygoteClass;
static jmethodID gCallPostForkSystemServerHooks;
@@ -100,8 +111,9 @@ enum MountExternalKind {
MOUNT_EXTERNAL_DEFAULT = 1,
MOUNT_EXTERNAL_READ = 2,
MOUNT_EXTERNAL_WRITE = 3,
- MOUNT_EXTERNAL_INSTALLER = 4,
- MOUNT_EXTERNAL_FULL = 5,
+ MOUNT_EXTERNAL_LEGACY = 4,
+ MOUNT_EXTERNAL_INSTALLER = 5,
+ MOUNT_EXTERNAL_FULL = 6,
};
// Must match values in com.android.internal.os.Zygote.
@@ -311,7 +323,7 @@ static void PreApplicationInit() {
mallopt(M_DECAY_TIME, 1);
}
-static void SetUpSeccompFilter(uid_t uid) {
+static void SetUpSeccompFilter(uid_t uid, bool is_child_zygote) {
if (!g_is_security_enforced) {
ALOGI("seccomp disabled by setenforce 0");
return;
@@ -319,7 +331,14 @@ static void SetUpSeccompFilter(uid_t uid) {
// Apply system or app filter based on uid.
if (uid >= AID_APP_START) {
- set_app_seccomp_filter();
+ if (is_child_zygote) {
+ // set_app_zygote_seccomp_filter();
+ // TODO(b/111434506) install the filter; for now, install the app filter
+ // which is more restrictive.
+ set_app_seccomp_filter();
+ } else {
+ set_app_seccomp_filter();
+ }
} else {
set_system_seccomp_filter();
}
@@ -538,9 +557,10 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode,
return true;
}
- if (GetBoolProperty(kIsolatedStorage, false)) {
- if (mount_mode == MOUNT_EXTERNAL_FULL) {
- storageSource = "/mnt/runtime/write";
+ if (GetBoolProperty(kIsolatedStorageSnapshot, GetBoolProperty(kIsolatedStorage, false))) {
+ if (mount_mode == MOUNT_EXTERNAL_FULL || mount_mode == MOUNT_EXTERNAL_LEGACY) {
+ storageSource = (mount_mode == MOUNT_EXTERNAL_FULL)
+ ? "/mnt/runtime/full" : "/mnt/runtime/write";
if (TEMP_FAILURE_RETRY(mount(storageSource.string(), "/storage",
NULL, MS_BIND | MS_REC | MS_SLAVE, NULL)) == -1) {
*error_msg = CREATE_ERROR("Failed to mount %s to /storage: %s",
@@ -1004,7 +1024,7 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids,
// alternative is to call prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that
// breaks SELinux domain transition (see b/71859146). As the result,
// privileged syscalls used below still need to be accessible in app process.
- SetUpSeccompFilter(uid);
+ SetUpSeccompFilter(uid, is_child_zygote);
if (setresuid(uid, uid, uid) == -1) {
fail_fn(CREATE_ERROR("setresuid(%d) failed: %s", uid, strerror(errno)));
@@ -1303,6 +1323,23 @@ static void com_android_internal_os_Zygote_nativeUnmountStorageOnInit(JNIEnv* en
UnmountTree("/storage");
}
+static void com_android_internal_os_Zygote_nativeInstallSeccompUidGidFilter(
+ JNIEnv* env, jclass, jint uidGidMin, jint uidGidMax) {
+ if (!g_is_security_enforced) {
+ ALOGI("seccomp disabled by setenforce 0");
+ return;
+ }
+
+ // TODO(b/111434506) install the filter
+
+ /*
+ bool installed = install_setuidgid_seccomp_filter(uidGidMin, uidGidMax);
+ if (!installed) {
+ RuntimeAbort(env, __LINE__, "Could not install setuid/setgid seccomp filter.");
+ }
+ */
+}
+
static const JNINativeMethod gMethods[] = {
{ "nativeSecurityInit", "()V",
(void *) com_android_internal_os_Zygote_nativeSecurityInit },
@@ -1316,7 +1353,9 @@ static const JNINativeMethod gMethods[] = {
{ "nativeUnmountStorageOnInit", "()V",
(void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit },
{ "nativePreApplicationInit", "()V",
- (void *) com_android_internal_os_Zygote_nativePreApplicationInit }
+ (void *) com_android_internal_os_Zygote_nativePreApplicationInit },
+ { "nativeInstallSeccompUidGidFilter", "(II)V",
+ (void *) com_android_internal_os_Zygote_nativeInstallSeccompUidGidFilter }
};
int register_com_android_internal_os_Zygote(JNIEnv* env) {
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index bd87dcc325a8..d60d1a637962 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -33,6 +33,8 @@
// Static whitelist of open paths that the zygote is allowed to keep open.
static const char* kPathWhitelist[] = {
+ "/apex/com.android.conscrypt/javalib/conscrypt.jar",
+ "/apex/com.android.media/javalib/updatable-media.jar",
"/dev/null",
"/dev/socket/zygote",
"/dev/socket/zygote_secondary",
diff --git a/core/proto/Android.bp b/core/proto/Android.bp
new file mode 100644
index 000000000000..80cc2d4cab94
--- /dev/null
+++ b/core/proto/Android.bp
@@ -0,0 +1,27 @@
+// Copyright (C) 2018 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.
+
+// C++ library for Bluetooth platform wide protobuf definitions
+cc_library_static {
+ name: "libbt-platform-protos-lite",
+ host_supported: true,
+ proto: {
+ export_proto_headers: true,
+ type: "lite",
+ },
+ srcs: [
+ "android/bluetooth/enums.proto",
+ "android/bluetooth/hci/enums.proto",
+ ],
+}
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 3e1c5a334184..f68c760a9dbb 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -27,8 +27,574 @@ enum Action {
PAGE_VISIBLE = 1;
PAGE_HIDE = 2;
+ // ACTION: Settings > Wi-Fi > [Long press network] > Connect to network
+ // SUBTYPE: true if connecting to a saved network, false if not
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_WIFI_CONNECT = 135;
+
+ // ACTION: Settings > Wi-Fi > [Long press network] > Forget network
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_WIFI_FORGET = 137;
+
+ // ACTION: Settings > Wi-Fi > Toggle off
+ // SUBTYPE: true if connected to network before toggle, false if not
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_WIFI_OFF = 138;
+
+ // ACTION: Settings > Wi-Fi > Toggle on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_WIFI_ON = 139;
+
+ // ACTION: Settings > Bluetooth > Overflow > Rename this device
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_BLUETOOTH_RENAME = 161;
+
+ // ACTION: Settings > Bluetooth > Overflow > Show received files
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_BLUETOOTH_FILES = 162;
+
+ // ACTION: DND Settings > Priority only allows > Reminder toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_ALLOW_REMINDERS = 167;
+
+ // ACTION: DND Settings > Priority only allows > Event toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_ALLOW_EVENTS = 168;
+
+ // ACTION: DND Settings > Priority only allows > Messages
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_ALLOW_MESSAGES = 169;
+
+ // ACTION: DND Settings > Priority only allows > Calls
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_ALLOW_CALLS = 170;
+
+ // ACTION: DND Settings > Priority only allows > Repeat callers toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_ALLOW_REPEAT_CALLS = 171;
+
+ // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule > Delete
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_DELETE_RULE_OK = 175;
+
+ // ACTION: Settings > More > Airplane mode toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_AIRPLANE_TOGGLE = 177;
+
+ // ACTION: Settings > Data usage > Cellular data toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_CELL_DATA_TOGGLE = 178;
+
+ // ACTION: Settings > Display > When device is rotated
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ROTATION_LOCK = 203;
+
+ // OPEN: Settings > Search > Perform search
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_SEARCH_RESULTS = 226;
+
+ // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Delete
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_FINGERPRINT_DELETE = 253;
+
+ // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Rename
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_FINGERPRINT_RENAME = 254;
+
+ // ACTION: Settings -> Developer Options -> Take bug report -> Interactive report
+ // CATEGORY: SETTINGS
+ // OS: N
+ // Interactive bug report initiated from Settings.
+ ACTION_BUGREPORT_FROM_SETTINGS_INTERACTIVE = 294;
+
+ // ACTION: Settings -> Developer Options -> Take bug report -> Full report
+ // CATEGORY: SETTINGS
+ // OS: N
+ // Interactive bug report initiated from Settings.
+ ACTION_BUGREPORT_FROM_SETTINGS_FULL = 295;
+
+ // click on collapsed conditional or clicks expand button
+ ACTION_SETTINGS_CONDITION_EXPAND = 373;
+
+ // click main area of expanded conditional
+ ACTION_SETTINGS_CONDITION_CLICK = 375;
+
+ // click a direct button on expanded conditional
+ ACTION_SETTINGS_CONDITION_BUTTON = 376;
+
+ // Action: user enable / disabled data saver using Settings
+ // OPEN: Settings -> Data Usage -> Data saver -> On/off toggle
+ // VALUE: 1 for enabled, 0 for disabled
+ // CATEGORY: SETTINGS
+ // OS: N
+ ACTION_DATA_SAVER_MODE = 394;
+
+ // User whitelisted an app for Data Saver mode; action pass package name of app
+ // Action: user enable / disabled data saver using Settings
+ // OPEN: Settings -> Data Usage -> Data saver -> Unrestricted data access > APP toggle turned on
+ // or
+ // Settings -> Apps -> APP -> Data usage -> Unrestricted data usage toggle turned on
+ // VALUE: package name of APP
+ // CATEGORY: SETTINGS
+ // OS: N
+ ACTION_DATA_SAVER_WHITELIST = 395;
+
+ // User blacklisted an app for Data Saver mode; action pass package name of app
+ // OPEN: Settings -> Apps -> APP -> Data usage -> Background data toggle turned off
+ // VALUE: package name of APP
+ // CATEGORY: SETTINGS
+ // OS: N
+ ACTION_DATA_SAVER_BLACKLIST = 396;
+
+ // ACTION: Settings -> Storage -> Manage storage -> Click Storage Manager
+ // SUBTYPE: false is off, true is on
+ ACTION_TOGGLE_STORAGE_MANAGER = 489;
+
+ // OPEN: Settings > Display -> Ambient Display
+ // CATEGORY: SETTINGS
+ ACTION_AMBIENT_DISPLAY = 495;
+
+ // ACTION: Allow Battery optimization for an app
+ APP_SPECIAL_PERMISSION_BATTERY_ALLOW = 764;
+
+ // ACTION: Deny Battery optimization for an app
+ APP_SPECIAL_PERMISSION_BATTERY_DENY = 765;
+
+ // ACTION: Enable Device Admin app
+ APP_SPECIAL_PERMISSION_ADMIN_ALLOW = 766;
+
+ // ACTION: Disable Device Admin app
+ APP_SPECIAL_PERMISSION_ADMIN_DENY = 767;
+
+ // ACTION: Allow "Do Not Disturb access" for an app
+ APP_SPECIAL_PERMISSION_DND_ALLOW = 768;
+
+ // ACTION: Deny "Do Not Disturb access" for an app
+ APP_SPECIAL_PERMISSION_DND_DENY = 769;
+
+ // ACTION: Allow "Draw over other apps" for an app
+ APP_SPECIAL_PERMISSION_APPDRAW_ALLOW = 770;
+
+ // ACTION: Deny "Display over other apps" for an app
+ APP_SPECIAL_PERMISSION_APPDRAW_DENY = 771;
+
+ // ACTION: Allow "VR helper services" for an app
+ APP_SPECIAL_PERMISSION_VRHELPER_ALLOW = 772;
+
+ // ACTION: Deny "VR helper services" for an app
+ APP_SPECIAL_PERMISSION_VRHELPER_DENY = 773;
+
+ // ACTION: Allow "Modify system settings" for an app
+ APP_SPECIAL_PERMISSION_SETTINGS_CHANGE_ALLOW = 774;
+
+ // ACTION: Deny "Modify system settings" for an app
+ APP_SPECIAL_PERMISSION_SETTINGS_CHANGE_DENY = 775;
+
+ // ACTION: Allow "Notification access" for an app
+ APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW = 776;
+
+ // ACTION: Deny "Notification access" for an app
+ APP_SPECIAL_PERMISSION_NOTIVIEW_DENY = 777;
+
+ // ACTION: "Premium SMS access" for an app - "ask user" option
+ APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK = 778;
+
+ // ACTION: "Premium SMS access" for an app - "never allow" option
+ APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY = 779;
+
+ // ACTION: "Premium SMS access" for an app - "always allow" option
+ APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW = 780;
+
+ // ACTION: Allow "Unrestricted data access" for an app
+ APP_SPECIAL_PERMISSION_UNL_DATA_ALLOW = 781;
+
+ // ACTION: Deny "Unrestricted data access" for an app
+ APP_SPECIAL_PERMISSION_UNL_DATA_DENY = 782;
+
+ // ACTION: Allow "Usage access" for an app
+ APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW = 783;
+
+ // ACTION: Deny "Usage access" for an app
+ APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY = 784;
+
+ // ACTION: "Force stop" action on an app
+ ACTION_APP_FORCE_STOP = 807;
+
+ // ACTION: Allow "Enable picture-in-picture" for an app
+ APP_PICTURE_IN_PICTURE_ALLOW = 813;
+
+ // ACTION: Create a Settings shortcut item.
+ ACTION_SETTINGS_CREATE_SHORTCUT = 829;
+
+ // ACTION: Settings advanced button is expanded
+ ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND = 834;
+
+ // ACTION: Deny "Enable picture-in-picture" for an app
+ APP_PICTURE_IN_PICTURE_DENY = 814;
+
+ // ACTION: Settings -> Display -> Theme
+ ACTION_THEME = 816;
+
+ // ACTION: Settings > About device > Build number
+ ACTION_SETTINGS_BUILD_NUMBER_PREF = 847;
+
+ // ACTION: Settings > Battery > Menu > Optimization
+ ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION = 851;
+
+ // ACTION: Settings > Battery > Menu > Apps Toggle
+ ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE = 852;
+
// ACTION: Settings > Any preference is changed
ACTION_SETTINGS_PREFERENCE_CHANGE = 853;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Available devices
+ ACTION_SETTINGS_BLUETOOTH_PAIR = 866;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Paired devices
+ ACTION_SETTINGS_BLUETOOTH_CONNECT = 867;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Connected device
+ ACTION_SETTINGS_BLUETOOTH_DISCONNECT = 868;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Error dialog
+ ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR = 869;
+
+ // ACTION: Settings > Connected devices > Bluetooth master switch Toggle
+ ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE = 870;
+
+ // ACTION: Settings > App detail > Uninstall
+ ACTION_SETTINGS_UNINSTALL_APP = 872;
+
+ // ACTION: Settings > App detail > Uninstall Device admin app
+ ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN = 873;
+
+ // ACTION: Settings > App detail > Disable app
+ ACTION_SETTINGS_DISABLE_APP = 874;
+
+ // ACTION: Settings > App detail > Enable app
+ ACTION_SETTINGS_ENABLE_APP = 875;
+
+ // ACTION: Settings > App detail > Clear data
+ ACTION_SETTINGS_CLEAR_APP_DATA = 876;
+
+ // ACTION: Settings > App detail > Clear cache
+ ACTION_SETTINGS_CLEAR_APP_CACHE = 877;
+
+ // ACTION: Logs pressing the "Clear app" button in the app info settings page for an instant
+ // app.
+ // VALUE: The package name of the app
+ ACTION_SETTINGS_CLEAR_INSTANT_APP = 923;
+
+ // OPEN: Assist Gesture training intro in Settings
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ SETTINGS_ASSIST_GESTURE_TRAINING_INTRO = 991;
+
+ // OPEN: Assist Gesture training enrolling in Settings
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ SETTINGS_ASSIST_GESTURE_TRAINING_ENROLLING = 992;
+
+ // OPEN: Assist Gesture training finished in Settings
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ SETTINGS_ASSIST_GESTURE_TRAINING_FINISHED = 993;
+
+ // ACTION: Update default app from Settings
+ ACTION_SETTINGS_UPDATE_DEFAULT_APP = 1000;
+
+ // ACTION: Settings > Wi-Fi > [Long press network] > Sign in to network
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ ACTION_WIFI_SIGNIN = 1008;
+
+ // ACTION: Settings > Notification Settings > Open application notification
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ ACTION_OPEN_APP_NOTIFICATION_SETTING = 1016;
+
+ // ACTION: Settings > App Info > Open app settings
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ ACTION_OPEN_APP_SETTING = 1017;
+
+ // ACTION: Collect PSD Signals
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ ACTION_PSD_LOADER = 1019;
+
+ // OPEN: Settings > Trampoline Intent > Settings page
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ TRAMPOLINE_SETTINGS_EVENT = 1033;
+
+ // ACTION: Logged when user tries to pair a Bluetooth device without name from Settings app
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ ACTION_SETTINGS_BLUETOOTH_PAIR_DEVICES_WITHOUT_NAMES = 1096;
+
+ // ACTION: Settings > Network & Internet > Mobile network > Network
+ // CATEGORY: SETTINGS
+ ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK = 1210;
+
+ // ACTION: DND Settings > Priority only allows > Alarms toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ALLOW_ALARMS = 1226;
+
+ // ACTION: DND Settings > Priority only allows > Media toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ALLOW_MEDIA = 1227;
+
+ // ACTION: A private dns mode been selected by user
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_PRIVATE_DNS_MODE = 1249;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Select rule ("Event") > Rule name > OK
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_MODE_RULE_NAME_CHANGE_OK = 1267;
+
+ // OPEN: Settings > Sound > Do Not Disturb > TURN ON NOW/TURN OFF NOW
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_TOGGLE_DND_BUTTON = 1268;
+
+ // ACTION: DND Settings > What to block > full screen intents
+ // SUBTYPE: false is allowed, true is blocked
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACTION_ZEN_BLOCK_FULL_SCREEN_INTENTS = 1332;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_LIGHT = 1333;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_PEEK = 1334;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_STATUS = 1335;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_BADGE = 1336;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_AMBIENT = 1337;
+
+ // ACTION: DND Settings > What to block
+ // SUBTYPE: false is allowed, true is blocked
+ // OS: P
+ ACTION_ZEN_BLOCK_NOTIFICATION_LIST = 1338;
+
+ // ACTION: DND Settings > Priority only allows > System toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ALLOW_SYSTEM = 1340;
+
+ // ACTION: Settings > Battery settings > Battery tip > App restriction tip
+ // OS: P
+ ACTION_APP_RESTRICTION_TIP = 1347;
+
+ // ACTION: Settings > Battery settings > Battery tip > High usage tip
+ // OS: P
+ ACTION_HIGH_USAGE_TIP = 1348;
+
+ // ACTION: Settings > Battery settings > Battery tip > Summary tip
+ // OS: P
+ ACTION_SUMMARY_TIP = 1349;
+
+ // ACTION: Settings > Battery settings > Battery tip > Smart battery tip
+ // OS: P
+ ACTION_SMART_BATTERY_TIP = 1350;
+
+ // ACTION: Settings > Battery settings > Battery tip > Early warning tip
+ // OS: P
+ ACTION_EARLY_WARNING_TIP = 1351;
+
+ // ACTION: Settings > Battery settings > Battery tip > Low battery tip
+ // OS: P
+ ACTION_LOW_BATTERY_TIP = 1352;
+
+ // ACTION: Settings > Battery settings > Battery tip > App restriction list shown
+ // OS: P
+ ACTION_APP_RESTRICTION_TIP_LIST = 1353;
+
+ // ACTION: Settings > Battery settings > Battery tip > High usage list shown
+ // OS: P
+ ACTION_HIGH_USAGE_TIP_LIST = 1354;
+
+ // ACTION: Settings > Battery settings > Battery tip > Open app restriction page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_APP_RESTRICTION_PAGE = 1361;
+
+ // ACTION: Settings > Battery settings > Battery tip > Restrict app
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_RESTRICT_APP = 1362;
+
+ // ACTION: Settings > Battery settings > Battery tip > Unrestrict app
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_UNRESTRICT_APP = 1363;
+
+ // ACTION: Settings > Battery settings > Battery tip > Open smart battery page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_SMART_BATTERY = 1364;
+
+ // ACTION: Settings > Battery settings > Battery tip > Turn on battery saver
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_TURN_ON_BATTERY_SAVER = 1365;
+
+ // ACTION: Settings > Anomaly receiver > Anomaly received
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ANOMALY_TRIGGERED = 1367;
+
+ // ACTION: A Settings Slice is requested
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_SETTINGS_SLICE_REQUESTED = 1371;
+
+ // ACTION: A Settings Slice is updated with new value
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_SETTINGS_SLICE_CHANGED = 1372;
+
+ // OPEN: DND onboarding activity > Ok button
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ONBOARDING_OK = 1378;
+
+ // OPEN: DND onboarding activity > Settings link
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ONBOARDING_SETTINGS = 1379;
+
+ // ACTION: Settings > Anomaly receiver > Anomaly ignored, don't show up in battery settings
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ANOMALY_IGNORED = 1387;
+
+ // ACTION: Settings > Battery settings > Battery tip > Open battery saver page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_BATTERY_SAVER_PAGE = 1388;
+
+ // ACTION: DND Settings > What to block
+ // OS: P
+ ACTION_ZEN_SOUND_ONLY = 1396;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_SOUND_AND_VIS_EFFECTS = 1397;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_SHOW_CUSTOM = 1398;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_CUSTOM = 1399;
+
+ // OPEN: DND onboarding activity > don't update button
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ONBOARDING_KEEP_CURRENT_SETTINGS = 1406;
+
+ // ACTION: Storage initialization wizard initialization choice of external/portable
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_INIT_EXTERNAL = 1407;
+
+ // ACTION: Storage initialization wizard initialization choice of internal/adoptable
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_INIT_INTERNAL = 1408;
+
+ // ACTION: Storage initialization wizard benchmark fast choice of continue
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_BENCHMARK_FAST_CONTINUE = 1409;
+
+ // ACTION: Storage initialization wizard benchmark slow choice of continue
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_BENCHMARK_SLOW_CONTINUE = 1410;
+
+ // ACTION: Storage initialization wizard benchmark slow choice of abort
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_BENCHMARK_SLOW_ABORT = 1411;
+
+ // ACTION: Storage initialization wizard migration choice of now
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_MIGRATE_NOW = 1412;
+
+ // ACTION: Storage initialization wizard migration choice of later
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_STORAGE_MIGRATE_LATER = 1413;
+
+ // OPEN: Settings > Sound > Switch a2dp devices dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_SWITCH_A2DP_DEVICES = 1415;
+
+
+ // OPEN: Settings > Sound > Switch hfp devices dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_SWITCH_HFP_DEVICES = 1416;
+
+ // ACTION: Tap & Pay -> Default Application Setting -> Use Forground
+ ACTION_NFC_PAYMENT_FOREGROUND_SETTING = 1622;
+
+ // ACTION: Tap & Pay -> Default Application Setting -> Use Default
+ ACTION_NFC_PAYMENT_ALWAYS_SETTING = 1623;
}
/**
@@ -38,15 +604,1454 @@ enum PageId {
// Unknown page. Should not be used in production code.
PAGE_UNKNOWN = 0;
+ // OPEN: Settings > Accessibility
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY = 2;
+
+ // OPEN: Settings > Accessibility > Captions
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY_CAPTION_PROPERTIES = 3;
+
+ // OPEN: Settings > Accessibility > [Service]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY_SERVICE = 4;
+
+ // OPEN: Settings > Accessibility > Color correction
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY_TOGGLE_DALTONIZER = 5;
+
+ // OPEN: Settings > Accessibility > Accessibility shortcut
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE = 6;
+
+ // OPEN: Settings > Accessibility > Magnification gestures (Renamed in O)
+ // OPEN: Settings > Accessibility > Magnification > Magnify with triple-tap
+ // OPEN: Settings > Accessibility > Magnification > Magnify with button
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 7;
+
+ // OPEN: Settings > Accounts
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCOUNT = 8;
+
+ // OPEN: Settings > Accounts > [Single Account Sync Settings]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCOUNTS_ACCOUNT_SYNC = 9;
+
+ // OPEN: Settings > Accounts > Add an account
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY = 10;
+
+ // OPEN: Settings > Cellular network settings > APNs
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APN = 12;
+
+ // OPEN: Settings > More > Cellular network settings > APNs > [Edit APN]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APN_EDITOR = 13;
+
+ // OPEN: Settings > Apps > Configure apps > App links > [App]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_APP_LAUNCH = 17;
+
+ // OPEN: Settings > Internal storage > Apps storage > [App]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_APP_STORAGE = 19;
+
+ // OPEN: Settings > Apps > [App info]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_INSTALLED_APP_DETAILS = 20;
+
+ // OPEN: Settings > Memory > App usage > [App Memory usage]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_PROCESS_STATS_DETAIL = 21;
+
+ // OPEN: Settings > Memory > App usage
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_PROCESS_STATS_UI = 23;
+
+ // OPEN: Choose Bluetooth device (ex: when sharing)
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ BLUETOOTH_DEVICE_PICKER = 25;
+
+ // OPEN: Settings > Security > Choose screen lock
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CHOOSE_LOCK_GENERIC = 27;
+
+ // OPEN: Settings > Security > Choose screen lock > Choose your password
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CHOOSE_LOCK_PASSWORD = 28;
+
+ // OPEN: Settings > Security > Choose screen lock > Choose your pattern
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CHOOSE_LOCK_PATTERN = 29;
+
+ // OPEN: Settings > Security > Choose screen lock > Confirm your password
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CONFIRM_LOCK_PASSWORD = 30;
+
+ // OPEN: Settings > Security > Choose screen lock > Confirm your pattern
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CONFIRM_LOCK_PATTERN = 31;
+
+ // OPEN: Settings > Security > Encrypt phone
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CRYPT_KEEPER = 32;
+
+ // OPEN: Settings > Security > Encrypt phone > Confirm
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ CRYPT_KEEPER_CONFIRM = 33;
+
+ // OPEN: Settings (Root page)
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DASHBOARD_SUMMARY = 35;
+
+ // OPEN: Settings > Data usage
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DATA_USAGE_SUMMARY = 37;
+
+ // OPEN: Settings > Date & time
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DATE_TIME = 38;
+
+ // OPEN: Settings > Developer options
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DEVELOPMENT = 39;
+
+ // OPEN: Settings > About phone
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DEVICEINFO = 40;
+
+ // OPEN: Settings > Internal storage
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DEVICEINFO_STORAGE = 42;
+
+ // OPEN: Settings > Display
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DISPLAY = 46;
+
+ // OPEN: Settings > Display > Daydream
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ DREAM = 47;
+
+ // OPEN: Settings > Security > Screen lock > Secure start-up
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ENCRYPTION = 48;
+
+ // OPEN: Settings > Security > Nexus Imprint
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT = 49;
+
+ // OPEN: Settings > Battery > History details
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FUELGAUGE_BATTERY_HISTORY_DETAIL = 51;
+
+ // OPEN: Settings > Battery > Battery saver
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FUELGAUGE_BATTERY_SAVER = 52;
+
+ // OPEN: Settings > Battery > [App Use details]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FUELGAUGE_POWER_USAGE_DETAIL = 53;
+
+ // OPEN: Settings > Security > SIM card lock settings
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ICC_LOCK = 56;
+
+ // OPEN: Settings > Language & input > Physical keyboard
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ INPUTMETHOD_KEYBOARD = 58;
+
+ // OPEN: Settings > Language & input > Spell checker
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ INPUTMETHOD_SPELL_CHECKERS = 59;
+
+ // OBSOLETE
+ INPUTMETHOD_SUBTYPE_ENABLER = 60;
+
+ // OPEN: Settings > Language & input > Personal dictionary
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ INPUTMETHOD_USER_DICTIONARY = 61;
+
+ // OPEN: Settings > Language & input > Add word
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ INPUTMETHOD_USER_DICTIONARY_ADD_WORD = 62;
+
+ // OPEN: Settings > Location
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ LOCATION = 63;
+
+ // OPEN: Settings > Apps
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ MANAGE_APPLICATIONS = 65;
+
+ // OPEN: Settings > Backup & reset > Factory data reset
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ MASTER_CLEAR = 66;
+
+ // OPEN: Settings > Backup & reset > Factory data reset > Confirm
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ MASTER_CLEAR_CONFIRM = 67;
+
+ // OPEN: Settings > More > Android Beam
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NFC_BEAM = 69;
+
+ // OPEN: Settings > Tap & pay
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NFC_PAYMENT = 70;
+
+ // OPEN: Settings > Sound & notification > App notifications > [App]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_APP_NOTIFICATION = 72;
+
+ // OBSOLETE
+ NOTIFICATION_REDACTION = 74;
+
+ // OPEN: Settings Widget > Notification log
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_STATION = 75;
+
+ // OPEN: Settings > Sound & notification > Do not disturb
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE = 76;
+
+
+ // OPEN: Print job notification > Print job settings
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ PRINT_JOB_SETTINGS = 78;
+
+ // OPEN: Settings > Printing > [Print Service]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ PRINT_SERVICE_SETTINGS = 79;
+
+ // OPEN: Settings > Printing
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ PRINT_SETTINGS = 80;
+
+ // OPEN: Settings > Backup & reset
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ PRIVACY = 81;
+
+ //OBSOLETE
+ PROXY_SELECTOR = 82;
+
+ // OPEN: Settings > Backup & reset > Network settings reset
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ RESET_NETWORK = 83;
+
+ // OPEN: Settings > Backup & reset > Network settings reset > Confirm
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ RESET_NETWORK_CONFIRM = 84;
+
+ // OPEN: Settings > Developer Options > Running Services
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ RUNNING_SERVICE_DETAILS = 85;
+
+ // OPEN: Settings > Security > Screen pinning
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ SCREEN_PINNING = 86;
+
+ // OPEN: Settings > Security
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ SECURITY = 87;
+
+ // OPEN: Settings > SIM cards
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ SIM = 88;
+
+ // OBSOLETE
+ TESTING = 89;
+
+ // OPEN: Settings > More > Tethering & portable hotspot
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ TETHER = 90;
+
+ // OPEN: Settings > Security > Trust agents
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ TRUST_AGENT = 91;
+
+ // OPEN: Settings > Security > Trusted credentials
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ TRUSTED_CREDENTIALS = 92;
+
+ // OPEN: Settings > Language & input > TTS output > [Engine] > Settings
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ TTS_ENGINE_SETTINGS = 93;
+
+ // OPEN: Settings > Language & input > Text-to-speech output
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ TTS_TEXT_TO_SPEECH = 94;
+
+ // OPEN: Settings > Security > Apps with usage access
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ USAGE_ACCESS = 95;
+
+ // OPEN: Settings > Users
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ USER = 96;
+
+ // OPEN: Settings > Users > [Restricted profile app & content access]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ USERS_APP_RESTRICTIONS = 97;
+
+ // OPEN: Settings > Users > [User settings]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ USER_DETAILS = 98;
+
+ // OPEN: Settings > More > VPN
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ VPN = 100;
+
+ // OPEN: Settings > Display > Choose wallpaper from
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WALLPAPER_TYPE = 101;
+
+ // OPEN: Settings > Display > Cast
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WFD_WIFI_DISPLAY = 102;
+
+ // OPEN: Settings > Wi-Fi
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WIFI = 103;
+
+ // OPEN: Settings > More > Wi-Fi Calling
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WIFI_CALLING = 105;
+
+ // OPEN: Settings > Wi-Fi > Saved networks
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WIFI_SAVED_ACCESS_POINTS = 106;
+
+ // OPEN: Settings > Wi-Fi > Advanced Wi-Fi > Wi-Fi Direct
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ WIFI_P2P = 109;
+
+ // OPEN: Settings > Apps > Configure apps > App permissions
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_ADVANCED = 130;
+
+ // OPEN: Settings > Location > Scanning
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ LOCATION_SCANNING = 131;
+
+ // OPEN: Settings > Sound & notification > App notifications
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ MANAGE_APPLICATIONS_NOTIFICATIONS = 133;
+
+ // OPEN: Settings > Sound & notification > DND > Priority only allows
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE_PRIORITY = 141;
+
+ // OPEN: Settings > Sound & notification > DND > Automatic rules
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE_AUTOMATION = 142;
+
+ // OPEN: Settings > Sound & notification > DND > [Time based rule]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144;
+
+ // OPEN: Settings > Apps > Configure apps > App links
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ MANAGE_DOMAIN_URLS = 143;
+
+ // OPEN: Settings > Sound & notification > DND > [Event rule]
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE_EVENT_RULE = 146;
+
+ // OPEN: Settings > Sound & notification > Notification access
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ACCESS = 179;
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb access
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ NOTIFICATION_ZEN_MODE_ACCESS = 180;
+
+ // OPEN: Settings > Internal storage > Apps storage
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_STORAGE_APPS = 182;
+
+ // OPEN: Settings > Security > Usage access
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_USAGE_ACCESS_DETAIL = 183;
+
+ // OPEN: Settings > Battery > Battery optimization
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_HIGH_POWER_APPS = 184;
+
+ // OPEN: Settings > Apps > Configure > Default apps > Assist & voice input
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ APPLICATIONS_MANAGE_ASSIST = 201;
+
+ // OPEN: Settings > Memory
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ PROCESS_STATS_SUMMARY = 202;
+
+ // OPEN: Settings > Apps > Configure Apps > Display over other apps
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ SYSTEM_ALERT_WINDOW_APPS = 221;
+
+ // OPEN: Settings > About phone > Legal information
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ ABOUT_LEGAL_SETTINGS = 225;
+
+
+ // OPEN: Settings > Developer options > Inactive apps
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FUELGAUGE_INACTIVE_APPS = 238;
+
+ // OPEN: Settings > Security > Nexus Imprint > Add Fingerprint
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLLING = 240;
+ // OPEN: Fingerprint Enroll > Find Sensor
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_FIND_SENSOR = 241;
+
+ // OPEN: Fingerprint Enroll > Fingerprint Enrolled!
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLL_FINISH = 242;
+
+ // OPEN: Fingerprint Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLL_INTRO = 243;
+
+ // OPEN: Fingerprint Enroll > Let's Start!
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLL_SIDECAR = 245;
+
+ // OPEN: Fingerprint Enroll SUW > Let's Start!
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLLING_SETUP = 246;
+
+ // OPEN: Fingerprint Enroll SUW > Find Sensor
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_FIND_SENSOR_SETUP = 247;
+
+ // OPEN: Fingerprint Enroll SUW > Fingerprint Enrolled!
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLL_FINISH_SETUP = 248;
+
+ // OPEN: Fingerprint Enroll SUW introduction
+ // CATEGORY: SETTINGS
+ // OS: 6.0
+ FINGERPRINT_ENROLL_INTRO_SETUP = 249;
+
+ // OPEN: Settings > Developer Options > Background Check
+ // CATEGORY: SETTINGS
+ // OS: N
+ BACKGROUND_CHECK_SUMMARY = 258;
+
+ // OPEN: Settings > Notifications > [App] > Channel Notifications
+ // CATEGORY: SETTINGS
+ // OS: N
+ NOTIFICATION_TOPIC_NOTIFICATION = 265;
+
+ // OPEN: Settings > Security > User credentials
+ // CATEGORY: Settings
+ // OS: N
+ USER_CREDENTIALS = 285;
+
+ // Logs that the user has edited the enabled VR listeners.
+ // CATEGORY: SETTINGS
+ // OS: N
+ VR_MANAGE_LISTENERS = 334;
+
+ // Settings -> Accessibility -> Click after pointer stops moving
+ // CATEGORY: SETTINGS
+ // OS: N
+ ACCESSIBILITY_TOGGLE_AUTOCLICK = 335;
+
+ // Settings -> Sound
+ // CATEGORY: SETTINGS
+ // OS: N
+ SOUND = 336;
+
+ // Settings -> Notifications -> Gear
+ // CATEGORY: SETTINGS
+ // OS: N
+ CONFIGURE_NOTIFICATION = 337;
+
+ // Settings -> Wi-Fi -> Gear
+ // CATEGORY: SETTINGS
+ // OS: N
+ CONFIGURE_WIFI = 338;
+
+ // Settings -> Display -> Display size
+ // OS: N
+ DISPLAY_SCREEN_ZOOM = 339;
+
+ // Settings -> Display -> Font size
+ // CATEGORY: SETTINGS
+ // OS: N
+ ACCESSIBILITY_FONT_SIZE = 340;
+
+ // Settings -> Data usage -> Cellular/Wi-Fi data usage
+ // CATEGORY: SETTINGS
+ // OS: N
+ DATA_USAGE_LIST = 341;
+
+ // Settings -> Data usage -> Billing cycle or DATA_USAGE_LIST -> Gear
+ // CATEGORY: SETTINGS
+ // OS: N
+ BILLING_CYCLE = 342;
+
+ // DATA_USAGE_LIST -> Any item or App info -> Data usage
+ // CATEGORY: SETTINGS
+ // OS: N
+ APP_DATA_USAGE = 343;
+
+ // Settings -> Language & input -> Language
+ // CATEGORY: SETTINGS
+ // OS: N
+ USER_LOCALE_LIST = 344;
+
+ // Settings -> Language & input -> Virtual keyboard
+ // CATEGORY: SETTINGS
+ // OS: N
+ VIRTUAL_KEYBOARDS = 345;
+
+ // Settings -> Language & input -> Physical keyboard
+ // CATEGORY: SETTINGS
+ // OS: N
+ PHYSICAL_KEYBOARDS = 346;
+
+ // Settings -> Language & input -> Virtual keyboard -> Add a virtual keyboard
+ // CATEGORY: SETTINGS
+ // OS: N
+ ENABLE_VIRTUAL_KEYBOARDS = 347;
+
+ // Settings -> Data usage -> Data Saver
+ // CATEGORY: SETTINGS
+ // OS: N
+ DATA_SAVER_SUMMARY = 348;
+
+ // Settings -> Data usage -> Data Saver -> Unrestricted data access
+ // CATEGORY: SETTINGS
+ // OS: N
+ DATA_USAGE_UNRESTRICTED_ACCESS = 349;
+
+ // Settings -> Apps -> Gear -> Special access
+ SPECIAL_ACCESS = 351;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY = 367;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification gestures (Renamed in O)
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification -> Magnify with triple-tap
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification -> Magnify with button
+ // ACTION: New magnification gesture configuration is chosen
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 368;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Font size
+ // ACTION: New font size is chosen
+ // SUBTYPE: 0 is small, 1 is default, 2 is large, 3 is largest
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY_FONT_SIZE = 369;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Display size
+ // ACTION: New display size is chosen
+ // SUBTYPE: 0 is small, 1 is default, 2 is large, 3 is larger, 4 is largest
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY_DISPLAY_SIZE = 370;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings -> TalkBack
+ // ACTION: New screen reader configuration is chosen
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER = 371;
+
+ // Airplane mode on
+ SETTINGS_CONDITION_AIRPLANE_MODE = 377;
+ // AKA Data saver on
+ SETTINGS_CONDITION_BACKGROUND_DATA = 378;
+ // Battery saver on
+ SETTINGS_CONDITION_BATTERY_SAVER = 379;
+ // Cellular data off
+ SETTINGS_CONDITION_CELLULAR_DATA = 380;
+ // Do not disturb on
+ SETTINGS_CONDITION_DND = 381;
+ // Hotspot on
+ SETTINGS_CONDITION_HOTSPOT = 382;
+ // Work profile off
+ SETTINGS_CONDITION_WORK_MODE = 383;
+
+ // Settings > Apps > Gear > Special Access > Premium SMS access
+ PREMIUM_SMS_ACCESS = 388;
+
+ // OPEN: Settings > Accounts > Work profile settings
+ // CATEGORY: SETTINGS
+ ACCOUNTS_WORK_PROFILE_SETTINGS = 401;
+
+ // Settings -> Dev options -> Convert to file encryption
+ CONVERT_FBE = 402;
+
+ // Settings -> Dev options -> Convert to file encryption -> WIPE AND CONVERT...
+ CONVERT_FBE_CONFIRM = 403;
+
+ // Settings -> Dev options -> Running services
+ RUNNING_SERVICES = 404;
+
+ // The dialog shown by 3P intent to change current webview implementation.
+ WEBVIEW_IMPLEMENTATION = 405;
+
+ // OPEN: Settings > Internal storage > Storage manager
+ // CATEGORY: SETTINGS
+ STORAGE_MANAGER_SETTINGS = 458;
+
+ // OPEN: Settings -> Gestures
+ // CATEGORY: SETTINGS
+ SETTINGS_GESTURES = 459;
+
+ // OPEN: Settings > Display > Night Light
+ // CATEGORY: SETTINGS
+ NIGHT_DISPLAY_SETTINGS = 488;
+
+ // Night Light on
+ SETTINGS_CONDITION_NIGHT_DISPLAY = 492;
+
+ // OPEN: Settings > Language & input > Personal dictionary (single locale)
+ USER_DICTIONARY_SETTINGS = 514;
+
+ // OPEN: Settings > Date & time > Select time zone
+ ZONE_PICKER = 515;
+
+ // OPEN: Settings > Security > Device administrators
+ DEVICE_ADMIN_SETTINGS = 516;
+
+ // OPEN: Settings > Security > Factory Reset Protection dialog
+ DIALOG_FRP = 528;
+
+ // OPEN: Settings > Custom list preference with confirmation message
+ DIALOG_CUSTOM_LIST_CONFIRMATION = 529;
+
+ // OPEN: Settings > APN Editor > Error dialog
+ DIALOG_APN_EDITOR_ERROR = 530;
+
+ // OPEN: Settings > Users > Edit owner info dialog
+ DIALOG_OWNER_INFO_SETTINGS = 531;
+
+ // OPEN: Settings > Security > Use one lock dialog
+ DIALOG_UNIFICATION_CONFIRMATION = 532;
+
+ // OPEN: Settings > Security > User Credential
+ DIALOG_USER_CREDENTIAL = 533;
+
+ // OPEN: Settings > Accounts > Remove account
+ DIALOG_REMOVE_USER = 534;
+
+ // OPEN: Settings > Accounts > Confirm auto sync dialog
+ DIALOG_CONFIRM_AUTO_SYNC_CHANGE = 535;
+
+ // OPEN: Settings > Apps > Dialog for running service details
+ DIALOG_RUNNIGN_SERVICE = 536;
+
+ // OPEN: Settings > Bluetooth > Rename this device
+ DIALOG_BLUETOOTH_RENAME = 538;
+
+ // OPEN: Settings > Battery optimization > details for app
+ DIALOG_HIGH_POWER_DETAILS = 540;
+
+ // OPEN: Settings > Keyboard > Show keyboard layout dialog
+ DIALOG_KEYBOARD_LAYOUT = 541;
+
+ // OPEN: Settings > WIFI Scan permission dialog
+ DIALOG_WIFI_SCAN_MODE = 543;
+
+ // OPEN: Settings > Wireless > VPN > Config dialog
+ DIALOG_LEGACY_VPN_CONFIG = 545;
+
+ // OPEN: Settings > Wireless > VPN > Config dialog for app
+ DIALOG_VPN_APP_CONFIG = 546;
+
+ // OPEN: Settings > Wireless > VPN > Cannot connect dialog
+ DIALOG_VPN_CANNOT_CONNECT = 547;
+
+ // OPEN: Settings > Wireless > VPN > Replace existing VPN dialog
+ DIALOG_VPN_REPLACE_EXISTING = 548;
+
+ // OPEN: Settings > Billing cycle > Edit billing cycle dates dialog
+ DIALOG_BILLING_CYCLE = 549;
+
+ // OPEN: Settings > Billing cycle > Edit data limit/warning dialog
+ DIALOG_BILLING_BYTE_LIMIT = 550;
+
+ // OPEN: Settings > Billing cycle > turn on data limit dialog
+ DIALOG_BILLING_CONFIRM_LIMIT = 551;
+
+ // OPEN: Settings > Service > Turn off notification access dialog
+ DIALOG_DISABLE_NOTIFICATION_ACCESS = 552;
+
+ // OPEN: Settings > Sound > Use personal sound for work profile dialog
+ DIALOG_UNIFY_SOUND_SETTINGS = 553;
+
+ // OPEN: Settings > Zen mode > Dialog warning about the zen access privileges being granted.
+ DIALOG_ZEN_ACCESS_GRANT = 554;
+
+ // OPEN: Settings > Zen mode > Dialog warning about the zen access privileges being revoked.
+ DIALOG_ZEN_ACCESS_REVOKE = 555;
+
+ // OPEN: Settings > Zen mode > Dialog that picks time for zen mode.
+ DIALOG_ZEN_TIMEPICKER = 556;
+
+ // OPEN: Settings > Apps > Dialog that informs user to allow service access for app.
+ DIALOG_SERVICE_ACCESS_WARNING = 557;
+
+ // OPEN: Settings > Apps > Dialog for app actions (such as force stop/clear data)
+ DIALOG_APP_INFO_ACTION = 558;
+
+ // OPEN: Settings > Storage > Dialog for forgetting a storage device
+ DIALOG_VOLUME_FORGET = 559;
+
+ // OPEN: Settings > Storage > Dialog for initializing a volume
+ DIALOG_VOLUME_INIT = 561;
+
+ // OPEN: Settings > Storage > Dialog for unmounting a volume
+ DIALOG_VOLUME_UNMOUNT = 562;
+
+ // OPEN: Settings > Storage > Dialog for renaming a volume
+ DIALOG_VOLUME_RENAME = 563;
+
+ // OPEN: Settings > Storage > Dialog for clear cache
+ DIALOG_STORAGE_CLEAR_CACHE = 564;
+
+ // OPEN: Settings > Storage > Dialog for system info
+ DIALOG_STORAGE_SYSTEM_INFO = 565;
+
+ // OPEN: Settings > Storage > Dialog for other info
+ DIALOG_STORAGE_OTHER_INFO = 566;
+
+ // OPEN: Settings > Storage > Dialog for user info
+ DIALOG_STORAGE_USER_INFO = 567;
+ // OPEN: Settings > Add fingerprint > Dialog when user touches fingerprint icon.
+ DIALOG_FINGERPRINT_ICON_TOUCH = 568;
+
+ // OPEN: Settings > Add fingerprint > Error dialog
+ DIALOG_FINGERPINT_ERROR = 569;
+
+ // OPEN: Settings > Fingerprint > Rename or delete dialog
+ DIALOG_FINGERPINT_EDIT = 570;
+
+ // OPEN: Settings > Fingerprint > Dialog for deleting last fingerprint
+ DIALOG_FINGERPINT_DELETE_LAST = 571;
+
+ // OPEN: SUW > Fingerprint > Dialog to confirm skip fingerprint setup entirely.
+ DIALOG_FINGERPRINT_SKIP_SETUP = 573;
+
+ // OPEN: Settings > Proxy Selector error dialog
+ DIALOG_PROXY_SELECTOR_ERROR = 574;
+
+ // OPEN: Settings > Wifi > P2P Settings > Disconnect dialog
+ DIALOG_WIFI_P2P_DISCONNECT = 575;
+
+ // OPEN: Settings > Wifi > P2P Settings > Cancel connection dialog
+ DIALOG_WIFI_P2P_CANCEL_CONNECT = 576;
+
+ // OPEN: Settings > Wifi > P2P Settings > Rename dialog
+ DIALOG_WIFI_P2P_RENAME = 577;
+
+ // OPEN: Settings > Wifi > P2P Settings > Forget group dialog
+ DIALOG_WIFI_P2P_DELETE_GROUP = 578;
+
+ // OPEN: Settings > APN > Restore default dialog
+ DIALOG_APN_RESTORE_DEFAULT = 579;
+
+ // OPEN: Settings > Encryption interstitial accessibility warning dialog
+ DIALOG_ENCRYPTION_INTERSTITIAL_ACCESSIBILITY = 581;
+
+ // OPEN: Settings > Acessibility > Enable accessiblity service dialog
+ DIALOG_ACCESSIBILITY_SERVICE_ENABLE = 583;
+
+ // OPEN: Settings > Acessibility > Disable accessiblity service dialog
+ DIALOG_ACCESSIBILITY_SERVICE_DISABLE = 584;
+
+ // OPEN: Settings > Account > Remove account dialog
+ DIALOG_ACCOUNT_SYNC_REMOVE = 585;
+
+ // OPEN: Settings > Account > Remove account failed dialog
+ DIALOG_ACCOUNT_SYNC_FAILED_REMOVAL = 586;
+
+ // OPEN: Settings > Account > Cannot do onetime sync dialog
+ DIALOG_ACCOUNT_SYNC_CANNOT_ONETIME_SYNC = 587;
+
+ // OPEN: Settings > Display > Night light > Set start time dialog
+ DIALOG_NIGHT_DISPLAY_SET_START_TIME = 588;
+
+ // OPEN: Settings > Display > Night light > Set end time dialog
+ DIALOG_NIGHT_DISPLAY_SET_END_TIME = 589;
+
+
+
+ // OPEN: Settings > User > Edit info dialog
+ DIALOG_USER_EDIT = 590;
+
+ // OPEN: Settings > User > Confirm remove dialog
+ DIALOG_USER_REMOVE = 591;
+
+ // OPEN: Settings > User > Enable calling dialog
+ DIALOG_USER_ENABLE_CALLING = 592;
+
+ // OPEN: Settings > User > Enable calling and sms dialog
+ DIALOG_USER_ENABLE_CALLING_AND_SMS = 593;
+
+ // OPEN: Settings > User > Cannot manage device message dialog
+ DIALOG_USER_CANNOT_MANAGE = 594;
+
+ // OPEN: Settings > User > Add user dialog
+ DIALOG_USER_ADD = 595;
+
+ // OPEN: Settings > User > Setup user dialog
+ DIALOG_USER_SETUP = 596;
+
+ // OPEN: Settings > User > Setup profile dialog
+ DIALOG_USER_SETUP_PROFILE = 597;
+
+ // OPEN: Settings > User > Choose user type dialog
+ DIALOG_USER_CHOOSE_TYPE = 598;
+
+ // OPEN: Settings > User > Need lockscreen dialog
+ DIALOG_USER_NEED_LOCKSCREEN = 599;
+
+ // OPEN: Settings > User > Confirm exit guest mode dialog
+ DIALOG_USER_CONFIRM_EXIT_GUEST = 600;
+
+ // OPEN: Settings > User > Edit user profile dialog
+ DIALOG_USER_EDIT_PROFILE = 601;
+
+
+ // OPEN: Settings > Wifi > Saved AP > Edit dialog
+ DIALOG_WIFI_SAVED_AP_EDIT = 602;
+
+ // OPEN: Settings > Wifi > Edit AP dialog
+ DIALOG_WIFI_AP_EDIT = 603;
+
+ // OPEN: Settings > Wifi > Write config to NFC dialog
+ DIALOG_WIFI_WRITE_NFC = 606;
+
+ // OPEN: Settings > Date > Date picker dialog
+ DIALOG_DATE_PICKER = 607;
+
+ // OPEN: Settings > Date > Time picker dialog
+ DIALOG_TIME_PICKER = 608;
+
+ // OPEN: Settings > Wireless > Manage wireless plan dialog
+ DIALOG_MANAGE_MOBILE_PLAN = 609;
+
+ // OPEN Settings > Bluetooth > Attempt to connect to device that shows dialog
+ BLUETOOTH_DIALOG_FRAGMENT = 613;
+
+ // OPEN: Settings > Security
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_SETTINGS = 628;
+
+ // OPEN: Settings > System
+ SETTINGS_SYSTEM_CATEGORY = 744;
+
+ // OPEN: Settings > Storage
+ SETTINGS_STORAGE_CATEGORY = 745;
+
+ // OPEN: Settings > Network & Internet
+ SETTINGS_NETWORK_CATEGORY = 746;
+
+ // OPEN: Settings > Connected Device
+ SETTINGS_CONNECTED_DEVICE_CATEGORY = 747;
+
+ // OPEN: Settings > App & Notification
+ SETTINGS_APP_NOTIF_CATEGORY = 748;
+
+ // OPEN: Settings > System > Language & Region
+ SETTINGS_LANGUAGE_CATEGORY = 750;
+
+ // OPEN: Settings > System > Input & Gesture > Swipe to notification gesture
+ SETTINGS_GESTURE_SWIPE_TO_NOTIFICATION = 751;
+
+ // OPEN: Settings > System > Input & Gesture > Double tap power button gesture
+ SETTINGS_GESTURE_DOUBLE_TAP_POWER = 752;
+
+ // OPEN: Settings > System > Input & Gesture > Pick up gesture
+ SETTINGS_GESTURE_PICKUP = 753;
+
+ // OPEN: Settings > System > Input & Gesture > Double tap screen gesture
+ SETTINGS_GESTURE_DOUBLE_TAP_SCREEN = 754;
+
+ // OPEN: Settings > System > Input & Gesture > Double twist gesture
+ SETTINGS_GESTURE_DOUBLE_TWIST = 755;
+
+ // OPEN: Settings > Apps > Default Apps > Default browser
+ DEFAULT_BROWSER_PICKER = 785;
+ // OPEN: Settings > Apps > Default Apps > Default emergency app
+ DEFAULT_EMERGENCY_APP_PICKER = 786;
+
+ // OPEN: Settings > Apps > Default Apps > Default home
+ DEFAULT_HOME_PICKER = 787;
+
+ // OPEN: Settings > Apps > Default Apps > Default phone
+ DEFAULT_PHONE_PICKER = 788;
+
+ // OPEN: Settings > Apps > Default Apps > Default sms
+ DEFAULT_SMS_PICKER = 789;
+
+ // OPEN: Settings > Apps > Default Apps > Warning dialog to confirm selection
+ DEFAULT_APP_PICKER_CONFIRMATION_DIALOG = 791;
+
+ // OPEN: Settings > Apps > Default Apps > Default autofill app
+ DEFAULT_AUTOFILL_PICKER = 792;
+
+ // OPEN: Settings > Apps > Gear > Special Access > Install other apps
+ // CATEGORY: SETTINGS
+ // OS: 8.0
+ MANAGE_EXTERNAL_SOURCES = 808;
+
+ // Logs that the user has edited the picture-in-picture settings.
+ // CATEGORY: SETTINGS
+ SETTINGS_MANAGE_PICTURE_IN_PICTURE = 812;
+
+ // OPEN: SUW Welcome Screen -> Vision Settings -> Select to Speak
+ // ACTION: Select to Speak configuration is chosen
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: N
+ SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK = 817;
+
+ // OPEN: Settings > System > Backup
+ // CATEGORY: SETTINGS
+ // OS: O
+ BACKUP_SETTINGS = 818;
+
+ // OPEN: Settings > Storage > Games
+ // CATEGORY: SETTINGS
+ // OS: O
+ APPLICATIONS_STORAGE_GAMES = 838;
+
+ // OPEN: Settings > Storage > Audio and Music
+ // CATEGORY: SETTINGS
+ // OS: O
+ APPLICATIONS_STORAGE_MUSIC = 839;
+
+ // ACTION: Settings > Storage > Free Up Space to launch Deletion Helper
+ // CATEGORY: SETTINGS
+ // OS: O
+ STORAGE_FREE_UP_SPACE_NOW = 840;
+
+ // ACTION: Settings > Storage > Files to open the File Manager
+ // CATEGORY: SETTINGS
+ // OS: O
+ STORAGE_FILES = 841;
+
+ // OPEN: Settings > Apps > Default Apps > Assist > Default assist
+ DEFAULT_ASSIST_PICKER = 843;
+
+ // OPEN: Settings > Apps > Default Apps > Assist > Default voice input
+ DEFAULT_VOICE_INPUT_PICKER = 844;
+
+ // OPEN: Settings > Storage > [Profile]
+ SETTINGS_STORAGE_PROFILE = 845;
+
+ // OPEN: Settings > Security & screen lock -> Encryption & crendentials
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENCRYPTION_AND_CREDENTIAL = 846;
+
+ // OPEN: Settings > Wi-Fi > Network Details (click on Access Point)
+ // CATEGORY: SETTINGS
+ // OS: O
+ WIFI_NETWORK_DETAILS = 849;
+
+ // OPEN: Settings > Wi-Fi > Wifi Preferences -> Advanced -> Network Scorer
+ // CATEGORY: SETTINGS
+ // OS: O
+ SETTINGS_NETWORK_SCORER = 861;
+
+ // OPEN: Settings > About device > Model > Hardware info dialog
+ DIALOG_SETTINGS_HARDWARE_INFO = 862;
+
+ // OPEN: Settings > Security & screen lock -> Lock screen preferences
+ // CATEGORY: SETTINGS
+ SETTINGS_LOCK_SCREEN_PREFERENCES = 882;
+
+
+ // OPEN: Settings -> Display -> When in VR Mode
+ VR_DISPLAY_PREFERENCE = 921;
+
+ // OPEN: Settings > Accessibility > Magnification
+ // CATEGORY: SETTINGS
+ // OS: O
+ ACCESSIBILITY_SCREEN_MAGNIFICATION_SETTINGS = 922;
+
+ // OPEN: Settings -> System -> Reset options
+ RESET_DASHBOARD = 924;
+
+ // OPEN: Settings > Security > Nexus Imprint > [Fingerprint] > Delete
+ // CATEGORY: SETTINGS
+ // OS: O
+ FINGERPRINT_REMOVE_SIDECAR = 934;
+
+ // OPEN: Settings > Storage > Movies & TV
+ // CATEGORY: SETTINGS
+ // OS: O
+ APPLICATIONS_STORAGE_MOVIES = 935;
+
+ // OPEN: Settings > Security > Managed Device Info > Apps installed
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_INSTALLED_APPS = 938;
+
+ // OPEN: Settings > Security > Managed Device Info > nnn permissions
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_PERMISSIONS = 939;
+
+
+ // OPEN: Settings > Security > Managed Device Info > Default apps
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_DEFAULT_APPS = 940;
+
+ // OPEN: Choose screen lock dialog in Settings
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ SETTINGS_CHOOSE_LOCK_DIALOG = 990;
+
+ // OPEN: Settings > System > Languages & input > Assist gesture
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ SETTINGS_ASSIST_GESTURE = 996;
+
// OPEN: Settings > Connected Devices > Bluetooth > (click on details link for a paired device)
BLUETOOTH_DEVICE_DETAILS = 1009;
+ // OPEN: Settings > credential pages - prompt for key guard configuration confirmation
+ CONFIGURE_KEYGUARD_DIALOG = 1010;
+
+ // OPEN: Settings > Network > Tether > Wi-Fi hotspot
+ WIFI_TETHER_SETTINGS = 1014;
+
+ // OPEN: Settings->Connected Devices->Bluetooth->(click on details link for a paired device)
+ // -> Edit name button.
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ DIALOG_BLUETOOTH_PAIRED_DEVICE_RENAME = 1015;
+
// OPEN: Settings > Connected devices > Bluetooth > Pair new device
+ // CATEGORY: SETTINGS
+ // OS: O DR
BLUETOOTH_PAIRING = 1018;
+ // OPEN: Settings->Connected Devices->Bluetooth->(click on details link for a paired device)
+ // -> Forget button.
+ // CATEGORY: SETTINGS
+ // OS: O DR
+ DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET = 1031;
+
+ // OPEN: Settings > Storage > Photos & Videos
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ APPLICATIONS_STORAGE_PHOTOS = 1092;
+
+ // OPEN: Settings > Display > Colors
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ COLOR_MODE_SETTINGS = 1143;
+
+ // OPEN: Settings > Developer Options > Experiment dashboard
+ // CATEGORY: SETTINGS
+ SETTINGS_FEATURE_FLAGS_DASHBOARD = 1217;
+
+ // OPEN: Settings > Notifications > [App] > Topic Notifications
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_CHANNEL_GROUP = 1218;
+
+ // OPEN: Settings > Developer options > Enable > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_ENABLE_DEVELOPMENT_OPTIONS = 1219;
+
+ // OPEN: Settings > Developer options > OEM unlocking > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_ENABLE_OEM_UNLOCKING = 1220;
+
+ // OPEN: Settings > Developer options > USB debugging > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_ENABLE_ADB = 1222;
+
+ // OPEN: Settings > Security > Nexus Imprint > [Fingerprint]
+ // CATEGORY: SETTINGS
+ // OS: P
+ FINGERPRINT_AUTHENTICATE_SIDECAR = 1221;
+
+ // OPEN: Settings > Developer options > Revoke USB debugging authorizations > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_CLEAR_ADB_KEYS = 1223;
+
+ // Open: Settings > Developer options > Quick setting tile config
+ // CATEGORY: SETTINGS
+ // OS: P
+ DEVELOPMENT_QS_TILE_CONFIG = 1224;
+
+ // OPEN: Settings > Developer options > Store logger data persistently on device > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_LOG_PERSIST = 1225;
+
+ // OPEN: Settings > Network & Internet > Mobile network > Wi-Fi calling
+ // CATEGORY: SETTINGS
+ // OS: P
+ WIFI_CALLING_FOR_SUB = 1230;
+
+ // Open: Settings > Dev options > Oem unlock > lock it > warning dialog.
+ // OS: P
+ DIALOG_OEM_LOCK_INFO = 1238;
+
+ // Open: Settings > System > About phone > IMEI
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_IMEI_INFO = 1240;
+
+ // OPEN: Settings > System > About Phone > Sim status
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_SIM_STATUS = 1246;
+
+ // OPEN: Settings > System > About Phone > Android Version
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_FIRMWARE_VERSION = 1247;
+
+ // OPEN: Settings > Battery(version 2)
+ // CATEGORY: SETTINGS
+ // OS: P
+ FUELGAUGE_POWER_USAGE_SUMMARY_V2 = 1263;
+
+ // OPEN: Settings > Connected devices > Connection preferences
+ // CATEGORY: SETTINGS
+ // OS: P
+ CONNECTION_DEVICE_ADVANCED = 1264;
+
+ // OPEN: Settings > Security > Screen lock gear icon
+ // CATEGORY: SETTINGS
+ // OS: P
+ SCREEN_LOCK_SETTINGS = 1265;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Delete rule (trash can icon)
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DELETE_RULE_DIALOG = 1266;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Add rule > Event/Time
+ // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Select rule ("Event") > Rule name
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_RULE_NAME_DIALOG = 1269;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Add rule
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_RULE_SELECTION_DIALOG = 1270;
+
+ // OPEN: Settings > Battery > Smart Battery
+ // CATEGORY: SETTINGS
+ // OS: P
+ FUELGAUGE_SMART_BATTERY = 1281;
+
+ // OPEN: Settings > Battery > Smart Battery > Restricted apps
+ // CATEGORY: SETTINGS
+ // OS: P
+ FUELGAUGE_RESTRICTED_APP_DETAILS = 1285;
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb > Turn on now
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_ENABLE_DIALOG = 1286;
+
+ // OPEN: Settings->Connected Devices->USB->(click on details link)
+ // CATEGORY: SETTINGS
+ // OS: P
+ USB_DEVICE_DETAILS = 1291;
+
+ // OPEN: Settings > Accessibility > Vibration
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACCESSIBILITY_VIBRATION = 1292;
+
+ // OPEN: Settings > Accessibility > Vibration > Notification vibration
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACCESSIBILITY_VIBRATION_NOTIFICATION = 1293;
+
+ // OPEN: Settings > Accessibility > Vibration > Touch vibration
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACCESSIBILITY_VIBRATION_TOUCH = 1294;
+
+ // OPEN: Settings->Developer Options->Default USB
+ // CATEGORY: SETTINGS
+ // OS: P
+ USB_DEFAULT = 1312;
+
+ // OPEN: Settings > Battery > Battery tip > Battery tip Dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ FUELGAUGE_BATTERY_TIP_DIALOG = 1323;
+
+ // OPEN: DND Settings > What to block
+ // OS: P
+ ZEN_WHAT_TO_BLOCK = 1339;
+
+ // OPEN: Settings > Sounds > Do Not Disturb > Duration
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DURATION_DIALOG = 1341;
+
+ // OPEN: Settings > Date & time > Select time zone -> Region
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_ZONE_PICKER_REGION = 1355;
+
+ // OPEN: Settings > Date & time > Select time zone -> Time Zone
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_ZONE_PICKER_TIME_ZONE = 1356;
+ // OPEN: Settings > Date & time > Select time zone -> Select UTC Offset
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_ZONE_PICKER_FIXED_OFFSET = 1357;
+
+ // OPEN: Settings > Gestures > Prevent Ringing
+ // OS: P
+ SETTINGS_PREVENT_RINGING = 1360;
+
+ // Settings > Condition > Device muted
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_CONDITION_DEVICE_MUTED = 1368;
+
+ // Settings > Condition > Device vibrate
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_CONDITION_DEVICE_VIBRATE = 1369;
+
+ // OPEN: Settings > Connected devices > previously connected devices
+ // CATEGORY: SETTINGS
+ // OS: P
+ PREVIOUSLY_CONNECTED_DEVICES = 1370;
+
+ // OPEN: Settings > Network & Internet > Wi-Fi > Wi-Fi Preferences > Turn on Wi-Fi automatically
+ // note: Wifi Scanning must be off for this dialog to show
+ // CATEGORY: SETTINGS
+ // OS: P
+ WIFI_SCANNING_NEEDED_DIALOG = 1373;
+
+ // OPEN: Settings > System > Gestures > Swipe up gesture
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_GESTURE_SWIPE_UP = 1374;
+
+ // OPEN: Settings > Storage > Dialog to format a storage volume
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_VOLUME_FORMAT = 1375;
+
+ // OPEN: DND onboarding activity
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_ZEN_ONBOARDING = 1380;
+
+ // OPEN: Settings > Display > Auto brightness
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_AUTO_BRIGHTNESS = 1381;
+
+ // OPEN: Settings > Connected Devices > Bluetooth
+ // CATEGORY: SETTINGS
+ // OS: P
+ BLUETOOTH_FRAGMENT = 1390;
+
+ // Screen: DND Settings > Notifications
+ // OS: P
+ SETTINGS_ZEN_NOTIFICATIONS = 1400;
+
+ // An event category for slices.
+ // OPEN: Slice became visible.
+ // CLOSE: Slice became invisible.
+ // ACTION: Slice was tapped.
+ SLICE = 1401;
+
+ // OPEN: Settings -> Developer Options -> Disable Bluetooth A2DP hardware
+ // offload
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_BLUETOOTH_DISABLE_A2DP_HW_OFFLOAD = 1441;
+
// OPEN: Settings homepage
SETTINGS_HOMEPAGE = 1502;
+ // OPEN: Settings > Create shortcut(widget)
+ // CATEGORY: SETTINGS
+ // OS: Q
+ SETTINGS_CREATE_SHORTCUT = 1503;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_INTRO = 1506;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_ENROLLING = 1507;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_FINISHED = 1508;
+
+ // OPEN: Face Enroll sidecar
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_SIDECAR = 1509;
+
+ // OPEN: Settings > Add face > Error dialog
+ // OS: Q
+ DIALOG_FACE_ERROR = 1510;
+
+ // OPEN: Settings > Security > Face
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE = 1511;
+
+ // OPEN: Settings > Acessibility > HearingAid pairing instructions dialog
+ // CATEGORY: SETTINGS
+ // OS: Q
+ DIALOG_ACCESSIBILITY_HEARINGAID = 1512;
+
+ // OPEN: Settings > Add face
+ // OS: Q
+ FACE_ENROLL_PREVIEW = 1554;
+
+ // OPEN: Settings > Network & Internet > Wi-Fi > Add network
+ // CATEGORY: SETTINGS
+ // OS: Q
+ SETTINGS_WIFI_ADD_NETWORK = 1556;
+
+ // OPEN: Settings > System > Input & Gesture > Reach up gesture
+ // OS: Q
+ SETTINGS_GESTURE_WAKE_LOCK_SCREEN = 1557;
+
// OPEN: Settings > System > Input & Gesture > Wake screen
SETTINGS_GESTURE_WAKE_SCREEN = 1570;
@@ -74,6 +2079,19 @@ enum PageId {
// OPEN: Settings > Privacy
TOP_LEVEL_PRIVACY = 1587;
+ // OPEN: Settings > Sound & notification > Do Not Disturb > See all exceptions >
+ // Allow apps to override
+ // CATEGORY: SETTINGS
+ // OS: Q
+ NOTIFICATION_ZEN_MODE_OVERRIDING_APPS = 1588;
+
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb > See all exceptions >
+ // Allow apps to override > Choose app
+ // CATEGORY: SETTINGS
+ // OS: Q
+ NOTIFICATION_ZEN_MODE_OVERRIDING_APP = 1589;
+
// OPEN: Settings > Developer options > Disable > Info dialog
DIALOG_DISABLE_DEVELOPMENT_OPTIONS = 1591;
@@ -85,4 +2103,80 @@ enum PageId {
// OPEN: Settings > Apps & Notifications -> Special app access -> Financial Apps Sms Access
SETTINGS_FINANCIAL_APPS_SMS_ACCESS = 1597;
+
+
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_SETTINGS = 1604;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Custom
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_SOUND_SETTINGS = 1605;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Use default Do Not Disturb behavior
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_DEFAULT_SETTINGS = 1606;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Use default Do Not Disturb behavior
+ // > Notification restriction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_NOTIFICATION_RESTRICTIONS = 1608;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Use default Do Not Disturb behavior
+ // > Notification restriction > Custom
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_VIS_EFFECTS = 1609;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Use default Do Not Disturb behavior
+ // > Notification restriction > Custom > Allow messages
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_MESSAGES = 1610;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule)
+ // > Do Not Disturb behavior > Use default Do Not Disturb behavior
+ // > Notification restriction > Custom > Allow calls
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_RULE_CALLS = 1611;
+
+ // OPEN: Settings > Sound > Do Not Disturb > Click footer link if custom settings applied
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ZEN_CUSTOM_SETTINGS_DIALOG = 1612;
+
+ // OPEN: Settings > Developer Options > Game Update Packages
+ // CATEGORY: SETTINGS
+ // OS: Q
+ SETTINGS_GUP_DASHBOARD = 1613;
+
+ // OPEN: Settings > Accessibility > Vibration > Ring vibration
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ACCESSIBILITY_VIBRATION_RING = 1620;
+
+ // OPEN: Settings > System > Input & Gesture > Skip songs
+ SETTINGS_GESTURE_SKIP = 1624;
+
+ // OPEN: Settings > System > Input & Gesture > Silence alerts
+ SETTINGS_GESTURE_SILENCE = 1625;
+
+ // OPEN: Settings > System > Input & Gesture > Tap to check
+ SETTINGS_GESTURE_TAP_SCREEN = 1626;
+
+ // OPEN: Settings > Network & internet > Click Mobile network to land on a page with a list of
+ // SIM/eSIM subscriptions.
+ MOBILE_NETWORK_LIST = 1627;
}
diff --git a/core/proto/android/app/window_configuration.proto b/core/proto/android/app/window_configuration.proto
index 2d1555298ffb..6cc1a40de873 100644
--- a/core/proto/android/app/window_configuration.proto
+++ b/core/proto/android/app/window_configuration.proto
@@ -29,4 +29,5 @@ message WindowConfigurationProto {
optional .android.graphics.RectProto app_bounds = 1;
optional int32 windowing_mode = 2;
optional int32 activity_type = 3;
+ optional .android.graphics.RectProto bounds = 4;
}
diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto
index d0c922664351..76c240ecff4d 100644
--- a/core/proto/android/bluetooth/enums.proto
+++ b/core/proto/android/bluetooth/enums.proto
@@ -41,3 +41,18 @@ enum EnableDisableReasonEnum {
ENABLE_DISABLE_REASON_USER_SWITCH = 8;
ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9;
}
+
+enum DirectionEnum {
+ DIRECTION_UNKNOWN = 0;
+ DIRECTION_OUTGOING = 1;
+ DIRECTION_INCOMING = 2;
+}
+
+// First item is the default value, other values follow Bluetooth spec definition
+enum LinkTypeEnum {
+ // Link type is at most 1 byte (0xFF), thus 0xFFF must not be a valid value
+ LINK_TYPE_UNKNOWN = 0xFFF;
+ LINK_TYPE_SCO = 0x00;
+ LINK_TYPE_ACL = 0x01;
+ LINK_TYPE_ESCO = 0x02;
+}
diff --git a/core/proto/android/bluetooth/hci/enums.proto b/core/proto/android/bluetooth/hci/enums.proto
new file mode 100644
index 000000000000..e1d96bbce68a
--- /dev/null
+++ b/core/proto/android/bluetooth/hci/enums.proto
@@ -0,0 +1,519 @@
+/*
+ * Copyright 2018 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.
+ */
+
+syntax = "proto2";
+package android.bluetooth.hci;
+
+option java_outer_classname = "BluetoothHciProtoEnums";
+option java_multiple_files = true;
+
+// HCI command opcodes (OCF+OGF) from Bluetooth 5.0 specification Vol 2, Part E, Section 7
+// Original definition: system/bt/stack/include/hcidefs.h
+enum CommandEnum {
+ // Opcode is at most 2 bytes (0xFFFF), thus 0xFFFFF must not be a valid value
+ CMD_UNKNOWN = 0xFFFFF;
+ // Link control commands 0x0400
+ CMD_INQUIRY = 0x0401;
+ CMD_INQUIRY_CANCEL = 0x0402;
+ CMD_PERIODIC_INQUIRY_MODE = 0x0403;
+ CMD_EXIT_PERIODIC_INQUIRY_MODE = 0x0404;
+ CMD_CREATE_CONNECTION = 0x0405;
+ CMD_DISCONNECT = 0x0406;
+ CMD_ADD_SCO_CONNECTION = 0x0407; // Deprecated since Bluetooth 1.2
+ CMD_CREATE_CONNECTION_CANCEL = 0x0408;
+ CMD_ACCEPT_CONNECTION_REQUEST = 0x0409;
+ CMD_REJECT_CONNECTION_REQUEST = 0x040A;
+ CMD_LINK_KEY_REQUEST_REPLY = 0x040B;
+ CMD_LINK_KEY_REQUEST_NEG_REPLY = 0x040C;
+ CMD_PIN_CODE_REQUEST_REPLY = 0x040D;
+ CMD_PIN_CODE_REQUEST_NEG_REPLY = 0x040E;
+ CMD_CHANGE_CONN_PACKET_TYPE = 0x040F;
+ CMD_AUTHENTICATION_REQUESTED = 0x0411;
+ CMD_SET_CONN_ENCRYPTION = 0x0413;
+ CMD_CHANGE_CONN_LINK_KEY = 0x0415;
+ CMD_MASTER_LINK_KEY = 0x0417;
+ CMD_RMT_NAME_REQUEST = 0x0419;
+ CMD_RMT_NAME_REQUEST_CANCEL = 0x041A;
+ CMD_READ_RMT_FEATURES = 0x041B;
+ CMD_READ_RMT_EXT_FEATURES = 0x041C;
+ CMD_READ_RMT_VERSION_INFO = 0x041D;
+ CMD_READ_RMT_CLOCK_OFFSET = 0x041F;
+ CMD_READ_LMP_HANDLE = 0x0420;
+ CMD_SETUP_ESCO_CONNECTION = 0x0428;
+ CMD_ACCEPT_ESCO_CONNECTION = 0x0429;
+ CMD_REJECT_ESCO_CONNECTION = 0x042A;
+ CMD_IO_CAPABILITY_REQUEST_REPLY = 0x042B;
+ CMD_USER_CONF_REQUEST_REPLY = 0x042C;
+ CMD_USER_CONF_VALUE_NEG_REPLY = 0x042D;
+ CMD_USER_PASSKEY_REQ_REPLY = 0x042E;
+ CMD_USER_PASSKEY_REQ_NEG_REPLY = 0x042F;
+ CMD_REM_OOB_DATA_REQ_REPLY = 0x0430;
+ CMD_REM_OOB_DATA_REQ_NEG_REPLY = 0x0433;
+ CMD_IO_CAP_REQ_NEG_REPLY = 0x0434;
+ // BEGIN: AMP commands (not used in system/bt)
+ CMD_CREATE_PHYSICAL_LINK = 0x0435;
+ CMD_ACCEPT_PHYSICAL_LINK = 0x0436;
+ CMD_DISCONNECT_PHYSICAL_LINK = 0x0437;
+ CMD_CREATE_LOGICAL_LINK = 0x0438;
+ CMD_ACCEPT_LOGICAL_LINK = 0x0439;
+ CMD_DISCONNECT_LOGICAL_LINK = 0x043A;
+ CMD_LOGICAL_LINK_CANCEL = 0x043B;
+ CMD_FLOW_SPEC_MODIFY = 0x043C;
+ // END: AMP commands
+ CMD_ENH_SETUP_ESCO_CONNECTION = 0x043D;
+ CMD_ENH_ACCEPT_ESCO_CONNECTION = 0x043E;
+ CMD_TRUNCATED_PAGE = 0x043F;
+ CMD_TRUNCATED_PAGE_CANCEL = 0x0440;
+ CMD_SET_CLB = 0x0441;
+ CMD_RECEIVE_CLB = 0x0442;
+ CMD_START_SYNC_TRAIN = 0x0443;
+ CMD_RECEIVE_SYNC_TRAIN = 0x0444;
+ CMD_REM_OOB_EXTENDED_DATA_REQ_REPLY = 0x0445; // Not currently used in system/bt
+ // Link policy commands 0x0800
+ CMD_HOLD_MODE = 0x0801;
+ CMD_SNIFF_MODE = 0x0803;
+ CMD_EXIT_SNIFF_MODE = 0x0804;
+ CMD_PARK_MODE = 0x0805;
+ CMD_EXIT_PARK_MODE = 0x0806;
+ CMD_QOS_SETUP = 0x0807;
+ CMD_ROLE_DISCOVERY = 0x0809;
+ CMD_SWITCH_ROLE = 0x080B;
+ CMD_READ_POLICY_SETTINGS = 0x080C;
+ CMD_WRITE_POLICY_SETTINGS = 0x080D;
+ CMD_READ_DEF_POLICY_SETTINGS = 0x080E;
+ CMD_WRITE_DEF_POLICY_SETTINGS = 0x080F;
+ CMD_FLOW_SPECIFICATION = 0x0810;
+ CMD_SNIFF_SUB_RATE = 0x0811;
+ // Host controller baseband commands 0x0C00
+ CMD_SET_EVENT_MASK = 0x0C01;
+ CMD_RESET = 0x0C03;
+ CMD_SET_EVENT_FILTER = 0x0C05;
+ CMD_FLUSH = 0x0C08;
+ CMD_READ_PIN_TYPE = 0x0C09;
+ CMD_WRITE_PIN_TYPE = 0x0C0A;
+ CMD_CREATE_NEW_UNIT_KEY = 0x0C0B;
+ CMD_GET_MWS_TRANS_LAYER_CFG = 0x0C0C; // Deprecated (not used in spec)
+ CMD_READ_STORED_LINK_KEY = 0x0C0D;
+ CMD_WRITE_STORED_LINK_KEY = 0x0C11;
+ CMD_DELETE_STORED_LINK_KEY = 0x0C12;
+ CMD_CHANGE_LOCAL_NAME = 0x0C13;
+ CMD_READ_LOCAL_NAME = 0x0C14;
+ CMD_READ_CONN_ACCEPT_TOUT = 0x0C15;
+ CMD_WRITE_CONN_ACCEPT_TOUT = 0x0C16;
+ CMD_READ_PAGE_TOUT = 0x0C17;
+ CMD_WRITE_PAGE_TOUT = 0x0C18;
+ CMD_READ_SCAN_ENABLE = 0x0C19;
+ CMD_WRITE_SCAN_ENABLE = 0x0C1A;
+ CMD_READ_PAGESCAN_CFG = 0x0C1B;
+ CMD_WRITE_PAGESCAN_CFG = 0x0C1C;
+ CMD_READ_INQUIRYSCAN_CFG = 0x0C1D;
+ CMD_WRITE_INQUIRYSCAN_CFG = 0x0C1E;
+ CMD_READ_AUTHENTICATION_ENABLE = 0x0C1F;
+ CMD_WRITE_AUTHENTICATION_ENABLE = 0x0C20;
+ CMD_READ_ENCRYPTION_MODE = 0x0C21; // Deprecated
+ CMD_WRITE_ENCRYPTION_MODE = 0x0C22; // Deprecated
+ CMD_READ_CLASS_OF_DEVICE = 0x0C23;
+ CMD_WRITE_CLASS_OF_DEVICE = 0x0C24;
+ CMD_READ_VOICE_SETTINGS = 0x0C25;
+ CMD_WRITE_VOICE_SETTINGS = 0x0C26;
+ CMD_READ_AUTOMATIC_FLUSH_TIMEOUT = 0x0C27;
+ CMD_WRITE_AUTOMATIC_FLUSH_TIMEOUT = 0x0C28;
+ CMD_READ_NUM_BCAST_REXMITS = 0x0C29;
+ CMD_WRITE_NUM_BCAST_REXMITS = 0x0C2A;
+ CMD_READ_HOLD_MODE_ACTIVITY = 0x0C2B;
+ CMD_WRITE_HOLD_MODE_ACTIVITY = 0x0C2C;
+ CMD_READ_TRANSMIT_POWER_LEVEL = 0x0C2D;
+ CMD_READ_SCO_FLOW_CTRL_ENABLE = 0x0C2E;
+ CMD_WRITE_SCO_FLOW_CTRL_ENABLE = 0x0C2F;
+ CMD_SET_HC_TO_HOST_FLOW_CTRL = 0x0C31;
+ CMD_HOST_BUFFER_SIZE = 0x0C33;
+ CMD_HOST_NUM_PACKETS_DONE = 0x0C35;
+ CMD_READ_LINK_SUPER_TOUT = 0x0C36;
+ CMD_WRITE_LINK_SUPER_TOUT = 0x0C37;
+ CMD_READ_NUM_SUPPORTED_IAC = 0x0C38;
+ CMD_READ_CURRENT_IAC_LAP = 0x0C39;
+ CMD_WRITE_CURRENT_IAC_LAP = 0x0C3A;
+ CMD_READ_PAGESCAN_PERIOD_MODE = 0x0C3B; // Deprecated
+ CMD_WRITE_PAGESCAN_PERIOD_MODE = 0x0C3C; // Deprecated
+ CMD_READ_PAGESCAN_MODE = 0x0C3D; // Deprecated
+ CMD_WRITE_PAGESCAN_MODE = 0x0C3E; // Deprecated
+ CMD_SET_AFH_CHANNELS = 0x0C3F;
+ CMD_READ_INQSCAN_TYPE = 0x0C42;
+ CMD_WRITE_INQSCAN_TYPE = 0x0C43;
+ CMD_READ_INQUIRY_MODE = 0x0C44;
+ CMD_WRITE_INQUIRY_MODE = 0x0C45;
+ CMD_READ_PAGESCAN_TYPE = 0x0C46;
+ CMD_WRITE_PAGESCAN_TYPE = 0x0C47;
+ CMD_READ_AFH_ASSESSMENT_MODE = 0x0C48;
+ CMD_WRITE_AFH_ASSESSMENT_MODE = 0x0C49;
+ CMD_READ_EXT_INQ_RESPONSE = 0x0C51;
+ CMD_WRITE_EXT_INQ_RESPONSE = 0x0C52;
+ CMD_REFRESH_ENCRYPTION_KEY = 0x0C53;
+ CMD_READ_SIMPLE_PAIRING_MODE = 0x0C55;
+ CMD_WRITE_SIMPLE_PAIRING_MODE = 0x0C56;
+ CMD_READ_LOCAL_OOB_DATA = 0x0C57;
+ CMD_READ_INQ_TX_POWER_LEVEL = 0x0C58;
+ CMD_WRITE_INQ_TX_POWER_LEVEL = 0x0C59;
+ CMD_READ_ERRONEOUS_DATA_RPT = 0x0C5A;
+ CMD_WRITE_ERRONEOUS_DATA_RPT = 0x0C5B;
+ CMD_ENHANCED_FLUSH = 0x0C5F;
+ CMD_SEND_KEYPRESS_NOTIF = 0x0C60;
+ CMD_READ_LOGICAL_LINK_ACCEPT_TIMEOUT = 0x0C61;
+ CMD_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT = 0x0C62;
+ CMD_SET_EVENT_MASK_PAGE_2 = 0x0C63;
+ CMD_READ_LOCATION_DATA = 0x0C64;
+ CMD_WRITE_LOCATION_DATA = 0x0C65;
+ CMD_READ_FLOW_CONTROL_MODE = 0x0C66;
+ CMD_WRITE_FLOW_CONTROL_MODE = 0x0C67;
+ CMD_READ_ENHANCED_TX_PWR_LEVEL = 0x0C68; // Not currently used in system/bt
+ CMD_READ_BE_FLUSH_TOUT = 0x0C69;
+ CMD_WRITE_BE_FLUSH_TOUT = 0x0C6A;
+ CMD_SHORT_RANGE_MODE = 0x0C6B;
+ CMD_READ_BLE_HOST_SUPPORT = 0x0C6C;
+ CMD_WRITE_BLE_HOST_SUPPORT = 0x0C6D;
+ CMD_SET_MWS_CHANNEL_PARAMETERS = 0x0C6E;
+ CMD_SET_EXTERNAL_FRAME_CONFIGURATION = 0x0C6F;
+ CMD_SET_MWS_SIGNALING = 0x0C70;
+ CMD_SET_MWS_TRANSPORT_LAYER = 0x0C71;
+ CMD_SET_MWS_SCAN_FREQUENCY_TABLE = 0x0C72;
+ CMD_SET_MWS_PATTERN_CONFIGURATION = 0x0C73;
+ CMD_SET_RESERVED_LT_ADDR = 0x0C74;
+ CMD_DELETE_RESERVED_LT_ADDR = 0x0C75;
+ CMD_WRITE_CLB_DATA = 0x0C76;
+ CMD_READ_SYNC_TRAIN_PARAM = 0x0C77;
+ CMD_WRITE_SYNC_TRAIN_PARAM = 0x0C78;
+ CMD_READ_SECURE_CONNS_SUPPORT = 0x0C79;
+ CMD_WRITE_SECURE_CONNS_SUPPORT = 0x0C7A;
+ CMD_READ_AUTHED_PAYLOAD_TIMEOUT = 0x0C7B; // Not currently used in system/bt
+ CMD_WRITE_AUTHED_PAYLOAD_TIMEOUT = 0x0C7C; // Not currently used in system/bt
+ CMD_READ_LOCAL_OOB_EXTENDED_DATA = 0x0C7D; // Not currently used in system/bt
+ CMD_READ_EXTENDED_PAGE_TIMEOUT = 0x0C7E; // Not currently used in system/bt
+ CMD_WRITE_EXTENDED_PAGE_TIMEOUT = 0x0C7F; // Not currently used in system/bt
+ CMD_READ_EXTENDED_INQUIRY_LENGTH = 0x0C80; // Not currently used in system/bt
+ CMD_WRITE_EXTENDED_INQUIRY_LENGTH = 0x0C81; // Not currently used in system/bt
+ // Informational parameter commands 0x1000
+ CMD_READ_LOCAL_VERSION_INFO = 0x1001;
+ CMD_READ_LOCAL_SUPPORTED_CMDS = 0x1002;
+ CMD_READ_LOCAL_FEATURES = 0x1003;
+ CMD_READ_LOCAL_EXT_FEATURES = 0x1004;
+ CMD_READ_BUFFER_SIZE = 0x1005;
+ CMD_READ_COUNTRY_CODE = 0x1007; // Deprecated
+ CMD_READ_BD_ADDR = 0x1009;
+ CMD_READ_DATA_BLOCK_SIZE = 0x100A;
+ CMD_READ_LOCAL_SUPPORTED_CODECS = 0x100B;
+ // Status parameter commands 0x1400
+ CMD_READ_FAILED_CONTACT_COUNTER = 0x1401;
+ CMD_RESET_FAILED_CONTACT_COUNTER = 0x1402;
+ CMD_GET_LINK_QUALITY = 0x1403;
+ CMD_READ_RSSI = 0x1405;
+ CMD_READ_AFH_CH_MAP = 0x1406;
+ CMD_READ_CLOCK = 0x1407;
+ CMD_READ_ENCR_KEY_SIZE = 0x1408;
+ CMD_READ_LOCAL_AMP_INFO = 0x1409;
+ CMD_READ_LOCAL_AMP_ASSOC = 0x140A;
+ CMD_WRITE_REMOTE_AMP_ASSOC = 0x140B;
+ CMD_GET_MWS_TRANSPORT_CFG = 0x140C; // Not currently used in system/bt
+ CMD_SET_TRIGGERED_CLK_CAPTURE = 0x140D; // Not currently used in system/bt
+ // Testing commands 0x1800
+ CMD_READ_LOOPBACK_MODE = 0x1801;
+ CMD_WRITE_LOOPBACK_MODE = 0x1802;
+ CMD_ENABLE_DEV_UNDER_TEST_MODE = 0x1803;
+ CMD_WRITE_SIMP_PAIR_DEBUG_MODE = 0x1804;
+ CMD_ENABLE_AMP_RCVR_REPORTS = 0x1807;
+ CMD_AMP_TEST_END = 0x1808;
+ CMD_AMP_TEST = 0x1809;
+ CMD_WRITE_SECURE_CONN_TEST_MODE = 0x180A; // Not currently used in system/bt
+ // BLE commands 0x2000
+ CMD_BLE_SET_EVENT_MASK = 0x2001;
+ CMD_BLE_READ_BUFFER_SIZE = 0x2002;
+ CMD_BLE_READ_LOCAL_SPT_FEAT = 0x2003;
+ CMD_BLE_WRITE_LOCAL_SPT_FEAT = 0x2004;
+ CMD_BLE_WRITE_RANDOM_ADDR = 0x2005;
+ CMD_BLE_WRITE_ADV_PARAMS = 0x2006;
+ CMD_BLE_READ_ADV_CHNL_TX_POWER = 0x2007;
+ CMD_BLE_WRITE_ADV_DATA = 0x2008;
+ CMD_BLE_WRITE_SCAN_RSP_DATA = 0x2009;
+ CMD_BLE_WRITE_ADV_ENABLE = 0x200A;
+ CMD_BLE_WRITE_SCAN_PARAMS = 0x200B;
+ CMD_BLE_WRITE_SCAN_ENABLE = 0x200C;
+ CMD_BLE_CREATE_LL_CONN = 0x200D;
+ CMD_BLE_CREATE_CONN_CANCEL = 0x200E;
+ CMD_BLE_READ_WHITE_LIST_SIZE = 0x200F;
+ CMD_BLE_CLEAR_WHITE_LIST = 0x2010;
+ CMD_BLE_ADD_WHITE_LIST = 0x2011;
+ CMD_BLE_REMOVE_WHITE_LIST = 0x2012;
+ CMD_BLE_UPD_LL_CONN_PARAMS = 0x2013;
+ CMD_BLE_SET_HOST_CHNL_CLASS = 0x2014;
+ CMD_BLE_READ_CHNL_MAP = 0x2015;
+ CMD_BLE_READ_REMOTE_FEAT = 0x2016;
+ CMD_BLE_ENCRYPT = 0x2017;
+ CMD_BLE_RAND = 0x2018;
+ CMD_BLE_START_ENC = 0x2019;
+ CMD_BLE_LTK_REQ_REPLY = 0x201A;
+ CMD_BLE_LTK_REQ_NEG_REPLY = 0x201B;
+ CMD_BLE_READ_SUPPORTED_STATES = 0x201C;
+ CMD_BLE_RECEIVER_TEST = 0x201D;
+ CMD_BLE_TRANSMITTER_TEST = 0x201E;
+ CMD_BLE_TEST_END = 0x201F;
+ CMD_BLE_RC_PARAM_REQ_REPLY = 0x2020;
+ CMD_BLE_RC_PARAM_REQ_NEG_REPLY = 0x2021;
+ CMD_BLE_SET_DATA_LENGTH = 0x2022;
+ CMD_BLE_READ_DEFAULT_DATA_LENGTH = 0x2023;
+ CMD_BLE_WRITE_DEFAULT_DATA_LENGTH = 0x2024;
+ CMD_BLE_GENERATE_DHKEY = 0x2026; // Not currently used in system/bt
+ CMD_BLE_ADD_DEV_RESOLVING_LIST = 0x2027;
+ CMD_BLE_RM_DEV_RESOLVING_LIST = 0x2028;
+ CMD_BLE_CLEAR_RESOLVING_LIST = 0x2029;
+ CMD_BLE_READ_RESOLVING_LIST_SIZE = 0x202A;
+ CMD_BLE_READ_RESOLVABLE_ADDR_PEER = 0x202B;
+ CMD_BLE_READ_RESOLVABLE_ADDR_LOCAL = 0x202C;
+ CMD_BLE_SET_ADDR_RESOLUTION_ENABLE = 0x202D;
+ CMD_BLE_SET_RAND_PRIV_ADDR_TIMOUT = 0x202E;
+ CMD_BLE_READ_MAXIMUM_DATA_LENGTH = 0x202F;
+ CMD_BLE_READ_PHY = 0x2030;
+ CMD_BLE_SET_DEFAULT_PHY = 0x2031;
+ CMD_BLE_SET_PHY = 0x2032;
+ CMD_BLE_ENH_RECEIVER_TEST = 0x2033;
+ CMD_BLE_ENH_TRANSMITTER_TEST = 0x2034;
+ CMD_BLE_SET_EXT_ADVERTISING_RANDOM_ADDRESS = 0x2035;
+ CMD_BLE_SET_EXT_ADVERTISING_PARAM = 0x2036;
+ CMD_BLE_SET_EXT_ADVERTISING_DATA = 0x2037;
+ CMD_BLE_SET_EXT_ADVERTISING_SCAN_RESP = 0x2038;
+ CMD_BLE_SET_EXT_ADVERTISING_ENABLE = 0x2039;
+ CMD_BLE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH = 0x203A;
+ CMD_BLE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 0x203B;
+ CMD_BLE_REMOVE_ADVERTISING_SET = 0x203C;
+ CMD_BLE_CLEAR_ADVERTISING_SETS = 0x203D;
+ CMD_BLE_SET_PERIODIC_ADVERTISING_PARAM = 0x203E;
+ CMD_BLE_SET_PERIODIC_ADVERTISING_DATA = 0x203F;
+ CMD_BLE_SET_PERIODIC_ADVERTISING_ENABLE = 0x2040;
+ CMD_BLE_SET_EXTENDED_SCAN_PARAMETERS = 0x2041;
+ CMD_BLE_SET_EXTENDED_SCAN_ENABLE = 0x2042;
+ CMD_BLE_EXTENDED_CREATE_CONNECTION = 0x2043;
+ CMD_BLE_PERIODIC_ADVERTISING_CREATE_SYNC = 0x2044;
+ CMD_BLE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL = 0x2045;
+ CMD_BLE_PERIODIC_ADVERTISING_TERMINATE_SYNC = 0x2046;
+ CMD_BLE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST = 0x2047;
+ CMD_BLE_RM_DEVICE_FROM_PERIODIC_ADVERTISING_LIST = 0x2048;
+ CMD_BLE_CLEAR_PERIODIC_ADVERTISING_LIST = 0x2049;
+ CMD_BLE_READ_PERIODIC_ADVERTISING_LIST_SIZE = 0x204A;
+ CMD_BLE_READ_TRANSMIT_POWER = 0x204B;
+ CMD_BLE_READ_RF_COMPENS_POWER = 0x204C;
+ CMD_BLE_WRITE_RF_COMPENS_POWER = 0x204D;
+ CMD_BLE_SET_PRIVACY_MODE = 0x204E;
+ // Vendor specific commands 0xFC00 and above
+ // Android vendor specific commands defined in
+ // https://source.android.com/devices/bluetooth/hci_requirements#vendor-specific-capabilities
+ CMD_BLE_VENDOR_CAP = 0xFD53;
+ CMD_BLE_MULTI_ADV = 0xFD54;
+ CMD_BLE_BATCH_SCAN = 0xFD56;
+ CMD_BLE_ADV_FILTER = 0xFD57;
+ CMD_BLE_TRACK_ADV = 0xFD58;
+ CMD_BLE_ENERGY_INFO = 0xFD59;
+ CMD_BLE_EXTENDED_SCAN_PARAMS = 0xFD5A;
+ CMD_CONTROLLER_DEBUG_INFO = 0xFD5B;
+ CMD_CONTROLLER_A2DP_OPCODE = 0xFD5D;
+ CMD_BRCM_SET_ACL_PRIORITY = 0xFC57;
+ // Other vendor specific commands below here
+}
+
+// HCI event codes from the Bluetooth 5.0 specification Vol 2, Part 7, Section 7
+// Original definition: system/bt/stack/include/hcidefs.h
+enum EventEnum {
+ // Event is at most 1 byte (0xFF), thus 0xFFF must not be a valid value
+ EVT_UNKNOWN = 0xFFF;
+ EVT_INQUIRY_COMP = 0x01;
+ EVT_INQUIRY_RESULT = 0x02;
+ EVT_CONNECTION_COMP = 0x03;
+ EVT_CONNECTION_REQUEST = 0x04;
+ EVT_DISCONNECTION_COMP = 0x05;
+ EVT_AUTHENTICATION_COMP = 0x06;
+ EVT_RMT_NAME_REQUEST_COMP = 0x07;
+ EVT_ENCRYPTION_CHANGE = 0x08;
+ EVT_CHANGE_CONN_LINK_KEY = 0x09;
+ EVT_MASTER_LINK_KEY_COMP = 0x0A;
+ EVT_READ_RMT_FEATURES_COMP = 0x0B;
+ EVT_READ_RMT_VERSION_COMP = 0x0C;
+ EVT_QOS_SETUP_COMP = 0x0D;
+ EVT_COMMAND_COMPLETE = 0x0E;
+ EVT_COMMAND_STATUS = 0x0F;
+ EVT_HARDWARE_ERROR = 0x10;
+ EVT_FLUSH_OCCURED = 0x11;
+ EVT_ROLE_CHANGE = 0x12;
+ EVT_NUM_COMPL_DATA_PKTS = 0x13;
+ EVT_MODE_CHANGE = 0x14;
+ EVT_RETURN_LINK_KEYS = 0x15;
+ EVT_PIN_CODE_REQUEST = 0x16;
+ EVT_LINK_KEY_REQUEST = 0x17;
+ EVT_LINK_KEY_NOTIFICATION = 0x18;
+ EVT_LOOPBACK_COMMAND = 0x19;
+ EVT_DATA_BUF_OVERFLOW = 0x1A;
+ EVT_MAX_SLOTS_CHANGED = 0x1B;
+ EVT_READ_CLOCK_OFF_COMP = 0x1C;
+ EVT_CONN_PKT_TYPE_CHANGE = 0x1D;
+ EVT_QOS_VIOLATION = 0x1E;
+ EVT_PAGE_SCAN_MODE_CHANGE = 0x1F; // Deprecated
+ EVT_PAGE_SCAN_REP_MODE_CHNG = 0x20;
+ EVT_FLOW_SPECIFICATION_COMP = 0x21;
+ EVT_INQUIRY_RSSI_RESULT = 0x22;
+ EVT_READ_RMT_EXT_FEATURES_COMP = 0x23;
+ EVT_ESCO_CONNECTION_COMP = 0x2C;
+ EVT_ESCO_CONNECTION_CHANGED = 0x2D;
+ EVT_SNIFF_SUB_RATE = 0x2E;
+ EVT_EXTENDED_INQUIRY_RESULT = 0x2F;
+ EVT_ENCRYPTION_KEY_REFRESH_COMP = 0x30;
+ EVT_IO_CAPABILITY_REQUEST = 0x31;
+ EVT_IO_CAPABILITY_RESPONSE = 0x32;
+ EVT_USER_CONFIRMATION_REQUEST = 0x33;
+ EVT_USER_PASSKEY_REQUEST = 0x34;
+ EVT_REMOTE_OOB_DATA_REQUEST = 0x35;
+ EVT_SIMPLE_PAIRING_COMPLETE = 0x36;
+ EVT_LINK_SUPER_TOUT_CHANGED = 0x38;
+ EVT_ENHANCED_FLUSH_COMPLETE = 0x39;
+ EVT_USER_PASSKEY_NOTIFY = 0x3B;
+ EVT_KEYPRESS_NOTIFY = 0x3C;
+ EVT_RMT_HOST_SUP_FEAT_NOTIFY = 0x3D;
+ EVT_BLE_META = 0x3E;
+ EVT_PHYSICAL_LINK_COMP = 0x40;
+ EVT_CHANNEL_SELECTED = 0x41;
+ EVT_DISC_PHYSICAL_LINK_COMP = 0x42;
+ EVT_PHY_LINK_LOSS_EARLY_WARNING = 0x43;
+ EVT_PHY_LINK_RECOVERY = 0x44;
+ EVT_LOGICAL_LINK_COMP = 0x45;
+ EVT_DISC_LOGICAL_LINK_COMP = 0x46;
+ EVT_FLOW_SPEC_MODIFY_COMP = 0x47;
+ EVT_NUM_COMPL_DATA_BLOCKS = 0x48;
+ EVT_AMP_TEST_START = 0x49; // Not currently used in system/bt
+ EVT_AMP_TEST_END = 0x4A; // Not currently used in system/bt
+ EVT_AMP_RECEIVER_RPT = 0x4B; // Not currently used in system/bt
+ EVT_SHORT_RANGE_MODE_COMPLETE = 0x4C;
+ EVT_AMP_STATUS_CHANGE = 0x4D;
+ EVT_SET_TRIGGERED_CLOCK_CAPTURE = 0x4E;
+ EVT_SYNC_TRAIN_CMPL = 0x4F; // Not currently used in system/bt
+ EVT_SYNC_TRAIN_RCVD = 0x50; // Not currently used in system/bt
+ EVT_CONNLESS_SLAVE_BROADCAST_RCVD = 0x51; // Not currently used in system/bt
+ EVT_CONNLESS_SLAVE_BROADCAST_TIMEOUT = 0x52; // Not currently used in system/bt
+ EVT_TRUNCATED_PAGE_CMPL = 0x53; // Not currently used in system/bt
+ EVT_SLAVE_PAGE_RES_TIMEOUT = 0x54; // Not currently used in system/bt
+ EVT_CONNLESS_SLAVE_BROADCAST_CHNL_MAP_CHANGE = 0x55; // Not currently used in system/bt
+ EVT_INQUIRY_RES_NOTIFICATION = 0x56; // Not currently used in system/bt
+ EVT_AUTHED_PAYLOAD_TIMEOUT = 0x57; // Not currently used in system/bt
+ EVT_SAM_STATUS_CHANGE = 0x58; // Not currently used in system/bt
+}
+
+// Bluetooth low energy related meta event codes
+// from the Bluetooth 5.0 specification Vol 2, Part E, Section 7.7.65
+// Original definition: system/bt/stack/include/hcidefs.h
+enum BleMetaEventEnum {
+ // BLE meta event code is at most 1 byte (0xFF), thus 0xFFF must not be a valid value
+ BLE_EVT_UNKNOWN = 0xFFF;
+ BLE_EVT_CONN_COMPLETE_EVT = 0x01;
+ BLE_EVT_ADV_PKT_RPT_EVT = 0x02;
+ BLE_EVT_LL_CONN_PARAM_UPD_EVT = 0x03;
+ BLE_EVT_READ_REMOTE_FEAT_CMPL_EVT = 0x04;
+ BLE_EVT_LTK_REQ_EVT = 0x05;
+ BLE_EVT_RC_PARAM_REQ_EVT = 0x06;
+ BLE_EVT_DATA_LENGTH_CHANGE_EVT = 0x07;
+ BLE_EVT_READ_LOCAL_P256_PUB_KEY = 0x08; // Not currently used in system/bt
+ BLE_EVT_GEN_DHKEY_CMPL = 0x09; // Not currently used in system/bt
+ BLE_EVT_ENHANCED_CONN_COMPLETE_EVT = 0x0a;
+ BLE_EVT_DIRECT_ADV_EVT = 0x0b;
+ BLE_EVT_PHY_UPDATE_COMPLETE_EVT = 0x0c;
+ BLE_EVT_EXTENDED_ADVERTISING_REPORT_EVT = 0x0D;
+ BLE_EVT_PERIODIC_ADV_SYNC_EST_EVT = 0x0E;
+ BLE_EVT_PERIODIC_ADV_REPORT_EVT = 0x0F;
+ BLE_EVT_PERIODIC_ADV_SYNC_LOST_EVT = 0x10;
+ BLE_EVT_SCAN_TIMEOUT_EVT = 0x11;
+ BLE_EVT_ADVERTISING_SET_TERMINATED_EVT = 0x12;
+ BLE_EVT_SCAN_REQ_RX_EVT = 0x13;
+ BLE_EVT_CHNL_SELECTION_ALGORITHM = 0x14; // Not currently used in system/bt
+}
+
+// HCI status code from the Bluetooth 5.0 specification Vol 2, Part D.
+// Original definition: system/bt/stack/include/hcidefs.h
+enum StatusEnum {
+ // Status is at most 1 byte (0xFF), thus 0xFFF must not be a valid value
+ STATUS_UNKNOWN = 0xFFF;
+ STATUS_SUCCESS = 0x00;
+ STATUS_ILLEGAL_COMMAND = 0x01;
+ STATUS_NO_CONNECTION = 0x02;
+ STATUS_HW_FAILURE = 0x03;
+ STATUS_PAGE_TIMEOUT = 0x04;
+ STATUS_AUTH_FAILURE = 0x05;
+ STATUS_KEY_MISSING = 0x06;
+ STATUS_MEMORY_FULL = 0x07;
+ STATUS_CONNECTION_TOUT = 0x08;
+ STATUS_MAX_NUM_OF_CONNECTIONS = 0x09;
+ STATUS_MAX_NUM_OF_SCOS = 0x0A;
+ STATUS_CONNECTION_EXISTS = 0x0B;
+ STATUS_COMMAND_DISALLOWED = 0x0C;
+ STATUS_HOST_REJECT_RESOURCES = 0x0D;
+ STATUS_HOST_REJECT_SECURITY = 0x0E;
+ STATUS_HOST_REJECT_DEVICE = 0x0F;
+ STATUS_HOST_TIMEOUT = 0x10;
+ STATUS_UNSUPPORTED_VALUE = 0x11;
+ STATUS_ILLEGAL_PARAMETER_FMT = 0x12;
+ STATUS_PEER_USER = 0x13;
+ STATUS_PEER_LOW_RESOURCES = 0x14;
+ STATUS_PEER_POWER_OFF = 0x15;
+ STATUS_CONN_CAUSE_LOCAL_HOST = 0x16;
+ STATUS_REPEATED_ATTEMPTS = 0x17;
+ STATUS_PAIRING_NOT_ALLOWED = 0x18;
+ STATUS_UNKNOWN_LMP_PDU = 0x19;
+ STATUS_UNSUPPORTED_REM_FEATURE = 0x1A;
+ STATUS_SCO_OFFSET_REJECTED = 0x1B;
+ STATUS_SCO_INTERVAL_REJECTED = 0x1C;
+ STATUS_SCO_AIR_MODE = 0x1D;
+ STATUS_INVALID_LMP_PARAM = 0x1E;
+ STATUS_UNSPECIFIED = 0x1F;
+ STATUS_UNSUPPORTED_LMP_FEATURE = 0x20;
+ STATUS_ROLE_CHANGE_NOT_ALLOWED = 0x21;
+ STATUS_LMP_RESPONSE_TIMEOUT = 0x22;
+ STATUS_LMP_STATUS_TRANS_COLLISION = 0x23;
+ STATUS_LMP_PDU_NOT_ALLOWED = 0x24;
+ STATUS_ENCRY_MODE_NOT_ACCEPTABLE = 0x25;
+ STATUS_UNIT_KEY_USED = 0x26;
+ STATUS_QOS_NOT_SUPPORTED = 0x27;
+ STATUS_INSTANT_PASSED = 0x28;
+ STATUS_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED = 0x29;
+ STATUS_DIFF_TRANSACTION_COLLISION = 0x2A;
+ STATUS_UNDEFINED_0x2B = 0x2B; // Not used
+ STATUS_QOS_UNACCEPTABLE_PARAM = 0x2C;
+ STATUS_QOS_REJECTED = 0x2D;
+ STATUS_CHAN_CLASSIF_NOT_SUPPORTED = 0x2E;
+ STATUS_INSUFFCIENT_SECURITY = 0x2F;
+ STATUS_PARAM_OUT_OF_RANGE = 0x30;
+ STATUS_UNDEFINED_0x31 = 0x31; // Not used
+ STATUS_ROLE_SWITCH_PENDING = 0x32;
+ STATUS_UNDEFINED_0x33 = 0x33;
+ STATUS_RESERVED_SLOT_VIOLATION = 0x34;
+ STATUS_ROLE_SWITCH_FAILED = 0x35;
+ STATUS_INQ_RSP_DATA_TOO_LARGE = 0x36;
+ STATUS_SIMPLE_PAIRING_NOT_SUPPORTED = 0x37;
+ STATUS_HOST_BUSY_PAIRING = 0x38;
+ STATUS_REJ_NO_SUITABLE_CHANNEL = 0x39;
+ STATUS_CONTROLLER_BUSY = 0x3A;
+ STATUS_UNACCEPT_CONN_INTERVAL = 0x3B;
+ STATUS_ADVERTISING_TIMEOUT = 0x3C;
+ STATUS_CONN_TOUT_DUE_TO_MIC_FAILURE = 0x3D;
+ STATUS_CONN_FAILED_ESTABLISHMENT = 0x3E;
+ STATUS_MAC_CONNECTION_FAILED = 0x3F;
+ STATUS_LT_ADDR_ALREADY_IN_USE = 0x40;
+ STATUS_LT_ADDR_NOT_ALLOCATED = 0x41;
+ STATUS_CLB_NOT_ENABLED = 0x42;
+ STATUS_CLB_DATA_TOO_BIG = 0x43;
+ STATUS_OPERATION_CANCELED_BY_HOST = 0x44; // Not currently used in system/bt
+}
diff --git a/core/proto/android/bluetooth/hfp/enums.proto b/core/proto/android/bluetooth/hfp/enums.proto
new file mode 100644
index 000000000000..d286e4b64d67
--- /dev/null
+++ b/core/proto/android/bluetooth/hfp/enums.proto
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018 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.
+ */
+
+syntax = "proto2";
+package android.bluetooth.hfp;
+
+option java_outer_classname = "BluetoothHfpProtoEnums";
+option java_multiple_files = true;
+
+enum ScoCodec {
+ SCO_CODEC_UNKNOWN = 0;
+ SCO_CODEC_CVSD = 1;
+ // Default codec behind Wide Band Speech
+ SCO_CODEC_MSBC = 2;
+} \ No newline at end of file
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index 8f7570ed0a4a..eedd5d9e4b09 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -436,11 +436,19 @@ message GlobalSettingsProto {
// Ordered GPU debug layer list for GLES
// i.e. <layer1>:<layer2>:...:<layerN>
optional SettingProto debug_layers_gles = 7;
- // Apps opt in to load graphics driver from Game Update Package
- // instead of native graphcis driver through developer options.
- optional SettingProto gup_dev_opt_in_apps = 8;
- // Apps on the black list that are forbidden to useGame Update Package.
- optional SettingProto gup_black_list = 9;
+ // GUP - Game Update Package global preference for all Apps
+ // 0 = Default
+ // 1 = All Apps use Game Update Package
+ // 2 = All Apps use system graphics driver
+ optional SettingProto gup_dev_all_apps = 8;
+ // GUP - List of Apps selected to use Game Update Package
+ // i.e. <pkg1>,<pkg2>,...,<pkgN>
+ optional SettingProto gup_dev_opt_in_apps = 9;
+ // GUP - List of Apps selected not to use Game Update Package
+ // i.e. <pkg1>,<pkg2>,...,<pkgN>
+ optional SettingProto gup_dev_opt_out_apps = 10;
+ // GUP - List of Apps that are forbidden to use Game Update Package
+ optional SettingProto gup_blacklist = 11;
}
optional Gpu gpu = 59;
@@ -558,6 +566,8 @@ message GlobalSettingsProto {
// ringer mode.
optional SettingProto mode_ringer = 75 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto apply_ramping_ringer = 147 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
message MultiSim {
option (android.msg_privacy).dest = DEST_EXPLICIT;
@@ -1017,7 +1027,9 @@ message GlobalSettingsProto {
optional SettingProto zram_enabled = 139 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto app_ops_constants = 148 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 147;
+ // Next tag = 149;
}
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 0e052fe8d4b1..4bfd4d236abb 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -182,6 +182,7 @@ message SecureSettingsProto {
optional SettingProto pulse_on_pick_up = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto pulse_on_long_press = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto pulse_on_double_tap = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto pulse_on_tap = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
optional Doze doze = 21;
@@ -525,7 +526,10 @@ message SecureSettingsProto {
}
optional Zen zen = 71;
+ optional SettingProto skip_gesture_enabled = 74 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto silence_gesture_enabled = 75 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 74;
+ // Next tag = 76;
}
diff --git a/core/proto/android/server/connectivity/data_stall_event.proto b/core/proto/android/server/connectivity/data_stall_event.proto
new file mode 100644
index 000000000000..b70bb677d7a0
--- /dev/null
+++ b/core/proto/android/server/connectivity/data_stall_event.proto
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+syntax = "proto2";
+
+package com.android.server.connectivity;
+option java_multiple_files = true;
+option java_outer_classname = "DataStallEventProto";
+
+enum ProbeResult {
+ UNKNOWN = 0;
+ VALID = 1;
+ INVALID = 2;
+ PORTAL = 3;
+}
+
+enum ApBand {
+ AP_BAND_UNKNOWN = 0;
+ AP_BAND_2GHZ = 1;
+ AP_BAND_5GHZ = 2;
+}
+
+// Refer to definition in ServiceState.java.
+enum RadioTech {
+ RADIO_TECHNOLOGY_UNKNOWN = 0;
+ RADIO_TECHNOLOGY_GPRS = 1;
+ RADIO_TECHNOLOGY_EDGE = 2;
+ RADIO_TECHNOLOGY_UMTS = 3;
+ RADIO_TECHNOLOGY_IS95A = 4;
+ RADIO_TECHNOLOGY_IS95B = 5;
+ RADIO_TECHNOLOGY_1xRTT = 6;
+ RADIO_TECHNOLOGY_EVDO_0 = 7;
+ RADIO_TECHNOLOGY_EVDO_A = 8;
+ RADIO_TECHNOLOGY_HSDPA = 9;
+ RADIO_TECHNOLOGY_HSUPA = 10;
+ RADIO_TECHNOLOGY_HSPA = 11;
+ RADIO_TECHNOLOGY_EVDO_B = 12;
+ RADIO_TECHNOLOGY_EHRPD = 13;
+ RADIO_TECHNOLOGY_LTE = 14;
+ RADIO_TECHNOLOGY_HSPAP = 15;
+ RADIO_TECHNOLOGY_GSM = 16;
+ RADIO_TECHNOLOGY_TD_SCDMA = 17;
+ RADIO_TECHNOLOGY_IWLAN = 18;
+ RADIO_TECHNOLOGY_LTE_CA = 19;
+ RADIO_TECHNOLOGY_NR = 20;
+}
+
+// Cellular specific information.
+message CellularData {
+ // Indicate the radio technology at the time of data stall suspected.
+ optional RadioTech rat_type = 1;
+ // True if device is in roaming network at the time of data stall suspected.
+ optional bool is_roaming = 2;
+ // Registered network MccMnc when data stall happen
+ optional string network_mccmnc = 3;
+ // Indicate the SIM card carrier.
+ optional string sim_mccmnc = 4;
+ // Signal strength level at the time of data stall suspected.
+ optional int32 signal_strength = 5;
+}
+
+// Wifi specific information.
+message WifiData {
+ // Signal strength at the time of data stall suspected.
+ // RSSI range is between -55 to -110.
+ optional int32 signal_strength = 1;
+ // AP band.
+ optional ApBand wifi_band = 2;
+}
+
+message DnsEvent {
+ // The dns return code.
+ repeated int32 dns_return_code = 1;
+ // Indicate the timestamp of the dns event.
+ repeated int64 dns_time = 2;
+} \ No newline at end of file
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 0ec8c1ada47e..7f3ea7a249ba 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -403,18 +403,23 @@ message StateControllerProto {
optional bool is_charging = 1;
optional bool is_in_parole = 2;
+ // List of UIDs currently in the foreground.
+ repeated int32 foreground_uids = 3;
+
message TrackedJob {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional JobStatusShortInfoProto info = 1;
optional int32 source_uid = 2;
optional JobStatusDumpProto.Bucket effective_standby_bucket = 3;
- optional bool has_quota = 4;
+ // If the job started while the app was in the TOP state.
+ optional bool is_top_started_job = 4;
+ optional bool has_quota = 5;
// The amount of time that this job has remaining in its quota. This
// can be negative if the job is out of quota.
- optional int64 remaining_quota_ms = 5;
+ optional int64 remaining_quota_ms = 6;
}
- repeated TrackedJob tracked_jobs = 3;
+ repeated TrackedJob tracked_jobs = 4;
message Package {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -456,7 +461,7 @@ message StateControllerProto {
repeated TimingSession saved_sessions = 3;
}
- repeated PackageStats package_stats = 4;
+ repeated PackageStats package_stats = 5;
}
message StorageController {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/location/enums.proto b/core/proto/android/server/location/enums.proto
index b6dc58932ce7..943ff181fe14 100644
--- a/core/proto/android/server/location/enums.proto
+++ b/core/proto/android/server/location/enums.proto
@@ -28,3 +28,105 @@ enum GpsSignalQualityEnum {
GPS_SIGNAL_QUALITY_POOR = 0;
GPS_SIGNAL_QUALITY_GOOD = 1;
}
+
+// A type which distinguishes different categories of NI request, such as VOICE, UMTS_SUPL etc.
+enum GnssNiType {
+ VOICE = 1;
+ UMTS_SUPL = 2;
+ UMTS_CTRL_PLANE = 3;
+ EMERGENCY_SUPL = 4;
+};
+
+// GNSS NI responses, used to define the response in NI structures.
+enum GnssUserResponseType {
+ RESPONSE_ACCEPT = 1;
+ RESPONSE_DENY = 2;
+ RESPONSE_NORESP = 3;
+};
+
+// GNSS NI data encoding scheme.
+enum GnssNiEncodingType {
+ ENC_NONE = 0;
+ ENC_SUPL_GSM_DEFAULT = 1;
+ ENC_SUPL_UTF8 = 2;
+ ENC_SUPL_UCS2 = 3;
+ ENC_UNKNOWN = -1;
+};
+
+// Protocol stack that initiated the non-framework location request.
+enum NfwProtocolStack {
+ // Cellular control plane requests.
+ CTRL_PLANE = 0;
+ // All types of SUPL requests.
+ SUPL = 1;
+ // All types of requests from IMS.
+ IMS = 10;
+ // All types of requests from SIM.
+ SIM = 11;
+ // Requests from other protocol stacks.
+ OTHER_PROTOCOL_STACK = 100;
+};
+
+// Source initiating/receiving the location information.
+enum NfwRequestor {
+ // Wireless service provider.
+ CARRIER = 0;
+ // Device manufacturer.
+ OEM = 10;
+ // Modem chipset vendor.
+ MODEM_CHIPSET_VENDOR = 11;
+ // GNSS chipset vendor.
+ GNSS_CHIPSET_VENDOR = 12;
+ // Other chipset vendor.
+ OTHER_CHIPSET_VENDOR = 13;
+ // Automobile client.
+ AUTOMOBILE_CLIENT = 20;
+ // Other sources.
+ OTHER_REQUESTOR = 100;
+};
+
+// Indicates whether location information was provided for this request.
+enum NfwResponseType {
+ // Request rejected because framework has not given permission for this use case.
+ REJECTED = 0;
+ // Request accepted but could not provide location because of a failure.
+ ACCEPTED_NO_LOCATION_PROVIDED = 1;
+ // Request accepted and location provided.
+ ACCEPTED_LOCATION_PROVIDED = 2;
+};
+
+// The SUPL mode.
+enum SuplMode {
+ // Mobile Station Based.
+ MSB = 0x01;
+ // Mobile Station Assisted.
+ MSA = 0x02;
+};
+
+// Enum that hold the bit masks for various LTE Positioning Profile settings (LPP_PROFILE
+// configuration parameter). If none of the bits in the enum are set, the default setting is
+// Radio Resource Location Protocol(RRLP).
+enum LppProfile {
+ // Enable LTE Positioning Protocol user plane.
+ USER_PLANE = 0x01;
+ // Enable LTE Positioning Protocol Control plane.
+ CONTROL_PLANE = 0x02;
+};
+
+// Positioning protocol on A-Glonass system.
+enum GlonassPosProtocol {
+ // Radio Resource Control(RRC) control-plane.
+ RRC_CPLANE = 0x01;
+ // Radio Resource Location user-plane.
+ RRLP_CPLANE = 0x02;
+ // LTE Positioning Protocol User plane.
+ LPP_UPLANE = 0x04;
+};
+
+// Configurations of how GPS functionalities should be locked when user turns off GPS On setting.
+enum GpsLock {
+ // Lock Mobile Originated GPS functionalitues.
+ MO = 0x01;
+ // Lock Network Initiated GPS functionalities.
+ NI = 0x02;
+};
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
index 4ecf52ce5012..7f96d701cdbf 100644
--- a/core/proto/android/service/package.proto
+++ b/core/proto/android/service/package.proto
@@ -111,6 +111,7 @@ message PackageProto {
optional EnabledState enabled_state = 7;
optional string last_disabled_app_caller = 8;
optional string suspending_package = 9;
+ optional int32 distraction_flags = 10;
}
// Name of package. e.g. "com.android.providers.telephony".
diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto
index 71ebcc1e3659..da801ffcc99a 100644
--- a/core/proto/android/service/procstats.proto
+++ b/core/proto/android/service/procstats.proto
@@ -43,7 +43,7 @@ message ProcessStatsServiceDumpProto {
* Data model from /frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
* This proto is defined based on the writeToParcel method.
*
- * Next Tag: 10
+ * Next Tag: 11
*/
message ProcessStatsSectionProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -76,6 +76,9 @@ message ProcessStatsSectionProto {
}
repeated Status status = 7;
+ // Number of pages available of various types and sizes, representation fragmentation.
+ repeated ProcessStatsAvailablePagesProto available_pages = 10;
+
// Stats for each process.
repeated ProcessStatsProto process_stats = 8;
@@ -83,6 +86,24 @@ message ProcessStatsSectionProto {
repeated ProcessStatsPackageProto package_stats = 9;
}
+// Next Tag: 5
+message ProcessStatsAvailablePagesProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Node these pages are in (as per /proc/pagetypeinfo)
+ optional int32 node = 1;
+
+ // Zone these pages are in (as per /proc/pagetypeinfo)
+ optional string zone = 2;
+
+ // Label for the type of these pages (as per /proc/pagetypeinfo)
+ optional string label = 3;
+
+ // Distribution of number of pages available by order size. First entry in array is
+ // order 0, second is order 1, etc. Each order increase is a doubling of page size.
+ repeated int32 pages_per_order = 4;
+}
+
// Next Tag: 10
message ProcessStatsStateProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/stats/docsui/docsui_enums.proto b/core/proto/android/stats/docsui/docsui_enums.proto
index 6cb606ad1cab..655b5e326019 100644
--- a/core/proto/android/stats/docsui/docsui_enums.proto
+++ b/core/proto/android/stats/docsui/docsui_enums.proto
@@ -33,13 +33,14 @@ enum MimeType {
MIME_UNKNOWN = 0;
MIME_NONE = 1;
MIME_ANY = 2;
- MIME_AUDIO = 3;
- MIME_IMAGE = 4;
- MIME_MESSAGE = 5;
- MIME_MULTIPART = 6;
- MIME_TEXT = 7;
- MIME_VIDEO = 8;
- MIME_OTHER = 9;
+ MIME_APPLICATION = 3;
+ MIME_AUDIO = 4;
+ MIME_IMAGE = 5;
+ MIME_MESSAGE = 6;
+ MIME_MULTIPART = 7;
+ MIME_TEXT = 8;
+ MIME_VIDEO = 9;
+ MIME_OTHER = 10;
}
enum Root {
@@ -163,6 +164,8 @@ enum UserAction {
ACTION_EXTRACT_TO = 29;
ACTION_VIEW_IN_APPLICATION = 30;
ACTION_INSPECTOR = 31;
+ ACTION_SEARCH_CHIP = 32;
+ ACTION_SEARCH_HISTORY = 33;
}
enum InvalidScopedAccess {
@@ -172,3 +175,20 @@ enum InvalidScopedAccess {
SCOPED_DIR_ACCESS_ERROR = 3;
SCOPED_DIR_ACCESS_DEPRECATED = 4;
}
+
+enum SearchType {
+ TYPE_UNKNOWN = 0;
+ TYPE_CHIP_IMAGES = 1;
+ TYPE_CHIP_AUDIOS = 2;
+ TYPE_CHIP_VIDEOS = 3;
+ TYPE_CHIP_DOCS = 4;
+ TYPE_SEARCH_HISTORY = 5;
+ TYPE_SEARCH_STRING = 6;
+}
+
+enum SearchMode {
+ SEARCH_UNKNOWN = 0;
+ SEARCH_KEYWORD = 1;
+ SEARCH_CHIPS = 2;
+ SEARCH_KEYWORD_N_CHIPS = 3;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index e93851fe36d3..2212e098f43b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -52,6 +52,7 @@
<protected-broadcast android:name="android.intent.action.PACKAGE_VERIFIED" />
<protected-broadcast android:name="android.intent.action.PACKAGES_SUSPENDED" />
<protected-broadcast android:name="android.intent.action.PACKAGES_UNSUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.DISTRACTING_PACKAGES_CHANGED" />
<protected-broadcast android:name="android.intent.action.ACTION_PREFERRED_ACTIVITY_CHANGED" />
<protected-broadcast android:name="android.intent.action.UID_REMOVED" />
<protected-broadcast android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
@@ -1216,6 +1217,7 @@
<!-- Used for permissions that are associated with activity recognition.
TODO(zezeozue). STOPSHIP: Add icon -->
<permission-group android:name="android.permission-group.ACTIVITY_RECOGNITION"
+ android:icon="@drawable/perm_group_activity_recognition"
android:label="@string/permgrouplab_activityRecognition"
android:description="@string/permgroupdesc_activityRecognition"
android:request="@string/permgrouprequest_activityRecognition"
@@ -2244,8 +2246,9 @@
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
android:protectionLevel="signature|installer" />
- <!-- @SystemApi Allows an application to start an activity within its managed profile from
- the personal profile.
+ <!-- @SystemApi Allows an application to start its own activities, but on a different profile
+ associated with the user. For example, an application running on the main profile of a user
+ can start an activity on a managed profile of that user.
This permission is not available to third party applications.
@hide -->
<permission android:name="android.permission.INTERACT_ACROSS_PROFILES"
@@ -2292,7 +2295,7 @@
<!-- @SystemApi @TestApi @hide Allows an application to create/manage/remove stacks -->
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @TestApi @hide Allows an application to embed other activities -->
<permission android:name="android.permission.ACTIVITY_EMBEDDING"
@@ -2304,6 +2307,11 @@
<permission android:name="android.permission.START_ANY_ACTIVITY"
android:protectionLevel="signature" />
+ <!-- Allows an application to start activities from background
+ @hide -->
+ <permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"
+ android:protectionLevel="signature|privileged|vendorPrivileged|oem" />
+
<!-- @SystemApi Must be required by activities that handle the intent action
{@link Intent#ACTION_SEND_SHOW_SUSPENDED_APP_DETAILS}. This is for use by apps that
hold {@link Manifest.permission#SUSPEND_APPS} to interact with the system.
@@ -2562,6 +2570,16 @@
<permission android:name="android.permission.WRITE_GSERVICES"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi @hide Allows an application to modify config settings.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.WRITE_DEVICE_CONFIG"
+ android:protectionLevel="signature|configurator"/>
+
+ <!-- @SystemApi @hide Allows an application to read config settings.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.READ_DEVICE_CONFIG"
+ android:protectionLevel="signature|preinstalled" />
+
<!-- @SystemApi @TestApi Allows an application to call
{@link android.app.ActivityManager#forceStopPackage}.
@hide -->
@@ -3075,6 +3093,15 @@
<permission android:name="android.permission.BIND_TEXT_SERVICE"
android:protectionLevel="signature" />
+ <!-- @SystemApi Must be required by a AttentionService
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature
+ @hide
+ -->
+ <permission android:name="android.permission.BIND_ATTENTION_SERVICE"
+ android:protectionLevel="signature" />
+ <uses-permission android:name="android.permission.BIND_ATTENTION_SERVICE" />
+
<!-- Must be required by a {@link android.net.VpnService},
to ensure that only the system can bind to it.
<p>Protection level: signature
@@ -3226,9 +3253,10 @@
<!-- @SystemApi Required to add or remove another application as a device admin.
<p>Not for use by third-party applications.
- @hide -->
+ @hide
+ @removed -->
<permission android:name="android.permission.MANAGE_DEVICE_ADMINS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an app to reset the device password.
<p>Not for use by third-party applications.
@@ -3550,19 +3578,25 @@
<permission android:name="android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to provide remote displays.
+ <p>Not for use by third-party applications.</p>
+ @hide -->
+ <permission android:name="android.permission.REMOTE_DISPLAY_PROVIDER"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an application to capture video output.
<p>Not for use by third-party applications.</p>
@hide
@removed -->
<permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature" />
<!-- Allows an application to capture secure video output.
<p>Not for use by third-party applications.</p>
@hide
@removed -->
<permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature" />
<!-- Allows an application to know what content is playing and control its playback.
<p>Not for use by third-party applications due to privacy of media consumption</p> -->
@@ -3897,7 +3931,7 @@
<!-- @SystemApi @hide Allows managing apk level rollbacks. -->
<permission android:name="android.permission.MANAGE_ROLLBACKS"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|verifier" />
<!-- @SystemApi @hide Allows an application to mark other applications as harmful -->
<permission android:name="android.permission.SET_HARMFUL_APP_WARNINGS"
@@ -3942,7 +3976,8 @@
<permission android:name="android.permission.ACCESS_NOTIFICATIONS"
android:protectionLevel="signature|privileged|appop" />
- <!-- Marker permission for applications that wish to access notification policy.
+ <!-- Marker permission for applications that wish to access notification policy. This permission
+ is not supported on managed profiles.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"
@@ -4290,6 +4325,16 @@
<permission android:name="android.permission.MANAGE_CONTENT_CAPTURE"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an application to manage the content suggestions service.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
+ android:protectionLevel="signature" />
+
+ <!-- @SystemApi Allows an application to manage the app predictions service.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.MANAGE_APP_PREDICTIONS"
+ android:protectionLevel="signature" />
+
<!-- Allows an app to set the theme overlay in /vendor/overlay
being used.
@hide <p>Not for use by third-party applications.</p> -->
@@ -4370,6 +4415,11 @@
<permission android:name="android.permission.BIND_SMS_APP_SERVICE"
android:protectionLevel="signature" />
+ <!-- @hide Permission that allows configuring appops.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.MANAGE_APPOPS"
+ android:protectionLevel="signature" />
+
<!-- @hide Permission that allows background clipboard access.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_CLIPBOARD_IN_BACKGROUND"
@@ -4751,6 +4801,11 @@
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
+ <service android:name="com.android.server.ZramWriteback"
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
<service android:name="com.android.server.backup.FullBackupJob"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" >
diff --git a/core/res/res/drawable/ic_account_circle.xml b/core/res/res/drawable/ic_account_circle.xml
index f7317dbc5245..71691add7322 100644
--- a/core/res/res/drawable/ic_account_circle.xml
+++ b/core/res/res/drawable/ic_account_circle.xml
@@ -14,18 +14,14 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48.0dp"
- android:height="48.0dp"
- android:viewportWidth="20.0"
- android:viewportHeight="20.0">
- <group
- android:translateX="-2"
- android:translateY="-2" >
- <path
- android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33C4.62,15.49 4,13.82 4,12c0,-4.41 3.59,-8 8,-8c4.41,0 8,3.59 8,8C20,13.82 19.38,15.49 18.36,16.83z"
- android:fillColor="#FFFFFFFF" />
- <path
- android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13c1.94,0 3.5,-1.56 3.5,-3.5S13.94,6 12,6z"
- android:fillColor="#FFFFFFFF" />
- </group>
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33C4.62,15.49 4,13.82 4,12c0,-4.41 3.59,-8 8,-8c4.41,0 8,3.59 8,8C20,13.82 19.38,15.49 18.36,16.83z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13c1.94,0 3.5,-1.56 3.5,-3.5S13.94,6 12,6z"/>
</vector>
diff --git a/core/res/res/drawable/ic_battery.xml b/core/res/res/drawable/ic_battery.xml
new file mode 100644
index 000000000000..bd40f4df505e
--- /dev/null
+++ b/core/res/res/drawable/ic_battery.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
+ android:tint="?android:attr/colorControlNormal">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4z"/>
+</vector>
diff --git a/core/res/res/drawable/ic_corp_badge.xml b/core/res/res/drawable/ic_corp_badge.xml
index 1dad9776851e..5ab504528366 100644
--- a/core/res/res/drawable/ic_corp_badge.xml
+++ b/core/res/res/drawable/ic_corp_badge.xml
@@ -15,22 +15,11 @@ Copyright (C) 2018 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="20dp"
- android:height="20dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
<path
- android:fillType="evenOdd"
- android:strokeColor="#1A73E8"
- android:strokeWidth="4"
- android:pathData="M 24 2 C 36.1502644963 2 46 11.8497355037 46 24 C 46 36.1502644963 36.1502644963 46 24 46 C 11.8497355037 46 2 36.1502644963 2 24 C 2 11.8497355037 11.8497355037 2 24 2 Z" />
- <group
- android:translateX="10.400000"
- android:translateY="10.400000">
- <path
- android:fillColor="#1A73E8"
- android:strokeWidth="1"
- android:pathData="M24.2971429,5.38947368 L18.9485714,5.38947368 L18.9485714,2.80902256 C18.9485714,1.37687218 17.7585143,0.228571429 16.2742857,0.228571429 L10.9257143,0.228571429 C9.44148571,0.228571429 8.25142857,1.37687218 8.25142857,2.80902256 L8.25142857,5.38947368 L2.90285714,5.38947368 C1.41862857,5.38947368 0.241942857,6.53777444 0.241942857,7.96992481 L0.228571429,22.162406 C0.228571429,23.5945564 1.41862857,24.7428571 2.90285714,24.7428571 L24.2971429,24.7428571 C25.7813714,24.7428571 26.9714286,23.5945564 26.9714286,22.162406 L26.9714286,7.96992481 C26.9714286,6.53777444 25.7813714,5.38947368 24.2971429,5.38947368 Z M13.6,17.0015038 C12.1291429,17.0015038 10.9257143,15.8403008 10.9257143,14.4210526 C10.9257143,13.0018045 12.1291429,11.8406015 13.6,11.8406015 C15.0708571,11.8406015 16.2742857,13.0018045 16.2742857,14.4210526 C16.2742857,15.8403008 15.0708571,17.0015038 13.6,17.0015038 Z M16.2742857,5.38947368 L10.9257143,5.38947368 L10.9257143,2.80902256 L16.2742857,2.80902256 L16.2742857,5.38947368 Z" />
- </group>
+ android:fillColor="@*android:color/accent_device_default_light"
+ android:pathData="M20,6h-4V4c0,-1.11 -0.89,-2 -2,-2h-4C8.89,2 8,2.89 8,4v2H4C2.89,6 2.01,6.89 2.01,8L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2V8C22,6.89 21.11,6 20,6zM10,4h4v2h-4V4zM20,19H4V8h16V19z"/>
</vector> \ No newline at end of file
diff --git a/core/res/res/drawable/perm_group_activity_recognition.xml b/core/res/res/drawable/perm_group_activity_recognition.xml
new file mode 100644
index 000000000000..0ade6c674171
--- /dev/null
+++ b/core/res/res/drawable/perm_group_activity_recognition.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+
+ <path
+ android:fillColor="#000000"
+ android:pathData="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1
+2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9
+0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5 .1 -.8 .1 l-5.2
+2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z" />
+</vector>
diff --git a/core/res/res/drawable/perm_group_sensors.xml b/core/res/res/drawable/perm_group_sensors.xml
index ce36c13e1690..e4663d7206fc 100644
--- a/core/res/res/drawable/perm_group_sensors.xml
+++ b/core/res/res/drawable/perm_group_sensors.xml
@@ -19,11 +19,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
- <path
- android:fillColor="#000000"
- android:pathData="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1
-2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9
-0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5 .1 -.8 .1 l-5.2
-2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z" />
-</vector> \ No newline at end of file
+ <path
+ android:fillColor="#000000"
+ android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3C4.42,3 2,5.42 2,
+ 8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5C22,
+ 5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1l-0.1,-0.1C7.14,14.24 4,11.39 4,8.5C4,6.5 5.5,
+ 5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5C20,
+ 11.39 16.86,14.24 12.1,18.55z"/>
+</vector>
diff --git a/core/res/res/layout/notification_template_material_ambient.xml b/core/res/res/layout/notification_template_material_ambient.xml
deleted file mode 100644
index 2c6064ea6243..000000000000
--- a/core/res/res/layout/notification_template_material_ambient.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2017 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.
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:tag="ambient"
- android:paddingStart="@dimen/notification_extra_margin_ambient"
- android:paddingEnd="@dimen/notification_extra_margin_ambient"
- >
- <include layout="@layout/notification_template_ambient_header"
- android:theme="@style/Theme.DeviceDefault.Notification.Ambient" />
-
- <LinearLayout
- android:id="@+id/notification_action_list_margin_target"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="top"
- android:layout_marginTop="@dimen/notification_content_margin_top"
- android:layout_marginBottom="@dimen/notification_action_list_height"
- android:paddingTop="4dp"
- android:paddingBottom="6dp"
- android:clipToPadding="false"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:layout_weight="1"
- android:paddingStart="@dimen/notification_content_margin_start"
- android:paddingEnd="@dimen/notification_content_margin_end"
- android:clipToPadding="false"
- android:minHeight="@dimen/notification_min_content_height"
- android:orientation="vertical"
- >
- <TextView android:id="@+id/title"
- android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="top|center_horizontal"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:textSize="@dimen/notification_ambient_title_text_size"
- android:textColor="#ffffffff"
- />
- <TextView android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:textAppearance="@style/TextAppearance.DeviceDefault.Notification"
- android:singleLine="false"
- android:layout_weight="1"
- android:gravity="top|center_horizontal"
- android:visibility="gone"
- android:textSize="@dimen/notification_ambient_text_size"
- android:textColor="#eeffffff"
- android:layout_marginTop="4dp"
- android:ellipsize="end"
- android:maxLines="3"
- />
- </LinearLayout>
- <FrameLayout android:id="@+id/actions_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom">
- <com.android.internal.widget.NotificationActionListLayout
- android:id="@+id/actions"
- android:layout_width="match_parent"
- android:layout_height="@dimen/notification_action_list_height"
- android:paddingEnd="4dp"
- android:orientation="horizontal"
- android:gravity="center"
- android:visibility="gone"
- />
- </FrameLayout>
- </LinearLayout>
-</FrameLayout>
diff --git a/core/res/res/layout/time_picker_header_material.xml b/core/res/res/layout/time_picker_header_material.xml
index adb2b62f799c..30c10b118121 100644
--- a/core/res/res/layout/time_picker_header_material.xml
+++ b/core/res/res/layout/time_picker_header_material.xml
@@ -76,16 +76,14 @@
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/minutes"
android:layout_alignBaseline="@+id/minutes"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="0dp"
android:orientation="vertical"
android:baselineAlignedChildIndex="1">
<RadioButton
android:id="@+id/am_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="4dp"
- android:paddingRight="4dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:layout_marginBottom="-8dp"
@@ -101,8 +99,6 @@
android:id="@+id/pm_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="4dp"
- android:paddingRight="4dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:textAppearance="@style/TextAppearance.Material.TimePicker.AmPmLabel"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 3f23da6a499e..770a82e3081a 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Laat die program toe om liggings in jou mediaversameling te lees."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Die program <xliff:g id="APP">%s</xliff:g> wil staaf."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometriese hardeware is nie beskikbaar nie"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Stawing is gekanselleer"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nie herken nie"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Stawing is gekanselleer"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Gedeeltelike vingerafdruk is bespeur. Probeer asseblief weer."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kon nie vingerafdruk verwerk nie. Probeer asseblief weer."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Vingerafdruksensor is vuil. Maak dit skoon en probeer weer."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Maak oop met"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Maak oop met %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Maak oop"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Gee toegang tot oop <xliff:g id="HOST">%1$s</xliff:g>-skakels met"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Gee toegang tot oop <xliff:g id="HOST">%1$s</xliff:g>-skakels met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Verleen toegang"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Redigeer met"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigeer met %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Wysig"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altyd"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Net een keer"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellings"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s steun nie werkprofiel nie"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Kleurkorreksie"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aangeskakel"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> afgeskakel"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gebruik weer toeganklikheidskortpad om die huidige toeganklikheidskenmerk te begin"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Druk en hou albei volumesleutels drie sekondes lank om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruik"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies \'n kenmerk om te gebruik wanneer jy op die Toeganklikheid-knoppie tik:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Raak en hou die Toeganklikheid-knoppie om kenmerke te verander."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofoon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"wys tans bo-oor ander programme op jou skerm"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Roetinemodus-inligtingkennisgewing"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laai tans"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index ca1aabd553eb..8ec7cd0335a3 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"መተግበሪያው አካባቢዎችን ከሚዲያ ስብስብዎ እንዲያነብብ ያስችለዋል።"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"መተግበሪያ <xliff:g id="APP">%s</xliff:g> ማረጋገጥ ይፈልጋል"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ባዮሜትራዊ ሃርድዌር አይገኝም"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ማረጋገጥ ተሰርዟል"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"አልታወቀም"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ማረጋገጥ ተሰርዟል"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ከፊል የጣት አሻራ ተገኝቷል። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ጣት አሻራን መስራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"የጣት አሻራ ዳሳሽ ቆሽሿል። እባክዎ ያጽዱት እና እንደገና ይሞክሩ።"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ክፈት በ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"ክፈት በ%1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ክፈት"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"የ<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን በዚህ ለመክፈት መዳረሻ ይስጡ፦"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"የ<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን በ<xliff:g id="APPLICATION">%2$s</xliff:g> ለመክፈት መዳረሻ ይስጡ"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"መዳረሻ ስጥ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ያርትዑ በ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"ያርትዑ በ%1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ያርትዑ"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ጥሪ ተቀበል?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ዘወትር"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"አንዴ ብቻ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ቅንብሮች"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s የስራ መገለጫ አይደግፍም"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ጡባዊ ተኮ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ቴሌቪዥን"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"የቀለም ማስተካከያ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አብርቶታል"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አጥፍቶታል"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"አሁን ያለውን የተደራሽነት ባህሪ ለመጀመር እንደገና የተደራሽነት አቋራጭን ይጠቀሙ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን ለመጠቀም ለሦስት ሰከንዶች ሁለቱንም የድምፅ ቁልፎች ተጭነው ይያዙ"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን ባህሪ ይምረጡ፦"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ባህሪያትን ለመለወጥ የተደራሽነት አዝራሩን ይንኩ እና ይያዙት።"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ማጉላት"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ካሜራ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ማይክሮፎን"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"በማያዎ ላይ በሌሎች መተግበሪያዎች ላይ በማሳየት ላይ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"በመጫን ላይ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 455756357bce..8d7b8012f486 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -545,11 +545,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"للسماح للتطبيق بقراءة المواقع من مجموعة الوسائط التابعة لك."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"يتطلَّب التطبيق <xliff:g id="APP">%s</xliff:g> المصادقة."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"معدّات المقاييس الحيوية غير متاحة."</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"تم إلغاء المصادقة."</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"لم يتم التعرف عليها."</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"تم إلغاء المصادقة."</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"تم اكتشاف بصمة الإصبع بشكل جزئي؛ يرجى إعادة المحاولة."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"تعذرت معالجة بصمة الإصبع. يُرجى إعادة المحاولة."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"جهاز استشعار بصمات الأصابع متسخ، يرجى تنظيفه وإعادة المحاولة."</string>
@@ -1208,6 +1206,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"فتح باستخدام"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‏فتح باستخدام %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"فتح"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"منح إمكانية الوصول لفتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"منح إمكانية الوصول لفتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"منح إذن الوصول"</string>
<string name="whichEditApplication" msgid="144727838241402655">"تعديل باستخدام"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"‏تعديل باستخدام %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"تعديل"</string>
@@ -1539,7 +1540,7 @@
<string name="vpn_lockdown_config" msgid="8151951501116759194">"‏تغيير إعدادات الشبكة أو الشبكة الافتراضية الخاصة (VPN)"</string>
<string name="upload_file" msgid="2897957172366730416">"اختيار ملف"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"لم يتم اختيار أي ملف"</string>
- <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string>
+ <string name="reset" msgid="2448168080964209908">"إعادة الضبط"</string>
<string name="submit" msgid="1602335572089911941">"إرسال"</string>
<string name="car_mode_disable_notification_title" msgid="5704265646471239078">"تطبيق القيادة قيد التشغيل"</string>
<string name="car_mode_disable_notification_message" msgid="7647248420931129377">"انقر للخروج من تطبيق القيادة."</string>
@@ -1658,6 +1659,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"دومًا"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"مرة واحدة فقط"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"الإعدادات"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"‏لا يدعم %1$s الملفات الشخصية للعمل"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"الجهاز اللوحي"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"التلفزيون"</string>
@@ -1741,7 +1743,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"تصحيح الألوان"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"شغَّل اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"أوقف اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"استخدِم اختصار إمكانية الوصول لبدء ميزة إمكانية الوصول الحالية."</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"اضغط مع الاستمرار على مفتاحي مستوى الصوت لمدة 3 ثوانٍ لاستخدام <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"يمكنك اختيار إحدى الميزات لاستخدامها عند النقر على زر إمكانية الوصول:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"لتغيير الميزات، يمكنك لمس زر \"إمكانية الوصول\" مع الاستمرار."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"التكبير"</string>
@@ -2115,5 +2117,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"كاميرا"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ميكروفون"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"العرض فوق التطبيقات الأخرى على شاشتك"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"إشعار معلومات \"وضع سلسلة الإجراءات\""</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"قد تنفد طاقة البطارية قبل الشحن المعتاد"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"تم تفعيل \"توفير شحن البطارية\" لإطالة عمرها."</string>
<string name="car_loading_profile" msgid="3545132581795684027">"جارٍ التحميل"</string>
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index a4f950a9f6b2..74a4584001d7 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"এপক আপোনাৰ মিডিয়া সংগ্ৰহৰ অৱস্থান পঢ়িবলৈ দিয়ে।"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> এপে বিশ্বাসযোগ্যতাৰ প্ৰমাণ কৰিব বিচাৰে।"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"বায়োমেট্ৰিক হাৰ্ডৱেৰ উপলব্ধ নহয়"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ বাতিল কৰা হৈছে"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"চিনাক্ত কৰিব পৰা নাই"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ বাতিল কৰা হৈছে"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ফিংগাৰপ্ৰিণ্ট আংশিকভাৱে চিনাক্ত কৰা হৈছে। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ফিগাৰপ্ৰিণ্টৰ প্ৰক্ৰিয়া সম্পাদন কৰিবপৰা নগ\'ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো লেতেৰা হৈ আছে। অনুগ্ৰহ কৰি পৰিষ্কাৰ কৰি আকৌ চেষ্টা কৰক।"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ইয়াৰ জৰিয়তে খোলক"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sৰ জৰিয়তে খোলক"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"খোলক"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ইয়াৰ দ্বাৰা <xliff:g id="HOST">%1$s</xliff:g> লিংক খুলিবলৈ এক্সেছ দিয়ক"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>ৰ দ্বাৰা <xliff:g id="HOST">%1$s</xliff:g> লিংক খুলিবলৈ এক্সেছ দিয়ক"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"এক্সেছ দিয়ক"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ইয়াৰ দ্বাৰা সম্পাদনা কৰক"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sৰদ্বাৰা সম্পাদনা কৰক"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"সম্পাদনা কৰক"</string>
@@ -1257,7 +1258,7 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"নেটৱৰ্কত ছাইন ইন কৰক"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"ৱাই-ফাইত ইন্টাৰনেট নাই"</string>
+ <string name="wifi_no_internet" msgid="8938267198124654938">"ৱাই-ফাইত ইণ্টাৰনেট নাই"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"অধিক বিকল্পৰ বাবে টিপক"</string>
<string name="wifi_softap_config_change" msgid="8475911871165857607">"আপোনাৰ হটস্পট ছেটিংসমূহত কৰা সালসলনি"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপোনাৰ হটস্পটৰ বেণ্ড সলনি কৰা হ’ল।"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"কল স্বীকাৰ কৰিবনে?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"সদায়"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"মাত্ৰ এবাৰ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ছেটিংসমূহ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sএ কৰ্মস্থানৰ প্ৰ\'ফাইল সমৰ্থন নকৰে।"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"টেবলেট"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"টিভি"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ৰং শুধৰণী"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অন কৰিছে"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অফ কৰিছে"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"বর্তমানৰ সাধ্য সুবিধাসমূহৰ আৰম্ভ কৰিবলৈ সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট পুনৰ ব্যৱহাৰ কৰক"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যৱহাৰ কৰিবলৈ দুয়োটা ভলিউম বুটাম তিনি ছেকেণ্ডৰ বাবে হেঁচি ৰাখক"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"আপুনি দিব্যাংগসকলৰ সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলগীয়া কোনো সুবিধা বাছক:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"সুবিধাসমূহ সলনি কৰিবলৈ দিব্যাংগসকলৰ সুবিধাৰ বুটামটো স্পৰ্শ কৰি থাকক।"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বিবৰ্ধন"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"কেমেৰা"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"মাইক্ৰ\'ফ\'ন"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"স্ক্ৰীণত অইন এপৰ ওপৰত দেখুৱাওক"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ল’ড হৈ আছে"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 076ea8d70f37..c94170466375 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Tətbiqin media kolleksiyanızdan məkanları oxumasına icazə verin."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> doğrulamaq istəyir."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrik proqram əlçatan deyil"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Doğrulama ləğv edildi"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmır"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Doğrulama ləğv edildi"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Barmaq qismən müəyyən olundu. Lütfən, yenidən cəhd edin."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Barmaq izi tanınmadı. Lütfən, yenidən cəhd edin."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Barmaq izi sensoru çirklidir. Lütfən, təmizləyin və yenidən cəhd edin."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Bununla açın"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ilə açın"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Açın"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Bu tətbiqlə <xliff:g id="HOST">%1$s</xliff:g> linklərini açmağa icazə verin:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ilə <xliff:g id="HOST">%1$s</xliff:g> linklərini açmağa icazə verin"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"İcazə verin"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Bununla düzəliş edin:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ilə düzəliş edin"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Redaktə edin"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s iş profilini dəstəkləmir"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Planşet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Rəng korreksiyası"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini aktiv etdi"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini deaktiv etdi"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Cari əlçatımlılıq funksiyasını yenidən başlatmaq üçün Əlçatımlılıq Qısayolundan istifadə edin"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> istifadə etmək üçün hər iki səs düyməsini üç saniyə basıb saxlayın"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Əlçatımlılıq düyməsinə kliklədikdə istifadə etmək üçün funksiya seçin:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyaları dəyişmək üçün Əlçatımlılıq düyməsinə basıb saxlayın."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Böyütmə"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ekrandakı digər tətbiqlərdə göstərin"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rejim üçün məlumat bildirişi"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yüklənir"</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 0a94acfe9364..7de4e9e0f747 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Dozvoljava aplikaciji da čita lokacije iz medijske kolekcije."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacija <xliff:g id="APP">%s</xliff:g> želi da potvrdi vaš identitet."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrijski hardver nije dostupan"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Potvrda identiteta je otkazana"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Potvrda identiteta je otkazana"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je delimični otisak prsta. Probajte ponovo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nije uspela obrada otiska prsta. Probajte ponovo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor za otiske prstiju je prljav. Očistite ga i pokušajte ponovo."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otvorite pomoću"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvorite pomoću aplikacije %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dozvolite da se linkovi <xliff:g id="HOST">%1$s</xliff:g> otvaraju pomoću"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dozvolite da <xliff:g id="APPLICATION">%2$s</xliff:g> otvara linikove <xliff:g id="HOST">%1$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Izmenite pomoću"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Izmenite pomoću aplikacije %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Izmeni"</string>
@@ -1589,6 +1590,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Želite li da prihvatite poziv?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvek"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Podešavanja"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1669,7 +1671,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcija boja"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Upotrebite ponovo prečicu za pristupačnost da biste pokrenuli aktuelnu funkciju pristupačnosti"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite i zadržite oba tastera za jačinu zvuka tri sekunde da biste koristili <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme za pristupačnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pritisnite i zadržite dugme za pristupačnost da biste menjali funkcije."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string>
@@ -2010,5 +2012,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"prikazuje se na ekranu dok koristite druge aplikacije"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obaveštenje o informacijama Rutinskog režima"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitava se"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index cfe076deb8ec..4f98eaa238c2 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -79,7 +79,7 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Налады ідэнтыфікатару АВН па змаўчанні: не абмяжавана. Наступны выклік: не абмежавана"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Служба не прадастаўляецца."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Вы не можаце змяніць налады ідэнтыфікатара абанента, якi тэлефануе."</string>
- <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мабільны інтэрнэт недаступны"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мабільная перадача даных недаступная"</string>
<string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Экстранныя выклікі недаступныя"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма сэрвісу галасавых выклікаў"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Галасавыя або экстранныя выклікі недаступныя"</string>
@@ -435,7 +435,7 @@
<string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Акрамя доступу да прыкладнага ці дакладнага месцазнаходжання праграма можа мець доступ да вызначэння геалакацыі ў фонавым рэжыме працы. На гэта патрабуецца дазвол."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"змяняць налады аудыё"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Дазваляе прыкладанням змяняць глабальныя налады гуку, такія як моц і тое, што дынамік выкарыстоўваецца для выхаду."</string>
- <string name="permlab_recordAudio" msgid="3876049771427466323">"запісваць аўдыё"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"запіс аўдыя"</string>
<string name="permdesc_recordAudio" msgid="4245930455135321433">"Гэта праграма можа у любы час запісваць аўдыя, выкарыстоўваючы мікрафон."</string>
<string name="permlab_sim_communication" msgid="2935852302216852065">"адпраўляць каманды на SIM-карту"</string>
<string name="permdesc_sim_communication" msgid="5725159654279639498">"Дазваляе праграме адпраўляць каманды SIM-карце. Гэта вельмі небяспечна."</string>
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Праграма зможа паказваць месцазнаходжанне ў калекцыі мультымедыя."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Праграма \"<xliff:g id="APP">%s</xliff:g>\" патрабуе аўтэнтыфікацыі."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Біяметрычнае абсталяванне недаступнае"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Аўтэнтыфікацыя скасавана"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Не распазнана"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Аўтэнтыфікацыя скасавана"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Выяўлена частка адбіткаў пальцаў. Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Не атрымалася апрацаваць адбітак пальца. Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Датчык адбіткаў пальцаў брудны. Ачысціце яго і паспрабуйце яшчэ раз."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Адкрыць з дапамогай"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Адкрыць з дапамогай %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Адкрыць"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Адкрываць спасылкі на сэрвіс <xliff:g id="HOST">%1$s</xliff:g> з дапамогай"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Адкрываць спасылкі на сэрвіс <xliff:g id="HOST">%1$s</xliff:g> з дапамогай праграмы \"<xliff:g id="APPLICATION">%2$s</xliff:g>\""</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даць доступ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Рэдагаваць з дапамогай"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Рэдагаваць з дапамогай %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Рэдагаваць"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Прыняць выклік?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Заўсёды"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Толькі адзін раз"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налады"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не падтрымлівае працоўны профіль"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Планшэт"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ТБ"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Карэкцыя колеру"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў уключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Каб запусціць функцыю спецыяльных магчымасцей, паўторна скарыстайце ярлык спецыяльных магчымасцей"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Каб карыстацца сэрвісам \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", націсніце і ўтрымлівайце на працягу трох секунд абедзве клавішы гучнасці"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберыце функцыю для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Каб змяняць функцыі, краніце і ўтрымлівайце кнопку \"Спецыяльныя магчымасці\"."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Павелічэнне"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Мікрафон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"паказваецца паверх іншых праграм на экране"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Загрузка"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 8897baca2808..704dc5226687 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Разрешава на приложението да чете местоположенията от мултимедийната ви колекция."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Приложението <xliff:g id="APP">%s</xliff:g> изисква удостоверяване."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометричният хардуер не е налице"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Удостоверяването бе анулирано"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Не е разпознато"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Удостоверяването бе анулирано"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Открит е частичен отпечатък. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Отпечатъкът не можа да се обработи. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензорът за отпечатъци е мръсен. Моля, почистете го и опитайте отново."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Отваряне чрез"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отваряне чрез %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отваряне"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Предоставяне на достъп за отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> с(ъс)"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Предоставяне на достъп за отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> с(ъс) <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даване на достъп"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Редактиране чрез"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактиране чрез %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Редактиране"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Винаги"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Само веднъж"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддържа служебен потребителски профил"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Телевизор"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Коригиране на цветовете"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Прекият път за достъпност включи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Прекият път за достъпност изключи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Използвайте отново прекия път към функцията за достъпност, за да стартирате текущата"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"За да използвате <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, натиснете двата бутона за силата на звука и ги задръжте за 3 секунди"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функция, която да използвате, когато докоснете бутона за достъпност:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За да промените функции, докоснете и задръжте бутона за достъпност."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ниво на мащаба"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"се показва върху други приложения на екрана"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известие с информация за режима на поредица"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерията може да се изтощи преди обичайното зареждане"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Зарежда се"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 26a3ba0c269c..b6ab1e6315b5 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"আপনার মিডিয়া সংগ্রহ থেকে লোকেশন দেখতে অ্যাপকে অনুমতি দিন।"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> অ্যাপ্লিকেশন যাচাই করতে চাইছে।"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"বায়োমেট্রিক হার্ডওয়্যার পাওয়া যাবে না"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"যাচাইকরণ বাতিল হয়েছে"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"স্বীকৃত নয়"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"যাচাইকরণ বাতিল হয়েছে"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"আঙ্গুলের ছাপ আংশিক শনাক্ত করা হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"আঙ্গুলের ছাপ প্রক্রিয়া করা যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"আঙ্গুলের ছাপ নেওয়ার সেন্সরটি অপরিস্কার৷ অনুগ্রহ করে পরিষ্কার করে আবার চেষ্টা করুন৷"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"এর মাধ্যমে খুলুন"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s দিয়ে খুলুন"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"খুলুন"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ব্যবহার করে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্ক খুলতে অ্যাক্সেস দিন"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ব্যবহার করে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্ক খুলতে অ্যাক্সেস দিন"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"অ্যাক্সেস দিন"</string>
<string name="whichEditApplication" msgid="144727838241402655">"এর মাধ্যমে সম্পাদনা করুন"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s দিয়ে সম্পাদনা করুন"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"সম্পাদনা করুন"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"কল গ্রহণ করবেন?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"সবসময়"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"শুধু একবার"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"সেটিংস"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s কর্মস্থলের প্রোফাইল সমর্থন করে না।"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ট্যাবলেট"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"টিভি"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"রঙ সংশোধন"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে চালু করেছে"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে বন্ধ করেছে"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"বর্তমান অ্যাক্সেসিবিলিটি বৈশিষ্ট্য শুরু করার জন্য অ্যাক্সেসিবিলিটি শর্টকাটটি আবার ব্যবহার করুন"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যবহার করতে ভলিউম কী বোতাম ৩ সেকেন্ডের জন্য চেপে ধরে রাখুন"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"অ্যাক্সেসযোগ্যতা বোতামের সাহায্যে যে বৈশিষ্ট্যটি নিয়ন্ত্রণ করতে চান, সেটি বেছে নিন:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"বৈশিষ্ট্যগুলি পরিবর্তন করতে অ্যাক্সেসযোগ্যতা বোতামটি ট্যাপ করে ধরে রাখুন।"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বড় করে দেখা"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ক্যামেরা"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"মাইক্রোফোন"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"লোড হচ্ছে"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index e336cd0088d0..ab0df696fed7 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -155,9 +155,9 @@
<string name="httpErrorOk" msgid="1191919378083472204">"Uredu"</string>
<string name="httpError" msgid="7956392511146698522">"Došlo je do greške na mreži."</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"Pronalaženje URL-a nije uspjelo."</string>
- <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Shema za provjeru vjerodostojnosti stranice nije podržana."</string>
- <string name="httpErrorAuth" msgid="1435065629438044534">"Došlo je do greške prilikom provjere vjerodostojnosti."</string>
- <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Došlo je do greške prilikom provjere vjerodostojnosti preko proksi servera."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Shema za autentifikaciju stranice nije podržana."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"Došlo je do greške prilikom autentifikacije."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Došlo je do greške prilikom autentifikacije preko proksi servera."</string>
<string name="httpErrorConnect" msgid="8714273236364640549">"Povezivanje sa serverom nije uspjelo."</string>
<string name="httpErrorIO" msgid="2340558197489302188">"Veza sa serverom nije uspostavljena. Pokušajte ponovo kasnije."</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"Vrijeme za uspostavljanje veze sa serverom je isteklo."</string>
@@ -519,7 +519,7 @@
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje hardverom za otiske prstiju"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Omogućava aplikaciji da koristi metode za dodavanje i brisanje šablona otisaka prstiju za upotrebu."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"korištenje hardvera za otiske prstiju"</string>
- <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Omogućava aplikaciji da za provjeru vjerodostojnosti koristi hardver za otiske prstiju"</string>
+ <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Omogućava aplikaciji da za autentifikaciju koristi hardver za otiske prstiju"</string>
<string name="permlab_audioRead" msgid="6617225220728465565">"čitanje muzičke kolekcije"</string>
<string name="permdesc_audioRead" msgid="5034032570243484805">"Omogućava aplikaciji da čita vašu muzičku kolekciju."</string>
<string name="permlab_audioWrite" msgid="2661772059799779292">"izmjena muzičke kolekcije"</string>
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Omogućava aplikaciji da čita lokacije iz vaše kolekcije medija."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacija <xliff:g id="APP">%s</xliff:g> traži autentifikaciju."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrijski hardver nije dostupan"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentifikacija je otkazana"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentifikacija je otkazana"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je djelomičan otisak prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nije uspjela obrada otiska prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor za otisak prsta je prljav. Očistite ga i pokušajte ponovo."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otvori koristeći"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvori koristeći %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dozvolite pristup za otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dozvolite pristup za otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Uredi koristeći"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uredi koristeći %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Uredi"</string>
@@ -1591,6 +1592,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo ovaj put"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1641,7 +1643,7 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ponovo unesite ispravan PUK kôd. Ponovljeni pokušaji će trajno onemogućiti SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-ovi se ne poklapaju"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Previše pokušaja otključavanja pomoću uzorka"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Da otključate, prijavite se sa svojim Google računom."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Da otključate, prijavite se pomoću svog Google računa."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"Korisničko ime (adresa e-pošte)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"Lozinka"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"Prijava"</string>
@@ -1671,7 +1673,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Ispravka boja"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Ponovo koristite Prečicu za pristupačnost da započnete trenutnu funkciju pristupačnosti"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite obje tipke za podešavanje jačine zvuka i držite ih pritisnutim tri sekunde da koristite uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string>
@@ -2012,5 +2014,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"prikazivanje preko drugih aplikacija na ekranu"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještenje za informacije Rutinskog načina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitavanje"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 35c223b20fdc..e53f85e416c2 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permet que l\'aplicació llegeixi les ubicacions de les teves col·leccions multimèdia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"L\'aplicació <xliff:g id="APP">%s</xliff:g> vol que t\'autentiquis."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Maquinari biomètric no disponible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"S\'ha cancel·lat l\'autenticació"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"No s\'ha reconegut"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"S\'ha cancel·lat l\'autenticació"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"S\'ha detectat una empremta digital parcial. Torna-ho a provar."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No s\'ha pogut processar l\'empremta digital. Torna-ho a provar."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor d\'empremtes digitals està brut. Neteja\'l i torna-ho a provar."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Obre amb"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Obre amb %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Obre"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dona accés per obrir enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dona accés per obrir enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dona accés"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edita amb"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edita amb %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edita"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vols acceptar la trucada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Només una vegada"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuració"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admet perfils professionals."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tauleta"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televisor"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correcció del color"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La drecera d\'accessibilitat ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La drecera d\'accessibilitat ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Torna a utilitzar la drecera d\'accessibilitat per iniciar la funció d\'accessibilitat actual"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Mantén premudes les dues tecles de volum durant 3 segons per fer servir <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Tria la funció que s\'utilitzarà quan toquis el botó Accessibilitat:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per canviar les funcions, toca i mantén premut el botó Accessibilitat."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliació"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Càmera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micròfon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"es mostra sobre altres aplicacions a la pantalla"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificació d\'informació del mode de rutina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"És possible que la bateria s\'esgoti abans de la càrrega habitual"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"S\'ha activat l\'estalvi de bateria per allargar-ne la durada"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"S\'està carregant"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0061ca760857..55719e5663b7 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Umožňuje aplikaci číst místa z vaší sbírky médií."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikace <xliff:g id="APP">%s</xliff:g> potřebuje provést ověření."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrický hardware není k dispozici"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Ověření bylo zrušeno"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznáno"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Ověření bylo zrušeno"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Byla zjištěna jen část otisku prstu. Zkuste to znovu."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Zpracování otisku prstu se nezdařilo. Zkuste to znovu."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor otisků prstů je znečištěn. Vyčistěte jej a zkuste to znovu."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otevřít v aplikaci"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otevřít v aplikaci %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otevřít"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Udělte přístup k otevírání odkazů <xliff:g id="HOST">%1$s</xliff:g> pomocí aplikace"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Udělte přístup k otevírání odkazů <xliff:g id="HOST">%1$s</xliff:g> pomocí aplikace <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udělit přístup"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Upravit v aplikaci"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upravit v aplikaci %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Upravit"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Pouze jednou"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavení"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s pracovní profily nepodporuje."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televize"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Oprava barev"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Zkratka přístupnosti zapnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Zkratka přístupnosti vypnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Znovu použijte zkratku přístupnosti, čímž spustíte aktuální funkci pro usnadnění přístupu"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Chcete-li používat službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, tři sekundy podržte stisknutá obě tlačítka hlasitosti"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Určete, jakou funkci aktivujete klepnutím na tlačítko Přístupnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Chcete-li vybrat jinou funkci, podržte tlačítko Přístupnost."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zvětšení"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotoaparát"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"zobrazení přes ostatní aplikace na obrazovce"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informační oznámení režimu sledu činností"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterie se možná vybije před obvyklým časem nabití"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Načítání"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 2795efeaa55c..a5ddc7889fb9 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -87,7 +87,7 @@
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv at skifte dit foretrukne netværk. Tryk for skifte."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Det er ikke muligt at foretage nødopkald"</string>
<string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Det er ikke muligt at foretage nødopkald via Wi‑Fi"</string>
- <string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikationer"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string>
<string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"Status for mobildata"</string>
@@ -187,7 +187,7 @@
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Din arbejdsprofil er ikke længere tilgængelig på denne enhed"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"For mange mislykkede adgangskodeforsøg"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Dette er en administreret enhed"</string>
- <string name="network_logging_notification_text" msgid="7930089249949354026">"Din organisation administrerer denne enhed og kan overvåge netværkstrafik. Tryk for at se oplysninger."</string>
+ <string name="network_logging_notification_text" msgid="7930089249949354026">"Din organisation administrerer denne enhed og kan overvåge netværkstrafik. Tryk for at se info."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Enheden slettes"</string>
<string name="factory_reset_message" msgid="9024647691106150160">"Administrationsappen kan ikke bruges. Enheden vil nu blive ryddet. \n\nKontakt din organisations administrator, hvis du har spørgsmål."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Udskrivning er deaktiveret af <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
@@ -249,7 +249,7 @@
<string name="global_action_voice_assist" msgid="7751191495200504480">"Taleassistent"</string>
<string name="global_action_lockdown" msgid="1099326950891078929">"Lukning"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
- <string name="notification_hidden_text" msgid="6351207030447943784">"Ny underretning"</string>
+ <string name="notification_hidden_text" msgid="6351207030447943784">"Ny notifikation"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
<string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fysisk tastatur"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sikkerhed"</string>
@@ -262,22 +262,22 @@
<string name="notification_channel_network_available" msgid="4531717914138179517">"Tilgængeligt netværk"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhedsadministration"</string>
- <string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikationer"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo til udstilling i butik"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-forbindelse"</string>
<string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"Appen kører"</string>
<string name="notification_channel_foreground_service" msgid="3931987440602669158">"Apps, der bruger batteri"</string>
<string name="foreground_service_app_in_background" msgid="1060198778219731292">"<xliff:g id="APP_NAME">%1$s</xliff:g> bruger batteri"</string>
<string name="foreground_service_apps_in_background" msgid="7175032677643332242">"<xliff:g id="NUMBER">%1$d</xliff:g> apps bruger batteri"</string>
- <string name="foreground_service_tap_for_details" msgid="372046743534354644">"Tryk for at se oplysninger om batteri- og dataforbrug"</string>
+ <string name="foreground_service_tap_for_details" msgid="372046743534354644">"Tryk for at se info om batteri- og dataforbrug"</string>
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="8836124313744349203">"Skift til personlig profil"</string>
<string name="managed_profile_label" msgid="8947929265267690522">"Skift til arbejdsprofil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"have adgang til dine kontaktpersoner"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til dine kontaktpersoner?"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"have adgang til dine kontakter"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til dine kontakter?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Placering"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få adgang til enhedens placering"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til enhedens placering?"</string>
@@ -393,11 +393,11 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Tillader, at appen kan sende klæbende udsendelser, der forbliver tilbage, når udsendelsen er slut. Overdreven brug kan gøre din tablet langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Giver appen lov til at sende klæbende udsendelser, som ikke forsvinder, når udsendelsen er slut. Overdreven brug kan gøre fjernsynet langsomt eller ustabilt ved at få det til at bruge for meget hukommelse."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tillader, at appen kan sende klæbende udsendelser, der forbliver tilbage, når udsendelsen er slut. Overdreven brug kan gøre din telefon langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
- <string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontaktpersoner"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontakter"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontakter, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
<string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Giver appen lov til at læse data om dine kontakter, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på andre måder kommunikeret med bestemte personer. Denne tilladelse gør det muligt for apps at gemme dine kontaktoplysninger, og ondsindede apps kan dele kontaktoplysninger uden din viden."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontakter, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
- <string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontaktpersoner"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontakter"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontakter, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en mail eller på anden måde kommunikeret med bestemte kontakter. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Giver appen lov til at ændre data om dine kontakter, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på anden måde kommunikeret med bestemte kontakter. Denne tilladelse gør det muligt for apps at slette kontaktoplysninger."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontakter, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en mail til dem eller på anden måde kommunikeret med bestemte kontakter. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Tillader, at appen kan læse placeringer fra din mediesamling."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g>-appen kræver din godkendelse."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrisk hardware er ikke tilgængelig"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Godkendelsen blev annulleret"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke genkendt"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Godkendelsen blev annulleret"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Der blev registreret et delvist fingeraftryk. Prøv igen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingeraftrykket kunne ikke behandles. Prøv igen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sensoren til registrering af fingeraftryk er beskidt. Tør den af, og prøv igen."</string>
@@ -624,10 +622,10 @@
<string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tillader, at appen kan administrere netværkspolitikker og definere appspecifikke regler."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"skift afregning af netværksbrug"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tillader, at appen kan ændre den måde, som netværksforbrug udregnes på i forhold til apps. Anvendes ikke af normale apps."</string>
- <string name="permlab_accessNotifications" msgid="7673416487873432268">"adgang til underretninger"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tillader, at appen kan hente, undersøge og rydde underretninger, f.eks. dem, der er sendt af andre apps."</string>
- <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"forpligte sig til en underretningslyttertjeneste"</string>
- <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Tillader brugeren at forpligte sig til en underretningslyttertjenestes grænseflade på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"adgang til notifikationer"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tillader, at appen kan hente, undersøge og rydde notifikationer, f.eks. dem, der er sendt af andre apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"forpligte sig til en notifikationslyttertjeneste"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Tillader brugeren at forpligte sig til en notifikationslyttertjenestes grænseflade på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"oprette binding til en tjeneste til formidling af betingelser"</string>
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Tillader, at brugeren opretter en binding til det øverste niveau af grænsefladen i en tjeneste til formidling af betingelser. Dette bør aldrig være nødvendigt for almindelige apps."</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"fastlås til en drømmetjeneste"</string>
@@ -1098,7 +1096,7 @@
<string name="sms" msgid="4560537514610063430">"Send besked"</string>
<string name="sms_desc" msgid="7526588350969638809">"Send en besked til det valgte telefonnummer"</string>
<string name="add_contact" msgid="7867066569670597203">"Tilføj"</string>
- <string name="add_contact_desc" msgid="4830217847004590345">"Føj til kontaktpersoner"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Føj til kontakter"</string>
<string name="view_calendar" msgid="979609872939597838">"Se"</string>
<string name="view_calendar_desc" msgid="5828320291870344584">"Se det valgte tidspunkt i kalenderen"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Planlæg"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Åbn med"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åbn med %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åbn"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Giv adgang til at åbne <xliff:g id="HOST">%1$s</xliff:g>-link med"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Giv adgang til at åbne <xliff:g id="HOST">%1$s</xliff:g>-links med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Giv adgang"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Rediger"</string>
@@ -1214,19 +1215,19 @@
<string name="volume_call" msgid="3941680041282788711">"Lydstyrke for opkald"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"Lydstyrke for Bluetooth under opkald"</string>
<string name="volume_alarm" msgid="1985191616042689100">"Lydstyrke for alarm"</string>
- <string name="volume_notification" msgid="2422265656744276715">"Lydstyrke for underretninger"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Lydstyrke for notifikationer"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Lydstyrke"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Lydstyrke for bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Lydstyrke for ringetone"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Lydstyrke for opkald"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"Lydstyrke for medier"</string>
- <string name="volume_icon_description_notification" msgid="7044986546477282274">"Lydstyrke for underretninger"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Lydstyrke for notifikationer"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Standardringetone"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Standard (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"Ringetoner"</string>
<string name="ringtone_picker_title_alarm" msgid="6473325356070549702">"Alarmlyde"</string>
- <string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Underretningslyde"</string>
+ <string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Notifikationslyde"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Ukendt"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
<item quantity="one">Tilgængelige Wi-Fi-netværk</item>
@@ -1436,10 +1437,10 @@
<string name="accessibility_binding_label" msgid="4148120742096474641">"Hjælpefunktioner"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Baggrund"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Skift baggrund"</string>
- <string name="notification_listener_binding_label" msgid="2014162835481906429">"Underretningslytter"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Notifikationslytter"</string>
<string name="vr_listener_binding_label" msgid="4316591939343607306">"VR-lyttefunktion"</string>
<string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Tjeneste til formidling af betingelser"</string>
- <string name="notification_ranker_binding_label" msgid="774540592299064747">"Tjeneste til rangering af underretninger"</string>
+ <string name="notification_ranker_binding_label" msgid="774540592299064747">"Tjeneste til rangering af notifikationer"</string>
<string name="vpn_title" msgid="19615213552042827">"VPN er aktiveret."</string>
<string name="vpn_title_long" msgid="6400714798049252294">"VPN aktiveres af <xliff:g id="APP">%s</xliff:g>"</string>
<string name="vpn_text" msgid="1610714069627824309">"Tryk for at administrere netværket."</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altid"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Kun én gang"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Indstillinger"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s understøtter ikke arbejdsprofil"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Tv"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Korriger farve"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Genvejen til hjælpefunktioner aktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Genvejen til hjælpefunktioner deaktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Brug Genvej til hjælpefunktioner for at starte den aktuelle hjælpefunktion"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Hold begge lydstyrkeknapper nede i tre sekunder for at bruge <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktioner."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørrelse"</string>
@@ -1858,7 +1860,7 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valgt</item>
</plurals>
<string name="default_notification_channel_label" msgid="5929663562028088222">"Uden kategori"</string>
- <string name="importance_from_user" msgid="7318955817386549931">"Du angiver, hvor vigtige disse underretninger er."</string>
+ <string name="importance_from_user" msgid="7318955817386549931">"Du angiver, hvor vigtige disse notifikationer er."</string>
<string name="importance_from_person" msgid="9160133597262938296">"Dette er vigtigt på grund af de personer, det handler om."</string>
<string name="user_creation_account_exists" msgid="1942606193570143289">"Vil du give <xliff:g id="APP">%1$s</xliff:g> tilladelse til at oprette en ny bruger med <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
<string name="user_creation_adding" msgid="4482658054622099197">"Vil du give <xliff:g id="APP">%1$s</xliff:g> tilladelse til at oprette en ny bruger med <xliff:g id="ACCOUNT">%2$s</xliff:g> (der findes allerede en bruger med denne konto)?"</string>
@@ -1873,7 +1875,7 @@
<string name="app_suspended_default_message" msgid="123166680425711887">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> er ikke tilgængelig lige nu. Dette administreres af <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
<string name="app_suspended_more_details" msgid="1131804827776778187">"Få flere oplysninger"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Skal arbejdsprofilen slås til?"</string>
- <string name="work_mode_off_message" msgid="5130856710614337649">"Dine arbejdsapps, underretninger, data og andre funktioner til din arbejdsprofil deaktiveres"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Dine arbejdsapps, notifikationer, data og andre funktioner til din arbejdsprofil deaktiveres"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Slå til"</string>
<string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Denne app er lavet til en ældre version af Android og fungerer muligvis ikke korrekt. Prøv at søge efter opdateringer, eller kontakt udvikleren."</string>
<string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Søg efter opdatering"</string>
@@ -1962,11 +1964,11 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Der er registreret en skadelig app"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> anmoder om tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Rediger"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Telefonen vil vibrere ved opkald og underretninger"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Der afspilles ikke lyd ved opkald og underretninger"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Telefonen vil vibrere ved opkald og notifikationer"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Der afspilles ikke lyd ved opkald og notifikationer"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemændringer"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Forstyr ikke"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Nyhed! Forstyr ikke skjuler underretninger"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Nyhed! Forstyr ikke skjuler notifikationer"</string>
<string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tryk for at få flere oplysninger og foretage ændringer."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Tilstanden Forstyr ikke blev ændret"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tryk for at se, hvad der er blokeret."</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"vises over andre apps på din skærm"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikation med oplysninger om rutinetilstand"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Indlæser"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 608743874cc6..205b37339541 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Ermöglicht der App, Standorte aus deiner Mediensammlung abzurufen."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> möchte, dass du dich authentifizierst."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrische Hardware nicht verfügbar"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentifizierung abgebrochen"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nicht erkannt"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentifizierung abgebrochen"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Fingerabdruck teilweise erkannt. Bitte versuche es noch einmal."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingerabdruck konnte nicht verarbeitet werden. Bitte versuche es noch einmal."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerabdrucksensor ist verschmutzt. Reinige ihn und versuche es noch einmal."</string>
@@ -679,7 +677,7 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Anforderung, dass gespeicherte App-Daten verschlüsselt werden"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Kameras deaktivieren"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Nutzung sämtlicher Gerätekameras unterbinden"</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Einige Funktionen der Displaysperre deaktivieren"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Displaysperre teilweise deaktivieren"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Verwendung einiger Funktionen der Displaysperre verhindern"</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Öffnen mit"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mit %1$s öffnen"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öffnen"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Zugriff zum Öffnen von <xliff:g id="HOST">%1$s</xliff:g>-Links erlauben"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Zugriff zum Öffnen von <xliff:g id="HOST">%1$s</xliff:g>-Links mit <xliff:g id="APPLICATION">%2$s</xliff:g> erlauben"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Zugriff erlauben"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Bearbeiten mit"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Mit %1$s bearbeiten"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Bearbeiten"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Anruf annehmen?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Immer"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Nur diesmal"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Einstellungen"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Das Arbeitsprofil wird von %1$s nicht unterstützt."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Farbkorrektur"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung aktiviert"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung deaktiviert"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Verwende noch einmal die Verknüpfung für Bedienungshilfen, um die aktuelle Bedienungshilfe zu starten."</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um <xliff:g id="SERVICE_NAME">%1$s</xliff:g> zu verwenden"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wähle eine Funktion aus, die verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Um die Funktionen zu ändern, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergrößerung"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"wird über anderen Apps auf dem Bildschirm angezeigt"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Infomitteilung zum Ablaufmodus"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Energiesparmodus aktiviert, um die Akkulaufzeit zu verlängern"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Wird geladen"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f89930979a11..e4e7a765f50e 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Επιτρέπει στην εφαρμογή να διαβάσει τοποθεσίες από τη συλλογή πολυμέσων σας."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> επιθυμεί έλεγχο ταυτότητας."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Δεν υπάρχει διαθέσιμος βιομετρικός εξοπλισμός"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Ο έλεγχος ταυτότητας ακυρώθηκε"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Δεν αναγνωρίστηκε"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Ο έλεγχος ταυτότητας ακυρώθηκε"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Εντοπίστηκε μερικό μοναδικό χαρακτηριστικό. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Δεν ήταν δυνατή η επεξεργασία του μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Ο αισθητήρας μοναδικού χαρακτηριστικού δεν είναι καθαρός. Καθαρίστε τον και δοκιμάστε ξανά."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Άνοιγμα με"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Άνοιγμα με %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Άνοιγμα"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Παραχώρηση πρόσβασης για το άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Παραχώρηση πρόσβασης για το άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με την εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Παροχή πρόσβασης"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Επεξεργασία με"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Επεξεργασία με %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Επεξεργασία"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Αποδοχή κλήσης;"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Πάντα"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Μόνο μία φορά"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ρυθμίσεις"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Το προφίλ εργασίας δεν υποστηρίζεται από %1$s"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Τηλεόραση"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Διόρθωση χρωμάτων"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Η συντόμευση προσβασιμότητας ενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Η συντόμευση προσβασιμότητας απενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Χρησιμοποιήστε τη Συντόμευση προσβασιμότητας ξανά, για να ξεκινήσετε την τρέχουσα λειτουργία προσβασιμότητας"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Πατήστε παρατεταμένα και τα δύο κουμπιά έντασης ήχου για τρία δευτερόλεπτα, ώστε να χρησιμοποιήσετε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Επιλέξτε μια λειτουργία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού \"Προσβασιμότητα\"."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Για να αλλάξετε λειτουργίες, αγγίξτε παρατεταμένα το κουμπί \"Προσβασιμότητα\"."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Μεγιστοποίηση"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Κάμερα"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Μικρόφωνο"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Φόρτωση"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 7288a80d01b9..7dd3da20edc1 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Allows the app to read locations from your media collection."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Application <xliff:g id="APP">%s</xliff:g> wants to authenticate."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometric hardware unavailable"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentication cancelled"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentication cancelled"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch &amp; hold the Accessibility button."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microphone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"displaying over other apps on your screen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 04817558d544..21f6f1fb6294 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Allows the app to read locations from your media collection."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Application <xliff:g id="APP">%s</xliff:g> wants to authenticate."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometric hardware unavailable"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentication cancelled"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentication cancelled"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch &amp; hold the Accessibility button."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microphone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"displaying over other apps on your screen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 7288a80d01b9..7dd3da20edc1 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Allows the app to read locations from your media collection."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Application <xliff:g id="APP">%s</xliff:g> wants to authenticate."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometric hardware unavailable"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentication cancelled"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentication cancelled"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch &amp; hold the Accessibility button."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microphone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"displaying over other apps on your screen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 7288a80d01b9..7dd3da20edc1 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Allows the app to read locations from your media collection."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Application <xliff:g id="APP">%s</xliff:g> wants to authenticate."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometric hardware unavailable"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentication cancelled"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentication cancelled"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch &amp; hold the Accessibility button."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microphone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"displaying over other apps on your screen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 5d3b466299ff..b4f1156d0174 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1126,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‎‎‏‏‎‎Open with‎‏‎‎‏‎"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎Open with %1$s‎‏‎‎‏‎"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎Open‎‏‎‎‏‎"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎Give access to open ‎‏‎‎‏‏‎<xliff:g id="HOST">%1$s</xliff:g>‎‏‎‎‏‏‏‎ links with‎‏‎‎‏‎"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎Give access to open ‎‏‎‎‏‏‎<xliff:g id="HOST">%1$s</xliff:g>‎‏‎‎‏‏‏‎ links with ‎‏‎‎‏‏‎<xliff:g id="APPLICATION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎Give access‎‏‎‎‏‎"</string>
<string name="whichEditApplication" msgid="144727838241402655">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎Edit with‎‏‎‎‏‎"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎Edit with %1$s‎‏‎‎‏‎"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎Edit‎‏‎‎‏‎"</string>
@@ -1564,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎Accept call?‎‏‎‎‏‎"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎Always‎‏‎‎‏‎"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎Just once‎‏‎‎‏‎"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎Settings‎‏‎‎‏‎"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎%1$s doesn\'t support work profile‎‏‎‎‏‎"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎Tablet‎‏‎‎‏‎"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎TV‎‏‎‎‏‎"</string>
@@ -1643,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎Color Correction‎‏‎‎‏‎"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎Accessibility Shortcut turned ‎‏‎‎‏‏‎<xliff:g id="SERVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ on‎‏‎‎‏‎"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎Accessibility Shortcut turned ‎‏‎‎‏‏‎<xliff:g id="SERVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ off‎‏‎‎‏‎"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎Use Accessibility Shortcut again to start the current accessibility feature‎‏‎‎‏‎"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎Press and hold both volume keys for three seconds to use ‎‏‎‎‏‏‎<xliff:g id="SERVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎Choose a feature to use when you tap the Accessibility button:‎‏‎‎‏‎"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎To change features, touch &amp; hold the Accessibility button.‎‏‎‎‏‎"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎Magnification‎‏‎‎‏‎"</string>
@@ -1973,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎Camera‎‏‎‎‏‎"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎Microphone‎‏‎‎‏‎"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‎displaying over other apps on your screen‎‏‎‎‏‎"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎Routine Mode info notification‎‏‎‎‏‎"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎Battery may run out before usual charge‎‏‎‎‏‎"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎Battery Saver activated to extend battery life‎‏‎‎‏‎"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎Loading‎‏‎‎‏‎"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index d369da5f1387..dc0a13246523 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que la app lea las ubicaciones de tu colección de contenido multimedia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"La aplicación de <xliff:g id="APP">%s</xliff:g> quiere autenticarte"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"No hay hardware biométrico disponible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Se canceló la autenticación"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoció"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Se canceló la autenticación"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"La huella digital se detectó parcialmente. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No se pudo procesar la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor de huellas digitales está sucio. Limpia el sensor y vuelve a intentarlo."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Otorgar acceso para abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Otorgar acceso para abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Otorgar acceso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editar"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de color"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo de accesibilidad activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo de accesibilidad desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Vuelve a usar el acceso directo de accesibilidad para iniciar la función de accesibilidad actual"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Mantén presionadas ambas teclas de volumen durante tres segundos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Elige una función para usar cuando presionas el botón Accesibilidad:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar funciones, mantén presionado el botón Accesibilidad."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Cámara"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micrófono"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"se superpone a otras apps en tu pantalla"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación de información del modo de Rutinas"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Es posible que la batería se agote antes de la carga habitual"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 91742482bc1d..c819bb67a4c0 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que la aplicación lea las ubicaciones de tu colección de contenido multimedia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> solicita tu autenticación."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biométrico no disponible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autenticación cancelada"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoce"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autenticación cancelada"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Se ha detectado una huella digital parcial. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No se ha podido procesar la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor de huellas digitales está sucio. Límpialo y vuelve a intentarlo."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Permitir acceso para abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Permitir acceso para abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permitir acceso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Cambiar"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ajustes"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de color"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo a accesibilidad ha activado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo a accesibilidad ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Usa de nuevo la combinación de teclas de accesibilidad para iniciar la función de accesibilidad actual"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Para utilizar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, mantén pulsadas ambas teclas de volumen durante 3 segundos"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Selecciona la función que se utilizará cuando toques el botón Accesibilidad:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar las funciones, mantén pulsado el botón Accesibilidad."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliar"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Cámara"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micrófono"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"se muestra sobre otras aplicaciones que haya en la pantalla"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación sobre el modo rutina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Es posible que te quedes sin batería antes de lo habitual"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Se ha activado el ahorro de batería para aumentar la duración de la batería"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index f20b35ff15c9..f1c4106f3a4b 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Võimaldab rakendusel lugeda teie meediakogus olevaid asukohti."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Rakendus <xliff:g id="APP">%s</xliff:g> soovib autentimist."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biomeetriline riistvara ei ole saadaval"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentimine tühistati"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tuvastatud"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentimine tühistati"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Tuvastati osaline sõrmejälg. Proovige uuesti."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Sõrmejälge ei õnnestunud töödelda. Proovige uuesti."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sõrmejäljeandur on must. Puhastage see ja proovige uuesti."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Avamine:"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avamine rakendusega %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ava"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Juurdepääsu andmine, et avada üksuse <xliff:g id="HOST">%1$s</xliff:g> lingid"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Juurdepääsu andmine, et avada üksuse <xliff:g id="HOST">%1$s</xliff:g> lingid rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Juudep. andmine"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Muutmine:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muutmine rakendusega %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Muuda"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Ainult üks kord"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Seaded"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei toeta tööprofiili"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tahvelarvuti"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Teler"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Värviparandus"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> sisse"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> välja"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Praeguse juurdepääsufunktsiooni käivitamiseks kasutage juurdpääsetavuse otseteed uuesti"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valige, millist funktsiooni kasutada, kui vajutate nuppu Juurdepääsetavus:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funktsioonide muutmiseks puudutage pikalt nuppu Juurdepääsetavus."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurendus"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kaamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"teie ekraanil muude rakenduste peal kuvamine"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutiinirežiimi teabe märguanne"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laadimine"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 153eeae57584..c3611648d6a8 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Multimedia-edukien bildumako kokapena irakurtzea baimentzen die aplikazioei."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> aplikazioak autentifikatu egin nahi du."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometrikoa ez dago erabilgarri"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Utzi da autentifikazioa"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ez da ezagutu"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Utzi egin da autentifikazioa"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hatz-marka digitala ez da osorik hauteman. Saiatu berriro."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ezin izan da prozesatu hatz-marka. Saiatu berriro."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Hatz-marka digitalen sentsorea zikina dago. Garbi ezazu, eta saiatu berriro."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Ireki honekin:"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Irekin %1$s aplikazioarekin"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ireki"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Eman <xliff:g id="HOST">%1$s</xliff:g> estekak irekitzeko baimena aplikazio honi:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Eman <xliff:g id="APPLICATION">%2$s</xliff:g> aplikazioari <xliff:g id="HOST">%1$s</xliff:g> irekitzeko baimena"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Eman sarbidea"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editatu honekin:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editatu %1$s aplikazioarekin"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editatu"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Deia onartu nahi duzu?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Beti"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Behin soilik"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ezarpenak"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s abiarazleak ez du laneko profil hau onartzen"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tableta"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Telebista"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Koloreen zuzenketa"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktibatu du"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> desaktibatu du"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Uneko erabilerraztasun-eginbidea abiarazteko, erabili erabilerraztasun-lasterbidea berriro"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> erabiltzeko, eduki sakatuta bolumen-tekla biak hiru segundoz"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Aukeratu zein eginbide erabili nahi duzun Erabilerraztasuna botoia sakatzean:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Eginbideak aldatzeko, eduki sakatuta Erabilerraztasuna botoia."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Lupa"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofonoa"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"pantailako beste aplikazioen gainean bistaratzen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ohitura moduaren informazio-jakinarazpena"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baliteke bateria ohi baino lehenago agortzea"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Bateria-aurrezlea aktibatuta dago bateriaren iraupena luzatzeko"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Kargatzen"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 76845c8d9714..5bf81fa16209 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"به برنامه اجازه می‌دهد مکان‌ها را از مجموعه رسانه‌تان بخواند."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"برنامه <xliff:g id="APP">%s</xliff:g> می‌خواهد احراز هویت کند."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"سخت‌افزار زیست‌سنجی دردسترس نیست"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"احراز هویت لغو شد"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"شناسایی نشد"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"احراز هویت لغو شد"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"بخشی از اثر انگشت شناسایی شد. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"اثرانگشت پردازش نشد. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"حسگر اثر انگشت کثیف است. لطفاً آن را تمیز کنید و دوباره امتحان نمایید."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"باز کردن با"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‏باز کردن با %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"باز کردن"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ارائه دسترسی برای باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ارائه دسترسی برای باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با<xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ارائه دسترسی"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ویرایش با"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"‏ویرایش با %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ویرایش"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"تماس را می‌پذیرید؟"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"همیشه"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"فقط این بار"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"تنظیمات"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"‏%1$s از نمایه کاری پشتیبانی نمی‌کند"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"رایانهٔ لوحی"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"تلویزیون"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"تصحیح رنگ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"«میان‌بر دسترس‌پذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را روشن کرد"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"«میان‌بر دسترس‌پذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را خاموش کرد"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"برای راه‌اندازی ویژگی دسترس‌پذیری کنونی، دوباره از «میان‌بر دسترس‌پذیری» استفاده کنید"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"برای استفاده از <xliff:g id="SERVICE_NAME">%1$s</xliff:g>، هر دو کلید صدا را فشار دهید و سه ثانیه نگه دارید"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"قابلیتی را انتخاب کنید که هنگام ضربه زدن روی دکمه «دسترس‌پذیری» استفاده می‌شود:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"برای تغییر دادن قابلیت‌ها، دکمه «دسترس‌پذیری» را لمس کنید و نگه‌دارید."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"درشت‌نمایی"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"دوربین"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"میکروفون"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"نمایش روی برنامه‌های دیگر در صفحه‌نمایش"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"اعلان اطلاعات حالت روال معمول"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"جهت افزایش عمر باتری، بهینه‌سازی باتری فعال شد"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"درحال بارگیری"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 16c96ccba166..9e2fde50b26e 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Antaa sovelluksen lukea mediakokoelmasi sijainteja."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> pyytää todentamista"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrinen laitteisto ei käytettävissä"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Todennus peruutettu"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tunnistettu"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Todennus peruutettu"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Sormenjälki havaittiin vain osittain. Yritä uudelleen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Sormenjäljen käsittely epäonnistui. Yritä uudelleen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sormenjälkitunnistin on likainen. Puhdista tunnistin ja yritä uudelleen."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Avaa sovelluksessa"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avaa sovelluksessa %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Avaa"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Salli linkkien (<xliff:g id="HOST">%1$s</xliff:g>) avaaminen:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Salli linkkien (<xliff:g id="HOST">%1$s</xliff:g>) avaaminen: <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Salli"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Muokkaa sovelluksessa"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muokkaa sovelluksessa %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Muokkaa"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vastataanko puheluun?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Aina"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Vain kerran"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Asetukset"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei tue työprofiilia"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tabletti"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televisio"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Värinkorjaus"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> otettiin käyttöön esteettömyystilan pikanäppäimellä."</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> poistettiin käytöstä esteettömyystilan pikanäppäimellä."</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Valitse esteettömyystilan oikopolku uudelleen käynnistääksesi esteettömyysominaisuuden"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Voit käyttää palvelua <xliff:g id="SERVICE_NAME">%1$s</xliff:g> painamalla molempia äänenvoimakkuuspainikkeita kolmen sekunnin ajan"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valitse toiminto, jonka Esteettömyys-painike aktivoi:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jos haluat muokata ominaisuuksia, kosketa Esteettömyys-painiketta pitkään."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurennus"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofoni"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"näkyy näytöllä muiden sovellusten päällä"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ohjelmatilan tietoilmoitus"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ladataan"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 6fb1f1291d9b..3b841d5eeaa4 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Autorise l\'application à lire les positions indiquées dans votre collection multimédia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> vous demande de vous authentifier."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Matériel biométrique indisponible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentification annulée"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Données biométriques non reconnues"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentification annulée"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Empreinte digitale partielle détectée. Veuillez essayer de nouveau."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossible de traiter les empreintes digitales. Veuillez essayer de nouveau."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Le capteur d\'empreintes digitales est sale. Veuillez le nettoyer et essayer de nouveau."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Accorder l\'accès pour ouvrir les liens de <xliff:g id="HOST">%1$s</xliff:g> avec"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Accorder l\'accès pour ouvrir les liens de <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Modifier"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne prend pas en charge le profil professionnel"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablette"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Télévision"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correction des couleurs"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilisez à nouveau le raccourci d\'accessibilité pour démarrer la fonctionnalité d\'accessibilité actuelle"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Maintenez enfoncées les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous touchez le bouton d\'accessibilité :"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer des fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zoom"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Appareil photo"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microphone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"superpose du contenu par-dessus d\'autres applications à l\'écran"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification d\'information du mode Routine"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Chargement en cours…"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index fa8c7f0de1a1..28df3bf59701 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Autorise l\'application à consulter des positions issues de votre bibliothèque multimédia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"L\'application <xliff:g id="APP">%s</xliff:g> veut vous authentifier."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Matériel biométrique indisponible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Authentification annulée"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Non reconnu"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Authentification annulée"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Empreinte numérique partiellement détectée. Veuillez réessayer."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossible de reconnaître l\'empreinte numérique. Veuillez réessayer."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Le lecteur d\'empreintes numériques est sale. Veuillez le nettoyer, puis réessayer."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Autoriser l\'ouverture des liens <xliff:g id="HOST">%1$s</xliff:g> avec"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Autoriser l\'ouverture des liens <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Modifier"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s n\'est pas compatible avec le profil professionnel."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablette"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Téléviseur"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correction des couleurs"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilisez à nouveau le raccourci d\'accessibilité pour démarrer la fonctionnalité d\'accessibilité actuelle"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Appuyez de manière prolongée sur les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton d\'accessibilité :"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer des fonctionnalités, appuyez de manière prolongée sur le bouton d\'accessibilité."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Agrandissement"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Caméra"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micro"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"se superpose aux autres applications sur l\'écran"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification d\'information du mode Routine"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Vous risquez d\'être à court de batterie plus tôt que prévu"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Économiseur de batterie activé pour prolonger l\'autonomie"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Chargement…"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 2c9b09d84668..339f0f4f7ca5 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -32,7 +32,7 @@
<string name="unknownName" msgid="6867811765370350269">"Descoñecido"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Correo de voz"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
- <string name="mmiError" msgid="5154499457739052907">"Problema de conexión ou código MMI non válido."</string>
+ <string name="mmiError" msgid="5154499457739052907">"Problema de conexión ou código MMI non-válido."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"A operación está restrinxida a números de marcación fixa."</string>
<string name="mmiErrorWhileRoaming" msgid="762488890299284230">"Non se pode cambiar a configuración do desvío de chamadas desde o teléfono mentres estás en itinerancia."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"Activouse o servizo."</string>
@@ -150,7 +150,7 @@
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: non desviada"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: non reenviada"</string>
<string name="fcComplete" msgid="3118848230966886575">"Código de función completo"</string>
- <string name="fcError" msgid="3327560126588500777">"Problema de conexión ou código de función non válido"</string>
+ <string name="fcError" msgid="3327560126588500777">"Problema de conexión ou código de función non-válido"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"Aceptar"</string>
<string name="httpError" msgid="7956392511146698522">"Produciuse un erro na rede."</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"Non se puido atopar o URL."</string>
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que a aplicación lea as localizacións da túa colección multimedia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"A aplicación <xliff:g id="APP">%s</xliff:g> quere que te autentiques."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"O hardware biométrico non está dispoñible"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Cancelouse a autenticación"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Non se recoñeceu"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Cancelouse a autenticación"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Detectouse unha impresión dixital parcial. Téntao de novo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Non se puido procesar a impresión dixital. Téntao de novo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impresión dixital está sucio. Límpao e téntao de novo."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acceso para abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acceso para abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acceso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editar"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceptar chamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Só unha vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non admite o perfil de traballo"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tableta"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televisión"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de cor"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atallo de accesibilidade activou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atallo de accesibilidade desactivou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Para iniciar a función de accesibilidade actual, utiliza de novo o atallo de accesibilidade"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Mantén premidas as teclas do volume durante tres segudos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolle que función queres utilizar cando toques o botón Accesibilidade:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar as funcións, mantén premido o botón Accesibilidade."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Cámara"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micrófono"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"mostrando outras aplicacións na pantalla"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación da información do modo de rutina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"A batería pode esgotarse antes do habitual"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index da8a6e510ed8..2124759d0cf7 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"એપને તમારા મીડિયા સંગ્રહમાંથી સ્થાનો વાંચવાની મંજૂરી આપે છે."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> ઍપ પ્રમાણીકરણ કરવા માગે છે."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"બાયોમેટ્રિક હાર્ડવેર ઉપલબ્ધ નથી"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"પ્રમાણીકરણ રદ કર્યું"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ઓળખાયેલ નથી"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"પ્રમાણીકરણ રદ કર્યું"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"આંશિક ફિંગરપ્રિન્ટ મળી. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ફિંગરપ્રિન્ટ પ્રક્રિયા કરી શકાઈ નથી. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ફિંગરપ્રિન્ટ સેન્સર ગંદું છે. કૃપા કરીને સાફ કરો અને ફરી પ્રયાસ કરો."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"આની સાથે ખોલો"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s સાથે ખોલો"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ખોલો"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"આના વડે <xliff:g id="HOST">%1$s</xliff:g>ની લિંક ખોલવા માટે ઍક્સેસ આપો"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> વડે <xliff:g id="HOST">%1$s</xliff:g>ની લિંક ખોલવા માટે ઍક્સેસ આપો"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ઍક્સેસ આપો"</string>
<string name="whichEditApplication" msgid="144727838241402655">"આનાથી સંપાદિત કરો"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s સાથે સંપાદિત કરો"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"સંપાદિત કરો"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"કૉલ સ્વીકારીએ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"હંમેશા"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ફક્ત એક વાર"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"સેટિંગ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s કાર્ય પ્રોફાઇલનું સમર્થન કરતું નથી"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ટેબ્લેટ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"રંગ સુધારણા"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"વર્તમાન ઍક્સેસિબિલિટી સુવિધાને શરૂ કરવા માટે ફરીથી ઍક્સેસિબિલિટી શૉર્ટકટનો ઉપયોગ કરો"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>નો ઉપયોગ કરવા માટે બન્ને વૉલ્યૂમ કીને ત્રણ સેકન્ડ સુધી દબાવી રાખો"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સુવિધા પસંદ કરો:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"સુવિધાઓ બદલવા માટે, ઍક્સેસિબિલિટી બટન દબાવી રાખો."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"વિસ્તૃતીકરણ"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"કૅમેરા"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"માઇક્રોફોન"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"આ તમારી સ્ક્રીન પર અન્ય ઍપની ઉપર દેખાશે"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"લોડિંગ"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 4349c09dd516..db89c3e5a00d 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"इससे ऐप्लिकेशन को आपके मीडिया संग्रह से जगह की जानकारी एक्सेस करने की अनुमति दी जाती है."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"ऐप्लिकेशन <xliff:g id="APP">%s</xliff:g> पुष्टि करना चाहता है."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"बायोमेट्रिक हार्डवेयर उपलब्ध नहीं है"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"प्रमाणीकरण रद्द किया गया"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"पहचान नहीं हो पाई"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"प्रमाणीकरण रद्द किया गया"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फ़िंगरप्रिंट की पहचान की गई. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फ़िंगरप्रिंट संसाधित नहीं हो सका. कृपया पुन: प्रयास करें."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फ़िंगरप्रिंट सेंसर गंदा है. कृपया साफ़ करें और फिर कोशिश करें."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"इसमें खोलें"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s में खोलें"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोलें"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"इससे <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलने का एक्सेस दें"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> से <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलने का एक्सेस दें"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"एक्सेस दें"</string>
<string name="whichEditApplication" msgid="144727838241402655">"इसके ज़रिये बदलाव करें"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s की मदद से बदलाव करें"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"बदलाव करें"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकार करें?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"हमेशा"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"केवल एक बार"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफ़ाइल का समर्थन नहीं करता"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"टैबलेट"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"टीवी"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"रंग में सुधार करने की सुविधा"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"मौजूदा सुलभता सुविधा शुरू करने के लिए \'सुलभता शॉर्टकट\' का फिर से इस्तेमाल करें"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> इस्तेमाल करने के लिए आवाज़ वाले दोनों बटन तीन सेकंड तक दबाकर रखें"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"सुलभता बटन पर टैप करते समय इस्तेमाल की जाने वाली सुविधा चुनें:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाओं में बदलाव करने के लिए, सुलभता बटन को दबाकर रखें."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"बड़ा करना"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"कैमरा"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"माइक्रोफ़ोन"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"आपकी स्क्रीन पर, इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"रूटीन मोड जानकारी की सूचना"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"प्राेफ़ाइल लोड हो रही है"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 2747521d38bd..4cd699b80d30 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Omogućuje aplikaciji čitanje lokacija iz vaše medijske zbirke."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacija <xliff:g id="APP">%s</xliff:g> traži autentifikaciju."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrijski hardver nije dostupan"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentifikacija otkazana"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentifikacija otkazana"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je djelomični otisak prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor otiska prsta nije čist. Očistite ga i pokušajte ponovo."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otvaranje pomoću aplikacije"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvaranje pomoću aplikacije %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Omogućite pristup za otvaranje <xliff:g id="HOST">%1$s</xliff:g> veza pomoću aplikacije"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Omogućite pristup za otvaranje <xliff:g id="HOST">%1$s</xliff:g> veza pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogući pristup"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Uređivanje pomoću aplikacije"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uređivanje pomoću aplikacije %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Uredi"</string>
@@ -1589,6 +1590,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava radni profil"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tabletno računalo"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televizor"</string>
@@ -1669,7 +1671,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcija boje"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečac pristupačnosti uključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečac pristupačnosti isključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Ponovo upotrijebite prečac pristupačnosti da biste pokrenuli trenutačnu značajku pristupačnosti"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povećavanje"</string>
@@ -2010,5 +2012,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotoaparat"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"prikazuje se preko drugih aplikacija na zaslonu"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitavanje"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 10538f402aa0..3d2ed09deb3f 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Engedélyezi az alkalmazásnak a helyek médiagyűjteményből való olvasását."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"A(z) <xliff:g id="APP">%s</xliff:g> alkalmazás hitelesítést kér."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrikus hardver nem áll rendelkezésre"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Hitelesítés megszakítva"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nem ismerhető fel"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Hitelesítés megszakítva"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"A rendszer az ujjlenyomatnak csak egy részletét érzékelte. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nem sikerült feldolgozni az ujjlenyomatot. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Az ujjlenyomat-olvasó koszos. Tisztítsa meg, majd próbálkozzon újra."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Megnyitás a következővel:"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Megnyitás a következővel: %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Megnyitás"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Engedély megadása, hogy a(z) <xliff:g id="HOST">%1$s</xliff:g> linkek a következő alkalmazásban nyíljanak meg:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Engedély megadása, hogy a(z) <xliff:g id="HOST">%1$s</xliff:g> linkek a következő alkalmazásban nyíljanak meg: <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Engedély adása"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Szerkesztés a következővel:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Szerkesztés a következővel: %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Szerkesztés"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Fogadja a hívást?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Mindig"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Csak egyszer"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Beállítások"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"A(z) %1$s nem támogatja a munkaprofilokat."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Táblagép"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Színkorrekció"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"A Kisegítő lehetőségek gyorsparancsa bekapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"A Kisegítő lehetőségek gyorsparancsa kikapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Használja újból a Kisegítő lehetőségek gyorsparancsát az aktuális kisegítő lehetőségek elindításához"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"A(z) <xliff:g id="SERVICE_NAME">%1$s</xliff:g> használatához tartsa lenyomva három másodpercig a két hangerőgombot"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Válassza ki a Kisegítő lehetőségek gombra koppintáskor használni kívánt funkciót:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"A funkciók módosításához tartsa lenyomva a Kisegítő lehetőségek gombot."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Nagyítás"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"megjelenítés a képernyőn lévő egyéb alkalmazások előtt"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Információs értesítés a rutinmódról"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Betöltés"</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index fbb5f4b7122e..e873140b57fd 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Թույլ է տալիս հավելվածին ճանաչել տեղադրության մասին տվյալները ձեր մեդիա բովանդակության հավաքածուից:"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> հավելվածը նույնականացում է հարցում"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Կենսաչափական սարքը հասանելի չէ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Նույնականացումը չեղարկվեց"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Չհաջողվեց ճանաչել"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Նույնականացումը չեղարկվեց"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Մատնահետքը հայտնաբերվել է մասամբ: Փորձեք նորից:"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Չհաջողվեց մշակել մատնահետքը: Նորից փորձեք:"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Մատնահետքերի սենսորն աղտոտված է: Մաքրեք այն և փորձեք նորից:"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Բացել հետևյալ ծրագրով՝"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Բացել ծրագրով՝ %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Բացել"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Թույլատրեք, որ <xliff:g id="HOST">%1$s</xliff:g> տիրույթը հղումները բացվեն հետևյալ հավելվածում՝"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Թույլատրեք, որ <xliff:g id="HOST">%1$s</xliff:g> տիրույթի հղումները բացվեն <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածում"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Թույլատրել"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Խմբագրել հետևյալ ծրագրով՝"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Խմբագրել հետևյալով՝ %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Փոփոխել"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Ընդունե՞լ զանգը:"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Միշտ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Միայն մեկ անգամ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Կարգավորումներ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s-ը չի աջակցում աշխատանքային պրոֆիլներ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Գրասալիկ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Հեռուստացույց"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Գունաշտկում"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Մատչելիության դյուրանցումն միացրել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Մատչելիության դյուրանցումն անջատել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Հատուկ գործառույթների դյուրանցումը գործարկելու համար նորից օգտագործեք համապատասխան դյուրանցումը"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"«<xliff:g id="SERVICE_NAME">%1$s</xliff:g>» ծառայությունն օգտագործելու համար սեղմեք և 3 վայրկյան պահեք ձայնի ուժգնության երկու կոճակները"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Ընտրեք որևէ գործառույթ, որը կօգտագործվի Հատուկ գործառույթներ կոճակին հպելու դեպքում՝"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Գործառույթները փոխելու համար հպեք և պահեք Հատուկ գործառույթներ կոճակը։"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Խոշորացում"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Տեսախցիկ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Խոսափող"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ցուցադրվում է մյուս հավելվածների վերևում"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ծանուցում լիցքավորման մասին"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Մարտկոցի լիցքը կարող է սովորականից շուտ սպառվել"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Մարտկոցի կյանքը երկարացնելու համար ակտիվացվել է մարտկոցի տնտեսման ռեժիմը"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Բեռնում"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 3c6e3473a778..299305fd7c6e 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Mengizinkan aplikasi untuk membaca lokasi dari koleksi media Anda."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikasi <xliff:g id="APP">%s</xliff:g> meminta autentikasi."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometrik tidak tersedia"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentikasi dibatalkan"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentikasi dibatalkan"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Sebagian sidik jari terdeteksi. Coba lagi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Tidak dapat memproses sidik jari. Coba lagi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sensor sidik jari kotor. Bersihkan dan coba lagi."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Berikan akses untuk membuka link <xliff:g id="HOST">%1$s</xliff:g> dengan"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Berikan akses untuk membuka link <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setelan"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak mendukung profil kerja"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Koreksi Warna"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan Aksesibilitas mengaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Aksesibilitas menonaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gunakan Pintasan Aksesibilitas lagi untuk memulai fitur aksesibilitas saat ini"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tekan dan tahan kedua tombol volume selama tiga detik untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih fitur yang akan digunakan saat menge-tap tombol Aksesibilitas:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk mengubah fitur, sentuh &amp; tahan tombol Aksesibilitas."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ditampilkan di atas aplikasi lain di layar"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikasi info Mode Rutinitas"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Memuat"</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index f638ff816f15..94030bbed7b3 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Leyfir forritinu að lesa staðsetningar úr efnissafninu þínu."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> forritið vill staðfestingu."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Lífkennavélbúnaður ekki tiltækur"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Hætt við auðkenningu"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Þekktist ekki"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Hætt við auðkenningu"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hluti fingrafars greindist. Reyndu aftur."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ekki var hægt að vinna úr fingrafarinu. Reyndu aftur."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingrafaraskynjarinn er óhreinn. Hreinsaðu hann og reyndu aftur."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Opna með"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Opna með %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Opna"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Veita aðgang til að opna <xliff:g id="HOST">%1$s</xliff:g> tengla með"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Veita aðgang til að opna <xliff:g id="HOST">%1$s</xliff:g> tengla með <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Veita aðgang"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Breyta með"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Breyta með %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Breyta"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Samþykkja símtal?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltaf"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara einu sinni"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Stillingar"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s styður ekki vinnusnið"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Spjaldtölva"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Sjónvarp"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Litaleiðrétting"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Flýtileið aðgengisstillingar kveikti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Flýtileið aðgengisstillingar slökkti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Notaðu flýtileið aðgengisstillingar aftur til að opna aðgengiseiginleika"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Haltu báðum hljóðstyrkstökkunum inni í þrjár sekúndur til að nota <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Veldu eiginleika sem á að nota þegar ýtt er á aðgengishnappinn:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Haltu fingri á aðgengishnappinum til að breyta eiginleikum."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Stækkun"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Myndavél"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Hljóðnemi"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"birt yfir öðrum forritum á skjánum"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Upplýsingatilkynning aðgerðastillingar"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Hleður"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index c9c8f0c4039b..3be8acb309fb 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Consente all\'app di leggere le posizioni dalla tua raccolta multimediale."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"L\'app <xliff:g id="APP">%s</xliff:g> richiede l\'autenticazione."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometrico non disponibile"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autenticazione annullata"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Non riconosciuto"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autenticazione annullata"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Rilevata impronta digitale parziale. Riprova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossibile elaborare l\'impronta digitale. Riprova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Il sensore di impronte digitali è sporco. Puliscilo e riprova."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Apri con"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Apri con %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Apri"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dai l\'accesso per aprire i link di <xliff:g id="HOST">%1$s</xliff:g> con"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dai l\'accesso per aprire i link di <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Fornisci accesso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Modifica con"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifica con %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Modifica"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Accettare la chiamata?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una volta"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Impostazioni"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non supporta il profilo di lavoro"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correzione del colore"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La scorciatoia Accessibilità ha attivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La scorciatoia Accessibilità ha disattivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Usa di nuovo la scorciatoia Accessibilità per avviare l\'attuale funzione di accessibilità"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tieni premuti entrambi i tasti del volume per tre secondi per utilizzare <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Scegli una funzione da usare quando tocchi il pulsante Accessibilità:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per cambiare le funzioni, tocca e tieni premuto il pulsante Accessibilità."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ingrandimento"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotocamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfono"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"si sovrappone ad altre app sullo schermo"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifica di informazioni sulla modalità Routine"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Risparmio energetico attivo per far durare di più la batteria"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Caricamento"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 26f6988fd528..d3cdd090f516 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"מאפשרת לאפליקציה לקרוא מיקומים מאוסף המדיה שלך."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"האפליקציה <xliff:g id="APP">%s</xliff:g> רוצה לבצע אימות."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"חומרה ביומטרית לא זמינה"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"האימות בוטל"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"לא זוהתה"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"האימות בוטל"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"זוהתה טביעת אצבע חלקית. נסה שוב."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"לא ניתן היה לעבד את טביעת האצבע. נסה שוב."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"החיישן של טביעות האצבעות מלוכלך. נקה אותו ונסה שוב."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"פתח באמצעות"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‏פתח באמצעות %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"פתח"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"הענקת גישה לפתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"הענקת גישה לפתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"הענקת גישה"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ערוך באמצעות"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"‏ערוך באמצעות %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"עריכה"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"האם לקבל את השיחה?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"תמיד"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"רק פעם אחת"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"הגדרות"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"‏%1$s אינו תומך בפרופיל עבודה"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"טאבלט"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"טלוויזיה"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"תיקון צבעים"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הופעל על-ידי קיצור הדרך לנגישות"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הושבת על-ידי קיצור הדרך לנגישות"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"יש להשתמש שוב במקש הקיצור לנגישות כדי להפעיל את תכונת הנגישות הנוכחית"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"בחר תכונה שתופעל כשתלחץ על הלחצן \'נגישות\':"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"כדי להחליף תכונה, גע בלחצן \'נגישות\' והחזק אותו."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"הגדלה"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"מצלמה"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"מיקרופון"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"תצוגה מעל אפליקציות אחרות במסך"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"התראת מידע לגבי מצב שגרתי"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"בטעינה"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 45587cb7facb..583ed78899f2 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"メディア コレクションの位置情報の読み取りをアプリに許可します。"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"アプリ <xliff:g id="APP">%s</xliff:g> が認証を求めています。"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"生体認証ハードウェアが利用できません"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"認証をキャンセルしました"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"認識されませんでした"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"認証をキャンセルしました"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"指紋を一部しか検出できませんでした。もう一度お試しください。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"指紋を処理できませんでした。もう一度お試しください。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋認証センサーに汚れがあります。汚れを落としてもう一度お試しください。"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"アプリで開く"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sで開く"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"開く"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> のリンクを開くには、アクセス権を付与してください"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> で <xliff:g id="HOST">%1$s</xliff:g> のリンクを開くには、アクセス権を付与してください"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"アクセス権を付与"</string>
<string name="whichEditApplication" msgid="144727838241402655">"編集に使用"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sで編集"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"編集"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"通話を受けますか?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"常時"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"1回のみ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sは仕事用プロファイルをサポートしていません"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"タブレット"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"テレビ"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"色補正"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は ON になっています"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は OFF になっています"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"現在のユーザー補助機能を開始するには、ユーザー補助機能のショートカットをもう一度使用してください"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> を使用するには、音量大と音量小の両方のボタンを 3 秒間長押ししてください"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"[ユーザー補助] ボタンをタップした場合に使用する機能を選択してください。"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"機能を変更するには、[ユーザー補助] ボタンを押し続けてください。"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"拡大"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"カメラ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"マイク"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"画面の他のアプリの上に重ねて表示"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ルーティン モード情報の通知"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"通常の充電を行う前に電池が切れる可能性があります"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"読み込んでいます"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 07df9fc4ff75..2356fd440cf0 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"აპი შეძლებს მდებარეობების გაცნობას თქვენი მედიაკოლექციიდან."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"აპლიკაცია <xliff:g id="APP">%s</xliff:g> ითხოვს ავტორიზაციას."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ბიომეტრიული აპარატურა მიუწვდომელია"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ავტორიზაცია გაუქმდა"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"არ არის ამოცნობილი"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ავტორიზაცია გაუქმდა"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"აღმოჩენილია თითის ნაწილობრივი ანაბეჭდი. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"თითის ანაბეჭდი ვერ მუშავდება. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"თითის ანაბეჭდის სენსორი დაბინძურებულია. გთხოვთ, გაასუფთაოთ და სცადოთ ხელახლა."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"გახსნა აპით"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s-ით გახსნა"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"გახსნა"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების შემდეგი აპით გახსნის წვდომის მინიჭება:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების <xliff:g id="APPLICATION">%2$s</xliff:g>-ით გახსნის წვდომის მინიჭება"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"წვდომის მინიჭება"</string>
<string name="whichEditApplication" msgid="144727838241402655">"რედაქტირება აპით:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"რედაქტირება %1$s-ით"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"რედაქტირება"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"უპასუხებთ ზარს?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ყოველთვის"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"მხოლოდ ერთხელ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"პარამეტრები"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s მხარს არ უჭერს სამუშაო პროფილს"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ტაბლეტი"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ტელევიზია"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ფერთა კორექცია"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"მარტივი წვდომის მალსახმობმა ჩართო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"მარტივი წვდომის მალსახმობმა გამორთო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"მარტივი წვდომის ამჟამინდელი ფუნქციის გასაშვებად გამოიყენეთ მარტივი წვდომის მალსახმობი"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> რომ გამოიყენოთ, დააჭირეთ ხმის ორივე ღილაკზე 3 წამის განმავლობაში"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი ფუნქცია:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ფუნქციების შესაცვლელად ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"გადიდება"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"კამერა"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"მიკროფონი"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"სხვა აპების გადაფარვით ჩანს თქვენს ეკრანზე"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"იტვირთება"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index c622094f3e26..f714ebe9e575 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Қолданбаға медиамазмұн жинағынан геодеректерді оқуға мүмкіндік береді."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> қолданбасына аутентификация қажет."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометрикалық жабдық жоқ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Аутентификациядан бас тартылды."</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Танылмады"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Аутентификациядан бас тартылды."</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Саусақ ізі ішінара анықталды. Әрекетті қайталаңыз."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Саусақ ізін өңдеу мүмкін емес. Әрекетті қайталаңыз."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Саусақ ізі сенсоры лас. Тазалап, әрекетті қайталаңыз."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Басқаша ашу"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s қолданбасымен ашу"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ашу"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін келесі қолданбамен ашу үшін рұқсат беру:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасымен ашу үшін рұқсат беру"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Рұқсат беру"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Келесімен өңдеу"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s көмегімен өңдеу"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Өңдеу"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Қоңырауды қабылдау?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Үнемі"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Бір рет қана"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Параметрлер"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жұмыс профилін қолдамайды"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Планшет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ТД"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Түсті түзету"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін қосты"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін өшірді"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Арнайы мүмкіндіктер функциясын іске қосу үшін оның таңбашасын пайдаланыңыз"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын мүмкіндікті таңдаңыз:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін түртіп, ұстап тұрыңыз."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ұлғайту"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"экранда басқа қолданбалардың үстінен көрсету"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Режим туралы хабарландыру"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея заряды азаюы мүмкін"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батарея ұзаққа жетуі үшін, Battery Saver іске қосылды"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Жүктелуде"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index ccc243d61edb..aa1adc84b7a3 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"អនុញ្ញាតឱ្យ​កម្មវិធី​អាន​ទីតាំង​ពីបណ្ដុំ​មេឌៀ​របស់​អ្នក។"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"កម្មវិធី <xliff:g id="APP">%s</xliff:g> ចង់​ធ្វើ​កា​រផ្ទៀងផ្ទាត់។"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"មិនអាច​ប្រើឧបករណ៍​ស្កេន​ស្នាមម្រាមដៃ​បានទេ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"បាន​បោះបង់​ការ​ផ្ទៀងផ្ទាត់"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"មិនអាចសម្គាល់បានទេ"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"បាន​បោះបង់​ការ​ផ្ទៀងផ្ទាត់"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"បានផ្តិតយកស្នាមម្រាមដៃមិនពេញលក្ខណៈ។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"មិនអាចដំណើរការស្នាមម្រាមដៃបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ឧបករណ៍ផ្តិតម្រាមដៃប្រលាក់ហើយ។ សូមសម្អាត ហើយព្យាយាមម្តងទៀត។"</string>
@@ -1130,6 +1128,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"បើក​ជា​មួយ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"បើក​ជាមួយ %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"បើក"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ផ្ដល់​សិទ្ធិ​ចូលប្រើ ដើម្បី​បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> តាមរយៈ"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ផ្ដល់​សិទ្ធិ​ចូល​ប្រើ ដើម្បី​បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> តាមរយៈ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ផ្តល់​សិទ្ធិ​ចូល​ប្រើ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"កែសម្រួល​ជាមួយ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"កែសម្រួល​ជាមួយ​ %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"កែសម្រួល"</string>
@@ -1568,6 +1569,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ទទួល​ការ​ហៅ​?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ជា​និច្ច"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"តែ​ម្ដង"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ការកំណត់"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s មិន​គាំទ្រ​ប្រវត្តិរូប​ការងារ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"កុំព្យូទ័រ​បន្ទះ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ទូរទស្សន៍"</string>
@@ -1647,7 +1649,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ការ​កែ​ពណ៌"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ផ្លូវកាត់​ភាព​ងាយ​ស្រួល​បាន​បើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ផ្លូវកាត់​ភាព​ងាយ​ស្រួល​បាន​បិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ប្រើផ្លូវកាត់​ភាពងាយស្រួល​ម្ដងទៀត ដើម្បី​ចាប់ផ្ដើម​មុខងារ​ភាពងាយប្រើ​បច្ចុប្បន្ន"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"ចុចគ្រាប់ចុច​កម្រិត​សំឡេងទាំងពីរ​ឱ្យជាប់រយៈពេលបីវិនាទី ដើម្បីប្រើ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ជ្រើសរើស​មុខងារ​ដែលត្រូវ​ប្រើ នៅពេល​ដែល​អ្នកចុច​ប៊ូតុង​ភាពងាយស្រួល៖"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ដើម្បី​ផ្លាស់ប្តូរ​មុខងារ សូម​ចុច​ប៊ូតុង​ភាព​ងាយស្រួល​ឲ្យ​ជាប់។"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ការ​ពង្រីក"</string>
@@ -1977,5 +1979,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"កាមេរ៉ា"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"មីក្រូហ្វូន"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"កំពុងបង្ហាញ​ពីលើកម្មវិធីផ្សេងទៀត​នៅលើអេក្រង់​របស់អ្នក"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ការ​ជូនដំណឹង​ព័ត៌មាន​របស់​មុខងារ​ទម្លាប់"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ថ្ម​អាច​នឹង​អស់ មុនពេល​សាកថ្មធម្មតា"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"បាន​បើក​ដំណើរការកម្មវិធី​សន្សំ​ថ្ម ដើម្បីបង្កើនកម្រិត​ថាមពល​​ថ្ម"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"កំពុងផ្ទុក"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 835070a5f7cd..f33e297ecea6 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ನಿಮ್ಮ ಮೀಡಿಯಾ ಸಂಗ್ರಹಣೆಯಿಂದ ಸ್ಥಳಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್‌ಗೆ ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ಬಯೋಮೆಟ್ರಿಕ್ ಹಾರ್ಡ್‌ವೇರ್‌ ಲಭ್ಯವಿಲ್ಲ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ಪ್ರಮಾಣೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ಪ್ರಮಾಣೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ಭಾಗಶಃ ಬೆರಳಚ್ಚು ಪತ್ತೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ಬೆರಳಚ್ಚು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ಬೆರಳಚ್ಚು ಸೆನ್ಸಾರ್ ಕೊಳೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಅದನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ಜೊತೆಗೆ ತೆರೆಯಿರಿ"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ತೆರೆ"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್‌ಗಳನ್ನು ತೆರೆಯಲು ಪ್ರವೇಶವನ್ನು ನೀಡಿ"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್‌ಗಳನ್ನು ತೆರೆಯಲು ಪ್ರವೇಶವನ್ನು ನೀಡಿ"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ಪ್ರವೇಶ ಅನುಮತಿಸಿ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ಇವರ ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ಎಡಿಟ್"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ಕರೆ ಸ್ವೀಕರಿಸುವುದೇ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ಯಾವಾಗಲೂ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ಒಮ್ಮೆ ಮಾತ್ರ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ಟ್ಯಾಬ್ಲೆಟ್‌‌"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ಟಿವಿ"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದೆ"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ಪ್ರಸ್ತುತ ಪ್ರವೇಶದ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪ್ರಾರಂಭಿಸಲು ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃ ಬಳಸಿ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸಲು ಎರಡೂ ಧ್ವನಿ ಕೀಗಳನ್ನು ಮೂರು ಸೆಕೆಂಡ್‌ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆರಿಸಿ:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಒತ್ತಿಹಿಡಿದುಕೊಳ್ಳಿ."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ಕ್ಯಾಮರಾ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ಮೈಕ್ರೋಫೋನ್‌"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ಚಾರ್ಜ್‌ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ಲೋಡ್ ಆಗುತ್ತಿದೆ"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 888681552796..0e725a30657a 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"앱에서 미디어 컬렉션의 위치를 읽도록 허용합니다."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> 애플리케이션에서 인증을 요청합니다"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"생체 인식 하드웨어를 사용할 수 없음"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"인증이 취소되었습니다."</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"인식할 수 없음"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"인증이 취소되었습니다."</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"지문이 일부만 인식되었습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"지문 센서를 깨끗이 닦고 다시 시도하세요."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"연결 프로그램"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s(으)로 열기"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"열기"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"다음으로 <xliff:g id="HOST">%1$s</xliff:g> 링크를 열려면 액세스 권한 부여"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>(으)로 <xliff:g id="HOST">%1$s</xliff:g> 링크를 열려면 액세스 권한 부여"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"권한 부여"</string>
<string name="whichEditApplication" msgid="144727838241402655">"편집 프로그램:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s(으)로 수정"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"수정"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"한 번만"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"설정"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s에서 직장 프로필을 지원하지 않습니다."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"태블릿"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"색상 보정"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 설정되었습니다."</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 중지되었습니다."</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"현재 접근성 기능을 시작하려면 접근성 단축키를 다시 사용하세요"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> 서비스를 사용하려면 두 볼륨 키를 3초 동안 길게 누르세요"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"접근성 버튼을 탭할 때 사용할 기능을 선택하세요."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"기능을 변경하려면 접근성 버튼을 길게 터치하세요."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"확대"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"카메라"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"마이크"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"화면에서 다른 앱 위에 표시"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"루틴 모드 정보 알림"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"배터리 수명을 연장하기 위해 배터리 세이버가 활성화되었습니다."</string>
<string name="car_loading_profile" msgid="3545132581795684027">"로드 중"</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index de4974190d65..3e3ef6a5c612 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Колдонмого медиа жыйнагыңыз сакталган жерлерди окууга мүмкүнчүлүк берет."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> колдонмосунда аутентификациядан өтүңүз."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометрикалык аппарат жеткиликсиз"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Аныктыгын текшерүү жокко чыгарылды"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Таанылган жок"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Аныктыгын текшерүү жокко чыгарылды"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Манжа изи жарым-жартылай аныкталды. Кайра аракет кылыңыз."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Манжа изи иштелбей койду. Кайра аракет кылыңыз."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Манжа изинин сенсору кирдеп калган. Тазалап, кайра аракет кылыңыз."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Төмөнкү менен ачуу"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s менен ачуу"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ачуу"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Төмөнкү колдонмо менен <xliff:g id="HOST">%1$s</xliff:g> шилтемелерин ачууга уруксат берүү"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> колдонмосу менен <xliff:g id="HOST">%1$s</xliff:g> шилтемелерин ачууга уруксат берүү"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Мүмкүнчүлүк берүү"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Төмөнкү менен түзөтүү"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s менен түзөтүү"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Түзөтүү"</string>
@@ -1568,6 +1569,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Чалуу кабыл алынсынбы?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Дайыма"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Бир жолу гана"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Жөндөөлөр"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жумуш профилин колдоого албайт"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Планшет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Сыналгы"</string>
@@ -1647,7 +1649,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Түсүн тууралоо"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын күйгүздү"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын өчүрдү"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Учурдагы атайын мүмкүнчүлүктөр функциясын иштетүү үчүн кыска жолду кайра колдонуңуз"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштетиле турган функцияны тандаңыз:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Функцияларды өзгөртүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Чоңойтуу"</string>
@@ -1977,5 +1979,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"экрандагы башка терезелердин үстүнөн көрсөтүлүүдө"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Режимдин адаттагы билдирмеси"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Жүктөлүүдө"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 935630281e19..a63cd59c2eb6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ອະນຸຍາດໃຫ້ແອັບອ່ານສະຖານທີ່ຈາກຄໍເລັກຊັນມີເດຍຂອງທ່ານ."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"ແອັບພລິເຄຊັນ <xliff:g id="APP">%s</xliff:g> ຕ້ອງການກວດຮັບຮອງຄວາມຖືກຕ້ອງ."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ຮາດແວຊີວະມິຕິບໍ່ສາມາດໃຊ້ໄດ້"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ຍົກເລີກການຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ບໍ່ຮັບຮູ້"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ຍົກເລີກການຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ກວດ​ພົບ​ລາຍ​ນີ້ວ​ມື​ບາງ​ສ່ວນ​ແລ້ວ. ກະ​ລຸ​ນາ​ລອງ​ໃໝ່​ອີກ."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ບໍ່​ສາ​ມາດ​ດຳ​ເນີນ​ການ​ລາຍ​ນີ້ວ​ມື​ໄດ້. ກະ​ລຸ​ນາ​ລອງ​ໃໝ່​ອີກ."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ເຊັນ​ເຊີ​ລາຍ​ນີ້ວ​ມື​ເປື້ອນ. ກະ​ລຸ​ນາ​ທຳ​ຄວາມ​ສະ​ອາດ ແລະ​ລອງ​ໃໝ່​ອີກ."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ເປີດໂດຍໃຊ້"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"ເປີດ​ໂດຍ​ໃຊ້ %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ເປີດ"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ໃຫ້ສິດອະນຸຍາດເພື່ອເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ດ້ວຍ"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ໃຫ້ສິດອະນຸຍາດເພື່ອເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ດ້ວຍ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ໃຫ້ສິດອະນຸຍາດ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"​ແກ້​ໄຂ​ໃນ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"ແກ້​ໄຂ​ໃນ %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ແກ້ໄຂ"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ຮັບການໂທບໍ່?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ທຸກຄັ້ງ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ຄັ້ງດຽວ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ການຕັ້ງຄ່າ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ບໍ່​ຮອງ​ຮັບ​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ຂອງ​ທ່ານ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ແທັບເລັດ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ໂທລະພາບ"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ການແກ້ໄຂຄ່າສີ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ໃຊ້ປຸ່ມລັດການຊ່ວຍເຂົ້າເຖິງອີກເທື່ອໜຶ່ງເພື່ອຊອກຫາຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງໃນປັດຈຸບັນ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"ກົດປຸ່ມສຽງທັງສອງພ້ອມກັນຄ້າງໄວ້ສາມວິນາທີເພື່ອໃຊ້ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ເລືອກຄຸນສົມບັດທີ່ຈະໃຊ້ເມື່ອທ່ານແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ເພື່ອປ່ຽນຄຸນສົມບັດ, ໃຫ້ແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ການຂະຫຍາຍ"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ກ້ອງ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ໄມໂຄຣໂຟນ"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ກຳລັງໂຫລດ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 8870ebb55941..0c0887b149ed 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Programai leidžiama skaityti vietoves iš medijos kolekcijos."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Programa „<xliff:g id="APP">%s</xliff:g>“ nori jus autentifikuoti."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrinė aparatinė įranga nepasiekiama"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentifikavimas atšauktas"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Neatpažinta"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentifikavimas atšauktas"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Aptiktas dalinis piršto antspaudas. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nepavyko apdoroti piršto antspaudo. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Piršto antspaudo jutiklis purvinas. Nuvalykite ir bandykite dar kartą."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Atidaryti naudojant"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atidaryti naudojant %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atidaryti"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Suteikite prieigą atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Suteikite prieigą atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant „<xliff:g id="APPLICATION">%2$s</xliff:g>“"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Suteikti prieigą"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Redaguoti naudojant"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redaguoti naudojant %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Redaguoti"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Tik kartą"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nustatymai"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nepalaiko darbo profilio"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Planšetinis kompiuteris"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Spalvų taisymas"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo įjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo išjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Norėdami įjungti dabartinę pritaikymo neįgaliesiems funkciją, dar kartą naudokite spartųjį pritaikymo neįgaliesiems klavišą"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Jei norite naudoti „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“, paspauskite abu garsumo klavišus ir palaikykite tris sekundes"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pasirinkite funkciją, kuri bus naudojama, kai paliesite pritaikymo neįgaliesiems mygtuką:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jei norite pakeisti funkcijas, palieskite ir palaikykite pritaikymo neįgaliesiems mygtuką."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Didinimas"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotoaparatas"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofonas"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"rodo virš kitų programų jūsų ekrane"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Veiksmų sekos režimo informacijos pranešimas"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Įkeliama"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 5a1432b810e1..b802feea5da1 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Ļauj lietotnei lasīt atrašanās vietas no jūsu multivides kolekcijas."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Lietotne <xliff:g id="APP">%s</xliff:g> pieprasa autentificēt."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrisko datu aparatūra nav pieejama"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentifikācija ir atcelta"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Dati nav atpazīti"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentifikācija ir atcelta"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Noteikts daļējs pirksta nospiedums. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nevarēja apstrādāt pirksta nospiedumu. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Pirkstu nospiedumu sensors ir netīrs. Lūdzu, notīriet to un mēģiniet vēlreiz."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Atvērt, izmantojot"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atvērt, izmantojot %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atvērt"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Piekļuves piešķiršana, lai atvērtu <xliff:g id="HOST">%1$s</xliff:g> saites lietojumprogrammā"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Piekļuves piešķiršana, lai atvērtu <xliff:g id="HOST">%1$s</xliff:g> saites lietojumprogrammā <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Atļaut piekļuvi"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Rediģēt, izmantojot"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediģēt, izmantojot %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Rediģēt"</string>
@@ -1589,6 +1590,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Tikai vienreiz"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Iestatījumi"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Programma %1$s neatbalsta darba profilus"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Planšetdators"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1669,7 +1671,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Krāsu korekcija"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pieejamības saīsne aktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pieejamības saīsne deaktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Lai sāktu izmantot pašreizējo pieejamības funkciju, vēlreiz izmantojiet pieejamības saīsni."</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Lai izmantotu pakalpojumu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, nospiediet abus skaļuma taustiņus un turiet tos trīs sekundes."</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izvēlieties funkciju, ko izmantot, kad pieskaraties pogai Pieejamība."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Lai mainītu funkcijas, pieskarieties pogai Pieejamība un turiet to."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Palielinājums"</string>
@@ -2010,5 +2012,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofons"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"rāda pāri citām lietotnēm jūsu ekrānā"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatīvs paziņojums par akumulatoru"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Aktivizēts akumulatora jaudas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ielāde"</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 769ac435cafa..9c66edcb4d62 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Дозволува апликацијата да чита локации од вашата збирка на аудиовизуелни содржини."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Апликацијата <xliff:g id="APP">%s</xliff:g> сака да ве провери."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометрискиот хардвер е недостапен"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Проверката е откажана"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Непознат"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Проверката е откажана"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откриен е делумен отпечаток. Обидете се повторно."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Отпечатокот не можеше да се обработи. Обидете се повторно."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензорот за отпечатоци е валкан. Исчистете го и обидете се повторно."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Отвори со"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отвори со %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дајте пристап да се отвораат линкови на <xliff:g id="HOST">%1$s</xliff:g> со"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дајте пристап да се отвораат линкови на <xliff:g id="HOST">%1$s</xliff:g> со <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи пристап"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Измени со"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измени со %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Измени"</string>
@@ -1569,6 +1570,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Прифати повик?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Секогаш"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Само еднаш"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Поставки"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддржува работен профил"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Телевизор"</string>
@@ -1648,7 +1650,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Корекција на бои"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Кратенката за пристапност ја вклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Кратенката за пристапност ја исклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Повторно употребете ја кратенката за пристапност за да ја стартувате тековната функција за пристапност"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Притиснете ги и задржете ги двете копчиња за јачина на звукот во траење од три секунди за да користите <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функција за користење кога ќе го допрете копчето за „Пристапност“."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За променување функции, допрете го и задржете го копчето за „Пристапност“."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Зголемување"</string>
@@ -1978,5 +1980,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"се прикажува преку други апликации на вашиот екран"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известување за информации за режимот за рутини"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Се вчитува"</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 620718d42d7a..76d2daff6279 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"നിങ്ങളുടെ മീഡിയ ശേഖരത്തിൽ നിന്നും ലൊക്കേഷനുകൾ റീഡ് ചെയ്യുന്നതിന് ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> ആപ്പിന് നിങ്ങളെ പരിശോധിച്ചുറപ്പിക്കണം."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ബയോമെട്രിക് ഹാർ‌ഡ്‌വെയർ ലഭ്യമല്ല"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കി"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"തിരിച്ചറിഞ്ഞില്ല"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കി"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"വിരലടയാളം ഭാഗികമായി തിരിച്ചറിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"വിരലടയാളം പ്രോസസ്സ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"വിരലടയാള സെൻസറിന് വൃത്തിയില്ല. അത് ശുചിയാക്കി വീണ്ടും ശ്രമിക്കുക."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ഇത് ഉപയോഗിച്ച് തുറക്കുക"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ഉപയോഗിച്ച് തുറക്കുക"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"തുറക്കുക"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ഇനിപ്പറയുന്നത് ഉപയോഗിച്ച്, <xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ തുറക്കാൻ ആക്‌സ‌സ് നൽകുക"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ഉപയോഗിച്ച്, <xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ തുറക്കാൻ ആക്‌സ‌സ് നൽകുക"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ആക്‌സസ് നൽകുക"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ഇത് ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"എഡിറ്റുചെയ്യുക"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"കോൾ സ്വീകരിക്കണോ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"എല്ലായ്പ്പോഴും"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ഒരിക്കൽ മാത്രം"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ക്രമീകരണം"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, ഔദ്യോഗിക പ്രൊഫൈലിനെ പിന്തുണയ്‌ക്കുന്നില്ല"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ടാബ്‌ലെറ്റ്"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ടിവി"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓൺ ചെയ്തിരിക്കുന്നു"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫ് ചെയ്തിരിക്കുന്നു"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"നിലവിലെ ഉപയോഗസഹായി ഫീച്ചർ ആരംഭിക്കാൻ വീണ്ടും ഉപയോഗസഹായി കുറുക്കുവഴി ഉപയോഗിക്കുക"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പുചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ഫീച്ചറുകൾ മാറ്റുന്നതിന് ഉപയോഗസഹായി ബട്ടൺ സ്‌പർശിച്ചുപിടിക്കുക."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"മാഗ്നിഫിക്കേഷൻ"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ക്യാമറ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"മൈക്രോഫോൺ"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"നിങ്ങളുടെ സ്‌ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ബാറ്ററി ലൈഫ് വര്‍ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ലോഡ് ചെയ്യുന്നു"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index c0b23fc8dd99..1e2746cf4f32 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Таны медиа цуглуулгаас байршлыг унших зөвшөөрлийг аппад олгодог."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> апп баталгаажуулахыг хүсэж байна."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометрийн техник хангамж боломжгүй байна"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Нотолгоог цуцаллаа"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Таниагүй"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Нотолгоог цуцаллаа"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Хурууны хээг дутуу уншуулсан байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Хурууны хээ боловсруулж чадахгүй байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Хурууны хээ мэдрэгч бохирдсон байна. Та цэвэрлэсний дараагаар дахин оролдоно уу."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Нээх"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ашиглан нээх"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Нээх"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосыг дараахаар нээх хандалт өгөх"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосыг <xliff:g id="APPLICATION">%2$s</xliff:g>-р нээх хандалт өгөх"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Хандалт өгөх"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Засварлах"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ашиглан засварлах"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Засах"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Байнга"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Нэг удаа"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Тохиргоо"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ажлын профайлыг дэмждэггүй"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Tелевиз"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Өнгөний засвар"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г асаасан"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г унтраасан"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Одоогийн хүртээмжит онцлогийг эхлүүлэхийн тулд нэвтрэлтийн товчлолыг ашиглах"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г ашиглахын тулд дууны түвшнийг ихэсгэх, багасгах түлхүүрийг 3 секундийн турш зэрэг дарна уу"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Хүртээмжийн товчлуурыг товших үедээ ашиглах онцлогийг сонгоно уу:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Онцлогийг өөрчлөхийн тулд Хүртээмжийн товчлуурыг дараад хүлээнэ үү."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Томруулах"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камер"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"таны дэлгэцэд бусад аппын дээр харуулж байна"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батарейны ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ачаалж байна"</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index f3d6b4ba5db5..240a3bff8b19 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"अॅपला तुमच्या मीडिया संग्रहामध्येील स्थाने वाचण्यासाठी अनुमती देते."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"अॅप्लिकेशन <xliff:g id="APP">%s</xliff:g>ला ऑथेंटिकेट करायचे आहे."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"बायोमेट्रिक हार्डवेअर उपलब्ध नाही"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ऑथेंटिकेशन रद्द केले"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ओळखले नाही"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ऑथेंटिकेशन रद्द केले"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फिंगरप्रिंट आढळली. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फिंगरप्रिंटवर प्रक्रिया करणे शक्य झाले नाही. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फिंगरप्रिंट सेन्सर खराब आहे. कृपया साफ करा आणि पुन्हा प्रयत्न करा."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"यासह उघडा"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s सह उघडा"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"उघडा"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"सह <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडण्याचा अ‍ॅक्सेस द्या"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> सह <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडण्याचा अ‍ॅक्सेस द्या"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"अ‍ॅक्सेस द्या"</string>
<string name="whichEditApplication" msgid="144727838241402655">"सह संपादित करा"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s सह संपादित करा"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"संपादित करा"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकारायचा?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"नेहमी"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"फक्त एकदाच"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग्ज"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाईलचे समर्थन करीत नाही"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"टॅबलेट"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"टीव्ही"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"रंग सुधारणा"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> चालू केली"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> बंद केली"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"सध्याचे अॅक्सेसिबिलिटी वैशिष्‍ट्य पुन्हा सुरू करण्‍यासाठी अॅक्सेसिबिलिटी शॉर्टकट वापरा"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> वापरण्यासाठी दोन्ही व्हॉल्युम की तीन सेकंद दाबा आणि धरून ठेवा"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तुम्ही प्रवेशयोग्यता बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"वैशिष्ट्ये बदलण्यासाठी, प्रवेशयोग्यता बटणाला स्पर्श करा आणि धरून ठेवा."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"मोठे करणे"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"कॅमेरा"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"मायक्रोफोन"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"तुमच्‍या स्‍क्रीनवर इतर अॅप्‍सवर डिस्‍प्‍ले करत आहे"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"दिनक्रम मोडची माहिती सूचना"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"चार्जिंगची सामान्य पातळी गाठेपर्यंत कदाचित बॅटरी संपू शकते"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर सुरू केला आहे"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"लोड होत आहे"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 0eb022a4a1c0..c3c863a118c9 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Membenarkan apl membaca lokasi daripada koleksi media anda."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikasi <xliff:g id="APP">%s</xliff:g> mahu membuat pengesahan."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Perkakasan biometrik tidak tersedia"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Pengesahan dibatalkan"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Pengesahan dibatalkan"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Cap jari separa dikesan. Sila cuba lagi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Tidak dapat memproses cap jari. Sila cuba lagi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Penderia cap jari kotor. Sila bersihkan dan cuba lagi."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Berikan akses untuk membuka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Berikan akses untuk membuka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Tetapan"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak menyokong profil kerja"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Pembetulan Warna"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan kebolehaksesan menghidupkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Kebolehaksesan mematikan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gunakan Pintasan Kebolehaksesan sekali lagi untuk memulakan ciri kebolehaksesan semasa"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tekan dan tahan kedua-dua kekunci kelantangan selama tiga saat untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih ciri yang hendak digunakan apabila anda mengetik butang Kebolehaksesan:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk menukar ciri, sentuh &amp; tahan butang Kebolehaksesan."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"dipaparkan di atas apl lain pada skrin anda"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Pemberitahuan maklumat Mod Rutin"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateri mungkin habis sebelum pengecasan biasa"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Memuatkan"</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 1c5f0c716a2f..c03673038cd0 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"အက်ပ်အား သင့်မီဒီယာစုစည်းမှုမှ တည်နေရာများကို ဖတ်ခွင့်ပေးသည်။"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"အပလီကေးရှင်း <xliff:g id="APP">%s</xliff:g> က အထောက်အထားစိစစ်လိုသည်။"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ဇီဝအချက်အလက်သုံး ကွန်ပျူတာစက်ပစ္စည်း မရရှိနိုင်ပါ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်လိုက်သည်"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"မသိပါ"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်လိုက်သည်"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"လက်ဗွေရဦ တစ်ပိုင်းတစ်စ တွေ့ရှိသည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"လက်ဗွေရာယူခြင်း မဆောင်ရွက်နိုင်ပါ။ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"လက်ဗွေရာဖတ်ကိရိယာ ညစ်ပေနေသည်။ ကျေးဇူးပြု၍ ရှင်းလင်းကာ ထပ်မံကြိုးစားပါ။"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"...ဖြင့် ဖွင့်မည်"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ဖြင့် ဖွင့်မည်"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ဖွင့်ပါ"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို အ​ောက်ပါဖြင့် ဖွင့်ခွင့်ပေးပါ-"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို <xliff:g id="APPLICATION">%2$s</xliff:g> ဖြင့် ဖွင့်ခွင့်ပေးပါ"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ဖွင့်ခွင့်ပေးရန်"</string>
<string name="whichEditApplication" msgid="144727838241402655">"...နှင့် တည်းဖြတ်ရန်"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s နှင့် တည်းဖြတ်ရန်"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"တည်းဖြတ်ပါ"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ဖုန်းခေါ်ဆိုမှုကို လက်ခံမလား?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"အမြဲတမ်း"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"တစ်ခါတည်း"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ဆက်တင်များ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s က အလုပ်ပရိုဖိုင်ကို မပံ့ပိုးပါ။"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"တက်ဘလက်"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"တီဗွီ"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"အရောင်ပြင်ဆင်ခြင်း"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ဖွင့်လိုက်ပါသည်"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ပိတ်လိုက်ပါသည်"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"လက်ရှိ အသုံးလွယ်ရေး ဝန်ဆောင်မှုကို စတင်ရန် အသုံးလွယ်ရေး ဖြတ်လမ်းလင့်ခ်ကို သုံးပါ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ဝန်ဆောင်မှုများကို ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့၍ ထိထားပါ။"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ချဲ့ခြင်း"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ကင်မရာ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"မိုက်ခရိုဖုန်း"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"သင့်မျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များပေါ်တွင် ပြသခြင်း"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"တင်နေသည်"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 233b98a614b1..e479834e675b 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Lar appen lese posisjoner fra mediesamlingen din."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Appen <xliff:g id="APP">%s</xliff:g> vil autentisere."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrisk maskinvare er utilgjengelig"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentiseringen er avbrutt"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke gjenkjent"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentiseringen er avbrutt"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Deler av fingeravtrykket er registrert. Prøv på nytt."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kunne ikke registrere fingeravtrykket. Prøv på nytt."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingeravtrykksensoren er skitten. Rengjør den og prøv på nytt."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Åpne med"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åpne med %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åpne"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Gi tilgang til å åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Gi tilgang til å åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Gi tilgang"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Endre"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Bare én gang"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Innstillinger"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s støtter ikke arbeidsprofiler"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Nettbrett"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Google TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Fargekorrigering"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Snarveien for tilgjengelighet slo på <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Snarveien for tilgjengelighet slo av <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Bruk tilgjengelighetssnarveien igjen for å starte den nåværende tilgjengelighetsfunksjonen"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Trykk og hold inne begge volumtastene i tre sekunder for å bruke <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Velg en funksjon du vil bruke når du trykker på Tilgjengelighet-knappen:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"For å endre funksjoner, trykk på og hold inne Tilgjengelighet-knappen."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørring"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"vises over andre apper på skjermen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Varsel med informasjon om rutinemodus"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan gå tomt før den vanlige ladingen"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laster inn"</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 0b2362ae405d..b89225509bff 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"यसले अनुप्रयोगलाई तपाईंको मिडिया सङ्ग्रहका स्थानहरू पढ्न दिन्छ।"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"अनुप्रयोग <xliff:g id="APP">%s</xliff:g> ले प्रमाणीकरण गर्न चाहन्छ।"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"बायोमेट्रिक हार्डवेयर उपलब्ध छैन"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"प्रमाणीकरण रद्द गरियो"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"पहिचान भएन"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"प्रमाणीकरण रद्द गरियो"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक औठाछाप पत्ता लाग्यो। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"औठाछाप प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"औँठाछाप सेन्सर फोहोर छ। कृपया सफा गरेर फेरि प्रयास गर्नुहोस्।"</string>
@@ -1132,6 +1130,9 @@
<!-- no translation found for whichViewApplicationNamed (2286418824011249620) -->
<skip />
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोल्नुहोस्"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"निम्नमार्फत <xliff:g id="HOST">%1$s</xliff:g>का लिंकहरू खोल्न पहुँच दिनुहोस्‌"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>मार्फत <xliff:g id="HOST">%1$s</xliff:g>का लिंकहरू खोल्न पहुँच दिनुहोस्‌"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"पहुँच दिनुहोस्"</string>
<string name="whichEditApplication" msgid="144727838241402655">"सँग सम्पादन गर्नुहोस्"</string>
<!-- String.format failed for translation -->
<!-- no translation found for whichEditApplicationNamed (1775815530156447790) -->
@@ -1572,6 +1573,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैँ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"एक पटक मात्र"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिङहरू"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाइल समर्थन गर्दैन"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ट्याब्लेट"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1651,7 +1653,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"रङ सच्याउने सुविधा"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई सक्रिय पार्‍यो"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई निष्क्रिय पार्‍यो"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"हालको पहुँचसम्बन्धी सुविधा प्रयोग गर्न फेरि पहुँचसम्बन्धी सर्टकट प्रयोग गर्नुहोस्"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तपाईंले पहुँच सम्बन्धी बटनलाई ट्याप गर्दा प्रयोग गर्नुपर्ने सुविधा रोज्नुहोस्:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाहरूलाई बदल्न, पहुँच सम्बन्धी बटनलाई छोएर थिची राख्नुहोस्।"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"म्याग्निफिकेसन"</string>
@@ -1981,5 +1983,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"क्यामेरा"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"माइक्रोफोन"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमा प्रदर्शन गरिँदै छ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"लोड गर्दै"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 996b700d5a33..c552f00e51d9 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Hiermee sta je de app toe locaties van je mediacollectie te bekijken."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"App <xliff:g id="APP">%s</xliff:g> wil een verificatie uitvoeren."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrische hardware niet beschikbaar"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Verificatie geannuleerd"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Niet herkend"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Verificatie geannuleerd"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Gedeeltelijke vingerafdruk gedetecteerd. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kan vingerafdruk niet verwerken. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"De vingerafdruksensor moet worden schoongemaakt. Probeer het daarna opnieuw."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Openen met"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Openen met %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Openen"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Toegang verlenen om links naar <xliff:g id="HOST">%1$s</xliff:g> te openen met"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Toegang verlenen om links naar <xliff:g id="HOST">%1$s</xliff:g> te openen met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Toegang geven"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Bewerken met"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Bewerken met %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Bewerken"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Gesprek accepteren?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altijd"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Één keer"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellingen"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ondersteunt werkprofielen niet"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Tv"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Kleurcorrectie"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ingeschakeld"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> uitgeschakeld"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gebruik de snelkoppeling voor toegankelijkheid nogmaals om de huidige toegankelijkheidsfunctie te starten"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Houd beide volumetoetsen drie seconden ingedrukt om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruiken"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies een functie om te gebruiken wanneer je op de knop Toegankelijkheid tikt:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Als je functies wilt wijzigen, tik je op de knop Toegankelijkheid en houd je deze vast."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfoon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"wordt weergegeven vóór andere apps op je scherm"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatiemelding voor routinemodus"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laden"</string>
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 27b7d5dca164..57d39ce4acea 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ଆପଣଙ୍କ ମିଡିଆ ସଂଗ୍ରହ ଠାରୁ ଅବସ୍ଥାନଗୁଡିକୁ ପଢିବାକୁ ଆପ୍‍ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"ଆପ୍ଲିକେସନ୍ <xliff:g id="APP">%s</xliff:g> ପ୍ରମାଣିତକୃତ କରିବାକୁ ଚାହୁଁଛି।"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ବାୟୋମେଟ୍ରିକ୍‌ ହାର୍ଡୱେର୍‌ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ପ୍ରାମାଣିକତାକୁ ବାତିଲ୍ କରାଯାଇଛି"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ପ୍ରାମାଣିକତାକୁ ବାତିଲ୍ କରାଯାଇଛି"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଂଶିକ ଚିହ୍ନଟ ହେଲା। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ପ୍ରୋସେସ୍‍ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନ୍ସର୍‍ ମଇଳା ହୋଇଯାଇଛି। ଦୟାକରି ସଫା କରନ୍ତୁ ଓ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ସହିତ ଖୋଲନ୍ତୁ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ସହିତ ଖୋଲନ୍ତୁ"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ଖୋଲନ୍ତୁ"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ଏହା ସହିତ ଲିଙ୍କ ଥିବା <xliff:g id="HOST">%1$s</xliff:g> ଖୋଲିବା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ସହିତ ଲିଙ୍କ ଥିବା <xliff:g id="HOST">%1$s</xliff:g> ଖୋଲିବା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ଆକ୍ସେସ୍‌ ଦିଅନ୍ତୁ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ସହିତ ଏଡିଟ୍‌ କରନ୍ତୁ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sରେ ସଂଶୋଧନ କରନ୍ତୁ"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ଏଡିଟ୍‌ କରନ୍ତୁ"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"କଲ୍‍ ସ୍ୱୀକାର କରିବେ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ସର୍ବଦା"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ଥରେ ମାତ୍ର"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ସେଟିଂସ୍"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ୱର୍କ ପ୍ରୋଫାଇଲ୍‌କୁ ସପୋର୍ଟ କରୁନାହିଁ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ଟାବଲେଟ୍‌"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ରଙ୍ଗ ସଂଶୋଧନ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍‍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅନ୍‍ କରାଯାଇଛି"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍‍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅଫ୍‍ କରାଯାଇଛି"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ବର୍ତ୍ତମାନର ଆକ୍ସେସିବିଲିଟୀ ବୈଶିଷ୍ଟ୍ୟ ଆରମ୍ଭ କରିବାକୁ ପୁଣି ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟ୍‍କର୍ଟ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବାକୁ ତିନି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍‍ କୀ ଦବାଇ ଧରି ରଖନ୍ତୁ"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ଆପଣ ଆକ୍ସେସବିଲିଟି ବଟନ୍‍ ଟାପ୍‍ କରିବା ବେଳେ ଏକ ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇବାକୁ, ଆକ୍ସେସବିଲିଟି ବଟନ୍‍ ସ୍ପର୍ଶ କରନ୍ତୁ ଓ ଧରିରଖନ୍ତୁ।"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ମ୍ୟାଗ୍ନିଫିକେସନ୍‍"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"କ୍ୟାମେରା"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ମାଇକ୍ରୋଫୋନ୍"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍‌ ଉପରେ ଦେଖାଦେବ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ନିୟମିତ ମୋଡ୍‍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍‍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ଲୋଡ୍ ହେଉଛି"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index eacf006627ed..85afacb2c861 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਮੀਡੀਆ ਸੰਗ੍ਰਹਿ ਦੇ ਟਿਕਾਣਿਆਂ ਨੂੰ ਪੜ੍ਹਨ ਦਿੰਦੀ ਹੈ।"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"ਐਪਲੀਕੇਸ਼ਨ <xliff:g id="APP">%s</xliff:g> ਪ੍ਰਮਾਣੀਕਰਨ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ।"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ਅਧੂਰਾ ਫਿੰਗਰਪ੍ਰਿਟ ਮਿਲਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੰਵੇਦਕ ਗੰਦਾ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਸਾਫ਼ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"ਨਾਲ ਖੋਲ੍ਹੋ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ਨਾਲ ਖੋਲ੍ਹੋ"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ਖੋਲ੍ਹੋ"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ਇਸ ਨਾਲ <xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਪਹੁੰਚ ਦਿਓ"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ <xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਪਹੁੰਚ ਦਿਓ"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ਪਹੁੰਚ ਦਿਓ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ਇਸ ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ਸੰਪਾਦਨ ਕਰੋ"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ਹਮੇਸ਼ਾਂ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ਕੇਵਲ ਇੱਕ ਵਾਰ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ਸੈਟਿੰਗਾਂ"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ਟੈਬਲੈੱਟ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"ਰੰਗ ਸੁਧਾਈ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ਮੌਜੂਦਾ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ \'ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ\' ਦੀ ਦੁਬਾਰਾ ਵਰਤੋਂ ਕਰੋ"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ 3 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਈ ਰੱਖੋ"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਟੈਪ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲਣ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ਵੱਡਦਰਸ਼ੀਕਰਨ"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"ਕੈਮਰਾ"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index b2bb7b085ffd..08d56e4508c0 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Zezwala aplikacji na odczytywanie lokalizacji z kolekcji multimediów."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacja <xliff:g id="APP">%s</xliff:g> wymaga uwierzytelnienia."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Sprzęt biometryczny niedostępny"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Anulowano uwierzytelnianie"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nie rozpoznano"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Anulowano uwierzytelnianie"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Odcisk palca został odczytany tylko częściowo. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nie udało się przetworzyć odcisku palca. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Czytnik linii papilarnych jest zabrudzony. Wyczyść go i spróbuj ponownie."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otwórz w aplikacji"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otwórz w aplikacji %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otwórz"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Przyznaj uprawnienia do otwierania linków z <xliff:g id="HOST">%1$s</xliff:g> w:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Przyznaj uprawnienia do otwierania linków z <xliff:g id="HOST">%1$s</xliff:g> w aplikacji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udziel uprawnień"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edytuj w aplikacji"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edytuj w aplikacji %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Edytuj"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Tylko raz"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ustawienia"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nie obsługuje profilu do pracy"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Telewizor"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcja kolorów"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Użyj ponownie skrótu ułatwień dostępu, by uruchomić bieżące ułatwienie dostępu"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Naciśnij i przytrzymaj oba przyciski głośności przez trzy sekundy, by użyć usługi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wybierz funkcję używaną po kliknięciu przycisku ułatwień dostępu."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Aby zmienić funkcje, kliknij i przytrzymaj przycisk ułatwień dostępu."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Powiększenie"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Aparat"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"wyświetla się nad innymi aplikacjami na ekranie"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Powiadomienie z informacją o trybie rutynowym"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ładuję"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index b1a1d39d7618..38368d38b9f4 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que o app leia os locais na sua coleção de mídias."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"O app <xliff:g id="APP">%s</xliff:g> está solicitando autenticação."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biométrico indisponível"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autenticação cancelada"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autenticação cancelada"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Impressão digital parcial detectada. Tente novamente."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Não foi possível processar a impressão digital. Tente novamente."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impressão digital está sujo. Limpe-o e tente novamente."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com o app <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editar"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correção de cor"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use o atalho de acessibilidade novamente para iniciar o recurso de acessibilidade atual"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado ao tocar no botão Acessibilidade:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Câmera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"exibindo sobre outros apps na sua tela"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Carregando"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index ec4cf8c4daec..67fe5b6741a7 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que a aplicação leia as localizações a partir da sua coleção de multimédia."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"A aplicação <xliff:g id="APP">%s</xliff:g> pretende uma autenticação"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biométrico indisponível."</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autenticação cancelada"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido."</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autenticação cancelada"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Impressão digital detetada. Tente novamente."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Não foi possível processar a impressão digital. Tente novamente."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impressões digitais está sujo. Limpe-o e tente novamente."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceda acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceda acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com a aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editar"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Apenas uma vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Definições"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não suporta o perfil de trabalho"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correção da cor"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O Atalho de acessibilidade ativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O Atalho de acessibilidade desativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilize novamente o atalho de acessibilidade para iniciar a funcionalidade de acessibilidade atual."</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Prima sem soltar as teclas de volume durante três segundos para utilizar o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha uma funcionalidade para utilizar quando tocar no botão Acessibilidade:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar as funcionalidades, toque sem soltar no botão Acessibilidade."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Câmara"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"sobrepõe-se a outras aplicações no ecrã"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informações do Modo rotina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pode ficar sem bateria antes do carregamento habitual"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Poupança de bateria ativada para prolongar a duração da bateria"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"A carregar…"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index b1a1d39d7618..38368d38b9f4 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite que o app leia os locais na sua coleção de mídias."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"O app <xliff:g id="APP">%s</xliff:g> está solicitando autenticação."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biométrico indisponível"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autenticação cancelada"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autenticação cancelada"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Impressão digital parcial detectada. Tente novamente."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Não foi possível processar a impressão digital. Tente novamente."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impressão digital está sujo. Limpe-o e tente novamente."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com o app <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editar"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correção de cor"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use o atalho de acessibilidade novamente para iniciar o recurso de acessibilidade atual"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado ao tocar no botão Acessibilidade:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Câmera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfone"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"exibindo sobre outros apps na sua tela"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Carregando"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 5b36b9affdd1..501d7ccb473c 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Permite aplicației să citească locațiile din colecția dvs. media."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplicația <xliff:g id="APP">%s</xliff:g> dorește să se autentifice."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometric indisponibil"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentificarea a fost anulată"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nu este recunoscut"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentificarea a fost anulată"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"S-a detectat parțial amprenta. Încercați din nou."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Amprenta nu a putut fi procesată. Încercați din nou."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzorul pentru amprente este murdar. Curățați-l și încercați din nou."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Deschideți cu"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Deschideți cu %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Deschideți"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Permiteți accesul pentru a deschide linkurile <xliff:g id="HOST">%1$s</xliff:g> cu"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Permiteți accesul pentru a deschide linkurile <xliff:g id="HOST">%1$s</xliff:g> cu <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permiteți accesul"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Editați cu"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editați cu %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Editați"</string>
@@ -1589,6 +1590,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Numai o dată"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setări"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nu acceptă profilul de serviciu"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tabletă"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1669,7 +1671,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Corecția culorii"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Comanda rapidă de accesibilitate a activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Comanda rapidă de accesibilitate a dezactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Folosiți din nou comanda rapidă Accesibilitate pentru a porni funcția de accesibilitate prezentă"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Apăsați ambele butoane de volum timp de trei secunde pentru a folosi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Alegeți o funcție pe care să o folosiți când atingeți butonul Accesibilitate:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pentru a schimba funcțiile, atingeți lung butonul Accesibilitate."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Mărire"</string>
@@ -2010,5 +2012,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Cameră foto"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Microfon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"se afișează peste alte aplicații de pe ecran"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificare pentru informații despre modul Rutină"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Se încarcă"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index ac7908c09946..8cb2d69083e0 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Приложение получит доступ к геоданным в вашей медиаколлекции."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" запрашивает аутентификацию"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометрическое оборудование недоступно"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Аутентификация отменена"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Не распознано"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Аутентификация отменена"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Отсканирована только часть пальца. Повторите попытку."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Не удалось распознать отпечаток. Повторите попытку."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Очистите сканер и повторите попытку."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Открыть с помощью приложения:"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Открыть с помощью приложения \"%1$s\""</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Открыть"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Предоставьте доступ, чтобы открывать ссылки <xliff:g id="HOST">%1$s</xliff:g> в приложении"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Предоставьте доступ, чтобы открывать ссылки <xliff:g id="HOST">%1$s</xliff:g> в приложении <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Открыть доступ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Редактировать с помощью приложения:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактировать с помощью приложения \"%1$s\""</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Изменить"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Всегда"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Только сейчас"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддерживает рабочие профили"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Планшетный ПК"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Телевизор"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Коррекция цвета"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> включен"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> отключен"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Чтобы активировать выбранные специальные возможности, воспользуйтесь быстрым включением ещё раз"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Чтобы использовать сервис \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", нажмите и удерживайте обе клавиши громкости в течение трех секунд."</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберите функцию, которая запускается при нажатии кнопки специальных возможностей:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Чтобы изменить функцию, удерживайте кнопку специальных возможностей."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увеличение"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"показ поверх других окон"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Уведомление о батарее"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея может разрядиться"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Загрузка"</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 6486f3a2a0a4..41630332faa7 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ඔබගේ මාධ්‍ය එකතුවෙන් ස්ථාන කියවීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> යෙදුම වෙත සත්‍යාපනය කිරීමට අවශ්‍යයි."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ජීවමිතික දෘඪාංග ලබා ගත නොහැකිය"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"සත්‍යාපනය අවලංගු කළා"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"හඳුනා නොගන්නා ලදී"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"සත්‍යාපනය අවලංගු කළා"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ඇඟිලි සලකුණ අඩ වශයෙන් අනාවරණය කර ගැනිණි. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ඇඟිලි සලකුණ පිරිසැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ඇඟිලි සලකුණු සංවේදකය අපිරිසිදුයි. කරුණාකර පිරිසිදු කර නැවත උත්සාහ කරන්න."</string>
@@ -1130,6 +1128,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"සමඟ විවෘත කරන්න"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s සමඟ විවෘත කරන්න"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"විවෘත කරන්න"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"මේවා මඟින් <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කිරීමට ප්‍රවේශය දෙන්න"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> මඟින් <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කිරීමට ප්‍රවේශය දෙන්න"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ප්‍රවේශය දෙන්න"</string>
<string name="whichEditApplication" msgid="144727838241402655">"සමඟ සංස්කරණය කරන්න"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s සමඟ සංස්කරණය කරන්න"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"සංස්කරණය"</string>
@@ -1568,6 +1569,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවාද?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"සැම විටම"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"එක් වාරයයි"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"සැකසීම්"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s කාර්යාල පැතිකඩ සඳහා සහාය ලබනොදේ."</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ටැබ්ලට්ය"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"රූපවාහිනී"</string>
@@ -1647,7 +1649,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"වර්ණ නිවැරදි කිරීම"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ප්‍රවේශ්‍යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්‍රියාත්මක කරන ලදී"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ප්‍රවේශ්‍යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්‍රියාවිරහිත කරන ලදී"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"වර්තමාන ප්‍රවේශ්‍යතා විශේෂංගය ආරම්භ කිරීම සඳහා ප්‍රවේශ්‍යතා කෙටි මග භාවිතා කරන්න"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> භාවිත කිරීමට හඬ පරිමා යතුරු දෙකම තත්පර තුනකට ඔබාගෙන සිටින්න"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ඔබ ප්‍රවේශ්‍යතා බොත්තම තට්ටු කරන විට භාවිතා කිරීමට අංගයක් තෝරාගන්න:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"අංග වෙනස් කිරීමට ප්‍රවේශ්‍යතා බොත්තම ස්පර්ශ කර අල්ලා ගෙන සිටින්න."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"විශාලනය"</string>
@@ -1977,5 +1979,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"කැමරාව"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"මයික්‍රෆෝනය"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ඔබගේ තිරය මත වෙනත් යෙදුම්වලට උඩින් සංදර්ශනය කරමින්"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"දිනචරියා ප්‍රකාර තතු දැනුම්දීම"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්‍රිය කෙරිණි"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"පූරණය කරමින්"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 66d6ef6a4ee4..8905d2a9fce9 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Umožňuje aplikácii čítať polohy zo zbierky médií."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikácia <xliff:g id="APP">%s</xliff:g> chce overiť totožnosť"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrický hardvér nie je k dispozícii"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Overenie bolo zrušené"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznané"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Overenie bolo zrušené"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Podarilo sa rozpoznať iba časť odtlačku prsta. Skúste to znova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Odtlačok prsta sa nepodarilo spracovať. Skúste to znova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Snímač odtlačkov je špinavý. Vyčistite ho a skúste to znova."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Otvoriť v aplikácii"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvoriť v aplikácii %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvoriť"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Udeľte prístup na otváranie odkazov <xliff:g id="HOST">%1$s</xliff:g> pomocou aplikácie"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Udeľte prístup na otváranie odkazov <xliff:g id="HOST">%1$s</xliff:g> pomocou aplikácie <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udeliť prístup"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Upraviť pomocou"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upraviť v aplikácii %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Upraviť"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Len raz"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavenia"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Spúšťač %1$s nepodporuje pracovné profily"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televízor"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Úprava farieb"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skratka dostupnosti zapla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skratka dostupnosti vypla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Znova použite skratku dostupnosti, čím sprístupníte aktuálnu funkciu dostupnosti"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Ak chcete používať službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, pridržte tri sekundy oba klávesy hlasitosti"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Priblíženie"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotoaparát"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofón"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"sa zobrazuje cez ďalšie aplikácie na obrazovke"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Upozornenie s informáciami o rutinnom režime"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batéria sa môže vybiť pred obvyklým nabitím"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Bol aktivovaný šetrič batérie na predĺženie výdrže batérie"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Načítava sa"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index dcaa4f5d04d6..9c20748e1d78 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Aplikaciji omogoča branje lokacij v predstavnostni zbirki."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacija <xliff:g id="APP">%s</xliff:g> želi preveriti pristnost."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Strojna oprema za biometrične podatke ni na voljo"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Preverjanje pristnosti je preklicano"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Ni prepoznano"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Preverjanje pristnosti je preklicano"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Zaznan delni prstni odtis. Poskusite znova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Prstnega odtisa ni bilo mogoče obdelati. Poskusite znova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Tipalo prstnih odtisov je umazano. Očistite ga in poskusite znova."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Odpiranje z aplikacijo"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Odpiranje z aplikacijo %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Odpiranje"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Omogočanje dostopa za odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z aplikacijo"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Omogočanje dostopa za odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogoči dostop"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Urejanje z aplikacijo"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Urejanje z aplikacijo %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Urejanje"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Ali želite sprejeti klic?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vedno"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo tokrat"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavitve"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podpira delovnega profila"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablični računalnik"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televizor"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Popravljanje barv"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Bližnjica funkcij za ljudi s posebnimi potrebami je vklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Bližnjica funkcij za ljudi s posebnimi potrebami je izklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Če želite zagnati trenutno funkcijo za ljudi s posebnimi potrebami, znova uporabite bližnjico funkcij za ljudi s posebnimi potrebami"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Za uporabo storitve <xliff:g id="SERVICE_NAME">%1$s</xliff:g> pritisnite obe tipki za glasnost in ju pridržite tri sekunde"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba »Dostopnost«:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Če želite spremeniti funkcije, se dotaknite gumba »Dostopnost« in ga pridržite."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povečava"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Fotoaparat"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"prekriva druge aplikacije na zaslonu"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutinsko informativno obvestilo o načinu delovanja"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulator se bo morda izpraznil, preden ga običajno priključite na polnjenje"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Vklopilo se je varčevanje z energijo akumulatorja za podaljšanje časa delovanja akumulatorja"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Nalaganje"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 413ff8a51b19..222b1d29dbb8 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Lejon aplikacionin të lexojë vendndodhjet nga koleksioni yt i medias."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Aplikacioni <xliff:g id="APP">%s</xliff:g> dëshiron të vërtetojë."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Nuk ofrohet harduer biometrik"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Vërtetimi u anulua"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Nuk njihet"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Vërtetimi u anulua"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"U zbulua një gjurmë gishti e pjesshme. Provo përsëri."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Gjurma e gishtit nuk mund të përpunohej. Provo përsëri."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sensori i gjurmës së gishtit nuk është i pastër. Pastroje dhe provo përsëri."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Hap me"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Hap me %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Hap"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Jep qasje për të hapur lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Jep qasje për të hapur lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Jep qasje"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Redakto me"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redakto me %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Redakto"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Dëshiron ta pranosh telefonatën?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Gjithmonë"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Vetëm një herë"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cilësimet"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nuk e mbështet profilin e punës"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Televizori"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Korrigjimi i ngjyrës"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Shkurtorja e qasshmërisë e aktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Shkurtorja e qasshmërisë e çaktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Përdor përsëri \"Shkurtoren e qasshmërisë\" për të nisur funksionin aktual të qasshmërisë"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Shtyp dhe mbaj shtypur të dy butonat e volumit për tre sekonda për të përdorur <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Zgjidh një funksion për ta përdorur kur troket butonin e \"Qasshmërisë\":"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Për të ndryshuar funksionet, prek dhe mbaj butonin e \"Qasshmërisë\"."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zmadhimi"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofoni"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"po shfaqet mbi aplikacionet e tjera në ekranin tënd"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"\"Kursyesi i baterisë\" u aktivizua për të zgjatur jetëgjatësinë e baterisë"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Po ngarkohet"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 8f8fe0ed0a06..58fde19b82bb 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -536,11 +536,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Дозвољава апликацији да чита локације из медијске колекције."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Апликација <xliff:g id="APP">%s</xliff:g> жели да потврди ваш идентитет."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Биометријски хардвер није доступан"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Потврда идентитета је отказана"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Није препознато"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Потврда идентитета је отказана"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откривен је делимични отисак прста. Пробајте поново."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Није успела обрада отиска прста. Пробајте поново."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензор за отиске прстију је прљав. Очистите га и покушајте поново."</string>
@@ -1148,6 +1146,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Отворите помоћу"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отворите помоћу апликације %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дозволите да се линкови <xliff:g id="HOST">%1$s</xliff:g> отварају помоћу"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дозволите да <xliff:g id="APPLICATION">%2$s</xliff:g> отвара линикове <xliff:g id="HOST">%1$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи приступ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Измените помоћу"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измените помоћу апликације %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Измени"</string>
@@ -1589,6 +1590,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Само једном"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Подешавања"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не подржава пословни профил"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ТВ"</string>
@@ -1669,7 +1671,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Корекција боја"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Пречица за приступачност је укључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Пречица за приступачност је искључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Употребите поново пречицу за приступачност да бисте покренули актуелну функцију приступачности"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Притисните и задржите оба тастера за јачину звука три секунде да бисте користили <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изаберите функцију која ће се користити када додирнете дугме за приступачност:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Притисните и задржите дугме за приступачност да бисте мењали функције."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увећање"</string>
@@ -2010,5 +2012,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Микрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"приказује се на екрану док користите друге апликације"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Обавештење о информацијама Рутинског режима"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Учитава се"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index cd5580d2970e..2412f64dbdae 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Tillåter att appen läser av platser i din mediesamling."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Appen <xliff:g id="APP">%s</xliff:g> vill autentisera"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrisk maskinvara är inte tillgänglig"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentiseringen avbröts"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Identifierades inte"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentiseringen avbröts"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Ofullständigt fingeravtryck. Försök igen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Det gick inte att bearbeta fingeravtrycket. Försök igen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingeravtryckssensorn är smutsig. Rengör den och försök igen."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Öppna med"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Öppna med %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öppna"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Tillåt att länkar från <xliff:g id="HOST">%1$s</xliff:g> öppnas med"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Tillåt att länkar från <xliff:g id="HOST">%1$s</xliff:g> öppnas med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ge åtkomst"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Redigera med"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigera med %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Redigera"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vill du ta emot samtal?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara en gång"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Inställningar"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s har inte stöd för arbetsprofil"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Surfplatta"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Färgkorrigering"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktiverades av Aktivera tillgänglighet snabbt"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> inaktiverades av Aktivera tillgänglighet snabbt"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Använd Aktivera tillgänglighet snabbt en gång till om du vill aktivera tillgänglighetsfunktionen i fråga"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tryck och håll båda volymknapparna i tre sekunder för att använda <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Välj en funktion som ska användas när du trycker på tillgänglighetsknappen:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryck länge på tillgänglighetsknappen för att ändra funktioner."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Förstoring"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"visar över andra appar på mobilen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Avisering om rutinläge"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan ta slut innan du brukar ladda det"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Läser in"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index bc3e4ad903a0..2e2904d2de9d 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Inaruhusu programu kusoma maeneo kwenye mkusanyiko wa vipengee vyako."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Programu ya <xliff:g id="APP">%s</xliff:g> inataka kuthibitishwa."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Maunzi ya bayometriki hayapatikani"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Imeghairi uthibitishaji"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Hayatambuliki"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Imeghairi uthibitishaji"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Kitambuzi kimegundua sehemu ya kitambulisho. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Haikuweza kuchakata kitambulisho. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Kitambuzi alama ya kidole ni kichafu. Tafadhali kisafishe na ujaribu tena."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Fungua ukitumia"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Fungua ukitumia %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Fungua"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Ipe <xliff:g id="HOST">%1$s</xliff:g> ruhusa ya kufungua viungo kwa kutumia"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Ipe <xliff:g id="HOST">%1$s</xliff:g> ruhusa ya kufungua viungo kwa kutumia <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Idhinisha ufikiaji"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Badilisha kwa"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Badilisha kwa %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Badilisha"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Kubali simu?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Kila mara"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Mara moja tu"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mipangilio"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s haitumii wasifu wa kazini"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Kompyuta kibao"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Runinga"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Usahihishaji wa rangi"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imewasha <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imezima <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Tumia njia ya Mkato wa Zana za walio na matatizo ya kuona au kusikia tena ili kuanzisha kipengele kilichopo cha walio na matatizo ya kuona au kusikia"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tatu ili utumie <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chagua kipengele utakachotumia, ukigonga Kitufe cha zana za walio na matatizo ya kuona au kusikia."</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ili kubadilisha vipengele, gusa na ushikile Kitufe cha zana za walio na matatizo ya kuona au kusikia."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukuzaji"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Maikrofoni"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"inachomoza kwenye programu zingine katika skrini yako"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Arifa ya maelezo ya Hali ya Kawaida"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Huenda betri itakwisha chaji mapema"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Inapakia"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 22da7b027b6e..b3c2ebfec116 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"உங்களின் மீடியா தொகுப்பிலிருந்து இடங்களை அறிந்துகொள்ள ஆப்ஸை அனுமதிக்கும்."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g>ஐப் பயன்படுத்த அங்கீகாரத்தை உறுதிசெய்க."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"பயோமெட்ரிக் வன்பொருள் இல்லை"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"அங்கீகரிப்பு ரத்தானது"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"அடையாளங்காணபடவில்லை"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"அங்கீகரிப்பு ரத்தானது"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"கைரேகையை ஓரளவுதான் கண்டறிய முடிந்தது. மீண்டும் முயலவும்."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"கைரேகையைச் செயலாக்க முடியவில்லை. மீண்டும் முயலவும்."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"கைரேகை உணர்வியில் தூசி உள்ளது. சுத்தம் செய்து, முயலவும்."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"இதன்மூலம் திற"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s மூலம் திற"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"திற"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"மூலம் <xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளைத் திறப்பதற்கான அணுகலை வழங்குதல்"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> மூலம் <xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளைத் திறப்பதற்கான அணுகலை வழங்குதல்"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"அணுகலை வழங்கு"</string>
<string name="whichEditApplication" msgid="144727838241402655">"இதன் மூலம் திருத்து"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s மூலம் திருத்து"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"மாற்று"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"அழைப்பை ஏற்கவா?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"எப்போதும்"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"இப்போது மட்டும்"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"அமைப்புகள்"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s பணி சுயவிவரத்தை ஆதரிக்காது"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"டேப்லெட்"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"டிவி"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"வண்ணத் திருத்தம்"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"அணுகல்தன்மைக் குறுக்குவழியானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ இயக்கியது"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"அணுகல்தன்மைக் குறுக்குவழியானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ முடக்கியது"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"தற்போதுள்ள அணுகல்தன்மை அம்சத்தை மீண்டும் தொடங்க ’அணுகல்தன்மை ஷார்ட்கட்டைப்’ பயன்படுத்தவும்"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐப் பயன்படுத்த 3 விநாடிகளுக்கு இரண்டு ஒலியளவு பட்டன்களையும் அழுத்திப் பிடிக்கவும்"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"அணுகல்தன்மைப் பொத்தானைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"அம்சங்களை மாற்ற, அணுகல்தன்மைப் பொத்தானைத் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"பெரிதாக்கல்"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"கேமரா"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"மைக்ரோஃபோன்"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"உங்கள் திரையில் உள்ள பிற பயன்பாடுகளின் மேல் காட்டுகிறது"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ஏற்றுகிறது"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 1cc0274d4cc2..5d8c0a8f4297 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"మీ మీడియా సేకరణ నుండి స్థానాలను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"అప్లికేషన్ <xliff:g id="APP">%s</xliff:g>కు ప్రమాణీకరణ అవసరం."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"బయోమెట్రిక్ హార్డ్‌వేర్‌ అందుబాటులో లేదు"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ప్రమాణీకరణ రద్దు చేయబడింది"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"గుర్తించలేదు"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ప్రమాణీకరణ రద్దు చేయబడింది"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"పాక్షిక వేలిముద్ర గుర్తించబడింది. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"వేలిముద్రను ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"వేలిముద్ర సెన్సార్ మురికిగా ఉంది. దయచేసి శుభ్రపరిచి, మళ్లీ ప్రయత్నించండి."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"దీనితో తెరువు"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sతో తెరువు"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"తెరువు"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> లింక్‌లను తెరవడానికి యాక్సెస్ ఇవ్వండి"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>తో <xliff:g id="HOST">%1$s</xliff:g> లింక్‌లను తెరవడానికి యాక్సెస్ ఇవ్వండి"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"యాక్సెస్ ఇవ్వండి"</string>
<string name="whichEditApplication" msgid="144727838241402655">"దీనితో సవరించు"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sతో సవరించు"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"సవరించు"</string>
@@ -1525,7 +1526,7 @@
<string name="action_menu_overflow_description" msgid="2295659037509008453">"మరిన్ని ఎంపికలు"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
- <string name="storage_internal" msgid="3570990907910199483">"అంతర్గత భాగస్వామ్య నిల్వ"</string>
+ <string name="storage_internal" msgid="3570990907910199483">"షేర్ చేయబడిన అంతర్గత నిల్వ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD కార్డు"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD కార్డ్"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"USB డ్రైవ్"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"కాల్‌ను ఆమోదించాలా?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ఎల్లప్పుడూ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ఒకసారి"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"సెట్టింగ్‌లు"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s కార్యాలయ ప్రొఫైల్‌కు మద్దతు ఇవ్వదు"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"టాబ్లెట్"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"టీవీ"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"రంగు సవరణ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ప్రస్తుత యాక్సెస్ సౌలభ్య ఫీచర్‌ను ఉపయోగించడానికి యాక్సెసిబిలిటీ షార్ట్‌కట్‌ను మళ్లీ ప్రారంభించండి"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"యాక్సెస్ సామర్థ్య బటన్‌ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్‌ను ఎంచుకోండి:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్‌ను నొక్కి &amp; పట్టుకోండి."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"మాగ్నిఫికేషన్"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"కెమెరా"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"మైక్రోఫోన్"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"మీ స్క్రీన్‌పై ఇతర యాప్‌ల ద్వారా ప్రదర్శించబడుతోంది"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"లోడవుతోంది"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 2edf57c8a9d4..427793a57109 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"อนุญาตให้แอปอ่านตำแหน่งจากคอลเล็กชันสื่อของคุณ"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"แอปพลิเคชัน <xliff:g id="APP">%s</xliff:g> ต้องการตรวจสอบสิทธิ์"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"ฮาร์ดแวร์ไบโอเมตริกไม่พร้อมใช้งาน"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"ยกเลิกการตรวจสอบสิทธิ์แล้ว"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"ไม่รู้จัก"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"ยกเลิกการตรวจสอบสิทธิ์แล้ว"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ตรวจพบลายนิ้วมือเพียงบางส่วน โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ไม่สามารถประมวลผลลายนิ้วมือได้ โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"เซ็นเซอร์ลายนิ้วมือไม่สะอาด โปรดทำความสะอาดและลองอีกครั้ง"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"เปิดด้วย"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"เปิดด้วย %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"เปิด"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ให้สิทธิ์ในการเปิดลิงก์ของ <xliff:g id="HOST">%1$s</xliff:g> โดยใช้"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ให้สิทธิ์ในการเปิดลิงก์ของ <xliff:g id="HOST">%1$s</xliff:g> โดยใช้ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ให้สิทธิ์"</string>
<string name="whichEditApplication" msgid="144727838241402655">"แก้ไขด้วย"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"แก้ไขด้วย %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"แก้ไข"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ทุกครั้ง"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"เฉพาะครั้งนี้"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"การตั้งค่า"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ไม่สนับสนุนโปรไฟล์งาน"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"แท็บเล็ต"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ทีวี"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"การปรับแก้สี"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ใช้ทางลัดการช่วยเหลือพิเศษอีกครั้งเพื่อเริ่มฟีเจอร์การช่วยเหลือพิเศษปัจจุบัน"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 3 วินาทีเพื่อใช้ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"การขยาย"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"กล้อง"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"ไมโครโฟน"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"แสดงทับแอปอื่นๆ บนหน้าจอ"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"กำลังโหลด"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index f7995f77d3e4..cd4818f65a69 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Pinapayagan ang app na basahin ang mga lokasyon mula sa iyong koleksyon ng media."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Gustong mag-authenticate ng app na <xliff:g id="APP">%s</xliff:g>."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Walang biometric hardware"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Nakansela ang pag-authenticate"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Hindi nakilala"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Nakansela ang pag-authenticate"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hindi buo ang natukoy na fingerprint. Pakisubukang muli."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Hindi maproseso ang fingerprint. Pakisubukang muli."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Marumi ang sensor ng fingerprint. Pakilinis at subukang muli."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Buksan gamit ang"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buksan gamit ang %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buksan"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Magbigay ng access para buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> sa"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Magbigay ng access para buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> sa <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Bigyan ng access"</string>
<string name="whichEditApplication" msgid="144727838241402655">"I-edit gamit ang"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"I-edit gamit ang %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"I-edit"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Isang beses lang"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mga Setting"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Hindi sinusuportahan ng %1$s ang profile sa trabaho"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Pagwawasto ng Kulay"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Na-on ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Na-off ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gamiting muli ang Shortcut sa Pagiging Naa-access para simulan ang kasalukuyang feature ng pagiging naa-access"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pindutin nang matagal ang parehong volume key sa loob ng tatlong segundo para magamit ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Naa-access:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Upang baguhin ang mga feature, pindutin nang matagal ang button ng Pagiging Naa-access."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pag-magnify"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Camera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikropono"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ipinapakita sa ibabaw ng ibang app sa iyong screen"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification ng impormasyon ng Routine Mode"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Na-activate ang Pangtipid sa Baterya para patagalin ang buhay ng baterya"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Naglo-load"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 761eba6dad0f..92d3ba62f7ac 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Uygulamanın medya koleksiyonunuzdaki konumları okumasına izin verir."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> uygulaması kimlik doğrulamak istiyor."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biyometrik donanım kullanılamıyor"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Kimlik doğrulama iptal edildi"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmadı"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Kimlik doğrulama iptal edildi"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Parmak izinin tümü algılanamadı. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Parmak izi işlenemedi. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Parmak izi sensörü kirli. Lütfen temizleyin ve tekrar deneyin."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Şununla aç:"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ile aç"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Aç"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Şununla <xliff:g id="HOST">%1$s</xliff:g> bağlantılarını açma izni verin"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasıyla <xliff:g id="HOST">%1$s</xliff:g> bağlantılarını açma izni verin"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Erişim ver"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Şununla düzenle:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ile düzenle"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Düzenle"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Her zaman"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Yalnızca bir defa"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, iş profilini desteklemiyor"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Renk Düzeltme"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini açtı"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kapattı"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Geçerli erişilebilirlik özelliğini başlatmak için Erişilebilirlik Kısayolu\'nu tekrar kullanın"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kullanmak için her iki ses tuşunu basılı tutun"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir özellik seçin:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Özellikleri değiştirmek için Erişilebilirlik düğmesine dokunup basılı tutun."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Büyütme"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutin Modu bilgi bildirimi"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pil normal şarjdan önce bitebilir"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yükleniyor"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index e7e99ae73011..80927ae2578e 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -539,11 +539,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Додаток зможе розпізнавати геодані з вашої колекції медіа-вмісту."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Для додатка <xliff:g id="APP">%s</xliff:g> потрібна автентифікація."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Біометричне апаратне забезпечення недоступне"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Автентифікацію скасовано"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Не розпізнано"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Автентифікацію скасовано"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Відбиток розпізнано частково. Повторіть спробу."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Не вдалось обробити відбиток. Повторіть спробу."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Датчик відбитків забруднився. Очистьте його та повторіть спробу."</string>
@@ -1168,6 +1166,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Відкрити за допомогою"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Відкрити за допомогою %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Відкрити"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дозвольте відкривати посилання на сайт <xliff:g id="HOST">%1$s</xliff:g> у додатку"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дозвольте відкривати посилання на сайт <xliff:g id="HOST">%1$s</xliff:g> у додатку <xliff:g id="APPLICATION">%2$s</xliff:g>."</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволити"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Редагувати за допомогою"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редагувати за допомогою %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Редагувати"</string>
@@ -1612,6 +1613,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Лише цього разу"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налаштування"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не підтримує робочий профіль"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Планшетний ПК"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"Телевізор"</string>
@@ -1693,7 +1695,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Корекція кольорів"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Ярлик спеціальних можливостей увімкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Ярлик спеціальних можливостей вимкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Щоб запустити поточну функцію спеціальних можливостей, знову скористайтеся відповідним ярликом"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Щоб скористатися службою <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, утримуйте обидві клавіші гучності впродовж трьох секунд"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Виберіть функцію для кнопки спеціальних можливостей:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Щоб змінити функцію, натисніть і втримуйте кнопку спеціальних можливостей."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Збільшення"</string>
@@ -2045,5 +2047,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Камера"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Мікрофон"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"показ поверх інших додатків на екрані"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Сповіщення про послідовнсть дій"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режим економії заряду акумулятора активовано для збільшення часу його роботи"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Завантаження"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index e33f3f2f2973..9c9992940066 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"ایپ کو آپ کی میڈيا کے مجموعے سے مقامات پڑھنے کی اجازت دیتا ہے۔"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"ایپلیکیشن <xliff:g id="APP">%s</xliff:g> تصدیق کرنا چاہتی ہے۔"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"بایومیٹرک ہارڈ ویئر دستیاب نہیں ہے"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"تصدیق کا عمل منسوخ ہو گیا"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"تسلیم شدہ نہیں ہے"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"تصدیق کا عمل منسوخ ہو گیا"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"جزوی فنگر پرنٹ کی شناخت ہوئی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"فنگر پرنٹ پر کارروائی نہیں کی جا سکی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"فنگر پرنٹ سینسر گندا ہے۔ براہ کرم صاف کریں اور دوبارہ کوشش کریں۔"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"اس کے ساتھ کھولیں"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‏%1$s کے ساتھ کھولیں"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"کھولیں"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"اس کے ساتھ <xliff:g id="HOST">%1$s</xliff:g> لنکس کو کھولنے کے لیے رسائی ديں"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> کے ساتھ <xliff:g id="HOST">%1$s</xliff:g> لنکس کو کھولنے کے لیے رسائی ديں"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"رسائی دیں"</string>
<string name="whichEditApplication" msgid="144727838241402655">"اس کے ساتھ ترمیم کریں"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"‏%1$s کے ساتھ ترمیم کریں"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ترمیم کریں"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"کال قبول کریں؟"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ہمیشہ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"بس ایک مرتبہ"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ترتیبات"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"‏%1$s دفتری پروفائل کا تعاون نہیں کرتا ہے"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ٹیبلیٹ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"رنگ کی تصحیح"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آن کر دیا"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آف کر دیا"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"موجودہ ایکسیسبیلٹی خصوصیت کو شروع کرنے کیلئے دوبارہ ایکسیسبیلٹی شارٹ کٹ استعمال کریں"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> کا استعمال کرنے کے لیے 3 سیکنڈ تک والیوم کی دونوں کلیدوں کو چھوئیں اور دبائے رکھیں"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک خصوصیت چنیں:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"خصوصیات تبدیل کرنے کیلئے، ایکسیسبیلٹی بٹن ٹچ کریں اور دبائے رکھیں۔"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"میگنیفکیشن"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"کیمرا"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"مائیکروفون"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"آپ کی اسکرین پر دیگر ایپس پر دکھایا جا رہا ہے"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"روٹین موڈ معلومات کی اطلاع"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"لوڈ ہو رہا ہے"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 7742c3e6b59b..1b9982a39369 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Ilovaga multimedia to‘plamingizdan joylashuv axborotini o‘qishga ruxsat beradi."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g> ilovasi qurilma qulfini ochmoqchi."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrik sensor ishlamayapti"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Autentifikatsiya bekor qilindi"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Aniqlanmadi"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Autentifikatsiya bekor qilindi"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Barmoq izi qisman aniqlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Barmoq izi aniqlanmadi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Barmoq izi skaneri kirlangan. Uni tozalab, keyin qayta urinib ko‘ring."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Ochish…"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s bilan ochish"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ochish"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini ushbu ilova bilan ochishga ruxsat bering:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini <xliff:g id="APPLICATION">%2$s</xliff:g> bilan ochishga ruxsat bering"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ruxsat berish"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Tahrirlash…"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"“%1$s” yordamida tahrirlash"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Tahrirlash"</string>
@@ -1567,6 +1568,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Qo‘ng‘iroqni qabul qilasizmi?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Har doim"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Faqat hozir"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Sozlamalar"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"“%1$s” ishchi profilni qo‘llab-quvvatlamaydi"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Planshet"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1646,7 +1648,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Rangni tuzatish"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati yoqildi"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati o‘chirib qo‘yildi"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Joriy maxsus imkoniyatlar funksiyasini boshlash uchun tezkor ishga tushirishdan qayta foydalaning"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmatidan foydalanish uchun ikkala ovoz balandligi tugmalarini uzoq bosib turing"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyalarni o‘zgartirish uchun Maxsus imkoniyatlar tugmasini bosib turing."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Kattalashtirish"</string>
@@ -1976,5 +1978,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"ekranda boshqa ilovalar ustidan ochiladi"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batareya quvvati uzoqroq ishlashi uchun Tejamkor rejim yoqildi"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yuklanmoqda"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 86bb532f8e6c..ca283aa4e156 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Cho phép ứng dụng này đọc vị trí từ bộ sưu tập phương tiện của bạn."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Ứng dụng <xliff:g id="APP">%s</xliff:g> muốn xác thực."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Không có phần cứng sinh trắc học"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Đã hủy xác thực"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Không nhận dạng được"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Đã hủy xác thực"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Đã phát hiện được một phần vân tay. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Không thể xử lý vân tay. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Cảm biến vân tay bị bẩn. Hãy làm sạch và thử lại."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Mở bằng"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mở bằng %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Mở"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Cấp quyền truy cập để mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Cấp quyền truy cập để mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng <xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Cấp quyền truy cập"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Chỉnh sửa bằng"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Chỉnh sửa bằng %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Chỉnh sửa"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn chọn"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Chỉ một lần"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cài đặt"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s không hỗ trợ hồ sơ công việc"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Máy tính bảng"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Sửa màu"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Đã bật phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Đã tắt phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Sử dụng lại Phím tắt hỗ trợ tiếp cận để bắt đầu tính năng hỗ trợ tiếp cận hiện tại"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chọn tính năng sẽ sử dụng khi bạn nhấn nút Trợ năng:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Để thay đổi các tính năng, hãy chạm và giữ nút Trợ năng."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Phóng to"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Máy ảnh"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Micrô"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"hiển thị qua các ứng dụng khác trên màn hình của bạn"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Thông báo cung cấp thông tin về chế độ sạc thông thường"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pin có thể hết trước khi sạc bình thường"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Trình tiết kiệm pin được kích hoạt để kéo dài thời lượng pin"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Đang tải"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dbb7834d1843..c280ea874c3d 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"允许该应用从您的媒体收藏中读取位置信息。"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"<xliff:g id="APP">%s</xliff:g>应用需要进行身份验证。"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"生物识别硬件无法使用"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"身份验证已取消"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"无法识别"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"身份验证已取消"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"仅检测到部分指纹,请重试。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"无法处理指纹,请重试。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指纹传感器有脏污。请擦拭干净,然后重试。"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"打开方式"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用%1$s打开"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"打开"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授权使用以下应用打开 <xliff:g id="HOST">%1$s</xliff:g> 链接:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授权使用<xliff:g id="APPLICATION">%2$s</xliff:g>打开 <xliff:g id="HOST">%1$s</xliff:g> 链接"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予访问权限"</string>
<string name="whichEditApplication" msgid="144727838241402655">"编辑方式"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用%1$s编辑"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"编辑"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"仅此一次"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"设置"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s不支持工作资料"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"平板电脑"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"电视"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"无障碍快捷方式已开启<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"无障碍快捷方式已关闭<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再次使用无障碍快捷方式即可启动目前设置的无障碍功能"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"同时按住两个音量键 3 秒钟即可使用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"选择按下“无障碍”按钮时要使用的功能:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"要更改指定的功能,请触摸并按住“无障碍”按钮。"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大功能"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"相机"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"麦克风"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"显示在屏幕上其他应用的上层"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式信息通知"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"电池电量可能会在您平时的充电时间之前耗尽"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已启用省电模式以延长电池续航时间"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"正在加载"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 6248db5be4b8..c2167b5ec146 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"允許應用程式讀取媒體集的位置。"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"「<xliff:g id="APP">%s</xliff:g>」應用程式需要驗證。"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"無法使用生物識別硬件"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"已取消驗證"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"未能識別"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"已取消驗證"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"只偵測到部分指紋。請再試一次。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"無法處理指紋。請再試一次。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋感應器不乾淨。請清潔後再試一次。"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"用於開啟的應用程式"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用 %1$s 開啟"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授予存取權以透過以下應用程式開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結:"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授予存取權以透過<xliff:g id="APPLICATION">%2$s</xliff:g>開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string>
<string name="whichEditApplication" msgid="144727838241402655">"使用以下選擇器編輯:"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"編輯"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"只此一次"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援公司檔案"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"平板電腦"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"電視"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"無障礙功能快速鍵已啟用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"無障礙功能快速鍵已停用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再用一次無障礙功能捷徑,就可以啟用宜家設定咗嘅無障礙功能"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"㩒住兩個音量鍵 3 秒就可以用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"請選擇輕按「無障礙功能」按鈕時使用的功能:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更功能,可按住「無障礙功能」按鈕。"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"相機"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"麥克風"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"顯示在畫面上的其他應用程式上層"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"「日常安排模式」資料通知"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"電量可能會在日常充電前耗盡"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"「省電模式」已啟用,以便延長電池壽命"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"正在載入"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 74da200597ec..231a7e9972c3 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"允許應用程式讀取你的媒體收藏的位置資訊。"</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"「<xliff:g id="APP">%s</xliff:g>」應用程式需要驗證使用者身分。"</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"無法使用生物特徵辨識硬體"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"已取消驗證"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"無法辨識"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"已取消驗證"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"僅偵測到部分指紋,請再試一次。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"無法處理指紋,請再試一次。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋感應器有髒汙。請清潔感應器,然後再試一次。"</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"選擇開啟工具"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"透過 %1$s 開啟"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授權系統使用以下應用程式開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授權系統使用「<xliff:g id="APPLICATION">%2$s</xliff:g>」開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string>
<string name="whichEditApplication" msgid="144727838241402655">"選擇編輯工具"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"編輯"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"僅限一次"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援工作設定檔"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"平板電腦"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"電視"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"協助工具捷徑啟用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"協助工具捷徑停用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再次使用協助工具捷徑即可啟動目前設定的無障礙功能"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"同時按住調低及調高音量鍵三秒即可使用「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"輕觸 [協助工具] 按鈕後,選擇你想使用的功能:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更指派的功能,請按住 [協助工具] 按鈕。"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"相機"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"麥克風"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"顯示在畫面上的其他應用程式上層"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式資訊通知"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"電池電力可能會在你平常的充電時間前耗盡"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已啟用節約耗電量模式以延長電池續航力"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"載入中"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 93b2ae6f8e79..0f570b09d702 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -533,11 +533,9 @@
<string name="permdesc_mediaLocation" msgid="2237023389178865130">"Ivumela uhlelo lokusebenza ukuthi lifunde izindawo kusukela kuqoqo lakho lemidiya."</string>
<string name="biometric_dialog_default_title" msgid="4229778503907743328">"Uhlelo lokusebenza lwe-<xliff:g id="APP">%s</xliff:g> lifuna ukufakazela ubuqiniso."</string>
<string name="biometric_error_hw_unavailable" msgid="645781226537551036">"I-Biometric hardware ayitholakali"</string>
- <!-- no translation found for biometric_error_user_canceled (2260175018114348727) -->
- <skip />
+ <string name="biometric_error_user_canceled" msgid="2260175018114348727">"Ukufakazela ubuqiniso kukhanseliwe"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"Akwaziwa"</string>
- <!-- no translation found for biometric_error_canceled (349665227864885880) -->
- <skip />
+ <string name="biometric_error_canceled" msgid="349665227864885880">"Ukufakazela ubuqiniso kukhanseliwe"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Izigxivizo zeminwe ezincane zitholiwe. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ayikwazanga ukucubungula izigxivizo zeminwe. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Inzwa yezigxivizo zeminwe ingcolile. Sicela uyihlanze uphinde uzame futhi."</string>
@@ -1128,6 +1126,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Vula nge-"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Vula nge-%1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Kuvuliwe"</string>
+ <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Nika ukufinyelela kuzixhumanisi ezivulekile ze-<xliff:g id="HOST">%1$s</xliff:g> nge-"</string>
+ <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Nika ukufinyelela kuzixhumanisi ze-<xliff:g id="HOST">%1$s</xliff:g> ezivulekile nge-<xliff:g id="APPLICATION">%2$s</xliff:g>"</string>
+ <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Nikeza ukufinyel"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Hlela nge-"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Hlela nge-%1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Hlela"</string>
@@ -1566,6 +1567,7 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Njalo"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"Kanye nje"</string>
+ <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Izilungiselelo"</string>
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ayisekeli iphrofayela yomsebenzi"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Ithebulethi"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"I-TV"</string>
@@ -1645,7 +1647,7 @@
<string name="color_correction_feature_name" msgid="6779391426096954933">"Ukulungiswa kombala"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Isinqamuleli sokufinyelela sivule i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Isinqamuleli sokufinyelela sivale i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Sebenzisa isinqamuleli sokufinyelela futhi ukuze uqale isici samanje sokufinyelela"</string>
+ <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Cindezela uphinde ubambe bobabili okhiye bevolumu ngamasekhondi amathathu ukuze usebenzise i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Khetha isici ozosisebenzisa uma uthepha inkinobho yokufinyelela:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ukuze ushintshe izici, thinta uphinde ubambe inkinobho yokufinyelela."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukukhuliswa"</string>
@@ -1975,5 +1977,8 @@
<string name="notification_appops_camera_active" msgid="5050283058419699771">"Ikhamera"</string>
<string name="notification_appops_microphone_active" msgid="4335305527588191730">"Imakrofoni"</string>
<string name="notification_appops_overlay_active" msgid="633813008357934729">"iboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho"</string>
+ <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Isaziso solwazi lwe-Routine Mode"</string>
+ <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
+ <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Iyalayisha"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 183c2e8cf486..fa3a549463f5 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3660,7 +3660,12 @@
the settings for this service. This setting cannot be changed at runtime. -->
<attr name="settingsActivity" />
<!-- Attribute whether the accessibility service wants to be able to retrieve the
- active window content. This setting cannot be changed at runtime. -->
+ active window content. This setting cannot be changed at runtime.
+ <p>
+ Required to allow setting the {@link android.accessibilityservice
+ #AccessibilityServiceInfo#FLAG_RETRIEVE_INTERACTIVE_WINDOWS} flag.
+ </p>
+ -->
<attr name="canRetrieveWindowContent" format="boolean" />
<!-- Attribute whether the accessibility service wants to be able to request touch
exploration mode in which touched items are spoken aloud and the UI can be
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 54f6c632907f..8ef264a84efb 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -274,6 +274,9 @@
<!-- Additional flag from base permission type: this permission can be automatically
granted to the document manager -->
<flag name="documenter" value="0x40000" />
+ <!-- Additional flag from base permission type: this permission automatically
+ granted to device configurator -->
+ <flag name="configurator" value="0x80000" />
</attr>
<!-- Flags indicating more context for a permission group. -->
@@ -593,7 +596,7 @@
to be set for all windows of this activity -->
<attr name="showForAllUsers" format="boolean" />
- <!-- Specifies whether an {@link android.app.Activity} should be shown on top of the the lock screen
+ <!-- Specifies whether an {@link android.app.Activity} should be shown on top of the lock screen
whenever the lockscreen is up and the activity is resumed. Normally an activity will be
transitioned to the stopped state if it is started while the lockscreen is up, but with
this flag set the activity will remain in the resumed state visible on-top of the lock
@@ -2412,6 +2415,19 @@
<attr name="showForAllUsers" />
<attr name="showWhenLocked" />
+ <!-- @hide @SystemApi Specifies whether this {@link android.app.Activity} should be shown on
+ top of the lock screen whenever the lockscreen is up and this activity has another
+ activity behind it with the {@link android.R.attr#showWhenLocked} attribute set. That
+ is, this activity is only visible on the lock screen if there is another activity with
+ the {@link android.R.attr#showWhenLocked} attribute visible at the same time on the
+ lock screen. A use case for this is permission dialogs, that should only be visible on
+ the lock screen if their requesting activity is also visible.
+
+ The default value of this attribute is <code>false</code>. -->
+ <attr name="inheritShowWhenLocked" format="boolean" />
+
+
+ <attr name="inheritShowWhenLocked" />
<attr name="turnScreenOn" />
<attr name="directBootAware" />
@@ -2781,6 +2797,9 @@
<attr name="requiredSystemPropertyName" format="string" />
<!-- @hide This shouldn't be public. -->
<attr name="requiredSystemPropertyValue" format="string" />
+
+ <!-- The name of the overlayable whose resources will be overlaid. -->
+ <attr name="targetName" />
</declare-styleable>
<!-- Declaration of an {@link android.content.Intent} object in XML. May
diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml
index ded916fbe7a3..824b4b5977d1 100644
--- a/core/res/res/values/colors_device_defaults.xml
+++ b/core/res/res/values/colors_device_defaults.xml
@@ -43,6 +43,6 @@
<color name="error_color_device_default_dark">@color/error_color_material_dark</color>
<color name="error_color_device_default_light">@color/error_color_material_light</color>
- <color name="list_divider_color_light">#64000000</color>
+ <color name="list_divider_color_light">#ffdadce0</color>
<color name="list_divider_color_dark">#85ffffff</color>
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index d30599b2b502..2c30545669d9 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -618,15 +618,6 @@
<!-- Integer indicating wpa_supplicant scan interval when p2p is connected in milliseconds -->
<integer translatable="false" name="config_wifi_scan_interval_p2p_connected">60000</integer>
- <!-- Integer indicating the framework scan interval in milliseconds. This is used in the scenario
- where the chipset does not support background scanning (config_wifi_background_scan_suport
- is false) to set up a periodic wake up scan so that the device can connect to a new access
- point on the move. A value of 0 means no periodic scans will be used in the framework. -->
- <integer translatable="false" name="config_wifi_framework_scan_interval">300000</integer>
-
- <!-- Integer indicating the framework no networks periodic scan interval in milliseconds. -->
- <integer translatable="false" name="config_wifi_no_network_periodic_scan_interval">300000</integer>
-
<!-- Integer indicating disconnect mode short scan interval in milliseconds -->
<integer translatable="false" name="config_wifi_disconnected_short_scan_interval">15000</integer>
@@ -648,6 +639,9 @@
<!-- Integer indicating RSSI boost given to current network -->
<integer translatable="false" name="config_wifi_framework_current_network_boost">16</integer>
+ <!-- Integer delay in milliseconds before set wlan interface up during watchdog recovery -->
+ <integer translatable="false" name="config_wifi_framework_recovery_timeout_delay">2000</integer>
+
<!-- Integer indicating how to handle beacons with uninitialized RSSI value of 0 -->
<integer translatable="false" name="config_wifi_framework_scan_result_rssi_level_patchup_value">-85</integer>
@@ -692,6 +686,11 @@
<!-- Wifi driver supports Automatic channel selection (ACS) for softap -->
<bool translatable="false" name="config_wifi_softap_acs_supported">false</bool>
+ <!-- Channel list restriction to Automatic channel selection (ACS) for softap. If the device
+ doesn't want to restrict channels this should be empty. Value is a comma separated channel
+ string and/or channel range string like '1-6,11' -->
+ <string translatable="false" name="config_wifi_softap_acs_supported_channel_list"></string>
+
<!-- Wifi driver supports IEEE80211AC for softap -->
<bool translatable="false" name="config_wifi_softap_ieee80211ac_supported">false</bool>
@@ -699,6 +698,9 @@
for automotive builds only (the one that have PackageManager#FEATURE_AUTOMOTIVE) -->
<bool translatable="false" name="config_wifi_local_only_hotspot_5ghz">false</bool>
+ <!-- Indicates that connected MAC randomization is supported on this device -->
+ <bool translatable="false" name="config_wifi_connected_mac_randomization_supported">false</bool>
+
<!-- Flag indicating whether we should enable the automatic brightness.
Software implementation will be used if config_hardware_auto_brightness_available is not set -->
<bool name="config_automatic_brightness_available">false</bool>
@@ -929,9 +931,6 @@
in hardware. -->
<bool name="config_setColorTransformAccelerated">false</bool>
- <!-- Boolean indicating whether display white balance is supported. -->
- <bool name="config_displayWhiteBalanceAvailable">false</bool>
-
<!-- Control whether Night display is available. This should only be enabled on devices
that have a HWC implementation that can apply the matrix passed to setColorTransform
without impacting power, performance, and app compatibility (e.g. protected content). -->
@@ -987,6 +986,44 @@
<!-- B y-intercept --> <item>-0.198650895</item>
</string-array>
+ <!-- Boolean indicating whether display white balance is supported. -->
+ <bool name="config_displayWhiteBalanceAvailable">false</bool>
+
+ <!-- Minimum color temperature, in Kelvin, supported by display white balance. -->
+ <integer name="config_displayWhiteBalanceColorTemperatureMin">4000</integer>
+
+ <!-- Maximum color temperature, in Kelvin, supported by display white balance. -->
+ <integer name="config_displayWhiteBalanceColorTemperatureMax">8000</integer>
+
+ <!-- Default color temperature, in Kelvin, used by display white balance. -->
+ <integer name="config_displayWhiteBalanceColorTemperatureDefault">6500</integer>
+
+ <!-- The display primaries, in CIE1931 XYZ color space, for display
+ white balance to use in its calculations. -->
+ <string-array name="config_displayWhiteBalanceDisplayPrimaries">
+ <!-- Red X --> <item>0.412315</item>
+ <!-- Red Y --> <item>0.212600</item>
+ <!-- Red Z --> <item>0.019327</item>
+ <!-- Green X --> <item>0.357600</item>
+ <!-- Green Y --> <item>0.715200</item>
+ <!-- Green Z --> <item>0.119200</item>
+ <!-- Blue X --> <item>0.180500</item>
+ <!-- Blue Y --> <item>0.072200</item>
+ <!-- Blue Z --> <item>0.950633</item>
+ <!-- White X --> <item>0.950456</item>
+ <!-- White Y --> <item>1.000000</item>
+ <!-- White Z --> <item>1.089058</item>
+ </string-array>
+
+ <!-- The nominal white coordinates, in CIE1931 XYZ color space, for Display White Balance to
+ use in its calculations. AWB will adapt this white point to the target ambient white
+ point. -->
+ <string-array name="config_displayWhiteBalanceDisplayNominalWhite">
+ <!-- Nominal White X --> <item>0.950456</item>
+ <!-- Nominal White Y --> <item>1.000000</item>
+ <!-- Nominal White Z --> <item>1.089058</item>
+ </string-array>
+
<!-- Indicate available ColorDisplayController.COLOR_MODE_xxx. -->
<integer-array name="config_availableColorModes">
@@ -1152,6 +1189,10 @@
Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
meanings. -->
<integer name="config_defaultNotificationVibrationIntensity">2</integer>
+ <!-- The default intensity level for ring vibrations. See
+ Settings.System.RING_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultRingVibrationIntensity">2</integer>
<bool name="config_use_strict_phone_number_comparation">false</bool>
@@ -1169,7 +1210,7 @@
<integer name="config_lowBatteryAutoTriggerDefaultLevel">15</integer>
<!-- The app which will handle routine based automatic battery saver, if empty the UI for
- routine based battery saver will be hidden -->
+ routine based battery saver will be hidden -->
<string name="config_batterySaverScheduleProvider"></string>
<!-- Close low battery warning when battery level reaches the lowBatteryWarningLevel
@@ -1404,6 +1445,13 @@
<integer-array name="config_autoBrightnessLevels">
</integer-array>
+ <!-- Timeout (in milliseconds) after which we remove the effects any user interactions might've
+ had on the brightness mapping. This timeout doesn't start until we transition to a
+ non-interactive display policy so that we don't reset while users are using their devices,
+ but also so that we don't erroneously keep the short-term model if the device is dozing
+ but the display is fully on. -->
+ <integer name="config_autoBrightnessShortTermModelTimeout">300000</integer>
+
<!-- Array of output values for LCD backlight corresponding to the lux values
in the config_autoBrightnessLevels array. This array should have size one greater
than the size of the config_autoBrightnessLevels array.
@@ -1519,7 +1567,7 @@
<integer-array name="config_screenBrighteningThresholds">
<item>100</item>
</integer-array>
-
+
<!-- Array of hysteresis constraint values for darkening, represented as tenths of a
percent. The length of this array is assumed to be one greater than
config_screenThresholdLevels. The darkening threshold is calculated as
@@ -1643,6 +1691,8 @@
config_enableFusedLocationOverlay is false. -->
<string name="config_fusedLocationProviderPackageName" translatable="false">com.android.location.fused</string>
+ <string-array name="config_locationExtraPackageNames" translatable="false"></string-array>
+
<!-- The package name of the default network recommendation app.
A network recommendation provider must:
* Be granted the SCORE_NETWORKS permission.
@@ -1693,19 +1743,6 @@
config_enableGeofenceOverlay is false. -->
<string name="config_geofenceProviderPackageName" translatable="false">@null</string>
- <!-- Whether to enable Hardware Activity-Recognition overlay which allows Hardware
- Activity-Recognition to be replaced by an app at run-time. When disabled, only the
- config_activityRecognitionHardwarePackageName package will be searched for
- its implementation, otherwise packages whose signature matches the
- signatures of config_locationProviderPackageNames will be searched, and
- the service with the highest version number will be picked. Anyone who
- wants to disable the overlay mechanism can set it to false.
- -->
- <bool name="config_enableActivityRecognitionHardwareOverlay" translatable="false">true</bool>
- <!-- Package name providing Hardware Activity-Recognition API support. Used only when
- config_enableActivityRecognitionHardwareOverlay is false. -->
- <string name="config_activityRecognitionHardwarePackageName" translatable="false">@null</string>
-
<!-- Package name(s) containing location provider support.
These packages can contain services implementing location providers,
such as the Geocode Provider, Network Location Provider, and
@@ -1847,6 +1884,8 @@
cell broadcasting sms, and MMS. -->
<bool name="config_sms_capable">true</bool>
+ <!-- TODO: STOPSHIP(b/110557011): Remove this from framework and overlays as we use
+ config_defaultRoleHolders now. -->
<!-- Default SMS Application. This will be the default SMS application when
the phone first boots. The user can then change the default app to one
of their choosing.
@@ -1865,6 +1904,12 @@
the behavior will be as though no app was named as an explicit default. -->
<string name="default_browser" translatable="false"></string>
+ <!-- Default role holders. This will be an array of roles and package names of their default
+ holders, with each item in the format of "ROLE_NAME: PACKAGE_NAME_1, PACKAGE_NAME_2". -->
+ <string-array name="config_defaultRoleHolders" translatable="false">
+ <item>android.app.role.SMS: com.android.messaging</item>
+ </string-array>
+
<!-- Enable/disable default bluetooth profiles:
HSP_AG, ObexObjectPush, Audio, NAP -->
<bool name="config_bluetooth_default_profiles">true</bool>
@@ -2160,6 +2205,9 @@
<!-- Type of the double tap sensor. Empty if double tap is not supported. -->
<string name="config_dozeDoubleTapSensorType" translatable="false"></string>
+ <!-- Type of the tap sensor. Empty if tap is not supported. -->
+ <string name="config_dozeTapSensorType" translatable="false"></string>
+
<!-- Type of the long press sensor. Empty if long press is not supported. -->
<string name="config_dozeLongPressSensorType" translatable="false"></string>
@@ -2757,6 +2805,9 @@
<!-- Flag indicating which package name can access the persistent data partition -->
<string name="config_persistentDataPackageName" translatable="false"></string>
+ <!-- Flag indicating which package name can access DeviceConfig table -->
+ <string name="config_deviceConfiguratorPackageName" translatable="false"></string>
+
<!-- Define optional package verifier name -->
<string name="config_optionalPackageVerifierName" translatable="false"></string>
@@ -3394,7 +3445,7 @@
See android.view.textclassifier.TextClassificationManager.
-->
<string name="config_defaultTextClassifierPackage" translatable="false"></string>
-
+
<!-- The package name for the default wellbeing app.
This package must be trusted, as it has the permissions to control other applications
on the device.
@@ -3402,6 +3453,12 @@
-->
<string name="config_defaultWellbeingPackage" translatable="false"></string>
+ <!-- The component name for the default system attention service.
+ This service must be trusted, as it can be activated without explicit consent of the user.
+ See android.attention.AttentionManagerService.
+ -->
+ <string name="config_defaultAttentionService" translatable="false"></string>
+
<!-- The package name for the system's content capture service.
This service must be trusted, as it can be activated without explicit consent of the user.
If no service with the specified name exists on the device, content capture will be
@@ -3418,6 +3475,23 @@
-->
<string name="config_defaultAugmentedAutofillService" translatable="false"></string>
+ <!-- The package name for the system's app prediction service.
+ This service must be trusted, as it can be activated without explicit consent of the user.
+ Example: "com.android.intelligence/.AppPredictionService"
+ -->
+ <string name="config_defaultAppPredictionService" translatable="false"></string>
+
+ <!-- The package name for the system's content suggestions service.
+ Provides suggestions for text and image selection regions in snapshots of apps and should
+ be able to classify the type of entities in those selections.
+
+ This service must be trusted, as it can be activated without explicit consent of the user.
+ If no service with the specified name exists on the device, content suggestions wil be
+ disabled.
+ Example: "com.android.contentsuggestions/.ContentSuggestionsService"
+ -->
+ <string name="config_defaultContentSuggestionsService" translatable="false"></string>
+
<!-- Whether the device uses the default focus highlight when focus state isn't specified. -->
<bool name="config_useDefaultFocusHighlight">true</bool>
@@ -3652,7 +3726,7 @@
<string name="config_inputEventCompatProcessorOverrideClassName" translatable="false"></string>
<!-- Component name for the default module metadata provider on this device -->
- <string name="config_defaultModuleMetadataProvider">com.android.modulemetadata</string>
+ <string name="config_defaultModuleMetadataProvider" translatable="false">com.android.modulemetadata</string>
<!-- This is the default launcher component to use on secondary displays that support system
decorations.
@@ -3660,4 +3734,17 @@
set in AndroidManifest.
{@see android.view.Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS} -->
<string name="config_secondaryHomeComponent" translatable="false">com.android.launcher3/com.android.launcher3.SecondaryDisplayLauncher</string>
+
+ <!-- If device supports corner radius on windows.
+ This should be turned off on low-end devices to improve animation performance. -->
+ <bool name="config_supportsRoundedCornersOnWindows">true</bool>
+
+ <!-- If the sensor that skips media is available or not. -->
+ <bool name="config_skipSensorAvailable">false</bool>
+
+ <!-- If the sensor that silences alerts is available or not. -->
+ <bool name="config_silenceSensorAvailable">false</bool>
+
+ <!-- Enable Zram writeback feature to allow unused pages in zram be written to flash. -->
+ <bool name="config_zramWriteback">false</bool>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 05a156b69371..c8706838df57 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -194,9 +194,6 @@
<!-- The margin for text at the end of the image view for media notifications -->
<dimen name="notification_media_image_margin_end">72dp</dimen>
- <!-- The additional margin on the sides of the ambient view. -->
- <dimen name="notification_extra_margin_ambient">16dp</dimen>
-
<!-- The height of the notification action list -->
<dimen name="notification_action_list_height">60dp</dimen>
@@ -233,9 +230,6 @@
<!-- The bottom padding for the notification header -->
<dimen name="notification_header_padding_bottom">16dp</dimen>
- <!-- The margin at the top of the notification header when dozing. -->
- <dimen name="notification_header_margin_top_ambient">3dp</dimen>
-
<!-- The margin at the bottom of the notification header. -->
<dimen name="notification_header_margin_bottom">0dp</dimen>
@@ -400,11 +394,6 @@
<dimen name="notification_title_text_size">14sp</dimen>
<!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info, Time) -->
<dimen name="notification_subtext_size">12sp</dimen>
- <!-- Size of notification text (see TextAppearance.StatusBar.EventContent) -->
- <dimen name="notification_ambient_text_size">16sp</dimen>
- <!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) -->
- <dimen name="notification_ambient_title_text_size">24sp</dimen>
-
<!-- Top padding for notifications in the standard layout. -->
<dimen name="notification_top_pad">10dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 799d9d858b59..777886a9911c 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2934,6 +2934,8 @@
<public name="foregroundServiceType" />
<public name="hasFragileUserData" />
<public name="minAspectRatio" />
+ <!-- @hide @SystemApi -->
+ <public name="inheritShowWhenLocked" />
</public-group>
<public-group type="drawable" first-id="0x010800b4">
@@ -2983,6 +2985,11 @@
<public name="system_notification_accent_color" />
</public-group>
+ <public-group type="array" first-id="0x01070006">
+ <!-- @hide @SystemApi -->
+ <public name="config_defaultRoleHolders" />
+ </public-group>
+
<!-- ===============================================================
DO NOT ADD UN-GROUPED ITEMS HERE
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a7bc57afa749..0878562e00fb 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5238,6 +5238,15 @@
<!-- Content description of the overlay icon in the notification. [CHAR LIMIT=NONE] -->
<string name="notification_appops_overlay_active">displaying over other apps on your screen</string>
+ <!-- Dynamic mode battery saver strings -->
+ <!-- The user visible name of the notification channel for the routine mode battery saver fyi notification [CHAR_LIMIT=80]-->
+ <string name="dynamic_mode_notification_channel_name">Routine Mode info notification</string>
+ <!-- Title of notification letting users know why battery saver was turned on automatically [CHAR_LIMIT=NONE]-->
+ <string name="dynamic_mode_notification_title">Battery may run out before usual charge</string>
+ <!-- Summary of notification letting users know why battery saver was turned on automatically [CHAR_LIMIT=NONE]-->
+ <string name="dynamic_mode_notification_summary">Battery Saver activated to extend battery life</string>
+
+
<!-- Strings for car -->
<!-- String displayed when loading a user in the car [CHAR LIMIT=30] -->
<string name="car_loading_profile">Loading</string>
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index 200ef2f56f51..79afe697c504 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -271,9 +271,6 @@ easier.
<style name="TextAppearance.DeviceDefault.Notification.Info" parent="TextAppearance.Material.Notification.Info">
<item name="fontFamily">@string/config_bodyFontFamily</item>
</style>
- <style name="TextAppearance.DeviceDefault.Notification.Info.Ambient" parent="TextAppearance.Material.Notification.Info.Ambient">
- <item name="fontFamily">@string/config_bodyFontFamily</item>
- </style>
<style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Material.Widget">
<item name="fontFamily">@string/config_bodyFontFamily</item>
</style>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index 5a7199d6f445..63ac0e6bfc3e 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -487,10 +487,6 @@ please see styles_device_defaults.xml.
<style name="TextAppearance.Material.Notification.Time" parent="TextAppearance.Material.Notification.Info" />
- <style name="TextAppearance.Material.Notification.Info.Ambient">
- <item name="textSize">@dimen/notification_text_size</item>
- </style>
-
<style name="TextAppearance.Material.Notification.Emphasis">
<item name="textColor">#66000000</item>
</style>
@@ -1308,10 +1304,5 @@ please see styles_device_defaults.xml.
<item name="gravity">top</item>
</style>
- <style name="Notification.Header.Ambient">
- <item name="layout_marginTop">@dimen/notification_header_margin_top_ambient</item>
- <item name="gravity">top|center_horizontal</item>
- </style>
-
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 3979dedf2b83..2661496ec520 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -325,6 +325,7 @@
<java-symbol type="bool" name="config_forceDefaultOrientation" />
<java-symbol type="bool" name="config_wifi_batched_scan_supported" />
<java-symbol type="bool" name="config_wifi_softap_acs_supported" />
+ <java-symbol type="string" name="config_wifi_softap_acs_supported_channel_list" />
<java-symbol type="bool" name="config_wifi_softap_ieee80211ac_supported" />
<java-symbol type="bool" name="config_enableMultiUserUI"/>
<java-symbol type="bool" name="config_enableNewAutoSelectNetworkUI"/>
@@ -421,6 +422,7 @@
<java-symbol type="integer" name="config_wifi_framework_network_switch_tx_packet_threshold" />
<java-symbol type="integer" name="config_wifi_framework_network_switch_rx_packet_threshold" />
<java-symbol type="integer" name="config_wifi_framework_current_network_boost" />
+ <java-symbol type="integer" name="config_wifi_framework_recovery_timeout_delay" />
<java-symbol type="integer" name="config_bluetooth_max_advertisers" />
<java-symbol type="integer" name="config_bluetooth_max_scan_filters" />
<java-symbol type="integer" name="config_bluetooth_max_connected_audio_devices" />
@@ -458,9 +460,7 @@
<java-symbol type="integer" name="config_toastDefaultGravity" />
<java-symbol type="integer" name="config_triplePressOnPowerBehavior" />
<java-symbol type="integer" name="config_shortPressOnSleepBehavior" />
- <java-symbol type="integer" name="config_wifi_framework_scan_interval" />
<java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
- <java-symbol type="integer" name="config_wifi_no_network_periodic_scan_interval" />
<java-symbol type="integer" name="config_wifi_scan_interval_p2p_connected" />
<java-symbol type="integer" name="config_windowOutsetBottom" />
<java-symbol type="integer" name="db_connection_pool_size" />
@@ -1840,6 +1840,7 @@
<java-symbol type="array" name="radioAttributes" />
<java-symbol type="array" name="config_oemUsbModeOverride" />
<java-symbol type="array" name="config_locationProviderPackageNames" />
+ <java-symbol type="array" name="config_locationExtraPackageNames" />
<java-symbol type="array" name="config_testLocationProviders" />
<java-symbol type="array" name="config_defaultNotificationVibePattern" />
<java-symbol type="array" name="config_notificationFallbackVibePattern" />
@@ -1852,7 +1853,6 @@
<java-symbol type="bool" name="config_enableNightMode" />
<java-symbol type="bool" name="config_tintNotificationActionButtons" />
<java-symbol type="bool" name="config_dozeAfterScreenOffByDefault" />
- <java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" />
<java-symbol type="bool" name="config_enableHardwareFlpOverlay" />
<java-symbol type="bool" name="config_enableGeocoderOverlay" />
@@ -1879,6 +1879,7 @@
<java-symbol type="bool" name="config_wifi_dual_band_support" />
<java-symbol type="bool" name="config_wifi_convert_apband_5ghz_to_any" />
<java-symbol type="bool" name="config_wifi_local_only_hotspot_5ghz" />
+ <java-symbol type="bool" name="config_wifi_connected_mac_randomization_supported" />
<java-symbol type="bool" name="config_wifi_fast_bss_transition_enabled" />
<java-symbol type="bool" name="config_wimaxEnabled" />
<java-symbol type="bool" name="show_ongoing_ime_switcher" />
@@ -1964,6 +1965,7 @@
<java-symbol type="integer" name="config_screenBrightnessDark" />
<java-symbol type="integer" name="config_screenBrightnessDim" />
<java-symbol type="integer" name="config_screenBrightnessDoze" />
+ <java-symbol type="integer" name="config_autoBrightnessShortTermModelTimeout" />
<java-symbol type="integer" name="config_shutdownBatteryTemperature" />
<java-symbol type="integer" name="config_undockedHdmiRotation" />
<java-symbol type="integer" name="config_virtualKeyQuietTimeMillis" />
@@ -2019,7 +2021,6 @@
<java-symbol type="string" name="car_mode_disable_notification_title" />
<java-symbol type="string" name="chooser_wallpaper" />
<java-symbol type="string" name="config_datause_iface" />
- <java-symbol type="string" name="config_activityRecognitionHardwarePackageName" />
<java-symbol type="string" name="config_fusedLocationProviderPackageName" />
<java-symbol type="string" name="config_hardwareFlpPackageName" />
<java-symbol type="string" name="config_geocoderProviderPackageName" />
@@ -2139,6 +2140,7 @@
<java-symbol type="string" name="config_carrierAppInstallDialogComponent" />
<java-symbol type="string" name="config_defaultNetworkScorerPackageName" />
<java-symbol type="string" name="config_persistentDataPackageName" />
+ <java-symbol type="string" name="config_deviceConfiguratorPackageName" />
<java-symbol type="string" name="config_optionalPackageVerifierName" />
<java-symbol type="layout" name="resolver_list" />
@@ -3002,6 +3004,7 @@
<java-symbol type="array" name="config_emergency_mcc_codes" />
<java-symbol type="string" name="config_dozeDoubleTapSensorType" />
+ <java-symbol type="string" name="config_dozeTapSensorType" />
<java-symbol type="bool" name="config_dozePulsePickup" />
<!-- Used for MimeIconUtils. -->
@@ -3043,6 +3046,13 @@
<java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficientsNative" />
<java-symbol type="array" name="config_availableColorModes" />
+ <java-symbol type="bool" name="config_displayWhiteBalanceAvailable" />
+ <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureMin" />
+ <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureMax" />
+ <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureDefault" />
+ <java-symbol type="array" name="config_displayWhiteBalanceDisplayPrimaries" />
+ <java-symbol type="array" name="config_displayWhiteBalanceDisplayNominalWhite" />
+
<!-- Default first user restrictions -->
<java-symbol type="array" name="config_defaultFirstUserRestrictions" />
@@ -3067,8 +3077,6 @@
<java-symbol type="dimen" name="config_appTransitionAnimationDurationScaleDefault" />
- <java-symbol type="layout" name="notification_template_material_ambient" />
-
<!-- Network Recommendation -->
<java-symbol type="string" name="config_defaultNetworkRecommendationProviderPackage" />
@@ -3228,8 +3236,6 @@
<java-symbol type="string" name="time_picker_text_input_mode_description"/>
<java-symbol type="string" name="time_picker_radial_mode_description"/>
- <java-symbol type="layout" name="notification_template_ambient_header" />
-
<!-- resolver activity -->
<java-symbol type="drawable" name="resolver_icon_placeholder" />
@@ -3276,6 +3282,9 @@
<java-symbol type="string" name="config_defaultWellbeingPackage" />
<java-symbol type="string" name="config_defaultContentCaptureService" />
<java-symbol type="string" name="config_defaultAugmentedAutofillService" />
+ <java-symbol type="string" name="config_defaultAppPredictionService" />
+ <java-symbol type="string" name="config_defaultContentSuggestionsService" />
+ <java-symbol type="string" name="config_defaultAttentionService" />
<java-symbol type="string" name="notification_channel_foreground_service" />
<java-symbol type="string" name="foreground_service_app_in_background" />
@@ -3498,6 +3507,7 @@
<java-symbol type="integer" name="config_defaultHapticFeedbackIntensity" />
<java-symbol type="integer" name="config_defaultNotificationVibrationIntensity" />
+ <java-symbol type="integer" name="config_defaultRingVibrationIntensity" />
<java-symbol type="bool" name="config_maskMainBuiltInDisplayCutout" />
@@ -3524,9 +3534,20 @@
<java-symbol type="dimen" name="rounded_corner_radius" />
<java-symbol type="dimen" name="rounded_corner_radius_top" />
<java-symbol type="dimen" name="rounded_corner_radius_bottom" />
+ <java-symbol type="bool" name="config_supportsRoundedCornersOnWindows" />
<java-symbol type="string" name="config_defaultModuleMetadataProvider" />
<!-- For Secondary Launcher -->
<java-symbol type="string" name="config_secondaryHomeComponent" />
+
+ <java-symbol type="string" name="dynamic_mode_notification_channel_name" />
+ <java-symbol type="string" name="dynamic_mode_notification_title" />
+ <java-symbol type="string" name="dynamic_mode_notification_summary" />
+ <java-symbol type="drawable" name="ic_battery" />
+
+ <java-symbol type="bool" name="config_skipSensorAvailable" />
+ <java-symbol type="bool" name="config_silenceSensorAvailable" />
+
+ <java-symbol type="bool" name="config_zramWriteback" />
</resources>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 0f4ca66dcd68..75a727bdcfdf 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -1454,12 +1454,17 @@ easier.
<item name="panelMenuListTheme">@style/Theme.Material.Settings.CompactMenu</item>
<!-- action bar -->
+ <item name="actionBarStyle">@style/Widget.DeviceDefault.Light.ActionBar.Solid</item>
<item name="actionBarTheme">@style/ThemeOverlay.DeviceDefault.ActionBar</item>
<item name="popupTheme">@style/ThemeOverlay.DeviceDefault.Popup.Light</item>
<!-- Color palette -->
+ <item name="colorBackground">@color/background_device_default_light</item>
+ <item name="colorPrimary">@color/primary_device_default_settings_light</item>
<item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
<item name="colorSecondary">@color/secondary_device_default_settings_light</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorError">@color/error_color_device_default_light</item>
<item name="colorEdgeEffect">@android:color/black</item>
<!-- Add white nav bar with divider that matches material -->
@@ -1467,9 +1472,16 @@ easier.
<item name="navigationBarColor">@android:color/white</item>
<item name="windowLightNavigationBar">true</item>
+ <!-- Dialog attributes -->
+ <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
+
<!-- Button styles -->
+ <item name="buttonCornerRadius">@dimen/config_buttonCornerRadius</item>
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
+ <!-- Progress bar attributes -->
+ <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
<item name="listDivider">@color/list_divider_color_light</item>
</style>
@@ -1699,8 +1711,4 @@ easier.
<item name="notificationHeaderTextAppearance">@style/TextAppearance.DeviceDefault.Notification.Info</item>
</style>
- <style name="Theme.DeviceDefault.Notification.Ambient" parent="@style/Theme.Material.Notification.Ambient">
- <item name="notificationHeaderTextAppearance">@style/TextAppearance.DeviceDefault.Notification.Info.Ambient</item>
- </style>
-
</resources>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index ccaf04160dc5..6b7698e344ad 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -1341,14 +1341,6 @@ please see themes_device_defaults.xml.
<item name="notificationHeaderIconSize">@dimen/notification_header_icon_size</item>
</style>
- <!-- Theme for inflating ambient notification -->
- <style name="Theme.Material.Notification.Ambient">
- <item name="notificationHeaderStyle">@style/Notification.Header.Ambient</item>
- <item name="notificationHeaderTextAppearance">@style/TextAppearance.Material.Notification.Info.Ambient</item>
- <item name="notificationHeaderAppNameVisibility">gone</item>
- <item name="notificationHeaderIconSize">@dimen/notification_header_icon_size_ambient</item>
- </style>
-
<!-- Default theme for Settings and activities launched from Settings. -->
<style name="Theme.Material.Settings" parent="Theme.Material.Light.LightStatusBar">
<item name="homeAsUpIndicator">@drawable/ic_ab_back_material_settings</item>
diff --git a/core/tests/BroadcastRadioTests/Android.mk b/core/tests/BroadcastRadioTests/Android.mk
index 24f0cf07f443..6b0484ec366d 100644
--- a/core/tests/BroadcastRadioTests/Android.mk
+++ b/core/tests/BroadcastRadioTests/Android.mk
@@ -25,7 +25,7 @@ LOCAL_MODULE_TAGS := tests
# LOCAL_SDK_VERSION := current
LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test testng
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util androidx.test.rules testng
LOCAL_JAVA_LIBRARIES := android.test.base
diff --git a/core/tests/BroadcastRadioTests/AndroidManifest.xml b/core/tests/BroadcastRadioTests/AndroidManifest.xml
index d9b5522693e3..ce12cc99946f 100644
--- a/core/tests/BroadcastRadioTests/AndroidManifest.xml
+++ b/core/tests/BroadcastRadioTests/AndroidManifest.xml
@@ -24,7 +24,7 @@
</application>
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.hardware.radio.tests"
android:label="Tests for Broadcast Radio APIs" >
</instrumentation>
diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
index fdaba089490e..d2bd1e172ee2 100644
--- a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
+++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
@@ -15,22 +15,29 @@
*/
package android.hardware.radio.tests.functional;
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.after;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.atMost;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.testng.Assert.assertThrows;
+
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
import android.hardware.radio.RadioTuner;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -41,19 +48,10 @@ import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import static org.junit.Assert.*;
-import static org.junit.Assume.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.after;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.atMost;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.testng.Assert.assertThrows;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* A test for broadcast radio API.
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 041fb7eeb6b3..0fc3bd224fbf 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -36,14 +36,15 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
frameworks-core-util-lib \
mockwebserver \
guava \
- android-support-test \
+ androidx.test.runner \
+ androidx.test.rules \
mockito-target-minus-junit4 \
espresso-core \
ub-uiautomator \
platform-test-annotations \
- compatibility-device-util \
truth-prebuilt \
- print-test-util-lib
+ print-test-util-lib \
+ testng # TODO: remove once Android migrates to JUnit 4.12, which provide assertThrows
LOCAL_JAVA_LIBRARIES := \
android.test.runner \
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 46d4a4773389..86818c611c1f 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -56,6 +56,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.READ_DREAM_STATE" />
<uses-permission android:name="android.permission.WRITE_DREAM_STATE" />
<uses-permission android:name="android.permission.READ_LOGS"/>
@@ -65,6 +66,7 @@
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
@@ -1425,7 +1427,7 @@
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.coretests"
android:label="Frameworks Core Tests" />
<key-sets>
diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml
index 68ef34b279e6..b40aa87cb78b 100644
--- a/core/tests/coretests/AndroidTest.xml
+++ b/core/tests/coretests/AndroidTest.xml
@@ -25,6 +25,7 @@
<option name="test-tag" value="FrameworksCoreTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.frameworks.coretests" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/core/tests/coretests/README b/core/tests/coretests/README
index ea282a0ebb3a..34beb454b397 100644
--- a/core/tests/coretests/README
+++ b/core/tests/coretests/README
@@ -30,9 +30,9 @@ Next, install the resulting APK and run tests as you would normal JUnit tests:
adb install -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
adb shell am instrument -w \
- com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
-To run a tests within a specific package, add the following argument AFTER -w:
+To run a tests within a specific package, add -e AFTER -w and before the runner class:
-e package android.content.pm
diff --git a/core/tests/coretests/res/color/drawable_in_color_dir_invalid.xml b/core/tests/coretests/res/color/drawable_in_color_dir_invalid.xml
new file mode 100644
index 000000000000..8d630b09ef42
--- /dev/null
+++ b/core/tests/coretests/res/color/drawable_in_color_dir_invalid.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+
+<!-- This drawable is purposely in the color directory to test a backwards compatible fallback. -->
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/icon" android:drawable="@string/app_name" />
+</layer-list> \ No newline at end of file
diff --git a/core/tests/coretests/res/color/drawable_in_color_dir_valid.xml b/core/tests/coretests/res/color/drawable_in_color_dir_valid.xml
new file mode 100644
index 000000000000..d1404753d57a
--- /dev/null
+++ b/core/tests/coretests/res/color/drawable_in_color_dir_valid.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+
+<!-- This drawable is purposely in the color directory to test a backwards compatible fallback. -->
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background" android:drawable="@drawable/test32x24" />
+ <item android:id="@android:id/icon" android:drawable="@drawable/test16x12" />
+</layer-list> \ No newline at end of file
diff --git a/core/tests/coretests/res/raw/com_android_tzdata.apex b/core/tests/coretests/res/raw/com_android_tzdata.apex
new file mode 100644
index 000000000000..72294dead2de
--- /dev/null
+++ b/core/tests/coretests/res/raw/com_android_tzdata.apex
Binary files differ
diff --git a/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java
index e26bdf53b872..be1d44cec6a6 100644
--- a/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java
+++ b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java
@@ -13,18 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import androidx.test.filters.LargeTest;
import com.android.frameworks.coretests.R;
+import java.util.HashSet;
+import java.util.Set;
+
@LargeTest
public class AnimatorInflaterTest extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> {
Set<Integer> identityHashes = new HashSet<Integer>();
diff --git a/core/tests/coretests/src/android/animation/AnimatorSetActivity.java b/core/tests/coretests/src/android/animation/AnimatorSetActivity.java
index 501ea485b8b2..af265afa83e5 100644
--- a/core/tests/coretests/src/android/animation/AnimatorSetActivity.java
+++ b/core/tests/coretests/src/android/animation/AnimatorSetActivity.java
@@ -1,10 +1,26 @@
-package android.animation;
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
-import com.android.frameworks.coretests.R;
+package android.animation;
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class AnimatorSetActivity extends Activity {
@Override
public void onCreate(Bundle savedBundleInstance) {
diff --git a/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java b/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java
index 922bc59d71d1..55837ba3926c 100644
--- a/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java
+++ b/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java
@@ -1,12 +1,29 @@
-package android.animation;
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
-import com.android.frameworks.coretests.R;
+package android.animation;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+
+import com.android.frameworks.coretests.R;
+
import java.util.ArrayList;
public class AnimatorSetActivityTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> {
diff --git a/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java b/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java
index 7eb32ee36876..4e90d1acf4a0 100644
--- a/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java
+++ b/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java
@@ -13,12 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import android.os.Handler;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.widget.Button;
+
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
import java.util.concurrent.TimeUnit;
diff --git a/core/tests/coretests/src/android/animation/AutoCancelTest.java b/core/tests/coretests/src/android/animation/AutoCancelTest.java
index b1f88db86473..b3ec92cf1f0f 100644
--- a/core/tests/coretests/src/android/animation/AutoCancelTest.java
+++ b/core/tests/coretests/src/android/animation/AutoCancelTest.java
@@ -13,11 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import android.os.Handler;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
diff --git a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
index 0e1e6ac98672..2b9866d7a0b2 100644
--- a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
+++ b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.animation;
-import com.android.frameworks.coretests.R;
+package android.animation;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
+import com.android.frameworks.coretests.R;
+
public class BasicAnimatorActivity extends Activity {
public Button mAnimatingButton;
@Override
diff --git a/core/tests/coretests/src/android/animation/EventsTest.java b/core/tests/coretests/src/android/animation/EventsTest.java
index 28cfe3d5d68b..ba7413a2a4f7 100644
--- a/core/tests/coretests/src/android/animation/EventsTest.java
+++ b/core/tests/coretests/src/android/animation/EventsTest.java
@@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import android.os.Handler;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
diff --git a/core/tests/coretests/src/android/animation/FutureWaiter.java b/core/tests/coretests/src/android/animation/FutureWaiter.java
index 0c65e20be6a5..0c09a4a27d93 100644
--- a/core/tests/coretests/src/android/animation/FutureWaiter.java
+++ b/core/tests/coretests/src/android/animation/FutureWaiter.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import com.google.common.util.concurrent.AbstractFuture;
diff --git a/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java b/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java
index 606a93949a54..53f94727f6d3 100644
--- a/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java
+++ b/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java
@@ -13,9 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import android.widget.Button;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/animation/StateListAnimatorTest.java b/core/tests/coretests/src/android/animation/StateListAnimatorTest.java
index a9961e19e0c6..e755b89f8551 100644
--- a/core/tests/coretests/src/android/animation/StateListAnimatorTest.java
+++ b/core/tests/coretests/src/android/animation/StateListAnimatorTest.java
@@ -14,16 +14,16 @@
* limitations under the License.
*/
-
package android.animation;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
import android.util.StateSet;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
+
import com.android.frameworks.coretests.R;
import java.util.concurrent.atomic.AtomicInteger;
diff --git a/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java b/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java
index c25d050dd3f4..f6d71b88bd89 100644
--- a/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java
+++ b/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
/**
diff --git a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java
index 4facf7742153..dee0a3ecdbe0 100644
--- a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java
+++ b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
+import static android.test.MoreAsserts.assertNotEqual;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
@@ -24,23 +27,20 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Choreographer;
import android.view.animation.LinearInterpolator;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
-import static android.test.MoreAsserts.assertNotEqual;
-
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ValueAnimatorTests {
diff --git a/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java b/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java
index 30ec182f757c..997af009a9b8 100644
--- a/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java
+++ b/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java
@@ -13,15 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.animation;
import android.os.Handler;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.ViewPropertyAnimator;
import android.widget.Button;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import java.util.concurrent.TimeUnit;
diff --git a/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java b/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java
index 19a390ab1a11..8dc5ad66194b 100644
--- a/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java
+++ b/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java
@@ -16,15 +16,16 @@
package android.app;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import android.app.ApplicationErrorReport.CrashInfo;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
diff --git a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
index 063bef7387c6..4b0ed65e5fde 100644
--- a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
+++ b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
@@ -16,13 +16,17 @@
package android.app;
+import static android.os.storage.VolumeInfo.STATE_MOUNTED;
+import static android.os.storage.VolumeInfo.STATE_UNMOUNTED;
+
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
@@ -32,9 +36,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import static android.os.storage.VolumeInfo.STATE_MOUNTED;
-import static android.os.storage.VolumeInfo.STATE_UNMOUNTED;
-
@LargeTest
public class ApplicationPackageManagerTest extends TestCase {
private static final String sInternalVolPath = "/data";
diff --git a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
index c1d4be0f33c3..33e040253f06 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
@@ -22,7 +22,8 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import androidx.test.filters.LargeTest;
import com.google.mockwebserver.MockResponse;
diff --git a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
index 39d9a8e31ddc..adfe76f2f151 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
@@ -23,10 +23,11 @@ import android.net.Uri;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.StatFs;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.Suppress;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
diff --git a/core/tests/coretests/src/android/app/InstrumentationTest.java b/core/tests/coretests/src/android/app/InstrumentationTest.java
index 9b59da48e760..93b5aecfc8f7 100644
--- a/core/tests/coretests/src/android/app/InstrumentationTest.java
+++ b/core/tests/coretests/src/android/app/InstrumentationTest.java
@@ -17,9 +17,10 @@
package android.app;
import android.os.Bundle;
-import android.support.test.filters.LargeTest;
import android.test.InstrumentationTestCase;
+import androidx.test.filters.LargeTest;
+
@LargeTest
public class InstrumentationTest extends InstrumentationTestCase {
diff --git a/core/tests/coretests/src/android/app/LoaderLifecycleTest.java b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java
index c83e7988dcc6..e343383df3f1 100644
--- a/core/tests/coretests/src/android/app/LoaderLifecycleTest.java
+++ b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-
package android.app;
import static junit.framework.TestCase.assertNotNull;
@@ -27,11 +26,12 @@ import static org.junit.Assert.fail;
import android.content.Context;
import android.os.Handler;
import android.os.Parcelable;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index e89a4d3bf94f..c17aa9254808 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -33,11 +33,12 @@ import android.media.session.MediaSession;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.widget.RemoteViews;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/SearchManagerTest.java b/core/tests/coretests/src/android/app/SearchManagerTest.java
index 08b7f60c368f..14370c887675 100644
--- a/core/tests/coretests/src/android/app/SearchManagerTest.java
+++ b/core/tests/coretests/src/android/app/SearchManagerTest.java
@@ -17,17 +17,13 @@
package android.app;
import android.app.activity.LocalActivity;
-
-import android.app.Activity;
-import android.app.ISearchManager;
-import android.app.SearchManager;
-import android.app.SearchableInfo;
import android.content.ComponentName;
import android.content.Context;
import android.os.ServiceManager;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
/**
* To launch this test from the command line:
diff --git a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
index 61d73bc918d5..bbd442d53f76 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
@@ -21,8 +21,9 @@ import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.content.res.Configuration;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
import java.util.Iterator;
import java.util.List;
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index 1750dac60e33..9cb34895dea4 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -19,28 +19,36 @@ package android.app.activity;
import static android.content.Intent.ACTION_EDIT;
import static android.content.Intent.ACTION_VIEW;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.app.ActivityThread;
import android.app.IApplicationThread;
+import android.app.servertransaction.ActivityConfigurationChangeItem;
import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.ResumeActivityItem;
import android.app.servertransaction.StopActivityItem;
import android.content.Intent;
+import android.content.res.Configuration;
import android.os.IBinder;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.util.MergedConfiguration;
+import android.view.Display;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.CountDownLatch;
+
/**
* Test for verifying {@link android.app.ActivityThread} class.
* Build/Install/Run:
@@ -50,8 +58,12 @@ import org.junit.runner.RunWith;
@MediumTest
public class ActivityThreadTest {
- private final ActivityTestRule mActivityTestRule =
- new ActivityTestRule(TestActivity.class, true /* initialTouchMode */,
+ // The first sequence number to try with. Use a large number to avoid conflicts with the first a
+ // few sequence numbers the framework used to launch the test activity.
+ private static final int BASE_SEQ = 10000;
+
+ private final ActivityTestRule<TestActivity> mActivityTestRule =
+ new ActivityTestRule<>(TestActivity.class, true /* initialTouchMode */,
false /* launchActivity */);
@Test
@@ -129,6 +141,179 @@ public class ActivityThreadTest {
});
}
+ @Test
+ public void testHandleActivityConfigurationChanged() {
+ final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ final int numOfConfig = activity.mNumOfConfigChanges;
+ applyConfigurationChange(activity, BASE_SEQ);
+ assertEquals(numOfConfig + 1, activity.mNumOfConfigChanges);
+ });
+ }
+
+ @Test
+ public void testHandleActivityConfigurationChanged_DropStaleConfigurations() {
+ final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ // Set the sequence number to BASE_SEQ.
+ applyConfigurationChange(activity, BASE_SEQ);
+
+ final int orientation = activity.mConfig.orientation;
+ final int numOfConfig = activity.mNumOfConfigChanges;
+
+ // Try to apply an old configuration change.
+ applyConfigurationChange(activity, BASE_SEQ - 1);
+ assertEquals(numOfConfig, activity.mNumOfConfigChanges);
+ assertEquals(orientation, activity.mConfig.orientation);
+ });
+ }
+
+ @Test
+ public void testHandleActivityConfigurationChanged_ApplyNewConfigurations() {
+ final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ // Set the sequence number to BASE_SEQ and record the final sequence number it used.
+ final int seq = applyConfigurationChange(activity, BASE_SEQ);
+
+ final int orientation = activity.mConfig.orientation;
+ final int numOfConfig = activity.mNumOfConfigChanges;
+
+ // Try to apply an new configuration change.
+ applyConfigurationChange(activity, seq + 1);
+ assertEquals(numOfConfig + 1, activity.mNumOfConfigChanges);
+ assertNotEquals(orientation, activity.mConfig.orientation);
+ });
+ }
+
+ @Test
+ public void testHandleActivityConfigurationChanged_PickNewerPendingConfiguration() {
+ final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ // Set the sequence number to BASE_SEQ and record the final sequence number it used.
+ final int seq = applyConfigurationChange(activity, BASE_SEQ);
+
+ final int orientation = activity.mConfig.orientation;
+ final int numOfConfig = activity.mNumOfConfigChanges;
+
+ final ActivityThread activityThread = activity.getActivityThread();
+
+ final Configuration pendingConfig = new Configuration();
+ pendingConfig.orientation = orientation == Configuration.ORIENTATION_LANDSCAPE
+ ? Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
+ pendingConfig.seq = seq + 2;
+ activityThread.updatePendingActivityConfiguration(activity.getActivityToken(),
+ pendingConfig);
+
+ final Configuration newConfig = new Configuration();
+ newConfig.orientation = orientation;
+ newConfig.seq = seq + 1;
+
+ activityThread.handleActivityConfigurationChanged(activity.getActivityToken(),
+ newConfig, Display.INVALID_DISPLAY);
+ assertEquals(numOfConfig + 1, activity.mNumOfConfigChanges);
+ assertEquals(pendingConfig.orientation, activity.mConfig.orientation);
+ });
+ }
+
+ @Test
+ public void testHandleActivityConfigurationChanged_OnlyAppliesNewestConfiguration()
+ throws Exception {
+ final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+ final ActivityThread activityThread = activity.getActivityThread();
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ final Configuration config = new Configuration();
+ config.seq = BASE_SEQ;
+ config.orientation = Configuration.ORIENTATION_PORTRAIT;
+
+ activityThread.handleActivityConfigurationChanged(activity.getActivityToken(),
+ config, Display.INVALID_DISPLAY);
+ });
+
+ final int numOfConfig = activity.mNumOfConfigChanges;
+ final IApplicationThread appThread = activityThread.getApplicationThread();
+
+ activity.mConfigLatch = new CountDownLatch(1);
+ activity.mTestLatch = new CountDownLatch(1);
+
+ Configuration config = new Configuration();
+ config.seq = BASE_SEQ + 1;
+ config.smallestScreenWidthDp = 100;
+ appThread.scheduleTransaction(newActivityConfigTransaction(activity, config));
+
+ // Wait until the main thread is performing the configuration change for the configuration
+ // with sequence number BASE_SEQ + 1 before proceeding. This is to mimic the situation where
+ // the activity takes very long time to process configuration changes.
+ activity.mTestLatch.await();
+
+ config = new Configuration();
+ config.seq = BASE_SEQ + 2;
+ config.smallestScreenWidthDp = 200;
+ appThread.scheduleTransaction(newActivityConfigTransaction(activity, config));
+
+ config = new Configuration();
+ config.seq = BASE_SEQ + 3;
+ config.smallestScreenWidthDp = 300;
+ appThread.scheduleTransaction(newActivityConfigTransaction(activity, config));
+
+ config = new Configuration();
+ config.seq = BASE_SEQ + 4;
+ config.smallestScreenWidthDp = 400;
+ appThread.scheduleTransaction(newActivityConfigTransaction(activity, config));
+
+ activity.mConfigLatch.countDown();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ activity.mConfigLatch = null;
+ activity.mTestLatch = null;
+
+ // Only two more configuration changes: one with seq BASE_SEQ + 1; another with seq
+ // BASE_SEQ + 4. Configurations scheduled in between should be dropped.
+ assertEquals(numOfConfig + 2, activity.mNumOfConfigChanges);
+ assertEquals(400, activity.mConfig.smallestScreenWidthDp);
+ }
+
+ /**
+ * Calls {@link ActivityThread#handleActivityConfigurationChanged(IBinder, Configuration, int)}
+ * to try to push activity configuration to the activity for the given sequence number.
+ * <p>
+ * It uses orientation to push the configuration and it tries a different orientation if the
+ * first attempt doesn't make through, to rule out the possibility that the previous
+ * configuration already has the same orientation.
+ *
+ * @param activity the test target activity
+ * @param seq the specified sequence number
+ * @return the sequence number this method tried with the last time, so that the caller can use
+ * the next sequence number for next configuration update.
+ */
+ private int applyConfigurationChange(TestActivity activity, int seq) {
+ final ActivityThread activityThread = activity.getActivityThread();
+
+ final int numOfConfig = activity.mNumOfConfigChanges;
+ Configuration config = new Configuration();
+ config.orientation = Configuration.ORIENTATION_PORTRAIT;
+ config.seq = seq;
+ activityThread.handleActivityConfigurationChanged(activity.getActivityToken(), config,
+ Display.INVALID_DISPLAY);
+
+ if (activity.mNumOfConfigChanges > numOfConfig) {
+ return config.seq;
+ }
+
+ config = new Configuration();
+ config.orientation = Configuration.ORIENTATION_LANDSCAPE;
+ config.seq = seq + 1;
+ activityThread.handleActivityConfigurationChanged(activity.getActivityToken(), config,
+ Display.INVALID_DISPLAY);
+
+ return config.seq;
+ }
+
private static ClientTransaction newRelaunchResumeTransaction(Activity activity) {
final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null,
null, 0, new MergedConfiguration(), false /* preserveWindow */);
@@ -162,6 +347,16 @@ public class ActivityThreadTest {
return transaction;
}
+ private static ClientTransaction newActivityConfigTransaction(Activity activity,
+ Configuration config) {
+ final ActivityConfigurationChangeItem item = ActivityConfigurationChangeItem.obtain(config);
+
+ final ClientTransaction transaction = newTransaction(activity);
+ transaction.addCallback(item);
+
+ return transaction;
+ }
+
private static ClientTransaction newTransaction(Activity activity) {
final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
return ClientTransaction.obtain(appThread, activity.getActivityToken());
@@ -169,5 +364,37 @@ public class ActivityThreadTest {
// Test activity
public static class TestActivity extends Activity {
+ int mNumOfConfigChanges;
+ final Configuration mConfig = new Configuration();
+
+ /**
+ * A latch used to notify tests that we're about to wait for configuration latch. This
+ * is used to notify test code that preExecute phase for activity configuration change
+ * transaction has passed.
+ */
+ volatile CountDownLatch mTestLatch;
+ /**
+ * If not {@code null} {@link #onConfigurationChanged(Configuration)} won't return until the
+ * latch reaches 0.
+ */
+ volatile CountDownLatch mConfigLatch;
+
+ @Override
+ public void onConfigurationChanged(Configuration config) {
+ super.onConfigurationChanged(config);
+ mConfig.setTo(config);
+ ++mNumOfConfigChanges;
+
+ if (mConfigLatch != null) {
+ if (mTestLatch != null) {
+ mTestLatch.countDown();
+ }
+ try {
+ mConfigLatch.await();
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
}
}
diff --git a/core/tests/coretests/src/android/app/activity/BroadcastTest.java b/core/tests/coretests/src/android/app/activity/BroadcastTest.java
index 13e70ebdb2e3..0f81896692c0 100644
--- a/core/tests/coretests/src/android/app/activity/BroadcastTest.java
+++ b/core/tests/coretests/src/android/app/activity/BroadcastTest.java
@@ -27,11 +27,10 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.UserHandle;
-import android.support.test.filters.LargeTest;
-import android.test.FlakyTest;
import android.util.Log;
-import java.util.Arrays;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.LargeTest;
@LargeTest
public class BroadcastTest extends ActivityTestsBase {
@@ -231,7 +230,7 @@ public class BroadcastTest extends ActivityTestsBase {
};
// Mark flaky until http://b/issue?id=1191607 is resolved.
- @FlakyTest(tolerance=2)
+ @FlakyTest
public void testRegistered() throws Exception {
runLaunchpad(LaunchpadActivity.BROADCAST_REGISTERED);
}
@@ -248,12 +247,12 @@ public class BroadcastTest extends ActivityTestsBase {
runLaunchpad(LaunchpadActivity.BROADCAST_ABORT);
}
- @FlakyTest(tolerance=2)
+ @FlakyTest
public void testAll() throws Exception {
runLaunchpad(LaunchpadActivity.BROADCAST_ALL);
}
- @FlakyTest(tolerance=2)
+ @FlakyTest
public void testMulti() throws Exception {
runLaunchpad(LaunchpadActivity.BROADCAST_MULTI);
}
@@ -348,7 +347,7 @@ public class BroadcastTest extends ActivityTestsBase {
}
// Marking flaky until http://b/issue?id=1191337 is resolved
- @FlakyTest(tolerance=2)
+ @FlakyTest
public void testReceiveSticky() throws Exception {
Intent intent = new Intent(LaunchpadActivity.BROADCAST_STICKY1, null);
intent.putExtra("test", LaunchpadActivity.DATA_1);
@@ -358,7 +357,7 @@ public class BroadcastTest extends ActivityTestsBase {
}
// Marking flaky until http://b/issue?id=1191337 is resolved
- @FlakyTest(tolerance=2)
+ @FlakyTest
public void testReceive2Sticky() throws Exception {
Intent intent = new Intent(LaunchpadActivity.BROADCAST_STICKY1, null);
intent.putExtra("test", LaunchpadActivity.DATA_1);
diff --git a/core/tests/coretests/src/android/app/activity/IntentSenderTest.java b/core/tests/coretests/src/android/app/activity/IntentSenderTest.java
index 8c1d79b5d89c..19ddb52db86e 100644
--- a/core/tests/coretests/src/android/app/activity/IntentSenderTest.java
+++ b/core/tests/coretests/src/android/app/activity/IntentSenderTest.java
@@ -21,7 +21,8 @@ import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
@LargeTest
public class IntentSenderTest extends BroadcastTest {
diff --git a/core/tests/coretests/src/android/app/activity/LaunchTest.java b/core/tests/coretests/src/android/app/activity/LaunchTest.java
index 5b86dceb75f8..6846ea75e524 100644
--- a/core/tests/coretests/src/android/app/activity/LaunchTest.java
+++ b/core/tests/coretests/src/android/app/activity/LaunchTest.java
@@ -17,8 +17,9 @@
package android.app.activity;
import android.content.ComponentName;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.Suppress;
@Suppress // Flaky.
public class LaunchTest extends ActivityTestsBase {
diff --git a/core/tests/coretests/src/android/app/activity/LifecycleTest.java b/core/tests/coretests/src/android/app/activity/LifecycleTest.java
index ed01fac5e0a9..5aa03807264e 100644
--- a/core/tests/coretests/src/android/app/activity/LifecycleTest.java
+++ b/core/tests/coretests/src/android/app/activity/LifecycleTest.java
@@ -18,8 +18,9 @@ package android.app.activity;
import android.content.ComponentName;
import android.content.Intent;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
public class LifecycleTest extends ActivityTestsBase {
private Intent mTopIntent;
diff --git a/core/tests/coretests/src/android/app/activity/MetaDataTest.java b/core/tests/coretests/src/android/app/activity/MetaDataTest.java
index 5b9c0e903135..cf27878e897e 100644
--- a/core/tests/coretests/src/android/app/activity/MetaDataTest.java
+++ b/core/tests/coretests/src/android/app/activity/MetaDataTest.java
@@ -27,8 +27,11 @@ import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
diff --git a/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java b/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java
index 9f402a5265ec..8184627494ed 100644
--- a/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java
+++ b/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java
@@ -1,19 +1,18 @@
-/* //device/apps/AndroidTests/src/com.android.unit_tests/activity/TestedScreen.java
-**
-** Copyright 2006, 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.
-*/
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package android.app.activity;
@@ -21,7 +20,8 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
-import android.util.Log;
+
+//device/apps/AndroidTests/src/com.android.unit_tests/activity/TestedScreen.java
public class RemoteSubActivityScreen extends SubActivityScreen {
Handler mHandler = new Handler();
diff --git a/core/tests/coretests/src/android/app/activity/ServiceTest.java b/core/tests/coretests/src/android/app/activity/ServiceTest.java
index d3ae415223e0..9d2aebd1e6cd 100644
--- a/core/tests/coretests/src/android/app/activity/ServiceTest.java
+++ b/core/tests/coretests/src/android/app/activity/ServiceTest.java
@@ -22,13 +22,12 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Bundle;
-import android.os.RemoteException;
import android.os.IBinder;
import android.os.Parcel;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
+import android.os.RemoteException;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
// These test binders purport to support an interface whose canonical
// interface name is ServiceTest.SERVICE_LOCAL
diff --git a/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java b/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java
index 41b95476baf3..8e172952c9ee 100644
--- a/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java
+++ b/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java
@@ -19,7 +19,8 @@ package android.app.activity;
import android.app.AlarmManager;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import androidx.test.filters.LargeTest;
import java.util.TimeZone;
diff --git a/core/tests/coretests/src/android/app/activity/SubActivityTest.java b/core/tests/coretests/src/android/app/activity/SubActivityTest.java
index 35dde8a51567..53f89fe1276b 100644
--- a/core/tests/coretests/src/android/app/activity/SubActivityTest.java
+++ b/core/tests/coretests/src/android/app/activity/SubActivityTest.java
@@ -16,9 +16,10 @@
package android.app.activity;
-import android.test.suitebuilder.annotation.Suppress;
import android.content.ComponentName;
+import androidx.test.filters.Suppress;
+
@Suppress
public class SubActivityTest extends ActivityTestsBase {
diff --git a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
index 9b5b725a3bed..8d42c74be7b0 100644
--- a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
+++ b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
@@ -27,8 +27,9 @@ import static org.junit.Assert.assertNotEquals;
import android.app.admin.PasswordMetrics.PasswordComplexityBucket;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
index 689e683dda23..1f4e5dffc84e 100644
--- a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
+++ b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.app.assist;
import static android.view.View.AUTOFILL_TYPE_TEXT;
@@ -22,13 +23,9 @@ import static android.view.View.IMPORTANT_FOR_AUTOFILL_YES;
import static com.google.common.truth.Truth.assertThat;
import android.app.assist.AssistStructure.ViewNode;
-import android.content.ComponentName;
import android.content.Context;
import android.os.Parcel;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.text.InputFilter;
import android.util.Log;
import android.view.autofill.AutofillId;
@@ -37,6 +34,10 @@ import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java b/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java
index f4b6bed1cac8..defec433e403 100644
--- a/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java
+++ b/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.app.assist;
import android.app.Activity;
diff --git a/core/tests/coretests/src/android/app/backup/BackupDataTest.java b/core/tests/coretests/src/android/app/backup/BackupDataTest.java
index 5b8e481cf573..18ff54fa6989 100644
--- a/core/tests/coretests/src/android/app/backup/BackupDataTest.java
+++ b/core/tests/coretests/src/android/app/backup/BackupDataTest.java
@@ -16,31 +16,22 @@
package android.app.backup;
-import android.app.backup.BackupDataInput;
-import android.app.backup.BackupDataOutput;
-import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
-import android.test.InstrumentationTestCase;
import android.util.Base64;
-import android.util.Log;
-import org.json.JSONObject;
+
+import androidx.test.filters.LargeTest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.FileReader;
import java.io.IOException;
-import java.io.InputStream;
import java.io.InputStreamReader;
-import java.lang.Exception;
-import java.nio.ByteBuffer;
@LargeTest
public class BackupDataTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
index 5db416b33af7..08edb4e9be97 100644
--- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java
+++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
@@ -18,11 +18,12 @@ package android.app.backup;
import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
import android.content.Context;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
import android.util.ArrayMap;
import android.util.ArraySet;
+import androidx.test.filters.LargeTest;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java
index b1f855246320..52b26589279f 100644
--- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java
@@ -23,8 +23,9 @@ import static org.mockito.Mockito.verify;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java
index fb0f5344f643..ad28d13dc46a 100644
--- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java
@@ -35,8 +35,9 @@ import android.os.Binder;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
index a788a938357f..f730a244a593 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
@@ -45,10 +45,11 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index 2801f32430ef..8604b0c48476 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -50,8 +50,9 @@ import android.os.PersistableBundle;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.app.IVoiceInteractor;
diff --git a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
index e20645c7d3c8..0efc0ab89a73 100644
--- a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
+++ b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
@@ -21,7 +21,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
index b69054cebbd2..b519bf8b13f7 100644
--- a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
+++ b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
@@ -21,7 +21,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
index dd462403ed82..bb535b6fac7d 100644
--- a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
+++ b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
@@ -16,14 +16,13 @@
package android.app.timezone;
-import static junit.framework.Assert.fail;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
index 4004086354ca..df9ddea53c91 100644
--- a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
+++ b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
@@ -25,7 +25,8 @@ import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
diff --git a/core/tests/coretests/src/android/app/usage/EventListTest.java b/core/tests/coretests/src/android/app/usage/EventListTest.java
index 9dc0d4309a8f..685fcae46553 100644
--- a/core/tests/coretests/src/android/app/usage/EventListTest.java
+++ b/core/tests/coretests/src/android/app/usage/EventListTest.java
@@ -20,10 +20,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
index 28aaf1e05644..1633e1ac50a0 100644
--- a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
+++ b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
@@ -21,6 +21,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_PAUSED;
import static android.app.usage.UsageEvents.Event.ACTIVITY_RESUMED;
import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED;
import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE;
+import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageEvents.Event.END_OF_DAY;
import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK;
import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START;
@@ -33,8 +34,9 @@ import static org.junit.Assert.fail;
import android.app.usage.UsageEvents.Event;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -528,6 +530,11 @@ public class UsageStatsTest {
}
@Test
+ public void testEvent_DEVICE_SHUTDOWN() {
+ testClosingEvent(DEVICE_SHUTDOWN);
+ }
+
+ @Test
public void testEvent_FLUSH_TO_DISK() {
testClosingEvent(FLUSH_TO_DISK);
}
@@ -535,8 +542,9 @@ public class UsageStatsTest {
private void testClosingEvent(int eventType) {
// When these three closing events are received, all open activities/services need to be
// closed and usage stats are updated.
- if (eventType != FLUSH_TO_DISK) {
- fail("Closing eventType must be one of FLUSH_TO_DISK");
+ if (eventType != DEVICE_SHUTDOWN
+ && eventType != FLUSH_TO_DISK) {
+ fail("Closing eventType must be one of DEVICE_SHUTDOWN, FLUSH_TO_DISK");
}
left.mPackageName = "com.test";
diff --git a/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java b/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java
index 978ea7aa9c00..c307e648752d 100644
--- a/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java
+++ b/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java
@@ -16,7 +16,6 @@
package android.content;
-
import static org.junit.Assert.fail;
import android.app.ActivityManager;
@@ -30,9 +29,10 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/content/AssetTest.java b/core/tests/coretests/src/android/content/AssetTest.java
index b66574cee231..8e55e8a1a632 100644
--- a/core/tests/coretests/src/android/content/AssetTest.java
+++ b/core/tests/coretests/src/android/content/AssetTest.java
@@ -18,7 +18,8 @@ package android.content;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.io.IOException;
import java.io.InputStream;
diff --git a/core/tests/coretests/src/android/content/BrickDeniedTest.java b/core/tests/coretests/src/android/content/BrickDeniedTest.java
index 3d246b457ed5..d8c9baa8df5b 100644
--- a/core/tests/coretests/src/android/content/BrickDeniedTest.java
+++ b/core/tests/coretests/src/android/content/BrickDeniedTest.java
@@ -17,7 +17,8 @@
package android.content;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/** Test to make sure brick intents <b>don't</b> work without permission. */
public class BrickDeniedTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/content/BroadcastReceiverTests.java b/core/tests/coretests/src/android/content/BroadcastReceiverTests.java
index 8deccb7ffa7f..1509ff960ece 100644
--- a/core/tests/coretests/src/android/content/BroadcastReceiverTests.java
+++ b/core/tests/coretests/src/android/content/BroadcastReceiverTests.java
@@ -18,9 +18,9 @@ package android.content;
import static org.junit.Assert.fail;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/content/ContentProviderOperationTest.java b/core/tests/coretests/src/android/content/ContentProviderOperationTest.java
index aea124b08658..b142761760c4 100644
--- a/core/tests/coretests/src/android/content/ContentProviderOperationTest.java
+++ b/core/tests/coretests/src/android/content/ContentProviderOperationTest.java
@@ -16,22 +16,23 @@
package android.content;
-import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.Parcel;
-import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
+
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
-import java.util.Set;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
@SmallTest
public class ContentProviderOperationTest extends TestCase {
diff --git a/core/tests/coretests/src/android/content/ContentProviderTest.java b/core/tests/coretests/src/android/content/ContentProviderTest.java
index 2142f27ff6d8..8895f9bdf23d 100644
--- a/core/tests/coretests/src/android/content/ContentProviderTest.java
+++ b/core/tests/coretests/src/android/content/ContentProviderTest.java
@@ -23,7 +23,8 @@ import static org.mockito.Mockito.withSettings;
import android.content.pm.ApplicationInfo;
import android.content.pm.ProviderInfo;
import android.net.Uri;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/content/ContentQueryMapTest.java b/core/tests/coretests/src/android/content/ContentQueryMapTest.java
index f47bfdbb28fc..710623488552 100644
--- a/core/tests/coretests/src/android/content/ContentQueryMapTest.java
+++ b/core/tests/coretests/src/android/content/ContentQueryMapTest.java
@@ -16,16 +16,14 @@
package android.content;
-import android.content.ContentQueryMap;
-import android.content.ContentResolver;
-import android.content.ContentValues;
import android.database.Cursor;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
import java.util.Observable;
import java.util.Observer;
diff --git a/core/tests/coretests/src/android/content/ContentResolverTest.java b/core/tests/coretests/src/android/content/ContentResolverTest.java
index 9940bf7dd692..f14f2896d8f5 100644
--- a/core/tests/coretests/src/android/content/ContentResolverTest.java
+++ b/core/tests/coretests/src/android/content/ContentResolverTest.java
@@ -31,10 +31,11 @@ import android.graphics.Paint;
import android.net.Uri;
import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Size;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/content/ContentValuesTest.java b/core/tests/coretests/src/android/content/ContentValuesTest.java
index 7b39939b2d0c..0ab79e730ea1 100644
--- a/core/tests/coretests/src/android/content/ContentValuesTest.java
+++ b/core/tests/coretests/src/android/content/ContentValuesTest.java
@@ -17,8 +17,8 @@
package android.content;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
/*
runtest -c android.content.ContentValuesTest frameworks-core
@@ -29,7 +29,7 @@ import android.test.suitebuilder.annotation.SmallTest;
adb shell pm uninstall -k com.android.frameworks.coretests && \
adb install out/target/product/bullhead/testcases/FrameworksCoreTests/FrameworksCoreTests.apk && \
adb shell am instrument -w -e package android.content \
- com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*/
public class ContentValuesTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java
index c8a3098690be..2f442c34f2c1 100644
--- a/core/tests/coretests/src/android/content/ContextTest.java
+++ b/core/tests/coretests/src/android/content/ContextTest.java
@@ -19,11 +19,12 @@ package android.content;
import static org.junit.Assert.assertEquals;
import android.app.ActivityThread;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java b/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java
index 4362ec3a0ed6..22b23148cbcf 100644
--- a/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java
+++ b/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java
@@ -19,7 +19,8 @@ package android.content;
import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
/**
* To run the tests, use
@@ -32,7 +33,7 @@ import android.support.test.filters.LargeTest;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class android.content.ManagedUserContentResolverTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*/
@LargeTest
public class ManagedUserContentResolverTest extends AbstractCrossUserContentResolverTest {
diff --git a/core/tests/coretests/src/android/content/MemoryFileProviderTest.java b/core/tests/coretests/src/android/content/MemoryFileProviderTest.java
index bbe7c1008299..7cd486222101 100644
--- a/core/tests/coretests/src/android/content/MemoryFileProviderTest.java
+++ b/core/tests/coretests/src/android/content/MemoryFileProviderTest.java
@@ -18,9 +18,10 @@ package android.content;
import android.net.Uri;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
import java.io.InputStream;
import java.util.Arrays;
diff --git a/core/tests/coretests/src/android/content/RestrictionsManagerTest.java b/core/tests/coretests/src/android/content/RestrictionsManagerTest.java
index 10d74f7d2945..fd5de3217389 100644
--- a/core/tests/coretests/src/android/content/RestrictionsManagerTest.java
+++ b/core/tests/coretests/src/android/content/RestrictionsManagerTest.java
@@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License
*/
+
package android.content;
import android.os.Bundle;
import android.os.Parcelable;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
+import androidx.test.filters.LargeTest;
+
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
diff --git a/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java b/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java
index f8b13f032652..dbe027800e3f 100644
--- a/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java
+++ b/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java
@@ -18,7 +18,8 @@ package android.content;
import android.content.pm.UserInfo;
import android.os.RemoteException;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
/**
* To run the tests, use
@@ -31,7 +32,7 @@ import android.support.test.filters.LargeTest;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class android.content.SecondaryUserContentResolverTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*/
@LargeTest
public class SecondaryUserContentResolverTest extends AbstractCrossUserContentResolverTest {
diff --git a/core/tests/coretests/src/android/content/UriMatcherTest.java b/core/tests/coretests/src/android/content/UriMatcherTest.java
index f3b9e76f3bcb..6cef46b0731a 100644
--- a/core/tests/coretests/src/android/content/UriMatcherTest.java
+++ b/core/tests/coretests/src/android/content/UriMatcherTest.java
@@ -17,14 +17,14 @@
package android.content;
import android.net.Uri;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
import java.lang.reflect.Field;
import java.util.ArrayList;
-
public class UriMatcherTest extends TestCase {
static final int ROOT = 0;
diff --git a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java
index 2acb08da4ef0..9b360db023d0 100644
--- a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java
+++ b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
@@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_HIDL_BASE;
import static android.content.pm.SharedLibraryNames.ANDROID_HIDL_MANAGER;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java
index dce22ce6a6f2..0ed76dcf7c5d 100644
--- a/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java
+++ b/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java
@@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
import static android.content.pm.SharedLibraryNames.ANDROID_TEST_BASE;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java
index 866de93c07fe..7f817d66caf7 100644
--- a/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java
+++ b/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
@@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_TEST_MOCK;
import static android.content.pm.SharedLibraryNames.ANDROID_TEST_RUNNER;
import android.content.pm.PackageBackwardCompatibility.AndroidTestRunnerSplitUpdater;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/ComponentTest.java b/core/tests/coretests/src/android/content/pm/ComponentTest.java
index cc7564165bba..f31f0b5ee1b4 100644
--- a/core/tests/coretests/src/android/content/pm/ComponentTest.java
+++ b/core/tests/coretests/src/android/content/pm/ComponentTest.java
@@ -21,7 +21,14 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.GET_DISABLED_COMPONENTS;
-import android.test.suitebuilder.annotation.Suppress;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.test.AndroidTestCase;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+
import com.android.frameworks.coretests.enabled_app.DisabledActivity;
import com.android.frameworks.coretests.enabled_app.DisabledProvider;
import com.android.frameworks.coretests.enabled_app.DisabledReceiver;
@@ -31,12 +38,6 @@ import com.android.frameworks.coretests.enabled_app.EnabledProvider;
import com.android.frameworks.coretests.enabled_app.EnabledReceiver;
import com.android.frameworks.coretests.enabled_app.EnabledService;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
import java.util.List;
/**
diff --git a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
index 1f762fdc49f4..1c703ab0b98f 100644
--- a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
+++ b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
@@ -17,7 +17,8 @@
package android.content.pm;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
diff --git a/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java b/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java
index 659f9ea77956..1ddd753de80e 100644
--- a/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java
+++ b/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java
@@ -16,9 +16,12 @@
package android.content.pm;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
+import androidx.test.filters.LargeTest;
+
+import libcore.io.Streams;
+
import java.io.ByteArrayInputStream;
import java.util.Arrays;
@@ -26,8 +29,6 @@ import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
-import libcore.io.Streams;
-
@LargeTest
public class MacAuthenticatedInputStreamTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java b/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java
index 91697c0d74f3..05db8ee29844 100644
--- a/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java
+++ b/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import org.junit.Assume;
diff --git a/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java b/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java
index dcd2707a9540..834a0bbeab89 100644
--- a/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java
+++ b/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java
@@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
index c64d5202e1fd..3d7aab001227 100644
--- a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
@@ -24,7 +24,8 @@ import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY;
import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Assume;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/content/pm/PackageBuilder.java b/core/tests/coretests/src/android/content/pm/PackageBuilder.java
index 4ceed834aab7..c5db9622b60d 100644
--- a/core/tests/coretests/src/android/content/pm/PackageBuilder.java
+++ b/core/tests/coretests/src/android/content/pm/PackageBuilder.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static org.junit.Assert.assertEquals;
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 8ac9451deaf6..0ab536779296 100644
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -54,11 +54,12 @@ import android.system.ErrnoException;
import android.system.Os;
import android.system.StructStat;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+
import com.android.frameworks.coretests.R;
import com.android.internal.content.PackageHelper;
diff --git a/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java b/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java
index 00be82219e4f..e852f989a17f 100644
--- a/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java
@@ -22,8 +22,9 @@ import android.content.pm.PackageParserCacheHelper.ReadHelper;
import android.content.pm.PackageParserCacheHelper.WriteHelper;
import android.os.Bundle;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
index 267267ed4777..c5454a649e73 100644
--- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
@@ -29,9 +29,10 @@ import android.os.Build;
import android.os.Bundle;
import android.os.FileUtils;
import android.os.SystemProperties;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
@@ -51,6 +52,12 @@ public class PackageParserTest {
private static final String PRE_RELEASE = "B";
private static final String NEWER_PRE_RELEASE = "C";
+ // Codenames with a fingerprint attached to them. These may only be present in the apps
+ // declared min SDK and not as platform codenames.
+ private static final String OLDER_PRE_RELEASE_WITH_FINGERPRINT = "A.fingerprint";
+ private static final String PRE_RELEASE_WITH_FINGERPRINT = "B.fingerprint";
+ private static final String NEWER_PRE_RELEASE_WITH_FINGERPRINT = "C.fingerprint";
+
private static final String[] CODENAMES_RELEASED = { /* empty */ };
private static final String[] CODENAMES_PRE_RELEASE = { PRE_RELEASE };
@@ -68,7 +75,7 @@ public class PackageParserTest {
isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE,
outError);
- assertEquals(result, expectedMinSdk);
+ assertEquals("Error msg: " + outError[0], expectedMinSdk, result);
if (expectedMinSdk == -1) {
assertNotNull(outError[0]);
@@ -98,6 +105,7 @@ public class PackageParserTest {
// APP: Pre-release API 10
// DEV: Pre-release API 20
verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1);
+ verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1);
// Do allow same pre-release minSdkVersion on pre-release platform,
// but overwrite the specified version with CUR_DEVELOPMENT.
@@ -105,11 +113,15 @@ public class PackageParserTest {
// DEV: Pre-release API 20
verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false,
Build.VERSION_CODES.CUR_DEVELOPMENT);
+ verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false,
+ Build.VERSION_CODES.CUR_DEVELOPMENT);
+
// Don't allow newer pre-release minSdkVersion on pre-release platform.
// APP: Pre-release API 30
// DEV: Pre-release API 20
verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1);
+ verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, -1);
}
@Test
@@ -133,16 +145,20 @@ public class PackageParserTest {
// APP: Pre-release API 10
// DEV: Released API 20
verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1);
+ verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, true, -1);
// Don't allow same pre-release minSdkVersion on released platform.
// APP: Pre-release API 20
// DEV: Released API 20
verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1);
+ verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, true, -1);
+
// Don't allow newer pre-release minSdkVersion on released platform.
// APP: Pre-release API 30
// DEV: Released API 20
verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1);
+ verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1);
}
private void verifyComputeTargetSdkVersion(int targetSdkVersion, String targetSdkCodename,
@@ -189,6 +205,9 @@ public class PackageParserTest {
// DEV: Pre-release API 20
verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1,
false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1,
+ false /* forceCurrentDev */);
+
// Do allow same pre-release targetSdkVersion on pre-release platform,
// but overwrite the specified version with CUR_DEVELOPMENT.
@@ -196,18 +215,26 @@ public class PackageParserTest {
// DEV: Pre-release API 20
verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false,
Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false,
+ Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */);
+
// Don't allow newer pre-release targetSdkVersion on pre-release platform.
// APP: Pre-release API 30
// DEV: Pre-release API 20
verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1,
false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, -1,
+ false /* forceCurrentDev */);
+
// Force newer pre-release targetSdkVersion to current pre-release platform.
// APP: Pre-release API 30
// DEV: Pre-release API 20
verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false,
Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false,
+ Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */);
}
@Test
@@ -235,18 +262,25 @@ public class PackageParserTest {
// DEV: Released API 20
verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1,
false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, true, -1,
+ false /* forceCurrentDev */);
// Don't allow same pre-release targetSdkVersion on released platform.
// APP: Pre-release API 20
// DEV: Released API 20
verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1,
false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, true, -1,
+ false /* forceCurrentDev */);
+
// Don't allow newer pre-release targetSdkVersion on released platform.
// APP: Pre-release API 30
// DEV: Released API 20
verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1,
false /* forceCurrentDev */);
+ verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1,
+ false /* forceCurrentDev */);
}
/**
@@ -296,6 +330,28 @@ public class PackageParserTest {
}
/**
+ * Copies a specified {@code resourceId} to a file. Returns a non-null file if the copy
+ * succeeded, or {@code null} otherwise.
+ */
+ File copyRawResourceToFile(String baseName, int resourceId) throws Exception {
+ // Copy the resource to a file.
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ InputStream is = context.getResources().openRawResource(resourceId);
+ File outFile = null;
+ try {
+ outFile = new File(context.getFilesDir(), baseName);
+ assertTrue(FileUtils.copyToFile(is, outFile));
+ return outFile;
+ } catch (Exception e) {
+ if (outFile != null) {
+ outFile.delete();
+ }
+
+ return null;
+ }
+ }
+
+ /**
* Attempts to parse a package.
*
* APKs are put into coretests/apks/packageparser_*.
@@ -306,14 +362,14 @@ public class PackageParserTest {
Package parsePackage(String apkFileName, int apkResourceId,
Function<Package, Package> converter) throws Exception {
// Copy the resource to a file.
- Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
- File outFile = new File(context.getFilesDir(), apkFileName);
+ File outFile = null;
try {
- InputStream is = context.getResources().openRawResource(apkResourceId);
- assertTrue(FileUtils.copyToFile(is, outFile));
+ outFile = copyRawResourceToFile(apkFileName, apkResourceId);
return converter.apply(new PackageParser().parsePackage(outFile, 0 /* flags */));
} finally {
- outFile.delete();
+ if (outFile != null) {
+ outFile.delete();
+ }
}
}
@@ -464,4 +520,20 @@ public class PackageParserTest {
"android.permission.READ_CONTACTS"),
secondChild.requestedPermissions);
}
+
+ @Test
+ public void testApexPackageInfoGeneration() throws Exception {
+ File apexFile = copyRawResourceToFile("com.android.tzdata.apex",
+ R.raw.com_android_tzdata);
+ PackageInfo pi = PackageParser.generatePackageInfoFromApex(apexFile, false);
+ assertEquals("com.google.android.tzdata", pi.packageName);
+ assertEquals(1, pi.getLongVersionCode());
+ assertNull(pi.signingInfo);
+
+ pi = PackageParser.generatePackageInfoFromApex(apexFile, true);
+ assertEquals("com.google.android.tzdata", pi.packageName);
+ assertEquals(1, pi.getLongVersionCode());
+ assertNotNull(pi.signingInfo);
+ assertTrue(pi.signingInfo.getApkContentsSigners().length > 0);
+ }
}
diff --git a/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java b/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java
index d5d3d7a6f2f4..71a0e5e51b71 100644
--- a/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import java.util.function.Supplier;
diff --git a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java
index 952bb5530c15..8874525ebc77 100644
--- a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java
+++ b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java
@@ -1,8 +1,25 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.content.pm;
import android.os.Parcel;
import android.os.Parcelable;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
index d3d1f22af3cb..365e97ded928 100644
--- a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
@@ -21,11 +21,12 @@ import android.os.FileUtils;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
import android.util.AttributeSet;
import android.util.SparseArray;
+import androidx.test.filters.LargeTest;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
diff --git a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java
index 3dba4406de47..216b0c8950b7 100644
--- a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java
+++ b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
@@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_TEST_BASE;
import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java
index 15b27d71f81d..fc60980bb796 100644
--- a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java
+++ b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.pm;
import static android.content.pm.PackageBuilder.builder;
@@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY;
import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryOrgApacheHttpLegacyLibrary;
import android.os.Build;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/content/pm/SignatureTest.java b/core/tests/coretests/src/android/content/pm/SignatureTest.java
index a3fa1a9c06cf..f0b4af6fc44f 100644
--- a/core/tests/coretests/src/android/content/pm/SignatureTest.java
+++ b/core/tests/coretests/src/android/content/pm/SignatureTest.java
@@ -16,7 +16,7 @@
package android.content.pm;
-import android.support.test.filters.LargeTest;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java b/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java
index 68942cbd54ad..f6527da0ba1a 100644
--- a/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java
+++ b/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java
@@ -16,12 +16,12 @@
package android.content.pm;
-import android.content.pm.VerificationParams;
import android.net.Uri;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
+import androidx.test.filters.LargeTest;
+
/**
* Tests the android.content.pm.VerificationParams class
*
diff --git a/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java
index 88d7a59a98e2..e7cd02d866d5 100644
--- a/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java
+++ b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java
@@ -17,7 +17,8 @@
package android.content.pm;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import java.util.Random;
diff --git a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java
index e248a7771cab..1ca879cde6c8 100644
--- a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java
+++ b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java
@@ -29,12 +29,21 @@ import android.content.pm.PackageParser.Package;
import android.content.pm.PackageParser.PackageLite;
import android.content.pm.PackageParser.PackageParserException;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
+import libcore.testing.io.TestIoUtils;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -45,14 +54,6 @@ import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
-import libcore.testing.io.TestIoUtils;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DexMetadataHelperTest {
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
index 47554a68645a..47b14bbaa8fa 100644
--- a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
+++ b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
@@ -17,9 +17,10 @@
package android.content.res;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.TypedValue;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import java.lang.reflect.InvocationTargetException;
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationTest.java b/core/tests/coretests/src/android/content/res/ConfigurationTest.java
index 72b9197089d7..2fc3e36e7948 100644
--- a/core/tests/coretests/src/android/content/res/ConfigurationTest.java
+++ b/core/tests/coretests/src/android/content/res/ConfigurationTest.java
@@ -13,19 +13,18 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
-package android.content.res;
-import org.junit.runner.RunWith;
-import org.junit.Test;
-import org.junit.runners.JUnit4;
+package android.content.res;
-import android.content.res.Configuration;
-import android.support.test.filters.SmallTest;
import android.platform.test.annotations.Presubmit;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
/**
* Build/install/run: bit FrameworksCoreTests:android.content.res.ConfigurationTest
diff --git a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
index 42ff2e94a24e..7ab9d7f4ffe1 100644
--- a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
+++ b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.content.res;
import static android.content.res.FontResourcesParser.FamilyResourceEntry;
@@ -26,9 +27,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import android.app.Instrumentation;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
new file mode 100644
index 000000000000..c4df88b49935
--- /dev/null
+++ b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.res;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.graphics.drawable.ColorStateListDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.frameworks.coretests.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ResourcesDrawableTest {
+
+ @Test
+ public void testLoadColorAsDrawable() {
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
+ Drawable drawable = resources.getDrawable(R.color.color1);
+ assertTrue(drawable instanceof ColorStateListDrawable);
+ }
+
+ @Test
+ public void testLoadColorAsDrawableFailureThrowsOriginalException() throws Throwable {
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
+
+ Exception exception = null;
+
+ try {
+ resources.getDrawable(R.color.drawable_in_color_dir_invalid);
+ } catch (Exception e) {
+ exception = e;
+ }
+
+ assertNotNull(
+ "Loading drawable_in_color_dir_invalid should throw an exception",
+ exception
+ );
+
+ assertEquals(
+ "Can't find ColorStateList from drawable resource ID #0x"
+ + Integer.toHexString(R.color.drawable_in_color_dir_invalid),
+ exception.getCause().getCause().getMessage()
+ );
+ }
+
+ @Test
+ public void testLoadNormalDrawableInColorDir() {
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
+ Drawable drawable = resources.getDrawable(R.color.drawable_in_color_dir_valid);
+ assertTrue(drawable instanceof LayerDrawable);
+ }
+}
diff --git a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
index e85666eb1639..aa1a5341de57 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
@@ -13,14 +13,15 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package android.content.res;
import android.os.FileUtils;
import android.os.LocaleList;
-import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;
import android.util.DisplayMetrics;
-import android.view.Display;
+
+import androidx.test.filters.SmallTest;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index b2ff9278d83b..a2dab996a8d7 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -13,18 +13,20 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package android.content.res;
import android.annotation.NonNull;
import android.app.ResourcesManager;
import android.os.Binder;
import android.os.LocaleList;
-import android.support.test.filters.SmallTest;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.DisplayAdjustments;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
public class ResourcesManagerTest extends TestCase {
diff --git a/core/tests/coretests/src/android/database/CursorWindowTest.java b/core/tests/coretests/src/android/database/CursorWindowTest.java
index 075f5b7f1d6a..123da3e8703b 100644
--- a/core/tests/coretests/src/android/database/CursorWindowTest.java
+++ b/core/tests/coretests/src/android/database/CursorWindowTest.java
@@ -16,14 +16,14 @@
package android.database;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.database.CursorWindow;
import android.test.PerformanceTestCase;
-import java.util.Arrays;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
+import java.util.Arrays;
+
public class CursorWindowTest extends TestCase implements PerformanceTestCase {
public boolean isPerformanceOnly() {
return false;
diff --git a/core/tests/coretests/src/android/database/DatabaseCursorTest.java b/core/tests/coretests/src/android/database/DatabaseCursorTest.java
index 3507223b68ab..eb4fd70a1136 100644
--- a/core/tests/coretests/src/android/database/DatabaseCursorTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseCursorTest.java
@@ -18,10 +18,6 @@ package android.database;
import android.content.ContentValues;
import android.content.Context;
-import android.database.Cursor;
-import android.database.CursorIndexOutOfBoundsException;
-import android.database.DataSetObserver;
-import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteCursorDriver;
import android.database.sqlite.SQLiteDatabase;
@@ -29,11 +25,12 @@ import android.database.sqlite.SQLiteQuery;
import android.os.Looper;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index 9d75c784fe41..49fb75bf6a45 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -25,16 +25,17 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDebug;
import android.database.sqlite.SQLiteException;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
import android.util.Pair;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+
import junit.framework.Assert;
import java.io.File;
diff --git a/core/tests/coretests/src/android/database/DatabaseLocaleTest.java b/core/tests/coretests/src/android/database/DatabaseLocaleTest.java
index b32829412cb5..ee7936fb8857 100644
--- a/core/tests/coretests/src/android/database/DatabaseLocaleTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseLocaleTest.java
@@ -17,17 +17,17 @@
package android.database;
import android.database.sqlite.SQLiteDatabase;
-import android.database.Cursor;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
import android.test.MoreAsserts;
+import android.util.Log;
-import java.util.ArrayList;
-import java.util.Locale;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
+import java.util.ArrayList;
+import java.util.Locale;
+
public class DatabaseLocaleTest extends TestCase {
private SQLiteDatabase mDatabase;
diff --git a/core/tests/coretests/src/android/database/DatabaseLockTest.java b/core/tests/coretests/src/android/database/DatabaseLockTest.java
index 8d3cf5a13124..e8936c98392e 100644
--- a/core/tests/coretests/src/android/database/DatabaseLockTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseLockTest.java
@@ -17,11 +17,13 @@
package android.database;
import android.database.sqlite.SQLiteDatabase;
-import android.test.suitebuilder.annotation.Suppress;
+import android.test.AndroidTestCase;
import android.util.Log;
+
+import androidx.test.filters.Suppress;
+
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
-import android.test.AndroidTestCase;
/*
* This is a series of unit tests for database locks.
diff --git a/core/tests/coretests/src/android/database/DatabaseStatementTest.java b/core/tests/coretests/src/android/database/DatabaseStatementTest.java
index 895d715c8cc0..4b34650183e3 100644
--- a/core/tests/coretests/src/android/database/DatabaseStatementTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseStatementTest.java
@@ -17,14 +17,14 @@
package android.database;
import android.content.Context;
-import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDoneException;
import android.database.sqlite.SQLiteStatement;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
import java.io.File;
diff --git a/core/tests/coretests/src/android/database/DatabaseStressTest.java b/core/tests/coretests/src/android/database/DatabaseStressTest.java
index 30e46e7dfb90..bfea1fc61eb7 100644
--- a/core/tests/coretests/src/android/database/DatabaseStressTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseStressTest.java
@@ -17,11 +17,11 @@
package android.database;
import android.content.Context;
-import android.database.sqlite.*;
+import android.database.sqlite.SQLiteDatabase;
+import android.test.AndroidTestCase;
import android.util.Log;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.Suppress;
+import androidx.test.filters.Suppress;
import java.io.File;
diff --git a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
index 7c206d7eecf7..be156c8eb67a 100644
--- a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
@@ -20,7 +20,7 @@ import static android.database.DatabaseUtils.bindSelection;
import static org.junit.Assert.assertEquals;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/database/RedactingCursorTest.java b/core/tests/coretests/src/android/database/RedactingCursorTest.java
index 93998f3db05f..e2d2bae0e8b2 100644
--- a/core/tests/coretests/src/android/database/RedactingCursorTest.java
+++ b/core/tests/coretests/src/android/database/RedactingCursorTest.java
@@ -22,8 +22,9 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.net.Uri;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java
index 9ed3f11b548f..730a3cb45856 100644
--- a/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java
+++ b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java
@@ -26,11 +26,12 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabaseConfiguration;
import android.database.sqlite.SQLiteDebug;
import android.database.sqlite.SQLiteOpenHelper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/database/run_newdb_perf_test.sh b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh
index c5b2c97b572f..95f1f83bea10 100755
--- a/core/tests/coretests/src/android/database/run_newdb_perf_test.sh
+++ b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh
@@ -23,7 +23,7 @@ echo "Running benchmark $RUN_N times"
for (( i=0; i<$RUN_N; i++ ))
do
- adb shell am instrument -e class 'android.database.NewDatabasePerformanceTestSuite' -w 'com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner'
+ adb shell am instrument -e class 'android.database.NewDatabasePerformanceTestSuite' -w 'com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner'
done
adb logcat -d > /tmp/testlogcat.txt
diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java
index 551a58ed7cb5..5dbcb3c46b50 100644
--- a/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java
+++ b/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java
@@ -22,9 +22,10 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.database.DatabaseUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java
index ed14a5348ab4..f1d27d4a13ab 100644
--- a/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java
+++ b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java
@@ -21,11 +21,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.HandlerThread;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java
index c52cf6ec5e5f..78d3c417dcf8 100644
--- a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java
+++ b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java
@@ -23,7 +23,8 @@ import android.database.Cursor;
import android.database.CursorWindow;
import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import androidx.test.filters.LargeTest;
import java.io.File;
import java.util.Arrays;
diff --git a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
index e9e2a4d098f0..564460e18294 100644
--- a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
+++ b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
@@ -17,14 +17,14 @@
package android.graphics;
import android.os.ParcelFileDescriptor;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
-
public class BitmapFactoryTest extends TestCase {
// tests that we can decode bitmaps from MemoryFiles
diff --git a/core/tests/coretests/src/android/graphics/BitmapTest.java b/core/tests/coretests/src/android/graphics/BitmapTest.java
index 3666dddb0782..e79d2ae1e194 100644
--- a/core/tests/coretests/src/android/graphics/BitmapTest.java
+++ b/core/tests/coretests/src/android/graphics/BitmapTest.java
@@ -16,11 +16,10 @@
package android.graphics;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
-
public class BitmapTest extends TestCase {
@SmallTest
diff --git a/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java
index 6e38fb685887..8e9b38cc5a1f 100644
--- a/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java
+++ b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java
@@ -19,8 +19,8 @@ package android.graphics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/graphics/ColorStateListTest.java b/core/tests/coretests/src/android/graphics/ColorStateListTest.java
index 374d1421bdbc..1d34f9383818 100644
--- a/core/tests/coretests/src/android/graphics/ColorStateListTest.java
+++ b/core/tests/coretests/src/android/graphics/ColorStateListTest.java
@@ -19,7 +19,8 @@ package android.graphics;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/graphics/FontFileUtilTest.java b/core/tests/coretests/src/android/graphics/FontFileUtilTest.java
index 76267b23a0ca..1771671db26a 100644
--- a/core/tests/coretests/src/android/graphics/FontFileUtilTest.java
+++ b/core/tests/coretests/src/android/graphics/FontFileUtilTest.java
@@ -22,11 +22,12 @@ import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.fonts.FontFileUtil;
import android.graphics.fonts.FontVariationAxis;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.util.Log;
import android.util.Pair;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import org.junit.Test;
import java.io.File;
diff --git a/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java b/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java
index 164c1aa770bd..3cfeb2546940 100644
--- a/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java
+++ b/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java
@@ -20,7 +20,8 @@ import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.Suppress;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/graphics/PaintTest.java b/core/tests/coretests/src/android/graphics/PaintTest.java
index b5ed01f708b1..bf56df1c9441 100644
--- a/core/tests/coretests/src/android/graphics/PaintTest.java
+++ b/core/tests/coretests/src/android/graphics/PaintTest.java
@@ -18,9 +18,9 @@ package android.graphics;
import static org.junit.Assert.assertNotEquals;
-import android.graphics.Paint;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.util.Arrays;
import java.util.HashSet;
diff --git a/core/tests/coretests/src/android/graphics/PathOffsetTest.java b/core/tests/coretests/src/android/graphics/PathOffsetTest.java
index 950f8731bae1..6cc42f6a3efc 100644
--- a/core/tests/coretests/src/android/graphics/PathOffsetTest.java
+++ b/core/tests/coretests/src/android/graphics/PathOffsetTest.java
@@ -16,13 +16,13 @@
package android.graphics;
+import static org.junit.Assert.assertTrue;
import android.graphics.Bitmap.Config;
import android.graphics.Path.Direction;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/graphics/PathTest.java b/core/tests/coretests/src/android/graphics/PathTest.java
index 78e4959da92a..c6d6d1ff90d5 100644
--- a/core/tests/coretests/src/android/graphics/PathTest.java
+++ b/core/tests/coretests/src/android/graphics/PathTest.java
@@ -16,11 +16,10 @@
package android.graphics;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
-
public class PathTest extends TestCase {
@SmallTest
diff --git a/core/tests/coretests/src/android/graphics/RectTest.java b/core/tests/coretests/src/android/graphics/RectTest.java
index d31d7d54940c..2918f44ad65d 100644
--- a/core/tests/coretests/src/android/graphics/RectTest.java
+++ b/core/tests/coretests/src/android/graphics/RectTest.java
@@ -23,8 +23,9 @@ import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java b/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java
index 909a8d97df51..e1ca7dfb7cc2 100644
--- a/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java
+++ b/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java
@@ -16,7 +16,7 @@
package android.graphics;
-import android.test.suitebuilder.annotation.LargeTest;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
index 6fdb71fcbab0..c66bac6cc335 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
@@ -27,12 +27,13 @@ import android.graphics.fonts.Font;
import android.graphics.fonts.FontCustomizationParser;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.FontConfig;
import android.util.ArrayMap;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/graphics/TypefaceTest.java b/core/tests/coretests/src/android/graphics/TypefaceTest.java
index b0c7976f8014..2d16f826b243 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceTest.java
@@ -22,13 +22,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
-import android.graphics.Paint;
-import android.graphics.Typeface;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java b/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java
index 781e343e8139..3dc998709b8f 100644
--- a/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java
+++ b/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.graphics.drawable;
import android.content.res.Resources;
@@ -11,11 +27,12 @@ import android.graphics.Path.Direction;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
import android.util.Log;
import android.util.PathParser;
+import androidx.test.filters.LargeTest;
+
import org.junit.Test;
import java.io.File;
diff --git a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
index 655efb5239eb..d0a6ff9251cc 100644
--- a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
+++ b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
@@ -24,8 +24,9 @@ import android.graphics.ColorFilter;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Xfermode;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/graphics/drawable/IconTest.java b/core/tests/coretests/src/android/graphics/drawable/IconTest.java
index 64fadc03f0bb..2bdcc284154b 100644
--- a/core/tests/coretests/src/android/graphics/drawable/IconTest.java
+++ b/core/tests/coretests/src/android/graphics/drawable/IconTest.java
@@ -25,9 +25,10 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Parcel;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import java.io.ByteArrayOutputStream;
diff --git a/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java b/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java
index f90ae340b2e9..0a25bd7e3f2c 100644
--- a/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java
+++ b/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java
@@ -23,8 +23,9 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
index dcc51e121b32..823fca5a68ad 100644
--- a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
+++ b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
@@ -22,10 +22,11 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java b/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java
index f30b1a29c781..daf613976358 100644
--- a/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java
+++ b/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java
@@ -22,15 +22,12 @@ import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -40,6 +37,8 @@ import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.ImageView;
+import androidx.test.filters.LargeTest;
+
import java.nio.ByteBuffer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
diff --git a/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java b/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java
new file mode 100644
index 000000000000..16be0b0a27c1
--- /dev/null
+++ b/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.hdmi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.support.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@SmallTest
+@RunWith(JUnit4.class)
+/** Tests for {@link HdmiUtils} class. */
+public class HdmiUtilsTest {
+
+ @Test
+ public void pathToPort_isMe() {
+ int targetPhysicalAddress = 0x1000;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_SAME_PHYSICAL_ADDRESS);
+ }
+
+ @Test
+ public void pathToPort_isDirectlyBelow() {
+ int targetPhysicalAddress = 0x1100;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1);
+ }
+
+ @Test
+ public void pathToPort_isBelow() {
+ int targetPhysicalAddress = 0x1110;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1);
+ }
+
+ @Test
+ public void pathToPort_neitherMeNorBelow() {
+ int targetPhysicalAddress = 0x3000;
+ int myPhysicalAddress = 0x2000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2200;
+ myPhysicalAddress = 0x3300;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2213;
+ myPhysicalAddress = 0x2212;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2340;
+ myPhysicalAddress = 0x2310;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+ }
+}
diff --git a/core/tests/coretests/src/android/metrics/LogMakerTest.java b/core/tests/coretests/src/android/metrics/LogMakerTest.java
index 3be776deb9f1..aabfc2872269 100644
--- a/core/tests/coretests/src/android/metrics/LogMakerTest.java
+++ b/core/tests/coretests/src/android/metrics/LogMakerTest.java
@@ -13,9 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.metrics;
-import android.support.test.filters.LargeTest;
+import androidx.test.filters.LargeTest;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
diff --git a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
index 784a12fa1f57..96dac648c01e 100644
--- a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
+++ b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
@@ -13,10 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.metrics;
import android.metrics.MetricsReader.Event;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
diff --git a/core/tests/coretests/src/android/net/LocalSocketTest.java b/core/tests/coretests/src/android/net/LocalSocketTest.java
index 1286b137cc1f..91722377df09 100644
--- a/core/tests/coretests/src/android/net/LocalSocketTest.java
+++ b/core/tests/coretests/src/android/net/LocalSocketTest.java
@@ -16,12 +16,9 @@
package android.net;
-import android.net.Credentials;
-import android.net.LocalServerSocket;
-import android.net.LocalSocket;
-import android.net.LocalSocketAddress;
import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/net/NetworkKeyTest.java b/core/tests/coretests/src/android/net/NetworkKeyTest.java
index fff23a04db9f..0f1c71d7c601 100644
--- a/core/tests/coretests/src/android/net/NetworkKeyTest.java
+++ b/core/tests/coretests/src/android/net/NetworkKeyTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.net;
import static org.junit.Assert.assertEquals;
@@ -7,7 +23,8 @@ import static org.mockito.Mockito.when;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiSsid;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
index c6758ce1950d..29e212f4839e 100644
--- a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
+++ b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.net;
import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
diff --git a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
index ff9816ad090c..3e45a79951d3 100644
--- a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
+++ b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.net;
import static junit.framework.Assert.assertFalse;
@@ -9,7 +25,8 @@ import static org.mockito.Matchers.eq;
import android.Manifest.permission;
import android.content.Context;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java
index 5cbf02a79083..bc12e727c5f0 100644
--- a/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java
+++ b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java
@@ -19,7 +19,7 @@ package android.net;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
index 11d066b3afb0..eec09e65a501 100644
--- a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
+++ b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
@@ -19,10 +19,10 @@ package android.net;
import com.android.org.conscrypt.ClientSessionContext;
import com.android.org.conscrypt.SSLClientSessionCache;
-import org.mockito.Mockito;
-
import junit.framework.TestCase;
+import org.mockito.Mockito;
+
import java.security.KeyManagementException;
import java.security.SecureRandom;
diff --git a/core/tests/coretests/src/android/net/ScoredNetworkTest.java b/core/tests/coretests/src/android/net/ScoredNetworkTest.java
index 109f32e1a48e..d984d86e1147 100644
--- a/core/tests/coretests/src/android/net/ScoredNetworkTest.java
+++ b/core/tests/coretests/src/android/net/ScoredNetworkTest.java
@@ -16,11 +16,17 @@
package android.net;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import android.os.Bundle;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/net/SntpClientTest.java b/core/tests/coretests/src/android/net/SntpClientTest.java
index d72738c6e32c..87edb6e01425 100644
--- a/core/tests/coretests/src/android/net/SntpClientTest.java
+++ b/core/tests/coretests/src/android/net/SntpClientTest.java
@@ -20,9 +20,10 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.runner.AndroidJUnit4;
+
import libcore.util.HexEncoding;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java
index ea0347d67ad7..a33de7bb2d9d 100644
--- a/core/tests/coretests/src/android/net/UriTest.java
+++ b/core/tests/coretests/src/android/net/UriTest.java
@@ -18,7 +18,8 @@ package android.net;
import android.content.ContentUris;
import android.os.Parcel;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/net/WebAddressTest.java b/core/tests/coretests/src/android/net/WebAddressTest.java
index 6fcb97ea8b5f..70a62533d8e1 100644
--- a/core/tests/coretests/src/android/net/WebAddressTest.java
+++ b/core/tests/coretests/src/android/net/WebAddressTest.java
@@ -16,8 +16,8 @@
package android.net;
-import android.net.WebAddress;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
public class WebAddressTest extends TestCase {
diff --git a/core/tests/coretests/src/android/net/http/SslCertificateTest.java b/core/tests/coretests/src/android/net/http/SslCertificateTest.java
index 6a30c6c5afdf..1beb1de0075c 100644
--- a/core/tests/coretests/src/android/net/http/SslCertificateTest.java
+++ b/core/tests/coretests/src/android/net/http/SslCertificateTest.java
@@ -17,12 +17,13 @@
package android.net.http;
-import android.net.http.SslCertificate;
-import android.test.suitebuilder.annotation.LargeTest;
+import androidx.test.filters.LargeTest;
+
+import junit.framework.TestCase;
+
import java.io.ByteArrayInputStream;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
-import junit.framework.TestCase;
public class SslCertificateTest extends TestCase {
diff --git a/core/tests/coretests/src/android/os/AidlTest.java b/core/tests/coretests/src/android/os/AidlTest.java
index bf11d56de045..4c5141537c6a 100644
--- a/core/tests/coretests/src/android/os/AidlTest.java
+++ b/core/tests/coretests/src/android/os/AidlTest.java
@@ -16,11 +16,10 @@
package android.os;
-import android.os.IInterface;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+
import com.google.android.collect.Lists;
+
import junit.framework.TestCase;
import java.util.List;
diff --git a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
index 6cdb35abce5a..ce6ad87a310e 100644
--- a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
+++ b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-
package android.os;
import static org.junit.Assert.assertEquals;
@@ -25,12 +24,13 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.aidl.IBpcCallbackObserver;
import com.android.frameworks.coretests.aidl.IBpcTestAppCmdService;
import com.android.frameworks.coretests.aidl.IBpcTestServiceCmdService;
@@ -63,7 +63,7 @@ import java.util.function.Consumer;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class android.os.BinderProxyCountingTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*
* or
*
diff --git a/core/tests/coretests/src/android/os/BinderProxyTest.java b/core/tests/coretests/src/android/os/BinderProxyTest.java
index 4c36b5c359a2..aceda2d0524b 100644
--- a/core/tests/coretests/src/android/os/BinderProxyTest.java
+++ b/core/tests/coretests/src/android/os/BinderProxyTest.java
@@ -19,7 +19,8 @@ package android.os;
import android.annotation.Nullable;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
public class BinderProxyTest extends AndroidTestCase {
private static class CountingListener implements Binder.ProxyTransactListener {
diff --git a/core/tests/coretests/src/android/os/BinderTest.java b/core/tests/coretests/src/android/os/BinderTest.java
index 534c5cdec259..a354195c75a3 100644
--- a/core/tests/coretests/src/android/os/BinderTest.java
+++ b/core/tests/coretests/src/android/os/BinderTest.java
@@ -16,7 +16,7 @@
package android.os;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
@@ -43,4 +43,13 @@ public class BinderTest extends TestCase {
Binder.restoreCallingWorkSource(token);
assertEquals(UID, Binder.getCallingWorkSourceUid());
}
+
+ @SmallTest
+ public void testGetCallingUidOrThrow() throws Exception {
+ try {
+ Binder.getCallingUidOrThrow();
+ throw new AssertionError("IllegalStateException expected");
+ } catch (IllegalStateException expected) {
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/os/BinderThreadPriorityService.java b/core/tests/coretests/src/android/os/BinderThreadPriorityService.java
index 47a4483b8a29..ed42058d3ef4 100644
--- a/core/tests/coretests/src/android/os/BinderThreadPriorityService.java
+++ b/core/tests/coretests/src/android/os/BinderThreadPriorityService.java
@@ -18,7 +18,6 @@ package android.os;
import android.app.Service;
import android.content.Intent;
-import android.text.TextUtils;
import android.util.Log;
/**
diff --git a/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java b/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java
index 56e977c7d687..48c9df65da61 100644
--- a/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java
+++ b/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java
@@ -21,7 +21,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
import java.io.File;
diff --git a/core/tests/coretests/src/android/os/BinderWorkSourceTest.java b/core/tests/coretests/src/android/os/BinderWorkSourceTest.java
index 5664df6e9744..e16a3dbe4a26 100644
--- a/core/tests/coretests/src/android/os/BinderWorkSourceTest.java
+++ b/core/tests/coretests/src/android/os/BinderWorkSourceTest.java
@@ -24,9 +24,10 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/os/BrightnessLimit.java b/core/tests/coretests/src/android/os/BrightnessLimit.java
index fabcf3d920a9..5a3724f7aa24 100644
--- a/core/tests/coretests/src/android/os/BrightnessLimit.java
+++ b/core/tests/coretests/src/android/os/BrightnessLimit.java
@@ -18,7 +18,6 @@ package android.os;
import android.app.Activity;
import android.hardware.display.DisplayManager;
-import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.view.View.OnClickListener;
diff --git a/core/tests/coretests/src/android/os/BroadcasterTest.java b/core/tests/coretests/src/android/os/BroadcasterTest.java
index 551ea8d7d5d4..b4c47af93355 100644
--- a/core/tests/coretests/src/android/os/BroadcasterTest.java
+++ b/core/tests/coretests/src/android/os/BroadcasterTest.java
@@ -16,11 +16,8 @@
package android.os;
-import android.os.Broadcaster;
-import android.os.Handler;
-import android.os.Message;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.MediumTest;
+
import junit.framework.TestCase;
public class BroadcasterTest extends TestCase {
diff --git a/core/tests/coretests/src/android/os/BuildTest.java b/core/tests/coretests/src/android/os/BuildTest.java
index 37586279d980..decc76869a53 100644
--- a/core/tests/coretests/src/android/os/BuildTest.java
+++ b/core/tests/coretests/src/android/os/BuildTest.java
@@ -16,9 +16,8 @@
package android.os;
-import android.os.Build;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
+import androidx.test.filters.SmallTest;
+
import junit.framework.Assert;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/os/BundleTest.java b/core/tests/coretests/src/android/os/BundleTest.java
index 9fcf96d6f3ae..e4dc99347802 100644
--- a/core/tests/coretests/src/android/os/BundleTest.java
+++ b/core/tests/coretests/src/android/os/BundleTest.java
@@ -20,8 +20,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/os/EnvironmentTest.java b/core/tests/coretests/src/android/os/EnvironmentTest.java
index 5189df574a33..d98ceaf57dd9 100644
--- a/core/tests/coretests/src/android/os/EnvironmentTest.java
+++ b/core/tests/coretests/src/android/os/EnvironmentTest.java
@@ -25,8 +25,9 @@ import static android.os.Environment.classifyExternalStorageDirectory;
import static org.junit.Assert.assertEquals;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/os/FileObserverTest.java b/core/tests/coretests/src/android/os/FileObserverTest.java
index 93e27af44170..ece7645b7389 100644
--- a/core/tests/coretests/src/android/os/FileObserverTest.java
+++ b/core/tests/coretests/src/android/os/FileObserverTest.java
@@ -16,13 +16,14 @@
package android.os;
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+
+import com.google.android.collect.Lists;
+import com.google.android.collect.Maps;
+
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index 514ea0cc013e..5bce227cdf48 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -51,8 +51,9 @@ import static org.junit.Assert.fail;
import android.content.Context;
import android.os.FileUtils.MemoryPipe;
import android.provider.DocumentsContract.Document;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import libcore.io.Streams;
diff --git a/core/tests/coretests/src/android/os/HandlerTester.java b/core/tests/coretests/src/android/os/HandlerTester.java
index a216a0bf7169..fa442f474d6e 100644
--- a/core/tests/coretests/src/android/os/HandlerTester.java
+++ b/core/tests/coretests/src/android/os/HandlerTester.java
@@ -16,10 +16,6 @@
package android.os;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
public abstract class HandlerTester extends Thread {
public abstract void go();
public abstract void handleMessage(Message msg);
diff --git a/core/tests/coretests/src/android/os/HandlerThreadTest.java b/core/tests/coretests/src/android/os/HandlerThreadTest.java
index 9772aa427999..93cfc40d555e 100644
--- a/core/tests/coretests/src/android/os/HandlerThreadTest.java
+++ b/core/tests/coretests/src/android/os/HandlerThreadTest.java
@@ -16,13 +16,9 @@
package android.os;
+import androidx.test.filters.MediumTest;
+
import junit.framework.TestCase;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
-import android.os.Process;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
public class HandlerThreadTest extends TestCase {
private static final int TEST_WHAT = 1;
diff --git a/core/tests/coretests/src/android/os/IdleHandlerTest.java b/core/tests/coretests/src/android/os/IdleHandlerTest.java
index 6c0a862aa2ea..d8886c97838e 100644
--- a/core/tests/coretests/src/android/os/IdleHandlerTest.java
+++ b/core/tests/coretests/src/android/os/IdleHandlerTest.java
@@ -16,11 +16,10 @@
package android.os;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
import android.os.MessageQueue.IdleHandler;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
+
import junit.framework.TestCase;
public class IdleHandlerTest extends TestCase {
diff --git a/core/tests/coretests/src/android/os/LocaleListTest.java b/core/tests/coretests/src/android/os/LocaleListTest.java
index 17ef7730f452..1f00a7a12c54 100644
--- a/core/tests/coretests/src/android/os/LocaleListTest.java
+++ b/core/tests/coretests/src/android/os/LocaleListTest.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.os;
-import android.test.suitebuilder.annotation.SmallTest;
+package android.os;
-import java.util.Locale;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
+import java.util.Locale;
+
public class LocaleListTest extends TestCase {
@SmallTest
public void testConstructor() throws Exception {
diff --git a/core/tests/coretests/src/android/os/MemoryFileTest.java b/core/tests/coretests/src/android/os/MemoryFileTest.java
index 20b298d639d2..05c2995fa158 100644
--- a/core/tests/coretests/src/android/os/MemoryFileTest.java
+++ b/core/tests/coretests/src/android/os/MemoryFileTest.java
@@ -17,8 +17,9 @@
package android.os;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SmallTest;
import java.io.IOException;
import java.io.InputStream;
diff --git a/core/tests/coretests/src/android/os/MessageQueueTest.java b/core/tests/coretests/src/android/os/MessageQueueTest.java
index 1cd1020bfe3a..2c5588e6ed0d 100644
--- a/core/tests/coretests/src/android/os/MessageQueueTest.java
+++ b/core/tests/coretests/src/android/os/MessageQueueTest.java
@@ -16,11 +16,9 @@
package android.os;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
import junit.framework.TestCase;
@Suppress // Failing.
diff --git a/core/tests/coretests/src/android/os/MessengerService.java b/core/tests/coretests/src/android/os/MessengerService.java
index f15e13408084..db3347197d90 100644
--- a/core/tests/coretests/src/android/os/MessengerService.java
+++ b/core/tests/coretests/src/android/os/MessengerService.java
@@ -18,11 +18,6 @@ package android.os;
import android.app.Service;
import android.content.Intent;
-import android.os.RemoteException;
-import android.os.IBinder;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
public class MessengerService extends Service {
private final Handler mHandler = new Handler() {
diff --git a/core/tests/coretests/src/android/os/MessengerTest.java b/core/tests/coretests/src/android/os/MessengerTest.java
index 473ffe2298b3..9143ff1d1017 100644
--- a/core/tests/coretests/src/android/os/MessengerTest.java
+++ b/core/tests/coretests/src/android/os/MessengerTest.java
@@ -20,13 +20,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.os.RemoteException;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
public class MessengerTest extends AndroidTestCase {
private Messenger mServiceMessenger;
diff --git a/core/tests/coretests/src/android/os/OsTests.java b/core/tests/coretests/src/android/os/OsTests.java
index 2b841269e5ae..08fb945857e9 100644
--- a/core/tests/coretests/src/android/os/OsTests.java
+++ b/core/tests/coretests/src/android/os/OsTests.java
@@ -16,12 +16,8 @@
package android.os;
-import com.google.android.collect.Lists;
import junit.framework.TestSuite;
-import java.util.Enumeration;
-import java.util.List;
-
public class OsTests {
public static TestSuite suite() {
TestSuite suite = new TestSuite(OsTests.class.getName());
diff --git a/core/tests/coretests/src/android/os/ParcelNullabilityTest.java b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java
index 516dc0ab135c..a6b296d37f82 100644
--- a/core/tests/coretests/src/android/os/ParcelNullabilityTest.java
+++ b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java
@@ -20,10 +20,11 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/os/PatternMatcherTest.java b/core/tests/coretests/src/android/os/PatternMatcherTest.java
index 9645ccc11b76..82350cd5ffdf 100644
--- a/core/tests/coretests/src/android/os/PatternMatcherTest.java
+++ b/core/tests/coretests/src/android/os/PatternMatcherTest.java
@@ -1,9 +1,27 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.os;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
-import org.junit.runner.RunWith;
+
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
diff --git a/core/tests/coretests/src/android/os/PerformanceCollectorTest.java b/core/tests/coretests/src/android/os/PerformanceCollectorTest.java
index 7533c84673de..38ad90f11a23 100644
--- a/core/tests/coretests/src/android/os/PerformanceCollectorTest.java
+++ b/core/tests/coretests/src/android/os/PerformanceCollectorTest.java
@@ -17,15 +17,16 @@
package android.os;
import android.os.PerformanceCollector.PerformanceResultsWriter;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+
+import junit.framework.TestCase;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Random;
-import junit.framework.TestCase;
-
public class PerformanceCollectorTest extends TestCase {
private PerformanceCollector mPerfCollector;
diff --git a/core/tests/coretests/src/android/os/PowerManagerTest.java b/core/tests/coretests/src/android/os/PowerManagerTest.java
index a828f4418515..1b587dd92db0 100644
--- a/core/tests/coretests/src/android/os/PowerManagerTest.java
+++ b/core/tests/coretests/src/android/os/PowerManagerTest.java
@@ -21,10 +21,11 @@ import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
import org.junit.After;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/os/PowerManagerVrTest.java b/core/tests/coretests/src/android/os/PowerManagerVrTest.java
index e01e5fa4faee..5d2c65b0153c 100644
--- a/core/tests/coretests/src/android/os/PowerManagerVrTest.java
+++ b/core/tests/coretests/src/android/os/PowerManagerVrTest.java
@@ -19,16 +19,14 @@ package android.os;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.provider.Settings;
-import android.service.dreams.IDreamManager;
import android.service.dreams.DreamService;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
+import android.service.dreams.IDreamManager;
import android.test.ActivityInstrumentationTestCase2;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+
/**
* Tests dream aspects of PowerManager.
*/
diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java
index 1f5b7c829831..b749e715316a 100644
--- a/core/tests/coretests/src/android/os/ProcessTest.java
+++ b/core/tests/coretests/src/android/os/ProcessTest.java
@@ -17,14 +17,10 @@
package android.os;
-import android.os.Process;
-import android.os.UserHandle;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.MediumTest;
import junit.framework.TestCase;
-
public class ProcessTest extends TestCase {
@MediumTest
diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java
index 9e1523165925..d5163e193510 100644
--- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java
+++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java
@@ -24,10 +24,11 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.system.Os;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java b/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java
index 9e445541ad3a..8085993389bb 100644
--- a/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java
+++ b/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.os;
import android.app.ActivityManager;
@@ -20,10 +21,10 @@ import android.app.VrManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.os.Process;
import android.provider.Settings;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Tests ActivityManager#setPersistentVrThread and ActivityManager#setVrThread's
diff --git a/core/tests/coretests/src/android/os/TestHandlerThread.java b/core/tests/coretests/src/android/os/TestHandlerThread.java
index 7e84af363a86..8c0330b4bb45 100644
--- a/core/tests/coretests/src/android/os/TestHandlerThread.java
+++ b/core/tests/coretests/src/android/os/TestHandlerThread.java
@@ -16,11 +16,6 @@
package android.os;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.MessageQueue.IdleHandler;
-
abstract class TestHandlerThread {
private boolean mDone = false;
private boolean mSuccess = false;
diff --git a/core/tests/coretests/src/android/os/TestVrActivity.java b/core/tests/coretests/src/android/os/TestVrActivity.java
index 33ff1645b37b..75df7c22fe65 100644
--- a/core/tests/coretests/src/android/os/TestVrActivity.java
+++ b/core/tests/coretests/src/android/os/TestVrActivity.java
@@ -17,7 +17,6 @@
package android.os;
import android.app.Activity;
-import android.os.Bundle;
import android.service.vr.VrListenerService;
import java.util.concurrent.CountDownLatch;
diff --git a/core/tests/coretests/src/android/os/TraceTest.java b/core/tests/coretests/src/android/os/TraceTest.java
index 1541553f36f1..5cad549d39bf 100644
--- a/core/tests/coretests/src/android/os/TraceTest.java
+++ b/core/tests/coretests/src/android/os/TraceTest.java
@@ -16,13 +16,13 @@
package android.os;
-import android.os.Debug;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+
/**
* This class is used to test the native tracing support. Run this test
* while tracing on the emulator and then run traceview to view the trace.
diff --git a/core/tests/coretests/src/android/os/UserHandleTest.java b/core/tests/coretests/src/android/os/UserHandleTest.java
index af559fddd48a..4a1cdbfe3114 100644
--- a/core/tests/coretests/src/android/os/UserHandleTest.java
+++ b/core/tests/coretests/src/android/os/UserHandleTest.java
@@ -25,7 +25,7 @@ import static android.os.UserHandle.getUserId;
import static org.junit.Assert.assertEquals;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/os/VintfObjectTest.java b/core/tests/coretests/src/android/os/VintfObjectTest.java
index 44510c2379f5..af3660a6dab9 100644
--- a/core/tests/coretests/src/android/os/VintfObjectTest.java
+++ b/core/tests/coretests/src/android/os/VintfObjectTest.java
@@ -16,7 +16,6 @@
package android.os;
-import junit.framework.Assert;
import junit.framework.TestCase;
public class VintfObjectTest extends TestCase {
diff --git a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java
index 3ec297c27a2a..62f2ac28a601 100644
--- a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java
+++ b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java
@@ -19,7 +19,8 @@ package android.os.storage;
import android.os.ParcelFileDescriptor;
import android.os.ProxyFileDescriptorCallback;
import android.system.ErrnoException;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import androidx.test.filters.LargeTest;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/preference/ListPreferenceTest.java b/core/tests/coretests/src/android/preference/ListPreferenceTest.java
index 72f62f167989..51dbb64244fc 100644
--- a/core/tests/coretests/src/android/preference/ListPreferenceTest.java
+++ b/core/tests/coretests/src/android/preference/ListPreferenceTest.java
@@ -16,10 +16,10 @@
package android.preference;
-import android.preference.ListPreference;
-import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
+import androidx.test.filters.LargeTest;
+
@LargeTest
public class ListPreferenceTest extends AndroidTestCase {
public void testListPreferenceSummaryFromEntries() {
diff --git a/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java
index 654474cba699..0deb77e60a51 100644
--- a/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java
+++ b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java
@@ -16,20 +16,20 @@
package android.preference;
-
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
index 5d12f7e43558..94d85e63cc5f 100644
--- a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
+++ b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
@@ -41,9 +41,10 @@ import android.print.test.services.PrintServiceCallbacks;
import android.print.test.services.PrinterDiscoverySessionCallbacks;
import android.print.test.services.StubbablePrinterDiscoverySession;
import android.printservice.recommendation.IRecommendationsChangeListener;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
index 800b86418163..17e9654b651a 100644
--- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java
+++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
@@ -28,9 +28,10 @@ import android.content.ContentResolver;
import android.os.Bundle;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
index 1465d0a98394..02a9adf4fb4d 100644
--- a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
@@ -20,9 +20,10 @@ import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.net.Uri;
import android.provider.DocumentsContract.Path;
-import android.support.test.filters.SmallTest;
import android.test.ProviderTestCase2;
+import androidx.test.filters.SmallTest;
+
import java.util.Arrays;
/**
diff --git a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
index 29558696436d..7e02be85f01a 100644
--- a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
@@ -25,25 +25,25 @@ import static org.junit.Assert.assertSame;
import android.app.Instrumentation;
import android.content.Context;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.graphics.Typeface;
import android.os.Handler;
-import android.provider.FontsContract.Columns;
import android.provider.FontsContract.FontFamilyResult;
-import android.provider.FontsContract.FontInfo;
-import android.provider.FontsContract;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import java.util.ArrayList;
-import java.util.List;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.List;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class FontsContractE2ETest {
diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java
index d42d79e8fd82..c5d6f7fad3e8 100644
--- a/core/tests/coretests/src/android/provider/FontsContractTest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractTest.java
@@ -13,31 +13,33 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.provider;
+import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
+import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
+import static android.provider.FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
+import static android.provider.FontsContract.Columns.RESULT_CODE_OK;
+
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static android.provider.FontsContract.Columns.RESULT_CODE_OK;
-import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
-import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
-import static android.provider.FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
-
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ProviderInfo;
import android.content.pm.Signature;
import android.database.MatrixCursor;
import android.graphics.fonts.FontVariationAxis;
import android.provider.FontsContract.FontInfo;
-import android.support.test.filters.SmallTest;
import android.test.ProviderTestCase2;
import android.util.Base64;
+import androidx.test.filters.SmallTest;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
diff --git a/core/tests/coretests/src/android/provider/MockFontProvider.java b/core/tests/coretests/src/android/provider/MockFontProvider.java
index ad5b130ca90d..e527dec13baf 100644
--- a/core/tests/coretests/src/android/provider/MockFontProvider.java
+++ b/core/tests/coretests/src/android/provider/MockFontProvider.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.provider;
import static android.provider.FontsContract.Columns;
@@ -21,16 +22,13 @@ import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.MatrixCursor;
-import android.graphics.fonts.FontVariationAxis;
import android.net.Uri;
-import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
-import android.util.ArraySet;
-import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
import java.io.File;
import java.io.FileNotFoundException;
@@ -46,8 +44,6 @@ import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import com.android.internal.annotations.GuardedBy;
-
public class MockFontProvider extends ContentProvider {
final static String AUTHORITY = "android.provider.fonts.font";
diff --git a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
index 7458de5fd310..f84355f6755e 100644
--- a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
@@ -21,9 +21,9 @@ import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.test.ProviderTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
/**
* ProviderTestCase that performs unit tests of SearchRecentSuggestionsProvider.
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index ac57d20a438a..87ad3d1067b2 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -27,8 +27,9 @@ import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -114,6 +115,7 @@ public class SettingsBackupTest {
Settings.Global.ANOMALY_CONFIG_VERSION,
Settings.Global.APN_DB_UPDATE_CONTENT_URL,
Settings.Global.APN_DB_UPDATE_METADATA_URL,
+ Settings.Global.APPLY_RAMPING_RINGER,
Settings.Global.APP_BINDING_CONSTANTS,
Settings.Global.APP_IDLE_CONSTANTS,
Settings.Global.APP_OPS_CONSTANTS,
@@ -143,6 +145,7 @@ public class SettingsBackupTest {
Settings.Global.BLOCKED_SLICES,
Settings.Global.BLOCKING_HELPER_DISMISS_TO_VIEW_RATIO_LIMIT,
Settings.Global.BLOCKING_HELPER_STREAK_LIMIT,
+ Settings.Global.BLUETOOTH_BTSNOOP_DEFAULT_MODE,
Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_A2DP_SUPPORTS_OPTIONAL_CODECS_PREFIX,
@@ -197,6 +200,7 @@ public class SettingsBackupTest {
Settings.Global.DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD,
Settings.Global.DATA_STALL_EVALUATION_TYPE,
Settings.Global.DATA_STALL_MIN_EVALUATE_INTERVAL,
+ Settings.Global.DATA_STALL_RECOVERY_ON_BAD_NETWORK,
Settings.Global.DATA_STALL_VALID_DNS_TIME_THRESHOLD,
Settings.Global.DEBUG_APP,
Settings.Global.DEBUG_VIEW_ATTRIBUTES,
@@ -268,6 +272,7 @@ public class SettingsBackupTest {
Settings.Global.GNSS_HAL_LOCATION_REQUEST_DURATION_MILLIS,
Settings.Global.GNSS_SATELLITE_BLACKLIST,
Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS,
+ Settings.Global.HDMI_CEC_SWITCH_ENABLED,
Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
Settings.Global.HDMI_CONTROL_ENABLED,
@@ -309,6 +314,7 @@ public class SettingsBackupTest {
Settings.Global.MDC_INITIAL_MAX_RETRY,
Settings.Global.MHL_INPUT_SWITCHING_ENABLED,
Settings.Global.MHL_POWER_CHARGE_ENABLED,
+ Settings.Global.MIN_DURATION_BETWEEN_RECOVERY_STEPS_IN_MS,
Settings.Global.MOBILE_DATA, // Candidate for backup?
Settings.Global.MOBILE_DATA_ALWAYS_ON,
Settings.Global.MODE_RINGER,
@@ -475,8 +481,10 @@ public class SettingsBackupTest {
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES,
+ Settings.Global.GUP_DEV_ALL_APPS,
Settings.Global.GUP_DEV_OPT_IN_APPS,
- Settings.Global.GUP_BLACK_LIST,
+ Settings.Global.GUP_DEV_OPT_OUT_APPS,
+ Settings.Global.GUP_BLACKLIST,
Settings.Global.GPU_DEBUG_LAYER_APP,
Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING,
Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT,
@@ -547,7 +555,14 @@ public class SettingsBackupTest {
Settings.Global.BACKUP_AGENT_TIMEOUT_PARAMETERS,
Settings.Global.BACKUP_MULTI_USER_ENABLED,
Settings.Global.ISOLATED_STORAGE_LOCAL,
- Settings.Global.ISOLATED_STORAGE_REMOTE);
+ Settings.Global.ISOLATED_STORAGE_REMOTE,
+ Settings.Global.APPOP_HISTORY_PARAMETERS,
+ Settings.Global.APPOP_HISTORY_MODE,
+ Settings.Global.APPOP_HISTORY_INTERVAL_MULTIPLIER,
+ Settings.Global.APPOP_HISTORY_BASE_INTERVAL_MILLIS,
+ Settings.Global.ENABLE_RADIO_BUG_DETECTION,
+ Settings.Global.RADIO_BUG_WAKELOCK_TIMEOUT_COUNT_THRESHOLD,
+ Settings.Global.RADIO_BUG_SYSTEM_ERROR_COUNT_THRESHOLD);
private static final Set<String> BACKUP_BLACKLISTED_SECURE_SETTINGS =
newHashSet(
Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
@@ -656,6 +671,7 @@ public class SettingsBackupTest {
Settings.Secure.SMS_DEFAULT_APPLICATION,
Settings.Secure.SPELL_CHECKER_ENABLED, // Intentionally removed in Q
Settings.Secure.TRUST_AGENTS_INITIALIZED,
+ Settings.Secure.TV_APP_USES_NON_SYSTEM_INPUTS,
Settings.Secure.TV_INPUT_CUSTOM_LABELS,
Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
Settings.Secure.TV_USER_SETUP_COMPLETE,
diff --git a/core/tests/coretests/src/android/provider/SettingsProviderTest.java b/core/tests/coretests/src/android/provider/SettingsProviderTest.java
index cb6f0e692082..a5f5f6733237 100644
--- a/core/tests/coretests/src/android/provider/SettingsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsProviderTest.java
@@ -34,9 +34,10 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
import java.util.HashMap;
import java.util.List;
diff --git a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
index b0d29bd1d8f0..08f9de602684 100644
--- a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
@@ -22,8 +22,9 @@ import static org.junit.Assert.fail;
import android.platform.test.annotations.Presubmit;
import android.provider.SettingsValidators.Validator;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/provider/SmsProviderTest.java b/core/tests/coretests/src/android/provider/SmsProviderTest.java
index af4d1a66053a..67ac8ea8d49b 100644
--- a/core/tests/coretests/src/android/provider/SmsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/SmsProviderTest.java
@@ -22,8 +22,9 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.Telephony.Sms;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.Suppress;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.Suppress;
import java.util.GregorianCalendar;
diff --git a/core/tests/coretests/src/android/provider/TestFontsProvider.java b/core/tests/coretests/src/android/provider/TestFontsProvider.java
index 46906dfa1284..c3457faf9af5 100644
--- a/core/tests/coretests/src/android/provider/TestFontsProvider.java
+++ b/core/tests/coretests/src/android/provider/TestFontsProvider.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.provider;
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
@@ -23,7 +24,6 @@ import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
-import android.graphics.Typeface;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java
index 0c9c4c17171c..ce0bf30473f6 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java
index 61ab1526abc4..37fe22fb532d 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.google.common.collect.Lists;
@@ -44,6 +45,7 @@ public class KeyChainSnapshotTest {
private static final int USER_SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN;
private static final String KEY_ALIAS = "steph";
private static final byte[] KEY_MATERIAL = new byte[] { 3, 5, 7, 9, 1 };
+ private static final byte[] KEY_METADATA = new byte[] { 5, 3, 11, 13 };
private static final CertPath CERT_PATH = TestData.getThmCertPath();
@Test
@@ -99,6 +101,7 @@ public class KeyChainSnapshotTest {
WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0);
assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias());
assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial());
+ assertArrayEquals(KEY_METADATA, wrappedApplicationKey.getMetadata());
}
@Test
@@ -165,6 +168,7 @@ public class KeyChainSnapshotTest {
WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0);
assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias());
assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial());
+ assertArrayEquals(KEY_METADATA, wrappedApplicationKey.getMetadata());
}
private static KeyChainSnapshot createKeyChainSnapshot() throws Exception {
@@ -196,6 +200,7 @@ public class KeyChainSnapshotTest {
return new WrappedApplicationKey.Builder()
.setAlias(KEY_ALIAS)
.setEncryptedKeyMaterial(KEY_MATERIAL)
+ .setMetadata(KEY_METADATA)
.build();
}
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java
index b6af9bbd772a..2b37b52c8bf9 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java b/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java
index dd8cd8dbd0c6..3b8f71585099 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
index a5a3ca90d9ac..2b15d73b6f01 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
@@ -20,8 +20,8 @@ import static android.security.keystore.recovery.TrustedRootCertificates.getRoot
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
index 15afbddf6f02..aec54e190114 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -34,6 +35,7 @@ public class WrappedApplicationKeyTest {
private static final String ALIAS = "karlin";
private static final byte[] KEY_MATERIAL = new byte[] { 0, 1, 2, 3, 4 };
+ private static final byte[] METADATA = new byte[] {3, 2, 1, 0};
private Parcel mParcel;
@@ -58,8 +60,18 @@ public class WrappedApplicationKeyTest {
}
@Test
+ public void build_setsMetadata_nonNull() {
+ assertArrayEquals(METADATA, buildTestKeyWithMetadata(METADATA).getMetadata());
+ }
+
+ @Test
+ public void build_setsMetadata_null() {
+ assertArrayEquals(null, buildTestKeyWithMetadata(null).getMetadata());
+ }
+
+ @Test
public void writeToParcel_writesAliasToParcel() {
- buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+ buildTestKeyWithMetadata(/*metadata=*/ null).writeToParcel(mParcel, /*flags=*/ 0);
mParcel.setDataPosition(0);
WrappedApplicationKey readFromParcel =
@@ -69,7 +81,7 @@ public class WrappedApplicationKeyTest {
@Test
public void writeToParcel_writesKeyMaterial() {
- buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+ buildTestKeyWithMetadata(/*metadata=*/ null).writeToParcel(mParcel, /*flags=*/ 0);
mParcel.setDataPosition(0);
WrappedApplicationKey readFromParcel =
@@ -77,10 +89,48 @@ public class WrappedApplicationKeyTest {
assertArrayEquals(KEY_MATERIAL, readFromParcel.getEncryptedKeyMaterial());
}
+ @Test
+ public void writeToParcel_writesMetadata_nonNull() {
+ buildTestKeyWithMetadata(METADATA).writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertArrayEquals(METADATA, readFromParcel.getMetadata());
+ }
+
+ @Test
+ public void writeToParcel_writesMetadata_null() {
+ buildTestKeyWithMetadata(/*metadata=*/ null).writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertArrayEquals(null, readFromParcel.getMetadata());
+ }
+
+ @Test
+ public void writeToParcel_writesMetadata_absent() {
+ buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertArrayEquals(null, readFromParcel.getMetadata());
+ }
+
private WrappedApplicationKey buildTestKey() {
return new WrappedApplicationKey.Builder()
.setAlias(ALIAS)
.setEncryptedKeyMaterial(KEY_MATERIAL)
.build();
}
+
+ private WrappedApplicationKey buildTestKeyWithMetadata(byte[] metadata) {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(ALIAS)
+ .setEncryptedKeyMaterial(KEY_MATERIAL)
+ .setMetadata(metadata)
+ .build();
+ }
}
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java
index 7f0eb43f23be..17486d51d1a1 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java
@@ -21,8 +21,8 @@ import static android.security.keystore.recovery.X509CertificateParsingUtils.dec
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java b/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java
index e69d1e7505d1..d00d052db590 100644
--- a/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java
+++ b/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.service.euicc;
import static org.junit.Assert.assertArrayEquals;
@@ -23,10 +24,11 @@ import static org.junit.Assert.assertTrue;
import android.os.Parcel;
import android.service.carrier.CarrierIdentifier;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.UiccAccessRule;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
new file mode 100644
index 000000000000..4aa10007bf53
--- /dev/null
+++ b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.notification;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.app.Notification;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.metrics.LogMaker;
+import android.os.UserHandle;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class StatusBarNotificationTest {
+
+ private final Context mMockContext = mock(Context.class);
+ @Mock
+ private PackageManager mPm;
+
+ private static final String PKG = "com.example.o";
+ private static final int UID = 9583;
+ private static final int ID = 1;
+ private static final String TAG = "tag1";
+ private static final String CHANNEL_ID = "channel";
+ private static final String CHANNEL_ID_LONG =
+ "give_a_developer_a_string_argument_and_who_knows_what_they_will_pass_in_there";
+ private static final String GROUP_ID_1 = "group1";
+ private static final String GROUP_ID_2 = "group2";
+ private static final String GROUP_ID_LONG =
+ "0|com.foo.bar|g:content://com.foo.bar.ui/account%3A-0000000/account/";
+ private static final android.os.UserHandle USER =
+ UserHandle.of(ActivityManager.getCurrentUser());
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mMockContext.getResources()).thenReturn(
+ InstrumentationRegistry.getContext().getResources());
+ when(mMockContext.getPackageManager()).thenReturn(mPm);
+ when(mMockContext.getApplicationInfo()).thenReturn(new ApplicationInfo());
+ }
+
+ @Test
+ public void testLogMaker() {
+ final LogMaker logMaker = getNotification(PKG, GROUP_ID_1, CHANNEL_ID).getLogMaker();
+
+ assertEquals(CHANNEL_ID,
+ (String) logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID));
+ assertEquals(PKG, logMaker.getPackageName());
+ assertEquals(ID, logMaker.getTaggedData(MetricsEvent.NOTIFICATION_ID));
+ assertEquals(TAG, logMaker.getTaggedData(MetricsEvent.NOTIFICATION_TAG));
+ assertEquals(GROUP_ID_1,
+ logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+ }
+
+ @Test
+ public void testLogMakerNoChannel() {
+ final LogMaker logMaker = getNotification(PKG, GROUP_ID_1, null).getLogMaker();
+
+ assertNull(logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID));
+ }
+
+ @Test
+ public void testLogMakerLongChannel() {
+ final LogMaker logMaker = getNotification(PKG, null, CHANNEL_ID_LONG).getLogMaker();
+ final String loggedId = (String) logMaker
+ .getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID);
+ assertEquals(StatusBarNotification.MAX_LOG_TAG_LENGTH, loggedId.length());
+ assertEquals(CHANNEL_ID_LONG.substring(0, 10), loggedId.substring(0, 10));
+ }
+
+ @Test
+ public void testLogMakerNoGroup() {
+ final LogMaker logMaker = getNotification(PKG, null, CHANNEL_ID).getLogMaker();
+
+ assertNull(
+ logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+ }
+
+ @Test
+ public void testLogMakerLongGroup() {
+ final LogMaker logMaker = getNotification(PKG, GROUP_ID_LONG, CHANNEL_ID)
+ .getLogMaker();
+
+ final String loggedId = (String)
+ logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID);
+ assertEquals(StatusBarNotification.MAX_LOG_TAG_LENGTH, loggedId.length());
+ assertEquals(GROUP_ID_LONG.substring(0, 10), loggedId.substring(0, 10));
+ }
+
+ @Test
+ public void testLogMakerOverrideGroup() {
+ StatusBarNotification sbn = getNotification(PKG, GROUP_ID_1, CHANNEL_ID);
+ assertEquals(GROUP_ID_1,
+ sbn.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+
+ sbn.setOverrideGroupKey(GROUP_ID_2);
+ assertEquals(GROUP_ID_2,
+ sbn.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+
+ sbn.setOverrideGroupKey(null);
+ assertEquals(GROUP_ID_1,
+ sbn.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+ }
+
+ private StatusBarNotification getNotification(String pkg, String group, String channelId) {
+ final Notification.Builder builder = new Notification.Builder(mMockContext, channelId)
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+
+ if (group != null) {
+ builder.setGroup(group);
+ }
+
+ Notification n = builder.build();
+ return new StatusBarNotification(
+ pkg, pkg, ID, TAG, UID, UID, n, USER, null, UID);
+ }
+
+}
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java
index ab541a15cdcc..9c8e86834bf6 100644
--- a/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java
+++ b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java
@@ -16,16 +16,12 @@
package android.service.settings.suggestions;
-import android.support.annotation.VisibleForTesting;
-
import java.util.ArrayList;
import java.util.List;
public class MockSuggestionService extends SuggestionService {
- @VisibleForTesting
static boolean sOnSuggestionLaunchedCalled;
- @VisibleForTesting
static boolean sOnSuggestionDismissedCalled;
public static void reset() {
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java
index dca8c096dc59..64edda5ee879 100644
--- a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java
+++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java
@@ -21,10 +21,11 @@ import static com.google.common.truth.Truth.assertThat;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ServiceTestRule;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.rule.ServiceTestRule;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java
index b0ec55d946e2..8c47fcbc8947 100644
--- a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java
+++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java
@@ -24,9 +24,10 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/text/AndroidCharacterTest.java b/core/tests/coretests/src/android/text/AndroidCharacterTest.java
index 0c7e730e78e4..1c5986a838fc 100644
--- a/core/tests/coretests/src/android/text/AndroidCharacterTest.java
+++ b/core/tests/coretests/src/android/text/AndroidCharacterTest.java
@@ -19,7 +19,8 @@ package android.text;
import static org.junit.Assert.assertArrayEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/text/BidiFormatterTest.java b/core/tests/coretests/src/android/text/BidiFormatterTest.java
index 1b936c7b1c1d..312fb68bbfc2 100644
--- a/core/tests/coretests/src/android/text/BidiFormatterTest.java
+++ b/core/tests/coretests/src/android/text/BidiFormatterTest.java
@@ -19,8 +19,9 @@ package android.text;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
index c69f4f58b44e..cca1ad3a6dec 100644
--- a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
+++ b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
@@ -22,8 +22,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/DynamicLayoutTest.java b/core/tests/coretests/src/android/text/DynamicLayoutTest.java
index ea954f65476d..699243b3f2b9 100644
--- a/core/tests/coretests/src/android/text/DynamicLayoutTest.java
+++ b/core/tests/coretests/src/android/text/DynamicLayoutTest.java
@@ -27,11 +27,12 @@ import static org.junit.Assert.assertTrue;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.style.ReplacementSpan;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/EmojiTest.java b/core/tests/coretests/src/android/text/EmojiTest.java
index 313f1b6a6614..194899415e0d 100644
--- a/core/tests/coretests/src/android/text/EmojiTest.java
+++ b/core/tests/coretests/src/android/text/EmojiTest.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.assertTrue;
import android.icu.lang.UCharacterDirection;
import android.icu.text.Bidi;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/FontFallbackSetup.java b/core/tests/coretests/src/android/text/FontFallbackSetup.java
index 5592aac5a7c0..cc51ec3da1fd 100644
--- a/core/tests/coretests/src/android/text/FontFallbackSetup.java
+++ b/core/tests/coretests/src/android/text/FontFallbackSetup.java
@@ -24,9 +24,10 @@ import android.graphics.fonts.Font;
import android.graphics.fonts.FontCustomizationParser;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
-import android.support.test.InstrumentationRegistry;
import android.util.ArrayMap;
+import androidx.test.InstrumentationRegistry;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
diff --git a/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java b/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java
index 1208d7ca194a..96e7fb9c8b16 100644
--- a/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java
+++ b/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java
@@ -22,12 +22,13 @@ import android.content.Context;
import android.graphics.Path;
import android.graphics.Typeface;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.method.MetaKeyKeyListener;
import android.view.KeyEvent;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/LayoutTest.java b/core/tests/coretests/src/android/text/LayoutTest.java
index 97937a45825e..990161a88c22 100644
--- a/core/tests/coretests/src/android/text/LayoutTest.java
+++ b/core/tests/coretests/src/android/text/LayoutTest.java
@@ -31,11 +31,12 @@ import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
import android.text.style.StrikethroughSpan;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/MeasuredParagraphTest.java b/core/tests/coretests/src/android/text/MeasuredParagraphTest.java
index a0dca2c0dc4f..57bb4349c4fd 100644
--- a/core/tests/coretests/src/android/text/MeasuredParagraphTest.java
+++ b/core/tests/coretests/src/android/text/MeasuredParagraphTest.java
@@ -23,9 +23,10 @@ import static org.junit.Assert.assertNull;
import android.content.Context;
import android.graphics.Typeface;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/PackedIntVectorTest.java b/core/tests/coretests/src/android/text/PackedIntVectorTest.java
index d9dc6fc44495..ba15b92012a7 100644
--- a/core/tests/coretests/src/android/text/PackedIntVectorTest.java
+++ b/core/tests/coretests/src/android/text/PackedIntVectorTest.java
@@ -19,8 +19,9 @@ package android.text;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java
index d0f2d46f9c2b..91b8c6ad0c53 100644
--- a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java
+++ b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java
@@ -16,18 +16,18 @@
package android.text;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.style.BulletSpan;
import android.text.style.QuoteSpan;
import android.text.style.SubscriptSpan;
import android.text.style.UnderlineSpan;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
index 6c05601a31fd..9149f7b1b216 100644
--- a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
+++ b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
@@ -21,11 +21,12 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import android.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.style.QuoteSpan;
import android.text.style.UnderlineSpan;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/SpannableTest.java b/core/tests/coretests/src/android/text/SpannableTest.java
index f3684286dbbb..d248a1f69030 100644
--- a/core/tests/coretests/src/android/text/SpannableTest.java
+++ b/core/tests/coretests/src/android/text/SpannableTest.java
@@ -19,10 +19,11 @@ package android.text;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.MoreAsserts;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
index 380e3153ccda..ca4373361fa5 100644
--- a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
+++ b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
@@ -21,11 +21,12 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import android.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.style.QuoteSpan;
import android.text.style.UnderlineSpan;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/SpannedTest.java b/core/tests/coretests/src/android/text/SpannedTest.java
index 573757165101..3ab075509373 100644
--- a/core/tests/coretests/src/android/text/SpannedTest.java
+++ b/core/tests/coretests/src/android/text/SpannedTest.java
@@ -21,13 +21,14 @@ import static org.junit.Assert.assertEquals;
import android.graphics.Typeface;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.style.CharacterStyle;
import android.text.style.StyleSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
index bf0d42788b72..32370b3e6e05 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
@@ -19,10 +19,11 @@ package android.text;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
index 5cf54268e004..4221ac208948 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
@@ -19,11 +19,12 @@ package android.text;
import static org.junit.Assert.fail;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Directions;
import android.text.StaticLayoutTest.LayoutBuilder;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index 25217125bbf4..b1c896ec2ce4 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -25,13 +25,14 @@ import android.graphics.Canvas;
import android.graphics.Paint.FontMetricsInt;
import android.os.LocaleList;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
import android.text.method.EditorState;
import android.text.style.LocaleSpan;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
index f6888e3adb75..0d42326d4bdb 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
@@ -19,10 +19,11 @@ package android.text;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/TextLayoutTest.java b/core/tests/coretests/src/android/text/TextLayoutTest.java
index 24020ceb0cd4..15fbc9e59508 100644
--- a/core/tests/coretests/src/android/text/TextLayoutTest.java
+++ b/core/tests/coretests/src/android/text/TextLayoutTest.java
@@ -17,8 +17,9 @@
package android.text;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/text/TextLineTest.java b/core/tests/coretests/src/android/text/TextLineTest.java
index 61f976a7308d..90ce305b3dab 100644
--- a/core/tests/coretests/src/android/text/TextLineTest.java
+++ b/core/tests/coretests/src/android/text/TextLineTest.java
@@ -25,14 +25,15 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.filters.Suppress;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.TabStops;
import android.text.style.ReplacementSpan;
import android.text.style.TabStopSpan;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -254,6 +255,18 @@ public class TextLineTest {
}
@Test
+ public void testMeasure_wordSpacing() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+ paint.setWordSpacing(10.0f);
+
+ TextLine tl = getTextLine("I I", paint);
+ assertMeasurements(tl, 3, false,
+ new float[]{0.0f, 10.0f, 120.0f, 130.0f});
+ }
+
+ @Test
public void testHandleRun_ellipsizedReplacementSpan_isSkipped() {
final Spannable text = new SpannableStringBuilder("This is a... text");
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index 72290bf10f9d..be6ef195fa96 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -26,15 +26,16 @@ import static org.junit.Assert.fail;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.MoreAsserts;
import android.text.style.StyleSpan;
import android.text.util.Rfc822Token;
import android.text.util.Rfc822Tokenizer;
import android.view.View;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.android.collect.Lists;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/text/VariationParserTest.java b/core/tests/coretests/src/android/text/VariationParserTest.java
index fbd2412a35cc..0afe811f1ad6 100644
--- a/core/tests/coretests/src/android/text/VariationParserTest.java
+++ b/core/tests/coretests/src/android/text/VariationParserTest.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.fail;
import android.graphics.fonts.FontVariationAxis;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/format/DateFormatTest.java b/core/tests/coretests/src/android/text/format/DateFormatTest.java
index 9000ed07d606..5a0a84db5905 100644
--- a/core/tests/coretests/src/android/text/format/DateFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateFormatTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
index 872b71a5faa6..381c0512c532 100644
--- a/core/tests/coretests/src/android/text/format/DateUtilsTest.java
+++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
@@ -22,8 +22,9 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.LocaleList;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java
index 82e4bff200fd..068d04798858 100644
--- a/core/tests/coretests/src/android/text/format/FormatterTest.java
+++ b/core/tests/coretests/src/android/text/format/FormatterTest.java
@@ -25,11 +25,12 @@ import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.format.Formatter.BytesResult;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/text/format/TimeTest.java b/core/tests/coretests/src/android/text/format/TimeTest.java
index d563f2e2383b..ac0041119640 100644
--- a/core/tests/coretests/src/android/text/format/TimeTest.java
+++ b/core/tests/coretests/src/android/text/format/TimeTest.java
@@ -21,12 +21,13 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.filters.Suppress;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.TimeFormatException;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/method/BackspaceTest.java b/core/tests/coretests/src/android/text/method/BackspaceTest.java
index df4609f5a728..ddae652cec05 100644
--- a/core/tests/coretests/src/android/text/method/BackspaceTest.java
+++ b/core/tests/coretests/src/android/text/method/BackspaceTest.java
@@ -17,15 +17,16 @@
package android.text.method;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.InputType;
import android.util.KeyUtils;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView.BufferType;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/method/EditorState.java b/core/tests/coretests/src/android/text/method/EditorState.java
index 12bb8c839e60..4eff7a49ac7b 100644
--- a/core/tests/coretests/src/android/text/method/EditorState.java
+++ b/core/tests/coretests/src/android/text/method/EditorState.java
@@ -21,8 +21,6 @@ import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
index 45a501077128..45b63e03c27e 100644
--- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
+++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
@@ -17,15 +17,16 @@
package android.text.method;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.InputType;
import android.util.KeyUtils;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView.BufferType;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/method/WordIteratorTest.java b/core/tests/coretests/src/android/text/method/WordIteratorTest.java
index 684586387255..cc345f5785df 100644
--- a/core/tests/coretests/src/android/text/method/WordIteratorTest.java
+++ b/core/tests/coretests/src/android/text/method/WordIteratorTest.java
@@ -22,8 +22,9 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java b/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java
index 3d7e5bab15f3..a0d2f856d093 100644
--- a/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java
+++ b/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java
@@ -16,17 +16,17 @@
package android.text.style;
-
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index be3a0be079bf..107ecd716b5a 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -23,9 +23,6 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.Configuration;
import android.os.LocaleList;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
@@ -33,6 +30,10 @@ import android.text.style.URLSpan;
import android.util.Patterns;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/transition/AutoTransitionTest.java b/core/tests/coretests/src/android/transition/AutoTransitionTest.java
index 834fb7aa72a5..deae967a3e72 100644
--- a/core/tests/coretests/src/android/transition/AutoTransitionTest.java
+++ b/core/tests/coretests/src/android/transition/AutoTransitionTest.java
@@ -16,16 +16,16 @@
package android.transition;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@RunWith(AndroidJUnit4.class)
public class AutoTransitionTest {
@Test
diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java
index 22365bac64a2..2077d9443e7a 100644
--- a/core/tests/coretests/src/android/transition/FadeTransitionTest.java
+++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java
@@ -22,13 +22,14 @@ import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
import android.transition.Transition.TransitionListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import java.util.concurrent.CountDownLatch;
diff --git a/core/tests/coretests/src/android/transition/SlideTransitionTest.java b/core/tests/coretests/src/android/transition/SlideTransitionTest.java
index 8b9ec74be8df..046e49dffab1 100644
--- a/core/tests/coretests/src/android/transition/SlideTransitionTest.java
+++ b/core/tests/coretests/src/android/transition/SlideTransitionTest.java
@@ -19,18 +19,18 @@ package android.transition;
import android.animation.AnimatorSetActivity;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-
public class SlideTransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> {
Activity mActivity;
diff --git a/core/tests/coretests/src/android/transition/TransitionTest.java b/core/tests/coretests/src/android/transition/TransitionTest.java
index 7e629f944684..f59c406f7f74 100644
--- a/core/tests/coretests/src/android/transition/TransitionTest.java
+++ b/core/tests/coretests/src/android/transition/TransitionTest.java
@@ -19,7 +19,6 @@ package android.transition;
import android.animation.AnimatorSetActivity;
import android.app.Activity;
import android.graphics.Rect;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
import android.transition.Transition.EpicenterCallback;
import android.util.ArrayMap;
@@ -27,6 +26,8 @@ import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.TextView;
+import androidx.test.filters.LargeTest;
+
import com.android.frameworks.coretests.R;
import java.lang.reflect.Field;
diff --git a/core/tests/coretests/src/android/util/ArrayMapTest.java b/core/tests/coretests/src/android/util/ArrayMapTest.java
index f0cc7f77fe63..b212cf6b0803 100644
--- a/core/tests/coretests/src/android/util/ArrayMapTest.java
+++ b/core/tests/coretests/src/android/util/ArrayMapTest.java
@@ -14,10 +14,10 @@
package android.util;
-import android.support.test.filters.LargeTest;
-import android.util.ArrayMap;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
+
import org.junit.Test;
import java.util.ConcurrentModificationException;
diff --git a/core/tests/coretests/src/android/util/Base64Test.java b/core/tests/coretests/src/android/util/Base64Test.java
index af608c3ae259..15c51af0b3e1 100644
--- a/core/tests/coretests/src/android/util/Base64Test.java
+++ b/core/tests/coretests/src/android/util/Base64Test.java
@@ -16,7 +16,7 @@
package android.util;
-import android.support.test.filters.LargeTest;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/DataUnitTest.java b/core/tests/coretests/src/android/util/DataUnitTest.java
index 4eae8b45e94b..ec296b76c374 100644
--- a/core/tests/coretests/src/android/util/DataUnitTest.java
+++ b/core/tests/coretests/src/android/util/DataUnitTest.java
@@ -16,7 +16,7 @@
package android.util;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java b/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java
index 4c5ad76d8193..572e9b062097 100644
--- a/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java
+++ b/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java
@@ -16,10 +16,11 @@
package android.util;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
import java.util.Calendar;
-import android.test.suitebuilder.annotation.SmallTest;
/**
* Unit tests for {@link DayOfMonthCursor}.
diff --git a/core/tests/coretests/src/android/util/InternalSelectionView.java b/core/tests/coretests/src/android/util/InternalSelectionView.java
index a0fb0f18a4fa..4a1baef8077a 100644
--- a/core/tests/coretests/src/android/util/InternalSelectionView.java
+++ b/core/tests/coretests/src/android/util/InternalSelectionView.java
@@ -16,19 +16,16 @@
package android.util;
-import com.android.frameworks.coretests.R;
-
-import android.view.View;
-import android.view.KeyEvent;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.Paint;
import android.graphics.Canvas;
-import android.graphics.Rect;
import android.graphics.Color;
-import android.util.AttributeSet;
-
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.view.KeyEvent;
+import android.view.View;
+import com.android.frameworks.coretests.R;
/**
* A view that has a known number of selectable rows, and maintains a notion of which
diff --git a/core/tests/coretests/src/android/util/KeyUtils.java b/core/tests/coretests/src/android/util/KeyUtils.java
index 593f72742ea6..612643e12db0 100644
--- a/core/tests/coretests/src/android/util/KeyUtils.java
+++ b/core/tests/coretests/src/android/util/KeyUtils.java
@@ -17,16 +17,10 @@
package android.util;
import android.app.Instrumentation;
-import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase;
-import android.test.InstrumentationTestCase;
-import android.view.Gravity;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewGroup;
/**
* Reusable methods for generating key events.
diff --git a/core/tests/coretests/src/android/util/KeyValueListParserTest.java b/core/tests/coretests/src/android/util/KeyValueListParserTest.java
index 038f0b7efaa3..f65c4c7c0bdf 100644
--- a/core/tests/coretests/src/android/util/KeyValueListParserTest.java
+++ b/core/tests/coretests/src/android/util/KeyValueListParserTest.java
@@ -19,8 +19,9 @@ package android.util;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/util/ListUtil.java b/core/tests/coretests/src/android/util/ListUtil.java
index 2a7cb96bebfe..3748cf8e1405 100644
--- a/core/tests/coretests/src/android/util/ListUtil.java
+++ b/core/tests/coretests/src/android/util/ListUtil.java
@@ -20,13 +20,11 @@ import android.app.Instrumentation;
import android.view.KeyEvent;
import android.widget.ListView;
-
/**
* Various useful stuff for instrumentation testing listview.
*/
public class ListUtil {
-
private final ListView mListView;
private final Instrumentation mInstrumentation;
diff --git a/core/tests/coretests/src/android/util/LocalLogTest.java b/core/tests/coretests/src/android/util/LocalLogTest.java
index 5144c85e72a2..6cdcb5e542dc 100644
--- a/core/tests/coretests/src/android/util/LocalLogTest.java
+++ b/core/tests/coretests/src/android/util/LocalLogTest.java
@@ -16,7 +16,7 @@
package android.util;
-import android.support.test.filters.LargeTest;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/LogNullabilityTest.java b/core/tests/coretests/src/android/util/LogNullabilityTest.java
index 3f4776d8b4fc..370885d3d4ac 100644
--- a/core/tests/coretests/src/android/util/LogNullabilityTest.java
+++ b/core/tests/coretests/src/android/util/LogNullabilityTest.java
@@ -19,8 +19,8 @@ package android.util;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/util/LogTest.java b/core/tests/coretests/src/android/util/LogTest.java
index 30c81b0c7228..d783c127d8c4 100644
--- a/core/tests/coretests/src/android/util/LogTest.java
+++ b/core/tests/coretests/src/android/util/LogTest.java
@@ -16,13 +16,12 @@
package android.util;
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
import android.os.SystemProperties;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
+
+import androidx.test.filters.Suppress;
+
+import junit.framework.TestCase;
//This is an empty TestCase.
@Suppress
diff --git a/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java b/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java
index 3f03db9dc1fb..a1d48e689427 100644
--- a/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java
+++ b/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java
@@ -16,7 +16,7 @@
package android.util;
-import android.support.test.filters.LargeTest;
+import androidx.test.filters.LargeTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/LruCacheTest.java b/core/tests/coretests/src/android/util/LruCacheTest.java
index 5a97158a85d1..1928bfdfc61d 100644
--- a/core/tests/coretests/src/android/util/LruCacheTest.java
+++ b/core/tests/coretests/src/android/util/LruCacheTest.java
@@ -16,12 +16,13 @@
package android.util;
+import junit.framework.TestCase;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import junit.framework.TestCase;
public final class LruCacheTest extends TestCase {
private int expectedCreateCount;
diff --git a/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java b/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java
index 55da665c7b34..30d5f778e945 100644
--- a/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java
+++ b/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java
@@ -16,12 +16,12 @@
package android.util;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import java.util.Calendar;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
+import java.util.Calendar;
+
/**
* Unit tests for {@link MonthDisplayHelper}.
*/
diff --git a/core/tests/coretests/src/android/util/OrientationUtil.java b/core/tests/coretests/src/android/util/OrientationUtil.java
index ecdca5d608c4..0361194dad2b 100644
--- a/core/tests/coretests/src/android/util/OrientationUtil.java
+++ b/core/tests/coretests/src/android/util/OrientationUtil.java
@@ -19,7 +19,6 @@ package android.util;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.pm.ActivityInfo;
-
import android.test.ActivityInstrumentationTestCase2;
import com.android.internal.util.Preconditions;
diff --git a/core/tests/coretests/src/android/util/PatternsTest.java b/core/tests/coretests/src/android/util/PatternsTest.java
index 360b8756f264..6cea2f3c92bd 100644
--- a/core/tests/coretests/src/android/util/PatternsTest.java
+++ b/core/tests/coretests/src/android/util/PatternsTest.java
@@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.util;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
+
+import junit.framework.TestCase;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import junit.framework.TestCase;
-
public class PatternsTest extends TestCase {
// Tests for Patterns.TOP_LEVEL_DOMAIN
diff --git a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
index 39d492d65415..caa12083fafb 100644
--- a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
+++ b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
@@ -16,7 +16,7 @@
package android.util;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/SparseLongArrayTest.java b/core/tests/coretests/src/android/util/SparseLongArrayTest.java
index 5a5e893d1472..df2d752e04b9 100644
--- a/core/tests/coretests/src/android/util/SparseLongArrayTest.java
+++ b/core/tests/coretests/src/android/util/SparseLongArrayTest.java
@@ -19,9 +19,10 @@ package android.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import android.support.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.annotation.NonNull;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/util/StateSetTest.java b/core/tests/coretests/src/android/util/StateSetTest.java
index e481ce04c82f..b5d62704ba29 100644
--- a/core/tests/coretests/src/android/util/StateSetTest.java
+++ b/core/tests/coretests/src/android/util/StateSetTest.java
@@ -16,8 +16,9 @@
package android.util;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
-import android.test.suitebuilder.annotation.SmallTest;
/**
* Tests for {@link StateSet}
diff --git a/core/tests/coretests/src/android/util/TimestampedValueTest.java b/core/tests/coretests/src/android/util/TimestampedValueTest.java
index 03b4abd9b7a3..6e3ab796c5d3 100644
--- a/core/tests/coretests/src/android/util/TimestampedValueTest.java
+++ b/core/tests/coretests/src/android/util/TimestampedValueTest.java
@@ -21,7 +21,8 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/util/TimingsTraceLogTest.java b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java
index 7bb4ab835e4f..77d05524d7cf 100644
--- a/core/tests/coretests/src/android/util/TimingsTraceLogTest.java
+++ b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java
@@ -19,8 +19,9 @@ package android.util;
import static org.junit.Assert.assertTrue;
import android.os.Trace;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -28,7 +29,6 @@ import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
-
/**
* Tests for {@link TimingsTraceLog}.
* <p>Usage: bit FrameworksCoreTests:android.util.TimingsTraceLogTest
diff --git a/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java b/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java
index ca12a153044d..fc082353fffb 100644
--- a/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java
+++ b/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java
@@ -16,12 +16,12 @@
package android.util;
-import junit.framework.Assert;
-
import android.test.InstrumentationTestCase;
import android.test.TouchUtils;
import android.view.View;
+import junit.framework.Assert;
+
/**
* When entering touch mode via touch, the tests can be flaky. These asserts
* are more flexible (allowing up to MAX_ATTEMPTS touches to enter touch mode via touch or
diff --git a/core/tests/coretests/src/android/view/BigCache.java b/core/tests/coretests/src/android/view/BigCache.java
index 21821763456a..6a1bcaaf2d00 100644
--- a/core/tests/coretests/src/android/view/BigCache.java
+++ b/core/tests/coretests/src/android/view/BigCache.java
@@ -16,16 +16,12 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
import android.app.Activity;
+import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ScrollView;
-import android.view.ViewGroup;
-import android.view.View;
-import android.view.Display;
-import android.view.ViewConfiguration;
+
+import com.android.frameworks.coretests.R;
/**
* This activity contains two Views, one as big as the screen, one much larger. The large one
diff --git a/core/tests/coretests/src/android/view/BigCacheTest.java b/core/tests/coretests/src/android/view/BigCacheTest.java
index 8c2c865201aa..ed4b996b1d08 100644
--- a/core/tests/coretests/src/android/view/BigCacheTest.java
+++ b/core/tests/coretests/src/android/view/BigCacheTest.java
@@ -16,14 +16,12 @@
package android.view;
-import android.view.BigCache;
-import com.android.frameworks.coretests.R;
-
-import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-import android.view.ViewConfiguration;
import android.graphics.Bitmap;
+import android.test.ActivityInstrumentationTestCase;
+
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
/**
* Builds the drawing cache of two Views, one smaller than the maximum cache size,
diff --git a/core/tests/coretests/src/android/view/BitmapDrawable.java b/core/tests/coretests/src/android/view/BitmapDrawable.java
index f7bad84d6ddd..42c176f6b676 100644
--- a/core/tests/coretests/src/android/view/BitmapDrawable.java
+++ b/core/tests/coretests/src/android/view/BitmapDrawable.java
@@ -16,19 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AbsoluteLayout;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
+
+import com.android.frameworks.coretests.R;
public class BitmapDrawable extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/view/CreateViewTest.java b/core/tests/coretests/src/android/view/CreateViewTest.java
index 16656f688640..520f83f60836 100644
--- a/core/tests/coretests/src/android/view/CreateViewTest.java
+++ b/core/tests/coretests/src/android/view/CreateViewTest.java
@@ -16,16 +16,17 @@
package android.view;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
import android.content.Context;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.View;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.test.filters.SmallTest;
+
public class CreateViewTest extends AndroidTestCase implements PerformanceTestCase {
public boolean isPerformanceOnly() {
diff --git a/core/tests/coretests/src/android/view/Disabled.java b/core/tests/coretests/src/android/view/Disabled.java
index d3c7470bd0f9..ce90039f360f 100644
--- a/core/tests/coretests/src/android/view/Disabled.java
+++ b/core/tests/coretests/src/android/view/Disabled.java
@@ -16,13 +16,12 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
+import android.app.Activity;
import android.os.Bundle;
-import android.widget.Button;
-import android.view.View;
import android.view.View.OnClickListener;
-import android.app.Activity;
+import android.widget.Button;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise View's disabled state.
diff --git a/core/tests/coretests/src/android/view/DisabledLongpressTest.java b/core/tests/coretests/src/android/view/DisabledLongpressTest.java
index faa0865c5a1c..a9fec01c8b34 100644
--- a/core/tests/coretests/src/android/view/DisabledLongpressTest.java
+++ b/core/tests/coretests/src/android/view/DisabledLongpressTest.java
@@ -18,11 +18,12 @@ package android.view;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.KeyUtils;
import android.view.View.OnLongClickListener;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/DisabledTest.java b/core/tests/coretests/src/android/view/DisabledTest.java
index 291a11c289b7..8922e5fda206 100644
--- a/core/tests/coretests/src/android/view/DisabledTest.java
+++ b/core/tests/coretests/src/android/view/DisabledTest.java
@@ -18,12 +18,11 @@ package android.view;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.KeyEvent;
-import android.view.View;
import android.widget.Button;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/DisplayCutoutTest.java b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
index 8e4f2cd2fbff..dd50af877bbb 100644
--- a/core/tests/coretests/src/android/view/DisplayCutoutTest.java
+++ b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
@@ -33,17 +33,17 @@ import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.DisplayCutout.ParcelableWrapper;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collections;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
@Presubmit
diff --git a/core/tests/coretests/src/android/view/DrawableBgMinSize.java b/core/tests/coretests/src/android/view/DrawableBgMinSize.java
index 58bfb8a77064..ba9ba008b2ef 100644
--- a/core/tests/coretests/src/android/view/DrawableBgMinSize.java
+++ b/core/tests/coretests/src/android/view/DrawableBgMinSize.java
@@ -16,12 +16,9 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
@@ -30,6 +27,8 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
/**
* Views should obey their background {@link Drawable}'s minimum size
* requirements ({@link Drawable#getMinimumHeight()} and
diff --git a/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java b/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java
index e705c87a6675..1735e8cb037f 100644
--- a/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java
+++ b/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java
@@ -16,14 +16,9 @@
package android.view;
-import com.android.frameworks.coretests.R;
-import android.view.DrawableBgMinSize;
-import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.MediumTest;
-
import android.graphics.drawable.Drawable;
import android.test.ActivityInstrumentationTestCase;
-import android.view.View;
+import android.test.TouchUtils;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.FrameLayout;
@@ -31,6 +26,10 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link DrawableBgMinSize} exercises Views to obey their background drawable's
* minimum sizes.
diff --git a/core/tests/coretests/src/android/view/FocusFinderTest.java b/core/tests/coretests/src/android/view/FocusFinderTest.java
index 2732a04b44d5..b35c64a09ade 100644
--- a/core/tests/coretests/src/android/view/FocusFinderTest.java
+++ b/core/tests/coretests/src/android/view/FocusFinderTest.java
@@ -18,7 +18,8 @@ package android.view;
import android.graphics.Rect;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
public class FocusFinderTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/view/GlobalFocusChange.java b/core/tests/coretests/src/android/view/GlobalFocusChange.java
index 041c0ded366f..ee92b64f3947 100644
--- a/core/tests/coretests/src/android/view/GlobalFocusChange.java
+++ b/core/tests/coretests/src/android/view/GlobalFocusChange.java
@@ -16,12 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.ViewTreeObserver;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class GlobalFocusChange extends Activity implements ViewTreeObserver.OnGlobalFocusChangeListener {
public View mOldFocus;
diff --git a/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java b/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java
index dab7b90a447d..960654a926ce 100644
--- a/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java
+++ b/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java
@@ -17,13 +17,13 @@
package android.view;
import android.test.ActivityInstrumentationTestCase;
-import android.test.FlakyTest;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.Suppress;
-import android.view.View;
-import android.view.KeyEvent;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
import com.android.frameworks.coretests.R;
@Suppress // Flaky
@@ -50,7 +50,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa
super.tearDown();
}
- @FlakyTest(tolerance = 4)
+ @FlakyTest
@LargeTest
public void testFocusChange() throws Exception {
sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
@@ -62,7 +62,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa
assertSame(mRight, mActivity.mNewFocus);
}
- @FlakyTest(tolerance = 4)
+ @FlakyTest
@MediumTest
public void testEnterTouchMode() throws Exception {
assertTrue(mLeft.isFocused());
@@ -73,7 +73,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa
assertSame(null, mActivity.mNewFocus);
}
- @FlakyTest(tolerance = 4)
+ @FlakyTest
@MediumTest
public void testLeaveTouchMode() throws Exception {
assertTrue(mLeft.isFocused());
diff --git a/core/tests/coretests/src/android/view/HandlerActionQueueTest.java b/core/tests/coretests/src/android/view/HandlerActionQueueTest.java
index fd8f23abc45c..bedb75bb7472 100644
--- a/core/tests/coretests/src/android/view/HandlerActionQueueTest.java
+++ b/core/tests/coretests/src/android/view/HandlerActionQueueTest.java
@@ -17,7 +17,8 @@
package android.view;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
public class HandlerActionQueueTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/view/Include.java b/core/tests/coretests/src/android/view/Include.java
index e90c48471c83..4b6aefb112e6 100644
--- a/core/tests/coretests/src/android/view/Include.java
+++ b/core/tests/coretests/src/android/view/Include.java
@@ -16,10 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise <include /> tag in XML files.
diff --git a/core/tests/coretests/src/android/view/IncludeTest.java b/core/tests/coretests/src/android/view/IncludeTest.java
index cdcfa3ce5478..e4905597d16a 100644
--- a/core/tests/coretests/src/android/view/IncludeTest.java
+++ b/core/tests/coretests/src/android/view/IncludeTest.java
@@ -16,13 +16,11 @@
package android.view;
-import android.view.Include;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-import android.view.ViewGroup;
+
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
public class IncludeTest extends ActivityInstrumentationTestCase<Include> {
public IncludeTest() {
diff --git a/core/tests/coretests/src/android/view/InflateTest.java b/core/tests/coretests/src/android/view/InflateTest.java
index cb4f8e2399b1..939d6eaba3c9 100644
--- a/core/tests/coretests/src/android/view/InflateTest.java
+++ b/core/tests/coretests/src/android/view/InflateTest.java
@@ -20,13 +20,11 @@ import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import com.android.frameworks.coretests.R;
-import java.util.Map;
+import androidx.test.filters.SmallTest;
+
+import com.android.frameworks.coretests.R;
public class InflateTest extends AndroidTestCase implements PerformanceTestCase {
private LayoutInflater mInflater;
diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
index d520f151c2fa..7f00ad9ed2f2 100644
--- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
+++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
@@ -18,7 +18,10 @@ package android.view;
import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
import static android.view.InsetsState.TYPE_TOP_BAR;
+
import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.graphics.Insets;
@@ -26,12 +29,13 @@ import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
import android.view.SurfaceControl.Transaction;
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -83,7 +87,7 @@ public class InsetsAnimationControlImplTest {
consumers.put(TYPE_NAVIGATION_BAR, navConsumer);
mController = new InsetsAnimationControlImpl(consumers,
new Rect(0, 0, 500, 500), state, mMockListener, WindowInsets.Type.systemBars(),
- () -> mMockTransactionApplier);
+ () -> mMockTransactionApplier, mock(InsetsController.class));
}
@Test
diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java
index d3d274a64682..d44745121a22 100644
--- a/core/tests/coretests/src/android/view/InsetsControllerTest.java
+++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java
@@ -17,18 +17,20 @@
package android.view;
import static android.view.InsetsState.TYPE_TOP_BAR;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
+
import static org.mockito.Mockito.mock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
@Presubmit
@FlakyTest(detail = "Promote once confirmed non-flaky")
diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
index 6d0f98433168..82cd2131ab4e 100644
--- a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
+++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
@@ -17,6 +17,7 @@
package android.view;
import static android.view.InsetsState.TYPE_TOP_BAR;
+
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.reset;
@@ -24,10 +25,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl.Transaction;
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/InsetsSourceTest.java b/core/tests/coretests/src/android/view/InsetsSourceTest.java
index ed472d2a7f64..98ab3e785d0a 100644
--- a/core/tests/coretests/src/android/view/InsetsSourceTest.java
+++ b/core/tests/coretests/src/android/view/InsetsSourceTest.java
@@ -17,13 +17,15 @@
package android.view;
import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
+
import static junit.framework.Assert.assertEquals;
import android.graphics.Insets;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java
index 9807f26ad367..9857b7a1e035 100644
--- a/core/tests/coretests/src/android/view/InsetsStateTest.java
+++ b/core/tests/coretests/src/android/view/InsetsStateTest.java
@@ -24,17 +24,22 @@ import static android.view.InsetsState.TYPE_SIDE_BAR_1;
import static android.view.InsetsState.TYPE_SIDE_BAR_2;
import static android.view.InsetsState.TYPE_SIDE_BAR_3;
import static android.view.InsetsState.TYPE_TOP_BAR;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+
import static org.junit.Assert.assertNotEquals;
+import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseIntArray;
+import android.view.WindowInsets.Type;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,9 +61,12 @@ public class InsetsStateTest {
SparseIntArray typeSideMap = new SparseIntArray();
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
DisplayCutout.NO_CUTOUT, typeSideMap);
- assertEquals(new Rect(0, 100, 0, 100), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 100, 0, 100), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 100, 0, 100), insets.getInsets(Type.all()));
assertEquals(INSET_SIDE_TOP, typeSideMap.get(TYPE_TOP_BAR));
assertEquals(INSET_SIDE_BOTTOM, typeSideMap.get(TYPE_IME));
+ assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.topBar()));
+ assertEquals(Insets.of(0, 0, 0, 100), insets.getInsets(Type.ime()));
}
@Test
@@ -70,7 +78,11 @@ public class InsetsStateTest {
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
DisplayCutout.NO_CUTOUT, null);
assertEquals(100, insets.getStableInsetBottom());
- assertEquals(new Rect(0, 0, 0, 200), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 0, 0, 100), insets.getMaxInsets(Type.all()));
+ assertEquals(Insets.of(0, 0, 0, 200), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 0, 0, 200), insets.getInsets(Type.all()));
+ assertEquals(Insets.of(0, 0, 0, 100), insets.getInsets(Type.sideBars()));
+ assertEquals(Insets.of(0, 0, 0, 200), insets.getInsets(Type.ime()));
}
@Test
@@ -81,7 +93,9 @@ public class InsetsStateTest {
mState.getSource(TYPE_NAVIGATION_BAR).setVisible(true);
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
DisplayCutout.NO_CUTOUT, null);
- assertEquals(new Rect(0, 100, 20, 0), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets());
+ assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.topBar()));
+ assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(Type.sideBars()));
}
@Test
diff --git a/core/tests/coretests/src/android/view/KeyEventTest.java b/core/tests/coretests/src/android/view/KeyEventTest.java
index b9d95e542f11..88d3bdbe3c92 100644
--- a/core/tests/coretests/src/android/view/KeyEventTest.java
+++ b/core/tests/coretests/src/android/view/KeyEventTest.java
@@ -20,8 +20,8 @@ import static android.view.Display.INVALID_DISPLAY;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/ListContextMenu.java b/core/tests/coretests/src/android/view/ListContextMenu.java
index 1b4ece6b8eef..e333b9638d25 100644
--- a/core/tests/coretests/src/android/view/ListContextMenu.java
+++ b/core/tests/coretests/src/android/view/ListContextMenu.java
@@ -16,24 +16,17 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.SubMenu;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.LayoutInflater;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
/**
* Exercises context menus in lists
*/
diff --git a/core/tests/coretests/src/android/view/Longpress.java b/core/tests/coretests/src/android/view/Longpress.java
index e8e6f13e30e9..86fa9e54afd3 100644
--- a/core/tests/coretests/src/android/view/Longpress.java
+++ b/core/tests/coretests/src/android/view/Longpress.java
@@ -16,11 +16,11 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class Longpress extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/core/tests/coretests/src/android/view/LongpressTest.java b/core/tests/coretests/src/android/view/LongpressTest.java
index d3d7589ae641..4dfecd0b2055 100644
--- a/core/tests/coretests/src/android/view/LongpressTest.java
+++ b/core/tests/coretests/src/android/view/LongpressTest.java
@@ -18,11 +18,12 @@ package android.view;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.KeyUtils;
import android.view.View.OnLongClickListener;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/MenuTest.java b/core/tests/coretests/src/android/view/MenuTest.java
index 116b38a6551b..794769cc032f 100644
--- a/core/tests/coretests/src/android/view/MenuTest.java
+++ b/core/tests/coretests/src/android/view/MenuTest.java
@@ -17,7 +17,8 @@
package android.view;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.frameworks.coretests.R;
import com.android.internal.view.menu.MenuBuilder;
diff --git a/core/tests/coretests/src/android/view/Merge.java b/core/tests/coretests/src/android/view/Merge.java
index bdacd819d2e8..8020e4b07815 100644
--- a/core/tests/coretests/src/android/view/Merge.java
+++ b/core/tests/coretests/src/android/view/Merge.java
@@ -16,13 +16,11 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
import android.app.Activity;
+import android.os.Bundle;
import android.widget.LinearLayout;
-import android.view.ViewGroup;
-import android.view.LayoutInflater;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise <merge /> tag in XML files.
diff --git a/core/tests/coretests/src/android/view/MergeTest.java b/core/tests/coretests/src/android/view/MergeTest.java
index acfee7eca036..eccc9cb23e2a 100644
--- a/core/tests/coretests/src/android/view/MergeTest.java
+++ b/core/tests/coretests/src/android/view/MergeTest.java
@@ -16,11 +16,9 @@
package android.view;
-import android.view.Merge;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.ViewGroup;
+
+import androidx.test.filters.MediumTest;
public class MergeTest extends ActivityInstrumentationTestCase<Merge> {
public MergeTest() {
diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java
index 023526f7e37f..cadf37e0c53c 100644
--- a/core/tests/coretests/src/android/view/MotionEventTest.java
+++ b/core/tests/coretests/src/android/view/MotionEventTest.java
@@ -22,11 +22,12 @@ import static android.view.MotionEvent.TOOL_TYPE_FINGER;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.MotionEvent.PointerCoords;
import android.view.MotionEvent.PointerProperties;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/MutateDrawable.java b/core/tests/coretests/src/android/view/MutateDrawable.java
index 39b57894696f..1ec525d6fe9e 100644
--- a/core/tests/coretests/src/android/view/MutateDrawable.java
+++ b/core/tests/coretests/src/android/view/MutateDrawable.java
@@ -18,8 +18,9 @@ package android.view;
import android.app.Activity;
import android.os.Bundle;
-import android.widget.LinearLayout;
import android.widget.Button;
+import android.widget.LinearLayout;
+
import com.android.frameworks.coretests.R;
public class MutateDrawable extends Activity {
diff --git a/core/tests/coretests/src/android/view/MutateDrawableTest.java b/core/tests/coretests/src/android/view/MutateDrawableTest.java
index 74e011d28508..d63ffb17208f 100644
--- a/core/tests/coretests/src/android/view/MutateDrawableTest.java
+++ b/core/tests/coretests/src/android/view/MutateDrawableTest.java
@@ -17,9 +17,8 @@
package android.view;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-import android.view.MutateDrawable;
+
+import androidx.test.filters.MediumTest;
public class MutateDrawableTest extends ActivityInstrumentationTestCase2<MutateDrawable> {
private View mFirstButton;
diff --git a/core/tests/coretests/src/android/view/PinchZoomAction.java b/core/tests/coretests/src/android/view/PinchZoomAction.java
index 97fe980e01dc..bec9b557a40d 100644
--- a/core/tests/coretests/src/android/view/PinchZoomAction.java
+++ b/core/tests/coretests/src/android/view/PinchZoomAction.java
@@ -30,8 +30,6 @@ import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.Swiper;
import android.support.test.espresso.util.HumanReadables;
-import android.view.MotionEvent;
-import android.view.View;
import org.hamcrest.Matcher;
diff --git a/core/tests/coretests/src/android/view/PopupWindowVisibility.java b/core/tests/coretests/src/android/view/PopupWindowVisibility.java
index 85ce04fae71b..e6430d3cea32 100644
--- a/core/tests/coretests/src/android/view/PopupWindowVisibility.java
+++ b/core/tests/coretests/src/android/view/PopupWindowVisibility.java
@@ -18,7 +18,6 @@ package android.view;
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
diff --git a/core/tests/coretests/src/android/view/PreDrawListener.java b/core/tests/coretests/src/android/view/PreDrawListener.java
index 60bbee483173..77bd36c9001a 100644
--- a/core/tests/coretests/src/android/view/PreDrawListener.java
+++ b/core/tests/coretests/src/android/view/PreDrawListener.java
@@ -20,15 +20,12 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewTreeObserver;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import com.android.frameworks.coretests.R;
-
/**
* Tests views with popupWindows becoming invisible
*/
diff --git a/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java b/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java
index b52d98c906c4..786c22bf04f6 100644
--- a/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java
+++ b/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java
@@ -21,10 +21,11 @@ import static org.junit.Assert.assertNull;
import android.app.Activity;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/RunQueue.java b/core/tests/coretests/src/android/view/RunQueue.java
index 85dd32e720bd..75444339a1aa 100644
--- a/core/tests/coretests/src/android/view/RunQueue.java
+++ b/core/tests/coretests/src/android/view/RunQueue.java
@@ -19,8 +19,7 @@ package android.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
-import android.view.View;
-import android.view.ViewTreeObserver;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/RunQueueTest.java b/core/tests/coretests/src/android/view/RunQueueTest.java
index d69860beace4..f42f5902a5c3 100644
--- a/core/tests/coretests/src/android/view/RunQueueTest.java
+++ b/core/tests/coretests/src/android/view/RunQueueTest.java
@@ -17,7 +17,8 @@
package android.view;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
public class RunQueueTest extends ActivityInstrumentationTestCase<RunQueue> {
public RunQueueTest() {
diff --git a/core/tests/coretests/src/android/view/ScaleGesture.java b/core/tests/coretests/src/android/view/ScaleGesture.java
index a954a4a497e2..235b2244e3f8 100644
--- a/core/tests/coretests/src/android/view/ScaleGesture.java
+++ b/core/tests/coretests/src/android/view/ScaleGesture.java
@@ -16,16 +16,11 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.MotionEvent;
-import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
-import android.widget.TextView;
+
+import com.android.frameworks.coretests.R;
public class ScaleGesture extends Activity {
private ScaleGestureDetector mScaleGestureDetector;
diff --git a/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java b/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java
index fba8eae6c3dd..199013513bb3 100644
--- a/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java
+++ b/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java
@@ -16,26 +16,22 @@
package android.view;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
import android.content.Context;
-import android.support.test.filters.LargeTest;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.util.DisplayMetrics;
-import android.view.PinchZoomAction;
-import android.view.ScaleGesture;
-import android.view.WindowManager;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import com.android.frameworks.coretests.R;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.Espresso.onView;
@LargeTest
public class ScaleGestureDetectorTest extends ActivityInstrumentationTestCase2<ScaleGesture> {
diff --git a/core/tests/coretests/src/android/view/SetTagsTest.java b/core/tests/coretests/src/android/view/SetTagsTest.java
index 373dce68d495..16997139d83f 100644
--- a/core/tests/coretests/src/android/view/SetTagsTest.java
+++ b/core/tests/coretests/src/android/view/SetTagsTest.java
@@ -16,12 +16,13 @@
package android.view;
-import com.android.frameworks.coretests.R;
-import android.test.suitebuilder.annotation.MediumTest;
-
import android.test.ActivityInstrumentationTestCase2;
import android.widget.Button;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* Exercises {@link android.view.View}'s tags property.
*/
diff --git a/core/tests/coretests/src/android/view/StubbedView.java b/core/tests/coretests/src/android/view/StubbedView.java
index 612095c4e43d..c96b9b704a54 100644
--- a/core/tests/coretests/src/android/view/StubbedView.java
+++ b/core/tests/coretests/src/android/view/StubbedView.java
@@ -16,11 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
import android.app.Activity;
-import android.view.View;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise <ViewStub /> tag in XML files.
diff --git a/core/tests/coretests/src/android/view/VelocityTest.java b/core/tests/coretests/src/android/view/VelocityTest.java
index 7f32208659be..c116f4dc8a43 100644
--- a/core/tests/coretests/src/android/view/VelocityTest.java
+++ b/core/tests/coretests/src/android/view/VelocityTest.java
@@ -16,16 +16,17 @@
package android.view;
-import android.test.suitebuilder.annotation.Suppress;
-import junit.framework.Assert;
-
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
+import junit.framework.Assert;
+
/**
* Exercises {@link android.view.VelocityTracker} to compute correct velocity.<br>
* To launch this test, use :<br>
diff --git a/core/tests/coretests/src/android/view/ViewAttachTest.java b/core/tests/coretests/src/android/view/ViewAttachTest.java
index aa8f8d82e725..1a8dd9909b03 100644
--- a/core/tests/coretests/src/android/view/ViewAttachTest.java
+++ b/core/tests/coretests/src/android/view/ViewAttachTest.java
@@ -16,16 +16,13 @@
package android.view;
-import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.os.SystemClock;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/view/ViewAttachTestActivity.java b/core/tests/coretests/src/android/view/ViewAttachTestActivity.java
index 59e25aee7dc5..bcbc8134c226 100644
--- a/core/tests/coretests/src/android/view/ViewAttachTestActivity.java
+++ b/core/tests/coretests/src/android/view/ViewAttachTestActivity.java
@@ -16,11 +16,11 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class ViewAttachTestActivity extends Activity {
public static final String TAG = "OnAttachedTest";
@Override
diff --git a/core/tests/coretests/src/android/view/ViewAttachView.java b/core/tests/coretests/src/android/view/ViewAttachView.java
index 5af2d8f33cab..2f3ff8f8769e 100644
--- a/core/tests/coretests/src/android/view/ViewAttachView.java
+++ b/core/tests/coretests/src/android/view/ViewAttachView.java
@@ -22,7 +22,6 @@ import android.graphics.Color;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.View;
/**
* A View that will throw a RuntimeException if onAttachedToWindow and
diff --git a/core/tests/coretests/src/android/view/ViewCaptureTest.java b/core/tests/coretests/src/android/view/ViewCaptureTest.java
index 4405934e62e5..218047c5f45e 100644
--- a/core/tests/coretests/src/android/view/ViewCaptureTest.java
+++ b/core/tests/coretests/src/android/view/ViewCaptureTest.java
@@ -21,14 +21,15 @@ import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseIntArray;
import android.view.ViewDebug.CanvasProvider;
import android.view.ViewDebug.HardwareCanvasProvider;
import android.view.ViewDebug.SoftwareCanvasProvider;
+import androidx.test.filters.SmallTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import org.junit.Assert;
diff --git a/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java b/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java
index 20e3eb585435..2f51c2459af9 100644
--- a/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java
+++ b/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java
@@ -19,6 +19,7 @@ package android.view;
import android.annotation.Nullable;
import android.app.Activity;
import android.os.Bundle;
+
import com.android.frameworks.coretests.R;
public class ViewCaptureTestActivity extends Activity {
diff --git a/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java b/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java
index b4ef0e7e76bd..c24cd35ff256 100644
--- a/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java
+++ b/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java
@@ -18,7 +18,8 @@ package android.view;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
public class ViewGroupAttributesTest extends AndroidTestCase {
diff --git a/core/tests/coretests/src/android/view/ViewGroupChildren.java b/core/tests/coretests/src/android/view/ViewGroupChildren.java
index f39720b269b3..d5d98793499e 100644
--- a/core/tests/coretests/src/android/view/ViewGroupChildren.java
+++ b/core/tests/coretests/src/android/view/ViewGroupChildren.java
@@ -16,12 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
-import android.widget.Button;
-import android.view.View;
import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise ViewGroup's ability to add and remove children.
diff --git a/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java b/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java
index d1665ef8cf14..07cb2a144f32 100644
--- a/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java
+++ b/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java
@@ -16,18 +16,16 @@
package android.view;
-import com.android.frameworks.coretests.R;
-import android.view.ViewGroupChildren;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
-import android.test.UiThreadTest;
-import android.view.View;
-import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* Exercises {@link android.view.ViewGroup}'s ability to add/remove children.
*/
diff --git a/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java
index 93ad41f08b06..54524b2c8e70 100644
--- a/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java
+++ b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java
@@ -22,12 +22,13 @@ import static junit.framework.Assert.fail;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.widget.FrameLayout;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/ViewInvalidateTest.java b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
index 115504b50adf..c25a2deb2a05 100644
--- a/core/tests/coretests/src/android/view/ViewInvalidateTest.java
+++ b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
@@ -21,24 +21,30 @@ import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
+import android.view.ViewTreeObserver.OnDrawListener;
import android.widget.FrameLayout;
-import com.android.compatibility.common.util.WidgetTestUtils;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
/**
* Test of invalidates, drawing, and the flags that support them
*/
@@ -281,4 +287,42 @@ public class ViewInvalidateTest {
View.PFLAG_DRAWN);
assertTrue(getViewRoot(mParent).mIsAnimating);
}
+
+ /** Copied from cts/common/device-side/util. */
+ static class WidgetTestUtils {
+ public static void runOnMainAndDrawSync(@NonNull final ActivityTestRule activityTestRule,
+ @NonNull final View view, @Nullable final Runnable runner) throws Throwable {
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ activityTestRule.runOnUiThread(() -> {
+ final OnDrawListener listener = new OnDrawListener() {
+ @Override
+ public void onDraw() {
+ // posting so that the sync happens after the draw that's about to happen
+ view.post(() -> {
+ activityTestRule.getActivity().getWindow().getDecorView()
+ .getViewTreeObserver().removeOnDrawListener(this);
+ latch.countDown();
+ });
+ }
+ };
+
+ activityTestRule.getActivity().getWindow().getDecorView()
+ .getViewTreeObserver().addOnDrawListener(listener);
+
+ if (runner != null) {
+ runner.run();
+ }
+ view.invalidate();
+ });
+
+ try {
+ Assert.assertTrue("Expected draw pass occurred within 5 seconds",
+ latch.await(5, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
}
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index ca6d6cfedb76..9a5784774d1c 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -23,9 +23,10 @@ import android.content.Context;
import android.graphics.Insets;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/ViewStubTest.java b/core/tests/coretests/src/android/view/ViewStubTest.java
index ebd52a6d7774..504a4eca29a2 100644
--- a/core/tests/coretests/src/android/view/ViewStubTest.java
+++ b/core/tests/coretests/src/android/view/ViewStubTest.java
@@ -16,14 +16,12 @@
package android.view;
-import android.view.StubbedView;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.UiThreadTest;
-import android.view.View;
-import android.view.ViewStub;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
public class ViewStubTest extends ActivityInstrumentationTestCase<StubbedView> {
public ViewStubTest() {
diff --git a/core/tests/coretests/src/android/view/ViewTransientStateTest.java b/core/tests/coretests/src/android/view/ViewTransientStateTest.java
index 36ea01deea22..3f73b0712d55 100644
--- a/core/tests/coretests/src/android/view/ViewTransientStateTest.java
+++ b/core/tests/coretests/src/android/view/ViewTransientStateTest.java
@@ -18,12 +18,11 @@ package android.view;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import com.android.frameworks.coretests.R;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
-import static org.junit.Assert.assertFalse;
+import com.android.frameworks.coretests.R;
/**
* Exercise set View's transient state
diff --git a/core/tests/coretests/src/android/view/Visibility.java b/core/tests/coretests/src/android/view/Visibility.java
index 031568c5a446..8e3de4e4a6a3 100644
--- a/core/tests/coretests/src/android/view/Visibility.java
+++ b/core/tests/coretests/src/android/view/Visibility.java
@@ -16,12 +16,11 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
+import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
-import android.view.View;
-import android.app.Activity;
+
+import com.android.frameworks.coretests.R;
/**
* Exercise View's ability to change their visibility: GONE, INVISIBLE and
diff --git a/core/tests/coretests/src/android/view/VisibilityCallback.java b/core/tests/coretests/src/android/view/VisibilityCallback.java
index f98a0a882764..c9659737e479 100644
--- a/core/tests/coretests/src/android/view/VisibilityCallback.java
+++ b/core/tests/coretests/src/android/view/VisibilityCallback.java
@@ -16,16 +16,15 @@
package android.view;
+import android.app.Activity;
import android.content.Context;
+import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
+import android.widget.Button;
import android.widget.TextView;
-import com.android.frameworks.coretests.R;
-import android.os.Bundle;
-import android.widget.Button;
-import android.view.View;
-import android.app.Activity;
+import com.android.frameworks.coretests.R;
/**
* Exercise View's ability to change their visibility: GONE, INVISIBLE and
diff --git a/core/tests/coretests/src/android/view/VisibilityCallbackTest.java b/core/tests/coretests/src/android/view/VisibilityCallbackTest.java
index ec956d24f29c..d7c7b4c0094f 100644
--- a/core/tests/coretests/src/android/view/VisibilityCallbackTest.java
+++ b/core/tests/coretests/src/android/view/VisibilityCallbackTest.java
@@ -17,12 +17,12 @@
package android.view;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/VisibilityTest.java b/core/tests/coretests/src/android/view/VisibilityTest.java
index 29c1c8a428e7..83a77024cc43 100644
--- a/core/tests/coretests/src/android/view/VisibilityTest.java
+++ b/core/tests/coretests/src/android/view/VisibilityTest.java
@@ -20,11 +20,12 @@ import static android.view.KeyEvent.KEYCODE_DPAD_CENTER;
import static android.view.KeyEvent.KEYCODE_DPAD_LEFT;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.Button;
import android.widget.TextView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/view/WindowInsetsTest.java b/core/tests/coretests/src/android/view/WindowInsetsTest.java
index 1c2df2cfedb1..15a96a144dd5 100644
--- a/core/tests/coretests/src/android/view/WindowInsetsTest.java
+++ b/core/tests/coretests/src/android/view/WindowInsetsTest.java
@@ -16,12 +16,19 @@
package android.view;
+import static android.view.WindowInsets.Type.ime;
+import static android.view.WindowInsets.Type.sideBars;
+
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import android.graphics.Insets;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.view.WindowInsets.Builder;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,13 +40,13 @@ public class WindowInsetsTest {
@Test
public void systemWindowInsets_afterConsuming_isConsumed() {
- assertTrue(new WindowInsets(new Rect(1, 2, 3, 4), null, null, false, false, null)
+ assertTrue(new WindowInsets(new Rect(1, 2, 3, 4), null, false, false, null)
.consumeSystemWindowInsets().isConsumed());
}
@Test
public void multiNullConstructor_isConsumed() {
- assertTrue(new WindowInsets(null, null, null, false, false, null).isConsumed());
+ assertTrue(new WindowInsets((Rect) null, null, false, false, null).isConsumed());
}
@Test
@@ -47,4 +54,12 @@ public class WindowInsetsTest {
assertTrue(new WindowInsets((Rect) null).isConsumed());
}
+ @Test
+ public void typeMap() {
+ Builder b = new WindowInsets.Builder();
+ b.setInsets(sideBars(), Insets.of(0, 0, 0, 100));
+ b.setInsets(ime(), Insets.of(0, 0, 0, 300));
+ WindowInsets insets = b.build();
+ assertEquals(300, insets.getSystemWindowInsets().bottom);
+ }
}
diff --git a/core/tests/coretests/src/android/view/ZeroSized.java b/core/tests/coretests/src/android/view/ZeroSized.java
index f2a6b3ef3f6d..9e2dfcb8e3d4 100644
--- a/core/tests/coretests/src/android/view/ZeroSized.java
+++ b/core/tests/coretests/src/android/view/ZeroSized.java
@@ -16,10 +16,10 @@
package android.view;
-import com.android.frameworks.coretests.R;
-
-import android.os.Bundle;
import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
/**
* This activity contains Views with various widths and heights. The goal is to exercise the
diff --git a/core/tests/coretests/src/android/view/ZeroSizedTest.java b/core/tests/coretests/src/android/view/ZeroSizedTest.java
index 193fc9842e8d..946bf6866d26 100644
--- a/core/tests/coretests/src/android/view/ZeroSizedTest.java
+++ b/core/tests/coretests/src/android/view/ZeroSizedTest.java
@@ -16,13 +16,12 @@
package android.view;
-import android.view.ZeroSized;
-import com.android.frameworks.coretests.R;
-
-import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
import android.graphics.Bitmap;
+import android.test.ActivityInstrumentationTestCase;
+
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
/**
* Builds the drawing cache of Views of various dimension. The assumption is that
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
index 7f675ffffee5..a88968bfd089 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
@@ -28,10 +28,11 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
index 3e03414367bd..46c96c94dc11 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
@@ -21,7 +21,8 @@ import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
index 318d122b3f2f..ab24f89015c7 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
@@ -22,10 +22,12 @@ import static org.mockito.MockitoAnnotations.initMocks;
import android.os.Bundle;
import android.os.RemoteException;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import libcore.util.EmptyArray;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 506e5447a239..0ed690ceeef4 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -25,11 +25,12 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.CollectionUtils;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java b/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java
index 4814c61abe7c..11f4e3cf9304 100644
--- a/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java
@@ -14,7 +14,7 @@
package android.view.accessibility;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
new file mode 100644
index 000000000000..33bc59349230
--- /dev/null
+++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.os.Parcel;
+import android.view.View;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class AutofillIdTest {
+
+ @Test
+ public void testNonVirtual() {
+ final AutofillId id = new AutofillId(42);
+ assertThat(id.getViewId()).isEqualTo(42);
+ assertThat(id.isVirtual()).isFalse();
+ assertThat(id.getVirtualChildId()).isEqualTo(View.NO_ID);
+
+ final AutofillId clone = cloneThroughParcel(id);
+ assertThat(clone.getViewId()).isEqualTo(42);
+ assertThat(clone.isVirtual()).isFalse();
+ assertThat(clone.getVirtualChildId()).isEqualTo(View.NO_ID);
+ }
+
+ @Test
+ public void testVirtual() {
+ final AutofillId id = new AutofillId(42, 108);
+ assertThat(id.getViewId()).isEqualTo(42);
+ assertThat(id.isVirtual()).isTrue();
+ assertThat(id.getVirtualChildId()).isEqualTo(108);
+
+ final AutofillId clone = cloneThroughParcel(id);
+ assertThat(clone.getViewId()).isEqualTo(42);
+ assertThat(clone.isVirtual()).isTrue();
+ assertThat(clone.getVirtualChildId()).isEqualTo(108);
+ }
+
+ @Test
+ public void testVirtual_parentObjectConstructor() {
+ assertThrows(NullPointerException.class, () -> new AutofillId(null, 108));
+
+ final AutofillId id = new AutofillId(new AutofillId(42), 108);
+ assertThat(id.getViewId()).isEqualTo(42);
+ assertThat(id.isVirtual()).isTrue();
+ assertThat(id.getVirtualChildId()).isEqualTo(108);
+
+ final AutofillId clone = cloneThroughParcel(id);
+ assertThat(clone.getViewId()).isEqualTo(42);
+ assertThat(clone.isVirtual()).isTrue();
+ assertThat(clone.getVirtualChildId()).isEqualTo(108);
+ }
+
+ @Test
+ public void testVirtual_withSession() {
+ final AutofillId id = new AutofillId(new AutofillId(42), 108, 666);
+ assertThat(id.getViewId()).isEqualTo(42);
+ assertThat(id.isVirtual()).isTrue();
+ assertThat(id.getVirtualChildId()).isEqualTo(108);
+ assertThat(id.getSessionId()).isEqualTo(666);
+
+ final AutofillId clone = cloneThroughParcel(id);
+ assertThat(clone.getViewId()).isEqualTo(42);
+ assertThat(clone.isVirtual()).isTrue();
+ assertThat(clone.getVirtualChildId()).isEqualTo(108);
+ assertThat(clone.getSessionId()).isEqualTo(666);
+ }
+
+ @Test
+ public void testEqualsHashCode() {
+ final AutofillId realId = new AutofillId(42);
+ final AutofillId realIdSame = new AutofillId(42);
+ assertThat(realId).isEqualTo(realIdSame);
+ assertThat(realIdSame).isEqualTo(realId);
+ assertThat(realId.hashCode()).isEqualTo(realIdSame.hashCode());
+
+ final AutofillId realIdDifferent = new AutofillId(108);
+ assertThat(realId).isNotEqualTo(realIdDifferent);
+ assertThat(realIdDifferent).isNotEqualTo(realId);
+
+ final AutofillId virtualId = new AutofillId(42, 1);
+ final AutofillId virtualIdSame = new AutofillId(42, 1);
+ assertThat(virtualId).isEqualTo(virtualIdSame);
+ assertThat(virtualIdSame).isEqualTo(virtualId);
+ assertThat(virtualId.hashCode()).isEqualTo(virtualIdSame.hashCode());
+ assertThat(virtualId).isNotEqualTo(realId);
+ assertThat(realId).isNotEqualTo(virtualId);
+
+ final AutofillId virtualIdDifferentChild = new AutofillId(42, 2);
+ assertThat(virtualIdDifferentChild).isNotEqualTo(virtualId);
+ assertThat(virtualId).isNotEqualTo(virtualIdDifferentChild);
+ assertThat(virtualIdDifferentChild).isNotEqualTo(realId);
+ assertThat(realId).isNotEqualTo(virtualIdDifferentChild);
+
+ final AutofillId virtualIdDifferentParent = new AutofillId(108, 1);
+ assertThat(virtualIdDifferentParent).isNotEqualTo(virtualId);
+ assertThat(virtualId).isNotEqualTo(virtualIdDifferentParent);
+ assertThat(virtualIdDifferentParent).isNotEqualTo(virtualIdDifferentChild);
+ assertThat(virtualIdDifferentChild).isNotEqualTo(virtualIdDifferentParent);
+
+ final AutofillId virtualIdDifferentSession = new AutofillId(new AutofillId(42), 1, 108);
+ assertThat(virtualIdDifferentSession).isNotEqualTo(virtualId);
+ assertThat(virtualId).isNotEqualTo(virtualIdDifferentSession);
+ assertThat(virtualIdDifferentSession).isNotEqualTo(realId);
+ assertThat(realId).isNotEqualTo(virtualIdDifferentSession);
+
+ final AutofillId sameVirtualIdDifferentSession = new AutofillId(new AutofillId(42), 1, 108);
+ assertThat(sameVirtualIdDifferentSession).isEqualTo(virtualIdDifferentSession);
+ assertThat(virtualIdDifferentSession).isEqualTo(sameVirtualIdDifferentSession);
+ assertThat(sameVirtualIdDifferentSession.hashCode())
+ .isEqualTo(virtualIdDifferentSession.hashCode());
+ }
+
+ private AutofillId cloneThroughParcel(AutofillId id) {
+ Parcel parcel = Parcel.obtain();
+
+ try {
+ // Write to parcel
+ parcel.setDataPosition(0); // Sanity / paranoid check
+ id.writeToParcel(parcel, 0);
+
+ // Read from parcel
+ parcel.setDataPosition(0);
+ AutofillId clone = AutofillId.CREATOR.createFromParcel(parcel);
+ assertThat(clone).isNotNull();
+ return clone;
+ } finally {
+ parcel.recycle();
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
new file mode 100644
index 000000000000..ff97aa1d3914
--- /dev/null
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.contentcapture;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.view.View;
+import android.view.ViewStructure;
+import android.view.autofill.AutofillId;
+import android.view.contentcapture.ViewNode.ViewStructureImpl;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+/**
+ * Unit test for {@link ContentCaptureSessionTest}.
+ *
+ * <p>To run it:
+ * {@code atest FrameworksCoreTests:android.view.contentcapture.ContentCaptureSessionTest}
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ContentCaptureSessionTest {
+
+ private ContentCaptureSession mSession1 = new MyContentCaptureSession("111");
+
+ private ContentCaptureSession mSession2 = new MyContentCaptureSession("2222");
+
+ @Mock
+ private View mMockView;
+
+ @Test
+ public void testNewAutofillId_invalid() {
+ assertThrows(NullPointerException.class, () -> mSession1.newAutofillId(null, 42));
+ assertThrows(IllegalArgumentException.class,
+ () -> mSession1.newAutofillId(new AutofillId(42, 42), 42));
+ }
+
+ @Test
+ public void testNewAutofillId_valid() {
+ final AutofillId parentId = new AutofillId(42);
+ final AutofillId childId = mSession1.newAutofillId(parentId, 108);
+ assertThat(childId.getViewId()).isEqualTo(42);
+ assertThat(childId.getVirtualChildId()).isEqualTo(108);
+ assertThat(childId.getSessionId()).isEqualTo(mSession1.getIdAsInt());
+ }
+
+ @Test
+ public void testNewAutofillId_differentSessions() {
+ assertThat(mSession1.getIdAsInt()).isNotSameAs(mSession2.getIdAsInt()); //sanity check
+ final AutofillId parentId = new AutofillId(42);
+ final AutofillId childId1 = mSession1.newAutofillId(parentId, 108);
+ final AutofillId childId2 = mSession2.newAutofillId(parentId, 108);
+ assertThat(childId1).isNotEqualTo(childId2);
+ assertThat(childId2).isNotEqualTo(childId1);
+ }
+
+ @Test
+ public void testNotifyXXX_null() {
+ assertThrows(NullPointerException.class, () -> mSession1.notifyViewAppeared(null));
+ assertThrows(NullPointerException.class, () -> mSession1.notifyViewDisappeared(null));
+ assertThrows(NullPointerException.class,
+ () -> mSession1.notifyViewTextChanged(null, "whatever", 0));
+ }
+
+ @Test
+ public void testNewViewStructure() {
+ assertThat(mMockView.getAutofillId()).isNotNull(); // sanity check
+ final ViewStructure structure = mSession1.newViewStructure(mMockView);
+ assertThat(structure).isNotNull();
+ assertThat(structure.getAutofillId()).isEqualTo(mMockView.getAutofillId());
+ }
+
+ @Test
+ public void testNewVirtualViewStructure() {
+ final AutofillId parentId = new AutofillId(42);
+ final ViewStructure structure = mSession1.newVirtualViewStructure(parentId, 108);
+ assertThat(structure).isNotNull();
+ final AutofillId childId = mSession1.newAutofillId(parentId, 108);
+ assertThat(structure.getAutofillId()).isEqualTo(childId);
+ }
+
+ @Test
+ public void testNotifyViewsDisappeared_invalid() {
+ // Null parent
+ assertThrows(NullPointerException.class,
+ () -> mSession1.notifyViewsDisappeared(null, new int[] {42}));
+ // Null child
+ assertThrows(IllegalArgumentException.class,
+ () -> mSession1.notifyViewsDisappeared(new AutofillId(42), null));
+ // Empty child
+ assertThrows(IllegalArgumentException.class,
+ () -> mSession1.notifyViewsDisappeared(new AutofillId(42), new int[] {}));
+ // Virtual parent
+ assertThrows(IllegalArgumentException.class,
+ () -> mSession1.notifyViewsDisappeared(new AutofillId(42, 108), new int[] {666}));
+ }
+
+ // Cannot use @Spy because we need to pass the session id on constructor
+ private class MyContentCaptureSession extends ContentCaptureSession {
+
+ private MyContentCaptureSession(String id) {
+ super(id);
+ }
+
+ @Override
+ MainContentCaptureSession getMainCaptureSession() {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ ContentCaptureSession newChild(ContentCaptureContext context) {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ void flush(int reason) {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ void onDestroy() {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ void internalNotifyViewAppeared(ViewStructureImpl node) {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ void internalNotifyViewDisappeared(AutofillId id) {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+
+ @Override
+ void internalNotifyViewTextChanged(AutofillId id, CharSequence text) {
+ throw new UnsupportedOperationException("should not have been called");
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java b/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java
new file mode 100644
index 000000000000..eadde6280848
--- /dev/null
+++ b/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.contentcapture;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.graphics.Matrix;
+import android.os.Bundle;
+import android.os.LocaleList;
+import android.os.Parcel;
+import android.view.View;
+import android.view.ViewStructure.HtmlInfo;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
+import android.view.contentcapture.ViewNode.ViewStructureImpl;
+import android.widget.FrameLayout;
+
+import androidx.test.InstrumentationRegistry;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.Locale;
+
+/**
+ * Unit test for {@link ViewNode}.
+ *
+ * <p>To run it: {@code atest FrameworksCoreTests:android.view.contentcapture.ViewNodeTest}
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ViewNodeTest {
+
+ private final Context mContext = InstrumentationRegistry.getTargetContext();
+
+ @Mock
+ private HtmlInfo mHtmlInfoMock;
+
+ @Test
+ public void testAutofillIdMethods_orphanView() {
+ View view = new View(mContext);
+ AutofillId initialId = new AutofillId(42);
+ view.setAutofillId(initialId);
+
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+ ViewNode node = structure.getNode();
+
+ assertThat(node.getAutofillId()).isEqualTo(initialId);
+ assertThat(node.getParentAutofillId()).isNull();
+
+ AutofillId newId = new AutofillId(108);
+ structure.setAutofillId(newId);
+ assertThat(node.getAutofillId()).isEqualTo(newId);
+ assertThat(node.getParentAutofillId()).isNull();
+
+ structure.setAutofillId(new AutofillId(66), 6);
+ assertThat(node.getAutofillId()).isEqualTo(new AutofillId(66, 6));
+ assertThat(node.getParentAutofillId()).isEqualTo(new AutofillId(66));
+ }
+
+ @Test
+ public void testAutofillIdMethods_parentedView() {
+ FrameLayout parent = new FrameLayout(mContext);
+ AutofillId initialParentId = new AutofillId(48);
+ parent.setAutofillId(initialParentId);
+
+ View child = new View(mContext);
+ AutofillId initialChildId = new AutofillId(42);
+ child.setAutofillId(initialChildId);
+
+ parent.addView(child);
+
+ ViewStructureImpl structure = new ViewStructureImpl(child);
+ ViewNode node = structure.getNode();
+
+ assertThat(node.getAutofillId()).isEqualTo(initialChildId);
+ assertThat(node.getParentAutofillId()).isEqualTo(initialParentId);
+
+ AutofillId newChildId = new AutofillId(108);
+ structure.setAutofillId(newChildId);
+ assertThat(node.getAutofillId()).isEqualTo(newChildId);
+ assertThat(node.getParentAutofillId()).isEqualTo(initialParentId);
+
+ AutofillId newParentId = new AutofillId(15162342);
+ parent.setAutofillId(newParentId);
+ assertThat(node.getAutofillId()).isEqualTo(newChildId);
+ assertThat(node.getParentAutofillId()).isEqualTo(initialParentId);
+
+ structure.setAutofillId(new AutofillId(66), 6);
+ assertThat(node.getAutofillId()).isEqualTo(new AutofillId(66, 6));
+ assertThat(node.getParentAutofillId()).isEqualTo(new AutofillId(66));
+ }
+
+ @Test
+ public void testAutofillIdMethods_explicitIdsConstructor() {
+ AutofillId initialParentId = new AutofillId(42);
+ ViewStructureImpl structure = new ViewStructureImpl(initialParentId, 108, 666);
+ ViewNode node = structure.getNode();
+
+ assertThat(node.getAutofillId()).isEqualTo(new AutofillId(initialParentId, 108, 666));
+ assertThat(node.getParentAutofillId()).isEqualTo(initialParentId);
+
+ AutofillId newChildId = new AutofillId(108);
+ structure.setAutofillId(newChildId);
+ assertThat(node.getAutofillId()).isEqualTo(newChildId);
+ assertThat(node.getParentAutofillId()).isEqualTo(initialParentId);
+
+ structure.setAutofillId(new AutofillId(66), 6);
+ assertThat(node.getAutofillId()).isEqualTo(new AutofillId(66, 6));
+ assertThat(node.getParentAutofillId()).isEqualTo(new AutofillId(66));
+ }
+
+ @Test
+ public void testInvalidSetters() {
+ View view = new View(mContext);
+ AutofillId initialId = new AutofillId(42);
+ view.setAutofillId(initialId);
+
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+ ViewNode node = structure.getNode();
+ assertThat(node.getAutofillId()).isEqualTo(initialId); // sanity check
+
+ assertThrows(NullPointerException.class, () -> structure.setAutofillId(null));
+ assertThat(node.getAutofillId()).isEqualTo(initialId); // invariant
+
+ assertThrows(NullPointerException.class, () -> structure.setAutofillId(null, 666));
+ assertThat(node.getAutofillId()).isEqualTo(initialId); // invariant
+
+ assertThrows(NullPointerException.class, () -> structure.setTextIdEntry(null));
+ assertThat(node.getTextIdEntry()).isNull();
+ }
+
+ @Test
+ public void testUnsupportedProperties() {
+ View view = new View(mContext);
+
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+ ViewNode node = structure.getNode();
+
+ structure.setChildCount(1);
+ assertThat(node.getChildCount()).isEqualTo(0);
+
+ structure.addChildCount(1);
+ assertThat(node.getChildCount()).isEqualTo(0);
+
+ assertThat(structure.newChild(0)).isNull();
+ assertThat(node.getChildCount()).isEqualTo(0);
+
+ assertThat(structure.asyncNewChild(0)).isNull();
+ assertThat(node.getChildCount()).isEqualTo(0);
+
+ structure.asyncCommit();
+ assertThat(node.getChildCount()).isEqualTo(0);
+
+ structure.setWebDomain("Y U NO SET?");
+ assertThat(node.getWebDomain()).isNull();
+
+ assertThat(structure.newHtmlInfoBuilder("WHATEVER")).isNull();
+
+ structure.setHtmlInfo(mHtmlInfoMock);
+ assertThat(node.getHtmlInfo()).isNull();
+
+ structure.setDataIsSensitive(true);
+
+ assertThat(structure.getTempRect()).isNull();
+
+ // Graphic properties
+ structure.setElevation(6.66f);
+ assertThat(node.getElevation()).isWithin(1.0e-10f).of(0f);
+ structure.setAlpha(66.6f);
+ assertThat(node.getAlpha()).isWithin(1.0e-10f).of(1.0f);
+ structure.setTransformation(Matrix.IDENTITY_MATRIX);
+ assertThat(node.getTransformation()).isNull();
+ }
+
+ @Test
+ public void testValidProperties_directly() {
+ ViewStructureImpl structure = newSimpleStructure();
+ assertSimpleStructure(structure);
+ assertSimpleNode(structure.getNode());
+ }
+
+ @Test
+ public void testValidProperties_throughParcel() {
+ ViewStructureImpl structure = newSimpleStructure();
+ final ViewNode node = structure.getNode();
+ assertSimpleNode(node); // sanity check
+
+ final ViewNode clone = cloneThroughParcel(node);
+ assertSimpleNode(clone);
+ }
+
+ @Test
+ public void testComplexText_directly() {
+ ViewStructureImpl structure = newStructureWithComplexText();
+ assertStructureWithComplexText(structure);
+ assertNodeWithComplexText(structure.getNode());
+ }
+
+ @Test
+ public void testComplexText_throughParcel() {
+ ViewStructureImpl structure = newStructureWithComplexText();
+ final ViewNode node = structure.getNode();
+ assertNodeWithComplexText(node); // sanity check
+
+ ViewNode clone = cloneThroughParcel(node);
+ assertNodeWithComplexText(clone);
+ }
+
+ @Test
+ public void testVisibility() {
+ // Visibility is a special case becase it use flag masks, so we want to make sure it works
+ // fine
+ View view = new View(mContext);
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+ ViewNode node = structure.getNode();
+
+ structure.setVisibility(View.VISIBLE);
+ assertThat(node.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.VISIBLE);
+
+ structure.setVisibility(View.GONE);
+ assertThat(node.getVisibility()).isEqualTo(View.GONE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.GONE);
+
+ structure.setVisibility(View.VISIBLE);
+ assertThat(node.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.VISIBLE);
+
+ structure.setVisibility(View.INVISIBLE);
+ assertThat(node.getVisibility()).isEqualTo(View.INVISIBLE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.INVISIBLE);
+
+ structure.setVisibility(View.INVISIBLE | View.GONE);
+ assertThat(node.getVisibility()).isEqualTo(View.INVISIBLE | View.GONE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.INVISIBLE | View.GONE);
+
+
+ final int invalidValue = Math.max(Math.max(View.VISIBLE, View.INVISIBLE), View.GONE) * 2;
+ structure.setVisibility(View.VISIBLE);
+ structure.setVisibility(invalidValue); // should be ignored
+ assertThat(node.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.VISIBLE);
+
+ structure.setVisibility(View.GONE | invalidValue);
+ assertThat(node.getVisibility()).isEqualTo(View.GONE);
+ assertThat(cloneThroughParcel(node).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ /**
+ * Creates a {@link ViewStructureImpl} that can be asserted through
+ * {@link #assertSimpleNode(ViewNode)}.
+ */
+ private ViewStructureImpl newSimpleStructure() {
+ View view = new View(mContext);
+ view.setAutofillId(new AutofillId(42));
+
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+
+ // Basic properties
+ structure.setText("Text is set!");
+ structure.setClassName("Classy!");
+ structure.setContentDescription("Described I am!");
+ structure.setVisibility(View.INVISIBLE);
+
+ // Autofill properties
+ structure.setAutofillType(View.AUTOFILL_TYPE_TEXT);
+ structure.setAutofillHints(new String[] { "Auto", "Man" });
+ structure.setAutofillOptions(new String[] { "Maybe" });
+ structure.setAutofillValue(AutofillValue.forText("Malkovich"));
+
+ // Extra text properties
+ structure.setMinTextEms(6);
+ structure.setMaxTextLength(66);
+ structure.setMaxTextEms(666);
+ structure.setInputType(42);
+ structure.setTextIdEntry("TEXT, Y U NO ENTRY?");
+ structure.setLocaleList(new LocaleList(Locale.US, Locale.ENGLISH));
+
+ // Resource id
+ structure.setId(16, "package.name", "type.name", "entry.name");
+
+ // Dimensions
+ structure.setDimens(4, 8, 15, 16, 23, 42);
+
+ // Boolean properties
+ structure.setAssistBlocked(true);
+ structure.setEnabled(true);
+ structure.setClickable(true);
+ structure.setLongClickable(true);
+ structure.setContextClickable(true);
+ structure.setFocusable(true);
+ structure.setFocused(true);
+ structure.setAccessibilityFocused(true);
+ structure.setChecked(true);
+ structure.setActivated(true);
+ structure.setOpaque(true);
+
+ // Bundle
+ assertThat(structure.hasExtras()).isFalse();
+ final Bundle bundle = structure.getExtras();
+ assertThat(bundle).isNotNull();
+ bundle.putString("Marlon", "Bundle");
+ assertThat(structure.hasExtras()).isTrue();
+ return structure;
+ }
+
+ /**
+ * Asserts the properties of a {@link ViewNode} that was created by
+ * {@link #newSimpleStructure()}.
+ */
+ private void assertSimpleNode(ViewNode node) {
+
+ // Basic properties
+ assertThat(node.getAutofillId()).isEqualTo(new AutofillId(42));
+ assertThat(node.getParentAutofillId()).isNull();
+ assertThat(node.getText()).isEqualTo("Text is set!");
+ assertThat(node.getClassName()).isEqualTo("Classy!");
+ assertThat(node.getContentDescription().toString()).isEqualTo("Described I am!");
+ assertThat(node.getVisibility()).isEqualTo(View.INVISIBLE);
+
+ // Autofill properties
+ assertThat(node.getAutofillType()).isEqualTo(View.AUTOFILL_TYPE_TEXT);
+ assertThat(node.getAutofillHints()).asList().containsExactly("Auto", "Man").inOrder();
+ assertThat(node.getAutofillOptions()).asList().containsExactly("Maybe").inOrder();
+ assertThat(node.getAutofillValue().getTextValue()).isEqualTo("Malkovich");
+
+ // Extra text properties
+ assertThat(node.getMinTextEms()).isEqualTo(6);
+ assertThat(node.getMaxTextLength()).isEqualTo(66);
+ assertThat(node.getMaxTextEms()).isEqualTo(666);
+ assertThat(node.getInputType()).isEqualTo(42);
+ assertThat(node.getTextIdEntry()).isEqualTo("TEXT, Y U NO ENTRY?");
+ assertThat(node.getLocaleList()).isEqualTo(new LocaleList(Locale.US, Locale.ENGLISH));
+
+ // Resource id
+ assertThat(node.getId()).isEqualTo(16);
+ assertThat(node.getIdPackage()).isEqualTo("package.name");
+ assertThat(node.getIdType()).isEqualTo("type.name");
+ assertThat(node.getIdEntry()).isEqualTo("entry.name");
+
+ // Dimensions
+ assertThat(node.getLeft()).isEqualTo(4);
+ assertThat(node.getTop()).isEqualTo(8);
+ assertThat(node.getScrollX()).isEqualTo(15);
+ assertThat(node.getScrollY()).isEqualTo(16);
+ assertThat(node.getWidth()).isEqualTo(23);
+ assertThat(node.getHeight()).isEqualTo(42);
+
+ // Boolean properties
+ assertThat(node.isAssistBlocked()).isTrue();
+ assertThat(node.isEnabled()).isTrue();
+ assertThat(node.isClickable()).isTrue();
+ assertThat(node.isLongClickable()).isTrue();
+ assertThat(node.isContextClickable()).isTrue();
+ assertThat(node.isFocusable()).isTrue();
+ assertThat(node.isFocused()).isTrue();
+ assertThat(node.isAccessibilityFocused()).isTrue();
+ assertThat(node.isChecked()).isTrue();
+ assertThat(node.isActivated()).isTrue();
+ assertThat(node.isOpaque()).isTrue();
+
+ // Bundle
+ final Bundle bundle = node.getExtras();
+ assertThat(bundle).isNotNull();
+ assertThat(bundle.size()).isEqualTo(1);
+ assertThat(bundle.getString("Marlon")).isEqualTo("Bundle");
+ }
+
+ /**
+ * Asserts the properties of a {@link ViewStructureImpl} that was created by
+ * {@link #newSimpleStructure()}.
+ */
+ private void assertSimpleStructure(ViewStructureImpl structure) {
+ assertThat(structure.getAutofillId()).isEqualTo(new AutofillId(42));
+ assertThat(structure.getText()).isEqualTo("Text is set!");
+
+ // Bundle
+ final Bundle bundle = structure.getExtras();
+ assertThat(bundle.size()).isEqualTo(1);
+ assertThat(bundle.getString("Marlon")).isEqualTo("Bundle");
+ }
+
+ /**
+ * Creates a {@link ViewStructureImpl} with "complex" text properties (such as selection); it
+ * can be asserted through {@link #assertNodeWithComplexText(ViewNode)}.
+ */
+ private ViewStructureImpl newStructureWithComplexText() {
+ View view = new View(mContext);
+ ViewStructureImpl structure = new ViewStructureImpl(view);
+ structure.setText("IGNORE ME!");
+ structure.setText("Now we're talking!", 4, 8);
+ structure.setHint("Soylent Green is SPOILER ALERT");
+ structure.setTextStyle(15.0f, 16, 23, 42);
+ structure.setTextLines(new int[] {4, 8, 15} , new int[] {16, 23, 42});
+ return structure;
+ }
+
+ /**
+ * Asserts the properties of a {@link ViewNode} that was created by
+ * {@link #newStructureWithComplexText()}.
+ */
+ private void assertNodeWithComplexText(ViewNode node) {
+ assertThat(node.getText()).isEqualTo("Now we're talking!");
+ assertThat(node.getTextSelectionStart()).isEqualTo(4);
+ assertThat(node.getTextSelectionEnd()).isEqualTo(8);
+ assertThat(node.getHint()).isEqualTo("Soylent Green is SPOILER ALERT");
+ assertThat(node.getTextSize()).isWithin(1.0e-10f).of(15.0f);
+ assertThat(node.getTextColor()).isEqualTo(16);
+ assertThat(node.getTextBackgroundColor()).isEqualTo(23);
+ assertThat(node.getTextStyle()).isEqualTo(42);
+ assertThat(node.getTextLineCharOffsets()).asList().containsExactly(4, 8, 15).inOrder();
+ assertThat(node.getTextLineBaselines()).asList().containsExactly(16, 23, 42).inOrder();
+ }
+
+ /**
+ * Asserts the properties of a {@link ViewStructureImpl} that was created by
+ * {@link #newStructureWithComplexText()}.
+ */
+ private void assertStructureWithComplexText(ViewStructureImpl structure) {
+ assertThat(structure.getText()).isEqualTo("Now we're talking!");
+ assertThat(structure.getTextSelectionStart()).isEqualTo(4);
+ assertThat(structure.getTextSelectionEnd()).isEqualTo(8);
+ assertThat(structure.getHint()).isEqualTo("Soylent Green is SPOILER ALERT");
+ }
+
+ private ViewNode cloneThroughParcel(ViewNode node) {
+ Parcel parcel = Parcel.obtain();
+
+ try {
+ // Write to parcel
+ parcel.setDataPosition(0); // Sanity / paranoid check
+ ViewNode.writeToParcel(parcel, node, 0);
+
+ // Read from parcel
+ parcel.setDataPosition(0);
+ ViewNode clone = ViewNode.readFromParcel(parcel);
+ assertThat(clone).isNotNull();
+ return clone;
+ } finally {
+ parcel.recycle();
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java
index 0fd0136a85ed..ace6611a52c5 100644
--- a/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java
@@ -28,11 +28,12 @@ import static org.junit.Assert.assertTrue;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.TextUtils;
import android.view.inputmethod.CursorAnchorInfo.Builder;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
index 1b00e0939688..f24e232765c4 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
@@ -26,9 +26,10 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java
index 55e5e3698f33..9f259a841319 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java
@@ -20,11 +20,12 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java
index 8df18480ed5a..e2fb46af5b64 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java
@@ -19,10 +19,11 @@ package android.view.inputmethod;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java
index c76359ee39bc..1e0e1235161c 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java
@@ -23,10 +23,11 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java b/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java
index 8c96b588d08f..453ad72b64dc 100644
--- a/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java
@@ -23,10 +23,11 @@ import static org.junit.Assert.assertTrue;
import android.graphics.RectF;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.inputmethod.SparseRectFArray.SparseRectFArrayBuilder;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/menu/ContextMenuTest.java b/core/tests/coretests/src/android/view/menu/ContextMenuTest.java
index 657a7fc7b798..ba85d765ceda 100644
--- a/core/tests/coretests/src/android/view/menu/ContextMenuTest.java
+++ b/core/tests/coretests/src/android/view/menu/ContextMenuTest.java
@@ -18,7 +18,6 @@ package android.view.menu;
import android.content.Context;
import android.graphics.Point;
-import android.support.test.filters.MediumTest;
import android.test.ActivityInstrumentationTestCase;
import android.util.PollingCheck;
import android.view.Display;
@@ -26,6 +25,8 @@ import android.view.View;
import android.view.WindowManager;
import android.widget.espresso.ContextMenuUtils;
+import androidx.test.filters.MediumTest;
+
@MediumTest
public class ContextMenuTest extends ActivityInstrumentationTestCase<ContextMenuActivity> {
diff --git a/core/tests/coretests/src/android/view/menu/MenuLayout.java b/core/tests/coretests/src/android/view/menu/MenuLayout.java
index 356c9482de41..33ee5158bc12 100644
--- a/core/tests/coretests/src/android/view/menu/MenuLayout.java
+++ b/core/tests/coretests/src/android/view/menu/MenuLayout.java
@@ -16,8 +16,6 @@
package android.view.menu;
-import android.view.menu.MenuScenario.Params;
-
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
diff --git a/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java b/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java
index 8ed0d86d850d..ff9f166afb5f 100644
--- a/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java
+++ b/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java
@@ -16,13 +16,10 @@
package android.view.menu;
+import android.test.ActivityInstrumentationTestCase;
import android.util.KeyUtils;
-import com.android.internal.view.menu.IconMenuView;
-import com.android.internal.view.menu.MenuBuilder;
-import android.content.pm.ActivityInfo;
-import android.support.test.filters.LargeTest;
-import android.test.ActivityInstrumentationTestCase;
+import androidx.test.filters.LargeTest;
@LargeTest
public class MenuLayoutLandscapeTest extends ActivityInstrumentationTestCase<MenuLayoutLandscape> {
diff --git a/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java b/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java
index ccf12643593b..360be5343a2b 100644
--- a/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java
+++ b/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java
@@ -16,11 +16,11 @@
package android.view.menu;
-import android.content.pm.ActivityInfo;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase;
import android.util.KeyUtils;
+import androidx.test.filters.LargeTest;
+
@LargeTest
public class MenuLayoutPortraitTest extends ActivityInstrumentationTestCase<MenuLayoutPortrait> {
private static final String LONG_TITLE = "Really really really really really really really really really really long title";
diff --git a/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java b/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java
index 82ad858ba3a9..c18e36136990 100644
--- a/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java
+++ b/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java
@@ -16,17 +16,12 @@
package android.view.menu;
-import android.view.menu.MenuWith1Item;
-import android.util.KeyUtils;
-import com.android.internal.view.menu.MenuBuilder;
-
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.TouchUtils;
-
import android.test.ActivityInstrumentationTestCase;
+import android.util.KeyUtils;
import android.view.KeyEvent;
-import android.view.View;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
public class MenuWith1ItemTest extends ActivityInstrumentationTestCase<MenuWith1Item> {
private MenuWith1Item mActivity;
diff --git a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java
index 4a6c093e3bd1..780e15ab885e 100644
--- a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java
@@ -22,8 +22,9 @@ import static android.view.textclassifier.ConversationActions.Message.PERSON_USE
import static com.google.common.truth.Truth.assertThat;
import android.app.Person;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.google.android.textclassifier.ActionsSuggestionsModel;
diff --git a/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java b/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java
index 018085698d0c..fef6583f4f98 100644
--- a/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java
+++ b/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java
@@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
@@ -29,9 +30,8 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.support.test.InstrumentationRegistry;
-import androidx.annotation.Nullable;
+import androidx.test.InstrumentationRegistry;
import com.google.common.base.Preconditions;
diff --git a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java
index aaadefb90ece..3fc8e4c2eecd 100644
--- a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java
@@ -13,14 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.view.textclassifier;
import static com.google.common.truth.Truth.assertThat;
import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.google.android.textclassifier.AnnotatorModel;
diff --git a/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java
index 88d162b34144..74b8e3b49f7b 100644
--- a/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.view.textclassifier;
import static com.google.common.truth.Truth.assertThat;
@@ -20,9 +21,10 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.os.LocaleList;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
index a3c6179792b1..46e3a4c26dde 100644
--- a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
@@ -19,8 +19,9 @@ package android.view.textclassifier;
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java
index 54007fb98e67..9662182b8cf8 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java
@@ -20,8 +20,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index a3f69d93ad44..4fcd51c9be1d 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -26,9 +26,10 @@ import android.content.Context;
import android.content.Intent;
import android.os.LocaleList;
import android.service.textclassifier.TextClassifierService;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
index aaf7312fe0e6..99c959ef57e4 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
@@ -32,11 +32,12 @@ import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
index 81ec85eb2ea5..7009fb2ea758 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
@@ -24,11 +24,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.Intent;
import android.os.LocaleList;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.text.Spannable;
import android.text.SpannableString;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
@@ -368,6 +369,7 @@ public class TextClassifierTest {
assertThat(textLanguage, isTextLanguage("ja"));
}
+ /* DISABLED: b/122467291
@Test
public void testSuggestConversationActions_textReplyOnly_maxThree() {
if (isTextClassifierDisabled()) return;
@@ -376,10 +378,10 @@ public class TextClassifierTest {
ConversationActions.Message.PERSON_USER_REMOTE)
.setText("Where are you?")
.build();
- ConversationActions.TypeConfig typeConfig =
- new ConversationActions.TypeConfig.Builder().includeTypesFromTextClassifier(false)
+ TextClassifier.EntityConfig typeConfig =
+ new TextClassifier.EntityConfig.Builder().includeTypesFromTextClassifier(false)
.setIncludedTypes(
- Collections.singletonList(ConversationActions.TYPE_TEXT_REPLY))
+ Collections.singletonList(ConversationAction.TYPE_TEXT_REPLY))
.build();
ConversationActions.Request request =
new ConversationActions.Request.Builder(Collections.singletonList(message))
@@ -390,12 +392,12 @@ public class TextClassifierTest {
ConversationActions conversationActions = mClassifier.suggestConversationActions(request);
assertTrue(conversationActions.getConversationActions().size() > 0);
assertTrue(conversationActions.getConversationActions().size() == 1);
- for (ConversationActions.ConversationAction conversationAction :
+ for (ConversationAction conversationAction :
conversationActions.getConversationActions()) {
assertThat(conversationAction,
- isConversationAction(ConversationActions.TYPE_TEXT_REPLY));
+ isConversationAction(ConversationAction.TYPE_TEXT_REPLY));
}
- }
+ }*/
@Test
public void testSuggestConversationActions_textReplyOnly_noMax() {
@@ -405,10 +407,10 @@ public class TextClassifierTest {
ConversationActions.Message.PERSON_USER_REMOTE)
.setText("Where are you?")
.build();
- ConversationActions.TypeConfig typeConfig =
- new ConversationActions.TypeConfig.Builder().includeTypesFromTextClassifier(false)
+ TextClassifier.EntityConfig typeConfig =
+ new TextClassifier.EntityConfig.Builder().includeTypesFromTextClassifier(false)
.setIncludedTypes(
- Collections.singletonList(ConversationActions.TYPE_TEXT_REPLY))
+ Collections.singletonList(ConversationAction.TYPE_TEXT_REPLY))
.build();
ConversationActions.Request request =
new ConversationActions.Request.Builder(Collections.singletonList(message))
@@ -417,10 +419,10 @@ public class TextClassifierTest {
ConversationActions conversationActions = mClassifier.suggestConversationActions(request);
assertTrue(conversationActions.getConversationActions().size() > 1);
- for (ConversationActions.ConversationAction conversationAction :
+ for (ConversationAction conversationAction :
conversationActions.getConversationActions()) {
assertThat(conversationAction,
- isConversationAction(ConversationActions.TYPE_TEXT_REPLY));
+ isConversationAction(ConversationAction.TYPE_TEXT_REPLY));
}
}
@@ -523,20 +525,19 @@ public class TextClassifierTest {
};
}
- private static Matcher<ConversationActions.ConversationAction> isConversationAction(
- String actionType) {
- return new BaseMatcher<ConversationActions.ConversationAction>() {
+ private static Matcher<ConversationAction> isConversationAction(String actionType) {
+ return new BaseMatcher<ConversationAction>() {
@Override
public boolean matches(Object o) {
- if (!(o instanceof ConversationActions.ConversationAction)) {
+ if (!(o instanceof ConversationAction)) {
return false;
}
- ConversationActions.ConversationAction conversationAction =
- (ConversationActions.ConversationAction) o;
+ ConversationAction conversationAction =
+ (ConversationAction) o;
if (!actionType.equals(conversationAction.getType())) {
return false;
}
- if (ConversationActions.TYPE_TEXT_REPLY.equals(actionType)) {
+ if (ConversationAction.TYPE_TEXT_REPLY.equals(actionType)) {
if (conversationAction.getTextReply() == null) {
return false;
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java
index 1dcaed6f6a1e..d0d32e3a507a 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.assertEquals;
import android.icu.util.ULocale;
import android.os.Bundle;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
index f022d040246b..b9cc8f4ba4a0 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
@@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
index 2ea49f7d21be..30cc4e8990e0 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.assertEquals;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java
index 8e4f02c668b7..5e8e5823eefa 100644
--- a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java
@@ -23,13 +23,14 @@ import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import android.metrics.LogMaker;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
import android.view.textclassifier.GenerateLinksLogger;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java
new file mode 100644
index 000000000000..b1b74160ecd5
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier.logging;
+
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.CONVERSATION_ACTIONS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.metrics.LogMaker;
+import android.view.textclassifier.ConversationAction;
+import android.view.textclassifier.TextClassificationContext;
+import android.view.textclassifier.TextClassifierEvent;
+import android.view.textclassifier.TextClassifierEventTronLogger;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.logging.MetricsLogger;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TextClassifierEventTronLoggerTest {
+ private static final String WIDGET_TYPE = "notification";
+ private static final String PACKAGE_NAME = "pkg";
+ private static final long EVENT_TIME = System.currentTimeMillis();
+
+
+ @Mock
+ private MetricsLogger mMetricsLogger;
+ private TextClassifierEventTronLogger mTextClassifierEventTronLogger;
+
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mTextClassifierEventTronLogger = new TextClassifierEventTronLogger(mMetricsLogger);
+ }
+
+ @Test
+ public void testWriteEvent() {
+ TextClassificationContext textClassificationContext =
+ new TextClassificationContext.Builder(PACKAGE_NAME, WIDGET_TYPE)
+ .build();
+ TextClassifierEvent textClassifierEvent =
+ new TextClassifierEvent.Builder(
+ TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS,
+ TextClassifierEvent.TYPE_SMART_ACTION)
+ .setEntityType(ConversationAction.TYPE_CALL_PHONE)
+ .setEventTime(EVENT_TIME)
+ .setEventContext(textClassificationContext)
+ .build();
+
+ mTextClassifierEventTronLogger.writeEvent(textClassifierEvent);
+
+ ArgumentCaptor<LogMaker> captor = ArgumentCaptor.forClass(LogMaker.class);
+ Mockito.verify(mMetricsLogger).write(captor.capture());
+ LogMaker logMaker = captor.getValue();
+ assertThat(logMaker.getCategory()).isEqualTo(
+ CONVERSATION_ACTIONS);
+ assertThat(logMaker.getType()).isEqualTo(
+ ACTION_TEXT_SELECTION_SMART_SHARE);
+ assertThat(logMaker.getTaggedData(FIELD_SELECTION_ENTITY_TYPE))
+ .isEqualTo(ConversationAction.TYPE_CALL_PHONE);
+ assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME))
+ .isEqualTo(EVENT_TIME);
+ assertThat(logMaker.getPackageName()).isEqualTo(PACKAGE_NAME);
+ assertThat(logMaker.getTaggedData(FIELD_SELECTION_WIDGET_TYPE))
+ .isEqualTo(WIDGET_TYPE);
+ }
+
+ @Test
+ public void testWriteEvent_unsupportedCategory() {
+ TextClassifierEvent textClassifierEvent =
+ new TextClassifierEvent.Builder(
+ TextClassifierEvent.CATEGORY_SELECTION,
+ TextClassifierEvent.TYPE_SMART_ACTION)
+ .build();
+
+ mTextClassifierEventTronLogger.writeEvent(textClassifierEvent);
+
+ Mockito.verify(mMetricsLogger, Mockito.never()).write(Mockito.any(LogMaker.class));
+ }
+}
diff --git a/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java b/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java
index 4a1c414234bd..638d894b114a 100644
--- a/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java
+++ b/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java
@@ -16,15 +16,16 @@
package android.view.textservice;
+import static android.test.MoreAsserts.assertNotEqual;
+
import android.os.Parcel;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.util.Arrays;
import java.util.Locale;
-import static android.test.MoreAsserts.assertNotEqual;
-
/**
* TODO: Most of part can be, and probably should be, moved to CTS.
*/
diff --git a/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java
index 4f31c4ee72a4..6edc1628b163 100644
--- a/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java
+++ b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java
@@ -24,18 +24,14 @@ import static org.junit.Assert.assertTrue;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup.OnHierarchyChangeListener;
-import com.android.frameworks.coretests.R;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
-import java.util.ArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
+import com.android.frameworks.coretests.R;
import org.junit.Before;
import org.junit.Rule;
@@ -43,6 +39,11 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+
/**
* Tests for AppWidgetHostView
*/
diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java
index 8e73b521cdfc..01e82a5a9f7f 100644
--- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java
+++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java
@@ -18,7 +18,8 @@ package android.widget;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.FlakyTest;
+
+import androidx.test.filters.FlakyTest;
// TODO: tests fail intermittently. Add back MediumTest annotation when fixed
public class AutoCompleteTextViewCallbacks
@@ -32,7 +33,7 @@ public class AutoCompleteTextViewCallbacks
/** Test that the initial popup of the suggestions does not select anything.
*/
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupNoSelection() throws Exception {
AutoCompleteTextViewSimple theActivity = getActivity();
AutoCompleteTextView textView = theActivity.getTextView();
@@ -57,7 +58,7 @@ public class AutoCompleteTextViewCallbacks
}
/** Test that arrow-down into the popup calls the onSelected callback. */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupEnterSelection() throws Exception {
final AutoCompleteTextViewSimple theActivity = getActivity();
AutoCompleteTextView textView = theActivity.getTextView();
@@ -106,7 +107,7 @@ public class AutoCompleteTextViewCallbacks
}
/** Test that arrow-up out of the popup calls the onNothingSelected callback */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupLeaveSelection() {
final AutoCompleteTextViewSimple theActivity = getActivity();
AutoCompleteTextView textView = theActivity.getTextView();
diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java
index ee0abaea027a..21e4184e8e4d 100644
--- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java
+++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java
@@ -18,8 +18,8 @@ package android.widget;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.FlakyTest;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.FlakyTest;
/**
* A collection of tests on aspects of the AutoCompleteTextView's popup
@@ -41,7 +41,7 @@ public class AutoCompleteTextViewPopup
}
/** Test that we can move the selection and it responds as expected */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupSetListSelection() throws Throwable {
AutoCompleteTextViewSimple theActivity = getActivity();
final AutoCompleteTextView textView = theActivity.getTextView();
@@ -73,7 +73,7 @@ public class AutoCompleteTextViewPopup
}
/** Test that we can look at the selection as we move around */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupGetListSelection() throws Throwable {
AutoCompleteTextViewSimple theActivity = getActivity();
final AutoCompleteTextView textView = theActivity.getTextView();
@@ -100,7 +100,7 @@ public class AutoCompleteTextViewPopup
}
/** Test that we can clear the selection */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupClearListSelection() throws Throwable {
AutoCompleteTextViewSimple theActivity = getActivity();
final AutoCompleteTextView textView = theActivity.getTextView();
@@ -133,7 +133,7 @@ public class AutoCompleteTextViewPopup
}
/** Make sure we handle an empty adapter properly */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupNavigateNoAdapter() throws Throwable {
AutoCompleteTextViewSimple theActivity = getActivity();
final AutoCompleteTextView textView = theActivity.getTextView();
@@ -167,7 +167,7 @@ public class AutoCompleteTextViewPopup
}
/** Test the show/hide behavior of the drop-down. */
- @FlakyTest(tolerance=3)
+ @FlakyTest
public void testPopupShow() throws Throwable {
AutoCompleteTextViewSimple theActivity = getActivity();
final AutoCompleteTextView textView = theActivity.getTextView();
diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java
index b4e05aa26de7..063bec5fa7cc 100644
--- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java
+++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
@@ -25,6 +23,8 @@ import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
+import com.android.frameworks.coretests.R;
+
public class AutoCompleteTextViewSimple extends Activity
implements OnItemClickListener, OnItemSelectedListener {
diff --git a/core/tests/coretests/src/android/widget/DatePickerActivity.java b/core/tests/coretests/src/android/widget/DatePickerActivity.java
index c3b25a1a5a8c..9e455b223865 100644
--- a/core/tests/coretests/src/android/widget/DatePickerActivity.java
+++ b/core/tests/coretests/src/android/widget/DatePickerActivity.java
@@ -18,6 +18,7 @@ package android.widget;
import android.app.Activity;
import android.os.Bundle;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/widget/DatePickerFocusTest.java b/core/tests/coretests/src/android/widget/DatePickerFocusTest.java
index be85450be429..f0672304d90e 100644
--- a/core/tests/coretests/src/android/widget/DatePickerFocusTest.java
+++ b/core/tests/coretests/src/android/widget/DatePickerFocusTest.java
@@ -19,11 +19,12 @@ package android.widget;
import android.app.Activity;
import android.app.Instrumentation;
import android.os.SystemClock;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;
import android.view.View;
+import androidx.test.filters.LargeTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/widget/DateTimeViewTest.java b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
index 40a6b7a43f53..d0bd4b8b0bd5 100644
--- a/core/tests/coretests/src/android/widget/DateTimeViewTest.java
+++ b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
@@ -16,10 +16,10 @@
package android.widget;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/widget/EditorCursorTest.java b/core/tests/coretests/src/android/widget/EditorCursorTest.java
index 9186827b38f3..e4f55df6f683 100644
--- a/core/tests/coretests/src/android/widget/EditorCursorTest.java
+++ b/core/tests/coretests/src/android/widget/EditorCursorTest.java
@@ -31,10 +31,11 @@ import static org.hamcrest.Matchers.sameInstance;
import android.app.Activity;
import android.app.Instrumentation;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/widget/ListViewTest.java b/core/tests/coretests/src/android/widget/ListViewTest.java
index 449b696fb008..254af2aed768 100644
--- a/core/tests/coretests/src/android/widget/ListViewTest.java
+++ b/core/tests/coretests/src/android/widget/ListViewTest.java
@@ -16,20 +16,19 @@
package android.widget;
-import android.test.suitebuilder.annotation.Suppress;
-import com.google.android.collect.Lists;
-
-import junit.framework.Assert;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.InstrumentationTestCase;
import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
+import com.google.android.collect.Lists;
+
+import junit.framework.Assert;
import java.util.List;
diff --git a/core/tests/coretests/src/android/widget/RadioGroupActivity.java b/core/tests/coretests/src/android/widget/RadioGroupActivity.java
index c87aa3ad609d..dd3b30a7b326 100644
--- a/core/tests/coretests/src/android/widget/RadioGroupActivity.java
+++ b/core/tests/coretests/src/android/widget/RadioGroupActivity.java
@@ -17,11 +17,11 @@
package android.widget;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class RadioGroupActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java b/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java
index 1ab362835bbe..18c1ea164ebb 100644
--- a/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java
+++ b/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java
@@ -16,12 +16,13 @@
package android.widget;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase2;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
/**
* Exercises {@link android.widget.RadioGroup}'s check feature.
diff --git a/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java b/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java
index 06b860a96117..da53f6d94f49 100644
--- a/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java
+++ b/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java
@@ -38,11 +38,12 @@ import android.database.DataSetObserver;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import com.android.internal.widget.IRemoteViewsFactory;
diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
index 36792bbf6fb6..8cb7e1b95245 100644
--- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java
+++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
@@ -32,12 +32,13 @@ import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
index 2add22105681..74aad9afa359 100644
--- a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
+++ b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
@@ -22,7 +22,8 @@ import static java.util.function.Function.identity;
import android.graphics.PointF;
import android.graphics.RectF;
-import android.support.test.filters.LargeTest;
+
+import androidx.test.filters.LargeTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java b/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java
index 1731c08df018..a79b30dbbe1a 100644
--- a/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java
+++ b/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java
@@ -16,14 +16,15 @@
package android.widget;
-import android.test.suitebuilder.annotation.Suppress;
-import com.google.android.collect.Lists;
-
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+
+import com.google.android.collect.Lists;
import java.util.ArrayList;
import java.util.Random;
diff --git a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
index eafe42723780..483270e1f9ab 100644
--- a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
+++ b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
@@ -36,13 +36,13 @@ import static android.widget.espresso.SuggestionsPopupwindowUtils.clickSuggestio
import static android.widget.espresso.SuggestionsPopupwindowUtils.onSuggestionsPopup;
import static android.widget.espresso.TextViewActions.clickOnTextAtIndex;
import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex;
+
import static org.hamcrest.Matchers.is;
+
import android.content.res.TypedArray;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.ViewAssertion;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.text.Selection;
import android.text.Spannable;
import android.text.Spanned;
@@ -51,6 +51,8 @@ import android.text.style.SuggestionSpan;
import android.text.style.TextAppearanceSpan;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
index ff4a7dafc627..41fa08b7e0e2 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
@@ -43,14 +43,15 @@ import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIn
import static android.widget.espresso.TextViewAssertions.hasSelection;
import android.app.Activity;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.Suppress;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.view.MotionEvent;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 90758ba7c418..9d93421b1783 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -27,10 +27,8 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
import static android.widget.espresso.DragHandleUtils.onHandleView;
-import static android.widget.espresso.FloatingToolbarEspressoUtils
- .assertFloatingToolbarContainsItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils
- .assertFloatingToolbarDoesNotContainItem;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex;
import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem;
@@ -62,13 +60,8 @@ import android.app.Activity;
import android.app.Instrumentation;
import android.content.ClipData;
import android.content.ClipboardManager;
-import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.action.EspressoKey;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
-import android.test.suitebuilder.annotation.Suppress;
import android.text.InputType;
import android.text.Selection;
import android.text.Spannable;
@@ -85,6 +78,12 @@ import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextLinksParams;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import org.junit.Before;
diff --git a/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java b/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java
index e9d1d3e00e8a..113db9d7a2b7 100644
--- a/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java
@@ -21,8 +21,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
import android.text.DynamicLayout;
import android.text.FontFallbackSetup;
import android.text.Layout;
@@ -31,6 +29,9 @@ import android.util.TypedValue;
import android.view.View;
import android.widget.TextView.BufferType;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
index cf173fb78a32..a769ea40b4f2 100644
--- a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
@@ -20,14 +20,15 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.SpannedString;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java
index 1c5610b1bc7d..585360fdd2f3 100644
--- a/core/tests/coretests/src/android/widget/TextViewTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewTest.java
@@ -27,11 +27,6 @@ import android.content.Context;
import android.content.Intent;
import android.graphics.Paint;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.text.GetChars;
import android.text.Layout;
import android.text.PrecomputedText;
@@ -40,6 +35,12 @@ import android.text.Spannable;
import android.view.View;
import android.widget.TextView.BufferType;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java b/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java
index 75da6fef46ff..85a4509c18a3 100644
--- a/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java
+++ b/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java
@@ -16,12 +16,11 @@
package android.widget.focus;
-import android.util.InternalSelectionView;
-
import android.app.Activity;
import android.os.Bundle;
-import android.widget.LinearLayout;
+import android.util.InternalSelectionView;
import android.view.ViewGroup;
+import android.widget.LinearLayout;
/**
* {@link android.view.FocusFinder#findNextFocus(android.view.ViewGroup, android.view.View, int)}
diff --git a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java
index f6b0520fbadb..fe6d3c8393f1 100644
--- a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java
+++ b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java
@@ -16,13 +16,13 @@
package android.widget.focus;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Button;
+import com.android.frameworks.coretests.R;
+
public class DescendantFocusability extends Activity {
public ViewGroup beforeDescendants;
diff --git a/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java b/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java
index 2af42ac193c0..1c570df94f59 100644
--- a/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java
+++ b/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java
@@ -16,15 +16,14 @@
package android.widget.focus;
-import android.widget.focus.DescendantFocusability;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.UiThreadTest;
import android.test.TouchUtils;
import android.view.ViewGroup;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class DescendantFocusabilityTest extends ActivityInstrumentationTestCase<DescendantFocusability> {
private DescendantFocusability a;
diff --git a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java
index b3d5ec5e5099..0cb80cebffc7 100644
--- a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java
+++ b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java
@@ -16,13 +16,13 @@
package android.widget.focus;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.widget.LinearLayout;
-import android.widget.Button;
import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import com.android.frameworks.coretests.R;
/**
* Exercises cases where elements of the UI are removed (and
diff --git a/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java b/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java
index a1b7bcbf6487..6c46d08bc223 100644
--- a/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java
+++ b/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java
@@ -16,15 +16,15 @@
package android.widget.focus;
-import android.widget.focus.FocusAfterRemoval;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.Button;
-import android.widget.LinearLayout;
import android.view.KeyEvent;
import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
/**
* {@link FocusAfterRemoval} is set up to exercise cases where the views that
diff --git a/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java b/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java
index 8f8f184a0c9c..26dc23398366 100644
--- a/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java
+++ b/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java
@@ -16,14 +16,13 @@
package android.widget.focus;
-import android.widget.focus.AdjacentVerticalRectLists;
-import android.util.InternalSelectionView;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.util.InternalSelectionView;
import android.view.KeyEvent;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* {@link android.view.FocusFinder#findNextFocus(android.view.ViewGroup, android.view.View, int)}
* and
diff --git a/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java b/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java
index dcbddefef870..b7974e38555a 100644
--- a/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java
+++ b/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java
@@ -17,10 +17,10 @@
package android.widget.focus;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.view.View;
-import android.widget.focus.GoneParentFocusedChild;
+
+import androidx.test.filters.MediumTest;
/**
* When a parent is GONE, key events shouldn't go to its children, even if they
diff --git a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java
index 11cac1e5b1ea..aab91194cfd7 100644
--- a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java
+++ b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java
@@ -17,12 +17,12 @@
package android.widget.focus;
import android.app.Activity;
-import android.widget.LinearLayout;
-import android.widget.Button;
-import android.widget.TextView;
+import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
-import android.content.Context;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
public class HorizontalFocusSearch extends Activity {
diff --git a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java
index 43986eed9b14..855a32192555 100644
--- a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java
+++ b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java
@@ -16,17 +16,16 @@
package android.widget.focus;
-import android.widget.focus.HorizontalFocusSearch;
+import static android.widget.focus.VerticalFocusSearchTest.FocusSearchAlg;
+import static android.widget.focus.VerticalFocusSearchTest.NewFocusSearchAlg;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.LinearLayout;
-import android.widget.Button;
import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
-import static android.widget.focus.VerticalFocusSearchTest.FocusSearchAlg;
-import static android.widget.focus.VerticalFocusSearchTest.NewFocusSearchAlg;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.Suppress;
/**
* Tests that focus searching works on a horizontal linear layout of buttons of
diff --git a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java
index acd632f3402b..ec234bc616df 100644
--- a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java
+++ b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
+
import com.android.frameworks.coretests.R;
public class LinearLayoutGrid extends Activity {
diff --git a/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java b/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java
index 89cb8bb6943e..c81317c003b4 100644
--- a/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java
+++ b/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java
@@ -17,11 +17,11 @@
package android.widget.focus;
import android.test.SingleLaunchActivityTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.FocusFinder;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.focus.LinearLayoutGrid;
+
+import androidx.test.filters.MediumTest;
/**
* Tests focus searching between buttons within a grid that are touching, for example,
diff --git a/core/tests/coretests/src/android/widget/focus/ListOfButtons.java b/core/tests/coretests/src/android/widget/focus/ListOfButtons.java
index 308861d3d9df..5663ed2094f7 100644
--- a/core/tests/coretests/src/android/widget/focus/ListOfButtons.java
+++ b/core/tests/coretests/src/android/widget/focus/ListOfButtons.java
@@ -16,8 +16,6 @@
package android.widget.focus;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
@@ -26,6 +24,8 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
+import com.android.frameworks.coretests.R;
+
/**
* A layout with a ListView containing buttons.
*/
diff --git a/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java b/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java
index bec6f80ddbce..4cf4a3abeb68 100644
--- a/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java
+++ b/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java
@@ -16,17 +16,17 @@
package android.widget.focus;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.focus.ListOfButtons;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListAdapter;
-import android.widget.Button;
-import android.widget.ListView;
import android.view.KeyEvent;
import android.view.View;
+import android.widget.Button;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
+import com.android.frameworks.coretests.R;
/**
* Tests that focus works as expected when navigating into and out of
diff --git a/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java b/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java
index c2e7a26b5909..936c9999e7f8 100644
--- a/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java
+++ b/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java
@@ -21,7 +21,12 @@ import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.*;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+
import com.google.android.collect.Lists;
import java.util.List;
diff --git a/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java b/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java
index 53b866c92ef8..73e4ea8f718d 100644
--- a/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java
+++ b/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java
@@ -19,11 +19,11 @@ package android.widget.focus;
import android.app.Activity;
import android.graphics.Point;
import android.os.Bundle;
+import android.util.InternalSelectionView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
-import android.util.InternalSelectionView;
/**
* A list of {@link InternalSelectionView}s paramatarized by the number of items,
diff --git a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java
index b9082011f8b4..8accf21c2adc 100644
--- a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java
+++ b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java
@@ -27,9 +27,10 @@ import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
-import com.google.android.collect.Lists;
import com.android.frameworks.coretests.R;
+import com.google.android.collect.Lists;
+
import java.util.List;
public class ListWithFooterViewAndNewLabels extends ListActivity {
diff --git a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java
index 57dbb78cbcfd..d0fcde5fd49c 100644
--- a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java
+++ b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java
@@ -16,14 +16,13 @@
package android.widget.focus;
-import android.widget.focus.ListWithFooterViewAndNewLabels;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
+import com.android.frameworks.coretests.R;
+
public class ListWithFooterViewAndNewLabelsTest
extends ActivityInstrumentationTestCase<ListWithFooterViewAndNewLabels> {
diff --git a/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java b/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java
index 5c891f90bc2f..50a8614a1992 100644
--- a/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java
+++ b/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java
@@ -16,19 +16,20 @@
package android.widget.focus;
-import com.android.frameworks.coretests.R;
-import com.google.android.collect.Lists;
-
import android.app.ListActivity;
-import android.os.Bundle;
-import android.widget.ArrayAdapter;
-import android.widget.LinearLayout;
-import android.widget.TextView;
import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
import android.webkit.WebView;
+import android.widget.ArrayAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.frameworks.coretests.R;
+
+import com.google.android.collect.Lists;
import java.util.List;
diff --git a/core/tests/coretests/src/android/widget/focus/RequestFocus.java b/core/tests/coretests/src/android/widget/focus/RequestFocus.java
index 4daf0b4206b0..5042efd371e5 100644
--- a/core/tests/coretests/src/android/widget/focus/RequestFocus.java
+++ b/core/tests/coretests/src/android/widget/focus/RequestFocus.java
@@ -16,13 +16,13 @@
package android.widget.focus;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Button;
+import com.android.frameworks.coretests.R;
+
/**
* Exercises cases where elements of the UI are requestFocus()ed.
*/
diff --git a/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java b/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java
index cdfa21755344..bc770c502a2b 100644
--- a/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java
+++ b/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java
@@ -21,16 +21,18 @@ import static org.mockito.Mockito.mock;
import android.os.Handler;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.AndroidRuntimeException;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
import android.widget.Button;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
+
import org.mockito.InOrder;
/**
diff --git a/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java b/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java
index 06cb75db28c2..e6e76ccc2caf 100644
--- a/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java
+++ b/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java
@@ -18,12 +18,12 @@ package android.widget.focus;
import android.graphics.Rect;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.InternalSelectionView;
import android.view.KeyEvent;
import android.widget.ListView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
/**
* TODO: extract base test case that launches {@link ListOfInternalSelectionViews} with
diff --git a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java
index 4a809e0cc881..2ca9f6da6404 100644
--- a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java
+++ b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java
@@ -17,13 +17,13 @@
package android.widget.focus;
import android.app.Activity;
+import android.content.Context;
import android.os.Bundle;
-import android.widget.LinearLayout;
-import android.widget.Button;
-import android.widget.TextView;
import android.view.Gravity;
import android.view.ViewGroup;
-import android.content.Context;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
/**
* Holds a few buttons of various sizes and horizontal placements in a
diff --git a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java
index f01422ebfc52..319756cc5876 100644
--- a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java
+++ b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java
@@ -16,17 +16,16 @@
package android.widget.focus;
-import android.widget.focus.VerticalFocusSearch;
-
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.FocusFinder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.Suppress;
+
/**
* Tests that focus searching works on a vertical linear layout of buttons of
* various widths and horizontal placements.
diff --git a/core/tests/coretests/src/android/widget/gridview/GridDelete.java b/core/tests/coretests/src/android/widget/gridview/GridDelete.java
index 57ae8f39fa09..b040f69545f1 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridDelete.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridDelete.java
@@ -16,6 +16,7 @@
package android.widget.gridview;
+import android.util.GridScenario;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -23,8 +24,6 @@ import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ListAdapter;
-import android.util.GridScenario;
-
import java.util.ArrayList;
/**
diff --git a/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java b/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java
index 21ca655390a7..5247009e693b 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java
@@ -17,10 +17,9 @@
package android.widget.gridview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.GridView;
-import android.widget.gridview.GridInHorizontal;
+import androidx.test.filters.MediumTest;
public class GridInHorizontalTest extends ActivityInstrumentationTestCase<GridInHorizontal> {
diff --git a/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java b/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java
index a674db25f708..290f70ee639b 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java
@@ -17,10 +17,9 @@
package android.widget.gridview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.GridView;
-import android.widget.gridview.GridInVertical;
+import androidx.test.filters.MediumTest;
public class GridInVerticalTest extends ActivityInstrumentationTestCase<GridInVertical> {
diff --git a/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java b/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java
index ecd4b1cbbad3..d2ae7cfc6b25 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java
@@ -17,9 +17,10 @@
package android.widget.gridview;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.GridView;
+import androidx.test.filters.MediumTest;
+
public class GridPaddingTest extends ActivityInstrumentationTestCase2<GridPadding> {
private GridView mGridView;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java b/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java
index 53eeb48212ce..466c55f8117c 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java
@@ -19,12 +19,13 @@ package android.widget.gridview;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.AbsListView;
import android.widget.GridView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class GridScrollListenerTest extends ActivityInstrumentationTestCase<GridScrollListener> implements
AbsListView.OnScrollListener {
private GridScrollListener mActivity;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java
index 0e362b69b057..db4f2dc224fc 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java
@@ -16,13 +16,13 @@
package android.widget.gridview;
-import android.util.GridScenario;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
+import android.util.GridScenario;
import android.widget.GridView;
+import androidx.test.filters.MediumTest;
+
public class GridSetSelectionBaseTest<T extends GridScenario> extends ActivityInstrumentationTestCase<T> {
private T mActivity;
private GridView mGridView;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java
index 67396451898c..17a60449e766 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java
@@ -16,8 +16,6 @@
package android.widget.gridview;
-import android.widget.gridview.GridSetSelectionMany;
-
public class GridSetSelectionManyTest extends GridSetSelectionBaseTest<GridSetSelectionMany> {
public GridSetSelectionManyTest() {
super(GridSetSelectionMany.class);
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java
index 46922b97f6fd..a71f732c207f 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java
@@ -16,8 +16,6 @@
package android.widget.gridview;
-import android.widget.gridview.GridSetSelectionStackFromBottomMany;
-
public class GridSetSelectionStackFromBottomManyTest extends GridSetSelectionBaseTest<GridSetSelectionStackFromBottomMany> {
public GridSetSelectionStackFromBottomManyTest() {
super(GridSetSelectionStackFromBottomMany.class);
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java
index 67dd6f10a86e..4e6e8aa58912 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java
@@ -16,8 +16,6 @@
package android.widget.gridview;
-import android.widget.gridview.GridSetSelectionStackFromBottom;
-
public class GridSetSelectionStackFromBottomTest extends GridSetSelectionBaseTest<GridSetSelectionStackFromBottom> {
public GridSetSelectionStackFromBottomTest() {
super(GridSetSelectionStackFromBottom.class);
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java
index 2127b3cd4f1a..68802fe22f95 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java
@@ -16,8 +16,6 @@
package android.widget.gridview;
-import android.widget.gridview.GridSetSelection;
-
public class GridSetSelectionTest extends GridSetSelectionBaseTest<GridSetSelection> {
public GridSetSelectionTest() {
super(GridSetSelection.class);
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSimple.java b/core/tests/coretests/src/android/widget/gridview/GridSimple.java
index 7c2c696f2b56..67bb7511122a 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSimple.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSimple.java
@@ -18,12 +18,11 @@ package android.widget.gridview;
import android.graphics.drawable.PaintDrawable;
import android.os.Bundle;
+import android.util.GridScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import android.util.GridScenario;
-
public class GridSimple extends GridScenario {
@Override
protected void init(Params params) {
diff --git a/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java b/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java
index 3b2504ebe3be..0f67522894cc 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java
@@ -17,10 +17,9 @@
package android.widget.gridview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.GridView;
-import android.widget.gridview.GridSingleColumn;
+import androidx.test.filters.MediumTest;
public class GridSingleColumnTest extends ActivityInstrumentationTestCase<GridSingleColumn> {
private GridSingleColumn mActivity;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java
index 640737ec1c85..a3696164526e 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java
@@ -16,11 +16,10 @@
package android.widget.gridview;
-import android.widget.gridview.GridStackFromBottomMany;
-
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.GridView;
import android.test.ActivityInstrumentationTestCase;
+import android.widget.GridView;
+
+import androidx.test.filters.MediumTest;
public class GridStackFromBottomManyTest extends ActivityInstrumentationTestCase<GridStackFromBottomMany> {
private GridStackFromBottomMany mActivity;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java
index 8fec241dd304..da1b6384d212 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java
@@ -16,12 +16,11 @@
package android.widget.gridview;
-import android.widget.gridview.GridStackFromBottom;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.GridView;
+import androidx.test.filters.MediumTest;
+
public class GridStackFromBottomTest extends ActivityInstrumentationTestCase<GridStackFromBottom> {
private GridStackFromBottom mActivity;
private GridView mGridView;
diff --git a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java
index ad89bb6ab90c..34c19c37b702 100644
--- a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java
+++ b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java
@@ -16,20 +16,20 @@
package android.widget.gridview;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
import java.util.Random;
/**
diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java
index ca789aff672e..ab5fcfaf29ad 100644
--- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java
@@ -17,14 +17,14 @@
package android.widget.gridview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.View;
import android.widget.GridView;
-
import android.widget.gridview.GridSimple;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* Tests setting the selection in touch mode
*/
diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java
index 9a8d3074890b..e312873d4ae1 100644
--- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java
@@ -16,14 +16,14 @@
package android.widget.gridview.touch;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
+import android.view.View;
+import android.widget.GridView;
import android.widget.gridview.GridStackFromBottomMany;
-import android.widget.GridView;
-import android.view.View;
-import android.test.ActivityInstrumentationTestCase;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
public class GridTouchStackFromBottomManyTest extends ActivityInstrumentationTestCase<GridStackFromBottomMany> {
private GridStackFromBottomMany mActivity;
diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java
index d8d4e435d2c7..c98c10a603f4 100644
--- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java
@@ -16,13 +16,13 @@
package android.widget.gridview.touch;
-import android.widget.gridview.GridStackFromBottom;
-import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.MediumTest;
-
import android.test.ActivityInstrumentationTestCase;
-import android.widget.GridView;
+import android.test.TouchUtils;
import android.view.View;
+import android.widget.GridView;
+import android.widget.gridview.GridStackFromBottom;
+
+import androidx.test.filters.MediumTest;
public class GridTouchStackFromBottomTest extends ActivityInstrumentationTestCase<GridStackFromBottom> {
private GridStackFromBottom mActivity;
diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
index 55a66d9c2af2..0d3092cbc2f3 100644
--- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
@@ -18,16 +18,16 @@ package android.widget.gridview.touch;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.GridView;
-
import android.widget.gridview.GridVerticalSpacingStackFromBottom;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class GridTouchVerticalSpacingStackFromBottomTest extends ActivityInstrumentationTestCase<GridVerticalSpacingStackFromBottom> {
private GridVerticalSpacingStackFromBottom mActivity;
private GridView mGridView;
diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java
index bae4ee7293e6..e831e62be179 100644
--- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java
+++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java
@@ -17,16 +17,16 @@
package android.widget.gridview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.GridView;
-
import android.widget.gridview.GridVerticalSpacing;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class GridTouchVerticalSpacingTest extends ActivityInstrumentationTestCase<GridVerticalSpacing> {
private GridVerticalSpacing mActivity;
private GridView mGridView;
diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java
index 9791e36f038d..d159be865372 100644
--- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java
+++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java
@@ -16,11 +16,10 @@
package android.widget.layout.frame;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class FrameLayoutGravity extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java
index fe4e93286bc5..0cab660f68d6 100644
--- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java
+++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java
@@ -16,12 +16,13 @@
package android.widget.layout.frame;
+import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
-import android.app.Activity;
import android.view.View;
-import android.widget.layout.frame.FrameLayoutGravity;
+
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
public class FrameLayoutGravityTest extends ActivityInstrumentationTestCase<FrameLayoutGravity> {
diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java
index 81b3ea13fc6b..8c54557819d0 100644
--- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java
+++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java
@@ -16,11 +16,10 @@
package android.widget.layout.frame;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class FrameLayoutMargin extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java
index c052d659c0f2..4973078f9752 100644
--- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java
+++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java
@@ -16,13 +16,14 @@
package android.widget.layout.frame;
+import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
-import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.layout.frame.FrameLayoutMargin;
+
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
public class FrameLayoutMarginTest extends ActivityInstrumentationTestCase<FrameLayoutMargin> {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java
index 766dd0a76366..79a34e5d1f5e 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java
@@ -16,11 +16,10 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class BaselineAlignmentCenterGravity extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java
index 079e9d079ee5..60b7c2f5e8df 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java
@@ -18,13 +18,13 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
import android.view.View;
import android.widget.Button;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.BaselineAlignmentCenterGravity;
public class BaselineAlignmentCenterGravityTest extends ActivityInstrumentationTestCase<BaselineAlignmentCenterGravity> {
private Button mButton1;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java
index c3bfe3a30ee8..a429b758d748 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java
@@ -18,12 +18,12 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.HorizontalOrientationVerticalAlignment;
public class BaselineAlignmentSpinnerButton extends ActivityInstrumentationTestCase<HorizontalOrientationVerticalAlignment> {
private View mSpinner;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java
index 5ed5e71d65a7..f33feb0c91a8 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java
@@ -16,12 +16,12 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
+import com.android.frameworks.coretests.R;
+
public class BaselineAlignmentZeroWidthAndWeight extends Activity {
@Override
protected void onCreate(Bundle icicle) {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java
index 2dd2bb8aa382..443b0f7d6ef0 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java
@@ -16,16 +16,15 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.BaselineAlignmentZeroWidthAndWeight;
-import android.widget.layout.linear.ExceptionTextView;
-
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
public class BaselineAlignmentZeroWidthAndWeightTest extends ActivityInstrumentationTestCase<BaselineAlignmentZeroWidthAndWeight> {
private Button mShowButton;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java
index c9ad83174e63..9d9131675004 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java
@@ -16,11 +16,10 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class BaselineButtons extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java
index 6f1fc90c001b..ac3c5d8de53c 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java
@@ -18,12 +18,12 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
import android.widget.ImageButton;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.BaselineButtons;
public class BaselineButtonsTest extends ActivityInstrumentationTestCase<BaselineButtons> {
private View mCurrentTime;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java b/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java
index 6129b5b4c7e9..c68450188456 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java
@@ -21,7 +21,6 @@ import android.text.BoringLayout;
import android.util.AttributeSet;
import android.widget.EditText;
-
/**
* A special EditText that sets {@link #isFailed()} to true as its internal makeNewLayout() method is called
* with a width lower than 0. This is used to fail the unit test in
diff --git a/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java b/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java
index 50aa5b721eca..c8a5f3451d17 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java
@@ -16,12 +16,12 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
public class FillInWrap extends Activity {
@Override
protected void onCreate(Bundle icicle) {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java b/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java
index f16180248a5e..0e69efc1349e 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java
@@ -18,9 +18,10 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
public class FillInWrapTest extends ActivityInstrumentationTestCase<FillInWrap> {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java b/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java
index 9f937a97b5a6..255f7b37dba6 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java
@@ -16,11 +16,10 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class HorizontalOrientationVerticalAlignment extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java
index 83331caa6069..a0745dd1aa45 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java
@@ -16,14 +16,14 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
+import com.android.frameworks.coretests.R;
+
public class LLEditTextThenButton extends Activity {
private EditText mEditText;
private Button mButton;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java
index ab2f060eafc2..115306225e75 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java
@@ -18,10 +18,10 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.os.Bundle;
-import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
+
import com.android.frameworks.coretests.R;
/**
diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java
index 77f564db0ef6..0aca699e3c83 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java
@@ -22,5 +22,4 @@ package android.widget.layout.linear;
*/
public class LLOfButtons2 extends LLOfButtons1 {
-
}
diff --git a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java
index 90db788e45eb..5d372450f5ac 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java
@@ -16,11 +16,11 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class LinearLayoutEditTexts extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java
index d5998b7c954d..966ed6dab8b9 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java
@@ -16,13 +16,13 @@
package android.widget.layout.linear;
-import android.widget.layout.linear.LinearLayoutEditTexts;
-import com.android.frameworks.coretests.R;
-
+import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
-import android.app.Activity;
+
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
public class LinearLayoutEditTextsTest extends ActivityInstrumentationTestCase<LinearLayoutEditTexts> {
private View mChild;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/Weight.java b/core/tests/coretests/src/android/widget/layout/linear/Weight.java
index 20edd7c7e31d..3722a14f86fe 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/Weight.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/Weight.java
@@ -16,11 +16,11 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
public class Weight extends Activity {
@Override
protected void onCreate(Bundle icicle) {
diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java b/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java
index 2e421daeaf1c..144600beddf6 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java
@@ -16,11 +16,10 @@
package android.widget.layout.linear;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
-import android.view.View;
+
+import com.android.frameworks.coretests.R;
public class WeightSum extends Activity {
@Override
diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java b/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java
index f9a94cedd4a2..1d07db236436 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java
@@ -18,11 +18,11 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.WeightSum;
public class WeightSumTest extends ActivityInstrumentationTestCase<WeightSum> {
private View mChild;
diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java b/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java
index 1c42e7ccb9be..db524958db47 100644
--- a/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java
+++ b/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java
@@ -18,13 +18,13 @@ package android.widget.layout.linear;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.View;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
import com.android.frameworks.coretests.R;
-import android.widget.layout.linear.Weight;
@Suppress // Failing.
public class WeightTest extends ActivityInstrumentationTestCase<Weight> {
diff --git a/core/tests/coretests/src/android/widget/layout/table/AddColumn.java b/core/tests/coretests/src/android/widget/layout/table/AddColumn.java
index 400c32c0fed5..b407941b411c 100644
--- a/core/tests/coretests/src/android/widget/layout/table/AddColumn.java
+++ b/core/tests/coretests/src/android/widget/layout/table/AddColumn.java
@@ -16,8 +16,6 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
@@ -26,6 +24,8 @@ import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
/**
* This test adds an extra row with an extra column in the table.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java b/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java
index bfb4d172f6c3..08ae0301da13 100644
--- a/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java
@@ -16,16 +16,16 @@
package android.widget.layout.table;
-import android.widget.layout.table.AddColumn;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.AddColumn} is
* setup to exercise the case of adding row programmatically in a table.
diff --git a/core/tests/coretests/src/android/widget/layout/table/CellSpan.java b/core/tests/coretests/src/android/widget/layout/table/CellSpan.java
index d91cf56eba2e..3102ac1f109d 100644
--- a/core/tests/coretests/src/android/widget/layout/table/CellSpan.java
+++ b/core/tests/coretests/src/android/widget/layout/table/CellSpan.java
@@ -16,11 +16,11 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
/**
* Exercise table layout with cells spanning.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java b/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java
index 331ec4575395..aa8e66cb0c67 100644
--- a/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java
@@ -16,13 +16,13 @@
package android.widget.layout.table;
-import android.widget.layout.table.CellSpan;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.CellSpan} is
* setup to exercise tables in which cells use spanning.
diff --git a/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java b/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java
index 435815a40d06..c587f74e97f2 100644
--- a/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java
+++ b/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java
@@ -16,11 +16,11 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
/**
* Exercise table layout with cells having a fixed width and height.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java b/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java
index b20ec84ba8aa..7d02453d4e54 100644
--- a/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java
@@ -16,13 +16,13 @@
package android.widget.layout.table;
-import android.widget.layout.table.FixedWidth;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.FixedWidth} is
* setup to exercise tables in which cells use fixed width and height.
diff --git a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java
index 1444f60f4aa9..6f5148be98b7 100644
--- a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java
+++ b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java
@@ -16,11 +16,11 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
/**
* Exercise table layout with cells using a horizontal gravity.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java
index 964df823fd55..73e8334e5224 100644
--- a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java
@@ -16,14 +16,14 @@
package android.widget.layout.table;
-import android.widget.layout.table.HorizontalGravity;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.HorizontalGravity} is
* setup to exercise tables in which cells use horizontal gravity.
diff --git a/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java b/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java
index 4fdb37894cb8..9055b329a2a6 100644
--- a/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java
+++ b/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java
@@ -16,11 +16,11 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
/**
* Exercise table layout with cells using a vertical gravity.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java b/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java
index 1d6be3f01c79..f14fa1c2d7da 100644
--- a/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java
@@ -16,15 +16,15 @@
package android.widget.layout.table;
-import android.widget.layout.table.VerticalGravity;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.test.ViewAsserts;
import android.view.View;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.VerticalGravity} is
* setup to exercise tables in which cells use vertical gravity.
diff --git a/core/tests/coretests/src/android/widget/layout/table/Weight.java b/core/tests/coretests/src/android/widget/layout/table/Weight.java
index 6d4d51d93a8f..5c0824769d7a 100644
--- a/core/tests/coretests/src/android/widget/layout/table/Weight.java
+++ b/core/tests/coretests/src/android/widget/layout/table/Weight.java
@@ -16,11 +16,11 @@
package android.widget.layout.table;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import com.android.frameworks.coretests.R;
+
/**
* Exercise table layout with cells having a weight.
*/
diff --git a/core/tests/coretests/src/android/widget/layout/table/WeightTest.java b/core/tests/coretests/src/android/widget/layout/table/WeightTest.java
index b6655735d38c..fcf3de20e1d8 100644
--- a/core/tests/coretests/src/android/widget/layout/table/WeightTest.java
+++ b/core/tests/coretests/src/android/widget/layout/table/WeightTest.java
@@ -16,13 +16,13 @@
package android.widget.layout.table;
-import android.widget.layout.table.Weight;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
/**
* {@link android.widget.layout.table.Weight} is
* setup to exercise tables in which cells use a weight.
diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java
index a386ebd3d941..cd76d70acdaf 100644
--- a/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java
+++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import android.view.Gravity;
-
import android.util.ListScenario;
/**
diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java
index 519816c731a5..e048e3eb98a0 100644
--- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java
+++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import android.view.Gravity;
-
import android.util.ListScenario;
/**
diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java
index e1171eb0982e..bd8dbe43947b 100644
--- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java
@@ -17,10 +17,9 @@
package android.widget.listview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.ListView;
-import android.widget.listview.ListBottomGravityMany;
+import androidx.test.filters.MediumTest;
public class ListBottomGravityManyTest extends ActivityInstrumentationTestCase<ListBottomGravityMany> {
private ListBottomGravityMany mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java
index c595f62bd858..8da7358c04f6 100644
--- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java
@@ -17,10 +17,9 @@
package android.widget.listview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.ListView;
-import android.widget.listview.ListBottomGravity;
+import androidx.test.filters.MediumTest;
public class ListBottomGravityTest extends ActivityInstrumentationTestCase<ListBottomGravity> {
private ListBottomGravity mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java b/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java
index bbed73c65af2..86407411c2d0 100644
--- a/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java
+++ b/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java
@@ -16,10 +16,10 @@
package android.widget.listview;
-import android.util.ListItemFactory;
import static android.util.ListItemFactory.Slot;
-import android.util.ListScenario;
+import android.util.ListItemFactory;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
diff --git a/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java b/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java
index 258d3efc0c01..81d71a91edc3 100644
--- a/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java
@@ -19,12 +19,13 @@ package android.widget.listview;
import android.app.Instrumentation;
import android.content.Intent;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class ListEmptyViewTest extends ActivityInstrumentationTestCase<ListWithEmptyView> {
private ListWithEmptyView mActivity;
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/ListFilter.java b/core/tests/coretests/src/android/widget/listview/ListFilter.java
index c2ac90e7c47c..1cda71714ca5 100644
--- a/core/tests/coretests/src/android/widget/listview/ListFilter.java
+++ b/core/tests/coretests/src/android/widget/listview/ListFilter.java
@@ -25,7 +25,6 @@ import android.widget.Button;
import com.android.frameworks.coretests.R;
-
/**
* Tests hiding and showing the list filter by hiding and showing an ancestor of the
* ListView
diff --git a/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java b/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java
index bf18a13dc4f1..10b4a79f40aa 100644
--- a/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java
@@ -17,10 +17,11 @@
package android.widget.listview;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListView;
-import android.widget.ListAdapter;
import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+import androidx.test.filters.MediumTest;
public class ListFocusableTest extends ActivityInstrumentationTestCase<ListTopGravity> {
private ListTopGravity mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java b/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java
index 33d61a093ad4..c691ed753301 100644
--- a/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java
@@ -17,10 +17,11 @@
package android.widget.listview;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.ListView;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+
import java.util.Arrays;
/**
diff --git a/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java b/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java
index 1f59c30f20b8..74eda3b850b9 100644
--- a/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java
+++ b/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java
@@ -16,11 +16,10 @@
package android.widget.listview;
-import android.view.View;
-import android.view.ViewGroup;
-
import android.util.ListItemFactory;
import android.util.ListScenario;
+import android.view.View;
+import android.view.ViewGroup;
/**
* List that has different view types
diff --git a/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java b/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java
index 01b39db92a7d..dbd58d7363a8 100644
--- a/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java
@@ -18,12 +18,11 @@ package android.widget.listview;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.ListView;
-import android.widget.listview.ListHeterogeneous;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
public class ListHeterogeneousTest extends ActivityInstrumentationTestCase<ListHeterogeneous> {
private ListHeterogeneous mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java b/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java
index 2ff65de9d523..e98de9c1204c 100644
--- a/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java
+++ b/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java
@@ -16,11 +16,11 @@
package android.widget.listview;
-import android.util.ListItemFactory;
import static android.util.ListItemFactory.Slot;
-import android.util.ListScenario;
import android.content.Context;
+import android.util.ListItemFactory;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
diff --git a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java
index a373a5b19be3..6622c0d21eb2 100644
--- a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java
+++ b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java
@@ -18,10 +18,7 @@ package android.widget.listview;
import android.app.Activity;
import android.os.Bundle;
-import android.os.Handler;
import android.widget.ArrayAdapter;
-import android.widget.GridView;
-import android.widget.TextView;
import android.widget.ListView;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java b/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java
index 3643f794effd..d8508ecafee5 100644
--- a/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import android.widget.listview.ListInHorizontal;
-
public class ListInHorizontalTest extends ListUnspecifiedMeasure<ListInHorizontal> {
public ListInHorizontalTest() {
super(ListInHorizontal.class);
diff --git a/core/tests/coretests/src/android/widget/listview/ListInVertical.java b/core/tests/coretests/src/android/widget/listview/ListInVertical.java
index 3b4885a9589d..4ecf25d6a818 100644
--- a/core/tests/coretests/src/android/widget/listview/ListInVertical.java
+++ b/core/tests/coretests/src/android/widget/listview/ListInVertical.java
@@ -18,10 +18,7 @@ package android.widget.listview;
import android.app.Activity;
import android.os.Bundle;
-import android.os.Handler;
import android.widget.ArrayAdapter;
-import android.widget.GridView;
-import android.widget.TextView;
import android.widget.ListView;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java b/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java
index 85864294573f..5e385a33b057 100644
--- a/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import android.widget.listview.ListInVertical;
-
public class ListInVerticalTest extends ListUnspecifiedMeasure<ListInVertical> {
public ListInVerticalTest() {
super(ListInVertical.class);
diff --git a/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java b/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java
index d5da28e75c4a..0ec7a2431b93 100644
--- a/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java
+++ b/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java
@@ -16,13 +16,14 @@
package android.widget.listview;
+import android.util.ListItemFactory;
+import android.util.ListScenario;
import android.view.View;
- import android.view.ViewGroup;
- import com.google.android.collect.Sets;
- import android.util.ListScenario;
- import android.util.ListItemFactory;
+import android.view.ViewGroup;
- import java.util.Set;
+import com.google.android.collect.Sets;
+
+import java.util.Set;
/**
* List that interleaves focusable items.
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java
index f7c01b1ea975..3159e53eabc5 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java
@@ -16,12 +16,10 @@
package android.widget.listview;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
import android.util.ListItemFactory;
import android.util.ListScenario;
+import android.view.View;
+import android.view.ViewGroup;
/**
* A list where the items may befocusable, but the second item isn't actually focusabe.
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java
index b529b2e7b0e8..861e2a919052 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java
@@ -16,8 +16,8 @@
package android.widget.listview;
-import android.util.ListScenario;
import android.util.ListItemFactory;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java
index 59987ec4702b..e9c9c1dd586c 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java
@@ -16,10 +16,10 @@
package android.widget.listview;
-import android.view.View;
-import android.view.ViewGroup;
import android.util.ListItemFactory;
import android.util.ListScenario;
+import android.view.View;
+import android.view.ViewGroup;
/**
* A list where each item is tall with buttons that are farther apart than the screen
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java b/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java
index ea2c5f2caf13..2a0e013be616 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java
@@ -17,13 +17,13 @@
package android.widget.listview;
import android.content.Context;
+import android.util.InternalSelectionView;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
-import android.util.InternalSelectionView;
-import android.util.ListScenario;
/**
* Each item is an internal selection view, a button, and some filler
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java b/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java
index 73eb0a8f8e63..91ff06b3f670 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java
@@ -18,13 +18,13 @@ package android.widget.listview;
import android.graphics.Rect;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.view.View;
import android.view.KeyEvent;
+import android.view.View;
import android.widget.ListView;
-import android.widget.listview.ListOfThinItems;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
public class ListItemRequestRectAboveThinFirstItemTest
extends ActivityInstrumentationTestCase<ListOfThinItems> {
diff --git a/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java b/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java
index a5fe17ac7603..d80fd90de53e 100644
--- a/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java
+++ b/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java
@@ -17,13 +17,12 @@
package android.widget.listview;
import android.content.Context;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.TextView;
-import android.util.ListScenario;
-
/**
* A list where each item expands by 1.5 when selected.
*/
diff --git a/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java b/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java
index 12b5ef4067ed..54f302c8178c 100644
--- a/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java
+++ b/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java
@@ -20,14 +20,13 @@ import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
-import android.provider.Settings;
import android.provider.Contacts.People;
+import android.provider.Settings;
import android.view.View;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;
-import android.widget.AdapterView.OnItemClickListener;
-
public class ListManagedCursor extends ListActivity implements OnItemClickListener {
diff --git a/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java b/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java
index bc3776cfb02e..8e0b6fe7ef55 100644
--- a/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java
@@ -18,11 +18,12 @@ package android.widget.listview;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.TouchUtils;
import android.view.KeyEvent;
import android.widget.ListView;
-import android.test.TouchUtils;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
/**
* Tests restoring the scroll position in a list with a managed cursor.
diff --git a/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java b/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java
index 919ef69fc8a2..70b9081128a0 100644
--- a/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java
+++ b/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java
@@ -16,12 +16,11 @@
package android.widget.listview;
+import android.util.ListScenario;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.util.ListScenario;
-
/**
* Each list item has two focusables that are close enough together that
* it shouldn't require panning to move focus.
diff --git a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java
index 76814fb480cd..075712efe64a 100644
--- a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java
+++ b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java
@@ -18,11 +18,11 @@ package android.widget.listview;
import android.app.Activity;
import android.os.Bundle;
+import android.view.View;
+import android.view.ViewDebug;
import android.widget.ArrayAdapter;
-import android.widget.ListView;
import android.widget.ImageButton;
-import android.view.ViewDebug;
-import android.view.View;
+import android.widget.ListView;
import com.android.frameworks.coretests.R;
diff --git a/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java b/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java
index 896bd19d311f..be14de8986d8 100644
--- a/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java
@@ -16,12 +16,11 @@
package android.widget.listview;
-import android.widget.listview.ListItemFocusablesClose;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
+import androidx.test.filters.MediumTest;
+
public class ListRetainsFocusAcrossLayoutsTest extends ActivityInstrumentationTestCase<ListItemFocusablesClose> {
public ListRetainsFocusAcrossLayoutsTest() {
diff --git a/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java b/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java
index 7b29a66c22fa..28addd6431ae 100644
--- a/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java
@@ -19,12 +19,13 @@ package android.widget.listview;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.AbsListView;
import android.widget.ListView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class ListScrollListenerTest extends ActivityInstrumentationTestCase<ListScrollListener> implements
AbsListView.OnScrollListener {
private ListScrollListener mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListSetSelection.java b/core/tests/coretests/src/android/widget/listview/ListSetSelection.java
index 6c2e26401eed..af8e899a867a 100644
--- a/core/tests/coretests/src/android/widget/listview/ListSetSelection.java
+++ b/core/tests/coretests/src/android/widget/listview/ListSetSelection.java
@@ -16,12 +16,12 @@
package android.widget.listview;
+import android.os.Bundle;
import android.util.ListScenario;
import android.view.KeyEvent;
import android.view.View;
-import android.os.Bundle;
-import android.widget.LinearLayout;
import android.widget.Button;
+import android.widget.LinearLayout;
/**
* List of 1,000 items used to test calls to setSelection() in touch mode.
diff --git a/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java b/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java
index 4cef16470609..2caca1309d0c 100644
--- a/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java
@@ -17,10 +17,11 @@
package android.widget.listview;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.ListView;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+
/**
* Basic tests of setting & clearing the selection
*/
diff --git a/core/tests/coretests/src/android/widget/listview/ListSimple.java b/core/tests/coretests/src/android/widget/listview/ListSimple.java
index 6accae1c3ef1..f53638eb8ff1 100644
--- a/core/tests/coretests/src/android/widget/listview/ListSimple.java
+++ b/core/tests/coretests/src/android/widget/listview/ListSimple.java
@@ -16,11 +16,10 @@
package android.widget.listview;
+import android.os.Bundle;
import android.util.ListScenario;
-
import android.view.View;
import android.view.ViewGroup;
-import android.os.Bundle;
import android.widget.TextView;
public class ListSimple extends ListScenario {
diff --git a/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java b/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java
index 95f09f6e78bc..c4e9fe941b72 100644
--- a/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java
+++ b/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java
@@ -16,17 +16,17 @@
package android.widget.listview;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
import android.widget.BaseAdapter;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
/**
* Exercises moving focus into the list from the side
*/
diff --git a/core/tests/coretests/src/android/widget/listview/ListThrasher.java b/core/tests/coretests/src/android/widget/listview/ListThrasher.java
index 0237a9551ce5..d82f68d11c92 100644
--- a/core/tests/coretests/src/android/widget/listview/ListThrasher.java
+++ b/core/tests/coretests/src/android/widget/listview/ListThrasher.java
@@ -16,19 +16,19 @@
package android.widget.listview;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
import java.util.Random;
/**
diff --git a/core/tests/coretests/src/android/widget/listview/ListTopGravity.java b/core/tests/coretests/src/android/widget/listview/ListTopGravity.java
index 986cc5713db0..31339e9ee9c2 100644
--- a/core/tests/coretests/src/android/widget/listview/ListTopGravity.java
+++ b/core/tests/coretests/src/android/widget/listview/ListTopGravity.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import android.view.Gravity;
-
import android.util.ListScenario;
/**
diff --git a/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java b/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java
index 199d069e16ef..0fc87ea063ed 100644
--- a/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java
+++ b/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java
@@ -16,13 +16,14 @@
package android.widget.listview;
-import com.android.frameworks.coretests.R;
-
-import android.test.ActivityInstrumentationTestCase;
import android.app.Activity;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.ActivityInstrumentationTestCase;
import android.widget.ListView;
+import androidx.test.filters.MediumTest;
+
+import com.android.frameworks.coretests.R;
+
public class ListUnspecifiedMeasure<T extends Activity> extends ActivityInstrumentationTestCase<T> {
private T mActivity;
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java b/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java
index 5ab2757deae7..63941f1c967d 100644
--- a/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java
+++ b/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java
@@ -18,12 +18,12 @@ package android.widget.listview;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.Button;
import android.widget.ListView;
+import androidx.test.filters.MediumTest;
+
import com.android.frameworks.coretests.R;
-import android.widget.listview.ListViewHeight;
public class ListViewHeightTest extends ActivityInstrumentationTestCase<ListViewHeight> {
private ListViewHeight mActivity;
diff --git a/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java b/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java
index 348ea1b75578..10ba8b73cd02 100644
--- a/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java
+++ b/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
@@ -32,6 +30,8 @@ import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
+import com.android.frameworks.coretests.R;
+
/**
* See 1080989. You need some contacts for this adapter.
*/
diff --git a/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java b/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java
index 74dd06c1ba71..52273fdc98a0 100644
--- a/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java
+++ b/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java
@@ -16,8 +16,6 @@
package android.widget.listview;
-import com.android.frameworks.coretests.R;
-
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
@@ -26,6 +24,8 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
+import com.android.frameworks.coretests.R;
+
/**
* Tests using an empty view with a list */
diff --git a/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java b/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java
index aea091ae9cf3..6030582a2445 100644
--- a/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java
+++ b/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java
@@ -16,9 +16,8 @@
package android.widget.listview;
-import android.util.ListScenario;
-
import android.os.Bundle;
+import android.util.ListScenario;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
diff --git a/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java b/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java
index 26e1d5d88e1e..13e770cd4e47 100644
--- a/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java
+++ b/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java
@@ -16,8 +16,8 @@
package android.widget.listview;
-import android.widget.TextView;
import android.util.ListScenario;
+import android.widget.TextView;
/**
* The header text view echos the value of the selected item by using (indirectly)
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java
index ec8ab7e77357..22c28c29b322 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java
@@ -17,13 +17,14 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.ListUtil;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.listview.ListInterleaveFocusables;
+import androidx.test.filters.MediumTest;
+
public class ListInterleaveFocusablesTest extends ActivityInstrumentationTestCase2<ListInterleaveFocusables> {
private ListView mListView;
private ListUtil mListUtil;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java
index 82f48801111e..c645b7c5b767 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java
@@ -17,11 +17,12 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListView;
import android.view.KeyEvent;
+import android.widget.ListView;
import android.widget.listview.ListItemFocusableAboveUnfocusable;
+import androidx.test.filters.MediumTest;
+
public class ListItemFocusableAboveUnfocusableTest extends ActivityInstrumentationTestCase<ListItemFocusableAboveUnfocusable> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java
index 3b30ebe766cb..c7525b33d6de 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java
@@ -17,12 +17,13 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.listview.ListItemFocusablesClose;
+import androidx.test.filters.MediumTest;
+
public class ListItemFocusablesCloseTest extends ActivityInstrumentationTestCase<ListItemFocusablesClose> {
private ListView mListView;
private int mListTop;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java
index 475930df37e3..4bb2206984da 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java
@@ -17,7 +17,6 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -25,6 +24,8 @@ import android.widget.Button;
import android.widget.ListView;
import android.widget.listview.ListItemFocusablesFarApart;
+import androidx.test.filters.MediumTest;
+
public class ListItemFocusablesFarApartTest extends ActivityInstrumentationTestCase<ListItemFocusablesFarApart> {
private ListView mListView;
private int mListTop;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java
index 91a1eba124de..76052914e027 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java
@@ -17,13 +17,14 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.ListView;
import android.view.KeyEvent;
+import android.widget.ListView;
import android.widget.listview.ListItemsExpandOnSelection;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListItemsExpandOnSelectionTest extends ActivityInstrumentationTestCase<ListItemsExpandOnSelection> {
private ListView mListView;
private int mListTop;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java
index 5bc121a907ae..fdae4833532a 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java
@@ -17,12 +17,13 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListView;
-import android.view.View;
import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ListView;
import android.widget.listview.ListLastItemPartiallyVisible;
+import androidx.test.filters.MediumTest;
+
public class ListLastItemPartiallyVisibleTest extends ActivityInstrumentationTestCase<ListLastItemPartiallyVisible> {
private ListView mListView;
private int mListBottom;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java
index bda71d0d3fe6..d44b130164f2 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java
@@ -17,14 +17,15 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.listview.ListOfItemsShorterThanScreen;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListOfItemsShorterThanScreenTest
extends ActivityInstrumentationTestCase<ListOfItemsShorterThanScreen> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java
index 213544526170..1decdadd7fb8 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java
@@ -17,13 +17,14 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.listview.ListOfItemsTallerThanScreen;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListOfItemsTallerThanScreenTest
extends ActivityInstrumentationTestCase2<ListOfItemsTallerThanScreen> {
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java
index ef70b5ae46a5..67808f1945f9 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java
@@ -17,13 +17,14 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.util.ListUtil;
import android.view.KeyEvent;
import android.widget.ListView;
import android.widget.listview.ListOfShortShortTallShortShort;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListOfShortShortTallShortShortTest extends ActivityInstrumentationTestCase2<ListOfShortShortTallShortShort> {
private ListView mListView;
private ListUtil mListUtil;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java
index c958591e8c2e..f9aa6dc13b6c 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java
@@ -17,11 +17,12 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListView;
import android.view.KeyEvent;
+import android.widget.ListView;
import android.widget.listview.ListOfShortTallShort;
+import androidx.test.filters.MediumTest;
+
public class ListOfShortTallShortTest extends ActivityInstrumentationTestCase<ListOfShortTallShort> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java
index c191d71aaf6e..6bd1cb5557a6 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java
@@ -17,14 +17,15 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.listview.ListOfThinItems;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListOfThinItemsTest extends ActivityInstrumentationTestCase<ListOfThinItems> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java
index 9a8e63421d61..60bc1155bc00 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java
@@ -16,12 +16,13 @@
package android.widget.listview.arrowscroll;
-import android.support.test.filters.LargeTest;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;
+import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.listview.ListWithFirstScreenUnSelectable;
-import android.widget.AdapterView;
+
+import androidx.test.filters.LargeTest;
@LargeTest
public class ListWithFirstScreenUnSelectableTest
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java
index 56ca00987dc2..a60054e2e821 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java
@@ -17,12 +17,13 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.ListView;
import android.widget.listview.ListWithNoFadingEdge;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
public class ListWithNoFadingEdgeTest extends ActivityInstrumentationTestCase<ListWithNoFadingEdge> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java
index cf319d11ea88..80e70c6e4cac 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java
@@ -17,14 +17,15 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.listview.ListWithOffScreenNextSelectable;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
@Suppress // Failing.
public class ListWithOffScreenNextSelectableTest
extends ActivityInstrumentationTestCase<ListWithOffScreenNextSelectable> {
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java
index feea9b2c403c..819b739fdd32 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java
@@ -17,12 +17,13 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.view.KeyEvent;
import android.widget.ListView;
import android.widget.TextView;
-import android.view.KeyEvent;
import android.widget.listview.ListWithOnItemSelectedAction;
+import androidx.test.filters.MediumTest;
+
public class ListWithOnItemSelectedActionTest extends ActivityInstrumentationTestCase<ListWithOnItemSelectedAction> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java
index 211c8c8d0f7e..9bbdc2ae8b9e 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java
@@ -17,13 +17,14 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.listview.ListWithScreenOfNoSelectables;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListWithScreenOfNoSelectablesTest extends ActivityInstrumentationTestCase2<ListWithScreenOfNoSelectables> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java
index 42058f030020..21fa51d4ae13 100644
--- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java
@@ -17,11 +17,12 @@
package android.widget.listview.arrowscroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.ListView;
import android.view.KeyEvent;
+import android.widget.ListView;
import android.widget.listview.ListWithSeparators;
+import androidx.test.filters.MediumTest;
+
public class ListWithSeparatorsTest extends ActivityInstrumentationTestCase<ListWithSeparators> {
private ListWithSeparators mActivity;
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java b/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java
index 6a7466b627aa..e9baabf3175a 100644
--- a/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java
+++ b/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java
@@ -16,14 +16,14 @@
package android.widget.listview.focus;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.listview.AdjacentListsWithAdjacentISVsInside;
-import android.util.InternalSelectionView;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.util.InternalSelectionView;
import android.view.KeyEvent;
import android.widget.ListView;
+import android.widget.listview.AdjacentListsWithAdjacentISVsInside;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
public class AdjacentListsWithAdjacentISVsInsideTest extends ActivityInstrumentationTestCase<AdjacentListsWithAdjacentISVsInside> {
diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java
index 5540d650dd19..3fbdacc302f5 100644
--- a/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java
@@ -16,15 +16,15 @@
package android.widget.listview.focus;
-import android.widget.listview.ListButtonsDiagonalAcrossItems;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.FocusFinder;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
+import android.widget.listview.ListButtonsDiagonalAcrossItems;
+
+import androidx.test.filters.MediumTest;
/**
* Test that ListView will override default behavior of focus searching to
diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java
index edc60b58e9d0..544895279e6d 100644
--- a/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java
+++ b/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java
@@ -17,12 +17,13 @@
package android.widget.listview.focus;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.ListView;
import android.widget.listview.ListHorizontalFocusWithinItemWins;
+import androidx.test.filters.MediumTest;
+
public class ListHorizontalFocusWithinItemWinsTest extends ActivityInstrumentationTestCase<ListHorizontalFocusWithinItemWins> {
private ListView mListView;
diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
index b449b61baf83..0b17aaf4792c 100644
--- a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
+++ b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
@@ -17,17 +17,18 @@
package android.widget.listview.focus;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.FlakyTest;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.listview.ListWithEditTextHeader;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2<ListWithEditTextHeader> {
private ListView mListView;
@@ -49,7 +50,7 @@ public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2
assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
}
- @FlakyTest(tolerance=2)
+ @FlakyTest
@LargeTest
public void testClickingHeaderKeepsFocus() {
TouchUtils.clickView(this, mListView.getChildAt(0));
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java
index 28f899edc9b6..262d0f4ba42f 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java
@@ -17,14 +17,14 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
-import android.widget.ListView;
import android.view.View;
-
+import android.widget.ListView;
import android.widget.listview.ListGetSelectedView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* This test is made to check that getSelectedView() will return
* null in touch mode.
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java
index ffa9a5e79543..48e8c5e24946 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java
@@ -17,15 +17,14 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.TouchUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ListView;
-
import android.widget.listview.ListOfTouchables;
-import android.test.TouchUtils;
+
+import androidx.test.filters.MediumTest;
/**
* Touch tests for a list where all of the items fit on the screen.
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java
index aed513a0721b..716683ab52ad 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java
@@ -17,15 +17,15 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.View;
import android.widget.ListView;
-
import android.widget.listview.ListSimple;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
/**
* Tests setting the selection in touch mode
*/
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java
index 7daf64e0a596..6a1f076ea2c3 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java
@@ -17,16 +17,16 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ListView;
-
import android.widget.listview.ListBottomGravityMany;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* Touch tests for a list where all of the items do not fit on the screen, and the list
* stacks from the bottom.
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java
index 4086cf094ab9..89498d6632b9 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java
@@ -17,13 +17,13 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.View;
import android.widget.ListView;
-
import android.widget.listview.ListBottomGravity;
+import androidx.test.filters.MediumTest;
+
/**
* Touch tests for a list where all of the items fit on the screen, and the list
* stacks from the bottom.
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java
index 30d56caee7f6..c7f23714f3ba 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java
@@ -17,16 +17,16 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ListView;
-
import android.widget.listview.ListTopGravityMany;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* Touch tests for a list where all of the items do not fit on the screen.
*/
diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java
index 5b064b3e770d..8a557aba700e 100644
--- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java
+++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java
@@ -17,13 +17,13 @@
package android.widget.listview.touch;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.TouchUtils;
import android.view.View;
import android.widget.ListView;
-
import android.widget.listview.ListTopGravity;
+import androidx.test.filters.MediumTest;
+
/**
* Touch tests for a list where all of the items fit on the screen.
*/
diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java
index a7f5c0560a4e..a30985bfaf87 100644
--- a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java
+++ b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java
@@ -18,7 +18,6 @@ package android.widget.scroll;
import android.util.InternalSelectionView;
import android.util.ScrollViewScenario;
-
import android.widget.Button;
/**
diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java
index 8123228c5228..825aa1aa85a3 100644
--- a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java
@@ -16,14 +16,13 @@
package android.widget.scroll;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.scroll.ButtonAboveTallInternalSelectionView;
-import android.util.InternalSelectionView;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.util.InternalSelectionView;
import android.view.KeyEvent;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
@Suppress // Failing.
public class ButtonAboveTallInternalSelectionViewTest extends
ActivityInstrumentationTestCase<ButtonAboveTallInternalSelectionView> {
diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java b/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java
index 3d5f86d35b07..47d36ddf9be1 100644
--- a/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java
+++ b/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java
@@ -17,7 +17,6 @@
package android.widget.scroll;
import android.util.ScrollViewScenario;
-
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java
index afc275f25181..dba07a086e89 100644
--- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java
+++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java
@@ -16,15 +16,15 @@
package android.widget.scroll;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
-import android.os.Bundle;
import android.graphics.Rect;
+import android.os.Bundle;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
+import com.android.frameworks.coretests.R;
+
/**
* A screen with some scenarios that exercise {@link ScrollView}'s implementation
* of {@link android.view.ViewGroup#requestChildRectangleOnScreen}:
diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java
index f8abdb2c8ec1..7c3df910a547 100644
--- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java
@@ -16,19 +16,19 @@
package android.widget.scroll;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.scroll.RequestRectangleVisible;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.ViewAsserts;
+import android.view.KeyEvent;
+import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
-import android.view.View;
-import android.view.KeyEvent;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
+
+import com.android.frameworks.coretests.R;
/**
* {@link RequestRectangleVisible} is set up to exercise the cases of moving a
diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java
index 731b25a08926..105686ad7a92 100644
--- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java
+++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java
@@ -16,15 +16,14 @@
package android.widget.scroll;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
+import android.graphics.Rect;
import android.os.Bundle;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Button;
import android.view.View;
-import android.graphics.Rect;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.frameworks.coretests.R;
public class RequestRectangleVisibleWithInternalScroll extends Activity {
diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java
index 5e9b520a9ec2..1a221ff63863 100644
--- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java
@@ -16,16 +16,17 @@
package android.widget.scroll;
-import com.android.frameworks.coretests.R;
-
import android.test.ActivityInstrumentationTestCase;
import android.test.ViewAsserts;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
+import androidx.test.filters.Suppress;
+
+import com.android.frameworks.coretests.R;
+
/**
* This is suppressed because {@link TextView#scrollBy} isn't working.
*/
diff --git a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java
index 027ea0f83350..92a315296064 100644
--- a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java
+++ b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java
@@ -16,15 +16,14 @@
package android.widget.scroll;
-import com.android.frameworks.coretests.R;
-
import android.app.Activity;
import android.os.Bundle;
+import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
-import android.widget.Button;
+import com.android.frameworks.coretests.R;
/**
* Basic scroll view example
diff --git a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java
index 3fd17ee51abf..8d71f84d8f7d 100644
--- a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java
@@ -17,14 +17,14 @@
package android.widget.scroll;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
public class ScrollViewButtonsAndLabelsTest
extends ActivityInstrumentationTestCase<ScrollViewButtonsAndLabels> {
diff --git a/core/tests/coretests/src/android/widget/scroll/ShortButtons.java b/core/tests/coretests/src/android/widget/scroll/ShortButtons.java
index 3a0f29a530ee..90ede7d35511 100644
--- a/core/tests/coretests/src/android/widget/scroll/ShortButtons.java
+++ b/core/tests/coretests/src/android/widget/scroll/ShortButtons.java
@@ -17,7 +17,6 @@
package android.widget.scroll;
import android.util.ScrollViewScenario;
-
import android.widget.Button;
import android.widget.LinearLayout;
diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java
index 56d7ed2c3243..04f5ac84bd2a 100644
--- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java
@@ -16,16 +16,16 @@
package android.widget.scroll.arrowscroll;
-import android.widget.scroll.ButtonsWithTallTextViewInBetween;
-
import android.graphics.Rect;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
+import android.widget.scroll.ButtonsWithTallTextViewInBetween;
+
+import androidx.test.filters.MediumTest;
public class ButtonsWithTallTextViewInBetweenTest
extends ActivityInstrumentationTestCase<ButtonsWithTallTextViewInBetween> {
diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java
index 6ce4c1508213..2f4509827592 100644
--- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java
@@ -16,14 +16,14 @@
package android.widget.scroll.arrowscroll;
-import android.test.suitebuilder.annotation.Suppress;
-import android.widget.scroll.arrowscroll.MultiPageTextWithPadding;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
-import android.widget.TextView;
import android.widget.ScrollView;
+import android.widget.TextView;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.Suppress;
@Suppress // Flaky
public class MultiPageTextWithPaddingTest extends
diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java
index 267d8ee4a250..a2928cb78e0c 100644
--- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java
@@ -16,15 +16,15 @@
package android.widget.scroll.arrowscroll;
-import android.widget.scroll.ShortButtons;
-
import android.graphics.Rect;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.ScrollView;
+import android.widget.scroll.ShortButtons;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
public class ShortButtonsTest extends ActivityInstrumentationTestCase<ShortButtons> {
diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java
index 5351839e868f..0681081f7452 100644
--- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java
+++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java
@@ -16,13 +16,13 @@
package android.widget.scroll.arrowscroll;
-import android.widget.scroll.TallTextAboveButton;
-
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.ScrollView;
import android.widget.TextView;
+import android.widget.scroll.TallTextAboveButton;
+
+import androidx.test.filters.MediumTest;
public class TallTextAboveButtonTest extends ActivityInstrumentationTestCase<TallTextAboveButton> {
private ScrollView mScrollView;
diff --git a/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java b/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java
index 449c95cc81fe..aa20c9b65f2e 100644
--- a/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java
+++ b/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java
@@ -16,16 +16,17 @@
package android.widget.touchmode;
-import android.widget.layout.linear.LLOfButtons1;
-import android.widget.layout.linear.LLOfButtons2;
import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterClick;
-import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey;
import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap;
+import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
+import android.widget.layout.linear.LLOfButtons1;
+import android.widget.layout.linear.LLOfButtons2;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
/**
* Tests that the touch mode changes from various events, and that the state
diff --git a/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java b/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java
index 691b25a51b8a..97c982f3cbfd 100644
--- a/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java
+++ b/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java
@@ -16,12 +16,12 @@
package android.widget.touchmode;
-import android.widget.layout.linear.LLOfTwoFocusableInTouchMode;
-
import android.test.ActivityInstrumentationTestCase2;
import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.widget.layout.linear.LLOfTwoFocusableInTouchMode;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
public class FocusableInTouchModeClickTest extends ActivityInstrumentationTestCase2<LLOfTwoFocusableInTouchMode> {
diff --git a/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java b/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java
index 5339188ae89a..88aa9caa31b6 100644
--- a/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java
+++ b/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java
@@ -16,14 +16,15 @@
package android.widget.touchmode;
-import android.widget.layout.linear.LLEditTextThenButton;
import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.layout.linear.LLEditTextThenButton;
+
+import androidx.test.filters.MediumTest;
public class StartInTouchWithViewInFocusTest extends
ActivityInstrumentationTestCase2<LLEditTextThenButton> {
diff --git a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java
index 5a6110c08116..f192f6815163 100644
--- a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java
+++ b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java
@@ -21,11 +21,11 @@ import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap;
import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.layout.linear.LLOfButtons1;
+import androidx.test.filters.MediumTest;
/**
* Make sure focus isn't kept by buttons when entering touch mode.
diff --git a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java
index 3ddeef072a9e..87f33a4cc803 100644
--- a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java
+++ b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java
@@ -20,12 +20,13 @@ import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterClick;
import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap;
import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
import android.widget.Button;
import android.widget.EditText;
import android.widget.layout.linear.LLEditTextThenButton;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+
/**
* Some views, like edit texts, can keep and gain focus even when in touch mode.
*/
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
index a302657c7ede..aadfcbc84f76 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
@@ -57,7 +57,6 @@ import android.os.Vibrator;
import android.provider.Settings;
import android.speech.tts.TextToSpeech;
import android.speech.tts.Voice;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
import android.text.TextUtils;
import android.view.Window;
@@ -66,6 +65,8 @@ import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager;
import android.widget.Toast;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController.FrameworkObjectProvider;
import com.android.internal.util.test.FakeSettingsProvider;
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index 1859378e4c1f..aaa624e6b25e 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -16,41 +16,41 @@
package com.android.internal.app;
-import com.android.internal.R;
-import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-
-import android.app.usage.UsageStats;
-import android.app.usage.UsageStatsManager;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
import static com.android.internal.app.ChooserWrapperActivity.sOverrides;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.usage.UsageStatsManager;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.R;
+import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Chooser activity instrumentation tests
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index c446f3c79ea8..60529f6d4071 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -16,14 +16,14 @@
package com.android.internal.app;
+import static org.mockito.Mockito.mock;
+
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import java.util.function.Function;
-import static org.mockito.Mockito.mock;
-
public class ChooserWrapperActivity extends ChooserActivity {
/*
* Simple wrapper around chooser activity to be able to initiate it under test
diff --git a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
index cfb6bdd5d613..9b13af2a4357 100644
--- a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
@@ -46,9 +46,10 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
index 404c99c82a4c..fe2fb8530cf6 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
@@ -16,6 +16,29 @@
package com.android.internal.app;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static com.android.internal.app.ResolverWrapperActivity.sOverrides;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.when;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.R;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.widget.ResolverDrawerLayout;
@@ -26,37 +49,8 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
-import android.app.usage.UsageStats;
-import android.app.usage.UsageStatsManager;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.view.View;
-import android.widget.RelativeLayout;
-
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
-
-import static android.os.SystemClock.sleep;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static com.android.internal.app.ResolverWrapperActivity.sOverrides;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
/**
* Resolver activity instrumentation tests
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java b/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java
index c710b9ad77bf..850b466ec755 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java
@@ -23,10 +23,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Utility class used by resolver tests to create mock data
*/
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java
index 284ab605c3b5..fcec00e34278 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java
@@ -25,34 +25,31 @@ import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.mockito.stubbing.Answer;
-
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.content.Intent;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
-import java.io.File;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java
index 163211e10e6a..83f6bc2e8bf3 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java
@@ -16,18 +16,13 @@
package com.android.internal.app;
+import static org.mockito.Mockito.mock;
+
import android.app.usage.UsageStatsManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.PackageManager;
-import android.os.RemoteException;
import java.util.function.Function;
-import static org.mockito.Mockito.mock;
-
-
/*
* Simple wrapper around chooser activity to be able to initiate it under test
*/
diff --git a/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java b/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java
index 472958a01eb4..87ad124fe04b 100644
--- a/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java
@@ -17,12 +17,13 @@
package com.android.internal.app;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+
/**
* Tests for {@link WindowDecorActionBar}.
*/
diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
index 115af5e0ea5d..f7fea3b7a6d0 100644
--- a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
@@ -16,20 +16,14 @@
package com.android.internal.app.procstats;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-
-import android.os.BatteryStats;
import android.os.Parcel;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+
import junit.framework.Assert;
import junit.framework.TestCase;
-import org.mockito.Mockito;
-
/**
* Provides test cases for SparseMappingTable.
*/
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java
index 629f7b60471c..222e494de7d4 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java
@@ -18,10 +18,11 @@ package com.android.internal.inputmethod;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager.LayoutParams;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java
index 8179328c32c4..ba6390808151 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java
@@ -18,8 +18,8 @@ package com.android.internal.inputmethod;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index 992b46f96339..b6878013b254 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -13,6 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import static android.os.BatteryStats.STATS_SINCE_CHARGED;
@@ -20,10 +21,11 @@ import static android.os.BatteryStats.STATS_SINCE_CHARGED;
import android.app.ActivityManager;
import android.os.BatteryStats;
import android.os.WorkSource;
-import android.support.test.filters.SmallTest;
import android.util.ArrayMap;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
/**
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
index 08f8dd146516..37f818a70ec9 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
@@ -13,11 +13,13 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java
index ee8d5081b0b3..0179eadae6a1 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static android.os.BatteryStats.STATS_SINCE_CHARGED;
@@ -36,11 +37,12 @@ import static org.mockito.Mockito.when;
import android.os.BatteryStats;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseLongArray;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.ArrayUtils;
import org.junit.Before;
@@ -64,7 +66,7 @@ import java.util.Arrays;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class com.android.internal.os.BatteryStatsCpuTimesTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*
* or
*
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java
index 3a5a9f5bc67a..efb871027830 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java
@@ -13,10 +13,12 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.os.BatteryStats;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
index 19dab7961401..a42286f6882f 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
@@ -13,11 +13,13 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java
index 7467114a7596..355601ca05ed 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java
@@ -17,7 +17,6 @@
package com.android.internal.os;
-
import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP;
import static com.google.common.truth.Truth.assertThat;
@@ -37,12 +36,13 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.Process;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.format.DateUtils;
import android.util.StatsLog;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import junit.framework.TestCase;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java
index 10a318920646..cc0ddb7bf8a4 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java
@@ -13,18 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-
import android.content.Context;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
index 613de45173d6..dc9367557f9f 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static android.os.BatteryStats.STATS_SINCE_CHARGED;
@@ -31,12 +32,13 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import android.os.BatteryStats;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.Display;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.ArrayUtils;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index 8cbe5d68d554..3e33273feddb 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -13,6 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import static android.os.BatteryStats.STATS_CURRENT;
@@ -20,21 +21,20 @@ import static android.os.BatteryStats.STATS_SINCE_CHARGED;
import static android.os.BatteryStats.WAKE_TYPE_PARTIAL;
import android.app.ActivityManager;
-import android.os.BatteryManager;
import android.os.BatteryStats;
import android.os.BatteryStats.HistoryItem;
import android.os.BatteryStats.Uid.Sensor;
import android.os.WorkSource;
-import android.support.test.filters.SmallTest;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.os.BatteryStatsImpl.DualTimer;
import com.android.internal.os.BatteryStatsImpl.Uid;
+
import junit.framework.TestCase;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
/**
@@ -47,7 +47,7 @@ import java.util.Map;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class com.android.internal.os.BatteryStatsNoteTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*/
public class BatteryStatsNoteTest extends TestCase {
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java
index 251ceb04b973..61d20dfb32d9 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java
@@ -13,11 +13,13 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
index a751f9060588..b851f0ad3414 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
@@ -13,13 +13,15 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.app.ActivityManager;
import android.os.BatteryStats;
-import android.support.test.filters.SmallTest;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
/**
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java
index 5fd822549ff8..b9995c443f35 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java
@@ -18,7 +18,8 @@ package com.android.internal.os;
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.Assert;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java
index 015314ebe8dc..f76f31619f79 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java
@@ -13,10 +13,12 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
import android.os.BatteryStats;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 225515e9e3f3..d69e1d131731 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java
index 3190d9e77c77..bce8b40cc31d 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java
@@ -16,19 +16,20 @@
package com.android.internal.os;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+
import junit.framework.Assert;
import junit.framework.TestCase;
import org.mockito.Mockito;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
/**
* Provides test cases for android.os.BatteryStats.
*/
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java
index 98d0f7fdce5c..87dc2f3dd43b 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java
@@ -18,16 +18,17 @@ package com.android.internal.os;
import android.os.BatteryStats;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
import android.util.StringBuilderPrinter;
-import junit.framework.Assert;
-import junit.framework.TestCase;
+import androidx.test.filters.SmallTest;
import com.android.internal.os.BatteryStatsImpl.Clocks;
import com.android.internal.os.BatteryStatsImpl.TimeBase;
import com.android.internal.os.BatteryStatsImpl.Timer;
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
/**
* Provides test cases for android.os.BatteryStats.
*/
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java
index a7e75a248eda..4df3190cc2d7 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java
@@ -16,22 +16,10 @@
package com.android.internal.os;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
+import androidx.test.filters.SmallTest;
-import android.os.BatteryStats;
-import android.os.Parcel;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
-
-import junit.framework.Assert;
import junit.framework.TestCase;
-import com.android.internal.os.BatteryStatsImpl;
-
-import org.mockito.Mockito;
-
/**
* Provides test cases for android.os.BatteryStats.
*/
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java
index 450473d0335c..e7a1bcae459a 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java
@@ -28,12 +28,13 @@ import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.util.ArraySet;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
index dc3a12f0bbf5..1d35143e3fab 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -22,11 +22,12 @@ import static org.junit.Assert.assertTrue;
import android.os.Binder;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.BinderInternal.CallSession;
import org.junit.Assert;
diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
index 42c9139e04e2..01515bd9c6b5 100644
--- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static android.os.BatteryStats.UID_TIMES_TYPE_ALL;
@@ -33,9 +34,6 @@ import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
-import com.android.frameworks.coretests.aidl.ICmdCallback;
-import com.android.frameworks.coretests.aidl.ICmdReceiver;
-
import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.content.ComponentName;
@@ -52,14 +50,18 @@ import android.os.PowerManager;
import android.os.Process;
import android.os.SystemClock;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.text.TextUtils;
import android.util.DebugUtils;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.frameworks.coretests.aidl.ICmdCallback;
+import com.android.frameworks.coretests.aidl.ICmdReceiver;
+
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
diff --git a/core/tests/coretests/src/com/android/internal/os/DebugTest.java b/core/tests/coretests/src/com/android/internal/os/DebugTest.java
index efb78d788575..2a8a8571c882 100644
--- a/core/tests/coretests/src/com/android/internal/os/DebugTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/DebugTest.java
@@ -18,7 +18,8 @@ package com.android.internal.os;
import android.os.Debug;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
@SmallTest
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java
index 8360126f3751..a25a74890029 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java
@@ -24,9 +24,10 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java
index 2663f2bc8ae1..7a316056429a 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java
@@ -24,9 +24,10 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
new file mode 100644
index 000000000000..c03d1f37ffa7
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2018 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.internal.os;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.os.SystemClock;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.internal.os.KernelCpuThreadReader.ProcessCpuUsage;
+import com.android.internal.os.KernelCpuThreadReader.ThreadCpuUsage;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.List;
+import java.util.OptionalDouble;
+import java.util.concurrent.CountDownLatch;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * End to end test for {@link KernelCpuThreadReader} that checks the accuracy of the reported times
+ * by spawning threads that do a predictable amount of work
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class KernelCpuThreadReaderEndToEndTest {
+
+ private static final int TIMED_NUM_SAMPLES = 5;
+ private static final int TIMED_START_MILLIS = 500;
+ private static final int TIMED_END_MILLIS = 2000;
+ private static final int TIMED_INCREMENT_MILLIS = 500;
+ private static final int TIMED_COMPARISON_DELTA_MILLIS = 200;
+
+ private static final int ITERATIVE_NUM_SAMPLES = 100;
+ private static final long ITERATIVE_LOW_ITERATIONS = (long) 1e8;
+ private static final long ITERATIVE_HIGH_ITERATIONS = (long) 2e8;
+ private static final double ITERATIONS_COMPARISONS_DELTA = 0.25;
+
+ /**
+ * Test that when we busy-wait for the thread-local time to reach N seconds, the time reported
+ * is also N seconds. Takes ~10s.
+ */
+ @Test
+ public void testTimedWork() throws InterruptedException {
+ for (int millis = TIMED_START_MILLIS;
+ millis <= TIMED_END_MILLIS;
+ millis += TIMED_INCREMENT_MILLIS) {
+ final Duration targetDuration = Duration.ofMillis(millis);
+ final Runnable work = timedWork(targetDuration);
+ Duration resultDuration = getAverageWorkTime(
+ work, String.format("timed%dms", millis), TIMED_NUM_SAMPLES);
+ assertEquals(
+ "Time worked according to currentThreadTimeMillis doesn't match "
+ + "KernelCpuThreadReader",
+ targetDuration.toMillis(), resultDuration.toMillis(),
+ TIMED_COMPARISON_DELTA_MILLIS);
+ }
+ }
+
+ /**
+ * Test that when we scale up the amount of work by N, the time reported also scales by N. Takes
+ * ~15s.
+ */
+ @Test
+ public void testIterativeWork() throws InterruptedException {
+ final Runnable lowAmountWork = iterativeWork(ITERATIVE_LOW_ITERATIONS);
+ final Runnable highAmountWork = iterativeWork(ITERATIVE_HIGH_ITERATIONS);
+ final Duration lowResultDuration =
+ getAverageWorkTime(lowAmountWork, "iterlow", ITERATIVE_NUM_SAMPLES);
+ final Duration highResultDuration =
+ getAverageWorkTime(highAmountWork, "iterhigh", ITERATIVE_NUM_SAMPLES);
+ assertEquals(
+ "Work scale and CPU time scale do not match",
+ ((double) ITERATIVE_HIGH_ITERATIONS) / ((double) ITERATIVE_LOW_ITERATIONS),
+ ((double) highResultDuration.toMillis()) / ((double) lowResultDuration.toMillis()),
+ ITERATIONS_COMPARISONS_DELTA);
+ }
+
+ /**
+ * Run some work {@code numSamples} times, and take the average CPU duration used for that work
+ * according to {@link KernelCpuThreadReader}
+ */
+ private Duration getAverageWorkTime(
+ Runnable work, String tag, int numSamples) throws InterruptedException {
+ // Count down every time a thread finishes work, so that we can wait for work to complete
+ final CountDownLatch workFinishedLatch = new CountDownLatch(numSamples);
+ // Count down once when threads can terminate (after we get them from
+ // `KernelCpuThreadReader`)
+ final CountDownLatch threadFinishedLatch = new CountDownLatch(1);
+
+ // Start `NUM_SAMPLE` threads to do the work
+ for (int i = 0; i < numSamples; i++) {
+ final String threadName = String.format("%s%d", tag, i);
+ // Check the thread name, as we rely on it later to identify threads
+ assertTrue("Max name length for linux threads is 15", threadName.length() <= 15);
+ doWork(work, threadName, workFinishedLatch, threadFinishedLatch);
+ }
+
+ // Wait for threads to finish
+ workFinishedLatch.await();
+
+ // Get thread data from KernelCpuThreadReader
+ final KernelCpuThreadReader kernelCpuThreadReader = KernelCpuThreadReader.create();
+ assertNotNull(kernelCpuThreadReader);
+ final ProcessCpuUsage currentProcessCpuUsage =
+ kernelCpuThreadReader.getCurrentProcessCpuUsage();
+
+ // Threads can terminate, as we've finished crawling them from /proc
+ threadFinishedLatch.countDown();
+
+ // Check that we've got times for every thread we spawned
+ final List<ThreadCpuUsage> threadCpuUsages = currentProcessCpuUsage.threadCpuUsages
+ .stream()
+ .filter((thread) -> thread.threadName.startsWith(tag))
+ .collect(Collectors.toList());
+ assertEquals(
+ "Incorrect number of threads returned by KernelCpuThreadReader",
+ numSamples, threadCpuUsages.size());
+
+ // Calculate the average time spent working
+ final OptionalDouble averageWorkTimeMillis = threadCpuUsages.stream()
+ .mapToDouble((t) -> Arrays.stream(t.usageTimesMillis).sum())
+ .average();
+ assertTrue(averageWorkTimeMillis.isPresent());
+ return Duration.ofMillis((long) averageWorkTimeMillis.getAsDouble());
+ }
+
+ /**
+ * Work that lasts {@code duration} according to {@link SystemClock#currentThreadTimeMillis()}
+ */
+ private Runnable timedWork(Duration duration) {
+ return () -> {
+ // Busy loop until `duration` has elapsed for the thread timer
+ final long startTimeMillis = SystemClock.currentThreadTimeMillis();
+ final long durationMillis = duration.toMillis();
+ while (true) {
+ final long elapsedMillis = SystemClock.currentThreadTimeMillis() - startTimeMillis;
+ if (elapsedMillis >= durationMillis) {
+ break;
+ }
+ }
+ };
+ }
+
+ /**
+ * Work that iterates {@code iterations} times
+ */
+ private Runnable iterativeWork(long iterations) {
+ Consumer<Long> empty = (i) -> {
+ };
+ return () -> {
+ long count = 0;
+ for (long i = 0; i < iterations; i++) {
+ // Alternate branching to reduce effect of branch prediction
+ if (i % 2 == 0) {
+ count++;
+ }
+ }
+ // Call empty function with value to avoid loop getting optimized away
+ empty.accept(count);
+ };
+ }
+
+ /**
+ * Perform some work in another thread
+ *
+ * @param work the work to perform
+ * @param threadName the name of the spawned thread
+ * @param workFinishedLatch latch to register that the work has been completed
+ * @param threadFinishedLatch latch to pause termination of the thread until the latch is
+ * decremented
+ */
+ private void doWork(
+ Runnable work,
+ String threadName,
+ CountDownLatch workFinishedLatch,
+ CountDownLatch threadFinishedLatch) {
+ Runnable workWrapped = () -> {
+ // Do the work
+ work.run();
+ // Notify that the work is finished
+ workFinishedLatch.countDown();
+ // Wait until `threadFinishLatch` has been released in order to keep the thread alive so
+ // we can see it in `proc` filesystem
+ try {
+ threadFinishedLatch.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ };
+ new Thread(workWrapped, threadName).start();
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
index b242a34cc703..0c56b8a3e8aa 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
@@ -23,9 +23,10 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java
index adafda04d516..1b13a9927beb 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static org.junit.Assert.assertEquals;
@@ -20,11 +21,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseLongArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
import org.junit.After;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java
index ad20d84bfc60..2ea80da9e6d0 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static org.junit.Assert.assertArrayEquals;
@@ -22,11 +23,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
import org.junit.After;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java
index 1d3a98a89d95..0b6fed386117 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static org.junit.Assert.assertArrayEquals;
@@ -24,11 +25,12 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
import org.junit.After;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java
index 9b4512b8b9bd..8f81ea237a15 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.os;
import static org.junit.Assert.assertArrayEquals;
@@ -23,11 +24,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.os.FileUtils;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
import org.junit.After;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java b/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java
index 32317eed203e..60dac8520d14 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java
@@ -1,11 +1,27 @@
+/*
+ * Copyright (C) 2016 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.internal.os;
-import android.support.test.filters.SmallTest;
import android.util.LongSparseLongArray;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
-import org.junit.Assert;
import org.mockito.Mockito;
import java.io.BufferedReader;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java
index 29227f9f6a1b..479e19e10ba0 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java
@@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.KernelSingleUidTimeReader.Injector;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
index 28570e8fa747..12f6c188f18f 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
@@ -20,8 +20,8 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
index 85dce020ddd4..532f337fe2e1 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
@@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
index 67c4e6161da6..6d2980b8bed0 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
@@ -24,10 +24,11 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -53,7 +54,7 @@ import java.util.Arrays;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class com.android.internal.os.KernelUidCpuFreqTimeReaderTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*
* or
*
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java
index 4e4bb350739d..78b6843e535c 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java
@@ -13,9 +13,10 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.os;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java b/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java
index fe627642418f..cb8a62c0936c 100644
--- a/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java
@@ -16,7 +16,9 @@
package com.android.internal.os;
-import android.test.suitebuilder.annotation.Suppress;
+import androidx.test.filters.Suppress;
+
+import junit.framework.TestCase;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -25,8 +27,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import junit.framework.TestCase;
-
// this test causes a IllegalAccessError: superclass not accessible
@Suppress
public class LoggingPrintStreamTest extends TestCase {
diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
index 37b4e41a38d6..0516bb7f74d7 100644
--- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
@@ -30,8 +30,9 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -55,7 +56,7 @@ import java.util.Arrays;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class com.android.internal.os.LongSamplingCounterArrayTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
index 853bf8a079a6..d2f5735ce3c1 100644
--- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
@@ -28,8 +28,9 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.os.Parcel;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java
index b65c1e6210a7..2c597b14c557 100644
--- a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java
@@ -23,8 +23,9 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Assert;
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index b68f6b1273b9..c18445e26173 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -21,6 +21,7 @@ import android.os.Looper;
import android.util.SparseIntArray;
import com.android.internal.location.gnssmetrics.GnssMetrics;
+
import java.util.ArrayList;
import java.util.Queue;
import java.util.concurrent.Future;
diff --git a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
index 14d62e0b2f9c..c592ab6a16ae 100644
--- a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
@@ -17,13 +17,13 @@
package com.android.internal.os;
-
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.os.BatteryStats;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
index 2853c965e871..5862368f44d2 100644
--- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
@@ -17,8 +17,8 @@
package com.android.internal.os;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java
index 489e164e0b12..e97caf8c0631 100644
--- a/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java
@@ -20,9 +20,10 @@ import static org.junit.Assert.assertEquals;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java
index 2893066af0d8..9db3f8a6e187 100644
--- a/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java
@@ -22,9 +22,10 @@ import static org.junit.Assert.fail;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java b/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java
index c051a1cdf052..85eafc57acc3 100644
--- a/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java
@@ -15,15 +15,17 @@
*/
package com.android.internal.os;
+
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.content.Context;
import android.os.FileUtils;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -36,7 +38,6 @@ import java.io.BufferedWriter;
import java.io.File;
import java.nio.file.Files;
-
/**
* Test class for {@link StoragedUidIoStatsReader}.
*
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java
index 2a24881f67fa..8e0c1fe99933 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java
@@ -17,8 +17,6 @@
package com.android.internal.policy;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.ActionMode;
import android.view.ActionMode.Callback;
import android.view.KeyEvent;
@@ -32,7 +30,8 @@ import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
-import java.util.List;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
/**
* Tests {@link PhoneWindow}'s {@link ActionMode} related methods.
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
index d4b8566b0345..6c2d630ac917 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
@@ -28,12 +28,13 @@ import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.ActionMode;
import android.view.ContextThemeWrapper;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.frameworks.coretests.R;
import org.junit.Before;
diff --git a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
index b3897ceb6e79..d0267355c92e 100644
--- a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
@@ -13,9 +13,11 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.android.internal.util;
-import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.SmallTest;
+
import junit.framework.TestCase;
import java.util.ArrayList;
diff --git a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
index a44b86074ee2..4716312c59a8 100644
--- a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.util;
import static com.android.internal.util.DumpUtils.CRITICAL_SECTION_COMPONENTS;
diff --git a/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java b/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java
index 4845c4ef28f8..b2a2265d30ae 100644
--- a/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java
@@ -19,11 +19,8 @@ package com.android.internal.util;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
/**
diff --git a/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java
index f00c48c96b5d..867152e720dd 100644
--- a/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.internal.util;
import junit.framework.TestCase;
diff --git a/core/tests/coretests/src/android/util/TokenBucketTest.java b/core/tests/coretests/src/com/android/internal/util/TokenBucketTest.java
index f7ac20c7287f..6c50bce86638 100644
--- a/core/tests/coretests/src/android/util/TokenBucketTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/TokenBucketTest.java
@@ -18,6 +18,7 @@ package com.android.internal.util;
import android.os.SystemClock;
import android.text.format.DateUtils;
+
import junit.framework.TestCase;
public class TokenBucketTest extends TestCase {
@@ -54,9 +55,9 @@ public class TokenBucketTest extends TestCase {
drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 100), 10);
- drain(new TokenBucket((int)DateUtils.MINUTE_IN_MILLIS, 50), 50);
- drain(new TokenBucket((int)DateUtils.HOUR_IN_MILLIS, 10), 10);
- drain(new TokenBucket((int)DateUtils.DAY_IN_MILLIS, 200), 200);
+ drain(new TokenBucket((int) DateUtils.MINUTE_IN_MILLIS, 50), 50);
+ drain(new TokenBucket((int) DateUtils.HOUR_IN_MILLIS, 10), 10);
+ drain(new TokenBucket((int) DateUtils.DAY_IN_MILLIS, 200), 200);
}
public void testReset() {
@@ -163,16 +164,16 @@ public class TokenBucketTest extends TestCase {
void assertDuration(long expected, long elapsed) {
String msg = String.format(
- "expected elapsed time at least %d ms, but was %d ms", expected, elapsed);
+ "expected elapsed time at least %d ms, but was %d ms", expected, elapsed);
elapsed += 1; // one millisecond extra guard
assertTrue(msg, elapsed >= expected);
}
- void assertThrow(Fn fn) {
- try {
- fn.call();
- fail("expected n exception to be thrown.");
- } catch (Throwable t) {}
+ void assertThrow(Fn fn) {
+ try {
+ fn.call();
+ fail("expected n exception to be thrown.");
+ } catch (Throwable t) { }
}
interface Fn { void call(); }
diff --git a/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java b/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java
index 912b7ec02b15..b3723664dc1b 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java
@@ -18,11 +18,12 @@ package com.android.internal.widget;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.ActionMode;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.filters.SmallTest;
+
/**
* Tests for {@link ActionBarContainer}.
*/
diff --git a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java
index 218566e8cdf0..d10f173328be 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java
@@ -29,9 +29,6 @@ import static org.junit.Assert.assertThat;
import android.content.Context;
import android.graphics.Insets;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.DisplayCutout;
import android.view.View;
import android.view.View.OnApplyWindowInsetsListener;
@@ -40,6 +37,10 @@ import android.view.WindowInsets;
import android.widget.FrameLayout;
import android.widget.Toolbar;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -167,7 +168,7 @@ public class ActionBarOverlayLayoutTest {
}
private WindowInsets insetsWith(Insets content, DisplayCutout cutout) {
- return new WindowInsets(content.toRect(), null, null, false, false, cutout);
+ return new WindowInsets(content.toRect(), null, false, false, cutout);
}
private ViewGroup createViewGroupWithId(int id) {
diff --git a/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java b/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java
index e21143d4392f..0fada06b8de4 100644
--- a/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java
@@ -32,10 +32,11 @@ import static java.util.Collections.emptyList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
-import android.support.test.InstrumentationRegistry;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
index 1806b226e7b3..2e0dbb4f574e 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
@@ -19,12 +19,13 @@ package com.android.internal.widget;
import static org.junit.Assert.assertTrue;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.text.Layout;
import android.view.View.MeasureSpec;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java b/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java
index f73950a648e0..6167c4b80cee 100644
--- a/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
index 41082b7c7593..6af7c886ce9b 100644
--- a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
@@ -21,12 +21,12 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View.MeasureSpec;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import com.android.frameworks.coretests.R;
import org.junit.Before;
diff --git a/core/tests/hdmitests/Android.mk b/core/tests/hdmitests/Android.mk
index e0d2c09a6f0f..2ca31a6a240a 100644
--- a/core/tests/hdmitests/Android.mk
+++ b/core/tests/hdmitests/Android.mk
@@ -20,7 +20,7 @@ LOCAL_MODULE_TAGS := tests
# Include all test java files
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test frameworks-base-testutils
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules frameworks-base-testutils
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := HdmiCecTests
diff --git a/core/tests/hdmitests/AndroidManifest.xml b/core/tests/hdmitests/AndroidManifest.xml
index 1460b4168581..f8ed118d2338 100644
--- a/core/tests/hdmitests/AndroidManifest.xml
+++ b/core/tests/hdmitests/AndroidManifest.xml
@@ -22,7 +22,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.hardware.hdmi"
android:label="HDMI CEC Tests"/>
diff --git a/core/tests/hdmitests/AndroidTest.xml b/core/tests/hdmitests/AndroidTest.xml
index 7ef672d344c5..0c8da28cab7c 100644
--- a/core/tests/hdmitests/AndroidTest.xml
+++ b/core/tests/hdmitests/AndroidTest.xml
@@ -29,6 +29,6 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.hardware.hdmi" />
<option name="hidden-api-checks" value="false"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
</test>
</configuration> \ No newline at end of file
diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
index 7b76a0819e22..28a8afe434e4 100644
--- a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
+++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
@@ -18,15 +18,18 @@ package android.hardware.hdmi;
import android.os.Handler;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
import android.util.Log;
-import java.util.List;
+
+import androidx.test.filters.SmallTest;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.List;
+
/**
* Tests for {@link HdmiAudioSystemClient}
*/
@@ -315,6 +318,27 @@ public class HdmiAudioSystemClientTest {
mMaxVolume = maxVolume;
mIsMute = isMute;
}
+
+ @Override
+ public void setSystemAudioModeOnForAudioOnlySource() {
+ }
+
+ @Override
+ public int getPhysicalAddress() {
+ return 0x0000;
+ }
+
+ @Override
+ public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {
+ }
+
+ @Override
+ public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {
+ }
+
+ @Override
+ public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {
+ }
}
}
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
index 80ab4eae689b..cc2d8d256e6a 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
@@ -18,7 +18,7 @@ LOCAL_PATH:= $(call my-dir)
## The application with a minimal main dex
include $(CLEAR_VARS)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex android-support-multidex-instrumentation android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex android-support-multidex-instrumentation androidx.test.rules
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -38,16 +38,11 @@ LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_MIN_SDK_VERSION := 8
-LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex \
- -D jack.dex.output.multidex.legacy=true
-
include $(BUILD_PACKAGE)
-ifndef LOCAL_JACK_ENABLED
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/multidexlegacyandexception/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList)
-endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/AndroidManifest.xml b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/AndroidManifest.xml
index 98d8f27179fd..d9d9eb20e632 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/AndroidManifest.xml
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/AndroidManifest.xml
@@ -30,7 +30,7 @@
android:targetPackage="com.android.multidexlegacyandexception"
android:label="Test for MultiDexLegacyAndException" />
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.multidexlegacyandexception"
android:label="Test for MultiDexLegacyAndException" />
</manifest>
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/MultiDexAndroidJUnitRunner.java b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/MultiDexAndroidJUnitRunner.java
index 92a3b0c0f7c3..fae345f982b7 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/MultiDexAndroidJUnitRunner.java
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/MultiDexAndroidJUnitRunner.java
@@ -17,8 +17,9 @@
package com.android.multidexlegacyandexception.tests;
import android.os.Bundle;
+
import androidx.multidex.MultiDex;
-import android.support.test.runner.AndroidJUnitRunner;
+import androidx.test.runner.AndroidJUnitRunner;
public class MultiDexAndroidJUnitRunner extends AndroidJUnitRunner {
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/NoActivityJUnit4Test.java b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/NoActivityJUnit4Test.java
index 94a5b7fa66f2..f4b02d0dc68e 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/NoActivityJUnit4Test.java
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/src/com/android/multidexlegacyandexception/tests/NoActivityJUnit4Test.java
@@ -16,7 +16,8 @@
package com.android.multidexlegacyandexception.tests;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.runner.RunWith;
/**
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
index cf8fc92c7026..c577eeffd488 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
@@ -38,9 +38,9 @@ LOCAL_MIN_SDK_VERSION := 8
include $(BUILD_PACKAGE)
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/multidexlegacytestapp/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList)
@@ -69,9 +69,9 @@ LOCAL_MIN_SDK_VERSION := 8
include $(BUILD_PACKAGE)
-$(mainDexList2): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList2): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/multidexlegacytestapp/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList2)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
index f2bd35363003..2dc30ea7c17b 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
@@ -18,7 +18,7 @@ LOCAL_PATH:= $(call my-dir)
## The tests with only one dex
include $(CLEAR_VARS)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex-instrumentation android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex-instrumentation androidx.test.rules
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -41,7 +41,7 @@ include $(BUILD_PACKAGE)
## The tests with a minimal main dex
include $(CLEAR_VARS)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex-instrumentation android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex-instrumentation androidx.test.rules
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/InstrumentationTest.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/InstrumentationTest.java
index 4e6ec142e690..7812c581b2b8 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/InstrumentationTest.java
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/InstrumentationTest.java
@@ -15,10 +15,13 @@
*/
package com.android.multidexlegacytestapp.test2;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.multidexlegacytestapp.manymethods.Big001;
import com.android.multidexlegacytestapp.manymethods.Big079;
+
import junit.framework.Assert;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/MultiDexAndroidJUnitRunner.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/MultiDexAndroidJUnitRunner.java
index 9e41a925de89..b3044dcbeb8e 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/MultiDexAndroidJUnitRunner.java
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/src/com/android/multidexlegacytestapp/test2/MultiDexAndroidJUnitRunner.java
@@ -1,8 +1,9 @@
package com.android.multidexlegacytestapp.test2;
import android.os.Bundle;
+
import androidx.multidex.MultiDex;
-import android.support.test.runner.AndroidJUnitRunner;
+import androidx.test.runner.AndroidJUnitRunner;
public class MultiDexAndroidJUnitRunner extends AndroidJUnitRunner {
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
index 2ce50b3b7583..da40940e92e9 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
@@ -30,14 +30,13 @@ mainDexList:= \
$(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
-LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.dex.output.multidex.legacy=true
LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
$(built_dex_intermediate): $(mainDexList)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
index f3d98a88d485..afbcd4675a78 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
@@ -23,7 +23,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := MultiDexLegacyTestServicesTests2
LOCAL_JAVA_LIBRARIES := android-support-multidex
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
LOCAL_SDK_VERSION := 9
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml
index 0ab29591be18..01285e77e3ff 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml
@@ -7,7 +7,7 @@
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.framework.multidexlegacytestservices" />
<application
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java
index 900f20387c49..f2c72f001646 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java
@@ -19,22 +19,26 @@ package com.android.framework.multidexlegacytestservices.test2;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.TimeoutException;
-import junit.framework.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Run the tests with: <code>adb shell am instrument -w
- * com.android.framework.multidexlegacytestservices.test2/android.support.test.runner.AndroidJUnitRunner
+ * com.android.framework.multidexlegacytestservices.test2/androidx.test.runner.AndroidJUnitRunner
* </code>
*/
@RunWith(AndroidJUnit4.class)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
index 8b0c750a9efc..665e22d5a0bc 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
@@ -35,9 +35,9 @@ LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
include $(BUILD_PACKAGE)
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
index a36c9934d87f..c827fa80ebcd 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
@@ -35,9 +35,9 @@ LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
include $(BUILD_PACKAGE)
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
index 6b7418c1adb1..3d6ad7d1aa57 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
@@ -35,9 +35,9 @@ LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
include $(BUILD_PACKAGE)
-$(mainDexList): $(full_classes_pre_proguard_jar) | $(MAINDEXCLASSES)
+$(mainDexList): $(full_classes_pre_proguard_jar) $(MAINDEXCLASSES) $(PROGUARD_DEPS)
$(hide) mkdir -p $(dir $@)
- $(MAINDEXCLASSES) $< 1>$@
+ PROGUARD_HOME=$(PROGUARD_HOME) $(MAINDEXCLASSES) $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
diff --git a/core/tests/overlaytests/device/Android.mk b/core/tests/overlaytests/device/Android.mk
index 680ebeb6108f..563074903cfe 100644
--- a/core/tests/overlaytests/device/Android.mk
+++ b/core/tests/overlaytests/device/Android.mk
@@ -19,7 +19,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_MODULE_TAGS := tests
LOCAL_PACKAGE_NAME := OverlayDeviceTests
LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
LOCAL_COMPATIBILITY_SUITE := device-tests
LOCAL_TARGET_REQUIRED_MODULES := \
OverlayDeviceTests_AppOverlayOne \
diff --git a/core/tests/overlaytests/device/AndroidManifest.xml b/core/tests/overlaytests/device/AndroidManifest.xml
index d14fdf5ee819..4881636c7095 100644
--- a/core/tests/overlaytests/device/AndroidManifest.xml
+++ b/core/tests/overlaytests/device/AndroidManifest.xml
@@ -23,7 +23,7 @@
<uses-library android:name="android.test.runner"/>
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.overlaytest"
android:label="Runtime resource overlay tests" />
</manifest>
diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java
index 5a86885459f2..91fcdbbb18ce 100644
--- a/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java
+++ b/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java
@@ -25,10 +25,11 @@ import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.LocaleList;
import android.os.ParcelFileDescriptor;
-import android.support.test.InstrumentationRegistry;
import android.util.AttributeSet;
import android.util.Xml;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java
index f35e511cdcf4..cd3ed9dd5e86 100644
--- a/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java
+++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java
@@ -16,7 +16,7 @@
package com.android.overlaytest;
-import android.support.test.filters.MediumTest;
+import androidx.test.filters.MediumTest;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java
index 037449fc2c05..c0d4281b7e0d 100644
--- a/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java
+++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java
@@ -16,7 +16,7 @@
package com.android.overlaytest;
-import android.support.test.filters.MediumTest;
+import androidx.test.filters.MediumTest;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java
index f657b5cef0e5..33c7b2591fe2 100644
--- a/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java
+++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java
@@ -16,7 +16,7 @@
package com.android.overlaytest;
-import android.support.test.filters.MediumTest;
+import androidx.test.filters.MediumTest;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
diff --git a/data/etc/Android.bp b/data/etc/Android.bp
index 25dabad6d34c..035ee108c6da 100644
--- a/data/etc/Android.bp
+++ b/data/etc/Android.bp
@@ -42,6 +42,38 @@ prebuilt_etc {
}
prebuilt_etc {
+ name: "privapp_whitelist_com.android.carrierconfig",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.carrierconfig.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "privapp_whitelist_com.android.contacts",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.contacts.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "privapp_whitelist_com.android.launcher3",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.launcher3.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "privapp_whitelist_com.android.provision",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.provision.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
name: "privapp_whitelist_com.android.settings",
product_specific: true,
sub_dir: "permissions",
@@ -50,6 +82,22 @@ prebuilt_etc {
}
prebuilt_etc {
+ name: "privapp_whitelist_com.android.settings.intelligence",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.settings.intelligence.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "privapp_whitelist_com.android.storagemanager",
+ product_specific: true,
+ sub_dir: "permissions",
+ src: "com.android.storagemanager.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
name: "privapp_whitelist_com.android.systemui",
product_specific: true,
sub_dir: "permissions",
diff --git a/data/etc/com.android.carrierconfig.xml b/data/etc/com.android.carrierconfig.xml
new file mode 100644
index 000000000000..17efb0315040
--- /dev/null
+++ b/data/etc/com.android.carrierconfig.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.carrierconfig">
+ <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.contacts.xml b/data/etc/com.android.contacts.xml
new file mode 100644
index 000000000000..78eae40348e6
--- /dev/null
+++ b/data/etc/com.android.contacts.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.contacts">
+ <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
+ <permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.launcher3.xml b/data/etc/com.android.launcher3.xml
new file mode 100644
index 000000000000..337e153722ac
--- /dev/null
+++ b/data/etc/com.android.launcher3.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.launcher3">
+ <permission name="android.permission.BIND_APPWIDGET"/>
+ <permission name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"/>
+ <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.provision.xml b/data/etc/com.android.provision.xml
new file mode 100644
index 000000000000..05404ef73732
--- /dev/null
+++ b/data/etc/com.android.provision.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.provision">
+ <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.settings.intelligence.xml b/data/etc/com.android.settings.intelligence.xml
new file mode 100644
index 000000000000..6ca30c1e82fb
--- /dev/null
+++ b/data/etc/com.android.settings.intelligence.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.settings.intelligence">
+ <permission name="android.permission.MANAGE_FINGERPRINT"/>
+ <permission name="android.permission.MODIFY_PHONE_STATE"/>
+ <permission name="android.permission.READ_SEARCH_INDEXABLES"/>
+ <permission name="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.storagemanager.xml b/data/etc/com.android.storagemanager.xml
new file mode 100644
index 000000000000..e85a82c983df
--- /dev/null
+++ b/data/etc/com.android.storagemanager.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<permissions>
+ <privapp-permissions package="com.android.storagemanager">
+ <permission name="android.permission.DELETE_PACKAGES"/>
+ <permission name="android.permission.INTERACT_ACROSS_USERS"/>
+ <permission name="android.permission.MANAGE_USERS"/>
+ <permission name="android.permission.PACKAGE_USAGE_STATS"/>
+ <permission name="android.permission.USE_RESERVED_DISK"/>
+ <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml
index b65bc1d4d9d4..3562a8f81408 100644
--- a/data/etc/com.android.systemui.xml
+++ b/data/etc/com.android.systemui.xml
@@ -29,7 +29,6 @@
<permission name="android.permission.DUMP"/>
<permission name="android.permission.GET_APP_OPS_STATS"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
- <permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
<permission name="android.permission.MANAGE_DEBUGGING"/>
<permission name="android.permission.MANAGE_SENSOR_PRIVACY"/>
<permission name="android.permission.MANAGE_USB"/>
@@ -45,6 +44,7 @@
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.REAL_GET_TASKS"/>
<permission name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE"/>
+ <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<permission name="android.permission.START_ACTIVITY_AS_CALLER"/>
<permission name="android.permission.START_TASKS_FROM_RECENTS"/>
<permission name="android.permission.STATUS_BAR"/>
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 4a2db0a6bb54..fb43e41010b4 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -223,12 +223,12 @@
code to link against. -->
<library name="android.test.base"
- file="/system/framework/android.test.base.impl.jar" />
+ file="/system/framework/android.test.base.jar" />
<library name="android.test.mock"
- file="/system/framework/android.test.mock.impl.jar"
+ file="/system/framework/android.test.mock.jar"
dependency="android.test.base" />
<library name="android.test.runner"
- file="/system/framework/android.test.runner.impl.jar"
+ file="/system/framework/android.test.runner.jar"
dependency="android.test.base:android.test.mock" />
<!-- In BOOT_JARS historically, and now added to legacy applications. -->
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 58b57e5b7efd..597d14ac286e 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -33,10 +33,6 @@ applications that come with the platform
<permission name="android.permission.CRYPT_KEEPER"/>
</privapp-permissions>
- <privapp-permissions package="com.android.carrierconfig">
- <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.cellbroadcastreceiver">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_USERS"/>
@@ -45,11 +41,6 @@ applications that come with the platform
<permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
</privapp-permissions>
- <privapp-permissions package="com.android.contacts">
- <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
- <permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.defcontainer">
<permission name="android.permission.ACCESS_CACHE_FILESYSTEM"/>
<permission name="android.permission.ALLOCATE_AGGRESSIVE"/>
@@ -79,12 +70,6 @@ applications that come with the platform
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
</privapp-permissions>
- <privapp-permissions package="com.android.launcher3">
- <permission name="android.permission.BIND_APPWIDGET"/>
- <permission name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"/>
- <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.location.fused">
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
</privapp-permissions>
@@ -238,7 +223,29 @@ applications that come with the platform
<permission name="android.permission.USE_RESERVED_DISK"/>
</privapp-permissions>
- <privapp-permissions package="com.android.provision">
+ <privapp-permissions package="com.android.mainline.networkstack">
+ <permission name="android.permission.ACCESS_NETWORK_CONDITIONS"/>
+ <permission name="android.permission.CHANGE_BACKGROUND_DATA_SETTING"/>
+ <permission name="android.permission.CONNECTIVITY_INTERNAL"/>
+ <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
+ <permission name="android.permission.CONTROL_VPN"/>
+ <permission name="android.permission.LOCAL_MAC_ADDRESS"/>
+ <permission name="android.permission.MANAGE_IPSEC_TUNNELS"/>
+ <permission name="android.permission.MANAGE_NETWORK_POLICY"/>
+ <permission name="android.permission.MANAGE_SUBSCRIPTION_PLANS"/>
+ <permission name="android.permission.MANAGE_USB"/>
+ <permission name="android.permission.NETWORK_BYPASS_PRIVATE_DNS"/>
+ <permission name="android.permission.NETWORK_SETTINGS"/>
+ <permission name="android.permission.NETWORK_STACK" />
+ <permission name="android.permission.NET_TUNNELING"/>
+ <permission name="android.permission.PACKET_KEEPALIVE_OFFLOAD"/>
+ <permission name="android.permission.PEERS_MAC_ADDRESS"/>
+ <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
+ <permission name="android.permission.READ_PRECISE_PHONE_STATE"/>
+ <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+ <permission name="android.permission.READ_WIFI_CREDENTIAL"/>
+ <permission name="android.permission.RECEIVE_DATA_ACTIVITY_CHANGE"/>
+ <permission name="android.permission.TETHER_PRIVILEGED"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
</privapp-permissions>
@@ -254,13 +261,6 @@ applications that come with the platform
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
</privapp-permissions>
- <privapp-permissions package="com.android.settings.intelligence">
- <permission name="android.permission.MANAGE_FINGERPRINT"/>
- <permission name="android.permission.MODIFY_PHONE_STATE"/>
- <permission name="android.permission.READ_SEARCH_INDEXABLES"/>
- <permission name="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.sharedstoragebackup">
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
</privapp-permissions>
@@ -289,7 +289,6 @@ applications that come with the platform
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
<permission name="android.permission.MANAGE_ACCESSIBILITY"/>
- <permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
<permission name="android.permission.MANAGE_USB"/>
<permission name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/>
@@ -317,6 +316,7 @@ applications that come with the platform
<permission name="android.permission.SET_TIME"/>
<permission name="android.permission.SET_TIME_ZONE"/>
<permission name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
+ <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<permission name="android.permission.START_TASKS_FROM_RECENTS" />
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
@@ -331,15 +331,6 @@ applications that come with the platform
<permission name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"/>
</privapp-permissions>
- <privapp-permissions package="com.android.storagemanager">
- <permission name="android.permission.DELETE_PACKAGES"/>
- <permission name="android.permission.INTERACT_ACROSS_USERS"/>
- <permission name="android.permission.MANAGE_USERS"/>
- <permission name="android.permission.PACKAGE_USAGE_STATS"/>
- <permission name="android.permission.USE_RESERVED_DISK"/>
- <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.tv">
<permission name="android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE"/>
<permission name="android.permission.DVB_DEVICE"/>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 6a4079256268..21531ab54681 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -99,6 +99,46 @@
<font weight="400" style="normal">CarroisGothicSC-Regular.ttf</font>
</family>
+ <family name="arbutus-slab">
+ <font weight="400" style="normal">ArbutusSlab-Regular.ttf</font>
+ </family>
+
+ <family name="arvo">
+ <font weight="400" style="normal">Arvo-Regular.ttf</font>
+ <font weight="400" style="italic">Arvo-Italic.ttf</font>
+ <font weight="700" style="normal">Arvo-Bold.ttf</font>
+ <font weight="700" style="italic">Arvo-BoldItalic.ttf</font>
+ </family>
+ <alias name="arvo-bold" to="arvo" weight="700" />
+
+ <family name="lato">
+ <font weight="400" style="normal">Lato-Regular.ttf</font>
+ <font weight="400" style="italic">Lato-Italic.ttf</font>
+ <font weight="700" style="normal">Lato-Bold.ttf</font>
+ <font weight="700" style="italic">Lato-BoldItalic.ttf</font>
+ </family>
+ <alias name="lato-bold" to="lato" weight="700" />
+
+ <family name="rubik">
+ <font weight="400" style="normal">Rubik-Regular.ttf</font>
+ <font weight="400" style="italic">Rubik-Italic.ttf</font>
+ <font weight="500" style="normal">Rubik-Medium.ttf</font>
+ <font weight="500" style="italic">Rubik-MediumItalic.ttf</font>
+ <font weight="700" style="normal">Rubik-Bold.ttf</font>
+ <font weight="700" style="italic">Rubik-BoldItalic.ttf</font>
+ </family>
+ <alias name="rubik-medium" to="rubik" weight="500" />
+
+ <family name="source-sans-pro">
+ <font weight="400" style="normal">SourceSansPro-Regular.ttf</font>
+ <font weight="400" style="italic">SourceSansPro-Italic.ttf</font>
+ <font weight="600" style="normal">SourceSansPro-SemiBold.ttf</font>
+ <font weight="600" style="italic">SourceSansPro-SemiBoldItalic.ttf</font>
+ <font weight="700" style="normal">SourceSansPro-Bold.ttf</font>
+ <font weight="700" style="italic">SourceSansPro-BoldItalic.ttf</font>
+ </family>
+ <alias name="source-sans-pro-semi-bold" to="source-sans-pro" weight="600" />
+
<!-- fallback fonts -->
<family lang="und-Arab" variant="elegant">
<font weight="400" style="normal">NotoNaskhArabic-Regular.ttf</font>
@@ -312,9 +352,8 @@
<font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font>
</family>
<family lang="und-Mymr" variant="elegant">
- <font weight="400" style="normal">NotoSansMyanmar-Regular.otf</font>
- <font weight="500" style="normal">NotoSansMyanmar-Medium.otf</font>
- <font weight="700" style="normal">NotoSansMyanmar-Bold.otf</font>
+ <font weight="400" style="normal">NotoSansMyanmar-Regular-ZawDecode.ttf</font>
+ <font weight="700" style="normal">NotoSansMyanmar-Bold-ZawDecode.ttf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifMyanmar-Regular.otf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifMyanmar-Bold.otf</font>
</family>
diff --git a/data/sounds/AllAudio.mk b/data/sounds/AllAudio.mk
index bb8add1187e7..c6c7d3bca724 100644
--- a/data/sounds/AllAudio.mk
+++ b/data/sounds/AllAudio.mk
@@ -15,227 +15,227 @@
LOCAL_PATH := frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
- $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Barium.ogg:system/media/audio/alarms/Barium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
- $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/Aldebaran.ogg:system/media/audio/notifications/Aldebaran.ogg \
- $(LOCAL_PATH)/notifications/Altair.ogg:system/media/audio/notifications/Altair.ogg \
- $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
- $(LOCAL_PATH)/notifications/Antares.ogg:system/media/audio/notifications/Antares.ogg \
- $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:system/media/audio/notifications/Antimony.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \
- $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
- $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
- $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:system/media/audio/notifications/Beryllium.ogg \
- $(LOCAL_PATH)/notifications/Betelgeuse.ogg:system/media/audio/notifications/Betelgeuse.ogg \
- $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:system/media/audio/notifications/CaffeineSnake.ogg \
- $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/Castor.ogg:system/media/audio/notifications/Castor.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:system/media/audio/notifications/Cobalt.ogg \
- $(LOCAL_PATH)/notifications/Cricket.ogg:system/media/audio/notifications/Cricket.ogg \
- $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:system/media/audio/notifications/DearDeer.ogg \
- $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \
- $(LOCAL_PATH)/notifications/Doink.ogg:system/media/audio/notifications/Doink.ogg \
- $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:system/media/audio/notifications/DontPanic.ogg \
- $(LOCAL_PATH)/notifications/Drip.ogg:system/media/audio/notifications/Drip.ogg \
- $(LOCAL_PATH)/notifications/Electra.ogg:system/media/audio/notifications/Electra.ogg \
- $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
- $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
- $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
- $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:system/media/audio/notifications/Fluorine.ogg \
- $(LOCAL_PATH)/notifications/Fomalhaut.ogg:system/media/audio/notifications/Fomalhaut.ogg \
- $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:system/media/audio/notifications/Gallium.ogg \
- $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
- $(LOCAL_PATH)/notifications/ogg/Helium.ogg:system/media/audio/notifications/Helium.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:system/media/audio/notifications/Krypton.ogg \
- $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:system/media/audio/notifications/KzurbSonar.ogg \
- $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
- $(LOCAL_PATH)/notifications/Merope.ogg:system/media/audio/notifications/Merope.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:system/media/audio/notifications/OnTheHunt.ogg \
- $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:system/media/audio/notifications/Palladium.ogg \
- $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:system/media/audio/notifications/Plastic_Pipe.ogg \
- $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
- $(LOCAL_PATH)/notifications/ogg/Radon.ogg:system/media/audio/notifications/Radon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:system/media/audio/notifications/Rubidium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:system/media/audio/notifications/Selenium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/Sirrah.ogg:system/media/audio/notifications/Sirrah.ogg \
- $(LOCAL_PATH)/notifications/SpaceSeed.ogg:system/media/audio/notifications/SpaceSeed.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:system/media/audio/notifications/Strontium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
- $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
- $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:system/media/audio/notifications/Thallium.ogg \
- $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
- $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/newwavelabs/Voila.ogg:system/media/audio/notifications/Voila.ogg \
- $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:system/media/audio/notifications/Xenon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:system/media/audio/notifications/Zirconium.ogg \
- $(LOCAL_PATH)/notifications/arcturus.ogg:system/media/audio/notifications/arcturus.ogg \
- $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
- $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
- $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
- $(LOCAL_PATH)/notifications/regulus.ogg:system/media/audio/notifications/regulus.ogg \
- $(LOCAL_PATH)/notifications/sirius.ogg:system/media/audio/notifications/sirius.ogg \
- $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
- $(LOCAL_PATH)/notifications/vega.ogg:system/media/audio/notifications/vega.ogg \
- $(LOCAL_PATH)/ringtones/ANDROMEDA.ogg:system/media/audio/ringtones/ANDROMEDA.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:system/media/audio/ringtones/Atria.ogg \
- $(LOCAL_PATH)/ringtones/BOOTES.ogg:system/media/audio/ringtones/BOOTES.ogg \
- $(LOCAL_PATH)/newwavelabs/Backroad.ogg:system/media/audio/ringtones/Backroad.ogg \
- $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
- $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
- $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \
- $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
- $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:system/media/audio/ringtones/Bollywood.ogg \
- $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:system/media/audio/ringtones/BussaMove.ogg \
- $(LOCAL_PATH)/ringtones/CANISMAJOR.ogg:system/media/audio/ringtones/CANISMAJOR.ogg \
- $(LOCAL_PATH)/ringtones/CASSIOPEIA.ogg:system/media/audio/ringtones/CASSIOPEIA.ogg \
- $(LOCAL_PATH)/newwavelabs/Cairo.ogg:system/media/audio/ringtones/Cairo.ogg \
- $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:system/media/audio/ringtones/Calypso_Steel.ogg \
- $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \
- $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:system/media/audio/ringtones/CaribbeanIce.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:system/media/audio/ringtones/Champagne_Edition.ogg \
- $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:system/media/audio/ringtones/Club_Cubano.ogg \
- $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:system/media/audio/ringtones/CrayonRock.ogg \
- $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:system/media/audio/ringtones/CrazyDream.ogg \
- $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:system/media/audio/ringtones/CurveBall.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:system/media/audio/ringtones/DancinFool.ogg \
- $(LOCAL_PATH)/newwavelabs/Ding.ogg:system/media/audio/ringtones/Ding.ogg \
- $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:system/media/audio/ringtones/DonMessWivIt.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
- $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:system/media/audio/ringtones/DreamTheme.ogg \
- $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:system/media/audio/ringtones/Eastern_Sky.ogg \
- $(LOCAL_PATH)/newwavelabs/Enter_the_Nexus.ogg:system/media/audio/ringtones/Enter_the_Nexus.ogg \
- $(LOCAL_PATH)/ringtones/Eridani.ogg:system/media/audio/ringtones/Eridani.ogg \
- $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:system/media/audio/ringtones/EtherShake.ogg \
- $(LOCAL_PATH)/ringtones/FreeFlight.ogg:system/media/audio/ringtones/FreeFlight.ogg \
- $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:system/media/audio/ringtones/FriendlyGhost.ogg \
- $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:system/media/audio/ringtones/Funk_Yall.ogg \
- $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:system/media/audio/ringtones/GameOverGuitar.ogg \
- $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:system/media/audio/ringtones/Gimme_Mo_Town.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:system/media/audio/ringtones/Glacial_Groove.ogg \
- $(LOCAL_PATH)/newwavelabs/Growl.ogg:system/media/audio/ringtones/Growl.ogg \
- $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:system/media/audio/ringtones/HalfwayHome.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:system/media/audio/ringtones/InsertCoin.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \
- $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:system/media/audio/ringtones/LoopyLounge.ogg \
- $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:system/media/audio/ringtones/LoveFlute.ogg \
- $(LOCAL_PATH)/ringtones/Lyra.ogg:system/media/audio/ringtones/Lyra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:system/media/audio/ringtones/MidEvilJaunt.ogg \
- $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:system/media/audio/ringtones/MildlyAlarming.ogg \
- $(LOCAL_PATH)/newwavelabs/Nairobi.ogg:system/media/audio/ringtones/Nairobi.ogg \
- $(LOCAL_PATH)/newwavelabs/Nassau.ogg:system/media/audio/ringtones/Nassau.ogg \
- $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:system/media/audio/ringtones/NewPlayer.ogg \
- $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:system/media/audio/ringtones/No_Limits.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises1.ogg:system/media/audio/ringtones/Noises1.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises2.ogg:system/media/audio/ringtones/Noises2.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises3.ogg:system/media/audio/ringtones/Noises3.ogg \
- $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:system/media/audio/ringtones/OrganDub.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/PERSEUS.ogg:system/media/audio/ringtones/PERSEUS.ogg \
- $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:system/media/audio/ringtones/Paradise_Island.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \
- $(LOCAL_PATH)/newwavelabs/Playa.ogg:system/media/audio/ringtones/Playa.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:system/media/audio/ringtones/Rasalas.ogg \
- $(LOCAL_PATH)/newwavelabs/Revelation.ogg:system/media/audio/ringtones/Revelation.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:system/media/audio/ringtones/Road_Trip.ogg \
- $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:system/media/audio/ringtones/RomancingTheTone.ogg \
- $(LOCAL_PATH)/newwavelabs/Safari.ogg:system/media/audio/ringtones/Safari.ogg \
- $(LOCAL_PATH)/newwavelabs/Savannah.ogg:system/media/audio/ringtones/Savannah.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/newwavelabs/Seville.ogg:system/media/audio/ringtones/Seville.ogg \
- $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:system/media/audio/ringtones/Shes_All_That.ogg \
- $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:system/media/audio/ringtones/SilkyWay.ogg \
- $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:system/media/audio/ringtones/SitarVsSitar.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:system/media/audio/ringtones/SpringyJalopy.ogg \
- $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:system/media/audio/ringtones/Steppin_Out.ogg \
- $(LOCAL_PATH)/newwavelabs/Terminated.ogg:system/media/audio/ringtones/Terminated.ogg \
- $(LOCAL_PATH)/ringtones/Testudo.ogg:system/media/audio/ringtones/Testudo.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:system/media/audio/ringtones/Third_Eye.ogg \
- $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:system/media/audio/ringtones/Thunderfoot.ogg \
- $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:system/media/audio/ringtones/TwirlAway.ogg \
- $(LOCAL_PATH)/ringtones/URSAMINOR.ogg:system/media/audio/ringtones/URSAMINOR.ogg \
- $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \
- $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:system/media/audio/ringtones/VeryAlarmed.ogg \
- $(LOCAL_PATH)/ringtones/Vespa.ogg:system/media/audio/ringtones/Vespa.ogg \
- $(LOCAL_PATH)/newwavelabs/World.ogg:system/media/audio/ringtones/World.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg \
- $(LOCAL_PATH)/ringtones/hydra.ogg:system/media/audio/ringtones/hydra.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/VideoStop_48k.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/ogg/WirelessChargingStarted.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \
- $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
- $(LOCAL_PATH)/effects/ogg/NFCFailure.ogg:system/media/audio/ui/NFCFailure.ogg \
- $(LOCAL_PATH)/effects/ogg/NFCInitiated.ogg:system/media/audio/ui/NFCInitiated.ogg \
- $(LOCAL_PATH)/effects/ogg/NFCSuccess.ogg:system/media/audio/ui/NFCSuccess.ogg \
- $(LOCAL_PATH)/effects/ogg/NFCTransferComplete.ogg:system/media/audio/ui/NFCTransferComplete.ogg \
- $(LOCAL_PATH)/effects/ogg/NFCTransferInitiated.ogg:system/media/audio/ui/NFCTransferInitiated.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Barium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Barium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Fermium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Hassium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neptunium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Nobelium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Promethium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Scandium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/Aldebaran.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Aldebaran.ogg \
+ $(LOCAL_PATH)/notifications/Altair.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Altair.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/Antares.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Antares.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Antimony.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Argon.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beryllium.ogg \
+ $(LOCAL_PATH)/notifications/Betelgeuse.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Betelgeuse.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CaffeineSnake.ogg \
+ $(LOCAL_PATH)/notifications/Canopus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Canopus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/Castor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Castor.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Cobalt.ogg \
+ $(LOCAL_PATH)/notifications/Cricket.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Cricket.ogg \
+ $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DearDeer.ogg \
+ $(LOCAL_PATH)/notifications/Deneb.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Deneb.ogg \
+ $(LOCAL_PATH)/notifications/Doink.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Doink.ogg \
+ $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DontPanic.ogg \
+ $(LOCAL_PATH)/notifications/Drip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Drip.ogg \
+ $(LOCAL_PATH)/notifications/Electra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Electra.ogg \
+ $(LOCAL_PATH)/F1_MissedCall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Fluorine.ogg \
+ $(LOCAL_PATH)/notifications/Fomalhaut.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Fomalhaut.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Gallium.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Helium.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Iridium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Krypton.ogg \
+ $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/KzurbSonar.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/Merope.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Merope.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/OnTheHunt.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Palladium.ogg \
+ $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Plastic_Pipe.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Radon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Radon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Rubidium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Selenium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/Sirrah.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Sirrah.ogg \
+ $(LOCAL_PATH)/notifications/SpaceSeed.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/SpaceSeed.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Strontium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Thallium.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/newwavelabs/Voila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Voila.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Xenon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Zirconium.ogg \
+ $(LOCAL_PATH)/notifications/arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/arcturus.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/regulus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/regulus.ogg \
+ $(LOCAL_PATH)/notifications/sirius.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/sirius.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/notifications/vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/vega.ogg \
+ $(LOCAL_PATH)/ringtones/ANDROMEDA.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ANDROMEDA.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Atria.ogg \
+ $(LOCAL_PATH)/ringtones/BOOTES.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BOOTES.ogg \
+ $(LOCAL_PATH)/newwavelabs/Backroad.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Backroad.ogg \
+ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BeatPlucker.ogg \
+ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BentleyDubs.ogg \
+ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Big_Easy.ogg \
+ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BirdLoop.ogg \
+ $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Bollywood.ogg \
+ $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BussaMove.ogg \
+ $(LOCAL_PATH)/ringtones/CANISMAJOR.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CANISMAJOR.ogg \
+ $(LOCAL_PATH)/ringtones/CASSIOPEIA.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CASSIOPEIA.ogg \
+ $(LOCAL_PATH)/newwavelabs/Cairo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cairo.ogg \
+ $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Calypso_Steel.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CanisMajor.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CaribbeanIce.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Champagne_Edition.ogg \
+ $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Club_Cubano.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrayonRock.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrazyDream.ogg \
+ $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CurveBall.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DancinFool.ogg \
+ $(LOCAL_PATH)/newwavelabs/Ding.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ding.ogg \
+ $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DonMessWivIt.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DreamTheme.ogg \
+ $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eastern_Sky.ogg \
+ $(LOCAL_PATH)/newwavelabs/Enter_the_Nexus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Enter_the_Nexus.ogg \
+ $(LOCAL_PATH)/ringtones/Eridani.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eridani.ogg \
+ $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/EtherShake.ogg \
+ $(LOCAL_PATH)/ringtones/FreeFlight.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/FreeFlight.ogg \
+ $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/FriendlyGhost.ogg \
+ $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Funk_Yall.ogg \
+ $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/GameOverGuitar.ogg \
+ $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Gimme_Mo_Town.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Glacial_Groove.ogg \
+ $(LOCAL_PATH)/newwavelabs/Growl.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Growl.ogg \
+ $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/HalfwayHome.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/InsertCoin.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Kuma.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoopyLounge.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoveFlute.ogg \
+ $(LOCAL_PATH)/ringtones/Lyra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Lyra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MidEvilJaunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MildlyAlarming.ogg \
+ $(LOCAL_PATH)/newwavelabs/Nairobi.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Nairobi.ogg \
+ $(LOCAL_PATH)/newwavelabs/Nassau.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Nassau.ogg \
+ $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/NewPlayer.ogg \
+ $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/No_Limits.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises1.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises1.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises2.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises2.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises3.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises3.ogg \
+ $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/OrganDub.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/PERSEUS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/PERSEUS.ogg \
+ $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Paradise_Island.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Perseus.ogg \
+ $(LOCAL_PATH)/newwavelabs/Playa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Playa.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rasalas.ogg \
+ $(LOCAL_PATH)/newwavelabs/Revelation.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Revelation.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Road_Trip.ogg \
+ $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/RomancingTheTone.ogg \
+ $(LOCAL_PATH)/newwavelabs/Safari.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Safari.ogg \
+ $(LOCAL_PATH)/newwavelabs/Savannah.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Savannah.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/newwavelabs/Seville.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Seville.ogg \
+ $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Shes_All_That.ogg \
+ $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SilkyWay.ogg \
+ $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SitarVsSitar.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SpringyJalopy.ogg \
+ $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Steppin_Out.ogg \
+ $(LOCAL_PATH)/newwavelabs/Terminated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Terminated.ogg \
+ $(LOCAL_PATH)/ringtones/Testudo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Testudo.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Third_Eye.ogg \
+ $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Thunderfoot.ogg \
+ $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/TwirlAway.ogg \
+ $(LOCAL_PATH)/ringtones/URSAMINOR.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/URSAMINOR.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/UrsaMinor.ogg \
+ $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/VeryAlarmed.ogg \
+ $(LOCAL_PATH)/ringtones/Vespa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Vespa.ogg \
+ $(LOCAL_PATH)/newwavelabs/World.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/World.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg \
+ $(LOCAL_PATH)/ringtones/hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/hydra.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoStop_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/ogg/WirelessChargingStarted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/WirelessChargingStarted.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/ChargingStarted.ogg \
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/InCallNotification.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCFailure.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/NFCFailure.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCInitiated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/NFCInitiated.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCSuccess.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/NFCSuccess.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCTransferComplete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/NFCTransferComplete.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCTransferInitiated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/NFCTransferInitiated.ogg \
diff --git a/data/sounds/AudioPackage10.mk b/data/sounds/AudioPackage10.mk
index 72aa7fe1c38a..699dbd68048d 100644
--- a/data/sounds/AudioPackage10.mk
+++ b/data/sounds/AudioPackage10.mk
@@ -8,63 +8,63 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop_48k.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \
- $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
- $(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
- $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:system/media/audio/ringtones/Atria.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:system/media/audio/ringtones/Rasalas.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/ChargingStarted.ogg \
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/InCallNotification.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/WirelessChargingStarted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Atria.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Kuma.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rasalas.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/AudioPackage11.mk b/data/sounds/AudioPackage11.mk
index 665ce521690e..99dfd0a6d455 100644
--- a/data/sounds/AudioPackage11.mk
+++ b/data/sounds/AudioPackage11.mk
@@ -8,63 +8,63 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop_48k.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \.
- $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
- $(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
- $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat_proc48.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:system/media/audio/ringtones/Atria.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:system/media/audio/ringtones/Rasalas.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/ChargingStarted.ogg \.
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/InCallNotification.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/WirelessChargingStarted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat_proc48.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Atria.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Kuma.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rasalas.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/AudioPackage12.mk b/data/sounds/AudioPackage12.mk
index 44a8f9e34cd3..6159a89e8489 100644
--- a/data/sounds/AudioPackage12.mk
+++ b/data/sounds/AudioPackage12.mk
@@ -16,15 +16,15 @@ EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete Keypre
MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingStarted VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
- $(LOCAL_PATH)/alarms/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
+ $(LOCAL_PATH)/alarms/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
- $(LOCAL_PATH)/notifications/ogg/$(fn).ogg:system/media/audio/notifications/$(fn).ogg)
+ $(LOCAL_PATH)/notifications/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
- $(LOCAL_PATH)/ringtones/ogg/$(fn).ogg:system/media/audio/ringtones/$(fn).ogg)
+ $(LOCAL_PATH)/ringtones/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
- $(LOCAL_PATH)/effects/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
- $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
diff --git a/data/sounds/AudioPackage12_48.mk b/data/sounds/AudioPackage12_48.mk
index 09fab041505e..2899cd160d24 100644
--- a/data/sounds/AudioPackage12_48.mk
+++ b/data/sounds/AudioPackage12_48.mk
@@ -17,21 +17,21 @@ MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingSta
# Alarms not yet available in 48 kHz
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
- $(LOCAL_PATH)/alarms/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
+ $(LOCAL_PATH)/alarms/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
- $(LOCAL_PATH)/notifications/ogg/$(fn)_48k.ogg:system/media/audio/notifications/$(fn).ogg)
+ $(LOCAL_PATH)/notifications/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
- $(LOCAL_PATH)/ringtones/ogg/$(fn)_48k.ogg:system/media/audio/ringtones/$(fn).ogg)
+ $(LOCAL_PATH)/ringtones/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
- $(LOCAL_PATH)/effects/ogg/$(fn)_48k.ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
- $(LOCAL_PATH)/effects/material/ogg/$(fn)_48k.ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/material/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
# no gold-plated version yet
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg
diff --git a/data/sounds/AudioPackage13.mk b/data/sounds/AudioPackage13.mk
index de4ee047986d..9423c0b9ba5b 100644
--- a/data/sounds/AudioPackage13.mk
+++ b/data/sounds/AudioPackage13.mk
@@ -17,15 +17,15 @@ EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete Keypre
MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
- $(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
+ $(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
- $(LOCAL_PATH)/notifications/material/ogg/$(fn).ogg:system/media/audio/notifications/$(fn).ogg)
+ $(LOCAL_PATH)/notifications/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
- $(LOCAL_PATH)/ringtones/material/ogg/$(fn).ogg:system/media/audio/ringtones/$(fn).ogg)
+ $(LOCAL_PATH)/ringtones/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
- $(LOCAL_PATH)/effects/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
- $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
diff --git a/data/sounds/AudioPackage13_48.mk b/data/sounds/AudioPackage13_48.mk
index 889d58172290..806c4e26152b 100644
--- a/data/sounds/AudioPackage13_48.mk
+++ b/data/sounds/AudioPackage13_48.mk
@@ -17,21 +17,21 @@ EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete Keypre
MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
- $(LOCAL_PATH)/alarms/material/ogg/$(fn)_48k.ogg:system/media/audio/alarms/$(fn).ogg)
+ $(LOCAL_PATH)/alarms/material/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
- $(LOCAL_PATH)/notifications/material/ogg/$(fn)_48k.ogg:system/media/audio/notifications/$(fn).ogg)
+ $(LOCAL_PATH)/notifications/material/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
- $(LOCAL_PATH)/ringtones/material/ogg/$(fn)_48k.ogg:system/media/audio/ringtones/$(fn).ogg)
+ $(LOCAL_PATH)/ringtones/material/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
- $(LOCAL_PATH)/effects/ogg/$(fn)_48k.ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
- $(LOCAL_PATH)/effects/material/ogg/$(fn)_48k.ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/material/ogg/$(fn)_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
# no gold-plated version yet
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg
diff --git a/data/sounds/AudioPackage14.mk b/data/sounds/AudioPackage14.mk
index c903a2b0eb97..3d161aabbf95 100644
--- a/data/sounds/AudioPackage14.mk
+++ b/data/sounds/AudioPackage14.mk
@@ -18,15 +18,15 @@ EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete Keypre
MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
- $(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
+ $(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
- $(LOCAL_PATH)/notifications/material/ogg/$(fn).ogg:system/media/audio/notifications/$(fn).ogg)
+ $(LOCAL_PATH)/notifications/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
- $(LOCAL_PATH)/ringtones/material/ogg/$(fn).ogg:system/media/audio/ringtones/$(fn).ogg)
+ $(LOCAL_PATH)/ringtones/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
- $(LOCAL_PATH)/effects/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
- $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+ $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/$(fn).ogg)
diff --git a/data/sounds/AudioPackage2.mk b/data/sounds/AudioPackage2.mk
index 40319c4505ec..bc4e8fbe811a 100644
--- a/data/sounds/AudioPackage2.mk
+++ b/data/sounds/AudioPackage2.mk
@@ -10,98 +10,98 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
- $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
- $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
- $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
- $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
- $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
- $(LOCAL_PATH)/effects/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
- $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
- $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
- $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
- $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
- $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:system/media/audio/notifications/CaffeineSnake.ogg
+ $(LOCAL_PATH)/F1_MissedCall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/effects/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BeatPlucker.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CaffeineSnake.ogg
ifneq ($(MINIMAL_NEWWAVELABS),true)
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
- $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
- $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:system/media/audio/ringtones/CaribbeanIce.ogg \
- $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:system/media/audio/ringtones/CurveBall.ogg \
- $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:system/media/audio/ringtones/EtherShake.ogg \
- $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:system/media/audio/ringtones/FriendlyGhost.ogg \
- $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:system/media/audio/ringtones/GameOverGuitar.ogg \
- $(LOCAL_PATH)/newwavelabs/Growl.ogg:system/media/audio/ringtones/Growl.ogg \
- $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:system/media/audio/ringtones/InsertCoin.ogg \
- $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:system/media/audio/ringtones/LoopyLounge.ogg \
- $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:system/media/audio/ringtones/LoveFlute.ogg \
- $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:system/media/audio/ringtones/MidEvilJaunt.ogg \
- $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:system/media/audio/ringtones/MildlyAlarming.ogg \
- $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:system/media/audio/ringtones/NewPlayer.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises1.ogg:system/media/audio/ringtones/Noises1.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises2.ogg:system/media/audio/ringtones/Noises2.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises3.ogg:system/media/audio/ringtones/Noises3.ogg \
- $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:system/media/audio/ringtones/OrganDub.ogg \
- $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:system/media/audio/ringtones/RomancingTheTone.ogg \
- $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:system/media/audio/ringtones/SitarVsSitar.ogg \
- $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:system/media/audio/ringtones/SpringyJalopy.ogg \
- $(LOCAL_PATH)/newwavelabs/Terminated.ogg:system/media/audio/ringtones/Terminated.ogg \
- $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:system/media/audio/ringtones/TwirlAway.ogg \
- $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:system/media/audio/ringtones/VeryAlarmed.ogg \
- $(LOCAL_PATH)/newwavelabs/World.ogg:system/media/audio/ringtones/World.ogg \
- $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:system/media/audio/notifications/DearDeer.ogg \
- $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:system/media/audio/notifications/DontPanic.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:system/media/audio/notifications/KzurbSonar.ogg \
- $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:system/media/audio/notifications/OnTheHunt.ogg \
- $(LOCAL_PATH)/newwavelabs/Voila.ogg:system/media/audio/notifications/Voila.ogg \
- $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:system/media/audio/ringtones/CrazyDream.ogg \
- $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:system/media/audio/ringtones/DreamTheme.ogg \
- $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \
- $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:system/media/audio/ringtones/Bollywood.ogg \
- $(LOCAL_PATH)/newwavelabs/Cairo.ogg:system/media/audio/ringtones/Cairo.ogg \
- $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:system/media/audio/ringtones/Calypso_Steel.ogg \
- $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:system/media/audio/ringtones/Champagne_Edition.ogg \
- $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:system/media/audio/ringtones/Club_Cubano.ogg \
- $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:system/media/audio/ringtones/Eastern_Sky.ogg \
- $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:system/media/audio/ringtones/Funk_Yall.ogg \
- $(LOCAL_PATH)/newwavelabs/Savannah.ogg:system/media/audio/ringtones/Savannah.ogg \
- $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:system/media/audio/ringtones/Gimme_Mo_Town.ogg \
- $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:system/media/audio/ringtones/Glacial_Groove.ogg \
- $(LOCAL_PATH)/newwavelabs/Seville.ogg:system/media/audio/ringtones/Seville.ogg \
- $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:system/media/audio/ringtones/No_Limits.ogg \
- $(LOCAL_PATH)/newwavelabs/Revelation.ogg:system/media/audio/ringtones/Revelation.ogg \
- $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:system/media/audio/ringtones/Paradise_Island.ogg \
- $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:system/media/audio/ringtones/Road_Trip.ogg \
- $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:system/media/audio/ringtones/Shes_All_That.ogg \
- $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:system/media/audio/ringtones/Steppin_Out.ogg \
- $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:system/media/audio/ringtones/Third_Eye.ogg \
- $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:system/media/audio/ringtones/Thunderfoot.ogg
+ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BentleyDubs.ogg \
+ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BirdLoop.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CaribbeanIce.ogg \
+ $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CurveBall.ogg \
+ $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/EtherShake.ogg \
+ $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/FriendlyGhost.ogg \
+ $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/GameOverGuitar.ogg \
+ $(LOCAL_PATH)/newwavelabs/Growl.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Growl.ogg \
+ $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/InsertCoin.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoopyLounge.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoveFlute.ogg \
+ $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MidEvilJaunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MildlyAlarming.ogg \
+ $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/NewPlayer.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises1.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises1.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises2.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises2.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises3.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises3.ogg \
+ $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/OrganDub.ogg \
+ $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/RomancingTheTone.ogg \
+ $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SitarVsSitar.ogg \
+ $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SpringyJalopy.ogg \
+ $(LOCAL_PATH)/newwavelabs/Terminated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Terminated.ogg \
+ $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/TwirlAway.ogg \
+ $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/VeryAlarmed.ogg \
+ $(LOCAL_PATH)/newwavelabs/World.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/World.ogg \
+ $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DearDeer.ogg \
+ $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DontPanic.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/KzurbSonar.ogg \
+ $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/OnTheHunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/Voila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Voila.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrazyDream.ogg \
+ $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DreamTheme.ogg \
+ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Big_Easy.ogg \
+ $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Bollywood.ogg \
+ $(LOCAL_PATH)/newwavelabs/Cairo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cairo.ogg \
+ $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Calypso_Steel.ogg \
+ $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Champagne_Edition.ogg \
+ $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Club_Cubano.ogg \
+ $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eastern_Sky.ogg \
+ $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Funk_Yall.ogg \
+ $(LOCAL_PATH)/newwavelabs/Savannah.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Savannah.ogg \
+ $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Gimme_Mo_Town.ogg \
+ $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Glacial_Groove.ogg \
+ $(LOCAL_PATH)/newwavelabs/Seville.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Seville.ogg \
+ $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/No_Limits.ogg \
+ $(LOCAL_PATH)/newwavelabs/Revelation.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Revelation.ogg \
+ $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Paradise_Island.ogg \
+ $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Road_Trip.ogg \
+ $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Shes_All_That.ogg \
+ $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Steppin_Out.ogg \
+ $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Third_Eye.ogg \
+ $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Thunderfoot.ogg
endif
diff --git a/data/sounds/AudioPackage3.mk b/data/sounds/AudioPackage3.mk
index a05de723c8f1..a98fb74a0f2a 100644
--- a/data/sounds/AudioPackage3.mk
+++ b/data/sounds/AudioPackage3.mk
@@ -10,94 +10,94 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
- $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
- $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
- $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
- $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
- $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
- $(LOCAL_PATH)/effects/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
- $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
- $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
- $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
- $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
- $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:system/media/audio/notifications/CaffeineSnake.ogg
+ $(LOCAL_PATH)/F1_MissedCall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/effects/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BeatPlucker.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CaffeineSnake.ogg
ifneq ($(MINIMAL_NEWWAVELABS),true)
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
- $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
- $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:system/media/audio/ringtones/CurveBall.ogg \
- $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:system/media/audio/ringtones/EtherShake.ogg \
- $(LOCAL_PATH)/newwavelabs/Growl.ogg:system/media/audio/ringtones/Growl.ogg \
- $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:system/media/audio/ringtones/LoopyLounge.ogg \
- $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:system/media/audio/ringtones/LoveFlute.ogg \
- $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:system/media/audio/ringtones/MidEvilJaunt.ogg \
- $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:system/media/audio/ringtones/MildlyAlarming.ogg \
- $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:system/media/audio/ringtones/NewPlayer.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises1.ogg:system/media/audio/ringtones/Noises1.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises2.ogg:system/media/audio/ringtones/Noises2.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises3.ogg:system/media/audio/ringtones/Noises3.ogg \
- $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:system/media/audio/ringtones/OrganDub.ogg \
- $(LOCAL_PATH)/newwavelabs/Terminated.ogg:system/media/audio/ringtones/Terminated.ogg \
- $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:system/media/audio/ringtones/TwirlAway.ogg \
- $(LOCAL_PATH)/newwavelabs/World.ogg:system/media/audio/ringtones/World.ogg \
- $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:system/media/audio/notifications/DearDeer.ogg \
- $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:system/media/audio/notifications/DontPanic.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:system/media/audio/notifications/KzurbSonar.ogg \
- $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:system/media/audio/notifications/OnTheHunt.ogg \
- $(LOCAL_PATH)/newwavelabs/Voila.ogg:system/media/audio/notifications/Voila.ogg \
- $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \
- $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:system/media/audio/ringtones/Bollywood.ogg \
- $(LOCAL_PATH)/newwavelabs/Cairo.ogg:system/media/audio/ringtones/Cairo.ogg \
- $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:system/media/audio/ringtones/Calypso_Steel.ogg \
- $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:system/media/audio/ringtones/Champagne_Edition.ogg \
- $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:system/media/audio/ringtones/Club_Cubano.ogg \
- $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:system/media/audio/ringtones/Eastern_Sky.ogg \
- $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:system/media/audio/ringtones/Funk_Yall.ogg \
- $(LOCAL_PATH)/newwavelabs/Savannah.ogg:system/media/audio/ringtones/Savannah.ogg \
- $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:system/media/audio/ringtones/Gimme_Mo_Town.ogg \
- $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:system/media/audio/ringtones/Glacial_Groove.ogg \
- $(LOCAL_PATH)/newwavelabs/Seville.ogg:system/media/audio/ringtones/Seville.ogg \
- $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:system/media/audio/ringtones/No_Limits.ogg \
- $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:system/media/audio/ringtones/Paradise_Island.ogg \
- $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:system/media/audio/ringtones/Road_Trip.ogg \
- $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:system/media/audio/ringtones/Shes_All_That.ogg \
- $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:system/media/audio/ringtones/Steppin_Out.ogg \
- $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:system/media/audio/ringtones/Third_Eye.ogg \
- $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:system/media/audio/ringtones/Thunderfoot.ogg \
- $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:system/media/audio/ringtones/HalfwayHome.ogg \
- $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:system/media/audio/ringtones/CrayonRock.ogg \
- $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:system/media/audio/ringtones/DancinFool.ogg \
- $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:system/media/audio/ringtones/BussaMove.ogg \
- $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:system/media/audio/ringtones/DonMessWivIt.ogg \
- $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:system/media/audio/ringtones/SilkyWay.ogg \
- $(LOCAL_PATH)/newwavelabs/Playa.ogg:system/media/audio/ringtones/Playa.ogg
+ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BentleyDubs.ogg \
+ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BirdLoop.ogg \
+ $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CurveBall.ogg \
+ $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/EtherShake.ogg \
+ $(LOCAL_PATH)/newwavelabs/Growl.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Growl.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoopyLounge.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoveFlute.ogg \
+ $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MidEvilJaunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MildlyAlarming.ogg \
+ $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/NewPlayer.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises1.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises1.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises2.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises2.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises3.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises3.ogg \
+ $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/OrganDub.ogg \
+ $(LOCAL_PATH)/newwavelabs/Terminated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Terminated.ogg \
+ $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/TwirlAway.ogg \
+ $(LOCAL_PATH)/newwavelabs/World.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/World.ogg \
+ $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DearDeer.ogg \
+ $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DontPanic.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/KzurbSonar.ogg \
+ $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/OnTheHunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/Voila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Voila.ogg \
+ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Big_Easy.ogg \
+ $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Bollywood.ogg \
+ $(LOCAL_PATH)/newwavelabs/Cairo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cairo.ogg \
+ $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Calypso_Steel.ogg \
+ $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Champagne_Edition.ogg \
+ $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Club_Cubano.ogg \
+ $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eastern_Sky.ogg \
+ $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Funk_Yall.ogg \
+ $(LOCAL_PATH)/newwavelabs/Savannah.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Savannah.ogg \
+ $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Gimme_Mo_Town.ogg \
+ $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Glacial_Groove.ogg \
+ $(LOCAL_PATH)/newwavelabs/Seville.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Seville.ogg \
+ $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/No_Limits.ogg \
+ $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Paradise_Island.ogg \
+ $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Road_Trip.ogg \
+ $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Shes_All_That.ogg \
+ $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Steppin_Out.ogg \
+ $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Third_Eye.ogg \
+ $(LOCAL_PATH)/newwavelabs/Thunderfoot.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Thunderfoot.ogg \
+ $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/HalfwayHome.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrayonRock.ogg \
+ $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DancinFool.ogg \
+ $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BussaMove.ogg \
+ $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DonMessWivIt.ogg \
+ $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SilkyWay.ogg \
+ $(LOCAL_PATH)/newwavelabs/Playa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Playa.ogg
endif
diff --git a/data/sounds/AudioPackage4.mk b/data/sounds/AudioPackage4.mk
index d376a2d91f6c..54c3c025d978 100644
--- a/data/sounds/AudioPackage4.mk
+++ b/data/sounds/AudioPackage4.mk
@@ -10,98 +10,98 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
- $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
- $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
- $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
- $(LOCAL_PATH)/notifications/Cricket.ogg:system/media/audio/notifications/Cricket.ogg \
- $(LOCAL_PATH)/notifications/Doink.ogg:system/media/audio/notifications/Doink.ogg \
- $(LOCAL_PATH)/notifications/Drip.ogg:system/media/audio/notifications/Drip.ogg \
- $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
- $(LOCAL_PATH)/notifications/SpaceSeed.ogg:system/media/audio/notifications/SpaceSeed.ogg \
- $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
- $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
- $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
- $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
- $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
- $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:system/media/audio/notifications/Plastic_Pipe.ogg \
- $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
- $(LOCAL_PATH)/effects/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/ringtones/FreeFlight.ogg:system/media/audio/ringtones/FreeFlight.ogg \
- $(LOCAL_PATH)/newwavelabs/Backroad.ogg:system/media/audio/ringtones/Backroad.ogg \
- $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:system/media/audio/notifications/CaffeineSnake.ogg
+ $(LOCAL_PATH)/F1_MissedCall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Cricket.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Cricket.ogg \
+ $(LOCAL_PATH)/notifications/Doink.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Doink.ogg \
+ $(LOCAL_PATH)/notifications/Drip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Drip.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/SpaceSeed.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/SpaceSeed.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Plastic_Pipe.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/effects/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/ringtones/FreeFlight.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/FreeFlight.ogg \
+ $(LOCAL_PATH)/newwavelabs/Backroad.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Backroad.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CaffeineSnake.ogg
ifneq ($(MINIMAL_NEWWAVELABS),true)
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:system/media/audio/notifications/DearDeer.ogg \
- $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:system/media/audio/notifications/DontPanic.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:system/media/audio/notifications/KzurbSonar.ogg \
- $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:system/media/audio/notifications/OnTheHunt.ogg \
- $(LOCAL_PATH)/newwavelabs/Voila.ogg:system/media/audio/notifications/Voila.ogg \
- $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \
- $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
- $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:system/media/audio/ringtones/Bollywood.ogg \
- $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:system/media/audio/ringtones/BussaMove.ogg \
- $(LOCAL_PATH)/newwavelabs/Cairo.ogg:system/media/audio/ringtones/Cairo.ogg \
- $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:system/media/audio/ringtones/Calypso_Steel.ogg \
- $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:system/media/audio/ringtones/Champagne_Edition.ogg \
- $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:system/media/audio/ringtones/Club_Cubano.ogg \
- $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:system/media/audio/ringtones/CrayonRock.ogg \
- $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:system/media/audio/ringtones/CurveBall.ogg \
- $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:system/media/audio/ringtones/DancinFool.ogg \
- $(LOCAL_PATH)/newwavelabs/Ding.ogg:system/media/audio/ringtones/Ding.ogg \
- $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:system/media/audio/ringtones/DonMessWivIt.ogg \
- $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:system/media/audio/ringtones/Eastern_Sky.ogg \
- $(LOCAL_PATH)/newwavelabs/Enter_the_Nexus.ogg:system/media/audio/ringtones/Enter_the_Nexus.ogg \
- $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:system/media/audio/ringtones/EtherShake.ogg \
- $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:system/media/audio/ringtones/Funk_Yall.ogg \
- $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:system/media/audio/ringtones/Gimme_Mo_Town.ogg \
- $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:system/media/audio/ringtones/Glacial_Groove.ogg \
- $(LOCAL_PATH)/newwavelabs/Growl.ogg:system/media/audio/ringtones/Growl.ogg \
- $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:system/media/audio/ringtones/HalfwayHome.ogg \
- $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:system/media/audio/ringtones/LoopyLounge.ogg \
- $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:system/media/audio/ringtones/LoveFlute.ogg \
- $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:system/media/audio/ringtones/MidEvilJaunt.ogg \
- $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:system/media/audio/ringtones/MildlyAlarming.ogg \
- $(LOCAL_PATH)/newwavelabs/Nairobi.ogg:system/media/audio/ringtones/Nairobi.ogg \
- $(LOCAL_PATH)/newwavelabs/Nassau.ogg:system/media/audio/ringtones/Nassau.ogg \
- $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:system/media/audio/ringtones/No_Limits.ogg \
- $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:system/media/audio/ringtones/OrganDub.ogg \
- $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:system/media/audio/ringtones/Paradise_Island.ogg \
- $(LOCAL_PATH)/newwavelabs/Playa.ogg:system/media/audio/ringtones/Playa.ogg \
- $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:system/media/audio/ringtones/Road_Trip.ogg \
- $(LOCAL_PATH)/newwavelabs/Safari.ogg:system/media/audio/ringtones/Safari.ogg \
- $(LOCAL_PATH)/newwavelabs/Seville.ogg:system/media/audio/ringtones/Seville.ogg \
- $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:system/media/audio/ringtones/Shes_All_That.ogg \
- $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:system/media/audio/ringtones/SilkyWay.ogg \
- $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:system/media/audio/ringtones/Steppin_Out.ogg \
- $(LOCAL_PATH)/newwavelabs/Terminated.ogg:system/media/audio/ringtones/Terminated.ogg \
- $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:system/media/audio/ringtones/Third_Eye.ogg \
- $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:system/media/audio/ringtones/TwirlAway.ogg \
- $(LOCAL_PATH)/newwavelabs/World.ogg:system/media/audio/ringtones/World.ogg
+ $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DearDeer.ogg \
+ $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DontPanic.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/KzurbSonar.ogg \
+ $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/OnTheHunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/Voila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Voila.ogg \
+ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Big_Easy.ogg \
+ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BirdLoop.ogg \
+ $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Bollywood.ogg \
+ $(LOCAL_PATH)/newwavelabs/BussaMove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BussaMove.ogg \
+ $(LOCAL_PATH)/newwavelabs/Cairo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cairo.ogg \
+ $(LOCAL_PATH)/newwavelabs/Calypso_Steel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Calypso_Steel.ogg \
+ $(LOCAL_PATH)/newwavelabs/Champagne_Edition.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Champagne_Edition.ogg \
+ $(LOCAL_PATH)/newwavelabs/Club_Cubano.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Club_Cubano.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrayonRock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrayonRock.ogg \
+ $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CurveBall.ogg \
+ $(LOCAL_PATH)/newwavelabs/DancinFool.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DancinFool.ogg \
+ $(LOCAL_PATH)/newwavelabs/Ding.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ding.ogg \
+ $(LOCAL_PATH)/newwavelabs/DonMessWivIt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DonMessWivIt.ogg \
+ $(LOCAL_PATH)/newwavelabs/Eastern_Sky.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eastern_Sky.ogg \
+ $(LOCAL_PATH)/newwavelabs/Enter_the_Nexus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Enter_the_Nexus.ogg \
+ $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/EtherShake.ogg \
+ $(LOCAL_PATH)/newwavelabs/Funk_Yall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Funk_Yall.ogg \
+ $(LOCAL_PATH)/newwavelabs/Gimme_Mo_Town.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Gimme_Mo_Town.ogg \
+ $(LOCAL_PATH)/newwavelabs/Glacial_Groove.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Glacial_Groove.ogg \
+ $(LOCAL_PATH)/newwavelabs/Growl.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Growl.ogg \
+ $(LOCAL_PATH)/newwavelabs/HalfwayHome.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/HalfwayHome.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoopyLounge.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoveFlute.ogg \
+ $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MidEvilJaunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MildlyAlarming.ogg \
+ $(LOCAL_PATH)/newwavelabs/Nairobi.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Nairobi.ogg \
+ $(LOCAL_PATH)/newwavelabs/Nassau.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Nassau.ogg \
+ $(LOCAL_PATH)/newwavelabs/No_Limits.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/No_Limits.ogg \
+ $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/OrganDub.ogg \
+ $(LOCAL_PATH)/newwavelabs/Paradise_Island.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Paradise_Island.ogg \
+ $(LOCAL_PATH)/newwavelabs/Playa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Playa.ogg \
+ $(LOCAL_PATH)/newwavelabs/Road_Trip.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Road_Trip.ogg \
+ $(LOCAL_PATH)/newwavelabs/Safari.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Safari.ogg \
+ $(LOCAL_PATH)/newwavelabs/Seville.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Seville.ogg \
+ $(LOCAL_PATH)/newwavelabs/Shes_All_That.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Shes_All_That.ogg \
+ $(LOCAL_PATH)/newwavelabs/SilkyWay.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SilkyWay.ogg \
+ $(LOCAL_PATH)/newwavelabs/Steppin_Out.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Steppin_Out.ogg \
+ $(LOCAL_PATH)/newwavelabs/Terminated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Terminated.ogg \
+ $(LOCAL_PATH)/newwavelabs/Third_Eye.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Third_Eye.ogg \
+ $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/TwirlAway.ogg \
+ $(LOCAL_PATH)/newwavelabs/World.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/World.ogg
endif
diff --git a/data/sounds/AudioPackage5.mk b/data/sounds/AudioPackage5.mk
index 72384c8b9146..8a03a2e1eb1d 100644
--- a/data/sounds/AudioPackage5.mk
+++ b/data/sounds/AudioPackage5.mk
@@ -8,69 +8,69 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/effects/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/Aldebaran.ogg:system/media/audio/notifications/Aldebaran.ogg \
- $(LOCAL_PATH)/notifications/Altair.ogg:system/media/audio/notifications/Altair.ogg \
- $(LOCAL_PATH)/notifications/Antares.ogg:system/media/audio/notifications/Antares.ogg \
- $(LOCAL_PATH)/notifications/arcturus.ogg:system/media/audio/notifications/arcturus.ogg \
- $(LOCAL_PATH)/notifications/Betelgeuse.ogg:system/media/audio/notifications/Betelgeuse.ogg \
- $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \
- $(LOCAL_PATH)/notifications/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/Castor.ogg:system/media/audio/notifications/Castor.ogg \
- $(LOCAL_PATH)/notifications/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \
- $(LOCAL_PATH)/notifications/Electra.ogg:system/media/audio/notifications/Electra.ogg \
- $(LOCAL_PATH)/notifications/Fomalhaut.ogg:system/media/audio/notifications/Fomalhaut.ogg \
- $(LOCAL_PATH)/notifications/Merope.ogg:system/media/audio/notifications/Merope.ogg \
- $(LOCAL_PATH)/notifications/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
- $(LOCAL_PATH)/notifications/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/regulus.ogg:system/media/audio/notifications/regulus.ogg \
- $(LOCAL_PATH)/notifications/sirius.ogg:system/media/audio/notifications/sirius.ogg \
- $(LOCAL_PATH)/notifications/Sirrah.ogg:system/media/audio/notifications/Sirrah.ogg \
- $(LOCAL_PATH)/notifications/vega.ogg:system/media/audio/notifications/vega.ogg \
- $(LOCAL_PATH)/ringtones/ANDROMEDA.ogg:system/media/audio/ringtones/ANDROMEDA.ogg \
- $(LOCAL_PATH)/ringtones/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/BOOTES.ogg:system/media/audio/ringtones/BOOTES.ogg \
- $(LOCAL_PATH)/ringtones/CANISMAJOR.ogg:system/media/audio/ringtones/CANISMAJOR.ogg \
- $(LOCAL_PATH)/ringtones/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
- $(LOCAL_PATH)/ringtones/CASSIOPEIA.ogg:system/media/audio/ringtones/CASSIOPEIA.ogg \
- $(LOCAL_PATH)/ringtones/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/ringtones/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
- $(LOCAL_PATH)/ringtones/Eridani.ogg:system/media/audio/ringtones/Eridani.ogg \
- $(LOCAL_PATH)/ringtones/hydra.ogg:system/media/audio/ringtones/hydra.ogg \
- $(LOCAL_PATH)/ringtones/Lyra.ogg:system/media/audio/ringtones/Lyra.ogg \
- $(LOCAL_PATH)/ringtones/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/PERSEUS.ogg:system/media/audio/ringtones/PERSEUS.ogg \
- $(LOCAL_PATH)/ringtones/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
- $(LOCAL_PATH)/ringtones/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/Testudo.ogg:system/media/audio/ringtones/Testudo.ogg \
- $(LOCAL_PATH)/ringtones/URSAMINOR.ogg:system/media/audio/ringtones/URSAMINOR.ogg \
- $(LOCAL_PATH)/ringtones/Vespa.ogg:system/media/audio/ringtones/Vespa.ogg
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/effects/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/Aldebaran.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Aldebaran.ogg \
+ $(LOCAL_PATH)/notifications/Altair.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Altair.ogg \
+ $(LOCAL_PATH)/notifications/Antares.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Antares.ogg \
+ $(LOCAL_PATH)/notifications/arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/arcturus.ogg \
+ $(LOCAL_PATH)/notifications/Betelgeuse.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Betelgeuse.ogg \
+ $(LOCAL_PATH)/notifications/Canopus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Canopus.ogg \
+ $(LOCAL_PATH)/notifications/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/Castor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Castor.ogg \
+ $(LOCAL_PATH)/notifications/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/Deneb.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Deneb.ogg \
+ $(LOCAL_PATH)/notifications/Electra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Electra.ogg \
+ $(LOCAL_PATH)/notifications/Fomalhaut.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Fomalhaut.ogg \
+ $(LOCAL_PATH)/notifications/Merope.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Merope.ogg \
+ $(LOCAL_PATH)/notifications/Polaris.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/regulus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/regulus.ogg \
+ $(LOCAL_PATH)/notifications/sirius.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/sirius.ogg \
+ $(LOCAL_PATH)/notifications/Sirrah.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Sirrah.ogg \
+ $(LOCAL_PATH)/notifications/vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/vega.ogg \
+ $(LOCAL_PATH)/ringtones/ANDROMEDA.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ANDROMEDA.ogg \
+ $(LOCAL_PATH)/ringtones/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/BOOTES.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BOOTES.ogg \
+ $(LOCAL_PATH)/ringtones/CANISMAJOR.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CANISMAJOR.ogg \
+ $(LOCAL_PATH)/ringtones/Carina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/CASSIOPEIA.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CASSIOPEIA.ogg \
+ $(LOCAL_PATH)/ringtones/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/ringtones/Draco.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/ringtones/Eridani.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Eridani.ogg \
+ $(LOCAL_PATH)/ringtones/hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/hydra.ogg \
+ $(LOCAL_PATH)/ringtones/Lyra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Lyra.ogg \
+ $(LOCAL_PATH)/ringtones/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/PERSEUS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/PERSEUS.ogg \
+ $(LOCAL_PATH)/ringtones/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/Rigel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/ringtones/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/Testudo.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Testudo.ogg \
+ $(LOCAL_PATH)/ringtones/URSAMINOR.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/URSAMINOR.ogg \
+ $(LOCAL_PATH)/ringtones/Vespa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Vespa.ogg
diff --git a/data/sounds/AudioPackage6.mk b/data/sounds/AudioPackage6.mk
index 5413704f0fac..a778261c0a22 100644
--- a/data/sounds/AudioPackage6.mk
+++ b/data/sounds/AudioPackage6.mk
@@ -8,41 +8,41 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Barium.ogg:system/media/audio/alarms/Barium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:system/media/audio/notifications/Antimony.ogg \
- $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:system/media/audio/notifications/Beryllium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:system/media/audio/notifications/Cobalt.ogg \
- $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:system/media/audio/notifications/Fluorine.ogg \
- $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:system/media/audio/notifications/Gallium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Helium.ogg:system/media/audio/notifications/Helium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:system/media/audio/notifications/Krypton.ogg \
- $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:system/media/audio/notifications/Palladium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Radon.ogg:system/media/audio/notifications/Radon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:system/media/audio/notifications/Rubidium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:system/media/audio/notifications/Selenium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:system/media/audio/notifications/Strontium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:system/media/audio/notifications/Thallium.ogg \
- $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:system/media/audio/notifications/Xenon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:system/media/audio/notifications/Zirconium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Barium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Barium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Scandium.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Antimony.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Argon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beryllium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Cobalt.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Fluorine.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Gallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Helium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Iridium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Krypton.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Palladium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Radon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Radon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Rubidium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Selenium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Strontium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Thallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Xenon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Zirconium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
diff --git a/data/sounds/AudioPackage7.mk b/data/sounds/AudioPackage7.mk
index e4763be2d4aa..27e349d2262e 100644
--- a/data/sounds/AudioPackage7.mk
+++ b/data/sounds/AudioPackage7.mk
@@ -8,64 +8,64 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Fermium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Hassium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neptunium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Nobelium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CanisMajor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Perseus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/UrsaMinor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/AudioPackage7alt.mk b/data/sounds/AudioPackage7alt.mk
index 30e617316ef4..a0f4d89ff32c 100644
--- a/data/sounds/AudioPackage7alt.mk
+++ b/data/sounds/AudioPackage7alt.mk
@@ -8,63 +8,63 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg-jp/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg-jp/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
- $(LOCAL_PATH)/alarms/ogg-jp/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg-jp/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
- $(LOCAL_PATH)/alarms/ogg-jp/Neon.ogg:system/media/audio/alarms/Neon.ogg \
- $(LOCAL_PATH)/alarms/ogg-jp/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
+ $(LOCAL_PATH)/alarms/ogg-jp/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Neon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CanisMajor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Perseus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/UrsaMinor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/AudioPackage8.mk b/data/sounds/AudioPackage8.mk
index b38e62dec6ad..032b4d26ed6f 100644
--- a/data/sounds/AudioPackage8.mk
+++ b/data/sounds/AudioPackage8.mk
@@ -8,66 +8,66 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
- $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Fermium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Hassium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neptunium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Nobelium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Promethium.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CanisMajor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Perseus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/UrsaMinor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/AudioPackage9.mk b/data/sounds/AudioPackage9.mk
index dbe1350f304a..53cc8c08a76c 100644
--- a/data/sounds/AudioPackage9.mk
+++ b/data/sounds/AudioPackage9.mk
@@ -8,43 +8,43 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
- $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
- $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
- $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
- $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
- $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
- $(LOCAL_PATH)/effects/ogg/Trusted.ogg:system/media/audio/ui/Trusted.ogg \
- $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
- $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
- $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
- $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
- $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
- $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
- $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
- $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
- $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
- $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
- $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
- $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
- $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Girtab.ogg
diff --git a/data/sounds/AudioPackageGo.mk b/data/sounds/AudioPackageGo.mk
index 0296219fe9b4..e3b27f2cd962 100644
--- a/data/sounds/AudioPackageGo.mk
+++ b/data/sounds/AudioPackageGo.mk
@@ -20,30 +20,30 @@ LOCAL_PATH := frameworks/base/data/sounds
# Ring_Synth_04 : Flutey Phone
# Alarm_Beep_03 : Beep Beep Beep
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
- $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \
- $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \
- $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \
- $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
- $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \
- $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
- $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
- $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
- $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Argon.ogg \
+ $(LOCAL_PATH)/notifications/Canopus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Canopus.ogg \
+ $(LOCAL_PATH)/notifications/Deneb.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Deneb.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Iridium.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Kuma.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
diff --git a/data/sounds/AudioTv.mk b/data/sounds/AudioTv.mk
index 91265af77fa5..d0006b787f49 100644
--- a/data/sounds/AudioTv.mk
+++ b/data/sounds/AudioTv.mk
@@ -15,8 +15,8 @@
LOCAL_PATH := frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg
diff --git a/data/sounds/OriginalAudio.mk b/data/sounds/OriginalAudio.mk
index f68375205d89..4d74d1224caa 100644
--- a/data/sounds/OriginalAudio.mk
+++ b/data/sounds/OriginalAudio.mk
@@ -9,67 +9,67 @@
LOCAL_PATH:= frameworks/base/data/sounds
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
- $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
- $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
- $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
- $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
- $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
- $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
- $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
- $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \
- $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
- $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
- $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
- $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
- $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
- $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
- $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
- $(LOCAL_PATH)/effects/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
- $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
- $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
- $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
- $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:system/media/audio/notifications/CaffeineSnake.ogg
+ $(LOCAL_PATH)/F1_MissedCall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/Ring_Classic_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Classic_02.ogg \
+ $(LOCAL_PATH)/Ring_Digital_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Digital_02.ogg \
+ $(LOCAL_PATH)/Ring_Synth_04.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_04.ogg \
+ $(LOCAL_PATH)/Ring_Synth_02.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Ring_Synth_02.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/effects/Effect_Tick.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/KeypressStandard.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/KeypressDelete.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/KeypressReturn.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/VideoRecord.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/VideoStop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/camera_click.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BeatPlucker.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaffeineSnake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/CaffeineSnake.ogg
ifneq ($(MINIMAL_NEWWAVELABS),true)
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
- $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
- $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:system/media/audio/ringtones/CaribbeanIce.ogg \
- $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:system/media/audio/ringtones/CurveBall.ogg \
- $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:system/media/audio/ringtones/EtherShake.ogg \
- $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:system/media/audio/ringtones/FriendlyGhost.ogg \
- $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:system/media/audio/ringtones/GameOverGuitar.ogg \
- $(LOCAL_PATH)/newwavelabs/Growl.ogg:system/media/audio/ringtones/Growl.ogg \
- $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:system/media/audio/ringtones/InsertCoin.ogg \
- $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:system/media/audio/ringtones/LoopyLounge.ogg \
- $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:system/media/audio/ringtones/LoveFlute.ogg \
- $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:system/media/audio/ringtones/MidEvilJaunt.ogg \
- $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:system/media/audio/ringtones/MildlyAlarming.ogg \
- $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:system/media/audio/ringtones/NewPlayer.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises1.ogg:system/media/audio/ringtones/Noises1.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises2.ogg:system/media/audio/ringtones/Noises2.ogg \
- $(LOCAL_PATH)/newwavelabs/Noises3.ogg:system/media/audio/ringtones/Noises3.ogg \
- $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:system/media/audio/ringtones/OrganDub.ogg \
- $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:system/media/audio/ringtones/RomancingTheTone.ogg \
- $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:system/media/audio/ringtones/SitarVsSitar.ogg \
- $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:system/media/audio/ringtones/SpringyJalopy.ogg \
- $(LOCAL_PATH)/newwavelabs/Terminated.ogg:system/media/audio/ringtones/Terminated.ogg \
- $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:system/media/audio/ringtones/TwirlAway.ogg \
- $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:system/media/audio/ringtones/VeryAlarmed.ogg \
- $(LOCAL_PATH)/newwavelabs/World.ogg:system/media/audio/ringtones/World.ogg \
- $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:system/media/audio/notifications/DearDeer.ogg \
- $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:system/media/audio/notifications/DontPanic.ogg \
- $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \
- $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:system/media/audio/notifications/KzurbSonar.ogg \
- $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:system/media/audio/notifications/OnTheHunt.ogg \
- $(LOCAL_PATH)/newwavelabs/Voila.ogg:system/media/audio/notifications/Voila.ogg \
- $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:system/media/audio/ringtones/CrazyDream.ogg \
- $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:system/media/audio/ringtones/DreamTheme.ogg
+ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BentleyDubs.ogg \
+ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/BirdLoop.ogg \
+ $(LOCAL_PATH)/newwavelabs/CaribbeanIce.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CaribbeanIce.ogg \
+ $(LOCAL_PATH)/newwavelabs/CurveBall.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CurveBall.ogg \
+ $(LOCAL_PATH)/newwavelabs/EtherShake.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/EtherShake.ogg \
+ $(LOCAL_PATH)/newwavelabs/FriendlyGhost.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/FriendlyGhost.ogg \
+ $(LOCAL_PATH)/newwavelabs/GameOverGuitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/GameOverGuitar.ogg \
+ $(LOCAL_PATH)/newwavelabs/Growl.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Growl.ogg \
+ $(LOCAL_PATH)/newwavelabs/InsertCoin.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/InsertCoin.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoopyLounge.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoopyLounge.ogg \
+ $(LOCAL_PATH)/newwavelabs/LoveFlute.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/LoveFlute.ogg \
+ $(LOCAL_PATH)/newwavelabs/MidEvilJaunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MidEvilJaunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/MildlyAlarming.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/MildlyAlarming.ogg \
+ $(LOCAL_PATH)/newwavelabs/NewPlayer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/NewPlayer.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises1.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises1.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises2.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises2.ogg \
+ $(LOCAL_PATH)/newwavelabs/Noises3.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Noises3.ogg \
+ $(LOCAL_PATH)/newwavelabs/OrganDub.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/OrganDub.ogg \
+ $(LOCAL_PATH)/newwavelabs/RomancingTheTone.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/RomancingTheTone.ogg \
+ $(LOCAL_PATH)/newwavelabs/SitarVsSitar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SitarVsSitar.ogg \
+ $(LOCAL_PATH)/newwavelabs/SpringyJalopy.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/SpringyJalopy.ogg \
+ $(LOCAL_PATH)/newwavelabs/Terminated.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/Terminated.ogg \
+ $(LOCAL_PATH)/newwavelabs/TwirlAway.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/TwirlAway.ogg \
+ $(LOCAL_PATH)/newwavelabs/VeryAlarmed.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/VeryAlarmed.ogg \
+ $(LOCAL_PATH)/newwavelabs/World.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/World.ogg \
+ $(LOCAL_PATH)/newwavelabs/DearDeer.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DearDeer.ogg \
+ $(LOCAL_PATH)/newwavelabs/DontPanic.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/DontPanic.ogg \
+ $(LOCAL_PATH)/newwavelabs/Highwire.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Highwire.ogg \
+ $(LOCAL_PATH)/newwavelabs/KzurbSonar.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/KzurbSonar.ogg \
+ $(LOCAL_PATH)/newwavelabs/OnTheHunt.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/OnTheHunt.ogg \
+ $(LOCAL_PATH)/newwavelabs/Voila.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/notifications/Voila.ogg \
+ $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/CrazyDream.ogg \
+ $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/ringtones/DreamTheme.ogg
endif
diff --git a/drm/java/android/drm/DrmManagerClient.java b/drm/java/android/drm/DrmManagerClient.java
index 76eab4a7905a..fcebad339f2b 100644
--- a/drm/java/android/drm/DrmManagerClient.java
+++ b/drm/java/android/drm/DrmManagerClient.java
@@ -831,6 +831,7 @@ public class DrmManagerClient implements AutoCloseable {
* content://media/<table_name>/<row_index> (or)
* file://sdcard/test.mp4
* http://test.com/test.mp4
+ * https://test.com/test.mp4
*
* Here <table_name> shall be "video" or "audio" or "images"
* <row_index> the index of the content in given table
@@ -843,7 +844,7 @@ public class DrmManagerClient implements AutoCloseable {
scheme.equals(ContentResolver.SCHEME_FILE)) {
path = uri.getPath();
- } else if (scheme.equals("http")) {
+ } else if (scheme.equals("http") || scheme.equals("https")) {
path = uri.toString();
} else if (scheme.equals(ContentResolver.SCHEME_CONTENT)) {
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index ca9dc475f7a1..65aaba17a55d 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.UnsupportedAppUsage;
import android.graphics.Canvas.VertexMode;
+import android.graphics.text.MeasuredText;
import android.text.GraphicsOperations;
import android.text.MeasuredParagraph;
import android.text.PrecomputedText;
@@ -554,14 +555,12 @@ public abstract class BaseCanvas {
final int paraStart = pt.getParagraphStart(paraIndex);
final MeasuredParagraph mp = pt.getMeasuredParagraph(paraIndex);
// Only support the text in the same paragraph.
- nDrawTextRun(mNativeCanvasWrapper,
- mp.getChars(),
- start - paraStart,
- end - start,
- contextStart - paraStart,
- contextEnd - contextStart,
- x, y, isRtl, paint.getNativeInstance(),
- mp.getMeasuredText().getNativePtr());
+ drawTextRun(mp.getMeasuredText(),
+ start - paraStart,
+ end - paraStart,
+ contextStart - paraStart,
+ contextEnd - paraStart,
+ x, y, isRtl, paint);
return;
}
}
@@ -576,6 +575,14 @@ public abstract class BaseCanvas {
}
}
+ public void drawTextRun(@NonNull MeasuredText measuredText, int start, int end,
+ int contextStart, int contextEnd, float x, float y, boolean isRtl,
+ @NonNull Paint paint) {
+ nDrawTextRun(mNativeCanvasWrapper, measuredText.getChars(), start, end - start,
+ contextStart, contextEnd - contextStart, x, y, isRtl, paint.getNativeInstance(),
+ measuredText.getNativePtr());
+ }
+
public void drawVertices(@NonNull VertexMode mode, int vertexCount, @NonNull float[] verts,
int vertOffset, @Nullable float[] texs, int texOffset, @Nullable int[] colors,
int colorOffset, @Nullable short[] indices, int indexOffset, int indexCount,
diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java
index 901c2116884b..4f6093500cad 100644
--- a/graphics/java/android/graphics/BaseRecordingCanvas.java
+++ b/graphics/java/android/graphics/BaseRecordingCanvas.java
@@ -20,6 +20,7 @@ import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
+import android.graphics.text.MeasuredText;
import android.text.GraphicsOperations;
import android.text.MeasuredParagraph;
import android.text.PrecomputedText;
@@ -522,14 +523,12 @@ public class BaseRecordingCanvas extends Canvas {
final int paraStart = pt.getParagraphStart(paraIndex);
final MeasuredParagraph mp = pt.getMeasuredParagraph(paraIndex);
// Only support if the target is in the same paragraph.
- nDrawTextRun(mNativeCanvasWrapper,
- mp.getChars(),
+ drawTextRun(mp.getMeasuredText(),
start - paraStart,
- end - start,
+ end - paraStart,
contextStart - paraStart,
- contextEnd - contextStart,
- x, y, isRtl, paint.getNativeInstance(),
- mp.getMeasuredText().getNativePtr());
+ contextEnd - paraStart,
+ x, y, isRtl, paint);
return;
}
}
@@ -545,6 +544,15 @@ public class BaseRecordingCanvas extends Canvas {
}
@Override
+ public void drawTextRun(@NonNull MeasuredText measuredText, int start, int end,
+ int contextStart, int contextEnd, float x, float y, boolean isRtl,
+ @NonNull Paint paint) {
+ nDrawTextRun(mNativeCanvasWrapper, measuredText.getChars(), start, end - start,
+ contextStart, contextEnd - contextStart, x, y, isRtl, paint.getNativeInstance(),
+ measuredText.getNativePtr());
+ }
+
+ @Override
public final void drawVertices(@NonNull VertexMode mode, int vertexCount,
@NonNull float[] verts, int vertOffset, @Nullable float[] texs, int texOffset,
@Nullable int[] colors, int colorOffset, @Nullable short[] indices, int indexOffset,
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 790b37eec4c5..30f0bfa68b4a 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -18,9 +18,11 @@ package android.graphics;
import android.annotation.CheckResult;
import android.annotation.ColorInt;
+import android.annotation.ColorLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.annotation.WorkerThread;
import android.content.res.ResourcesImpl;
@@ -1780,6 +1782,30 @@ public final class Bitmap implements Parcelable {
}
/**
+ * Fills the bitmap's pixels with the specified {@link Color}.
+ *
+ * @throws IllegalStateException if the bitmap is not mutable.
+ * @throws IllegalArgumentException if the color space encoded in the long
+ * is invalid or unknown.
+ *
+ * @hide pending API approval
+ */
+ @TestApi
+ public void eraseColor(@ColorLong long c) {
+ checkRecycled("Can't erase a recycled bitmap");
+ if (!isMutable()) {
+ throw new IllegalStateException("cannot erase immutable bitmaps");
+ }
+
+ ColorSpace cs = Color.colorSpace(c);
+ float r = Color.red(c);
+ float g = Color.green(c);
+ float b = Color.blue(c);
+ float a = Color.alpha(c);
+ nativeErase(mNativePtr, cs, r, g, b, a);
+ }
+
+ /**
* Returns the {@link Color} at the specified location. Throws an exception
* if x or y are out of bounds (negative or >= to the width or height
* respectively). The returned color is a non-premultiplied ARGB value in
@@ -2123,6 +2149,8 @@ public final class Bitmap implements Parcelable {
int quality, OutputStream stream,
byte[] tempStorage);
private static native void nativeErase(long nativeBitmap, int color);
+ private static native void nativeErase(long nativeBitmap, ColorSpace cs,
+ float r, float g, float b, float a);
private static native int nativeRowBytes(long nativeBitmap);
private static native int nativeConfig(long nativeBitmap);
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index adab1a9c5c51..022fbdc9df74 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -440,7 +440,8 @@ public class BitmapFactory {
if (opts == null) return;
if (opts.inBitmap != null && opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) {
- throw new IllegalArgumentException("Bitmaps with Config.HARWARE are always immutable");
+ throw new IllegalArgumentException(
+ "Bitmaps with Config.HARDWARE are always immutable");
}
if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) {
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 63a806e53556..8c1bae2a0527 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.UnsupportedAppUsage;
+import android.graphics.text.MeasuredText;
import android.os.Build;
import dalvik.annotation.optimization.CriticalNative;
@@ -2122,7 +2123,8 @@ public class Canvas extends BaseCanvas {
* the text next to it.
* <p>
* All text outside the range {@code contextStart..contextEnd} is ignored. The text between
- * {@code start} and {@code end} will be laid out and drawn.
+ * {@code start} and {@code end} will be laid out and drawn. The context range is useful for
+ * contextual shaping, e.g. Kerning, Arabic contextural form.
* <p>
* The direction of the run is explicitly specified by {@code isRtl}. Thus, this method is
* suitable only for runs of a single direction. Alignment of the text is as determined by the
@@ -2151,6 +2153,31 @@ public class Canvas extends BaseCanvas {
}
/**
+ * Draw a run of text, all in a single direction, with optional context for complex text
+ * shaping.
+ * <p>
+ * See {@link #drawTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint)} for
+ * more details. This method uses a {@link MeasuredText} rather than CharSequence to represent
+ * the string.
+ *
+ * @param text the text to render
+ * @param start the start of the text to render. Data before this position can be used for
+ * shaping context.
+ * @param end the end of the text to render. Data at or after this position can be used for
+ * shaping context.
+ * @param contextStart the index of the start of the shaping context
+ * @param contextEnd the index of the end of the shaping context
+ * @param x the x position at which to draw the text
+ * @param y the y position at which to draw the text
+ * @param isRtl whether the run is in RTL direction
+ * @param paint the paint
+ */
+ public void drawTextRun(@NonNull MeasuredText text, int start, int end, int contextStart,
+ int contextEnd, float x, float y, boolean isRtl, @NonNull Paint paint) {
+ super.drawTextRun(text, start, end, contextStart, contextEnd, x, y, isRtl, paint);
+ }
+
+ /**
* Draw the array of vertices, interpreted as triangles (based on mode). The verts array is
* required, and specifies the x,y pairs for each vertex. If texs is non-null, then it is used
* to specify the coordinate in shader coordinates to use at each vertex (the paint must have a
diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java
index 2227cf5ef2e0..9fa70a5ab19c 100644
--- a/graphics/java/android/graphics/ColorSpace.java
+++ b/graphics/java/android/graphics/ColorSpace.java
@@ -984,11 +984,12 @@ public abstract class ColorSpace {
* {@link Named#SRGB sRGB} primaries.
* </li>
* <li>
- * Its white point is withing 1e-3 of the CIE standard
+ * Its white point is within 1e-3 of the CIE standard
* illuminant {@link #ILLUMINANT_D65 D65}.
* </li>
* <li>Its opto-electronic transfer function is not linear.</li>
* <li>Its electro-optical transfer function is not linear.</li>
+ * <li>Its transfer functions yield values within 1e-3 of {@link Named#SRGB}.</li>
* <li>Its range is \([0..1]\).</li>
* </ul>
* <p>This method always returns true for {@link Named#SRGB}.</p>
@@ -1354,9 +1355,9 @@ public abstract class ColorSpace {
*/
@NonNull
static ColorSpace get(@IntRange(from = MIN_ID, to = MAX_ID) int index) {
- if (index < 0 || index > Named.values().length) {
+ if (index < 0 || index >= Named.values().length) {
throw new IllegalArgumentException("Invalid ID, must be in the range [0.." +
- Named.values().length + "]");
+ Named.values().length + ")");
}
return sNamedColorSpaces[index];
}
@@ -1660,10 +1661,12 @@ public abstract class ColorSpace {
* @param rhs 3x3 matrix, as a non-null array of 9 floats
* @return A new array of 9 floats containing the result of the multiplication
* of rhs by lhs
+ *
+ * @hide
*/
@NonNull
@Size(9)
- private static float[] mul3x3(@NonNull @Size(9) float[] lhs, @NonNull @Size(9) float[] rhs) {
+ public static float[] mul3x3(@NonNull @Size(9) float[] lhs, @NonNull @Size(9) float[] rhs) {
float[] r = new float[9];
r[0] = lhs[0] * rhs[0] + lhs[3] * rhs[1] + lhs[6] * rhs[2];
r[1] = lhs[1] * rhs[0] + lhs[4] * rhs[1] + lhs[7] * rhs[2];
@@ -3145,19 +3148,35 @@ public abstract class ColorSpace {
float max,
@IntRange(from = MIN_ID, to = MAX_ID) int id) {
if (id == 0) return true;
- if (!compare(primaries, SRGB_PRIMARIES)) {
+ if (!ColorSpace.compare(primaries, SRGB_PRIMARIES)) {
return false;
}
- if (!compare(whitePoint, ILLUMINANT_D65)) {
+ if (!ColorSpace.compare(whitePoint, ILLUMINANT_D65)) {
return false;
}
- if (OETF.applyAsDouble(0.5) < 0.5001) return false;
- if (EOTF.applyAsDouble(0.5) > 0.5001) return false;
+
if (min != 0.0f) return false;
if (max != 1.0f) return false;
+
+ // We would have already returned true if this was SRGB itself, so
+ // it is safe to reference it here.
+ ColorSpace.Rgb srgb = (ColorSpace.Rgb) get(Named.SRGB);
+
+ for (double x = 0.0; x <= 1.0; x += 1 / 255.0) {
+ if (!compare(x, OETF, srgb.mOetf)) return false;
+ if (!compare(x, EOTF, srgb.mEotf)) return false;
+ }
+
return true;
}
+ private static boolean compare(double point, @NonNull DoubleUnaryOperator a,
+ @NonNull DoubleUnaryOperator b) {
+ double rA = a.applyAsDouble(point);
+ double rB = b.applyAsDouble(point);
+ return Math.abs(rA - rB) <= 1e-3;
+ }
+
/**
* Computes whether the specified CIE xyY or XYZ primaries (with Y set to 1) form
* a wide color gamut. A color gamut is considered wide if its area is &gt; 90%
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 3342fd22caab..54e1abcaf1b7 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -17,12 +17,14 @@
package android.graphics;
import android.annotation.ColorInt;
+import android.annotation.ColorLong;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Px;
import android.annotation.Size;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.graphics.fonts.FontVariationAxis;
import android.os.Build;
@@ -66,26 +68,27 @@ public class Paint {
Paint.class.getClassLoader(), nGetNativeFinalizer(), NATIVE_PAINT_SIZE);
}
- private ColorFilter mColorFilter;
- private MaskFilter mMaskFilter;
- private PathEffect mPathEffect;
- private Shader mShader;
+ @ColorLong private long mColor;
+ private ColorFilter mColorFilter;
+ private MaskFilter mMaskFilter;
+ private PathEffect mPathEffect;
+ private Shader mShader;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
- private Typeface mTypeface;
- private Xfermode mXfermode;
+ private Typeface mTypeface;
+ private Xfermode mXfermode;
- private boolean mHasCompatScaling;
- private float mCompatScaling;
- private float mInvCompatScaling;
+ private boolean mHasCompatScaling;
+ private float mCompatScaling;
+ private float mInvCompatScaling;
- private LocaleList mLocales;
- private String mFontFeatureSettings;
- private String mFontVariationSettings;
+ private LocaleList mLocales;
+ private String mFontFeatureSettings;
+ private String mFontVariationSettings;
- private float mShadowLayerRadius;
- private float mShadowLayerDx;
- private float mShadowLayerDy;
- private int mShadowLayerColor;
+ private float mShadowLayerRadius;
+ private float mShadowLayerDx;
+ private float mShadowLayerDy;
+ @ColorLong private long mShadowLayerColor;
private static final Object sCacheLock = new Object();
@@ -503,6 +506,7 @@ public class Paint {
// ? HINTING_OFF : HINTING_ON);
mCompatScaling = mInvCompatScaling = 1;
setTextLocales(LocaleList.getAdjustedDefault());
+ mColor = Color.pack(Color.BLACK);
}
/**
@@ -528,6 +532,7 @@ public class Paint {
// setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
// ? HINTING_OFF : HINTING_ON);
+ mColor = Color.pack(Color.BLACK);
mColorFilter = null;
mMaskFilter = null;
mPathEffect = null;
@@ -549,7 +554,7 @@ public class Paint {
mShadowLayerRadius = 0.0f;
mShadowLayerDx = 0.0f;
mShadowLayerDy = 0.0f;
- mShadowLayerColor = 0;
+ mShadowLayerColor = Color.pack(0);
}
/**
@@ -570,6 +575,7 @@ public class Paint {
* {@link Paint}.
*/
private void setClassVariablesFrom(Paint paint) {
+ mColor = paint.mColor;
mColorFilter = paint.mColorFilter;
mMaskFilter = paint.mMaskFilter;
mPathEffect = paint.mPathEffect;
@@ -947,7 +953,7 @@ public class Paint {
}
/**
- * Return the paint's color. Note that the color is a 32bit value
+ * Return the paint's color in sRGB. Note that the color is a 32bit value
* containing alpha as well as r,g,b. This 32bit value is not premultiplied,
* meaning that its alpha can be any value, regardless of the values of
* r,g,b. See the Color class for more details.
@@ -956,7 +962,25 @@ public class Paint {
*/
@ColorInt
public int getColor() {
- return nGetColor(mNativePaint);
+ return Color.toArgb(mColor);
+ }
+
+ /**
+ * Return the paint's color. Note that the color is a long with an encoded
+ * {@link ColorSpace} as well as alpha and r,g,b. These values are not
+ * premultiplied, meaning that alpha can be any value, regardless of the
+ * values of r,g,b. See the {@link Color} class for more details.
+ *
+ * @see Color for APIs that help manipulate a color long.
+ *
+ * @return the paint's color (and alpha).
+ *
+ * @hide pending API approval
+ */
+ @TestApi
+ @ColorLong
+ public long getColorLong() {
+ return mColor;
}
/**
@@ -968,7 +992,33 @@ public class Paint {
* @param color The new color (including alpha) to set in the paint.
*/
public void setColor(@ColorInt int color) {
- nSetColor(mNativePaint, color);
+ setColor(Color.pack(color));
+ }
+
+ /**
+ * Set the paint's color with a {@link ColorLong}. Note that the color is
+ * a long with an encoded {@link ColorSpace} as well as alpha and r,g,b.
+ * These values are not premultiplied, meaning that alpha can be any value,
+ * regardless of the values of r,g,b. See the {@link Color} class for more
+ * details.
+ *
+ * @param color The new color (including alpha and {@link ColorSpace})
+ * to set in the paint.
+ * @throws IllegalArgumentException if the color space encoded in the long
+ * is invalid or unknown.
+ *
+ * @hide pending API approval
+ */
+ @TestApi
+ public void setColor(@ColorLong long color) {
+ ColorSpace cs = Color.colorSpace(color);
+ float r = Color.red(color);
+ float g = Color.green(color);
+ float b = Color.blue(color);
+ float a = Color.alpha(color);
+
+ nSetColor(mNativePaint, cs, r, g, b, a);
+ mColor = color;
}
/**
@@ -979,7 +1029,7 @@ public class Paint {
* @return the alpha component of the paint's color.
*/
public int getAlpha() {
- return nGetAlpha(mNativePaint);
+ return Math.round(Color.alpha(mColor) * 255.0f);
}
/**
@@ -990,6 +1040,13 @@ public class Paint {
* @param a set the alpha component [0..255] of the paint's color.
*/
public void setAlpha(int a) {
+ // FIXME: No need to unpack this. Instead, just update the alpha bits.
+ // b/122959599
+ ColorSpace cs = Color.colorSpace(mColor);
+ float r = Color.red(mColor);
+ float g = Color.green(mColor);
+ float b = Color.blue(mColor);
+ mColor = Color.pack(r, g, b, a * (1.0f / 255), cs);
nSetAlpha(mNativePaint, a);
}
@@ -1370,12 +1427,40 @@ public class Paint {
* The alpha of the shadow will be the paint's alpha if the shadow color is
* opaque, or the alpha from the shadow color if not.
*/
- public void setShadowLayer(float radius, float dx, float dy, int shadowColor) {
- mShadowLayerRadius = radius;
- mShadowLayerDx = dx;
- mShadowLayerDy = dy;
- mShadowLayerColor = shadowColor;
- nSetShadowLayer(mNativePaint, radius, dx, dy, shadowColor);
+ public void setShadowLayer(float radius, float dx, float dy, @ColorInt int shadowColor) {
+ setShadowLayer(radius, dx, dy, Color.pack(shadowColor));
+ }
+
+ /**
+ * This draws a shadow layer below the main layer, with the specified
+ * offset and color, and blur radius. If radius is 0, then the shadow
+ * layer is removed.
+ * <p>
+ * Can be used to create a blurred shadow underneath text. Support for use
+ * with other drawing operations is constrained to the software rendering
+ * pipeline.
+ * <p>
+ * The alpha of the shadow will be the paint's alpha if the shadow color is
+ * opaque, or the alpha from the shadow color if not.
+ *
+ * @throws IllegalArgumentException if the color space encoded in the long
+ * is invalid or unknown.
+ *
+ * @hide pending API approval
+ */
+ @TestApi
+ public void setShadowLayer(float radius, float dx, float dy, @ColorLong long shadowColor) {
+ ColorSpace cs = Color.colorSpace(shadowColor);
+ float r = Color.red(shadowColor);
+ float g = Color.green(shadowColor);
+ float b = Color.blue(shadowColor);
+ float a = Color.alpha(shadowColor);
+ nSetShadowLayer(mNativePaint, radius, dx, dy, cs, r, g, b, a);
+
+ mShadowLayerRadius = radius;
+ mShadowLayerDx = dx;
+ mShadowLayerDy = dy;
+ mShadowLayerColor = shadowColor;
}
/**
@@ -1422,8 +1507,20 @@ public class Paint {
/**
* Returns the color of the shadow layer.
* @see #setShadowLayer(float,float,float,int)
+ * @see #setShadowLayer(float,float,float,long)
*/
public @ColorInt int getShadowLayerColor() {
+ return Color.toArgb(mShadowLayerColor);
+ }
+
+ /**
+ * Returns the color of the shadow layer.
+ * @see #setShadowLayer(float,float,float,int)
+ * @see #setShadowLayer(float,float,float,long)
+ * @hide pending API approval
+ */
+ @TestApi
+ public @ColorLong long getShadowLayerColorLong() {
return mShadowLayerColor;
}
@@ -2906,6 +3003,11 @@ public class Paint {
int contextStart, int contextEnd, boolean isRtl, int offset);
private static native int nGetOffsetForAdvance(long paintPtr, char[] text, int start, int end,
int contextStart, int contextEnd, boolean isRtl, float advance);
+ private static native void nSetColor(long paintPtr, ColorSpace cs,
+ float r, float g, float b, float a);
+ private static native void nSetShadowLayer(long paintPtr,
+ float radius, float dx, float dy, ColorSpace cs,
+ float r, float g, float b, float a);
// ---------------- @FastNative ------------------------
@@ -2961,7 +3063,7 @@ public class Paint {
int mMinikinLocaleListId);
@CriticalNative
private static native void nSetShadowLayer(long paintPtr,
- float radius, float dx, float dy, int color);
+ float radius, float dx, float dy, @ColorInt int color);
@CriticalNative
private static native boolean nHasShadowLayer(long paintPtr);
@CriticalNative
@@ -3009,12 +3111,6 @@ public class Paint {
@CriticalNative
private static native void nSetFilterBitmap(long paintPtr, boolean filter);
@CriticalNative
- private static native int nGetColor(long paintPtr);
- @CriticalNative
- private static native void nSetColor(long paintPtr, @ColorInt int color);
- @CriticalNative
- private static native int nGetAlpha(long paintPtr);
- @CriticalNative
private static native void nSetStrikeThruText(long paintPtr, boolean strikeThruText);
@CriticalNative
private static native boolean nIsElegantTextHeight(long paintPtr);
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 9b86b77a9384..25f6775f81b4 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -1075,6 +1075,11 @@ public class Typeface {
continue; // If alias and named family are conflict, use named family.
}
final Typeface base = systemFontMap.get(alias.getToName());
+ if (base == null) {
+ // The missing target is a valid thing, some configuration don't have font files,
+ // e.g. wear devices. Just skip this alias.
+ continue;
+ }
final int weight = alias.getWeight();
final Typeface newFace = weight == 400 ? base :
new Typeface(nativeCreateWeightAlias(base.native_instance, weight));
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index ad9ec02648b1..3c35d9b33fc8 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -20,8 +20,9 @@
#include <algorithm>
#include <iterator>
-#include <set>
#include <map>
+#include <set>
+#include <sstream>
#include "android-base/logging.h"
#include "android-base/stringprintf.h"
@@ -372,6 +373,9 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
uint32_t best_offset = 0u;
uint32_t type_flags = 0u;
+ Resolution::Step::Type resolution_type;
+ std::vector<Resolution::Step> resolution_steps;
+
// If desired_config is the same as the set configuration, then we can use our filtered list
// and we don't need to match the configurations, since they already matched.
const bool use_fast_path = desired_config == &configuration_;
@@ -403,8 +407,8 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
// If the package is an overlay, then even configurations that are the same MUST be chosen.
const bool package_is_overlay = loaded_package->IsOverlay();
- const FilteredConfigGroup& filtered_group = loaded_package_impl.filtered_configs_[type_idx];
if (use_fast_path) {
+ const FilteredConfigGroup& filtered_group = loaded_package_impl.filtered_configs_[type_idx];
const std::vector<ResTable_config>& candidate_configs = filtered_group.configurations;
const size_t type_count = candidate_configs.size();
for (uint32_t i = 0; i < type_count; i++) {
@@ -412,21 +416,34 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
// We can skip calling ResTable_config::match() because we know that all candidate
// configurations that do NOT match have been filtered-out.
- if ((best_config == nullptr || this_config.isBetterThan(*best_config, desired_config)) ||
- (package_is_overlay && this_config.compare(*best_config) == 0)) {
- // The configuration matches and is better than the previous selection.
- // Find the entry value if it exists for this configuration.
- const ResTable_type* type_chunk = filtered_group.types[i];
- const uint32_t offset = LoadedPackage::GetEntryOffset(type_chunk, local_entry_idx);
- if (offset == ResTable_type::NO_ENTRY) {
- continue;
- }
+ if (best_config == nullptr) {
+ resolution_type = Resolution::Step::Type::INITIAL;
+ } else if (this_config.isBetterThan(*best_config, desired_config)) {
+ resolution_type = Resolution::Step::Type::BETTER_MATCH;
+ } else if (package_is_overlay && this_config.compare(*best_config) == 0) {
+ resolution_type = Resolution::Step::Type::OVERLAID;
+ } else {
+ continue;
+ }
+
+ // The configuration matches and is better than the previous selection.
+ // Find the entry value if it exists for this configuration.
+ const ResTable_type* type = filtered_group.types[i];
+ const uint32_t offset = LoadedPackage::GetEntryOffset(type, local_entry_idx);
+ if (offset == ResTable_type::NO_ENTRY) {
+ continue;
+ }
- best_cookie = cookie;
- best_package = loaded_package;
- best_type = type_chunk;
- best_config = &this_config;
- best_offset = offset;
+ best_cookie = cookie;
+ best_package = loaded_package;
+ best_type = type;
+ best_config = &this_config;
+ best_offset = offset;
+
+ if (resource_resolution_logging_enabled_) {
+ resolution_steps.push_back(Resolution::Step{resolution_type,
+ this_config.toString(),
+ &loaded_package->GetPackageName()});
}
}
} else {
@@ -440,23 +457,38 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
ResTable_config this_config;
this_config.copyFromDtoH((*iter)->config);
- if (this_config.match(*desired_config)) {
- if ((best_config == nullptr || this_config.isBetterThan(*best_config, desired_config)) ||
- (package_is_overlay && this_config.compare(*best_config) == 0)) {
- // The configuration matches and is better than the previous selection.
- // Find the entry value if it exists for this configuration.
- const uint32_t offset = LoadedPackage::GetEntryOffset(*iter, local_entry_idx);
- if (offset == ResTable_type::NO_ENTRY) {
- continue;
- }
+ if (!this_config.match(*desired_config)) {
+ continue;
+ }
- best_cookie = cookie;
- best_package = loaded_package;
- best_type = *iter;
- best_config_copy = this_config;
- best_config = &best_config_copy;
- best_offset = offset;
- }
+ if (best_config == nullptr) {
+ resolution_type = Resolution::Step::Type::INITIAL;
+ } else if (this_config.isBetterThan(*best_config, desired_config)) {
+ resolution_type = Resolution::Step::Type::BETTER_MATCH;
+ } else if (package_is_overlay && this_config.compare(*best_config) == 0) {
+ resolution_type = Resolution::Step::Type::OVERLAID;
+ } else {
+ continue;
+ }
+
+ // The configuration matches and is better than the previous selection.
+ // Find the entry value if it exists for this configuration.
+ const uint32_t offset = LoadedPackage::GetEntryOffset(*iter, local_entry_idx);
+ if (offset == ResTable_type::NO_ENTRY) {
+ continue;
+ }
+
+ best_cookie = cookie;
+ best_package = loaded_package;
+ best_type = *iter;
+ best_config_copy = this_config;
+ best_config = &best_config_copy;
+ best_offset = offset;
+
+ if (resource_resolution_logging_enabled_) {
+ resolution_steps.push_back(Resolution::Step{resolution_type,
+ this_config.toString(),
+ &loaded_package->GetPackageName()});
}
}
}
@@ -478,9 +510,95 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
out_entry->entry_string_ref =
StringPoolRef(best_package->GetKeyStringPool(), best_entry->key.index);
out_entry->dynamic_ref_table = &package_group.dynamic_ref_table;
+
+ if (resource_resolution_logging_enabled_) {
+ last_resolution.resid = resid;
+ last_resolution.cookie = best_cookie;
+ last_resolution.steps = resolution_steps;
+
+ // Cache only the type/entry refs since that's all that's needed to build name
+ last_resolution.type_string_ref =
+ StringPoolRef(best_package->GetTypeStringPool(), best_type->id - 1);
+ last_resolution.entry_string_ref =
+ StringPoolRef(best_package->GetKeyStringPool(), best_entry->key.index);
+ }
+
return best_cookie;
}
+void AssetManager2::SetResourceResolutionLoggingEnabled(bool enabled) {
+ resource_resolution_logging_enabled_ = enabled;
+
+ if (!enabled) {
+ last_resolution.cookie = kInvalidCookie;
+ last_resolution.resid = 0;
+ last_resolution.steps.clear();
+ last_resolution.type_string_ref = StringPoolRef();
+ last_resolution.entry_string_ref = StringPoolRef();
+ }
+}
+
+std::string AssetManager2::GetLastResourceResolution() const {
+ if (!resource_resolution_logging_enabled_) {
+ LOG(ERROR) << "Must enable resource resolution logging before getting path.";
+ return std::string();
+ }
+
+ auto cookie = last_resolution.cookie;
+ if (cookie == kInvalidCookie) {
+ LOG(ERROR) << "AssetManager hasn't resolved a resource to read resolution path.";
+ return std::string();
+ }
+
+ uint32_t resid = last_resolution.resid;
+ std::vector<Resolution::Step>& steps = last_resolution.steps;
+
+ ResourceName resource_name;
+ std::string resource_name_string;
+
+ const LoadedPackage* package =
+ apk_assets_[cookie]->GetLoadedArsc()->GetPackageById(get_package_id(resid));
+
+ if (package != nullptr) {
+ ToResourceName(last_resolution.type_string_ref,
+ last_resolution.entry_string_ref,
+ package,
+ &resource_name);
+ resource_name_string = ToFormattedResourceString(&resource_name);
+ }
+
+ std::stringstream log_stream;
+ log_stream << base::StringPrintf("Resolution for 0x%08x ", resid)
+ << resource_name_string
+ << "\n\tFor config -"
+ << configuration_.toString();
+
+ std::string prefix;
+ for (Resolution::Step step : steps) {
+ switch (step.type) {
+ case Resolution::Step::Type::INITIAL:
+ prefix = "Found initial";
+ break;
+ case Resolution::Step::Type::BETTER_MATCH:
+ prefix = "Found better";
+ break;
+ case Resolution::Step::Type::OVERLAID:
+ prefix = "Overlaid";
+ break;
+ }
+
+ if (!prefix.empty()) {
+ log_stream << "\n\t" << prefix << ": " << *step.package_name;
+
+ if (!step.config_name.isEmpty()) {
+ log_stream << " -" << step.config_name;
+ }
+ }
+ }
+
+ return log_stream.str();
+}
+
bool AssetManager2::GetResourceName(uint32_t resid, ResourceName* out_name) const {
FindEntryResult entry;
ApkAssetsCookie cookie =
@@ -495,27 +613,10 @@ bool AssetManager2::GetResourceName(uint32_t resid, ResourceName* out_name) cons
return false;
}
- out_name->package = package->GetPackageName().data();
- out_name->package_len = package->GetPackageName().size();
-
- out_name->type = entry.type_string_ref.string8(&out_name->type_len);
- out_name->type16 = nullptr;
- if (out_name->type == nullptr) {
- out_name->type16 = entry.type_string_ref.string16(&out_name->type_len);
- if (out_name->type16 == nullptr) {
- return false;
- }
- }
-
- out_name->entry = entry.entry_string_ref.string8(&out_name->entry_len);
- out_name->entry16 = nullptr;
- if (out_name->entry == nullptr) {
- out_name->entry16 = entry.entry_string_ref.string16(&out_name->entry_len);
- if (out_name->entry16 == nullptr) {
- return false;
- }
- }
- return true;
+ return ToResourceName(entry.type_string_ref,
+ entry.entry_string_ref,
+ package,
+ out_name);
}
bool AssetManager2::GetResourceFlags(uint32_t resid, uint32_t* out_flags) const {
diff --git a/libs/androidfw/AttributeResolution.cpp b/libs/androidfw/AttributeResolution.cpp
index 57e3491895e6..18d74efdbacf 100644
--- a/libs/androidfw/AttributeResolution.cpp
+++ b/libs/androidfw/AttributeResolution.cpp
@@ -51,7 +51,7 @@ class XmlAttributeFinder
class BagAttributeFinder
: public BackTrackingAttributeFinder<BagAttributeFinder, const ResolvedBag::Entry*> {
public:
- BagAttributeFinder(const ResolvedBag* bag)
+ explicit BagAttributeFinder(const ResolvedBag* bag)
: BackTrackingAttributeFinder(bag != nullptr ? bag->entries : nullptr,
bag != nullptr ? bag->entries + bag->entry_count : nullptr) {
}
@@ -286,6 +286,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr,
value.dataType = Res_value::TYPE_NULL;
value.data = Res_value::DATA_NULL_UNDEFINED;
config.density = 0;
+ uint32_t source_style_resid = 0;
// Try to find a value for this attribute... we prioritize values
// coming from, first XML attributes, then XML style, then default
@@ -309,6 +310,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr,
cookie = entry->cookie;
type_set_flags = style_flags;
value = entry->value;
+ source_style_resid = entry->style;
if (kDebugStyles) {
ALOGI("-> From style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data,
entry->style);
@@ -325,8 +327,10 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr,
type_set_flags = def_style_flags;
value = entry->value;
if (kDebugStyles) {
- ALOGI("-> From def style: type=0x%x, data=0x%08x", value.dataType, value.data);
+ ALOGI("-> From def style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data,
+ entry->style);
}
+ source_style_resid = entry->style;
}
}
@@ -382,6 +386,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr,
out_values[STYLE_RESOURCE_ID] = resid;
out_values[STYLE_CHANGING_CONFIGURATIONS] = type_set_flags;
out_values[STYLE_DENSITY] = config.density;
+ out_values[SYTLE_SOURCE_STYLE] = source_style_resid;
if (value.dataType != Res_value::TYPE_NULL || value.data == Res_value::DATA_NULL_EMPTY) {
indices_idx++;
diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp
index 5694115f61aa..a99e77f8dbb9 100644
--- a/libs/androidfw/CursorWindow.cpp
+++ b/libs/androidfw/CursorWindow.cpp
@@ -94,7 +94,7 @@ status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outCursor
if (size < 0) {
result = UNKNOWN_ERROR;
} else {
- int dupAshmemFd = ::dup(ashmemFd);
+ int dupAshmemFd = ::fcntl(ashmemFd, F_DUPFD_CLOEXEC, 0);
if (dupAshmemFd < 0) {
result = -errno;
} else {
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp
index 5a267804ddf1..70ce9bc705ef 100644
--- a/libs/androidfw/LoadedArsc.cpp
+++ b/libs/androidfw/LoadedArsc.cpp
@@ -593,7 +593,12 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
return {};
}
- // Iterate over the overlayable policy chunks
+ std::string name;
+ util::ReadUtf16StringFromDevice(header->name, arraysize(header->name), &name);
+ std::string actor;
+ util::ReadUtf16StringFromDevice(header->actor, arraysize(header->actor), &actor);
+
+ // Iterate over the overlayable policy chunks contained within the overlayable chunk data
ChunkIterator overlayable_iter(child_chunk.data_ptr(), child_chunk.data_size());
while (overlayable_iter.HasNext()) {
const Chunk overlayable_child_chunk = overlayable_iter.Next();
@@ -613,7 +618,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
return {};
}
- // Retrieve all the ids belonging to this policy
+ // Retrieve all the resource ids belonging to this policy chunk
std::unordered_set<uint32_t> ids;
const auto ids_begin =
reinterpret_cast<const ResTable_ref*>(overlayable_child_chunk.data_ptr());
@@ -622,8 +627,10 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
ids.insert(dtohl(id_iter->ident));
}
- // Add the pairing of overlayable properties to resource ids to the package
+ // Add the pairing of overlayable properties and resource ids to the package
OverlayableInfo overlayable_info{};
+ overlayable_info.name = name;
+ overlayable_info.actor = actor;
overlayable_info.policy_flags = policy_header->policy_flags;
loaded_package->overlayable_infos_.push_back(std::make_pair(overlayable_info, ids));
break;
@@ -636,7 +643,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
}
if (overlayable_iter.HadError()) {
- LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_POLICY_TYPE: %s",
+ LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_TYPE: %s",
overlayable_iter.GetLastError().c_str());
if (overlayable_iter.HadFatalError()) {
return {};
diff --git a/libs/androidfw/ResourceUtils.cpp b/libs/androidfw/ResourceUtils.cpp
index d63feb01ef83..645984d85c34 100644
--- a/libs/androidfw/ResourceUtils.cpp
+++ b/libs/androidfw/ResourceUtils.cpp
@@ -48,4 +48,65 @@ bool ExtractResourceName(const StringPiece& str, StringPiece* out_package, Strin
!(has_type_separator && out_type->empty());
}
+bool ToResourceName(StringPoolRef& type_string_ref,
+ StringPoolRef& entry_string_ref,
+ const LoadedPackage* package,
+ AssetManager2::ResourceName* out_name) {
+ out_name->package = package->GetPackageName().data();
+ out_name->package_len = package->GetPackageName().size();
+
+ out_name->type = type_string_ref.string8(&out_name->type_len);
+ out_name->type16 = nullptr;
+ if (out_name->type == nullptr) {
+ out_name->type16 = type_string_ref.string16(&out_name->type_len);
+ if (out_name->type16 == nullptr) {
+ return false;
+ }
+ }
+
+ out_name->entry = entry_string_ref.string8(&out_name->entry_len);
+ out_name->entry16 = nullptr;
+ if (out_name->entry == nullptr) {
+ out_name->entry16 = entry_string_ref.string16(&out_name->entry_len);
+ if (out_name->entry16 == nullptr) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+std::string ToFormattedResourceString(AssetManager2::ResourceName* resource_name) {
+ std::string result;
+ if (resource_name->package != nullptr) {
+ result.append(resource_name->package, resource_name->package_len);
+ }
+
+ if (resource_name->type != nullptr || resource_name->type16 != nullptr) {
+ if (!result.empty()) {
+ result += ":";
+ }
+
+ if (resource_name->type != nullptr) {
+ result.append(resource_name->type, resource_name->type_len);
+ } else {
+ result += util::Utf16ToUtf8(StringPiece16(resource_name->type16, resource_name->type_len));
+ }
+ }
+
+ if (resource_name->entry != nullptr || resource_name->entry16 != nullptr) {
+ if (!result.empty()) {
+ result += "/";
+ }
+
+ if (resource_name->entry != nullptr) {
+ result.append(resource_name->entry, resource_name->entry_len);
+ } else {
+ result += util::Utf16ToUtf8(StringPiece16(resource_name->entry16, resource_name->entry_len));
+ }
+ }
+
+ return result;
+}
+
} // namespace android
diff --git a/libs/androidfw/ZipUtils.cpp b/libs/androidfw/ZipUtils.cpp
index 5d243da2097c..5be2105fe404 100644
--- a/libs/androidfw/ZipUtils.cpp
+++ b/libs/androidfw/ZipUtils.cpp
@@ -37,7 +37,7 @@ using namespace android;
// TODO: This can go away once the only remaining usage in aapt goes away.
class FileReader : public zip_archive::Reader {
public:
- FileReader(FILE* fp) : Reader(), mFp(fp), mCurrentOffset(0) {
+ explicit FileReader(FILE* fp) : Reader(), mFp(fp), mCurrentOffset(0) {
}
bool ReadAtOffset(uint8_t* buf, size_t len, uint32_t offset) const {
diff --git a/libs/androidfw/include/androidfw/AssetDir.h b/libs/androidfw/include/androidfw/AssetDir.h
index 7aef02dc4133..ce6e066d6a16 100644
--- a/libs/androidfw/include/androidfw/AssetDir.h
+++ b/libs/androidfw/include/androidfw/AssetDir.h
@@ -78,7 +78,7 @@ private:
class FileInfo {
public:
FileInfo(void) {}
- FileInfo(const String8& path) // useful for e.g. svect.indexOf
+ explicit FileInfo(const String8& path) // useful for e.g. svect.indexOf
: mFileName(path), mFileType(kFileTypeUnknown)
{}
~FileInfo(void) {}
diff --git a/libs/androidfw/include/androidfw/AssetManager2.h b/libs/androidfw/include/androidfw/AssetManager2.h
index 0d492984d41d..f29769b834d1 100644
--- a/libs/androidfw/include/androidfw/AssetManager2.h
+++ b/libs/androidfw/include/androidfw/AssetManager2.h
@@ -229,6 +229,14 @@ class AssetManager2 {
ResTable_config* in_out_selected_config, uint32_t* in_out_flags,
uint32_t* out_last_reference) const;
+ // Enables or disables resource resolution logging. Clears stored steps when
+ // disabled.
+ void SetResourceResolutionLoggingEnabled(bool enabled);
+
+ // Returns formatted log of last resource resolution path, or empty if no
+ // resource has been resolved yet.
+ std::string GetLastResourceResolution() const;
+
// Retrieves the best matching bag/map resource with ID `resid`.
// This method will resolve all parent references for this bag and merge keys with the child.
// To iterate over the keys, use the following idiom:
@@ -346,6 +354,48 @@ class AssetManager2 {
// Cached set of bags. These are cached because they can inherit keys from parent bags,
// which involves some calculation.
std::unordered_map<uint32_t, util::unique_cptr<ResolvedBag>> cached_bags_;
+
+ // Whether or not to save resource resolution steps
+ bool resource_resolution_logging_enabled_ = false;
+
+ struct Resolution {
+
+ struct Step {
+
+ enum class Type {
+ INITIAL,
+ BETTER_MATCH,
+ OVERLAID
+ };
+
+ // Marks what kind of override this step was.
+ Type type;
+
+ // Built name of configuration for this step.
+ String8 config_name;
+
+ // Marks the package name of the better resource found in this step.
+ const std::string* package_name;
+ };
+
+ // Last resolved resource ID.
+ uint32_t resid;
+
+ // Last resolved resource result cookie.
+ ApkAssetsCookie cookie = kInvalidCookie;
+
+ // Last resolved resource type.
+ StringPoolRef type_string_ref;
+
+ // Last resolved resource entry.
+ StringPoolRef entry_string_ref;
+
+ // Steps taken to resolve last resource.
+ std::vector<Step> steps;
+ };
+
+ // Record of the last resolved resource's resolution path.
+ mutable Resolution last_resolution;
};
class Theme {
diff --git a/libs/androidfw/include/androidfw/AttributeResolution.h b/libs/androidfw/include/androidfw/AttributeResolution.h
index 35ef98d8c704..c88004c70687 100644
--- a/libs/androidfw/include/androidfw/AttributeResolution.h
+++ b/libs/androidfw/include/androidfw/AttributeResolution.h
@@ -23,15 +23,17 @@
namespace android {
// Offsets into the outValues array populated by the methods below. outValues is a uint32_t
-// array, but each logical element takes up 6 uint32_t-sized physical elements.
+// array, but each logical element takes up 7 uint32_t-sized physical elements.
+// Keep these in sync with android.content.res.TypedArray java class
enum {
- STYLE_NUM_ENTRIES = 6,
+ STYLE_NUM_ENTRIES = 7,
STYLE_TYPE = 0,
STYLE_DATA = 1,
STYLE_ASSET_COOKIE = 2,
STYLE_RESOURCE_ID = 3,
STYLE_CHANGING_CONFIGURATIONS = 4,
- STYLE_DENSITY = 5
+ STYLE_DENSITY = 5,
+ SYTLE_SOURCE_STYLE = 6
};
// These are all variations of the same method. They each perform the exact same operation,
diff --git a/libs/androidfw/include/androidfw/BackupHelpers.h b/libs/androidfw/include/androidfw/BackupHelpers.h
index fc1ad4717c16..2da247b77c0a 100644
--- a/libs/androidfw/include/androidfw/BackupHelpers.h
+++ b/libs/androidfw/include/androidfw/BackupHelpers.h
@@ -67,7 +67,7 @@ struct FileRec {
class BackupDataWriter
{
public:
- BackupDataWriter(int fd);
+ explicit BackupDataWriter(int fd);
// does not close fd
~BackupDataWriter();
@@ -104,7 +104,7 @@ private:
class BackupDataReader
{
public:
- BackupDataReader(int fd);
+ explicit BackupDataReader(int fd);
// does not close fd
~BackupDataReader();
diff --git a/libs/androidfw/include/androidfw/ConfigDescription.h b/libs/androidfw/include/androidfw/ConfigDescription.h
index 29424c4462aa..6fa089aeb12c 100644
--- a/libs/androidfw/include/androidfw/ConfigDescription.h
+++ b/libs/androidfw/include/androidfw/ConfigDescription.h
@@ -82,7 +82,7 @@ struct ConfigDescription : public ResTable_config {
static void ApplyVersionForCompatibility(ConfigDescription* config);
ConfigDescription();
- ConfigDescription(const android::ResTable_config& o); // NOLINT(implicit)
+ ConfigDescription(const android::ResTable_config& o); // NOLINT(google-explicit-constructor)
ConfigDescription(const ConfigDescription& o);
ConfigDescription(ConfigDescription&& o) noexcept;
diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
index e1dfb9490c60..bf35aa3c15bb 100644
--- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
+++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
@@ -22,7 +22,7 @@ namespace android {
class DisplayEventDispatcher : public LooperCallback {
public:
- DisplayEventDispatcher(const sp<Looper>& looper,
+ explicit DisplayEventDispatcher(const sp<Looper>& looper,
ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp);
status_t initialize();
diff --git a/libs/androidfw/include/androidfw/LoadedArsc.h b/libs/androidfw/include/androidfw/LoadedArsc.h
index 8c5c3b7d3858..be62f30617bf 100644
--- a/libs/androidfw/include/androidfw/LoadedArsc.h
+++ b/libs/androidfw/include/androidfw/LoadedArsc.h
@@ -78,6 +78,8 @@ struct TypeSpec {
using TypeSpecPtr = util::unique_cptr<TypeSpec>;
struct OverlayableInfo {
+ std::string name;
+ std::string actor;
uint32_t policy_flags;
};
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index cf2d8fb3251c..1655e89a9b97 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -693,7 +693,7 @@ class ResXMLTree;
class ResXMLParser
{
public:
- ResXMLParser(const ResXMLTree& tree);
+ explicit ResXMLParser(const ResXMLTree& tree);
enum event_code_t {
BAD_DOCUMENT = -1,
@@ -806,7 +806,7 @@ public:
* The tree stores a clone of the specified DynamicRefTable, so any changes to the original
* DynamicRefTable will not affect this tree after instantiation.
**/
- ResXMLTree(const DynamicRefTable* dynamicRefTable);
+ explicit ResXMLTree(const DynamicRefTable* dynamicRefTable);
ResXMLTree();
~ResXMLTree();
@@ -1611,6 +1611,12 @@ struct ResTable_lib_entry
struct ResTable_overlayable_header
{
struct ResChunk_header header;
+
+ // The name of the overlayable set of resources that overlays target.
+ uint16_t name[256];
+
+ // The component responsible for enabling and disabling overlays targeting this chunk.
+ uint16_t actor[256];
};
/**
@@ -1637,10 +1643,6 @@ struct ResTable_overlayable_policy_header
// The overlay must reside of the product partition or must have existed on the product
// partition before an upgrade to overlay these resources.
POLICY_PRODUCT_PARTITION = 0x00000008,
-
- // The overlay must reside of the product services partition or must have existed on the product
- // services partition before an upgrade to overlay these resources.
- POLICY_PRODUCT_SERVICES_PARTITION = 0x00000010,
};
uint32_t policy_flags;
@@ -1844,7 +1846,7 @@ public:
class Theme {
public:
- Theme(const ResTable& table);
+ explicit Theme(const ResTable& table);
~Theme();
inline const ResTable& getResTable() const { return mTable; }
diff --git a/libs/androidfw/include/androidfw/ResourceUtils.h b/libs/androidfw/include/androidfw/ResourceUtils.h
index d94779bf5225..eb6eb8e66175 100644
--- a/libs/androidfw/include/androidfw/ResourceUtils.h
+++ b/libs/androidfw/include/androidfw/ResourceUtils.h
@@ -17,6 +17,7 @@
#ifndef ANDROIDFW_RESOURCEUTILS_H
#define ANDROIDFW_RESOURCEUTILS_H
+#include "androidfw/AssetManager2.h"
#include "androidfw/StringPiece.h"
namespace android {
@@ -27,6 +28,17 @@ namespace android {
bool ExtractResourceName(const StringPiece& str, StringPiece* out_package, StringPiece* out_type,
StringPiece* out_entry);
+// Convert a type_string_ref, entry_string_ref, and package
+// to AssetManager2::ResourceName. Useful for getting
+// resource name without re-running AssetManager2::FindEntry searches.
+bool ToResourceName(StringPoolRef& type_string_ref,
+ StringPoolRef& entry_string_ref,
+ const LoadedPackage* package,
+ AssetManager2::ResourceName* out_name);
+
+// Formats a ResourceName to "package:type/entry_name".
+std::string ToFormattedResourceString(AssetManager2::ResourceName* resource_name);
+
inline uint32_t fix_package_id(uint32_t resid, uint8_t package_id) {
return (resid & 0x00ffffffu) | (static_cast<uint32_t>(package_id) << 24);
}
diff --git a/libs/androidfw/include/androidfw/StringPiece.h b/libs/androidfw/include/androidfw/StringPiece.h
index a33865f4d34f..921877dc4982 100644
--- a/libs/androidfw/include/androidfw/StringPiece.h
+++ b/libs/androidfw/include/androidfw/StringPiece.h
@@ -52,8 +52,8 @@ class BasicStringPiece {
BasicStringPiece();
BasicStringPiece(const BasicStringPiece<TChar>& str);
- BasicStringPiece(const std::basic_string<TChar>& str); // NOLINT(implicit)
- BasicStringPiece(const TChar* str); // NOLINT(implicit)
+ BasicStringPiece(const std::basic_string<TChar>& str); // NOLINT(google-explicit-constructor)
+ BasicStringPiece(const TChar* str); // NOLINT(google-explicit-constructor)
BasicStringPiece(const TChar* str, size_t len);
BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs);
diff --git a/libs/androidfw/include/androidfw/TypeWrappers.h b/libs/androidfw/include/androidfw/TypeWrappers.h
index 5cfe54e5759d..fb2fad619011 100644
--- a/libs/androidfw/include/androidfw/TypeWrappers.h
+++ b/libs/androidfw/include/androidfw/TypeWrappers.h
@@ -23,7 +23,7 @@
namespace android {
struct TypeVariant {
- TypeVariant(const ResTable_type* data);
+ explicit TypeVariant(const ResTable_type* data);
class iterator {
public:
diff --git a/libs/androidfw/include/androidfw/Util.h b/libs/androidfw/include/androidfw/Util.h
index 10d088e02829..aa1466fde778 100644
--- a/libs/androidfw/include/androidfw/Util.h
+++ b/libs/androidfw/include/androidfw/Util.h
@@ -46,7 +46,7 @@ class unique_cptr {
using pointer = typename std::add_pointer<T>::type;
constexpr unique_cptr() : ptr_(nullptr) {}
- constexpr unique_cptr(std::nullptr_t) : ptr_(nullptr) {}
+ constexpr explicit unique_cptr(std::nullptr_t) : ptr_(nullptr) {}
explicit unique_cptr(pointer ptr) : ptr_(ptr) {}
unique_cptr(unique_cptr&& o) noexcept : ptr_(o.ptr_) { o.ptr_ = nullptr; }
diff --git a/libs/androidfw/tests/AssetManager2_test.cpp b/libs/androidfw/tests/AssetManager2_test.cpp
index 5449a54d08de..105dcd209bf7 100644
--- a/libs/androidfw/tests/AssetManager2_test.cpp
+++ b/libs/androidfw/tests/AssetManager2_test.cpp
@@ -586,4 +586,111 @@ TEST_F(AssetManager2Test, OpenDirFromManyApks) {
EXPECT_THAT(asset_dir->getFileType(2), Eq(FileType::kFileTypeDirectory));
}
+TEST_F(AssetManager2Test, GetLastPathWithoutEnablingReturnsEmpty) {
+ ResTable_config desired_config;
+
+ AssetManager2 assetmanager;
+ assetmanager.SetConfiguration(desired_config);
+ assetmanager.SetApkAssets({basic_assets_.get()});
+ assetmanager.SetResourceResolutionLoggingEnabled(false);
+
+ Res_value value;
+ ResTable_config selected_config;
+ uint32_t flags;
+
+ ApkAssetsCookie cookie =
+ assetmanager.GetResource(basic::R::string::test1, false /*may_be_bag*/,
+ 0 /*density_override*/, &value, &selected_config, &flags);
+ ASSERT_NE(kInvalidCookie, cookie);
+
+ auto result = assetmanager.GetLastResourceResolution();
+ EXPECT_EQ("", result);
+}
+
+TEST_F(AssetManager2Test, GetLastPathWithoutResolutionReturnsEmpty) {
+ ResTable_config desired_config;
+
+ AssetManager2 assetmanager;
+ assetmanager.SetConfiguration(desired_config);
+ assetmanager.SetApkAssets({basic_assets_.get()});
+
+ auto result = assetmanager.GetLastResourceResolution();
+ EXPECT_EQ("", result);
+}
+
+TEST_F(AssetManager2Test, GetLastPathWithSingleApkAssets) {
+ ResTable_config desired_config;
+ memset(&desired_config, 0, sizeof(desired_config));
+ desired_config.language[0] = 'd';
+ desired_config.language[1] = 'e';
+
+ AssetManager2 assetmanager;
+ assetmanager.SetResourceResolutionLoggingEnabled(true);
+ assetmanager.SetConfiguration(desired_config);
+ assetmanager.SetApkAssets({basic_assets_.get()});
+
+ Res_value value;
+ ResTable_config selected_config;
+ uint32_t flags;
+
+ ApkAssetsCookie cookie =
+ assetmanager.GetResource(basic::R::string::test1, false /*may_be_bag*/,
+ 0 /*density_override*/, &value, &selected_config, &flags);
+ ASSERT_NE(kInvalidCookie, cookie);
+
+ auto result = assetmanager.GetLastResourceResolution();
+ EXPECT_EQ("Resolution for 0x7f030000 com.android.basic:string/test1\n\tFor config -de\n\tFound initial: com.android.basic", result);
+}
+
+TEST_F(AssetManager2Test, GetLastPathWithMultipleApkAssets) {
+ ResTable_config desired_config;
+ memset(&desired_config, 0, sizeof(desired_config));
+ desired_config.language[0] = 'd';
+ desired_config.language[1] = 'e';
+
+ AssetManager2 assetmanager;
+ assetmanager.SetResourceResolutionLoggingEnabled(true);
+ assetmanager.SetConfiguration(desired_config);
+ assetmanager.SetApkAssets({basic_assets_.get(), basic_de_fr_assets_.get()});
+
+ Res_value value = Res_value();
+ ResTable_config selected_config;
+ uint32_t flags;
+
+ ApkAssetsCookie cookie =
+ assetmanager.GetResource(basic::R::string::test1, false /*may_be_bag*/,
+ 0 /*density_override*/, &value, &selected_config, &flags);
+ ASSERT_NE(kInvalidCookie, cookie);
+
+ auto result = assetmanager.GetLastResourceResolution();
+ EXPECT_EQ("Resolution for 0x7f030000 com.android.basic:string/test1\n\tFor config -de\n\tFound initial: com.android.basic\n\tFound better: com.android.basic -de", result);
+}
+
+TEST_F(AssetManager2Test, GetLastPathAfterDisablingReturnsEmpty) {
+ ResTable_config desired_config;
+ memset(&desired_config, 0, sizeof(desired_config));
+
+ AssetManager2 assetmanager;
+ assetmanager.SetResourceResolutionLoggingEnabled(true);
+ assetmanager.SetConfiguration(desired_config);
+ assetmanager.SetApkAssets({basic_assets_.get()});
+
+ Res_value value = Res_value();
+ ResTable_config selected_config;
+ uint32_t flags;
+
+ ApkAssetsCookie cookie =
+ assetmanager.GetResource(basic::R::string::test1, false /*may_be_bag*/,
+ 0 /*density_override*/, &value, &selected_config, &flags);
+ ASSERT_NE(kInvalidCookie, cookie);
+
+ auto resultEnabled = assetmanager.GetLastResourceResolution();
+ ASSERT_NE("", resultEnabled);
+
+ assetmanager.SetResourceResolutionLoggingEnabled(false);
+
+ auto resultDisabled = assetmanager.GetLastResourceResolution();
+ EXPECT_EQ("", resultDisabled);
+}
+
} // namespace android
diff --git a/libs/androidfw/tests/LoadedArsc_test.cpp b/libs/androidfw/tests/LoadedArsc_test.cpp
index 22d587a7f5c4..b8d3c6bf92fb 100644
--- a/libs/androidfw/tests/LoadedArsc_test.cpp
+++ b/libs/androidfw/tests/LoadedArsc_test.cpp
@@ -294,22 +294,29 @@ TEST(LoadedArscTest, LoadOverlayable) {
info = package->GetOverlayableInfo(overlayable::R::string::overlayable1);
ASSERT_THAT(info, NotNull());
+ EXPECT_THAT(info->name, Eq("OverlayableResources1"));
+ EXPECT_THAT(info->actor, Eq("overlay://theme"));
EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC));
info = package->GetOverlayableInfo(overlayable::R::string::overlayable2);
ASSERT_THAT(info, NotNull());
+ EXPECT_THAT(info->name, Eq("OverlayableResources1"));
+ EXPECT_THAT(info->actor, Eq("overlay://theme"));
EXPECT_THAT(info->policy_flags,
Eq(ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION
| ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION));
info = package->GetOverlayableInfo(overlayable::R::string::overlayable3);
ASSERT_THAT(info, NotNull());
+ EXPECT_THAT(info->name, Eq("OverlayableResources2"));
+ EXPECT_THAT(info->actor, Eq("overlay://com.android.overlayable"));
EXPECT_THAT(info->policy_flags,
Eq(ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION
- | ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION
| ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION));
info = package->GetOverlayableInfo(overlayable::R::string::overlayable4);
+ EXPECT_THAT(info->name, Eq("OverlayableResources1"));
+ EXPECT_THAT(info->actor, Eq("overlay://theme"));
ASSERT_THAT(info, NotNull());
EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC));
}
diff --git a/libs/androidfw/tests/data/overlayable/overlayable.apk b/libs/androidfw/tests/data/overlayable/overlayable.apk
index 85ab4be7a2e5..047e6afde86b 100644
--- a/libs/androidfw/tests/data/overlayable/overlayable.apk
+++ b/libs/androidfw/tests/data/overlayable/overlayable.apk
Binary files differ
diff --git a/libs/androidfw/tests/data/overlayable/res/values/overlayable.xml b/libs/androidfw/tests/data/overlayable/res/values/overlayable.xml
index 11aa7354901d..fcdbe94466c1 100644
--- a/libs/androidfw/tests/data/overlayable/res/values/overlayable.xml
+++ b/libs/androidfw/tests/data/overlayable/res/values/overlayable.xml
@@ -15,7 +15,7 @@
-->
<resources>
-<overlayable>
+<overlayable name="OverlayableResources1" actor="overlay://theme">
<!-- Any overlay can overlay the value of @string/overlayable1 -->
<item type="string" name="overlayable1" />
@@ -31,10 +31,10 @@
</policy>
</overlayable>
-<overlayable>
- <!-- Any overlay on the product_services, vendor, or product partition can overlay the value of
- @string/overlayable3 -->
- <policy type="product_services|vendor|product">
+<overlayable name="OverlayableResources2" actor="overlay://com.android.overlayable">
+ <!-- Any overlay on the vendor or product partition can overlay the value of
+ @string/overlayable3 -->
+ <policy type="vendor|product">
<item type="string" name="overlayable3" />
</policy>
</overlayable>
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index ed167e57158e..56b1885de820 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -79,8 +79,7 @@ static void queryWideColorGamutPreference(SkColorSpace::Gamut* colorGamut,
switch (wcgDataspace) {
case ui::Dataspace::DISPLAY_P3:
*colorGamut = SkColorSpace::Gamut::kDCIP3_D65_Gamut;
- *colorSpace = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
- SkColorSpace::Gamut::kDCIP3_D65_Gamut);
+ *colorSpace = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
break;
case ui::Dataspace::V0_SCRGB:
*colorGamut = SkColorSpace::Gamut::kSRGB_Gamut;
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index b9860ada18fc..635d0ec66673 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -34,7 +34,7 @@
namespace android::uirenderer {
static std::mutex sLock{};
-static ThreadBase* sUploadThread = nullptr;
+static sp<ThreadBase> sUploadThread = nullptr;
static renderthread::EglManager sEglManager;
static int sPendingUploads = 0;
static nsecs_t sLastUpload = 0;
@@ -257,4 +257,15 @@ sk_sp<Bitmap> HardwareBitmapUploader::allocateHardwareBitmap(const SkBitmap& sou
Bitmap::computePalette(bitmap));
}
+void HardwareBitmapUploader::terminate() {
+ std::lock_guard _lock{sLock};
+ LOG_ALWAYS_FATAL_IF(sPendingUploads, "terminate called while uploads in progress");
+ if (sUploadThread) {
+ sUploadThread->requestExit();
+ sUploadThread->join();
+ sUploadThread = nullptr;
+ }
+ sEglManager.destroy();
+}
+
} // namespace android::uirenderer
diff --git a/libs/hwui/HardwareBitmapUploader.h b/libs/hwui/HardwareBitmapUploader.h
index 6298013bd263..40f2b0c7873c 100644
--- a/libs/hwui/HardwareBitmapUploader.h
+++ b/libs/hwui/HardwareBitmapUploader.h
@@ -23,6 +23,7 @@ namespace android::uirenderer {
class HardwareBitmapUploader {
public:
static sk_sp<Bitmap> allocateHardwareBitmap(const SkBitmap& sourceBitmap);
+ static void terminate();
};
} // namespace android::uirenderer
diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h
index b33cfe2ec511..0c515a41689d 100644
--- a/libs/hwui/Matrix.h
+++ b/libs/hwui/Matrix.h
@@ -81,7 +81,7 @@ public:
explicit Matrix4(const float* v) { load(v); }
- Matrix4(const SkMatrix& v) { // NOLINT, implicit
+ Matrix4(const SkMatrix& v) { // NOLINT(google-explicit-constructor)
load(v);
}
diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h
index d6362ef10aad..24443c8c9836 100644
--- a/libs/hwui/Rect.h
+++ b/libs/hwui/Rect.h
@@ -57,15 +57,15 @@ public:
inline Rect(float width, float height) : left(0.0f), top(0.0f), right(width), bottom(height) {}
- inline Rect(const SkIRect& rect)
- : // NOLINT, implicit
+ inline Rect(const SkIRect& rect) // NOLINT(google-explicit-constructor)
+ :
left(rect.fLeft)
, top(rect.fTop)
, right(rect.fRight)
, bottom(rect.fBottom) {}
- inline Rect(const SkRect& rect)
- : // NOLINT, implicit
+ inline Rect(const SkRect& rect) // NOLINT(google-explicit-constructor)
+ :
left(rect.fLeft)
, top(rect.fTop)
, right(rect.fRight)
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index ab95e69c4e26..cc62fdc76ef8 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -678,15 +678,15 @@ void SkiaCanvas::drawVectorDrawable(VectorDrawableRoot* vectorDrawable) {
// Canvas draw operations: Text
// ----------------------------------------------------------------------------
-void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& paint, float x,
+void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const Paint& paint, float x,
float y, float boundsLeft, float boundsTop, float boundsRight,
float boundsBottom, float totalAdvance) {
if (count <= 0 || paint.nothingToDraw()) return;
- SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
SkPaint paintCopy(paint);
if (mPaintFilter) {
mPaintFilter->filter(&paintCopy);
}
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(paintCopy);
SkASSERT(paintCopy.getTextEncoding() == kGlyphID_SkTextEncoding);
// Stroke with a hairline is drawn on HW with a fill style for compatibility with Android O and
// older.
@@ -708,13 +708,13 @@ void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& p
}
void SkiaCanvas::drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
- const SkPaint& paint, const SkPath& path, size_t start,
+ const Paint& paint, const SkPath& path, size_t start,
size_t end) {
- SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
SkPaint paintCopy(paint);
if (mPaintFilter) {
mPaintFilter->filter(&paintCopy);
}
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(paintCopy);
SkASSERT(paintCopy.getTextEncoding() == kGlyphID_SkTextEncoding);
const int N = end - start;
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 4ab0a59447ee..3fe2bce06b41 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -158,11 +158,11 @@ protected:
void reset(SkCanvas* skiaCanvas);
void drawDrawable(SkDrawable* drawable) { mCanvas->drawDrawable(drawable); }
- virtual void drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& paint, float x,
+ virtual void drawGlyphs(ReadGlyphFunc glyphFunc, int count, const Paint& paint, float x,
float y, float boundsLeft, float boundsTop, float boundsRight,
float boundsBottom, float totalAdvance) override;
virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
- const SkPaint& paint, const SkPath& path, size_t start,
+ const Paint& paint, const SkPath& path, size_t start,
size_t end) override;
/** This class acts as a copy on write SkPaint.
diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp
index 5b7ae70e821c..68541b4b31f0 100644
--- a/libs/hwui/WebViewFunctorManager.cpp
+++ b/libs/hwui/WebViewFunctorManager.cpp
@@ -18,6 +18,7 @@
#include <private/hwui/WebViewFunctor.h>
#include "Properties.h"
+#include "renderthread/RenderThread.h"
#include <log/log.h>
#include <utils/Trace.h>
@@ -85,11 +86,35 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) {
mCallbacks.gles.draw(mFunctor, mData, drawInfo);
}
+void WebViewFunctor::initVk(const VkFunctorInitParams& params) {
+ ATRACE_NAME("WebViewFunctor::initVk");
+ if (!mHasContext) {
+ mHasContext = true;
+ } else {
+ return;
+ }
+ mCallbacks.vk.initialize(mFunctor, mData, params);
+}
+
+void WebViewFunctor::drawVk(const VkFunctorDrawParams& params) {
+ ATRACE_NAME("WebViewFunctor::drawVk");
+ mCallbacks.vk.draw(mFunctor, mData, params);
+}
+
+void WebViewFunctor::postDrawVk() {
+ ATRACE_NAME("WebViewFunctor::postDrawVk");
+ mCallbacks.vk.postDraw(mFunctor, mData);
+}
+
void WebViewFunctor::destroyContext() {
if (mHasContext) {
mHasContext = false;
ATRACE_NAME("WebViewFunctor::onContextDestroyed");
mCallbacks.onContextDestroyed(mFunctor, mData);
+
+ // grContext may be null in unit tests.
+ auto* grContext = renderthread::RenderThread::getInstance().getGrContext();
+ if (grContext) grContext->resetContext();
}
}
diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h
index 1719ce7cca75..2846cb1f087b 100644
--- a/libs/hwui/WebViewFunctorManager.h
+++ b/libs/hwui/WebViewFunctorManager.h
@@ -42,6 +42,12 @@ public:
void drawGl(const DrawGlInfo& drawInfo) const { mReference.drawGl(drawInfo); }
+ void initVk(const VkFunctorInitParams& params) { mReference.initVk(params); }
+
+ void drawVk(const VkFunctorDrawParams& params) { mReference.drawVk(params); }
+
+ void postDrawVk() { mReference.postDrawVk(); }
+
private:
friend class WebViewFunctor;
@@ -53,6 +59,9 @@ public:
int id() const { return mFunctor; }
void sync(const WebViewSyncData& syncData) const;
void drawGl(const DrawGlInfo& drawInfo);
+ void initVk(const VkFunctorInitParams& params);
+ void drawVk(const VkFunctorDrawParams& params);
+ void postDrawVk();
void destroyContext();
sp<Handle> createHandle() {
diff --git a/libs/hwui/debug/GlesErrorCheckWrapper.h b/libs/hwui/debug/GlesErrorCheckWrapper.h
index ee5cc1f46de8..791400bf30ec 100644
--- a/libs/hwui/debug/GlesErrorCheckWrapper.h
+++ b/libs/hwui/debug/GlesErrorCheckWrapper.h
@@ -24,7 +24,7 @@ namespace debug {
class GlesErrorCheckWrapper : public GlesDriver {
public:
- GlesErrorCheckWrapper(GlesDriver& base) : mBase(base) {}
+ explicit GlesErrorCheckWrapper(GlesDriver& base) : mBase(base) {}
#define GL_ENTRY(ret, api, ...) virtual ret api##_(__VA_ARGS__) override;
#include "gles_decls.in"
diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp
index a09da6bf359e..277148e3d556 100644
--- a/libs/hwui/hwui/Canvas.cpp
+++ b/libs/hwui/hwui/Canvas.cpp
@@ -38,7 +38,7 @@ static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkSca
canvas->drawRect(left, top, right, bottom, paint);
}
-void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) {
+void Canvas::drawTextDecorations(float x, float y, float length, const Paint& paint) {
uint32_t flags;
PaintFilter* paintFilter = getPaintFilter();
if (paintFilter) {
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index 4c5365d3c170..11e8579a481f 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -303,18 +303,18 @@ public:
static int GetApiLevel() { return sApiLevel; }
protected:
- void drawTextDecorations(float x, float y, float length, const SkPaint& paint);
+ void drawTextDecorations(float x, float y, float length, const Paint& paint);
/**
* glyphFunc: valid only for the duration of the call and should not be cached.
* drawText: count is of glyphs
* totalAdvance: used to define width of text decorations (underlines, strikethroughs).
*/
- virtual void drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& paint, float x,
+ virtual void drawGlyphs(ReadGlyphFunc glyphFunc, int count, const Paint& paint, float x,
float y, float boundsLeft, float boundsTop, float boundsRight,
float boundsBottom, float totalAdvance) = 0;
virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
- const SkPaint& paint, const SkPath& path, size_t start,
+ const Paint& paint, const SkPath& path, size_t start,
size_t end) = 0;
static int sApiLevel;
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index c1a3b6d1143b..92ffda9486bb 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -46,7 +46,7 @@ public:
Paint();
Paint(const Paint& paint);
- Paint(const SkPaint& paint); // NOLINT(implicit)
+ Paint(const SkPaint& paint); // NOLINT(google-explicit-constructor)
~Paint();
Paint& operator=(const Paint& other);
diff --git a/libs/hwui/pipeline/skia/ShaderCache.cpp b/libs/hwui/pipeline/skia/ShaderCache.cpp
index 562a3b225e36..1661905eff57 100644
--- a/libs/hwui/pipeline/skia/ShaderCache.cpp
+++ b/libs/hwui/pipeline/skia/ShaderCache.cpp
@@ -23,6 +23,7 @@
#include "FileBlobCache.h"
#include "Properties.h"
#include "utils/TraceUtils.h"
+#include <GrContext.h>
namespace android {
namespace uirenderer {
@@ -168,6 +169,24 @@ void ShaderCache::store(const SkData& key, const SkData& data) {
const void* value = data.data();
BlobCache* bc = getBlobCacheLocked();
+ if (mInStoreVkPipelineInProgress) {
+ if (mOldPipelineCacheSize == -1) {
+ // Record the initial pipeline cache size stored in the file.
+ mOldPipelineCacheSize = bc->get(key.data(), keySize, nullptr, 0);
+ }
+ if (mNewPipelineCacheSize != -1 && mNewPipelineCacheSize == valueSize) {
+ // There has not been change in pipeline cache size. Stop trying to save.
+ mTryToStorePipelineCache = false;
+ return;
+ }
+ mNewPipelineCacheSize = valueSize;
+ } else {
+ mCacheDirty = true;
+ // If there are new shaders compiled, we probably have new pipeline state too.
+ // Store pipeline cache on the next flush.
+ mNewPipelineCacheSize = -1;
+ mTryToStorePipelineCache = true;
+ }
bc->set(key.data(), keySize, value, valueSize);
if (!mSavePending && mDeferredSaveDelay > 0) {
@@ -175,12 +194,31 @@ void ShaderCache::store(const SkData& key, const SkData& data) {
std::thread deferredSaveThread([this]() {
sleep(mDeferredSaveDelay);
std::lock_guard<std::mutex> lock(mMutex);
- saveToDiskLocked();
+ // Store file on disk if there a new shader or Vulkan pipeline cache size changed.
+ if (mCacheDirty || mNewPipelineCacheSize != mOldPipelineCacheSize) {
+ saveToDiskLocked();
+ mOldPipelineCacheSize = mNewPipelineCacheSize;
+ mTryToStorePipelineCache = false;
+ mCacheDirty = false;
+ }
});
deferredSaveThread.detach();
}
}
+void ShaderCache::onVkFrameFlushed(GrContext* context) {
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ if (!mInitialized || !mTryToStorePipelineCache) {
+ return;
+ }
+ }
+ mInStoreVkPipelineInProgress = true;
+ context->storeVkPipelineCacheData();
+ mInStoreVkPipelineInProgress = false;
+}
+
} /* namespace skiapipeline */
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/ShaderCache.h b/libs/hwui/pipeline/skia/ShaderCache.h
index d41aadb269dd..0898017d52a1 100644
--- a/libs/hwui/pipeline/skia/ShaderCache.h
+++ b/libs/hwui/pipeline/skia/ShaderCache.h
@@ -75,6 +75,13 @@ public:
*/
void store(const SkData& key, const SkData& data) override;
+ /**
+ * "onVkFrameFlushed" tries to store Vulkan pipeline cache state.
+ * Pipeline cache is saved on disk only if the size of the data has changed or there was
+ * a new shader compiled.
+ */
+ void onVkFrameFlushed(GrContext* context);
+
private:
// Creation and (the lack of) destruction is handled internally.
ShaderCache();
@@ -167,6 +174,33 @@ private:
mutable std::mutex mMutex;
/**
+ * If set to "true", the next call to onVkFrameFlushed, will invoke
+ * GrCanvas::storeVkPipelineCacheData. This does not guarantee that data will be stored on disk.
+ */
+ bool mTryToStorePipelineCache = true;
+
+ /**
+ * This flag is used by "ShaderCache::store" to distinguish between shader data and
+ * Vulkan pipeline data.
+ */
+ bool mInStoreVkPipelineInProgress = false;
+
+ /**
+ * "mNewPipelineCacheSize" has the size of the new Vulkan pipeline cache data. It is used
+ * to prevent unnecessary disk writes, if the pipeline cache size has not changed.
+ */
+ size_t mNewPipelineCacheSize = -1;
+ /**
+ * "mOldPipelineCacheSize" has the size of the Vulkan pipeline cache data stored on disk.
+ */
+ size_t mOldPipelineCacheSize = -1;
+
+ /**
+ * "mCacheDirty" is true when there is new shader cache data, which is not saved to disk.
+ */
+ bool mCacheDirty = false;
+
+ /**
* "sCache" is the singleton ShaderCache object.
*/
static ShaderCache sCache;
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 4338b1cc2a21..cfbb9956d3dc 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -96,11 +96,12 @@ bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, con
SkASSERT(mRenderThread.getGrContext() != nullptr);
sk_sp<SkSurface> surface(SkSurface::MakeFromBackendRenderTarget(
- mRenderThread.getGrContext(), backendRT, kBottomLeft_GrSurfaceOrigin, colorType,
+ mRenderThread.getGrContext(), backendRT, this->getSurfaceOrigin(), colorType,
mSurfaceColorSpace, &props));
SkiaPipeline::updateLighting(lightGeometry, lightInfo);
- renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
layerUpdateQueue->clear();
// Draw visual debugging features
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
index 479910697871..66929226a5e2 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
@@ -39,6 +39,7 @@ public:
const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
const std::vector<sp<RenderNode> >& renderNodes,
FrameInfoVisualizer* profiler) override;
+ GrSurfaceOrigin getSurfaceOrigin() override { return kBottomLeft_GrSurfaceOrigin; }
bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty,
FrameInfo* currentFrameInfo, bool* requireSwap) override;
DeferredLayerUpdater* createTextureLayer() override;
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 2e7850d48e54..df8224372ea7 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -174,7 +174,8 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
SkASSERT(mRenderThread.getGrContext() != nullptr);
node->setLayerSurface(SkSurface::MakeRenderTarget(mRenderThread.getGrContext(),
- SkBudgeted::kYes, info, 0, &props));
+ SkBudgeted::kYes, info, 0,
+ this->getSurfaceOrigin(), &props));
if (node->getLayerSurface()) {
// update the transform in window of the layer to reset its origin wrt light source
// position
@@ -311,7 +312,8 @@ void SkiaPipeline::endCapture(SkSurface* surface) {
void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, bool opaque,
- const Rect& contentDrawBounds, sk_sp<SkSurface> surface) {
+ const Rect& contentDrawBounds, sk_sp<SkSurface> surface,
+ const SkMatrix& preTransform) {
renderVectorDrawableCache();
// draw all layers up front
@@ -322,12 +324,12 @@ void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& cli
std::unique_ptr<SkPictureRecorder> recorder;
SkCanvas* canvas = tryCapture(surface.get());
- renderFrameImpl(layers, clip, nodes, opaque, contentDrawBounds, canvas);
+ renderFrameImpl(layers, clip, nodes, opaque, contentDrawBounds, canvas, preTransform);
endCapture(surface.get());
if (CC_UNLIKELY(Properties::debugOverdraw)) {
- renderOverdraw(layers, clip, nodes, contentDrawBounds, surface);
+ renderOverdraw(layers, clip, nodes, contentDrawBounds, surface, preTransform);
}
ATRACE_NAME("flush commands");
@@ -343,9 +345,11 @@ static Rect nodeBounds(RenderNode& node) {
void SkiaPipeline::renderFrameImpl(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, bool opaque,
- const Rect& contentDrawBounds, SkCanvas* canvas) {
+ const Rect& contentDrawBounds, SkCanvas* canvas,
+ const SkMatrix& preTransform) {
SkAutoCanvasRestore saver(canvas, true);
- canvas->androidFramework_setDeviceClipRestriction(clip.roundOut());
+ canvas->androidFramework_setDeviceClipRestriction(preTransform.mapRect(clip).roundOut());
+ canvas->concat(preTransform);
// STOPSHIP: Revert, temporary workaround to clear always F16 frame buffer for b/74976293
if (!opaque || getSurfaceColorType() == kRGBA_F16_SkColorType) {
@@ -485,7 +489,8 @@ static const uint32_t kOverdrawColors[2][6] = {
void SkiaPipeline::renderOverdraw(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes,
- const Rect& contentDrawBounds, sk_sp<SkSurface> surface) {
+ const Rect& contentDrawBounds, sk_sp<SkSurface> surface,
+ const SkMatrix& preTransform) {
// Set up the overdraw canvas.
SkImageInfo offscreenInfo = SkImageInfo::MakeA8(surface->width(), surface->height());
sk_sp<SkSurface> offscreen = surface->makeSurface(offscreenInfo);
@@ -495,7 +500,7 @@ void SkiaPipeline::renderOverdraw(const LayerUpdateQueue& layers, const SkRect&
// each time a pixel would have been drawn.
// Pass true for opaque so we skip the clear - the overdrawCanvas is already zero
// initialized.
- renderFrameImpl(layers, clip, nodes, true, contentDrawBounds, &overdrawCanvas);
+ renderFrameImpl(layers, clip, nodes, true, contentDrawBounds, &overdrawCanvas, preTransform);
sk_sp<SkImage> counts = offscreen->makeImageSnapshot();
// Draw overdraw colors to the canvas. The color filter will convert counts to colors.
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index ff873133c6fb..cf6f5b284d8c 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -48,12 +48,13 @@ public:
bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
ErrorHandler* errorHandler) override;
- SkColorType getSurfaceColorType() const { return mSurfaceColorType; }
+ SkColorType getSurfaceColorType() const override { return mSurfaceColorType; }
sk_sp<SkColorSpace> getSurfaceColorSpace() override { return mSurfaceColorSpace; }
void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, bool opaque,
- const Rect& contentDrawBounds, sk_sp<SkSurface> surface);
+ const Rect& contentDrawBounds, sk_sp<SkSurface> surface,
+ const SkMatrix& preTransform);
std::vector<VectorDrawableRoot*>* getVectorDrawables() { return &mVectorDrawables; }
@@ -116,7 +117,8 @@ protected:
private:
void renderFrameImpl(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, bool opaque,
- const Rect& contentDrawBounds, SkCanvas* canvas);
+ const Rect& contentDrawBounds, SkCanvas* canvas,
+ const SkMatrix& preTransform);
/**
* Debugging feature. Draws a semi-transparent overlay on each pixel, indicating
@@ -124,7 +126,7 @@ private:
*/
void renderOverdraw(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, const Rect& contentDrawBounds,
- sk_sp<SkSurface>);
+ sk_sp<SkSurface> surface, const SkMatrix& preTransform);
/**
* Render mVectorDrawables into offscreen buffers.
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index 6eefed959913..d54275fe7e19 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -125,8 +125,6 @@ void SkiaRecordingCanvas::callDrawGLFunction(Functor* functor,
uirenderer::GlFunctorLifecycleListener* listener) {
FunctorDrawable* functorDrawable;
if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
- // TODO(cblume) use VkFunctorDrawable instead of VkInteropFunctorDrawable here when the
- // interop is disabled/moved.
functorDrawable = mDisplayList->allocateDrawable<VkInteropFunctorDrawable>(
functor, listener, asSkCanvas());
} else {
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 1d3a24463057..53495a7d62c0 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -23,6 +23,7 @@
#include "VkInteropFunctorDrawable.h"
#include "renderstate/RenderState.h"
#include "renderthread/Frame.h"
+#include "ShaderCache.h"
#include <SkSurface.h>
#include <SkTypes.h>
@@ -57,7 +58,8 @@ Frame SkiaVulkanPipeline::getFrame() {
return Frame(-1, -1, 0);
}
- Frame frame(backBuffer->width(), backBuffer->height(), mVkManager.getAge(mVkSurface));
+ Frame frame(mVkSurface->windowWidth(), mVkSurface->windowHeight(),
+ mVkManager.getAge(mVkSurface));
return frame;
}
@@ -72,7 +74,9 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, con
return false;
}
SkiaPipeline::updateLighting(lightGeometry, lightInfo);
- renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, backBuffer);
+ renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds,
+ backBuffer, mVkSurface->preTransform());
+ ShaderCache::get().onVkFrameFlushed(mRenderThread.getGrContext());
layerUpdateQueue->clear();
// Draw visual debugging features
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
index 53ffc4422fd7..934307636913 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
@@ -35,6 +35,7 @@ public:
const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
const std::vector<sp<RenderNode> >& renderNodes,
FrameInfoVisualizer* profiler) override;
+ GrSurfaceOrigin getSurfaceOrigin() override { return kTopLeft_GrSurfaceOrigin; }
bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty,
FrameInfo* currentFrameInfo, bool* requireSwap) override;
DeferredLayerUpdater* createTextureLayer() override;
diff --git a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
index 156f74a611a7..2f8d381f15f5 100644
--- a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
@@ -17,6 +17,8 @@
#include "VkFunctorDrawable.h"
#include <private/hwui/DrawVkInfo.h>
+#include "renderthread/VulkanManager.h"
+#include "renderthread/RenderThread.h"
#include <GrBackendDrawableInfo.h>
#include <SkImage.h>
#include <utils/Color.h>
@@ -31,34 +33,58 @@ namespace android {
namespace uirenderer {
namespace skiapipeline {
-VkFunctorDrawHandler::VkFunctorDrawHandler(Functor* functor) : INHERITED(), mFunctor(functor) {}
+VkFunctorDrawHandler::VkFunctorDrawHandler(sp<WebViewFunctor::Handle> functor_handle,
+ const SkMatrix& matrix, const SkIRect& clip,
+ const SkImageInfo& image_info)
+ : INHERITED()
+ , mFunctorHandle(functor_handle)
+ , mMatrix(matrix)
+ , mClip(clip)
+ , mImageInfo(image_info) {}
VkFunctorDrawHandler::~VkFunctorDrawHandler() {
- // TODO(cblume) Fill in the DrawVkInfo parameters.
- (*mFunctor)(DrawVkInfo::kModePostComposite, nullptr);
+ mFunctorHandle->postDrawVk();
}
void VkFunctorDrawHandler::draw(const GrBackendDrawableInfo& info) {
ATRACE_CALL();
+ if (!renderthread::RenderThread::isCurrent())
+ LOG_ALWAYS_FATAL("VkFunctorDrawHandler::draw not called on render thread");
GrVkDrawableInfo vulkan_info;
if (!info.getVkDrawableInfo(&vulkan_info)) {
return;
}
+ renderthread::VulkanManager& vk_manager =
+ renderthread::RenderThread::getInstance().vulkanManager();
+ mFunctorHandle->initVk(vk_manager.getVkFunctorInitParams());
- DrawVkInfo draw_vk_info;
- // TODO(cblume) Fill in the rest of the parameters and test the actual call.
- draw_vk_info.isLayer = true;
+ SkMatrix44 mat4(mMatrix);
+ VkFunctorDrawParams params{
+ .width = mImageInfo.width(),
+ .height = mImageInfo.height(),
+ .is_layer = false, // TODO(boliu): Populate is_layer.
+ .color_space_ptr = mImageInfo.colorSpace(),
+ .clip_left = mClip.fLeft,
+ .clip_top = mClip.fTop,
+ .clip_right = mClip.fRight,
+ .clip_bottom = mClip.fBottom,
+ };
+ mat4.asColMajorf(&params.transform[0]);
+ params.secondary_command_buffer = vulkan_info.fSecondaryCommandBuffer;
+ params.color_attachment_index = vulkan_info.fColorAttachmentIndex;
+ params.compatible_render_pass = vulkan_info.fCompatibleRenderPass;
+ params.format = vulkan_info.fFormat;
- (*mFunctor)(DrawVkInfo::kModeComposite, &draw_vk_info);
+ mFunctorHandle->drawVk(params);
+
+ vulkan_info.fDrawBounds->offset.x = mClip.fLeft;
+ vulkan_info.fDrawBounds->offset.y = mClip.fTop;
+ vulkan_info.fDrawBounds->extent.width = mClip.fRight - mClip.fLeft;
+ vulkan_info.fDrawBounds->extent.height = mClip.fBottom - mClip.fTop;
}
VkFunctorDrawable::~VkFunctorDrawable() {
- if (auto lp = std::get_if<LegacyFunctor>(&mAnyFunctor)) {
- if (lp->listener) {
- lp->listener->onGlFunctorReleased(lp->functor);
- }
- }
}
void VkFunctorDrawable::onDraw(SkCanvas* /*canvas*/) {
@@ -67,16 +93,17 @@ void VkFunctorDrawable::onDraw(SkCanvas* /*canvas*/) {
}
std::unique_ptr<FunctorDrawable::GpuDrawHandler> VkFunctorDrawable::onSnapGpuDrawHandler(
- GrBackendApi backendApi, const SkMatrix& matrix) {
+ GrBackendApi backendApi, const SkMatrix& matrix, const SkIRect& clip,
+ const SkImageInfo& image_info) {
if (backendApi != GrBackendApi::kVulkan) {
return nullptr;
}
std::unique_ptr<VkFunctorDrawHandler> draw;
if (mAnyFunctor.index() == 0) {
- LOG_ALWAYS_FATAL("Not implemented");
- return nullptr;
+ return std::make_unique<VkFunctorDrawHandler>(std::get<0>(mAnyFunctor).handle, matrix, clip,
+ image_info);
} else {
- return std::make_unique<VkFunctorDrawHandler>(std::get<1>(mAnyFunctor).functor);
+ LOG_ALWAYS_FATAL("Not implemented");
}
}
diff --git a/libs/hwui/pipeline/skia/VkFunctorDrawable.h b/libs/hwui/pipeline/skia/VkFunctorDrawable.h
index d6fefc1fca06..1a53c8fd55db 100644
--- a/libs/hwui/pipeline/skia/VkFunctorDrawable.h
+++ b/libs/hwui/pipeline/skia/VkFunctorDrawable.h
@@ -32,15 +32,18 @@ namespace skiapipeline {
*/
class VkFunctorDrawHandler : public FunctorDrawable::GpuDrawHandler {
public:
- explicit VkFunctorDrawHandler(Functor* functor);
+ VkFunctorDrawHandler(sp<WebViewFunctor::Handle> functor_handle, const SkMatrix& matrix,
+ const SkIRect& clip, const SkImageInfo& image_info);
~VkFunctorDrawHandler() override;
void draw(const GrBackendDrawableInfo& info) override;
private:
typedef GpuDrawHandler INHERITED;
-
- Functor* mFunctor;
+ sp<WebViewFunctor::Handle> mFunctorHandle;
+ const SkMatrix mMatrix;
+ const SkIRect mClip;
+ const SkImageInfo mImageInfo;
};
/**
@@ -57,7 +60,8 @@ protected:
// SkDrawable functions:
void onDraw(SkCanvas* canvas) override;
std::unique_ptr<FunctorDrawable::GpuDrawHandler> onSnapGpuDrawHandler(
- GrBackendApi backendApi, const SkMatrix& matrix) override;
+ GrBackendApi backendApi, const SkMatrix& matrix, const SkIRect& clip,
+ const SkImageInfo& image_info) override;
};
} // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
index a5faae7d5068..c3563dbfd3cd 100644
--- a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
@@ -36,8 +36,6 @@ namespace android {
namespace uirenderer {
namespace skiapipeline {
-static std::mutex sLock{};
-static ThreadBase* sGLDrawThread = nullptr;
static renderthread::EglManager sEglManager;
// ScopedDrawRequest makes sure a GL thread is started and EGL context is initialized on it.
@@ -47,32 +45,20 @@ public:
private:
void beginDraw() {
- std::lock_guard _lock{sLock};
-
- if (!sGLDrawThread) {
- sGLDrawThread = new ThreadBase{};
- }
-
- if (!sGLDrawThread->isRunning()) {
- sGLDrawThread->start("GLFunctorThread");
- }
-
if (!sEglManager.hasEglContext()) {
- sGLDrawThread->queue().runSync([]() { sEglManager.initialize(); });
+ sEglManager.initialize();
}
}
};
void VkInteropFunctorDrawable::vkInvokeFunctor(Functor* functor) {
ScopedDrawRequest _drawRequest{};
- sGLDrawThread->queue().runSync([&]() {
- EGLDisplay display = sEglManager.eglDisplay();
- DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext;
- if (display != EGL_NO_DISPLAY) {
- mode = DrawGlInfo::kModeProcess;
- }
- (*functor)(mode, nullptr);
- });
+ EGLDisplay display = sEglManager.eglDisplay();
+ DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext;
+ if (display != EGL_NO_DISPLAY) {
+ mode = DrawGlInfo::kModeProcess;
+ }
+ (*functor)(mode, nullptr);
}
#define FENCE_TIMEOUT 2000000000
@@ -113,7 +99,7 @@ void VkInteropFunctorDrawable::onDraw(SkCanvas* canvas) {
// TODO: draw command has completed.
// TODO: A simple but inefficient way is to flush and issue a QueueWaitIdle call. See
// TODO: GrVkGpu::destroyResources() for example.
- bool success = sGLDrawThread->queue().runSync([&]() -> bool {
+ {
ATRACE_FORMAT("WebViewDraw_%dx%d", mFBInfo.width(), mFBInfo.height());
EGLDisplay display = sEglManager.eglDisplay();
LOG_ALWAYS_FATAL_IF(display == EGL_NO_DISPLAY, "Failed to get EGL_DEFAULT_DISPLAY! err=%s",
@@ -125,7 +111,7 @@ void VkInteropFunctorDrawable::onDraw(SkCanvas* canvas) {
if (autoImage.image == EGL_NO_IMAGE_KHR) {
ALOGW("Could not create EGL image, err =%s",
uirenderer::renderthread::EglManager::eglErrorString());
- return false;
+ return;
}
AutoSkiaGlTexture glTexture;
@@ -156,7 +142,7 @@ void VkInteropFunctorDrawable::onDraw(SkCanvas* canvas) {
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
ALOGE("Failed framebuffer check for created target buffer: %s",
GLUtils::getGLFramebufferError());
- return false;
+ return;
}
glDisable(GL_STENCIL_TEST);
@@ -183,11 +169,6 @@ void VkInteropFunctorDrawable::onDraw(SkCanvas* canvas) {
LOG_ALWAYS_FATAL_IF(waitStatus != EGL_CONDITION_SATISFIED_KHR,
"Failed to wait for the fence %#x", eglGetError());
eglDestroySyncKHR(display, glDrawFinishedFence);
- return true;
- });
-
- if (!success) {
- return;
}
SkPaint paint;
@@ -208,15 +189,14 @@ VkInteropFunctorDrawable::~VkInteropFunctorDrawable() {
if (auto lp = std::get_if<LegacyFunctor>(&mAnyFunctor)) {
if (lp->listener) {
ScopedDrawRequest _drawRequest{};
- sGLDrawThread->queue().runSync(
- [&]() { lp->listener->onGlFunctorReleased(lp->functor); });
+ lp->listener->onGlFunctorReleased(lp->functor);
}
}
}
void VkInteropFunctorDrawable::syncFunctor(const WebViewSyncData& data) const {
ScopedDrawRequest _drawRequest{};
- sGLDrawThread->queue().runSync([&]() { FunctorDrawable::syncFunctor(data); });
+ FunctorDrawable::syncFunctor(data);
}
} // namespace skiapipeline
diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h
index 019950fcbc02..abc4dbf9fa1c 100644
--- a/libs/hwui/private/hwui/DrawVkInfo.h
+++ b/libs/hwui/private/hwui/DrawVkInfo.h
@@ -17,89 +17,61 @@
#ifndef ANDROID_HWUI_DRAW_VK_INFO_H
#define ANDROID_HWUI_DRAW_VK_INFO_H
+#include <SkColorSpace.h>
#include <vulkan/vulkan.h>
namespace android {
namespace uirenderer {
-/**
- * Structure used by VulkanRenderer::callDrawVKFunction() to pass and receive data from Vulkan
- * functors.
- */
-struct DrawVkInfo {
- // Input: current width/height of destination surface
- int width;
- int height;
-
- // Input: is the render target an FBO
- bool isLayer;
-
- // Input: current transform matrix, in OpenGL format
- float transform[16];
-
- // Input: WebView should do its main compositing draws into this. It cannot do anything that
- // would require stopping the render pass.
- VkCommandBuffer secondaryCommandBuffer;
-
- // Input: The main color attachment index where secondaryCommandBuffer will eventually be
- // submitted.
- uint32_t colorAttachmentIndex;
-
- // Input: A render pass which will be compatible to the one which the secondaryCommandBuffer
- // will be submitted into.
- VkRenderPass compatibleRenderPass;
-
- // Input: Format of the destination surface.
- VkFormat format;
-
- // Input: Color space transfer params
- float G;
- float A;
- float B;
- float C;
- float D;
- float E;
- float F;
-
- // Input: Color space transformation from linear RGB to D50-adapted XYZ
- float matrix[9];
-
- // Input: current clip rect
- int clipLeft;
- int clipTop;
- int clipRight;
- int clipBottom;
-
- /**
- * Values used as the "what" parameter of the functor.
- */
- enum Mode {
- // Called once at WebView start
- kModeInit,
- // Called when things need to be re-created
- kModeReInit,
- // Notifies the app that the composite functor will be called soon. This allows WebView to
- // begin work early.
- kModePreComposite,
- // Do the actual composite work
- kModeComposite,
- // This allows WebView to begin using the previously submitted objects in future work.
- kModePostComposite,
- // Invoked every time the UI thread pushes over a frame to the render thread and the owning
- // view has a dirty display list*. This is a signal to sync any data that needs to be
- // shared between the UI thread and the render thread. During this time the UI thread is
- // blocked.
- kModeSync
- };
-
- /**
- * Values used by Vulkan functors to tell the framework what to do next.
- */
- enum Status {
- // The functor is done
- kStatusDone = 0x0,
- };
-}; // struct DrawVkInfo
+struct VkFunctorInitParams {
+ VkInstance instance;
+ VkPhysicalDevice physical_device;
+ VkDevice device;
+ VkQueue queue;
+ uint32_t graphics_queue_index;
+ uint32_t instance_version;
+ const char* const* enabled_instance_extension_names;
+ uint32_t enabled_instance_extension_names_length;
+ const char* const* enabled_device_extension_names;
+ uint32_t enabled_device_extension_names_length;
+ const VkPhysicalDeviceFeatures2* device_features_2;
+};
+
+struct VkFunctorDrawParams {
+ // Input: current width/height of destination surface.
+ int width;
+ int height;
+
+ // Input: is the render target a FBO
+ bool is_layer;
+
+ // Input: current transform matrix
+ float transform[16];
+
+ // Input WebView should do its main compositing draws into this. It cannot do
+ // anything that would require stopping the render pass.
+ VkCommandBuffer secondary_command_buffer;
+
+ // Input: The main color attachment index where secondary_command_buffer will
+ // eventually be submitted.
+ uint32_t color_attachment_index;
+
+ // Input: A render pass which will be compatible to the one which the
+ // secondary_command_buffer will be submitted into.
+ VkRenderPass compatible_render_pass;
+
+ // Input: Format of the destination surface.
+ VkFormat format;
+
+ // Input: Color space.
+ const SkColorSpace* color_space_ptr;
+
+ // Input: current clip rect
+ int clip_left;
+ int clip_top;
+ int clip_right;
+ int clip_bottom;
+};
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/private/hwui/WebViewFunctor.h b/libs/hwui/private/hwui/WebViewFunctor.h
index da3d06a4d60c..96da947ace08 100644
--- a/libs/hwui/private/hwui/WebViewFunctor.h
+++ b/libs/hwui/private/hwui/WebViewFunctor.h
@@ -19,6 +19,7 @@
#include <cutils/compiler.h>
#include <private/hwui/DrawGlInfo.h>
+#include <private/hwui/DrawVkInfo.h>
namespace android::uirenderer {
@@ -52,18 +53,12 @@ struct WebViewFunctorCallbacks {
// Called on RenderThread. initialize is guaranteed to happen before this call
void (*draw)(int functor, void* data, const DrawGlInfo& params);
} gles;
- // TODO: VK support. The current DrawVkInfo is monolithic and needs to be split up for
- // what params are valid on what callbacks
struct {
// Called either the first time the functor is used or the first time it's used after
// a call to onContextDestroyed.
- // void (*initialize)(int functor, const InitParams& params);
- // void (*frameStart)(int functor, /* todo: what params are actually needed for this to
- // be useful? Is this useful? */)
- // void (*draw)(int functor, const CompositeParams& params /* todo: rename - composite
- // almost always means something else, and we aren't compositing */);
- // void (*frameEnd)(int functor, const PostCompositeParams& params /* todo: same as
- // CompositeParams - rename */);
+ void (*initialize)(int functor, void* data, const VkFunctorInitParams& params);
+ void (*draw)(int functor, void* data, const VkFunctorDrawParams& params);
+ void (*postDraw)(int functor, void*);
} vk;
};
};
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index 7acc44ca65b7..6c04232ab7f5 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -30,6 +30,7 @@
#include <gui/Surface.h>
#include <math.h>
#include <set>
+#include <SkMathPriv.h>
namespace android {
namespace uirenderer {
@@ -42,11 +43,6 @@ namespace renderthread {
#define SURFACE_SIZE_MULTIPLIER (12.0f * 4.0f)
#define BACKGROUND_RETENTION_PERCENTAGE (0.5f)
-// for super large fonts we will draw them as paths so no need to keep linearly
-// increasing the font cache size.
-#define FONT_CACHE_MIN_MB (0.5f)
-#define FONT_CACHE_MAX_MB (4.0f)
-
CacheManager::CacheManager(const DisplayInfo& display) : mMaxSurfaceArea(display.w * display.h) {
mVectorDrawableAtlas = new skiapipeline::VectorDrawableAtlas(
mMaxSurfaceArea / 2,
@@ -106,25 +102,10 @@ public:
void CacheManager::configureContext(GrContextOptions* contextOptions, const void* identity, ssize_t size) {
contextOptions->fAllowPathMaskCaching = true;
- float screenMP = mMaxSurfaceArea / 1024.0f / 1024.0f;
- float fontCacheMB = 0;
- float decimalVal = std::modf(screenMP, &fontCacheMB);
-
- // This is a basic heuristic to size the cache to a multiple of 512 KB
- if (decimalVal > 0.8f) {
- fontCacheMB += 1.0f;
- } else if (decimalVal > 0.5f) {
- fontCacheMB += 0.5f;
- }
-
- // set limits on min/max size of the cache
- fontCacheMB = std::max(FONT_CACHE_MIN_MB, std::min(FONT_CACHE_MAX_MB, fontCacheMB));
-
- // We must currently set the size of the text cache based on the size of the
- // display even though we like to be dynamicallysizing it to the size of the window.
- // Skia's implementation doesn't provide a mechanism to resize the font cache due to
- // the potential cost of recreating the glyphs.
- contextOptions->fGlyphCacheTextureMaximumBytes = fontCacheMB * 1024 * 1024;
+ // This sets the maximum size for a single texture atlas in the GPU font cache. If necessary,
+ // the cache can allocate additional textures that are counted against the total cache limits
+ // provided to Skia.
+ contextOptions->fGlyphCacheTextureMaximumBytes = GrNextSizePow2(mMaxSurfaceArea);
if (mTaskManager.canRunTasks()) {
if (!mTaskProcessor.get()) {
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 56eedff4a6e6..8cd97ed20215 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -93,7 +93,9 @@ EglManager::EglManager()
, mHasWideColorGamutSupport(false) {}
EglManager::~EglManager() {
- destroy();
+ if (hasEglContext()) {
+ ALOGW("~EglManager() leaked an EGL context");
+ }
}
void EglManager::initialize() {
diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h
index 42e17b273bee..d4dd62941440 100644
--- a/libs/hwui/renderthread/IRenderPipeline.h
+++ b/libs/hwui/renderthread/IRenderPipeline.h
@@ -84,6 +84,7 @@ public:
virtual void onPrepareTree() = 0;
virtual SkColorType getSurfaceColorType() const = 0;
virtual sk_sp<SkColorSpace> getSurfaceColorSpace() = 0;
+ virtual GrSurfaceOrigin getSurfaceOrigin() = 0;
virtual ~IRenderPipeline() {}
};
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index c06faddf7fa6..8bef35915c4d 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -171,6 +171,9 @@ void RenderThread::initThreadLocals() {
mRenderState = new RenderState(*this);
mVkManager = new VulkanManager(*this);
mCacheManager = new CacheManager(mDisplayInfo);
+ if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
+ mVkManager->initialize();
+ }
}
void RenderThread::requireGlContext() {
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index 12666b323d11..1ef83fb26c14 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -47,6 +47,10 @@ class Readback;
class RenderState;
class TestUtils;
+namespace skiapipeline {
+class VkFunctorDrawHandler;
+}
+
namespace renderthread {
class CanvasContext;
@@ -123,6 +127,8 @@ private:
friend class RenderProxy;
friend class DummyVsyncSource;
friend class android::uirenderer::TestUtils;
+ friend class android::uirenderer::WebViewFunctor;
+ friend class android::uirenderer::skiapipeline::VkFunctorDrawHandler;
RenderThread();
virtual ~RenderThread();
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index aa7a141f6da3..5c6cb9ad43db 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -34,6 +34,23 @@ namespace android {
namespace uirenderer {
namespace renderthread {
+static void free_features_extensions_structs(const VkPhysicalDeviceFeatures2& features) {
+ // All Vulkan structs that could be part of the features chain will start with the
+ // structure type followed by the pNext pointer. We cast to the CommonVulkanHeader
+ // so we can get access to the pNext for the next struct.
+ struct CommonVulkanHeader {
+ VkStructureType sType;
+ void* pNext;
+ };
+
+ void* pNext = features.pNext;
+ while (pNext) {
+ void* current = pNext;
+ pNext = static_cast<CommonVulkanHeader*>(current)->pNext;
+ free(current);
+ }
+}
+
#define GET_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(VK_NULL_HANDLE, "vk" #F)
#define GET_INST_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(mInstance, "vk" #F)
#define GET_DEV_PROC(F) m##F = (PFN_vk##F)vkGetDeviceProcAddr(mDevice, "vk" #F)
@@ -66,6 +83,11 @@ void VulkanManager::destroy() {
mDevice = VK_NULL_HANDLE;
mPhysicalDevice = VK_NULL_HANDLE;
mInstance = VK_NULL_HANDLE;
+ mInstanceVersion = 0u;
+ mInstanceExtensions.clear();
+ mDeviceExtensions.clear();
+ free_features_extensions_structs(mPhysicalDeviceFeatures2);
+ mPhysicalDeviceFeatures2 = {};
}
bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFeatures2& features) {
@@ -81,7 +103,6 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
VK_MAKE_VERSION(1, 1, 0), // apiVersion
};
- std::vector<const char*> instanceExtensions;
{
GET_PROC(EnumerateInstanceExtensionProperties);
@@ -99,7 +120,7 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
bool hasKHRSurfaceExtension = false;
bool hasKHRAndroidSurfaceExtension = false;
for (uint32_t i = 0; i < extensionCount; ++i) {
- instanceExtensions.push_back(extensions[i].extensionName);
+ mInstanceExtensions.push_back(extensions[i].extensionName);
if (!strcmp(extensions[i].extensionName, VK_KHR_SURFACE_EXTENSION_NAME)) {
hasKHRSurfaceExtension = true;
}
@@ -120,8 +141,8 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
&app_info, // pApplicationInfo
0, // enabledLayerNameCount
nullptr, // ppEnabledLayerNames
- (uint32_t) instanceExtensions.size(), // enabledExtensionNameCount
- instanceExtensions.data(), // ppEnabledExtensionNames
+ (uint32_t) mInstanceExtensions.size(), // enabledExtensionNameCount
+ mInstanceExtensions.data(), // ppEnabledExtensionNames
};
GET_PROC(CreateInstance);
@@ -201,7 +222,6 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
// presentation with any native window. So just use the first one.
mPresentQueueIndex = 0;
- std::vector<const char*> deviceExtensions;
{
uint32_t extensionCount = 0;
err = mEnumerateDeviceExtensionProperties(mPhysicalDevice, nullptr, &extensionCount,
@@ -220,7 +240,7 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
}
bool hasKHRSwapchainExtension = false;
for (uint32_t i = 0; i < extensionCount; ++i) {
- deviceExtensions.push_back(extensions[i].extensionName);
+ mDeviceExtensions.push_back(extensions[i].extensionName);
if (!strcmp(extensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
hasKHRSwapchainExtension = true;
}
@@ -237,8 +257,8 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
}
return vkGetInstanceProcAddr(instance, proc_name);
};
- grExtensions.init(getProc, mInstance, mPhysicalDevice, instanceExtensions.size(),
- instanceExtensions.data(), deviceExtensions.size(), deviceExtensions.data());
+ grExtensions.init(getProc, mInstance, mPhysicalDevice, mInstanceExtensions.size(),
+ mInstanceExtensions.data(), mDeviceExtensions.size(), mDeviceExtensions.data());
if (!grExtensions.hasExtension(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1)) {
this->destroy();
@@ -308,8 +328,8 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
queueInfo, // pQueueCreateInfos
0, // layerCount
nullptr, // ppEnabledLayerNames
- (uint32_t) deviceExtensions.size(), // extensionCount
- deviceExtensions.data(), // ppEnabledExtensionNames
+ (uint32_t) mDeviceExtensions.size(), // extensionCount
+ mDeviceExtensions.data(), // ppEnabledExtensionNames
nullptr, // ppEnabledFeatures
};
@@ -351,36 +371,17 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
return true;
}
-static void free_features_extensions_structs(const VkPhysicalDeviceFeatures2& features) {
- // All Vulkan structs that could be part of the features chain will start with the
- // structure type followed by the pNext pointer. We cast to the CommonVulkanHeader
- // so we can get access to the pNext for the next struct.
- struct CommonVulkanHeader {
- VkStructureType sType;
- void* pNext;
- };
-
- void* pNext = features.pNext;
- while (pNext) {
- void* current = pNext;
- pNext = static_cast<CommonVulkanHeader*>(current)->pNext;
- free(current);
- }
-}
-
void VulkanManager::initialize() {
if (mDevice != VK_NULL_HANDLE) {
return;
}
GET_PROC(EnumerateInstanceVersion);
- uint32_t instanceVersion = 0;
- LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&instanceVersion));
- LOG_ALWAYS_FATAL_IF(instanceVersion < VK_MAKE_VERSION(1, 1, 0));
+ LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&mInstanceVersion));
+ LOG_ALWAYS_FATAL_IF(mInstanceVersion < VK_MAKE_VERSION(1, 1, 0));
GrVkExtensions extensions;
- VkPhysicalDeviceFeatures2 features;
- LOG_ALWAYS_FATAL_IF(!this->setupDevice(extensions, features));
+ LOG_ALWAYS_FATAL_IF(!this->setupDevice(extensions, mPhysicalDeviceFeatures2));
mGetDeviceQueue(mDevice, mGraphicsQueueIndex, 0, &mGraphicsQueue);
@@ -397,9 +398,9 @@ void VulkanManager::initialize() {
backendContext.fDevice = mDevice;
backendContext.fQueue = mGraphicsQueue;
backendContext.fGraphicsQueueIndex = mGraphicsQueueIndex;
- backendContext.fInstanceVersion = instanceVersion;
+ backendContext.fInstanceVersion = mInstanceVersion;
backendContext.fVkExtensions = &extensions;
- backendContext.fDeviceFeatures2 = &features;
+ backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2;
backendContext.fGetProc = std::move(getProc);
// create the command pool for the command buffers
@@ -433,13 +434,29 @@ void VulkanManager::initialize() {
LOG_ALWAYS_FATAL_IF(!grContext.get());
mRenderThread.setGrContext(grContext);
- free_features_extensions_structs(features);
-
if (Properties::enablePartialUpdates && Properties::useBufferAge) {
mSwapBehavior = SwapBehavior::BufferAge;
}
}
+VkFunctorInitParams VulkanManager::getVkFunctorInitParams() const {
+ return VkFunctorInitParams{
+ .instance = mInstance,
+ .physical_device = mPhysicalDevice,
+ .device = mDevice,
+ .queue = mGraphicsQueue,
+ .graphics_queue_index = mGraphicsQueueIndex,
+ .instance_version = mInstanceVersion,
+ .enabled_instance_extension_names = mInstanceExtensions.data(),
+ .enabled_instance_extension_names_length =
+ static_cast<uint32_t>(mInstanceExtensions.size()),
+ .enabled_device_extension_names = mDeviceExtensions.data(),
+ .enabled_device_extension_names_length =
+ static_cast<uint32_t>(mDeviceExtensions.size()),
+ .device_features_2 = &mPhysicalDeviceFeatures2,
+ };
+}
+
// Returns the next BackbufferInfo to use for the next draw. The function will make sure all
// previous uses have finished before returning.
VulkanSurface::BackbufferInfo* VulkanManager::getAvailableBackbuffer(VulkanSurface* surface) {
@@ -463,6 +480,32 @@ VulkanSurface::BackbufferInfo* VulkanManager::getAvailableBackbuffer(VulkanSurfa
return backbuffer;
}
+static SkMatrix getPreTransformMatrix(int width, int height,
+ VkSurfaceTransformFlagBitsKHR transform) {
+ switch (transform) {
+ case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
+ return SkMatrix::I();
+ case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
+ return SkMatrix::MakeAll(0, -1, height, 1, 0, 0, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
+ return SkMatrix::MakeAll(-1, 0, width, 0, -1, height, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
+ return SkMatrix::MakeAll(0, 1, 0, -1, 0, width, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR:
+ return SkMatrix::MakeAll(-1, 0, width, 0, 1, 0, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR:
+ return SkMatrix::MakeAll(0, -1, height, -1, 0, width, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR:
+ return SkMatrix::MakeAll(1, 0, 0, 0, -1, height, 0, 0, 1);
+ case VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR:
+ return SkMatrix::MakeAll(0, 1, 0, 1, 0, 0, 0, 0, 1);
+ default:
+ LOG_ALWAYS_FATAL("Unsupported pre transform of swapchain.");
+ }
+ return SkMatrix::I();
+}
+
+
SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface** surfaceOut) {
// Recreate VulkanSurface, if ANativeWindow has been resized.
VulkanSurface* surface = *surfaceOut;
@@ -499,7 +542,7 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface** surfaceOut) {
// maybe use attach somehow? but need a Window
return nullptr;
}
- if (VK_ERROR_OUT_OF_DATE_KHR == res) {
+ if (VK_ERROR_OUT_OF_DATE_KHR == res || VK_SUBOPTIMAL_KHR == res) {
// tear swapchain down and try again
if (!createSwapchain(surface)) {
return nullptr;
@@ -578,6 +621,10 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface** surfaceOut) {
}
backendRT.setVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ surface->mPreTransform = getPreTransformMatrix(surface->windowWidth(),
+ surface->windowHeight(),
+ surface->mTransform);
+
surface->mBackbuffer = std::move(skSurface);
return surface->mBackbuffer.get();
}
@@ -732,6 +779,17 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
return false;
}
+ if (!SkToBool(caps.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)) {
+ return false;
+ }
+ VkSurfaceTransformFlagBitsKHR transform;
+ if (SkToBool(caps.supportedTransforms & caps.currentTransform) &&
+ !SkToBool(caps.currentTransform & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR)) {
+ transform = caps.currentTransform;
+ } else {
+ transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+ }
+
VkExtent2D extent = caps.currentExtent;
// clamp width; to handle currentExtent of -1 and protect us from broken hints
if (extent.width < caps.minImageExtent.width) {
@@ -743,6 +801,16 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
extent.height = caps.minImageExtent.height;
}
SkASSERT(extent.height <= caps.maxImageExtent.height);
+
+ VkExtent2D swapExtent = extent;
+ if (transform == VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||
+ transform == VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR ||
+ transform == VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR ||
+ transform == VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR) {
+ swapExtent.width = extent.height;
+ swapExtent.height = extent.width;
+ }
+
surface->mWindowWidth = extent.width;
surface->mWindowHeight = extent.height;
@@ -758,7 +826,7 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_TRANSFER_DST_BIT;
SkASSERT((caps.supportedUsageFlags & usageFlags) == usageFlags);
- SkASSERT(caps.supportedTransforms & caps.currentTransform);
+
SkASSERT(caps.supportedCompositeAlpha &
(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR | VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR));
VkCompositeAlphaFlagBitsKHR composite_alpha =
@@ -805,7 +873,7 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
swapchainCreateInfo.minImageCount = imageCount;
swapchainCreateInfo.imageFormat = surfaceFormat;
swapchainCreateInfo.imageColorSpace = colorSpace;
- swapchainCreateInfo.imageExtent = extent;
+ swapchainCreateInfo.imageExtent = swapExtent;
swapchainCreateInfo.imageArrayLayers = 1;
swapchainCreateInfo.imageUsage = usageFlags;
@@ -820,7 +888,7 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
swapchainCreateInfo.pQueueFamilyIndices = nullptr;
}
- swapchainCreateInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+ swapchainCreateInfo.preTransform = transform;
swapchainCreateInfo.compositeAlpha = composite_alpha;
swapchainCreateInfo.presentMode = mode;
swapchainCreateInfo.clipped = true;
@@ -831,6 +899,8 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
return false;
}
+ surface->mTransform = transform;
+
// destroy the old swapchain
if (swapchainCreateInfo.oldSwapchain != VK_NULL_HANDLE) {
mDeviceWaitIdle(mDevice);
@@ -840,7 +910,7 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
mDestroySwapchainKHR(mDevice, swapchainCreateInfo.oldSwapchain, nullptr);
}
- createBuffers(surface, surfaceFormat, extent);
+ createBuffers(surface, surfaceFormat, swapExtent);
// The window content is not updated (frozen) until a buffer of the window size is received.
// This prevents temporary stretching of the window after it is resized, but before the first
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index 9eb942c9d6ee..b06eb82dac79 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -45,6 +45,14 @@ public:
sk_sp<SkSurface> getBackBufferSurface() { return mBackbuffer; }
+ // The width and height are are the logical width and height for when submitting draws to the
+ // surface. In reality if the window is rotated the underlying VkImage may have the width and
+ // height swapped.
+ int windowWidth() const { return mWindowWidth; }
+ int windowHeight() const { return mWindowHeight; }
+
+ SkMatrix& preTransform() { return mPreTransform; }
+
private:
friend class VulkanManager;
struct BackbufferInfo {
@@ -84,6 +92,8 @@ private:
sk_sp<SkColorSpace> mColorSpace;
SkColorSpace::Gamut mColorGamut;
SkColorType mColorType;
+ VkSurfaceTransformFlagBitsKHR mTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+ SkMatrix mPreTransform;
};
// This class contains the shared global Vulkan objects, such as VkInstance, VkDevice and VkQueue,
@@ -132,6 +142,9 @@ public:
// Creates a fence that is signaled, when all the pending Vulkan commands are flushed.
status_t createReleaseFence(sp<Fence>& nativeFence);
+ // Returned pointers are owned by VulkanManager.
+ VkFunctorInitParams getVkFunctorInitParams() const;
+
private:
friend class RenderThread;
@@ -234,6 +247,12 @@ private:
VkCommandBuffer mDummyCB = VK_NULL_HANDLE;
+ // Variables saved to populate VkFunctorInitParams.
+ uint32_t mInstanceVersion = 0u;
+ std::vector<const char*> mInstanceExtensions;
+ std::vector<const char*> mDeviceExtensions;
+ VkPhysicalDeviceFeatures2 mPhysicalDeviceFeatures2{};
+
enum class SwapBehavior {
Discard,
BufferAge,
diff --git a/libs/hwui/service/GraphicsStatsService.cpp b/libs/hwui/service/GraphicsStatsService.cpp
index 3d50d2d7e59c..8a16b2077f6f 100644
--- a/libs/hwui/service/GraphicsStatsService.cpp
+++ b/libs/hwui/service/GraphicsStatsService.cpp
@@ -48,7 +48,7 @@ static void dumpAsTextToFd(protos::GraphicsStatsProto* proto, int outFd);
class FileDescriptor {
public:
- FileDescriptor(int fd) : mFd(fd) {}
+ explicit FileDescriptor(int fd) : mFd(fd) {}
~FileDescriptor() {
if (mFd != -1) {
close(mFd);
@@ -56,7 +56,7 @@ public:
}
}
bool valid() { return mFd != -1; }
- operator int() { return mFd; }
+ operator int() { return mFd; } // NOLINT(google-explicit-constructor)
private:
int mFd;
@@ -64,7 +64,7 @@ private:
class FileOutputStreamLite : public io::ZeroCopyOutputStream {
public:
- FileOutputStreamLite(int fd) : mCopyAdapter(fd), mImpl(&mCopyAdapter) {}
+ explicit FileOutputStreamLite(int fd) : mCopyAdapter(fd), mImpl(&mCopyAdapter) {}
virtual ~FileOutputStreamLite() {}
int GetErrno() { return mCopyAdapter.mErrno; }
@@ -82,7 +82,7 @@ private:
int mFd;
int mErrno = 0;
- FDAdapter(int fd) : mFd(fd) {}
+ explicit FDAdapter(int fd) : mFd(fd) {}
virtual ~FDAdapter() {}
virtual bool Write(const void* buffer, int size) override {
@@ -139,6 +139,7 @@ bool GraphicsStatsService::parseFromFile(const std::string& path,
uint32_t file_version = *reinterpret_cast<uint32_t*>(addr);
if (file_version != sCurrentFileVersion) {
ALOGW("file_version mismatch! expected %d got %d", sCurrentFileVersion, file_version);
+ munmap(addr, sb.st_size);
return false;
}
@@ -150,6 +151,7 @@ bool GraphicsStatsService::parseFromFile(const std::string& path,
ALOGW("Parse failed on '%s' error='%s'", path.c_str(),
output->InitializationErrorString().c_str());
}
+ munmap(addr, sb.st_size);
return success;
}
diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp
index 7aa9b82e3583..16a27598c56a 100644
--- a/libs/hwui/tests/common/TestUtils.cpp
+++ b/libs/hwui/tests/common/TestUtils.cpp
@@ -82,7 +82,7 @@ void TestUtils::drawUtf8ToCanvas(Canvas* canvas, const char* text, const SkPaint
float y) {
auto utf16 = asciiToUtf16(text);
uint32_t length = strlen(text);
- SkPaint glyphPaint(paint);
+ Paint glyphPaint(paint);
glyphPaint.setTextEncoding(kGlyphID_SkTextEncoding);
canvas->drawText(utf16.get(), length, // text buffer
0, length, // draw range
@@ -93,7 +93,7 @@ void TestUtils::drawUtf8ToCanvas(Canvas* canvas, const char* text, const SkPaint
void TestUtils::drawUtf8ToCanvas(Canvas* canvas, const char* text, const SkPaint& paint,
const SkPath& path) {
auto utf16 = asciiToUtf16(text);
- SkPaint glyphPaint(paint);
+ Paint glyphPaint(paint);
glyphPaint.setTextEncoding(kGlyphID_SkTextEncoding);
canvas->drawTextOnPath(utf16.get(), strlen(text), minikin::Bidi::LTR, path, 0, 0, glyphPaint,
nullptr);
diff --git a/libs/hwui/tests/common/scenes/BitmapFillrate.cpp b/libs/hwui/tests/common/scenes/BitmapFillrate.cpp
index 1d3d60716d68..5af7d43d7f66 100644
--- a/libs/hwui/tests/common/scenes/BitmapFillrate.cpp
+++ b/libs/hwui/tests/common/scenes/BitmapFillrate.cpp
@@ -31,7 +31,7 @@ static bool _BitmapFillrate(
class BitmapFillrate : public TestScene {
public:
- BitmapFillrate(BitmapAllocationTestUtils::BitmapAllocator allocator)
+ explicit BitmapFillrate(BitmapAllocationTestUtils::BitmapAllocator allocator)
: TestScene(), mAllocator(allocator) {}
void createContent(int width, int height, Canvas& canvas) override {
@@ -70,4 +70,4 @@ private:
BitmapAllocationTestUtils::BitmapAllocator mAllocator;
std::vector<sp<RenderNode> > mNodes;
-}; \ No newline at end of file
+};
diff --git a/libs/hwui/tests/common/scenes/BitmapShaders.cpp b/libs/hwui/tests/common/scenes/BitmapShaders.cpp
index ad11a1d32310..510766073b08 100644
--- a/libs/hwui/tests/common/scenes/BitmapShaders.cpp
+++ b/libs/hwui/tests/common/scenes/BitmapShaders.cpp
@@ -26,7 +26,7 @@ static bool _BitmapShaders(BitmapAllocationTestUtils::registerBitmapAllocationSc
class BitmapShaders : public TestScene {
public:
- BitmapShaders(BitmapAllocationTestUtils::BitmapAllocator allocator)
+ explicit BitmapShaders(BitmapAllocationTestUtils::BitmapAllocator allocator)
: TestScene(), mAllocator(allocator) {}
sp<RenderNode> card;
diff --git a/libs/hwui/tests/common/scenes/TvApp.cpp b/libs/hwui/tests/common/scenes/TvApp.cpp
index a64e8444a9b1..286f5f194aed 100644
--- a/libs/hwui/tests/common/scenes/TvApp.cpp
+++ b/libs/hwui/tests/common/scenes/TvApp.cpp
@@ -48,7 +48,7 @@ static bool _TvAppNoRoundedCornerColorFilter(
class TvApp : public TestScene {
public:
- TvApp(BitmapAllocationTestUtils::BitmapAllocator allocator)
+ explicit TvApp(BitmapAllocationTestUtils::BitmapAllocator allocator)
: TestScene(), mAllocator(allocator) {}
sp<RenderNode> mBg;
@@ -232,7 +232,7 @@ private:
class TvAppNoRoundedCorner : public TvApp {
public:
- TvAppNoRoundedCorner(BitmapAllocationTestUtils::BitmapAllocator allocator) : TvApp(allocator) {}
+ explicit TvAppNoRoundedCorner(BitmapAllocationTestUtils::BitmapAllocator allocator) : TvApp(allocator) {}
private:
virtual float roundedCornerRadius() override { return dp(0); }
@@ -240,7 +240,7 @@ private:
class TvAppColorFilter : public TvApp {
public:
- TvAppColorFilter(BitmapAllocationTestUtils::BitmapAllocator allocator) : TvApp(allocator) {}
+ explicit TvAppColorFilter(BitmapAllocationTestUtils::BitmapAllocator allocator) : TvApp(allocator) {}
private:
virtual bool useOverlay() override { return false; }
@@ -248,7 +248,7 @@ private:
class TvAppNoRoundedCornerColorFilter : public TvApp {
public:
- TvAppNoRoundedCornerColorFilter(BitmapAllocationTestUtils::BitmapAllocator allocator)
+ explicit TvAppNoRoundedCornerColorFilter(BitmapAllocationTestUtils::BitmapAllocator allocator)
: TvApp(allocator) {}
private:
diff --git a/libs/hwui/tests/macrobench/main.cpp b/libs/hwui/tests/macrobench/main.cpp
index 524dfb0fe4ef..174a14080eff 100644
--- a/libs/hwui/tests/macrobench/main.cpp
+++ b/libs/hwui/tests/macrobench/main.cpp
@@ -19,6 +19,8 @@
#include "Properties.h"
#include "hwui/Typeface.h"
+#include "HardwareBitmapUploader.h"
+#include "renderthread/RenderProxy.h"
#include <benchmark/benchmark.h>
#include <getopt.h>
@@ -353,6 +355,9 @@ int main(int argc, char* argv[]) {
gBenchmarkReporter->Finalize();
}
+ renderthread::RenderProxy::trimMemory(100);
+ HardwareBitmapUploader::terminate();
+
LeakChecker::checkForLeaks();
return 0;
}
diff --git a/libs/hwui/tests/unit/SkiaCanvasTests.cpp b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
index f3a764874e2b..f6178aff0c2e 100644
--- a/libs/hwui/tests/unit/SkiaCanvasTests.cpp
+++ b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
@@ -44,8 +44,8 @@ TEST(SkiaCanvas, drawShadowLayer) {
}
TEST(SkiaCanvas, colorSpaceXform) {
- sk_sp<SkColorSpace> adobe = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
- SkColorSpace::kAdobeRGB_Gamut);
+ sk_sp<SkColorSpace> adobe = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
+ SkNamedGamut::kAdobeRGB);
SkImageInfo adobeInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kOpaque_SkAlphaType, adobe);
sk_sp<Bitmap> adobeBitmap = Bitmap::allocateHeapBitmap(adobeInfo);
diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
index 3c06dab36fe4..e86cf42fee4d 100644
--- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp
+++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
@@ -51,7 +51,8 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, renderFrame) {
auto surface = SkSurface::MakeRasterN32Premul(1, 1);
surface->getCanvas()->drawColor(SK_ColorBLUE, SkBlendMode::kSrcOver);
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorRED);
}
@@ -83,7 +84,8 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, testOnPrepareTree) {
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
// drawFrame will crash if "SkiaPipeline::onPrepareTree" did not clean invalid VD pointer
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorRED);
}
@@ -104,10 +106,12 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, renderFrameCheckOpaque) {
auto surface = SkSurface::MakeRasterN32Premul(2, 2);
surface->getCanvas()->drawColor(SK_ColorBLUE, SkBlendMode::kSrcOver);
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, true, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, true, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
ASSERT_EQ(TestUtils::getColor(surface, 0, 1), SK_ColorGREEN);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, false, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, false, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned int)SK_ColorTRANSPARENT);
ASSERT_EQ(TestUtils::getColor(surface, 0, 1), SK_ColorGREEN);
}
@@ -126,7 +130,8 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, renderFrameCheckDirtyRect) {
auto surface = SkSurface::MakeRasterN32Premul(2, 2);
surface->getCanvas()->drawColor(SK_ColorBLUE, SkBlendMode::kSrcOver);
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, true, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, true, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
ASSERT_EQ(TestUtils::getColor(surface, 1, 0), SK_ColorBLUE);
ASSERT_EQ(TestUtils::getColor(surface, 0, 1), SK_ColorRED);
@@ -198,32 +203,38 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, renderOverdraw) {
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorBLUE);
// Single draw, should be white.
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), SK_ColorWHITE);
// 1 Overdraw, should be blue blended onto white.
renderNodes.push_back(whiteNode);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned)0xffd0d0ff);
// 2 Overdraw, should be green blended onto white
renderNodes.push_back(whiteNode);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned)0xffd0ffd0);
// 3 Overdraw, should be pink blended onto white.
renderNodes.push_back(whiteNode);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned)0xffffc0c0);
// 4 Overdraw, should be red blended onto white.
renderNodes.push_back(whiteNode);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned)0xffff8080);
// 5 Overdraw, should be red blended onto white.
renderNodes.push_back(whiteNode);
- pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
+ SkMatrix::I());
ASSERT_EQ(TestUtils::getColor(surface, 0, 0), (unsigned)0xffff8080);
}
@@ -308,7 +319,8 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, deferRenderNodeScene) {
SkRect dirty = SkRect::MakeWH(800, 600);
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
sk_sp<DeferLayer<DeferTestCanvas>> surface(new DeferLayer<DeferTestCanvas>());
- pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true, contentDrawBounds, surface);
+ pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true, contentDrawBounds, surface,
+ SkMatrix::I());
EXPECT_EQ(4, surface->canvas()->mDrawCounter);
}
@@ -339,7 +351,43 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, clipped) {
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
sk_sp<DeferLayer<ClippedTestCanvas>> surface(new DeferLayer<ClippedTestCanvas>());
pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true,
- SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface);
+ SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface, SkMatrix::I());
+ EXPECT_EQ(1, surface->canvas()->mDrawCounter);
+}
+
+// Test renderFrame with a dirty clip and a pre-transform matrix.
+RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, clipped_rotated) {
+ static const int CANVAS_WIDTH = 200;
+ static const int CANVAS_HEIGHT = 100;
+ static const SkMatrix rotateMatrix = SkMatrix::MakeAll(0, -1, CANVAS_HEIGHT, 1, 0, 0, 0, 0, 1);
+ static const SkRect dirty = SkRect::MakeLTRB(10, 20, 20, 40);
+ class ClippedTestCanvas : public SkCanvas {
+ public:
+ ClippedTestCanvas() : SkCanvas(CANVAS_WIDTH, CANVAS_HEIGHT) {}
+ void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*) override {
+ EXPECT_EQ(0, mDrawCounter++);
+ // Expect clip to be rotated.
+ EXPECT_EQ(SkRect::MakeLTRB(CANVAS_HEIGHT - dirty.fTop - dirty.height(), dirty.fLeft,
+ CANVAS_HEIGHT - dirty.fTop, dirty.fLeft + dirty.width()),
+ TestUtils::getClipBounds(this));
+ EXPECT_EQ(rotateMatrix, getTotalMatrix());
+ }
+ int mDrawCounter = 0;
+ };
+
+ std::vector<sp<RenderNode>> nodes;
+ nodes.push_back(TestUtils::createSkiaNode(
+ 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT,
+ [](RenderProperties& props, SkiaRecordingCanvas& canvas) {
+ sk_sp<Bitmap> bitmap(TestUtils::createBitmap(CANVAS_WIDTH, CANVAS_HEIGHT));
+ canvas.drawBitmap(*bitmap, 0, 0, nullptr);
+ }));
+
+ LayerUpdateQueue layerUpdateQueue;
+ auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
+ sk_sp<DeferLayer<ClippedTestCanvas>> surface(new DeferLayer<ClippedTestCanvas>());
+ pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true,
+ SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface, rotateMatrix);
EXPECT_EQ(1, surface->canvas()->mDrawCounter);
}
@@ -369,7 +417,7 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, clip_replace) {
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
sk_sp<DeferLayer<ClipReplaceTestCanvas>> surface(new DeferLayer<ClipReplaceTestCanvas>());
pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true,
- SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface);
+ SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface, SkMatrix::I());
EXPECT_EQ(1, surface->canvas()->mDrawCounter);
}
diff --git a/libs/hwui/tests/unit/SkiaRenderPropertiesTests.cpp b/libs/hwui/tests/unit/SkiaRenderPropertiesTests.cpp
index 479c462bd1a6..635429dea359 100644
--- a/libs/hwui/tests/unit/SkiaRenderPropertiesTests.cpp
+++ b/libs/hwui/tests/unit/SkiaRenderPropertiesTests.cpp
@@ -44,7 +44,7 @@ static void testProperty(std::function<void(RenderProperties&)> propSetupCallbac
static const int CANVAS_HEIGHT = 100;
class PropertyTestCanvas : public TestCanvasBase {
public:
- PropertyTestCanvas(std::function<void(const SkCanvas&)> callback)
+ explicit PropertyTestCanvas(std::function<void(const SkCanvas&)> callback)
: TestCanvasBase(CANVAS_WIDTH, CANVAS_HEIGHT), mCallback(callback) {}
void onDrawRect(const SkRect& rect, const SkPaint& paint) override {
EXPECT_EQ(mDrawCounter++, 0);
diff --git a/libs/hwui/tests/unit/ThreadBaseTests.cpp b/libs/hwui/tests/unit/ThreadBaseTests.cpp
index 1168ff211202..817c1f3d3e43 100644
--- a/libs/hwui/tests/unit/ThreadBaseTests.cpp
+++ b/libs/hwui/tests/unit/ThreadBaseTests.cpp
@@ -95,7 +95,7 @@ TEST(ThreadBase, lifecyclePerf) {
};
struct Counter {
- Counter(EventCount* count) : mCount(count) { mCount->construct++; }
+ explicit Counter(EventCount* count) : mCount(count) { mCount->construct++; }
Counter(const Counter& other) : mCount(other.mCount) {
if (mCount) mCount->copy++;
@@ -148,4 +148,4 @@ TEST(ThreadBase, lifecycle) {
ASSERT_EQ(1, dummyObject->getStrongCount());
ASSERT_EQ(2, lifecycleTestHelper(dummyObject));
ASSERT_EQ(1, dummyObject->getStrongCount());
-} \ No newline at end of file
+}
diff --git a/libs/hwui/thread/ThreadBase.h b/libs/hwui/thread/ThreadBase.h
index f9de8a5037e5..8cdcc46b97fb 100644
--- a/libs/hwui/thread/ThreadBase.h
+++ b/libs/hwui/thread/ThreadBase.h
@@ -27,7 +27,7 @@
namespace android::uirenderer {
-class ThreadBase : protected Thread {
+class ThreadBase : public Thread {
PREVENT_COPY_AND_ASSIGN(ThreadBase);
public:
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp
index dc347f615d98..4415a593f6ee 100644
--- a/libs/hwui/utils/Color.cpp
+++ b/libs/hwui/utils/Color.cpp
@@ -25,38 +25,6 @@
namespace android {
namespace uirenderer {
-static inline bool almostEqual(float a, float b) {
- return std::abs(a - b) < 1e-2f;
-}
-
-bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace) {
- if (colorSpace == nullptr) return true;
- if (colorSpace->isSRGB()) return true;
-
- SkColorSpaceTransferFn transferFunction;
- if (colorSpace->isNumericalTransferFn(&transferFunction)) {
- // sRGB transfer function params:
- const float sRGBParamA = 1 / 1.055f;
- const float sRGBParamB = 0.055f / 1.055f;
- const float sRGBParamC = 1 / 12.92f;
- const float sRGBParamD = 0.04045f;
- const float sRGBParamE = 0.0f;
- const float sRGBParamF = 0.0f;
- const float sRGBParamG = 2.4f;
-
- // This comparison will catch Display P3
- return almostEqual(sRGBParamA, transferFunction.fA) &&
- almostEqual(sRGBParamB, transferFunction.fB) &&
- almostEqual(sRGBParamC, transferFunction.fC) &&
- almostEqual(sRGBParamD, transferFunction.fD) &&
- almostEqual(sRGBParamE, transferFunction.fE) &&
- almostEqual(sRGBParamF, transferFunction.fF) &&
- almostEqual(sRGBParamG, transferFunction.fG);
- }
-
- return false;
-}
-
android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) {
switch (colorType) {
case kRGBA_8888_SkColorType:
@@ -79,19 +47,19 @@ android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) {
sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
- SkColorSpace::Gamut gamut;
+ skcms_Matrix3x3 gamut;
switch (dataspace & HAL_DATASPACE_STANDARD_MASK) {
case HAL_DATASPACE_STANDARD_BT709:
- gamut = SkColorSpace::kSRGB_Gamut;
+ gamut = SkNamedGamut::kSRGB;
break;
case HAL_DATASPACE_STANDARD_BT2020:
- gamut = SkColorSpace::kRec2020_Gamut;
+ gamut = SkNamedGamut::kRec2020;
break;
case HAL_DATASPACE_STANDARD_DCI_P3:
- gamut = SkColorSpace::kDCIP3_D65_Gamut;
+ gamut = SkNamedGamut::kDCIP3;
break;
case HAL_DATASPACE_STANDARD_ADOBE_RGB:
- gamut = SkColorSpace::kAdobeRGB_Gamut;
+ gamut = SkNamedGamut::kAdobeRGB;
break;
case HAL_DATASPACE_STANDARD_UNSPECIFIED:
return nullptr;
@@ -109,9 +77,9 @@ sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
switch (dataspace & HAL_DATASPACE_TRANSFER_MASK) {
case HAL_DATASPACE_TRANSFER_LINEAR:
- return SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, gamut);
+ return SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, gamut);
case HAL_DATASPACE_TRANSFER_SRGB:
- return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, gamut);
+ return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut);
case HAL_DATASPACE_TRANSFER_GAMMA2_2:
return SkColorSpace::MakeRGB({2.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
case HAL_DATASPACE_TRANSFER_GAMMA2_6:
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index 4473ce632b1b..388025207ed6 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -111,11 +111,6 @@ static constexpr float EOCF(float srgb) {
#endif
}
-// Returns whether the specified color space's transfer function can be
-// approximated with the native sRGB transfer function. This method
-// returns true for sRGB, gamma 2.2 and Display P3 for instance
-bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
-
android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType);
ANDROID_API sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace);
diff --git a/libs/hwui/utils/LinearAllocator.h b/libs/hwui/utils/LinearAllocator.h
index b401fcf58f76..9c4a1be4b269 100644
--- a/libs/hwui/utils/LinearAllocator.h
+++ b/libs/hwui/utils/LinearAllocator.h
@@ -168,7 +168,7 @@ public:
};
// enable allocators to be constructed from other templated types
template <class U>
- LinearStdAllocator(const LinearStdAllocator<U>& other) // NOLINT(implicit)
+ LinearStdAllocator(const LinearStdAllocator<U>& other) // NOLINT(google-explicit-constructor)
: linearAllocator(other.linearAllocator) {}
T* allocate(size_t num, const void* = 0) {
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index 0a90f85cda0e..d742cc34b57e 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -39,7 +39,7 @@ protected:
virtual ~WeakLooperCallback() { }
public:
- WeakLooperCallback(const wp<LooperCallback>& callback) :
+ explicit WeakLooperCallback(const wp<LooperCallback>& callback) :
mCallback(callback) {
}
@@ -89,10 +89,6 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>&
mLocked.animationPending = false;
- mLocked.displayWidth = -1;
- mLocked.displayHeight = -1;
- mLocked.displayOrientation = DISPLAY_ORIENTATION_0;
-
mLocked.presentation = PRESENTATION_POINTER;
mLocked.presentationChanged = false;
@@ -110,15 +106,6 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>&
mLocked.lastFrameUpdatedTime = 0;
mLocked.buttonState = 0;
-
- mPolicy->loadPointerIcon(&mLocked.pointerIcon);
-
- loadResources();
-
- if (mLocked.pointerIcon.isValid()) {
- mLocked.pointerIconChanged = true;
- updatePointerLocked();
- }
}
PointerController::~PointerController() {
@@ -144,23 +131,15 @@ bool PointerController::getBounds(float* outMinX, float* outMinY,
bool PointerController::getBoundsLocked(float* outMinX, float* outMinY,
float* outMaxX, float* outMaxY) const {
- if (mLocked.displayWidth <= 0 || mLocked.displayHeight <= 0) {
+
+ if (!mLocked.viewport.isValid()) {
return false;
}
- *outMinX = 0;
- *outMinY = 0;
- switch (mLocked.displayOrientation) {
- case DISPLAY_ORIENTATION_90:
- case DISPLAY_ORIENTATION_270:
- *outMaxX = mLocked.displayHeight - 1;
- *outMaxY = mLocked.displayWidth - 1;
- break;
- default:
- *outMaxX = mLocked.displayWidth - 1;
- *outMaxY = mLocked.displayHeight - 1;
- break;
- }
+ *outMinX = mLocked.viewport.logicalLeft;
+ *outMinY = mLocked.viewport.logicalTop;
+ *outMaxX = mLocked.viewport.logicalRight - 1;
+ *outMaxY = mLocked.viewport.logicalBottom - 1;
return true;
}
@@ -231,6 +210,12 @@ void PointerController::getPosition(float* outX, float* outY) const {
*outY = mLocked.pointerY;
}
+int32_t PointerController::getDisplayId() const {
+ AutoMutex _l(mLock);
+
+ return mLocked.viewport.displayId;
+}
+
void PointerController::fade(Transition transition) {
AutoMutex _l(mLock);
@@ -270,7 +255,7 @@ void PointerController::setPresentation(Presentation presentation) {
if (presentation == PRESENTATION_POINTER && mLocked.additionalMouseResources.empty()) {
mPolicy->loadAdditionalMouseResources(&mLocked.additionalMouseResources,
- &mLocked.animationResources);
+ &mLocked.animationResources, mLocked.viewport.displayId);
}
if (mLocked.presentation != presentation) {
@@ -355,48 +340,56 @@ void PointerController::setInactivityTimeout(InactivityTimeout inactivityTimeout
void PointerController::reloadPointerResources() {
AutoMutex _l(mLock);
- loadResources();
+ loadResourcesLocked();
+ updatePointerLocked();
+}
- if (mLocked.presentation == PRESENTATION_POINTER) {
- mLocked.additionalMouseResources.clear();
- mLocked.animationResources.clear();
- mPolicy->loadPointerIcon(&mLocked.pointerIcon);
- mPolicy->loadAdditionalMouseResources(&mLocked.additionalMouseResources,
- &mLocked.animationResources);
- }
+/**
+ * The viewport values for deviceHeight and deviceWidth have already been adjusted for rotation,
+ * so here we are getting the dimensions in the original, unrotated orientation (orientation 0).
+ */
+static void getNonRotatedSize(const DisplayViewport& viewport, int32_t& width, int32_t& height) {
+ width = viewport.deviceWidth;
+ height = viewport.deviceHeight;
- mLocked.presentationChanged = true;
- updatePointerLocked();
+ if (viewport.orientation == DISPLAY_ORIENTATION_90
+ || viewport.orientation == DISPLAY_ORIENTATION_270) {
+ std::swap(width, height);
+ }
}
-void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_t orientation) {
+void PointerController::setDisplayViewport(const DisplayViewport& viewport) {
AutoMutex _l(mLock);
-
- // Adjust to use the display's unrotated coordinate frame.
- if (orientation == DISPLAY_ORIENTATION_90
- || orientation == DISPLAY_ORIENTATION_270) {
- int32_t temp = height;
- height = width;
- width = temp;
+ if (viewport == mLocked.viewport) {
+ return;
}
- if (mLocked.displayWidth != width || mLocked.displayHeight != height) {
- mLocked.displayWidth = width;
- mLocked.displayHeight = height;
+ const DisplayViewport oldViewport = mLocked.viewport;
+ mLocked.viewport = viewport;
+
+ int32_t oldDisplayWidth, oldDisplayHeight;
+ getNonRotatedSize(oldViewport, oldDisplayWidth, oldDisplayHeight);
+ int32_t newDisplayWidth, newDisplayHeight;
+ getNonRotatedSize(viewport, newDisplayWidth, newDisplayHeight);
+
+ // Reset cursor position to center if size or display changed.
+ if (oldViewport.displayId != viewport.displayId
+ || oldDisplayWidth != newDisplayWidth
+ || oldDisplayHeight != newDisplayHeight) {
float minX, minY, maxX, maxY;
if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) {
mLocked.pointerX = (minX + maxX) * 0.5f;
mLocked.pointerY = (minY + maxY) * 0.5f;
+ // Reload icon resources for density may be changed.
+ loadResourcesLocked();
} else {
mLocked.pointerX = 0;
mLocked.pointerY = 0;
}
fadeOutAndReleaseAllSpotsLocked();
- }
-
- if (mLocked.displayOrientation != orientation) {
+ } else if (oldViewport.orientation != viewport.orientation) {
// Apply offsets to convert from the pixel top-left corner position to the pixel center.
// This creates an invariant frame of reference that we can easily rotate when
// taking into account that the pointer may be located at fractional pixel offsets.
@@ -405,37 +398,37 @@ void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_
float temp;
// Undo the previous rotation.
- switch (mLocked.displayOrientation) {
+ switch (oldViewport.orientation) {
case DISPLAY_ORIENTATION_90:
temp = x;
- x = mLocked.displayWidth - y;
+ x = oldViewport.deviceHeight - y;
y = temp;
break;
case DISPLAY_ORIENTATION_180:
- x = mLocked.displayWidth - x;
- y = mLocked.displayHeight - y;
+ x = oldViewport.deviceWidth - x;
+ y = oldViewport.deviceHeight - y;
break;
case DISPLAY_ORIENTATION_270:
temp = x;
x = y;
- y = mLocked.displayHeight - temp;
+ y = oldViewport.deviceWidth - temp;
break;
}
// Perform the new rotation.
- switch (orientation) {
+ switch (viewport.orientation) {
case DISPLAY_ORIENTATION_90:
temp = x;
x = y;
- y = mLocked.displayWidth - temp;
+ y = viewport.deviceHeight - temp;
break;
case DISPLAY_ORIENTATION_180:
- x = mLocked.displayWidth - x;
- y = mLocked.displayHeight - y;
+ x = viewport.deviceWidth - x;
+ y = viewport.deviceHeight - y;
break;
case DISPLAY_ORIENTATION_270:
temp = x;
- x = mLocked.displayHeight - y;
+ x = viewport.deviceWidth - y;
y = temp;
break;
}
@@ -444,7 +437,6 @@ void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_
// and save the results.
mLocked.pointerX = x - 0.5f;
mLocked.pointerY = y - 0.5f;
- mLocked.displayOrientation = orientation;
}
updatePointerLocked();
@@ -614,11 +606,16 @@ void PointerController::removeInactivityTimeoutLocked() {
mLooper->removeMessages(mHandler, MSG_INACTIVITY_TIMEOUT);
}
-void PointerController::updatePointerLocked() {
+void PointerController::updatePointerLocked() REQUIRES(mLock) {
+ if (!mLocked.viewport.isValid()) {
+ return;
+ }
+
mSpriteController->openTransaction();
mLocked.pointerSprite->setLayer(Sprite::BASE_LAYER_POINTER);
mLocked.pointerSprite->setPosition(mLocked.pointerX, mLocked.pointerY);
+ mLocked.pointerSprite->setDisplayId(mLocked.viewport.displayId);
if (mLocked.pointerAlpha > 0) {
mLocked.pointerSprite->setAlpha(mLocked.pointerAlpha);
@@ -729,8 +726,18 @@ void PointerController::fadeOutAndReleaseAllSpotsLocked() {
}
}
-void PointerController::loadResources() {
- mPolicy->loadPointerResources(&mResources);
+void PointerController::loadResourcesLocked() REQUIRES(mLock) {
+ mPolicy->loadPointerResources(&mResources, mLocked.viewport.displayId);
+
+ if (mLocked.presentation == PRESENTATION_POINTER) {
+ mLocked.additionalMouseResources.clear();
+ mLocked.animationResources.clear();
+ mPolicy->loadPointerIcon(&mLocked.pointerIcon, mLocked.viewport.displayId);
+ mPolicy->loadAdditionalMouseResources(&mLocked.additionalMouseResources,
+ &mLocked.animationResources, mLocked.viewport.displayId);
+ }
+
+ mLocked.pointerIconChanged = true;
}
diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h
index 7f4e5a59c9b6..be057867890d 100644
--- a/libs/input/PointerController.h
+++ b/libs/input/PointerController.h
@@ -23,6 +23,7 @@
#include <vector>
#include <ui/DisplayInfo.h>
+#include <input/DisplayViewport.h>
#include <input/Input.h>
#include <PointerControllerInterface.h>
#include <utils/BitSet.h>
@@ -61,10 +62,10 @@ protected:
virtual ~PointerControllerPolicyInterface() { }
public:
- virtual void loadPointerIcon(SpriteIcon* icon) = 0;
- virtual void loadPointerResources(PointerResources* outResources) = 0;
+ virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId) = 0;
+ virtual void loadPointerResources(PointerResources* outResources, int32_t displayId) = 0;
virtual void loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources,
- std::map<int32_t, PointerAnimation>* outAnimationResources) = 0;
+ std::map<int32_t, PointerAnimation>* outAnimationResources, int32_t displayId) = 0;
virtual int32_t getDefaultPointerIconId() = 0;
virtual int32_t getCustomPointerIconId() = 0;
};
@@ -96,6 +97,7 @@ public:
virtual int32_t getButtonState() const;
virtual void setPosition(float x, float y);
virtual void getPosition(float* outX, float* outY) const;
+ virtual int32_t getDisplayId() const;
virtual void fade(Transition transition);
virtual void unfade(Transition transition);
@@ -106,7 +108,7 @@ public:
void updatePointerIcon(int32_t iconId);
void setCustomPointerIcon(const SpriteIcon& icon);
- void setDisplayViewport(int32_t width, int32_t height, int32_t orientation);
+ void setDisplayViewport(const DisplayViewport& viewport);
void setInactivityTimeout(InactivityTimeout inactivityTimeout);
void reloadPointerResources();
@@ -156,9 +158,7 @@ private:
size_t animationFrameIndex;
nsecs_t lastFrameUpdatedTime;
- int32_t displayWidth;
- int32_t displayHeight;
- int32_t displayOrientation;
+ DisplayViewport viewport;
InactivityTimeout inactivityTimeout;
@@ -182,7 +182,7 @@ private:
Vector<Spot*> spots;
Vector<sp<Sprite> > recycledSprites;
- } mLocked;
+ } mLocked GUARDED_BY(mLock);
bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const;
void setPositionLocked(float x, float y);
@@ -207,7 +207,7 @@ private:
void fadeOutAndReleaseSpotLocked(Spot* spot);
void fadeOutAndReleaseAllSpotsLocked();
- void loadResources();
+ void loadResourcesLocked();
};
} // namespace android
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index eb2bc98ec9e9..c1868d3a94d6 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -144,13 +144,16 @@ void SpriteController::doUpdateSprites() {
}
}
- // Resize sprites if needed.
+ // Resize and/or reparent sprites if needed.
SurfaceComposerClient::Transaction t;
bool needApplyTransaction = false;
for (size_t i = 0; i < numSprites; i++) {
SpriteUpdate& update = updates.editItemAt(i);
+ if (update.state.surfaceControl == nullptr) {
+ continue;
+ }
- if (update.state.surfaceControl != NULL && update.state.wantSurfaceVisible()) {
+ if (update.state.wantSurfaceVisible()) {
int32_t desiredWidth = update.state.icon.bitmap.width();
int32_t desiredHeight = update.state.icon.bitmap.height();
if (update.state.surfaceWidth < desiredWidth
@@ -170,6 +173,12 @@ void SpriteController::doUpdateSprites() {
}
}
}
+
+ // If surface is a new one, we have to set right layer stack.
+ if (update.surfaceChanged || update.state.dirty & DIRTY_DISPLAY_ID) {
+ t.setLayerStack(update.state.surfaceControl, update.state.displayId);
+ needApplyTransaction = true;
+ }
}
if (needApplyTransaction) {
t.apply();
@@ -236,7 +245,7 @@ void SpriteController::doUpdateSprites() {
if (update.state.surfaceControl != NULL && (becomingVisible || becomingHidden
|| (wantSurfaceVisibleAndDrawn && (update.state.dirty & (DIRTY_ALPHA
| DIRTY_POSITION | DIRTY_TRANSFORMATION_MATRIX | DIRTY_LAYER
- | DIRTY_VISIBILITY | DIRTY_HOTSPOT))))) {
+ | DIRTY_VISIBILITY | DIRTY_HOTSPOT | DIRTY_DISPLAY_ID))))) {
needApplyTransaction = true;
if (wantSurfaceVisibleAndDrawn
@@ -445,6 +454,15 @@ void SpriteController::SpriteImpl::setTransformationMatrix(
}
}
+void SpriteController::SpriteImpl::setDisplayId(int32_t displayId) {
+ AutoMutex _l(mController->mLock);
+
+ if (mLocked.state.displayId != displayId) {
+ mLocked.state.displayId = displayId;
+ invalidateLocked(DIRTY_DISPLAY_ID);
+ }
+}
+
void SpriteController::SpriteImpl::invalidateLocked(uint32_t dirty) {
bool wasDirty = mLocked.state.dirty;
mLocked.state.dirty |= dirty;
diff --git a/libs/input/SpriteController.h b/libs/input/SpriteController.h
index 31e43e9b99e5..5b216f50d113 100644
--- a/libs/input/SpriteController.h
+++ b/libs/input/SpriteController.h
@@ -125,6 +125,9 @@ public:
/* Sets the sprite transformation matrix. */
virtual void setTransformationMatrix(const SpriteTransformationMatrix& matrix) = 0;
+
+ /* Sets the id of the display where the sprite should be shown. */
+ virtual void setDisplayId(int32_t displayId) = 0;
};
/*
@@ -170,6 +173,7 @@ private:
DIRTY_LAYER = 1 << 4,
DIRTY_VISIBILITY = 1 << 5,
DIRTY_HOTSPOT = 1 << 6,
+ DIRTY_DISPLAY_ID = 1 << 7,
};
/* Describes the state of a sprite.
@@ -180,7 +184,7 @@ private:
struct SpriteState {
inline SpriteState() :
dirty(0), visible(false),
- positionX(0), positionY(0), layer(0), alpha(1.0f),
+ positionX(0), positionY(0), layer(0), alpha(1.0f), displayId(ADISPLAY_ID_DEFAULT),
surfaceWidth(0), surfaceHeight(0), surfaceDrawn(false), surfaceVisible(false) {
}
@@ -193,6 +197,7 @@ private:
int32_t layer;
float alpha;
SpriteTransformationMatrix transformationMatrix;
+ int32_t displayId;
sp<SurfaceControl> surfaceControl;
int32_t surfaceWidth;
@@ -225,6 +230,7 @@ private:
virtual void setLayer(int32_t layer);
virtual void setAlpha(float alpha);
virtual void setTransformationMatrix(const SpriteTransformationMatrix& matrix);
+ virtual void setDisplayId(int32_t displayId);
inline const SpriteState& getStateLocked() const {
return mLocked.state;
diff --git a/libs/protoutil/include/android/util/EncodedBuffer.h b/libs/protoutil/include/android/util/EncodedBuffer.h
index c84de4c1c083..0b7f6e46be65 100644
--- a/libs/protoutil/include/android/util/EncodedBuffer.h
+++ b/libs/protoutil/include/android/util/EncodedBuffer.h
@@ -38,13 +38,13 @@ class EncodedBuffer
{
public:
EncodedBuffer();
- EncodedBuffer(size_t chunkSize);
+ explicit EncodedBuffer(size_t chunkSize);
~EncodedBuffer();
class Pointer {
public:
Pointer();
- Pointer(size_t chunkSize);
+ explicit Pointer(size_t chunkSize);
size_t pos() const;
size_t index() const;
@@ -161,7 +161,7 @@ public:
friend class iterator;
class iterator {
public:
- iterator(const EncodedBuffer& buffer);
+ explicit iterator(const EncodedBuffer& buffer);
/**
* Returns the number of bytes written in the buffer
diff --git a/libs/services/include/android/os/DropBoxManager.h b/libs/services/include/android/os/DropBoxManager.h
index 75b26c626d14..07472435d8a3 100644
--- a/libs/services/include/android/os/DropBoxManager.h
+++ b/libs/services/include/android/os/DropBoxManager.h
@@ -62,7 +62,7 @@ public:
// file descriptor.
Status addFile(const String16& tag, int fd, int flags);
- class Entry : public virtual RefBase, public Parcelable {
+ class Entry : public Parcelable {
public:
Entry();
virtual ~Entry();
@@ -89,9 +89,6 @@ public:
friend class DropBoxManager;
};
- // Get the next entry from the drop box after the specified time.
- Status getNextEntry(const String16& tag, long msec, Entry* entry);
-
private:
enum {
HAS_BYTE_ARRAY = 8
diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp
index 8282518f75c6..681d5f780739 100644
--- a/libs/services/src/os/DropBoxManager.cpp
+++ b/libs/services/src/os/DropBoxManager.cpp
@@ -228,15 +228,4 @@ DropBoxManager::add(const Entry& entry)
return service->add(entry);
}
-Status
-DropBoxManager::getNextEntry(const String16& tag, long msec, Entry* entry)
-{
- sp<IDropBoxManagerService> service = interface_cast<IDropBoxManagerService>(
- defaultServiceManager()->getService(android::String16("dropbox")));
- if (service == NULL) {
- return Status::fromExceptionCode(Status::EX_NULL_POINTER, "can't find dropbox service");
- }
- return service->getNextEntry(tag, msec, android::String16("android"), entry);
-}
-
}} // namespace android::os
diff --git a/libs/usb/api/current.txt b/libs/usb/api/current.txt
index 8488db5b0f86..f17b65a6fe4a 100644
--- a/libs/usb/api/current.txt
+++ b/libs/usb/api/current.txt
@@ -1,12 +1,13 @@
+// Signature format: 2.0
package com.android.future.usb {
public class UsbAccessory {
- method public java.lang.String getDescription();
- method public java.lang.String getManufacturer();
- method public java.lang.String getModel();
- method public java.lang.String getSerial();
- method public java.lang.String getUri();
- method public java.lang.String getVersion();
+ method public String getDescription();
+ method public String getManufacturer();
+ method public String getModel();
+ method public String getSerial();
+ method public String getUri();
+ method public String getVersion();
}
public class UsbManager {
@@ -16,9 +17,9 @@ package com.android.future.usb {
method public boolean hasPermission(com.android.future.usb.UsbAccessory);
method public android.os.ParcelFileDescriptor openAccessory(com.android.future.usb.UsbAccessory);
method public void requestPermission(com.android.future.usb.UsbAccessory, android.app.PendingIntent);
- field public static final java.lang.String ACTION_USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
- field public static final java.lang.String ACTION_USB_ACCESSORY_DETACHED = "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
- field public static final java.lang.String EXTRA_PERMISSION_GRANTED = "permission";
+ field public static final String ACTION_USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
+ field public static final String ACTION_USB_ACCESSORY_DETACHED = "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
+ field public static final String EXTRA_PERMISSION_GRANTED = "permission";
}
}
diff --git a/libs/usb/api/removed.txt b/libs/usb/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/libs/usb/api/removed.txt
+++ b/libs/usb/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/libs/usb/api/system-current.txt b/libs/usb/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/libs/usb/api/system-current.txt
+++ b/libs/usb/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/libs/usb/api/system-removed.txt b/libs/usb/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/libs/usb/api/system-removed.txt
+++ b/libs/usb/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/libs/usb/api/test-current.txt b/libs/usb/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/libs/usb/api/test-current.txt
+++ b/libs/usb/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/libs/usb/api/test-removed.txt b/libs/usb/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/libs/usb/api/test-removed.txt
+++ b/libs/usb/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java
index f179bc3f9d3d..602cc3e6d0fd 100644
--- a/location/java/android/location/GnssMeasurement.java
+++ b/location/java/android/location/GnssMeasurement.java
@@ -48,6 +48,7 @@ public final class GnssMeasurement implements Parcelable {
private int mMultipathIndicator;
private double mSnrInDb;
private double mAutomaticGainControlLevelInDb;
+ private int mCodeType;
// The following enumerations must be in sync with the values declared in gps.h
@@ -58,6 +59,7 @@ public final class GnssMeasurement implements Parcelable {
private static final int HAS_CARRIER_PHASE = (1<<11);
private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12);
private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13);
+ private static final int HAS_CODE_TYPE = (1 << 14);
/**
* The status of the multipath indicator.
@@ -202,6 +204,104 @@ public final class GnssMeasurement implements Parcelable {
public static final int ADR_STATE_HALF_CYCLE_REPORTED = (1<<4);
/**
+ * GNSS measurement code type.
+ * @hide
+ */
+ @IntDef(prefix = { "CODE_TYPE_" }, value = {
+ CODE_TYPE_UNKNOWN, CODE_TYPE_A, CODE_TYPE_B, CODE_TYPE_C, CODE_TYPE_I, CODE_TYPE_L,
+ CODE_TYPE_M, CODE_TYPE_P, CODE_TYPE_Q, CODE_TYPE_S, CODE_TYPE_W, CODE_TYPE_X,
+ CODE_TYPE_Y, CODE_TYPE_Z, CODE_TYPE_CODELESS
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CodeType {}
+
+ /** The GNSS Measurement's code type is unknown. */
+ public static final int CODE_TYPE_UNKNOWN = -1;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GALILEO E1A, GALILEO E6A, IRNSS
+ * L5A, IRNSS SA.
+ */
+ public static final int CODE_TYPE_A = 0;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GALILEO E1B, GALILEO E6B, IRNSS
+ * L5B, IRNSS SB.
+ */
+ public static final int CODE_TYPE_B = 1;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1 C/A, GPS L2 C/A, GLONASS G1
+ * C/A, GLONASS G2 C/A, GALILEO E1C, GALILEO E6C, SBAS L1 C/A, QZSS L1 C/A, IRNSS L5C.
+ */
+ public static final int CODE_TYPE_C = 2;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L5 I, GLONASS G3 I, GALILEO E5a
+ * I, GALILEO E5b I, GALILEO E5a+b I, SBAS L5 I, QZSS L5 I, BDS B1 I, BDS B2 I, BDS B3 I.
+ */
+ public static final int CODE_TYPE_I = 3;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1C (P), GPS L2C (L), QZSS L1C
+ * (P), QZSS L2C (L), LEX(6) L.
+ */
+ public static final int CODE_TYPE_L = 4;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1M, GPS L2M.
+ */
+ public static final int CODE_TYPE_M = 5;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1P, GPS L2P, GLONASS G1P,
+ * GLONASS G2P.
+ */
+ public static final int CODE_TYPE_P = 6;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L5 Q, GLONASS G3 Q, GALILEO E5a
+ * Q, GALILEO E5b Q, GALILEO E5a+b Q, SBAS L5 Q, QZSS L5 Q, BDS B1 Q, BDS B2 Q, BDS B3 Q.
+ */
+ public static final int CODE_TYPE_Q = 7;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1C (D), GPS L2C (M), QZSS L1C
+ * (D), QZSS L2C (M), LEX(6) S.
+ */
+ public static final int CODE_TYPE_S = 8;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1 Z-tracking, GPS L2
+ * Z-tracking.
+ */
+ public static final int CODE_TYPE_W = 9;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1C (D+P), GPS L2C (M+L), GPS
+ * L5 (I+Q), GLONASS G3 (I+Q), GALILEO E1 (B+C), GALILEO E5a (I+Q), GALILEO E5b (I+Q), GALILEO
+ * E5a+b(I+Q), GALILEO E6 (B+C), SBAS L5 (I+Q), QZSS L1C (D+P), QZSS L2C (M+L), QZSS L5 (I+Q),
+ * LEX(6) (S+L), BDS B1 (I+Q), BDS B2 (I+Q), BDS B3 (I+Q), IRNSS L5 (B+C).
+ */
+ public static final int CODE_TYPE_X = 10;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1Y, GPS L2Y.
+ */
+ public static final int CODE_TYPE_Y = 11;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GALILEO E1 (A+B+C), GALILEO E6
+ * (A+B+C), QZSS L1-SAIF.
+ */
+ public static final int CODE_TYPE_Z = 12;
+
+ /**
+ * The GNSS Measurement's code type is one of the following: GPS L1 codeless, GPS L2 codeless.
+ */
+ public static final int CODE_TYPE_CODELESS = 13;
+
+ /**
* All the 'Accumulated Delta Range' flags.
* @hide
*/
@@ -248,6 +348,7 @@ public final class GnssMeasurement implements Parcelable {
mMultipathIndicator = measurement.mMultipathIndicator;
mSnrInDb = measurement.mSnrInDb;
mAutomaticGainControlLevelInDb = measurement.mAutomaticGainControlLevelInDb;
+ mCodeType = measurement.mCodeType;
}
/**
@@ -967,7 +1068,7 @@ public final class GnssMeasurement implements Parcelable {
* <p>For internal and logging use only.
*/
private String getMultipathIndicatorString() {
- switch(mMultipathIndicator) {
+ switch (mMultipathIndicator) {
case MULTIPATH_INDICATOR_UNKNOWN:
return "Unknown";
case MULTIPATH_INDICATOR_DETECTED:
@@ -1063,6 +1164,89 @@ public final class GnssMeasurement implements Parcelable {
mAutomaticGainControlLevelInDb = Double.NaN;
}
+ /**
+ * Returns {@code true} if {@link #getCodeType()} is available,
+ * {@code false} otherwise.
+ */
+ public boolean hasCodeType() {
+ return isFlagSet(HAS_CODE_TYPE);
+ }
+
+ /**
+ * Gets the GNSS measurement's code type.
+ *
+ * <p>Similar to the Attribute field described in Rinex 3.03, e.g., in Tables 4-10, and Table
+ * A2 at the Rinex 3.03 Update 1 Document.
+ */
+ @CodeType
+ public int getCodeType() {
+ return mCodeType;
+ }
+
+ /**
+ * Sets the GNSS measurement's code type.
+ *
+ * @hide
+ */
+ @TestApi
+ public void setCodeType(@CodeType int codeType) {
+ setFlag(HAS_CODE_TYPE);
+ mCodeType = codeType;
+ }
+
+ /**
+ * Resets the GNSS measurement's code type.
+ *
+ * @hide
+ */
+ @TestApi
+ public void resetCodeType() {
+ resetFlag(HAS_CODE_TYPE);
+ mCodeType = CODE_TYPE_UNKNOWN;
+ }
+
+ /**
+ * Gets a string representation of the 'code type'.
+ *
+ * <p>For internal and logging use only.
+ */
+ private String getCodeTypeString() {
+ switch (mCodeType) {
+ case CODE_TYPE_UNKNOWN:
+ return "CODE_TYPE_UNKNOWN";
+ case CODE_TYPE_A:
+ return "CODE_TYPE_A";
+ case CODE_TYPE_B:
+ return "CODE_TYPE_B";
+ case CODE_TYPE_C:
+ return "CODE_TYPE_C";
+ case CODE_TYPE_I:
+ return "CODE_TYPE_I";
+ case CODE_TYPE_L:
+ return "CODE_TYPE_L";
+ case CODE_TYPE_M:
+ return "CODE_TYPE_M";
+ case CODE_TYPE_P:
+ return "CODE_TYPE_P";
+ case CODE_TYPE_Q:
+ return "CODE_TYPE_Q";
+ case CODE_TYPE_S:
+ return "CODE_TYPE_S";
+ case CODE_TYPE_W:
+ return "CODE_TYPE_W";
+ case CODE_TYPE_X:
+ return "CODE_TYPE_X";
+ case CODE_TYPE_Y:
+ return "CODE_TYPE_Y";
+ case CODE_TYPE_Z:
+ return "CODE_TYPE_Z";
+ case CODE_TYPE_CODELESS:
+ return "CODE_TYPE_CODELESS";
+ default:
+ return "<Invalid: " + mCodeType + ">";
+ }
+ }
+
public static final Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() {
@Override
public GnssMeasurement createFromParcel(Parcel parcel) {
@@ -1088,6 +1272,7 @@ public final class GnssMeasurement implements Parcelable {
gnssMeasurement.mMultipathIndicator = parcel.readInt();
gnssMeasurement.mSnrInDb = parcel.readDouble();
gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble();
+ gnssMeasurement.mCodeType = parcel.readInt();
return gnssMeasurement;
}
@@ -1120,6 +1305,7 @@ public final class GnssMeasurement implements Parcelable {
parcel.writeInt(mMultipathIndicator);
parcel.writeDouble(mSnrInDb);
parcel.writeDouble(mAutomaticGainControlLevelInDb);
+ parcel.writeInt(mCodeType);
}
@Override
@@ -1191,9 +1377,13 @@ public final class GnssMeasurement implements Parcelable {
"SnrInDb",
hasSnrInDb() ? mSnrInDb : null));
builder.append(String.format(
- format,
- "AgcLevelDb",
- hasAutomaticGainControlLevelDb() ? mAutomaticGainControlLevelInDb : null));
+ format,
+ "AgcLevelDb",
+ hasAutomaticGainControlLevelDb() ? mAutomaticGainControlLevelInDb : null));
+ builder.append(String.format(
+ format,
+ "CodeType",
+ hasCodeType() ? getCodeTypeString() : null));
return builder.toString();
}
@@ -1218,6 +1408,7 @@ public final class GnssMeasurement implements Parcelable {
setMultipathIndicator(MULTIPATH_INDICATOR_UNKNOWN);
resetSnrInDb();
resetAutomaticGainControlLevel();
+ resetCodeType();
}
private void setFlag(int flag) {
diff --git a/location/java/android/location/GnssSingleSatCorrection.java b/location/java/android/location/GnssSingleSatCorrection.java
index 6c757f949f19..3922d2f9f558 100644
--- a/location/java/android/location/GnssSingleSatCorrection.java
+++ b/location/java/android/location/GnssSingleSatCorrection.java
@@ -16,11 +16,14 @@
package android.location;
+import android.annotation.FloatRange;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.util.Preconditions;
+
/**
* A container with measurement corrections for a single visible satellite
*
@@ -31,9 +34,9 @@ public final class GnssSingleSatCorrection implements Parcelable {
/**
* Bit mask for {@link #mSingleSatCorrectionFlags} indicating the presence of {@link
- * #mSatIsLos}.
+ * #mProbSatIsLos}.
*/
- public static final int HAS_SAT_IS_LOS_MASK = 1 << 0;
+ public static final int HAS_PROB_SAT_IS_LOS_MASK = 1 << 0;
/**
* Bit mask for {@link #mSingleSatCorrectionFlags} indicating the presence of {@link
@@ -78,9 +81,11 @@ public final class GnssSingleSatCorrection implements Parcelable {
private float mCarrierFrequencyHz;
/**
- * True if the satellite is estimated to be in Line-of-Sight condition at the given location.
+ * The probability that the satellite is estimated to be in Line-of-Sight condition at the given
+ * location.
*/
- private boolean mSatIsLos;
+ @FloatRange(from = 0f, to = 1f)
+ private float mProbSatIsLos;
/**
* Excess path length to be subtracted from pseudorange before using it in calculating location.
@@ -103,7 +108,7 @@ public final class GnssSingleSatCorrection implements Parcelable {
mSatId = builder.mSatId;
mConstellationType = builder.mConstellationType;
mCarrierFrequencyHz = builder.mCarrierFrequencyHz;
- mSatIsLos = builder.mSatIsLos;
+ mProbSatIsLos = builder.mProbSatIsLos;
mExcessPathLengthMeters = builder.mExcessPathLengthMeters;
mExcessPathLengthUncertaintyMeters = builder.mExcessPathLengthUncertaintyMeters;
mReflectingPlane = builder.mReflectingPlane;
@@ -152,9 +157,13 @@ public final class GnssSingleSatCorrection implements Parcelable {
return mCarrierFrequencyHz;
}
- /** True if the satellite is line-of-sight */
- public boolean isSatelliteLineOfSight() {
- return mSatIsLos;
+ /**
+ * Returns the probability that the satellite is in line-of-sight condition at the given
+ * location.
+ */
+ @FloatRange(from = 0f, to = 1f)
+ public float getProbSatIsLos() {
+ return mProbSatIsLos;
}
/**
@@ -180,9 +189,9 @@ public final class GnssSingleSatCorrection implements Parcelable {
return mReflectingPlane;
}
- /** Returns {@code true} if {@link #isSatelliteLineOfSight()} is valid. */
+ /** Returns {@code true} if {@link #getProbSatIsLos()} is valid. */
public boolean hasSatelliteLineOfSight() {
- return (mSingleSatCorrectionFlags & HAS_SAT_IS_LOS_MASK) != 0;
+ return (mSingleSatCorrectionFlags & HAS_PROB_SAT_IS_LOS_MASK) != 0;
}
/** Returns {@code true} if {@link #getExcessPathLengthMeters()} is valid. */
@@ -215,7 +224,7 @@ public final class GnssSingleSatCorrection implements Parcelable {
.setConstellationType(parcel.readInt())
.setSatId(parcel.readInt())
.setCarrierFrequencyHz(parcel.readFloat())
- .setSatIsLos(parcel.readBoolean())
+ .setProbSatIsLos(parcel.readFloat())
.setExcessPathLengthMeters(parcel.readFloat())
.setExcessPathLengthUncertaintyMeters(parcel.readFloat())
.setReflectingPlane(
@@ -239,7 +248,7 @@ public final class GnssSingleSatCorrection implements Parcelable {
builder.append(String.format(format, "ConstellationType = ", mConstellationType));
builder.append(String.format(format, "SatId = ", mSatId));
builder.append(String.format(format, "CarrierFrequencyHz = ", mCarrierFrequencyHz));
- builder.append(String.format(format, "SatIsLos = ", mSatIsLos));
+ builder.append(String.format(format, "ProbSatIsLos = ", mProbSatIsLos));
builder.append(String.format(format, "ExcessPathLengthMeters = ", mExcessPathLengthMeters));
builder.append(
String.format(
@@ -256,7 +265,7 @@ public final class GnssSingleSatCorrection implements Parcelable {
parcel.writeInt(mConstellationType);
parcel.writeInt(mSatId);
parcel.writeFloat(mCarrierFrequencyHz);
- parcel.writeBoolean(mSatIsLos);
+ parcel.writeFloat(mProbSatIsLos);
parcel.writeFloat(mExcessPathLengthMeters);
parcel.writeFloat(mExcessPathLengthUncertaintyMeters);
mReflectingPlane.writeToParcel(parcel, flags);
@@ -274,7 +283,7 @@ public final class GnssSingleSatCorrection implements Parcelable {
private int mConstellationType;
private int mSatId;
private float mCarrierFrequencyHz;
- private boolean mSatIsLos;
+ private float mProbSatIsLos;
private float mExcessPathLengthMeters;
private float mExcessPathLengthUncertaintyMeters;
private GnssReflectingPlane mReflectingPlane;
@@ -303,10 +312,16 @@ public final class GnssSingleSatCorrection implements Parcelable {
return this;
}
- /** Sets the line=of-sight state of the satellite */
- public Builder setSatIsLos(boolean satIsLos) {
- mSatIsLos = satIsLos;
- mSingleSatCorrectionFlags = (byte) (mSingleSatCorrectionFlags | HAS_SAT_IS_LOS_MASK);
+ /**
+ * Sets the line-of-sight probability of the satellite at the given location in the range
+ * between 0 and 1.
+ */
+ public Builder setProbSatIsLos(@FloatRange(from = 0f, to = 1f) float probSatIsLos) {
+ Preconditions.checkArgumentInRange(probSatIsLos, 0, 1,
+ "probSatIsLos should be between 0 and 1.");
+ mProbSatIsLos = probSatIsLos;
+ mSingleSatCorrectionFlags =
+ (byte) (mSingleSatCorrectionFlags | HAS_PROB_SAT_IS_LOS_MASK);
return this;
}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index bdc84da57799..e795b8119760 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -89,7 +89,6 @@ interface ILocationManager
List<String> getAllProviders();
List<String> getProviders(in Criteria criteria, boolean enabledOnly);
String getBestProvider(in Criteria criteria, boolean enabledOnly);
- boolean providerMeetsCriteria(String provider, in Criteria criteria);
ProviderProperties getProviderProperties(String provider);
String getNetworkProviderPackage();
void setLocationControllerExtraPackage(String packageName);
@@ -98,9 +97,7 @@ interface ILocationManager
boolean isLocationControllerExtraPackageEnabled();
boolean isProviderEnabledForUser(String provider, int userId);
- boolean setProviderEnabledForUser(String provider, boolean enabled, int userId);
boolean isLocationEnabledForUser(int userId);
- void setLocationEnabledForUser(boolean enabled, int userId);
void addTestProvider(String name, in ProviderProperties properties, String opPackageName);
void removeTestProvider(String provider, String opPackageName);
void setTestProviderLocation(String provider, in Location loc, String opPackageName);
@@ -114,10 +111,6 @@ interface ILocationManager
// --- internal ---
- // --- deprecated ---
- void reportLocation(in Location location, boolean passive);
- void reportLocationBatch(in List<Location> locations);
-
// for reporting callback completion
void locationCallbackFinished(ILocationListener listener);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 9055eec1f610..42551d16d2b1 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -43,6 +43,7 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Log;
import com.android.internal.location.ProviderProperties;
@@ -1295,11 +1296,13 @@ public class LocationManager {
@SystemApi
@RequiresPermission(WRITE_SECURE_SETTINGS)
public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
- try {
- mService.setLocationEnabledForUser(enabled, userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ Settings.Secure.putIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE,
+ enabled
+ ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
+ : Settings.Secure.LOCATION_MODE_OFF,
+ userHandle.getIdentifier());
}
/**
@@ -1385,20 +1388,22 @@ public class LocationManager {
* @return true if the value was set, false on database errors
*
* @throws IllegalArgumentException if provider is null
+ * @deprecated Do not manipulate providers individually, use
+ * {@link #setLocationEnabledForUser(boolean, UserHandle)} instead.
* @hide
*/
+ @Deprecated
@SystemApi
@RequiresPermission(WRITE_SECURE_SETTINGS)
public boolean setProviderEnabledForUser(
String provider, boolean enabled, UserHandle userHandle) {
checkProvider(provider);
- try {
- return mService.setProviderEnabledForUser(
- provider, enabled, userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return Settings.Secure.setLocationProviderEnabledForUser(
+ mContext.getContentResolver(),
+ provider,
+ enabled,
+ userHandle.getIdentifier());
}
/**
@@ -1592,7 +1597,7 @@ public class LocationManager {
*/
@Deprecated
public void clearTestProviderEnabled(String provider) {
- setTestProviderEnabled(provider, true);
+ setTestProviderEnabled(provider, false);
}
/**
diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index b5313256e4dc..866634e17513 100644
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -16,9 +16,6 @@
package com.android.internal.location;
-import java.io.UnsupportedEncodingException;
-import java.util.concurrent.TimeUnit;
-
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -26,20 +23,23 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.location.LocationManager;
import android.location.INetInitiatedListener;
+import android.location.LocationManager;
+import android.os.RemoteException;
import android.os.SystemClock;
-import android.telephony.TelephonyManager;
+import android.os.UserHandle;
import android.telephony.PhoneNumberUtils;
import android.telephony.PhoneStateListener;
-import android.os.RemoteException;
-import android.os.UserHandle;
+import android.telephony.TelephonyManager;
import android.util.Log;
-import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.R;
+import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.telephony.GsmAlphabet;
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.TimeUnit;
+
/**
* A GPS Network-initiated Handler class used by LocationManager.
*
@@ -92,9 +92,6 @@ public class GpsNetInitiatedHandler {
public static final int GPS_ENC_SUPL_UCS2 = 3;
public static final int GPS_ENC_UNKNOWN = -1;
- // Limit on SUPL NI emergency mode time extension after emergency sessions ends
- private static final int MAX_EMERGENCY_MODE_EXTENSION_SECONDS = 300; // 5 minute maximum
-
private final Context mContext;
private final TelephonyManager mTelephonyManager;
private final PhoneStateListener mPhoneStateListener;
@@ -252,19 +249,9 @@ public class GpsNetInitiatedHandler {
}
public void setEmergencyExtensionSeconds(int emergencyExtensionSeconds) {
- if (emergencyExtensionSeconds > MAX_EMERGENCY_MODE_EXTENSION_SECONDS) {
- Log.w(TAG, "emergencyExtensionSeconds " + emergencyExtensionSeconds
- + " too high, reset to " + MAX_EMERGENCY_MODE_EXTENSION_SECONDS);
- emergencyExtensionSeconds = MAX_EMERGENCY_MODE_EXTENSION_SECONDS;
- } else if (emergencyExtensionSeconds < 0) {
- Log.w(TAG, "emergencyExtensionSeconds " + emergencyExtensionSeconds
- + " is negative, reset to zero.");
- emergencyExtensionSeconds = 0;
- }
mEmergencyExtensionMillis = TimeUnit.SECONDS.toMillis(emergencyExtensionSeconds);
}
-
// Handles NI events from HAL
public void handleNiNotification(GpsNiNotification notif) {
if (DEBUG) Log.d(TAG, "in handleNiNotification () :"
diff --git a/location/lib/Android.bp b/location/lib/Android.bp
index b09335c6707f..35f287737d17 100644
--- a/location/lib/Android.bp
+++ b/location/lib/Android.bp
@@ -18,5 +18,7 @@ java_sdk_library {
name: "com.android.location.provider",
srcs: ["java/**/*.java"],
api_packages: ["com.android.location.provider"],
- metalava_enabled: false,
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: ["location/java"],
+ srcs_lib_whitelist_pkgs: ["com.android.internal.location"],
}
diff --git a/location/lib/api/current.txt b/location/lib/api/current.txt
index 10c344775019..c7212183a37e 100644
--- a/location/lib/api/current.txt
+++ b/location/lib/api/current.txt
@@ -1,27 +1,28 @@
+// Signature format: 2.0
package com.android.location.provider {
- public abstract deprecated class FusedProvider {
- ctor public FusedProvider();
- method public android.os.IBinder getBinder();
+ @Deprecated public abstract class FusedProvider {
+ ctor @Deprecated public FusedProvider();
+ method @Deprecated public android.os.IBinder getBinder();
}
public abstract class LocationProviderBase {
- ctor public LocationProviderBase(java.lang.String, com.android.location.provider.ProviderPropertiesUnbundled);
+ ctor public LocationProviderBase(String, com.android.location.provider.ProviderPropertiesUnbundled);
method public android.os.IBinder getBinder();
method public boolean isEnabled();
- method protected deprecated void onDisable();
- method protected void onDump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method protected deprecated void onEnable();
- method protected deprecated int onGetStatus(android.os.Bundle);
- method protected deprecated long onGetStatusUpdateTime();
+ method @Deprecated protected void onDisable();
+ method protected void onDump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
+ method @Deprecated protected void onEnable();
+ method @Deprecated protected int onGetStatus(android.os.Bundle);
+ method @Deprecated protected long onGetStatusUpdateTime();
method protected void onInit();
- method protected boolean onSendExtraCommand(java.lang.String, android.os.Bundle);
+ method protected boolean onSendExtraCommand(@Nullable String, @Nullable android.os.Bundle);
method protected abstract void onSetRequest(com.android.location.provider.ProviderRequestUnbundled, android.os.WorkSource);
method public void reportLocation(android.location.Location);
method public void setEnabled(boolean);
method public void setProperties(com.android.location.provider.ProviderPropertiesUnbundled);
- field public static final java.lang.String EXTRA_NO_GPS_LOCATION = "noGPSLocation";
- field public static final java.lang.String FUSED_PROVIDER = "fused";
+ field public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation";
+ field public static final String FUSED_PROVIDER = "fused";
}
public final class LocationRequestUnbundled {
diff --git a/location/lib/api/removed.txt b/location/lib/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/location/lib/api/removed.txt
+++ b/location/lib/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/lib/api/system-current.txt b/location/lib/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/location/lib/api/system-current.txt
+++ b/location/lib/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/lib/api/system-removed.txt b/location/lib/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/location/lib/api/system-removed.txt
+++ b/location/lib/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/lib/api/test-current.txt b/location/lib/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/location/lib/api/test-current.txt
+++ b/location/lib/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/lib/api/test-removed.txt b/location/lib/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/location/lib/api/test-removed.txt
+++ b/location/lib/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java b/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
deleted file mode 100644
index 843dd670315a..000000000000
--- a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.location.provider;
-
-import android.annotation.NonNull;
-
-import java.security.InvalidParameterException;
-import java.util.List;
-
-/**
- * A class representing an event for Activity changes.
- * @hide
- */
-public class ActivityChangedEvent {
- private final List<ActivityRecognitionEvent> mActivityRecognitionEvents;
-
- public ActivityChangedEvent(List<ActivityRecognitionEvent> activityRecognitionEvents) {
- if (activityRecognitionEvents == null) {
- throw new InvalidParameterException(
- "Parameter 'activityRecognitionEvents' must not be null.");
- }
-
- mActivityRecognitionEvents = activityRecognitionEvents;
- }
-
- @NonNull
- public Iterable<ActivityRecognitionEvent> getActivityRecognitionEvents() {
- return mActivityRecognitionEvents;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder("[ ActivityChangedEvent:");
-
- for (ActivityRecognitionEvent event : mActivityRecognitionEvents) {
- builder.append("\n ");
- builder.append(event.toString());
- }
- builder.append("\n]");
-
- return builder.toString();
- }
-}
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java b/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
deleted file mode 100644
index e54dea40d690..000000000000
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.location.provider;
-
-/**
- * A class that represents an Activity Recognition Event.
- * @hide
- */
-public class ActivityRecognitionEvent {
- private final String mActivity;
- private final int mEventType;
- private final long mTimestampNs;
-
- public ActivityRecognitionEvent(String activity, int eventType, long timestampNs) {
- mActivity = activity;
- mEventType = eventType;
- mTimestampNs = timestampNs;
- }
-
- public String getActivity() {
- return mActivity;
- }
-
- public int getEventType() {
- return mEventType;
- }
-
- public long getTimestampNs() {
- return mTimestampNs;
- }
-
- @Override
- public String toString() {
- String eventString;
- switch (mEventType) {
- case ActivityRecognitionProvider.EVENT_TYPE_ENTER:
- eventString = "Enter";
- break;
- case ActivityRecognitionProvider.EVENT_TYPE_EXIT:
- eventString = "Exit";
- break;
- case ActivityRecognitionProvider.EVENT_TYPE_FLUSH_COMPLETE:
- eventString = "FlushComplete";
- break;
- default:
- eventString = "<Invalid>";
- break;
- }
-
- return String.format(
- "Activity='%s', EventType=%s(%s), TimestampNs=%s",
- mActivity,
- eventString,
- mEventType,
- mTimestampNs);
- }
-}
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
deleted file mode 100644
index 0eff7d3f2014..000000000000
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.location.provider;
-
-import com.android.internal.util.Preconditions;
-
-import android.hardware.location.IActivityRecognitionHardware;
-import android.hardware.location.IActivityRecognitionHardwareSink;
-import android.os.RemoteException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-
-/**
- * A class that exposes {@link IActivityRecognitionHardware} functionality to unbundled services.
- * @hide
- */
-public final class ActivityRecognitionProvider {
- private final IActivityRecognitionHardware mService;
- private final HashSet<Sink> mSinkSet = new HashSet<>();
-
- // the following constants must remain in sync with activity_recognition.h
-
- public static final String ACTIVITY_IN_VEHICLE = "android.activity_recognition.in_vehicle";
- public static final String ACTIVITY_ON_BICYCLE = "android.activity_recognition.on_bicycle";
- public static final String ACTIVITY_WALKING = "android.activity_recognition.walking";
- public static final String ACTIVITY_RUNNING = "android.activity_recognition.running";
- public static final String ACTIVITY_STILL = "android.activity_recognition.still";
- public static final String ACTIVITY_TILTING = "android.activity_recognition.tilting";
-
- // NOTE: when adding an additional EVENT_TYPE_, EVENT_TYPE_COUNT needs to be updated in
- // android.hardware.location.ActivityRecognitionHardware
- public static final int EVENT_TYPE_FLUSH_COMPLETE = 0;
- public static final int EVENT_TYPE_ENTER = 1;
- public static final int EVENT_TYPE_EXIT = 2;
-
- // end constants activity_recognition.h
-
- /**
- * Used to receive Activity-Recognition events.
- */
- public interface Sink {
- void onActivityChanged(ActivityChangedEvent event);
- }
-
- public ActivityRecognitionProvider(IActivityRecognitionHardware service)
- throws RemoteException {
- Preconditions.checkNotNull(service);
- mService = service;
- mService.registerSink(new SinkTransport());
- }
-
- public String[] getSupportedActivities() throws RemoteException {
- return mService.getSupportedActivities();
- }
-
- public boolean isActivitySupported(String activity) throws RemoteException {
- return mService.isActivitySupported(activity);
- }
-
- public void registerSink(Sink sink) {
- Preconditions.checkNotNull(sink);
- synchronized (mSinkSet) {
- mSinkSet.add(sink);
- }
- }
-
- // TODO: if this functionality is exposed to 3rd party developers, handle unregistration (here
- // and in the service) of all sinks while failing to disable all events
- public void unregisterSink(Sink sink) {
- Preconditions.checkNotNull(sink);
- synchronized (mSinkSet) {
- mSinkSet.remove(sink);
- }
- }
-
- public boolean enableActivityEvent(String activity, int eventType, long reportLatencyNs)
- throws RemoteException {
- return mService.enableActivityEvent(activity, eventType, reportLatencyNs);
- }
-
- public boolean disableActivityEvent(String activity, int eventType) throws RemoteException {
- return mService.disableActivityEvent(activity, eventType);
- }
-
- public boolean flush() throws RemoteException {
- return mService.flush();
- }
-
- private final class SinkTransport extends IActivityRecognitionHardwareSink.Stub {
- @Override
- public void onActivityChanged(android.hardware.location.ActivityChangedEvent event) {
- Collection<Sink> sinks;
- synchronized (mSinkSet) {
- if (mSinkSet.isEmpty()) {
- return;
- }
- sinks = new ArrayList<>(mSinkSet);
- }
-
- // translate the event from platform internal and GmsCore types
- ArrayList<ActivityRecognitionEvent> gmsEvents = new ArrayList<>();
- for (android.hardware.location.ActivityRecognitionEvent reportingEvent
- : event.getActivityRecognitionEvents()) {
- ActivityRecognitionEvent gmsEvent = new ActivityRecognitionEvent(
- reportingEvent.getActivity(),
- reportingEvent.getEventType(),
- reportingEvent.getTimestampNs());
- gmsEvents.add(gmsEvent);
- }
- ActivityChangedEvent gmsEvent = new ActivityChangedEvent(gmsEvents);
-
- for (Sink sink : sinks) {
- sink.onActivityChanged(gmsEvent);
- }
- }
- }
-}
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
deleted file mode 100644
index 326d901b9daa..000000000000
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.location.provider;
-
-import android.annotation.NonNull;
-import android.hardware.location.IActivityRecognitionHardware;
-import android.hardware.location.IActivityRecognitionHardwareClient;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * A client class for interaction with an Activity-Recognition provider.
- * @hide
- */
-public abstract class ActivityRecognitionProviderClient {
- private static final String TAG = "ArProviderClient";
-
- protected ActivityRecognitionProviderClient() {}
-
- private IActivityRecognitionHardwareClient.Stub mClient =
- new IActivityRecognitionHardwareClient.Stub() {
- @Override
- public void onAvailabilityChanged(
- boolean isSupported,
- IActivityRecognitionHardware instance) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SYSTEM_UID) {
- Log.d(TAG, "Ignoring calls from non-system server. Uid: " + callingUid);
- return;
- }
- ActivityRecognitionProvider provider;
- try {
- provider = isSupported ? new ActivityRecognitionProvider(instance) : null;
- } catch (RemoteException e) {
- Log.e(TAG, "Error creating Hardware Activity-Recognition Provider.", e);
- return;
- }
- onProviderChanged(isSupported, provider);
- }
- };
-
- /**
- * Gets the binder needed to interact with proxy provider in the platform.
- */
- @NonNull
- public IBinder getBinder() {
- return mClient;
- }
-
- /**
- * Called when a change in the availability of {@link ActivityRecognitionProvider} is detected.
- *
- * @param isSupported whether the platform supports the provider natively
- * @param instance the available provider's instance
- */
- public abstract void onProviderChanged(
- boolean isSupported,
- ActivityRecognitionProvider instance);
-}
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
deleted file mode 100644
index 42f77b42766f..000000000000
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.location.provider;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.hardware.location.IActivityRecognitionHardware;
-import android.hardware.location.IActivityRecognitionHardwareWatcher;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * A watcher class for Activity-Recognition instances.
- *
- * @deprecated use {@link ActivityRecognitionProviderClient} instead.
- * @hide
- */
-@Deprecated
-public class ActivityRecognitionProviderWatcher {
- private static final String TAG = "ActivityRecognitionProviderWatcher";
-
- private static ActivityRecognitionProviderWatcher sWatcher;
- private static final Object sWatcherLock = new Object();
-
- private ActivityRecognitionProvider mActivityRecognitionProvider;
-
- private ActivityRecognitionProviderWatcher() {}
-
- public static ActivityRecognitionProviderWatcher getInstance() {
- synchronized (sWatcherLock) {
- if (sWatcher == null) {
- sWatcher = new ActivityRecognitionProviderWatcher();
- }
- return sWatcher;
- }
- }
-
- private IActivityRecognitionHardwareWatcher.Stub mWatcherStub =
- new IActivityRecognitionHardwareWatcher.Stub() {
- @Override
- public void onInstanceChanged(IActivityRecognitionHardware instance) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SYSTEM_UID) {
- Log.d(TAG, "Ignoring calls from non-system server. Uid: " + callingUid);
- return;
- }
-
- try {
- mActivityRecognitionProvider = new ActivityRecognitionProvider(instance);
- } catch (RemoteException e) {
- Log.e(TAG, "Error creating Hardware Activity-Recognition", e);
- }
- }
- };
-
- /**
- * Gets the binder needed to interact with proxy provider in the platform.
- */
- @NonNull
- public IBinder getBinder() {
- return mWatcherStub;
- }
-
- /**
- * Gets an object that supports the functionality of {@link ActivityRecognitionProvider}.
- *
- * @return Non-null value if the functionality is supported by the platform, false otherwise.
- */
- @Nullable
- public ActivityRecognitionProvider getActivityRecognitionProvider() {
- return mActivityRecognitionProvider;
- }
-}
diff --git a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
index c18d58f9a704..d6227bbfcd0d 100644
--- a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
+++ b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
@@ -59,7 +59,7 @@ public class GnssMeasurementCorrectionsTest extends TestCase {
assertEquals(GnssStatus.CONSTELLATION_GPS, singleSatCorrection.getConstellationType());
assertEquals(11, singleSatCorrection.getSatId());
assertEquals(1575430000f, singleSatCorrection.getCarrierFrequencyHz());
- assertEquals(false, singleSatCorrection.isSatelliteLineOfSight());
+ assertEquals(0.9f, singleSatCorrection.getProbSatIsLos());
assertEquals(50.0f, singleSatCorrection.getExcessPathLengthMeters());
assertEquals(55.0f, singleSatCorrection.getExcessPathLengthUncertaintyMeters());
GnssReflectingPlane reflectingPlane = singleSatCorrection.getReflectingPlane();
@@ -88,7 +88,7 @@ public class GnssMeasurementCorrectionsTest extends TestCase {
.setConstellationType(GnssStatus.CONSTELLATION_GPS)
.setSatId(11)
.setCarrierFrequencyHz(1575430000f)
- .setSatIsLos(false)
+ .setProbSatIsLos(0.9f)
.setExcessPathLengthMeters(50.0f)
.setExcessPathLengthUncertaintyMeters(55.0f)
.setReflectingPlane(generateTestReflectingPlane());
diff --git a/location/tests/locationtests/src/android/location/GnssSingleSatCorrectionsTest.java b/location/tests/locationtests/src/android/location/GnssSingleSatCorrectionsTest.java
index 2e54ae463595..f358806d0b26 100644
--- a/location/tests/locationtests/src/android/location/GnssSingleSatCorrectionsTest.java
+++ b/location/tests/locationtests/src/android/location/GnssSingleSatCorrectionsTest.java
@@ -44,7 +44,7 @@ public class GnssSingleSatCorrectionsTest extends TestCase {
assertEquals(GnssStatus.CONSTELLATION_GALILEO, singleSatCorrection.getConstellationType());
assertEquals(12, singleSatCorrection.getSatId());
assertEquals(1575420000f, singleSatCorrection.getCarrierFrequencyHz());
- assertEquals(true, singleSatCorrection.isSatelliteLineOfSight());
+ assertEquals(0.1f, singleSatCorrection.getProbSatIsLos());
assertEquals(10.0f, singleSatCorrection.getExcessPathLengthMeters());
assertEquals(5.0f, singleSatCorrection.getExcessPathLengthUncertaintyMeters());
GnssReflectingPlane reflectingPlane = singleSatCorrection.getReflectingPlane();
@@ -58,7 +58,7 @@ public class GnssSingleSatCorrectionsTest extends TestCase {
.setConstellationType(singleSatCorr.getConstellationType())
.setSatId(singleSatCorr.getSatId())
.setCarrierFrequencyHz(singleSatCorr.getCarrierFrequencyHz())
- .setSatIsLos(singleSatCorr.isSatelliteLineOfSight())
+ .setProbSatIsLos(singleSatCorr.getProbSatIsLos())
.setExcessPathLengthMeters(singleSatCorr.getExcessPathLengthMeters())
.setExcessPathLengthUncertaintyMeters(
singleSatCorr.getExcessPathLengthUncertaintyMeters())
@@ -72,7 +72,7 @@ public class GnssSingleSatCorrectionsTest extends TestCase {
.setConstellationType(GnssStatus.CONSTELLATION_GALILEO)
.setSatId(12)
.setCarrierFrequencyHz(1575420000f)
- .setSatIsLos(true)
+ .setProbSatIsLos(0.1f)
.setExcessPathLengthMeters(10.0f)
.setExcessPathLengthUncertaintyMeters(5.0f)
.setReflectingPlane(GnssReflectingPlaneTest.generateTestReflectingPlane());
diff --git a/media/Android.bp b/media/Android.bp
index d5da6f266952..0eb86acf9ecf 100644
--- a/media/Android.bp
+++ b/media/Android.bp
@@ -1,6 +1,22 @@
java_library {
- // TODO: include media2.jar in the media apex and add it to the bootclasspath.
- name: "media2",
+ name: "media1",
+
+ srcs: [
+ ":media1-srcs",
+ ],
+
+ sdk_version: "system_current",
+}
+
+filegroup {
+ name: "media1-srcs",
+ srcs: [
+ "java/android/media/session/MediaSessionProviderService.java",
+ ],
+}
+
+java_library {
+ name: "updatable-media",
srcs: [
":media2-srcs",
@@ -11,6 +27,8 @@ java_library {
"mediaplayer2-protos",
],
+ installable: true,
+
// Make sure that the implementaion only relies on SDK or system APIs.
sdk_version: "system_current",
}
@@ -18,19 +36,19 @@ java_library {
filegroup {
name: "media2-srcs",
srcs: [
- "java/android/media/CloseGuard.java",
- "java/android/media/DataSourceCallback.java",
- "java/android/media/DataSourceDesc.java",
- "java/android/media/UriDataSourceDesc.java",
- "java/android/media/FileDataSourceDesc.java",
- "java/android/media/CallbackDataSourceDesc.java",
- "java/android/media/VideoSize.java",
- "java/android/media/Media2Utils.java",
- "java/android/media/MediaPlayer2Utils.java",
- "java/android/media/MediaPlayer2.java",
- "java/android/media/Media2HTTPService.java",
- "java/android/media/Media2HTTPConnection.java",
- "java/android/media/RoutingDelegate.java",
- "java/android/media/BufferingParams.java",
+ "apex/java/android/media/CloseGuard.java",
+ "apex/java/android/media/DataSourceCallback.java",
+ "apex/java/android/media/DataSourceDesc.java",
+ "apex/java/android/media/UriDataSourceDesc.java",
+ "apex/java/android/media/FileDataSourceDesc.java",
+ "apex/java/android/media/CallbackDataSourceDesc.java",
+ "apex/java/android/media/VideoSize.java",
+ "apex/java/android/media/Media2Utils.java",
+ "apex/java/android/media/MediaPlayer2Utils.java",
+ "apex/java/android/media/MediaPlayer2.java",
+ "apex/java/android/media/Media2HTTPService.java",
+ "apex/java/android/media/Media2HTTPConnection.java",
+ "apex/java/android/media/RoutingDelegate.java",
+ "apex/java/android/media/BufferingParams.java",
],
}
diff --git a/media/java/android/media/BufferingParams.java b/media/apex/java/android/media/BufferingParams.java
index aaae5e7b6d91..aaae5e7b6d91 100644
--- a/media/java/android/media/BufferingParams.java
+++ b/media/apex/java/android/media/BufferingParams.java
diff --git a/media/java/android/media/CallbackDataSourceDesc.java b/media/apex/java/android/media/CallbackDataSourceDesc.java
index cd364145e8a4..cd364145e8a4 100644
--- a/media/java/android/media/CallbackDataSourceDesc.java
+++ b/media/apex/java/android/media/CallbackDataSourceDesc.java
diff --git a/media/java/android/media/CloseGuard.java b/media/apex/java/android/media/CloseGuard.java
index 20146739fe4c..20146739fe4c 100644
--- a/media/java/android/media/CloseGuard.java
+++ b/media/apex/java/android/media/CloseGuard.java
diff --git a/media/java/android/media/DataSourceCallback.java b/media/apex/java/android/media/DataSourceCallback.java
index 1afcd2075ba4..1afcd2075ba4 100644
--- a/media/java/android/media/DataSourceCallback.java
+++ b/media/apex/java/android/media/DataSourceCallback.java
diff --git a/media/java/android/media/DataSourceDesc.java b/media/apex/java/android/media/DataSourceDesc.java
index 7fc6f794cff8..7fc6f794cff8 100644
--- a/media/java/android/media/DataSourceDesc.java
+++ b/media/apex/java/android/media/DataSourceDesc.java
diff --git a/media/java/android/media/FileDataSourceDesc.java b/media/apex/java/android/media/FileDataSourceDesc.java
index e29bd006c00a..e29bd006c00a 100644
--- a/media/java/android/media/FileDataSourceDesc.java
+++ b/media/apex/java/android/media/FileDataSourceDesc.java
diff --git a/media/java/android/media/Media2HTTPConnection.java b/media/apex/java/android/media/Media2HTTPConnection.java
index a369a62b39db..a369a62b39db 100644
--- a/media/java/android/media/Media2HTTPConnection.java
+++ b/media/apex/java/android/media/Media2HTTPConnection.java
diff --git a/media/java/android/media/Media2HTTPService.java b/media/apex/java/android/media/Media2HTTPService.java
index 0d46ce404831..0d46ce404831 100644
--- a/media/java/android/media/Media2HTTPService.java
+++ b/media/apex/java/android/media/Media2HTTPService.java
diff --git a/media/java/android/media/Media2Utils.java b/media/apex/java/android/media/Media2Utils.java
index 5fd61915b4aa..5fd61915b4aa 100644
--- a/media/java/android/media/Media2Utils.java
+++ b/media/apex/java/android/media/Media2Utils.java
diff --git a/media/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index cef66147f395..aa79c417922c 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -60,6 +60,7 @@ import java.net.URL;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@@ -67,6 +68,7 @@ import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
@@ -399,8 +401,7 @@ public class MediaPlayer2 implements AutoCloseable
clearSourceInfos();
// Modular DRM clean up
- mOnDrmConfigHelper = null;
- synchronized (mDrmEventCbLock) {
+ synchronized (mDrmEventCallbackLock) {
mDrmEventCallbackRecords.clear();
}
@@ -537,6 +538,19 @@ public class MediaPlayer2 implements AutoCloseable
public native long getCurrentPosition();
/**
+ * Gets the duration of the current data source.
+ * Same as {@link #getDuration(DataSourceDesc)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @return the duration in milliseconds, if no duration is available
+ * (for example, if streaming live content), -1 is returned.
+ * @throws NullPointerException if current data source is null
+ */
+ public long getDuration() {
+ return getDuration(getCurrentDataSource());
+ }
+
+ /**
* Gets the duration of the dsd.
*
* @param dsd the descriptor of data source of which you want to get duration
@@ -559,6 +573,18 @@ public class MediaPlayer2 implements AutoCloseable
private native long native_getDuration(long srcId);
/**
+ * Gets the buffered media source position of current data source.
+ * Same as {@link #getBufferedPosition(DataSourceDesc)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @return the current buffered media source position in milliseconds
+ * @throws NullPointerException if current data source is null
+ */
+ public long getBufferedPosition() {
+ return getBufferedPosition(getCurrentDataSource());
+ }
+
+ /**
* Gets the buffered media source position of given dsd.
* For example a buffering update of 8000 milliseconds when 5000 milliseconds of the content
* has already been played indicates that the next 3000 milliseconds of the
@@ -750,7 +776,7 @@ public class MediaPlayer2 implements AutoCloseable
}
boolean hasError = false;
for (DataSourceDesc dsd : dsds) {
- if (dsd != null) {
+ if (dsd == null) {
hasError = true;
continue;
}
@@ -1309,11 +1335,11 @@ public class MediaPlayer2 implements AutoCloseable
return addTask(new Task(CALL_COMPLETED_SET_WAKE_LOCK, false) {
@Override
void process() {
- boolean washeld = false;
+ boolean wasHeld = false;
if (mWakeLock != null) {
if (mWakeLock.isHeld()) {
- washeld = true;
+ wasHeld = true;
mWakeLock.release();
}
}
@@ -1321,7 +1347,7 @@ public class MediaPlayer2 implements AutoCloseable
mWakeLock = wakeLock;
if (mWakeLock != null) {
mWakeLock.setReferenceCounted(false);
- if (washeld) {
+ if (wasHeld) {
mWakeLock.acquire();
}
}
@@ -2015,6 +2041,21 @@ public class MediaPlayer2 implements AutoCloseable
};
/**
+ * Returns a List of track information of current data source.
+ * Same as {@link #getTrackInfo(DataSourceDesc)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @return List of track info. The total number of tracks is the array length.
+ * Must be called again if an external timed text source has been added after
+ * addTimedTextSource method is called.
+ * @throws IllegalStateException if it is called in an invalid state.
+ * @throws NullPointerException if current data source is null
+ */
+ public @NonNull List<TrackInfo> getTrackInfo() {
+ return getTrackInfo(getCurrentDataSource());
+ }
+
+ /**
* Returns a List of track information.
*
* @param dsd the descriptor of data source of which you want to get track info
@@ -2024,7 +2065,6 @@ public class MediaPlayer2 implements AutoCloseable
* @throws IllegalStateException if it is called in an invalid state.
* @throws NullPointerException if dsd is null
*/
-
public @NonNull List<TrackInfo> getTrackInfo(@NonNull DataSourceDesc dsd) {
if (dsd == null) {
throw new NullPointerException("non-null dsd is expected");
@@ -2060,9 +2100,34 @@ public class MediaPlayer2 implements AutoCloseable
}
/**
- * Returns the index of the audio, video, or subtitle track currently selected for playback,
+ * Returns the index of the audio, video, or subtitle track currently selected for playback.
+ * The return value is an index into the array returned by {@link #getTrackInfo}, and can
+ * be used in calls to {@link #selectTrack(int)} or {@link #deselectTrack(int)}.
+ * Same as {@link #getSelectedTrack(DataSourceDesc, int)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @param trackType should be one of {@link TrackInfo#MEDIA_TRACK_TYPE_VIDEO},
+ * {@link TrackInfo#MEDIA_TRACK_TYPE_AUDIO}, or
+ * {@link TrackInfo#MEDIA_TRACK_TYPE_SUBTITLE}
+ * @return index of the audio, video, or subtitle track currently selected for playback;
+ * a negative integer is returned when there is no selected track for {@code trackType} or
+ * when {@code trackType} is not one of audio, video, or subtitle.
+ * @throws IllegalStateException if called after {@link #close()}
+ * @throws NullPointerException if current data source is null
+ *
+ * @see #getTrackInfo()
+ * @see #selectTrack(int)
+ * @see #deselectTrack(int)
+ */
+ public int getSelectedTrack(int trackType) {
+ return getSelectedTrack(getCurrentDataSource(), trackType);
+ }
+
+ /**
+ * Returns the index of the audio, video, or subtitle track currently selected for playback.
* The return value is an index into the array returned by {@link #getTrackInfo}, and can
- * be used in calls to {@link #selectTrack} or {@link #deselectTrack}.
+ * be used in calls to {@link #selectTrack(DataSourceDesc, int)} or
+ * {@link #deselectTrack(DataSourceDesc, int)}.
*
* @param dsd the descriptor of data source of which you want to get selected track
* @param trackType should be one of {@link TrackInfo#MEDIA_TRACK_TYPE_VIDEO},
@@ -2074,9 +2139,9 @@ public class MediaPlayer2 implements AutoCloseable
* @throws IllegalStateException if called after {@link #close()}
* @throws NullPointerException if dsd is null
*
- * @see #getTrackInfo
- * @see #selectTrack
- * @see #deselectTrack
+ * @see #getTrackInfo(DataSourceDesc)
+ * @see #selectTrack(DataSourceDesc, int)
+ * @see #deselectTrack(DataSourceDesc, int)
*/
public int getSelectedTrack(@NonNull DataSourceDesc dsd, int trackType) {
if (dsd == null) {
@@ -2100,6 +2165,23 @@ public class MediaPlayer2 implements AutoCloseable
}
/**
+ * Selects a track of current data source.
+ * Same as {@link #selectTrack(DataSourceDesc, int)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @param index the index of the track to be selected. The valid range of the index
+ * is 0..total number of track - 1. The total number of tracks as well as the type of
+ * each individual track can be found by calling {@link #getTrackInfo()} method.
+ * @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
+ *
+ * @see MediaPlayer2#getTrackInfo()
+ */
+ // This is an asynchronous call.
+ public Object selectTrack(int index) {
+ return selectTrack(getCurrentDataSource(), index);
+ }
+
+ /**
* Selects a track.
* <p>
* If a MediaPlayer2 is in invalid state, it throws an IllegalStateException exception.
@@ -2123,10 +2205,10 @@ public class MediaPlayer2 implements AutoCloseable
* @param dsd the descriptor of data source of which you want to select track
* @param index the index of the track to be selected. The valid range of the index
* is 0..total number of track - 1. The total number of tracks as well as the type of
- * each individual track can be found by calling {@link #getTrackInfo} method.
+ * each individual track can be found by calling {@link #getTrackInfo(DataSourceDesc)} method.
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*
- * @see MediaPlayer2#getTrackInfo
+ * @see MediaPlayer2#getTrackInfo(DataSourceDesc)
*/
// This is an asynchronous call.
public Object selectTrack(@NonNull DataSourceDesc dsd, int index) {
@@ -2139,6 +2221,23 @@ public class MediaPlayer2 implements AutoCloseable
}
/**
+ * Deselect a track of current data source.
+ * Same as {@link #deselectTrack(DataSourceDesc, int)} with
+ * {@code dsd = getCurrentDataSource()}.
+ *
+ * @param index the index of the track to be deselected. The valid range of the index
+ * is 0..total number of tracks - 1. The total number of tracks as well as the type of
+ * each individual track can be found by calling {@link #getTrackInfo()} method.
+ * @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
+ *
+ * @see MediaPlayer2#getTrackInfo()
+ */
+ // This is an asynchronous call.
+ public Object deselectTrack(int index) {
+ return deselectTrack(getCurrentDataSource(), index);
+ }
+
+ /**
* Deselect a track.
* <p>
* Currently, the track must be a timed text track and no audio or video tracks can be
@@ -2151,7 +2250,7 @@ public class MediaPlayer2 implements AutoCloseable
* each individual track can be found by calling {@link #getTrackInfo} method.
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*
- * @see MediaPlayer2#getTrackInfo
+ * @see MediaPlayer2#getTrackInfo(DataSourceDesc)
*/
// This is an asynchronous call.
public Object deselectTrack(@NonNull DataSourceDesc dsd, int index) {
@@ -2791,7 +2890,7 @@ public class MediaPlayer2 implements AutoCloseable
}
private void sendDrmEvent(final DrmEventNotifier notifier) {
- synchronized (mDrmEventCbLock) {
+ synchronized (mDrmEventCallbackLock) {
try {
for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
cb.first.execute(() -> notifier.notify(cb.second));
@@ -2803,12 +2902,28 @@ public class MediaPlayer2 implements AutoCloseable
}
}
+ private <T> T sendDrmEventWait(final DrmEventNotifier<T> notifier)
+ throws InterruptedException, ExecutionException {
+ synchronized (mDrmEventCallbackLock) {
+ mDrmEventCallbackRecords.get(0);
+ for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
+ CompletableFuture<T> ret = new CompletableFuture<>();
+ cb.first.execute(() -> ret.complete(notifier.notifyWait(cb.second)));
+ return ret.get();
+ }
+ }
+ return null;
+ }
+
private interface EventNotifier {
void notify(EventCallback callback);
}
- private interface DrmEventNotifier {
- void notify(DrmEventCallback callback);
+ private interface DrmEventNotifier<T> {
+ default void notify(DrmEventCallback callback) { }
+ default T notifyWait(DrmEventCallback callback) {
+ return null;
+ }
}
/* Do not change these values without updating their counterparts
@@ -3253,73 +3368,209 @@ public class MediaPlayer2 implements AutoCloseable
// Modular DRM begin
/**
- * Interface definition of a callback to be invoked when the app
- * can do DRM configuration (get/set properties) before the session
- * is opened. This facilitates configuration of the properties, like
- * 'securityLevel', which has to be set after DRM scheme creation but
- * before the DRM session is opened.
+ * An immutable structure per {@link DataSourceDesc} with settings required to initiate a DRM
+ * protected playback session.
*
- * The only allowed DRM calls in this listener are
- * {@link MediaPlayer2#getDrmPropertyString(DataSourceDesc, String)}
- * and {@link MediaPlayer2#setDrmPropertyString(DataSourceDesc, String, String)}.
- * @hide
+ * @see DrmPreparationInfo.Builder
*/
- public interface OnDrmConfigHelper {
+ public static final class DrmPreparationInfo {
+
/**
- * Called to give the app the opportunity to configure DRM before the session is created
- *
- * @param mp the {@code MediaPlayer2} associated with this callback
- * @param dsd the DataSourceDesc of this data source
+ * Mutable builder to create a {@link MediaPlayer2.DrmPreparationInfo} object.
*/
- public void onDrmConfig(MediaPlayer2 mp, DataSourceDesc dsd);
- }
+ public static final class Builder {
+
+ private UUID mUUID;
+ private byte[] mKeySetId;
+ private byte[] mInitData;
+ private String mMimeType;
+ private int mKeyType;
+ private Map<String, String> mOptionalParameters;
+
+ /**
+ * Set UUID of the crypto scheme selected to decrypt content. An UUID can be retrieved from
+ * the source listening to {@link MediaPlayer2.DrmEventCallback#onDrmInfo}.
+ *
+ * @param uuid of selected crypto scheme
+ * @return this
+ */
+ public Builder setUuid(@NonNull UUID uuid) {
+ this.mUUID = uuid;
+ return this;
+ }
- /**
- * Register a callback to be invoked for configuration of the DRM object before
- * the session is created.
- * The callback will be invoked synchronously during the execution
- * of {@link #prepareDrm}.
- *
- * @param listener the callback that will be run
- * @hide
- */
- // This is a synchronous call.
- public void setOnDrmConfigHelper(OnDrmConfigHelper listener) {
- mOnDrmConfigHelper = listener;
- }
+ /**
+ * Set identifier of a persisted offline key obtained from
+ * {@link MediaPlayer2.DrmEventCallback#onDrmPrepared(MediaPlayer2, DataSourceDesc, int, byte[])}.
+ *
+ * A {@code keySetId} can be used to restore persisted offline keys into a new playback
+ * session of a DRM protected data source. When {@code keySetId} is set, {@code initData},
+ * {@code mimeType}, {@code keyType}, {@code optionalParameters} are ignored.
+ *
+ * @param keySetId identifier of a persisted offline key
+ * @return this
+ */
+ public Builder setKeySetId(@Nullable byte[] keySetId) {
+ this.mKeySetId = keySetId;
+ return this;
+ }
+
+ /**
+ * Set container-specific DRM initialization data. Its meaning is interpreted based on
+ * {@code mimeType}. For example, it could contain the content ID, key ID or other data
+ * obtained from the content metadata that is required to generate a
+ * {@link MediaDrm.KeyRequest}.
+ *
+ * @param initData container-specific DRM initialization data
+ * @return this
+ */
+ public Builder setInitData(@Nullable byte[] initData) {
+ this.mInitData = initData;
+ return this;
+ }
+
+ /**
+ * Set mime type of the content
+ *
+ * @param mimeType mime type to the content
+ * @return this
+ */
+ public Builder setMimeType(@Nullable String mimeType) {
+ this.mMimeType = mimeType;
+ return this;
+ }
+
+ /**
+ * Set type of the key request. The request may be to acquire keys
+ * for streaming, {@link MediaDrm#KEY_TYPE_STREAMING}, or for offline content,
+ * {@link MediaDrm#KEY_TYPE_OFFLINE}. Releasing previously acquired keys
+ * ({@link MediaDrm#KEY_TYPE_RELEASE}) is not allowed.
+ *
+ * @param keyType type of the key request
+ * @return this
+ */
+ public Builder setKeyType(@MediaPlayer2.MediaDrmKeyType int keyType) {
+ this.mKeyType = keyType;
+ return this;
+ }
+
+ /**
+ * Set optional parameters to be included in a {@link MediaDrm.KeyRequest} message sent to
+ * the license server.
+ *
+ * @param optionalParameters optional parameters to be included in a key request
+ * @return this
+ */
+ public Builder setOptionalParameters(
+ @Nullable Map<String, String> optionalParameters) {
+ this.mOptionalParameters = optionalParameters;
+ return this;
+ }
+
+ /**
+ * @return an immutable {@link MediaPlayer2.DrmPreparationInfo} representing the settings of this builder
+ */
+ public MediaPlayer2.DrmPreparationInfo build() {
+ return new MediaPlayer2.DrmPreparationInfo(mUUID, mKeySetId, mInitData, mMimeType, mKeyType,
+ mOptionalParameters);
+ }
+
+ }
+
+ private final UUID mUUID;
+ private final byte[] mKeySetId;
+ private final byte[] mInitData;
+ private final String mMimeType;
+ private final int mKeyType;
+ private final Map<String, String> mOptionalParameters;
- private OnDrmConfigHelper mOnDrmConfigHelper;
+ private DrmPreparationInfo(UUID mUUID, byte[] mKeySetId, byte[] mInitData, String mMimeType,
+ int mKeyType, Map<String, String> optionalParameters) {
+ this.mUUID = mUUID;
+ this.mKeySetId = mKeySetId;
+ this.mInitData = mInitData;
+ this.mMimeType = mMimeType;
+ this.mKeyType = mKeyType;
+ this.mOptionalParameters = optionalParameters;
+ }
+
+ }
/**
* Interface definition for callbacks to be invoked when the player has the corresponding
* DRM events.
- * @hide
*/
public static class DrmEventCallback {
/**
- * Called to indicate DRM info is available
+ * Called to indicate DRM info is available. Return a {@link DrmPreparationInfo} object that
+ * bundles DRM initialization parameters.
*
* @param mp the {@code MediaPlayer2} associated with this callback
- * @param dsd the DataSourceDesc of this data source
- * @param drmInfo DRM info of the source including PSSH, and subset
- * of crypto schemes supported by this device
+ * @param dsd the {@link DataSourceDesc} of this data source
+ * @param drmInfo DRM info of the source including PSSH, and subset of crypto schemes
+ * supported by this device
+ * @return a {@link DrmPreparationInfo} object to initialize DRM playback, or null to skip
+ * DRM initialization
*/
- public void onDrmInfo(MediaPlayer2 mp, DataSourceDesc dsd, DrmInfo drmInfo) { }
+ public DrmPreparationInfo onDrmInfo(MediaPlayer2 mp, DataSourceDesc dsd, DrmInfo drmInfo) {
+ return null;
+ }
/**
- * Called to notify the client that {@link MediaPlayer2#prepareDrm(DataSourceDesc, UUID)}
- * is finished and ready for key request/response.
+ * Called to notify the client that {@code mp} is ready to decrypt DRM protected data source
+ * {@code dsd}
*
* @param mp the {@code MediaPlayer2} associated with this callback
- * @param dsd the DataSourceDesc of this data source
+ * @param dsd the {@link DataSourceDesc} of this data source
* @param status the result of DRM preparation.
+ * @param keySetId optional identifier that can be used to restore DRM playback initiated
+ * with a {@link MediaDrm#KEY_TYPE_OFFLINE} key request.
+ *
+ * @see DrmPreparationInfo.Builder#setKeySetId(byte[])
+ */
+ public void onDrmPrepared(@NonNull MediaPlayer2 mp, @NonNull DataSourceDesc dsd,
+ @PrepareDrmStatusCode int status, @Nullable byte[] keySetId) { }
+
+ /**
+ * Called to give the app the opportunity to configure DRM before the session is created.
+ *
+ * This facilitates configuration of the properties, like 'securityLevel', which
+ * has to be set after DRM scheme creation but before the DRM session is opened.
+ *
+ * The only allowed DRM calls in this listener are
+ * {@link MediaDrm#getPropertyString(String)},
+ * {@link MediaDrm#getPropertyByteArray(String)},
+ * {@link MediaDrm#setPropertyString(String, String)},
+ * {@link MediaDrm#setPropertyByteArray(String, byte[])},
+ * {@link MediaDrm#setOnExpirationUpdateListener},
+ * and {@link MediaDrm#setOnKeyStatusChangeListener}.
+ *
+ * @param mp the {@code MediaPlayer2} associated with this callback
+ * @param dsd the {@link DataSourceDesc} of this data source
+ * @param drm handle to get/set DRM properties and listeners for this data source
*/
- public void onDrmPrepared(
- MediaPlayer2 mp, DataSourceDesc dsd, @PrepareDrmStatusCode int status) { }
+ public void onDrmConfig(@NonNull MediaPlayer2 mp, @NonNull DataSourceDesc dsd,
+ @NonNull MediaDrm drm) { }
+
+ /**
+ * Called to indicate the DRM session for {@code dsd} is ready for key request/response
+ *
+ * @param mp the {@code MediaPlayer2} associated with this callback
+ * @param dsd the {@link DataSourceDesc} of this data source
+ * @param request a {@link MediaDrm.KeyRequest} prepared using the
+ * {@link DrmPreparationInfo} returned from
+ * {@link #onDrmInfo(MediaPlayer2, DataSourceDesc, DrmInfo)}
+ * @return the response to {@code request} (from license server)
+ */
+ public byte[] onDrmKeyRequest(@NonNull MediaPlayer2 mp, @NonNull DataSourceDesc dsd,
+ @NonNull MediaDrm.KeyRequest request) {
+ return null;
+ }
+
}
- private final Object mDrmEventCbLock = new Object();
- private ArrayList<Pair<Executor, DrmEventCallback>> mDrmEventCallbackRecords =
+ private final Object mDrmEventCallbackLock = new Object();
+ private List<Pair<Executor, DrmEventCallback>> mDrmEventCallbackRecords =
new ArrayList<Pair<Executor, DrmEventCallback>>();
/**
@@ -3327,10 +3578,9 @@ public class MediaPlayer2 implements AutoCloseable
*
* @param eventCallback the callback that will be run
* @param executor the executor through which the callback should be invoked
- * @hide
*/
// This is a synchronous call.
- public void registerDrmEventCallback(@NonNull @CallbackExecutor Executor executor,
+ public void setDrmEventCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull DrmEventCallback eventCallback) {
if (eventCallback == null) {
throw new IllegalArgumentException("Illegal null EventCallback");
@@ -3339,8 +3589,9 @@ public class MediaPlayer2 implements AutoCloseable
throw new IllegalArgumentException(
"Illegal null Executor for the EventCallback");
}
- synchronized (mDrmEventCbLock) {
- mDrmEventCallbackRecords.add(new Pair(executor, eventCallback));
+ synchronized (mDrmEventCallbackLock) {
+ mDrmEventCallbackRecords = Collections.singletonList(
+ new Pair<Executor, DrmEventCallback>(executor, eventCallback));
}
}
@@ -3352,7 +3603,7 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is a synchronous call.
public void unregisterDrmEventCallback(DrmEventCallback eventCallback) {
- synchronized (mDrmEventCbLock) {
+ synchronized (mDrmEventCallbackLock) {
for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
if (cb.second == eventCallback) {
mDrmEventCallbackRecords.remove(cb);
@@ -3466,7 +3717,7 @@ public class MediaPlayer2 implements AutoCloseable
/**
* Prepares the DRM for the given data source
* <p>
- * If {@link OnDrmConfigHelper} is registered, it will be called during
+ * If {@link DrmEventCallback} is registered, it will be called during
* preparation to allow configuration of the DRM properties before opening the
* DRM session. It should be used only for a series of
* {@link #getDrmPropertyString(DataSourceDesc, String)} and
@@ -3489,8 +3740,7 @@ public class MediaPlayer2 implements AutoCloseable
* @param dsd The DRM protected data source
*
* @param uuid The UUID of the crypto scheme. If not known beforehand, it can be retrieved
- * from the source through {@link #getDrmInfo(DataSourceDesc)} or registering a
- * {@link DrmEventCallback#onDrmInfo}.
+ * from the source listening to {@link DrmEventCallback#onDrmInfo}.
*
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
* @hide
@@ -3563,8 +3813,8 @@ public class MediaPlayer2 implements AutoCloseable
sendDrmEvent(new DrmEventNotifier() {
@Override
public void notify(DrmEventCallback callback) {
- callback.onDrmPrepared(
- MediaPlayer2.this, dsd, prepareDrmStatus);
+ callback.onDrmPrepared(MediaPlayer2.this, dsd, prepareDrmStatus,
+ /* TODO: keySetId */ null);
}
});
@@ -3778,7 +4028,6 @@ public class MediaPlayer2 implements AutoCloseable
/**
* Encapsulates the DRM properties of the source.
- * @hide
*/
public static final class DrmInfo {
private Map<UUID, byte[]> mMapPssh;
@@ -3915,10 +4164,8 @@ public class MediaPlayer2 implements AutoCloseable
}; // DrmInfo
/**
- * Thrown when a DRM method is called before preparing a DRM scheme through
- * {@link MediaPlayer2#prepareDrm(DataSourceDesc, UUID)}.
+ * Thrown when a DRM method is called when there is no active DRM session.
* Extends MediaDrm.MediaDrmException
- * @hide
*/
public static final class NoDrmSchemeException extends MediaDrmException {
public NoDrmSchemeException(String detailMessage) {
@@ -4193,9 +4440,9 @@ public class MediaPlayer2 implements AutoCloseable
}
void prepare(UUID uuid) throws UnsupportedSchemeException,
- ResourceBusyException, NotProvisionedException {
- final OnDrmConfigHelper onDrmConfigHelper = mOnDrmConfigHelper;
- Log.v(TAG, "prepareDrm: uuid: " + uuid + " mOnDrmConfigHelper: " + onDrmConfigHelper);
+ ResourceBusyException, NotProvisionedException, InterruptedException,
+ ExecutionException {
+ Log.v(TAG, "prepareDrm: uuid: " + uuid);
synchronized (this) {
if (mActiveDrmUUID != null) {
@@ -4236,9 +4483,13 @@ public class MediaPlayer2 implements AutoCloseable
} // synchronized
// call the callback outside the lock
- if (onDrmConfigHelper != null) {
- onDrmConfigHelper.onDrmConfig(MediaPlayer2.this, mDSD);
- }
+ sendDrmEventWait(new DrmEventNotifier<Void>() {
+ @Override
+ public Void notifyWait(DrmEventCallback callback) {
+ callback.onDrmConfig(MediaPlayer2.this, mDSD, mDrmObj);
+ return null;
+ }
+ });
synchronized (this) {
mDrmConfigAllowed = false;
@@ -4408,7 +4659,7 @@ public class MediaPlayer2 implements AutoCloseable
@Override
public void notify(DrmEventCallback callback) {
callback.onDrmPrepared(
- MediaPlayer2.this, mDSD, finalStatus);
+ MediaPlayer2.this, mDSD, finalStatus, /* TODO: keySetId */ null);
}
});
diff --git a/media/java/android/media/MediaPlayer2Utils.java b/media/apex/java/android/media/MediaPlayer2Utils.java
index c6dee22813a0..c6dee22813a0 100644
--- a/media/java/android/media/MediaPlayer2Utils.java
+++ b/media/apex/java/android/media/MediaPlayer2Utils.java
diff --git a/media/java/android/media/RoutingDelegate.java b/media/apex/java/android/media/RoutingDelegate.java
index 23598130f391..23598130f391 100644
--- a/media/java/android/media/RoutingDelegate.java
+++ b/media/apex/java/android/media/RoutingDelegate.java
diff --git a/media/java/android/media/UriDataSourceDesc.java b/media/apex/java/android/media/UriDataSourceDesc.java
index 4eb9e8d3376f..4eb9e8d3376f 100644
--- a/media/java/android/media/UriDataSourceDesc.java
+++ b/media/apex/java/android/media/UriDataSourceDesc.java
diff --git a/media/java/android/media/VideoSize.java b/media/apex/java/android/media/VideoSize.java
index 19631e09853d..19631e09853d 100644
--- a/media/java/android/media/VideoSize.java
+++ b/media/apex/java/android/media/VideoSize.java
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 4f23cca1171f..f5a6f8667fa6 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -736,8 +736,9 @@ public final class AudioAttributes implements Parcelable {
* @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
* {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
* {@link MediaRecorder.AudioSource#VOICE_RECOGNITION},
- * {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION} or
- * {@link MediaRecorder.AudioSource#UNPROCESSED}
+ * {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION},
+ * {@link MediaRecorder.AudioSource#UNPROCESSED} or
+ * {@link MediaRecorder.AudioSource#VOICE_PERFORMANCE}
* @return the same Builder instance.
*/
@SystemApi
@@ -749,6 +750,7 @@ public final class AudioAttributes implements Parcelable {
case MediaRecorder.AudioSource.VOICE_RECOGNITION:
case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
case MediaRecorder.AudioSource.UNPROCESSED:
+ case MediaRecorder.AudioSource.VOICE_PERFORMANCE:
mSource = preset;
break;
default:
@@ -760,7 +762,7 @@ public final class AudioAttributes implements Parcelable {
/**
* @hide
* Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD,
- * REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK and VOICE_CALL.
+ * REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK, VOICE_CALL and ECHO_REFERENCE.
* @param preset
* @return the same Builder instance.
*/
@@ -771,7 +773,8 @@ public final class AudioAttributes implements Parcelable {
|| (preset == MediaRecorder.AudioSource.RADIO_TUNER)
|| (preset == MediaRecorder.AudioSource.VOICE_DOWNLINK)
|| (preset == MediaRecorder.AudioSource.VOICE_UPLINK)
- || (preset == MediaRecorder.AudioSource.VOICE_CALL)) {
+ || (preset == MediaRecorder.AudioSource.VOICE_CALL)
+ || (preset == MediaRecorder.AudioSource.ECHO_REFERENCE)) {
mSource = preset;
} else {
setCapturePreset(preset);
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 4f8faec0a4a8..ea14b7d8dc95 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
@@ -867,7 +868,7 @@ public final class AudioFormat implements Parcelable {
*
* @return The audio frame size in bytes corresponding to the encoding and the channel mask.
*/
- public int getFrameSizeInBytes() {
+ public @IntRange(from = 1) int getFrameSizeInBytes() {
return mFrameSizeInBytes;
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index cd67177aa4ed..a628eac21942 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -28,6 +28,7 @@ import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothCodecConfig;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
@@ -3820,6 +3821,12 @@ public class AudioManager {
public static final int DEVICE_IN_HDMI =
AudioSystem.DEVICE_IN_HDMI;
/** @hide
+ * The audio input device code for HDMI ARC
+ */
+ public static final int DEVICE_IN_HDMI_ARC =
+ AudioSystem.DEVICE_IN_HDMI_ARC;
+
+ /** @hide
* The audio input device code for telephony voice RX path
*/
public static final int DEVICE_IN_TELEPHONY_RX =
@@ -4065,6 +4072,36 @@ public class AudioManager {
}
}
+ /**
+ * Indicate A2DP source or sink active device change and eventually suppress
+ * the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent.
+ * @param device Bluetooth device connected/disconnected
+ * @param state new connection state (BluetoothProfile.STATE_xxx)
+ * @param profile profile for the A2DP device
+ * (either {@link android.bluetooth.BluetoothProfile.A2DP} or
+ * {@link android.bluetooth.BluetoothProfile.A2DP_SINK})
+ * @param a2dpVolume New volume for the connecting device. Does nothing if
+ * disconnecting. Pass value -1 in case you want this field to be ignored
+ * @param suppressNoisyIntent if true the
+ * {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent will not be sent.
+ * @return a delay in ms that the caller should wait before broadcasting
+ * BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent.
+ * {@hide}
+ */
+ public int handleBluetoothA2dpActiveDeviceChange(
+ BluetoothDevice device, int state, int profile,
+ boolean suppressNoisyIntent, int a2dpVolume) {
+ final IAudioService service = getService();
+ int delay = 0;
+ try {
+ delay = service.handleBluetoothA2dpActiveDeviceChange(device,
+ state, profile, suppressNoisyIntent, a2dpVolume);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ return delay;
+ }
+
/** {@hide} */
public IRingtonePlayer getRingtonePlayer() {
try {
@@ -4928,6 +4965,34 @@ public class AudioManager {
return microphones;
}
+ /**
+ * Returns a list of audio formats that corresponds to encoding formats
+ * supported on offload path for A2DP playback.
+ *
+ * @return a list of {@link BluetoothCodecConfig} objects containing encoding formats
+ * supported for offload A2DP playback
+ * @hide
+ */
+ public List<BluetoothCodecConfig> getHwOffloadEncodingFormatsSupportedForA2DP() {
+ ArrayList<Integer> formatsList = new ArrayList<Integer>();
+ ArrayList<BluetoothCodecConfig> codecConfigList = new ArrayList<BluetoothCodecConfig>();
+
+ int status = AudioSystem.getHwOffloadEncodingFormatsSupportedForA2DP(formatsList);
+ if (status != AudioManager.SUCCESS) {
+ Log.e(TAG, "getHwOffloadEncodingFormatsSupportedForA2DP failed:" + status);
+ return codecConfigList;
+ }
+
+ for (Integer format : formatsList) {
+ int btSourceCodec = AudioSystem.audioFormatToBluetoothSourceCodec(format);
+ if (btSourceCodec
+ != BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID) {
+ codecConfigList.add(new BluetoothCodecConfig(btSourceCodec));
+ }
+ }
+ return codecConfigList;
+ }
+
// Since we need to calculate the changes since THE LAST NOTIFICATION, and not since the
// (unpredictable) last time updateAudioPortCache() was called by someone, keep a list
// of the ports that exist at the time of the last notification.
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 10a52ade5cd9..c5b117874a51 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -61,7 +61,8 @@ import java.util.concurrent.Executor;
* been read yet. Data should be read from the audio hardware in chunks of sizes inferior to
* the total recording buffer size.
*/
-public class AudioRecord implements AudioRouting, AudioRecordingMonitor, AudioRecordingMonitorClient
+public class AudioRecord implements AudioRouting, MicrophoneDirection,
+ AudioRecordingMonitor, AudioRecordingMonitorClient
{
//---------------------------------------------------------
// Constants
@@ -1668,7 +1669,6 @@ public class AudioRecord implements AudioRouting, AudioRecordingMonitor, AudioRe
return activeMicrophones;
}
-
//--------------------------------------------------------------------------
// Implementation of AudioRecordingMonitor interface
//--------------------
@@ -1718,6 +1718,33 @@ public class AudioRecord implements AudioRouting, AudioRecordingMonitor, AudioRe
return native_getPortId();
}
+ //--------------------------------------------------------------------------
+ // MicrophoneDirection
+ //--------------------
+ /**
+ * Specifies the logical microphone (for processing).
+ *
+ * @param direction Direction constant (MicrophoneDirection.MIC_DIRECTION_*)
+ * @return retval OK if the call is successful, an error code otherwise.
+ * @hide
+ */
+ public int setMicrophoneDirection(int direction) {
+ return native_set_microphone_direction(direction);
+ }
+
+ /**
+ * Specifies the zoom factor (i.e. the field dimension) for the selected microphone
+ * (for processing). The selected microphone is determined by the use-case for the stream.
+ *
+ * @param zoom the desired field dimension of microphone capture. Range is from -1 (wide angle),
+ * though 0 (no zoom) to 1 (maximum zoom).
+ * @return retval OK if the call is successful, an error code otherwise.
+ * @hide
+ */
+ public int setMicrophoneFieldDimension(float zoom) {
+ return native_set_microphone_field_dimension(zoom);
+ }
+
//---------------------------------------------------------
// Interface definitions
//--------------------
@@ -1871,6 +1898,9 @@ public class AudioRecord implements AudioRouting, AudioRecordingMonitor, AudioRe
private native int native_getPortId();
+ private native int native_set_microphone_direction(int direction);
+ private native int native_set_microphone_field_dimension(float zoom);
+
//---------------------------------------------------------
// Utility methods
//------------------
diff --git a/media/java/android/media/AudioRecordingConfiguration.java b/media/java/android/media/AudioRecordingConfiguration.java
index de76aeff82c4..52771e4199d8 100644
--- a/media/java/android/media/AudioRecordingConfiguration.java
+++ b/media/java/android/media/AudioRecordingConfiguration.java
@@ -172,7 +172,8 @@ public final class AudioRecordingConfiguration implements Parcelable {
MediaRecorder.AudioSource.CAMCORDER,
MediaRecorder.AudioSource.VOICE_RECOGNITION,
MediaRecorder.AudioSource.VOICE_COMMUNICATION,
- MediaRecorder.AudioSource.UNPROCESSED
+ MediaRecorder.AudioSource.UNPROCESSED,
+ MediaRecorder.AudioSource.VOICE_PERFORMANCE
})
@Retention(RetentionPolicy.SOURCE)
public @interface AudioSource {}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 45cde0ffecc4..2848b89a45ca 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -18,6 +18,7 @@ package android.media;
import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
+import android.bluetooth.BluetoothCodecConfig;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
@@ -140,6 +141,29 @@ public class AudioSystem
}
}
+ /* Formats for A2DP codecs, must match system/audio-base.h audio_format_t */
+ public static final int AUDIO_FORMAT_INVALID = 0xFFFFFFFF;
+ public static final int AUDIO_FORMAT_DEFAULT = 0;
+ public static final int AUDIO_FORMAT_AAC = 0x04000000;
+ public static final int AUDIO_FORMAT_SBC = 0x1F000000;
+ public static final int AUDIO_FORMAT_APTX = 0x20000000;
+ public static final int AUDIO_FORMAT_APTX_HD = 0x21000000;
+ public static final int AUDIO_FORMAT_LDAC = 0x23000000;
+
+ /**
+ * Convert audio format enum values to Bluetooth codec values
+ */
+ public static int audioFormatToBluetoothSourceCodec(int audioFormat) {
+ switch (audioFormat) {
+ case AUDIO_FORMAT_AAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC;
+ case AUDIO_FORMAT_SBC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC;
+ case AUDIO_FORMAT_APTX: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX;
+ case AUDIO_FORMAT_APTX_HD: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD;
+ case AUDIO_FORMAT_LDAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
+ default: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID;
+ }
+ }
+
/* Routing bits for the former setRouting/getRouting API */
/** @deprecated */
@Deprecated public static final int ROUTE_EARPIECE = (1 << 0);
@@ -541,6 +565,9 @@ public class AudioSystem
public static final int DEVICE_IN_BUS = DEVICE_BIT_IN | 0x100000;
public static final int DEVICE_IN_PROXY = DEVICE_BIT_IN | 0x1000000;
public static final int DEVICE_IN_USB_HEADSET = DEVICE_BIT_IN | 0x2000000;
+ public static final int DEVICE_IN_BLUETOOTH_BLE = DEVICE_BIT_IN | 0x4000000;
+ public static final int DEVICE_IN_HDMI_ARC = DEVICE_BIT_IN | 0x8000000;
+ public static final int DEVICE_IN_ECHO_REFERENCE = DEVICE_BIT_IN | 0x10000000;
@UnsupportedAppUsage
public static final int DEVICE_IN_DEFAULT = DEVICE_BIT_IN | DEVICE_BIT_DEFAULT;
@@ -567,6 +594,9 @@ public class AudioSystem
DEVICE_IN_BUS |
DEVICE_IN_PROXY |
DEVICE_IN_USB_HEADSET |
+ DEVICE_IN_BLUETOOTH_BLE |
+ DEVICE_IN_HDMI_ARC |
+ DEVICE_IN_ECHO_REFERENCE |
DEVICE_IN_DEFAULT);
public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET;
public static final int DEVICE_IN_ALL_USB = (DEVICE_IN_USB_ACCESSORY |
@@ -641,6 +671,9 @@ public class AudioSystem
public static final String DEVICE_IN_BUS_NAME = "bus";
public static final String DEVICE_IN_PROXY_NAME = "proxy";
public static final String DEVICE_IN_USB_HEADSET_NAME = "usb_headset";
+ public static final String DEVICE_IN_BLUETOOTH_BLE_NAME = "bt_ble";
+ public static final String DEVICE_IN_ECHO_REFERENCE_NAME = "echo_reference";
+ public static final String DEVICE_IN_HDMI_ARC_NAME = "hdmi_arc";
@UnsupportedAppUsage
public static String getOutputDeviceName(int device)
@@ -757,6 +790,12 @@ public class AudioSystem
return DEVICE_IN_PROXY_NAME;
case DEVICE_IN_USB_HEADSET:
return DEVICE_IN_USB_HEADSET_NAME;
+ case DEVICE_IN_BLUETOOTH_BLE:
+ return DEVICE_IN_BLUETOOTH_BLE_NAME;
+ case DEVICE_IN_ECHO_REFERENCE:
+ return DEVICE_IN_ECHO_REFERENCE_NAME;
+ case DEVICE_IN_HDMI_ARC:
+ return DEVICE_IN_HDMI_ARC_NAME;
case DEVICE_IN_DEFAULT:
default:
return Integer.toString(device);
@@ -850,12 +889,14 @@ public class AudioSystem
*/
@UnsupportedAppUsage
public static native int setDeviceConnectionState(int device, int state,
- String device_address, String device_name);
+ String device_address, String device_name,
+ int codecFormat);
@UnsupportedAppUsage
public static native int getDeviceConnectionState(int device, String device_address);
public static native int handleDeviceConfigChange(int device,
String device_address,
- String device_name);
+ String device_name,
+ int codecFormat);
@UnsupportedAppUsage
public static native int setPhoneState(int state);
@UnsupportedAppUsage
@@ -940,6 +981,12 @@ public class AudioSystem
public static native int getSurroundFormats(Map<Integer, Boolean> surroundFormats,
boolean reported);
+ /**
+ * Returns a list of audio formats (codec) supported on the A2DP offload path.
+ */
+ public static native int getHwOffloadEncodingFormatsSupportedForA2DP(
+ ArrayList<Integer> formatList);
+
public static native int setSurroundFormatEnabled(int audioFormat, boolean enabled);
/**
diff --git a/media/java/android/media/Controller2Link.java b/media/java/android/media/Controller2Link.java
index a62db5f1fb20..d11f7769ee5e 100644
--- a/media/java/android/media/Controller2Link.java
+++ b/media/java/android/media/Controller2Link.java
@@ -16,6 +16,7 @@
package android.media;
+import android.os.Binder;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -102,6 +103,15 @@ public final class Controller2Link implements Parcelable {
}
}
+ /** Interface method for IMediaController2.notifyPlaybackActiveChanged */
+ public void notifyPlaybackActiveChanged(int seq, boolean playbackActive) {
+ try {
+ mIController.notifyPlaybackActiveChanged(seq, playbackActive);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
/** Interface method for IMediaController2.sendSessionCommand */
public void sendSessionCommand(int seq, Session2Command command, Bundle args,
ResultReceiver resultReceiver) {
@@ -135,6 +145,11 @@ public final class Controller2Link implements Parcelable {
mController.onDisconnected(seq);
}
+ /** Stub implementation for IMediaController2.notifyPlaybackActiveChanged */
+ public void onPlaybackActiveChanged(int seq, boolean playbackActive) {
+ mController.onPlaybackActiveChanged(seq, playbackActive);
+ }
+
/** Stub implementation for IMediaController2.sendSessionCommand */
public void onSessionCommand(int seq, Session2Command command, Bundle args,
ResultReceiver resultReceiver) {
@@ -149,23 +164,53 @@ public final class Controller2Link implements Parcelable {
private class Controller2Stub extends IMediaController2.Stub {
@Override
public void notifyConnected(int seq, Bundle connectionResult) {
- Controller2Link.this.onConnected(seq, connectionResult);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Controller2Link.this.onConnected(seq, connectionResult);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void notifyDisconnected(int seq) {
- Controller2Link.this.onDisconnected(seq);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Controller2Link.this.onDisconnected(seq);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void notifyPlaybackActiveChanged(int seq, boolean playbackActive) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Controller2Link.this.onPlaybackActiveChanged(seq, playbackActive);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void sendSessionCommand(int seq, Session2Command command, Bundle args,
ResultReceiver resultReceiver) {
- Controller2Link.this.onSessionCommand(seq, command, args, resultReceiver);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Controller2Link.this.onSessionCommand(seq, command, args, resultReceiver);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void cancelSessionCommand(int seq) {
- Controller2Link.this.onCancelCommand(seq);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Controller2Link.this.onCancelCommand(seq);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
}
}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 9fbd7eac6e8a..14bdab98d46b 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -155,6 +155,9 @@ interface IAudioService {
void handleBluetoothA2dpDeviceConfigChange(in BluetoothDevice device);
+ int handleBluetoothA2dpActiveDeviceChange(in BluetoothDevice device,
+ int state, int profile, boolean suppressNoisyIntent, int a2dpVolume);
+
AudioRoutesInfo startWatchingRoutes(in IAudioRoutesObserver observer);
boolean isCameraSoundForced();
diff --git a/media/java/android/media/IMediaController2.aidl b/media/java/android/media/IMediaController2.aidl
index ca5394f504cb..42c6e70529ec 100644
--- a/media/java/android/media/IMediaController2.aidl
+++ b/media/java/android/media/IMediaController2.aidl
@@ -31,8 +31,9 @@ import android.media.Session2Command;
oneway interface IMediaController2 {
void notifyConnected(int seq, in Bundle connectionResult) = 0;
void notifyDisconnected(int seq) = 1;
+ void notifyPlaybackActiveChanged(int seq, boolean playbackActive) = 2;
void sendSessionCommand(int seq, in Session2Command command, in Bundle args,
- in ResultReceiver resultReceiver) = 2;
- void cancelSessionCommand(int seq) = 3;
- // Next Id : 4
+ in ResultReceiver resultReceiver) = 3;
+ void cancelSessionCommand(int seq) = 4;
+ // Next Id : 5
}
diff --git a/media/java/android/media/IMediaSession2Service.aidl b/media/java/android/media/IMediaSession2Service.aidl
new file mode 100644
index 000000000000..10ac1be0a36e
--- /dev/null
+++ b/media/java/android/media/IMediaSession2Service.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.os.Bundle;
+import android.media.Controller2Link;
+
+/**
+ * Interface from MediaController2 to MediaSession2Service.
+ * <p>
+ * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
+ * and holds calls from controller to make controller owner(s) frozen.
+ * @hide
+ */
+oneway interface IMediaSession2Service {
+ void connect(in Controller2Link caller, int seq, in Bundle connectionRequest) = 0;
+ // Next Id : 1
+}
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 8ec0e353ac73..9ac147b59ee5 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -150,7 +150,7 @@ public class ImageReader implements AutoCloseable {
* consumer end-points. For example, if the application intends to send the images to
* {@link android.media.MediaCodec} or {@link android.media.MediaRecorder} for hardware video
* encoding, the format and usage flag combination needs to be
- * {@link ImageFormat#PRIVATE PRIVATE} and {@link HardwareBuffer#USAGE0_VIDEO_ENCODE}. When an
+ * {@link ImageFormat#PRIVATE PRIVATE} and {@link HardwareBuffer#USAGE_VIDEO_ENCODE}. When an
* {@link ImageReader} object is created with a valid size and such format/usage flag
* combination, the application can send the {@link Image images} to an {@link ImageWriter} that
* is created with the input {@link android.view.Surface} provided by the
@@ -173,7 +173,7 @@ public class ImageReader implements AutoCloseable {
* ImageReaders using other format such as {@link ImageFormat#YUV_420_888 YUV_420_888}.
* </p>
* <p>
- * Note that not all format and usage flag combination is supported by the
+ * Note that not all format and usage flag combinations are supported by the
* {@link ImageReader}. Below are the supported combinations by the {@link ImageReader}
* (assuming the consumer end-points support the such image consumption, e.g., hardware video
* encoding).
@@ -186,13 +186,13 @@ public class ImageReader implements AutoCloseable {
* <td>non-{@link android.graphics.ImageFormat#PRIVATE PRIVATE} formats defined by
* {@link android.graphics.ImageFormat ImageFormat} or
* {@link android.graphics.PixelFormat PixelFormat}</td>
- * <td>{@link HardwareBuffer#USAGE0_CPU_READ} or
- * {@link HardwareBuffer#USAGE0_CPU_READ_OFTEN}</td>
+ * <td>{@link HardwareBuffer#USAGE_CPU_READ_RARELY} or
+ * {@link HardwareBuffer#USAGE_CPU_READ_OFTEN}</td>
* </tr>
* <tr>
* <td>{@link android.graphics.ImageFormat#PRIVATE}</td>
- * <td>{@link HardwareBuffer#USAGE0_VIDEO_ENCODE} or
- * {@link HardwareBuffer#USAGE0_GPU_SAMPLED_IMAGE}, or combined</td>
+ * <td>{@link HardwareBuffer#USAGE_VIDEO_ENCODE} or
+ * {@link HardwareBuffer#USAGE_GPU_SAMPLED_IMAGE}, or combined</td>
* </tr>
* </table>
* Using other combinations may result in {@link IllegalArgumentException}.
@@ -208,11 +208,10 @@ public class ImageReader implements AutoCloseable {
* become available for access through {@link #acquireLatestImage()} or
* {@link #acquireNextImage()}. Must be greater than 0.
* @param usage The intended usage of the images produced by this ImageReader. It needs
- * to be one of the Usage0 defined by {@link HardwareBuffer}, or an
+ * to be one of the Usage defined by {@link HardwareBuffer}, or an
* {@link IllegalArgumentException} will be thrown.
* @see Image
* @see HardwareBuffer
- * @hide
*/
public static ImageReader newInstance(int width, int height, int format, int maxImages,
long usage) {
diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java
index 4c0153f70192..dd09afc3ddb0 100644
--- a/media/java/android/media/ImageWriter.java
+++ b/media/java/android/media/ImageWriter.java
@@ -168,7 +168,6 @@ public class ImageWriter implements AutoCloseable {
* {@link ImageFormat} or {@link PixelFormat}.
*
* @return a new ImageWriter instance.
- * @hide
*/
public static ImageWriter newInstance(Surface surface, int maxImages, int format) {
if (!ImageFormat.isPublicFormat(format) && !PixelFormat.isPublicFormat(format)) {
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 0375de3cc496..f756658b4fa8 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -1829,9 +1829,14 @@ final public class MediaCodec {
mBufferLock = new Object();
+ // save name used at creation
+ mNameAtCreation = nameIsType ? null : name;
+
native_setup(name, nameIsType, encoder);
}
+ private String mNameAtCreation;
+
@Override
protected void finalize() {
native_finalize();
@@ -2289,6 +2294,30 @@ final public class MediaCodec {
*/
public static final int ERROR_UNSUPPORTED_OPERATION = 6;
+ /**
+ * This indicates that the security level of the device is not
+ * sufficient to meet the requirements set by the content owner
+ * in the license policy.
+ */
+ public static final int ERROR_INSUFFICIENT_SECURITY = 7;
+
+ /**
+ * This indicates that the video frame being decrypted exceeds
+ * the size of the device's protected output buffers. When
+ * encountering this error the app should try playing content
+ * of a lower resolution.
+ */
+ public static final int ERROR_FRAME_TOO_LARGE = 8;
+
+ /**
+ * This error indicates that session state has been
+ * invalidated. It can occur on devices that are not capable
+ * of retaining crypto session state across device
+ * suspend/resume. The session must be closed and a new
+ * session opened to resume operation.
+ */
+ public static final int ERROR_LOST_STATE = 9;
+
/** @hide */
@IntDef({
ERROR_NO_KEY,
@@ -2296,7 +2325,10 @@ final public class MediaCodec {
ERROR_RESOURCE_BUSY,
ERROR_INSUFFICIENT_OUTPUT_PROTECTION,
ERROR_SESSION_NOT_OPENED,
- ERROR_UNSUPPORTED_OPERATION
+ ERROR_UNSUPPORTED_OPERATION,
+ ERROR_INSUFFICIENT_SECURITY,
+ ERROR_FRAME_TOO_LARGE,
+ ERROR_LOST_STATE
})
@Retention(RetentionPolicy.SOURCE)
public @interface CryptoErrorCode {}
@@ -3290,12 +3322,36 @@ final public class MediaCodec {
private native void native_setAudioPresentation(int presentationId, int programId);
/**
- * Get the component name. If the codec was created by createDecoderByType
- * or createEncoderByType, what component is chosen is not known beforehand.
+ * Retrieve the codec name.
+ *
+ * If the codec was created by createDecoderByType or createEncoderByType, what component is
+ * chosen is not known beforehand. This method returns the name of the codec that was
+ * selected by the platform.
+ *
+ * <strong>Note:</strong> Implementations may provide multiple aliases (codec
+ * names) for the same underlying codec, any of which can be used to instantiate the same
+ * underlying codec in {@link MediaCodec#createByCodecName}. This method returns the
+ * name used to create the codec in this case.
+ *
+ * @throws IllegalStateException if in the Released state.
+ */
+ @NonNull
+ public final String getName() {
+ // get canonical name to handle exception
+ String canonicalName = getCanonicalName();
+ return mNameAtCreation != null ? mNameAtCreation : canonicalName;
+ }
+
+ /**
+ * Retrieve the underlying codec name.
+ *
+ * This method is similar to {@link #getName}, except that it returns the underlying component
+ * name even if an alias was used to create this MediaCodec object by name,
+ *
* @throws IllegalStateException if in the Released state.
*/
@NonNull
- public native final String getName();
+ public native final String getCanonicalName();
/**
* Return Metrics data about the current codec instance.
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 9a711e628e55..572ca403eed5 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -32,8 +32,10 @@ import android.util.Size;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.Vector;
/**
* Provides information about a given media codec available on the device. You can
@@ -61,15 +63,25 @@ import java.util.Set;
*
*/
public final class MediaCodecInfo {
- private boolean mIsEncoder;
+ private static final String TAG = "MediaCodecInfo";
+
+ private static final int FLAG_IS_ENCODER = (1 << 0);
+ private static final int FLAG_IS_VENDOR = (1 << 1);
+ private static final int FLAG_IS_SOFTWARE_ONLY = (1 << 2);
+ private static final int FLAG_IS_HARDWARE_ACCELERATED = (1 << 3);
+
+ private int mFlags;
private String mName;
+ private String mCanonicalName;
private Map<String, CodecCapabilities> mCaps;
/* package private */ MediaCodecInfo(
- String name, boolean isEncoder, CodecCapabilities[] caps) {
+ String name, String canonicalName, int flags, CodecCapabilities[] caps) {
mName = name;
- mIsEncoder = isEncoder;
+ mCanonicalName = canonicalName;
+ mFlags = flags;
mCaps = new HashMap<String, CodecCapabilities>();
+
for (CodecCapabilities c: caps) {
mCaps.put(c.getMimeType(), c);
}
@@ -77,16 +89,69 @@ public final class MediaCodecInfo {
/**
* Retrieve the codec name.
+ *
+ * <strong>Note:</strong> Implementations may provide multiple aliases (codec
+ * names) for the same underlying codec, any of which can be used to instantiate the same
+ * underlying codec in {@link MediaCodec#createByCodecName}.
+ *
+ * Applications targeting SDK < {@link android.os.Build.VERSION_CODES#Q}, cannot determine if
+ * the multiple codec names listed in MediaCodecList are in-fact for the same codec.
*/
+ @NonNull
public final String getName() {
return mName;
}
/**
+ * Retrieve the underlying codec name.
+ *
+ * Device implementations may provide multiple aliases (codec names) for the same underlying
+ * codec to maintain backward app compatibility. This method returns the name of the underlying
+ * codec name, which must not be another alias. For non-aliases this is always the name of the
+ * codec.
+ */
+ @NonNull
+ public final String getCanonicalName() {
+ return mCanonicalName;
+ }
+
+ /**
+ * Query if the codec is an alias for another underlying codec.
+ */
+ public final boolean isAlias() {
+ return !mName.equals(mCanonicalName);
+ }
+
+ /**
* Query if the codec is an encoder.
*/
public final boolean isEncoder() {
- return mIsEncoder;
+ return (mFlags & FLAG_IS_ENCODER) != 0;
+ }
+
+ /**
+ * Query if the codec is provided by the Android platform (false) or the device manufacturer
+ * (true).
+ */
+ public final boolean isVendor() {
+ return (mFlags & FLAG_IS_VENDOR) != 0;
+ }
+
+ /**
+ * Query if the codec is software only. Software-only codecs are more secure as they run in
+ * a tighter security sandbox. On the other hand, software-only codecs do not provide any
+ * performance guarantees.
+ */
+ public final boolean isSoftwareOnly() {
+ return (mFlags & FLAG_IS_SOFTWARE_ONLY) != 0;
+ }
+
+ /**
+ * Query if the codec is hardware accelerated. This attribute is provided by the device
+ * manufacturer. Note that it cannot be tested for correctness.
+ */
+ public final boolean isHardwareAccelerated() {
+ return (mFlags & FLAG_IS_HARDWARE_ACCELERATED) != 0;
}
/**
@@ -163,7 +228,7 @@ public final class MediaCodecInfo {
// such as B-frame support, arithmetic coding...
public CodecProfileLevel[] profileLevels; // NOTE this array is modifiable by user
- // from OMX_COLOR_FORMATTYPE
+ // from MediaCodecConstants
/** @deprecated Use {@link #COLOR_Format24bitBGR888}. */
public static final int COLOR_FormatMonochrome = 1;
/** @deprecated Use {@link #COLOR_Format24bitBGR888}. */
@@ -344,7 +409,7 @@ public final class MediaCodecInfo {
/** @deprecated Use {@link #COLOR_FormatYUV420Flexible}. */
public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 0x7f000100;
// COLOR_FormatSurface indicates that the data will be a GraphicBuffer metadata reference.
- // In OMX this is called OMX_COLOR_FormatAndroidOpaque.
+ // Note: in OMX this is called OMX_COLOR_FormatAndroidOpaque.
public static final int COLOR_FormatSurface = 0x7F000789;
/**
@@ -435,8 +500,7 @@ public final class MediaCodecInfo {
public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 0x7fa30c00;
/**
- * Defined in the OpenMAX IL specs, color format values are drawn from
- * OMX_COLOR_FORMATTYPE.
+ * The color format for the media. This is one of the color constants defined in this class.
*/
public int[] colorFormats; // NOTE this array is modifiable by user
@@ -462,6 +526,26 @@ public final class MediaCodecInfo {
public static final String FEATURE_TunneledPlayback = "tunneled-playback";
/**
+ * If true, the timestamp of each output buffer is derived from the timestamp of the input
+ * buffer that produced the output. If false, the timestamp of each output buffer is
+ * derived from the timestamp of the first input buffer.
+ */
+ public static final String FEATURE_DynamicTimestamp = "dynamic-timestamp";
+
+ /**
+ * <b>decoder only</b>If true, the codec supports partial (including multiple) access units
+ * per input buffer.
+ */
+ public static final String FEATURE_FrameParsing = "frame-parsing";
+
+ /**
+ * If true, the codec supports multiple access units (for decoding, or to output for
+ * encoders). If false, the codec only supports single access units. Producing multiple
+ * access units for output is an optional feature.
+ */
+ public static final String FEATURE_MultipleFrames = "multiple-frames";
+
+ /**
* <b>video decoder only</b>: codec supports queuing partial frames.
*/
public static final String FEATURE_PartialFrame = "partial-frame";
@@ -497,10 +581,15 @@ public final class MediaCodecInfo {
new Feature(FEATURE_SecurePlayback, (1 << 1), false),
new Feature(FEATURE_TunneledPlayback, (1 << 2), false),
new Feature(FEATURE_PartialFrame, (1 << 3), false),
+ new Feature(FEATURE_FrameParsing, (1 << 4), false),
+ new Feature(FEATURE_MultipleFrames, (1 << 5), false),
+ new Feature(FEATURE_DynamicTimestamp, (1 << 6), false),
};
private static final Feature[] encoderFeatures = {
new Feature(FEATURE_IntraRefresh, (1 << 0), false),
+ new Feature(FEATURE_MultipleFrames, (1 << 1), false),
+ new Feature(FEATURE_DynamicTimestamp, (1 << 2), false),
};
/** @hide */
@@ -869,7 +958,7 @@ public final class MediaCodecInfo {
CodecCapabilities ret = new CodecCapabilities(
new CodecProfileLevel[] { pl }, new int[0], true /* encoder */,
- 0 /* flags */, defaultFormat, new MediaFormat() /* info */);
+ defaultFormat, new MediaFormat() /* info */);
if (ret.mError != 0) {
return null;
}
@@ -878,10 +967,10 @@ public final class MediaCodecInfo {
/* package private */ CodecCapabilities(
CodecProfileLevel[] profLevs, int[] colFmts,
- boolean encoder, int flags,
+ boolean encoder,
Map<String, Object>defaultFormatMap,
Map<String, Object>capabilitiesMap) {
- this(profLevs, colFmts, encoder, flags,
+ this(profLevs, colFmts, encoder,
new MediaFormat(defaultFormatMap),
new MediaFormat(capabilitiesMap));
}
@@ -889,11 +978,11 @@ public final class MediaCodecInfo {
private MediaFormat mCapabilitiesInfo;
/* package private */ CodecCapabilities(
- CodecProfileLevel[] profLevs, int[] colFmts, boolean encoder, int flags,
+ CodecProfileLevel[] profLevs, int[] colFmts, boolean encoder,
MediaFormat defaultFormat, MediaFormat info) {
final Map<String, Object> map = info.getMap();
colorFormats = colFmts;
- mFlagsVerified = flags;
+ mFlagsVerified = 0; // TODO: remove as it is unused
mDefaultFormat = defaultFormat;
mCapabilitiesInfo = info;
mMime = mDefaultFormat.getString(MediaFormat.KEY_MIME);
@@ -1243,6 +1332,7 @@ public final class MediaCodecInfo {
private Range<Rational> mBlockAspectRatioRange;
private Range<Long> mBlocksPerSecondRange;
private Map<Size, Range<Long>> mMeasuredFrameRates;
+ private Vector<PerformancePoint> mPerformancePoints;
private Range<Integer> mFrameRateRange;
private int mBlockWidth;
@@ -1524,6 +1614,158 @@ public final class MediaCodecInfo {
}
/**
+ * Video performance points are a set of standard performance points defined by pixel rate.
+ */
+ public static final class PerformancePoint {
+ /**
+ * Frame width in pixels.
+ */
+ public final int width;
+
+ /**
+ * Frame height in pixels.
+ */
+ public final int height;
+
+ /**
+ * Frame rate in frames per second.
+ */
+ public final int frameRate;
+
+ /* package private */
+ PerformancePoint(int width_, int height_, int frameRate_) {
+ width = width_;
+ height = height_;
+ frameRate = frameRate_;
+ }
+
+ /**
+ * Checks whether the performance point covers a media format.
+ *
+ * @param format Stream format considered
+ *
+ * @return {@code true} if the performance point covers the format.
+ */
+ public boolean covers(@NonNull MediaFormat format) {
+ // for simplicity, this code assumes a 16x16 block size.
+ long macroBlocks = ((width + 15) / 16) * (long)((height + 15) / 16);
+ long mbps = macroBlocks * frameRate;
+
+ long formatMacroBlocks =
+ (long)((format.getInteger(MediaFormat.KEY_WIDTH, 0) + 15) / 16)
+ * ((format.getInteger(MediaFormat.KEY_HEIGHT, 0) + 15) / 16);
+ double formatMbps =
+ Math.ceil(formatMacroBlocks
+ * format.getNumber(MediaFormat.KEY_FRAME_RATE, 0).doubleValue());
+ return formatMacroBlocks > 0 && formatMacroBlocks <= macroBlocks
+ && formatMbps <= mbps;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof PerformancePoint) {
+ PerformancePoint other = (PerformancePoint)o;
+ return ((long)width * height) == ((long)other.width * other.height)
+ && frameRate == other.frameRate;
+ }
+ return false;
+ }
+
+ /** 480p 24fps */
+ public static final PerformancePoint SD_24 = new PerformancePoint(720, 480, 24);
+ /** 576p 25fps */
+ public static final PerformancePoint SD_25 = new PerformancePoint(720, 576, 25);
+ /** 480p 30fps */
+ public static final PerformancePoint SD_30 = new PerformancePoint(720, 480, 30);
+ /** 480p 48fps */
+ public static final PerformancePoint SD_48 = new PerformancePoint(720, 480, 48);
+ /** 576p 50fps */
+ public static final PerformancePoint SD_50 = new PerformancePoint(720, 576, 50);
+ /** 480p 60fps */
+ public static final PerformancePoint SD_60 = new PerformancePoint(720, 480, 60);
+
+ /** 720p 24fps */
+ public static final PerformancePoint HD_24 = new PerformancePoint(1280, 720, 24);
+ /** 720p 25fps */
+ public static final PerformancePoint HD_25 = new PerformancePoint(1280, 720, 25);
+ /** 720p 30fps */
+ public static final PerformancePoint HD_30 = new PerformancePoint(1280, 720, 30);
+ /** 720p 50fps */
+ public static final PerformancePoint HD_50 = new PerformancePoint(1280, 720, 50);
+ /** 720p 60fps */
+ public static final PerformancePoint HD_60 = new PerformancePoint(1280, 720, 60);
+ /** 720p 100fps */
+ public static final PerformancePoint HD_100 = new PerformancePoint(1280, 720, 100);
+ /** 720p 120fps */
+ public static final PerformancePoint HD_120 = new PerformancePoint(1280, 720, 120);
+ /** 720p 200fps */
+ public static final PerformancePoint HD_200 = new PerformancePoint(1280, 720, 200);
+ /** 720p 240fps */
+ public static final PerformancePoint HD_240 = new PerformancePoint(1280, 720, 240);
+
+ /** 1080p 24fps */
+ public static final PerformancePoint FHD_24 = new PerformancePoint(1920, 1080, 24);
+ /** 1080p 25fps */
+ public static final PerformancePoint FHD_25 = new PerformancePoint(1920, 1080, 25);
+ /** 1080p 30fps */
+ public static final PerformancePoint FHD_30 = new PerformancePoint(1920, 1080, 30);
+ /** 1080p 50fps */
+ public static final PerformancePoint FHD_50 = new PerformancePoint(1920, 1080, 50);
+ /** 1080p 60fps */
+ public static final PerformancePoint FHD_60 = new PerformancePoint(1920, 1080, 60);
+ /** 1080p 100fps */
+ public static final PerformancePoint FHD_100 = new PerformancePoint(1920, 1080, 100);
+ /** 1080p 120fps */
+ public static final PerformancePoint FHD_120 = new PerformancePoint(1920, 1080, 120);
+ /** 1080p 200fps */
+ public static final PerformancePoint FHD_200 = new PerformancePoint(1920, 1080, 200);
+ /** 1080p 240fps */
+ public static final PerformancePoint FHD_240 = new PerformancePoint(1920, 1080, 240);
+
+ /** 2160p 24fps */
+ public static final PerformancePoint UHD_24 = new PerformancePoint(3840, 2160, 24);
+ /** 2160p 25fps */
+ public static final PerformancePoint UHD_25 = new PerformancePoint(3840, 2160, 25);
+ /** 2160p 30fps */
+ public static final PerformancePoint UHD_30 = new PerformancePoint(3840, 2160, 30);
+ /** 2160p 50fps */
+ public static final PerformancePoint UHD_50 = new PerformancePoint(3840, 2160, 50);
+ /** 2160p 60fps */
+ public static final PerformancePoint UHD_60 = new PerformancePoint(3840, 2160, 60);
+ /** 2160p 100fps */
+ public static final PerformancePoint UHD_100 = new PerformancePoint(3840, 2160, 100);
+ /** 2160p 120fps */
+ public static final PerformancePoint UHD_120 = new PerformancePoint(3840, 2160, 120);
+ /** 2160p 200fps */
+ public static final PerformancePoint UHD_200 = new PerformancePoint(3840, 2160, 200);
+ /** 2160p 240fps */
+ public static final PerformancePoint UHD_240 = new PerformancePoint(3840, 2160, 240);
+ }
+
+ /**
+ * Returns the supported performance points. May return {@code null} if the codec did not
+ * publish any performance point information (e.g. the vendor codecs have not been updated
+ * to the latest android release). May return an empty list if the codec published that
+ * if does not guarantee any performance points.
+ * <p>
+ * This is a performance guarantee provided by the device manufacturer for hardware codecs
+ * based on hardware capabilities of the device.
+ * <p>
+ * The returned list is sorted first by decreasing number of pixels, then by decreasing
+ * width, and finally by decreasing frame rate.
+ * Performance points assume a single active codec. For use cases where multiple
+ * codecs are active, should use that highest pixel count, and add the frame rates of
+ * each individual codec.
+ */
+ @Nullable
+ public List<PerformancePoint> getSupportedPerformancePoints() {
+ if (mPerformancePoints == null) {
+ return null;
+ }
+ return new ArrayList<PerformancePoint>(mPerformancePoints);
+ }
+
+ /**
* Returns whether a given video size ({@code width} and
* {@code height}) and {@code frameRate} combination is supported.
*/
@@ -1659,6 +1901,50 @@ public final class MediaCodecInfo {
mSmallerDimensionUpperLimit = SIZE_RANGE.getUpper();
}
+ private @Nullable Vector<PerformancePoint> getPerformancePoints(Map<String, Object> map) {
+ Vector<PerformancePoint> ret = new Vector<>();
+ final String prefix = "performance-point-";
+ Set<String> keys = map.keySet();
+ for (String key : keys) {
+ // looking for: performance-point-WIDTHxHEIGHT-range
+ if (!key.startsWith(prefix)) {
+ continue;
+ }
+ String subKey = key.substring(prefix.length());
+ if (subKey.equals("none") && ret.size() == 0) {
+ // This means that component knowingly did not publish performance points.
+ // This is different from when the component forgot to publish performance
+ // points.
+ return ret;
+ }
+ String[] temp = key.split("-");
+ if (temp.length != 4) {
+ continue;
+ }
+ String sizeStr = temp[2];
+ Size size = Utils.parseSize(sizeStr, null);
+ if (size == null || size.getWidth() * size.getHeight() <= 0) {
+ continue;
+ }
+ Range<Long> range = Utils.parseLongRange(map.get(key), null);
+ if (range == null || range.getLower() < 0 || range.getUpper() < 0) {
+ continue;
+ }
+ ret.add(new PerformancePoint(
+ size.getWidth(), size.getHeight(), range.getLower().intValue()));
+ }
+ // check if the component specified no performance point indication
+ if (ret.size() == 0) {
+ return null;
+ }
+
+ // sort reversed by area first, then by frame rate
+ ret.sort((a, b) -> (a.width * a.height != b.width * b.height ?
+ (b.width * b.height - a.width * a.height) :
+ (b.frameRate - a.frameRate)));
+ return ret;
+ }
+
private Map<Size, Range<Long>> getMeasuredFrameRates(Map<String, Object> map) {
Map<Size, Range<Long>> ret = new HashMap<Size, Range<Long>>();
final String prefix = "measured-frame-rate-";
@@ -1770,6 +2056,7 @@ public final class MediaCodecInfo {
blockRates =
Utils.parseLongRange(map.get("blocks-per-second-range"), null);
mMeasuredFrameRates = getMeasuredFrameRates(map);
+ mPerformancePoints = getPerformancePoints(map);
Pair<Range<Integer>, Range<Integer>> sizeRanges =
parseWidthHeightRanges(map.get("size-range"));
if (sizeRanges != null) {
@@ -2885,7 +3172,9 @@ public final class MediaCodecInfo {
* {@link MediaCodecInfo.CodecCapabilities#profileLevels} field.
*/
public static final class CodecProfileLevel {
- // from OMX_VIDEO_AVCPROFILETYPE
+ // These constants were originally in-line with OMX values, but this
+ // correspondence is no longer maintained.
+
public static final int AVCProfileBaseline = 0x01;
public static final int AVCProfileMain = 0x02;
public static final int AVCProfileExtended = 0x04;
@@ -2896,7 +3185,6 @@ public final class MediaCodecInfo {
public static final int AVCProfileConstrainedBaseline = 0x10000;
public static final int AVCProfileConstrainedHigh = 0x80000;
- // from OMX_VIDEO_AVCLEVELTYPE
public static final int AVCLevel1 = 0x01;
public static final int AVCLevel1b = 0x02;
public static final int AVCLevel11 = 0x04;
@@ -2921,7 +3209,6 @@ public final class MediaCodecInfo {
/** @hide */
public static final int AVCLevel62 = 0x80000;
- // from OMX_VIDEO_H263PROFILETYPE
public static final int H263ProfileBaseline = 0x01;
public static final int H263ProfileH320Coding = 0x02;
public static final int H263ProfileBackwardCompatible = 0x04;
@@ -2932,7 +3219,6 @@ public final class MediaCodecInfo {
public static final int H263ProfileInterlace = 0x80;
public static final int H263ProfileHighLatency = 0x100;
- // from OMX_VIDEO_H263LEVELTYPE
public static final int H263Level10 = 0x01;
public static final int H263Level20 = 0x02;
public static final int H263Level30 = 0x04;
@@ -2942,7 +3228,6 @@ public final class MediaCodecInfo {
public static final int H263Level60 = 0x40;
public static final int H263Level70 = 0x80;
- // from OMX_VIDEO_MPEG4PROFILETYPE
public static final int MPEG4ProfileSimple = 0x01;
public static final int MPEG4ProfileSimpleScalable = 0x02;
public static final int MPEG4ProfileCore = 0x04;
@@ -2960,7 +3245,6 @@ public final class MediaCodecInfo {
public static final int MPEG4ProfileAdvancedScalable = 0x4000;
public static final int MPEG4ProfileAdvancedSimple = 0x8000;
- // from OMX_VIDEO_MPEG4LEVELTYPE
public static final int MPEG4Level0 = 0x01;
public static final int MPEG4Level0b = 0x02;
public static final int MPEG4Level1 = 0x04;
@@ -2972,7 +3256,6 @@ public final class MediaCodecInfo {
public static final int MPEG4Level5 = 0x80;
public static final int MPEG4Level6 = 0x100;
- // from OMX_VIDEO_MPEG2PROFILETYPE
public static final int MPEG2ProfileSimple = 0x00;
public static final int MPEG2ProfileMain = 0x01;
public static final int MPEG2Profile422 = 0x02;
@@ -2980,14 +3263,12 @@ public final class MediaCodecInfo {
public static final int MPEG2ProfileSpatial = 0x04;
public static final int MPEG2ProfileHigh = 0x05;
- // from OMX_VIDEO_MPEG2LEVELTYPE
public static final int MPEG2LevelLL = 0x00;
public static final int MPEG2LevelML = 0x01;
public static final int MPEG2LevelH14 = 0x02;
public static final int MPEG2LevelHL = 0x03;
public static final int MPEG2LevelHP = 0x04;
- // from OMX_AUDIO_AACPROFILETYPE
public static final int AACObjectMain = 1;
public static final int AACObjectLC = 2;
public static final int AACObjectSSR = 3;
@@ -3002,16 +3283,13 @@ public final class MediaCodecInfo {
/** xHE-AAC (includes USAC) */
public static final int AACObjectXHE = 42;
- // from OMX_VIDEO_VP8LEVELTYPE
public static final int VP8Level_Version0 = 0x01;
public static final int VP8Level_Version1 = 0x02;
public static final int VP8Level_Version2 = 0x04;
public static final int VP8Level_Version3 = 0x08;
- // from OMX_VIDEO_VP8PROFILETYPE
public static final int VP8ProfileMain = 0x01;
- // from OMX_VIDEO_VP9PROFILETYPE
public static final int VP9Profile0 = 0x01;
public static final int VP9Profile1 = 0x02;
public static final int VP9Profile2 = 0x04;
@@ -3022,7 +3300,6 @@ public final class MediaCodecInfo {
public static final int VP9Profile2HDR10Plus = 0x4000;
public static final int VP9Profile3HDR10Plus = 0x8000;
- // from OMX_VIDEO_VP9LEVELTYPE
public static final int VP9Level1 = 0x1;
public static final int VP9Level11 = 0x2;
public static final int VP9Level2 = 0x4;
@@ -3038,14 +3315,12 @@ public final class MediaCodecInfo {
public static final int VP9Level61 = 0x1000;
public static final int VP9Level62 = 0x2000;
- // from OMX_VIDEO_HEVCPROFILETYPE
public static final int HEVCProfileMain = 0x01;
public static final int HEVCProfileMain10 = 0x02;
public static final int HEVCProfileMainStill = 0x04;
public static final int HEVCProfileMain10HDR10 = 0x1000;
public static final int HEVCProfileMain10HDR10Plus = 0x2000;
- // from OMX_VIDEO_HEVCLEVELTYPE
public static final int HEVCMainTierLevel1 = 0x1;
public static final int HEVCHighTierLevel1 = 0x2;
public static final int HEVCMainTierLevel2 = 0x4;
@@ -3079,7 +3354,6 @@ public final class MediaCodecInfo {
HEVCHighTierLevel51 | HEVCHighTierLevel52 | HEVCHighTierLevel6 | HEVCHighTierLevel61 |
HEVCHighTierLevel62;
- // from OMX_VIDEO_DOLBYVISIONPROFILETYPE
public static final int DolbyVisionProfileDvavPer = 0x1;
public static final int DolbyVisionProfileDvavPen = 0x2;
public static final int DolbyVisionProfileDvheDer = 0x4;
@@ -3091,7 +3365,6 @@ public final class MediaCodecInfo {
public static final int DolbyVisionProfileDvheSt = 0x100;
public static final int DolbyVisionProfileDvavSe = 0x200;
- // from OMX_VIDEO_DOLBYVISIONLEVELTYPE
public static final int DolbyVisionLevelHd24 = 0x1;
public static final int DolbyVisionLevelHd30 = 0x2;
public static final int DolbyVisionLevelFhd24 = 0x4;
@@ -3102,17 +3375,44 @@ public final class MediaCodecInfo {
public static final int DolbyVisionLevelUhd48 = 0x80;
public static final int DolbyVisionLevelUhd60 = 0x100;
+ public static final int AV1Profile0 = 0x1;
+ public static final int AV1Profile1 = 0x2;
+ public static final int AV1Profile2 = 0x4;
+
+ public static final int AV1Level2 = 0x1;
+ public static final int AV1Level21 = 0x2;
+ public static final int AV1Level22 = 0x4;
+ public static final int AV1Level23 = 0x8;
+ public static final int AV1Level3 = 0x10;
+ public static final int AV1Level31 = 0x20;
+ public static final int AV1Level32 = 0x40;
+ public static final int AV1Level33 = 0x80;
+ public static final int AV1Level4 = 0x100;
+ public static final int AV1Level41 = 0x200;
+ public static final int AV1Level42 = 0x400;
+ public static final int AV1Level43 = 0x800;
+ public static final int AV1Level5 = 0x1000;
+ public static final int AV1Level51 = 0x2000;
+ public static final int AV1Level52 = 0x4000;
+ public static final int AV1Level53 = 0x8000;
+ public static final int AV1Level6 = 0x10000;
+ public static final int AV1Level61 = 0x20000;
+ public static final int AV1Level62 = 0x40000;
+ public static final int AV1Level63 = 0x80000;
+ public static final int AV1Level7 = 0x100000;
+ public static final int AV1Level71 = 0x200000;
+ public static final int AV1Level72 = 0x400000;
+ public static final int AV1Level73 = 0x800000;
+
/**
- * Defined in the OpenMAX IL specs, depending on the type of media
- * this can be OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE,
- * OMX_VIDEO_MPEG4PROFILETYPE, OMX_VIDEO_VP8PROFILETYPE or OMX_VIDEO_VP9PROFILETYPE.
+ * The profile of the media content. Depending on the type of media this can be
+ * one of the profile values defined in this class.
*/
public int profile;
/**
- * Defined in the OpenMAX IL specs, depending on the type of media
- * this can be OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE
- * OMX_VIDEO_MPEG4LEVELTYPE, OMX_VIDEO_VP8LEVELTYPE or OMX_VIDEO_VP9LEVELTYPE.
+ * The level of the media content. Depending on the type of media this can be
+ * one of the level values defined in this class.
*
* Note that VP9 decoder on platforms before {@link android.os.Build.VERSION_CODES#N} may
* not advertise a profile level support. For those VP9 decoders, please use
@@ -3169,7 +3469,7 @@ public final class MediaCodecInfo {
}
return new MediaCodecInfo(
- mName, mIsEncoder,
+ mName, mCanonicalName, mFlags,
caps.toArray(new CodecCapabilities[caps.size()]));
}
}
diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java
index 2e4786579d97..a46095484fe7 100644
--- a/media/java/android/media/MediaCodecList.java
+++ b/media/java/android/media/MediaCodecList.java
@@ -111,12 +111,14 @@ final public class MediaCodecList {
caps[typeIx++] = getCodecCapabilities(index, type);
}
return new MediaCodecInfo(
- getCodecName(index), isEncoder(index), caps);
+ getCodecName(index), getCanonicalName(index), getAttributes(index), caps);
}
/* package private */ static native final String getCodecName(int index);
- /* package private */ static native final boolean isEncoder(int index);
+ /* package private */ static native final String getCanonicalName(int index);
+
+ /* package private */ static native final int getAttributes(int index);
/* package private */ static native final String[] getSupportedTypes(int index);
diff --git a/media/java/android/media/MediaConstants.java b/media/java/android/media/MediaConstants.java
index 275b0acd8ad6..65b6f55a068a 100644
--- a/media/java/android/media/MediaConstants.java
+++ b/media/java/android/media/MediaConstants.java
@@ -24,8 +24,9 @@ class MediaConstants {
static final String KEY_PACKAGE_NAME = "android.media.key.PACKAGE_NAME";
// Bundle key for Parcelable
- static final String KEY_SESSION2_STUB = "android.media.key.SESSION2_STUB";
+ static final String KEY_SESSION2LINK = "android.media.key.SESSION2LINK";
static final String KEY_ALLOWED_COMMANDS = "android.media.key.ALLOWED_COMMANDS";
+ static final String KEY_PLAYBACK_ACTIVE = "android.media.key.PLAYBACK_ACTIVE";
private MediaConstants() {
}
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index b8381a7249be..7c5335b71627 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -19,19 +19,23 @@ package android.media;
import static android.media.MediaConstants.KEY_ALLOWED_COMMANDS;
import static android.media.MediaConstants.KEY_PACKAGE_NAME;
import static android.media.MediaConstants.KEY_PID;
-import static android.media.MediaConstants.KEY_SESSION2_STUB;
+import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
+import static android.media.MediaConstants.KEY_SESSION2LINK;
import static android.media.Session2Command.RESULT_ERROR_UNKNOWN_ERROR;
import static android.media.Session2Command.RESULT_INFO_SKIPPED;
import static android.media.Session2Token.TYPE_SESSION;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.ComponentName;
import android.content.Context;
-import android.os.Binder;
+import android.content.Intent;
+import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Process;
+import android.os.RemoteException;
import android.os.ResultReceiver;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -41,15 +45,15 @@ import java.util.concurrent.Executor;
/**
* Allows an app to interact with an active {@link MediaSession2} or a
- * {@link MediaSession2Service} which would provide {@link MediaSession2}. Media buttons and other
+ * MediaSession2Service which would provide {@link MediaSession2}. Media buttons and other
* commands can be sent to the session.
* <p>
* This API is not generally intended for third party application developers.
* Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
* <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
* for consistent behavior across all devices.
- * @hide
*/
+// TODO: use @link for MediaSession2Service
public class MediaController2 implements AutoCloseable {
static final String TAG = "MediaController2";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -63,6 +67,7 @@ public class MediaController2 implements AutoCloseable {
private final Executor mCallbackExecutor;
private final Controller2Link mControllerStub;
private final Handler mResultHandler;
+ private final SessionServiceConnection mServiceConnection;
private final Object mLock = new Object();
//@GuardedBy("mLock")
@@ -77,6 +82,8 @@ public class MediaController2 implements AutoCloseable {
private ArrayMap<ResultReceiver, Integer> mPendingCommands;
//@GuardedBy("mLock")
private ArraySet<Integer> mRequestedCommandSeqNumbers;
+ //@GuardedBy("mLock")
+ private boolean mPlaybackActive;
/**
* Create a {@link MediaController2} from the {@link Session2Token}.
@@ -118,20 +125,29 @@ public class MediaController2 implements AutoCloseable {
mPendingCommands = new ArrayMap<>();
mRequestedCommandSeqNumbers = new ArraySet<>();
+ boolean connectRequested;
if (token.getType() == TYPE_SESSION) {
- connectToSession();
+ mServiceConnection = null;
+ connectRequested = requestConnectToSession();
} else {
- // TODO: Handle connect to session service.
+ mServiceConnection = new SessionServiceConnection();
+ connectRequested = requestConnectToService();
+ }
+ if (!connectRequested) {
+ close();
}
}
@Override
public void close() {
synchronized (mLock) {
+ if (mServiceConnection != null) {
+ mContext.unbindService(mServiceConnection);
+ }
if (mSessionBinder != null) {
try {
- mSessionBinder.unlinkToDeath(mDeathRecipient, 0);
mSessionBinder.disconnect(mControllerStub, getNextSeqNumber());
+ mSessionBinder.unlinkToDeath(mDeathRecipient, 0);
} catch (RuntimeException e) {
// No-op
}
@@ -146,6 +162,18 @@ public class MediaController2 implements AutoCloseable {
}
/**
+ * Returns whether the session's playback is active.
+ *
+ * @return {@code true} if playback active. {@code false} otherwise.
+ * @see ControllerCallback#onPlaybackActiveChanged(MediaController2, boolean)
+ */
+ public boolean isPlaybackActive() {
+ synchronized (mLock) {
+ return mPlaybackActive;
+ }
+ }
+
+ /**
* Sends a session command to the session
* <p>
* @param command the session command
@@ -153,6 +181,7 @@ public class MediaController2 implements AutoCloseable {
* @return a token which will be sent together in {@link ControllerCallback#onCommandResult}
* when its result is received.
*/
+ @NonNull
public Object sendSessionCommand(@NonNull Session2Command command, @Nullable Bundle args) {
if (command == null) {
throw new IllegalArgumentException("command shouldn't be null");
@@ -206,89 +235,82 @@ public class MediaController2 implements AutoCloseable {
// Called by Controller2Link.onConnected
void onConnected(int seq, Bundle connectionResult) {
- final long token = Binder.clearCallingIdentity();
- try {
- Session2Link sessionBinder = connectionResult.getParcelable(KEY_SESSION2_STUB);
- Session2CommandGroup allowedCommands =
- connectionResult.getParcelable(KEY_ALLOWED_COMMANDS);
- if (DEBUG) {
- Log.d(TAG, "notifyConnected sessionBinder=" + sessionBinder
- + ", allowedCommands=" + allowedCommands);
- }
- if (sessionBinder == null || allowedCommands == null) {
- // Connection rejected.
- close();
- return;
- }
- synchronized (mLock) {
- mSessionBinder = sessionBinder;
- mAllowedCommands = allowedCommands;
- // Implementation for the local binder is no-op,
- // so can be used without worrying about deadlock.
- sessionBinder.linkToDeath(mDeathRecipient, 0);
- mConnectedToken = new Session2Token(mSessionToken.getUid(), TYPE_SESSION,
- mSessionToken.getPackageName(), sessionBinder);
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onConnected(MediaController2.this, allowedCommands);
- });
- } finally {
- Binder.restoreCallingIdentity(token);
+ Session2Link sessionBinder = connectionResult.getParcelable(KEY_SESSION2LINK);
+ Session2CommandGroup allowedCommands =
+ connectionResult.getParcelable(KEY_ALLOWED_COMMANDS);
+ boolean playbackActive = connectionResult.getBoolean(KEY_PLAYBACK_ACTIVE);
+ if (DEBUG) {
+ Log.d(TAG, "notifyConnected sessionBinder=" + sessionBinder
+ + ", allowedCommands=" + allowedCommands);
+ }
+ if (sessionBinder == null || allowedCommands == null) {
+ // Connection rejected.
+ close();
+ return;
+ }
+ synchronized (mLock) {
+ mSessionBinder = sessionBinder;
+ mAllowedCommands = allowedCommands;
+ mPlaybackActive = playbackActive;
+
+ // Implementation for the local binder is no-op,
+ // so can be used without worrying about deadlock.
+ sessionBinder.linkToDeath(mDeathRecipient, 0);
+ mConnectedToken = new Session2Token(mSessionToken.getUid(), TYPE_SESSION,
+ mSessionToken.getPackageName(), sessionBinder);
}
+ mCallbackExecutor.execute(() -> {
+ mCallback.onConnected(MediaController2.this, allowedCommands);
+ });
}
// Called by Controller2Link.onDisconnected
void onDisconnected(int seq) {
- final long token = Binder.clearCallingIdentity();
- try {
- // close() will call mCallback.onDisconnected
- close();
- } finally {
- Binder.restoreCallingIdentity(token);
+ // close() will call mCallback.onDisconnected
+ close();
+ }
+
+ // Called by Controller2Link.onPlaybackActiveChanged
+ void onPlaybackActiveChanged(int seq, boolean playbackActive) {
+ synchronized (mLock) {
+ mPlaybackActive = playbackActive;
}
+ mCallbackExecutor.execute(() -> {
+ mCallback.onPlaybackActiveChanged(MediaController2.this, playbackActive);
+ });
}
// Called by Controller2Link.onSessionCommand
void onSessionCommand(int seq, Session2Command command, Bundle args,
@Nullable ResultReceiver resultReceiver) {
- final long token = Binder.clearCallingIdentity();
- try {
+ synchronized (mLock) {
+ mRequestedCommandSeqNumbers.add(seq);
+ }
+ mCallbackExecutor.execute(() -> {
+ boolean isCanceled;
synchronized (mLock) {
- mRequestedCommandSeqNumbers.add(seq);
+ isCanceled = !mRequestedCommandSeqNumbers.remove(seq);
}
- mCallbackExecutor.execute(() -> {
- boolean isCanceled;
- synchronized (mLock) {
- isCanceled = !mRequestedCommandSeqNumbers.remove(seq);
- }
- if (isCanceled) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- return;
- }
- Session2Command.Result result = mCallback.onSessionCommand(
- MediaController2.this, command, args);
- if (resultReceiver != null) {
- if (result == null) {
- throw new RuntimeException("onSessionCommand shouldn't return null");
- } else {
- resultReceiver.send(result.getResultCode(), result.getResultData());
- }
+ if (isCanceled) {
+ resultReceiver.send(RESULT_INFO_SKIPPED, null);
+ return;
+ }
+ Session2Command.Result result = mCallback.onSessionCommand(
+ MediaController2.this, command, args);
+ if (resultReceiver != null) {
+ if (result == null) {
+ throw new RuntimeException("onSessionCommand shouldn't return null");
+ } else {
+ resultReceiver.send(result.getResultCode(), result.getResultData());
}
- });
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ }
+ });
}
// Called by Controller2Link.onSessionCommand
void onCancelCommand(int seq) {
- final long token = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- mRequestedCommandSeqNumbers.remove(seq);
- }
- } finally {
- Binder.restoreCallingIdentity(token);
+ synchronized (mLock) {
+ mRequestedCommandSeqNumbers.remove(seq);
}
}
@@ -298,18 +320,55 @@ public class MediaController2 implements AutoCloseable {
}
}
- private void connectToSession() {
- Session2Link sessionBinder = mSessionToken.getSessionLink();
+ private Bundle createConnectionRequest() {
Bundle connectionRequest = new Bundle();
connectionRequest.putString(KEY_PACKAGE_NAME, mContext.getPackageName());
connectionRequest.putInt(KEY_PID, Process.myPid());
+ return connectionRequest;
+ }
+ private boolean requestConnectToSession() {
+ Session2Link sessionBinder = mSessionToken.getSessionLink();
+ Bundle connectionRequest = createConnectionRequest();
try {
sessionBinder.connect(mControllerStub, getNextSeqNumber(), connectionRequest);
} catch (RuntimeException e) {
- Log.w(TAG, "Failed to call connection request. Framework will retry"
- + " automatically");
+ Log.w(TAG, "Failed to call connection request", e);
+ return false;
}
+ return true;
+ }
+
+ private boolean requestConnectToService() {
+ // Service. Needs to get fresh binder whenever connection is needed.
+ final Intent intent = new Intent(MediaSession2Service.SERVICE_INTERFACE);
+ intent.setClassName(mSessionToken.getPackageName(), mSessionToken.getServiceName());
+
+ // Use bindService() instead of startForegroundService() to start session service for three
+ // reasons.
+ // 1. Prevent session service owner's stopSelf() from destroying service.
+ // With the startForegroundService(), service's call of stopSelf() will trigger immediate
+ // onDestroy() calls on the main thread even when onConnect() is running in another
+ // thread.
+ // 2. Minimize APIs for developers to take care about.
+ // With bindService(), developers only need to take care about Service.onBind()
+ // but Service.onStartCommand() should be also taken care about with the
+ // startForegroundService().
+ // 3. Future support for UI-less playback
+ // If a service wants to keep running, it should be either foreground service or
+ // bound service. But there had been request for the feature for system apps
+ // and using bindService() will be better fit with it.
+ synchronized (mLock) {
+ boolean result = mContext.bindService(
+ intent, mServiceConnection, Context.BIND_AUTO_CREATE);
+ if (!result) {
+ Log.w(TAG, "bind to " + mSessionToken + " failed");
+ return false;
+ } else if (DEBUG) {
+ Log.d(TAG, "bind to " + mSessionToken + " succeeded");
+ }
+ }
+ return true;
}
/**
@@ -341,6 +400,17 @@ public class MediaController2 implements AutoCloseable {
public void onDisconnected(@NonNull MediaController2 controller) {}
/**
+ * Called when the playback of the session's playback activeness is changed.
+ *
+ * @param controller the controller for this event
+ * @param playbackActive {@code true} if the session's playback is active.
+ * {@code false} otherwise.
+ * @see MediaController2#isPlaybackActive()
+ */
+ public void onPlaybackActiveChanged(@NonNull MediaController2 controller,
+ boolean playbackActive) {}
+
+ /**
* Called when the connected session sent a session command.
*
* @param controller the controller for this event
@@ -349,7 +419,7 @@ public class MediaController2 implements AutoCloseable {
* @return the result for the session command. A runtime exception will be thrown if null
* is returned.
*/
- @NonNull
+ @Nullable
public Session2Command.Result onSessionCommand(@NonNull MediaController2 controller,
@NonNull Session2Command command, @Nullable Bundle args) {
return null;
@@ -366,4 +436,59 @@ public class MediaController2 implements AutoCloseable {
public void onCommandResult(@NonNull MediaController2 controller, @NonNull Object token,
@NonNull Session2Command command, @NonNull Session2Command.Result result) {}
}
+
+ // This will be called on the main thread.
+ private class SessionServiceConnection implements ServiceConnection {
+ SessionServiceConnection() {
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ // Note that it's always main-thread.
+ boolean connectRequested = false;
+ try {
+ if (DEBUG) {
+ Log.d(TAG, "onServiceConnected " + name + " " + this);
+ }
+ // Sanity check
+ if (!mSessionToken.getPackageName().equals(name.getPackageName())) {
+ Log.wtf(TAG, "Expected connection to " + mSessionToken.getPackageName()
+ + " but is connected to " + name);
+ return;
+ }
+ IMediaSession2Service iService = IMediaSession2Service.Stub.asInterface(service);
+ if (iService == null) {
+ Log.wtf(TAG, "Service interface is missing.");
+ return;
+ }
+ Bundle connectionRequest = createConnectionRequest();
+ iService.connect(mControllerStub, getNextSeqNumber(), connectionRequest);
+ connectRequested = true;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Service " + name + " has died prematurely", e);
+ } finally {
+ if (!connectRequested) {
+ close();
+ }
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ // Temporal lose of the binding because of the service crash. System will automatically
+ // rebind, so just no-op.
+ if (DEBUG) {
+ Log.w(TAG, "Session service " + name + " is disconnected.");
+ }
+ close();
+ }
+
+ @Override
+ public void onBindingDied(ComponentName name) {
+ // Permanent lose of the binding because of the service package update or removed.
+ // This SessionServiceRecord will be removed accordingly, but forget session binder here
+ // for sure.
+ close();
+ }
+ }
}
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index cdbc7b44f905..bfc10da5d431 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -132,11 +132,19 @@ public final class MediaDrm implements AutoCloseable {
private static final String PERMISSION = android.Manifest.permission.ACCESS_DRM_CERTIFICATES;
private EventHandler mEventHandler;
- private EventHandler mOnKeyStatusChangeEventHandler;
- private EventHandler mOnExpirationUpdateEventHandler;
+ private EventHandler mKeyStatusChangeHandler;
+ private EventHandler mExpirationUpdateHandler;
+ private EventHandler mSessionLostStateHandler;
+
private OnEventListener mOnEventListener;
private OnKeyStatusChangeListener mOnKeyStatusChangeListener;
private OnExpirationUpdateListener mOnExpirationUpdateListener;
+ private OnSessionLostStateListener mOnSessionLostStateListener;
+
+ private final Object mEventLock = new Object();
+ private final Object mKeyStatusChangeLock = new Object();
+ private final Object mExpirationUpdateLock = new Object();
+ private final Object mSessionLostStateLock = new Object();
private long mNativeContext;
@@ -200,6 +208,35 @@ public final class MediaDrm implements AutoCloseable {
private static final native boolean isCryptoSchemeSupportedNative(
@NonNull byte[] uuid, @Nullable String mimeType);
+ private EventHandler createHandler() {
+ Looper looper;
+ EventHandler handler;
+ if ((looper = Looper.myLooper()) != null) {
+ handler = new EventHandler(this, looper);
+ } else if ((looper = Looper.getMainLooper()) != null) {
+ handler = new EventHandler(this, looper);
+ } else {
+ handler = null;
+ }
+ return handler;
+ }
+
+ private EventHandler updateHandler(Handler handler) {
+ Looper looper;
+ EventHandler newHandler = null;
+ if (handler != null) {
+ looper = handler.getLooper();
+ } else {
+ looper = Looper.myLooper();
+ }
+ if (looper != null) {
+ if (handler == null || handler.getLooper() != looper) {
+ newHandler = new EventHandler(this, looper);
+ }
+ }
+ return newHandler;
+ }
+
/**
* Instantiate a MediaDrm object
*
@@ -209,14 +246,10 @@ public final class MediaDrm implements AutoCloseable {
* specified scheme UUID
*/
public MediaDrm(@NonNull UUID uuid) throws UnsupportedSchemeException {
- Looper looper;
- if ((looper = Looper.myLooper()) != null) {
- mEventHandler = new EventHandler(this, looper);
- } else if ((looper = Looper.getMainLooper()) != null) {
- mEventHandler = new EventHandler(this, looper);
- } else {
- mEventHandler = null;
- }
+ mEventHandler = createHandler();
+ mKeyStatusChangeHandler = createHandler();
+ mExpirationUpdateHandler = createHandler();
+ mSessionLostStateHandler = createHandler();
/* Native setup requires a weak reference to our object.
* It's easier to create it here than in C++.
@@ -272,6 +305,40 @@ public final class MediaDrm implements AutoCloseable {
}
/**
+ * Thrown when an error occurs in any method that has a session context.
+ */
+ public static final class SessionException extends RuntimeException {
+ public SessionException(int errorCode, @Nullable String detailMessage) {
+ super(detailMessage);
+ mErrorCode = errorCode;
+ }
+
+ /**
+ * This indicates that apps using MediaDrm sessions are
+ * temporarily exceeding the capacity of available crypto
+ * resources. The app should retry the operation later.
+ */
+ public static final int ERROR_RESOURCE_CONTENTION = 1;
+
+ /** @hide */
+ @IntDef({
+ ERROR_RESOURCE_CONTENTION,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SessionErrorCode {}
+
+ /**
+ * Retrieve the error code associated with the SessionException
+ */
+ @SessionErrorCode
+ public int getErrorCode() {
+ return mErrorCode;
+ }
+
+ private final int mErrorCode;
+ }
+
+ /**
* Register a callback to be invoked when a session expiration update
* occurs. The app's OnExpirationUpdateListener will be notified
* when the expiration time of the keys in the session have changed.
@@ -282,15 +349,12 @@ public final class MediaDrm implements AutoCloseable {
*/
public void setOnExpirationUpdateListener(
@Nullable OnExpirationUpdateListener listener, @Nullable Handler handler) {
- if (listener != null) {
- Looper looper = handler != null ? handler.getLooper() : Looper.myLooper();
- if (looper != null) {
- if (mEventHandler == null || mEventHandler.getLooper() != looper) {
- mEventHandler = new EventHandler(this, looper);
- }
+ synchronized(mExpirationUpdateLock) {
+ if (listener != null) {
+ mExpirationUpdateHandler = updateHandler(handler);
}
+ mOnExpirationUpdateListener = listener;
}
- mOnExpirationUpdateListener = listener;
}
/**
@@ -324,15 +388,12 @@ public final class MediaDrm implements AutoCloseable {
*/
public void setOnKeyStatusChangeListener(
@Nullable OnKeyStatusChangeListener listener, @Nullable Handler handler) {
- if (listener != null) {
- Looper looper = handler != null ? handler.getLooper() : Looper.myLooper();
- if (looper != null) {
- if (mEventHandler == null || mEventHandler.getLooper() != looper) {
- mEventHandler = new EventHandler(this, looper);
- }
+ synchronized(mKeyStatusChangeLock) {
+ if (listener != null) {
+ mKeyStatusChangeHandler = updateHandler(handler);
}
+ mOnKeyStatusChangeListener = listener;
}
- mOnKeyStatusChangeListener = listener;
}
/**
@@ -360,6 +421,46 @@ public final class MediaDrm implements AutoCloseable {
}
/**
+ * Register a callback to be invoked when session state has been
+ * lost. This event can occur on devices that are not capable of
+ * retaining crypto session state across device suspend/resume
+ * cycles. When this event occurs, the session must be closed and
+ * a new session opened to resume operation.
+ *
+ * @param listener the callback that will be run, or {@code null} to unregister the
+ * previously registered callback.
+ * @param handler the handler on which the listener should be invoked, or
+ * {@code null} if the listener should be invoked on the calling thread's looper.
+ */
+ public void setOnSessionLostStateListener(
+ @Nullable OnSessionLostStateListener listener, @Nullable Handler handler) {
+ synchronized(mSessionLostStateLock) {
+ if (listener != null) {
+ mSessionLostStateHandler = updateHandler(handler);
+ }
+ mOnSessionLostStateListener = listener;
+ }
+ }
+
+ /**
+ * Interface definition for a callback to be invoked when the
+ * session state has been lost and is now invalid
+ */
+ public interface OnSessionLostStateListener
+ {
+ /**
+ * Called when session state has lost state, to inform the app
+ * about the condition so it can close the session and open a new
+ * one to resume operation.
+ *
+ * @param md the MediaDrm object on which the event occurred
+ * @param sessionId the DRM session ID on which the event occurred
+ */
+ void onSessionLostState(
+ @NonNull MediaDrm md, @NonNull byte[] sessionId);
+ }
+
+ /**
* Defines the status of a key.
* A KeyStatus for each key in a session is provided to the
* {@link OnKeyStatusChangeListener#onKeyStatusChange}
@@ -437,7 +538,9 @@ public final class MediaDrm implements AutoCloseable {
*/
public void setOnEventListener(@Nullable OnEventListener listener)
{
- mOnEventListener = listener;
+ synchronized(mEventLock) {
+ mOnEventListener = listener;
+ }
}
/**
@@ -513,6 +616,7 @@ public final class MediaDrm implements AutoCloseable {
private static final int DRM_EVENT = 200;
private static final int EXPIRATION_UPDATE = 201;
private static final int KEY_STATUS_CHANGE = 202;
+ private static final int SESSION_LOST_STATE = 203;
private class EventHandler extends Handler
{
@@ -532,52 +636,72 @@ public final class MediaDrm implements AutoCloseable {
switch(msg.what) {
case DRM_EVENT:
- if (mOnEventListener != null) {
- if (msg.obj != null && msg.obj instanceof Parcel) {
- Parcel parcel = (Parcel)msg.obj;
- byte[] sessionId = parcel.createByteArray();
- if (sessionId.length == 0) {
- sessionId = null;
+ synchronized(mEventLock) {
+ if (mOnEventListener != null) {
+ if (msg.obj != null && msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel)msg.obj;
+ byte[] sessionId = parcel.createByteArray();
+ if (sessionId.length == 0) {
+ sessionId = null;
+ }
+ byte[] data = parcel.createByteArray();
+ if (data.length == 0) {
+ data = null;
+ }
+
+ Log.i(TAG, "Drm event (" + msg.arg1 + "," + msg.arg2 + ")");
+ mOnEventListener.onEvent(mMediaDrm, sessionId, msg.arg1, msg.arg2, data);
}
- byte[] data = parcel.createByteArray();
- if (data.length == 0) {
- data = null;
- }
-
- Log.i(TAG, "Drm event (" + msg.arg1 + "," + msg.arg2 + ")");
- mOnEventListener.onEvent(mMediaDrm, sessionId, msg.arg1, msg.arg2, data);
}
}
return;
case KEY_STATUS_CHANGE:
- if (mOnKeyStatusChangeListener != null) {
- if (msg.obj != null && msg.obj instanceof Parcel) {
- Parcel parcel = (Parcel)msg.obj;
- byte[] sessionId = parcel.createByteArray();
- if (sessionId.length > 0) {
- List<KeyStatus> keyStatusList = keyStatusListFromParcel(parcel);
- boolean hasNewUsableKey = (parcel.readInt() != 0);
-
- Log.i(TAG, "Drm key status changed");
- mOnKeyStatusChangeListener.onKeyStatusChange(mMediaDrm, sessionId,
- keyStatusList, hasNewUsableKey);
+ synchronized(mKeyStatusChangeLock) {
+ if (mOnKeyStatusChangeListener != null) {
+ if (msg.obj != null && msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel)msg.obj;
+ byte[] sessionId = parcel.createByteArray();
+ if (sessionId.length > 0) {
+ List<KeyStatus> keyStatusList = keyStatusListFromParcel(parcel);
+ boolean hasNewUsableKey = (parcel.readInt() != 0);
+
+ Log.i(TAG, "Drm key status changed");
+ mOnKeyStatusChangeListener.onKeyStatusChange(mMediaDrm, sessionId,
+ keyStatusList, hasNewUsableKey);
+ }
}
}
}
return;
case EXPIRATION_UPDATE:
- if (mOnExpirationUpdateListener != null) {
- if (msg.obj != null && msg.obj instanceof Parcel) {
- Parcel parcel = (Parcel)msg.obj;
- byte[] sessionId = parcel.createByteArray();
- if (sessionId.length > 0) {
- long expirationTime = parcel.readLong();
-
- Log.i(TAG, "Drm key expiration update: " + expirationTime);
- mOnExpirationUpdateListener.onExpirationUpdate(mMediaDrm, sessionId,
- expirationTime);
+ synchronized(mExpirationUpdateLock) {
+ if (mOnExpirationUpdateListener != null) {
+ if (msg.obj != null && msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel)msg.obj;
+ byte[] sessionId = parcel.createByteArray();
+ if (sessionId.length > 0) {
+ long expirationTime = parcel.readLong();
+
+ Log.i(TAG, "Drm key expiration update: " + expirationTime);
+ mOnExpirationUpdateListener.onExpirationUpdate(mMediaDrm, sessionId,
+ expirationTime);
+ }
+ }
+ }
+ }
+ return;
+
+ case SESSION_LOST_STATE:
+ synchronized(mSessionLostStateLock) {
+ if (mOnSessionLostStateListener != null) {
+ if (msg.obj != null && msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel)msg.obj;
+ byte[] sessionId = parcel.createByteArray();
+ Log.i(TAG, "Drm session lost state event: ");
+ mOnSessionLostStateListener.onSessionLostState(mMediaDrm,
+ sessionId);
}
}
}
@@ -619,9 +743,42 @@ public final class MediaDrm implements AutoCloseable {
if (md == null) {
return;
}
- if (md.mEventHandler != null) {
- Message m = md.mEventHandler.obtainMessage(what, eventType, extra, obj);
- md.mEventHandler.sendMessage(m);
+ switch (what) {
+ case DRM_EVENT:
+ synchronized(md.mEventLock) {
+ if (md.mEventHandler != null) {
+ Message m = md.mEventHandler.obtainMessage(what, eventType, extra, obj);
+ md.mEventHandler.sendMessage(m);
+ }
+ }
+ break;
+ case EXPIRATION_UPDATE:
+ synchronized(md.mExpirationUpdateLock) {
+ if (md.mExpirationUpdateHandler != null) {
+ Message m = md.mExpirationUpdateHandler.obtainMessage(what, obj);
+ md.mExpirationUpdateHandler.sendMessage(m);
+ }
+ }
+ break;
+ case KEY_STATUS_CHANGE:
+ synchronized(md.mKeyStatusChangeLock) {
+ if (md.mKeyStatusChangeHandler != null) {
+ Message m = md.mKeyStatusChangeHandler.obtainMessage(what, obj);
+ md.mKeyStatusChangeHandler.sendMessage(m);
+ }
+ }
+ break;
+ case SESSION_LOST_STATE:
+ synchronized(md.mSessionLostStateLock) {
+ if (md.mSessionLostStateHandler != null) {
+ Message m = md.mSessionLostStateHandler.obtainMessage(what, obj);
+ md.mSessionLostStateHandler.sendMessage(m);
+ }
+ }
+ break;
+ default:
+ Log.e(TAG, "Unknown message type " + what);
+ break;
}
}
@@ -1128,7 +1285,7 @@ public final class MediaDrm implements AutoCloseable {
@Retention(RetentionPolicy.SOURCE)
@IntDef({HDCP_LEVEL_UNKNOWN, HDCP_NONE, HDCP_V1, HDCP_V2,
- HDCP_V2_1, HDCP_V2_2, HDCP_NO_DIGITAL_OUTPUT})
+ HDCP_V2_1, HDCP_V2_2, HDCP_V2_3, HDCP_NO_DIGITAL_OUTPUT})
public @interface HdcpLevel {}
@@ -1164,6 +1321,11 @@ public final class MediaDrm implements AutoCloseable {
public static final int HDCP_V2_2 = 5;
/**
+ * HDCP version 2.3 Type 1.
+ */
+ public static final int HDCP_V2_3 = 6;
+
+ /**
* No digital output, implicitly secure
*/
public static final int HDCP_NO_DIGITAL_OUTPUT = Integer.MAX_VALUE;
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index 594a22457cc3..c82b5f6f12a1 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -124,6 +124,7 @@ import java.util.stream.Collectors;
public final class MediaFormat {
public static final String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
public static final String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
+ public static final String MIMETYPE_VIDEO_AV1 = "video/av01";
public static final String MIMETYPE_VIDEO_AVC = "video/avc";
public static final String MIMETYPE_VIDEO_HEVC = "video/hevc";
public static final String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index cf949eb5f17c..5fae1038ba9e 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -302,6 +302,34 @@ public class MediaRecorder implements AudioRouting,
* {@link #DEFAULT} otherwise. */
public static final int UNPROCESSED = 9;
+
+ /**
+ * Source for capturing audio meant to be processed in real time and played back for live
+ * performance (e.g karaoke).
+ * <p>
+ * The capture path will minimize latency and coupling with
+ * playback path.
+ * </p>
+ */
+ public static final int VOICE_PERFORMANCE = 10;
+
+ /**
+ * Source for an echo canceller to capture the reference signal to be cancelled.
+ * <p>
+ * The echo reference signal will be captured as close as possible to the DAC in order
+ * to include all post processing applied to the playback path.
+ * </p><p>
+ * Capturing the echo reference requires the
+ * {@link android.Manifest.permission#CAPTURE_AUDIO_OUTPUT} permission.
+ * This permission is reserved for use by system components and is not available to
+ * third-party applications.
+ * </p>
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT)
+ public static final int ECHO_REFERENCE = 1997;
+
/**
* Audio source for capturing broadcast radio tuner output.
* @hide
@@ -343,6 +371,7 @@ public class MediaRecorder implements AudioRouting,
case AudioSource.VOICE_COMMUNICATION:
//case REMOTE_SUBMIX: considered "system" as it requires system permissions
case AudioSource.UNPROCESSED:
+ case AudioSource.VOICE_PERFORMANCE:
return false;
default:
return true;
@@ -372,6 +401,10 @@ public class MediaRecorder implements AudioRouting,
return "REMOTE_SUBMIX";
case AudioSource.UNPROCESSED:
return "UNPROCESSED";
+ case AudioSource.ECHO_REFERENCE:
+ return "ECHO_REFERENCE";
+ case AudioSource.VOICE_PERFORMANCE:
+ return "VOICE_PERFORMANCE";
case AudioSource.RADIO_TUNER:
return "RADIO_TUNER";
case AudioSource.HOTWORD:
@@ -456,6 +489,9 @@ public class MediaRecorder implements AudioRouting,
/** VP8/VORBIS data in a WEBM container */
public static final int WEBM = 9;
+ /** @hide HEIC data in a HEIF container */
+ public static final int HEIF = 10;
+
/** Opus data in a Ogg container */
public static final int OGG = 11;
@@ -533,7 +569,7 @@ public class MediaRecorder implements AudioRouting,
* @see android.media.MediaRecorder.AudioSource
*/
public static final int getAudioSourceMax() {
- return AudioSource.UNPROCESSED;
+ return AudioSource.VOICE_PERFORMANCE;
}
/**
@@ -711,6 +747,12 @@ public class MediaRecorder implements AudioRouting,
* is no guarantee that the recorder will have stopped by the time the
* listener is notified.
*
+ * <p>When using MPEG-4 container ({@link #setOutputFormat(int)} with
+ * {@link OutputFormat#MPEG_4}), it is recommended to set maximum duration that fits the use
+ * case. Setting a larger than required duration may result in a larger than needed output file
+ * because of space reserved for MOOV box expecting large movie data in this recording session.
+ * Unused space of MOOV box is turned into FREE box in the output file.</p>
+ *
* @param max_duration_ms the maximum duration in ms (if zero or negative, disables the duration limit)
*
*/
@@ -726,6 +768,12 @@ public class MediaRecorder implements AudioRouting,
* is no guarantee that the recorder will have stopped by the time the
* listener is notified.
*
+ * <p>When using MPEG-4 container ({@link #setOutputFormat(int)} with
+ * {@link OutputFormat#MPEG_4}), it is recommended to set maximum filesize that fits the use
+ * case. Setting a larger than required filesize may result in a larger than needed output file
+ * because of space reserved for MOOV box expecting large movie data in this recording session.
+ * Unused space of MOOV box is turned into FREE box in the output file.</p>
+ *
* @param max_filesize_bytes the maximum filesize in bytes (if zero or negative, disables the limit)
*
*/
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 4712cddf3522..3adac7295fff 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -19,7 +19,8 @@ package android.media;
import static android.media.MediaConstants.KEY_ALLOWED_COMMANDS;
import static android.media.MediaConstants.KEY_PACKAGE_NAME;
import static android.media.MediaConstants.KEY_PID;
-import static android.media.MediaConstants.KEY_SESSION2_STUB;
+import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
+import static android.media.MediaConstants.KEY_SESSION2LINK;
import static android.media.Session2Command.RESULT_ERROR_UNKNOWN_ERROR;
import static android.media.Session2Command.RESULT_INFO_SKIPPED;
import static android.media.Session2Token.TYPE_SESSION;
@@ -31,7 +32,6 @@ import android.content.Context;
import android.content.Intent;
import android.media.session.MediaSessionManager;
import android.media.session.MediaSessionManager.RemoteUserInfo;
-import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
@@ -41,7 +41,6 @@ import android.util.ArraySet;
import android.util.Log;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -56,10 +55,9 @@ import java.util.concurrent.Executor;
* Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
* <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
* for consistent behavior across all devices.
- * @hide
*/
public class MediaSession2 implements AutoCloseable {
- static final String TAG = "MediaSession";
+ static final String TAG = "MediaSession2";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
// Note: This checks the uniqueness of a session ID only in a single process.
@@ -89,8 +87,9 @@ public class MediaSession2 implements AutoCloseable {
private final Handler mResultHandler;
//@GuardedBy("mLock")
- @SuppressWarnings("WeakerAccess") /* synthetic access */
private boolean mClosed;
+ //@GuardedBy("mLock")
+ private boolean mPlaybackActive;
MediaSession2(@NonNull Context context, @NonNull String id, PendingIntent sessionActivity,
@NonNull Executor callbackExecutor, @NonNull SessionCallback callback) {
@@ -113,19 +112,24 @@ public class MediaSession2 implements AutoCloseable {
Context.MEDIA_SESSION_SERVICE);
// NOTE: mResultHandler uses main looper, so this MUST NOT be blocked.
mResultHandler = new Handler(context.getMainLooper());
+ mClosed = false;
}
@Override
public void close() {
try {
- synchronized (MediaSession2.class) {
- SESSION_ID_LIST.remove(mSessionId);
- }
- Collection<ControllerInfo> controllerInfos;
+ List<ControllerInfo> controllerInfos;
synchronized (mLock) {
- controllerInfos = mConnectedControllers.values();
- mConnectedControllers.clear();
+ if (mClosed) {
+ return;
+ }
mClosed = true;
+ controllerInfos = getConnectedControllers();
+ mConnectedControllers.clear();
+ mCallback.onSessionClosed(this);
+ }
+ synchronized (MediaSession2.class) {
+ SESSION_ID_LIST.remove(mSessionId);
}
for (ControllerInfo info : controllerInfos) {
info.notifyDisconnected();
@@ -161,10 +165,7 @@ public class MediaSession2 implements AutoCloseable {
if (command == null) {
throw new IllegalArgumentException("command shouldn't be null");
}
- Collection<ControllerInfo> controllerInfos;
- synchronized (mLock) {
- controllerInfos = mConnectedControllers.values();
- }
+ List<ControllerInfo> controllerInfos = getConnectedControllers();
for (ControllerInfo controller : controllerInfos) {
controller.sendSessionCommand(command, args, null);
}
@@ -179,6 +180,7 @@ public class MediaSession2 implements AutoCloseable {
* @return a token which will be sent together in {@link SessionCallback#onCommandResult}
* when its result is received.
*/
+ @NonNull
public Object sendSessionCommand(@NonNull ControllerInfo controller,
@NonNull Session2Command command, @Nullable Bundle args) {
if (controller == null) {
@@ -206,36 +208,71 @@ public class MediaSession2 implements AutoCloseable {
* @param controller the controller to get the session command
* @param token the token which is returned from {@link #sendSessionCommand}.
*/
- public void cancelSessionCommand(ControllerInfo controller, Object token) {
+ public void cancelSessionCommand(@NonNull ControllerInfo controller, @NonNull Object token) {
+ if (controller == null) {
+ throw new IllegalArgumentException("controller shouldn't be null");
+ }
if (token == null) {
throw new IllegalArgumentException("token shouldn't be null");
}
controller.cancelSessionCommand(token);
}
+ /**
+ * Sets whether the playback is active (i.e. playing something)
+ *
+ * @param playbackActive {@code true} if the playback active, {@code false} otherwise.
+ **/
+ public void setPlaybackActive(boolean playbackActive) {
+ synchronized (mLock) {
+ if (mPlaybackActive == playbackActive) {
+ return;
+ }
+ mPlaybackActive = playbackActive;
+ }
+ List<ControllerInfo> controllerInfos = getConnectedControllers();
+ for (ControllerInfo controller : controllerInfos) {
+ controller.notifyPlaybackActiveChanged(playbackActive);
+ }
+ }
+
+ /**
+ * Returns whehther the playback is active (i.e. playing something)
+ *
+ * @return {@code true} if the playback active, {@code false} otherwise.
+ */
+ public boolean isPlaybackActive() {
+ synchronized (mLock) {
+ return mPlaybackActive;
+ }
+ }
+
boolean isClosed() {
synchronized (mLock) {
return mClosed;
}
}
- // Called by Session2Link.onConnect
- void onConnect(final Controller2Link controller, int seq, Bundle connectionRequest) {
- if (controller == null || connectionRequest == null) {
- return;
- }
- final int uid = Binder.getCallingUid();
- final int callingPid = Binder.getCallingPid();
- final long token = Binder.clearCallingIdentity();
- // Binder.getCallingPid() can be 0 for an oneway call from the remote process.
- // If it's the case, use PID from the ConnectionRequest.
- final int pid = (callingPid != 0) ? callingPid : connectionRequest.getInt(KEY_PID);
- final String pkg = connectionRequest.getString(KEY_PACKAGE_NAME);
- try {
- RemoteUserInfo remoteUserInfo = new RemoteUserInfo(pkg, pid, uid);
- final ControllerInfo controllerInfo = new ControllerInfo(remoteUserInfo,
- mSessionManager.isTrustedForMediaControl(remoteUserInfo), controller);
- mCallbackExecutor.execute(() -> {
+ SessionCallback getCallback() {
+ return mCallback;
+ }
+
+ // Called by Session2Link.onConnect and MediaSession2Service.MediaSession2ServiceStub.connect
+ void onConnect(final Controller2Link controller, int callingPid, int callingUid, int seq,
+ Bundle connectionRequest) {
+ if (callingPid == 0) {
+ // The pid here is from Binder.getCallingPid(), which can be 0 for an oneway call from
+ // the remote process. If it's the case, use PID from the connectionRequest.
+ callingPid = connectionRequest.getInt(KEY_PID);
+ }
+ String callingPkg = connectionRequest.getString(KEY_PACKAGE_NAME);
+
+ RemoteUserInfo remoteUserInfo = new RemoteUserInfo(callingPkg, callingPid, callingUid);
+ final ControllerInfo controllerInfo = new ControllerInfo(remoteUserInfo,
+ mSessionManager.isTrustedForMediaControl(remoteUserInfo), controller);
+ mCallbackExecutor.execute(() -> {
+ boolean connected = false;
+ try {
if (isClosed()) {
return;
}
@@ -244,76 +281,72 @@ public class MediaSession2 implements AutoCloseable {
// Don't reject connection for the request from trusted app.
// Otherwise server will fail to retrieve session's information to dispatch
// media keys to.
- boolean accept =
- controllerInfo.mAllowedCommands != null || controllerInfo.isTrusted();
- if (accept) {
- if (controllerInfo.mAllowedCommands == null) {
- // For trusted apps, send non-null allowed commands to keep
- // connection.
- controllerInfo.mAllowedCommands = new Session2CommandGroup();
+ if (controllerInfo.mAllowedCommands == null && !controllerInfo.isTrusted()) {
+ return;
+ }
+ if (controllerInfo.mAllowedCommands == null) {
+ // For trusted apps, send non-null allowed commands to keep
+ // connection.
+ controllerInfo.mAllowedCommands =
+ new Session2CommandGroup.Builder().build();
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Accepting connection: " + controllerInfo);
+ }
+ synchronized (mLock) {
+ if (mConnectedControllers.containsKey(controller)) {
+ Log.w(TAG, "Controller " + controllerInfo + " has sent connection"
+ + " request multiple times");
}
+ mConnectedControllers.put(controller, controllerInfo);
+ }
+ // If connection is accepted, notify the current state to the controller.
+ // It's needed because we cannot call synchronous calls between
+ // session/controller.
+ Bundle connectionResult = new Bundle();
+ connectionResult.putParcelable(KEY_SESSION2LINK, mSessionStub);
+ connectionResult.putParcelable(KEY_ALLOWED_COMMANDS,
+ controllerInfo.mAllowedCommands);
+ connectionResult.putBoolean(KEY_PLAYBACK_ACTIVE, isPlaybackActive());
+
+ // Double check if session is still there, because close() can be called in
+ // another thread.
+ if (isClosed()) {
+ return;
+ }
+ controllerInfo.notifyConnected(connectionResult);
+ connected = true;
+ } finally {
+ if (!connected) {
if (DEBUG) {
- Log.d(TAG, "Accepting connection: " + controllerInfo);
+ Log.d(TAG, "Rejecting connection or notifying that session is closed"
+ + ", controllerInfo=" + controllerInfo);
}
synchronized (mLock) {
- if (mConnectedControllers.containsKey(controller)) {
- Log.w(TAG, "Controller " + controllerInfo + " has sent connection"
- + " request multiple times");
- }
- mConnectedControllers.put(controller, controllerInfo);
- }
- // If connection is accepted, notify the current state to the controller.
- // It's needed because we cannot call synchronous calls between
- // session/controller.
- Bundle connectionResult = new Bundle();
- connectionResult.putParcelable(KEY_SESSION2_STUB, mSessionStub);
- connectionResult.putParcelable(KEY_ALLOWED_COMMANDS,
- controllerInfo.mAllowedCommands);
-
- // Double check if session is still there, because close() can be called in
- // another thread.
- if (isClosed()) {
- return;
- }
- controllerInfo.notifyConnected(connectionResult);
- } else {
- if (DEBUG) {
- Log.d(TAG, "Rejecting connection, controllerInfo=" + controllerInfo);
+ mConnectedControllers.remove(controller);
}
controllerInfo.notifyDisconnected();
}
- });
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ }
+ });
}
// Called by Session2Link.onDisconnect
- void onDisconnect(final Controller2Link controller, int seq) {
- if (controller == null) {
- return;
- }
+ void onDisconnect(@NonNull final Controller2Link controller, int seq) {
final ControllerInfo controllerInfo;
synchronized (mLock) {
- controllerInfo = mConnectedControllers.get(controller);
+ controllerInfo = mConnectedControllers.remove(controller);
}
if (controllerInfo == null) {
return;
}
-
- final long token = Binder.clearCallingIdentity();
- try {
- mCallbackExecutor.execute(() -> {
- mCallback.onDisconnected(MediaSession2.this, controllerInfo);
- });
- mConnectedControllers.remove(controller);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ mCallbackExecutor.execute(() -> {
+ mCallback.onDisconnected(MediaSession2.this, controllerInfo);
+ });
}
// Called by Session2Link.onSessionCommand
- void onSessionCommand(final Controller2Link controller, final int seq,
+ void onSessionCommand(@NonNull final Controller2Link controller, final int seq,
final Session2Command command, final Bundle args,
@Nullable ResultReceiver resultReceiver) {
if (controller == null) {
@@ -328,34 +361,28 @@ public class MediaSession2 implements AutoCloseable {
}
// TODO: check allowed commands.
- final long token = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- controllerInfo.addRequestedCommandSeqNumber(seq);
+ synchronized (mLock) {
+ controllerInfo.addRequestedCommandSeqNumber(seq);
+ }
+ mCallbackExecutor.execute(() -> {
+ if (!controllerInfo.removeRequestedCommandSeqNumber(seq)) {
+ resultReceiver.send(RESULT_INFO_SKIPPED, null);
+ return;
}
-
- mCallbackExecutor.execute(() -> {
- if (!controllerInfo.removeRequestedCommandSeqNumber(seq)) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- return;
- }
- Session2Command.Result result = mCallback.onSessionCommand(
- MediaSession2.this, controllerInfo, command, args);
- if (resultReceiver != null) {
- if (result == null) {
- throw new RuntimeException("onSessionCommand shouldn't return null");
- } else {
- resultReceiver.send(result.getResultCode(), result.getResultData());
- }
+ Session2Command.Result result = mCallback.onSessionCommand(
+ MediaSession2.this, controllerInfo, command, args);
+ if (resultReceiver != null) {
+ if (result == null) {
+ throw new RuntimeException("onSessionCommand shouldn't return null");
+ } else {
+ resultReceiver.send(result.getResultCode(), result.getResultData());
}
- });
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ }
+ });
}
// Called by Session2Link.onCancelCommand
- void onCancelCommand(final Controller2Link controller, final int seq) {
+ void onCancelCommand(@NonNull final Controller2Link controller, final int seq) {
final ControllerInfo controllerInfo;
synchronized (mLock) {
controllerInfo = mConnectedControllers.get(controller);
@@ -363,13 +390,15 @@ public class MediaSession2 implements AutoCloseable {
if (controllerInfo == null) {
return;
}
+ controllerInfo.removeRequestedCommandSeqNumber(seq);
+ }
- final long token = Binder.clearCallingIdentity();
- try {
- controllerInfo.removeRequestedCommandSeqNumber(seq);
- } finally {
- Binder.restoreCallingIdentity(token);
+ private List<ControllerInfo> getConnectedControllers() {
+ List<ControllerInfo> controllers = new ArrayList<>();
+ synchronized (mLock) {
+ controllers.addAll(mConnectedControllers.values());
}
+ return controllers;
}
/**
@@ -464,7 +493,21 @@ public class MediaSession2 implements AutoCloseable {
if (mId == null) {
mId = "";
}
- return new MediaSession2(mContext, mId, mSessionActivity, mCallbackExecutor, mCallback);
+ MediaSession2 session2 = new MediaSession2(mContext, mId, mSessionActivity,
+ mCallbackExecutor, mCallback);
+
+ // Notify framework about the newly create session after the constructor is finished.
+ // Otherwise, framework may access the session before the initialization is finished.
+ try {
+ MediaSessionManager manager = (MediaSessionManager) mContext.getSystemService(
+ Context.MEDIA_SESSION_SERVICE);
+ manager.notifySession2Created(session2.getSessionToken());
+ } catch (Exception e) {
+ session2.close();
+ throw e;
+ }
+
+ return session2;
}
}
@@ -543,7 +586,7 @@ public class MediaSession2 implements AutoCloseable {
}
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (!(obj instanceof ControllerInfo)) return false;
if (this == obj) return true;
@@ -555,6 +598,7 @@ public class MediaSession2 implements AutoCloseable {
}
@Override
+ @NonNull
public String toString() {
return "ControllerInfo {pkg=" + mRemoteUserInfo.getPackageName() + ", uid="
+ mRemoteUserInfo.getUid() + ", allowedCommands=" + mAllowedCommands + "})";
@@ -580,6 +624,16 @@ public class MediaSession2 implements AutoCloseable {
}
}
+ void notifyPlaybackActiveChanged(boolean playbackActive) {
+ if (mControllerBinder == null) return;
+
+ try {
+ mControllerBinder.notifyPlaybackActiveChanged(getNextSeqNumber(), playbackActive);
+ } catch (RuntimeException e) {
+ // Controller may be died prematurely.
+ }
+ }
+
void sendSessionCommand(Session2Command command, Bundle args,
ResultReceiver resultReceiver) {
if (mControllerBinder == null) return;
@@ -641,6 +695,8 @@ public class MediaSession2 implements AutoCloseable {
* This API is not generally intended for third party application developers.
*/
public abstract static class SessionCallback {
+ ForegroundServiceEventCallback mForegroundServiceEventCallback;
+
/**
* Called when a controller is created for this session. Return allowed commands for
* controller. By default it returns {@code null}.
@@ -678,7 +734,7 @@ public class MediaSession2 implements AutoCloseable {
* @return the result for the session command. A runtime exception will be thrown if null
* is returned.
*/
- @NonNull
+ @Nullable
public Session2Command.Result onSessionCommand(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull Session2Command command,
@Nullable Bundle args) {
@@ -697,5 +753,19 @@ public class MediaSession2 implements AutoCloseable {
public void onCommandResult(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull Object token,
@NonNull Session2Command command, @NonNull Session2Command.Result result) {}
+
+ final void onSessionClosed(MediaSession2 session) {
+ if (mForegroundServiceEventCallback != null) {
+ mForegroundServiceEventCallback.onSessionClosed(session);
+ }
+ }
+
+ void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) {
+ mForegroundServiceEventCallback = callback;
+ }
+
+ abstract static class ForegroundServiceEventCallback {
+ public void onSessionClosed(MediaSession2 session) {}
+ }
}
}
diff --git a/media/java/android/media/MediaSession2Service.java b/media/java/android/media/MediaSession2Service.java
new file mode 100644
index 000000000000..8fb00fe487e8
--- /dev/null
+++ b/media/java/android/media/MediaSession2Service.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.annotation.CallSuper;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Service containing {@link MediaSession2}.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
+ * for consistent behavior across all devices.
+ * @hide
+ */
+// TODO: Unhide
+// TODO: Add onUpdateNotification(), and calls it to get Notification for startForegroundService()
+// when a session's player state becomes playing.
+public abstract class MediaSession2Service extends Service {
+ /**
+ * The {@link Intent} that must be declared as handled by the service.
+ */
+ public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service";
+
+ private static final String TAG = "MediaSession2Service";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private Map<String, MediaSession2> mSessions = new ArrayMap<>();
+
+ private MediaSession2ServiceStub mStub;
+
+ /**
+ * Called by the system when the service is first created. Do not call this method directly.
+ * <p>
+ * Override this method if you need your own initialization. Derived classes MUST call through
+ * to the super class's implementation of this method.
+ */
+ @CallSuper
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mStub = new MediaSession2ServiceStub(this);
+ }
+
+ @CallSuper
+ @Override
+ @Nullable
+ public IBinder onBind(@NonNull Intent intent) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mStub;
+ }
+ return null;
+ }
+
+ @CallSuper
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ // TODO: Dispatch media key events to the primary session.
+ return START_STICKY;
+ }
+
+ /**
+ * Called by the system to notify that it is no longer used and is being removed. Do not call
+ * this method directly.
+ * <p>
+ * Override this method if you need your own clean up. Derived classes MUST call through
+ * to the super class's implementation of this method.
+ */
+ @CallSuper
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ synchronized (mLock) {
+ for (MediaSession2 session : mSessions.values()) {
+ session.getCallback().setForegroundServiceEventCallback(null);
+ }
+ mSessions.clear();
+ }
+ mStub.close();
+ }
+
+ /**
+ * Called when a {@link MediaController2} is created with the this service's
+ * {@link Session2Token}. Return the primary session for telling the controller which session to
+ * connect.
+ * <p>
+ * Primary session is the highest priority session that this service manages. Here are some
+ * recommendations of the primary session.
+ * <ol>
+ * <li>When there's no {@link MediaSession2}, create and return a new session. Resume the
+ * playback that the app has the lastly played with the new session. The behavior is what
+ * framework expects when the framework sends key events to the service.</li>
+ * <li>When there's multiple {@link MediaSession2}s, pick the session that has the lastly
+ * started the playback. This is the same way as the framework prioritize sessions to receive
+ * media key events.</li>
+ * </ol>
+ * <p>
+ * Session returned here will be added to this service automatically. You don't need to call
+ * {@link #addSession(MediaSession2)} for that.
+ * <p>
+ * Session service will accept or reject the connection with the
+ * {@link MediaSession2.SessionCallback} in the session returned here.
+ * <p>
+ * This method is always called on the main thread.
+ *
+ * @return a new session
+ * @see MediaSession2.Builder
+ * @see #getSessions()
+ */
+ @NonNull
+ public abstract MediaSession2 onGetPrimarySession();
+
+ /**
+ * Adds a session to this service.
+ * <p>
+ * Added session will be removed automatically when it's closed, or removed when
+ * {@link #removeSession} is called.
+ *
+ * @param session a session to be added.
+ * @see #removeSession(MediaSession2)
+ */
+ public final void addSession(@NonNull MediaSession2 session) {
+ if (session == null) {
+ throw new IllegalArgumentException("session shouldn't be null");
+ }
+ if (session.isClosed()) {
+ throw new IllegalArgumentException("session is already closed");
+ }
+ synchronized (mLock) {
+ MediaSession2 previousSession = mSessions.get(session.getSessionId());
+ if (previousSession != session) {
+ if (previousSession != null) {
+ Log.w(TAG, "Session ID should be unique, ID=" + session.getSessionId()
+ + ", previous=" + previousSession + ", session=" + session);
+ }
+ return;
+ }
+ mSessions.put(session.getSessionId(), session);
+ session.getCallback().setForegroundServiceEventCallback(
+ new MediaSession2.SessionCallback.ForegroundServiceEventCallback() {
+ @Override
+ public void onSessionClosed(MediaSession2 session) {
+ removeSession(session);
+ }
+ });
+ }
+ }
+
+ /**
+ * Removes a session from this service.
+ *
+ * @param session a session to be removed.
+ * @see #addSession(MediaSession2)
+ */
+ public final void removeSession(@NonNull MediaSession2 session) {
+ if (session == null) {
+ throw new IllegalArgumentException("session shouldn't be null");
+ }
+ synchronized (mLock) {
+ mSessions.remove(session.getSessionId());
+ }
+ }
+
+ /**
+ * Gets the list of {@link MediaSession2}s that you've added to this service.
+ *
+ * @return sessions
+ */
+ public final @NonNull List<MediaSession2> getSessions() {
+ List<MediaSession2> list = new ArrayList<>();
+ synchronized (mLock) {
+ list.addAll(mSessions.values());
+ }
+ return list;
+ }
+
+ private static final class MediaSession2ServiceStub extends IMediaSession2Service.Stub
+ implements AutoCloseable {
+ final WeakReference<MediaSession2Service> mService;
+ final Handler mHandler;
+
+ MediaSession2ServiceStub(MediaSession2Service service) {
+ mService = new WeakReference<>(service);
+ mHandler = new Handler(service.getMainLooper());
+ }
+
+ @Override
+ public void connect(Controller2Link caller, int seq, Bundle connectionRequest) {
+ if (mService.get() == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Service is already destroyed");
+ }
+ return;
+ }
+ if (caller == null || connectionRequest == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Ignoring calls with illegal arguments, caller=" + caller
+ + ", connectionRequest=" + connectionRequest);
+ }
+ return;
+ }
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mHandler.post(() -> {
+ boolean shouldNotifyDisconnected = true;
+ try {
+ final MediaSession2Service service = mService.get();
+ if (service == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Service isn't available");
+ }
+ return;
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Handling incoming connection request from the"
+ + " controller, controller=" + caller + ", uid=" + uid);
+ }
+ final MediaSession2 session;
+ session = service.onGetPrimarySession();
+ service.addSession(session);
+ shouldNotifyDisconnected = false;
+ session.onConnect(caller, pid, uid, seq, connectionRequest);
+ } catch (Exception e) {
+ // Don't propagate exception in service to the controller.
+ Log.w(TAG, "Failed to add a session to session service", e);
+ } finally {
+ // Trick to call onDisconnected() in one place.
+ if (shouldNotifyDisconnected) {
+ if (DEBUG) {
+ Log.d(TAG, "Service has destroyed prematurely."
+ + " Rejecting connection");
+ }
+ try {
+ caller.notifyDisconnected(0);
+ } catch (RuntimeException e) {
+ // Controller may be died prematurely.
+ // Not an issue because we'll ignore it anyway.
+ }
+ }
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void close() {
+ mHandler.removeCallbacksAndMessages(null);
+ mService.clear();
+ }
+ }
+}
diff --git a/media/java/android/media/MicrophoneDirection.java b/media/java/android/media/MicrophoneDirection.java
new file mode 100644
index 000000000000..99201c0279bf
--- /dev/null
+++ b/media/java/android/media/MicrophoneDirection.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+/**
+ * @hide
+ */
+public interface MicrophoneDirection {
+ /**
+ * @hide
+ */
+ int MIC_DIRECTION_UNSPECIFIED = 0;
+
+ /**
+ * @hide
+ */
+ int MIC_DIRECTION_FRONT = 1;
+
+ /**
+ * @hide
+ */
+ int MIC_DIRECTION_BACK = 2;
+
+ /**
+ * @hide
+ */
+ int MIC_DIRECTION_EXTERNAL = 3;
+
+ /**
+ * Specifies the logical microphone (for processing).
+ *
+ * @param direction Direction constant (MicrophoneDirection.MIC_DIRECTION_*)
+ * @return retval OK if the call is successful, an error code otherwise.
+ * @hide
+ */
+ int setMicrophoneDirection(int direction);
+
+ /**
+ * Specifies the zoom factor (i.e. the field dimension) for the selected microphone
+ * (for processing). The selected microphone is determined by the use-case for the stream.
+ *
+ * @param zoom the desired field dimension of microphone capture. Range is from -1 (wide angle),
+ * though 0 (no zoom) to 1 (maximum zoom).
+ * @return retval OK if the call is successful, an error code otherwise.
+ * @hide
+ */
+ int setMicrophoneFieldDimension(float zoom);
+}
diff --git a/media/java/android/media/Session2Command.java b/media/java/android/media/Session2Command.java
index d2a5aae435a1..8b285f212a8d 100644
--- a/media/java/android/media/Session2Command.java
+++ b/media/java/android/media/Session2Command.java
@@ -36,8 +36,6 @@ import java.util.Objects;
* Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
* <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
* for consistent behavior across all devices.
- * </p>
- * @hide
*/
public final class Session2Command implements Parcelable {
/**
@@ -151,14 +149,17 @@ public final class Session2Command implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ if (dest == null) {
+ throw new IllegalArgumentException("parcel shouldn't be null");
+ }
dest.writeInt(mCommandCode);
dest.writeString(mCustomCommand);
dest.writeBundle(mExtras);
}
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (!(obj instanceof Session2Command)) {
return false;
}
@@ -185,7 +186,7 @@ public final class Session2Command implements Parcelable {
* @param resultCode result code
* @param resultData result data
*/
- public Result(int resultCode, Bundle resultData) {
+ public Result(int resultCode, @Nullable Bundle resultData) {
mResultCode = resultCode;
mResultData = resultData;
}
@@ -200,6 +201,7 @@ public final class Session2Command implements Parcelable {
/**
* Returns the result data.
*/
+ @Nullable
public Bundle getResultData() {
return mResultData;
}
diff --git a/media/java/android/media/Session2CommandGroup.java b/media/java/android/media/Session2CommandGroup.java
index 122dfb156567..a189c264b029 100644
--- a/media/java/android/media/Session2CommandGroup.java
+++ b/media/java/android/media/Session2CommandGroup.java
@@ -35,7 +35,6 @@ import java.util.Set;
* <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
* for consistent behavior across all devices.
* </p>
- * @hide
*/
public final class Session2CommandGroup implements Parcelable {
private static final String TAG = "Session2CommandGroup";
@@ -56,16 +55,12 @@ public final class Session2CommandGroup implements Parcelable {
Set<Session2Command> mCommands = new HashSet<>();
/**
- * Default Constructor.
- */
- public Session2CommandGroup() {}
-
- /**
* Creates a new Session2CommandGroup with commands copied from another object.
*
* @param commands The collection of commands to copy.
*/
- public Session2CommandGroup(@Nullable Collection<Session2Command> commands) {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ Session2CommandGroup(@Nullable Collection<Session2Command> commands) {
if (commands != null) {
mCommands.addAll(commands);
}
@@ -129,8 +124,11 @@ public final class Session2CommandGroup implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeParcelableArray((Session2Command[]) mCommands.toArray(), 0);
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ if (dest == null) {
+ throw new IllegalArgumentException("parcel shouldn't be null");
+ }
+ dest.writeParcelableArray(mCommands.toArray(new Session2Command[0]), 0);
}
/**
@@ -149,6 +147,9 @@ public final class Session2CommandGroup implements Parcelable {
* @param commandGroup
*/
public Builder(@NonNull Session2CommandGroup commandGroup) {
+ if (commandGroup == null) {
+ throw new IllegalArgumentException("command group shouldn't be null");
+ }
mCommands = commandGroup.getCommands();
}
diff --git a/media/java/android/media/Session2Link.java b/media/java/android/media/Session2Link.java
index 5fe558da12f5..08664aa3b38f 100644
--- a/media/java/android/media/Session2Link.java
+++ b/media/java/android/media/Session2Link.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.NonNull;
+import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
@@ -145,8 +146,9 @@ public final class Session2Link implements Parcelable {
}
/** Stub implementation for IMediaSession2.connect */
- public void onConnect(final Controller2Link caller, int seq, Bundle connectionRequest) {
- mSession.onConnect(caller, seq, connectionRequest);
+ public void onConnect(final Controller2Link caller, int pid, int uid, int seq,
+ Bundle connectionRequest) {
+ mSession.onConnect(caller, pid, uid, seq, connectionRequest);
}
/** Stub implementation for IMediaSession2.disconnect */
@@ -168,23 +170,57 @@ public final class Session2Link implements Parcelable {
private class Session2Stub extends IMediaSession2.Stub {
@Override
public void connect(final Controller2Link caller, int seq, Bundle connectionRequest) {
- Session2Link.this.onConnect(caller, seq, connectionRequest);
+ if (caller == null || connectionRequest == null) {
+ return;
+ }
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Session2Link.this.onConnect(caller, pid, uid, seq, connectionRequest);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void disconnect(final Controller2Link caller, int seq) {
- Session2Link.this.onDisconnect(caller, seq);
+ if (caller == null) {
+ return;
+ }
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Session2Link.this.onDisconnect(caller, seq);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void sendSessionCommand(final Controller2Link caller, final int seq,
final Session2Command command, final Bundle args, ResultReceiver resultReceiver) {
- Session2Link.this.onSessionCommand(caller, seq, command, args, resultReceiver);
+ if (caller == null) {
+ return;
+ }
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Session2Link.this.onSessionCommand(caller, seq, command, args, resultReceiver);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
public void cancelSessionCommand(final Controller2Link caller, final int seq) {
- Session2Link.this.onCancelCommand(caller, seq);
+ if (caller == null) {
+ return;
+ }
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Session2Link.this.onCancelCommand(caller, seq);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
}
}
diff --git a/core/java/android/hardware/location/ActivityChangedEvent.aidl b/media/java/android/media/Session2Token.aidl
index 21f24459ac85..c5980e9e77fd 100644
--- a/core/java/android/hardware/location/ActivityChangedEvent.aidl
+++ b/media/java/android/media/Session2Token.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright 2019 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.
@@ -11,9 +11,9 @@
* 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
+ * limitations under the License.
*/
-package android.hardware.location;
+package android.media;
-parcelable ActivityChangedEvent; \ No newline at end of file
+parcelable Session2Token;
diff --git a/media/java/android/media/Session2Token.java b/media/java/android/media/Session2Token.java
index 7642faae00c7..d8f74c518bf4 100644
--- a/media/java/android/media/Session2Token.java
+++ b/media/java/android/media/Session2Token.java
@@ -27,6 +27,7 @@ import android.content.pm.ResolveInfo;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -34,7 +35,7 @@ import java.util.List;
import java.util.Objects;
/**
- * Represents an ongoing {@link MediaSession2} or a {@link MediaSession2Service}.
+ * Represents an ongoing {@link MediaSession2} or a MediaSession2Service.
* If it's representing a session service, it may not be ongoing.
* <p>
* This API is not generally intended for third party application developers.
@@ -45,9 +46,7 @@ import java.util.Objects;
* This may be passed to apps by the session owner to allow them to create a
* {@link MediaController2} to communicate with the session.
* <p>
- * It can be also obtained by {@link MediaSessionManager}.
- *
- * @hide
+ * It can be also obtained by {@link android.media.session.MediaSessionManager}.
*/
// New version of MediaSession2.Token for following reasons
// - Stop implementing Parcelable for updatable support
@@ -56,6 +55,7 @@ import java.util.Objects;
// This helps controller apps to keep target of dispatching media key events in uniform way.
// For details about the reason, see following. (Android O+)
// android.media.session.MediaSessionManager.Callback#onAddressedPlayerChanged
+// TODO: use @link for MediaSession2Service
public final class Session2Token implements Parcelable {
private static final String TAG = "Session2Token";
@@ -75,7 +75,7 @@ public final class Session2Token implements Parcelable {
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = "TYPE_", value = {TYPE_SESSION, TYPE_SESSION_SERVICE, TYPE_LIBRARY_SERVICE})
+ @IntDef(prefix = "TYPE_", value = {TYPE_SESSION, TYPE_SESSION_SERVICE})
public @interface TokenType {
}
@@ -85,15 +85,10 @@ public final class Session2Token implements Parcelable {
public static final int TYPE_SESSION = 0;
/**
- * Type for {@link MediaSession2Service}.
+ * Type for MediaSession2Service.
*/
public static final int TYPE_SESSION_SERVICE = 1;
- /**
- * Type for {@link MediaLibrary2Service}.
- */
- public static final int TYPE_LIBRARY_SERVICE = 2;
-
private final int mUid;
private final @TokenType int mType;
private final String mPackageName;
@@ -102,7 +97,7 @@ public final class Session2Token implements Parcelable {
private final ComponentName mComponentName;
/**
- * Constructor for the token.
+ * Constructor for the token with type {@link #TYPE_SESSION_SERVICE}.
*
* @param context The context.
* @param serviceComponent The component name of the service.
@@ -118,28 +113,15 @@ public final class Session2Token implements Parcelable {
final PackageManager manager = context.getPackageManager();
final int uid = getUid(manager, serviceComponent.getPackageName());
- // TODO: Uncomment below to stop hardcode type.
- final int type = TYPE_SESSION;
-// final int type;
-// if (isInterfaceDeclared(manager, MediaLibraryService2.SERVICE_INTERFACE,
-// serviceComponent)) {
-// type = TYPE_LIBRARY_SERVICE;
-// } else if (isInterfaceDeclared(manager, MediaSessionService2.SERVICE_INTERFACE,
-// serviceComponent)) {
-// type = TYPE_SESSION_SERVICE;
-// } else if (isInterfaceDeclared(manager,
-// MediaBrowserServiceCompat.SERVICE_INTERFACE, serviceComponent)) {
-// type = TYPE_BROWSER_SERVICE_LEGACY;
-// } else {
-// throw new IllegalArgumentException(serviceComponent + " doesn't implement none of"
-// + " MediaSessionService2, MediaLibraryService2, MediaBrowserService nor"
-// + " MediaBrowserServiceCompat. Use service's full name.");
-// }
+ if (!isInterfaceDeclared(manager, MediaSession2Service.SERVICE_INTERFACE,
+ serviceComponent)) {
+ Log.w(TAG, serviceComponent + " doesn't implement MediaSession2Service.");
+ }
mComponentName = serviceComponent;
mPackageName = serviceComponent.getPackageName();
mServiceName = serviceComponent.getClassName();
mUid = uid;
- mType = type;
+ mType = TYPE_SESSION_SERVICE;
mSessionLink = null;
}
@@ -157,9 +139,7 @@ public final class Session2Token implements Parcelable {
mType = in.readInt();
mPackageName = in.readString();
mServiceName = in.readString();
- // TODO: Uncomment below and stop hardcode mSessionLink
- mSessionLink = null;
- //mSessionLink = ISession.Stub.asInterface(in.readStrongBinder());
+ mSessionLink = in.readParcelable(null);
mComponentName = ComponentName.unflattenFromString(in.readString());
}
@@ -169,8 +149,7 @@ public final class Session2Token implements Parcelable {
dest.writeInt(mType);
dest.writeString(mPackageName);
dest.writeString(mServiceName);
- // TODO: Uncomment below
- //dest.writeStrongBinder(mSessionLink.asBinder());
+ dest.writeParcelable(mSessionLink, flags);
dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString());
}
@@ -238,7 +217,6 @@ public final class Session2Token implements Parcelable {
* @return type of the token
* @see #TYPE_SESSION
* @see #TYPE_SESSION_SERVICE
- * @see #TYPE_LIBRARY_SERVICE
*/
public @TokenType int getType() {
return mType;
@@ -254,7 +232,7 @@ public final class Session2Token implements Parcelable {
private static boolean isInterfaceDeclared(PackageManager manager, String serviceInterface,
ComponentName serviceComponent) {
Intent serviceIntent = new Intent(serviceInterface);
- // Use queryIntentServices to find services with MediaLibraryService2.SERVICE_INTERFACE.
+ // Use queryIntentServices to find services with MediaSession2Service.SERVICE_INTERFACE.
// We cannot use resolveService with intent specified class name, because resolveService
// ignores actions if Intent.setClassName() is specified.
serviceIntent.setPackage(serviceComponent.getPackageName());
diff --git a/media/java/android/media/session/ControllerCallbackLink.aidl b/media/java/android/media/session/ControllerCallbackLink.aidl
new file mode 100644
index 000000000000..8ee8c7d00148
--- /dev/null
+++ b/media/java/android/media/session/ControllerCallbackLink.aidl
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.session;
+
+parcelable ControllerCallbackLink;
diff --git a/media/java/android/media/session/ControllerCallbackLink.java b/media/java/android/media/session/ControllerCallbackLink.java
new file mode 100644
index 000000000000..a143c9b98ff3
--- /dev/null
+++ b/media/java/android/media/session/ControllerCallbackLink.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.media.MediaMetadata;
+import android.media.session.MediaController.PlaybackInfo;
+import android.media.session.MediaSession.QueueItem;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+
+import java.util.List;
+
+/**
+ * Handles incoming commands to {@link MediaController.Callback}.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ */
+public final class ControllerCallbackLink implements Parcelable {
+ final CallbackStub mCallbackStub;
+ final ISessionControllerCallback mIControllerCallback;
+
+ /**
+ * Constructor for stub (Callee)
+ * @hide
+ */
+ @SystemApi
+ public ControllerCallbackLink(@NonNull CallbackStub callbackStub) {
+ mCallbackStub = callbackStub;
+ mIControllerCallback = new CallbackStubProxy();
+ }
+
+ /**
+ * Constructor for interface (Caller)
+ */
+ ControllerCallbackLink(Parcel in) {
+ mCallbackStub = null;
+ mIControllerCallback = ISessionControllerCallback.Stub.asInterface(in.readStrongBinder());
+ }
+
+ /**
+ * Notify controller that the connected session is destroyed.
+ */
+ public void notifySessionDestroyed() {
+ try {
+ mIControllerCallback.notifySessionDestroyed();
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the connected session sends an event.
+ *
+ * @param event the name of the event
+ * @param extras the extras included with the event
+ */
+ public void notifyEvent(@NonNull String event, @Nullable Bundle extras) {
+ try {
+ mIControllerCallback.notifyEvent(event, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the current playback state is changed.
+ *
+ * @param state the new playback state
+ */
+ public void notifyPlaybackStateChanged(@Nullable PlaybackState state) {
+ try {
+ mIControllerCallback.notifyPlaybackStateChanged(state);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the current metadata is changed.
+ *
+ * @param metadata the new metadata
+ */
+ public void notifyMetadataChanged(@Nullable MediaMetadata metadata) {
+ try {
+ mIControllerCallback.notifyMetadataChanged(metadata);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the current queue is changed.
+ *
+ * @param queue the new queue
+ */
+ public void notifyQueueChanged(@Nullable List<QueueItem> queue) {
+ try {
+ mIControllerCallback.notifyQueueChanged(queue);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the current queue title is changed.
+ *
+ * @param title the new queue title
+ */
+ public void notifyQueueTitleChanged(@Nullable CharSequence title) {
+ try {
+ mIControllerCallback.notifyQueueTitleChanged(title);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the extras are changed.
+ *
+ * @param extras the new extras
+ */
+ public void notifyExtrasChanged(@Nullable Bundle extras) {
+ try {
+ mIControllerCallback.notifyExtrasChanged(extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify controller that the playback info is changed.
+ *
+ * @param info the new playback info
+ */
+ public void notifyVolumeInfoChanged(@NonNull PlaybackInfo info) {
+ try {
+ mIControllerCallback.notifyVolumeInfoChanged(info);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /** Gets the binder */
+ @NonNull
+ public IBinder getBinder() {
+ return mIControllerCallback.asBinder();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeStrongBinder(mIControllerCallback.asBinder());
+ }
+
+ public static final Parcelable.Creator<ControllerCallbackLink> CREATOR =
+ new Parcelable.Creator<ControllerCallbackLink>() {
+ @Override
+ public ControllerCallbackLink createFromParcel(Parcel in) {
+ return new ControllerCallbackLink(in);
+ }
+
+ @Override
+ public ControllerCallbackLink[] newArray(int size) {
+ return new ControllerCallbackLink[size];
+ }
+ };
+
+ /**
+ * Class for Stub implementation
+ * @hide
+ */
+ @SystemApi
+ public abstract static class CallbackStub {
+ /** Stub method for ISessionControllerCallback.notifySessionDestroyed */
+ public void onSessionDestroyed() {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyEvent */
+ public void onEvent(@NonNull String event, @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyPlaybackStateChanged */
+ public void onPlaybackStateChanged(@Nullable PlaybackState state) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyMetadataChanged */
+ public void onMetadataChanged(@Nullable MediaMetadata metadata) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyQueueChanged */
+ public void onQueueChanged(@Nullable List<QueueItem> queue) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyQueueTitleChanged */
+ public void onQueueTitleChanged(@Nullable CharSequence title) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyExtrasChanged */
+ public void onExtrasChanged(@Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionControllerCallback.notifyVolumeInfoChanged */
+ public void onVolumeInfoChanged(@NonNull PlaybackInfo info) {
+ }
+ }
+
+ private class CallbackStubProxy extends ISessionControllerCallback.Stub {
+ @Override
+ public void notifyEvent(String event, Bundle extras) {
+ mCallbackStub.onEvent(event, extras);
+ }
+
+ @Override
+ public void notifySessionDestroyed() {
+ mCallbackStub.onSessionDestroyed();
+ }
+
+ @Override
+ public void notifyPlaybackStateChanged(PlaybackState state) {
+ mCallbackStub.onPlaybackStateChanged(state);
+ }
+
+ @Override
+ public void notifyMetadataChanged(MediaMetadata metadata) {
+ mCallbackStub.onMetadataChanged(metadata);
+ }
+
+ @Override
+ public void notifyQueueChanged(List<QueueItem> queue) {
+ mCallbackStub.onQueueChanged(queue);
+ }
+
+ @Override
+ public void notifyQueueTitleChanged(CharSequence title) {
+ mCallbackStub.onQueueTitleChanged(title);
+ }
+
+ @Override
+ public void notifyExtrasChanged(Bundle extras) {
+ mCallbackStub.onExtrasChanged(extras);
+ }
+
+ @Override
+ public void notifyVolumeInfoChanged(PlaybackInfo info) {
+ mCallbackStub.onVolumeInfoChanged(info);
+ }
+ }
+}
diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl
index bfc05fa4e3a4..1524ad9c5de1 100644
--- a/media/java/android/media/session/ISession.aidl
+++ b/media/java/android/media/session/ISession.aidl
@@ -16,7 +16,6 @@
package android.media.session;
import android.app.PendingIntent;
-import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes;
import android.media.MediaMetadata;
import android.media.session.ISessionController;
@@ -41,7 +40,8 @@ interface ISession {
// These commands are for the TransportPerformer
void setMetadata(in MediaMetadata metadata, long duration, String metadataDescription);
void setPlaybackState(in PlaybackState state);
- void setQueue(in ParceledListSlice queue);
+ // TODO(b/122432476): Replace List with MediaParceledListSlice
+ void setQueue(in List<MediaSession.QueueItem> queue);
void setQueueTitle(CharSequence title);
void setExtras(in Bundle extras);
void setRatingType(int type);
diff --git a/media/java/android/media/session/ISession2TokensListener.aidl b/media/java/android/media/session/ISession2TokensListener.aidl
new file mode 100644
index 000000000000..7d1a4aad35b0
--- /dev/null
+++ b/media/java/android/media/session/ISession2TokensListener.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.media.Session2Token;
+
+/**
+ * Listens for changes to the list of session2 tokens.
+ * @hide
+ */
+oneway interface ISession2TokensListener {
+ void onSession2TokensChanged(in List<Session2Token> tokens);
+}
diff --git a/media/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl
index 626338d97ccb..9b86bfced340 100644
--- a/media/java/android/media/session/ISessionCallback.aidl
+++ b/media/java/android/media/session/ISessionCallback.aidl
@@ -17,7 +17,7 @@ package android.media.session;
import android.content.Intent;
import android.media.Rating;
-import android.media.session.ISessionControllerCallback;
+import android.media.session.ControllerCallbackLink;
import android.net.Uri;
import android.os.Bundle;
import android.os.ResultReceiver;
@@ -26,46 +26,46 @@ import android.os.ResultReceiver;
* @hide
*/
oneway interface ISessionCallback {
- void onCommand(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyCommand(String packageName, int pid, int uid, in ControllerCallbackLink caller,
String command, in Bundle args, in ResultReceiver cb);
- void onMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent,
+ void notifyMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent,
int sequenceNumber, in ResultReceiver cb);
- void onMediaButtonFromController(String packageName, int pid, int uid,
- ISessionControllerCallback caller, in Intent mediaButtonIntent);
+ void notifyMediaButtonFromController(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, in Intent mediaButtonIntent);
// These callbacks are for the TransportPerformer
- void onPrepare(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onPrepareFromMediaId(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String mediaId, in Bundle extras);
- void onPrepareFromSearch(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String query, in Bundle extras);
- void onPrepareFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyPrepare(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyPrepareFromMediaId(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, String mediaId, in Bundle extras);
+ void notifyPrepareFromSearch(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, String query, in Bundle extras);
+ void notifyPrepareFromUri(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, in Uri uri, in Bundle extras);
+ void notifyPlay(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyPlayFromMediaId(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, String mediaId, in Bundle extras);
+ void notifyPlayFromSearch(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, String query, in Bundle extras);
+ void notifyPlayFromUri(String packageName, int pid, int uid, in ControllerCallbackLink caller,
in Uri uri, in Bundle extras);
- void onPlay(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onPlayFromMediaId(String packageName, int pid, int uid, ISessionControllerCallback caller,
- String mediaId, in Bundle extras);
- void onPlayFromSearch(String packageName, int pid, int uid, ISessionControllerCallback caller,
- String query, in Bundle extras);
- void onPlayFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller,
- in Uri uri, in Bundle extras);
- void onSkipToTrack(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifySkipToTrack(String packageName, int pid, int uid, in ControllerCallbackLink caller,
long id);
- void onPause(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onStop(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onNext(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onPrevious(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onFastForward(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onRewind(String packageName, int pid, int uid, ISessionControllerCallback caller);
- void onSeekTo(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyPause(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyStop(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyNext(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyPrevious(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyFastForward(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifyRewind(String packageName, int pid, int uid, in ControllerCallbackLink caller);
+ void notifySeekTo(String packageName, int pid, int uid, in ControllerCallbackLink caller,
long pos);
- void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyRate(String packageName, int pid, int uid, in ControllerCallbackLink caller,
in Rating rating);
- void onCustomAction(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyCustomAction(String packageName, int pid, int uid, in ControllerCallbackLink caller,
String action, in Bundle args);
// These callbacks are for volume handling
- void onAdjustVolume(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ void notifyAdjustVolume(String packageName, int pid, int uid, in ControllerCallbackLink caller,
int direction);
- void onSetVolumeTo(String packageName, int pid, int uid,
- ISessionControllerCallback caller, int value);
+ void notifySetVolumeTo(String packageName, int pid, int uid,
+ in ControllerCallbackLink caller, int value);
}
diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl
index e61bf5b48223..2ba09fd92af5 100644
--- a/media/java/android/media/session/ISessionController.aidl
+++ b/media/java/android/media/session/ISessionController.aidl
@@ -17,12 +17,11 @@ package android.media.session;
import android.app.PendingIntent;
import android.content.Intent;
-import android.content.pm.ParceledListSlice;
import android.media.MediaMetadata;
import android.media.Rating;
-import android.media.session.ISessionControllerCallback;
+import android.media.session.ControllerCallbackLink;
+import android.media.session.MediaController;
import android.media.session.MediaSession;
-import android.media.session.ParcelableVolumeInfo;
import android.media.session.PlaybackState;
import android.net.Uri;
import android.os.Bundle;
@@ -36,53 +35,53 @@ import java.util.List;
* @hide
*/
interface ISessionController {
- void sendCommand(String packageName, ISessionControllerCallback caller,
+ void sendCommand(String packageName, in ControllerCallbackLink caller,
String command, in Bundle args, in ResultReceiver cb);
- boolean sendMediaButton(String packageName, ISessionControllerCallback caller,
+ boolean sendMediaButton(String packageName, in ControllerCallbackLink caller,
boolean asSystemService, in KeyEvent mediaButton);
- void registerCallbackListener(String packageName, ISessionControllerCallback cb);
- void unregisterCallbackListener(ISessionControllerCallback cb);
+ void registerCallbackListener(String packageName, in ControllerCallbackLink cb);
+ void unregisterCallbackListener(in ControllerCallbackLink cb);
boolean isTransportControlEnabled();
String getPackageName();
String getTag();
PendingIntent getLaunchPendingIntent();
long getFlags();
- ParcelableVolumeInfo getVolumeAttributes();
+ MediaController.PlaybackInfo getVolumeAttributes();
void adjustVolume(String packageName, String opPackageName,
- in ISessionControllerCallback caller, boolean asSystemService, int direction,
+ in ControllerCallbackLink caller, boolean asSystemService, int direction,
int flags);
- void setVolumeTo(String packageName, String opPackageName, in ISessionControllerCallback caller,
+ void setVolumeTo(String packageName, String opPackageName, in ControllerCallbackLink caller,
int value, int flags);
// These commands are for the TransportControls
- void prepare(String packageName, ISessionControllerCallback caller);
- void prepareFromMediaId(String packageName, ISessionControllerCallback caller,
+ void prepare(String packageName, in ControllerCallbackLink caller);
+ void prepareFromMediaId(String packageName, in ControllerCallbackLink caller,
String mediaId, in Bundle extras);
- void prepareFromSearch(String packageName, ISessionControllerCallback caller,
+ void prepareFromSearch(String packageName, in ControllerCallbackLink caller,
String string, in Bundle extras);
- void prepareFromUri(String packageName, ISessionControllerCallback caller,
+ void prepareFromUri(String packageName, in ControllerCallbackLink caller,
in Uri uri, in Bundle extras);
- void play(String packageName, ISessionControllerCallback caller);
- void playFromMediaId(String packageName, ISessionControllerCallback caller,
+ void play(String packageName, in ControllerCallbackLink caller);
+ void playFromMediaId(String packageName, in ControllerCallbackLink caller,
String mediaId, in Bundle extras);
- void playFromSearch(String packageName, ISessionControllerCallback caller,
+ void playFromSearch(String packageName, in ControllerCallbackLink caller,
String string, in Bundle extras);
- void playFromUri(String packageName, ISessionControllerCallback caller,
+ void playFromUri(String packageName, in ControllerCallbackLink caller,
in Uri uri, in Bundle extras);
- void skipToQueueItem(String packageName, ISessionControllerCallback caller, long id);
- void pause(String packageName, ISessionControllerCallback caller);
- void stop(String packageName, ISessionControllerCallback caller);
- void next(String packageName, ISessionControllerCallback caller);
- void previous(String packageName, ISessionControllerCallback caller);
- void fastForward(String packageName, ISessionControllerCallback caller);
- void rewind(String packageName, ISessionControllerCallback caller);
- void seekTo(String packageName, ISessionControllerCallback caller, long pos);
- void rate(String packageName, ISessionControllerCallback caller, in Rating rating);
- void sendCustomAction(String packageName, ISessionControllerCallback caller,
+ void skipToQueueItem(String packageName, in ControllerCallbackLink caller, long id);
+ void pause(String packageName, in ControllerCallbackLink caller);
+ void stop(String packageName, in ControllerCallbackLink caller);
+ void next(String packageName, in ControllerCallbackLink caller);
+ void previous(String packageName, in ControllerCallbackLink caller);
+ void fastForward(String packageName, in ControllerCallbackLink caller);
+ void rewind(String packageName, in ControllerCallbackLink caller);
+ void seekTo(String packageName, in ControllerCallbackLink caller, long pos);
+ void rate(String packageName, in ControllerCallbackLink caller, in Rating rating);
+ void sendCustomAction(String packageName, in ControllerCallbackLink caller,
String action, in Bundle args);
MediaMetadata getMetadata();
PlaybackState getPlaybackState();
- ParceledListSlice getQueue();
+ List<MediaSession.QueueItem> getQueue();
CharSequence getQueueTitle();
Bundle getExtras();
int getRatingType();
diff --git a/media/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl
index cf3176706d7e..5c02e7c2f6e3 100644
--- a/media/java/android/media/session/ISessionControllerCallback.aidl
+++ b/media/java/android/media/session/ISessionControllerCallback.aidl
@@ -15,25 +15,24 @@
package android.media.session;
-import android.content.pm.ParceledListSlice;
import android.media.MediaMetadata;
-import android.media.session.ParcelableVolumeInfo;
-import android.media.session.PlaybackState;
+import android.media.session.MediaController;
import android.media.session.MediaSession;
+import android.media.session.PlaybackState;
import android.os.Bundle;
/**
* @hide
*/
oneway interface ISessionControllerCallback {
- void onEvent(String event, in Bundle extras);
- void onSessionDestroyed();
+ void notifyEvent(String event, in Bundle extras);
+ void notifySessionDestroyed();
// These callbacks are for the TransportController
- void onPlaybackStateChanged(in PlaybackState state);
- void onMetadataChanged(in MediaMetadata metadata);
- void onQueueChanged(in ParceledListSlice queue);
- void onQueueTitleChanged(CharSequence title);
- void onExtrasChanged(in Bundle extras);
- void onVolumeInfoChanged(in ParcelableVolumeInfo info);
+ void notifyPlaybackStateChanged(in PlaybackState state);
+ void notifyMetadataChanged(in MediaMetadata metadata);
+ void notifyQueueChanged(in List<MediaSession.QueueItem> queue);
+ void notifyQueueTitleChanged(CharSequence title);
+ void notifyExtrasChanged(in Bundle extras);
+ void notifyVolumeInfoChanged(in MediaController.PlaybackInfo info);
}
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index d6c226f8b6d0..46516e0f493b 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -17,12 +17,14 @@ package android.media.session;
import android.content.ComponentName;
import android.media.IRemoteVolumeController;
+import android.media.Session2Token;
import android.media.session.IActiveSessionsListener;
import android.media.session.ICallback;
import android.media.session.IOnMediaKeyListener;
import android.media.session.IOnVolumeKeyLongPressListener;
import android.media.session.ISession;
-import android.media.session.ISessionCallback;
+import android.media.session.ISession2TokensListener;
+import android.media.session.SessionCallbackLink;
import android.os.Bundle;
import android.view.KeyEvent;
@@ -31,8 +33,10 @@ import android.view.KeyEvent;
* @hide
*/
interface ISessionManager {
- ISession createSession(String packageName, in ISessionCallback cb, String tag, int userId);
+ ISession createSession(String packageName, in SessionCallbackLink cb, String tag, int userId);
+ void notifySession2Created(in Session2Token sessionToken);
List<IBinder> getSessions(in ComponentName compName, int userId);
+ List<Session2Token> getSession2Tokens(int userId);
void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent,
boolean needWakeLock);
void dispatchVolumeKeyEvent(String packageName, String opPackageName, boolean asSystemService,
@@ -42,6 +46,8 @@ interface ISessionManager {
void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName,
int userId);
void removeSessionsListener(in IActiveSessionsListener listener);
+ void addSession2TokensListener(in ISession2TokensListener listener, int userId);
+ void removeSession2TokensListener(in ISession2TokensListener listener);
// This is for the system volume UI only
void setRemoteVolumeController(in IRemoteVolumeController rvc);
@@ -53,6 +59,5 @@ interface ISessionManager {
void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener);
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
- // MediaSession2
boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid);
}
diff --git a/media/java/android/media/session/ParcelableVolumeInfo.aidl b/media/java/android/media/session/MediaController.aidl
index c4250f097fb4..17167f45d0e3 100644
--- a/media/java/android/media/session/ParcelableVolumeInfo.aidl
+++ b/media/java/android/media/session/MediaController.aidl
@@ -15,4 +15,4 @@
package android.media.session;
-parcelable ParcelableVolumeInfo;
+parcelable MediaController.PlaybackInfo;
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 181ee5327547..a1b8170cf4c3 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -21,17 +21,19 @@ import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.app.PendingIntent;
import android.content.Context;
-import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.VolumeProvider;
+import android.media.session.MediaSession.QueueItem;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.text.TextUtils;
@@ -70,7 +72,8 @@ public final class MediaController {
private final MediaSession.Token mToken;
private final Context mContext;
- private final CallbackStub mCbStub = new CallbackStub(this);
+ private final ControllerCallbackLink mCbStub =
+ new ControllerCallbackLink(new CallbackStub(this));
private final ArrayList<MessageHandler> mCallbacks = new ArrayList<MessageHandler>();
private final Object mLock = new Object();
@@ -249,10 +252,7 @@ public final class MediaController {
*/
public @Nullable List<MediaSession.QueueItem> getQueue() {
try {
- ParceledListSlice queue = mSessionBinder.getQueue();
- if (queue != null) {
- return queue.getList();
- }
+ return mSessionBinder.getQueue();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getQueue.", e);
}
@@ -327,10 +327,7 @@ public final class MediaController {
*/
public @Nullable PlaybackInfo getPlaybackInfo() {
try {
- ParcelableVolumeInfo result = mSessionBinder.getVolumeAttributes();
- return new PlaybackInfo(result.volumeType, result.audioAttrs, result.controlType,
- result.maxVolume, result.currentVolume);
-
+ return mSessionBinder.getVolumeAttributes();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getAudioInfo.", e);
}
@@ -986,15 +983,15 @@ public final class MediaController {
* Holds information about the current playback and how audio is handled for
* this session.
*/
- public static final class PlaybackInfo {
- /**
- * The session uses remote playback.
- */
- public static final int PLAYBACK_TYPE_REMOTE = 2;
+ public static final class PlaybackInfo implements Parcelable {
/**
* The session uses local playback.
*/
public static final int PLAYBACK_TYPE_LOCAL = 1;
+ /**
+ * The session uses remote playback.
+ */
+ public static final int PLAYBACK_TYPE_REMOTE = 2;
private final int mVolumeType;
private final int mVolumeControl;
@@ -1005,12 +1002,20 @@ public final class MediaController {
/**
* @hide
*/
- public PlaybackInfo(int type, AudioAttributes attrs, int control, int max, int current) {
+ public PlaybackInfo(int type, int control, int max, int current, AudioAttributes attrs) {
mVolumeType = type;
- mAudioAttrs = attrs;
mVolumeControl = control;
mMaxVolume = max;
mCurrentVolume = current;
+ mAudioAttrs = attrs;
+ }
+
+ PlaybackInfo(Parcel in) {
+ mVolumeType = in.readInt();
+ mVolumeControl = in.readInt();
+ mMaxVolume = in.readInt();
+ mCurrentVolume = in.readInt();
+ mAudioAttrs = in.readParcelable(null);
}
/**
@@ -1027,18 +1032,6 @@ public final class MediaController {
}
/**
- * Get the audio attributes for this session. The attributes will affect
- * volume handling for the session. When the volume type is
- * {@link PlaybackInfo#PLAYBACK_TYPE_REMOTE} these may be ignored by the
- * remote volume handler.
- *
- * @return The attributes for this session.
- */
- public AudioAttributes getAudioAttributes() {
- return mAudioAttrs;
- }
-
- /**
* Get the type of volume control that can be used. One of:
* <ul>
* <li>{@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}</li>
@@ -1070,12 +1063,58 @@ public final class MediaController {
public int getCurrentVolume() {
return mCurrentVolume;
}
+
+ /**
+ * Get the audio attributes for this session. The attributes will affect
+ * volume handling for the session. When the volume type is
+ * {@link PlaybackInfo#PLAYBACK_TYPE_REMOTE} these may be ignored by the
+ * remote volume handler.
+ *
+ * @return The attributes for this session.
+ */
+ public AudioAttributes getAudioAttributes() {
+ return mAudioAttrs;
+ }
+
+ @Override
+ public String toString() {
+ return "volumeType=" + mVolumeType + ", volumeControl=" + mVolumeControl
+ + ", maxVolume=" + mMaxVolume + ", currentVolume=" + mCurrentVolume
+ + ", audioAttrs=" + mAudioAttrs;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mVolumeType);
+ dest.writeInt(mVolumeControl);
+ dest.writeInt(mMaxVolume);
+ dest.writeInt(mCurrentVolume);
+ dest.writeParcelable(mAudioAttrs, flags);
+ }
+
+ public static final Parcelable.Creator<PlaybackInfo> CREATOR =
+ new Parcelable.Creator<PlaybackInfo>() {
+ @Override
+ public PlaybackInfo createFromParcel(Parcel in) {
+ return new PlaybackInfo(in);
+ }
+
+ @Override
+ public PlaybackInfo[] newArray(int size) {
+ return new PlaybackInfo[size];
+ }
+ };
}
- private final static class CallbackStub extends ISessionControllerCallback.Stub {
+ private static final class CallbackStub extends ControllerCallbackLink.CallbackStub {
private final WeakReference<MediaController> mController;
- public CallbackStub(MediaController controller) {
+ CallbackStub(MediaController controller) {
mController = new WeakReference<MediaController>(controller);
}
@@ -1112,9 +1151,7 @@ public final class MediaController {
}
@Override
- public void onQueueChanged(ParceledListSlice parceledQueue) {
- List<MediaSession.QueueItem> queue = parceledQueue == null ? null : parceledQueue
- .getList();
+ public void onQueueChanged(List<QueueItem> queue) {
MediaController controller = mController.get();
if (controller != null) {
controller.postMessage(MSG_UPDATE_QUEUE, queue, null);
@@ -1138,15 +1175,12 @@ public final class MediaController {
}
@Override
- public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) {
+ public void onVolumeInfoChanged(PlaybackInfo info) {
MediaController controller = mController.get();
if (controller != null) {
- PlaybackInfo info = new PlaybackInfo(pvi.volumeType, pvi.audioAttrs,
- pvi.controlType, pvi.maxVolume, pvi.currentVolume);
controller.postMessage(MSG_UPDATE_VOLUME, info, null);
}
}
-
}
private final static class MessageHandler extends Handler {
@@ -1154,7 +1188,7 @@ public final class MediaController {
private boolean mRegistered = false;
public MessageHandler(Looper looper, MediaController.Callback cb) {
- super(looper, null, true);
+ super(looper);
mCallback = cb;
}
@@ -1193,6 +1227,7 @@ public final class MediaController {
public void post(int what, Object obj, Bundle data) {
Message msg = obtainMessage(what, obj);
+ msg.setAsynchronous(true);
msg.setData(data);
msg.sendToTarget();
}
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index 8962bb7fb4c4..e07cf15d11c9 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -24,7 +24,6 @@ import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes;
import android.media.MediaDescription;
import android.media.MediaMetadata;
@@ -130,7 +129,7 @@ public final class MediaSession {
private final MediaSession.Token mSessionToken;
private final MediaController mController;
private final ISession mBinder;
- private final CallbackStub mCbStub;
+ private final SessionCallbackLink mCbStub;
// Do not change the name of mCallback. Support lib accesses this by using reflection.
@UnsupportedAppUsage
@@ -173,7 +172,7 @@ public final class MediaSession {
}
mMaxBitmapSize = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.config_mediaMetadataBitmapMaxSize);
- mCbStub = new CallbackStub(this);
+ mCbStub = new SessionCallbackLink(new CallbackStub(this));
MediaSessionManager manager = (MediaSessionManager) context
.getSystemService(Context.MEDIA_SESSION_SERVICE);
try {
@@ -467,7 +466,7 @@ public final class MediaSession {
*/
public void setQueue(@Nullable List<QueueItem> queue) {
try {
- mBinder.setQueue(queue == null ? null : new ParceledListSlice<QueueItem>(queue));
+ mBinder.setQueue(queue);
} catch (RemoteException e) {
Log.wtf("Dead object in setQueue.", e);
}
@@ -1063,7 +1062,7 @@ public final class MediaSession {
/**
* @hide
*/
- public static class CallbackStub extends ISessionCallback.Stub {
+ public static final class CallbackStub extends SessionCallbackLink.CallbackStub {
private WeakReference<MediaSession> mMediaSession;
public CallbackStub(MediaSession session) {
@@ -1071,14 +1070,14 @@ public final class MediaSession {
}
private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
return new RemoteUserInfo(packageName, pid, uid,
- caller != null ? caller.asBinder() : null);
+ caller != null ? caller.getBinder() : null);
}
@Override
public void onCommand(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) {
+ ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchCommand(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1104,7 +1103,7 @@ public final class MediaSession {
@Override
public void onMediaButtonFromController(String packageName, int pid, int uid,
- ISessionControllerCallback caller, Intent mediaButtonIntent) {
+ ControllerCallbackLink caller, Intent mediaButtonIntent) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1114,7 +1113,7 @@ public final class MediaSession {
@Override
public void onPrepare(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1123,7 +1122,7 @@ public final class MediaSession {
@Override
public void onPrepareFromMediaId(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String mediaId,
+ ControllerCallbackLink caller, String mediaId,
Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
@@ -1134,7 +1133,7 @@ public final class MediaSession {
@Override
public void onPrepareFromSearch(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String query,
+ ControllerCallbackLink caller, String query,
Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
@@ -1145,7 +1144,7 @@ public final class MediaSession {
@Override
public void onPrepareFromUri(String packageName, int pid, int uid,
- ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPrepareFromUri(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1155,7 +1154,7 @@ public final class MediaSession {
@Override
public void onPlay(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPlay(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1164,7 +1163,7 @@ public final class MediaSession {
@Override
public void onPlayFromMediaId(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String mediaId,
+ ControllerCallbackLink caller, String mediaId,
Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
@@ -1175,7 +1174,7 @@ public final class MediaSession {
@Override
public void onPlayFromSearch(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String query,
+ ControllerCallbackLink caller, String query,
Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
@@ -1186,7 +1185,7 @@ public final class MediaSession {
@Override
public void onPlayFromUri(String packageName, int pid, int uid,
- ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPlayFromUri(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1196,7 +1195,7 @@ public final class MediaSession {
@Override
public void onSkipToTrack(String packageName, int pid, int uid,
- ISessionControllerCallback caller, long id) {
+ ControllerCallbackLink caller, long id) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchSkipToItem(createRemoteUserInfo(packageName, pid, uid, caller), id);
@@ -1205,7 +1204,7 @@ public final class MediaSession {
@Override
public void onPause(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPause(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1214,7 +1213,7 @@ public final class MediaSession {
@Override
public void onStop(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchStop(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1223,7 +1222,7 @@ public final class MediaSession {
@Override
public void onNext(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchNext(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1232,7 +1231,7 @@ public final class MediaSession {
@Override
public void onPrevious(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1241,7 +1240,7 @@ public final class MediaSession {
@Override
public void onFastForward(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchFastForward(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1250,7 +1249,7 @@ public final class MediaSession {
@Override
public void onRewind(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchRewind(createRemoteUserInfo(packageName, pid, uid, caller));
@@ -1259,7 +1258,7 @@ public final class MediaSession {
@Override
public void onSeekTo(String packageName, int pid, int uid,
- ISessionControllerCallback caller, long pos) {
+ ControllerCallbackLink caller, long pos) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchSeekTo(createRemoteUserInfo(packageName, pid, uid, caller), pos);
@@ -1267,7 +1266,7 @@ public final class MediaSession {
}
@Override
- public void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ public void onRate(String packageName, int pid, int uid, ControllerCallbackLink caller,
Rating rating) {
MediaSession session = mMediaSession.get();
if (session != null) {
@@ -1277,7 +1276,7 @@ public final class MediaSession {
@Override
public void onCustomAction(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String action, Bundle args) {
+ ControllerCallbackLink caller, String action, Bundle args) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchCustomAction(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1287,7 +1286,7 @@ public final class MediaSession {
@Override
public void onAdjustVolume(String packageName, int pid, int uid,
- ISessionControllerCallback caller, int direction) {
+ ControllerCallbackLink caller, int direction) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchAdjustVolume(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1297,7 +1296,7 @@ public final class MediaSession {
@Override
public void onSetVolumeTo(String packageName, int pid, int uid,
- ISessionControllerCallback caller, int value) {
+ ControllerCallbackLink caller, int value) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchSetVolumeTo(createRemoteUserInfo(packageName, pid, uid, caller),
@@ -1453,7 +1452,7 @@ public final class MediaSession {
private RemoteUserInfo mCurrentControllerInfo;
public CallbackMessageHandler(Looper looper, MediaSession.Callback callback) {
- super(looper, null, true);
+ super(looper);
mCallback = callback;
mCallback.mHandler = this;
}
@@ -1461,6 +1460,7 @@ public final class MediaSession {
public void post(RemoteUserInfo caller, int what, Object obj, Bundle data, long delayMs) {
Pair<RemoteUserInfo, Object> objWithCaller = Pair.create(caller, obj);
Message msg = obtainMessage(what, objWithCaller);
+ msg.setAsynchronous(true);
msg.setData(data);
if (delayMs > 0) {
sendMessageDelayed(msg, delayMs);
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 4221d66edb99..4596c22985c9 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -26,6 +26,8 @@ import android.content.ComponentName;
import android.content.Context;
import android.media.AudioManager;
import android.media.IRemoteVolumeController;
+import android.media.MediaSession2;
+import android.media.Session2Token;
import android.media.browse.MediaBrowser;
import android.os.Handler;
import android.os.IBinder;
@@ -39,6 +41,8 @@ import android.util.ArrayMap;
import android.util.Log;
import android.view.KeyEvent;
+import com.android.internal.annotations.GuardedBy;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -67,9 +71,13 @@ public final class MediaSessionManager {
*/
public static final int RESULT_MEDIA_KEY_HANDLED = 1;
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
private final ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper> mListeners
= new ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper>();
- private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private final ArrayMap<OnSession2TokensChangedListener, Session2TokensChangedWrapper>
+ mSession2TokensListeners = new ArrayMap<>();
private final ISessionManager mService;
private Context mContext;
@@ -96,12 +104,36 @@ public final class MediaSessionManager {
* @return The binder object from the system
* @hide
*/
- public @NonNull ISession createSession(@NonNull MediaSession.CallbackStub cbStub,
+ public @NonNull ISession createSession(@NonNull SessionCallbackLink cbStub,
@NonNull String tag, int userId) throws RemoteException {
return mService.createSession(mContext.getPackageName(), cbStub, tag, userId);
}
/**
+ * Notifies that a new {@link MediaSession2} with type {@link Session2Token#TYPE_SESSION} is
+ * created.
+ * <p>
+ * Do not use this API directly, but create a new instance through the
+ * {@link MediaSession2.Builder} instead.
+ *
+ * @param token newly created session2 token
+ * @hide
+ */
+ public void notifySession2Created(@NonNull Session2Token token) {
+ if (token == null) {
+ throw new IllegalArgumentException("token shouldn't be null");
+ }
+ if (token.getType() != Session2Token.TYPE_SESSION) {
+ throw new IllegalArgumentException("token's type should be TYPE_SESSION");
+ }
+ try {
+ mService.notifySession2Created(token);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Get a list of controllers for all ongoing sessions. The controllers will
* be provided in priority order with the most important controller at index
* 0.
@@ -153,6 +185,44 @@ public final class MediaSessionManager {
}
/**
+ * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the
+ * current user.
+ * <p>
+ * Although this API can be used without any restriction, each session owners can accept or
+ * reject your uses of {@link MediaSession2}.
+ *
+ * @return A list of {@link Session2Token}.
+ * @hide
+ */
+ // TODO: unhide
+ @NonNull
+ public List<Session2Token> getSession2Tokens() {
+ return getSession2Tokens(UserHandle.myUserId());
+ }
+
+ /**
+ * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the
+ * given user.
+ * <p>
+ * If you want to get tokens for another user, you must hold the
+ * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
+ *
+ * @param userId The user id to fetch sessions for.
+ * @return A list of {@link Session2Token}
+ * @hide
+ */
+ // TODO: unhide
+ @NonNull
+ public List<Session2Token> getSession2Tokens(int userId) {
+ try {
+ return mService.getSession2Tokens(userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to get session tokens", e);
+ }
+ return new ArrayList<>();
+ }
+
+ /**
* Add a listener to be notified when the list of active sessions
* changes.This requires the
* android.Manifest.permission.MEDIA_CONTENT_CONTROL permission be held by
@@ -260,6 +330,87 @@ public final class MediaSessionManager {
}
/**
+ * Adds a listener to be notified when the {@link #getSession2Tokens()} changes.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
+ * for consistent behavior across all devices.
+ *
+ * @param listener The listener to add
+ * @param handler The handler to call listener on. If {@code null}, calling thread's looper will
+ * be used.
+ * @hide
+ */
+ // TODO(jaewan): Unhide
+ public void addOnSession2TokensChangedListener(
+ @NonNull OnSession2TokensChangedListener listener, @Nullable Handler handler) {
+ addOnSession2TokensChangedListener(UserHandle.myUserId(), listener, handler);
+ }
+
+ /**
+ * Adds a listener to be notified when the {@link #getSession2Tokens()} changes.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
+ * for consistent behavior across all devices.
+ *
+ * @param userId The userId to listen for changes on
+ * @param listener The listener to add
+ * @param handler The handler to call listener on. If {@code null}, calling thread's looper will
+ * be used.
+ * @hide
+ */
+ public void addOnSession2TokensChangedListener(int userId,
+ @NonNull OnSession2TokensChangedListener listener, @Nullable Handler handler) {
+ if (listener == null) {
+ throw new IllegalArgumentException("listener shouldn't be null");
+ }
+ synchronized (mLock) {
+ if (mSession2TokensListeners.get(listener) != null) {
+ Log.w(TAG, "Attempted to add session listener twice, ignoring.");
+ return;
+ }
+ Session2TokensChangedWrapper wrapper =
+ new Session2TokensChangedWrapper(listener, handler);
+ try {
+ mService.addSession2TokensListener(wrapper.getStub(), userId);
+ mSession2TokensListeners.put(listener, wrapper);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error in addSessionTokensListener.", e);
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Removes the {@link OnSession2TokensChangedListener} to stop receiving session token updates.
+ *
+ * @param listener The listener to remove.
+ * @hide
+ */
+ // TODO(jaewan): Unhide
+ public void removeOnSession2TokensChangedListener(
+ @NonNull OnSession2TokensChangedListener listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("listener may not be null");
+ }
+ final Session2TokensChangedWrapper wrapper;
+ synchronized (mLock) {
+ wrapper = mSession2TokensListeners.remove(listener);
+ }
+ if (wrapper != null) {
+ try {
+ mService.removeSession2TokensListener(wrapper.getStub());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error in removeSessionTokensListener.", e);
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
* Set the remote volume controller to receive volume updates on. Only for
* use by system UI.
*
@@ -526,6 +677,26 @@ public final class MediaSessionManager {
}
/**
+ * Listens for changes to the {@link #getSession2Tokens()}. This can be added
+ * using {@link #addOnSession2TokensChangedListener(OnSession2TokensChangedListener, Handler)}.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
+ * for consistent behavior across all devices.
+ *
+ * @hide
+ */
+ public interface OnSession2TokensChangedListener {
+ /**
+ * Called when the {@link #getSession2Tokens()} is changed.
+ *
+ * @param tokens list of {@link Session2Token}
+ */
+ void onSession2TokensChanged(@NonNull List<Session2Token> tokens);
+ }
+
+ /**
* Listens the volume key long-presses.
* @hide
*/
@@ -743,6 +914,27 @@ public final class MediaSessionManager {
}
}
+ private static final class Session2TokensChangedWrapper {
+ private final OnSession2TokensChangedListener mListener;
+ private final Handler mHandler;
+ private final ISession2TokensListener.Stub mStub =
+ new ISession2TokensListener.Stub() {
+ @Override
+ public void onSession2TokensChanged(final List<Session2Token> tokens) {
+ mHandler.post(() -> mListener.onSession2TokensChanged(tokens));
+ }
+ };
+
+ Session2TokensChangedWrapper(OnSession2TokensChangedListener listener, Handler handler) {
+ mListener = listener;
+ mHandler = (handler == null) ? new Handler() : new Handler(handler.getLooper());
+ }
+
+ public ISession2TokensListener.Stub getStub() {
+ return mStub;
+ }
+ }
+
private static final class OnVolumeKeyLongPressListenerImpl
extends IOnVolumeKeyLongPressListener.Stub {
private OnVolumeKeyLongPressListener mListener;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java b/media/java/android/media/session/MediaSessionProviderService.java
index 065222762b33..9a346ff4a12e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java
+++ b/media/java/android/media/session/MediaSessionProviderService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2019 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.
@@ -14,21 +14,22 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package android.media.session;
-import com.android.internal.statusbar.StatusBarIcon;
-
-import java.util.ArrayList;
-import java.util.List;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
/**
- * Holds an array of {@link com.android.internal.statusbar.StatusBarIcon}s and draws them
- * in a linear layout
+ * Abstract class for mainline module services.
+ *
+ * @hide // TODO: Make it as a @SystemApi
*/
-public class StatusBarIconContainer {
- private final List<StatusBarIcon> mIcons = new ArrayList<>();
+public abstract class MediaSessionProviderService extends Service {
- public StatusBarIconContainer(List<StatusBarIcon> icons) {
- mIcons.addAll(icons);
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO: Return IMediaSessionProviderService.Stub()
+ return null;
}
}
diff --git a/media/java/android/media/session/ParcelableVolumeInfo.java b/media/java/android/media/session/ParcelableVolumeInfo.java
deleted file mode 100644
index f59c9756d466..000000000000
--- a/media/java/android/media/session/ParcelableVolumeInfo.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Copyright 2014, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-
-package android.media.session;
-
-import android.media.AudioAttributes;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Convenience class for passing information about the audio configuration of a
- * session. The public implementation is {@link MediaController.PlaybackInfo}.
- *
- * @hide
- */
-public class ParcelableVolumeInfo implements Parcelable {
- public int volumeType;
- public AudioAttributes audioAttrs;
- public int controlType;
- public int maxVolume;
- public int currentVolume;
-
- public ParcelableVolumeInfo(int volumeType, AudioAttributes audioAttrs, int controlType,
- int maxVolume,
- int currentVolume) {
- this.volumeType = volumeType;
- this.audioAttrs = audioAttrs;
- this.controlType = controlType;
- this.maxVolume = maxVolume;
- this.currentVolume = currentVolume;
- }
-
- public ParcelableVolumeInfo(Parcel from) {
- volumeType = from.readInt();
- controlType = from.readInt();
- maxVolume = from.readInt();
- currentVolume = from.readInt();
- audioAttrs = AudioAttributes.CREATOR.createFromParcel(from);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(volumeType);
- dest.writeInt(controlType);
- dest.writeInt(maxVolume);
- dest.writeInt(currentVolume);
- audioAttrs.writeToParcel(dest, flags);
- }
-
-
- public static final Parcelable.Creator<ParcelableVolumeInfo> CREATOR
- = new Parcelable.Creator<ParcelableVolumeInfo>() {
- @Override
- public ParcelableVolumeInfo createFromParcel(Parcel in) {
- return new ParcelableVolumeInfo(in);
- }
-
- @Override
- public ParcelableVolumeInfo[] newArray(int size) {
- return new ParcelableVolumeInfo[size];
- }
- };
-}
diff --git a/media/java/android/media/session/SessionCallbackLink.aidl b/media/java/android/media/session/SessionCallbackLink.aidl
new file mode 100644
index 000000000000..c489e5bee6e2
--- /dev/null
+++ b/media/java/android/media/session/SessionCallbackLink.aidl
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.session;
+
+parcelable SessionCallbackLink;
diff --git a/media/java/android/media/session/SessionCallbackLink.java b/media/java/android/media/session/SessionCallbackLink.java
new file mode 100644
index 000000000000..7547bffa3b18
--- /dev/null
+++ b/media/java/android/media/session/SessionCallbackLink.java
@@ -0,0 +1,776 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Intent;
+import android.media.Rating;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+
+/**
+ * Handles incoming commands to {@link MediaSession.Callback}.
+ * <p>
+ * This API is not generally intended for third party application developers.
+ */
+public final class SessionCallbackLink implements Parcelable {
+ final CallbackStub mCallbackStub;
+ final ISessionCallback mISessionCallback;
+
+ /**
+ * Constructor for stub (Callee)
+ */
+ SessionCallbackLink(@NonNull CallbackStub callbackStub) {
+ mCallbackStub = callbackStub;
+ mISessionCallback = new CallbackStubProxy();
+ }
+
+ /**
+ * Constructor for interface (Caller)
+ */
+ SessionCallbackLink(Parcel in) {
+ mCallbackStub = null;
+ mISessionCallback = ISessionCallback.Stub.asInterface(in.readStrongBinder());
+ }
+
+ /**
+ * Notify session that a controller sends a command.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param command the name of the command
+ * @param args the arguments included with the command
+ * @param cb the result receiver for getting the result of the command
+ */
+ public void notifyCommand(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String command,
+ @Nullable Bundle args, @Nullable ResultReceiver cb) {
+ try {
+ mISessionCallback.notifyCommand(packageName, pid, uid, caller, command, args, cb);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that the android system sends a media button event.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param mediaButtonIntent the media button intent
+ * @param sequenceNumber the sequence number of this call
+ * @param cb the result receiver for getting the result of the command
+ */
+ public void notifyMediaButton(@NonNull String packageName, int pid, int uid,
+ @NonNull Intent mediaButtonIntent, int sequenceNumber,
+ @Nullable ResultReceiver cb) {
+ try {
+ mISessionCallback.notifyMediaButton(packageName, pid, uid, mediaButtonIntent,
+ sequenceNumber, cb);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller sends a media button event.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param mediaButtonIntent the media button intent
+ */
+ public void notifyMediaButtonFromController(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Intent mediaButtonIntent) {
+ try {
+ mISessionCallback.notifyMediaButtonFromController(packageName, pid, uid, caller,
+ mediaButtonIntent);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests preparing media.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyPrepare(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyPrepare(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests preparing media from given media ID.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param mediaId the ID of the media
+ * @param extras the extras included with this request.
+ */
+ public void notifyPrepareFromMediaId(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
+ @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPrepareFromMediaId(packageName, pid, uid, caller, mediaId,
+ extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests preparing media from given search query.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param query the search query
+ * @param extras the extras included with this request.
+ */
+ public void notifyPrepareFromSearch(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String query,
+ @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPrepareFromSearch(packageName, pid, uid, caller, query, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests preparing media from given uri.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param uri the uri of the media
+ * @param extras the extras included with this request.
+ */
+ public void notifyPrepareFromUri(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPrepareFromUri(packageName, pid, uid, caller, uri, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests playing media.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyPlay(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyPlay(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests playing media from given media ID.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param mediaId the ID of the media
+ * @param extras the extras included with this request.
+ */
+ public void notifyPlayFromMediaId(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
+ @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests playing media from given search query.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param query the search query
+ * @param extras the extras included with this request.
+ */
+ public void notifyPlayFromSearch(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String query,
+ @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPlayFromSearch(packageName, pid, uid, caller, query, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests playing media from given uri.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param uri the uri of the media
+ * @param extras the extras included with this request.
+ */
+ public void notifyPlayFromUri(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
+ try {
+ mISessionCallback.notifyPlayFromUri(packageName, pid, uid, caller, uri, extras);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests skipping to the queue item with given ID.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param id the queue id of the item
+ */
+ public void notifySkipToTrack(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, long id) {
+ try {
+ mISessionCallback.notifySkipToTrack(packageName, pid, uid, caller, id);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests pausing media.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyPause(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyPause(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests stopping media.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyStop(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyStop(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests skipping to the next queue item.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyNext(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyNext(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests skipping to the previous queue item.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyPrevious(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyPrevious(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests fast-forwarding.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyFastForward(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyFastForward(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests rewinding.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ */
+ public void notifyRewind(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ try {
+ mISessionCallback.notifyRewind(packageName, pid, uid, caller);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests seeking to the specific position.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param pos the position to move to, in milliseconds
+ */
+ public void notifySeekTo(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, long pos) {
+ try {
+ mISessionCallback.notifySeekTo(packageName, pid, uid, caller, pos);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests rating of the current media.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param rating the rating of the current media
+ */
+ public void notifyRate(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Rating rating) {
+ try {
+ mISessionCallback.notifyRate(packageName, pid, uid, caller, rating);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller sends a custom action.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param action the name of the action
+ * @param args the arguments included with this action
+ */
+ public void notifyCustomAction(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String action, @Nullable Bundle args) {
+ try {
+ mISessionCallback.notifyCustomAction(packageName, pid, uid, caller, action, args);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests adjusting volume.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param direction the direction of the volume change.
+ */
+ public void notifyAdjustVolume(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, int direction) {
+ try {
+ mISessionCallback.notifyAdjustVolume(packageName, pid, uid, caller, direction);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Notify session that a controller requests setting volume.
+ *
+ * @param packageName the package name of the controller
+ * @param pid the pid of the controller
+ * @param uid the uid of the controller
+ * @param caller the {@link ControllerCallbackLink} of the controller
+ * @param value the volume value to set
+ */
+ public void notifySetVolumeTo(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, int value) {
+ try {
+ mISessionCallback.notifySetVolumeTo(packageName, pid, uid, caller, value);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /** Gets the binder */
+ @NonNull
+ public IBinder getBinder() {
+ return mISessionCallback.asBinder();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeStrongBinder(mISessionCallback.asBinder());
+ }
+
+ public static final Parcelable.Creator<SessionCallbackLink> CREATOR =
+ new Parcelable.Creator<SessionCallbackLink>() {
+ @Override
+ public SessionCallbackLink createFromParcel(Parcel in) {
+ return new SessionCallbackLink(in);
+ }
+
+ @Override
+ public SessionCallbackLink[] newArray(int size) {
+ return new SessionCallbackLink[size];
+ }
+ };
+
+ /**
+ * Class for Stub implementation
+ */
+ abstract static class CallbackStub {
+ /** Stub method for ISessionCallback.notifyCommand */
+ public void onCommand(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String command,
+ @Nullable Bundle args, @Nullable ResultReceiver cb) {
+ }
+
+ /** Stub method for ISessionCallback.notifyMediaButton */
+ public void onMediaButton(@NonNull String packageName, int pid, int uid,
+ @NonNull Intent mediaButtonIntent, int sequenceNumber,
+ @Nullable ResultReceiver cb) {
+ }
+
+ /** Stub method for ISessionCallback.notifyMediaButtonFromController */
+ public void onMediaButtonFromController(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Intent mediaButtonIntent) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPrepare */
+ public void onPrepare(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPrepareFromMediaId */
+ public void onPrepareFromMediaId(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
+ @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPrepareFromSearch */
+ public void onPrepareFromSearch(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPrepareFromUri */
+ public void onPrepareFromUri(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPlay */
+ public void onPlay(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPlayFromMediaId */
+ public void onPlayFromMediaId(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
+ @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPlayFromSearch */
+ public void onPlayFromSearch(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPlayFromUri */
+ public void onPlayFromUri(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
+ }
+
+ /** Stub method for ISessionCallback.notifySkipToTrack */
+ public void onSkipToTrack(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, long id) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPause */
+ public void onPause(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyStop */
+ public void onStop(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyNext */
+ public void onNext(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyPrevious */
+ public void onPrevious(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyFastForward */
+ public void onFastForward(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifyRewind */
+ public void onRewind(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller) {
+ }
+
+ /** Stub method for ISessionCallback.notifySeekTo */
+ public void onSeekTo(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, long pos) {
+ }
+
+ /** Stub method for ISessionCallback.notifyRate */
+ public void onRate(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull Rating rating) {
+ }
+
+ /** Stub method for ISessionCallback.notifyCustomAction */
+ public void onCustomAction(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, @NonNull String action,
+ @Nullable Bundle args) {
+ }
+
+ /** Stub method for ISessionCallback.notifyAdjustVolume */
+ public void onAdjustVolume(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, int direction) {
+ }
+
+ /** Stub method for ISessionCallback.notifySetVolumeTo */
+ public void onSetVolumeTo(@NonNull String packageName, int pid, int uid,
+ @NonNull ControllerCallbackLink caller, int value) {
+ }
+ }
+
+ private class CallbackStubProxy extends ISessionCallback.Stub {
+ @Override
+ public void notifyCommand(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
+ mCallbackStub.onCommand(packageName, pid, uid, caller, command, args, cb);
+ }
+
+ @Override
+ public void notifyMediaButton(String packageName, int pid, int uid,
+ Intent mediaButtonIntent, int sequenceNumber, ResultReceiver cb) {
+ mCallbackStub.onMediaButton(packageName, pid, uid, mediaButtonIntent, sequenceNumber,
+ cb);
+ }
+
+ @Override
+ public void notifyMediaButtonFromController(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, Intent mediaButtonIntent) {
+ mCallbackStub.onMediaButtonFromController(packageName, pid, uid, caller,
+ mediaButtonIntent);
+ }
+
+ @Override
+ public void notifyPrepare(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onPrepare(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyPrepareFromMediaId(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String mediaId, Bundle extras) {
+ mCallbackStub.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ }
+
+ @Override
+ public void notifyPrepareFromSearch(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String query, Bundle extras) {
+ mCallbackStub.onPrepareFromSearch(packageName, pid, uid, caller, query, extras);
+ }
+
+ @Override
+ public void notifyPrepareFromUri(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
+ mCallbackStub.onPrepareFromUri(packageName, pid, uid, caller, uri, extras);
+ }
+
+ @Override
+ public void notifyPlay(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onPlay(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyPlayFromMediaId(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String mediaId, Bundle extras) {
+ mCallbackStub.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ }
+
+ @Override
+ public void notifyPlayFromSearch(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String query, Bundle extras) {
+ mCallbackStub.onPlayFromSearch(packageName, pid, uid, caller, query, extras);
+ }
+
+ @Override
+ public void notifyPlayFromUri(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
+ mCallbackStub.onPlayFromUri(packageName, pid, uid, caller, uri, extras);
+ }
+
+ @Override
+ public void notifySkipToTrack(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, long id) {
+ mCallbackStub.onSkipToTrack(packageName, pid, uid, caller, id);
+ }
+
+ @Override
+ public void notifyPause(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onPause(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyStop(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onStop(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyNext(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onNext(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyPrevious(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onPrevious(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyFastForward(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onFastForward(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifyRewind(String packageName, int pid, int uid,
+ ControllerCallbackLink caller) {
+ mCallbackStub.onRewind(packageName, pid, uid, caller);
+ }
+
+ @Override
+ public void notifySeekTo(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, long pos) {
+ mCallbackStub.onSeekTo(packageName, pid, uid, caller, pos);
+ }
+
+ @Override
+ public void notifyRate(String packageName, int pid, int uid, ControllerCallbackLink caller,
+ Rating rating) {
+ mCallbackStub.onRate(packageName, pid, uid, caller, rating);
+ }
+
+ @Override
+ public void notifyCustomAction(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, String action, Bundle args) {
+ mCallbackStub.onCustomAction(packageName, pid, uid, caller, action, args);
+ }
+
+ @Override
+ public void notifyAdjustVolume(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, int direction) {
+ mCallbackStub.onAdjustVolume(packageName, pid, uid, caller, direction);
+ }
+
+ @Override
+ public void notifySetVolumeTo(String packageName, int pid, int uid,
+ ControllerCallbackLink caller, int value) {
+ mCallbackStub.onSetVolumeTo(packageName, pid, uid, caller, value);
+ }
+ }
+}
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index fa69062c34df..ada77c53bb34 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -372,6 +372,7 @@ public final class SoundTriggerManager {
* @hide
*/
@RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
+ @UnsupportedAppUsage
public int getModelState(UUID soundModelId) {
if (soundModelId == null) {
return STATUS_ERROR;
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 36a5f063fcbb..d7048ce180ca 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -34,7 +34,6 @@ cc_library_shared {
"libutils",
"libbinder",
"libmedia",
- "libmediaextractor",
"libmedia_omx",
"libmediametrics",
"libmediadrm",
@@ -102,7 +101,6 @@ cc_library_shared {
"libhidlbase",
"libhidlmemory",
- "libpowermanager", // Used by JWakeLock. Will be replace with public SDJ API.
"libmediametrics", // Used by MediaMetrics. Will be replaced with stable C API.
"libbinder", // Used by JWakeLock and MediaMetrics.
@@ -111,6 +109,7 @@ cc_library_shared {
// NDK or NDK-compliant
"libandroid",
+ "libbinder_ndk",
"libmediandk",
"libnativehelper_compat_libc++",
"liblog",
@@ -122,7 +121,10 @@ cc_library_shared {
"libmediaplayerservice",
],
- header_libs: ["libhardware_headers"],
+ header_libs: [
+ "libhardware_headers",
+ "libnativewindow_headers",
+ ],
static_libs: [
"libbase",
@@ -130,12 +132,12 @@ cc_library_shared {
"libcutils",
"libmedia_helper",
"libmedia_player2_util",
- "libmediaextractor",
"libmediaplayer2",
"libmediaplayer2-protos",
"libmediandk_utils",
"libmediautils",
"libprotobuf-cpp-lite",
+ "libstagefright",
"libstagefright_esds",
"libstagefright_foundation",
"libstagefright_httplive",
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 257860890437..406f9dd94bb4 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -72,7 +72,10 @@ static struct CryptoErrorCodes {
jint cryptoErrorResourceBusy;
jint cryptoErrorInsufficientOutputProtection;
jint cryptoErrorSessionNotOpened;
+ jint cryptoErrorInsufficientSecurity;
jint cryptoErrorUnsupportedOperation;
+ jint cryptoErrorFrameTooLarge;
+ jint cryptoErrorLostState;
} gCryptoErrorCodes;
static struct CodecActionCodes {
@@ -645,7 +648,6 @@ static jobject getCodecCapabilitiesObject(
capabilities->getSupportedColorFormats(&colorFormats);
capabilities->getSupportedProfileLevels(&profileLevels);
- uint32_t flags = capabilities->getFlags();
sp<AMessage> details = capabilities->getDetails();
jobject defaultFormatObj = NULL;
@@ -684,7 +686,7 @@ static jobject getCodecCapabilitiesObject(
return env->NewObject(
gCodecInfo.capsClazz, gCodecInfo.capsCtorId,
- profileLevelArray.get(), colorFormatsArray.get(), isEncoder, flags,
+ profileLevelArray.get(), colorFormatsArray.get(), isEncoder,
defaultFormatRef.get(), detailsRef.get());
}
@@ -697,23 +699,28 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const
return err;
}
+ // TODO: get alias
ScopedLocalRef<jstring> nameObject(env,
env->NewStringUTF(codecInfo->getCodecName()));
+ ScopedLocalRef<jstring> canonicalNameObject(env,
+ env->NewStringUTF(codecInfo->getCodecName()));
+
+ MediaCodecInfo::Attributes attributes = codecInfo->getAttributes();
bool isEncoder = codecInfo->isEncoder();
- Vector<AString> mimes;
- codecInfo->getSupportedMimes(&mimes);
+ Vector<AString> mediaTypes;
+ codecInfo->getSupportedMediaTypes(&mediaTypes);
ScopedLocalRef<jobjectArray> capsArrayObj(env,
- env->NewObjectArray(mimes.size(), gCodecInfo.capsClazz, NULL));
+ env->NewObjectArray(mediaTypes.size(), gCodecInfo.capsClazz, NULL));
- for (size_t i = 0; i < mimes.size(); i++) {
+ for (size_t i = 0; i < mediaTypes.size(); i++) {
const sp<MediaCodecInfo::Capabilities> caps =
- codecInfo->getCapabilitiesFor(mimes[i].c_str());
+ codecInfo->getCapabilitiesFor(mediaTypes[i].c_str());
ScopedLocalRef<jobject> capsObj(env, getCodecCapabilitiesObject(
- env, mimes[i].c_str(), isEncoder, caps));
+ env, mediaTypes[i].c_str(), isEncoder, caps));
env->SetObjectArrayElement(capsArrayObj.get(), i, capsObj.get());
}
@@ -723,10 +730,10 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const
CHECK(codecInfoClazz.get() != NULL);
jmethodID codecInfoCtorID = env->GetMethodID(codecInfoClazz.get(), "<init>",
- "(Ljava/lang/String;Z[Landroid/media/MediaCodecInfo$CodecCapabilities;)V");
+ "(Ljava/lang/String;Ljava/lang/String;I[Landroid/media/MediaCodecInfo$CodecCapabilities;)V");
*codecInfoObject = env->NewObject(codecInfoClazz.get(), codecInfoCtorID,
- nameObject.get(), isEncoder, capsArrayObj.get());
+ nameObject.get(), canonicalNameObject.get(), attributes, capsArrayObj.get());
return OK;
}
@@ -1005,10 +1012,22 @@ static void throwCryptoException(JNIEnv *env, status_t err, const char *msg) {
err = gCryptoErrorCodes.cryptoErrorSessionNotOpened;
defaultMsg = "Attempted to use a closed session";
break;
+ case ERROR_DRM_INSUFFICIENT_SECURITY:
+ err = gCryptoErrorCodes.cryptoErrorInsufficientSecurity;
+ defaultMsg = "Required security level is not met";
+ break;
case ERROR_DRM_CANNOT_HANDLE:
err = gCryptoErrorCodes.cryptoErrorUnsupportedOperation;
defaultMsg = "Operation not supported in this configuration";
break;
+ case ERROR_DRM_FRAME_TOO_LARGE:
+ err = gCryptoErrorCodes.cryptoErrorFrameTooLarge;
+ defaultMsg = "Decrytped frame exceeds size of output buffer";
+ break;
+ case ERROR_DRM_SESSION_LOST_STATE:
+ err = gCryptoErrorCodes.cryptoErrorLostState;
+ defaultMsg = "Session state was lost, open a new session and retry";
+ break;
default: /* Other negative DRM error codes go out as is. */
break;
}
@@ -1994,11 +2013,26 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) {
gCryptoErrorCodes.cryptoErrorSessionNotOpened =
env->GetStaticIntField(clazz.get(), field);
+ field = env->GetStaticFieldID(clazz.get(), "ERROR_INSUFFICIENT_SECURITY", "I");
+ CHECK(field != NULL);
+ gCryptoErrorCodes.cryptoErrorInsufficientSecurity =
+ env->GetStaticIntField(clazz.get(), field);
+
field = env->GetStaticFieldID(clazz.get(), "ERROR_UNSUPPORTED_OPERATION", "I");
CHECK(field != NULL);
gCryptoErrorCodes.cryptoErrorUnsupportedOperation =
env->GetStaticIntField(clazz.get(), field);
+ field = env->GetStaticFieldID(clazz.get(), "ERROR_FRAME_TOO_LARGE", "I");
+ CHECK(field != NULL);
+ gCryptoErrorCodes.cryptoErrorFrameTooLarge =
+ env->GetStaticIntField(clazz.get(), field);
+
+ field = env->GetStaticFieldID(clazz.get(), "ERROR_LOST_STATE", "I");
+ CHECK(field != NULL);
+ gCryptoErrorCodes.cryptoErrorLostState =
+ env->GetStaticIntField(clazz.get(), field);
+
clazz.reset(env->FindClass("android/media/MediaCodec$CodecException"));
CHECK(clazz.get() != NULL);
field = env->GetStaticFieldID(clazz.get(), "ACTION_TRANSIENT", "I");
@@ -2049,7 +2083,7 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) {
gCodecInfo.capsClazz = (jclass)env->NewGlobalRef(clazz.get());
method = env->GetMethodID(clazz.get(), "<init>",
- "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI"
+ "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
"Ljava/util/Map;Ljava/util/Map;)V");
CHECK(method != NULL);
gCodecInfo.capsCtorId = method;
@@ -2187,7 +2221,7 @@ static const JNINativeMethod gMethods[] = {
{ "getImage", "(ZI)Landroid/media/Image;",
(void *)android_media_MediaCodec_getImage },
- { "getName", "()Ljava/lang/String;",
+ { "getCanonicalName", "()Ljava/lang/String;",
(void *)android_media_MediaCodec_getName },
{ "getOwnCodecInfo", "()Landroid/media/MediaCodecInfo;",
diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp
index 8de11caf7d7a..cf1494296756 100644
--- a/media/jni/android_media_MediaCodecList.cpp
+++ b/media/jni/android_media_MediaCodecList.cpp
@@ -41,6 +41,21 @@ static sp<IMediaCodecList> getCodecList(JNIEnv *env) {
return mcl;
}
+static sp<MediaCodecInfo> getCodecInfo(JNIEnv *env, jint index) {
+ sp<IMediaCodecList> mcl = getCodecList(env);
+ if (mcl == NULL) {
+ // Runtime exception already pending.
+ return NULL;
+ }
+
+ sp<MediaCodecInfo> info = mcl->getCodecInfo(index);
+ if (info == NULL) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ }
+
+ return info;
+}
+
static jint android_media_MediaCodecList_getCodecCount(
JNIEnv *env, jobject /* thiz */) {
sp<IMediaCodecList> mcl = getCodecList(env);
@@ -53,15 +68,22 @@ static jint android_media_MediaCodecList_getCodecCount(
static jstring android_media_MediaCodecList_getCodecName(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
+ if (info == NULL) {
// Runtime exception already pending.
return NULL;
}
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
+ // TODO: support aliases
+ const char *name = info->getCodecName();
+ return env->NewStringUTF(name);
+}
+
+static jstring android_media_MediaCodecList_getCanonicalName(
+ JNIEnv *env, jobject /* thiz */, jint index) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ // Runtime exception already pending.
return NULL;
}
@@ -94,39 +116,27 @@ static jint android_media_MediaCodecList_findCodecByName(
return ret;
}
-static jboolean android_media_MediaCodecList_isEncoder(
+static jboolean android_media_MediaCodecList_getAttributes(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
- // Runtime exception already pending.
- return false;
- }
-
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return false;
+ // Runtime exception already pending.
+ return 0;
}
- return info->isEncoder();
+ return info->getAttributes();
}
static jarray android_media_MediaCodecList_getSupportedTypes(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
- // Runtime exception already pending.
- return NULL;
- }
-
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ // Runtime exception already pending.
return NULL;
}
Vector<AString> types;
- info->getSupportedMimes(&types);
+ info->getSupportedMediaTypes(&types);
jclass clazz = env->FindClass("java/lang/String");
CHECK(clazz != NULL);
@@ -150,17 +160,12 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
return NULL;
}
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
+ if (info == NULL) {
// Runtime exception already pending.
return NULL;
}
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
- if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return NULL;
- }
const char *typeStr = env->GetStringUTFChars(type, NULL);
if (typeStr == NULL) {
@@ -186,7 +191,6 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
capabilities->getSupportedColorFormats(&colorFormats);
capabilities->getSupportedProfileLevels(&profileLevels);
- uint32_t flags = capabilities->getFlags();
sp<AMessage> details = capabilities->getDetails();
bool isEncoder = info->isEncoder();
@@ -240,11 +244,11 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
}
jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>",
- "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI"
+ "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
"Ljava/util/Map;Ljava/util/Map;)V");
jobject caps = env->NewObject(capsClazz, capsConstructID,
- profileLevelArray, colorFormatsArray, isEncoder, flags,
+ profileLevelArray, colorFormatsArray, isEncoder,
defaultFormatObj, infoObj);
env->DeleteLocalRef(profileLevelArray);
@@ -288,9 +292,15 @@ static void android_media_MediaCodecList_native_init(JNIEnv* /* env */) {
static const JNINativeMethod gMethods[] = {
{ "native_getCodecCount", "()I", (void *)android_media_MediaCodecList_getCodecCount },
+
+ { "getCanonicalName", "(I)Ljava/lang/String;",
+ (void *)android_media_MediaCodecList_getCanonicalName },
+
{ "getCodecName", "(I)Ljava/lang/String;",
(void *)android_media_MediaCodecList_getCodecName },
- { "isEncoder", "(I)Z", (void *)android_media_MediaCodecList_isEncoder },
+
+ { "getAttributes", "(I)I", (void *)android_media_MediaCodecList_getAttributes },
+
{ "getSupportedTypes", "(I)[Ljava/lang/String;",
(void *)android_media_MediaCodecList_getSupportedTypes },
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index be71dad571bb..42c5b052d4aa 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -110,6 +110,7 @@ struct EventWhat {
jint kWhatDrmEvent;
jint kWhatExpirationUpdate;
jint kWhatKeyStatusChange;
+ jint kWhatSessionLostState;
} gEventWhat;
struct KeyTypes {
@@ -141,6 +142,16 @@ struct StateExceptionFields {
jclass classId;
};
+struct SessionExceptionFields {
+ jmethodID init;
+ jclass classId;
+ jfieldID errorCode;
+};
+
+struct SessionExceptionErrorCodes {
+ jint kResourceContention;
+} gSessionExceptionErrorCodes;
+
struct HDCPLevels {
jint kHdcpLevelUnknown;
jint kHdcpNone;
@@ -148,6 +159,7 @@ struct HDCPLevels {
jint kHdcpV2;
jint kHdcpV2_1;
jint kHdcpV2_2;
+ jint kHdcpV2_3;
jint kHdcpNoOutput;
} gHdcpLevels;
@@ -180,6 +192,7 @@ struct fields_t {
EntryFields entry;
CertificateFields certificate;
StateExceptionFields stateException;
+ SessionExceptionFields sessionException;
jclass certificateClassId;
jclass hashmapClassId;
jclass arraylistClassId;
@@ -310,6 +323,9 @@ void JNIDrmListener::notify(DrmPlugin::EventType eventType, int extra,
case DrmPlugin::kDrmPluginEventKeysChange:
jwhat = gEventWhat.kWhatKeyStatusChange;
break;
+ case DrmPlugin::kDrmPluginEventSessionLostState:
+ jwhat = gEventWhat.kWhatSessionLostState;
+ break;
default:
ALOGE("Invalid event DrmPlugin::EventType %d, ignored", (int)eventType);
return;
@@ -343,6 +359,30 @@ static void throwStateException(JNIEnv *env, const char *msg, status_t err) {
env->Throw(static_cast<jthrowable>(exception));
}
+static void throwSessionException(JNIEnv *env, const char *msg, status_t err) {
+ ALOGE("Session exception: %s (%d)", msg, err);
+
+ jint jErrorCode = 0;
+ switch(err) {
+ case ERROR_DRM_RESOURCE_CONTENTION:
+ jErrorCode = gSessionExceptionErrorCodes.kResourceContention;
+ break;
+ default:
+ break;
+ }
+
+ jobject exception = env->NewObject(gFields.sessionException.classId,
+ gFields.sessionException.init, static_cast<int>(err),
+ env->NewStringUTF(msg));
+
+ env->SetIntField(exception, gFields.sessionException.errorCode, jErrorCode);
+ env->Throw(static_cast<jthrowable>(exception));
+}
+
+static bool isSessionException(status_t err) {
+ return err == ERROR_DRM_RESOURCE_CONTENTION;
+}
+
static bool throwExceptionAsNecessary(
JNIEnv *env, status_t err, const char *msg = NULL) {
@@ -370,7 +410,7 @@ static bool throwExceptionAsNecessary(
case ERROR_DRM_CANNOT_HANDLE:
drmMessage = "Invalid parameter or data format";
break;
- case ERROR_DRM_TAMPER_DETECTED:
+ case ERROR_DRM_INVALID_STATE:
drmMessage = "Invalid state";
break;
default:
@@ -399,6 +439,9 @@ static bool throwExceptionAsNecessary(
jniThrowException(env, "android/media/MediaDrmResetException",
"mediaserver died");
return true;
+ } else if (isSessionException(err)) {
+ throwSessionException(env, msg, err);
+ return true;
} else if (err != OK) {
String8 errbuf;
if (drmMessage != NULL) {
@@ -705,6 +748,8 @@ static void android_media_MediaDrm_native_init(JNIEnv *env) {
gEventWhat.kWhatExpirationUpdate = env->GetStaticIntField(clazz, field);
GET_STATIC_FIELD_ID(field, clazz, "KEY_STATUS_CHANGE", "I");
gEventWhat.kWhatKeyStatusChange = env->GetStaticIntField(clazz, field);
+ GET_STATIC_FIELD_ID(field, clazz, "SESSION_LOST_STATE", "I");
+ gEventWhat.kWhatSessionLostState = env->GetStaticIntField(clazz, field);
GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_STREAMING", "I");
gKeyTypes.kKeyTypeStreaming = env->GetStaticIntField(clazz, field);
@@ -730,6 +775,8 @@ static void android_media_MediaDrm_native_init(JNIEnv *env) {
gHdcpLevels.kHdcpV2_1 = env->GetStaticIntField(clazz, field);
GET_STATIC_FIELD_ID(field, clazz, "HDCP_V2_2", "I");
gHdcpLevels.kHdcpV2_2 = env->GetStaticIntField(clazz, field);
+ GET_STATIC_FIELD_ID(field, clazz, "HDCP_V2_3", "I");
+ gHdcpLevels.kHdcpV2_3 = env->GetStaticIntField(clazz, field);
GET_STATIC_FIELD_ID(field, clazz, "HDCP_NO_DIGITAL_OUTPUT", "I");
gHdcpLevels.kHdcpNoOutput = env->GetStaticIntField(clazz, field);
@@ -831,6 +878,14 @@ static void android_media_MediaDrm_native_init(JNIEnv *env) {
FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException");
GET_METHOD_ID(gFields.stateException.init, clazz, "<init>", "(ILjava/lang/String;)V");
gFields.stateException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
+
+ FIND_CLASS(clazz, "android/media/MediaDrm$SessionException");
+ GET_METHOD_ID(gFields.sessionException.init, clazz, "<init>", "(ILjava/lang/String;)V");
+ gFields.sessionException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
+ GET_FIELD_ID(gFields.sessionException.errorCode, clazz, "mErrorCode", "I");
+
+ GET_STATIC_FIELD_ID(field, clazz, "ERROR_RESOURCE_CONTENTION", "I");
+ gSessionExceptionErrorCodes.kResourceContention = env->GetStaticIntField(clazz, field);
}
static void android_media_MediaDrm_native_setup(
@@ -1338,6 +1393,8 @@ static jint HdcpLevelTojint(DrmPlugin::HdcpLevel level) {
return gHdcpLevels.kHdcpV2_1;
case DrmPlugin::kHdcpV2_2:
return gHdcpLevels.kHdcpV2_2;
+ case DrmPlugin::kHdcpV2_3:
+ return gHdcpLevels.kHdcpV2_3;
case DrmPlugin::kHdcpNoOutput:
return gHdcpLevels.kHdcpNoOutput;
}
diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp
index 7e6a8abbce90..9b4e730cfb5e 100644
--- a/media/jni/android_media_MediaPlayer2.cpp
+++ b/media/jni/android_media_MediaPlayer2.cpp
@@ -86,7 +86,8 @@ using media::VolumeShaper;
// ----------------------------------------------------------------------------
struct fields_t {
- jfieldID context;
+ jfieldID context; // passed from Java to native, used for creating JWakeLock
+ jfieldID nativeContext; // mNativeContext in MediaPlayer2.java
jfieldID surface_texture;
jmethodID post_event;
@@ -225,21 +226,21 @@ void JNIMediaPlayer2Listener::notify(int64_t srcId, int msg, int ext1, int ext2,
static sp<MediaPlayer2> getMediaPlayer(JNIEnv* env, jobject thiz)
{
Mutex::Autolock l(sLock);
- MediaPlayer2* const p = (MediaPlayer2*)env->GetLongField(thiz, fields.context);
+ MediaPlayer2* const p = (MediaPlayer2*)env->GetLongField(thiz, fields.nativeContext);
return sp<MediaPlayer2>(p);
}
static sp<MediaPlayer2> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer2>& player)
{
Mutex::Autolock l(sLock);
- sp<MediaPlayer2> old = (MediaPlayer2*)env->GetLongField(thiz, fields.context);
+ sp<MediaPlayer2> old = (MediaPlayer2*)env->GetLongField(thiz, fields.nativeContext);
if (player.get()) {
player->incStrong((void*)setMediaPlayer);
}
if (old != 0) {
old->decStrong((void*)setMediaPlayer);
}
- env->SetLongField(thiz, fields.context, (jlong)player.get());
+ env->SetLongField(thiz, fields.nativeContext, (jlong)player.get());
return old;
}
@@ -955,11 +956,16 @@ android_media_MediaPlayer2_native_init(JNIEnv *env)
return;
}
- fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
+ fields.context = env->GetFieldID(clazz, "mContext", "Landroid/content/Context;");
if (fields.context == NULL) {
return;
}
+ fields.nativeContext = env->GetFieldID(clazz, "mNativeContext", "J");
+ if (fields.nativeContext == NULL) {
+ return;
+ }
+
fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;JIII[B)V");
if (fields.post_event == NULL) {
@@ -1013,7 +1019,8 @@ android_media_MediaPlayer2_native_setup(JNIEnv *env, jobject thiz,
jint sessionId, jobject weak_this)
{
ALOGV("native_setup");
- sp<MediaPlayer2> mp = MediaPlayer2::Create(sessionId);
+ jobject context = env->GetObjectField(thiz, fields.context);
+ sp<MediaPlayer2> mp = MediaPlayer2::Create(sessionId, context);
if (mp == NULL) {
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
return;
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 56b85b5167f5..06a7182e4b1d 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -708,6 +708,24 @@ MtpResponseCode MtpDatabase::getObjectPropertyList(MtpObjectHandle handle,
int type = dataTypes[i];
packet.putUInt16(type);
+ if (type == MTP_TYPE_STR) {
+ jstring value = (jstring)env->GetObjectArrayElement(stringValuesArray, i);
+ const char *valueStr = (value ? env->GetStringUTFChars(value, NULL) : NULL);
+ if (valueStr) {
+ packet.putString(valueStr);
+ env->ReleaseStringUTFChars(value, valueStr);
+ } else {
+ packet.putEmptyString();
+ }
+ env->DeleteLocalRef(value);
+ continue;
+ }
+
+ if (!longValues) {
+ ALOGE("bad longValuesArray value in MyMtpDatabase::getObjectPropertyList");
+ continue;
+ }
+
switch (type) {
case MTP_TYPE_INT8:
packet.putInt8(longValues[i]);
@@ -739,18 +757,6 @@ MtpResponseCode MtpDatabase::getObjectPropertyList(MtpObjectHandle handle,
case MTP_TYPE_UINT128:
packet.putUInt128(longValues[i]);
break;
- case MTP_TYPE_STR: {
- jstring value = (jstring)env->GetObjectArrayElement(stringValuesArray, i);
- const char *valueStr = (value ? env->GetStringUTFChars(value, NULL) : NULL);
- if (valueStr) {
- packet.putString(valueStr);
- env->ReleaseStringUTFChars(value, valueStr);
- } else {
- packet.putEmptyString();
- }
- env->DeleteLocalRef(value);
- break;
- }
default:
ALOGE("bad or unsupported data type in MtpDatabase::getObjectPropertyList");
break;
diff --git a/media/lib/remotedisplay/api/current.txt b/media/lib/remotedisplay/api/current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/remotedisplay/api/current.txt
+++ b/media/lib/remotedisplay/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/remotedisplay/api/removed.txt b/media/lib/remotedisplay/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/remotedisplay/api/removed.txt
+++ b/media/lib/remotedisplay/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/remotedisplay/api/system-current.txt b/media/lib/remotedisplay/api/system-current.txt
index 69bbd35fce59..3619fcfba731 100644
--- a/media/lib/remotedisplay/api/system-current.txt
+++ b/media/lib/remotedisplay/api/system-current.txt
@@ -1,17 +1,18 @@
+// Signature format: 2.0
package com.android.media.remotedisplay {
public class RemoteDisplay {
- ctor public RemoteDisplay(java.lang.String, java.lang.String);
- method public java.lang.String getDescription();
- method public java.lang.String getId();
- method public java.lang.String getName();
+ ctor public RemoteDisplay(String, String);
+ method public String getDescription();
+ method public String getId();
+ method public String getName();
method public int getPresentationDisplayId();
method public int getStatus();
method public int getVolume();
method public int getVolumeHandling();
method public int getVolumeMax();
- method public void setDescription(java.lang.String);
- method public void setName(java.lang.String);
+ method public void setDescription(String);
+ method public void setName(String);
method public void setPresentationDisplayId(int);
method public void setStatus(int);
method public void setVolume(int);
@@ -29,7 +30,7 @@ package com.android.media.remotedisplay {
public abstract class RemoteDisplayProvider {
ctor public RemoteDisplayProvider(android.content.Context);
method public void addDisplay(com.android.media.remotedisplay.RemoteDisplay);
- method public com.android.media.remotedisplay.RemoteDisplay findRemoteDisplay(java.lang.String);
+ method public com.android.media.remotedisplay.RemoteDisplay findRemoteDisplay(String);
method public android.os.IBinder getBinder();
method public final android.content.Context getContext();
method public int getDiscoveryMode();
@@ -45,7 +46,7 @@ package com.android.media.remotedisplay {
field public static final int DISCOVERY_MODE_ACTIVE = 2; // 0x2
field public static final int DISCOVERY_MODE_NONE = 0; // 0x0
field public static final int DISCOVERY_MODE_PASSIVE = 1; // 0x1
- field public static final java.lang.String SERVICE_INTERFACE = "com.android.media.remotedisplay.RemoteDisplayProvider";
+ field public static final String SERVICE_INTERFACE = "com.android.media.remotedisplay.RemoteDisplayProvider";
}
}
diff --git a/media/lib/remotedisplay/api/system-removed.txt b/media/lib/remotedisplay/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/remotedisplay/api/system-removed.txt
+++ b/media/lib/remotedisplay/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/remotedisplay/api/test-current.txt b/media/lib/remotedisplay/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/remotedisplay/api/test-current.txt
+++ b/media/lib/remotedisplay/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/remotedisplay/api/test-removed.txt b/media/lib/remotedisplay/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/remotedisplay/api/test-removed.txt
+++ b/media/lib/remotedisplay/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/signer/Android.bp b/media/lib/signer/Android.bp
index 8c43683c2eec..44f8725ec6f5 100644
--- a/media/lib/signer/Android.bp
+++ b/media/lib/signer/Android.bp
@@ -18,5 +18,7 @@ java_sdk_library {
name: "com.android.mediadrm.signer",
srcs: ["java/**/*.java"],
api_packages: ["com.android.mediadrm.signer"],
- metalava_enabled: false,
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: ["media/java"],
+ srcs_lib_whitelist_pkgs: ["android.media"],
}
diff --git a/media/lib/signer/api/current.txt b/media/lib/signer/api/current.txt
index 4aa912d66cb4..c9298dd9a94e 100644
--- a/media/lib/signer/api/current.txt
+++ b/media/lib/signer/api/current.txt
@@ -1,9 +1,10 @@
+// Signature format: 2.0
package com.android.mediadrm.signer {
public final class MediaDrmSigner {
- method public static com.android.mediadrm.signer.MediaDrmSigner.CertificateRequest getCertificateRequest(android.media.MediaDrm, int, java.lang.String);
+ method public static com.android.mediadrm.signer.MediaDrmSigner.CertificateRequest getCertificateRequest(android.media.MediaDrm, int, String);
method public static com.android.mediadrm.signer.MediaDrmSigner.Certificate provideCertificateResponse(android.media.MediaDrm, byte[]) throws android.media.DeniedByServerException;
- method public static byte[] signRSA(android.media.MediaDrm, byte[], java.lang.String, byte[], byte[]);
+ method public static byte[] signRSA(android.media.MediaDrm, byte[], String, byte[], byte[]);
field public static final int CERTIFICATE_TYPE_X509 = 1; // 0x1
}
@@ -14,7 +15,7 @@ package com.android.mediadrm.signer {
public static final class MediaDrmSigner.CertificateRequest {
method public byte[] getData();
- method public java.lang.String getDefaultUrl();
+ method public String getDefaultUrl();
}
}
diff --git a/media/lib/signer/api/removed.txt b/media/lib/signer/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/signer/api/removed.txt
+++ b/media/lib/signer/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/signer/api/system-current.txt b/media/lib/signer/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/signer/api/system-current.txt
+++ b/media/lib/signer/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/signer/api/system-removed.txt b/media/lib/signer/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/signer/api/system-removed.txt
+++ b/media/lib/signer/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/signer/api/test-current.txt b/media/lib/signer/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/signer/api/test-current.txt
+++ b/media/lib/signer/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/signer/api/test-removed.txt b/media/lib/signer/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/signer/api/test-removed.txt
+++ b/media/lib/signer/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/tvremote/api/current.txt b/media/lib/tvremote/api/current.txt
index eea9e9c9c19c..1086d5884390 100644
--- a/media/lib/tvremote/api/current.txt
+++ b/media/lib/tvremote/api/current.txt
@@ -1,3 +1,4 @@
+// Signature format: 2.0
package com.android.media.tv.remoteprovider {
public abstract class TvRemoteProvider {
@@ -7,14 +8,14 @@ package com.android.media.tv.remoteprovider {
method public android.os.IBinder getBinder();
method public final android.content.Context getContext();
method public void onInputBridgeConnected(android.os.IBinder);
- method public void openRemoteInputBridge(android.os.IBinder, java.lang.String, int, int, int) throws java.lang.RuntimeException;
+ method public void openRemoteInputBridge(android.os.IBinder, String, int, int, int) throws java.lang.RuntimeException;
method public void sendKeyDown(android.os.IBinder, int) throws java.lang.RuntimeException;
method public void sendKeyUp(android.os.IBinder, int) throws java.lang.RuntimeException;
method public void sendPointerDown(android.os.IBinder, int, int, int) throws java.lang.RuntimeException;
method public void sendPointerSync(android.os.IBinder) throws java.lang.RuntimeException;
method public void sendPointerUp(android.os.IBinder, int) throws java.lang.RuntimeException;
method public void sendTimestamp(android.os.IBinder, long) throws java.lang.RuntimeException;
- field public static final java.lang.String SERVICE_INTERFACE = "com.android.media.tv.remoteprovider.TvRemoteProvider";
+ field public static final String SERVICE_INTERFACE = "com.android.media.tv.remoteprovider.TvRemoteProvider";
}
}
diff --git a/media/lib/tvremote/api/removed.txt b/media/lib/tvremote/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/tvremote/api/removed.txt
+++ b/media/lib/tvremote/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/tvremote/api/system-current.txt b/media/lib/tvremote/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/tvremote/api/system-current.txt
+++ b/media/lib/tvremote/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/tvremote/api/system-removed.txt b/media/lib/tvremote/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/tvremote/api/system-removed.txt
+++ b/media/lib/tvremote/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/tvremote/api/test-current.txt b/media/lib/tvremote/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/tvremote/api/test-current.txt
+++ b/media/lib/tvremote/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/lib/tvremote/api/test-removed.txt b/media/lib/tvremote/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/media/lib/tvremote/api/test-removed.txt
+++ b/media/lib/tvremote/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/media/packages/MediaCore/Android.bp b/media/packages/MediaCore/Android.bp
new file mode 100644
index 000000000000..c7fd58bf933a
--- /dev/null
+++ b/media/packages/MediaCore/Android.bp
@@ -0,0 +1,21 @@
+android_app {
+ name: "MediaCore",
+
+ srcs: [
+ "src/**/*.java",
+ ],
+
+ static_libs: [
+ // TODO: Temporarily statically linked. Should go into "libs"
+ "media1",
+ ],
+
+ // System app
+ platform_apis: true,
+
+ // Privileged app
+ privileged: true,
+
+ // Make sure that the implementation only relies on SDK or system APIs.
+ sdk_version: "system_current",
+}
diff --git a/media/packages/MediaCore/AndroidManifest.xml b/media/packages/MediaCore/AndroidManifest.xml
new file mode 100644
index 000000000000..4e2b274511e8
--- /dev/null
+++ b/media/packages/MediaCore/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/AndroidManifest.xml
+**
+** Copyright 2019, 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.
+*/
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.media" coreApp="true" android:sharedUserId="android.uid.system"
+ android:sharedUserLabel="@string/android_system_label">
+ <application android:process="system"
+ android:persistent="true"
+ android:directBootAware="true">
+ <service android:name="AmlMediaSessionProviderService" android:singleUser="true">
+ <intent-filter>
+ <action android:name="android.media.session.MediaSessionProviderService"/>
+ </intent-filter>
+ </service>
+ </application>
+</manifest>
diff --git a/media/packages/MediaCore/res/values/strings.xml b/media/packages/MediaCore/res/values/strings.xml
new file mode 100644
index 000000000000..59fd635b905f
--- /dev/null
+++ b/media/packages/MediaCore/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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.
+-->
+
+<resources>
+ <!-- Label for the Android system components when they are shown to the user. -->
+ <string name="android_system_label" translatable="false">Android System</string>
+</resources>
+
diff --git a/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java b/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java
new file mode 100644
index 000000000000..43b95ab7ebdb
--- /dev/null
+++ b/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2019 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.media;
+
+import android.content.Context;
+import android.media.session.MediaSessionProviderService;
+import android.os.PowerManager;
+import android.util.Log;
+
+/**
+ * System implementation of MediaSessionProviderService
+ */
+public class AmlMediaSessionProviderService extends MediaSessionProviderService {
+ private static final String TAG = "AmlMediaSessionProviderS";
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private Context mContext;
+
+ public AmlMediaSessionProviderService(Context context) {
+ mContext = context;
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ }
+}
diff --git a/media/tests/players/Android.mk b/media/tests/players/Android.mk
index 35aba4dfa25e..ee9d85099104 100644
--- a/media/tests/players/Android.mk
+++ b/media/tests/players/Android.mk
@@ -25,7 +25,7 @@ LOCAL_SHARED_LIBRARIES:= \
liblog
LOCAL_MODULE:= invoke_mock_media_player
-LOCAL_MODULE_TAGS := tests eng
+LOCAL_MODULE_TAGS := tests
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 5cfb09b9a68c..73d4c4522010 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -49,6 +49,7 @@ cc_library_shared {
"sharedmem.cpp",
"storage_manager.cpp",
"surface_texture.cpp",
+ "surface_control.cpp",
"system_fonts.cpp",
"trace.cpp",
],
@@ -83,6 +84,10 @@ cc_library_shared {
include_dirs: ["bionic/libc/dns/include"],
version_script: "libandroid.map.txt",
+ stubs: {
+ symbol_file: "libandroid.map.txt",
+ versions: ["29"],
+ },
}
// Network library.
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 537aed498cd2..8be8eda06a59 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -205,6 +205,9 @@ LIBANDROID {
AStorageManager_mountObb;
AStorageManager_new;
AStorageManager_unmountObb;
+ ASurfaceControl_create; # introduced=29
+ ASurfaceControl_createFromWindow; # introduced=29
+ ASurfaceControl_destroy; # introduced=29
ASurfaceTexture_acquireANativeWindow; # introduced=28
ASurfaceTexture_attachToGLContext; # introduced=28
ASurfaceTexture_detachFromGLContext; # introduced=28
@@ -213,6 +216,16 @@ LIBANDROID {
ASurfaceTexture_getTransformMatrix; # introduced=28
ASurfaceTexture_release; # introduced=28
ASurfaceTexture_updateTexImage; # introduced=28
+ ASurfaceTransaction_apply; # introduced=29
+ ASurfaceTransaction_create; # introduced=29
+ ASurfaceTransaction_delete; # introduced=29
+ ASurfaceTransaction_setBuffer; # introduced=29
+ ASurfaceTransaction_setBufferTransparency; # introduced=29
+ ASurfaceTransaction_setDamageRegion; # introduced=29
+ ASurfaceTransaction_setGeometry; # introduced=29
+ ASurfaceTransaction_setOnComplete; # introduced=29
+ ASurfaceTransaction_setVisibility; # introduced=29
+ ASurfaceTransaction_setZOrder; # introduced=29
ASystemFontIterator_open; # introduced=29
ASystemFontIterator_close; # introduced=29
ASystemFontIterator_next; # introduced=29
diff --git a/native/android/net.c b/native/android/net.c
index 4cac371f313b..a8104fc23041 100644
--- a/native/android/net.c
+++ b/native/android/net.c
@@ -84,26 +84,28 @@ int android_getaddrinfofornetwork(net_handle_t network,
return android_getaddrinfofornet(node, service, hints, netid, 0, res);
}
-int android_res_nquery(net_handle_t network, const char *dname, int ns_class, int ns_type) {
+int android_res_nquery(net_handle_t network, const char *dname,
+ int ns_class, int ns_type, enum ResNsendFlags flags) {
unsigned netid;
if (!getnetidfromhandle(network, &netid)) {
return -ENONET;
}
- return resNetworkQuery(netid, dname, ns_class, ns_type);
+ return resNetworkQuery(netid, dname, ns_class, ns_type, flags);
}
int android_res_nresult(int fd, int *rcode, uint8_t *answer, size_t anslen) {
return resNetworkResult(fd, rcode, answer, anslen);
}
-int android_res_nsend(net_handle_t network, const uint8_t *msg, size_t msglen) {
+int android_res_nsend(net_handle_t network, const uint8_t *msg, size_t msglen,
+ enum ResNsendFlags flags) {
unsigned netid;
if (!getnetidfromhandle(network, &netid)) {
return -ENONET;
}
- return resNetworkSend(netid, msg, msglen);
+ return resNetworkSend(netid, msg, msglen, flags);
}
void android_res_cancel(int nsend_fd) {
diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp
index 8e5821024cee..c3b2e2526ea8 100644
--- a/native/android/sensor.cpp
+++ b/native/android/sensor.cpp
@@ -342,3 +342,8 @@ int ASensor_getHighestDirectReportRateLevel(ASensor const *sensor) {
RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP);
return static_cast<Sensor const *>(sensor)->getHighestDirectReportRateLevel();
}
+
+int ASensor_getHandle(ASensor const* sensor) {
+ RETURN_IF_SENSOR_IS_NULL(ASENSOR_INVALID);
+ return static_cast<Sensor const*>(sensor)->getHandle();
+}
diff --git a/native/android/sharedmem.cpp b/native/android/sharedmem.cpp
index 757aaecab40d..4410bd6fbeed 100644
--- a/native/android/sharedmem.cpp
+++ b/native/android/sharedmem.cpp
@@ -71,7 +71,7 @@ int ASharedMemory_dupFromJava(JNIEnv* env, jobject javaSharedMemory) {
}
int fd = env->CallIntMethod(javaSharedMemory, sSharedMemory.getFd);
if (fd != -1) {
- fd = dup(fd);
+ fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
}
return fd;
}
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
new file mode 100644
index 000000000000..ead5b0b37f4b
--- /dev/null
+++ b/native/android/surface_control.cpp
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2018 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.
+ */
+
+#include <android/native_window.h>
+#include <android/surface_control.h>
+
+#include <gui/Surface.h>
+#include <gui/SurfaceComposerClient.h>
+#include <gui/SurfaceControl.h>
+
+using namespace android;
+
+using Transaction = SurfaceComposerClient::Transaction;
+
+#define CHECK_NOT_NULL(name) \
+ LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
+
+#define CHECK_VALID_RECT(name) \
+ LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
+ "invalid arg passed as " #name " argument");
+
+Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
+ return reinterpret_cast<Transaction*>(aSurfaceTransaction);
+}
+
+SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
+ return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
+}
+
+void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
+ // incStrong/decStrong token must be the same, doesn't matter what it is
+ surfaceControl->incStrong((void*)SurfaceControl_acquire);
+}
+
+void SurfaceControl_release(SurfaceControl* surfaceControl) {
+ // incStrong/decStrong token must be the same, doesn't matter what it is
+ surfaceControl->decStrong((void*)SurfaceControl_acquire);
+}
+
+ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
+ CHECK_NOT_NULL(window);
+ CHECK_NOT_NULL(debug_name);
+
+ sp<SurfaceComposerClient> client = new SurfaceComposerClient();
+ if (client->initCheck() != NO_ERROR) {
+ return nullptr;
+ }
+
+ uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
+ sp<SurfaceControl> surfaceControl =
+ client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
+ // Format is only relevant for buffer queue layers.
+ PIXEL_FORMAT_UNKNOWN /* format */, flags,
+ static_cast<Surface*>(window));
+ if (!surfaceControl) {
+ return nullptr;
+ }
+
+ SurfaceControl_acquire(surfaceControl.get());
+ return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
+}
+
+ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
+ CHECK_NOT_NULL(parent);
+ CHECK_NOT_NULL(debug_name);
+
+ SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
+
+ SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
+
+ uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
+ sp<SurfaceControl> surfaceControl =
+ client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
+ // Format is only relevant for buffer queue layers.
+ PIXEL_FORMAT_UNKNOWN /* format */, flags,
+ surfaceControlParent);
+ if (!surfaceControl) {
+ return nullptr;
+ }
+
+ SurfaceControl_acquire(surfaceControl.get());
+ return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
+}
+
+void ASurfaceControl_destroy(ASurfaceControl* aSurfaceControl) {
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+
+ Transaction().reparent(surfaceControl, nullptr).apply();
+ SurfaceControl_release(surfaceControl.get());
+}
+
+ASurfaceTransaction* ASurfaceTransaction_create() {
+ Transaction* transaction = new Transaction;
+ return reinterpret_cast<ASurfaceTransaction*>(transaction);
+}
+
+void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+ delete transaction;
+}
+
+void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ transaction->apply();
+}
+
+void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
+ ASurfaceTransaction_OnComplete func) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(context);
+ CHECK_NOT_NULL(func);
+
+ TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
+ const TransactionStats& stats) {
+ int fence = (stats.presentFence) ? stats.presentFence->dup() : -1;
+ (*func)(callback_context, fence);
+ };
+
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ transaction->addTransactionCompletedCallback(callback, context);
+}
+
+void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl,
+ int8_t visibility) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ switch (visibility) {
+ case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
+ transaction->show(surfaceControl);
+ break;
+ case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
+ transaction->hide(surfaceControl);
+ break;
+ default:
+ LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
+ }
+}
+
+void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl,
+ int32_t z_order) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ transaction->setLayer(surfaceControl, z_order);
+}
+
+void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl,
+ AHardwareBuffer* buffer, int fence_fd) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ sp<GraphicBuffer> graphic_buffer(reinterpret_cast<GraphicBuffer*>(buffer));
+
+ transaction->setBuffer(surfaceControl, graphic_buffer);
+ if (fence_fd != -1) {
+ sp<Fence> fence = new Fence(fence_fd);
+ transaction->setAcquireFence(surfaceControl, fence);
+ }
+}
+
+void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl, const ARect& source,
+ const ARect& destination, int32_t transform) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+ CHECK_VALID_RECT(source);
+ CHECK_VALID_RECT(destination);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
+ transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
+ transaction->setTransform(surfaceControl, transform);
+}
+
+void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl,
+ int8_t transparency) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
+ layer_state_t::eLayerOpaque : 0;
+ transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
+}
+
+void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl,
+ const ARect rects[], uint32_t count) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
+ CHECK_NOT_NULL(aSurfaceControl);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ Region region;
+ for (uint32_t i = 0; i < count; ++i) {
+ region.merge(static_cast<const Rect&>(rects[i]));
+ }
+
+ transaction->setSurfaceDamageRegion(surfaceControl, region);
+}
diff --git a/native/webview/plat_support/Android.bp b/native/webview/plat_support/Android.bp
index 09362566d915..88decc86c387 100644
--- a/native/webview/plat_support/Android.bp
+++ b/native/webview/plat_support/Android.bp
@@ -24,7 +24,6 @@ cc_library_shared {
srcs: [
"draw_functor.cpp",
"draw_gl_functor.cpp",
- "draw_vk_functor.cpp",
"functor_utils.cpp",
"jni_entry_point.cpp",
"graphics_utils.cpp",
diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h
index 6afd8837594c..0490e650a7a4 100644
--- a/native/webview/plat_support/draw_fn.h
+++ b/native/webview/plat_support/draw_fn.h
@@ -74,7 +74,10 @@ struct AwDrawFn_InitVkParams {
VkQueue queue;
uint32_t graphics_queue_index;
uint32_t instance_version;
- const char* const* enabled_extension_names;
+ const char* const* enabled_instance_extension_names;
+ uint32_t enabled_instance_extension_names_length;
+ const char* const* enabled_device_extension_names;
+ uint32_t enabled_device_extension_names_length;
// Only one of device_features and device_features_2 should be non-null.
// If both are null then no features are enabled.
VkPhysicalDeviceFeatures* device_features;
@@ -109,8 +112,15 @@ struct AwDrawFn_DrawVkParams {
// Input: Format of the destination surface.
VkFormat format;
- // Input: Color space transformation from linear RGB to D50-adapted XYZ
- float matrix[9];
+ // Input: Color space parameters.
+ float transfer_function_g;
+ float transfer_function_a;
+ float transfer_function_b;
+ float transfer_function_c;
+ float transfer_function_d;
+ float transfer_function_e;
+ float transfer_function_f;
+ float color_space_toXYZD50[9];
// Input: current clip rect
int clip_left;
@@ -121,15 +131,13 @@ struct AwDrawFn_DrawVkParams {
struct AwDrawFn_PostDrawVkParams {
int version;
-
- // Input: Fence for the composite command buffer to signal it has finished its
- // work on the GPU.
- int fd;
};
// Called on render thread while UI thread is blocked. Called for both GL and
// VK.
-typedef void AwDrawFn_OnSync(int functor, void* data, AwDrawFn_OnSyncParams* params);
+typedef void AwDrawFn_OnSync(int functor,
+ void* data,
+ AwDrawFn_OnSyncParams* params);
// Called on render thread when either the context is destroyed _or_ when the
// functor's last reference goes away. Will always be called with an active
@@ -143,17 +151,24 @@ typedef void AwDrawFn_OnContextDestroyed(int functor, void* data);
typedef void AwDrawFn_OnDestroyed(int functor, void* data);
// Only called for GL.
-typedef void AwDrawFn_DrawGL(int functor, void* data, AwDrawFn_DrawGLParams* params);
+typedef void AwDrawFn_DrawGL(int functor,
+ void* data,
+ AwDrawFn_DrawGLParams* params);
// Initialize vulkan state. Needs to be called again after any
// OnContextDestroyed. Only called for Vulkan.
-typedef void AwDrawFn_InitVk(int functor, void* data, AwDrawFn_InitVkParams* params);
+typedef void AwDrawFn_InitVk(int functor,
+ void* data,
+ AwDrawFn_InitVkParams* params);
// Only called for Vulkan.
-typedef void AwDrawFn_DrawVk(int functor, void* data, AwDrawFn_DrawVkParams* params);
+typedef void AwDrawFn_DrawVk(int functor,
+ void* data,
+ AwDrawFn_DrawVkParams* params);
// Only called for Vulkan.
-typedef void AwDrawFn_PostDrawVk(int functor, void* data,
+typedef void AwDrawFn_PostDrawVk(int functor,
+ void* data,
AwDrawFn_PostDrawVkParams* params);
struct AwDrawFnFunctorCallbacks {
@@ -176,7 +191,8 @@ enum AwDrawFnRenderMode {
typedef AwDrawFnRenderMode AwDrawFn_QueryRenderMode(void);
// Create a functor. |functor_callbacks| should be valid until OnDestroyed.
-typedef int AwDrawFn_CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks);
+typedef int AwDrawFn_CreateFunctor(void* data,
+ AwDrawFnFunctorCallbacks* functor_callbacks);
// May be called on any thread to signal that the functor should be destroyed.
// The functor will receive an onDestroyed when the last usage of it is
diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp
index 820bac509d2e..b97bbc311624 100644
--- a/native/webview/plat_support/draw_functor.cpp
+++ b/native/webview/plat_support/draw_functor.cpp
@@ -74,6 +74,79 @@ void draw_gl(int functor, void* data,
support->callbacks.draw_gl(functor, support->data, &params);
}
+void initializeVk(int functor, void* data,
+ const uirenderer::VkFunctorInitParams& init_vk_params) {
+ SupportData* support = static_cast<SupportData*>(data);
+ VkPhysicalDeviceFeatures2 device_features_2;
+ if (init_vk_params.device_features_2)
+ device_features_2 = *init_vk_params.device_features_2;
+
+ AwDrawFn_InitVkParams params{
+ .version = kAwDrawFnVersion,
+ .instance = init_vk_params.instance,
+ .physical_device = init_vk_params.physical_device,
+ .device = init_vk_params.device,
+ .queue = init_vk_params.queue,
+ .graphics_queue_index = init_vk_params.graphics_queue_index,
+ .instance_version = init_vk_params.instance_version,
+ .enabled_instance_extension_names =
+ init_vk_params.enabled_instance_extension_names,
+ .enabled_instance_extension_names_length =
+ init_vk_params.enabled_instance_extension_names_length,
+ .enabled_device_extension_names =
+ init_vk_params.enabled_device_extension_names,
+ .enabled_device_extension_names_length =
+ init_vk_params.enabled_device_extension_names_length,
+ .device_features = nullptr,
+ .device_features_2 =
+ init_vk_params.device_features_2 ? &device_features_2 : nullptr,
+ };
+ support->callbacks.init_vk(functor, support->data, &params);
+}
+
+void drawVk(int functor, void* data, const uirenderer::VkFunctorDrawParams& draw_vk_params) {
+ SupportData* support = static_cast<SupportData*>(data);
+ float gabcdef[7];
+ draw_vk_params.color_space_ptr->transferFn(gabcdef);
+ AwDrawFn_DrawVkParams params{
+ .version = kAwDrawFnVersion,
+ .width = draw_vk_params.width,
+ .height = draw_vk_params.height,
+ .is_layer = draw_vk_params.is_layer,
+ .secondary_command_buffer = draw_vk_params.secondary_command_buffer,
+ .color_attachment_index = draw_vk_params.color_attachment_index,
+ .compatible_render_pass = draw_vk_params.compatible_render_pass,
+ .format = draw_vk_params.format,
+ .transfer_function_g = gabcdef[0],
+ .transfer_function_a = gabcdef[1],
+ .transfer_function_b = gabcdef[2],
+ .transfer_function_c = gabcdef[3],
+ .transfer_function_d = gabcdef[4],
+ .transfer_function_e = gabcdef[5],
+ .transfer_function_f = gabcdef[6],
+ .clip_left = draw_vk_params.clip_left,
+ .clip_top = draw_vk_params.clip_top,
+ .clip_right = draw_vk_params.clip_right,
+ .clip_bottom = draw_vk_params.clip_bottom,
+ };
+ COMPILE_ASSERT(sizeof(params.color_space_toXYZD50) == sizeof(skcms_Matrix3x3),
+ gamut_transform_size_mismatch);
+ draw_vk_params.color_space_ptr->toXYZD50(
+ reinterpret_cast<skcms_Matrix3x3*>(&params.color_space_toXYZD50));
+ COMPILE_ASSERT(NELEM(params.transform) == NELEM(draw_vk_params.transform),
+ mismatched_transform_matrix_sizes);
+ for (int i = 0; i < NELEM(params.transform); ++i) {
+ params.transform[i] = draw_vk_params.transform[i];
+ }
+ support->callbacks.draw_vk(functor, support->data, &params);
+}
+
+void postDrawVk(int functor, void* data) {
+ SupportData* support = static_cast<SupportData*>(data);
+ AwDrawFn_PostDrawVkParams params{.version = kAwDrawFnVersion};
+ support->callbacks.post_draw_vk(functor, support->data, &params);
+}
+
int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) {
static bool callbacks_initialized = false;
static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = {
@@ -87,6 +160,12 @@ int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) {
webview_functor_callbacks.gles.draw = &draw_gl;
break;
case uirenderer::RenderMode::Vulkan:
+ webview_functor_callbacks.vk.initialize = &initializeVk;
+ webview_functor_callbacks.vk.draw = &drawVk;
+ webview_functor_callbacks.vk.postDraw = &postDrawVk;
+ // TODO(boliu): Remove this once SkiaRecordingCanvas::drawWebViewFunctor
+ // no longer uses GL interop.
+ webview_functor_callbacks.gles.draw = &draw_gl;
break;
}
callbacks_initialized = true;
diff --git a/native/webview/plat_support/draw_vk.h b/native/webview/plat_support/draw_vk.h
deleted file mode 100644
index 6b7d8d0b9118..000000000000
--- a/native/webview/plat_support/draw_vk.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-//******************************************************************************
-// This is a copy of the coresponding android_webview/public/browser header.
-// Any changes to the interface should be made there.
-//
-// The purpose of having the copy is twofold:
-// - it removes the need to have Chromium sources present in the tree in order
-// to build the plat_support library,
-// - it captures API that the corresponding Android release supports.
-//******************************************************************************
-
-#ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_VK_H_
-#define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_VK_H_
-
-#include <vulkan/vulkan.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-static const int kAwDrawVKInfoVersion = 1;
-
-// Holds the information required to trigger initialization of the Vulkan
-// functor.
-struct InitParams {
- // All params are input
- VkInstance instance;
- VkPhysicalDevice physical_device;
- VkDevice device;
- VkQueue queue;
- uint32_t graphics_queue_index;
- uint32_t instance_version;
- const char* const* enabled_extension_names;
- // Only one of device_features and device_features_2 should be non-null.
- // If both are null then no features are enabled.
- VkPhysicalDeviceFeatures* device_features;
- VkPhysicalDeviceFeatures2* device_features_2;
-};
-
-// Holds the information required to trigger an Vulkan composite operation.
-struct CompositeParams {
- // Input: current width/height of destination surface.
- int width;
- int height;
-
- // Input: is the render target a FBO
- bool is_layer;
-
- // Input: current transform matrix
- float transform[16];
-
- // Input WebView should do its main compositing draws into this. It cannot do
- // anything that would require stopping the render pass.
- VkCommandBuffer secondary_command_buffer;
-
- // Input: The main color attachment index where secondary_command_buffer will
- // eventually be submitted.
- uint32_t color_attachment_index;
-
- // Input: A render pass which will be compatible to the one which the
- // secondary_command_buffer will be submitted into.
- VkRenderPass compatible_render_pass;
-
- // Input: Format of the destination surface.
- VkFormat format;
-
- // Input: Color space transfer params
- float G;
- float A;
- float B;
- float C;
- float D;
- float E;
- float F;
-
- // Input: Color space transformation from linear RGB to D50-adapted XYZ
- float matrix[9];
-
- // Input: current clip rect
- int clip_left;
- int clip_top;
- int clip_right;
- int clip_bottom;
-};
-
-// Holds the information for the post-submission callback of main composite
-// draw.
-struct PostCompositeParams {
- // Input: Fence for the composite command buffer to signal it has finished its
- // work on the GPU.
- int fd;
-};
-
-// Holds the information required to trigger an Vulkan operation.
-struct AwDrawVKInfo {
- int version; // The AwDrawVKInfo this struct was built with.
-
- // Input: tells the draw function what action to perform.
- enum Mode {
- kModeInit = 0,
- kModeReInit = 1,
- kModePreComposite = 2,
- kModeComposite = 3,
- kModePostComposite = 4,
- kModeSync = 5,
- } mode;
-
- // Input: The parameters for the functor being called
- union ParamUnion {
- struct InitParams init_params;
- struct CompositeParams composite_params;
- struct PostCompositeParams post_composite_params;
- } info;
-};
-
-typedef void(AwDrawVKFunction)(long view_context, AwDrawVKInfo* draw_info);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_VK_H_
diff --git a/native/webview/plat_support/draw_vk_functor.cpp b/native/webview/plat_support/draw_vk_functor.cpp
deleted file mode 100644
index eab134020f71..000000000000
--- a/native/webview/plat_support/draw_vk_functor.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-// Provides a webviewchromium glue layer adapter from the internal Android
-// Vulkan Functor data types into the types the chromium stack expects, and
-// back.
-
-#define LOG_TAG "webviewchromium_plat_support"
-
-#include "draw_fn.h"
-#include "draw_vk.h"
-
-#include <jni.h>
-#include <private/hwui/DrawVkInfo.h>
-#include <utils/Functor.h>
-#include <utils/Log.h>
-
-#include "functor_utils.h"
-
-#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
-
-namespace android {
-namespace {
-
-AwDrawVKFunction* g_aw_drawvk_function = NULL;
-
-class DrawVKFunctor : public Functor {
- public:
- explicit DrawVKFunctor(jlong view_context) : view_context_(view_context) {}
- ~DrawVKFunctor() override {}
-
- // Functor
- status_t operator ()(int what, void* data) override {
- using uirenderer::DrawVkInfo;
- if (!g_aw_drawvk_function) {
- ALOGE("Cannot draw: no DrawVK Function installed");
- return DrawVkInfo::kStatusDone;
- }
-
- AwDrawVKInfo aw_info;
- aw_info.version = kAwDrawVKInfoVersion;
- switch (what) {
- case DrawVkInfo::kModeComposite: {
- aw_info.mode = AwDrawVKInfo::kModeComposite;
- DrawVkInfo* vk_info = reinterpret_cast<DrawVkInfo*>(data);
-
- // Map across the input values.
- CompositeParams& params = aw_info.info.composite_params;
- params.width = vk_info->width;
- params.height = vk_info->height;
- params.is_layer = vk_info->isLayer;
- for (size_t i = 0; i < 16; i++) {
- params.transform[i] = vk_info->transform[i];
- }
- params.secondary_command_buffer = vk_info->secondaryCommandBuffer;
- params.color_attachment_index = vk_info->colorAttachmentIndex;
- params.compatible_render_pass = vk_info->compatibleRenderPass;
- params.format = vk_info->format;
- params.G = vk_info->G;
- params.A = vk_info->A;
- params.B = vk_info->B;
- params.C = vk_info->C;
- params.D = vk_info->D;
- params.E = vk_info->E;
- params.F = vk_info->F;
- for (size_t i = 0; i < 9; i++) {
- params.matrix[i] = vk_info->matrix[i];
- }
- params.clip_left = vk_info->clipLeft;
- params.clip_top = vk_info->clipTop;
- params.clip_right = vk_info->clipRight;
- params.clip_bottom = vk_info->clipBottom;
-
- break;
- }
- case DrawVkInfo::kModePostComposite:
- break;
- case DrawVkInfo::kModeSync:
- aw_info.mode = AwDrawVKInfo::kModeSync;
- break;
- default:
- ALOGE("Unexpected DrawVKInfo type %d", what);
- return DrawVkInfo::kStatusDone;
- }
-
- // Invoke the DrawVK method.
- g_aw_drawvk_function(view_context_, &aw_info);
-
- return DrawVkInfo::kStatusDone;
- }
-
- private:
- intptr_t view_context_;
-};
-
-jlong CreateVKFunctor(JNIEnv*, jclass, jlong view_context) {
- RaiseFileNumberLimit();
- return reinterpret_cast<jlong>(new DrawVKFunctor(view_context));
-}
-
-void DestroyVKFunctor(JNIEnv*, jclass, jlong functor) {
- delete reinterpret_cast<DrawVKFunctor*>(functor);
-}
-
-void SetChromiumAwDrawVKFunction(JNIEnv*, jclass, jlong draw_function) {
- g_aw_drawvk_function = reinterpret_cast<AwDrawVKFunction*>(draw_function);
-}
-
-const char kClassName[] = "com/android/webview/chromium/DrawVKFunctor";
-const JNINativeMethod kJniMethods[] = {
- { "nativeCreateVKFunctor", "(J)J",
- reinterpret_cast<void*>(CreateVKFunctor) },
- { "nativeDestroyVKFunctor", "(J)V",
- reinterpret_cast<void*>(DestroyVKFunctor) },
- { "nativeSetChromiumAwDrawVKFunction", "(J)V",
- reinterpret_cast<void*>(SetChromiumAwDrawVKFunction) },
-};
-
-} // namespace
-
-void RegisterDrawVKFunctor(JNIEnv* env) {
- jclass clazz = env->FindClass(kClassName);
- LOG_ALWAYS_FATAL_IF(!clazz, "Unable to find class '%s'", kClassName);
-
- int res = env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods));
- LOG_ALWAYS_FATAL_IF(res < 0, "register native methods failed: res=%d", res);
-}
-
-} // namespace android
diff --git a/nfc-extras/api/current.txt b/nfc-extras/api/current.txt
index 066b7b58267e..47ccddf2ffcc 100644
--- a/nfc-extras/api/current.txt
+++ b/nfc-extras/api/current.txt
@@ -1,44 +1,45 @@
+// Signature format: 2.0
package com.android.nfc_extras {
public class EeAlreadyOpenException extends com.android.nfc_extras.EeIOException {
ctor public EeAlreadyOpenException();
- ctor public EeAlreadyOpenException(java.lang.String);
+ ctor public EeAlreadyOpenException(String);
}
public class EeExternalFieldException extends com.android.nfc_extras.EeIOException {
ctor public EeExternalFieldException();
- ctor public EeExternalFieldException(java.lang.String);
+ ctor public EeExternalFieldException(String);
}
public class EeIOException extends java.io.IOException {
ctor public EeIOException();
- ctor public EeIOException(java.lang.String);
+ ctor public EeIOException(String);
}
public class EeInitializationException extends com.android.nfc_extras.EeIOException {
ctor public EeInitializationException();
- ctor public EeInitializationException(java.lang.String);
+ ctor public EeInitializationException(String);
}
public class EeListenModeException extends com.android.nfc_extras.EeIOException {
ctor public EeListenModeException();
- ctor public EeListenModeException(java.lang.String);
+ ctor public EeListenModeException(String);
}
public class EeNfcDisabledException extends com.android.nfc_extras.EeIOException {
ctor public EeNfcDisabledException();
- ctor public EeNfcDisabledException(java.lang.String);
+ ctor public EeNfcDisabledException(String);
}
public final class NfcAdapterExtras {
method public void authenticate(byte[]);
method public static com.android.nfc_extras.NfcAdapterExtras get(android.nfc.NfcAdapter);
method public com.android.nfc_extras.NfcAdapterExtras.CardEmulationRoute getCardEmulationRoute();
- method public java.lang.String getDriverName();
+ method public String getDriverName();
method public com.android.nfc_extras.NfcExecutionEnvironment getEmbeddedExecutionEnvironment();
method public void setCardEmulationRoute(com.android.nfc_extras.NfcAdapterExtras.CardEmulationRoute);
- field public static final java.lang.String ACTION_RF_FIELD_OFF_DETECTED = "com.android.nfc_extras.action.RF_FIELD_OFF_DETECTED";
- field public static final java.lang.String ACTION_RF_FIELD_ON_DETECTED = "com.android.nfc_extras.action.RF_FIELD_ON_DETECTED";
+ field public static final String ACTION_RF_FIELD_OFF_DETECTED = "com.android.nfc_extras.action.RF_FIELD_OFF_DETECTED";
+ field public static final String ACTION_RF_FIELD_ON_DETECTED = "com.android.nfc_extras.action.RF_FIELD_ON_DETECTED";
}
public static final class NfcAdapterExtras.CardEmulationRoute {
@@ -53,7 +54,7 @@ package com.android.nfc_extras {
method public void close() throws java.io.IOException;
method public void open() throws com.android.nfc_extras.EeIOException;
method public byte[] transceive(byte[]) throws java.io.IOException;
- field public static final java.lang.String ACTION_AID_SELECTED = "com.android.nfc_extras.action.AID_SELECTED";
+ field public static final String ACTION_AID_SELECTED = "com.android.nfc_extras.action.AID_SELECTED";
}
}
diff --git a/nfc-extras/api/removed.txt b/nfc-extras/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/nfc-extras/api/removed.txt
+++ b/nfc-extras/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/nfc-extras/api/system-current.txt b/nfc-extras/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/nfc-extras/api/system-current.txt
+++ b/nfc-extras/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/nfc-extras/api/system-removed.txt b/nfc-extras/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/nfc-extras/api/system-removed.txt
+++ b/nfc-extras/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/nfc-extras/api/test-current.txt b/nfc-extras/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/nfc-extras/api/test-current.txt
+++ b/nfc-extras/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/nfc-extras/api/test-removed.txt b/nfc-extras/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/nfc-extras/api/test-removed.txt
+++ b/nfc-extras/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/obex/api/current.txt b/obex/api/current.txt
index 1cd562feff8d..f142bc86d7d6 100644
--- a/obex/api/current.txt
+++ b/obex/api/current.txt
@@ -1,3 +1,4 @@
+// Signature format: 2.0
package javax.obex {
public class ObexPacket {
diff --git a/obex/api/removed.txt b/obex/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/obex/api/removed.txt
+++ b/obex/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/obex/api/system-current.txt b/obex/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/obex/api/system-current.txt
+++ b/obex/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/obex/api/system-removed.txt b/obex/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/obex/api/system-removed.txt
+++ b/obex/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/obex/api/test-current.txt b/obex/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/obex/api/test-current.txt
+++ b/obex/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/obex/api/test-removed.txt b/obex/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/obex/api/test-removed.txt
+++ b/obex/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/packages/AppPredictionLib/Android.bp b/packages/AppPredictionLib/Android.bp
new file mode 100644
index 000000000000..e0f4dedc9368
--- /dev/null
+++ b/packages/AppPredictionLib/Android.bp
@@ -0,0 +1,24 @@
+// Copyright (C) 2018 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.
+
+android_library {
+ name: "app_prediction",
+
+ sdk_version: "system_current",
+ min_sdk_version: "system_current",
+
+ srcs: [
+ "src/**/*.java",
+ ],
+}
diff --git a/packages/AppPredictionLib/AndroidManifest.xml b/packages/AppPredictionLib/AndroidManifest.xml
new file mode 100644
index 000000000000..b99278881281
--- /dev/null
+++ b/packages/AppPredictionLib/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.app.prediction">
+</manifest>
diff --git a/packages/AppPredictionLib/src/com/android/app/prediction/Constants.java b/packages/AppPredictionLib/src/com/android/app/prediction/Constants.java
new file mode 100644
index 000000000000..0993c9a13f99
--- /dev/null
+++ b/packages/AppPredictionLib/src/com/android/app/prediction/Constants.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 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.app.prediction;
+
+/**
+ * Constants to be used with {@link android.app.prediction.AppPredictor}.
+ */
+public class Constants {
+
+ /**
+ * UI surface for predictions displayed on the user's home screen
+ */
+ public static final String UI_SURFACE_HOME = "home";
+
+ /**
+ * UI surface for predictions displayed on the recents/task switcher view
+ */
+ public static final String UI_SURFACE_RECENTS = "recents";
+
+ /**
+ * UI surface for predictions displayed on the share sheet.
+ */
+ public static final String UI_SURFACE_SHARE = "share";
+
+ /**
+ * Location constant when an app target or shortcut is started from the apps list
+ */
+ public static final String LAUNCH_LOCATION_APPS_LIST = "apps_list";
+
+ /**
+ * Location constant when an app target or shortcut is started from the user's home screen
+ */
+ public static final String LAUNCH_LOCATION_APPS_HOME = "home";
+
+ /**
+ * Location constant when an app target or shortcut is started from task switcher
+ */
+ public static final String LAUNCH_LOCATION_APPS_RECENTS = "recents";
+
+ /**
+ * Location constant when an app target or shortcut is started in the share sheet while it is
+ * in collapsed state (showing a limited set of result).
+ */
+ public static final String LAUNCH_LOCATION_APPS_SHARE_COLLAPSED = "share_collapsed";
+
+ /**
+ * Location constant when an app target or shortcut is started in the share sheet while it is
+ * in expended state and showing all the results.
+ */
+ public static final String LAUNCH_LOCATION_APPS_SHARE_EXPANDED = "shared_expanded";
+
+ /**
+ * Location constant when an app target or shortcut is started in the share sheet when the
+ * target is displayed as a placeholder for an deprecated object.
+ */
+ public static final String LAUNCH_LOCATION_APPS_SHARE_LEGACY = "share_legacy";
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java
index 62502ef60e96..6d960d7b9e21 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java
@@ -18,8 +18,8 @@ package com.android.systemui.car;
import android.content.Context;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
/** Auto-specific implementation of {@link NotificationInterruptionStateProvider}. */
public class CarNotificationInterruptionStateProvider extends
@@ -29,7 +29,7 @@ public class CarNotificationInterruptionStateProvider extends
}
@Override
- public boolean shouldHeadsUp(NotificationData.Entry entry) {
+ public boolean shouldHeadsUp(NotificationEntry entry) {
// Because space is usually constrained in the auto use-case, there should not be a
// pinned notification when the shade has been expanded. Ensure this by not pinning any
// notification if the shade is already opened.
diff --git a/packages/CarrierDefaultApp/tests/unit/Android.mk b/packages/CarrierDefaultApp/tests/unit/Android.mk
index 8e3785e7bda8..4c6388110ebf 100644
--- a/packages/CarrierDefaultApp/tests/unit/Android.mk
+++ b/packages/CarrierDefaultApp/tests/unit/Android.mk
@@ -21,7 +21,7 @@ LOCAL_CERTIFICATE := platform
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common android.test.base
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test mockito-target-minus-junit4
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules mockito-target-minus-junit4
# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/packages/CarrierDefaultApp/tests/unit/AndroidManifest.xml b/packages/CarrierDefaultApp/tests/unit/AndroidManifest.xml
index 3a06a09fbc7c..7a26d95551df 100644
--- a/packages/CarrierDefaultApp/tests/unit/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/tests/unit/AndroidManifest.xml
@@ -21,7 +21,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.carrierdefaultapp"
android:label="CarrierDefaultApp Unit Test Cases">
</instrumentation>
diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
index af52c00388f3..f346b00f85b8 100644
--- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java
+++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
@@ -286,6 +286,9 @@ public class Assistant extends NotificationAssistantService {
if (!isForCurrentUser(sbn)) {
return;
}
+
+ mAgingHelper.onNotificationRemoved(sbn.getKey());
+
boolean updatedImpressions = false;
String channelId = mLiveNotifications.remove(sbn.getKey()).getChannel().getId();
String key = getKey(sbn.getPackageName(), sbn.getUserId(), channelId);
@@ -341,7 +344,6 @@ public class Assistant extends NotificationAssistantService {
if (entry != null) {
entry.setSeen();
mAgingHelper.onNotificationSeen(entry);
- mSmartActionsHelper.onNotificationSeen(entry);
}
}
} catch (Throwable e) {
@@ -366,9 +368,9 @@ public class Assistant extends NotificationAssistantService {
}
@Override
- public void onNotificationDirectReply(@NonNull String key) {
- if (DEBUG) Log.i(TAG, "onNotificationDirectReply " + key);
- mSmartActionsHelper.onNotificationDirectReply(key);
+ public void onNotificationDirectReplied(@NonNull String key) {
+ if (DEBUG) Log.i(TAG, "onNotificationDirectReplied " + key);
+ mSmartActionsHelper.onNotificationDirectReplied(key);
}
@Override
@@ -382,11 +384,11 @@ public class Assistant extends NotificationAssistantService {
}
@Override
- public void onActionClicked(@NonNull String key, @NonNull Notification.Action action,
+ public void onActionInvoked(@NonNull String key, @NonNull Notification.Action action,
@Source int source) {
if (DEBUG) {
Log.d(TAG,
- "onActionClicked() called with: key = [" + key + "], action = [" + action.title
+ "onActionInvoked() called with: key = [" + key + "], action = [" + action.title
+ "], source = [" + source + "]");
}
mSmartActionsHelper.onActionClicked(key, action, source);
diff --git a/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
index 71fd9ce6e4af..ce2c409bd379 100644
--- a/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
+++ b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
@@ -27,7 +27,9 @@ import android.app.Notification;
import android.app.NotificationChannel;
import android.app.Person;
import android.app.RemoteInput;
+import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
import android.media.AudioAttributes;
import android.media.AudioSystem;
import android.os.Build;
@@ -67,8 +69,12 @@ public class NotificationEntry {
private boolean isPreChannelsNotification() {
try {
- mTargetSdkVersion = mPackageManager.getApplicationInfo(
- mSbn.getPackageName(), 0, mSbn.getUserId()).targetSdkVersion;
+ ApplicationInfo info = mPackageManager.getApplicationInfo(
+ mSbn.getPackageName(), PackageManager.MATCH_ALL,
+ mSbn.getUserId());
+ if (info != null) {
+ mTargetSdkVersion = info.targetSdkVersion;
+ }
} catch (RemoteException e) {
Log.w(TAG, "Couldn't look up " + mSbn.getPackageName());
}
@@ -230,10 +236,6 @@ public class NotificationEntry {
return mSeen;
}
- public boolean isExpanded() {
- return mExpanded;
- }
-
public boolean isShowActionEventLogged() {
return mIsShowActionEventLogged;
}
diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
index 56c415816558..0d528e7078f8 100644
--- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
+++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
@@ -27,6 +27,7 @@ import android.os.Process;
import android.service.notification.NotificationAssistantService;
import android.text.TextUtils;
import android.util.LruCache;
+import android.view.textclassifier.ConversationAction;
import android.view.textclassifier.ConversationActions;
import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationContext;
@@ -65,13 +66,13 @@ public class SmartActionsHelper {
private static final int MAX_MESSAGES_TO_EXTRACT = 5;
private static final int MAX_RESULT_ID_TO_CACHE = 20;
- private static final ConversationActions.TypeConfig TYPE_CONFIG =
- new ConversationActions.TypeConfig.Builder().setIncludedTypes(
- Collections.singletonList(ConversationActions.TYPE_TEXT_REPLY))
+ private static final TextClassifier.EntityConfig TYPE_CONFIG =
+ new TextClassifier.EntityConfig.Builder().setIncludedTypes(
+ Collections.singletonList(ConversationAction.TYPE_TEXT_REPLY))
.includeTypesFromTextClassifier(false)
.build();
private static final List<String> HINTS =
- Collections.singletonList(ConversationActions.HINT_FOR_NOTIFICATION);
+ Collections.singletonList(ConversationActions.Request.HINT_FOR_NOTIFICATION);
private Context mContext;
@Nullable
@@ -137,7 +138,7 @@ public class SmartActionsHelper {
ConversationActions conversationActionsResult =
mTextClassifier.suggestConversationActions(request);
- List<ConversationActions.ConversationAction> conversationActions =
+ List<ConversationAction> conversationActions =
conversationActionsResult.getConversationActions();
ArrayList<CharSequence> replies = conversationActions.stream()
.map(conversationAction -> conversationAction.getTextReply())
@@ -151,21 +152,29 @@ public class SmartActionsHelper {
return replies;
}
- void onNotificationSeen(@NonNull NotificationEntry entry) {
- if (entry.isExpanded()) {
- maybeSendActionShownEvent(entry);
- }
- }
-
void onNotificationExpansionChanged(@NonNull NotificationEntry entry, boolean isUserAction,
boolean isExpanded) {
- // Notification can be expanded in the background, and thus the isUserAction check.
- if (isUserAction && isExpanded) {
- maybeSendActionShownEvent(entry);
+ if (!isExpanded) {
+ return;
+ }
+ String resultId = mNotificationKeyToResultIdCache.get(entry.getSbn().getKey());
+ if (resultId == null) {
+ return;
+ }
+ // Only report if this is the first time the user sees these suggestions.
+ if (entry.isShowActionEventLogged()) {
+ return;
}
+ entry.setShowActionEventLogged();
+ TextClassifierEvent textClassifierEvent =
+ createTextClassifierEventBuilder(TextClassifierEvent.TYPE_ACTIONS_SHOWN,
+ resultId)
+ .build();
+ // TODO: If possible, report which replies / actions are actually seen by user.
+ mTextClassifier.onTextClassifierEvent(textClassifierEvent);
}
- void onNotificationDirectReply(@NonNull String key) {
+ void onNotificationDirectReplied(@NonNull String key) {
if (mTextClassifier == null) {
return;
}
@@ -193,7 +202,7 @@ public class SmartActionsHelper {
}
TextClassifierEvent textClassifierEvent =
createTextClassifierEventBuilder(TextClassifierEvent.TYPE_SMART_ACTION, resultId)
- .setEntityType(ConversationActions.TYPE_TEXT_REPLY)
+ .setEntityType(ConversationAction.TYPE_TEXT_REPLY)
.build();
mTextClassifier.onTextClassifierEvent(textClassifierEvent);
}
@@ -233,26 +242,6 @@ public class SmartActionsHelper {
.setResultId(resultId);
}
- private void maybeSendActionShownEvent(@NonNull NotificationEntry entry) {
- if (mTextClassifier == null) {
- return;
- }
- String resultId = mNotificationKeyToResultIdCache.get(entry.getSbn().getKey());
- if (resultId == null) {
- return;
- }
- // Only report if this is the first time the user sees these suggestions.
- if (entry.isShowActionEventLogged()) {
- return;
- }
- entry.setShowActionEventLogged();
- TextClassifierEvent textClassifierEvent =
- createTextClassifierEventBuilder(TextClassifierEvent.TYPE_ACTIONS_SHOWN, resultId)
- .build();
- // TODO: If possible, report which replies / actions are actually seen by user.
- mTextClassifier.onTextClassifierEvent(textClassifierEvent);
- }
-
/**
* Returns whether a notification is eligible for action adjustments.
*
@@ -383,8 +372,7 @@ public class SmartActionsHelper {
remoteAction.getIcon(),
remoteAction.getTitle(),
remoteAction.getActionIntent())
- .setSemanticAction(
- Notification.Action.SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION)
+ .setContextual(true)
.addExtras(Bundle.forPair(KEY_ACTION_TYPE, classification.getEntity(0)))
.build();
actions.add(action);
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionHelperTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionHelperTest.java
index da382a003621..707349b0fd15 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionHelperTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionHelperTest.java
@@ -32,6 +32,7 @@ import android.service.notification.NotificationAssistantService;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
+import android.view.textclassifier.ConversationAction;
import android.view.textclassifier.ConversationActions;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
@@ -65,9 +66,10 @@ public class SmartActionHelperTest {
private static final String NOTIFICATION_KEY = "key";
private static final String RESULT_ID = "id";
- private static final ConversationActions.ConversationAction REPLY_ACTION =
- new ConversationActions.ConversationAction.Builder(
- ConversationActions.TYPE_TEXT_REPLY).setTextReply("Home").build();
+ private static final ConversationAction REPLY_ACTION =
+ new ConversationAction.Builder(ConversationAction.TYPE_TEXT_REPLY)
+ .setTextReply("Home")
+ .build();
private SmartActionsHelper mSmartActionsHelper;
private Context mContext;
@@ -241,7 +243,7 @@ public class SmartActionHelperTest {
when(mNotificationEntry.getNotification()).thenReturn(notification);
mSmartActionsHelper.suggestReplies(mNotificationEntry);
- mSmartActionsHelper.onNotificationDirectReply(NOTIFICATION_KEY);
+ mSmartActionsHelper.onNotificationDirectReplied(NOTIFICATION_KEY);
ArgumentCaptor<TextClassifierEvent> argumentCaptor =
ArgumentCaptor.forClass(TextClassifierEvent.class);
@@ -271,24 +273,22 @@ public class SmartActionHelperTest {
final String message = "Where are you?";
Notification notification = mNotificationBuilder.setContentText(message).build();
when(mNotificationEntry.getNotification()).thenReturn(notification);
- when(mNotificationEntry.isExpanded()).thenReturn(false);
mSmartActionsHelper.suggestReplies(mNotificationEntry);
- mSmartActionsHelper.onNotificationSeen(mNotificationEntry);
+ mSmartActionsHelper.onNotificationExpansionChanged(mNotificationEntry, false, false);
verify(mTextClassifier, never()).onTextClassifierEvent(
Mockito.any(TextClassifierEvent.class));
}
@Test
- public void testOnNotificationsSeen_expanded() {
+ public void testOnNotifications_expanded() {
final String message = "Where are you?";
Notification notification = mNotificationBuilder.setContentText(message).build();
when(mNotificationEntry.getNotification()).thenReturn(notification);
- when(mNotificationEntry.isExpanded()).thenReturn(true);
mSmartActionsHelper.suggestReplies(mNotificationEntry);
- mSmartActionsHelper.onNotificationSeen(mNotificationEntry);
+ mSmartActionsHelper.onNotificationExpansionChanged(mNotificationEntry, false, true);
ArgumentCaptor<TextClassifierEvent> argumentCaptor =
ArgumentCaptor.forClass(TextClassifierEvent.class);
diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp
index 55bb5175c28d..2f7d599c68bf 100644
--- a/packages/NetworkStack/Android.bp
+++ b/packages/NetworkStack/Android.bp
@@ -21,7 +21,11 @@ java_library {
installable: true,
srcs: [
"src/**/*.java",
+ ":services-networkstack-shared-srcs",
],
+ static_libs: [
+ "dhcp-packet-lib",
+ ]
}
// Updatable network stack packaged as an application
diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml
index d1c5cb67197e..7f8bb93ae023 100644
--- a/packages/NetworkStack/AndroidManifest.xml
+++ b/packages/NetworkStack/AndroidManifest.xml
@@ -17,13 +17,17 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.android.networkstack"
+ package="com.android.mainline.networkstack"
android:sharedUserId="android.uid.networkstack">
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+ <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
+ <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<!-- Launch captive portal app as specific user -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+ <uses-permission android:name="android.permission.NETWORK_STACK" />
<application
android:label="NetworkStack"
android:defaultToDeviceProtectedStorage="true"
diff --git a/services/net/java/android/net/dhcp/DhcpLease.java b/packages/NetworkStack/src/android/net/dhcp/DhcpLease.java
index 6cdd2aa8579d..6849cfadc22a 100644
--- a/services/net/java/android/net/dhcp/DhcpLease.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpLease.java
@@ -58,6 +58,11 @@ public class DhcpLease {
mHostname = hostname;
}
+ /**
+ * Get the clientId associated with this lease, if any.
+ *
+ * <p>If the lease is not associated to a clientId, this returns null.
+ */
@Nullable
public byte[] getClientId() {
if (mClientId == null) {
@@ -97,6 +102,11 @@ public class DhcpLease {
(hostname == null ? mHostname : hostname));
}
+ /**
+ * Determine whether this lease matches a client with the specified parameters.
+ * @param clientId clientId of the client if any, or null otherwise.
+ * @param hwAddr Hardware address of the client.
+ */
public boolean matchesClient(@Nullable byte[] clientId, @NonNull MacAddress hwAddr) {
if (mClientId != null) {
return Arrays.equals(mClientId, clientId);
@@ -110,7 +120,7 @@ public class DhcpLease {
if (!(obj instanceof DhcpLease)) {
return false;
}
- final DhcpLease other = (DhcpLease)obj;
+ final DhcpLease other = (DhcpLease) obj;
return Arrays.equals(mClientId, other.mClientId)
&& mHwAddr.equals(other.mHwAddr)
&& mNetAddr.equals(other.mNetAddr)
diff --git a/services/net/java/android/net/dhcp/DhcpLeaseRepository.java b/packages/NetworkStack/src/android/net/dhcp/DhcpLeaseRepository.java
index 2dda42124c75..0d298de4f5f8 100644
--- a/services/net/java/android/net/dhcp/DhcpLeaseRepository.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpLeaseRepository.java
@@ -21,7 +21,8 @@ import static android.net.NetworkUtils.intToInet4AddressHTH;
import static android.net.NetworkUtils.prefixLengthToV4NetmaskIntHTH;
import static android.net.dhcp.DhcpLease.EXPIRATION_NEVER;
import static android.net.dhcp.DhcpLease.inet4AddrToString;
-import static android.net.util.NetworkConstants.IPV4_ADDR_BITS;
+
+import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_BITS;
import static java.lang.Math.min;
@@ -29,8 +30,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.IpPrefix;
import android.net.MacAddress;
-import android.net.util.SharedLog;
import android.net.dhcp.DhcpServer.Clock;
+import android.net.util.SharedLog;
import android.util.ArrayMap;
import java.net.Inet4Address;
@@ -117,7 +118,7 @@ class DhcpLeaseRepository {
*/
private final LinkedHashMap<Inet4Address, Long> mDeclinedAddrs = new LinkedHashMap<>();
- public DhcpLeaseRepository(@NonNull IpPrefix prefix, @NonNull Set<Inet4Address> reservedAddrs,
+ DhcpLeaseRepository(@NonNull IpPrefix prefix, @NonNull Set<Inet4Address> reservedAddrs,
long leaseTimeMs, @NonNull SharedLog log, @NonNull Clock clock) {
updateParams(prefix, reservedAddrs, leaseTimeMs);
mLog = log;
@@ -250,8 +251,8 @@ class DhcpLeaseRepository {
// reqAddr null (RENEWING/REBINDING): client renewing its own lease for clientAddr.
// reqAddr set with sid not set (INIT-REBOOT): client verifying configuration.
// In both cases, throw if clientAddr or reqAddr does not match the known lease.
- throw new InvalidAddressException("Incorrect address for client in " +
- (reqAddr != null ? "INIT-REBOOT" : "RENEWING/REBINDING"));
+ throw new InvalidAddressException("Incorrect address for client in "
+ + (reqAddr != null ? "INIT-REBOOT" : "RENEWING/REBINDING"));
}
}
diff --git a/services/net/java/android/net/dhcp/DhcpPacketListener.java b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
index 6f620c5ce30e..dce8b619494e 100644
--- a/services/net/java/android/net/dhcp/DhcpPacketListener.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
@@ -32,32 +32,32 @@ import java.net.InetSocketAddress;
*/
abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payload> {
static final class Payload {
- final byte[] bytes = new byte[DhcpPacket.MAX_LENGTH];
- Inet4Address srcAddr;
- int srcPort;
+ protected final byte[] mBytes = new byte[DhcpPacket.MAX_LENGTH];
+ protected Inet4Address mSrcAddr;
+ protected int mSrcPort;
}
- public DhcpPacketListener(@NonNull Handler handler) {
+ DhcpPacketListener(@NonNull Handler handler) {
super(handler, new Payload());
}
@Override
protected int recvBufSize(@NonNull Payload buffer) {
- return buffer.bytes.length;
+ return buffer.mBytes.length;
}
@Override
protected final void handlePacket(@NonNull Payload recvbuf, int length) {
- if (recvbuf.srcAddr == null) {
+ if (recvbuf.mSrcAddr == null) {
return;
}
try {
- final DhcpPacket packet = DhcpPacket.decodeFullPacket(recvbuf.bytes, length,
+ final DhcpPacket packet = DhcpPacket.decodeFullPacket(recvbuf.mBytes, length,
DhcpPacket.ENCAP_BOOTP);
- onReceive(packet, recvbuf.srcAddr, recvbuf.srcPort);
+ onReceive(packet, recvbuf.mSrcAddr, recvbuf.mSrcPort);
} catch (DhcpPacket.ParseException e) {
- logParseError(recvbuf.bytes, length, e);
+ logParseError(recvbuf.mBytes, length, e);
}
}
@@ -66,11 +66,11 @@ abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payl
throws Exception {
final InetSocketAddress addr = new InetSocketAddress();
final int read = Os.recvfrom(
- fd, packetBuffer.bytes, 0, packetBuffer.bytes.length, 0 /* flags */, addr);
+ fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr);
// Buffers with null srcAddr will be dropped in handlePacket()
- packetBuffer.srcAddr = inet4AddrOrNull(addr);
- packetBuffer.srcPort = addr.getPort();
+ packetBuffer.mSrcAddr = inet4AddrOrNull(addr);
+ packetBuffer.mSrcPort = addr.getPort();
return read;
}
diff --git a/services/net/java/android/net/dhcp/DhcpServer.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
index 35d29e75c0e4..14e293694ebd 100644
--- a/services/net/java/android/net/dhcp/DhcpServer.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
@@ -23,7 +23,8 @@ import static android.net.dhcp.DhcpPacket.DHCP_CLIENT;
import static android.net.dhcp.DhcpPacket.DHCP_HOST_NAME;
import static android.net.dhcp.DhcpPacket.DHCP_SERVER;
import static android.net.dhcp.DhcpPacket.ENCAP_BOOTP;
-import static android.net.dhcp.DhcpPacket.INFINITE_LEASE;
+import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static android.system.OsConstants.AF_INET;
import static android.system.OsConstants.IPPROTO_UDP;
import static android.system.OsConstants.SOCK_DGRAM;
@@ -32,21 +33,28 @@ import static android.system.OsConstants.SO_BINDTODEVICE;
import static android.system.OsConstants.SO_BROADCAST;
import static android.system.OsConstants.SO_REUSEADDR;
+import static com.android.server.util.NetworkStackConstants.INFINITE_LEASE;
+import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
+
import static java.lang.Integer.toUnsignedLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.net.INetworkStackStatusCallback;
import android.net.MacAddress;
import android.net.NetworkUtils;
import android.net.TrafficStats;
import android.net.util.SharedLog;
import android.os.Handler;
+import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
+import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.HexDump;
@@ -70,7 +78,7 @@ import java.util.ArrayList;
* on the looper asynchronously.
* @hide
*/
-public class DhcpServer {
+public class DhcpServer extends IDhcpServer.Stub {
private static final String REPO_TAG = "Repository";
// Lease time to transmit to client instead of a negative time in case a lease expired before
@@ -82,7 +90,7 @@ public class DhcpServer {
private static final int CMD_UPDATE_PARAMS = 3;
@NonNull
- private final ServerHandler mHandler;
+ private final HandlerThread mHandlerThread;
@NonNull
private final String mIfName;
@NonNull
@@ -93,14 +101,25 @@ public class DhcpServer {
private final Dependencies mDeps;
@NonNull
private final Clock mClock;
- @NonNull
- private final DhcpPacketListener mPacketListener;
@Nullable
+ private volatile ServerHandler mHandler;
+
+ // Accessed only on the handler thread
+ @Nullable
+ private DhcpPacketListener mPacketListener;
+ @Nullable
private FileDescriptor mSocket;
@NonNull
private DhcpServingParams mServingParams;
+ /**
+ * Clock to be used by DhcpServer to track time for lease expiration.
+ *
+ * <p>The clock should track time as may be measured by clients obtaining a lease. It does not
+ * need to be monotonous across restarts of the server as long as leases are cleared when the
+ * server is stopped.
+ */
public static class Clock {
/**
* @see SystemClock#elapsedRealtime()
@@ -110,15 +129,51 @@ public class DhcpServer {
}
}
+ /**
+ * Dependencies for the DhcpServer. Useful to be mocked in tests.
+ */
public interface Dependencies {
+ /**
+ * Send a packet to the specified datagram socket.
+ *
+ * @param fd File descriptor of the socket.
+ * @param buffer Data to be sent.
+ * @param dst Destination address of the packet.
+ */
void sendPacket(@NonNull FileDescriptor fd, @NonNull ByteBuffer buffer,
@NonNull InetAddress dst) throws ErrnoException, IOException;
+
+ /**
+ * Create a DhcpLeaseRepository for the server.
+ * @param servingParams Parameters used to serve DHCP requests.
+ * @param log Log to be used by the repository.
+ * @param clock Clock that the repository must use to track time.
+ */
DhcpLeaseRepository makeLeaseRepository(@NonNull DhcpServingParams servingParams,
@NonNull SharedLog log, @NonNull Clock clock);
+
+ /**
+ * Create a packet listener that will send packets to be processed.
+ */
DhcpPacketListener makePacketListener();
+
+ /**
+ * Create a clock that the server will use to track time.
+ */
Clock makeClock();
+
+ /**
+ * Add an entry to the ARP cache table.
+ * @param fd Datagram socket file descriptor that must use the new entry.
+ */
void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr,
@NonNull String ifname, @NonNull FileDescriptor fd) throws IOException;
+
+ /**
+ * Verify that the caller is allowed to call public methods on DhcpServer.
+ * @throws SecurityException The caller is not allowed to call public methods on DhcpServer.
+ */
+ void checkCaller() throws SecurityException;
}
private class DependenciesImpl implements Dependencies {
@@ -134,7 +189,7 @@ public class DhcpServer {
return new DhcpLeaseRepository(
DhcpServingParams.makeIpPrefix(servingParams.serverAddr),
servingParams.excludedAddrs,
- servingParams.dhcpLeaseTimeSecs*1000, log.forSubComponent(REPO_TAG), clock);
+ servingParams.dhcpLeaseTimeSecs * 1000, log.forSubComponent(REPO_TAG), clock);
}
@Override
@@ -152,6 +207,11 @@ public class DhcpServer {
@NonNull String ifname, @NonNull FileDescriptor fd) throws IOException {
NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
}
+
+ @Override
+ public void checkCaller() {
+ checkNetworkStackCallingPermission();
+ }
}
private static class MalformedPacketException extends Exception {
@@ -160,41 +220,62 @@ public class DhcpServer {
}
}
- public DhcpServer(@NonNull Looper looper, @NonNull String ifName,
+ public DhcpServer(@NonNull String ifName,
@NonNull DhcpServingParams params, @NonNull SharedLog log) {
- this(looper, ifName, params, log, null);
+ this(new HandlerThread(DhcpServer.class.getSimpleName() + "." + ifName),
+ ifName, params, log, null);
}
@VisibleForTesting
- DhcpServer(@NonNull Looper looper, @NonNull String ifName,
+ DhcpServer(@NonNull HandlerThread handlerThread, @NonNull String ifName,
@NonNull DhcpServingParams params, @NonNull SharedLog log,
@Nullable Dependencies deps) {
if (deps == null) {
deps = new DependenciesImpl();
}
- mHandler = new ServerHandler(looper);
+ mHandlerThread = handlerThread;
mIfName = ifName;
mServingParams = params;
mLog = log;
mDeps = deps;
mClock = deps.makeClock();
- mPacketListener = deps.makePacketListener();
mLeaseRepo = deps.makeLeaseRepository(mServingParams, mLog, mClock);
}
/**
* Start listening for and responding to packets.
+ *
+ * <p>It is not legal to call this method more than once; in particular the server cannot be
+ * restarted after being stopped.
*/
- public void start() {
- mHandler.sendEmptyMessage(CMD_START_DHCP_SERVER);
+ @Override
+ public void start(@Nullable INetworkStackStatusCallback cb) {
+ mDeps.checkCaller();
+ mHandlerThread.start();
+ mHandler = new ServerHandler(mHandlerThread.getLooper());
+ sendMessage(CMD_START_DHCP_SERVER, cb);
}
/**
* Update serving parameters. All subsequently received requests will be handled with the new
* parameters, and current leases that are incompatible with the new parameters are dropped.
*/
- public void updateParams(@NonNull DhcpServingParams params) {
- sendMessage(CMD_UPDATE_PARAMS, params);
+ @Override
+ public void updateParams(@Nullable DhcpServingParamsParcel params,
+ @Nullable INetworkStackStatusCallback cb) throws RemoteException {
+ mDeps.checkCaller();
+ final DhcpServingParams parsedParams;
+ try {
+ // throws InvalidParameterException with null params
+ parsedParams = DhcpServingParams.fromParcelableObject(params);
+ } catch (DhcpServingParams.InvalidParameterException e) {
+ mLog.e("Invalid parameters sent to DhcpServer", e);
+ if (cb != null) {
+ cb.onStatusAvailable(STATUS_INVALID_ARGUMENT);
+ }
+ return;
+ }
+ sendMessage(CMD_UPDATE_PARAMS, new Pair<>(parsedParams, cb));
}
/**
@@ -203,38 +284,63 @@ public class DhcpServer {
* <p>As the server is stopped asynchronously, some packets may still be processed shortly after
* calling this method.
*/
- public void stop() {
- mHandler.sendEmptyMessage(CMD_STOP_DHCP_SERVER);
+ @Override
+ public void stop(@Nullable INetworkStackStatusCallback cb) {
+ mDeps.checkCaller();
+ sendMessage(CMD_STOP_DHCP_SERVER, cb);
}
private void sendMessage(int what, @Nullable Object obj) {
+ if (mHandler == null) {
+ mLog.e("Attempting to send a command to stopped DhcpServer: " + what);
+ return;
+ }
mHandler.sendMessage(mHandler.obtainMessage(what, obj));
}
private class ServerHandler extends Handler {
- public ServerHandler(@NonNull Looper looper) {
+ ServerHandler(@NonNull Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
+ final INetworkStackStatusCallback cb;
switch (msg.what) {
case CMD_UPDATE_PARAMS:
- final DhcpServingParams params = (DhcpServingParams) msg.obj;
+ final Pair<DhcpServingParams, INetworkStackStatusCallback> pair =
+ (Pair<DhcpServingParams, INetworkStackStatusCallback>) msg.obj;
+ final DhcpServingParams params = pair.first;
mServingParams = params;
mLeaseRepo.updateParams(
DhcpServingParams.makeIpPrefix(mServingParams.serverAddr),
params.excludedAddrs,
params.dhcpLeaseTimeSecs);
+
+ cb = pair.second;
break;
case CMD_START_DHCP_SERVER:
- // This is a no-op if the listener is already started
+ mPacketListener = mDeps.makePacketListener();
mPacketListener.start();
+ cb = (INetworkStackStatusCallback) msg.obj;
break;
case CMD_STOP_DHCP_SERVER:
- // This is a no-op if the listener was not started
- mPacketListener.stop();
+ if (mPacketListener != null) {
+ mPacketListener.stop();
+ mPacketListener = null;
+ }
+ mHandlerThread.quitSafely();
+ cb = (INetworkStackStatusCallback) msg.obj;
break;
+ default:
+ return;
+ }
+ if (cb != null) {
+ try {
+ cb.onStatusAvailable(STATUS_SUCCESS);
+ } catch (RemoteException e) {
+ mLog.e("Could not send status back to caller", e);
+ }
}
}
}
@@ -496,22 +602,24 @@ public class DhcpServer {
}
private class PacketListener extends DhcpPacketListener {
- public PacketListener() {
+ PacketListener() {
super(mHandler);
}
@Override
- protected void onReceive(DhcpPacket packet, Inet4Address srcAddr, int srcPort) {
+ protected void onReceive(@NonNull DhcpPacket packet, @NonNull Inet4Address srcAddr,
+ int srcPort) {
processPacket(packet, srcPort);
}
@Override
- protected void logError(String msg, Exception e) {
+ protected void logError(@NonNull String msg, Exception e) {
mLog.e("Error receiving packet: " + msg, e);
}
@Override
- protected void logParseError(byte[] packet, int length, DhcpPacket.ParseException e) {
+ protected void logParseError(@NonNull byte[] packet, int length,
+ @NonNull DhcpPacket.ParseException e) {
mLog.e("Error parsing packet", e);
}
@@ -533,7 +641,7 @@ public class DhcpServer {
return mSocket;
} catch (IOException | ErrnoException e) {
mLog.e("Error creating UDP socket", e);
- DhcpServer.this.stop();
+ DhcpServer.this.stop(null);
return null;
} finally {
TrafficStats.setThreadStatsTag(oldTag);
diff --git a/services/net/java/android/net/dhcp/DhcpServingParams.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
index df15ba1c5507..f38888aafbd6 100644
--- a/services/net/java/android/net/dhcp/DhcpServingParams.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
@@ -17,13 +17,16 @@
package android.net.dhcp;
import static android.net.NetworkUtils.getPrefixMaskAsInet4Address;
-import static android.net.dhcp.DhcpPacket.INFINITE_LEASE;
-import static android.net.util.NetworkConstants.IPV4_MAX_MTU;
-import static android.net.util.NetworkConstants.IPV4_MIN_MTU;
+import static android.net.NetworkUtils.intToInet4AddressHTH;
+
+import static com.android.server.util.NetworkStackConstants.INFINITE_LEASE;
+import static com.android.server.util.NetworkStackConstants.IPV4_MAX_MTU;
+import static com.android.server.util.NetworkStackConstants.IPV4_MIN_MTU;
import static java.lang.Integer.toUnsignedLong;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.NetworkUtils;
@@ -103,6 +106,41 @@ public class DhcpServingParams {
this.metered = metered;
}
+ /**
+ * Create parameters from a stable AIDL-compatible parcel.
+ * @throws InvalidParameterException The parameters parcelable is null or invalid.
+ */
+ public static DhcpServingParams fromParcelableObject(@Nullable DhcpServingParamsParcel parcel)
+ throws InvalidParameterException {
+ if (parcel == null) {
+ throw new InvalidParameterException("Null serving parameters");
+ }
+ final LinkAddress serverAddr = new LinkAddress(
+ intToInet4AddressHTH(parcel.serverAddr),
+ parcel.serverAddrPrefixLength);
+ return new Builder()
+ .setServerAddr(serverAddr)
+ .setDefaultRouters(toInet4AddressSet(parcel.defaultRouters))
+ .setDnsServers(toInet4AddressSet(parcel.dnsServers))
+ .setExcludedAddrs(toInet4AddressSet(parcel.excludedAddrs))
+ .setDhcpLeaseTimeSecs(parcel.dhcpLeaseTimeSecs)
+ .setLinkMtu(parcel.linkMtu)
+ .setMetered(parcel.metered)
+ .build();
+ }
+
+ private static Set<Inet4Address> toInet4AddressSet(@Nullable int[] addrs) {
+ if (addrs == null) {
+ return new HashSet<>(0);
+ }
+
+ final HashSet<Inet4Address> res = new HashSet<>();
+ for (int addr : addrs) {
+ res.add(intToInet4AddressHTH(addr));
+ }
+ return res;
+ }
+
@NonNull
public Inet4Address getServerInet4Addr() {
return (Inet4Address) serverAddr.getAddress();
@@ -134,13 +172,13 @@ public class DhcpServingParams {
* of the parameters.
*/
public static class Builder {
- private LinkAddress serverAddr;
- private Set<Inet4Address> defaultRouters;
- private Set<Inet4Address> dnsServers;
- private Set<Inet4Address> excludedAddrs;
- private long dhcpLeaseTimeSecs;
- private int linkMtu = MTU_UNSET;
- private boolean metered;
+ private LinkAddress mServerAddr;
+ private Set<Inet4Address> mDefaultRouters;
+ private Set<Inet4Address> mDnsServers;
+ private Set<Inet4Address> mExcludedAddrs;
+ private long mDhcpLeaseTimeSecs;
+ private int mLinkMtu = MTU_UNSET;
+ private boolean mMetered;
/**
* Set the server address and served prefix for the DHCP server.
@@ -148,7 +186,7 @@ public class DhcpServingParams {
* <p>This parameter is required.
*/
public Builder setServerAddr(@NonNull LinkAddress serverAddr) {
- this.serverAddr = serverAddr;
+ this.mServerAddr = serverAddr;
return this;
}
@@ -159,7 +197,7 @@ public class DhcpServingParams {
* always be set explicitly before building the {@link DhcpServingParams}.
*/
public Builder setDefaultRouters(@NonNull Set<Inet4Address> defaultRouters) {
- this.defaultRouters = defaultRouters;
+ this.mDefaultRouters = defaultRouters;
return this;
}
@@ -189,7 +227,7 @@ public class DhcpServingParams {
* {@link DhcpServingParams}.
*/
public Builder setDnsServers(@NonNull Set<Inet4Address> dnsServers) {
- this.dnsServers = dnsServers;
+ this.mDnsServers = dnsServers;
return this;
}
@@ -219,7 +257,7 @@ public class DhcpServingParams {
* and do not need to be set here.
*/
public Builder setExcludedAddrs(@NonNull Set<Inet4Address> excludedAddrs) {
- this.excludedAddrs = excludedAddrs;
+ this.mExcludedAddrs = excludedAddrs;
return this;
}
@@ -239,7 +277,7 @@ public class DhcpServingParams {
* <p>This parameter is required.
*/
public Builder setDhcpLeaseTimeSecs(long dhcpLeaseTimeSecs) {
- this.dhcpLeaseTimeSecs = dhcpLeaseTimeSecs;
+ this.mDhcpLeaseTimeSecs = dhcpLeaseTimeSecs;
return this;
}
@@ -250,7 +288,7 @@ public class DhcpServingParams {
* is optional and defaults to {@link #MTU_UNSET}.
*/
public Builder setLinkMtu(int linkMtu) {
- this.linkMtu = linkMtu;
+ this.mLinkMtu = linkMtu;
return this;
}
@@ -260,7 +298,7 @@ public class DhcpServingParams {
* <p>If not set, the default value is false.
*/
public Builder setMetered(boolean metered) {
- this.metered = metered;
+ this.mMetered = metered;
return this;
}
@@ -274,54 +312,57 @@ public class DhcpServingParams {
*/
@NonNull
public DhcpServingParams build() throws InvalidParameterException {
- if (serverAddr == null) {
+ if (mServerAddr == null) {
throw new InvalidParameterException("Missing serverAddr");
}
- if (defaultRouters == null) {
+ if (mDefaultRouters == null) {
throw new InvalidParameterException("Missing defaultRouters");
}
- if (dnsServers == null) {
+ if (mDnsServers == null) {
// Empty set is OK, but enforce explicitly setting it
throw new InvalidParameterException("Missing dnsServers");
}
- if (dhcpLeaseTimeSecs <= 0 || dhcpLeaseTimeSecs > toUnsignedLong(INFINITE_LEASE)) {
- throw new InvalidParameterException("Invalid lease time: " + dhcpLeaseTimeSecs);
+ if (mDhcpLeaseTimeSecs <= 0 || mDhcpLeaseTimeSecs > toUnsignedLong(INFINITE_LEASE)) {
+ throw new InvalidParameterException("Invalid lease time: " + mDhcpLeaseTimeSecs);
}
- if (linkMtu != MTU_UNSET && (linkMtu < IPV4_MIN_MTU || linkMtu > IPV4_MAX_MTU)) {
- throw new InvalidParameterException("Invalid link MTU: " + linkMtu);
+ if (mLinkMtu != MTU_UNSET && (mLinkMtu < IPV4_MIN_MTU || mLinkMtu > IPV4_MAX_MTU)) {
+ throw new InvalidParameterException("Invalid link MTU: " + mLinkMtu);
}
- if (!serverAddr.isIPv4()) {
+ if (!mServerAddr.isIPv4()) {
throw new InvalidParameterException("serverAddr must be IPv4");
}
- if (serverAddr.getPrefixLength() < MIN_PREFIX_LENGTH
- || serverAddr.getPrefixLength() > MAX_PREFIX_LENGTH) {
+ if (mServerAddr.getPrefixLength() < MIN_PREFIX_LENGTH
+ || mServerAddr.getPrefixLength() > MAX_PREFIX_LENGTH) {
throw new InvalidParameterException("Prefix length is not in supported range");
}
- final IpPrefix prefix = makeIpPrefix(serverAddr);
- for (Inet4Address addr : defaultRouters) {
+ final IpPrefix prefix = makeIpPrefix(mServerAddr);
+ for (Inet4Address addr : mDefaultRouters) {
if (!prefix.contains(addr)) {
throw new InvalidParameterException(String.format(
- "Default router %s is not in server prefix %s", addr, serverAddr));
+ "Default router %s is not in server prefix %s", addr, mServerAddr));
}
}
final Set<Inet4Address> excl = new HashSet<>();
- if (excludedAddrs != null) {
- excl.addAll(excludedAddrs);
+ if (mExcludedAddrs != null) {
+ excl.addAll(mExcludedAddrs);
}
- excl.add((Inet4Address) serverAddr.getAddress());
- excl.addAll(defaultRouters);
- excl.addAll(dnsServers);
+ excl.add((Inet4Address) mServerAddr.getAddress());
+ excl.addAll(mDefaultRouters);
+ excl.addAll(mDnsServers);
- return new DhcpServingParams(serverAddr,
- Collections.unmodifiableSet(new HashSet<>(defaultRouters)),
- Collections.unmodifiableSet(new HashSet<>(dnsServers)),
+ return new DhcpServingParams(mServerAddr,
+ Collections.unmodifiableSet(new HashSet<>(mDefaultRouters)),
+ Collections.unmodifiableSet(new HashSet<>(mDnsServers)),
Collections.unmodifiableSet(excl),
- dhcpLeaseTimeSecs, linkMtu, metered);
+ mDhcpLeaseTimeSecs, mLinkMtu, mMetered);
}
}
+ /**
+ * Utility method to create an IpPrefix with the address and prefix length of a LinkAddress.
+ */
@NonNull
static IpPrefix makeIpPrefix(@NonNull LinkAddress addr) {
return new IpPrefix(addr.getAddress(), addr.getPrefixLength());
diff --git a/packages/NetworkStack/src/android/net/util/SharedLog.java b/packages/NetworkStack/src/android/net/util/SharedLog.java
new file mode 100644
index 000000000000..4fabf10bbd37
--- /dev/null
+++ b/packages/NetworkStack/src/android/net/util/SharedLog.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.StringJoiner;
+
+
+/**
+ * Class to centralize logging functionality for tethering.
+ *
+ * All access to class methods other than dump() must be on the same thread.
+ *
+ * @hide
+ */
+public class SharedLog {
+ private static final int DEFAULT_MAX_RECORDS = 500;
+ private static final String COMPONENT_DELIMITER = ".";
+
+ private enum Category {
+ NONE,
+ ERROR,
+ MARK,
+ WARN,
+ };
+
+ private final LocalLog mLocalLog;
+ // The tag to use for output to the system log. This is not output to the
+ // LocalLog because that would be redundant.
+ private final String mTag;
+ // The component (or subcomponent) of a system that is sharing this log.
+ // This can grow in depth if components call forSubComponent() to obtain
+ // their SharedLog instance. The tag is not included in the component for
+ // brevity.
+ private final String mComponent;
+
+ public SharedLog(String tag) {
+ this(DEFAULT_MAX_RECORDS, tag);
+ }
+
+ public SharedLog(int maxRecords, String tag) {
+ this(new LocalLog(maxRecords), tag, tag);
+ }
+
+ private SharedLog(LocalLog localLog, String tag, String component) {
+ mLocalLog = localLog;
+ mTag = tag;
+ mComponent = component;
+ }
+
+ public String getTag() {
+ return mTag;
+ }
+
+ /**
+ * Create a SharedLog based on this log with an additional component prefix on each logged line.
+ */
+ public SharedLog forSubComponent(String component) {
+ if (!isRootLogInstance()) {
+ component = mComponent + COMPONENT_DELIMITER + component;
+ }
+ return new SharedLog(mLocalLog, mTag, component);
+ }
+
+ /**
+ * Dump the contents of this log.
+ *
+ * <p>This method may be called on any thread.
+ */
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ mLocalLog.readOnlyLocalLog().dump(fd, writer, args);
+ }
+
+ //////
+ // Methods that both log an entry and emit it to the system log.
+ //////
+
+ /**
+ * Log an error due to an exception. This does not include the exception stacktrace.
+ *
+ * <p>The log entry will be also added to the system log.
+ * @see #e(String, Throwable)
+ */
+ public void e(Exception e) {
+ Log.e(mTag, record(Category.ERROR, e.toString()));
+ }
+
+ /**
+ * Log an error message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
+ public void e(String msg) {
+ Log.e(mTag, record(Category.ERROR, msg));
+ }
+
+ /**
+ * Log an error due to an exception, with the exception stacktrace if provided.
+ *
+ * <p>The error and exception message appear in the shared log, but the stacktrace is only
+ * logged in general log output (logcat). The log entry will be also added to the system log.
+ */
+ public void e(@NonNull String msg, @Nullable Throwable exception) {
+ if (exception == null) {
+ e(msg);
+ return;
+ }
+ Log.e(mTag, record(Category.ERROR, msg + ": " + exception.getMessage()), exception);
+ }
+
+ /**
+ * Log an informational message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
+ public void i(String msg) {
+ Log.i(mTag, record(Category.NONE, msg));
+ }
+
+ /**
+ * Log a warning message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
+ public void w(String msg) {
+ Log.w(mTag, record(Category.WARN, msg));
+ }
+
+ //////
+ // Methods that only log an entry (and do NOT emit to the system log).
+ //////
+
+ /**
+ * Log a general message to be only included in the in-memory log.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ */
+ public void log(String msg) {
+ record(Category.NONE, msg);
+ }
+
+ /**
+ * Log a general, formatted message to be only included in the in-memory log.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ * @see String#format(String, Object...)
+ */
+ public void logf(String fmt, Object... args) {
+ log(String.format(fmt, args));
+ }
+
+ /**
+ * Log a message with MARK level.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ */
+ public void mark(String msg) {
+ record(Category.MARK, msg);
+ }
+
+ private String record(Category category, String msg) {
+ final String entry = logLine(category, msg);
+ mLocalLog.log(entry);
+ return entry;
+ }
+
+ private String logLine(Category category, String msg) {
+ final StringJoiner sj = new StringJoiner(" ");
+ if (!isRootLogInstance()) sj.add("[" + mComponent + "]");
+ if (category != Category.NONE) sj.add(category.toString());
+ return sj.add(msg).toString();
+ }
+
+ // Check whether this SharedLog instance is nominally the top level in
+ // a potential hierarchy of shared logs (the root of a tree),
+ // or is a subcomponent within the hierarchy.
+ private boolean isRootLogInstance() {
+ return TextUtils.isEmpty(mComponent) || mComponent.equals(mTag);
+ }
+}
diff --git a/services/net/java/android/net/util/Stopwatch.java b/packages/NetworkStack/src/android/net/util/Stopwatch.java
index cb15ee580a73..c3166999cdca 100644
--- a/services/net/java/android/net/util/Stopwatch.java
+++ b/packages/NetworkStack/src/android/net/util/Stopwatch.java
@@ -38,9 +38,9 @@ public class Stopwatch {
return (isStarted() && !isStopped());
}
- // Returning |this| makes possible the following usage pattern:
- //
- // Stopwatch s = new Stopwatch().start();
+ /**
+ * Start the Stopwatch.
+ */
public Stopwatch start() {
if (!isStarted()) {
mStartTimeMs = SystemClock.elapsedRealtime();
@@ -48,7 +48,10 @@ public class Stopwatch {
return this;
}
- // Returns the total time recorded, in milliseconds, or 0 if not started.
+ /**
+ * Stop the Stopwatch.
+ * @return the total time recorded, in milliseconds, or 0 if not started.
+ */
public long stop() {
if (isRunning()) {
mStopTimeMs = SystemClock.elapsedRealtime();
@@ -57,9 +60,11 @@ public class Stopwatch {
return (mStopTimeMs - mStartTimeMs);
}
- // Returns the total time recorded to date, in milliseconds.
- // If the Stopwatch is not running, returns the same value as stop(),
- // i.e. either the total time recorded before stopping or 0.
+ /**
+ * Return the total time recorded to date, in milliseconds.
+ * If the Stopwatch is not running, returns the same value as stop(),
+ * i.e. either the total time recorded before stopping or 0.
+ */
public long lap() {
if (isRunning()) {
return (SystemClock.elapsedRealtime() - mStartTimeMs);
@@ -68,6 +73,9 @@ public class Stopwatch {
}
}
+ /**
+ * Reset the Stopwatch. It will be stopped when this method returns.
+ */
public void reset() {
mStartTimeMs = 0;
mStopTimeMs = 0;
diff --git a/packages/NetworkStack/src/com/android/server/NetworkStackService.java b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
index 5afaf586f74d..cca71e759bdd 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkStackService.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
@@ -16,18 +16,41 @@
package com.android.server;
-import static android.os.Binder.getCallingUid;
+import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
+import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
+
+import static com.android.server.util.PermissionUtil.checkDumpPermission;
+import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Service;
+import android.content.Context;
import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.INetworkMonitor;
+import android.net.INetworkMonitorCallbacks;
import android.net.INetworkStackConnector;
+import android.net.Network;
+import android.net.NetworkRequest;
+import android.net.PrivateDnsConfigParcel;
+import android.net.dhcp.DhcpServer;
+import android.net.dhcp.DhcpServingParams;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServerCallbacks;
+import android.net.shared.PrivateDnsConfig;
+import android.net.util.SharedLog;
import android.os.IBinder;
-import android.os.Process;
+import android.os.RemoteException;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.connectivity.NetworkMonitor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayDeque;
/**
* Android service used to start the network stack when bound to via an intent.
@@ -43,32 +66,163 @@ public class NetworkStackService extends Service {
* <p>On platforms where the network stack runs in the system server process, this method may
* be called directly instead of obtaining the connector by binding to the service.
*/
- public static IBinder makeConnector() {
- return new NetworkStackConnector();
+ public static IBinder makeConnector(Context context) {
+ return new NetworkStackConnector(context);
}
@NonNull
@Override
public IBinder onBind(Intent intent) {
- return makeConnector();
+ return makeConnector(this);
}
private static class NetworkStackConnector extends INetworkStackConnector.Stub {
- // TODO: makeDhcpServer(), etc. will go here.
+ private static final int NUM_VALIDATION_LOG_LINES = 20;
+ private final Context mContext;
+ private final ConnectivityManager mCm;
+
+ private static final int MAX_VALIDATION_LOGS = 10;
+ @GuardedBy("mValidationLogs")
+ private final ArrayDeque<SharedLog> mValidationLogs = new ArrayDeque<>(MAX_VALIDATION_LOGS);
+
+ private SharedLog addValidationLogs(Network network, String name) {
+ final SharedLog log = new SharedLog(NUM_VALIDATION_LOG_LINES, network + " - " + name);
+ synchronized (mValidationLogs) {
+ while (mValidationLogs.size() >= MAX_VALIDATION_LOGS) {
+ mValidationLogs.removeLast();
+ }
+ mValidationLogs.addFirst(log);
+ }
+ return log;
+ }
+
+ NetworkStackConnector(Context context) {
+ mContext = context;
+ mCm = context.getSystemService(ConnectivityManager.class);
+ }
+
+ @NonNull
+ private final SharedLog mLog = new SharedLog(TAG);
+
+ @Override
+ public void makeDhcpServer(@NonNull String ifName, @NonNull DhcpServingParamsParcel params,
+ @NonNull IDhcpServerCallbacks cb) throws RemoteException {
+ checkNetworkStackCallingPermission();
+ final DhcpServer server;
+ try {
+ server = new DhcpServer(
+ ifName,
+ DhcpServingParams.fromParcelableObject(params),
+ mLog.forSubComponent(ifName + ".DHCP"));
+ } catch (DhcpServingParams.InvalidParameterException e) {
+ mLog.e("Invalid DhcpServingParams", e);
+ cb.onDhcpServerCreated(STATUS_INVALID_ARGUMENT, null);
+ return;
+ } catch (Exception e) {
+ mLog.e("Unknown error starting DhcpServer", e);
+ cb.onDhcpServerCreated(STATUS_UNKNOWN_ERROR, null);
+ return;
+ }
+ cb.onDhcpServerCreated(STATUS_SUCCESS, server);
+ }
+
+ @Override
+ public void makeNetworkMonitor(int netId, String name, INetworkMonitorCallbacks cb)
+ throws RemoteException {
+ final Network network = new Network(netId, false /* privateDnsBypass */);
+ final NetworkRequest defaultRequest = mCm.getDefaultRequest();
+ final SharedLog log = addValidationLogs(network, name);
+ final NetworkMonitor nm = new NetworkMonitor(
+ mContext, cb, network, defaultRequest, log);
+ cb.onNetworkMonitorCreated(new NetworkMonitorImpl(nm));
+ }
@Override
protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
@Nullable String[] args) {
- checkCaller();
- fout.println("NetworkStack logs:");
- // TODO: dump logs here
+ checkDumpPermission();
+ final IndentingPrintWriter pw = new IndentingPrintWriter(fout, " ");
+ pw.println("NetworkStack logs:");
+ mLog.dump(fd, pw, args);
+
+ pw.println();
+ pw.println("Validation logs (most recent first):");
+ synchronized (mValidationLogs) {
+ for (SharedLog p : mValidationLogs) {
+ pw.println(p.getTag());
+ pw.increaseIndent();
+ p.dump(fd, pw, args);
+ pw.decreaseIndent();
+ }
+ }
}
}
- private static void checkCaller() {
- // TODO: check that the calling PID is the system server.
- if (getCallingUid() != Process.SYSTEM_UID && getCallingUid() != Process.ROOT_UID) {
- throw new SecurityException("Invalid caller: " + getCallingUid());
+ private static class NetworkMonitorImpl extends INetworkMonitor.Stub {
+ private final NetworkMonitor mNm;
+
+ NetworkMonitorImpl(NetworkMonitor nm) {
+ mNm = nm;
+ }
+
+ @Override
+ public void start() {
+ checkNetworkStackCallingPermission();
+ mNm.start();
+ }
+
+ @Override
+ public void launchCaptivePortalApp() {
+ checkNetworkStackCallingPermission();
+ mNm.launchCaptivePortalApp();
+ }
+
+ @Override
+ public void forceReevaluation(int uid) {
+ checkNetworkStackCallingPermission();
+ mNm.forceReevaluation(uid);
+ }
+
+ @Override
+ public void notifyPrivateDnsChanged(PrivateDnsConfigParcel config) {
+ checkNetworkStackCallingPermission();
+ mNm.notifyPrivateDnsSettingsChanged(PrivateDnsConfig.fromParcel(config));
+ }
+
+ @Override
+ public void notifyDnsResponse(int returnCode) {
+ checkNetworkStackCallingPermission();
+ mNm.notifyDnsResponse(returnCode);
+ }
+
+ @Override
+ public void notifySystemReady() {
+ checkNetworkStackCallingPermission();
+ mNm.notifySystemReady();
+ }
+
+ @Override
+ public void notifyNetworkConnected() {
+ checkNetworkStackCallingPermission();
+ mNm.notifyNetworkConnected();
+ }
+
+ @Override
+ public void notifyNetworkDisconnected() {
+ checkNetworkStackCallingPermission();
+ mNm.notifyNetworkDisconnected();
+ }
+
+ @Override
+ public void notifyLinkPropertiesChanged() {
+ checkNetworkStackCallingPermission();
+ mNm.notifyLinkPropertiesChanged();
+ }
+
+ @Override
+ public void notifyNetworkCapabilitiesChanged() {
+ checkNetworkStackCallingPermission();
+ mNm.notifyNetworkCapabilitiesChanged();
}
}
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
index 9684f4c4ae19..4077d93d700b 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
@@ -21,6 +21,11 @@ import static android.net.CaptivePortal.APP_RETURN_UNWANTED;
import static android.net.CaptivePortal.APP_RETURN_WANTED_AS_IS;
import static android.net.ConnectivityManager.EXTRA_CAPTIVE_PORTAL_PROBE_SPEC;
import static android.net.ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.metrics.ValidationProbeEvent.DNS_FAILURE;
import static android.net.metrics.ValidationProbeEvent.DNS_SUCCESS;
import static android.net.metrics.ValidationProbeEvent.PROBE_FALLBACK;
@@ -35,6 +40,9 @@ import android.content.IntentFilter;
import android.net.CaptivePortal;
import android.net.ConnectivityManager;
import android.net.ICaptivePortal;
+import android.net.INetworkMonitor;
+import android.net.INetworkMonitorCallbacks;
+import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
@@ -46,11 +54,14 @@ import android.net.captiveportal.CaptivePortalProbeSpec;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.NetworkEvent;
import android.net.metrics.ValidationProbeEvent;
+import android.net.shared.NetworkMonitorUtils;
+import android.net.shared.PrivateDnsConfig;
+import android.net.util.SharedLog;
import android.net.util.Stopwatch;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.os.Handler;
import android.os.Message;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
@@ -65,8 +76,6 @@ import android.telephony.CellInfoLte;
import android.telephony.CellInfoWcdma;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.util.LocalLog;
-import android.util.LocalLog.ReadOnlyLocalLog;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -75,7 +84,6 @@ import com.android.internal.util.Protocol;
import com.android.internal.util.RingBufferIndices;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
-import com.android.server.connectivity.DnsManager.PrivateDnsConfig;
import java.io.IOException;
import java.net.HttpURLConnection;
@@ -104,9 +112,7 @@ public class NetworkMonitor extends StateMachine {
// Default configuration values for captive portal detection probes.
// TODO: append a random length parameter to the default HTTPS url.
// TODO: randomize browser version ids in the default User-Agent String.
- private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204";
- private static final String DEFAULT_HTTP_URL =
- "http://connectivitycheck.gstatic.com/generate_204";
+ private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204";
private static final String DEFAULT_FALLBACK_URL = "http://www.google.com/gen_204";
private static final String DEFAULT_OTHER_FALLBACK_URLS =
"http://play.googleapis.com/generate_204";
@@ -126,51 +132,30 @@ public class NetworkMonitor extends StateMachine {
private static final int DEFAULT_DATA_STALL_EVALUATION_TYPES =
(1 << DATA_STALL_EVALUATION_TYPE_DNS);
- static enum EvaluationResult {
+ enum EvaluationResult {
VALIDATED(true),
CAPTIVE_PORTAL(false);
- final boolean isValidated;
+ final boolean mIsValidated;
EvaluationResult(boolean isValidated) {
- this.isValidated = isValidated;
+ this.mIsValidated = isValidated;
}
}
- static enum ValidationStage {
+ enum ValidationStage {
FIRST_VALIDATION(true),
REVALIDATION(false);
- final boolean isFirstValidation;
+ final boolean mIsFirstValidation;
ValidationStage(boolean isFirstValidation) {
- this.isFirstValidation = isFirstValidation;
+ this.mIsFirstValidation = isFirstValidation;
}
}
- // After a network has been tested this result can be sent with EVENT_NETWORK_TESTED.
- // The network should be used as a default internet connection. It was found to be:
- // 1. a functioning network providing internet access, or
- // 2. a captive portal and the user decided to use it as is.
- public static final int NETWORK_TEST_RESULT_VALID = 0;
- // After a network has been tested this result can be sent with EVENT_NETWORK_TESTED.
- // The network should not be used as a default internet connection. It was found to be:
- // 1. a captive portal and the user is prompted to sign-in, or
- // 2. a captive portal and the user did not want to use it, or
- // 3. a broken network (e.g. DNS failed, connect failed, HTTP request failed).
- public static final int NETWORK_TEST_RESULT_INVALID = 1;
-
private static final int BASE = Protocol.BASE_NETWORK_MONITOR;
-
/**
- * Inform NetworkMonitor that their network is connected.
+ * ConnectivityService has sent a notification to indicate that network has connected.
* Initiates Network Validation.
*/
- public static final int CMD_NETWORK_CONNECTED = BASE + 1;
-
- /**
- * Inform ConnectivityService that the network has been tested.
- * obj = String representing URL that Internet probe was redirect to, if it was redirected.
- * arg1 = One of the NETWORK_TESTED_RESULT_* constants.
- * arg2 = NetID.
- */
- public static final int EVENT_NETWORK_TESTED = BASE + 2;
+ private static final int CMD_NETWORK_CONNECTED = BASE + 1;
/**
* Message to self indicating it's time to evaluate a network's connectivity.
@@ -179,9 +164,9 @@ public class NetworkMonitor extends StateMachine {
private static final int CMD_REEVALUATE = BASE + 6;
/**
- * Inform NetworkMonitor that the network has disconnected.
+ * ConnectivityService has sent a notification to indicate that network has disconnected.
*/
- public static final int CMD_NETWORK_DISCONNECTED = BASE + 7;
+ private static final int CMD_NETWORK_DISCONNECTED = BASE + 7;
/**
* Force evaluation even if it has succeeded in the past.
@@ -199,21 +184,13 @@ public class NetworkMonitor extends StateMachine {
private static final int CMD_CAPTIVE_PORTAL_APP_FINISHED = BASE + 9;
/**
- * Request ConnectivityService display provisioning notification.
- * arg1 = Whether to make the notification visible.
- * arg2 = NetID.
- * obj = Intent to be launched when notification selected by user, null if !arg1.
- */
- public static final int EVENT_PROVISIONING_NOTIFICATION = BASE + 10;
-
- /**
* Message indicating sign-in app should be launched.
* Sent by mLaunchCaptivePortalAppBroadcastReceiver when the
* user touches the sign in notification, or sent by
* ConnectivityService when the user touches the "sign into
* network" button in the wifi access point detail page.
*/
- public static final int CMD_LAUNCH_CAPTIVE_PORTAL_APP = BASE + 11;
+ private static final int CMD_LAUNCH_CAPTIVE_PORTAL_APP = BASE + 11;
/**
* Retest network to see if captive portal is still in place.
@@ -234,7 +211,6 @@ public class NetworkMonitor extends StateMachine {
* validation phase is completed.
*/
private static final int CMD_PRIVATE_DNS_SETTINGS_CHANGED = BASE + 13;
- public static final int EVENT_PRIVATE_DNS_CONFIG_RESOLVED = BASE + 14;
private static final int CMD_EVALUATE_PRIVATE_DNS = BASE + 15;
/**
@@ -251,7 +227,7 @@ public class NetworkMonitor extends StateMachine {
// Start mReevaluateDelayMs at this value and double.
private static final int INITIAL_REEVALUATE_DELAY_MS = 1000;
- private static final int MAX_REEVALUATE_DELAY_MS = 10*60*1000;
+ private static final int MAX_REEVALUATE_DELAY_MS = 10 * 60 * 1000;
// Before network has been evaluated this many times, ignore repeated reevaluate requests.
private static final int IGNORE_REEVALUATE_ATTEMPTS = 5;
private int mReevaluateToken = 0;
@@ -261,25 +237,18 @@ public class NetworkMonitor extends StateMachine {
// Stop blaming UID that requested re-evaluation after this many attempts.
private static final int BLAME_FOR_EVALUATION_ATTEMPTS = 5;
// Delay between reevaluations once a captive portal has been found.
- private static final int CAPTIVE_PORTAL_REEVALUATE_DELAY_MS = 10*60*1000;
-
- private static final int NUM_VALIDATION_LOG_LINES = 20;
+ private static final int CAPTIVE_PORTAL_REEVALUATE_DELAY_MS = 10 * 60 * 1000;
private String mPrivateDnsProviderHostname = "";
- public static boolean isValidationRequired(
- NetworkCapabilities dfltNetCap, NetworkCapabilities nc) {
- // TODO: Consider requiring validation for DUN networks.
- return dfltNetCap.satisfiedByNetworkCapabilities(nc);
- }
-
private final Context mContext;
- private final Handler mConnectivityServiceHandler;
- private final NetworkAgentInfo mNetworkAgentInfo;
+ private final INetworkMonitorCallbacks mCallback;
private final Network mNetwork;
+ private final Network mNonPrivateDnsBypassNetwork;
private final int mNetId;
private final TelephonyManager mTelephonyManager;
private final WifiManager mWifiManager;
+ private final ConnectivityManager mCm;
private final NetworkRequest mDefaultRequest;
private final IpConnectivityLog mMetricsLog;
private final Dependencies mDependencies;
@@ -292,6 +261,9 @@ public class NetworkMonitor extends StateMachine {
@Nullable
private final CaptivePortalProbeSpec[] mCaptivePortalFallbackSpecs;
+ private NetworkCapabilities mNetworkCapabilities;
+ private LinkProperties mLinkProperties;
+
@VisibleForTesting
protected boolean mIsCaptivePortalCheckEnabled;
@@ -304,7 +276,7 @@ public class NetworkMonitor extends StateMachine {
// Avoids surfacing "Sign in to network" notification.
private boolean mDontDisplaySigninNotification = false;
- public boolean systemReady = false;
+ private volatile boolean mSystemReady = false;
private final State mDefaultState = new DefaultState();
private final State mValidatedState = new ValidatedState();
@@ -317,7 +289,7 @@ public class NetworkMonitor extends StateMachine {
private CustomIntentReceiver mLaunchCaptivePortalAppBroadcastReceiver = null;
- private final LocalLog validationLogs = new LocalLog(NUM_VALIDATION_LOG_LINES);
+ private final SharedLog mValidationLogs;
private final Stopwatch mEvaluationTimer = new Stopwatch();
@@ -328,6 +300,7 @@ public class NetworkMonitor extends StateMachine {
private final Random mRandom;
private int mNextFallbackUrlIndex = 0;
+
private int mReevaluateDelayMs = INITIAL_REEVALUATE_DELAY_MS;
private int mEvaluateAttempts = 0;
private volatile int mProbeToken = 0;
@@ -338,17 +311,18 @@ public class NetworkMonitor extends StateMachine {
private final DnsStallDetector mDnsStallDetector;
private long mLastProbeTime;
- public NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo,
- NetworkRequest defaultRequest) {
- this(context, handler, networkAgentInfo, defaultRequest, new IpConnectivityLog(),
+ public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
+ NetworkRequest defaultRequest, SharedLog validationLog) {
+ this(context, cb, network, defaultRequest, new IpConnectivityLog(), validationLog,
Dependencies.DEFAULT);
}
@VisibleForTesting
- protected NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo,
- NetworkRequest defaultRequest, IpConnectivityLog logger, Dependencies deps) {
+ protected NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
+ NetworkRequest defaultRequest, IpConnectivityLog logger, SharedLog validationLogs,
+ Dependencies deps) {
// Add suffix indicating which NetworkMonitor we're talking about.
- super(TAG + networkAgentInfo.name());
+ super(TAG + "/" + network.netId);
// Logs with a tag of the form given just above, e.g.
// <timestamp> 862 2402 D NetworkMonitor/NetworkAgentInfo [WIFI () - 100]: ...
@@ -356,15 +330,18 @@ public class NetworkMonitor extends StateMachine {
mContext = context;
mMetricsLog = logger;
- mConnectivityServiceHandler = handler;
+ mValidationLogs = validationLogs;
+ mCallback = cb;
mDependencies = deps;
- mNetworkAgentInfo = networkAgentInfo;
- mNetwork = deps.getNetwork(networkAgentInfo).getPrivateDnsBypassingCopy();
+ mNonPrivateDnsBypassNetwork = network;
+ mNetwork = deps.getPrivateDnsBypassNetwork(network);
mNetId = mNetwork.netId;
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mDefaultRequest = defaultRequest;
+ // CHECKSTYLE:OFF IndentationCheck
addState(mDefaultState);
addState(mMaybeNotifyState, mDefaultState);
addState(mEvaluatingState, mMaybeNotifyState);
@@ -374,12 +351,13 @@ public class NetworkMonitor extends StateMachine {
addState(mEvaluatingPrivateDnsState, mDefaultState);
addState(mValidatedState, mDefaultState);
setInitialState(mDefaultState);
+ // CHECKSTYLE:ON IndentationCheck
mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled();
mUseHttps = getUseHttpsValidation();
mCaptivePortalUserAgent = getCaptivePortalUserAgent();
mCaptivePortalHttpsUrl = makeURL(getCaptivePortalServerHttpsUrl());
- mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl(deps, context));
+ mCaptivePortalHttpUrl = makeURL(deps.getCaptivePortalServerHttpUrl(context));
mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls();
mCaptivePortalFallbackSpecs = makeCaptivePortalFallbackProbeSpecs();
mRandom = deps.getRandom();
@@ -390,13 +368,34 @@ public class NetworkMonitor extends StateMachine {
mDataStallValidDnsTimeThreshold = getDataStallValidDnsTimeThreshold();
mDataStallEvaluationType = getDataStallEvalutionType();
- start();
+ // mLinkProperties and mNetworkCapbilities must never be null or we will NPE.
+ // Provide empty objects in case we are started and the network disconnects before
+ // we can ever fetch them.
+ // TODO: Delete ASAP.
+ mLinkProperties = new LinkProperties();
+ mNetworkCapabilities = new NetworkCapabilities();
+ mNetworkCapabilities.clearAll();
}
+ /**
+ * Request the NetworkMonitor to reevaluate the network.
+ */
public void forceReevaluation(int responsibleUid) {
sendMessage(CMD_FORCE_REEVALUATION, responsibleUid, 0);
}
+ /**
+ * Send a notification to NetworkMonitor indicating that there was a DNS query response event.
+ * @param returnCode the DNS return code of the response.
+ */
+ public void notifyDnsResponse(int returnCode) {
+ sendMessage(EVENT_DNS_NOTIFICATION, returnCode);
+ }
+
+ /**
+ * Send a notification to NetworkMonitor indicating that private DNS settings have changed.
+ * @param newCfg The new private DNS configuration.
+ */
public void notifyPrivateDnsSettingsChanged(PrivateDnsConfig newCfg) {
// Cancel any outstanding resolutions.
removeMessages(CMD_PRIVATE_DNS_SETTINGS_CHANGED);
@@ -404,9 +403,75 @@ public class NetworkMonitor extends StateMachine {
sendMessage(CMD_PRIVATE_DNS_SETTINGS_CHANGED, newCfg);
}
+ /**
+ * Send a notification to NetworkMonitor indicating that the system is ready.
+ */
+ public void notifySystemReady() {
+ // No need to run on the handler thread: mSystemReady is volatile and read only once on the
+ // isCaptivePortal() thread.
+ mSystemReady = true;
+ }
+
+ /**
+ * Send a notification to NetworkMonitor indicating that the network is now connected.
+ */
+ public void notifyNetworkConnected() {
+ sendMessage(CMD_NETWORK_CONNECTED);
+ }
+
+ /**
+ * Send a notification to NetworkMonitor indicating that the network is now disconnected.
+ */
+ public void notifyNetworkDisconnected() {
+ sendMessage(CMD_NETWORK_DISCONNECTED);
+ }
+
+ /**
+ * Send a notification to NetworkMonitor indicating that link properties have changed.
+ */
+ public void notifyLinkPropertiesChanged() {
+ getHandler().post(() -> {
+ updateLinkProperties();
+ });
+ }
+
+ private void updateLinkProperties() {
+ final LinkProperties lp = mCm.getLinkProperties(mNetwork);
+ // If null, we should soon get a message that the network was disconnected, and will stop.
+ if (lp != null) {
+ // TODO: send LinkProperties parceled in notifyLinkPropertiesChanged() and start().
+ mLinkProperties = lp;
+ }
+ }
+
+ /**
+ * Send a notification to NetworkMonitor indicating that network capabilities have changed.
+ */
+ public void notifyNetworkCapabilitiesChanged() {
+ getHandler().post(() -> {
+ updateNetworkCapabilities();
+ });
+ }
+
+ private void updateNetworkCapabilities() {
+ final NetworkCapabilities nc = mCm.getNetworkCapabilities(mNetwork);
+ // If null, we should soon get a message that the network was disconnected, and will stop.
+ if (nc != null) {
+ // TODO: send NetworkCapabilities parceled in notifyNetworkCapsChanged() and start().
+ mNetworkCapabilities = nc;
+ }
+ }
+
+ /**
+ * Request the captive portal application to be launched.
+ */
+ public void launchCaptivePortalApp() {
+ sendMessage(CMD_LAUNCH_CAPTIVE_PORTAL_APP);
+ }
+
@Override
protected void log(String s) {
- if (DBG) Log.d(TAG + "/" + mNetworkAgentInfo.name(), s);
+ if (DBG) Log.d(TAG + "/" + mNetwork.netId, s);
}
private void validationLog(int probeType, Object url, String msg) {
@@ -416,11 +481,7 @@ public class NetworkMonitor extends StateMachine {
private void validationLog(String s) {
if (DBG) log(s);
- validationLogs.log(s);
- }
-
- public ReadOnlyLocalLog getValidationLogs() {
- return validationLogs.readOnlyLocalLog();
+ mValidationLogs.log(s);
}
private ValidationStage validationStage() {
@@ -428,20 +489,46 @@ public class NetworkMonitor extends StateMachine {
}
private boolean isValidationRequired() {
- return isValidationRequired(
- mDefaultRequest.networkCapabilities, mNetworkAgentInfo.networkCapabilities);
+ return NetworkMonitorUtils.isValidationRequired(
+ mDefaultRequest.networkCapabilities, mNetworkCapabilities);
+ }
+
+
+ private void notifyNetworkTested(int result, @Nullable String redirectUrl) {
+ try {
+ mCallback.notifyNetworkTested(result, redirectUrl);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error sending network test result", e);
+ }
}
+ private void showProvisioningNotification(String action) {
+ try {
+ mCallback.showProvisioningNotification(action);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error showing provisioning notification", e);
+ }
+ }
- private void notifyNetworkTestResultInvalid(Object obj) {
- mConnectivityServiceHandler.sendMessage(obtainMessage(
- EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_INVALID, mNetId, obj));
+ private void hideProvisioningNotification() {
+ try {
+ mCallback.hideProvisioningNotification();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error hiding provisioning notification", e);
+ }
}
// DefaultState is the parent of all States. It exists only to handle CMD_* messages but
// does not entail any real state (hence no enter() or exit() routines).
private class DefaultState extends State {
@Override
+ public void enter() {
+ // TODO: have those passed parceled in start() and remove this
+ updateLinkProperties();
+ updateNetworkCapabilities();
+ }
+
+ @Override
public boolean processMessage(Message message) {
switch (message.what) {
case CMD_NETWORK_CONNECTED:
@@ -458,7 +545,9 @@ public class NetworkMonitor extends StateMachine {
return HANDLED;
case CMD_FORCE_REEVALUATION:
case CMD_CAPTIVE_PORTAL_RECHECK:
- log("Forcing reevaluation for UID " + message.arg1);
+ final int dnsCount = mDnsStallDetector.getConsecutiveTimeoutCount();
+ validationLog("Forcing reevaluation for UID " + message.arg1
+ + ". Dns signal count: " + dnsCount);
mUidResponsibleForReeval = message.arg1;
transitionTo(mEvaluatingState);
return HANDLED;
@@ -492,7 +581,7 @@ public class NetworkMonitor extends StateMachine {
case APP_RETURN_UNWANTED:
mDontDisplaySigninNotification = true;
mUserDoesNotWant = true;
- notifyNetworkTestResultInvalid(null);
+ notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, null);
// TODO: Should teardown network.
mUidResponsibleForReeval = 0;
transitionTo(mEvaluatingState);
@@ -556,8 +645,7 @@ public class NetworkMonitor extends StateMachine {
public void enter() {
maybeLogEvaluationResult(
networkEventType(validationStage(), EvaluationResult.VALIDATED));
- mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
- NETWORK_TEST_RESULT_VALID, mNetId, null));
+ notifyNetworkTested(INetworkMonitor.NETWORK_TEST_RESULT_VALID, null);
mValidations++;
}
@@ -626,8 +714,7 @@ public class NetworkMonitor extends StateMachine {
@Override
public void exit() {
- Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 0, mNetId, null);
- mConnectivityServiceHandler.sendMessage(message);
+ hideProvisioningNotification();
}
}
@@ -655,8 +742,9 @@ public class NetworkMonitor extends StateMachine {
public boolean processMessage(Message message) {
switch (message.what) {
case CMD_REEVALUATE:
- if (message.arg1 != mReevaluateToken || mUserDoesNotWant)
+ if (message.arg1 != mReevaluateToken || mUserDoesNotWant) {
return HANDLED;
+ }
// Don't bother validating networks that don't satisfy the default request.
// This includes:
// - VPNs which can be considered explicitly desired by the user and the
@@ -743,9 +831,7 @@ public class NetworkMonitor extends StateMachine {
CMD_LAUNCH_CAPTIVE_PORTAL_APP);
}
// Display the sign in notification.
- Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 1, mNetId,
- mLaunchCaptivePortalAppBroadcastReceiver.getPendingIntent());
- mConnectivityServiceHandler.sendMessage(message);
+ showProvisioningNotification(mLaunchCaptivePortalAppBroadcastReceiver.mAction);
// Retest for captive portal occasionally.
sendMessageDelayed(CMD_CAPTIVE_PORTAL_RECHECK, 0 /* no UID */,
CAPTIVE_PORTAL_REEVALUATE_DELAY_MS);
@@ -813,9 +899,9 @@ public class NetworkMonitor extends StateMachine {
}
private boolean isStrictModeHostnameResolved() {
- return (mPrivateDnsConfig != null) &&
- mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) &&
- (mPrivateDnsConfig.ips.length > 0);
+ return (mPrivateDnsConfig != null)
+ && mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname)
+ && (mPrivateDnsConfig.ips.length > 0);
}
private void resolveStrictModeHostname() {
@@ -831,12 +917,15 @@ public class NetworkMonitor extends StateMachine {
}
private void notifyPrivateDnsConfigResolved() {
- mConnectivityServiceHandler.sendMessage(obtainMessage(
- EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0, mNetId, mPrivateDnsConfig));
+ try {
+ mCallback.notifyPrivateDnsConfigResolved(mPrivateDnsConfig.toParcel());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error sending private DNS config resolved notification", e);
+ }
}
private void handlePrivateDnsEvaluationFailure() {
- notifyNetworkTestResultInvalid(null);
+ notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, null);
// Queue up a re-evaluation with backoff.
//
@@ -852,12 +941,12 @@ public class NetworkMonitor extends StateMachine {
private boolean sendPrivateDnsProbe() {
// q.v. system/netd/server/dns/DnsTlsTransport.cpp
- final String ONE_TIME_HOSTNAME_SUFFIX = "-dnsotls-ds.metric.gstatic.com";
- final String host = UUID.randomUUID().toString().substring(0, 8) +
- ONE_TIME_HOSTNAME_SUFFIX;
+ final String oneTimeHostnameSuffix = "-dnsotls-ds.metric.gstatic.com";
+ final String host = UUID.randomUUID().toString().substring(0, 8)
+ + oneTimeHostnameSuffix;
final Stopwatch watch = new Stopwatch().start();
try {
- final InetAddress[] ips = mNetworkAgentInfo.network().getAllByName(host);
+ final InetAddress[] ips = mNonPrivateDnsBypassNetwork.getAllByName(host);
final long time = watch.stop();
final String strIps = Arrays.toString(ips);
final boolean success = (ips != null && ips.length > 0);
@@ -907,12 +996,12 @@ public class NetworkMonitor extends StateMachine {
// state (even if no Private DNS validation required).
transitionTo(mEvaluatingPrivateDnsState);
} else if (probeResult.isPortal()) {
- notifyNetworkTestResultInvalid(probeResult.redirectUrl);
+ notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, probeResult.redirectUrl);
mLastPortalProbeResult = probeResult;
transitionTo(mCaptivePortalState);
} else {
logNetworkEvent(NetworkEvent.NETWORK_VALIDATION_FAILED);
- notifyNetworkTestResultInvalid(probeResult.redirectUrl);
+ notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, probeResult.redirectUrl);
transitionTo(mWaitingForNextProbeState);
}
return HANDLED;
@@ -966,7 +1055,7 @@ public class NetworkMonitor extends StateMachine {
// most one per address family. This ensures we only wait up to 20 seconds for TCP connections
// to complete, regardless of how many IP addresses a host has.
private static class OneAddressPerFamilyNetwork extends Network {
- public OneAddressPerFamilyNetwork(Network network) {
+ OneAddressPerFamilyNetwork(Network network) {
// Always bypass Private DNS.
super(network.getPrivateDnsBypassingCopy());
}
@@ -988,19 +1077,20 @@ public class NetworkMonitor extends StateMachine {
}
}
- public boolean getIsCaptivePortalCheckEnabled() {
+ private boolean getIsCaptivePortalCheckEnabled() {
String symbol = Settings.Global.CAPTIVE_PORTAL_MODE;
int defaultValue = Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT;
int mode = mDependencies.getSetting(mContext, symbol, defaultValue);
return mode != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE;
}
- public boolean getUseHttpsValidation() {
+ private boolean getUseHttpsValidation() {
return mDependencies.getSetting(mContext, Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1;
}
- public boolean getWifiScansAlwaysAvailableDisabled() {
- return mDependencies.getSetting(mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0;
+ private boolean getWifiScansAlwaysAvailableDisabled() {
+ return mDependencies.getSetting(
+ mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0;
}
private String getCaptivePortalServerHttpsUrl() {
@@ -1031,15 +1121,6 @@ public class NetworkMonitor extends StateMachine {
DEFAULT_DATA_STALL_EVALUATION_TYPES);
}
- // Static for direct access by ConnectivityService
- public static String getCaptivePortalServerHttpUrl(Context context) {
- return getCaptivePortalServerHttpUrl(Dependencies.DEFAULT, context);
- }
-
- public static String getCaptivePortalServerHttpUrl(Dependencies deps, Context context) {
- return deps.getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, DEFAULT_HTTP_URL);
- }
-
private URL[] makeCaptivePortalFallbackUrls() {
try {
String separator = ",";
@@ -1135,7 +1216,7 @@ public class NetworkMonitor extends StateMachine {
// 3. PAC scripts are sometimes used to block or restrict Internet access and may in
// fact block fetching of the generate_204 URL which would lead to false negative
// results for network validation.
- final ProxyInfo proxyInfo = mNetworkAgentInfo.linkProperties.getHttpProxy();
+ final ProxyInfo proxyInfo = mLinkProperties.getHttpProxy();
if (proxyInfo != null && !Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
pacUrl = makeURL(proxyInfo.getPacFileUrl().toString());
if (pacUrl == null) {
@@ -1246,10 +1327,10 @@ public class NetworkMonitor extends StateMachine {
// Time how long it takes to get a response to our request
long responseTimestamp = SystemClock.elapsedRealtime();
- validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms" +
- " ret=" + httpResponseCode +
- " request=" + requestHeader +
- " headers=" + urlConnection.getHeaderFields());
+ validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms"
+ + " ret=" + httpResponseCode
+ + " request=" + requestHeader
+ + " headers=" + urlConnection.getHeaderFields());
// NOTE: We may want to consider an "HTTP/1.0 204" response to be a captive
// portal. The only example of this seen so far was a captive portal. For
// the time being go with prior behavior of assuming it's not a captive
@@ -1267,7 +1348,7 @@ public class NetworkMonitor extends StateMachine {
// sign-in to an empty page. Probably the result of a broken transparent proxy.
// See http://b/9972012.
validationLog(probeType, url,
- "200 response with Content-length=0 interpreted as 204 response.");
+ "200 response with Content-length=0 interpreted as 204 response.");
httpResponseCode = CaptivePortalProbeResult.SUCCESS_CODE;
} else if (urlConnection.getContentLengthLong() == -1) {
// When no Content-length (default value == -1), attempt to read a byte from the
@@ -1309,7 +1390,7 @@ public class NetworkMonitor extends StateMachine {
private final boolean mIsHttps;
private volatile CaptivePortalProbeResult mResult = CaptivePortalProbeResult.FAILED;
- public ProbeThread(boolean isHttps) {
+ ProbeThread(boolean isHttps) {
mIsHttps = isHttps;
}
@@ -1407,99 +1488,98 @@ public class NetworkMonitor extends StateMachine {
return;
}
- if (!systemReady) {
+ if (!mSystemReady) {
return;
}
Intent latencyBroadcast =
- new Intent(ConnectivityConstants.ACTION_NETWORK_CONDITIONS_MEASURED);
- switch (mNetworkAgentInfo.networkInfo.getType()) {
- case ConnectivityManager.TYPE_WIFI:
- WifiInfo currentWifiInfo = mWifiManager.getConnectionInfo();
- if (currentWifiInfo != null) {
- // NOTE: getSSID()'s behavior changed in API 17; before that, SSIDs were not
- // surrounded by double quotation marks (thus violating the Javadoc), but this
- // was changed to match the Javadoc in API 17. Since clients may have started
- // sanitizing the output of this method since API 17 was released, we should
- // not change it here as it would become impossible to tell whether the SSID is
- // simply being surrounded by quotes due to the API, or whether those quotes
- // are actually part of the SSID.
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_SSID,
- currentWifiInfo.getSSID());
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_BSSID,
- currentWifiInfo.getBSSID());
- } else {
- if (VDBG) logw("network info is TYPE_WIFI but no ConnectionInfo found");
- return;
- }
- break;
- case ConnectivityManager.TYPE_MOBILE:
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_NETWORK_TYPE,
- mTelephonyManager.getNetworkType());
- List<CellInfo> info = mTelephonyManager.getAllCellInfo();
- if (info == null) return;
- int numRegisteredCellInfo = 0;
- for (CellInfo cellInfo : info) {
- if (cellInfo.isRegistered()) {
- numRegisteredCellInfo++;
- if (numRegisteredCellInfo > 1) {
- if (VDBG) logw("more than one registered CellInfo." +
- " Can't tell which is active. Bailing.");
- return;
- }
- if (cellInfo instanceof CellInfoCdma) {
- CellIdentityCdma cellId = ((CellInfoCdma) cellInfo).getCellIdentity();
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_CELL_ID, cellId);
- } else if (cellInfo instanceof CellInfoGsm) {
- CellIdentityGsm cellId = ((CellInfoGsm) cellInfo).getCellIdentity();
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_CELL_ID, cellId);
- } else if (cellInfo instanceof CellInfoLte) {
- CellIdentityLte cellId = ((CellInfoLte) cellInfo).getCellIdentity();
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_CELL_ID, cellId);
- } else if (cellInfo instanceof CellInfoWcdma) {
- CellIdentityWcdma cellId = ((CellInfoWcdma) cellInfo).getCellIdentity();
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_CELL_ID, cellId);
- } else {
- if (VDBG) logw("Registered cellinfo is unrecognized");
- return;
+ new Intent(NetworkMonitorUtils.ACTION_NETWORK_CONDITIONS_MEASURED);
+ if (mNetworkCapabilities.hasTransport(TRANSPORT_WIFI)) {
+ WifiInfo currentWifiInfo = mWifiManager.getConnectionInfo();
+ if (currentWifiInfo != null) {
+ // NOTE: getSSID()'s behavior changed in API 17; before that, SSIDs were not
+ // surrounded by double quotation marks (thus violating the Javadoc), but this
+ // was changed to match the Javadoc in API 17. Since clients may have started
+ // sanitizing the output of this method since API 17 was released, we should
+ // not change it here as it would become impossible to tell whether the SSID is
+ // simply being surrounded by quotes due to the API, or whether those quotes
+ // are actually part of the SSID.
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_SSID,
+ currentWifiInfo.getSSID());
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_BSSID,
+ currentWifiInfo.getBSSID());
+ } else {
+ if (VDBG) logw("network info is TYPE_WIFI but no ConnectionInfo found");
+ return;
+ }
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CONNECTIVITY_TYPE, TYPE_WIFI);
+ } else if (mNetworkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_NETWORK_TYPE,
+ mTelephonyManager.getNetworkType());
+ List<CellInfo> info = mTelephonyManager.getAllCellInfo();
+ if (info == null) return;
+ int numRegisteredCellInfo = 0;
+ for (CellInfo cellInfo : info) {
+ if (cellInfo.isRegistered()) {
+ numRegisteredCellInfo++;
+ if (numRegisteredCellInfo > 1) {
+ if (VDBG) {
+ logw("more than one registered CellInfo."
+ + " Can't tell which is active. Bailing.");
}
+ return;
+ }
+ if (cellInfo instanceof CellInfoCdma) {
+ CellIdentityCdma cellId = ((CellInfoCdma) cellInfo).getCellIdentity();
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CELL_ID, cellId);
+ } else if (cellInfo instanceof CellInfoGsm) {
+ CellIdentityGsm cellId = ((CellInfoGsm) cellInfo).getCellIdentity();
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CELL_ID, cellId);
+ } else if (cellInfo instanceof CellInfoLte) {
+ CellIdentityLte cellId = ((CellInfoLte) cellInfo).getCellIdentity();
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CELL_ID, cellId);
+ } else if (cellInfo instanceof CellInfoWcdma) {
+ CellIdentityWcdma cellId = ((CellInfoWcdma) cellInfo).getCellIdentity();
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CELL_ID, cellId);
+ } else {
+ if (VDBG) logw("Registered cellinfo is unrecognized");
+ return;
}
}
- break;
- default:
- return;
+ }
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_CONNECTIVITY_TYPE, TYPE_MOBILE);
+ } else {
+ return;
}
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_CONNECTIVITY_TYPE,
- mNetworkAgentInfo.networkInfo.getType());
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_RESPONSE_RECEIVED,
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_RESPONSE_RECEIVED,
responseReceived);
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_REQUEST_TIMESTAMP_MS,
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_REQUEST_TIMESTAMP_MS,
requestTimestampMs);
if (responseReceived) {
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_IS_CAPTIVE_PORTAL,
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_IS_CAPTIVE_PORTAL,
isCaptivePortal);
- latencyBroadcast.putExtra(ConnectivityConstants.EXTRA_RESPONSE_TIMESTAMP_MS,
+ latencyBroadcast.putExtra(NetworkMonitorUtils.EXTRA_RESPONSE_TIMESTAMP_MS,
responseTimestampMs);
}
mContext.sendBroadcastAsUser(latencyBroadcast, UserHandle.CURRENT,
- ConnectivityConstants.PERMISSION_ACCESS_NETWORK_CONDITIONS);
+ NetworkMonitorUtils.PERMISSION_ACCESS_NETWORK_CONDITIONS);
}
private void logNetworkEvent(int evtype) {
- int[] transports = mNetworkAgentInfo.networkCapabilities.getTransportTypes();
+ int[] transports = mNetworkCapabilities.getTransportTypes();
mMetricsLog.log(mNetId, transports, new NetworkEvent(evtype));
}
private int networkEventType(ValidationStage s, EvaluationResult r) {
- if (s.isFirstValidation) {
- if (r.isValidated) {
+ if (s.mIsFirstValidation) {
+ if (r.mIsValidated) {
return NetworkEvent.NETWORK_FIRST_VALIDATION_SUCCESS;
} else {
return NetworkEvent.NETWORK_FIRST_VALIDATION_PORTAL_FOUND;
}
} else {
- if (r.isValidated) {
+ if (r.mIsValidated) {
return NetworkEvent.NETWORK_REVALIDATION_SUCCESS;
} else {
return NetworkEvent.NETWORK_REVALIDATION_PORTAL_FOUND;
@@ -1509,15 +1589,15 @@ public class NetworkMonitor extends StateMachine {
private void maybeLogEvaluationResult(int evtype) {
if (mEvaluationTimer.isRunning()) {
- int[] transports = mNetworkAgentInfo.networkCapabilities.getTransportTypes();
+ int[] transports = mNetworkCapabilities.getTransportTypes();
mMetricsLog.log(mNetId, transports, new NetworkEvent(evtype, mEvaluationTimer.stop()));
mEvaluationTimer.reset();
}
}
private void logValidationProbe(long durationMs, int probeType, int probeResult) {
- int[] transports = mNetworkAgentInfo.networkCapabilities.getTransportTypes();
- boolean isFirstValidation = validationStage().isFirstValidation;
+ int[] transports = mNetworkCapabilities.getTransportTypes();
+ boolean isFirstValidation = validationStage().mIsFirstValidation;
ValidationProbeEvent ev = new ValidationProbeEvent();
ev.probeType = ValidationProbeEvent.makeProbeType(probeType, isFirstValidation);
ev.returnCode = probeResult;
@@ -1526,19 +1606,36 @@ public class NetworkMonitor extends StateMachine {
}
@VisibleForTesting
- public static class Dependencies {
- public Network getNetwork(NetworkAgentInfo networkAgentInfo) {
- return new OneAddressPerFamilyNetwork(networkAgentInfo.network());
+ static class Dependencies {
+ public Network getPrivateDnsBypassNetwork(Network network) {
+ return new OneAddressPerFamilyNetwork(network);
}
public Random getRandom() {
return new Random();
}
+ /**
+ * Get the captive portal server HTTP URL that is configured on the device.
+ */
+ public String getCaptivePortalServerHttpUrl(Context context) {
+ return NetworkMonitorUtils.getCaptivePortalServerHttpUrl(context);
+ }
+
+ /**
+ * Get the value of a global integer setting.
+ * @param symbol Name of the setting
+ * @param defaultValue Value to return if the setting is not defined.
+ */
public int getSetting(Context context, String symbol, int defaultValue) {
return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue);
}
+ /**
+ * Get the value of a global String setting.
+ * @param symbol Name of the setting
+ * @param defaultValue Value to return if the setting is not defined.
+ */
public String getSetting(Context context, String symbol, String defaultValue) {
final String value = Settings.Global.getString(context.getContentResolver(), symbol);
return value != null ? value : defaultValue;
@@ -1645,7 +1742,7 @@ public class NetworkMonitor extends StateMachine {
boolean result = false;
// Reevaluation will generate traffic. Thus, set a minimal reevaluation timer to limit the
// possible traffic cost in metered network.
- if (mNetworkAgentInfo.networkCapabilities.isMetered()
+ if (mNetworkCapabilities.isMetered()
&& (SystemClock.elapsedRealtime() - getLastProbeTime()
< mDataStallMinEvaluateTime)) {
return false;
diff --git a/packages/NetworkStack/src/com/android/server/util/NetworkStackConstants.java b/packages/NetworkStack/src/com/android/server/util/NetworkStackConstants.java
new file mode 100644
index 000000000000..bb5900c53e52
--- /dev/null
+++ b/packages/NetworkStack/src/com/android/server/util/NetworkStackConstants.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.util;
+
+/**
+ * Network constants used by the network stack.
+ */
+public final class NetworkStackConstants {
+
+ /**
+ * IPv4 constants.
+ *
+ * See also:
+ * - https://tools.ietf.org/html/rfc791
+ */
+ public static final int IPV4_ADDR_BITS = 32;
+ public static final int IPV4_MIN_MTU = 68;
+ public static final int IPV4_MAX_MTU = 65_535;
+
+ /**
+ * DHCP constants.
+ *
+ * See also:
+ * - https://tools.ietf.org/html/rfc2131
+ */
+ public static final int INFINITE_LEASE = 0xffffffff;
+
+ private NetworkStackConstants() {
+ throw new UnsupportedOperationException("This class is not to be instantiated");
+ }
+}
diff --git a/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java
new file mode 100644
index 000000000000..82bf038073c7
--- /dev/null
+++ b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2018 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.util;
+
+import static android.os.Binder.getCallingUid;
+
+import android.os.Process;
+
+/**
+ * Utility class to check calling permissions on the network stack.
+ */
+public final class PermissionUtil {
+
+ /**
+ * Check that the caller is allowed to communicate with the network stack.
+ * @throws SecurityException The caller is not allowed to communicate with the network stack.
+ */
+ public static void checkNetworkStackCallingPermission() {
+ // TODO: check that the calling PID is the system server.
+ final int caller = getCallingUid();
+ if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
+ throw new SecurityException("Invalid caller: " + caller);
+ }
+ }
+
+ /**
+ * Check that the caller is allowed to dump the network stack, e.g. dumpsys.
+ * @throws SecurityException The caller is not allowed to dump the network stack.
+ */
+ public static void checkDumpPermission() {
+ final int caller = getCallingUid();
+ if (caller != Process.SYSTEM_UID && caller != Process.ROOT_UID
+ && caller != Process.SHELL_UID) {
+ throw new SecurityException("No dump permissions for caller: " + caller);
+ }
+ }
+
+ private PermissionUtil() {
+ throw new UnsupportedOperationException("This class is not to be instantiated");
+ }
+}
diff --git a/packages/NetworkStack/tests/Android.bp b/packages/NetworkStack/tests/Android.bp
new file mode 100644
index 000000000000..bd7ff2a75703
--- /dev/null
+++ b/packages/NetworkStack/tests/Android.bp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2018 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.
+//
+
+android_test {
+ name: "NetworkStackTests",
+ srcs: ["src/**/*.java"],
+ static_libs: [
+ "android-support-test",
+ "mockito-target-extended-minus-junit4",
+ "NetworkStackLib",
+ "testables",
+ ],
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ ],
+ jni_libs: [
+ // For mockito extended
+ "libdexmakerjvmtiagent",
+ "libstaticjvmtiagent",
+ ]
+} \ No newline at end of file
diff --git a/packages/NetworkStack/tests/AndroidManifest.xml b/packages/NetworkStack/tests/AndroidManifest.xml
new file mode 100644
index 000000000000..8b8474f57e28
--- /dev/null
+++ b/packages/NetworkStack/tests/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.networkstack.tests">
+ <application android:debuggable="true">
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.server.networkstack.tests"
+ android:label="Networking service tests">
+ </instrumentation>
+</manifest> \ No newline at end of file
diff --git a/packages/NetworkStack/tests/AndroidTest.xml b/packages/NetworkStack/tests/AndroidTest.xml
new file mode 100644
index 000000000000..6b08b57731b7
--- /dev/null
+++ b/packages/NetworkStack/tests/AndroidTest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Runs Tests for NetworkStack">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="NetworkStackTests.apk" />
+ </target_preparer>
+
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="framework-base-presubmit" />
+ <option name="test-tag" value="NetworkStackTests" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.server.networkstack.tests" />
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration> \ No newline at end of file
diff --git a/tests/net/java/android/net/dhcp/DhcpLeaseRepositoryTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java
index 7f8e7b5456c2..51d50d9eb13a 100644
--- a/tests/net/java/android/net/dhcp/DhcpLeaseRepositoryTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java
@@ -16,6 +16,7 @@
package android.net.dhcp;
+import static android.net.InetAddresses.parseNumericAddress;
import static android.net.dhcp.DhcpLease.HOSTNAME_NONE;
import static android.net.dhcp.DhcpLeaseRepository.CLIENTID_UNSPEC;
import static android.net.dhcp.DhcpLeaseRepository.INETADDR_UNSPEC;
@@ -29,14 +30,13 @@ import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
import static java.lang.String.format;
-import static java.net.InetAddress.parseNumericAddress;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.IpPrefix;
import android.net.MacAddress;
-import android.net.util.SharedLog;
import android.net.dhcp.DhcpServer.Clock;
+import android.net.util.SharedLog;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -126,7 +126,7 @@ public class DhcpLeaseRepositoryTest {
mRepo.updateParams(new IpPrefix(TEST_SERVER_ADDR, 28), TEST_EXCL_SET, TEST_LEASE_TIME_MS);
// /28 should have 16 addresses, 14 w/o the first/last, 11 w/o excluded addresses
- requestAddresses((byte)11);
+ requestAddresses((byte) 11);
try {
mRepo.getOffer(null, TEST_MAC_2,
diff --git a/tests/net/java/android/net/dhcp/DhcpServerTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java
index ab9bd84b05cb..d4c1e2e16731 100644
--- a/tests/net/java/android/net/dhcp/DhcpServerTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java
@@ -16,11 +16,13 @@
package android.net.dhcp;
+import static android.net.InetAddresses.parseNumericAddress;
import static android.net.dhcp.DhcpPacket.DHCP_CLIENT;
import static android.net.dhcp.DhcpPacket.DHCP_HOST_NAME;
import static android.net.dhcp.DhcpPacket.ENCAP_BOOTP;
import static android.net.dhcp.DhcpPacket.INADDR_ANY;
import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -33,14 +35,14 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static java.net.InetAddress.parseNumericAddress;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.net.INetworkStackStatusCallback;
import android.net.LinkAddress;
import android.net.MacAddress;
import android.net.dhcp.DhcpLeaseRepository.InvalidAddressException;
@@ -48,9 +50,11 @@ import android.net.dhcp.DhcpLeaseRepository.OutOfAddressesException;
import android.net.dhcp.DhcpServer.Clock;
import android.net.dhcp.DhcpServer.Dependencies;
import android.net.util.SharedLog;
-import android.os.test.TestLooper;
+import android.os.HandlerThread;
import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
import org.junit.After;
import org.junit.Before;
@@ -67,10 +71,10 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
-@RunWith(AndroidJUnit4.class)
+@RunWith(AndroidTestingRunner.class)
@SmallTest
+@RunWithLooper
public class DhcpServerTest {
- private static final String PROP_DEXMAKER_SHARE_CLASSLOADER = "dexmaker.share_classloader";
private static final String TEST_IFACE = "testiface";
private static final Inet4Address TEST_SERVER_ADDR = parseAddr("192.168.0.2");
@@ -113,18 +117,25 @@ public class DhcpServerTest {
private ArgumentCaptor<Inet4Address> mResponseDstAddrCaptor;
@NonNull
- private TestLooper mLooper;
+ private HandlerThread mHandlerThread;
+ @NonNull
+ private TestableLooper mLooper;
@NonNull
private DhcpServer mServer;
@Nullable
private String mPrevShareClassloaderProp;
+ private final INetworkStackStatusCallback mAssertSuccessCallback =
+ new INetworkStackStatusCallback.Stub() {
+ @Override
+ public void onStatusAvailable(int statusCode) {
+ assertEquals(STATUS_SUCCESS, statusCode);
+ }
+ };
+
@Before
public void setUp() throws Exception {
- // Allow mocking package-private classes
- mPrevShareClassloaderProp = System.getProperty(PROP_DEXMAKER_SHARE_CLASSLOADER);
- System.setProperty(PROP_DEXMAKER_SHARE_CLASSLOADER, "true");
MockitoAnnotations.initMocks(this);
when(mDeps.makeLeaseRepository(any(), any(), any())).thenReturn(mRepository);
@@ -143,20 +154,22 @@ public class DhcpServerTest {
.setExcludedAddrs(TEST_EXCLUDED_ADDRS)
.build();
- mLooper = new TestLooper();
- mServer = new DhcpServer(mLooper.getLooper(), TEST_IFACE, servingParams,
+ mLooper = TestableLooper.get(this);
+ mHandlerThread = spy(new HandlerThread("TestDhcpServer"));
+ when(mHandlerThread.getLooper()).thenReturn(mLooper.getLooper());
+ mServer = new DhcpServer(mHandlerThread, TEST_IFACE, servingParams,
new SharedLog(DhcpServerTest.class.getSimpleName()), mDeps);
- mServer.start();
- mLooper.dispatchAll();
+ mServer.start(mAssertSuccessCallback);
+ mLooper.processAllMessages();
}
@After
- public void tearDown() {
- // Calling stop() several times is not an issue
- mServer.stop();
- System.setProperty(PROP_DEXMAKER_SHARE_CLASSLOADER,
- (mPrevShareClassloaderProp == null ? "" : mPrevShareClassloaderProp));
+ public void tearDown() throws Exception {
+ mServer.stop(mAssertSuccessCallback);
+ mLooper.processMessages(1);
+ verify(mPacketListener, times(1)).stop();
+ verify(mHandlerThread, times(1)).quitSafely();
}
@Test
@@ -165,13 +178,6 @@ public class DhcpServerTest {
}
@Test
- public void testStop() throws Exception {
- mServer.stop();
- mLooper.dispatchAll();
- verify(mPacketListener, times(1)).stop();
- }
-
- @Test
public void testDiscover() throws Exception {
// TODO: refactor packet construction to eliminate unnecessary/confusing/duplicate fields
when(mRepository.getOffer(isNull() /* clientId */, eq(TEST_CLIENT_MAC),
diff --git a/tests/net/java/android/net/dhcp/DhcpServingParamsTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java
index b6a4073a64da..3ca0564f24d6 100644
--- a/tests/net/java/android/net/dhcp/DhcpServingParamsTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java
@@ -16,17 +16,18 @@
package android.net.dhcp;
+import static android.net.InetAddresses.parseNumericAddress;
+import static android.net.NetworkUtils.inet4AddressToIntHTH;
import static android.net.dhcp.DhcpServingParams.MTU_UNSET;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
-import static java.net.InetAddress.parseNumericAddress;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.LinkAddress;
+import android.net.NetworkUtils;
import android.net.dhcp.DhcpServingParams.InvalidParameterException;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -35,8 +36,10 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.lang.reflect.Modifier;
import java.net.Inet4Address;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@@ -56,6 +59,7 @@ public class DhcpServingParamsTest {
private static final int TEST_MTU = 1500;
private static final Set<Inet4Address> TEST_EXCLUDED_ADDRS = new HashSet<>(
Arrays.asList(parseAddr("192.168.0.200"), parseAddr("192.168.0.201")));
+ private static final boolean TEST_METERED = true;
@Before
public void setUp() {
@@ -65,7 +69,8 @@ public class DhcpServingParamsTest {
.setDnsServers(TEST_DNS_SERVERS)
.setServerAddr(TEST_LINKADDR)
.setLinkMtu(TEST_MTU)
- .setExcludedAddrs(TEST_EXCLUDED_ADDRS);
+ .setExcludedAddrs(TEST_EXCLUDED_ADDRS)
+ .setMetered(TEST_METERED);
}
@Test
@@ -91,6 +96,7 @@ public class DhcpServingParamsTest {
assertEquals(TEST_DNS_SERVERS, params.dnsServers);
assertEquals(TEST_LINKADDR, params.serverAddr);
assertEquals(TEST_MTU, params.linkMtu);
+ assertEquals(TEST_METERED, params.metered);
assertContains(params.excludedAddrs, TEST_EXCLUDED_ADDRS);
assertContains(params.excludedAddrs, TEST_DEFAULT_ROUTERS);
@@ -159,6 +165,44 @@ public class DhcpServingParamsTest {
mBuilder.setDefaultRouters(parseAddr("192.168.254.254")).build();
}
+ @Test
+ public void testFromParcelableObject() throws InvalidParameterException {
+ final DhcpServingParams params = mBuilder.build();
+ final DhcpServingParamsParcel parcel = new DhcpServingParamsParcel();
+ parcel.defaultRouters = toIntArray(TEST_DEFAULT_ROUTERS);
+ parcel.dhcpLeaseTimeSecs = TEST_LEASE_TIME_SECS;
+ parcel.dnsServers = toIntArray(TEST_DNS_SERVERS);
+ parcel.serverAddr = inet4AddressToIntHTH(TEST_SERVER_ADDR);
+ parcel.serverAddrPrefixLength = TEST_LINKADDR.getPrefixLength();
+ parcel.linkMtu = TEST_MTU;
+ parcel.excludedAddrs = toIntArray(TEST_EXCLUDED_ADDRS);
+ parcel.metered = TEST_METERED;
+ final DhcpServingParams parceled = DhcpServingParams.fromParcelableObject(parcel);
+
+ assertEquals(params.defaultRouters, parceled.defaultRouters);
+ assertEquals(params.dhcpLeaseTimeSecs, parceled.dhcpLeaseTimeSecs);
+ assertEquals(params.dnsServers, parceled.dnsServers);
+ assertEquals(params.serverAddr, parceled.serverAddr);
+ assertEquals(params.linkMtu, parceled.linkMtu);
+ assertEquals(params.excludedAddrs, parceled.excludedAddrs);
+ assertEquals(params.metered, parceled.metered);
+
+ // Ensure that we do not miss any field if added in the future
+ final long numFields = Arrays.stream(DhcpServingParams.class.getDeclaredFields())
+ .filter(f -> !Modifier.isStatic(f.getModifiers()))
+ .count();
+ assertEquals(7, numFields);
+ }
+
+ @Test(expected = InvalidParameterException.class)
+ public void testFromParcelableObject_NullArgument() throws InvalidParameterException {
+ DhcpServingParams.fromParcelableObject(null);
+ }
+
+ private static int[] toIntArray(Collection<Inet4Address> addrs) {
+ return addrs.stream().mapToInt(NetworkUtils::inet4AddressToIntHTH).toArray();
+ }
+
private static <T> void assertContains(@NonNull Set<T> set, @NonNull Set<T> subset) {
for (final T elem : subset) {
assertContains(set, elem);
diff --git a/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
index 6e07b26e883a..d31fa7732e66 100644
--- a/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -16,6 +16,14 @@
package com.android.server.connectivity;
+import static android.net.ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN;
+import static android.net.ConnectivityManager.EXTRA_CAPTIVE_PORTAL;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+
+import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -24,13 +32,21 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.Intent;
+import android.net.CaptivePortal;
import android.net.ConnectivityManager;
+import android.net.INetworkMonitorCallbacks;
+import android.net.InetAddresses;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -38,9 +54,12 @@ import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.captiveportal.CaptivePortalProbeResult;
import android.net.metrics.IpConnectivityLog;
+import android.net.util.SharedLog;
import android.net.wifi.WifiManager;
+import android.os.ConditionVariable;
import android.os.Handler;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -50,8 +69,10 @@ import android.util.ArrayMap;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
import java.io.IOException;
import java.net.HttpURLConnection;
@@ -68,21 +89,23 @@ public class NetworkMonitorTest {
private static final String LOCATION_HEADER = "location";
private @Mock Context mContext;
- private @Mock Handler mHandler;
private @Mock IpConnectivityLog mLogger;
- private @Mock NetworkAgentInfo mAgent;
- private @Mock NetworkAgentInfo mNotMeteredAgent;
+ private @Mock SharedLog mValidationLogger;
private @Mock NetworkInfo mNetworkInfo;
- private @Mock NetworkRequest mRequest;
+ private @Mock ConnectivityManager mCm;
private @Mock TelephonyManager mTelephony;
private @Mock WifiManager mWifi;
- private @Mock Network mNetwork;
private @Mock HttpURLConnection mHttpConnection;
private @Mock HttpURLConnection mHttpsConnection;
private @Mock HttpURLConnection mFallbackConnection;
private @Mock HttpURLConnection mOtherFallbackConnection;
private @Mock Random mRandom;
private @Mock NetworkMonitor.Dependencies mDependencies;
+ private @Mock INetworkMonitorCallbacks mCallbacks;
+ private @Spy Network mNetwork = new Network(TEST_NETID);
+ private NetworkRequest mRequest;
+
+ private static final int TEST_NETID = 4242;
private static final String TEST_HTTP_URL = "http://www.google.com/gen_204";
private static final String TEST_HTTPS_URL = "https://www.google.com/gen_204";
@@ -93,33 +116,37 @@ public class NetworkMonitorTest {
private static final int RETURN_CODE_DNS_SUCCESS = 0;
private static final int RETURN_CODE_DNS_TIMEOUT = 255;
- @Before
- public void setUp() throws IOException {
- MockitoAnnotations.initMocks(this);
- mAgent.linkProperties = new LinkProperties();
- mAgent.networkCapabilities = new NetworkCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
- mAgent.networkInfo = mNetworkInfo;
+ private static final int HANDLER_TIMEOUT_MS = 1000;
+
+ private static final LinkProperties TEST_LINKPROPERTIES = new LinkProperties();
+
+ private static final NetworkCapabilities METERED_CAPABILITIES = new NetworkCapabilities()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_INTERNET);
- mNotMeteredAgent.linkProperties = new LinkProperties();
- mNotMeteredAgent.networkCapabilities = new NetworkCapabilities()
+ private static final NetworkCapabilities NOT_METERED_CAPABILITIES = new NetworkCapabilities()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
- mNotMeteredAgent.networkInfo = mNetworkInfo;
- when(mAgent.network()).thenReturn(mNetwork);
- when(mDependencies.getNetwork(any())).thenReturn(mNetwork);
+ private static final NetworkCapabilities NO_INTERNET_CAPABILITIES = new NetworkCapabilities()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+
+ @Before
+ public void setUp() throws IOException {
+ MockitoAnnotations.initMocks(this);
+ when(mDependencies.getPrivateDnsBypassNetwork(any())).thenReturn(mNetwork);
when(mDependencies.getRandom()).thenReturn(mRandom);
when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_MODE), anyInt()))
.thenReturn(Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_USE_HTTPS),
anyInt())).thenReturn(1);
- when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_HTTP_URL),
- anyString())).thenReturn(TEST_HTTP_URL);
+ when(mDependencies.getCaptivePortalServerHttpUrl(any())).thenReturn(TEST_HTTP_URL);
when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_HTTPS_URL),
anyString())).thenReturn(TEST_HTTPS_URL);
- when(mNetwork.getPrivateDnsBypassingCopy()).thenReturn(mNetwork);
+ doReturn(mNetwork).when(mNetwork).getPrivateDnsBypassingCopy();
+ when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(mCm);
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephony);
when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifi);
@@ -129,7 +156,7 @@ public class NetworkMonitorTest {
setFallbackSpecs(null); // Test with no fallback spec by default
when(mRandom.nextInt()).thenReturn(0);
- when(mNetwork.openConnection(any())).then((invocation) -> {
+ doAnswer((invocation) -> {
URL url = invocation.getArgument(0);
switch(url.toString()) {
case TEST_HTTP_URL:
@@ -144,12 +171,20 @@ public class NetworkMonitorTest {
fail("URL not mocked: " + url.toString());
return null;
}
- });
+ }).when(mNetwork).openConnection(any());
when(mHttpConnection.getRequestProperties()).thenReturn(new ArrayMap<>());
when(mHttpsConnection.getRequestProperties()).thenReturn(new ArrayMap<>());
- when(mNetwork.getAllByName(any())).thenReturn(new InetAddress[] {
- InetAddress.parseNumericAddress("192.168.0.0")
- });
+ doReturn(new InetAddress[] {
+ InetAddresses.parseNumericAddress("192.168.0.0")
+ }).when(mNetwork).getAllByName(any());
+
+ mRequest = new NetworkRequest.Builder()
+ .addCapability(NET_CAPABILITY_INTERNET)
+ .addCapability(NET_CAPABILITY_NOT_RESTRICTED)
+ .build();
+ // Default values. Individual tests can override these.
+ when(mCm.getLinkProperties(any())).thenReturn(TEST_LINKPROPERTIES);
+ when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
setMinDataStallEvaluateInterval(500);
setDataStallEvaluationType(1 << DATA_STALL_EVALUATION_TYPE_DNS);
@@ -160,10 +195,10 @@ public class NetworkMonitorTest {
private class WrappedNetworkMonitor extends NetworkMonitor {
private long mProbeTime = 0;
- WrappedNetworkMonitor(Context context, Handler handler,
- NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest,
+ WrappedNetworkMonitor(Context context, Network network, NetworkRequest defaultRequest,
IpConnectivityLog logger, Dependencies deps) {
- super(context, handler, networkAgentInfo, defaultRequest, logger, deps);
+ super(context, mCallbacks, network, defaultRequest, logger,
+ new SharedLog("test_nm"), deps);
}
@Override
@@ -176,19 +211,39 @@ public class NetworkMonitorTest {
}
}
- WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() {
- return new WrappedNetworkMonitor(
- mContext, mHandler, mAgent, mRequest, mLogger, mDependencies);
+ private WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() {
+ final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
+ mContext, mNetwork, mRequest, mLogger, mDependencies);
+ when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
+ nm.start();
+ waitForIdle(nm.getHandler());
+ return nm;
}
- WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() {
- return new WrappedNetworkMonitor(
- mContext, mHandler, mNotMeteredAgent, mRequest, mLogger, mDependencies);
+ private WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() {
+ final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
+ mContext, mNetwork, mRequest, mLogger, mDependencies);
+ when(mCm.getNetworkCapabilities(any())).thenReturn(NOT_METERED_CAPABILITIES);
+ nm.start();
+ waitForIdle(nm.getHandler());
+ return nm;
}
- NetworkMonitor makeMonitor() {
- return new NetworkMonitor(
- mContext, mHandler, mAgent, mRequest, mLogger, mDependencies);
+ private NetworkMonitor makeMonitor() {
+ final NetworkMonitor nm = new NetworkMonitor(
+ mContext, mCallbacks, mNetwork, mRequest, mLogger, mValidationLogger,
+ mDependencies);
+ nm.start();
+ waitForIdle(nm.getHandler());
+ return nm;
+ }
+
+ private void waitForIdle(Handler handler) {
+ final ConditionVariable cv = new ConditionVariable(false);
+ handler.post(cv::open);
+ if (!cv.block(HANDLER_TIMEOUT_MS)) {
+ fail("Timed out waiting for handler");
+ }
}
@Test
@@ -319,6 +374,15 @@ public class NetworkMonitorTest {
}
@Test
+ public void testIsCaptivePortal_IgnorePortals() throws IOException {
+ setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE);
+ setSslException(mHttpsConnection);
+ setPortal302(mHttpConnection);
+
+ assertNotPortal(makeMonitor().isCaptivePortal());
+ }
+
+ @Test
public void testIsDataStall_EvaluationDisabled() {
setDataStallEvaluationType(0);
WrappedNetworkMonitor wrappedMonitor = makeMeteredWrappedNetworkMonitor();
@@ -390,6 +454,63 @@ public class NetworkMonitorTest {
assertFalse(wrappedMonitor.isDataStall());
}
+ @Test
+ public void testBrokenNetworkNotValidated() throws Exception {
+ setSslException(mHttpsConnection);
+ setStatus(mHttpConnection, 500);
+ setStatus(mFallbackConnection, 404);
+ when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
+
+ final NetworkMonitor nm = makeMonitor();
+ nm.notifyNetworkConnected();
+
+ verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
+ .notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, null);
+ }
+
+ @Test
+ public void testNoInternetCapabilityValidated() throws Exception {
+ when(mCm.getNetworkCapabilities(any())).thenReturn(NO_INTERNET_CAPABILITIES);
+
+ final NetworkMonitor nm = makeMonitor();
+ nm.notifyNetworkConnected();
+
+ verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
+ .notifyNetworkTested(NETWORK_TEST_RESULT_VALID, null);
+ verify(mNetwork, never()).openConnection(any());
+ }
+
+ @Test
+ public void testLaunchCaptivePortalApp() throws Exception {
+ setSslException(mHttpsConnection);
+ setPortal302(mHttpConnection);
+
+ final NetworkMonitor nm = makeMonitor();
+ nm.notifyNetworkConnected();
+
+ verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
+ .showProvisioningNotification(any());
+
+ // Check that startCaptivePortalApp sends the expected intent.
+ nm.launchCaptivePortalApp();
+
+ final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext, timeout(HANDLER_TIMEOUT_MS).times(1))
+ .startActivityAsUser(intentCaptor.capture(), eq(UserHandle.CURRENT));
+ final Intent intent = intentCaptor.getValue();
+ assertEquals(ACTION_CAPTIVE_PORTAL_SIGN_IN, intent.getAction());
+ final Network network = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK);
+ assertEquals(TEST_NETID, network.netId);
+
+ // Have the app report that the captive portal is dismissed, and check that we revalidate.
+ setStatus(mHttpsConnection, 204);
+ setStatus(mHttpConnection, 204);
+ final CaptivePortal captivePortal = intent.getParcelableExtra(EXTRA_CAPTIVE_PORTAL);
+ captivePortal.reportCaptivePortalDismissed();
+ verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
+ .notifyNetworkTested(NETWORK_TEST_RESULT_VALID, null);
+ }
+
private void makeDnsTimeoutEvent(WrappedNetworkMonitor wrappedMonitor, int count) {
for (int i = 0; i < count; i++) {
wrappedMonitor.getDnsStallDetector().accumulateConsecutiveDnsTimeoutCount(
@@ -440,6 +561,11 @@ public class NetworkMonitorTest {
eq(Settings.Global.CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS), any())).thenReturn(specs);
}
+ private void setCaptivePortalMode(int mode) {
+ when(mDependencies.getSetting(any(),
+ eq(Settings.Global.CAPTIVE_PORTAL_MODE), anyInt())).thenReturn(mode);
+ }
+
private void assertPortal(CaptivePortalProbeResult result) {
assertTrue(result.isPortal());
assertFalse(result.isFailed());
@@ -459,12 +585,12 @@ public class NetworkMonitorTest {
}
private void setSslException(HttpURLConnection connection) throws IOException {
- when(connection.getResponseCode()).thenThrow(new SSLHandshakeException("Invalid cert"));
+ doThrow(new SSLHandshakeException("Invalid cert")).when(connection).getResponseCode();
}
private void set302(HttpURLConnection connection, String location) throws IOException {
setStatus(connection, 302);
- when(connection.getHeaderField(LOCATION_HEADER)).thenReturn(location);
+ doReturn(location).when(connection).getHeaderField(LOCATION_HEADER);
}
private void setPortal302(HttpURLConnection connection) throws IOException {
@@ -472,7 +598,7 @@ public class NetworkMonitorTest {
}
private void setStatus(HttpURLConnection connection, int status) throws IOException {
- when(connection.getResponseCode()).thenReturn(status);
+ doReturn(status).when(connection).getResponseCode();
}
}
diff --git a/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java b/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java
new file mode 100644
index 000000000000..07ad3123bc53
--- /dev/null
+++ b/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 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.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.net.util.SharedLog;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SharedLogTest {
+ private static final String TIMESTAMP_PATTERN = "\\d{2}:\\d{2}:\\d{2}";
+ private static final String TIMESTAMP = "HH:MM:SS";
+
+ @Test
+ public void testBasicOperation() {
+ final SharedLog logTop = new SharedLog("top");
+ logTop.mark("first post!");
+
+ final SharedLog logLevel2a = logTop.forSubComponent("twoA");
+ final SharedLog logLevel2b = logTop.forSubComponent("twoB");
+ logLevel2b.e("2b or not 2b");
+ logLevel2b.e("No exception", null);
+ logLevel2b.e("Wait, here's one", new Exception("Test"));
+ logLevel2a.w("second post?");
+
+ final SharedLog logLevel3 = logLevel2a.forSubComponent("three");
+ logTop.log("still logging");
+ logLevel3.log("3 >> 2");
+ logLevel2a.mark("ok: last post");
+
+ final String[] expected = {
+ " - MARK first post!",
+ " - [twoB] ERROR 2b or not 2b",
+ " - [twoB] ERROR No exception",
+ // No stacktrace in shared log, only in logcat
+ " - [twoB] ERROR Wait, here's one: Test",
+ " - [twoA] WARN second post?",
+ " - still logging",
+ " - [twoA.three] 3 >> 2",
+ " - [twoA] MARK ok: last post",
+ };
+ // Verify the logs are all there and in the correct order.
+ verifyLogLines(expected, logTop);
+
+ // In fact, because they all share the same underlying LocalLog,
+ // every subcomponent SharedLog's dump() is identical.
+ verifyLogLines(expected, logLevel2a);
+ verifyLogLines(expected, logLevel2b);
+ verifyLogLines(expected, logLevel3);
+ }
+
+ private static void verifyLogLines(String[] expected, SharedLog log) {
+ final ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+ final PrintWriter pw = new PrintWriter(ostream, true);
+ log.dump(null, pw, null);
+
+ final String dumpOutput = ostream.toString();
+ assertTrue(dumpOutput != null);
+ assertTrue(!"".equals(dumpOutput));
+
+ final String[] lines = dumpOutput.split("\n");
+ assertEquals(expected.length, lines.length);
+
+ for (int i = 0; i < expected.length; i++) {
+ String got = lines[i];
+ String want = expected[i];
+ assertTrue(String.format("'%s' did not contain '%s'", got, want), got.endsWith(want));
+ assertTrue(String.format("'%s' did not contain a %s timestamp", got, TIMESTAMP),
+ got.replaceFirst(TIMESTAMP_PATTERN, TIMESTAMP).contains(TIMESTAMP));
+ }
+ }
+}
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index 933ff3f70b31..9b57186a20d5 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -90,7 +90,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Fortsæt"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Indstillinger"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installerer/afinstallerer Wear-apps"</string>
- <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Underretning om appinstallation"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikation om appinstallation"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Appen er installeret"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" er installeret"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index 218263135b20..4deab35c4b3e 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -59,7 +59,7 @@
<string name="uninstall_update_text" msgid="863648314632448705">"फॅक्टरी आवृत्तीसह हे अ‍ॅप बदलायचे का? सर्व डेटा काढला जाईल."</string>
<string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"फॅक्टरी आवृत्तीसह हे अ‍ॅप बदलायचे? सर्व डेटा काढला जाईल. हे कार्य प्रोफाइल असलेल्यांसह या डिव्हाइसच्या सर्व वापरकर्त्यांना प्रभावित करते."</string>
<string name="uninstall_remove_contributed_files" msgid="2048594420923203453">"<xliff:g id="SIZE">%1$s</xliff:g> आकाराच्या संबंधित मीडिया फायलीदेखील काढा."</string>
- <string name="uninstall_keep_data" msgid="7002379587465487550">"अॅप डेटा पैकी <xliff:g id="SIZE">%1$s</xliff:g> ठेवा."</string>
+ <string name="uninstall_keep_data" msgid="7002379587465487550">"ॲप डेटा पैकी <xliff:g id="SIZE">%1$s</xliff:g> ठेवा."</string>
<string name="uninstalling_notification_channel" msgid="840153394325714653">"अनइंस्टॉल रन होत आहेत"</string>
<string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"अनइंस्टॉल करता आले नाही"</string>
<string name="uninstalling" msgid="8709566347688966845">"अनइंस्टॉल करत आहे…"</string>
diff --git a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarChartPreference.java b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarChartPreference.java
index eed66e94a9ef..d332bac3bb6d 100644
--- a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarChartPreference.java
+++ b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarChartPreference.java
@@ -77,7 +77,7 @@ import java.util.Arrays;
*/
public class BarChartPreference extends Preference {
- static final int MAXIMUM_BAR_VIEWS = 4;
+ public static final int MAXIMUM_BAR_VIEWS = 4;
private static final String TAG = "BarChartPreference";
private static final int[] BAR_VIEWS = {
R.id.bar_view1,
diff --git a/packages/SettingsLib/EntityHeaderWidgets/res/layout/app_view.xml b/packages/SettingsLib/EntityHeaderWidgets/res/layout/app_view.xml
index fcafa3140955..96045120fec4 100644
--- a/packages/SettingsLib/EntityHeaderWidgets/res/layout/app_view.xml
+++ b/packages/SettingsLib/EntityHeaderWidgets/res/layout/app_view.xml
@@ -22,6 +22,8 @@
android:layout_weight="1"
android:layout_marginEnd="16dp"
android:gravity="center"
+ android:clickable="true"
+ android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">
<ImageView
diff --git a/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntitiesHeaderController.java b/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntitiesHeaderController.java
index 8ccf89fc38b0..73cb8db136b5 100644
--- a/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntitiesHeaderController.java
+++ b/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntitiesHeaderController.java
@@ -18,7 +18,6 @@ package com.android.settingslib.widget;
import android.content.Context;
import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -32,23 +31,9 @@ import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
/**
- * This is used to initialize view which was inflated
+ * This class is used to initialize view which was inflated
* from {@link R.xml.app_entities_header.xml}.
*
- * <p>The view looks like below.
- *
- * <pre>
- * --------------------------------------------------------------
- * | Header title |
- * --------------------------------------------------------------
- * | App1 icon | App2 icon | App3 icon |
- * | App1 title | App2 title | App3 title |
- * | App1 summary | App2 summary | App3 summary |
- * |-------------------------------------------------------------
- * | Header details |
- * --------------------------------------------------------------
- * </pre>
- *
* <p>How to use AppEntitiesHeaderController?
*
* <p>1. Add a {@link LayoutPreference} in layout XML file.
@@ -66,13 +51,20 @@ import androidx.annotation.VisibleForTesting;
* View headerView = ((LayoutPreference) screen.findPreference("app_entities_header"))
* .findViewById(R.id.app_entities_header);
*
+ * final AppEntityInfo appEntityInfo = new AppEntityInfo.Builder()
+ * .setIcon(icon)
+ * .setTitle(title)
+ * .setSummary(summary)
+ * .setOnClickListener(view -> doSomething())
+ * .build();
+ *
* AppEntitiesHeaderController.newInstance(context, headerView)
* .setHeaderTitleRes(R.string.xxxxx)
* .setHeaderDetailsRes(R.string.xxxxx)
* .setHeaderDetailsClickListener(onClickListener)
- * .setAppEntity(0, icon, "app title", "app summary")
- * .setAppEntity(1, icon, "app title", "app summary")
- * .setAppEntity(2, icon, "app title", "app summary")
+ * .setAppEntity(0, appEntityInfo)
+ * .setAppEntity(1, appEntityInfo)
+ * .setAppEntity(2, appEntityInfo)
* .apply();
* </pre>
*/
@@ -81,13 +73,13 @@ public class AppEntitiesHeaderController {
private static final String TAG = "AppEntitiesHeaderCtl";
@VisibleForTesting
- static final int MAXIMUM_APPS = 3;
+ public static final int MAXIMUM_APPS = 3;
private final Context mContext;
private final TextView mHeaderTitleView;
private final Button mHeaderDetailsView;
- private final AppEntity[] mAppEntities;
+ private final AppEntityInfo[] mAppEntityInfos;
private final View[] mAppEntityViews;
private final ImageView[] mAppIconViews;
private final TextView[] mAppTitleViews;
@@ -100,7 +92,7 @@ public class AppEntitiesHeaderController {
/**
* Creates a new instance of the controller.
*
- * @param context the Context the view is running in
+ * @param context the Context the view is running in
* @param appEntitiesHeaderView view was inflated from <code>app_entities_header</code>
*/
public static AppEntitiesHeaderController newInstance(@NonNull Context context,
@@ -113,7 +105,7 @@ public class AppEntitiesHeaderController {
mHeaderTitleView = appEntitiesHeaderView.findViewById(R.id.header_title);
mHeaderDetailsView = appEntitiesHeaderView.findViewById(R.id.header_details);
- mAppEntities = new AppEntity[MAXIMUM_APPS];
+ mAppEntityInfos = new AppEntityInfo[MAXIMUM_APPS];
mAppIconViews = new ImageView[MAXIMUM_APPS];
mAppTitleViews = new TextView[MAXIMUM_APPS];
mAppSummaryViews = new TextView[MAXIMUM_APPS];
@@ -162,16 +154,13 @@ public class AppEntitiesHeaderController {
/**
* Set an app entity at a specified position view.
*
- * @param index the index at which the specified view is to be inserted
- * @param icon the icon of app entity
- * @param titleRes the title of app entity
- * @param summaryRes the summary of app entity
+ * @param index the index at which the specified view is to be inserted
+ * @param appEntityInfo the information of an app entity
* @return this {@code AppEntitiesHeaderController} object
*/
- public AppEntitiesHeaderController setAppEntity(int index, @NonNull Drawable icon,
- @Nullable CharSequence titleRes, @Nullable CharSequence summaryRes) {
- final AppEntity appEntity = new AppEntity(icon, titleRes, summaryRes);
- mAppEntities[index] = appEntity;
+ public AppEntitiesHeaderController setAppEntity(int index,
+ @NonNull AppEntityInfo appEntityInfo) {
+ mAppEntityInfos[index] = appEntityInfo;
return this;
}
@@ -182,7 +171,7 @@ public class AppEntitiesHeaderController {
* @return this {@code AppEntitiesHeaderController} object
*/
public AppEntitiesHeaderController removeAppEntity(int index) {
- mAppEntities[index] = null;
+ mAppEntityInfos[index] = null;
return this;
}
@@ -237,31 +226,23 @@ public class AppEntitiesHeaderController {
}
private void bindAppEntityView(int index) {
- final AppEntity appEntity = mAppEntities[index];
- mAppEntityViews[index].setVisibility(appEntity != null ? View.VISIBLE : View.GONE);
+ final AppEntityInfo appEntityInfo = mAppEntityInfos[index];
+ mAppEntityViews[index].setVisibility(appEntityInfo != null ? View.VISIBLE : View.GONE);
- if (appEntity != null) {
- mAppIconViews[index].setImageDrawable(appEntity.icon);
+ if (appEntityInfo != null) {
+ mAppEntityViews[index].setOnClickListener(appEntityInfo.getClickListener());
+ mAppIconViews[index].setImageDrawable(appEntityInfo.getIcon());
+
+ final CharSequence title = appEntityInfo.getTitle();
mAppTitleViews[index].setVisibility(
- TextUtils.isEmpty(appEntity.title) ? View.INVISIBLE : View.VISIBLE);
- mAppTitleViews[index].setText(appEntity.title);
+ TextUtils.isEmpty(title) ? View.INVISIBLE : View.VISIBLE);
+ mAppTitleViews[index].setText(title);
+ final CharSequence summary = appEntityInfo.getSummary();
mAppSummaryViews[index].setVisibility(
- TextUtils.isEmpty(appEntity.summary) ? View.INVISIBLE : View.VISIBLE);
- mAppSummaryViews[index].setText(appEntity.summary);
- }
- }
-
- private static class AppEntity {
- public final Drawable icon;
- public final CharSequence title;
- public final CharSequence summary;
-
- AppEntity(Drawable appIcon, CharSequence appTitle, CharSequence appSummary) {
- icon = appIcon;
- title = appTitle;
- summary = appSummary;
+ TextUtils.isEmpty(summary) ? View.INVISIBLE : View.VISIBLE);
+ mAppSummaryViews[index].setText(summary);
}
}
}
diff --git a/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntityInfo.java b/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntityInfo.java
new file mode 100644
index 000000000000..1e55f2e99bfc
--- /dev/null
+++ b/packages/SettingsLib/EntityHeaderWidgets/src/com/android/settingslib/widget/AppEntityInfo.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.widget;
+
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * AppEntityInfo is responsible for storing app information shown in {@link R.xml.app_view.xml}.
+ */
+public class AppEntityInfo {
+
+ private final Drawable mIcon;
+ private final CharSequence mTitle;
+ private final CharSequence mSummary;
+ private final View.OnClickListener mClickListener;
+
+ /**
+ * Gets the drawable for the icon of app entity.
+ *
+ * @return the drawable for the icon of app entity.
+ */
+ public Drawable getIcon() {
+ return mIcon;
+ }
+
+ /**
+ * Gets the text for the title of app enitity.
+ *
+ * @return the text for the title of app enitity.
+ */
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * Gets the text for the summary of app enitity.
+ *
+ * @return the text for the summary of app enitity.
+ */
+ public CharSequence getSummary() {
+ return mSummary;
+ }
+
+ /**
+ * Gets the click listener for the app entity view.
+ *
+ * @return click listener for the app entity view.
+ */
+ public View.OnClickListener getClickListener() {
+ return mClickListener;
+ }
+
+ private AppEntityInfo(Builder builder) {
+ mIcon = builder.mIcon;
+ mTitle = builder.mTitle;
+ mSummary = builder.mSummary;
+ mClickListener = builder.mClickListener;
+ }
+
+ /**
+ * Builder class for {@link AppEntityInfo}
+ */
+ public static class Builder {
+
+ private Drawable mIcon;
+ private CharSequence mTitle;
+ private CharSequence mSummary;
+ private View.OnClickListener mClickListener;
+
+ /**
+ * Creates an instance of a {@link AppEntityInfo} based on the current builder settings.
+ *
+ * @return The {@link AppEntityInfo}.
+ */
+ public AppEntityInfo build() {
+ return new AppEntityInfo(this);
+ }
+
+ /**
+ * Sets the drawable for the icon.
+ */
+ public Builder setIcon(@NonNull Drawable icon) {
+ mIcon = icon;
+ return this;
+ }
+
+ /**
+ * Sets the text for the title.
+ */
+ public Builder setTitle(@Nullable CharSequence title) {
+ mTitle = title;
+ return this;
+ }
+
+ /**
+ * Sets the text for the summary.
+ */
+ public Builder setSummary(@Nullable CharSequence summary) {
+ mSummary = summary;
+ return this;
+ }
+
+ /**
+ * Sets the click listener for app entity view.
+ */
+ public Builder setOnClickListener(@Nullable View.OnClickListener clickListener) {
+ mClickListener = clickListener;
+ return this;
+ }
+ }
+}
diff --git a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml
index 3787005ecfbb..237d62ea159c 100644
--- a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="search_menu" msgid="1604061903696928905">"تنظیمات جستجو"</string>
+ <string name="search_menu" msgid="1604061903696928905">"جستجوی تنظیمات"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 1dd783835265..080fcc2ce3c0 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Outomaties deur %1$s gekoppel"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Outomaties deur netwerkgraderingverskaffer gekoppel"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Gekoppel via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Beskikbaar via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Gekoppel, geen internet nie"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Geen internet nie"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Aanmelding word vereis"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt is tydelik vol"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Gekoppel via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Beskikbaar via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Baie stadig"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Stadig"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nuwe rugsteunwagwoord ingestel"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nuwe wagwoord en bevestiging stem nie ooreen nie"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Rugsteunwagwoord kon nie ingestel word nie"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Laai tans …"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Lewendig (verstek)"</item>
<item msgid="8446070607501413455">"Natuurlik"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vra elke keer"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sopas"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Aansluitingprogram om opgedateerde grafikadrywer in ontwikkeling te gebruik"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Foonluidspreker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 2ce5f444834e..53d1c4d5d393 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"በ%1$s በኩል በራስ-ሰር ተገናኝቷል"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"በአውታረ መረብ ደረጃ ሰጪ አቅራቢ በኩል በራስ-ሰር ተገናኝቷል"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"በ%1$s በኩል መገናኘት"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"በ%1$s በኩል የሚገኝ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ተገናኝቷል፣ ምንም በይነመረብ የለም"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ምንም በይነመረብ የለም"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ወደ መለያ መግባት ያስፈልጋል"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"የመዳረሻ ነጥብ ለጊዜው ሞልቷል"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"በ%1$s በኩል ተገናኝቷል"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"በ%1$s በኩል የሚገኝ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"በጣም ቀርፋፋ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"አዘግይ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"እሺ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"አዲስ የምትኬ ይለፍ ቃል ተዋቅሯል"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"አዲሱ የይለፍ ቃል እና ማረጋገጫው አይዛመዱም"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"የምትኬ ይለፍ ቃል ማዋቀር አልተሳካም"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"በመጫን ላይ…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ነዛሪ (ነባሪ)"</item>
<item msgid="8446070607501413455">"ተፈጥሯዊ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ሁልጊዜ ጠይቅ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ልክ አሁን"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"በግንባታ ላይ የተዘመነ የግራፊክስ ነጂን ለመጠቀም መተግበሪያን መርጠው ያስገቡ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"የስልክ ድምጽ ማጉያ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 23f3a12db8de..81755a78f1e2 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"‏تم الاتصال تلقائيًا عبر %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"تم الاتصال تلقائيًا عبر مقدم خدمة تقييم الشبكة"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"‏تم الاتصال عبر %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"‏متوفرة عبر %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصلة ولكن بلا إنترنت"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"لا يتوفر اتصال إنترنت."</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"يلزم تسجيل الدخول"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"نقطة الدخول ممتلئة مؤقتًا"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"‏تم الاتصال عبر %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"‏متوفرة عبر %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"بطيئة جدًا"</string>
<string name="speed_label_slow" msgid="813109590815810235">"بطيئة"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"موافق"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"تم تعيين كلمة مرور احتياطية جديدة"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"كلمة المرور الجديدة وتأكيدها لا يتطابقان"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"تعذّر تعيين كلمة مرور احتياطية"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"جارٍ التحميل…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"نابض بالحياة (تلقائي)"</item>
<item msgid="8446070607501413455">"طبيعي"</item>
@@ -453,6 +528,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"الطلب في كل مرة"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"إلى أن توقف الوضع يدويًا"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"للتو"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"فعِّل التطبيق لاستخدام برنامج تشغيل الرسومات المُحدَّث في تطوير البرامج."</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"مكبر صوت الهاتف"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index 39c0b00f09ba..c0a2179c6807 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -40,7 +40,7 @@
<item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰি থকা হৈছে…"</item>
<item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ জৰিয়তে সত্যাপন কৰি থকা হৈছে…"</item>
<item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ আইপি ঠিকনা পৰা সংগ্ৰহ কৰি থকা হৈছে…"</item>
- <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰা হ\'ল"</item>
+ <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰা হ’ল"</item>
<item msgid="1330262655415760617">"স্থগিত"</item>
<item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ পৰা সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</item>
<item msgid="197508606402264311">"সংযোগ বিচ্ছিন্ন"</item>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 86d145916510..6cb0c3e7bfc8 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -32,19 +32,93 @@
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\'ৰ সৈতে সংযোগ কৰিব পৰা নাই"</string>
<string name="wifi_check_password_try_again" msgid="516958988102584767">"পাছৱৰ্ড পৰীক্ষা কৰি আকৌ চেষ্টা কৰক"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"পৰিসৰৰ ভিতৰত নাই"</string>
- <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্ৰিয়ভাৱে সংযোগ নহ\'ব"</string>
+ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্ৰিয়ভাৱে সংযোগ নহ’ব"</string>
<string name="wifi_no_internet" msgid="4663834955626848401">"ইণ্টাৰনেট সংযোগ নাই"</string>
<string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g>এ ছেভ কৰিছে"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s মাধ্যমেদি স্বয়ংক্ৰিয়ভাৱে সংযোগ কৰা হৈছে"</string>
- <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ\'ল"</string>
+ <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ’ল"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ মাধ্যমেদি সংযোগ কৰা হৈছে"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ইণ্টাৰনেট সংযোগ নাই"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ছাইন ইন কৰা দৰকাৰী"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$sৰ যোগেৰে সংযোজিত"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"অতি লেহেম"</string>
<string name="speed_label_slow" msgid="813109590815810235">"লেহেমীয়া"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ঠিক"</string>
@@ -55,16 +129,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন কৰা হ’ল"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"সংযোগ কৰি থকা হৈছে…"</string>
- <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> সংযোগ কৰা হ\'ল"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> সংযোগ কৰা হ’ল"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"যোৰা লগোৱা হৈছে…"</string>
- <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"সংযোগ কৰা হ\'ল (ফ\'ন নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"সংযোগ কৰা হ\'ল (মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"সংযোগ কৰা হ\'ল (বাৰ্তাত প্ৰৱেশাধিকাৰ নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"সংযোগ কৰা হ\'ল (কোনো ফ\'ন বা মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"সংযোগ কৰা হ\'ল, বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"সংযোগ কৰা হ\'ল (ফ\'ন নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"সংযোগ কৰা হ\'ল (মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"সংযোগ কৰা হ\'ল (কোনো ফ\'ন বা মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"সংযোগ কৰা হ’ল (ফ\'ন নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"সংযোগ কৰা হ’ল (মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"সংযোগ কৰা হ’ল (বাৰ্তাত প্ৰৱেশাধিকাৰ নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"সংযোগ কৰা হ’ল (কোনো ফ\'ন বা মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"সংযোগ কৰা হ’ল, বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"সংযোগ কৰা হ’ল (ফ\'ন নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"সংযোগ কৰা হ’ল (মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"সংযোগ কৰা হ’ল (কোনো ফ\'ন বা মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level" msgid="3149689299296462009">"সক্ৰিয়, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰি"</string>
<string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰি"</string>
<string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"সক্ৰিয়"</string>
@@ -81,9 +155,9 @@
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"এইচ্ছডি অডি\'অ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"এইচ্ছডি অডিঅ’"</string>
<string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"শ্ৰৱণ যন্ত্ৰ"</string>
- <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"শ্ৰৱণ যন্ত্ৰৰ লগত সংযোগ কৰা হ\'ল"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"শ্ৰৱণ যন্ত্ৰৰ লগত সংযোগ কৰা হ’ল"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিঅ’লৈ সংযোগ হৈছে"</string>
- <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিঅ\'ৰ লগত সংযোগ কৰা হ\'ল"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফ’ন অডিঅ\'ৰ লগত সংযোগ কৰা হ’ল"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল ট্ৰান্সফাৰ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ আছে"</string>
<string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"মেপৰ সৈতে সংযোগ কৰক"</string>
<string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAPৰ সৈতে সংযোজিত হৈ আছে"</string>
@@ -206,10 +280,10 @@
<string name="mock_location_app_not_set" msgid="809543285495344223">"কোনো নকল অৱস্থান এপ্ নিৰ্ধাৰণ কৰা হোৱা নাই"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"নকল অৱস্থানৰ এপ্: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"নেটৱৰ্কিং"</string>
- <string name="wifi_display_certification" msgid="8611569543791307533">"বেতাঁৰ ডিছপ্লে প্ৰমাণীকৰণ"</string>
+ <string name="wifi_display_certification" msgid="8611569543791307533">"বেতাঁৰ ডিছপ্লে’ প্ৰমাণীকৰণ"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক"</string>
<string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"সংযুক্ত MAC যাদৃচ্ছিকৰণ"</string>
- <string name="mobile_data_always_on" msgid="8774857027458200434">"ম\'বাইল ডেটা সদা-সক্ৰিয়"</string>
+ <string name="mobile_data_always_on" msgid="8774857027458200434">"ম’বাইল ডেটা সদা-সক্ৰিয়"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"পূৰ্ণ মাত্ৰাৰ ভলিউম অক্ষম কৰক"</string>
@@ -233,7 +307,7 @@
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ব্যক্তিগত ডিএনএছ প্ৰদানকাৰীৰ হোষ্টনাম"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ডিএনএছ সেৱা যোগানকাৰীৰ হ\'ষ্টনাম দিয়ক"</string>
<string name="private_dns_mode_provider_failure" msgid="231837290365031223">"সংযোগ কৰিব পৰা নগ\'ল"</string>
- <string name="wifi_display_certification_summary" msgid="1155182309166746973">"বেতাঁৰ ডিছপ্লে প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string>
+ <string name="wifi_display_certification_summary" msgid="1155182309166746973">"বেতাঁৰ ডিছপ্লে’ প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ৱাই-ফাই নেটৱৰ্কৰ লগত সংযোগ কৰি থকাৰ সময়ত MAC ঠিকনা যাদৃচ্ছিক কৰক"</string>
<string name="wifi_metered_label" msgid="4514924227256839725">"নিৰিখ-নিৰ্দিষ্ট"</string>
@@ -249,7 +323,7 @@
<string name="allow_mock_location" msgid="2787962564578664888">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"দৃশ্যৰ গুণাগুণ নিৰীক্ষণ সক্ষম কৰক"</string>
- <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ৱাই-ফাই থকা সময়তো সদায় ম\'বাইল ডেটা সক্ৰিয় ৰাখক (খৰতকীয়াকৈ নেটৱৰ্ক সলনি কৰিবৰ বাবে)।"</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ৱাই-ফাই থকা সময়তো সদায় ম’বাইল ডেটা সক্ৰিয় ৰাখক (খৰতকীয়াকৈ নেটৱৰ্ক সলনি কৰিবৰ বাবে)।"</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"যদিহে উপলব্ধ হয় তেন্তে টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ ব্যৱহাৰ কৰক"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"ইউএছবি ডিবাগিঙৰ অনুমতি দিয়েনে?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"ইউএছবি ডিবাগ কৰা কাৰ্য কেৱল বিকাশৰ উদ্দেশ্যৰেহে কৰা হৈছে৷ আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ এইটো ব্যৱহাৰ কৰক, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্‌সমূহ ইনষ্টল কৰক আৰু লগ ডেটা পঢ়ক৷"</string>
@@ -285,7 +359,7 @@
<string name="show_touches_summary" msgid="6101183132903926324">"টিপিলে দৃশ্যায়িত ফীডবেক দিয়ক"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"পৃষ্ঠভাগৰ আপডেইট দেখুৱাওক"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"আপডেইট হওতে গোটেই ৱিণ্ড পৃষ্ঠসমূহ ফ্লাশ্ব কৰক"</string>
- <string name="show_hw_screen_updates" msgid="4117270979975470789">"আপডেট চাওক দেখুৱাওক"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"আপডে’ট চাওক দেখুৱাওক"</string>
<string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"অঁকাৰ সময়ত ৱিণ্ড\'ৰ ভিতৰত ফ্লাশ্ব দৰ্শন"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"হাৰ্ডৱেৰৰ তৰপৰ আপডেইট দেখুৱাওক"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"হাৰ্ডৱেৰ লেয়াৰ আপডেইট হওতে সিঁহতক সেউজীয়া ৰঙেৰে ফ্লাশ্ব কৰক"</string>
@@ -327,9 +401,10 @@
<string name="local_backup_password_title" msgid="3860471654439418822">"ডেস্কটপ বেকআপ পাছৱৰ্ড"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"ডেস্কটপৰ পূৰ্ণ বেকআপ এতিয়ালৈকে সংৰক্ষিত অৱস্থাত নাই"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"ডেস্কটপ সম্পূৰ্ণ বেকআপৰ বাবে পাছৱৰ্ডটো সলনি কৰিবলৈ বা আঁতৰাবলৈ টিপক"</string>
- <string name="local_backup_password_toast_success" msgid="582016086228434290">"নতুন বেকআপ পাছৱৰ্ড ছেট কৰা হ\'ল"</string>
+ <string name="local_backup_password_toast_success" msgid="582016086228434290">"নতুন বেকআপ পাছৱৰ্ড ছেট কৰা হ’ল"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"নতুন পাছৱৰ্ডটোৰ লগত নিশ্চিত কৰা পাছৱৰ্ডটো মিলা নাই"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"বেকআপ পাছৱৰ্ড নিৰ্ধাৰণ কৰিব পৰা নহ\'ল"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ল’ড হৈ আছে…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"জীৱন্ত (ডিফ\'ল্ট)"</item>
<item msgid="8446070607501413455">"প্ৰাকৃতিক"</item>
@@ -422,15 +497,15 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>ৰ ছেটিংবিলাক খুলিব পৰা নগ\'ল"</string>
<string name="ime_security_warning" msgid="4135828934735934248">"এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি সকলো পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> এপটোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ\'ব"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ’ব"</string>
<string name="ims_reg_title" msgid="7609782759207241443">"আইএমএছ পঞ্জীয়ন স্থিতি"</string>
<string name="ims_reg_status_registered" msgid="933003316932739188">"পঞ্জীকৃত"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"পঞ্জীকৃত নহয়"</string>
<string name="status_unavailable" msgid="7862009036663793314">"উপলব্ধ নহয়"</string>
<string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ক্ৰমানুসৰি ছেট কৰা হোৱা নাই"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
- <item quantity="one">%1$dটা ডিভাইচ সংযোগ হ\'ল</item>
- <item quantity="other">%1$dটা ডিভাইচ সংযোগ হ\'ল</item>
+ <item quantity="one">%1$dটা ডিভাইচ সংযোগ হ’ল</item>
+ <item quantity="other">%1$dটা ডিভাইচ সংযোগ হ’ল</item>
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"অধিক সময়।"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"কম সময়।"</string>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্ৰতিবাৰতে সোধক"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এই মাত্ৰ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"বিকাশকাৰ্য চলি থকা আপডে\'টেড গ্ৰাফিক ড্ৰাইভাৰ ব্যৱহাৰ কৰিবলৈ এপ্ অপ্ট ইন কৰক"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ফ’নৰ স্পীকাৰ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 17d0ca622a61..d30834f23fb1 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s üzərindən avtomatik qoşuldu"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Avtomatik olaraq şəbəkə reytinq provayderi ilə qoşuludur"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s vasitəsilə qoşuludur"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s vasitəsilə əlçatandır"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Qoşuludur, internet yoxdur"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yoxdur"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Giriş tələb olunur"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Giriş nöqtəsi müvəqqəti olaraq doludur"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ilə qoşuludur"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s vasitəsilə əlçatandır"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Çox Yavaş"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Yeni rezerv parolu ayarlandı"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Yeni parol və parolun təkrarı uyğun gəlmir"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Yedəkləmə parolu xətası"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Yüklənir…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Canlı (defolt)"</item>
<item msgid="8446070607501413455">"Təbii"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Hər dəfə soruşun"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Deaktiv edənə qədər"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"İndicə"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Qrafik drayverdən istifadə etmək üçün tətbiq seçin"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefon spikeri"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 56052d214464..427daab2fed6 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano preko %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano preko dobavljača ocene mreže"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupna je preko pristupne tačke %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Veza je uspostavljena, nema interneta"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema interneta"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Treba da se prijavite"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno zauzeta"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezano preko %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupno preko %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma spora"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Spora"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Potvrdi"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Postavljena je nova lozinka rezervne kopije"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i njena potvrda se ne podudaraju"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Postavljanje lozinke rezervne kopije nije uspelo"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Učitava se…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Živopisan (podrazumevano)"</item>
<item msgid="8446070607501413455">"Prirodan"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uvek pitaj"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Omogući aplikaciju za korišćenje upravljačkog programa grafičke katice u razvoju"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Zvučnik telefona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f2c204617b82..a156caf06040 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Аўтаматычна падключана праз %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Аўтаматычна падключана праз пастаўшчыка паслугі ацэнкі сеткі"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Даступна праз %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Падключана, без доступу да інтэрнэту"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Не падключана да інтэрнэту"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Трэба выканаць уваход"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пункт доступу часова заняты"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Падлучана праз %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Даступна праз %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Вельмі павольная"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Павольная"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Усталяваны новы пароль для рэзервовага капіявання"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новы пароль і яго пацвярджэнне не супадаюць"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Збой пры ўсталёўцы паролю для рэзервовага капіявання"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Ідзе загрузка…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Сочны (па змаўчанні)"</item>
<item msgid="8446070607501413455">"Натуральны"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Заўсёды пытацца"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Зараз"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Выбраная праграма, якая выкарыстоўвае абноўлены драйвер графічнай сістэмы (падчас распрацоўкі)"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Дынамік тэлефона"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 5b8d6b877b2a..83336460d542 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматично е установена връзка чрез %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматично е установена връзка чрез доставчик на услуги за оценяване на мрежите"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Установена е връзка през „%1$s“"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Мрежата е достъпна през „%1$s“"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Установена е връзка – няма достъп до интернет"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Няма връзка с интернет"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Изисква се вход в профила"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точката за достъп временно е пълна"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Установена е връзка през %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Мрежата е достъпна през %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Много бавна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Зададена е нова парола за резервно копие"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новата парола и въведената за потвърждаване не съвпадат"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Задаването на парола за резервно копие не бе успешно"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Зарежда се…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Ярък (по подразбиране)"</item>
<item msgid="8446070607501413455">"Естествен"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Да се пита винаги"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"До изключване"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Току-що"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Включване на приложението за използване на актуализирания графичен драйвер в разработка"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Високоговорител на телефона"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 7efad9998ae1..c7b3afea80d4 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"স্বয়ংক্রিয়ভাবে %1$s এর মাধ্যমে কানেক্ট হয়েছে"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটওয়ার্কের রেটিং প্রদানকারীর মাধ্যমে অটোমেটিক কানেক্ট"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে কানেক্ট হয়েছে"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"কানেক্ট, ইন্টারনেট নেই"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ইন্টারনেট কানেকশন নেই"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"সাইন-ইন করা দরকার"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"এই মুহূর্তে অ্যাক্সেস পয়েন্টের কোনও কানেকশন ফাঁকা নেই"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s এর মাধ্যমে কানেক্ট হয়েছে"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s এর মাধ্যমে পাওয়া যাচ্ছে"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"খুব ধীরে"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ধীরে"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ঠিক আছে"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"নতুন ব্যাকআপ পাসওয়ার্ড সেট করুন"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"নতুন পাসওয়ার্ড এবং নিশ্চিতকরণ মিলছে না"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ব্যাকআপ পাসওয়ার্ড সেট করা ব্যর্থ"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"লোড হচ্ছে…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ভাইব্রেন্ট (ডিফল্ট)"</item>
<item msgid="8446070607501413455">"প্রাকৃতিক"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্রতিবার জিজ্ঞেস করা হবে"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এখনই"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ডেভলপমেন্টে আপডেট হওয়া গ্রাফিক্স ড্রাইভার ব্যবহার করতে অ্যাপ বেছে নিন"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ফেনের স্পিকার"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 92435f7ef1b8..715a8a5a85c4 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -27,7 +27,7 @@
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Greška u konfiguraciji IP-a"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Niste povezani zbog slabog kvaliteta mreže"</string>
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Greška pri povezivanju na WiFi"</string>
- <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem pri provjeri vjerodostojnosti."</string>
+ <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem pri autentifikaciji."</string>
<string name="wifi_cant_connect" msgid="5410016875644565884">"Nije se moguće povezati"</string>
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"Nije se moguće povezati na aplikaciju \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string>
<string name="wifi_check_password_try_again" msgid="516958988102584767">"Provjerite lozinku i pokušajte ponovo"</string>
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano koristeći %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano putem ocjenjivača mreže"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupan preko %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, nema interneta"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema internetske veze"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Potrebna je prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno puna"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezano koristeći %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupna koristeći %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma sporo"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"UREDU"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za sigurnosnu kopiju je postavljena"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i potvrda se ne podudaraju"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje lozinke za sigurnosnu kopiju"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Učitavanje…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Živopisno (zadano)"</item>
<item msgid="8446070607501413455">"Prirodan"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Prijavi aplikaciju za korištenje ažuriranog grafičkog drajvera u razvoju"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Zvučnik telefona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 3182f16fee44..56f55dd1bcbc 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Connectada automàticament a través de: %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connectada, sense Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sense connexió a Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Cal iniciar la sessió"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punt d\'accés està temporalment ple"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connectat mitjançant %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible mitjançant %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Molt lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Correcta"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"S\'ha definit una contrasenya de seguretat nova"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"La contrasenya nova i la confirmació no coincideixen"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Error en definir la contrasenya de seguretat"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Carregant…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (predeterminat)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pregunta sempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Fins que no ho desactivis"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ara mateix"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Aplicació activada per utilitzar el controlador de gràfics actualitzat en desenvolupament"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altaveu del telèfon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 37854334c273..edbb3581403b 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaticky připojeno přes poskytovatele %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automaticky připojeno přes poskytovatele hodnocení sítí"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Připojeno prostřednictvím %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupné prostřednictvím %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Připojeno, není k dispozici internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nejste připojeni k internetu"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Je vyžadováno přihlášení"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Přístupový bod je dočasně zaplněn"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Připojeno prostřednictvím %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupné prostřednictvím %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Velmi pomalá"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Pomalá"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nové heslo pro zálohy je nastaveno"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nové heslo se neshoduje s potvrzením hesla."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nastavení hesla pro zálohy selhalo"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Načítání…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Jasné (výchozí)"</item>
<item msgid="8446070607501413455">"Přirozené"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pokaždé se zeptat"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokud tuto funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Právě teď"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Přihlaste aplikaci k použití vyvíjeného aktualizovaného grafického ovladače"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Reproduktor telefonu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index eeeccee81948..1d3457978d81 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisk tilsluttet via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisk forbundet via udbyder af netværksvurdering"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilsluttet via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgængelig via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilsluttet – intet internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Intet internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Login er påkrævet"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Adgangspunktet er midlertidigt fuldt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tilsluttet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tilgængelig via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Meget langsom"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langsom"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -73,8 +147,8 @@
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverførsel"</string>
<string name="bluetooth_profile_hid" msgid="3680729023366986480">"Inputenhed"</string>
<string name="bluetooth_profile_pan" msgid="3391606497945147673">"Internetadgang"</string>
- <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"Deling af kontaktpersoner"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"Brug til deling af kontaktpersoner"</string>
+ <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"Deling af kontakter"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"Brug til deling af kontakter"</string>
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deling af internetforbindelse"</string>
<string name="bluetooth_profile_map" msgid="1019763341565580450">"Sms-beskeder"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-adgang"</string>
@@ -102,7 +176,7 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Par"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ACCEPTÉR PARRING"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annuller"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Parring giver adgang til dine kontaktpersoner og din opkaldshistorik, når enhederne er forbundet."</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Parring giver adgang til dine kontakter og din opkaldshistorik, når enhederne er forbundet."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Der kunne ikke parres med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Der kunne ikke parres med <xliff:g id="DEVICE_NAME">%1$s</xliff:g> på grund af en forkert pinkode eller adgangsnøgle."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Der kan ikke kommunikeres med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
@@ -252,7 +326,7 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Hold altid mobildata aktiveret, selv når Wi-Fi er aktiveret (for at skifte hurtigt mellem netværk)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Brug hardwareacceleration ved netdeling, hvis det er muligt"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"Vil du tillade USB-fejlretning?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB-fejlretning er kun beregnet til udvikling og kan bruges til at kopiere data mellem din computer og enheden, installere apps på enheden uden underretning og læse logdata."</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"USB-fejlretning er kun beregnet til udvikling og kan bruges til at kopiere data mellem din computer og enheden, installere apps på enheden uden notifikation og læse logdata."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"Vil du ophæve adgangen til USB-fejlfinding for alle computere, du tidligere har godkendt?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"Vil du tillade udviklingsindstillinger?"</string>
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Disse indstillinger er kun beregnet til brug i forbindelse med udvikling. De kan forårsage, at din enhed og dens apps går ned eller ikke fungerer korrekt."</string>
@@ -316,8 +390,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Grænse for baggrundsprocesser"</string>
<string name="show_all_anrs" msgid="4924885492787069007">"Vis ANR-fejl i baggrunden"</string>
<string name="show_all_anrs_summary" msgid="6636514318275139826">"Vis dialogboksen \"Appen svarer ikke\" for baggrundsapps"</string>
- <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Vis advarsler om underretningskanal"</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Viser en advarsel, når en app sender en underretning uden en gyldig kanal"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Vis advarsler om notifikationskanal"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Viser en advarsel, når en app sender en notifikation uden en gyldig kanal"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"Gennemtving tilladelse til eksternt lager"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til at kunne tilpasses"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Ny adgangskode til sikkerhedskopi er angivet"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Ny adgangskode og bekræftelse matcher ikke"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Fejl ved angivelse af adgangskode til sikkerhedskopi"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Indlæser…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Klare (standard)"</item>
<item msgid="8446070607501413455">"Naturlige"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spørg hver gang"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Lige nu"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Tilvælg en app, der skal bruge den opdaterede grafikdriver under udvikling"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefonens højttaler"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 95f7416b1ae3..1abc35913ac1 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisch über %1$s verbunden"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisch über Anbieter von Netzwerkbewertungen verbunden"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Über %1$s verbunden"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Verfügbar über %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbunden, kein Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Kein Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Anmeldung erforderlich"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Zugangspunkt vorübergehend voll belegt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Über %1$s verbunden"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Verfügbar über %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sehr langsam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langsam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Neues Sicherungspasswort festgelegt"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Das neue Passwort und die Bestätigung stimmen nicht überein."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Fehler beim Festlegen des Sicherungspassworts"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Wird geladen…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Brillant (Standardeinstellung)"</item>
<item msgid="8446070607501413455">"Natürlich"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Jedes Mal fragen"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Gerade eben"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"App aktivieren, um den aktualisierten Grafiktreiber in der Entwicklung zu verwenden"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefon-Lautsprecher"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 310b6cf04db7..eb575584cdc2 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Συνδέθηκε αυτόματα μέσω %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Συνδέθηκε αυτόματα μέσω παρόχου αξιολόγησης δικτύου"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Συνδέθηκε μέσω %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Διαθέσιμο μέσω %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Συνδέθηκε, χωρίς σύνδεση στο διαδίκτυο"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Απαιτείται σύνδεση"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Το σημείο πρόσβασης είναι προσωρινά πλήρες"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Συνδέθηκε μέσω %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Διαθέσιμο μέσω %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Πολύ αργή"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Αργή"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ΟΚ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Ορίστηκε νέος εφεδρικός κωδικός πρόσβασης"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Ο νέος κωδικός πρόσβασης και η επιβεβαίωση δεν ταιριάζουν"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Αποτυχία κατά τον ορισμό εφεδρικού κωδικού πρόσβασης"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Φόρτωση…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Ζωντανό (προεπιλογή)"</item>
<item msgid="8446070607501413455">"Φυσικό"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Να ερωτώμαι κάθε φορά"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Μόλις τώρα"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Επιλέξτε μια εφαρμογή για τη χρήση του ενημερωμένου προγράμματος οδήγησης γραφικών σε ανάπτυξη"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Ηχείο τηλεφώνου"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 5b11d63d4ac5..1f74d9b1029a 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"New backup password set"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"New password and confirmation don\'t match"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Failure setting backup password"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Loading…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (default)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Opt in app to use updated graphics driver in development"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Phone speaker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 5b11d63d4ac5..1f74d9b1029a 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"New backup password set"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"New password and confirmation don\'t match"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Failure setting backup password"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Loading…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (default)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Opt in app to use updated graphics driver in development"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Phone speaker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 5b11d63d4ac5..1f74d9b1029a 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"New backup password set"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"New password and confirmation don\'t match"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Failure setting backup password"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Loading…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (default)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Opt in app to use updated graphics driver in development"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Phone speaker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 5b11d63d4ac5..1f74d9b1029a 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"New backup password set"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"New password and confirmation don\'t match"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Failure setting backup password"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Loading…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (default)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Opt in app to use updated graphics driver in development"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Phone speaker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index d7ed49a067e4..082a33107a6c 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -38,13 +38,50 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‎‏‎Automatically connected via %1$s‎‏‎‎‏‎"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎Automatically connected via network rating provider‎‏‎‎‏‎"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎Connected via %1$s‎‏‎‎‏‎"</string>
+ <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="SSID">%1$s</xliff:g>‎‏‎‎‏‏‏‎ by ‎‏‎‎‏‏‎<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎Available via %1$s‎‏‎‎‏‎"</string>
+ <string name="tap_to_set_up" msgid="2468970825530423314">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎Tap to set up‎‏‎‎‏‎"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎Connected, no internet‎‏‎‎‏‎"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎No internet‎‏‎‎‏‎"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎Sign in required‎‏‎‎‏‎"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎Access point temporarily full‎‏‎‎‏‎"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎Connected via %1$s‎‏‎‎‏‎"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎‏‎Available via %1$s‎‏‎‎‏‎"</string>
+ <string name="osu_failure_ap_connection" msgid="598977488344424542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎Connection failed‎‏‎‎‏‎"</string>
+ <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎Invalid OSU server URL‎‏‎‎‏‎"</string>
+ <string name="osu_failure_server_connection" msgid="8192988165059982174">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎OSU server connection failed‎‏‎‎‏‎"</string>
+ <string name="osu_failure_server_validation" msgid="4631649978129606823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎OSU server validation failed‎‏‎‎‏‎"</string>
+ <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎Invalid OSU server certificate‎‏‎‎‏‎"</string>
+ <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎Provisioning aborted‎‏‎‎‏‎"</string>
+ <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎Provisioning not available‎‏‎‎‏‎"</string>
+ <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎Invalid OSU server URL‎‏‎‎‏‎"</string>
+ <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎Unexpected command type‎‏‎‎‏‎"</string>
+ <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎Unexpected SOAP message type‎‏‎‎‏‎"</string>
+ <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎SOAP message exchange failed‎‏‎‎‏‎"</string>
+ <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‎‎Redirect listener failed to start‎‏‎‎‏‎"</string>
+ <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎Timed out waiting for redirect‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎No OSU activity found‎‏‎‎‏‎"</string>
+ <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎Unexpected SOAP message status‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎Failed to find PPS-MO‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎Failed to find trust root node for AAA server‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‎‎Failed to find trust root node for remediation server‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎Failed to find trust root node for policy server‎‏‎‎‏‎"</string>
+ <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎Failed to retrieve trust root certificates‎‏‎‎‏‎"</string>
+ <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎Failed to find trust root certificate for AAA server‎‏‎‎‏‎"</string>
+ <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎Failed to add PassPoint configuration‎‏‎‎‏‎"</string>
+ <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎Failed to find an OSU provider‎‏‎‎‏‎"</string>
+ <string name="osu_status_ap_connecting" msgid="5296821043003441437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎Connecting‎‏‎‎‏‎"</string>
+ <string name="osu_status_ap_connected" msgid="3777289375683170728">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎Connected‎‏‎‎‏‎"</string>
+ <string name="osu_status_server_connecting" msgid="8499785407540355867">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎Connecting to OSU server‎‏‎‎‏‎"</string>
+ <string name="osu_status_server_validated" msgid="3158727184762596355">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎OSU server validated‎‏‎‎‏‎"</string>
+ <string name="osu_status_server_connected" msgid="8382024481520158168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎Connected to OSU server‎‏‎‎‏‎"</string>
+ <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎Initial SOAP exchange‎‏‎‎‏‎"</string>
+ <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎Waiting for redirect response‎‏‎‎‏‎"</string>
+ <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎Received redirect response‎‏‎‎‏‎"</string>
+ <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎Second SOAP exchange‎‏‎‎‏‎"</string>
+ <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎Third SOAP exchange‎‏‎‎‏‎"</string>
+ <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎Retrieving trust root certificates‎‏‎‎‏‎"</string>
+ <string name="osu_provisioning_complete" msgid="5120178802493970149">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‏‎Provisioning complete‎‏‎‎‏‎"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎Very Slow‎‏‎‎‏‎"</string>
<string name="speed_label_slow" msgid="813109590815810235">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‏‎Slow‎‏‎‎‏‎"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎OK‎‏‎‎‏‎"</string>
@@ -330,6 +367,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎New backup password set‎‏‎‎‏‎"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎New password and confirmation don’t match‎‏‎‎‏‎"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎Failure setting backup password‎‏‎‎‏‎"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎Loading…‎‏‎‎‏‎"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎Vibrant (default)‎‏‎‎‏‎"</item>
<item msgid="8446070607501413455">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎Natural‎‏‎‎‏‎"</item>
@@ -449,6 +487,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎Ask every time‎‏‎‎‏‎"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎Until you turn off‎‏‎‎‏‎"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎Just now‎‏‎‎‏‎"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎Opt in app to use updated graphcis driver in developement‎‏‎‎‏‎"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎Phone speaker‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index ecec63cd22cf..795ad9c8d655 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conexión automática mediante %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automáticamente mediante proveedor de calificación de red"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conexión a través de %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectado pero sin conexión a Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sin Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Acceso obligatorio"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punto de acceso está completo temporalmente"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conexión a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
@@ -144,7 +218,7 @@
<string name="tts_settings_title" msgid="1237820681016639683">"Salida de texto a voz"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Velocidad de voz"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Velocidad en la que se habla el texto"</string>
- <string name="tts_default_pitch_title" msgid="6135942113172488671">"Sonido"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tono"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Afecta el tono de la voz sintetizada"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Idioma"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Usar el idioma del sistema"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nueva contraseña de copia de seguridad definida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"La nueva contraseña y la de confirmación no coinciden."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Error al definir contraseña de copia de seguridad"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Cargando…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrante (predeterminado)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Recién"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Habilitar app para que use el controlador de gráficos actualizado en el desarrollo"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altavoz del teléfono"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index b8fdf30e673f..669871f85488 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectada automáticamente a través de %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automáticamente a través de un proveedor de valoración de redes"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sin Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sin Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Debes iniciar sesión"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto de acceso temporalmente lleno"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptable"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nueva contraseña de seguridad establecida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"La nueva contraseña y la de confirmación no coinciden"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Error al establecer la contraseña de seguridad"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Cargando…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrante (predeterminado)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que se desactive"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Justo ahora"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Habilitar aplicación para usar controlador de gráficos actualizado en desarrollo"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altavoz del teléfono"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 1246626ce6b1..0c9d28ea65a5 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Ühendus loodi automaatselt teenusega %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ühendus loodi automaatselt võrgukvaliteedi hinnangute pakkuja kaudu"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ühendatud üksuse %1$s kaudu"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Saadaval üksuse %1$s kaudu"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ühendatud, Interneti-ühendus puudub"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Interneti-ühendus puudub"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Nõutav on sisselogimine"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pääsupunkt on ajutiselt täis"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Ühendatud operaatori %1$s kaudu"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Saadaval operaatori %1$s kaudu"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Väga aeglane"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Aeglane"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Hea"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Uus varuparool on määratud"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Uus parool ja kinnitus ei ühti"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Varuparooli määramine ebaõnnestus"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Laadimine …"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Ere (vaikeseade)"</item>
<item msgid="8446070607501413455">"Loomulikud"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Küsi iga kord"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsja"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Lubage rakendus, et kasutada arenduses olevat värskendatud graafikadraiverit"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefoni kõlar"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 68b48408638a..2687d1d7d210 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s bidez automatikoki konektatuta"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatikoki konektatuta sareen balorazioen hornitzailearen bidez"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s bidez konektatuta"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s bidez erabilgarri"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Konektatuta; ezin da atzitu Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Ez dago Interneteko konexiorik"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Saioa hasi behar da"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Sarbide-puntua beteta dago aldi baterako"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s bidez konektatuta"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s bidez erabilgarri"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Oso motela"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Motela"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ados"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Babeskopiaren pasahitz berria ezarri da"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Pasahitz berria eta berrespena ez datoz bat"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Ezin izan da babeskopiaren pasahitza ezarri"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Kargatzen…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Bizia (balio lehenetsia)"</item>
<item msgid="8446070607501413455">"Naturala"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Galdetu beti"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Oraintxe"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Hautatu zein aplikaziorekin erabili nahi duzun garatze-prozesuan dagoen grafikoen kontrolatzaile eguneratua"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefonoaren bozgorailua"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 7882b0563a6b..ec6200febb7e 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"‏اتصال خودکار ازطریق %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"اتصال خودکار ازطریق ارائه‌دهنده رتبه‌بندی شبکه"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"‏متصل از طریق %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"‏در دسترس از طریق %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصل، بدون اینترنت"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"عدم دسترسی به اینترنت"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ورود به سیستم لازم است"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ظرفیت نقطه دسترسی موقتاً تکمیل شده است"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"‏متصل ازطریق %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"‏در دسترس ازطریق %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"بسیار آهسته"</string>
<string name="speed_label_slow" msgid="813109590815810235">"آهسته"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"تأیید"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"گذرواژه جدید نسخهٔ پشتیبان تنظیم شد"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"گذرواژه جدید و تأیید آن با یکدیگر مطابقت ندارند"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"گذرواژه پشتیبان‌گیری تنظیم نشد"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"بارگیری…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"پرطروات (پیش‌فرض)"</item>
<item msgid="8446070607501413455">"طبیعی"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"هربار پرسیده شود"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"تا زمانی‌که آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"هم‌اکنون"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"برنامه انتخاب‌شده برای استفاده از درایور گرافیک به‌روزرسانی‌شده در برنامه‌نویس"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"بلندگوی تلفن"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 1904c4d460e4..174caef15881 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaattinen yhteys muodostettu palvelun %1$s kautta"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Yhdistetty automaattisesti verkon arviointipalvelun kautta"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Yhdistetty seuraavan kautta: %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Käytettävissä seuraavan kautta: %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Yhdistetty, ei internetyhteyttä"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Ei internetyhteyttä"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sisäänkirjautuminen vaaditaan"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Yhteyspiste tilapäisesti täynnä"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Yhdistetty, verkko: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Käytettävissä, verkko: %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Hyvin hidas"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Hidas"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Uusi varasalasana asetettiin"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Uusi salasana ja vahvistus eivät täsmää"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Varasalasanan asetus epäonnistui"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Ladataan…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Voimakas (oletus)"</item>
<item msgid="8446070607501413455">"Luonnollinen"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Kysy aina"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Kunnes poistat sen käytöstä"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsken"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Lisää sovellus käyttämään päivitettyä grafiikkaohjainta kehitysvaiheessa"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Puhelimen kaiutin"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 45b2872820c8..f189d7700278 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiquement connecté par %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connecté automatiquement par le fournisseur d\'avis sur le réseau"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté par %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Accessible par %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Aucune connexion Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Connexion requise"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Le point d\'accès est temporairement plein"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connecté par %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Accessible par %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Le nouveau mot de passe de secours a bien été défini."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Le nouveau mot de passe et sa confirmation ne correspondent pas."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Échec de la définition du mot de passe de secours."</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Chargement en cours…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrantes (par défaut)"</item>
<item msgid="8446070607501413455">"Naturelles"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Sélectionnez l\'application pour utiliser le pilote graphique mis à jour en mode de conception"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Haut-parleur du téléphone"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 13361d74ede1..97cc5aa02258 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Connecté automatiquement via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connecté automatiquement via un fournisseur d\'évaluation de l\'état du réseau"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Aucun accès à Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Connexion requise"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Point d\'accès temporairement plein"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connecté via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Correct"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Le nouveau mot de passe de secours a bien été défini."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Le nouveau mot de passe et sa confirmation ne correspondent pas."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Échec de la définition du mot de passe de secours."</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Chargement…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Couleurs éclatantes (par défaut)"</item>
<item msgid="8446070607501413455">"Couleurs naturelles"</item>
@@ -371,10 +446,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant : <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Temps restant estimé en fonction de votre utilisation : <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Temps restant estimé en fonction de votre utilisation : <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_discharge_by" msgid="6453537733650125582">"Temps restant estimé : <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_discharge_by_only" msgid="107616694963545745">"Temps restant estimé : <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_short" msgid="1372817269546888804">"Jusqu\'à <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Sélectionner une application pour le développement de laquelle utiliser le pilote graphique mis à jour"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Haut-parleur du téléphone"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index e8cf009c07a3..fb63a9d39c37 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectouse automaticamente a través de %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectada automaticamente a través dun provedor de valoración de rede"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dispoñible a través de %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sen Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Non hai conexión a Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"É obrigatorio iniciar sesión"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"O punto de acceso está temporalmente cheo"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dispoñible a través de %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Moi lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Novo contrasinal da copia de seguranza definido"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"O contrasinal novo e a confirmación non coinciden"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Erro ao definir un contrasinal da copia de seguranza"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Cargando…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Brillante (predeterminado)"</item>
<item msgid="8446070607501413455">"Naturais"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar sempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Subscribirse á aplicación para utilizar o controlador de gráficos actualizado en desenvolvemento"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altofalante do teléfono"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 918920dbb8bf..54fa7d1aad04 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s દ્વારા સ્વત: કનેક્ટ થયેલ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"નેટવર્ક રેટિંગ પ્રદાતા દ્વારા આપમેળે કનેક્ટ થયું"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s દ્વારા ઉપલબ્ધ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"કનેક્ટ કર્યું, કોઈ ઇન્ટરનેટ નથી"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ઇન્ટરનેટ ઍક્સેસ નથી"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"સાઇન ઇન આવશ્યક"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ઍક્સેસ પૉઇન્ટ અસ્થાયીરૂપે ભરાયેલ છે"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s દ્વારા ઉપલબ્ધ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ખૂબ જ ધીમી"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ધીમી"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ઓકે"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"નવો બેકઅપ પાસવર્ડ સેટ કર્યો છે"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"નવો પાસવર્ડ અને પુષ્ટિકરણ મેળ ખાતા નથી"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"નિષ્ફળતા સેટિંગ બેકઅપ પાસવર્ડ"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"લોડ થઈ રહ્યું છે…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"વાઇબ્રન્ટ (ડિફોલ્ટ)"</item>
<item msgid="8446070607501413455">"કુદરતી"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"દર વખતે પૂછો"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"તમે બંધ ન કરો ત્યાં સુધી"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"હમણાં જ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"અપડેટ કરેલ ગ્રાફિક્સ ડ્રાઇવરનો ઉપયોગ કરવા માટે અ‍ૅપ પસંદ કરો"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ફોન સ્પીકર"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 890d0362bfc2..0aba3f6a3b9e 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s के ज़रिए ऑटोमैटिक रूप से कनेक्ट है"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदाता के ज़रिए अपने आप कनेक्ट है"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्ट हो गया है, लेकिन इंटरनेट नहीं है"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट कनेक्शन नहीं है"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करना ज़रूरी है"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस प्वाइंट फ़िलहाल भरा हुआ है"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s के ज़रिए कनेक्ट"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s के ज़रिए उपलब्ध"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"अत्‍यधिक धीमी"</string>
<string name="speed_label_slow" msgid="813109590815810235">"धीमी"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठीक है"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"नया बैकअप पासवर्ड सेट किया गया"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नया पासवर्ड तथा पुष्टि मेल नही खाते"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"सुरक्षित पासवर्ड सेट करने में विफल रहा"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"लोड हो रहा है…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"चमकीला (डिफ़ॉल्ट)"</item>
<item msgid="8446070607501413455">"स्वाभाविक"</item>
@@ -416,7 +491,7 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"कस्टम (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेन्यू"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोड में फ़ैक्टरी रीसेट के लिए पासवर्ड डालें"</string>
- <string name="retail_demo_reset_next" msgid="8356731459226304963">"आगे"</string>
+ <string name="retail_demo_reset_next" msgid="8356731459226304963">"आगे बढ़ें"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक"</string>
<string name="active_input_method_subtypes" msgid="3596398805424733238">"टाइप करने की सक्रीय पद्धतियां"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टम की भाषाओं का उपयोग करें"</string>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"हर बार पूछें"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"जब तक आप इसे बंद नहीं करते"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"अभी-अभी"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"डेवलपमेंट में अपडेट किए गए ग्राफ़िक्स ड्राइवर का इस्तेमाल करने के लिए ऐप्लिकेशन में ऑप्ट इन करें"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"फ़ोन स्पीकर"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 1464b918ce60..5a48ffd2c74a 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezan putem %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezan putem ocjenjivača mreže"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupno putem %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, bez interneta"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema interneta"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Obavezna prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna je točka privremeno puna"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezano putem mreže %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupno putem mreže %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Vrlo sporo"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"U redu"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova zaporka za sigurnosnu kopiju postavljena"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova zaporka i potvrda ne odgovaraju"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje zaporke za sigurnosnu kopiju"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Učitavanje…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Živopisno (zadano)"</item>
<item msgid="8446070607501413455">"Prirodno"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sad"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Uključi aplikaciju za upotrebu ažuriranog upravljačkog programa u razvoju"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Zvučnik telefona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index c9fdd4526d0b..1fa7f6a7f56c 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatikusan csatlakozott a következőn keresztül: %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatikusan csatlakozott a hálózatértékelés szolgáltatóján keresztül"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Csatlakozva a következőn keresztül: %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Elérhető a következőn keresztül: %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Csatlakozva, nincs internet-hozzáférés"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nincs internetkapcsolat"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Bejelentkezést igényel"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"A hozzáférési pont átmenetileg megtelt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Csatlakozva a következőn keresztül: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Elérhető a következőn keresztül: %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Nagyon lassú"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lassú"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Rendben"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Új mentési jelszó beállítva"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Az új jelszó és a megerősítése nem egyezik."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Hiba a mentési jelszó beállítása során"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Betöltés…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Élénk (alapértelmezett)"</item>
<item msgid="8446070607501413455">"Természetes"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Mindig kérdezzen rá"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az imént"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"A frissített, fejlesztés alatt álló grafikus drivert használja a választott alkalmazás"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefon hangszórója"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 3b13ed1dca1c..02a24fe18b42 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Ավտոմատ կերպով կապակցվել է %1$s-ի միջոցով"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ավտոմատ կերպով միացել է ցանցի վարկանիշի ծառայության մատակարարի միջոցով"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Կապակցված է %1$s-ի միջոցով"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Հասանելի է %1$s-ի միջոցով"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Միացված է, սակայն ինտերնետ կապ չկա"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Ինտերնետ կապ չկա"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Անհրաժեշտ է մուտք գործել"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Հասանելիության կետը ժամանակավորապես լիքն է"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Միացված է %1$s-ի միջոցով"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Հասանելի է %1$s-ի միջոցով"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Շատ դանդաղ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Դանդաղ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Հաստատել"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Պահուստավորման նոր գաղտնաբառը սահմանված է"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Նոր գաղտնաբառը և հաստատումը չեն համընկնում"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Ձախողում գաղտնաբառի պահուստավորման կարգավորման ընթացքում"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Բեռնում…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Պայծառ (կանխադրված)"</item>
<item msgid="8446070607501413455">"Բնական"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Հարցնել ամեն անգամ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Մինչև չանջատեք"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Հենց նոր"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Ընտրված հավելվածը, որը պետք է օգտագործի թարմացված գրաֆիկական սարքավարը մշակման ժամանակ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Հեռախոսի բարձրախոս"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 4d1b2dfc8971..6b901ffa621b 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Tersambung otomatis melalui %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Otomatis tersambung melalui penyedia rating jaringan"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Terhubung melalui %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tersambung, tidak ada internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Tidak ada internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Perlu login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh untuk sementara"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tersambung melalui %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Lambat"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lambat"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Oke"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Sandi cadangan baru telah disetel"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Sandi baru dan konfirmasinya tidak cocok."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Gagal menyetel sandi cadangan"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Memuat…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Terang (default)"</item>
<item msgid="8446070607501413455">"Alami"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Selalu tanya"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Baru saja"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Ikut sertakan aplikasi untuk menggunakan driver grafis yang diupdate dalam pengembangan"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Speaker ponsel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 600ffa4d2268..ae31d6ba384c 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Sjálfkrafa tengt um %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Sjálfkrafa tengt um netgæðaveitu"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tengt í gegnum %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Í boði í gegnum %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tengt, enginn netaðgangur"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Engin nettenging"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Innskráningar krafist"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Aðgangsstaður tímabundið fullur"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tengt í gegnum %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Í boði í gegnum %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Mjög hægt"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Hægt"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Í lagi"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nýtt aðgangsorð fyrir afritun valið"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nýja aðgangsorðið og staðfestingaraðgangsorðið eru ekki eins"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Villa við að velja aðgangsorð fyrir afritun"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Hleður…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Líflegir (sjálfgefið)"</item>
<item msgid="8446070607501413455">"Náttúrulegir"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spyrja í hvert skipti"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Rétt í þessu"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Velja að nota uppfærðan myndefnisrekil í þróun í forriti"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Símahátalari"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 068aa91537bc..44acbcb12dd8 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Collegato automaticamente tramite %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Collegato automaticamente tramite fornitore di servizi di valutazione rete"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Collegato tramite %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibile tramite %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connesso, senza Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nessuna connessione a Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Accesso richiesto"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto di accesso momentaneamente al completo"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connesso tramite %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponibile tramite %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Molto lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nuova password di backup impostata"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Le password inserite non corrispondono"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Impossibile impostare la password di backup"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Caricamento…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vivaci (opzione predefinita)"</item>
<item msgid="8446070607501413455">"Naturali"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Chiedi ogni volta"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Adesso"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Attiva l\'app per utilizzare il driver grafico aggiornato nella versione di sviluppo"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altoparlante telefono"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index fa38f774856d..5ae1321679fd 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"‏מחובר אוטומטית דרך %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"מחובר אוטומטית דרך ספק של דירוג רשת"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"‏מחובר דרך %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"‏זמינה דרך %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"מחובר. אין אינטרנט"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"אין אינטרנט"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"נדרשת כניסה"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"נקודת הגישה מלאה באופן זמני"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"‏מחובר לרשת של %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"‏זמינה דרך %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"איטית מאוד"</string>
<string name="speed_label_slow" msgid="813109590815810235">"איטית"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"אישור"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"הוגדרה סיסמת גיבוי חדשה"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"הסיסמה החדשה והאישור אינם תואמים"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"הגדרת סיסמת גיבוי נכשלה"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"טוען…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"דינמי (ברירת מחדל)"</item>
<item msgid="8446070607501413455">"טבעי"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"שאל בכל פעם"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"הרגע"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"האפליקציה שנבחרה לשימוש במנהל ההתקן המעודכן לגרפיקה שבפיתוח"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"רמקול של טלפון"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 992765499f3f..25308cfe940b 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s 経由で自動的に接続しています"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ネットワーク評価プロバイダ経由で自動的に接続しています"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s経由で接続"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s経由で使用可能"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"接続済み、インターネット接続なし"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"インターネット未接続"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ログインが必要"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"アクセス ポイントが一時的にいっぱいです"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s 経由で接続済み"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s 経由で使用可能"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"とても遅い"</string>
<string name="speed_label_slow" msgid="813109590815810235">"遅い"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"新しいバックアップパスワードが設定されました"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"新しいパスワードと確認用のパスワードが一致しません。"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"バックアップパスワードの設定に失敗しました"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"読み込んでいます…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"鮮やか(既定)"</item>
<item msgid="8446070607501413455">"自然"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"毎回確認"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"たった今"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"更新したグラフィックス ドライバを開発に使用するオプトイン アプリ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"スマートフォンのスピーカー"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 7ba015337b3b..b38dcc61a91a 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"ავტომატურად დაკავშირდა %1$s-ის მეშვეობით"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ავტომატურად დაკავშირდა ქსელის ხარისხის შეფასების პროვაიდერის მეშვეობით"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ით დაკავშირებული"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"ხელმისაწვდომია %1$s-ით"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"დაკავშირებულია, ინტერნეტის გარეშე"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ინტერნეტ-კავშირი არ არის"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"აუცილებელია სისტემაში შესვლა"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"წვდომის წერტილი დროებით გადატვირთულია"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-ით დაკავშირებული"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"ხელმისაწვდომია %1$s-ით"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ძალიან ნელი"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ნელი"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"კარგი"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ახალი სარეზერვო პაროლის დაყენება"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ახალი და დადასტურებული პაროლები არ შეესატყვისება ერთმანეთს"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"სარეზერვო პაროლის დაყენება ვერ მოხერხდა"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"მიმდინარეობს ჩატვირთვა…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"მკვეთრი (ნაგულისხმევი)"</item>
<item msgid="8446070607501413455">"ბუნებრივი"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ყოველთვის მკითხეთ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ახლახან"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"გააქტიურების აპი, რომელიც გამოიყენებს შემუშავების პროცესში მყოფ, განახლებულ გრაფიკულ დრაივერს"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ტელეფონის დინამიკი"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index d5b4441ea07a..54087a0b6a42 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s арқылы автоматты қосылды"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Желі рейтингі провайдері арқылы автоматты түрде қосылған"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s арқылы қосылған"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s арқылы қолжетімді"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Қосылған, интернет жоқ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернетпен байланыс жоқ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Есептік жазбаға кіру керек"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Кіру нүктесі уақытша бос емес"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s арқылы қосылды"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s арқылы қолжетімді"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Өте баяу"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Баяу"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Жарайды"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Жаңа сақтық кілтсөзі тағайындалды"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Жаңа кілтсөз және растау сәйкес емес"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Сақтық кілтсөзі тағайындалмады"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Жүктелуде…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Жарқын (әдепкі)"</item>
<item msgid="8446070607501413455">"Табиғи"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Әрдайым сұрау"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дәл қазір"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Әзірлеу барысында қолданба жаңартылған графика драйверін пайдаланады"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Телефон динамигі"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index d1d1c7681c92..3fc609f3c4e9 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"បានភ្ជាប់ដោយស្វ័យប្រវត្តិតាមរយៈ %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"បានភ្ជាប់​ដោយស្វ័យប្រវត្តិ​តាម​រយៈក្រុមហ៊ុនផ្តល់​ការ​វាយ​តម្លៃលើ​បណ្តាញ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"បានភ្ជាប់តាមរយៈ %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"មានតាមរយៈ %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"បាន​ភ្ជាប់ ប៉ុន្តែ​គ្មាន​អ៊ីនធឺណិត​ទេ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"គ្មាន​អ៊ីនធឺណិតទេ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"តម្រូវ​ឱ្យ​ចូល​គណនី"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ចំណុចចូលប្រើពេញជាបណ្តោះអាសន្ន"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"បានភ្ជាប់តាមរយៈ %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"មានតាមរយៈ %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"យឺតណាស់"</string>
<string name="speed_label_slow" msgid="813109590815810235">"យឺត"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"យល់ព្រម"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"កំណត់​ពាក្យ​សម្ងាត់​បម្រុង​ទុក​ថ្មី"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ពាក្យ​សម្ងាត់​ថ្មី និង​ការ​បញ្ជាក់​​មិន​ដូច​គ្នា"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"បរាជ័យ​ក្នុង​ការ​កំណត់​ពាក្យ​សម្ងាត់​បម្រុងទុក"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"កំពុងផ្ទុក…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"រស់រវើក (លំនាំដើម)"</item>
<item msgid="8446070607501413455">"ធម្មជាតិ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"សួរគ្រប់ពេល"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"រហូតទាល់តែ​អ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"អម្បាញ់មិញ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ភ្ជាប់កម្មវិធី​ ដើម្បី​ប្រើដ្រាយវើ​ក្រាហ្វិក​ដែលបាន​ដំឡើងជំនាន់​សម្រាប់​ការ​អភិវឌ្ឍ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ឧបករណ៍​បំពង​សំឡេង​ទូរសព្ទ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 46759f5b79e4..bc1150d42aeb 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ನೆಟ್‌ವರ್ಕ್ ರೇಟಿಂಗ್ ಒದಗಿಸುವವರ ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ, ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ಸೈನ್ ಇನ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ಪ್ರವೇಶ ಕೇಂದ್ರ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ತುಂಬಾ ನಿಧಾನವಾಗಿದೆ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ನಿಧಾನ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ಸರಿ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ಹೊಸ ಬ್ಯಾಕಪ್ ಪಾಸ್‌ವರ್ಡ್‌ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ಹೊಸ ಪಾಸ್‌ವರ್ಡ್‌ ಮತ್ತು ದೃಢೀಕರಣ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ಬ್ಯಾಕಪ್‌ ಪಾಸ್‌ವರ್ಡ್‌ ಹೊಂದಿಕೆ ವಿಫಲಗೊಂಡಿದೆ"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ಲೋಡ್ ಆಗುತ್ತಿದೆ…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ಸ್ಪಂದನಾತ್ಮಕ (ಡೀಫಾಲ್ಟ್)"</item>
<item msgid="8446070607501413455">"ಪ್ರಾಕೃತಿಕ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ಇದೀಗ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ಅಭಿವೃದ್ಧಿಯಲ್ಲಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾದ ಗ್ರಾಫಿಕ್‌ಗಳ ಡ್ರೈವರ್ ಬಳಸಲು ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ಫೋನ್ ಸ್ಪೀಕರ್"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 067175b75095..035c24b6195d 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s을(를) 통해 자동으로 연결됨"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"네트워크 평가 제공업체를 통해 자동으로 연결됨"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s을(를) 통해 연결됨"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s을(를) 통해 사용 가능"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"연결됨, 인터넷 사용 불가"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"인터넷 연결 없음"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"로그인 필요"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"액세스 포인트가 일시적으로 가득 참"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s을(를) 통해 연결됨"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s을(를) 통해 사용 가능"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"매우 느림"</string>
<string name="speed_label_slow" msgid="813109590815810235">"느림"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"보통"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"새 백업 비밀번호가 설정되었습니다."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"새 비밀번호와 확인한 비밀번호가 일치하지 않습니다."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"백업 비밀번호를 설정하지 못했습니다."</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"로드 중…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"생동감(기본값)"</item>
<item msgid="8446070607501413455">"내츄럴"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"항상 확인"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"조금 전"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"개발 중인 업데이트된 그래픽 드라이버를 사용할 앱을 선택하세요."</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"휴대전화 스피커"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 8e994da2d35f..8a68c785c701 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s аркылуу автоматтык түрдө туташты"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Тармактар рейтингинин автору аркылуу автоматтык түрдө туташты"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s аркылуу жеткиликтүү"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s аркылуу жеткиликтүү"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Туташып турат, Интернет жок"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернет жок"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Аккаунтка кирүү талап кылынат"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Байланыш түйүнүнө өтө көп түзмөк туташып турат"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s аркылуу туташты"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s аркылуу иштейт"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Өтө жай"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Жай"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Жарайт"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Жаңы бэкапка сырсөз коюулду"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Жаңы сырсөз жана анын ырастоосу дал келген жок"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Жаңы бэкапка сырсөз коюлган жок"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Жүктөлүүдө…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Толкундуу (демейки)"</item>
<item msgid="8446070607501413455">"Табигый"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ар дайым суралсын"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Азыр эле"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Иштеп чыгууда жаңыртылган графикалык драйверлерди пайдалануу үчүн колдонмону кошуңуз"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Телефондун динамиги"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 7bf46c014871..009f44f55259 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"ເຊື່ອມຕໍ່ຜ່ານທາງ %1$s ໂດຍອັດຕະໂນມັດ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ເຊື່ອມຕໍ່ກັບອັດຕະໂນມັດແລ້ວຜ່ານຜູ້ໃຫ້ບໍລິການຄະແນນເຄືອຂ່າຍ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"​ເຊື່ອມຕໍ່​ຜ່ານ %1$s ​ແລ້ວ"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"ມີ​ໃຫ້​ຜ່ານ %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ເຊື່ອມຕໍ່ແລ້ວ, ບໍ່ມີອິນເຕີເນັດ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ບໍ່ມີອິນເຕີເນັດ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ຈຳເປັນຕ້ອງເຂົ້າສູ່ລະບົບ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ຈຸດການເຂົ້າເຖິງເຕັມຊົ່ວຄາວ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"ເຊື່ອມຕໍ່ຜ່ານ %1$s ແລ້ວ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"ໃຊ້ໄດ້ຜ່ານ %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ຊ້າຫຼາຍ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ຊ້າ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ຕົກລົງ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ຕັ້ງລະຫັດສຳຮອງໃໝ່ແລ້ວ"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ລະຫັດຜ່ານໃໝ່ ແລະລະຫັດຢືນຢັນບໍ່ກົງກັນ"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ການຕັ້ງລະຫັດສຳຮອງຂໍ້ມູນລົ້ມເຫລວ"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ກຳລັງໂຫລດ…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ຕົວ​ສັ່ນ (ມາດ​ຕະ​ຖານ)"</item>
<item msgid="8446070607501413455">"ທຳ​ມະ​ຊາດ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ຖາມທຸກເທື່ອ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ຕອນນີ້"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ເຂົ້າຮ່ວມແອັບເພື່ອໃຊ້ໄດຣເວີກຣາຟິກທີ່ອັບເດດແລ້ວໃນການພັດທະນາ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ລຳໂພງໂທລະສັບ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 9da3d523c1bd..f08a78b8b865 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiškai prisijungta naudojant „%1$s“"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatiškai prisijungta naudojant tinklo įvertinimo paslaugos teikėjo paslaugomis"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Prisijungta naudojant „%1$s“"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Pasiekiama naudojant „%1$s“"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Prisijungta, nėra interneto"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nėra interneto ryšio"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Reikia prisijungti"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prieigos taškas laikinai visiškai užimtas"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Prisijungta naudojant „%1$s“"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Pasiekiama naudojant „%1$s“"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Labai lėtas"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lėtas"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Gerai"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nustatytas naujas atsarginės kopijos slaptažodis"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Naujas slaptažodis ir patvirtinimas neatitinka"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nustatant atsarginės kopijos slaptažodį įvyko klaida"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Įkeliama…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Ryškus (numatytasis)"</item>
<item msgid="8446070607501413455">"Natūralus"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Klausti kaskart"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ką tik"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Pasirinkti programą, kuri bus naudojama su atnaujinta kuriama grafikos tvarkykle"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefono garsiakalbis"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 2233468642d1..c768d11f3bbe 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automātiski savienots, izmantojot %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automātiski izveidots savienojums, izmantojot tīkla vērtējuma sniedzēju"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Savienots, izmantojot %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Pieejams, izmantojot %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Savienojums izveidots, nav piekļuves internetam"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nav piekļuves internetam"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Nepieciešama pierakstīšanās"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Piekļuves punkts īslaicīgi ir pilns"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Savienojums izveidots, izmantojot %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Pieejams, izmantojot %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Ļoti lēns"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lēns"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Labi"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Jaunā dublējuma parole ir iestatīta."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Jaunā parole un apstiprinājums neatbilst."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Iestatot dublējuma paroli, radās kļūme."</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Notiek ielāde…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Spilgts (noklusējums)"</item>
<item msgid="8446070607501413455">"Dabisks"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vaicāt katru reizi"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Tikko"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Izvēlēties izmantot atjaunināto grafikas dzini šīs lietotnes izstrādē"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Tālruņa skaļrunis"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 534d154b5fe2..85430a64ee4c 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматски поврзано преку %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматски поврзано преку оператор за оценување мрежа"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Поврзано преку %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Достапно преку %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Поврзана, нема интернет"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернет"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потребно е најавување"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пристапната точка привремено е преоптоварена"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Поврзано преку %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Достапно преку %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Многу бавна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Во ред"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Подесена нова лозинка на резервна копија"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новата лозинка и потврдата не се исти"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Неуспешно подесување лозинка на резервна копија"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Се вчитува…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Динамично (стандардно)"</item>
<item msgid="8446070607501413455">"Природно"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Секогаш прашувај"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Неодамнешни"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Прифатете ја апликацијата за да се користи ажурираниот драјвер за графика во програмирање"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Телефонски звучник"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 7a335cd3920f..c3438dca9437 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s വഴി സ്വയമേവ ബന്ധിപ്പിച്ചു"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"നെറ്റ്‌വർക്ക് റേറ്റിംഗ് ദാതാവുമായി സ്വയം കണക്‌റ്റുചെയ്‌തു"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s വഴി ലഭ്യം"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"കണക്റ്റ് ചെയ്‌തു, ഇന്റർനെറ്റ് ഇല്ല"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ഇന്റർനെറ്റ് ഇല്ല"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"സൈൻ ഇൻ ചെയ്യേണ്ടത് ആവശ്യമാണ്"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ആക്‌സസ് പോയിന്റ് താൽക്കാലികമായി നിറഞ്ഞിരിക്കുന്നു"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s വഴി ലഭ്യം"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"വളരെ കുറഞ്ഞ വേഗത്തിൽ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"കുറഞ്ഞ വേഗത്തിൽ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ശരി"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"പുതിയ ബാക്കപ്പ് പാസ്‌വേഡ് സജ്ജമാക്കി"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"പുതിയ പാസ്‌വേഡും സ്ഥിരീകരണവും പൊരുത്തപ്പെടുന്നില്ല"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ബാക്കപ്പ് പാസ്‌വേഡ് സജ്ജമാക്കുന്നതിൽ പരാജയപ്പെട്ടു"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ലോഡ് ചെയ്യുന്നു…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"വൈബ്രന്റ് (സ്ഥിരമായത്)"</item>
<item msgid="8446070607501413455">"സ്വാഭാവികം"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"എപ്പോഴും ചോദിക്കുക"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ഇപ്പോൾ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"വികസനത്തിൽ, അപ്ഡേറ്റ് ചെയ്‌ത ഗ്രാഫിക്‌സ് ഡ്രൈവർ ഉപയോഗിക്കാൻ ഓപ്റ്റ് ഇൻ ചെയ്യുക"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ഫോൺ സ്‌പീക്കർ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 4816643f6424..7c8aa8b1e00e 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s-р автоматаар холбогдсон"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Сүлжээний үнэлгээ үзүүлэгчээр автоматаар холбогдох"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-р холбогдсон"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s-р боломжтой"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Холбогдсон хэдий ч интернет алга"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернэт алга"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Нэвтрэх шаардлагатай"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Хандах цэг түр хугацаанд дүүрсэн байна"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-р холбогдсон"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s-р боломжтой"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Маш удаан"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Удаан"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ЗА"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Нөөцлөлтийн шинэ нууц үг тохирууллаа"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Шинэ нууц үг болон баталгаажуулалт таарахгүй байна"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Нөөшлөлтийн нууц үгийг тохируулахад алдаа гарлаа"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Ачаалж байна…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Хурц (үндсэн)"</item>
<item msgid="8446070607501413455">"Байгалийн"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Тухай бүрт асуух"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дөнгөж сая"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Хөгжүүлэлтэд буй шинэчилсэн график драйверийг ашиглахын тулд аппад нэгдэх"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Утасны чанга яригч"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 5b09b29e8b05..3ab2a4b40dc1 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s द्वारे स्वयंचलितपणे कनेक्ट केले"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदात्याद्वारे स्वयंचलितपणे कनेक्ट केले"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s द्वारे कनेक्‍ट केले"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s द्वारे उपलब्‍ध"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्‍ट केले, इंटरनेट नाही"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट नाही"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करणे आवश्यक आहे"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ने कनेक्‍ट केले"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ने उपलब्‍ध"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"खूप हळू"</string>
<string name="speed_label_slow" msgid="813109590815810235">"हळू"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठीक आहे"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"नवीन बॅक अप पासवर्ड सेट झाला"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नवीन पासवर्ड आणि पुष्टीकरण जुळत नाही"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"बॅक अप पासवर्ड सेट करणे अयशस्वी"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"लोड करत आहे…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"सशक्त (डीफॉल्ट)"</item>
<item msgid="8446070607501413455">"नैसर्गिक"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक वेळी विचारा"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"आत्ताच"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"अपडेट केलेले ग्राफिक ड्राइव्हर डेव्हलमेंटमध्ये वापरण्यासाठी अ‍ॅप निवडा"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"फोनचा स्पीकर"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 359388259048..5459b80b2ea2 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Disambungkan secara automatik melalui %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Disambungkan secara automatik melalui pembekal penilaian rangkaian"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Disambungkan melalui %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Disambungkan, tiada Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Tiada Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Log masuk diperlukan"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh buat sementara waktu"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Disambungkan melalui %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Perlahan"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Perlahan"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Kata laluan sandaran baharu telah ditetapkan"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Kata laluan baharu dan pengesahan tidak sepadan"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Gagal menetapkan kata laluan sandaran"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Memuatkan…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Terang (lalai)"</item>
<item msgid="8446070607501413455">"Semula Jadi"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Tanya setiap kali"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sebentar tadi"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Sertakan apl untuk menggunakan pemacu grafik yang dikemas kini dalam pembangunan"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Pembesar suara telefon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 7ac3742cf7a5..254de2a6c6af 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ကွန်ရက်အဆင့်သတ်မှတ်ပေးသူ မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s မှတစ်ဆင့်ရနိုင်သည်"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ချိတ်ဆက်ထားသည်၊ အင်တာနက်မရှိ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"အင်တာနက် မရှိပါ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"လက်မှတ်ထိုးဝင်ရန် လိုအပ်သည်"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ကွန်ရက်ချိတ်ဆက်မှု ယာယီပြည့်နေသည်"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s မှတစ်ဆင့် ရနိုင်သည်"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"အလွန်နှေး"</string>
<string name="speed_label_slow" msgid="813109590815810235">"နှေး"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်အသစ်ကို သတ်မှတ်ပြီးပြီ။"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"စကားဝှက်အသစ်နှင့် အတည်ပြုချက် ကွဲလွဲနေသည်။"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်သတ်မှတ်ချက် မအောင်မြင်ပါ။"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ဖွင့်နေသည်…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"တက်ကြွခြင်း (မူလ)"</item>
<item msgid="8446070607501413455">"သဘာဝ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"အမြဲမေးပါ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ယခုလေးတင်"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ဆော့ဖ်ဝဲရေးဆွဲမှုအတွင်း အပ်ဒိတ်လုပ်ထားသော ဂရပ်ဖစ်ဒရိုင်ဗာကို အသုံးပြုရန် အက်ပ်ကို ရွေးချယ်ပါ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ဖုန်းစပီကာ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index e810ba248850..5d5568f12b57 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisk tilkoblet via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisk tilkoblet via leverandør av nettverksvurdering"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilkoblet via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgjengelig via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilkoblet – ingen Internett-tilgang"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Ingen internettilkobling"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Pålogging kreves"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Tilgangspunktet er midlertidig fullt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tilkoblet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tilgjengelig via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veldig treg"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Treg"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nytt passord for sikkerhetskopiering er angitt."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Gjentakelsen av passordet er ikke identisk med det første du skrev inn"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Kunne ikke angi nytt passord for sikkerhetskopiering"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Laster inn …"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Krystallklar (standard)"</item>
<item msgid="8446070607501413455">"Naturlig"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spør hver gang"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nå nettopp"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Velg app for å bruke en oppdatert grafikkdriver som er under utvikling"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefonhøyttaler"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 0b4510fda69d..f63e9d7459e7 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s मार्फत् स्वतः जडान गरिएको"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्कको दर्जा प्रदायक मार्फत स्वत: जडान गरिएको"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s मार्फत जडित"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s मार्फत उपलब्ध"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"जडान गरियो तर इन्टरनेट छैन"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"इन्टरनेटमाथिको पहुँच छैन"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन गर्न आवश्यक छ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"पहुँचसम्बन्धी स्थान अस्थायी रूपमा भरिएको छ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s मार्फत जडान गरियो"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s मार्फत उपलब्ध"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"धेरै ढिलो"</string>
<string name="speed_label_slow" msgid="813109590815810235">"बिस्तारै"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठिक छ"</string>
@@ -231,7 +305,7 @@
<string name="private_dns_mode_off" msgid="8236575187318721684">"निष्क्रिय छ"</string>
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"स्वचालित"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"निजी DNS प्रदायकको होस्टनाम"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS प्रदायकको होस्टनाम प्रविष्ट गर्नुहोस्"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS प्रदायकको होस्टनाम प्रविष्टि गर्नुहोस्"</string>
<string name="private_dns_mode_provider_failure" msgid="231837290365031223">"जडान गर्न सकिएन"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"नयाँ जगेडा पासवर्ड सेट गर्नुहोस्"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नयाँ पासवर्ड र पुष्टिकरण मेल खाँदैनन्"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"विफलता सेटिङ ब्याकअप पासवर्ड"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"लोड गर्दै…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"जोसिलो (पूर्व निर्धारित)"</item>
<item msgid="8446070607501413455">"प्राकृतिक"</item>
@@ -415,7 +490,7 @@
<string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"सबैभन्दा ठूलो"</string>
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"आफू अनुकूल (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनु"</string>
- <string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्ट गर्नुहोस्"</string>
+ <string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्टि गर्नुहोस्"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"अर्को"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक छ"</string>
<string name="active_input_method_subtypes" msgid="3596398805424733238">"आगत विधिहरू सक्रिय गर्नुहोस्"</string>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक पटक सोध्नुहोस्"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"तपाईंले निष्क्रिय नपार्दासम्म"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"अहिले भर्खरै"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"विकासको क्रममा अद्यावधिक गरिएको ग्राफिक ड्राइभर प्रयोग गर्न अप्ट इन गर्नुहोस्"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"फोनको स्पिकर"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index f227e1c50505..798dc7ca8c9a 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisch verbonden via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisch verbonden via provider van netwerkbeoordelingen"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Verbonden via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Beschikbaar via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbonden, geen internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Geen internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Inloggen vereist"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt tijdelijk vol"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Verbonden via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Beschikbaar via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Zeer langzaam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langzaam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Redelijk"</string>
@@ -144,7 +218,7 @@
<string name="tts_settings_title" msgid="1237820681016639683">"Spraakuitvoer"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Spreeksnelheid"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Snelheid waarmee de tekst wordt gesproken"</string>
- <string name="tts_default_pitch_title" msgid="6135942113172488671">"Hoogte"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Toonhoogte"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Is van invloed op de toon van de synthetisch gegenereerde spraak"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Taal"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Systeemtaal gebruiken"</string>
@@ -236,7 +310,7 @@
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Opties weergeven voor certificering van draadloze weergave"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Een willekeurig MAC-adres bij het maken van verbinding met wifi-netwerken"</string>
- <string name="wifi_metered_label" msgid="4514924227256839725">"Betaald"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Met datalimiet"</string>
<string name="wifi_unmetered_label" msgid="6124098729457992931">"Gratis"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger-buffergrootten"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Kies Logger-grootten per logbuffer"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nieuw back-upwachtwoord ingesteld"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nieuw wachtwoord en bevestiging komen niet overeen."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Instellen van back-upwachtwoord is mislukt"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Laden…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Levendig (standaard)"</item>
<item msgid="8446070607501413455">"Natuurlijk"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Altijd vragen"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Totdat je uitschakelt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Zojuist"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Meld een app aan om het geüpdatete grafische stuurprogramma in ontwikkeling te gebruiken"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefoonluidspreker"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index bf8493a40648..9491af3253d0 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲୀ ସଂଯୁକ୍ତ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ନେଟୱର୍କ ମୂଲ୍ୟାୟନ ପ୍ରଦାତାଙ୍କ ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲ୍ୟ ସଂଯୁକ୍ତ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍‌ନେଟ୍‌ ନାହିଁ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"କୌଣସି ଇଣ୍ଟରନେଟ୍‌ ନାହିଁ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ସାଇନ୍-ଇନ୍ ଆବଶ୍ୟକ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ସାମୟିକ ଭାବେ ପୂର୍ଣ୍ଣ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ବହୁତ ମନ୍ଥର"</string>
<string name="speed_label_slow" msgid="813109590815810235">"କମ୍‌ ବେଗ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ଠିକ୍‌ ଅଛି"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ନୂଆ ବ୍ୟାକ୍‌ଅପ୍‌ ପାସ୍‌ୱର୍ଡ ସେଟ୍‌ କରିଦିଆଗଲା"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ନୂଆ ପାସ୍‌ୱର୍ଡ ଓ ସୁନିଶ୍ଚିତତା ମେଳ ହେଉନାହିଁ"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ବ୍ୟାକ୍‌ଅପ୍‌ ପାସ୍‌ୱର୍ଡ ସେଟିଙ୍ଗ ବିଫଳ ହୋଇଛି"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ଲୋଡ୍ ହେଉଛି…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ଜୀବନ୍ତ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item>
<item msgid="8446070607501413455">"ପ୍ରାକୃତିକ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ DND ଅନ୍‌ ରହିବ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ଏହିକ୍ଷଣି"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ଡେଭଲପ୍‍‍‍‍‍‍‍‍ମେଣ୍ଟରେ ଅପ୍‍‍‍‍‍‍‍ଡେଟ୍‍ ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର୍‍ ବ୍ୟବହାର କରିବାକୁ ଆପ୍ଟ ଇ‍ନ୍‍ ଅପ୍ଲିକେସନ୍‍"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ଫୋନ୍‍ ସ୍ପିକର୍‍"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index f948a7e39aa2..eadc5545e96c 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ਰਾਹੀਂ ਆਪਣੇ-ਆਪ ਕਨੈਕਟ ਹੋਇਆ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ਨੈੱਟਵਰਕ ਰੇਟਿੰਗ ਪ੍ਰਦਾਨਕ ਰਾਹੀਂ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਇਆ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ਸਾਈਨ-ਇਨ ਲੋੜੀਂਦਾ ਹੈ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਐਕਸੈੱਸ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ਬਹੁਤ ਹੌਲੀ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ਹੌਲੀ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ਠੀਕ ਹੈ"</string>
@@ -142,7 +216,7 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"ਕੋਈ ਡਿਫੌਲਟਸ ਸੈਟ ਨਹੀਂ ਕੀਤੇ"</string>
<string name="tts_settings" msgid="8186971894801348327">"ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਸੈਟਿੰਗਾਂ"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"ਲਿਖਤ-ਤੋਂ-ਬੋਲੀ ਆਊਟਪੁੱਟ"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"ਸਪੀਚ ਰੇਟ"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"ਬੋਲਣ ਦੀ ਗਤੀ"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"ਸਪੀਡ ਜਿਸਤੇ ਟੈਕਸਟ ਬੋਲਿਆ ਜਾਂਦਾ ਹੈ"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"ਪਿਚ"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"ਬਣਾਵਟੀ ਬੋਲੀ ਦੇ ਲਹਿਜੇ \'ਤੇ ਅਸਰ ਪਾਉਂਦੀ ਹੈ"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ਨਵਾਂ ਬੈਕਅੱਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ਨਵਾਂ ਪਾਸਵਰਡ ਅਤੇ ਪੁਸ਼ਟੀ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ਬੈਕਅੱਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ਚਮਕੀਲਾ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
<item msgid="8446070607501413455">"ਕੁਦਰਤੀ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ਹਰ ਵਾਰ ਪੁੱਛੋ"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ਹੁਣੇ ਹੀ"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ਅੱਪਡੇਟ ਕੀਤੇ ਵਿਕਾਸ-ਅਧੀਨ ਗ੍ਰਾਫਿਕਸ ਡਰਾਈਵਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਐਪ ਦੀ ਚੋਣ ਕਰੋ"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ਫ਼ੋਨ ਦਾ ਸਪੀਕਰ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index c75a8944c230..f94308a3faaa 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatycznie połączono przez: %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatycznie połączono przez dostawcę ocen jakości sieci"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Połączono przez %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Połączono, brak internetu"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Brak internetu"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Musisz się zalogować"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punkt dostępu jest tymczasowo zajęty"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Połączono przez: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostępna przez: %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Bardzo wolna"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Wolna"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nowe hasło kopii zapasowej zostało ustawione"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nowe hasła nie pasują do siebie"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nie udało się ustawić hasła kopii zapasowej"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Ładuję…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Żywe (domyślnie)"</item>
<item msgid="8446070607501413455">"Naturalne"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Zawsze pytaj"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Przed chwilą"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Wybierz aplikację, która ma używać opracowywanego sterownika grafiki"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Głośnik telefonu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index c273f59cb754..f1b043bcc470 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectado automaticamente via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automaticamente via provedor de avaliação de rede"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -142,9 +216,9 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"Nenhum padrão definido"</string>
<string name="tts_settings" msgid="8186971894801348327">"Configurações da conversão de texto em voz"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"Conversão de texto em voz"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"Taxa de fala"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"Velocidade da fala"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Velocidade em que o texto é falado"</string>
- <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tom da fala"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tom de voz"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Afeta o tom da voz sintetizada"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Idioma"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Usar idioma do sistema"</string>
@@ -166,8 +240,8 @@
<string name="tts_engine_settings_button" msgid="1030512042040722285">"Iniciar configurações do mecanismo"</string>
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"Mecanismo preferencial"</string>
<string name="tts_general_section_title" msgid="4402572014604490502">"Gerais"</string>
- <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Redefinir o tom da fala"</string>
- <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Redefinir o tom no qual o texto é falado para o padrão."</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Redefinir o tom de voz"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Redefinir o tom de voz para o padrão."</string>
<string-array name="tts_rate_entries">
<item msgid="6695494874362656215">"Muito devagar"</item>
<item msgid="4795095314303559268">"Devagar"</item>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova senha de backup definida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"A nova senha e a confirmação não coincidem."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Falha ao definir a senha de backup"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Carregando…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrante (padrão)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Ative o app para usar o driver gráfico atualizado no desenvolvimento"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Alto-falante do smartphone"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 26e47293bd8f..b0694d1fb800 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Ligado automaticamente através de %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ligado automaticamente através do fornecedor de classificação de rede"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ligado através de %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível através de %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ligado, sem Internet."</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário iniciar sessão"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Ligado através de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível através de %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova palavra-passe da cópia de segurança definida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"A nova palavra-passe e a confirmação não coincidem"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Falha na definição da palavra-passe da cópia de segurança"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"A carregar…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrante (predefinição)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Até ser desativado"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Optar pela aplicação para utilizar a placa gráfica atualizada em desenvolvimento"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altifalante do telemóvel"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index c273f59cb754..f1b043bcc470 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectado automaticamente via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automaticamente via provedor de avaliação de rede"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -142,9 +216,9 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"Nenhum padrão definido"</string>
<string name="tts_settings" msgid="8186971894801348327">"Configurações da conversão de texto em voz"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"Conversão de texto em voz"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"Taxa de fala"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"Velocidade da fala"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Velocidade em que o texto é falado"</string>
- <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tom da fala"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tom de voz"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Afeta o tom da voz sintetizada"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Idioma"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Usar idioma do sistema"</string>
@@ -166,8 +240,8 @@
<string name="tts_engine_settings_button" msgid="1030512042040722285">"Iniciar configurações do mecanismo"</string>
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"Mecanismo preferencial"</string>
<string name="tts_general_section_title" msgid="4402572014604490502">"Gerais"</string>
- <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Redefinir o tom da fala"</string>
- <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Redefinir o tom no qual o texto é falado para o padrão."</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Redefinir o tom de voz"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Redefinir o tom de voz para o padrão."</string>
<string-array name="tts_rate_entries">
<item msgid="6695494874362656215">"Muito devagar"</item>
<item msgid="4795095314303559268">"Devagar"</item>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova senha de backup definida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"A nova senha e a confirmação não coincidem."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Falha ao definir a senha de backup"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Carregando…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrante (padrão)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Ative o app para usar o driver gráfico atualizado no desenvolvimento"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Alto-falante do smartphone"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 94f4842644bc..032fcebba33b 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectată automat prin %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectată automat prin furnizor de evaluări ale rețelei"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectată prin %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibilă prin %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectată, fără internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Fără conexiune la internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Trebuie să vă conectați"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punctul de acces este temporar plin"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectată prin %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponibilă prin %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Foarte lentă"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lentă"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Bine"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"A fost setată o parolă de rezervă nouă"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Parola nouă și confirmarea acesteia nu se potrivesc."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Setarea parolei de rezervă a eșuat"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Se încarcă…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (prestabilit)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Întreabă de fiecare dată"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Chiar acum"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Aplicația pentru înscriere pentru a folosi driverul actualizat al plăcii grafice este în dezvoltare"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Difuzorul telefonului"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 1c331d82164a..a280285fef61 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматически подключено к %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматически подключено через автора рейтинга сетей"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Подключено к %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступно через %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Подключено, без доступа к Интернету"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Нет подключения к Интернету"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Требуется выполнить вход."</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"К точке доступа подключено слишком много устройств"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Подключено к %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступно через %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Очень медленная"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Медленная"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Новый пароль для резервной копии установлен"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Пароли не совпадают"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Не удалось установить пароль для резервной копии"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Загрузка…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Насыщенный (по умолчанию)"</item>
<item msgid="8446070607501413455">"Естественный"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Всегда спрашивать"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Только что"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Приложение будет использовать обновленный драйвер графической системы (на стадии разработки)"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Встроенный динамик"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 608ff7f67542..c143c766ff73 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ජාල ශ්‍රේණිගත සපයන්නා හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s හරහා සම්බන්ධ විය"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"සම්බන්ධයි, අන්තර්ජාලය නැත"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"අන්තර්ජාලය නැත"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"පිරීම අවශ්‍යයි"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ප්‍රවේශ ලක්ෂ්‍ය තාවකාලිකව පිරී ඇත"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s හරහා සම්බන්ධ විය"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ඉතා මන්දගාමී"</string>
<string name="speed_label_slow" msgid="813109590815810235">"මන්දගාමී"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"හරි"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"නව උපස්ථ මුරපදය සකසන ලදි"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"නව මුරපදය සහ සත්‍යාපනය නොගැළපුනි"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"උපස්ථ මුරපදය පිහිටුවීම අසාර්ථකය"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"පූරණය වේ…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"දීප්තිමත් (පෙරනිමිය)"</item>
<item msgid="8446070607501413455">"ස්වභාවික"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"සෑම විටම ඉල්ලන්න"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ඔබ ක්‍රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"මේ දැන්"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"වැඩිදියුණු වෙමින් ඇති යාවත්කාලීන කළ චිත්‍රක ධාවකය භාවිත කිරීමට යෙදුමට ඇතුළු වන්න"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"දුරකථන ස්පීකරය"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 2f76ef97903a..b41d5d344449 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaticky pripojené prostredníctvom %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automaticky pripojené prostredníctvom poskytovateľa hodnotenia siete"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Pripojené prostredníctvom %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"K dispozícii prostredníctvom %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Pripojené, žiadny internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Žiadny internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Vyžaduje sa prihlásenie"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prístupový bod je dočasne plný"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Pripojené prostredníctvom operátora %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"K dispozícii prostredníctvom operátora %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veľmi nízka"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Nízka"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nové heslo pre zálohy je nastavené"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nové heslo a potvrdenie sa nezhodujú"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nastavenie hesla pre zálohy zlyhalo"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Načítava sa…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Sýty (predvolený)"</item>
<item msgid="8446070607501413455">"Prirodzený"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vždy sa opýtať"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokiaľ túto funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Teraz"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Prihlásiť aplikáciu, ktorá má používať aktualizovaný ovládač grafickej karty vo vývoji"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Reproduktor telefónu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 64124cb87876..298acb93d818 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Samodejno vzpostavljena povezava prek: %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Samodejno vzpostavljena povezava prek ponudnika ocenjevanja omrežij"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Vzpostavljena povezava prek: %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Na voljo prek: %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Vzpostavljena povezava, brez interneta"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Brez internetne povezave"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Zahtevana je prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Dostopna točka je trenutno zasedena"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Vzpostavljena povezava prek: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Na voljo prek: %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Zelo počasna"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Počasna"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"V redu"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Novo geslo je nastavljeno"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Novo geslo in potrditev se ne ujemata."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nastavitev gesla ni uspela"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Nalaganje …"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Živo (privzeto)"</item>
<item msgid="8446070607501413455">"Naravno"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vedno vprašaj"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Pravkar"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Omogočena aplikacija za uporabo posodobljenega grafičnega gonilnika pri razvoju"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Zvočnik telefona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 25d575efedb5..569b4d9e91d9 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Lidhur automatikisht përmes %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Lidhur automatikisht nëpërmjet ofruesit të vlerësimit të rrjetit"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"E lidhur përmes %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"E mundshme përmes %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"U lidh, por nuk ka internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nuk ka internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kërkohet identifikimi"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pika e qasjes është përkohësisht plot"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"E lidhur përmes %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"E disponueshme përmes %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Shumë e ulët"</string>
<string name="speed_label_slow" msgid="813109590815810235">"E ngadaltë"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Në rregull"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Fjalëkalimi i ri u vendos"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Fjalëkalimi i ri dhe konfirmimi nuk përputhen"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Vendosja e fjalëkalimit dështoi"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Po ngarkohet…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Të gjalla (parazgjedhja)"</item>
<item msgid="8446070607501413455">"Natyrale"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pyet çdo herë"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Deri sa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Pikërisht tani"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Prano aplikacionin për të përdorur drejtuesin e përditësuar të grafikës që është në zhvillim"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Altoparlanti i telefonit"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index b58b47caa8ae..bf5e311d5174 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Аутоматски повезано преко %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Аутоматски повезано преко добављача оцене мреже"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Веза је успостављена преко приступне тачке %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступна је преко приступне тачке %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Веза је успостављена, нема интернета"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернета"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Треба да се пријавите"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Приступна тачка је привремено заузета"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Повезано преко %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступно преко %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Веома спора"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Спора"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Потврди"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Постављена је нова лозинка резервне копије"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Нова лозинка и њена потврда се не подударају"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Постављање лозинке резервне копије није успело"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Учитава се…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Живописан (подразумевано)"</item>
<item msgid="8446070607501413455">"Природан"</item>
@@ -450,6 +525,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Увек питај"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Управо"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Омогући апликацију за коришћење управљачког програма графичке катице у развоју"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Звучник телефона"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 7198b84ed035..6e004df13926 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiskt ansluten via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatiskt ansluten via leverantör av nätverksbetyg"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Anslutet via %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Tillgängligt via %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ansluten, inget internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Inget internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Inloggning krävs"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Åtkomstpunkten har inga platser över för tillfället"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Anslutet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tillgängligt via %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Mycket långsam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Långsam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Okej"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Ett nytt lösenord har angetts"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Det nya lösenordet och bekräftelsen stämmer inte överens"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Det gick inte att ange lösenordet"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Läser in …"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Starka (standard)"</item>
<item msgid="8446070607501413455">"Naturliga"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Fråga varje gång"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nyss"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Välj om appen ska använda den uppdaterade grafikdrivrutinen under utveckling"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Mobilens högtalare"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 657b54f02066..bf034761f2f1 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Imeunganishwa kiotomatiki kupitia %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Imeunganishwa kiotomatiki kupitia mtoa huduma wa ukadiriaji wa mtandao"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Imeunganishwa kupitia %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Inapatikana kupitia %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Imeunganishwa, hakuna intaneti"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Hakuna intaneti"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Unahitaji kuingia katika akaunti"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Lango la mtandao lina shughuli nyingi kwa sasa"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Imeunganishwa kupitia %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Inapatikana kupitia %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Polepole Sana"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Polepole"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Sawa"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Nenosiri jipya la hifadhi rudufu limewekwa"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nenosiri jipya na uthibitisho havioani"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Imeshindwa kuweka nenosiri la hifadhi rudufu"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Inapakia…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Maridadi (chaguomsingi)"</item>
<item msgid="8446070607501413455">"Asili"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uliza kila wakati"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sasa hivi"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Chagua programu itakayotumia kiendeshaji cha michoro kilichosasishwa katika hatua ya kusanidi"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Spika ya simu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 59b42d834c34..58e5967cd407 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s மூலம் தானாக இணைக்கப்பட்டது"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"நெட்வொர்க் மதிப்பீடு வழங்குநரால் தானாக இணைக்கப்பட்டது"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s வழியாக இணைக்கப்பட்டது"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s வழியாகக் கிடைக்கிறது"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"இணைக்கப்பட்டுள்ளது, ஆனால் இண்டர்நெட் இல்லை"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"இணைய இணைப்பு இல்லை"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"உள்நுழைய வேண்டும்"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"தற்காலிகமாக அணுகல் புள்ளி நிரம்பியுள்ளது"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s வழியாக இணைக்கப்பட்டது"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s வழியாகக் கிடைக்கிறது"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"மிகவும் வேகம் குறைவானது"</string>
<string name="speed_label_slow" msgid="813109590815810235">"வேகம் குறைவு"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"சரி"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"புதிய காப்புப் பிரதியின் கடவுச்சொல் அமைக்கப்பட்டது"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"புதிய கடவுச்சொல்லும், உறுதிப்படுத்தலுக்கான கடவுச்சொல்லும் பொருந்தவில்லை"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"காப்புப் பிரதி கடவுச்சொல்லை அமைப்பதில் தோல்வி"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"ஏற்றுகிறது…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"வைபிரன்ட் (இயல்பு)"</item>
<item msgid="8446070607501413455">"இயற்கை வண்ணம்"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ஒவ்வொரு முறையும் கேள்"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"சற்றுமுன்"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"உருவாக்கத்திலுள்ள புதுப்பிக்கப்பட்ட கிராஃபிக்ஸ் டிரைவரைப் பயன்படுத்த ஆப்ஸைத் தேர்ந்தெடுக்கவும்"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"மொபைல் ஸ்பீக்கர்"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index ddb40ce96c94..5d79065885d2 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -173,7 +173,7 @@
<item msgid="2850427388488887328">"కెర్నెల్ మాత్రమే"</item>
</string-array>
<string-array name="select_logpersist_summaries">
- <item msgid="2216470072500521830">"ఆఫ్ చేయి"</item>
+ <item msgid="2216470072500521830">"ఆఫ్"</item>
<item msgid="172978079776521897">"అన్ని లాగ్ బఫర్‌లు"</item>
<item msgid="3873873912383879240">"అన్నీ కానీ రేడియో లాగ్ బఫర్‌లు"</item>
<item msgid="8489661142527693381">"కెర్నెల్ లాగ్ బఫర్ మాత్రమే"</item>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index af233dae55a3..9d1b23e77807 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"కనెక్ట్ చేయబడింది, ఇంటర్నెట్ లేదు"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ఇంటర్నెట్ లేదు"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"సైన్ ఇన్ చేయాలి"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"యాక్సెస్ పాయింట్ తాత్కాలికంగా నిండుకుంది"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"చాలా నెమ్మది"</string>
<string name="speed_label_slow" msgid="813109590815810235">"నెమ్మది"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"సరే"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"కొత్త బ్యాకప్ పాస్‌వర్డ్‌ను సెట్ చేసారు"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"కొత్త పాస్‌వర్డ్ మరియు నిర్ధారణ సరిపోలడం లేదు"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"బ్యాకప్ పాస్‌వర్డ్‌ను సెట్ చేయడంలో వైఫల్యం"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"లోడ్ చేస్తోంది…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"సచేతనం (డిఫాల్ట్)"</item>
<item msgid="8446070607501413455">"సహజం"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ప్రతిసారి అడుగు"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"మీరు ఆఫ్‌ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ఇప్పుడే"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"అభివృద్దిలో అప్‌డేట్‌ చేసిన గ్రాఫిక్ డ్రైవర్‌ను ఉపయోగించడానికి యాప్‌ని ప్రారంభించండి"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ఫోన్ స్పీకర్"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 636c3f2f19c0..ddd9aae69bd3 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"เชื่อมต่ออัตโนมัติผ่าน %1$s แล้ว"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"เชื่อมต่ออัตโนมัติผ่านผู้ให้บริการการจัดอันดับเครือข่าย"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"พร้อมใช้งานผ่านทาง %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"เชื่อมต่อแล้ว ไม่พบอินเทอร์เน็ต"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ไม่มีอินเทอร์เน็ต"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ต้องลงชื่อเข้าใช้"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"จุดเข้าใช้งานเต็มชั่วคราว"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"พร้อมใช้งานผ่านทาง %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"ช้ามาก"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ช้า"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ตกลง"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"ตั้งรหัสผ่านสำหรับการสำรองข้อมูลใหม่แล้ว"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"รหัสผ่านใหม่และการพิมพ์ยืนยันไม่ตรงกัน"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ไม่สามารถตั้งรหัสผ่านสำหรับการสำรองข้อมูล"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"กำลังโหลด…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"สด (ค่าเริ่มต้น)"</item>
<item msgid="8446070607501413455">"ธรรมชาติ"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ถามทุกครั้ง"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"เมื่อสักครู่"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"เลือกใช้แอปเพื่อใช้ไดรเวอร์กราฟิกที่อัปเดตในการพัฒนา"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"ลำโพงโทรศัพท์"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 1bcc36a62618..644548000641 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Awtomatikong nakakonekta sa pamamagitan ng %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Awtomatikong nakakonekta sa pamamagitan ng provider ng rating ng network"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Nakakonekta sa pamamagitan ng %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Available sa pamamagitan ng %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Nakakonekta, walang internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Walang internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kinakailangang mag-sign in"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pansamantalang puno ang access point"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Nakakonekta sa pamamagitan ng %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available sa pamamagitan ng %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Napakabagal"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Mabagal"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Naitakda ang bagong backup na password"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Hindi tugma ang password at kumpirmasyon"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nabigo sa pagtatakda ng backup na password"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Naglo-load…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Vibrant (default)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Magtanong palagi"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ngayon lang"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"App sa pag-opt in para magamit ang na-update na graphics driver na ginagawa"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Speaker ng telepono"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index ff669f6a5f72..c3a3ff25da33 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s üzerinden otomatik olarak bağlı"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ağ derecelendirme sağlayıcı aracılığıyla otomatik olarak bağlandı"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s üzerinden bağlı"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s üzerinden kullanılabilir"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Bağlı, internet yok"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yok"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Oturum açılması gerekiyor"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Erişim noktası geçici olarak dolu"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s üzerinden bağlı"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s üzerinden kullanılabilir"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Çok Yavaş"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Tamam"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Yeni yedekleme şifresi ayarlandı"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Yeni şifre ve onayı eşleşmiyor."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Yedekleme şifresi ayarlanamadı"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Yükleniyor…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Canlı (varsayılan)"</item>
<item msgid="8446070607501413455">"Doğal"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Her zaman sor"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az önce"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Güncellenmiş grafik sürücüsünü geliştirme ortamında kullanmak için uygulamayı kaydedin"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefon hoparlörü"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 2ded8c187936..a28dc18ca7b2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматично під’єднано через %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматично під’єднано через постачальника оцінки якості мережі"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Під’єднано через %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступ через %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Під’єднано, але немає доступу до Інтернету"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Немає Інтернету"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потрібно ввійти в обліковий запис"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точка доступу тимчасово переповнена"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Під’єднано через мережу %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступ через мережу %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Дуже повільна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Повільна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Новий пароль резервної копії встановлено"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Паролі не збігаються"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Не вдалося зберегти пароль"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Завантаження…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Насичений (за умовчанням)"</item>
<item msgid="8446070607501413455">"Природний"</item>
@@ -451,6 +526,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Запитувати щоразу"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Доки ви не вимкнете"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Щойно"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Вибраний додаток, який використовуватиме оновлений графічний драйвер під час розробки"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Динамік телефона"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 7dc46906327c..397f4b2007d2 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"‏‎%1$s کے ذریعے از خود منسلک کردہ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"نیٹ ورک درجہ بندی کے فراہم کنندہ کے ذریعے از خود منسلک"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"‏منسلک بذریعہ ‎%1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"‏دستیاب بذریعہ ‎%1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"منسلک، انٹرنیٹ نہیں ہے"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"انٹرنیٹ نہیں ہے"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"سائن ان درکار ہے"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"رسائی پوائنٹ عارضی طور پر فُل ہے"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"‏منسلک بذریعہ ‎%1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"‏دستیاب بذریعہ ‎%1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"بہت سست"</string>
<string name="speed_label_slow" msgid="813109590815810235">"سست"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ٹھیک ہے"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"بیک اپ کا نیا پاس ورڈ سیٹ کر دیا گیا"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"نیا پاس ورڈ اور تصدیق مماثل نہیں ہے"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"بیک اپ پاس ورڈ ترتیب دینے میں ناکامی"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"لوڈ ہو رہی ہے…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"پرجوش (ڈیفالٹ)"</item>
<item msgid="8446070607501413455">"قدرتی"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ہر بار پوچھیں"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ابھی ابھی"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"ڈیولپمنٹ میں اپ ڈیٹ کردہ گرافکس ڈرائیور کو استعمال کرنے کے لیے ایپ آپٹ ان کریں"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"فون اسپیکر"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5f92c9ad52ce..5f214ce4767e 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s orqali avtomatik ulandi"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Tarmoqlar reytingi muallifi orqali avtomatik ulandi"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s orqali ulangan"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s orqali ishlaydi"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ulangan, lekin internet aloqasi yo‘q"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Internet yo‘q"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Hisob bilan kirish zarur"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Internet kirish nuqtasi vaqtinchalik to‘lgan"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s orqali ulangan"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s orqali ishlaydi"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Juda sekin"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sekin"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Yangi zaxira paroli o‘rnatildi"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Parollar bir-biriga mos kelmadi"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Zaxira parolini o‘rnatib bo‘lmadi"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Yuklanmoqda…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Yorqin (birlamchi)"</item>
<item msgid="8446070607501413455">"Tabiiy"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Har safar so‘ralsin"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Bekor qilinmaguncha"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Hozir"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Ilova yangilangan grafik drayverdan (hali ishlov jarayonida) foydalanadi"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Telefon karnayi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index eb10fb1abb2e..e019953a902f 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Tự động được kết nối qua %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Tự động được kết nối qua nhà cung cấp dịch vụ xếp hạng mạng"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Được kết nối qua %1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Có sẵn qua %1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Đã kết nối, không có Internet"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Không có Internet"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Yêu cầu đăng nhập"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Điểm truy cập tạm thời đã đạt đến giới hạn số lượng thiết bị truy cập."</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Được kết nối qua %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Có sẵn qua %1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Rất chậm"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Chậm"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Khá tốt"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Đã đặt mật khẩu sao lưu mới"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Mật khẩu mới và xác nhận không khớp"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Đặt mật khẩu sao lưu không thành công"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Đang tải…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Sống động (mặc định)"</item>
<item msgid="8446070607501413455">"Tự nhiên"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Luôn hỏi"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Vừa xong"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Chọn ứng dụng để sử dụng trình điều khiển đồ họa được cập nhật trong giai đoạn phát triển"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Loa điện thoại"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 7b14138287a3..fd0d36e72e27 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"已通过%1$s自动连接"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已自动连接(通过网络评分服务提供方)"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"已通过%1$s连接"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"可通过%1$s连接"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已连接,但无法访问互联网"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"无法访问互联网"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"必须登录"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"接入点暂时满载"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已通过%1$s连接"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可通过%1$s连接"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"很慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"已设置了新的备份密码"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"新密码和确认密码不一致"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"设置备份密码失败"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"正在加载…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"鲜亮(默认)"</item>
<item msgid="8446070607501413455">"自然"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都询问"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"刚刚"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"为应用启用更新后的显卡驱动,以在开发过程中使用"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"手机扬声器"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 48b6959129ad..024299b0fd8d 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"已透過 %1$s 自動連線"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已透過網絡評分供應商自動連線"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 連線"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,但沒有互聯網"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有互聯網連線"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時已滿"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 連線"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"已設定新備份密碼"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"新密碼與確認密碼不符"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"無法設定備份密碼"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"正在載入…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"生動 (預設)"</item>
<item msgid="8446070607501413455">"自然"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"請選取應用程式,以在開發階段使用更新的顯示卡驅動程式"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"手機喇叭"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 684569b819e2..146ffacb7a17 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"已透過 %1$s 自動連線"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已透過網路評分供應商自動連線"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 使用"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,沒有網際網路"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有網際網路連線"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時滿載"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 使用"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"確定"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"已設定新備份密碼"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"新密碼與確認密碼不符。"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"無法設定備份密碼"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"載入中…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"鮮活 (預設)"</item>
<item msgid="8446070607501413455">"自然"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"選取要在開發階段使用最新版繪圖驅動程式的應用程式"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"手機喇叭"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index d107a5a80f1b..fc7b9b412c8c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -38,13 +38,87 @@
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Ixhumeke ngokuzenzakalela nge-%1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Kuxhunywe ngokuzenzakalelayo ngomhlinzeki wesilinganiso wenethiwekhi"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Kuxhumeke nge-%1$s"</string>
+ <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
+ <skip />
<string name="available_via_passpoint" msgid="1617440946846329613">"Iyatholakala nge-%1$s"</string>
+ <!-- no translation found for tap_to_set_up (2468970825530423314) -->
+ <skip />
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Kuxhunyiwe, ayikho i-inthanethi"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Ayikho i-inthanethi"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Ukungena ngemvume kuyadingeka"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Iphoyinti lokufinyelela ligcwele okwesikhashana"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Kuxhumeke nge-%1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Iyatholakala nge-%1$s"</string>
+ <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
+ <skip />
+ <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
+ <skip />
+ <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
+ <skip />
+ <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
+ <skip />
+ <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
+ <skip />
+ <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
+ <skip />
+ <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
+ <skip />
+ <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
+ <skip />
+ <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
+ <skip />
+ <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
+ <skip />
+ <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
+ <skip />
+ <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
+ <skip />
+ <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
+ <skip />
+ <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
+ <skip />
+ <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
+ <skip />
+ <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
+ <skip />
+ <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
+ <skip />
+ <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
+ <skip />
+ <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
+ <skip />
+ <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
+ <skip />
+ <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
+ <skip />
+ <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
+ <skip />
+ <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
+ <skip />
<string name="speed_label_very_slow" msgid="1867055264243608530">"Phansi kakhulu"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Phansi"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"KULUNGILE"</string>
@@ -330,6 +404,7 @@
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Iphasiwedi entsha eyisipele isethiwe"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Iphasiwedi entsha nokuqinisekisa akufani"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Ukungaphumeleli kokusetha iphasiwedi eyisipele"</string>
+ <string name="loading_injected_setting_summary" msgid="4095178591461231376">"Iyalayisha…"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Dlidlizela (okuzenzakalelayo)"</item>
<item msgid="8446070607501413455">"Kwemvelo"</item>
@@ -449,6 +524,5 @@
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Buza njalo"</string>
<string name="zen_mode_forever" msgid="2704305038191592967">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Khona manje"</string>
- <string name="updated_gfx_driver_dev_opt_in_app_summary" msgid="5309913444094165199">"Uhlelo lokusebenza lokukhetha ukungena olungasebenzisa idrayivu yamagrafikhi ekuthuthukiseni"</string>
<string name="media_transfer_phone_device_name" msgid="1003823744105758574">"Isipikha sefoni"</string>
</resources>
diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml
index 24297556174d..f30198c74bdb 100644
--- a/packages/SettingsLib/res/values/arrays.xml
+++ b/packages/SettingsLib/res/values/arrays.xml
@@ -102,6 +102,20 @@
<!-- Bluetooth settings -->
+ <!-- Titles for Bluetooth HCI Snoop Logging -->
+ <string-array name="bt_hci_snoop_log_entries">
+ <item>Disabled</item>
+ <item>Enabled Filtered</item>
+ <item>Enabled</item>
+ </string-array>
+
+ <!-- Values for Bluetooth HCI Snoop Logging -->
+ <string-array name="bt_hci_snoop_log_values" translatable="false">
+ <item>disabled</item>
+ <item>filtered</item>
+ <item>full</item>
+ </string-array>
+
<!-- Titles for Bluetooth AVRCP Versions -->
<string-array name="bluetooth_avrcp_versions">
<item>AVRCP 1.4 (Default)</item>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 9502000db4ab..df1ff654230a 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -103,8 +103,12 @@
<string name="connected_via_network_scorer_default">Automatically connected via network rating provider</string>
<!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
<string name="connected_via_passpoint">Connected via %1$s</string>
+ <!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
+ <string name="ssid_by_passpoint_provider"><xliff:g id="ssid" example="Cafe Wifi">%1$s</xliff:g> by <xliff:g id="passpointProvider" example="Passpoint Provider">%2$s</xliff:g></string>
<!-- Status message of Wi-Fi when network has matching passpoint credentials. [CHAR LIMIT=NONE] -->
<string name="available_via_passpoint">Available via %1$s</string>
+ <!-- Status message of OSU Provider network when not connected. [CHAR LIMIT=NONE] -->
+ <string name="tap_to_set_up">Tap to set up</string>
<!-- Package name for Settings app-->
<string name="settings_package" translatable="false">com.android.settings</string>
<!-- Package name for Certinstaller app-->
@@ -127,6 +131,79 @@
<!-- Status message of Wi-Fi when an available network is a carrier network. [CHAR LIMIT=NONE] -->
<string name="available_via_carrier">Available via %1$s</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_AP_CONNECTION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_ap_connection">Connection failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_URL_INVALID. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_url_invalid">Invalid OSU server URL</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_CONNECTION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_connection">OSU server connection failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_VALIDATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_validation">OSU server validation failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_service_provider_verification">Invalid OSU server certificate</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_ABORTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_provisioning_aborted">Provisioning aborted</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_NOT_AVAILABLE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_provisioning_not_available">Provisioning not available</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_INVALID_SERVER_URL. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_invalid_server_url">Invalid OSU server URL</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_COMMAND_TYPE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_command_type">Unexpected command type</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_soap_message_type">Unexpected SOAP message type</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SOAP_MESSAGE_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_soap_message_exchange">SOAP message exchange failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_START_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_start_redirect_listener">Redirect listener failed to start</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_timed_out_redirect_listener">Timed out waiting for redirect</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_OSU_ACTIVITY_FOUND. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_osu_activity_found">No OSU activity found</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_soap_message_status">Unexpected SOAP message status</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_PPS_MO. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_pps_mo">Failed to find PPS-MO</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_aaa_server_trust_root_node">Failed to find trust root node for AAA server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_remediation_server_trust_root_node">Failed to find trust root node for remediation server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_policy_server_trust_root_node">Failed to find trust root node for policy server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_retrieve_trust_root_certificates">Failed to retrieve trust root certificates</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_aaa_trust_root_certificate">Failed to find trust root certificate for AAA server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_add_passpoint_configuration">Failed to add PassPoint configuration</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_OSU_PROVIDER_NOT_FOUND. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_osu_provider_not_found">Failed to find an OSU provider</string>
+
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTING. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_ap_connecting">Connecting</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_ap_connected">Connected</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTING. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_connecting">Connecting to OSU server</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_VALIDATED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_validated">OSU server validated</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_connected">Connected to OSU server</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_INIT_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_init_soap_exchange">Initial SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_waiting_for_redirect_response">Waiting for redirect response</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_REDIRECT_RESPONSE_RECEIVED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_redirect_response_received">Received redirect response</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SECOND_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_second_soap_exchange">Second SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_THIRD_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_third_soap_exchange">Third SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_retrieving_trust_root_certs">Retrieving trust root certificates</string>
+
+ <!-- Status message of OSU Provider on completing provisioning. [CHAR LIMIT=NONE] -->
+ <string name="osu_provisioning_complete">Provisioning complete</string>
+
<!-- Speed label for very slow network speed -->
<string name="speed_label_very_slow">Very Slow</string>
<!-- Speed label for slow network speed -->
@@ -524,8 +601,8 @@
<string name="keep_screen_on_summary">Screen will never sleep while charging</string>
<!-- Setting Checkbox title whether to enable Bluetooth HCI snoop log -->
<string name="bt_hci_snoop_log">Enable Bluetooth HCI snoop log</string>
- <!-- setting Checkbox summary whether to capture all Bluetooth HCI packets in a file -->
- <string name="bt_hci_snoop_log_summary">Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)</string>
+ <!-- setting Checkbox summary whether to capture all Bluetooth HCI packets in a file [CHAR_LIMIT=100] -->
+ <string name="bt_hci_snoop_log_summary">Capture Bluetooth packets. (Toggle Bluetooth after changing this setting)</string>
<!-- setting Checkbox title whether to enable OEM unlock [CHAR_LIMIT=35] -->
<string name="oem_unlock_enable">OEM unlocking</string>
<!-- setting Checkbox summary whether to enable OEM unlock [CHAR_LIMIT=50] -->
@@ -1151,9 +1228,6 @@
<!-- The notice header of Third-party licenses. not translatable -->
<string name="notice_header" translatable="false"></string>
- <!-- UI debug setting: opt in to use updated graphics driver? [CHAR LIMIT=100] -->
- <string name="gup_dev_opt_in_app_summary">Opt in app to use Game Update Package in developement</string>
-
<!-- Name of the phone device [CHAR LIMIT=NONE] -->
<string name="media_transfer_phone_device_name">Phone speaker</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 6abe76a1e753..c751c39aebbd 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -1,5 +1,7 @@
package com.android.settingslib;
+import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN;
+
import android.annotation.ColorInt;
import android.content.Context;
import android.content.Intent;
@@ -36,8 +38,8 @@ public class Utils {
private static final String CURRENT_MODE_KEY = "CURRENT_MODE";
private static final String NEW_MODE_KEY = "NEW_MODE";
@VisibleForTesting
- static final String STORAGE_MANAGER_SHOW_OPT_IN_PROPERTY =
- "ro.storage_manager.show_opt_in";
+ static final String STORAGE_MANAGER_ENABLED_PROPERTY =
+ "ro.storage_manager.enabled";
private static Signature[] sSystemSignature;
private static String sPermissionControllerPackageName;
@@ -371,8 +373,7 @@ public class Utils {
public static boolean isStorageManagerEnabled(Context context) {
boolean isDefaultOn;
try {
- // Turn off by default if the opt-in was shown.
- isDefaultOn = !SystemProperties.getBoolean(STORAGE_MANAGER_SHOW_OPT_IN_PROPERTY, true);
+ isDefaultOn = SystemProperties.getBoolean(STORAGE_MANAGER_ENABLED_PROPERTY, false);
} catch (Resources.NotFoundException e) {
isDefaultOn = false;
}
@@ -429,12 +430,14 @@ public class Utils {
// and do not support voice service, and on these SIM cards, we
// want to show signal bars for data service as well as the "no
// service" or "emergency calls only" text that indicates that voice
- // is not available.
+ // is not available. Note that we ignore the IWLAN service state
+ // because that state indicates the use of VoWIFI and not cell service
int state = serviceState.getState();
int dataState = serviceState.getDataRegState();
if (state == ServiceState.STATE_OUT_OF_SERVICE
|| state == ServiceState.STATE_EMERGENCY_ONLY) {
- if (dataState == ServiceState.STATE_IN_SERVICE) {
+ if (dataState == ServiceState.STATE_IN_SERVICE
+ && serviceState.getDataNetworkType() != RIL_RADIO_TECHNOLOGY_IWLAN) {
return ServiceState.STATE_IN_SERVICE;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
index 629f750ed287..4c3fcba6122e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
@@ -35,7 +35,6 @@ import java.util.List;
public class A2dpProfile implements LocalBluetoothProfile {
private static final String TAG = "A2dpProfile";
- private static boolean V = false;
private Context mContext;
@@ -60,7 +59,6 @@ public class A2dpProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothA2dp) proxy;
// We just bound to the service, so refresh the UI for any connected A2DP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -79,7 +77,6 @@ public class A2dpProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- if (V) Log.d(TAG,"Bluetooth service disconnected");
mIsProfileReady=false;
}
}
@@ -305,7 +302,7 @@ public class A2dpProfile implements LocalBluetoothProfile {
}
protected void finalize() {
- if (V) Log.d(TAG, "finalize()");
+ Log.d(TAG, "finalize()");
if (mService != null) {
try {
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.A2DP,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
index 988062de0a37..873dd1a643a4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
@@ -55,7 +55,6 @@ final class A2dpSinkProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected");
mService = (BluetoothA2dpSink) proxy;
// We just bound to the service, so refresh the UI for any connected A2DP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -74,7 +73,6 @@ final class A2dpSinkProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected");
mIsProfileReady=false;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
index 62507f58426f..6b6df9b928e5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
@@ -58,7 +58,6 @@ public class HeadsetProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothHeadset) proxy;
// We just bound to the service, so refresh the UI for any connected HFP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -80,7 +79,6 @@ public class HeadsetProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG,"Bluetooth service disconnected");
mProfileManager.callServiceDisconnectedListeners();
mIsProfileReady=false;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
index adb5ab34b5c1..577d98d93405 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
@@ -51,7 +51,6 @@ public class HearingAidProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothHearingAid) proxy;
// We just bound to the service, so refresh the UI for any connected HearingAid devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -77,7 +76,6 @@ public class HearingAidProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- if (V) Log.d(TAG,"Bluetooth service disconnected");
mIsProfileReady=false;
}
}
@@ -234,7 +232,7 @@ public class HearingAidProfile implements LocalBluetoothProfile {
}
protected void finalize() {
- if (V) Log.d(TAG, "finalize()");
+ Log.d(TAG, "finalize()");
if (mService != null) {
try {
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.HEARING_AID,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
index 4879144a5994..c6bb2b304d6c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
@@ -59,7 +59,6 @@ final class HfpClientProfile implements LocalBluetoothProfile {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected");
mService = (BluetoothHeadsetClient) proxy;
// We just bound to the service, so refresh the UI for any connected HFP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -80,7 +79,6 @@ final class HfpClientProfile implements LocalBluetoothProfile {
@Override
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected");
mIsProfileReady=false;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
index 61e5b6b3e125..4dc050c6d5e3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
@@ -58,7 +58,6 @@ public class HidDeviceProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected :-), profile:" + profile);
mService = (BluetoothHidDevice) proxy;
// We just bound to the service, so refresh the UI for any connected HID devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -78,7 +77,6 @@ public class HidDeviceProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected, profile:" + profile);
mIsProfileReady = false;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
index 75d16db13efe..ca840d9a8ba4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
@@ -33,7 +33,6 @@ import java.util.List;
*/
public class HidProfile implements LocalBluetoothProfile {
private static final String TAG = "HidProfile";
- private static boolean V = true;
private BluetoothHidHost mService;
private boolean mIsProfileReady;
@@ -51,7 +50,6 @@ public class HidProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothHidHost) proxy;
// We just bound to the service, so refresh the UI for any connected HID devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -70,7 +68,6 @@ public class HidProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- if (V) Log.d(TAG,"Bluetooth service disconnected");
mIsProfileReady=false;
}
}
@@ -186,7 +183,7 @@ public class HidProfile implements LocalBluetoothProfile {
}
protected void finalize() {
- if (V) Log.d(TAG, "finalize()");
+ Log.d(TAG, "finalize()");
if (mService != null) {
try {
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.HID_HOST,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
index 1e22f440b5f8..6acdcac86d92 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
@@ -59,7 +59,6 @@ public final class MapClientProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected, profile:" + profile);
mService = (BluetoothMapClient) proxy;
// We just bound to the service, so refresh the UI for any connected MAP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -81,7 +80,6 @@ public final class MapClientProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected, profile:" + profile);
mProfileManager.callServiceDisconnectedListeners();
mIsProfileReady=false;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
index 758202412c93..28975d4b94c2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
@@ -58,7 +58,6 @@ public class MapProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected");
mService = (BluetoothMap) proxy;
// We just bound to the service, so refresh the UI for any connected MAP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -80,7 +79,6 @@ public class MapProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected");
mProfileManager.callServiceDisconnectedListeners();
mIsProfileReady=false;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
index 7b811624a6f3..2d0a0902de24 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
@@ -34,7 +34,6 @@ import java.util.List;
*/
public class PanProfile implements LocalBluetoothProfile {
private static final String TAG = "PanProfile";
- private static boolean V = true;
private BluetoothPan mService;
private boolean mIsProfileReady;
@@ -53,13 +52,11 @@ public class PanProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothPan) proxy;
mIsProfileReady=true;
}
public void onServiceDisconnected(int profile) {
- if (V) Log.d(TAG,"Bluetooth service disconnected");
mIsProfileReady=false;
}
}
@@ -173,7 +170,7 @@ public class PanProfile implements LocalBluetoothProfile {
}
protected void finalize() {
- if (V) Log.d(TAG, "finalize()");
+ Log.d(TAG, "finalize()");
if (mService != null) {
try {
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.PAN, mService);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
index 1f15601f2756..46723937a941 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
@@ -55,7 +55,6 @@ public final class PbapClientProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected, profile:" + profile);
mService = (BluetoothPbapClient) proxy;
// We just bound to the service, so refresh the UI for any connected PBAP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -74,7 +73,6 @@ public final class PbapClientProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected, profile:" + profile);
mIsProfileReady = false;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
index adef0841cb2a..1b3c453be4ed 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
@@ -33,7 +33,6 @@ import com.android.settingslib.R;
*/
public class PbapServerProfile implements LocalBluetoothProfile {
private static final String TAG = "PbapServerProfile";
- private static boolean V = true;
private BluetoothPbap mService;
private boolean mIsProfileReady;
@@ -56,13 +55,11 @@ public class PbapServerProfile implements LocalBluetoothProfile {
implements BluetoothPbap.ServiceListener {
public void onServiceConnected(BluetoothPbap proxy) {
- if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothPbap) proxy;
mIsProfileReady=true;
}
public void onServiceDisconnected() {
- if (V) Log.d(TAG,"Bluetooth service disconnected");
mIsProfileReady=false;
}
}
@@ -142,7 +139,7 @@ public class PbapServerProfile implements LocalBluetoothProfile {
}
protected void finalize() {
- if (V) Log.d(TAG, "finalize()");
+ Log.d(TAG, "finalize()");
if (mService != null) {
try {
mService.close();
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
index b4acc4810faf..ea2ebde3ff4c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
@@ -57,7 +57,6 @@ final class SapProfile implements LocalBluetoothProfile {
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
- Log.d(TAG, "Bluetooth service connected, profile:" + profile);
mService = (BluetoothSap) proxy;
// We just bound to the service, so refresh the UI for any connected SAP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
@@ -79,7 +78,6 @@ final class SapProfile implements LocalBluetoothProfile {
}
public void onServiceDisconnected(int profile) {
- Log.d(TAG, "Bluetooth service disconnected, profile:" + profile);
mProfileManager.callServiceDisconnectedListeners();
mIsProfileReady=false;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
index aed02a268aea..8090169a4245 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
@@ -41,10 +41,6 @@ public class VisibilityLoggerMixin implements LifecycleObserver {
private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN;
private long mVisibleTimestamp;
- private VisibilityLoggerMixin() {
- mMetricsCategory = METRICS_CATEGORY_UNKNOWN;
- }
-
public VisibilityLoggerMixin(int metricsCategory, MetricsFeatureProvider metricsFeature) {
mMetricsCategory = metricsCategory;
mMetricsFeature = metricsFeature;
@@ -81,12 +77,4 @@ public class VisibilityLoggerMixin implements LifecycleObserver {
MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
MetricsProto.MetricsEvent.VIEW_UNKNOWN);
}
-
- /** Returns elapsed time since onResume() */
- public long elapsedTimeSinceVisible() {
- if (mVisibleTimestamp == 0) {
- return 0;
- }
- return SystemClock.elapsedRealtime() - mVisibleTimestamp;
- }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
index 12b8efb1461c..4ab9a9ac5915 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
@@ -55,6 +55,12 @@ public final class CategoryKey {
"com.android.settings.category.ia.privacy";
public static final String CATEGORY_ENTERPRISE_PRIVACY =
"com.android.settings.category.ia.enterprise_privacy";
+ public static final String CATEGORY_ABOUT_LEGAL =
+ "com.android.settings.category.ia.about_legal";
+ public static final String CATEGORY_MY_DEVICE_INFO =
+ "com.android.settings.category.ia.my_device_info";
+ public static final String CATEGORY_BATTERY_SAVER_SETTINGS =
+ "com.android.settings.category.ia.battery_saver_settings";
public static final Map<String, String> KEY_COMPAT_MAP;
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index 180b77e7503b..8cb252ed6283 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -66,6 +66,7 @@ public class DataUsageController {
private INetworkStatsSession mSession;
private Callback mCallback;
private NetworkNameProvider mNetworkController;
+ private int mSubscriptionId;
public DataUsageController(Context context) {
mContext = context;
@@ -75,6 +76,7 @@ public class DataUsageController {
ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
mPolicyManager = NetworkPolicyManager.from(mContext);
mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
+ mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
public void setNetworkController(NetworkNameProvider networkController) {
@@ -82,6 +84,15 @@ public class DataUsageController {
}
/**
+ * By default this class will just get data usage information for the default data subscription,
+ * but this method can be called to require it to use an explicit subscription id which may be
+ * different from the default one (this is useful for the case of multi-SIM devices).
+ */
+ public void setSubscriptionId(int subscriptionId) {
+ mSubscriptionId = subscriptionId;
+ }
+
+ /**
* Returns the default warning level in bytes.
*/
public long getDefaultWarningLevel() {
@@ -99,7 +110,7 @@ public class DataUsageController {
}
public DataUsageInfo getDataUsageInfo() {
- final String subscriberId = getActiveSubscriberId(mContext);
+ final String subscriberId = getActiveSubscriberId();
if (subscriberId == null) {
return warn("no subscriber id");
}
@@ -164,7 +175,8 @@ public class DataUsageController {
private long getUsageLevel(NetworkTemplate template, long start, long end) {
try {
final Bucket bucket = mNetworkStatsManager.querySummaryForDevice(
- getNetworkType(template), getActiveSubscriberId(mContext), start, end);
+ getNetworkType(template), getActiveSubscriberId(),
+ start, end);
if (bucket != null) {
return bucket.getRxBytes() + bucket.getTxBytes();
}
@@ -237,10 +249,13 @@ public class DataUsageController {
}
}
- private static String getActiveSubscriberId(Context context) {
- final TelephonyManager tele = TelephonyManager.from(context);
- final String actualSubscriberId = tele.getSubscriberId(
- SubscriptionManager.getDefaultDataSubscriptionId());
+ private String getActiveSubscriberId() {
+ final TelephonyManager tele = TelephonyManager.from(mContext);
+ int subscriptionId = mSubscriptionId;
+ if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
+ }
+ final String actualSubscriberId = tele.getSubscriberId(subscriptionId);
return actualSubscriberId;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index f3a58ccd62a2..6b3432116c07 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -41,7 +41,9 @@ import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
+import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
+import android.net.wifi.hotspot2.ProvisioningCallback;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.RemoteException;
@@ -183,6 +185,10 @@ public class AccessPoint implements Comparable<AccessPoint> {
public static final int UNREACHABLE_RSSI = Integer.MIN_VALUE;
+ public static final String KEY_PREFIX_AP = "AP:";
+ public static final String KEY_PREFIX_FQDN = "FQDN:";
+ public static final String KEY_PREFIX_OSU = "OSU:";
+
private final Context mContext;
private String ssid;
@@ -205,9 +211,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
@Speed private int mSpeed = Speed.NONE;
private boolean mIsScoredNetworkMetered = false;
- // used to co-relate internal vs returned accesspoint.
- int mId;
-
/**
* Information associated with the {@link PasspointConfiguration}. Only maintaining
* the relevant info to preserve spaces.
@@ -216,6 +219,13 @@ public class AccessPoint implements Comparable<AccessPoint> {
private String mProviderFriendlyName;
private boolean mIsCarrierAp = false;
+
+ private OsuProvider mOsuProvider;
+
+ private String mOsuStatus;
+ private String mOsuFailure;
+ private boolean mOsuProvisioningComplete = false;
+
/**
* The EAP type {@link WifiEnterpriseConfig.Eap} associated with this AP if it is a carrier AP.
*/
@@ -281,14 +291,18 @@ public class AccessPoint implements Comparable<AccessPoint> {
// Calculate required fields
updateKey();
updateRssi();
-
- mId = sLastId.incrementAndGet();
}
+ /**
+ * Creates an AccessPoint with only a WifiConfiguration. This is used for the saved networks
+ * page.
+ *
+ * Passpoint Credential AccessPoints should be created with this.
+ * Make sure to call setScanResults after constructing with this.
+ */
public AccessPoint(Context context, WifiConfiguration config) {
mContext = context;
loadConfig(config);
- mId = sLastId.incrementAndGet();
}
/**
@@ -299,7 +313,17 @@ public class AccessPoint implements Comparable<AccessPoint> {
mContext = context;
mFqdn = config.getHomeSp().getFqdn();
mProviderFriendlyName = config.getHomeSp().getFriendlyName();
- mId = sLastId.incrementAndGet();
+ }
+
+ /**
+ * Initialize an AccessPoint object for a Passpoint OSU Provider.
+ * Make sure to call setScanResults after constructing with this.
+ */
+ public AccessPoint(Context context, OsuProvider provider) {
+ mContext = context;
+ mOsuProvider = provider;
+ ssid = provider.getFriendlyName();
+ updateKey();
}
AccessPoint(Context context, Collection<ScanResult> results) {
@@ -325,33 +349,27 @@ public class AccessPoint implements Comparable<AccessPoint> {
mIsCarrierAp = firstResult.isCarrierAp;
mCarrierApEapType = firstResult.carrierApEapType;
mCarrierName = firstResult.carrierName;
-
- mId = sLastId.incrementAndGet();
}
@VisibleForTesting void loadConfig(WifiConfiguration config) {
ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
bssid = config.BSSID;
security = getSecurity(config);
- updateKey();
networkId = config.networkId;
mConfig = config;
+ updateKey();
}
/** Updates {@link #mKey} and should only called upon object creation/initialization. */
private void updateKey() {
// TODO(sghuman): Consolidate Key logic on ScanResultMatchInfo
-
- StringBuilder builder = new StringBuilder();
-
- if (TextUtils.isEmpty(getSsidStr())) {
- builder.append(getBssid());
- } else {
- builder.append(getSsidStr());
+ if (isPasspoint()) {
+ mKey = getKey(mConfig);
+ } else if (isOsuProvider()) {
+ mKey = getKey(mOsuProvider);
+ } else { // Non-Passpoint AP
+ mKey = getKey(getSsidStr(), getBssid(), getSecurity());
}
-
- builder.append(',').append(getSecurity());
- mKey = builder.toString();
}
/**
@@ -395,8 +413,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
return difference;
}
- // Sort by ssid.
- difference = getSsidStr().compareToIgnoreCase(other.getSsidStr());
+ // Sort by title.
+ difference = getTitle().compareToIgnoreCase(other.getTitle());
if (difference != 0) {
return difference;
}
@@ -592,28 +610,46 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public static String getKey(ScanResult result) {
- StringBuilder builder = new StringBuilder();
+ return getKey(result.SSID, result.BSSID, getSecurity(result));
+ }
- if (TextUtils.isEmpty(result.SSID)) {
- builder.append(result.BSSID);
+ /**
+ * Returns the AccessPoint key for a WifiConfiguration.
+ * This will return a special Passpoint key if the config is for Passpoint.
+ */
+ public static String getKey(WifiConfiguration config) {
+ if (config.isPasspoint()) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_FQDN)
+ .append(config.FQDN).toString();
} else {
- builder.append(result.SSID);
+ return getKey(config.SSID, config.BSSID, getSecurity(config));
}
+ }
- builder.append(',').append(getSecurity(result));
- return builder.toString();
+ /**
+ * Returns the AccessPoint key corresponding to the OsuProvider.
+ */
+ public static String getKey(OsuProvider provider) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_OSU)
+ .append(provider.getFriendlyName())
+ .append(',')
+ .append(provider.getServerUri()).toString();
}
- public static String getKey(WifiConfiguration config) {
+ /**
+ * Returns the AccessPoint key for a normal non-Passpoint network by ssid/bssid and security.
+ */
+ private static String getKey(String ssid, String bssid, int security) {
StringBuilder builder = new StringBuilder();
-
- if (TextUtils.isEmpty(config.SSID)) {
- builder.append(config.BSSID);
+ builder.append(KEY_PREFIX_AP);
+ if (TextUtils.isEmpty(ssid)) {
+ builder.append(bssid);
} else {
- builder.append(removeDoubleQuotes(config.SSID));
+ builder.append(ssid);
}
-
- builder.append(',').append(getSecurity(config));
+ builder.append(',').append(security);
return builder.toString();
}
@@ -622,9 +658,10 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public boolean matches(WifiConfiguration config) {
- if (config.isPasspoint() && mConfig != null && mConfig.isPasspoint()) {
- return ssid.equals(removeDoubleQuotes(config.SSID)) && config.FQDN.equals(mConfig.FQDN);
+ if (config.isPasspoint()) {
+ return (isPasspoint() && config.FQDN.equals(mConfig.FQDN));
} else {
+ // Normal non-Passpoint network
return ssid.equals(removeDoubleQuotes(config.SSID))
&& security == getSecurity(config)
&& (mConfig == null || mConfig.shared == config.shared);
@@ -900,86 +937,111 @@ public class AccessPoint implements Comparable<AccessPoint> {
return "";
}
- public String getSummary() {
- return getSettingsSummary(mConfig);
+ /**
+ * Returns the display title for the AccessPoint, such as for an AccessPointPreference's title.
+ */
+ public String getTitle() {
+ if (isPasspoint()) {
+ return mConfig.providerFriendlyName;
+ } else if (isOsuProvider()) {
+ return mOsuProvider.getFriendlyName();
+ } else {
+ return getSsidStr();
+ }
}
- public String getSettingsSummary() {
- return getSettingsSummary(mConfig);
+ public String getSummary() {
+ return getSettingsSummary();
}
- private String getSettingsSummary(WifiConfiguration config) {
+ public String getSettingsSummary() {
// Update to new summary
StringBuilder summary = new StringBuilder();
- if (isActive() && config != null && config.isPasspoint()) {
- // This is the active connection on passpoint
- summary.append(getSummary(mContext, getDetailedState(),
- false, config.providerFriendlyName));
- } else if (isActive() && config != null && getDetailedState() == DetailedState.CONNECTED
- && mIsCarrierAp) {
- summary.append(String.format(mContext.getString(R.string.connected_via_carrier), mCarrierName));
+ if (isOsuProvider()) {
+ if (mOsuProvisioningComplete) {
+ summary.append(mContext.getString(R.string.osu_provisioning_complete));
+ } else if (mOsuFailure != null) {
+ summary.append(mOsuFailure);
+ } else if (mOsuStatus != null) {
+ summary.append(mOsuStatus);
+ } else {
+ summary.append(mContext.getString(R.string.tap_to_set_up));
+ }
} else if (isActive()) {
- // This is the active connection on non-passpoint network
- summary.append(getSummary(mContext, getDetailedState(),
- mInfo != null && mInfo.isEphemeral()));
- } else if (config != null && config.isPasspoint()
- && config.getNetworkSelectionStatus().isNetworkEnabled()) {
- String format = mContext.getString(R.string.available_via_passpoint);
- summary.append(String.format(format, config.providerFriendlyName));
- } else if (config != null && config.hasNoInternetAccess()) {
- int messageID = config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()
- ? R.string.wifi_no_internet_no_reconnect
- : R.string.wifi_no_internet;
- summary.append(mContext.getString(messageID));
- } else if (config != null && !config.getNetworkSelectionStatus().isNetworkEnabled()) {
- WifiConfiguration.NetworkSelectionStatus networkStatus =
- config.getNetworkSelectionStatus();
- switch (networkStatus.getNetworkSelectionDisableReason()) {
- case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE:
- summary.append(mContext.getString(R.string.wifi_disabled_password_failure));
- break;
- case WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD:
- summary.append(mContext.getString(R.string.wifi_check_password_try_again));
- break;
- case WifiConfiguration.NetworkSelectionStatus.DISABLED_DHCP_FAILURE:
- case WifiConfiguration.NetworkSelectionStatus.DISABLED_DNS_FAILURE:
- summary.append(mContext.getString(R.string.wifi_disabled_network_failure));
- break;
- case WifiConfiguration.NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION:
- summary.append(mContext.getString(R.string.wifi_disabled_generic));
- break;
+ if (isPasspoint()) {
+ // This is the active connection on passpoint
+ summary.append(getSummary(mContext, ssid, getDetailedState(),
+ false, mConfig.providerFriendlyName));
+ } else if (mConfig != null && getDetailedState() == DetailedState.CONNECTED
+ && mIsCarrierAp) {
+ // This is the active connection on a carrier AP
+ summary.append(String.format(mContext.getString(R.string.connected_via_carrier),
+ mCarrierName));
+ } else {
+ // This is the active connection on non-passpoint network
+ summary.append(getSummary(mContext, getDetailedState(),
+ mInfo != null && mInfo.isEphemeral()));
}
- } else if (config != null && config.getNetworkSelectionStatus().isNotRecommended()) {
- summary.append(mContext.getString(R.string.wifi_disabled_by_recommendation_provider));
- } else if (mIsCarrierAp) {
- summary.append(String.format(mContext.getString(R.string.available_via_carrier), mCarrierName));
- } else if (!isReachable()) { // Wifi out of range
- summary.append(mContext.getString(R.string.wifi_not_in_range));
- } else { // In range, not disabled.
- if (config != null) { // Is saved network
- // Last attempt to connect to this failed. Show reason why
- switch (config.recentFailure.getAssociationStatus()) {
- case WifiConfiguration.RecentFailure.STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:
- summary.append(mContext.getString(
- R.string.wifi_ap_unable_to_handle_new_sta));
+ } else { // not active
+ if (mConfig != null && mConfig.hasNoInternetAccess()) {
+ int messageID = mConfig.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()
+ ? R.string.wifi_no_internet_no_reconnect
+ : R.string.wifi_no_internet;
+ summary.append(mContext.getString(messageID));
+ } else if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) {
+ WifiConfiguration.NetworkSelectionStatus networkStatus =
+ mConfig.getNetworkSelectionStatus();
+ switch (networkStatus.getNetworkSelectionDisableReason()) {
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE:
+ summary.append(mContext.getString(R.string.wifi_disabled_password_failure));
break;
- default:
- // "Saved"
- summary.append(mContext.getString(R.string.wifi_remembered));
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD:
+ summary.append(mContext.getString(R.string.wifi_check_password_try_again));
+ break;
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_DHCP_FAILURE:
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_DNS_FAILURE:
+ summary.append(mContext.getString(R.string.wifi_disabled_network_failure));
+ break;
+ case WifiConfiguration.NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION:
+ summary.append(mContext.getString(R.string.wifi_disabled_generic));
break;
}
+ } else if (mConfig != null && mConfig.getNetworkSelectionStatus().isNotRecommended()) {
+ summary.append(mContext.getString(
+ R.string.wifi_disabled_by_recommendation_provider));
+ } else if (mIsCarrierAp) {
+ summary.append(String.format(mContext.getString(
+ R.string.available_via_carrier), mCarrierName));
+ } else if (!isReachable()) { // Wifi out of range
+ summary.append(mContext.getString(R.string.wifi_not_in_range));
+ } else { // In range, not disabled.
+ if (mConfig != null) { // Is saved network
+ // Last attempt to connect to this failed. Show reason why
+ switch (mConfig.recentFailure.getAssociationStatus()) {
+ case WifiConfiguration.RecentFailure.STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:
+ summary.append(mContext.getString(
+ R.string.wifi_ap_unable_to_handle_new_sta));
+ break;
+ default:
+ // "Saved"
+ summary.append(mContext.getString(R.string.wifi_remembered));
+ break;
+ }
+ }
}
}
+
+
if (isVerboseLoggingEnabled()) {
- summary.append(WifiUtils.buildLoggingSummary(this, config));
+ summary.append(WifiUtils.buildLoggingSummary(this, mConfig));
}
- if (config != null && (WifiUtils.isMeteredOverridden(config) || config.meteredHint)) {
+ if (mConfig != null && (WifiUtils.isMeteredOverridden(mConfig) || mConfig.meteredHint)) {
return mContext.getResources().getString(
R.string.preference_summary_default_combination,
- WifiUtils.getMeteredLabel(mContext, config),
+ WifiUtils.getMeteredLabel(mContext, mConfig),
summary.toString());
}
@@ -1032,11 +1094,33 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
/**
+ * Return true if this AccessPoint represents an OSU Provider.
+ */
+ public boolean isOsuProvider() {
+ return mOsuProvider != null;
+ }
+
+ /**
+ * Starts the OSU Provisioning flow.
+ */
+ public void startOsuProvisioning() {
+ mContext.getSystemService(WifiManager.class).startSubscriptionProvisioning(
+ mOsuProvider,
+ new AccessPointProvisioningCallback(),
+ ThreadUtils.getUiThreadHandler()
+ );
+ }
+
+ /**
* Return whether the given {@link WifiInfo} is for this access point.
* If the current AP does not have a network Id then the config is used to
* match based on SSID and security.
*/
private boolean isInfoForThisAccessPoint(WifiConfiguration config, WifiInfo info) {
+ if (info.isOsuAp()) {
+ return (mOsuStatus != null);
+ }
+
if (isPasspoint() == false && networkId != WifiConfiguration.INVALID_NETWORK_ID) {
return networkId == info.getNetworkId();
} else if (config != null) {
@@ -1120,18 +1204,21 @@ public class AccessPoint implements Comparable<AccessPoint> {
*/
void setScanResults(Collection<ScanResult> scanResults) {
- // Validate scan results are for current AP only
- String key = getKey();
- for (ScanResult result : scanResults) {
- String scanResultKey = AccessPoint.getKey(result);
- if (!mKey.equals(scanResultKey)) {
- throw new IllegalArgumentException(
- String.format("ScanResult %s\nkey of %s did not match current AP key %s",
- result, scanResultKey, key));
+ // Validate scan results are for current AP only by matching SSID/BSSID
+ // Passpoint networks are not bound to a specific SSID/BSSID, so skip this for passpoint.
+ if (!isPasspoint() && !isOsuProvider()) {
+ String key = getKey();
+ for (ScanResult result : scanResults) {
+ String scanResultKey = AccessPoint.getKey(result);
+ if (!mKey.equals(scanResultKey)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "ScanResult %s\nkey of %s did not match current AP key %s",
+ result, scanResultKey, key));
+ }
}
}
-
int oldLevel = getLevel();
mScanResults.clear();
mScanResults.addAll(scanResults);
@@ -1172,7 +1259,17 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
}
- /** Attempt to update the AccessPoint and return true if an update occurred. */
+ /**
+ * Attempt to update the AccessPoint with the current connection info.
+ * This is used to set an AccessPoint to the active one if the connection info matches, or
+ * conversely to set an AccessPoint to inactive if the connection info does not match. The RSSI
+ * is also updated upon a match. Listeners will be notified if an update occurred.
+ *
+ * This is called in {@link WifiTracker#updateAccessPoints} as well as in callbacks for handling
+ * NETWORK_STATE_CHANGED_ACTION, RSSI_CHANGED_ACTION, and onCapabilitiesChanged in WifiTracker.
+ *
+ * Returns true if an update occurred.
+ */
public boolean update(
@Nullable WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) {
@@ -1221,6 +1318,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
void update(@Nullable WifiConfiguration config) {
mConfig = config;
+ if (mConfig != null) {
+ ssid = removeDoubleQuotes(mConfig.SSID);
+ }
networkId = config != null ? config.networkId : WifiConfiguration.INVALID_NETWORK_ID;
ThreadUtils.postOnMainThread(() -> {
if (mAccessPointListener != null) {
@@ -1296,11 +1396,11 @@ public class AccessPoint implements Comparable<AccessPoint> {
public static String getSummary(Context context, String ssid, DetailedState state,
boolean isEphemeral, String passpointProvider) {
- if (state == DetailedState.CONNECTED && ssid == null) {
- if (TextUtils.isEmpty(passpointProvider) == false) {
+ if (state == DetailedState.CONNECTED) {
+ if (!TextUtils.isEmpty(passpointProvider)) {
// Special case for connected + passpoint networks.
- String format = context.getString(R.string.connected_via_passpoint);
- return String.format(format, passpointProvider);
+ String format = context.getString(R.string.ssid_by_passpoint_provider);
+ return String.format(format, ssid, passpointProvider);
} else if (isEphemeral) {
// Special case for connected + ephemeral networks.
final NetworkScoreManager networkScoreManager = context.getSystemService(
@@ -1504,4 +1604,166 @@ public class AccessPoint implements Comparable<AccessPoint> {
private static boolean isVerboseLoggingEnabled() {
return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
}
+
+ /**
+ * Callbacks relaying changes to the OSU provisioning status started in startOsuProvisioning().
+ *
+ * All methods are invoked on the Main Thread
+ */
+ private class AccessPointProvisioningCallback extends ProvisioningCallback {
+ // TODO: Remove logs and implement summary changing logic for these provisioning callbacks.
+ @Override
+ @MainThread public void onProvisioningFailure(int status) {
+ switch (status) {
+ case OSU_FAILURE_AP_CONNECTION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_ap_connection);
+ break;
+ case OSU_FAILURE_SERVER_URL_INVALID:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_url_invalid);
+ break;
+ case OSU_FAILURE_SERVER_CONNECTION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_connection);
+ break;
+ case OSU_FAILURE_SERVER_VALIDATION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_validation);
+ break;
+ case OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_service_provider_verification);
+ break;
+ case OSU_FAILURE_PROVISIONING_ABORTED:
+ mOsuFailure = mContext.getString(R.string.osu_failure_provisioning_aborted);
+ break;
+ case OSU_FAILURE_PROVISIONING_NOT_AVAILABLE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_provisioning_not_available);
+ break;
+ case OSU_FAILURE_INVALID_SERVER_URL:
+ mOsuFailure = mContext.getString(R.string.osu_failure_invalid_server_url);
+ break;
+ case OSU_FAILURE_UNEXPECTED_COMMAND_TYPE:
+ mOsuFailure = mContext.getString(R.string.osu_failure_unexpected_command_type);
+ break;
+ case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_unexpected_soap_message_type);
+ break;
+ case OSU_FAILURE_SOAP_MESSAGE_EXCHANGE:
+ mOsuFailure = mContext.getString(R.string.osu_failure_soap_message_exchange);
+ break;
+ case OSU_FAILURE_START_REDIRECT_LISTENER:
+ mOsuFailure = mContext.getString(R.string.osu_failure_start_redirect_listener);
+ break;
+ case OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_timed_out_redirect_listener);
+ break;
+ case OSU_FAILURE_NO_OSU_ACTIVITY_FOUND:
+ mOsuFailure = mContext.getString(R.string.osu_failure_no_osu_activity_found);
+ break;
+ case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_unexpected_soap_message_status);
+ break;
+ case OSU_FAILURE_NO_PPS_MO:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_pps_mo);
+ break;
+ case OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_aaa_server_trust_root_node);
+ break;
+ case OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_remediation_server_trust_root_node);
+ break;
+ case OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_policy_server_trust_root_node);
+ break;
+ case OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_retrieve_trust_root_certificates);
+ break;
+ case OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_aaa_trust_root_certificate);
+ break;
+ case OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_add_passpoint_configuration);
+ break;
+ case OSU_FAILURE_OSU_PROVIDER_NOT_FOUND:
+ mOsuFailure = mContext.getString(R.string.osu_failure_osu_provider_not_found);
+ break;
+ }
+ mOsuStatus = null;
+ mOsuProvisioningComplete = false;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+
+ @Override
+ @MainThread public void onProvisioningStatus(int status) {
+ switch (status) {
+ case OSU_STATUS_AP_CONNECTING:
+ mOsuStatus = mContext.getString(R.string.osu_status_ap_connecting);
+ break;
+ case OSU_STATUS_AP_CONNECTED:
+ mOsuStatus = mContext.getString(R.string.osu_status_ap_connected);
+ break;
+ case OSU_STATUS_SERVER_CONNECTING:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_connecting);
+ break;
+ case OSU_STATUS_SERVER_VALIDATED:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_validated);
+ break;
+ case OSU_STATUS_SERVER_CONNECTED:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_connected);
+ break;
+ case OSU_STATUS_INIT_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_init_soap_exchange);
+ break;
+ case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE:
+ mOsuStatus = mContext.getString(
+ R.string.osu_status_waiting_for_redirect_response);
+ break;
+ case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED:
+ mOsuStatus = mContext.getString(R.string.osu_status_redirect_response_received);
+ break;
+ case OSU_STATUS_SECOND_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_second_soap_exchange);
+ break;
+ case OSU_STATUS_THIRD_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_third_soap_exchange);
+ break;
+ case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS:
+ mOsuStatus = mContext.getString(
+ R.string.osu_status_retrieving_trust_root_certs);
+ break;
+ }
+ mOsuFailure = null;
+ mOsuProvisioningComplete = false;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+
+ @Override
+ @MainThread public void onProvisioningComplete() {
+ mOsuProvisioningComplete = true;
+ mOsuFailure = null;
+ mOsuStatus = null;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index ed17d7c98724..a24a94344cd0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -276,7 +276,7 @@ public class AccessPointPreference extends Preference {
if (savedNetworks) {
preference.setTitle(ap.getConfigName());
} else {
- preference.setTitle(ap.getSsidStr());
+ preference.setTitle(ap.getTitle());
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 85ebc31690bc..9a03fffd3287 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -35,6 +35,7 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiNetworkScoreCache.CacheListener;
+import android.net.wifi.hotspot2.OsuProvider;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
@@ -45,6 +46,7 @@ import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
import android.widget.Toast;
import androidx.annotation.GuardedBy;
@@ -66,6 +68,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -573,9 +576,72 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
accessPoints.add(accessPoint);
}
+ List<ScanResult> cachedScanResults = new ArrayList<>(mScanResultCache.values());
+
+ // Add a unique Passpoint R1 AccessPoint for each Passpoint profile's FQDN.
+ List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> passpointConfigsAndScans =
+ mWifiManager.getAllMatchingWifiConfigs(cachedScanResults);
+ Set<String> seenFQDNs = new ArraySet<>();
+ for (Pair<WifiConfiguration,
+ Map<Integer, List<ScanResult>>> pairing : passpointConfigsAndScans) {
+ WifiConfiguration config = pairing.first;
+
+ List<ScanResult> scanResults = new ArrayList<>();
+
+ List<ScanResult> homeScans =
+ pairing.second.get(WifiManager.PASSPOINT_HOME_NETWORK);
+ List<ScanResult> roamingScans =
+ pairing.second.get(WifiManager.PASSPOINT_ROAMING_NETWORK);
+
+ if (homeScans == null) {
+ homeScans = new ArrayList<>();
+ }
+ if (roamingScans == null) {
+ roamingScans = new ArrayList<>();
+ }
+
+ // TODO(b/118705403): Differentiate home network vs roaming network for summary info
+ if (!homeScans.isEmpty()) {
+ scanResults.addAll(homeScans);
+ } else {
+ scanResults.addAll(roamingScans);
+ }
+
+ if (seenFQDNs.add(config.FQDN)) {
+ int bestRssi = Integer.MIN_VALUE;
+ for (ScanResult result : scanResults) {
+ if (result.level >= bestRssi) {
+ bestRssi = result.level;
+ config.SSID = AccessPoint.convertToQuotedString(result.SSID);
+ }
+ }
+
+ AccessPoint accessPoint =
+ getCachedOrCreatePasspoint(scanResults, cachedAccessPoints, config);
+ accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ accessPoints.add(accessPoint);
+ }
+ }
+
+ // Add Passpoint OSU Provider AccessPoints
+ Map<OsuProvider, List<ScanResult>> providersAndScans =
+ mWifiManager.getMatchingOsuProviders(cachedScanResults);
+ Set<OsuProvider> alreadyProvisioned = mWifiManager
+ .getMatchingPasspointConfigsForOsuProviders(
+ providersAndScans.keySet()).keySet();
+ for (OsuProvider provider : providersAndScans.keySet()) {
+ if (!alreadyProvisioned.contains(provider)) {
+ AccessPoint accessPointOsu =
+ getCachedOrCreateOsu(providersAndScans.get(provider),
+ cachedAccessPoints, provider);
+ accessPointOsu.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ accessPoints.add(accessPointOsu);
+ }
+ }
+
+
// If there were no scan results, create an AP for the currently connected network (if
// it exists).
- // TODO(b/b/73076869): Add support for passpoint (ephemeral) networks
if (accessPoints.isEmpty() && connectionConfig != null) {
AccessPoint activeAp = new AccessPoint(mContext, connectionConfig);
activeAp.update(connectionConfig, mLastInfo, mLastNetworkInfo);
@@ -623,18 +689,51 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
AccessPoint getCachedOrCreate(
List<ScanResult> scanResults,
List<AccessPoint> cache) {
- final int N = cache.size();
- for (int i = 0; i < N; i++) {
- if (cache.get(i).getKey().equals(AccessPoint.getKey(scanResults.get(0)))) {
- AccessPoint ret = cache.remove(i);
- ret.setScanResults(scanResults);
- return ret;
- }
+ AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(scanResults.get(0)));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, scanResults);
+ } else {
+ accessPoint.setScanResults(scanResults);
+ }
+ return accessPoint;
+ }
+
+ private AccessPoint getCachedOrCreatePasspoint(
+ List<ScanResult> scanResults,
+ List<AccessPoint> cache,
+ WifiConfiguration config) {
+ AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(config));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, config);
+ }
+ accessPoint.setScanResults(scanResults);
+ return accessPoint;
+ }
+
+ private AccessPoint getCachedOrCreateOsu(
+ List<ScanResult> scanResults,
+ List<AccessPoint> cache,
+ OsuProvider provider) {
+ AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(provider));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, provider);
}
- final AccessPoint accessPoint = new AccessPoint(mContext, scanResults);
+ accessPoint.setScanResults(scanResults);
return accessPoint;
}
+ private AccessPoint getCachedByKey(List<AccessPoint> cache, String key) {
+ ListIterator<AccessPoint> lit = cache.listIterator();
+ while (lit.hasNext()) {
+ AccessPoint currentAccessPoint = lit.next();
+ if (currentAccessPoint.getKey().equals(key)) {
+ lit.remove();
+ return currentAccessPoint;
+ }
+ }
+ return null;
+ }
+
private void updateNetworkInfo(NetworkInfo networkInfo) {
/* Sticky broadcasts can call this when wifi is disabled */
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index 594d767675c8..92ebe446ee98 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -17,7 +17,7 @@ package com.android.settingslib;
import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
-import static com.android.settingslib.Utils.STORAGE_MANAGER_SHOW_OPT_IN_PROPERTY;
+import static com.android.settingslib.Utils.STORAGE_MANAGER_ENABLED_PROPERTY;
import static com.google.common.truth.Truth.assertThat;
@@ -159,7 +159,7 @@ public class UtilsTest {
@Test
public void testIsStorageManagerEnabled_UsesSystemProperties() {
- SystemProperties.set(STORAGE_MANAGER_SHOW_OPT_IN_PROPERTY, "false");
+ SystemProperties.set(STORAGE_MANAGER_ENABLED_PROPERTY, "true");
assertThat(Utils.isStorageManagerEnabled(mContext)).isTrue();
}
@@ -247,6 +247,15 @@ public class UtilsTest {
}
@Test
+ public void isInService_voiceOutOfServiceDataInServiceOnIwLan_returnFalse() {
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
+ when(mServiceState.getDataNetworkType())
+ .thenReturn(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN);
+ when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+ assertThat(Utils.isInService(mServiceState)).isFalse();
+ }
+
+ @Test
public void isInService_voiceOutOfServiceDataOutOfService_returnFalse() {
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
index acf99a24e96c..220463b1f06c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
@@ -45,6 +45,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadows.ShadowSubscriptionManager;
@RunWith(RobolectricTestRunner.class)
public class DataUsageControllerTest {
@@ -73,7 +74,9 @@ public class DataUsageControllerTest {
new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
doReturn(mNetworkStatsHistory)
.when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
- doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(anyInt());
+ final int defaultSubscriptionId = 1234;
+ ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultSubscriptionId);
+ doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(eq(defaultSubscriptionId));
}
@Test
@@ -107,4 +110,39 @@ public class DataUsageControllerTest {
assertThat(mController.getHistoricalUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()))
.isEqualTo(receivedBytes + transmittedBytes);
}
+
+ @Test
+ public void getDataUsageInfo_hasUsageData_shouldReturnCorrectUsageForExplicitSubId()
+ throws Exception {
+ // First setup a stats bucket for the default subscription / subscriber ID.
+ final long defaultSubRx = 1234567L;
+ final long defaultSubTx = 123456L;
+ final NetworkStats.Bucket defaultSubscriberBucket = mock(NetworkStats.Bucket.class);
+ when(defaultSubscriberBucket.getRxBytes()).thenReturn(defaultSubRx);
+ when(defaultSubscriberBucket.getTxBytes()).thenReturn(defaultSubTx);
+ when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE),
+ eq(SUB_ID), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn(
+ defaultSubscriberBucket);
+
+ // Now setup a stats bucket for a different, non-default subscription / subscriber ID.
+ final long nonDefaultSubRx = 7654321L;
+ final long nonDefaultSubTx = 654321L;
+ final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class);
+ when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx);
+ when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx);
+ final int explictSubscriptionId = 55;
+ final String subscriberId2 = "Test Subscriber 2";
+ when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE),
+ eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn(
+ nonDefaultSubscriberBucket);
+ doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(explictSubscriptionId);
+
+ // Now verify that when we're asking for stats on the non-default subscription, we get
+ // the data back for that subscription and *not* the default one.
+ mController.setSubscriptionId(explictSubscriptionId);
+
+ assertThat(mController.getHistoricalUsageLevel(
+ NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo(
+ nonDefaultSubRx + nonDefaultSubTx);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
index c3bc8da89685..8c18c356159e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
@@ -19,7 +19,6 @@ package com.android.settingslib.widget;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
@@ -43,18 +42,24 @@ public class AppEntitiesHeaderControllerTest {
public final ExpectedException thrown = ExpectedException.none();
private Context mContext;
- private Drawable mIcon;
private View mAppEntitiesHeaderView;
private AppEntitiesHeaderController mController;
+ private AppEntityInfo mAppEntityInfo;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mAppEntitiesHeaderView = LayoutInflater.from(mContext).inflate(
R.layout.app_entities_header, null /* root */);
- mIcon = mContext.getDrawable(R.drawable.ic_menu);
mController = AppEntitiesHeaderController.newInstance(mContext,
mAppEntitiesHeaderView);
+ mAppEntityInfo = new AppEntityInfo.Builder()
+ .setIcon(mContext.getDrawable(R.drawable.ic_menu))
+ .setTitle(TITLE)
+ .setSummary(SUMMARY)
+ .setOnClickListener(v -> {
+ })
+ .build();
}
@Test
@@ -91,26 +96,26 @@ public class AppEntitiesHeaderControllerTest {
public void setAppEntity_indexLessThanZero_shouldThrowArrayIndexOutOfBoundsException() {
thrown.expect(ArrayIndexOutOfBoundsException.class);
- mController.setAppEntity(-1, mIcon, TITLE, SUMMARY);
+ mController.setAppEntity(-1, mAppEntityInfo);
}
@Test
public void asetAppEntity_indexGreaterThanMaximum_shouldThrowArrayIndexOutOfBoundsException() {
thrown.expect(ArrayIndexOutOfBoundsException.class);
- mController.setAppEntity(AppEntitiesHeaderController.MAXIMUM_APPS + 1, mIcon, TITLE,
- SUMMARY);
+ mController.setAppEntity(AppEntitiesHeaderController.MAXIMUM_APPS + 1, mAppEntityInfo);
}
@Test
public void setAppEntity_addAppToIndex0_shouldShowAppView1() {
- mController.setAppEntity(0, mIcon, TITLE, SUMMARY).apply();
+ mController.setAppEntity(0, mAppEntityInfo).apply();
final View app1View = mAppEntitiesHeaderView.findViewById(R.id.app1_view);
final ImageView appIconView = app1View.findViewById(R.id.app_icon);
final TextView appTitle = app1View.findViewById(R.id.app_title);
final TextView appSummary = app1View.findViewById(R.id.app_summary);
assertThat(app1View.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(app1View.hasOnClickListeners()).isTrue();
assertThat(appIconView.getDrawable()).isNotNull();
assertThat(appTitle.getText()).isEqualTo(TITLE);
assertThat(appSummary.getText()).isEqualTo(SUMMARY);
@@ -118,13 +123,14 @@ public class AppEntitiesHeaderControllerTest {
@Test
public void setAppEntity_addAppToIndex1_shouldShowAppView2() {
- mController.setAppEntity(1, mIcon, TITLE, SUMMARY).apply();
+ mController.setAppEntity(1, mAppEntityInfo).apply();
final View app2View = mAppEntitiesHeaderView.findViewById(R.id.app2_view);
final ImageView appIconView = app2View.findViewById(R.id.app_icon);
final TextView appTitle = app2View.findViewById(R.id.app_title);
final TextView appSummary = app2View.findViewById(R.id.app_summary);
assertThat(app2View.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(app2View.hasOnClickListeners()).isTrue();
assertThat(appIconView.getDrawable()).isNotNull();
assertThat(appTitle.getText()).isEqualTo(TITLE);
assertThat(appSummary.getText()).isEqualTo(SUMMARY);
@@ -132,13 +138,14 @@ public class AppEntitiesHeaderControllerTest {
@Test
public void setAppEntity_addAppToIndex2_shouldShowAppView3() {
- mController.setAppEntity(2, mIcon, TITLE, SUMMARY).apply();
+ mController.setAppEntity(2, mAppEntityInfo).apply();
final View app3View = mAppEntitiesHeaderView.findViewById(R.id.app3_view);
final ImageView appIconView = app3View.findViewById(R.id.app_icon);
final TextView appTitle = app3View.findViewById(R.id.app_title);
final TextView appSummary = app3View.findViewById(R.id.app_summary);
assertThat(app3View.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(app3View.hasOnClickListeners()).isTrue();
assertThat(appIconView.getDrawable()).isNotNull();
assertThat(appTitle.getText()).isEqualTo(TITLE);
assertThat(appSummary.getText()).isEqualTo(SUMMARY);
@@ -146,8 +153,8 @@ public class AppEntitiesHeaderControllerTest {
@Test
public void removeAppEntity_removeIndex0_shouldNotShowAppView1() {
- mController.setAppEntity(0, mIcon, TITLE, SUMMARY)
- .setAppEntity(1, mIcon, TITLE, SUMMARY).apply();
+ mController.setAppEntity(0, mAppEntityInfo)
+ .setAppEntity(1, mAppEntityInfo).apply();
final View app1View = mAppEntitiesHeaderView.findViewById(R.id.app1_view);
final View app2View = mAppEntitiesHeaderView.findViewById(R.id.app2_view);
@@ -162,9 +169,9 @@ public class AppEntitiesHeaderControllerTest {
@Test
public void clearAllAppEntities_shouldNotShowAllAppViews() {
- mController.setAppEntity(0, mIcon, TITLE, SUMMARY)
- .setAppEntity(1, mIcon, TITLE, SUMMARY)
- .setAppEntity(2, mIcon, TITLE, SUMMARY).apply();
+ mController.setAppEntity(0, mAppEntityInfo)
+ .setAppEntity(1, mAppEntityInfo)
+ .setAppEntity(2, mAppEntityInfo).apply();
final View app1View = mAppEntitiesHeaderView.findViewById(R.id.app1_view);
final View app2View = mAppEntitiesHeaderView.findViewById(R.id.app2_view);
final View app3View = mAppEntitiesHeaderView.findViewById(R.id.app3_view);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 67bacf050a8a..e5156b1591b2 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -28,8 +28,8 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
-import android.media.AudioSystem;
import android.media.AudioManager;
+import android.media.AudioSystem;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.Environment;
@@ -1104,9 +1104,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
}
if (upgradeVersion == 77) {
- // Introduce "vibrate when ringing" setting
- loadVibrateWhenRingingSetting(db);
-
+ // "vibrate when ringing" setting moved to SettingsProvider version 168
upgradeVersion = 78;
}
@@ -2223,8 +2221,6 @@ class DatabaseHelper extends SQLiteOpenHelper {
} finally {
if (stmt != null) stmt.close();
}
-
- loadVibrateWhenRingingSetting(db);
}
private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
@@ -2250,24 +2246,6 @@ class DatabaseHelper extends SQLiteOpenHelper {
}
}
- private void loadVibrateWhenRingingSetting(SQLiteDatabase db) {
- // The default should be off. VIBRATE_SETTING_ONLY_SILENT should also be ignored here.
- // Phone app should separately check whether AudioManager#getRingerMode() returns
- // RINGER_MODE_VIBRATE, with which the device should vibrate anyway.
- int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON,
- AudioManager.VIBRATE_SETTING_OFF);
- boolean vibrateWhenRinging = ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_ON);
-
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
- + " VALUES(?,?);");
- loadSetting(stmt, Settings.System.VIBRATE_WHEN_RINGING, vibrateWhenRinging ? 1 : 0);
- } finally {
- if (stmt != null) stmt.close();
- }
- }
-
private void loadSettings(SQLiteDatabase db) {
loadSystemSettings(db);
loadSecureSettings(db);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index f4ef4a024b99..edc96876467e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -705,11 +705,17 @@ class SettingsProtoDumpUtil {
Settings.Global.GPU_DEBUG_LAYERS_GLES,
GlobalSettingsProto.Gpu.DEBUG_LAYERS_GLES);
dumpSetting(s, p,
+ Settings.Global.GUP_DEV_ALL_APPS,
+ GlobalSettingsProto.Gpu.GUP_DEV_ALL_APPS);
+ dumpSetting(s, p,
Settings.Global.GUP_DEV_OPT_IN_APPS,
GlobalSettingsProto.Gpu.GUP_DEV_OPT_IN_APPS);
dumpSetting(s, p,
- Settings.Global.GUP_BLACK_LIST,
- GlobalSettingsProto.Gpu.GUP_BLACK_LIST);
+ Settings.Global.GUP_DEV_OPT_OUT_APPS,
+ GlobalSettingsProto.Gpu.GUP_DEV_OPT_OUT_APPS);
+ dumpSetting(s, p,
+ Settings.Global.GUP_BLACKLIST,
+ GlobalSettingsProto.Gpu.GUP_BLACKLIST);
p.end(gpuToken);
final long hdmiToken = p.start(GlobalSettingsProto.HDMI);
@@ -1557,6 +1563,10 @@ class SettingsProtoDumpUtil {
Settings.Global.ZRAM_ENABLED,
GlobalSettingsProto.ZRAM_ENABLED);
+ dumpSetting(s, p,
+ Global.APP_OPS_CONSTANTS,
+ GlobalSettingsProto.APP_OPS_CONSTANTS);
+
p.end(token);
// Please insert new settings using the same order as in GlobalSettingsProto.
@@ -1875,6 +1885,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
SecureSettingsProto.Doze.PULSE_ON_DOUBLE_TAP);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
+ SecureSettingsProto.Doze.PULSE_ON_TAP);
p.end(dozeToken);
dumpSetting(s, p,
@@ -2359,6 +2372,14 @@ class SettingsProtoDumpUtil {
SecureSettingsProto.Zen.SETTINGS_SUGGESTION_VIEWED);
p.end(zenToken);
+ dumpSetting(s, p,
+ Settings.Secure.SKIP_GESTURE,
+ SecureSettingsProto.SKIP_GESTURE_ENABLED);
+
+ dumpSetting(s, p,
+ Settings.Secure.SILENCE_GESTURE,
+ SecureSettingsProto.SILENCE_GESTURE_ENABLED);
+
// Please insert new settings using the same order as in SecureSettingsProto.
p.end(token);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index a2d8bc755aaa..0e277b3ce416 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -84,6 +84,8 @@ import com.android.providers.settings.SettingsState.Setting;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
+import com.google.android.collect.Sets;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
@@ -957,12 +959,12 @@ public class SettingsProvider extends ContentProvider {
UserManagerInternal userManager = LocalServices.getService(UserManagerInternal.class);
userManager.addUserRestrictionsListener((int userId, Bundle newRestrictions,
Bundle prevRestrictions) -> {
+ Set<String> changedRestrictions = getRestrictionDiff(prevRestrictions, newRestrictions);
// We are changing the settings affected by restrictions to their current
// value with a forced update to ensure that all cross profile dependencies
// are taken into account. Also make sure the settings update to.. the same
// value passes the security checks, so clear binder calling id.
- if (newRestrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION)
- != prevRestrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION)) {
+ if (changedRestrictions.contains(UserManager.DISALLOW_SHARE_LOCATION)) {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
@@ -976,11 +978,8 @@ public class SettingsProvider extends ContentProvider {
Binder.restoreCallingIdentity(identity);
}
}
- if (newRestrictions.getBoolean(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)
- != prevRestrictions.getBoolean(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES) ||
- newRestrictions.getBoolean(
- UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY)
- != prevRestrictions.getBoolean(
+ if (changedRestrictions.contains(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)
+ || changedRestrictions.contains(
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY)) {
final long identity = Binder.clearCallingIdentity();
try {
@@ -994,8 +993,7 @@ public class SettingsProvider extends ContentProvider {
Binder.restoreCallingIdentity(identity);
}
}
- if (newRestrictions.getBoolean(UserManager.DISALLOW_DEBUGGING_FEATURES)
- != prevRestrictions.getBoolean(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
+ if (changedRestrictions.contains(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
@@ -1008,8 +1006,7 @@ public class SettingsProvider extends ContentProvider {
Binder.restoreCallingIdentity(identity);
}
}
- if (newRestrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)
- != prevRestrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)) {
+ if (changedRestrictions.contains(UserManager.ENSURE_VERIFY_APPS)) {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
@@ -1028,8 +1025,7 @@ public class SettingsProvider extends ContentProvider {
Binder.restoreCallingIdentity(identity);
}
}
- if (newRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)
- != prevRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
+ if (changedRestrictions.contains(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
@@ -1046,13 +1042,27 @@ public class SettingsProvider extends ContentProvider {
});
}
+ private static Set<String> getRestrictionDiff(Bundle prevRestrictions, Bundle newRestrictions) {
+ Set<String> restrictionNames = Sets.newArraySet();
+ restrictionNames.addAll(prevRestrictions.keySet());
+ restrictionNames.addAll(newRestrictions.keySet());
+ Set<String> diff = Sets.newArraySet();
+ for (String restrictionName : restrictionNames) {
+ if (prevRestrictions.getBoolean(restrictionName) != newRestrictions.getBoolean(
+ restrictionName)) {
+ diff.add(restrictionName);
+ }
+ }
+ return diff;
+ }
+
private Setting getConfigSetting(String name) {
if (DEBUG) {
Slog.v(LOG_TAG, "getConfigSetting(" + name + ")");
}
// TODO(b/117663715): Ensure the caller can access the setting.
- // enforceSettingReadable(name, SETTINGS_TYPE_CONFIG, UserHandle.getCallingUserId());
+ // enforceReadPermission(READ_DEVICE_CONFIG);
// Get the value.
synchronized (mLock) {
@@ -1088,8 +1098,9 @@ public class SettingsProvider extends ContentProvider {
private boolean mutateConfigSetting(String name, String value, String prefix,
boolean makeDefault, int operation, int mode) {
- // TODO(b/117663715): check the new permission when it's added.
- // enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);
+
+ // TODO(b/117663715): Ensure the caller can access the setting.
+ // enforceReadPermission(WRITE_DEVICE_CONFIG);
// Perform the mutation.
synchronized (mLock) {
diff --git a/packages/SettingsProvider/test/AndroidManifest.xml b/packages/SettingsProvider/test/AndroidManifest.xml
index 87a4f603f70b..ebdf9b1a2791 100644
--- a/packages/SettingsProvider/test/AndroidManifest.xml
+++ b/packages/SettingsProvider/test/AndroidManifest.xml
@@ -20,6 +20,8 @@
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
+ <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/>
+ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
<uses-permission android:name="android.permission.MANAGE_USERS"/>
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index bff2c844bb48..b903142c44c6 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -57,6 +57,8 @@
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
+ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
+ <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.MANAGE_ACCESSIBILITY" />
<!-- Development tool permissions granted to the shell. -->
@@ -129,11 +131,14 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
<uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />
+ <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<uses-permission android:name="android.permission.ACTIVITY_EMBEDDING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.MANAGE_AUTO_FILL" />
<uses-permission android:name="android.permission.MANAGE_CONTENT_CAPTURE" />
+ <uses-permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS" />
+ <uses-permission android:name="android.permission.MANAGE_APP_PREDICTIONS" />
<uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME" />
@@ -162,6 +167,8 @@
<uses-permission android:name="android.permission.SUSPEND_APPS" />
<uses-permission android:name="android.permission.READ_CLIPBOARD_IN_BACKGROUND" />
+ <uses-permission android:name="android.permission.MANAGE_APPOPS" />
+
<application android:label="@string/app_label"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 2530abc765da..2d7471d9aca5 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -56,6 +56,7 @@ import com.google.android.collect.Lists;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.MainThread;
+import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Notification;
@@ -799,6 +800,18 @@ public class BugreportProgressService extends Service {
Log.wtf(TAG, "Missing " + EXTRA_BUGREPORT + " on intent " + intent);
return;
}
+ final int max = intent.getIntExtra(EXTRA_MAX, -1);
+ final File screenshotFile = getFileExtra(intent, EXTRA_SCREENSHOT);
+ final String shareTitle = intent.getStringExtra(EXTRA_TITLE);
+ final String shareDescription = intent.getStringExtra(EXTRA_DESCRIPTION);
+ onBugreportFinished(id, bugreportFile, screenshotFile, shareTitle, shareDescription, max);
+ }
+
+ /**
+ * Wraps up bugreport generation and triggers a notification to share the bugreport.
+ */
+ private void onBugreportFinished(int id, File bugreportFile, @Nullable File screenshotFile,
+ String shareTitle, String shareDescription, int max) {
mInfoDialog.onBugreportFinished();
BugreportInfo info = getInfo(id);
if (info == null) {
@@ -809,22 +822,17 @@ public class BugreportProgressService extends Service {
}
info.renameScreenshots(mScreenshotsDir);
info.bugreportFile = bugreportFile;
+ if (screenshotFile != null) {
+ info.addScreenshot(screenshotFile);
+ }
- final int max = intent.getIntExtra(EXTRA_MAX, -1);
if (max != -1) {
MetricsLogger.histogram(this, "dumpstate_duration", max);
info.max = max;
}
- final File screenshot = getFileExtra(intent, EXTRA_SCREENSHOT);
- if (screenshot != null) {
- info.addScreenshot(screenshot);
- }
-
- final String shareTitle = intent.getStringExtra(EXTRA_TITLE);
if (!TextUtils.isEmpty(shareTitle)) {
info.title = shareTitle;
- final String shareDescription = intent.getStringExtra(EXTRA_DESCRIPTION);
if (!TextUtils.isEmpty(shareDescription)) {
info.shareDescription= shareDescription;
}
@@ -1944,6 +1952,22 @@ public class BugreportProgressService extends Service {
}
@Override
+ public void onProgress(int progress) throws RemoteException {
+ updateProgressInfo(progress, 100 /* progress is already a percentage; so max = 100 */);
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ // TODO(b/111441001): implement
+ }
+
+ @Override
+ public void onFinished(long durationMs, String title, String description)
+ throws RemoteException {
+ // TODO(b/111441001): implement
+ }
+
+ @Override
public void onProgressUpdated(int progress) throws RemoteException {
/*
* Checks whether the progress changed in a way that should be displayed to the user:
@@ -1964,21 +1988,7 @@ public class BugreportProgressService extends Service {
}
if (newPercentage > oldPercentage) {
- if (DEBUG) {
- if (progress != info.progress) {
- Log.v(TAG, "Updating progress for PID " + info.pid + "(id: " + info.id
- + ") from " + info.progress + " to " + progress);
- }
- if (max != info.max) {
- Log.v(TAG, "Updating max progress for PID " + info.pid + "(id: " + info.id
- + ") from " + info.max + " to " + max);
- }
- }
- info.progress = progress;
- info.max = max;
- info.lastUpdate = System.currentTimeMillis();
-
- updateProgress(info);
+ updateProgressInfo(progress, max);
}
}
@@ -2000,5 +2010,23 @@ public class BugreportProgressService extends Service {
public void dump(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("token: "); pw.println(token);
}
+
+ private void updateProgressInfo(int progress, int max) {
+ if (DEBUG) {
+ if (progress != info.progress) {
+ Log.v(TAG, "Updating progress for PID " + info.pid + "(id: " + info.id
+ + ") from " + info.progress + " to " + progress);
+ }
+ if (max != info.max) {
+ Log.v(TAG, "Updating max progress for PID " + info.pid + "(id: " + info.id
+ + ") from " + info.max + " to " + max);
+ }
+ }
+ info.progress = progress;
+ info.max = max;
+ info.lastUpdate = System.currentTimeMillis();
+
+ updateProgress(info);
+ }
}
}
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 14daec6323a9..53a524ff96fb 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -88,6 +88,7 @@
<uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
<uses-permission android:name="android.permission.SET_SCREEN_COMPATIBILITY" />
<uses-permission android:name="android.permission.START_ANY_ACTIVITY" />
+ <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml
new file mode 100644
index 000000000000..d3c3a518f6ac
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="200dp"
+ android:width="200dp"
+ android:viewportHeight="100"
+ android:viewportWidth="100">
+ <path
+ android:fillColor="#000000"
+ android:pathData="M50.082,14.199m-13.985,0a13.985,13.985 0,1 1,27.97 0a13.985,13.985 0,1 1,-27.97 0"/>
+</vector>
diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml
new file mode 100644
index 000000000000..a4417fb65da4
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="200dp"
+ android:width="200dp"
+ android:viewportHeight="100"
+ android:viewportWidth="100" >
+ <path
+ android:fillColor="#000000"
+ android:pathData="M50.082,0.025L50.082,0.025A13.985,15.63 0,0 1,64.067 15.656L64.067,49.029A13.985,15.63 0,0 1,50.082 64.659L50.082,64.659A13.985,15.63 0,0 1,36.097 49.029L36.097,15.656A13.985,15.63 0,0 1,50.082 0.025z"/>
+</vector>
diff --git a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
new file mode 100644
index 000000000000..6f7f39810608
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<com.android.keyguard.clock.ClockLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <include
+ android:id="@+id/digital_clock"
+ layout="@layout/text_clock"
+ />
+ <com.android.keyguard.clock.ImageClock
+ android:id="@+id/analog_clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ <ImageView
+ android:id="@+id/minute_hand"
+ android:layout_width="300dp"
+ android:layout_height="300dp"
+ android:src="@drawable/bubble_minute_hand"
+ android:tint="@color/bubbleMinuteHandColor"
+ />
+ <ImageView
+ android:id="@+id/hour_hand"
+ android:layout_width="300dp"
+ android:layout_height="300dp"
+ android:src="@drawable/bubble_hour_hand"
+ android:tint="@color/bubbleHourHandColor"
+ />
+ </com.android.keyguard.clock.ImageClock>
+</com.android.keyguard.clock.ClockLayout>
diff --git a/packages/SystemUI/res-keyguard/layout/digital_clock.xml b/packages/SystemUI/res-keyguard/layout/digital_clock.xml
new file mode 100644
index 000000000000..e88e2c94e74f
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/digital_clock.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_alignParentTop="true">
+ <include
+ android:id="@+id/lock_screen_clock"
+ layout="@layout/text_clock"
+ />
+</FrameLayout>
+
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
index d52866fbd444..463367b2c600 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -30,17 +30,9 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_alignParentTop="true">
- <TextClock
+ <include
android:id="@+id/default_clock_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:letterSpacing="0.03"
- android:textColor="?attr/wallpaperTextColor"
- android:singleLine="true"
- style="@style/widget_big"
- android:format12Hour="@string/keyguard_widget_12_hours_format"
- android:format24Hour="@string/keyguard_widget_24_hours_format" />
+ layout="@layout/text_clock" />
</FrameLayout>
<include layout="@layout/keyguard_status_area"
android:id="@+id/keyguard_status_area"
diff --git a/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml
new file mode 100644
index 000000000000..64b676f55fd6
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<com.android.keyguard.clock.ClockLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <include
+ android:id="@+id/digital_clock"
+ layout="@layout/text_clock"
+ />
+ <com.android.keyguard.clock.StretchAnalogClock
+ android:id="@+id/analog_clock"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ />
+</com.android.keyguard.clock.ClockLayout>
diff --git a/packages/SystemUI/res-keyguard/layout/text_clock.xml b/packages/SystemUI/res-keyguard/layout/text_clock.xml
new file mode 100644
index 000000000000..b61ad9c4fc11
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/text_clock.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<TextClock
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:letterSpacing="0.03"
+ android:textColor="?attr/wallpaperTextColor"
+ android:singleLine="true"
+ style="@style/widget_big"
+ android:format12Hour="@string/keyguard_widget_12_hours_format"
+ android:format24Hour="@string/keyguard_widget_24_hours_format"
+ android:elegantTextHeight="false"
+/>
diff --git a/packages/SystemUI/res-keyguard/layout/type_clock.xml b/packages/SystemUI/res-keyguard/layout/type_clock.xml
new file mode 100644
index 000000000000..21c64e9c7dbe
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/type_clock.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<com.android.keyguard.clock.ClockLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <com.android.keyguard.clock.TypographicClock
+ android:id="@+id/type_clock"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+ <TextView
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="50dp"
+ style="@style/widget_big"
+ android:textColor="@color/typeClockAccentColor"
+ android:text="@string/type_clock_header"
+ android:textSize="40dp"
+ />
+ <TextView
+ android:id="@+id/hour"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="50dp"
+ style="@style/widget_big"
+ android:textSize="40dp"
+ />
+ <TextView
+ android:id="@+id/minute"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="50dp"
+ style="@style/widget_big"
+ android:textSize="40dp"
+ />
+ </com.android.keyguard.clock.TypographicClock>
+</com.android.keyguard.clock.ClockLayout>
diff --git a/packages/SystemUI/res-keyguard/values/colors.xml b/packages/SystemUI/res-keyguard/values/colors.xml
new file mode 100644
index 000000000000..74ee7ffad3f6
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/values/colors.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<resources>
+ <!-- Default color for hour hand of Bubble clock. -->
+ <color name="bubbleHourHandColor">#C97343</color>
+ <!-- Default color for minute hand of Bubble clock. -->
+ <color name="bubbleMinuteHandColor">#F5C983</color>
+ <!-- Accent color for Typographic clock. -->
+ <color name="typeClockAccentColor">#F5C983</color>
+</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 9245c300acf5..e2ba23ec898c 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -47,8 +47,6 @@
<dimen name="bottom_text_spacing_digital">0dp</dimen>
<!-- Slice subtitle -->
<dimen name="widget_label_font_size">16dp</dimen>
- <!-- Slice offset when pulsing -->
- <dimen name="widget_pulsing_bottom_padding">48dp</dimen>
<!-- Clock without header -->
<dimen name="widget_big_font_size">64dp</dimen>
<!-- Clock with header -->
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 10b6bb380c99..6bdd5d88b59b 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -410,4 +410,87 @@ number">%d</xliff:g> remaining attempt before SIM becomes permanently unusable.
number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item>
</plurals>
+ <!-- Header for typographic clock face. [CHAR LIMIT=8] -->
+ <string name="type_clock_header">It\u2019s</string>
+
+ <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=8] -->
+ <string-array name="type_clock_hours">
+ <item>Twelve</item>
+ <item>One</item>
+ <item>Two</item>
+ <item>Three</item>
+ <item>Four</item>
+ <item>Five</item>
+ <item>Six</item>
+ <item>Seven</item>
+ <item>Eight</item>
+ <item>Nine</item>
+ <item>Ten</item>
+ <item>Eleven</item>
+ </string-array>
+
+ <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=16] -->
+ <string-array name="type_clock_minutes">
+ <item>O\u2019Clock</item>
+ <item>O\u2019One</item>
+ <item>O\u2019Two</item>
+ <item>O\u2019Three</item>
+ <item>O\u2019Four</item>
+ <item>O\u2019Five</item>
+ <item>O\u2019Six</item>
+ <item>O\u2019Seven</item>
+ <item>O\u2019Eight</item>
+ <item>O\u2019Nine</item>
+ <item>Ten</item>
+ <item>Eleven</item>
+ <item>Twelve</item>
+ <item>Thirteen</item>
+ <item>Fourteen</item>
+ <item>Fifteen</item>
+ <item>Sixteen</item>
+ <item>Seventeen</item>
+ <item>Eighteen</item>
+ <item>Nineteen</item>
+ <item>Twenty</item>
+ <item>Twenty\nOne</item>
+ <item>Twenty\nTwo</item>
+ <item>Twenty\nThree</item>
+ <item>Twenty\nFour</item>
+ <item>Twenty\nFive</item>
+ <item>Twenty\nSix</item>
+ <item>Twenty\nSeven</item>
+ <item>Twenty\nEight</item>
+ <item>Twenty\nNine</item>
+ <item>Thirty</item>
+ <item>Thirty\nOne</item>
+ <item>Thirty\nTwo</item>
+ <item>Thirty\nThree</item>
+ <item>Thirty\nFour</item>
+ <item>Thirty\nFive</item>
+ <item>Thirty\nSix</item>
+ <item>Thirty\nSeven</item>
+ <item>Thirty\nEight</item>
+ <item>Thirty\nNine</item>
+ <item>Forty</item>
+ <item>Forty\nOne</item>
+ <item>Forty\nTwo</item>
+ <item>Forty\nThree</item>
+ <item>Forty\nFour</item>
+ <item>Forty\nFive</item>
+ <item>Forty\nSix</item>
+ <item>Forty\nSeven</item>
+ <item>Forty\nEight</item>
+ <item>Forty\nNine</item>
+ <item>Fifty</item>
+ <item>Fifty\nOne</item>
+ <item>Fifty\nTwo</item>
+ <item>Fifty\nThree</item>
+ <item>Fifty\nFour</item>
+ <item>Fifty\nFive</item>
+ <item>Fifty\nSix</item>
+ <item>Fifty\nSeven</item>
+ <item>Fifty\nEight</item>
+ <item>Fifty\nNine</item>
+ </string-array>
+
</resources>
diff --git a/packages/SystemUI/res/drawable/biometric_dialog_bg.xml b/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
index d04155618781..0c6d57dd6183 100644
--- a/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
@@ -18,7 +18,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?android:attr/colorBackgroundFloating" />
- <corners android:radius="1dp"
+ <corners
android:topLeftRadius="@dimen/biometric_dialog_corner_size"
android:topRightRadius="@dimen/biometric_dialog_corner_size"
android:bottomLeftRadius="@dimen/biometric_dialog_corner_size"
diff --git a/packages/SystemUI/res/drawable/bubble_expanded_header_bg.xml b/packages/SystemUI/res/drawable/bubble_expanded_header_bg.xml
new file mode 100644
index 000000000000..26bf981f9625
--- /dev/null
+++ b/packages/SystemUI/res/drawable/bubble_expanded_header_bg.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="rectangle">
+ <solid android:color="?android:attr/colorBackgroundFloating"/>
+ <corners
+ android:topLeftRadius="@dimen/corner_size"
+ android:topRightRadius="@dimen/corner_size"/>
+ </shape>
+ </item>
+ <item android:gravity="bottom">
+ <shape>
+ <size android:height="1dp"/>
+ <solid android:color="?android:attr/textColorSecondary" />
+ </shape>
+ </item>
+</layer-list> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/battery_percentage_view.xml b/packages/SystemUI/res/layout/battery_percentage_view.xml
index e52aa14abfa9..b9b1bb1f4330 100644
--- a/packages/SystemUI/res/layout/battery_percentage_view.xml
+++ b/packages/SystemUI/res/layout/battery_percentage_view.xml
@@ -22,7 +22,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
- android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:textColor="?android:attr/textColorPrimary"
android:gravity="center_vertical|start"
android:paddingStart="@dimen/battery_level_padding_start"
diff --git a/packages/SystemUI/res/layout/bubble_expanded_view.xml b/packages/SystemUI/res/layout/bubble_expanded_view.xml
index b2307e71e3ce..1aeb52cdce69 100644
--- a/packages/SystemUI/res/layout/bubble_expanded_view.xml
+++ b/packages/SystemUI/res/layout/bubble_expanded_view.xml
@@ -20,11 +20,23 @@
android:layout_width="match_parent"
android:id="@+id/bubble_expanded_view">
- <!-- TODO: header -->
-
<View
android:id="@+id/pointer_view"
android:layout_width="@dimen/bubble_pointer_width"
android:layout_height="@dimen/bubble_pointer_height"
/>
+
+ <TextView
+ android:id="@+id/bubble_content_header"
+ android:background="@drawable/bubble_expanded_header_bg"
+ android:textAppearance="@*android:style/TextAppearance.Material.Title"
+ android:textSize="18sp"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/bubble_expanded_header_height"
+ android:gravity="start|center_vertical"
+ android:singleLine="true"
+ android:paddingLeft="@dimen/bubble_expanded_header_horizontal_padding"
+ android:paddingRight="@dimen/bubble_expanded_header_horizontal_padding"
+ />
+
</com.android.systemui.bubbles.BubbleExpandedViewContainer>
diff --git a/packages/SystemUI/res/layout/bubble_view.xml b/packages/SystemUI/res/layout/bubble_view.xml
new file mode 100644
index 000000000000..204408cda81f
--- /dev/null
+++ b/packages/SystemUI/res/layout/bubble_view.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+<com.android.systemui.bubbles.BubbleView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/bubble_view">
+
+ <com.android.systemui.bubbles.BadgedImageView
+ android:id="@+id/bubble_image"
+ android:layout_width="@dimen/bubble_size"
+ android:layout_height="@dimen/bubble_size"
+ android:padding="@dimen/bubble_view_padding"
+ android:clipToPadding="false"/>
+
+ <TextView
+ android:id="@+id/message_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="@dimen/bubble_message_min_width"
+ android:maxWidth="@dimen/bubble_message_max_width"
+ android:padding="@dimen/bubble_message_padding"/>
+
+</com.android.systemui.bubbles.BubbleView>
diff --git a/core/res/res/layout/notification_template_ambient_header.xml b/packages/SystemUI/res/layout/dock_info_overlay.xml
index be5d9b436b79..430143ca3bc2 100644
--- a/core/res/res/layout/notification_template_ambient_header.xml
+++ b/packages/SystemUI/res/layout/dock_info_overlay.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2017 The Android Open Source Project
+ ~ Copyright (C) 2019 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.
@@ -15,14 +15,5 @@
~ limitations under the License.
-->
-<!-- hack to work around <include /> not being supported at the top level -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingStart="@dimen/notification_extra_margin_ambient"
- android:paddingEnd="@dimen/notification_extra_margin_ambient"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <include
- layout="@layout/notification_template_header"
- android:theme="@style/Theme.DeviceDefault.Notification.Ambient"/>
-</FrameLayout>
+<!-- empty stub -->
+<merge />
diff --git a/packages/SystemUI/res/layout/global_actions_wrapped.xml b/packages/SystemUI/res/layout/global_actions_wrapped.xml
index 7f4e0d21078f..f932303473bd 100644
--- a/packages/SystemUI/res/layout/global_actions_wrapped.xml
+++ b/packages/SystemUI/res/layout/global_actions_wrapped.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.HardwareUiLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@id/global_actions_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top|right"
diff --git a/packages/SystemUI/res/layout/ongoing_privacy_dialog_item.xml b/packages/SystemUI/res/layout/ongoing_privacy_dialog_item.xml
index ecfbfb434800..c8e0845a9144 100644
--- a/packages/SystemUI/res/layout/ongoing_privacy_dialog_item.xml
+++ b/packages/SystemUI/res/layout/ongoing_privacy_dialog_item.xml
@@ -25,12 +25,18 @@
android:focusable="true"
android:layout_gravity="center_vertical">
- <ImageView
- android:id="@+id/app_icon"
+ <FrameLayout
android:layout_height="@dimen/ongoing_appops_dialog_app_icon_size"
android:layout_width="@dimen/ongoing_appops_dialog_app_icon_size"
- android:layout_gravity="start|center_vertical"
- />
+ android:layout_gravity="start|center_vertical">
+
+ <ImageView
+ android:id="@+id/app_icon"
+ android:layout_height="@dimen/ongoing_appops_dialog_app_icon_size"
+ android:layout_width="@dimen/ongoing_appops_dialog_app_icon_size"
+ android:layout_gravity="center"
+ />
+ </FrameLayout>
<TextView
android:id="@+id/app_name"
diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
index 2000104ad0cd..74002ac38c02 100644
--- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml
+++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
@@ -51,11 +51,4 @@
android:layout_width="wrap_content"
android:paddingEnd="2dp" />
- <TextView
- android:id="@+id/batteryRemainingText"
- android:textAppearance="@style/TextAppearance.QS.TileLabel"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:gravity="center_vertical" />
-
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
index 307b5389521a..5bcc1b3b49bf 100644
--- a/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
@@ -39,7 +39,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_title_device_owned"
- style="@android:style/TextAppearance.Material.Title"
+ style="@style/TextAppearance.DeviceManagementDialog.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
@@ -64,7 +64,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_ca_certificate"
- style="@android:style/TextAppearance.Material.Title"
+ style="@style/TextAppearance.DeviceManagementDialog.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
@@ -89,7 +89,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_network_logging"
- style="@android:style/TextAppearance.Material.Title"
+ style="@style/TextAppearance.DeviceManagementDialog.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
@@ -114,7 +114,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_vpn"
- style="@android:style/TextAppearance.Material.Title"
+ style="@style/TextAppearance.DeviceManagementDialog.Title"
android:textColor="?android:attr/textColorPrimary"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 4e0cbe093c49..ed18dc728402 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -24,14 +24,13 @@
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:background="@android:color/transparent"
android:baselineAligned="false"
- android:clickable="true"
+ android:clickable="false"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingStart="0dp"
- android:elevation="4dp"
- android:importantForAccessibility="no" >
+ android:elevation="4dp" >
<include layout="@layout/quick_status_bar_header_system_icons" />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
index 22b8d2ff4db0..cd9f780ca249 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -24,6 +24,7 @@
android:clipToPadding="false"
android:gravity="center"
android:orientation="horizontal"
+ android:clickable="true"
android:paddingStart="@dimen/status_bar_padding_start"
android:paddingEnd="@dimen/status_bar_padding_end" >
@@ -63,11 +64,5 @@
<include layout="@layout/ongoing_privacy_chip" />
- <com.android.systemui.BatteryMeterView
- android:id="@+id/battery"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:gravity="center_vertical|end"
- android:layout_gravity="center_vertical|end" />
</LinearLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
deleted file mode 100644
index cfa372b8fc2e..000000000000
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2011, 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.
-*/
--->
-<!-- extends LinearLayout -->
-<com.android.systemui.statusbar.SignalClusterView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/signal_cluster"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal"
- android:paddingEnd="@dimen/signal_cluster_battery_padding"
- >
- <ImageView
- android:id="@+id/vpn"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:paddingEnd="6dp"
- android:src="@drawable/stat_sys_vpn_ic"
- android:tint="@color/background_protect_secondary"
- android:contentDescription="@string/accessibility_vpn_on"
- />
- <FrameLayout
- android:id="@+id/ethernet_combo"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- >
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="?attr/lightIconTheme"
- android:id="@+id/ethernet"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- />
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="?attr/darkIconTheme"
- android:id="@+id/ethernet_dark"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:alpha="0.0"
- />
- </FrameLayout>
- <FrameLayout
- android:layout_height="17dp"
- android:layout_width="wrap_content">
- <ImageView
- android:id="@+id/wifi_in"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:src="@drawable/ic_activity_down"
- android:visibility="gone"
- android:paddingEnd="2dp"
- />
- <ImageView
- android:id="@+id/wifi_out"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:src="@drawable/ic_activity_up"
- android:paddingEnd="2dp"
- android:visibility="gone"
- />
- </FrameLayout>
- <FrameLayout
- android:id="@+id/wifi_combo"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- >
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="?attr/lightIconTheme"
- android:id="@+id/wifi_signal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- />
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="?attr/darkIconTheme"
- android:id="@+id/wifi_signal_dark"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:alpha="0.0"
- />
- <ImageView
- android:id="@+id/wifi_inout"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- />
- </FrameLayout>
- <View
- android:id="@+id/wifi_signal_spacer"
- android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
- android:layout_height="4dp"
- android:visibility="gone"
- />
- <ViewStub
- android:id="@+id/connected_device_signals_stub"
- android:layout="@layout/connected_device_signal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <LinearLayout
- android:id="@+id/mobile_signal_group"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- >
- </LinearLayout>
- <View
- android:id="@+id/wifi_airplane_spacer"
- android:layout_width="@dimen/status_bar_airplane_spacer_width"
- android:layout_height="4dp"
- android:visibility="gone"
- />
- <ImageView
- android:id="@+id/airplane"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- />
-</com.android.systemui.statusbar.SignalClusterView>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 75c0ec3ced43..7d403b24354c 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -43,6 +43,8 @@
android:clipToPadding="false"
android:clipChildren="false">
+ <include layout="@layout/dock_info_overlay" />
+
<FrameLayout
android:id="@+id/qs_frame"
android:layout="@layout/qs_panel"
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 34c208ab81aa..02062bb7b2c4 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -43,6 +43,14 @@
android:visibility="invisible" />
</com.android.systemui.statusbar.BackDropView>
+ <com.android.systemui.wallpaper.AodMaskView
+ android:id="@+id/aod_mask"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ android:visibility="invisible"
+ sysui:ignoreRightInset="true" />
+
<com.android.systemui.statusbar.ScrimView
android:id="@+id/scrim_behind"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index eed44dd0d8a4..de2a9502146a 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors is af"</string>
<string name="device_services" msgid="1191212554435440592">"Toesteldienste"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Titelloos"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 7c09112b3fb2..41546432759e 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"ዳሳሾች ጠፍተዋል"</string>
<string name="device_services" msgid="1191212554435440592">"የመሣሪያ አገልግሎቶች"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"ርዕስ የለም"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 16abb680d45e..579964d05b3a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -914,6 +914,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"إيقاف أجهزة الاستشعار"</string>
<string name="device_services" msgid="1191212554435440592">"خدمات الأجهزة"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"بلا عنوان"</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 25f7b5b02370..811350492175 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -889,8 +889,6 @@
<item quantity="other"><xliff:g id="NUM_APPS_1">%d</xliff:g>টা অন্য এপ্</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"ছেন্সৰ অফ হৈ আছে"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"ডিভাইচ সেৱা"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"কোনো শিৰোনাম নাই"</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 4cc91d2c9517..6a27dbb85d40 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -176,7 +176,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Няма SIM-карты."</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"Мабільная перадача даных"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Мабільная перадача даных уключана"</string>
- <string name="cell_data_off_content_description" msgid="4356113230238585072">"Мабільны інтэрнэт выключаны"</string>
+ <string name="cell_data_off_content_description" msgid="4356113230238585072">"Мабільная перадача даных выключана"</string>
<string name="cell_data_off" msgid="1051264981229902873">"Выключаны"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Сувязь па Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Рэжым палёту."</string>
@@ -865,7 +865,7 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замяніць"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Праграмы, якія працуюць у фонавым рэжыме"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Дакраніцеся, каб даведацца пра выкарыстанне трафіка і акумулятара"</string>
- <string name="mobile_data_disable_title" msgid="1068272097382942231">"Адключыць мабільны інтэрнэт?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Выключыць мабільную перадачу даных?"</string>
<string name="mobile_data_disable_message" msgid="4756541658791493506">"У вас не будзе доступу да даных ці інтэрнэту праз аператара <xliff:g id="CARRIER">%s</xliff:g>. Інтэрнэт будзе даступны толькі праз Wi-Fi."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ваш аператар"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Праграма хавае запыт на дазвол, таму ваш адказ немагчыма спраўдзіць у Наладах."</string>
@@ -904,6 +904,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Датчыкі выкл."</string>
<string name="device_services" msgid="1191212554435440592">"Сэрвісы прылады"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Без назвы"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ede7af9a2084..e9effcf90c9f 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Сензорите са изключени"</string>
<string name="device_services" msgid="1191212554435440592">"Услуги за устройството"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Няма заглавие"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 76a344f78893..0724e379a464 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"সেন্সর বন্ধ"</string>
<string name="device_services" msgid="1191212554435440592">"ডিভাইস সংক্রান্ত পরিষেবা"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"কোনও শীর্ষক নেই"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 69550b07de0b..4e8e83327106 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors desactivats"</string>
<string name="device_services" msgid="1191212554435440592">"Serveis per a dispositius"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sense títol"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index cf116e3211f7..30bf1de14c57 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -902,6 +902,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Senzory jsou vypnuty"</string>
<string name="device_services" msgid="1191212554435440592">"Služby zařízení"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Bez názvu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index ce9a8212dc00..ad4afcff2b6c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
- <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen underretninger"</string>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen notifikationer"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
- <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Underretninger"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifikationer"</string>
<string name="battery_low_title" msgid="9187898087363540349">"Enheden løber muligvis snart tør for batteri"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> tilbage"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Der er <xliff:g id="PERCENTAGE">%1$s</xliff:g> tilbage eller ca. <xliff:g id="TIME">%2$s</xliff:g>, alt efter hvordan du bruger enheden"</string>
@@ -41,7 +41,7 @@
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatisk skærmrotation"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
- <string name="status_bar_settings_notifications" msgid="397146176280905137">"Underretninger"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifikationer"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"Netdeling via Bluetooth anvendt"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Konfigurer inputmetoder"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fysisk tastatur"</string>
@@ -71,7 +71,7 @@
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Screenshottet kan ikke gemmes, fordi der er begrænset lagerplads"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller din organisation tillader ikke, at du tager screenshots"</string>
<string name="screenrecord_name" msgid="4196719243134204796">"Skærmoptagelse"</string>
- <string name="screenrecord_channel_description" msgid="4630777331970993858">"Konstant underretning om skærmoptagelse"</string>
+ <string name="screenrecord_channel_description" msgid="4630777331970993858">"Konstant notifikation om skærmoptagelse"</string>
<string name="screenrecord_start_label" msgid="5177739269492196055">"Start optagelse"</string>
<string name="screenrecord_mic_label" msgid="4522870600914810019">"Optag voiceover"</string>
<string name="screenrecord_taps_label" msgid="1776467076607964790">"Vis tryk"</string>
@@ -187,9 +187,9 @@
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batteriet oplades. <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systemindstillinger."</string>
- <string name="accessibility_notifications_button" msgid="4498000369779421892">"Underretninger."</string>
- <string name="accessibility_overflow_action" msgid="5681882033274783311">"Se alle underretninger"</string>
- <string name="accessibility_remove_notification" msgid="3603099514902182350">"Ryd underretning."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifikationer."</string>
+ <string name="accessibility_overflow_action" msgid="5681882033274783311">"Se alle notifikationer"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Ryd notifikation."</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS aktiveret."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS samler data."</string>
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktiveret."</string>
@@ -199,8 +199,8 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Underretningen er annulleret."</string>
- <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Underretningspanel."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifikationen er annulleret."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notifikationspanel."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtige indstillinger."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskærm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Indstillinger"</string>
@@ -265,14 +265,14 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Søger efter GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Placeringen er angivet ved hjælp af GPS"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Aktive placeringsanmodninger"</string>
- <string name="accessibility_clear_all" msgid="5235938559247164925">"Ryd alle underretninger."</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Ryd alle notifikationer."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"<xliff:g id="NUMBER">%s</xliff:g> mere"</string>
<string name="notification_group_overflow_indicator_ambient" msgid="879560382990377886">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, +<xliff:g id="OVERFLOW">%2$s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
- <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> underretning mere i gruppen.</item>
- <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> underretninger mere i gruppen.</item>
+ <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> notifikation mere i gruppen.</item>
+ <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> notifikationer mere i gruppen.</item>
</plurals>
- <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Underretningsindstillinger"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Notifikationsindstillinger"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Indstillinger for <xliff:g id="APP_NAME">%s</xliff:g>"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skærmen roterer automatisk."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skærmen er nu låst i liggende retning."</string>
@@ -347,7 +347,7 @@
<item quantity="one">%d enhed</item>
<item quantity="other">%d enheder</item>
</plurals>
- <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Underretninger"</string>
+ <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifikationer"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lommelygte"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobildata"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Dataforbrug"</string>
@@ -382,7 +382,7 @@
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Dette blokerer ALLE lyde og vibrationer, bl.a. fra alarmer, musik, videoer og spil. Du vil stadig kunne foretage telefonopkald."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Dette blokerer ALLE lyde og vibrationer, bl.a. fra alarmer, musik, videoer og spil."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
- <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende underretninger nedenfor"</string>
+ <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende notifikationer nedenfor"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"Tryk igen for at åbne"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"Stryg opad for at låse op"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"Denne enhed administreres af din organisation"</string>
@@ -439,9 +439,9 @@
<string name="media_projection_remember_text" msgid="3103510882172746752">"Vis ikke igen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ryd alt"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Administrer"</string>
- <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Underretninger er sat på pause af Forstyr ikke"</string>
+ <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifikationer er sat på pause af Forstyr ikke"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start nu"</string>
- <string name="empty_shade_text" msgid="708135716272867002">"Ingen underretninger"</string>
+ <string name="empty_shade_text" msgid="708135716272867002">"Ingen notifikationer"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilen kan overvåges"</string>
<string name="vpn_footer" msgid="2388611096129106812">"Netværket kan være overvåget"</string>
<string name="branded_vpn_footer" msgid="2168111859226496230">"Netværket kan være overvåget"</string>
@@ -501,7 +501,7 @@
<string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"Låst op for <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> kører"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Enheden vil forblive låst, indtil du manuelt låser den op"</string>
- <string name="hidden_notifications_title" msgid="7139628534207443290">"Modtag underretninger hurtigere"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"Modtag notifikationer hurtigere"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Se dem, før du låser op"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nej tak"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfigurer"</string>
@@ -530,7 +530,7 @@
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
<string name="stream_music" msgid="9086982948697544342">"Medie"</string>
<string name="stream_alarm" msgid="5209444229227197703">"Alarm"</string>
- <string name="stream_notification" msgid="2563720670905665031">"Underretning"</string>
+ <string name="stream_notification" msgid="2563720670905665031">"Notifikation"</string>
<string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string>
<string name="stream_dtmf" msgid="2447177903892477915">"Tonesignalfrekvens (DTMF)"</string>
<string name="stream_accessibility" msgid="301136219144385106">"Hjælpefunktioner"</string>
@@ -549,7 +549,7 @@
<string name="volume_ringer_hint_unmute" msgid="6602880133293060368">"slå lyden til"</string>
<string name="volume_ringer_hint_vibrate" msgid="4036802135666515202">"vibrer"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s lydstyrkeknapper"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="3360373718388509040">"Der afspilles lyd ved opkald og underretninger (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="3360373718388509040">"Der afspilles lyd ved opkald og notifikationer (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
<string name="output_title" msgid="5355078100792942802">"Medieafspilning"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Udgang til telefonopkald"</string>
<string name="output_none_found" msgid="5544982839808921091">"Der blev ikke fundet nogen enheder"</string>
@@ -595,25 +595,25 @@
<string name="enable_bluetooth_title" msgid="5027037706500635269">"Vil du slå Bluetooth til?"</string>
<string name="enable_bluetooth_message" msgid="9106595990708985385">"Bluetooth skal være slået til, før du kan knytte dit tastatur til din tablet."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Slå til"</string>
- <string name="show_silently" msgid="6841966539811264192">"Vis underretninger lydløst"</string>
- <string name="block" msgid="2734508760962682611">"Bloker alle underretninger"</string>
+ <string name="show_silently" msgid="6841966539811264192">"Vis notifikationer lydløst"</string>
+ <string name="block" msgid="2734508760962682611">"Bloker alle notifikationer"</string>
<string name="do_not_silence" msgid="6878060322594892441">"Skal ikke sættes på lydløs"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"Skal ikke sættes på lydløs eller blokeres"</string>
- <string name="tuner_full_importance_settings" msgid="3207312268609236827">"Kontrolelementer til underretning om strøm"</string>
+ <string name="tuner_full_importance_settings" msgid="3207312268609236827">"Kontrolelementer til notifikation om strøm"</string>
<string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"Til"</string>
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"Fra"</string>
- <string name="power_notification_controls_description" msgid="4372459941671353358">"Med kontrolelementer til underretninger om strøm kan du konfigurere et vigtighedsniveau fra 0 til 5 for en apps underretninger. \n\n"<b>"Niveau 5"</b>\n"- Vis øverst på listen over underretninger \n- Tillad afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 4"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 3"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n\n"<b>"Niveau 2"</b>\n"- Ingen afbrydelse af fuld skærm \n Se aldrig smugkig \n- Ingen lyd og vibration \n\n"<b>"Niveau 1"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n- Ingen lyd eller vibration \n- Skjul fra låseskærm og statusbjælke \n- Vis nederst på listen over underretninger \n\n"<b>"Niveau 0"</b>\n"- Bloker alle underretninger fra appen."</string>
- <string name="notification_header_default_channel" msgid="7506845022070889909">"Underretninger"</string>
- <string name="notification_channel_disabled" msgid="344536703863700565">"Du får ikke længere vist disse underretninger"</string>
- <string name="notification_channel_minimized" msgid="1664411570378910931">"Disse underretninger minimeres"</string>
- <string name="notification_channel_silenced" msgid="2877199534497961942">"Disse underretninger vises lydløst"</string>
- <string name="notification_channel_unsilenced" msgid="4790904571552394137">"Disse underretninger underretter dig"</string>
- <string name="inline_blocking_helper" msgid="3055064577771478591">"Du afviser som regel disse underretninger. \nVil du blive ved med at se dem?"</string>
- <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsætte med at se disse underretninger?"</string>
- <string name="inline_stop_button" msgid="4172980096860941033">"Stop underretninger"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"Med kontrolelementer til notifikationer om strøm kan du konfigurere et vigtighedsniveau fra 0 til 5 for en apps notifikationer. \n\n"<b>"Niveau 5"</b>\n"- Vis øverst på listen over notifikationer \n- Tillad afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 4"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 3"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n\n"<b>"Niveau 2"</b>\n"- Ingen afbrydelse af fuld skærm \n Se aldrig smugkig \n- Ingen lyd og vibration \n\n"<b>"Niveau 1"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n- Ingen lyd eller vibration \n- Skjul fra låseskærm og statusbjælke \n- Vis nederst på listen over notifikationer \n\n"<b>"Niveau 0"</b>\n"- Bloker alle notifikationer fra appen."</string>
+ <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifikationer"</string>
+ <string name="notification_channel_disabled" msgid="344536703863700565">"Du får ikke længere vist disse notifikationer"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"Disse notifikationer minimeres"</string>
+ <string name="notification_channel_silenced" msgid="2877199534497961942">"Disse notifikationer vises lydløst"</string>
+ <string name="notification_channel_unsilenced" msgid="4790904571552394137">"Disse notifikationer underretter dig"</string>
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Du afviser som regel disse notifikationer. \nVil du blive ved med at se dem?"</string>
+ <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsætte med at se disse notifikationer?"</string>
+ <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifikationer"</string>
<!-- no translation found for inline_block_button (8735843688021655065) -->
<skip />
- <string name="inline_keep_button" msgid="6665940297019018232">"Fortsæt med at vise underretninger"</string>
+ <string name="inline_keep_button" msgid="6665940297019018232">"Fortsæt med at vise notifikationer"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis lydløst"</string>
<!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
@@ -622,8 +622,8 @@
<skip />
<!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
<skip />
- <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se underretninger fra denne app?"</string>
- <string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse underretninger kan ikke deaktiveres"</string>
+ <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se notifikationer fra denne app?"</string>
+ <string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse notifikationer kan ikke deaktiveres"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Denne app anvender kameraet."</string>
<string name="appops_microphone" msgid="741508267659494555">"Denne app anvender mikrofonen."</string>
@@ -634,15 +634,15 @@
<string name="appops_camera_mic_overlay" msgid="6718768197048030993">"Denne app vises over andre apps på din skærm og anvender mikrofonen og kameraet."</string>
<string name="notification_appops_settings" msgid="1028328314935908050">"Indstillinger"</string>
<string name="notification_appops_ok" msgid="1156966426011011434">"OK"</string>
- <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Styring af underretninger for <xliff:g id="APP_NAME">%1$s</xliff:g> blev åbnet"</string>
- <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Styring af underretninger for <xliff:g id="APP_NAME">%1$s</xliff:g> blev lukket"</string>
- <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Tillad underretninger fra denne kanal"</string>
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Styring af notifikationer for <xliff:g id="APP_NAME">%1$s</xliff:g> blev åbnet"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Styring af notifikationer for <xliff:g id="APP_NAME">%1$s</xliff:g> blev lukket"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Tillad notifikationer fra denne kanal"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Flere indstillinger"</string>
<string name="notification_app_settings" msgid="420348114670768449">"Tilpas"</string>
<string name="notification_done" msgid="5279426047273930175">"Udfør"</string>
<string name="inline_undo" msgid="558916737624706010">"Fortryd"</string>
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
- <string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrolelementer til underretninger"</string>
+ <string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrolelementer til notifikationer"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Indstillinger for udsættelse"</string>
<string name="notification_menu_snooze_action" msgid="1112254519029621372">"Udsæt"</string>
<string name="snooze_undo" msgid="6074877317002985129">"FORTRYD"</string>
@@ -689,7 +689,7 @@
<string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"Start"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Seneste"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Tilbage"</string>
- <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Underretninger"</string>
+ <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifikationer"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tastaturgenveje"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Skift tastaturlayout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applikationer"</string>
@@ -759,7 +759,7 @@
<item msgid="2139628951880142927">"Vis procent ved opladning (standard)"</item>
<item msgid="3327323682209964956">"Vis ikke dette ikon"</item>
</string-array>
- <string name="tuner_low_priority" msgid="1325884786608312358">"Vis ikoner for underretninger med lav prioritet"</string>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Vis ikoner for notifikationer med lav prioritet"</string>
<string name="other" msgid="4060683095962566764">"Andet"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Adskiller til opdelt skærm"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vis venstre del i fuld skærm"</string>
@@ -779,7 +779,7 @@
<string name="accessibility_qs_edit_tile_add" msgid="3520406665865985109">"Føj <xliff:g id="TILE_NAME">%1$s</xliff:g> til position <xliff:g id="POSITION">%2$d</xliff:g>"</string>
<string name="accessibility_qs_edit_tile_move" msgid="3108103090006972938">"Flyt <xliff:g id="TILE_NAME">%1$s</xliff:g> til position <xliff:g id="POSITION">%2$d</xliff:g>"</string>
<string name="accessibility_desc_quick_settings_edit" msgid="8073587401747016103">"Redigeringsværktøj for Hurtige indstillinger."</string>
- <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-underretning: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+ <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-notifikation: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Appen fungerer muligvis ikke i opdelt skærm."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Appen understøtter ikke opdelt skærm."</string>
<string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Appen fungerer muligvis ikke på sekundære skærme."</string>
@@ -828,7 +828,7 @@
<string name="tuner_right" msgid="6222734772467850156">"Højre"</string>
<string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
<string name="tuner_app" msgid="3507057938640108777">"Appen <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikationer"</string>
<string name="notification_channel_battery" msgid="5786118169182888462">"Batteri"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Generelle meddelelser"</string>
@@ -852,7 +852,7 @@
<string name="qs_dnd_keep" msgid="1825009164681928736">"Behold"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Erstat"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps, der kører i baggrunden"</string>
- <string name="running_foreground_services_msg" msgid="6326247670075574355">"Tryk for at se oplysninger om batteri- og dataforbrug"</string>
+ <string name="running_foreground_services_msg" msgid="6326247670075574355">"Tryk for at se info om batteri- og dataforbrug"</string>
<string name="mobile_data_disable_title" msgid="1068272097382942231">"Vil du deaktivere mobildata?"</string>
<string name="mobile_data_disable_message" msgid="4756541658791493506">"Du vil ikke have data- eller internetadgang via <xliff:g id="CARRIER">%s</xliff:g>. Der vil kunne være adgang til internettet via Wi-Fi."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"dit mobilselskab"</string>
@@ -876,7 +876,7 @@
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps anvender enhedens <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
<string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Luk"</string>
- <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se oplysninger"</string>
+ <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se info"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_separator" msgid="6854860652480837439">", "</string>
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Deaktiver sensorer"</string>
<string name="device_services" msgid="1191212554435440592">"Enhedstjenester"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Ingen titel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 447f8b9b840c..0be730abcd9d 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -894,6 +894,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensoren aus"</string>
<string name="device_services" msgid="1191212554435440592">"Gerätedienste"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Kein Titel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 5e2fb036b04b..703bc403c817 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors off"</string>
<string name="device_services" msgid="1191212554435440592">"Device Services"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"No title"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 38915694b3a4..31fd04a32c36 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors off"</string>
<string name="device_services" msgid="1191212554435440592">"Device Services"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"No title"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 5e2fb036b04b..703bc403c817 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors off"</string>
<string name="device_services" msgid="1191212554435440592">"Device Services"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"No title"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 5e2fb036b04b..703bc403c817 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensors off"</string>
<string name="device_services" msgid="1191212554435440592">"Device Services"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"No title"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 9ef6a83b0754..761acf6407b4 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app más</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Se desactivaron los sensores"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"Servicios del dispositivo"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sin título"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index f4e107ddfa4e..0b3ba5da32b0 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensores desactivados"</string>
<string name="device_services" msgid="1191212554435440592">"Servicios del dispositivo"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sin título"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index d8568df45ce0..e3182912a07f 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Andurid on välja lülitatud"</string>
<string name="device_services" msgid="1191212554435440592">"Seadme teenused"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Pealkiri puudub"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index cfdf7a580e9c..5b9f0cfcad40 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sentsoreak desaktibatuta daude"</string>
<string name="device_services" msgid="1191212554435440592">"Gailuetarako zerbitzuak"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Ez du izenik"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index cd92d45cb721..931def7ee582 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Anturit pois päältä"</string>
<string name="device_services" msgid="1191212554435440592">"Laitepalvelut"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Ei nimeä"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 695a6a561466..d1412aafe076 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Capteurs désactivés"</string>
<string name="device_services" msgid="1191212554435440592">"Services de l\'appareil"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sans titre"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index a1a0352a89e7..8ba575bcd3ca 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Capteurs désactivés"</string>
<string name="device_services" msgid="1191212554435440592">"Services pour l\'appareil"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sans titre"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 7f111e8ca4ed..2784567e3797 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Desactivar sensores"</string>
<string name="device_services" msgid="1191212554435440592">"Servizos do dispositivo"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sen título"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 8525094cc1df..f17a7f611fd0 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -889,8 +889,6 @@
<item quantity="other"><xliff:g id="NUM_APPS_1">%d</xliff:g> અન્ય ઍપ</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"સેન્સર બંધ છે"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"ડિવાઇસ સેવાઓ"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"કોઈ શીર્ષક નથી"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index ae12412a6cf0..49d923a2247a 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Érzékelők kikapcsolva"</string>
<string name="device_services" msgid="1191212554435440592">"Eszközszolgáltatások"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Nincs cím"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index ffcc762ccfa1..dc592c526597 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Տվիչներն անջատած են"</string>
<string name="device_services" msgid="1191212554435440592">"Սարքի ծառայություններ"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Անանուն"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index eb99a6cc698c..1b43e658b418 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensor nonaktif"</string>
<string name="device_services" msgid="1191212554435440592">"Layanan Perangkat"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Tanpa judul"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 0040c3c723a7..36b557d83994 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Slökkt á skynjurum"</string>
<string name="device_services" msgid="1191212554435440592">"Tækjaþjónusta"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Enginn titill"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 83956e83f90d..21c259a7588e 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensori disattivati"</string>
<string name="device_services" msgid="1191212554435440592">"Servizi del dispositivo"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Senza titolo"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index f7d52ed16c50..ff88a0db6555 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"センサー OFF"</string>
<string name="device_services" msgid="1191212554435440592">"デバイス サービス"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"タイトルなし"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index a1788fcb551d..41ef3e29888b 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Датчиктер өшірулі"</string>
<string name="device_services" msgid="1191212554435440592">"Құрылғы қызметтері"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Атауы жоқ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 0cbd06c1d89e..5520cb001a23 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"បិទឧបករណ៍​ចាប់សញ្ញា"</string>
<string name="device_services" msgid="1191212554435440592">"សេវាកម្មឧបករណ៍"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"គ្មាន​ចំណងជើង"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 9f46742928dc..f829c12771a0 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -889,8 +889,6 @@
<item quantity="other"><xliff:g id="NUM_APPS_1">%d</xliff:g> ಇತರ ಆ್ಯಪ್‌ಗಳು</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"ಸೆನ್ಸರ್‌ಗಳು ಆಫ್"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"ಸಾಧನ ಸೇವೆಗಳು"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 581ffa9cb1f4..f5168fba251a 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"센서 사용 안함"</string>
<string name="device_services" msgid="1191212554435440592">"기기 서비스"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"제목 없음"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index ba5a0ace7d69..9558c3a52d14 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Сенсорлорду өчүрүү"</string>
<string name="device_services" msgid="1191212554435440592">"Түзмөк кызматтары"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Аталышы жок"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 46cd3f070f8c..5786fb0dda94 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -901,8 +901,6 @@
<item quantity="other">Dar <xliff:g id="NUM_APPS_1">%d</xliff:g> programų</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Jutikliai išjungti"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"Įrenginio paslaugos"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Nėra pavadinimo"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index a1203d503401..cebd91cb49fc 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -896,6 +896,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensori izslēgti"</string>
<string name="device_services" msgid="1191212554435440592">"Ierīces pakalpojumi"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Nav nosaukuma"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index a3fd2d5fb8bd..df1bdbb664f2 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Сензорите се исклучени"</string>
<string name="device_services" msgid="1191212554435440592">"Услуги за уредот"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Без наслов"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index f3075b8cc5dd..5800e0ee1eae 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"സെൻസറുകൾ ഓഫാണ്"</string>
<string name="device_services" msgid="1191212554435440592">"ഉപകരണ സേവനങ്ങള്‍"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"പേരില്ല"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 723689365fe3..e96865ee24f2 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Мэдрэгчийг унтраах"</string>
<string name="device_services" msgid="1191212554435440592">"Төхөөрөмжийн үйлчилгээ"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Гарчиггүй"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 59e481ccc6fc..6022a9c2546b 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -889,8 +889,6 @@
<item quantity="other">इतर <xliff:g id="NUM_APPS_1">%d</xliff:g> अ‍ॅप्स</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"सेन्सर बंद आहेत"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"डिव्हाइस सेवा"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"शीर्षक नाही"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index e77771d23508..1a9eb1c3a849 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Penderia dimatikan"</string>
<string name="device_services" msgid="1191212554435440592">"Perkhidmatan Peranti"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Tiada tajuk"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index e5561e81daf6..dbfa01ecce38 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"အာရုံခံကိရိယာများ ပိတ်ထားသည်"</string>
<string name="device_services" msgid="1191212554435440592">"စက်ပစ္စည်းဝန်ဆောင်မှုများ"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"ခေါင်းစဉ် မရှိပါ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index a1a12bdfacee..e79068436839 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensorer er av"</string>
<string name="device_services" msgid="1191212554435440592">"Enhetstjenester"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Ingen tittel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 096db56c74ad..9b4441fa27b1 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> अन्य अनुप्रयोग</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"सेन्सरहरू निष्क्रिय छन्"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"यन्त्रका सेवाहरू"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"शीर्षक छैन"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 3607ff8fff59..e570789da554 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensoren uit"</string>
<string name="device_services" msgid="1191212554435440592">"Apparaatservices"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Geen titel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 5cb98eeae88c..dd260b1fedbb 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g>ଟି ଅନ୍ୟ ଆପ୍‍</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"ସେନ୍ସର୍‍ଗୁଡ଼ିକ ବନ୍ଦ ଅଛି"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"ଡିଭାଇସ୍‍ ସେବାଗୁଡିକ"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3702e2bb8ddf..e36fea21f937 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -889,8 +889,6 @@
<item quantity="other"><xliff:g id="NUM_APPS_1">%d</xliff:g> ਹੋਰ ਐਪਾਂ</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"ਸੈਂਸਰ ਬੰਦ ਕਰੋ"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"ਡੀਵਾਈਸ ਸੇਵਾਵਾਂ"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 4ece82c79e29..ed2902fa848e 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -901,8 +901,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> inna aplikacja</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Wyłącz czujniki"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"Usługi urządzenia"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Bez tytułu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 375f5e8f94d2..c1858fc938e6 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> outra aplicação</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensores desativados"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"Serviços do dispositivo"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Sem título"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 24254f67eccd..c393bdeb9d23 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -896,6 +896,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Senzori dezactivați"</string>
<string name="device_services" msgid="1191212554435440592">"Servicii pentru dispozitiv"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Fără titlu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index a5d40598047b..e643c8f026f8 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -902,6 +902,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Датчики отключены"</string>
<string name="device_services" msgid="1191212554435440592">"Сервисы устройства"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Без названия"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d9ba8de2240f..bcc444f39157 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -901,8 +901,6 @@
<item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ďalšia aplikácia</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Senzory sú vypnuté"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"Služby zariadenia"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Bez názvu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 50482272c0c1..706e7002a749 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -902,6 +902,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Izklop za tipala"</string>
<string name="device_services" msgid="1191212554435440592">"Storitve naprave"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Brez naslova"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 22ffa812d3e9..3c8c3abef06a 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -800,7 +800,7 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimera"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Stäng"</string>
<string name="pip_phone_settings" msgid="8080777499521528521">"Inställningar"</string>
- <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Tryck och dra nedåt för att avvisa"</string>
+ <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Tryck och dra nedåt för att ta bort"</string>
<string name="pip_menu_title" msgid="4707292089961887657">"Meny"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> visas i bild-i-bild"</string>
<string name="pip_notification_message" msgid="5619512781514343311">"Om du inte vill att den här funktionen används i <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensorer har inaktiverats"</string>
<string name="device_services" msgid="1191212554435440592">"Enhetstjänster"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Ingen titel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index a35c78c9da6a..f75cc4dec1b6 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one">வேறு <xliff:g id="NUM_APPS_0">%d</xliff:g> ஆப்ஸ்</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"சென்சார்களை ஆஃப் செய்தல்"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"சாதன சேவைகள்"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"தலைப்பு இல்லை"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index e7eafbe7595b..894263ebf5bb 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -889,8 +889,6 @@
<item quantity="one">మరో <xliff:g id="NUM_APPS_0">%d</xliff:g> యాప్</item>
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"సెన్సార్‌లు ఆఫ్"</string>
- <!-- no translation found for device_services (1191212554435440592) -->
- <skip />
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="device_services" msgid="1191212554435440592">"పరికర సేవలు"</string>
+ <string name="music_controls_no_title" msgid="5236895307087002011">"శీర్షిక లేదు"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 05df7bd2aa06..ae581aca2325 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"เซ็นเซอร์ปิดอยู่"</string>
<string name="device_services" msgid="1191212554435440592">"บริการของอุปกรณ์"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"ไม่มีชื่อ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 3bd6ea6708dd..ab20ff0780ea 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Naka-off ang mga sensor"</string>
<string name="device_services" msgid="1191212554435440592">"Mga Serbisyo ng Device"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Walang pamagat"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 4962b167b5d0..32201fb6054b 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensörler kapalı"</string>
<string name="device_services" msgid="1191212554435440592">"Cihaz Hizmetleri"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Başlıksız"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 3a59029f15e1..ee9da5e923d6 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"سینسرز آف ہیں"</string>
<string name="device_services" msgid="1191212554435440592">"آلہ کی سروس"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"کوئی عنوان نہیں ہے"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 3388bcb63561..488bfaed333c 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensorlar nofaol"</string>
<string name="device_services" msgid="1191212554435440592">"Qurilma xizmatlari"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Nomsiz"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 3ebb8dd667cb..125eb727b903 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -890,6 +890,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"Tắt cảm biến"</string>
<string name="device_services" msgid="1191212554435440592">"Dịch vụ cho thiết bị"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"Không có tiêu đề"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 31ac8b3b688b..339fdafc69cf 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -896,6 +896,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"已关闭传感器"</string>
<string name="device_services" msgid="1191212554435440592">"设备服务"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"无标题"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index e3478285ae31..87383891e335 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -896,6 +896,5 @@
</plurals>
<string name="sensor_privacy_mode" msgid="8982771253020769598">"已關閉感應器"</string>
<string name="device_services" msgid="1191212554435440592">"裝置服務"</string>
- <!-- no translation found for music_controls_no_title (5236895307087002011) -->
- <skip />
+ <string name="music_controls_no_title" msgid="5236895307087002011">"無標題"</string>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 2c7f449d9fbb..c3813a17e005 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -106,7 +106,7 @@
<!-- The default tiles to display in QuickSettings -->
<string name="quick_settings_tiles_default" translatable="false">
- wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast
+ wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast,sensorprivacy
</string>
<!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
@@ -512,6 +512,15 @@
better (narrower) line-break for a double-line smart reply button. -->
<integer name="config_smart_replies_in_notifications_max_squeeze_remeasure_attempts">3</integer>
+ <!-- Smart replies in notifications: Whether by default tapping on a choice should let the user
+ edit the input before it is sent to the app. Developers can override this via
+ RemoteInput.Builder.setEditChoicesBeforeSending. -->
+ <bool name="config_smart_replies_in_notifications_edit_choices_before_sending">false</bool>
+
+ <!-- Smart replies in notifications: Whether smart suggestions in notifications are enabled in
+ heads-up notifications. -->
+ <bool name="config_smart_replies_in_notifications_show_in_heads_up">true</bool>
+
<!-- Screenshot editing default activity. Must handle ACTION_EDIT image/png intents.
Blank sends the user to the Chooser first.
This name is in the ComponentName flattened format (package/class) -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index f413508bd242..5eb9ecc35457 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -66,9 +66,7 @@
<item name="status_bar_icon_scale_factor" format="float" type="dimen">1.0</item>
<dimen name="group_overflow_number_size">@*android:dimen/notification_text_size</dimen>
- <dimen name="group_overflow_number_size_dark">16sp</dimen>
<dimen name="group_overflow_number_padding">@*android:dimen/notification_content_margin_end</dimen>
- <dimen name="group_overflow_number_extra_padding_dark">@*android:dimen/notification_extra_margin_ambient</dimen>
<!-- max height of a notification such that the content can still fade out when closing -->
<dimen name="max_notification_fadeout_height">100dp</dimen>
@@ -94,9 +92,6 @@
<!-- Height of a large notification in the status bar -->
<dimen name="notification_max_height">294dp</dimen>
- <!-- Height of an ambient notification on ambient display -->
- <dimen name="notification_ambient_height">400dp</dimen>
-
<!-- Height of a heads up notification in the status bar for legacy custom views -->
<dimen name="notification_max_heads_up_height_legacy">128dp</dimen>
@@ -952,6 +947,8 @@
<dimen name="ongoing_appops_dialog_icon_margin">8dp</dimen>
<!-- Height and width of Application icons in Ongoing App Ops dialog -->
<dimen name="ongoing_appops_dialog_app_icon_size">32dp</dimen>
+ <!-- Height and width of Plus sign in Ongoing App Ops dialog -->
+ <dimen name="ongoing_appops_dialog_app_plus_size">24dp</dimen>
<!-- Height of line in Ongoing App Ops dialog-->
<dimen name="ongoing_appops_dialog_line_height">48dp</dimen>
<!-- Side margin of title in Ongoing App Ops dialog -->
@@ -981,14 +978,16 @@
<!-- How much a bubble is elevated -->
<dimen name="bubble_elevation">8dp</dimen>
+ <!-- Padding around a collapsed bubble -->
+ <dimen name="bubble_view_padding">0dp</dimen>
<!-- Padding between bubbles when displayed in expanded state -->
<dimen name="bubble_padding">8dp</dimen>
- <!-- Padding around the view displayed when the bubble is expanded -->
- <dimen name="bubble_expanded_view_padding">8dp</dimen>
<!-- Size of the collapsed bubble -->
<dimen name="bubble_size">56dp</dimen>
- <!-- Size of an icon displayed within the bubble -->
- <dimen name="bubble_icon_size">24dp</dimen>
+ <!-- How much to inset the icon in the circle -->
+ <dimen name="bubble_icon_inset">16dp</dimen>
+ <!-- Padding around the view displayed when the bubble is expanded -->
+ <dimen name="bubble_expanded_view_padding">8dp</dimen>
<!-- Default height of the expanded view shown when the bubble is expanded -->
<dimen name="bubble_expanded_default_height">400dp</dimen>
<!-- Height of the triangle that points to the expanded bubble -->
@@ -997,4 +996,14 @@
<dimen name="bubble_pointer_width">6dp</dimen>
<!-- Extra padding around the dismiss target for bubbles -->
<dimen name="bubble_dismiss_slop">16dp</dimen>
+ <!-- Height of the header within the expanded view. -->
+ <dimen name="bubble_expanded_header_height">48dp</dimen>
+ <!-- Left and right padding applied to the header. -->
+ <dimen name="bubble_expanded_header_horizontal_padding">24dp</dimen>
+ <!-- Max width of the message bubble-->
+ <dimen name="bubble_message_max_width">144dp</dimen>
+ <!-- Min width of the message bubble -->
+ <dimen name="bubble_message_min_width">32dp</dimen>
+ <!-- Interior padding of the message bubble -->
+ <dimen name="bubble_message_padding">4dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index dac20b588dd0..bd34beac7fd6 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -102,12 +102,20 @@
<item type="id" name="action_snooze_assistant_suggestion_1"/>
<item type="id" name="action_snooze"/>
- <!-- For StatusBarIconContainer to tag its icon views -->
+ <!-- For StatusIconContainer to tag its icon views -->
<item type="id" name="status_bar_view_state_tag" />
<item type="id" name="display_cutout" />
<!-- Optional cancel button on Keyguard -->
<item type="id" name="cancel_button"/>
+
+ <!-- AodMaskView transition tag -->
+ <item type="id" name="aod_mask_transition_progress_tag" />
+ <item type="id" name="aod_mask_transition_progress_end_tag" />
+ <item type="id" name="aod_mask_transition_progress_start_tag" />
+
+ <!-- Global Actions Menu -->
+ <item type="id" name="global_actions_view" />
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 8a5a69b61a43..fa675b75d85d 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -64,48 +64,16 @@
<item name="hybridNotificationTextStyle">@style/hybrid_notification_text</item>
</style>
- <style name="HybridNotification.Ambient">
- <item name="hybridNotificationStyle">@style/hybrid_notification_ambient</item>
- <item name="hybridNotificationTitleStyle">@style/hybrid_notification_title_ambient</item>
- <item name="hybridNotificationTextStyle">@style/hybrid_notification_text_ambient</item>
- </style>
-
- <style name="hybrid_notification_ambient">
- <item name="android:paddingStart">@*android:dimen/notification_extra_margin_ambient</item>
- <item name="android:paddingEnd">@*android:dimen/notification_extra_margin_ambient</item>
- <item name="android:orientation">vertical</item>
- </style>
-
<style name="hybrid_notification">
<item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item>
<item name="android:paddingEnd">12dp</item>
</style>
- <style name="hybrid_notification_title_ambient">
- <item name="android:layout_marginTop">@*android:dimen/notification_header_margin_top_ambient</item>
- <item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item>
- <item name="android:paddingEnd">@*android:dimen/notification_content_margin_end</item>
- <item name="android:textAppearance">@*android:style/Notification.Header.Ambient</item>
- <item name="android:layout_gravity">top|center_horizontal</item>
- <item name="android:textSize">@*android:dimen/notification_ambient_title_text_size</item>
- <item name="android:textColor">#ffffffff</item>
- </style>
-
<style name="hybrid_notification_title">
<item name="android:paddingEnd">4dp</item>
<item name="android:textAppearance">@*android:style/TextAppearance.Material.Notification.Title</item>
</style>
- <style name="hybrid_notification_text_ambient">
- <item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item>
- <item name="android:paddingEnd">@*android:dimen/notification_content_margin_end</item>
- <item name="android:textSize">@*android:dimen/notification_ambient_text_size</item>
- <item name="android:textColor">#eeffffff</item>
- <item name="android:gravity">top|center_horizontal</item>
- <item name="android:ellipsize">end</item>
- <item name="android:maxLines">3</item>
- </style>
-
<style name="hybrid_notification_text"
parent="@*android:style/Widget.Material.Notification.Text">
<item name="android:paddingEnd">4dp</item>
@@ -125,7 +93,7 @@
<style name="TextAppearance.StatusBar.Clock" parent="@*android:style/TextAppearance.StatusBar.Icon">
<item name="android:textSize">@dimen/status_bar_clock_size</item>
- <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
<item name="android:textColor">@color/status_bar_clock_color</item>
</style>
@@ -265,6 +233,10 @@
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
</style>
+ <style name="TextAppearance.DeviceManagementDialog.Title" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle">
+ <item name="android:gravity">center</item>
+ </style>
+
<style name="BaseBrightnessDialogContainer" parent="@style/Theme.SystemUI">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
index 523720d54eec..1a684a0ffb8f 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
@@ -323,7 +323,7 @@ public class PluginInstanceManager<T extends Plugin> {
return null;
}
// Create our own ClassLoader so we can use our own code as the parent.
- ClassLoader classLoader = mManager.getClassLoader(info.sourceDir, info.packageName);
+ ClassLoader classLoader = mManager.getClassLoader(info);
Context pluginContext = new PluginContextWrapper(
mContext.createApplicationContext(info, 0), classLoader);
Class<?> pluginClass = Class.forName(cls, true, classLoader);
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java
index da143f9bcbe3..7139708b65b9 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java
@@ -14,6 +14,7 @@
package com.android.systemui.shared.plugins;
+import android.app.LoadedApk;
import android.app.Notification;
import android.app.Notification.Action;
import android.app.NotificationManager;
@@ -44,15 +45,17 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.annotations.ProvidesInterface;
-import com.android.systemui.shared.plugins.PluginInstanceManager.PluginContextWrapper;
import com.android.systemui.shared.plugins.PluginInstanceManager.PluginInfo;
import dalvik.system.PathClassLoader;
+import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
/**
* @see Plugin
@@ -117,6 +120,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
return mPluginEnabler;
}
+ // TODO(mankoff): This appears to be only called from tests. Remove?
public <T extends Plugin> T getOneShotPlugin(Class<T> cls) {
ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class);
if (info == null) {
@@ -282,17 +286,25 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
}
}
- public ClassLoader getClassLoader(String sourceDir, String pkg) {
- if (!isDebuggable && !mWhitelistedPlugins.contains(pkg)) {
- Log.w(TAG, "Cannot get class loader for non-whitelisted plugin. Src:" + sourceDir +
- ", pkg: " + pkg);
+ /** Returns class loader specific for the given plugin. */
+ public ClassLoader getClassLoader(ApplicationInfo appInfo) {
+ if (!isDebuggable && !mWhitelistedPlugins.contains(appInfo.packageName)) {
+ Log.w(TAG, "Cannot get class loader for non-whitelisted plugin. Src:"
+ + appInfo.sourceDir + ", pkg: " + appInfo.packageName);
return null;
}
- if (mClassLoaders.containsKey(pkg)) {
- return mClassLoaders.get(pkg);
+ if (mClassLoaders.containsKey(appInfo.packageName)) {
+ return mClassLoaders.get(appInfo.packageName);
}
- ClassLoader classLoader = new PathClassLoader(sourceDir, getParentClassLoader());
- mClassLoaders.put(pkg, classLoader);
+
+ List<String> zipPaths = new ArrayList<>();
+ List<String> libPaths = new ArrayList<>();
+ LoadedApk.makePaths(null, true, appInfo, zipPaths, libPaths);
+ ClassLoader classLoader = new PathClassLoader(
+ TextUtils.join(File.pathSeparator, zipPaths),
+ TextUtils.join(File.pathSeparator, libPaths),
+ getParentClassLoader());
+ mClassLoaders.put(appInfo.packageName, classLoader);
return classLoader;
}
@@ -309,11 +321,6 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
return mParentClassLoader;
}
- public Context getContext(ApplicationInfo info, String pkg) throws NameNotFoundException {
- ClassLoader classLoader = getClassLoader(info.sourceDir, pkg);
- return new PluginContextWrapper(mContext.createApplicationContext(info, 0), classLoader);
- }
-
public <T> boolean dependsOn(Plugin p, Class<T> cls) {
for (int i = 0; i < mPluginMap.size(); i++) {
if (mPluginMap.valueAt(i).dependsOn(p, cls)) {
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index f3bdbae97e42..078947ca0468 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -76,4 +76,10 @@ interface ISystemUiProxy {
*/
float getWindowCornerRadius() = 10;
+ /**
+ * If device supports live rounded corners on windows.
+ * This might be turned off for performance reasons
+ */
+ boolean supportsRoundedCornersOnWindows() = 11;
+
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
index c0a1d891cd5b..e6acfbe8df53 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
@@ -16,14 +16,10 @@
package com.android.systemui.shared.system;
+import android.graphics.HardwareRenderer;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.view.Surface;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Transaction;
-import android.view.SyncRtSurfaceTransactionApplier;
-import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
-import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewRootImpl;
@@ -31,20 +27,21 @@ import java.util.function.Consumer;
/**
* Helper class to apply surface transactions in sync with RenderThread.
+ *
+ * NOTE: This is a modification of {@link android.view.SyncRtSurfaceTransactionApplier}, we can't
+ * currently reference that class from the shared lib as it is hidden.
*/
public class SyncRtSurfaceTransactionApplierCompat {
- private final SyncRtSurfaceTransactionApplier mApplier;
+ private final Surface mTargetSurface;
+ private final ViewRootImpl mTargetViewRootImpl;
/**
* @param targetView The view in the surface that acts as synchronization anchor.
*/
public SyncRtSurfaceTransactionApplierCompat(View targetView) {
- mApplier = new SyncRtSurfaceTransactionApplier(targetView);
- }
-
- private SyncRtSurfaceTransactionApplierCompat(SyncRtSurfaceTransactionApplier applier) {
- mApplier = applier;
+ mTargetViewRootImpl = targetView != null ? targetView.getViewRootImpl() : null;
+ mTargetSurface = mTargetViewRootImpl != null ? mTargetViewRootImpl.mSurface : null;
}
/**
@@ -53,38 +50,74 @@ public class SyncRtSurfaceTransactionApplierCompat {
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
* this method to avoid synchronization issues.
*/
- public void scheduleApply(final SurfaceParams... params) {
- mApplier.scheduleApply(convert(params));
- }
-
- private SyncRtSurfaceTransactionApplier.SurfaceParams[] convert(SurfaceParams[] params) {
- SyncRtSurfaceTransactionApplier.SurfaceParams[] result =
- new SyncRtSurfaceTransactionApplier.SurfaceParams[params.length];
- for (int i = 0; i < params.length; i++) {
- result[i] = params[i].mParams;
+ public void scheduleApply(final SyncRtSurfaceTransactionApplierCompat.SurfaceParams... params) {
+ if (mTargetViewRootImpl == null) {
+ return;
}
- return result;
+ mTargetViewRootImpl.registerRtFrameCallback(new HardwareRenderer.FrameDrawingCallback() {
+ @Override
+ public void onFrameDraw(long frame) {
+ if (mTargetSurface == null || !mTargetSurface.isValid()) {
+ return;
+ }
+ TransactionCompat t = new TransactionCompat();
+ for (int i = params.length - 1; i >= 0; i--) {
+ SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams =
+ params[i];
+ SurfaceControlCompat surface = surfaceParams.surface;
+ t.deferTransactionUntil(surface, mTargetSurface, frame);
+ applyParams(t, surfaceParams);
+ }
+ t.setEarlyWakeup();
+ t.apply();
+ }
+ });
+
+ // Make sure a frame gets scheduled.
+ mTargetViewRootImpl.getView().invalidate();
}
- public static void applyParams(TransactionCompat t, SurfaceParams params) {
- SyncRtSurfaceTransactionApplier.applyParams(t.mTransaction, params.mParams, t.mTmpValues);
+ public static void applyParams(TransactionCompat t,
+ SyncRtSurfaceTransactionApplierCompat.SurfaceParams params) {
+ t.setMatrix(params.surface, params.matrix);
+ t.setWindowCrop(params.surface, params.windowCrop);
+ t.setAlpha(params.surface, params.alpha);
+ t.setLayer(params.surface, params.layer);
+ t.setCornerRadius(params.surface, params.cornerRadius);
+ t.show(params.surface);
}
+ /**
+ * Creates an instance of SyncRtSurfaceTransactionApplier, deferring until the target view is
+ * attached if necessary.
+ */
public static void create(final View targetView,
final Consumer<SyncRtSurfaceTransactionApplierCompat> callback) {
- SyncRtSurfaceTransactionApplier.create(targetView,
- new Consumer<SyncRtSurfaceTransactionApplier>() {
- @Override
- public void accept(SyncRtSurfaceTransactionApplier applier) {
- callback.accept(new SyncRtSurfaceTransactionApplierCompat(applier));
- }
- });
+ if (targetView == null) {
+ // No target view, no applier
+ callback.accept(null);
+ } else if (targetView.getViewRootImpl() != null) {
+ // Already attached, we're good to go
+ callback.accept(new SyncRtSurfaceTransactionApplierCompat(targetView));
+ } else {
+ // Haven't been attached before we can get the view root
+ targetView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(View v) {
+ targetView.removeOnAttachStateChangeListener(this);
+ callback.accept(new SyncRtSurfaceTransactionApplierCompat(targetView));
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View v) {
+ // Do nothing
+ }
+ });
+ }
}
public static class SurfaceParams {
- private final SyncRtSurfaceTransactionApplier.SurfaceParams mParams;
-
/**
* Constructs surface parameters to be applied when the current view state gets pushed to
* RenderThread.
@@ -96,8 +129,19 @@ public class SyncRtSurfaceTransactionApplierCompat {
*/
public SurfaceParams(SurfaceControlCompat surface, float alpha, Matrix matrix,
Rect windowCrop, int layer, float cornerRadius) {
- mParams = new SyncRtSurfaceTransactionApplier.SurfaceParams(surface.mSurfaceControl,
- alpha, matrix, windowCrop, layer, cornerRadius);
+ this.surface = surface;
+ this.alpha = alpha;
+ this.matrix = new Matrix(matrix);
+ this.windowCrop = new Rect(windowCrop);
+ this.layer = layer;
+ this.cornerRadius = cornerRadius;
}
+
+ public final SurfaceControlCompat surface;
+ public final float alpha;
+ final float cornerRadius;
+ public final Matrix matrix;
+ public final Rect windowCrop;
+ public final int layer;
}
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
index 2aba3fa607b7..af32f48936f2 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
@@ -82,6 +82,11 @@ public class TransactionCompat {
return this;
}
+ public TransactionCompat setCornerRadius(SurfaceControlCompat surfaceControl, float radius) {
+ mTransaction.setCornerRadius(surfaceControl.mSurfaceControl, radius);
+ return this;
+ }
+
public TransactionCompat deferTransactionUntil(SurfaceControlCompat surfaceControl,
IBinder handle, long frameNumber) {
mTransaction.deferTransactionUntil(surfaceControl.mSurfaceControl, handle, frameNumber);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
index 2511f74e4ab6..658d9e3593c0 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
@@ -46,6 +46,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
protected View mEcaView;
protected boolean mEnableHaptics;
private boolean mDismissing;
+ protected boolean mResumed;
private CountDownTimer mCountdownTimer = null;
// To avoid accidental lockout due to events while the device in in the pocket, ignore
@@ -264,6 +265,8 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
@Override
public void onPause() {
+ mResumed = false;
+
if (mCountdownTimer != null) {
mCountdownTimer.cancel();
mCountdownTimer = null;
@@ -277,6 +280,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
@Override
public void onResume(int reason) {
+ mResumed = true;
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 570d351a8b71..1aff3949a74b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -1,9 +1,15 @@
package com.android.keyguard;
+import android.content.ContentResolver;
import android.content.Context;
+import android.database.ContentObserver;
import android.graphics.Paint;
import android.graphics.Paint.Style;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
import android.util.AttributeSet;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@@ -12,18 +18,29 @@ import android.widget.TextClock;
import androidx.annotation.VisibleForTesting;
+import com.android.keyguard.clock.BubbleClockController;
+import com.android.keyguard.clock.StretchAnalogClockController;
+import com.android.keyguard.clock.TypeClockController;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.ClockPlugin;
-import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
import java.util.Objects;
import java.util.TimeZone;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* Switch to show plugin clock when plugin is connected, otherwise it will show default clock.
*/
public class KeyguardClockSwitch extends RelativeLayout {
+
+ private LayoutInflater mLayoutInflater;
+
+ private final ContentResolver mContentResolver;
/**
* Optional/alternative clock injected via plugin.
*/
@@ -45,43 +62,48 @@ public class KeyguardClockSwitch extends RelativeLayout {
* or not to show it below the alternate clock.
*/
private View mKeyguardStatusArea;
+ /**
+ * Used to select between plugin or default implementations of ClockPlugin interface.
+ */
+ private Extension<ClockPlugin> mClockExtension;
+ /**
+ * Consumer that accepts the a new ClockPlugin implementation when the Extension reloads.
+ */
+ private final Consumer<ClockPlugin> mClockPluginConsumer = plugin -> setClockPlugin(plugin);
+ /**
+ * Maintain state so that a newly connected plugin can be initialized.
+ */
+ private float mDarkAmount;
- private final PluginListener<ClockPlugin> mClockPluginListener =
- new PluginListener<ClockPlugin>() {
+ private final StatusBarStateController.StateListener mStateListener =
+ new StatusBarStateController.StateListener() {
@Override
- public void onPluginConnected(ClockPlugin plugin, Context pluginContext) {
- disconnectPlugin();
- View smallClockView = plugin.getView();
- if (smallClockView != null) {
- // For now, assume that the most recently connected plugin is the
- // selected clock face. In the future, the user should be able to
- // pick a clock face from the available plugins.
- mSmallClockFrame.addView(smallClockView, -1,
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- initPluginParams();
- mClockView.setVisibility(View.GONE);
- }
- View bigClockView = plugin.getBigClockView();
- if (bigClockView != null && mBigClockContainer != null) {
- mBigClockContainer.addView(bigClockView);
- mBigClockContainer.setVisibility(View.VISIBLE);
+ public void onStateChanged(int newState) {
+ if (mBigClockContainer == null) {
+ return;
}
- if (!plugin.shouldShowStatusArea()) {
- mKeyguardStatusArea.setVisibility(View.GONE);
+ if (newState == StatusBarState.SHADE) {
+ if (mBigClockContainer.getVisibility() == View.VISIBLE) {
+ mBigClockContainer.setVisibility(View.INVISIBLE);
+ }
+ } else {
+ if (mBigClockContainer.getVisibility() == View.INVISIBLE) {
+ mBigClockContainer.setVisibility(View.VISIBLE);
+ }
}
- mClockPlugin = plugin;
}
+ };
+ private final ContentObserver mContentObserver =
+ new ContentObserver(new Handler(Looper.getMainLooper())) {
@Override
- public void onPluginDisconnected(ClockPlugin plugin) {
- if (Objects.equals(plugin, mClockPlugin)) {
- disconnectPlugin();
- mClockView.setVisibility(View.VISIBLE);
- mKeyguardStatusArea.setVisibility(View.VISIBLE);
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ if (mClockExtension != null) {
+ mClockExtension.reload();
}
}
- };
+ };
public KeyguardClockSwitch(Context context) {
this(context, null);
@@ -89,6 +111,15 @@ public class KeyguardClockSwitch extends RelativeLayout {
public KeyguardClockSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
+ mLayoutInflater = LayoutInflater.from(context);
+ mContentResolver = context.getContentResolver();
+ }
+
+ /**
+ * Returns if this view is presenting a custom clock, or the default implementation.
+ */
+ public boolean hasCustomClock() {
+ return mClockPlugin != null;
}
@Override
@@ -102,14 +133,88 @@ public class KeyguardClockSwitch extends RelativeLayout {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- Dependency.get(PluginManager.class).addPluginListener(mClockPluginListener,
- ClockPlugin.class);
+ mClockExtension = Dependency.get(ExtensionController.class).newExtension(ClockPlugin.class)
+ .withPlugin(ClockPlugin.class)
+ .withCallback(mClockPluginConsumer)
+ // Using withDefault even though this isn't the default as a workaround.
+ // ExtensionBulider doesn't provide the ability to supply a ClockPlugin
+ // instance based off of the value of a setting. Since multiple "default"
+ // can be provided, using a supplier that changes the settings value.
+ // A null return will cause Extension#reload to look at the next "default"
+ // supplier.
+ .withDefault(
+ new SettingsGattedSupplier(
+ mContentResolver,
+ Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
+ BubbleClockController.class.getName(),
+ () -> BubbleClockController.build(mLayoutInflater)))
+ .withDefault(
+ new SettingsGattedSupplier(
+ mContentResolver,
+ Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
+ StretchAnalogClockController.class.getName(),
+ () -> StretchAnalogClockController.build(mLayoutInflater)))
+ .withDefault(
+ new SettingsGattedSupplier(
+ mContentResolver,
+ Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
+ TypeClockController.class.getName(),
+ () -> TypeClockController.build(mLayoutInflater)))
+ .build();
+ mContentResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE),
+ false, mContentObserver);
+ Dependency.get(StatusBarStateController.class).addCallback(mStateListener);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- Dependency.get(PluginManager.class).removePluginListener(mClockPluginListener);
+ mClockExtension.destroy();
+ mContentResolver.unregisterContentObserver(mContentObserver);
+ Dependency.get(StatusBarStateController.class).removeCallback(mStateListener);
+ }
+
+ private void setClockPlugin(ClockPlugin plugin) {
+ // Disconnect from existing plugin.
+ if (mClockPlugin != null) {
+ View smallClockView = mClockPlugin.getView();
+ if (smallClockView != null && smallClockView.getParent() == mSmallClockFrame) {
+ mSmallClockFrame.removeView(smallClockView);
+ }
+ if (mBigClockContainer != null) {
+ mBigClockContainer.removeAllViews();
+ mBigClockContainer.setVisibility(View.GONE);
+ }
+ mClockPlugin = null;
+ }
+ if (plugin == null) {
+ mClockView.setVisibility(View.VISIBLE);
+ mKeyguardStatusArea.setVisibility(View.VISIBLE);
+ return;
+ }
+ // Attach small and big clock views to hierarchy.
+ View smallClockView = plugin.getView();
+ if (smallClockView != null) {
+ mSmallClockFrame.addView(smallClockView, -1,
+ new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ mClockView.setVisibility(View.GONE);
+ }
+ View bigClockView = plugin.getBigClockView();
+ if (bigClockView != null && mBigClockContainer != null) {
+ mBigClockContainer.addView(bigClockView);
+ mBigClockContainer.setVisibility(View.VISIBLE);
+ }
+ // Hide default clock.
+ if (!plugin.shouldShowStatusArea()) {
+ mKeyguardStatusArea.setVisibility(View.GONE);
+ }
+ // Initialize plugin parameters.
+ mClockPlugin = plugin;
+ mClockPlugin.setStyle(getPaint().getStyle());
+ mClockPlugin.setTextColor(getCurrentTextColor());
+ mClockPlugin.setDarkAmount(mDarkAmount);
}
/**
@@ -150,10 +255,6 @@ public class KeyguardClockSwitch extends RelativeLayout {
mClockView.setShowCurrentUserTime(showCurrentUserTime);
}
- public void setElegantTextHeight(boolean elegant) {
- mClockView.setElegantTextHeight(elegant);
- }
-
public void setTextSize(int unit, float size) {
mClockView.setTextSize(unit, size);
}
@@ -171,6 +272,7 @@ public class KeyguardClockSwitch extends RelativeLayout {
* @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake.
*/
public void setDarkAmount(float darkAmount) {
+ mDarkAmount = darkAmount;
if (mClockPlugin != null) {
mClockPlugin.setDarkAmount(darkAmount);
}
@@ -210,32 +312,53 @@ public class KeyguardClockSwitch extends RelativeLayout {
}
}
+ @VisibleForTesting (otherwise = VisibleForTesting.NONE)
+ Consumer<ClockPlugin> getClockPluginConsumer() {
+ return mClockPluginConsumer;
+ }
+
+ @VisibleForTesting (otherwise = VisibleForTesting.NONE)
+ StatusBarStateController.StateListener getStateListener() {
+ return mStateListener;
+ }
+
/**
- * When plugin changes, set all kept parameters into newer plugin.
+ * Supplier that only gets an instance when a settings value matches expected value.
*/
- private void initPluginParams() {
- if (mClockPlugin != null) {
- mClockPlugin.setStyle(getPaint().getStyle());
- mClockPlugin.setTextColor(getCurrentTextColor());
- }
- }
+ private static class SettingsGattedSupplier implements Supplier<ClockPlugin> {
- private void disconnectPlugin() {
- if (mClockPlugin != null) {
- View smallClockView = mClockPlugin.getView();
- if (smallClockView != null) {
- mSmallClockFrame.removeView(smallClockView);
- }
- if (mBigClockContainer != null) {
- mBigClockContainer.removeAllViews();
- mBigClockContainer.setVisibility(View.GONE);
- }
- mClockPlugin = null;
+ private final ContentResolver mContentResolver;
+ private final String mKey;
+ private final String mValue;
+ private final Supplier<ClockPlugin> mSupplier;
+
+ /**
+ * Constructs a supplier that changes secure setting key against value.
+ *
+ * @param contentResolver Used to look up settings value.
+ * @param key Settings key.
+ * @param value If the setting matches this values that get supplies a ClockPlugin
+ * instance.
+ * @param supplier Supplier of ClockPlugin instance, only used if the setting
+ * matches value.
+ */
+ SettingsGattedSupplier(ContentResolver contentResolver, String key, String value,
+ Supplier<ClockPlugin> supplier) {
+ mContentResolver = contentResolver;
+ mKey = key;
+ mValue = value;
+ mSupplier = supplier;
}
- }
- @VisibleForTesting (otherwise = VisibleForTesting.NONE)
- PluginListener getClockPluginListener() {
- return mClockPluginListener;
+ /**
+ * Returns null if the settings value doesn't match the expected value.
+ *
+ * A null return causes Extension#reload to skip this supplier and move to the next.
+ */
+ @Override
+ public ClockPlugin get() {
+ final String currentValue = Settings.Secure.getString(mContentResolver, mKey);
+ return Objects.equals(currentValue, mValue) ? mSupplier.get() : null;
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index 41afa9a21128..64c5b1754fa8 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -18,6 +18,7 @@ package com.android.keyguard;
import android.content.Context;
import android.graphics.Rect;
+import android.os.UserHandle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
@@ -79,8 +80,14 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView
@Override
protected void resetState() {
+ mPasswordEntry.setTextOperationUser(UserHandle.of(KeyguardUpdateMonitor.getCurrentUser()));
mSecurityMessageDisplay.setMessage("");
final boolean wasDisabled = mPasswordEntry.isEnabled();
+ // Don't set enabled password entry & showSoftInput when PasswordEntry is invisible or in
+ // pausing stage.
+ if (!mResumed || !mPasswordEntry.isVisibleToUser()) {
+ return;
+ }
setPasswordEntryEnabled(true);
setPasswordEntryInputEnabled(true);
if (wasDisabled) {
@@ -169,6 +176,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView
Context.INPUT_METHOD_SERVICE);
mPasswordEntry = findViewById(getPasswordTextViewId());
+ mPasswordEntry.setTextOperationUser(UserHandle.of(KeyguardUpdateMonitor.getCurrentUser()));
mPasswordEntryDisabler = new TextViewInputDisabler(mPasswordEntry);
mPasswordEntry.setKeyListener(TextKeyListener.getInstance());
mPasswordEntry.setInputType(InputType.TYPE_CLASS_TEXT
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 669e6fff525b..bac7844c024b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -90,7 +90,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
*/
private Runnable mContentChangeListener;
private Slice mSlice;
- private boolean mPulsing;
+ private boolean mHasHeader;
public KeyguardSliceView(Context context) {
this(context, null, 0);
@@ -150,10 +150,18 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
Dependency.get(ConfigurationController.class).removeCallback(this);
}
+ /**
+ * Returns whether the current visible slice has a title/header.
+ */
+ public boolean hasHeader() {
+ return mHasHeader;
+ }
+
private void showSlice() {
Trace.beginSection("KeyguardSliceView#showSlice");
- if (mPulsing || mSlice == null) {
+ if (mSlice == null) {
mRow.setVisibility(GONE);
+ mHasHeader = false;
if (mContentChangeListener != null) {
mContentChangeListener.run();
}
@@ -162,7 +170,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
ListContent lc = new ListContent(getContext(), mSlice);
SliceContent headerContent = lc.getHeader();
- boolean hasHeader = headerContent != null
+ mHasHeader = headerContent != null
&& !headerContent.getSliceItem().hasHint(HINT_LIST_ITEM);
List<SliceContent> subItems = new ArrayList<>();
for (int i = 0; i < lc.getRowItems().size(); i++) {
@@ -177,7 +185,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
mClickActions.clear();
final int subItemsCount = subItems.size();
final int blendedColor = getTextColor();
- final int startIndex = hasHeader ? 1 : 0; // First item is header; skip it
+ final int startIndex = mHasHeader ? 1 : 0; // First item is header; skip it
mRow.setVisibility(subItemsCount > 0 ? VISIBLE : GONE);
for (int i = startIndex; i < subItemsCount; i++) {
RowContent rc = (RowContent) subItems.get(i);
@@ -189,7 +197,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
button = new KeyguardSliceButton(mContext);
button.setTextColor(blendedColor);
button.setTag(itemTag);
- final int viewIndex = i - (hasHeader ? 1 : 0);
+ final int viewIndex = i - (mHasHeader ? 1 : 0);
mRow.addView(button, viewIndex);
}
@@ -234,18 +242,6 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
Trace.endSection();
}
- public void setPulsing(boolean pulsing, boolean animate) {
- mPulsing = pulsing;
- LayoutTransition transition = getLayoutTransition();
- if (!animate) {
- setLayoutTransition(null);
- }
- showSlice();
- if (!animate) {
- setLayoutTransition(transition);
- }
- }
-
public void setDarkAmount(float darkAmount) {
mDarkAmount = darkAmount;
mRow.setDarkAmount(darkAmount);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index c6f172684686..bb549ada6830 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -72,7 +72,6 @@ public class KeyguardStatusView extends GridLayout implements
private ArraySet<View> mVisibleInDoze;
private boolean mPulsing;
- private boolean mWasPulsing;
private float mDarkAmount = 0;
private int mTextColor;
private int mLastLayoutHeight;
@@ -141,6 +140,13 @@ public class KeyguardStatusView extends GridLayout implements
onDensityOrFontScaleChanged();
}
+ /**
+ * If we're presenting a custom clock of just the default one.
+ */
+ public boolean hasCustomClock() {
+ return mClockView.hasCustomClock();
+ }
+
private void setEnableMarquee(boolean enabled) {
if (DEBUG) Log.v(TAG, "Schedule setEnableMarquee: " + (enabled ? "Enable" : "Disable"));
if (enabled) {
@@ -195,10 +201,6 @@ public class KeyguardStatusView extends GridLayout implements
updateOwnerInfo();
updateLogoutView();
updateDark();
-
- // Disable elegant text height because our fancy colon makes the ymin value huge for no
- // reason.
- mClockView.setElegantTextHeight(false);
}
/**
@@ -207,7 +209,7 @@ public class KeyguardStatusView extends GridLayout implements
private void onSliceContentChanged() {
LinearLayout.LayoutParams layoutParams =
(LinearLayout.LayoutParams) mClockView.getLayoutParams();
- layoutParams.bottomMargin = mPulsing ? mSmallClockPadding : 0;
+ layoutParams.bottomMargin = mKeyguardSlice.hasHeader() ? mSmallClockPadding : 0;
mClockView.setLayoutParams(layoutParams);
}
@@ -217,16 +219,16 @@ public class KeyguardStatusView extends GridLayout implements
@Override
public void onLayoutChange(View view, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
- int heightOffset = mPulsing || mWasPulsing ? 0 : getHeight() - mLastLayoutHeight;
+ boolean smallClock = mKeyguardSlice.hasHeader();
+ int heightOffset = smallClock ? 0 : getHeight() - mLastLayoutHeight;
long duration = KeyguardSliceView.DEFAULT_ANIM_DURATION;
- long delay = mPulsing || mWasPulsing ? 0 : duration / 4;
- mWasPulsing = false;
+ long delay = smallClock ? 0 : duration / 4;
boolean shouldAnimate = mKeyguardSlice.getLayoutTransition() != null
&& mKeyguardSlice.getLayoutTransition().isRunning();
if (view == mClockView) {
- float clockScale = mPulsing ? mSmallClockScale : 1;
- Paint.Style style = mPulsing ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL;
+ float clockScale = smallClock ? mSmallClockScale : 1;
+ Paint.Style style = smallClock ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL;
mClockView.animate().cancel();
if (shouldAnimate) {
mClockView.setY(oldTop + heightOffset);
@@ -431,15 +433,11 @@ public class KeyguardStatusView extends GridLayout implements
}
}
- public void setPulsing(boolean pulsing, boolean animate) {
+ public void setPulsing(boolean pulsing) {
if (mPulsing == pulsing) {
return;
}
- if (mPulsing) {
- mWasPulsing = true;
- }
mPulsing = pulsing;
- mKeyguardSlice.setPulsing(pulsing, animate);
updateDozeVisibleViews();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java
new file mode 100644
index 000000000000..db6127f1d573
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.graphics.Paint.Style;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextClock;
+
+import com.android.keyguard.R;
+import com.android.systemui.plugins.ClockPlugin;
+
+import java.util.TimeZone;
+
+/**
+ * Controller for Bubble clock that can appear on lock screen and AOD.
+ */
+public class BubbleClockController implements ClockPlugin {
+
+ /**
+ * Custom clock shown on AOD screen and behind stack scroller on lock.
+ */
+ private View mView;
+ private TextClock mDigitalClock;
+ private ImageClock mAnalogClock;
+
+ /**
+ * Small clock shown on lock screen above stack scroller.
+ */
+ private View mLockClockContainer;
+ private TextClock mLockClock;
+
+ /**
+ * Controller for transition to dark state.
+ */
+ private CrossFadeDarkController mDarkController;
+
+ private BubbleClockController() { }
+
+ /**
+ * Create a BubbleClockController instance.
+ *
+ * @param layoutInflater Inflater used to inflate custom clock views.
+ */
+ public static BubbleClockController build(LayoutInflater layoutInflater) {
+ BubbleClockController controller = new BubbleClockController();
+ controller.createViews(layoutInflater);
+ return controller;
+ }
+
+ private void createViews(LayoutInflater layoutInflater) {
+ mView = layoutInflater.inflate(R.layout.bubble_clock, null);
+ mDigitalClock = (TextClock) mView.findViewById(R.id.digital_clock);
+ mAnalogClock = (ImageClock) mView.findViewById(R.id.analog_clock);
+
+ mLockClockContainer = layoutInflater.inflate(R.layout.digital_clock, null);
+ mLockClock = (TextClock) mLockClockContainer.findViewById(R.id.lock_screen_clock);
+ mLockClock.setVisibility(View.GONE);
+
+ mDarkController = new CrossFadeDarkController(mDigitalClock, mLockClock);
+ }
+
+ @Override
+ public View getView() {
+ return mLockClockContainer;
+ }
+
+ @Override
+ public View getBigClockView() {
+ return mView;
+ }
+
+ @Override
+ public void setStyle(Style style) {}
+
+ @Override
+ public void setTextColor(int color) {
+ mLockClock.setTextColor(color);
+ mDigitalClock.setTextColor(color);
+ }
+
+ @Override
+ public void dozeTimeTick() {
+ mAnalogClock.onTimeChanged();
+ }
+
+ @Override
+ public void setDarkAmount(float darkAmount) {
+ mDarkController.setDarkAmount(darkAmount);
+ }
+
+ @Override
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mAnalogClock.onTimeZoneChanged(timeZone);
+ }
+
+ @Override
+ public boolean shouldShowStatusArea() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java
new file mode 100644
index 000000000000..3591dc82c8ec
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.android.keyguard.R;
+
+/**
+ * Positions clock faces (analog, digital, typographic) and handles pixel shifting
+ * to prevent screen burn-in.
+ */
+public class ClockLayout extends FrameLayout {
+
+ /**
+ * Clock face views.
+ */
+ private View mDigitalClock;
+ private View mAnalogClock;
+ private View mTypeClock;
+
+ /**
+ * Pixel shifting amplitidues used to prevent screen burn-in.
+ */
+ private int mBurnInPreventionOffsetX;
+ private int mBurnInPreventionOffsetY;
+
+ public ClockLayout(Context context) {
+ this(context, null);
+ }
+
+ public ClockLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ClockLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mDigitalClock = findViewById(R.id.digital_clock);
+ mAnalogClock = findViewById(R.id.analog_clock);
+ mTypeClock = findViewById(R.id.type_clock);
+
+ // Get pixel shifting X, Y amplitudes from resources.
+ Resources resources = getResources();
+ mBurnInPreventionOffsetX = resources.getDimensionPixelSize(
+ R.dimen.burn_in_prevention_offset_x);
+ mBurnInPreventionOffsetY = resources.getDimensionPixelSize(
+ R.dimen.burn_in_prevention_offset_y);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+
+ final float offsetX = getBurnInOffset(mBurnInPreventionOffsetX, true);
+ final float offsetY = getBurnInOffset(mBurnInPreventionOffsetY, false);
+
+ // Put digital clock in two left corner of the screen.
+ if (mDigitalClock != null) {
+ mDigitalClock.setX(0.1f * getWidth() + offsetX);
+ mDigitalClock.setY(0.1f * getHeight() + offsetY);
+ }
+
+ // Put the analog clock in the middle of the screen.
+ if (mAnalogClock != null) {
+ mAnalogClock.setX(Math.max(0f, 0.5f * (getWidth() - mAnalogClock.getWidth()))
+ + offsetX);
+ mAnalogClock.setY(Math.max(0f, 0.5f * (getHeight() - mAnalogClock.getHeight()))
+ + offsetY);
+ }
+
+ // Put the typographic clock part way down the screen.
+ if (mTypeClock != null) {
+ mTypeClock.setX(offsetX);
+ mTypeClock.setY(0.2f * getHeight() + offsetY);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/CrossFadeDarkController.java b/packages/SystemUI/src/com/android/keyguard/clock/CrossFadeDarkController.java
new file mode 100644
index 000000000000..3c3f4759614b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/CrossFadeDarkController.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.view.View;
+
+/**
+ * Controls transition to dark state by cross fading between views.
+ */
+final class CrossFadeDarkController {
+
+ private final View mFadeInView;
+ private final View mFadeOutView;
+
+ /**
+ * Creates a new controller that fades between views.
+ *
+ * @param fadeInView View to fade in when transitioning to AOD.
+ * @param fadeOutView View to fade out when transitioning to AOD.
+ */
+ CrossFadeDarkController(View fadeInView, View fadeOutView) {
+ mFadeInView = fadeInView;
+ mFadeOutView = fadeOutView;
+ }
+
+ /**
+ * Sets the amount the system has transitioned to the dark state.
+ *
+ * @param darkAmount Amount of transition to dark state: 1f for AOD and 0f for lock screen.
+ */
+ void setDarkAmount(float darkAmount) {
+ mFadeInView.setAlpha(Math.max(0f, 2f * darkAmount - 1f));
+ if (darkAmount == 0f) {
+ mFadeInView.setVisibility(View.GONE);
+ } else {
+ if (mFadeInView.getVisibility() == View.GONE) {
+ mFadeInView.setVisibility(View.VISIBLE);
+ }
+ }
+ mFadeOutView.setAlpha(Math.max(0f, 1f - 2f * darkAmount));
+ if (darkAmount == 1f) {
+ mFadeOutView.setVisibility(View.GONE);
+ } else {
+ if (mFadeOutView.getVisibility() == View.GONE) {
+ mFadeOutView.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ImageClock.java b/packages/SystemUI/src/com/android/keyguard/clock/ImageClock.java
new file mode 100644
index 000000000000..2c709e0393bd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ImageClock.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.content.Context;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import com.android.keyguard.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+/**
+ * Clock composed of two images that rotate with the time.
+ *
+ * The images are the clock hands. ImageClock expects two child ImageViews
+ * with ids hour_hand and minute_hand.
+ */
+public class ImageClock extends FrameLayout {
+
+ private ImageView mHourHand;
+ private ImageView mMinuteHand;
+ private Calendar mTime;
+ private String mDescFormat;
+ private TimeZone mTimeZone;
+
+ public ImageClock(Context context) {
+ this(context, null);
+ }
+
+ public ImageClock(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ImageClock(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mTime = Calendar.getInstance();
+ mDescFormat = ((SimpleDateFormat) DateFormat.getTimeFormat(context)).toLocalizedPattern();
+ }
+
+ /**
+ * Call when the time changes to update the rotation of the clock hands.
+ */
+ public void onTimeChanged() {
+ mTime.setTimeInMillis(System.currentTimeMillis());
+ final float hourAngle = mTime.get(Calendar.HOUR) * 30f;
+ mHourHand.setRotation(hourAngle);
+ final float minuteAngle = mTime.get(Calendar.MINUTE) * 6f;
+ mMinuteHand.setRotation(minuteAngle);
+ setContentDescription(DateFormat.format(mDescFormat, mTime));
+ invalidate();
+ }
+
+ /**
+ * Call when the time zone has changed to update clock hands.
+ *
+ * @param timeZone The updated time zone that will be used.
+ */
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mTimeZone = timeZone;
+ mTime.setTimeZone(timeZone);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mHourHand = findViewById(R.id.hour_hand);
+ mMinuteHand = findViewById(R.id.minute_hand);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mTime = Calendar.getInstance(mTimeZone != null ? mTimeZone : TimeZone.getDefault());
+ onTimeChanged();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClock.java b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClock.java
new file mode 100644
index 000000000000..8734754541a6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClock.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.View;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+
+/**
+ * Analog clock where the minute hand extends off of the screen.
+ */
+public class StretchAnalogClock extends View {
+
+ private static final int DEFAULT_COLOR = Color.parseColor("#F5C983");
+ private static final float HOUR_STROKE_WIDTH = 60f;
+ private static final float MINUTE_STROKE_WIDTH = 20f;
+ private static final float CENTER_GAP_AND_CIRCLE_RADIUS = 80f;
+
+ private final Paint mHourPaint = new Paint();
+ private final Paint mMinutePaint = new Paint();
+ private Calendar mTime;
+ private TimeZone mTimeZone;
+
+ public StretchAnalogClock(Context context) {
+ this(context, null);
+ }
+
+ public StretchAnalogClock(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public StretchAnalogClock(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public StretchAnalogClock(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ /**
+ * Call when the time changes to update the clock hands.
+ */
+ public void onTimeChanged() {
+ mTime.setTimeInMillis(System.currentTimeMillis());
+ invalidate();
+ }
+
+ /**
+ * Call when the time zone has changed to update clock hands.
+ *
+ * @param timeZone The updated time zone that will be used.
+ */
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mTime.setTimeZone(timeZone);
+ }
+
+ /**
+ * Set the color of the minute hand.
+ */
+ public void setMinuteHandColor(int color) {
+ mMinutePaint.setColor(color);
+ invalidate();
+ }
+
+ private void init() {
+ mHourPaint.setColor(DEFAULT_COLOR);
+ mHourPaint.setStrokeWidth(HOUR_STROKE_WIDTH);
+ mHourPaint.setAntiAlias(true);
+ mHourPaint.setStrokeCap(Paint.Cap.ROUND);
+
+ mMinutePaint.setColor(Color.WHITE);
+ mMinutePaint.setStrokeWidth(MINUTE_STROKE_WIDTH);
+ mMinutePaint.setAntiAlias(true);
+ mMinutePaint.setStrokeCap(Paint.Cap.ROUND);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ final float centerX = getWidth() / 2f;
+ final float centerY = getHeight() / 2f;
+
+ final float minutesRotation = mTime.get(Calendar.MINUTE) * 6f;
+ final float hoursRotation = (mTime.get(Calendar.HOUR) * 30);
+
+ // Compute length of clock hands. Hour hand is 60% the length from center to edge
+ // and minute hand is twice the length to make sure it extends past screen edge.
+ double sMinuteHandLengthFactor = Math.sin(2d * Math.PI * minutesRotation / 360d);
+ float sMinuteHandLength = (float) (2d * (centerY + (centerX - centerY)
+ * sMinuteHandLengthFactor * sMinuteHandLengthFactor));
+ double sHourHandLengthFactor = Math.sin(2d * Math.PI * hoursRotation / 360d);
+ float sHourHandLength = (float) (0.6d * (centerY + (centerX - centerY)
+ * sHourHandLengthFactor * sHourHandLengthFactor));
+
+ canvas.save();
+
+ canvas.rotate(minutesRotation, centerX, centerY);
+ canvas.drawLine(
+ centerX,
+ centerY + CENTER_GAP_AND_CIRCLE_RADIUS,
+ centerX,
+ centerY - sMinuteHandLength,
+ mMinutePaint);
+
+ canvas.rotate(hoursRotation - minutesRotation, centerX, centerY);
+ canvas.drawLine(
+ centerX,
+ centerY + CENTER_GAP_AND_CIRCLE_RADIUS,
+ centerX,
+ centerY - sHourHandLength,
+ mHourPaint);
+
+ canvas.restore();
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mTime = Calendar.getInstance(mTimeZone != null ? mTimeZone : TimeZone.getDefault());
+ onTimeChanged();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java
new file mode 100644
index 000000000000..0a39158cd4be
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.graphics.Paint.Style;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextClock;
+
+import com.android.keyguard.R;
+import com.android.systemui.plugins.ClockPlugin;
+
+import java.util.TimeZone;
+
+/**
+ * Controller for Stretch clock that can appear on lock screen and AOD.
+ */
+public class StretchAnalogClockController implements ClockPlugin {
+
+ /**
+ * Custom clock shown on AOD screen and behind stack scroller on lock.
+ */
+ private View mBigClockView;
+ private TextClock mDigitalClock;
+ private StretchAnalogClock mAnalogClock;
+
+ /**
+ * Small clock shown on lock screen above stack scroller.
+ */
+ private View mView;
+ private TextClock mLockClock;
+
+ /**
+ * Controller for transition to dark state.
+ */
+ private CrossFadeDarkController mDarkController;
+
+ private StretchAnalogClockController() { }
+
+ /**
+ * Create a BubbleClockController instance.
+ *
+ * @param layoutInflater Inflater used to inflate custom clock views.
+ */
+ public static StretchAnalogClockController build(LayoutInflater layoutInflater) {
+ StretchAnalogClockController controller = new StretchAnalogClockController();
+ controller.createViews(layoutInflater);
+ return controller;
+ }
+
+ private void createViews(LayoutInflater layoutInflater) {
+ mBigClockView = layoutInflater.inflate(R.layout.stretchanalog_clock, null);
+ mAnalogClock = mBigClockView.findViewById(R.id.analog_clock);
+ mDigitalClock = mBigClockView.findViewById(R.id.digital_clock);
+
+ mView = layoutInflater.inflate(R.layout.digital_clock, null);
+ mLockClock = mView.findViewById(R.id.lock_screen_clock);
+ mLockClock.setVisibility(View.GONE);
+
+ mDarkController = new CrossFadeDarkController(mDigitalClock, mLockClock);
+ }
+
+ @Override
+ public View getView() {
+ return mView;
+ }
+
+ @Override
+ public View getBigClockView() {
+ return mBigClockView;
+ }
+
+ @Override
+ public void setStyle(Style style) {}
+
+ @Override
+ public void setTextColor(int color) {
+ mLockClock.setTextColor(color);
+ mDigitalClock.setTextColor(color);
+ mAnalogClock.setMinuteHandColor(color);
+ }
+
+ @Override
+ public void dozeTimeTick() {
+ mAnalogClock.onTimeChanged();
+ }
+
+ @Override
+ public void setDarkAmount(float darkAmount) {
+ mDarkController.setDarkAmount(darkAmount);
+ }
+
+ @Override
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mAnalogClock.onTimeZoneChanged(timeZone);
+ }
+
+ @Override
+ public boolean shouldShowStatusArea() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
new file mode 100644
index 000000000000..17d929dc8a3b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.graphics.Paint.Style;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.keyguard.R;
+import com.android.systemui.plugins.ClockPlugin;
+
+import java.util.TimeZone;
+
+/**
+ * Plugin for a custom Typographic clock face that displays the time in words.
+ */
+public class TypeClockController implements ClockPlugin {
+
+ /**
+ * Custom clock shown on AOD screen and behind stack scroller on lock.
+ */
+ private View mView;
+ private TypographicClock mTypeClock;
+
+ /**
+ * Small clock shown on lock screen above stack scroller.
+ */
+ private View mLockClockContainer;
+
+ /**
+ * Controller for transition into dark state.
+ */
+ private CrossFadeDarkController mDarkController;
+
+ private TypeClockController() {}
+
+ /**
+ * Create a TypeClockController instance.
+ *
+ * @param inflater Inflater used to inflate custom clock views.
+ */
+ public static TypeClockController build(LayoutInflater inflater) {
+ TypeClockController controller = new TypeClockController();
+ controller.createViews(inflater);
+ return controller;
+ }
+
+ private void createViews(LayoutInflater inflater) {
+ mView = inflater.inflate(R.layout.type_clock, null);
+ mTypeClock = mView.findViewById(R.id.type_clock);
+
+ // For now, this view is used to hide the default digital clock.
+ // Need better transition to lock screen.
+ mLockClockContainer = inflater.inflate(R.layout.digital_clock, null);
+ mLockClockContainer.setVisibility(View.GONE);
+ }
+
+ @Override
+ public View getView() {
+ return mLockClockContainer;
+ }
+
+ @Override
+ public View getBigClockView() {
+ return mView;
+ }
+
+ @Override
+ public void setStyle(Style style) {}
+
+ @Override
+ public void setTextColor(int color) {
+ mTypeClock.setTextColor(color);
+ }
+
+ @Override
+ public void dozeTimeTick() {
+ mTypeClock.onTimeChanged();
+ }
+
+ @Override
+ public void setDarkAmount(float darkAmount) {}
+
+ @Override
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mTypeClock.onTimeZoneChanged(timeZone);
+ }
+
+ @Override
+ public boolean shouldShowStatusArea() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java
new file mode 100644
index 000000000000..5f9da3ee33bb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.keyguard.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+/**
+ * Clock that presents the time in words.
+ */
+public class TypographicClock extends LinearLayout {
+
+ private final String[] mHours;
+ private final String[] mMinutes;
+ private TextView mHeaderText;
+ private TextView mHourText;
+ private TextView mMinuteText;
+ private Calendar mTime;
+ private String mDescFormat;
+ private TimeZone mTimeZone;
+
+ public TypographicClock(Context context) {
+ this(context, null);
+ }
+
+ public TypographicClock(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public TypographicClock(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mTime = Calendar.getInstance();
+ mDescFormat = ((SimpleDateFormat) DateFormat.getTimeFormat(context)).toLocalizedPattern();
+ Resources res = context.getResources();
+ mHours = res.getStringArray(R.array.type_clock_hours);
+ mMinutes = res.getStringArray(R.array.type_clock_minutes);
+ }
+
+ /**
+ * Call when the time changes to update the text of the time.
+ */
+ public void onTimeChanged() {
+ mTime.setTimeInMillis(System.currentTimeMillis());
+ setContentDescription(DateFormat.format(mDescFormat, mTime));
+ final int hour = mTime.get(Calendar.HOUR);
+ mHourText.setText(mHours[hour % 12]);
+ final int minute = mTime.get(Calendar.MINUTE);
+ mMinuteText.setText(mMinutes[minute % 60]);
+ invalidate();
+ }
+
+ /**
+ * Call when the time zone has changed to update clock time.
+ *
+ * @param timeZone The updated time zone that will be used.
+ */
+ public void onTimeZoneChanged(TimeZone timeZone) {
+ mTimeZone = timeZone;
+ mTime.setTimeZone(timeZone);
+ }
+
+ /**
+ * Set the color of the text used to display the time.
+ *
+ * This is necessary when the wallpaper shown behind the clock on the
+ * lock screen changes.
+ */
+ public void setTextColor(int color) {
+ mHourText.setTextColor(color);
+ mMinuteText.setTextColor(color);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mHeaderText = findViewById(R.id.header);
+ mHourText = findViewById(R.id.hour);
+ mMinuteText = findViewById(R.id.minute);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mTime = Calendar.getInstance(mTimeZone != null ? mTimeZone : TimeZone.getDefault());
+ onTimeChanged();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 6864ea185834..200679432200 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -40,7 +40,6 @@ import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.LayoutInflater;
-import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -56,7 +55,6 @@ import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
-import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.Utils.DisableStateTracker;
@@ -71,11 +69,12 @@ public class BatteryMeterView extends LinearLayout implements
@Retention(SOURCE)
- @IntDef({MODE_DEFAULT, MODE_ON, MODE_OFF})
+ @IntDef({MODE_DEFAULT, MODE_ON, MODE_OFF, MODE_ESTIMATE})
public @interface BatteryPercentMode {}
public static final int MODE_DEFAULT = 0;
public static final int MODE_ON = 1;
public static final int MODE_OFF = 2;
+ public static final int MODE_ESTIMATE = 3;
private final BatteryMeterDrawableBase mDrawable;
private final String mSlotBattery;
@@ -93,6 +92,7 @@ public class BatteryMeterView extends LinearLayout implements
// Some places may need to show the battery conditionally, and not obey the tuner
private boolean mIgnoreTunerUpdates;
private boolean mIsSubscribedForTunerUpdates;
+ private boolean mCharging;
private int mDarkModeBackgroundColor;
private int mDarkModeFillColor;
@@ -276,9 +276,6 @@ public class BatteryMeterView extends LinearLayout implements
public void onTuningChanged(String key, String newValue) {
if (StatusBarIconController.ICON_BLACKLIST.equals(key)) {
ArraySet<String> icons = StatusBarIconController.getIconBlacklist(newValue);
- boolean hidden = icons.contains(mSlotBattery);
- Dependency.get(IconLogger.class).onIconVisibility(mSlotBattery, !hidden);
- setVisibility(hidden ? View.GONE : View.VISIBLE);
}
}
@@ -308,6 +305,7 @@ public class BatteryMeterView extends LinearLayout implements
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
mDrawable.setBatteryLevel(level);
mDrawable.setCharging(pluggedIn);
+ mCharging = pluggedIn;
mLevel = level;
updatePercentText();
setContentDescription(
@@ -337,9 +335,19 @@ public class BatteryMeterView extends LinearLayout implements
}
private void updatePercentText() {
+ if (mBatteryController == null) {
+ return;
+ }
+
if (mBatteryPercentView != null) {
- mBatteryPercentView.setText(
- NumberFormat.getPercentInstance().format(mLevel / 100f));
+ if (mShowPercentMode == MODE_ESTIMATE && !mCharging) {
+ mBatteryController.getEstimatedTimeRemainingString((String estimate) -> {
+ mBatteryPercentView.setText(estimate);
+ });
+ } else {
+ mBatteryPercentView.setText(
+ NumberFormat.getPercentInstance().format(mLevel / 100f));
+ }
}
}
@@ -350,7 +358,7 @@ public class BatteryMeterView extends LinearLayout implements
SHOW_BATTERY_PERCENT, 0, mUser);
if ((mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF)
- || mShowPercentMode == MODE_ON) {
+ || mShowPercentMode == MODE_ON || mShowPercentMode == MODE_ESTIMATE) {
if (!showing) {
mBatteryPercentView = loadPercentView();
if (mTextColor != 0) mBatteryPercentView.setTextColor(mTextColor);
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 3cc9bb6f668f..ec6ecc64d07e 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -56,12 +56,12 @@ import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.NotificationRowBinder;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
@@ -86,7 +86,6 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.ExtensionController;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HotspotController;
-import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
@@ -217,7 +216,6 @@ public class Dependency extends SystemUI {
@Inject Lazy<LeakDetector> mLeakDetector;
@Inject Lazy<LeakReporter> mLeakReporter;
@Inject Lazy<GarbageMonitor> mGarbageMonitor;
- @Inject Lazy<IconLogger> mIconLogger;
@Inject Lazy<TunerService> mTunerService;
@Inject Lazy<StatusBarWindowController> mStatusBarWindowController;
@Inject Lazy<DarkIconDispatcher> mDarkIconDispatcher;
@@ -392,8 +390,6 @@ public class Dependency extends SystemUI {
mProviders.put(PowerUI.WarningsUI.class, mWarningsUI::get);
- mProviders.put(IconLogger.class, mIconLogger::get);
-
mProviders.put(LightBarController.class, mLightBarController::get);
mProviders.put(IWindowManager.class, mIWindowManager::get);
diff --git a/packages/SystemUI/src/com/android/systemui/DependencyBinder.java b/packages/SystemUI/src/com/android/systemui/DependencyBinder.java
index f324a05bafff..ce9c637cebf6 100644
--- a/packages/SystemUI/src/com/android/systemui/DependencyBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/DependencyBinder.java
@@ -46,8 +46,6 @@ import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.FlashlightControllerImpl;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.HotspotControllerImpl;
-import com.android.systemui.statusbar.policy.IconLogger;
-import com.android.systemui.statusbar.policy.IconLoggerImpl;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
import com.android.systemui.statusbar.policy.LocationController;
@@ -133,11 +131,6 @@ public abstract class DependencyBinder {
/**
*/
@Binds
- public abstract IconLogger provideIconLogger(IconLoggerImpl loggerImpl);
-
- /**
- */
- @Binds
public abstract CastController provideCastController(CastControllerImpl controllerImpl);
/**
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener.java b/packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener.java
index 151a6b013110..96b62ac918ab 100644
--- a/packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener.java
@@ -24,9 +24,9 @@ import android.service.notification.StatusBarNotification;
import android.util.Log;
import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -49,26 +49,21 @@ public class ForegroundServiceNotificationListener {
mForegroundServiceController = foregroundServiceController;
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
- public void onPendingEntryAdded(NotificationData.Entry entry) {
+ public void onPendingEntryAdded(NotificationEntry entry) {
addNotification(entry.notification, entry.importance);
}
@Override
- public void onEntryUpdated(NotificationData.Entry entry) {
+ public void onPostEntryUpdated(NotificationEntry entry) {
updateNotification(entry.notification, entry.importance);
}
@Override
public void onEntryRemoved(
- NotificationData.Entry entry,
- String key,
- StatusBarNotification old,
+ NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
- if (entry != null && !lifetimeExtended) {
- removeNotification(entry.notification);
- }
+ removeNotification(entry.notification);
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
index 16e869e9d317..e28aa9d369cb 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
@@ -37,23 +37,25 @@ import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.leak.RotationUtils;
-public class HardwareUiLayout extends LinearLayout implements Tunable {
+/**
+ * Layout for placing two containers at a specific physical position on the device, relative to the
+ * device's hardware, regardless of screen rotation.
+ */
+public class HardwareUiLayout extends MultiListLayout implements Tunable {
private static final String EDGE_BLEED = "sysui_hwui_edge_bleed";
private static final String ROUNDED_DIVIDER = "sysui_hwui_rounded_divider";
private final int[] mTmp2 = new int[2];
- private View mList;
- private View mSeparatedView;
+ private ViewGroup mList;
+ private ViewGroup mSeparatedView;
private int mOldHeight;
private boolean mAnimating;
private AnimatorSet mAnimation;
private View mDivision;
- private boolean mHasOutsideTouch;
private HardwareBgDrawable mListBackground;
private HardwareBgDrawable mSeparatedViewBackground;
private Animator mAnimator;
private boolean mCollapse;
- private boolean mHasSeparatedButton;
private int mEndPoint;
private boolean mEdgeBleed;
private boolean mRoundedDivider;
@@ -67,6 +69,35 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
}
@Override
+ protected ViewGroup getSeparatedView() {
+ return findViewById(com.android.systemui.R.id.separated_button);
+ }
+
+ @Override
+ protected ViewGroup getListView() {
+ return findViewById(android.R.id.list);
+ }
+
+ @Override
+ public void removeAllItems() {
+ if (mList != null) {
+ mList.removeAllViews();
+ }
+ if (mSeparatedView != null) {
+ mSeparatedView.removeAllViews();
+ }
+ }
+
+ @Override
+ public ViewGroup getParentView(boolean separated, int index) {
+ if (separated) {
+ return getSeparatedView();
+ } else {
+ return getListView();
+ }
+ }
+
+ @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
updateSettings();
@@ -137,9 +168,9 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mList == null) {
if (getChildCount() != 0) {
- mList = getChildAt(0);
+ mList = getListView();
mList.setBackground(mListBackground);
- mSeparatedView = getChildAt(1);
+ mSeparatedView = getSeparatedView();
mSeparatedView.setBackground(mSeparatedViewBackground);
updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding());
mOldHeight = mList.getMeasuredHeight();
@@ -187,7 +218,7 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
} else {
rotateLeft();
}
- if (mHasSeparatedButton) {
+ if (mHasSeparatedView) {
if (from == ROTATION_SEASCAPE || to == ROTATION_SEASCAPE) {
// Separated view has top margin, so seascape separated view need special rotation,
// not a full left or right rotation.
@@ -408,8 +439,8 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
if (mList == null) return;
// If got separated button, setRotatedBackground to false,
// all items won't get white background.
- mListBackground.setRotatedBackground(mHasSeparatedButton);
- mSeparatedViewBackground.setRotatedBackground(mHasSeparatedButton);
+ mListBackground.setRotatedBackground(mHasSeparatedView);
+ mSeparatedViewBackground.setRotatedBackground(mHasSeparatedView);
if (mDivision != null && mDivision.getVisibility() == VISIBLE) {
int index = mRotatedBackground ? 0 : 1;
mDivision.getLocationOnScreen(mTmp2);
@@ -460,21 +491,21 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
case RotationUtils.ROTATION_LANDSCAPE:
defaultTopPadding = getPaddingLeft();
viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth();
- separatedViewTopMargin = mHasSeparatedButton ? params.leftMargin : 0;
+ separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0;
screenHeight = getMeasuredWidth();
targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.TOP;
break;
case RotationUtils.ROTATION_SEASCAPE:
defaultTopPadding = getPaddingRight();
viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth();
- separatedViewTopMargin = mHasSeparatedButton ? params.leftMargin : 0;
+ separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0;
screenHeight = getMeasuredWidth();
targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;
break;
default: // Portrait
defaultTopPadding = getPaddingTop();
viewsTotalHeight = mList.getMeasuredHeight() + mSeparatedView.getMeasuredHeight();
- separatedViewTopMargin = mHasSeparatedButton ? params.topMargin : 0;
+ separatedViewTopMargin = mHasSeparatedView ? params.topMargin : 0;
screenHeight = getMeasuredHeight();
targetGravity = Gravity.CENTER_VERTICAL|Gravity.RIGHT;
break;
@@ -491,30 +522,10 @@ public class HardwareUiLayout extends LinearLayout implements Tunable {
return super.getOutlineProvider();
}
- public void setOutsideTouchListener(OnClickListener onClickListener) {
- mHasOutsideTouch = true;
- requestLayout();
- setOnClickListener(onClickListener);
- setClickable(true);
- setFocusable(true);
- }
-
public void setCollapse() {
mCollapse = true;
}
- public void setHasSeparatedButton(boolean hasSeparatedButton) {
- mHasSeparatedButton = hasSeparatedButton;
- }
-
- public static HardwareUiLayout get(View v) {
- if (v instanceof HardwareUiLayout) return (HardwareUiLayout) v;
- if (v.getParent() instanceof View) {
- return get((View) v.getParent());
- }
- return null;
- }
-
private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsListener = inoutInfo -> {
if (mHasOutsideTouch || (mList == null)) {
inoutInfo.setTouchableInsets(
diff --git a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java
new file mode 100644
index 000000000000..0c7a9a9fffd2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2019 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;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+/**
+ * Layout class representing the Global Actions menu which appears when the power button is held.
+ */
+public abstract class MultiListLayout extends LinearLayout {
+ boolean mHasOutsideTouch;
+ boolean mHasSeparatedView;
+
+ int mExpectedSeparatedItemCount;
+ int mExpectedListItemCount;
+
+ public MultiListLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ protected abstract ViewGroup getSeparatedView();
+
+ protected abstract ViewGroup getListView();
+
+ /**
+ * Removes all child items from the separated and list views, if they exist.
+ */
+ public abstract void removeAllItems();
+
+ /**
+ * Get the parent view which will be used to contain the item at the specified index.
+ * @param separated Whether or not this index refers to a position in the separated or list
+ * container.
+ * @param index The index of the item within the container.
+ * @return The parent ViewGroup which will be used to contain the specified item
+ * after it has been added to the layout.
+ */
+ public abstract ViewGroup getParentView(boolean separated, int index);
+
+ /**
+ * Sets the divided view, which may have a differently-colored background.
+ */
+ public abstract void setDivisionView(View v);
+
+ /**
+ * Set the view accessibility delegate for the list view container.
+ */
+ public void setListViewAccessibilityDelegate(View.AccessibilityDelegate delegate) {
+ getListView().setAccessibilityDelegate(delegate);
+ }
+
+ protected void setSeparatedViewVisibility(boolean visible) {
+ getSeparatedView().setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Sets the number of items expected to be rendered in the separated container. This allows the
+ * layout to correctly determine which parent containers will be used for items before they have
+ * beenadded to the layout.
+ * @param count The number of items expected.
+ */
+ public void setExpectedSeparatedItemCount(int count) {
+ mExpectedSeparatedItemCount = count;
+ }
+
+ /**
+ * Sets the number of items expected to be rendered in the list container. This allows the
+ * layout to correctly determine which parent containers will be used for items before they have
+ * beenadded to the layout.
+ * @param count The number of items expected.
+ */
+ public void setExpectedListItemCount(int count) {
+ mExpectedListItemCount = count;
+ }
+
+ /**
+ * Sets whether the separated view should be shown, and handles updating visibility on
+ * that view.
+ */
+ public void setHasSeparatedView(boolean hasSeparatedView) {
+ mHasSeparatedView = hasSeparatedView;
+ setSeparatedViewVisibility(hasSeparatedView);
+ }
+
+ /**
+ * Sets this layout to respond to an outside touch listener.
+ */
+ public void setOutsideTouchListener(OnClickListener onClickListener) {
+ mHasOutsideTouch = true;
+ requestLayout();
+ setOnClickListener(onClickListener);
+ setClickable(true);
+ setFocusable(true);
+ }
+
+ /**
+ * Retrieve the MultiListLayout associated with the given view.
+ */
+ public static MultiListLayout get(View v) {
+ if (v instanceof MultiListLayout) return (MultiListLayout) v;
+ if (v.getParent() instanceof View) {
+ return get((View) v.getParent());
+ }
+ return null;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 5347a5cb16b6..f66a57b6133c 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -40,9 +40,10 @@ import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.ScrimView;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
@@ -136,8 +137,8 @@ public class SystemUIFactory {
}
public NotificationIconAreaController createNotificationIconAreaController(Context context,
- StatusBar statusBar) {
- return new NotificationIconAreaController(context, statusBar);
+ StatusBar statusBar, StatusBarStateController statusBarStateController) {
+ return new NotificationIconAreaController(context, statusBar, statusBarStateController);
}
public KeyguardIndicationController createKeyguardIndicationController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpItem.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpItem.java
index 9f363f681b04..7e5b42653210 100644
--- a/packages/SystemUI/src/com/android/systemui/appops/AppOpItem.java
+++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpItem.java
@@ -25,12 +25,20 @@ public class AppOpItem {
private int mUid;
private String mPackageName;
private long mTimeStarted;
+ private String mState;
public AppOpItem(int code, int uid, String packageName, long timeStarted) {
this.mCode = code;
this.mUid = uid;
this.mPackageName = packageName;
this.mTimeStarted = timeStarted;
+ mState = new StringBuilder()
+ .append("AppOpItem(")
+ .append("Op code=").append(code).append(", ")
+ .append("UID=").append(uid).append(", ")
+ .append("Package name=").append(packageName)
+ .append(")")
+ .toString();
}
public int getCode() {
@@ -48,4 +56,9 @@ public class AppOpItem {
public long getTimeStarted() {
return mTimeStarted;
}
+
+ @Override
+ public String toString() {
+ return mState;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
index e3bcb37474db..c013df385987 100644
--- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
@@ -29,7 +29,10 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.Dumpable;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -47,7 +50,7 @@ import javax.inject.Singleton;
@Singleton
public class AppOpsControllerImpl implements AppOpsController,
AppOpsManager.OnOpActiveChangedListener,
- AppOpsManager.OnOpNotedListener {
+ AppOpsManager.OnOpNotedListener, Dumpable {
private static final long NOTED_OP_TIME_DELAY_MS = 5000;
private static final String TAG = "AppOpsControllerImpl";
@@ -271,6 +274,22 @@ public class AppOpsControllerImpl implements AppOpsController,
}
}
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("AppOpsController state:");
+ pw.println(" Active Items:");
+ for (int i = 0; i < mActiveItems.size(); i++) {
+ final AppOpItem item = mActiveItems.get(i);
+ pw.print(" "); pw.println(item.toString());
+ }
+ pw.println(" Noted Items:");
+ for (int i = 0; i < mNotedItems.size(); i++) {
+ final AppOpItem item = mNotedItems.get(i);
+ pw.print(" "); pw.println(item.toString());
+ }
+
+ }
+
protected final class H extends Handler {
H(Looper looper) {
super(looper);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
index 3167b9e0a458..016b8fe93093 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
@@ -33,9 +33,6 @@ import com.android.internal.os.SomeArgs;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.CommandQueue;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Receives messages sent from AuthenticationClient and shows the appropriate biometric UI (e.g.
* BiometricDialogView).
@@ -52,10 +49,8 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
private static final int MSG_BUTTON_NEGATIVE = 6;
private static final int MSG_USER_CANCELED = 7;
private static final int MSG_BUTTON_POSITIVE = 8;
- private static final int MSG_BIOMETRIC_SHOW_TRY_AGAIN = 9;
- private static final int MSG_TRY_AGAIN_PRESSED = 10;
+ private static final int MSG_TRY_AGAIN_PRESSED = 9;
- private Map<Integer, BiometricDialogView> mDialogs; // BiometricAuthenticator type, view
private SomeArgs mCurrentDialogArgs;
private BiometricDialogView mCurrentDialog;
private WindowManager mWindowManager;
@@ -63,21 +58,22 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
private boolean mDialogShowing;
private Callback mCallback = new Callback();
- private boolean mTryAgainShowing; // No good place to save state before config change :/
- private boolean mConfirmShowing; // No good place to save state before config change :/
-
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_SHOW_DIALOG:
- handleShowDialog((SomeArgs) msg.obj, false /* skipAnimation */);
+ handleShowDialog((SomeArgs) msg.obj, false /* skipAnimation */,
+ null /* savedState */);
break;
case MSG_BIOMETRIC_AUTHENTICATED:
- handleBiometricAuthenticated();
+ handleBiometricAuthenticated((boolean) msg.obj);
break;
case MSG_BIOMETRIC_HELP:
- handleBiometricHelp((String) msg.obj);
+ SomeArgs args = (SomeArgs) msg.obj;
+ handleBiometricHelp((String) args.arg1 /* message */,
+ (boolean) args.arg2 /* requireTryAgain */);
+ args.recycle();
break;
case MSG_BIOMETRIC_ERROR:
handleBiometricError((String) msg.obj);
@@ -94,9 +90,6 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
case MSG_BUTTON_POSITIVE:
handleButtonPositive();
break;
- case MSG_BIOMETRIC_SHOW_TRY_AGAIN:
- handleShowTryAgain();
- break;
case MSG_TRY_AGAIN_PRESSED:
handleTryAgainPressed();
break;
@@ -137,30 +130,22 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
@Override
public void start() {
- createDialogs();
-
- if (!mDialogs.isEmpty()) {
+ final PackageManager pm = mContext.getPackageManager();
+ if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
+ || pm.hasSystemFeature(PackageManager.FEATURE_FACE)
+ || pm.hasSystemFeature(PackageManager.FEATURE_IRIS)) {
getComponent(CommandQueue.class).addCallback(this);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
}
}
- private void createDialogs() {
- final PackageManager pm = mContext.getPackageManager();
- mDialogs = new HashMap<>();
- if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) {
- mDialogs.put(BiometricAuthenticator.TYPE_FACE, new FaceDialogView(mContext, mCallback));
- }
- if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
- mDialogs.put(BiometricAuthenticator.TYPE_FINGERPRINT,
- new FingerprintDialogView(mContext, mCallback));
- }
- }
-
@Override
public void showBiometricDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver,
int type, boolean requireConfirmation, int userId) {
- if (DEBUG) Log.d(TAG, "showBiometricDialog, type: " + type);
+ if (DEBUG) {
+ Log.d(TAG, "showBiometricDialog, type: " + type
+ + ", requireConfirmation: " + requireConfirmation);
+ }
// Remove these messages as they are part of the previous client
mHandler.removeMessages(MSG_BIOMETRIC_ERROR);
mHandler.removeMessages(MSG_BIOMETRIC_HELP);
@@ -176,15 +161,18 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
}
@Override
- public void onBiometricAuthenticated() {
- if (DEBUG) Log.d(TAG, "onBiometricAuthenticated");
- mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATED).sendToTarget();
+ public void onBiometricAuthenticated(boolean authenticated) {
+ if (DEBUG) Log.d(TAG, "onBiometricAuthenticated: " + authenticated);
+ mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATED, authenticated).sendToTarget();
}
@Override
public void onBiometricHelp(String message) {
if (DEBUG) Log.d(TAG, "onBiometricHelp: " + message);
- mHandler.obtainMessage(MSG_BIOMETRIC_HELP, message).sendToTarget();
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = message;
+ args.arg2 = false; // requireTryAgain
+ mHandler.obtainMessage(MSG_BIOMETRIC_HELP, args).sendToTarget();
}
@Override
@@ -199,16 +187,21 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mHandler.obtainMessage(MSG_HIDE_DIALOG, false /* userCanceled */).sendToTarget();
}
- @Override
- public void showBiometricTryAgain() {
- if (DEBUG) Log.d(TAG, "showBiometricTryAgain");
- mHandler.obtainMessage(MSG_BIOMETRIC_SHOW_TRY_AGAIN).sendToTarget();
- }
-
- private void handleShowDialog(SomeArgs args, boolean skipAnimation) {
+ private void handleShowDialog(SomeArgs args, boolean skipAnimation, Bundle savedState) {
mCurrentDialogArgs = args;
final int type = args.argi1;
- mCurrentDialog = mDialogs.get(type);
+
+ if (type == BiometricAuthenticator.TYPE_FINGERPRINT) {
+ mCurrentDialog = new FingerprintDialogView(mContext, mCallback);
+ } else if (type == BiometricAuthenticator.TYPE_FACE) {
+ mCurrentDialog = new FaceDialogView(mContext, mCallback);
+ } else {
+ Log.e(TAG, "Unsupported type: " + type);
+ }
+
+ if (savedState != null) {
+ mCurrentDialog.restoreState(savedState);
+ }
if (DEBUG) Log.d(TAG, "handleShowDialog, isAnimatingAway: "
+ mCurrentDialog.isAnimatingAway() + " type: " + type);
@@ -224,32 +217,36 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mCurrentDialog.setRequireConfirmation((boolean) args.arg3);
mCurrentDialog.setUserId(args.argi2);
mCurrentDialog.setSkipIntro(skipAnimation);
- mCurrentDialog.setPendingTryAgain(mTryAgainShowing);
- mCurrentDialog.setPendingConfirm(mConfirmShowing);
mWindowManager.addView(mCurrentDialog, mCurrentDialog.getLayoutParams());
mDialogShowing = true;
}
- private void handleBiometricAuthenticated() {
- if (DEBUG) Log.d(TAG, "handleBiometricAuthenticated");
-
- mCurrentDialog.announceForAccessibility(
- mContext.getResources()
- .getText(mCurrentDialog.getAuthenticatedAccessibilityResourceId()));
- if (mCurrentDialog.requiresConfirmation()) {
- mConfirmShowing = true;
- mCurrentDialog.showConfirmationButton(true /* show */);
+ private void handleBiometricAuthenticated(boolean authenticated) {
+ if (DEBUG) Log.d(TAG, "handleBiometricAuthenticated: " + authenticated);
+
+ if (authenticated) {
+ mCurrentDialog.announceForAccessibility(
+ mContext.getResources()
+ .getText(mCurrentDialog.getAuthenticatedAccessibilityResourceId()));
+ if (mCurrentDialog.requiresConfirmation()) {
+ mCurrentDialog.showConfirmationButton(true /* show */);
+ } else {
+ mCurrentDialog.updateState(BiometricDialogView.STATE_AUTHENTICATED);
+ mHandler.postDelayed(() -> {
+ handleHideDialog(false /* userCanceled */);
+ }, mCurrentDialog.getDelayAfterAuthenticatedDurationMs());
+ }
} else {
- mCurrentDialog.updateState(BiometricDialogView.STATE_AUTHENTICATED);
- mHandler.postDelayed(() -> {
- handleHideDialog(false /* userCanceled */);
- }, mCurrentDialog.getDelayAfterAuthenticatedDurationMs());
+ handleBiometricHelp(mContext.getResources()
+ .getString(com.android.internal.R.string.biometric_not_recognized),
+ true /* requireTryAgain */);
+ mCurrentDialog.showTryAgainButton(true /* show */);
}
}
- private void handleBiometricHelp(String message) {
+ private void handleBiometricHelp(String message, boolean requireTryAgain) {
if (DEBUG) Log.d(TAG, "handleBiometricHelp: " + message);
- mCurrentDialog.showHelpMessage(message);
+ mCurrentDialog.showHelpMessage(message, requireTryAgain);
}
private void handleBiometricError(String error) {
@@ -258,7 +255,6 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
if (DEBUG) Log.d(TAG, "Dialog already dismissed");
return;
}
- mTryAgainShowing = false;
mCurrentDialog.showErrorMessage(error);
}
@@ -279,8 +275,6 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
}
mReceiver = null;
mDialogShowing = false;
- mConfirmShowing = false;
- mTryAgainShowing = false;
mCurrentDialog.startDismiss();
}
@@ -294,7 +288,6 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
} catch (RemoteException e) {
Log.e(TAG, "Remote exception when handling negative button", e);
}
- mTryAgainShowing = false;
handleHideDialog(false /* userCanceled */);
}
@@ -308,25 +301,16 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
} catch (RemoteException e) {
Log.e(TAG, "Remote exception when handling positive button", e);
}
- mConfirmShowing = false;
handleHideDialog(false /* userCanceled */);
}
private void handleUserCanceled() {
- mTryAgainShowing = false;
- mConfirmShowing = false;
handleHideDialog(true /* userCanceled */);
}
- private void handleShowTryAgain() {
- mCurrentDialog.showTryAgainButton(true /* show */);
- mTryAgainShowing = true;
- }
-
private void handleTryAgainPressed() {
try {
mCurrentDialog.clearTemporaryMessage();
- mTryAgainShowing = false;
mReceiver.onTryAgainPressed();
} catch (RemoteException e) {
Log.e(TAG, "RemoteException when handling try again", e);
@@ -337,13 +321,20 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
final boolean wasShowing = mDialogShowing;
+
+ // Save the state of the current dialog (buttons showing, etc)
+ final Bundle savedState = new Bundle();
+ if (mCurrentDialog != null) {
+ mCurrentDialog.onSaveState(savedState);
+ }
+
if (mDialogShowing) {
mCurrentDialog.forceRemove();
mDialogShowing = false;
}
- createDialogs();
+
if (wasShowing) {
- handleShowDialog(mCurrentDialogArgs, true /* skipAnimation */);
+ handleShowDialog(mCurrentDialogArgs, true /* skipAnimation */, savedState);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
index 9934bfd11f12..c92767763cb4 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
@@ -56,12 +56,15 @@ public abstract class BiometricDialogView extends LinearLayout {
private static final String TAG = "BiometricDialogView";
+ private static final String KEY_TRY_AGAIN_VISIBILITY = "key_try_again_visibility";
+ private static final String KEY_CONFIRM_VISIBILITY = "key_confirm_visibility";
+
private static final int ANIMATION_DURATION_SHOW = 250; // ms
private static final int ANIMATION_DURATION_AWAY = 350; // ms
private static final int MSG_CLEAR_MESSAGE = 1;
- protected static final int STATE_NONE = 0;
+ protected static final int STATE_IDLE = 0;
protected static final int STATE_AUTHENTICATING = 1;
protected static final int STATE_ERROR = 2;
protected static final int STATE_PENDING_CONFIRMATION = 3;
@@ -74,16 +77,24 @@ public abstract class BiometricDialogView extends LinearLayout {
private final DevicePolicyManager mDevicePolicyManager;
private final float mAnimationTranslationOffset;
private final int mErrorColor;
- private final int mTextColor;
private final float mDialogWidth;
private final DialogViewCallback mCallback;
- private ViewGroup mLayout;
- private final Button mPositiveButton;
- private final Button mNegativeButton;
- private final TextView mErrorText;
+ protected final ViewGroup mLayout;
+ protected final LinearLayout mDialog;
+ protected final TextView mTitleText;
+ protected final TextView mSubtitleText;
+ protected final TextView mDescriptionText;
+ protected final ImageView mBiometricIcon;
+ protected final TextView mErrorText;
+ protected final Button mPositiveButton;
+ protected final Button mNegativeButton;
+ protected final Button mTryAgainButton;
+
+ protected final int mTextColor;
+
private Bundle mBundle;
- private final LinearLayout mDialog;
+
private int mLastState;
private boolean mAnimatingAway;
private boolean mWasForceRemoved;
@@ -91,15 +102,14 @@ public abstract class BiometricDialogView extends LinearLayout {
protected boolean mRequireConfirmation;
private int mUserId; // used to determine if we should show work background
- private boolean mPendingShowTryAgain;
- private boolean mPendingShowConfirm;
-
protected abstract int getHintStringResourceId();
protected abstract int getAuthenticatedAccessibilityResourceId();
protected abstract int getIconDescriptionResourceId();
protected abstract Drawable getAnimationForTransition(int oldState, int newState);
protected abstract boolean shouldAnimateForTransition(int oldState, int newState);
protected abstract int getDelayAfterAuthenticatedDurationMs();
+ protected abstract boolean shouldGrayAreaDismissDialog();
+ protected abstract void handleClearMessage(boolean requireTryAgain);
private final Runnable mShowAnimationRunnable = new Runnable() {
@Override
@@ -124,7 +134,7 @@ public abstract class BiometricDialogView extends LinearLayout {
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_CLEAR_MESSAGE:
- handleClearMessage();
+ handleClearMessage((boolean) msg.obj /* requireTryAgain */);
break;
default:
Log.e(TAG, "Unhandled message: " + msg.what);
@@ -158,10 +168,6 @@ public abstract class BiometricDialogView extends LinearLayout {
mLayout = (ViewGroup) factory.inflate(R.layout.biometric_dialog, this, false);
addView(mLayout);
- mDialog = mLayout.findViewById(R.id.dialog);
-
- mErrorText = mLayout.findViewById(R.id.error);
-
mLayout.setOnKeyListener(new View.OnKeyListener() {
boolean downPressed = false;
@Override
@@ -184,12 +190,19 @@ public abstract class BiometricDialogView extends LinearLayout {
final View space = mLayout.findViewById(R.id.space);
final View leftSpace = mLayout.findViewById(R.id.left_space);
final View rightSpace = mLayout.findViewById(R.id.right_space);
- final ImageView icon = mLayout.findViewById(R.id.biometric_icon);
- final Button tryAgain = mLayout.findViewById(R.id.button_try_again);
+
+ mDialog = mLayout.findViewById(R.id.dialog);
+ mTitleText = mLayout.findViewById(R.id.title);
+ mSubtitleText = mLayout.findViewById(R.id.subtitle);
+ mDescriptionText = mLayout.findViewById(R.id.description);
+ mBiometricIcon = mLayout.findViewById(R.id.biometric_icon);
+ mErrorText = mLayout.findViewById(R.id.error);
mNegativeButton = mLayout.findViewById(R.id.button2);
mPositiveButton = mLayout.findViewById(R.id.button1);
+ mTryAgainButton = mLayout.findViewById(R.id.button_try_again);
- icon.setContentDescription(getResources().getString(getIconDescriptionResourceId()));
+ mBiometricIcon.setContentDescription(
+ getResources().getString(getIconDescriptionResourceId()));
setDismissesDialog(space);
setDismissesDialog(leftSpace);
@@ -206,8 +219,9 @@ public abstract class BiometricDialogView extends LinearLayout {
}, getDelayAfterAuthenticatedDurationMs());
});
- tryAgain.setOnClickListener((View v) -> {
+ mTryAgainButton.setOnClickListener((View v) -> {
showTryAgainButton(false /* show */);
+ handleClearMessage(false /* requireTryAgain */);
mCallback.onTryAgainPressed();
});
@@ -215,15 +229,17 @@ public abstract class BiometricDialogView extends LinearLayout {
mLayout.requestFocus();
}
+ public void onSaveState(Bundle bundle) {
+ bundle.putInt(KEY_TRY_AGAIN_VISIBILITY, mTryAgainButton.getVisibility());
+ bundle.putInt(KEY_CONFIRM_VISIBILITY, mPositiveButton.getVisibility());
+ }
+
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
mErrorText.setText(getHintStringResourceId());
- final TextView title = mLayout.findViewById(R.id.title);
- final TextView subtitle = mLayout.findViewById(R.id.subtitle);
- final TextView description = mLayout.findViewById(R.id.description);
final ImageView backgroundView = mLayout.findViewById(R.id.background);
if (mUserManager.isManagedProfile(mUserId)) {
@@ -244,36 +260,34 @@ public abstract class BiometricDialogView extends LinearLayout {
mDialog.getLayoutParams().width = (int) mDialogWidth;
}
- mLastState = STATE_NONE;
+ mLastState = STATE_IDLE;
updateState(STATE_AUTHENTICATING);
CharSequence titleText = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
- title.setText(titleText);
- title.setSelected(true);
+ mTitleText.setVisibility(View.VISIBLE);
+ mTitleText.setText(titleText);
+ mTitleText.setSelected(true);
final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
if (TextUtils.isEmpty(subtitleText)) {
- subtitle.setVisibility(View.GONE);
+ mSubtitleText.setVisibility(View.GONE);
} else {
- subtitle.setVisibility(View.VISIBLE);
- subtitle.setText(subtitleText);
+ mSubtitleText.setVisibility(View.VISIBLE);
+ mSubtitleText.setText(subtitleText);
}
final CharSequence descriptionText =
mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION);
if (TextUtils.isEmpty(descriptionText)) {
- description.setVisibility(View.GONE);
+ mDescriptionText.setVisibility(View.GONE);
} else {
- description.setVisibility(View.VISIBLE);
- description.setText(descriptionText);
+ mDescriptionText.setVisibility(View.VISIBLE);
+ mDescriptionText.setText(descriptionText);
}
mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT));
- showTryAgainButton(mPendingShowTryAgain);
- showConfirmationButton(mPendingShowConfirm);
-
if (mWasForceRemoved || mSkipIntro) {
// Show the dialog immediately
mLayout.animate().cancel();
@@ -302,8 +316,7 @@ public abstract class BiometricDialogView extends LinearLayout {
? (AnimatedVectorDrawable) icon
: null;
- final ImageView imageView = getLayout().findViewById(R.id.biometric_icon);
- imageView.setImageDrawable(icon);
+ mBiometricIcon.setImageDrawable(icon);
if (animation != null && shouldAnimateForTransition(lastState, newState)) {
animation.forceAnimationOnUI();
@@ -314,7 +327,7 @@ public abstract class BiometricDialogView extends LinearLayout {
private void setDismissesDialog(View v) {
v.setClickable(true);
v.setOnTouchListener((View view, MotionEvent event) -> {
- if (mLastState != STATE_AUTHENTICATED) {
+ if (mLastState != STATE_AUTHENTICATED && shouldGrayAreaDismissDialog()) {
mCallback.onUserCanceled();
}
return true;
@@ -331,11 +344,9 @@ public abstract class BiometricDialogView extends LinearLayout {
mWindowManager.removeView(BiometricDialogView.this);
mAnimatingAway = false;
// Set the icons / text back to normal state
- handleClearMessage();
+ handleClearMessage(false /* requireTryAgain */);
showTryAgainButton(false /* show */);
- mPendingShowTryAgain = false;
- mPendingShowConfirm = false;
- updateState(STATE_NONE);
+ updateState(STATE_IDLE);
}
};
@@ -412,35 +423,28 @@ public abstract class BiometricDialogView extends LinearLayout {
return mLayout;
}
- // Clears the temporary message and shows the help message.
- private void handleClearMessage() {
- updateState(STATE_AUTHENTICATING);
- mErrorText.setText(getHintStringResourceId());
- mErrorText.setTextColor(mTextColor);
- }
-
// Shows an error/help message
- private void showTemporaryMessage(String message) {
+ private void showTemporaryMessage(String message, boolean requireTryAgain) {
mHandler.removeMessages(MSG_CLEAR_MESSAGE);
updateState(STATE_ERROR);
mErrorText.setText(message);
mErrorText.setTextColor(mErrorColor);
mErrorText.setContentDescription(message);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_MESSAGE),
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_MESSAGE, requireTryAgain),
BiometricPrompt.HIDE_DIALOG_DELAY);
}
public void clearTemporaryMessage() {
mHandler.removeMessages(MSG_CLEAR_MESSAGE);
- mHandler.obtainMessage(MSG_CLEAR_MESSAGE).sendToTarget();
+ mHandler.obtainMessage(MSG_CLEAR_MESSAGE, false /* requireTryAgain */).sendToTarget();
}
- public void showHelpMessage(String message) {
- showTemporaryMessage(message);
+ public void showHelpMessage(String message, boolean requireTryAgain) {
+ showTemporaryMessage(message, requireTryAgain);
}
public void showErrorMessage(String error) {
- showTemporaryMessage(error);
+ showTemporaryMessage(error, false /* requireTryAgain */);
showTryAgainButton(false /* show */);
mCallback.onErrorShown();
}
@@ -459,22 +463,11 @@ public abstract class BiometricDialogView extends LinearLayout {
}
public void showTryAgainButton(boolean show) {
- final Button tryAgain = mLayout.findViewById(R.id.button_try_again);
- if (show) {
- tryAgain.setVisibility(View.VISIBLE);
- } else {
- tryAgain.setVisibility(View.GONE);
- }
- }
-
- // Set the state before the window is attached, so we know if the dialog should be started
- // with or without the button. This is because there's no good onPause signal
- public void setPendingTryAgain(boolean show) {
- mPendingShowTryAgain = show;
}
- public void setPendingConfirm(boolean show) {
- mPendingShowConfirm = show;
+ public void restoreState(Bundle bundle) {
+ mTryAgainButton.setVisibility(bundle.getInt(KEY_TRY_AGAIN_VISIBILITY));
+ mPositiveButton.setVisibility(bundle.getInt(KEY_CONFIRM_VISIBILITY));
}
public WindowManager.LayoutParams getLayoutParams() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
index de3f9471a6ba..9fba44b76863 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
@@ -16,8 +16,18 @@
package com.android.systemui.biometrics;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ValueAnimator;
import android.content.Context;
+import android.graphics.Outline;
import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.ViewOutlineProvider;
import com.android.systemui.R;
@@ -28,13 +38,263 @@ import com.android.systemui.R;
*/
public class FaceDialogView extends BiometricDialogView {
+ private static final String TAG = "FaceDialogView";
+ private static final String KEY_DIALOG_SIZE = "key_dialog_size";
+
private static final int HIDE_DIALOG_DELAY = 500; // ms
+ private static final int IMPLICIT_Y_PADDING = 16; // dp
+ private static final int GROW_DURATION = 150; // ms
+ private static final int TEXT_ANIMATE_DISTANCE = 32; // dp
+
+ private static final int SIZE_UNKNOWN = 0;
+ private static final int SIZE_SMALL = 1;
+ private static final int SIZE_GROWING = 2;
+ private static final int SIZE_BIG = 3;
+
+ private int mSize;
+ private float mIconOriginalY;
+ private DialogOutlineProvider mOutlineProvider = new DialogOutlineProvider();
+
+ private final class DialogOutlineProvider extends ViewOutlineProvider {
+
+ float mY;
+
+ @Override
+ public void getOutline(View view, Outline outline) {
+ outline.setRoundRect(
+ 0 /* left */,
+ (int) mY, /* top */
+ mDialog.getWidth() /* right */,
+ mDialog.getBottom(), /* bottom */
+ getResources().getDimension(R.dimen.biometric_dialog_corner_size));
+ }
+
+ int calculateSmall() {
+ final float padding = dpToPixels(IMPLICIT_Y_PADDING);
+ return mDialog.getHeight() - mBiometricIcon.getHeight() - 2 * (int) padding;
+ }
+
+ void setOutlineY(float y) {
+ mY = y;
+ }
+ }
public FaceDialogView(Context context,
DialogViewCallback callback) {
super(context, callback);
}
+ private void updateSize(int newSize) {
+ final float padding = dpToPixels(IMPLICIT_Y_PADDING);
+ final float iconSmallPositionY = mDialog.getHeight() - mBiometricIcon.getHeight() - padding;
+
+ if (newSize == SIZE_SMALL) {
+ // These fields are required and/or always hold a spot on the UI, so should be set to
+ // INVISIBLE so they keep their position
+ mTitleText.setVisibility(View.INVISIBLE);
+ mErrorText.setVisibility(View.INVISIBLE);
+ mNegativeButton.setVisibility(View.INVISIBLE);
+
+ // These fields are optional, so set them to gone or invisible depending on their
+ // usage. If they're empty, they're already set to GONE in BiometricDialogView.
+ if (!TextUtils.isEmpty(mSubtitleText.getText())) {
+ mSubtitleText.setVisibility(View.INVISIBLE);
+ }
+ if (!TextUtils.isEmpty(mDescriptionText.getText())) {
+ mDescriptionText.setVisibility(View.INVISIBLE);
+ }
+
+ // Move the biometric icon to the small spot
+ mBiometricIcon.setY(iconSmallPositionY);
+
+ // Clip the dialog to the small size
+ mDialog.setOutlineProvider(mOutlineProvider);
+ mOutlineProvider.setOutlineY(mOutlineProvider.calculateSmall());
+
+ mDialog.setClipToOutline(true);
+ mDialog.invalidateOutline();
+
+ mSize = newSize;
+ } else if (mSize == SIZE_SMALL && newSize == SIZE_BIG) {
+ mSize = SIZE_GROWING;
+
+ // Animate the outline
+ final ValueAnimator outlineAnimator =
+ ValueAnimator.ofFloat(mOutlineProvider.calculateSmall(), 0);
+ outlineAnimator.addUpdateListener((animation) -> {
+ final float y = (float) animation.getAnimatedValue();
+ mOutlineProvider.setOutlineY(y);
+ mDialog.invalidateOutline();
+ });
+
+ // Animate the icon back to original big position
+ final ValueAnimator iconAnimator =
+ ValueAnimator.ofFloat(iconSmallPositionY, mIconOriginalY);
+ iconAnimator.addUpdateListener((animation) -> {
+ final float y = (float) animation.getAnimatedValue();
+ mBiometricIcon.setY(y);
+ });
+
+ // Animate the error text so it slides up with the icon
+ final ValueAnimator textSlideAnimator =
+ ValueAnimator.ofFloat(dpToPixels(TEXT_ANIMATE_DISTANCE), 0);
+ textSlideAnimator.addUpdateListener((animation) -> {
+ final float y = (float) animation.getAnimatedValue();
+ mErrorText.setTranslationY(y);
+ });
+
+ // Opacity animator for things that should fade in (title, subtitle, details, negative
+ // button)
+ final ValueAnimator opacityAnimator = ValueAnimator.ofFloat(0, 1);
+ opacityAnimator.addUpdateListener((animation) -> {
+ final float opacity = (float) animation.getAnimatedValue();
+
+ // These fields are required and/or always hold a spot on the UI
+ mTitleText.setAlpha(opacity);
+ mErrorText.setAlpha(opacity);
+ mNegativeButton.setAlpha(opacity);
+ mTryAgainButton.setAlpha(opacity);
+
+ // These fields are optional, so only animate them if they're supposed to be showing
+ if (!TextUtils.isEmpty(mSubtitleText.getText())) {
+ mSubtitleText.setAlpha(opacity);
+ }
+ if (!TextUtils.isEmpty(mDescriptionText.getText())) {
+ mDescriptionText.setAlpha(opacity);
+ }
+ });
+
+ // Choreograph together
+ final AnimatorSet as = new AnimatorSet();
+ as.setDuration(GROW_DURATION);
+ as.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ super.onAnimationStart(animation);
+ // Set the visibility of opacity-animating views back to VISIBLE
+ mTitleText.setVisibility(View.VISIBLE);
+ mErrorText.setVisibility(View.VISIBLE);
+ mNegativeButton.setVisibility(View.VISIBLE);
+ mTryAgainButton.setVisibility(View.VISIBLE);
+
+ if (!TextUtils.isEmpty(mSubtitleText.getText())) {
+ mSubtitleText.setVisibility(View.VISIBLE);
+ }
+ if (!TextUtils.isEmpty(mDescriptionText.getText())) {
+ mDescriptionText.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ mSize = SIZE_BIG;
+ }
+ });
+ as.play(outlineAnimator).with(iconAnimator).with(opacityAnimator)
+ .with(textSlideAnimator);
+ as.start();
+ } else if (mSize == SIZE_BIG) {
+ mDialog.setClipToOutline(false);
+ mDialog.invalidateOutline();
+
+ mBiometricIcon.setY(mIconOriginalY);
+
+ mSize = newSize;
+ }
+ }
+
+ @Override
+ public void onSaveState(Bundle bundle) {
+ super.onSaveState(bundle);
+ bundle.putInt(KEY_DIALOG_SIZE, mSize);
+ }
+
+
+ @Override
+ protected void handleClearMessage(boolean requireTryAgain) {
+ // Clears the temporary message and shows the help message. If requireTryAgain is true,
+ // we will start the authenticating state again.
+ if (!requireTryAgain) {
+ updateState(STATE_AUTHENTICATING);
+ mErrorText.setText(getHintStringResourceId());
+ mErrorText.setTextColor(mTextColor);
+ mErrorText.setVisibility(View.VISIBLE);
+ } else {
+ updateState(STATE_IDLE);
+ mErrorText.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ @Override
+ public void restoreState(Bundle bundle) {
+ super.restoreState(bundle);
+ // Keep in mind that this happens before onAttachedToWindow()
+ mSize = bundle.getInt(KEY_DIALOG_SIZE);
+ }
+
+ /**
+ * Do small/big layout here instead of onAttachedToWindow, since:
+ * 1) We need the big layout to be measured, etc for small -> big animation
+ * 2) We need the dialog measurements to know where to move the biometric icon to
+ *
+ * BiometricDialogView already sets the views to their default big state, so here we only
+ * need to hide the ones that are unnecessary.
+ */
+ @Override
+ public void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+
+ if (mIconOriginalY == 0) {
+ mIconOriginalY = mBiometricIcon.getY();
+ }
+
+ // UNKNOWN means size hasn't been set yet. First time we create the dialog.
+ // onLayout can happen when visibility of views change (during animation, etc).
+ if (mSize != SIZE_UNKNOWN) {
+ // Probably not the cleanest way to do this, but since dialog is big by default,
+ // and small dialogs can persist across orientation changes, we need to set it to
+ // small size here again.
+ if (mSize == SIZE_SMALL) {
+ updateSize(SIZE_SMALL);
+ }
+ return;
+ }
+
+ // If we don't require confirmation, show the small dialog first (until errors occur).
+ if (!requiresConfirmation()) {
+ updateSize(SIZE_SMALL);
+ } else {
+ updateSize(SIZE_BIG);
+ }
+ }
+
+ @Override
+ public void showErrorMessage(String error) {
+ super.showErrorMessage(error);
+
+ // All error messages will cause the dialog to go from small -> big. Error messages
+ // are messages such as lockout, auth failed, etc.
+ if (mSize == SIZE_SMALL) {
+ updateSize(SIZE_BIG);
+ }
+ }
+
+ @Override
+ public void showTryAgainButton(boolean show) {
+ if (show && mSize == SIZE_SMALL) {
+ // Do not call super, we will nicely animate the alpha together with the rest
+ // of the elements in here.
+ updateSize(SIZE_BIG);
+ } else {
+ if (show) {
+ mTryAgainButton.setVisibility(View.VISIBLE);
+ } else {
+ mTryAgainButton.setVisibility(View.GONE);
+ }
+ }
+ }
+
@Override
protected int getHintStringResourceId() {
return R.string.face_dialog_looking_for_face;
@@ -56,7 +316,9 @@ public class FaceDialogView extends BiometricDialogView {
@Override
protected boolean shouldAnimateForTransition(int oldState, int newState) {
- if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) {
+ if (oldState == STATE_ERROR && newState == STATE_IDLE) {
+ return true;
+ } else if (oldState == STATE_IDLE && newState == STATE_AUTHENTICATING) {
return false;
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) {
return true;
@@ -78,9 +340,19 @@ public class FaceDialogView extends BiometricDialogView {
}
@Override
+ protected boolean shouldGrayAreaDismissDialog() {
+ if (mSize == SIZE_SMALL) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
protected Drawable getAnimationForTransition(int oldState, int newState) {
int iconRes;
- if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) {
+ if (oldState == STATE_ERROR && newState == STATE_IDLE) {
+ iconRes = R.drawable.face_dialog_error_to_face;
+ } else if (oldState == STATE_IDLE && newState == STATE_AUTHENTICATING) {
iconRes = R.drawable.face_dialog_face_to_error;
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) {
iconRes = R.drawable.face_dialog_face_to_error;
@@ -97,4 +369,14 @@ public class FaceDialogView extends BiometricDialogView {
}
return mContext.getDrawable(iconRes);
}
+
+ private float dpToPixels(float dp) {
+ return dp * ((float) mContext.getResources().getDisplayMetrics().densityDpi
+ / DisplayMetrics.DENSITY_DEFAULT);
+ }
+
+ private float pixelsToDp(float pixels) {
+ return pixels / ((float) mContext.getResources().getDisplayMetrics().densityDpi
+ / DisplayMetrics.DENSITY_DEFAULT);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java
index 1a6cee281c84..c9b30ba3ce8d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java
@@ -32,6 +32,14 @@ public class FingerprintDialogView extends BiometricDialogView {
DialogViewCallback callback) {
super(context, callback);
}
+
+ @Override
+ protected void handleClearMessage(boolean requireTryAgain) {
+ updateState(STATE_AUTHENTICATING);
+ mErrorText.setText(getHintStringResourceId());
+ mErrorText.setTextColor(mTextColor);
+ }
+
@Override
protected int getHintStringResourceId() {
return R.string.fingerprint_dialog_touch_sensor;
@@ -49,7 +57,7 @@ public class FingerprintDialogView extends BiometricDialogView {
@Override
protected boolean shouldAnimateForTransition(int oldState, int newState) {
- if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) {
+ if (oldState == STATE_IDLE && newState == STATE_AUTHENTICATING) {
return false;
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) {
return true;
@@ -68,9 +76,15 @@ public class FingerprintDialogView extends BiometricDialogView {
}
@Override
+ protected boolean shouldGrayAreaDismissDialog() {
+ // Fingerprint dialog always dismisses when region outside the dialog is tapped
+ return true;
+ }
+
+ @Override
protected Drawable getAnimationForTransition(int oldState, int newState) {
int iconRes;
- if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) {
+ if (oldState == STATE_IDLE && newState == STATE_AUTHENTICATING) {
iconRes = R.drawable.fingerprint_dialog_fp_to_error;
} else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) {
iconRes = R.drawable.fingerprint_dialog_fp_to_error;
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java
new file mode 100644
index 000000000000..845b08483064
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 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.bubbles;
+
+import static android.graphics.Paint.ANTI_ALIAS_FLAG;
+import static android.graphics.Paint.FILTER_BITMAP_FLAG;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.util.Log;
+
+// XXX: Mostly opied from launcher code / can we share?
+/**
+ * Contains parameters necessary to draw a badge for an icon (e.g. the size of the badge).
+ */
+public class BadgeRenderer {
+
+ private static final String TAG = "BadgeRenderer";
+
+ // The badge sizes are defined as percentages of the app icon size.
+ private static final float SIZE_PERCENTAGE = 0.38f;
+
+ // Extra scale down of the dot
+ private static final float DOT_SCALE = 0.6f;
+
+ private final float mDotCenterOffset;
+ private final float mCircleRadius;
+ private final Paint mCirclePaint = new Paint(ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG);
+
+ public BadgeRenderer(int iconSizePx) {
+ mDotCenterOffset = SIZE_PERCENTAGE * iconSizePx;
+ int size = (int) (DOT_SCALE * mDotCenterOffset);
+ mCircleRadius = size / 2f;
+ }
+
+ /**
+ * Draw a circle in the top right corner of the given bounds.
+ *
+ * @param color The color (based on the icon) to use for the badge.
+ * @param iconBounds The bounds of the icon being badged.
+ * @param badgeScale The progress of the animation, from 0 to 1.
+ * @param spaceForOffset How much space to offset the badge up and to the left or right.
+ * @param onLeft Whether the badge should be draw on left or right side.
+ */
+ public void draw(Canvas canvas, int color, Rect iconBounds, float badgeScale,
+ Point spaceForOffset, boolean onLeft) {
+ if (iconBounds == null) {
+ Log.e(TAG, "Invalid null argument(s) passed in call to draw.");
+ return;
+ }
+ canvas.save();
+ // We draw the badge relative to its center.
+ int x = onLeft ? iconBounds.left : iconBounds.right;
+ float offset = onLeft ? (mDotCenterOffset / 2) : -(mDotCenterOffset / 2);
+ float badgeCenterX = x + offset;
+ float badgeCenterY = iconBounds.top + mDotCenterOffset / 2;
+
+ canvas.translate(badgeCenterX + spaceForOffset.x, badgeCenterY - spaceForOffset.y);
+
+ canvas.scale(badgeScale, badgeScale);
+ mCirclePaint.setColor(color);
+ canvas.drawCircle(0, 0, mCircleRadius, mCirclePaint);
+ canvas.restore();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
new file mode 100644
index 000000000000..92d3cc1ae34f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 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.bubbles;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import com.android.systemui.R;
+
+/**
+ * View that circle crops its contents and supports displaying a coloured dot on a top corner.
+ */
+public class BadgedImageView extends ImageView {
+
+ private BadgeRenderer mDotRenderer;
+ private int mIconSize;
+ private Rect mTempBounds = new Rect();
+ private Point mTempPoint = new Point();
+ private Path mClipPath = new Path();
+
+ private float mDotScale = 0f;
+ private int mUpdateDotColor;
+ private boolean mShowUpdateDot;
+ private boolean mOnLeft;
+
+ public BadgedImageView(Context context) {
+ this(context, null);
+ }
+
+ public BadgedImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ setScaleType(ScaleType.CENTER_CROP);
+ mIconSize = getResources().getDimensionPixelSize(R.dimen.bubble_size);
+ mDotRenderer = new BadgeRenderer(mIconSize);
+ }
+
+ // TODO: Clipping oval path isn't great: rerender image into a separate, rounded bitmap and
+ // then draw would be better
+ @Override
+ public void onDraw(Canvas canvas) {
+ canvas.save();
+ // Circle crop
+ mClipPath.addOval(getPaddingStart(), getPaddingTop(),
+ getWidth() - getPaddingEnd(), getHeight() - getPaddingBottom(), Path.Direction.CW);
+ canvas.clipPath(mClipPath);
+ super.onDraw(canvas);
+
+ // After we've circle cropped what we're showing, restore so we don't clip the badge
+ canvas.restore();
+
+ // Draw the badge
+ if (mShowUpdateDot) {
+ getDrawingRect(mTempBounds);
+ mTempPoint.set((getWidth() - mIconSize) / 2, getPaddingTop());
+ mDotRenderer.draw(canvas, mUpdateDotColor, mTempBounds, mDotScale, mTempPoint,
+ mOnLeft);
+ }
+ }
+
+ /**
+ * Set whether the dot should appear on left or right side of the view.
+ */
+ public void setDotPosition(boolean onLeft) {
+ mOnLeft = onLeft;
+ invalidate();
+ }
+
+ /**
+ * Set whether the dot should show or not.
+ */
+ public void setShowDot(boolean showBadge) {
+ mShowUpdateDot = showBadge;
+ invalidate();
+ }
+
+ /**
+ * @return whether the dot is being displayed.
+ */
+ public boolean isShowingDot() {
+ return mShowUpdateDot;
+ }
+
+ /**
+ * The colour to use for the dot.
+ */
+ public void setDotColor(int color) {
+ mUpdateDotColor = color;
+ invalidate();
+ }
+
+ /**
+ * How big the dot should be, fraction from 0 to 1.
+ */
+ public void setDotScale(float fraction) {
+ mDotScale = fraction;
+ invalidate();
+ }
+
+ public float getDotScale() {
+ return mDotScale;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index 881aa18285ff..957d772be730 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -21,25 +21,42 @@ import static android.view.View.VISIBLE;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static com.android.systemui.bubbles.BubbleMovementHelper.EDGE_OVERLAP;
+import static com.android.systemui.statusbar.StatusBarState.SHADE;
+import static com.android.systemui.statusbar.notification.NotificationAlertingManager.alertAgain;
+import android.annotation.Nullable;
+import android.app.INotificationManager;
import android.app.Notification;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
+import android.util.Log;
+import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.notification.NotificationEntryListener;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.NotificationInflater;
import com.android.systemui.statusbar.phone.StatusBarWindowController;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -57,45 +74,36 @@ public class BubbleController {
private static final String TAG = "BubbleController";
// Enables some subset of notifs to automatically become bubbles
- public static final boolean DEBUG_ENABLE_AUTO_BUBBLE = false;
- // When a bubble is dismissed, recreate it as a notification
- public static final boolean DEBUG_DEMOTE_TO_NOTIF = false;
+ private static final boolean DEBUG_ENABLE_AUTO_BUBBLE = false;
// Secure settings
private static final String ENABLE_AUTO_BUBBLE_MESSAGES = "experiment_autobubble_messaging";
private static final String ENABLE_AUTO_BUBBLE_ONGOING = "experiment_autobubble_ongoing";
private static final String ENABLE_AUTO_BUBBLE_ALL = "experiment_autobubble_all";
+ private static final String ENABLE_BUBBLE_ACTIVITY_VIEW = "experiment_bubble_activity_view";
+ private static final String ENABLE_BUBBLE_CONTENT_INTENT = "experiment_bubble_content_intent";
- private Context mContext;
- private BubbleDismissListener mDismissListener;
+ private final Context mContext;
+ private final NotificationEntryManager mNotificationEntryManager;
private BubbleStateChangeListener mStateChangeListener;
private BubbleExpandListener mExpandListener;
+ private LayoutInflater mInflater;
- private Map<String, BubbleView> mBubbles = new HashMap<>();
+ private final Map<String, BubbleView> mBubbles = new HashMap<>();
private BubbleStackView mStackView;
- private Point mDisplaySize;
+ private final Point mDisplaySize;
// Bubbles get added to the status bar view
- @VisibleForTesting
- protected StatusBarWindowController mStatusBarWindowController;
+ private final StatusBarWindowController mStatusBarWindowController;
+ private StatusBarStateListener mStatusBarStateListener;
- // Used for determining view rect for touch interaction
- private Rect mTempRect = new Rect();
+ private final NotificationInterruptionStateProvider mNotificationInterruptionStateProvider =
+ Dependency.get(NotificationInterruptionStateProvider.class);
- /**
- * Listener to find out about bubble / bubble stack dismissal events.
- */
- public interface BubbleDismissListener {
- /**
- * Called when the entire stack of bubbles is dismissed by the user.
- */
- void onStackDismissed();
+ private INotificationManager mNotificationManagerService;
- /**
- * Called when a specific bubble is dismissed by the user.
- */
- void onBubbleDismissed(String key);
- }
+ // Used for determining view rect for touch interaction
+ private Rect mTempRect = new Rect();
/**
* Listener to be notified when some states of the bubbles change.
@@ -113,11 +121,30 @@ public class BubbleController {
public interface BubbleExpandListener {
/**
* Called when the expansion state of the bubble stack changes.
- *
* @param isExpanding whether it's expanding or collapsing
- * @param amount fraction of how expanded or collapsed it is, 1 being fully, 0 at the start
+ * @param key the notification key associated with bubble being expanded
*/
- void onBubbleExpandChanged(boolean isExpanding, float amount);
+ void onBubbleExpandChanged(boolean isExpanding, String key);
+ }
+
+ /**
+ * Listens for the current state of the status bar and updates the visibility state
+ * of bubbles as needed.
+ */
+ private class StatusBarStateListener implements StatusBarStateController.StateListener {
+ private int mState;
+ /**
+ * Returns the current status bar state.
+ */
+ public int getCurrentState() {
+ return mState;
+ }
+
+ @Override
+ public void onStateChanged(int newState) {
+ mState = newState;
+ updateVisibility();
+ }
}
@Inject
@@ -126,14 +153,21 @@ public class BubbleController {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDisplaySize = new Point();
wm.getDefaultDisplay().getSize(mDisplaySize);
- mStatusBarWindowController = statusBarWindowController;
- }
+ mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- /**
- * Set a listener to be notified of bubble dismissal events.
- */
- public void setDismissListener(BubbleDismissListener listener) {
- mDismissListener = listener;
+ mNotificationEntryManager = Dependency.get(NotificationEntryManager.class);
+ mNotificationEntryManager.addNotificationEntryListener(mEntryListener);
+
+ try {
+ mNotificationManagerService = INotificationManager.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.NOTIFICATION_SERVICE));
+ } catch (ServiceManager.ServiceNotFoundException e) {
+ e.printStackTrace();
+ }
+
+ mStatusBarWindowController = statusBarWindowController;
+ mStatusBarStateListener = new StatusBarStateListener();
+ Dependency.get(StatusBarStateController.class).addCallback(mStatusBarStateListener);
}
/**
@@ -158,7 +192,12 @@ public class BubbleController {
* screen (e.g. if on AOD).
*/
public boolean hasBubbles() {
- return mBubbles.size() > 0;
+ for (BubbleView bv : mBubbles.values()) {
+ if (!bv.getEntry().isBubbleDismissed()) {
+ return true;
+ }
+ }
+ return false;
}
/**
@@ -173,43 +212,43 @@ public class BubbleController {
*/
public void collapseStack() {
if (mStackView != null) {
- mStackView.animateExpansion(false);
+ mStackView.collapseStack();
}
}
/**
* Tell the stack of bubbles to be dismissed, this will remove all of the bubbles in the stack.
*/
- public void dismissStack() {
+ void dismissStack() {
if (mStackView == null) {
return;
}
- Point startPoint = getStartPoint(mStackView.getStackWidth(), mDisplaySize);
+ Set<String> keys = mBubbles.keySet();
+ for (String key: keys) {
+ mBubbles.get(key).getEntry().setBubbleDismissed(true);
+ }
+ mStackView.stackDismissed();
+
// Reset the position of the stack (TODO - or should we save / respect last user position?)
+ Point startPoint = getStartPoint(mStackView.getStackWidth(), mDisplaySize);
mStackView.setPosition(startPoint.x, startPoint.y);
- for (String key: mBubbles.keySet()) {
- removeBubble(key);
- }
- if (mDismissListener != null) {
- mDismissListener.onStackDismissed();
- }
- updateBubblesShowing();
+
+ updateVisibility();
+ mNotificationEntryManager.updateNotifications();
}
/**
- * Adds a bubble associated with the provided notification entry or updates it if it exists.
+ * Adds or updates a bubble associated with the provided notification entry.
+ *
+ * @param notif the notification associated with this bubble.
+ * @param updatePosition whether this update should promote the bubble to the top of the stack.
*/
- public void addBubble(NotificationData.Entry notif) {
+ public void updateBubble(NotificationEntry notif, boolean updatePosition) {
if (mBubbles.containsKey(notif.key)) {
// It's an update
BubbleView bubble = mBubbles.get(notif.key);
- mStackView.updateBubble(bubble, notif);
+ mStackView.updateBubble(bubble, notif, updatePosition);
} else {
- // It's new
- BubbleView bubble = new BubbleView(mContext);
- bubble.setNotif(notif);
- mBubbles.put(bubble.getKey(), bubble);
-
boolean setPosition = mStackView != null && mStackView.getVisibility() != VISIBLE;
if (mStackView == null) {
setPosition = true;
@@ -224,75 +263,134 @@ public class BubbleController {
mStackView.setExpandListener(mExpandListener);
}
}
+ // It's new
+ BubbleView bubble = (BubbleView) mInflater.inflate(
+ R.layout.bubble_view, mStackView, false /* attachToRoot */);
+ bubble.setNotif(notif);
+ if (shouldUseActivityView(mContext)) {
+ bubble.setAppOverlayIntent(getAppOverlayIntent(notif));
+ }
+ mBubbles.put(bubble.getKey(), bubble);
mStackView.addBubble(bubble);
if (setPosition) {
// Need to add the bubble to the stack before we can know the width
Point startPoint = getStartPoint(mStackView.getStackWidth(), mDisplaySize);
mStackView.setPosition(startPoint.x, startPoint.y);
- mStackView.setVisibility(VISIBLE);
}
- updateBubblesShowing();
}
+ updateVisibility();
+ }
+
+ @Nullable
+ private PendingIntent getAppOverlayIntent(NotificationEntry notif) {
+ Notification notification = notif.notification.getNotification();
+ if (canLaunchInActivityView(notification.getBubbleMetadata() != null
+ ? notification.getBubbleMetadata().getIntent() : null)) {
+ return notification.getBubbleMetadata().getIntent();
+ } else if (shouldUseContentIntent(mContext)
+ && canLaunchInActivityView(notification.contentIntent)) {
+ Log.d(TAG, "[addBubble " + notif.key
+ + "]: No appOverlayIntent, using contentIntent.");
+ return notification.contentIntent;
+ }
+ Log.d(TAG, "[addBubble " + notif.key + "]: No supported intent for ActivityView.");
+ return null;
}
/**
* Removes the bubble associated with the {@param uri}.
*/
- public void removeBubble(String key) {
- BubbleView bv = mBubbles.get(key);
+ void removeBubble(String key) {
+ BubbleView bv = mBubbles.remove(key);
if (mStackView != null && bv != null) {
mStackView.removeBubble(bv);
- bv.getEntry().setBubbleDismissed(true);
+ bv.destroyActivityView(mStackView);
}
- if (mDismissListener != null) {
- mDismissListener.onBubbleDismissed(key);
+
+ NotificationEntry entry = bv != null ? bv.getEntry() : null;
+ if (entry != null) {
+ entry.setBubbleDismissed(true);
+ mNotificationEntryManager.updateNotifications();
}
- updateBubblesShowing();
+ updateVisibility();
}
- private void updateBubblesShowing() {
- boolean hasBubblesShowing = false;
- for (BubbleView bv : mBubbles.values()) {
- if (!bv.getEntry().isBubbleDismissed()) {
- hasBubblesShowing = true;
- break;
+ @SuppressWarnings("FieldCanBeLocal")
+ private final NotificationEntryListener mEntryListener = new NotificationEntryListener() {
+ @Override
+ public void onPendingEntryAdded(NotificationEntry entry) {
+ if (shouldAutoBubble(mContext, entry) || shouldBubble(entry)) {
+ // TODO: handle group summaries
+ // It's a new notif, it shows in the shade and as a bubble
+ entry.setIsBubble(true);
+ entry.setShowInShadeWhenBubble(true);
}
}
- boolean hadBubbles = mStatusBarWindowController.getBubblesShowing();
- mStatusBarWindowController.setBubblesShowing(hasBubblesShowing);
- if (mStackView != null && !hasBubblesShowing) {
- mStackView.setVisibility(INVISIBLE);
+
+ @Override
+ public void onEntryInflated(NotificationEntry entry,
+ @NotificationInflater.InflationFlag int inflatedFlags) {
+ if (entry.isBubble() && mNotificationInterruptionStateProvider.shouldBubbleUp(entry)) {
+ updateBubble(entry, true /* updatePosition */);
+ }
}
- if (mStateChangeListener != null && hadBubbles != hasBubblesShowing) {
- mStateChangeListener.onHasBubblesChanged(hasBubblesShowing);
+
+ @Override
+ public void onPreEntryUpdated(NotificationEntry entry) {
+ if (mNotificationInterruptionStateProvider.shouldBubbleUp(entry)
+ && alertAgain(entry, entry.notification.getNotification())) {
+ entry.setShowInShadeWhenBubble(true);
+ entry.setBubbleDismissed(false); // updates come back as bubbles even if dismissed
+ if (mBubbles.containsKey(entry.key)) {
+ mBubbles.get(entry.key).updateDotVisibility();
+ }
+ updateBubble(entry, true /* updatePosition */);
+ }
}
- }
+
+ @Override
+ public void onEntryRemoved(NotificationEntry entry,
+ @Nullable NotificationVisibility visibility,
+ boolean removedByUser) {
+ entry.setShowInShadeWhenBubble(false);
+ if (mBubbles.containsKey(entry.key)) {
+ mBubbles.get(entry.key).updateDotVisibility();
+ }
+ if (!removedByUser) {
+ // This was a cancel so we should remove the bubble
+ removeBubble(entry.key);
+ }
+ }
+ };
/**
- * Sets the visibility of the bubbles, doesn't un-bubble them, just changes visibility.
+ * Lets any listeners know if bubble state has changed.
*/
- public void updateVisibility(boolean visible) {
+ private void updateBubblesShowing() {
if (mStackView == null) {
return;
}
- ArrayList<BubbleView> viewsToRemove = new ArrayList<>();
- for (BubbleView bv : mBubbles.values()) {
- NotificationData.Entry entry = bv.getEntry();
- if (entry != null) {
- if (entry.isRowRemoved() || entry.isBubbleDismissed() || entry.isRowDismissed()) {
- viewsToRemove.add(bv);
- }
- }
- }
- for (BubbleView view : viewsToRemove) {
- mBubbles.remove(view.getKey());
- mStackView.removeBubble(view);
+
+ boolean hadBubbles = mStatusBarWindowController.getBubblesShowing();
+ boolean hasBubblesShowing = hasBubbles() && mStackView.getVisibility() == VISIBLE;
+ mStatusBarWindowController.setBubblesShowing(hasBubblesShowing);
+ if (mStateChangeListener != null && hadBubbles != hasBubblesShowing) {
+ mStateChangeListener.onHasBubblesChanged(hasBubblesShowing);
}
- if (mStackView != null) {
- mStackView.setVisibility(visible ? VISIBLE : INVISIBLE);
- if (!visible) {
- collapseStack();
- }
+ }
+
+ /**
+ * Updates the visibility of the bubbles based on current state.
+ * Does not un-bubble, just hides or un-hides. Will notify any
+ * {@link BubbleStateChangeListener}s if visibility changes.
+ */
+ public void updateVisibility() {
+ if (mStatusBarStateListener.getCurrentState() == SHADE && hasBubbles()) {
+ // Bubbles only appear in unlocked shade
+ mStackView.setVisibility(hasBubbles() ? VISIBLE : INVISIBLE);
+ } else if (mStackView != null) {
+ mStackView.setVisibility(INVISIBLE);
+ collapseStack();
}
updateBubblesShowing();
}
@@ -308,8 +406,19 @@ public class BubbleController {
return mTempRect;
}
+ private boolean canLaunchInActivityView(PendingIntent intent) {
+ if (intent == null) {
+ return false;
+ }
+ ActivityInfo info =
+ intent.getIntent().resolveActivityInfo(mContext.getPackageManager(), 0);
+ return info != null
+ && ActivityInfo.isResizeableMode(info.resizeMode)
+ && (info.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) != 0;
+ }
+
@VisibleForTesting
- public BubbleStackView getStackView() {
+ BubbleStackView getStackView() {
return mStackView;
}
@@ -317,7 +426,7 @@ public class BubbleController {
/**
* Gets an appropriate starting point to position the bubble stack.
*/
- public static Point getStartPoint(int size, Point displaySize) {
+ private static Point getStartPoint(int size, Point displaySize) {
final int x = displaySize.x - size + EDGE_OVERLAP;
final int y = displaySize.y / 4;
return new Point(x, y);
@@ -326,24 +435,48 @@ public class BubbleController {
/**
* Gets an appropriate position for the bubble when the stack is expanded.
*/
- public static Point getExpandPoint(BubbleStackView view, int size, Point displaySize) {
+ static Point getExpandPoint(BubbleStackView view, int size, Point displaySize) {
// Same place for now..
return new Point(EDGE_OVERLAP, size);
}
/**
- * Whether the notification should bubble or not.
+ * Whether the notification has been developer configured to bubble and is allowed by the user.
*/
- public static boolean shouldAutoBubble(Context context, NotificationData.Entry entry) {
+ private boolean shouldBubble(NotificationEntry entry) {
+ StatusBarNotification n = entry.notification;
+ boolean canAppOverlay = false;
+ try {
+ canAppOverlay = mNotificationManagerService.areBubblesAllowedForPackage(
+ n.getPackageName(), n.getUid());
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error calling NoMan to determine if app can overlay", e);
+ }
+
+ boolean canChannelOverlay = mNotificationEntryManager.getNotificationData().getChannel(
+ entry.key).canBubble();
+ boolean hasOverlayIntent = n.getNotification().getBubbleMetadata() != null
+ && n.getNotification().getBubbleMetadata().getIntent() != null;
+ return hasOverlayIntent && canChannelOverlay && canAppOverlay;
+ }
+
+ /**
+ * Whether the notification should bubble or not. Gated by debug flag.
+ * <p>
+ * If a notification has been set to bubble via proper bubble APIs or if it is an important
+ * message-like notification.
+ * </p>
+ */
+ private boolean shouldAutoBubble(Context context, NotificationEntry entry) {
if (entry.isBubbleDismissed()) {
return false;
}
+ StatusBarNotification n = entry.notification;
boolean autoBubbleMessages = shouldAutoBubbleMessages(context) || DEBUG_ENABLE_AUTO_BUBBLE;
boolean autoBubbleOngoing = shouldAutoBubbleOngoing(context) || DEBUG_ENABLE_AUTO_BUBBLE;
boolean autoBubbleAll = shouldAutoBubbleAll(context) || DEBUG_ENABLE_AUTO_BUBBLE;
- StatusBarNotification n = entry.notification;
boolean hasRemoteInput = false;
if (n.getNotification().actions != null) {
for (Notification.Action action : n.getNotification().actions) {
@@ -380,4 +513,14 @@ public class BubbleController {
return Settings.Secure.getInt(context.getContentResolver(),
ENABLE_AUTO_BUBBLE_ALL, 0) != 0;
}
+
+ private static boolean shouldUseActivityView(Context context) {
+ return Settings.Secure.getInt(context.getContentResolver(),
+ ENABLE_BUBBLE_ACTIVITY_VIEW, 0) != 0;
+ }
+
+ private static boolean shouldUseContentIntent(Context context) {
+ return Settings.Secure.getInt(context.getContentResolver(),
+ ENABLE_BUBBLE_CONTENT_INTENT, 0) != 0;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
index e28d96b2def9..71ae1f8620f6 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
@@ -21,9 +21,11 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
+import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.recents.TriangleShape;
@@ -35,6 +37,8 @@ public class BubbleExpandedViewContainer extends LinearLayout {
// The triangle pointing to the expanded view
private View mPointerView;
+ // The view displayed between the pointer and the expanded view
+ private TextView mHeaderView;
// The view that is being displayed for the expanded state
private View mExpandedView;
@@ -68,6 +72,7 @@ public class BubbleExpandedViewContainer extends LinearLayout {
TriangleShape.create(width, height, true /* pointUp */));
triangleDrawable.setTint(Color.WHITE); // TODO: dark mode
mPointerView.setBackground(triangleDrawable);
+ mHeaderView = findViewById(R.id.bubble_content_header);
}
/**
@@ -80,9 +85,20 @@ public class BubbleExpandedViewContainer extends LinearLayout {
}
/**
+ * Set the text displayed within the header.
+ */
+ public void setHeaderText(CharSequence text) {
+ mHeaderView.setText(text);
+ mHeaderView.setVisibility(TextUtils.isEmpty(text) ? GONE : VISIBLE);
+ }
+
+ /**
* Set the view to display for the expanded state. Passing null will clear the view.
*/
public void setExpandedView(View view) {
+ if (mExpandedView == view) {
+ return;
+ }
if (mExpandedView != null) {
removeView(mExpandedView);
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index dfd18b23a5e3..9a11b965b319 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -21,10 +21,13 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
+import android.app.ActivityView;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.RectF;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -40,7 +43,7 @@ import androidx.annotation.Nullable;
import com.android.internal.widget.ViewClippingUtil;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
import com.android.systemui.statusbar.notification.stack.ViewState;
@@ -50,6 +53,7 @@ import com.android.systemui.statusbar.notification.stack.ViewState;
*/
public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.FloatingView {
+ private static final String TAG = "BubbleStackView";
private Point mDisplaySize;
private FrameLayout mBubbleContainer;
@@ -59,9 +63,10 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
private int mBubblePadding;
private boolean mIsExpanded;
+ private int mExpandedBubbleHeight;
+ private BubbleTouchHandler mTouchHandler;
private BubbleView mExpandedBubble;
private Point mCollapsedPosition;
- private BubbleTouchHandler mTouchHandler;
private BubbleController.BubbleExpandListener mExpandListener;
private boolean mViewUpdatedRequested = false;
@@ -106,6 +111,7 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
mBubbleSize = res.getDimensionPixelSize(R.dimen.bubble_size);
mBubblePadding = res.getDimensionPixelSize(R.dimen.bubble_padding);
+ mExpandedBubbleHeight = res.getDimensionPixelSize(R.dimen.bubble_expanded_default_height);
mDisplaySize = new Point();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getSize(mDisplaySize);
@@ -205,13 +211,24 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
*/
public void setExpandedBubble(BubbleView bubbleToExpand) {
mExpandedBubble = bubbleToExpand;
+ boolean prevExpanded = mIsExpanded;
mIsExpanded = true;
- updateExpandedBubble();
- requestUpdate();
+ if (!prevExpanded) {
+ // If we weren't previously expanded we should animate open.
+ animateExpansion(true /* expand */);
+ } else {
+ // If we were expanded just update the views
+ updateExpandedBubble();
+ requestUpdate();
+ }
+ mExpandedBubble.getEntry().setShowInShadeWhenBubble(false);
+ notifyExpansionChanged(mExpandedBubble, true /* expanded */);
}
/**
- * Adds a bubble to the stack.
+ * Adds a bubble to the top of the stack.
+ *
+ * @param bubbleView the view to add to the stack.
*/
public void addBubble(BubbleView bubbleView) {
mBubbleContainer.addView(bubbleView, 0,
@@ -228,17 +245,26 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
mBubbleContainer.removeView(bubbleView);
boolean wasExpanded = mIsExpanded;
int bubbleCount = mBubbleContainer.getChildCount();
- if (bubbleView.equals(mExpandedBubble) && bubbleCount > 0) {
+ if (mIsExpanded && bubbleView.equals(mExpandedBubble) && bubbleCount > 0) {
// If we have other bubbles and are expanded go to the next one or previous
// if the bubble removed was last
int nextIndex = bubbleCount > removedIndex ? removedIndex : bubbleCount - 1;
- mExpandedBubble = (BubbleView) mBubbleContainer.getChildAt(nextIndex);
+ BubbleView expandedBubble = (BubbleView) mBubbleContainer.getChildAt(nextIndex);
+ setExpandedBubble(expandedBubble);
}
mIsExpanded = wasExpanded && mBubbleContainer.getChildCount() > 0;
- requestUpdate();
- if (wasExpanded && !mIsExpanded && mExpandListener != null) {
- mExpandListener.onBubbleExpandChanged(mIsExpanded, 1 /* amount */);
+ if (wasExpanded != mIsExpanded) {
+ notifyExpansionChanged(mExpandedBubble, mIsExpanded);
}
+ requestUpdate();
+ }
+
+ /**
+ * Dismiss the stack of bubbles.
+ */
+ public void stackDismissed() {
+ collapseStack();
+ mBubbleContainer.removeAllViews();
}
/**
@@ -246,11 +272,19 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
*
* @param bubbleView the view to update in the stack.
* @param entry the entry to update it with.
+ * @param updatePosition whether this bubble should be moved to top of the stack.
*/
- public void updateBubble(BubbleView bubbleView, NotificationData.Entry entry) {
- // TODO - move to top of bubble stack, make it show its update if it makes sense
+ public void updateBubble(BubbleView bubbleView, NotificationEntry entry,
+ boolean updatePosition) {
bubbleView.update(entry);
- if (bubbleView.equals(mExpandedBubble)) {
+ if (updatePosition && !mIsExpanded) {
+ // If alerting it gets promoted to top of the stack
+ mBubbleContainer.removeView(bubbleView);
+ mBubbleContainer.addView(bubbleView, 0);
+ requestUpdate();
+ }
+ if (mIsExpanded && bubbleView.equals(mExpandedBubble)) {
+ entry.setShowInShadeWhenBubble(false);
requestUpdate();
}
}
@@ -281,17 +315,36 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
}
/**
+ * Collapses the stack of bubbles.
+ */
+ public void collapseStack() {
+ if (mIsExpanded) {
+ // TODO: Save opened bubble & move it to top of stack
+ animateExpansion(false /* shouldExpand */);
+ notifyExpansionChanged(mExpandedBubble, mIsExpanded);
+ }
+ }
+
+ /**
+ * Expands the stack fo bubbles.
+ */
+ public void expandStack() {
+ if (!mIsExpanded) {
+ mExpandedBubble = getTopBubble();
+ mExpandedBubble.getEntry().setShowInShadeWhenBubble(false);
+ animateExpansion(true /* shouldExpand */);
+ notifyExpansionChanged(mExpandedBubble, true /* expanded */);
+ }
+ }
+
+ /**
* Tell the stack to animate to collapsed or expanded state.
*/
- public void animateExpansion(boolean shouldExpand) {
+ private void animateExpansion(boolean shouldExpand) {
if (mIsExpanded != shouldExpand) {
mIsExpanded = shouldExpand;
- mExpandedBubble = shouldExpand ? getTopBubble() : null;
updateExpandedBubble();
- if (mExpandListener != null) {
- mExpandListener.onBubbleExpandChanged(mIsExpanded, 1 /* amount */);
- }
if (shouldExpand) {
// Save current position so that we might return there
savePosition();
@@ -341,6 +394,13 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
mCollapsedPosition = getPosition();
}
+ private void notifyExpansionChanged(BubbleView bubbleView, boolean expanded) {
+ if (mExpandListener != null) {
+ NotificationEntry entry = bubbleView != null ? bubbleView.getEntry() : null;
+ mExpandListener.onBubbleExpandChanged(expanded, entry != null ? entry.key : null);
+ }
+ }
+
private BubbleView getTopBubble() {
return getBubbleAt(0);
}
@@ -389,32 +449,78 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
}
private void updateExpandedBubble() {
- if (mExpandedBubble != null) {
+ if (mExpandedBubble == null) {
+ return;
+ }
+
+ if (mExpandedBubble.hasAppOverlayIntent()) {
+ // Bubble with activity view expanded state
+ ActivityView expandedView = mExpandedBubble.getActivityView();
+ expandedView.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, mExpandedBubbleHeight));
+
+ final PendingIntent intent = mExpandedBubble.getAppOverlayIntent();
+ mExpandedViewContainer.setHeaderText(intent.getIntent().getComponent().toShortString());
+ mExpandedViewContainer.setExpandedView(expandedView);
+ expandedView.setCallback(new ActivityView.StateCallback() {
+ @Override
+ public void onActivityViewReady(ActivityView view) {
+ Log.d(TAG, "onActivityViewReady("
+ + mExpandedBubble.getEntry().key + "): " + view);
+ view.startActivity(intent);
+ }
+
+ @Override
+ public void onActivityViewDestroyed(ActivityView view) {
+ NotificationEntry entry = mExpandedBubble != null
+ ? mExpandedBubble.getEntry() : null;
+ Log.d(TAG, "onActivityViewDestroyed(key="
+ + ((entry != null) ? entry.key : "(none)") + "): " + view);
+ }
+ });
+ } else {
+ // Bubble with notification view expanded state
ExpandableNotificationRow row = mExpandedBubble.getRowView();
- if (!row.equals(mExpandedViewContainer.getChildAt(0))) {
- // Different expanded view than what we have
+ if (row.getParent() != null) {
+ // Row might still be in the shade when we expand
+ ((ViewGroup) row.getParent()).removeView(row);
+ }
+ if (mIsExpanded) {
+ mExpandedViewContainer.setExpandedView(row);
+ } else {
mExpandedViewContainer.setExpandedView(null);
}
- int pointerPosition = mExpandedBubble.getPosition().x
- + (mExpandedBubble.getWidth() / 2);
- mExpandedViewContainer.setPointerPosition(pointerPosition);
- mExpandedViewContainer.setExpandedView(row);
+ // Bubble with notification as expanded state doesn't need a header / title
+ mExpandedViewContainer.setHeaderText(null);
+
}
+ int pointerPosition = mExpandedBubble.getPosition().x
+ + (mExpandedBubble.getWidth() / 2);
+ mExpandedViewContainer.setPointerPosition(pointerPosition);
}
private void applyCurrentState() {
+ Log.d(TAG, "applyCurrentState: mIsExpanded=" + mIsExpanded);
+
mExpandedViewContainer.setVisibility(mIsExpanded ? VISIBLE : GONE);
if (!mIsExpanded) {
mExpandedViewContainer.setExpandedView(null);
} else {
mExpandedViewContainer.setTranslationY(mBubbleContainer.getHeight());
- ExpandableNotificationRow row = mExpandedBubble.getRowView();
- applyRowState(row);
+ View expandedView = mExpandedViewContainer.getExpandedView();
+ if (expandedView instanceof ActivityView) {
+ if (expandedView.isAttachedToWindow()) {
+ ((ActivityView) expandedView).onLocationChanged();
+ }
+ } else {
+ applyRowState(mExpandedBubble.getRowView());
+ }
}
int bubbsCount = mBubbleContainer.getChildCount();
for (int i = 0; i < bubbsCount; i++) {
BubbleView bv = (BubbleView) mBubbleContainer.getChildAt(i);
- bv.setZ(bubbsCount - 1);
+ bv.updateDotVisibility();
+ bv.setZ(bubbsCount - i);
int transX = mIsExpanded ? (bv.getWidth() + mBubblePadding) * i : mBubblePadding * i;
ViewState viewState = new ViewState();
@@ -468,6 +574,7 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
private void applyRowState(ExpandableNotificationRow view) {
view.reset();
view.setHeadsUp(false);
+ view.resetTranslation();
view.setOnKeyguard(false);
view.setOnAmbient(false);
view.setClipBottomAmount(0);
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
index 88030eefdf54..97784b0f4f93 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
@@ -33,7 +33,7 @@ import com.android.systemui.pip.phone.PipDismissViewController;
* Handles interpreting touches on a {@link BubbleStackView}. This includes expanding, collapsing,
* dismissing, and flings.
*/
-public class BubbleTouchHandler implements View.OnTouchListener {
+class BubbleTouchHandler implements View.OnTouchListener {
private BubbleController mController = Dependency.get(BubbleController.class);
private PipDismissViewController mDismissViewController;
@@ -110,7 +110,7 @@ public class BubbleTouchHandler implements View.OnTouchListener {
: stack.getTargetView(event);
boolean isFloating = targetView instanceof FloatingView;
if (!isFloating || targetView == null || action == MotionEvent.ACTION_OUTSIDE) {
- stack.animateExpansion(false /* shouldExpand */);
+ stack.collapseStack();
cleanUpDismissTarget();
resetTouches();
return false;
@@ -196,9 +196,13 @@ public class BubbleTouchHandler implements View.OnTouchListener {
mMovementHelper.getTranslateAnim(floatingView, toGoTo, 100, 0).start();
}
} else if (floatingView.equals(stack.getExpandedBubble())) {
- stack.animateExpansion(false /* shouldExpand */);
+ stack.collapseStack();
} else if (isBubbleStack) {
- stack.animateExpansion(!stack.isExpanded() /* shouldExpand */);
+ if (stack.isExpanded()) {
+ stack.collapseStack();
+ } else {
+ stack.expandStack();
+ }
} else {
stack.setExpandedBubble((BubbleView) floatingView);
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
index 6c47aac712f6..91893ef3db00 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2018 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,36 +16,49 @@
package com.android.systemui.bubbles;
+import android.annotation.Nullable;
+import android.app.ActivityView;
import android.app.Notification;
+import android.app.PendingIntent;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.OvalShape;
+import android.graphics.drawable.InsetDrawable;
+import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
-import com.android.internal.util.ContrastColorUtil;
+import com.android.internal.graphics.ColorUtils;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
/**
- * A floating object on the screen that has a collapsed and expanded state.
+ * A floating object on the screen that can post message updates.
*/
-public class BubbleView extends LinearLayout implements BubbleTouchHandler.FloatingView {
+public class BubbleView extends FrameLayout implements BubbleTouchHandler.FloatingView {
private static final String TAG = "BubbleView";
+ // Same value as Launcher3 badge code
+ private static final float WHITE_SCRIM_ALPHA = 0.54f;
private Context mContext;
- private View mIconView;
- private NotificationData.Entry mEntry;
- private int mBubbleSize;
- private int mIconSize;
+ private BadgedImageView mBadgedImageView;
+ private TextView mMessageView;
+ private int mPadding;
+ private int mIconInset;
+
+ private NotificationEntry mEntry;
+ private PendingIntent mAppOverlayIntent;
+ private ActivityView mActivityView;
public BubbleView(Context context) {
this(context, null);
@@ -61,72 +74,201 @@ public class BubbleView extends LinearLayout implements BubbleTouchHandler.Float
public BubbleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- setOrientation(LinearLayout.VERTICAL);
mContext = context;
- mBubbleSize = getResources().getDimensionPixelSize(R.dimen.bubble_size);
- mIconSize = getResources().getDimensionPixelSize(R.dimen.bubble_icon_size);
+ // XXX: can this padding just be on the view and we look it up?
+ mPadding = getResources().getDimensionPixelSize(R.dimen.bubble_view_padding);
+ mIconInset = getResources().getDimensionPixelSize(R.dimen.bubble_icon_inset);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mBadgedImageView = (BadgedImageView) findViewById(R.id.bubble_image);
+ mMessageView = (TextView) findViewById(R.id.message_view);
+ mMessageView.setVisibility(GONE);
+ mMessageView.setPivotX(0);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateViews();
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec) {
+ measureChild(mBadgedImageView, widthSpec, heightSpec);
+ measureChild(mMessageView, widthSpec, heightSpec);
+ boolean messageGone = mMessageView.getVisibility() == GONE;
+ int imageHeight = mBadgedImageView.getMeasuredHeight();
+ int imageWidth = mBadgedImageView.getMeasuredWidth();
+ int messageHeight = messageGone ? 0 : mMessageView.getMeasuredHeight();
+ int messageWidth = messageGone ? 0 : mMessageView.getMeasuredWidth();
+ setMeasuredDimension(
+ getPaddingStart() + imageWidth + mPadding + messageWidth + getPaddingEnd(),
+ getPaddingTop() + Math.max(imageHeight, messageHeight) + getPaddingBottom());
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ left = getPaddingStart();
+ top = getPaddingTop();
+ int imageWidth = mBadgedImageView.getMeasuredWidth();
+ int imageHeight = mBadgedImageView.getMeasuredHeight();
+ int messageWidth = mMessageView.getMeasuredWidth();
+ int messageHeight = mMessageView.getMeasuredHeight();
+ mBadgedImageView.layout(left, top, left + imageWidth, top + imageHeight);
+ mMessageView.layout(left + imageWidth + mPadding, top,
+ left + imageWidth + mPadding + messageWidth, top + messageHeight);
}
/**
* Populates this view with a notification.
+ * <p>
+ * This should only be called when a new notification is being set on the view, updates to the
+ * current notification should use {@link #update(NotificationEntry)}.
*
* @param entry the notification to display as a bubble.
*/
- public void setNotif(NotificationData.Entry entry) {
- removeAllViews();
- // TODO: migrate to inflater
- mIconView = new ImageView(mContext);
- addView(mIconView);
+ public void setNotif(NotificationEntry entry) {
+ mEntry = entry;
+ updateViews();
+ }
- LinearLayout.LayoutParams iconLp = (LinearLayout.LayoutParams) mIconView.getLayoutParams();
- iconLp.width = mBubbleSize;
- iconLp.height = mBubbleSize;
- mIconView.setLayoutParams(iconLp);
+ /**
+ * The {@link NotificationEntry} associated with this view, if one exists.
+ */
+ @Nullable
+ public NotificationEntry getEntry() {
+ return mEntry;
+ }
- update(entry);
+ /**
+ * The key for the {@link NotificationEntry} associated with this view, if one exists.
+ */
+ @Nullable
+ public String getKey() {
+ return (mEntry != null) ? mEntry.key : null;
}
/**
- * Updates the UI based on the entry.
+ * Updates the UI based on the entry, updates badge and animates messages as needed.
*/
- public void update(NotificationData.Entry entry) {
+ public void update(NotificationEntry entry) {
mEntry = entry;
- Notification n = entry.notification.getNotification();
- Icon ic = n.getLargeIcon() != null ? n.getLargeIcon() : n.getSmallIcon();
+ updateViews();
+ }
- if (n.getLargeIcon() == null) {
- createCircledIcon(n.color, ic, ((ImageView) mIconView));
- } else {
- ((ImageView) mIconView).setImageIcon(ic);
- }
+
+ /**
+ * @return the {@link ExpandableNotificationRow} view to display notification content when the
+ * bubble is expanded.
+ */
+ @Nullable
+ public ExpandableNotificationRow getRowView() {
+ return (mEntry != null) ? mEntry.getRow() : null;
}
/**
- * @return the key identifying this bubble / notification entry associated with this
- * bubble, if it exists.
+ * Marks this bubble as "read", i.e. no badge should show.
*/
- public String getKey() {
- return mEntry == null ? null : mEntry.key;
+ public void updateDotVisibility() {
+ boolean showDot = getEntry().showInShadeWhenBubble();
+ animateDot(showDot);
}
/**
- * @return the notification entry associated with this bubble.
+ * Animates the badge to show or hide.
*/
- public NotificationData.Entry getEntry() {
- return mEntry;
+ private void animateDot(boolean showDot) {
+ if (mBadgedImageView.isShowingDot() != showDot) {
+ mBadgedImageView.setShowDot(showDot);
+ mBadgedImageView.clearAnimation();
+ mBadgedImageView.animate().setDuration(200)
+ .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+ .setUpdateListener((valueAnimator) -> {
+ float fraction = valueAnimator.getAnimatedFraction();
+ fraction = showDot ? fraction : 1 - fraction;
+ mBadgedImageView.setDotScale(fraction);
+ }).withEndAction(() -> {
+ if (!showDot) {
+ mBadgedImageView.setShowDot(false);
+ }
+ }).start();
+ }
+ }
+
+ private void updateViews() {
+ if (mEntry == null) {
+ return;
+ }
+ Notification n = mEntry.notification.getNotification();
+ boolean isLarge = n.getLargeIcon() != null;
+ Icon ic = isLarge ? n.getLargeIcon() : n.getSmallIcon();
+ Drawable iconDrawable = ic.loadDrawable(mContext);
+ if (!isLarge) {
+ // Center icon on coloured background
+ iconDrawable.setTint(Color.WHITE); // TODO: dark mode
+ Drawable bg = new ColorDrawable(n.color);
+ InsetDrawable d = new InsetDrawable(iconDrawable, mIconInset);
+ Drawable[] layers = {bg, d};
+ mBadgedImageView.setImageDrawable(new LayerDrawable(layers));
+ } else {
+ mBadgedImageView.setImageDrawable(iconDrawable);
+ }
+ int badgeColor = determineDominateColor(iconDrawable, n.color);
+ mBadgedImageView.setDotColor(badgeColor);
+ animateDot(mEntry.showInShadeWhenBubble() /* showDot */);
+ }
+
+ private int determineDominateColor(Drawable d, int defaultTint) {
+ // XXX: should we pull from the drawable, app icon, notif tint?
+ return ColorUtils.blendARGB(defaultTint, Color.WHITE, WHITE_SCRIM_ALPHA);
}
/**
- * @return the view to display when the bubble is expanded.
+ * @return a view used to display app overlay content when expanded.
*/
- public ExpandableNotificationRow getRowView() {
- return mEntry.getRow();
+ public ActivityView getActivityView() {
+ if (mActivityView == null) {
+ mActivityView = new ActivityView(mContext);
+ Log.d(TAG, "[getActivityView] created: " + mActivityView);
+ }
+ return mActivityView;
+ }
+
+ /**
+ * Removes and releases an ActivityView if one was previously created for this bubble.
+ */
+ public void destroyActivityView(ViewGroup tmpParent) {
+ if (mActivityView == null) {
+ return;
+ }
+ // HACK: Only release if initialized. There's no way to know if the ActivityView has
+ // been initialized. Calling release() if it hasn't been initialized will crash.
+
+ if (!mActivityView.isAttachedToWindow()) {
+ // HACK: release() will crash if the view is not attached.
+
+ mActivityView.setVisibility(View.GONE);
+ tmpParent.addView(mActivityView, new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+ }
+ try {
+ mActivityView.release();
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "ActivityView either already released, or not yet initialized.", ex);
+ }
+
+ ((ViewGroup) mActivityView.getParent()).removeView(mActivityView);
+ mActivityView = null;
}
@Override
public void setPosition(int x, int y) {
- setTranslationX(x);
- setTranslationY(y);
+ setPositionX(x);
+ setPositionY(y);
}
@Override
@@ -144,22 +286,19 @@ public class BubbleView extends LinearLayout implements BubbleTouchHandler.Float
return new Point((int) getTranslationX(), (int) getTranslationY());
}
- // Seems sub optimal
- private void createCircledIcon(int tint, Icon icon, ImageView v) {
- // TODO: dark mode
- icon.setTint(Color.WHITE);
- icon.scaleDownIfNecessary(mIconSize, mIconSize);
- v.setImageDrawable(icon.loadDrawable(mContext));
- v.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams();
- int color = ContrastColorUtil.ensureContrast(tint, Color.WHITE,
- false /* isBgDarker */, 3);
- Drawable d = new ShapeDrawable(new OvalShape());
- d.setTint(color);
- v.setBackgroundDrawable(d);
-
- lp.width = mBubbleSize;
- lp.height = mBubbleSize;
- v.setLayoutParams(lp);
+ /**
+ * @return whether an ActivityView should be used to display the content of this Bubble
+ */
+ public boolean hasAppOverlayIntent() {
+ return mAppOverlayIntent != null;
+ }
+
+ public PendingIntent getAppOverlayIntent() {
+ return mAppOverlayIntent;
+
+ }
+
+ public void setAppOverlayIntent(PendingIntent intent) {
+ mAppOverlayIntent = intent;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
index 1718cff4e62b..4ff27b1b64f0 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
@@ -48,7 +48,7 @@ import java.io.PrintWriter;
*
* It does not collect touch events when the bouncer shows up.
*/
-public class FalsingManager implements SensorEventListener {
+public class FalsingManager implements SensorEventListener, StateListener {
private static final String ENFORCE_BOUNCER = "falsing_manager_enforce_bouncer";
private static final int[] CLASSIFIER_SENSORS = new int[] {
@@ -84,8 +84,6 @@ public class FalsingManager implements SensorEventListener {
private boolean mShowingAod;
private Runnable mPendingWtf;
- private final StateListener mStateListener = this::setStatusBarState;
-
protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
@@ -108,7 +106,7 @@ public class FalsingManager implements SensorEventListener {
UserHandle.USER_ALL);
updateConfiguration();
- Dependency.get(StatusBarStateController.class).addCallback(mStateListener);
+ Dependency.get(StatusBarStateController.class).addCallback(this);
}
public static FalsingManager getInstance(Context context) {
@@ -282,14 +280,15 @@ public class FalsingManager implements SensorEventListener {
updateSessionActive();
}
- private void setStatusBarState(int state) {
+ @Override
+ public void onStateChanged(int newState) {
if (FalsingLog.ENABLED) {
FalsingLog.i("setStatusBarState", new StringBuilder()
.append("from=").append(StatusBarState.toShortString(mState))
- .append(" to=").append(StatusBarState.toShortString(state))
+ .append(" to=").append(StatusBarState.toShortString(newState))
.toString());
}
- mState = state;
+ mState = newState;
updateSessionActive();
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
index 4cb1feebcce4..bd7a421e9762 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -38,7 +38,13 @@ public interface DozeHost {
void setAnimateWakeup(boolean animateWakeup);
void setAnimateScreenOff(boolean animateScreenOff);
- void onDoubleTap(float x, float y);
+ /**
+ * Reports that a tap event happend on the Sensors Low Power Island.
+ *
+ * @param x Touch X, or -1 if sensor doesn't support touch location.
+ * @param y Touch Y, or -1 if sensor doesn't support touch location.
+ */
+ void onSlpiTap(float x, float y);
default void setAodDimmingScrim(float scrimOpacity) {}
void setDozeScreenBrightness(int value);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 50003e3a6a38..a7847739cd00 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -35,7 +35,7 @@ public class DozeLog {
private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
- private static final int REASONS = 9;
+ private static final int REASONS = 10;
public static final int PULSE_REASON_NONE = -1;
public static final int PULSE_REASON_INTENT = 0;
@@ -47,6 +47,7 @@ public class DozeLog {
public static final int PULSE_REASON_DOCKING = 6;
public static final int REASON_SENSOR_WAKE_UP = 7;
public static final int PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN = 8;
+ public static final int PULSE_REASON_SENSOR_TAP = 9;
private static boolean sRegisterKeyguardCallback = true;
@@ -207,6 +208,7 @@ public class DozeLog {
case PULSE_REASON_DOCKING: return "docking";
case PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN: return "wakelockscreen";
case REASON_SENSOR_WAKE_UP: return "wakeup";
+ case PULSE_REASON_SENSOR_TAP: return "tap";
default: throw new IllegalArgumentException("bad reason: " + pulseReason);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index b6fc35553760..78374a0b1621 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -107,6 +107,13 @@ public class DozeSensors {
dozeParameters.doubleTapReportsTouchCoordinates(),
true /* touchscreen */),
new TriggerSensor(
+ findSensorWithType(config.tapSensorType()),
+ Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
+ true /* configured */,
+ DozeLog.PULSE_REASON_SENSOR_TAP,
+ false /* reports touch coordinates */,
+ true /* touchscreen */),
+ new TriggerSensor(
findSensorWithType(config.longPressSensorType()),
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
false /* settingDef */,
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 6a9b6899d509..e2e448bb0d0c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -132,6 +132,7 @@ public class DozeTriggers implements DozeMachine.Part {
private void onSensor(int pulseReason, boolean sensorPerformedProxCheck,
float screenX, float screenY, float[] rawValues) {
boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP;
+ boolean isTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_TAP;
boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
boolean isLongPress = pulseReason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS;
boolean isWakeDisplay = pulseReason == DozeLog.REASON_SENSOR_WAKE_UP;
@@ -148,8 +149,10 @@ public class DozeTriggers implements DozeMachine.Part {
// In pocket, drop event.
return;
}
- if (isDoubleTap) {
- mDozeHost.onDoubleTap(screenX, screenY);
+ if (isDoubleTap || isTap) {
+ if (screenX != -1 && screenY != -1) {
+ mDozeHost.onSlpiTap(screenX, screenY);
+ }
mMachine.wakeUp();
} else if (isPickup) {
mMachine.wakeUp();
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 268245bd4acd..7b18fad0e105 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -67,10 +67,8 @@ import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.R;
@@ -86,8 +84,8 @@ import com.android.internal.util.ScreenRecordHelper;
import com.android.internal.util.ScreenshotHelper;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
-import com.android.systemui.HardwareUiLayout;
import com.android.systemui.Interpolators;
+import com.android.systemui.MultiListLayout;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
import com.android.systemui.statusbar.phone.ScrimController;
@@ -490,6 +488,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public boolean showBeforeProvisioning() {
return true;
}
+
+ @Override
+ public boolean shouldBeSeparated() {
+ return true;
+ }
}
private final class RestartAction extends SinglePressAction implements LongPressAction {
@@ -926,6 +929,34 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return getItem(position).isEnabled();
}
+ public ArrayList<Action> getSeparatedActions(boolean shouldUseSeparatedView) {
+ ArrayList<Action> separatedActions = new ArrayList<Action>();
+ if (!shouldUseSeparatedView) {
+ return separatedActions;
+ }
+ for (int i = 0; i < mItems.size(); i++) {
+ final Action action = mItems.get(i);
+ if (action.shouldBeSeparated()) {
+ separatedActions.add(action);
+ }
+ }
+ return separatedActions;
+ }
+
+ public ArrayList<Action> getListActions(boolean shouldUseSeparatedView) {
+ if (!shouldUseSeparatedView) {
+ return new ArrayList<Action>(mItems);
+ }
+ ArrayList<Action> listActions = new ArrayList<Action>();
+ for (int i = 0; i < mItems.size(); i++) {
+ final Action action = mItems.get(i);
+ if (!action.shouldBeSeparated()) {
+ listActions.add(action);
+ }
+ }
+ return listActions;
+ }
+
@Override
public boolean areAllItemsEnabled() {
return false;
@@ -965,7 +996,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext));
// Everything but screenshot, the last item, gets white background.
if (position == getCount() - 1) {
- HardwareUiLayout.get(parent).setDivisionView(view);
+ MultiListLayout.get(parent).setDivisionView(view);
}
return view;
}
@@ -1004,6 +1035,10 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
boolean showBeforeProvisioning();
boolean isEnabled();
+
+ default boolean shouldBeSeparated() {
+ return false;
+ }
}
/**
@@ -1423,9 +1458,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final Context mContext;
private final MyAdapter mAdapter;
- private final LinearLayout mListView;
- private final FrameLayout mSeparatedView;
- private final HardwareUiLayout mHardwareLayout;
+ private final MultiListLayout mGlobalActionsLayout;
private final OnClickListener mClickListener;
private final OnItemLongClickListener mLongClickListener;
private final GradientDrawable mGradientDrawable;
@@ -1466,16 +1499,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
setContentView(com.android.systemui.R.layout.global_actions_wrapped);
- mListView = findViewById(android.R.id.list);
- mSeparatedView = findViewById(com.android.systemui.R.id.separated_button);
- if (!mShouldDisplaySeparatedButton) {
- mSeparatedView.setVisibility(View.GONE);
- }
- mHardwareLayout = HardwareUiLayout.get(mListView);
- mHardwareLayout.setOutsideTouchListener(view -> dismiss());
- mHardwareLayout.setHasSeparatedButton(mShouldDisplaySeparatedButton);
- setTitle(R.string.global_actions);
- mListView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
+ mGlobalActionsLayout = (MultiListLayout)
+ findViewById(com.android.systemui.R.id.global_actions_view);
+ mGlobalActionsLayout.setOutsideTouchListener(view -> dismiss());
+ mGlobalActionsLayout.setHasSeparatedView(mShouldDisplaySeparatedButton);
+ mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
@Override
public boolean dispatchPopulateAccessibilityEvent(
View host, AccessibilityEvent event) {
@@ -1484,20 +1512,33 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return true;
}
});
+ setTitle(R.string.global_actions);
}
private void updateList() {
- mListView.removeAllViews();
- mSeparatedView.removeAllViews();
+ mGlobalActionsLayout.removeAllItems();
+ ArrayList<Action> separatedActions =
+ mAdapter.getSeparatedActions(mShouldDisplaySeparatedButton);
+ ArrayList<Action> listActions = mAdapter.getListActions(mShouldDisplaySeparatedButton);
+ mGlobalActionsLayout.setExpectedListItemCount(listActions.size());
+ mGlobalActionsLayout.setExpectedSeparatedItemCount(separatedActions.size());
+
for (int i = 0; i < mAdapter.getCount(); i++) {
- ViewGroup parentView = mShouldDisplaySeparatedButton && i == mAdapter.getCount() - 1
- ? mSeparatedView : mListView;
- View v = mAdapter.getView(i, null, parentView);
+ Action action = mAdapter.getItem(i);
+ int separatedIndex = separatedActions.indexOf(action);
+ ViewGroup parent;
+ if (separatedIndex != -1) {
+ parent = mGlobalActionsLayout.getParentView(true, separatedIndex);
+ } else {
+ int listIndex = listActions.indexOf(action);
+ parent = mGlobalActionsLayout.getParentView(false, listIndex);
+ }
+ View v = mAdapter.getView(i, null, parent);
final int pos = i;
v.setOnClickListener(view -> mClickListener.onClick(this, pos));
v.setOnLongClickListener(view ->
mLongClickListener.onItemLongClick(null, v, pos, 0));
- parentView.addView(v);
+ parent.addView(v);
}
}
@@ -1543,9 +1584,9 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
super.show();
mShowing = true;
mGradientDrawable.setAlpha(0);
- mHardwareLayout.setTranslationX(getAnimTranslation());
- mHardwareLayout.setAlpha(0);
- mHardwareLayout.animate()
+ mGlobalActionsLayout.setTranslationX(getAnimTranslation());
+ mGlobalActionsLayout.setAlpha(0);
+ mGlobalActionsLayout.animate()
.alpha(1)
.translationX(0)
.setDuration(300)
@@ -1564,9 +1605,9 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return;
}
mShowing = false;
- mHardwareLayout.setTranslationX(0);
- mHardwareLayout.setAlpha(1);
- mHardwareLayout.animate()
+ mGlobalActionsLayout.setTranslationX(0);
+ mGlobalActionsLayout.setAlpha(1);
+ mGlobalActionsLayout.animate()
.alpha(0)
.translationX(getAnimTranslation())
.setDuration(300)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index 6a0e8ad35736..c4c8bc703802 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -50,9 +50,9 @@ import androidx.slice.builders.SliceAction;
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NextAlarmControllerImpl;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit;
*/
public class KeyguardSliceProvider extends SliceProvider implements
NextAlarmController.NextAlarmChangeCallback, ZenModeController.Callback,
- NotificationMediaManager.MediaListener {
+ NotificationMediaManager.MediaListener, StatusBarStateController.StateListener {
private static final StyleSpan BOLD_STYLE = new StyleSpan(Typeface.BOLD);
public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main";
@@ -109,7 +109,9 @@ public class KeyguardSliceProvider extends SliceProvider implements
private AlarmManager.AlarmClockInfo mNextAlarmInfo;
private PendingIntent mPendingIntent;
protected NotificationMediaManager mMediaManager;
+ private StatusBarStateController mStatusBarStateController;
protected MediaMetadata mMediaMetaData;
+ protected boolean mDozing;
/**
* Receiver responsible for time ticking and updating the date format.
@@ -167,9 +169,20 @@ public class KeyguardSliceProvider extends SliceProvider implements
mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI);
}
- public void initDependencies() {
- mMediaManager = Dependency.get(NotificationMediaManager.class);
+ /**
+ * Initialize dependencies that don't exist during {@link android.content.ContentProvider}
+ * instantiation.
+ *
+ * @param mediaManager {@link NotificationMediaManager} singleton.
+ * @param statusBarStateController {@link StatusBarStateController} singleton.
+ */
+ public void initDependencies(
+ NotificationMediaManager mediaManager,
+ StatusBarStateController statusBarStateController) {
+ mMediaManager = mediaManager;
mMediaManager.addCallback(this);
+ mStatusBarStateController = statusBarStateController;
+ mStatusBarStateController.addCallback(this);
}
@AnyThread
@@ -179,7 +192,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
Slice slice;
synchronized (this) {
ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY);
- if (mMediaMetaData != null) {
+ if (needsMediaLocked()) {
addMediaLocked(builder);
} else {
builder.addRow(new RowBuilder(mDateUri).setTitle(mLastText));
@@ -193,6 +206,10 @@ public class KeyguardSliceProvider extends SliceProvider implements
return slice;
}
+ protected boolean needsMediaLocked() {
+ return mMediaMetaData != null && mDozing;
+ }
+
protected void addMediaLocked(ListBuilder listBuilder) {
if (mMediaMetaData != null) {
SpannableStringBuilder builder = new SpannableStringBuilder();
@@ -209,7 +226,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
}
RowBuilder mediaBuilder = new RowBuilder(mMediaUri).setTitle(builder);
- Icon notificationIcon = mMediaManager.getMediaIcon();
+ Icon notificationIcon = mMediaManager == null ? null : mMediaManager.getMediaIcon();
if (notificationIcon != null) {
IconCompat icon = IconCompat.createFromIcon(notificationIcon);
mediaBuilder.addEndItem(icon, ListBuilder.ICON_IMAGE);
@@ -389,13 +406,35 @@ public class KeyguardSliceProvider extends SliceProvider implements
@Override
public void onMetadataChanged(MediaMetadata metadata) {
+ final boolean notify;
synchronized (this) {
+ boolean neededMedia = needsMediaLocked();
mMediaMetaData = metadata;
+ notify = neededMedia != needsMediaLocked();
+ }
+ if (notify) {
+ notifyChange();
}
- notifyChange();
}
protected void notifyChange() {
mContentResolver.notifyChange(mSliceUri, null /* observer */);
}
+
+ @Override
+ public void onDozingChanged(boolean isDozing) {
+ final boolean notify;
+ synchronized (this) {
+ boolean neededMedia = needsMediaLocked();
+ mDozing = isDozing;
+ notify = neededMedia != needsMediaLocked();
+ }
+ if (notify) {
+ notifyChange();
+ }
+ }
+
+ @Override
+ public void onStateChanged(int newState) {
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 323cf1fe7022..f14495bb959d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1843,6 +1843,13 @@ public class KeyguardViewMediator extends SystemUI {
*/
private void handleHide() {
Trace.beginSection("KeyguardViewMediator#handleHide");
+
+ // It's possible that the device was unlocked in a dream state. It's time to wake up.
+ if (mAodShowing) {
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ pm.wakeUp(SystemClock.uptimeMillis(), "com.android.systemui:BOUNCER_DOZING");
+ }
+
synchronized (KeyguardViewMediator.this) {
if (DEBUG) Log.d(TAG, "handleHide");
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
index 1e0d4d01f167..b09d6e163b77 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
@@ -36,8 +36,7 @@ public class PipAppOpsListener {
private Handler mHandler;
private IActivityManager mActivityManager;
private AppOpsManager mAppOpsManager;
-
- private PipMotionHelper mMotionHelper;
+ private Callback mCallback;
private AppOpsManager.OnOpChangedListener mAppOpsChangedListener = new OnOpChangedListener() {
@Override
@@ -52,7 +51,7 @@ public class PipAppOpsListener {
if (appInfo.packageName.equals(topPipActivityInfo.first.getPackageName()) &&
mAppOpsManager.checkOpNoThrow(OP_PICTURE_IN_PICTURE, appInfo.uid,
packageName) != MODE_ALLOWED) {
- mHandler.post(() -> mMotionHelper.dismissPip());
+ mHandler.post(() -> mCallback.dismissPip());
}
}
} catch (NameNotFoundException e) {
@@ -63,12 +62,12 @@ public class PipAppOpsListener {
};
public PipAppOpsListener(Context context, IActivityManager activityManager,
- PipMotionHelper motionHelper) {
+ Callback callback) {
mContext = context;
mHandler = new Handler(mContext.getMainLooper());
mActivityManager = activityManager;
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
- mMotionHelper = motionHelper;
+ mCallback = callback;
}
public void onActivityPinned(String packageName) {
@@ -89,4 +88,10 @@ public class PipAppOpsListener {
private void unregisterAppOpsListener() {
mAppOpsManager.stopWatchingMode(mAppOpsChangedListener);
}
-} \ No newline at end of file
+
+ /** Callback for PipAppOpsListener to request changes to the PIP window. */
+ public interface Callback {
+ /** Dismisses the PIP window. */
+ void dismissPip();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index 38583564f5b0..82aa4737af99 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -55,7 +55,7 @@ import java.io.PrintWriter;
/**
* A helper to animate and manipulate the PiP.
*/
-public class PipMotionHelper implements Handler.Callback {
+public class PipMotionHelper implements Handler.Callback, PipAppOpsListener.Callback {
private static final String TAG = "PipMotionHelper";
private static final boolean DEBUG = false;
@@ -172,7 +172,8 @@ public class PipMotionHelper implements Handler.Callback {
/**
* Dismisses the pinned stack.
*/
- void dismissPip() {
+ @Override
+ public void dismissPip() {
if (DEBUG) {
Log.d(TAG, "dismissPip: callers=\n" + Debug.getCallers(5, " "));
}
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
index 01ee5cabe5a0..77e25e324915 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
@@ -20,6 +20,7 @@ import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.res.ColorStateList
+import android.util.IconDrawableFactory
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
@@ -37,11 +38,22 @@ class OngoingPrivacyDialog constructor(
private val iconSize = context.resources.getDimensionPixelSize(
R.dimen.ongoing_appops_dialog_icon_size)
+ private val plusSize = context.resources.getDimensionPixelSize(
+ R.dimen.ongoing_appops_dialog_app_plus_size)
private val iconColor = context.resources.getColor(
com.android.internal.R.color.text_color_primary, context.theme)
+ private val plusColor: Int
private val iconMargin = context.resources.getDimensionPixelSize(
R.dimen.ongoing_appops_dialog_icon_margin)
private val MAX_ITEMS = context.resources.getInteger(R.integer.ongoing_appops_dialog_max_apps)
+ private val iconFactory = IconDrawableFactory.newInstance(context, true)
+
+ init {
+ val a = context.theme.obtainStyledAttributes(
+ intArrayOf(com.android.internal.R.attr.colorAccent))
+ plusColor = a.getColor(0, 0)
+ a.recycle()
+ }
fun createDialog(): Dialog {
val builder = AlertDialog.Builder(context).apply {
@@ -52,7 +64,8 @@ class OngoingPrivacyDialog constructor(
@Suppress("DEPRECATION")
override fun onClick(dialog: DialogInterface?, which: Int) {
- Dependency.get(ActivityStarter::class.java).startActivity(intent, false)
+ Dependency.get(ActivityStarter::class.java)
+ .postStartActivityDismissingKeyguard(intent, 0)
}
})
}
@@ -86,9 +99,15 @@ class OngoingPrivacyDialog constructor(
numItems - MAX_ITEMS
)
val overflowPlus = overflow.findViewById(R.id.app_icon) as ImageView
+ val lp = overflowPlus.layoutParams.apply {
+ height = plusSize
+ width = plusSize
+ }
+ overflowPlus.layoutParams = lp
overflowPlus.apply {
- imageTintList = ColorStateList.valueOf(iconColor)
- setImageDrawable(context.getDrawable(R.drawable.plus))
+ val plus = context.getDrawable(R.drawable.plus)
+ imageTintList = ColorStateList.valueOf(plusColor)
+ setImageDrawable(plus)
}
}
@@ -113,17 +132,18 @@ class OngoingPrivacyDialog constructor(
}
app.icon.let {
- appIcon.setImageDrawable(it)
+ appIcon.setImageDrawable(iconFactory.getShadowedIcon(it))
}
appName.text = app.applicationName
if (showIcons) {
- dialogBuilder.generateIconsForApp(types).forEach {
+ dialogBuilder.generateIconsForApp(types).forEachIndexed { index, it ->
it.setBounds(0, 0, iconSize, iconSize)
val image = ImageView(context).apply {
imageTintList = ColorStateList.valueOf(iconColor)
setImageDrawable(it)
}
+ image.contentDescription = types[index].getName(context)
icons.addView(image, lp)
}
icons.visibility = View.VISIBLE
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 72245999b084..75ab5dfd2977 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -141,14 +141,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private View mStatusSeparator;
private ImageView mRingerModeIcon;
private TextView mRingerModeTextView;
- private BatteryMeterView mBatteryMeterView;
private Clock mClockView;
private DateView mDateView;
private OngoingPrivacyChip mPrivacyChip;
private Space mSpace;
private BatteryMeterView mBatteryRemainingIcon;
- private TextView mBatteryRemainingText;
- private boolean mShowBatteryPercentAndEstimate;
private PrivacyItemController mPrivacyItemController;
/** Counts how many times the long press tooltip has been shown to the user. */
@@ -229,13 +226,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
// Set the correct tint for the status icons so they contrast
mIconManager.setTint(fillColor);
- mShowBatteryPercentAndEstimate = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_battery_percentage_setting_available);
-
- mBatteryMeterView = findViewById(R.id.battery);
- mBatteryMeterView.setPercentShowMode(mShowBatteryPercentAndEstimate
- ? BatteryMeterView.MODE_ON : BatteryMeterView.MODE_OFF);
- mBatteryMeterView.setOnClickListener(this);
mClockView = findViewById(R.id.clock);
mClockView.setOnClickListener(this);
mDateView = findViewById(R.id.date);
@@ -245,13 +235,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
// Tint for the battery icons are handled in setupHost()
mBatteryRemainingIcon = findViewById(R.id.batteryRemainingIcon);
- mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_OFF);
// Don't need to worry about tuner settings for this icon
mBatteryRemainingIcon.setIgnoreTunerUpdates(true);
-
- mBatteryRemainingText = findViewById(R.id.batteryRemainingText);
- mBatteryRemainingText.setTextColor(fillColor);
-
updateShowPercent();
}
@@ -268,10 +253,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
}
private void setChipVisibility(boolean chipVisible) {
- mBatteryMeterView.setVisibility(View.VISIBLE);
if (chipVisible) {
mPrivacyChip.setVisibility(View.VISIBLE);
- if (mHasTopCutout) mBatteryMeterView.setVisibility(View.GONE);
} else {
mPrivacyChip.setVisibility(View.GONE);
}
@@ -339,7 +322,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
// Update color schemes in landscape to use wallpaperTextColor
boolean shouldUseWallpaperTextColor =
newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE;
- mBatteryMeterView.useWallpaperTextColor(shouldUseWallpaperTextColor);
mClockView.useWallpaperTextColor(shouldUseWallpaperTextColor);
}
@@ -415,17 +397,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements
.build();
}
- private void updateBatteryRemainingText() {
- if (!mShowBatteryPercentAndEstimate) {
- return;
- }
- mBatteryRemainingText.setText(mBatteryController.getEstimatedTimeRemainingString());
- }
-
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
mHeaderQsPanel.setExpanded(expanded);
+ updateEverything();
}
/**
@@ -518,7 +494,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
}
}
mSpace.setLayoutParams(lp);
- // Decide whether to show BatteryMeterView
setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE);
return super.onApplyWindowInsets(insets);
}
@@ -545,7 +520,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mAlarmController.addCallback(this);
mContext.registerReceiver(mRingerReceiver,
new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
- updateBatteryRemainingText();
} else {
mZenController.removeCallback(this);
mAlarmController.removeCallback(this);
@@ -558,9 +532,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
if (v == mClockView) {
mActivityStarter.postStartActivityDismissingKeyguard(new Intent(
AlarmClock.ACTION_SHOW_ALARMS),0);
- } else if (v == mBatteryMeterView) {
- mActivityStarter.postStartActivityDismissingKeyguard(new Intent(
- Intent.ACTION_POWER_USAGE_SUMMARY),0);
} else if (v == mPrivacyChip) {
Handler mUiHandler = new Handler(Looper.getMainLooper());
mUiHandler.post(() -> {
@@ -697,6 +668,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements
.start();
}
+ public void updateEverything() {
+ post(() -> setClickable(!mExpanded));
+ }
+
public void setQSPanel(final QSPanel qsPanel) {
mQsPanel = qsPanel;
setupHost(qsPanel.getHost());
@@ -708,9 +683,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this);
mHeaderQsPanel.setHost(host, null /* No customization in header */);
- // Use SystemUI context to get battery meter colors, and let it use the default tint (white)
- mBatteryMeterView.setColorsFromContext(mHost.getContext());
- mBatteryMeterView.onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
Rect tintArea = new Rect(0, 0, 0, 0);
int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
@@ -758,22 +730,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
.getIntForUser(getContext().getContentResolver(),
SHOW_BATTERY_PERCENT, 0, ActivityManager.getCurrentUser());
- mShowBatteryPercentAndEstimate = systemSetting;
-
- updateBatteryViews();
- }
-
- private void updateBatteryViews() {
- if (mShowBatteryPercentAndEstimate) {
- mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ON);
- mBatteryRemainingIcon.setVisibility(View.VISIBLE);
- mBatteryRemainingText.setVisibility(View.VISIBLE);
- updateBatteryRemainingText();
- } else {
- mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_OFF);
- mBatteryRemainingIcon.setVisibility(View.GONE);
- mBatteryRemainingText.setVisibility(View.GONE);
- }
+ mBatteryRemainingIcon.setPercentShowMode(systemSetting
+ ? BatteryMeterView.MODE_ESTIMATE : BatteryMeterView.MODE_ON);
}
private final class PercentSettingObserver extends ContentObserver {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java
index 5230cea88e8e..7ee37d567a55 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java
@@ -84,7 +84,7 @@ public class SensorPrivacyTile extends QSTileImpl<BooleanState> implements
@Override
public Intent getLongClickIntent() {
- return null;
+ return new Intent();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 81757d0aadd4..c474faf6b1e0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -101,6 +101,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private float mBackButtonAlpha;
private MotionEvent mStatusBarGestureDownEvent;
private float mWindowCornerRadius;
+ private boolean mSupportsRoundedCornersOnWindows;
private ISystemUiProxy mSysUiProxy = new ISystemUiProxy.Stub() {
@@ -244,6 +245,18 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
+ public boolean supportsRoundedCornersOnWindows() {
+ if (!verifyCaller("supportsRoundedCornersOnWindows")) {
+ return false;
+ }
+ long token = Binder.clearCallingIdentity();
+ try {
+ return mSupportsRoundedCornersOnWindows;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
private boolean verifyCaller(String reason) {
final int callerId = Binder.getCallingUserHandle().getIdentifier();
if (callerId != mCurrentBoundedUserId) {
@@ -353,6 +366,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
mInteractionFlags = Prefs.getInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS,
getDefaultInteractionFlags());
mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources());
+ mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils
+ .supportsRoundedCornersOnWindows(mContext.getResources());
// Listen for the package update changes.
if (mDeviceProvisionedController.getCurrentUser() == UserHandle.USER_SYSTEM) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
index bc381699494a..a776d0fbb45e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar;
-import static com.android.systemui.statusbar.notification.NotificationData.Entry;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Handler;
@@ -29,6 +27,7 @@ import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import java.util.stream.Stream;
@@ -48,7 +47,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
* NotificationManagerService side, but we keep it to prevent the UI from looking weird and
* will remove when possible. See {@link NotificationLifetimeExtender}
*/
- protected final ArraySet<Entry> mExtendedLifetimeAlertEntries = new ArraySet<>();
+ protected final ArraySet<NotificationEntry> mExtendedLifetimeAlertEntries = new ArraySet<>();
protected NotificationSafeToRemoveCallback mNotificationLifetimeFinishedCallback;
protected int mMinimumDisplayTime;
@@ -61,7 +60,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
* Adds the notification to be managed.
* @param entry entry to show
*/
- public void showNotification(@NonNull Entry entry) {
+ public void showNotification(@NonNull NotificationEntry entry) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "showNotification");
}
@@ -139,7 +138,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
* @return the entry
*/
@Nullable
- public Entry getEntry(@NonNull String key) {
+ public NotificationEntry getEntry(@NonNull String key) {
AlertEntry entry = mAlertEntries.get(key);
return entry != null ? entry.mEntry : null;
}
@@ -149,7 +148,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
* @return all entries
*/
@NonNull
- public Stream<Entry> getAllEntries() {
+ public Stream<NotificationEntry> getAllEntries() {
return mAlertEntries.values().stream().map(headsUpEntry -> headsUpEntry.mEntry);
}
@@ -180,7 +179,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
* Add a new entry and begin managing it.
* @param entry the entry to add
*/
- protected final void addAlertEntry(@NonNull Entry entry) {
+ protected final void addAlertEntry(@NonNull NotificationEntry entry) {
AlertEntry alertEntry = createAlertEntry();
alertEntry.setEntry(entry);
mAlertEntries.put(entry.key, alertEntry);
@@ -203,7 +202,7 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
if (alertEntry == null) {
return;
}
- Entry entry = alertEntry.mEntry;
+ NotificationEntry entry = alertEntry.mEntry;
mAlertEntries.remove(key);
onAlertEntryRemoved(alertEntry);
entry.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
@@ -250,12 +249,12 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
}
@Override
- public boolean shouldExtendLifetime(Entry entry) {
+ public boolean shouldExtendLifetime(NotificationEntry entry) {
return !canRemoveImmediately(entry.key);
}
@Override
- public void setShouldManageLifetime(Entry entry, boolean shouldExtend) {
+ public void setShouldManageLifetime(NotificationEntry entry, boolean shouldExtend) {
if (shouldExtend) {
mExtendedLifetimeAlertEntries.add(entry);
} else {
@@ -265,17 +264,17 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
///////////////////////////////////////////////////////////////////////////////////////////////
protected class AlertEntry implements Comparable<AlertEntry> {
- @Nullable public Entry mEntry;
+ @Nullable public NotificationEntry mEntry;
public long mPostTime;
public long mEarliestRemovaltime;
@Nullable protected Runnable mRemoveAlertRunnable;
- public void setEntry(@NonNull final Entry entry) {
+ public void setEntry(@NonNull final NotificationEntry entry) {
setEntry(entry, () -> removeAlertEntry(entry.key));
}
- public void setEntry(@NonNull final Entry entry,
+ public void setEntry(@NonNull final NotificationEntry entry,
@Nullable Runnable removeAlertRunnable) {
mEntry = entry;
mRemoveAlertRunnable = removeAlertRunnable;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
index 9bfd4ee24ff0..a3beb96780d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
@@ -25,7 +25,7 @@ import android.util.ArraySet;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import javax.inject.Inject;
@@ -83,7 +83,7 @@ public class AmbientPulseManager extends AlertingNotificationManager {
@Override
protected void onAlertEntryAdded(AlertEntry alertEntry) {
- NotificationData.Entry entry = alertEntry.mEntry;
+ NotificationEntry entry = alertEntry.mEntry;
entry.setAmbientPulsing(true);
for (OnAmbientChangedListener listener : mListeners) {
listener.onAmbientStateChanged(entry, true);
@@ -92,7 +92,7 @@ public class AmbientPulseManager extends AlertingNotificationManager {
@Override
protected void onAlertEntryRemoved(AlertEntry alertEntry) {
- NotificationData.Entry entry = alertEntry.mEntry;
+ NotificationEntry entry = alertEntry.mEntry;
entry.setAmbientPulsing(false);
for (OnAmbientChangedListener listener : mListeners) {
listener.onAmbientStateChanged(entry, false);
@@ -131,7 +131,7 @@ public class AmbientPulseManager extends AlertingNotificationManager {
* @param entry the entry that changed
* @param isPulsing true if the entry is now pulsing, false otherwise
*/
- void onAmbientStateChanged(NotificationData.Entry entry, boolean isPulsing);
+ void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing);
}
private final class AmbientEntry extends AlertEntry {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 6a015630a076..904478efb568 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -111,7 +111,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
private static final int MSG_SHOW_CHARGING_ANIMATION = 44 << MSG_SHIFT;
private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT = 45 << MSG_SHIFT;
private static final int MSG_SHOW_PINNING_TOAST_ESCAPE = 46 << MSG_SHIFT;
- private static final int MSG_BIOMETRIC_TRY_AGAIN = 47 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -271,11 +270,10 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
default void showBiometricDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver,
int type, boolean requireConfirmation, int userId) { }
- default void onBiometricAuthenticated() { }
+ default void onBiometricAuthenticated(boolean authenticated) { }
default void onBiometricHelp(String message) { }
default void onBiometricError(String error) { }
default void hideBiometricDialog() { }
- default void showBiometricTryAgain() { }
}
@VisibleForTesting
@@ -736,9 +734,9 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
@Override
- public void onBiometricAuthenticated() {
+ public void onBiometricAuthenticated(boolean authenticated) {
synchronized (mLock) {
- mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATED).sendToTarget();
+ mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATED, authenticated).sendToTarget();
}
}
@@ -763,13 +761,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
}
- @Override
- public void showBiometricTryAgain() {
- synchronized (mLock) {
- mHandler.obtainMessage(MSG_BIOMETRIC_TRY_AGAIN).sendToTarget();
- }
- }
-
private final class H extends Handler {
private H(Looper l) {
super(l);
@@ -991,7 +982,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
break;
case MSG_BIOMETRIC_AUTHENTICATED:
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).onBiometricAuthenticated();
+ mCallbacks.get(i).onBiometricAuthenticated((boolean) msg.obj);
}
break;
case MSG_BIOMETRIC_HELP:
@@ -1024,11 +1015,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
mCallbacks.get(i).showPinningEscapeToast();
}
break;
- case MSG_BIOMETRIC_TRY_AGAIN:
- for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).showBiometricTryAgain();
- }
- break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
index 758fb7a9971e..22d1d5b233ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
@@ -18,12 +18,14 @@ package com.android.systemui.statusbar;
import android.animation.Animator;
import android.content.Context;
+import android.util.Log;
import android.view.ViewPropertyAnimator;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import com.android.systemui.Interpolators;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.phone.StatusBar;
/**
* Utility class to calculate general fling animation when the finger is released.
@@ -196,9 +198,16 @@ public class FlingAnimationUtils {
if (startGradient != mCachedStartGradient
|| velocityFactor != mCachedVelocityFactor) {
float speedup = mSpeedUpFactor * (1.0f - velocityFactor);
- mInterpolator = new PathInterpolator(speedup,
- speedup * startGradient,
- mLinearOutSlowInX2, mY2);
+ float x1 = speedup;
+ float y1 = speedup * startGradient;
+ float x2 = mLinearOutSlowInX2;
+ float y2 = mY2;
+ try {
+ mInterpolator = new PathInterpolator(x1, y1, x2, y2);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Illegal path with "
+ + "x1=" + x1 + " y1=" + y1 + " x2=" + x2 + " y2=" + y2, e);
+ }
mCachedStartGradient = startGradient;
mCachedVelocityFactor = velocityFactor;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
index e2177774a75d..3f1ff33437b9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
@@ -32,7 +32,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.AlphaOptimizedLinearLayout;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import java.util.List;
@@ -50,7 +50,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
private int mEndMargin;
private View mIconPlaceholder;
private TextView mTextView;
- private NotificationData.Entry mShowingEntry;
+ private NotificationEntry mShowingEntry;
private Rect mLayoutedIconRect = new Rect();
private int[] mTmpPosition = new int[2];
private boolean mFirstLayout = true;
@@ -162,7 +162,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
mTextView = findViewById(R.id.text);
}
- public void setEntry(NotificationData.Entry entry) {
+ public void setEntry(NotificationEntry entry) {
if (entry != null) {
mShowingEntry = entry;
CharSequence text = entry.headsUpStatusBarText;
@@ -261,7 +261,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
return super.fitSystemWindows(insets);
}
- public NotificationData.Entry getShowingEntry() {
+ public NotificationEntry getShowingEntry() {
return mShowingEntry;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLifetimeExtender.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLifetimeExtender.java
index ecd9814c3073..0f295ba75fe4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLifetimeExtender.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLifetimeExtender.java
@@ -2,7 +2,7 @@ package com.android.systemui.statusbar;
import androidx.annotation.NonNull;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
/**
* Interface for anything that may need to keep notifications managed even after
@@ -24,7 +24,7 @@ public interface NotificationLifetimeExtender {
* @param entry the entry containing the notification to check
* @return true if the notification lifetime should be extended
*/
- boolean shouldExtendLifetime(@NonNull NotificationData.Entry entry);
+ boolean shouldExtendLifetime(@NonNull NotificationEntry entry);
/**
* Sets whether or not the lifetime should be managed by the extender. In practice, if
@@ -37,7 +37,7 @@ public interface NotificationLifetimeExtender {
* @param entry the entry that needs an extended lifetime
* @param shouldManage true if the extender should manage the entry now, false otherwise
*/
- void setShouldManageLifetime(@NonNull NotificationData.Entry entry, boolean shouldManage);
+ void setShouldManageLifetime(@NonNull NotificationEntry entry, boolean shouldManage);
/**
* The callback for when the notification is now safe to remove (i.e. its lifetime has ended).
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
index bc662e3d8855..f46ded4d61d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
@@ -18,7 +18,7 @@ import android.content.pm.UserInfo;
import android.service.notification.StatusBarNotification;
import android.util.SparseArray;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
public interface NotificationLockscreenUserManager {
String PERMISSION_SELF = "com.android.systemui.permission.SELF";
@@ -55,7 +55,7 @@ public interface NotificationLockscreenUserManager {
void updatePublicMode();
- boolean needsRedaction(Entry entry);
+ boolean needsRedaction(NotificationEntry entry);
boolean userAllowsPrivateNotificationsInPublic(int currentUserId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index bba4369b5e01..d5f4d0461ba4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -46,9 +46,9 @@ import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -407,7 +407,7 @@ public class NotificationLockscreenUserManagerImpl implements
}
/** @return true if the entry needs redaction when on the lockscreen. */
- public boolean needsRedaction(NotificationData.Entry ent) {
+ public boolean needsRedaction(NotificationEntry ent) {
int userId = ent.notification.getUserId();
boolean currentUserWantsRedaction = !userAllowsPrivateNotificationsInPublic(mCurrentUserId);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index 1bf101c00711..7412702abfea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -37,7 +37,6 @@ import android.media.session.PlaybackState;
import android.os.Handler;
import android.os.Trace;
import android.os.UserHandle;
-import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
@@ -47,9 +46,9 @@ import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.Interpolators;
import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.ScrimController;
@@ -157,15 +156,10 @@ public class NotificationMediaManager implements Dumpable {
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
public void onEntryRemoved(
- @Nullable Entry entry,
- String key,
- StatusBarNotification old,
+ NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
- if (!lifetimeExtended) {
- onNotificationRemoved(key);
- }
+ onNotificationRemoved(entry.key);
}
});
}
@@ -194,7 +188,7 @@ public class NotificationMediaManager implements Dumpable {
return null;
}
synchronized (mEntryManager.getNotificationData()) {
- Entry entry = mEntryManager.getNotificationData().get(mMediaNotificationKey);
+ NotificationEntry entry = mEntryManager.getNotificationData().get(mMediaNotificationKey);
if (entry == null || entry.expandedIcon == null) {
return null;
}
@@ -216,15 +210,15 @@ public class NotificationMediaManager implements Dumpable {
boolean metaDataChanged = false;
synchronized (mEntryManager.getNotificationData()) {
- ArrayList<Entry> activeNotifications =
+ ArrayList<NotificationEntry> activeNotifications =
mEntryManager.getNotificationData().getActiveNotifications();
final int N = activeNotifications.size();
// Promote the media notification with a controller in 'playing' state, if any.
- Entry mediaNotification = null;
+ NotificationEntry mediaNotification = null;
MediaController controller = null;
for (int i = 0; i < N; i++) {
- final Entry entry = activeNotifications.get(i);
+ final NotificationEntry entry = activeNotifications.get(i);
if (entry.isMediaNotification()) {
final MediaSession.Token token =
@@ -264,7 +258,7 @@ public class NotificationMediaManager implements Dumpable {
final String pkg = aController.getPackageName();
for (int i = 0; i < N; i++) {
- final Entry entry = activeNotifications.get(i);
+ final NotificationEntry entry = activeNotifications.get(i);
if (entry.notification.getPackageName().equals(pkg)) {
if (DEBUG_MEDIA) {
Log.v(TAG, "DEBUG_MEDIA: found controller matching "
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 886d99eeff17..7d6231f27885 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -51,9 +51,9 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dumpable;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.RemoteInputView;
@@ -103,7 +103,7 @@ public class NotificationRemoteInputManager implements Dumpable {
* Notifications that are already removed but are kept around because the remote input is
* actively being used (i.e. user is typing in it). See {@link RemoteInputActiveExtender}.
*/
- protected final ArraySet<NotificationData.Entry> mEntriesKeptForRemoteInputActive =
+ protected final ArraySet<NotificationEntry> mEntriesKeptForRemoteInputActive =
new ArraySet<>();
// Dependencies:
@@ -253,14 +253,11 @@ public class NotificationRemoteInputManager implements Dumpable {
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
public void onEntryRemoved(
- @Nullable NotificationData.Entry entry,
- String key,
- StatusBarNotification old,
+ @Nullable NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
if (removedByUser && entry != null) {
- onPerformRemoveNotification(entry, key);
+ onPerformRemoveNotification(entry, entry.key);
}
}
});
@@ -272,7 +269,7 @@ public class NotificationRemoteInputManager implements Dumpable {
mRemoteInputController = new RemoteInputController(delegate);
mRemoteInputController.addCallback(new RemoteInputController.Callback() {
@Override
- public void onRemoteInputSent(NotificationData.Entry entry) {
+ public void onRemoteInputSent(NotificationEntry entry) {
if (FORCE_REMOTE_INPUT_HISTORY
&& isNotificationKeptForRemoteInputHistory(entry.key)) {
mNotificationLifetimeFinishedCallback.onSafeToRemove(entry.key);
@@ -416,7 +413,7 @@ public class NotificationRemoteInputManager implements Dumpable {
}
@VisibleForTesting
- void onPerformRemoveNotification(NotificationData.Entry entry, final String key) {
+ void onPerformRemoveNotification(NotificationEntry entry, final String key) {
if (mKeysKeptForRemoteInputHistory.contains(key)) {
mKeysKeptForRemoteInputHistory.remove(key);
}
@@ -427,7 +424,7 @@ public class NotificationRemoteInputManager implements Dumpable {
public void onPanelCollapsed() {
for (int i = 0; i < mEntriesKeptForRemoteInputActive.size(); i++) {
- NotificationData.Entry entry = mEntriesKeptForRemoteInputActive.valueAt(i);
+ NotificationEntry entry = mEntriesKeptForRemoteInputActive.valueAt(i);
mRemoteInputController.removeRemoteInput(entry, null);
if (mNotificationLifetimeFinishedCallback != null) {
mNotificationLifetimeFinishedCallback.onSafeToRemove(entry.key);
@@ -440,7 +437,7 @@ public class NotificationRemoteInputManager implements Dumpable {
return mKeysKeptForRemoteInputHistory.contains(key);
}
- public boolean shouldKeepForRemoteInputHistory(NotificationData.Entry entry) {
+ public boolean shouldKeepForRemoteInputHistory(NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
@@ -450,7 +447,7 @@ public class NotificationRemoteInputManager implements Dumpable {
return (mRemoteInputController.isSpinning(entry.key) || entry.hasJustSentRemoteInput());
}
- public boolean shouldKeepForSmartReplyHistory(NotificationData.Entry entry) {
+ public boolean shouldKeepForSmartReplyHistory(NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
@@ -470,13 +467,13 @@ public class NotificationRemoteInputManager implements Dumpable {
@VisibleForTesting
StatusBarNotification rebuildNotificationForCanceledSmartReplies(
- NotificationData.Entry entry) {
+ NotificationEntry entry) {
return rebuildNotificationWithRemoteInput(entry, null /* remoteInputTest */,
false /* showSpinner */);
}
@VisibleForTesting
- StatusBarNotification rebuildNotificationWithRemoteInput(NotificationData.Entry entry,
+ StatusBarNotification rebuildNotificationWithRemoteInput(NotificationEntry entry,
CharSequence remoteInputText, boolean showSpinner) {
StatusBarNotification sbn = entry.notification;
@@ -533,7 +530,7 @@ public class NotificationRemoteInputManager implements Dumpable {
}
@VisibleForTesting
- public Set<NotificationData.Entry> getEntriesKeptForRemoteInputActive() {
+ public Set<NotificationEntry> getEntriesKeptForRemoteInputActive() {
return mEntriesKeptForRemoteInputActive;
}
@@ -556,12 +553,12 @@ public class NotificationRemoteInputManager implements Dumpable {
*/
protected class RemoteInputHistoryExtender extends RemoteInputExtender {
@Override
- public boolean shouldExtendLifetime(@NonNull NotificationData.Entry entry) {
+ public boolean shouldExtendLifetime(@NonNull NotificationEntry entry) {
return shouldKeepForRemoteInputHistory(entry);
}
@Override
- public void setShouldManageLifetime(NotificationData.Entry entry,
+ public void setShouldManageLifetime(NotificationEntry entry,
boolean shouldExtend) {
if (shouldExtend) {
CharSequence remoteInputText = entry.remoteInputText;
@@ -602,12 +599,12 @@ public class NotificationRemoteInputManager implements Dumpable {
*/
protected class SmartReplyHistoryExtender extends RemoteInputExtender {
@Override
- public boolean shouldExtendLifetime(@NonNull NotificationData.Entry entry) {
+ public boolean shouldExtendLifetime(@NonNull NotificationEntry entry) {
return shouldKeepForSmartReplyHistory(entry);
}
@Override
- public void setShouldManageLifetime(NotificationData.Entry entry,
+ public void setShouldManageLifetime(NotificationEntry entry,
boolean shouldExtend) {
if (shouldExtend) {
StatusBarNotification newSbn = rebuildNotificationForCanceledSmartReplies(entry);
@@ -640,7 +637,7 @@ public class NotificationRemoteInputManager implements Dumpable {
*/
protected class RemoteInputActiveExtender extends RemoteInputExtender {
@Override
- public boolean shouldExtendLifetime(@NonNull NotificationData.Entry entry) {
+ public boolean shouldExtendLifetime(@NonNull NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
@@ -648,7 +645,7 @@ public class NotificationRemoteInputManager implements Dumpable {
}
@Override
- public void setShouldManageLifetime(NotificationData.Entry entry,
+ public void setShouldManageLifetime(NotificationEntry entry,
boolean shouldExtend) {
if (shouldExtend) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 91b34fc875bf..9ef9c94d7cdc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -55,7 +55,7 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer;
* overflow icons that don't fit into the regular list anymore.
*/
public class NotificationShelf extends ActivatableNotificationView implements
- View.OnLayoutChangeListener {
+ View.OnLayoutChangeListener, StateListener {
private static final boolean USE_ANIMATIONS_WHEN_OPENING =
SystemProperties.getBoolean("debug.icon_opening_animations", true);
@@ -65,12 +65,12 @@ public class NotificationShelf extends ActivatableNotificationView implements
private static final String TAG = "NotificationShelf";
private static final long SHELF_IN_TRANSLATION_DURATION = 200;
- private boolean mDark;
private NotificationIconContainer mShelfIcons;
private int[] mTmp = new int[2];
private boolean mHideBackground;
private int mIconAppearTopPadding;
private int mShelfAppearTranslation;
+ private float mDarkShelfPadding;
private int mStatusBarHeight;
private int mStatusBarPaddingStart;
private AmbientState mAmbientState;
@@ -95,8 +95,6 @@ public class NotificationShelf extends ActivatableNotificationView implements
private int mCutoutHeight;
private int mGapHeight;
- private final StateListener mStateListener = this::setStatusBarState;
-
public NotificationShelf(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -121,13 +119,13 @@ public class NotificationShelf extends ActivatableNotificationView implements
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Dependency.get(StatusBarStateController.class)
- .addCallback(mStateListener, StatusBarStateController.RANK_SHELF);
+ .addCallback(this, StatusBarStateController.RANK_SHELF);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- Dependency.get(StatusBarStateController.class).removeCallback(mStateListener);
+ Dependency.get(StatusBarStateController.class).removeCallback(this);
}
public void bind(AmbientState ambientState, NotificationStackScrollLayout hostLayout) {
@@ -142,6 +140,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
mStatusBarPaddingStart = res.getDimensionPixelOffset(R.dimen.status_bar_padding_start);
mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height);
mShelfAppearTranslation = res.getDimensionPixelSize(R.dimen.shelf_appear_translation);
+ mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding);
ViewGroup.LayoutParams layoutParams = getLayoutParams();
layoutParams.height = res.getDimensionPixelOffset(R.dimen.notification_shelf_height);
@@ -167,11 +166,29 @@ public class NotificationShelf extends ActivatableNotificationView implements
@Override
public void setDark(boolean dark, boolean fade, long delay) {
- super.setDark(dark, fade, delay);
if (mDark == dark) return;
- mDark = dark;
+ super.setDark(dark, fade, delay);
mShelfIcons.setDark(dark, fade, delay);
updateInteractiveness();
+ updateOutline();
+ }
+
+ /**
+ * Alpha animation with translation played when this view is visible on AOD.
+ */
+ public void fadeInTranslating() {
+ mShelfIcons.setTranslationY(-mShelfAppearTranslation);
+ mShelfIcons.setAlpha(0);
+ mShelfIcons.animate()
+ .setInterpolator(Interpolators.DECELERATE_QUINT)
+ .translationY(0)
+ .setDuration(SHELF_IN_TRANSLATION_DURATION)
+ .start();
+ mShelfIcons.animate()
+ .alpha(1)
+ .setInterpolator(Interpolators.LINEAR)
+ .setDuration(SHELF_IN_TRANSLATION_DURATION)
+ .start();
}
@Override
@@ -202,10 +219,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
float awakenTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height,
getFullyClosedTranslation());
- float darkTranslation = mAmbientState.getDarkTopPadding();
float yRatio = mAmbientState.hasPulsingNotifications() ?
0 : mAmbientState.getDarkAmount();
- viewState.yTranslation = MathUtils.lerp(awakenTranslation, darkTranslation, yRatio);
+ viewState.yTranslation = awakenTranslation + mDarkShelfPadding * yRatio;
viewState.zTranslation = ambientState.getBaseZHeight();
// For the small display size, it's not enough to make the icon not covered by
// the top cutout so the denominator add the height of cutout.
@@ -225,7 +241,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
}
viewState.hasItemsInStableShelf = lastViewState.inShelf;
viewState.hidden = !mAmbientState.isShadeExpanded()
- || mAmbientState.isQsCustomizerShowing() || mAmbientState.isFullyDark();
+ || mAmbientState.isQsCustomizerShowing();
viewState.maxShelfEnd = maxShelfEnd;
} else {
viewState.hidden = true;
@@ -420,7 +436,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
float maxTop = row.getTranslationY();
StatusBarIconView icon = row.getEntry().expandedIcon;
float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY();
- if (shelfIconPosition < maxTop) {
+ if (shelfIconPosition < maxTop && !mAmbientState.isDark()) {
int top = (int) (maxTop - shelfIconPosition);
Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight()));
icon.setClipBounds(clipRect);
@@ -431,7 +447,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
private void updateContinuousClipping(final ExpandableNotificationRow row) {
StatusBarIconView icon = row.getEntry().expandedIcon;
- boolean needsContinuousClipping = ViewState.isAnimatingY(icon);
+ boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark();
boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null;
if (needsContinuousClipping && !isContinuousClipping) {
final ViewTreeObserver observer = icon.getViewTreeObserver();
@@ -622,7 +638,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
iconState.translateContent = false;
}
float transitionAmount;
- if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount
+ if (mAmbientState.isDarkAtAll() && !row.isInShelf()) {
+ transitionAmount = mAmbientState.isFullyDark() ? 1 : 0;
+ } else if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount
|| iconState.useLinearTransitionAmount) {
transitionAmount = iconTransitionAmount;
} else {
@@ -745,18 +763,14 @@ public class NotificationShelf extends ActivatableNotificationView implements
}
}
- public boolean hidesBackground() {
- return mHideBackground;
- }
-
@Override
protected boolean needsOutline() {
- return !mHideBackground && super.needsOutline();
+ return !mHideBackground && !mDark && super.needsOutline();
}
@Override
protected boolean shouldHideBackground() {
- return super.shouldHideBackground() || mHideBackground;
+ return super.shouldHideBackground() || mHideBackground || mDark;
}
@Override
@@ -860,8 +874,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
mCollapsedIcons.addOnLayoutChangeListener(this);
}
- private void setStatusBarState(int statusBarState) {
- mStatusBarState = statusBarState;
+ @Override
+ public void onStateChanged(int newState) {
+ mStatusBarState = newState;
updateInteractiveness();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
index f23ae3f6bfb7..f0d804dbc7a3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
@@ -24,7 +24,7 @@ import android.text.TextUtils;
import androidx.annotation.VisibleForTesting;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import java.util.ArrayList;
import java.util.Arrays;
@@ -52,7 +52,7 @@ public class NotificationUiAdjustment {
}
public static NotificationUiAdjustment extractFromNotificationEntry(
- NotificationData.Entry entry) {
+ NotificationEntry entry) {
return new NotificationUiAdjustment(
entry.key, entry.systemGeneratedSmartActions, entry.smartReplies);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 017a9c368fdf..f2ff85bb226c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar;
-import static com.android.systemui.statusbar.StatusBarState.SHADE;
-
import android.content.Context;
import android.content.res.Resources;
import android.os.Trace;
@@ -26,10 +24,9 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.R;
-import com.android.systemui.bubbles.BubbleController;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -66,7 +63,6 @@ public class NotificationViewHierarchyManager {
protected final VisualStabilityManager mVisualStabilityManager;
private final StatusBarStateController mStatusBarStateController;
private final NotificationEntryManager mEntryManager;
- private final BubbleController mBubbleController;
// Lazy
private final Lazy<ShadeController> mShadeController;
@@ -80,41 +76,6 @@ public class NotificationViewHierarchyManager {
private NotificationPresenter mPresenter;
private NotificationListContainer mListContainer;
- private StatusBarStateListener mStatusBarStateListener;
-
- /**
- * Listens for the current state of the status bar and updates the visibility state
- * of bubbles as needed.
- */
- public class StatusBarStateListener implements StatusBarStateController.StateListener {
- private int mState;
- private BubbleController mController;
-
- public StatusBarStateListener(BubbleController controller) {
- mController = controller;
- }
-
- /**
- * Returns the current status bar state.
- */
- public int getCurrentState() {
- return mState;
- }
-
- @Override
- public void onStateChanged(int newState) {
- mState = newState;
- // Order here matters because we need to remove the expandable notification row
- // from it's current parent (NSSL or bubble) before it can be added to the new parent
- if (mState == SHADE) {
- updateNotificationViews();
- mController.updateVisibility(true);
- } else {
- mController.updateVisibility(false);
- updateNotificationViews();
- }
- }
- }
@Inject
public NotificationViewHierarchyManager(Context context,
@@ -123,20 +84,16 @@ public class NotificationViewHierarchyManager {
VisualStabilityManager visualStabilityManager,
StatusBarStateController statusBarStateController,
NotificationEntryManager notificationEntryManager,
- BubbleController bubbleController,
Lazy<ShadeController> shadeController) {
mLockscreenUserManager = notificationLockscreenUserManager;
mGroupManager = groupManager;
mVisualStabilityManager = visualStabilityManager;
mStatusBarStateController = statusBarStateController;
mEntryManager = notificationEntryManager;
- mBubbleController = bubbleController;
mShadeController = shadeController;
Resources res = context.getResources();
mAlwaysExpandNonGroupedNotification =
res.getBoolean(R.bool.config_alwaysExpandNonGroupedNotifications);
- mStatusBarStateListener = new StatusBarStateListener(mBubbleController);
- mStatusBarStateController.addCallback(mStatusBarStateListener);
}
public void setUpWithPresenter(NotificationPresenter presenter,
@@ -150,25 +107,17 @@ public class NotificationViewHierarchyManager {
*/
//TODO: Rewrite this to focus on Entries, or some other data object instead of views
public void updateNotificationViews() {
- ArrayList<NotificationData.Entry> activeNotifications = mEntryManager.getNotificationData()
+ ArrayList<NotificationEntry> activeNotifications = mEntryManager.getNotificationData()
.getActiveNotifications();
ArrayList<ExpandableNotificationRow> toShow = new ArrayList<>(activeNotifications.size());
- ArrayList<NotificationData.Entry> toBubble = new ArrayList<>();
final int N = activeNotifications.size();
for (int i = 0; i < N; i++) {
- NotificationData.Entry ent = activeNotifications.get(i);
+ NotificationEntry ent = activeNotifications.get(i);
if (ent.isRowDismissed() || ent.isRowRemoved()) {
// we don't want to update removed notifications because they could
// temporarily become children if they were isolated before.
continue;
}
- ent.getRow().setStatusBarState(mStatusBarStateListener.getCurrentState());
- boolean showAsBubble = ent.isBubble() && !ent.isBubbleDismissed()
- && mStatusBarStateListener.getCurrentState() == SHADE;
- if (showAsBubble) {
- toBubble.add(ent);
- continue;
- }
int userId = ent.notification.getUserId();
@@ -187,7 +136,7 @@ public class NotificationViewHierarchyManager {
ent.getRow().setSensitive(sensitive, deviceSensitive);
ent.getRow().setNeedsRedaction(needsRedaction);
if (mGroupManager.isChildInGroupWithSummary(ent.notification)) {
- NotificationData.Entry summary = mGroupManager.getGroupSummary(ent.notification);
+ NotificationEntry summary = mGroupManager.getGroupSummary(ent.notification);
List<ExpandableNotificationRow> orderedChildren =
mTmpChildOrderMap.get(summary.getRow());
if (orderedChildren == null) {
@@ -269,12 +218,6 @@ public class NotificationViewHierarchyManager {
}
- for (int i = 0; i < toBubble.size(); i++) {
- // TODO: might make sense to leave them in the shade and just reposition them
- NotificationData.Entry ent = toBubble.get(i);
- mBubbleController.addBubble(ent);
- }
-
mVisualStabilityManager.onReorderingFinished();
// clear the map again for the next usage
mTmpChildOrderMap.clear();
@@ -385,7 +328,7 @@ public class NotificationViewHierarchyManager {
}
while(!stack.isEmpty()) {
ExpandableNotificationRow row = stack.pop();
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
boolean isChildNotification =
mGroupManager.isChildInGroupWithSummary(entry.notification);
@@ -408,7 +351,7 @@ public class NotificationViewHierarchyManager {
if (!showOnKeyguard) {
// min priority notifications should show if their summary is showing
if (mGroupManager.isChildInGroupWithSummary(entry.notification)) {
- NotificationData.Entry summary = mGroupManager.getLogicalGroupSummary(
+ NotificationEntry summary = mGroupManager.getLogicalGroupSummary(
entry.notification);
if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard(
summary.notification)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
index e8abcc2bd80e..998cf523d3df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
@@ -24,7 +24,7 @@ import android.util.ArrayMap;
import android.util.Pair;
import com.android.internal.util.Preconditions;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.RemoteInputView;
import java.lang.ref.WeakReference;
@@ -38,7 +38,7 @@ public class RemoteInputController {
private static final boolean ENABLE_REMOTE_INPUT =
SystemProperties.getBoolean("debug.enable_remote_input", true);
- private final ArrayList<Pair<WeakReference<NotificationData.Entry>, Object>> mOpen
+ private final ArrayList<Pair<WeakReference<NotificationEntry>, Object>> mOpen
= new ArrayList<>();
private final ArrayMap<String, Object> mSpinning = new ArrayMap<>();
private final ArrayList<Callback> mCallbacks = new ArrayList<>(3);
@@ -101,7 +101,7 @@ public class RemoteInputController {
* @param entry the entry for which a remote input is now active.
* @param token a token identifying the view that is managing the remote input
*/
- public void addRemoteInput(NotificationData.Entry entry, Object token) {
+ public void addRemoteInput(NotificationEntry entry, Object token) {
Preconditions.checkNotNull(entry);
Preconditions.checkNotNull(token);
@@ -122,7 +122,7 @@ public class RemoteInputController {
* the entry is only removed if the token matches the last added token for this
* entry. If null, the entry is removed regardless.
*/
- public void removeRemoteInput(NotificationData.Entry entry, Object token) {
+ public void removeRemoteInput(NotificationEntry entry, Object token) {
Preconditions.checkNotNull(entry);
pruneWeakThenRemoveAndContains(null /* contains */, entry /* remove */, token);
@@ -173,7 +173,7 @@ public class RemoteInputController {
return mSpinning.get(key) == token;
}
- private void apply(NotificationData.Entry entry) {
+ private void apply(NotificationEntry entry) {
mDelegate.setRemoteInputActive(entry, isRemoteInputActive(entry));
boolean remoteInputActive = isRemoteInputActive();
int N = mCallbacks.size();
@@ -185,7 +185,7 @@ public class RemoteInputController {
/**
* @return true if {@param entry} has an active RemoteInput
*/
- public boolean isRemoteInputActive(NotificationData.Entry entry) {
+ public boolean isRemoteInputActive(NotificationEntry entry) {
return pruneWeakThenRemoveAndContains(entry /* contains */, null /* remove */,
null /* removeToken */);
}
@@ -208,10 +208,10 @@ public class RemoteInputController {
* @return true if {@param contains} is in the set of active remote inputs
*/
private boolean pruneWeakThenRemoveAndContains(
- NotificationData.Entry contains, NotificationData.Entry remove, Object removeToken) {
+ NotificationEntry contains, NotificationEntry remove, Object removeToken) {
boolean found = false;
for (int i = mOpen.size() - 1; i >= 0; i--) {
- NotificationData.Entry item = mOpen.get(i).first.get();
+ NotificationEntry item = mOpen.get(i).first.get();
Object itemToken = mOpen.get(i).second;
boolean removeTokenMatches = (removeToken == null || itemToken == removeToken);
@@ -235,7 +235,7 @@ public class RemoteInputController {
mCallbacks.add(callback);
}
- public void remoteInputSent(NotificationData.Entry entry) {
+ public void remoteInputSent(NotificationEntry entry) {
int N = mCallbacks.size();
for (int i = 0; i < N; i++) {
mCallbacks.get(i).onRemoteInputSent(entry);
@@ -248,16 +248,16 @@ public class RemoteInputController {
}
// Make a copy because closing the remote inputs will modify mOpen.
- ArrayList<NotificationData.Entry> list = new ArrayList<>(mOpen.size());
+ ArrayList<NotificationEntry> list = new ArrayList<>(mOpen.size());
for (int i = mOpen.size() - 1; i >= 0; i--) {
- NotificationData.Entry entry = mOpen.get(i).first.get();
+ NotificationEntry entry = mOpen.get(i).first.get();
if (entry != null && entry.rowExists()) {
list.add(entry);
}
}
for (int i = list.size() - 1; i >= 0; i--) {
- NotificationData.Entry entry = list.get(i);
+ NotificationEntry entry = list.get(i);
if (entry.rowExists()) {
entry.closeRemoteInput();
}
@@ -268,31 +268,31 @@ public class RemoteInputController {
mDelegate.requestDisallowLongPressAndDismiss();
}
- public void lockScrollTo(NotificationData.Entry entry) {
+ public void lockScrollTo(NotificationEntry entry) {
mDelegate.lockScrollTo(entry);
}
public interface Callback {
default void onRemoteInputActive(boolean active) {}
- default void onRemoteInputSent(NotificationData.Entry entry) {}
+ default void onRemoteInputSent(NotificationEntry entry) {}
}
public interface Delegate {
/**
* Activate remote input if necessary.
*/
- void setRemoteInputActive(NotificationData.Entry entry, boolean remoteInputActive);
-
- /**
- * Request that the view does not dismiss nor perform long press for the current touch.
- */
- void requestDisallowLongPressAndDismiss();
-
- /**
- * Request that the view is made visible by scrolling to it, and keep the scroll locked until
- * the user scrolls, or {@param v} loses focus or is detached.
- */
- void lockScrollTo(NotificationData.Entry entry);
+ void setRemoteInputActive(NotificationEntry entry, boolean remoteInputActive);
+
+ /**
+ * Request that the view does not dismiss nor perform long press for the current touch.
+ */
+ void requestDisallowLongPressAndDismiss();
+
+ /**
+ * Request that the view is made visible by scrolling to it, and keep the scroll locked until
+ * the user scrolls, or {@param entry} loses focus or is detached.
+ */
+ void lockScrollTo(NotificationEntry entry);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
deleted file mode 100644
index a846059a7cce..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- * Copyright (C) 2011 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;
-
-import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS;
-import static android.app.StatusBarManager.DISABLE_NONE;
-
-import android.annotation.DrawableRes;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.telephony.SubscriptionInfo;
-import android.util.ArraySet;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.settingslib.graph.SignalDrawable;
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.policy.IconLogger;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.NetworkController.IconState;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl;
-import com.android.systemui.statusbar.policy.SecurityController;
-import com.android.systemui.tuner.TunerService;
-import com.android.systemui.tuner.TunerService.Tunable;
-import com.android.systemui.util.Utils.DisableStateTracker;
-
-import java.util.ArrayList;
-import java.util.List;
-
-// Intimately tied to the design of res/layout/signal_cluster_view.xml
-public class SignalClusterView extends LinearLayout implements NetworkControllerImpl.SignalCallback,
- SecurityController.SecurityControllerCallback, Tunable, DarkReceiver {
-
- static final String TAG = "SignalClusterView";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private static final String SLOT_AIRPLANE = "airplane";
- private static final String SLOT_MOBILE = "mobile";
- private static final String SLOT_WIFI = "wifi";
- private static final String SLOT_ETHERNET = "ethernet";
- private static final String SLOT_VPN = "vpn";
-
- private final NetworkController mNetworkController;
- private final SecurityController mSecurityController;
-
- private boolean mVpnVisible = false;
- private int mVpnIconId = 0;
- private int mLastVpnIconId = -1;
- private boolean mEthernetVisible = false;
- private int mEthernetIconId = 0;
- private int mLastEthernetIconId = -1;
- private boolean mWifiVisible = false;
- private int mWifiStrengthId = 0;
- private int mLastWifiStrengthId = -1;
- private boolean mWifiIn;
- private boolean mWifiOut;
- private boolean mIsAirplaneMode = false;
- private int mAirplaneIconId = 0;
- private int mLastAirplaneIconId = -1;
- private String mAirplaneContentDescription;
- private String mWifiDescription;
- private String mEthernetDescription;
- private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
- private int mIconTint = Color.WHITE;
- private float mDarkIntensity;
- private final Rect mTintArea = new Rect();
- private int mNoSimsIcon;
-
- ViewGroup mEthernetGroup, mWifiGroup;
- ImageView mVpn, mEthernet, mWifi, mAirplane, mEthernetDark, mWifiDark;
- ImageView mWifiActivityIn;
- ImageView mWifiActivityOut;
- View mWifiAirplaneSpacer;
- View mWifiSignalSpacer;
- LinearLayout mMobileSignalGroup;
-
- private final int mMobileSignalGroupEndPadding;
- private final int mMobileDataIconStartPadding;
- private final int mSecondaryTelephonyPadding;
- private final int mEndPadding;
- private final int mEndPaddingNothingVisible;
- private final float mIconScaleFactor;
-
- private boolean mBlockAirplane;
- private boolean mBlockMobile;
- private boolean mBlockWifi;
- private boolean mBlockEthernet;
- private boolean mActivityEnabled;
- private boolean mForceBlockWifi;
-
- private final IconLogger mIconLogger = Dependency.get(IconLogger.class);
-
- public SignalClusterView(Context context) {
- this(context, null);
- }
-
- public SignalClusterView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- Resources res = getResources();
- mMobileSignalGroupEndPadding =
- res.getDimensionPixelSize(R.dimen.mobile_signal_group_end_padding);
- mMobileDataIconStartPadding =
- res.getDimensionPixelSize(R.dimen.mobile_data_icon_start_padding);
- mSecondaryTelephonyPadding = res.getDimensionPixelSize(R.dimen.secondary_telephony_padding);
- mEndPadding = res.getDimensionPixelSize(R.dimen.signal_cluster_battery_padding);
- mEndPaddingNothingVisible = res.getDimensionPixelSize(
- R.dimen.no_signal_cluster_battery_padding);
-
- TypedValue typedValue = new TypedValue();
- res.getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true);
- mIconScaleFactor = typedValue.getFloat();
- mNetworkController = Dependency.get(NetworkController.class);
- mSecurityController = Dependency.get(SecurityController.class);
- addOnAttachStateChangeListener(
- new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS));
- updateActivityEnabled();
- }
-
- public void setForceBlockWifi() {
- mForceBlockWifi = true;
- mBlockWifi = true;
- if (isAttachedToWindow()) {
- // Re-register to get new callbacks.
- mNetworkController.removeCallback(this);
- mNetworkController.addCallback(this);
- }
- }
-
- @Override
- public void onTuningChanged(String key, String newValue) {
- if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
- return;
- }
- ArraySet<String> blockList = StatusBarIconController.getIconBlacklist(newValue);
- boolean blockAirplane = blockList.contains(SLOT_AIRPLANE);
- boolean blockMobile = blockList.contains(SLOT_MOBILE);
- boolean blockWifi = blockList.contains(SLOT_WIFI);
- boolean blockEthernet = blockList.contains(SLOT_ETHERNET);
-
- if (blockAirplane != mBlockAirplane || blockMobile != mBlockMobile
- || blockEthernet != mBlockEthernet || blockWifi != mBlockWifi) {
- mBlockAirplane = blockAirplane;
- mBlockMobile = blockMobile;
- mBlockEthernet = blockEthernet;
- mBlockWifi = blockWifi || mForceBlockWifi;
- // Re-register to get new callbacks.
- mNetworkController.removeCallback(this);
- mNetworkController.addCallback(this);
- }
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mVpn = findViewById(R.id.vpn);
- mEthernetGroup = findViewById(R.id.ethernet_combo);
- mEthernet = findViewById(R.id.ethernet);
- mEthernetDark = findViewById(R.id.ethernet_dark);
- mWifiGroup = findViewById(R.id.wifi_combo);
- mWifi = findViewById(R.id.wifi_signal);
- mWifiDark = findViewById(R.id.wifi_signal_dark);
- mWifiActivityIn = findViewById(R.id.wifi_in);
- mWifiActivityOut= findViewById(R.id.wifi_out);
- mAirplane = findViewById(R.id.airplane);
- mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
- mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer);
- mMobileSignalGroup = findViewById(R.id.mobile_signal_group);
-
- maybeScaleVpnAndNoSimsIcons();
- }
-
- /**
- * Extracts the icon off of the VPN and no sims views and maybe scale them by
- * {@link #mIconScaleFactor}. Note that the other icons are not scaled here because they are
- * dynamic. As such, they need to be scaled each time the icon changes in {@link #apply()}.
- */
- private void maybeScaleVpnAndNoSimsIcons() {
- if (mIconScaleFactor == 1.f) {
- return;
- }
-
- mVpn.setImageDrawable(new ScalingDrawableWrapper(mVpn.getDrawable(), mIconScaleFactor));
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- mVpnVisible = mSecurityController.isVpnEnabled();
- mVpnIconId = currentVpnIconId(mSecurityController.isVpnBranded());
-
- for (PhoneState state : mPhoneStates) {
- if (state.mMobileGroup.getParent() == null) {
- mMobileSignalGroup.addView(state.mMobileGroup);
- }
- }
-
- int endPadding = mMobileSignalGroup.getChildCount() > 0 ? mMobileSignalGroupEndPadding : 0;
- mMobileSignalGroup.setPaddingRelative(0, 0, endPadding, 0);
-
- Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
-
- apply();
- applyIconTint();
- mNetworkController.addCallback(this);
- mSecurityController.addCallback(this);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- mMobileSignalGroup.removeAllViews();
- Dependency.get(TunerService.class).removeTunable(this);
- mSecurityController.removeCallback(this);
- mNetworkController.removeCallback(this);
-
- super.onDetachedFromWindow();
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
-
- // Re-run all checks against the tint area for all icons
- applyIconTint();
- }
-
- // From SecurityController.
- @Override
- public void onStateChanged() {
- post(new Runnable() {
- @Override
- public void run() {
- mVpnVisible = mSecurityController.isVpnEnabled();
- mVpnIconId = currentVpnIconId(mSecurityController.isVpnBranded());
- apply();
- }
- });
- }
-
- private void updateActivityEnabled() {
- mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity);
- }
-
- @Override
- public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
- boolean activityIn, boolean activityOut, String description, boolean isTransient,
- String secondaryLabel) {
- mWifiVisible = statusIcon.visible && !mBlockWifi;
- mWifiStrengthId = statusIcon.icon;
- mWifiDescription = statusIcon.contentDescription;
- mWifiIn = activityIn && mActivityEnabled && mWifiVisible;
- mWifiOut = activityOut && mActivityEnabled && mWifiVisible;
-
- apply();
- }
-
- @Override
- public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
- int qsType, boolean activityIn, boolean activityOut, int volteIcon,
- String typeContentDescription, String description, boolean isWide,
- int subId, boolean roaming) {
- PhoneState state = getState(subId);
- if (state == null) {
- return;
- }
- state.mMobileVisible = statusIcon.visible && !mBlockMobile;
- state.mMobileStrengthId = statusIcon.icon;
- state.mMobileTypeId = statusType;
- state.mMobileDescription = statusIcon.contentDescription;
- state.mMobileTypeDescription = typeContentDescription;
- state.mRoaming = roaming;
- state.mActivityIn = activityIn && mActivityEnabled;
- state.mActivityOut = activityOut && mActivityEnabled;
-
- apply();
- }
-
- @Override
- public void setEthernetIndicators(IconState state) {
- mEthernetVisible = state.visible && !mBlockEthernet;
- mEthernetIconId = state.icon;
- mEthernetDescription = state.contentDescription;
-
- apply();
- }
-
- @Override
- public void setNoSims(boolean show, boolean simDetected) {
- // Noop. Status bar no longer shows no sim icon.
- }
-
- @Override
- public void setSubs(List<SubscriptionInfo> subs) {
- if (hasCorrectSubs(subs)) {
- return;
- }
- mPhoneStates.clear();
- if (mMobileSignalGroup != null) {
- mMobileSignalGroup.removeAllViews();
- }
- final int n = subs.size();
- for (int i = 0; i < n; i++) {
- inflatePhoneState(subs.get(i).getSubscriptionId());
- }
- if (isAttachedToWindow()) {
- applyIconTint();
- }
- }
-
- private boolean hasCorrectSubs(List<SubscriptionInfo> subs) {
- final int N = subs.size();
- if (N != mPhoneStates.size()) {
- return false;
- }
- for (int i = 0; i < N; i++) {
- if (mPhoneStates.get(i).mSubId != subs.get(i).getSubscriptionId()) {
- return false;
- }
- }
- return true;
- }
-
- private PhoneState getState(int subId) {
- for (PhoneState state : mPhoneStates) {
- if (state.mSubId == subId) {
- return state;
- }
- }
- Log.e(TAG, "Unexpected subscription " + subId);
- return null;
- }
-
- private PhoneState inflatePhoneState(int subId) {
- PhoneState state = new PhoneState(subId, mContext);
- if (mMobileSignalGroup != null) {
- mMobileSignalGroup.addView(state.mMobileGroup);
- }
- mPhoneStates.add(state);
- return state;
- }
-
- @Override
- public void setIsAirplaneMode(IconState icon) {
- mIsAirplaneMode = icon.visible && !mBlockAirplane;
- mAirplaneIconId = icon.icon;
- mAirplaneContentDescription = icon.contentDescription;
-
- apply();
- }
-
- @Override
- public void setMobileDataEnabled(boolean enabled) {
- // Don't care.
- }
-
- @Override
- public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
- // Standard group layout onPopulateAccessibilityEvent() implementations
- // ignore content description, so populate manually
- if (mEthernetVisible && mEthernetGroup != null &&
- mEthernetGroup.getContentDescription() != null)
- event.getText().add(mEthernetGroup.getContentDescription());
- if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
- event.getText().add(mWifiGroup.getContentDescription());
- for (PhoneState state : mPhoneStates) {
- state.populateAccessibilityEvent(event);
- }
- return super.dispatchPopulateAccessibilityEventInternal(event);
- }
-
- @Override
- public void onRtlPropertiesChanged(int layoutDirection) {
- super.onRtlPropertiesChanged(layoutDirection);
-
- if (mEthernet != null) {
- mEthernet.setImageDrawable(null);
- mEthernetDark.setImageDrawable(null);
- mLastEthernetIconId = -1;
- }
-
- if (mWifi != null) {
- mWifi.setImageDrawable(null);
- mWifiDark.setImageDrawable(null);
- mLastWifiStrengthId = -1;
- }
-
- for (PhoneState state : mPhoneStates) {
- if (state.mMobileType != null) {
- state.mMobileType.setImageDrawable(null);
- state.mLastMobileTypeId = -1;
- }
- }
-
- if (mAirplane != null) {
- mAirplane.setImageDrawable(null);
- mLastAirplaneIconId = -1;
- }
-
- apply();
- }
-
- @Override
- public boolean hasOverlappingRendering() {
- return false;
- }
-
- // Run after each indicator change.
- private void apply() {
- if (mWifiGroup == null) return;
-
- if (mVpnVisible) {
- if (mLastVpnIconId != mVpnIconId) {
- setIconForView(mVpn, mVpnIconId);
- mLastVpnIconId = mVpnIconId;
- }
- mIconLogger.onIconShown(SLOT_VPN);
- mVpn.setVisibility(View.VISIBLE);
- } else {
- mIconLogger.onIconHidden(SLOT_VPN);
- mVpn.setVisibility(View.GONE);
- }
- if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE"));
-
- if (mEthernetVisible) {
- if (mLastEthernetIconId != mEthernetIconId) {
- setIconForView(mEthernet, mEthernetIconId);
- setIconForView(mEthernetDark, mEthernetIconId);
- mLastEthernetIconId = mEthernetIconId;
- }
- mEthernetGroup.setContentDescription(mEthernetDescription);
- mIconLogger.onIconShown(SLOT_ETHERNET);
- mEthernetGroup.setVisibility(View.VISIBLE);
- } else {
- mIconLogger.onIconHidden(SLOT_ETHERNET);
- mEthernetGroup.setVisibility(View.GONE);
- }
-
- if (DEBUG) Log.d(TAG,
- String.format("ethernet: %s",
- (mEthernetVisible ? "VISIBLE" : "GONE")));
-
- if (mWifiVisible) {
- if (mWifiStrengthId != mLastWifiStrengthId) {
- setIconForView(mWifi, mWifiStrengthId);
- setIconForView(mWifiDark, mWifiStrengthId);
- mLastWifiStrengthId = mWifiStrengthId;
- }
- mIconLogger.onIconShown(SLOT_WIFI);
- mWifiGroup.setContentDescription(mWifiDescription);
- mWifiGroup.setVisibility(View.VISIBLE);
- } else {
- mIconLogger.onIconHidden(SLOT_WIFI);
- mWifiGroup.setVisibility(View.GONE);
- }
-
- if (DEBUG) Log.d(TAG,
- String.format("wifi: %s sig=%d",
- (mWifiVisible ? "VISIBLE" : "GONE"),
- mWifiStrengthId));
-
- mWifiActivityIn.setVisibility(mWifiIn ? View.VISIBLE : View.GONE);
- mWifiActivityOut.setVisibility(mWifiOut ? View.VISIBLE : View.GONE);
-
- boolean anyMobileVisible = false;
- int firstMobileTypeId = 0;
- for (PhoneState state : mPhoneStates) {
- if (state.apply(anyMobileVisible)) {
- if (!anyMobileVisible) {
- firstMobileTypeId = state.mMobileTypeId;
- anyMobileVisible = true;
- }
- }
- }
- if (anyMobileVisible) {
- mIconLogger.onIconShown(SLOT_MOBILE);
- } else {
- mIconLogger.onIconHidden(SLOT_MOBILE);
- }
-
- if (mIsAirplaneMode) {
- if (mLastAirplaneIconId != mAirplaneIconId) {
- setIconForView(mAirplane, mAirplaneIconId);
- mLastAirplaneIconId = mAirplaneIconId;
- }
- mAirplane.setContentDescription(mAirplaneContentDescription);
- mIconLogger.onIconShown(SLOT_AIRPLANE);
- mAirplane.setVisibility(View.VISIBLE);
- } else {
- mIconLogger.onIconHidden(SLOT_AIRPLANE);
- mAirplane.setVisibility(View.GONE);
- }
-
- if (mIsAirplaneMode && mWifiVisible) {
- mWifiAirplaneSpacer.setVisibility(View.VISIBLE);
- } else {
- mWifiAirplaneSpacer.setVisibility(View.GONE);
- }
-
- if ((anyMobileVisible && firstMobileTypeId != 0) && mWifiVisible) {
- mWifiSignalSpacer.setVisibility(View.VISIBLE);
- } else {
- mWifiSignalSpacer.setVisibility(View.GONE);
- }
-
- boolean anythingVisible = mWifiVisible || mIsAirplaneMode
- || anyMobileVisible || mVpnVisible || mEthernetVisible;
- setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
- }
-
- /**
- * Sets the given drawable id on the view. This method will also scale the icon by
- * {@link #mIconScaleFactor} if appropriate.
- */
- private void setIconForView(ImageView imageView, @DrawableRes int iconId) {
- // Using the imageView's context to retrieve the Drawable so that theme is preserved.
- Drawable icon = imageView.getContext().getDrawable(iconId);
-
- if (mIconScaleFactor == 1.f) {
- imageView.setImageDrawable(icon);
- } else {
- imageView.setImageDrawable(new ScalingDrawableWrapper(icon, mIconScaleFactor));
- }
- }
-
-
- @Override
- public void onDarkChanged(Rect tintArea, float darkIntensity, int tint) {
- boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity
- || !mTintArea.equals(tintArea);
- mIconTint = tint;
- mDarkIntensity = darkIntensity;
- mTintArea.set(tintArea);
- if (changed && isAttachedToWindow()) {
- applyIconTint();
- }
- }
-
- private void applyIconTint() {
- setTint(mVpn, DarkIconDispatcher.getTint(mTintArea, mVpn, mIconTint));
- setTint(mAirplane, DarkIconDispatcher.getTint(mTintArea, mAirplane, mIconTint));
- applyDarkIntensity(
- DarkIconDispatcher.getDarkIntensity(mTintArea, mWifi, mDarkIntensity),
- mWifi, mWifiDark);
- setTint(mWifiActivityIn,
- DarkIconDispatcher.getTint(mTintArea, mWifiActivityIn, mIconTint));
- setTint(mWifiActivityOut,
- DarkIconDispatcher.getTint(mTintArea, mWifiActivityOut, mIconTint));
- applyDarkIntensity(
- DarkIconDispatcher.getDarkIntensity(mTintArea, mEthernet, mDarkIntensity),
- mEthernet, mEthernetDark);
- for (int i = 0; i < mPhoneStates.size(); i++) {
- mPhoneStates.get(i).setIconTint(mIconTint, mDarkIntensity, mTintArea);
- }
- }
-
- private void applyDarkIntensity(float darkIntensity, View lightIcon, View darkIcon) {
- lightIcon.setAlpha(1 - darkIntensity);
- darkIcon.setAlpha(darkIntensity);
- }
-
- private void setTint(ImageView v, int tint) {
- v.setImageTintList(ColorStateList.valueOf(tint));
- }
-
- private int currentVpnIconId(boolean isBranded) {
- return isBranded ? R.drawable.stat_sys_branded_vpn : R.drawable.stat_sys_vpn_ic;
- }
-
- private class PhoneState {
- private final int mSubId;
- private boolean mMobileVisible = false;
- private int mMobileStrengthId = 0, mMobileTypeId = 0;
- private int mLastMobileStrengthId = -1;
- private int mLastMobileTypeId = -1;
- private String mMobileDescription, mMobileTypeDescription;
-
- private ViewGroup mMobileGroup;
- private ImageView mMobile, mMobileType, mMobileRoaming;
- private View mMobileRoamingSpace;
- public boolean mRoaming;
- private ImageView mMobileActivityIn;
- private ImageView mMobileActivityOut;
- public boolean mActivityIn;
- public boolean mActivityOut;
- private SignalDrawable mMobileSignalDrawable;
-
- public PhoneState(int subId, Context context) {
- ViewGroup root = (ViewGroup) LayoutInflater.from(context)
- .inflate(R.layout.mobile_signal_group, null);
- setViews(root);
- mSubId = subId;
- }
-
- public void setViews(ViewGroup root) {
- mMobileGroup = root;
- mMobile = root.findViewById(R.id.mobile_signal);
- mMobileType = root.findViewById(R.id.mobile_type);
- mMobileRoaming = root.findViewById(R.id.mobile_roaming);
- mMobileRoamingSpace = root.findViewById(R.id.mobile_roaming_space);
- mMobileActivityIn = root.findViewById(R.id.mobile_in);
- mMobileActivityOut = root.findViewById(R.id.mobile_out);
- mMobileSignalDrawable = new SignalDrawable(mMobile.getContext());
- mMobile.setImageDrawable(mMobileSignalDrawable);
- }
-
- public boolean apply(boolean isSecondaryIcon) {
- if (mMobileVisible && !mIsAirplaneMode) {
- if (mLastMobileStrengthId != mMobileStrengthId) {
- mMobile.getDrawable().setLevel(mMobileStrengthId);
- mLastMobileStrengthId = mMobileStrengthId;
- }
-
- if (mLastMobileTypeId != mMobileTypeId) {
- mMobileType.setImageResource(mMobileTypeId);
- mLastMobileTypeId = mMobileTypeId;
- }
-
- mMobileGroup.setContentDescription(mMobileTypeDescription
- + " " + mMobileDescription);
- mMobileGroup.setVisibility(View.VISIBLE);
- } else {
- mMobileGroup.setVisibility(View.GONE);
- }
-
- // When this isn't next to wifi, give it some extra padding between the signals.
- mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0,
- 0, 0, 0);
- mMobile.setPaddingRelative(mMobileDataIconStartPadding, 0, 0, 0);
-
- if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d",
- (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
-
- mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
- mMobileRoaming.setVisibility((mRoaming)? View.VISIBLE : View.GONE);
- mMobileRoamingSpace.setVisibility((mRoaming) ? View.VISIBLE : View.GONE);
- mMobileActivityIn.setVisibility(mActivityIn ? View.VISIBLE : View.GONE);
- mMobileActivityOut.setVisibility(mActivityOut ? View.VISIBLE : View.GONE);
-
- return mMobileVisible;
- }
-
- public void populateAccessibilityEvent(AccessibilityEvent event) {
- if (mMobileVisible && mMobileGroup != null
- && mMobileGroup.getContentDescription() != null) {
- event.getText().add(mMobileGroup.getContentDescription());
- }
- }
-
- public void setIconTint(int tint, float darkIntensity, Rect tintArea) {
- mMobileSignalDrawable.setDarkIntensity(darkIntensity);
- setTint(mMobileType, DarkIconDispatcher.getTint(tintArea, mMobileType, tint));
- setTint(mMobileRoaming, DarkIconDispatcher.getTint(tintArea, mMobileRoaming,
- tint));
- setTint(mMobileActivityIn,
- DarkIconDispatcher.getTint(tintArea, mMobileActivityIn, tint));
- setTint(mMobileActivityOut,
- DarkIconDispatcher.getTint(tintArea, mMobileActivityOut, tint));
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
index 9e91133aff09..573c1f8ee509 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
@@ -21,8 +21,8 @@ import android.util.ArraySet;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import java.util.Set;
@@ -54,7 +54,7 @@ public class SmartReplyController {
/**
* Notifies StatusBarService a smart reply is sent.
*/
- public void smartReplySent(NotificationData.Entry entry, int replyIndex, CharSequence reply,
+ public void smartReplySent(NotificationEntry entry, int replyIndex, CharSequence reply,
boolean generatedByAssistant) {
mCallback.onSmartReplySent(entry, reply);
mSendingKeys.add(entry.key);
@@ -70,7 +70,7 @@ public class SmartReplyController {
* Notifies StatusBarService a smart action is clicked.
*/
public void smartActionClicked(
- NotificationData.Entry entry, int actionIndex, Notification.Action action,
+ NotificationEntry entry, int actionIndex, Notification.Action action,
boolean generatedByAssistant) {
final int count = mEntryManager.getNotificationData().getActiveNotifications().size();
final int rank = mEntryManager.getNotificationData().getRank(entry.key);
@@ -95,7 +95,7 @@ public class SmartReplyController {
/**
* Smart Replies and Actions have been added to the UI.
*/
- public void smartSuggestionsAdded(final NotificationData.Entry entry, int replyCount,
+ public void smartSuggestionsAdded(final NotificationEntry entry, int replyCount,
int actionCount, boolean generatedByAssistant) {
try {
mBarService.onNotificationSmartSuggestionsAdded(
@@ -105,7 +105,7 @@ public class SmartReplyController {
}
}
- public void stopSending(final NotificationData.Entry entry) {
+ public void stopSending(final NotificationEntry entry) {
if (entry != null) {
mSendingKeys.remove(entry.notification.getKey());
}
@@ -121,6 +121,6 @@ public class SmartReplyController {
* @param entry the entry for the notification
* @param reply the reply that was sent
*/
- void onSmartReplySent(NotificationData.Entry entry, CharSequence reply);
+ void onSmartReplySent(NotificationEntry entry, CharSequence reply);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 3c1335456d04..19ed13e7a95e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -206,6 +206,10 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
mIconScale = SYSTEM_ICON_SCALE;
}
+ public float getIconScaleFullyDark() {
+ return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize;
+ }
+
public float getIconScale() {
return mIconScale;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateController.java
index 087b65592b7a..54bce1c00354 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateController.java
@@ -331,7 +331,8 @@ public class StatusBarStateController implements CallbackController<StateListene
*
* @param newState the new {@link StatusBarState}
*/
- public void onStateChanged(int newState);
+ default void onStateChanged(int newState) {
+ }
/**
* Callback to be notified when Dozing changes. Dozing is stored separately from state.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
index 7b42dd901d72..5605f3db90fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
@@ -20,7 +20,6 @@ import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORC
import static com.android.systemui.statusbar.notification.row.NotificationInflater.FLAG_CONTENT_VIEW_AMBIENT;
import static com.android.systemui.statusbar.notification.row.NotificationInflater.FLAG_CONTENT_VIEW_HEADS_UP;
-import android.annotation.Nullable;
import android.app.Notification;
import android.service.notification.StatusBarNotification;
import android.util.Log;
@@ -30,6 +29,7 @@ import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -72,24 +72,21 @@ public class NotificationAlertingManager {
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
- public void onEntryInflated(NotificationData.Entry entry, int inflatedFlags) {
+ public void onEntryInflated(NotificationEntry entry, int inflatedFlags) {
showAlertingView(entry, inflatedFlags);
}
@Override
- public void onEntryUpdated(NotificationData.Entry entry) {
+ public void onPostEntryUpdated(NotificationEntry entry) {
updateAlertState(entry);
}
@Override
public void onEntryRemoved(
- @Nullable NotificationData.Entry entry,
- String key,
- StatusBarNotification old,
+ NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
- stopAlerting(key);
+ stopAlerting(entry.key);
}
});
}
@@ -105,7 +102,7 @@ public class NotificationAlertingManager {
* @param entry entry to add
* @param inflatedFlags flags representing content views that were inflated
*/
- private void showAlertingView(NotificationData.Entry entry,
+ private void showAlertingView(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
if ((inflatedFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0) {
// Possible for shouldHeadsUp to change between the inflation starting and ending.
@@ -127,7 +124,7 @@ public class NotificationAlertingManager {
}
}
- private void updateAlertState(NotificationData.Entry entry) {
+ private void updateAlertState(NotificationEntry entry) {
boolean alertAgain = alertAgain(entry, entry.notification.getNotification());
AlertingNotificationManager alertManager;
boolean shouldAlert;
@@ -153,8 +150,15 @@ public class NotificationAlertingManager {
}
}
- private static boolean alertAgain(
- NotificationData.Entry oldEntry, Notification newNotification) {
+ /**
+ * Checks whether an update for a notification warrants an alert for the user.
+ *
+ * @param oldEntry the entry for this notification.
+ * @param newNotification the new notification for this entry.
+ * @return whether this notification should alert the user.
+ */
+ public static boolean alertAgain(
+ NotificationEntry oldEntry, Notification newNotification) {
return oldEntry == null || !oldEntry.hasInterrupted()
|| (newNotification.flags & Notification.FLAG_ONLY_ALERT_ONCE) == 0;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationData.java
deleted file mode 100644
index a51896ee69fc..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationData.java
+++ /dev/null
@@ -1,1072 +0,0 @@
-/*
- * Copyright (C) 2008 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.notification;
-
-import static android.app.Notification.CATEGORY_ALARM;
-import static android.app.Notification.CATEGORY_CALL;
-import static android.app.Notification.CATEGORY_EVENT;
-import static android.app.Notification.CATEGORY_MESSAGE;
-import static android.app.Notification.CATEGORY_REMINDER;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
-
-import android.annotation.NonNull;
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.Person;
-import android.content.Context;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.service.notification.NotificationListenerService.Ranking;
-import android.service.notification.NotificationListenerService.RankingMap;
-import android.service.notification.SnoozeCriterion;
-import android.service.notification.StatusBarNotification;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.view.View;
-import android.widget.ImageView;
-
-import androidx.annotation.Nullable;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.ContrastColorUtil;
-import com.android.systemui.Dependency;
-import com.android.systemui.statusbar.InflationTask;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.StatusBarIconView;
-import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.notification.row.NotificationGuts;
-import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
-import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.policy.HeadsUpManager;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * The list of currently displaying notifications.
- */
-public class NotificationData {
-
- private final NotificationFilter mNotificationFilter = Dependency.get(NotificationFilter.class);
-
- /**
- * These dependencies are late init-ed
- */
- private KeyguardEnvironment mEnvironment;
- private NotificationMediaManager mMediaManager;
-
- private HeadsUpManager mHeadsUpManager;
-
- public static final class Entry {
- private static final long LAUNCH_COOLDOWN = 2000;
- private static final long REMOTE_INPUT_COOLDOWN = 500;
- private static final long INITIALIZATION_DELAY = 400;
- private static final long NOT_LAUNCHED_YET = -LAUNCH_COOLDOWN;
- private static final int COLOR_INVALID = 1;
- public final String key;
- public StatusBarNotification notification;
- public NotificationChannel channel;
- public long lastAudiblyAlertedMs;
- public boolean noisy;
- public boolean ambient;
- public int importance;
- public StatusBarIconView icon;
- public StatusBarIconView expandedIcon;
- private boolean interruption;
- public boolean autoRedacted; // whether the redacted notification was generated by us
- public int targetSdk;
- private long lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
- public CharSequence remoteInputText;
- public List<SnoozeCriterion> snoozeCriteria;
- public int userSentiment = Ranking.USER_SENTIMENT_NEUTRAL;
- /** Smart Actions provided by the NotificationAssistantService. */
- @NonNull
- public List<Notification.Action> systemGeneratedSmartActions = Collections.emptyList();
- public CharSequence[] smartReplies = new CharSequence[0];
- @VisibleForTesting
- public int suppressedVisualEffects;
- public boolean suspended;
-
- private Entry parent; // our parent (if we're in a group)
- private ArrayList<Entry> children = new ArrayList<Entry>();
- private ExpandableNotificationRow row; // the outer expanded view
-
- private int mCachedContrastColor = COLOR_INVALID;
- private int mCachedContrastColorIsFor = COLOR_INVALID;
- private InflationTask mRunningTask = null;
- private Throwable mDebugThrowable;
- public CharSequence remoteInputTextWhenReset;
- public long lastRemoteInputSent = NOT_LAUNCHED_YET;
- public ArraySet<Integer> mActiveAppOps = new ArraySet<>(3);
- public CharSequence headsUpStatusBarText;
- public CharSequence headsUpStatusBarTextPublic;
-
- private long initializationTime = -1;
-
- /**
- * Whether or not this row represents a system notification. Note that if this is
- * {@code null}, that means we were either unable to retrieve the info or have yet to
- * retrieve the info.
- */
- public Boolean mIsSystemNotification;
-
- /**
- * Has the user sent a reply through this Notification.
- */
- private boolean hasSentReply;
-
- /**
- * Whether this notification should be displayed as a bubble.
- */
- private boolean mIsBubble;
-
- /**
- * Whether the user has dismissed this notification when it was in bubble form.
- */
- private boolean mUserDismissedBubble;
-
- public Entry(StatusBarNotification n) {
- this(n, null);
- }
-
- public Entry(StatusBarNotification n, @Nullable Ranking ranking) {
- this.key = n.getKey();
- this.notification = n;
- if (ranking != null) {
- populateFromRanking(ranking);
- }
- }
-
- public void populateFromRanking(@NonNull Ranking ranking) {
- channel = ranking.getChannel();
- lastAudiblyAlertedMs = ranking.getLastAudiblyAlertedMillis();
- importance = ranking.getImportance();
- ambient = ranking.isAmbient();
- snoozeCriteria = ranking.getSnoozeCriteria();
- userSentiment = ranking.getUserSentiment();
- systemGeneratedSmartActions = ranking.getSmartActions() == null
- ? Collections.emptyList() : ranking.getSmartActions();
- smartReplies = ranking.getSmartReplies() == null
- ? new CharSequence[0]
- : ranking.getSmartReplies().toArray(new CharSequence[0]);
- suppressedVisualEffects = ranking.getSuppressedVisualEffects();
- suspended = ranking.isSuspended();
- }
-
- public void setInterruption() {
- interruption = true;
- }
-
- public boolean hasInterrupted() {
- return interruption;
- }
-
- public void setIsBubble(boolean bubbleable) {
- mIsBubble = bubbleable;
- }
-
- public boolean isBubble() {
- return mIsBubble;
- }
-
- public void setBubbleDismissed(boolean userDismissed) {
- mUserDismissedBubble = userDismissed;
- }
-
- public boolean isBubbleDismissed() {
- return mUserDismissedBubble;
- }
-
- /**
- * Resets the notification entry to be re-used.
- */
- public void reset() {
- if (row != null) {
- row.reset();
- }
- }
-
- public ExpandableNotificationRow getRow() {
- return row;
- }
-
- //TODO: This will go away when we have a way to bind an entry to a row
- public void setRow(ExpandableNotificationRow row) {
- this.row = row;
- }
-
- @Nullable
- public List<Entry> getChildren() {
- if (children.size() <= 0) {
- return null;
- }
-
- return children;
- }
-
- public void notifyFullScreenIntentLaunched() {
- setInterruption();
- lastFullScreenIntentLaunchTime = SystemClock.elapsedRealtime();
- }
-
- public boolean hasJustLaunchedFullScreenIntent() {
- return SystemClock.elapsedRealtime() < lastFullScreenIntentLaunchTime + LAUNCH_COOLDOWN;
- }
-
- public boolean hasJustSentRemoteInput() {
- return SystemClock.elapsedRealtime() < lastRemoteInputSent + REMOTE_INPUT_COOLDOWN;
- }
-
- public boolean hasFinishedInitialization() {
- return initializationTime == -1 ||
- SystemClock.elapsedRealtime() > initializationTime + INITIALIZATION_DELAY;
- }
-
- /**
- * Create the icons for a notification
- * @param context the context to create the icons with
- * @param sbn the notification
- * @throws InflationException
- */
- public void createIcons(Context context, StatusBarNotification sbn)
- throws InflationException {
- Notification n = sbn.getNotification();
- final Icon smallIcon = n.getSmallIcon();
- if (smallIcon == null) {
- throw new InflationException("No small icon in notification from "
- + sbn.getPackageName());
- }
-
- // Construct the icon.
- icon = new StatusBarIconView(context,
- sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn);
- icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
-
- // Construct the expanded icon.
- expandedIcon = new StatusBarIconView(context,
- sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn);
- expandedIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- final StatusBarIcon ic = new StatusBarIcon(
- sbn.getUser(),
- sbn.getPackageName(),
- smallIcon,
- n.iconLevel,
- n.number,
- StatusBarIconView.contentDescForNotification(context, n));
- if (!icon.set(ic) || !expandedIcon.set(ic)) {
- icon = null;
- expandedIcon = null;
- throw new InflationException("Couldn't create icon: " + ic);
- }
- expandedIcon.setVisibility(View.INVISIBLE);
- expandedIcon.setOnVisibilityChangedListener(
- newVisibility -> {
- if (row != null) {
- row.setIconsVisible(newVisibility != View.VISIBLE);
- }
- });
- }
-
- public void setIconTag(int key, Object tag) {
- if (icon != null) {
- icon.setTag(key, tag);
- expandedIcon.setTag(key, tag);
- }
- }
-
- /**
- * Update the notification icons.
- *
- * @param context the context to create the icons with.
- * @param sbn the notification to read the icon from.
- * @throws InflationException
- */
- public void updateIcons(Context context, StatusBarNotification sbn)
- throws InflationException {
- if (icon != null) {
- // Update the icon
- Notification n = sbn.getNotification();
- final StatusBarIcon ic = new StatusBarIcon(
- notification.getUser(),
- notification.getPackageName(),
- n.getSmallIcon(),
- n.iconLevel,
- n.number,
- StatusBarIconView.contentDescForNotification(context, n));
- icon.setNotification(sbn);
- expandedIcon.setNotification(sbn);
- if (!icon.set(ic) || !expandedIcon.set(ic)) {
- throw new InflationException("Couldn't update icon: " + ic);
- }
- }
- }
-
- public int getContrastedColor(Context context, boolean isLowPriority,
- int backgroundColor) {
- int rawColor = isLowPriority ? Notification.COLOR_DEFAULT :
- notification.getNotification().color;
- if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) {
- return mCachedContrastColor;
- }
- final int contrasted = ContrastColorUtil.resolveContrastColor(context, rawColor,
- backgroundColor);
- mCachedContrastColorIsFor = rawColor;
- mCachedContrastColor = contrasted;
- return mCachedContrastColor;
- }
-
- /**
- * Abort all existing inflation tasks
- */
- public void abortTask() {
- if (mRunningTask != null) {
- mRunningTask.abort();
- mRunningTask = null;
- }
- }
-
- public void setInflationTask(InflationTask abortableTask) {
- // abort any existing inflation
- InflationTask existing = mRunningTask;
- abortTask();
- mRunningTask = abortableTask;
- if (existing != null && mRunningTask != null) {
- mRunningTask.supersedeTask(existing);
- }
- }
-
- public void onInflationTaskFinished() {
- mRunningTask = null;
- }
-
- @VisibleForTesting
- public InflationTask getRunningTask() {
- return mRunningTask;
- }
-
- /**
- * Set a throwable that is used for debugging
- *
- * @param debugThrowable the throwable to save
- */
- public void setDebugThrowable(Throwable debugThrowable) {
- mDebugThrowable = debugThrowable;
- }
-
- public Throwable getDebugThrowable() {
- return mDebugThrowable;
- }
-
- public void onRemoteInputInserted() {
- lastRemoteInputSent = NOT_LAUNCHED_YET;
- remoteInputTextWhenReset = null;
- }
-
- public void setHasSentReply() {
- hasSentReply = true;
- }
-
- public boolean isLastMessageFromReply() {
- if (!hasSentReply) {
- return false;
- }
- Bundle extras = notification.getNotification().extras;
- CharSequence[] replyTexts = extras.getCharSequenceArray(
- Notification.EXTRA_REMOTE_INPUT_HISTORY);
- if (!ArrayUtils.isEmpty(replyTexts)) {
- return true;
- }
- Parcelable[] messages = extras.getParcelableArray(Notification.EXTRA_MESSAGES);
- if (messages != null && messages.length > 0) {
- Parcelable message = messages[messages.length - 1];
- if (message instanceof Bundle) {
- Notification.MessagingStyle.Message lastMessage =
- Notification.MessagingStyle.Message.getMessageFromBundle(
- (Bundle) message);
- if (lastMessage != null) {
- Person senderPerson = lastMessage.getSenderPerson();
- if (senderPerson == null) {
- return true;
- }
- Person user = extras.getParcelable(Notification.EXTRA_MESSAGING_PERSON);
- return Objects.equals(user, senderPerson);
- }
- }
- }
- return false;
- }
-
- public void setInitializationTime(long time) {
- if (initializationTime == -1) {
- initializationTime = time;
- }
- }
-
- public void sendAccessibilityEvent(int eventType) {
- if (row != null) {
- row.sendAccessibilityEvent(eventType);
- }
- }
-
- /**
- * Used by NotificationMediaManager to determine... things
- * @return {@code true} if we are a media notification
- */
- public boolean isMediaNotification() {
- if (row == null) return false;
-
- return row.isMediaRow();
- }
-
- /**
- * We are a top level child if our parent is the list of notifications duh
- * @return {@code true} if we're a top level notification
- */
- public boolean isTopLevelChild() {
- return row != null && row.isTopLevelChild();
- }
-
- public void resetUserExpansion() {
- if (row != null) row.resetUserExpansion();
- }
-
- public void freeContentViewWhenSafe(@InflationFlag int inflationFlag) {
- if (row != null) row.freeContentViewWhenSafe(inflationFlag);
- }
-
- public void setAmbientPulsing(boolean pulsing) {
- if (row != null) row.setAmbientPulsing(pulsing);
- }
-
- public boolean rowExists() {
- return row != null;
- }
-
- public boolean isRowDismissed() {
- return row != null && row.isDismissed();
- }
-
- public boolean isRowRemoved() {
- return row != null && row.isRemoved();
- }
-
- /**
- * @return {@code true} if the row is null or removed
- */
- public boolean isRemoved() {
- //TODO: recycling invalidates this
- return row == null || row.isRemoved();
- }
-
- /**
- * @return {@code true} if the row is null or dismissed
- */
- public boolean isDismissed() {
- //TODO: recycling
- return row == null || row.isDismissed();
- }
-
- public boolean isRowPinned() {
- return row != null && row.isPinned();
- }
-
- public void setRowPinned(boolean pinned) {
- if (row != null) row.setPinned(pinned);
- }
-
- public boolean isRowAnimatingAway() {
- return row != null && row.isHeadsUpAnimatingAway();
- }
-
- public boolean isRowHeadsUp() {
- return row != null && row.isHeadsUp();
- }
-
- public void setHeadsUp(boolean shouldHeadsUp) {
- if (row != null) row.setHeadsUp(shouldHeadsUp);
- }
-
- public boolean mustStayOnScreen() {
- return row != null && row.mustStayOnScreen();
- }
-
- public void setHeadsUpIsVisible() {
- if (row != null) row.setHeadsUpIsVisible();
- }
-
- //TODO: i'm imagining a world where this isn't just the row, but I could be rwong
- public ExpandableNotificationRow getHeadsUpAnimationView() {
- return row;
- }
-
- public void setUserLocked(boolean userLocked) {
- if (row != null) row.setUserLocked(userLocked);
- }
-
- public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) {
- if (row != null) row.setUserExpanded(userExpanded, allowChildExpansion);
- }
-
- public void setGroupExpansionChanging(boolean changing) {
- if (row != null) row.setGroupExpansionChanging(changing);
- }
-
- public void notifyHeightChanged(boolean needsAnimation) {
- if (row != null) row.notifyHeightChanged(needsAnimation);
- }
-
- public void closeRemoteInput() {
- if (row != null) row.closeRemoteInput();
- }
-
- public boolean areChildrenExpanded() {
- return row != null && row.areChildrenExpanded();
- }
-
- public boolean keepInParent() {
- return row != null && row.keepInParent();
- }
-
- //TODO: probably less confusing to say "is group fully visible"
- public boolean isGroupNotFullyVisible() {
- return row == null || row.isGroupNotFullyVisible();
- }
-
- public NotificationGuts getGuts() {
- if (row != null) return row.getGuts();
- return null;
- }
-
- public boolean hasLowPriorityStateUpdated() {
- return row != null && row.hasLowPriorityStateUpdated();
- }
-
- public void removeRow() {
- if (row != null) row.setRemoved();
- }
-
- public boolean isSummaryWithChildren() {
- return row != null && row.isSummaryWithChildren();
- }
-
- public void setKeepInParent(boolean keep) {
- if (row != null) row.setKeepInParent(keep);
- }
-
- public void onDensityOrFontScaleChanged() {
- if (row != null) row.onDensityOrFontScaleChanged();
- }
-
- public boolean areGutsExposed() {
- return row != null && row.getGuts() != null && row.getGuts().isExposed();
- }
-
- public boolean isChildInGroup() {
- return parent == null;
- }
-
- public void setLowPriorityStateUpdated(boolean updated) {
- if (row != null) row.setLowPriorityStateUpdated(updated);
- }
-
- /**
- * @return Can the underlying notification be cleared? This can be different from whether the
- * notification can be dismissed in case notifications are sensitive on the lockscreen.
- * @see #canViewBeDismissed()
- */
- public boolean isClearable() {
- if (notification == null || !notification.isClearable()) {
- return false;
- }
- if (children.size() > 0) {
- for (int i = 0; i < children.size(); i++) {
- Entry child = children.get(i);
- if (!child.isClearable()) {
- return false;
- }
- }
- }
- return true;
- }
-
- public boolean canViewBeDismissed() {
- if (row == null) return true;
- return row.canViewBeDismissed();
- }
-
- boolean isExemptFromDndVisualSuppression() {
- if (isNotificationBlockedByPolicy(notification.getNotification())) {
- return false;
- }
-
- if ((notification.getNotification().flags
- & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
- return true;
- }
- if (notification.getNotification().isMediaNotification()) {
- return true;
- }
- if (mIsSystemNotification != null && mIsSystemNotification) {
- return true;
- }
- return false;
- }
-
- private boolean shouldSuppressVisualEffect(int effect) {
- if (isExemptFromDndVisualSuppression()) {
- return false;
- }
- return (suppressedVisualEffects & effect) != 0;
- }
-
- /**
- * Returns whether {@link NotificationManager.Policy#SUPPRESSED_EFFECT_FULL_SCREEN_INTENT}
- * is set for this entry.
- */
- public boolean shouldSuppressFullScreenIntent() {
- return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_FULL_SCREEN_INTENT);
- }
-
- /**
- * Returns whether {@link NotificationManager.Policy#SUPPRESSED_EFFECT_PEEK}
- * is set for this entry.
- */
- public boolean shouldSuppressPeek() {
- return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_PEEK);
- }
-
- /**
- * Returns whether {@link NotificationManager.Policy#SUPPRESSED_EFFECT_STATUS_BAR}
- * is set for this entry.
- */
- public boolean shouldSuppressStatusBar() {
- return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_STATUS_BAR);
- }
-
- /**
- * Returns whether {@link NotificationManager.Policy#SUPPRESSED_EFFECT_AMBIENT}
- * is set for this entry.
- */
- public boolean shouldSuppressAmbient() {
- return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_AMBIENT);
- }
-
- /**
- * Returns whether {@link NotificationManager.Policy#SUPPRESSED_EFFECT_NOTIFICATION_LIST}
- * is set for this entry.
- */
- public boolean shouldSuppressNotificationList() {
- return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_NOTIFICATION_LIST);
- }
- }
-
- private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
- private final ArrayList<Entry> mSortedAndFiltered = new ArrayList<>();
- private final ArrayList<Entry> mFilteredForUser = new ArrayList<>();
-
- private final NotificationGroupManager mGroupManager
- = Dependency.get(NotificationGroupManager.class);
-
- private RankingMap mRankingMap;
- private final Ranking mTmpRanking = new Ranking();
-
- public void setHeadsUpManager(HeadsUpManager headsUpManager) {
- mHeadsUpManager = headsUpManager;
- }
-
- private final Comparator<Entry> mRankingComparator = new Comparator<Entry>() {
- private final Ranking mRankingA = new Ranking();
- private final Ranking mRankingB = new Ranking();
-
- @Override
- public int compare(Entry a, Entry b) {
- final StatusBarNotification na = a.notification;
- final StatusBarNotification nb = b.notification;
- int aImportance = NotificationManager.IMPORTANCE_DEFAULT;
- int bImportance = NotificationManager.IMPORTANCE_DEFAULT;
- int aRank = 0;
- int bRank = 0;
-
- if (mRankingMap != null) {
- // RankingMap as received from NoMan
- getRanking(a.key, mRankingA);
- getRanking(b.key, mRankingB);
- aImportance = mRankingA.getImportance();
- bImportance = mRankingB.getImportance();
- aRank = mRankingA.getRank();
- bRank = mRankingB.getRank();
- }
-
- String mediaNotification = getMediaManager().getMediaNotificationKey();
-
- // IMPORTANCE_MIN media streams are allowed to drift to the bottom
- final boolean aMedia = a.key.equals(mediaNotification)
- && aImportance > NotificationManager.IMPORTANCE_MIN;
- final boolean bMedia = b.key.equals(mediaNotification)
- && bImportance > NotificationManager.IMPORTANCE_MIN;
-
- boolean aSystemMax = aImportance >= NotificationManager.IMPORTANCE_HIGH &&
- isSystemNotification(na);
- boolean bSystemMax = bImportance >= NotificationManager.IMPORTANCE_HIGH &&
- isSystemNotification(nb);
-
- boolean isHeadsUp = a.row.isHeadsUp();
- if (isHeadsUp != b.row.isHeadsUp()) {
- return isHeadsUp ? -1 : 1;
- } else if (isHeadsUp) {
- // Provide consistent ranking with headsUpManager
- return mHeadsUpManager.compare(a, b);
- } else if (a.row.isAmbientPulsing() != b.row.isAmbientPulsing()) {
- return a.row.isAmbientPulsing() ? -1 : 1;
- } else if (aMedia != bMedia) {
- // Upsort current media notification.
- return aMedia ? -1 : 1;
- } else if (aSystemMax != bSystemMax) {
- // Upsort PRIORITY_MAX system notifications
- return aSystemMax ? -1 : 1;
- } else if (aRank != bRank) {
- return aRank - bRank;
- } else {
- return Long.compare(nb.getNotification().when, na.getNotification().when);
- }
- }
- };
-
- private KeyguardEnvironment getEnvironment() {
- if (mEnvironment == null) {
- mEnvironment = Dependency.get(KeyguardEnvironment.class);
- }
- return mEnvironment;
- }
-
- private NotificationMediaManager getMediaManager() {
- if (mMediaManager == null) {
- mMediaManager = Dependency.get(NotificationMediaManager.class);
- }
- return mMediaManager;
- }
-
- /**
- * Returns the sorted list of active notifications (depending on {@link KeyguardEnvironment}
- *
- * <p>
- * This call doesn't update the list of active notifications. Call {@link #filterAndSort()}
- * when the environment changes.
- * <p>
- * Don't hold on to or modify the returned list.
- */
- public ArrayList<Entry> getActiveNotifications() {
- return mSortedAndFiltered;
- }
-
- public ArrayList<Entry> getNotificationsForCurrentUser() {
- mFilteredForUser.clear();
-
- synchronized (mEntries) {
- final int N = mEntries.size();
- for (int i = 0; i < N; i++) {
- Entry entry = mEntries.valueAt(i);
- final StatusBarNotification sbn = entry.notification;
- if (!getEnvironment().isNotificationForCurrentProfiles(sbn)) {
- continue;
- }
- mFilteredForUser.add(entry);
- }
- }
- return mFilteredForUser;
- }
-
- public Entry get(String key) {
- return mEntries.get(key);
- }
-
- public void add(Entry entry) {
- synchronized (mEntries) {
- mEntries.put(entry.notification.getKey(), entry);
- }
- mGroupManager.onEntryAdded(entry);
-
- updateRankingAndSort(mRankingMap);
- }
-
- public Entry remove(String key, RankingMap ranking) {
- Entry removed;
- synchronized (mEntries) {
- removed = mEntries.remove(key);
- }
- if (removed == null) return null;
- mGroupManager.onEntryRemoved(removed);
- updateRankingAndSort(ranking);
- return removed;
- }
-
- /** Updates the given notification entry with the provided ranking. */
- public void update(Entry entry, RankingMap ranking, StatusBarNotification notification) {
- updateRanking(ranking);
- final StatusBarNotification oldNotification = entry.notification;
- entry.notification = notification;
- mGroupManager.onEntryUpdated(entry, oldNotification);
- }
-
- public void updateRanking(RankingMap ranking) {
- updateRankingAndSort(ranking);
- }
-
- public void updateAppOp(int appOp, int uid, String pkg, String key, boolean showIcon) {
- synchronized (mEntries) {
- final int N = mEntries.size();
- for (int i = 0; i < N; i++) {
- Entry entry = mEntries.valueAt(i);
- if (uid == entry.notification.getUid()
- && pkg.equals(entry.notification.getPackageName())
- && key.equals(entry.key)) {
- if (showIcon) {
- entry.mActiveAppOps.add(appOp);
- } else {
- entry.mActiveAppOps.remove(appOp);
- }
- }
- }
- }
- }
-
- /**
- * Returns true if this notification should be displayed in the high-priority notifications
- * section (and on the lockscreen and status bar).
- */
- public boolean isHighPriority(StatusBarNotification statusBarNotification) {
- if (mRankingMap != null) {
- getRanking(statusBarNotification.getKey(), mTmpRanking);
- if (mTmpRanking.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT
- || statusBarNotification.getNotification().isForegroundService()
- || statusBarNotification.getNotification().hasMediaSession()) {
- return true;
- }
- if (mGroupManager.isSummaryOfGroup(statusBarNotification)) {
- for (Entry child : mGroupManager.getLogicalChildren(statusBarNotification)) {
- if (isHighPriority(child.notification)) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- public boolean isAmbient(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.isAmbient();
- }
- return false;
- }
-
- public int getVisibilityOverride(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getVisibilityOverride();
- }
- return Ranking.VISIBILITY_NO_OVERRIDE;
- }
-
- /**
- * Categories that are explicitly called out on DND settings screens are always blocked, if
- * DND has flagged them, even if they are foreground or system notifications that might
- * otherwise visually bypass DND.
- */
- private static boolean isNotificationBlockedByPolicy(Notification n) {
- if (isCategory(CATEGORY_CALL, n)
- || isCategory(CATEGORY_MESSAGE, n)
- || isCategory(CATEGORY_ALARM, n)
- || isCategory(CATEGORY_EVENT, n)
- || isCategory(CATEGORY_REMINDER, n)) {
- return true;
- }
- return false;
- }
-
- private static boolean isCategory(String category, Notification n) {
- return Objects.equals(n.category, category);
- }
-
- public int getImportance(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getImportance();
- }
- return NotificationManager.IMPORTANCE_UNSPECIFIED;
- }
-
- public String getOverrideGroupKey(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getOverrideGroupKey();
- }
- return null;
- }
-
- public List<SnoozeCriterion> getSnoozeCriteria(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getSnoozeCriteria();
- }
- return null;
- }
-
- public NotificationChannel getChannel(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getChannel();
- }
- return null;
- }
-
- public int getRank(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.getRank();
- }
- return 0;
- }
-
- public boolean shouldHide(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return mTmpRanking.isSuspended();
- }
- return false;
- }
-
- private void updateRankingAndSort(RankingMap ranking) {
- if (ranking != null) {
- mRankingMap = ranking;
- synchronized (mEntries) {
- final int N = mEntries.size();
- for (int i = 0; i < N; i++) {
- Entry entry = mEntries.valueAt(i);
- if (!getRanking(entry.key, mTmpRanking)) {
- continue;
- }
- final StatusBarNotification oldSbn = entry.notification.cloneLight();
- final String overrideGroupKey = getOverrideGroupKey(entry.key);
- if (!Objects.equals(oldSbn.getOverrideGroupKey(), overrideGroupKey)) {
- entry.notification.setOverrideGroupKey(overrideGroupKey);
- mGroupManager.onEntryUpdated(entry, oldSbn);
- }
- entry.populateFromRanking(mTmpRanking);
- }
- }
- }
- filterAndSort();
- }
-
- /**
- * Get the ranking from the current ranking map.
- *
- * @param key the key to look up
- * @param outRanking the ranking to populate
- *
- * @return {@code true} if the ranking was properly obtained.
- */
- @VisibleForTesting
- protected boolean getRanking(String key, Ranking outRanking) {
- return mRankingMap.getRanking(key, outRanking);
- }
-
- // TODO: This should not be public. Instead the Environment should notify this class when
- // anything changed, and this class should call back the UI so it updates itself.
- public void filterAndSort() {
- mSortedAndFiltered.clear();
-
- synchronized (mEntries) {
- final int N = mEntries.size();
- for (int i = 0; i < N; i++) {
- Entry entry = mEntries.valueAt(i);
-
- if (mNotificationFilter.shouldFilterOut(entry)) {
- continue;
- }
-
- mSortedAndFiltered.add(entry);
- }
- }
-
- Collections.sort(mSortedAndFiltered, mRankingComparator);
- }
-
- public void dump(PrintWriter pw, String indent) {
- int N = mSortedAndFiltered.size();
- pw.print(indent);
- pw.println("active notifications: " + N);
- int active;
- for (active = 0; active < N; active++) {
- NotificationData.Entry e = mSortedAndFiltered.get(active);
- dumpEntry(pw, indent, active, e);
- }
- synchronized (mEntries) {
- int M = mEntries.size();
- pw.print(indent);
- pw.println("inactive notifications: " + (M - active));
- int inactiveCount = 0;
- for (int i = 0; i < M; i++) {
- Entry entry = mEntries.valueAt(i);
- if (!mSortedAndFiltered.contains(entry)) {
- dumpEntry(pw, indent, inactiveCount, entry);
- inactiveCount++;
- }
- }
- }
- }
-
- private void dumpEntry(PrintWriter pw, String indent, int i, Entry e) {
- getRanking(e.key, mTmpRanking);
- pw.print(indent);
- pw.println(" [" + i + "] key=" + e.key + " icon=" + e.icon);
- StatusBarNotification n = e.notification;
- pw.print(indent);
- pw.println(" pkg=" + n.getPackageName() + " id=" + n.getId() + " importance=" +
- mTmpRanking.getImportance());
- pw.print(indent);
- pw.println(" notification=" + n.getNotification());
- }
-
- private static boolean isSystemNotification(StatusBarNotification sbn) {
- String sbnPackage = sbn.getPackageName();
- return "android".equals(sbnPackage) || "com.android.systemui".equals(sbnPackage);
- }
-
- /**
- * Provides access to keyguard state and user settings dependent data.
- */
- public interface KeyguardEnvironment {
- boolean isDeviceProvisioned();
- boolean isNotificationForCurrentProfiles(StatusBarNotification sbn);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
index 1d06ce031f2b..839b06cec496 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
@@ -19,6 +19,7 @@ import android.annotation.Nullable;
import android.service.notification.StatusBarNotification;
import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
/**
@@ -29,25 +30,38 @@ public interface NotificationEntryListener {
* Called when a new notification is posted. At this point, the notification is "pending": its
* views haven't been inflated yet and most of the system pretends like it doesn't exist yet.
*/
- default void onPendingEntryAdded(NotificationData.Entry entry) {
+ default void onPendingEntryAdded(NotificationEntry entry) {
+ }
+
+ // TODO: Combine this with onPreEntryUpdated into "onBeforeEntryFiltered" or similar
+ /**
+ * Called when a new entry is created but before it has been filtered or displayed to the user.
+ */
+ default void onBeforeNotificationAdded(NotificationEntry entry) {
}
/**
* Called when a new entry is created.
*/
- default void onNotificationAdded(NotificationData.Entry entry) {
+ default void onNotificationAdded(NotificationEntry entry) {
+ }
+
+ /**
+ * Called when a notification is updated, before any filtering of notifications have occurred.
+ */
+ default void onPreEntryUpdated(NotificationEntry entry) {
}
/**
- * Called when a notification was updated.
+ * Called when a notification was updated, after any filtering of notifications have occurred.
*/
- default void onEntryUpdated(NotificationData.Entry entry) {
+ default void onPostEntryUpdated(NotificationEntry entry) {
}
/**
* Called when a notification's views are inflated for the first time.
*/
- default void onEntryInflated(NotificationData.Entry entry,
+ default void onEntryInflated(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
}
@@ -57,7 +71,7 @@ public interface NotificationEntryListener {
*
* @param entry notification data entry that was reinflated.
*/
- default void onEntryReinflated(NotificationData.Entry entry) {
+ default void onEntryReinflated(NotificationEntry entry) {
}
/**
@@ -71,20 +85,14 @@ public interface NotificationEntryListener {
* because the developer retracted it).
* @param entry notification data entry that was removed. Null if no entry existed for the
* removed key at the time of removal.
- * @param key key of notification that was removed
- * @param old StatusBarNotification of the notification before it was removed
* @param visibility logging data related to the visibility of the notification at the time of
* removal, if it was removed by a user action. Null if it was not removed by
* a user action.
- * @param lifetimeExtended true if something is artificially extending how long the notification
* @param removedByUser true if the notification was removed by a user action
*/
default void onEntryRemoved(
- @Nullable NotificationData.Entry entry,
- String key,
- StatusBarNotification old,
+ NotificationEntry entry,
@Nullable NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index 2d316508c8cf..989e781ab5ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -15,17 +15,12 @@
*/
package com.android.systemui.statusbar.notification;
-import static com.android.systemui.bubbles.BubbleController.DEBUG_DEMOTE_TO_NOTIF;
-
import android.annotation.Nullable;
import android.app.Notification;
import android.content.Context;
-import android.os.Handler;
-import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -33,18 +28,17 @@ import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.ForegroundServiceController;
-import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.statusbar.NotificationLifetimeExtender;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationUiAdjustment;
import com.android.systemui.statusbar.NotificationUpdateHandler;
-import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment;
-import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.leak.LeakDetector;
@@ -53,7 +47,6 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import java.util.concurrent.TimeUnit;
/**
* NotificationEntryManager is responsible for the adding, removing, and updating of notifications.
@@ -64,53 +57,31 @@ public class NotificationEntryManager implements
Dumpable,
NotificationInflater.InflationCallback,
NotificationUpdateHandler,
- VisualStabilityManager.Callback,
- BubbleController.BubbleDismissListener {
+ VisualStabilityManager.Callback {
private static final String TAG = "NotificationEntryMgr";
- protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- public static final long RECENTLY_ALERTED_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30);
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- protected final Context mContext;
- protected final HashMap<String, NotificationData.Entry> mPendingNotifications = new HashMap<>();
+ private final Context mContext;
+ @VisibleForTesting
+ protected final HashMap<String, NotificationEntry> mPendingNotifications = new HashMap<>();
- private final NotificationGutsManager mGutsManager =
- Dependency.get(NotificationGutsManager.class);
- private final DeviceProvisionedController mDeviceProvisionedController =
- Dependency.get(DeviceProvisionedController.class);
private final ForegroundServiceController mForegroundServiceController =
Dependency.get(ForegroundServiceController.class);
- private final BubbleController mBubbleController = Dependency.get(BubbleController.class);
// Lazily retrieved dependencies
private NotificationRemoteInputManager mRemoteInputManager;
private NotificationRowBinder mNotificationRowBinder;
- private final Handler mDeferredNotificationViewUpdateHandler;
- private Runnable mUpdateNotificationViewsCallback;
-
private NotificationPresenter mPresenter;
private NotificationListenerService.RankingMap mLatestRankingMap;
+ @VisibleForTesting
protected NotificationData mNotificationData;
- protected NotificationListContainer mListContainer;
+
@VisibleForTesting
final ArrayList<NotificationLifetimeExtender> mNotificationLifetimeExtenders
= new ArrayList<>();
private final List<NotificationEntryListener> mNotificationEntryListeners = new ArrayList<>();
- private final DeviceProvisionedController.DeviceProvisionedListener
- mDeviceProvisionedListener =
- new DeviceProvisionedController.DeviceProvisionedListener() {
- @Override
- public void onDeviceProvisionedChanged() {
- updateNotifications();
- }
- };
-
- public void destroy() {
- mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener);
- }
-
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("NotificationEntryManager state:");
@@ -118,7 +89,7 @@ public class NotificationEntryManager implements
if (mPendingNotifications.size() == 0) {
pw.println("null");
} else {
- for (NotificationData.Entry entry : mPendingNotifications.values()) {
+ for (NotificationEntry entry : mPendingNotifications.values()) {
pw.println(entry.notification);
}
}
@@ -126,9 +97,7 @@ public class NotificationEntryManager implements
public NotificationEntryManager(Context context) {
mContext = context;
- mBubbleController.setDismissListener(this /* bubbleEventListener */);
mNotificationData = new NotificationData();
- mDeferredNotificationViewUpdateHandler = new Handler();
}
/** Adds a {@link NotificationEntryListener}. */
@@ -153,15 +122,17 @@ public class NotificationEntryManager implements
return mNotificationRowBinder;
}
+ // TODO: Remove this once we can always use a mocked row binder in our tests
+ @VisibleForTesting
+ void setRowBinder(NotificationRowBinder notificationRowBinder) {
+ mNotificationRowBinder = notificationRowBinder;
+ }
+
public void setUpWithPresenter(NotificationPresenter presenter,
NotificationListContainer listContainer,
HeadsUpManager headsUpManager) {
mPresenter = presenter;
- mUpdateNotificationViewsCallback = mPresenter::updateNotificationViews;
mNotificationData.setHeadsUpManager(headsUpManager);
- mListContainer = listContainer;
-
- mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
}
/** Adds multiple {@link NotificationLifetimeExtender}s. */
@@ -181,14 +152,6 @@ public class NotificationEntryManager implements
return mNotificationData;
}
- protected Context getContext() {
- return mContext;
- }
-
- protected NotificationPresenter getPresenter() {
- return mPresenter;
- }
-
@Override
public void onReorderingAllowed() {
updateNotifications();
@@ -203,30 +166,13 @@ public class NotificationEntryManager implements
n.getKey(), null, nv, false /* forceRemove */, true /* removedByUser */);
}
- @Override
- public void onStackDismissed() {
- updateNotifications();
- }
-
- @Override
- public void onBubbleDismissed(String key) {
- NotificationData.Entry entry = mNotificationData.get(key);
- if (entry != null) {
- entry.setBubbleDismissed(true);
- if (!DEBUG_DEMOTE_TO_NOTIF) {
- performRemoveNotification(entry.notification);
- }
- }
- updateNotifications();
- }
-
private void abortExistingInflation(String key) {
if (mPendingNotifications.containsKey(key)) {
- NotificationData.Entry entry = mPendingNotifications.get(key);
+ NotificationEntry entry = mPendingNotifications.get(key);
entry.abortTask();
mPendingNotifications.remove(key);
}
- NotificationData.Entry addedEntry = mNotificationData.get(key);
+ NotificationEntry addedEntry = mNotificationData.get(key);
if (addedEntry != null) {
addedEntry.abortTask();
}
@@ -247,32 +193,8 @@ public class NotificationEntryManager implements
}
}
- private void addEntry(NotificationData.Entry shadeEntry) {
- if (shadeEntry == null) {
- return;
- }
- // Add the expanded view and icon.
- mNotificationData.add(shadeEntry);
- tagForeground(shadeEntry.notification);
- updateNotifications();
- for (NotificationEntryListener listener : mNotificationEntryListeners) {
- listener.onNotificationAdded(shadeEntry);
- }
-
- maybeScheduleUpdateNotificationViews(shadeEntry);
- }
-
- private void maybeScheduleUpdateNotificationViews(NotificationData.Entry entry) {
- long audibleAlertTimeout = RECENTLY_ALERTED_THRESHOLD_MS
- - (System.currentTimeMillis() - entry.lastAudiblyAlertedMs);
- if (audibleAlertTimeout > 0) {
- mDeferredNotificationViewUpdateHandler.postDelayed(
- mUpdateNotificationViewsCallback, audibleAlertTimeout);
- }
- }
-
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@InflationFlag int inflatedFlags) {
mPendingNotifications.remove(entry.key);
// If there was an async task started after the removal, we don't want to add it back to
@@ -283,7 +205,14 @@ public class NotificationEntryManager implements
for (NotificationEntryListener listener : mNotificationEntryListeners) {
listener.onEntryInflated(entry, inflatedFlags);
}
- addEntry(entry);
+ mNotificationData.add(entry);
+ for (NotificationEntryListener listener : mNotificationEntryListeners) {
+ listener.onBeforeNotificationAdded(entry);
+ }
+ updateNotifications();
+ for (NotificationEntryListener listener : mNotificationEntryListeners) {
+ listener.onNotificationAdded(entry);
+ }
} else {
for (NotificationEntryListener listener : mNotificationEntryListeners) {
listener.onEntryReinflated(entry);
@@ -305,11 +234,10 @@ public class NotificationEntryManager implements
@Nullable NotificationVisibility visibility,
boolean forceRemove,
boolean removedByUser) {
- final NotificationData.Entry entry = mNotificationData.get(key);
+ final NotificationEntry entry = mNotificationData.get(key);
abortExistingInflation(key);
- StatusBarNotification old = null;
boolean lifetimeExtended = false;
if (entry != null) {
@@ -336,31 +264,20 @@ public class NotificationEntryManager implements
if (entry.rowExists()) {
entry.removeRow();
- mListContainer.cleanUpViewStateForEntry(entry);
}
// Let's remove the children if this was a summary
handleGroupSummaryRemoved(key);
- old = removeNotificationViews(key, ranking);
- }
- }
+ mNotificationData.remove(key, ranking);
+ updateNotifications();
+ Dependency.get(LeakDetector.class).trackGarbage(entry);
- for (NotificationEntryListener listener : mNotificationEntryListeners) {
- listener.onEntryRemoved(entry, key, old, visibility, lifetimeExtended, removedByUser);
- }
- }
-
- private StatusBarNotification removeNotificationViews(String key,
- NotificationListenerService.RankingMap ranking) {
- NotificationData.Entry entry = mNotificationData.remove(key, ranking);
- if (entry == null) {
- Log.w(TAG, "removeNotification for unknown key: " + key);
- return null;
+ for (NotificationEntryListener listener : mNotificationEntryListeners) {
+ listener.onEntryRemoved(entry, visibility, removedByUser);
+ }
+ }
}
- updateNotifications();
- Dependency.get(LeakDetector.class).trackGarbage(entry);
- return entry.notification;
}
/**
@@ -374,19 +291,19 @@ public class NotificationEntryManager implements
*
*/
private void handleGroupSummaryRemoved(String key) {
- NotificationData.Entry entry = mNotificationData.get(key);
+ NotificationEntry entry = mNotificationData.get(key);
if (entry != null && entry.rowExists() && entry.isSummaryWithChildren()) {
if (entry.notification.getOverrideGroupKey() != null && !entry.isRowDismissed()) {
// We don't want to remove children for autobundled notifications as they are not
// always cancelled. We only remove them if they were dismissed by the user.
return;
}
- List<NotificationData.Entry> childEntries = entry.getChildren();
+ List<NotificationEntry> childEntries = entry.getChildren();
if (childEntries == null) {
return;
}
for (int i = 0; i < childEntries.size(); i++) {
- NotificationData.Entry childEntry = childEntries.get(i);
+ NotificationEntry childEntry = childEntries.get(i);
boolean isForeground = (entry.notification.getNotification().flags
& Notification.FLAG_FOREGROUND_SERVICE) != 0;
boolean keepForReply =
@@ -405,38 +322,6 @@ public class NotificationEntryManager implements
}
}
- public void updateNotificationsOnDensityOrFontScaleChanged() {
- ArrayList<NotificationData.Entry> userNotifications =
- mNotificationData.getNotificationsForCurrentUser();
- for (int i = 0; i < userNotifications.size(); i++) {
- NotificationData.Entry entry = userNotifications.get(i);
- entry.onDensityOrFontScaleChanged();
- boolean exposedGuts = entry.areGutsExposed();
- if (exposedGuts) {
- mGutsManager.onDensityOrFontScaleChanged(entry);
- }
- }
- }
-
- private NotificationData.Entry createNotificationEntry(
- StatusBarNotification sbn, NotificationListenerService.Ranking ranking)
- throws InflationException {
- if (DEBUG) {
- Log.d(TAG, "createNotificationEntry(notification=" + sbn + " " + ranking);
- }
-
- NotificationData.Entry entry = new NotificationData.Entry(sbn, ranking);
- if (BubbleController.shouldAutoBubble(getContext(), entry)) {
- entry.setIsBubble(true);
- }
-
- Dependency.get(LeakDetector.class).trackInstance(entry);
- // Construct the expanded view.
- getRowBinder().inflateViews(entry, () -> performRemoveNotification(sbn),
- mNotificationData.get(entry.key) != null);
- return entry;
- }
-
private void addNotificationInternal(StatusBarNotification notification,
NotificationListenerService.RankingMap rankingMap) throws InflationException {
String key = notification.getKey();
@@ -447,7 +332,14 @@ public class NotificationEntryManager implements
mNotificationData.updateRanking(rankingMap);
NotificationListenerService.Ranking ranking = new NotificationListenerService.Ranking();
rankingMap.getRanking(key, ranking);
- NotificationData.Entry entry = createNotificationEntry(notification, ranking);
+
+ NotificationEntry entry = new NotificationEntry(notification, ranking);
+
+ Dependency.get(LeakDetector.class).trackInstance(entry);
+ // Construct the expanded view.
+ getRowBinder().inflateViews(entry, () -> performRemoveNotification(notification),
+ mNotificationData.get(entry.key) != null);
+
abortExistingInflation(key);
mPendingNotifications.put(key, entry);
@@ -456,19 +348,6 @@ public class NotificationEntryManager implements
}
}
- @VisibleForTesting
- void tagForeground(StatusBarNotification notification) {
- ArraySet<Integer> activeOps = mForegroundServiceController.getAppOps(
- notification.getUserId(), notification.getPackageName());
- if (activeOps != null) {
- int N = activeOps.size();
- for (int i = 0; i < N; i++) {
- updateNotificationsForAppOp(activeOps.valueAt(i), notification.getUid(),
- notification.getPackageName(), true);
- }
- }
- }
-
@Override
public void addNotification(StatusBarNotification notification,
NotificationListenerService.RankingMap ranking) {
@@ -479,22 +358,13 @@ public class NotificationEntryManager implements
}
}
- public void updateNotificationsForAppOp(int appOp, int uid, String pkg, boolean showIcon) {
- String foregroundKey = mForegroundServiceController.getStandardLayoutKey(
- UserHandle.getUserId(uid), pkg);
- if (foregroundKey != null) {
- mNotificationData.updateAppOp(appOp, uid, pkg, foregroundKey, showIcon);
- updateNotifications();
- }
- }
-
private void updateNotificationInternal(StatusBarNotification notification,
NotificationListenerService.RankingMap ranking) throws InflationException {
if (DEBUG) Log.d(TAG, "updateNotification(" + notification + ")");
final String key = notification.getKey();
abortExistingInflation(key);
- NotificationData.Entry entry = mNotificationData.get(key);
+ NotificationEntry entry = mNotificationData.get(key);
if (entry == null) {
return;
}
@@ -510,14 +380,12 @@ public class NotificationEntryManager implements
getRowBinder().inflateViews(entry, () -> performRemoveNotification(notification),
mNotificationData.get(entry.key) != null);
- updateNotifications();
-
- if (!notification.isClearable()) {
- // The user may have performed a dismiss action on the notification, since it's
- // not clearable we should snap it back.
- mListContainer.snapViewIfNeeded(entry);
+ for (NotificationEntryListener listener : mNotificationEntryListeners) {
+ listener.onPreEntryUpdated(entry);
}
+ updateNotifications();
+
if (DEBUG) {
// Is this for you?
boolean isForCurrentUser = Dependency.get(KeyguardEnvironment.class)
@@ -526,10 +394,8 @@ public class NotificationEntryManager implements
}
for (NotificationEntryListener listener : mNotificationEntryListeners) {
- listener.onEntryUpdated(entry);
+ listener.onPostEntryUpdated(entry);
}
-
- maybeScheduleUpdateNotificationViews(entry);
}
@Override
@@ -544,19 +410,20 @@ public class NotificationEntryManager implements
public void updateNotifications() {
mNotificationData.filterAndSort();
-
- mPresenter.updateNotificationViews();
+ if (mPresenter != null) {
+ mPresenter.updateNotificationViews();
+ }
}
public void updateNotificationRanking(NotificationListenerService.RankingMap rankingMap) {
- List<NotificationData.Entry> entries = new ArrayList<>();
+ List<NotificationEntry> entries = new ArrayList<>();
entries.addAll(mNotificationData.getActiveNotifications());
entries.addAll(mPendingNotifications.values());
// Has a copy of the current UI adjustments.
ArrayMap<String, NotificationUiAdjustment> oldAdjustments = new ArrayMap<>();
ArrayMap<String, Integer> oldImportances = new ArrayMap<>();
- for (NotificationData.Entry entry : entries) {
+ for (NotificationEntry entry : entries) {
NotificationUiAdjustment adjustment =
NotificationUiAdjustment.extractFromNotificationEntry(entry);
oldAdjustments.put(entry.key, adjustment);
@@ -568,7 +435,7 @@ public class NotificationEntryManager implements
updateRankingOfPendingNotifications(rankingMap);
// By comparing the old and new UI adjustments, reinflate the view accordingly.
- for (NotificationData.Entry entry : entries) {
+ for (NotificationEntry entry : entries) {
getRowBinder().onNotificationRankingUpdated(
entry,
oldImportances.get(entry.key),
@@ -586,7 +453,7 @@ public class NotificationEntryManager implements
return;
}
NotificationListenerService.Ranking tmpRanking = new NotificationListenerService.Ranking();
- for (NotificationData.Entry pendingNotification : mPendingNotifications.values()) {
+ for (NotificationEntry pendingNotification : mPendingNotifications.values()) {
rankingMap.getRanking(pendingNotification.key, tmpRanking);
pendingNotification.populateFromRanking(tmpRanking);
}
@@ -597,7 +464,7 @@ public class NotificationEntryManager implements
* notifications whose views have not yet been inflated. In general, the system pretends like
* these don't exist, although there are a couple exceptions.
*/
- public Iterable<NotificationData.Entry> getPendingNotificationsIterator() {
+ public Iterable<NotificationEntry> getPendingNotificationsIterator() {
return mPendingNotifications.values();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java
index 700382a103b2..154d7b356cd1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java
@@ -28,6 +28,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -82,7 +84,7 @@ public class NotificationFilter {
/**
* @return true if the provided notification should NOT be shown right now.
*/
- public boolean shouldFilterOut(NotificationData.Entry entry) {
+ public boolean shouldFilterOut(NotificationEntry entry) {
final StatusBarNotification sbn = entry.notification;
if (!(getEnvironment().isDeviceProvisioned()
|| showNotificationEvenIfUnprovisioned(sbn))) {
@@ -132,6 +134,10 @@ public class NotificationFilter {
}
}
+ if (entry.isBubble() && !entry.showInShadeWhenBubble()) {
+ return true;
+ }
+
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
index 8bd0e9ad3c8b..c50f10b55a71 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
@@ -37,6 +37,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -134,12 +135,35 @@ public class NotificationInterruptionStateProvider {
}
/**
+ * Whether the notification should appear as a bubble with a fly-out on top of the screen.
+ *
+ * @param entry the entry to check
+ * @return true if the entry should bubble up, false otherwise
+ */
+ public boolean shouldBubbleUp(NotificationEntry entry) {
+ StatusBarNotification sbn = entry.notification;
+ if (!entry.isBubble()) {
+ if (DEBUG) {
+ Log.d(TAG, "No bubble up: notification " + sbn.getKey()
+ + " is bubble? " + entry.isBubble());
+ }
+ return false;
+ }
+
+ if (!canHeadsUpCommon(entry)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Whether the notification should peek in from the top and alert the user.
*
* @param entry the entry to check
* @return true if the entry should heads up, false otherwise
*/
- public boolean shouldHeadsUp(NotificationData.Entry entry) {
+ public boolean shouldHeadsUp(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
if (getShadeController().isDozing()) {
@@ -149,10 +173,12 @@ public class NotificationInterruptionStateProvider {
return false;
}
- // TODO: need to changes this, e.g. should still heads up in expanded shade, might want
- // message bubble from the bubble to go through heads up path
boolean inShade = mStatusBarStateController.getState() == SHADE;
- if (entry.isBubble() && !entry.isBubbleDismissed() && inShade) {
+ if (entry.isBubble() && inShade) {
+ if (DEBUG) {
+ Log.d(TAG, "No heads up: in unlocked shade where notification is shown as a "
+ + "bubble: " + sbn.getKey());
+ }
return false;
}
@@ -163,9 +189,13 @@ public class NotificationInterruptionStateProvider {
return false;
}
- if (!mUseHeadsUp || mPresenter.isDeviceInVrMode()) {
+ if (!canHeadsUpCommon(entry)) {
+ return false;
+ }
+
+ if (entry.importance < NotificationManager.IMPORTANCE_HIGH) {
if (DEBUG) {
- Log.d(TAG, "No heads up: no huns or vr mode");
+ Log.d(TAG, "No heads up: unimportant notification: " + sbn.getKey());
}
return false;
}
@@ -185,34 +215,6 @@ public class NotificationInterruptionStateProvider {
return false;
}
- if (entry.shouldSuppressPeek()) {
- if (DEBUG) {
- Log.d(TAG, "No heads up: suppressed by DND: " + sbn.getKey());
- }
- return false;
- }
-
- if (isSnoozedPackage(sbn)) {
- if (DEBUG) {
- Log.d(TAG, "No heads up: snoozed package: " + sbn.getKey());
- }
- return false;
- }
-
- if (entry.hasJustLaunchedFullScreenIntent()) {
- if (DEBUG) {
- Log.d(TAG, "No heads up: recent fullscreen: " + sbn.getKey());
- }
- return false;
- }
-
- if (entry.importance < NotificationManager.IMPORTANCE_HIGH) {
- if (DEBUG) {
- Log.d(TAG, "No heads up: unimportant notification: " + sbn.getKey());
- }
- return false;
- }
-
if (!mHeadsUpSuppressor.canHeadsUp(entry, sbn)) {
return false;
}
@@ -227,7 +229,7 @@ public class NotificationInterruptionStateProvider {
* @param entry the entry to check
* @return true if the entry should ambient pulse, false otherwise
*/
- public boolean shouldPulse(NotificationData.Entry entry) {
+ public boolean shouldPulse(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
if (!getShadeController().isDozing()) {
@@ -273,14 +275,14 @@ public class NotificationInterruptionStateProvider {
/**
* Common checks between heads up alerting and ambient pulse alerting. See
- * {@link #shouldHeadsUp(NotificationData.Entry)} and
- * {@link #shouldPulse(NotificationData.Entry)}. Notifications that fail any of these checks
+ * {@link #shouldHeadsUp(NotificationEntry)} and
+ * {@link #shouldPulse(NotificationEntry)}. Notifications that fail any of these checks
* should not alert at all.
*
* @param entry the entry to check
* @return true if these checks pass, false if the notification should not alert
*/
- protected boolean canAlertCommon(NotificationData.Entry entry) {
+ protected boolean canAlertCommon(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
if (mNotificationFilter.shouldFilterOut(entry)) {
@@ -301,6 +303,49 @@ public class NotificationInterruptionStateProvider {
return true;
}
+ /**
+ * Common checks between heads up alerting and bubble fly out alerting. See
+ * {@link #shouldHeadsUp(NotificationEntry)} and
+ * {@link #shouldBubbleUp(NotificationEntry)}. Notifications that fail any of these
+ * checks should not interrupt the user on screen.
+ *
+ * @param entry the entry to check
+ * @return true if these checks pass, false if the notification should not interrupt on screen
+ */
+ public boolean canHeadsUpCommon(NotificationEntry entry) {
+ StatusBarNotification sbn = entry.notification;
+
+ if (!mUseHeadsUp || mPresenter.isDeviceInVrMode()) {
+ if (DEBUG) {
+ Log.d(TAG, "No heads up: no huns or vr mode");
+ }
+ return false;
+ }
+
+ if (entry.shouldSuppressPeek()) {
+ if (DEBUG) {
+ Log.d(TAG, "No heads up: suppressed by DND: " + sbn.getKey());
+ }
+ return false;
+ }
+
+ if (isSnoozedPackage(sbn)) {
+ if (DEBUG) {
+ Log.d(TAG, "No heads up: snoozed package: " + sbn.getKey());
+ }
+ return false;
+ }
+
+ if (entry.hasJustLaunchedFullScreenIntent()) {
+ if (DEBUG) {
+ Log.d(TAG, "No heads up: recent fullscreen: " + sbn.getKey());
+ }
+ return false;
+ }
+
+ return true;
+ }
+
private boolean isSnoozedPackage(StatusBarNotification sbn) {
return mHeadsUpManager.isSnoozed(sbn.getPackageName());
}
@@ -325,7 +370,7 @@ public class NotificationInterruptionStateProvider {
* @param sbn notification that might be heads upped
* @return false if the notification can not be heads upped
*/
- boolean canHeadsUp(NotificationData.Entry entry, StatusBarNotification sbn);
+ boolean canHeadsUp(NotificationEntry entry, StatusBarNotification sbn);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java
new file mode 100644
index 000000000000..88f4ca239af4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2019 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.notification;
+
+import static com.android.internal.util.Preconditions.checkNotNull;
+
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.util.ArraySet;
+
+import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.ForegroundServiceController;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
+
+/**
+ * Root controller for the list of notifications in the shade.
+ *
+ * TODO: Much of the code in NotificationPresenter should eventually move in here. It will proxy
+ * domain-specific behavior (ARC, etc) to subcontrollers.
+ */
+public class NotificationListController {
+ private final NotificationEntryManager mEntryManager;
+ private final NotificationListContainer mListContainer;
+ private final ForegroundServiceController mForegroundServiceController;
+ private final DeviceProvisionedController mDeviceProvisionedController;
+
+ public NotificationListController(
+ NotificationEntryManager entryManager,
+ NotificationListContainer listContainer,
+ ForegroundServiceController foregroundServiceController,
+ DeviceProvisionedController deviceProvisionedController) {
+ mEntryManager = checkNotNull(entryManager);
+ mListContainer = checkNotNull(listContainer);
+ mForegroundServiceController = checkNotNull(foregroundServiceController);
+ mDeviceProvisionedController = checkNotNull(deviceProvisionedController);
+ }
+
+ /**
+ * Causes the controller to register listeners on its dependencies. This method must be called
+ * before the controller is ready to perform its duties.
+ */
+ public void bind() {
+ mEntryManager.addNotificationEntryListener(mEntryListener);
+ mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
+ }
+
+ /** Should be called when the list controller is being destroyed. */
+ public void destroy() {
+ mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener);
+ }
+
+ @SuppressWarnings("FieldCanBeLocal")
+ private final NotificationEntryListener mEntryListener = new NotificationEntryListener() {
+ @Override
+ public void onEntryRemoved(
+ NotificationEntry entry,
+ NotificationVisibility visibility,
+ boolean removedByUser) {
+ mListContainer.cleanUpViewStateForEntry(entry);
+ }
+
+ @Override
+ public void onBeforeNotificationAdded(NotificationEntry entry) {
+ tagForeground(entry.notification);
+ }
+ };
+
+ private final DeviceProvisionedListener mDeviceProvisionedListener =
+ new DeviceProvisionedListener() {
+ @Override
+ public void onDeviceProvisionedChanged() {
+ mEntryManager.updateNotifications();
+ }
+ };
+
+ // TODO: This method is horrifically inefficient
+ private void tagForeground(StatusBarNotification notification) {
+ ArraySet<Integer> activeOps =
+ mForegroundServiceController.getAppOps(
+ notification.getUserId(), notification.getPackageName());
+ if (activeOps != null) {
+ int len = activeOps.size();
+ for (int i = 0; i < len; i++) {
+ updateNotificationsForAppOp(activeOps.valueAt(i), notification.getUid(),
+ notification.getPackageName(), true);
+ }
+ }
+ }
+
+ /** When an app op changes, propagate that change to notifications. */
+ public void updateNotificationsForAppOp(int appOp, int uid, String pkg, boolean showIcon) {
+ String foregroundKey =
+ mForegroundServiceController.getStandardLayoutKey(UserHandle.getUserId(uid), pkg);
+ if (foregroundKey != null) {
+ mEntryManager
+ .getNotificationData().updateAppOp(appOp, uid, pkg, foregroundKey, showIcon);
+ mEntryManager.updateNotifications();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java
index 058efca51b21..0b8596f9cba7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java
@@ -27,13 +27,10 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.view.ViewGroup;
-import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.NotificationMessagingUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -42,6 +39,8 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationUiAdjustment;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
@@ -70,7 +69,6 @@ public class NotificationRowBinder {
Dependency.get(NotificationInterruptionStateProvider.class);
private final Context mContext;
- private final IStatusBarService mBarService;
private final NotificationMessagingUtil mMessagingUtil;
private final ExpandableNotificationRow.ExpansionLogger mExpansionLogger =
this::logNotificationExpansion;
@@ -84,6 +82,7 @@ public class NotificationRowBinder {
private ExpandableNotificationRow.OnAppOpsClickListener mOnAppOpsClickListener;
private BindRowCallback mBindRowCallback;
private NotificationClicker mNotificationClicker;
+ private final NotificationLogger mNotificationLogger = Dependency.get(NotificationLogger.class);
@Inject
public NotificationRowBinder(Context context,
@@ -91,8 +90,6 @@ public class NotificationRowBinder {
mContext = context;
mMessagingUtil = new NotificationMessagingUtil(context);
mAllowLongPress = allowLongPress;
- mBarService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
}
private NotificationRemoteInputManager getRemoteInputManager() {
@@ -126,7 +123,7 @@ public class NotificationRowBinder {
* Inflates the views for the given entry (possibly asynchronously).
*/
public void inflateViews(
- NotificationData.Entry entry,
+ NotificationEntry entry,
Runnable onDismissRunnable,
boolean isUpdate)
throws InflationException {
@@ -149,7 +146,7 @@ public class NotificationRowBinder {
}
}
- private void bindRow(NotificationData.Entry entry, PackageManager pmUser,
+ private void bindRow(NotificationEntry entry, PackageManager pmUser,
StatusBarNotification sbn, ExpandableNotificationRow row,
Runnable onDismissRunnable) {
row.setExpansionLogger(mExpansionLogger, entry.notification.getKey());
@@ -197,7 +194,7 @@ public class NotificationRowBinder {
* reinflating them.
*/
public void onNotificationRankingUpdated(
- NotificationData.Entry entry,
+ NotificationEntry entry,
@Nullable Integer oldImportance,
NotificationUiAdjustment oldAdjustment,
NotificationUiAdjustment newAdjustment,
@@ -224,7 +221,7 @@ public class NotificationRowBinder {
//TODO: This method associates a row with an entry, but eventually needs to not do that
private void updateNotification(
- NotificationData.Entry entry,
+ NotificationEntry entry,
PackageManager pmUser,
StatusBarNotification sbn,
ExpandableNotificationRow row,
@@ -273,13 +270,7 @@ public class NotificationRowBinder {
}
private void logNotificationExpansion(String key, boolean userAction, boolean expanded) {
- mUiOffloadThread.submit(() -> {
- try {
- mBarService.onNotificationExpansionChanged(key, userAction, expanded);
- } catch (RemoteException e) {
- // Ignore.
- }
- });
+ mNotificationLogger.onExpansionChanged(key, userAction, expanded);
}
/** Callback for when a row is bound to an entry. */
@@ -292,7 +283,7 @@ public class NotificationRowBinder {
* @param sbn notification
* @param row row for the notification
*/
- void onBindRow(NotificationData.Entry entry, PackageManager pmUser,
+ void onBindRow(NotificationEntry entry, PackageManager pmUser,
StatusBarNotification sbn, ExpandableNotificationRow row);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java
index a194eef39b6d..f09c57d786ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+
/**
* An object that can determine the visibility of a Notification.
*/
@@ -27,5 +29,5 @@ public interface VisibilityLocationProvider {
* @param entry
* @return true if row is in a visible location
*/
- boolean isInVisibleLocation(NotificationData.Entry entry);
+ boolean isInVisibleLocation(NotificationEntry entry);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
index 8e6a93deec69..c886685424f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
@@ -21,6 +21,7 @@ import android.view.View;
import androidx.collection.ArraySet;
import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -52,7 +53,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener {
public VisualStabilityManager(NotificationEntryManager notificationEntryManager) {
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
- public void onEntryReinflated(NotificationData.Entry entry) {
+ public void onEntryReinflated(NotificationEntry entry) {
if (entry.hasLowPriorityStateUpdated()) {
onLowPriorityUpdated(entry);
if (mPresenter != null) {
@@ -163,7 +164,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener {
}
@Override
- public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
+ public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
if (isHeadsUp) {
// Heads up notifications should in general be allowed to reorder if they are out of
// view and stay at the current location if they aren't.
@@ -171,7 +172,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener {
}
}
- private void onLowPriorityUpdated(NotificationData.Entry entry) {
+ private void onLowPriorityUpdated(NotificationEntry entry) {
mLowPriorityReorderingViews.add(entry.getRow());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java
new file mode 100644
index 000000000000..8c29fb50f00a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2019 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.notification.collection;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.service.notification.NotificationListenerService.Ranking;
+import android.service.notification.NotificationListenerService.RankingMap;
+import android.service.notification.SnoozeCriterion;
+import android.service.notification.StatusBarNotification;
+import android.util.ArrayMap;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.Dependency;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.notification.NotificationFilter;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The list of currently displaying notifications.
+ */
+public class NotificationData {
+
+ private final NotificationFilter mNotificationFilter = Dependency.get(NotificationFilter.class);
+
+ /**
+ * These dependencies are late init-ed
+ */
+ private KeyguardEnvironment mEnvironment;
+ private NotificationMediaManager mMediaManager;
+
+ private HeadsUpManager mHeadsUpManager;
+
+ private final ArrayMap<String, NotificationEntry> mEntries = new ArrayMap<>();
+ private final ArrayList<NotificationEntry> mSortedAndFiltered = new ArrayList<>();
+ private final ArrayList<NotificationEntry> mFilteredForUser = new ArrayList<>();
+
+ private final NotificationGroupManager mGroupManager =
+ Dependency.get(NotificationGroupManager.class);
+
+ private RankingMap mRankingMap;
+ private final Ranking mTmpRanking = new Ranking();
+
+ public void setHeadsUpManager(HeadsUpManager headsUpManager) {
+ mHeadsUpManager = headsUpManager;
+ }
+
+ private final Comparator<NotificationEntry> mRankingComparator =
+ new Comparator<NotificationEntry>() {
+ private final Ranking mRankingA = new Ranking();
+ private final Ranking mRankingB = new Ranking();
+
+ @Override
+ public int compare(NotificationEntry a, NotificationEntry b) {
+ final StatusBarNotification na = a.notification;
+ final StatusBarNotification nb = b.notification;
+ int aImportance = NotificationManager.IMPORTANCE_DEFAULT;
+ int bImportance = NotificationManager.IMPORTANCE_DEFAULT;
+ int aRank = 0;
+ int bRank = 0;
+
+ if (mRankingMap != null) {
+ // RankingMap as received from NoMan
+ getRanking(a.key, mRankingA);
+ getRanking(b.key, mRankingB);
+ aImportance = mRankingA.getImportance();
+ bImportance = mRankingB.getImportance();
+ aRank = mRankingA.getRank();
+ bRank = mRankingB.getRank();
+ }
+
+ String mediaNotification = getMediaManager().getMediaNotificationKey();
+
+ // IMPORTANCE_MIN media streams are allowed to drift to the bottom
+ final boolean aMedia = a.key.equals(mediaNotification)
+ && aImportance > NotificationManager.IMPORTANCE_MIN;
+ final boolean bMedia = b.key.equals(mediaNotification)
+ && bImportance > NotificationManager.IMPORTANCE_MIN;
+
+ boolean aSystemMax = aImportance >= NotificationManager.IMPORTANCE_HIGH
+ && isSystemNotification(na);
+ boolean bSystemMax = bImportance >= NotificationManager.IMPORTANCE_HIGH
+ && isSystemNotification(nb);
+
+ boolean isHeadsUp = a.getRow().isHeadsUp();
+ if (isHeadsUp != b.getRow().isHeadsUp()) {
+ return isHeadsUp ? -1 : 1;
+ } else if (isHeadsUp) {
+ // Provide consistent ranking with headsUpManager
+ return mHeadsUpManager.compare(a, b);
+ } else if (a.getRow().isAmbientPulsing() != b.getRow().isAmbientPulsing()) {
+ return a.getRow().isAmbientPulsing() ? -1 : 1;
+ } else if (aMedia != bMedia) {
+ // Upsort current media notification.
+ return aMedia ? -1 : 1;
+ } else if (aSystemMax != bSystemMax) {
+ // Upsort PRIORITY_MAX system notifications
+ return aSystemMax ? -1 : 1;
+ } else if (aRank != bRank) {
+ return aRank - bRank;
+ } else {
+ return Long.compare(nb.getNotification().when, na.getNotification().when);
+ }
+ }
+ };
+
+ private KeyguardEnvironment getEnvironment() {
+ if (mEnvironment == null) {
+ mEnvironment = Dependency.get(KeyguardEnvironment.class);
+ }
+ return mEnvironment;
+ }
+
+ private NotificationMediaManager getMediaManager() {
+ if (mMediaManager == null) {
+ mMediaManager = Dependency.get(NotificationMediaManager.class);
+ }
+ return mMediaManager;
+ }
+
+ /**
+ * Returns the sorted list of active notifications (depending on {@link KeyguardEnvironment}
+ *
+ * <p>
+ * This call doesn't update the list of active notifications. Call {@link #filterAndSort()}
+ * when the environment changes.
+ * <p>
+ * Don't hold on to or modify the returned list.
+ */
+ public ArrayList<NotificationEntry> getActiveNotifications() {
+ return mSortedAndFiltered;
+ }
+
+ public ArrayList<NotificationEntry> getNotificationsForCurrentUser() {
+ mFilteredForUser.clear();
+
+ synchronized (mEntries) {
+ final int len = mEntries.size();
+ for (int i = 0; i < len; i++) {
+ NotificationEntry entry = mEntries.valueAt(i);
+ final StatusBarNotification sbn = entry.notification;
+ if (!getEnvironment().isNotificationForCurrentProfiles(sbn)) {
+ continue;
+ }
+ mFilteredForUser.add(entry);
+ }
+ }
+ return mFilteredForUser;
+ }
+
+ public NotificationEntry get(String key) {
+ return mEntries.get(key);
+ }
+
+ public void add(NotificationEntry entry) {
+ synchronized (mEntries) {
+ mEntries.put(entry.notification.getKey(), entry);
+ }
+ mGroupManager.onEntryAdded(entry);
+
+ updateRankingAndSort(mRankingMap);
+ }
+
+ public NotificationEntry remove(String key, RankingMap ranking) {
+ NotificationEntry removed;
+ synchronized (mEntries) {
+ removed = mEntries.remove(key);
+ }
+ if (removed == null) return null;
+ mGroupManager.onEntryRemoved(removed);
+ updateRankingAndSort(ranking);
+ return removed;
+ }
+
+ /** Updates the given notification entry with the provided ranking. */
+ public void update(
+ NotificationEntry entry,
+ RankingMap ranking,
+ StatusBarNotification notification) {
+ updateRanking(ranking);
+ final StatusBarNotification oldNotification = entry.notification;
+ entry.notification = notification;
+ mGroupManager.onEntryUpdated(entry, oldNotification);
+ }
+
+ public void updateRanking(RankingMap ranking) {
+ updateRankingAndSort(ranking);
+ }
+
+ public void updateAppOp(int appOp, int uid, String pkg, String key, boolean showIcon) {
+ synchronized (mEntries) {
+ final int len = mEntries.size();
+ for (int i = 0; i < len; i++) {
+ NotificationEntry entry = mEntries.valueAt(i);
+ if (uid == entry.notification.getUid()
+ && pkg.equals(entry.notification.getPackageName())
+ && key.equals(entry.key)) {
+ if (showIcon) {
+ entry.mActiveAppOps.add(appOp);
+ } else {
+ entry.mActiveAppOps.remove(appOp);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns true if this notification should be displayed in the high-priority notifications
+ * section (and on the lockscreen and status bar).
+ */
+ public boolean isHighPriority(StatusBarNotification statusBarNotification) {
+ if (mRankingMap != null) {
+ getRanking(statusBarNotification.getKey(), mTmpRanking);
+ if (mTmpRanking.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT
+ || statusBarNotification.getNotification().isForegroundService()
+ || statusBarNotification.getNotification().hasMediaSession()) {
+ return true;
+ }
+ if (mGroupManager.isSummaryOfGroup(statusBarNotification)) {
+ final ArrayList<NotificationEntry> logicalChildren =
+ mGroupManager.getLogicalChildren(statusBarNotification);
+ for (NotificationEntry child : logicalChildren) {
+ if (isHighPriority(child.notification)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean isAmbient(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.isAmbient();
+ }
+ return false;
+ }
+
+ public int getVisibilityOverride(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getVisibilityOverride();
+ }
+ return Ranking.VISIBILITY_NO_OVERRIDE;
+ }
+
+ public int getImportance(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getImportance();
+ }
+ return NotificationManager.IMPORTANCE_UNSPECIFIED;
+ }
+
+ public String getOverrideGroupKey(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getOverrideGroupKey();
+ }
+ return null;
+ }
+
+ public List<SnoozeCriterion> getSnoozeCriteria(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getSnoozeCriteria();
+ }
+ return null;
+ }
+
+ public NotificationChannel getChannel(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getChannel();
+ }
+ return null;
+ }
+
+ public int getRank(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.getRank();
+ }
+ return 0;
+ }
+
+ public boolean shouldHide(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.isSuspended();
+ }
+ return false;
+ }
+
+ private void updateRankingAndSort(RankingMap ranking) {
+ if (ranking != null) {
+ mRankingMap = ranking;
+ synchronized (mEntries) {
+ final int len = mEntries.size();
+ for (int i = 0; i < len; i++) {
+ NotificationEntry entry = mEntries.valueAt(i);
+ if (!getRanking(entry.key, mTmpRanking)) {
+ continue;
+ }
+ final StatusBarNotification oldSbn = entry.notification.cloneLight();
+ final String overrideGroupKey = getOverrideGroupKey(entry.key);
+ if (!Objects.equals(oldSbn.getOverrideGroupKey(), overrideGroupKey)) {
+ entry.notification.setOverrideGroupKey(overrideGroupKey);
+ mGroupManager.onEntryUpdated(entry, oldSbn);
+ }
+ entry.populateFromRanking(mTmpRanking);
+ }
+ }
+ }
+ filterAndSort();
+ }
+
+ /**
+ * Get the ranking from the current ranking map.
+ *
+ * @param key the key to look up
+ * @param outRanking the ranking to populate
+ *
+ * @return {@code true} if the ranking was properly obtained.
+ */
+ @VisibleForTesting
+ protected boolean getRanking(String key, Ranking outRanking) {
+ return mRankingMap.getRanking(key, outRanking);
+ }
+
+ // TODO: This should not be public. Instead the Environment should notify this class when
+ // anything changed, and this class should call back the UI so it updates itself.
+ public void filterAndSort() {
+ mSortedAndFiltered.clear();
+
+ synchronized (mEntries) {
+ final int len = mEntries.size();
+ for (int i = 0; i < len; i++) {
+ NotificationEntry entry = mEntries.valueAt(i);
+
+ if (mNotificationFilter.shouldFilterOut(entry)) {
+ continue;
+ }
+
+ mSortedAndFiltered.add(entry);
+ }
+ }
+
+ Collections.sort(mSortedAndFiltered, mRankingComparator);
+ }
+
+ public void dump(PrintWriter pw, String indent) {
+ int filteredLen = mSortedAndFiltered.size();
+ pw.print(indent);
+ pw.println("active notifications: " + filteredLen);
+ int active;
+ for (active = 0; active < filteredLen; active++) {
+ NotificationEntry e = mSortedAndFiltered.get(active);
+ dumpEntry(pw, indent, active, e);
+ }
+ synchronized (mEntries) {
+ int totalLen = mEntries.size();
+ pw.print(indent);
+ pw.println("inactive notifications: " + (totalLen - active));
+ int inactiveCount = 0;
+ for (int i = 0; i < totalLen; i++) {
+ NotificationEntry entry = mEntries.valueAt(i);
+ if (!mSortedAndFiltered.contains(entry)) {
+ dumpEntry(pw, indent, inactiveCount, entry);
+ inactiveCount++;
+ }
+ }
+ }
+ }
+
+ private void dumpEntry(PrintWriter pw, String indent, int i, NotificationEntry e) {
+ getRanking(e.key, mTmpRanking);
+ pw.print(indent);
+ pw.println(" [" + i + "] key=" + e.key + " icon=" + e.icon);
+ StatusBarNotification n = e.notification;
+ pw.print(indent);
+ pw.println(" pkg=" + n.getPackageName() + " id=" + n.getId() + " importance="
+ + mTmpRanking.getImportance());
+ pw.print(indent);
+ pw.println(" notification=" + n.getNotification());
+ }
+
+ private static boolean isSystemNotification(StatusBarNotification sbn) {
+ String sbnPackage = sbn.getPackageName();
+ return "android".equals(sbnPackage) || "com.android.systemui".equals(sbnPackage);
+ }
+
+ /**
+ * Provides access to keyguard state and user settings dependent data.
+ */
+ public interface KeyguardEnvironment {
+ boolean isDeviceProvisioned();
+ boolean isNotificationForCurrentProfiles(StatusBarNotification sbn);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
new file mode 100644
index 000000000000..ee551ee96e7b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -0,0 +1,726 @@
+/*
+ * Copyright (C) 2019 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.notification.collection;
+
+import static android.app.Notification.CATEGORY_ALARM;
+import static android.app.Notification.CATEGORY_CALL;
+import static android.app.Notification.CATEGORY_EVENT;
+import static android.app.Notification.CATEGORY_MESSAGE;
+import static android.app.Notification.CATEGORY_REMINDER;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
+
+import android.annotation.NonNull;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager.Policy;
+import android.app.Person;
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.SnoozeCriterion;
+import android.service.notification.StatusBarNotification;
+import android.util.ArraySet;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.ContrastColorUtil;
+import com.android.systemui.statusbar.InflationTask;
+import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.notification.InflationException;
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+import com.android.systemui.statusbar.notification.row.NotificationGuts;
+import com.android.systemui.statusbar.notification.row.NotificationInflater;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Represents a notification that the system UI knows about
+ *
+ * Whenever the NotificationManager tells us about the existence of a new notification, we wrap it
+ * in a NotificationEntry. Thus, every notification has an associated NotificationEntry, even if
+ * that notification is never displayed to the user (for example, if it's filtered out for some
+ * reason).
+ *
+ * Entries store information about the current state of the notification. Essentially:
+ * anything that needs to persist or be modifiable even when the notification's views don't
+ * exist. Any other state should be stored on the views/view controllers themselves.
+ *
+ * At the moment, there are many things here that shouldn't be and vice-versa. Hopefully we can
+ * clean this up in the future.
+ */
+public final class NotificationEntry {
+ private static final long LAUNCH_COOLDOWN = 2000;
+ private static final long REMOTE_INPUT_COOLDOWN = 500;
+ private static final long INITIALIZATION_DELAY = 400;
+ private static final long NOT_LAUNCHED_YET = -LAUNCH_COOLDOWN;
+ private static final int COLOR_INVALID = 1;
+ public final String key;
+ public StatusBarNotification notification;
+ public NotificationChannel channel;
+ public long lastAudiblyAlertedMs;
+ public boolean noisy;
+ public boolean ambient;
+ public int importance;
+ public StatusBarIconView icon;
+ public StatusBarIconView expandedIcon;
+ private boolean interruption;
+ public boolean autoRedacted; // whether the redacted notification was generated by us
+ public int targetSdk;
+ private long lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
+ public CharSequence remoteInputText;
+ public List<SnoozeCriterion> snoozeCriteria;
+ public int userSentiment = NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
+ /** Smart Actions provided by the NotificationAssistantService. */
+ @NonNull
+ public List<Notification.Action> systemGeneratedSmartActions = Collections.emptyList();
+ public CharSequence[] smartReplies = new CharSequence[0];
+ @VisibleForTesting
+ public int suppressedVisualEffects;
+ public boolean suspended;
+
+ private NotificationEntry parent; // our parent (if we're in a group)
+ private ArrayList<NotificationEntry> children = new ArrayList<NotificationEntry>();
+ private ExpandableNotificationRow row; // the outer expanded view
+
+ private int mCachedContrastColor = COLOR_INVALID;
+ private int mCachedContrastColorIsFor = COLOR_INVALID;
+ private InflationTask mRunningTask = null;
+ private Throwable mDebugThrowable;
+ public CharSequence remoteInputTextWhenReset;
+ public long lastRemoteInputSent = NOT_LAUNCHED_YET;
+ public ArraySet<Integer> mActiveAppOps = new ArraySet<>(3);
+ public CharSequence headsUpStatusBarText;
+ public CharSequence headsUpStatusBarTextPublic;
+
+ private long initializationTime = -1;
+
+ /**
+ * Whether or not this row represents a system notification. Note that if this is
+ * {@code null}, that means we were either unable to retrieve the info or have yet to
+ * retrieve the info.
+ */
+ public Boolean mIsSystemNotification;
+
+ /**
+ * Has the user sent a reply through this Notification.
+ */
+ private boolean hasSentReply;
+
+ /**
+ * Whether this notification should be displayed as a bubble.
+ */
+ private boolean mIsBubble;
+
+ /**
+ * Whether this notification should be shown in the shade when it is also displayed as a bubble.
+ *
+ * <p>When a notification is a bubble we don't show it in the shade once the bubble has been
+ * expanded</p>
+ */
+ private boolean mShowInShadeWhenBubble;
+
+ /**
+ * Whether the user has dismissed this notification when it was in bubble form.
+ */
+ private boolean mUserDismissedBubble;
+
+ public NotificationEntry(StatusBarNotification n) {
+ this(n, null);
+ }
+
+ public NotificationEntry(
+ StatusBarNotification n,
+ @Nullable NotificationListenerService.Ranking ranking) {
+ this.key = n.getKey();
+ this.notification = n;
+ if (ranking != null) {
+ populateFromRanking(ranking);
+ }
+ }
+
+ public void populateFromRanking(@NonNull NotificationListenerService.Ranking ranking) {
+ channel = ranking.getChannel();
+ lastAudiblyAlertedMs = ranking.getLastAudiblyAlertedMillis();
+ importance = ranking.getImportance();
+ ambient = ranking.isAmbient();
+ snoozeCriteria = ranking.getSnoozeCriteria();
+ userSentiment = ranking.getUserSentiment();
+ systemGeneratedSmartActions = ranking.getSmartActions() == null
+ ? Collections.emptyList() : ranking.getSmartActions();
+ smartReplies = ranking.getSmartReplies() == null
+ ? new CharSequence[0]
+ : ranking.getSmartReplies().toArray(new CharSequence[0]);
+ suppressedVisualEffects = ranking.getSuppressedVisualEffects();
+ suspended = ranking.isSuspended();
+ }
+
+ public void setInterruption() {
+ interruption = true;
+ }
+
+ public boolean hasInterrupted() {
+ return interruption;
+ }
+
+ public void setIsBubble(boolean bubbleable) {
+ mIsBubble = bubbleable;
+ }
+
+ public boolean isBubble() {
+ return mIsBubble;
+ }
+
+ public void setBubbleDismissed(boolean userDismissed) {
+ mUserDismissedBubble = userDismissed;
+ }
+
+ public boolean isBubbleDismissed() {
+ return mUserDismissedBubble;
+ }
+
+ /**
+ * Sets whether this notification should be shown in the shade when it is also displayed as a
+ * bubble.
+ */
+ public void setShowInShadeWhenBubble(boolean showInShade) {
+ mShowInShadeWhenBubble = showInShade;
+ }
+
+ /**
+ * Whether this notification should be shown in the shade when it is also displayed as a
+ * bubble.
+ */
+ public boolean showInShadeWhenBubble() {
+ // We always show it in the shade if non-clearable
+ return !isClearable() || mShowInShadeWhenBubble;
+ }
+
+ /**
+ * Resets the notification entry to be re-used.
+ */
+ public void reset() {
+ if (row != null) {
+ row.reset();
+ }
+ }
+
+ public ExpandableNotificationRow getRow() {
+ return row;
+ }
+
+ //TODO: This will go away when we have a way to bind an entry to a row
+ public void setRow(ExpandableNotificationRow row) {
+ this.row = row;
+ }
+
+ @Nullable
+ public List<NotificationEntry> getChildren() {
+ if (children.size() <= 0) {
+ return null;
+ }
+
+ return children;
+ }
+
+ public void notifyFullScreenIntentLaunched() {
+ setInterruption();
+ lastFullScreenIntentLaunchTime = SystemClock.elapsedRealtime();
+ }
+
+ public boolean hasJustLaunchedFullScreenIntent() {
+ return SystemClock.elapsedRealtime() < lastFullScreenIntentLaunchTime + LAUNCH_COOLDOWN;
+ }
+
+ public boolean hasJustSentRemoteInput() {
+ return SystemClock.elapsedRealtime() < lastRemoteInputSent + REMOTE_INPUT_COOLDOWN;
+ }
+
+ public boolean hasFinishedInitialization() {
+ return initializationTime == -1
+ || SystemClock.elapsedRealtime() > initializationTime + INITIALIZATION_DELAY;
+ }
+
+ /**
+ * Create the icons for a notification
+ * @param context the context to create the icons with
+ * @param sbn the notification
+ * @throws InflationException Exception if required icons are not valid or specified
+ */
+ public void createIcons(Context context, StatusBarNotification sbn)
+ throws InflationException {
+ Notification n = sbn.getNotification();
+ final Icon smallIcon = n.getSmallIcon();
+ if (smallIcon == null) {
+ throw new InflationException("No small icon in notification from "
+ + sbn.getPackageName());
+ }
+
+ // Construct the icon.
+ icon = new StatusBarIconView(context,
+ sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn);
+ icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+
+ // Construct the expanded icon.
+ expandedIcon = new StatusBarIconView(context,
+ sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn);
+ expandedIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ final StatusBarIcon ic = new StatusBarIcon(
+ sbn.getUser(),
+ sbn.getPackageName(),
+ smallIcon,
+ n.iconLevel,
+ n.number,
+ StatusBarIconView.contentDescForNotification(context, n));
+ if (!icon.set(ic) || !expandedIcon.set(ic)) {
+ icon = null;
+ expandedIcon = null;
+ throw new InflationException("Couldn't create icon: " + ic);
+ }
+ expandedIcon.setVisibility(View.INVISIBLE);
+ expandedIcon.setOnVisibilityChangedListener(
+ newVisibility -> {
+ if (row != null) {
+ row.setIconsVisible(newVisibility != View.VISIBLE);
+ }
+ });
+ }
+
+ public void setIconTag(int key, Object tag) {
+ if (icon != null) {
+ icon.setTag(key, tag);
+ expandedIcon.setTag(key, tag);
+ }
+ }
+
+ /**
+ * Update the notification icons.
+ *
+ * @param context the context to create the icons with.
+ * @param sbn the notification to read the icon from.
+ * @throws InflationException Exception if required icons are not valid or specified
+ */
+ public void updateIcons(Context context, StatusBarNotification sbn)
+ throws InflationException {
+ if (icon != null) {
+ // Update the icon
+ Notification n = sbn.getNotification();
+ final StatusBarIcon ic = new StatusBarIcon(
+ notification.getUser(),
+ notification.getPackageName(),
+ n.getSmallIcon(),
+ n.iconLevel,
+ n.number,
+ StatusBarIconView.contentDescForNotification(context, n));
+ icon.setNotification(sbn);
+ expandedIcon.setNotification(sbn);
+ if (!icon.set(ic) || !expandedIcon.set(ic)) {
+ throw new InflationException("Couldn't update icon: " + ic);
+ }
+ }
+ }
+
+ public int getContrastedColor(Context context, boolean isLowPriority,
+ int backgroundColor) {
+ int rawColor = isLowPriority ? Notification.COLOR_DEFAULT :
+ notification.getNotification().color;
+ if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) {
+ return mCachedContrastColor;
+ }
+ final int contrasted = ContrastColorUtil.resolveContrastColor(context, rawColor,
+ backgroundColor);
+ mCachedContrastColorIsFor = rawColor;
+ mCachedContrastColor = contrasted;
+ return mCachedContrastColor;
+ }
+
+ /**
+ * Abort all existing inflation tasks
+ */
+ public void abortTask() {
+ if (mRunningTask != null) {
+ mRunningTask.abort();
+ mRunningTask = null;
+ }
+ }
+
+ public void setInflationTask(InflationTask abortableTask) {
+ // abort any existing inflation
+ InflationTask existing = mRunningTask;
+ abortTask();
+ mRunningTask = abortableTask;
+ if (existing != null && mRunningTask != null) {
+ mRunningTask.supersedeTask(existing);
+ }
+ }
+
+ public void onInflationTaskFinished() {
+ mRunningTask = null;
+ }
+
+ @VisibleForTesting
+ public InflationTask getRunningTask() {
+ return mRunningTask;
+ }
+
+ /**
+ * Set a throwable that is used for debugging
+ *
+ * @param debugThrowable the throwable to save
+ */
+ public void setDebugThrowable(Throwable debugThrowable) {
+ mDebugThrowable = debugThrowable;
+ }
+
+ public Throwable getDebugThrowable() {
+ return mDebugThrowable;
+ }
+
+ public void onRemoteInputInserted() {
+ lastRemoteInputSent = NOT_LAUNCHED_YET;
+ remoteInputTextWhenReset = null;
+ }
+
+ public void setHasSentReply() {
+ hasSentReply = true;
+ }
+
+ public boolean isLastMessageFromReply() {
+ if (!hasSentReply) {
+ return false;
+ }
+ Bundle extras = notification.getNotification().extras;
+ CharSequence[] replyTexts = extras.getCharSequenceArray(
+ Notification.EXTRA_REMOTE_INPUT_HISTORY);
+ if (!ArrayUtils.isEmpty(replyTexts)) {
+ return true;
+ }
+ Parcelable[] messages = extras.getParcelableArray(Notification.EXTRA_MESSAGES);
+ if (messages != null && messages.length > 0) {
+ Parcelable message = messages[messages.length - 1];
+ if (message instanceof Bundle) {
+ Notification.MessagingStyle.Message lastMessage =
+ Notification.MessagingStyle.Message.getMessageFromBundle(
+ (Bundle) message);
+ if (lastMessage != null) {
+ Person senderPerson = lastMessage.getSenderPerson();
+ if (senderPerson == null) {
+ return true;
+ }
+ Person user = extras.getParcelable(Notification.EXTRA_MESSAGING_PERSON);
+ return Objects.equals(user, senderPerson);
+ }
+ }
+ }
+ return false;
+ }
+
+ public void setInitializationTime(long time) {
+ if (initializationTime == -1) {
+ initializationTime = time;
+ }
+ }
+
+ public void sendAccessibilityEvent(int eventType) {
+ if (row != null) {
+ row.sendAccessibilityEvent(eventType);
+ }
+ }
+
+ /**
+ * Used by NotificationMediaManager to determine... things
+ * @return {@code true} if we are a media notification
+ */
+ public boolean isMediaNotification() {
+ if (row == null) return false;
+
+ return row.isMediaRow();
+ }
+
+ /**
+ * We are a top level child if our parent is the list of notifications duh
+ * @return {@code true} if we're a top level notification
+ */
+ public boolean isTopLevelChild() {
+ return row != null && row.isTopLevelChild();
+ }
+
+ public void resetUserExpansion() {
+ if (row != null) row.resetUserExpansion();
+ }
+
+ public void freeContentViewWhenSafe(@NotificationInflater.InflationFlag int inflationFlag) {
+ if (row != null) row.freeContentViewWhenSafe(inflationFlag);
+ }
+
+ public void setAmbientPulsing(boolean pulsing) {
+ if (row != null) row.setAmbientPulsing(pulsing);
+ }
+
+ public boolean rowExists() {
+ return row != null;
+ }
+
+ public boolean isRowDismissed() {
+ return row != null && row.isDismissed();
+ }
+
+ public boolean isRowRemoved() {
+ return row != null && row.isRemoved();
+ }
+
+ /**
+ * @return {@code true} if the row is null or removed
+ */
+ public boolean isRemoved() {
+ //TODO: recycling invalidates this
+ return row == null || row.isRemoved();
+ }
+
+ /**
+ * @return {@code true} if the row is null or dismissed
+ */
+ public boolean isDismissed() {
+ //TODO: recycling
+ return row == null || row.isDismissed();
+ }
+
+ public boolean isRowPinned() {
+ return row != null && row.isPinned();
+ }
+
+ public void setRowPinned(boolean pinned) {
+ if (row != null) row.setPinned(pinned);
+ }
+
+ public boolean isRowAnimatingAway() {
+ return row != null && row.isHeadsUpAnimatingAway();
+ }
+
+ public boolean isRowHeadsUp() {
+ return row != null && row.isHeadsUp();
+ }
+
+ public void setHeadsUp(boolean shouldHeadsUp) {
+ if (row != null) row.setHeadsUp(shouldHeadsUp);
+ }
+
+ public boolean mustStayOnScreen() {
+ return row != null && row.mustStayOnScreen();
+ }
+
+ public void setHeadsUpIsVisible() {
+ if (row != null) row.setHeadsUpIsVisible();
+ }
+
+ //TODO: i'm imagining a world where this isn't just the row, but I could be rwong
+ public ExpandableNotificationRow getHeadsUpAnimationView() {
+ return row;
+ }
+
+ public void setUserLocked(boolean userLocked) {
+ if (row != null) row.setUserLocked(userLocked);
+ }
+
+ public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) {
+ if (row != null) row.setUserExpanded(userExpanded, allowChildExpansion);
+ }
+
+ public void setGroupExpansionChanging(boolean changing) {
+ if (row != null) row.setGroupExpansionChanging(changing);
+ }
+
+ public void notifyHeightChanged(boolean needsAnimation) {
+ if (row != null) row.notifyHeightChanged(needsAnimation);
+ }
+
+ public void closeRemoteInput() {
+ if (row != null) row.closeRemoteInput();
+ }
+
+ public boolean areChildrenExpanded() {
+ return row != null && row.areChildrenExpanded();
+ }
+
+ public boolean keepInParent() {
+ return row != null && row.keepInParent();
+ }
+
+ //TODO: probably less confusing to say "is group fully visible"
+ public boolean isGroupNotFullyVisible() {
+ return row == null || row.isGroupNotFullyVisible();
+ }
+
+ public NotificationGuts getGuts() {
+ if (row != null) return row.getGuts();
+ return null;
+ }
+
+ public boolean hasLowPriorityStateUpdated() {
+ return row != null && row.hasLowPriorityStateUpdated();
+ }
+
+ public void removeRow() {
+ if (row != null) row.setRemoved();
+ }
+
+ public boolean isSummaryWithChildren() {
+ return row != null && row.isSummaryWithChildren();
+ }
+
+ public void setKeepInParent(boolean keep) {
+ if (row != null) row.setKeepInParent(keep);
+ }
+
+ public void onDensityOrFontScaleChanged() {
+ if (row != null) row.onDensityOrFontScaleChanged();
+ }
+
+ public boolean areGutsExposed() {
+ return row != null && row.getGuts() != null && row.getGuts().isExposed();
+ }
+
+ public boolean isChildInGroup() {
+ return parent == null;
+ }
+
+ public void setLowPriorityStateUpdated(boolean updated) {
+ if (row != null) row.setLowPriorityStateUpdated(updated);
+ }
+
+ /**
+ * @return Can the underlying notification be cleared? This can be different from whether the
+ * notification can be dismissed in case notifications are sensitive on the lockscreen.
+ * @see #canViewBeDismissed()
+ */
+ public boolean isClearable() {
+ if (notification == null || !notification.isClearable()) {
+ return false;
+ }
+ if (children.size() > 0) {
+ for (int i = 0; i < children.size(); i++) {
+ NotificationEntry child = children.get(i);
+ if (!child.isClearable()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public boolean canViewBeDismissed() {
+ if (row == null) return true;
+ return row.canViewBeDismissed();
+ }
+
+ @VisibleForTesting
+ boolean isExemptFromDndVisualSuppression() {
+ if (isNotificationBlockedByPolicy(notification.getNotification())) {
+ return false;
+ }
+
+ if ((notification.getNotification().flags
+ & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
+ return true;
+ }
+ if (notification.getNotification().isMediaNotification()) {
+ return true;
+ }
+ if (mIsSystemNotification != null && mIsSystemNotification) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean shouldSuppressVisualEffect(int effect) {
+ if (isExemptFromDndVisualSuppression()) {
+ return false;
+ }
+ return (suppressedVisualEffects & effect) != 0;
+ }
+
+ /**
+ * Returns whether {@link Policy#SUPPRESSED_EFFECT_FULL_SCREEN_INTENT}
+ * is set for this entry.
+ */
+ public boolean shouldSuppressFullScreenIntent() {
+ return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_FULL_SCREEN_INTENT);
+ }
+
+ /**
+ * Returns whether {@link Policy#SUPPRESSED_EFFECT_PEEK}
+ * is set for this entry.
+ */
+ public boolean shouldSuppressPeek() {
+ return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_PEEK);
+ }
+
+ /**
+ * Returns whether {@link Policy#SUPPRESSED_EFFECT_STATUS_BAR}
+ * is set for this entry.
+ */
+ public boolean shouldSuppressStatusBar() {
+ return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_STATUS_BAR);
+ }
+
+ /**
+ * Returns whether {@link Policy#SUPPRESSED_EFFECT_AMBIENT}
+ * is set for this entry.
+ */
+ public boolean shouldSuppressAmbient() {
+ return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_AMBIENT);
+ }
+
+ /**
+ * Returns whether {@link Policy#SUPPRESSED_EFFECT_NOTIFICATION_LIST}
+ * is set for this entry.
+ */
+ public boolean shouldSuppressNotificationList() {
+ return shouldSuppressVisualEffect(SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ }
+
+ /**
+ * Categories that are explicitly called out on DND settings screens are always blocked, if
+ * DND has flagged them, even if they are foreground or system notifications that might
+ * otherwise visually bypass DND.
+ */
+ private static boolean isNotificationBlockedByPolicy(Notification n) {
+ return isCategory(CATEGORY_CALL, n)
+ || isCategory(CATEGORY_MESSAGE, n)
+ || isCategory(CATEGORY_ALARM, n)
+ || isCategory(CATEGORY_EVENT, n)
+ || isCategory(CATEGORY_REMINDER, n);
+ }
+
+ private static boolean isCategory(String category, Notification n) {
+ return Objects.equals(n.category, category);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
index 610d3003f0e9..5ba9b4b34042 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
@@ -15,7 +15,6 @@
*/
package com.android.systemui.statusbar.notification.logging;
-import android.annotation.Nullable;
import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
@@ -24,9 +23,12 @@ import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
@@ -34,15 +36,16 @@ import com.android.systemui.UiOffloadThread;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -67,6 +70,7 @@ public class NotificationLogger implements StateListener {
private final UiOffloadThread mUiOffloadThread;
private final NotificationEntryManager mEntryManager;
private HeadsUpManager mHeadsUpManager;
+ private final ExpansionStateLogger mExpansionStateLogger;
protected Handler mHandler = new Handler();
protected IStatusBarService mBarService;
@@ -116,11 +120,11 @@ public class NotificationLogger implements StateListener {
// notifications.
// 3. Report newly visible and no-longer visible notifications.
// 4. Keep currently visible notifications for next report.
- ArrayList<NotificationData.Entry> activeNotifications = mEntryManager
+ ArrayList<NotificationEntry> activeNotifications = mEntryManager
.getNotificationData().getActiveNotifications();
int N = activeNotifications.size();
for (int i = 0; i < N; i++) {
- NotificationData.Entry entry = activeNotifications.get(i);
+ NotificationEntry entry = activeNotifications.get(i);
String key = entry.notification.getKey();
boolean isVisible = mListContainer.isInVisibleLocation(entry);
NotificationVisibility visObj = NotificationVisibility.obtain(key, i, N, isVisible);
@@ -145,6 +149,9 @@ public class NotificationLogger implements StateListener {
recycleAllVisibilityObjects(mCurrentlyVisibleNotifications);
mCurrentlyVisibleNotifications.addAll(mTmpCurrentlyVisibleNotifications);
+ mExpansionStateLogger.onVisibilityChanged(
+ mTmpCurrentlyVisibleNotifications, mTmpCurrentlyVisibleNotifications);
+
recycleAllVisibilityObjects(mTmpNoLongerVisibleNotifications);
mTmpCurrentlyVisibleNotifications.clear();
mTmpNewlyVisibleNotifications.clear();
@@ -156,27 +163,27 @@ public class NotificationLogger implements StateListener {
public NotificationLogger(NotificationListener notificationListener,
UiOffloadThread uiOffloadThread,
NotificationEntryManager entryManager,
- StatusBarStateController statusBarStateController) {
+ StatusBarStateController statusBarStateController,
+ ExpansionStateLogger expansionStateLogger) {
mNotificationListener = notificationListener;
mUiOffloadThread = uiOffloadThread;
mEntryManager = entryManager;
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ mExpansionStateLogger = expansionStateLogger;
// Not expected to be destroyed, don't need to unsubscribe
statusBarStateController.addCallback(this);
entryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
public void onEntryRemoved(
- @Nullable NotificationData.Entry entry,
- String key,
- StatusBarNotification old,
+ NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
- if (removedByUser && visibility != null && entry != null) {
- logNotificationClear(key, entry.notification, visibility);
+ if (removedByUser && visibility != null) {
+ logNotificationClear(entry.key, entry.notification, visibility);
}
+ mExpansionStateLogger.onEntryRemoved(entry.key);
}
@Override
@@ -323,8 +330,8 @@ public class NotificationLogger implements StateListener {
}
}
- private NotificationVisibility[] cloneVisibilitiesAsArr(Collection<NotificationVisibility> c) {
-
+ private static NotificationVisibility[] cloneVisibilitiesAsArr(
+ Collection<NotificationVisibility> c) {
final NotificationVisibility[] array = new NotificationVisibility[c.size()];
int i = 0;
for(NotificationVisibility nv: c) {
@@ -352,9 +359,133 @@ public class NotificationLogger implements StateListener {
}
/**
+ * Called when the notification is expanded / collapsed.
+ */
+ public void onExpansionChanged(String key, boolean isUserAction, boolean isExpanded) {
+ mExpansionStateLogger.onExpansionChanged(key, isUserAction, isExpanded);
+ }
+
+ /**
* A listener that is notified when some child locations might have changed.
*/
public interface OnChildLocationsChangedListener {
void onChildLocationsChanged();
}
+
+ /**
+ * Logs the expansion state change when the notification is visible.
+ */
+ public static class ExpansionStateLogger {
+ /** Notification key -> state, should be accessed in UI offload thread only. */
+ private final Map<String, State> mExpansionStates = new ArrayMap<>();
+
+ /**
+ * Notification key -> last logged expansion state, should be accessed in UI thread only.
+ */
+ private final Map<String, Boolean> mLoggedExpansionState = new ArrayMap<>();
+ private final UiOffloadThread mUiOffloadThread;
+ @VisibleForTesting
+ IStatusBarService mBarService;
+
+ @Inject
+ public ExpansionStateLogger(UiOffloadThread uiOffloadThread) {
+ mUiOffloadThread = uiOffloadThread;
+ mBarService =
+ IStatusBarService.Stub.asInterface(
+ ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ }
+
+ @VisibleForTesting
+ void onExpansionChanged(String key, boolean isUserAction, boolean isExpanded) {
+ State state = getState(key);
+ state.mIsUserAction = isUserAction;
+ state.mIsExpanded = isExpanded;
+ maybeNotifyOnNotificationExpansionChanged(key, state);
+ }
+
+ @VisibleForTesting
+ void onVisibilityChanged(
+ Collection<NotificationVisibility> newlyVisible,
+ Collection<NotificationVisibility> noLongerVisible) {
+ final NotificationVisibility[] newlyVisibleAr =
+ cloneVisibilitiesAsArr(newlyVisible);
+ final NotificationVisibility[] noLongerVisibleAr =
+ cloneVisibilitiesAsArr(noLongerVisible);
+
+ for (NotificationVisibility nv : newlyVisibleAr) {
+ State state = getState(nv.key);
+ state.mIsVisible = true;
+ maybeNotifyOnNotificationExpansionChanged(nv.key, state);
+ }
+ for (NotificationVisibility nv : noLongerVisibleAr) {
+ State state = getState(nv.key);
+ state.mIsVisible = false;
+ }
+ }
+
+ @VisibleForTesting
+ void onEntryRemoved(String key) {
+ mExpansionStates.remove(key);
+ mLoggedExpansionState.remove(key);
+ }
+
+ private State getState(String key) {
+ State state = mExpansionStates.get(key);
+ if (state == null) {
+ state = new State();
+ mExpansionStates.put(key, state);
+ }
+ return state;
+ }
+
+ private void maybeNotifyOnNotificationExpansionChanged(final String key, State state) {
+ if (!state.isFullySet()) {
+ return;
+ }
+ if (!state.mIsVisible) {
+ return;
+ }
+ Boolean loggedExpansionState = mLoggedExpansionState.get(key);
+ // Consider notification is initially collapsed, so only expanded is logged in the
+ // first time.
+ if (loggedExpansionState == null && !state.mIsExpanded) {
+ return;
+ }
+ if (loggedExpansionState != null
+ && state.mIsExpanded == loggedExpansionState) {
+ return;
+ }
+ mLoggedExpansionState.put(key, state.mIsExpanded);
+ final State stateToBeLogged = new State(state);
+ mUiOffloadThread.submit(() -> {
+ try {
+ mBarService.onNotificationExpansionChanged(
+ key, stateToBeLogged.mIsUserAction, stateToBeLogged.mIsExpanded);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to call onNotificationExpansionChanged: ", e);
+ }
+ });
+ }
+
+ private static class State {
+ @Nullable
+ Boolean mIsUserAction;
+ @Nullable
+ Boolean mIsExpanded;
+ @Nullable
+ Boolean mIsVisible;
+
+ private State() {}
+
+ private State(State state) {
+ this.mIsUserAction = state.mIsUserAction;
+ this.mIsExpanded = state.mIsExpanded;
+ this.mIsVisible = state.mIsVisible;
+ }
+
+ private boolean isFullySet() {
+ return mIsUserAction != null && mIsExpanded != null && mIsVisible != null;
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 8b0a6828205d..c34d567da0be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -105,7 +105,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private final DoubleTapHelper mDoubleTapHelper;
private boolean mDimmed;
- private boolean mDark;
+ protected boolean mDark;
protected int mBgTint = NO_COLOR;
private float mBgAlpha = 1f;
@@ -140,7 +140,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private FalsingManager mFalsingManager;
private float mNormalBackgroundVisibilityAmount;
- private ValueAnimator mFadeInFromDarkAnimator;
private float mDimmedBackgroundFadeInAmount = -1;
private ValueAnimator.AnimatorUpdateListener mBackgroundVisibilityUpdater
= new ValueAnimator.AnimatorUpdateListener() {
@@ -150,22 +149,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mDimmedBackgroundFadeInAmount = mBackgroundDimmed.getAlpha();
}
};
- private AnimatorListenerAdapter mFadeInEndListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- mFadeInFromDarkAnimator = null;
- mDimmedBackgroundFadeInAmount = -1;
- updateBackground();
- }
- };
- private ValueAnimator.AnimatorUpdateListener mUpdateOutlineListener
- = new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- updateOutlineAlpha();
- }
- };
private FakeShadowView mFakeShadow;
private int mCurrentBackgroundTint;
private int mTargetTint;
@@ -465,22 +448,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mDark = dark;
updateBackground();
updateBackgroundTint(false);
- if (!dark && fade && !shouldHideBackground()) {
- fadeInFromDark(delay);
- }
- updateOutlineAlpha();
}
private void updateOutlineAlpha() {
- if (mDark) {
- setOutlineAlpha(0f);
- return;
- }
float alpha = NotificationStackScrollLayout.BACKGROUND_ALPHA_DIMMED;
alpha = (alpha + (1.0f - alpha) * mNormalBackgroundVisibilityAmount);
- if (mFadeInFromDarkAnimator != null) {
- alpha *= mFadeInFromDarkAnimator.getAnimatedFraction();
- }
setOutlineAlpha(alpha);
}
@@ -638,36 +610,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
/**
- * Fades in the background when exiting dark mode.
- */
- private void fadeInFromDark(long delay) {
- final View background = mDimmed ? mBackgroundDimmed : mBackgroundNormal;
- background.setAlpha(0f);
- mBackgroundVisibilityUpdater.onAnimationUpdate(null);
- background.animate()
- .alpha(1f)
- .setDuration(DARK_ANIMATION_LENGTH)
- .setStartDelay(delay)
- .setInterpolator(Interpolators.ALPHA_IN)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationCancel(Animator animation) {
- // Jump state if we are cancelled
- background.setAlpha(1f);
- }
- })
- .setUpdateListener(mBackgroundVisibilityUpdater)
- .start();
- mFadeInFromDarkAnimator = TimeAnimator.ofFloat(0.0f, 1.0f);
- mFadeInFromDarkAnimator.setDuration(DARK_ANIMATION_LENGTH);
- mFadeInFromDarkAnimator.setStartDelay(delay);
- mFadeInFromDarkAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
- mFadeInFromDarkAnimator.addListener(mFadeInEndListener);
- mFadeInFromDarkAnimator.addUpdateListener(mUpdateOutlineListener);
- mFadeInFromDarkAnimator.start();
- }
-
- /**
* Fades the background when the dimmed state changes.
*/
private void fadeDimmedBackground() {
@@ -708,9 +650,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
public void onAnimationEnd(Animator animation) {
updateBackground();
mBackgroundAnimator = null;
- if (mFadeInFromDarkAnimator == null) {
- mDimmedBackgroundFadeInAmount = -1;
- }
+ mDimmedBackgroundFadeInAmount = -1;
}
});
mBackgroundAnimator.addUpdateListener(mBackgroundVisibilityUpdater);
@@ -736,7 +676,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mBackgroundNormal.setVisibility(mActivated ? VISIBLE : INVISIBLE);
} else if (mDimmed) {
// When groups are animating to the expanded state from the lockscreen, show the
- // normal background instead of the dimmed background
+ // normal background instead of the dimmed background.
final boolean dontShowDimmed = isGroupExpansionChanging() && isChildInGroup();
mBackgroundDimmed.setVisibility(dontShowDimmed ? View.INVISIBLE : View.VISIBLE);
mBackgroundNormal.setVisibility((mActivated || dontShowDimmed)
@@ -760,7 +700,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
protected boolean shouldHideBackground() {
- return mDark;
+ return false;
}
private void cancelFadeAnimations() {
@@ -1023,14 +963,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
/**
* @param withTint should a possible tint be factored in?
- * @param withOverRide should the value be interpolated with {@link #mOverrideTint}
+ * @param withOverride should the value be interpolated with {@link #mOverrideTint}
* @return the calculated background color
*/
- private int calculateBgColor(boolean withTint, boolean withOverRide) {
- if (withTint && mDark) {
- return getContext().getColor(R.color.notification_material_background_dark_color);
- }
- if (withOverRide && mOverrideTint != NO_COLOR) {
+ private int calculateBgColor(boolean withTint, boolean withOverride) {
+ if (withOverride && mOverrideTint != NO_COLOR) {
int defaultTint = calculateBgColor(withTint, false);
return NotificationUtils.interpolateColors(defaultTint, mOverrideTint, mOverrideAmount);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index a58c7cde32a7..296c061459bc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.notification.row;
-import static com.android.systemui.statusbar.StatusBarState.SHADE;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_AMBIENT;
import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED;
@@ -86,10 +85,9 @@ import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationCounters;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
@@ -106,6 +104,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
@@ -122,6 +121,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private static final int MENU_VIEW_INDEX = 0;
private static final String TAG = "ExpandableNotifRow";
public static final float DEFAULT_HEADER_VISIBLE_AMOUNT = 1.0f;
+ private static final long RECENTLY_ALERTED_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30);
private boolean mUpdateBackgroundOnUpdate;
/**
@@ -132,7 +132,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private LayoutListener mLayoutListener;
- private boolean mDark;
private boolean mLowPriorityStateUpdated;
private final NotificationInflater mNotificationInflater;
private int mIconTransformContentShift;
@@ -146,7 +145,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private int mNotificationMinHeight;
private int mNotificationMinHeightLarge;
private int mNotificationMaxHeight;
- private int mNotificationAmbientHeight;
private int mIncreasedPaddingBetweenElements;
private int mNotificationLaunchHeight;
private boolean mMustStayOnScreen;
@@ -199,7 +197,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private ExpansionLogger mLogger;
private String mLoggingKey;
private NotificationGuts mGuts;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private StatusBarNotification mStatusBarNotification;
private String mAppName;
@@ -451,7 +449,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
*
* @param entry the entry this row is tied to
*/
- public void setEntry(@NonNull NotificationData.Entry entry) {
+ public void setEntry(@NonNull NotificationEntry entry) {
mEntry = entry;
mStatusBarNotification = entry.notification;
cacheIsSystemNotification();
@@ -677,15 +675,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
if (headsUpWrapper != null) {
headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight());
}
- layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight,
- mNotificationAmbientHeight);
+ layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight, headsUpHeight);
}
public StatusBarNotification getStatusBarNotification() {
return mStatusBarNotification;
}
- public NotificationData.Entry getEntry() {
+ public NotificationEntry getEntry() {
return mEntry;
}
@@ -1422,7 +1419,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
public void performDismiss(boolean fromAccessibility) {
if (isOnlyChildInGroup()) {
- NotificationData.Entry groupSummary =
+ NotificationEntry groupSummary =
mGroupManager.getLogicalGroupSummary(getStatusBarNotification());
if (groupSummary.isClearable()) {
// If this is the only child in the group, dismiss the group, but don't try to show
@@ -1647,8 +1644,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
R.dimen.notification_min_height_increased);
mNotificationMaxHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_height);
- mNotificationAmbientHeight = NotificationUtils.getFontScaledHeight(mContext,
- R.dimen.notification_ambient_height);
mMaxHeadsUpHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_legacy);
mMaxHeadsUpHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
@@ -1693,17 +1688,31 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
/** Sets the last time the notification being displayed audibly alerted the user. */
public void setLastAudiblyAlertedMs(long lastAudiblyAlertedMs) {
if (NotificationUtils.useNewInterruptionModel(mContext)) {
- boolean recentlyAudiblyAlerted = System.currentTimeMillis() - lastAudiblyAlertedMs
- < NotificationEntryManager.RECENTLY_ALERTED_THRESHOLD_MS;
- if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() != null) {
- mChildrenContainer.getHeaderView().setRecentlyAudiblyAlerted(
- recentlyAudiblyAlerted);
+ long timeSinceAlertedAudibly = System.currentTimeMillis() - lastAudiblyAlertedMs;
+ boolean alertedRecently =
+ timeSinceAlertedAudibly < RECENTLY_ALERTED_THRESHOLD_MS;
+
+ applyAudiblyAlertedRecently(alertedRecently);
+
+ removeCallbacks(mExpireRecentlyAlertedFlag);
+ if (alertedRecently) {
+ long timeUntilNoLongerRecent =
+ RECENTLY_ALERTED_THRESHOLD_MS - timeSinceAlertedAudibly;
+ postDelayed(mExpireRecentlyAlertedFlag, timeUntilNoLongerRecent);
}
- mPrivateLayout.setRecentlyAudiblyAlerted(recentlyAudiblyAlerted);
- mPublicLayout.setRecentlyAudiblyAlerted(recentlyAudiblyAlerted);
}
}
+ private final Runnable mExpireRecentlyAlertedFlag = () -> applyAudiblyAlertedRecently(false);
+
+ private void applyAudiblyAlertedRecently(boolean audiblyAlertedRecently) {
+ if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() != null) {
+ mChildrenContainer.getHeaderView().setRecentlyAudiblyAlerted(audiblyAlertedRecently);
+ }
+ mPrivateLayout.setRecentlyAudiblyAlerted(audiblyAlertedRecently);
+ mPublicLayout.setRecentlyAudiblyAlerted(audiblyAlertedRecently);
+ }
+
public View.OnClickListener getAppOpsOnClickListener() {
return mOnAppOpsClickListener;
}
@@ -1994,8 +2003,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
public void setDark(boolean dark, boolean fade, long delay) {
+ if (mDark == dark) {
+ return;
+ }
super.setDark(dark, fade, delay);
- mDark = dark;
if (!mIsAmbientPulsing) {
// Only fade the showing view of the pulsing notification.
fade = false;
@@ -2004,9 +2015,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
if (showing != null) {
showing.setDark(dark, fade, delay);
}
- if (mIsSummaryWithChildren) {
- mChildrenContainer.setDark(dark, fade, delay);
- }
updateShelfIconColor();
}
@@ -2307,7 +2315,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private boolean isShownAsBubble() {
- return mEntry.isBubble() && (mStatusBarState == SHADE || mStatusBarState == -1);
+ return mEntry.isBubble() && !mEntry.showInShadeWhenBubble() && !mEntry.isBubbleDismissed();
}
/**
@@ -2538,7 +2546,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
/**
* @return Whether this view is allowed to be dismissed. Only valid for visible notifications as
* otherwise some state might not be updated. To request about the general clearability
- * see {@link NotificationData.Entry#isClearable()}.
+ * see {@link NotificationEntry#isClearable()}.
*/
public boolean canViewBeDismissed() {
return mEntry.isClearable() && (!shouldShowPublic() || !mSensitiveHiddenInGeneral);
@@ -2969,7 +2977,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
public interface OnExpandClickListener {
- void onExpandClicked(NotificationData.Entry clickedEntry, boolean nowExpanded);
+ void onExpandClicked(NotificationEntry clickedEntry, boolean nowExpanded);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java
index 33badafd5488..90ff4a728915 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java
@@ -39,14 +39,10 @@ public class HybridGroupManager {
private final NotificationDozeHelper mDozer;
private final ViewGroup mParent;
- private float mOverflowNumberSizeDark;
- private int mOverflowNumberPaddingDark;
private float mOverflowNumberSize;
private int mOverflowNumberPadding;
private int mOverflowNumberColor;
- private int mOverflowNumberColorDark;
- private float mDarkAmount = 0f;
public HybridGroupManager(Context ctx, ViewGroup parent) {
mContext = ctx;
@@ -59,12 +55,8 @@ public class HybridGroupManager {
Resources res = mContext.getResources();
mOverflowNumberSize = res.getDimensionPixelSize(
R.dimen.group_overflow_number_size);
- mOverflowNumberSizeDark = res.getDimensionPixelSize(
- R.dimen.group_overflow_number_size_dark);
mOverflowNumberPadding = res.getDimensionPixelSize(
R.dimen.group_overflow_number_padding);
- mOverflowNumberPaddingDark = mOverflowNumberPadding + res.getDimensionPixelSize(
- R.dimen.group_overflow_number_extra_padding_dark);
}
private HybridNotificationView inflateHybridViewWithStyle(int style) {
@@ -86,13 +78,11 @@ public class HybridGroupManager {
}
private void updateOverFlowNumberColor(TextView numberView) {
- numberView.setTextColor(NotificationUtils.interpolateColors(
- mOverflowNumberColor, mOverflowNumberColorDark, mDarkAmount));
+ numberView.setTextColor(mOverflowNumberColor);
}
- public void setOverflowNumberColor(TextView numberView, int colorRegular, int colorDark) {
+ public void setOverflowNumberColor(TextView numberView, int colorRegular) {
mOverflowNumberColor = colorRegular;
- mOverflowNumberColorDark = colorDark;
if (numberView != null) {
updateOverFlowNumberColor(numberView);
}
@@ -107,7 +97,7 @@ public class HybridGroupManager {
public HybridNotificationView bindAmbientFromNotification(HybridNotificationView reusableView,
Notification notification) {
return bindFromNotificationWithStyle(reusableView, notification,
- R.style.HybridNotification_Ambient);
+ R.style.HybridNotification);
}
private HybridNotificationView bindFromNotificationWithStyle(
@@ -150,6 +140,11 @@ public class HybridGroupManager {
R.plurals.notification_group_overflow_description, number), number);
reusableView.setContentDescription(contentDescription);
+ reusableView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOverflowNumberSize);
+ reusableView.setPaddingRelative(reusableView.getPaddingStart(),
+ reusableView.getPaddingTop(), mOverflowNumberPadding,
+ reusableView.getPaddingBottom());
+ updateOverFlowNumberColor(reusableView);
return reusableView;
}
@@ -163,16 +158,4 @@ public class HybridGroupManager {
}
return titleView;
}
-
- public void setOverflowNumberDark(TextView view, boolean dark, boolean fade, long delay) {
- mDozer.setIntensityDark((f)->{
- mDarkAmount = f;
- updateOverFlowNumberColor(view);
- }, dark, fade, delay, view);
- view.setTextSize(TypedValue.COMPLEX_UNIT_PX,
- dark ? mOverflowNumberSizeDark : mOverflowNumberSize);
- int paddingEnd = dark ? mOverflowNumberPaddingDark : mOverflowNumberPadding;
- view.setPaddingRelative(view.getPaddingStart(), view.getPaddingTop(), paddingEnd,
- view.getPaddingBottom());
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
index 607d96dcbd3f..6df72febc8db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
@@ -20,11 +20,13 @@ import static android.service.notification.NotificationListenerService.Ranking
.USER_SENTIMENT_NEGATIVE;
import android.content.Context;
+import android.metrics.LogMaker;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -58,6 +60,8 @@ public class NotificationBlockingHelperManager {
*/
private boolean mIsShadeExpanded;
+ private MetricsLogger mMetricsLogger = new MetricsLogger();
+
@Inject
public NotificationBlockingHelperManager(Context context) {
mContext = context;
@@ -100,6 +104,11 @@ public class NotificationBlockingHelperManager {
mBlockingHelperRow = row;
mBlockingHelperRow.setBlockingHelperShowing(true);
+ // Log triggering of blocking helper by the system. This log line
+ // should be emitted before the "display" log line.
+ mMetricsLogger.write(
+ getLogMaker().setSubtype(MetricsEvent.BLOCKING_HELPER_TRIGGERED_BY_SYSTEM));
+
// We don't care about the touch origin (x, y) since we're opening guts without any
// explicit user interaction.
manager.openGuts(mBlockingHelperRow, 0, 0, menuRow.getLongpressMenuItem(mContext));
@@ -153,6 +162,13 @@ public class NotificationBlockingHelperManager {
|| mNonBlockablePkgs.contains(makeChannelKey(packageName, channelName));
}
+ private LogMaker getLogMaker() {
+ return mBlockingHelperRow.getStatusBarNotification()
+ .getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_ITEM)
+ .setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER);
+ }
+
// Format must stay in sync with frameworks/base/core/res/res/values/config.xml
// config_nonBlockableNotificationPackages
private String makeChannelKey(String pkg, String channel) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 02a310c29379..c161da348c28 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -46,8 +46,8 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.TransformableView;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationCustomViewWrapper;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -1231,7 +1231,7 @@ public class NotificationContentView extends FrameLayout {
updateAllSingleLineViews();
}
- public void onNotificationUpdated(NotificationData.Entry entry) {
+ public void onNotificationUpdated(NotificationEntry entry) {
mStatusBarNotification = entry.notification;
mOnContentViewInactiveListeners.clear();
mBeforeN = entry.targetSdk < Build.VERSION_CODES.N;
@@ -1292,7 +1292,7 @@ public class NotificationContentView extends FrameLayout {
}
}
- private void applyRemoteInputAndSmartReply(final NotificationData.Entry entry) {
+ private void applyRemoteInputAndSmartReply(final NotificationEntry entry) {
if (mRemoteInputController == null) {
return;
}
@@ -1313,7 +1313,7 @@ public class NotificationContentView extends FrameLayout {
@VisibleForTesting
static SmartRepliesAndActions chooseSmartRepliesAndActions(
SmartReplyConstants smartReplyConstants,
- final NotificationData.Entry entry) {
+ final NotificationEntry entry) {
boolean enableAppGeneratedSmartReplies = (smartReplyConstants.isEnabled()
&& (!smartReplyConstants.requiresTargetingP()
|| entry.targetSdk >= Build.VERSION_CODES.P));
@@ -1370,7 +1370,7 @@ public class NotificationContentView extends FrameLayout {
smartReplies, smartActions, freeformRemoteInputActionPair != null);
}
- private void applyRemoteInput(NotificationData.Entry entry, boolean hasFreeformRemoteInput) {
+ private void applyRemoteInput(NotificationEntry entry, boolean hasFreeformRemoteInput) {
View bigContentView = mExpandedChild;
if (bigContentView != null) {
mExpandedRemoteInput = applyRemoteInput(bigContentView, entry, hasFreeformRemoteInput,
@@ -1402,7 +1402,7 @@ public class NotificationContentView extends FrameLayout {
mCachedHeadsUpRemoteInput = null;
}
- private RemoteInputView applyRemoteInput(View view, NotificationData.Entry entry,
+ private RemoteInputView applyRemoteInput(View view, NotificationEntry entry,
boolean hasRemoteInput, PendingIntent existingPendingIntent,
RemoteInputView cachedView, NotificationViewWrapper wrapper) {
View actionContainerCandidate = view.findViewById(
@@ -1470,7 +1470,7 @@ public class NotificationContentView extends FrameLayout {
}
private void applySmartReplyView(SmartRepliesAndActions smartRepliesAndActions,
- NotificationData.Entry entry) {
+ NotificationEntry entry) {
if (mExpandedChild != null) {
mExpandedSmartReplyView =
applySmartReplyView(mExpandedChild, smartRepliesAndActions, entry);
@@ -1489,14 +1489,14 @@ public class NotificationContentView extends FrameLayout {
}
}
}
- if (mHeadsUpChild != null) {
+ if (mHeadsUpChild != null && mSmartReplyConstants.getShowInHeadsUp()) {
mHeadsUpSmartReplyView =
applySmartReplyView(mHeadsUpChild, smartRepliesAndActions, entry);
}
}
private SmartReplyView applySmartReplyView(View view,
- SmartRepliesAndActions smartRepliesAndActions, NotificationData.Entry entry) {
+ SmartRepliesAndActions smartRepliesAndActions, NotificationEntry entry) {
View smartReplyContainerCandidate = view.findViewById(
com.android.internal.R.id.smart_reply_container);
if (!(smartReplyContainerCandidate instanceof LinearLayout)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index ac4e5830d76b..bd1dfb181afe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -48,7 +48,7 @@ import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInfo.CheckSaveListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -116,7 +116,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
mNotificationActivityStarter = notificationActivityStarter;
}
- public void onDensityOrFontScaleChanged(NotificationData.Entry entry) {
+ public void onDensityOrFontScaleChanged(NotificationEntry entry) {
setExposedGuts(entry.getGuts());
bindGuts(entry.getRow());
}
@@ -429,7 +429,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
}
@Override
- public boolean shouldExtendLifetime(NotificationData.Entry entry) {
+ public boolean shouldExtendLifetime(NotificationEntry entry) {
return entry != null
&&(mNotificationGutsExposed != null
&& entry.getGuts() != null
@@ -438,7 +438,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
}
@Override
- public void setShouldManageLifetime(NotificationData.Entry entry, boolean shouldExtend) {
+ public void setShouldManageLifetime(NotificationEntry entry, boolean shouldExtend) {
if (shouldExtend) {
mKeyToRemoveOnGutsClosed = entry.key;
if (Log.isLoggable(TAG, Log.DEBUG)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInflater.java
index 9908049984d1..42ebfceca334 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInflater.java
@@ -37,7 +37,7 @@ import com.android.internal.widget.ImageMessageConsumer;
import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.notification.InflationException;
import com.android.systemui.statusbar.notification.MediaNotificationProcessor;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.Assert;
@@ -614,7 +614,7 @@ public class NotificationInflater {
@Nullable InflationCallback endListener, ExpandableNotificationRow row,
boolean redactAmbient) {
Assert.isMainThread();
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
NotificationContentView privateLayout = row.getPrivateLayout();
NotificationContentView publicLayout = row.getPublicLayout();
if (runningInflations.isEmpty()) {
@@ -724,7 +724,7 @@ public class NotificationInflater {
* @param entry the entry with the content views set
* @param inflatedFlags the flags associated with the content views that were inflated
*/
- void onAsyncInflationFinished(NotificationData.Entry entry,
+ void onAsyncInflationFinished(NotificationEntry entry,
@InflationFlag int inflatedFlags);
/**
@@ -782,7 +782,7 @@ public class NotificationInflater {
mRedactAmbient = redactAmbient;
mRemoteViewClickHandler = remoteViewClickHandler;
mCallback = callback;
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
entry.setInflationTask(this);
}
@@ -857,7 +857,7 @@ public class NotificationInflater {
}
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@InflationFlag int inflatedFlags) {
mRow.getEntry().onInflationTaskFinished();
mRow.onNotificationUpdated();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index b1eab8069307..5253e38fd675 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -123,11 +123,15 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener mOnKeepShowing = v -> {
mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
closeControls(v);
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
};
private OnClickListener mOnToggleSilent = v -> {
Runnable saveImportance = () -> {
swapContent(ACTION_TOGGLE_SILENT, true /* animate */);
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME));
};
if (mCheckSaveListener != null) {
mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -139,6 +143,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener mOnStopOrMinimizeNotifications = v -> {
Runnable saveImportance = () -> {
swapContent(ACTION_BLOCK, true /* animate */);
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED));
};
if (mCheckSaveListener != null) {
mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -153,6 +159,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
swapContent(ACTION_UNDO, true /* animate */);
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
};
public NotificationInfo(Context context, AttributeSet attrs) {
@@ -251,6 +259,9 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
bindHeader();
bindPrompt();
bindButtons();
+
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_DISPLAY));
}
private void bindHeader() throws RemoteException {
@@ -588,6 +599,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
confirmation.setAlpha(1f);
header.setVisibility(VISIBLE);
header.setAlpha(1f);
+ mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_DISMISS));
}
@Override
@@ -733,4 +746,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
}
}
+
+ private LogMaker getLogMaker() {
+ return mSbn.getLogMaker().setCategory(MetricsEvent.NOTIFICATION_ITEM);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java
index 1741a0b6b37c..0160c547b336 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java
@@ -25,7 +25,7 @@ import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import com.android.systemui.R;
import com.android.systemui.statusbar.InflationTask;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
/**
* An inflater task that asynchronously inflates a ExpandableNotificationRow
@@ -36,14 +36,14 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf
private static final boolean TRACE_ORIGIN = true;
private RowInflationFinishedListener mListener;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private boolean mCancelled;
private Throwable mInflateOrigin;
/**
* Inflates a new notificationView. This should not be called twice on this object
*/
- public void inflate(Context context, ViewGroup parent, NotificationData.Entry entry,
+ public void inflate(Context context, ViewGroup parent, NotificationEntry entry,
RowInflationFinishedListener listener) {
if (TRACE_ORIGIN) {
mInflateOrigin = new Throwable("inflate requested here");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index 670908fe175d..1b5013dedb0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -25,7 +25,7 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -75,7 +75,6 @@ public class AmbientState {
private int mIntrinsicPadding;
private int mExpandAnimationTopChange;
private ExpandableNotificationRow mExpandingNotification;
- private int mDarkTopPadding;
private float mDarkAmount;
private boolean mAppearing;
@@ -351,14 +350,15 @@ public class AmbientState {
}
public boolean hasPulsingNotifications() {
- return mPulsing;
+ return mPulsing && mAmbientPulseManager != null
+ && mAmbientPulseManager.hasNotifications();
}
public void setPulsing(boolean hasPulsing) {
mPulsing = hasPulsing;
}
- public boolean isPulsing(NotificationData.Entry entry) {
+ public boolean isPulsing(NotificationEntry entry) {
if (!mPulsing || mAmbientPulseManager == null) {
return false;
}
@@ -458,14 +458,6 @@ public class AmbientState {
return mDarkAmount != 0;
}
- public void setDarkTopPadding(int darkTopPadding) {
- mDarkTopPadding = darkTopPadding;
- }
-
- public int getDarkTopPadding() {
- return mDarkTopPadding;
- }
-
public void setAppearing(boolean appearing) {
mAppearing = appearing;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index 51180361806b..8ffada43c53f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -316,7 +316,7 @@ public class NotificationChildrenContainer extends ViewGroup {
StatusBarNotification notification = mContainingNotification.getStatusBarNotification();
final Notification.Builder builder = Notification.Builder.recoverBuilder(getContext(),
notification.getNotification());
- RemoteViews header = builder.makeNotificationHeader(false /* ambient */);
+ RemoteViews header = builder.makeNotificationHeader();
if (mNotificationHeader == null) {
mNotificationHeader = (NotificationHeaderView) header.apply(getContext(), this);
final View expandButton = mNotificationHeader.findViewById(
@@ -344,7 +344,7 @@ public class NotificationChildrenContainer extends ViewGroup {
builder = Notification.Builder.recoverBuilder(getContext(),
notification.getNotification());
}
- header = builder.makeNotificationHeader(true /* ambient */);
+ header = builder.makeNotificationHeader();
if (mNotificationHeaderAmbient == null) {
mNotificationHeaderAmbient = (ViewGroup) header.apply(getContext(), this);
mNotificationHeaderWrapperAmbient = NotificationViewWrapper.wrap(getContext(),
@@ -1171,12 +1171,6 @@ public class NotificationChildrenContainer extends ViewGroup {
return mIsLowPriority && !mContainingNotification.isExpanded();
}
- public void setDark(boolean dark, boolean fade, long delay) {
- if (mOverflowNumber != null) {
- mHybridGroupManager.setOverflowNumberDark(mOverflowNumber, dark, fade, delay);
- }
- }
-
public void reInflateViews(OnClickListener listener, StatusBarNotification notification) {
if (mNotificationHeader != null) {
removeView(mNotificationHeader);
@@ -1227,8 +1221,7 @@ public class NotificationChildrenContainer extends ViewGroup {
public void onNotificationUpdated() {
mHybridGroupManager.setOverflowNumberColor(mOverflowNumber,
- mContainingNotification.getNotificationColor(),
- mContainingNotification.getNotificationColorAmbient());
+ mContainingNotification.getNotificationColor());
}
public int getPositionInLinearLayout(View childInGroup) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java
index f0a26536d7b8..f771be043c07 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java
@@ -16,15 +16,14 @@
package com.android.systemui.statusbar.notification.stack;
-import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator
- .ExpandAnimationParameters;
+import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -113,19 +112,12 @@ public interface NotificationListContainer extends ExpandableView.OnHeightChange
void setMaxDisplayedNotifications(int maxNotifications);
/**
- * Handle snapping a non-dismissable row back if the user tried to dismiss it.
- *
- * @param entry the entry whose row needs to snap back
- */
- void snapViewIfNeeded(NotificationData.Entry entry);
-
- /**
* Get the view parent for a notification entry. For example, NotificationStackScrollLayout.
*
* @param entry entry to get the view parent for
* @return the view parent for entry
*/
- ViewGroup getViewParentForNotification(NotificationData.Entry entry);
+ ViewGroup getViewParentForNotification(NotificationEntry entry);
/**
* Resets the currently exposed menu view.
@@ -148,7 +140,7 @@ public interface NotificationListContainer extends ExpandableView.OnHeightChange
*
* @param entry the entry whose view's view state needs to be cleaned up (say that 5 times fast)
*/
- void cleanUpViewStateForEntry(NotificationData.Entry entry);
+ void cleanUpViewStateForEntry(NotificationEntry entry);
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
index 4f0831f1043c..c5ab9f6049c6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
@@ -18,7 +18,8 @@ package com.android.systemui.statusbar.notification.stack;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.NUM_SECTIONS;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.AmbientPulseManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -26,35 +27,43 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import java.util.HashSet;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/**
* A class that manages the roundness for notification views
*/
-class NotificationRoundnessManager implements OnHeadsUpChangedListener {
-
+@Singleton
+class NotificationRoundnessManager implements OnHeadsUpChangedListener,
+ AmbientPulseManager.OnAmbientChangedListener {
+
+ private final ActivatableNotificationView[] mFirstInSectionViews;
+ private final ActivatableNotificationView[] mLastInSectionViews;
+ private final ActivatableNotificationView[] mTmpFirstInSectionViews;
+ private final ActivatableNotificationView[] mTmpLastInSectionViews;
private boolean mExpanded;
- private ActivatableNotificationView[] mFirstInSectionViews;
- private ActivatableNotificationView[] mLastInSectionViews;
- private ActivatableNotificationView[] mTmpFirstInSectionViews;
- private ActivatableNotificationView[] mTmpLastInSectionViews;
private HashSet<ExpandableView> mAnimatedChildren;
private Runnable mRoundingChangedCallback;
private ExpandableNotificationRow mTrackedHeadsUp;
+ private ActivatableNotificationView mTrackedAmbient;
private float mAppearFraction;
- NotificationRoundnessManager() {
+ @Inject
+ NotificationRoundnessManager(AmbientPulseManager ambientPulseManager) {
mFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS];
mLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS];
mTmpFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS];
mTmpLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS];
+ ambientPulseManager.addListener(this);
}
@Override
- public void onHeadsUpPinned(NotificationData.Entry headsUp) {
+ public void onHeadsUpPinned(NotificationEntry headsUp) {
updateView(headsUp.getRow(), false /* animate */);
}
@Override
- public void onHeadsUpUnPinned(NotificationData.Entry headsUp) {
+ public void onHeadsUpUnPinned(NotificationEntry headsUp) {
updateView(headsUp.getRow(), true /* animate */);
}
@@ -63,6 +72,17 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener {
updateView(row, false /* animate */);
}
+ @Override
+ public void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing) {
+ ActivatableNotificationView row = entry.getRow();
+ if (isPulsing) {
+ mTrackedAmbient = row;
+ } else if (mTrackedAmbient == row) {
+ mTrackedAmbient = null;
+ }
+ updateView(row, false /* animate */);
+ }
+
private void updateView(ActivatableNotificationView view, boolean animate) {
boolean changed = updateViewWithoutCallback(view, animate);
if (changed) {
@@ -125,6 +145,9 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener {
// rounded.
return 1.0f;
}
+ if (view == mTrackedAmbient) {
+ return 1.0f;
+ }
return 0.0f;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 8deb7d5e8456..d0665670bf8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -96,12 +96,13 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.notification.FakeShadowView;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.ShadeViewRefactor;
import com.android.systemui.statusbar.notification.ShadeViewRefactor.RefactorComponent;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -112,6 +113,7 @@ import com.android.systemui.statusbar.notification.row.NotificationGuts;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationSnooze;
import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
+import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
@@ -199,12 +201,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private int mPaddingBetweenElements;
private int mIncreasedPaddingBetweenElements;
private int mMaxTopPadding;
- private int mRegularTopPadding;
- private int mDarkTopPadding;
- // Current padding, will be either mRegularTopPadding or mDarkTopPadding
private int mTopPadding;
- // Distance between AOD separator and shelf
- private int mDarkShelfPadding;
private int mBottomMargin;
private int mBottomInset = 0;
private float mQsExpansionFraction;
@@ -316,7 +313,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations
= new HashSet<>();
private HeadsUpManagerPhone mHeadsUpManager;
- private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager();
+ private final NotificationRoundnessManager mRoundnessManager;
private boolean mTrackingHeadsUp;
private ScrimController mScrimController;
private boolean mForceNoOverlappingRendering;
@@ -429,7 +426,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private int mHeadsUpInset;
private HeadsUpAppearanceController mHeadsUpAppearanceController;
private NotificationIconAreaController mIconAreaController;
- private float mVerticalPanelTranslation;
+ private float mHorizontalPanelTranslation;
private final NotificationLockscreenUserManager mLockscreenUserManager =
Dependency.get(NotificationLockscreenUserManager.class);
protected final NotificationGutsManager mGutsManager =
@@ -439,7 +436,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
Dependency.get(NotificationEntryManager.class);
private final IStatusBarService mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
+ @VisibleForTesting
+ protected final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
private final NotificationRemoteInputManager mRemoteInputManager =
Dependency.get(NotificationRemoteInputManager.class);
private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class);
@@ -457,12 +455,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private final NotificationGutsManager
mNotificationGutsManager = Dependency.get(NotificationGutsManager.class);
+ /**
+ * If the {@link NotificationShelf} should be visible when dark.
+ */
+ private boolean mShowDarkShelf;
@Inject
public NotificationStackScrollLayout(
@Named(VIEW_CONTEXT) Context context,
AttributeSet attrs,
- @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress) {
+ @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
+ NotificationRoundnessManager notificationRoundnessManager) {
super(context, attrs, 0, 0);
Resources res = getResources();
@@ -473,6 +476,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
mAmbientState = new AmbientState(context);
+ mRoundnessManager = notificationRoundnessManager;
mBgColor = context.getColor(R.color.notification_shade_background_color);
int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height);
int maxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height);
@@ -489,7 +493,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
res.getBoolean(R.bool.config_drawNotificationBackground);
mFadeNotificationsOnDismiss =
res.getBoolean(R.bool.config_fadeNotificationsOnDismiss);
- mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding);
mRoundnessManager.setAnimatedChildren(mChildrenToAddAnimated);
mRoundnessManager.setOnRoundingChangedCallback(this::invalidate);
addOnExpandedHeightListener(mRoundnessManager::setExpanded);
@@ -517,6 +520,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mLowPriorityBeforeSpeedBump = "1".equals(newValue);
}
}, LOW_PRIORITY);
+
+ mEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
+ @Override
+ public void onPostEntryUpdated(NotificationEntry entry) {
+ if (!entry.notification.isClearable()) {
+ // The user may have performed a dismiss action on the notification, since it's
+ // not clearable we should snap it back.
+ snapViewIfNeeded(entry);
+ }
+ }
+ });
}
@Override
@@ -590,14 +604,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
public RemoteInputController.Delegate createDelegate() {
return new RemoteInputController.Delegate() {
- public void setRemoteInputActive(NotificationData.Entry entry,
+ public void setRemoteInputActive(NotificationEntry entry,
boolean remoteInputActive) {
mHeadsUpManager.setRemoteInputActive(entry, remoteInputActive);
entry.notifyHeightChanged(true /* needsAnimation */);
updateFooter();
}
- public void lockScrollTo(NotificationData.Entry entry) {
+ public void lockScrollTo(NotificationEntry entry) {
NotificationStackScrollLayout.this.lockScrollTo(entry.getRow());
}
@@ -667,7 +681,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
int lockScreenTop = mSections[0].getCurrentBounds().top;
int lockScreenBottom = mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom;
int darkLeft = getWidth() / 2;
- int darkTop = mRegularTopPadding;
+ int darkTop = mTopPadding;
float yProgress = 1 - mInterpolatedDarkAmount;
float xProgress = mDarkXInterpolator.getInterpolation(
@@ -910,7 +924,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@Override
@ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM)
- public boolean isInVisibleLocation(NotificationData.Entry entry) {
+ public boolean isInVisibleLocation(NotificationEntry entry) {
ExpandableNotificationRow row = entry.getRow();
ExpandableViewState childViewState = row.getViewState();
@@ -935,8 +949,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM)
private void updateAlgorithmHeightAndPadding() {
- mTopPadding = (int) MathUtils.lerp(mRegularTopPadding, mDarkTopPadding,
- mInterpolatedDarkAmount);
mAmbientState.setLayoutHeight(getLayoutHeight());
updateAlgorithmLayoutMinHeight();
mAmbientState.setTopPadding(mTopPadding);
@@ -1074,10 +1086,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
private void setTopPadding(int topPadding, boolean animate) {
- if (mRegularTopPadding != topPadding) {
- mRegularTopPadding = topPadding;
- mDarkTopPadding = topPadding + mDarkShelfPadding;
- mAmbientState.setDarkTopPadding(mDarkTopPadding);
+ if (mTopPadding != topPadding) {
+ mTopPadding = topPadding;
updateAlgorithmHeightAndPadding();
updateContentHeight();
if (animate && mAnimationsEnabled && mIsExpanded) {
@@ -1184,7 +1194,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mIsClipped = clipped;
}
- if (mPulsing) {
+ if (mPulsing || mAmbientState.isFullyDark() && mShowDarkShelf) {
setClipBounds(null);
} else if (mAmbientState.isDarkAtAll()) {
setClipBounds(mBackgroundAnimationRect);
@@ -1224,13 +1234,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
*/
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
private int getTopHeadsUpPinnedHeight() {
- NotificationData.Entry topEntry = mHeadsUpManager.getTopEntry();
+ NotificationEntry topEntry = mHeadsUpManager.getTopEntry();
if (topEntry == null) {
return 0;
}
ExpandableNotificationRow row = topEntry.getRow();
if (row.isChildInGroup()) {
- final NotificationData.Entry groupSummary
+ final NotificationEntry groupSummary
= mGroupManager.getGroupSummary(row.getStatusBarNotification());
if (groupSummary != null) {
row = groupSummary.getRow();
@@ -1405,7 +1415,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
&& touchY >= top && touchY <= bottom && touchX >= left && touchX <= right) {
if (slidingChild instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) slidingChild;
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
if (!mIsExpanded && row.isHeadsUp() && row.isPinned()
&& mHeadsUpManager.getTopEntry().getRow() != row
&& mGroupManager.getGroupSummary(
@@ -1538,9 +1548,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
true /* isDismissAll */);
}
- @Override
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
- public void snapViewIfNeeded(NotificationData.Entry entry) {
+ private void snapViewIfNeeded(NotificationEntry entry) {
ExpandableNotificationRow child = entry.getRow();
boolean animate = mIsExpanded || isPinnedHeadsUp(child);
// If the child is showing the notification menu snap to that
@@ -1550,7 +1559,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@Override
@ShadeViewRefactor(RefactorComponent.ADAPTER)
- public ViewGroup getViewParentForNotification(NotificationData.Entry entry) {
+ public ViewGroup getViewParentForNotification(NotificationEntry entry) {
return this;
}
@@ -2043,17 +2052,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
mIntrinsicContentHeight = height;
- // We don't want to use the toppadding since that might be interpolated and we want
- // to take the final value of the animation.
- int topPadding = mAmbientState.isFullyDark() ? mDarkTopPadding : mRegularTopPadding;
- mContentHeight = height + topPadding + mBottomMargin;
+ mContentHeight = height + mTopPadding + mBottomMargin;
updateScrollability();
clampScrollPosition();
mAmbientState.setLayoutMaxHeight(mContentHeight);
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- private boolean isPulsing(NotificationData.Entry entry) {
+ private boolean isPulsing(NotificationEntry entry) {
return mAmbientState.isPulsing(entry);
}
@@ -2210,13 +2216,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
int top = 0;
if (section != null) {
ActivatableNotificationView firstView = section.getFirstVisibleChild();
- // Round Y up to avoid seeing the background during animation
- int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
- if (alreadyAnimating || section.isTargetTop(finalTranslationY)) {
- // we're ending up at the same location as we are now, let's just skip the animation
- top = finalTranslationY;
- } else {
- top = (int) Math.ceil(firstView.getTranslationY());
+ if (firstView != null) {
+ // Round Y up to avoid seeing the background during animation
+ int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
+ if (alreadyAnimating || section.isTargetTop(finalTranslationY)) {
+ // we're ending up at the same location as we are now, let's just skip the
+ // animation
+ top = finalTranslationY;
+ } else {
+ top = (int) Math.ceil(firstView.getTranslationY());
+ }
}
}
return top;
@@ -2558,7 +2567,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
@Override
- public void cleanUpViewStateForEntry(NotificationData.Entry entry) {
+ public void cleanUpViewStateForEntry(NotificationEntry entry) {
View child = entry.getRow();
if (child == mSwipeHelper.getTranslatingParentView()) {
mSwipeHelper.clearTranslatingParentView();
@@ -2686,7 +2695,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private boolean isChildInInvisibleGroup(View child) {
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
- NotificationData.Entry groupSummary =
+ NotificationEntry groupSummary =
mGroupManager.getGroupSummary(row.getStatusBarNotification());
if (groupSummary != null && groupSummary.getRow() != row) {
return row.getVisibility() == View.INVISIBLE;
@@ -4350,6 +4359,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
if (mAmbientState.isDark() == dark) {
return;
}
+ if (!dark) {
+ mShowDarkShelf = false;
+ }
mAmbientState.setDark(dark);
if (animate && mAnimationsEnabled) {
mDarkNeedsAnimation = true;
@@ -4366,12 +4378,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
private void updatePanelTranslation() {
- setTranslationX(mVerticalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount);
+ setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount);
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- public void setVerticalPanelTranslation(float verticalPanelTranslation) {
- mVerticalPanelTranslation = verticalPanelTranslation;
+ public void setHorizontalPanelTranslation(float verticalPanelTranslation) {
+ mHorizontalPanelTranslation = verticalPanelTranslation;
updatePanelTranslation();
}
@@ -4411,9 +4423,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
boolean nowDarkAtAll = mAmbientState.isDarkAtAll();
if (nowFullyDark != wasFullyDark) {
updateContentHeight();
- }
- if (mIconAreaController != null) {
- mIconAreaController.setDarkAmount(interpolatedDarkAmount);
+ if (nowFullyDark && mShowDarkShelf) {
+ updateDarkShelfVisibility();
+ }
}
if (!wasDarkAtAll && nowDarkAtAll) {
resetExposedMenuView(true /* animate */, true /* animate */);
@@ -4424,6 +4436,22 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
requestChildrenUpdate();
}
+ /**
+ * If the shelf should be visible when the device is in ambient mode (dozing.)
+ */
+ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
+ public void setShowDarkShelf(boolean showDarkShelf) {
+ mShowDarkShelf = showDarkShelf;
+ }
+
+ private void updateDarkShelfVisibility() {
+ DozeParameters dozeParameters = DozeParameters.getInstance(mContext);
+ if (dozeParameters.shouldControlScreenOff()) {
+ mShelf.fadeInTranslating();
+ }
+ updateClipping();
+ }
+
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
public void notifyDarkAnimationStart(boolean dark) {
// We only swap the scaling factor if we're fully dark or fully awake to avoid
@@ -4705,7 +4733,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mHeadsUpManager.setAnimationStateHandler(this::setHeadsUpGoingAwayAnimationsAllowed);
}
- public void generateHeadsUpAnimation(NotificationData.Entry entry, boolean isHeadsUp) {
+ public void generateHeadsUpAnimation(NotificationEntry entry, boolean isHeadsUp) {
ExpandableNotificationRow row = entry.getHeadsUpAnimationView();
generateHeadsUpAnimation(row, isHeadsUp);
}
@@ -5183,9 +5211,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
// another "changeViewPosition" call is ever added.
changeViewPosition(mShelf,
getChildCount() - offsetFromEnd);
-
- // Scrim opacity varies based on notification count
- mScrimController.setNotificationCount(getNotGoneChildCount());
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
@@ -5603,8 +5628,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
};
+ @VisibleForTesting
@ShadeViewRefactor(RefactorComponent.INPUT)
- private final OnMenuEventListener mMenuEventListener = new OnMenuEventListener() {
+ protected final OnMenuEventListener mMenuEventListener = new OnMenuEventListener() {
@Override
public void onMenuClicked(View view, int x, int y, MenuItem item) {
if (mLongPressListener == null) {
@@ -5612,8 +5638,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
if (view instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) view;
- MetricsLogger.action(mContext, MetricsEvent.ACTION_TOUCH_GEAR,
- row.getStatusBarNotification().getPackageName());
+ mMetricsLogger.write(row.getStatusBarNotification().getLogMaker()
+ .setCategory(MetricsEvent.ACTION_TOUCH_GEAR)
+ .setType(MetricsEvent.TYPE_ACTION)
+ );
}
mLongPressListener.onLongPress(view, x, y, item);
}
@@ -5636,8 +5664,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
public void onMenuShown(View row) {
if (row instanceof ExpandableNotificationRow) {
ExpandableNotificationRow notificationRow = (ExpandableNotificationRow) row;
- MetricsLogger.action(mContext, MetricsEvent.ACTION_REVEAL_GEAR,
- notificationRow.getStatusBarNotification().getPackageName());
+ mMetricsLogger.write(notificationRow.getStatusBarNotification().getLogMaker()
+ .setCategory(MetricsEvent.ACTION_REVEAL_GEAR)
+ .setType(MetricsEvent.TYPE_ACTION));
mHeadsUpManager.setMenuShown(notificationRow.getEntry(), true);
}
mSwipeHelper.onMenuShown(row);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
index 19fce485b0c7..b4c205ab980c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
@@ -426,6 +426,9 @@ public class StackStateAnimator {
mTmpState.yTranslation += mPulsingAppearingTranslation;
mTmpState.alpha = 0;
mTmpState.applyToView(changingView);
+
+ mTmpState.copyFrom(mShelf.getViewState());
+ mTmpState.applyToView(mShelf);
}
} else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index f907b6523bef..35763dce5529 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -215,7 +215,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
}
}
- if (mStatusBarStateController.isDozing()) {
+ // The shelf will be hidden when dozing with a custom clock, we must show notification
+ // icons in this occasion.
+ if (mStatusBarStateController.isDozing()
+ && mStatusBarComponent.getPanel().hasCustomClock()) {
state |= DISABLE_CLOCK | DISABLE_SYSTEM_INFO;
state &= ~DISABLE_NOTIFICATION_ICONS;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 6f2b63d2e64d..10497734d0b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -158,8 +158,7 @@ public class DozeParameters implements TunerService.Tunable {
* @return duration in millis.
*/
public long getWallpaperAodDuration() {
- if (mAmbientDisplayConfiguration.wakeLockScreenGestureEnabled(UserHandle.USER_CURRENT)
- || shouldControlScreenOff()) {
+ if (shouldControlScreenOff()) {
return DozeScreenState.ENTER_DOZE_HIDE_WALLPAPER_DELAY;
}
return mAlwaysOnPolicy.wallpaperVisibilityDuration;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index d1e488ab2b4d..876b9028a9b6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -28,7 +28,7 @@ import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.HeadsUpStatusBarView;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -143,7 +143,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
}
@Override
- public void onHeadsUpPinned(NotificationData.Entry entry) {
+ public void onHeadsUpPinned(NotificationEntry entry) {
updateTopEntry();
updateHeader(entry);
}
@@ -206,11 +206,11 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
}
private void updateTopEntry() {
- NotificationData.Entry newEntry = null;
+ NotificationEntry newEntry = null;
if (!mIsExpanded && mHeadsUpManager.hasPinnedHeadsUp()) {
newEntry = mHeadsUpManager.getTopEntry();
}
- NotificationData.Entry previousEntry = mHeadsUpStatusBarView.getShowingEntry();
+ NotificationEntry previousEntry = mHeadsUpStatusBarView.getShowingEntry();
mHeadsUpStatusBarView.setEntry(newEntry);
if (newEntry != previousEntry) {
boolean animateIsolation = false;
@@ -298,7 +298,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
}
@Override
- public void onHeadsUpUnPinned(NotificationData.Entry entry) {
+ public void onHeadsUpUnPinned(NotificationEntry entry) {
updateTopEntry();
updateHeader(entry);
}
@@ -338,7 +338,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
});
}
- public void updateHeader(NotificationData.Entry entry) {
+ public void updateHeader(NotificationEntry entry) {
ExpandableNotificationRow row = entry.getRow();
float headerVisibleAmount = 1.0f;
if (row.isPinned() || row.isHeadsUpAnimatingAway() || row == mTrackedChild) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index f4cfd4197637..7f75223407de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -41,8 +41,8 @@ import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -58,7 +58,7 @@ import java.util.Stack;
*/
public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
ViewTreeObserver.OnComputeInternalInsetsListener, VisualStabilityManager.Callback,
- OnHeadsUpChangedListener, ConfigurationController.ConfigurationListener {
+ OnHeadsUpChangedListener, ConfigurationController.ConfigurationListener, StateListener {
private static final String TAG = "HeadsUpManagerPhone";
private final View mStatusBarWindowView;
@@ -72,8 +72,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private int mDisplayCutoutTouchableRegionSize;
private boolean mTrackingHeadsUp;
private HashSet<String> mSwipedOutKeys = new HashSet<>();
- private HashSet<NotificationData.Entry> mEntriesToRemoveAfterExpand = new HashSet<>();
- private ArraySet<NotificationData.Entry> mEntriesToRemoveWhenReorderingAllowed
+ private HashSet<NotificationEntry> mEntriesToRemoveAfterExpand = new HashSet<>();
+ private ArraySet<NotificationEntry> mEntriesToRemoveWhenReorderingAllowed
= new ArraySet<>();
private boolean mIsExpanded;
private int[] mTmpTwoArray = new int[2];
@@ -83,7 +83,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private boolean mIsObserving;
private int mStatusBarState;
- private final StateListener mStateListener = this::setStatusBarState;
private AnimationStateHandler mAnimationStateHandler;
private BubbleController mBubbleController = Dependency.get(BubbleController.class);
@@ -129,7 +128,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
updateTouchableRegionListener();
}
});
- Dependency.get(StatusBarStateController.class).addCallback(mStateListener);
+ Dependency.get(StatusBarStateController.class).addCallback(this);
mBubbleController.setBubbleStateChangeListener((hasBubbles) -> {
if (!hasBubbles) {
mBubbleGoingAway = true;
@@ -143,7 +142,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
public void destroy() {
- Dependency.get(StatusBarStateController.class).removeCallback(mStateListener);
+ Dependency.get(StatusBarStateController.class).removeCallback(this);
}
private void initResources() {
@@ -187,7 +186,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
releaseAllImmediately();
mReleaseOnExpandFinish = false;
} else {
- for (NotificationData.Entry entry : mEntriesToRemoveAfterExpand) {
+ for (NotificationEntry entry : mEntriesToRemoveAfterExpand) {
if (isAlerting(entry.key)) {
// Maybe the heads-up was removed already
removeAlertEntry(entry.key);
@@ -225,11 +224,9 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
}
- /**
- * Set the current state of the statusbar.
- */
- private void setStatusBarState(int statusBarState) {
- mStatusBarState = statusBarState;
+ @Override
+ public void onStateChanged(int newState) {
+ mStatusBarState = newState;
}
/**
@@ -252,7 +249,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
* @param remoteInputActive True to notify active, False to notify inactive.
*/
public void setRemoteInputActive(
- @NonNull NotificationData.Entry entry, boolean remoteInputActive) {
+ @NonNull NotificationEntry entry, boolean remoteInputActive) {
HeadsUpEntryPhone headsUpEntry = getHeadsUpEntryPhone(entry.key);
if (headsUpEntry != null && headsUpEntry.remoteInputActive != remoteInputActive) {
headsUpEntry.remoteInputActive = remoteInputActive;
@@ -268,7 +265,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
* Sets whether an entry's menu row is exposed and therefore it should stick in the heads up
* area if it's pinned until it's hidden again.
*/
- public void setMenuShown(@NonNull NotificationData.Entry entry, boolean menuShown) {
+ public void setMenuShown(@NonNull NotificationEntry entry, boolean menuShown) {
HeadsUpEntry headsUpEntry = getHeadsUpEntry(entry.key);
if (headsUpEntry instanceof HeadsUpEntryPhone && entry.isRowPinned()) {
((HeadsUpEntryPhone) headsUpEntry).setMenuShownPinned(menuShown);
@@ -315,9 +312,9 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
return;
}
if (hasPinnedHeadsUp()) {
- NotificationData.Entry topEntry = getTopEntry();
+ NotificationEntry topEntry = getTopEntry();
if (topEntry.isChildInGroup()) {
- final NotificationData.Entry groupSummary
+ final NotificationEntry groupSummary
= mGroupManager.getGroupSummary(topEntry.notification);
if (groupSummary != null) {
topEntry = groupSummary;
@@ -374,7 +371,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
@Override
public void onReorderingAllowed() {
mAnimationStateHandler.setHeadsUpGoingAwayAnimationsAllowed(false);
- for (NotificationData.Entry entry : mEntriesToRemoveWhenReorderingAllowed) {
+ for (NotificationEntry entry : mEntriesToRemoveWhenReorderingAllowed) {
if (isAlerting(entry.key)) {
// Maybe the heads-up was removed already
removeAlertEntry(entry.key);
@@ -399,7 +396,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
@Override
- protected boolean shouldHeadsUpBecomePinned(NotificationData.Entry entry) {
+ protected boolean shouldHeadsUpBecomePinned(NotificationEntry entry) {
return mStatusBarState != StatusBarState.KEYGUARD && !mIsExpanded
|| super.shouldHeadsUpBecomePinned(entry);
}
@@ -488,7 +485,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
return super.isSticky() || mMenuShownPinned;
}
- public void setEntry(@NonNull final NotificationData.Entry entry) {
+ public void setEntry(@NonNull final NotificationEntry entry) {
Runnable removeHeadsUpRunnable = () -> {
if (!mVisualStabilityManager.isReorderingAllowed()) {
mEntriesToRemoveWhenReorderingAllowed.add(entry);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
index 9c1c71a2dec8..dd200da56d20 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
@@ -21,7 +21,7 @@ import android.view.MotionEvent;
import android.view.ViewConfiguration;
import com.android.systemui.Gefingerpoken;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -83,7 +83,7 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
} else if (child == null && !mCallback.isExpanded()) {
// We might touch above the visible heads up child, but then we still would
// like to capture it.
- NotificationData.Entry topEntry = mHeadsUpManager.getTopEntry();
+ NotificationEntry topEntry = mHeadsUpManager.getTopEntry();
if (topEntry != null && topEntry.isRowPinned()) {
mPickedChild = topEntry.getRow();
mTouchingHeadsUpView = true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index a81b7e572a79..c68fdd4ec4a7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -91,11 +91,6 @@ public class KeyguardClockPositionAlgorithm {
private int mBurnInPreventionOffsetY;
/**
- * Clock vertical padding when pulsing.
- */
- private int mPulsingPadding;
-
- /**
* Doze/AOD transition amount.
*/
private float mDarkAmount;
@@ -105,10 +100,6 @@ public class KeyguardClockPositionAlgorithm {
*/
private boolean mCurrentlySecure;
- /**
- * Dozing and receiving a notification (AOD notification.)
- */
- private boolean mPulsing;
private float mEmptyDragAmount;
/**
@@ -123,13 +114,11 @@ public class KeyguardClockPositionAlgorithm {
R.dimen.burn_in_prevention_offset_x);
mBurnInPreventionOffsetY = res.getDimensionPixelSize(
R.dimen.burn_in_prevention_offset_y);
- mPulsingPadding = res.getDimensionPixelSize(
- R.dimen.widget_pulsing_bottom_padding);
}
public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
float panelExpansion, int parentHeight, int keyguardStatusHeight, float dark,
- boolean secure, boolean pulsing, float emptyDragAmount) {
+ boolean secure, float emptyDragAmount) {
mMinTopMargin = minTopMargin + mContainerTopPadding;
mMaxShadeBottom = maxShadeBottom;
mNotificationStackHeight = notificationStackHeight;
@@ -138,7 +127,6 @@ public class KeyguardClockPositionAlgorithm {
mKeyguardStatusHeight = keyguardStatusHeight;
mDarkAmount = dark;
mCurrentlySecure = secure;
- mPulsing = pulsing;
mEmptyDragAmount = emptyDragAmount;
}
@@ -146,7 +134,7 @@ public class KeyguardClockPositionAlgorithm {
final int y = getClockY();
result.clockY = y;
result.clockAlpha = getClockAlpha(y);
- result.stackScrollerPadding = y + (mPulsing ? mPulsingPadding : mKeyguardStatusHeight);
+ result.stackScrollerPadding = y + mKeyguardStatusHeight;
result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount);
}
@@ -185,9 +173,6 @@ public class KeyguardClockPositionAlgorithm {
private int getClockY() {
// Dark: Align the bottom edge of the clock at about half of the screen:
float clockYDark = getMaxClockY() + burnInPreventionOffsetY();
- if (mPulsing) {
- clockYDark -= mPulsingPadding;
- }
clockYDark = MathUtils.max(0, clockYDark);
float clockYRegular = getExpandedClockPosition();
@@ -230,11 +215,6 @@ public class KeyguardClockPositionAlgorithm {
- mBurnInPreventionOffsetX;
}
- @VisibleForTesting
- void setPulsingPadding(int padding) {
- mPulsingPadding = padding;
- }
-
public static class Result {
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
index 927228eae20e..925a19d6f5eb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
@@ -22,7 +22,7 @@ import android.util.Log;
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
-import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
public class KeyguardEnvironmentImpl implements KeyguardEnvironment {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationAssistantAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationAssistantAction.java
new file mode 100644
index 000000000000..323e7761b475
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationAssistantAction.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 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;
+
+import android.annotation.NonNull;
+import android.os.Bundle;
+import android.view.MotionEvent;
+
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.recents.OverviewProxyService;
+
+/**
+ * Assistant is triggered with this action
+ */
+public class NavigationAssistantAction extends NavigationGestureAction {
+ private static final String TAG = "NavigationAssistantActions";
+
+ private final AssistManager mAssistManager;
+
+ public NavigationAssistantAction(@NonNull NavigationBarView navigationBarView,
+ @NonNull OverviewProxyService service, AssistManager assistManager) {
+ super(navigationBarView, service);
+ mAssistManager = assistManager;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean disableProxyEvents() {
+ return true;
+ }
+
+ @Override
+ public void onGestureStart(MotionEvent event) {
+ mAssistManager.startAssist(new Bundle());
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBackAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBackAction.java
index 9c8b1b1e5227..7a42b03947ae 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBackAction.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBackAction.java
@@ -67,7 +67,7 @@ public class NavigationBackAction extends NavigationGestureAction {
@Override
public boolean isEnabled() {
- return !getGlobalBoolean(NavigationPrototypeController.NAVBAR_EXPERIMENTS_DISABLED);
+ return true;
}
@Override
@@ -95,6 +95,11 @@ public class NavigationBackAction extends NavigationGestureAction {
}
}
+ @Override
+ public boolean disableProxyEvents() {
+ return true;
+ }
+
private void performBack() {
sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
sendEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
@@ -102,8 +107,7 @@ public class NavigationBackAction extends NavigationGestureAction {
}
private boolean shouldExecuteBackOnUp() {
- return !getGlobalBoolean(NavigationPrototypeController.NAVBAR_EXPERIMENTS_DISABLED)
- && getGlobalBoolean(BACK_AFTER_END_PROP);
+ return getGlobalBoolean(BACK_AFTER_END_PROP);
}
private void sendEvent(int action, int code) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 6d97d6724d40..d3c6a1d8ee74 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -269,7 +269,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
mIsOnDefaultDisplay = mDisplayId == Display.DEFAULT_DISPLAY;
}
- mNavigationBarView.setComponents(mStatusBar.getPanel());
+ mNavigationBarView.setComponents(mStatusBar.getPanel(), mAssistManager);
mNavigationBarView.setDisabledFlags(mDisabledFlags1);
mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
mNavigationBarView.setOnTouchListener(this::onNavigationTouch);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 2fc7b78c0ca3..8bf1c58df699 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -69,6 +69,7 @@ import com.android.systemui.DockedStackExistsListener;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.assist.AssistManager;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.phone.NavGesture;
import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper;
@@ -156,6 +157,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
private QuickStepAction mQuickStepAction;
private NavigationBackAction mBackAction;
private QuickSwitchAction mQuickSwitchAction;
+ private NavigationAssistantAction mAssistantAction;
/**
* Helper that is responsible for showing the right toast when a disallowed activity operation
@@ -366,8 +368,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
return mBarTransitions.getLightTransitionsController();
}
- public void setComponents(NotificationPanelView panel) {
+ public void setComponents(NotificationPanelView panel, AssistManager assistManager) {
mPanelView = panel;
+ if (mAssistantAction == null) {
+ mAssistantAction = new NavigationAssistantAction(this, mOverviewProxyService,
+ assistManager);
+ }
if (mGestureHelper instanceof QuickStepController) {
((QuickStepController) mGestureHelper).setComponents(this);
updateNavigationGestures();
@@ -398,6 +404,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
return mBackAction;
case NavigationPrototypeController.ACTION_QUICKSWITCH:
return mQuickSwitchAction;
+ case NavigationPrototypeController.ACTION_ASSISTANT:
+ return mAssistantAction;
+ case NavigationPrototypeController.ACTION_NOTHING:
+ return null;
default:
return defaultAction;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
index 8c57fc31c3b4..a5d938216f5c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
@@ -24,6 +24,7 @@ import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_
import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Canvas;
+import android.provider.Settings;
import android.view.MotionEvent;
import com.android.systemui.recents.OverviewProxyService;
@@ -32,6 +33,9 @@ import com.android.systemui.recents.OverviewProxyService;
* A gesture action that would be triggered and reassigned by {@link QuickStepController}
*/
public abstract class NavigationGestureAction {
+ private static final String ENABLE_TASK_STABILIZER_FLAG = "ENABLE_TASK_STABILIZER";
+
+ static private boolean sLastTaskStabilizationFlag;
protected final NavigationBarView mNavigationBarView;
protected final OverviewProxyService mProxySender;
@@ -45,6 +49,9 @@ public abstract class NavigationGestureAction {
@NonNull OverviewProxyService service) {
mNavigationBarView = navigationBarView;
mProxySender = service;
+ sLastTaskStabilizationFlag = Settings.Global.getInt(
+ mNavigationBarView.getContext().getContentResolver(),
+ ENABLE_TASK_STABILIZER_FLAG, 0) != 0;
}
/**
@@ -74,6 +81,15 @@ public abstract class NavigationGestureAction {
*/
public void startGesture(MotionEvent event) {
mIsActive = true;
+
+ // Tell launcher that this action requires a stable task list or not
+ boolean flag = requiresStableTaskList();
+ if (flag != sLastTaskStabilizationFlag) {
+ Settings.Global.putInt(mNavigationBarView.getContext().getContentResolver(),
+ ENABLE_TASK_STABILIZER_FLAG, flag ? 1 : 0);
+ sLastTaskStabilizationFlag = flag;
+ }
+
onGestureStart(event);
}
@@ -146,6 +162,13 @@ public abstract class NavigationGestureAction {
*/
public abstract boolean isEnabled();
+ /**
+ * @return action requires a stable task list from launcher
+ */
+ protected boolean requiresStableTaskList() {
+ return false;
+ }
+
protected void onDarkIntensityChange(float intensity) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
index fb6254b0e4be..a09e5858d576 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
@@ -22,7 +22,6 @@ import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -36,18 +35,20 @@ public class NavigationPrototypeController extends ContentObserver {
private static final String HIDE_BACK_BUTTON_SETTING = "quickstepcontroller_hideback";
private static final String HIDE_HOME_BUTTON_SETTING = "quickstepcontroller_hidehome";
- static final String NAVBAR_EXPERIMENTS_DISABLED = "navbarexperiments_disabled";
private final String GESTURE_MATCH_SETTING = "quickstepcontroller_gesture_match_map";
public static final String NAV_COLOR_ADAPT_ENABLE_SETTING = "navbar_color_adapt_enable";
@Retention(RetentionPolicy.SOURCE)
- @IntDef({ACTION_DEFAULT, ACTION_QUICKSTEP, ACTION_QUICKSCRUB, ACTION_BACK})
+ @IntDef({ACTION_DEFAULT, ACTION_QUICKSTEP, ACTION_QUICKSCRUB, ACTION_BACK,
+ ACTION_QUICKSWITCH, ACTION_NOTHING, ACTION_ASSISTANT})
@interface GestureAction {}
static final int ACTION_DEFAULT = 0;
static final int ACTION_QUICKSTEP = 1;
static final int ACTION_QUICKSCRUB = 2;
static final int ACTION_BACK = 3;
static final int ACTION_QUICKSWITCH = 4;
+ static final int ACTION_NOTHING = 5;
+ static final int ACTION_ASSISTANT = 6;
private OnPrototypeChangedListener mListener;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
index 3839ed5d5d88..d364356b19fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
@@ -31,9 +31,9 @@ import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListen
import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater.AsyncInflationTask;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import com.android.systemui.statusbar.phone.NotificationGroupManager.NotificationGroup;
@@ -108,7 +108,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* @param entry notification to check
* @return true if the entry was transferred to and should inflate + alert
*/
- public boolean isAlertTransferPending(@NonNull Entry entry) {
+ public boolean isAlertTransferPending(@NonNull NotificationEntry entry) {
PendingAlertInfo alertInfo = mPendingAlerts.get(entry.key);
return alertInfo != null && alertInfo.isStillValid();
}
@@ -172,16 +172,16 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
};
@Override
- public void onAmbientStateChanged(Entry entry, boolean isAmbient) {
+ public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) {
onAlertStateChanged(entry, isAmbient, mAmbientPulseManager);
}
@Override
- public void onHeadsUpStateChanged(Entry entry, boolean isHeadsUp) {
+ public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
onAlertStateChanged(entry, isHeadsUp, mHeadsUpManager);
}
- private void onAlertStateChanged(Entry entry, boolean isAlerting,
+ private void onAlertStateChanged(NotificationEntry entry, boolean isAlerting,
AlertingNotificationManager alertManager) {
if (isAlerting && mGroupManager.isSummaryOfSuppressedGroup(entry.notification)) {
handleSuppressedSummaryAlerted(entry, alertManager);
@@ -193,7 +193,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
// Called when a new notification has been posted but is not inflated yet. We use this to
// see as early as we can if we need to abort a transfer.
@Override
- public void onPendingEntryAdded(Entry entry) {
+ public void onPendingEntryAdded(NotificationEntry entry) {
String groupKey = mGroupManager.getGroupKey(entry.notification);
GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(groupKey);
if (groupAlertEntry != null) {
@@ -204,7 +204,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
// Called when the entry's reinflation has finished. If there is an alert pending, we
// then show the alert.
@Override
- public void onEntryReinflated(Entry entry) {
+ public void onEntryReinflated(NotificationEntry entry) {
PendingAlertInfo alertInfo = mPendingAlerts.remove(entry.key);
if (alertInfo != null) {
if (alertInfo.isStillValid()) {
@@ -219,16 +219,13 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
@Override
public void onEntryRemoved(
- @Nullable Entry entry,
- String key,
- StatusBarNotification old,
+ @Nullable NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
// Removes any alerts pending on this entry. Note that this will not stop any inflation
// tasks started by a transfer, so this should only be used as clean-up for when
// inflation is stopped and the pending alert no longer needs to happen.
- mPendingAlerts.remove(key);
+ mPendingAlerts.remove(entry.key);
}
};
@@ -244,8 +241,8 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
return 0;
}
int number = 0;
- Iterable<Entry> values = mEntryManager.getPendingNotificationsIterator();
- for (Entry entry : values) {
+ Iterable<NotificationEntry> values = mEntryManager.getPendingNotificationsIterator();
+ for (NotificationEntry entry : values) {
if (isPendingNotificationInGroup(entry, group) && onlySummaryAlerts(entry)) {
number++;
}
@@ -263,8 +260,8 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
if (mEntryManager == null) {
return false;
}
- Iterable<Entry> values = mEntryManager.getPendingNotificationsIterator();
- for (Entry entry : values) {
+ Iterable<NotificationEntry> values = mEntryManager.getPendingNotificationsIterator();
+ for (NotificationEntry entry : values) {
if (isPendingNotificationInGroup(entry, group)) {
return true;
}
@@ -279,7 +276,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* @param group group to check
* @return true if the notification will add to the group, false o/w
*/
- private boolean isPendingNotificationInGroup(@NonNull Entry entry,
+ private boolean isPendingNotificationInGroup(@NonNull NotificationEntry entry,
@NonNull NotificationGroup group) {
String groupKey = mGroupManager.getGroupKey(group.summary.notification);
return mGroupManager.isGroupChild(entry.notification)
@@ -296,7 +293,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* @param summary the summary that is suppressed and alerting
* @param alertManager the alert manager that manages the alerting summary
*/
- private void handleSuppressedSummaryAlerted(@NonNull Entry summary,
+ private void handleSuppressedSummaryAlerted(@NonNull NotificationEntry summary,
@NonNull AlertingNotificationManager alertManager) {
StatusBarNotification sbn = summary.notification;
GroupAlertEntry groupAlertEntry =
@@ -312,7 +309,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
return;
}
- Entry child = mGroupManager.getLogicalChildren(summary.notification).iterator().next();
+ NotificationEntry child = mGroupManager.getLogicalChildren(summary.notification).iterator().next();
if (child != null) {
if (child.getRow().keepInParent()
|| child.isRowRemoved()
@@ -336,7 +333,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* @param toEntry entry to transfer to
* @param alertManager alert manager for the alert type
*/
- private void transferAlertState(@NonNull Entry fromEntry, @NonNull Entry toEntry,
+ private void transferAlertState(@NonNull NotificationEntry fromEntry, @NonNull NotificationEntry toEntry,
@NonNull AlertingNotificationManager alertManager) {
alertManager.removeNotification(fromEntry.key, true /* releaseImmediately */);
alertNotificationWhenPossible(toEntry, alertManager);
@@ -356,13 +353,13 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
private void checkShouldTransferBack(@NonNull GroupAlertEntry groupAlertEntry) {
if (SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime
< ALERT_TRANSFER_TIMEOUT) {
- Entry summary = groupAlertEntry.mGroup.summary;
+ NotificationEntry summary = groupAlertEntry.mGroup.summary;
AlertingNotificationManager alertManager = getActiveAlertManager();
if (!onlySummaryAlerts(summary)) {
return;
}
- ArrayList<Entry> children = mGroupManager.getLogicalChildren(summary.notification);
+ ArrayList<NotificationEntry> children = mGroupManager.getLogicalChildren(summary.notification);
int numChildren = children.size();
int numPendingChildren = getPendingChildrenNotAlerting(groupAlertEntry.mGroup);
numChildren += numPendingChildren;
@@ -371,7 +368,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
boolean releasedChild = false;
for (int i = 0; i < children.size(); i++) {
- Entry entry = children.get(i);
+ NotificationEntry entry = children.get(i);
if (onlySummaryAlerts(entry) && alertManager.isAlerting(entry.key)) {
releasedChild = true;
alertManager.removeNotification(entry.key, true /* releaseImmediately */);
@@ -402,7 +399,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* @param entry entry to show
* @param alertManager alert manager for the alert type
*/
- private void alertNotificationWhenPossible(@NonNull Entry entry,
+ private void alertNotificationWhenPossible(@NonNull NotificationEntry entry,
@NonNull AlertingNotificationManager alertManager) {
@InflationFlag int contentFlag = alertManager.getContentFlag();
if (!entry.getRow().isInflationFlagSet(contentFlag)) {
@@ -422,7 +419,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
return mIsDozing ? mAmbientPulseManager : mHeadsUpManager;
}
- private boolean onlySummaryAlerts(Entry entry) {
+ private boolean onlySummaryAlerts(NotificationEntry entry) {
return entry.notification.getNotification().getGroupAlertBehavior()
== Notification.GROUP_ALERT_SUMMARY;
}
@@ -442,7 +439,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* the transfer is still valid if the notification is updated.
*/
final StatusBarNotification mOriginalNotification;
- final Entry mEntry;
+ final NotificationEntry mEntry;
/**
* The notification is still pending inflation but we've decided that we no longer need
@@ -453,7 +450,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
*/
boolean mAbortOnInflation;
- PendingAlertInfo(Entry entry, AlertingNotificationManager alertManager) {
+ PendingAlertInfo(NotificationEntry entry, AlertingNotificationManager alertManager) {
mOriginalNotification = entry.notification;
mEntry = entry;
mAlertManager = alertManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
index 3c1c0765a3b8..bb9e4183ba76 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
@@ -27,7 +27,7 @@ import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListen
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -97,7 +97,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
}
- public void onEntryRemoved(NotificationData.Entry removed) {
+ public void onEntryRemoved(NotificationEntry removed) {
onEntryRemovedInternal(removed, removed.notification);
mIsolatedEntries.remove(removed.key);
}
@@ -109,7 +109,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
* @param sbn the notification the entry has, which doesn't need to be the same as it's internal
* notification
*/
- private void onEntryRemovedInternal(NotificationData.Entry removed,
+ private void onEntryRemovedInternal(NotificationEntry removed,
final StatusBarNotification sbn) {
String groupKey = getGroupKey(sbn);
final NotificationGroup group = mGroupMap.get(groupKey);
@@ -136,7 +136,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
}
- public void onEntryAdded(final NotificationData.Entry added) {
+ public void onEntryAdded(final NotificationEntry added) {
if (added.isRowRemoved()) {
added.setDebugThrowable(new Throwable());
}
@@ -152,7 +152,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
}
if (isGroupChild) {
- NotificationData.Entry existing = group.children.get(added.key);
+ NotificationEntry existing = group.children.get(added.key);
if (existing != null && existing != added) {
Throwable existingThrowable = existing.getDebugThrowable();
Log.wtf(TAG, "Inconsistent entries found with the same key " + added.key
@@ -169,9 +169,9 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
group.expanded = added.areChildrenExpanded();
updateSuppression(group);
if (!group.children.isEmpty()) {
- ArrayList<NotificationData.Entry> childrenCopy
+ ArrayList<NotificationEntry> childrenCopy
= new ArrayList<>(group.children.values());
- for (NotificationData.Entry child : childrenCopy) {
+ for (NotificationEntry child : childrenCopy) {
onEntryBecomingChild(child);
}
for (OnGroupChangeListener listener : mListeners) {
@@ -181,7 +181,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
}
- private void onEntryBecomingChild(NotificationData.Entry entry) {
+ private void onEntryBecomingChild(NotificationEntry entry) {
if (shouldIsolate(entry)) {
isolateNotification(entry);
}
@@ -221,7 +221,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
return count;
}
- private NotificationData.Entry getIsolatedChild(String groupKey) {
+ private NotificationEntry getIsolatedChild(String groupKey) {
for (StatusBarNotification sbn : mIsolatedEntries.values()) {
if (sbn.getGroupKey().equals(groupKey) && isIsolated(sbn)) {
return mGroupMap.get(sbn.getKey()).summary;
@@ -230,7 +230,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
return null;
}
- public void onEntryUpdated(NotificationData.Entry entry,
+ public void onEntryUpdated(NotificationEntry entry,
StatusBarNotification oldNotification) {
String oldKey = oldNotification.getGroupKey();
String newKey = entry.notification.getGroupKey();
@@ -267,7 +267,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
if (!isOnlyChild(sbn)) {
return false;
}
- NotificationData.Entry logicalGroupSummary = getLogicalGroupSummary(sbn);
+ NotificationEntry logicalGroupSummary = getLogicalGroupSummary(sbn);
return logicalGroupSummary != null
&& !logicalGroupSummary.notification.equals(sbn);
}
@@ -343,7 +343,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
* Get the summary of a specified status bar notification. For isolated notification this return
* itself.
*/
- public NotificationData.Entry getGroupSummary(StatusBarNotification sbn) {
+ public NotificationEntry getGroupSummary(StatusBarNotification sbn) {
return getGroupSummary(getGroupKey(sbn));
}
@@ -352,12 +352,12 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
* but the logical summary, i.e when a child is isolated, it still returns the summary as if
* it wasn't isolated.
*/
- public NotificationData.Entry getLogicalGroupSummary(StatusBarNotification sbn) {
+ public NotificationEntry getLogicalGroupSummary(StatusBarNotification sbn) {
return getGroupSummary(sbn.getGroupKey());
}
@Nullable
- private NotificationData.Entry getGroupSummary(String groupKey) {
+ private NotificationEntry getGroupSummary(String groupKey) {
NotificationGroup group = mGroupMap.get(groupKey);
//TODO: see if this can become an Entry
return group == null ? null
@@ -371,13 +371,13 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
* @param summary summary of a group
* @return list of the children
*/
- public ArrayList<NotificationData.Entry> getLogicalChildren(StatusBarNotification summary) {
+ public ArrayList<NotificationEntry> getLogicalChildren(StatusBarNotification summary) {
NotificationGroup group = mGroupMap.get(summary.getGroupKey());
if (group == null) {
return null;
}
- ArrayList<NotificationData.Entry> children = new ArrayList<>(group.children.values());
- NotificationData.Entry isolatedChild = getIsolatedChild(summary.getGroupKey());
+ ArrayList<NotificationEntry> children = new ArrayList<>(group.children.values());
+ NotificationEntry isolatedChild = getIsolatedChild(summary.getGroupKey());
if (isolatedChild != null) {
children.add(isolatedChild);
}
@@ -443,24 +443,24 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
@Override
- public void onHeadsUpPinned(NotificationData.Entry entry) {
+ public void onHeadsUpPinned(NotificationEntry entry) {
}
@Override
- public void onHeadsUpUnPinned(NotificationData.Entry entry) {
+ public void onHeadsUpUnPinned(NotificationEntry entry) {
}
@Override
- public void onAmbientStateChanged(NotificationData.Entry entry, boolean isAmbient) {
+ public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) {
onAlertStateChanged(entry, isAmbient);
}
@Override
- public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
+ public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
onAlertStateChanged(entry, isHeadsUp);
}
- private void onAlertStateChanged(NotificationData.Entry entry, boolean isAlerting) {
+ private void onAlertStateChanged(NotificationEntry entry, boolean isAlerting) {
if (isAlerting) {
if (shouldIsolate(entry)) {
isolateNotification(entry);
@@ -479,7 +479,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
* @return true if the entry should be isolated
*/
- private boolean shouldIsolate(NotificationData.Entry entry) {
+ private boolean shouldIsolate(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
NotificationGroup notificationGroup = mGroupMap.get(sbn.getGroupKey());
if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) {
@@ -499,7 +499,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
*
* @param entry the notification to isolate
*/
- private void isolateNotification(NotificationData.Entry entry) {
+ private void isolateNotification(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
// We will be isolated now, so lets update the groups
@@ -523,7 +523,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
*
* @param entry the notification to un-isolate
*/
- private void stopIsolatingNotification(NotificationData.Entry entry) {
+ private void stopIsolatingNotification(NotificationEntry entry) {
StatusBarNotification sbn = entry.notification;
if (mIsolatedEntries.containsKey(sbn.getKey())) {
// not isolated anymore, we need to update the groups
@@ -564,8 +564,8 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
}
public static class NotificationGroup {
- public final HashMap<String, NotificationData.Entry> children = new HashMap<>();
- public NotificationData.Entry summary;
+ public final HashMap<String, NotificationEntry> children = new HashMap<>();
+ public NotificationEntry summary;
public boolean expanded;
/**
* Is this notification group suppressed, i.e its summary is hidden
@@ -580,7 +580,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener,
? Log.getStackTraceString(summary.getDebugThrowable())
: "");
result += "\n children size: " + children.size();
- for (NotificationData.Entry child : children.values()) {
+ for (NotificationEntry child : children.values()) {
result += "\n " + child.notification
+ (child.getDebugThrowable() != null
? Log.getStackTraceString(child.getDebugThrowable())
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 056c8a7f5f5e..077fcda70f0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -23,9 +23,10 @@ import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.tuner.TunerService;
@@ -36,13 +37,15 @@ import java.util.function.Function;
* A controller for the space in the status bar to the left of the system icons. This area is
* normally reserved for notifications.
*/
-public class NotificationIconAreaController implements DarkReceiver {
+public class NotificationIconAreaController implements DarkReceiver,
+ StatusBarStateController.StateListener {
public static final String LOW_PRIORITY = "low_priority";
private final ContrastColorUtil mContrastColorUtil;
private final NotificationEntryManager mEntryManager;
private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
+ private final StatusBarStateController mStatusBarStateController;
private final TunerService.Tunable mTunable = new TunerService.Tunable() {
@Override
public void onTuningChanged(String key, String newValue) {
@@ -86,11 +89,14 @@ public class NotificationIconAreaController implements DarkReceiver {
private final ViewClippingUtil.ClippingParameters mClippingParameters =
view -> view instanceof StatusBarWindowView;
- public NotificationIconAreaController(Context context, StatusBar statusBar) {
+ public NotificationIconAreaController(Context context, StatusBar statusBar,
+ StatusBarStateController statusBarStateController) {
mStatusBar = statusBar;
mContrastColorUtil = ContrastColorUtil.getInstance(context);
mContext = context;
mEntryManager = Dependency.get(NotificationEntryManager.class);
+ mStatusBarStateController = statusBarStateController;
+ mStatusBarStateController.addCallback(this);
Dependency.get(TunerService.class).addTunable(mTunable, LOW_PRIORITY);
@@ -182,7 +188,7 @@ public class NotificationIconAreaController implements DarkReceiver {
return mStatusBar.getStatusBarHeight();
}
- protected boolean shouldShowNotificationIcon(NotificationData.Entry entry,
+ protected boolean shouldShowNotificationIcon(NotificationEntry entry,
boolean showAmbient, boolean showLowPriority, boolean hideDismissed,
boolean hideRepliedMessages) {
if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) {
@@ -247,7 +253,7 @@ public class NotificationIconAreaController implements DarkReceiver {
* @param hideDismissed should dismissed icons be hidden
* @param hideRepliedMessages should messages that have been replied to be hidden
*/
- private void updateIconsForLayout(Function<NotificationData.Entry, StatusBarIconView> function,
+ private void updateIconsForLayout(Function<NotificationEntry, StatusBarIconView> function,
NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority,
boolean hideDismissed, boolean hideRepliedMessages) {
ArrayList<StatusBarIconView> toShow = new ArrayList<>(
@@ -257,7 +263,7 @@ public class NotificationIconAreaController implements DarkReceiver {
for (int i = 0; i < mNotificationScrollLayout.getChildCount(); i++) {
View view = mNotificationScrollLayout.getChildAt(i);
if (view instanceof ExpandableNotificationRow) {
- NotificationData.Entry ent = ((ExpandableNotificationRow) view).getEntry();
+ NotificationEntry ent = ((ExpandableNotificationRow) view).getEntry();
if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed,
hideRepliedMessages)) {
toShow.add(function.apply(ent));
@@ -373,24 +379,6 @@ public class NotificationIconAreaController implements DarkReceiver {
v.setDecorColor(mIconTint);
}
- /**
- * Dark amount, from 0 to 1, representing being awake or in AOD.
- */
- public void setDarkAmount(float darkAmount) {
- mDarkAmount = darkAmount;
- if (darkAmount == 0 || darkAmount == 1) {
- ViewClippingUtil.setClippingDeactivated(mNotificationIcons, darkAmount != 0,
- mClippingParameters);
- }
- dozeTimeTick();
-
- boolean fullyDark = darkAmount == 1f;
- if (mFullyDark != fullyDark) {
- mFullyDark = fullyDark;
- updateShelfIcons();
- }
- }
-
public void setDark(boolean dark) {
mNotificationIcons.setDark(dark, false, 0);
mShelfIcons.setDark(dark, false, 0);
@@ -408,10 +396,45 @@ public class NotificationIconAreaController implements DarkReceiver {
* Moves icons whenever the device wakes up in AOD, to avoid burn in.
*/
public void dozeTimeTick() {
+ if (mNotificationIcons.getVisibility() != View.VISIBLE) {
+ return;
+ }
+
+ if (mDarkAmount == 0 && !mStatusBarStateController.isDozing()) {
+ mNotificationIcons.setTranslationX(0);
+ mNotificationIcons.setTranslationY(0);
+ return;
+ }
+
int yOffset = (mKeyguardStatusBarHeight - getHeight()) / 2;
int translationX = getBurnInOffset(mBurnInOffset, true /* xAxis */);
int translationY = getBurnInOffset(mBurnInOffset, false /* xAxis */) + yOffset;
- mNotificationIcons.setTranslationX(translationX * mDarkAmount);
- mNotificationIcons.setTranslationY(translationY * mDarkAmount);
+ mNotificationIcons.setTranslationX(translationX);
+ mNotificationIcons.setTranslationY(translationY);
+ }
+
+ @Override
+ public void onDozingChanged(boolean isDozing) {
+ dozeTimeTick();
+ }
+
+ @Override
+ public void onDozeAmountChanged(float linear, float eased) {
+ boolean wasOrIsAwake = mDarkAmount == 0 || linear == 0;
+ boolean wasOrIsDozing = mDarkAmount == 1 || linear == 1;
+ mDarkAmount = linear;
+ if (wasOrIsAwake) {
+ ViewClippingUtil.setClippingDeactivated(mNotificationIcons, mDarkAmount != 0,
+ mClippingParameters);
+ }
+ if (wasOrIsAwake || wasOrIsDozing) {
+ dozeTimeTick();
+ }
+
+ boolean fullyDark = mDarkAmount == 1f;
+ if (mFullyDark != fullyDark) {
+ mFullyDark = fullyDark;
+ updateShelfIcons();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 964b2210dd18..009afca5b034 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -128,6 +128,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
}
}.setDuration(CONTENT_FADE_DURATION);
+ private static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5;
public static final int MAX_STATIC_ICONS = 4;
private static final int MAX_DOTS = 1;
@@ -371,7 +372,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
float translationX = getActualPaddingStart();
int firstOverflowIndex = -1;
int childCount = getChildCount();
- int maxVisibleIcons = mIsStaticLayout ? MAX_STATIC_ICONS : childCount;
+ int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK :
+ mIsStaticLayout ? MAX_STATIC_ICONS : childCount;
float layoutEnd = getLayoutEnd();
float overflowStart = getMaxOverflowStart();
mVisualOverflowStart = 0;
@@ -387,6 +389,9 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
&& iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
boolean noOverflowAfter = i == childCount - 1;
+ float drawingScale = mDark && view instanceof StatusBarIconView
+ ? ((StatusBarIconView) view).getIconScaleFullyDark()
+ : 1f;
if (mOpenedAmount != 0.0f) {
noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow;
}
@@ -402,7 +407,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mVisualOverflowStart = Math.min(translationX, mVisualOverflowStart);
}
}
- translationX += iconState.iconAppearAmount * view.getWidth();
+ translationX += iconState.iconAppearAmount * view.getWidth() * drawingScale;
}
mNumDots = 0;
if (firstOverflowIndex != -1) {
@@ -432,6 +437,32 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mFirstVisibleIconState = mIconStates.get(getChildAt(0));
}
+ boolean center = mDark;
+ if (center && translationX < getLayoutEnd()) {
+ float initialTranslation =
+ mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation;
+
+ float contentWidth = 0;
+ if (mLastVisibleIconState != null) {
+ contentWidth = mLastVisibleIconState.xTranslation + mIconSize;
+ contentWidth = Math.min(getWidth(), contentWidth) - initialTranslation;
+ }
+ float availableSpace = getLayoutEnd() - getActualPaddingStart();
+ float delta = (availableSpace - contentWidth) / 2;
+
+ if (firstOverflowIndex != -1) {
+ // If we have an overflow, only count those half for centering because the dots
+ // don't have a lot of visual weight.
+ float deltaIgnoringOverflow = (getLayoutEnd() - mVisualOverflowStart) / 2;
+ delta = (deltaIgnoringOverflow + delta) / 2;
+ }
+ for (int i = 0; i < childCount; i++) {
+ View view = getChildAt(i);
+ IconState iconState = mIconStates.get(view);
+ iconState.xTranslation += delta;
+ }
+ }
+
if (isLayoutRtl()) {
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 16576ad6e3e1..0d5ebb9b6578 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -50,6 +50,7 @@ import android.view.WindowInsets;
import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.keyguard.KeyguardClockSwitch;
@@ -76,9 +77,9 @@ import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.AnimatableProperty;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.PropertyAnimator;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -140,9 +141,11 @@ public class NotificationPanelView extends PanelView implements
private KeyguardAffordanceHelper mAffordanceHelper;
private KeyguardUserSwitcher mKeyguardUserSwitcher;
private KeyguardStatusBarView mKeyguardStatusBar;
+ private ViewGroup mBigClockContainer;
private QS mQs;
private FrameLayout mQsFrame;
- private KeyguardStatusView mKeyguardStatusView;
+ @VisibleForTesting
+ protected KeyguardStatusView mKeyguardStatusView;
private View mQsNavbarScrim;
protected NotificationsQuickSettingsContainer mNotificationContainerParent;
protected NotificationStackScrollLayout mNotificationStackScroller;
@@ -327,6 +330,13 @@ public class NotificationPanelView extends PanelView implements
mDisplayId = context.getDisplayId();
}
+ /**
+ * Returns if there's a custom clock being presented.
+ */
+ public boolean hasCustomClock() {
+ return mKeyguardStatusView.hasCustomClock();
+ }
+
private void setStatusBar(StatusBar bar) {
mStatusBar = bar;
mKeyguardBottomArea.setStatusBar(mStatusBar);
@@ -339,8 +349,8 @@ public class NotificationPanelView extends PanelView implements
mKeyguardStatusView = findViewById(R.id.keyguard_status_view);
KeyguardClockSwitch keyguardClockSwitch = findViewById(R.id.keyguard_clock_container);
- ViewGroup bigClockContainer = findViewById(R.id.big_clock_container);
- keyguardClockSwitch.setBigClockContainer(bigClockContainer);
+ mBigClockContainer = findViewById(R.id.big_clock_container);
+ keyguardClockSwitch.setBigClockContainer(mBigClockContainer);
mNotificationContainerParent = findViewById(R.id.notification_container_parent);
mNotificationStackScroller = findViewById(R.id.notification_stack_scroller);
@@ -569,18 +579,23 @@ public class NotificationPanelView extends PanelView implements
mKeyguardStatusView.getHeight(),
mInterpolatedDarkAmount,
mStatusBar.isKeyguardCurrentlySecure(),
- mPulsing,
mEmptyDragAmount);
mClockPositionAlgorithm.run(mClockPositionResult);
PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.X,
mClockPositionResult.clockX, CLOCK_ANIMATION_PROPERTIES, animateClock);
PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.Y,
mClockPositionResult.clockY, CLOCK_ANIMATION_PROPERTIES, animateClock);
+ // Move big clock up while pulling up the bouncer
+ PropertyAnimator.setProperty(mBigClockContainer, AnimatableProperty.Y,
+ MathUtils.lerp(-mBigClockContainer.getHeight(), 0,
+ Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(getExpandedFraction())),
+ CLOCK_ANIMATION_PROPERTIES, animateClock);
updateClock();
stackScrollerPadding = mClockPositionResult.stackScrollerPadding;
}
mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding);
- mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX);
+ int burnInXOffset = mPulsing ? 0 : mClockPositionResult.clockX;
+ mNotificationStackScroller.setAntiBurnInOffsetX(burnInXOffset);
mStackScrollerMeasuringPass++;
requestScrollerTopPaddingUpdate(animate);
@@ -956,7 +971,7 @@ public class NotificationPanelView extends PanelView implements
handled = true;
}
handled |= super.onTouchEvent(event);
- return mDozing ? handled : true;
+ return !mDozing || mPulsing || handled;
}
private boolean handleQsTouch(MotionEvent event) {
@@ -1233,7 +1248,7 @@ public class NotificationPanelView extends PanelView implements
updateDozingVisibilities(false /* animate */);
}
- resetVerticalPanelPosition();
+ resetHorizontalPanelPosition();
updateQsState();
}
@@ -2043,7 +2058,7 @@ public class NotificationPanelView extends PanelView implements
super.onConfigurationChanged(newConfig);
mAffordanceHelper.onConfigurationChanged();
if (newConfig.orientation != mLastOrientation) {
- resetVerticalPanelPosition();
+ resetHorizontalPanelPosition();
}
mLastOrientation = newConfig.orientation;
}
@@ -2489,12 +2504,12 @@ public class NotificationPanelView extends PanelView implements
}
@Override
- public void onHeadsUpPinned(NotificationData.Entry entry) {
+ public void onHeadsUpPinned(NotificationEntry entry) {
mNotificationStackScroller.generateHeadsUpAnimation(entry.getHeadsUpAnimationView(), true);
}
@Override
- public void onHeadsUpUnPinned(NotificationData.Entry entry) {
+ public void onHeadsUpUnPinned(NotificationEntry entry) {
// When we're unpinning the notification via active edge they remain heads-upped,
// we need to make sure that an animation happens in this case, otherwise the notification
@@ -2507,7 +2522,7 @@ public class NotificationPanelView extends PanelView implements
}
@Override
- public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
+ public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
mNotificationStackScroller.generateHeadsUpAnimation(entry, isHeadsUp);
}
@@ -2529,7 +2544,7 @@ public class NotificationPanelView extends PanelView implements
@Override
protected void onClosingFinished() {
super.onClosingFinished();
- resetVerticalPanelPosition();
+ resetHorizontalPanelPosition();
setClosingWithAlphaFadeout(false);
}
@@ -2546,7 +2561,7 @@ public class NotificationPanelView extends PanelView implements
*/
protected void updateVerticalPanelPosition(float x) {
if (mNotificationStackScroller.getWidth() * 1.75f > getWidth()) {
- resetVerticalPanelPosition();
+ resetHorizontalPanelPosition();
return;
}
float leftMost = mPositionMinSideMargin + mNotificationStackScroller.getWidth() / 2;
@@ -2556,16 +2571,17 @@ public class NotificationPanelView extends PanelView implements
x = getWidth() / 2;
}
x = Math.min(rightMost, Math.max(leftMost, x));
- setVerticalPanelTranslation(x -
- (mNotificationStackScroller.getLeft() + mNotificationStackScroller.getWidth() / 2));
+ float center =
+ mNotificationStackScroller.getLeft() + mNotificationStackScroller.getWidth() / 2;
+ setHorizontalPanelTranslation(x - center);
}
- private void resetVerticalPanelPosition() {
- setVerticalPanelTranslation(0f);
+ private void resetHorizontalPanelPosition() {
+ setHorizontalPanelTranslation(0f);
}
- protected void setVerticalPanelTranslation(float translation) {
- mNotificationStackScroller.setVerticalPanelTranslation(translation);
+ protected void setHorizontalPanelTranslation(float translation) {
+ mNotificationStackScroller.setHorizontalPanelTranslation(translation);
mQsFrame.setTranslationX(translation);
int size = mVerticalTranslationListener.size();
for (int i = 0; i < size; i++) {
@@ -2773,6 +2789,9 @@ public class NotificationPanelView extends PanelView implements
if (dozing == mDozing) return;
mDozing = dozing;
mNotificationStackScroller.setDark(mDozing, animate, wakeUpTouchLocation);
+ if (mDozing) {
+ mNotificationStackScroller.setShowDarkShelf(!hasCustomClock());
+ }
if (mBarState == StatusBarState.KEYGUARD
|| mBarState == StatusBarState.SHADE_LOCKED) {
@@ -2811,7 +2830,7 @@ public class NotificationPanelView extends PanelView implements
mAnimateNextPositionUpdate = false;
}
mNotificationStackScroller.setPulsing(pulsing, animatePulse);
- mKeyguardStatusView.setPulsing(pulsing, animatePulse);
+ mKeyguardStatusView.setPulsing(pulsing);
mKeyguardBottomArea.setPulsing(pulsing, animatePulse);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index b3996f5e092c..a697603c689b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -149,8 +149,8 @@ public abstract class PanelView extends FrameLayout {
private boolean mIgnoreXTouchSlop;
private boolean mExpandLatencyTracking;
protected final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
- protected final StatusBarStateController
- mStatusBarStateController = Dependency.get(StatusBarStateController.class);
+ protected final StatusBarStateController mStatusBarStateController =
+ Dependency.get(StatusBarStateController.class);
protected void onExpandingFinished() {
mBar.onExpandingFinished();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
index b18b79e0e6d6..1999f9a8e04d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
@@ -47,6 +47,10 @@ public class QuickStepAction extends NavigationGestureAction {
return mNavigationBarView.isQuickStepSwipeUpEnabled();
}
+ protected boolean requiresStableTaskList() {
+ return true;
+ }
+
@Override
public void onGestureStart(MotionEvent event) {
try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index 0cec6371d813..9e91ab70e3de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -34,13 +34,20 @@ import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
+import android.hardware.input.InputManager;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.provider.Settings;
import android.util.Log;
+import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
+
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -64,7 +71,10 @@ public class QuickStepController implements GestureHelper {
/** Experiment to swipe home button left to execute a back key press */
private static final String HIDE_BACK_BUTTON_PROP = "quickstepcontroller_hideback";
+ private static final String ENABLE_CLICK_THROUGH_NAV_PROP = "quickstepcontroller_clickthrough";
private static final long BACK_BUTTON_FADE_IN_ALPHA = 150;
+ private static final long CLICK_THROUGH_TAP_DELAY = 70;
+ private static final long CLICK_THROUGH_TAP_RESET_DELAY = 100;
/** When the home-swipe-back gesture is disallowed, make it harder to pull */
private static final float HORIZONTAL_GESTURE_DAMPING = 0.3f;
@@ -100,6 +110,9 @@ public class QuickStepController implements GestureHelper {
private float mMinDragLimit;
private float mDragDampeningFactor;
private float mEdgeSwipeThreshold;
+ private boolean mClickThroughPressed;
+ private float mClickThroughPressX;
+ private float mClickThroughPressY;
private NavigationGestureAction mCurrentAction;
private NavigationGestureAction[] mGestureActions = new NavigationGestureAction[MAX_GESTURES];
@@ -117,6 +130,19 @@ public class QuickStepController implements GestureHelper {
mOverviewEventSender = Dependency.get(OverviewProxyService.class);
}
+ private final Runnable mClickThroughSendTap = new Runnable() {
+ @Override
+ public void run() {
+ sendTap(mClickThroughPressX, mClickThroughPressY);
+ mNavigationBarView.postDelayed(mClickThroughResetTap, CLICK_THROUGH_TAP_RESET_DELAY);
+ }
+ };
+
+ private final Runnable mClickThroughResetTap = () -> {
+ setWindowTouchable(true);
+ mClickThroughPressed = false;
+ };
+
public void setComponents(NavigationBarView navigationBarView) {
mNavigationBarView = navigationBarView;
@@ -320,6 +346,25 @@ public class QuickStepController implements GestureHelper {
case MotionEvent.ACTION_UP:
if (mCurrentAction != null) {
mCurrentAction.endGesture();
+ } else if (action == MotionEvent.ACTION_UP
+ && getBoolGlobalSetting(mContext, ENABLE_CLICK_THROUGH_NAV_PROP)
+ && !mClickThroughPressed) {
+ // Enable click through functionality where no gesture has been detected and not
+ // passed the drag slop so inject a touch event at the same location
+ // after making the navigation bar window untouchable. After a some time, the
+ // navigation bar will be able to take input events again
+ float diffX = Math.abs(event.getX() - mTouchDownX);
+ float diffY = Math.abs(event.getY() - mTouchDownY);
+
+ if ((diffX <= NavigationBarCompat.getQuickStepDragSlopPx()
+ && diffY <= NavigationBarCompat.getQuickStepDragSlopPx())) {
+ setWindowTouchable(false);
+ mClickThroughPressX = event.getRawX();
+ mClickThroughPressY = event.getRawY();
+ mClickThroughPressed = true;
+ mNavigationBarView.postDelayed(mClickThroughSendTap,
+ CLICK_THROUGH_TAP_DELAY);
+ }
}
// Return the hit target back to its original position
@@ -350,6 +395,19 @@ public class QuickStepController implements GestureHelper {
return mCurrentAction != null || deadZoneConsumed;
}
+ private void setWindowTouchable(boolean flag) {
+ final WindowManager.LayoutParams lp = (WindowManager.LayoutParams)
+ ((ViewGroup) mNavigationBarView.getParent()).getLayoutParams();
+ if (flag) {
+ lp.flags &= ~LayoutParams.FLAG_NOT_TOUCHABLE;
+ } else {
+ lp.flags |= LayoutParams.FLAG_NOT_TOUCHABLE;
+ }
+ final WindowManager wm = (WindowManager) mNavigationBarView.getContext()
+ .getSystemService(Context.WINDOW_SERVICE);
+ wm.updateViewLayout((View) mNavigationBarView.getParent(), lp);
+ }
+
private boolean isEdgeSwipeAlongNavBar(int touchDown, boolean dragPositiveDirection) {
// Detect edge swipe from side of 0 -> threshold
if (dragPositiveDirection) {
@@ -562,6 +620,38 @@ public class QuickStepController implements GestureHelper {
return false;
}
+ private void sendTap(float x, float y) {
+ long now = SystemClock.uptimeMillis();
+ injectMotionEvent(InputDevice.SOURCE_TOUCHSCREEN, MotionEvent.ACTION_DOWN, now, x, y, 1.0f);
+ injectMotionEvent(InputDevice.SOURCE_TOUCHSCREEN, MotionEvent.ACTION_UP, now, x, y, 0.0f);
+ }
+
+ private int getInputDeviceId(int inputSource) {
+ int[] devIds = InputDevice.getDeviceIds();
+ for (int devId : devIds) {
+ InputDevice inputDev = InputDevice.getDevice(devId);
+ if (inputDev.supportsSource(inputSource)) {
+ return devId;
+ }
+ }
+ return 0;
+ }
+
+ private void injectMotionEvent(int inputSource, int action, long when, float x, float y,
+ float pressure) {
+ final float defaultSize = 1.0f;
+ final int defaultMetaState = 0;
+ final float defaultPrecisionX = 1.0f;
+ final float defaultPrecisionY = 1.0f;
+ final int defaultEdgeFlags = 0;
+ MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, defaultSize,
+ defaultMetaState, defaultPrecisionX, defaultPrecisionY,
+ getInputDeviceId(inputSource), defaultEdgeFlags);
+ event.setSource(inputSource);
+ InputManager.getInstance().injectInputEvent(event,
+ InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
+ }
+
private boolean proxyMotionEvents(MotionEvent event) {
final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
event.transform(mTransformGlobalMatrix);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index e25c8292b637..bf143c8940e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -88,16 +88,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
/**
* Default alpha value for most scrims.
*/
- public static final float GRADIENT_SCRIM_ALPHA = 0.45f;
+ public static final float GRADIENT_SCRIM_ALPHA = 0.2f;
/**
* A scrim varies its opacity based on a busyness factor, for example
* how many notifications are currently visible.
*/
public static final float GRADIENT_SCRIM_ALPHA_BUSY = 0.7f;
- /**
- * Scrim opacity when a wallpaper doesn't support ambient mode.
- */
- public static final float PULSING_WALLPAPER_SCRIM_ALPHA = 0.6f;
/**
* The most common scrim, the one under the keyguard.
@@ -154,7 +150,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
private Callback mCallback;
private boolean mWallpaperSupportsAmbientMode;
private boolean mScreenOn;
- private float mNotificationDensity;
// Scrim blanking callbacks
private Runnable mPendingFrameCallback;
@@ -245,7 +240,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
mCurrentInFrontTint = state.getFrontTint();
mCurrentBehindTint = state.getBehindTint();
mCurrentInFrontAlpha = state.getFrontAlpha();
- mCurrentBehindAlpha = state.getBehindAlpha(mNotificationDensity);
+ mCurrentBehindAlpha = state.getBehindAlpha();
applyExpansionToAlpha();
// Scrim might acquire focus when user is navigating with a D-pad or a keyboard.
@@ -275,9 +270,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
holdWakeLock();
}
- // AOD wallpapers should fade away after a while
- if (mWallpaperSupportsAmbientMode && mDozeParameters.getAlwaysOn()
- && mState == ScrimState.AOD) {
+ // AOD wallpapers should fade away after a while.
+ // Docking pulses may take a long time, wallpapers should also fade away after a while.
+ if (mWallpaperSupportsAmbientMode && (
+ mDozeParameters.getAlwaysOn() && mState == ScrimState.AOD
+ || mState == ScrimState.PULSING && mCallback != null)) {
if (!mWallpaperVisibilityTimedOut) {
mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(),
AlarmTimeout.MODE_IGNORE_IF_SCHEDULED);
@@ -329,7 +326,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
@VisibleForTesting
protected void onHideWallpaperTimeout() {
- if (mState != ScrimState.AOD) {
+ if (mState != ScrimState.AOD && mState != ScrimState.PULSING) {
return;
}
@@ -364,7 +361,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
mExpansionFraction = fraction;
final boolean keyguardOrUnlocked = mState == ScrimState.UNLOCKED
- || mState == ScrimState.KEYGUARD;
+ || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING;
if (!keyguardOrUnlocked || !mExpansionAffectsAlpha) {
return;
}
@@ -409,11 +406,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
behindFraction = (float) Math.pow(behindFraction, 0.8f);
mCurrentBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY;
mCurrentInFrontAlpha = 0;
- } else if (mState == ScrimState.KEYGUARD) {
+ } else if (mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING) {
// Either darken of make the scrim transparent when you
// pull down the shade
float interpolatedFract = getInterpolatedFraction();
- float alphaBehind = mState.getBehindAlpha(mNotificationDensity);
+ float alphaBehind = mState.getBehindAlpha();
if (mDarkenWhileDragging) {
mCurrentBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind,
interpolatedFract);
@@ -427,24 +424,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
}
/**
- * Keyguard and shade scrim opacity varies according to how many notifications are visible.
- * @param notificationCount Number of visible notifications.
- */
- public void setNotificationCount(int notificationCount) {
- final float maxNotificationDensity = 3;
- float notificationDensity = Math.min(notificationCount / maxNotificationDensity, 1f);
- if (mNotificationDensity == notificationDensity) {
- return;
- }
- mNotificationDensity = notificationDensity;
-
- if (mState == ScrimState.KEYGUARD) {
- applyExpansionToAlpha();
- scheduleUpdate();
- }
- }
-
- /**
* Sets the given drawable as the background of the scrim that shows up behind the
* notifications.
*/
@@ -504,7 +483,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// We want to override the back scrim opacity for the AOD state
// when it's time to fade the wallpaper away.
- boolean aodWallpaperTimeout = mState == ScrimState.AOD && mWallpaperVisibilityTimedOut;
+ boolean aodWallpaperTimeout = (mState == ScrimState.AOD || mState == ScrimState.PULSING)
+ && mWallpaperVisibilityTimedOut;
// We also want to hide FLAG_SHOW_WHEN_LOCKED activities under the scrim.
boolean occludedKeyguard = (mState == ScrimState.PULSING || mState == ScrimState.AOD)
&& mKeyguardOccluded;
@@ -562,8 +542,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
if (alpha == 0f) {
scrim.setClickable(false);
} else {
- // Eat touch events (unless dozing or pulsing).
- scrim.setClickable(mState != ScrimState.AOD && mState != ScrimState.PULSING);
+ // Eat touch events (unless dozing).
+ scrim.setClickable(mState != ScrimState.AOD);
}
updateScrim(scrim, alpha);
}
@@ -608,9 +588,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
anim.setStartDelay(mAnimationDelay);
anim.setDuration(mAnimationDuration);
anim.addListener(new AnimatorListenerAdapter() {
+ private Callback lastCallback = mCallback;
+
@Override
public void onAnimationEnd(Animator animation) {
- onFinished();
+ onFinished(lastCallback);
scrim.setTag(TAG_KEY_ANIM, null);
dispatchScrimsVisible();
@@ -668,14 +650,23 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
}
private void onFinished() {
+ onFinished(mCallback);
+ }
+
+ private void onFinished(Callback callback) {
if (mWakeLockHeld) {
mWakeLock.release();
mWakeLockHeld = false;
}
- if (mCallback != null) {
- mCallback.onFinished();
- mCallback = null;
+
+ if (callback != null) {
+ callback.onFinished();
+
+ if (callback == mCallback) {
+ mCallback = null;
+ }
}
+
// When unlocking with fingerprint, we'll fade the scrims from black to transparent.
// At the end of the animation we need to remove the tint.
if (mState == ScrimState.UNLOCKED) {
@@ -894,7 +885,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// Backdrop event may arrive after state was already applied,
// in this case, back-scrim needs to be re-evaluated
if (mState == ScrimState.AOD || mState == ScrimState.PULSING) {
- float newBehindAlpha = mState.getBehindAlpha(mNotificationDensity);
+ float newBehindAlpha = mState.getBehindAlpha();
if (mCurrentBehindAlpha != newBehindAlpha) {
mCurrentBehindAlpha = newBehindAlpha;
updateScrims();
@@ -908,6 +899,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
}
}
+ public void setPulseReason(int pulseReason) {
+ ScrimState.PULSING.setPulseReason(pulseReason);
+ }
+
public interface Callback {
default void onStart() {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index fb3c4aa16ef5..11a2d32c9dd6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -18,8 +18,8 @@ package com.android.systemui.statusbar.phone;
import android.graphics.Color;
import android.os.Trace;
-import android.util.MathUtils;
+import com.android.systemui.doze.DozeLog;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -57,13 +57,6 @@ public enum ScrimState {
mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
mCurrentInFrontAlpha = 0;
}
-
- @Override
- public float getBehindAlpha(float busynessFactor) {
- return MathUtils.map(0 /* start */, 1 /* stop */,
- mScrimBehindAlphaKeyguard, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
- busynessFactor);
- }
},
/**
@@ -117,7 +110,7 @@ public enum ScrimState {
}
@Override
- public float getBehindAlpha(float busyness) {
+ public float getBehindAlpha() {
return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f;
}
@@ -133,17 +126,17 @@ public enum ScrimState {
PULSING(5) {
@Override
public void prepare(ScrimState previousState) {
- mCurrentInFrontAlpha = 0;
- mCurrentInFrontTint = Color.BLACK;
- mCurrentBehindTint = Color.BLACK;
+ mCurrentInFrontAlpha = 0f;
+ if (mPulseReason == DozeLog.PULSE_REASON_NOTIFICATION
+ || mPulseReason == DozeLog.PULSE_REASON_DOCKING) {
+ mCurrentBehindAlpha = previousState.getBehindAlpha();
+ mCurrentBehindTint = Color.BLACK;
+ } else {
+ mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
+ mCurrentBehindTint = Color.TRANSPARENT;
+ }
mBlankScreen = mDisplayRequiresBlanking;
}
-
- @Override
- public float getBehindAlpha(float busyness) {
- return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f
- : ScrimController.PULSING_WALLPAPER_SCRIM_ALPHA;
- }
},
/**
@@ -204,6 +197,7 @@ public enum ScrimState {
int mIndex;
boolean mHasBackdrop;
boolean mLaunchingAffordanceWithPreview;
+ int mPulseReason;
ScrimState(int index) {
mIndex = index;
@@ -219,6 +213,14 @@ public enum ScrimState {
public void prepare(ScrimState previousState) {
}
+ /**
+ * Check if lockscreen wallpaper or music album art exists.
+ * @return true if lockscreen wallpaper or music album art exists.
+ */
+ public boolean hasBackdrop() {
+ return mHasBackdrop;
+ }
+
public int getIndex() {
return mIndex;
}
@@ -227,7 +229,7 @@ public enum ScrimState {
return mCurrentInFrontAlpha;
}
- public float getBehindAlpha(float busyness) {
+ public float getBehindAlpha() {
return mCurrentBehindAlpha;
}
@@ -268,6 +270,10 @@ public enum ScrimState {
mAodFrontScrimAlpha = aodFrontScrimAlpha;
}
+ public void setPulseReason(int pulseReason) {
+ mPulseReason = pulseReason;
+ }
+
public void setScrimBehindAlphaKeyguard(float scrimBehindAlphaKeyguard) {
mScrimBehindAlphaKeyguard = scrimBehindAlphaKeyguard;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 977e33688831..1470d0f44266 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -70,6 +70,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.database.ContentObserver;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
@@ -98,6 +99,7 @@ import android.service.dreams.IDreamManager;
import android.service.notification.StatusBarNotification;
import android.util.DisplayMetrics;
import android.util.EventLog;
+import android.util.FeatureFlagUtils;
import android.util.Log;
import android.util.Slog;
import android.view.Display;
@@ -192,12 +194,12 @@ import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
import com.android.systemui.statusbar.notification.NotificationClicker;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.NotificationListController;
import com.android.systemui.statusbar.notification.NotificationRowBinder;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
@@ -386,6 +388,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private NotificationGutsManager mGutsManager;
protected NotificationLogger mNotificationLogger;
protected NotificationEntryManager mEntryManager;
+ private NotificationListController mNotificationListController;
private NotificationInterruptionStateProvider mNotificationInterruptionStateProvider;
private NotificationRowBinder mNotificationRowBinder;
protected NotificationViewHierarchyManager mViewHierarchyManager;
@@ -460,13 +463,6 @@ public class StatusBar extends SystemUI implements DemoMode,
private NotificationMediaManager mMediaManager;
protected NotificationLockscreenUserManager mLockscreenUserManager;
protected NotificationRemoteInputManager mRemoteInputManager;
- protected BubbleController mBubbleController;
- private final BubbleController.BubbleExpandListener mBubbleExpandListener =
- (isExpanding, amount) -> {
- if (amount == 1) {
- updateScrimController();
- }
- };
private final BroadcastReceiver mWallpaperChangedReceiver = new BroadcastReceiver() {
@Override
@@ -479,8 +475,13 @@ public class StatusBar extends SystemUI implements DemoMode,
WallpaperInfo info = wallpaperManager.getWallpaperInfo(UserHandle.USER_CURRENT);
final boolean deviceSupportsAodWallpaper = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_dozeSupportsAodWallpaper);
+ final boolean aodImageWallpaperEnabled = FeatureFlagUtils.isEnabled(mContext,
+ FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED);
+ updateAodMaskVisibility(deviceSupportsAodWallpaper && aodImageWallpaperEnabled);
+ // If WallpaperInfo is null, it must be ImageWallpaper.
final boolean supportsAmbientMode = deviceSupportsAodWallpaper
- && info != null && info.supportsAmbientMode();
+ && (info == null && aodImageWallpaperEnabled
+ || info != null && info.supportsAmbientMode());
mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
@@ -489,7 +490,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private Runnable mLaunchTransitionEndRunnable;
protected boolean mLaunchTransitionFadingAway;
- private NotificationData.Entry mDraggedDownEntry;
+ private NotificationEntry mDraggedDownEntry;
private boolean mLaunchCameraOnScreenTurningOn;
private boolean mLaunchCameraOnFinishedGoingToSleep;
private int mLastCameraLaunchSource;
@@ -582,12 +583,19 @@ public class StatusBar extends SystemUI implements DemoMode,
protected NotificationPresenter mPresenter;
private NotificationActivityStarter mNotificationActivityStarter;
private boolean mPulsing;
+ private ContentObserver mFeatureFlagObserver;
+ protected BubbleController mBubbleController;
+ private final BubbleController.BubbleExpandListener mBubbleExpandListener =
+ (isExpanding, key) -> {
+ mEntryManager.updateNotifications();
+ updateScrimController();
+ };
@Override
public void onActiveStateChanged(int code, int uid, String packageName, boolean active) {
mForegroundServiceController.onAppOpChanged(code, uid, packageName, active);
Dependency.get(Dependency.MAIN_HANDLER).post(() -> {
- mEntryManager.updateNotificationsForAppOp(code, uid, packageName, active);
+ mNotificationListController.updateNotificationsForAppOp(code, uid, packageName, active);
});
}
@@ -633,7 +641,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mBubbleController.setExpandListener(mBubbleExpandListener);
KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance();
if (sliceProvider != null) {
- sliceProvider.initDependencies();
+ sliceProvider.initDependencies(mMediaManager, mStatusBarStateController);
} else {
Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies");
}
@@ -698,6 +706,9 @@ public class StatusBar extends SystemUI implements DemoMode,
mContext.registerReceiverAsUser(mWallpaperChangedReceiver, UserHandle.ALL,
wallpaperChangedFilter, null /* broadcastPermission */, null /* scheduler */);
mWallpaperChangedReceiver.onReceive(mContext, null);
+ mFeatureFlagObserver = new FeatureFlagObserver(
+ FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED /* feature */,
+ () -> mWallpaperChangedReceiver.onReceive(mContext, null) /* callback */);
// Set up the initial notification state. This needs to happen before CommandQueue.disable()
setUpPresenter();
@@ -790,7 +801,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationLogger.setUpWithContainer(notifListContainer);
mNotificationIconAreaController = SystemUIFactory.getInstance()
- .createNotificationIconAreaController(context, this);
+ .createNotificationIconAreaController(context, this, mStatusBarStateController);
inflateShelf();
mNotificationIconAreaController.setupShelf(mNotificationShelf);
@@ -1035,6 +1046,13 @@ public class StatusBar extends SystemUI implements DemoMode,
mScrimController, mActivityLaunchAnimator, mStatusBarKeyguardViewManager,
mNotificationAlertingManager);
+ mNotificationListController =
+ new NotificationListController(
+ mEntryManager,
+ (NotificationListContainer) mStackScroller,
+ mForegroundServiceController,
+ mDeviceProvisionedController);
+
mAppOpsController.addCallback(APP_OPS, this);
mNotificationListener.setUpWithPresenter(mPresenter);
mNotificationShelf.setOnActivatedListener(mPresenter);
@@ -1047,6 +1065,7 @@ public class StatusBar extends SystemUI implements DemoMode,
this, Dependency.get(BubbleController.class), mNotificationActivityStarter));
mGroupAlertTransferHelper.bind(mEntryManager, mGroupManager);
+ mNotificationListController.bind();
}
/**
@@ -1510,21 +1529,21 @@ public class StatusBar extends SystemUI implements DemoMode,
}
@Override
- public void onHeadsUpPinned(NotificationData.Entry entry) {
+ public void onHeadsUpPinned(NotificationEntry entry) {
dismissVolumeDialog();
}
@Override
- public void onHeadsUpUnPinned(NotificationData.Entry entry) {
+ public void onHeadsUpUnPinned(NotificationEntry entry) {
}
@Override
- public void onHeadsUpStateChanged(Entry entry, boolean isHeadsUp) {
+ public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
mEntryManager.updateNotificationRanking(null /* rankingMap */);
}
@Override
- public void onAmbientStateChanged(Entry entry, boolean isAmbient) {
+ public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) {
mEntryManager.updateNotificationRanking(null);
if (isAmbient) {
mDozeServiceHost.fireNotificationPulse();
@@ -2551,11 +2570,11 @@ public class StatusBar extends SystemUI implements DemoMode,
};
public void resetUserExpandedStates() {
- ArrayList<Entry> activeNotifications = mEntryManager.getNotificationData()
+ ArrayList<NotificationEntry> activeNotifications = mEntryManager.getNotificationData()
.getActiveNotifications();
final int notificationCount = activeNotifications.size();
for (int i = 0; i < notificationCount; i++) {
- NotificationData.Entry entry = activeNotifications.get(i);
+ NotificationEntry entry = activeNotifications.get(i);
entry.resetUserExpansion();
}
}
@@ -2822,7 +2841,7 @@ public class StatusBar extends SystemUI implements DemoMode,
} catch (RemoteException e) {
// Ignore.
}
- mEntryManager.destroy();
+ mNotificationListController.destroy();
// End old BaseStatusBar.destroy().
if (mStatusBarWindow != null) {
mWindowManager.removeViewImmediate(mStatusBarWindow);
@@ -3506,7 +3525,7 @@ public class StatusBar extends SystemUI implements DemoMode,
int userId = mLockscreenUserManager.getCurrentUserId();
ExpandableNotificationRow row = null;
- NotificationData.Entry entry = null;
+ NotificationEntry entry = null;
if (expandView instanceof ExpandableNotificationRow) {
entry = ((ExpandableNotificationRow) expandView).getEntry();
entry.setUserExpanded(true /* userExpanded */, true /* allowChildExpansion */);
@@ -3574,10 +3593,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mVisualStabilityManager.setScreenOn(false);
updateVisibleToUser();
- // We need to disable touch events because these might
- // collapse the panel after we expanded it, and thus we would end up with a blank
- // Keyguard.
- mNotificationPanel.setTouchAndAnimationDisabled(true);
+ updateNotificationPanelTouchState();
mStatusBarWindow.cancelCurrentTouch();
if (mLaunchCameraOnFinishedGoingToSleep) {
mLaunchCameraOnFinishedGoingToSleep = false;
@@ -3600,13 +3616,22 @@ public class StatusBar extends SystemUI implements DemoMode,
mDeviceInteractive = true;
mAmbientPulseManager.releaseAllImmediately();
mVisualStabilityManager.setScreenOn(true);
- mNotificationPanel.setTouchAndAnimationDisabled(false);
+ updateNotificationPanelTouchState();
updateVisibleToUser();
updateIsKeyguard();
mDozeServiceHost.stopDozing();
}
};
+ /**
+ * We need to disable touch events because these might
+ * collapse the panel after we expanded it, and thus we would end up with a blank
+ * Keyguard.
+ */
+ private void updateNotificationPanelTouchState() {
+ mNotificationPanel.setTouchAndAnimationDisabled(!mDeviceInteractive && !mPulsing);
+ }
+
final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
@Override
public void onScreenTurningOn() {
@@ -3858,6 +3883,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void pulseWhileDozing(@NonNull PulseCallback callback, int reason) {
+ mScrimController.setPulseReason(reason);
if (reason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS) {
mPowerManager.wakeUp(SystemClock.uptimeMillis(), "com.android.systemui:NODOZE");
startAssist(new Bundle());
@@ -3872,17 +3898,15 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onPulseStarted() {
callback.onPulseStarted();
- if (mAmbientPulseManager.hasNotifications()) {
- // Only pulse the stack scroller if there's actually something to show.
- // Otherwise just show the always-on screen.
- setPulsing(true);
- }
+ updateNotificationPanelTouchState();
+ setPulsing(true);
}
@Override
public void onPulseFinished() {
mPulsing = false;
callback.onPulseFinished();
+ updateNotificationPanelTouchState();
setPulsing(false);
}
@@ -3986,7 +4010,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
@Override
- public void onDoubleTap(float screenX, float screenY) {
+ public void onSlpiTap(float screenX, float screenY) {
if (screenX > 0 && screenY > 0 && mAmbientIndicationContainer != null
&& mAmbientIndicationContainer.getVisibility() == View.VISIBLE) {
mAmbientIndicationContainer.getLocationOnScreen(mTmpInt2);
@@ -4412,4 +4436,33 @@ public class StatusBar extends SystemUI implements DemoMode,
public @TransitionMode int getStatusBarMode() {
return mStatusBarMode;
}
+
+ private void updateAodMaskVisibility(boolean supportsAodWallpaper) {
+ View mask = mStatusBarWindow.findViewById(R.id.aod_mask);
+ if (mask != null) {
+ mask.setVisibility(supportsAodWallpaper ? View.VISIBLE : View.INVISIBLE);
+ }
+ }
+
+ private final class FeatureFlagObserver extends ContentObserver {
+ private final Runnable mCallback;
+
+ FeatureFlagObserver(String feature, Runnable callback) {
+ this(null, feature, callback);
+ }
+
+ private FeatureFlagObserver(Handler handler, String feature, Runnable callback) {
+ super(handler);
+ mCallback = callback;
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(feature), false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mCallback != null) {
+ mStatusBarWindow.post(mCallback);
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index db7589d0f333..f846036248d4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -36,7 +36,6 @@ import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconStat
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
-import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -61,7 +60,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
private final ArrayList<IconManager> mIconGroups = new ArrayList<>();
private final ArraySet<String> mIconBlacklist = new ArraySet<>();
- private final IconLogger mIconLogger = Dependency.get(IconLogger.class);
// Points to light or dark context depending on the... context?
private Context mContext;
@@ -147,7 +145,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
int viewIndex = getViewIndex(index, holder.getTag());
boolean blocked = mIconBlacklist.contains(slot);
- mIconLogger.onIconVisibility(getSlotName(index), holder.isVisible());
mIconGroups.forEach(l -> l.onIconAdded(viewIndex, slot, blocked, holder));
}
@@ -281,8 +278,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
return;
}
- mIconLogger.onIconHidden(slotName);
-
int slotIndex = getSlotIndex(slotName);
List<StatusBarIconHolder> iconsToRemove = slot.getHolderListInViewOrder();
for (StatusBarIconHolder holder : iconsToRemove) {
@@ -297,7 +292,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
if (getIcon(index, tag) == null) {
return;
}
- mIconLogger.onIconHidden(getSlotName(index));
super.removeIcon(index, tag);
int viewIndex = getViewIndex(index, 0);
mIconGroups.forEach(l -> l.onRemoveIcon(viewIndex));
@@ -305,7 +299,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
private void handleSet(int index, StatusBarIconHolder holder) {
int viewIndex = getViewIndex(index, holder.getTag());
- mIconLogger.onIconVisibility(getSlotName(index), holder.isVisible());
mIconGroups.forEach(l -> l.onSetIconHolder(viewIndex, holder));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 0f8970f1069f..bb23608799f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -187,7 +187,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
} else if (bouncerNeedsScrimming()) {
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
- } else if (mShowing && !mDozing) {
+ } else if (mShowing) {
if (!isWakeAndUnlocking() && !mStatusBar.isInLaunchTransition()) {
mBouncer.setExpansion(expansion);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index 8d1b911b101f..4f61009095c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -60,10 +60,10 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -131,7 +131,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
mEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
- public void onPendingEntryAdded(NotificationData.Entry entry) {
+ public void onPendingEntryAdded(NotificationEntry entry) {
handleFullScreenIntent(entry);
}
});
@@ -267,7 +267,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
}
}
Intent fillInIntent = null;
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
CharSequence remoteInputText = null;
if (!TextUtils.isEmpty(entry.remoteInputText)) {
remoteInputText = entry.remoteInputText;
@@ -345,7 +345,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
}, null, false /* afterKeyguardGone */);
}
- private void handleFullScreenIntent(NotificationData.Entry entry) {
+ private void handleFullScreenIntent(NotificationEntry entry) {
boolean isHeadsUped = mNotificationInterruptionStateProvider.shouldHeadsUp(entry);
if (!isHeadsUped && entry.notification.getNotification().fullScreenIntent != null) {
if (shouldSuppressFullScreenIntent(entry)) {
@@ -413,7 +413,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
|| !mActivityLaunchAnimator.isAnimationPending();
}
- private boolean shouldSuppressFullScreenIntent(NotificationData.Entry entry) {
+ private boolean shouldSuppressFullScreenIntent(NotificationEntry entry) {
if (mPresenter.isDeviceInVrMode()) {
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index b9372e8935ad..df7f53b3b63a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -60,12 +60,12 @@ import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.AboveShelfObserver;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.NotificationRowBinder;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
@@ -104,6 +104,8 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
Dependency.get(NotificationMediaManager.class);
private final VisualStabilityManager mVisualStabilityManager =
Dependency.get(VisualStabilityManager.class);
+ private final NotificationGutsManager mGutsManager =
+ Dependency.get(NotificationGutsManager.class);
protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class);
private final NotificationPanelView mNotificationPanel;
@@ -183,41 +185,35 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
Dependency.get(InitController.class).addPostInitTask(() -> {
NotificationEntryListener notificationEntryListener = new NotificationEntryListener() {
@Override
- public void onNotificationAdded(Entry entry) {
+ public void onNotificationAdded(NotificationEntry entry) {
// Recalculate the position of the sliding windows and the titles.
mShadeController.updateAreThereNotifications();
}
@Override
- public void onEntryUpdated(Entry entry) {
+ public void onPostEntryUpdated(NotificationEntry entry) {
mShadeController.updateAreThereNotifications();
}
@Override
public void onEntryRemoved(
- @Nullable Entry entry,
- String key,
- StatusBarNotification old,
+ @Nullable NotificationEntry entry,
NotificationVisibility visibility,
- boolean lifetimeExtended,
boolean removedByUser) {
- if (!lifetimeExtended) {
- StatusBarNotificationPresenter.this.onNotificationRemoved(key, old);
- }
+ StatusBarNotificationPresenter.this.onNotificationRemoved(
+ entry.key, entry.notification);
if (removedByUser) {
maybeEndAmbientPulse();
}
}
};
- NotificationGutsManager gutsManager = Dependency.get(NotificationGutsManager.class);
-
mViewHierarchyManager.setUpWithPresenter(this, notifListContainer);
mEntryManager.setUpWithPresenter(this, notifListContainer, mHeadsUpManager);
mEntryManager.addNotificationEntryListener(notificationEntryListener);
mEntryManager.addNotificationLifetimeExtender(mHeadsUpManager);
mEntryManager.addNotificationLifetimeExtender(mAmbientPulseManager);
- mEntryManager.addNotificationLifetimeExtender(gutsManager);
+ mEntryManager.addNotificationLifetimeExtender(mGutsManager);
mEntryManager.addNotificationLifetimeExtenders(
remoteInputManager.getLifetimeExtenders());
mNotificationRowBinder.setUpWithPresenter(this, notifListContainer, mHeadsUpManager,
@@ -227,7 +223,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
mLockscreenUserManager.setUpWithPresenter(this);
mMediaManager.setUpWithPresenter(this);
mVisualStabilityManager.setUpWithPresenter(this);
- gutsManager.setUpWithPresenter(this,
+ mGutsManager.setUpWithPresenter(this,
notifListContainer, mCheckSaveListener, mOnSettingsClickListener);
// ForegroundServiceControllerListener adds its listener in its constructor
// but we need to request it here in order for it to be instantiated.
@@ -246,7 +242,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
MessagingMessage.dropCache();
MessagingGroup.dropCache();
if (!KeyguardUpdateMonitor.getInstance(mContext).isSwitchingUser()) {
- mEntryManager.updateNotificationsOnDensityOrFontScaleChanged();
+ updateNotificationsOnDensityOrFontScaleChanged();
} else {
mReinflateNotificationsOnUserSwitched = true;
}
@@ -262,10 +258,10 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
}
private void updateNotificationOnUiModeChanged() {
- ArrayList<Entry> userNotifications
+ ArrayList<NotificationEntry> userNotifications
= mEntryManager.getNotificationData().getNotificationsForCurrentUser();
for (int i = 0; i < userNotifications.size(); i++) {
- Entry entry = userNotifications.get(i);
+ NotificationEntry entry = userNotifications.get(i);
ExpandableNotificationRow row = entry.getRow();
if (row != null) {
row.onUiModeChanged();
@@ -273,6 +269,19 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
}
}
+ private void updateNotificationsOnDensityOrFontScaleChanged() {
+ ArrayList<NotificationEntry> userNotifications =
+ mEntryManager.getNotificationData().getNotificationsForCurrentUser();
+ for (int i = 0; i < userNotifications.size(); i++) {
+ NotificationEntry entry = userNotifications.get(i);
+ entry.onDensityOrFontScaleChanged();
+ boolean exposedGuts = entry.areGutsExposed();
+ if (exposedGuts) {
+ mGutsManager.onDensityOrFontScaleChanged(entry);
+ }
+ }
+ }
+
@Override
public boolean isCollapsing() {
return mNotificationPanel.isCollapsing()
@@ -327,7 +336,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
return !mEntryManager.getNotificationData().getActiveNotifications().isEmpty();
}
- public boolean canHeadsUp(Entry entry, StatusBarNotification sbn) {
+ public boolean canHeadsUp(NotificationEntry entry, StatusBarNotification sbn) {
if (mShadeController.isDozing()) {
return false;
}
@@ -371,7 +380,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
if (MULTIUSER_DEBUG) mNotificationPanelDebugText.setText("USER " + newUserId);
mCommandQueue.animateCollapsePanels();
if (mReinflateNotificationsOnUserSwitched) {
- mEntryManager.updateNotificationsOnDensityOrFontScaleChanged();
+ updateNotificationsOnDensityOrFontScaleChanged();
mReinflateNotificationsOnUserSwitched = false;
}
if (mDispatchUiModeChangeOnUserSwitched) {
@@ -385,7 +394,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
}
@Override
- public void onBindRow(Entry entry, PackageManager pmUser,
+ public void onBindRow(NotificationEntry entry, PackageManager pmUser,
StatusBarNotification sbn, ExpandableNotificationRow row) {
row.setAboveShelfChangedListener(mAboveShelfObserver);
row.setSecureStateProvider(mUnlockMethodCache::canSkipBouncer);
@@ -443,7 +452,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
}
@Override
- public void onExpandClicked(Entry clickedEntry, boolean nowExpanded) {
+ public void onExpandClicked(NotificationEntry clickedEntry, boolean nowExpanded) {
mHeadsUpManager.setExpanded(clickedEntry, nowExpanded);
if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD && nowExpanded) {
mShadeController.goToLockedShade(clickedEntry.getRow());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
index 3ddfc0c81c60..8d5841088591 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
@@ -53,7 +53,8 @@ import javax.inject.Singleton;
/**
*/
@Singleton
-public class StatusBarRemoteInputCallback implements Callback, Callbacks {
+public class StatusBarRemoteInputCallback implements Callback, Callbacks,
+ StatusBarStateController.StateListener {
private final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
private final StatusBarStateController mStatusBarStateController
@@ -63,7 +64,6 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks {
private final ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class);
private final Context mContext;
private View mPendingWorkRemoteInputView;
- private final StatusBarStateController.StateListener mStateListener = this::setStatusBarState;
private View mPendingRemoteInputView;
private final ShadeController mShadeController = Dependency.get(ShadeController.class);
private KeyguardManager mKeyguardManager;
@@ -78,13 +78,14 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks {
mContext = context;
mContext.registerReceiverAsUser(mChallengeReceiver, UserHandle.ALL,
new IntentFilter(ACTION_DEVICE_LOCKED_CHANGED), null, null);
- mStatusBarStateController.addCallback(mStateListener);
+ mStatusBarStateController.addCallback(this);
mKeyguardManager = context.getSystemService(KeyguardManager.class);
mCommandQueue = getComponent(context, CommandQueue.class);
mCommandQueue.addCallback(this);
}
- private void setStatusBarState(int state) {
+ @Override
+ public void onStateChanged(int state) {
if (state == StatusBarState.SHADE && mStatusBarStateController.leaveOpenOnKeyguardHide()) {
if (!mStatusBarStateController.isKeyguardRequested()) {
if (mPendingRemoteInputView != null
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 53e461db3dd1..8b25c3469abe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -339,7 +339,7 @@ public class StatusBarWindowView extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
NotificationStackScrollLayout stackScrollLayout = getStackScrollLayout();
- if (mService.isDozing() && !stackScrollLayout.hasPulsingNotifications()) {
+ if (mService.isDozing() && !mService.isPulsing()) {
// Capture all touch events in always-on.
return true;
}
@@ -347,8 +347,7 @@ public class StatusBarWindowView extends FrameLayout {
if (mNotificationPanel.isFullyExpanded()
&& stackScrollLayout.getVisibility() == View.VISIBLE
&& mStatusBarStateController.getState() == StatusBarState.KEYGUARD
- && !mService.isBouncerShowing()
- && !mService.isDozing()) {
+ && !mService.isBouncerShowing()) {
intercept = mDragDownHelper.onInterceptTouchEvent(ev);
}
if (!intercept) {
@@ -369,7 +368,7 @@ public class StatusBarWindowView extends FrameLayout {
boolean handled = false;
if (mService.isDozing()) {
mDoubleTapHelper.onTouchEvent(ev);
- handled = true;
+ handled = !mService.isPulsing();
}
if ((mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !handled)
|| mDragDownHelper.isDraggingDown()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index f65f8261dcfb..5e94152e7eab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -48,18 +48,36 @@ public interface BatteryController extends DemoMode, Dumpable,
}
/**
- * A listener that will be notified whenever a change in battery level or power save mode
- * has occurred.
+ * A listener that will be notified whenever a change in battery level or power save mode has
+ * occurred.
*/
interface BatteryStateChangeCallback {
- default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {}
- default void onPowerSaveChanged(boolean isPowerSave) {}
+
+ default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+ }
+
+ default void onPowerSaveChanged(boolean isPowerSave) {
+ }
}
/**
- * If available, get the estimated battery time remaining as a string
+ * If available, get the estimated battery time remaining as a string.
+ *
+ * @param completion A lambda that will be called with the result of fetching the estimate. The
+ * first time this method is called may need to be dispatched to a background thread. The
+ * completion is called on the main thread
+ */
+ default void getEstimatedTimeRemainingString(EstimateFetchCompletion completion) {}
+
+ /**
+ * Callback called when the estimated time remaining text is fetched.
*/
- default String getEstimatedTimeRemainingString() {
- return null;
+ public interface EstimateFetchCompletion {
+
+ /**
+ * The callback
+ * @param estimate the estimate
+ */
+ void onBatteryRemainingEstimateRetrieved(String estimate);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
index 6190c8fff8cc..af3c96f73642 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
@@ -27,9 +27,12 @@ import android.os.PowerManager;
import android.os.PowerSaveState;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.utils.PowerUtil;
+import com.android.systemui.Dependency;
import com.android.systemui.power.EnhancedEstimates;
import com.android.systemui.power.Estimate;
@@ -56,6 +59,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
private final EnhancedEstimates mEstimates;
private final ArrayList<BatteryController.BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
+ private final ArrayList<EstimateFetchCompletion> mFetchCallbacks = new ArrayList<>();
private final PowerManager mPowerManager;
private final Handler mHandler;
private final Context mContext;
@@ -70,6 +74,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
private boolean mHasReceivedBattery = false;
private Estimate mEstimate;
private long mLastEstimateTimestamp = -1;
+ private boolean mFetchingEstimate = false;
@Inject
public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates) {
@@ -197,20 +202,61 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
}
@Override
- public String getEstimatedTimeRemainingString() {
- if (mEstimate == null
- || System.currentTimeMillis() > mLastEstimateTimestamp + UPDATE_GRANULARITY_MSEC) {
- updateEstimate();
+ public void getEstimatedTimeRemainingString(EstimateFetchCompletion completion) {
+ if (mEstimate != null
+ && mLastEstimateTimestamp > System.currentTimeMillis() - UPDATE_GRANULARITY_MSEC) {
+ String percentage = generateTimeRemainingString();
+ completion.onBatteryRemainingEstimateRetrieved(percentage);
+ return;
+ }
+
+ // Need to fetch or refresh the estimate, but it may involve binder calls so offload the
+ // work
+ synchronized (mFetchCallbacks) {
+ mFetchCallbacks.add(completion);
}
- // Estimates may not exist yet even if we've checked
+ updateEstimateInBackground();
+ }
+
+ @Nullable
+ private String generateTimeRemainingString() {
if (mEstimate == null) {
return null;
}
- final String percentage = NumberFormat.getPercentInstance().format((double) mLevel / 100.0);
+
+ String percentage = NumberFormat.getPercentInstance().format((double) mLevel / 100.0);
return PowerUtil.getBatteryRemainingShortStringFormatted(
mContext, mEstimate.estimateMillis);
}
+ private void updateEstimateInBackground() {
+ if (mFetchingEstimate) {
+ // Already dispatched a fetch. It will notify all listeners when finished
+ return;
+ }
+
+ mFetchingEstimate = true;
+ Dependency.get(Dependency.BG_HANDLER).post(() -> {
+ mEstimate = mEstimates.getEstimate();
+ mLastEstimateTimestamp = System.currentTimeMillis();
+ mFetchingEstimate = false;
+
+ Dependency.get(Dependency.MAIN_HANDLER).post(this::notifyEstimateFetchCallbacks);
+ });
+ }
+
+ private void notifyEstimateFetchCallbacks() {
+ String estimate = generateTimeRemainingString();
+
+ synchronized (mFetchCallbacks) {
+ for (EstimateFetchCompletion completion : mFetchCallbacks) {
+ completion.onBatteryRemainingEstimateRetrieved(estimate);
+ }
+
+ mFetchCallbacks.clear();
+ }
+ }
+
private void updateEstimate() {
mEstimate = mEstimates.getEstimate();
mLastEstimateTimestamp = System.currentTimeMillis();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index de7ef3ba645d..4299af7daf66 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -274,7 +274,6 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
private void updateClockVisibility() {
boolean visible = shouldBeVisible();
- Dependency.get(IconLogger.class).onIconVisibility("clock", visible);
int visibility = visible ? View.VISIBLE : View.GONE;
super.setVisibility(visibility);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
index a02c9d51fecf..fd3f680e5e77 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
@@ -30,7 +30,7 @@ import android.util.Log;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.statusbar.AlertingNotificationManager;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import java.io.FileDescriptor;
@@ -108,11 +108,11 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
}
}
- protected boolean shouldHeadsUpBecomePinned(@NonNull NotificationData.Entry entry) {
+ protected boolean shouldHeadsUpBecomePinned(@NonNull NotificationEntry entry) {
return hasFullScreenIntent(entry);
}
- protected boolean hasFullScreenIntent(@NonNull NotificationData.Entry entry) {
+ protected boolean hasFullScreenIntent(@NonNull NotificationEntry entry) {
return entry.notification.getNotification().fullScreenIntent != null;
}
@@ -121,7 +121,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "setEntryPinned: " + isPinned);
}
- NotificationData.Entry entry = headsUpEntry.mEntry;
+ NotificationEntry entry = headsUpEntry.mEntry;
if (entry.isRowPinned() != isPinned) {
entry.setRowPinned(isPinned);
updatePinnedMode();
@@ -141,7 +141,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
@Override
protected void onAlertEntryAdded(AlertEntry alertEntry) {
- NotificationData.Entry entry = alertEntry.mEntry;
+ NotificationEntry entry = alertEntry.mEntry;
entry.setHeadsUp(true);
setEntryPinned((HeadsUpEntry) alertEntry, shouldHeadsUpBecomePinned(entry));
for (OnHeadsUpChangedListener listener : mListeners) {
@@ -151,7 +151,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
@Override
protected void onAlertEntryRemoved(AlertEntry alertEntry) {
- NotificationData.Entry entry = alertEntry.mEntry;
+ NotificationEntry entry = alertEntry.mEntry;
entry.setHeadsUp(false);
setEntryPinned((HeadsUpEntry) alertEntry, false /* isPinned */);
for (OnHeadsUpChangedListener listener : mListeners) {
@@ -222,7 +222,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
* Returns the top Heads Up Notification, which appears to show at first.
*/
@Nullable
- public NotificationData.Entry getTopEntry() {
+ public NotificationEntry getTopEntry() {
HeadsUpEntry topEntry = getTopHeadsUpEntry();
return (topEntry != null) ? topEntry.mEntry : null;
}
@@ -323,7 +323,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
* @return -1 if the first argument should be ranked higher than the second, 1 if the second
* one should be ranked higher and 0 if they are equal.
*/
- public int compare(@NonNull NotificationData.Entry a, @NonNull NotificationData.Entry b) {
+ public int compare(@NonNull NotificationEntry a, @NonNull NotificationEntry b) {
AlertEntry aEntry = getHeadsUpEntry(a.key);
AlertEntry bEntry = getHeadsUpEntry(b.key);
if (aEntry == null || bEntry == null) {
@@ -336,7 +336,7 @@ public abstract class HeadsUpManager extends AlertingNotificationManager {
* Set an entry to be expanded and therefore stick in the heads up area if it's pinned
* until it's collapsed again.
*/
- public void setExpanded(@NonNull NotificationData.Entry entry, boolean expanded) {
+ public void setExpanded(@NonNull NotificationEntry entry, boolean expanded) {
HeadsUpEntry headsUpEntry = getHeadsUpEntry(entry.key);
if (headsUpEntry != null && entry.isRowPinned()) {
headsUpEntry.setExpanded(expanded);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java
deleted file mode 100644
index 710e1df61404..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2017 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.policy;
-
-public interface IconLogger {
-
- void onIconShown(String tag);
- void onIconHidden(String tag);
-
- default void onIconVisibility(String tag, boolean visible) {
- if (visible) {
- onIconShown(tag);
- } else {
- onIconHidden(tag);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
deleted file mode 100644
index ba6369e2c90e..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2017 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.policy;
-
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NUM_STATUS_ICONS;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_ICONS;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.STATUS_BAR_ICONS_CHANGED;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
-import static com.android.systemui.Dependency.BG_LOOPER_NAME;
-
-import android.content.Context;
-import android.metrics.LogMaker;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.ArraySet;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.logging.MetricsLogger;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-public class IconLoggerImpl implements IconLogger {
-
- // Minimum ms between log statements.
- // NonFinalForTesting
- @VisibleForTesting
- protected static long MIN_LOG_INTERVAL = 1000;
-
- private final Context mContext;
- private final Handler mHandler;
- private final MetricsLogger mLogger;
- private final ArraySet<String> mIcons = new ArraySet<>();
- private final List<String> mIconIndex;
- private long mLastLog = System.currentTimeMillis();
-
- @Inject
- public IconLoggerImpl(Context context, @Named(BG_LOOPER_NAME) Looper bgLooper,
- MetricsLogger logger) {
- mContext = context;
- mHandler = new Handler(bgLooper);
- mLogger = logger;
- String[] icons = mContext.getResources().getStringArray(
- com.android.internal.R.array.config_statusBarIcons);
- mIconIndex = Arrays.asList(icons);
- doLog();
- }
-
- @Override
- public void onIconShown(String tag) {
- synchronized (mIcons) {
- if (mIcons.contains(tag)) return;
- mIcons.add(tag);
- }
- if (!mHandler.hasCallbacks(mLog)) {
- mHandler.postDelayed(mLog, MIN_LOG_INTERVAL);
- }
- }
-
- @Override
- public void onIconHidden(String tag) {
- synchronized (mIcons) {
- if (!mIcons.contains(tag)) return;
- mIcons.remove(tag);
- }
- if (!mHandler.hasCallbacks(mLog)) {
- mHandler.postDelayed(mLog, MIN_LOG_INTERVAL);
- }
- }
-
- private void doLog() {
- long time = System.currentTimeMillis();
- long timeSinceLastLog = time - mLastLog;
- mLastLog = time;
-
- ArraySet<String> icons;
- synchronized (mIcons) {
- icons = new ArraySet<>(mIcons);
- }
- mLogger.write(new LogMaker(STATUS_BAR_ICONS_CHANGED)
- .setType(TYPE_ACTION)
- .setLatency(timeSinceLastLog)
- .addTaggedData(FIELD_NUM_STATUS_ICONS, icons.size())
- .addTaggedData(FIELD_STATUS_ICONS, getBitField(icons)));
- }
-
- private int getBitField(ArraySet<String> icons) {
- int iconsVisible = 0;
- for (String icon : icons) {
- int index = mIconIndex.indexOf(icon);
- if (index >= 0) {
- iconsVisible |= (1 << index);
- }
- }
- return iconsVisible;
- }
-
- private final Runnable mLog = this::doLog;
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 2b0e708cf290..77c80dd3db57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -545,7 +545,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
@VisibleForTesting
void doUpdateMobileControllers() {
- List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
+ List<SubscriptionInfo> subscriptions = mSubscriptionManager
+ .getActiveSubscriptionInfoList(true);
if (subscriptions == null) {
subscriptions = Collections.emptyList();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java
index 7ad547afdb53..438226ae082d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java
@@ -16,8 +16,7 @@
package com.android.systemui.statusbar.policy;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
/**
* A listener to heads up changes
@@ -33,12 +32,12 @@ public interface OnHeadsUpChangedListener {
/**
* A notification was just pinned to the top.
*/
- default void onHeadsUpPinned(NotificationData.Entry entry) {}
+ default void onHeadsUpPinned(NotificationEntry entry) {}
/**
* A notification was just unpinned from the top.
*/
- default void onHeadsUpUnPinned(NotificationData.Entry entry) {}
+ default void onHeadsUpUnPinned(NotificationEntry entry) {}
/**
* A notification just became a heads up or turned back to its normal state.
@@ -46,5 +45,5 @@ public interface OnHeadsUpChangedListener {
* @param entry the entry of the changed notification
* @param isHeadsUp whether the notification is now a headsUp notification
*/
- default void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {}
+ default void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 866015e84af0..9c4db34b4f76 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.app.ActivityManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.RemoteInput;
@@ -28,6 +29,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.text.Editable;
import android.text.SpannedString;
import android.text.TextWatcher;
@@ -56,7 +58,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.RemoteInputController;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -83,7 +85,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
private RemoteInputController mController;
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private boolean mRemoved;
@@ -180,7 +182,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
}
public static RemoteInputView inflate(Context context, ViewGroup root,
- NotificationData.Entry entry,
+ NotificationEntry entry,
RemoteInputController controller) {
RemoteInputView v = (RemoteInputView)
LayoutInflater.from(context).inflate(R.layout.remote_input, root, false);
@@ -283,6 +285,11 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
focus();
}
+ private static UserHandle computeTextOperationUser(UserHandle notificationUser) {
+ return UserHandle.ALL.equals(notificationUser)
+ ? UserHandle.of(ActivityManager.getCurrentUser()) : notificationUser;
+ }
+
public void focus() {
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_REMOTE_INPUT_OPEN,
mEntry.notification.getPackageName());
@@ -291,6 +298,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
if (mWrapper != null) {
mWrapper.setRemoteInputVisible(true);
}
+ mEditText.setTextOperationUser(computeTextOperationUser(mEntry.notification.getUser()));
mEditText.setInnerFocusable(true);
mEditText.mShowImeOnInputConnection = true;
mEditText.setText(mEntry.remoteInputText);
@@ -320,6 +328,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
mResetting = true;
mEntry.remoteInputTextWhenReset = SpannedString.valueOf(mEditText.getText());
+ mEditText.setTextOperationUser(null);
mEditText.getText().clear();
mEditText.setEnabled(true);
mSendButton.setVisibility(VISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
index 6193159ec0a5..3bd0d456dbd3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy;
import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
+import android.app.RemoteInput;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
@@ -42,14 +43,21 @@ public final class SmartReplyConstants extends ContentObserver {
private static final String KEY_REQUIRES_TARGETING_P = "requires_targeting_p";
private static final String KEY_MAX_SQUEEZE_REMEASURE_ATTEMPTS =
"max_squeeze_remeasure_attempts";
+ private static final String KEY_EDIT_CHOICES_BEFORE_SENDING =
+ "edit_choices_before_sending";
+ private static final String KEY_SHOW_IN_HEADS_UP = "show_in_heads_up";
private final boolean mDefaultEnabled;
private final boolean mDefaultRequiresP;
private final int mDefaultMaxSqueezeRemeasureAttempts;
+ private final boolean mDefaultEditChoicesBeforeSending;
+ private final boolean mDefaultShowInHeadsUp;
private boolean mEnabled;
private boolean mRequiresTargetingP;
private int mMaxSqueezeRemeasureAttempts;
+ private boolean mEditChoicesBeforeSending;
+ private boolean mShowInHeadsUp;
private final Context mContext;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -66,6 +74,10 @@ public final class SmartReplyConstants extends ContentObserver {
R.bool.config_smart_replies_in_notifications_requires_targeting_p);
mDefaultMaxSqueezeRemeasureAttempts = resources.getInteger(
R.integer.config_smart_replies_in_notifications_max_squeeze_remeasure_attempts);
+ mDefaultEditChoicesBeforeSending = resources.getBoolean(
+ R.bool.config_smart_replies_in_notifications_edit_choices_before_sending);
+ mDefaultShowInHeadsUp = resources.getBoolean(
+ R.bool.config_smart_replies_in_notifications_show_in_heads_up);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS),
@@ -90,6 +102,9 @@ public final class SmartReplyConstants extends ContentObserver {
mRequiresTargetingP = mParser.getBoolean(KEY_REQUIRES_TARGETING_P, mDefaultRequiresP);
mMaxSqueezeRemeasureAttempts = mParser.getInt(
KEY_MAX_SQUEEZE_REMEASURE_ATTEMPTS, mDefaultMaxSqueezeRemeasureAttempts);
+ mEditChoicesBeforeSending = mParser.getBoolean(
+ KEY_EDIT_CHOICES_BEFORE_SENDING, mDefaultEditChoicesBeforeSending);
+ mShowInHeadsUp = mParser.getBoolean(KEY_SHOW_IN_HEADS_UP, mDefaultShowInHeadsUp);
}
}
@@ -113,4 +128,31 @@ public final class SmartReplyConstants extends ContentObserver {
public int getMaxSqueezeRemeasureAttempts() {
return mMaxSqueezeRemeasureAttempts;
}
+
+ /**
+ * Returns whether by tapping on a choice should let the user edit the input before it
+ * is sent to the app.
+ *
+ * @param remoteInputEditChoicesBeforeSending The value from
+ * {@link RemoteInput#getEditChoicesBeforeSending()}
+ */
+ public boolean getEffectiveEditChoicesBeforeSending(
+ @RemoteInput.EditChoicesBeforeSending int remoteInputEditChoicesBeforeSending) {
+ switch (remoteInputEditChoicesBeforeSending) {
+ case RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED:
+ return false;
+ case RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED:
+ return true;
+ case RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO:
+ default:
+ return mEditChoicesBeforeSending;
+ }
+ }
+
+ /**
+ * Returns whether smart suggestions should be enabled in heads-up notifications.
+ */
+ public boolean getShowInHeadsUp() {
+ return mShowInHeadsUp;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index f85d8038ab3f..d6eff941ed70 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -36,8 +36,8 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.SmartReplyController;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import java.text.BreakIterator;
@@ -194,7 +194,7 @@ public class SmartReplyView extends ViewGroup {
*/
public void addRepliesFromRemoteInput(
SmartReplies smartReplies,
- SmartReplyController smartReplyController, NotificationData.Entry entry) {
+ SmartReplyController smartReplyController, NotificationEntry entry) {
if (smartReplies.remoteInput != null && smartReplies.pendingIntent != null) {
if (smartReplies.choices != null) {
for (int i = 0; i < smartReplies.choices.length; ++i) {
@@ -212,7 +212,7 @@ public class SmartReplyView extends ViewGroup {
* notification are shown.
*/
public void addSmartActions(SmartActions smartActions,
- SmartReplyController smartReplyController, NotificationData.Entry entry,
+ SmartReplyController smartReplyController, NotificationEntry entry,
HeadsUpManager headsUpManager) {
int numSmartActions = smartActions.actions.size();
for (int n = 0; n < numSmartActions; n++) {
@@ -235,16 +235,15 @@ public class SmartReplyView extends ViewGroup {
@VisibleForTesting
Button inflateReplyButton(Context context, ViewGroup root, int replyIndex,
SmartReplies smartReplies, SmartReplyController smartReplyController,
- NotificationData.Entry entry) {
+ NotificationEntry entry) {
Button b = (Button) LayoutInflater.from(context).inflate(
R.layout.smart_reply_button, root, false);
CharSequence choice = smartReplies.choices[replyIndex];
b.setText(choice);
OnDismissAction action = () -> {
- // TODO(b/111437455): Also for EDIT_CHOICES_BEFORE_SENDING_AUTO, depending on flags.
- if (smartReplies.remoteInput.getEditChoicesBeforeSending()
- == RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED) {
+ if (mConstants.getEffectiveEditChoicesBeforeSending(
+ smartReplies.remoteInput.getEditChoicesBeforeSending())) {
entry.remoteInputText = choice;
mRemoteInputManager.activateRemoteInput(b,
new RemoteInput[] { smartReplies.remoteInput }, smartReplies.remoteInput,
@@ -289,7 +288,7 @@ public class SmartReplyView extends ViewGroup {
@VisibleForTesting
Button inflateActionButton(Context context, ViewGroup root, int actionIndex,
SmartActions smartActions, SmartReplyController smartReplyController,
- NotificationData.Entry entry, HeadsUpManager headsUpManager) {
+ NotificationEntry entry, HeadsUpManager headsUpManager) {
Notification.Action action = smartActions.actions.get(actionIndex);
Button button = (Button) LayoutInflater.from(context).inflate(
R.layout.smart_action_button, root, false);
@@ -311,8 +310,6 @@ public class SmartReplyView extends ViewGroup {
headsUpManager.removeNotification(entry.key, true);
}));
- // TODO(b/119010281): handle accessibility
-
// Mark this as an Action button
final LayoutParams lp = (LayoutParams) button.getLayoutParams();
lp.buttonType = SmartButtonType.ACTION;
@@ -428,9 +425,9 @@ public class SmartReplyView extends ViewGroup {
markButtonsWithPendingSqueezeStatusAs(
LayoutParams.SQUEEZE_STATUS_FAILED, coveredSuggestions);
- // The current button doesn't fit, so there's no point in measuring further
- // buttons.
- break;
+ // The current button doesn't fit, keep on adding lower-priority buttons in case
+ // any of those fit.
+ continue;
}
// The current button fits, so mark all squeezed buttons as "successfully squeezed"
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
new file mode 100644
index 000000000000..52cabe278e2d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.RectF;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.util.AttributeSet;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
+import android.view.Display;
+import android.view.DisplayInfo;
+import android.widget.ImageView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.notification.AnimatableProperty;
+import com.android.systemui.statusbar.notification.PropertyAnimator;
+import com.android.systemui.statusbar.notification.stack.AnimationProperties;
+import com.android.systemui.statusbar.phone.ScrimState;
+
+/**
+ * A view that draws mask upon either image wallpaper or music album art in AOD.
+ */
+public class AodMaskView extends ImageView implements StatusBarStateController.StateListener,
+ ImageWallpaperTransformer.TransformationListener {
+ private static final String TAG = AodMaskView.class.getSimpleName();
+ private static final int TRANSITION_DURATION = 1000;
+
+ private static final AnimatableProperty TRANSITION_PROGRESS = AnimatableProperty.from(
+ "transition_progress",
+ AodMaskView::setTransitionAmount,
+ AodMaskView::getTransitionAmount,
+ R.id.aod_mask_transition_progress_tag,
+ R.id.aod_mask_transition_progress_start_tag,
+ R.id.aod_mask_transition_progress_end_tag
+ );
+
+ private final AnimationProperties mTransitionProperties = new AnimationProperties();
+ private final ImageWallpaperTransformer mTransformer;
+ private final RectF mBounds = new RectF();
+ private boolean mChangingStates;
+ private boolean mNeedMask;
+ private float mTransitionAmount;
+ private final WallpaperManager mWallpaperManager;
+ private final DisplayManager mDisplayManager;
+ private DisplayListener mDisplayListener = new DisplayListener() {
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ // We just support DEFAULT_DISPLAY currently.
+ if (displayId == Display.DEFAULT_DISPLAY) {
+ mTransformer.updateDisplayInfo(getDisplayInfo(displayId));
+ }
+ }
+ };
+
+ public AodMaskView(Context context) {
+ this(context, null);
+ }
+
+ public AodMaskView(Context context, AttributeSet attrs) {
+ this(context, attrs, null);
+ }
+
+ @VisibleForTesting
+ public AodMaskView(Context context, AttributeSet attrs, ImageWallpaperTransformer transformer) {
+ super(context, attrs);
+ setClickable(false);
+
+ StatusBarStateController controller = Dependency.get(StatusBarStateController.class);
+ if (controller != null) {
+ controller.addCallback(this);
+ } else {
+ Log.d(TAG, "Can not get StatusBarStateController!");
+ }
+
+ mDisplayManager = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+ mDisplayManager.registerDisplayListener(mDisplayListener, null);
+ mWallpaperManager =
+ (WallpaperManager) getContext().getSystemService(Context.WALLPAPER_SERVICE);
+
+ if (transformer == null) {
+ mTransformer = new ImageWallpaperTransformer(this);
+ mTransformer.addFilter(new ScrimFilter());
+ mTransformer.addFilter(new VignetteFilter());
+ mTransformer.updateOffsets();
+ mTransformer.updateDisplayInfo(getDisplayInfo(Display.DEFAULT_DISPLAY));
+
+ mTransitionProperties.setDuration(TRANSITION_DURATION);
+ mTransitionProperties.setAnimationFinishListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mTransformer.setIsTransiting(false);
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mTransformer.setIsTransiting(true);
+ }
+ });
+ } else {
+ // This part should only be hit by test cases.
+ mTransformer = transformer;
+ }
+ }
+
+ private DisplayInfo getDisplayInfo(int displayId) {
+ DisplayInfo displayInfo = new DisplayInfo();
+ mDisplayManager.getDisplay(displayId).getDisplayInfo(displayInfo);
+ return displayInfo;
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ mBounds.set(0, 0, w, h);
+ mTransformer.updateOffsets();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ if (mNeedMask) {
+ mTransformer.drawTransformedImage(canvas, null /* target */, null /* src */, mBounds);
+ }
+ }
+
+ private boolean checkIfNeedMask() {
+ // We need mask for ImageWallpaper / LockScreen Wallpaper (Music album art).
+ return mWallpaperManager.getWallpaperInfo() == null || ScrimState.AOD.hasBackdrop();
+ }
+
+ @Override
+ public void onStatePreChange(int oldState, int newState) {
+ mChangingStates = oldState != newState;
+ mNeedMask = checkIfNeedMask();
+ }
+
+ @Override
+ public void onStatePostChange() {
+ mChangingStates = false;
+ }
+
+ @Override
+ public void onStateChanged(int newState) {
+ }
+
+ @Override
+ public void onDozingChanged(boolean isDozing) {
+ if (!mNeedMask) {
+ return;
+ }
+
+ boolean enabled = checkFeatureIsEnabled();
+ mTransformer.updateAmbientModeState(enabled && isDozing);
+
+ if (enabled && !mChangingStates) {
+ setAnimatorProperty(isDozing);
+ } else {
+ invalidate();
+ }
+ }
+
+ private boolean checkFeatureIsEnabled() {
+ return FeatureFlagUtils.isEnabled(
+ getContext(), FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED);
+ }
+
+ @VisibleForTesting
+ void setAnimatorProperty(boolean isDozing) {
+ PropertyAnimator.setProperty(
+ this,
+ TRANSITION_PROGRESS,
+ isDozing ? 1f : 0f /* newEndValue */,
+ mTransitionProperties,
+ true /* animated */);
+ }
+
+ @Override
+ public void onTransformationUpdated() {
+ invalidate();
+ }
+
+ private void setTransitionAmount(float amount) {
+ mTransitionAmount = amount;
+ mTransformer.updateTransitionAmount(amount);
+ }
+
+ private float getTransitionAmount() {
+ return mTransitionAmount;
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperFilter.java b/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperFilter.java
new file mode 100644
index 000000000000..d457dac3e14f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperFilter.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.RectF;
+
+/**
+ * Abstract filter used by static image wallpaper.
+ */
+abstract class ImageWallpaperFilter {
+ protected static final boolean DEBUG = false;
+
+ private ImageWallpaperTransformer mTransformer;
+
+ /**
+ * Apply this filter to the bitmap before drawing on canvas.
+ * @param c The canvas that will draw to.
+ * @param bitmap The bitmap to apply this filter.
+ * @param src The subset of the bitmap to be drawn.
+ * @param dest The rectangle that the bitmap will be scaled/translated to fit into.
+ */
+ public abstract void apply(@NonNull Canvas c, @Nullable Bitmap bitmap,
+ @Nullable Rect src, @NonNull RectF dest);
+
+ /**
+ * Notifies the occurrence of built-in transition of the animation.
+ * @param animator The animator which was animated.
+ */
+ public abstract void onAnimatorUpdate(ValueAnimator animator);
+
+ /**
+ * Notifies the occurrence of another transition of the animation.
+ * @param amount The transition amount.
+ */
+ public abstract void onTransitionAmountUpdate(float amount);
+
+ /**
+ * To set the associated transformer.
+ * @param transformer The transformer that is associated with this filter.
+ */
+ public void setTransformer(ImageWallpaperTransformer transformer) {
+ if (transformer != null) {
+ mTransformer = transformer;
+ }
+ }
+
+ protected ImageWallpaperTransformer getTransformer() {
+ return mTransformer;
+ }
+
+ /**
+ * Notifies the changing of the offset value of the ImageWallpaper.
+ * @param force True to force re-evaluate offsets.
+ * @param xOffset X offset of the ImageWallpaper in percentage.
+ * @param yOffset Y offset of the ImageWallpaper in percentage.
+ */
+ public void onOffsetsUpdate(boolean force, float xOffset, float yOffset) {
+ // No-op
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperTransformer.java b/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperTransformer.java
new file mode 100644
index 000000000000..25b0b0aaf60b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/ImageWallpaperTransformer.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.view.DisplayInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class is used to manage the filters that will be applied.
+ */
+public class ImageWallpaperTransformer {
+ private static final String TAG = ImageWallpaperTransformer.class.getSimpleName();
+
+ private DisplayInfo mDisplayInfo;
+ private final List<ImageWallpaperFilter> mFilters;
+ private final TransformationListener mListener;
+ private boolean mIsInAmbientMode;
+ private boolean mIsTransiting;
+
+ /**
+ * Constructor.
+ * @param listener A listener to inform you the transformation has updated.
+ */
+ public ImageWallpaperTransformer(TransformationListener listener) {
+ mFilters = new ArrayList<>();
+ mListener = listener;
+ }
+
+ /**
+ * Claim that we want to use the specified filter.
+ * @param filter The filter will be used.
+ */
+ public void addFilter(ImageWallpaperFilter filter) {
+ if (filter != null) {
+ filter.setTransformer(this);
+ mFilters.add(filter);
+ }
+ }
+
+ /**
+ * Check if any transition is running.
+ * @return True if the transition is running, false otherwise.
+ */
+ boolean isTransiting() {
+ return mIsTransiting;
+ }
+
+ /**
+ * Indicate if any transition is running. <br/>
+ * @param isTransiting True if the transition is running.
+ */
+ void setIsTransiting(boolean isTransiting) {
+ mIsTransiting = isTransiting;
+ }
+
+ /**
+ * Check if the device is in ambient mode.
+ * @return True if the device is in ambient mode, false otherwise.
+ */
+ public boolean isInAmbientMode() {
+ return mIsInAmbientMode;
+ }
+
+ /**
+ * Update current state of ambient mode.
+ * @param isInAmbientMode Current ambient mode state.
+ */
+ public void updateAmbientModeState(boolean isInAmbientMode) {
+ mIsInAmbientMode = isInAmbientMode;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ int idx = 0;
+ for (ImageWallpaperFilter filter : mFilters) {
+ sb.append(idx++).append(": ").append(filter.getClass().getSimpleName()).append("\n");
+ }
+ if (sb.length() == 0) {
+ sb.append("No filters applied");
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Set a new display info.
+ * @param displayInfo New display info.
+ */
+ public void updateDisplayInfo(DisplayInfo displayInfo) {
+ mDisplayInfo = displayInfo;
+ }
+
+ /**
+ * To get current display info.
+ * @return Current display info.
+ */
+ public DisplayInfo getDisplayInfo() {
+ return mDisplayInfo;
+ }
+
+ /**
+ * Update the offsets with default value.
+ */
+ public void updateOffsets() {
+ this.updateOffsets(true, 0f, .5f);
+ }
+
+ /**
+ * To notify the filters that the offset of the ImageWallpaper changes.
+ * @param force True to force re-evaluate offsets.
+ * @param offsetX X offset of the ImageWallpaper in percentage.
+ * @param offsetY Y offset of the ImageWallpaper in percentage.
+ */
+ public void updateOffsets(boolean force, float offsetX, float offsetY) {
+ mFilters.forEach(filter -> filter.onOffsetsUpdate(force, offsetX, offsetY));
+ }
+
+ /**
+ * Apply all specified filters to the bitmap then draw to the canvas.
+ * @param c The canvas that will draw to.
+ * @param target The bitmap to apply filters.
+ * @param src The subset of the bitmap to be drawn
+ * @param dest The rectangle that the bitmap will be scaled/translated to fit into.
+ */
+ void drawTransformedImage(@NonNull Canvas c, @Nullable Bitmap target,
+ @Nullable Rect src, @NonNull RectF dest) {
+ mFilters.forEach(filter -> filter.apply(c, target, src, dest));
+ }
+
+ /**
+ * Update the transition amount. <br/>
+ * Must invoke this to update transition amount if not running built-in transition.
+ * @param amount The transition amount.
+ */
+ void updateTransitionAmount(float amount) {
+ mFilters.forEach(filter -> filter.onTransitionAmountUpdate(amount));
+ if (mListener != null) {
+ mListener.onTransformationUpdated();
+ }
+ }
+
+ /**
+ * An interface that informs the transformation status.
+ */
+ public interface TransformationListener {
+ /**
+ * Notifies the update of the transformation.
+ */
+ void onTransformationUpdated();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/ScrimFilter.java b/packages/SystemUI/src/com/android/systemui/wallpaper/ScrimFilter.java
new file mode 100644
index 000000000000..637e48e67de6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/ScrimFilter.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import android.animation.ValueAnimator;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+
+/**
+ * A filter that implements 70% black scrim effect.
+ */
+public class ScrimFilter extends ImageWallpaperFilter {
+ private static final int MAX_ALPHA = (int) (255 * .7f);
+ private static final int MIN_ALPHA = 0;
+
+ private final Paint mPaint;
+
+ public ScrimFilter() {
+ mPaint = new Paint();
+ mPaint.setColor(Color.BLACK);
+ mPaint.setAlpha(MAX_ALPHA);
+ }
+
+ @Override
+ public void apply(Canvas c, Bitmap bitmap, Rect src, RectF dest) {
+ ImageWallpaperTransformer transformer = getTransformer();
+
+ // If it is not in the transition, we need to set the property according to aod state.
+ if (!transformer.isTransiting()) {
+ mPaint.setAlpha(transformer.isInAmbientMode() ? MAX_ALPHA : MIN_ALPHA);
+ }
+
+ c.drawRect(dest, mPaint);
+ }
+
+ @Override
+ public void onAnimatorUpdate(ValueAnimator animator) {
+ ImageWallpaperTransformer transformer = getTransformer();
+ float fraction = animator.getAnimatedFraction();
+ float factor = transformer.isInAmbientMode() ? fraction : 1f - fraction;
+ mPaint.setAlpha((int) (factor * MAX_ALPHA));
+ }
+
+ @Override
+ public void onTransitionAmountUpdate(float amount) {
+ mPaint.setAlpha((int) (amount * MAX_ALPHA));
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/VignetteFilter.java b/packages/SystemUI/src/com/android/systemui/wallpaper/VignetteFilter.java
new file mode 100644
index 000000000000..ad0b98b67e68
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/VignetteFilter.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import android.animation.ValueAnimator;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.PointF;
+import android.graphics.RadialGradient;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.util.Log;
+import android.view.DisplayInfo;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * A filter that implements vignette effect.
+ */
+public class VignetteFilter extends ImageWallpaperFilter {
+ private static final String TAG = VignetteFilter.class.getSimpleName();
+ private static final int MAX_ALPHA = 255;
+ private static final int MIN_ALPHA = 0;
+
+ private final Paint mPaint;
+ private final Matrix mMatrix;
+ private final Shader mShader;
+
+ private float mXOffset;
+ private float mYOffset;
+ private float mCenterX;
+ private float mCenterY;
+ private float mStretchX;
+ private float mStretchY;
+ private boolean mCalculateOffsetNeeded;
+
+ public VignetteFilter() {
+ mPaint = new Paint();
+ mMatrix = new Matrix();
+ mShader = new RadialGradient(0, 0, 1,
+ Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP);
+ }
+
+ @Override
+ public void apply(Canvas c, Bitmap bitmap, Rect src, RectF dest) {
+ DisplayInfo info = getTransformer().getDisplayInfo();
+
+ if (mCalculateOffsetNeeded) {
+ int lw = info.logicalWidth;
+ int lh = info.logicalHeight;
+ mCenterX = lw / 2 + (dest.width() - lw) * mXOffset;
+ mCenterY = lh / 2 + (dest.height() - lh) * mYOffset;
+ mStretchX = info.logicalWidth / 2;
+ mStretchY = info.logicalHeight / 2;
+ mCalculateOffsetNeeded = false;
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "apply: lw=" + info.logicalWidth + ", lh=" + info.logicalHeight
+ + ", center=(" + mCenterX + "," + mCenterY + ")"
+ + ", stretch=(" + mStretchX + "," + mStretchY + ")");
+ }
+
+ mMatrix.reset();
+ mMatrix.postTranslate(mCenterX, mCenterY);
+ mMatrix.postScale(mStretchX, mStretchY, mCenterX, mCenterY);
+ mShader.setLocalMatrix(mMatrix);
+ mPaint.setShader(mShader);
+
+ ImageWallpaperTransformer transformer = getTransformer();
+
+ // If it is not in the transition, we need to set the property according to aod state.
+ if (!transformer.isTransiting()) {
+ mPaint.setAlpha(transformer.isInAmbientMode() ? MAX_ALPHA : MIN_ALPHA);
+ }
+
+ c.drawRect(dest, mPaint);
+ }
+
+ @Override
+ public void onAnimatorUpdate(ValueAnimator animator) {
+ ImageWallpaperTransformer transformer = getTransformer();
+ float fraction = animator.getAnimatedFraction();
+ float factor = transformer.isInAmbientMode() ? fraction : 1f - fraction;
+ mPaint.setAlpha((int) (factor * MAX_ALPHA));
+ }
+
+ @Override
+ public void onTransitionAmountUpdate(float amount) {
+ mPaint.setAlpha((int) (amount * MAX_ALPHA));
+ }
+
+ @Override
+ public void onOffsetsUpdate(boolean force, float xOffset, float yOffset) {
+ if (force || mXOffset != xOffset || mYOffset != yOffset) {
+ mXOffset = xOffset;
+ mYOffset = yOffset;
+ mCalculateOffsetNeeded = true;
+ }
+ }
+
+ @VisibleForTesting
+ public PointF getCenterPoint() {
+ return new PointF(mCenterX, mCenterY);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
index 415060244243..fbc1c20755a1 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
@@ -21,7 +21,6 @@ import static android.view.View.VISIBLE;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -35,22 +34,25 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.text.TextPaint;
import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextClock;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ClockPlugin;
-import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.StatusBarStateController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.function.Consumer;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
// Need to run on the main thread because KeyguardSliceView$Row init checks for
@@ -58,8 +60,8 @@ import org.mockito.MockitoAnnotations;
// the keyguard_clcok_switch layout is inflated.
@RunWithLooper(setAsMainLooper = true)
public class KeyguardClockSwitchTest extends SysuiTestCase {
- private PluginManager mPluginManager;
private FrameLayout mClockContainer;
+ private StatusBarStateController.StateListener mStateListener;
@Mock
TextClock mClockView;
@@ -68,29 +70,13 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
@Before
public void setUp() {
- mPluginManager = mDependency.injectMockDependency(PluginManager.class);
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
mKeyguardClockSwitch =
(KeyguardClockSwitch) layoutInflater.inflate(R.layout.keyguard_clock_switch, null);
mClockContainer = mKeyguardClockSwitch.findViewById(R.id.clock_view);
MockitoAnnotations.initMocks(this);
when(mClockView.getPaint()).thenReturn(mock(TextPaint.class));
- }
-
- @Test
- public void onAttachToWindow_addPluginListener() {
- mKeyguardClockSwitch.onAttachedToWindow();
-
- ArgumentCaptor<PluginListener> listener = ArgumentCaptor.forClass(PluginListener.class);
- verify(mPluginManager).addPluginListener(listener.capture(), eq(ClockPlugin.class));
- }
-
- @Test
- public void onDetachToWindow_removePluginListener() {
- mKeyguardClockSwitch.onDetachedFromWindow();
-
- ArgumentCaptor<PluginListener> listener = ArgumentCaptor.forClass(PluginListener.class);
- verify(mPluginManager).removePluginListener(listener.capture());
+ mStateListener = mKeyguardClockSwitch.getStateListener();
}
@Test
@@ -98,9 +84,8 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
verify(mClockView).setVisibility(GONE);
assertThat(plugin.getView().getParent()).isEqualTo(mClockContainer);
@@ -116,9 +101,8 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getBigClockView()).thenReturn(pluginView);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
// WHEN the plugin is connected
- listener.onPluginConnected(plugin, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
// THEN the big clock container is visible and it is the parent of the
// big clock view.
assertThat(bigClockContainer.getVisibility()).isEqualTo(VISIBLE);
@@ -128,8 +112,7 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
@Test
public void onPluginConnected_nullView() {
ClockPlugin plugin = mock(ClockPlugin.class);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
verify(mClockView, never()).setVisibility(GONE);
}
@@ -138,27 +121,36 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
// GIVEN a plugin has already connected
ClockPlugin plugin1 = mock(ClockPlugin.class);
when(plugin1.getView()).thenReturn(new TextClock(getContext()));
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin1, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin1);
// WHEN a second plugin is connected
ClockPlugin plugin2 = mock(ClockPlugin.class);
when(plugin2.getView()).thenReturn(new TextClock(getContext()));
- listener.onPluginConnected(plugin2, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin2);
// THEN only the view from the second plugin should be a child of KeyguardClockSwitch.
assertThat(plugin2.getView().getParent()).isEqualTo(mClockContainer);
assertThat(plugin1.getView().getParent()).isNull();
}
@Test
+ public void onPluginConnected_darkAmountInitialized() {
+ // GIVEN that the dark amount has already been set
+ mKeyguardClockSwitch.setDarkAmount(0.5f);
+ // WHEN a plugin is connected
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
+ // THEN dark amount should be initalized on the plugin.
+ verify(plugin).setDarkAmount(0.5f);
+ }
+
+ @Test
public void onPluginDisconnected_showDefaultClock() {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
mClockView.setVisibility(GONE);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
- listener.onPluginDisconnected(plugin);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(null);
verify(mClockView).setVisibility(VISIBLE);
assertThat(plugin.getView().getParent()).isNull();
@@ -174,10 +166,9 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getBigClockView()).thenReturn(pluginView);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
- // WHEN the plugin is disconnected
- listener.onPluginDisconnected(plugin);
+ // WHEN the plugin is connected and then disconnected
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(null);
// THEN the big lock container is GONE and the big clock view doesn't have
// a parent.
assertThat(bigClockContainer.getVisibility()).isEqualTo(GONE);
@@ -187,41 +178,23 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
@Test
public void onPluginDisconnected_nullView() {
ClockPlugin plugin = mock(ClockPlugin.class);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
- listener.onPluginDisconnected(plugin);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(null);
verify(mClockView, never()).setVisibility(GONE);
}
@Test
- public void onPluginDisconnected_firstOfTwoDisconnected() {
- // GIVEN two plugins are connected
- ClockPlugin plugin1 = mock(ClockPlugin.class);
- when(plugin1.getView()).thenReturn(new TextClock(getContext()));
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin1, null);
- ClockPlugin plugin2 = mock(ClockPlugin.class);
- when(plugin2.getView()).thenReturn(new TextClock(getContext()));
- listener.onPluginConnected(plugin2, null);
- // WHEN the first plugin is disconnected
- listener.onPluginDisconnected(plugin1);
- // THEN the view from the second plugin is still a child of KeyguardClockSwitch.
- assertThat(plugin2.getView().getParent()).isEqualTo(mClockContainer);
- assertThat(plugin1.getView().getParent()).isNull();
- }
-
- @Test
public void onPluginDisconnected_secondOfTwoDisconnected() {
// GIVEN two plugins are connected
ClockPlugin plugin1 = mock(ClockPlugin.class);
when(plugin1.getView()).thenReturn(new TextClock(getContext()));
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin1, null);
+ Consumer<ClockPlugin> consumer = mKeyguardClockSwitch.getClockPluginConsumer();
+ consumer.accept(plugin1);
ClockPlugin plugin2 = mock(ClockPlugin.class);
when(plugin2.getView()).thenReturn(new TextClock(getContext()));
- listener.onPluginConnected(plugin2, null);
+ consumer.accept(plugin2);
// WHEN the second plugin is disconnected
- listener.onPluginDisconnected(plugin2);
+ consumer.accept(null);
// THEN the default clock should be shown.
verify(mClockView).setVisibility(VISIBLE);
assertThat(plugin1.getView().getParent()).isNull();
@@ -240,8 +213,7 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
mKeyguardClockSwitch.setTextColor(Color.WHITE);
@@ -265,11 +237,34 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
Style style = mock(Style.class);
- PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
- listener.onPluginConnected(plugin, null);
+ mKeyguardClockSwitch.getClockPluginConsumer().accept(plugin);
mKeyguardClockSwitch.setStyle(style);
verify(plugin).setStyle(style);
}
+
+ @Test
+ public void onStateChanged_InvisibleInShade() {
+ // GIVEN that the big clock container is visible
+ ViewGroup container = mock(ViewGroup.class);
+ when(container.getVisibility()).thenReturn(View.VISIBLE);
+ mKeyguardClockSwitch.setBigClockContainer(container);
+ // WHEN transitioned to SHADE state
+ mStateListener.onStateChanged(StatusBarState.SHADE);
+ // THEN the container is invisible.
+ verify(container).setVisibility(View.INVISIBLE);
+ }
+
+ @Test
+ public void onStateChanged_VisibleInKeyguard() {
+ // GIVEN that the big clock container is invisible
+ ViewGroup container = mock(ViewGroup.class);
+ when(container.getVisibility()).thenReturn(View.INVISIBLE);
+ mKeyguardClockSwitch.setBigClockContainer(container);
+ // WHEN transitioned to KEYGUARD state
+ mStateListener.onStateChanged(StatusBarState.KEYGUARD);
+ // THEN the container is visible.
+ verify(container).setVisibility(View.VISIBLE);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java
new file mode 100644
index 000000000000..9e946faf2a52
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public final class BubbleClockControllerTest extends SysuiTestCase {
+
+ private BubbleClockController mClockController;
+
+ @Before
+ public void setUp() {
+ LayoutInflater layoutInflater = LayoutInflater.from(getContext());
+ mClockController = BubbleClockController.build(layoutInflater);
+ }
+
+ @Test
+ public void setDarkAmount_fadeIn() {
+ ViewGroup smallClockFrame = (ViewGroup) mClockController.getView();
+ View smallClock = smallClockFrame.getChildAt(0);
+ // WHEN dark amount is set to AOD
+ mClockController.setDarkAmount(1f);
+ // THEN small clock should not be shown.
+ assertThat(smallClock.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void setTextColor_setDigitalClock() {
+ ViewGroup smallClock = (ViewGroup) mClockController.getView();
+ // WHEN text color is set
+ mClockController.setTextColor(42);
+ // THEN child of small clock should have text color set.
+ TextView digitalClock = (TextView) smallClock.getChildAt(0);
+ assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/CrossFadeDarkControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/CrossFadeDarkControllerTest.java
new file mode 100644
index 000000000000..fd7657ff18cc
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/CrossFadeDarkControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public final class CrossFadeDarkControllerTest extends SysuiTestCase {
+
+ private View mViewFadeIn;
+ private View mViewFadeOut;
+ private CrossFadeDarkController mDarkController;
+
+ @Before
+ public void setUp() {
+ mViewFadeIn = new TextView(getContext());
+ mViewFadeIn.setVisibility(View.VISIBLE);
+ mViewFadeIn.setAlpha(1f);
+ mViewFadeOut = new TextView(getContext());
+ mViewFadeOut.setVisibility(View.VISIBLE);
+ mViewFadeOut.setAlpha(1f);
+
+ mDarkController = new CrossFadeDarkController(mViewFadeIn, mViewFadeOut);
+ }
+
+ @Test
+ public void setDarkAmount_fadeIn() {
+ // WHEN dark amount corresponds to AOD
+ mDarkController.setDarkAmount(1f);
+ // THEN fade in view should be faded in and fade out view faded out.
+ assertThat(mViewFadeIn.getAlpha()).isEqualTo(1f);
+ assertThat(mViewFadeIn.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mViewFadeOut.getAlpha()).isEqualTo(0f);
+ assertThat(mViewFadeOut.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void setDarkAmount_fadeOut() {
+ // WHEN dark amount corresponds to lock screen
+ mDarkController.setDarkAmount(0f);
+ // THEN fade out view should bed faded out and fade in view faded in.
+ assertThat(mViewFadeIn.getAlpha()).isEqualTo(0f);
+ assertThat(mViewFadeIn.getVisibility()).isEqualTo(View.GONE);
+ assertThat(mViewFadeOut.getAlpha()).isEqualTo(1f);
+ assertThat(mViewFadeOut.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void setDarkAmount_partialFadeIn() {
+ // WHEN dark amount corresponds to a partial transition
+ mDarkController.setDarkAmount(0.9f);
+ // THEN views should have intermediate alpha value.
+ assertThat(mViewFadeIn.getAlpha()).isGreaterThan(0f);
+ assertThat(mViewFadeIn.getAlpha()).isLessThan(1f);
+ assertThat(mViewFadeIn.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void setDarkAmount_partialFadeOut() {
+ // WHEN dark amount corresponds to a partial transition
+ mDarkController.setDarkAmount(0.1f);
+ // THEN views should have intermediate alpha value.
+ assertThat(mViewFadeOut.getAlpha()).isGreaterThan(0f);
+ assertThat(mViewFadeOut.getAlpha()).isLessThan(1f);
+ assertThat(mViewFadeOut.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java
new file mode 100644
index 000000000000..8de8f3d0674d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2019 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.keyguard.clock;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public final class StretchAnalogClockControllerTest extends SysuiTestCase {
+
+ private StretchAnalogClockController mClockController;
+
+ @Before
+ public void setUp() {
+ LayoutInflater layoutInflater = LayoutInflater.from(getContext());
+ mClockController = StretchAnalogClockController.build(layoutInflater);
+ }
+
+ @Test
+ public void setDarkAmount_fadeIn() {
+ ViewGroup smallClockFrame = (ViewGroup) mClockController.getView();
+ View smallClock = smallClockFrame.getChildAt(0);
+ // WHEN dark amount is set to AOD
+ mClockController.setDarkAmount(1f);
+ // THEN small clock should not be shown.
+ assertThat(smallClock.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void setTextColor_setDigitalClock() {
+ ViewGroup smallClock = (ViewGroup) mClockController.getView();
+ // WHEN text color is set
+ mClockController.setTextColor(42);
+ // THEN child of small clock should have text color set.
+ TextView digitalClock = (TextView) smallClock.getChildAt(0);
+ assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
index 199a3a62d72b..31e8071f5677 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
@@ -36,9 +36,9 @@ import android.support.test.runner.AndroidJUnit4;
import android.widget.RemoteViews;
import com.android.internal.messages.nano.SystemMessageProto;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import org.junit.Before;
import org.junit.Test;
@@ -391,19 +391,19 @@ public class ForegroundServiceControllerTest extends SysuiTestCase {
}
private void entryRemoved(StatusBarNotification notification) {
- mEntryListener.onEntryRemoved(new NotificationData.Entry(notification),
- null, null, null, false, false);
+ mEntryListener.onEntryRemoved(new NotificationEntry(notification),
+ null, false);
}
private void entryAdded(StatusBarNotification notification, int importance) {
- NotificationData.Entry entry = new NotificationData.Entry(notification);
+ NotificationEntry entry = new NotificationEntry(notification);
entry.importance = importance;
mEntryListener.onPendingEntryAdded(entry);
}
private void entryUpdated(StatusBarNotification notification, int importance) {
- NotificationData.Entry entry = new NotificationData.Entry(notification);
+ NotificationEntry entry = new NotificationEntry(notification);
entry.importance = importance;
- mEntryListener.onEntryUpdated(entry);
+ mEntryListener.onPostEntryUpdated(entry);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
index 521d5d10a621..53ad0b5132c0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
@@ -16,17 +16,12 @@
package com.android.systemui;
-
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.graphics.Bitmap;
@@ -58,13 +53,15 @@ public class ImageWallpaperTest extends SysuiTestCase {
@Mock private SurfaceHolder mSurfaceHolder;
@Mock private DisplayInfo mDisplayInfo;
- CountDownLatch mEventCountdown;
+ private CountDownLatch mEventCountdown;
+ private CountDownLatch mAmbientEventCountdown;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mEventCountdown = new CountDownLatch(1);
+ mAmbientEventCountdown = new CountDownLatch(2);
mImageWallpaper = new ImageWallpaper() {
@Override
@@ -86,6 +83,11 @@ public class ImageWallpaperTest extends SysuiTestCase {
assertTrue("mFixedSizeAllowed should be true", allowed);
mEventCountdown.countDown();
}
+
+ @Override
+ public void onAmbientModeChanged(boolean inAmbientMode, long duration) {
+ mAmbientEventCountdown.countDown();
+ }
};
}
};
@@ -132,4 +134,23 @@ public class ImageWallpaperTest extends SysuiTestCase {
verify(mSurfaceHolder, times(1)).setFixedSize(ImageWallpaper.DrawableEngine.MIN_BACKGROUND_WIDTH, ImageWallpaper.DrawableEngine.MIN_BACKGROUND_HEIGHT);
}
+ @Test
+ public void testDeliversAmbientModeChanged() {
+ ImageWallpaper.DrawableEngine wallpaperEngine =
+ (ImageWallpaper.DrawableEngine) mImageWallpaper.onCreateEngine();
+
+ assertEquals("setFixedSizeAllowed should have been called.",
+ 0, mEventCountdown.getCount());
+
+ wallpaperEngine.setCreated(true);
+ wallpaperEngine.doAmbientModeChanged(false, 1000);
+ assertFalse("ambient mode should be false", wallpaperEngine.isInAmbientMode());
+ assertEquals("onAmbientModeChanged should have been called.",
+ 1, mAmbientEventCountdown.getCount());
+
+ wallpaperEngine.doAmbientModeChanged(true, 1000);
+ assertTrue("ambient mode should be true", wallpaperEngine.isInAmbientMode());
+ assertEquals("onAmbientModeChanged should have been called.",
+ 0, mAmbientEventCountdown.getCount());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index 8f2b2d065f72..fa5cf04d56f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -18,6 +18,9 @@ package com.android.systemui.bubbles;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.IActivityManager;
import android.content.Context;
@@ -29,6 +32,9 @@ import android.widget.FrameLayout;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.notification.NotificationEntryListener;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.StatusBarWindowController;
@@ -36,6 +42,8 @@ import com.android.systemui.statusbar.phone.StatusBarWindowController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -45,6 +53,8 @@ import org.mockito.MockitoAnnotations;
public class BubbleControllerTest extends SysuiTestCase {
@Mock
+ private NotificationEntryManager mNotificationEntryManager;
+ @Mock
private WindowManager mWindowManager;
@Mock
private IActivityManager mActivityManager;
@@ -52,17 +62,24 @@ public class BubbleControllerTest extends SysuiTestCase {
private DozeParameters mDozeParameters;
@Mock
private FrameLayout mStatusBarView;
+ @Captor
+ private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor;
private TestableBubbleController mBubbleController;
private StatusBarWindowController mStatusBarWindowController;
+ private NotificationEntryListener mEntryListener;
private NotificationTestHelper mNotificationTestHelper;
private ExpandableNotificationRow mRow;
private ExpandableNotificationRow mRow2;
+ @Mock
+ private NotificationData mNotificationData;
+
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
// Bubbles get added to status bar window view
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
@@ -74,72 +91,91 @@ public class BubbleControllerTest extends SysuiTestCase {
mRow = mNotificationTestHelper.createBubble();
mRow2 = mNotificationTestHelper.createBubble();
+ // Return non-null notification data from the NEM
+ when(mNotificationEntryManager.getNotificationData()).thenReturn(mNotificationData);
+ when(mNotificationData.getChannel(mRow.getEntry().key)).thenReturn(mRow.getEntry().channel);
+
mBubbleController = new TestableBubbleController(mContext, mStatusBarWindowController);
- }
- @Test
- public void testIsBubble() {
- assertTrue(mRow.getEntry().isBubble());
+ // Get a reference to the BubbleController's entry listener
+ verify(mNotificationEntryManager, atLeastOnce())
+ .addNotificationEntryListener(mEntryListenerCaptor.capture());
+ mEntryListener = mEntryListenerCaptor.getValue();
}
@Test
public void testAddBubble() {
- mBubbleController.addBubble(mRow.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
assertTrue(mBubbleController.hasBubbles());
}
@Test
public void testHasBubbles() {
assertFalse(mBubbleController.hasBubbles());
- mBubbleController.addBubble(mRow.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
assertTrue(mBubbleController.hasBubbles());
}
@Test
public void testRemoveBubble() {
- mBubbleController.addBubble(mRow.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
assertTrue(mBubbleController.hasBubbles());
mBubbleController.removeBubble(mRow.getEntry().key);
assertFalse(mStatusBarWindowController.getBubblesShowing());
+ assertTrue(mRow.getEntry().isBubbleDismissed());
+ verify(mNotificationEntryManager).updateNotifications();
}
@Test
public void testDismissStack() {
- mBubbleController.addBubble(mRow.getEntry());
- mBubbleController.addBubble(mRow2.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
+ mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */);
assertTrue(mBubbleController.hasBubbles());
mBubbleController.dismissStack();
assertFalse(mStatusBarWindowController.getBubblesShowing());
+ verify(mNotificationEntryManager).updateNotifications();
}
@Test
public void testIsStackExpanded() {
assertFalse(mBubbleController.isStackExpanded());
- mBubbleController.addBubble(mRow.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
BubbleStackView stackView = mBubbleController.getStackView();
- stackView.animateExpansion(true /* expanded */);
+ stackView.expandStack();
assertTrue(mBubbleController.isStackExpanded());
- stackView.animateExpansion(false /* expanded */);
+ stackView.collapseStack();
assertFalse(mBubbleController.isStackExpanded());
}
@Test
public void testCollapseStack() {
- mBubbleController.addBubble(mRow.getEntry());
- mBubbleController.addBubble(mRow2.getEntry());
+ mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
+ mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */);
BubbleStackView stackView = mBubbleController.getStackView();
- stackView.animateExpansion(true /* expanded */);
+ stackView.expandStack();
assertTrue(mBubbleController.isStackExpanded());
mBubbleController.collapseStack();
assertFalse(mBubbleController.isStackExpanded());
}
+ @Test
+ public void testMarkNewNotificationAsBubble() {
+ mEntryListener.onPendingEntryAdded(mRow.getEntry());
+ assertTrue(mRow.getEntry().isBubble());
+ }
+
+ @Test
+ public void testMarkNewNotificationAsShowInShade() {
+ mEntryListener.onPendingEntryAdded(mRow.getEntry());
+ assertTrue(mRow.getEntry().showInShadeWhenBubble());
+ }
+
static class TestableBubbleController extends BubbleController {
TestableBubbleController(Context context,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
index ce28b50436eb..dc4287287b03 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
@@ -104,7 +104,7 @@ class DozeHostFake implements DozeHost {
}
@Override
- public void onDoubleTap(float x, float y) {
+ public void onSlpiTap(float x, float y) {
doubleTapX = y;
doubleTapY = y;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index a8ff0b21bab9..cfc19ef28c92 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -44,6 +45,7 @@ import androidx.slice.core.SliceQuery;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.StatusBarStateController;
import org.junit.Assert;
import org.junit.Before;
@@ -67,6 +69,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
private AlarmManager mAlarmManager;
@Mock
private NotificationMediaManager mNotificationMediaManager;
+ @Mock
+ private StatusBarStateController mStatusBarStateController;
private TestableKeyguardSliceProvider mProvider;
private boolean mIsZenMode;
@@ -76,7 +80,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
mIsZenMode = false;
mProvider = new TestableKeyguardSliceProvider();
mProvider.attachInfo(getContext(), null);
- mProvider.initDependencies();
+ mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController);
SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST)));
}
@@ -98,6 +102,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
@Test
public void onBindSlice_readsMedia() {
MediaMetadata metadata = mock(MediaMetadata.class);
+ mProvider.onDozingChanged(true);
mProvider.onMetadataChanged(metadata);
mProvider.onBindSlice(mProvider.getUri());
verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE));
@@ -162,7 +167,31 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
@Test
public void onMetadataChanged_updatesSlice() {
mProvider.onMetadataChanged(mock(MediaMetadata.class));
+ mProvider.onDozingChanged(true);
+ verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));
+
+ // Hides after waking up
+ reset(mContentResolver);
+ mProvider.onDozingChanged(false);
+ verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));
+
+ // And won't update slice if device is awake
+ reset(mContentResolver);
+ mProvider.onMetadataChanged(mock(MediaMetadata.class));
+ verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null));
+ }
+
+ @Test
+ public void onDozingChanged_updatesSliceIfMedia() {
+ // Show media when dozing
+ mProvider.onMetadataChanged(mock(MediaMetadata.class));
+ mProvider.onDozingChanged(true);
verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));
+
+ // Do not notify again if nothing changed
+ reset(mContentResolver);
+ mProvider.onDozingChanged(true);
+ verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null));
}
private class TestableKeyguardSliceProvider extends KeyguardSliceProvider {
@@ -201,11 +230,6 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
protected String getFormattedDateLocked() {
return super.getFormattedDateLocked() + mCounter++;
}
-
- @Override
- public void initDependencies() {
- mMediaManager = mNotificationMediaManager;
- }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
index 458377017fb9..3415c72230e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
@@ -91,7 +91,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase {
mMockPm = mock(PackageManager.class);
mMockListener = mock(PluginListener.class);
mMockManager = mock(PluginManagerImpl.class);
- when(mMockManager.getClassLoader(any(), any())).thenReturn(getClass().getClassLoader());
+ when(mMockManager.getClassLoader(any())).thenReturn(getClass().getClassLoader());
mMockEnabler = mock(PluginEnabler.class);
when(mMockManager.getPluginEnabler()).thenReturn(mMockEnabler);
mMockVersionInfo = mock(VersionInfo.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java
index 76e68f1df724..536c043bd7ae 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java
@@ -25,6 +25,7 @@ import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.test.suitebuilder.annotation.SmallTest;
@@ -135,9 +136,13 @@ public class PluginManagerTest extends SysuiTestCase {
});
resetExceptionHandler();
+ String sourceDir = "myPlugin";
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.sourceDir = sourceDir;
+ applicationInfo.packageName = WHITELISTED_PACKAGE;
mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
- assertNull(mPluginManager.getOneShotPlugin("myPlugin", TestPlugin.class));
- assertNull(mPluginManager.getClassLoader("myPlugin", WHITELISTED_PACKAGE));
+ assertNull(mPluginManager.getOneShotPlugin(sourceDir, TestPlugin.class));
+ assertNull(mPluginManager.getClassLoader(applicationInfo));
}
@Test
@@ -152,9 +157,16 @@ public class PluginManagerTest extends SysuiTestCase {
});
resetExceptionHandler();
+ String sourceDir = "myPlugin";
+ ApplicationInfo whiteListedApplicationInfo = new ApplicationInfo();
+ whiteListedApplicationInfo.sourceDir = sourceDir;
+ whiteListedApplicationInfo.packageName = WHITELISTED_PACKAGE;
+ ApplicationInfo invalidApplicationInfo = new ApplicationInfo();
+ invalidApplicationInfo.sourceDir = sourceDir;
+ invalidApplicationInfo.packageName = "com.android.invalidpackage";
mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
- assertNotNull(mPluginManager.getClassLoader("myPlugin", WHITELISTED_PACKAGE));
- assertNull(mPluginManager.getClassLoader("myPlugin", "com.android.invalidpackage"));
+ assertNotNull(mPluginManager.getClassLoader(whiteListedApplicationInfo));
+ assertNull(mPluginManager.getClassLoader(invalidApplicationInfo));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
index 9d0556f61398..f8957b204021 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
@@ -36,7 +36,7 @@ import android.testing.TestableLooper;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -67,7 +67,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
private AlertingNotificationManager mAlertingNotificationManager;
- protected NotificationData.Entry mEntry;
+ protected NotificationEntry mEntry;
protected Handler mTestHandler;
private StatusBarNotification mSbn;
protected boolean mTimedOut = false;
@@ -119,7 +119,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
public void setUp() {
mTestHandler = Handler.createAsync(Looper.myLooper());
mSbn = createNewNotification(0 /* id */);
- mEntry = new NotificationData.Entry(mSbn);
+ mEntry = new NotificationEntry(mSbn);
mEntry.setRow(mRow);
mAlertingNotificationManager = createAlertingNotificationManager();
@@ -170,7 +170,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase {
public void testReleaseAllImmediately() {
for (int i = 0; i < TEST_NUM_NOTIFICATIONS; i++) {
StatusBarNotification sbn = createNewNotification(i);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.setRow(mRow);
mAlertingNotificationManager.showNotification(entry);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
index 65c04fe4bcd3..c880172e775a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
@@ -31,8 +31,9 @@ import android.testing.TestableLooper;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import org.junit.Before;
import org.junit.Test;
@@ -85,7 +86,7 @@ public class NotificationListenerTest extends SysuiTestCase {
@Test
public void testNotificationUpdateCallsUpdateNotification() {
- when(mNotificationData.get(mSbn.getKey())).thenReturn(new NotificationData.Entry(mSbn));
+ when(mNotificationData.get(mSbn.getKey())).thenReturn(new NotificationEntry(mSbn));
mListener.onNotificationPosted(mSbn, mRanking);
TestableLooper.get(this).processAllMessages();
verify(mEntryManager).updateNotification(mSbn, mRanking);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
index f168a490acf4..d7ca5b410e56 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar;
-import static android.content.Intent.ACTION_DEVICE_LOCKED_CHANGED;
import static android.content.Intent.ACTION_USER_SWITCHED;
import static junit.framework.Assert.assertFalse;
@@ -42,8 +41,8 @@ import android.testing.TestableLooper;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index 150dcb9f841c..c159516d5bde 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -24,8 +24,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputActiveExtender;
import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputHistoryExtender;
import com.android.systemui.statusbar.NotificationRemoteInputManager.SmartReplyHistoryExtender;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.ShadeController;
@@ -60,7 +60,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
private TestableNotificationRemoteInputManager mRemoteInputManager;
private StatusBarNotification mSbn;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private RemoteInputHistoryExtender mRemoteInputHistoryExtender;
private SmartReplyHistoryExtender mSmartReplyHistoryExtender;
private RemoteInputActiveExtender mRemoteInputActiveExtender;
@@ -75,7 +75,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
Handler.createAsync(Looper.myLooper()));
mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID,
0, new Notification(), UserHandle.CURRENT, null, 0);
- mEntry = new NotificationData.Entry(mSbn);
+ mEntry = new NotificationEntry(mSbn);
mEntry.setRow(mRow);
mRemoteInputManager.setUpWithPresenterForTest(mCallback,
@@ -170,7 +170,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
// Setup a notification entry with 1 remote input.
StatusBarNotification newSbn =
mRemoteInputManager.rebuildNotificationWithRemoteInput(mEntry, "A Reply", false);
- NotificationData.Entry entry = new NotificationData.Entry(newSbn);
+ NotificationEntry entry = new NotificationEntry(newSbn);
// Try rebuilding to add another reply.
newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInput(entry, "Reply 2", true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index fb5e8753c935..0b24c2169ea1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -17,13 +17,17 @@
package com.android.systemui.statusbar;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Instrumentation;
import android.app.Notification;
import android.app.NotificationChannel;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
@@ -32,7 +36,7 @@ import android.view.LayoutInflater;
import android.widget.RemoteViews;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag;
import com.android.systemui.statusbar.notification.row.NotificationInflaterTest;
@@ -50,6 +54,8 @@ public class NotificationTestHelper {
public static final String PKG = "com.android.systemui";
/** System UI id for testing purposes. */
public static final int UID = 1000;
+ /** Current {@link UserHandle} of the system. */
+ public static final UserHandle USER_HANDLE = UserHandle.of(ActivityManager.getCurrentUser());
private static final String GROUP_KEY = "gruKey";
@@ -74,7 +80,7 @@ public class NotificationTestHelper {
* @throws Exception
*/
public ExpandableNotificationRow createRow() throws Exception {
- return createRow(PKG, UID);
+ return createRow(PKG, UID, USER_HANDLE);
}
/**
@@ -85,9 +91,9 @@ public class NotificationTestHelper {
* @return a row with a notification using the package and user id
* @throws Exception
*/
- public ExpandableNotificationRow createRow(String pkg, int uid) throws Exception {
- return createRow(pkg, uid, false /* isGroupSummary */, null /* groupKey */,
- false /* isBubble */);
+ public ExpandableNotificationRow createRow(String pkg, int uid, UserHandle userHandle)
+ throws Exception {
+ return createRow(pkg, uid, userHandle, false /* isGroupSummary */, null /* groupKey */);
}
/**
@@ -98,8 +104,7 @@ public class NotificationTestHelper {
* @throws Exception
*/
public ExpandableNotificationRow createRow(Notification notification) throws Exception {
- return generateRow(notification, PKG, UID, 0 /* extraInflationFlags */,
- false /* isBubble */);
+ return generateRow(notification, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */);
}
/**
@@ -112,8 +117,7 @@ public class NotificationTestHelper {
*/
public ExpandableNotificationRow createRow(@InflationFlag int extraInflationFlags)
throws Exception {
- return generateRow(createNotification(), PKG, UID, extraInflationFlags,
- false /* isBubble */);
+ return generateRow(createNotification(), PKG, UID, USER_HANDLE, extraInflationFlags);
}
/**
@@ -134,20 +138,21 @@ public class NotificationTestHelper {
return createGroup(2);
}
- /**
- * Retursn an {@link ExpandableNotificationRow} that should be a bubble.
- */
- public ExpandableNotificationRow createBubble() throws Exception {
- return createRow(PKG, UID, false /* isGroupSummary */, null /* groupKey */,
- true /* isBubble */);
- }
-
private ExpandableNotificationRow createGroupSummary(String groupkey) throws Exception {
- return createRow(PKG, UID, true /* isGroupSummary */, groupkey, false);
+ return createRow(PKG, UID, USER_HANDLE, true /* isGroupSummary */, groupkey);
}
private ExpandableNotificationRow createGroupChild(String groupkey) throws Exception {
- return createRow(PKG, UID, false /* isGroupSummary */, groupkey, false);
+ return createRow(PKG, UID, USER_HANDLE, false /* isGroupSummary */, groupkey);
+ }
+
+ /**
+ * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
+ */
+ public ExpandableNotificationRow createBubble() throws Exception {
+ Notification n = createNotification(false /* isGroupSummary */,
+ null /* groupKey */, true /* isBubble */);
+ return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
}
/**
@@ -157,7 +162,6 @@ public class NotificationTestHelper {
* @param uid uid used for creating a {@link StatusBarNotification}
* @param isGroupSummary whether the notification row is a group summary
* @param groupKey the group key for the notification group used across notifications
- * @param isBubble
* @return a row with that's either a standalone notification or a group notification if the
* groupKey is non-null
* @throws Exception
@@ -165,11 +169,12 @@ public class NotificationTestHelper {
private ExpandableNotificationRow createRow(
String pkg,
int uid,
+ UserHandle userHandle,
boolean isGroupSummary,
- @Nullable String groupKey, boolean isBubble)
+ @Nullable String groupKey)
throws Exception {
Notification notif = createNotification(isGroupSummary, groupKey);
- return generateRow(notif, pkg, uid, 0 /* inflationFlags */, isBubble);
+ return generateRow(notif, pkg, uid, userHandle, 0 /* inflationFlags */);
}
/**
@@ -188,8 +193,20 @@ public class NotificationTestHelper {
* @param groupKey the group key for the notification group used across notifications
* @return a notification that is in the group specified or standalone if unspecified
*/
+ private Notification createNotification(boolean isGroupSummary, @Nullable String groupKey) {
+ return createNotification(isGroupSummary, groupKey, false /* isBubble */);
+ }
+
+ /**
+ * Creates a notification with the given parameters.
+ *
+ * @param isGroupSummary whether the notification is a group summary
+ * @param groupKey the group key for the notification group used across notifications
+ * @param isBubble whether this notification should bubble
+ * @return a notification that is in the group specified or standalone if unspecified
+ */
private Notification createNotification(boolean isGroupSummary,
- @Nullable String groupKey) {
+ @Nullable String groupKey, boolean isBubble) {
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
@@ -207,6 +224,9 @@ public class NotificationTestHelper {
if (!TextUtils.isEmpty(groupKey)) {
notificationBuilder.setGroup(groupKey);
}
+ if (isBubble) {
+ notificationBuilder.setBubbleMetadata(makeBubbleMetadata());
+ }
return notificationBuilder.build();
}
@@ -214,7 +234,20 @@ public class NotificationTestHelper {
Notification notification,
String pkg,
int uid,
- @InflationFlag int extraInflationFlags, boolean isBubble)
+ UserHandle userHandle,
+ @InflationFlag int extraInflationFlags)
+ throws Exception {
+ return generateRow(notification, pkg, uid, userHandle, extraInflationFlags,
+ IMPORTANCE_DEFAULT);
+ }
+
+ private ExpandableNotificationRow generateRow(
+ Notification notification,
+ String pkg,
+ int uid,
+ UserHandle userHandle,
+ @InflationFlag int extraInflationFlags,
+ int importance)
throws Exception {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
mContext.LAYOUT_INFLATER_SERVICE);
@@ -226,7 +259,6 @@ public class NotificationTestHelper {
row.setGroupManager(mGroupManager);
row.setHeadsUpManager(mHeadsUpManager);
row.setAboveShelfChangedListener(aboveShelf -> {});
- UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
StatusBarNotification sbn = new StatusBarNotification(
pkg,
pkg,
@@ -235,16 +267,15 @@ public class NotificationTestHelper {
uid,
2000 /* initialPid */,
notification,
- mUser,
+ userHandle,
null /* overrideGroupKey */,
System.currentTimeMillis());
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.setRow(row);
entry.createIcons(mContext, sbn);
entry.channel = new NotificationChannel(
- notification.getChannelId(), notification.getChannelId(), IMPORTANCE_DEFAULT);
+ notification.getChannelId(), notification.getChannelId(), importance);
entry.channel.setBlockableSystem(true);
- entry.setIsBubble(isBubble);
row.setEntry(entry);
row.getNotificationInflater().addInflationFlags(extraInflationFlags);
NotificationInflaterTest.runThenWaitForInflation(
@@ -257,4 +288,14 @@ public class NotificationTestHelper {
mGroupManager.onEntryAdded(entry);
return row;
}
+
+ private Notification.BubbleMetadata makeBubbleMetadata() {
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ return new Notification.BubbleMetadata.Builder()
+ .setIntent(bubbleIntent)
+ .setTitle("bubble title")
+ .setIcon(Icon.createWithResource(mContext, 1))
+ .setDesiredHeight(314)
+ .build();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
index 8cf4b05b6371..56e1fc6b70de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
@@ -36,12 +36,11 @@ import android.widget.LinearLayout;
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -77,7 +76,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
@Mock private ShadeController mShadeController;
private NotificationViewHierarchyManager mViewHierarchyManager;
- private NotificationTestHelper mHelper = new NotificationTestHelper(mContext);
+ private NotificationTestHelper mHelper;
@Before
public void setUp() {
@@ -90,19 +89,21 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
mDependency.injectTestDependency(ShadeController.class, mShadeController);
+ mHelper = new NotificationTestHelper(mContext);
+
when(mEntryManager.getNotificationData()).thenReturn(mNotificationData);
mViewHierarchyManager = new NotificationViewHierarchyManager(mContext,
mLockscreenUserManager, mGroupManager, mVisualStabilityManager,
- mock(StatusBarStateController.class), mEntryManager, mock(BubbleController.class),
+ mock(StatusBarStateController.class), mEntryManager,
() -> mShadeController);
Dependency.get(InitController.class).executePostInitTasks();
mViewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer);
}
- private NotificationData.Entry createEntry() throws Exception {
+ private NotificationEntry createEntry() throws Exception {
ExpandableNotificationRow row = mHelper.createRow();
- NotificationData.Entry entry = new NotificationData.Entry(row.getStatusBarNotification());
+ NotificationEntry entry = new NotificationEntry(row.getStatusBarNotification());
entry.setRow(row);
return entry;
}
@@ -111,9 +112,9 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
public void testNotificationsBecomingBundled() throws Exception {
// Tests 3 top level notifications becoming a single bundled notification with |entry0| as
// the summary.
- NotificationData.Entry entry0 = createEntry();
- NotificationData.Entry entry1 = createEntry();
- NotificationData.Entry entry2 = createEntry();
+ NotificationEntry entry0 = createEntry();
+ NotificationEntry entry1 = createEntry();
+ NotificationEntry entry2 = createEntry();
// Set up the prior state to look like three top level notifications.
mListContainer.addContainerView(entry0.getRow());
@@ -140,9 +141,9 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
@Test
public void testNotificationsBecomingUnbundled() throws Exception {
// Tests a bundled notification becoming three top level notifications.
- NotificationData.Entry entry0 = createEntry();
- NotificationData.Entry entry1 = createEntry();
- NotificationData.Entry entry2 = createEntry();
+ NotificationEntry entry0 = createEntry();
+ NotificationEntry entry1 = createEntry();
+ NotificationEntry entry2 = createEntry();
entry0.getRow().addChildNotification(entry1.getRow());
entry0.getRow().addChildNotification(entry2.getRow());
@@ -171,8 +172,8 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
@Test
public void testNotificationsBecomingSuppressed() throws Exception {
// Tests two top level notifications becoming a suppressed summary and a child.
- NotificationData.Entry entry0 = createEntry();
- NotificationData.Entry entry1 = createEntry();
+ NotificationEntry entry0 = createEntry();
+ NotificationEntry entry1 = createEntry();
entry0.getRow().addChildNotification(entry1.getRow());
// Set up the prior state to look like a top level notification.
@@ -197,7 +198,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
@Test
public void testUpdateNotificationViews_appOps() throws Exception {
- NotificationData.Entry entry0 = createEntry();
+ NotificationEntry entry0 = createEntry();
entry0.setRow(spy(entry0.getRow()));
when(mNotificationData.getActiveNotifications()).thenReturn(
Lists.newArrayList(entry0));
@@ -262,10 +263,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
public void setMaxDisplayedNotifications(int maxNotifications) {}
@Override
- public void snapViewIfNeeded(Entry entry) {}
-
- @Override
- public ViewGroup getViewParentForNotification(NotificationData.Entry entry) {
+ public ViewGroup getViewParentForNotification(NotificationEntry entry) {
return null;
}
@@ -281,10 +279,10 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
}
@Override
- public void cleanUpViewStateForEntry(Entry entry) { }
+ public void cleanUpViewStateForEntry(NotificationEntry entry) { }
@Override
- public boolean isInVisibleLocation(Entry entry) {
+ public boolean isInVisibleLocation(NotificationEntry entry) {
return true;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
index e7a1f051a6df..6cca434bd8cb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
@@ -36,8 +36,8 @@ import android.testing.TestableLooper;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController;
import org.junit.Before;
@@ -58,7 +58,7 @@ public class SmartReplyControllerTest extends SysuiTestCase {
private static final int TEST_ACTION_COUNT = 3;
private Notification mNotification;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private SmartReplyController mSmartReplyController;
private NotificationRemoteInputManager mRemoteInputManager;
@@ -92,7 +92,7 @@ public class SmartReplyControllerTest extends SysuiTestCase {
mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID,
0, mNotification, new UserHandle(ActivityManager.getCurrentUser()), null, 0);
- mEntry = new NotificationData.Entry(mSbn);
+ mEntry = new NotificationEntry(mSbn);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index 57c9d29b24f4..9ce6ae139998 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -22,18 +22,15 @@ import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.inOrder;
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.AppOpsManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -48,7 +45,6 @@ import android.service.notification.StatusBarNotification;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import android.util.ArraySet;
import android.widget.FrameLayout;
import com.android.internal.logging.MetricsLogger;
@@ -65,7 +61,9 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.StatusBarIconView;
-import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
@@ -76,12 +74,11 @@ import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
-import junit.framework.Assert;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -121,8 +118,9 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
@Mock private MetricsLogger mMetricsLogger;
@Mock private SmartReplyController mSmartReplyController;
@Mock private RowInflaterTask mAsyncInflationTask;
+ @Mock private NotificationRowBinder mMockedRowBinder;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private StatusBarNotification mSbn;
private TestableNotificationEntryManager mEntryManager;
private CountDownLatch mCountDownLatch;
@@ -135,8 +133,12 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
mCountDownLatch = new CountDownLatch(1);
}
+ public void setNotificationData(NotificationData data) {
+ mNotificationData = data;
+ }
+
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
super.onAsyncInflationFinished(entry, inflatedFlags);
@@ -221,7 +223,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
.setContentText("Text");
mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID,
0, n.build(), new UserHandle(ActivityManager.getCurrentUser()), null, 0);
- mEntry = new NotificationData.Entry(mSbn);
+ mEntry = new NotificationEntry(mSbn);
mEntry.expandedIcon = mock(StatusBarIconView.class);
mEntryManager = new TestableNotificationEntryManager(mContext);
@@ -258,10 +260,10 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
verify(mEntryListener, never()).onInflationError(any(), any());
// Row inflation:
- ArgumentCaptor<NotificationData.Entry> entryCaptor = ArgumentCaptor.forClass(
- NotificationData.Entry.class);
+ ArgumentCaptor<NotificationEntry> entryCaptor = ArgumentCaptor.forClass(
+ NotificationEntry.class);
verify(mBindCallback).onBindRow(entryCaptor.capture(), any(), eq(mSbn), any());
- NotificationData.Entry entry = entryCaptor.getValue();
+ NotificationEntry entry = entryCaptor.getValue();
verify(mRemoteInputManager).bindRow(entry.getRow());
// Row content inflation:
@@ -290,14 +292,43 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
verify(mEntryListener, never()).onInflationError(any(), any());
+ verify(mEntryListener).onPreEntryUpdated(mEntry);
verify(mPresenter).updateNotificationViews();
- verify(mEntryListener).onEntryUpdated(mEntry);
+ verify(mEntryListener).onPostEntryUpdated(mEntry);
+
assertNotNull(mEntry.getRow());
assertEquals(mEntry.userSentiment,
NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE);
}
@Test
+ public void testUpdateNotification_prePostEntryOrder() throws Exception {
+ com.android.systemui.util.Assert.isNotMainThread();
+ TestableLooper.get(this).processAllMessages();
+
+ NotificationData notifData = mock(NotificationData.class);
+ when(notifData.get(mEntry.key)).thenReturn(mEntry);
+
+ mEntryManager.setNotificationData(notifData);
+
+ mEntryManager.updateNotification(mSbn, mRankingMap);
+ TestableLooper.get(this).processMessages(1);
+ // Wait for content update.
+ assertTrue(mEntryManager.getCountDownLatch().await(10, TimeUnit.SECONDS));
+
+ verify(mEntryListener, never()).onInflationError(any(), any());
+
+ // Ensure that update callbacks happen in correct order
+ InOrder order = inOrder(mEntryListener, notifData, mPresenter, mEntryListener);
+ order.verify(mEntryListener).onPreEntryUpdated(mEntry);
+ order.verify(notifData).filterAndSort();
+ order.verify(mPresenter).updateNotificationViews();
+ order.verify(mEntryListener).onPostEntryUpdated(mEntry);
+
+ assertNotNull(mEntry.getRow());
+ }
+
+ @Test
public void testRemoveNotification() throws Exception {
com.android.systemui.util.Assert.isNotMainThread();
@@ -308,10 +339,9 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
verify(mEntryListener, never()).onInflationError(any(), any());
- verify(mListContainer).cleanUpViewStateForEntry(mEntry);
verify(mPresenter).updateNotificationViews();
- verify(mEntryListener).onEntryRemoved(mEntry, mSbn.getKey(), mSbn,
- null, false /* lifetimeExtended */, false /* removedByUser */);
+ verify(mEntryListener).onEntryRemoved(
+ mEntry, null, false /* removedByUser */);
verify(mRow).setRemoved();
assertNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
@@ -335,92 +365,31 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
assertNotNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
verify(extender).setShouldManageLifetime(mEntry, true /* shouldManage */);
- verify(mEntryListener).onEntryRemoved(mEntry, mSbn.getKey(), null,
- null, true /* lifetimeExtended */, false /* removedByUser */);
+ verify(mEntryListener, never()).onEntryRemoved(
+ mEntry, null, false /* removedByUser */);
}
@Test
- public void testUpdateAppOps_foregroundNoti() {
+ public void testRemoveNotification_onEntryRemoveNotFiredIfEntryDoesntExist() {
com.android.systemui.util.Assert.isNotMainThread();
- when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
- .thenReturn(mEntry.key);
- mEntry.setRow(mRow);
- mEntryManager.getNotificationData().add(mEntry);
-
- mEntryManager.updateNotificationsForAppOp(
- AppOpsManager.OP_CAMERA, mEntry.notification.getUid(),
- mEntry.notification.getPackageName(), true);
+ mEntryManager.removeNotification("not_a_real_key", mRankingMap);
- verify(mPresenter, times(1)).updateNotificationViews();
- assertTrue(mEntryManager.getNotificationData().get(mEntry.key).mActiveAppOps.contains(
- AppOpsManager.OP_CAMERA));
+ verify(mEntryListener, never()).onEntryRemoved(
+ mEntry, null, false /* removedByUser */);
}
@Test
- public void testUpdateAppOps_otherNoti() {
+ public void testRemoveNotification_whilePending() throws InterruptedException {
com.android.systemui.util.Assert.isNotMainThread();
- when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
- .thenReturn(null);
- mEntryManager.updateNotificationsForAppOp(AppOpsManager.OP_CAMERA, 1000, "pkg", true);
-
- verify(mPresenter, never()).updateNotificationViews();
- }
-
- @Test
- public void testAddNotificationExistingAppOps() {
- mEntry.setRow(mRow);
- mEntryManager.getNotificationData().add(mEntry);
- ArraySet<Integer> expected = new ArraySet<>();
- expected.add(3);
- expected.add(235);
- expected.add(1);
-
- when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn(expected);
- when(mForegroundServiceController.getStandardLayoutKey(
- mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn(mEntry.key);
-
- mEntryManager.tagForeground(mEntry.notification);
-
- Assert.assertEquals(expected.size(), mEntry.mActiveAppOps.size());
- for (int op : expected) {
- assertTrue("Entry missing op " + op, mEntry.mActiveAppOps.contains(op));
- }
- }
+ mEntryManager.setRowBinder(mMockedRowBinder);
- @Test
- public void testAdd_noExistingAppOps() {
- mEntry.setRow(mRow);
- mEntryManager.getNotificationData().add(mEntry);
- when(mForegroundServiceController.getStandardLayoutKey(
- mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn(mEntry.key);
- when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn(null);
-
- mEntryManager.tagForeground(mEntry.notification);
- Assert.assertEquals(0, mEntry.mActiveAppOps.size());
- }
+ mEntryManager.addNotification(mSbn, mRankingMap);
+ mEntryManager.removeNotification(mSbn.getKey(), mRankingMap);
- @Test
- public void testAdd_existingAppOpsNotForegroundNoti() {
- mEntry.setRow(mRow);
- mEntryManager.getNotificationData().add(mEntry);
- ArraySet<Integer> ops = new ArraySet<>();
- ops.add(3);
- ops.add(235);
- ops.add(1);
- when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn(ops);
- when(mForegroundServiceController.getStandardLayoutKey(
- mEntry.notification.getUserId(),
- mEntry.notification.getPackageName())).thenReturn("something else");
-
- mEntryManager.tagForeground(mEntry.notification);
- Assert.assertEquals(0, mEntry.mActiveAppOps.size());
+ verify(mEntryListener, never()).onEntryRemoved(
+ mEntry, null, false /* removedByUser */);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
index da8bc01dc29d..387475f79cc2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
@@ -40,6 +40,8 @@ import android.testing.TestableLooper.RunWithLooper;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ShadeController;
@@ -191,12 +193,12 @@ public class NotificationFilterTest extends SysuiTestCase {
// test should filter out hidden notifications:
// hidden
- NotificationData.Entry entry = new NotificationData.Entry(mMockStatusBarNotification);
+ NotificationEntry entry = new NotificationEntry(mMockStatusBarNotification);
entry.suspended = true;
assertTrue(mNotificationFilter.shouldFilterOut(entry));
// not hidden
- entry = new NotificationData.Entry(mMockStatusBarNotification);
+ entry = new NotificationEntry(mMockStatusBarNotification);
entry.suspended = false;
assertFalse(mNotificationFilter.shouldFilterOut(entry));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java
new file mode 100644
index 000000000000..4b5037bb3f64
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2019 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.notification;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+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.AppOpsManager;
+import android.app.Notification;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.util.ArraySet;
+
+import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.ForegroundServiceController;
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class NotificationListControllerTest extends SysuiTestCase {
+ private NotificationListController mController;
+
+ @Mock private NotificationEntryManager mEntryManager;
+ @Mock private NotificationListContainer mListContainer;
+ @Mock private ForegroundServiceController mForegroundServiceController;
+ @Mock private DeviceProvisionedController mDeviceProvisionedController;
+
+ @Captor private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor;
+ @Captor private ArgumentCaptor<DeviceProvisionedListener> mProvisionedCaptor;
+
+ private NotificationEntryListener mEntryListener;
+ private DeviceProvisionedListener mProvisionedListener;
+
+ // TODO: Remove this once EntryManager no longer needs to be mocked
+ private NotificationData mNotificationData = new NotificationData();
+
+ private int mNextNotifId = 0;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mEntryManager.getNotificationData()).thenReturn(mNotificationData);
+
+ mController = new NotificationListController(
+ mEntryManager,
+ mListContainer,
+ mForegroundServiceController,
+ mDeviceProvisionedController);
+ mController.bind();
+
+ // Capture callbacks passed to mocks
+ verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture());
+ mEntryListener = mEntryListenerCaptor.getValue();
+ verify(mDeviceProvisionedController).addCallback(mProvisionedCaptor.capture());
+ mProvisionedListener = mProvisionedCaptor.getValue();
+ }
+
+ @Test
+ public void testCleanUpViewStateOnEntryRemoved() {
+ final NotificationEntry entry = buildEntry();
+ mEntryListener.onEntryRemoved(
+ entry,
+ NotificationVisibility.obtain(entry.key, 0, 0, true),
+ false);
+ verify(mListContainer).cleanUpViewStateForEntry(entry);
+ }
+
+ @Test
+ public void testCallUpdateNotificationsOnDeviceProvisionedChange() {
+ mProvisionedListener.onDeviceProvisionedChanged();
+ verify(mEntryManager).updateNotifications();
+ }
+
+ @Test
+ public void testAppOps_appOpAddedToForegroundNotif() {
+ // GIVEN a notification associated with a foreground service
+ final NotificationEntry entry = buildEntry();
+ mNotificationData.add(entry);
+ when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
+ .thenReturn(entry.key);
+
+ // WHEN we are notified of a new app op
+ mController.updateNotificationsForAppOp(
+ AppOpsManager.OP_CAMERA,
+ entry.notification.getUid(),
+ entry.notification.getPackageName(),
+ true);
+
+ // THEN the app op is added to the entry
+ assertTrue(entry.mActiveAppOps.contains(AppOpsManager.OP_CAMERA));
+ // THEN updateNotifications() is called
+ verify(mEntryManager, times(1)).updateNotifications();
+ }
+
+ @Test
+ public void testAppOps_appOpAddedToUnrelatedNotif() {
+ // GIVEN No current foreground notifs
+ when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
+ .thenReturn(null);
+
+ // WHEN An unrelated notification gets a new app op
+ mController.updateNotificationsForAppOp(AppOpsManager.OP_CAMERA, 1000, "pkg", true);
+
+ // THEN We never call updateNotifications()
+ verify(mEntryManager, never()).updateNotifications();
+ }
+
+ @Test
+ public void testAppOps_addNotificationWithExistingAppOps() {
+ // GIVEN a notification with three associated app ops that is associated with a foreground
+ // service
+ final NotificationEntry entry = buildEntry();
+ mNotificationData.add(entry);
+ ArraySet<Integer> expected = new ArraySet<>();
+ expected.add(3);
+ expected.add(235);
+ expected.add(1);
+ when(mForegroundServiceController.getStandardLayoutKey(
+ entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn(entry.key);
+ when(mForegroundServiceController.getAppOps(entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn(expected);
+
+ // WHEN the notification is added
+ mEntryListener.onBeforeNotificationAdded(entry);
+
+ // THEN the entry is tagged with all three app ops
+ assertEquals(expected.size(), entry.mActiveAppOps.size());
+ for (int op : expected) {
+ assertTrue("Entry missing op " + op, entry.mActiveAppOps.contains(op));
+ }
+ }
+
+ @Test
+ public void testAdd_addNotificationWithNoExistingAppOps() {
+ // GIVEN a notification with NO associated app ops
+ final NotificationEntry entry = buildEntry();
+
+ mNotificationData.add(entry);
+ when(mForegroundServiceController.getStandardLayoutKey(
+ entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn(entry.key);
+ when(mForegroundServiceController.getAppOps(entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn(null);
+
+ // WHEN the notification is added
+ mEntryListener.onBeforeNotificationAdded(entry);
+
+ // THEN the entry doesn't have any app ops associated with it
+ assertEquals(0, entry.mActiveAppOps.size());
+ }
+
+ @Test
+ public void testAdd_addNonForegroundNotificationWithExistingAppOps() {
+ // GIVEN a notification with app ops that isn't associated with a foreground service
+ final NotificationEntry entry = buildEntry();
+ mNotificationData.add(entry);
+ ArraySet<Integer> ops = new ArraySet<>();
+ ops.add(3);
+ ops.add(235);
+ ops.add(1);
+ when(mForegroundServiceController.getAppOps(entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn(ops);
+ when(mForegroundServiceController.getStandardLayoutKey(
+ entry.notification.getUserId(),
+ entry.notification.getPackageName())).thenReturn("something else");
+
+ // WHEN the notification is added
+ mEntryListener.onBeforeNotificationAdded(entry);
+
+ // THEN the entry doesn't have any app ops associated with it
+ assertEquals(0, entry.mActiveAppOps.size());
+ }
+
+ private NotificationEntry buildEntry() {
+ mNextNotifId++;
+
+ Notification.Builder n = new Notification.Builder(mContext, "")
+ .setSmallIcon(R.drawable.ic_person)
+ .setContentTitle("Title")
+ .setContentText("Text");
+
+ StatusBarNotification notification =
+ new StatusBarNotification(
+ TEST_PACKAGE_NAME,
+ TEST_PACKAGE_NAME,
+ mNextNotifId,
+ null,
+ TEST_UID,
+ 0,
+ n.build(),
+ new UserHandle(ActivityManager.getCurrentUser()),
+ null,
+ 0);
+ return new NotificationEntry(notification);
+ }
+
+ private static final String TEST_PACKAGE_NAME = "test";
+ private static final int TEST_UID = 0;
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index 6fbd8c751285..813fc9d308e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -29,6 +29,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import org.junit.Before;
@@ -44,13 +45,13 @@ public class VisualStabilityManagerTest extends SysuiTestCase {
private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class);
private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
@Before
public void setUp() {
mVisualStabilityManager.setUpWithPresenter(mock(NotificationPresenter.class));
mVisualStabilityManager.setVisibilityLocationProvider(mLocationProvider);
- mEntry = new NotificationData.Entry(mock(StatusBarNotification.class));
+ mEntry = new NotificationEntry(mock(StatusBarNotification.class));
mEntry.setRow(mRow);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java
index 871ff8998c20..b507692b3eee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.systemui.statusbar.notification;
+package com.android.systemui.statusbar.notification.collection;
import static android.app.AppOpsManager.OP_ACCEPT_HANDOVER;
import static android.app.AppOpsManager.OP_CAMERA;
@@ -44,6 +44,7 @@ import android.content.pm.PackageManager;
import android.graphics.drawable.Icon;
import android.media.session.MediaSession;
import android.os.Bundle;
+import android.os.Process;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.SnoozeCriterion;
@@ -59,7 +60,9 @@ import com.android.systemui.ForegroundServiceController;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
-import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ShadeController;
@@ -138,7 +141,8 @@ public class NotificationDataTest extends SysuiTestCase {
ExpandableNotificationRow row2 = new NotificationTestHelper(getContext()).createRow();
mNotificationData.add(row2.getEntry());
ExpandableNotificationRow diffPkg =
- new NotificationTestHelper(getContext()).createRow("pkg", 4000);
+ new NotificationTestHelper(getContext()).createRow("pkg", 4000,
+ Process.myUserHandle());
mNotificationData.add(diffPkg.getEntry());
ArraySet<Integer> expectedOps = new ArraySet<>();
@@ -203,7 +207,7 @@ public class NotificationDataTest extends SysuiTestCase {
mRow.getEntry().notification)).thenReturn(false);
when(mEnvironment.isNotificationForCurrentProfiles(
row2.getEntry().notification)).thenReturn(true);
- ArrayList<NotificationData.Entry> result =
+ ArrayList<NotificationEntry> result =
mNotificationData.getNotificationsForCurrentUser();
assertEquals(result.size(), 1);
@@ -217,7 +221,7 @@ public class NotificationDataTest extends SysuiTestCase {
TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY);
Notification n = mMockStatusBarNotification.getNotification();
n.flags = Notification.FLAG_FOREGROUND_SERVICE;
- NotificationData.Entry entry = new NotificationData.Entry(mMockStatusBarNotification);
+ NotificationEntry entry = new NotificationEntry(mMockStatusBarNotification);
mNotificationData.add(entry);
assertTrue(entry.isExemptFromDndVisualSuppression());
@@ -234,7 +238,7 @@ public class NotificationDataTest extends SysuiTestCase {
nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
n = nb.build();
when(mMockStatusBarNotification.getNotification()).thenReturn(n);
- NotificationData.Entry entry = new NotificationData.Entry(mMockStatusBarNotification);
+ NotificationEntry entry = new NotificationEntry(mMockStatusBarNotification);
mNotificationData.add(entry);
assertTrue(entry.isExemptFromDndVisualSuppression());
@@ -246,7 +250,7 @@ public class NotificationDataTest extends SysuiTestCase {
initStatusBarNotification(false);
when(mMockStatusBarNotification.getKey()).thenReturn(
TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY);
- NotificationData.Entry entry = new NotificationData.Entry(mMockStatusBarNotification);
+ NotificationEntry entry = new NotificationEntry(mMockStatusBarNotification);
entry.mIsSystemNotification = true;
mNotificationData.add(entry);
@@ -259,7 +263,7 @@ public class NotificationDataTest extends SysuiTestCase {
initStatusBarNotification(false);
when(mMockStatusBarNotification.getKey()).thenReturn(
TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY);
- NotificationData.Entry entry = new NotificationData.Entry(mMockStatusBarNotification);
+ NotificationEntry entry = new NotificationEntry(mMockStatusBarNotification);
entry.mIsSystemNotification = true;
mNotificationData.add(entry);
@@ -313,8 +317,8 @@ public class NotificationDataTest extends SysuiTestCase {
snoozeCriterions.add(snoozeCriterion);
when(ranking.getSnoozeCriteria()).thenReturn(snoozeCriterions);
- NotificationData.Entry entry =
- new NotificationData.Entry(mMockStatusBarNotification, ranking);
+ NotificationEntry entry =
+ new NotificationEntry(mMockStatusBarNotification, ranking);
assertEquals(systemGeneratedSmartActions, entry.systemGeneratedSmartActions);
assertEquals(NOTIFICATION_CHANNEL, entry.channel);
@@ -343,7 +347,7 @@ public class NotificationDataTest extends SysuiTestCase {
StatusBarNotification sbn = new StatusBarNotification("pkg", "pkg", 0, "tag", 0, 0,
notification, mContext.getUser(), "", 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.setHasSentReply();
assertTrue(entry.isLastMessageFromReply());
@@ -400,8 +404,7 @@ public class NotificationDataTest extends SysuiTestCase {
Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
title,
PendingIntent.getBroadcast(getContext(), 0, new Intent("Action"), 0))
- .setSemanticAction(
- Notification.Action.SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION)
+ .setContextual(true)
.build();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java
new file mode 100644
index 000000000000..4b03399a5e92
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (C) 2018 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.notification.logging;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.os.RemoteException;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.UiOffloadThread;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class ExpansionStateLoggerTest extends SysuiTestCase {
+ private static final String NOTIFICATION_KEY = "notin_key";
+
+ private NotificationLogger.ExpansionStateLogger mLogger;
+ @Mock
+ private IStatusBarService mBarService;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLogger = new NotificationLogger.ExpansionStateLogger(
+ Dependency.get(UiOffloadThread.class));
+ mLogger.mBarService = mBarService;
+ }
+
+ @Test
+ public void testVisible() throws RemoteException {
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ waitForUiOffloadThread();
+
+ verify(mBarService, Mockito.never()).onNotificationExpansionChanged(
+ eq(NOTIFICATION_KEY), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testExpanded() throws RemoteException {
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, false, true);
+ waitForUiOffloadThread();
+
+ verify(mBarService, Mockito.never()).onNotificationExpansionChanged(
+ eq(NOTIFICATION_KEY), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testVisibleAndNotExpanded() throws RemoteException {
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, true, false);
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ waitForUiOffloadThread();
+
+ verify(mBarService, Mockito.never()).onNotificationExpansionChanged(
+ eq(NOTIFICATION_KEY), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testVisibleAndExpanded() throws RemoteException {
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, true, true);
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ waitForUiOffloadThread();
+
+ verify(mBarService).onNotificationExpansionChanged(
+ NOTIFICATION_KEY, true, true);
+ }
+
+ @Test
+ public void testExpandedAndVisible_expandedBeforeVisible() throws RemoteException {
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, false, true);
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ waitForUiOffloadThread();
+
+ verify(mBarService).onNotificationExpansionChanged(
+ NOTIFICATION_KEY, false, true);
+ }
+
+ @Test
+ public void testExpandedAndVisible_visibleBeforeExpanded() throws RemoteException {
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, false, true);
+ waitForUiOffloadThread();
+
+ verify(mBarService).onNotificationExpansionChanged(
+ NOTIFICATION_KEY, false, true);
+ }
+
+ @Test
+ public void testExpandedAndVisible_logOnceOnly() throws RemoteException {
+ mLogger.onVisibilityChanged(
+ Collections.singletonList(createNotificationVisibility(NOTIFICATION_KEY, true)),
+ Collections.emptyList());
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, false, true);
+ mLogger.onExpansionChanged(NOTIFICATION_KEY, false, true);
+ waitForUiOffloadThread();
+
+ verify(mBarService).onNotificationExpansionChanged(
+ NOTIFICATION_KEY, false, true);
+ }
+
+ private NotificationVisibility createNotificationVisibility(String key, boolean visibility) {
+ return NotificationVisibility.obtain(key, 0, 0, visibility);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
index 983ca837b639..db2706bee3c9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
@@ -41,9 +41,10 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -71,13 +72,14 @@ public class NotificationLoggerTest extends SysuiTestCase {
@Mock private IStatusBarService mBarService;
@Mock private NotificationData mNotificationData;
@Mock private ExpandableNotificationRow mRow;
+ @Mock private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
// Dependency mocks:
@Mock private NotificationEntryManager mEntryManager;
@Mock private NotificationListener mListener;
@Captor private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private TestableNotificationLogger mLogger;
private NotificationEntryListener mNotificationEntryListener;
private ConcurrentLinkedQueue<AssertionError> mErrorQueue = new ConcurrentLinkedQueue<>();
@@ -93,11 +95,12 @@ public class NotificationLoggerTest extends SysuiTestCase {
StatusBarNotification sbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME,
0, null, TEST_UID,
0, new Notification(), UserHandle.CURRENT, null, 0);
- mEntry = new NotificationData.Entry(sbn);
+ mEntry = new NotificationEntry(sbn);
mEntry.setRow(mRow);
mLogger = new TestableNotificationLogger(mListener, Dependency.get(UiOffloadThread.class),
- mEntryManager, mock(StatusBarStateController.class), mBarService);
+ mEntryManager, mock(StatusBarStateController.class), mBarService,
+ mExpansionStateLogger);
mLogger.setUpWithContainer(mListContainer);
verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture());
mNotificationEntryListener = mEntryListenerCaptor.getValue();
@@ -159,19 +162,16 @@ public class NotificationLoggerTest extends SysuiTestCase {
verify(mBarService, times(1)).onNotificationVisibilityChanged(any(), any());
}
- @Test
- public void testHandleNullEntryOnEntryRemoved() {
- mNotificationEntryListener.onEntryRemoved(null, "foobar", null, null, false, false);
- }
-
private class TestableNotificationLogger extends NotificationLogger {
TestableNotificationLogger(NotificationListener notificationListener,
UiOffloadThread uiOffloadThread,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
- IStatusBarService barService) {
- super(notificationListener, uiOffloadThread, entryManager, statusBarStateController);
+ IStatusBarService barService,
+ ExpansionStateLogger expansionStateLogger) {
+ super(notificationListener, uiOffloadThread, entryManager, statusBarStateController,
+ expansionStateLogger);
mBarService = barService;
// Make this on the current thread so we can wait for it during tests.
mHandler = Handler.createAsync(Looper.myLooper());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
index 82b42c51622d..d94bf845ca5b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
@@ -47,7 +47,7 @@ import android.view.View;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.SmartReplyConstants;
import org.junit.Before;
@@ -73,7 +73,7 @@ public class NotificationContentViewTest extends SysuiTestCase {
StatusBarNotification mStatusBarNotification;
@Mock
Notification mNotification;
- NotificationData.Entry mEntry;
+ NotificationEntry mEntry;
@Mock
RemoteInput mRemoteInput;
@Mock
@@ -107,7 +107,7 @@ public class NotificationContentViewTest extends SysuiTestCase {
// Smart replies and actions
when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true);
when(mStatusBarNotification.getNotification()).thenReturn(mNotification);
- mEntry = new NotificationData.Entry(mStatusBarNotification);
+ mEntry = new NotificationEntry(mStatusBarNotification);
when(mSmartReplyConstants.isEnabled()).thenReturn(true);
mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index ad43bea74089..0899c73ab07b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -60,7 +60,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -183,8 +183,8 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
when(row.getGuts()).thenReturn(guts);
doNothing().when(row).inflateGuts();
- NotificationData.Entry realEntry = realRow.getEntry();
- NotificationData.Entry entry = spy(realEntry);
+ NotificationEntry realEntry = realRow.getEntry();
+ NotificationEntry entry = spy(realEntry);
when(entry.getRow()).thenReturn(row);
when(entry.getGuts()).thenReturn(guts);
@@ -443,7 +443,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
NotificationGuts guts = new NotificationGuts(mContext);
ExpandableNotificationRow row = spy(createTestNotificationRow());
doReturn(guts).when(row).getGuts();
- NotificationData.Entry entry = row.getEntry();
+ NotificationEntry entry = row.getEntry();
entry.setRow(row);
mGutsManager.setExposedGuts(guts);
@@ -452,7 +452,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
@Test
public void testSetShouldManageLifetime_setShouldManage() {
- NotificationData.Entry entry = createTestNotificationRow().getEntry();
+ NotificationEntry entry = createTestNotificationRow().getEntry();
mGutsManager.setShouldManageLifetime(entry, true /* shouldManage */);
assertTrue(entry.key.equals(mGutsManager.mKeyToRemoveOnGutsClosed));
@@ -460,7 +460,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
@Test
public void testSetShouldManageLifetime_setShouldNotManage() {
- NotificationData.Entry entry = createTestNotificationRow().getEntry();
+ NotificationEntry entry = createTestNotificationRow().getEntry();
mGutsManager.mKeyToRemoveOnGutsClosed = entry.key;
mGutsManager.setShouldManageLifetime(entry, false /* shouldManage */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
index d6b706d73827..648df3cab33c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
@@ -48,7 +48,7 @@ import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.NotificationTestHelper;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import org.junit.Assert;
import org.junit.Before;
@@ -88,7 +88,7 @@ public class NotificationInflaterTest extends SysuiTestCase {
}
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
}
});
@@ -174,7 +174,7 @@ public class NotificationInflaterTest extends SysuiTestCase {
}
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
countDownLatch.countDown();
}
@@ -256,7 +256,7 @@ public class NotificationInflaterTest extends SysuiTestCase {
}
@Override
- public void onAsyncInflationFinished(NotificationData.Entry entry,
+ public void onAsyncInflationFinished(NotificationEntry entry,
@NotificationInflater.InflationFlag int inflatedFlags) {
if (expectingException) {
exceptionHolder.setException(new RuntimeException(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
index ecb0cf8ef902..f6791dd5778c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
@@ -45,7 +45,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.app.INotificationManager;
@@ -73,6 +72,7 @@ import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -498,12 +498,15 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testLogBlockingHelperCounter_doesntLogForNormalGutsView() throws Exception {
+ public void testLogBlockingHelperCounter_logGutsViewDisplayed() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
IMPORTANCE_DEFAULT);
mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
- verifyZeroInteractions(mMetricsLogger);
+ verify(mMetricsLogger).write(argThat(logMaker ->
+ logMaker.getType() == MetricsEvent.NOTIFICATION_BLOCKING_HELPER
+ && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_DISPLAY
+ ));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
index e4d019656072..04d7509f760f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
@@ -35,7 +35,7 @@ import android.testing.ViewUtils;
import android.view.ViewGroup;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
@@ -54,7 +54,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
public void setup() {
injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
mRow = mock(ExpandableNotificationRow.class);
- NotificationData.Entry entry = new NotificationData.Entry(
+ NotificationEntry entry = new NotificationEntry(
mock(StatusBarNotification.class));
entry.channel = mock(NotificationChannel.class);
when(mRow.getEntry()).thenReturn(entry);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
index 8ae7d52a5da5..ff30a4d6761d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
@@ -29,7 +29,10 @@ import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -37,6 +40,8 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.HashSet;
@@ -45,14 +50,18 @@ import java.util.HashSet;
@RunWithLooper
public class NotificationRoundnessManagerTest extends SysuiTestCase {
- private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager();
+ private NotificationRoundnessManager mRoundnessManager;
private HashSet<ExpandableView> mAnimatedChildren = new HashSet<>();
private Runnable mRoundnessCallback = mock(Runnable.class);
private ExpandableNotificationRow mFirst;
private ExpandableNotificationRow mSecond;
+ @Mock
+ private AmbientPulseManager mAmbientPulseManager;
@Before
public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mRoundnessManager = new NotificationRoundnessManager(mAmbientPulseManager);
com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper();
NotificationTestHelper testHelper = new NotificationTestHelper(getContext());
mFirst = testHelper.createRow();
@@ -127,6 +136,27 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase {
}
@Test
+ public void testRoundnessPulsing() throws Exception {
+ // Let's create a notification that's neither the first or last item of the stack,
+ // this way we'll ensure that it won't have any rounded corners by default.
+ mRoundnessManager.updateRoundedChildren(new NotificationSection[]{
+ createSection(mFirst, mSecond),
+ createSection(null, null)
+ });
+ ExpandableNotificationRow row = new NotificationTestHelper(getContext()).createRow();
+ NotificationEntry entry = mock(NotificationEntry.class);
+ when(entry.getRow()).thenReturn(row);
+
+ mRoundnessManager.onAmbientStateChanged(entry, true);
+ Assert.assertEquals(1f, row.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1f, row.getCurrentTopRoundness(), 0.0f);
+
+ mRoundnessManager.onAmbientStateChanged(entry, false);
+ Assert.assertEquals(0f, row.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0f, row.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
public void testRoundnessSetOnSecondSectionLast() {
mRoundnessManager.updateRoundedChildren(new NotificationSection[]{
createSection(mFirst, mFirst),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index b66d0ab78fd8..736f3840b91a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.atLeastOnce;
@@ -35,17 +36,21 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.metrics.LogMaker;
import android.provider.Settings;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.Dependency;
import com.android.systemui.ExpandHelper;
import com.android.systemui.InitController;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -53,9 +58,9 @@ import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.FooterView;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
@@ -73,6 +78,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -86,7 +92,8 @@ import java.util.ArrayList;
@RunWith(AndroidJUnit4.class)
public class NotificationStackScrollLayoutTest extends SysuiTestCase {
- private NotificationStackScrollLayout mStackScroller;
+ private NotificationStackScrollLayout mStackScroller; // Normally test this
+ private NotificationStackScrollLayout mStackScrollerInternal; // See explanation below
@Rule public MockitoRule mockito = MockitoJUnit.rule();
@Mock private StatusBar mBar;
@@ -99,9 +106,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Mock private NotificationData mNotificationData;
@Mock private NotificationRemoteInputManager mRemoteInputManager;
@Mock private RemoteInputController mRemoteInputController;
+ @Mock private MetricsLogger mMetricsLogger;
+ @Mock private NotificationRoundnessManager mNotificationRoundnessManager;
private TestableNotificationEntryManager mEntryManager;
private int mOriginalInterruptionModelSetting;
+
@Before
@UiThreadTest
public void setUp() throws Exception {
@@ -110,6 +120,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
NotificationBlockingHelperManager.class,
mBlockingHelperManager);
mDependency.injectTestDependency(StatusBarStateController.class, mBarState);
+ mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mDependency.injectTestDependency(NotificationRemoteInputManager.class,
mRemoteInputManager);
mDependency.injectMockDependency(ShadeController.class);
@@ -123,8 +134,15 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
NotificationShelf notificationShelf = mock(NotificationShelf.class);
- mStackScroller = spy(new NotificationStackScrollLayout(getContext(), null,
- true /* allowLongPress */));
+
+ // The actual class under test. You may need to work with this class directly when
+ // testing anonymous class members of mStackScroller, like mMenuEventListener,
+ // which refer to members of NotificationStackScrollLayout. The spy
+ // holds a copy of the CUT's instances of these classes, so they still refer to the CUT's
+ // member variables, not the spy's member variables.
+ mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null,
+ true /* allowLongPress */, mNotificationRoundnessManager);
+ mStackScroller = spy(mStackScrollerInternal);
mStackScroller.setShelf(notificationShelf);
mStackScroller.setStatusBar(mBar);
mStackScroller.setScrimController(mock(ScrimController.class));
@@ -142,6 +160,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
doNothing().when(mGroupManager).collapseAllGroups();
doNothing().when(mExpandHelper).cancelImmediately();
doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean());
+ doNothing().when(notificationShelf).fadeInTranslating();
mOriginalInterruptionModelSetting = Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
@@ -265,8 +284,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test
public void testUpdateFooter_remoteInput() {
setBarStateForTest(StatusBarState.SHADE);
- ArrayList<Entry> entries = new ArrayList<>();
- entries.add(mock(Entry.class));
+ ArrayList<NotificationEntry> entries = new ArrayList<>();
+ entries.add(mock(NotificationEntry.class));
when(mNotificationData.getActiveNotifications()).thenReturn(entries);
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
@@ -282,8 +301,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test
public void testUpdateFooter_oneClearableNotification() {
setBarStateForTest(StatusBarState.SHADE);
- ArrayList<Entry> entries = new ArrayList<>();
- entries.add(mock(Entry.class));
+ ArrayList<NotificationEntry> entries = new ArrayList<>();
+ entries.add(mock(NotificationEntry.class));
when(mNotificationData.getActiveNotifications()).thenReturn(entries);
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
@@ -298,8 +317,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test
public void testUpdateFooter_oneNonClearableNotification() {
setBarStateForTest(StatusBarState.SHADE);
- ArrayList<Entry> entries = new ArrayList<>();
- entries.add(mock(Entry.class));
+ ArrayList<NotificationEntry> entries = new ArrayList<>();
+ entries.add(mock(NotificationEntry.class));
when(mEntryManager.getNotificationData().getActiveNotifications()).thenReturn(entries);
assertTrue(mEntryManager.getNotificationData().getActiveNotifications().size() != 0);
@@ -314,7 +333,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
// add notification
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
- NotificationData.Entry entry = mock(NotificationData.Entry.class);
+ NotificationEntry entry = mock(NotificationEntry.class);
when(row.getEntry()).thenReturn(entry);
when(entry.isClearable()).thenReturn(true);
mStackScroller.addContainerView(row);
@@ -421,6 +440,63 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
assertNull(swipeActionHelper.getExposedMenuView());
}
+ class LogMatcher implements ArgumentMatcher<LogMaker> {
+ private int mCategory, mType;
+
+ LogMatcher(int category, int type) {
+ mCategory = category;
+ mType = type;
+ }
+ public boolean matches(LogMaker l) {
+ return (l.getCategory() == mCategory)
+ && (l.getType() == mType);
+ }
+
+ public String toString() {
+ return String.format("LogMaker(%d, %d)", mCategory, mType);
+ }
+ }
+
+ private LogMaker logMatcher(int category, int type) {
+ return argThat(new LogMatcher(category, type));
+ }
+
+ @Test
+ @UiThreadTest
+ public void testOnMenuClickedLogging() {
+ // Set up the object under test to have a valid mLongPressListener. We're testing an
+ // anonymous-class member, mMenuEventListener, so we need to modify the state of the
+ // class itself, not the Mockito spy copied from it. See notes in setup.
+ mStackScrollerInternal.setLongPressListener(
+ mock(ExpandableNotificationRow.LongPressListener.class));
+
+ ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS);
+ when(row.getStatusBarNotification().getLogMaker()).thenReturn(new LogMaker(
+ MetricsProto.MetricsEvent.VIEW_UNKNOWN));
+
+ mStackScroller.mMenuEventListener.onMenuClicked(row, 0, 0, mock(
+ NotificationMenuRowPlugin.MenuItem.class));
+ verify(row.getStatusBarNotification()).getLogMaker(); // This writes most of the log data
+ verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_TOUCH_GEAR,
+ MetricsProto.MetricsEvent.TYPE_ACTION));
+ }
+
+ @Test
+ @UiThreadTest
+ public void testOnMenuShownLogging() {
+ // Set up the object under test to have a valid mHeadsUpManager. See notes in setup.
+ mStackScrollerInternal.setHeadsUpManager(mHeadsUpManager);
+
+ ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS);
+ when(row.getStatusBarNotification().getLogMaker()).thenReturn(new LogMaker(
+ MetricsProto.MetricsEvent.VIEW_UNKNOWN));
+
+ mStackScroller.mMenuEventListener.onMenuShown(row);
+ verify(row.getStatusBarNotification()).getLogMaker(); // This writes most of the log data
+ verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_REVEAL_GEAR,
+ MetricsProto.MetricsEvent.TYPE_ACTION));
+ }
+
private void setBarStateForTest(int state) {
// Can't inject this through the listener or we end up on the actual implementation
// rather than the mock because the spy just coppied the anonymous inner /shruggie.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index add8838362be..a72be7af8cd8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -57,13 +57,15 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
@Before
public void setup() {
mSysuiContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
- mSysuiContext.putComponent(StatusBar.class, mock(StatusBar.class));
+ StatusBar statusBar = mock(StatusBar.class);
+ mSysuiContext.putComponent(StatusBar.class, statusBar);
mSysuiContext.putComponent(TunerService.class, mock(TunerService.class));
mStatusBarStateController = mDependency
.injectMockDependency(StatusBarStateController.class);
injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
mMockNotificiationAreaController = mock(NotificationIconAreaController.class);
mNotificationAreaInner = mock(View.class);
+ when(statusBar.getPanel()).thenReturn(mock(NotificationPanelView.class));
when(mNotificationAreaInner.animate()).thenReturn(mock(ViewPropertyAnimator.class));
when(mMockNotificiationAreaController.getNotificationInnerAreaView()).thenReturn(
mNotificationAreaInner);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index 44deb10941ec..9ceb325204fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -16,15 +16,20 @@
package com.android.systemui.statusbar.phone;
-import android.view.View;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.when;
+
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.View;
import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.AlertingNotificationManagerTest;
-import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import org.junit.Before;
import org.junit.Rule;
@@ -34,11 +39,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertFalse;
-
-import static org.mockito.Mockito.when;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -96,7 +96,7 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
@Test
public void testCanRemoveImmediately_notTopEntry() {
- NotificationData.Entry laterEntry = new NotificationData.Entry(createNewNotification(1));
+ NotificationEntry laterEntry = new NotificationEntry(createNewNotification(1));
laterEntry.setRow(mRow);
mHeadsUpManager.showNotification(mEntry);
mHeadsUpManager.showNotification(laterEntry);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
index 27ed9c5a14c8..cd52e8792cfd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
@@ -47,7 +47,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase {
private float mPanelExpansion;
private int mKeyguardStatusHeight;
private float mDark;
- private boolean mPulsing;
@Before
public void setUp() {
@@ -208,20 +207,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase {
}
@Test
- public void notifPositionWhilePulsingOnAOD() {
- // GIVEN on AOD and pulsing
- givenAOD();
- mNotificationStackHeight = EMPTY_HEIGHT;
- mKeyguardStatusHeight = EMPTY_HEIGHT;
- mPulsing = true;
- mClockPositionAlgorithm.setPulsingPadding(200);
- // WHEN the clock position algorithm is run
- positionClock();
- // THEN the notif padding doesn't adjust for pulsing.
- assertThat(mClockPosition.stackScrollerPadding).isEqualTo(1000);
- }
-
- @Test
public void notifPositionMiddleOfScreenOnLockScreen() {
// GIVEN on lock screen and both stack scroll and clock have 0 height
givenLockScreen();
@@ -307,20 +292,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase {
assertThat(mClockPosition.stackScrollerPadding).isEqualTo(0);
}
- @Test
- public void notifPositionWhilePulsingOnLockScreen() {
- // GIVEN on lock screen and pulsing
- givenLockScreen();
- mNotificationStackHeight = EMPTY_HEIGHT;
- mKeyguardStatusHeight = EMPTY_HEIGHT;
- mPulsing = true;
- mClockPositionAlgorithm.setPulsingPadding(200);
- // WHEN the clock position algorithm is run
- positionClock();
- // THEN the notif padding adjusts for pulsing.
- assertThat(mClockPosition.stackScrollerPadding).isEqualTo(1200);
- }
-
private void givenAOD() {
mPanelExpansion = 1.f;
mDark = 1.f;
@@ -334,7 +305,7 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase {
private void positionClock() {
mClockPositionAlgorithm.setup(EMPTY_MARGIN, SCREEN_HEIGHT, mNotificationStackHeight,
mPanelExpansion, SCREEN_HEIGHT, mKeyguardStatusHeight, mDark, SECURE_LOCKED,
- mPulsing, ZERO_DRAG);
+ ZERO_DRAG);
mClockPositionAlgorithm.run(mClockPosition);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
index 56af40054316..cefd4acbfb5a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
@@ -32,10 +32,9 @@ import android.testing.TestableLooper;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.AmbientPulseManager;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import org.junit.Before;
@@ -64,7 +63,7 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Captor
private ArgumentCaptor<NotificationEntryListener> mListenerCaptor;
private NotificationEntryListener mNotificationEntryListener;
- private final HashMap<String, Entry> mPendingEntries = new HashMap<>();
+ private final HashMap<String, NotificationEntry> mPendingEntries = new HashMap<>();
private final NotificationGroupTestHelper mGroupTestHelper =
new NotificationGroupTestHelper(mContext);
@@ -94,9 +93,9 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpTransfersToChild() {
- Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mHeadsUpManager.showNotification(summaryEntry);
- Entry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
// Summary will be suppressed because there is only one child.
mGroupManager.onEntryAdded(summaryEntry);
@@ -109,11 +108,11 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpTransfersToChildButBackAgain() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry2 =
+ NotificationEntry childEntry2 =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
mHeadsUpManager.showNotification(summaryEntry);
// Trigger a transfer of alert state from summary to child.
@@ -133,11 +132,11 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpDoesntTransferBackOnDozingChanged() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry2 =
+ NotificationEntry childEntry2 =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
mHeadsUpManager.showNotification(summaryEntry);
// Trigger a transfer of alert state from summary to child.
@@ -158,9 +157,9 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpTransferDoesNotAlertChildIfUninflated() {
- Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mHeadsUpManager.showNotification(summaryEntry);
- Entry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
@@ -176,9 +175,9 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpTransferAlertsChildOnInflation() {
- Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mHeadsUpManager.showNotification(summaryEntry);
- Entry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
@@ -196,13 +195,13 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testSuppressedSummaryHeadsUpTransferBackAbortsChildInflation() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
- NotificationData.Entry childEntry2 =
+ NotificationEntry childEntry2 =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
mHeadsUpManager.showNotification(summaryEntry);
// Trigger a transfer of alert state from summary to child.
@@ -226,9 +225,9 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testCleanUpPendingAlertInfo() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
@@ -237,17 +236,16 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
- mNotificationEntryListener.onEntryRemoved(childEntry, childEntry.key, null, null,
- false, false);
+ mNotificationEntryListener.onEntryRemoved(childEntry, null, false);
assertFalse(mGroupAlertTransferHelper.isAlertTransferPending(childEntry));
}
@Test
public void testUpdateGroupChangeDoesNotTransfer() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
@@ -268,9 +266,9 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Test
public void testUpdateChildToSummaryDoesNotTransfer() {
- NotificationData.Entry summaryEntry =
+ NotificationEntry summaryEntry =
mGroupTestHelper.createSummaryNotification(Notification.GROUP_ALERT_SUMMARY);
- NotificationData.Entry childEntry =
+ NotificationEntry childEntry =
mGroupTestHelper.createChildNotification(Notification.GROUP_ALERT_SUMMARY);
when(childEntry.getRow().isInflationFlagSet(mHeadsUpManager.getContentFlag()))
.thenReturn(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
index b0bd1fba3760..ecb3e4d8067c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
@@ -29,7 +29,7 @@ import android.testing.TestableLooper;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.AmbientPulseManager;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import org.junit.Before;
@@ -69,8 +69,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testIsOnlyChildInGroup() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
@@ -80,8 +80,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testIsChildInGroupWithSummary() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
@@ -92,8 +92,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testIsSummaryOfGroupWithChildren() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
@@ -105,8 +105,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testRemoveChildFromGroupWithSummary() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification());
@@ -118,8 +118,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testRemoveSummaryFromGroupWithSummary() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification());
@@ -132,8 +132,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testHeadsUpEntryIsIsolated() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification());
@@ -149,8 +149,8 @@ public class NotificationGroupManagerTest extends SysuiTestCase {
@Test
public void testAmbientPulseEntryIsIsolated() {
- NotificationData.Entry childEntry = mGroupTestHelper.createChildNotification();
- NotificationData.Entry summaryEntry = mGroupTestHelper.createSummaryNotification();
+ NotificationEntry childEntry = mGroupTestHelper.createChildNotification();
+ NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification();
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupTestHelper.java
index 7ad68eb1c9a3..e6b9778eb59f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupTestHelper.java
@@ -27,7 +27,7 @@ import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
/**
@@ -44,23 +44,23 @@ public final class NotificationGroupTestHelper {
mContext = context;
}
- public NotificationData.Entry createSummaryNotification() {
+ public NotificationEntry createSummaryNotification() {
return createSummaryNotification(Notification.GROUP_ALERT_ALL);
}
- public NotificationData.Entry createSummaryNotification(int groupAlertBehavior) {
+ public NotificationEntry createSummaryNotification(int groupAlertBehavior) {
return createEntry(true, groupAlertBehavior);
}
- public NotificationData.Entry createChildNotification() {
+ public NotificationEntry createChildNotification() {
return createChildNotification(Notification.GROUP_ALERT_ALL);
}
- public NotificationData.Entry createChildNotification(int groupAlertBehavior) {
+ public NotificationEntry createChildNotification(int groupAlertBehavior) {
return createEntry(false, groupAlertBehavior);
}
- public NotificationData.Entry createEntry(boolean isSummary, int groupAlertBehavior) {
+ public NotificationEntry createEntry(boolean isSummary, int groupAlertBehavior) {
Notification notif = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("Title")
.setSmallIcon(R.drawable.ic_person)
@@ -79,7 +79,7 @@ public final class NotificationGroupTestHelper {
new UserHandle(ActivityManager.getCurrentUser()),
null /* overrideGroupKey */,
0 /* postTime */);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
entry.setRow(row);
when(row.getEntry()).thenReturn(entry);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
new file mode 100644
index 000000000000..b7b95ef3ff6a
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2018 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;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.keyguard.KeyguardStatusView;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.ZenModeController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class NotificationPanelViewTest extends SysuiTestCase {
+
+ @Mock
+ private StatusBarStateController mStatusBarStateController;
+ @Mock
+ private NotificationStackScrollLayout mNotificationStackScrollLayout;
+ @Mock
+ private KeyguardStatusView mKeyguardStatusView;
+ private NotificationPanelView mNotificationPanelView;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mDependency.injectTestDependency(StatusBarStateController.class,
+ mStatusBarStateController);
+ mDependency.injectMockDependency(ShadeController.class);
+ mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
+ mDependency.injectMockDependency(ConfigurationController.class);
+ mDependency.injectMockDependency(ZenModeController.class);
+ mNotificationPanelView = new TestableNotificationPanelView();
+ }
+
+ @Test
+ public void testSetDozing_notifiesNsslAndStateController() {
+ mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */);
+ InOrder inOrder = inOrder(mNotificationStackScrollLayout, mStatusBarStateController);
+ inOrder.verify(mNotificationStackScrollLayout).setDark(eq(true), eq(true), eq(null));
+ inOrder.verify(mNotificationStackScrollLayout).setShowDarkShelf(eq(true));
+ inOrder.verify(mStatusBarStateController).setDozeAmount(eq(1f), eq(true));
+ }
+
+ @Test
+ public void testSetDozing_showsDarkShelfWithDefaultClock() {
+ when(mKeyguardStatusView.hasCustomClock()).thenReturn(false);
+ mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */);
+ verify(mNotificationStackScrollLayout).setShowDarkShelf(eq(true));
+ }
+
+ @Test
+ public void testSetDozing_hidesDarkShelfWhenCustomClock() {
+ when(mKeyguardStatusView.hasCustomClock()).thenReturn(true);
+ mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */);
+ verify(mNotificationStackScrollLayout).setShowDarkShelf(eq(false));
+ }
+
+ private class TestableNotificationPanelView extends NotificationPanelView {
+ TestableNotificationPanelView() {
+ super(NotificationPanelViewTest.this.mContext, null);
+ mNotificationStackScroller = mNotificationStackScrollLayout;
+ mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView;
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
index 2805908d114a..382dde9ce043 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
@@ -97,6 +97,7 @@ public class QuickStepControllerTest extends SysuiTestCase {
doReturn(HIT_TARGET_NONE).when(mNavigationBarView).getDownHitTarget();
doReturn(backButton).when(mNavigationBarView).getBackButton();
doReturn(mResources).when(mNavigationBarView).getResources();
+ doReturn(mContext).when(mNavigationBarView).getContext();
mController = new QuickStepController(mContext);
mController.setComponents(mNavigationBarView);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 146c5d647198..c20d37f123b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -45,6 +45,7 @@ import android.view.View;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.util.function.TriConsumer;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.doze.DozeLog;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.utils.os.FakeHandler;
@@ -54,7 +55,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.function.Consumer;
@@ -94,6 +95,7 @@ public class ScrimControllerTest extends SysuiTestCase {
},
visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager);
mScrimController.setHasBackdrop(false);
+ mScrimController.setWallpaperSupportsAmbientMode(false);
}
@Test
@@ -132,7 +134,8 @@ public class ScrimControllerTest extends SysuiTestCase {
// Back scrim should be transparent
assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT);
- // Move on to PULSING and check if the back scrim is still transparent
+ // Pulsing notification should conserve AOD wallpaper.
+ mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION);
mScrimController.transitionTo(ScrimState.PULSING);
mScrimController.finishAnimationsImmediately();
assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT);
@@ -217,13 +220,14 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.finishAnimationsImmediately();
assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
+ mScrimController.setPulseReason(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN);
mScrimController.transitionTo(ScrimState.PULSING);
mScrimController.finishAnimationsImmediately();
// Front scrim should be transparent
// Back scrim should be semi-transparent so the user can see the wallpaper
// Pulse callback should have been invoked
assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT);
- assertScrimTint(mScrimBehind, true /* tinted */);
+ assertScrimTint(mScrimBehind, false /* tinted */);
}
@Test
@@ -474,6 +478,21 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ public void testHoldsPulsingWallpaperAnimationLock() {
+ // Pre-conditions
+ mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION);
+ mScrimController.transitionTo(ScrimState.PULSING);
+ mScrimController.finishAnimationsImmediately();
+ reset(mWakeLock);
+
+ mScrimController.onHideWallpaperTimeout();
+ verify(mWakeLock).acquire();
+ verify(mWakeLock, never()).release();
+ mScrimController.finishAnimationsImmediately();
+ verify(mWakeLock).release();
+ }
+
+ @Test
public void testWillHideAodWallpaper() {
mScrimController.setWallpaperSupportsAmbientMode(true);
mScrimController.transitionTo(ScrimState.AOD);
@@ -483,6 +502,30 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ public void testWillHidePulsingWallpaper_whenNotification() {
+ mScrimController.setWallpaperSupportsAmbientMode(false);
+ mScrimController.transitionTo(ScrimState.AOD);
+ mScrimController.finishAnimationsImmediately();
+ mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION);
+ mScrimController.transitionTo(ScrimState.PULSING);
+ mScrimController.finishAnimationsImmediately();
+ assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
+ assertScrimTint(mScrimBehind, true);
+ }
+
+ @Test
+ public void testWillHidePulsingWallpaper_whenDocking() {
+ mScrimController.setWallpaperSupportsAmbientMode(false);
+ mScrimController.transitionTo(ScrimState.AOD);
+ mScrimController.finishAnimationsImmediately();
+ mScrimController.setPulseReason(DozeLog.PULSE_REASON_DOCKING);
+ mScrimController.transitionTo(ScrimState.PULSING);
+ mScrimController.finishAnimationsImmediately();
+ assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
+ assertScrimTint(mScrimBehind, true);
+ }
+
+ @Test
public void testConservesExpansionOpacityAfterTransition() {
mScrimController.transitionTo(ScrimState.UNLOCKED);
mScrimController.setPanelExpansion(0.5f);
@@ -511,34 +554,6 @@ public class ScrimControllerTest extends SysuiTestCase {
Assert.assertTrue(mScrimController.wasAnimationJustCancelled());
}
- /**
- * Number of visible notifications affects scrim opacity.
- */
- @Test
- public void testNotificationDensity() {
- mScrimController.transitionTo(ScrimState.KEYGUARD);
- mScrimController.finishAnimationsImmediately();
-
- mScrimController.setNotificationCount(0);
- mScrimController.finishAnimationsImmediately();
- Assert.assertEquals("lower density when no notifications",
- ScrimController.GRADIENT_SCRIM_ALPHA, mScrimBehind.getViewAlpha(), 0.01f);
-
- mScrimController.setNotificationCount(3);
- mScrimController.finishAnimationsImmediately();
- Assert.assertEquals("stronger density when notifications are visible",
- ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, mScrimBehind.getViewAlpha(), 0.01f);
- }
-
- /**
- * Moving from/to states conserves old notification density.
- */
- @Test
- public void testConservesNotificationDensity() {
- testConservesNotificationDensity(0 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA);
- testConservesNotificationDensity(3 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY);
- }
-
@Test
public void testScrimFocus() {
mScrimController.transitionTo(ScrimState.AOD);
@@ -578,7 +593,7 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
public void testEatsTouchEvent() {
HashSet<ScrimState> eatsTouches =
- new HashSet<>(Arrays.asList(ScrimState.AOD, ScrimState.PULSING));
+ new HashSet<>(Collections.singletonList(ScrimState.AOD));
for (ScrimState state : ScrimState.values()) {
if (state == ScrimState.UNINITIALIZED) {
continue;
@@ -613,24 +628,6 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimBehind.getDefaultFocusHighlightEnabled());
}
- /**
- * Conserves old notification density after leaving state and coming back.
- *
- * @param count How many notification.
- * @param expectedAlpha Expected alpha.
- */
- private void testConservesNotificationDensity(int count, float expectedAlpha) {
- mScrimController.setNotificationCount(count);
- mScrimController.transitionTo(ScrimState.UNLOCKED);
- mScrimController.finishAnimationsImmediately();
-
- mScrimController.transitionTo(ScrimState.KEYGUARD);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertEquals("Doesn't respect notification busyness after transition",
- expectedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
- }
-
private void assertScrimTint(ScrimView scrimView, boolean tinted) {
final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT;
final String name = scrimView == mScrimInFront ? "front" : "back";
@@ -738,5 +735,4 @@ public class ScrimControllerTest extends SysuiTestCase {
callback.run();
}
}
-
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index 2bbfd7d8bb8d..12cb99575fb6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -40,7 +40,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -82,7 +82,7 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
Notification n = new Notification.Builder(getContext(), "a").build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0,
false /* animate */);
TestableLooper.get(this).processAllMessages();
@@ -96,7 +96,7 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
Notification n = new Notification.Builder(getContext(), "a").build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
false /* animate */);
TestableLooper.get(this).processAllMessages();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index a45a5c4c3a0e..17611ff40e40 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -95,13 +95,13 @@ import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationData.Entry;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -135,7 +135,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private IDreamManager mDreamManager;
@Mock private ScrimController mScrimController;
@Mock private DozeScrimController mDozeScrimController;
- @Mock private ArrayList<Entry> mNotificationList;
+ @Mock private ArrayList<NotificationEntry> mNotificationList;
@Mock private BiometricUnlockController mBiometricUnlockController;
@Mock private NotificationData mNotificationData;
@Mock
@@ -159,6 +159,8 @@ public class StatusBarTest extends SysuiTestCase {
private NotificationFilter mNotificationFilter;
@Mock
private NotificationAlertingManager mNotificationAlertingManager;
+ @Mock
+ private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
private TestableStatusBar mStatusBar;
private FakeMetricsLogger mMetricsLogger;
@@ -207,7 +209,8 @@ public class StatusBarTest extends SysuiTestCase {
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mEntryManager = new TestableNotificationEntryManager(mContext);
mNotificationLogger = new NotificationLogger(mNotificationListener,
- Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController);
+ Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController,
+ mExpansionStateLogger);
mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
DozeLog.traceDozing(mContext, false /* dozing */);
@@ -409,7 +412,7 @@ public class StatusBarTest extends SysuiTestCase {
.build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.importance = IMPORTANCE_HIGH;
assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
@@ -430,7 +433,7 @@ public class StatusBarTest extends SysuiTestCase {
.build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.importance = IMPORTANCE_HIGH;
assertFalse(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
@@ -447,7 +450,7 @@ public class StatusBarTest extends SysuiTestCase {
Notification n = new Notification.Builder(getContext(), "a").build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.suppressedVisualEffects = SUPPRESSED_EFFECT_PEEK;
entry.importance = IMPORTANCE_HIGH;
@@ -465,7 +468,7 @@ public class StatusBarTest extends SysuiTestCase {
Notification n = new Notification.Builder(getContext(), "a").build();
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
UserHandle.of(0), null, 0);
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationEntry entry = new NotificationEntry(sbn);
entry.importance = IMPORTANCE_HIGH;
assertTrue(mNotificationInterruptionStateProvider.shouldHeadsUp(entry));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java
deleted file mode 100644
index 5c347301bd8c..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2017 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.policy;
-
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NUM_STATUS_ICONS;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_ICONS;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent
- .RESERVED_FOR_LOGBUILDER_LATENCY_MILLIS;
-
-import static org.junit.Assert.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.clearInvocations;
-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 static java.lang.Thread.sleep;
-
-import android.metrics.LogMaker;
-import android.support.test.filters.SmallTest;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableLooper.MessageHandler;
-import android.testing.TestableLooper.RunWithLooper;
-import android.util.Log;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-
-@RunWith(AndroidTestingRunner.class)
-@RunWithLooper
-@SmallTest
-public class IconLoggerImplTest extends SysuiTestCase {
-
- private MetricsLogger mMetricsLogger;
- private IconLoggerImpl mIconLogger;
- private TestableLooper mTestableLooper;
- private MessageHandler mMessageHandler;
-
- @Before
- public void setup() {
- IconLoggerImpl.MIN_LOG_INTERVAL = 5; // Low interval for testing
- mMetricsLogger = mock(MetricsLogger.class);
- mTestableLooper = TestableLooper.get(this);
- mMessageHandler = mock(MessageHandler.class);
- mTestableLooper.setMessageHandler(mMessageHandler);
- String[] iconArray = new String[] {
- "test_icon_1",
- "test_icon_2",
- };
- mContext.getOrCreateTestableResources().addOverride(
- com.android.internal.R.array.config_statusBarIcons, iconArray);
- mIconLogger = new IconLoggerImpl(mContext, mTestableLooper.getLooper(), mMetricsLogger);
- when(mMessageHandler.onMessageHandled(any())).thenReturn(true);
- clearInvocations(mMetricsLogger);
- }
-
- @Test
- public void testIconShown() throws InterruptedException {
- // Should only get one message, for the same icon shown twice.
- mIconLogger.onIconShown("test_icon_2");
- mIconLogger.onIconShown("test_icon_2");
-
- // There should be some delay before execute.
- mTestableLooper.processAllMessages();
- verify(mMessageHandler, never()).onMessageHandled(any());
-
- sleep(10);
- mTestableLooper.processAllMessages();
- verify(mMessageHandler, times(1)).onMessageHandled(any());
- }
-
- @Test
- public void testIconHidden() throws InterruptedException {
- // Add the icon so that it can be removed.
- mIconLogger.onIconShown("test_icon_2");
- sleep(10);
- mTestableLooper.processAllMessages();
- clearInvocations(mMessageHandler);
-
- // Should only get one message, for the same icon shown twice.
- mIconLogger.onIconHidden("test_icon_2");
- mIconLogger.onIconHidden("test_icon_2");
-
- // There should be some delay before execute.
- mTestableLooper.processAllMessages();
- verify(mMessageHandler, never()).onMessageHandled(any());
-
- sleep(10);
- mTestableLooper.processAllMessages();
- verify(mMessageHandler, times(1)).onMessageHandled(any());
- }
-
- @Test
- public void testLog() throws InterruptedException {
- mIconLogger.onIconShown("test_icon_2");
- sleep(10);
- mTestableLooper.processAllMessages();
-
- verify(mMetricsLogger).write(argThat(maker -> {
- if (IconLoggerImpl.MIN_LOG_INTERVAL >
- (long) maker.getTaggedData(RESERVED_FOR_LOGBUILDER_LATENCY_MILLIS)) {
- Log.e("IconLoggerImplTest", "Invalid latency "
- + maker.getTaggedData(RESERVED_FOR_LOGBUILDER_LATENCY_MILLIS));
- return false;
- }
- if (1 != (int) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)) {
- Log.e("IconLoggerImplTest", "Invalid icon count "
- + maker.getTaggedData(FIELD_NUM_STATUS_ICONS));
- return false;
- }
- return true;
- }));
- }
-
- @Test
- public void testBitField() throws InterruptedException {
- mIconLogger.onIconShown("test_icon_2");
- sleep(10);
- mTestableLooper.processAllMessages();
-
- verify(mMetricsLogger).write(argThat(maker -> {
- if ((1 << 1) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
- Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
- (Integer) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)));
- return false;
- }
- return true;
- }));
-
- mIconLogger.onIconShown("test_icon_1");
- sleep(10);
- mTestableLooper.processAllMessages();
-
- verify(mMetricsLogger).write(argThat(maker -> {
- if ((1 << 1 | 1 << 0) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
- Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
- (Integer) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)));
- return false;
- }
- return true;
- }));
-
- mIconLogger.onIconHidden("test_icon_2");
- sleep(10);
- mTestableLooper.processAllMessages();
-
- verify(mMetricsLogger).write(argThat(maker -> {
- if ((1 << 0) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
- Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
- (Integer) maker.getTaggedData(FIELD_STATUS_ICONS)));
- return false;
- }
- return true;
- }));
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 490bbaac7bc7..657f6777c349 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -182,6 +182,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
subs.add(subscription);
}
when(mMockSm.getActiveSubscriptionInfoList()).thenReturn(subs);
+ when(mMockSm.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(subs);
mNetworkController.doUpdateMobileControllers();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index b3ac6be65d36..ed98c62502a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -15,17 +15,23 @@
package com.android.systemui.statusbar.policy;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import android.app.ActivityManager;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ShortcutManager;
import android.os.Handler;
+import android.os.Process;
+import android.os.UserHandle;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
import android.widget.EditText;
import android.widget.ImageButton;
@@ -53,6 +59,10 @@ public class RemoteInputViewTest extends SysuiTestCase {
private static final String TEST_REPLY = "hello";
private static final String TEST_ACTION = "com.android.REMOTE_INPUT_VIEW_ACTION";
+ private static final String DUMMY_MESSAGE_APP_PKG =
+ "com.android.sysuitest.dummynotificationsender";
+ private static final int DUMMY_MESSAGE_APP_ID = Process.LAST_APPLICATION_UID - 1;
+
@Mock private RemoteInputController mController;
@Mock private ShortcutManager mShortcutManager;
@Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
@@ -73,9 +83,6 @@ public class RemoteInputViewTest extends SysuiTestCase {
// Avoid SecurityException RemoteInputView#sendRemoteInput().
mContext.addMockSystemService(ShortcutManager.class, mShortcutManager);
-
- ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow();
- mView = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
}
@After
@@ -83,19 +90,27 @@ public class RemoteInputViewTest extends SysuiTestCase {
mContext.unregisterReceiver(mReceiver);
}
- @Test
- public void testSendRemoteInput_intentContainsResultsAndSource() throws InterruptedException {
+ private void setTestPendingIntent(RemoteInputView view) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
new Intent(TEST_ACTION), 0);
RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).build();
- mView.setPendingIntent(pendingIntent);
- mView.setRemoteInput(new RemoteInput[]{input}, input);
- mView.focus();
+ view.setPendingIntent(pendingIntent);
+ view.setRemoteInput(new RemoteInput[]{input}, input);
+ }
+
+ @Test
+ public void testSendRemoteInput_intentContainsResultsAndSource() throws Exception {
+ ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow();
+ RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
+
+ setTestPendingIntent(view);
- EditText editText = mView.findViewById(R.id.remote_input_text);
+ view.focus();
+
+ EditText editText = view.findViewById(R.id.remote_input_text);
editText.setText(TEST_REPLY);
- ImageButton sendButton = mView.findViewById(R.id.remote_input_send);
+ ImageButton sendButton = view.findViewById(R.id.remote_input_send);
sendButton.performClick();
Intent resultIntent = mReceiver.waitForIntent();
@@ -105,10 +120,55 @@ public class RemoteInputViewTest extends SysuiTestCase {
RemoteInput.getResultsSource(resultIntent));
}
+ private UserHandle getTargetInputMethodUser(UserHandle fromUser, UserHandle toUser)
+ throws Exception {
+ ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow(
+ DUMMY_MESSAGE_APP_PKG,
+ UserHandle.getUid(fromUser.getIdentifier(), DUMMY_MESSAGE_APP_ID),
+ toUser);
+ RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
+
+ setTestPendingIntent(view);
+
+ view.focus();
+
+ EditText editText = view.findViewById(R.id.remote_input_text);
+ EditorInfo editorInfo = new EditorInfo();
+ editorInfo.packageName = DUMMY_MESSAGE_APP_PKG;
+ editorInfo.fieldId = editText.getId();
+ InputConnection ic = editText.onCreateInputConnection(editorInfo);
+ assertNotNull(ic);
+ return editorInfo.targetInputMethodUser;
+ }
+
@Test
- public void testNoCrashWithoutVisibilityListener() {
- mView.setOnVisibilityChangedListener(null);
- mView.setVisibility(View.INVISIBLE);
- mView.setVisibility(View.VISIBLE);
+ public void testEditorInfoTargetInputMethodUserForCallingUser() throws Exception {
+ UserHandle callingUser = Process.myUserHandle();
+ assertEquals(callingUser, getTargetInputMethodUser(callingUser, callingUser));
+ }
+
+ @Test
+ public void testEditorInfoTargetInputMethodUserForDifferentUser() throws Exception {
+ UserHandle differentUser = UserHandle.of(UserHandle.getCallingUserId() + 1);
+ assertEquals(differentUser, getTargetInputMethodUser(differentUser, differentUser));
+ }
+
+ @Test
+ public void testEditorInfoTargetInputMethodUserForAllUser() throws Exception {
+ // For the special pseudo user UserHandle.ALL, EditorInfo#targetInputMethodUser must be
+ // resolved as the current user.
+ UserHandle callingUser = Process.myUserHandle();
+ assertEquals(UserHandle.of(ActivityManager.getCurrentUser()),
+ getTargetInputMethodUser(callingUser, UserHandle.ALL));
+ }
+
+ @Test
+ public void testNoCrashWithoutVisibilityListener() throws Exception {
+ ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow();
+ RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
+
+ view.setOnVisibilityChangedListener(null);
+ view.setVisibility(View.INVISIBLE);
+ view.setVisibility(View.VISIBLE);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
index 2266b479e7ec..3cbf902f1d40 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
@@ -20,6 +20,7 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import android.app.RemoteInput;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
@@ -51,6 +52,9 @@ public class SmartReplyConstantsTest extends SysuiTestCase {
resources.addOverride(R.bool.config_smart_replies_in_notifications_enabled, true);
resources.addOverride(
R.integer.config_smart_replies_in_notifications_max_squeeze_remeasure_attempts, 7);
+ resources.addOverride(
+ R.bool.config_smart_replies_in_notifications_edit_choices_before_sending, false);
+ resources.addOverride(R.bool.config_smart_replies_in_notifications_show_in_heads_up, true);
mConstants = new SmartReplyConstants(Handler.createAsync(Looper.myLooper()), mContext);
}
@@ -104,6 +108,71 @@ public class SmartReplyConstantsTest extends SysuiTestCase {
assertEquals(5, mConstants.getMaxSqueezeRemeasureAttempts());
}
+ @Test
+ public void testGetEffectiveEditChoicesBeforeSendingWithNoConfig() {
+ overrideSetting("enabled=true");
+ triggerConstantsOnChange();
+ assertFalse(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO));
+ assertTrue(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED));
+ assertFalse(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED));
+ }
+
+ @Test
+ public void testGetEffectiveEditChoicesBeforeSendingWithEnabledConfig() {
+ overrideSetting("enabled=true,edit_choices_before_sending=true");
+ triggerConstantsOnChange();
+ assertTrue(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO));
+ assertTrue(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED));
+ assertFalse(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED));
+ }
+
+ @Test
+ public void testGetEffectiveEditChoicesBeforeSendingWithDisabledConfig() {
+ overrideSetting("enabled=true,edit_choices_before_sending=false");
+ triggerConstantsOnChange();
+ assertFalse(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO));
+ assertTrue(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED));
+ assertFalse(
+ mConstants.getEffectiveEditChoicesBeforeSending(
+ RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED));
+ }
+
+ @Test
+ public void testShowInHeadsUpWithNoConfig() {
+ assertTrue(mConstants.isEnabled());
+ assertTrue(mConstants.getShowInHeadsUp());
+ }
+
+ @Test
+ public void testShowInHeadsUpEnabled() {
+ overrideSetting("enabled=true,show_in_heads_up=true");
+ triggerConstantsOnChange();
+ assertTrue(mConstants.getShowInHeadsUp());
+ }
+
+ @Test
+ public void testShowInHeadsUpDisabled() {
+ overrideSetting("enabled=true,show_in_heads_up=false");
+ triggerConstantsOnChange();
+ assertFalse(mConstants.getShowInHeadsUp());
+ }
+
private void overrideSetting(String flags) {
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS, flags);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index c5bac9242b8b..1066bc1a04df 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -50,7 +50,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.statusbar.SmartReplyController;
-import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import com.android.systemui.statusbar.phone.ShadeController;
@@ -94,7 +94,7 @@ public class SmartReplyViewTest extends SysuiTestCase {
private int mSpacing;
@Mock private SmartReplyController mLogger;
- private NotificationData.Entry mEntry;
+ private NotificationEntry mEntry;
private Notification mNotification;
@Mock ActivityStarter mActivityStarter;
@@ -127,7 +127,7 @@ public class SmartReplyViewTest extends SysuiTestCase {
StatusBarNotification sbn = mock(StatusBarNotification.class);
when(sbn.getNotification()).thenReturn(mNotification);
when(sbn.getKey()).thenReturn(TEST_NOTIFICATION_KEY);
- mEntry = new NotificationData.Entry(sbn);
+ mEntry = new NotificationEntry(sbn);
mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person);
}
@@ -855,4 +855,92 @@ public class SmartReplyViewTest extends SysuiTestCase {
assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(2));
assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(3));
}
+
+ /**
+ * Test to ensure that we try to add all possible actions - if we find one action that's too
+ * long we just skip that one rather than quitting altogether.
+ */
+ @Test
+ public void testMeasure_skipTooLongActions() {
+ String[] choices = new String[] {};
+ String[] actions = new String[] {
+ "a1", "a2", "this action is soooooooo long it's ridiculous", "a4"};
+
+ // All actions should be displayed as DOUBLE-line smart action buttons.
+ ViewGroup expectedView = buildExpectedView(new String[] {}, 1 /* lineCount */,
+ createActions(new String[] {"a1", "a2", "a4"}));
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setSmartRepliesAndActions(choices, actions);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonHidden(mView.getChildAt(2));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(3));
+ }
+
+ /**
+ * Test to ensure that we try to add all possible replies - if we find one reply that's too
+ * long we just skip that one rather than quitting altogether.
+ */
+ @Test
+ public void testMeasure_skipTooLongReplies() {
+ String[] choices = new String[] {
+ "r1", "r2", "this reply is soooooooo long it's ridiculous", "r4"};
+ String[] actions = new String[] {};
+
+ // All replies should be displayed as single-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(new String[] {"r1", "r2", "r4"},
+ 1 /* lineCount */, Collections.emptyList());
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setSmartRepliesAndActions(choices, actions);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonHidden(mView.getChildAt(2));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(3));
+ }
+
+ /**
+ * Test to ensure that we try to add all possible replies and actions - if we find a reply or
+ * action that's too long we just skip that one rather than quitting altogether.
+ */
+ @Test
+ public void testMeasure_skipTooLongRepliesAndActions() {
+ String[] choices = new String[] {
+ "r1", "r2", "this reply is soooooooo long it's ridiculous", "r4"};
+ String[] actions = new String[] {
+ "a1", "ThisActionIsSooooooooLongItsRidiculousIPromise"};
+
+ // All replies should be displayed as single-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(new String[] {"r1", "r2", "r4"},
+ 1 /* lineCount */, createActions(new String[] {"a1"}));
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setSmartRepliesAndActions(choices, actions);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(
+ expectedView.getChildAt(0), mView.getChildAt(0)); // r1
+ assertReplyButtonShownWithEqualMeasures(
+ expectedView.getChildAt(1), mView.getChildAt(1)); // r2
+ assertReplyButtonHidden(mView.getChildAt(2)); // long reply
+ assertReplyButtonShownWithEqualMeasures(
+ expectedView.getChildAt(2), mView.getChildAt(3)); // r4
+ assertReplyButtonShownWithEqualMeasures(
+ expectedView.getChildAt(3), mView.getChildAt(4)); // a1
+ assertReplyButtonHidden(mView.getChildAt(5)); // long action
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpaper/AodMaskViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpaper/AodMaskViewTest.java
new file mode 100644
index 000000000000..c44a366e683c
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallpaper/AodMaskViewTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 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.wallpaper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.RectF;
+import android.hardware.display.DisplayManager;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.FeatureFlagUtils;
+import android.view.DisplayInfo;
+import android.view.WindowManager;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AodMaskViewTest extends SysuiTestCase {
+ private AodMaskView mMaskView;
+ private DisplayInfo mDisplayInfo;
+ private ImageWallpaperTransformer mTransformer;
+
+ @Before
+ public void setUp() throws Exception {
+ DisplayManager displayManager =
+ spy((DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE));
+ doNothing().when(displayManager).registerDisplayListener(any(), any());
+ mContext.addMockSystemService(DisplayManager.class, displayManager);
+
+ WallpaperManager wallpaperManager =
+ spy((WallpaperManager) mContext.getSystemService(Context.WALLPAPER_SERVICE));
+ doReturn(null).when(wallpaperManager).getWallpaperInfo();
+ mContext.addMockSystemService(WallpaperManager.class, wallpaperManager);
+
+ mTransformer = spy(new ImageWallpaperTransformer(null /* listener */));
+ mMaskView = spy(new AodMaskView(getContext(), null /* attrs */, mTransformer));
+ mDisplayInfo = new DisplayInfo();
+
+ ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay().getDisplayInfo(mDisplayInfo);
+
+ FeatureFlagUtils.setEnabled(
+ mContext, FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED, true);
+ }
+
+ @After
+ public void tearDown() {
+ FeatureFlagUtils.setEnabled(
+ mContext, FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED, false);
+ }
+
+ @Test
+ public void testCreateMaskView_TransformerIsNotNull() {
+ assertNotNull("mTransformer should not be null", mTransformer);
+ }
+
+ @Test
+ public void testAodMaskView_ShouldNotClickable() {
+ assertFalse("MaskView should not be clickable", mMaskView.isClickable());
+ }
+
+ @Test
+ public void testAodMaskView_OnSizeChange_ShouldUpdateTransformerOffsets() {
+ mMaskView.onSizeChanged(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight, 0, 0);
+ verify(mTransformer, times(1)).updateOffsets();
+ }
+
+ @Test
+ public void testAodMaskView_OnDraw_ShouldDrawTransformedImage() {
+ Canvas c = new Canvas();
+ RectF bounds = new RectF(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
+ mMaskView.onSizeChanged(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight, 0, 0);
+ mMaskView.onStatePreChange(0, 1);
+ mMaskView.onDraw(c);
+ verify(mTransformer, times(1)).drawTransformedImage(c, null, null, bounds);
+ }
+
+ @Test
+ public void testAodMaskView_IsDozing_ShouldUpdateAmbientModeState() {
+ doNothing().when(mMaskView).setAnimatorProperty(anyBoolean());
+ mMaskView.onStatePreChange(0, 1);
+ mMaskView.onDozingChanged(true);
+ verify(mTransformer, times(1)).updateAmbientModeState(true);
+ }
+
+ @Test
+ public void testAodMaskView_IsDozing_ShouldDoTransitionOrDrawFinalFrame() {
+ doNothing().when(mMaskView).setAnimatorProperty(anyBoolean());
+ mMaskView.onStatePreChange(0, 1);
+ mMaskView.onDozingChanged(true);
+ mMaskView.onStatePostChange();
+ mMaskView.onDozingChanged(false);
+ verify(mMaskView, times(1)).invalidate();
+ verify(mMaskView, times(1)).setAnimatorProperty(false);
+ }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpaper/ImageWallpaperTransformerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpaper/ImageWallpaperTransformerTest.java
new file mode 100644
index 000000000000..55b0aaefff51
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallpaper/ImageWallpaperTransformerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 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.wallpaper;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.PointF;
+import android.graphics.RectF;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.DisplayInfo;
+import android.view.WindowManager;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ImageWallpaperTransformerTest extends SysuiTestCase {
+ private DisplayInfo mDisplayInfo;
+ private Bitmap mBitmap;
+ private Canvas mCanvas;
+ private RectF mDestination;
+
+ @Before
+ public void setUp() throws Exception {
+ mDisplayInfo = new DisplayInfo();
+ ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay().getDisplayInfo(mDisplayInfo);
+ int dimension = Math.max(mDisplayInfo.logicalHeight, mDisplayInfo.logicalWidth);
+ mBitmap = Bitmap.createBitmap(dimension, dimension, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ mCanvas.drawColor(Color.RED);
+ mDestination = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
+ }
+
+ @Test
+ public void testVignetteFilter() {
+ VignetteFilter vignette = new VignetteFilter();
+
+ ImageWallpaperTransformer transformer = getTransformer(vignette);
+ transformer.drawTransformedImage(mCanvas, mBitmap, null, mDestination);
+
+ PointF center = vignette.getCenterPoint();
+ int p1 = mBitmap.getPixel((int) center.x, (int) center.y);
+ int p2 = mBitmap.getPixel(0, 0);
+ int p3 = mBitmap.getPixel(mBitmap.getWidth() - 1, mBitmap.getHeight() - 1);
+
+ assertThat(p1).isEqualTo(Color.RED);
+ assertThat(p2 | p3).isEqualTo(Color.BLACK);
+ }
+
+ @Test
+ public void testScrimFilter() {
+ getTransformer(new ScrimFilter())
+ .drawTransformedImage(mCanvas, mBitmap, null, mDestination);
+
+ int pixel = mBitmap.getPixel(0, 0);
+
+ // 0xff4d0000 is the result of 70% alpha pre-multiplied which is 0.7*(0,0,0)+0.3*(255,0,0).
+ assertThat(pixel).isEqualTo(0xff4d0000);
+ }
+
+ private ImageWallpaperTransformer getTransformer(ImageWallpaperFilter filter) {
+ ImageWallpaperTransformer transformer = new ImageWallpaperTransformer(null);
+ transformer.addFilter(filter);
+ transformer.updateDisplayInfo(mDisplayInfo);
+ transformer.updateOffsets();
+ transformer.updateAmbientModeState(true);
+ return transformer;
+ }
+}
diff --git a/packages/VpnDialogs/res/values-as/strings.xml b/packages/VpnDialogs/res/values-as/strings.xml
index 25f16e3b49b9..45d8458f4d45 100644
--- a/packages/VpnDialogs/res/values-as/strings.xml
+++ b/packages/VpnDialogs/res/values-as/strings.xml
@@ -21,7 +21,7 @@
<string name="legacy_title" msgid="192936250066580964">"ভিপিএন সংযোগ হৈ আছে"</string>
<string name="session" msgid="6470628549473641030">"ছেশ্বন:"</string>
<string name="duration" msgid="3584782459928719435">"সময়সীমা:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"পঠিওৱা হ\'ল:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"পঠিওৱা হ’ল:"</string>
<string name="data_received" msgid="4062776929376067820">"পোৱা গ\'ল:"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_1">%2$s</xliff:g> পেকেট / <xliff:g id="NUMBER_0">%1$s</xliff:g> বাইট"</string>
<string name="always_on_disconnected_title" msgid="1906740176262776166">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ কৰিবপৰা নাই"</string>
diff --git a/packages/VpnDialogs/res/values-ne/strings.xml b/packages/VpnDialogs/res/values-ne/strings.xml
index 5019a06a377c..b716c35cfad4 100644
--- a/packages/VpnDialogs/res/values-ne/strings.xml
+++ b/packages/VpnDialogs/res/values-ne/strings.xml
@@ -25,7 +25,7 @@
<string name="data_received" msgid="4062776929376067820">"प्राप्त भयो:"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> बाइटहरू / <xliff:g id="NUMBER_1">%2$s</xliff:g> प्याकेटहरू"</string>
<string name="always_on_disconnected_title" msgid="1906740176262776166">"सधैँ-सक्रिय रहने VPN सेवामा जडान गर्न सकिँदैन"</string>
- <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> लाई सधैँ जडान भइरहनेगरि सेटअप गरिएको छ तर यसलाई अहिले नै जडान गर्न मिल्दैन। तपाईंको फोन <xliff:g id="VPN_APP_1">%1$s</xliff:g> मा पुन: जडान नहुँदासम्म यसले कुनै सार्वजनिक नेटवर्क प्रयोग गर्नेछ।"</string>
+ <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> लाई सधैँ जडान भइरहनेगरि सेटअप गरिएको छ तर यसलाई अहिले नै जडान गर्न मिल्दैन। तपाईंको फोन <xliff:g id="VPN_APP_1">%1$s</xliff:g> मा पुन: जडान नहुँदासम्म यसले कुनै सार्वजनिक नेटवर्क प्रयोग गर्ने छ।"</string>
<string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"<xliff:g id="VPN_APP">%1$s</xliff:g> लाई सधैँ पनि जडान भइरहनेगरि सेटअप गरिएको छ तर यसलाई अहिले नै जडान गर्न मिल्दैन। VPN पुन: जडान नहुँदासम्म तपाईंसँग कुनै पनि इन्टरनेट रहनेछैन।"</string>
<string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string>
<string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN सम्बन्धी सेटिङहरू परिवर्तन गर्नुहोस्"</string>
diff --git a/packages/WallpaperCropper/Android.mk b/packages/WallpaperCropper/Android.mk
index 848f2bd1a6fe..2fa1ddee0fd9 100644
--- a/packages/WallpaperCropper/Android.mk
+++ b/packages/WallpaperCropper/Android.mk
@@ -8,6 +8,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := WallpaperCropper
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
+LOCAL_PRODUCT_MODULE := true
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
diff --git a/packages/WallpaperCropper/CleanSpec.mk b/packages/WallpaperCropper/CleanSpec.mk
new file mode 100644
index 000000000000..e6d8d5a774f1
--- /dev/null
+++ b/packages/WallpaperCropper/CleanSpec.mk
@@ -0,0 +1,50 @@
+# Copyright (C) 2019 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.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list. These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list. E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/WallpaperCropper)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml b/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml
index 165aab21c2e8..a6aa64c03c50 100644
--- a/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml
+++ b/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml
@@ -19,7 +19,7 @@
<!-- Name of a font family to use for body text. -->
<string name="config_bodyFontFamily" translatable="false">source-sans-pro</string>
<!-- Name of a font family to use for medium body text. -->
- <string name="config_bodyFontFamilyMedium" translatable="false">source-sans-pro-medium</string>
+ <string name="config_bodyFontFamilyMedium" translatable="false">source-sans-pro-semi-bold</string>
<!-- Name of a font family to use for headlines. If empty, falls back to platform default -->
<string name="config_headlineFontFamily" translatable="false">arbutus-slab</string>
<!-- Name of the font family used for system surfaces where the font should use medium weight -->
diff --git a/packages/overlays/FontArvoLatoOverlay/res/values/config.xml b/packages/overlays/FontArvoLatoOverlay/res/values/config.xml
index 229c578b22da..4e70d72aaae8 100644
--- a/packages/overlays/FontArvoLatoOverlay/res/values/config.xml
+++ b/packages/overlays/FontArvoLatoOverlay/res/values/config.xml
@@ -19,10 +19,10 @@
<!-- Name of a font family to use for body text. -->
<string name="config_bodyFontFamily" translatable="false">lato</string>
<!-- Name of a font family to use for medium body text. -->
- <string name="config_bodyFontFamilyMedium" translatable="false">lato-medium</string>
+ <string name="config_bodyFontFamilyMedium" translatable="false">lato-bold</string>
<!-- Name of a font family to use for headlines. If empty, falls back to platform default -->
<string name="config_headlineFontFamily" translatable="false">arvo</string>
<!-- Name of the font family used for system surfaces where the font should use medium weight -->
- <string name="config_headlineFontFamilyMedium" translatable="false">arvo-medium</string>
+ <string name="config_headlineFontFamilyMedium" translatable="false">arvo-bold</string>
</resources>
diff --git a/packages/services/PacProcessor/Android.mk b/packages/services/PacProcessor/Android.mk
index 295b3d8bc979..be9ba4351056 100644
--- a/packages/services/PacProcessor/Android.mk
+++ b/packages/services/PacProcessor/Android.mk
@@ -26,6 +26,6 @@ LOCAL_PACKAGE_NAME := PacProcessor
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
-LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor libpac
+LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor
include $(BUILD_PACKAGE)
diff --git a/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
index 846ff2517d12..d969c69cfaf1 100644
--- a/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
+++ b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
@@ -16,6 +16,9 @@
#define LOG_TAG "PacProcessor"
+#include <stdlib.h>
+#include <string>
+
#include <utils/Log.h>
#include <utils/Mutex.h>
#include "android_runtime/AndroidRuntime.h"
@@ -23,40 +26,24 @@
#include "jni.h"
#include <nativehelper/JNIHelp.h>
-#include "proxy_resolver_v8.h"
+#include "proxy_resolver_v8_wrapper.h"
namespace android {
-class ProxyErrorLogger : public net::ProxyErrorListener {
-public:
- ~ProxyErrorLogger() {
-
- }
- void AlertMessage(String16 message) {
- String8 str(message);
- ALOGD("Alert: %s", str.string());
- }
- void ErrorMessage(String16 message) {
- String8 str(message);
- ALOGE("Error: %s", str.string());
- }
-};
-
-net::ProxyResolverV8* proxyResolver = NULL;
-ProxyErrorLogger* logger = NULL;
+ProxyResolverV8Handle* proxyResolver = NULL;
bool pacSet = false;
-String16 jstringToString16(JNIEnv* env, jstring jstr) {
+std::u16string jstringToString16(JNIEnv* env, jstring jstr) {
const jchar* str = env->GetStringCritical(jstr, 0);
- String16 str16(reinterpret_cast<const char16_t*>(str),
+ std::u16string str16(reinterpret_cast<const char16_t*>(str),
env->GetStringLength(jstr));
env->ReleaseStringCritical(jstr, str);
return str16;
}
-jstring string16ToJstring(JNIEnv* env, String16 string) {
- const char16_t* str = string.string();
- size_t len = string.size();
+jstring string16ToJstring(JNIEnv* env, std::u16string string) {
+ const char16_t* str = string.data();
+ size_t len = string.length();
return env->NewString(reinterpret_cast<const jchar*>(str), len);
}
@@ -64,9 +51,7 @@ jstring string16ToJstring(JNIEnv* env, String16 string) {
static jboolean com_android_pacprocessor_PacNative_createV8ParserNativeLocked(JNIEnv* /* env */,
jobject) {
if (proxyResolver == NULL) {
- logger = new ProxyErrorLogger();
- proxyResolver = new net::ProxyResolverV8(net::ProxyResolverJSBindings::CreateDefault(),
- logger);
+ proxyResolver = ProxyResolverV8Handle_new();
pacSet = false;
return JNI_FALSE;
}
@@ -76,9 +61,7 @@ static jboolean com_android_pacprocessor_PacNative_createV8ParserNativeLocked(JN
static jboolean com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked(JNIEnv* /* env */,
jobject) {
if (proxyResolver != NULL) {
- delete logger;
- delete proxyResolver;
- logger = NULL;
+ ProxyResolverV8Handle_delete(proxyResolver);
proxyResolver = NULL;
return JNI_FALSE;
}
@@ -87,14 +70,14 @@ static jboolean com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked(J
static jboolean com_android_pacprocessor_PacNative_setProxyScriptNativeLocked(JNIEnv* env, jobject,
jstring script) {
- String16 script16 = jstringToString16(env, script);
+ std::u16string script16 = jstringToString16(env, script);
if (proxyResolver == NULL) {
ALOGE("V8 Parser not started when setting PAC script");
return JNI_TRUE;
}
- if (proxyResolver->SetPacScript(script16) != OK) {
+ if (ProxyResolverV8Handle_SetPacScript(proxyResolver, script16.data()) != OK) {
ALOGE("Unable to set PAC script");
return JNI_TRUE;
}
@@ -105,9 +88,8 @@ static jboolean com_android_pacprocessor_PacNative_setProxyScriptNativeLocked(JN
static jstring com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked(JNIEnv* env, jobject,
jstring url, jstring host) {
- String16 url16 = jstringToString16(env, url);
- String16 host16 = jstringToString16(env, host);
- String16 ret;
+ std::u16string url16 = jstringToString16(env, url);
+ std::u16string host16 = jstringToString16(env, host);
if (proxyResolver == NULL) {
ALOGE("V8 Parser not initialized when running PAC script");
@@ -119,12 +101,14 @@ static jstring com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked(J
return NULL;
}
- if (proxyResolver->GetProxyForURL(url16, host16, &ret) != OK) {
- String8 ret8(ret);
- ALOGE("Error Running PAC: %s", ret8.string());
+ std::unique_ptr<char16_t, decltype(&free)> result = std::unique_ptr<char16_t, decltype(&free)>(
+ ProxyResolverV8Handle_GetProxyForURL(proxyResolver, url16.data(), host16.data()), &free);
+ if (result.get() == NULL) {
+ ALOGE("Error Running PAC");
return NULL;
}
+ std::u16string ret(result.get());
jstring jret = string16ToJstring(env, ret);
return jret;
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index 3379b1b6d15a..8261fe89f778 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -213,6 +213,25 @@ message MetricsEvent {
IOOP_SYNC = 4;
}
+ // Subtypes of notifications blocking helper view
+ // (NOTIFICATION_BLOCKING_HELPER).
+ enum NotificationBlockingHelper {
+ BLOCKING_HELPER_UNKNOWN = 0;
+ BLOCKING_HELPER_DISPLAY = 1;
+ BLOCKING_HELPER_DISMISS = 2;
+ // When the view of the notification blocking helper was triggered by
+ // system.
+ BLOCKING_HELPER_TRIGGERED_BY_SYSTEM = 3;
+ // "block" was clicked.
+ BLOCKING_HELPER_CLICK_BLOCKED = 4;
+ // "stay silent" was clicked.
+ BLOCKING_HELPER_CLICK_STAY_SILENT = 5;
+ // "alert me" was clicked.
+ BLOCKING_HELPER_CLICK_ALERT_ME = 6;
+ // "undo" was clicked (enables the user to undo "stop notification" action).
+ BLOCKING_HELPER_CLICK_UNDO = 7;
+ }
+
// Known visual elements: views or controls.
enum View {
// Unknown view
@@ -3684,7 +3703,7 @@ message MetricsEvent {
ACTION_SETTINGS_TILE_CLICK = 830;
// OPEN: Notification unsnoozed. CLOSE: Notification snoozed. UPDATE: snoozed notification
- // updated
+ // updated. TYPE_DISMISS: snoozing canceled due to data being cleared on package
// CATEGORY: NOTIFICATION
// OS: O
NOTIFICATION_SNOOZED = 831;
@@ -5325,7 +5344,7 @@ message MetricsEvent {
// OS: P
ACCESSIBILITY_VIBRATION = 1292;
- // OPEN: Settings > Accessibility > Vibration > Ring & notification vibration
+ // OPEN: Settings > Accessibility > Vibration > Notification vibration
// CATEGORY: SETTINGS
// OS: P
ACCESSIBILITY_VIBRATION_NOTIFICATION = 1293;
@@ -6735,8 +6754,73 @@ message MetricsEvent {
// OS: Q
SETTINGS_GUP_DASHBOARD = 1613;
- // ---- End Q Constants, all Q constants go above this line ----
+ // CATEGORY: The category for all actions relating to language detection logging.
+ // OS: Q
+ LANGUAGE_DETECTION = 1614;
+
+ // CATEGORY: The category for all actions relating to conversation actions logging.
+ // OS: Q
+ CONVERSATION_ACTIONS = 1615;
+
+ // ACTION: Actions from a text classifier are shown to user.
+ // CATEGORY: CONVERSATION_ACTIONS
+ // OS: Q
+ ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN = 1616;
+
+ // ACTION: Event time of a text classifier event in unix timestamp.
+ // CATEGORY: CONVERSATION_ACTIONS, LANGUAGE_DETECTION
+ // OS: Q
+ FIELD_TEXT_CLASSIFIER_EVENT_TIME = 1617;
+
+ // ACTION: Users compose their own replies instead of using suggested ones.
+ // CATEGORY: CONVERSATION_ACTIONS
+ // OS: Q
+ ACTION_TEXT_CLASSIFIER_MANUAL_REPLY = 1618;
+
+ // ACTION: Text classifier generates an action.
+ // CATEGORY: CONVERSATION_ACTIONS
+ // OS: Q
+ ACTION_TEXT_CLASSIFIER_ACTIONS_GENERATED = 1619;
+
+ // OPEN: Settings > Accessibility > Vibration > Ring vibration
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ACCESSIBILITY_VIBRATION_RING = 1620;
+ // ACTION: Notification blocking helper view, which helps the user to block
+ // application or channel from showing notifications.
+ // SUBTYPE: NotificationBlockingHelper enum.
+ // CATEGORY: NOTIFICATION
+ // OS: Q
+ NOTIFICATION_BLOCKING_HELPER = 1621;
+
+ // ACTION: Tap & Pay -> Default Application Setting -> Use Forground
+ // OS: Q
+ ACTION_NFC_PAYMENT_FOREGROUND_SETTING = 1622;
+
+ // ACTION: Tap & Pay -> Default Application Setting -> Use Default
+ // OS: Q
+ ACTION_NFC_PAYMENT_ALWAYS_SETTING = 1623;
+
+ // OPEN: Settings > System > Input & Gesture > Skip song gesture
+ // OS: Q
+ SETTINGS_GESTURE_SKIP_SONG = 1624;
+
+ // OPEN: Settings > System > Input & Gesture > Silence gesture
+ // OS: Q
+ SETTINGS_GESTURE_SILENCE = 1625;
+
+ // OPEN: Settings > System > Input & Gesture > Tap screen gesture
+ // OS: Q
+ SETTINGS_GESTURE_TAP_SCREEN = 1626;
+
+ // OPEN: Settings > Network & internet > Click Mobile network to land on a page with a list of
+ // SIM/eSIM subscriptions.
+ // CATEGORY: SETTINGS
+ // OS: Q
+ MOBILE_NETWORK_LIST = 1627;
+
+ // ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
}
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index e9ce737eb5a5..bcc43a763599 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -485,6 +485,9 @@ message WifiLog {
// Multiple lists of timestamped link layer stats with labels to represent whether wifi is usable
repeated WifiUsabilityStats wifi_usability_stats_list = 126;
+
+ // Counts the occurrences of each Wifi usability score provided by external app
+ repeated WifiUsabilityScoreCount wifi_usability_score_count = 127;
}
// Information that gets logged for every WiFi connection.
@@ -670,6 +673,15 @@ message WifiScoreCount {
optional int32 count = 2;
}
+// Counts the number of instances of a specific Wifi Usability Score
+message WifiUsabilityScoreCount {
+ // Wifi Usability Score
+ optional int32 score = 1;
+
+ // Number of Wifi score reports with this score
+ optional int32 count = 2;
+}
+
// Number of occurrences of a specific link speed (Mbps)
// and sum of rssi (dBm) and rssi^2 (dBm^2)
message LinkSpeedCount {
@@ -826,6 +838,10 @@ message StaEvent {
// Wifi is turned off
TYPE_WIFI_DISABLED = 19;
+
+ // The NetworkAgent Wifi usability score has changed in a way that may
+ // impact connectivity
+ TYPE_WIFI_USABILITY_SCORE_BREACH = 20;
}
enum FrameworkDisconnectReason {
@@ -940,6 +956,9 @@ message StaEvent {
// NetworkAgent score of connected wifi
optional int32 last_score = 14 [default = -1];
+
+ // NetworkAgent Wifi usability score of connected wifi
+ optional int32 last_wifi_usability_score = 15 [default = -1];
}
// Wi-Fi Aware metrics
@@ -1653,6 +1672,10 @@ message WifiIsUnusableEvent {
// Firmware alert code. Only valid when the event was triggered by a firmware alert, otherwise -1.
optional int32 firmware_alert_code = 10 [default = -1];
+
+ // NetworkAgent wifi usability score of connected wifi.
+ // Defaults to -1 if the score was never set.
+ optional int32 last_wifi_usability_score = 11 [default = -1];
}
message PasspointProfileTypeCount {
@@ -1765,6 +1788,15 @@ message WifiUsabilityStatsEntry {
// The total time spent on hotspot2.0 scans and GAS exchange in ms counted from the last radio
// chip reset
optional int64 total_hotspot_2_scan_time_ms = 16;
+
+ // Internal framework Wifi score
+ optional int32 wifi_score = 17;
+
+ // Wifi usability score provided by external system app
+ optional int32 wifi_usability_score = 18;
+
+ // Sequence number from external system app to framework
+ optional int32 seq_num_to_framework = 19;
}
message WifiUsabilityStats {
diff --git a/services/Android.bp b/services/Android.bp
index 58a09977596f..31385edd015f 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -17,17 +17,21 @@ java_library {
static_libs: [
"services.core",
"services.accessibility",
+ "services.appprediction",
"services.appwidget",
"services.autofill",
"services.backup",
"services.companion",
"services.contentcapture",
+ "services.contentsuggestions",
"services.coverage",
"services.devicepolicy",
+ "services.ipmemorystore",
"services.midi",
"services.net",
"services.print",
"services.restrictions",
+ "services.startop",
"services.usage",
"services.usb",
"services.voiceinteraction",
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 36ca52a6e600..763c16f771d0 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -16,6 +16,11 @@
package com.android.server.accessibility;
+import static android.accessibilityservice.AccessibilityService.SHOW_MODE_AUTO;
+import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE;
+import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN;
+import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HIDDEN;
+import static android.accessibilityservice.AccessibilityService.SHOW_MODE_IGNORE_HARD_KEYBOARD;
import static android.accessibilityservice.AccessibilityService.SHOW_MODE_MASK;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
import static android.view.accessibility.AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED;
@@ -23,13 +28,9 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBIL
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK;
+
import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
-import static android.accessibilityservice.AccessibilityService.SHOW_MODE_AUTO;
-import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HIDDEN;
-import static android.accessibilityservice.AccessibilityService.SHOW_MODE_IGNORE_HARD_KEYBOARD;
-import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE;
-import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN;
import android.Manifest;
import android.accessibilityservice.AccessibilityService;
@@ -121,6 +122,8 @@ import com.android.server.SystemService;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
+import libcore.util.EmptyArray;
+
import org.xmlpull.v1.XmlPullParserException;
import java.io.FileDescriptor;
@@ -139,8 +142,6 @@ import java.util.Set;
import java.util.function.Consumer;
import java.util.function.IntSupplier;
-import libcore.util.EmptyArray;
-
/**
* This class is instantiated by the system as a system level service and can be
* accessed only by the system. The task of this service is to be a centralized
@@ -1827,8 +1828,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
updateFilterKeyEventsLocked(userState);
updateTouchExplorationLocked(userState);
updatePerformGesturesLocked(userState);
- updateDisplayDaltonizerLocked(userState);
- updateDisplayInversionLocked(userState);
updateMagnificationLocked(userState);
scheduleUpdateFingerprintGestureHandling(userState);
scheduleUpdateInputFilter(userState);
@@ -2187,14 +2186,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
return false;
}
- private void updateDisplayDaltonizerLocked(UserState userState) {
- DisplayAdjustmentUtils.applyDaltonizerSetting(mContext, userState.mUserId);
- }
-
- private void updateDisplayInversionLocked(UserState userState) {
- DisplayAdjustmentUtils.applyInversionSetting(mContext, userState.mUserId);
- }
-
private void updateMagnificationLocked(UserState userState) {
if (userState.mUserId != mCurrentUserId) {
return;
@@ -4104,15 +4095,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
private final Uri mTouchExplorationGrantedAccessibilityServicesUri = Settings.Secure
.getUriFor(Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
- private final Uri mDisplayInversionEnabledUri = Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
-
- private final Uri mDisplayDaltonizerEnabledUri = Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
-
- private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER);
-
private final Uri mHighTextContrastUri = Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED);
@@ -4153,12 +4135,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mTouchExplorationGrantedAccessibilityServicesUri,
false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(
- mDisplayInversionEnabledUri, false, this, UserHandle.USER_ALL);
- contentResolver.registerContentObserver(
- mDisplayDaltonizerEnabledUri, false, this, UserHandle.USER_ALL);
- contentResolver.registerContentObserver(
- mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL);
- contentResolver.registerContentObserver(
mHighTextContrastUri, false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(
mAccessibilitySoftKeyboardModeUri, false, this, UserHandle.USER_ALL);
@@ -4202,11 +4178,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
if (readTouchExplorationGrantedAccessibilityServicesLocked(userState)) {
onUserStateChangedLocked(userState);
}
- } else if (mDisplayDaltonizerEnabledUri.equals(uri)
- || mDisplayDaltonizerUri.equals(uri)) {
- updateDisplayDaltonizerLocked(userState);
- } else if (mDisplayInversionEnabledUri.equals(uri)) {
- updateDisplayInversionLocked(userState);
} else if (mHighTextContrastUri.equals(uri)) {
if (readHighTextContrastEnabledSettingLocked(userState)) {
onUserStateChangedLocked(userState);
diff --git a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
deleted file mode 100644
index c81a876fe39e..000000000000
--- a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2013 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.accessibility;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.Binder;
-import android.provider.Settings.Secure;
-import android.view.accessibility.AccessibilityManager;
-
-import com.android.server.LocalServices;
-import com.android.server.display.DisplayTransformManager;
-
-/**
- * Utility methods for performing accessibility display adjustments.
- */
-class DisplayAdjustmentUtils {
-
- /** Default inversion mode for display color correction. */
- private static final int DEFAULT_DISPLAY_DALTONIZER =
- AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
-
- /** Matrix and offset used for converting color to gray-scale. */
- private static final float[] MATRIX_GRAYSCALE = new float[] {
- .2126f, .2126f, .2126f, 0,
- .7152f, .7152f, .7152f, 0,
- .0722f, .0722f, .0722f, 0,
- 0, 0, 0, 1
- };
-
- /**
- * Matrix and offset used for luminance inversion. Represents a transform
- * from RGB to YIQ color space, rotation around the Y axis by 180 degrees,
- * transform back to RGB color space, and subtraction from 1. The last row
- * represents a non-multiplied addition, see surfaceflinger's ProgramCache
- * for full implementation details.
- */
- private static final float[] MATRIX_INVERT_COLOR = new float[] {
- 0.402f, -0.598f, -0.599f, 0,
- -1.174f, -0.174f, -1.175f, 0,
- -0.228f, -0.228f, 0.772f, 0,
- 1, 1, 1, 1
- };
-
- public static void applyDaltonizerSetting(Context context, int userId) {
- final ContentResolver cr = context.getContentResolver();
- final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
-
- int daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED;
- long identity = Binder.clearCallingIdentity();
- try {
- if (Secure.getIntForUser(cr,
- Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
- daltonizerMode = Secure.getIntForUser(cr,
- Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER, userId);
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
-
- float[] grayscaleMatrix = null;
- if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
- // Monochromacy isn't supported by the native Daltonizer.
- grayscaleMatrix = MATRIX_GRAYSCALE;
- daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED;
- }
- dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE, grayscaleMatrix);
- dtm.setDaltonizerMode(daltonizerMode);
- }
-
- /**
- * Applies the specified user's display color adjustments.
- */
- public static void applyInversionSetting(Context context, int userId) {
- final ContentResolver cr = context.getContentResolver();
- final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
-
- long identity = Binder.clearCallingIdentity();
- try {
- final boolean invertColors = Secure.getIntForUser(cr,
- Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0;
- dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_INVERT_COLOR,
- invertColors ? MATRIX_INVERT_COLOR : null);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-}
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
index 17bf5705d489..6a97fbbf30da 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
@@ -32,7 +32,6 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.util.MathUtils;
import android.util.Slog;
-import android.util.SparseArray;
import android.view.Display;
import android.view.MagnificationSpec;
import android.view.View;
@@ -40,8 +39,6 @@ import android.view.animation.DecelerateInterpolator;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.SomeArgs;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.wm.WindowManagerInternal;
@@ -63,7 +60,7 @@ public class MagnificationController {
private static final String LOG_TAG = "MagnificationController";
public static final float MIN_SCALE = 1.0f;
- public static final float MAX_SCALE = 5.0f;
+ public static final float MAX_SCALE = 8.0f;
private static final boolean DEBUG_SET_MAGNIFICATION_SPEC = false;
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
index 12e7376b750f..80049e80e1a9 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
@@ -115,8 +115,11 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
private static final boolean DEBUG_PANNING_SCALING = false || DEBUG_ALL;
private static final boolean DEBUG_EVENT_STREAM = false || DEBUG_ALL;
+ // The MIN_SCALE is different from MagnificationController.MIN_SCALE due
+ // to AccessibilityService.MagnificationController#setScale() has
+ // different scale range
private static final float MIN_SCALE = 2.0f;
- private static final float MAX_SCALE = 5.0f;
+ private static final float MAX_SCALE = MagnificationController.MAX_SCALE;
@VisibleForTesting final MagnificationController mMagnificationController;
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index cf9f233b8fe2..8ffaddefd3ef 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -462,7 +462,7 @@ class TouchExplorer extends BaseEventStreamTransformation
return false;
}
- endGestureDetection();
+ endGestureDetection(true);
mAms.onGesture(gestureId);
@@ -472,7 +472,7 @@ class TouchExplorer extends BaseEventStreamTransformation
@Override
public boolean onGestureCancelled(MotionEvent event, int policyFlags) {
if (mCurrentState == STATE_GESTURE_DETECTING) {
- endGestureDetection();
+ endGestureDetection(event.getActionMasked() == MotionEvent.ACTION_UP);
return true;
} else if (mCurrentState == STATE_TOUCH_EXPLORING) {
// If the finger is still moving, pass the event on.
@@ -804,13 +804,19 @@ class TouchExplorer extends BaseEventStreamTransformation
}
}
- private void endGestureDetection() {
+ private void endGestureDetection(boolean interactionEnd) {
mAms.onTouchInteractionEnd();
// Announce the end of the gesture recognition.
sendAccessibilityEvent(AccessibilityEvent.TYPE_GESTURE_DETECTION_END);
- // Announce the end of a the touch interaction.
- sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_INTERACTION_END);
+ if (interactionEnd) {
+ // Announce the end of a the touch interaction.
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_INTERACTION_END);
+ } else {
+ // If gesture detection is end, but user doesn't release the finger, announce the
+ // transition to exploration state.
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START);
+ }
mExitGestureDetectionModeDelayed.cancel();
mCurrentState = STATE_TOUCH_EXPLORING;
@@ -889,7 +895,6 @@ class TouchExplorer extends BaseEventStreamTransformation
MotionEvent event = mInjectedPointerTracker.getLastInjectedHoverEvent();
if (event != null && event.getActionMasked() == MotionEvent.ACTION_HOVER_EXIT) {
final int pointerIdBits = event.getPointerIdBits();
- sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START);
sendMotionEvent(event, MotionEvent.ACTION_HOVER_ENTER, pointerIdBits, policyFlags);
}
}
@@ -1148,8 +1153,8 @@ class TouchExplorer extends BaseEventStreamTransformation
sendAccessibilityEvent(AccessibilityEvent.TYPE_GESTURE_DETECTION_END);
// Clearing puts is in touch exploration state with a finger already
// down, so announce the transition to exploration state.
- sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START);
clear();
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START);
}
}
diff --git a/services/appprediction/Android.bp b/services/appprediction/Android.bp
new file mode 100644
index 000000000000..a7be58783aab
--- /dev/null
+++ b/services/appprediction/Android.bp
@@ -0,0 +1,5 @@
+java_library_static {
+ name: "services.appprediction",
+ srcs: ["java/**/*.java"],
+ libs: ["services.core"],
+}
diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java
new file mode 100644
index 000000000000..833eaa06d759
--- /dev/null
+++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2018 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.appprediction;
+
+import static android.Manifest.permission.MANAGE_APP_PREDICTIONS;
+import static android.content.Context.APP_PREDICTION_SERVICE;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.IPredictionCallback;
+import android.app.prediction.IPredictionManager;
+import android.content.Context;
+import android.content.pm.ParceledListSlice;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.UserHandle;
+
+import com.android.server.infra.AbstractMasterSystemService;
+import com.android.server.infra.FrameworkResourcesServiceNameResolver;
+
+import java.io.FileDescriptor;
+import java.util.function.Consumer;
+
+/**
+ * A service used to predict app and shortcut usage.
+ *
+ * <p>The data collected by this service can be analyzed and combined with other sources to provide
+ * predictions in different areas of the system such as Launcher and Share sheet.
+ */
+public class AppPredictionManagerService extends
+ AbstractMasterSystemService<AppPredictionManagerService, AppPredictionPerUserService> {
+
+ private static final String TAG = AppPredictionManagerService.class.getSimpleName();
+
+ private static final int MAX_TEMP_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes
+
+ public AppPredictionManagerService(Context context) {
+ super(context, new FrameworkResourcesServiceNameResolver(context,
+ com.android.internal.R.string.config_defaultAppPredictionService), null);
+ }
+
+ @Override
+ protected AppPredictionPerUserService newServiceLocked(int resolvedUserId, boolean disabled) {
+ return new AppPredictionPerUserService(this, mLock, resolvedUserId);
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(APP_PREDICTION_SERVICE, new PredictionManagerServiceStub());
+ }
+
+ @Override
+ protected void enforceCallingPermissionForManagement() {
+ getContext().enforceCallingPermission(MANAGE_APP_PREDICTIONS, TAG);
+ }
+
+ @Override
+ protected int getMaximumTemporaryServiceDurationMs() {
+ return MAX_TEMP_SERVICE_DURATION_MS;
+ }
+
+ private class PredictionManagerServiceStub extends IPredictionManager.Stub {
+
+ @Override
+ public void createPredictionSession(@NonNull AppPredictionContext context,
+ @NonNull AppPredictionSessionId sessionId) {
+ runForUserLocked((service) ->
+ service.onCreatePredictionSessionLocked(context, sessionId));
+ }
+
+ @Override
+ public void notifyAppTargetEvent(@NonNull AppPredictionSessionId sessionId,
+ @NonNull AppTargetEvent event) {
+ runForUserLocked((service) -> service.notifyAppTargetEventLocked(sessionId, event));
+ }
+
+ @Override
+ public void notifyLocationShown(@NonNull AppPredictionSessionId sessionId,
+ @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) {
+ runForUserLocked((service) ->
+ service.notifyLocationShownLocked(sessionId, launchLocation, targetIds));
+ }
+
+ @Override
+ public void sortAppTargets(@NonNull AppPredictionSessionId sessionId,
+ @NonNull ParceledListSlice targets,
+ IPredictionCallback callback) {
+ runForUserLocked((service) ->
+ service.sortAppTargetsLocked(sessionId, targets, callback));
+ }
+
+ @Override
+ public void registerPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ runForUserLocked((service) ->
+ service.registerPredictionUpdatesLocked(sessionId, callback));
+ }
+
+ public void unregisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ runForUserLocked((service) ->
+ service.unregisterPredictionUpdatesLocked(sessionId, callback));
+ }
+
+ @Override
+ public void requestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) {
+ runForUserLocked((service) -> service.requestPredictionUpdateLocked(sessionId));
+ }
+
+ @Override
+ public void onDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) {
+ runForUserLocked((service) -> service.onDestroyPredictionSessionLocked(sessionId));
+ }
+
+ public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
+ @Nullable FileDescriptor err,
+ @NonNull String[] args, @Nullable ShellCallback callback,
+ @NonNull ResultReceiver resultReceiver) throws RemoteException {
+ new AppPredictionManagerServiceShellCommand(AppPredictionManagerService.this)
+ .exec(this, in, out, err, args, callback, resultReceiver);
+ }
+
+ private void runForUserLocked(@NonNull Consumer<AppPredictionPerUserService> c) {
+ final int userId = UserHandle.getCallingUserId();
+ // TODO(b/111701043): Determine what permission model we want for this
+ long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ final AppPredictionPerUserService service = getServiceForUserLocked(userId);
+ c.accept(service);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+}
diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerServiceShellCommand.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerServiceShellCommand.java
new file mode 100644
index 000000000000..ed7cc67aa46f
--- /dev/null
+++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerServiceShellCommand.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.appprediction;
+
+import android.annotation.NonNull;
+import android.os.ShellCommand;
+
+import java.io.PrintWriter;
+
+/**
+ * The shell command implementation for the AppPredictionManagerService.
+ */
+public class AppPredictionManagerServiceShellCommand extends ShellCommand {
+
+ private static final String TAG =
+ AppPredictionManagerServiceShellCommand.class.getSimpleName();
+
+ private final AppPredictionManagerService mService;
+
+ public AppPredictionManagerServiceShellCommand(@NonNull AppPredictionManagerService service) {
+ mService = service;
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+ final PrintWriter pw = getOutPrintWriter();
+ switch (cmd) {
+ case "set": {
+ final String what = getNextArgRequired();
+ switch (what) {
+ case "temporary-service": {
+ final int userId = Integer.parseInt(getNextArgRequired());
+ String serviceName = getNextArg();
+ if (serviceName == null) {
+ mService.resetTemporaryService(userId);
+ return 0;
+ }
+ final int duration = Integer.parseInt(getNextArgRequired());
+ mService.setTemporaryService(userId, serviceName, duration);
+ pw.println("AppPredictionService temporarily set to " + serviceName
+ + " for " + duration + "ms");
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ return 0;
+ }
+
+ @Override
+ public void onHelp() {
+ try (PrintWriter pw = getOutPrintWriter()) {
+ pw.println("AppPredictionManagerService commands:");
+ pw.println(" help");
+ pw.println(" Prints this help text.");
+ pw.println("");
+ pw.println(" set temporary-service USER_ID [COMPONENT_NAME DURATION]");
+ pw.println(" Temporarily (for DURATION ms) changes the service implemtation.");
+ pw.println(" To reset, call with just the USER_ID argument.");
+ pw.println("");
+ }
+ }
+}
diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java
new file mode 100644
index 000000000000..24d592c38afb
--- /dev/null
+++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2018 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.appprediction;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AppGlobals;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.IPredictionCallback;
+import android.content.ComponentName;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ServiceInfo;
+import android.os.RemoteException;
+import android.service.appprediction.AppPredictionService;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.infra.AbstractPerUserSystemService;
+
+/**
+ * Per-user instance of {@link AppPredictionManagerService}.
+ */
+public class AppPredictionPerUserService extends
+ AbstractPerUserSystemService<AppPredictionPerUserService, AppPredictionManagerService>
+ implements RemoteAppPredictionService.RemoteAppPredictionServiceCallbacks {
+
+ private static final String TAG = AppPredictionPerUserService.class.getSimpleName();
+
+ @Nullable
+ @GuardedBy("mLock")
+ private RemoteAppPredictionService mRemoteService;
+
+ protected AppPredictionPerUserService(AppPredictionManagerService master,
+ Object lock, int userId) {
+ super(master, lock, userId);
+ }
+
+ @Override // from PerUserSystemService
+ protected ServiceInfo newServiceInfoLocked(@NonNull ComponentName serviceComponent)
+ throws NameNotFoundException {
+
+ ServiceInfo si;
+ try {
+ si = AppGlobals.getPackageManager().getServiceInfo(serviceComponent,
+ PackageManager.GET_META_DATA, mUserId);
+ } catch (RemoteException e) {
+ throw new NameNotFoundException("Could not get service for " + serviceComponent);
+ }
+ // TODO(b/111701043): must check that either the service is from a system component,
+ // or it matches a service set by shell cmd (so it can be used on CTS tests and when
+ // OEMs are implementing the real service and also verify the proper permissions
+ return si;
+ }
+
+ @GuardedBy("mLock")
+ @Override // from PerUserSystemService
+ protected boolean updateLocked(boolean disabled) {
+ final boolean enabledChanged = super.updateLocked(disabled);
+ if (enabledChanged) {
+ if (!isEnabledLocked()) {
+ // Clear the remote service for the next call
+ mRemoteService = null;
+ }
+ }
+ return enabledChanged;
+ }
+
+ /**
+ * Notifies the service of a new prediction session.
+ */
+ @GuardedBy("mLock")
+ public void onCreatePredictionSessionLocked(@NonNull AppPredictionContext context,
+ @NonNull AppPredictionSessionId sessionId) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.onCreatePredictionSession(context, sessionId);
+ }
+ }
+
+ /**
+ * Records an app target event to the service.
+ */
+ @GuardedBy("mLock")
+ public void notifyAppTargetEventLocked(@NonNull AppPredictionSessionId sessionId,
+ @NonNull AppTargetEvent event) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.notifyAppTargetEvent(sessionId, event);
+ }
+ }
+
+ /**
+ * Records when a launch location is shown.
+ */
+ @GuardedBy("mLock")
+ public void notifyLocationShownLocked(@NonNull AppPredictionSessionId sessionId,
+ @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.notifyLocationShown(sessionId, launchLocation, targetIds);
+ }
+ }
+
+ /**
+ * Requests the service to sort a list of apps or shortcuts.
+ */
+ @GuardedBy("mLock")
+ public void sortAppTargetsLocked(@NonNull AppPredictionSessionId sessionId,
+ @NonNull ParceledListSlice targets, @NonNull IPredictionCallback callback) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.sortAppTargets(sessionId, targets, callback);
+ }
+ }
+
+ /**
+ * Registers a callback for continuous updates of predicted apps or shortcuts.
+ */
+ @GuardedBy("mLock")
+ public void registerPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.registerPredictionUpdates(sessionId, callback);
+ }
+ }
+
+ /**
+ * Unregisters a callback for continuous updates of predicted apps or shortcuts.
+ */
+ @GuardedBy("mLock")
+ public void unregisterPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.unregisterPredictionUpdates(sessionId, callback);
+ }
+ }
+
+ /**
+ * Requests a new set of predicted apps or shortcuts.
+ */
+ @GuardedBy("mLock")
+ public void requestPredictionUpdateLocked(@NonNull AppPredictionSessionId sessionId) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.requestPredictionUpdate(sessionId);
+ }
+ }
+
+ /**
+ * Notifies the service of the end of an existing prediction session.
+ */
+ @GuardedBy("mLock")
+ public void onDestroyPredictionSessionLocked(@NonNull AppPredictionSessionId sessionId) {
+ final RemoteAppPredictionService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.onDestroyPredictionSession(sessionId);
+ }
+ }
+
+ @Override
+ public void onFailureOrTimeout(boolean timedOut) {
+ if (isDebug()) {
+ Slog.d(TAG, "onFailureOrTimeout(): timed out=" + timedOut);
+ }
+
+ // Do nothing, we are just proxying to the prediction service
+ }
+
+ @Override
+ public void onServiceDied(RemoteAppPredictionService service) {
+ if (isDebug()) {
+ Slog.d(TAG, "onServiceDied():");
+ }
+
+ // Do nothing, we are just proxying to the prediction service
+ }
+
+ @GuardedBy("mLock")
+ @Nullable
+ private RemoteAppPredictionService getRemoteServiceLocked() {
+ if (mRemoteService == null) {
+ final String serviceName = getComponentNameLocked();
+ if (serviceName == null) {
+ if (mMaster.verbose) {
+ Slog.v(TAG, "getRemoteServiceLocked(): not set");
+ }
+ return null;
+ }
+ ComponentName serviceComponent = ComponentName.unflattenFromString(serviceName);
+
+ mRemoteService = new RemoteAppPredictionService(getContext(),
+ AppPredictionService.SERVICE_INTERFACE, serviceComponent, mUserId, this,
+ mMaster.isBindInstantServiceAllowed(), mMaster.verbose);
+ }
+
+ return mRemoteService;
+ }
+}
diff --git a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java
new file mode 100644
index 000000000000..45ea86f9e74e
--- /dev/null
+++ b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2018 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.appprediction;
+
+import android.annotation.NonNull;
+import android.app.prediction.AppPredictionContext;
+import android.app.prediction.AppPredictionSessionId;
+import android.app.prediction.AppTargetEvent;
+import android.app.prediction.IPredictionCallback;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ParceledListSlice;
+import android.os.IBinder;
+import android.service.appprediction.IPredictionService;
+import android.text.format.DateUtils;
+
+import com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService;
+
+
+/**
+ * Proxy to the {@link android.service.appprediction.AppPredictionService} implemention in another
+ * process.
+ */
+public class RemoteAppPredictionService extends
+ AbstractMultiplePendingRequestsRemoteService<RemoteAppPredictionService,
+ IPredictionService> {
+
+ private static final String TAG = "RemoteAppPredictionService";
+
+ private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 2 * DateUtils.SECOND_IN_MILLIS;
+
+ public RemoteAppPredictionService(Context context, String serviceInterface,
+ ComponentName componentName, int userId,
+ RemoteAppPredictionServiceCallbacks callback, boolean bindInstantServiceAllowed,
+ boolean verbose) {
+ super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed,
+ verbose, /* initialCapacity= */ 1);
+ }
+
+ @Override
+ protected IPredictionService getServiceInterface(IBinder service) {
+ return IPredictionService.Stub.asInterface(service);
+ }
+
+ @Override
+ protected long getTimeoutIdleBindMillis() {
+ return PERMANENT_BOUND_TIMEOUT_MS;
+ }
+
+ @Override
+ protected long getRemoteRequestMillis() {
+ return TIMEOUT_REMOTE_REQUEST_MILLIS;
+ }
+
+ /**
+ * Notifies the service of a new prediction session.
+ */
+ public void onCreatePredictionSession(@NonNull AppPredictionContext context,
+ @NonNull AppPredictionSessionId sessionId) {
+ scheduleAsyncRequest((s) -> s.onCreatePredictionSession(context, sessionId));
+ }
+
+ /**
+ * Records an app target event to the service.
+ */
+ public void notifyAppTargetEvent(@NonNull AppPredictionSessionId sessionId,
+ @NonNull AppTargetEvent event) {
+ scheduleAsyncRequest((s) -> s.notifyAppTargetEvent(sessionId, event));
+ }
+
+ /**
+ * Records when a launch location is shown.
+ */
+ public void notifyLocationShown(@NonNull AppPredictionSessionId sessionId,
+ @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) {
+ scheduleAsyncRequest((s) -> s.notifyLocationShown(sessionId, launchLocation, targetIds));
+ }
+
+ /**
+ * Requests the service to sort a list of apps or shortcuts.
+ */
+ public void sortAppTargets(@NonNull AppPredictionSessionId sessionId,
+ @NonNull ParceledListSlice targets, @NonNull IPredictionCallback callback) {
+ scheduleAsyncRequest((s) -> s.sortAppTargets(sessionId, targets, callback));
+ }
+
+
+ /**
+ * Registers a callback for continuous updates of predicted apps or shortcuts.
+ */
+ public void registerPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ scheduleAsyncRequest((s) -> s.registerPredictionUpdates(sessionId, callback));
+ }
+
+ /**
+ * Unregisters a callback for continuous updates of predicted apps or shortcuts.
+ */
+ public void unregisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId,
+ @NonNull IPredictionCallback callback) {
+ scheduleAsyncRequest((s) -> s.unregisterPredictionUpdates(sessionId, callback));
+ }
+
+ /**
+ * Requests a new set of predicted apps or shortcuts.
+ */
+ public void requestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) {
+ scheduleAsyncRequest((s) -> s.requestPredictionUpdate(sessionId));
+ }
+
+ /**
+ * Notifies the service of the end of an existing prediction session.
+ */
+ public void onDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) {
+ scheduleAsyncRequest((s) -> s.onDestroyPredictionSession(sessionId));
+ }
+
+ /**
+ * Failure callback
+ */
+ public interface RemoteAppPredictionServiceCallbacks
+ extends VultureCallback<RemoteAppPredictionService> {
+
+ /**
+ * Notifies a the failure or timeout of a remote call.
+ */
+ void onFailureOrTimeout(boolean timedOut);
+ }
+}
diff --git a/services/art-profile b/services/art-profile
index af9d7a91ad60..7e4884b2c016 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -6970,6 +6970,7 @@ PLcom/android/server/am/ActivityManagerService$LocalService;->enforceCallerIsRec
PLcom/android/server/am/ActivityManagerService$LocalService;->getMemoryStateForProcesses()Ljava/util/List;
PLcom/android/server/am/ActivityManagerService$LocalService;->getTopVisibleActivities()Ljava/util/List;
PLcom/android/server/am/ActivityManagerService$LocalService;->getUidProcessState(I)I
+PLcom/android/server/am/ActivityManagerService$LocalService;->isAppForeground(I)Z
PLcom/android/server/am/ActivityManagerService$LocalService;->isCallerRecents(I)Z
PLcom/android/server/am/ActivityManagerService$LocalService;->isRuntimeRestarted()Z
PLcom/android/server/am/ActivityManagerService$LocalService;->isSystemReady()Z
@@ -7125,7 +7126,6 @@ PLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/l
PLcom/android/server/am/ActivityManagerService;->installEncryptionUnawareProviders(I)V
PLcom/android/server/am/ActivityManagerService;->installSystemProviders()V
PLcom/android/server/am/ActivityManagerService;->isAllowedWhileBooting(Landroid/content/pm/ApplicationInfo;)Z
-PLcom/android/server/am/ActivityManagerService;->isAppForeground(I)Z
PLcom/android/server/am/ActivityManagerService;->isAssistDataAllowedOnCurrentActivity()Z
PLcom/android/server/am/ActivityManagerService;->isGetTasksAllowed(Ljava/lang/String;II)Z
PLcom/android/server/am/ActivityManagerService;->isInLockTaskMode()Z
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 1a6bee9daaf3..c992da43fc07 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -19,6 +19,7 @@ package com.android.server.autofill;
import static android.Manifest.permission.MANAGE_AUTO_FILL;
import static android.content.Context.AUTOFILL_MANAGER_SERVICE;
import static android.util.DebugUtils.flagsToString;
+import static android.view.autofill.AutofillManager.MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sFullScreenMode;
@@ -70,6 +71,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.IResultReceiver;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.SyncResultReceiver;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.autofill.ui.AutoFillUI;
@@ -100,8 +102,6 @@ public final class AutofillManagerService
private static final Object sLock = AutofillManagerService.class;
- private static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes
-
/**
* IME supports Smart Suggestions.
*/
@@ -252,9 +252,8 @@ public final class AutofillManagerService
@Override // from AbstractMasterSystemService
protected AutofillManagerServiceImpl newServiceLocked(@UserIdInt int resolvedUserId,
boolean disabled) {
- return new AutofillManagerServiceImpl(this, mLock, mRequestsHistory,
- mUiLatencyHistory, mWtfHistory, resolvedUserId, mUi, mAutofillCompatState,
- disabled);
+ return new AutofillManagerServiceImpl(this, mLock, mUiLatencyHistory,
+ mWtfHistory, resolvedUserId, mUi, mAutofillCompatState, disabled);
}
@Override // AbstractMasterSystemService
@@ -291,6 +290,13 @@ public final class AutofillManagerService
return mSupportedSmartSuggestionModes;
}
+ /**
+ * Logs a request so it's dumped later...
+ */
+ void logRequestLocked(@NonNull String historyItem) {
+ mRequestsHistory.log(historyItem);
+ }
+
// Called by AutofillManagerServiceImpl, doesn't need to check permission
boolean isInstantServiceAllowed() {
return mAllowInstantService;
@@ -606,15 +612,15 @@ public final class AutofillManagerService
}
private void send(@NonNull IResultReceiver receiver, @Nullable String value) {
- send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ send(receiver, SyncResultReceiver.bundleFor(value));
}
private void send(@NonNull IResultReceiver receiver, @Nullable String[] value) {
- send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ send(receiver, SyncResultReceiver.bundleFor(value));
}
private void send(@NonNull IResultReceiver receiver, @Nullable Parcelable value) {
- send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ send(receiver, SyncResultReceiver.bundleFor(value));
}
private void send(@NonNull IResultReceiver receiver, boolean value) {
@@ -701,6 +707,11 @@ public final class AutofillManagerService
public void onBackKeyPressed() {
if (sDebug) Slog.d(TAG, "onBackKeyPressed()");
mUi.hideAll(null);
+ synchronized (mLock) {
+ final AutofillManagerServiceImpl service =
+ getServiceForUserLocked(UserHandle.getCallingUserId());
+ service.onBackKeyPressed();
+ }
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 4b7efe1dfa71..954b67e4e2dc 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -108,7 +108,6 @@ final class AutofillManagerServiceImpl
private static final Random sRandom = new Random();
- private final LocalLog mRequestsHistory;
private final LocalLog mUiLatencyHistory;
private final LocalLog mWtfHistory;
private final FieldClassificationStrategy mFieldClassificationStrategy;
@@ -166,12 +165,12 @@ final class AutofillManagerServiceImpl
@Nullable
private RemoteAugmentedAutofillService mRemoteAugmentedAutofillService;
- AutofillManagerServiceImpl(AutofillManagerService master, Object lock, LocalLog requestsHistory,
+ AutofillManagerServiceImpl(AutofillManagerService master, Object lock,
LocalLog uiLatencyHistory, LocalLog wtfHistory, int userId, AutoFillUI ui,
- AutofillCompatState autofillCompatState, boolean disabled) {
+ AutofillCompatState autofillCompatState,
+ boolean disabled) {
super(master, lock, userId);
- mRequestsHistory = requestsHistory;
mUiLatencyHistory = uiLatencyHistory;
mWtfHistory = wtfHistory;
mUi = ui;
@@ -187,6 +186,15 @@ final class AutofillManagerServiceImpl
}
@GuardedBy("mLock")
+ void onBackKeyPressed() {
+ final RemoteAugmentedAutofillService remoteService =
+ getRemoteAugmentedAutofillServiceLocked();
+ if (remoteService != null) {
+ remoteService.onDestroyAutofillWindowsRequest();
+ }
+ }
+
+ @GuardedBy("mLock")
@Override // from PerUserSystemService
protected boolean updateLocked(boolean disabled) {
destroySessionsLocked();
@@ -301,7 +309,7 @@ final class AutofillManagerServiceImpl
+ " s=" + mInfo.getServiceInfo().packageName
+ " u=" + mUserId + " i=" + autofillId + " b=" + virtualBounds
+ " hc=" + hasCallback + " f=" + flags;
- mRequestsHistory.log(historyItem);
+ mMaster.logRequestLocked(historyItem);
newSession.updateLocked(autofillId, virtualBounds, value, ACTION_START_SESSION, flags);
@@ -870,8 +878,11 @@ final class AutofillManagerServiceImpl
}
pw.print(prefix); pw.print("Default component: "); pw.println(getContext()
.getString(R.string.config_defaultAutofillService));
- pw.print(prefix); pw.print("mAugmentedAutofillNamer: ");
- mAugmentedAutofillResolver.dumpShort(pw); pw.println();
+
+ pw.print(prefix); pw.println("mAugmentedAutofillNamer: ");
+ pw.print(prefix2); mAugmentedAutofillResolver.dumpShort(pw); pw.println();
+ pw.print(prefix2); mAugmentedAutofillResolver.dumpShort(pw, mUserId); pw.println();
+
if (mRemoteAugmentedAutofillService != null) {
pw.print(prefix); pw.println("RemoteAugmentedAutofillService: ");
mRemoteAugmentedAutofillService.dump(prefix2, pw);
diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
index 239a386aefcc..5d8d8fa46d3f 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
@@ -109,8 +109,8 @@ final class RemoteAugmentedAutofillService
/**
* Called by {@link Session} when it's time to destroy all augmented autofill requests.
*/
- public void onDestroyAutofillWindowsRequest(int sessionId) {
- scheduleAsyncRequest((s) -> s.onDestroyFillWindowRequest(sessionId));
+ public void onDestroyAutofillWindowsRequest() {
+ scheduleAsyncRequest((s) -> s.onDestroyAllFillWindowsRequest());
}
// TODO(b/111330312): inline into PendingAutofillRequest if it doesn't have any other subclass
@@ -168,7 +168,7 @@ final class RemoteAugmentedAutofillService
}
};
- // TODO(b/111330312): set cancellation signal, timeout (from both mClient and service),
+ // TODO(b/122728762): set cancellation signal, timeout (from both mClient and service),
// cache IAugmentedAutofillManagerClient reference, etc...
try {
mClient.getAugmentedAutofillClient(receiver);
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 34fe5d916356..e8a52b4a12a9 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -139,9 +139,6 @@ final class RemoteFillService
if (mPendingRequest == pendingRequest) {
mPendingRequest = null;
}
- if (mPendingRequest == null) {
- scheduleUnbind();
- }
return true;
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 0348f2bf1c2b..7dfd8fef13c2 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -2581,7 +2581,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final RemoteAugmentedAutofillService remoteService = mService
.getRemoteAugmentedAutofillServiceLocked();
- if (remoteService == null) return null;
+ if (remoteService == null) {
+ if (sVerbose) Slog.v(TAG, "triggerAugmentedAutofillLocked(): no service for user");
+ return null;
+ }
// Define which mode will be used
final int mode;
@@ -2607,6 +2610,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
+ " when server returned null for session " + this.id);
}
+ final String historyItem =
+ "aug:id=" + id + " u=" + uid + " m=" + mode
+ + " a=" + ComponentName.flattenToShortString(mComponentName)
+ + " f=" + mCurrentViewId
+ + " s=" + remoteService.getComponentName();
+ mService.getMaster().logRequestLocked(historyItem);
+
final AutofillValue currentValue = mViewStates.get(mCurrentViewId).getCurrentValue();
// TODO(b/111330312): we might need to add a new state in the AutofillManager to optimize
@@ -2616,7 +2626,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
currentValue);
if (mAugmentedAutofillDestroyer == null) {
- mAugmentedAutofillDestroyer = () -> remoteService.onDestroyAutofillWindowsRequest(id);
+ mAugmentedAutofillDestroyer = () -> remoteService.onDestroyAutofillWindowsRequest();
}
return mAugmentedAutofillDestroyer;
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 8b07db7fc32d..ff378b373775 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -39,7 +39,6 @@ import android.os.Binder;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
import android.os.Trace;
import android.os.UserHandle;
import android.util.Slog;
@@ -127,7 +126,7 @@ public class BackupManagerService {
protected void startServiceForUser(int userId) {
UserBackupManagerService userBackupManagerService =
UserBackupManagerService.createAndInitializeService(
- userId, mContext, mTrampoline, mBackupThread, mTransportWhitelist);
+ userId, mContext, mTrampoline, mTransportWhitelist);
startServiceForUser(userId, userBackupManagerService);
}
@@ -139,20 +138,21 @@ public class BackupManagerService {
mServiceUsers.put(userId, userBackupManagerService);
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable");
- try {
- // TODO(b/121198604): Make enable file per-user and clean up indirection.
- mTrampoline.setBackupEnabledForUser(
- userId, UserBackupManagerFilePersistedSettings.readBackupEnableState(userId));
- } catch (RemoteException e) {
- // Can't happen, it's a local object.
- }
+ userBackupManagerService.initializeBackupEnableState();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
/** Stops the backup service for user {@code userId} when the user is stopped. */
@VisibleForTesting
protected void stopServiceForUser(int userId) {
- mServiceUsers.remove(userId);
+ UserBackupManagerService userBackupManagerService = mServiceUsers.removeReturnOld(userId);
+
+ if (userBackupManagerService != null) {
+ userBackupManagerService.tearDownService();
+
+ KeyValueBackupJob.cancel(userId, mContext);
+ FullBackupJob.cancel(userId, mContext);
+ }
}
SparseArray<UserBackupManagerService> getServiceUsers() {
@@ -580,9 +580,9 @@ public class BackupManagerService {
* @return Whether ongoing work will continue. The return value here will be passed along as the
* return value to the callback {@link JobService#onStartJob(JobParameters)}.
*/
- public boolean beginFullBackup(FullBackupJob scheduledJob) {
+ public boolean beginFullBackup(@UserIdInt int userId, FullBackupJob scheduledJob) {
UserBackupManagerService userBackupManagerService =
- getServiceForUserIfCallerHasPermission(UserHandle.USER_SYSTEM, "beginFullBackup()");
+ getServiceForUserIfCallerHasPermission(userId, "beginFullBackup()");
return userBackupManagerService != null
&& userBackupManagerService.beginFullBackup(scheduledJob);
@@ -592,9 +592,9 @@ public class BackupManagerService {
* Used by the {@link JobScheduler} to end the current full backup task when conditions are no
* longer met for running the full backup job.
*/
- public void endFullBackup() {
+ public void endFullBackup(@UserIdInt int userId) {
UserBackupManagerService userBackupManagerService =
- getServiceForUserIfCallerHasPermission(UserHandle.USER_SYSTEM, "endFullBackup()");
+ getServiceForUserIfCallerHasPermission(userId, "endFullBackup()");
if (userBackupManagerService != null) {
userBackupManagerService.endFullBackup();
diff --git a/services/backup/java/com/android/server/backup/FullBackupJob.java b/services/backup/java/com/android/server/backup/FullBackupJob.java
index 82638b4ecee4..33d21cb0bf91 100644
--- a/services/backup/java/com/android/server/backup/FullBackupJob.java
+++ b/services/backup/java/com/android/server/backup/FullBackupJob.java
@@ -22,21 +22,30 @@ import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
+import android.os.Bundle;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
public class FullBackupJob extends JobService {
- private static final String TAG = "FullBackupJob";
- private static final boolean DEBUG = true;
+ private static final String USER_ID_EXTRA_KEY = "userId";
+
+ @VisibleForTesting
+ static final int MIN_JOB_ID = 52418896;
+ @VisibleForTesting
+ static final int MAX_JOB_ID = 52419896;
private static ComponentName sIdleService =
new ComponentName("android", FullBackupJob.class.getName());
- private static final int JOB_ID = 0x5038;
+ @GuardedBy("mParamsForUser")
+ private final SparseArray<JobParameters> mParamsForUser = new SparseArray<>();
- JobParameters mParams;
-
- public static void schedule(Context ctx, long minDelay, BackupManagerConstants constants) {
+ public static void schedule(int userId, Context ctx, long minDelay,
+ BackupManagerConstants constants) {
JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
- JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, sIdleService);
+ JobInfo.Builder builder = new JobInfo.Builder(getJobIdForUserId(userId), sIdleService);
synchronized (constants) {
builder.setRequiresDeviceIdle(true)
.setRequiredNetworkType(constants.getFullBackupRequiredNetworkType())
@@ -45,14 +54,28 @@ public class FullBackupJob extends JobService {
if (minDelay > 0) {
builder.setMinimumLatency(minDelay);
}
+
+ Bundle extraInfo = new Bundle();
+ extraInfo.putInt(USER_ID_EXTRA_KEY, userId);
+ builder.setTransientExtras(extraInfo);
+
js.schedule(builder.build());
}
+ public static void cancel(int userId, Context ctx) {
+ JobScheduler js = (JobScheduler) ctx.getSystemService(
+ Context.JOB_SCHEDULER_SERVICE);
+ js.cancel(getJobIdForUserId(userId));
+ }
+
// callback from the Backup Manager Service: it's finished its work for this pass
- public void finishBackupPass() {
- if (mParams != null) {
- jobFinished(mParams, false);
- mParams = null;
+ public void finishBackupPass(int userId) {
+ synchronized (mParamsForUser) {
+ JobParameters jobParameters = mParamsForUser.get(userId);
+ if (jobParameters != null) {
+ jobFinished(jobParameters, false);
+ mParamsForUser.remove(userId);
+ }
}
}
@@ -60,19 +83,33 @@ public class FullBackupJob extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
- mParams = params;
+ int userId = params.getTransientExtras().getInt(USER_ID_EXTRA_KEY);
+
+ synchronized (mParamsForUser) {
+ mParamsForUser.put(userId, params);
+ }
+
Trampoline service = BackupManagerService.getInstance();
- return service.beginFullBackup(this);
+ return service.beginFullBackup(userId, this);
}
@Override
public boolean onStopJob(JobParameters params) {
- if (mParams != null) {
- mParams = null;
- Trampoline service = BackupManagerService.getInstance();
- service.endFullBackup();
+ int userId = params.getTransientExtras().getInt(USER_ID_EXTRA_KEY);
+
+ synchronized (mParamsForUser) {
+ if (mParamsForUser.removeReturnOld(userId) == null) {
+ return false;
+ }
}
+
+ Trampoline service = BackupManagerService.getInstance();
+ service.endFullBackup(userId);
+
return false;
}
+ private static int getJobIdForUserId(int userId) {
+ return JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, userId);
+ }
}
diff --git a/services/backup/java/com/android/server/backup/JobIdManager.java b/services/backup/java/com/android/server/backup/JobIdManager.java
new file mode 100644
index 000000000000..2e834dbfe245
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/JobIdManager.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 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.backup;
+
+/**
+ * Allocates job IDs for {@link FullBackupJob} and {@link KeyValueBackupJob}
+ */
+public class JobIdManager {
+ public static int getJobIdForUserId(int minJobId, int maxJobId, int userId) {
+ if (minJobId + userId > maxJobId) {
+ throw new RuntimeException("No job IDs available in the given range");
+ }
+
+ return minJobId + userId;
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
index bed520e9f068..3184bd87601a 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
@@ -13,8 +13,6 @@ import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.backup.restore.PerformAdbRestoreTask;
-
import libcore.io.IoUtils;
import java.io.File;
@@ -42,11 +40,10 @@ public class KeyValueAdbRestoreEngine implements Runnable {
private final UserBackupManagerService mBackupManagerService;
private final File mDataDir;
- FileMetadata mInfo;
- PerformAdbRestoreTask mRestoreTask;
- ParcelFileDescriptor mInFD;
- IBackupAgent mAgent;
- int mToken;
+ private final FileMetadata mInfo;
+ private final ParcelFileDescriptor mInFD;
+ private final IBackupAgent mAgent;
+ private final int mToken;
public KeyValueAdbRestoreEngine(UserBackupManagerService backupManagerService,
File dataDir, FileMetadata info, ParcelFileDescriptor inFD, IBackupAgent agent,
diff --git a/services/backup/java/com/android/server/backup/KeyValueBackupJob.java b/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
index f2e74352b004..d43859ebeeda 100644
--- a/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
+++ b/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
@@ -25,8 +25,14 @@ import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
+import android.os.Bundle;
import android.os.RemoteException;
import android.util.Slog;
+import android.util.SparseBooleanArray;
+import android.util.SparseLongArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import java.util.Random;
@@ -38,7 +44,8 @@ public class KeyValueBackupJob extends JobService {
private static final String TAG = "KeyValueBackupJob";
private static ComponentName sKeyValueJobService =
new ComponentName("android", KeyValueBackupJob.class.getName());
- private static final int JOB_ID = 0x5039;
+
+ private static final String USER_ID_EXTRA_KEY = "userId";
// Once someone asks for a backup, this is how long we hold off until we find
// an on-charging opportunity. If we hit this max latency we will run the operation
@@ -46,16 +53,22 @@ public class KeyValueBackupJob extends JobService {
// BackupManager.backupNow().
private static final long MAX_DEFERRAL = AlarmManager.INTERVAL_DAY;
- private static boolean sScheduled = false;
- private static long sNextScheduled = 0;
+ @GuardedBy("KeyValueBackupJob.class")
+ private static final SparseBooleanArray sScheduledForUserId = new SparseBooleanArray();
+ @GuardedBy("KeyValueBackupJob.class")
+ private static final SparseLongArray sNextScheduledForUserId = new SparseLongArray();
+
+ private static final int MIN_JOB_ID = 52417896;
+ private static final int MAX_JOB_ID = 52418896;
- public static void schedule(Context ctx, BackupManagerConstants constants) {
- schedule(ctx, 0, constants);
+ public static void schedule(int userId, Context ctx, BackupManagerConstants constants) {
+ schedule(userId, ctx, 0, constants);
}
- public static void schedule(Context ctx, long delay, BackupManagerConstants constants) {
+ public static void schedule(int userId, Context ctx, long delay,
+ BackupManagerConstants constants) {
synchronized (KeyValueBackupJob.class) {
- if (sScheduled) {
+ if (sScheduledForUserId.get(userId)) {
return;
}
@@ -76,51 +89,61 @@ public class KeyValueBackupJob extends JobService {
if (DEBUG_SCHEDULING) {
Slog.v(TAG, "Scheduling k/v pass in " + (delay / 1000 / 60) + " minutes");
}
- JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, sKeyValueJobService)
+
+ JobInfo.Builder builder = new JobInfo.Builder(getJobIdForUserId(userId),
+ sKeyValueJobService)
.setMinimumLatency(delay)
.setRequiredNetworkType(networkType)
.setRequiresCharging(needsCharging)
.setOverrideDeadline(MAX_DEFERRAL);
+
+ Bundle extraInfo = new Bundle();
+ extraInfo.putInt(USER_ID_EXTRA_KEY, userId);
+ builder.setTransientExtras(extraInfo);
+
JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
js.schedule(builder.build());
- sNextScheduled = System.currentTimeMillis() + delay;
- sScheduled = true;
+ sScheduledForUserId.put(userId, true);
+ sNextScheduledForUserId.put(userId, System.currentTimeMillis() + delay);
}
}
- public static void cancel(Context ctx) {
+ public static void cancel(int userId, Context ctx) {
synchronized (KeyValueBackupJob.class) {
- JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
- js.cancel(JOB_ID);
- sNextScheduled = 0;
- sScheduled = false;
+ JobScheduler js = (JobScheduler) ctx.getSystemService(
+ Context.JOB_SCHEDULER_SERVICE);
+ js.cancel(getJobIdForUserId(userId));
+
+ clearScheduledForUserId(userId);
}
}
- public static long nextScheduled() {
+ public static long nextScheduled(int userId) {
synchronized (KeyValueBackupJob.class) {
- return sNextScheduled;
+ return sNextScheduledForUserId.get(userId);
}
}
- public static boolean isScheduled() {
+ @VisibleForTesting
+ public static boolean isScheduled(int userId) {
synchronized (KeyValueBackupJob.class) {
- return sScheduled;
+ return sScheduledForUserId.get(userId);
}
}
@Override
public boolean onStartJob(JobParameters params) {
+ int userId = params.getTransientExtras().getInt(USER_ID_EXTRA_KEY);
+
synchronized (KeyValueBackupJob.class) {
- sNextScheduled = 0;
- sScheduled = false;
+ clearScheduledForUserId(userId);
}
// Time to run a key/value backup!
Trampoline service = BackupManagerService.getInstance();
try {
- service.backupNow();
+ service.backupNowForUser(userId);
} catch (RemoteException e) {}
// This was just a trigger; ongoing wakelock management is done by the
@@ -134,4 +157,13 @@ public class KeyValueBackupJob extends JobService {
return false;
}
+ @GuardedBy("KeyValueBackupJob.class")
+ private static void clearScheduledForUserId(int userId) {
+ sScheduledForUserId.delete(userId);
+ sNextScheduledForUserId.delete(userId);
+ }
+
+ private static int getJobIdForUserId(int userId) {
+ return JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, userId);
+ }
}
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index e4ce62d0a5b5..4a1e5b9910bf 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -23,9 +23,9 @@ import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
import android.os.Build;
@@ -49,9 +49,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Set;
-
import java.util.Objects;
+import java.util.Set;
/**
* We back up the signatures of each package so that during a system restore,
@@ -95,6 +94,7 @@ public class PackageManagerBackupAgent extends BackupAgent {
// is coming from pre-Android P device.
private static final int UNDEFINED_ANCESTRAL_RECORD_VERSION = -1;
+ private int mUserId;
private List<PackageInfo> mAllPackages;
private PackageManager mPackageManager;
// version & signature info of each app in a restore set
@@ -129,17 +129,18 @@ public class PackageManagerBackupAgent extends BackupAgent {
// We're constructed with the set of applications that are participating
// in backup. This set changes as apps are installed & removed.
- public PackageManagerBackupAgent(PackageManager packageMgr, List<PackageInfo> packages) {
- init(packageMgr, packages);
+ public PackageManagerBackupAgent(
+ PackageManager packageMgr, List<PackageInfo> packages, int userId) {
+ init(packageMgr, packages, userId);
}
- public PackageManagerBackupAgent(PackageManager packageMgr) {
- init(packageMgr, null);
+ public PackageManagerBackupAgent(PackageManager packageMgr, int userId) {
+ init(packageMgr, null, userId);
evaluateStorablePackages();
}
- private void init(PackageManager packageMgr, List<PackageInfo> packages) {
+ private void init(PackageManager packageMgr, List<PackageInfo> packages, int userId) {
mPackageManager = packageMgr;
mAllPackages = packages;
mRestoredSignatures = null;
@@ -147,17 +148,19 @@ public class PackageManagerBackupAgent extends BackupAgent {
mStoredSdkVersion = Build.VERSION.SDK_INT;
mStoredIncrementalVersion = Build.VERSION.INCREMENTAL;
+ mUserId = userId;
}
// We will need to refresh our understanding of what is eligible for
// backup periodically; this entry point serves that purpose.
public void evaluateStorablePackages() {
- mAllPackages = getStorableApplications(mPackageManager);
+ mAllPackages = getStorableApplications(mPackageManager, mUserId);
}
- public static List<PackageInfo> getStorableApplications(PackageManager pm) {
- List<PackageInfo> pkgs;
- pkgs = pm.getInstalledPackages(PackageManager.GET_SIGNING_CERTIFICATES);
+ /** Gets all packages installed on user {@code userId} eligible for backup. */
+ public static List<PackageInfo> getStorableApplications(PackageManager pm, int userId) {
+ List<PackageInfo> pkgs =
+ pm.getInstalledPackagesAsUser(PackageManager.GET_SIGNING_CERTIFICATES, userId);
int N = pkgs.size();
for (int a = N-1; a >= 0; a--) {
PackageInfo pkg = pkgs.get(a);
@@ -237,8 +240,8 @@ public class PackageManagerBackupAgent extends BackupAgent {
ComponentName home = getPreferredHomeComponent();
if (home != null) {
try {
- homeInfo = mPackageManager.getPackageInfo(home.getPackageName(),
- PackageManager.GET_SIGNING_CERTIFICATES);
+ homeInfo = mPackageManager.getPackageInfoAsUser(home.getPackageName(),
+ PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName());
homeVersion = homeInfo.getLongVersionCode();
SigningInfo signingInfo = homeInfo.signingInfo;
@@ -315,8 +318,8 @@ public class PackageManagerBackupAgent extends BackupAgent {
} else {
PackageInfo info = null;
try {
- info = mPackageManager.getPackageInfo(packName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ info = mPackageManager.getPackageInfoAsUser(packName,
+ PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
} catch (NameNotFoundException e) {
// Weird; we just found it, and now are told it doesn't exist.
// Treat it as having been removed from the device.
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 79d4a2cb33de..4ca2545802c7 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -698,15 +698,15 @@ public class Trampoline extends IBackupManager.Stub {
// Full backup/restore entry points - non-Binder; called directly
// by the full-backup scheduled job
- /* package */ boolean beginFullBackup(FullBackupJob scheduledJob) {
+ /* package */ boolean beginFullBackup(@UserIdInt int userId, FullBackupJob scheduledJob) {
BackupManagerService svc = mService;
- return (svc != null) ? svc.beginFullBackup(scheduledJob) : false;
+ return (svc != null) ? svc.beginFullBackup(userId, scheduledJob) : false;
}
- /* package */ void endFullBackup() {
+ /* package */ void endFullBackup(@UserIdInt int userId) {
BackupManagerService svc = mService;
if (svc != null) {
- svc.endFullBackup();
+ svc.endFullBackup(userId);
}
}
}
diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java
index ddce6bbfd47d..a7bada07ffa8 100644
--- a/services/backup/java/com/android/server/backup/TransportManager.java
+++ b/services/backup/java/com/android/server/backup/TransportManager.java
@@ -17,6 +17,7 @@
package com.android.server.backup;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.annotation.WorkerThread;
import android.app.backup.BackupManager;
import android.app.backup.BackupTransport;
@@ -29,7 +30,6 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -61,7 +61,7 @@ public class TransportManager {
public static final String SERVICE_ACTION_TRANSPORT_HOST = "android.backup.TRANSPORT_HOST";
private final Intent mTransportServiceIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST);
- private final Context mContext;
+ private final @UserIdInt int mUserId;
private final PackageManager mPackageManager;
private final Set<ComponentName> mTransportWhitelist;
private final TransportClientManager mTransportClientManager;
@@ -86,22 +86,24 @@ public class TransportManager {
@Nullable
private volatile String mCurrentTransportName;
- TransportManager(Context context, Set<ComponentName> whitelist, String selectedTransport) {
- mContext = context;
+ TransportManager(@UserIdInt int userId, Context context, Set<ComponentName> whitelist,
+ String selectedTransport) {
+ mUserId = userId;
mPackageManager = context.getPackageManager();
mTransportWhitelist = Preconditions.checkNotNull(whitelist);
mCurrentTransportName = selectedTransport;
mTransportStats = new TransportStats();
- mTransportClientManager = new TransportClientManager(context, mTransportStats);
+ mTransportClientManager = new TransportClientManager(mUserId, context, mTransportStats);
}
@VisibleForTesting
TransportManager(
+ @UserIdInt int userId,
Context context,
Set<ComponentName> whitelist,
String selectedTransport,
TransportClientManager transportClientManager) {
- mContext = context;
+ mUserId = userId;
mPackageManager = context.getPackageManager();
mTransportWhitelist = Preconditions.checkNotNull(whitelist);
mCurrentTransportName = selectedTransport;
@@ -560,7 +562,7 @@ public class TransportManager {
private void registerTransportsFromPackage(
String packageName, Predicate<ComponentName> transportComponentFilter) {
try {
- mPackageManager.getPackageInfo(packageName, 0);
+ mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId);
} catch (PackageManager.NameNotFoundException e) {
Slog.e(TAG, "Trying to register transports from package not found " + packageName);
return;
@@ -575,7 +577,7 @@ public class TransportManager {
private void registerTransportsForIntent(
Intent intent, Predicate<ComponentName> transportComponentFilter) {
List<ResolveInfo> hosts =
- mPackageManager.queryIntentServicesAsUser(intent, 0, UserHandle.USER_SYSTEM);
+ mPackageManager.queryIntentServicesAsUser(intent, 0, mUserId);
if (hosts == null) {
return;
}
@@ -597,7 +599,8 @@ public class TransportManager {
return false;
}
try {
- PackageInfo packInfo = mPackageManager.getPackageInfo(transport.getPackageName(), 0);
+ PackageInfo packInfo =
+ mPackageManager.getPackageInfoAsUser(transport.getPackageName(), 0, mUserId);
if ((packInfo.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)
== 0) {
Slog.w(TAG, "Transport package " + transport.getPackageName() + " not privileged");
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerFiles.java b/services/backup/java/com/android/server/backup/UserBackupManagerFiles.java
index a0feaf9c8d15..aabd41a611a1 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerFiles.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerFiles.java
@@ -17,29 +17,35 @@
package com.android.server.backup;
import android.os.Environment;
+import android.os.UserHandle;
import java.io.File;
/** Directories used for user specific backup/restore persistent state and book-keeping. */
-public final class UserBackupManagerFiles {
+final class UserBackupManagerFiles {
// Name of the directories the service stores bookkeeping data under.
private static final String BACKUP_PERSISTENT_DIR = "backup";
private static final String BACKUP_STAGING_DIR = "backup_stage";
+ private static File getBaseDir(int userId) {
+ return Environment.getDataSystemCeDirectory(userId);
+ }
+
static File getBaseStateDir(int userId) {
- // TODO (b/120424138) this should be per user
+ if (userId != UserHandle.USER_SYSTEM) {
+ return new File(getBaseDir(userId), BACKUP_PERSISTENT_DIR);
+ }
+ // TODO (b/120424138) remove if clause above and use same logic for system user.
+ // simultaneously, copy below dir to new system user dir
return new File(Environment.getDataDirectory(), BACKUP_PERSISTENT_DIR);
}
static File getDataDir(int userId) {
- // TODO (b/120424138) this should be per user
- // This dir on /cache is managed directly in init.rc
+ if (userId != UserHandle.USER_SYSTEM) {
+ return new File(getBaseDir(userId), BACKUP_STAGING_DIR);
+ }
+ // TODO (b/120424138) remove if clause above and use same logic for system user. Since this
+ // is a staging dir, we dont need to copy below dir to new system user dir
return new File(Environment.getDownloadCacheDirectory(), BACKUP_STAGING_DIR);
}
-
- /** Directory used by full backup engine to store state. */
- public static File getFullBackupEngineFilesDir(int userId) {
- // TODO (b/120424138) this should be per user
- return new File("/data/system");
- }
}
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 6425508829ce..79f8a7e4e9ae 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -39,6 +39,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_SCHEDULE_BACK
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.IActivityManager;
@@ -103,6 +104,7 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
+import com.android.server.LocalServices;
import com.android.server.backup.fullbackup.FullBackupEntry;
import com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
import com.android.server.backup.internal.BackupHandler;
@@ -110,9 +112,9 @@ import com.android.server.backup.internal.ClearDataObserver;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.internal.Operation;
import com.android.server.backup.internal.PerformInitializeTask;
-import com.android.server.backup.internal.ProvisionedObserver;
import com.android.server.backup.internal.RunBackupReceiver;
import com.android.server.backup.internal.RunInitializeReceiver;
+import com.android.server.backup.internal.SetupObserver;
import com.android.server.backup.keyvalue.BackupRequest;
import com.android.server.backup.params.AdbBackupParams;
import com.android.server.backup.params.AdbParams;
@@ -208,8 +210,8 @@ public class UserBackupManagerService {
public static final String RUN_BACKUP_ACTION = "android.app.backup.intent.RUN";
public static final String RUN_INITIALIZE_ACTION = "android.app.backup.intent.INIT";
- public static final String BACKUP_FINISHED_ACTION = "android.intent.action.BACKUP_FINISHED";
- public static final String BACKUP_FINISHED_PACKAGE_EXTRA = "packageName";
+ private static final String BACKUP_FINISHED_ACTION = "android.intent.action.BACKUP_FINISHED";
+ private static final String BACKUP_FINISHED_PACKAGE_EXTRA = "packageName";
// Bookkeeping of in-flight operations. The operation token is the index of the entry in the
// pending operations list.
@@ -245,26 +247,28 @@ public class UserBackupManagerService {
private final @UserIdInt int mUserId;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private final TransportManager mTransportManager;
+ private final HandlerThread mUserBackupThread;
- private Context mContext;
- private PackageManager mPackageManager;
- private IPackageManager mPackageManagerBinder;
- private IActivityManager mActivityManager;
+ private final Context mContext;
+ private final PackageManager mPackageManager;
+ private final IPackageManager mPackageManagerBinder;
+ private final IActivityManager mActivityManager;
+ private final ActivityManagerInternal mActivityManagerInternal;
private PowerManager mPowerManager;
- private AlarmManager mAlarmManager;
- private IStorageManager mStorageManager;
- private BackupManagerConstants mConstants;
- private PowerManager.WakeLock mWakelock;
- private BackupHandler mBackupHandler;
+ private final AlarmManager mAlarmManager;
+ private final IStorageManager mStorageManager;
+ private final BackupManagerConstants mConstants;
+ private final PowerManager.WakeLock mWakelock;
+ private final BackupHandler mBackupHandler;
- private IBackupManager mBackupManagerBinder;
+ private final IBackupManager mBackupManagerBinder;
private boolean mEnabled; // access to this is synchronized on 'this'
- private boolean mProvisioned;
+ private boolean mSetupComplete;
private boolean mAutoRestore;
- private PendingIntent mRunBackupIntent;
- private PendingIntent mRunInitIntent;
+ private final PendingIntent mRunBackupIntent;
+ private final PendingIntent mRunInitIntent;
private final ArraySet<String> mPendingInits = new ArraySet<>(); // transport names
@@ -272,7 +276,7 @@ public class UserBackupManagerService {
private final SparseArray<HashSet<String>> mBackupParticipants = new SparseArray<>();
// Backups that we haven't started yet. Keys are package names.
- private HashMap<String, BackupRequest> mPendingBackups = new HashMap<>();
+ private final HashMap<String, BackupRequest> mPendingBackups = new HashMap<>();
// locking around the pending-backup management
private final Object mQueueLock = new Object();
@@ -314,9 +318,6 @@ public class UserBackupManagerService {
private ActiveRestoreSession mActiveRestoreSession;
- // Watch the device provisioning operation during setup
- private ContentObserver mProvisionedObserver;
-
/**
* mCurrentOperations contains the list of currently active operations.
*
@@ -342,7 +343,7 @@ public class UserBackupManagerService {
private final SparseArray<Operation> mCurrentOperations = new SparseArray<>();
private final Object mCurrentOpLock = new Object();
private final Random mTokenGenerator = new Random();
- final AtomicInteger mNextToken = new AtomicInteger();
+ private final AtomicInteger mNextToken = new AtomicInteger();
// Where we keep our journal files and other bookkeeping.
private final File mBaseStateDir;
@@ -350,7 +351,7 @@ public class UserBackupManagerService {
private final File mJournalDir;
@Nullable
private DataChangedJournal mJournal;
- private File mFullBackupScheduleFile;
+ private final File mFullBackupScheduleFile;
// Keep a log of all the apps we've ever backed up.
private ProcessedPackagesJournal mProcessedPackagesJournal;
@@ -371,11 +372,10 @@ public class UserBackupManagerService {
@UserIdInt int userId,
Context context,
Trampoline trampoline,
- HandlerThread backupThread,
Set<ComponentName> transportWhitelist) {
String currentTransport =
- Settings.Secure.getString(
- context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT);
+ Settings.Secure.getStringForUser(
+ context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT, userId);
if (TextUtils.isEmpty(currentTransport)) {
currentTransport = null;
}
@@ -384,13 +384,26 @@ public class UserBackupManagerService {
Slog.v(TAG, "Starting with transport " + currentTransport);
}
TransportManager transportManager =
- new TransportManager(context, transportWhitelist, currentTransport);
+ new TransportManager(userId, context, transportWhitelist, currentTransport);
File baseStateDir = UserBackupManagerFiles.getBaseStateDir(userId);
File dataDir = UserBackupManagerFiles.getDataDir(userId);
+ HandlerThread userBackupThread =
+ new HandlerThread("backup-" + userId, Process.THREAD_PRIORITY_BACKGROUND);
+ userBackupThread.start();
+ if (DEBUG) {
+ Slog.d(TAG, "Started thread " + userBackupThread.getName() + " for user " + userId);
+ }
+
return createAndInitializeService(
- userId, context, trampoline, backupThread, baseStateDir, dataDir, transportManager);
+ userId,
+ context,
+ trampoline,
+ userBackupThread,
+ baseStateDir,
+ dataDir,
+ transportManager);
}
/**
@@ -399,7 +412,7 @@ public class UserBackupManagerService {
* @param userId The user which this service is for.
* @param context The system server context.
* @param trampoline A reference to the proxy to {@link BackupManagerService}.
- * @param backupThread The thread running backup/restore operations for the user.
+ * @param userBackupThread The thread running backup/restore operations for the user.
* @param baseStateDir The directory we store the user's persistent bookkeeping data.
* @param dataDir The directory we store the user's temporary staging data.
* @param transportManager The {@link TransportManager} responsible for handling the user's
@@ -410,19 +423,38 @@ public class UserBackupManagerService {
@UserIdInt int userId,
Context context,
Trampoline trampoline,
- HandlerThread backupThread,
+ HandlerThread userBackupThread,
File baseStateDir,
File dataDir,
TransportManager transportManager) {
return new UserBackupManagerService(
- userId, context, trampoline, backupThread, baseStateDir, dataDir, transportManager);
+ userId,
+ context,
+ trampoline,
+ userBackupThread,
+ baseStateDir,
+ dataDir,
+ transportManager);
+ }
+
+ /**
+ * Returns the value of {@link Settings.Secure#USER_SETUP_COMPLETE} for the specified user
+ * {@code userId} as a {@code boolean}.
+ */
+ public static boolean getSetupCompleteSettingForUser(Context context, int userId) {
+ return Settings.Secure.getIntForUser(
+ context.getContentResolver(),
+ Settings.Secure.USER_SETUP_COMPLETE,
+ 0,
+ userId)
+ != 0;
}
private UserBackupManagerService(
@UserIdInt int userId,
Context context,
Trampoline parent,
- HandlerThread backupThread,
+ HandlerThread userBackupThread,
File baseStateDir,
File dataDir,
TransportManager transportManager) {
@@ -431,6 +463,7 @@ public class UserBackupManagerService {
mPackageManager = context.getPackageManager();
mPackageManagerBinder = AppGlobals.getPackageManager();
mActivityManager = ActivityManager.getService();
+ mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
@@ -443,52 +476,78 @@ public class UserBackupManagerService {
BackupAgentTimeoutParameters(Handler.getMain(), mContext.getContentResolver());
mAgentTimeoutParameters.start();
- // spin up the backup/restore handler thread
- checkNotNull(backupThread, "backupThread cannot be null");
- mBackupHandler = new BackupHandler(this, backupThread.getLooper());
+ checkNotNull(userBackupThread, "userBackupThread cannot be null");
+ mUserBackupThread = userBackupThread;
+ mBackupHandler = new BackupHandler(this, userBackupThread.getLooper());
// Set up our bookkeeping
final ContentResolver resolver = context.getContentResolver();
- mProvisioned = Settings.Global.getInt(resolver,
- Settings.Global.DEVICE_PROVISIONED, 0) != 0;
- mAutoRestore = Settings.Secure.getInt(resolver,
- Settings.Secure.BACKUP_AUTO_RESTORE, 1) != 0;
+ mSetupComplete = getSetupCompleteSettingForUser(context, userId);
+ mAutoRestore = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.BACKUP_AUTO_RESTORE, 1, userId) != 0;
- mProvisionedObserver = new ProvisionedObserver(this, mBackupHandler);
+ ContentObserver setupObserver = new SetupObserver(this, mBackupHandler);
resolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),
- false, mProvisionedObserver);
+ Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
+ /* notifyForDescendents */ false,
+ setupObserver,
+ mUserId);
mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null");
- mBaseStateDir.mkdirs();
- if (!SELinux.restorecon(mBaseStateDir)) {
- Slog.e(TAG, "SELinux restorecon failed on " + mBaseStateDir);
+ // TODO (b/120424138): Remove once the system user is migrated to use the per-user CE
+ // directory. Per-user CE directories are managed by vold.
+ if (userId == UserHandle.USER_SYSTEM) {
+ mBaseStateDir.mkdirs();
+ if (!SELinux.restorecon(mBaseStateDir)) {
+ Slog.w(TAG, "SELinux restorecon failed on " + mBaseStateDir);
+ }
}
+ // TODO (b/120424138): The system user currently uses the cache which is managed by init.rc
+ // Initialization and restorecon is managed by vold for per-user CE directories.
mDataDir = checkNotNull(dataDir, "dataDir cannot be null");
-
mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng);
- // Alarm receivers for scheduled backups & initialization operations
- BroadcastReceiver mRunBackupReceiver = new RunBackupReceiver(this);
+ // Receivers for scheduled backups and transport initialization operations.
+ BroadcastReceiver runBackupReceiver = new RunBackupReceiver(this);
IntentFilter filter = new IntentFilter();
filter.addAction(RUN_BACKUP_ACTION);
- context.registerReceiver(mRunBackupReceiver, filter,
- android.Manifest.permission.BACKUP, null);
-
- BroadcastReceiver mRunInitReceiver = new RunInitializeReceiver(this);
+ context.registerReceiverAsUser(
+ runBackupReceiver,
+ UserHandle.of(userId),
+ filter,
+ android.Manifest.permission.BACKUP,
+ /* scheduler */ null);
+
+ BroadcastReceiver runInitReceiver = new RunInitializeReceiver(this);
filter = new IntentFilter();
filter.addAction(RUN_INITIALIZE_ACTION);
- context.registerReceiver(mRunInitReceiver, filter,
- android.Manifest.permission.BACKUP, null);
+ context.registerReceiverAsUser(
+ runInitReceiver,
+ UserHandle.of(userId),
+ filter,
+ android.Manifest.permission.BACKUP,
+ /* scheduler */ null);
Intent backupIntent = new Intent(RUN_BACKUP_ACTION);
backupIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mRunBackupIntent = PendingIntent.getBroadcast(context, 0, backupIntent, 0);
+ mRunBackupIntent =
+ PendingIntent.getBroadcastAsUser(
+ context,
+ /* requestCode */ 0,
+ backupIntent,
+ /* flags */ 0,
+ UserHandle.of(userId));
Intent initIntent = new Intent(RUN_INITIALIZE_ACTION);
initIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mRunInitIntent = PendingIntent.getBroadcast(context, 0, initIntent, 0);
+ mRunInitIntent =
+ PendingIntent.getBroadcastAsUser(
+ context,
+ /* requestCode */ 0,
+ initIntent,
+ /* flags */ 0,
+ UserHandle.of(userId));
// Set up the backup-request journaling
mJournalDir = new File(mBaseStateDir, "pending");
@@ -523,7 +582,21 @@ public class UserBackupManagerService {
mBackupHandler.postDelayed(this::parseLeftoverJournals, INITIALIZATION_DELAY_MILLIS);
// Power management
- mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*");
+ mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*-" + userId);
+ }
+
+ void initializeBackupEnableState() {
+ boolean isEnabled = UserBackupManagerFilePersistedSettings.readBackupEnableState(mUserId);
+ setBackupEnabled(isEnabled);
+ }
+
+ /** Cleans up state when the user of this service is stopped. */
+ void tearDownService() {
+ mUserBackupThread.quit();
+ }
+
+ public @UserIdInt int getUserId() {
+ return mUserId;
}
public BackupManagerConstants getConstants() {
@@ -538,51 +611,27 @@ public class UserBackupManagerService {
return mContext;
}
- public void setContext(Context context) {
- mContext = context;
- }
-
public PackageManager getPackageManager() {
return mPackageManager;
}
- public void setPackageManager(PackageManager packageManager) {
- mPackageManager = packageManager;
- }
-
public IPackageManager getPackageManagerBinder() {
return mPackageManagerBinder;
}
- public void setPackageManagerBinder(IPackageManager packageManagerBinder) {
- mPackageManagerBinder = packageManagerBinder;
- }
-
public IActivityManager getActivityManager() {
return mActivityManager;
}
- public void setActivityManager(IActivityManager activityManager) {
- mActivityManager = activityManager;
- }
-
public AlarmManager getAlarmManager() {
return mAlarmManager;
}
- public void setAlarmManager(AlarmManager alarmManager) {
- mAlarmManager = alarmManager;
- }
-
@VisibleForTesting
void setPowerManager(PowerManager powerManager) {
mPowerManager = powerManager;
}
- public void setBackupManagerBinder(IBackupManager backupManagerBinder) {
- mBackupManagerBinder = backupManagerBinder;
- }
-
public TransportManager getTransportManager() {
return mTransportManager;
}
@@ -595,12 +644,12 @@ public class UserBackupManagerService {
mEnabled = enabled;
}
- public boolean isProvisioned() {
- return mProvisioned;
+ public boolean isSetupComplete() {
+ return mSetupComplete;
}
- public void setProvisioned(boolean provisioned) {
- mProvisioned = provisioned;
+ public void setSetupComplete(boolean setupComplete) {
+ mSetupComplete = setupComplete;
}
public PowerManager.WakeLock getWakelock() {
@@ -617,35 +666,18 @@ public class UserBackupManagerService {
mWakelock.setWorkSource(workSource);
}
- public void setWakelock(PowerManager.WakeLock wakelock) {
- mWakelock = wakelock;
- }
-
public Handler getBackupHandler() {
return mBackupHandler;
}
- public void setBackupHandler(BackupHandler backupHandler) {
- mBackupHandler = backupHandler;
- }
-
public PendingIntent getRunInitIntent() {
return mRunInitIntent;
}
- public void setRunInitIntent(PendingIntent runInitIntent) {
- mRunInitIntent = runInitIntent;
- }
-
public HashMap<String, BackupRequest> getPendingBackups() {
return mPendingBackups;
}
- public void setPendingBackups(
- HashMap<String, BackupRequest> pendingBackups) {
- mPendingBackups = pendingBackups;
- }
-
public Object getQueueLock() {
return mQueueLock;
}
@@ -658,10 +690,6 @@ public class UserBackupManagerService {
mBackupRunning = backupRunning;
}
- public long getLastBackupPass() {
- return mLastBackupPass;
- }
-
public void setLastBackupPass(long lastBackupPass) {
mLastBackupPass = lastBackupPass;
}
@@ -670,10 +698,6 @@ public class UserBackupManagerService {
return mClearDataLock;
}
- public boolean isClearingData() {
- return mClearingData;
- }
-
public void setClearingData(boolean clearingData) {
mClearingData = clearingData;
}
@@ -694,11 +718,6 @@ public class UserBackupManagerService {
return mActiveRestoreSession;
}
- public void setActiveRestoreSession(
- ActiveRestoreSession activeRestoreSession) {
- mActiveRestoreSession = activeRestoreSession;
- }
-
public SparseArray<Operation> getCurrentOperations() {
return mCurrentOperations;
}
@@ -732,18 +751,10 @@ public class UserBackupManagerService {
return mRng;
}
- public Set<String> getAncestralPackages() {
- return mAncestralPackages;
- }
-
public void setAncestralPackages(Set<String> ancestralPackages) {
mAncestralPackages = ancestralPackages;
}
- public long getAncestralToken() {
- return mAncestralToken;
- }
-
public void setAncestralToken(long ancestralToken) {
mAncestralToken = ancestralToken;
}
@@ -791,7 +802,7 @@ public class UserBackupManagerService {
* non-lifecycle agent instance, so we manually set up the context topology for it.
*/
public BackupAgent makeMetadataAgent() {
- PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager);
+ PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager, mUserId);
pmAgent.attach(mContext);
pmAgent.onCreate();
return pmAgent;
@@ -802,7 +813,7 @@ public class UserBackupManagerService {
*/
public PackageManagerBackupAgent makeMetadataAgent(List<PackageInfo> packages) {
PackageManagerBackupAgent pmAgent =
- new PackageManagerBackupAgent(mPackageManager, packages);
+ new PackageManagerBackupAgent(mPackageManager, packages, mUserId);
pmAgent.attach(mContext);
pmAgent.onCreate();
return pmAgent;
@@ -844,26 +855,36 @@ public class UserBackupManagerService {
mFullBackupQueue = readFullBackupSchedule();
}
- // Register for broadcasts about package install, etc., so we can
- // update the provider list.
+ // Register for broadcasts about package changes.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
- mContext.registerReceiver(mBroadcastReceiver, filter);
+ mContext.registerReceiverAsUser(
+ mBroadcastReceiver,
+ UserHandle.of(mUserId),
+ filter,
+ /* broadcastPermission */ null,
+ /* scheduler */ null);
+
// Register for events related to sdcard installation.
IntentFilter sdFilter = new IntentFilter();
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
- mContext.registerReceiver(mBroadcastReceiver, sdFilter);
+ mContext.registerReceiverAsUser(
+ mBroadcastReceiver,
+ UserHandle.of(mUserId),
+ sdFilter,
+ /* broadcastPermission */ null,
+ /* scheduler */ null);
}
private ArrayList<FullBackupEntry> readFullBackupSchedule() {
boolean changed = false;
ArrayList<FullBackupEntry> schedule = null;
List<PackageInfo> apps =
- PackageManagerBackupAgent.getStorableApplications(mPackageManager);
+ PackageManagerBackupAgent.getStorableApplications(mPackageManager, mUserId);
if (mFullBackupScheduleFile.exists()) {
try (FileInputStream fstream = new FileInputStream(mFullBackupScheduleFile);
@@ -1121,17 +1142,23 @@ public class UserBackupManagerService {
}
}
- // ----- Track installation/removal of packages -----
+ /**
+ * A {@link BroadcastReceiver} tracking changes to packages and sd cards in order to update our
+ * internal bookkeeping.
+ */
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
- if (MORE_DEBUG) Slog.d(TAG, "Received broadcast " + intent);
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Received broadcast " + intent);
+ }
String action = intent.getAction();
boolean replacing = false;
boolean added = false;
boolean changed = false;
Bundle extras = intent.getExtras();
- String[] pkgList = null;
+ String[] packageList = null;
+
if (Intent.ACTION_PACKAGE_ADDED.equals(action)
|| Intent.ACTION_PACKAGE_REMOVED.equals(action)
|| Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
@@ -1139,69 +1166,70 @@ public class UserBackupManagerService {
if (uri == null) {
return;
}
- final String pkgName = uri.getSchemeSpecificPart();
- if (pkgName != null) {
- pkgList = new String[]{pkgName};
+
+ String packageName = uri.getSchemeSpecificPart();
+ if (packageName != null) {
+ packageList = new String[]{packageName};
}
- changed = Intent.ACTION_PACKAGE_CHANGED.equals(action);
- // At package-changed we only care about looking at new transport states
+ changed = Intent.ACTION_PACKAGE_CHANGED.equals(action);
if (changed) {
- final String[] components =
+ // Look at new transport states for package changed events.
+ String[] components =
intent.getStringArrayExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
if (MORE_DEBUG) {
- Slog.i(TAG, "Package " + pkgName + " changed; rechecking");
+ Slog.i(TAG, "Package " + packageName + " changed");
for (int i = 0; i < components.length; i++) {
Slog.i(TAG, " * " + components[i]);
}
}
mBackupHandler.post(
- () -> mTransportManager.onPackageChanged(pkgName, components));
- return; // nothing more to do in the PACKAGE_CHANGED case
+ () -> mTransportManager.onPackageChanged(packageName, components));
+ return;
}
added = Intent.ACTION_PACKAGE_ADDED.equals(action);
replacing = extras.getBoolean(Intent.EXTRA_REPLACING, false);
} else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
added = true;
- pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ packageList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
} else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
added = false;
- pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ packageList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
}
- if (pkgList == null || pkgList.length == 0) {
+ if (packageList == null || packageList.length == 0) {
return;
}
- final int uid = extras.getInt(Intent.EXTRA_UID);
+ int uid = extras.getInt(Intent.EXTRA_UID);
if (added) {
synchronized (mBackupParticipants) {
if (replacing) {
- // This is the package-replaced case; we just remove the entry
- // under the old uid and fall through to re-add. If an app
- // just added key/value backup participation, this picks it up
- // as a known participant.
- removePackageParticipantsLocked(pkgList, uid);
+ // Remove the entry under the old uid and fall through to re-add. If an app
+ // just opted into key/value backup, add it as a known participant.
+ removePackageParticipantsLocked(packageList, uid);
}
- addPackageParticipantsLocked(pkgList);
+ addPackageParticipantsLocked(packageList);
}
- // If they're full-backup candidates, add them there instead
- final long now = System.currentTimeMillis();
- for (final String packageName : pkgList) {
+
+ long now = System.currentTimeMillis();
+ for (String packageName : packageList) {
try {
- PackageInfo app = mPackageManager.getPackageInfo(packageName, 0);
+ PackageInfo app =
+ mPackageManager.getPackageInfoAsUser(
+ packageName, /* flags */ 0, mUserId);
if (AppBackupUtils.appGetsFullBackup(app)
&& AppBackupUtils.appIsEligibleForBackup(
app.applicationInfo, mPackageManager)) {
enqueueFullBackup(packageName, now);
scheduleNextFullBackupJob(0);
} else {
- // The app might have just transitioned out of full-data into
- // doing key/value backups, or might have just disabled backups
- // entirely. Make sure it is no longer in the full-data queue.
+ // The app might have just transitioned out of full-data into doing
+ // key/value backups, or might have just disabled backups entirely. Make
+ // sure it is no longer in the full-data queue.
synchronized (mQueueLock) {
dequeueFullBackupLocked(packageName);
}
@@ -1210,32 +1238,28 @@ public class UserBackupManagerService {
mBackupHandler.post(
() -> mTransportManager.onPackageAdded(packageName));
-
} catch (NameNotFoundException e) {
- // doesn't really exist; ignore it
if (DEBUG) {
Slog.w(TAG, "Can't resolve new app " + packageName);
}
}
}
- // Whenever a package is added or updated we need to update
- // the package metadata bookkeeping.
+ // Whenever a package is added or updated we need to update the package metadata
+ // bookkeeping.
dataChangedImpl(PACKAGE_MANAGER_SENTINEL);
} else {
- if (replacing) {
- // The package is being updated. We'll receive a PACKAGE_ADDED shortly.
- } else {
- // Outright removal. In the full-data case, the app will be dropped
- // from the queue when its (now obsolete) name comes up again for
- // backup.
+ if (!replacing) {
+ // Outright removal. In the full-data case, the app will be dropped from the
+ // queue when its (now obsolete) name comes up again for backup.
synchronized (mBackupParticipants) {
- removePackageParticipantsLocked(pkgList, uid);
+ removePackageParticipantsLocked(packageList, uid);
}
}
- for (final String pkgName : pkgList) {
+
+ for (String packageName : packageList) {
mBackupHandler.post(
- () -> mTransportManager.onPackageRemoved(pkgName));
+ () -> mTransportManager.onPackageRemoved(packageName));
}
}
}
@@ -1326,7 +1350,7 @@ public class UserBackupManagerService {
private List<PackageInfo> allAgentPackages() {
// !!! TODO: cache this and regenerate only when necessary
int flags = PackageManager.GET_SIGNING_CERTIFICATES;
- List<PackageInfo> packages = mPackageManager.getInstalledPackages(flags);
+ List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser(flags, mUserId);
int numPackages = packages.size();
for (int a = numPackages - 1; a >= 0; a--) {
PackageInfo pkg = packages.get(a);
@@ -1340,8 +1364,8 @@ public class UserBackupManagerService {
// we will need the shared library path, so look that up and store it here.
// This is used implicitly when we pass the PackageInfo object off to
// the Activity Manager to launch the app for backup/restore purposes.
- app = mPackageManager.getApplicationInfo(pkg.packageName,
- PackageManager.GET_SHARED_LIBRARY_FILES);
+ app = mPackageManager.getApplicationInfoAsUser(pkg.packageName,
+ PackageManager.GET_SHARED_LIBRARY_FILES, mUserId);
pkg.applicationInfo.sharedLibraryFiles = app.sharedLibraryFiles;
pkg.applicationInfo.sharedLibraryInfos = app.sharedLibraryInfos;
}
@@ -1366,7 +1390,7 @@ public class UserBackupManagerService {
notification.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES
| Intent.FLAG_RECEIVER_FOREGROUND);
notification.putExtra(BACKUP_FINISHED_PACKAGE_EXTRA, packageName);
- mContext.sendBroadcastAsUser(notification, UserHandle.OWNER);
+ mContext.sendBroadcastAsUser(notification, UserHandle.of(mUserId));
}
mProcessedPackagesJournal.addPackage(packageName);
@@ -1409,8 +1433,7 @@ public class UserBackupManagerService {
mConnecting = true;
mConnectedAgent = null;
try {
- if (mActivityManager.bindBackupAgent(app.packageName, mode,
- UserHandle.USER_OWNER)) {
+ if (mActivityManager.bindBackupAgent(app.packageName, mode, mUserId)) {
Slog.d(TAG, "awaiting agent for " + app);
// success; wait for the agent to arrive
@@ -1441,11 +1464,7 @@ public class UserBackupManagerService {
}
}
if (agent == null) {
- try {
- mActivityManager.clearPendingBackup();
- } catch (RemoteException e) {
- // can't happen - ActivityManager is local
- }
+ mActivityManagerInternal.clearPendingBackup(mUserId);
}
return agent;
}
@@ -1469,7 +1488,7 @@ public class UserBackupManagerService {
public void clearApplicationDataSynchronous(String packageName, boolean keepSystemState) {
// Don't wipe packages marked allowClearUserData=false
try {
- PackageInfo info = mPackageManager.getPackageInfo(packageName, 0);
+ PackageInfo info = mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId);
if ((info.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) {
if (MORE_DEBUG) {
Slog.i(TAG, "allowClearUserData=false so not wiping "
@@ -1488,7 +1507,7 @@ public class UserBackupManagerService {
mClearingData = true;
try {
mActivityManager.clearApplicationUserData(
- packageName, keepSystemState, observer, 0);
+ packageName, keepSystemState, observer, mUserId);
} catch (RemoteException e) {
// can't happen because the activity manager is in this process
}
@@ -1553,11 +1572,16 @@ public class UserBackupManagerService {
throw new IllegalArgumentException("No packages are provided for backup");
}
- if (!mEnabled || !mProvisioned) {
- Slog.i(TAG, "Backup requested but e=" + mEnabled + " p=" + mProvisioned);
+ if (!mEnabled || !mSetupComplete) {
+ Slog.i(
+ TAG,
+ "Backup requested but enabled="
+ + mEnabled
+ + " setupComplete="
+ + mSetupComplete);
BackupObserverUtils.sendBackupFinished(observer,
BackupManager.ERROR_BACKUP_NOT_ALLOWED);
- final int logTag = mProvisioned
+ final int logTag = mSetupComplete
? BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED
: BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
monitor = BackupManagerMonitorUtils.monitorEvent(monitor, logTag, null,
@@ -1592,8 +1616,8 @@ public class UserBackupManagerService {
continue;
}
try {
- PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName,
+ PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
if (!AppBackupUtils.appIsEligibleForBackup(packageInfo.applicationInfo,
mPackageManager)) {
BackupObserverUtils.sendBackupOnPackageResult(observer, packageName,
@@ -1650,8 +1674,8 @@ public class UserBackupManagerService {
}
// We don't want the backup jobs to kick in any time soon.
// Reschedules them to run in the distant future.
- KeyValueBackupJob.schedule(mContext, BUSY_BACKOFF_MIN_MILLIS, mConstants);
- FullBackupJob.schedule(mContext, 2 * BUSY_BACKOFF_MIN_MILLIS, mConstants);
+ KeyValueBackupJob.schedule(mUserId, mContext, BUSY_BACKOFF_MIN_MILLIS, mConstants);
+ FullBackupJob.schedule(mUserId, mContext, 2 * BUSY_BACKOFF_MIN_MILLIS, mConstants);
} finally {
Binder.restoreCallingIdentity(oldToken);
}
@@ -1886,7 +1910,7 @@ public class UserBackupManagerService {
Runnable r = new Runnable() {
@Override
public void run() {
- FullBackupJob.schedule(mContext, latency, mConstants);
+ FullBackupJob.schedule(mUserId, mContext, latency, mConstants);
}
};
mBackupHandler.postDelayed(r, 2500);
@@ -1992,13 +2016,13 @@ public class UserBackupManagerService {
FullBackupEntry entry = null;
long latency = fullBackupInterval;
- if (!mEnabled || !mProvisioned) {
+ if (!mEnabled || !mSetupComplete) {
// Backups are globally disabled, so don't proceed. We also don't reschedule
// the job driving automatic backups; that job will be scheduled again when
// the user enables backup.
if (MORE_DEBUG) {
- Slog.i(TAG, "beginFullBackup but e=" + mEnabled
- + " p=" + mProvisioned + "; ignoring");
+ Slog.i(TAG, "beginFullBackup but enabled=" + mEnabled
+ + " setupComplete=" + mSetupComplete + "; ignoring");
}
return false;
}
@@ -2009,7 +2033,7 @@ public class UserBackupManagerService {
mPowerManager.getPowerSaveState(ServiceType.FULL_BACKUP);
if (result.batterySaverEnabled) {
if (DEBUG) Slog.i(TAG, "Deferring scheduled full backups in battery saver mode");
- FullBackupJob.schedule(mContext, keyValueBackupInterval, mConstants);
+ FullBackupJob.schedule(mUserId, mContext, keyValueBackupInterval, mConstants);
return false;
}
@@ -2087,7 +2111,8 @@ public class UserBackupManagerService {
final int privFlags = appInfo.applicationInfo.privateFlags;
headBusy = (privFlags & PRIVATE_FLAG_BACKUP_IN_FOREGROUND) == 0
- && mActivityManager.isAppForeground(appInfo.applicationInfo.uid);
+ && mActivityManagerInternal.isAppForeground(
+ appInfo.applicationInfo.uid);
if (headBusy) {
final long nextEligible = System.currentTimeMillis()
@@ -2110,8 +2135,6 @@ public class UserBackupManagerService {
// queue entirely and move on, but if there's nothing else in the queue
// we should bail entirely. headBusy cannot have been set to true yet.
runBackup = (mFullBackupQueue.size() > 1);
- } catch (RemoteException e) {
- // Cannot happen; the Activity Manager is in the same process
}
}
} while (headBusy);
@@ -2124,7 +2147,7 @@ public class UserBackupManagerService {
mBackupHandler.post(new Runnable() {
@Override
public void run() {
- FullBackupJob.schedule(mContext, deferTime, mConstants);
+ FullBackupJob.schedule(mUserId, mContext, deferTime, mConstants);
}
});
return false;
@@ -2183,11 +2206,10 @@ public class UserBackupManagerService {
/** Used by both incremental and full restore to restore widget data. */
public void restoreWidgetData(String packageName, byte[] widgetData) {
// Apply the restored widget state and generate the ID update for the app
- // TODO: http://b/22388012
if (MORE_DEBUG) {
Slog.i(TAG, "Incorporating restored widget data");
}
- AppWidgetBackupBridge.restoreWidgetState(packageName, widgetData, UserHandle.USER_SYSTEM);
+ AppWidgetBackupBridge.restoreWidgetState(packageName, widgetData, mUserId);
}
// *****************************
@@ -2228,7 +2250,7 @@ public class UserBackupManagerService {
}
// ...and schedule a backup pass if necessary
- KeyValueBackupJob.schedule(mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserId, mContext, mConstants);
}
// Note: packageName is currently unused, but may be in the future
@@ -2266,20 +2288,6 @@ public class UserBackupManagerService {
/** Sent from an app's backup agent to let the service know that there's new data to backup. */
public void dataChanged(final String packageName) {
- final int callingUserHandle = UserHandle.getCallingUserId();
- if (callingUserHandle != UserHandle.USER_SYSTEM) {
- // TODO: http://b/22388012
- // App is running under a non-owner user profile. For now, we do not back
- // up data from secondary user profiles.
- // TODO: backups for all user profiles although don't add backup for profiles
- // without adding admin control in DevicePolicyManager.
- if (MORE_DEBUG) {
- Slog.v(TAG, "dataChanged(" + packageName + ") ignored because it's user "
- + callingUserHandle);
- }
- return;
- }
-
final HashSet<String> targets = dataChangedTargets(packageName);
if (targets == null) {
Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'"
@@ -2316,8 +2324,8 @@ public class UserBackupManagerService {
if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName + " on " + transportName);
PackageInfo info;
try {
- info = mPackageManager.getPackageInfo(packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ info = mPackageManager.getPackageInfoAsUser(packageName,
+ PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
} catch (NameNotFoundException e) {
Slog.d(TAG, "No such package '" + packageName + "' - not clearing backup data");
return;
@@ -2378,7 +2386,8 @@ public class UserBackupManagerService {
mPowerManager.getPowerSaveState(ServiceType.KEYVALUE_BACKUP);
if (result.batterySaverEnabled) {
if (DEBUG) Slog.v(TAG, "Not running backup while in battery save mode");
- KeyValueBackupJob.schedule(mContext, mConstants); // try again in several hours
+ // Try again in several hours.
+ KeyValueBackupJob.schedule(mUserId, mContext, mConstants);
} else {
if (DEBUG) Slog.v(TAG, "Scheduling immediate backup pass");
synchronized (mQueueLock) {
@@ -2391,7 +2400,7 @@ public class UserBackupManagerService {
}
// ...and cancel any pending scheduled job, because we've just superseded it
- KeyValueBackupJob.cancel(mContext);
+ KeyValueBackupJob.cancel(mUserId, mContext);
}
}
} finally {
@@ -2399,12 +2408,6 @@ public class UserBackupManagerService {
}
}
- /** Returns {@code true} if the system user has gone through SUW. */
- public boolean deviceIsProvisioned() {
- final ContentResolver resolver = mContext.getContentResolver();
- return (Settings.Global.getInt(resolver, Settings.Global.DEVICE_PROVISIONED, 0) != 0);
- }
-
/**
* Used by 'adb backup' to run a backup pass for packages supplied via the command line, writing
* the resulting data stream to the supplied {@code fd}. This method is synchronous and does not
@@ -2437,8 +2440,7 @@ public class UserBackupManagerService {
long oldId = Binder.clearCallingIdentity();
try {
- // Doesn't make sense to do a full backup prior to setup
- if (!deviceIsProvisioned()) {
+ if (!mSetupComplete) {
Slog.i(TAG, "Backup not supported before setup");
return;
}
@@ -2564,9 +2566,7 @@ public class UserBackupManagerService {
long oldId = Binder.clearCallingIdentity();
try {
- // Check whether the device has been provisioned -- we don't handle
- // full restores prior to completing the setup process.
- if (!deviceIsProvisioned()) {
+ if (!mSetupComplete) {
Slog.i(TAG, "Full restore not permitted before setup");
return;
}
@@ -2721,20 +2721,20 @@ public class UserBackupManagerService {
}
synchronized (mQueueLock) {
- if (enable && !wasEnabled && mProvisioned) {
+ if (enable && !wasEnabled && mSetupComplete) {
// if we've just been enabled, start scheduling backup passes
- KeyValueBackupJob.schedule(mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserId, mContext, mConstants);
scheduleNextFullBackupJob(0);
} else if (!enable) {
// No longer enabled, so stop running backups
if (MORE_DEBUG) Slog.i(TAG, "Opting out of backup");
- KeyValueBackupJob.cancel(mContext);
+ KeyValueBackupJob.cancel(mUserId, mContext);
// This also constitutes an opt-out, so we wipe any data for
// this device from the backend. We start that process with
// an alarm in order to guarantee wakelock states.
- if (wasEnabled && mProvisioned) {
+ if (wasEnabled && mSetupComplete) {
// NOTE: we currently flush every registered transport, not just
// the currently-active one.
List<String> transportNames = new ArrayList<>();
@@ -2782,8 +2782,8 @@ public class UserBackupManagerService {
final long oldId = Binder.clearCallingIdentity();
try {
synchronized (this) {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.BACKUP_AUTO_RESTORE, doAutoRestore ? 1 : 0);
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.BACKUP_AUTO_RESTORE, doAutoRestore ? 1 : 0, mUserId);
mAutoRestore = doAutoRestore;
}
} finally {
@@ -2904,7 +2904,7 @@ public class UserBackupManagerService {
try {
int transportUid =
mContext.getPackageManager()
- .getPackageUid(transportComponent.getPackageName(), 0);
+ .getPackageUidAsUser(transportComponent.getPackageName(), 0, mUserId);
if (callingUid != transportUid) {
throw new SecurityException("Only the transport can change its description");
}
@@ -2996,8 +2996,8 @@ public class UserBackupManagerService {
private void updateStateForTransport(String newTransportName) {
// Publish the name change
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.BACKUP_TRANSPORT, newTransportName);
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ Settings.Secure.BACKUP_TRANSPORT, newTransportName, mUserId);
// And update our current-dataset bookkeeping
String callerLogString = "BMS.updateStateForTransport()";
@@ -3112,8 +3112,7 @@ public class UserBackupManagerService {
synchronized (mAgentConnectLock) {
if (Binder.getCallingUid() == Process.SYSTEM_UID) {
Slog.d(TAG, "agentConnected pkg=" + packageName + " agent=" + agentBinder);
- IBackupAgent agent = IBackupAgent.Stub.asInterface(agentBinder);
- mConnectedAgent = agent;
+ mConnectedAgent = IBackupAgent.Stub.asInterface(agentBinder);
mConnecting = false;
} else {
Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
@@ -3244,7 +3243,7 @@ public class UserBackupManagerService {
if (packageName != null) {
PackageInfo app = null;
try {
- app = mPackageManager.getPackageInfo(packageName, 0);
+ app = mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId);
} catch (NameNotFoundException nnf) {
Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName);
throw new IllegalArgumentException("Package " + packageName + " not found");
@@ -3348,7 +3347,7 @@ public class UserBackupManagerService {
mTransportManager.getCurrentTransportClient(callerLogString);
boolean eligible =
AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport(
- transportClient, packageName, mPackageManager);
+ transportClient, packageName, mPackageManager, mUserId);
if (transportClient != null) {
mTransportManager.disposeOfTransportClient(transportClient, callerLogString);
}
@@ -3372,7 +3371,7 @@ public class UserBackupManagerService {
for (String packageName : packages) {
if (AppBackupUtils
.appIsRunningAndEligibleForBackupWithTransport(
- transportClient, packageName, mPackageManager)) {
+ transportClient, packageName, mPackageManager, mUserId)) {
eligibleApps.add(packageName);
}
}
@@ -3431,14 +3430,14 @@ public class UserBackupManagerService {
private void dumpInternal(PrintWriter pw) {
synchronized (mQueueLock) {
pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled")
- + " / " + (!mProvisioned ? "not " : "") + "provisioned / "
+ + " / " + (!mSetupComplete ? "not " : "") + "setup complete / "
+ (this.mPendingInits.size() == 0 ? "not " : "") + "pending init");
pw.println("Auto-restore is " + (mAutoRestore ? "enabled" : "disabled"));
if (mBackupRunning) pw.println("Backup currently running");
pw.println(isBackupOperationInProgress() ? "Backup in progress" : "No backups running");
pw.println("Last backup pass started: " + mLastBackupPass
+ " (now = " + System.currentTimeMillis() + ')');
- pw.println(" next scheduled: " + KeyValueBackupJob.nextScheduled());
+ pw.println(" next scheduled: " + KeyValueBackupJob.nextScheduled(mUserId));
pw.println("Transport whitelist:");
for (ComponentName transport : mTransportManager.getTransportWhitelist()) {
diff --git a/services/backup/java/com/android/server/backup/fullbackup/AppMetadataBackupWriter.java b/services/backup/java/com/android/server/backup/fullbackup/AppMetadataBackupWriter.java
index bace1aa638ec..d13f71116c81 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/AppMetadataBackupWriter.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/AppMetadataBackupWriter.java
@@ -7,6 +7,7 @@ import static com.android.server.backup.UserBackupManagerService.BACKUP_METADATA
import static com.android.server.backup.UserBackupManagerService.BACKUP_WIDGET_METADATA_TOKEN;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.backup.FullBackup;
import android.app.backup.FullBackupDataOutput;
import android.content.pm.PackageInfo;
@@ -15,7 +16,6 @@ import android.content.pm.Signature;
import android.content.pm.SigningInfo;
import android.os.Build;
import android.os.Environment;
-import android.os.UserHandle;
import android.util.Log;
import android.util.StringBuilderPrinter;
@@ -254,12 +254,11 @@ public class AppMetadataBackupWriter {
* for 'adb backup'.
*/
// TODO(b/113807190): Investigate and potentially remove.
- public void backupObb(PackageInfo packageInfo) {
+ public void backupObb(@UserIdInt int userId, PackageInfo packageInfo) {
// TODO: migrate this to SharedStorageBackup, since AID_SYSTEM doesn't have access to
// external storage.
- // TODO: http://b/22388012
Environment.UserEnvironment userEnv =
- new Environment.UserEnvironment(UserHandle.USER_SYSTEM);
+ new Environment.UserEnvironment(userId);
File obbDir = userEnv.buildExternalStorageAppObbDirs(packageInfo.packageName)[0];
if (obbDir != null) {
if (MORE_DEBUG) {
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
index 45ca2af54b52..7ea1892727e3 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
@@ -34,14 +34,12 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.Slog;
import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
-import com.android.server.backup.UserBackupManagerFiles;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.remote.RemoteCall;
import com.android.server.backup.utils.FullBackupUtils;
@@ -56,12 +54,12 @@ import java.io.OutputStream;
*/
public class FullBackupEngine {
private UserBackupManagerService backupManagerService;
- OutputStream mOutput;
- FullBackupPreflight mPreflightHook;
- BackupRestoreTask mTimeoutMonitor;
- IBackupAgent mAgent;
- boolean mIncludeApks;
- PackageInfo mPkg;
+ private OutputStream mOutput;
+ private FullBackupPreflight mPreflightHook;
+ private BackupRestoreTask mTimeoutMonitor;
+ private IBackupAgent mAgent;
+ private boolean mIncludeApks;
+ private PackageInfo mPkg;
private final long mQuota;
private final int mOpToken;
private final int mTransportFlags;
@@ -78,21 +76,21 @@ public class FullBackupEngine {
private final File mFilesDir;
FullBackupRunner(
+ UserBackupManagerService userBackupManagerService,
PackageInfo packageInfo,
IBackupAgent agent,
ParcelFileDescriptor pipe,
int token,
boolean includeApks)
throws IOException {
- // TODO: http://b/22388012
- mUserId = UserHandle.USER_SYSTEM;
+ mUserId = userBackupManagerService.getUserId();
mPackageManager = backupManagerService.getPackageManager();
mPackage = packageInfo;
mAgent = agent;
mPipe = ParcelFileDescriptor.dup(pipe.getFileDescriptor());
mToken = token;
mIncludeApks = includeApks;
- mFilesDir = UserBackupManagerFiles.getFullBackupEngineFilesDir(mUserId);
+ mFilesDir = userBackupManagerService.getDataDir();
}
@Override
@@ -132,7 +130,7 @@ public class FullBackupEngine {
// TODO(b/113807190): Look into removing, only used for 'adb backup'.
if (writeApk) {
appMetadataBackupWriter.backupApk(mPackage);
- appMetadataBackupWriter.backupObb(mPackage);
+ appMetadataBackupWriter.backupObb(mUserId, mPackage);
}
if (DEBUG) {
@@ -155,9 +153,12 @@ public class FullBackupEngine {
backupManagerService.getBackupManagerBinder(),
mTransportFlags);
} catch (IOException e) {
- Slog.e(TAG, "Error running full backup for " + mPackage.packageName);
+ Slog.e(TAG, "Error running full backup for " + mPackage.packageName, e);
} catch (RemoteException e) {
- Slog.e(TAG, "Remote agent vanished during full backup of " + mPackage.packageName);
+ Slog.e(
+ TAG,
+ "Remote agent vanished during full backup of " + mPackage.packageName,
+ e);
} finally {
try {
mPipe.close();
@@ -233,7 +234,13 @@ public class FullBackupEngine {
pipes = ParcelFileDescriptor.createPipe();
FullBackupRunner runner =
- new FullBackupRunner(mPkg, mAgent, pipes[1], mOpToken, mIncludeApks);
+ new FullBackupRunner(
+ backupManagerService,
+ mPkg,
+ mAgent,
+ pipes[1],
+ mOpToken,
+ mIncludeApks);
pipes[1].close(); // the runner has dup'd it
pipes[1] = null;
Thread t = new Thread(runner, "app-data-runner");
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
index 43a80c45d6f7..31786d749f0a 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
@@ -66,24 +66,22 @@ import javax.crypto.spec.SecretKeySpec;
*/
public class PerformAdbBackupTask extends FullBackupTask implements BackupRestoreTask {
- private UserBackupManagerService backupManagerService;
- FullBackupEngine mBackupEngine;
- final AtomicBoolean mLatch;
-
- ParcelFileDescriptor mOutputFile;
- DeflaterOutputStream mDeflater;
- boolean mIncludeApks;
- boolean mIncludeObbs;
- boolean mIncludeShared;
- boolean mDoWidgets;
- boolean mAllApps;
- boolean mIncludeSystem;
- boolean mCompress;
- boolean mKeyValue;
- ArrayList<String> mPackages;
- PackageInfo mCurrentTarget;
- String mCurrentPassword;
- String mEncryptPassword;
+ private final UserBackupManagerService mUserBackupManagerService;
+ private final AtomicBoolean mLatch;
+
+ private final ParcelFileDescriptor mOutputFile;
+ private final boolean mIncludeApks;
+ private final boolean mIncludeObbs;
+ private final boolean mIncludeShared;
+ private final boolean mDoWidgets;
+ private final boolean mAllApps;
+ private final boolean mIncludeSystem;
+ private final boolean mCompress;
+ private final boolean mKeyValue;
+ private final ArrayList<String> mPackages;
+ private PackageInfo mCurrentTarget;
+ private final String mCurrentPassword;
+ private final String mEncryptPassword;
private final int mCurrentOpToken;
public PerformAdbBackupTask(UserBackupManagerService backupManagerService,
@@ -92,7 +90,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
String curPassword, String encryptPassword, boolean doAllApps, boolean doSystem,
boolean doCompress, boolean doKeyValue, String[] packages, AtomicBoolean latch) {
super(observer);
- this.backupManagerService = backupManagerService;
+ mUserBackupManagerService = backupManagerService;
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
mLatch = latch;
@@ -104,7 +102,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
mAllApps = doAllApps;
mIncludeSystem = doSystem;
mPackages = (packages == null)
- ? new ArrayList<String>()
+ ? new ArrayList<>()
: new ArrayList<>(Arrays.asList(packages));
mCurrentPassword = curPassword;
// when backing up, if there is a current backup password, we require that
@@ -123,11 +121,11 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
mKeyValue = doKeyValue;
}
- void addPackagesToSet(TreeMap<String, PackageInfo> set, List<String> pkgNames) {
+ private void addPackagesToSet(TreeMap<String, PackageInfo> set, List<String> pkgNames) {
for (String pkgName : pkgNames) {
if (!set.containsKey(pkgName)) {
try {
- PackageInfo info = backupManagerService.getPackageManager().getPackageInfo(
+ PackageInfo info = mUserBackupManagerService.getPackageManager().getPackageInfo(
pkgName,
PackageManager.GET_SIGNING_CERTIFICATES);
set.put(pkgName, info);
@@ -141,7 +139,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
private OutputStream emitAesBackupHeader(StringBuilder headerbuf,
OutputStream ofstream) throws Exception {
// User key will be used to encrypt the master key.
- byte[] newUserSalt = backupManagerService
+ byte[] newUserSalt = mUserBackupManagerService
.randomBytes(PasswordUtils.PBKDF2_SALT_SIZE);
SecretKey userKey = PasswordUtils
.buildPasswordKey(PBKDF_CURRENT, mEncryptPassword,
@@ -150,8 +148,8 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
// the master key is random for each backup
byte[] masterPw = new byte[256 / 8];
- backupManagerService.getRng().nextBytes(masterPw);
- byte[] checksumSalt = backupManagerService
+ mUserBackupManagerService.getRng().nextBytes(masterPw);
+ byte[] checksumSalt = mUserBackupManagerService
.randomBytes(PasswordUtils.PBKDF2_SALT_SIZE);
// primary encryption of the datastream with the random key
@@ -232,11 +230,11 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
TreeMap<String, PackageInfo> packagesToBackup = new TreeMap<>();
FullBackupObbConnection obbConnection = new FullBackupObbConnection(
- backupManagerService);
+ mUserBackupManagerService);
obbConnection.establish(); // we'll want this later
sendStartBackup();
- PackageManager pm = backupManagerService.getPackageManager();
+ PackageManager pm = mUserBackupManagerService.getPackageManager();
// doAllApps supersedes the package set if any
if (mAllApps) {
@@ -245,7 +243,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
for (int i = 0; i < allPackages.size(); i++) {
PackageInfo pkg = allPackages.get(i);
// Exclude system apps if we've been asked to do so
- if (mIncludeSystem == true
+ if (mIncludeSystem
|| ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)) {
packagesToBackup.put(pkg.packageName, pkg);
}
@@ -316,7 +314,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
boolean encrypting = (mEncryptPassword != null && mEncryptPassword.length() > 0);
// Only allow encrypted backups of encrypted devices
- if (backupManagerService.deviceIsEncrypted() && !encrypting) {
+ if (mUserBackupManagerService.deviceIsEncrypted() && !encrypting) {
Slog.e(TAG, "Unencrypted backup of encrypted device; aborting");
return;
}
@@ -325,7 +323,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
// Verify that the given password matches the currently-active
// backup password, if any
- if (!backupManagerService.backupPasswordMatches(mCurrentPassword)) {
+ if (!mUserBackupManagerService.backupPasswordMatches(mCurrentPassword)) {
if (DEBUG) {
Slog.w(TAG, "Backup password mismatch; aborting");
}
@@ -390,7 +388,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
// Shared storage if requested
if (mIncludeShared) {
try {
- pkg = backupManagerService.getPackageManager().getPackageInfo(
+ pkg = mUserBackupManagerService.getPackageManager().getPackageInfo(
SHARED_BACKUP_AGENT_PACKAGE, 0);
backupQueue.add(pkg);
} catch (NameNotFoundException e) {
@@ -410,9 +408,17 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
pkg.packageName.equals(
SHARED_BACKUP_AGENT_PACKAGE);
- mBackupEngine = new FullBackupEngine(backupManagerService, out,
- null, pkg, mIncludeApks, this, Long.MAX_VALUE,
- mCurrentOpToken, /*transportFlags=*/ 0);
+ FullBackupEngine mBackupEngine =
+ new FullBackupEngine(
+ mUserBackupManagerService,
+ out,
+ null,
+ pkg,
+ mIncludeApks,
+ this,
+ Long.MAX_VALUE,
+ mCurrentOpToken,
+ /*transportFlags=*/ 0);
sendOnBackupPackage(isSharedStorage ? "Shared storage" : pkg.packageName);
// Don't need to check preflight result as there is no preflight hook.
@@ -437,10 +443,10 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
}
KeyValueAdbBackupEngine kvBackupEngine =
new KeyValueAdbBackupEngine(out, keyValuePackage,
- backupManagerService,
- backupManagerService.getPackageManager(),
- backupManagerService.getBaseStateDir(),
- backupManagerService.getDataDir());
+ mUserBackupManagerService,
+ mUserBackupManagerService.getPackageManager(),
+ mUserBackupManagerService.getBaseStateDir(),
+ mUserBackupManagerService.getDataDir());
sendOnBackupPackage(keyValuePackage.packageName);
kvBackupEngine.backupOnePackage();
}
@@ -471,7 +477,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
if (DEBUG) {
Slog.d(TAG, "Full backup pass complete.");
}
- backupManagerService.getWakelock().release();
+ mUserBackupManagerService.getWakelock().release();
}
}
@@ -493,8 +499,8 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
Slog.w(TAG, "adb backup cancel of " + target);
}
if (target != null) {
- backupManagerService.tearDownAgentAndKill(mCurrentTarget.applicationInfo);
+ mUserBackupManagerService.tearDownAgentAndKill(mCurrentTarget.applicationInfo);
}
- backupManagerService.removeOperation(mCurrentOpToken);
+ mUserBackupManagerService.removeOperation(mCurrentOpToken);
}
}
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 5b449c5b400e..0fb4f93e542b 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -317,16 +317,16 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
int backupRunStatus = BackupManager.SUCCESS;
try {
- if (!backupManagerService.isEnabled() || !backupManagerService.isProvisioned()) {
+ if (!backupManagerService.isEnabled() || !backupManagerService.isSetupComplete()) {
// Backups are globally disabled, so don't proceed.
if (DEBUG) {
Slog.i(TAG, "full backup requested but enabled=" + backupManagerService
.isEnabled()
- + " provisioned=" + backupManagerService.isProvisioned()
+ + " setupComplete=" + backupManagerService.isSetupComplete()
+ "; ignoring");
}
int monitoringEvent;
- if (backupManagerService.isProvisioned()) {
+ if (backupManagerService.isSetupComplete()) {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED;
} else {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
@@ -633,7 +633,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
unregisterTask();
if (mJob != null) {
- mJob.finishBackupPass();
+ mJob.finishBackupPass(backupManagerService.getUserId());
}
synchronized (backupManagerService.getQueueLock()) {
diff --git a/services/backup/java/com/android/server/backup/internal/ProvisionedObserver.java b/services/backup/java/com/android/server/backup/internal/ProvisionedObserver.java
deleted file mode 100644
index 7e2ac796d343..000000000000
--- a/services/backup/java/com/android/server/backup/internal/ProvisionedObserver.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2017 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.backup.internal;
-
-import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
-import static com.android.server.backup.BackupManagerService.TAG;
-
-import android.database.ContentObserver;
-import android.os.Handler;
-import android.util.Slog;
-
-import com.android.server.backup.KeyValueBackupJob;
-import com.android.server.backup.UserBackupManagerService;
-
-public class ProvisionedObserver extends ContentObserver {
-
- private UserBackupManagerService backupManagerService;
-
- public ProvisionedObserver(
- UserBackupManagerService backupManagerService, Handler handler) {
- super(handler);
- this.backupManagerService = backupManagerService;
- }
-
- public void onChange(boolean selfChange) {
- final boolean wasProvisioned = backupManagerService.isProvisioned();
- final boolean isProvisioned = backupManagerService.deviceIsProvisioned();
- // latch: never unprovision
- backupManagerService.setProvisioned(wasProvisioned || isProvisioned);
- if (MORE_DEBUG) {
- Slog.d(TAG, "Provisioning change: was=" + wasProvisioned
- + " is=" + isProvisioned + " now=" + backupManagerService.isProvisioned());
- }
-
- synchronized (backupManagerService.getQueueLock()) {
- if (backupManagerService.isProvisioned() && !wasProvisioned
- && backupManagerService.isEnabled()) {
- // we're now good to go, so start the backup alarms
- if (MORE_DEBUG) {
- Slog.d(TAG, "Now provisioned, so starting backups");
- }
- KeyValueBackupJob.schedule(backupManagerService.getContext(),
- backupManagerService.getConstants());
- backupManagerService.scheduleNextFullBackupJob(0);
- }
- }
- }
-}
diff --git a/services/backup/java/com/android/server/backup/internal/RunBackupReceiver.java b/services/backup/java/com/android/server/backup/internal/RunBackupReceiver.java
index 2a5d913226b9..d37b106c2b26 100644
--- a/services/backup/java/com/android/server/backup/internal/RunBackupReceiver.java
+++ b/services/backup/java/com/android/server/backup/internal/RunBackupReceiver.java
@@ -26,61 +26,84 @@ import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.os.Handler;
import android.os.Message;
import android.util.Slog;
import com.android.server.backup.UserBackupManagerService;
+/**
+ * A {@link BroadcastReceiver} for the action {@link UserBackupManagerService#RUN_BACKUP_ACTION}
+ * that runs an immediate backup operation if eligible.
+ */
public class RunBackupReceiver extends BroadcastReceiver {
+ private final UserBackupManagerService mUserBackupManagerService;
- private UserBackupManagerService backupManagerService;
-
- public RunBackupReceiver(UserBackupManagerService backupManagerService) {
- this.backupManagerService = backupManagerService;
+ public RunBackupReceiver(UserBackupManagerService userBackupManagerService) {
+ mUserBackupManagerService = userBackupManagerService;
}
+ /**
+ * Run a backup pass if we're eligible. We're eligible if the following conditions are met:
+ *
+ * <ul>
+ * <li>No transports are pending initialization (otherwise we kick off an initialization
+ * operation instead).
+ * <li>Backup is enabled for the user.
+ * <li>The user has completed setup.
+ * <li>No backup operation is currently running for the user.
+ * </ul>
+ */
public void onReceive(Context context, Intent intent) {
- if (RUN_BACKUP_ACTION.equals(intent.getAction())) {
- synchronized (backupManagerService.getQueueLock()) {
- if (backupManagerService.getPendingInits().size() > 0) {
- // If there are pending init operations, we process those
- // and then settle into the usual periodic backup schedule.
- if (MORE_DEBUG) {
- Slog.v(TAG, "Init pending at scheduled backup");
- }
- try {
- backupManagerService.getAlarmManager().cancel(
- backupManagerService.getRunInitIntent());
- backupManagerService.getRunInitIntent().send();
- } catch (PendingIntent.CanceledException ce) {
- Slog.e(TAG, "Run init intent cancelled");
- // can't really do more than bail here
- }
- } else {
- // Don't run backups now if we're disabled or not yet
- // fully set up.
- if (backupManagerService.isEnabled() && backupManagerService.isProvisioned()) {
- if (!backupManagerService.isBackupRunning()) {
- if (DEBUG) {
- Slog.v(TAG, "Running a backup pass");
- }
+ if (!RUN_BACKUP_ACTION.equals(intent.getAction())) {
+ return;
+ }
+
+ synchronized (mUserBackupManagerService.getQueueLock()) {
+ if (mUserBackupManagerService.getPendingInits().size() > 0) {
+ // If there are pending init operations, we process those and then settle into the
+ // usual periodic backup schedule.
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "Init pending at scheduled backup");
+ }
+ try {
+ PendingIntent runInitIntent = mUserBackupManagerService.getRunInitIntent();
+ mUserBackupManagerService.getAlarmManager().cancel(runInitIntent);
+ runInitIntent.send();
+ } catch (PendingIntent.CanceledException ce) {
+ Slog.w(TAG, "Run init intent cancelled");
+ }
+ } else {
+ // Don't run backups if we're disabled or not yet set up.
+ if (!mUserBackupManagerService.isEnabled()
+ || !mUserBackupManagerService.isSetupComplete()) {
+ Slog.w(
+ TAG,
+ "Backup pass but enabled="
+ + mUserBackupManagerService.isEnabled()
+ + " setupComplete="
+ + mUserBackupManagerService.isSetupComplete());
+ return;
+ }
- // Acquire the wakelock and pass it to the backup thread. it will
- // be released once backup concludes.
- backupManagerService.setBackupRunning(true);
- backupManagerService.getWakelock().acquire();
+ // Don't run backups if one is already running.
+ if (mUserBackupManagerService.isBackupRunning()) {
+ Slog.i(TAG, "Backup time but one already running");
+ return;
+ }
- Message msg = backupManagerService.getBackupHandler().obtainMessage(
- MSG_RUN_BACKUP);
- backupManagerService.getBackupHandler().sendMessage(msg);
- } else {
- Slog.i(TAG, "Backup time but one already running");
- }
- } else {
- Slog.w(TAG, "Backup pass but e=" + backupManagerService.isEnabled() + " p="
- + backupManagerService.isProvisioned());
- }
+ if (DEBUG) {
+ Slog.v(TAG, "Running a backup pass");
}
+
+ // Acquire the wakelock and pass it to the backup thread. It will be released once
+ // backup concludes.
+ mUserBackupManagerService.setBackupRunning(true);
+ mUserBackupManagerService.getWakelock().acquire();
+
+ Handler backupHandler = mUserBackupManagerService.getBackupHandler();
+ Message message = backupHandler.obtainMessage(MSG_RUN_BACKUP);
+ backupHandler.sendMessage(message);
}
}
}
diff --git a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
index 38870cba4812..97711e3c27ed 100644
--- a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
+++ b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
@@ -24,41 +24,50 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
-import android.util.ArraySet;
import android.util.Slog;
import com.android.server.backup.UserBackupManagerService;
+import java.util.Set;
+
+/**
+ * A {@link BroadcastReceiver} for the action {@link UserBackupManagerService#RUN_INITIALIZE_ACTION}
+ * that runs an initialization operation on all pending transports.
+ */
public class RunInitializeReceiver extends BroadcastReceiver {
- private final UserBackupManagerService mBackupManagerService;
+ private final UserBackupManagerService mUserBackupManagerService;
- public RunInitializeReceiver(UserBackupManagerService backupManagerService) {
- mBackupManagerService = backupManagerService;
+ public RunInitializeReceiver(UserBackupManagerService userBackupManagerService) {
+ mUserBackupManagerService = userBackupManagerService;
}
public void onReceive(Context context, Intent intent) {
- if (RUN_INITIALIZE_ACTION.equals(intent.getAction())) {
- synchronized (mBackupManagerService.getQueueLock()) {
- final ArraySet<String> pendingInits = mBackupManagerService.getPendingInits();
- if (DEBUG) {
- Slog.v(TAG, "Running a device init; " + pendingInits.size() + " pending");
- }
+ if (!RUN_INITIALIZE_ACTION.equals(intent.getAction())) {
+ return;
+ }
+
+ synchronized (mUserBackupManagerService.getQueueLock()) {
+ Set<String> pendingInits = mUserBackupManagerService.getPendingInits();
+ if (DEBUG) {
+ Slog.v(TAG, "Running a device init; " + pendingInits.size() + " pending");
+ }
- if (pendingInits.size() > 0) {
- final String[] transports =
- pendingInits.toArray(new String[pendingInits.size()]);
+ if (pendingInits.size() > 0) {
+ String[] transports = pendingInits.toArray(new String[pendingInits.size()]);
- mBackupManagerService.clearPendingInits();
+ mUserBackupManagerService.clearPendingInits();
- PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock();
- wakelock.acquire();
- OnTaskFinishedListener listener = caller -> wakelock.release();
+ PowerManager.WakeLock wakelock = mUserBackupManagerService.getWakelock();
+ wakelock.acquire();
+ OnTaskFinishedListener listener = caller -> wakelock.release();
- Runnable task =
- new PerformInitializeTask(
- mBackupManagerService, transports, null, listener);
- mBackupManagerService.getBackupHandler().post(task);
- }
+ Runnable task =
+ new PerformInitializeTask(
+ mUserBackupManagerService,
+ transports,
+ /* observer */ null,
+ listener);
+ mUserBackupManagerService.getBackupHandler().post(task);
}
}
}
diff --git a/services/backup/java/com/android/server/backup/internal/SetupObserver.java b/services/backup/java/com/android/server/backup/internal/SetupObserver.java
new file mode 100644
index 000000000000..c5e912e6d18b
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/internal/SetupObserver.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 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.backup.internal;
+
+import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
+import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.UserBackupManagerService.getSetupCompleteSettingForUser;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.server.backup.KeyValueBackupJob;
+import com.android.server.backup.UserBackupManagerService;
+
+/**
+ * A {@link ContentObserver} for changes to the setting {@link Settings.Secure#USER_SETUP_COMPLETE}
+ * for a particular user.
+ */
+public class SetupObserver extends ContentObserver {
+ private final UserBackupManagerService mUserBackupManagerService;
+ private final Context mContext;
+ private final int mUserId;
+
+ public SetupObserver(UserBackupManagerService userBackupManagerService, Handler handler) {
+ super(handler);
+ mUserBackupManagerService = userBackupManagerService;
+ mContext = userBackupManagerService.getContext();
+ mUserId = userBackupManagerService.getUserId();
+ }
+
+ /**
+ * Callback that executes when the setting {@link Settings.Secure#USER_SETUP_COMPLETE} changes
+ * for the user {@link #mUserId}. If the user is newly setup and backup is enabled, then we
+ * schedule a key value and full backup job for the user. If the user was previously setup and
+ * now the setting has changed to {@code false}, we don't reset the state as having gone through
+ * setup is a non-reversible action.
+ */
+ public void onChange(boolean selfChange) {
+ boolean previousSetupComplete = mUserBackupManagerService.isSetupComplete();
+ boolean newSetupComplete = getSetupCompleteSettingForUser(mContext, mUserId);
+
+ boolean resolvedSetupComplete = previousSetupComplete || newSetupComplete;
+ mUserBackupManagerService.setSetupComplete(resolvedSetupComplete);
+ if (MORE_DEBUG) {
+ Slog.d(
+ TAG,
+ "Setup complete change: was="
+ + previousSetupComplete
+ + " new="
+ + newSetupComplete
+ + " resolved="
+ + resolvedSetupComplete);
+ }
+
+ synchronized (mUserBackupManagerService.getQueueLock()) {
+ // Start backup if the user is newly setup and backup is enabled.
+ if (resolvedSetupComplete
+ && !previousSetupComplete
+ && mUserBackupManagerService.isEnabled()) {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Setup complete so starting backups");
+ }
+ KeyValueBackupJob.schedule(mUserBackupManagerService.getUserId(), mContext,
+ mUserBackupManagerService.getConstants());
+ mUserBackupManagerService.scheduleNextFullBackupJob(0);
+ }
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
index f39d795735f3..cfc129e11c6e 100644
--- a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
+++ b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
@@ -241,6 +241,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private final boolean mUserInitiated;
private final boolean mNonIncremental;
private final int mCurrentOpToken;
+ private final int mUserId;
private final File mStateDirectory;
private final File mDataDirectory;
private final File mBlankStateFile;
@@ -320,6 +321,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
mQueueLock = mBackupManagerService.getQueueLock();
mBlankStateFile = new File(mStateDirectory, BLANK_STATE_FILE_NAME);
+ mUserId = backupManagerService.getUserId();
}
private void registerTask() {
@@ -480,8 +482,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
final PackageInfo packageInfo;
try {
packageInfo =
- mPackageManager.getPackageInfo(
- packageName, PackageManager.GET_SIGNING_CERTIFICATES);
+ mPackageManager.getPackageInfoAsUser(
+ packageName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
} catch (PackageManager.NameNotFoundException e) {
mReporter.onAgentUnknown(packageName);
throw AgentException.permanent(e);
@@ -685,8 +687,12 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
ParcelFileDescriptor.open(
mNewStateFile, MODE_READ_WRITE | MODE_CREATE | MODE_TRUNCATE);
- if (!SELinux.restorecon(mBackupDataFile)) {
- mReporter.onRestoreconFailed(mBackupDataFile);
+ // TODO (b/120424138): Remove once the system user is migrated to use the per-user CE
+ // directory. Per-user CE directories are managed by vold.
+ if (mUserId == UserHandle.USER_SYSTEM) {
+ if (!SELinux.restorecon(mBackupDataFile)) {
+ mReporter.onRestoreconFailed(mBackupDataFile);
+ }
}
IBackupTransport transport = mTransportClient.connectOrThrow("KVBT.extractAgentData()");
@@ -770,8 +776,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private void writeWidgetPayloadIfAppropriate(FileDescriptor fd, String pkgName)
throws IOException {
- // TODO: http://b/22388012
- byte[] widgetState = AppWidgetBackupBridge.getWidgetState(pkgName, UserHandle.USER_SYSTEM);
+ byte[] widgetState = AppWidgetBackupBridge.getWidgetState(pkgName, mUserId);
File widgetFile = new File(mStateDirectory, pkgName + "_widget");
boolean priorStateExists = widgetFile.exists();
if (!priorStateExists && widgetState == null) {
@@ -1003,7 +1008,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
// Use the scheduler's default.
delay = 0;
}
- KeyValueBackupJob.schedule(
+ KeyValueBackupJob.schedule(mBackupManagerService.getUserId(),
mBackupManagerService.getContext(), delay, mBackupManagerService.getConstants());
for (String packageName : mOriginalQueue) {
diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
index e273b329d51a..0fa0f89e329e 100644
--- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
+++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
@@ -54,6 +54,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
private final TransportManager mTransportManager;
private final String mTransportName;
private final UserBackupManagerService mBackupManagerService;
+ private final int mUserId;
@Nullable private final String mPackageName;
public RestoreSet[] mRestoreSets = null;
boolean mEnded = false;
@@ -67,6 +68,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
mPackageName = packageName;
mTransportManager = backupManagerService.getTransportManager();
mTransportName = transportName;
+ mUserId = backupManagerService.getUserId();
}
public void markTimedOut() {
@@ -304,7 +306,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
final PackageInfo app;
try {
- app = mBackupManagerService.getPackageManager().getPackageInfo(packageName, 0);
+ app = mBackupManagerService.getPackageManager().getPackageInfoAsUser(
+ packageName, 0, mUserId);
} catch (NameNotFoundException nnf) {
Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName);
return -1;
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index 0d26ea56faa2..b3d9fbcb88d3 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -68,6 +68,8 @@ import java.util.List;
public class FullRestoreEngine extends RestoreEngine {
private final UserBackupManagerService mBackupManagerService;
+ private final int mUserId;
+
// Task in charge of monitoring timeouts
private final BackupRestoreTask mMonitorTask;
@@ -146,6 +148,7 @@ public class FullRestoreEngine extends RestoreEngine {
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
mIsAdbRestore = isAdbRestore;
+ mUserId = backupManagerService.getUserId();
}
public IBackupAgent getAgent() {
@@ -272,7 +275,7 @@ public class FullRestoreEngine extends RestoreEngine {
instream, mBackupManagerService.getContext(),
mDeleteObserver, mManifestSignatures,
mPackagePolicies, info, installerPackageName,
- bytesReadListener);
+ bytesReadListener, mUserId);
// good to go; promote to ACCEPT
mPackagePolicies.put(pkg, isSuccessfullyInstalled
? RestorePolicy.ACCEPT
@@ -329,9 +332,8 @@ public class FullRestoreEngine extends RestoreEngine {
}
try {
- mTargetApp =
- mBackupManagerService.getPackageManager().getApplicationInfo(
- pkg, 0);
+ mTargetApp = mBackupManagerService.getPackageManager()
+ .getApplicationInfoAsUser(pkg, 0, mUserId);
// If we haven't sent any data to this app yet, we probably
// need to clear it first. Check that.
@@ -678,12 +680,13 @@ public class FullRestoreEngine extends RestoreEngine {
* Returns whether the package is in the list of the packages for which clear app data should
* be called despite the fact that they have backup agent.
*
- * <p>The list is read from {@link Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE}.
+ * <p>The list is read from {@link Settings.Secure#PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE}.
*/
private boolean shouldForceClearAppDataOnFullRestore(String packageName) {
- String packageListString = Settings.Secure.getString(
+ String packageListString = Settings.Secure.getStringForUser(
mBackupManagerService.getContext().getContentResolver(),
- Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE);
+ Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE,
+ mUserId);
if (TextUtils.isEmpty(packageListString)) {
return false;
}
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index f7efad604e35..d01f77bfd84c 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -48,7 +48,6 @@ import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.UserHandle;
import android.util.EventLog;
import android.util.Slog;
@@ -81,6 +80,7 @@ import java.util.List;
public class PerformUnifiedRestoreTask implements BackupRestoreTask {
private UserBackupManagerService backupManagerService;
+ private final int mUserId;
private final TransportManager mTransportManager;
// Transport client we're working with to do the restore
private final TransportClient mTransportClient;
@@ -175,6 +175,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
@Nullable String[] filterSet,
OnTaskFinishedListener listener) {
this.backupManagerService = backupManagerService;
+ mUserId = backupManagerService.getUserId();
mTransportManager = backupManagerService.getTransportManager();
mEphemeralOpToken = backupManagerService.generateRandomIntegerToken();
mState = UnifiedRestoreState.INITIAL;
@@ -204,7 +205,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// We want everything and a pony
List<PackageInfo> apps =
PackageManagerBackupAgent.getStorableApplications(
- backupManagerService.getPackageManager());
+ backupManagerService.getPackageManager(), mUserId);
filterSet = packagesToNames(apps);
if (DEBUG) {
Slog.i(TAG, "Full restore; asking about " + filterSet.length + " apps");
@@ -221,7 +222,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
for (int i = 0; i < filterSet.length; i++) {
try {
PackageManager pm = backupManagerService.getPackageManager();
- PackageInfo info = pm.getPackageInfo(filterSet[i], 0);
+ PackageInfo info = pm.getPackageInfoAsUser(filterSet[i], 0, mUserId);
if ("android".equals(info.packageName)) {
hasSystem = true;
continue;
@@ -240,16 +241,16 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
if (hasSystem) {
try {
- mAcceptSet.add(0,
- backupManagerService.getPackageManager().getPackageInfo("android", 0));
+ mAcceptSet.add(0, backupManagerService.getPackageManager().getPackageInfoAsUser(
+ "android", 0, mUserId));
} catch (NameNotFoundException e) {
// won't happen; we know a priori that it's valid
}
}
if (hasSettings) {
try {
- mAcceptSet.add(backupManagerService.getPackageManager().getPackageInfo(
- SETTINGS_PACKAGE, 0));
+ mAcceptSet.add(backupManagerService.getPackageManager().getPackageInfoAsUser(
+ SETTINGS_PACKAGE, 0, mUserId));
} catch (NameNotFoundException e) {
// this one is always valid too
}
@@ -359,8 +360,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// If we're starting a full-system restore, set up to begin widget ID remapping
if (mIsSystemRestore) {
- // TODO: http://b/22388012
- AppWidgetBackupBridge.restoreStarting(UserHandle.USER_SYSTEM);
+ AppWidgetBackupBridge.restoreStarting(mUserId);
}
try {
@@ -508,8 +508,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
try {
- mCurrentPackage = backupManagerService.getPackageManager().getPackageInfo(
- pkgName, PackageManager.GET_SIGNING_CERTIFICATES);
+ mCurrentPackage = backupManagerService.getPackageManager().getPackageInfoAsUser(
+ pkgName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
} catch (NameNotFoundException e) {
// Whoops, we thought we could restore this package but it
// turns out not to be present. Skip it.
@@ -1078,8 +1078,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
// Kick off any work that may be needed regarding app widget restores
- // TODO: http://b/22388012
- AppWidgetBackupBridge.restoreFinished(UserHandle.USER_SYSTEM);
+ AppWidgetBackupBridge.restoreFinished(mUserId);
// If this was a full-system restore, record the ancestral
// dataset information
diff --git a/services/backup/java/com/android/server/backup/transport/TransportClient.java b/services/backup/java/com/android/server/backup/transport/TransportClient.java
index e4dcb25c0623..7c5a57c004e4 100644
--- a/services/backup/java/com/android/server/backup/transport/TransportClient.java
+++ b/services/backup/java/com/android/server/backup/transport/TransportClient.java
@@ -20,6 +20,7 @@ import static com.android.server.backup.transport.TransportUtils.formatMessage;
import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.annotation.WorkerThread;
import android.content.ComponentName;
import android.content.Context;
@@ -34,7 +35,6 @@ import android.os.UserHandle;
import android.text.format.DateFormat;
import android.util.ArrayMap;
import android.util.EventLog;
-import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -79,6 +79,7 @@ public class TransportClient {
@VisibleForTesting static final String TAG = "TransportClient";
private static final int LOG_BUFFER_SIZE = 5;
+ private final @UserIdInt int mUserId;
private final Context mContext;
private final TransportStats mTransportStats;
private final Intent mBindIntent;
@@ -106,6 +107,7 @@ public class TransportClient {
private volatile IBackupTransport mTransport;
TransportClient(
+ @UserIdInt int userId,
Context context,
TransportStats transportStats,
Intent bindIntent,
@@ -113,6 +115,7 @@ public class TransportClient {
String identifier,
String caller) {
this(
+ userId,
context,
transportStats,
bindIntent,
@@ -124,6 +127,7 @@ public class TransportClient {
@VisibleForTesting
TransportClient(
+ @UserIdInt int userId,
Context context,
TransportStats transportStats,
Intent bindIntent,
@@ -131,6 +135,7 @@ public class TransportClient {
String identifier,
String caller,
Handler listenerHandler) {
+ mUserId = userId;
mContext = context;
mTransportStats = transportStats;
mTransportComponent = transportComponent;
@@ -213,7 +218,7 @@ public class TransportClient {
mBindIntent,
mConnection,
Context.BIND_AUTO_CREATE,
- UserHandle.SYSTEM);
+ UserHandle.of(mUserId));
if (hasBound) {
// We don't need to set a time-out because we are guaranteed to get a call
// back in ServiceConnection, either an onServiceConnected() or
diff --git a/services/backup/java/com/android/server/backup/transport/TransportClientManager.java b/services/backup/java/com/android/server/backup/transport/TransportClientManager.java
index f4e39287b277..a4e9b1091bed 100644
--- a/services/backup/java/com/android/server/backup/transport/TransportClientManager.java
+++ b/services/backup/java/com/android/server/backup/transport/TransportClientManager.java
@@ -19,12 +19,15 @@ package com.android.server.backup.transport;
import static com.android.server.backup.TransportManager.SERVICE_ACTION_TRANSPORT_HOST;
import static com.android.server.backup.transport.TransportUtils.formatMessage;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+
import com.android.server.backup.TransportManager;
import com.android.server.backup.transport.TransportUtils.Priority;
+
import java.io.PrintWriter;
import java.util.Map;
import java.util.WeakHashMap;
@@ -36,13 +39,16 @@ import java.util.WeakHashMap;
public class TransportClientManager {
private static final String TAG = "TransportClientManager";
+ private final @UserIdInt int mUserId;
private final Context mContext;
private final TransportStats mTransportStats;
private final Object mTransportClientsLock = new Object();
private int mTransportClientsCreated = 0;
private Map<TransportClient, String> mTransportClientsCallerMap = new WeakHashMap<>();
- public TransportClientManager(Context context, TransportStats transportStats) {
+ public TransportClientManager(@UserIdInt int userId, Context context,
+ TransportStats transportStats) {
+ mUserId = userId;
mContext = context;
mTransportStats = transportStats;
}
@@ -89,6 +95,7 @@ public class TransportClientManager {
synchronized (mTransportClientsLock) {
TransportClient transportClient =
new TransportClient(
+ mUserId,
mContext,
mTransportStats,
bindIntent,
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index e465c7e5264f..054879b077ad 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -91,10 +91,13 @@ public class AppBackupUtils {
* </ol>
*/
public static boolean appIsRunningAndEligibleForBackupWithTransport(
- @Nullable TransportClient transportClient, String packageName, PackageManager pm) {
+ @Nullable TransportClient transportClient,
+ String packageName,
+ PackageManager pm,
+ int userId) {
try {
- PackageInfo packageInfo = pm.getPackageInfo(packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageInfo packageInfo = pm.getPackageInfoAsUser(packageName,
+ PackageManager.GET_SIGNING_CERTIFICATES, userId);
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (!appIsEligibleForBackup(applicationInfo, pm)
|| appIsStopped(applicationInfo)
diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
index df7e6d45ba0f..cce5b3b4e238 100644
--- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
@@ -72,7 +72,9 @@ public class RestoreUtils {
HashMap<String, Signature[]> manifestSignatures,
HashMap<String, RestorePolicy> packagePolicies,
FileMetadata info,
- String installerPackageName, BytesReadListener bytesReadListener) {
+ String installerPackageName,
+ BytesReadListener bytesReadListener,
+ int userId) {
boolean okay = true;
if (DEBUG) {
@@ -144,8 +146,8 @@ public class RestoreUtils {
uninstall = true;
} else {
try {
- PackageInfo pkg = packageManager.getPackageInfo(info.packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageInfo pkg = packageManager.getPackageInfoAsUser(info.packageName,
+ PackageManager.GET_SIGNING_CERTIFICATES, userId);
if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP)
== 0) {
Slog.w(TAG, "Restore stream contains apk of package "
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 4b24ef96cc25..e4bbcd67d4df 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -32,6 +32,7 @@ import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.LocalLog;
import android.util.Slog;
import android.view.contentcapture.IContentCaptureManager;
@@ -39,6 +40,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.IResultReceiver;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.SyncResultReceiver;
import com.android.server.LocalServices;
import com.android.server.infra.AbstractMasterSystemService;
import com.android.server.infra.FrameworkResourcesServiceNameResolver;
@@ -50,8 +52,9 @@ import java.util.ArrayList;
/**
* A service used to observe the contents of the screen.
*
- * <p>The data collected by this service can be analyzed and combined with other sources to provide
- * contextual data in other areas of the system such as Autofill.
+ * <p>The data collected by this service can be analyzed on-device and combined
+ * with other sources to provide contextual data in other areas of the system
+ * such as Autofill.
*/
public final class ContentCaptureManagerService extends
AbstractMasterSystemService<ContentCaptureManagerService, ContentCapturePerUserService> {
@@ -67,6 +70,8 @@ public final class ContentCaptureManagerService extends
private final LocalService mLocalService = new LocalService();
+ private final LocalLog mRequestsHistory = new LocalLog(20);
+
public ContentCaptureManagerService(@NonNull Context context) {
super(context, new FrameworkResourcesServiceNameResolver(context,
com.android.internal.R.string.config_defaultContentCaptureService),
@@ -152,6 +157,13 @@ public final class ContentCaptureManagerService extends
}
}
+ /**
+ * Logs a request so it's dumped later...
+ */
+ void logRequestLocked(@NonNull String historyItem) {
+ mRequestsHistory.log(historyItem);
+ }
+
private ActivityManagerInternal getAmInternal() {
synchronized (mLock) {
if (mAm == null) {
@@ -196,12 +208,48 @@ public final class ContentCaptureManagerService extends
}
@Override
+ public void getReceiverServiceComponentName(@UserIdInt int userId,
+ IResultReceiver receiver) {
+ ComponentName connectedServiceComponentName;
+ synchronized (mLock) {
+ final ContentCapturePerUserService service = getServiceForUserLocked(userId);
+ connectedServiceComponentName = service.getServiceComponentName();
+ }
+ try {
+ receiver.send(0, SyncResultReceiver.bundleFor(connectedServiceComponentName));
+ } catch (RemoteException e) {
+ // Ignore exception as we need to be resilient against app behavior.
+ Slog.w(TAG, "Unable to send service component name: " + e);
+ }
+ }
+
+ @Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
+ boolean showHistory = true;
+ if (args != null) {
+ for (String arg : args) {
+ switch(arg) {
+ case "--no-history":
+ showHistory = false;
+ break;
+ case "--help":
+ pw.println("Usage: dumpsys content_capture [--no-history]");
+ return;
+ default:
+ Slog.w(TAG, "Ignoring invalid dump arg: " + arg);
+ }
+ }
+ }
+
synchronized (mLock) {
dumpLocked("", pw);
}
+ if (showHistory) {
+ pw.println(); pw.println("Requests history:"); pw.println();
+ mRequestsHistory.reverseDump(fd, pw, args);
+ }
}
@Override
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index c467935f1996..8d2c79bd9923 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -17,6 +17,9 @@
package com.android.server.contentcapture;
import static android.service.contentcapture.ContentCaptureService.setClientState;
+import static android.view.contentcapture.ContentCaptureSession.STATE_DISABLED;
+import static android.view.contentcapture.ContentCaptureSession.STATE_DUPLICATED_ID;
+import static android.view.contentcapture.ContentCaptureSession.STATE_NO_SERVICE;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
@@ -36,10 +39,11 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.service.contentcapture.ContentCaptureService;
+import android.service.contentcapture.IContentCaptureServiceCallback;
import android.service.contentcapture.SnapshotData;
import android.util.ArrayMap;
+import android.util.Log;
import android.util.Slog;
-import android.view.contentcapture.ContentCaptureSession;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.IResultReceiver;
@@ -48,6 +52,7 @@ import com.android.server.infra.AbstractPerUserSystemService;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
/**
* Per-user instance of {@link ContentCaptureManagerService}.
@@ -72,12 +77,14 @@ final class ContentCapturePerUserService
@GuardedBy("mLock")
private RemoteContentCaptureService mRemoteService;
+ private final ContentCaptureServiceRemoteCallback mRemoteServiceCallback =
+ new ContentCaptureServiceRemoteCallback();
+
// TODO(b/111276913): add mechanism to prune stale sessions, similar to Autofill's
ContentCapturePerUserService(@NonNull ContentCaptureManagerService master,
@NonNull Object lock, boolean disabled, @UserIdInt int userId) {
super(master, lock, userId);
-
updateRemoteServiceLocked(disabled);
}
@@ -95,15 +102,15 @@ final class ContentCapturePerUserService
final ComponentName serviceComponentName = updateServiceInfoLocked();
if (serviceComponentName == null) {
- Slog.w(TAG, "updateRemoteService(): no service componennt name");
+ if (mMaster.debug) Slog.d(TAG, "updateRemoteService(): no service component name");
return;
}
if (!disabled) {
- mRemoteService = new RemoteContentCaptureService(
- mMaster.getContext(),
- ContentCaptureService.SERVICE_INTERFACE, serviceComponentName, mUserId, this,
- mMaster.isBindInstantServiceAllowed(), mMaster.verbose);
+ mRemoteService = new RemoteContentCaptureService(mMaster.getContext(),
+ ContentCaptureService.SERVICE_INTERFACE, serviceComponentName,
+ mRemoteServiceCallback, mUserId, this, mMaster.isBindInstantServiceAllowed(),
+ mMaster.verbose);
}
}
@@ -162,11 +169,24 @@ final class ContentCapturePerUserService
@NonNull ComponentName componentName, int taskId, int displayId,
@NonNull String sessionId, int uid, int flags,
@NonNull IResultReceiver clientReceiver) {
- if (!isEnabledLocked()) {
- setClientState(clientReceiver, ContentCaptureSession.STATE_DISABLED, /* binder=*/ null);
+
+ final ComponentName serviceComponentName = getServiceComponentName();
+ final boolean enabled = isEnabledLocked();
+ final String historyItem =
+ "id=" + sessionId + " uid=" + uid
+ + " a=" + ComponentName.flattenToShortString(componentName)
+ + " t=" + taskId + " d=" + displayId
+ + " s=" + ComponentName.flattenToShortString(serviceComponentName)
+ + " u=" + mUserId + " f=" + flags + (enabled ? "" : " (disabled)");
+ mMaster.logRequestLocked(historyItem);
+
+ if (!enabled) {
+ // TODO: it would be better to split in differet reasons, like
+ // STATE_DISABLED_NO_SERVICE and STATE_DISABLED_BY_DEVICE_POLICY
+ setClientState(clientReceiver, STATE_DISABLED | STATE_NO_SERVICE,
+ /* binder= */ null);
return;
}
- final ComponentName serviceComponentName = getServiceComponentName();
if (serviceComponentName == null) {
// TODO(b/111276913): this happens when the system service is starting, we should
// probably handle it in a more elegant way (like waiting for boot_complete or
@@ -181,7 +201,7 @@ final class ContentCapturePerUserService
if (existingSession != null) {
Slog.w(TAG, "startSession(id=" + existingSession + ", token=" + activityToken
+ ": ignoring because it already exists for " + existingSession.mActivityToken);
- setClientState(clientReceiver, ContentCaptureSession.STATE_DISABLED_DUPLICATED_ID,
+ setClientState(clientReceiver, STATE_DISABLED | STATE_DUPLICATED_ID,
/* binder=*/ null);
return;
}
@@ -194,9 +214,8 @@ final class ContentCapturePerUserService
// TODO(b/119613670): log metrics
Slog.w(TAG, "startSession(id=" + existingSession + ", token=" + activityToken
+ ": ignoring because service is not set");
- // TODO(b/111276913): use a new disabled state?
- setClientState(clientReceiver, ContentCaptureSession.STATE_DISABLED,
- /* binder=*/ null);
+ setClientState(clientReceiver, STATE_DISABLED | STATE_NO_SERVICE,
+ /* binder= */ null);
return;
}
@@ -285,7 +304,7 @@ final class ContentCapturePerUserService
final int numSessions = mSessions.size();
for (int i = 0; i < numSessions; i++) {
final ContentCaptureServerSession session = mSessions.valueAt(i);
- session.destroyLocked(true);
+ session.destroyLocked(/* notifyRemoteService= */ true);
}
mSessions.clear();
}
@@ -335,4 +354,50 @@ final class ContentCapturePerUserService
}
return null;
}
+
+ private final class ContentCaptureServiceRemoteCallback extends
+ IContentCaptureServiceCallback.Stub {
+
+ @Override
+ public void setContentCaptureWhitelist(List<String> packages,
+ List<ComponentName> activities) {
+ if (mMaster.verbose) {
+ Log.v(TAG, "setContentCaptureWhitelist(packages=" + packages + ", activities="
+ + activities + ")");
+ }
+ // TODO(b/122595322): implement
+ // TODO(b/119613670): log metrics
+ }
+
+ @Override
+ public void setActivityContentCaptureEnabled(ComponentName activity, boolean enabled) {
+ if (mMaster.verbose) {
+ Log.v(TAG, "setActivityContentCaptureEnabled(activity=" + activity + ", enabled="
+ + enabled + ")");
+ }
+ // TODO(b/122595322): implement
+ // TODO(b/119613670): log metrics
+ }
+
+ @Override
+ public void setPackageContentCaptureEnabled(String packageName, boolean enabled) {
+ if (mMaster.verbose) {
+ Log.v(TAG,
+ "setPackageContentCaptureEnabled(packageName=" + packageName + ", enabled="
+ + enabled + ")");
+ }
+ // TODO(b/122595322): implement
+ // TODO(b/119613670): log metrics
+ }
+
+ @Override
+ public void getContentCaptureDisabledActivities(IResultReceiver receiver) {
+ // TODO(b/122595322): implement
+ }
+
+ @Override
+ public void getContentCaptureDisabledPackages(IResultReceiver receiver) {
+ // TODO(b/122595322): implement
+ }
+ }
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
index ebe0083b398e..3c52e17ce1e8 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
@@ -83,6 +83,8 @@ final class ContentCaptureServerSession {
*/
@GuardedBy("mLock")
public void sendActivitySnapshotLocked(@NonNull SnapshotData snapshotData) {
+ mService.getMaster().logRequestLocked("snapshot: id=" + mId);
+
mRemoteService.onActivitySnapshotRequest(mId, snapshotData);
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
index 824162868e19..12742ca0a46f 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
@@ -21,6 +21,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.os.IBinder;
import android.service.contentcapture.IContentCaptureService;
+import android.service.contentcapture.IContentCaptureServiceCallback;
import android.service.contentcapture.SnapshotData;
import android.text.format.DateUtils;
import android.util.Slog;
@@ -35,12 +36,15 @@ final class RemoteContentCaptureService
private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 2 * DateUtils.SECOND_IN_MILLIS;
+ private final IBinder mServerCallback;
+
RemoteContentCaptureService(Context context, String serviceInterface,
- ComponentName componentName, int userId,
+ ComponentName serviceComponentName, IContentCaptureServiceCallback callback, int userId,
ContentCaptureServiceCallbacks callbacks, boolean bindInstantServiceAllowed,
boolean verbose) {
- super(context, serviceInterface, componentName, userId, callbacks,
+ super(context, serviceInterface, serviceComponentName, userId, callbacks,
bindInstantServiceAllowed, verbose, /* initialCapacity= */ 2);
+ mServerCallback = callback.asBinder();
// Bind right away, which will trigger a onConnected() on service's
scheduleBind();
@@ -69,7 +73,11 @@ final class RemoteContentCaptureService
scheduleUnbind();
}
try {
- mService.onConnectedStateChanged(state);
+ if (state) {
+ mService.onConnected(mServerCallback);
+ } else {
+ mService.onDisconnected();
+ }
} catch (Exception e) {
Slog.w(mTag, "Exception calling onConnectedStateChanged(" + state + "): " + e);
}
diff --git a/services/contentsuggestions/Android.bp b/services/contentsuggestions/Android.bp
new file mode 100644
index 000000000000..fc09d2e5196a
--- /dev/null
+++ b/services/contentsuggestions/Android.bp
@@ -0,0 +1,5 @@
+java_library_static {
+ name: "services.contentsuggestions",
+ srcs: ["java/**/*.java"],
+ libs: ["services.core"],
+} \ No newline at end of file
diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java
new file mode 100644
index 000000000000..58dbea469b9c
--- /dev/null
+++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2018 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.contentsuggestions;
+
+import static android.Manifest.permission.MANAGE_CONTENT_SUGGESTIONS;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.IContentSuggestionsManager;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.content.Context;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.UserHandle;
+import android.util.Slog;
+
+import com.android.server.LocalServices;
+import com.android.server.infra.AbstractMasterSystemService;
+import com.android.server.infra.FrameworkResourcesServiceNameResolver;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
+import java.io.FileDescriptor;
+
+/**
+ * The system service for providing recents / overview with content suggestion selections and
+ * classifications.
+ *
+ * <p>Calls are received here from
+ * {@link android.app.contentsuggestions.ContentSuggestionsManager} then delegated to
+ * a per user version of the service. From there they are routed to the remote actual implementation
+ * that provides the suggestion selections and classifications.
+ */
+public class ContentSuggestionsManagerService extends
+ AbstractMasterSystemService<
+ ContentSuggestionsManagerService, ContentSuggestionsPerUserService> {
+
+ private static final String TAG = ContentSuggestionsManagerService.class.getSimpleName();
+ private static final boolean VERBOSE = false; // TODO: make dynamic
+
+ private static final int MAX_TEMP_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes
+
+ private ActivityTaskManagerInternal mActivityTaskManagerInternal;
+
+ public ContentSuggestionsManagerService(Context context) {
+ super(context, new FrameworkResourcesServiceNameResolver(context,
+ com.android.internal.R.string.config_defaultContentSuggestionsService), null);
+ mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
+ }
+
+ @Override
+ protected ContentSuggestionsPerUserService newServiceLocked(int resolvedUserId,
+ boolean disabled) {
+ return new ContentSuggestionsPerUserService(this, mLock, resolvedUserId);
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(
+ Context.CONTENT_SUGGESTIONS_SERVICE, new ContentSuggestionsManagerStub());
+ }
+
+ @Override
+ protected void enforceCallingPermissionForManagement() {
+ getContext().enforceCallingPermission(MANAGE_CONTENT_SUGGESTIONS, TAG);
+ }
+
+ @Override
+ protected int getMaximumTemporaryServiceDurationMs() {
+ return MAX_TEMP_SERVICE_DURATION_MS;
+ }
+
+ private boolean isCallerRecents(int userId) {
+ if (mServiceNameResolver.isTemporary(userId)) {
+ // If a temporary service is set then skip the recents check
+ return true;
+ }
+ return mActivityTaskManagerInternal.isCallerRecents(Binder.getCallingUid());
+ }
+
+ private void enforceCallerIsRecents(int userId, String func) {
+ if (isCallerRecents(userId)) {
+ return;
+ }
+
+ String msg = "Permission Denial: " + func + " from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid()
+ + " expected caller is recents";
+ Slog.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+
+ private class ContentSuggestionsManagerStub extends IContentSuggestionsManager.Stub {
+ @Override
+ public void provideContextImage(int taskId, @NonNull Bundle imageContextRequestExtras) {
+ if (imageContextRequestExtras == null) {
+ throw new IllegalArgumentException("Expected non-null imageContextRequestExtras");
+ }
+
+ final int userId = UserHandle.getCallingUserId();
+ enforceCallerIsRecents(userId, "provideContextImage");
+
+ synchronized (mLock) {
+ final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId);
+ if (service != null) {
+ service.provideContextImageLocked(taskId, imageContextRequestExtras);
+ } else {
+ if (VERBOSE) {
+ Slog.v(TAG, "provideContextImageLocked: no service for " + userId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void suggestContentSelections(
+ @NonNull SelectionsRequest selectionsRequest,
+ @NonNull ISelectionsCallback selectionsCallback) {
+ final int userId = UserHandle.getCallingUserId();
+ enforceCallerIsRecents(userId, "suggestContentSelections");
+
+ synchronized (mLock) {
+ final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId);
+ if (service != null) {
+ service.suggestContentSelectionsLocked(selectionsRequest, selectionsCallback);
+ } else {
+ if (VERBOSE) {
+ Slog.v(TAG, "suggestContentSelectionsLocked: no service for " + userId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void classifyContentSelections(
+ @NonNull ClassificationsRequest classificationsRequest,
+ @NonNull IClassificationsCallback callback) {
+ final int userId = UserHandle.getCallingUserId();
+ enforceCallerIsRecents(userId, "classifyContentSelections");
+
+ synchronized (mLock) {
+ final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId);
+ if (service != null) {
+ service.classifyContentSelectionsLocked(classificationsRequest, callback);
+ } else {
+ if (VERBOSE) {
+ Slog.v(TAG, "classifyContentSelectionsLocked: no service for " + userId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void notifyInteraction(@NonNull String requestId, @NonNull Bundle bundle) {
+ final int userId = UserHandle.getCallingUserId();
+ enforceCallerIsRecents(userId, "notifyInteraction");
+
+ synchronized (mLock) {
+ final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId);
+ if (service != null) {
+ service.notifyInteractionLocked(requestId, bundle);
+ } else {
+ if (VERBOSE) {
+ Slog.v(TAG, "reportInteractionLocked: no service for " + userId);
+ }
+ }
+ }
+ }
+
+ public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
+ @Nullable FileDescriptor err,
+ @NonNull String[] args, @Nullable ShellCallback callback,
+ @NonNull ResultReceiver resultReceiver) throws RemoteException {
+ // Ensure that the caller is the shell process
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid != android.os.Process.SHELL_UID
+ && callingUid != android.os.Process.ROOT_UID) {
+ Slog.e(TAG, "Expected shell caller");
+ return;
+ }
+ new ContentSuggestionsManagerServiceShellCommand(ContentSuggestionsManagerService.this)
+ .exec(this, in, out, err, args, callback, resultReceiver);
+ }
+ }
+}
diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java
new file mode 100644
index 000000000000..e34f1eadcd02
--- /dev/null
+++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2018 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.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.os.ShellCommand;
+
+import java.io.PrintWriter;
+
+/**
+ * The shell command implementation for the ContentSuggestionsManagerService.
+ */
+public class ContentSuggestionsManagerServiceShellCommand extends ShellCommand {
+
+ private static final String TAG =
+ ContentSuggestionsManagerServiceShellCommand.class.getSimpleName();
+
+ private final ContentSuggestionsManagerService mService;
+
+ public ContentSuggestionsManagerServiceShellCommand(
+ @NonNull ContentSuggestionsManagerService service) {
+ mService = service;
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+ final PrintWriter pw = getOutPrintWriter();
+ switch (cmd) {
+ case "set": {
+ final String what = getNextArgRequired();
+ switch (what) {
+ case "temporary-service": {
+ final int userId = Integer.parseInt(getNextArgRequired());
+ String serviceName = getNextArg();
+ if (serviceName == null) {
+ mService.resetTemporaryService(userId);
+ return 0;
+ }
+ final int duration = Integer.parseInt(getNextArgRequired());
+ mService.setTemporaryService(userId, serviceName, duration);
+ pw.println("ContentSuggestionsService temporarily set to " + serviceName
+ + " for " + duration + "ms");
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ return 0;
+ }
+
+ @Override
+ public void onHelp() {
+ try (PrintWriter pw = getOutPrintWriter()) {
+ pw.println("ContentSuggestionsManagerService commands:");
+ pw.println(" help");
+ pw.println(" Prints this help text.");
+ pw.println("");
+ pw.println(" set temporary-service USER_ID [COMPONENT_NAME DURATION]");
+ pw.println(" Temporarily (for DURATION ms) changes the service implemtation.");
+ pw.println(" To reset, call with just the USER_ID argument.");
+ pw.println("");
+ }
+ }
+}
diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java
new file mode 100644
index 000000000000..385bc6cf3932
--- /dev/null
+++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2018 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.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.AppGlobals;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.content.ComponentName;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.graphics.GraphicBuffer;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.LocalServices;
+import com.android.server.infra.AbstractPerUserSystemService;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
+/**
+ * Per user delegate of {@link ContentSuggestionsManagerService}.
+ *
+ * <p>Main job is to forward calls to the remote implementation that can provide suggestion
+ * selections and classifications.
+ */
+public final class ContentSuggestionsPerUserService extends
+ AbstractPerUserSystemService<
+ ContentSuggestionsPerUserService, ContentSuggestionsManagerService> {
+ private static final String TAG = ContentSuggestionsPerUserService.class.getSimpleName();
+
+ @Nullable
+ @GuardedBy("mLock")
+ private RemoteContentSuggestionsService mRemoteService;
+
+ @NonNull
+ private final ActivityTaskManagerInternal mActivityTaskManagerInternal;
+
+ ContentSuggestionsPerUserService(
+ ContentSuggestionsManagerService master, Object lock, int userId) {
+ super(master, lock, userId);
+ mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
+ }
+
+ @GuardedBy("mLock")
+ @Override // from PerUserSystemService
+ protected ServiceInfo newServiceInfoLocked(@NonNull ComponentName serviceComponent)
+ throws PackageManager.NameNotFoundException {
+ ServiceInfo si;
+ try {
+ si = AppGlobals.getPackageManager().getServiceInfo(serviceComponent,
+ PackageManager.GET_META_DATA, mUserId);
+ } catch (RemoteException e) {
+ throw new PackageManager.NameNotFoundException(
+ "Could not get service for " + serviceComponent);
+ }
+ return si;
+ }
+
+ @GuardedBy("mLock")
+ @Override // from PerUserSystemService
+ protected boolean updateLocked(boolean disabled) {
+ final boolean enabledChanged = super.updateLocked(disabled);
+ if (enabledChanged) {
+ if (!isEnabledLocked()) {
+ // Clear the remote service for the next call
+ mRemoteService = null;
+ }
+ }
+ return enabledChanged;
+ }
+
+ @GuardedBy("mLock")
+ void provideContextImageLocked(int taskId, @NonNull Bundle imageContextRequestExtras) {
+ RemoteContentSuggestionsService service = getRemoteServiceLocked();
+ if (service != null) {
+ ActivityManager.TaskSnapshot snapshot =
+ mActivityTaskManagerInternal.getTaskSnapshot(taskId, false);
+ GraphicBuffer snapshotBuffer = null;
+ if (snapshot != null) {
+ snapshotBuffer = snapshot.getSnapshot();
+ }
+
+ service.provideContextImage(taskId, snapshotBuffer, imageContextRequestExtras);
+ }
+ }
+
+ @GuardedBy("mLock")
+ void suggestContentSelectionsLocked(
+ @NonNull SelectionsRequest selectionsRequest,
+ @NonNull ISelectionsCallback selectionsCallback) {
+ RemoteContentSuggestionsService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.suggestContentSelections(selectionsRequest, selectionsCallback);
+ }
+ }
+
+ @GuardedBy("mLock")
+ void classifyContentSelectionsLocked(
+ @NonNull ClassificationsRequest classificationsRequest,
+ @NonNull IClassificationsCallback callback) {
+ RemoteContentSuggestionsService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.classifyContentSelections(classificationsRequest, callback);
+ }
+ }
+
+ @GuardedBy("mLock")
+ void notifyInteractionLocked(@NonNull String requestId, @NonNull Bundle bundle) {
+ RemoteContentSuggestionsService service = getRemoteServiceLocked();
+ if (service != null) {
+ service.notifyInteraction(requestId, bundle);
+ }
+ }
+
+ @GuardedBy("mLock")
+ @Nullable
+ private RemoteContentSuggestionsService getRemoteServiceLocked() {
+ if (mRemoteService == null) {
+ final String serviceName = getComponentNameLocked();
+ if (serviceName == null) {
+ if (mMaster.verbose) {
+ Slog.v(TAG, "getRemoteServiceLocked(): not set");
+ }
+ return null;
+ }
+ ComponentName serviceComponent = ComponentName.unflattenFromString(serviceName);
+
+ mRemoteService = new RemoteContentSuggestionsService(getContext(),
+ serviceComponent, mUserId,
+ new RemoteContentSuggestionsService.Callbacks() {
+ @Override
+ public void onServiceDied(
+ @NonNull RemoteContentSuggestionsService service) {
+ // TODO(b/120865921): properly implement
+ Slog.w(TAG, "remote content suggestions service died");
+ }
+ }, mMaster.isBindInstantServiceAllowed(), mMaster.verbose);
+ }
+
+ return mRemoteService;
+ }
+}
diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java
new file mode 100644
index 000000000000..bf48d7623255
--- /dev/null
+++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018 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.contentsuggestions;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.contentsuggestions.ClassificationsRequest;
+import android.app.contentsuggestions.IClassificationsCallback;
+import android.app.contentsuggestions.ISelectionsCallback;
+import android.app.contentsuggestions.SelectionsRequest;
+import android.content.ComponentName;
+import android.content.Context;
+import android.graphics.GraphicBuffer;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.service.contentsuggestions.ContentSuggestionsService;
+import android.service.contentsuggestions.IContentSuggestionsService;
+import android.text.format.DateUtils;
+
+import com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService;
+
+/**
+ * Delegates calls from {@link ContentSuggestionsPerUserService} to the remote actual implementation
+ * of the suggestion selection and classification service.
+ */
+public class RemoteContentSuggestionsService extends
+ AbstractMultiplePendingRequestsRemoteService<RemoteContentSuggestionsService,
+ IContentSuggestionsService> {
+
+ private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 2 * DateUtils.SECOND_IN_MILLIS;
+
+ RemoteContentSuggestionsService(Context context, ComponentName serviceName,
+ int userId, Callbacks callbacks,
+ boolean bindInstantServiceAllowed, boolean verbose) {
+ super(context, ContentSuggestionsService.SERVICE_INTERFACE, serviceName, userId, callbacks,
+ bindInstantServiceAllowed, verbose, /* initialCapacity= */ 1);
+ }
+
+ @Override
+ protected IContentSuggestionsService getServiceInterface(IBinder service) {
+ return IContentSuggestionsService.Stub.asInterface(service);
+ }
+
+ @Override
+ protected long getTimeoutIdleBindMillis() {
+ return PERMANENT_BOUND_TIMEOUT_MS;
+ }
+
+ @Override
+ protected long getRemoteRequestMillis() {
+ return TIMEOUT_REMOTE_REQUEST_MILLIS;
+ }
+
+ void provideContextImage(int taskId, @Nullable GraphicBuffer contextImage,
+ @NonNull Bundle imageContextRequestExtras) {
+ scheduleAsyncRequest((s) -> s.provideContextImage(taskId, contextImage,
+ imageContextRequestExtras));
+ }
+
+ void suggestContentSelections(
+ @NonNull SelectionsRequest selectionsRequest,
+ @NonNull ISelectionsCallback selectionsCallback) {
+ scheduleAsyncRequest(
+ (s) -> s.suggestContentSelections(selectionsRequest, selectionsCallback));
+ }
+
+ void classifyContentSelections(
+ @NonNull ClassificationsRequest classificationsRequest,
+ @NonNull IClassificationsCallback callback) {
+ scheduleAsyncRequest((s) -> s.classifyContentSelections(classificationsRequest, callback));
+ }
+
+ void notifyInteraction(@NonNull String requestId, @NonNull Bundle bundle) {
+ scheduleAsyncRequest((s) -> s.notifyInteraction(requestId, bundle));
+ }
+
+ interface Callbacks
+ extends VultureCallback<RemoteContentSuggestionsService> {
+ // NOTE: so far we don't need to notify the callback implementation
+ // (ContentSuggestionsManager) of the request results (success, timeouts, etc..), so this
+ // callback interface is empty.
+ }
+}
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 7447a052f217..e6ada8ec2bfa 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -280,7 +280,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
Slog.d(TAG,
"Airplane Mode change - current state: " + BluetoothAdapter.nameForState(
- st));
+ st) + ", isAirplaneModeOn()=" + isAirplaneModeOn());
if (isAirplaneModeOn()) {
// Clear registered LE apps to force shut-off
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index ed664ae425ad..ef1ac4d99875 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -25,6 +25,7 @@ import static android.net.ConnectivityManager.TYPE_NONE;
import static android.net.ConnectivityManager.TYPE_VPN;
import static android.net.ConnectivityManager.getNetworkTypeName;
import static android.net.ConnectivityManager.isNetworkTypeValid;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
@@ -38,6 +39,8 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.uidRulesToString;
+import static android.net.NetworkStack.NETWORKSTACK_PACKAGE_NAME;
+import static android.net.shared.NetworkMonitorUtils.isValidationRequired;
import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP;
@@ -64,6 +67,8 @@ import android.net.IIpConnectivityMetrics;
import android.net.INetd;
import android.net.INetdEventCallback;
import android.net.INetworkManagementEventObserver;
+import android.net.INetworkMonitor;
+import android.net.INetworkMonitorCallbacks;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
@@ -81,9 +86,11 @@ import android.net.NetworkPolicyManager;
import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
+import android.net.NetworkStack;
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.NetworkWatchlistManager;
+import android.net.PrivateDnsConfigParcel;
import android.net.ProxyInfo;
import android.net.RouteInfo;
import android.net.StringNetworkSpecifier;
@@ -93,12 +100,13 @@ import android.net.VpnService;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.NetworkEvent;
import android.net.netlink.InetDiagMessage;
+import android.net.shared.NetworkMonitorUtils;
+import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
-import android.os.FileUtils;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -127,8 +135,8 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.LocalLog;
-import android.util.LocalLog.ReadOnlyLocalLog;
import android.util.Log;
+import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -153,7 +161,6 @@ import com.android.internal.util.XmlUtils;
import com.android.server.am.BatteryStatsService;
import com.android.server.connectivity.DataConnectionStats;
import com.android.server.connectivity.DnsManager;
-import com.android.server.connectivity.DnsManager.PrivateDnsConfig;
import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.connectivity.KeepaliveTracker;
@@ -162,7 +169,6 @@ import com.android.server.connectivity.MockableSystemProperties;
import com.android.server.connectivity.MultipathPolicyTracker;
import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkDiagnostics;
-import com.android.server.connectivity.NetworkMonitor;
import com.android.server.connectivity.NetworkNotificationManager;
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
import com.android.server.connectivity.PermissionMonitor;
@@ -190,7 +196,6 @@ import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -446,6 +451,43 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
private static final int EVENT_DATA_SAVER_CHANGED = 40;
+ /**
+ * Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the network has
+ * been tested.
+ * obj = String representing URL that Internet probe was redirect to, if it was redirected.
+ * arg1 = One of the NETWORK_TESTED_RESULT_* constants.
+ * arg2 = NetID.
+ */
+ public static final int EVENT_NETWORK_TESTED = 41;
+
+ /**
+ * Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the private DNS
+ * config was resolved.
+ * obj = PrivateDnsConfig
+ * arg2 = netid
+ */
+ public static final int EVENT_PRIVATE_DNS_CONFIG_RESOLVED = 42;
+
+ /**
+ * Request ConnectivityService display provisioning notification.
+ * arg1 = Whether to make the notification visible.
+ * arg2 = NetID.
+ * obj = Intent to be launched when notification selected by user, null if !arg1.
+ */
+ public static final int EVENT_PROVISIONING_NOTIFICATION = 43;
+
+ /**
+ * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
+ * should be shown.
+ */
+ public static final int PROVISIONING_NOTIFICATION_SHOW = 1;
+
+ /**
+ * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
+ * should be hidden.
+ */
+ public static final int PROVISIONING_NOTIFICATION_HIDE = 0;
+
private static final int EVENT_UPDATE_TCP_BUFFER_FOR_5G = 160;
private static String eventName(int what) {
@@ -513,30 +555,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
private long mMaxWakelockDurationMs = 0;
private long mLastWakeLockAcquireTimestamp = 0;
- // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results
- private static final int MAX_VALIDATION_LOGS = 10;
- private static class ValidationLog {
- final Network mNetwork;
- final String mName;
- final ReadOnlyLocalLog mLog;
-
- ValidationLog(Network network, String name, ReadOnlyLocalLog log) {
- mNetwork = network;
- mName = name;
- mLog = log;
- }
- }
- private final ArrayDeque<ValidationLog> mValidationLogs = new ArrayDeque<>(MAX_VALIDATION_LOGS);
-
- private void addValidationLogs(ReadOnlyLocalLog log, Network network, String name) {
- synchronized (mValidationLogs) {
- while (mValidationLogs.size() >= MAX_VALIDATION_LOGS) {
- mValidationLogs.removeLast();
- }
- mValidationLogs.addFirst(new ValidationLog(network, name, log));
- }
- }
-
private final IpConnectivityLog mMetricsLog;
@GuardedBy("mBandwidthRequests")
@@ -1484,6 +1502,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
newNc.setUids(null);
newNc.setSSID(null);
}
+ if (newNc.getNetworkSpecifier() != null) {
+ newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact());
+ }
return newNc;
}
@@ -1692,7 +1713,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
// caller type. Need to re-factor NetdEventListenerService to allow multiple
// NetworkMonitor registrants.
if (nai != null && nai.satisfies(mDefaultRequest)) {
- nai.networkMonitor.sendMessage(NetworkMonitor.EVENT_DNS_NOTIFICATION, returnCode);
+ try {
+ nai.networkMonitor().notifyDnsResponse(returnCode);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
}
};
@@ -2287,17 +2312,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (ArrayUtils.contains(args, SHORT_ARG) == false) {
pw.println();
- synchronized (mValidationLogs) {
- pw.println("mValidationLogs (most recent first):");
- for (ValidationLog p : mValidationLogs) {
- pw.println(p.mNetwork + " - " + p.mName);
- pw.increaseIndent();
- p.mLog.dump(fd, pw, args);
- pw.decreaseIndent();
- }
- }
-
- pw.println();
pw.println("mNetworkRequestInfoLogs (most recent first):");
pw.increaseIndent();
mNetworkRequestInfoLogs.reverseDump(fd, pw, args);
@@ -2476,11 +2490,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
switch (msg.what) {
default:
return false;
- case NetworkMonitor.EVENT_NETWORK_TESTED: {
+ case EVENT_NETWORK_TESTED: {
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
if (nai == null) break;
- final boolean valid = (msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID);
+ final boolean valid = (msg.arg1 == NETWORK_TEST_RESULT_VALID);
final boolean wasValidated = nai.lastValidated;
final boolean wasDefault = isDefaultNetwork(nai);
@@ -2518,7 +2532,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
break;
}
- case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: {
+ case EVENT_PROVISIONING_NOTIFICATION: {
final int netId = msg.arg2;
final boolean visible = toBool(msg.arg1);
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId);
@@ -2551,7 +2565,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
break;
}
- case NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED: {
+ case EVENT_PRIVATE_DNS_CONFIG_RESOLVED: {
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
if (nai == null) break;
@@ -2593,8 +2607,61 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
+ private class NetworkMonitorCallbacks extends INetworkMonitorCallbacks.Stub {
+ private final NetworkAgentInfo mNai;
+
+ private NetworkMonitorCallbacks(NetworkAgentInfo nai) {
+ mNai = nai;
+ }
+
+ @Override
+ public void onNetworkMonitorCreated(INetworkMonitor networkMonitor) {
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT,
+ new Pair<>(mNai, networkMonitor)));
+ }
+
+ @Override
+ public void notifyNetworkTested(int testResult, @Nullable String redirectUrl) {
+ mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_NETWORK_TESTED,
+ testResult, mNai.network.netId, redirectUrl));
+ }
+
+ @Override
+ public void notifyPrivateDnsConfigResolved(PrivateDnsConfigParcel config) {
+ mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(
+ EVENT_PRIVATE_DNS_CONFIG_RESOLVED,
+ 0, mNai.network.netId, PrivateDnsConfig.fromParcel(config)));
+ }
+
+ @Override
+ public void showProvisioningNotification(String action) {
+ final Intent intent = new Intent(action);
+ intent.setPackage(NETWORKSTACK_PACKAGE_NAME);
+
+ final PendingIntent pendingIntent;
+ // Only the system server can register notifications with package "android"
+ final long token = Binder.clearCallingIdentity();
+ try {
+ pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(
+ EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_SHOW,
+ mNai.network.netId,
+ pendingIntent));
+ }
+
+ @Override
+ public void hideProvisioningNotification() {
+ mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(
+ EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE,
+ mNai.network.netId));
+ }
+ }
+
private boolean networkRequiresValidation(NetworkAgentInfo nai) {
- return NetworkMonitor.isValidationRequired(
+ return isValidationRequired(
mDefaultRequest.networkCapabilities, nai.networkCapabilities);
}
@@ -2624,10 +2691,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Internet access and therefore also require validation.
if (!networkRequiresValidation(nai)) return;
- // Notify the NetworkMonitor thread in case it needs to cancel or
+ // Notify the NetworkAgentInfo/NetworkMonitor in case NetworkMonitor needs to cancel or
// schedule DNS resolutions. If a DNS resolution is required the
// result will be sent back to us.
- nai.networkMonitor.notifyPrivateDnsSettingsChanged(cfg);
+ try {
+ nai.networkMonitor().notifyPrivateDnsChanged(cfg.toParcel());
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
// With Private DNS bypass support, we can proceed to update the
// Private DNS config immediately, even if we're in strict mode
@@ -2757,7 +2828,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Disable wakeup packet monitoring for each interface.
wakeupModifyInterface(iface, nai.networkCapabilities, false);
}
- nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED);
+ try {
+ nai.networkMonitor().notifyNetworkDisconnected();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
mNetworkAgentInfos.remove(nai.messenger);
nai.maybeStopClat();
synchronized (mNetworkForNetId) {
@@ -3129,7 +3204,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
if (nai == null) return;
if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) return;
- nai.networkMonitor.sendMessage(NetworkMonitor.CMD_LAUNCH_CAPTIVE_PORTAL_APP);
+ try {
+ nai.networkMonitor().launchCaptivePortalApp();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
});
}
@@ -3250,6 +3329,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
return mMultinetworkPolicyTracker.getMeteredMultipathPreference();
}
+ @Override
+ public NetworkRequest getDefaultRequest() {
+ return mDefaultRequest;
+ }
+
private class InternalHandler extends Handler {
public InternalHandler(Looper looper) {
super(looper);
@@ -3280,7 +3364,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
break;
}
case EVENT_REGISTER_NETWORK_AGENT: {
- handleRegisterNetworkAgent((NetworkAgentInfo)msg.obj);
+ final Pair<NetworkAgentInfo, INetworkMonitor> arg =
+ (Pair<NetworkAgentInfo, INetworkMonitor>) msg.obj;
+ handleRegisterNetworkAgent(arg.first, arg.second);
break;
}
case EVENT_REGISTER_NETWORK_REQUEST:
@@ -3338,7 +3424,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
case EVENT_SYSTEM_READY: {
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
- nai.networkMonitor.systemReady = true;
+ // Might have been called already in handleRegisterNetworkAgent since
+ // mSystemReady is set before sending EVENT_SYSTEM_READY, but calling
+ // this several times is fine.
+ try {
+ nai.networkMonitor().notifySystemReady();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
mMultipathPolicyTracker.start();
NetPluginDelegate.registerHandler(mHandler);
@@ -3614,7 +3707,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
return;
}
- nai.networkMonitor.forceReevaluation(uid);
+ try {
+ nai.networkMonitor().forceReevaluation(uid);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
@Override
@@ -4822,27 +4919,49 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
- mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest, this);
+ mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS);
// Make sure the network capabilities reflect what the agent info says.
nai.networkCapabilities = mixInCapabilities(nai, nc);
- synchronized (this) {
- nai.networkMonitor.systemReady = mSystemReady;
- }
final String extraInfo = networkInfo.getExtraInfo();
final String name = TextUtils.isEmpty(extraInfo)
? nai.networkCapabilities.getSSID() : extraInfo;
- addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network, name);
if (DBG) log("registerNetworkAgent " + nai);
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai));
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mContext.getSystemService(NetworkStack.class)
+ .makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ // NetworkAgentInfo registration will finish when the NetworkMonitor is created.
+ // If the network disconnects or sends any other event before that, messages are deferred by
+ // NetworkAgent until nai.asyncChannel.connect(), which will be called when finalizing the
+ // registration.
return nai.network.netId;
}
- private void handleRegisterNetworkAgent(NetworkAgentInfo nai) {
+ private void handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor) {
+ nai.onNetworkMonitorCreated(networkMonitor);
if (VDBG) log("Got NetworkAgent Messenger");
mNetworkAgentInfos.put(nai.messenger, nai);
synchronized (mNetworkForNetId) {
mNetworkForNetId.put(nai.network.netId, nai);
}
+ synchronized (this) {
+ if (mSystemReady) {
+ try {
+ networkMonitor.notifySystemReady();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ try {
+ networkMonitor.start();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger);
NetworkInfo networkInfo = nai.networkInfo;
nai.networkInfo = null;
@@ -4892,6 +5011,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
networkAgent.updateClat(mNMS);
notifyIfacesChangedForNetworkStats();
if (networkAgent.everConnected) {
+ try {
+ networkAgent.networkMonitor().notifyLinkPropertiesChanged();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
}
}
@@ -5129,6 +5253,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
// If the requestable capabilities have changed or the score changed, we can't have been
// called by rematchNetworkAndRequests, so it's safe to start a rematch.
rematchAllNetworksAndRequests(nai, oldScore);
+ try {
+ nai.networkMonitor().notifyNetworkCapabilitiesChanged();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
}
@@ -5269,7 +5398,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
switch (notificationType) {
case ConnectivityManager.CALLBACK_AVAILABLE: {
- putParcelable(bundle, new NetworkCapabilities(networkAgent.networkCapabilities));
+ putParcelable(bundle, networkCapabilitiesRestrictedForCallerPermissions(
+ networkAgent.networkCapabilities, nri.mPid, nri.mUid));
putParcelable(bundle, new LinkProperties(networkAgent.linkProperties));
// For this notification, arg1 contains the blocked status.
msg.arg1 = arg1;
@@ -5376,6 +5506,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
if (capabilitiesChanged) {
+ try {
+ nai.networkMonitor().notifyNetworkCapabilitiesChanged();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
}
@@ -5790,7 +5925,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties),
null);
- networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
+ // Until parceled LinkProperties are sent directly to NetworkMonitor, the connect
+ // command must be sent after updating LinkProperties to maximize chances of
+ // NetworkMonitor seeing the correct LinkProperties when starting.
+ // TODO: pass LinkProperties to the NetworkMonitor in the notifyNetworkConnected call.
+ try {
+ networkAgent.networkMonitor().notifyNetworkConnected();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
scheduleUnvalidatedPrompt(networkAgent);
if (networkAgent.isVPN()) {
@@ -6071,7 +6214,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public String getCaptivePortalServerUrl() {
enforceConnectivityInternalPermission();
- return NetworkMonitor.getCaptivePortalServerHttpUrl(mContext);
+ return NetworkMonitorUtils.getCaptivePortalServerHttpUrl(mContext);
}
@Override
@@ -6164,12 +6307,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
@VisibleForTesting
- public NetworkMonitor createNetworkMonitor(Context context, Handler handler,
- NetworkAgentInfo nai, NetworkRequest defaultRequest) {
- return new NetworkMonitor(context, handler, nai, defaultRequest);
- }
-
- @VisibleForTesting
MultinetworkPolicyTracker createMultinetworkPolicyTracker(Context c, Handler h, Runnable r) {
return new MultinetworkPolicyTracker(c, h, r);
}
diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java
index ea80ac1aecef..80fda19aa10c 100644
--- a/services/core/java/com/android/server/IntentResolver.java
+++ b/services/core/java/com/android/server/IntentResolver.java
@@ -16,32 +16,31 @@
package com.android.server;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
+import android.content.Intent;
+import android.content.IntentFilter;
import android.net.Uri;
-import android.util.FastImmutableArraySet;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.FastImmutableArraySet;
import android.util.Log;
+import android.util.LogPrinter;
import android.util.MutableInt;
import android.util.PrintWriterPrinter;
-import android.util.Slog;
-import android.util.LogPrinter;
import android.util.Printer;
-
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.FastPrintWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
/**
* {@hide}
*/
@@ -788,6 +787,7 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
+ filter.hasCategory(Intent.CATEGORY_DEFAULT));
if (!defaultOnly || filter.hasCategory(Intent.CATEGORY_DEFAULT)) {
final R oneResult = newResult(filter, match, userId);
+ if (debug) Slog.v(TAG, " Created result: " + oneResult);
if (oneResult != null) {
dest.add(oneResult);
if (debug) {
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index a0b2013f42a4..e18fcb0ff296 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -17,9 +17,14 @@
package com.android.server;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.location.LocationManager.FUSED_PROVIDER;
+import static android.location.LocationManager.GPS_PROVIDER;
+import static android.location.LocationManager.NETWORK_PROVIDER;
+import static android.location.LocationManager.PASSIVE_PROVIDER;
import static android.location.LocationProvider.AVAILABLE;
import static android.provider.Settings.Global.LOCATION_DISABLE_STATUS_CALLBACKS;
+import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.Preconditions.checkState;
import android.Manifest;
@@ -29,7 +34,6 @@ import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -42,7 +46,6 @@ import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.hardware.location.ActivityRecognitionHardware;
import android.location.Address;
import android.location.Criteria;
import android.location.GeocoderParams;
@@ -64,7 +67,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
-import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
@@ -81,14 +83,15 @@ import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ProviderRequest;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.Preconditions;
import com.android.server.location.AbstractLocationProvider;
-import com.android.server.location.ActivityRecognitionProxy;
import com.android.server.location.GeocoderProxy;
import com.android.server.location.GeofenceManager;
import com.android.server.location.GeofenceProxy;
@@ -116,7 +119,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
-import java.util.Set;
/**
* The service class that manages LocationProviders and issues location
@@ -137,16 +139,12 @@ public class LocationManagerService extends ILocationManager.Stub {
private static final String ACCESS_LOCATION_EXTRA_COMMANDS =
android.Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS;
- private static final String INSTALL_LOCATION_PROVIDER =
- android.Manifest.permission.INSTALL_LOCATION_PROVIDER;
private static final String NETWORK_LOCATION_SERVICE_ACTION =
"com.android.location.service.v3.NetworkLocationProvider";
private static final String FUSED_LOCATION_SERVICE_ACTION =
"com.android.location.service.FusedLocationProvider";
- private static final int MSG_LOCATION_CHANGED = 1;
-
private static final long NANOS_PER_MILLI = 1000000L;
// The maximum interval a location request can have and still be considered "high power".
@@ -170,15 +168,11 @@ public class LocationManagerService extends ILocationManager.Stub {
private static final LocationRequest DEFAULT_LOCATION_REQUEST = new LocationRequest();
- private final Context mContext;
- private final AppOpsManager mAppOps;
-
- // used internally for synchronization
private final Object mLock = new Object();
+ private final Context mContext;
+ private final Handler mHandler;
- // --- fields below are final after systemRunning() ---
- private LocationFudger mLocationFudger;
- private GeofenceManager mGeofenceManager;
+ private AppOpsManager mAppOps;
private PackageManager mPackageManager;
private String mComboNlpPackageName;
private String mComboNlpReadyMarker;
@@ -186,62 +180,53 @@ public class LocationManagerService extends ILocationManager.Stub {
private PowerManager mPowerManager;
private ActivityManager mActivityManager;
private UserManager mUserManager;
+
+ private GeofenceManager mGeofenceManager;
+ private LocationFudger mLocationFudger;
private GeocoderProxy mGeocodeProvider;
private GnssStatusListenerHelper mGnssStatusProvider;
private INetInitiatedListener mNetInitiatedListener;
- private LocationWorkerHandler mLocationHandler;
private PassiveProvider mPassiveProvider; // track passive provider for special cases
private LocationBlacklist mBlacklist;
private GnssMeasurementsProvider mGnssMeasurementsProvider;
private GnssNavigationMessageProvider mGnssNavigationMessageProvider;
+ @GuardedBy("mLock")
private String mLocationControllerExtraPackage;
private boolean mLocationControllerExtraPackageEnabled;
private IGpsGeofenceHardware mGpsGeofenceProxy;
- // --- fields below are protected by mLock ---
+ // list of currently active providers
+ @GuardedBy("mLock")
+ private final ArrayList<LocationProvider> mProviders = new ArrayList<>();
- // Mock (test) providers
- private final HashMap<String, MockProvider> mMockProviders =
- new HashMap<>();
+ // list of non-mock providers, so that when mock providers replace real providers, they can be
+ // later re-replaced
+ @GuardedBy("mLock")
+ private final ArrayList<LocationProvider> mRealProviders = new ArrayList<>();
- // all receivers
+ @GuardedBy("mLock")
private final HashMap<Object, Receiver> mReceivers = new HashMap<>();
-
- // currently installed providers (with mocks replacing real providers)
- private final ArrayList<LocationProvider> mProviders =
- new ArrayList<>();
-
- // real providers, saved here when mocked out
- private final HashMap<String, LocationProvider> mRealProviders =
- new HashMap<>();
-
- // mapping from provider name to provider
- private final HashMap<String, LocationProvider> mProvidersByName =
- new HashMap<>();
-
- // mapping from provider name to all its UpdateRecords
private final HashMap<String, ArrayList<UpdateRecord>> mRecordsByProvider =
new HashMap<>();
private final LocationRequestStatistics mRequestStatistics = new LocationRequestStatistics();
// mapping from provider name to last known location
+ @GuardedBy("mLock")
private final HashMap<String, Location> mLastLocation = new HashMap<>();
// same as mLastLocation, but is not updated faster than LocationFudger.FASTEST_INTERVAL_MS.
// locations stored here are not fudged for coarse permissions.
+ @GuardedBy("mLock")
private final HashMap<String, Location> mLastLocationCoarseInterval =
new HashMap<>();
- // all providers that operate over proxy, for authorizing incoming location and whitelisting
- // throttling
- private final ArrayList<LocationProviderProxy> mProxyProviders =
- new ArrayList<>();
-
private final ArraySet<String> mBackgroundThrottlePackageWhitelist = new ArraySet<>();
+ @GuardedBy("mLock")
private final ArrayMap<IBinder, Identity> mGnssMeasurementsListeners = new ArrayMap<>();
+ @GuardedBy("mLock")
private final ArrayMap<IBinder, Identity>
mGnssNavigationMessageListeners = new ArrayMap<>();
@@ -249,22 +234,22 @@ public class LocationManagerService extends ILocationManager.Stub {
private int mCurrentUserId = UserHandle.USER_SYSTEM;
private int[] mCurrentUserProfiles = new int[]{UserHandle.USER_SYSTEM};
- // Maximum age of last location returned to clients with foreground-only location permissions.
- private long mLastLocationMaxAgeMs;
-
private GnssLocationProvider.GnssSystemInfoProvider mGnssSystemInfoProvider;
private GnssLocationProvider.GnssMetricsProvider mGnssMetricsProvider;
private GnssBatchingProvider mGnssBatchingProvider;
+ @GuardedBy("mLock")
private IBatchedLocationCallback mGnssBatchingCallback;
+ @GuardedBy("mLock")
private LinkedCallback mGnssBatchingDeathCallback;
+ @GuardedBy("mLock")
private boolean mGnssBatchingInProgress = false;
public LocationManagerService(Context context) {
super();
mContext = context;
- mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ mHandler = BackgroundThread.getHandler();
// Let the package manager query which are the default location
// providers as they get certain permissions granted by default.
@@ -273,135 +258,114 @@ public class LocationManagerService extends ILocationManager.Stub {
packageManagerInternal.setLocationPackagesProvider(
userId -> mContext.getResources().getStringArray(
com.android.internal.R.array.config_locationProviderPackageNames));
-
- if (D) Log.d(TAG, "Constructed");
+ packageManagerInternal.setLocationExtraPackagesProvider(
+ userId -> mContext.getResources().getStringArray(
+ com.android.internal.R.array.config_locationExtraPackageNames));
// most startup is deferred until systemRunning()
}
public void systemRunning() {
synchronized (mLock) {
- if (D) Log.d(TAG, "systemRunning()");
-
- // fetch package manager
- mPackageManager = mContext.getPackageManager();
-
- // fetch power manager
- mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
-
- // fetch activity manager
- mActivityManager
- = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-
- // prepare worker thread
- mLocationHandler = new LocationWorkerHandler(BackgroundThread.get().getLooper());
-
- // prepare mLocationHandler's dependents
- mLocationFudger = new LocationFudger(mContext, mLocationHandler);
- mBlacklist = new LocationBlacklist(mContext, mLocationHandler);
- mBlacklist.init();
- mGeofenceManager = new GeofenceManager(mContext, mBlacklist);
-
- // Monitor for app ops mode changes.
- AppOpsManager.OnOpChangedListener callback
- = new AppOpsManager.OnOpChangedInternalListener() {
- public void onOpChanged(int op, String packageName) {
- mLocationHandler.post(() -> {
- synchronized (mLock) {
- for (Receiver receiver : mReceivers.values()) {
- receiver.updateMonitoring(true);
- }
- applyAllProviderRequirementsLocked();
- }
- });
- }
- };
- mAppOps.startWatchingMode(AppOpsManager.OP_COARSE_LOCATION, null,
- AppOpsManager.WATCH_FOREGROUND_CHANGES, callback);
-
- PackageManager.OnPermissionsChangedListener permissionListener = uid -> {
- synchronized (mLock) {
- applyAllProviderRequirementsLocked();
- }
- };
- mPackageManager.addOnPermissionsChangeListener(permissionListener);
+ initializeLocked();
+ }
+ }
- // listen for background/foreground changes
- ActivityManager.OnUidImportanceListener uidImportanceListener =
- (uid, importance) -> mLocationHandler.post(
- () -> onUidImportanceChanged(uid, importance));
- mActivityManager.addOnUidImportanceListener(uidImportanceListener,
- FOREGROUND_IMPORTANCE_CUTOFF);
+ @GuardedBy("mLock")
+ private void initializeLocked() {
+ mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+ mPackageManager = mContext.getPackageManager();
+ mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- updateUserProfiles(mCurrentUserId);
+ mLocationFudger = new LocationFudger(mContext, mHandler);
+ mBlacklist = new LocationBlacklist(mContext, mHandler);
+ mBlacklist.init();
+ mGeofenceManager = new GeofenceManager(mContext, mBlacklist);
- updateBackgroundThrottlingWhitelistLocked();
- updateLastLocationMaxAgeLocked();
+ // prepare providers
+ initializeProvidersLocked();
- // prepare providers
- loadProvidersLocked();
- updateProvidersSettingsLocked();
- for (LocationProvider provider : mProviders) {
- applyRequirementsLocked(provider.getName());
- }
- }
+ // add listeners
+ mAppOps.startWatchingMode(
+ AppOpsManager.OP_COARSE_LOCATION,
+ null,
+ AppOpsManager.WATCH_FOREGROUND_CHANGES,
+ new AppOpsManager.OnOpChangedInternalListener() {
+ public void onOpChanged(int op, String packageName) {
+ synchronized (mLock) {
+ onAppOpChangedLocked();
+ }
+ }
+ });
+ mPackageManager.addOnPermissionsChangeListener(
+ uid -> {
+ synchronized (mLock) {
+ onPermissionsChangedLocked();
+ }
+ });
- // listen for settings changes
+ mActivityManager.addOnUidImportanceListener(
+ (uid, importance) -> {
+ synchronized (mLock) {
+ onUidImportanceChangedLocked(uid, importance);
+ }
+ },
+ FOREGROUND_IMPORTANCE_CUTOFF);
mContext.getContentResolver().registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.LOCATION_PROVIDERS_ALLOWED), true,
- new ContentObserver(mLocationHandler) {
+ Settings.Secure.getUriFor(Settings.Secure.LOCATION_MODE), true,
+ new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- updateProvidersSettingsLocked();
+ onLocationModeChangedLocked(true);
}
}
}, UserHandle.USER_ALL);
mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS),
- true,
- new ContentObserver(mLocationHandler) {
+ Settings.Secure.getUriFor(Settings.Secure.LOCATION_PROVIDERS_ALLOWED), true,
+ new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- for (LocationProvider provider : mProviders) {
- applyRequirementsLocked(provider.getName());
- }
+ onProviderAllowedChangedLocked(true);
}
}
}, UserHandle.USER_ALL);
mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS),
+ Settings.Global.getUriFor(Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS),
true,
- new ContentObserver(mLocationHandler) {
+ new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- updateLastLocationMaxAgeLocked();
+ onBackgroundThrottleIntervalChangedLocked();
}
}
- }
- );
+ }, UserHandle.USER_ALL);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST),
true,
- new ContentObserver(mLocationHandler) {
+ new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- updateBackgroundThrottlingWhitelistLocked();
- for (LocationProvider provider : mProviders) {
- applyRequirementsLocked(provider.getName());
- }
+ onBackgroundThrottleWhitelistChangedLocked();
}
}
}, UserHandle.USER_ALL);
- mPackageMonitor.register(mContext, mLocationHandler.getLooper(), true);
+ new PackageMonitor() {
+ @Override
+ public void onPackageDisappeared(String packageName, int reason) {
+ synchronized (mLock) {
+ LocationManagerService.this.onPackageDisappearedLocked(packageName);
+ }
+ }
+ }.register(mContext, mHandler.getLooper(), true);
- // listen for user change
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
@@ -410,81 +374,152 @@ public class LocationManagerService extends ILocationManager.Stub {
mContext.registerReceiverAsUser(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_USER_SWITCHED.equals(action)) {
- switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
- } else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
- || Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
- updateUserProfiles(mCurrentUserId);
+ synchronized (mLock) {
+ String action = intent.getAction();
+ if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ onUserChangedLocked(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ } else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
+ || Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
+ onUserProfilesChangedLocked();
+ }
}
}
- }, UserHandle.ALL, intentFilter, null, mLocationHandler);
+ }, UserHandle.ALL, intentFilter, null, mHandler);
+
+ // switching the user from null to system here performs the bulk of the initialization work.
+ // the user being changed will cause a reload of all user specific settings, which causes
+ // provider initialization, and propagates changes until a steady state is reached
+ mCurrentUserId = UserHandle.USER_NULL;
+ onUserChangedLocked(UserHandle.USER_SYSTEM);
+
+ // initialize in-memory settings values
+ onBackgroundThrottleWhitelistChangedLocked();
}
- private void onUidImportanceChanged(int uid, int importance) {
- boolean foreground = isImportanceForeground(importance);
- HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
- synchronized (mLock) {
- for (Entry<String, ArrayList<UpdateRecord>> entry
- : mRecordsByProvider.entrySet()) {
- String provider = entry.getKey();
- for (UpdateRecord record : entry.getValue()) {
- if (record.mReceiver.mIdentity.mUid == uid
- && record.mIsForegroundUid != foreground) {
- if (D) {
- Log.d(TAG, "request from uid " + uid + " is now "
- + (foreground ? "foreground" : "background)"));
- }
- record.updateForeground(foreground);
+ @GuardedBy("mLock")
+ private void onAppOpChangedLocked() {
+ for (Receiver receiver : mReceivers.values()) {
+ receiver.updateMonitoring(true);
+ }
+ for (LocationProvider p : mProviders) {
+ applyRequirementsLocked(p);
+ }
+ }
- if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
- affectedProviders.add(provider);
- }
- }
+ @GuardedBy("mLock")
+ private void onPermissionsChangedLocked() {
+ for (LocationProvider p : mProviders) {
+ applyRequirementsLocked(p);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void onLocationModeChangedLocked(boolean broadcast) {
+ for (LocationProvider p : mProviders) {
+ p.onLocationModeChangedLocked();
+ }
+
+ if (broadcast) {
+ mContext.sendBroadcastAsUser(
+ new Intent(LocationManager.MODE_CHANGED_ACTION),
+ UserHandle.ALL);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void onProviderAllowedChangedLocked(boolean broadcast) {
+ for (LocationProvider p : mProviders) {
+ p.onAllowedChangedLocked();
+ }
+
+ if (broadcast) {
+ mContext.sendBroadcastAsUser(
+ new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
+ UserHandle.ALL);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void onPackageDisappearedLocked(String packageName) {
+ ArrayList<Receiver> deadReceivers = null;
+
+ for (Receiver receiver : mReceivers.values()) {
+ if (receiver.mIdentity.mPackageName.equals(packageName)) {
+ if (deadReceivers == null) {
+ deadReceivers = new ArrayList<>();
}
+ deadReceivers.add(receiver);
}
- for (String provider : affectedProviders) {
- applyRequirementsLocked(provider);
+ }
+
+ // perform removal outside of mReceivers loop
+ if (deadReceivers != null) {
+ for (Receiver receiver : deadReceivers) {
+ removeUpdatesLocked(receiver);
}
+ }
+ }
- for (Entry<IBinder, Identity> entry : mGnssMeasurementsListeners.entrySet()) {
- Identity callerIdentity = entry.getValue();
- if (callerIdentity.mUid == uid) {
+ @GuardedBy("mLock")
+ private void onUidImportanceChangedLocked(int uid, int importance) {
+ boolean foreground = isImportanceForeground(importance);
+ HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
+ for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
+ String provider = entry.getKey();
+ for (UpdateRecord record : entry.getValue()) {
+ if (record.mReceiver.mIdentity.mUid == uid
+ && record.mIsForegroundUid != foreground) {
if (D) {
- Log.d(TAG, "gnss measurements listener from uid " + uid
- + " is now " + (foreground ? "foreground" : "background)"));
+ Log.d(TAG, "request from uid " + uid + " is now "
+ + (foreground ? "foreground" : "background)"));
}
- if (foreground || isThrottlingExemptLocked(entry.getValue())) {
- mGnssMeasurementsProvider.addListener(
- IGnssMeasurementsListener.Stub.asInterface(entry.getKey()),
- callerIdentity.mUid, callerIdentity.mPackageName);
- } else {
- mGnssMeasurementsProvider.removeListener(
- IGnssMeasurementsListener.Stub.asInterface(entry.getKey()));
+ record.updateForeground(foreground);
+
+ if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
+ affectedProviders.add(provider);
}
}
}
+ }
+ for (String provider : affectedProviders) {
+ applyRequirementsLocked(provider);
+ }
- for (Entry<IBinder, Identity> entry : mGnssNavigationMessageListeners.entrySet()) {
- Identity callerIdentity = entry.getValue();
- if (callerIdentity.mUid == uid) {
- if (D) {
- Log.d(TAG, "gnss navigation message listener from uid "
- + uid + " is now "
- + (foreground ? "foreground" : "background)"));
- }
- if (foreground || isThrottlingExemptLocked(entry.getValue())) {
- mGnssNavigationMessageProvider.addListener(
- IGnssNavigationMessageListener.Stub.asInterface(entry.getKey()),
- callerIdentity.mUid, callerIdentity.mPackageName);
- } else {
- mGnssNavigationMessageProvider.removeListener(
- IGnssNavigationMessageListener.Stub.asInterface(entry.getKey()));
- }
+ for (Entry<IBinder, Identity> entry : mGnssMeasurementsListeners.entrySet()) {
+ Identity callerIdentity = entry.getValue();
+ if (callerIdentity.mUid == uid) {
+ if (D) {
+ Log.d(TAG, "gnss measurements listener from uid " + uid
+ + " is now " + (foreground ? "foreground" : "background)"));
+ }
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssMeasurementsProvider.addListener(
+ IGnssMeasurementsListener.Stub.asInterface(entry.getKey()),
+ callerIdentity.mUid, callerIdentity.mPackageName);
+ } else {
+ mGnssMeasurementsProvider.removeListener(
+ IGnssMeasurementsListener.Stub.asInterface(entry.getKey()));
}
}
+ }
- // TODO(b/120449926): The GNSS status listeners should be handled similar to the above.
+ for (Entry<IBinder, Identity> entry : mGnssNavigationMessageListeners.entrySet()) {
+ Identity callerIdentity = entry.getValue();
+ if (callerIdentity.mUid == uid) {
+ if (D) {
+ Log.d(TAG, "gnss navigation message listener from uid "
+ + uid + " is now "
+ + (foreground ? "foreground" : "background)"));
+ }
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssNavigationMessageProvider.addListener(
+ IGnssNavigationMessageListener.Stub.asInterface(entry.getKey()),
+ callerIdentity.mUid, callerIdentity.mPackageName);
+ } else {
+ mGnssNavigationMessageProvider.removeListener(
+ IGnssNavigationMessageListener.Stub.asInterface(entry.getKey()));
+ }
+ }
}
}
@@ -492,30 +527,43 @@ public class LocationManagerService extends ILocationManager.Stub {
return importance <= FOREGROUND_IMPORTANCE_CUTOFF;
}
- /**
- * Makes a list of userids that are related to the current user. This is
- * relevant when using managed profiles. Otherwise the list only contains
- * the current user.
- *
- * @param currentUserId the current user, who might have an alter-ego.
- */
- private void updateUserProfiles(int currentUserId) {
- int[] profileIds = mUserManager.getProfileIdsWithDisabled(currentUserId);
- synchronized (mLock) {
- mCurrentUserProfiles = profileIds;
+ @GuardedBy("mLock")
+ private void onBackgroundThrottleIntervalChangedLocked() {
+ for (LocationProvider provider : mProviders) {
+ applyRequirementsLocked(provider);
}
}
- /**
- * Checks if the specified userId matches any of the current foreground
- * users stored in mCurrentUserProfiles.
- */
- private boolean isCurrentProfile(int userId) {
- synchronized (mLock) {
- return ArrayUtils.contains(mCurrentUserProfiles, userId);
+ @GuardedBy("mLock")
+ private void onBackgroundThrottleWhitelistChangedLocked() {
+ String setting = Settings.Global.getString(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
+ if (setting == null) {
+ setting = "";
}
+
+ mBackgroundThrottlePackageWhitelist.clear();
+ mBackgroundThrottlePackageWhitelist.addAll(
+ SystemConfig.getInstance().getAllowUnthrottledLocation());
+ mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(",")));
+
+ for (LocationProvider p : mProviders) {
+ applyRequirementsLocked(p);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void onUserProfilesChangedLocked() {
+ mCurrentUserProfiles = mUserManager.getProfileIdsWithDisabled(mCurrentUserId);
}
+ @GuardedBy("mLock")
+ private boolean isCurrentProfileLocked(int userId) {
+ return ArrayUtils.contains(mCurrentUserProfiles, userId);
+ }
+
+ @GuardedBy("mLock")
private void ensureFallbackFusedProviderPresentLocked(String[] pkgs) {
PackageManager pm = mContext.getPackageManager();
String systemPackageName = mContext.getPackageName();
@@ -586,30 +634,30 @@ public class LocationManagerService extends ILocationManager.Stub {
+ "partition. The fallback must also be marked coreApp=\"true\" in the manifest");
}
- private void loadProvidersLocked() {
+ @GuardedBy("mLock")
+ private void initializeProvidersLocked() {
// create a passive location provider, which is always enabled
- LocationProvider passiveProviderManager = new LocationProvider(
- LocationManager.PASSIVE_PROVIDER);
- PassiveProvider passiveProvider = new PassiveProvider(passiveProviderManager);
-
+ LocationProvider passiveProviderManager = new LocationProvider(PASSIVE_PROVIDER);
addProviderLocked(passiveProviderManager);
- mPassiveProvider = passiveProvider;
+ mPassiveProvider = new PassiveProvider(passiveProviderManager);
+ passiveProviderManager.attachLocked(mPassiveProvider);
if (GnssLocationProvider.isSupported()) {
// Create a gps location provider
- LocationProvider gnssProviderManager = new LocationProvider(
- LocationManager.GPS_PROVIDER);
+ LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);
+ mRealProviders.add(gnssProviderManager);
+ addProviderLocked(gnssProviderManager);
+
GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,
gnssProviderManager,
- mLocationHandler.getLooper());
+ mHandler.getLooper());
+ gnssProviderManager.attachLocked(gnssProvider);
mGnssSystemInfoProvider = gnssProvider.getGnssSystemInfoProvider();
mGnssBatchingProvider = gnssProvider.getGnssBatchingProvider();
mGnssMetricsProvider = gnssProvider.getGnssMetricsProvider();
mGnssStatusProvider = gnssProvider.getGnssStatusProvider();
mNetInitiatedListener = gnssProvider.getNetInitiatedListener();
- addProviderLocked(gnssProviderManager);
- mRealProviders.put(LocationManager.GPS_PROVIDER, gnssProviderManager);
mGnssMeasurementsProvider = gnssProvider.getGnssMeasurementsProvider();
mGnssNavigationMessageProvider = gnssProvider.getGnssNavigationMessageProvider();
mGpsGeofenceProxy = gnssProvider.getGpsGeofenceProxy();
@@ -637,9 +685,7 @@ public class LocationManagerService extends ILocationManager.Stub {
ensureFallbackFusedProviderPresentLocked(pkgs);
// bind to network provider
-
- LocationProvider networkProviderManager = new LocationProvider(
- LocationManager.NETWORK_PROVIDER);
+ LocationProvider networkProviderManager = new LocationProvider(NETWORK_PROVIDER, true);
LocationProviderProxy networkProvider = LocationProviderProxy.createAndBind(
mContext,
networkProviderManager,
@@ -648,16 +694,15 @@ public class LocationManagerService extends ILocationManager.Stub {
com.android.internal.R.string.config_networkLocationProviderPackageName,
com.android.internal.R.array.config_locationProviderPackageNames);
if (networkProvider != null) {
- mRealProviders.put(LocationManager.NETWORK_PROVIDER, networkProviderManager);
- mProxyProviders.add(networkProvider);
+ mRealProviders.add(networkProviderManager);
addProviderLocked(networkProviderManager);
+ networkProviderManager.attachLocked(networkProvider);
} else {
Slog.w(TAG, "no network location provider found");
}
// bind to fused provider
- LocationProvider fusedProviderManager = new LocationProvider(
- LocationManager.FUSED_PROVIDER);
+ LocationProvider fusedProviderManager = new LocationProvider(FUSED_PROVIDER);
LocationProviderProxy fusedProvider = LocationProviderProxy.createAndBind(
mContext,
fusedProviderManager,
@@ -666,9 +711,9 @@ public class LocationManagerService extends ILocationManager.Stub {
com.android.internal.R.string.config_fusedLocationProviderPackageName,
com.android.internal.R.array.config_locationProviderPackageNames);
if (fusedProvider != null) {
+ mRealProviders.add(fusedProviderManager);
addProviderLocked(fusedProviderManager);
- mProxyProviders.add(fusedProvider);
- mRealProviders.put(LocationManager.FUSED_PROVIDER, fusedProviderManager);
+ fusedProviderManager.attachLocked(fusedProvider);
} else {
Slog.e(TAG, "no fused location provider found",
new IllegalStateException("Location service needs a fused location provider"));
@@ -694,25 +739,6 @@ public class LocationManagerService extends ILocationManager.Stub {
Slog.d(TAG, "Unable to bind FLP Geofence proxy.");
}
- // bind to hardware activity recognition
- boolean activityRecognitionHardwareIsSupported = ActivityRecognitionHardware.isSupported();
- ActivityRecognitionHardware activityRecognitionHardware = null;
- if (activityRecognitionHardwareIsSupported) {
- activityRecognitionHardware = ActivityRecognitionHardware.getInstance(mContext);
- } else {
- Slog.d(TAG, "Hardware Activity-Recognition not supported.");
- }
- ActivityRecognitionProxy proxy = ActivityRecognitionProxy.createAndBind(
- mContext,
- activityRecognitionHardwareIsSupported,
- activityRecognitionHardware,
- com.android.internal.R.bool.config_enableActivityRecognitionHardwareOverlay,
- com.android.internal.R.string.config_activityRecognitionHardwarePackageName,
- com.android.internal.R.array.config_locationProviderPackageNames);
- if (proxy == null) {
- Slog.d(TAG, "Unable to bind ActivityRecognitionProxy.");
- }
-
mComboNlpPackageName = resources.getString(
com.android.internal.R.string.config_comboNetworkLocationProvider);
if (mComboNlpPackageName != null) {
@@ -725,9 +751,6 @@ public class LocationManagerService extends ILocationManager.Stub {
for (String testProviderString : testProviderStrings) {
String fragments[] = testProviderString.split(",");
String name = fragments[0].trim();
- if (mProvidersByName.get(name) != null) {
- throw new IllegalArgumentException("Provider \"" + name + "\" already exists");
- }
ProviderProperties properties = new ProviderProperties(
Boolean.parseBoolean(fragments[1]) /* requiresNetwork */,
Boolean.parseBoolean(fragments[2]) /* requiresSatellite */,
@@ -738,28 +761,37 @@ public class LocationManagerService extends ILocationManager.Stub {
Boolean.parseBoolean(fragments[7]) /* supportsBearing */,
Integer.parseInt(fragments[8]) /* powerRequirement */,
Integer.parseInt(fragments[9]) /* accuracy */);
- addTestProviderLocked(name, properties);
+ LocationProvider testProviderManager = new LocationProvider(name);
+ addProviderLocked(testProviderManager);
+ new MockProvider(testProviderManager, properties);
}
}
- /**
- * Called when the device's active user changes.
- *
- * @param userId the new active user's UserId
- */
- private void switchUser(int userId) {
+ @GuardedBy("mLock")
+ private void onUserChangedLocked(int userId) {
if (mCurrentUserId == userId) {
return;
}
- mBlacklist.switchUser(userId);
- mLocationHandler.removeMessages(MSG_LOCATION_CHANGED);
- synchronized (mLock) {
- mLastLocation.clear();
- mLastLocationCoarseInterval.clear();
- updateUserProfiles(userId);
- updateProvidersSettingsLocked();
- mCurrentUserId = userId;
+
+ // this call has the side effect of forcing a write to the LOCATION_MODE setting in an OS
+ // upgrade case, and ensures that if anyone checks the LOCATION_MODE setting directly, they
+ // will see it in an appropriate state (at least after that user becomes foreground for the
+ // first time...)
+ isLocationEnabledForUser(userId);
+
+ // let providers know the current user is on the way out before changing the user
+ for (LocationProvider p : mProviders) {
+ p.onUserChangingLocked();
}
+
+ mCurrentUserId = userId;
+ onUserProfilesChangedLocked();
+
+ mBlacklist.switchUser(userId);
+
+ // if the user changes, per-user settings may also have changed
+ onLocationModeChangedLocked(false);
+ onProviderAllowedChangedLocked(false);
}
private static final class Identity {
@@ -777,158 +809,381 @@ public class LocationManagerService extends ILocationManager.Stub {
private class LocationProvider implements AbstractLocationProvider.LocationProviderManager {
private final String mName;
- private AbstractLocationProvider mProvider;
- // whether the provider is enabled in location settings
- private boolean mSettingsEnabled;
+ // whether this provider should respect LOCATION_PROVIDERS_ALLOWED (ie gps and network)
+ private final boolean mIsManagedBySettings;
- // whether the provider considers itself enabled
- private volatile boolean mEnabled;
+ // remember to clear binder identity before invoking any provider operation
+ @GuardedBy("mLock")
+ @Nullable protected AbstractLocationProvider mProvider;
- @Nullable
- private volatile ProviderProperties mProperties;
+ @GuardedBy("mLock")
+ private boolean mUseable; // combined state
+ @GuardedBy("mLock")
+ private boolean mAllowed; // state of LOCATION_PROVIDERS_ALLOWED
+ @GuardedBy("mLock")
+ private boolean mEnabled; // state of provider
+
+ @GuardedBy("mLock")
+ @Nullable private ProviderProperties mProperties;
private LocationProvider(String name) {
+ this(name, false);
+ }
+
+ private LocationProvider(String name, boolean isManagedBySettings) {
mName = name;
- // TODO: initialize settings enabled?
+ mIsManagedBySettings = isManagedBySettings;
+
+ mProvider = null;
+ mUseable = false;
+ mAllowed = !mIsManagedBySettings;
+ mEnabled = false;
+ mProperties = null;
}
- @Override
- public void onAttachProvider(AbstractLocationProvider provider, boolean initiallyEnabled) {
+ @GuardedBy("mLock")
+ public void attachLocked(AbstractLocationProvider provider) {
+ checkNotNull(provider);
checkState(mProvider == null);
-
- // the provider is not yet fully constructed at this point, so we may not do anything
- // except save a reference for later use here. do not call any provider methods.
mProvider = provider;
- mEnabled = initiallyEnabled;
- mProperties = null;
+
+ onUseableChangedLocked();
}
public String getName() {
return mName;
}
- public boolean isEnabled() {
- return mSettingsEnabled && mEnabled;
+ @GuardedBy("mLock")
+ @Nullable
+ public String getPackageLocked() {
+ if (mProvider == null) {
+ return null;
+ } else if (mProvider instanceof LocationProviderProxy) {
+ // safe to not clear binder context since this doesn't call into the actual provider
+ return ((LocationProviderProxy) mProvider).getConnectedPackageName();
+ } else {
+ return mContext.getPackageName();
+ }
}
+ public boolean isMock() {
+ return false;
+ }
+
+ @GuardedBy("mLock")
+ public boolean isPassiveLocked() {
+ return mProvider == mPassiveProvider;
+ }
+
+ @GuardedBy("mLock")
@Nullable
- public ProviderProperties getProperties() {
+ public ProviderProperties getPropertiesLocked() {
return mProperties;
}
- public void setRequest(ProviderRequest request, WorkSource workSource) {
- mProvider.setRequest(request, workSource);
+ @GuardedBy("mLock")
+ public void setRequestLocked(ProviderRequest request, WorkSource workSource) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mProvider.setRequest(request, workSource);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ @GuardedBy("mLock")
+ public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(mName + " provider:");
- pw.println(" setting=" + mSettingsEnabled);
+ if (isMock()) {
+ pw.println(" mock=true");
+ }
+ pw.println(" attached=" + (mProvider != null));
+ if (mIsManagedBySettings) {
+ pw.println(" allowed=" + mAllowed);
+ }
pw.println(" enabled=" + mEnabled);
+ pw.println(" useable=" + mUseable);
pw.println(" properties=" + mProperties);
- mProvider.dump(fd, pw, args);
+
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mProvider.dump(fd, pw, args);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
- public long getStatusUpdateTime() {
- return mProvider.getStatusUpdateTime();
+ @GuardedBy("mLock")
+ public long getStatusUpdateTimeLocked() {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ return mProvider.getStatusUpdateTime();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ } else {
+ return 0;
+ }
}
- public int getStatus(Bundle extras) {
- return mProvider.getStatus(extras);
+ @GuardedBy("mLock")
+ public int getStatusLocked(Bundle extras) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ return mProvider.getStatus(extras);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ } else {
+ return AVAILABLE;
+ }
}
- public void sendExtraCommand(String command, Bundle extras) {
- mProvider.sendExtraCommand(command, extras);
+ @GuardedBy("mLock")
+ public void sendExtraCommandLocked(String command, Bundle extras) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mProvider.sendExtraCommand(command, extras);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
// called from any thread
@Override
public void onReportLocation(Location location) {
- runOnHandler(() -> LocationManagerService.this.reportLocation(location,
- mProvider == mPassiveProvider));
+ // no security check necessary because this is coming from an internal-only interface
+ // move calls coming from below LMS onto a different thread to avoid deadlock
+ runInternal(() -> {
+ synchronized (mLock) {
+ handleLocationChangedLocked(location, this);
+ }
+ });
}
// called from any thread
@Override
public void onReportLocation(List<Location> locations) {
- runOnHandler(() -> LocationManagerService.this.reportLocationBatch(locations));
+ // move calls coming from below LMS onto a different thread to avoid deadlock
+ runInternal(() -> {
+ synchronized (mLock) {
+ LocationProvider gpsProvider = getLocationProviderLocked(GPS_PROVIDER);
+ if (gpsProvider == null || !gpsProvider.isUseableLocked()) {
+ Slog.w(TAG, "reportLocationBatch() called without user permission");
+ return;
+ }
+
+ if (mGnssBatchingCallback == null) {
+ Slog.e(TAG, "reportLocationBatch() called without active Callback");
+ return;
+ }
+
+ try {
+ mGnssBatchingCallback.onLocationBatch(locations);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "mGnssBatchingCallback.onLocationBatch failed", e);
+ }
+ }
+ });
}
// called from any thread
@Override
public void onSetEnabled(boolean enabled) {
- runOnHandler(() -> {
- if (enabled == mEnabled) {
- return;
- }
-
- mEnabled = enabled;
-
- if (!mSettingsEnabled) {
- // this provider was disabled in settings anyways, so a change to it's own
- // enabled status won't have any affect.
- return;
- }
-
- // traditionally clients can listen for changes to the LOCATION_PROVIDERS_ALLOWED
- // setting to detect when providers are enabled or disabled (even though they aren't
- // supposed to). to continue to support this we must force a change to this setting.
- // we use the fused provider because this is forced to be always enabled in settings
- // anyways, and so won't have any visible effect beyond triggering content observers
- Settings.Secure.putStringForUser(mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- "+" + LocationManager.FUSED_PROVIDER, mCurrentUserId);
- Settings.Secure.putStringForUser(mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- "-" + LocationManager.FUSED_PROVIDER, mCurrentUserId);
-
+ // move calls coming from below LMS onto a different thread to avoid deadlock
+ runInternal(() -> {
synchronized (mLock) {
- if (!enabled) {
- // If any provider has been disabled, clear all last locations for all
- // providers. This is to be on the safe side in case a provider has location
- // derived from this disabled provider.
- mLastLocation.clear();
- mLastLocationCoarseInterval.clear();
+ if (enabled == mEnabled) {
+ return;
}
- updateProviderListenersLocked(mName);
- }
+ mEnabled = enabled;
+
+ // update provider allowed settings to reflect enabled status
+ if (mIsManagedBySettings) {
+ if (mEnabled && !mAllowed) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "+" + mName,
+ mCurrentUserId);
+ } else if (!mEnabled && mAllowed) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "-" + mName,
+ mCurrentUserId);
+ }
+ }
- mContext.sendBroadcastAsUser(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
- UserHandle.ALL);
+ onUseableChangedLocked();
+ }
});
}
@Override
public void onSetProperties(ProviderProperties properties) {
- runOnHandler(() -> mProperties = properties);
+ // because this does not invoke any other methods which might result in calling back
+ // into the location provider, it is safe to run this on the calling thread. it is also
+ // currently necessary to run this on the calling thread to ensure that property changes
+ // are publicly visibly immediately, ie for mock providers which are created.
+ synchronized (mLock) {
+ mProperties = properties;
+ }
}
- private void setSettingsEnabled(boolean enabled) {
- synchronized (mLock) {
- if (mSettingsEnabled == enabled) {
+ @GuardedBy("mLock")
+ public void onLocationModeChangedLocked() {
+ onUseableChangedLocked();
+ }
+
+ private boolean isAllowed() {
+ return isAllowedForUser(mCurrentUserId);
+ }
+
+ private boolean isAllowedForUser(int userId) {
+ String allowedProviders = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ userId);
+ return TextUtils.delimitedStringContains(allowedProviders, ',', mName);
+ }
+
+ @GuardedBy("mLock")
+ public void onAllowedChangedLocked() {
+ if (mIsManagedBySettings) {
+ boolean allowed = isAllowed();
+ if (allowed == mAllowed) {
return;
}
+ mAllowed = allowed;
- mSettingsEnabled = enabled;
- if (!mSettingsEnabled) {
- // if any provider has been disabled, clear all last locations for all
- // providers. this is to be on the safe side in case a provider has location
- // derived from this disabled provider.
- mLastLocation.clear();
- mLastLocationCoarseInterval.clear();
- updateProviderListenersLocked(mName);
- } else if (mEnabled) {
- updateProviderListenersLocked(mName);
+ // make a best effort to keep the setting matching the real enabled state of the
+ // provider so that legacy applications aren't broken.
+ if (mAllowed && !mEnabled) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "-" + mName,
+ mCurrentUserId);
}
+
+ onUseableChangedLocked();
+ }
+ }
+
+ @GuardedBy("mLock")
+ public boolean isUseableLocked() {
+ return isUseableForUserLocked(mCurrentUserId);
+ }
+
+ @GuardedBy("mLock")
+ public boolean isUseableForUserLocked(int userId) {
+ return userId == mCurrentUserId && mUseable;
+ }
+
+ @GuardedBy("mLock")
+ public void onUseableChangedLocked() {
+ // if any property that contributes to "useability" here changes state, it MUST result
+ // in a direct or indrect call to onUseableChangedLocked. this allows the provider to
+ // guarantee that it will always eventually reach the correct state.
+ boolean useable = mProvider != null
+ && mProviders.contains(this) && isLocationEnabled() && mAllowed && mEnabled;
+ if (useable == mUseable) {
+ return;
+ }
+ mUseable = useable;
+
+ if (!mUseable) {
+ // If any provider has been disabled, clear all last locations for all
+ // providers. This is to be on the safe side in case a provider has location
+ // derived from this disabled provider.
+ mLastLocation.clear();
+ mLastLocationCoarseInterval.clear();
}
+
+ updateProviderUseableLocked(this);
+ }
+
+ @GuardedBy("mLock")
+ public void onUserChangingLocked() {
+ // when the user is about to change, we set this provider to un-useable, and notify all
+ // of the current user clients. when the user is finished changing, useability will be
+ // updated back via onLocationModeChanged() and onAllowedChanged().
+ mUseable = false;
+ updateProviderUseableLocked(this);
}
- private void runOnHandler(Runnable runnable) {
- if (Looper.myLooper() == mLocationHandler.getLooper()) {
+ // binder transactions coming from below LMS (ie location providers) need to be moved onto
+ // a different thread to avoid potential deadlock as code reenters the location providers
+ private void runInternal(Runnable runnable) {
+ if (Looper.myLooper() == mHandler.getLooper()) {
runnable.run();
} else {
- mLocationHandler.post(runnable);
+ mHandler.post(runnable);
+ }
+ }
+ }
+
+ private class MockLocationProvider extends LocationProvider {
+
+ private MockLocationProvider(String name) {
+ super(name);
+ }
+
+ @Override
+ public void attachLocked(AbstractLocationProvider provider) {
+ checkState(provider instanceof MockProvider);
+ super.attachLocked(provider);
+ }
+
+ public boolean isMock() {
+ return true;
+ }
+
+ @GuardedBy("mLock")
+ public void setEnabledLocked(boolean enabled) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ ((MockProvider) mProvider).setEnabled(enabled);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ public void setLocationLocked(Location location) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ ((MockProvider) mProvider).setLocation(location);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ public void setStatusLocked(int status, Bundle extras, long updateTime) {
+ if (mProvider != null) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ ((MockProvider) mProvider).setStatus(status, extras, updateTime);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
}
@@ -1032,19 +1287,18 @@ public class LocationManagerService extends ILocationManager.Stub {
// See if receiver has any enabled update records. Also note if any update records
// are high power (has a high power provider with an interval under a threshold).
for (UpdateRecord updateRecord : mUpdateRecords.values()) {
- if (isAllowedByUserSettingsLockedForUser(updateRecord.mProvider,
- mCurrentUserId)) {
- requestingLocation = true;
- LocationManagerService.LocationProvider locationProvider
- = mProvidersByName.get(updateRecord.mProvider);
- ProviderProperties properties = locationProvider != null
- ? locationProvider.getProperties() : null;
- if (properties != null
- && properties.mPowerRequirement == Criteria.POWER_HIGH
- && updateRecord.mRequest.getInterval() < HIGH_POWER_INTERVAL_MS) {
- requestingHighPowerLocation = true;
- break;
- }
+ LocationProvider provider = getLocationProviderLocked(updateRecord.mProvider);
+ if (provider == null || !provider.isUseableLocked()) {
+ continue;
+ }
+
+ requestingLocation = true;
+ ProviderProperties properties = provider.getPropertiesLocked();
+ if (properties != null
+ && properties.mPowerRequirement == Criteria.POWER_HIGH
+ && updateRecord.mRequest.getInterval() < HIGH_POWER_INTERVAL_MS) {
+ requestingHighPowerLocation = true;
+ break;
}
}
}
@@ -1132,7 +1386,7 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (this) {
// synchronize to ensure incrementPendingBroadcastsLocked()
// is called before decrementPendingBroadcasts()
- mPendingIntent.send(mContext, 0, statusChanged, this, mLocationHandler,
+ mPendingIntent.send(mContext, 0, statusChanged, this, mHandler,
getResolutionPermission(mAllowedResolutionLevel),
PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
// call this after broadcasting so we do not increment
@@ -1168,7 +1422,7 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (this) {
// synchronize to ensure incrementPendingBroadcastsLocked()
// is called before decrementPendingBroadcasts()
- mPendingIntent.send(mContext, 0, locationChanged, this, mLocationHandler,
+ mPendingIntent.send(mContext, 0, locationChanged, this, mHandler,
getResolutionPermission(mAllowedResolutionLevel),
PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
// call this after broadcasting so we do not increment
@@ -1211,7 +1465,7 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (this) {
// synchronize to ensure incrementPendingBroadcastsLocked()
// is called before decrementPendingBroadcasts()
- mPendingIntent.send(mContext, 0, providerIntent, this, mLocationHandler,
+ mPendingIntent.send(mContext, 0, providerIntent, this, mHandler,
getResolutionPermission(mAllowedResolutionLevel),
PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
// call this after broadcasting so we do not increment
@@ -1283,16 +1537,16 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (receiver) {
// so wakelock calls will succeed
long identity = Binder.clearCallingIdentity();
- receiver.decrementPendingBroadcastsLocked();
- Binder.restoreCallingIdentity(identity);
+ try {
+ receiver.decrementPendingBroadcastsLocked();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
}
}
- /**
- * Returns the year of the GNSS hardware.
- */
@Override
public int getGnssYearOfHardware() {
if (mGnssSystemInfoProvider != null) {
@@ -1302,10 +1556,6 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
-
- /**
- * Returns the model name of the GNSS hardware.
- */
@Override
@Nullable
public String getGnssHardwareModelName() {
@@ -1316,32 +1566,24 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Runs some checks for GNSS (FINE) level permissions, used by several methods which directly
- * (try to) access GNSS information at this layer.
- */
private boolean hasGnssPermissions(String packageName) {
- int allowedResolutionLevel = getCallerAllowedResolutionLevel();
- checkResolutionLevelIsSufficientForProviderUse(
- allowedResolutionLevel,
- LocationManager.GPS_PROVIDER);
+ synchronized (mLock) {
+ int allowedResolutionLevel = getCallerAllowedResolutionLevel();
+ checkResolutionLevelIsSufficientForProviderUseLocked(
+ allowedResolutionLevel,
+ GPS_PROVIDER);
- int pid = Binder.getCallingPid();
- int uid = Binder.getCallingUid();
- long identity = Binder.clearCallingIdentity();
- boolean hasLocationAccess;
- try {
- hasLocationAccess = checkLocationAccess(pid, uid, packageName, allowedResolutionLevel);
- } finally {
- Binder.restoreCallingIdentity(identity);
+ int pid = Binder.getCallingPid();
+ int uid = Binder.getCallingUid();
+ long identity = Binder.clearCallingIdentity();
+ try {
+ return checkLocationAccess(pid, uid, packageName, allowedResolutionLevel);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
-
- return hasLocationAccess;
}
- /**
- * Returns the GNSS batching size, if available.
- */
@Override
public int getGnssBatchSize(String packageName) {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
@@ -1354,10 +1596,6 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Adds a callback for GNSS Batching events, if permissions allow, which are transported
- * to potentially multiple listeners by the BatchedLocationCallbackTransport above this.
- */
@Override
public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName) {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
@@ -1367,18 +1605,20 @@ public class LocationManagerService extends ILocationManager.Stub {
return false;
}
- mGnssBatchingCallback = callback;
- mGnssBatchingDeathCallback = new LinkedCallback(callback);
- try {
- callback.asBinder().linkToDeath(mGnssBatchingDeathCallback, 0 /* flags */);
- } catch (RemoteException e) {
- // if the remote process registering the listener is already dead, just swallow the
- // exception and return
- Log.e(TAG, "Remote listener already died.", e);
- return false;
- }
+ synchronized (mLock) {
+ mGnssBatchingCallback = callback;
+ mGnssBatchingDeathCallback = new LinkedCallback(callback);
+ try {
+ callback.asBinder().linkToDeath(mGnssBatchingDeathCallback, 0 /* flags */);
+ } catch (RemoteException e) {
+ // if the remote process registering the listener is already dead, just swallow the
+ // exception and return
+ Log.e(TAG, "Remote listener already died.", e);
+ return false;
+ }
- return true;
+ return true;
+ }
}
private class LinkedCallback implements IBinder.DeathRecipient {
@@ -1401,27 +1641,22 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Removes callback for GNSS batching
- */
@Override
public void removeGnssBatchingCallback() {
- try {
- mGnssBatchingCallback.asBinder().unlinkToDeath(mGnssBatchingDeathCallback,
- 0 /* flags */);
- } catch (NoSuchElementException e) {
- // if the death callback isn't connected (it should be...), log error, swallow the
- // exception and return
- Log.e(TAG, "Couldn't unlink death callback.", e);
+ synchronized (mLock) {
+ try {
+ mGnssBatchingCallback.asBinder().unlinkToDeath(mGnssBatchingDeathCallback,
+ 0 /* flags */);
+ } catch (NoSuchElementException e) {
+ // if the death callback isn't connected (it should be...), log error, swallow the
+ // exception and return
+ Log.e(TAG, "Couldn't unlink death callback.", e);
+ }
+ mGnssBatchingCallback = null;
+ mGnssBatchingDeathCallback = null;
}
- mGnssBatchingCallback = null;
- mGnssBatchingDeathCallback = null;
}
-
- /**
- * Starts GNSS batching, if available.
- */
@Override
public boolean startGnssBatch(long periodNanos, boolean wakeOnFifoFull, String packageName) {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
@@ -1431,20 +1666,20 @@ public class LocationManagerService extends ILocationManager.Stub {
return false;
}
- if (mGnssBatchingInProgress) {
- // Current design does not expect multiple starts to be called repeatedly
- Log.e(TAG, "startGnssBatch unexpectedly called w/o stopping prior batch");
- // Try to clean up anyway, and continue
- stopGnssBatch();
- }
+ synchronized (mLock) {
+ if (mGnssBatchingInProgress) {
+ // Current design does not expect multiple starts to be called repeatedly
+ Log.e(TAG, "startGnssBatch unexpectedly called w/o stopping prior batch");
+ // Try to clean up anyway, and continue
+ stopGnssBatch();
+ }
- mGnssBatchingInProgress = true;
- return mGnssBatchingProvider.start(periodNanos, wakeOnFifoFull);
+ mGnssBatchingInProgress = true;
+ return mGnssBatchingProvider.start(periodNanos, wakeOnFifoFull);
+ }
}
- /**
- * Flushes a GNSS batch in progress
- */
+
@Override
public void flushGnssBatch(String packageName) {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
@@ -1455,117 +1690,66 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
- if (!mGnssBatchingInProgress) {
- Log.w(TAG, "flushGnssBatch called with no batch in progress");
- }
+ synchronized (mLock) {
+ if (!mGnssBatchingInProgress) {
+ Log.w(TAG, "flushGnssBatch called with no batch in progress");
+ }
- if (mGnssBatchingProvider != null) {
- mGnssBatchingProvider.flush();
+ if (mGnssBatchingProvider != null) {
+ mGnssBatchingProvider.flush();
+ }
}
}
- /**
- * Stops GNSS batching
- */
@Override
public boolean stopGnssBatch() {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
"Location Hardware permission not granted to access hardware batching");
- if (mGnssBatchingProvider != null) {
- mGnssBatchingInProgress = false;
- return mGnssBatchingProvider.stop();
- } else {
- return false;
- }
- }
-
- @Override
- public void reportLocationBatch(List<Location> locations) {
- checkCallerIsProvider();
-
- // Currently used only for GNSS locations - update permissions check if changed
- if (isAllowedByUserSettingsLockedForUser(LocationManager.GPS_PROVIDER, mCurrentUserId)) {
- if (mGnssBatchingCallback == null) {
- Slog.e(TAG, "reportLocationBatch() called without active Callback");
- return;
- }
- try {
- mGnssBatchingCallback.onLocationBatch(locations);
- } catch (RemoteException e) {
- Slog.e(TAG, "mGnssBatchingCallback.onLocationBatch failed", e);
+ synchronized (mLock) {
+ if (mGnssBatchingProvider != null) {
+ mGnssBatchingInProgress = false;
+ return mGnssBatchingProvider.stop();
+ } else {
+ return false;
}
- } else {
- Slog.w(TAG, "reportLocationBatch() called without user permission, locations blocked");
}
}
+ @GuardedBy("mLock")
private void addProviderLocked(LocationProvider provider) {
+ Preconditions.checkState(getLocationProviderLocked(provider.getName()) == null);
+
mProviders.add(provider);
- mProvidersByName.put(provider.getName(), provider);
- }
- private void removeProviderLocked(LocationProvider provider) {
- mProviders.remove(provider);
- mProvidersByName.remove(provider.getName());
+ provider.onAllowedChangedLocked(); // allowed state may change while provider was inactive
+ provider.onUseableChangedLocked();
}
- /**
- * Returns "true" if access to the specified location provider is allowed by the specified
- * user's settings. Access to all location providers is forbidden to non-location-provider
- * processes belonging to background users.
- *
- * @param provider the name of the location provider
- * @param userId the user id to query
- */
- private boolean isAllowedByUserSettingsLockedForUser(String provider, int userId) {
- if (LocationManager.PASSIVE_PROVIDER.equals(provider)) {
- return isLocationEnabledForUser(userId);
- }
- if (LocationManager.FUSED_PROVIDER.equals(provider)) {
- return isLocationEnabledForUser(userId);
- }
- synchronized (mLock) {
- if (mMockProviders.containsKey(provider)) {
- return isLocationEnabledForUser(userId);
+ @GuardedBy("mLock")
+ private void removeProviderLocked(LocationProvider provider) {
+ if (mProviders.remove(provider)) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ provider.onUseableChangedLocked();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
-
- long identity = Binder.clearCallingIdentity();
- try {
- // Use system settings
- ContentResolver cr = mContext.getContentResolver();
- String allowedProviders = Settings.Secure.getStringForUser(
- cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, userId);
- return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
}
-
- /**
- * Returns "true" if access to the specified location provider is allowed by the specified
- * user's settings. Access to all location providers is forbidden to non-location-provider
- * processes belonging to background users.
- *
- * @param provider the name of the location provider
- * @param uid the requestor's UID
- * @param userId the user id to query
- */
- private boolean isAllowedByUserSettingsLocked(String provider, int uid, int userId) {
- if (!isCurrentProfile(UserHandle.getUserId(uid)) && !isUidALocationProvider(uid)) {
- return false;
+ @GuardedBy("mLock")
+ @Nullable
+ private LocationProvider getLocationProviderLocked(String providerName) {
+ for (LocationProvider provider : mProviders) {
+ if (providerName.equals(provider.getName())) {
+ return provider;
+ }
}
- return isAllowedByUserSettingsLockedForUser(provider, userId);
+
+ return null;
}
- /**
- * Returns the permission string associated with the specified resolution level.
- *
- * @param resolutionLevel the resolution level
- * @return the permission string
- */
private String getResolutionPermission(int resolutionLevel) {
switch (resolutionLevel) {
case RESOLUTION_LEVEL_FINE:
@@ -1577,13 +1761,6 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Returns the resolution level allowed to the given PID/UID pair.
- *
- * @param pid the PID
- * @param uid the UID
- * @return resolution level allowed to the pid/uid pair
- */
private int getAllowedResolutionLevel(int pid, int uid) {
if (mContext.checkPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,
pid, uid) == PERMISSION_GRANTED) {
@@ -1596,39 +1773,22 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Returns the resolution level allowed to the caller
- *
- * @return resolution level allowed to caller
- */
private int getCallerAllowedResolutionLevel() {
return getAllowedResolutionLevel(Binder.getCallingPid(), Binder.getCallingUid());
}
- /**
- * Throw SecurityException if specified resolution level is insufficient to use geofences.
- *
- * @param allowedResolutionLevel resolution level allowed to caller
- */
private void checkResolutionLevelIsSufficientForGeofenceUse(int allowedResolutionLevel) {
if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
throw new SecurityException("Geofence usage requires ACCESS_FINE_LOCATION permission");
}
}
- /**
- * Return the minimum resolution level required to use the specified location provider.
- *
- * @param provider the name of the location provider
- * @return minimum resolution level required for provider
- */
- private int getMinimumResolutionLevelForProviderUse(String provider) {
- if (LocationManager.GPS_PROVIDER.equals(provider) ||
- LocationManager.PASSIVE_PROVIDER.equals(provider)) {
+ @GuardedBy("mLock")
+ private int getMinimumResolutionLevelForProviderUseLocked(String provider) {
+ if (GPS_PROVIDER.equals(provider) || PASSIVE_PROVIDER.equals(provider)) {
// gps and passive providers require FINE permission
return RESOLUTION_LEVEL_FINE;
- } else if (LocationManager.NETWORK_PROVIDER.equals(provider) ||
- LocationManager.FUSED_PROVIDER.equals(provider)) {
+ } else if (NETWORK_PROVIDER.equals(provider) || FUSED_PROVIDER.equals(provider)) {
// network and fused providers are ok with COARSE or FINE
return RESOLUTION_LEVEL_COARSE;
} else {
@@ -1637,7 +1797,7 @@ public class LocationManagerService extends ILocationManager.Stub {
continue;
}
- ProviderProperties properties = lp.getProperties();
+ ProviderProperties properties = lp.getPropertiesLocked();
if (properties != null) {
if (properties.mRequiresSatellite) {
// provider requiring satellites require FINE permission
@@ -1653,16 +1813,10 @@ public class LocationManagerService extends ILocationManager.Stub {
return RESOLUTION_LEVEL_FINE; // if in doubt, require FINE
}
- /**
- * Throw SecurityException if specified resolution level is insufficient to use the named
- * location provider.
- *
- * @param allowedResolutionLevel resolution level allowed to caller
- * @param providerName the name of the location provider
- */
- private void checkResolutionLevelIsSufficientForProviderUse(int allowedResolutionLevel,
+ @GuardedBy("mLock")
+ private void checkResolutionLevelIsSufficientForProviderUseLocked(int allowedResolutionLevel,
String providerName) {
- int requiredResolutionLevel = getMinimumResolutionLevelForProviderUse(providerName);
+ int requiredResolutionLevel = getMinimumResolutionLevelForProviderUseLocked(providerName);
if (allowedResolutionLevel < requiredResolutionLevel) {
switch (requiredResolutionLevel) {
case RESOLUTION_LEVEL_FINE:
@@ -1678,20 +1832,6 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Throw SecurityException if WorkSource use is not allowed (i.e. can't blame other packages
- * for battery).
- */
- private void checkDeviceStatsAllowed() {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.UPDATE_DEVICE_STATS, null);
- }
-
- private void checkUpdateAppOpsAllowed() {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.UPDATE_APP_OPS_STATS, null);
- }
-
public static int resolutionLevelToOp(int allowedResolutionLevel) {
if (allowedResolutionLevel != RESOLUTION_LEVEL_NONE) {
if (allowedResolutionLevel == RESOLUTION_LEVEL_COARSE) {
@@ -1749,19 +1889,17 @@ public class LocationManagerService extends ILocationManager.Stub {
*/
@Override
public List<String> getAllProviders() {
- ArrayList<String> out;
synchronized (mLock) {
- out = new ArrayList<>(mProviders.size());
+ ArrayList<String> providers = new ArrayList<>(mProviders.size());
for (LocationProvider provider : mProviders) {
String name = provider.getName();
- if (LocationManager.FUSED_PROVIDER.equals(name)) {
+ if (FUSED_PROVIDER.equals(name)) {
continue;
}
- out.add(name);
+ providers.add(name);
}
+ return providers;
}
- if (D) Log.d(TAG, "getAllProviders()=" + out);
- return out;
}
/**
@@ -1772,37 +1910,28 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
- ArrayList<String> out;
- int uid = Binder.getCallingUid();
- long identity = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- out = new ArrayList<>(mProviders.size());
- for (LocationProvider provider : mProviders) {
- String name = provider.getName();
- if (LocationManager.FUSED_PROVIDER.equals(name)) {
- continue;
- }
- if (allowedResolutionLevel >= getMinimumResolutionLevelForProviderUse(name)) {
- if (enabledOnly
- && !isAllowedByUserSettingsLocked(name, uid, mCurrentUserId)) {
- continue;
- }
- if (criteria != null
- && !android.location.LocationProvider.propertiesMeetCriteria(
- name, provider.getProperties(), criteria)) {
- continue;
- }
- out.add(name);
- }
+ synchronized (mLock) {
+ ArrayList<String> providers = new ArrayList<>(mProviders.size());
+ for (LocationProvider provider : mProviders) {
+ String name = provider.getName();
+ if (FUSED_PROVIDER.equals(name)) {
+ continue;
+ }
+ if (allowedResolutionLevel < getMinimumResolutionLevelForProviderUseLocked(name)) {
+ continue;
+ }
+ if (enabledOnly && !provider.isUseableLocked()) {
+ continue;
+ }
+ if (criteria != null
+ && !android.location.LocationProvider.propertiesMeetCriteria(
+ name, provider.getPropertiesLocked(), criteria)) {
+ continue;
}
+ providers.add(name);
}
- } finally {
- Binder.restoreCallingIdentity(identity);
+ return providers;
}
-
- if (D) Log.d(TAG, "getProviders()=" + out);
- return out;
}
/**
@@ -1814,71 +1943,36 @@ public class LocationManagerService extends ILocationManager.Stub {
*/
@Override
public String getBestProvider(Criteria criteria, boolean enabledOnly) {
- String result;
-
List<String> providers = getProviders(criteria, enabledOnly);
- if (!providers.isEmpty()) {
- result = pickBest(providers);
- if (D) Log.d(TAG, "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result);
- return result;
+ if (providers.isEmpty()) {
+ providers = getProviders(null, enabledOnly);
}
- providers = getProviders(null, enabledOnly);
+
if (!providers.isEmpty()) {
- result = pickBest(providers);
- if (D) Log.d(TAG, "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result);
- return result;
+ if (providers.contains(GPS_PROVIDER)) {
+ return GPS_PROVIDER;
+ } else if (providers.contains(NETWORK_PROVIDER)) {
+ return NETWORK_PROVIDER;
+ } else {
+ return providers.get(0);
+ }
}
- if (D) Log.d(TAG, "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + null);
return null;
}
- private String pickBest(List<String> providers) {
- if (providers.contains(LocationManager.GPS_PROVIDER)) {
- return LocationManager.GPS_PROVIDER;
- } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
- return LocationManager.NETWORK_PROVIDER;
- } else {
- return providers.get(0);
- }
- }
-
- @Override
- public boolean providerMeetsCriteria(String provider, Criteria criteria) {
- LocationProvider p = mProvidersByName.get(provider);
- if (p == null) {
- throw new IllegalArgumentException("provider=" + provider);
- }
-
- boolean result = android.location.LocationProvider.propertiesMeetCriteria(
- p.getName(), p.getProperties(), criteria);
- if (D) Log.d(TAG, "providerMeetsCriteria(" + provider + ", " + criteria + ")=" + result);
- return result;
- }
-
- private void updateProvidersSettingsLocked() {
- for (LocationProvider p : mProviders) {
- p.setSettingsEnabled(isAllowedByUserSettingsLockedForUser(p.getName(), mCurrentUserId));
- }
-
- mContext.sendBroadcastAsUser(new Intent(LocationManager.MODE_CHANGED_ACTION),
- UserHandle.ALL);
- }
-
- private void updateProviderListenersLocked(String provider) {
- LocationProvider p = mProvidersByName.get(provider);
- if (p == null) return;
-
- boolean enabled = p.isEnabled();
+ @GuardedBy("mLock")
+ private void updateProviderUseableLocked(LocationProvider provider) {
+ boolean useable = provider.isUseableLocked();
ArrayList<Receiver> deadReceivers = null;
- ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
+ ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider.getName());
if (records != null) {
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
+ if (isCurrentProfileLocked(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
// Sends a notification message to the receiver
- if (!record.mReceiver.callProviderEnabledLocked(provider, enabled)) {
+ if (!record.mReceiver.callProviderEnabledLocked(provider.getName(), useable)) {
if (deadReceivers == null) {
deadReceivers = new ArrayList<>();
}
@@ -1897,25 +1991,37 @@ public class LocationManagerService extends ILocationManager.Stub {
applyRequirementsLocked(provider);
}
- private void applyRequirementsLocked(String provider) {
- LocationProvider p = mProvidersByName.get(provider);
- if (p == null) return;
+ @GuardedBy("mLock")
+ private void applyRequirementsLocked(String providerName) {
+ LocationProvider provider = getLocationProviderLocked(providerName);
+ if (provider != null) {
+ applyRequirementsLocked(provider);
+ }
+ }
- ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
+ @GuardedBy("mLock")
+ private void applyRequirementsLocked(LocationProvider provider) {
+ ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider.getName());
WorkSource worksource = new WorkSource();
ProviderRequest providerRequest = new ProviderRequest();
- ContentResolver resolver = mContext.getContentResolver();
- long backgroundThrottleInterval = Settings.Global.getLong(
- resolver,
- Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS,
- DEFAULT_BACKGROUND_THROTTLE_INTERVAL_MS);
+ long backgroundThrottleInterval;
- if (p.isEnabled() && records != null && !records.isEmpty()) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ backgroundThrottleInterval = Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS,
+ DEFAULT_BACKGROUND_THROTTLE_INTERVAL_MS);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ if (provider.isUseableLocked() && records != null && !records.isEmpty()) {
// initialize the low power mode to true and set to false if any of the records requires
providerRequest.lowPowerMode = true;
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
+ if (isCurrentProfileLocked(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
if (checkLocationAccess(
record.mReceiver.mIdentity.mPid,
record.mReceiver.mIdentity.mUid,
@@ -1955,7 +2061,8 @@ public class LocationManagerService extends ILocationManager.Stub {
// under that threshold.
long thresholdInterval = (providerRequest.interval + 1000) * 3 / 2;
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
+ if (isCurrentProfileLocked(
+ UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
LocationRequest locationRequest = record.mRequest;
// Don't assign battery blame for update records whose
@@ -1982,7 +2089,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
if (D) Log.d(TAG, "provider request: " + provider + " " + providerRequest);
- p.setRequest(providerRequest, worksource);
+ provider.setRequestLocked(providerRequest, worksource);
}
/**
@@ -2005,34 +2112,11 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public String[] getBackgroundThrottlingWhitelist() {
synchronized (mLock) {
- return mBackgroundThrottlePackageWhitelist.toArray(
- new String[0]);
+ return mBackgroundThrottlePackageWhitelist.toArray(new String[0]);
}
}
- private void updateBackgroundThrottlingWhitelistLocked() {
- String setting = Settings.Global.getString(
- mContext.getContentResolver(),
- Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
- if (setting == null) {
- setting = "";
- }
-
- mBackgroundThrottlePackageWhitelist.clear();
- mBackgroundThrottlePackageWhitelist.addAll(
- SystemConfig.getInstance().getAllowUnthrottledLocation());
- mBackgroundThrottlePackageWhitelist.addAll(
- Arrays.asList(setting.split(",")));
- }
-
- private void updateLastLocationMaxAgeLocked() {
- mLastLocationMaxAgeMs =
- Settings.Global.getLong(
- mContext.getContentResolver(),
- Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS,
- DEFAULT_LAST_LOCATION_MAX_AGE_MS);
- }
-
+ @GuardedBy("mLock")
private boolean isThrottlingExemptLocked(Identity identity) {
if (identity.mUid == Process.SYSTEM_UID) {
return true;
@@ -2042,8 +2126,8 @@ public class LocationManagerService extends ILocationManager.Stub {
return true;
}
- for (LocationProviderProxy provider : mProxyProviders) {
- if (identity.mPackageName.equals(provider.getConnectedPackageName())) {
+ for (LocationProvider provider : mProviders) {
+ if (identity.mPackageName.equals(provider.getPackageLocked())) {
return true;
}
}
@@ -2129,6 +2213,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
+ @GuardedBy("mLock")
private Receiver getReceiverLocked(ILocationListener listener, int pid, int uid,
String packageName, WorkSource workSource, boolean hideFromAppOps) {
IBinder binder = listener.asBinder();
@@ -2147,6 +2232,7 @@ public class LocationManagerService extends ILocationManager.Stub {
return receiver;
}
+ @GuardedBy("mLock")
private Receiver getReceiverLocked(PendingIntent intent, int pid, int uid, String packageName,
WorkSource workSource, boolean hideFromAppOps) {
Receiver receiver = mReceivers.get(intent);
@@ -2212,67 +2298,65 @@ public class LocationManagerService extends ILocationManager.Stub {
throw new SecurityException("invalid package name: " + packageName);
}
- private void checkPendingIntent(PendingIntent intent) {
- if (intent == null) {
- throw new IllegalArgumentException("invalid pending intent: " + null);
- }
- }
-
- private Receiver checkListenerOrIntentLocked(ILocationListener listener, PendingIntent intent,
- int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps) {
- if (intent == null && listener == null) {
- throw new IllegalArgumentException("need either listener or intent");
- } else if (intent != null && listener != null) {
- throw new IllegalArgumentException("cannot register both listener and intent");
- } else if (intent != null) {
- checkPendingIntent(intent);
- return getReceiverLocked(intent, pid, uid, packageName, workSource, hideFromAppOps);
- } else {
- return getReceiverLocked(listener, pid, uid, packageName, workSource, hideFromAppOps);
- }
- }
-
@Override
public void requestLocationUpdates(LocationRequest request, ILocationListener listener,
PendingIntent intent, String packageName) {
- if (request == null) request = DEFAULT_LOCATION_REQUEST;
- checkPackageName(packageName);
- int allowedResolutionLevel = getCallerAllowedResolutionLevel();
- checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
- request.getProvider());
- WorkSource workSource = request.getWorkSource();
- if (workSource != null && !workSource.isEmpty()) {
- checkDeviceStatsAllowed();
- }
- boolean hideFromAppOps = request.getHideFromAppOps();
- if (hideFromAppOps) {
- checkUpdateAppOpsAllowed();
- }
- boolean callerHasLocationHardwarePermission =
- mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
- == PERMISSION_GRANTED;
- LocationRequest sanitizedRequest = createSanitizedRequest(request, allowedResolutionLevel,
- callerHasLocationHardwarePermission);
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- // providers may use public location API's, need to clear identity
- long identity = Binder.clearCallingIdentity();
- try {
- // We don't check for MODE_IGNORED here; we will do that when we go to deliver
- // a location.
- checkLocationAccess(pid, uid, packageName, allowedResolutionLevel);
+ synchronized (mLock) {
+ if (request == null) request = DEFAULT_LOCATION_REQUEST;
+ checkPackageName(packageName);
+ int allowedResolutionLevel = getCallerAllowedResolutionLevel();
+ checkResolutionLevelIsSufficientForProviderUseLocked(allowedResolutionLevel,
+ request.getProvider());
+ WorkSource workSource = request.getWorkSource();
+ if (workSource != null && !workSource.isEmpty()) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.UPDATE_DEVICE_STATS, null);
+ }
+ boolean hideFromAppOps = request.getHideFromAppOps();
+ if (hideFromAppOps) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.UPDATE_APP_OPS_STATS, null);
+ }
+ boolean callerHasLocationHardwarePermission =
+ mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
+ == PERMISSION_GRANTED;
+ LocationRequest sanitizedRequest = createSanitizedRequest(request,
+ allowedResolutionLevel,
+ callerHasLocationHardwarePermission);
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
- synchronized (mLock) {
- Receiver recevier = checkListenerOrIntentLocked(listener, intent, pid, uid,
- packageName, workSource, hideFromAppOps);
- requestLocationUpdatesLocked(sanitizedRequest, recevier, uid, packageName);
+ long identity = Binder.clearCallingIdentity();
+ try {
+
+ // We don't check for MODE_IGNORED here; we will do that when we go to deliver
+ // a location.
+ checkLocationAccess(pid, uid, packageName, allowedResolutionLevel);
+
+ if (intent == null && listener == null) {
+ throw new IllegalArgumentException("need either listener or intent");
+ } else if (intent != null && listener != null) {
+ throw new IllegalArgumentException(
+ "cannot register both listener and intent");
+ }
+
+ Receiver receiver;
+ if (intent != null) {
+ receiver = getReceiverLocked(intent, pid, uid, packageName, workSource,
+ hideFromAppOps);
+ } else {
+ receiver = getReceiverLocked(listener, pid, uid, packageName, workSource,
+ hideFromAppOps);
+ }
+ requestLocationUpdatesLocked(sanitizedRequest, receiver, uid, packageName);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
- } finally {
- Binder.restoreCallingIdentity(identity);
}
}
+ @GuardedBy("mLock")
private void requestLocationUpdatesLocked(LocationRequest request, Receiver receiver,
int uid, String packageName) {
// Figure out the provider. Either its explicitly request (legacy use cases), or
@@ -2283,7 +2367,7 @@ public class LocationManagerService extends ILocationManager.Stub {
throw new IllegalArgumentException("provider name must not be null");
}
- LocationProvider provider = mProvidersByName.get(name);
+ LocationProvider provider = getLocationProviderLocked(name);
if (provider == null) {
throw new IllegalArgumentException("provider doesn't exist: " + name);
}
@@ -2302,7 +2386,7 @@ public class LocationManagerService extends ILocationManager.Stub {
oldRecord.disposeLocked(false);
}
- if (provider.isEnabled()) {
+ if (provider.isUseableLocked()) {
applyRequirementsLocked(name);
} else {
// Notify the listener that updates are currently disabled
@@ -2318,14 +2402,23 @@ public class LocationManagerService extends ILocationManager.Stub {
String packageName) {
checkPackageName(packageName);
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
+ int pid = Binder.getCallingPid();
+ int uid = Binder.getCallingUid();
+
+ if (intent == null && listener == null) {
+ throw new IllegalArgumentException("need either listener or intent");
+ } else if (intent != null && listener != null) {
+ throw new IllegalArgumentException("cannot register both listener and intent");
+ }
synchronized (mLock) {
- Receiver receiver = checkListenerOrIntentLocked(listener, intent, pid, uid,
- packageName, null, false);
+ Receiver receiver;
+ if (intent != null) {
+ receiver = getReceiverLocked(intent, pid, uid, packageName, null, false);
+ } else {
+ receiver = getReceiverLocked(listener, pid, uid, packageName, null, false);
+ }
- // providers may use public location API's, need to clear identity
long identity = Binder.clearCallingIdentity();
try {
removeUpdatesLocked(receiver);
@@ -2335,6 +2428,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
+ @GuardedBy("mLock")
private void removeUpdatesLocked(Receiver receiver) {
if (D) Log.i(TAG, "remove " + Integer.toHexString(System.identityHashCode(receiver)));
@@ -2366,51 +2460,53 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- private void applyAllProviderRequirementsLocked() {
- for (LocationProvider p : mProviders) {
- applyRequirementsLocked(p.getName());
- }
- }
-
@Override
- public Location getLastLocation(LocationRequest request, String packageName) {
- if (D) Log.d(TAG, "getLastLocation: " + request);
- if (request == null) request = DEFAULT_LOCATION_REQUEST;
- int allowedResolutionLevel = getCallerAllowedResolutionLevel();
- checkPackageName(packageName);
- checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
- request.getProvider());
- // no need to sanitize this request, as only the provider name is used
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long identity = Binder.clearCallingIdentity();
- try {
- if (mBlacklist.isBlacklisted(packageName)) {
- if (D) {
- Log.d(TAG, "not returning last loc for blacklisted app: " +
- packageName);
+ public Location getLastLocation(LocationRequest r, String packageName) {
+ if (D) Log.d(TAG, "getLastLocation: " + r);
+ synchronized (mLock) {
+ LocationRequest request = r != null ? r : DEFAULT_LOCATION_REQUEST;
+ int allowedResolutionLevel = getCallerAllowedResolutionLevel();
+ checkPackageName(packageName);
+ checkResolutionLevelIsSufficientForProviderUseLocked(allowedResolutionLevel,
+ request.getProvider());
+ // no need to sanitize this request, as only the provider name is used
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (mBlacklist.isBlacklisted(packageName)) {
+ if (D) {
+ Log.d(TAG, "not returning last loc for blacklisted app: "
+ + packageName);
+ }
+ return null;
}
- return null;
- }
- if (!reportLocationAccessNoThrow(pid, uid, packageName, allowedResolutionLevel)) {
- if (D) {
- Log.d(TAG, "not returning last loc for no op app: " +
- packageName);
+ if (!reportLocationAccessNoThrow(pid, uid, packageName, allowedResolutionLevel)) {
+ if (D) {
+ Log.d(TAG, "not returning last loc for no op app: "
+ + packageName);
+ }
+ return null;
}
- return null;
- }
- synchronized (mLock) {
// Figure out the provider. Either its explicitly request (deprecated API's),
// or use the fused provider
String name = request.getProvider();
if (name == null) name = LocationManager.FUSED_PROVIDER;
- LocationProvider provider = mProvidersByName.get(name);
+ LocationProvider provider = getLocationProviderLocked(name);
if (provider == null) return null;
- if (!isAllowedByUserSettingsLocked(name, uid, mCurrentUserId)) return null;
+ // only the current user or location providers may get location this way
+ if (!isCurrentProfileLocked(UserHandle.getUserId(uid)) && !isLocationProviderLocked(
+ uid)) {
+ return null;
+ }
+
+ if (!provider.isUseableLocked()) {
+ return null;
+ }
Location location;
if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
@@ -2426,9 +2522,12 @@ public class LocationManagerService extends ILocationManager.Stub {
// Don't return stale location to apps with foreground-only location permission.
String op = resolutionLevelToOpStr(allowedResolutionLevel);
- long locationAgeMs = SystemClock.elapsedRealtime() -
- location.getElapsedRealtimeNanos() / NANOS_PER_MILLI;
- if ((locationAgeMs > mLastLocationMaxAgeMs)
+ long locationAgeMs = SystemClock.elapsedRealtime()
+ - location.getElapsedRealtimeNanos() / NANOS_PER_MILLI;
+ if ((locationAgeMs > Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS,
+ DEFAULT_LAST_LOCATION_MAX_AGE_MS))
&& (mAppOps.unsafeCheckOp(op, uid, packageName)
== AppOpsManager.MODE_FOREGROUND)) {
return null;
@@ -2443,24 +2542,13 @@ public class LocationManagerService extends ILocationManager.Stub {
} else {
return new Location(location);
}
+ return null;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
- return null;
- } finally {
- Binder.restoreCallingIdentity(identity);
}
}
- /**
- * Provides an interface to inject and set the last location if location is not available
- * currently.
- *
- * This helps in cases where the product (Cars for example) has saved the last known location
- * before powering off. This interface lets the client inject the saved location while the GPS
- * chipset is getting its first fix, there by improving user experience.
- *
- * @param location - Location object to inject
- * @return true if update was successful, false if not
- */
@Override
public boolean injectLocation(Location location) {
mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE,
@@ -2474,38 +2562,23 @@ public class LocationManagerService extends ILocationManager.Stub {
}
return false;
}
- LocationProvider p = null;
- String provider = location.getProvider();
- if (provider != null) {
- p = mProvidersByName.get(provider);
- }
- if (p == null) {
- if (D) {
- Log.d(TAG, "injectLocation(): unknown provider");
- }
- return false;
- }
+
synchronized (mLock) {
- if (!isAllowedByUserSettingsLockedForUser(provider, mCurrentUserId)) {
- if (D) {
- Log.d(TAG, "Location disabled in Settings for current user:" + mCurrentUserId);
- }
+ LocationProvider provider = getLocationProviderLocked(location.getProvider());
+ if (provider == null || !provider.isUseableLocked()) {
return false;
- } else {
- // NOTE: If last location is already available, location is not injected. If
- // provider's normal source (like a GPS chipset) have already provided an output,
- // there is no need to inject this location.
- if (mLastLocation.get(provider) == null) {
- updateLastLocationLocked(location, provider);
- } else {
- if (D) {
- Log.d(TAG, "injectLocation(): Location exists. Not updating");
- }
- return false;
- }
}
+
+ // NOTE: If last location is already available, location is not injected. If
+ // provider's normal source (like a GPS chipset) have already provided an output
+ // there is no need to inject this location.
+ if (mLastLocation.get(provider.getName()) != null) {
+ return false;
+ }
+
+ updateLastLocationLocked(location, provider.getName());
+ return true;
}
- return true;
}
@Override
@@ -2514,39 +2587,49 @@ public class LocationManagerService extends ILocationManager.Stub {
if (request == null) request = DEFAULT_LOCATION_REQUEST;
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
checkResolutionLevelIsSufficientForGeofenceUse(allowedResolutionLevel);
- checkPendingIntent(intent);
+ if (intent == null) {
+ throw new IllegalArgumentException("invalid pending intent: " + null);
+ }
checkPackageName(packageName);
- checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
- request.getProvider());
- // Require that caller can manage given document
- boolean callerHasLocationHardwarePermission =
- mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
- == PERMISSION_GRANTED;
- LocationRequest sanitizedRequest = createSanitizedRequest(request, allowedResolutionLevel,
- callerHasLocationHardwarePermission);
+ synchronized (mLock) {
+ checkResolutionLevelIsSufficientForProviderUseLocked(allowedResolutionLevel,
+ request.getProvider());
+ // Require that caller can manage given document
+ boolean callerHasLocationHardwarePermission =
+ mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
+ == PERMISSION_GRANTED;
+ LocationRequest sanitizedRequest = createSanitizedRequest(request,
+ allowedResolutionLevel,
+ callerHasLocationHardwarePermission);
- if (D) Log.d(TAG, "requestGeofence: " + sanitizedRequest + " " + geofence + " " + intent);
+ if (D) {
+ Log.d(TAG, "requestGeofence: " + sanitizedRequest + " " + geofence + " " + intent);
+ }
- // geo-fence manager uses the public location API, need to clear identity
- int uid = Binder.getCallingUid();
- // TODO: http://b/23822629
- if (UserHandle.getUserId(uid) != UserHandle.USER_SYSTEM) {
- // temporary measure until geofences work for secondary users
- Log.w(TAG, "proximity alerts are currently available only to the primary user");
- return;
- }
- long identity = Binder.clearCallingIdentity();
- try {
- mGeofenceManager.addFence(sanitizedRequest, geofence, intent, allowedResolutionLevel,
- uid, packageName);
- } finally {
- Binder.restoreCallingIdentity(identity);
+ // geo-fence manager uses the public location API, need to clear identity
+ int uid = Binder.getCallingUid();
+ // TODO: http://b/23822629
+ if (UserHandle.getUserId(uid) != UserHandle.USER_SYSTEM) {
+ // temporary measure until geofences work for secondary users
+ Log.w(TAG, "proximity alerts are currently available only to the primary user");
+ return;
+ }
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mGeofenceManager.addFence(sanitizedRequest, geofence, intent,
+ allowedResolutionLevel,
+ uid, packageName);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
@Override
public void removeGeofence(Geofence geofence, PendingIntent intent, String packageName) {
- checkPendingIntent(intent);
+ if (intent == null) {
+ throw new IllegalArgumentException("invalid pending intent: " + null);
+ }
checkPackageName(packageName);
if (D) Log.d(TAG, "removeGeofence: " + geofence + " " + intent);
@@ -2651,6 +2734,7 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (mLock) {
Identity callerIdentity
= new Identity(Binder.getCallingUid(), Binder.getCallingPid(), packageName);
+
// TODO(b/120481270): Register for client death notification and update map.
mGnssNavigationMessageListeners.put(listener.asBinder(), callerIdentity);
long identity = Binder.clearCallingIdentity();
@@ -2680,25 +2764,26 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
- public boolean sendExtraCommand(String provider, String command, Bundle extras) {
- if (provider == null) {
+ public boolean sendExtraCommand(String providerName, String command, Bundle extras) {
+ if (providerName == null) {
// throw NullPointerException to remain compatible with previous implementation
throw new NullPointerException();
}
- checkResolutionLevelIsSufficientForProviderUse(getCallerAllowedResolutionLevel(),
- provider);
+ synchronized (mLock) {
+ checkResolutionLevelIsSufficientForProviderUseLocked(getCallerAllowedResolutionLevel(),
+ providerName);
- // and check for ACCESS_LOCATION_EXTRA_COMMANDS
- if ((mContext.checkCallingOrSelfPermission(ACCESS_LOCATION_EXTRA_COMMANDS)
- != PERMISSION_GRANTED)) {
- throw new SecurityException("Requires ACCESS_LOCATION_EXTRA_COMMANDS permission");
- }
+ // and check for ACCESS_LOCATION_EXTRA_COMMANDS
+ if ((mContext.checkCallingOrSelfPermission(ACCESS_LOCATION_EXTRA_COMMANDS)
+ != PERMISSION_GRANTED)) {
+ throw new SecurityException("Requires ACCESS_LOCATION_EXTRA_COMMANDS permission");
+ }
- synchronized (mLock) {
- LocationProvider p = mProvidersByName.get(provider);
- if (p == null) return false;
+ LocationProvider provider = getLocationProviderLocked(providerName);
+ if (provider != null) {
+ provider.sendExtraCommandLocked(command, extras);
+ }
- p.sendExtraCommand(command, extras);
return true;
}
}
@@ -2717,44 +2802,29 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * @return null if the provider does not exist
- * @throws SecurityException if the provider is not allowed to be
- * accessed by the caller
- */
@Override
- public ProviderProperties getProviderProperties(String provider) {
- checkResolutionLevelIsSufficientForProviderUse(getCallerAllowedResolutionLevel(),
- provider);
-
- LocationProvider p;
+ public ProviderProperties getProviderProperties(String providerName) {
synchronized (mLock) {
- p = mProvidersByName.get(provider);
- }
+ checkResolutionLevelIsSufficientForProviderUseLocked(getCallerAllowedResolutionLevel(),
+ providerName);
- if (p == null) return null;
- return p.getProperties();
+ LocationProvider provider = getLocationProviderLocked(providerName);
+ if (provider == null) {
+ return null;
+ }
+ return provider.getPropertiesLocked();
+ }
}
- /**
- * @return null if the provider does not exist
- * @throws SecurityException if the provider is not allowed to be
- * accessed by the caller
- */
@Override
public String getNetworkProviderPackage() {
- LocationProvider p;
synchronized (mLock) {
- p = mProvidersByName.get(LocationManager.NETWORK_PROVIDER);
- }
-
- if (p == null) {
- return null;
- }
- if (p.mProvider instanceof LocationProviderProxy) {
- return ((LocationProviderProxy) p.mProvider).getConnectedPackageName();
+ LocationProvider provider = getLocationProviderLocked(NETWORK_PROVIDER);
+ if (provider == null) {
+ return null;
+ }
+ return provider.getPackageLocked();
}
- return null;
}
@Override
@@ -2790,241 +2860,96 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Returns the current location enabled/disabled status for a user
- *
- * @param userId the id of the user
- * @return true if location is enabled
- */
- @Override
- public boolean isLocationEnabledForUser(int userId) {
- // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
- checkInteractAcrossUsersPermission(userId);
-
- long identity = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- final String allowedProviders = Settings.Secure.getStringForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- userId);
- if (allowedProviders == null) {
- return false;
- }
- final List<String> providerList = Arrays.asList(allowedProviders.split(","));
- for (String provider : mRealProviders.keySet()) {
- if (provider.equals(LocationManager.PASSIVE_PROVIDER)
- || provider.equals(LocationManager.FUSED_PROVIDER)) {
- continue;
- }
- if (providerList.contains(provider)) {
- return true;
- }
- }
- return false;
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
+ private boolean isLocationEnabled() {
+ return isLocationEnabledForUser(mCurrentUserId);
}
- /**
- * Enable or disable location for a user
- *
- * @param enabled true to enable location, false to disable location
- * @param userId the id of the user
- */
@Override
- public void setLocationEnabledForUser(boolean enabled, int userId) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SECURE_SETTINGS,
- "Requires WRITE_SECURE_SETTINGS permission");
-
+ public boolean isLocationEnabledForUser(int userId) {
// Check INTERACT_ACROSS_USERS permission if userId is not current user id.
- checkInteractAcrossUsersPermission(userId);
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS,
+ "Requires INTERACT_ACROSS_USERS permission");
+ }
long identity = Binder.clearCallingIdentity();
try {
- synchronized (mLock) {
- final Set<String> allRealProviders = mRealProviders.keySet();
- // Update all providers on device plus gps and network provider when disabling
- // location
- Set<String> allProvidersSet = new ArraySet<>(allRealProviders.size() + 2);
- allProvidersSet.addAll(allRealProviders);
- // When disabling location, disable gps and network provider that could have been
- // enabled by location mode api.
- if (!enabled) {
- allProvidersSet.add(LocationManager.GPS_PROVIDER);
- allProvidersSet.add(LocationManager.NETWORK_PROVIDER);
- }
- if (allProvidersSet.isEmpty()) {
- return;
- }
- // to ensure thread safety, we write the provider name with a '+' or '-'
- // and let the SettingsProvider handle it rather than reading and modifying
- // the list of enabled providers.
- final String prefix = enabled ? "+" : "-";
- StringBuilder locationProvidersAllowed = new StringBuilder();
- for (String provider : allProvidersSet) {
- if (provider.equals(LocationManager.PASSIVE_PROVIDER)
- || provider.equals(LocationManager.FUSED_PROVIDER)) {
- continue;
- }
- locationProvidersAllowed.append(prefix);
- locationProvidersAllowed.append(provider);
- locationProvidersAllowed.append(",");
- }
- // Remove the trailing comma
- locationProvidersAllowed.setLength(locationProvidersAllowed.length() - 1);
- Settings.Secure.putStringForUser(
+ boolean enabled;
+ try {
+ enabled = Settings.Secure.getIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE,
+ userId) != Settings.Secure.LOCATION_MODE_OFF;
+ } catch (Settings.SettingNotFoundException e) {
+ // OS upgrade case where mode isn't set yet
+ enabled = !TextUtils.isEmpty(Settings.Secure.getStringForUser(
mContext.getContentResolver(),
Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- locationProvidersAllowed.toString(),
- userId);
- }
+ userId));
+
+ try {
+ Settings.Secure.putIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE,
+ enabled
+ ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
+ : Settings.Secure.LOCATION_MODE_OFF,
+ userId);
+ } catch (RuntimeException ex) {
+ // any problem with writing should not be propagated
+ Slog.e(TAG, "error updating location mode", ex);
+ }
+ }
+ return enabled;
} finally {
Binder.restoreCallingIdentity(identity);
}
}
- /**
- * Returns the current enabled/disabled status of a location provider and user
- *
- * @param providerName name of the provider
- * @param userId the id of the user
- * @return true if the provider exists and is enabled
- */
@Override
public boolean isProviderEnabledForUser(String providerName, int userId) {
// Check INTERACT_ACROSS_USERS permission if userId is not current user id.
- checkInteractAcrossUsersPermission(userId);
-
- if (!isLocationEnabledForUser(userId)) {
- return false;
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS,
+ "Requires INTERACT_ACROSS_USERS permission");
}
// Fused provider is accessed indirectly via criteria rather than the provider-based APIs,
// so we discourage its use
- if (LocationManager.FUSED_PROVIDER.equals(providerName)) return false;
-
- long identity = Binder.clearCallingIdentity();
- try {
- LocationProvider provider;
- synchronized (mLock) {
- provider = mProvidersByName.get(providerName);
- }
- return provider != null && provider.isEnabled();
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- /**
- * Enable or disable a single location provider.
- *
- * @param provider name of the provider
- * @param enabled true to enable the provider. False to disable the provider
- * @param userId the id of the user to set
- * @return true if the value was set, false on errors
- */
- @Override
- public boolean setProviderEnabledForUser(String provider, boolean enabled, int userId) {
- return false;
- }
+ if (FUSED_PROVIDER.equals(providerName)) return false;
- /**
- * Method for checking INTERACT_ACROSS_USERS permission if specified user id is not the same as
- * current user id
- *
- * @param userId the user id to get or set value
- */
- private void checkInteractAcrossUsersPermission(int userId) {
- int uid = Binder.getCallingUid();
- if (UserHandle.getUserId(uid) != userId) {
- if (ActivityManager.checkComponentPermission(
- android.Manifest.permission.INTERACT_ACROSS_USERS, uid, -1, true)
- != PERMISSION_GRANTED) {
- throw new SecurityException("Requires INTERACT_ACROSS_USERS permission");
- }
+ synchronized (mLock) {
+ LocationProvider provider = getLocationProviderLocked(providerName);
+ return provider != null && provider.isUseableForUserLocked(userId);
}
}
- /**
- * Returns "true" if the UID belongs to a bound location provider.
- *
- * @param uid the uid
- * @return true if uid belongs to a bound location provider
- */
- private boolean isUidALocationProvider(int uid) {
+ @GuardedBy("mLock")
+ private boolean isLocationProviderLocked(int uid) {
if (uid == Process.SYSTEM_UID) {
return true;
}
- if (mGeocodeProvider != null) {
- if (doesUidHavePackage(uid, mGeocodeProvider.getConnectedPackageName())) return true;
- }
- for (LocationProviderProxy proxy : mProxyProviders) {
- if (doesUidHavePackage(uid, proxy.getConnectedPackageName())) return true;
- }
- return false;
- }
-
- private void checkCallerIsProvider() {
- if (mContext.checkCallingOrSelfPermission(INSTALL_LOCATION_PROVIDER)
- == PERMISSION_GRANTED) {
- return;
- }
-
- // Previously we only used the INSTALL_LOCATION_PROVIDER
- // check. But that is system or signature
- // protection level which is not flexible enough for
- // providers installed oustide the system image. So
- // also allow providers with a UID matching the
- // currently bound package name
-
- if (isUidALocationProvider(Binder.getCallingUid())) {
- return;
- }
-
- throw new SecurityException("need INSTALL_LOCATION_PROVIDER permission, " +
- "or UID of a currently bound location provider");
- }
- /**
- * Returns true if the given package belongs to the given uid.
- */
- private boolean doesUidHavePackage(int uid, String packageName) {
- if (packageName == null) {
- return false;
- }
String[] packageNames = mPackageManager.getPackagesForUid(uid);
if (packageNames == null) {
return false;
}
- for (String name : packageNames) {
- if (packageName.equals(name)) {
+ for (LocationProvider provider : mProviders) {
+ String packageName = provider.getPackageLocked();
+ if (packageName == null) {
+ continue;
+ }
+ if (ArrayUtils.contains(packageNames, packageName)) {
return true;
}
}
return false;
}
- @Override
- public void reportLocation(Location location, boolean passive) {
- checkCallerIsProvider();
-
- if (!location.isComplete()) {
- Log.w(TAG, "Dropping incomplete location: " + location);
- return;
- }
-
- mLocationHandler.removeMessages(MSG_LOCATION_CHANGED, location);
- Message m = Message.obtain(mLocationHandler, MSG_LOCATION_CHANGED, location);
- m.arg1 = (passive ? 1 : 0);
- mLocationHandler.sendMessageAtFrontOfQueue(m);
- }
-
-
- private static boolean shouldBroadcastSafe(
+ @GuardedBy("mLock")
+ private static boolean shouldBroadcastSafeLocked(
Location loc, Location lastLoc, UpdateRecord record, long now) {
// Always broadcast the first update
if (lastLoc == null) {
@@ -3056,26 +2981,36 @@ public class LocationManagerService extends ILocationManager.Stub {
return record.mRealRequest.getExpireAt() >= now;
}
- private void handleLocationChangedLocked(Location location, boolean passive) {
+ @GuardedBy("mLock")
+ private void handleLocationChangedLocked(Location location, LocationProvider provider) {
+ if (!mProviders.contains(provider)) {
+ return;
+ }
+ if (!location.isComplete()) {
+ Log.w(TAG, "Dropping incomplete location: " + location);
+ return;
+ }
+
+ if (!provider.isPassiveLocked()) {
+ // notify passive provider of the new location
+ mPassiveProvider.updateLocation(location);
+ }
+
if (D) Log.d(TAG, "incoming location: " + location);
long now = SystemClock.elapsedRealtime();
- String provider = (passive ? LocationManager.PASSIVE_PROVIDER : location.getProvider());
- // Skip if the provider is unknown.
- LocationProvider p = mProvidersByName.get(provider);
- if (p == null) return;
- updateLastLocationLocked(location, provider);
+ updateLastLocationLocked(location, provider.getName());
// mLastLocation should have been updated from the updateLastLocationLocked call above.
- Location lastLocation = mLastLocation.get(provider);
+ Location lastLocation = mLastLocation.get(provider.getName());
if (lastLocation == null) {
Log.e(TAG, "handleLocationChangedLocked() updateLastLocation failed");
return;
}
// Update last known coarse interval location if enough time has passed.
- Location lastLocationCoarseInterval = mLastLocationCoarseInterval.get(provider);
+ Location lastLocationCoarseInterval = mLastLocationCoarseInterval.get(provider.getName());
if (lastLocationCoarseInterval == null) {
lastLocationCoarseInterval = new Location(location);
- mLastLocationCoarseInterval.put(provider, lastLocationCoarseInterval);
+ mLastLocationCoarseInterval.put(provider.getName(), lastLocationCoarseInterval);
}
long timeDiffNanos = location.getElapsedRealtimeNanos()
- lastLocationCoarseInterval.getElapsedRealtimeNanos();
@@ -3089,7 +3024,7 @@ public class LocationManagerService extends ILocationManager.Stub {
lastLocationCoarseInterval.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
// Skip if there are no UpdateRecords for this provider.
- ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
+ ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider.getName());
if (records == null || records.size() == 0) return;
// Fetch coarse location
@@ -3098,13 +3033,6 @@ public class LocationManagerService extends ILocationManager.Stub {
coarseLocation = mLocationFudger.getOrCreate(noGPSLocation);
}
- // Fetch latest status update time
- long newStatusUpdateTime = p.getStatusUpdateTime();
-
- // Get latest status
- Bundle extras = new Bundle();
- int status = p.getStatus(extras);
-
ArrayList<Receiver> deadReceivers = null;
ArrayList<UpdateRecord> deadUpdateRecords = null;
@@ -3114,8 +3042,8 @@ public class LocationManagerService extends ILocationManager.Stub {
boolean receiverDead = false;
int receiverUserId = UserHandle.getUserId(receiver.mIdentity.mUid);
- if (!isCurrentProfile(receiverUserId)
- && !isUidALocationProvider(receiver.mIdentity.mUid)) {
+ if (!isCurrentProfileLocked(receiverUserId)
+ && !isLocationProviderLocked(receiver.mIdentity.mUid)) {
if (D) {
Log.d(TAG, "skipping loc update for background user " + receiverUserId +
" (current user: " + mCurrentUserId + ", app: " +
@@ -3152,7 +3080,8 @@ public class LocationManagerService extends ILocationManager.Stub {
}
if (notifyLocation != null) {
Location lastLoc = r.mLastFixBroadcast;
- if ((lastLoc == null) || shouldBroadcastSafe(notifyLocation, lastLoc, r, now)) {
+ if ((lastLoc == null)
+ || shouldBroadcastSafeLocked(notifyLocation, lastLoc, r, now)) {
if (lastLoc == null) {
lastLoc = new Location(notifyLocation);
r.mLastFixBroadcast = lastLoc;
@@ -3160,7 +3089,8 @@ public class LocationManagerService extends ILocationManager.Stub {
lastLoc.set(notifyLocation);
}
if (!receiver.callLocationChangedLocked(notifyLocation)) {
- Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
+ Slog.w(TAG, "RemoteException calling onLocationChanged on "
+ + receiver);
receiverDead = true;
}
r.mRealRequest.decrementNumUpdates();
@@ -3171,12 +3101,16 @@ public class LocationManagerService extends ILocationManager.Stub {
// guarded behind this setting now. should be removed completely post-Q
if (Settings.Global.getInt(mContext.getContentResolver(),
LOCATION_DISABLE_STATUS_CALLBACKS, 1) == 0) {
+ long newStatusUpdateTime = provider.getStatusUpdateTimeLocked();
+ Bundle extras = new Bundle();
+ int status = provider.getStatusLocked(extras);
+
long prevStatusUpdateTime = r.mLastStatusBroadcast;
if ((newStatusUpdateTime > prevStatusUpdateTime)
&& (prevStatusUpdateTime != 0 || status != AVAILABLE)) {
r.mLastStatusBroadcast = newStatusUpdateTime;
- if (!receiver.callStatusChangedLocked(provider, status, extras)) {
+ if (!receiver.callStatusChangedLocked(provider.getName(), status, extras)) {
receiverDead = true;
Slog.w(TAG, "RemoteException calling onStatusChanged on " + receiver);
}
@@ -3215,12 +3149,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- /**
- * Updates last location with the given location
- *
- * @param location new location to update
- * @param provider Location provider to update for
- */
+ @GuardedBy("mLock")
private void updateLastLocationLocked(Location location, String provider) {
Location noGPSLocation = location.getExtraLocation(Location.EXTRA_NO_GPS_LOCATION);
Location lastNoGPSLocation;
@@ -3239,151 +3168,6 @@ public class LocationManagerService extends ILocationManager.Stub {
lastLocation.set(location);
}
- private class LocationWorkerHandler extends Handler {
- public LocationWorkerHandler(Looper looper) {
- super(looper, null, true);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_LOCATION_CHANGED:
- handleLocationChanged((Location) msg.obj, msg.arg1 == 1);
- break;
- }
- }
- }
-
- private boolean isMockProvider(String provider) {
- synchronized (mLock) {
- return mMockProviders.containsKey(provider);
- }
-
- }
-
- private Location screenLocationLocked(Location location, String provider) {
- if (isMockProvider(LocationManager.NETWORK_PROVIDER)) {
- return location;
- }
- LocationProvider networkProvider =
- mProvidersByName.get(LocationManager.NETWORK_PROVIDER);
- if (mComboNlpPackageName == null ||
- networkProvider == null ||
- networkProvider.mProvider == null ||
- !(networkProvider.mProvider instanceof LocationProviderProxy) ||
- false == provider.equals(LocationManager.NETWORK_PROVIDER) ||
- isMockProvider(LocationManager.NETWORK_PROVIDER)) {
- return location;
- }
-
- LocationProviderProxy providerProxy = (LocationProviderProxy)networkProvider.mProvider;
- String connectedNlpPackage = providerProxy.getConnectedPackageName();
- if (connectedNlpPackage == null || !connectedNlpPackage.equals(mComboNlpPackageName)) {
- return location;
- }
-
- Bundle extras = location.getExtras();
- boolean isBeingScreened = false;
-
- if (extras == null || !extras.containsKey(mComboNlpReadyMarker)) {
- // see if Combo Nlp is a passive listener
- ArrayList<UpdateRecord> records =
- mRecordsByProvider.get(LocationManager.PASSIVE_PROVIDER);
- if (records != null) {
- for (UpdateRecord r : records) {
- if (r.mReceiver.mIdentity.mPackageName.equals(mComboNlpPackageName)) {
- if (!isBeingScreened) {
- isBeingScreened = true;
- if (extras == null) {
- location.setExtras(new Bundle());
- extras = location.getExtras();
- }
- extras.putBoolean(mComboNlpScreenMarker, true);
- }
- // send location to Combo Nlp for screening
- if (!r.mReceiver.callLocationChangedLocked(location)) {
- Slog.w(TAG, "RemoteException calling onLocationChanged on "
- + r.mReceiver);
- } else {
- if (D) {
- Log.d(TAG, "Sending location for screening");
- }
- }
- }
- }
- }
- if (isBeingScreened) {
- return null;
- }
- if (D) {
- Log.d(TAG, "Not screening locations");
- }
- } else {
- if (D) {
- Log.d(TAG, "This location is marked as ready for broadcast");
- }
- // clear the ready marker
- extras.remove(mComboNlpReadyMarker);
- }
-
- return location;
- }
-
- private void handleLocationChanged(Location location, boolean passive) {
- // create a working copy of the incoming Location so that the service can modify it without
- // disturbing the caller's copy
- Location myLocation = new Location(location);
- String provider = myLocation.getProvider();
-
- // set "isFromMockProvider" bit if location came from a mock provider. we do not clear this
- // bit if location did not come from a mock provider because passive/fused providers can
- // forward locations from mock providers, and should not grant them legitimacy in doing so.
- if (!myLocation.isFromMockProvider() && isMockProvider(provider)) {
- myLocation.setIsFromMockProvider(true);
- }
-
- synchronized (mLock) {
- if (isAllowedByUserSettingsLockedForUser(provider, mCurrentUserId)) {
- if (!passive) {
- location = screenLocationLocked(location, provider);
- if (location == null) {
- return;
- }
- // notify passive provider of the new location
- mPassiveProvider.updateLocation(myLocation);
- }
- handleLocationChangedLocked(myLocation, passive);
- }
- handleLocationChangedLocked(myLocation, passive);
- }
- }
-
- private final PackageMonitor mPackageMonitor = new PackageMonitor() {
- @Override
- public void onPackageDisappeared(String packageName, int reason) {
- // remove all receivers associated with this package name
- synchronized (mLock) {
- ArrayList<Receiver> deadReceivers = null;
-
- for (Receiver receiver : mReceivers.values()) {
- if (receiver.mIdentity.mPackageName.equals(packageName)) {
- if (deadReceivers == null) {
- deadReceivers = new ArrayList<>();
- }
- deadReceivers.add(receiver);
- }
- }
-
- // perform removal outside of mReceivers loop
- if (deadReceivers != null) {
- for (Receiver receiver : deadReceivers) {
- removeUpdatesLocked(receiver);
- }
- }
- }
- }
- };
-
// Geocoder
@Override
@@ -3429,63 +3213,60 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
- if (LocationManager.PASSIVE_PROVIDER.equals(name)) {
+ if (PASSIVE_PROVIDER.equals(name)) {
throw new IllegalArgumentException("Cannot mock the passive location provider");
}
- long identity = Binder.clearCallingIdentity();
synchronized (mLock) {
- // remove the real provider if we are replacing GPS or network provider
- if (LocationManager.GPS_PROVIDER.equals(name)
- || LocationManager.NETWORK_PROVIDER.equals(name)
- || LocationManager.FUSED_PROVIDER.equals(name)) {
- LocationProvider p = mProvidersByName.get(name);
- if (p != null) {
- removeProviderLocked(p);
+ long identity = Binder.clearCallingIdentity();
+ try {
+ LocationProvider oldProvider = getLocationProviderLocked(name);
+ if (oldProvider != null) {
+ if (oldProvider.isMock()) {
+ throw new IllegalArgumentException(
+ "Provider \"" + name + "\" already exists");
+ }
+
+ removeProviderLocked(oldProvider);
}
+
+ MockLocationProvider mockProviderManager = new MockLocationProvider(name);
+ addProviderLocked(mockProviderManager);
+ mockProviderManager.attachLocked(new MockProvider(mockProviderManager, properties));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
- addTestProviderLocked(name, properties);
}
- Binder.restoreCallingIdentity(identity);
- }
-
- private void addTestProviderLocked(String name, ProviderProperties properties) {
- if (mProvidersByName.get(name) != null) {
- throw new IllegalArgumentException("Provider \"" + name + "\" already exists");
- }
-
- LocationProvider provider = new LocationProvider(name);
- MockProvider mockProvider = new MockProvider(provider, properties);
-
- addProviderLocked(provider);
- mMockProviders.put(name, mockProvider);
- mLastLocation.put(name, null);
- mLastLocationCoarseInterval.put(name, null);
}
@Override
- public void removeTestProvider(String provider, String opPackageName) {
+ public void removeTestProvider(String name, String opPackageName) {
if (!canCallerAccessMockLocation(opPackageName)) {
return;
}
synchronized (mLock) {
- MockProvider mockProvider = mMockProviders.remove(provider);
- if (mockProvider == null) {
- throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
- }
-
long identity = Binder.clearCallingIdentity();
try {
- removeProviderLocked(mProvidersByName.get(provider));
+ LocationProvider testProvider = getLocationProviderLocked(name);
+ if (testProvider == null || !testProvider.isMock()) {
+ throw new IllegalArgumentException("Provider \"" + name + "\" unknown");
+ }
+
+ removeProviderLocked(testProvider);
// reinstate real provider if available
- LocationProvider realProvider = mRealProviders.get(provider);
+ LocationProvider realProvider = null;
+ for (LocationProvider provider : mRealProviders) {
+ if (name.equals(provider.getName())) {
+ realProvider = provider;
+ break;
+ }
+ }
+
if (realProvider != null) {
addProviderLocked(realProvider);
}
- mLastLocation.put(provider, null);
- mLastLocationCoarseInterval.put(provider, null);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -3493,78 +3274,60 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
- public void setTestProviderLocation(String provider, Location loc, String opPackageName) {
+ public void setTestProviderLocation(String providerName, Location location,
+ String opPackageName) {
if (!canCallerAccessMockLocation(opPackageName)) {
return;
}
synchronized (mLock) {
- MockProvider mockProvider = mMockProviders.get(provider);
- if (mockProvider == null) {
- throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
+ LocationProvider testProvider = getLocationProviderLocked(providerName);
+ if (testProvider == null || !testProvider.isMock()) {
+ throw new IllegalArgumentException("Provider \"" + providerName + "\" unknown");
}
- // Ensure that the location is marked as being mock. There's some logic to do this in
- // handleLocationChanged(), but it fails if loc has the wrong provider (bug 33091107).
- Location mock = new Location(loc);
- mock.setIsFromMockProvider(true);
-
- if (!TextUtils.isEmpty(loc.getProvider()) && !provider.equals(loc.getProvider())) {
- // The location has an explicit provider that is different from the mock provider
- // name. The caller may be trying to fool us via bug 33091107.
+ String locationProvider = location.getProvider();
+ if (!TextUtils.isEmpty(locationProvider) && !providerName.equals(locationProvider)) {
+ // The location has an explicit provider that is different from the mock
+ // provider name. The caller may be trying to fool us via b/33091107.
EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
- provider + "!=" + loc.getProvider());
+ providerName + "!=" + location.getProvider());
}
- // clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required
- long identity = Binder.clearCallingIdentity();
- try {
- mockProvider.setLocation(mock);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
+ ((MockLocationProvider) testProvider).setLocationLocked(location);
}
}
@Override
- public void setTestProviderEnabled(String provider, boolean enabled, String opPackageName) {
+ public void setTestProviderEnabled(String providerName, boolean enabled, String opPackageName) {
if (!canCallerAccessMockLocation(opPackageName)) {
return;
}
synchronized (mLock) {
- MockProvider mockProvider = mMockProviders.get(provider);
- if (mockProvider == null) {
- throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
- }
- long identity = Binder.clearCallingIdentity();
- try {
- mockProvider.setEnabled(enabled);
- } finally {
- Binder.restoreCallingIdentity(identity);
+ LocationProvider testProvider = getLocationProviderLocked(providerName);
+ if (testProvider == null || !testProvider.isMock()) {
+ throw new IllegalArgumentException("Provider \"" + providerName + "\" unknown");
}
+
+ ((MockLocationProvider) testProvider).setEnabledLocked(enabled);
}
}
@Override
- public void setTestProviderStatus(String provider, int status, Bundle extras, long updateTime,
- String opPackageName) {
+ public void setTestProviderStatus(String providerName, int status, Bundle extras,
+ long updateTime, String opPackageName) {
if (!canCallerAccessMockLocation(opPackageName)) {
return;
}
synchronized (mLock) {
- MockProvider mockProvider = mMockProviders.get(provider);
- if (mockProvider == null) {
- throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
+ LocationProvider testProvider = getLocationProviderLocked(providerName);
+ if (testProvider == null || !testProvider.isMock()) {
+ throw new IllegalArgumentException("Provider \"" + providerName + "\" unknown");
}
- mockProvider.setStatus(status, extras, updateTime);
- }
- }
- private void log(String log) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Slog.d(TAG, log);
+ ((MockLocationProvider) testProvider).setStatusLocked(status, extras, updateTime);
}
}
@@ -3580,6 +3343,7 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
pw.println("Current Location Manager state:");
+ pw.println(" Location Mode: " + isLocationEnabled());
pw.println(" Location Listeners:");
for (Receiver receiver : mReceivers.values()) {
pw.println(" " + receiver);
@@ -3634,12 +3398,6 @@ public class LocationManagerService extends ILocationManager.Stub {
pw.append(" ");
mBlacklist.dump(pw);
- if (mMockProviders.size() > 0) {
- pw.println(" Mock Providers:");
- for (Map.Entry<String, MockProvider> i : mMockProviders.entrySet()) {
- i.getValue().dump(fd, pw, args);
- }
- }
if (mLocationControllerExtraPackage != null) {
pw.println(" Location controller extra package: " + mLocationControllerExtraPackage
@@ -3660,7 +3418,7 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
for (LocationProvider provider : mProviders) {
- provider.dump(fd, pw, args);
+ provider.dumpLocked(fd, pw, args);
}
if (mGnssBatchingInProgress) {
pw.println(" GNSS batching in progress");
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index b0ca2df20f1f..aed0684a92cb 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -17,13 +17,11 @@
package com.android.server;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
-import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.Manifest.permission.NETWORK_STACK;
import static android.Manifest.permission.SHUTDOWN;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE;
-import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_NONE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NONE;
@@ -40,6 +38,7 @@ import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static android.net.TrafficStats.UID_TETHERING;
+
import static com.android.server.NetworkManagementService.NetdResponseCode.ClatdStatusResult;
import static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceGetCfgResult;
import static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceListResult;
@@ -53,11 +52,9 @@ import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENAB
import android.annotation.NonNull;
import android.app.ActivityManager;
-import android.content.ContentResolver;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetd;
-import android.net.TetherStatsParcel;
import android.net.INetworkManagementEventObserver;
import android.net.ITetheringStatsProvider;
import android.net.InterfaceConfiguration;
@@ -69,18 +66,15 @@ import android.net.NetworkPolicyManager;
import android.net.NetworkStats;
import android.net.NetworkUtils;
import android.net.RouteInfo;
+import android.net.TetherStatsParcel;
import android.net.UidRange;
-import android.net.UidRangeParcel;
import android.net.util.NetdService;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
-import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteCallbackList;
@@ -91,12 +85,7 @@ import android.os.StrictMode;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
-import android.provider.Settings;
import android.telephony.DataConnectionRealTimeInfo;
-import android.telephony.PhoneStateListener;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
@@ -110,13 +99,11 @@ import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.HexDump;
import com.android.internal.util.Preconditions;
-import com.android.server.NativeDaemonConnector.Command;
-import com.android.server.NativeDaemonConnector.SensitiveArg;
+
import com.google.android.collect.Maps;
import java.io.BufferedReader;
import java.io.DataInputStream;
-import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
@@ -124,15 +111,11 @@ import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InterfaceAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
import java.util.concurrent.CountDownLatch;
/**
@@ -2153,28 +2136,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub
}
@Override
- public void startClatd(String interfaceName) throws IllegalStateException {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- try {
- mNetdService.clatdStart(interfaceName);
- } catch (RemoteException | ServiceSpecificException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
- public void stopClatd(String interfaceName) throws IllegalStateException {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- try {
- mNetdService.clatdStop(interfaceName);
- } catch (RemoteException | ServiceSpecificException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
public void registerNetworkActivityListener(INetworkActivityListener listener) {
mNetworkActivityListeners.register(listener);
}
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index f27d37315ada..8adc416fda95 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -16,6 +16,7 @@
package com.android.server;
+import android.annotation.Nullable;
import android.content.Context;
import android.os.Environment;
import android.os.Handler;
@@ -29,6 +30,7 @@ import android.util.Slog;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.XmlUtils;
@@ -46,8 +48,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
/**
* Monitors the health of packages on the system and notifies interested observers when packages
@@ -58,7 +62,7 @@ public class PackageWatchdog {
// Duration to count package failures before it resets to 0
private static final int TRIGGER_DURATION_MS = 60000;
// Number of package failures within the duration above before we notify observers
- private static final int TRIGGER_FAILURE_COUNT = 5;
+ static final int TRIGGER_FAILURE_COUNT = 5;
private static final int DB_VERSION = 1;
private static final String TAG_PACKAGE_WATCHDOG = "package-watchdog";
private static final String TAG_PACKAGE = "package";
@@ -75,20 +79,13 @@ public class PackageWatchdog {
// Handler to run package cleanup runnables
private final Handler mTimerHandler;
private final Handler mIoHandler;
- // Contains (observer-name -> external-observer-handle) that have been registered during the
- // current boot.
- // It is populated when observers call #registerHealthObserver and it does not survive reboots.
- @GuardedBy("mLock")
- final ArrayMap<String, PackageHealthObserver> mRegisteredObservers = new ArrayMap<>();
- // Contains (observer-name -> internal-observer-handle) that have ever been registered from
+ // Contains (observer-name -> observer-handle) that have ever been registered from
// previous boots. Observers with all packages expired are periodically pruned.
// It is saved to disk on system shutdown and repouplated on startup so it survives reboots.
@GuardedBy("mLock")
- final ArrayMap<String, ObserverInternal> mAllObservers = new ArrayMap<>();
+ private final ArrayMap<String, ObserverInternal> mAllObservers = new ArrayMap<>();
// File containing the XML data of monitored packages /data/system/package-watchdog.xml
- private final AtomicFile mPolicyFile =
- new AtomicFile(new File(new File(Environment.getDataDirectory(), "system"),
- "package-watchdog.xml"));
+ private final AtomicFile mPolicyFile;
// Runnable to prune monitored packages that have expired
private final Runnable mPackageCleanup;
// Last SystemClock#uptimeMillis a package clean up was executed.
@@ -98,14 +95,32 @@ public class PackageWatchdog {
// 0 if mPackageCleanup not running.
private long mDurationAtLastReschedule;
+ // TODO(zezeozue): Remove redundant context param
private PackageWatchdog(Context context) {
mContext = context;
+ mPolicyFile = new AtomicFile(new File(new File(Environment.getDataDirectory(), "system"),
+ "package-watchdog.xml"));
mTimerHandler = new Handler(Looper.myLooper());
mIoHandler = BackgroundThread.getHandler();
mPackageCleanup = this::rescheduleCleanup;
loadFromFile();
}
+ /**
+ * Creates a PackageWatchdog for testing that uses the same {@code looper} for all handlers
+ * and creates package-watchdog.xml in an apps data directory.
+ */
+ @VisibleForTesting
+ PackageWatchdog(Context context, Looper looper) {
+ mContext = context;
+ mPolicyFile = new AtomicFile(new File(context.getFilesDir(), "package-watchdog.xml"));
+ mTimerHandler = new Handler(looper);
+ mIoHandler = mTimerHandler;
+ mPackageCleanup = this::rescheduleCleanup;
+ loadFromFile();
+ }
+
+
/** Creates or gets singleton instance of PackageWatchdog. */
public static PackageWatchdog getInstance(Context context) {
synchronized (PackageWatchdog.class) {
@@ -124,7 +139,10 @@ public class PackageWatchdog {
*/
public void registerHealthObserver(PackageHealthObserver observer) {
synchronized (mLock) {
- mRegisteredObservers.put(observer.getName(), observer);
+ ObserverInternal internalObserver = mAllObservers.get(observer.getName());
+ if (internalObserver != null) {
+ internalObserver.mRegisteredObserver = observer;
+ }
if (mDurationAtLastReschedule == 0) {
// Nothing running, schedule
rescheduleCleanup();
@@ -143,7 +161,7 @@ public class PackageWatchdog {
* or {@code durationMs} is less than 1
*/
public void startObservingHealth(PackageHealthObserver observer, List<String> packageNames,
- int durationMs) {
+ long durationMs) {
if (packageNames.isEmpty() || durationMs < 1) {
throw new IllegalArgumentException("Observation not started, no packages specified"
+ "or invalid duration");
@@ -180,11 +198,32 @@ public class PackageWatchdog {
public void unregisterHealthObserver(PackageHealthObserver observer) {
synchronized (mLock) {
mAllObservers.remove(observer.getName());
- mRegisteredObservers.remove(observer.getName());
}
saveToFileAsync();
}
+ /**
+ * Returns packages observed by {@code observer}
+ *
+ * @return an empty set if {@code observer} has some packages observerd from a previous boot
+ * but has not registered itself in the current boot to receive notifications. Returns null
+ * if there are no active packages monitored from any boot.
+ */
+ @Nullable
+ public Set<String> getPackages(PackageHealthObserver observer) {
+ synchronized (mLock) {
+ for (int i = 0; i < mAllObservers.size(); i++) {
+ if (observer.getName().equals(mAllObservers.keyAt(i))) {
+ if (observer.equals(mAllObservers.valueAt(i).mRegisteredObserver)) {
+ return mAllObservers.valueAt(i).mPackages.keySet();
+ }
+ return Collections.emptySet();
+ }
+ }
+ }
+ return null;
+ }
+
// TODO(zezeozue:) Accept current versionCodes of failing packages?
/**
* Called when a process fails either due to a crash or ANR.
@@ -198,33 +237,35 @@ public class PackageWatchdog {
public void onPackageFailure(String[] packages) {
ArrayMap<String, List<PackageHealthObserver>> packagesToReport = new ArrayMap<>();
synchronized (mLock) {
- if (mRegisteredObservers.isEmpty()) {
+ if (mAllObservers.isEmpty()) {
return;
}
for (int pIndex = 0; pIndex < packages.length; pIndex++) {
+ // Observers interested in receiving packageName failures
+ List<PackageHealthObserver> observersToNotify = new ArrayList<>();
for (int oIndex = 0; oIndex < mAllObservers.size(); oIndex++) {
- // Observers interested in receiving packageName failures
- List<PackageHealthObserver> observersToNotify = new ArrayList<>();
- PackageHealthObserver activeObserver =
- mRegisteredObservers.get(mAllObservers.valueAt(oIndex).mName);
- if (activeObserver != null) {
- observersToNotify.add(activeObserver);
- }
-
- // Save interested observers and notify them outside the lock
- if (!observersToNotify.isEmpty()) {
- packagesToReport.put(packages[pIndex], observersToNotify);
+ PackageHealthObserver registeredObserver =
+ mAllObservers.valueAt(oIndex).mRegisteredObserver;
+ if (registeredObserver != null) {
+ observersToNotify.add(registeredObserver);
}
}
+ // Save interested observers and notify them outside the lock
+ if (!observersToNotify.isEmpty()) {
+ packagesToReport.put(packages[pIndex], observersToNotify);
+ }
}
}
// Notify observers
for (int pIndex = 0; pIndex < packagesToReport.size(); pIndex++) {
List<PackageHealthObserver> observers = packagesToReport.valueAt(pIndex);
+ String packageName = packages[pIndex];
for (int oIndex = 0; oIndex < observers.size(); oIndex++) {
- if (observers.get(oIndex).onHealthCheckFailed(packages[pIndex])) {
+ PackageHealthObserver observer = observers.get(oIndex);
+ if (mAllObservers.get(observer.getName()).onPackageFailure(packageName)
+ && observer.onHealthCheckFailed(packageName)) {
// Observer has handled, do not notify others
break;
}
@@ -275,10 +316,12 @@ public class PackageWatchdog {
// O if mPackageCleanup not running
long elapsedDurationMs = mUptimeAtLastRescheduleMs == 0
? 0 : uptimeMs - mUptimeAtLastRescheduleMs;
- // O if mPackageCleanup not running
+ // Less than O if mPackageCleanup unexpectedly didn't run yet even though
+ // and we are past the last duration scheduled to run
long remainingDurationMs = mDurationAtLastReschedule - elapsedDurationMs;
-
- if (mUptimeAtLastRescheduleMs == 0 || nextDurationToScheduleMs < remainingDurationMs) {
+ if (mUptimeAtLastRescheduleMs == 0
+ || remainingDurationMs <= 0
+ || nextDurationToScheduleMs < remainingDurationMs) {
// First schedule or an earlier reschedule
pruneObservers(elapsedDurationMs);
mTimerHandler.removeCallbacks(mPackageCleanup);
@@ -305,6 +348,7 @@ public class PackageWatchdog {
}
}
Slog.v(TAG, "Earliest package time is " + shortestDurationMs);
+
return shortestDurationMs;
}
@@ -409,6 +453,8 @@ public class PackageWatchdog {
static class ObserverInternal {
public final String mName;
public final ArrayMap<String, MonitoredPackage> mPackages;
+ @Nullable
+ public PackageHealthObserver mRegisteredObserver;
ObserverInternal(String name, List<MonitoredPackage> packages) {
mName = name;
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index a9f190c84cca..62da3f8e01ba 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -34,9 +34,9 @@ import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.StatsLog;
import com.android.internal.util.ArrayUtils;
-import com.android.server.pm.PackageManagerService;
import java.io.File;
@@ -179,6 +179,7 @@ public class RescueParty {
}
private static void executeRescueLevelInternal(Context context, int level) throws Exception {
+ StatsLog.write(StatsLog.RESCUE_PARTY_RESET_REPORTED, level);
switch (level) {
case LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS:
resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS);
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 3eec71368036..2b9b2c992b23 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -781,6 +781,13 @@ class StorageManagerService extends IStorageManager.Stub
});
refreshZramSettings();
+ // Schedule zram writeback unless zram is disabled by persist.sys.zram_enabled
+ String zramPropValue = SystemProperties.get(ZRAM_ENABLED_PROPERTY);
+ if (!zramPropValue.equals("0")
+ && mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_zramWriteback)) {
+ ZramWriteback.scheduleZramWriteback(mContext);
+ }
// Toggle isolated-enable system property in response to settings
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.ISOLATED_STORAGE_REMOTE),
@@ -814,6 +821,12 @@ class StorageManagerService extends IStorageManager.Stub
// changing the property value. There's no race: we're the
// sole writer.
SystemProperties.set(ZRAM_ENABLED_PROPERTY, desiredPropertyValue);
+ // Schedule writeback only if zram is being enabled.
+ if (desiredPropertyValue.equals("1")
+ && mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_zramWriteback)) {
+ ZramWriteback.scheduleZramWriteback(mContext);
+ }
}
}
@@ -3308,7 +3321,8 @@ class StorageManagerService extends IStorageManager.Stub
}
final int mountMode = mAmInternal.getStorageMountMode(pid, uid);
- if (mountMode == Zygote.MOUNT_EXTERNAL_FULL) {
+ if (mountMode == Zygote.MOUNT_EXTERNAL_FULL
+ || mountMode == Zygote.MOUNT_EXTERNAL_LEGACY) {
return path;
}
@@ -3683,12 +3697,13 @@ class StorageManagerService extends IStorageManager.Stub
return Zygote.MOUNT_EXTERNAL_FULL;
} else if (mIAppOpsService.checkOperation(OP_LEGACY_STORAGE, uid,
packageName) == MODE_ALLOWED) {
- // TODO: define a specific "legacy" mount mode
- return Zygote.MOUNT_EXTERNAL_FULL;
+ return Zygote.MOUNT_EXTERNAL_LEGACY;
} else if (mIPackageManager.checkUidPermission(INSTALL_PACKAGES, uid)
== PERMISSION_GRANTED || mIAppOpsService.checkOperation(
OP_REQUEST_INSTALL_PACKAGES, uid, packageName) == MODE_ALLOWED) {
return Zygote.MOUNT_EXTERNAL_INSTALLER;
+ } else if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
+ return Zygote.MOUNT_EXTERNAL_NONE;
} else {
return Zygote.MOUNT_EXTERNAL_WRITE;
}
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
new file mode 100644
index 000000000000..16b12f1f1d68
--- /dev/null
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -0,0 +1,15 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksMockingServicesTests",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index e10e0d6ef1ce..aa2389056c13 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -32,8 +32,11 @@ import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.telephony.CallAttributes;
+import android.telephony.CallQuality;
import android.telephony.CellInfo;
import android.telephony.CellLocation;
+import android.telephony.DataFailCause;
import android.telephony.DisconnectCause;
import android.telephony.LocationAccessPolicy;
import android.telephony.PhoneCapability;
@@ -47,6 +50,7 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.data.ApnSetting;
import android.telephony.emergency.EmergencyNumber;
import android.util.LocalLog;
import android.util.StatsLog;
@@ -171,6 +175,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
private ServiceState[] mServiceState;
+ private int[] mNetworkType;
+
private int[] mVoiceActivationState;
private int[] mDataActivationState;
@@ -200,6 +206,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList;
+ private CallQuality mCallQuality;
+
+ private CallAttributes mCallAttributes;
+
private int[] mSrvccState;
private int mDefaultSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -356,6 +366,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mDataConnectionNetworkType = new int[numPhones];
mCallIncomingNumber = new String[numPhones];
mServiceState = new ServiceState[numPhones];
+ mNetworkType = new int[numPhones];
mVoiceActivationState = new int[numPhones];
mDataActivationState = new int[numPhones];
mUserMobileDataState = new boolean[numPhones];
@@ -375,6 +386,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mDataActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
mCallIncomingNumber[i] = "";
mServiceState[i] = new ServiceState();
+ mNetworkType[i] = mServiceState[i].getVoiceNetworkType();
mSignalStrength[i] = new SignalStrength();
mUserMobileDataState[i] = false;
mMessageWaiting[i] = false;
@@ -805,6 +817,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
remove(r.binder);
}
}
+ if ((events & PhoneStateListener.LISTEN_CALL_ATTRIBUTES_CHANGED) != 0) {
+ try {
+ r.callback.onCallAttributesChanged(mCallAttributes);
+ } catch (RemoteException ex) {
+ remove(r.binder);
+ }
+ }
}
}
} else {
@@ -955,6 +974,21 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (validatePhoneId(phoneId)) {
mServiceState[phoneId] = state;
+ boolean notifyCallAttributes = true;
+ if (mNetworkType[phoneId] != mServiceState[phoneId].getVoiceNetworkType()) {
+ mNetworkType[phoneId] = state.getVoiceNetworkType();
+ mCallAttributes = new CallAttributes(mPreciseCallState, mNetworkType[phoneId],
+ mCallQuality);
+ } else {
+ // No change to network type, so no need to notify call attributes
+ notifyCallAttributes = false;
+ }
+
+ if (mCallQuality == null) {
+ // No call quality reported yet, so no need to notify call attributes
+ notifyCallAttributes = false;
+ }
+
for (Record r : mRecords) {
if (VDBG) {
log("notifyServiceStateForSubscriber: r=" + r + " subId=" + subId
@@ -973,6 +1007,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mRemoveList.add(r.binder);
}
}
+ if (notifyCallAttributes && r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_CALL_ATTRIBUTES_CHANGED)) {
+ try {
+ r.callback.onCallAttributesChanged(mCallAttributes);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
}
} else {
log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId);
@@ -1366,7 +1408,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mDataConnectionNetworkType[phoneId] = networkType;
}
mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType,
- apnType, apn, linkProperties, "");
+ ApnSetting.getApnTypesBitmaskFromString(apnType), apn,
+ linkProperties, DataFailCause.NONE);
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
@@ -1384,7 +1427,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
broadcastDataConnectionStateChanged(state, isDataAllowed, apn, apnType, linkProperties,
networkCapabilities, roaming, subId);
broadcastPreciseDataConnectionStateChanged(state, networkType, apnType, apn,
- linkProperties, "");
+ linkProperties, DataFailCause.NONE);
}
public void notifyDataConnectionFailed(String apnType) {
@@ -1403,7 +1446,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) {
mPreciseDataConnectionState = new PreciseDataConnectionState(
TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN,
- apnType, "", null, "");
+ ApnSetting.getApnTypesBitmaskFromString(apnType), "", null,
+ DataFailCause.NONE);
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
@@ -1418,7 +1462,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
broadcastDataConnectionFailed(apnType, subId);
broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN,
- TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null, "");
+ TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null,
+ DataFailCause.NONE);
}
public void notifyCellLocation(Bundle cellLocation) {
@@ -1479,7 +1524,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
public void notifyPreciseCallState(int ringingCallState, int foregroundCallState,
- int backgroundCallState) {
+ int backgroundCallState, int phoneId) {
if (!checkNotifyPermission("notifyPreciseCallState()")) {
return;
}
@@ -1491,6 +1536,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
backgroundCallState,
DisconnectCause.NOT_VALID,
PreciseDisconnectCause.NOT_VALID);
+ boolean notifyCallAttributes = true;
+ if (mCallQuality == null) {
+ log("notifyPreciseCallState: mCallQuality is null, skipping call attributes");
+ notifyCallAttributes = false;
+ } else {
+ mCallAttributes = new CallAttributes(mPreciseCallState, mNetworkType[phoneId],
+ mCallQuality);
+ }
+
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) {
try {
@@ -1499,6 +1553,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mRemoveList.add(r.binder);
}
}
+ if (notifyCallAttributes && r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_CALL_ATTRIBUTES_CHANGED)) {
+ try {
+ r.callback.onCallAttributesChanged(mCallAttributes);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
}
handleRemoveListLocked();
}
@@ -1528,14 +1590,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
}
- public void notifyPreciseDataConnectionFailed(String apnType, String apn, String failCause) {
+ public void notifyPreciseDataConnectionFailed(String apnType,
+ String apn, @DataFailCause.FailCause int failCause) {
if (!checkNotifyPermission("notifyPreciseDataConnectionFailed()")) {
return;
}
synchronized (mRecords) {
mPreciseDataConnectionState = new PreciseDataConnectionState(
TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN,
- apnType, apn, null, failCause);
+ ApnSetting.getApnTypesBitmaskFromString(apnType), apn, null, failCause);
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
@@ -1715,6 +1778,36 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
}
+ @Override
+ public void notifyCallQualityChanged(CallQuality callQuality, int phoneId) {
+ if (!checkNotifyPermission("notifyCallQualityChanged()")) {
+ return;
+ }
+
+ // merge CallQuality with PreciseCallState and network type
+ mCallQuality = callQuality;
+ mCallAttributes = new CallAttributes(mPreciseCallState,
+ mNetworkType[phoneId],
+ callQuality);
+
+ synchronized (mRecords) {
+ TelephonyManager tm = (TelephonyManager) mContext.getSystemService(
+ Context.TELEPHONY_SERVICE);
+
+ for (Record r : mRecords) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_CALL_ATTRIBUTES_CHANGED)) {
+ try {
+ r.callback.onCallAttributesChanged(mCallAttributes);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
+ }
+ handleRemoveListLocked();
+ }
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
@@ -1732,6 +1825,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
pw.println("mCallState=" + mCallState[i]);
pw.println("mCallIncomingNumber=" + mCallIncomingNumber[i]);
pw.println("mServiceState=" + mServiceState[i]);
+ pw.println("mNetworkType=" + mNetworkType[i]);
pw.println("mVoiceActivationState= " + mVoiceActivationState[i]);
pw.println("mDataActivationState= " + mDataActivationState[i]);
pw.println("mUserMobileDataState= " + mUserMobileDataState[i]);
@@ -1757,6 +1851,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
pw.println("mPreferredDataSubId=" + mPreferredDataSubId);
pw.println("mRadioPowerState=" + mRadioPowerState);
pw.println("mEmergencyNumberList=" + mEmergencyNumberList);
+ pw.println("mCallQuality=" + mCallQuality);
+ pw.println("mCallAttributes=" + mCallAttributes);
pw.decreaseIndent();
@@ -1928,9 +2024,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
private void broadcastPreciseDataConnectionStateChanged(int state, int networkType,
- String apnType, String apn,
- LinkProperties linkProperties,
- String failCause) {
+ String apnType, String apn, LinkProperties linkProperties,
+ @DataFailCause.FailCause int failCause) {
Intent intent = new Intent(TelephonyManager.ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED);
intent.putExtra(PhoneConstants.STATE_KEY, state);
intent.putExtra(PhoneConstants.DATA_NETWORK_TYPE_KEY, networkType);
@@ -1939,7 +2034,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (linkProperties != null) {
intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties);
}
- if (failCause != null) intent.putExtra(PhoneConstants.DATA_FAILURE_CAUSE_KEY, failCause);
+ intent.putExtra(PhoneConstants.DATA_FAILURE_CAUSE_KEY, failCause);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
android.Manifest.permission.READ_PRECISE_PHONE_STATE);
@@ -2015,6 +2110,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
android.Manifest.permission.READ_PRECISE_PHONE_STATE, null);
}
+ if ((events & PhoneStateListener.LISTEN_CALL_ATTRIBUTES_CHANGED) != 0) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE, null);
+ }
+
return true;
}
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 9f353a80a5be..ea6d435c7ba5 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -141,6 +141,7 @@ public class VibratorService extends IVibratorService.Stub
private boolean mLowPowerMode;
private int mHapticFeedbackIntensity;
private int mNotificationIntensity;
+ private int mRingIntensity;
native static boolean vibratorExists();
native static void vibratorInit();
@@ -149,6 +150,8 @@ public class VibratorService extends IVibratorService.Stub
native static boolean vibratorSupportsAmplitudeControl();
native static void vibratorSetAmplitude(int amplitude);
native static long vibratorPerformEffect(long effect, long strength);
+ static native boolean vibratorSupportsExternalControl();
+ static native void vibratorSetExternalControl(boolean enabled);
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
@@ -426,6 +429,10 @@ public class VibratorService extends IVibratorService.Stub
Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY),
true, mSettingObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY),
+ true, mSettingObserver, UserHandle.USER_ALL);
+
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -532,12 +539,6 @@ public class VibratorService extends IVibratorService.Stub
return;
}
verifyIncomingUid(uid);
- if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
- > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
- Slog.e(TAG, "Ignoring incoming vibration as process with uid = "
- + uid + " is background");
- return;
- }
if (!verifyVibrationEffect(effect)) {
return;
}
@@ -575,6 +576,13 @@ public class VibratorService extends IVibratorService.Stub
}
Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason);
+ if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
+ > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
+ && vib.isHapticFeedback()) {
+ Slog.e(TAG, "Ignoring incoming vibration as process with uid = "
+ + uid + " is background");
+ return;
+ }
linkVibration(vib);
long ident = Binder.clearCallingIdentity();
try {
@@ -745,7 +753,9 @@ public class VibratorService extends IVibratorService.Stub
}
private int getCurrentIntensityLocked(Vibration vib) {
- if (vib.isNotification() || vib.isRingtone()){
+ if (vib.isRingtone()) {
+ return mRingIntensity;
+ } else if (vib.isNotification()) {
return mNotificationIntensity;
} else if (vib.isHapticFeedback()) {
return mHapticFeedbackIntensity;
@@ -767,7 +777,9 @@ public class VibratorService extends IVibratorService.Stub
}
final int defaultIntensity;
- if (vib.isNotification() || vib.isRingtone()) {
+ if (vib.isRingtone()) {
+ defaultIntensity = mVibrator.getDefaultRingVibrationIntensity();
+ } else if (vib.isNotification()) {
defaultIntensity = mVibrator.getDefaultNotificationVibrationIntensity();
} else if (vib.isHapticFeedback()) {
defaultIntensity = mVibrator.getDefaultHapticFeedbackIntensity();
@@ -930,6 +942,9 @@ public class VibratorService extends IVibratorService.Stub
mNotificationIntensity = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
mVibrator.getDefaultNotificationVibrationIntensity(), UserHandle.USER_CURRENT);
+ mRingIntensity = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.RING_VIBRATION_INTENSITY,
+ mVibrator.getDefaultRingVibrationIntensity(), UserHandle.USER_CURRENT);
}
@Override
@@ -1278,6 +1293,7 @@ public class VibratorService extends IVibratorService.Stub
pw.println(" mLowPowerMode=" + mLowPowerMode);
pw.println(" mHapticFeedbackIntensity=" + mHapticFeedbackIntensity);
pw.println(" mNotificationIntensity=" + mNotificationIntensity);
+ pw.println(" mRingIntensity=" + mRingIntensity);
pw.println("");
pw.println(" Previous vibrations:");
for (VibrationInfo info : mPreviousVibrations) {
diff --git a/services/core/java/com/android/server/ZramWriteback.java b/services/core/java/com/android/server/ZramWriteback.java
new file mode 100644
index 000000000000..3a4aff2ea9aa
--- /dev/null
+++ b/services/core/java/com/android/server/ZramWriteback.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2019 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;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.FileUtils;
+import android.os.SystemProperties;
+import android.util.Slog;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Schedules jobs for triggering zram writeback.
+ */
+public final class ZramWriteback extends JobService {
+ private static final String TAG = "ZramWriteback";
+ private static final boolean DEBUG = false;
+
+ private static final ComponentName sZramWriteback =
+ new ComponentName("android", ZramWriteback.class.getName());
+
+ private static final int MARK_IDLE_JOB_ID = 811;
+ private static final int WRITEBACK_IDLE_JOB_ID = 812;
+
+ private static final int MAX_ZRAM_DEVICES = 256;
+ private static int sZramDeviceId = 0;
+
+ private static final String IDLE_SYS = "/sys/block/zram%d/idle";
+ private static final String IDLE_SYS_ALL_PAGES = "all";
+
+ private static final String WB_SYS = "/sys/block/zram%d/writeback";
+ private static final String WB_SYS_IDLE_PAGES = "idle";
+
+ private static final String WB_STATS_SYS = "/sys/block/zram%d/bd_stat";
+ private static final int WB_STATS_MAX_FILE_SIZE = 128;
+
+ private static final String BDEV_SYS = "/sys/block/zram%d/backing_dev";
+
+ private static final String MARK_IDLE_DELAY_PROP = "ro.zram.mark_idle_delay_mins";
+ private static final String FIRST_WB_DELAY_PROP = "ro.zram.first_wb_delay_mins";
+ private static final String PERIODIC_WB_DELAY_PROP = "ro.zram.periodic_wb_delay_hours";
+
+ private void markPagesAsIdle() {
+ String idlePath = String.format(IDLE_SYS, sZramDeviceId);
+ try {
+ FileUtils.stringToFile(new File(idlePath), IDLE_SYS_ALL_PAGES);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to write to " + idlePath);
+ }
+ }
+
+ private void flushIdlePages() {
+ if (DEBUG) Slog.d(TAG, "Start writing back idle pages to disk");
+ String wbPath = String.format(WB_SYS, sZramDeviceId);
+ try {
+ FileUtils.stringToFile(new File(wbPath), WB_SYS_IDLE_PAGES);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to write to " + wbPath);
+ }
+ if (DEBUG) Slog.d(TAG, "Finished writeback back idle pages");
+ }
+
+ private int getWrittenPageCount() {
+ String wbStatsPath = String.format(WB_STATS_SYS, sZramDeviceId);
+ try {
+ String wbStats = FileUtils
+ .readTextFile(new File(wbStatsPath), WB_STATS_MAX_FILE_SIZE, "");
+ return Integer.parseInt(wbStats.trim().split("\\s+")[2], 10);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to read writeback stats from " + wbStatsPath);
+ }
+
+ return -1;
+ }
+
+ private void markAndFlushPages() {
+ int pageCount = getWrittenPageCount();
+
+ flushIdlePages();
+ markPagesAsIdle();
+
+ if (pageCount != -1) {
+ Slog.i(TAG, "Total pages written to disk is " + (getWrittenPageCount() - pageCount));
+ }
+ }
+
+ private static boolean isWritebackEnabled() {
+ try {
+ String backingDev = FileUtils
+ .readTextFile(new File(String.format(BDEV_SYS, sZramDeviceId)), 128, "");
+ if (!"none".equals(backingDev.trim())) {
+ return true;
+ } else {
+ Slog.w(TAG, "Writeback device is not set");
+ }
+ } catch (IOException e) {
+ Slog.w(TAG, "Writeback is not enabled on zram");
+ }
+ return false;
+ }
+
+ private static void schedNextWriteback(Context context) {
+ int nextWbDelay = SystemProperties.getInt(PERIODIC_WB_DELAY_PROP, 24);
+ JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+
+ js.schedule(new JobInfo.Builder(WRITEBACK_IDLE_JOB_ID, sZramWriteback)
+ .setMinimumLatency(TimeUnit.HOURS.toMillis(nextWbDelay))
+ .setRequiresDeviceIdle(true)
+ .build());
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+
+ if (!isWritebackEnabled()) {
+ jobFinished(params, false);
+ return false;
+ }
+
+ if (params.getJobId() == MARK_IDLE_JOB_ID) {
+ markPagesAsIdle();
+ jobFinished(params, false);
+ return false;
+ } else {
+ new Thread("ZramWriteback_WritebackIdlePages") {
+ @Override
+ public void run() {
+ markAndFlushPages();
+ schedNextWriteback(ZramWriteback.this);
+ jobFinished(params, false);
+ }
+ }.start();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ // The thread that triggers the writeback is non-interruptible
+ return false;
+ }
+
+ /**
+ * Schedule the zram writeback job to trigger a writeback when idle
+ */
+ public static void scheduleZramWriteback(Context context) {
+ int markIdleDelay = SystemProperties.getInt(MARK_IDLE_DELAY_PROP, 20);
+ int firstWbDelay = SystemProperties.getInt(FIRST_WB_DELAY_PROP, 180);
+
+ JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+
+ // Schedule a one time job to mark pages as idle. These pages will be written
+ // back at later point if they remain untouched.
+ js.schedule(new JobInfo.Builder(MARK_IDLE_JOB_ID, sZramWriteback)
+ .setMinimumLatency(TimeUnit.MINUTES.toMillis(markIdleDelay))
+ .build());
+
+ // Schedule a one time job to flush idle pages to disk.
+ // After the initial writeback, subsequent writebacks are done at interval set
+ // by ro.zram.periodic_wb_delay_hours.
+ js.schedule(new JobInfo.Builder(WRITEBACK_IDLE_JOB_ID, sZramWriteback)
+ .setMinimumLatency(TimeUnit.MINUTES.toMillis(firstWbDelay))
+ .setRequiresDeviceIdle(true)
+ .build());
+ }
+}
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index e5ab8fc84d97..c31691551269 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -31,6 +31,7 @@ import android.os.RemoteException;
import android.os.SystemProperties;
import android.provider.Settings;
import android.service.adb.AdbServiceDumpProto;
+import android.sysprop.AdbProperties;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -185,7 +186,7 @@ public class AdbService extends IAdbManager.Stub {
mContext = context;
mContentResolver = context.getContentResolver();
- boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
+ boolean secureAdbEnabled = AdbProperties.secure().orElse(false);
boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
if (secureAdbEnabled && !dataEncrypted) {
mDebuggingManager = new AdbDebuggingManager(context);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index d176a9e94a60..6151276d640d 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -132,6 +132,9 @@ public final class ActiveServices {
// calling startForeground() before we ANR + stop it.
static final int SERVICE_START_FOREGROUND_TIMEOUT = 10*1000;
+ // For how long after a whitelisted service's start its process can start a background activity
+ private static final int SERVICE_BG_ACTIVITY_START_TIMEOUT_MS = 10*1000;
+
final ActivityManagerService mAm;
// Maximum number of services that we allow to start in the background
@@ -404,6 +407,14 @@ public final class ActiveServices {
ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType,
int callingPid, int callingUid, boolean fgRequired, String callingPackage, final int userId)
throws TransactionTooLargeException {
+ return startServiceLocked(caller, service, resolvedType, callingPid, callingUid, fgRequired,
+ callingPackage, userId, false);
+ }
+
+ ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType,
+ int callingPid, int callingUid, boolean fgRequired, String callingPackage,
+ final int userId, boolean allowBackgroundActivityStarts)
+ throws TransactionTooLargeException {
if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "startService: " + service
+ " type=" + resolvedType + " args=" + service.getExtras());
@@ -511,7 +522,7 @@ public final class ActiveServices {
}
// This app knows it is in the new model where this operation is not
// allowed, so tell it what has happened.
- UidRecord uidRec = mAm.mActiveUids.get(r.appInfo.uid);
+ UidRecord uidRec = mAm.mProcessList.getUidRecordLocked(r.appInfo.uid);
return new ComponentName("?", "app is in background uid " + uidRec);
}
}
@@ -628,10 +639,28 @@ public final class ActiveServices {
}
}
+ if (allowBackgroundActivityStarts) {
+ ProcessRecord proc = mAm.getProcessRecordLocked(r.processName, r.appInfo.uid, false);
+ if (proc != null) {
+ proc.addAllowBackgroundActivityStartsToken(r);
+ // schedule removal of the whitelisting token after the timeout
+ removeAllowBackgroundActivityStartsServiceToken(proc, r,
+ SERVICE_BG_ACTIVITY_START_TIMEOUT_MS);
+ }
+ }
ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting);
return cmp;
}
+ private void removeAllowBackgroundActivityStartsServiceToken(ProcessRecord proc,
+ ServiceRecord r, int delayMillis) {
+ mAm.mHandler.postDelayed(() -> {
+ if (proc != null) {
+ proc.removeAllowBackgroundActivityStartsToken(r);
+ }
+ }, delayMillis);
+ }
+
private boolean requestStartTargetPermissionsReviewIfNeededLocked(ServiceRecord r,
String callingPackage, int callingUid, Intent service, boolean callerFg,
final int userId) {
@@ -716,7 +745,7 @@ public final class ActiveServices {
private void stopServiceLocked(ServiceRecord service) {
if (service.delayed) {
- // If service isn't actually running, but is is being held in the
+ // If service isn't actually running, but is being held in the
// delayed list, then we need to keep it started but note that it
// should be stopped once no longer delayed.
if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Delaying stop of pending: " + service);
@@ -758,6 +787,9 @@ public final class ActiveServices {
if (r.record != null) {
final long origId = Binder.clearCallingIdentity();
try {
+ // immediately remove bg activity whitelisting token if there was one
+ removeAllowBackgroundActivityStartsServiceToken(callerApp, r.record,
+ 0 /* delayMillis */);
stopServiceLocked(r.record);
} finally {
Binder.restoreCallingIdentity(origId);
@@ -1660,6 +1692,10 @@ public final class ActiveServices {
}
}
+ if ((flags & Context.BIND_RESTRICT_ASSOCIATIONS) != 0) {
+ mAm.requireAllowedAssociationsLocked(s.appInfo.packageName);
+ }
+
mAm.startAssociationLocked(callerApp.uid, callerApp.processName,
callerApp.getCurProcState(), s.appInfo.uid, s.appInfo.longVersionCode,
s.instanceName, s.processName);
@@ -2569,6 +2605,9 @@ public final class ActiveServices {
&& r.serviceInfo.packageName.equals(WebViewZygote.getPackageName())) {
hostingType = "webview_service";
}
+ if ((r.serviceInfo.flags & ServiceInfo.FLAG_USE_APP_ZYGOTE) != 0) {
+ hostingType = "app_zygote";
+ }
}
// Not running -- get it started, and enqueue this service record
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 010fe3bebcc0..14ef06e2d0dd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -72,6 +72,12 @@ final class ActivityManagerConstants extends ContentObserver {
static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time";
static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration";
static final String KEY_USE_COMPACTION = "use_compaction";
+ static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
+ static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
+ static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
+ static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
+ static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
+ static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
private static final int DEFAULT_MAX_CACHED_PROCESSES =
SystemProperties.getInt("ro.vendor.qti.sys.fw.bg_apps_limit",32);
@@ -104,6 +110,12 @@ final class ActivityManagerConstants extends ContentObserver {
private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;
private static final boolean DEFAULT_USE_COMPACTION = false;
+ public static final int DEFAULT_COMPACT_ACTION_1 = 1;
+ public static final int DEFAULT_COMPACT_ACTION_2 = 3;
+ public static final long DEFAULT_COMPACT_THROTTLE_1 = 5000;
+ public static final long DEFAULT_COMPACT_THROTTLE_2 = 10000;
+ public static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
+ public static final long DEFAULT_COMPACT_THROTTLE_4 = 10000;
// Maximum number of cached processes we will allow.
public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
@@ -226,6 +238,20 @@ final class ActivityManagerConstants extends ContentObserver {
// Use compaction for background apps.
public boolean USE_COMPACTION = DEFAULT_USE_COMPACTION;
+ // Action for compactAppSome.
+ public int COMPACT_ACTION_1 = DEFAULT_COMPACT_ACTION_1;
+ // Action for compactAppFull;
+ public int COMPACT_ACTION_2 = DEFAULT_COMPACT_ACTION_2;
+
+ // How long we'll skip second compactAppSome after first compactAppSome
+ public long COMPACT_THROTTLE_1 = DEFAULT_COMPACT_THROTTLE_1;
+ // How long we'll skip compactAppSome after compactAppFull
+ public long COMPACT_THROTTLE_2 = DEFAULT_COMPACT_THROTTLE_2;
+ // How long we'll skip compactAppFull after compactAppSome
+ public long COMPACT_THROTTLE_3 = DEFAULT_COMPACT_THROTTLE_3;
+ // How long we'll skip second compactAppFull after first compactAppFull
+ public long COMPACT_THROTTLE_4 = DEFAULT_COMPACT_THROTTLE_4;
+
// Indicates whether the activity starts logging is enabled.
// Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED
volatile boolean mFlagActivityStartsLoggingEnabled;
@@ -415,6 +441,12 @@ final class ActivityManagerConstants extends ContentObserver {
TOP_TO_FGS_GRACE_DURATION = mParser.getDurationMillis(KEY_TOP_TO_FGS_GRACE_DURATION,
DEFAULT_TOP_TO_FGS_GRACE_DURATION);
USE_COMPACTION = mParser.getBoolean(KEY_USE_COMPACTION, DEFAULT_USE_COMPACTION);
+ COMPACT_ACTION_1 = mParser.getInt(KEY_COMPACT_ACTION_1, DEFAULT_COMPACT_ACTION_1);
+ COMPACT_ACTION_2 = mParser.getInt(KEY_COMPACT_ACTION_2, DEFAULT_COMPACT_ACTION_2);
+ COMPACT_THROTTLE_1 = mParser.getLong(KEY_COMPACT_THROTTLE_1, DEFAULT_COMPACT_THROTTLE_1);
+ COMPACT_THROTTLE_2 = mParser.getLong(KEY_COMPACT_THROTTLE_2, DEFAULT_COMPACT_THROTTLE_2);
+ COMPACT_THROTTLE_3 = mParser.getLong(KEY_COMPACT_THROTTLE_3, DEFAULT_COMPACT_THROTTLE_3);
+ COMPACT_THROTTLE_4 = mParser.getLong(KEY_COMPACT_THROTTLE_4, DEFAULT_COMPACT_THROTTLE_4);
updateMaxCachedProcesses();
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 3717f1a9cf4c..fa63fb6333a6 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -24,8 +24,6 @@ import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.Manifest.permission.REMOVE_TASKS;
import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS;
import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL;
-import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
-import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
@@ -34,6 +32,7 @@ import static android.app.AppOpsManager.OP_NONE;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT;
import static android.content.pm.PackageManager.GET_PROVIDERS;
+import static android.content.pm.PackageManager.MATCH_ALL;
import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
@@ -50,6 +49,7 @@ import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
import static android.os.IServiceManager.DUMP_FLAG_PROTO;
import static android.os.Process.BLUETOOTH_UID;
import static android.os.Process.FIRST_APPLICATION_UID;
+import static android.os.Process.NETWORK_STACK_UID;
import static android.os.Process.NFC_UID;
import static android.os.Process.PHONE_UID;
import static android.os.Process.PROC_CHAR;
@@ -58,16 +58,11 @@ import static android.os.Process.PROC_PARENS;
import static android.os.Process.PROC_SPACE_TERM;
import static android.os.Process.ROOT_UID;
import static android.os.Process.SCHED_FIFO;
-import static android.os.Process.SCHED_OTHER;
import static android.os.Process.SCHED_RESET_ON_FORK;
import static android.os.Process.SE_UID;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SIGNAL_USR1;
import static android.os.Process.SYSTEM_UID;
-import static android.os.Process.THREAD_GROUP_BG_NONINTERACTIVE;
-import static android.os.Process.THREAD_GROUP_DEFAULT;
-import static android.os.Process.THREAD_GROUP_RESTRICTED;
-import static android.os.Process.THREAD_GROUP_TOP_APP;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.os.Process.getTotalMemory;
import static android.os.Process.isThreadInProcess;
@@ -96,11 +91,9 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_BACKGROUND;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_LIGHT;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_NETWORK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ_REASON;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESSES;
@@ -109,7 +102,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROVIDER;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SERVICE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_WHITELISTS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
@@ -236,6 +228,7 @@ import android.media.audiofx.AudioEffect;
import android.net.Proxy;
import android.net.ProxyInfo;
import android.net.Uri;
+import android.os.AppZygote;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.BinderProxy;
@@ -332,7 +325,6 @@ import com.android.internal.util.Preconditions;
import com.android.internal.util.function.QuadFunction;
import com.android.internal.util.function.TriFunction;
import com.android.server.AlarmManagerInternal;
-import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.DeviceIdleController;
import com.android.server.DisplayThread;
@@ -351,6 +343,7 @@ import com.android.server.ThreadPriorityBooster;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
import com.android.server.am.MemoryStatUtil.MemoryStat;
+import com.android.server.appop.AppOpsService;
import com.android.server.firewall.IntentFirewall;
import com.android.server.job.JobSchedulerInternal;
import com.android.server.pm.Installer;
@@ -408,7 +401,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public static final int TOP_APP_PRIORITY_BOOST = -10;
static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityManagerService" : TAG_AM;
- private static final String TAG_BACKUP = TAG + POSTFIX_BACKUP;
+ static final String TAG_BACKUP = TAG + POSTFIX_BACKUP;
private static final String TAG_BROADCAST = TAG + POSTFIX_BROADCAST;
private static final String TAG_CLEANUP = TAG + POSTFIX_CLEANUP;
private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
@@ -416,9 +409,9 @@ public class ActivityManagerService extends IActivityManager.Stub
static final String TAG_LRU = TAG + POSTFIX_LRU;
private static final String TAG_MU = TAG + POSTFIX_MU;
private static final String TAG_NETWORK = TAG + POSTFIX_NETWORK;
- private static final String TAG_OOM_ADJ = TAG + POSTFIX_OOM_ADJ;
+ static final String TAG_OOM_ADJ = TAG + POSTFIX_OOM_ADJ;
private static final String TAG_POWER = TAG + POSTFIX_POWER;
- private static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
+ static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
static final String TAG_PROCESSES = TAG + POSTFIX_PROCESSES;
private static final String TAG_PROVIDER = TAG + POSTFIX_PROVIDER;
static final String TAG_PSS = TAG + POSTFIX_PSS;
@@ -458,6 +451,9 @@ public class ActivityManagerService extends IActivityManager.Stub
// before we decide it must be hung.
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;
+ // How long we wait to kill an application zygote, after the last process using
+ // it has gone away.
+ static final int KILL_APP_ZYGOTE_DELAY_MS = 5 * 1000;
/**
* How long we wait for an provider to be published. Should be longer than
* {@link #CONTENT_PROVIDER_PUBLISH_TIMEOUT}.
@@ -547,6 +543,8 @@ public class ActivityManagerService extends IActivityManager.Stub
/* UX perf event object */
public static BoostFramework mUxPerf = new BoostFramework();
+ final OomAdjuster mOomAdjuster;
+
/** All system services */
SystemServiceManager mSystemServiceManager;
@@ -564,7 +562,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public OomAdjProfiler mOomAdjProfiler = new OomAdjProfiler();
// Whether we should use SCHED_FIFO for UI and RenderThreads.
- private boolean mUseFifoUiScheduling = false;
+ boolean mUseFifoUiScheduling = false;
BroadcastQueue mFgBroadcastQueue;
BroadcastQueue mBgBroadcastQueue;
@@ -663,11 +661,6 @@ public class ActivityManagerService extends IActivityManager.Stub
final ProcessStatsService mProcessStats;
/**
- * Service for compacting background apps.
- */
- final AppCompactor mAppCompact;
-
- /**
* Non-persistent appId whitelist for background restrictions
*/
int[] mBackgroundAppIdWhitelist = new int[] {
@@ -681,9 +674,47 @@ public class ActivityManagerService extends IActivityManager.Stub
/**
* When an app has restrictions on the other apps that can have associations with it,
- * it appears here with a set of the allowed apps.
+ * it appears here with a set of the allowed apps and also track debuggability of the app.
*/
- ArrayMap<String, ArraySet<String>> mAllowedAssociations;
+ ArrayMap<String, PackageAssociationInfo> mAllowedAssociations;
+
+ /**
+ * Tracks association information for a particular package along with debuggability.
+ * <p> Associations for a package A are allowed to package B if B is part of the
+ * allowed associations for A or if A is debuggable.
+ */
+ private final class PackageAssociationInfo {
+ private final String mSourcePackage;
+ private final ArraySet<String> mAllowedPackageAssociations;
+ private boolean mIsDebuggable;
+
+ PackageAssociationInfo(String sourcePackage, ArraySet<String> allowedPackages,
+ boolean isDebuggable) {
+ mSourcePackage = sourcePackage;
+ mAllowedPackageAssociations = allowedPackages;
+ mIsDebuggable = isDebuggable;
+ }
+
+ /**
+ * Returns true if {@code mSourcePackage} is allowed association with
+ * {@code targetPackage}.
+ */
+ boolean isPackageAssociationAllowed(String targetPackage) {
+ return mIsDebuggable || mAllowedPackageAssociations.contains(targetPackage);
+ }
+
+ boolean isDebuggable() {
+ return mIsDebuggable;
+ }
+
+ void setDebuggable(boolean isDebuggable) {
+ mIsDebuggable = isDebuggable;
+ }
+
+ ArraySet<String> getAllowedPackageAssociations() {
+ return mAllowedPackageAssociations;
+ }
+ }
/**
* All of the processes we currently have running organized by pid.
@@ -830,8 +861,6 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
boolean mFullPssPending = false;
- /** Track all uids that have actively running processes. */
- final ActiveUids mActiveUids;
/**
* This is for verifying the UID report flow.
@@ -945,8 +974,8 @@ public class ActivityManagerService extends IActivityManager.Stub
/**
* Backup/restore process management
*/
- String mBackupAppName = null;
- BackupRecord mBackupTarget = null;
+ @GuardedBy("this")
+ final SparseArray<BackupRecord> mBackupTargets = new SparseArray<>();
final ProviderMap mProviderMap;
@@ -1113,32 +1142,7 @@ public class ActivityManagerService extends IActivityManager.Stub
/**
* State of external calls telling us if the device is awake or asleep.
*/
- private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
-
- /**
- * Current sequence id for oom_adj computation traversal.
- */
- int mAdjSeq = 0;
-
- /**
- * Keep track of the non-cached/empty process we last found, to help
- * determine how to distribute cached/empty processes next time.
- */
- int mNumNonCachedProcs = 0;
-
- /**
- * Keep track of the number of cached hidden procs, to balance oom adj
- * distribution between those and empty procs.
- */
- int mNumCachedHiddenProcs = 0;
-
- /**
- * Keep track of the number of service processes we last found, to
- * determine on the next iteration which should be B services.
- */
- int mNumServiceProcs = 0;
- int mNewNumAServiceProcs = 0;
- int mNewNumServiceProcs = 0;
+ int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
/**
* Allow the current computed overall memory level of the system to go down?
@@ -1265,10 +1269,6 @@ public class ActivityManagerService extends IActivityManager.Stub
String mTrackAllocationApp = null;
String mNativeDebuggingApp = null;
- final long[] mTmpLong = new long[3];
-
- private final ArraySet<BroadcastQueue> mTmpBroadcastQueue = new ArraySet();
-
private final Injector mInjector;
static final class ProcessChangeItem {
@@ -1343,6 +1343,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ // TODO: Move below 4 members and code to ProcessList
final RemoteCallbackList<IProcessObserver> mProcessObservers = new RemoteCallbackList<>();
ProcessChangeItem[] mActiveProcessChanges = new ProcessChangeItem[5];
@@ -1455,6 +1456,7 @@ public class ActivityManagerService extends IActivityManager.Stub
static final int PUSH_TEMP_WHITELIST_UI_MSG = 68;
static final int SERVICE_FOREGROUND_CRASH_MSG = 69;
static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70;
+ static final int KILL_APP_ZYGOTE_MSG = 71;
static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -1673,6 +1675,12 @@ public class ActivityManagerService extends IActivityManager.Stub
false, userId, reason);
}
} break;
+ case KILL_APP_ZYGOTE_MSG: {
+ synchronized (ActivityManagerService.this) {
+ final AppZygote appZygote = (AppZygote) msg.obj;
+ mProcessList.killAppZygoteIfNeededLocked(appZygote);
+ }
+ } break;
case CHECK_EXCESSIVE_POWER_USE_MSG: {
synchronized (ActivityManagerService.this) {
checkExcessivePowerUsageLocked();
@@ -1961,7 +1969,8 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
false,
- 0);
+ 0,
+ false);
app.setPersistent(true);
app.pid = MY_PID;
app.getWindowProcessController().setPid(MY_PID);
@@ -2241,12 +2250,15 @@ public class ActivityManagerService extends IActivityManager.Stub
mUiContext = null;
mAppErrors = null;
mPackageWatchdog = null;
- mActiveUids = new ActiveUids(this, false /* postChangesToAtm */);
mAppOpsService = mInjector.getAppOpsService(null /* file */, null /* handler */);
mBatteryStatsService = null;
mHandler = hasHandlerThread ? new MainHandler(handlerThread.getLooper()) : null;
mHandlerThread = handlerThread;
mConstants = hasHandlerThread ? new ActivityManagerConstants(this, mHandler) : null;
+ final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */);
+ mProcessList.init(this, activeUids);
+ mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
+
mIntentFirewall = hasHandlerThread
? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null;
mProcessCpuThread = null;
@@ -2262,7 +2274,6 @@ public class ActivityManagerService extends IActivityManager.Stub
? new PendingIntentController(handlerThread.getLooper(), mUserController) : null;
mProcStartHandlerThread = null;
mProcStartHandler = null;
- mAppCompact = null;
mHiddenApiBlacklist = null;
mFactoryTest = FACTORY_TEST_OFF;
}
@@ -2292,8 +2303,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
mConstants = new ActivityManagerConstants(this, mHandler);
-
- mProcessList.init(this);
+ final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
+ mProcessList.init(this, activeUids);
+ mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
"foreground", BROADCAST_FG_TIMEOUT, false);
@@ -2309,7 +2321,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mProviderMap = new ProviderMap(this);
mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
- mActiveUids = new ActiveUids(this, true /* postChangesToAtm */);
final File systemDir = SystemServiceManager.ensureSystemDir();
@@ -2347,8 +2358,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mStackSupervisor = mActivityTaskManager.mStackSupervisor;
- mAppCompact = new AppCompactor(this);
-
mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
@@ -2395,7 +2404,8 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
Process.THREAD_GROUP_SYSTEM);
- Process.setThreadGroupAndCpuset(mAppCompact.mCompactionThread.getThreadId(),
+ Process.setThreadGroupAndCpuset(
+ mOomAdjuster.mAppCompact.mCompactionThread.getThreadId(),
Process.THREAD_GROUP_SYSTEM);
} catch (Exception e) {
Slog.w(TAG, "Setting background thread cpuset failed");
@@ -2447,32 +2457,82 @@ public class ActivityManagerService extends IActivityManager.Stub
return mBackgroundLaunchBroadcasts;
}
- boolean validateAssociationAllowedLocked(String pkg1, int uid1, String pkg2, int uid2) {
- if (mAllowedAssociations == null) {
- mAllowedAssociations = SystemConfig.getInstance().getAllowedAssociations();
+ /**
+ * Ensures that the given package name has an explicit set of allowed associations.
+ * If it does not, give it an empty set.
+ */
+ void requireAllowedAssociationsLocked(String packageName) {
+ ensureAllowedAssociations();
+ if (mAllowedAssociations.get(packageName) == null) {
+ mAllowedAssociations.put(packageName, new PackageAssociationInfo(packageName,
+ new ArraySet<>(), /* isDebuggable = */ false));
}
+ }
+
+ /**
+ * Returns true if the package {@code pkg1} running under user handle {@code uid1} is
+ * allowed association with the package {@code pkg2} running under user handle {@code uid2}.
+ * <p> If either of the packages are running as part of the core system, then the
+ * association is implicitly allowed.
+ */
+ boolean validateAssociationAllowedLocked(String pkg1, int uid1, String pkg2, int uid2) {
+ ensureAllowedAssociations();
// Interactions with the system uid are always allowed, since that is the core system
- // that everyone needs to be able to interact with.
- if (UserHandle.getAppId(uid1) == SYSTEM_UID) {
+ // that everyone needs to be able to interact with. Also allow reflexive associations
+ // within the same uid.
+ if (uid1 == uid2 || UserHandle.getAppId(uid1) == SYSTEM_UID
+ || UserHandle.getAppId(uid2) == SYSTEM_UID) {
return true;
}
- if (UserHandle.getAppId(uid2) == SYSTEM_UID) {
- return true;
+
+ // Check for association on both source and target packages.
+ PackageAssociationInfo pai = mAllowedAssociations.get(pkg1);
+ if (pai != null && !pai.isPackageAssociationAllowed(pkg2)) {
+ return false;
}
- // We won't allow this association if either pkg1 or pkg2 has a limit on the
- // associations that are allowed with it, and the other package is not explicitly
- // specified as one of those associations.
- ArraySet<String> pkgs = mAllowedAssociations.get(pkg1);
- if (pkgs != null) {
- if (!pkgs.contains(pkg2)) {
- return false;
+ pai = mAllowedAssociations.get(pkg2);
+ if (pai != null && !pai.isPackageAssociationAllowed(pkg1)) {
+ return false;
+ }
+ // If no explicit associations are provided in the manifest, then assume the app is
+ // allowed associations with any package.
+ return true;
+ }
+
+ /** Sets up allowed associations for system prebuilt packages from system config (if needed). */
+ private void ensureAllowedAssociations() {
+ if (mAllowedAssociations == null) {
+ ArrayMap<String, ArraySet<String>> allowedAssociations =
+ SystemConfig.getInstance().getAllowedAssociations();
+ mAllowedAssociations = new ArrayMap<>(allowedAssociations.size());
+ PackageManagerInternal pm = getPackageManagerInternalLocked();
+ for (int i = 0; i < allowedAssociations.size(); i++) {
+ final String pkg = allowedAssociations.keyAt(i);
+ final ArraySet<String> asc = allowedAssociations.valueAt(i);
+
+ // Query latest debuggable flag from package-manager.
+ boolean isDebuggable = false;
+ try {
+ ApplicationInfo ai = AppGlobals.getPackageManager()
+ .getApplicationInfo(pkg, MATCH_ALL, 0);
+ if (ai != null) {
+ isDebuggable = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ }
+ } catch (RemoteException e) {
+ /* ignore */
+ }
+ mAllowedAssociations.put(pkg, new PackageAssociationInfo(pkg, asc, isDebuggable));
}
}
- pkgs = mAllowedAssociations.get(pkg2);
- if (pkgs != null) {
- return pkgs.contains(pkg1);
+ }
+
+ /** Updates allowed associations for app info (specifically, based on debuggability). */
+ private void updateAssociationForApp(ApplicationInfo appInfo) {
+ ensureAllowedAssociations();
+ PackageAssociationInfo pai = mAllowedAssociations.get(appInfo.packageName);
+ if (pai != null) {
+ pai.setDebuggable((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
}
- return true;
}
@Override
@@ -4447,6 +4507,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mProcessList.removeProcessLocked(app, false, true, "timeout publishing content providers");
}
+ @GuardedBy("this")
private final void processStartTimedOutLocked(ProcessRecord app) {
final int pid = app.pid;
boolean gone = mPidsSelfLocked.removeIfNoThread(pid);
@@ -4467,7 +4528,8 @@ public class ActivityManagerService extends IActivityManager.Stub
mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
}
removeLruProcessLocked(app);
- if (mBackupTarget != null && mBackupTarget.app.pid == pid) {
+ final BackupRecord backupTarget = mBackupTargets.get(app.userId);
+ if (backupTarget != null && backupTarget.app.pid == pid) {
Slog.w(TAG, "Unattached app died before backup, skipping");
mHandler.post(new Runnable() {
@Override
@@ -4475,7 +4537,7 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
- bm.agentDisconnected(app.info.packageName);
+ bm.agentDisconnectedForUser(app.userId, app.info.packageName);
} catch (RemoteException e) {
// Can't happen; the backup manager is local
}
@@ -4598,6 +4660,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (DEBUG_ALL) Slog.v(
TAG, "New app record " + app
+ " thread=" + thread.asBinder() + " pid=" + pid);
+ final BackupRecord backupTarget = mBackupTargets.get(app.userId);
try {
int testMode = ApplicationThreadConstants.DEBUG_OFF;
if (mDebugApp != null && mDebugApp.equals(processName)) {
@@ -4619,11 +4682,11 @@ public class ActivityManagerService extends IActivityManager.Stub
// If the app is being launched for restore or full backup, set it up specially
boolean isRestrictedBackupMode = false;
- if (mBackupTarget != null && mBackupAppName.equals(processName)) {
- isRestrictedBackupMode = mBackupTarget.appInfo.uid >= FIRST_APPLICATION_UID
- && ((mBackupTarget.backupMode == BackupRecord.RESTORE)
- || (mBackupTarget.backupMode == BackupRecord.RESTORE_FULL)
- || (mBackupTarget.backupMode == BackupRecord.BACKUP_FULL));
+ if (backupTarget != null && backupTarget.appInfo.packageName.equals(processName)) {
+ isRestrictedBackupMode = backupTarget.appInfo.uid >= FIRST_APPLICATION_UID
+ && ((backupTarget.backupMode == BackupRecord.RESTORE)
+ || (backupTarget.backupMode == BackupRecord.RESTORE_FULL)
+ || (backupTarget.backupMode == BackupRecord.BACKUP_FULL));
}
final ActiveInstrumentation instr = app.getActiveInstrumentation();
@@ -4831,15 +4894,15 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// Check whether the next backup agent is in this process...
- if (!badApp && mBackupTarget != null && mBackupTarget.app == app) {
+ if (!badApp && backupTarget != null && backupTarget.app == app) {
if (DEBUG_BACKUP) Slog.v(TAG_BACKUP,
"New app is backup target, launching agent for " + app);
- notifyPackageUse(mBackupTarget.appInfo.packageName,
+ notifyPackageUse(backupTarget.appInfo.packageName,
PackageManager.NOTIFY_PACKAGE_USE_BACKUP);
try {
- thread.scheduleCreateBackupAgent(mBackupTarget.appInfo,
- compatibilityInfoForPackage(mBackupTarget.appInfo),
- mBackupTarget.backupMode);
+ thread.scheduleCreateBackupAgent(backupTarget.appInfo,
+ compatibilityInfoForPackage(backupTarget.appInfo),
+ backupTarget.backupMode);
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e);
badApp = true;
@@ -5384,18 +5447,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- @Override
- public boolean isAppForeground(int uid) {
- int callerUid = Binder.getCallingUid();
- if (UserHandle.isCore(callerUid) || callerUid == uid) {
- return isAppForegroundInternal(uid);
- }
- return false;
- }
-
- private boolean isAppForegroundInternal(int uid) {
+ private boolean isAppForeground(int uid) {
synchronized (this) {
- UidRecord uidRec = mActiveUids.get(uid);
+ UidRecord uidRec = mProcessList.mActiveUids.get(uid);
if (uidRec == null || uidRec.idle) {
return false;
}
@@ -5407,15 +5461,10 @@ public class ActivityManagerService extends IActivityManager.Stub
// be guarded by permission checking.
int getUidState(int uid) {
synchronized (this) {
- return getUidStateLocked(uid);
+ return mProcessList.getUidProcStateLocked(uid);
}
}
- int getUidStateLocked(int uid) {
- UidRecord uidRec = mActiveUids.get(uid);
- return uidRec == null ? PROCESS_STATE_NONEXISTENT : uidRec.getCurProcState();
- }
-
// =========================================================
// PROCESS INFO
// =========================================================
@@ -5707,7 +5756,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int getAppStartModeLocked(int uid, String packageName, int packageTargetSdk,
int callingPid, boolean alwaysRestrict, boolean disabledOnly, boolean forcedStandby) {
- UidRecord uidRec = mActiveUids.get(uid);
+ UidRecord uidRec = mProcessList.getUidRecordLocked(uid);
if (DEBUG_BACKGROUND_CHECK) Slog.d(TAG, "checkAllowBackground: uid=" + uid + " pkg="
+ packageName + " rec=" + uidRec + " always=" + alwaysRestrict + " idle="
+ (uidRec != null ? uidRec.idle : false));
@@ -7470,7 +7519,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (app == null) {
- app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0);
+ app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0, false);
mProcessList.updateLruProcessLocked(app, false, null);
updateOomAdjLocked();
}
@@ -7928,8 +7977,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
synchronized (this) {
- UidRecord uidRec = mActiveUids.get(uid);
- return uidRec != null ? uidRec.getCurProcState() : PROCESS_STATE_NONEXISTENT;
+ return mProcessList.getUidProcStateLocked(uid);
}
}
@@ -7965,7 +8013,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
boolean isUidActiveLocked(int uid) {
- final UidRecord uidRecord = mActiveUids.get(uid);
+ final UidRecord uidRecord = mProcessList.getUidRecordLocked(uid);
return uidRecord != null && !uidRecord.setIdle;
}
@@ -8757,7 +8805,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (mForceBackgroundCheck) {
// Stop background services for idle UIDs.
- doStopUidForIdleUidsLocked();
+ mProcessList.doStopUidForIdleUidsLocked();
}
}
}
@@ -9606,7 +9654,8 @@ public class ActivityManagerService extends IActivityManager.Stub
proto.end(broadcastToken);
long serviceToken = proto.start(ActivityManagerServiceProto.SERVICES);
- mServices.writeToProto(proto, ActivityManagerServiceDumpServicesProto.ACTIVE_SERVICES);
+ mServices.writeToProto(proto,
+ ActivityManagerServiceDumpServicesProto.ACTIVE_SERVICES);
proto.end(serviceToken);
long processToken = proto.start(ActivityManagerServiceProto.PROCESSES);
@@ -10158,11 +10207,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- if (mActiveUids.size() > 0) {
- if (dumpUids(pw, dumpPackage, dumpAppId, mActiveUids, "UID states:", needSep)) {
+ if (mProcessList.mActiveUids.size() > 0) {
+ if (dumpUids(pw, dumpPackage, dumpAppId, mProcessList.mActiveUids,
+ "UID states:", needSep)) {
needSep = true;
}
}
+
if (dumpAll) {
if (mValidateUids.size() > 0) {
if (dumpUids(pw, dumpPackage, dumpAppId, mValidateUids, "UID validation:",
@@ -10425,12 +10476,8 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.print(" mLastPowerCheckUptime=");
TimeUtils.formatDuration(mLastPowerCheckUptime, pw);
pw.println("");
- pw.println(" mAdjSeq=" + mAdjSeq + " mLruSeq=" + mProcessList.mLruSeq);
- pw.println(" mNumNonCachedProcs=" + mNumNonCachedProcs
- + " (" + mProcessList.getLruSizeLocked() + " total)"
- + " mNumCachedHiddenProcs=" + mNumCachedHiddenProcs
- + " mNumServiceProcs=" + mNumServiceProcs
- + " mNewNumServiceProcs=" + mNewNumServiceProcs);
+ mOomAdjuster.dumpSequenceNumbersLocked(pw);
+ mOomAdjuster.dumpProcCountsLocked(pw);
pw.println(" mAllowLowerMemLevel=" + mAllowLowerMemLevel
+ " mLastMemoryLevel=" + mLastMemoryLevel
+ " mLastNumProcesses=" + mLastNumProcesses);
@@ -10482,7 +10529,8 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpPackage != null && !r.pkgList.containsKey(dumpPackage)) {
continue;
}
- r.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PROCS, mProcessList.mLruProcesses.indexOf(r)
+ r.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PROCS,
+ mProcessList.mLruProcesses.indexOf(r)
);
if (r.isPersistent()) {
numPers++;
@@ -10506,19 +10554,20 @@ public class ActivityManagerService extends IActivityManager.Stub
&& !ai.mTargetInfo.packageName.equals(dumpPackage)) {
continue;
}
- ai.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.ACTIVE_INSTRUMENTATIONS);
+ ai.writeToProto(proto,
+ ActivityManagerServiceDumpProcessesProto.ACTIVE_INSTRUMENTATIONS);
}
int whichAppId = getAppId(dumpPackage);
- for (int i=0; i<mActiveUids.size(); i++) {
- UidRecord uidRec = mActiveUids.valueAt(i);
+ for (int i = 0; i < mProcessList.mActiveUids.size(); i++) {
+ UidRecord uidRec = mProcessList.mActiveUids.valueAt(i);
if (dumpPackage != null && UserHandle.getAppId(uidRec.uid) != whichAppId) {
continue;
}
uidRec.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.ACTIVE_UIDS);
}
- for (int i=0; i<mValidateUids.size(); i++) {
+ for (int i = 0; i < mValidateUids.size(); i++) {
UidRecord uidRec = mValidateUids.valueAt(i);
if (dumpPackage != null && UserHandle.getAppId(uidRec.uid) != whichAppId) {
continue;
@@ -10593,12 +10642,15 @@ public class ActivityManagerService extends IActivityManager.Stub
r.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.ON_HOLD_PROCS);
}
- writeProcessesToGcToProto(proto, ActivityManagerServiceDumpProcessesProto.GC_PROCS, dumpPackage);
- mAppErrors.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.APP_ERRORS, dumpPackage);
+ writeProcessesToGcToProto(proto, ActivityManagerServiceDumpProcessesProto.GC_PROCS,
+ dumpPackage);
+ mAppErrors.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.APP_ERRORS,
+ dumpPackage);
mAtmInternal.writeProcessesToProto(proto, dumpPackage, mWakefulness, mTestPssMode);
if (dumpPackage == null) {
- mUserController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.USER_CONTROLLER);
+ mUserController.writeToProto(proto,
+ ActivityManagerServiceDumpProcessesProto.USER_CONTROLLER);
}
final int NI = mUidObservers.getRegisteredCallbackCount();
@@ -10710,11 +10762,7 @@ public class ActivityManagerService extends IActivityManager.Stub
proto.write(ActivityManagerServiceDumpProcessesProto.CALL_FINISH_BOOTING, mCallFinishBooting);
proto.write(ActivityManagerServiceDumpProcessesProto.BOOT_ANIMATION_COMPLETE, mBootAnimationComplete);
proto.write(ActivityManagerServiceDumpProcessesProto.LAST_POWER_CHECK_UPTIME_MS, mLastPowerCheckUptime);
- proto.write(ActivityManagerServiceDumpProcessesProto.ADJ_SEQ, mAdjSeq);
- proto.write(ActivityManagerServiceDumpProcessesProto.LRU_SEQ, mProcessList.mLruSeq);
- proto.write(ActivityManagerServiceDumpProcessesProto.NUM_NON_CACHED_PROCS, mNumNonCachedProcs);
- proto.write(ActivityManagerServiceDumpProcessesProto.NUM_SERVICE_PROCS, mNumServiceProcs);
- proto.write(ActivityManagerServiceDumpProcessesProto.NEW_NUM_SERVICE_PROCS, mNewNumServiceProcs);
+ mOomAdjuster.dumpProcessListVariablesLocked(proto);
proto.write(ActivityManagerServiceDumpProcessesProto.ALLOW_LOWER_MEM_LEVEL, mAllowLowerMemLevel);
proto.write(ActivityManagerServiceDumpProcessesProto.LAST_MEMORY_LEVEL, mLastMemoryLevel);
proto.write(ActivityManagerServiceDumpProcessesProto.LAST_NUM_PROCESSES, mLastNumProcesses);
@@ -10722,7 +10770,6 @@ public class ActivityManagerService extends IActivityManager.Stub
ProtoUtils.toDuration(proto, ActivityManagerServiceDumpProcessesProto.LAST_IDLE_TIME, mLastIdleTime, now);
proto.write(ActivityManagerServiceDumpProcessesProto.LOW_RAM_SINCE_LAST_IDLE_MS, getLowRamTimeSinceIdle(now));
}
-
}
void writeProcessesToGcToProto(ProtoOutputStream proto, long fieldId, String dumpPackage) {
@@ -11004,14 +11051,14 @@ public class ActivityManagerService extends IActivityManager.Stub
void dumpAllowedAssociationsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
int opti, boolean dumpAll, String dumpPackage) {
boolean needSep = false;
- boolean printedAnything = false;
pw.println("ACTIVITY MANAGER ALLOWED ASSOCIATION STATE (dumpsys activity allowed-associations)");
boolean printed = false;
if (mAllowedAssociations != null) {
for (int i = 0; i < mAllowedAssociations.size(); i++) {
final String pkg = mAllowedAssociations.keyAt(i);
- final ArraySet<String> asc = mAllowedAssociations.valueAt(i);
+ final ArraySet<String> asc =
+ mAllowedAssociations.valueAt(i).getAllowedPackageAssociations();
boolean printedHeader = false;
for (int j = 0; j < asc.size(); j++) {
if (dumpPackage == null || pkg.equals(dumpPackage)
@@ -11020,7 +11067,6 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println(" Allowed associations (by restricted package):");
printed = true;
needSep = true;
- printedAnything = true;
}
if (!printedHeader) {
pw.print(" * ");
@@ -11032,6 +11078,9 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println(asc.valueAt(j));
}
}
+ if (mAllowedAssociations.valueAt(i).isDebuggable()) {
+ pw.println(" (debuggable)");
+ }
}
}
if (!printed) {
@@ -13321,16 +13370,17 @@ public class ActivityManagerService extends IActivityManager.Stub
app.receivers.clear();
// If the app is undergoing backup, tell the backup manager about it
- if (mBackupTarget != null && app.pid == mBackupTarget.app.pid) {
+ final BackupRecord backupTarget = mBackupTargets.get(app.userId);
+ if (backupTarget != null && app.pid == backupTarget.app.pid) {
if (DEBUG_BACKUP || DEBUG_CLEANUP) Slog.d(TAG_CLEANUP, "App "
- + mBackupTarget.appInfo + " died during backup");
+ + backupTarget.appInfo + " died during backup");
mHandler.post(new Runnable() {
@Override
public void run(){
try {
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
- bm.agentDisconnected(app.info.packageName);
+ bm.agentDisconnectedForUser(app.userId, app.info.packageName);
} catch (RemoteException e) {
// can't happen; backup manager is local
}
@@ -13670,7 +13720,11 @@ public class ActivityManagerService extends IActivityManager.Stub
// instantiated. The backup agent will invoke backupAgentCreated() on the
// activity manager to announce its creation.
public boolean bindBackupAgent(String packageName, int backupMode, int userId) {
- if (DEBUG_BACKUP) Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode=" + backupMode);
+ if (DEBUG_BACKUP) {
+ Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode="
+ + backupMode + " userId=" + userId + " callingUid = " + Binder.getCallingUid()
+ + " uid = " + Process.myUid());
+ }
enforceCallingPermission("android.permission.CONFIRM_FULL_BACKUP", "bindBackupAgent");
IPackageManager pm = AppGlobals.getPackageManager();
@@ -13722,10 +13776,10 @@ public class ActivityManagerService extends IActivityManager.Stub
proc.inFullBackup = true;
}
r.app = proc;
- oldBackupUid = mBackupTarget != null ? mBackupTarget.appInfo.uid : -1;
+ final BackupRecord backupTarget = mBackupTargets.get(userId);
+ oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
newBackupUid = proc.inFullBackup ? r.appInfo.uid : -1;
- mBackupTarget = r;
- mBackupAppName = app.packageName;
+ mBackupTargets.put(userId, r);
// Try not to kill the process during backup
updateOomAdjLocked(proc, true);
@@ -13760,14 +13814,14 @@ public class ActivityManagerService extends IActivityManager.Stub
return true;
}
- @Override
- public void clearPendingBackup() {
- if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "clearPendingBackup");
- enforceCallingPermission("android.permission.BACKUP", "clearPendingBackup");
+ private void clearPendingBackup(int userId) {
+ if (DEBUG_BACKUP) {
+ Slog.v(TAG_BACKUP, "clearPendingBackup: userId = " + userId + " callingUid = "
+ + Binder.getCallingUid() + " uid = " + Process.myUid());
+ }
synchronized (this) {
- mBackupTarget = null;
- mBackupAppName = null;
+ mBackupTargets.delete(userId);
}
JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
@@ -13775,12 +13829,19 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// A backup agent has just come up
+ @Override
public void backupAgentCreated(String agentPackageName, IBinder agent) {
- if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "backupAgentCreated: " + agentPackageName
- + " = " + agent);
+ final int callingUserId = UserHandle.getCallingUserId();
+ if (DEBUG_BACKUP) {
+ Slog.v(TAG_BACKUP, "backupAgentCreated: " + agentPackageName + " = " + agent
+ + " callingUserId = " + callingUserId + " callingUid = "
+ + Binder.getCallingUid() + " uid = " + Process.myUid());
+ }
synchronized(this) {
- if (!agentPackageName.equals(mBackupAppName)) {
+ final BackupRecord backupTarget = mBackupTargets.get(callingUserId);
+ String backupAppName = backupTarget == null ? null : backupTarget.appInfo.packageName;
+ if (!agentPackageName.equals(backupAppName)) {
Slog.e(TAG, "Backup agent created for " + agentPackageName + " but not requested!");
return;
}
@@ -13790,7 +13851,7 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
- bm.agentConnected(agentPackageName, agent);
+ bm.agentConnectedForUser(callingUserId, agentPackageName, agent);
} catch (RemoteException e) {
// can't happen; the backup manager service is local
} catch (Exception e) {
@@ -13803,7 +13864,12 @@ public class ActivityManagerService extends IActivityManager.Stub
// done with this agent
public void unbindBackupAgent(ApplicationInfo appInfo) {
- if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "unbindBackupAgent: " + appInfo);
+ if (DEBUG_BACKUP) {
+ Slog.v(TAG_BACKUP, "unbindBackupAgent: " + appInfo + " appInfo.uid = "
+ + appInfo.uid + " callingUid = " + Binder.getCallingUid() + " uid = "
+ + Process.myUid());
+ }
+
enforceCallingPermission("android.permission.CONFIRM_FULL_BACKUP", "unbindBackupAgent");
if (appInfo == null) {
Slog.w(TAG, "unbind backup agent for null app");
@@ -13812,24 +13878,27 @@ public class ActivityManagerService extends IActivityManager.Stub
int oldBackupUid;
+ final int userId = UserHandle.getUserId(appInfo.uid);
synchronized(this) {
+ final BackupRecord backupTarget = mBackupTargets.get(userId);
+ String backupAppName = backupTarget == null ? null : backupTarget.appInfo.packageName;
try {
- if (mBackupAppName == null) {
+ if (backupAppName == null) {
Slog.w(TAG, "Unbinding backup agent with no active backup");
return;
}
- if (!mBackupAppName.equals(appInfo.packageName)) {
+ if (!backupAppName.equals(appInfo.packageName)) {
Slog.e(TAG, "Unbind of " + appInfo + " but is not the current backup target");
return;
}
// Not backing this app up any more; reset its OOM adjustment
- final ProcessRecord proc = mBackupTarget.app;
+ final ProcessRecord proc = backupTarget.app;
updateOomAdjLocked(proc, true);
proc.inFullBackup = false;
- oldBackupUid = mBackupTarget != null ? mBackupTarget.appInfo.uid : -1;
+ oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
// If the app crashed during backup, 'thread' will be null here
if (proc.thread != null) {
@@ -13842,8 +13911,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
} finally {
- mBackupTarget = null;
- mBackupAppName = null;
+ mBackupTargets.delete(userId);
}
}
@@ -14407,6 +14475,7 @@ public class ActivityManagerService extends IActivityManager.Stub
case BLUETOOTH_UID:
case NFC_UID:
case SE_UID:
+ case NETWORK_STACK_UID:
isCallerSystem = true;
break;
default:
@@ -14593,6 +14662,7 @@ public class ActivityManagerService extends IActivityManager.Stub
+ " ssp=" + ssp + " data=" + data);
return ActivityManager.BROADCAST_SUCCESS;
}
+ updateAssociationForApp(aInfo);
mAtmInternal.onPackageReplaced(aInfo);
mServices.updateServiceApplicationInfoLocked(aInfo);
sendPackageBroadcastLocked(ApplicationThreadConstants.PACKAGE_REPLACED,
@@ -14687,7 +14757,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
final int uid = getUidFromIntent(intent);
if (uid != -1) {
- final UidRecord uidRec = mActiveUids.get(uid);
+ final UidRecord uidRec = mProcessList.getUidRecordLocked(uid);
if (uidRec != null) {
uidRec.updateHasInternetPermission();
}
@@ -15465,7 +15535,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Returns whether the app is receiving broadcast.
// If receiving, fetch all broadcast queues which the app is
// the current [or imminent] receiver on.
- private boolean isReceivingBroadcastLocked(ProcessRecord app,
+ boolean isReceivingBroadcastLocked(ProcessRecord app,
ArraySet<BroadcastQueue> receivingQueues) {
final int N = app.curReceivers.size();
if (N > 0) {
@@ -15585,1087 +15655,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private final ComputeOomAdjWindowCallback mTmpComputeOomAdjWindowCallback =
- new ComputeOomAdjWindowCallback();
-
- /** These methods are called inline during computeOomAdjLocked(), on the same thread */
- private final class ComputeOomAdjWindowCallback
- implements WindowProcessController.ComputeOomAdjCallback {
-
- ProcessRecord app;
- int adj;
- boolean foregroundActivities;
- int procState;
- int schedGroup;
- int appUid;
- int logUid;
- int processStateCurTop;
-
- void initialize(ProcessRecord app, int adj, boolean foregroundActivities,
- int procState, int schedGroup, int appUid, int logUid, int processStateCurTop) {
- this.app = app;
- this.adj = adj;
- this.foregroundActivities = foregroundActivities;
- this.procState = procState;
- this.schedGroup = schedGroup;
- this.appUid = appUid;
- this.logUid = logUid;
- this.processStateCurTop = processStateCurTop;
- }
-
- @Override
- public void onVisibleActivity() {
- // App has a visible activity; only upgrade adjustment.
- if (adj > ProcessList.VISIBLE_APP_ADJ) {
- adj = ProcessList.VISIBLE_APP_ADJ;
- app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to vis-activity: " + app);
- }
- }
- if (procState > processStateCurTop) {
- procState = processStateCurTop;
- app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to vis-activity (top): " + app);
- }
- }
- if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- }
-
- @Override
- public void onPausedActivity() {
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to pause-activity: " + app);
- }
- }
- if (procState > processStateCurTop) {
- procState = processStateCurTop;
- app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to pause-activity (top): " + app);
- }
- }
- if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- }
-
- @Override
- public void onStoppingActivity(boolean finishing) {
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to stop-activity: " + app);
- }
- }
-
- // For the process state, we will at this point consider the process to be cached. It
- // will be cached either as an activity or empty depending on whether the activity is
- // finishing. We do this so that we can treat the process as cached for purposes of
- // memory trimming (determining current memory level, trim command to send to process)
- // since there can be an arbitrary number of stopping processes and they should soon all
- // go into the cached state.
- if (!finishing) {
- if (procState > PROCESS_STATE_LAST_ACTIVITY) {
- procState = PROCESS_STATE_LAST_ACTIVITY;
- app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to stop-activity: " + app);
- }
- }
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- }
-
- @Override
- public void onOtherActivity() {
- if (procState > PROCESS_STATE_CACHED_ACTIVITY) {
- procState = PROCESS_STATE_CACHED_ACTIVITY;
- app.adjType = "cch-act";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to cached activity: " + app);
- }
- }
- }
- }
-
- private final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
- boolean doingAll, long now, boolean cycleReEval) {
- if (mAdjSeq == app.adjSeq) {
- if (app.adjSeq == app.completedAdjSeq) {
- // This adjustment has already been computed successfully.
- return false;
- } else {
- // The process is being computed, so there is a cycle. We cannot
- // rely on this process's state.
- app.containsCycle = true;
-
- return false;
- }
- }
-
- if (app.thread == null) {
- app.adjSeq = mAdjSeq;
- app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND);
- app.setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
- app.curAdj = ProcessList.CACHED_APP_MAX_ADJ;
- app.setCurRawAdj(ProcessList.CACHED_APP_MAX_ADJ);
- app.completedAdjSeq = app.adjSeq;
- return false;
- }
-
- app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN;
- app.adjSource = null;
- app.adjTarget = null;
- app.empty = false;
- app.cached = false;
-
- final WindowProcessController wpc = app.getWindowProcessController();
- final int appUid = app.info.uid;
- final int logUid = mCurOomAdjUid;
-
- int prevAppAdj = app.curAdj;
- int prevProcState = app.getCurProcState();
-
- if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
- // The max adjustment doesn't allow this app to be anything
- // below foreground, so it is not worth doing work for it.
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making fixed: " + app);
- }
- app.adjType = "fixed";
- app.adjSeq = mAdjSeq;
- app.setCurRawAdj(app.maxAdj);
- app.setHasForegroundActivities(false);
- app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
- app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT);
- // System processes can do UI, and when they do we want to have
- // them trim their memory after the user leaves the UI. To
- // facilitate this, here we need to determine whether or not it
- // is currently showing UI.
- app.systemNoUi = true;
- if (app == TOP_APP) {
- app.systemNoUi = false;
- app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
- app.adjType = "pers-top-activity";
- } else if (app.hasTopUi()) {
- // sched group/proc state adjustment is below
- app.systemNoUi = false;
- app.adjType = "pers-top-ui";
- } else if (wpc.hasVisibleActivities()) {
- app.systemNoUi = false;
- }
- if (!app.systemNoUi) {
- if (mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) {
- // screen on, promote UI
- app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
- app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
- } else {
- // screen off, restrict UI scheduling
- app.setCurProcState(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
- app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_RESTRICTED);
- }
- }
- app.setCurRawProcState(app.getCurProcState());
- app.curAdj = app.maxAdj;
- app.completedAdjSeq = app.adjSeq;
- // if curAdj is less than prevAppAdj, then this process was promoted
- return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState;
- }
-
- app.systemNoUi = false;
-
- final int PROCESS_STATE_CUR_TOP = mAtmInternal.getTopProcessState();
-
- // Determine the importance of the process, starting with most
- // important to least, and assign an appropriate OOM adjustment.
- int adj;
- int schedGroup;
- int procState;
- int cachedAdjSeq;
-
- boolean foregroundActivities = false;
- mTmpBroadcastQueue.clear();
- if (PROCESS_STATE_CUR_TOP == ActivityManager.PROCESS_STATE_TOP && app == TOP_APP) {
- // The last app on the list is the foreground app.
- adj = ProcessList.FOREGROUND_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
- app.adjType = "top-activity";
- foregroundActivities = true;
- procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app);
- }
- } else if (app.runningRemoteAnimation) {
- adj = ProcessList.VISIBLE_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
- app.adjType = "running-remote-anim";
- procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making running remote anim: " + app);
- }
- } else if (app.getActiveInstrumentation() != null) {
- // Don't want to kill running instrumentation.
- adj = ProcessList.FOREGROUND_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- app.adjType = "instrumentation";
- procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making instrumentation: " + app);
- }
- } else if (isReceivingBroadcastLocked(app, mTmpBroadcastQueue)) {
- // An app that is currently receiving a broadcast also
- // counts as being in the foreground for OOM killer purposes.
- // It's placed in a sched group based on the nature of the
- // broadcast as reflected by which queue it's active in.
- adj = ProcessList.FOREGROUND_APP_ADJ;
- schedGroup = (mTmpBroadcastQueue.contains(mFgBroadcastQueue))
- ? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
- app.adjType = "broadcast";
- procState = ActivityManager.PROCESS_STATE_RECEIVER;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making broadcast: " + app);
- }
- } else if (app.executingServices.size() > 0) {
- // An app that is currently executing a service callback also
- // counts as being in the foreground.
- adj = ProcessList.FOREGROUND_APP_ADJ;
- schedGroup = app.execServicesFg ?
- ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
- app.adjType = "exec-service";
- procState = ActivityManager.PROCESS_STATE_SERVICE;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making exec-service: " + app);
- }
- //Slog.i(TAG, "EXEC " + (app.execServicesFg ? "FG" : "BG") + ": " + app);
- } else if (app == TOP_APP) {
- adj = ProcessList.FOREGROUND_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- app.adjType = "top-sleeping";
- foregroundActivities = true;
- procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top (sleeping): " + app);
- }
- } else {
- // As far as we know the process is empty. We may change our mind later.
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- // At this point we don't actually know the adjustment. Use the cached adj
- // value that the caller wants us to.
- adj = cachedAdj;
- procState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
- app.cached = true;
- app.empty = true;
- app.adjType = "cch-empty";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making empty: " + app);
- }
- }
-
- // Examine all activities if not already foreground.
- if (!foregroundActivities && wpc.hasActivities()) {
- mTmpComputeOomAdjWindowCallback.initialize(app, adj, foregroundActivities, procState,
- schedGroup, appUid, logUid, PROCESS_STATE_CUR_TOP);
- final int minLayer = wpc.computeOomAdjFromActivities(
- ProcessList.VISIBLE_APP_LAYER_MAX, mTmpComputeOomAdjWindowCallback);
-
- adj = mTmpComputeOomAdjWindowCallback.adj;
- foregroundActivities = mTmpComputeOomAdjWindowCallback.foregroundActivities;
- procState = mTmpComputeOomAdjWindowCallback.procState;
- schedGroup = mTmpComputeOomAdjWindowCallback.schedGroup;
-
- if (adj == ProcessList.VISIBLE_APP_ADJ) {
- adj += minLayer;
- }
- }
-
- if (procState > ActivityManager.PROCESS_STATE_CACHED_RECENT && app.hasRecentTasks()) {
- procState = ActivityManager.PROCESS_STATE_CACHED_RECENT;
- app.adjType = "cch-rec";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to cached recent: " + app);
- }
- }
-
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
- || procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- if (app.hasForegroundServices()) {
- // The user is aware of this app, so make it visible.
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
- app.cached = false;
- app.adjType = "fg-service";
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to fg service: " + app);
- }
- } else if (app.hasOverlayUi()) {
- // The process is display an overlay UI.
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
- app.cached = false;
- app.adjType = "has-overlay-ui";
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to overlay ui: " + app);
- }
- }
- }
-
- // If the app was recently in the foreground and moved to a foreground service status,
- // allow it to get a higher rank in memory for some time, compared to other foreground
- // services so that it can finish performing any persistence/processing of in-memory state.
- if (app.hasForegroundServices() && adj > ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ
- && (app.lastTopTime + mConstants.TOP_TO_FGS_GRACE_DURATION > now
- || app.setProcState <= ActivityManager.PROCESS_STATE_TOP)) {
- adj = ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ;
- app.adjType = "fg-service-act";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg: " + app);
- }
- }
-
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
- || procState > ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
- if (app.forcingToImportant != null) {
- // This is currently used for toasts... they are not interactive, and
- // we don't want them to cause the app to become fully foreground (and
- // thus out of background check), so we yes the best background level we can.
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
- app.cached = false;
- app.adjType = "force-imp";
- app.adjSource = app.forcingToImportant;
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to force imp: " + app);
- }
- }
- }
-
- if (mAtmInternal.isHeavyWeightProcess(app.getWindowProcessController())) {
- if (adj > ProcessList.HEAVY_WEIGHT_APP_ADJ) {
- // We don't want to kill the current heavy-weight process.
- adj = ProcessList.HEAVY_WEIGHT_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- app.cached = false;
- app.adjType = "heavy";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app);
- }
- }
- if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
- procState = ActivityManager.PROCESS_STATE_HEAVY_WEIGHT;
- app.adjType = "heavy";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to heavy: " + app);
- }
- }
- }
-
- if (wpc.isHomeProcess()) {
- if (adj > ProcessList.HOME_APP_ADJ) {
- // This process is hosting what we currently consider to be the
- // home app, so we don't want to let it go into the background.
- adj = ProcessList.HOME_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- app.cached = false;
- app.adjType = "home";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app);
- }
- }
- if (procState > ActivityManager.PROCESS_STATE_HOME) {
- procState = ActivityManager.PROCESS_STATE_HOME;
- app.adjType = "home";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to home: " + app);
- }
- }
- }
-
- if (wpc.isPreviousProcess() && app.hasActivities()) {
- if (adj > ProcessList.PREVIOUS_APP_ADJ) {
- // This was the previous process that showed UI to the user.
- // We want to try to keep it around more aggressively, to give
- // a good experience around switching between two apps.
- adj = ProcessList.PREVIOUS_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- app.cached = false;
- app.adjType = "previous";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
- }
- }
- if (procState > PROCESS_STATE_LAST_ACTIVITY) {
- procState = PROCESS_STATE_LAST_ACTIVITY;
- app.adjType = "previous";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app);
- }
- }
- }
-
- if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj
- + " reason=" + app.adjType);
-
- // By default, we use the computed adjustment. It may be changed if
- // there are applications dependent on our services or providers, but
- // this gives us a baseline and makes sure we don't get into an
- // infinite recursion. If we're re-evaluating due to cycles, use the previously computed
- // values.
- app.setCurRawAdj(!cycleReEval ? adj : Math.min(adj, app.getCurRawAdj()));
- app.setCurRawProcState(!cycleReEval
- ? procState
- : Math.min(procState, app.getCurRawProcState()));
-
- app.hasStartedServices = false;
- app.adjSeq = mAdjSeq;
-
- if (mBackupTarget != null && app == mBackupTarget.app) {
- // If possible we want to avoid killing apps while they're being backed up
- if (adj > ProcessList.BACKUP_APP_ADJ) {
- if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app);
- adj = ProcessList.BACKUP_APP_ADJ;
- if (procState > ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
- procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
- }
- app.adjType = "backup";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app);
- }
- app.cached = false;
- }
- if (procState > ActivityManager.PROCESS_STATE_BACKUP) {
- procState = ActivityManager.PROCESS_STATE_BACKUP;
- app.adjType = "backup";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to backup: " + app);
- }
- }
- }
-
- boolean mayBeTop = false;
- String mayBeTopType = null;
- Object mayBeTopSource = null;
- Object mayBeTopTarget = null;
-
- for (int is = app.services.size()-1;
- is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
- || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- || procState > ActivityManager.PROCESS_STATE_TOP);
- is--) {
- ServiceRecord s = app.services.valueAt(is);
- if (s.startRequested) {
- app.hasStartedServices = true;
- if (procState > ActivityManager.PROCESS_STATE_SERVICE) {
- procState = ActivityManager.PROCESS_STATE_SERVICE;
- app.adjType = "started-services";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to started service: " + app);
- }
- }
- if (app.hasShownUi && !wpc.isHomeProcess()) {
- // If this process has shown some UI, let it immediately
- // go to the LRU list because it may be pretty heavy with
- // UI stuff. We'll tag it with a label just to help
- // debug and understand what is going on.
- if (adj > ProcessList.SERVICE_ADJ) {
- app.adjType = "cch-started-ui-services";
- }
- } else {
- if (now < (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) {
- // This service has seen some activity within
- // recent memory, so we will keep its process ahead
- // of the background processes.
- if (adj > ProcessList.SERVICE_ADJ) {
- adj = ProcessList.SERVICE_ADJ;
- app.adjType = "started-services";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to started service: " + app);
- }
- app.cached = false;
- }
- }
- // If we have let the service slide into the background
- // state, still have some text describing what it is doing
- // even though the service no longer has an impact.
- if (adj > ProcessList.SERVICE_ADJ) {
- app.adjType = "cch-started-services";
- }
- }
- }
-
- for (int conni = s.connections.size()-1;
- conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
- || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- || procState > ActivityManager.PROCESS_STATE_TOP);
- conni--) {
- ArrayList<ConnectionRecord> clist = s.connections.valueAt(conni);
- for (int i = 0;
- i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ
- || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- || procState > ActivityManager.PROCESS_STATE_TOP);
- i++) {
- // XXX should compute this based on the max of
- // all connected clients.
- ConnectionRecord cr = clist.get(i);
- if (cr.binding.client == app) {
- // Binding to oneself is not interesting.
- continue;
- }
-
- boolean trackedProcState = false;
- if ((cr.flags&Context.BIND_WAIVE_PRIORITY) == 0) {
- ProcessRecord client = cr.binding.client;
- computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now, cycleReEval);
-
- if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) {
- continue;
- }
-
- int clientAdj = client.getCurRawAdj();
- int clientProcState = client.getCurRawProcState();
-
- if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
- // If the other app is cached for any reason, for purposes here
- // we are going to consider it empty. The specific cached state
- // doesn't propagate except under certain conditions.
- clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
- }
- String adjType = null;
- if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) {
- // Not doing bind OOM management, so treat
- // this guy more like a started service.
- if (app.hasShownUi && !wpc.isHomeProcess()) {
- // If this process has shown some UI, let it immediately
- // go to the LRU list because it may be pretty heavy with
- // UI stuff. We'll tag it with a label just to help
- // debug and understand what is going on.
- if (adj > clientAdj) {
- adjType = "cch-bound-ui-services";
- }
- app.cached = false;
- clientAdj = adj;
- clientProcState = procState;
- } else {
- if (now >= (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) {
- // This service has not seen activity within
- // recent memory, so allow it to drop to the
- // LRU list if there is no other reason to keep
- // it around. We'll also tag it with a label just
- // to help debug and undertand what is going on.
- if (adj > clientAdj) {
- adjType = "cch-bound-services";
- }
- clientAdj = adj;
- }
- }
- }
- if (adj > clientAdj) {
- // If this process has recently shown UI, and
- // the process that is binding to it is less
- // important than being visible, then we don't
- // care about the binding as much as we care
- // about letting this process get into the LRU
- // list to be killed and restarted if needed for
- // memory.
- if (app.hasShownUi && !wpc.isHomeProcess()
- && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- if (adj >= ProcessList.CACHED_APP_MIN_ADJ) {
- adjType = "cch-bound-ui-services";
- }
- } else {
- int newAdj;
- if ((cr.flags&(Context.BIND_ABOVE_CLIENT
- |Context.BIND_IMPORTANT)) != 0) {
- if (clientAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) {
- newAdj = clientAdj;
- } else {
- // make this service persistent
- newAdj = ProcessList.PERSISTENT_SERVICE_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- procState = ActivityManager.PROCESS_STATE_PERSISTENT;
- cr.trackProcState(procState, mAdjSeq, now);
- trackedProcState = true;
- }
- } else if ((cr.flags & Context.BIND_ADJUST_BELOW_PERCEPTIBLE) != 0
- && clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
- && adj > ProcessList.PERCEPTIBLE_APP_ADJ + 1) {
- newAdj = ProcessList.PERCEPTIBLE_APP_ADJ + 1;
- } else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0
- && clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
- && adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- newAdj = ProcessList.PERCEPTIBLE_APP_ADJ;
- } else if (clientAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
- newAdj = clientAdj;
- } else {
- if (adj > ProcessList.VISIBLE_APP_ADJ) {
- newAdj = Math.max(clientAdj, ProcessList.VISIBLE_APP_ADJ);
- } else {
- newAdj = adj;
- }
- }
- if (!client.cached) {
- app.cached = false;
- }
- if (adj > newAdj) {
- adj = newAdj;
- app.setCurRawAdj(adj);
- adjType = "service";
- }
- }
- }
- if ((cr.flags & (Context.BIND_NOT_FOREGROUND
- | Context.BIND_IMPORTANT_BACKGROUND)) == 0) {
- // This will treat important bound services identically to
- // the top app, which may behave differently than generic
- // foreground work.
- final int curSchedGroup = client.getCurrentSchedulingGroup();
- if (curSchedGroup > schedGroup) {
- if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
- schedGroup = curSchedGroup;
- } else {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- }
- if (clientProcState <= ActivityManager.PROCESS_STATE_TOP) {
- if (clientProcState == ActivityManager.PROCESS_STATE_TOP) {
- // Special handling of clients who are in the top state.
- // We *may* want to consider this process to be in the
- // top state as well, but only if there is not another
- // reason for it to be running. Being on the top is a
- // special state, meaning you are specifically running
- // for the current top app. If the process is already
- // running in the background for some other reason, it
- // is more important to continue considering it to be
- // in the background state.
- mayBeTop = true;
- mayBeTopType = "service";
- mayBeTopSource = cr.binding.client;
- mayBeTopTarget = s.instanceName;
- clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
- } else {
- // Special handling for above-top states (persistent
- // processes). These should not bring the current process
- // into the top state, since they are not on top. Instead
- // give them the best state after that.
- if ((cr.flags&Context.BIND_FOREGROUND_SERVICE) != 0) {
- clientProcState =
- ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- } else if (mWakefulness
- == PowerManagerInternal.WAKEFULNESS_AWAKE &&
- (cr.flags&Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE)
- != 0) {
- clientProcState =
- ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- } else {
- clientProcState =
- ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
- }
- }
- }
- } else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) {
- if (clientProcState <
- ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
- clientProcState =
- ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
- }
- } else {
- if (clientProcState <
- ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
- clientProcState =
- ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
- }
- }
- if (!trackedProcState) {
- cr.trackProcState(clientProcState, mAdjSeq, now);
- }
- if (procState > clientProcState) {
- procState = clientProcState;
- app.setCurRawProcState(procState);
- if (adjType == null) {
- adjType = "service";
- }
- }
- if (procState < ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
- && (cr.flags & Context.BIND_SHOWING_UI) != 0) {
- app.setPendingUiClean(true);
- }
- if (adjType != null) {
- app.adjType = adjType;
- app.adjTypeCode = ActivityManager.RunningAppProcessInfo
- .REASON_SERVICE_IN_USE;
- app.adjSource = cr.binding.client;
- app.adjSourceProcState = clientProcState;
- app.adjTarget = s.instanceName;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
- + ": " + app + ", due to " + cr.binding.client
- + " adj=" + adj + " procState="
- + ProcessList.makeProcStateString(procState));
- }
- }
- }
- if ((cr.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
- app.treatLikeActivity = true;
- }
- final ActivityServiceConnectionsHolder a = cr.activity;
- if ((cr.flags&Context.BIND_ADJUST_WITH_ACTIVITY) != 0) {
- if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ
- && a.isActivityVisible()) {
- adj = ProcessList.FOREGROUND_APP_ADJ;
- app.setCurRawAdj(adj);
- if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) {
- if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
- schedGroup = ProcessList.SCHED_GROUP_TOP_APP_BOUND;
- } else {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- }
- app.cached = false;
- app.adjType = "service";
- app.adjTypeCode = ActivityManager.RunningAppProcessInfo
- .REASON_SERVICE_IN_USE;
- app.adjSource = a;
- app.adjSourceProcState = procState;
- app.adjTarget = s.instanceName;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise to service w/activity: " + app);
- }
- }
- }
- }
- }
- }
-
- for (int provi = app.pubProviders.size()-1;
- provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
- || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- || procState > ActivityManager.PROCESS_STATE_TOP);
- provi--) {
- ContentProviderRecord cpr = app.pubProviders.valueAt(provi);
- for (int i = cpr.connections.size()-1;
- i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
- || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- || procState > ActivityManager.PROCESS_STATE_TOP);
- i--) {
- ContentProviderConnection conn = cpr.connections.get(i);
- ProcessRecord client = conn.client;
- if (client == app) {
- // Being our own client is not interesting.
- continue;
- }
- computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now, cycleReEval);
-
- if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) {
- continue;
- }
-
- int clientAdj = client.getCurRawAdj();
- int clientProcState = client.getCurRawProcState();
-
- if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
- // If the other app is cached for any reason, for purposes here
- // we are going to consider it empty.
- clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
- }
- String adjType = null;
- if (adj > clientAdj) {
- if (app.hasShownUi && !wpc.isHomeProcess()
- && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- adjType = "cch-ui-provider";
- } else {
- adj = clientAdj > ProcessList.FOREGROUND_APP_ADJ
- ? clientAdj : ProcessList.FOREGROUND_APP_ADJ;
- app.setCurRawAdj(adj);
- adjType = "provider";
- }
- app.cached &= client.cached;
- }
- if (clientProcState <= ActivityManager.PROCESS_STATE_TOP) {
- if (clientProcState == ActivityManager.PROCESS_STATE_TOP) {
- // Special handling of clients who are in the top state.
- // We *may* want to consider this process to be in the
- // top state as well, but only if there is not another
- // reason for it to be running. Being on the top is a
- // special state, meaning you are specifically running
- // for the current top app. If the process is already
- // running in the background for some other reason, it
- // is more important to continue considering it to be
- // in the background state.
- mayBeTop = true;
- clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
- mayBeTopType = adjType = "provider-top";
- mayBeTopSource = client;
- mayBeTopTarget = cpr.name;
- } else {
- // Special handling for above-top states (persistent
- // processes). These should not bring the current process
- // into the top state, since they are not on top. Instead
- // give them the best state after that.
- clientProcState =
- ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- if (adjType == null) {
- adjType = "provider";
- }
- }
- }
- conn.trackProcState(clientProcState, mAdjSeq, now);
- if (procState > clientProcState) {
- procState = clientProcState;
- app.setCurRawProcState(procState);
- }
- if (client.getCurrentSchedulingGroup() > schedGroup) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- if (adjType != null) {
- app.adjType = adjType;
- app.adjTypeCode = ActivityManager.RunningAppProcessInfo
- .REASON_PROVIDER_IN_USE;
- app.adjSource = client;
- app.adjSourceProcState = clientProcState;
- app.adjTarget = cpr.name;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
- + ": " + app + ", due to " + client
- + " adj=" + adj + " procState="
- + ProcessList.makeProcStateString(procState));
- }
- }
- }
- // If the provider has external (non-framework) process
- // dependencies, ensure that its adjustment is at least
- // FOREGROUND_APP_ADJ.
- if (cpr.hasExternalProcessHandles()) {
- if (adj > ProcessList.FOREGROUND_APP_ADJ) {
- adj = ProcessList.FOREGROUND_APP_ADJ;
- app.setCurRawAdj(adj);
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- app.cached = false;
- app.adjType = "ext-provider";
- app.adjTarget = cpr.name;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to external provider: " + app);
- }
- }
- if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
- procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
- app.setCurRawProcState(procState);
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to external provider: " + app);
- }
- }
- }
- }
-
- if (app.lastProviderTime > 0 &&
- (app.lastProviderTime+mConstants.CONTENT_PROVIDER_RETAIN_TIME) > now) {
- if (adj > ProcessList.PREVIOUS_APP_ADJ) {
- adj = ProcessList.PREVIOUS_APP_ADJ;
- schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
- app.cached = false;
- app.adjType = "recent-provider";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to recent provider: " + app);
- }
- }
- if (procState > PROCESS_STATE_LAST_ACTIVITY) {
- procState = PROCESS_STATE_LAST_ACTIVITY;
- app.adjType = "recent-provider";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to recent provider: " + app);
- }
- }
- }
-
- if (mayBeTop && procState > ActivityManager.PROCESS_STATE_TOP) {
- // A client of one of our services or providers is in the top state. We
- // *may* want to be in the top state, but not if we are already running in
- // the background for some other reason. For the decision here, we are going
- // to pick out a few specific states that we want to remain in when a client
- // is top (states that tend to be longer-term) and otherwise allow it to go
- // to the top state.
- switch (procState) {
- case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
- case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
- // Something else is keeping it at this level, just leave it.
- break;
- case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
- case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
- case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
- case ActivityManager.PROCESS_STATE_SERVICE:
- // These all are longer-term states, so pull them up to the top
- // of the background states, but not all the way to the top state.
- procState = ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- app.adjType = mayBeTopType;
- app.adjSource = mayBeTopSource;
- app.adjTarget = mayBeTopTarget;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
- + ": " + app + ", due to " + mayBeTopSource
- + " adj=" + adj + " procState="
- + ProcessList.makeProcStateString(procState));
- }
- break;
- default:
- // Otherwise, top is a better choice, so take it.
- procState = ActivityManager.PROCESS_STATE_TOP;
- app.adjType = mayBeTopType;
- app.adjSource = mayBeTopSource;
- app.adjTarget = mayBeTopTarget;
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
- + ": " + app + ", due to " + mayBeTopSource
- + " adj=" + adj + " procState="
- + ProcessList.makeProcStateString(procState));
- }
- break;
- }
- }
-
- if (procState >= ActivityManager.PROCESS_STATE_CACHED_EMPTY) {
- if (app.hasClientActivities()) {
- // This is a cached process, but with client activities. Mark it so.
- procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
- app.adjType = "cch-client-act";
- } else if (app.treatLikeActivity) {
- // This is a cached process, but somebody wants us to treat it like it has
- // an activity, okay!
- procState = PROCESS_STATE_CACHED_ACTIVITY;
- app.adjType = "cch-as-act";
- }
- }
-
- if (adj == ProcessList.SERVICE_ADJ) {
- if (doingAll) {
- app.serviceb = mNewNumAServiceProcs > (mNumServiceProcs/3);
- mNewNumServiceProcs++;
- //Slog.i(TAG, "ADJ " + app + " serviceb=" + app.serviceb);
- if (!app.serviceb) {
- // This service isn't far enough down on the LRU list to
- // normally be a B service, but if we are low on RAM and it
- // is large we want to force it down since we would prefer to
- // keep launcher over it.
- if (mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL
- && app.lastPss >= mProcessList.getCachedRestoreThresholdKb()) {
- app.serviceHighRam = true;
- app.serviceb = true;
- //Slog.i(TAG, "ADJ " + app + " high ram!");
- } else {
- mNewNumAServiceProcs++;
- //Slog.i(TAG, "ADJ " + app + " not high ram!");
- }
- } else {
- app.serviceHighRam = false;
- }
- }
- if (app.serviceb) {
- adj = ProcessList.SERVICE_B_ADJ;
- }
- }
-
- app.setCurRawAdj(adj);
-
- //Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
- // " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);
- if (adj > app.maxAdj) {
- adj = app.maxAdj;
- if (app.maxAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- }
-
- // Put bound foreground services in a special sched group for additional
- // restrictions on screen off
- if (procState >= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE &&
- mWakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE) {
- if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) {
- schedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
- }
- }
-
- // Do final modification to adj. Everything we do between here and applying
- // the final setAdj must be done in this function, because we will also use
- // it when computing the final cached adj later. Note that we don't need to
- // worry about this for max adj above, since max adj will always be used to
- // keep it out of the cached vaues.
- app.curAdj = app.modifyRawOomAdj(adj);
- app.setCurrentSchedulingGroup(schedGroup);
- app.setCurProcState(procState);
- app.setCurRawProcState(procState);
- app.setHasForegroundActivities(foregroundActivities);
- app.completedAdjSeq = mAdjSeq;
-
- // if curAdj or curProcState improved, then this process was promoted
- return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState;
- }
-
- /**
- * Checks if for the given app and client, there's a cycle that should skip over the client
- * for now or use partial values to evaluate the effect of the client binding.
- * @param app
- * @param client
- * @param procState procstate evaluated so far for this app
- * @param adj oom_adj evaluated so far for this app
- * @param cycleReEval whether we're currently re-evaluating due to a cycle, and not the first
- * evaluation.
- * @return whether to skip using the client connection at this time
- */
- private boolean shouldSkipDueToCycle(ProcessRecord app, ProcessRecord client,
- int procState, int adj, boolean cycleReEval) {
- if (client.containsCycle) {
- // We've detected a cycle. We should retry computeOomAdjLocked later in
- // case a later-checked connection from a client would raise its
- // priority legitimately.
- app.containsCycle = true;
- // If the client has not been completely evaluated, check if it's worth
- // using the partial values.
- if (client.completedAdjSeq < mAdjSeq) {
- if (cycleReEval) {
- // If the partial values are no better, skip until the next
- // attempt
- if (client.getCurRawProcState() >= procState
- && client.getCurRawAdj() >= adj) {
- return true;
- }
- // Else use the client's partial procstate and adj to adjust the
- // effect of the binding
- } else {
- return true;
- }
- }
- }
- return false;
- }
-
private static final class RecordPssRunnable implements Runnable {
private final ActivityManagerService mService;
private final ProcessRecord mProc;
@@ -17063,291 +16052,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
- long nowElapsed) {
- boolean success = true;
-
- if (app.getCurRawAdj() != app.setRawAdj) {
- app.setRawAdj = app.getCurRawAdj();
- }
-
- int changes = 0;
-
- if (app.curAdj != app.setAdj) {
- // don't compact during bootup
- if (mConstants.USE_COMPACTION && mBooted) {
- // Perform a minor compaction when a perceptible app becomes the prev/home app
- // Perform a major compaction when any app enters cached
- // reminder: here, setAdj is previous state, curAdj is upcoming state
- if (app.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ &&
- (app.curAdj == ProcessList.PREVIOUS_APP_ADJ ||
- app.curAdj == ProcessList.HOME_APP_ADJ)) {
- mAppCompact.compactAppSome(app);
- } else if (app.setAdj < ProcessList.CACHED_APP_MIN_ADJ &&
- app.curAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
- mAppCompact.compactAppFull(app);
- }
- }
- ProcessList.setOomAdj(app.pid, app.uid, app.curAdj);
- if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.info.uid) {
- String msg = "Set " + app.pid + " " + app.processName + " adj "
- + app.curAdj + ": " + app.adjType;
- reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
- }
- app.setAdj = app.curAdj;
- app.verifiedAdj = ProcessList.INVALID_ADJ;
- }
-
- final int curSchedGroup = app.getCurrentSchedulingGroup();
- if (app.setSchedGroup != curSchedGroup) {
- int oldSchedGroup = app.setSchedGroup;
- app.setSchedGroup = curSchedGroup;
- if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) {
- String msg = "Setting sched group of " + app.processName
- + " to " + curSchedGroup + ": " + app.adjType;
- reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
- }
- if (app.waitingToKill != null && app.curReceivers.isEmpty()
- && app.setSchedGroup == ProcessList.SCHED_GROUP_BACKGROUND) {
- app.kill(app.waitingToKill, true);
- success = false;
- } else {
- int processGroup;
- switch (curSchedGroup) {
- case ProcessList.SCHED_GROUP_BACKGROUND:
- processGroup = THREAD_GROUP_BG_NONINTERACTIVE;
- break;
- case ProcessList.SCHED_GROUP_TOP_APP:
- case ProcessList.SCHED_GROUP_TOP_APP_BOUND:
- processGroup = THREAD_GROUP_TOP_APP;
- break;
- case ProcessList.SCHED_GROUP_RESTRICTED:
- processGroup = THREAD_GROUP_RESTRICTED;
- break;
- default:
- processGroup = THREAD_GROUP_DEFAULT;
- break;
- }
- long oldId = Binder.clearCallingIdentity();
- try {
- if (mEnableProcessGroupCgroupFollow) {
- setCgroupProcsProcessGroup(app.info.uid, app.pid, processGroup);
- } else {
- setProcessGroup(app.pid, processGroup);
- }
- if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
- // do nothing if we already switched to RT
- if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- app.getWindowProcessController().onTopProcChanged();
- if (mUseFifoUiScheduling) {
- // Switch UI pipeline for app to SCHED_FIFO
- app.savedPriority = Process.getThreadPriority(app.pid);
- scheduleAsFifoPriority(app.pid, /* suppressLogs */true);
- if (app.renderThreadTid != 0) {
- scheduleAsFifoPriority(app.renderThreadTid,
- /* suppressLogs */true);
- if (DEBUG_OOM_ADJ) {
- Slog.d("UI_FIFO", "Set RenderThread (TID " +
- app.renderThreadTid + ") to FIFO");
- }
- } else {
- if (DEBUG_OOM_ADJ) {
- Slog.d("UI_FIFO", "Not setting RenderThread TID");
- }
- }
- } else {
- // Boost priority for top app UI and render threads
- setThreadPriority(app.pid, TOP_APP_PRIORITY_BOOST);
- if (app.renderThreadTid != 0) {
- try {
- setThreadPriority(app.renderThreadTid,
- TOP_APP_PRIORITY_BOOST);
- } catch (IllegalArgumentException e) {
- // thread died, ignore
- }
- }
- }
- }
- } else if (oldSchedGroup == ProcessList.SCHED_GROUP_TOP_APP &&
- curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- app.getWindowProcessController().onTopProcChanged();
- if (mUseFifoUiScheduling) {
- try {
- // Reset UI pipeline to SCHED_OTHER
- setThreadScheduler(app.pid, SCHED_OTHER, 0);
- setThreadPriority(app.pid, app.savedPriority);
- if (app.renderThreadTid != 0) {
- setThreadScheduler(app.renderThreadTid,
- SCHED_OTHER, 0);
- setThreadPriority(app.renderThreadTid, -4);
- }
- } catch (IllegalArgumentException e) {
- Slog.w(TAG,
- "Failed to set scheduling policy, thread does not exist:\n"
- + e);
- } catch (SecurityException e) {
- Slog.w(TAG, "Failed to set scheduling policy, not allowed:\n" + e);
- }
- } else {
- // Reset priority for top app UI and render threads
- setThreadPriority(app.pid, 0);
- if (app.renderThreadTid != 0) {
- setThreadPriority(app.renderThreadTid, 0);
- }
- }
- }
- } catch (Exception e) {
- if (false) {
- Slog.w(TAG, "Failed setting process group of " + app.pid
- + " to " + app.getCurrentSchedulingGroup());
- Slog.w(TAG, "at location", e);
- }
- } finally {
- Binder.restoreCallingIdentity(oldId);
- }
- }
- }
- if (app.repForegroundActivities != app.hasForegroundActivities()) {
- app.repForegroundActivities = app.hasForegroundActivities();
- changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
- }
- if (app.getReportedProcState() != app.getCurProcState()) {
- app.setReportedProcState(app.getCurProcState());
- if (app.thread != null) {
- try {
- if (false) {
- //RuntimeException h = new RuntimeException("here");
- Slog.i(TAG, "Sending new process state " + app.getReportedProcState()
- + " to " + app /*, h*/);
- }
- app.thread.setProcessState(app.getReportedProcState());
- } catch (RemoteException e) {
- }
- }
- }
- if (app.setProcState == PROCESS_STATE_NONEXISTENT
- || ProcessList.procStatesDifferForMem(app.getCurProcState(), app.setProcState)) {
- if (false && mTestPssMode && app.setProcState >= 0 && app.lastStateTime <= (now-200)) {
- // Experimental code to more aggressively collect pss while
- // running test... the problem is that this tends to collect
- // the data right when a process is transitioning between process
- // states, which will tend to give noisy data.
- long start = SystemClock.uptimeMillis();
- long startTime = SystemClock.currentThreadTimeMillis();
- long pss = Debug.getPss(app.pid, mTmpLong, null);
- long endTime = SystemClock.currentThreadTimeMillis();
- recordPssSampleLocked(app, app.getCurProcState(), pss, mTmpLong[0], mTmpLong[1],
- mTmpLong[2], ProcessStats.ADD_PSS_INTERNAL_SINGLE, endTime-startTime, now);
- mPendingPssProcesses.remove(app);
- Slog.i(TAG, "Recorded pss for " + app + " state " + app.setProcState
- + " to " + app.getCurProcState() + ": "
- + (SystemClock.uptimeMillis()-start) + "ms");
- }
- app.lastStateTime = now;
- app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(),
- app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
- if (DEBUG_PSS) Slog.d(TAG_PSS, "Process state change from "
- + ProcessList.makeProcStateString(app.setProcState) + " to "
- + ProcessList.makeProcStateString(app.getCurProcState()) + " next pss in "
- + (app.nextPssTime-now) + ": " + app);
- } else {
- if (now > app.nextPssTime || (now > (app.lastPssTime+ProcessList.PSS_MAX_INTERVAL)
- && now > (app.lastStateTime+ProcessList.minTimeFromStateChange(
- mTestPssMode)))) {
- if (requestPssLocked(app, app.setProcState)) {
- app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(),
- app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
- }
- } else if (false && DEBUG_PSS) Slog.d(TAG_PSS,
- "Not requesting pss of " + app + ": next=" + (app.nextPssTime-now));
- }
- if (app.setProcState != app.getCurProcState()) {
- if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) {
- String msg = "Proc state change of " + app.processName
- + " to " + ProcessList.makeProcStateString(app.getCurProcState())
- + " (" + app.getCurProcState() + ")" + ": " + app.adjType;
- reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
- }
- boolean setImportant = app.setProcState < ActivityManager.PROCESS_STATE_SERVICE;
- boolean curImportant = app.getCurProcState() < ActivityManager.PROCESS_STATE_SERVICE;
- if (setImportant && !curImportant) {
- // This app is no longer something we consider important enough to allow to use
- // arbitrary amounts of battery power. Note its current CPU time to later know to
- // kill it if it is not behaving well.
- app.setWhenUnimportant(now);
- app.lastCpuTime = 0;
- }
- // Inform UsageStats of important process state change
- // Must be called before updating setProcState
- maybeUpdateUsageStatsLocked(app, nowElapsed);
-
- maybeUpdateLastTopTime(app, now);
-
- app.setProcState = app.getCurProcState();
- if (app.setProcState >= ActivityManager.PROCESS_STATE_HOME) {
- app.notCachedSinceIdle = false;
- }
- if (!doingAll) {
- setProcessTrackerStateLocked(app, mProcessStats.getMemFactorLocked(), now);
- } else {
- app.procStateChanged = true;
- }
- } else if (app.reportedInteraction && (nowElapsed - app.getInteractionEventTime())
- > mConstants.USAGE_STATS_INTERACTION_INTERVAL) {
- // For apps that sit around for a long time in the interactive state, we need
- // to report this at least once a day so they don't go idle.
- maybeUpdateUsageStatsLocked(app, nowElapsed);
- }
-
- if (changes != 0) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "Changes in " + app + ": " + changes);
- int i = mPendingProcessChanges.size()-1;
- ProcessChangeItem item = null;
- while (i >= 0) {
- item = mPendingProcessChanges.get(i);
- if (item.pid == app.pid) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "Re-using existing item: " + item);
- break;
- }
- i--;
- }
- if (i < 0) {
- // No existing item in pending changes; need a new one.
- final int NA = mAvailProcessChanges.size();
- if (NA > 0) {
- item = mAvailProcessChanges.remove(NA-1);
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "Retrieving available item: " + item);
- } else {
- item = new ProcessChangeItem();
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "Allocating new item: " + item);
- }
- item.changes = 0;
- item.pid = app.pid;
- item.uid = app.info.uid;
- if (mPendingProcessChanges.size() == 0) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "*** Enqueueing dispatch processes changed!");
- mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG).sendToTarget();
- }
- mPendingProcessChanges.add(item);
- }
- item.changes |= changes;
- item.foregroundActivities = app.repForegroundActivities;
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
- "Item " + Integer.toHexString(System.identityHashCode(item))
- + " " + app.toShortString() + ": changes=" + item.changes
- + " foreground=" + item.foregroundActivities
- + " type=" + app.adjType + " source=" + app.adjSource
- + " target=" + app.adjTarget);
- }
-
- return success;
- }
-
private boolean isEphemeralLocked(int uid) {
String packages[] = mContext.getPackageManager().getPackagesForUid(uid);
if (packages == null || packages.length != 1) { // Ephemeral apps cannot share uid
@@ -17461,78 +16165,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private void maybeUpdateUsageStatsLocked(ProcessRecord app, long nowElapsed) {
- if (DEBUG_USAGE_STATS) {
- Slog.d(TAG, "Checking proc [" + Arrays.toString(app.getPackageList())
- + "] state changes: old = " + app.setProcState + ", new = "
- + app.getCurProcState());
- }
- if (mUsageStatsService == null) {
- return;
- }
- boolean isInteraction;
- // To avoid some abuse patterns, we are going to be careful about what we consider
- // to be an app interaction. Being the top activity doesn't count while the display
- // is sleeping, nor do short foreground services.
- if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_TOP) {
- isInteraction = true;
- app.setFgInteractionTime(0);
- } else if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- if (app.getFgInteractionTime() == 0) {
- app.setFgInteractionTime(nowElapsed);
- isInteraction = false;
- } else {
- isInteraction = nowElapsed > app.getFgInteractionTime()
- + mConstants.SERVICE_USAGE_INTERACTION_TIME;
- }
- } else {
- isInteraction =
- app.getCurProcState() <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
- app.setFgInteractionTime(0);
- }
- if (isInteraction
- && (!app.reportedInteraction || (nowElapsed - app.getInteractionEventTime())
- > mConstants.USAGE_STATS_INTERACTION_INTERVAL)) {
- app.setInteractionEventTime(nowElapsed);
- String[] packages = app.getPackageList();
- if (packages != null) {
- for (int i = 0; i < packages.length; i++) {
- mUsageStatsService.reportEvent(packages[i], app.userId,
- UsageEvents.Event.SYSTEM_INTERACTION);
- }
- }
- }
- app.reportedInteraction = isInteraction;
- if (!isInteraction) {
- app.setInteractionEventTime(0);
- }
- }
-
- private void maybeUpdateLastTopTime(ProcessRecord app, long nowUptime) {
- if (app.setProcState <= ActivityManager.PROCESS_STATE_TOP
- && app.getCurProcState() > ActivityManager.PROCESS_STATE_TOP) {
- app.lastTopTime = nowUptime;
- }
- }
-
- private final void setProcessTrackerStateLocked(ProcessRecord proc, int memFactor, long now) {
+ final void setProcessTrackerStateLocked(ProcessRecord proc, int memFactor, long now) {
if (proc.thread != null && proc.baseProcessTracker != null) {
proc.baseProcessTracker.setState(
proc.getReportedProcState(), memFactor, now, proc.pkgList.mPkgList);
}
}
- private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
- ProcessRecord TOP_APP, boolean doingAll, long now) {
- if (app.thread == null) {
- return false;
- }
-
- computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now, false);
-
- return applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime());
- }
-
@GuardedBy("this")
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
boolean oomAdj) {
@@ -17615,29 +16254,10 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
@GuardedBy("this")
final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) {
- final ProcessRecord TOP_APP = getTopAppLocked();
- final boolean wasCached = app.cached;
-
- mAdjSeq++;
-
- // This is the desired cached adjusment we want to tell it to use.
- // If our app is currently cached, we know it, and that is it. Otherwise,
- // we don't know it yet, and it needs to now be cached we will then
- // need to do a complete oom adj.
- final int cachedAdj = app.getCurRawAdj() >= ProcessList.CACHED_APP_MIN_ADJ
- ? app.getCurRawAdj() : ProcessList.UNKNOWN_ADJ;
- boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
- SystemClock.uptimeMillis());
- if (oomAdjAll
- && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
- // Changed to/from cached state, so apps after it in the LRU
- // list may also be changed.
- updateOomAdjLocked();
- }
- return success;
+ return mOomAdjuster.updateOomAdjLocked(app, oomAdjAll);
}
- private static final class ProcStatsRunnable implements Runnable {
+ static final class ProcStatsRunnable implements Runnable {
private final ActivityManagerService mService;
private final ProcessStatsService mProcessStats;
@@ -17828,426 +16448,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("this")
final void updateOomAdjLocked() {
- mOomAdjProfiler.oomAdjStarted();
- final ProcessRecord TOP_APP = getTopAppLocked();
- final long now = SystemClock.uptimeMillis();
- final long nowElapsed = SystemClock.elapsedRealtime();
- final long oldTime = now - ProcessList.MAX_EMPTY_TIME;
- final int N = mProcessList.getLruSizeLocked();
-
- // Reset state in all uid records.
- for (int i=mActiveUids.size()-1; i>=0; i--) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
- if (false && DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
- "Starting update of " + uidRec);
- uidRec.reset();
- }
-
- if (mAtmInternal != null) {
- mAtmInternal.rankTaskLayersIfNeeded();
- }
-
- mAdjSeq++;
- mNewNumServiceProcs = 0;
- mNewNumAServiceProcs = 0;
-
- final int emptyProcessLimit = mConstants.CUR_MAX_EMPTY_PROCESSES;
- final int cachedProcessLimit = mConstants.CUR_MAX_CACHED_PROCESSES - emptyProcessLimit;
-
- // Let's determine how many processes we have running vs.
- // how many slots we have for background processes; we may want
- // to put multiple processes in a slot of there are enough of
- // them.
- final int numSlots = (ProcessList.CACHED_APP_MAX_ADJ
- - ProcessList.CACHED_APP_MIN_ADJ + 1) / 2
- / ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
- int numEmptyProcs = N - mNumNonCachedProcs - mNumCachedHiddenProcs;
- if (numEmptyProcs > cachedProcessLimit) {
- // If there are more empty processes than our limit on cached
- // processes, then use the cached process limit for the factor.
- // This ensures that the really old empty processes get pushed
- // down to the bottom, so if we are running low on memory we will
- // have a better chance at keeping around more cached processes
- // instead of a gazillion empty processes.
- numEmptyProcs = cachedProcessLimit;
- }
- int emptyFactor = (numEmptyProcs + numSlots - 1) / numSlots;
- if (emptyFactor < 1) emptyFactor = 1;
- int cachedFactor = (mNumCachedHiddenProcs > 0 ? (mNumCachedHiddenProcs + numSlots - 1) : 1)
- / numSlots;
- if (cachedFactor < 1) cachedFactor = 1;
- int stepCached = -1;
- int stepEmpty = -1;
- int numCached = 0;
- int numCachedExtraGroup = 0;
- int numEmpty = 0;
- int numTrimming = 0;
- int lastCachedGroup = 0;
- int lastCachedGroupImportance = 0;
- int lastCachedGroupUid = 0;
-
- mNumNonCachedProcs = 0;
- mNumCachedHiddenProcs = 0;
-
- // First update the OOM adjustment for each of the
- // application processes based on their current state.
- int curCachedAdj = ProcessList.CACHED_APP_MIN_ADJ;
- int nextCachedAdj = curCachedAdj + (ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2);
- int curCachedImpAdj = 0;
- int curEmptyAdj = ProcessList.CACHED_APP_MIN_ADJ + ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
- int nextEmptyAdj = curEmptyAdj + (ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2);
- ProcessRecord selectedAppRecord = null;
- long serviceLastActivity = 0;
- int numBServices = 0;
-
- boolean retryCycles = false;
-
- // need to reset cycle state before calling computeOomAdjLocked because of service connections
- for (int i=N-1; i>=0; i--) {
- ProcessRecord app = mProcessList.mLruProcesses.get(i);
- app.containsCycle = false;
- app.setCurRawProcState(PROCESS_STATE_CACHED_EMPTY);
- app.setCurRawAdj(ProcessList.UNKNOWN_ADJ);
- }
- for (int i=N-1; i>=0; i--) {
- ProcessRecord app = mProcessList.mLruProcesses.get(i);
- if (mEnableBServicePropagation && app.serviceb
- && (app.curAdj == ProcessList.SERVICE_B_ADJ)) {
- numBServices++;
- for (int s = app.services.size() - 1; s >= 0; s--) {
- ServiceRecord sr = app.services.valueAt(s);
- if (DEBUG_OOM_ADJ) Slog.d(TAG,"app.processName = " + app.processName
- + " serviceb = " + app.serviceb + " s = " + s + " sr.lastActivity = "
- + sr.lastActivity + " packageName = " + sr.packageName
- + " processName = " + sr.processName);
- if (SystemClock.uptimeMillis() - sr.lastActivity
- < mMinBServiceAgingTime) {
- if (DEBUG_OOM_ADJ) {
- Slog.d(TAG,"Not aged enough!!!");
- }
- continue;
- }
- if (serviceLastActivity == 0) {
- serviceLastActivity = sr.lastActivity;
- selectedAppRecord = app;
- } else if (sr.lastActivity < serviceLastActivity) {
- serviceLastActivity = sr.lastActivity;
- selectedAppRecord = app;
- }
- }
- }
- if (DEBUG_OOM_ADJ && selectedAppRecord != null) Slog.d(TAG,
- "Identified app.processName = " + selectedAppRecord.processName
- + " app.pid = " + selectedAppRecord.pid);
- if (!app.killedByAm && app.thread != null) {
- app.procStateChanged = false;
- computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now, false);
-
- // if any app encountered a cycle, we need to perform an additional loop later
- retryCycles |= app.containsCycle;
-
- // If we haven't yet assigned the final cached adj
- // to the process, do that now.
- if (app.curAdj >= ProcessList.UNKNOWN_ADJ) {
- switch (app.getCurProcState()) {
- case PROCESS_STATE_CACHED_ACTIVITY:
- case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
- case ActivityManager.PROCESS_STATE_CACHED_RECENT:
- // Figure out the next cached level, taking into account groups.
- boolean inGroup = false;
- if (app.connectionGroup != 0) {
- if (lastCachedGroupUid == app.uid
- && lastCachedGroup == app.connectionGroup) {
- // This is in the same group as the last process, just tweak
- // adjustment by importance.
- if (app.connectionImportance > lastCachedGroupImportance) {
- lastCachedGroupImportance = app.connectionImportance;
- if (curCachedAdj < nextCachedAdj
- && curCachedAdj < ProcessList.CACHED_APP_MAX_ADJ) {
- curCachedImpAdj++;
- }
- }
- inGroup = true;
- } else {
- lastCachedGroupUid = app.uid;
- lastCachedGroup = app.connectionGroup;
- lastCachedGroupImportance = app.connectionImportance;
- }
- }
- if (!inGroup && curCachedAdj != nextCachedAdj) {
- stepCached++;
- curCachedImpAdj = 0;
- if (stepCached >= cachedFactor) {
- stepCached = 0;
- curCachedAdj = nextCachedAdj;
- nextCachedAdj += ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2;
- if (nextCachedAdj > ProcessList.CACHED_APP_MAX_ADJ) {
- nextCachedAdj = ProcessList.CACHED_APP_MAX_ADJ;
- }
- }
- }
- // This process is a cached process holding activities...
- // assign it the next cached value for that type, and then
- // step that cached level.
- app.setCurRawAdj(curCachedAdj + curCachedImpAdj);
- app.curAdj = app.modifyRawOomAdj(curCachedAdj + curCachedImpAdj);
- if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning activity LRU #" + i
- + " adj: " + app.curAdj + " (curCachedAdj=" + curCachedAdj
- + " curCachedImpAdj=" + curCachedImpAdj + ")");
- break;
- default:
- // Figure out the next cached level.
- if (curEmptyAdj != nextEmptyAdj) {
- stepEmpty++;
- if (stepEmpty >= emptyFactor) {
- stepEmpty = 0;
- curEmptyAdj = nextEmptyAdj;
- nextEmptyAdj += ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2;
- if (nextEmptyAdj > ProcessList.CACHED_APP_MAX_ADJ) {
- nextEmptyAdj = ProcessList.CACHED_APP_MAX_ADJ;
- }
- }
- }
- // For everything else, assign next empty cached process
- // level and bump that up. Note that this means that
- // long-running services that have dropped down to the
- // cached level will be treated as empty (since their process
- // state is still as a service), which is what we want.
- app.setCurRawAdj(curEmptyAdj);
- app.curAdj = app.modifyRawOomAdj(curEmptyAdj);
- if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning empty LRU #" + i
- + " adj: " + app.curAdj + " (curEmptyAdj=" + curEmptyAdj
- + ")");
- break;
- }
- }
- }
- }
-
- // Cycle strategy:
- // - Retry computing any process that has encountered a cycle.
- // - Continue retrying until no process was promoted.
- // - Iterate from least important to most important.
- int cycleCount = 0;
- while (retryCycles && cycleCount < 10) {
- cycleCount++;
- retryCycles = false;
-
- for (int i=0; i<N; i++) {
- ProcessRecord app = mProcessList.mLruProcesses.get(i);
- if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
- app.adjSeq--;
- app.completedAdjSeq--;
- }
- }
-
- for (int i=0; i<N; i++) {
- ProcessRecord app = mProcessList.mLruProcesses.get(i);
- if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
- if (computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now,
- true)) {
- retryCycles = true;
- }
- }
- }
- }
-
- lastCachedGroup = lastCachedGroupUid = 0;
-
- for (int i=N-1; i>=0; i--) {
- ProcessRecord app = mProcessList.mLruProcesses.get(i);
- if (!app.killedByAm && app.thread != null) {
- applyOomAdjLocked(app, true, now, nowElapsed);
-
- // Count the number of process types.
- switch (app.getCurProcState()) {
- case PROCESS_STATE_CACHED_ACTIVITY:
- case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
- mNumCachedHiddenProcs++;
- numCached++;
- if (app.connectionGroup != 0) {
- if (lastCachedGroupUid == app.uid
- && lastCachedGroup == app.connectionGroup) {
- // If this process is the next in the same group, we don't
- // want it to count against our limit of the number of cached
- // processes, so bump up the group count to account for it.
- numCachedExtraGroup++;
- } else {
- lastCachedGroupUid = app.uid;
- lastCachedGroup = app.connectionGroup;
- }
- } else {
- lastCachedGroupUid = lastCachedGroup = 0;
- }
- if ((numCached - numCachedExtraGroup) > cachedProcessLimit) {
- app.kill("cached #" + numCached, true);
- }
- break;
- case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
- if (numEmpty > mConstants.CUR_TRIM_EMPTY_PROCESSES
- && app.lastActivityTime < oldTime) {
- app.kill("empty for "
- + ((oldTime + ProcessList.MAX_EMPTY_TIME - app.lastActivityTime)
- / 1000) + "s", true);
- } else {
- numEmpty++;
- if (numEmpty > emptyProcessLimit) {
- app.kill("empty #" + numEmpty, true);
- }
- }
- break;
- default:
- mNumNonCachedProcs++;
- break;
- }
-
- if (app.isolated && app.services.size() <= 0 && app.isolatedEntryPoint == null) {
- // If this is an isolated process, there are no services
- // running in it, and it's not a special process with a
- // custom entry point, then the process is no longer
- // needed. We agressively kill these because we can by
- // definition not re-use the same process again, and it is
- // good to avoid having whatever code was running in them
- // left sitting around after no longer needed.
- app.kill("isolated not needed", true);
- } else {
- // Keeping this process, update its uid.
- final UidRecord uidRec = app.uidRecord;
- if (uidRec != null) {
- uidRec.ephemeral = app.info.isInstantApp();
- if (uidRec.getCurProcState() > app.getCurProcState()) {
- uidRec.setCurProcState(app.getCurProcState());
- }
- if (app.hasForegroundServices()) {
- uidRec.foregroundServices = true;
- }
- }
- }
-
- if (app.getCurProcState() >= ActivityManager.PROCESS_STATE_HOME
- && !app.killedByAm) {
- numTrimming++;
- }
- }
- }
- if ((numBServices > mBServiceAppThreshold) && (true == mAllowLowerMemLevel)
- && (selectedAppRecord != null)) {
- ProcessList.setOomAdj(selectedAppRecord.pid, selectedAppRecord.info.uid,
- ProcessList.CACHED_APP_MAX_ADJ);
- selectedAppRecord.setAdj = selectedAppRecord.curAdj;
- if (DEBUG_OOM_ADJ) Slog.d(TAG,"app.processName = " + selectedAppRecord.processName
- + " app.pid = " + selectedAppRecord.pid + " is moved to higher adj");
- }
-
- incrementProcStateSeqAndNotifyAppsLocked();
-
- mNumServiceProcs = mNewNumServiceProcs;
-
- boolean allChanged = updateLowMemStateLocked(numCached, numEmpty, numTrimming);
-
- if (mAlwaysFinishActivities) {
- // Need to do this on its own message because the stack may not
- // be in a consistent state at this point.
- mAtmInternal.scheduleDestroyAllActivities("always-finish");
- }
-
- if (allChanged) {
- requestPssAllProcsLocked(now, false, mProcessStats.isMemFactorLowered());
- }
-
- ArrayList<UidRecord> becameIdle = null;
-
- // Update from any uid changes.
- if (mLocalPowerManager != null) {
- mLocalPowerManager.startUidChanges();
- }
- for (int i=mActiveUids.size()-1; i>=0; i--) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
- int uidChange = UidRecord.CHANGE_PROCSTATE;
- if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
- && (uidRec.setProcState != uidRec.getCurProcState()
- || uidRec.setWhitelist != uidRec.curWhitelist)) {
- if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Changes in " + uidRec
- + ": proc state from " + uidRec.setProcState + " to "
- + uidRec.getCurProcState() + ", whitelist from " + uidRec.setWhitelist
- + " to " + uidRec.curWhitelist);
- if (ActivityManager.isProcStateBackground(uidRec.getCurProcState())
- && !uidRec.curWhitelist) {
- // UID is now in the background (and not on the temp whitelist). Was it
- // previously in the foreground (or on the temp whitelist)?
- if (!ActivityManager.isProcStateBackground(uidRec.setProcState)
- || uidRec.setWhitelist) {
- uidRec.lastBackgroundTime = nowElapsed;
- if (!mHandler.hasMessages(IDLE_UIDS_MSG)) {
- // Note: the background settle time is in elapsed realtime, while
- // the handler time base is uptime. All this means is that we may
- // stop background uids later than we had intended, but that only
- // happens because the device was sleeping so we are okay anyway.
- mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
- mConstants.BACKGROUND_SETTLE_TIME);
- }
- }
- if (uidRec.idle && !uidRec.setIdle) {
- uidChange = UidRecord.CHANGE_IDLE;
- if (becameIdle == null) {
- becameIdle = new ArrayList<>();
- }
- becameIdle.add(uidRec);
- }
- } else {
- if (uidRec.idle) {
- uidChange = UidRecord.CHANGE_ACTIVE;
- EventLogTags.writeAmUidActive(uidRec.uid);
- uidRec.idle = false;
- }
- uidRec.lastBackgroundTime = 0;
- }
- final boolean wasCached = uidRec.setProcState
- > ActivityManager.PROCESS_STATE_RECEIVER;
- final boolean isCached = uidRec.getCurProcState()
- > ActivityManager.PROCESS_STATE_RECEIVER;
- if (wasCached != isCached || uidRec.setProcState == PROCESS_STATE_NONEXISTENT) {
- uidChange |= isCached ? UidRecord.CHANGE_CACHED : UidRecord.CHANGE_UNCACHED;
- }
- uidRec.setProcState = uidRec.getCurProcState();
- uidRec.setWhitelist = uidRec.curWhitelist;
- uidRec.setIdle = uidRec.idle;
- enqueueUidChangeLocked(uidRec, -1, uidChange);
- noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
- if (uidRec.foregroundServices) {
- mServices.foregroundServiceProcStateChangedLocked(uidRec);
- }
- }
- }
- if (mLocalPowerManager != null) {
- mLocalPowerManager.finishUidChanges();
- }
-
- if (becameIdle != null) {
- // If we have any new uids that became idle this time, we need to make sure
- // they aren't left with running services.
- for (int i = becameIdle.size() - 1; i >= 0; i--) {
- mServices.stopInBackgroundLocked(becameIdle.get(i).uid);
- }
- }
-
- if (mProcessStats.shouldWriteNowLocked(now)) {
- mHandler.post(new ProcStatsRunnable(ActivityManagerService.this, mProcessStats));
- }
-
- // Run this after making sure all procstates are updated.
- mProcessStats.updateTrackingAssociationsLocked(mAdjSeq, now);
-
- if (DEBUG_OOM_ADJ) {
- final long duration = SystemClock.uptimeMillis() - now;
- if (false) {
- Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms",
- new RuntimeException("here").fillInStackTrace());
- } else {
- Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms");
- }
- }
- mOomAdjProfiler.oomAdjEnded();
+ mOomAdjuster.updateOomAdjLocked();
}
@Override
@@ -18282,9 +16483,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mLocalPowerManager.startUidChanges();
}
final int appId = UserHandle.getAppId(pkgUid);
- final int N = mActiveUids.size();
- for (int i=N-1; i>=0; i--) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
+ final int N = mProcessList.mActiveUids.size();
+ for (int i = N - 1; i >= 0; i--) {
+ final UidRecord uidRec = mProcessList.mActiveUids.valueAt(i);
final long bgTime = uidRec.lastBackgroundTime;
if (bgTime > 0 && !uidRec.idle) {
if (UserHandle.getAppId(uidRec.uid) == appId) {
@@ -18309,49 +16510,17 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ /** Make the currently active UIDs idle after a certain grace period. */
final void idleUids() {
synchronized (this) {
- final int N = mActiveUids.size();
- if (N <= 0) {
- return;
- }
- final long nowElapsed = SystemClock.elapsedRealtime();
- final long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME;
- long nextTime = 0;
- if (mLocalPowerManager != null) {
- mLocalPowerManager.startUidChanges();
- }
- for (int i=N-1; i>=0; i--) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
- final long bgTime = uidRec.lastBackgroundTime;
- if (bgTime > 0 && !uidRec.idle) {
- if (bgTime <= maxBgTime) {
- EventLogTags.writeAmUidIdle(uidRec.uid);
- uidRec.idle = true;
- uidRec.setIdle = true;
- doStopUidLocked(uidRec.uid, uidRec);
- } else {
- if (nextTime == 0 || nextTime > bgTime) {
- nextTime = bgTime;
- }
- }
- }
- }
- if (mLocalPowerManager != null) {
- mLocalPowerManager.finishUidChanges();
- }
- if (nextTime > 0) {
- mHandler.removeMessages(IDLE_UIDS_MSG);
- mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
- nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed);
- }
+ mOomAdjuster.idleUidsLocked();
}
}
/**
* Checks if any uid is coming from background to foreground or vice versa and if so, increments
* the {@link UidRecord#curProcStateSeq} corresponding to that uid using global seq counter
- * {@link #mProcStateSeqCounter} and notifies the app if it needs to block.
+ * {@link ProcessList#mProcStateSeqCounter} and notifies the app if it needs to block.
*/
@VisibleForTesting
@GuardedBy("this")
@@ -18361,8 +16530,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// Used for identifying which uids need to block for network.
ArrayList<Integer> blockingUids = null;
- for (int i = mActiveUids.size() - 1; i >= 0; --i) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
+ for (int i = mProcessList.mActiveUids.size() - 1; i >= 0; --i) {
+ final UidRecord uidRec = mProcessList.mActiveUids.valueAt(i);
// If the network is not restricted for uid, then nothing to do here.
if (!mInjector.isNetworkRestrictedForUid(uidRec.uid)) {
continue;
@@ -18410,13 +16579,15 @@ public class ActivityManagerService extends IActivityManager.Stub
continue;
}
if (!app.killedByAm && app.thread != null) {
- final UidRecord uidRec = mActiveUids.get(app.uid);
+ final UidRecord uidRec = mProcessList.getUidRecordLocked(app.uid);
try {
if (DEBUG_NETWORK) {
Slog.d(TAG_NETWORK, "Informing app thread that it needs to block: "
+ uidRec);
}
- app.thread.setNetworkBlockSeq(uidRec.curProcStateSeq);
+ if (uidRec != null) {
+ app.thread.setNetworkBlockSeq(uidRec.curProcStateSeq);
+ }
} catch (RemoteException ignored) {
}
}
@@ -18457,7 +16628,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final void runInBackgroundDisabled(int uid) {
synchronized (this) {
- UidRecord uidRec = mActiveUids.get(uid);
+ UidRecord uidRec = mProcessList.getUidRecordLocked(uid);
if (uidRec != null) {
// This uid is actually running... should it be considered background now?
if (uidRec.idle) {
@@ -18470,24 +16641,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- /**
- * Call {@link #doStopUidLocked} (which will also stop background services) for all idle UIDs.
- */
- void doStopUidForIdleUidsLocked() {
- final int size = mActiveUids.size();
- for (int i = 0; i < size; i++) {
- final int uid = mActiveUids.keyAt(i);
- if (UserHandle.isCore(uid)) {
- continue;
- }
- final UidRecord uidRec = mActiveUids.valueAt(i);
- if (!uidRec.idle) {
- continue;
- }
- doStopUidLocked(uidRec.uid, uidRec);
- }
- }
-
+ @GuardedBy("this")
final void doStopUidLocked(int uid, final UidRecord uidRec) {
mServices.stopInBackgroundLocked(uid);
enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE);
@@ -18571,27 +16725,12 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("this")
final void setAppIdTempWhitelistStateLocked(int appId, boolean onWhitelist) {
- boolean changed = false;
- for (int i=mActiveUids.size()-1; i>=0; i--) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
- if (UserHandle.getAppId(uidRec.uid) == appId && uidRec.curWhitelist != onWhitelist) {
- uidRec.curWhitelist = onWhitelist;
- changed = true;
- }
- }
- if (changed) {
- updateOomAdjLocked();
- }
+ mOomAdjuster.setAppIdTempWhitelistStateLocked(appId, onWhitelist);
}
@GuardedBy("this")
final void setUidTempWhitelistStateLocked(int uid, boolean onWhitelist) {
- boolean changed = false;
- final UidRecord uidRec = mActiveUids.get(uid);
- if (uidRec != null && uidRec.curWhitelist != onWhitelist) {
- uidRec.curWhitelist = onWhitelist;
- updateOomAdjLocked();
- }
+ mOomAdjuster.setUidTempWhitelistStateLocked(uid, onWhitelist);
}
final void trimApplications() {
@@ -19254,7 +17393,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
UidRecord record;
synchronized (ActivityManagerService.this) {
- record = mActiveUids.get(uid);
+ record = mProcessList.getUidRecordLocked(uid);
if (record == null) {
if (DEBUG_NETWORK) {
Slog.d(TAG_NETWORK, "No active uidRecord for uid: " + uid
@@ -19585,8 +17724,8 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public ComponentName startServiceInPackage(int uid, Intent service, String resolvedType,
- boolean fgRequired, String callingPackage, int userId)
- throws TransactionTooLargeException {
+ boolean fgRequired, String callingPackage, int userId,
+ boolean allowBackgroundActivityStarts) throws TransactionTooLargeException {
synchronized(ActivityManagerService.this) {
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
"startServiceInPackage: " + service + " type=" + resolvedType);
@@ -19594,7 +17733,8 @@ public class ActivityManagerService extends IActivityManager.Stub
ComponentName res;
try {
res = mServices.startServiceLocked(null, service,
- resolvedType, -1, uid, fgRequired, callingPackage, userId);
+ resolvedType, -1, uid, fgRequired, callingPackage, userId,
+ allowBackgroundActivityStarts);
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -19792,6 +17932,25 @@ public class ActivityManagerService extends IActivityManager.Stub
return pr == null ? Zygote.MOUNT_EXTERNAL_NONE : pr.mountMode;
}
}
+
+ @Override
+ public boolean isAppForeground(int uid) {
+ return ActivityManagerService.this.isAppForeground(uid);
+ }
+
+ @Override
+ public void clearPendingBackup(int userId) {
+ ActivityManagerService.this.clearPendingBackup(userId);
+ }
+
+ /**
+ * When power button is very long pressed, call this interface to do some pre-shutdown work
+ * like persisting database etc.
+ */
+ @Override
+ public void prepareForPossibleShutdown() {
+ ActivityManagerService.this.prepareForPossibleShutdown();
+ }
}
long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
@@ -19867,7 +18026,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
UidRecord record;
synchronized (this) {
- record = mActiveUids.get(callingUid);
+ record = mProcessList.getUidRecordLocked(callingUid);
if (record == null) {
return;
}
@@ -20048,6 +18207,18 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ /**
+ * When power button is very long pressed, call this interface to do some pre-shutdown work
+ * like persisting database etc.
+ */
+ public void prepareForPossibleShutdown() {
+ synchronized (this) {
+ if (mUsageStatsService != null) {
+ mUsageStatsService.prepareForPossibleShutdown();
+ }
+ }
+ }
+
@VisibleForTesting
public static class Injector {
private NetworkManagementInternal mNmi;
diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java
index aee16c3b9ddc..fe27c495ef55 100644
--- a/services/core/java/com/android/server/am/AppCompactor.java
+++ b/services/core/java/com/android/server/am/AppCompactor.java
@@ -44,7 +44,11 @@ public final class AppCompactor {
*/
final ArrayList<ProcessRecord> mPendingCompactionProcesses = new ArrayList<ProcessRecord>();
- /*
+ static final int COMPACT_PROCESS_SOME = 1;
+ static final int COMPACT_PROCESS_FULL = 2;
+ static final int COMPACT_PROCESS_MSG = 1;
+
+ /**
* This thread must be moved to the system background cpuset.
* If that doesn't happen, it's probably going to draw a lot of power.
* However, this has to happen after the first updateOomAdjLocked, because
@@ -53,13 +57,22 @@ public final class AppCompactor {
*/
final ServiceThread mCompactionThread;
- static final int COMPACT_PROCESS_SOME = 1;
- static final int COMPACT_PROCESS_FULL = 2;
- static final int COMPACT_PROCESS_MSG = 1;
- final Handler mCompactionHandler;
+ final private Handler mCompactionHandler;
- final ActivityManagerService mAm;
- final ActivityManagerConstants mConstants;
+ final private ActivityManagerService mAm;
+ final private ActivityManagerConstants mConstants;
+
+ final private String COMPACT_ACTION_FILE = "file";
+ final private String COMPACT_ACTION_ANON = "anon";
+ final private String COMPACT_ACTION_FULL = "full";
+
+ final private String compactActionSome;
+ final private String compactActionFull;
+
+ final private long throttleSomeSome;
+ final private long throttleSomeFull;
+ final private long throttleFullSome;
+ final private long throttleFullFull;
public AppCompactor(ActivityManagerService am) {
mAm = am;
@@ -69,6 +82,41 @@ public final class AppCompactor {
THREAD_PRIORITY_FOREGROUND, true);
mCompactionThread.start();
mCompactionHandler = new MemCompactionHandler(this);
+
+ switch(mConstants.COMPACT_ACTION_1) {
+ case 1:
+ compactActionSome = COMPACT_ACTION_FILE;
+ break;
+ case 2:
+ compactActionSome = COMPACT_ACTION_ANON;
+ break;
+ case 3:
+ compactActionSome = COMPACT_ACTION_FULL;
+ break;
+ default:
+ compactActionSome = COMPACT_ACTION_FILE;
+ break;
+ }
+
+ switch(mConstants.COMPACT_ACTION_2) {
+ case 1:
+ compactActionFull = COMPACT_ACTION_FILE;
+ break;
+ case 2:
+ compactActionFull = COMPACT_ACTION_ANON;
+ break;
+ case 3:
+ compactActionFull = COMPACT_ACTION_FULL;
+ break;
+ default:
+ compactActionFull = COMPACT_ACTION_FULL;
+ break;
+ }
+
+ throttleSomeSome = mConstants.COMPACT_THROTTLE_1;
+ throttleSomeFull = mConstants.COMPACT_THROTTLE_2;
+ throttleFullSome = mConstants.COMPACT_THROTTLE_3;
+ throttleFullFull = mConstants.COMPACT_THROTTLE_4;
}
// Must be called while holding AMS lock.
@@ -128,18 +176,16 @@ public final class AppCompactor {
}
// basic throttling
+ // use the ActivityManagerConstants knobs to determine whether current/prevous
+ // compaction combo should be throtted or not
if (pendingAction == COMPACT_PROCESS_SOME) {
- // if we're compacting some, then compact if >10s after last full
- // or >5s after last some
- if ((lastCompactAction == COMPACT_PROCESS_SOME && (start - lastCompactTime < 5000)) ||
- (lastCompactAction == COMPACT_PROCESS_FULL && (start - lastCompactTime < 10000))) {
+ if ((lastCompactAction == COMPACT_PROCESS_SOME && (start - lastCompactTime < throttleSomeSome)) ||
+ (lastCompactAction == COMPACT_PROCESS_FULL && (start - lastCompactTime < throttleSomeFull))) {
return;
}
} else {
- // if we're compacting full, then compact if >10s after last full
- // or >.5s after last some
- if ((lastCompactAction == COMPACT_PROCESS_SOME && (start - lastCompactTime < 500)) ||
- (lastCompactAction == COMPACT_PROCESS_FULL && (start - lastCompactTime < 10000))) {
+ if ((lastCompactAction == COMPACT_PROCESS_SOME && (start - lastCompactTime < throttleFullSome)) ||
+ (lastCompactAction == COMPACT_PROCESS_FULL && (start - lastCompactTime < throttleFullFull))) {
return;
}
}
@@ -151,9 +197,9 @@ public final class AppCompactor {
long[] rssBefore = Process.getRss(pid);
FileOutputStream fos = new FileOutputStream("/proc/" + pid + "/reclaim");
if (pendingAction == COMPACT_PROCESS_SOME) {
- action = "file";
+ action = compactActionSome;
} else {
- action = "all";
+ action = compactActionFull;
}
fos.write(action.getBytes());
fos.close();
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index f9a77af631af..d3953b58296c 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -67,8 +67,10 @@ final class CoreSettingsObserver extends ContentObserver {
sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS_GLES, String.class);
sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class);
sGlobalSettingToTypeMap.put(Settings.Global.SMS_ACCESS_RESTRICTION_ENABLED, int.class);
+ sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_ALL_APPS, int.class);
sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_IN_APPS, String.class);
- sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACK_LIST, String.class);
+ sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_OUT_APPS, String.class);
+ sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACKLIST, String.class);
// add other global settings here...
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
new file mode 100644
index 000000000000..be910d46a8ad
--- /dev/null
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -0,0 +1,2107 @@
+/*
+ * Copyright (C) 2019 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.am;
+
+import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
+import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
+import static android.os.Process.SCHED_OTHER;
+import static android.os.Process.THREAD_GROUP_BG_NONINTERACTIVE;
+import static android.os.Process.THREAD_GROUP_DEFAULT;
+import static android.os.Process.THREAD_GROUP_RESTRICTED;
+import static android.os.Process.THREAD_GROUP_TOP_APP;
+import static android.os.Process.setProcessGroup;
+import static android.os.Process.setThreadPriority;
+import static android.os.Process.setThreadScheduler;
+
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ_REASON;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESS_OBSERVERS;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS;
+import static com.android.server.am.ActivityManagerService.DISPATCH_OOM_ADJ_OBSERVER_MSG;
+import static com.android.server.am.ActivityManagerService.DISPATCH_PROCESSES_CHANGED_UI_MSG;
+import static com.android.server.am.ActivityManagerService.IDLE_UIDS_MSG;
+import static com.android.server.am.ActivityManagerService.TAG_BACKUP;
+import static com.android.server.am.ActivityManagerService.TAG_LRU;
+import static com.android.server.am.ActivityManagerService.TAG_OOM_ADJ;
+import static com.android.server.am.ActivityManagerService.TAG_PROCESS_OBSERVERS;
+import static com.android.server.am.ActivityManagerService.TAG_PSS;
+import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS;
+import static com.android.server.am.ActivityManagerService.TOP_APP_PRIORITY_BOOST;
+import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
+
+import android.app.ActivityManager;
+import android.app.usage.UsageEvents;
+import android.content.Context;
+import android.os.Binder;
+import android.os.Debug;
+import android.os.PowerManagerInternal;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.Trace;
+import android.os.UserHandle;
+import android.util.ArraySet;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.app.procstats.ProcessStats;
+import com.android.server.LocalServices;
+import com.android.server.wm.ActivityServiceConnectionsHolder;
+import com.android.server.wm.WindowProcessController;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * All of the code required to compute proc states and oom_adj values.
+ */
+public final class OomAdjuster {
+ private static final String TAG = "OomAdjuster";
+
+ /**
+ * For some direct access we need to power manager.
+ */
+ PowerManagerInternal mLocalPowerManager;
+
+ /**
+ * Service for compacting background apps.
+ */
+ AppCompactor mAppCompact;
+
+ ActivityManagerConstants mConstants;
+
+ final long[] mTmpLong = new long[3];
+
+ /**
+ * Current sequence id for oom_adj computation traversal.
+ */
+ int mAdjSeq = 0;
+
+ /**
+ * Keep track of the number of service processes we last found, to
+ * determine on the next iteration which should be B services.
+ */
+ int mNumServiceProcs = 0;
+ int mNewNumAServiceProcs = 0;
+ int mNewNumServiceProcs = 0;
+
+ /**
+ * Keep track of the non-cached/empty process we last found, to help
+ * determine how to distribute cached/empty processes next time.
+ */
+ int mNumNonCachedProcs = 0;
+
+ /**
+ * Keep track of the number of cached hidden procs, to balance oom adj
+ * distribution between those and empty procs.
+ */
+ int mNumCachedHiddenProcs = 0;
+
+ /** Track all uids that have actively running processes. */
+ ActiveUids mActiveUids;
+
+ private final ArraySet<BroadcastQueue> mTmpBroadcastQueue = new ArraySet();
+
+ private final ActivityManagerService mService;
+ private final ProcessList mProcessList;
+
+ OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) {
+ mService = service;
+ mProcessList = processList;
+ mActiveUids = activeUids;
+
+ mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);
+ mConstants = mService.mConstants;
+ // mConstants can be null under test, which causes AppCompactor to crash
+ if (mConstants != null) {
+ mAppCompact = new AppCompactor(mService);
+ }
+ }
+
+ /**
+ * Update OomAdj for a specific process.
+ * @param app The process to update
+ * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps
+ * if necessary, or skip.
+ * @return whether updateOomAdjLocked(app) was successful.
+ */
+ @GuardedBy("mService")
+ final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) {
+ final ProcessRecord TOP_APP = mService.getTopAppLocked();
+ final boolean wasCached = app.cached;
+
+ mAdjSeq++;
+
+ // This is the desired cached adjusment we want to tell it to use.
+ // If our app is currently cached, we know it, and that is it. Otherwise,
+ // we don't know it yet, and it needs to now be cached we will then
+ // need to do a complete oom adj.
+ final int cachedAdj = app.getCurRawAdj() >= ProcessList.CACHED_APP_MIN_ADJ
+ ? app.getCurRawAdj() : ProcessList.UNKNOWN_ADJ;
+ boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
+ SystemClock.uptimeMillis());
+ if (oomAdjAll
+ && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
+ // Changed to/from cached state, so apps after it in the LRU
+ // list may also be changed.
+ updateOomAdjLocked();
+ }
+ return success;
+ }
+
+ @GuardedBy("mService")
+ private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
+ ProcessRecord TOP_APP, boolean doingAll, long now) {
+ if (app.thread == null) {
+ return false;
+ }
+
+ computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now, false);
+
+ return applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime());
+ }
+
+ @GuardedBy("mService")
+ final void updateOomAdjLocked() {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj");
+ mService.mOomAdjProfiler.oomAdjStarted();
+ final ProcessRecord TOP_APP = mService.getTopAppLocked();
+ final long now = SystemClock.uptimeMillis();
+ final long nowElapsed = SystemClock.elapsedRealtime();
+ final long oldTime = now - ProcessList.MAX_EMPTY_TIME;
+ final int N = mProcessList.getLruSizeLocked();
+
+ // Reset state in all uid records.
+ for (int i = mActiveUids.size() - 1; i >= 0; i--) {
+ final UidRecord uidRec = mActiveUids.valueAt(i);
+ if (false && DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "Starting update of " + uidRec);
+ uidRec.reset();
+ }
+
+ if (mService.mAtmInternal != null) {
+ mService.mAtmInternal.rankTaskLayersIfNeeded();
+ }
+
+ mAdjSeq++;
+ mNewNumServiceProcs = 0;
+ mNewNumAServiceProcs = 0;
+
+ final int emptyProcessLimit = mConstants.CUR_MAX_EMPTY_PROCESSES;
+ final int cachedProcessLimit = mConstants.CUR_MAX_CACHED_PROCESSES
+ - emptyProcessLimit;
+
+ // Let's determine how many processes we have running vs.
+ // how many slots we have for background processes; we may want
+ // to put multiple processes in a slot of there are enough of
+ // them.
+ final int numSlots = (ProcessList.CACHED_APP_MAX_ADJ
+ - ProcessList.CACHED_APP_MIN_ADJ + 1) / 2
+ / ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
+ int numEmptyProcs = N - mNumNonCachedProcs - mNumCachedHiddenProcs;
+ if (numEmptyProcs > cachedProcessLimit) {
+ // If there are more empty processes than our limit on cached
+ // processes, then use the cached process limit for the factor.
+ // This ensures that the really old empty processes get pushed
+ // down to the bottom, so if we are running low on memory we will
+ // have a better chance at keeping around more cached processes
+ // instead of a gazillion empty processes.
+ numEmptyProcs = cachedProcessLimit;
+ }
+ int emptyFactor = (numEmptyProcs + numSlots - 1) / numSlots;
+ if (emptyFactor < 1) emptyFactor = 1;
+ int cachedFactor = (mNumCachedHiddenProcs > 0 ? (mNumCachedHiddenProcs + numSlots - 1) : 1)
+ / numSlots;
+ if (cachedFactor < 1) cachedFactor = 1;
+ int stepCached = -1;
+ int stepEmpty = -1;
+ int numCached = 0;
+ int numCachedExtraGroup = 0;
+ int numEmpty = 0;
+ int numTrimming = 0;
+ int lastCachedGroup = 0;
+ int lastCachedGroupImportance = 0;
+ int lastCachedGroupUid = 0;
+
+ mNumNonCachedProcs = 0;
+ mNumCachedHiddenProcs = 0;
+
+ // First update the OOM adjustment for each of the
+ // application processes based on their current state.
+ int curCachedAdj = ProcessList.CACHED_APP_MIN_ADJ;
+ int nextCachedAdj = curCachedAdj + (ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2);
+ int curCachedImpAdj = 0;
+ int curEmptyAdj = ProcessList.CACHED_APP_MIN_ADJ + ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
+ int nextEmptyAdj = curEmptyAdj + (ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2);
+
+ boolean retryCycles = false;
+
+ // need to reset cycle state before calling computeOomAdjLocked because of service conns
+ for (int i = N - 1; i >= 0; i--) {
+ ProcessRecord app = mProcessList.mLruProcesses.get(i);
+ app.containsCycle = false;
+ app.setCurRawProcState(PROCESS_STATE_CACHED_EMPTY);
+ app.setCurRawAdj(ProcessList.UNKNOWN_ADJ);
+ }
+ for (int i = N - 1; i >= 0; i--) {
+ ProcessRecord app = mProcessList.mLruProcesses.get(i);
+ if (!app.killedByAm && app.thread != null) {
+ app.procStateChanged = false;
+ computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now, false);
+
+ // if any app encountered a cycle, we need to perform an additional loop later
+ retryCycles |= app.containsCycle;
+
+ // If we haven't yet assigned the final cached adj
+ // to the process, do that now.
+ if (app.curAdj >= ProcessList.UNKNOWN_ADJ) {
+ switch (app.getCurProcState()) {
+ case PROCESS_STATE_CACHED_ACTIVITY:
+ case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
+ case ActivityManager.PROCESS_STATE_CACHED_RECENT:
+ // Figure out the next cached level, taking into account groups.
+ boolean inGroup = false;
+ if (app.connectionGroup != 0) {
+ if (lastCachedGroupUid == app.uid
+ && lastCachedGroup == app.connectionGroup) {
+ // This is in the same group as the last process, just tweak
+ // adjustment by importance.
+ if (app.connectionImportance > lastCachedGroupImportance) {
+ lastCachedGroupImportance = app.connectionImportance;
+ if (curCachedAdj < nextCachedAdj
+ && curCachedAdj < ProcessList.CACHED_APP_MAX_ADJ) {
+ curCachedImpAdj++;
+ }
+ }
+ inGroup = true;
+ } else {
+ lastCachedGroupUid = app.uid;
+ lastCachedGroup = app.connectionGroup;
+ lastCachedGroupImportance = app.connectionImportance;
+ }
+ }
+ if (!inGroup && curCachedAdj != nextCachedAdj) {
+ stepCached++;
+ curCachedImpAdj = 0;
+ if (stepCached >= cachedFactor) {
+ stepCached = 0;
+ curCachedAdj = nextCachedAdj;
+ nextCachedAdj += ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2;
+ if (nextCachedAdj > ProcessList.CACHED_APP_MAX_ADJ) {
+ nextCachedAdj = ProcessList.CACHED_APP_MAX_ADJ;
+ }
+ }
+ }
+ // This process is a cached process holding activities...
+ // assign it the next cached value for that type, and then
+ // step that cached level.
+ app.setCurRawAdj(curCachedAdj + curCachedImpAdj);
+ app.curAdj = app.modifyRawOomAdj(curCachedAdj + curCachedImpAdj);
+ if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning activity LRU #" + i
+ + " adj: " + app.curAdj + " (curCachedAdj=" + curCachedAdj
+ + " curCachedImpAdj=" + curCachedImpAdj + ")");
+ break;
+ default:
+ // Figure out the next cached level.
+ if (curEmptyAdj != nextEmptyAdj) {
+ stepEmpty++;
+ if (stepEmpty >= emptyFactor) {
+ stepEmpty = 0;
+ curEmptyAdj = nextEmptyAdj;
+ nextEmptyAdj += ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2;
+ if (nextEmptyAdj > ProcessList.CACHED_APP_MAX_ADJ) {
+ nextEmptyAdj = ProcessList.CACHED_APP_MAX_ADJ;
+ }
+ }
+ }
+ // For everything else, assign next empty cached process
+ // level and bump that up. Note that this means that
+ // long-running services that have dropped down to the
+ // cached level will be treated as empty (since their process
+ // state is still as a service), which is what we want.
+ app.setCurRawAdj(curEmptyAdj);
+ app.curAdj = app.modifyRawOomAdj(curEmptyAdj);
+ if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning empty LRU #" + i
+ + " adj: " + app.curAdj + " (curEmptyAdj=" + curEmptyAdj
+ + ")");
+ break;
+ }
+ }
+ }
+ }
+
+ // Cycle strategy:
+ // - Retry computing any process that has encountered a cycle.
+ // - Continue retrying until no process was promoted.
+ // - Iterate from least important to most important.
+ int cycleCount = 0;
+ while (retryCycles && cycleCount < 10) {
+ cycleCount++;
+ retryCycles = false;
+
+ for (int i = 0; i < N; i++) {
+ ProcessRecord app = mProcessList.mLruProcesses.get(i);
+ if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
+ app.adjSeq--;
+ app.completedAdjSeq--;
+ }
+ }
+
+ for (int i = 0; i < N; i++) {
+ ProcessRecord app = mProcessList.mLruProcesses.get(i);
+ if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
+ if (computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now,
+ true)) {
+ retryCycles = true;
+ }
+ }
+ }
+ }
+
+ lastCachedGroup = lastCachedGroupUid = 0;
+
+ for (int i = N - 1; i >= 0; i--) {
+ ProcessRecord app = mProcessList.mLruProcesses.get(i);
+ if (!app.killedByAm && app.thread != null) {
+ applyOomAdjLocked(app, true, now, nowElapsed);
+
+ // Count the number of process types.
+ switch (app.getCurProcState()) {
+ case PROCESS_STATE_CACHED_ACTIVITY:
+ case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
+ mNumCachedHiddenProcs++;
+ numCached++;
+ if (app.connectionGroup != 0) {
+ if (lastCachedGroupUid == app.uid
+ && lastCachedGroup == app.connectionGroup) {
+ // If this process is the next in the same group, we don't
+ // want it to count against our limit of the number of cached
+ // processes, so bump up the group count to account for it.
+ numCachedExtraGroup++;
+ } else {
+ lastCachedGroupUid = app.uid;
+ lastCachedGroup = app.connectionGroup;
+ }
+ } else {
+ lastCachedGroupUid = lastCachedGroup = 0;
+ }
+ if ((numCached - numCachedExtraGroup) > cachedProcessLimit) {
+ app.kill("cached #" + numCached, true);
+ }
+ break;
+ case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
+ if (numEmpty > mConstants.CUR_TRIM_EMPTY_PROCESSES
+ && app.lastActivityTime < oldTime) {
+ app.kill("empty for "
+ + ((oldTime + ProcessList.MAX_EMPTY_TIME - app.lastActivityTime)
+ / 1000) + "s", true);
+ } else {
+ numEmpty++;
+ if (numEmpty > emptyProcessLimit) {
+ app.kill("empty #" + numEmpty, true);
+ }
+ }
+ break;
+ default:
+ mNumNonCachedProcs++;
+ break;
+ }
+
+ if (app.isolated && app.services.size() <= 0 && app.isolatedEntryPoint == null) {
+ // If this is an isolated process, there are no services
+ // running in it, and it's not a special process with a
+ // custom entry point, then the process is no longer
+ // needed. We agressively kill these because we can by
+ // definition not re-use the same process again, and it is
+ // good to avoid having whatever code was running in them
+ // left sitting around after no longer needed.
+ app.kill("isolated not needed", true);
+ } else {
+ // Keeping this process, update its uid.
+ final UidRecord uidRec = app.uidRecord;
+ if (uidRec != null) {
+ uidRec.ephemeral = app.info.isInstantApp();
+ if (uidRec.getCurProcState() > app.getCurProcState()) {
+ uidRec.setCurProcState(app.getCurProcState());
+ }
+ if (app.hasForegroundServices()) {
+ uidRec.foregroundServices = true;
+ }
+ }
+ }
+
+ if (app.getCurProcState() >= ActivityManager.PROCESS_STATE_HOME
+ && !app.killedByAm) {
+ numTrimming++;
+ }
+ }
+ }
+
+ mService.incrementProcStateSeqAndNotifyAppsLocked();
+
+ mNumServiceProcs = mNewNumServiceProcs;
+
+ boolean allChanged = mService.updateLowMemStateLocked(numCached, numEmpty, numTrimming);
+
+ if (mService.mAlwaysFinishActivities) {
+ // Need to do this on its own message because the stack may not
+ // be in a consistent state at this point.
+ mService.mAtmInternal.scheduleDestroyAllActivities("always-finish");
+ }
+
+ if (allChanged) {
+ mService.requestPssAllProcsLocked(now, false,
+ mService.mProcessStats.isMemFactorLowered());
+ }
+
+ ArrayList<UidRecord> becameIdle = null;
+
+ // Update from any uid changes.
+ if (mLocalPowerManager != null) {
+ mLocalPowerManager.startUidChanges();
+ }
+ for (int i = mActiveUids.size() - 1; i >= 0; i--) {
+ final UidRecord uidRec = mActiveUids.valueAt(i);
+ int uidChange = UidRecord.CHANGE_PROCSTATE;
+ if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
+ && (uidRec.setProcState != uidRec.getCurProcState()
+ || uidRec.setWhitelist != uidRec.curWhitelist)) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Changes in " + uidRec
+ + ": proc state from " + uidRec.setProcState + " to "
+ + uidRec.getCurProcState() + ", whitelist from " + uidRec.setWhitelist
+ + " to " + uidRec.curWhitelist);
+ if (ActivityManager.isProcStateBackground(uidRec.getCurProcState())
+ && !uidRec.curWhitelist) {
+ // UID is now in the background (and not on the temp whitelist). Was it
+ // previously in the foreground (or on the temp whitelist)?
+ if (!ActivityManager.isProcStateBackground(uidRec.setProcState)
+ || uidRec.setWhitelist) {
+ uidRec.lastBackgroundTime = nowElapsed;
+ if (!mService.mHandler.hasMessages(IDLE_UIDS_MSG)) {
+ // Note: the background settle time is in elapsed realtime, while
+ // the handler time base is uptime. All this means is that we may
+ // stop background uids later than we had intended, but that only
+ // happens because the device was sleeping so we are okay anyway.
+ mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
+ mConstants.BACKGROUND_SETTLE_TIME);
+ }
+ }
+ if (uidRec.idle && !uidRec.setIdle) {
+ uidChange = UidRecord.CHANGE_IDLE;
+ if (becameIdle == null) {
+ becameIdle = new ArrayList<>();
+ }
+ becameIdle.add(uidRec);
+ }
+ } else {
+ if (uidRec.idle) {
+ uidChange = UidRecord.CHANGE_ACTIVE;
+ EventLogTags.writeAmUidActive(uidRec.uid);
+ uidRec.idle = false;
+ }
+ uidRec.lastBackgroundTime = 0;
+ }
+ final boolean wasCached = uidRec.setProcState
+ > ActivityManager.PROCESS_STATE_RECEIVER;
+ final boolean isCached = uidRec.getCurProcState()
+ > ActivityManager.PROCESS_STATE_RECEIVER;
+ if (wasCached != isCached || uidRec.setProcState == PROCESS_STATE_NONEXISTENT) {
+ uidChange |= isCached ? UidRecord.CHANGE_CACHED : UidRecord.CHANGE_UNCACHED;
+ }
+ uidRec.setProcState = uidRec.getCurProcState();
+ uidRec.setWhitelist = uidRec.curWhitelist;
+ uidRec.setIdle = uidRec.idle;
+ mService.enqueueUidChangeLocked(uidRec, -1, uidChange);
+ mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
+ if (uidRec.foregroundServices) {
+ mService.mServices.foregroundServiceProcStateChangedLocked(uidRec);
+ }
+ }
+ }
+ if (mLocalPowerManager != null) {
+ mLocalPowerManager.finishUidChanges();
+ }
+
+ if (becameIdle != null) {
+ // If we have any new uids that became idle this time, we need to make sure
+ // they aren't left with running services.
+ for (int i = becameIdle.size() - 1; i >= 0; i--) {
+ mService.mServices.stopInBackgroundLocked(becameIdle.get(i).uid);
+ }
+ }
+
+ if (mService.mProcessStats.shouldWriteNowLocked(now)) {
+ mService.mHandler.post(new ActivityManagerService.ProcStatsRunnable(mService,
+ mService.mProcessStats));
+ }
+
+ // Run this after making sure all procstates are updated.
+ mService.mProcessStats.updateTrackingAssociationsLocked(mAdjSeq, now);
+
+ if (DEBUG_OOM_ADJ) {
+ final long duration = SystemClock.uptimeMillis() - now;
+ if (false) {
+ Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms",
+ new RuntimeException("here").fillInStackTrace());
+ } else {
+ Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms");
+ }
+ }
+ mService.mOomAdjProfiler.oomAdjEnded();
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ }
+
+ private final ComputeOomAdjWindowCallback mTmpComputeOomAdjWindowCallback =
+ new ComputeOomAdjWindowCallback();
+
+ /** These methods are called inline during computeOomAdjLocked(), on the same thread */
+ private final class ComputeOomAdjWindowCallback
+ implements WindowProcessController.ComputeOomAdjCallback {
+
+ ProcessRecord app;
+ int adj;
+ boolean foregroundActivities;
+ int procState;
+ int schedGroup;
+ int appUid;
+ int logUid;
+ int processStateCurTop;
+
+ void initialize(ProcessRecord app, int adj, boolean foregroundActivities,
+ int procState, int schedGroup, int appUid, int logUid, int processStateCurTop) {
+ this.app = app;
+ this.adj = adj;
+ this.foregroundActivities = foregroundActivities;
+ this.procState = procState;
+ this.schedGroup = schedGroup;
+ this.appUid = appUid;
+ this.logUid = logUid;
+ this.processStateCurTop = processStateCurTop;
+ }
+
+ @Override
+ public void onVisibleActivity() {
+ // App has a visible activity; only upgrade adjustment.
+ if (adj > ProcessList.VISIBLE_APP_ADJ) {
+ adj = ProcessList.VISIBLE_APP_ADJ;
+ app.adjType = "vis-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to vis-activity: " + app);
+ }
+ }
+ if (procState > processStateCurTop) {
+ procState = processStateCurTop;
+ app.adjType = "vis-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to vis-activity (top): " + app);
+ }
+ }
+ if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onPausedActivity() {
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ app.adjType = "pause-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to pause-activity: " + app);
+ }
+ }
+ if (procState > processStateCurTop) {
+ procState = processStateCurTop;
+ app.adjType = "pause-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to pause-activity (top): " + app);
+ }
+ }
+ if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onStoppingActivity(boolean finishing) {
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ app.adjType = "stop-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to stop-activity: " + app);
+ }
+ }
+
+ // For the process state, we will at this point consider the process to be cached. It
+ // will be cached either as an activity or empty depending on whether the activity is
+ // finishing. We do this so that we can treat the process as cached for purposes of
+ // memory trimming (determining current memory level, trim command to send to process)
+ // since there can be an arbitrary number of stopping processes and they should soon all
+ // go into the cached state.
+ if (!finishing) {
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
+ app.adjType = "stop-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to stop-activity: " + app);
+ }
+ }
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onOtherActivity() {
+ if (procState > PROCESS_STATE_CACHED_ACTIVITY) {
+ procState = PROCESS_STATE_CACHED_ACTIVITY;
+ app.adjType = "cch-act";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to cached activity: " + app);
+ }
+ }
+ }
+ }
+
+ private final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj,
+ ProcessRecord TOP_APP, boolean doingAll, long now, boolean cycleReEval) {
+ if (mAdjSeq == app.adjSeq) {
+ if (app.adjSeq == app.completedAdjSeq) {
+ // This adjustment has already been computed successfully.
+ return false;
+ } else {
+ // The process is being computed, so there is a cycle. We cannot
+ // rely on this process's state.
+ app.containsCycle = true;
+
+ return false;
+ }
+ }
+
+ if (app.thread == null) {
+ app.adjSeq = mAdjSeq;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND);
+ app.setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ app.curAdj = ProcessList.CACHED_APP_MAX_ADJ;
+ app.setCurRawAdj(ProcessList.CACHED_APP_MAX_ADJ);
+ app.completedAdjSeq = app.adjSeq;
+ return false;
+ }
+
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN;
+ app.adjSource = null;
+ app.adjTarget = null;
+ app.empty = false;
+ app.cached = false;
+
+ final WindowProcessController wpc = app.getWindowProcessController();
+ final int appUid = app.info.uid;
+ final int logUid = mService.mCurOomAdjUid;
+
+ int prevAppAdj = app.curAdj;
+ int prevProcState = app.getCurProcState();
+
+ if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
+ // The max adjustment doesn't allow this app to be anything
+ // below foreground, so it is not worth doing work for it.
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ mService.reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making fixed: " + app);
+ }
+ app.adjType = "fixed";
+ app.adjSeq = mAdjSeq;
+ app.setCurRawAdj(app.maxAdj);
+ app.setHasForegroundActivities(false);
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
+ app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT);
+ // System processes can do UI, and when they do we want to have
+ // them trim their memory after the user leaves the UI. To
+ // facilitate this, here we need to determine whether or not it
+ // is currently showing UI.
+ app.systemNoUi = true;
+ if (app == TOP_APP) {
+ app.systemNoUi = false;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
+ app.adjType = "pers-top-activity";
+ } else if (app.hasTopUi()) {
+ // sched group/proc state adjustment is below
+ app.systemNoUi = false;
+ app.adjType = "pers-top-ui";
+ } else if (wpc.hasVisibleActivities()) {
+ app.systemNoUi = false;
+ }
+ if (!app.systemNoUi) {
+ if (mService.mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) {
+ // screen on, promote UI
+ app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
+ } else {
+ // screen off, restrict UI scheduling
+ app.setCurProcState(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_RESTRICTED);
+ }
+ }
+ app.setCurRawProcState(app.getCurProcState());
+ app.curAdj = app.maxAdj;
+ app.completedAdjSeq = app.adjSeq;
+ // if curAdj is less than prevAppAdj, then this process was promoted
+ return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState;
+ }
+
+ app.systemNoUi = false;
+
+ final int PROCESS_STATE_CUR_TOP = mService.mAtmInternal.getTopProcessState();
+
+ // Determine the importance of the process, starting with most
+ // important to least, and assign an appropriate OOM adjustment.
+ int adj;
+ int schedGroup;
+ int procState;
+ int cachedAdjSeq;
+
+ boolean foregroundActivities = false;
+ mTmpBroadcastQueue.clear();
+ if (PROCESS_STATE_CUR_TOP == ActivityManager.PROCESS_STATE_TOP && app == TOP_APP) {
+ // The last app on the list is the foreground app.
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
+ app.adjType = "top-activity";
+ foregroundActivities = true;
+ procState = PROCESS_STATE_CUR_TOP;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app);
+ }
+ } else if (app.runningRemoteAnimation) {
+ adj = ProcessList.VISIBLE_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
+ app.adjType = "running-remote-anim";
+ procState = PROCESS_STATE_CUR_TOP;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making running remote anim: " + app);
+ }
+ } else if (app.getActiveInstrumentation() != null) {
+ // Don't want to kill running instrumentation.
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ app.adjType = "instrumentation";
+ procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making instrumentation: " + app);
+ }
+ } else if (mService.isReceivingBroadcastLocked(app, mTmpBroadcastQueue)) {
+ // An app that is currently receiving a broadcast also
+ // counts as being in the foreground for OOM killer purposes.
+ // It's placed in a sched group based on the nature of the
+ // broadcast as reflected by which queue it's active in.
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ schedGroup = (mTmpBroadcastQueue.contains(mService.mFgBroadcastQueue))
+ ? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
+ app.adjType = "broadcast";
+ procState = ActivityManager.PROCESS_STATE_RECEIVER;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making broadcast: " + app);
+ }
+ } else if (app.executingServices.size() > 0) {
+ // An app that is currently executing a service callback also
+ // counts as being in the foreground.
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ schedGroup = app.execServicesFg ?
+ ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
+ app.adjType = "exec-service";
+ procState = ActivityManager.PROCESS_STATE_SERVICE;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making exec-service: " + app);
+ }
+ //Slog.i(TAG, "EXEC " + (app.execServicesFg ? "FG" : "BG") + ": " + app);
+ } else if (app == TOP_APP) {
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.adjType = "top-sleeping";
+ foregroundActivities = true;
+ procState = PROCESS_STATE_CUR_TOP;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top (sleeping): " + app);
+ }
+ } else {
+ // As far as we know the process is empty. We may change our mind later.
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ // At this point we don't actually know the adjustment. Use the cached adj
+ // value that the caller wants us to.
+ adj = cachedAdj;
+ procState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ app.cached = true;
+ app.empty = true;
+ app.adjType = "cch-empty";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making empty: " + app);
+ }
+ }
+
+ // Examine all activities if not already foreground.
+ if (!foregroundActivities && wpc.hasActivities()) {
+ mTmpComputeOomAdjWindowCallback.initialize(app, adj, foregroundActivities, procState,
+ schedGroup, appUid, logUid, PROCESS_STATE_CUR_TOP);
+ final int minLayer = wpc.computeOomAdjFromActivities(
+ ProcessList.VISIBLE_APP_LAYER_MAX, mTmpComputeOomAdjWindowCallback);
+
+ adj = mTmpComputeOomAdjWindowCallback.adj;
+ foregroundActivities = mTmpComputeOomAdjWindowCallback.foregroundActivities;
+ procState = mTmpComputeOomAdjWindowCallback.procState;
+ schedGroup = mTmpComputeOomAdjWindowCallback.schedGroup;
+
+ if (adj == ProcessList.VISIBLE_APP_ADJ) {
+ adj += minLayer;
+ }
+ }
+
+ if (procState > ActivityManager.PROCESS_STATE_CACHED_RECENT && app.hasRecentTasks()) {
+ procState = ActivityManager.PROCESS_STATE_CACHED_RECENT;
+ app.adjType = "cch-rec";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to cached recent: " + app);
+ }
+ }
+
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
+ || procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+ if (app.hasForegroundServices()) {
+ // The user is aware of this app, so make it visible.
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+ app.cached = false;
+ app.adjType = "fg-service";
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to fg service: " + app);
+ }
+ } else if (app.hasOverlayUi()) {
+ // The process is display an overlay UI.
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ app.cached = false;
+ app.adjType = "has-overlay-ui";
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to overlay ui: " + app);
+ }
+ }
+ }
+
+ // If the app was recently in the foreground and moved to a foreground service status,
+ // allow it to get a higher rank in memory for some time, compared to other foreground
+ // services so that it can finish performing any persistence/processing of in-memory state.
+ if (app.hasForegroundServices() && adj > ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ
+ && (app.lastTopTime + mConstants.TOP_TO_FGS_GRACE_DURATION > now
+ || app.setProcState <= ActivityManager.PROCESS_STATE_TOP)) {
+ adj = ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ;
+ app.adjType = "fg-service-act";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg: " + app);
+ }
+ }
+
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
+ || procState > ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
+ if (app.forcingToImportant != null) {
+ // This is currently used for toasts... they are not interactive, and
+ // we don't want them to cause the app to become fully foreground (and
+ // thus out of background check), so we yes the best background level we can.
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
+ app.cached = false;
+ app.adjType = "force-imp";
+ app.adjSource = app.forcingToImportant;
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to force imp: " + app);
+ }
+ }
+ }
+
+ if (mService.mAtmInternal.isHeavyWeightProcess(app.getWindowProcessController())) {
+ if (adj > ProcessList.HEAVY_WEIGHT_APP_ADJ) {
+ // We don't want to kill the current heavy-weight process.
+ adj = ProcessList.HEAVY_WEIGHT_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.cached = false;
+ app.adjType = "heavy";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app);
+ }
+ }
+ if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
+ procState = ActivityManager.PROCESS_STATE_HEAVY_WEIGHT;
+ app.adjType = "heavy";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to heavy: " + app);
+ }
+ }
+ }
+
+ if (wpc.isHomeProcess()) {
+ if (adj > ProcessList.HOME_APP_ADJ) {
+ // This process is hosting what we currently consider to be the
+ // home app, so we don't want to let it go into the background.
+ adj = ProcessList.HOME_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.cached = false;
+ app.adjType = "home";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app);
+ }
+ }
+ if (procState > ActivityManager.PROCESS_STATE_HOME) {
+ procState = ActivityManager.PROCESS_STATE_HOME;
+ app.adjType = "home";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to home: " + app);
+ }
+ }
+ }
+
+ if (wpc.isPreviousProcess() && app.hasActivities()) {
+ if (adj > ProcessList.PREVIOUS_APP_ADJ) {
+ // This was the previous process that showed UI to the user.
+ // We want to try to keep it around more aggressively, to give
+ // a good experience around switching between two apps.
+ adj = ProcessList.PREVIOUS_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.cached = false;
+ app.adjType = "previous";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
+ }
+ }
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
+ app.adjType = "previous";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app);
+ }
+ }
+ }
+
+ if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj
+ + " reason=" + app.adjType);
+
+ // By default, we use the computed adjustment. It may be changed if
+ // there are applications dependent on our services or providers, but
+ // this gives us a baseline and makes sure we don't get into an
+ // infinite recursion. If we're re-evaluating due to cycles, use the previously computed
+ // values.
+ app.setCurRawAdj(!cycleReEval ? adj : Math.min(adj, app.getCurRawAdj()));
+ app.setCurRawProcState(!cycleReEval
+ ? procState
+ : Math.min(procState, app.getCurRawProcState()));
+
+ app.hasStartedServices = false;
+ app.adjSeq = mAdjSeq;
+
+ final BackupRecord backupTarget = mService.mBackupTargets.get(app.userId);
+ if (backupTarget != null && app == backupTarget.app) {
+ // If possible we want to avoid killing apps while they're being backed up
+ if (adj > ProcessList.BACKUP_APP_ADJ) {
+ if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app);
+ adj = ProcessList.BACKUP_APP_ADJ;
+ if (procState > ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
+ procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
+ }
+ app.adjType = "backup";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app);
+ }
+ app.cached = false;
+ }
+ if (procState > ActivityManager.PROCESS_STATE_BACKUP) {
+ procState = ActivityManager.PROCESS_STATE_BACKUP;
+ app.adjType = "backup";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to backup: " + app);
+ }
+ }
+ }
+
+ boolean mayBeTop = false;
+ String mayBeTopType = null;
+ Object mayBeTopSource = null;
+ Object mayBeTopTarget = null;
+
+ for (int is = app.services.size() - 1;
+ is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
+ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ || procState > ActivityManager.PROCESS_STATE_TOP);
+ is--) {
+ ServiceRecord s = app.services.valueAt(is);
+ if (s.startRequested) {
+ app.hasStartedServices = true;
+ if (procState > ActivityManager.PROCESS_STATE_SERVICE) {
+ procState = ActivityManager.PROCESS_STATE_SERVICE;
+ app.adjType = "started-services";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to started service: " + app);
+ }
+ }
+ if (app.hasShownUi && !wpc.isHomeProcess()) {
+ // If this process has shown some UI, let it immediately
+ // go to the LRU list because it may be pretty heavy with
+ // UI stuff. We'll tag it with a label just to help
+ // debug and understand what is going on.
+ if (adj > ProcessList.SERVICE_ADJ) {
+ app.adjType = "cch-started-ui-services";
+ }
+ } else {
+ if (now < (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) {
+ // This service has seen some activity within
+ // recent memory, so we will keep its process ahead
+ // of the background processes.
+ if (adj > ProcessList.SERVICE_ADJ) {
+ adj = ProcessList.SERVICE_ADJ;
+ app.adjType = "started-services";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to started service: " + app);
+ }
+ app.cached = false;
+ }
+ }
+ // If we have let the service slide into the background
+ // state, still have some text describing what it is doing
+ // even though the service no longer has an impact.
+ if (adj > ProcessList.SERVICE_ADJ) {
+ app.adjType = "cch-started-services";
+ }
+ }
+ }
+
+ for (int conni = s.connections.size() - 1;
+ conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
+ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ || procState > ActivityManager.PROCESS_STATE_TOP);
+ conni--) {
+ ArrayList<ConnectionRecord> clist = s.connections.valueAt(conni);
+ for (int i = 0;
+ i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ
+ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ || procState > ActivityManager.PROCESS_STATE_TOP);
+ i++) {
+ // XXX should compute this based on the max of
+ // all connected clients.
+ ConnectionRecord cr = clist.get(i);
+ if (cr.binding.client == app) {
+ // Binding to oneself is not interesting.
+ continue;
+ }
+
+ boolean trackedProcState = false;
+ if ((cr.flags& Context.BIND_WAIVE_PRIORITY) == 0) {
+ ProcessRecord client = cr.binding.client;
+ computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now, cycleReEval);
+
+ if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) {
+ continue;
+ }
+
+ int clientAdj = client.getCurRawAdj();
+ int clientProcState = client.getCurRawProcState();
+
+ if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
+ // If the other app is cached for any reason, for purposes here
+ // we are going to consider it empty. The specific cached state
+ // doesn't propagate except under certain conditions.
+ clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ }
+ String adjType = null;
+ if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) {
+ // Not doing bind OOM management, so treat
+ // this guy more like a started service.
+ if (app.hasShownUi && !wpc.isHomeProcess()) {
+ // If this process has shown some UI, let it immediately
+ // go to the LRU list because it may be pretty heavy with
+ // UI stuff. We'll tag it with a label just to help
+ // debug and understand what is going on.
+ if (adj > clientAdj) {
+ adjType = "cch-bound-ui-services";
+ }
+ app.cached = false;
+ clientAdj = adj;
+ clientProcState = procState;
+ } else {
+ if (now >= (s.lastActivity
+ + mConstants.MAX_SERVICE_INACTIVITY)) {
+ // This service has not seen activity within
+ // recent memory, so allow it to drop to the
+ // LRU list if there is no other reason to keep
+ // it around. We'll also tag it with a label just
+ // to help debug and undertand what is going on.
+ if (adj > clientAdj) {
+ adjType = "cch-bound-services";
+ }
+ clientAdj = adj;
+ }
+ }
+ }
+ if (adj > clientAdj) {
+ // If this process has recently shown UI, and
+ // the process that is binding to it is less
+ // important than being visible, then we don't
+ // care about the binding as much as we care
+ // about letting this process get into the LRU
+ // list to be killed and restarted if needed for
+ // memory.
+ if (app.hasShownUi && !wpc.isHomeProcess()
+ && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ if (adj >= ProcessList.CACHED_APP_MIN_ADJ) {
+ adjType = "cch-bound-ui-services";
+ }
+ } else {
+ int newAdj;
+ if ((cr.flags&(Context.BIND_ABOVE_CLIENT
+ |Context.BIND_IMPORTANT)) != 0) {
+ if (clientAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) {
+ newAdj = clientAdj;
+ } else {
+ // make this service persistent
+ newAdj = ProcessList.PERSISTENT_SERVICE_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ procState = ActivityManager.PROCESS_STATE_PERSISTENT;
+ cr.trackProcState(procState, mAdjSeq, now);
+ trackedProcState = true;
+ }
+ } else if ((cr.flags & Context.BIND_ADJUST_BELOW_PERCEPTIBLE) != 0
+ && clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
+ && adj > ProcessList.PERCEPTIBLE_APP_ADJ + 1) {
+ newAdj = ProcessList.PERCEPTIBLE_APP_ADJ + 1;
+ } else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0
+ && clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
+ && adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ newAdj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ } else if (clientAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
+ newAdj = clientAdj;
+ } else {
+ if (adj > ProcessList.VISIBLE_APP_ADJ) {
+ newAdj = Math.max(clientAdj, ProcessList.VISIBLE_APP_ADJ);
+ } else {
+ newAdj = adj;
+ }
+ }
+ if (!client.cached) {
+ app.cached = false;
+ }
+ if (adj > newAdj) {
+ adj = newAdj;
+ app.setCurRawAdj(adj);
+ adjType = "service";
+ }
+ }
+ }
+ if ((cr.flags & (Context.BIND_NOT_FOREGROUND
+ | Context.BIND_IMPORTANT_BACKGROUND)) == 0) {
+ // This will treat important bound services identically to
+ // the top app, which may behave differently than generic
+ // foreground work.
+ final int curSchedGroup = client.getCurrentSchedulingGroup();
+ if (curSchedGroup > schedGroup) {
+ if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
+ schedGroup = curSchedGroup;
+ } else {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ }
+ if (clientProcState <= ActivityManager.PROCESS_STATE_TOP) {
+ if (clientProcState == ActivityManager.PROCESS_STATE_TOP) {
+ // Special handling of clients who are in the top state.
+ // We *may* want to consider this process to be in the
+ // top state as well, but only if there is not another
+ // reason for it to be running. Being on the top is a
+ // special state, meaning you are specifically running
+ // for the current top app. If the process is already
+ // running in the background for some other reason, it
+ // is more important to continue considering it to be
+ // in the background state.
+ mayBeTop = true;
+ mayBeTopType = "service";
+ mayBeTopSource = cr.binding.client;
+ mayBeTopTarget = s.instanceName;
+ clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ } else {
+ // Special handling for above-top states (persistent
+ // processes). These should not bring the current process
+ // into the top state, since they are not on top. Instead
+ // give them the best state after that.
+ if ((cr.flags&Context.BIND_FOREGROUND_SERVICE) != 0) {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ } else if (mService.mWakefulness
+ == PowerManagerInternal.WAKEFULNESS_AWAKE &&
+ (cr.flags&Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE)
+ != 0) {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ } else {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ }
+ }
+ }
+ } else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) {
+ if (clientProcState <
+ ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
+ }
+ } else {
+ if (clientProcState <
+ ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
+ }
+ }
+ if (!trackedProcState) {
+ cr.trackProcState(clientProcState, mAdjSeq, now);
+ }
+ if (procState > clientProcState) {
+ procState = clientProcState;
+ app.setCurRawProcState(procState);
+ if (adjType == null) {
+ adjType = "service";
+ }
+ }
+ if (procState < ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ && (cr.flags & Context.BIND_SHOWING_UI) != 0) {
+ app.setPendingUiClean(true);
+ }
+ if (adjType != null) {
+ app.adjType = adjType;
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_SERVICE_IN_USE;
+ app.adjSource = cr.binding.client;
+ app.adjSourceProcState = clientProcState;
+ app.adjTarget = s.instanceName;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
+ + ": " + app + ", due to " + cr.binding.client
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
+ }
+ }
+ if ((cr.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
+ app.treatLikeActivity = true;
+ }
+ final ActivityServiceConnectionsHolder a = cr.activity;
+ if ((cr.flags&Context.BIND_ADJUST_WITH_ACTIVITY) != 0) {
+ if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ
+ && a.isActivityVisible()) {
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ app.setCurRawAdj(adj);
+ if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) {
+ if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
+ schedGroup = ProcessList.SCHED_GROUP_TOP_APP_BOUND;
+ } else {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ }
+ app.cached = false;
+ app.adjType = "service";
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_SERVICE_IN_USE;
+ app.adjSource = a;
+ app.adjSourceProcState = procState;
+ app.adjTarget = s.instanceName;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise to service w/activity: " + app);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ for (int provi = app.pubProviders.size() - 1;
+ provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
+ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ || procState > ActivityManager.PROCESS_STATE_TOP);
+ provi--) {
+ ContentProviderRecord cpr = app.pubProviders.valueAt(provi);
+ for (int i = cpr.connections.size() - 1;
+ i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
+ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ || procState > ActivityManager.PROCESS_STATE_TOP);
+ i--) {
+ ContentProviderConnection conn = cpr.connections.get(i);
+ ProcessRecord client = conn.client;
+ if (client == app) {
+ // Being our own client is not interesting.
+ continue;
+ }
+ computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now, cycleReEval);
+
+ if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) {
+ continue;
+ }
+
+ int clientAdj = client.getCurRawAdj();
+ int clientProcState = client.getCurRawProcState();
+
+ if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
+ // If the other app is cached for any reason, for purposes here
+ // we are going to consider it empty.
+ clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ }
+ String adjType = null;
+ if (adj > clientAdj) {
+ if (app.hasShownUi && !wpc.isHomeProcess()
+ && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ adjType = "cch-ui-provider";
+ } else {
+ adj = clientAdj > ProcessList.FOREGROUND_APP_ADJ
+ ? clientAdj : ProcessList.FOREGROUND_APP_ADJ;
+ app.setCurRawAdj(adj);
+ adjType = "provider";
+ }
+ app.cached &= client.cached;
+ }
+ if (clientProcState <= ActivityManager.PROCESS_STATE_TOP) {
+ if (clientProcState == ActivityManager.PROCESS_STATE_TOP) {
+ // Special handling of clients who are in the top state.
+ // We *may* want to consider this process to be in the
+ // top state as well, but only if there is not another
+ // reason for it to be running. Being on the top is a
+ // special state, meaning you are specifically running
+ // for the current top app. If the process is already
+ // running in the background for some other reason, it
+ // is more important to continue considering it to be
+ // in the background state.
+ mayBeTop = true;
+ clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ mayBeTopType = adjType = "provider-top";
+ mayBeTopSource = client;
+ mayBeTopTarget = cpr.name;
+ } else {
+ // Special handling for above-top states (persistent
+ // processes). These should not bring the current process
+ // into the top state, since they are not on top. Instead
+ // give them the best state after that.
+ clientProcState =
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ if (adjType == null) {
+ adjType = "provider";
+ }
+ }
+ }
+ conn.trackProcState(clientProcState, mAdjSeq, now);
+ if (procState > clientProcState) {
+ procState = clientProcState;
+ app.setCurRawProcState(procState);
+ }
+ if (client.getCurrentSchedulingGroup() > schedGroup) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ if (adjType != null) {
+ app.adjType = adjType;
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_PROVIDER_IN_USE;
+ app.adjSource = client;
+ app.adjSourceProcState = clientProcState;
+ app.adjTarget = cpr.name;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
+ + ": " + app + ", due to " + client
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
+ }
+ }
+ // If the provider has external (non-framework) process
+ // dependencies, ensure that its adjustment is at least
+ // FOREGROUND_APP_ADJ.
+ if (cpr.hasExternalProcessHandles()) {
+ if (adj > ProcessList.FOREGROUND_APP_ADJ) {
+ adj = ProcessList.FOREGROUND_APP_ADJ;
+ app.setCurRawAdj(adj);
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ app.cached = false;
+ app.adjType = "ext-provider";
+ app.adjTarget = cpr.name;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to external provider: " + app);
+ }
+ }
+ if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
+ procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ app.setCurRawProcState(procState);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to external provider: " + app);
+ }
+ }
+ }
+ }
+
+ if (app.lastProviderTime > 0 &&
+ (app.lastProviderTime + mConstants.CONTENT_PROVIDER_RETAIN_TIME) > now) {
+ if (adj > ProcessList.PREVIOUS_APP_ADJ) {
+ adj = ProcessList.PREVIOUS_APP_ADJ;
+ schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.cached = false;
+ app.adjType = "recent-provider";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to recent provider: " + app);
+ }
+ }
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
+ app.adjType = "recent-provider";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to recent provider: " + app);
+ }
+ }
+ }
+
+ if (mayBeTop && procState > ActivityManager.PROCESS_STATE_TOP) {
+ // A client of one of our services or providers is in the top state. We
+ // *may* want to be in the top state, but not if we are already running in
+ // the background for some other reason. For the decision here, we are going
+ // to pick out a few specific states that we want to remain in when a client
+ // is top (states that tend to be longer-term) and otherwise allow it to go
+ // to the top state.
+ switch (procState) {
+ case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
+ case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
+ // Something else is keeping it at this level, just leave it.
+ break;
+ case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
+ case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
+ case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
+ case ActivityManager.PROCESS_STATE_SERVICE:
+ // These all are longer-term states, so pull them up to the top
+ // of the background states, but not all the way to the top state.
+ procState = ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ app.adjType = mayBeTopType;
+ app.adjSource = mayBeTopSource;
+ app.adjTarget = mayBeTopTarget;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
+ + ": " + app + ", due to " + mayBeTopSource
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
+ break;
+ default:
+ // Otherwise, top is a better choice, so take it.
+ procState = ActivityManager.PROCESS_STATE_TOP;
+ app.adjType = mayBeTopType;
+ app.adjSource = mayBeTopSource;
+ app.adjTarget = mayBeTopTarget;
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
+ + ": " + app + ", due to " + mayBeTopSource
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
+ break;
+ }
+ }
+
+ if (procState >= ActivityManager.PROCESS_STATE_CACHED_EMPTY) {
+ if (app.hasClientActivities()) {
+ // This is a cached process, but with client activities. Mark it so.
+ procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
+ app.adjType = "cch-client-act";
+ } else if (app.treatLikeActivity) {
+ // This is a cached process, but somebody wants us to treat it like it has
+ // an activity, okay!
+ procState = PROCESS_STATE_CACHED_ACTIVITY;
+ app.adjType = "cch-as-act";
+ }
+ }
+
+ if (adj == ProcessList.SERVICE_ADJ) {
+ if (doingAll) {
+ app.serviceb = mNewNumAServiceProcs > (mNumServiceProcs/3);
+ mNewNumServiceProcs++;
+ //Slog.i(TAG, "ADJ " + app + " serviceb=" + app.serviceb);
+ if (!app.serviceb) {
+ // This service isn't far enough down on the LRU list to
+ // normally be a B service, but if we are low on RAM and it
+ // is large we want to force it down since we would prefer to
+ // keep launcher over it.
+ if (mService.mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL
+ && app.lastPss >= mProcessList.getCachedRestoreThresholdKb()) {
+ app.serviceHighRam = true;
+ app.serviceb = true;
+ //Slog.i(TAG, "ADJ " + app + " high ram!");
+ } else {
+ mNewNumAServiceProcs++;
+ //Slog.i(TAG, "ADJ " + app + " not high ram!");
+ }
+ } else {
+ app.serviceHighRam = false;
+ }
+ }
+ if (app.serviceb) {
+ adj = ProcessList.SERVICE_B_ADJ;
+ }
+ }
+
+ app.setCurRawAdj(adj);
+
+ //Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
+ // " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);
+ if (adj > app.maxAdj) {
+ adj = app.maxAdj;
+ if (app.maxAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ }
+
+ // Put bound foreground services in a special sched group for additional
+ // restrictions on screen off
+ if (procState >= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE &&
+ mService.mWakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE) {
+ if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) {
+ schedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
+ }
+ }
+
+ // Do final modification to adj. Everything we do between here and applying
+ // the final setAdj must be done in this function, because we will also use
+ // it when computing the final cached adj later. Note that we don't need to
+ // worry about this for max adj above, since max adj will always be used to
+ // keep it out of the cached vaues.
+ app.curAdj = app.modifyRawOomAdj(adj);
+ app.setCurrentSchedulingGroup(schedGroup);
+ app.setCurProcState(procState);
+ app.setCurRawProcState(procState);
+ app.setHasForegroundActivities(foregroundActivities);
+ app.completedAdjSeq = mAdjSeq;
+
+ // if curAdj or curProcState improved, then this process was promoted
+ return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState;
+ }
+
+ /**
+ * Checks if for the given app and client, there's a cycle that should skip over the client
+ * for now or use partial values to evaluate the effect of the client binding.
+ * @param app
+ * @param client
+ * @param procState procstate evaluated so far for this app
+ * @param adj oom_adj evaluated so far for this app
+ * @param cycleReEval whether we're currently re-evaluating due to a cycle, and not the first
+ * evaluation.
+ * @return whether to skip using the client connection at this time
+ */
+ private boolean shouldSkipDueToCycle(ProcessRecord app, ProcessRecord client,
+ int procState, int adj, boolean cycleReEval) {
+ if (client.containsCycle) {
+ // We've detected a cycle. We should retry computeOomAdjLocked later in
+ // case a later-checked connection from a client would raise its
+ // priority legitimately.
+ app.containsCycle = true;
+ // If the client has not been completely evaluated, check if it's worth
+ // using the partial values.
+ if (client.completedAdjSeq < mAdjSeq) {
+ if (cycleReEval) {
+ // If the partial values are no better, skip until the next
+ // attempt
+ if (client.getCurRawProcState() >= procState
+ && client.getCurRawAdj() >= adj) {
+ return true;
+ }
+ // Else use the client's partial procstate and adj to adjust the
+ // effect of the binding
+ } else {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /** Inform the oomadj observer of changes to oomadj. Used by tests. */
+ @GuardedBy("mService")
+ void reportOomAdjMessageLocked(String tag, String msg) {
+ Slog.d(tag, msg);
+ if (mService.mCurOomAdjObserver != null) {
+ mService.mUiHandler.obtainMessage(DISPATCH_OOM_ADJ_OBSERVER_MSG, msg).sendToTarget();
+ }
+ }
+
+ /** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
+ @GuardedBy("mService")
+ private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
+ long nowElapsed) {
+ boolean success = true;
+
+ if (app.getCurRawAdj() != app.setRawAdj) {
+ app.setRawAdj = app.getCurRawAdj();
+ }
+
+ int changes = 0;
+
+ if (app.curAdj != app.setAdj) {
+ // don't compact during bootup
+ if (mConstants.USE_COMPACTION && mService.mBooted) {
+ // Perform a minor compaction when a perceptible app becomes the prev/home app
+ // Perform a major compaction when any app enters cached
+ // reminder: here, setAdj is previous state, curAdj is upcoming state
+ if (app.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ &&
+ (app.curAdj == ProcessList.PREVIOUS_APP_ADJ ||
+ app.curAdj == ProcessList.HOME_APP_ADJ)) {
+ mAppCompact.compactAppSome(app);
+ } else if (app.setAdj < ProcessList.CACHED_APP_MIN_ADJ &&
+ app.curAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
+ mAppCompact.compactAppFull(app);
+ }
+ }
+ ProcessList.setOomAdj(app.pid, app.uid, app.curAdj);
+ if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.info.uid) {
+ String msg = "Set " + app.pid + " " + app.processName + " adj "
+ + app.curAdj + ": " + app.adjType;
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
+ }
+ app.setAdj = app.curAdj;
+ app.verifiedAdj = ProcessList.INVALID_ADJ;
+ }
+
+ final int curSchedGroup = app.getCurrentSchedulingGroup();
+ if (app.setSchedGroup != curSchedGroup) {
+ int oldSchedGroup = app.setSchedGroup;
+ app.setSchedGroup = curSchedGroup;
+ if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.uid) {
+ String msg = "Setting sched group of " + app.processName
+ + " to " + curSchedGroup + ": " + app.adjType;
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
+ }
+ if (app.waitingToKill != null && app.curReceivers.isEmpty()
+ && app.setSchedGroup == ProcessList.SCHED_GROUP_BACKGROUND) {
+ app.kill(app.waitingToKill, true);
+ success = false;
+ } else {
+ int processGroup;
+ switch (curSchedGroup) {
+ case ProcessList.SCHED_GROUP_BACKGROUND:
+ processGroup = THREAD_GROUP_BG_NONINTERACTIVE;
+ break;
+ case ProcessList.SCHED_GROUP_TOP_APP:
+ case ProcessList.SCHED_GROUP_TOP_APP_BOUND:
+ processGroup = THREAD_GROUP_TOP_APP;
+ break;
+ case ProcessList.SCHED_GROUP_RESTRICTED:
+ processGroup = THREAD_GROUP_RESTRICTED;
+ break;
+ default:
+ processGroup = THREAD_GROUP_DEFAULT;
+ break;
+ }
+ long oldId = Binder.clearCallingIdentity();
+ try {
+ setProcessGroup(app.pid, processGroup);
+ if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
+ // do nothing if we already switched to RT
+ if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
+ app.getWindowProcessController().onTopProcChanged();
+ if (mService.mUseFifoUiScheduling) {
+ // Switch UI pipeline for app to SCHED_FIFO
+ app.savedPriority = Process.getThreadPriority(app.pid);
+ mService.scheduleAsFifoPriority(app.pid, /* suppressLogs */true);
+ if (app.renderThreadTid != 0) {
+ mService.scheduleAsFifoPriority(app.renderThreadTid,
+ /* suppressLogs */true);
+ if (DEBUG_OOM_ADJ) {
+ Slog.d("UI_FIFO", "Set RenderThread (TID " +
+ app.renderThreadTid + ") to FIFO");
+ }
+ } else {
+ if (DEBUG_OOM_ADJ) {
+ Slog.d("UI_FIFO", "Not setting RenderThread TID");
+ }
+ }
+ } else {
+ // Boost priority for top app UI and render threads
+ setThreadPriority(app.pid, TOP_APP_PRIORITY_BOOST);
+ if (app.renderThreadTid != 0) {
+ try {
+ setThreadPriority(app.renderThreadTid,
+ TOP_APP_PRIORITY_BOOST);
+ } catch (IllegalArgumentException e) {
+ // thread died, ignore
+ }
+ }
+ }
+ }
+ } else if (oldSchedGroup == ProcessList.SCHED_GROUP_TOP_APP &&
+ curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
+ app.getWindowProcessController().onTopProcChanged();
+ if (mService.mUseFifoUiScheduling) {
+ try {
+ // Reset UI pipeline to SCHED_OTHER
+ setThreadScheduler(app.pid, SCHED_OTHER, 0);
+ setThreadPriority(app.pid, app.savedPriority);
+ if (app.renderThreadTid != 0) {
+ setThreadScheduler(app.renderThreadTid,
+ SCHED_OTHER, 0);
+ setThreadPriority(app.renderThreadTid, -4);
+ }
+ } catch (IllegalArgumentException e) {
+ Slog.w(TAG,
+ "Failed to set scheduling policy, thread does not exist:\n"
+ + e);
+ } catch (SecurityException e) {
+ Slog.w(TAG, "Failed to set scheduling policy, not allowed:\n" + e);
+ }
+ } else {
+ // Reset priority for top app UI and render threads
+ setThreadPriority(app.pid, 0);
+ if (app.renderThreadTid != 0) {
+ setThreadPriority(app.renderThreadTid, 0);
+ }
+ }
+ }
+ } catch (Exception e) {
+ if (false) {
+ Slog.w(TAG, "Failed setting process group of " + app.pid
+ + " to " + app.getCurrentSchedulingGroup());
+ Slog.w(TAG, "at location", e);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
+ }
+ }
+ }
+ if (app.repForegroundActivities != app.hasForegroundActivities()) {
+ app.repForegroundActivities = app.hasForegroundActivities();
+ changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES;
+ }
+ if (app.getReportedProcState() != app.getCurProcState()) {
+ app.setReportedProcState(app.getCurProcState());
+ if (app.thread != null) {
+ try {
+ if (false) {
+ //RuntimeException h = new RuntimeException("here");
+ Slog.i(TAG, "Sending new process state " + app.getReportedProcState()
+ + " to " + app /*, h*/);
+ }
+ app.thread.setProcessState(app.getReportedProcState());
+ } catch (RemoteException e) {
+ }
+ }
+ }
+ if (app.setProcState == PROCESS_STATE_NONEXISTENT
+ || ProcessList.procStatesDifferForMem(app.getCurProcState(), app.setProcState)) {
+ if (false && mService.mTestPssMode
+ && app.setProcState >= 0 && app.lastStateTime <= (now-200)) {
+ // Experimental code to more aggressively collect pss while
+ // running test... the problem is that this tends to collect
+ // the data right when a process is transitioning between process
+ // states, which will tend to give noisy data.
+ long start = SystemClock.uptimeMillis();
+ long startTime = SystemClock.currentThreadTimeMillis();
+ long pss = Debug.getPss(app.pid, mTmpLong, null);
+ long endTime = SystemClock.currentThreadTimeMillis();
+ mService.recordPssSampleLocked(app, app.getCurProcState(), pss,
+ mTmpLong[0], mTmpLong[1], mTmpLong[2],
+ ProcessStats.ADD_PSS_INTERNAL_SINGLE, endTime-startTime, now);
+ mService.mPendingPssProcesses.remove(app);
+ Slog.i(TAG, "Recorded pss for " + app + " state " + app.setProcState
+ + " to " + app.getCurProcState() + ": "
+ + (SystemClock.uptimeMillis()-start) + "ms");
+ }
+ app.lastStateTime = now;
+ app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(),
+ app.procStateMemTracker, mService.mTestPssMode,
+ mService.mAtmInternal.isSleeping(), now);
+ if (DEBUG_PSS) Slog.d(TAG_PSS, "Process state change from "
+ + ProcessList.makeProcStateString(app.setProcState) + " to "
+ + ProcessList.makeProcStateString(app.getCurProcState()) + " next pss in "
+ + (app.nextPssTime-now) + ": " + app);
+ } else {
+ if (now > app.nextPssTime || (now > (app.lastPssTime+ProcessList.PSS_MAX_INTERVAL)
+ && now > (app.lastStateTime+ProcessList.minTimeFromStateChange(
+ mService.mTestPssMode)))) {
+ if (mService.requestPssLocked(app, app.setProcState)) {
+ app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(),
+ app.procStateMemTracker, mService.mTestPssMode,
+ mService.mAtmInternal.isSleeping(), now);
+ }
+ } else if (false && DEBUG_PSS) {
+ Slog.d(TAG_PSS,
+ "Not requesting pss of " + app + ": next=" + (app.nextPssTime-now));
+ }
+ }
+ if (app.setProcState != app.getCurProcState()) {
+ if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.uid) {
+ String msg = "Proc state change of " + app.processName
+ + " to " + ProcessList.makeProcStateString(app.getCurProcState())
+ + " (" + app.getCurProcState() + ")" + ": " + app.adjType;
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
+ }
+ boolean setImportant = app.setProcState < ActivityManager.PROCESS_STATE_SERVICE;
+ boolean curImportant = app.getCurProcState() < ActivityManager.PROCESS_STATE_SERVICE;
+ if (setImportant && !curImportant) {
+ // This app is no longer something we consider important enough to allow to use
+ // arbitrary amounts of battery power. Note its current CPU time to later know to
+ // kill it if it is not behaving well.
+ app.setWhenUnimportant(now);
+ app.lastCpuTime = 0;
+ }
+ // Inform UsageStats of important process state change
+ // Must be called before updating setProcState
+ maybeUpdateUsageStatsLocked(app, nowElapsed);
+
+ maybeUpdateLastTopTime(app, now);
+
+ app.setProcState = app.getCurProcState();
+ if (app.setProcState >= ActivityManager.PROCESS_STATE_HOME) {
+ app.notCachedSinceIdle = false;
+ }
+ if (!doingAll) {
+ mService.setProcessTrackerStateLocked(app,
+ mService.mProcessStats.getMemFactorLocked(), now);
+ } else {
+ app.procStateChanged = true;
+ }
+ } else if (app.reportedInteraction && (nowElapsed - app.getInteractionEventTime())
+ > mConstants.USAGE_STATS_INTERACTION_INTERVAL) {
+ // For apps that sit around for a long time in the interactive state, we need
+ // to report this at least once a day so they don't go idle.
+ maybeUpdateUsageStatsLocked(app, nowElapsed);
+ }
+
+ if (changes != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "Changes in " + app + ": " + changes);
+ int i = mService.mPendingProcessChanges.size()-1;
+ ActivityManagerService.ProcessChangeItem item = null;
+ while (i >= 0) {
+ item = mService.mPendingProcessChanges.get(i);
+ if (item.pid == app.pid) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "Re-using existing item: " + item);
+ break;
+ }
+ i--;
+ }
+ if (i < 0) {
+ // No existing item in pending changes; need a new one.
+ final int NA = mService.mAvailProcessChanges.size();
+ if (NA > 0) {
+ item = mService.mAvailProcessChanges.remove(NA-1);
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "Retrieving available item: " + item);
+ } else {
+ item = new ActivityManagerService.ProcessChangeItem();
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "Allocating new item: " + item);
+ }
+ item.changes = 0;
+ item.pid = app.pid;
+ item.uid = app.info.uid;
+ if (mService.mPendingProcessChanges.size() == 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "*** Enqueueing dispatch processes changed!");
+ mService.mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG)
+ .sendToTarget();
+ }
+ mService.mPendingProcessChanges.add(item);
+ }
+ item.changes |= changes;
+ item.foregroundActivities = app.repForegroundActivities;
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
+ "Item " + Integer.toHexString(System.identityHashCode(item))
+ + " " + app.toShortString() + ": changes=" + item.changes
+ + " foreground=" + item.foregroundActivities
+ + " type=" + app.adjType + " source=" + app.adjSource
+ + " target=" + app.adjTarget);
+ }
+
+ return success;
+ }
+
+ @GuardedBy("mService")
+ private void maybeUpdateUsageStatsLocked(ProcessRecord app, long nowElapsed) {
+ if (DEBUG_USAGE_STATS) {
+ Slog.d(TAG, "Checking proc [" + Arrays.toString(app.getPackageList())
+ + "] state changes: old = " + app.setProcState + ", new = "
+ + app.getCurProcState());
+ }
+ if (mService.mUsageStatsService == null) {
+ return;
+ }
+ boolean isInteraction;
+ // To avoid some abuse patterns, we are going to be careful about what we consider
+ // to be an app interaction. Being the top activity doesn't count while the display
+ // is sleeping, nor do short foreground services.
+ if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_TOP) {
+ isInteraction = true;
+ app.setFgInteractionTime(0);
+ } else if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+ if (app.getFgInteractionTime() == 0) {
+ app.setFgInteractionTime(nowElapsed);
+ isInteraction = false;
+ } else {
+ isInteraction = nowElapsed > app.getFgInteractionTime()
+ + mConstants.SERVICE_USAGE_INTERACTION_TIME;
+ }
+ } else {
+ isInteraction =
+ app.getCurProcState() <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ app.setFgInteractionTime(0);
+ }
+ if (isInteraction
+ && (!app.reportedInteraction || (nowElapsed - app.getInteractionEventTime())
+ > mConstants.USAGE_STATS_INTERACTION_INTERVAL)) {
+ app.setInteractionEventTime(nowElapsed);
+ String[] packages = app.getPackageList();
+ if (packages != null) {
+ for (int i = 0; i < packages.length; i++) {
+ mService.mUsageStatsService.reportEvent(packages[i], app.userId,
+ UsageEvents.Event.SYSTEM_INTERACTION);
+ }
+ }
+ }
+ app.reportedInteraction = isInteraction;
+ if (!isInteraction) {
+ app.setInteractionEventTime(0);
+ }
+ }
+
+ private void maybeUpdateLastTopTime(ProcessRecord app, long nowUptime) {
+ if (app.setProcState <= ActivityManager.PROCESS_STATE_TOP
+ && app.getCurProcState() > ActivityManager.PROCESS_STATE_TOP) {
+ app.lastTopTime = nowUptime;
+ }
+ }
+
+ /**
+ * Look for recently inactive apps and mark them idle after a grace period. If idled, stop
+ * any background services and inform listeners.
+ */
+ @GuardedBy("mService")
+ void idleUidsLocked() {
+ final int N = mActiveUids.size();
+ if (N <= 0) {
+ return;
+ }
+ final long nowElapsed = SystemClock.elapsedRealtime();
+ final long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME;
+ long nextTime = 0;
+ if (mLocalPowerManager != null) {
+ mLocalPowerManager.startUidChanges();
+ }
+ for (int i = N - 1; i >= 0; i--) {
+ final UidRecord uidRec = mActiveUids.valueAt(i);
+ final long bgTime = uidRec.lastBackgroundTime;
+ if (bgTime > 0 && !uidRec.idle) {
+ if (bgTime <= maxBgTime) {
+ EventLogTags.writeAmUidIdle(uidRec.uid);
+ uidRec.idle = true;
+ uidRec.setIdle = true;
+ mService.doStopUidLocked(uidRec.uid, uidRec);
+ } else {
+ if (nextTime == 0 || nextTime > bgTime) {
+ nextTime = bgTime;
+ }
+ }
+ }
+ }
+ if (mLocalPowerManager != null) {
+ mLocalPowerManager.finishUidChanges();
+ }
+ if (nextTime > 0) {
+ mService.mHandler.removeMessages(IDLE_UIDS_MSG);
+ mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
+ nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed);
+ }
+ }
+
+ @GuardedBy("mService")
+ final void setAppIdTempWhitelistStateLocked(int appId, boolean onWhitelist) {
+ boolean changed = false;
+ for (int i = mActiveUids.size() - 1; i >= 0; i--) {
+ final UidRecord uidRec = mActiveUids.valueAt(i);
+ if (UserHandle.getAppId(uidRec.uid) == appId && uidRec.curWhitelist != onWhitelist) {
+ uidRec.curWhitelist = onWhitelist;
+ changed = true;
+ }
+ }
+ if (changed) {
+ updateOomAdjLocked();
+ }
+ }
+
+ @GuardedBy("mService")
+ final void setUidTempWhitelistStateLocked(int uid, boolean onWhitelist) {
+ boolean changed = false;
+ final UidRecord uidRec = mActiveUids.get(uid);
+ if (uidRec != null && uidRec.curWhitelist != onWhitelist) {
+ uidRec.curWhitelist = onWhitelist;
+ updateOomAdjLocked();
+ }
+ }
+
+ @GuardedBy("mService")
+ void dumpProcessListVariablesLocked(ProtoOutputStream proto) {
+ proto.write(ActivityManagerServiceDumpProcessesProto.ADJ_SEQ, mAdjSeq);
+ proto.write(ActivityManagerServiceDumpProcessesProto.LRU_SEQ, mProcessList.mLruSeq);
+ proto.write(ActivityManagerServiceDumpProcessesProto.NUM_NON_CACHED_PROCS,
+ mNumNonCachedProcs);
+ proto.write(ActivityManagerServiceDumpProcessesProto.NUM_SERVICE_PROCS, mNumServiceProcs);
+ proto.write(ActivityManagerServiceDumpProcessesProto.NEW_NUM_SERVICE_PROCS,
+ mNewNumServiceProcs);
+
+ }
+
+ @GuardedBy("mService")
+ void dumpSequenceNumbersLocked(PrintWriter pw) {
+ pw.println(" mAdjSeq=" + mAdjSeq + " mLruSeq=" + mProcessList.mLruSeq);
+ }
+
+ @GuardedBy("mService")
+ void dumpProcCountsLocked(PrintWriter pw) {
+ pw.println(" mNumNonCachedProcs=" + mNumNonCachedProcs
+ + " (" + mProcessList.getLruSizeLocked() + " total)"
+ + " mNumCachedHiddenProcs=" + mNumCachedHiddenProcs
+ + " mNumServiceProcs=" + mNumServiceProcs
+ + " mNewNumServiceProcs=" + mNewNumServiceProcs);
+ }
+
+}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index b675d9d4f9cf..55cca950a213 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -51,6 +51,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
public static final int FLAG_ACTIVITY_SENDER = 1 << 0;
public static final int FLAG_BROADCAST_SENDER = 1 << 1;
+ public static final int FLAG_SERVICE_SENDER = 1 << 2;
final PendingIntentController controller;
final Key key;
@@ -62,6 +63,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
private RemoteCallbackList<IResultReceiver> mCancelCallbacks;
private ArraySet<IBinder> mAllowBgActivityStartsForActivitySender = new ArraySet<>();
private ArraySet<IBinder> mAllowBgActivityStartsForBroadcastSender = new ArraySet<>();
+ private ArraySet<IBinder> mAllowBgActivityStartsForServiceSender = new ArraySet<>();
String stringName;
String lastTagPrefix;
@@ -228,6 +230,9 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
if ((flags & FLAG_BROADCAST_SENDER) != 0) {
mAllowBgActivityStartsForBroadcastSender.add(token);
}
+ if ((flags & FLAG_SERVICE_SENDER) != 0) {
+ mAllowBgActivityStartsForServiceSender.add(token);
+ }
}
public void registerCancelListenerLocked(IResultReceiver receiver) {
@@ -384,8 +389,9 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
if (key.allIntents != null && key.allIntents.length > 1) {
res = controller.mAtmInternal.startActivitiesInPackage(
- uid, key.packageName, allIntents, allResolvedTypes, resultTo,
- mergedOptions, userId, false /* validateIncomingUser */,
+ uid, callingPid, callingUid, key.packageName, allIntents,
+ allResolvedTypes, resultTo, mergedOptions, userId,
+ false /* validateIncomingUser */,
this /* originatingPendingIntent */,
mAllowBgActivityStartsForActivitySender.contains(whitelistToken));
} else {
@@ -426,7 +432,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
try {
controller.mAmInternal.startServiceInPackage(uid, finalIntent, resolvedType,
key.type == ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE,
- key.packageName, userId);
+ key.packageName, userId,
+ mAllowBgActivityStartsForServiceSender.contains(whitelistToken));
} catch (RuntimeException e) {
Slog.w(TAG, "Unable to send startService intent", e);
} catch (TransactionTooLargeException e) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index d133deaf4b8e..c1be3872e031 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -17,10 +17,9 @@
package com.android.server.am;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
+import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AUTO;
-import static android.os.Process.FIRST_ISOLATED_UID;
-import static android.os.Process.LAST_ISOLATED_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.THREAD_PRIORITY_BACKGROUND;
import static android.os.Process.getFreeMemory;
@@ -34,6 +33,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ActivityManagerService.KILL_APP_ZYGOTE_DELAY_MS;
+import static com.android.server.am.ActivityManagerService.KILL_APP_ZYGOTE_MSG;
import static com.android.server.am.ActivityManagerService.PERSISTENT_MASK;
import static com.android.server.am.ActivityManagerService.PROC_START_TIMEOUT;
import static com.android.server.am.ActivityManagerService.PROC_START_TIMEOUT_MSG;
@@ -58,6 +59,7 @@ import android.graphics.Point;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.net.Uri;
+import android.os.AppZygote;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -75,10 +77,12 @@ import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.os.storage.StorageManagerInternal;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.EventLog;
import android.util.LongSparseArray;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.util.StatsLog;
import android.view.Display;
@@ -108,6 +112,7 @@ import java.io.PrintWriter;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.BitSet;
import java.util.List;
/**
@@ -119,7 +124,7 @@ import java.util.List;
* </ul>
*/
public final class ProcessList {
- private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;
+ static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;
// The minimum time we allow between crashes, for us to consider this
// application to be bad and stop and its services and reject broadcasts.
@@ -348,16 +353,144 @@ public final class ProcessList {
*/
int mLruSeq = 0;
+ ActiveUids mActiveUids;
+
/**
* The currently running isolated processes.
*/
final SparseArray<ProcessRecord> mIsolatedProcesses = new SparseArray<>();
/**
- * Counter for assigning isolated process uids, to avoid frequently reusing the
- * same ones.
+ * The currently running application zygotes.
+ */
+ final ProcessMap<AppZygote> mAppZygotes = new ProcessMap<AppZygote>();
+
+ /**
+ * The processes that are forked off an application zygote.
+ */
+ final ArrayMap<AppZygote, ArrayList<ProcessRecord>> mAppZygoteProcesses =
+ new ArrayMap<AppZygote, ArrayList<ProcessRecord>>();
+
+ final class IsolatedUidRange {
+ @VisibleForTesting
+ public final int mFirstUid;
+ @VisibleForTesting
+ public final int mLastUid;
+
+ @GuardedBy("ProcessList.this.mService")
+ private final SparseBooleanArray mUidUsed = new SparseBooleanArray();
+
+ @GuardedBy("ProcessList.this.mService")
+ private int mNextUid;
+
+ IsolatedUidRange(int firstUid, int lastUid) {
+ mFirstUid = firstUid;
+ mLastUid = lastUid;
+ mNextUid = firstUid;
+ }
+
+ @GuardedBy("ProcessList.this.mService")
+ int allocateIsolatedUidLocked(int userId) {
+ int uid;
+ int stepsLeft = (mLastUid - mFirstUid + 1);
+ for (int i = 0; i < stepsLeft; ++i) {
+ if (mNextUid < mFirstUid || mNextUid > mLastUid) {
+ mNextUid = mFirstUid;
+ }
+ uid = UserHandle.getUid(userId, mNextUid);
+ mNextUid++;
+ if (!mUidUsed.get(uid, false)) {
+ mUidUsed.put(uid, true);
+ return uid;
+ }
+ }
+ return -1;
+ }
+
+ @GuardedBy("ProcessList.this.mService")
+ void freeIsolatedUidLocked(int uid) {
+ // Strip out userId
+ final int appId = UserHandle.getAppId(uid);
+ mUidUsed.delete(appId);
+ }
+ };
+
+ /**
+ * A class that allocates ranges of isolated UIDs per application, and keeps track of them.
+ */
+ final class IsolatedUidRangeAllocator {
+ private final int mFirstUid;
+ private final int mNumUidRanges;
+ private final int mNumUidsPerRange;
+ /**
+ * We map the uid range [mFirstUid, mFirstUid + mNumUidRanges * mNumUidsPerRange)
+ * back to an underlying bitset of [0, mNumUidRanges) and allocate out of that.
+ */
+ @GuardedBy("ProcessList.this.mService")
+ private final BitSet mAvailableUidRanges;
+ @GuardedBy("ProcessList.this.mService")
+ private final ProcessMap<IsolatedUidRange> mAppRanges = new ProcessMap<IsolatedUidRange>();
+
+ IsolatedUidRangeAllocator(int firstUid, int lastUid, int numUidsPerRange) {
+ mFirstUid = firstUid;
+ mNumUidsPerRange = numUidsPerRange;
+ mNumUidRanges = (lastUid - firstUid + 1) / numUidsPerRange;
+ mAvailableUidRanges = new BitSet(mNumUidRanges);
+ // Mark all as available
+ mAvailableUidRanges.set(0, mNumUidRanges);
+ }
+
+ @GuardedBy("ProcessList.this.mService")
+ IsolatedUidRange getIsolatedUidRangeLocked(ApplicationInfo info) {
+ return mAppRanges.get(info.processName, info.uid);
+ }
+
+ @GuardedBy("ProcessList.this.mService")
+ IsolatedUidRange getOrCreateIsolatedUidRangeLocked(ApplicationInfo info) {
+ IsolatedUidRange range = getIsolatedUidRangeLocked(info);
+ if (range == null) {
+ int uidRangeIndex = mAvailableUidRanges.nextSetBit(0);
+ if (uidRangeIndex < 0) {
+ // No free range
+ return null;
+ }
+ mAvailableUidRanges.clear(uidRangeIndex);
+ int actualUid = mFirstUid + uidRangeIndex * mNumUidsPerRange;
+ range = new IsolatedUidRange(actualUid, actualUid + mNumUidsPerRange - 1);
+ mAppRanges.put(info.processName, info.uid, range);
+ }
+ return range;
+ }
+
+ @GuardedBy("ProcessList.this.mService")
+ void freeUidRangeLocked(ApplicationInfo info) {
+ // Find the UID range
+ IsolatedUidRange range = mAppRanges.get(info.processName, info.uid);
+ if (range != null) {
+ // Map back to starting uid
+ final int uidRangeIndex = (range.mFirstUid - mFirstUid) / mNumUidsPerRange;
+ // Mark it as available in the underlying bitset
+ mAvailableUidRanges.set(uidRangeIndex);
+ // And the map
+ mAppRanges.remove(info.processName, info.uid);
+ }
+ }
+ }
+
+ /**
+ * The available isolated UIDs for processes that are not spawned from an application zygote.
*/
- int mNextIsolatedProcessUid = 0;
+ @VisibleForTesting
+ IsolatedUidRange mGlobalIsolatedUids = new IsolatedUidRange(Process.FIRST_ISOLATED_UID,
+ Process.LAST_ISOLATED_UID);
+
+ /**
+ * An allocator for isolated UID ranges for apps that use an application zygote.
+ */
+ @VisibleForTesting
+ IsolatedUidRangeAllocator mAppIsolatedUidRangeAllocator =
+ new IsolatedUidRangeAllocator(Process.FIRST_APP_ZYGOTE_ISOLATED_UID,
+ Process.LAST_APP_ZYGOTE_ISOLATED_UID, Process.NUM_UIDS_PER_APP_ZYGOTE);
/**
* Processes that are being forcibly torn down.
@@ -419,8 +552,10 @@ public final class ProcessList {
updateOomLevels(0, 0, false);
}
- void init(ActivityManagerService service) {
+ void init(ActivityManagerService service, ActiveUids activeUids) {
mService = service;
+ mActiveUids = activeUids;
+
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
@@ -1505,6 +1640,69 @@ public final class ProcessList {
}
}
+ @GuardedBy("mService")
+ public void killAppZygoteIfNeededLocked(AppZygote appZygote) {
+ final ApplicationInfo appInfo = appZygote.getAppInfo();
+ ArrayList<ProcessRecord> zygoteProcesses = mAppZygoteProcesses.get(appZygote);
+ if (zygoteProcesses.size() == 0) { // Only remove if no longer in use now
+ mAppZygotes.remove(appInfo.processName, appInfo.uid);
+ mAppZygoteProcesses.remove(appZygote);
+ mAppIsolatedUidRangeAllocator.freeUidRangeLocked(appInfo);
+ appZygote.stopZygote();
+ }
+ }
+
+ @GuardedBy("mService")
+ private void removeProcessFromAppZygoteLocked(final ProcessRecord app) {
+ // Free the isolated uid for this process
+ final IsolatedUidRange appUidRange =
+ mAppIsolatedUidRangeAllocator.getIsolatedUidRangeLocked(app.info);
+ if (appUidRange != null) {
+ appUidRange.freeIsolatedUidLocked(app.uid);
+ }
+
+ final AppZygote appZygote = mAppZygotes.get(app.info.processName, app.info.uid);
+ if (appZygote != null) {
+ ArrayList<ProcessRecord> zygoteProcesses = mAppZygoteProcesses.get(appZygote);
+ zygoteProcesses.remove(app);
+ if (zygoteProcesses.size() == 0) {
+ Message msg = mService.mHandler.obtainMessage(KILL_APP_ZYGOTE_MSG);
+ msg.obj = appZygote;
+ mService.mHandler.sendMessageDelayed(msg, KILL_APP_ZYGOTE_DELAY_MS);
+ }
+ }
+ }
+
+ private AppZygote createAppZygoteForProcessIfNeeded(final ProcessRecord app) {
+ synchronized (mService) {
+ AppZygote appZygote = mAppZygotes.get(app.info.processName, app.info.uid);
+ final ArrayList<ProcessRecord> zygoteProcessList;
+ if (appZygote == null) {
+ final IsolatedUidRange uidRange =
+ mAppIsolatedUidRangeAllocator.getIsolatedUidRangeLocked(app.info);
+ final int userId = UserHandle.getUserId(app.info.uid);
+ // Create the app-zygote and provide it with the UID-range it's allowed
+ // to setresuid/setresgid to.
+ final int firstUid = UserHandle.getUid(userId, uidRange.mFirstUid);
+ final int lastUid = UserHandle.getUid(userId, uidRange.mLastUid);
+ appZygote = new AppZygote(app.info, app.info.uid, firstUid, lastUid);
+ mAppZygotes.put(app.info.processName, app.info.uid, appZygote);
+ zygoteProcessList = new ArrayList<ProcessRecord>();
+ mAppZygoteProcesses.put(appZygote, zygoteProcessList);
+ } else {
+ mService.mHandler.removeMessages(KILL_APP_ZYGOTE_MSG, appZygote);
+ zygoteProcessList = mAppZygoteProcesses.get(appZygote);
+ }
+ // Note that we already add the app to mAppZygoteProcesses here;
+ // this is so that another thread can't come in and kill the zygote
+ // before we've even tried to start the process. If the process launch
+ // goes wrong, we'll clean this up in removeProcessNameLocked()
+ zygoteProcessList.add(app);
+
+ return appZygote;
+ }
+ }
+
private Process.ProcessStartResult startProcess(String hostingType, String entryPoint,
ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,
String seInfo, String requiredAbi, String instructionSet, String invokeWith,
@@ -1525,6 +1723,15 @@ public final class ProcessList {
app.info.dataDir, null, app.info.packageName,
packageNames, visibleVolIds,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
+ } else if (hostingType.equals("app_zygote")) {
+ final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
+
+ startResult = appZygote.getProcess().start(entryPoint,
+ app.processName, uid, uid, gids, runtimeFlags, mountExternal,
+ app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
+ app.info.dataDir, null, app.info.packageName,
+ packageNames, visibleVolIds,
+ new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else {
startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
@@ -1614,13 +1821,6 @@ public final class ProcessList {
app.addPackage(info.packageName, info.versionCode, mService.mProcessStats);
checkSlow(startTime, "startProcess: done, added package to proc");
return app;
- } else if (app.getActiveInstrumentation() != null) {
- // We don't want to kill running instrumentation.
- if (DEBUG_PROCESSES) {
- Slog.v(TAG_PROCESSES, "Instrumentation already running: " + app);
- }
- checkSlow(startTime, "startProcess: keep instrumentation proc");
- return app;
}
// An application record is attached to a previous process,
@@ -1636,8 +1836,9 @@ public final class ProcessList {
? hostingName.flattenToShortString() : null;
if (app == null) {
+ final boolean fromAppZygote = "app_zygote".equals(hostingType);
checkSlow(startTime, "startProcess: creating new process record");
- app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
+ app = newProcessRecordLocked(info, processName, isolated, isolatedUid, fromAppZygote);
if (app == null) {
Slog.w(TAG, "Failed making new process record for "
+ processName + "/" + info.uid + " isolated=" + isolated);
@@ -1982,7 +2183,7 @@ public final class ProcessList {
} else if (old != null) {
Slog.wtf(TAG, "Already have existing proc " + old + " when adding " + proc);
}
- UidRecord uidRec = mService.mActiveUids.get(proc.uid);
+ UidRecord uidRec = mActiveUids.get(proc.uid);
if (uidRec == null) {
uidRec = new UidRecord(proc.uid, mService.mAtmInternal);
// This is the first appearance of the uid, report it now!
@@ -1994,7 +2195,7 @@ public final class ProcessList {
uidRec.setWhitelist = uidRec.curWhitelist = true;
}
uidRec.updateHasInternetPermission();
- mService.mActiveUids.put(proc.uid, uidRec);
+ mActiveUids.put(proc.uid, uidRec);
EventLogTags.writeAmUidRunning(uidRec.uid);
mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
}
@@ -2010,29 +2211,31 @@ public final class ProcessList {
}
@GuardedBy("mService")
+ private IsolatedUidRange getOrCreateIsolatedUidRangeLocked(ApplicationInfo info,
+ boolean fromAppZygote) {
+ if (!fromAppZygote) {
+ // Allocate an isolated UID from the global range
+ return mGlobalIsolatedUids;
+ } else {
+ return mAppIsolatedUidRangeAllocator.getOrCreateIsolatedUidRangeLocked(info);
+ }
+ }
+
+ @GuardedBy("mService")
final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess,
- boolean isolated, int isolatedUid) {
+ boolean isolated, int isolatedUid, boolean fromAppZygote) {
String proc = customProcess != null ? customProcess : info.processName;
final int userId = UserHandle.getUserId(info.uid);
int uid = info.uid;
if (isolated) {
if (isolatedUid == 0) {
- int stepsLeft = LAST_ISOLATED_UID - FIRST_ISOLATED_UID + 1;
- while (true) {
- if (mNextIsolatedProcessUid < FIRST_ISOLATED_UID
- || mNextIsolatedProcessUid > LAST_ISOLATED_UID) {
- mNextIsolatedProcessUid = FIRST_ISOLATED_UID;
- }
- uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
- mNextIsolatedProcessUid++;
- if (mIsolatedProcesses.indexOfKey(uid) < 0) {
- // No process for this uid, use it.
- break;
- }
- stepsLeft--;
- if (stepsLeft <= 0) {
- return null;
- }
+ IsolatedUidRange uidRange = getOrCreateIsolatedUidRangeLocked(info, fromAppZygote);
+ if (uidRange == null) {
+ return null;
+ }
+ uid = uidRange.allocateIsolatedUidLocked(userId);
+ if (uid == -1) {
+ return null;
}
} else {
// Special case for startIsolatedProcess (internal only), where
@@ -2094,12 +2297,19 @@ public final class ProcessList {
"No more processes in " + old.uidRecord);
mService.enqueueUidChangeLocked(old.uidRecord, -1, UidRecord.CHANGE_GONE);
EventLogTags.writeAmUidStopped(uid);
- mService.mActiveUids.remove(uid);
+ mActiveUids.remove(uid);
mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT);
}
old.uidRecord = null;
}
mIsolatedProcesses.remove(uid);
+ mGlobalIsolatedUids.freeIsolatedUidLocked(uid);
+ // Remove the (expected) ProcessRecord from the app zygote
+ final ProcessRecord record = expecting != null ? expecting : old;
+ if (record != null && record.appZygote) {
+ removeProcessFromAppZygoteLocked(record);
+ }
+
return old;
}
@@ -2847,4 +3057,37 @@ public final class ProcessList {
}
}
}
+
+ /** Returns the uid's process state or PROCESS_STATE_NONEXISTENT if not running */
+ @GuardedBy("mService")
+ int getUidProcStateLocked(int uid) {
+ UidRecord uidRec = mActiveUids.get(uid);
+ return uidRec == null ? PROCESS_STATE_NONEXISTENT : uidRec.getCurProcState();
+ }
+
+ /** Returns the UidRecord for the given uid, if it exists. */
+ @GuardedBy("mService")
+ UidRecord getUidRecordLocked(int uid) {
+ return mActiveUids.get(uid);
+ }
+
+ /**
+ * Call {@link ActivityManagerService#doStopUidLocked}
+ * (which will also stop background services) for all idle UIDs.
+ */
+ @GuardedBy("mService")
+ void doStopUidForIdleUidsLocked() {
+ final int size = mActiveUids.size();
+ for (int i = 0; i < size; i++) {
+ final int uid = mActiveUids.keyAt(i);
+ if (UserHandle.isCore(uid)) {
+ continue;
+ }
+ final UidRecord uidRec = mActiveUids.valueAt(i);
+ if (!uidRec.idle) {
+ continue;
+ }
+ mService.doStopUidLocked(uidRec.uid, uidRec);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 2a3c68ec8878..8947e6b85f4c 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -77,6 +77,7 @@ final class ProcessRecord implements WindowProcessListener {
private final ActivityManagerService mService; // where we came from
final ApplicationInfo info; // all about the first app in the process
final boolean isolated; // true if this is a special isolated process
+ final boolean appZygote; // true if this is forked from the app zygote
final int uid; // uid of process; may be different from 'info' if isolated
final int userId; // user of process.
final String processName; // name of the process
@@ -560,6 +561,8 @@ final class ProcessRecord implements WindowProcessListener {
mService = _service;
info = _info;
isolated = _info.uid != _uid;
+ appZygote = (UserHandle.getAppId(_uid) >= Process.FIRST_APP_ZYGOTE_ISOLATED_UID
+ && UserHandle.getAppId(_uid) <= Process.LAST_APP_ZYGOTE_ISOLATED_UID);
uid = _uid;
userId = UserHandle.getUserId(_uid);
processName = _processName;
@@ -1168,11 +1171,13 @@ final class ProcessRecord implements WindowProcessListener {
}
void addAllowBackgroundActivityStartsToken(Binder entity) {
+ if (entity == null) return;
mAllowBackgroundActivityStartsTokens.add(entity);
mWindowProcessController.setAllowBackgroundActivityStarts(true);
}
void removeAllowBackgroundActivityStartsToken(Binder entity) {
+ if (entity == null) return;
mAllowBackgroundActivityStartsTokens.remove(entity);
mWindowProcessController.setAllowBackgroundActivityStarts(
!mAllowBackgroundActivityStartsTokens.isEmpty());
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index d5ede5b63edc..c2117a7cc72e 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -77,6 +77,7 @@ class SettingsToPropertiesMapper {
// permission in the corresponding .te file your feature belongs to.
@VisibleForTesting
static final String[] sDeviceConfigScopes = new String[] {
+ DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
};
private final String[] mGlobalSettings;
diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING
index 48b414581d45..c84b5c74c1e7 100644
--- a/services/core/java/com/android/server/am/TEST_MAPPING
+++ b/services/core/java/com/android/server/am/TEST_MAPPING
@@ -7,7 +7,7 @@
"include-annotation": "android.platform.test.annotations.Presubmit"
},
{
- "exclude-annotation": "android.support.test.filters.FlakyTest"
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
},
@@ -21,7 +21,7 @@
"include-annotation": "android.platform.test.annotations.Presubmit"
},
{
- "exclude-annotation": "android.support.test.filters.FlakyTest"
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
},
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 3cdf09e967fe..7ede6dcd41bd 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package com.android.server;
+package com.android.server.appop;
import static android.app.AppOpsManager.OP_PLAY_AUDIO;
+import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
@@ -35,8 +36,7 @@ import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.AppOpsManager;
-import android.app.AppOpsManager.HistoricalOpEntry;
-import android.app.AppOpsManager.HistoricalPackageOps;
+import android.app.AppOpsManager.HistoricalOps;
import android.app.AppOpsManagerInternal;
import android.app.AppOpsManagerInternal.CheckOpsDelegate;
import android.content.BroadcastReceiver;
@@ -48,7 +48,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
-import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.media.AudioAttributes;
@@ -59,6 +58,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Process;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
@@ -95,6 +95,8 @@ import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.LocalServices;
+import com.android.server.LockGuard;
import libcore.util.EmptyArray;
import org.xmlpull.v1.XmlPullParser;
@@ -213,6 +215,8 @@ public class AppOpsService extends IAppOpsService.Stub {
@VisibleForTesting
final SparseArray<UidState> mUidStates = new SparseArray<>();
+ private final HistoricalRegistry mHistoricalRegistry = new HistoricalRegistry(this);
+
long mLastRealtime;
/*
@@ -654,6 +658,7 @@ public class AppOpsService extends IAppOpsService.Stub {
public void systemReady() {
mConstants.startMonitoring(mContext.getContentResolver());
+ mHistoricalRegistry.systemReady(mContext.getContentResolver());
synchronized (this) {
boolean changed = false;
@@ -1012,113 +1017,99 @@ public class AppOpsService extends IAppOpsService.Stub {
}
@Override
- public @Nullable ParceledListSlice getAllHistoricalPackagesOps(@Nullable String[] opNames,
- long beginTimeMillis, long endTimeMillis) {
+ public void getHistoricalOps(int uid, @NonNull String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull RemoteCallback callback) {
+ Preconditions.checkArgument(uid == Process.INVALID_UID || uid >= 0,
+ "uid must be " + Process.INVALID_UID + " or non negative");
Preconditions.checkArgument(beginTimeMillis >= 0 && beginTimeMillis < endTimeMillis,
"beginTimeMillis must be non negative and lesser than endTimeMillis");
+ Preconditions.checkNotNull(callback, "callback cannot be null");
+ checkValidOpsOrNull(opNames);
mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
- Binder.getCallingPid(), Binder.getCallingUid(), "getAllHistoricalPackagesOps");
+ Binder.getCallingPid(), Binder.getCallingUid(), "getHistoricalOps");
- ArrayList<HistoricalPackageOps> historicalPackageOpsList = null;
+ if (mHistoricalRegistry.getMode() == AppOpsManager.HISTORICAL_MODE_DISABLED) {
+ // TODO (bug:122218838): Remove once the feature fully enabled.
+ getHistoricalPackagesOpsCompat(uid, packageName, opNames, beginTimeMillis,
+ endTimeMillis, callback);
+ } else {
+ // Must not hold the appops lock
+ mHistoricalRegistry.getHistoricalOps(uid, packageName, opNames,
+ beginTimeMillis, endTimeMillis, callback);
+ }
+ }
- final int uidStateCount = mUidStates.size();
- for (int i = 0; i < uidStateCount; i++) {
- final UidState uidState = mUidStates.valueAt(i);
- if (uidState.pkgOps == null || uidState.pkgOps.isEmpty()) {
- continue;
+ private void getHistoricalPackagesOpsCompat(int uid, @NonNull String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull RemoteCallback callback) {
+ synchronized (AppOpsService.this) {
+ final HistoricalOps ops = new HistoricalOps(beginTimeMillis, endTimeMillis);
+ if (opNames == null) {
+ opNames = AppOpsManager.getOpStrs();
}
- final ArrayMap<String, Ops> packages = uidState.pkgOps;
- final int packageCount = packages.size();
- for (int j = 0; j < packageCount; j++) {
- final Ops pkgOps = packages.valueAt(j);
- final AppOpsManager.HistoricalPackageOps historicalPackageOps =
- createHistoricalPackageOps(uidState.uid, pkgOps, opNames,
- beginTimeMillis, endTimeMillis);
- if (historicalPackageOps != null) {
- if (historicalPackageOpsList == null) {
- historicalPackageOpsList = new ArrayList<>();
+ final int uidStateCount = mUidStates.size();
+ for (int uidIdx = 0; uidIdx < uidStateCount; uidIdx++) {
+ final UidState uidState = mUidStates.valueAt(uidIdx);
+ if (uidState.pkgOps == null || uidState.pkgOps.isEmpty()
+ || (uid != Process.INVALID_UID && uid != uidState.uid)) {
+ continue;
+ }
+ final ArrayMap<String, Ops> packages = uidState.pkgOps;
+ final int packageCount = packages.size();
+ for (int pkgIdx = 0; pkgIdx < packageCount; pkgIdx++) {
+ final Ops pkgOps = packages.valueAt(pkgIdx);
+ if (packageName != null && !packageName.equals(pkgOps.packageName)) {
+ continue;
+ }
+ final int opCount = opNames.length;
+ for (int opIdx = 0; opIdx < opCount; opIdx++) {
+ final String opName = opNames[opIdx];
+ if (!ArrayUtils.contains(opNames, opName)) {
+ continue;
+ }
+ final int opCode = AppOpsManager.strOpToOp(opName);
+ final Op op = pkgOps.get(opCode);
+ if (op == null) {
+ continue;
+ }
+ final int stateCount = AppOpsManager._NUM_UID_STATE;
+ for (int stateIdx = 0; stateIdx < stateCount; stateIdx++) {
+ if (op.rejectTime[stateIdx] != 0) {
+ ops.increaseRejectCount(opCode, uidState.uid,
+ pkgOps.packageName, stateIdx, 1);
+ } else if (op.time[stateIdx] != 0) {
+ ops.increaseAccessCount(opCode, uidState.uid,
+ pkgOps.packageName, stateIdx, 1);
+ }
+ }
}
- historicalPackageOpsList.add(historicalPackageOps);
}
}
+ final Bundle payload = new Bundle();
+ payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, ops);
+ callback.sendResult(payload);
}
-
- if (historicalPackageOpsList == null) {
- return null;
- }
-
- return new ParceledListSlice<>(historicalPackageOpsList);
- }
-
- private static @Nullable HistoricalPackageOps createHistoricalPackageOps(int uid,
- @Nullable Ops pkgOps, @Nullable String[] opNames, long beginTimeMillis,
- long endTimeMillis) {
- // TODO: Implement historical data collection
- if (pkgOps == null) {
- return null;
- }
-
- final HistoricalPackageOps historicalPackageOps = new HistoricalPackageOps(uid,
- pkgOps.packageName);
-
- if (opNames == null) {
- opNames = AppOpsManager.getOpStrs();
- }
- for (String opName : opNames) {
- addHistoricOpEntry(AppOpsManager.strOpToOp(opName), pkgOps, historicalPackageOps);
- }
-
- return historicalPackageOps;
}
@Override
- public @Nullable HistoricalPackageOps getHistoricalPackagesOps(int uid,
- @NonNull String packageName, @Nullable String[] opNames,
- long beginTimeMillis, long endTimeMillis) {
- Preconditions.checkNotNull(packageName,
- "packageName cannot be null");
+ public void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull RemoteCallback callback) {
+ Preconditions.checkArgument(uid == Process.INVALID_UID || uid >= 0,
+ "uid must be " + Process.INVALID_UID + " or non negative");
Preconditions.checkArgument(beginTimeMillis >= 0 && beginTimeMillis < endTimeMillis,
"beginTimeMillis must be non negative and lesser than endTimeMillis");
+ Preconditions.checkNotNull(callback, "callback cannot be null");
+ checkValidOpsOrNull(opNames);
mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
- Binder.getCallingPid(), Binder.getCallingUid(), "getHistoricalPackagesOps");
-
- final String resolvedPackageName = resolvePackageName(uid, packageName);
- if (resolvedPackageName == null) {
- return null;
- }
-
- // TODO: Implement historical data collection
- final Ops pkgOps = getOpsRawLocked(uid, resolvedPackageName, false /* edit */,
- false /* uidMismatchExpected */);
- return createHistoricalPackageOps(uid, pkgOps, opNames, beginTimeMillis, endTimeMillis);
- }
-
- private static void addHistoricOpEntry(int opCode, @NonNull Ops ops,
- @NonNull HistoricalPackageOps outHistoricalPackageOps) {
- final Op op = ops.get(opCode);
- if (op == null) {
- return;
- }
-
- final HistoricalOpEntry historicalOpEntry = new HistoricalOpEntry(opCode);
+ Binder.getCallingPid(), Binder.getCallingUid(), "getHistoricalOps");
- // TODO: Keep per UID state duration
- for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
- final int acceptCount;
- final int rejectCount;
- if (op.rejectTime[uidState] == 0) {
- acceptCount = 1;
- rejectCount = 0;
- } else {
- acceptCount = 0;
- rejectCount = 1;
- }
- historicalOpEntry.addEntry(uidState, acceptCount, rejectCount, 0);
- }
-
- outHistoricalPackageOps.addEntry(historicalOpEntry);
+ // Must not hold the appops lock
+ mHistoricalRegistry.getHistoricalOpsFromDiskRaw(uid, packageName, opNames,
+ beginTimeMillis, endTimeMillis, callback);
}
@Override
@@ -1884,6 +1875,8 @@ public class AppOpsService extends IAppOpsService.Stub {
+ packageName);
op.rejectTime[uidState.state] = System.currentTimeMillis();
scheduleOpNotedIfNeededLocked(code, uid, packageName, uidMode);
+ mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
+ uidState.state);
return uidMode;
}
} else {
@@ -1895,12 +1888,16 @@ public class AppOpsService extends IAppOpsService.Stub {
+ packageName);
op.rejectTime[uidState.state] = System.currentTimeMillis();
scheduleOpNotedIfNeededLocked(op.op, uid, packageName, mode);
+ mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
+ uidState.state);
return mode;
}
}
if (DEBUG) Slog.d(TAG, "noteOperation: allowing code " + code + " uid " + uid
+ " package " + packageName);
op.time[uidState.state] = System.currentTimeMillis();
+ mHistoricalRegistry.incrementOpAccessedCount(op.op, uid, packageName,
+ uidState.state);
op.rejectTime[uidState.state] = 0;
op.proxyUid = proxyUid;
op.proxyPackageName = proxyPackageName;
@@ -2035,6 +2032,8 @@ public class AppOpsService extends IAppOpsService.Stub {
+ switchCode + " (" + code + ") uid " + uid + " package "
+ resolvedPackageName);
op.rejectTime[uidState.state] = System.currentTimeMillis();
+ mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
+ uidState.state);
return uidMode;
}
} else {
@@ -2046,6 +2045,8 @@ public class AppOpsService extends IAppOpsService.Stub {
+ switchCode + " (" + code + ") uid " + uid + " package "
+ resolvedPackageName);
op.rejectTime[uidState.state] = System.currentTimeMillis();
+ mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
+ uidState.state);
return mode;
}
}
@@ -2054,6 +2055,8 @@ public class AppOpsService extends IAppOpsService.Stub {
if (op.startNesting == 0) {
op.startRealtime = SystemClock.elapsedRealtime();
op.time[uidState.state] = System.currentTimeMillis();
+ mHistoricalRegistry.incrementOpAccessedCount(op.op, uid, packageName,
+ uidState.state);
op.rejectTime[uidState.state] = 0;
op.duration = -1;
scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, true);
@@ -2216,6 +2219,8 @@ public class AppOpsService extends IAppOpsService.Stub {
if (op.startNesting <= 1 || finishNested) {
if (op.startNesting == 1 || finishNested) {
op.duration = (int)(SystemClock.elapsedRealtime() - op.startRealtime);
+ mHistoricalRegistry.increaseOpAccessDuration(op.op, op.uid, op.packageName,
+ op.uidState.state, op.duration);
op.time[op.uidState.state] = System.currentTimeMillis();
} else {
Slog.w(TAG, "Finishing op nesting under-run: uid " + op.uid + " pkg "
@@ -2344,7 +2349,7 @@ public class AppOpsService extends IAppOpsService.Stub {
ApplicationInfo appInfo = ActivityThread.getPackageManager()
.getApplicationInfo(packageName,
PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
UserHandle.getUserId(uid));
if (appInfo != null) {
pkgUid = appInfo.uid;
@@ -3391,6 +3396,8 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.println(" Limit output to data associated with the given app op mode.");
pw.println(" --package [PACKAGE]");
pw.println(" Limit output to data associated with the given package name.");
+ pw.println(" --watchers");
+ pw.println(" Only output the watcher sections.");
}
private void dumpTimesLocked(PrintWriter pw, String firstPrefix, String prefix, long[] times,
@@ -3425,10 +3432,11 @@ public class AppOpsService extends IAppOpsService.Stub {
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
- int dumpOp = -1;
+ int dumpOp = OP_NONE;
String dumpPackage = null;
- int dumpUid = -1;
+ int dumpUid = Process.INVALID_UID;
int dumpMode = -1;
+ boolean dumpWatchers = false;
if (args != null) {
for (int i=0; i<args.length; i++) {
@@ -3476,6 +3484,8 @@ public class AppOpsService extends IAppOpsService.Stub {
if (dumpMode < 0) {
return;
}
+ } else if ("--watchers".equals(arg)) {
+ dumpWatchers = true;
} else if (arg.length() > 0 && arg.charAt(0) == '-'){
pw.println("Unknown option: " + arg);
return;
@@ -3496,7 +3506,8 @@ public class AppOpsService extends IAppOpsService.Stub {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
final Date date = new Date();
boolean needSep = false;
- if (dumpOp < 0 && dumpMode < 0 && dumpPackage == null && mProfileOwners != null) {
+ if (dumpOp < 0 && dumpMode < 0 && dumpPackage == null && mProfileOwners != null
+ && !dumpWatchers) {
pw.println(" Profile owners:");
for (int poi = 0; poi < mProfileOwners.size(); poi++) {
pw.print(" User #");
@@ -3517,7 +3528,7 @@ public class AppOpsService extends IAppOpsService.Stub {
ArraySet<ModeCallback> callbacks = mOpModeWatchers.valueAt(i);
for (int j=0; j<callbacks.size(); j++) {
final ModeCallback cb = callbacks.valueAt(j);
- if (dumpPackage != null && cb.mWatchingUid >= 0
+ if (dumpPackage != null
&& dumpUid != UserHandle.getAppId(cb.mWatchingUid)) {
continue;
}
@@ -3561,7 +3572,7 @@ public class AppOpsService extends IAppOpsService.Stub {
boolean printedHeader = false;
for (int i=0; i<mModeWatchers.size(); i++) {
final ModeCallback cb = mModeWatchers.valueAt(i);
- if (dumpPackage != null && cb.mWatchingUid >= 0
+ if (dumpPackage != null
&& dumpUid != UserHandle.getAppId(cb.mWatchingUid)) {
continue;
}
@@ -3587,7 +3598,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (dumpOp >= 0 && activeWatchers.indexOfKey(dumpOp) < 0) {
continue;
}
- if (dumpPackage != null && cb.mWatchingUid >= 0
+ if (dumpPackage != null
&& dumpUid != UserHandle.getAppId(cb.mWatchingUid)) {
continue;
}
@@ -3627,7 +3638,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (dumpOp >= 0 && notedWatchers.indexOfKey(dumpOp) < 0) {
continue;
}
- if (dumpPackage != null && cb.mWatchingUid >= 0
+ if (dumpPackage != null
&& dumpUid != UserHandle.getAppId(cb.mWatchingUid)) {
continue;
}
@@ -3655,7 +3666,7 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.println(cb);
}
}
- if (mClients.size() > 0 && dumpMode < 0) {
+ if (mClients.size() > 0 && dumpMode < 0 && !dumpWatchers) {
needSep = true;
boolean printedHeader = false;
for (int i=0; i<mClients.size(); i++) {
@@ -3692,7 +3703,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
if (mAudioRestrictions.size() > 0 && dumpOp < 0 && dumpPackage != null
- && dumpMode < 0) {
+ && dumpMode < 0 && !dumpWatchers) {
boolean printedHeader = false;
for (int o=0; o<mAudioRestrictions.size(); o++) {
final String op = AppOpsManager.opToName(mAudioRestrictions.keyAt(o));
@@ -3725,6 +3736,9 @@ public class AppOpsService extends IAppOpsService.Stub {
final SparseIntArray opModes = uidState.opModes;
final ArrayMap<String, Ops> pkgOps = uidState.pkgOps;
+ if (dumpWatchers) {
+ continue;
+ }
if (dumpOp >= 0 || dumpPackage != null || dumpMode >= 0) {
boolean hasOp = dumpOp < 0 || (uidState.opModes != null
&& uidState.opModes.indexOfKey(dumpOp) >= 0);
@@ -3739,8 +3753,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
if (pkgOps != null) {
for (int pkgi = 0;
- (!hasOp || !hasPackage || !hasMode) && pkgi < pkgOps.size();
- pkgi++) {
+ (!hasOp || !hasPackage || !hasMode) && pkgi < pkgOps.size();
+ pkgi++) {
Ops ops = pkgOps.valueAt(pkgi);
if (!hasOp && ops != null && ops.indexOfKey(dumpOp) >= 0) {
hasOp = true;
@@ -3880,18 +3894,34 @@ public class AppOpsService extends IAppOpsService.Stub {
for (int i = 0; i < userRestrictionCount; i++) {
IBinder token = mOpUserRestrictions.keyAt(i);
ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
- pw.println(" User restrictions for token " + token + ":");
+ boolean printedTokenHeader = false;
+
+ if (dumpMode >= 0 || dumpWatchers) {
+ continue;
+ }
final int restrictionCount = restrictionState.perUserRestrictions != null
? restrictionState.perUserRestrictions.size() : 0;
- if (restrictionCount > 0) {
- pw.println(" Restricted ops:");
+ if (restrictionCount > 0 && dumpPackage == null) {
+ boolean printedOpsHeader = false;
for (int j = 0; j < restrictionCount; j++) {
int userId = restrictionState.perUserRestrictions.keyAt(j);
boolean[] restrictedOps = restrictionState.perUserRestrictions.valueAt(j);
if (restrictedOps == null) {
continue;
}
+ if (dumpOp >= 0 && (dumpOp >= restrictedOps.length
+ || !restrictedOps[dumpOp])) {
+ continue;
+ }
+ if (!printedTokenHeader) {
+ pw.println(" User restrictions for token " + token + ":");
+ printedTokenHeader = true;
+ }
+ if (!printedOpsHeader) {
+ pw.println(" Restricted ops:");
+ printedOpsHeader = true;
+ }
StringBuilder restrictedOpsValue = new StringBuilder();
restrictedOpsValue.append("[");
final int restrictedOpCount = restrictedOps.length;
@@ -3911,17 +3941,46 @@ public class AppOpsService extends IAppOpsService.Stub {
final int excludedPackageCount = restrictionState.perUserExcludedPackages != null
? restrictionState.perUserExcludedPackages.size() : 0;
- if (excludedPackageCount > 0) {
- pw.println(" Excluded packages:");
+ if (excludedPackageCount > 0 && dumpOp < 0) {
+ boolean printedPackagesHeader = false;
for (int j = 0; j < excludedPackageCount; j++) {
int userId = restrictionState.perUserExcludedPackages.keyAt(j);
String[] packageNames = restrictionState.perUserExcludedPackages.valueAt(j);
+ if (packageNames == null) {
+ continue;
+ }
+ boolean hasPackage;
+ if (dumpPackage != null) {
+ hasPackage = false;
+ for (String pkg : packageNames) {
+ if (dumpPackage.equals(pkg)) {
+ hasPackage = true;
+ break;
+ }
+ }
+ } else {
+ hasPackage = true;
+ }
+ if (!hasPackage) {
+ continue;
+ }
+ if (!printedTokenHeader) {
+ pw.println(" User restrictions for token " + token + ":");
+ printedTokenHeader = true;
+ }
+ if (!printedPackagesHeader) {
+ pw.println(" Excluded packages:");
+ printedPackagesHeader = true;
+ }
pw.print(" "); pw.print("user: "); pw.print(userId);
pw.print(" packages: "); pw.println(Arrays.toString(packageNames));
}
}
}
}
+
+ // Must not hold the appops lock
+ mHistoricalRegistry.dump(" ", pw, dumpUid, dumpPackage, dumpOp);
}
private static final class Restriction {
@@ -4042,6 +4101,47 @@ public class AppOpsService extends IAppOpsService.Stub {
return false;
}
+ @Override
+ public void setHistoryParameters(@AppOpsManager.HistoricalMode int mode,
+ long baseSnapshotInterval, int compressionStep) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS,
+ "setHistoryParameters");
+ // Must not hold the appops lock
+ mHistoricalRegistry.setHistoryParameters(mode, baseSnapshotInterval, compressionStep);
+ }
+
+ @Override
+ public void offsetHistory(long offsetMillis) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS,
+ "offsetHistory");
+ // Must not hold the appops lock
+ mHistoricalRegistry.offsetHistory(offsetMillis);
+ }
+
+ @Override
+ public void addHistoricalOps(HistoricalOps ops) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS,
+ "addHistoricalOps");
+ // Must not hold the appops lock
+ mHistoricalRegistry.addHistoricalOps(ops);
+ }
+
+ @Override
+ public void resetHistoryParameters() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS,
+ "resetHistoryParameters");
+ // Must not hold the appops lock
+ mHistoricalRegistry.resetHistoryParameters();
+ }
+
+ @Override
+ public void clearHistory() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS,
+ "clearHistory");
+ // Must not hold the appops lock
+ mHistoricalRegistry.clearHistory();
+ }
+
private void removeUidsForUserLocked(int userHandle) {
for (int i = mUidStates.size() - 1; i >= 0; --i) {
final int uid = mUidStates.keyAt(i);
@@ -4112,6 +4212,16 @@ public class AppOpsService extends IAppOpsService.Stub {
return packageNames;
}
+ private static void checkValidOpsOrNull(String[] opNames) {
+ if (opNames != null) {
+ for (String opName : opNames) {
+ if (AppOpsManager.strOpToOp(opName) == AppOpsManager.OP_NONE) {
+ throw new IllegalArgumentException("Unknown op: " + opName);
+ }
+ }
+ }
+ }
+
private final class ClientRestrictionState implements DeathRecipient {
private final IBinder token;
SparseArray<boolean[]> perUserRestrictions;
diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java
new file mode 100644
index 000000000000..714a807da1b0
--- /dev/null
+++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java
@@ -0,0 +1,1496 @@
+/*
+ * Copyright (C) 2018 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.appop;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AppOpsManager;
+import android.app.AppOpsManager.HistoricalMode;
+import android.app.AppOpsManager.HistoricalOp;
+import android.app.AppOpsManager.HistoricalOps;
+import android.app.AppOpsManager.HistoricalPackageOps;
+import android.app.AppOpsManager.HistoricalUidOps;
+import android.app.AppOpsManager.UidState;
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Message;
+import android.os.Process;
+import android.os.RemoteCallback;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.ArraySet;
+import android.util.Slog;
+import android.util.TimeUtils;
+import android.util.Xml;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.AtomicDirectory;
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.XmlUtils;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.FgThread;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This class managers historical app op state. This includes reading, persistence,
+ * accounting, querying.
+ * <p>
+ * The history is kept forever in multiple files. Each file time contains the
+ * relative offset from the current time which time is encoded in the file name.
+ * The files contain historical app op state snapshots which have times that
+ * are relative to the time of the container file.
+ *
+ * The data in the files are stored in a logarithmic fashion where where every
+ * subsequent file would contain data for ten times longer interval with ten
+ * times more time distance between snapshots. Hence, the more time passes
+ * the lesser the fidelity.
+ * <p>
+ * For example, the first file would contain data for 1 days with snapshots
+ * every 0.1 days, the next file would contain data for the period 1 to 10
+ * days with snapshots every 1 days, and so on.
+ * <p>
+ * THREADING AND LOCKING: Reported ops must be processed as quickly as possible.
+ * We keep ops pending to be persisted in memory and write to disk on a background
+ * thread. Hence, methods that report op changes are locking only the in memory
+ * state guarded by the mInMemoryLock which happens to be the app ops service lock
+ * avoiding a lock addition on the critical path. When a query comes we need to
+ * evaluate it based off both in memory and on disk state. This means they need to
+ * be frozen with respect to each other and not change from the querying caller's
+ * perspective. To achieve this we add a dedicated mOnDiskLock to guard the on
+ * disk state. To have fast critical path we need to limit the locking of the
+ * mInMemoryLock, thus for operations that touch in memory and on disk state one
+ * must grab first the mOnDiskLock and then the mInMemoryLock and limit the
+ * in memory lock to extraction of relevant data. Locking order is critical to
+ * avoid deadlocks. The convention is that xxxDLocked suffix means the method
+ * must be called with the mOnDiskLock lock, xxxMLocked suffix means the method
+ * must be called with the mInMemoryLock, xxxDMLocked suffix means the method
+ * must be called with the mOnDiskLock and mInMemoryLock locks acquired in that
+ * exact order.
+ */
+// TODO (bug:122218838): Make sure we handle start of epoch time
+// TODO (bug:122218838): Validate changed time is handled correctly
+final class HistoricalRegistry {
+ private static final boolean DEBUG = false;
+
+ private static final String LOG_TAG = HistoricalRegistry.class.getSimpleName();
+
+ private static final String PARAMETER_DELIMITER = ",";
+ private static final String PARAMETER_ASSIGNMENT = "=";
+
+ @GuardedBy("mLock")
+ private @NonNull LinkedList<HistoricalOps> mPendingWrites = new LinkedList<>();
+
+ // Lock for read/write access to on disk state
+ private final Object mOnDiskLock = new Object();
+
+ //Lock for read/write access to in memory state
+ private final @NonNull Object mInMemoryLock;
+
+ private static final int MSG_WRITE_PENDING_HISTORY = 1;
+
+ // See mMode
+ private static final int DEFAULT_MODE = AppOpsManager.HISTORICAL_MODE_DISABLED;
+
+ // See mBaseSnapshotInterval
+ private static final long DEFAULT_SNAPSHOT_INTERVAL_MILLIS = TimeUnit.MINUTES.toMillis(15);
+
+ // See mIntervalCompressionMultiplier
+ private static final long DEFAULT_COMPRESSION_STEP = 10;
+
+ /**
+ * Whether history is enabled.
+ */
+ @GuardedBy("mInMemoryLock")
+ private int mMode = AppOpsManager.HISTORICAL_MODE_DISABLED;
+
+ /**
+ * This granularity has been chosen to allow clean delineation for intervals
+ * humans understand, 15 min, 60, min, a day, a week, a month (30 days).
+ */
+ @GuardedBy("mInMemoryLock")
+ private long mBaseSnapshotInterval = DEFAULT_SNAPSHOT_INTERVAL_MILLIS;
+
+ /**
+ * The compression between steps. Each subsequent step is this much longer
+ * in terms of duration and each snapshot is this much more apart from the
+ * previous step.
+ */
+ @GuardedBy("mInMemoryLock")
+ private long mIntervalCompressionMultiplier = DEFAULT_COMPRESSION_STEP;
+
+ // The current ops to which to add statistics.
+ @GuardedBy("mInMemoryLock")
+ private @Nullable HistoricalOps mCurrentHistoricalOps;
+
+ // The time we should write the next snapshot.
+ @GuardedBy("mInMemoryLock")
+ private long mNextPersistDueTimeMillis;
+
+ // How much to offset the history on the next write.
+ @GuardedBy("mInMemoryLock")
+ private long mPendingHistoryOffsetMillis;
+
+ // Object managing persistence (read/write)
+ @GuardedBy("mOnDiskLock")
+ private Persistence mPersistence = new Persistence(mBaseSnapshotInterval,
+ mIntervalCompressionMultiplier);
+
+ HistoricalRegistry(@NonNull Object lock) {
+ mInMemoryLock = lock;
+ if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) {
+ synchronized (mInMemoryLock) {
+ // When starting always adjust history to now.
+ mPendingHistoryOffsetMillis = System.currentTimeMillis()
+ - mPersistence.getLastPersistTimeMillisDLocked();
+ }
+ }
+ }
+
+ void systemReady(@NonNull ContentResolver resolver) {
+ updateParametersFromSetting(resolver);
+ final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS);
+ resolver.registerContentObserver(uri, false, new ContentObserver(
+ FgThread.getHandler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateParametersFromSetting(resolver);
+ }
+ });
+ }
+
+ private void updateParametersFromSetting(@NonNull ContentResolver resolver) {
+ final String setting = Settings.Global.getString(resolver,
+ Settings.Global.APPOP_HISTORY_PARAMETERS);
+ if (setting == null) {
+ return;
+ }
+ String modeValue = null;
+ String baseSnapshotIntervalValue = null;
+ String intervalMultiplierValue = null;
+ final String[] parameters = setting.split(PARAMETER_DELIMITER);
+ for (String parameter : parameters) {
+ final String[] parts = parameter.split(PARAMETER_ASSIGNMENT);
+ if (parts.length == 2) {
+ final String key = parts[0].trim();
+ switch (key) {
+ case Settings.Global.APPOP_HISTORY_MODE: {
+ modeValue = parts[1].trim();
+ } break;
+ case Settings.Global.APPOP_HISTORY_BASE_INTERVAL_MILLIS: {
+ baseSnapshotIntervalValue = parts[1].trim();
+ } break;
+ case Settings.Global.APPOP_HISTORY_INTERVAL_MULTIPLIER: {
+ intervalMultiplierValue = parts[1].trim();
+ } break;
+ default: {
+ Slog.w(LOG_TAG, "Unknown parameter: " + parameter);
+ }
+ }
+ }
+ }
+ if (modeValue != null && baseSnapshotIntervalValue != null
+ && intervalMultiplierValue != null) {
+ try {
+ final int mode = AppOpsManager.parseHistoricalMode(modeValue);
+ final long baseSnapshotInterval = Long.parseLong(baseSnapshotIntervalValue);
+ final int intervalCompressionMultiplier = Integer.parseInt(intervalMultiplierValue);
+ setHistoryParameters(mode, baseSnapshotInterval,intervalCompressionMultiplier);
+ return;
+ } catch (NumberFormatException ignored) {}
+ }
+ Slog.w(LOG_TAG, "Bad value for" + Settings.Global.APPOP_HISTORY_PARAMETERS
+ + "=" + setting + " resetting!");
+ }
+
+ void dump(String prefix, PrintWriter pw, int filterUid,
+ String filterPackage, int filterOp) {
+ synchronized (mOnDiskLock) {
+ synchronized (mInMemoryLock) {
+ pw.println();
+ pw.print(prefix);
+ pw.print("History:");
+
+ pw.print(" mode=");
+ pw.println(AppOpsManager.historicalModeToString(mMode));
+
+ final StringDumpVisitor visitor = new StringDumpVisitor(prefix + " ",
+ pw, filterUid, filterPackage, filterOp);
+ final long nowMillis = System.currentTimeMillis();
+
+ // Dump in memory state first
+ final HistoricalOps currentOps = getUpdatedPendingHistoricalOpsMLocked(
+ nowMillis);
+ makeRelativeToEpochStart(currentOps, nowMillis);
+ currentOps.accept(visitor);
+
+ final List<HistoricalOps> ops = mPersistence.readHistoryDLocked();
+ if (ops != null) {
+ // TODO (bug:122218838): Make sure this is properly dumped
+ final long remainingToFillBatchMillis = mNextPersistDueTimeMillis
+ - nowMillis - mBaseSnapshotInterval;
+ final int opCount = ops.size();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOps op = ops.get(i);
+ op.offsetBeginAndEndTime(remainingToFillBatchMillis);
+ makeRelativeToEpochStart(op, nowMillis);
+ op.accept(visitor);
+ }
+ } else {
+ pw.println(" Empty");
+ }
+ }
+ }
+ }
+
+ @HistoricalMode int getMode() {
+ synchronized (mInMemoryLock) {
+ return mMode;
+ }
+ }
+
+ @Nullable void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull RemoteCallback callback) {
+ final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis);
+ mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames,
+ beginTimeMillis, endTimeMillis);
+ final Bundle payload = new Bundle();
+ payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result);
+ callback.sendResult(payload);
+ }
+
+ @Nullable void getHistoricalOps(int uid, @NonNull String packageName,
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
+ @NonNull RemoteCallback callback) {
+ final long currentTimeMillis = System.currentTimeMillis();
+ if (endTimeMillis == Long.MAX_VALUE) {
+ endTimeMillis = currentTimeMillis;
+ }
+
+ // Argument times are based off epoch start while our internal store is
+ // based off now, so take this into account.
+ final long inMemoryAdjBeginTimeMillis = Math.max(currentTimeMillis - endTimeMillis, 0);
+ final long inMemoryAdjEndTimeMillis = Math.max(currentTimeMillis - beginTimeMillis, 0);
+ final HistoricalOps result = new HistoricalOps(inMemoryAdjBeginTimeMillis,
+ inMemoryAdjEndTimeMillis);
+
+ synchronized (mOnDiskLock) {
+ final List<HistoricalOps> pendingWrites;
+ final HistoricalOps currentOps;
+ synchronized (mInMemoryLock) {
+ currentOps = getUpdatedPendingHistoricalOpsMLocked(currentTimeMillis);
+ if (!(inMemoryAdjBeginTimeMillis >= currentOps.getEndTimeMillis()
+ || inMemoryAdjEndTimeMillis <= currentOps.getBeginTimeMillis())) {
+ // Some of the current batch falls into the query, so extract that.
+ final HistoricalOps currentOpsCopy = new HistoricalOps(currentOps);
+ currentOpsCopy.filter(uid, packageName, opNames, inMemoryAdjBeginTimeMillis,
+ inMemoryAdjEndTimeMillis);
+ result.merge(currentOpsCopy);
+ }
+ pendingWrites = new ArrayList<>(mPendingWrites);
+ mPendingWrites.clear();
+ }
+
+ // If the query was only for in-memory state - done.
+ if (inMemoryAdjEndTimeMillis > currentOps.getEndTimeMillis()) {
+ // If there is a write in flight we need to force it now
+ persistPendingHistory(pendingWrites);
+ // Collect persisted state.
+ final long onDiskAndInMemoryOffsetMillis = currentTimeMillis
+ - mNextPersistDueTimeMillis + mBaseSnapshotInterval;
+ final long onDiskAdjBeginTimeMillis = Math.max(inMemoryAdjBeginTimeMillis
+ - onDiskAndInMemoryOffsetMillis, 0);
+ final long onDiskAdjEndTimeMillis = Math.max(inMemoryAdjEndTimeMillis
+ - onDiskAndInMemoryOffsetMillis, 0);
+ mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames,
+ onDiskAdjBeginTimeMillis, onDiskAdjEndTimeMillis);
+ }
+
+ // Rebase the result time to be since epoch.
+ result.setBeginAndEndTime(beginTimeMillis, endTimeMillis);
+
+ // Send back the result.
+ final Bundle payload = new Bundle();
+ payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result);
+ callback.sendResult(payload);
+ }
+ }
+
+ void incrementOpAccessedCount(int op, int uid, @NonNull String packageName,
+ @UidState int uidState) {
+ synchronized (mInMemoryLock) {
+ if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
+ getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
+ .increaseAccessCount(op, uid, packageName, uidState, 1);
+
+ }
+ }
+ }
+
+ void incrementOpRejected(int op, int uid, @NonNull String packageName,
+ @UidState int uidState) {
+ synchronized (mInMemoryLock) {
+ if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
+ getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
+ .increaseRejectCount(op, uid, packageName, uidState, 1);
+ }
+ }
+ }
+
+ void increaseOpAccessDuration(int op, int uid, @NonNull String packageName,
+ @UidState int uidState, long increment) {
+ synchronized (mInMemoryLock) {
+ if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
+ getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
+ .increaseAccessDuration(op, uid, packageName, uidState, increment);
+ }
+ }
+ }
+
+ void setHistoryParameters(@HistoricalMode int mode,
+ long baseSnapshotInterval, long intervalCompressionMultiplier) {
+ synchronized (mOnDiskLock) {
+ synchronized (mInMemoryLock) {
+ boolean resampleHistory = false;
+ Slog.i(LOG_TAG, "New history parameters: mode:"
+ + AppOpsManager.historicalModeToString(mMode) + " baseSnapshotInterval:"
+ + baseSnapshotInterval + " intervalCompressionMultiplier:"
+ + intervalCompressionMultiplier);
+ if (mMode != mode) {
+ mMode = mode;
+ if (mMode == AppOpsManager.HISTORICAL_MODE_DISABLED) {
+ clearHistoryOnDiskLocked();
+ }
+ }
+ if (mBaseSnapshotInterval != baseSnapshotInterval) {
+ mBaseSnapshotInterval = baseSnapshotInterval;
+ resampleHistory = true;
+ }
+ if (mIntervalCompressionMultiplier != intervalCompressionMultiplier) {
+ mIntervalCompressionMultiplier = intervalCompressionMultiplier;
+ resampleHistory = true;
+ }
+ if (resampleHistory) {
+ resampleHistoryOnDiskInMemoryDMLocked(0);
+ }
+ }
+ }
+ }
+
+ void offsetHistory(long offsetMillis) {
+ synchronized (mOnDiskLock) {
+ synchronized (mInMemoryLock) {
+ final List<HistoricalOps> history = mPersistence.readHistoryDLocked();
+ clearHistory();
+ if (history != null) {
+ final int historySize = history.size();
+ for (int i = 0; i < historySize; i++) {
+ final HistoricalOps ops = history.get(i);
+ ops.offsetBeginAndEndTime(offsetMillis);
+ }
+ if (offsetMillis < 0) {
+ pruneFutureOps(history);
+ }
+ mPersistence.persistHistoricalOpsDLocked(history);
+ }
+ }
+ }
+ }
+
+ void addHistoricalOps(HistoricalOps ops) {
+ final List<HistoricalOps> pendingWrites;
+ synchronized (mInMemoryLock) {
+ // The history files start from mBaseSnapshotInterval - take this into account.
+ ops.offsetBeginAndEndTime(mBaseSnapshotInterval);
+ mPendingWrites.offerFirst(ops);
+ pendingWrites = new ArrayList<>(mPendingWrites);
+ mPendingWrites.clear();
+ }
+ persistPendingHistory(pendingWrites);
+ }
+
+ private void resampleHistoryOnDiskInMemoryDMLocked(long offsetMillis) {
+ mPersistence = new Persistence(mBaseSnapshotInterval, mIntervalCompressionMultiplier);
+ offsetHistory(offsetMillis);
+ }
+
+ void resetHistoryParameters() {
+ setHistoryParameters(DEFAULT_MODE, DEFAULT_SNAPSHOT_INTERVAL_MILLIS,
+ DEFAULT_COMPRESSION_STEP);
+ }
+
+ void clearHistory() {
+ synchronized (mOnDiskLock) {
+ clearHistoryOnDiskLocked();
+ }
+ }
+
+ private void clearHistoryOnDiskLocked() {
+ BackgroundThread.getHandler().removeMessages(MSG_WRITE_PENDING_HISTORY);
+ synchronized (mInMemoryLock) {
+ mCurrentHistoricalOps = null;
+ mNextPersistDueTimeMillis = System.currentTimeMillis();
+ mPendingWrites.clear();
+ }
+ mPersistence.clearHistoryDLocked();
+ }
+
+ private @NonNull HistoricalOps getUpdatedPendingHistoricalOpsMLocked(long now) {
+ if (mCurrentHistoricalOps != null) {
+ final long remainingTimeMillis = mNextPersistDueTimeMillis - now;
+ if (remainingTimeMillis > mBaseSnapshotInterval) {
+ // If time went backwards we need to push history to the future with the
+ // overflow over our snapshot interval. If time went forward do nothing
+ // as we would naturally push history into the past on the next write.
+ mPendingHistoryOffsetMillis = remainingTimeMillis - mBaseSnapshotInterval;
+ }
+ final long elapsedTimeMillis = mBaseSnapshotInterval - remainingTimeMillis;
+ mCurrentHistoricalOps.setEndTime(elapsedTimeMillis);
+ if (remainingTimeMillis > 0) {
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Returning current in-memory state");
+ }
+ return mCurrentHistoricalOps;
+ }
+ if (mCurrentHistoricalOps.isEmpty()) {
+ mCurrentHistoricalOps.setBeginAndEndTime(0, 0);
+ mNextPersistDueTimeMillis = now + mBaseSnapshotInterval;
+ return mCurrentHistoricalOps;
+ }
+ // The current batch is full, so persist taking into account overdue persist time.
+ mCurrentHistoricalOps.offsetBeginAndEndTime(mBaseSnapshotInterval);
+ mCurrentHistoricalOps.setBeginTime(mCurrentHistoricalOps.getEndTimeMillis()
+ - mBaseSnapshotInterval);
+ final long overdueTimeMillis = Math.abs(remainingTimeMillis);
+ mCurrentHistoricalOps.offsetBeginAndEndTime(overdueTimeMillis);
+ schedulePersistHistoricalOpsMLocked(mCurrentHistoricalOps);
+ }
+ // The current batch is in the future, i.e. not complete yet.
+ mCurrentHistoricalOps = new HistoricalOps(0, 0);
+ mNextPersistDueTimeMillis = now + mBaseSnapshotInterval;
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Returning new in-memory state");
+ }
+ return mCurrentHistoricalOps;
+ }
+
+ private void persistPendingHistory() {
+ final List<HistoricalOps> pendingWrites;
+ synchronized (mOnDiskLock) {
+ synchronized (mInMemoryLock) {
+ pendingWrites = new ArrayList<>(mPendingWrites);
+ mPendingWrites.clear();
+ if (mPendingHistoryOffsetMillis != 0) {
+ resampleHistoryOnDiskInMemoryDMLocked(mPendingHistoryOffsetMillis);
+ mPendingHistoryOffsetMillis = 0;
+ }
+ }
+ persistPendingHistory(pendingWrites);
+ }
+ }
+ private void persistPendingHistory(@NonNull List<HistoricalOps> pendingWrites) {
+ synchronized (mOnDiskLock) {
+ BackgroundThread.getHandler().removeMessages(MSG_WRITE_PENDING_HISTORY);
+ if (pendingWrites.isEmpty()) {
+ return;
+ }
+ final int opCount = pendingWrites.size();
+ // Pending writes are offset relative to each other, so take this
+ // into account to persist everything in one shot - single write.
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOps current = pendingWrites.get(i);
+ if (i > 0) {
+ final HistoricalOps previous = pendingWrites.get(i - 1);
+ current.offsetBeginAndEndTime(previous.getBeginTimeMillis());
+ }
+ }
+ mPersistence.persistHistoricalOpsDLocked(pendingWrites);
+ }
+ }
+
+ private void schedulePersistHistoricalOpsMLocked(@NonNull HistoricalOps ops) {
+ final Message message = PooledLambda.obtainMessage(
+ HistoricalRegistry::persistPendingHistory, HistoricalRegistry.this);
+ message.what = MSG_WRITE_PENDING_HISTORY;
+ BackgroundThread.getHandler().sendMessage(message);
+ mPendingWrites.offerFirst(ops);
+ }
+
+ private static void makeRelativeToEpochStart(@NonNull HistoricalOps ops, long nowMillis) {
+ ops.setBeginAndEndTime(nowMillis - ops.getEndTimeMillis(),
+ nowMillis- ops.getBeginTimeMillis());
+ }
+
+ private void pruneFutureOps(@NonNull List<HistoricalOps> ops) {
+ final int opCount = ops.size();
+ for (int i = opCount - 1; i >= 0; i--) {
+ final HistoricalOps op = ops.get(i);
+ if (op.getEndTimeMillis() <= mBaseSnapshotInterval) {
+ ops.remove(i);
+ } else if (op.getBeginTimeMillis() < mBaseSnapshotInterval) {
+ final double filterScale = (double) (op.getEndTimeMillis() - mBaseSnapshotInterval)
+ / (double) op.getDurationMillis();
+ Persistence.spliceFromBeginning(op, filterScale);
+ }
+ }
+ }
+
+ private static final class Persistence {
+ private static final boolean DEBUG = false;
+
+ private static final String LOG_TAG = Persistence.class.getSimpleName();
+
+ private static final String HISTORY_FILE_SUFFIX = ".xml";
+
+ private static final String TAG_HISTORY = "history";
+ private static final String TAG_OPS = "ops";
+ private static final String TAG_UID = "uid";
+ private static final String TAG_PACKAGE = "package";
+ private static final String TAG_OP = "op";
+ private static final String TAG_STATE = "state";
+
+ private static final String ATTR_VERSION = "version";
+ private static final String ATTR_NAME = "name";
+ private static final String ATTR_ACCESS_COUNT = "accessCount";
+ private static final String ATTR_REJECT_COUNT = "rejectCount";
+ private static final String ATTR_ACCESS_DURATION = "accessDuration";
+ private static final String ATTR_BEGIN_TIME = "beginTime";
+ private static final String ATTR_END_TIME = "endTime";
+ private static final String ATTR_OVERFLOW = "overflow";
+
+ private static final int CURRENT_VERSION = 1;
+
+ private final long mBaseSnapshotInterval;
+ private final long mIntervalCompressionMultiplier;
+
+ Persistence(long baseSnapshotInterval, long intervalCompressionMultiplier) {
+ mBaseSnapshotInterval = baseSnapshotInterval;
+ mIntervalCompressionMultiplier = intervalCompressionMultiplier;
+ }
+
+ private final AtomicDirectory mHistoricalAppOpsDir = new AtomicDirectory(
+ new File(new File(Environment.getDataSystemDeDirectory(), "appops"), "history"));
+
+ private File generateFile(@NonNull File baseDir, int depth) {
+ final long globalBeginMillis = computeGlobalIntervalBeginMillis(depth);
+ return new File(baseDir, Long.toString(globalBeginMillis) + HISTORY_FILE_SUFFIX);
+ }
+
+ void clearHistoryDLocked() {
+ mHistoricalAppOpsDir.delete();
+ }
+
+ void persistHistoricalOpsDLocked(@NonNull List<HistoricalOps> ops) {
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Persisting ops:\n" + opsToDebugString(ops));
+ enforceOpsWellFormed(ops);
+ }
+ try {
+ final File newBaseDir = mHistoricalAppOpsDir.startWrite();
+ final File oldBaseDir = mHistoricalAppOpsDir.getBackupDirectory();
+ handlePersistHistoricalOpsRecursiveDLocked(newBaseDir, oldBaseDir, ops, 0);
+ mHistoricalAppOpsDir.finishWrite();
+ } catch (Throwable t) {
+ Slog.wtf(LOG_TAG, "Failed to write historical app ops, restoring backup", t);
+ mHistoricalAppOpsDir.failWrite();
+ }
+ }
+
+ @Nullable List<HistoricalOps> readHistoryRawDLocked() {
+ return collectHistoricalOpsBaseDLocked(Process.INVALID_UID /*filterUid*/,
+ null /*filterPackageName*/, null /*filterOpNames*/,
+ 0 /*filterBeginTimeMills*/, Long.MAX_VALUE /*filterEndTimeMills*/);
+ }
+
+ @Nullable List<HistoricalOps> readHistoryDLocked() {
+ final List<HistoricalOps> result = readHistoryRawDLocked();
+ // Take into account in memory state duration.
+ if (result != null) {
+ final int opCount = result.size();
+ for (int i = 0; i < opCount; i++) {
+ result.get(i).offsetBeginAndEndTime(mBaseSnapshotInterval);
+ }
+ }
+ return result;
+ }
+
+ long getLastPersistTimeMillisDLocked() {
+ try {
+ final File baseDir = mHistoricalAppOpsDir.startRead();
+ final File file = generateFile(baseDir, 0);
+ if (file.exists()) {
+ return file.lastModified();
+ }
+ mHistoricalAppOpsDir.finishRead();
+ } catch (IOException e) {
+ Slog.wtf("Error reading historical app ops. Deleting history.", e);
+ mHistoricalAppOpsDir.delete();
+ }
+ return 0;
+ }
+
+ private void collectHistoricalOpsDLocked(@NonNull HistoricalOps currentOps,
+ int filterUid, @NonNull String filterPackageName, @Nullable String[] filterOpNames,
+ long filterBeingMillis, long filterEndMillis) {
+ final List<HistoricalOps> readOps = collectHistoricalOpsBaseDLocked(filterUid,
+ filterPackageName, filterOpNames, filterBeingMillis, filterEndMillis);
+ if (readOps != null) {
+ final int readCount = readOps.size();
+ for (int i = 0; i < readCount; i++) {
+ final HistoricalOps readOp = readOps.get(i);
+ currentOps.merge(readOp);
+ }
+ }
+ }
+
+ private @Nullable LinkedList<HistoricalOps> collectHistoricalOpsBaseDLocked(
+ int filterUid, @NonNull String filterPackageName, @Nullable String[] filterOpNames,
+ long filterBeginTimeMillis, long filterEndTimeMillis) {
+ try {
+ final File baseDir = mHistoricalAppOpsDir.startRead();
+ final File[] files = baseDir.listFiles();
+ if (files == null) {
+ return null;
+ }
+ final ArraySet<File> historyFiles = new ArraySet<>(files.length);
+ for (File file : files) {
+ if (file.isFile() && file.getName().endsWith(HISTORY_FILE_SUFFIX)) {
+ historyFiles.add(file);
+ }
+ }
+ final long[] globalContentOffsetMillis = {0};
+ final LinkedList<HistoricalOps> ops = collectHistoricalOpsRecursiveDLocked(
+ baseDir, filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
+ filterEndTimeMillis, globalContentOffsetMillis, null /*outOps*/,
+ 0 /*depth*/, historyFiles);
+ mHistoricalAppOpsDir.finishRead();
+ return ops;
+ } catch (IOException | XmlPullParserException e) {
+ Slog.wtf("Error reading historical app ops. Deleting history.", e);
+ mHistoricalAppOpsDir.delete();
+ }
+ return null;
+ }
+
+ private @Nullable LinkedList<HistoricalOps> collectHistoricalOpsRecursiveDLocked(
+ @NonNull File baseDir, int filterUid, @NonNull String filterPackageName,
+ @Nullable String[] filterOpNames, long filterBeginTimeMillis,
+ long filterEndTimeMillis, @NonNull long[] globalContentOffsetMillis,
+ @Nullable LinkedList<HistoricalOps> outOps, int depth,
+ @NonNull ArraySet<File> historyFiles)
+ throws IOException, XmlPullParserException {
+ final long previousIntervalEndMillis = (long) Math.pow(mIntervalCompressionMultiplier,
+ depth) * mBaseSnapshotInterval;
+ final long currentIntervalEndMillis = (long) Math.pow(mIntervalCompressionMultiplier,
+ depth + 1) * mBaseSnapshotInterval;
+
+ filterBeginTimeMillis = Math.max(filterBeginTimeMillis - previousIntervalEndMillis, 0);
+ filterEndTimeMillis = filterEndTimeMillis - previousIntervalEndMillis;
+
+ // Read historical data at this level
+ final List<HistoricalOps> readOps = readHistoricalOpsLocked(baseDir,
+ previousIntervalEndMillis, currentIntervalEndMillis, filterUid,
+ filterPackageName, filterOpNames, filterBeginTimeMillis, filterEndTimeMillis,
+ globalContentOffsetMillis, depth, historyFiles);
+
+ // Empty is a special signal to stop diving
+ if (readOps != null && readOps.isEmpty()) {
+ return outOps;
+ }
+
+ // Collect older historical data from subsequent levels
+ outOps = collectHistoricalOpsRecursiveDLocked(
+ baseDir, filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
+ filterEndTimeMillis, globalContentOffsetMillis, outOps, depth + 1,
+ historyFiles);
+
+ // Make older historical data relative to the current historical level
+ if (outOps != null) {
+ final int opCount = outOps.size();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOps collectedOp = outOps.get(i);
+ collectedOp.offsetBeginAndEndTime(currentIntervalEndMillis);
+ }
+ }
+
+ if (readOps != null) {
+ if (outOps == null) {
+ outOps = new LinkedList<>();
+ }
+ // Add the read ops to output
+ final int opCount = readOps.size();
+ for (int i = opCount - 1; i >= 0; i--) {
+ outOps.offerFirst(readOps.get(i));
+ }
+ }
+
+ return outOps;
+ }
+
+ private boolean createHardLinkToExistingFile(@NonNull File fromFile, @NonNull File toFile)
+ throws IOException {
+ if (!fromFile.exists()) {
+ return false;
+ }
+ Files.createLink(toFile.toPath(), fromFile.toPath());
+ return true;
+ }
+
+ private void handlePersistHistoricalOpsRecursiveDLocked(@NonNull File newBaseDir,
+ @NonNull File oldBaseDir, @Nullable List<HistoricalOps> passedOps, int depth)
+ throws IOException, XmlPullParserException {
+ final long previousIntervalEndMillis = (long) Math.pow(mIntervalCompressionMultiplier,
+ depth) * mBaseSnapshotInterval;
+ final long currentIntervalEndMillis = (long) Math.pow(mIntervalCompressionMultiplier,
+ depth + 1) * mBaseSnapshotInterval;
+
+ if (passedOps == null || passedOps.isEmpty()) {
+ // If there is an old file we need to copy it over to the new state.
+ final File oldFile = generateFile(oldBaseDir, depth);
+ final File newFile = generateFile(newBaseDir, depth);
+ if (createHardLinkToExistingFile(oldFile, newFile)) {
+ handlePersistHistoricalOpsRecursiveDLocked(newBaseDir, oldBaseDir,
+ passedOps, depth + 1);
+ }
+ return;
+ }
+
+ if (DEBUG) {
+ enforceOpsWellFormed(passedOps);
+ }
+
+ // Normalize passed ops time to be based off this interval start
+ final int passedOpCount = passedOps.size();
+ for (int i = 0; i < passedOpCount; i++) {
+ final HistoricalOps passedOp = passedOps.get(i);
+ passedOp.offsetBeginAndEndTime(-previousIntervalEndMillis);
+ }
+
+ if (DEBUG) {
+ enforceOpsWellFormed(passedOps);
+ }
+
+ // Read persisted ops for this interval
+ final List<HistoricalOps> existingOps = readHistoricalOpsLocked(oldBaseDir,
+ previousIntervalEndMillis, currentIntervalEndMillis,
+ Process.INVALID_UID /*filterUid*/, null /*filterPackageName*/,
+ null /*filterOpNames*/, Long.MIN_VALUE /*filterBeginTimeMillis*/,
+ Long.MAX_VALUE /*filterEndTimeMillis*/, null, depth,
+ null /*historyFiles*/);
+
+ if (DEBUG) {
+ enforceOpsWellFormed(existingOps);
+ }
+
+ // Offset existing ops to account for elapsed time
+ final int existingOpCount = existingOps.size();
+ if (existingOpCount > 0) {
+ // Compute elapsed time
+ final long elapsedTimeMillis = passedOps.get(passedOps.size() - 1)
+ .getEndTimeMillis();
+ for (int i = 0; i < existingOpCount; i++) {
+ final HistoricalOps existingOp = existingOps.get(i);
+ existingOp.offsetBeginAndEndTime(elapsedTimeMillis);
+ }
+ }
+
+ if (DEBUG) {
+ enforceOpsWellFormed(existingOps);
+ }
+
+ final long slotDurationMillis = previousIntervalEndMillis;
+
+ // Consolidate passed ops at the current slot duration ensuring each snapshot is
+ // full. To achieve this we put all passed and existing ops in a list and will
+ // merge them to ensure each represents a snapshot at the current granularity.
+ final List<HistoricalOps> allOps = new LinkedList<>();
+ allOps.addAll(passedOps);
+ allOps.addAll(existingOps);
+
+ if (DEBUG) {
+ enforceOpsWellFormed(allOps);
+ }
+
+ // Compute ops to persist and overflow ops
+ List<HistoricalOps> persistedOps = null;
+ List<HistoricalOps> overflowedOps = null;
+
+ // We move a snapshot into the next level only if the start time is
+ // after the end of the current interval. This avoids rewriting all
+ // files to propagate the information added to the history on every
+ // iteration. Instead, we would rewrite the next level file only if
+ // an entire snapshot from the previous level is being propagated.
+ // The trade off is that we need to store how much the last snapshot
+ // of the current interval overflows past the interval end. We write
+ // the overflow data to avoid parsing all snapshots on query.
+ long intervalOverflowMillis = 0;
+ final int opCount = allOps.size();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOps op = allOps.get(i);
+ final HistoricalOps persistedOp;
+ final HistoricalOps overflowedOp;
+ if (op.getEndTimeMillis() <= currentIntervalEndMillis) {
+ persistedOp = op;
+ overflowedOp = null;
+ } else if (op.getBeginTimeMillis() < currentIntervalEndMillis) {
+ persistedOp = op;
+ intervalOverflowMillis = op.getEndTimeMillis() - currentIntervalEndMillis;
+ if (intervalOverflowMillis > previousIntervalEndMillis) {
+ final double splitScale = (double) intervalOverflowMillis
+ / op.getDurationMillis();
+ overflowedOp = spliceFromEnd(op, splitScale);
+ intervalOverflowMillis = op.getEndTimeMillis() - currentIntervalEndMillis;
+ } else {
+ overflowedOp = null;
+ }
+ } else {
+ persistedOp = null;
+ overflowedOp = op;
+ }
+ if (persistedOp != null) {
+ if (persistedOps == null) {
+ persistedOps = new ArrayList<>();
+ }
+ persistedOps.add(persistedOp);
+ }
+ if (overflowedOp != null) {
+ if (overflowedOps == null) {
+ overflowedOps = new ArrayList<>();
+ }
+ overflowedOps.add(overflowedOp);
+ }
+ }
+
+ if (DEBUG) {
+ enforceOpsWellFormed(persistedOps);
+ enforceOpsWellFormed(overflowedOps);
+ }
+
+ if (persistedOps != null) {
+ normalizeSnapshotForSlotDuration(persistedOps, slotDurationMillis);
+ final File newFile = generateFile(newBaseDir, depth);
+ writeHistoricalOpsDLocked(persistedOps, intervalOverflowMillis, newFile);
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Persisted at depth: " + depth
+ + " ops:\n" + opsToDebugString(persistedOps));
+ enforceOpsWellFormed(persistedOps);
+ }
+ }
+
+ handlePersistHistoricalOpsRecursiveDLocked(newBaseDir, oldBaseDir,
+ overflowedOps, depth + 1);
+ }
+
+ private @NonNull List<HistoricalOps> readHistoricalOpsLocked(File baseDir,
+ long intervalBeginMillis, long intervalEndMillis, int filterUid,
+ @Nullable String filterPackageName, @Nullable String[] filterOpNames,
+ long filterBeginTimeMillis, long filterEndTimeMillis,
+ @Nullable long[] cumulativeOverflowMillis, int depth,
+ @NonNull ArraySet<File> historyFiles)
+ throws IOException, XmlPullParserException {
+ final File file = generateFile(baseDir, depth);
+ if (historyFiles != null) {
+ historyFiles.remove(file);
+ }
+ if (filterBeginTimeMillis >= filterEndTimeMillis
+ || filterEndTimeMillis < intervalBeginMillis) {
+ // Don't go deeper
+ return Collections.emptyList();
+ }
+ if (filterBeginTimeMillis >= (intervalEndMillis
+ + ((intervalEndMillis - intervalBeginMillis) / mIntervalCompressionMultiplier)
+ + (cumulativeOverflowMillis != null ? cumulativeOverflowMillis[0] : 0))
+ || !file.exists()) {
+ if (historyFiles == null || historyFiles.isEmpty()) {
+ // Don't go deeper
+ return Collections.emptyList();
+ } else {
+ // Keep diving
+ return null;
+ }
+ }
+ return readHistoricalOpsLocked(file, filterUid, filterPackageName, filterOpNames,
+ filterBeginTimeMillis, filterEndTimeMillis, cumulativeOverflowMillis);
+ }
+
+ private @Nullable List<HistoricalOps> readHistoricalOpsLocked(@NonNull File file,
+ int filterUid, @Nullable String filterPackageName, @Nullable String[] filterOpNames,
+ long filterBeginTimeMillis, long filterEndTimeMillis,
+ @Nullable long[] cumulativeOverflowMillis)
+ throws IOException, XmlPullParserException {
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Reading ops from:" + file);
+ }
+ List<HistoricalOps> allOps = null;
+ try (FileInputStream stream = new FileInputStream(file)) {
+ final XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(stream, StandardCharsets.UTF_8.name());
+ XmlUtils.beginDocument(parser, TAG_HISTORY);
+ final long overflowMillis = XmlUtils.readLongAttribute(parser, ATTR_OVERFLOW, 0);
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_OPS.equals(parser.getName())) {
+ final HistoricalOps ops = readeHistoricalOpsDLocked(parser,
+ filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
+ filterEndTimeMillis, cumulativeOverflowMillis);
+ if (ops == null) {
+ continue;
+ }
+ if (ops.isEmpty()) {
+ XmlUtils.skipCurrentTag(parser);
+ continue;
+ }
+ if (allOps == null) {
+ allOps = new ArrayList<>();
+ }
+ allOps.add(ops);
+ }
+ }
+ if (cumulativeOverflowMillis != null) {
+ cumulativeOverflowMillis[0] += overflowMillis;
+ }
+ } catch (FileNotFoundException e) {
+ Slog.i(LOG_TAG, "No history file: " + file.getName());
+ return Collections.emptyList();
+ }
+ if (DEBUG) {
+ if (allOps != null) {
+ Slog.i(LOG_TAG, "Read from file: " + file + "ops:\n"
+ + opsToDebugString(allOps));
+ enforceOpsWellFormed(allOps);
+ }
+ }
+ return allOps;
+ }
+
+ private @Nullable HistoricalOps readeHistoricalOpsDLocked(
+ @NonNull XmlPullParser parser, int filterUid, @Nullable String filterPackageName,
+ @Nullable String[] filterOpNames, long filterBeginTimeMillis,
+ long filterEndTimeMillis, @Nullable long[] cumulativeOverflowMillis)
+ throws IOException, XmlPullParserException {
+ final long beginTimeMillis = XmlUtils.readLongAttribute(parser, ATTR_BEGIN_TIME, 0)
+ + (cumulativeOverflowMillis != null ? cumulativeOverflowMillis[0] : 0);
+ final long endTimeMillis = XmlUtils.readLongAttribute(parser, ATTR_END_TIME, 0)
+ + (cumulativeOverflowMillis != null ? cumulativeOverflowMillis[0] : 0);
+ // Keep reading as subsequent records may start matching
+ if (filterEndTimeMillis < beginTimeMillis) {
+ return null;
+ }
+ // Stop reading as subsequent records will not match
+ if (filterBeginTimeMillis > endTimeMillis) {
+ return new HistoricalOps(0, 0);
+ }
+ final long filteredBeginTimeMillis = Math.max(beginTimeMillis, filterBeginTimeMillis);
+ final long filteredEndTimeMillis = Math.min(endTimeMillis, filterEndTimeMillis);
+ final double filterScale = (double) (filteredEndTimeMillis - filteredBeginTimeMillis)
+ / (double) (endTimeMillis - beginTimeMillis);
+ HistoricalOps ops = null;
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_UID.equals(parser.getName())) {
+ final HistoricalOps returnedOps = readHistoricalUidOpsDLocked(ops, parser,
+ filterUid, filterPackageName, filterOpNames, filterScale);
+ if (ops == null) {
+ ops = returnedOps;
+ }
+ }
+ }
+ if (ops != null) {
+ ops.setBeginAndEndTime(filteredBeginTimeMillis, filteredEndTimeMillis);
+ }
+ return ops;
+ }
+
+ private @Nullable HistoricalOps readHistoricalUidOpsDLocked(
+ @Nullable HistoricalOps ops, @NonNull XmlPullParser parser, int filterUid,
+ @Nullable String filterPackageName, @Nullable String[] filterOpNames,
+ double filterScale) throws IOException, XmlPullParserException {
+ final int uid = XmlUtils.readIntAttribute(parser, ATTR_NAME);
+ if (filterUid != Process.INVALID_UID && filterUid != uid) {
+ XmlUtils.skipCurrentTag(parser);
+ return null;
+ }
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_PACKAGE.equals(parser.getName())) {
+ final HistoricalOps returnedOps = readHistoricalPackageOpsDLocked(ops,
+ uid, parser, filterPackageName, filterOpNames, filterScale);
+ if (ops == null) {
+ ops = returnedOps;
+ }
+ }
+ }
+ return ops;
+ }
+
+ private @Nullable HistoricalOps readHistoricalPackageOpsDLocked(
+ @Nullable HistoricalOps ops, int uid, @NonNull XmlPullParser parser,
+ @Nullable String filterPackageName, @Nullable String[] filterOpNames,
+ double filterScale) throws IOException, XmlPullParserException {
+ final String packageName = XmlUtils.readStringAttribute(parser, ATTR_NAME);
+ if (filterPackageName != null && !filterPackageName.equals(packageName)) {
+ XmlUtils.skipCurrentTag(parser);
+ return null;
+ }
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_OP.equals(parser.getName())) {
+ final HistoricalOps returnedOps = readHistoricalOpDLocked(ops, uid,
+ packageName, parser, filterOpNames, filterScale);
+ if (ops == null) {
+ ops = returnedOps;
+ }
+ }
+ }
+ return ops;
+ }
+
+ private @Nullable HistoricalOps readHistoricalOpDLocked(@Nullable HistoricalOps ops,
+ int uid, String packageName, @NonNull XmlPullParser parser,
+ @Nullable String[] filterOpNames, double filterScale)
+ throws IOException, XmlPullParserException {
+ final int op = XmlUtils.readIntAttribute(parser, ATTR_NAME);
+ if (filterOpNames != null && !ArrayUtils.contains(filterOpNames,
+ AppOpsManager.opToName(op))) {
+ XmlUtils.skipCurrentTag(parser);
+ return null;
+ }
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (TAG_STATE.equals(parser.getName())) {
+ final HistoricalOps returnedOps = readUidStateDLocked(ops, uid,
+ packageName, op, parser, filterScale);
+ if (ops == null) {
+ ops = returnedOps;
+ }
+ }
+ }
+ return ops;
+ }
+
+ private @Nullable HistoricalOps readUidStateDLocked(@Nullable HistoricalOps ops,
+ int uid, String packageName, int op, @NonNull XmlPullParser parser,
+ double filterScale) throws IOException {
+ final int uidState = XmlUtils.readIntAttribute(parser, ATTR_NAME);
+ long accessCount = XmlUtils.readLongAttribute(parser, ATTR_ACCESS_COUNT, 0);
+ if (accessCount > 0) {
+ if (!Double.isNaN(filterScale)) {
+ accessCount = (long) HistoricalOps.round(
+ (double) accessCount * filterScale);
+ }
+ if (ops == null) {
+ ops = new HistoricalOps(0, 0);
+ }
+ ops.increaseAccessCount(op, uid, packageName, uidState, accessCount);
+ }
+ long rejectCount = XmlUtils.readLongAttribute(parser, ATTR_REJECT_COUNT, 0);
+ if (rejectCount > 0) {
+ if (!Double.isNaN(filterScale)) {
+ rejectCount = (long) HistoricalOps.round(
+ (double) rejectCount * filterScale);
+ }
+ if (ops == null) {
+ ops = new HistoricalOps(0, 0);
+ }
+ ops.increaseRejectCount(op, uid, packageName, uidState, rejectCount);
+ }
+ long accessDuration = XmlUtils.readLongAttribute(parser, ATTR_ACCESS_DURATION, 0);
+ if (accessDuration > 0) {
+ if (!Double.isNaN(filterScale)) {
+ accessDuration = (long) HistoricalOps.round(
+ (double) accessDuration * filterScale);
+ }
+ if (ops == null) {
+ ops = new HistoricalOps(0, 0);
+ }
+ ops.increaseAccessDuration(op, uid, packageName, uidState, accessDuration);
+ }
+ return ops;
+ }
+
+ private void writeHistoricalOpsDLocked(@Nullable List<HistoricalOps> allOps,
+ long intervalOverflowMillis, @NonNull File file) throws IOException {
+ final FileOutputStream output = mHistoricalAppOpsDir.openWrite(file);
+ try {
+ final XmlSerializer serializer = Xml.newSerializer();
+ serializer.setOutput(output, StandardCharsets.UTF_8.name());
+ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
+ true);
+ serializer.startDocument(null, true);
+ serializer.startTag(null, TAG_HISTORY);
+ serializer.attribute(null, ATTR_VERSION, String.valueOf(CURRENT_VERSION));
+ if (intervalOverflowMillis != 0) {
+ serializer.attribute(null, ATTR_OVERFLOW,
+ Long.toString(intervalOverflowMillis));
+ }
+ if (allOps != null) {
+ final int opsCount = allOps.size();
+ for (int i = 0; i < opsCount; i++) {
+ final HistoricalOps ops = allOps.get(i);
+ writeHistoricalOpDLocked(ops, serializer);
+ }
+ }
+ serializer.endTag(null, TAG_HISTORY);
+ serializer.endDocument();
+ mHistoricalAppOpsDir.closeWrite(output);
+ } catch (IOException e) {
+ mHistoricalAppOpsDir.failWrite(output);
+ throw e;
+ }
+ }
+
+ private void writeHistoricalOpDLocked(@NonNull HistoricalOps ops,
+ @NonNull XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_OPS);
+ serializer.attribute(null, ATTR_BEGIN_TIME, Long.toString(ops.getBeginTimeMillis()));
+ serializer.attribute(null, ATTR_END_TIME, Long.toString(ops.getEndTimeMillis()));
+ final int uidCount = ops.getUidCount();
+ for (int i = 0; i < uidCount; i++) {
+ final HistoricalUidOps uidOp = ops.getUidOpsAt(i);
+ writeHistoricalUidOpsDLocked(uidOp, serializer);
+ }
+ serializer.endTag(null, TAG_OPS);
+ }
+
+ private void writeHistoricalUidOpsDLocked(@NonNull HistoricalUidOps uidOps,
+ @NonNull XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_UID);
+ serializer.attribute(null, ATTR_NAME, Integer.toString(uidOps.getUid()));
+ final int packageCount = uidOps.getPackageCount();
+ for (int i = 0; i < packageCount; i++) {
+ final HistoricalPackageOps packageOps = uidOps.getPackageOpsAt(i);
+ writeHistoricalPackageOpsDLocked(packageOps, serializer);
+ }
+ serializer.endTag(null, TAG_UID);
+ }
+
+ private void writeHistoricalPackageOpsDLocked(@NonNull HistoricalPackageOps packageOps,
+ @NonNull XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_PACKAGE);
+ serializer.attribute(null, ATTR_NAME, packageOps.getPackageName());
+ final int opCount = packageOps.getOpCount();
+ for (int i = 0; i < opCount; i++) {
+ final HistoricalOp op = packageOps.getOpAt(i);
+ writeHistoricalOpDLocked(op, serializer);
+ }
+ serializer.endTag(null, TAG_PACKAGE);
+ }
+
+ private void writeHistoricalOpDLocked(@NonNull HistoricalOp op,
+ @NonNull XmlSerializer serializer) throws IOException {
+ serializer.startTag(null, TAG_OP);
+ serializer.attribute(null, ATTR_NAME, Integer.toString(op.getOpCode()));
+ for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
+ writeUidStateOnLocked(op, uidState, serializer);
+ }
+ serializer.endTag(null, TAG_OP);
+ }
+
+ private void writeUidStateOnLocked(@NonNull HistoricalOp op, @UidState int uidState,
+ @NonNull XmlSerializer serializer) throws IOException {
+ final long accessCount = op.getAccessCount(uidState);
+ final long rejectCount = op.getRejectCount(uidState);
+ final long accessDuration = op.getAccessDuration(uidState);
+ if (accessCount == 0 && rejectCount == 0 && accessDuration == 0) {
+ return;
+ }
+ serializer.startTag(null, TAG_STATE);
+ serializer.attribute(null, ATTR_NAME, Integer.toString(uidState));
+ if (accessCount > 0) {
+ serializer.attribute(null, ATTR_ACCESS_COUNT, Long.toString(accessCount));
+ }
+ if (rejectCount > 0) {
+ serializer.attribute(null, ATTR_REJECT_COUNT, Long.toString(rejectCount));
+ }
+ if (accessDuration > 0) {
+ serializer.attribute(null, ATTR_ACCESS_DURATION, Long.toString(accessDuration));
+ }
+ serializer.endTag(null, TAG_STATE);
+ }
+
+ private static void enforceOpsWellFormed(@NonNull List<HistoricalOps> ops) {
+ if (ops == null) {
+ return;
+ }
+ HistoricalOps previous;
+ HistoricalOps current = null;
+ final int opsCount = ops.size();
+ for (int i = 0; i < opsCount; i++) {
+ previous = current;
+ current = ops.get(i);
+ if (current.isEmpty()) {
+ throw new IllegalStateException("Empty ops:\n"
+ + opsToDebugString(ops));
+ }
+ if (current.getEndTimeMillis() < current.getBeginTimeMillis()) {
+ throw new IllegalStateException("Begin after end:\n"
+ + opsToDebugString(ops));
+ }
+ if (previous != null) {
+ if (previous.getEndTimeMillis() > current.getBeginTimeMillis()) {
+ throw new IllegalStateException("Intersecting ops:\n"
+ + opsToDebugString(ops));
+ }
+ if (previous.getBeginTimeMillis() > current.getBeginTimeMillis()) {
+ throw new IllegalStateException("Non increasing ops:\n"
+ + opsToDebugString(ops));
+ }
+ }
+ }
+ }
+
+ private long computeGlobalIntervalBeginMillis(int depth) {
+ long beginTimeMillis = 0;
+ for (int i = 0; i < depth + 1; i++) {
+ beginTimeMillis += Math.pow(mIntervalCompressionMultiplier, i);
+ }
+ return beginTimeMillis * mBaseSnapshotInterval;
+ }
+
+ private static @NonNull HistoricalOps spliceFromEnd(@NonNull HistoricalOps ops,
+ double spliceRatio) {
+ if (DEBUG) {
+ Slog.w(LOG_TAG, "Splicing from end:" + ops + " ratio:" + spliceRatio);
+ }
+ final HistoricalOps splice = ops.spliceFromEnd(spliceRatio);
+ if (DEBUG) {
+ Slog.w(LOG_TAG, "Spliced into:" + ops + " and:" + splice);
+ }
+ return splice;
+ }
+
+
+ private static @NonNull HistoricalOps spliceFromBeginning(@NonNull HistoricalOps ops,
+ double spliceRatio) {
+ if (DEBUG) {
+ Slog.w(LOG_TAG, "Splicing from beginning:" + ops + " ratio:" + spliceRatio);
+ }
+ final HistoricalOps splice = ops.spliceFromBeginning(spliceRatio);
+ if (DEBUG) {
+ Slog.w(LOG_TAG, "Spliced into:" + ops + " and:" + splice);
+ }
+ return splice;
+ }
+
+ private static void normalizeSnapshotForSlotDuration(@NonNull List<HistoricalOps> ops,
+ long slotDurationMillis) {
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Normalizing for slot duration: " + slotDurationMillis
+ + " ops:\n" + opsToDebugString(ops));
+ enforceOpsWellFormed(ops);
+ }
+ long slotBeginTimeMillis;
+ final int opCount = ops.size();
+ for (int processedIdx = opCount - 1; processedIdx >= 0; processedIdx--) {
+ final HistoricalOps processedOp = ops.get(processedIdx);
+ slotBeginTimeMillis = Math.max(processedOp.getEndTimeMillis()
+ - slotDurationMillis, 0);
+ for (int candidateIdx = processedIdx - 1; candidateIdx >= 0; candidateIdx--) {
+ final HistoricalOps candidateOp = ops.get(candidateIdx);
+ final long candidateSlotIntersectionMillis = candidateOp.getEndTimeMillis()
+ - Math.min(slotBeginTimeMillis, processedOp.getBeginTimeMillis());
+ if (candidateSlotIntersectionMillis <= 0) {
+ break;
+ }
+ final float candidateSplitRatio = candidateSlotIntersectionMillis
+ / (float) candidateOp.getDurationMillis();
+ if (Float.compare(candidateSplitRatio, 1.0f) >= 0) {
+ ops.remove(candidateIdx);
+ processedIdx--;
+ processedOp.merge(candidateOp);
+ } else {
+ final HistoricalOps endSplice = spliceFromEnd(candidateOp,
+ candidateSplitRatio);
+ if (endSplice != null) {
+ processedOp.merge(endSplice);
+ }
+ if (candidateOp.isEmpty()) {
+ ops.remove(candidateIdx);
+ processedIdx--;
+ }
+ }
+ }
+ }
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Normalized for slot duration: " + slotDurationMillis
+ + " ops:\n" + opsToDebugString(ops));
+ enforceOpsWellFormed(ops);
+ }
+ }
+
+ private static @NonNull String opsToDebugString(@NonNull List<HistoricalOps> ops) {
+ StringBuilder builder = new StringBuilder();
+ final int opCount = ops.size();
+ for (int i = 0; i < opCount; i++) {
+ builder.append(" ");
+ builder.append(ops.get(i));
+ if (i < opCount - 1) {
+ builder.append('\n');
+ }
+ }
+ return builder.toString();
+ }
+ }
+
+ private final class StringDumpVisitor implements AppOpsManager.HistoricalOpsVisitor {
+ private final long mNow = System.currentTimeMillis();
+
+ private final SimpleDateFormat mDateFormatter = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss.SSS");
+ private final Date mDate = new Date();
+
+ private final @NonNull String mOpsPrefix;
+ private final @NonNull String mUidPrefix;
+ private final @NonNull String mPackagePrefix;
+ private final @NonNull String mEntryPrefix;
+ private final @NonNull String mUidStatePrefix;
+ private final @NonNull PrintWriter mWriter;
+ private final int mFilterUid;
+ private final String mFilterPackage;
+ private final int mFilterOp;
+
+ StringDumpVisitor(@NonNull String prefix, @NonNull PrintWriter writer,
+ int filterUid, String filterPackage, int filterOp) {
+ mOpsPrefix = prefix + " ";
+ mUidPrefix = mOpsPrefix + " ";
+ mPackagePrefix = mUidPrefix + " ";
+ mEntryPrefix = mPackagePrefix + " ";
+ mUidStatePrefix = mEntryPrefix + " ";
+ mWriter = writer;
+ mFilterUid = filterUid;
+ mFilterPackage = filterPackage;
+ mFilterOp = filterOp;
+ }
+
+ @Override
+ public void visitHistoricalOps(HistoricalOps ops) {
+ mWriter.println();
+ mWriter.print(mOpsPrefix);
+ mWriter.println("snapshot:");
+ mWriter.print(mUidPrefix);
+ mWriter.print("begin = ");
+ mDate.setTime(ops.getBeginTimeMillis());
+ mWriter.print(mDateFormatter.format(mDate));
+ mWriter.print(" (");
+ TimeUtils.formatDuration(ops.getBeginTimeMillis() - mNow, mWriter);
+ mWriter.println(")");
+ mWriter.print(mUidPrefix);
+ mWriter.print("end = ");
+ mDate.setTime(ops.getEndTimeMillis());
+ mWriter.print(mDateFormatter.format(mDate));
+ mWriter.print(" (");
+ TimeUtils.formatDuration(ops.getEndTimeMillis() - mNow, mWriter);
+ mWriter.println(")");
+ }
+
+ @Override
+ public void visitHistoricalUidOps(HistoricalUidOps ops) {
+ if (mFilterUid != Process.INVALID_UID && mFilterUid != ops.getUid()) {
+ return;
+ }
+ mWriter.println();
+ mWriter.print(mUidPrefix);
+ mWriter.print("Uid ");
+ UserHandle.formatUid(mWriter, ops.getUid());
+ mWriter.println(":");
+ }
+
+ @Override
+ public void visitHistoricalPackageOps(HistoricalPackageOps ops) {
+ if (mFilterPackage != null && !mFilterPackage.equals(ops.getPackageName())) {
+ return;
+ }
+ mWriter.print(mPackagePrefix);
+ mWriter.print("Package ");
+ mWriter.print(ops.getPackageName());
+ mWriter.println(":");
+ }
+
+ @Override
+ public void visitHistoricalOp(HistoricalOp ops) {
+ if (mFilterOp != AppOpsManager.OP_NONE && mFilterOp != ops.getOpCode()) {
+ return;
+ }
+ mWriter.print(mEntryPrefix);
+ mWriter.print(AppOpsManager.opToName(ops.getOpCode()));
+ mWriter.println(":");
+ for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
+ boolean printedUidState = false;
+ final long accessCount = ops.getAccessCount(uidState);
+ if (accessCount > 0) {
+ if (!printedUidState) {
+ mWriter.print(mUidStatePrefix);
+ mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(" = ");
+ printedUidState = true;
+ }
+ mWriter.print("access=");
+ mWriter.print(accessCount);
+ }
+ final long rejectCount = ops.getRejectCount(uidState);
+ if (rejectCount > 0) {
+ if (!printedUidState) {
+ mWriter.print(mUidStatePrefix);
+ mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(" = ");
+ printedUidState = true;
+ } else {
+ mWriter.print(", ");
+ }
+ mWriter.print("reject=");
+ mWriter.print(rejectCount);
+ }
+ final long accessDuration = ops.getAccessDuration(uidState);
+ if (accessDuration > 0) {
+ if (!printedUidState) {
+ mWriter.print(mUidStatePrefix);
+ mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(" = ");
+ printedUidState = true;
+ } else {
+ mWriter.print(", ");
+ }
+ mWriter.print("duration=");
+ TimeUtils.formatDuration(accessDuration, mWriter);
+ }
+ if (printedUidState) {
+ mWriter.println("");
+ }
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java
new file mode 100644
index 000000000000..f60d6b06f451
--- /dev/null
+++ b/services/core/java/com/android/server/attention/AttentionManagerService.java
@@ -0,0 +1,548 @@
+/*
+ * Copyright (C) 2019 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.attention;
+
+import android.Manifest;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.attention.AttentionManagerInternal;
+import android.attention.AttentionManagerInternal.AttentionCallbackInternal;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.service.attention.AttentionService;
+import android.service.attention.AttentionService.AttentionFailureCodes;
+import android.service.attention.IAttentionCallback;
+import android.service.attention.IAttentionService;
+import android.text.TextUtils;
+import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.Preconditions;
+import com.android.server.SystemService;
+
+import java.io.PrintWriter;
+
+/**
+ * An attention service implementation that runs in System Server process.
+ * This service publishes a LocalService and reroutes calls to a {@link AttentionService} that it
+ * manages.
+ */
+public class AttentionManagerService extends SystemService {
+ private static final String LOG_TAG = "AttentionManagerService";
+
+ /** Service will unbind if connection is not used for that amount of time. */
+ private static final long CONNECTION_TTL_MILLIS = 60_000;
+
+ /** If the check attention called within that period - cached value will be returned. */
+ private static final long STALE_AFTER_MILLIS = 5_000;
+
+ private final Context mContext;
+ private final PowerManager mPowerManager;
+ private final ActivityManager mActivityManager;
+ private final Object mLock;
+ @GuardedBy("mLock")
+ private final SparseArray<UserState> mUserStates = new SparseArray<>();
+ private final AttentionHandler mAttentionHandler;
+
+ private ComponentName mComponentName;
+
+ public AttentionManagerService(Context context) {
+ super(context);
+ mContext = Preconditions.checkNotNull(context);
+ mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ mLock = new Object();
+ mAttentionHandler = new AttentionHandler();
+ }
+
+ @Override
+ public void onStart() {
+ publishLocalService(AttentionManagerInternal.class, new LocalService());
+ }
+
+ @Override
+ public void onStopUser(int userId) {
+ cancelAndUnbindLocked(peekUserStateLocked(userId),
+ AttentionService.ATTENTION_FAILURE_UNKNOWN);
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ super.onBootPhase(phase);
+ if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
+ mComponentName = resolveAttentionService(mContext);
+ if (mComponentName != null) {
+ // If the service is supported we want to keep receiving the screen off events.
+ mContext.registerReceiver(new ScreenStateReceiver(),
+ new IntentFilter(Intent.ACTION_SCREEN_OFF));
+ }
+ }
+ }
+
+ /**
+ * Returns {@code true} if attention service is supported on this device.
+ */
+ public boolean isAttentionServiceSupported() {
+ return mComponentName != null;
+ }
+
+ /**
+ * Checks whether user attention is at the screen and calls in the provided callback.
+ *
+ * @return {@code true} if the framework was able to send the provided callback to the service
+ */
+ public boolean checkAttention(int requestCode, long timeout,
+ AttentionCallbackInternal callback) {
+ Preconditions.checkNotNull(callback);
+
+ if (!isAttentionServiceSupported()) {
+ Slog.w(LOG_TAG, "Trying to call checkAttention() on an unsupported device.");
+ return false;
+ }
+
+ // don't allow attention check in screen off state
+ if (!mPowerManager.isInteractive()) {
+ return false;
+ }
+
+ synchronized (mLock) {
+ unbindAfterTimeoutLocked();
+
+ final UserState userState = getOrCreateCurrentUserStateLocked();
+ // lazily start the service, which should be very lightweight to start
+ if (!userState.bindLocked()) {
+ return false;
+ }
+
+ if (userState.mService == null) {
+ // make sure every callback is called back
+ if (userState.mPendingAttentionCheck != null) {
+ userState.mPendingAttentionCheck.cancel(
+ AttentionService.ATTENTION_FAILURE_UNKNOWN);
+ }
+ userState.mPendingAttentionCheck = new PendingAttentionCheck(requestCode,
+ callback, () -> checkAttention(requestCode, timeout, callback));
+ } else {
+ try {
+ // throttle frequent requests
+ final AttentionCheckCache attentionCheckCache = userState.mAttentionCheckCache;
+ if (attentionCheckCache != null && SystemClock.uptimeMillis()
+ < attentionCheckCache.mLastComputed + STALE_AFTER_MILLIS) {
+ callback.onSuccess(requestCode, attentionCheckCache.mResult,
+ attentionCheckCache.mTimestamp);
+ return true;
+ }
+
+ cancelAfterTimeoutLocked(timeout);
+
+ userState.mCurrentAttentionCheckRequestCode = requestCode;
+ userState.mService.checkAttention(requestCode, new IAttentionCallback.Stub() {
+ @Override
+ public void onSuccess(int requestCode, int result, long timestamp) {
+ callback.onSuccess(requestCode, result, timestamp);
+ userState.mAttentionCheckCache = new AttentionCheckCache(
+ SystemClock.uptimeMillis(), result,
+ timestamp);
+ }
+
+ @Override
+ public void onFailure(int requestCode, int error) {
+ callback.onFailure(requestCode, error);
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ });
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "Cannot call into the AttentionService");
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+
+ /** Cancels the specified attention check. */
+ public void cancelAttentionCheck(int requestCode) {
+ final UserState userState = getOrCreateCurrentUserStateLocked();
+ try {
+ userState.mService.cancelAttentionCheck(requestCode);
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "Cannot call into the AttentionService");
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void unbindAfterTimeoutLocked() {
+ mAttentionHandler.sendEmptyMessageDelayed(AttentionHandler.CONNECTION_EXPIRED,
+ CONNECTION_TTL_MILLIS);
+ }
+
+ @GuardedBy("mLock")
+ private void cancelAfterTimeoutLocked(long timeout) {
+ mAttentionHandler.sendEmptyMessageDelayed(AttentionHandler.ATTENTION_CHECK_TIMEOUT,
+ timeout);
+ }
+
+
+ @GuardedBy("mLock")
+ private UserState getOrCreateCurrentUserStateLocked() {
+ return getOrCreateUserStateLocked(mActivityManager.getCurrentUser());
+ }
+
+ @GuardedBy("mLock")
+ private UserState getOrCreateUserStateLocked(int userId) {
+ UserState result = mUserStates.get(userId);
+ if (result == null) {
+ result = new UserState(userId, mContext, mLock);
+ mUserStates.put(userId, result);
+ }
+ return result;
+ }
+
+ @GuardedBy("mLock")
+ UserState peekCurrentUserStateLocked() {
+ return peekUserStateLocked(mActivityManager.getCurrentUser());
+ }
+
+ @GuardedBy("mLock")
+ UserState peekUserStateLocked(int userId) {
+ return mUserStates.get(userId);
+ }
+
+ /**
+ * Provides attention service component name at runtime, making sure it's provided by the
+ * system.
+ */
+ private static ComponentName resolveAttentionService(Context context) {
+ // TODO(b/111939367): add a flag to turn on/off.
+ final String componentNameString = context.getString(
+ R.string.config_defaultAttentionService);
+
+ if (TextUtils.isEmpty(componentNameString)) {
+ return null;
+ }
+
+ final ComponentName componentName = ComponentName.unflattenFromString(componentNameString);
+ if (componentName == null) {
+ return null;
+ }
+
+ final Intent intent = new Intent(AttentionService.SERVICE_INTERFACE).setPackage(
+ componentName.getPackageName());
+
+ // Make sure that only system apps can declare the AttentionService.
+ final ResolveInfo resolveInfo = context.getPackageManager().resolveService(intent,
+ PackageManager.MATCH_SYSTEM_ONLY);
+ if (resolveInfo == null || resolveInfo.serviceInfo == null) {
+ Slog.wtf(LOG_TAG, String.format("Service %s not found in package %s",
+ AttentionService.SERVICE_INTERFACE, componentName
+ ));
+ return null;
+ }
+
+ final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+ final String permission = serviceInfo.permission;
+ if (Manifest.permission.BIND_ATTENTION_SERVICE.equals(permission)) {
+ return serviceInfo.getComponentName();
+ }
+ Slog.e(LOG_TAG, String.format(
+ "Service %s should require %s permission. Found %s permission",
+ serviceInfo.getComponentName(),
+ Manifest.permission.BIND_ATTENTION_SERVICE,
+ serviceInfo.permission));
+ return null;
+ }
+
+ private void dumpInternal(PrintWriter pw) {
+ if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return;
+ IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ ipw.println("Attention Manager Service (dumpsys attention)\n");
+
+ ipw.printPair("context", mContext);
+ pw.println();
+ synchronized (mLock) {
+ int size = mUserStates.size();
+ ipw.print("Number user states: ");
+ pw.println(size);
+ if (size > 0) {
+ ipw.increaseIndent();
+ for (int i = 0; i < size; i++) {
+ UserState userState = mUserStates.valueAt(i);
+ ipw.print(i);
+ ipw.print(":");
+ userState.dump(ipw);
+ ipw.println();
+ }
+ ipw.decreaseIndent();
+ }
+ }
+ }
+
+ private final class LocalService extends AttentionManagerInternal {
+ @Override
+ public boolean isAttentionServiceSupported() {
+ return AttentionManagerService.this.isAttentionServiceSupported();
+ }
+
+ @Override
+ public boolean checkAttention(int requestCode, long timeout,
+ AttentionCallbackInternal callback) {
+ return AttentionManagerService.this.checkAttention(requestCode, timeout, callback);
+ }
+
+ @Override
+ public void cancelAttentionCheck(int requestCode) {
+ AttentionManagerService.this.cancelAttentionCheck(requestCode);
+ }
+ }
+
+ private static final class AttentionCheckCache {
+ private final long mLastComputed;
+ private final int mResult;
+ private final long mTimestamp;
+
+ AttentionCheckCache(long lastComputed, @AttentionService.AttentionSuccessCodes int result,
+ long timestamp) {
+ mLastComputed = lastComputed;
+ mResult = result;
+ mTimestamp = timestamp;
+ }
+ }
+
+ private static final class PendingAttentionCheck {
+ private final int mRequestCode;
+ private final AttentionCallbackInternal mCallback;
+ private final Runnable mRunnable;
+
+ PendingAttentionCheck(int requestCode, AttentionCallbackInternal callback,
+ Runnable runnable) {
+ mRequestCode = requestCode;
+ mCallback = callback;
+ mRunnable = runnable;
+ }
+
+ void cancel(@AttentionFailureCodes int failureCode) {
+ mCallback.onFailure(mRequestCode, failureCode);
+ }
+
+ void run() {
+ mRunnable.run();
+ }
+ }
+
+ private static final class UserState {
+ final AttentionServiceConnection mConnection = new AttentionServiceConnection();
+
+ @GuardedBy("mLock")
+ IAttentionService mService;
+ @GuardedBy("mLock")
+ boolean mBinding;
+ @GuardedBy("mLock")
+ int mCurrentAttentionCheckRequestCode;
+ @GuardedBy("mLock")
+ PendingAttentionCheck mPendingAttentionCheck;
+
+ @GuardedBy("mLock")
+ AttentionCheckCache mAttentionCheckCache;
+
+ @UserIdInt
+ final int mUserId;
+ final Context mContext;
+ final Object mLock;
+
+ private UserState(int userId, Context context, Object lock) {
+ mUserId = userId;
+ mContext = Preconditions.checkNotNull(context);
+ mLock = Preconditions.checkNotNull(lock);
+ }
+
+
+ @GuardedBy("mLock")
+ private void handlePendingCallbackLocked() {
+ if (mService != null && mPendingAttentionCheck != null) {
+ mPendingAttentionCheck.run();
+ mPendingAttentionCheck = null;
+ }
+ }
+
+ /** Binds to the system's AttentionService which provides an actual implementation. */
+ @GuardedBy("mLock")
+ private boolean bindLocked() {
+ // No need to bind if service is binding or has already been bound.
+ if (mBinding || mService != null) {
+ return true;
+ }
+
+ final boolean willBind;
+ final long identity = Binder.clearCallingIdentity();
+
+ try {
+ final ComponentName componentName =
+ resolveAttentionService(mContext);
+ if (componentName == null) {
+ // Might happen if the storage is encrypted and the user is not unlocked
+ return false;
+ }
+ final Intent mServiceIntent = new Intent(
+ AttentionService.SERVICE_INTERFACE).setComponent(
+ componentName);
+ willBind = mContext.bindServiceAsUser(mServiceIntent, mConnection,
+ Context.BIND_AUTO_CREATE, UserHandle.CURRENT);
+ mBinding = willBind;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ return willBind;
+ }
+
+ private void dump(IndentingPrintWriter pw) {
+ pw.printPair("context", mContext);
+ pw.printPair("userId", mUserId);
+ synchronized (mLock) {
+ pw.printPair("binding", mBinding);
+ pw.printPair("isAttentionCheckPending", mPendingAttentionCheck != null);
+ }
+ }
+
+ private final class AttentionServiceConnection implements ServiceConnection {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ init(IAttentionService.Stub.asInterface(service));
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ cleanupService();
+ }
+
+ @Override
+ public void onBindingDied(ComponentName name) {
+ cleanupService();
+ }
+
+ @Override
+ public void onNullBinding(ComponentName name) {
+ cleanupService();
+ }
+
+ void cleanupService() {
+ init(null);
+ }
+
+ private void init(@Nullable IAttentionService service) {
+ synchronized (mLock) {
+ mService = service;
+ mBinding = false;
+ handlePendingCallbackLocked();
+ }
+ }
+ }
+ }
+
+ private class AttentionHandler extends Handler {
+ private static final int CONNECTION_EXPIRED = 1;
+ private static final int ATTENTION_CHECK_TIMEOUT = 2;
+
+ AttentionHandler() {
+ super(Looper.myLooper());
+ }
+
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ // Do not occupy resources when not in use - unbind proactively.
+ case CONNECTION_EXPIRED: {
+ for (int i = 0; i < mUserStates.size(); i++) {
+ cancelAndUnbindLocked(mUserStates.valueAt(i),
+ AttentionService.ATTENTION_FAILURE_UNKNOWN);
+ }
+
+ }
+ break;
+
+ // Callee is no longer interested in the attention check result - cancel.
+ case ATTENTION_CHECK_TIMEOUT: {
+ cancelAndUnbindLocked(peekCurrentUserStateLocked(),
+ AttentionService.ATTENTION_FAILURE_TIMED_OUT);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void cancelAndUnbindLocked(UserState userState,
+ @AttentionFailureCodes int failureCode) {
+ synchronized (mLock) {
+ if (userState != null && userState.mService != null) {
+ try {
+ userState.mService.cancelAttentionCheck(
+ userState.mCurrentAttentionCheckRequestCode);
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "Unable to cancel attention check");
+ }
+
+ if (userState.mPendingAttentionCheck != null) {
+ userState.mPendingAttentionCheck.cancel(failureCode);
+ }
+ mContext.unbindService(userState.mConnection);
+ userState.mConnection.cleanupService();
+ mUserStates.remove(userState.mUserId);
+ }
+ }
+ }
+
+ /**
+ * Unbinds and stops the service when the screen off intent is received.
+ * Attention service only makes sense when screen is ON; disconnect and stop service otherwise.
+ */
+ private final class ScreenStateReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
+ cancelAndUnbindLocked(peekCurrentUserStateLocked(),
+ AttentionService.ATTENTION_FAILURE_UNKNOWN);
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 4318f4b8c1cb..7e5f51c7b206 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -38,6 +38,8 @@ import android.app.NotificationManager;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothCodecConfig;
+import android.bluetooth.BluetoothCodecStatus;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothHearingAid;
@@ -268,6 +270,7 @@ public class AudioService extends IAudioService.Stub
private static final int MSG_DISABLE_AUDIO_FOR_UID = 104;
private static final int MSG_SET_HEARING_AID_CONNECTION_STATE = 105;
private static final int MSG_BTA2DP_DOCK_TIMEOUT = 106;
+ private static final int MSG_A2DP_ACTIVE_DEVICE_CHANGE = 107;
// end of messages handled under wakelock
private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000;
@@ -480,16 +483,20 @@ public class AudioService extends IAudioService.Stub
int mDeviceType;
String mDeviceName;
String mDeviceAddress;
+ int mDeviceCodecFormat;
- public DeviceListSpec(int deviceType, String deviceName, String deviceAddress) {
+ DeviceListSpec(int deviceType, String deviceName, String deviceAddress,
+ int deviceCodecFormat) {
mDeviceType = deviceType;
mDeviceName = deviceName;
mDeviceAddress = deviceAddress;
+ mDeviceCodecFormat = deviceCodecFormat;
}
public String toString() {
return "[type:0x" + Integer.toHexString(mDeviceType) + " name:" + mDeviceName
- + " address:" + mDeviceAddress + "]";
+ + " address:" + mDeviceAddress
+ + " codec: " + Integer.toHexString(mDeviceCodecFormat) + "]";
}
}
@@ -501,6 +508,52 @@ public class AudioService extends IAudioService.Stub
private final ArrayMap<String, DeviceListSpec> mConnectedDevices = new ArrayMap<>();
+ private class BluetoothA2dpDeviceInfo {
+ BluetoothDevice mBtDevice;
+ int mVolume;
+ int mCodec;
+
+ BluetoothA2dpDeviceInfo(BluetoothDevice btDevice) {
+ this(btDevice, -1, AudioSystem.AUDIO_FORMAT_DEFAULT);
+ }
+
+ BluetoothA2dpDeviceInfo(BluetoothDevice btDevice,
+ int volume, int codec) {
+ mBtDevice = btDevice;
+ mVolume = volume;
+ mCodec = codec;
+ }
+
+ public BluetoothDevice getBtDevice() {
+ return mBtDevice;
+ }
+
+ public int getVolume() {
+ return mVolume;
+ }
+
+ public int getCodec() {
+ return mCodec;
+ }
+ }
+
+ private int mapBluetoothCodecToAudioFormat(int btCodecType) {
+ switch (btCodecType) {
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC:
+ return AudioSystem.AUDIO_FORMAT_SBC;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC:
+ return AudioSystem.AUDIO_FORMAT_AAC;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX:
+ return AudioSystem.AUDIO_FORMAT_APTX;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD:
+ return AudioSystem.AUDIO_FORMAT_APTX_HD;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
+ return AudioSystem.AUDIO_FORMAT_LDAC;
+ default:
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ }
+
// Forced device usage for communications
private int mForcedUseForComm;
private int mForcedUseForCommExt; // External state returned by getters: always consistent
@@ -1021,7 +1074,8 @@ public class AudioService extends IAudioService.Stub
spec.mDeviceType,
AudioSystem.DEVICE_STATE_AVAILABLE,
spec.mDeviceAddress,
- spec.mDeviceName);
+ spec.mDeviceName,
+ spec.mDeviceCodecFormat);
}
}
// Restore call state
@@ -1615,7 +1669,9 @@ public class AudioService extends IAudioService.Stub
// For notifications/ring, show the ui before making any adjustments
// Don't suppress mute/unmute requests
- if (mVolumeController.suppressAdjustment(resolvedStream, flags, isMute)) {
+ // Don't suppress adjustments for single volume device
+ if (mVolumeController.suppressAdjustment(resolvedStream, flags, isMute)
+ && !mIsSingleVolume) {
direction = 0;
flags &= ~AudioManager.FLAG_PLAY_SOUND;
flags &= ~AudioManager.FLAG_VIBRATE;
@@ -4042,8 +4098,8 @@ public class AudioService extends IAudioService.Stub
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_A2DP_SINK_CONNECTION_STATE,
state,
- -1,
- btDevice,
+ 0 /* arg2 unused */,
+ new BluetoothA2dpDeviceInfo(btDevice),
delay);
}
}
@@ -4060,7 +4116,7 @@ public class AudioService extends IAudioService.Stub
MSG_SET_A2DP_SRC_CONNECTION_STATE,
state,
0 /* arg2 unused */,
- btDevice,
+ new BluetoothA2dpDeviceInfo(btDevice),
0 /* delay */);
}
}
@@ -4772,6 +4828,7 @@ public class AudioService extends IAudioService.Stub
msg == MSG_SET_HEARING_AID_CONNECTION_STATE ||
msg == MSG_SET_WIRED_DEVICE_CONNECTION_STATE ||
msg == MSG_A2DP_DEVICE_CONFIG_CHANGE ||
+ msg == MSG_A2DP_ACTIVE_DEVICE_CHANGE ||
msg == MSG_BTA2DP_DOCK_TIMEOUT) {
if (mLastDeviceConnectMsgTime >= time) {
// add a little delay to make sure messages are ordered as expected
@@ -4841,6 +4898,17 @@ public class AudioService extends IAudioService.Stub
}
}
+ private int getA2dpCodec(BluetoothDevice device) {
+ synchronized (mA2dpAvrcpLock) {
+ if (mA2dp != null) {
+ BluetoothCodecStatus btCodecStatus = mA2dp.getCodecStatus(device);
+ BluetoothCodecConfig btCodecConfig = btCodecStatus.getCodecConfig();
+ return mapBluetoothCodecToAudioFormat(btCodecConfig.getCodecType());
+ }
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ }
+
/*
* A class just for packaging up a set of connection parameters.
*/
@@ -4905,14 +4973,16 @@ public class AudioService extends IAudioService.Stub
return delay;
}
- public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
+ public int setBluetoothA2dpDeviceConnectionState(
+ BluetoothDevice device, int state, int profile)
{
return setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
- device, state, profile, false /* suppressNoisyIntent */, -1 /* a2dpVolume */);
+ device, state, profile, false /* suppressNoisyIntent */,
+ -1 /* a2dpVolume */);
}
public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(BluetoothDevice device,
- int state, int profile, boolean suppressNoisyIntent, int a2dpVolume)
+ int state, int profile, boolean suppressNoisyIntent, int a2dpVolume)
{
mDeviceLogger.log((new AudioEventLogger.StringEvent(
"setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent state=" + state
@@ -4925,7 +4995,8 @@ public class AudioService extends IAudioService.Stub
return 0;
}
return setBluetoothA2dpDeviceConnectionStateInt(
- device, state, profile, suppressNoisyIntent, AudioSystem.DEVICE_NONE, a2dpVolume);
+ device, state, profile, suppressNoisyIntent,
+ AudioSystem.DEVICE_NONE, a2dpVolume);
}
public int setBluetoothA2dpDeviceConnectionStateInt(
@@ -4945,18 +5016,20 @@ public class AudioService extends IAudioService.Stub
delay = 0;
}
+ int a2dpCodec = getA2dpCodec(device);
+
if (DEBUG_DEVICES) {
Log.d(TAG, "setBluetoothA2dpDeviceConnectionStateInt device: " + device
- + " state: " + state + " delay(ms): " + delay
- + " suppressNoisyIntent: " + suppressNoisyIntent);
+ + " state: " + state + " delay(ms): " + delay + "codec:" + a2dpCodec
+ + " suppressNoisyIntent: " + suppressNoisyIntent);
}
queueMsgUnderWakeLock(mAudioHandler,
(profile == BluetoothProfile.A2DP ?
MSG_SET_A2DP_SINK_CONNECTION_STATE : MSG_SET_A2DP_SRC_CONNECTION_STATE),
state,
- a2dpVolume,
- device,
+ 0, /* arg2 unused */
+ new BluetoothA2dpDeviceInfo(device, a2dpVolume, a2dpCodec),
delay);
}
return delay;
@@ -4965,15 +5038,71 @@ public class AudioService extends IAudioService.Stub
public void handleBluetoothA2dpDeviceConfigChange(BluetoothDevice device)
{
synchronized (mConnectedDevices) {
+ int a2dpCodec = getA2dpCodec(device);
queueMsgUnderWakeLock(mAudioHandler,
MSG_A2DP_DEVICE_CONFIG_CHANGE,
0 /* arg1 unused */,
- 0 /* arg1 unused */,
- device,
+ 0 /* arg2 unused */,
+ new BluetoothA2dpDeviceInfo(device, -1, a2dpCodec),
0 /* delay */);
}
}
+ /**
+ * @see AudioManager#handleBluetoothA2dpActiveDeviceChange(BluetoothDevice, int, int,
+ * boolean, int)
+ */
+ public int handleBluetoothA2dpActiveDeviceChange(
+ BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent,
+ int a2dpVolume) {
+ if (profile != BluetoothProfile.A2DP && profile != BluetoothProfile.A2DP_SINK) {
+ throw new IllegalArgumentException("invalid profile " + profile);
+ }
+
+ synchronized (mConnectedDevices) {
+ if (state == BluetoothA2dp.STATE_CONNECTED) {
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
+ if (deviceSpec.mDeviceType != AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
+ continue;
+ }
+ // If A2DP device exists, this is either an active device change or
+ // device config change
+ String existingDevicekey = mConnectedDevices.keyAt(i);
+ String deviceName = device.getName();
+ String address = device.getAddress();
+ String newDeviceKey = makeDeviceListKey(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
+ int a2dpCodec = getA2dpCodec(device);
+ // Device not equal to existing device, active device change
+ if (!TextUtils.equals(existingDevicekey, newDeviceKey)) {
+ mConnectedDevices.remove(existingDevicekey);
+ mConnectedDevices.put(newDeviceKey, new DeviceListSpec(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, deviceName,
+ address, a2dpCodec));
+ queueMsgUnderWakeLock(mAudioHandler,
+ MSG_A2DP_ACTIVE_DEVICE_CHANGE,
+ 0,
+ 0,
+ new BluetoothA2dpDeviceInfo(
+ device, a2dpVolume, a2dpCodec),
+ 0 /* delay */);
+ return 0;
+ } else {
+ // Device config change for existing device
+ handleBluetoothA2dpDeviceConfigChange(device);
+ return 0;
+ }
+ }
+ }
+ }
+
+ // New device connection or a device disconnect
+ return setBluetoothA2dpDeviceConnectionStateInt(
+ device, state, profile, suppressNoisyIntent,
+ AudioSystem.DEVICE_NONE, a2dpVolume);
+ }
+
private static final int DEVICE_MEDIA_UNMUTED_ON_PLUG =
AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
AudioSystem.DEVICE_OUT_LINE |
@@ -5851,7 +5980,7 @@ public class AudioService extends IAudioService.Stub
case MSG_BTA2DP_DOCK_TIMEOUT:
// msg.obj == address of BTA2DP device
synchronized (mConnectedDevices) {
- makeA2dpDeviceUnavailableNow( (String) msg.obj );
+ makeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1);
}
mAudioEventWakeLock.release();
break;
@@ -5877,12 +6006,12 @@ public class AudioService extends IAudioService.Stub
break;
case MSG_SET_A2DP_SRC_CONNECTION_STATE:
- onSetA2dpSourceConnectionState((BluetoothDevice)msg.obj, msg.arg1);
+ onSetA2dpSourceConnectionState((BluetoothA2dpDeviceInfo) msg.obj, msg.arg1);
mAudioEventWakeLock.release();
break;
case MSG_SET_A2DP_SINK_CONNECTION_STATE:
- onSetA2dpSinkConnectionState((BluetoothDevice)msg.obj, msg.arg1, msg.arg2);
+ onSetA2dpSinkConnectionState((BluetoothA2dpDeviceInfo) msg.obj, msg.arg1);
mAudioEventWakeLock.release();
break;
@@ -5892,7 +6021,12 @@ public class AudioService extends IAudioService.Stub
break;
case MSG_A2DP_DEVICE_CONFIG_CHANGE:
- onBluetoothA2dpDeviceConfigChange((BluetoothDevice)msg.obj);
+ onBluetoothA2dpDeviceConfigChange((BluetoothA2dpDeviceInfo) msg.obj);
+ mAudioEventWakeLock.release();
+ break;
+
+ case MSG_A2DP_ACTIVE_DEVICE_CHANGE:
+ onBluetoothA2dpActiveDeviceChange((BluetoothA2dpDeviceInfo) msg.obj);
mAudioEventWakeLock.release();
break;
@@ -6066,19 +6200,20 @@ public class AudioService extends IAudioService.Stub
}
// must be called synchronized on mConnectedDevices
- private void makeA2dpDeviceAvailable(String address, String name, String eventSource) {
+ private void makeA2dpDeviceAvailable(
+ String address, String name, String eventSource, int a2dpCodec) {
// enable A2DP before notifying A2DP connection to avoid unnecessary processing in
// audio policy manager
VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC];
setBluetoothA2dpOnInt(true, eventSource);
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- AudioSystem.DEVICE_STATE_AVAILABLE, address, name);
+ AudioSystem.DEVICE_STATE_AVAILABLE, address, name, a2dpCodec);
// Reset A2DP suspend state each time a new sink is connected
AudioSystem.setParameters("A2dpSuspended=false");
mConnectedDevices.put(
makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address),
new DeviceListSpec(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, name,
- address));
+ address, a2dpCodec));
sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, null, 0);
setCurrentAudioRouteNameIfPossible(name);
@@ -6091,7 +6226,7 @@ public class AudioService extends IAudioService.Stub
}
// must be called synchronized on mConnectedDevices
- private void makeA2dpDeviceUnavailableNow(String address) {
+ private void makeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {
if (address == null) {
return;
}
@@ -6099,7 +6234,7 @@ public class AudioService extends IAudioService.Stub
mAvrcpAbsVolSupported = false;
}
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "");
+ AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "", a2dpCodec);
mConnectedDevices.remove(
makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address));
// Remove A2DP routes as well
@@ -6114,32 +6249,38 @@ public class AudioService extends IAudioService.Stub
// prevent any activity on the A2DP audio output to avoid unwanted
// reconnection of the sink.
AudioSystem.setParameters("A2dpSuspended=true");
+ // Retrieve deviceSpec before removing device
+ String deviceKey = makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
+ DeviceListSpec deviceSpec = mConnectedDevices.get(deviceKey);
+ int a2dpCodec = deviceSpec != null ? deviceSpec.mDeviceCodecFormat :
+ AudioSystem.AUDIO_FORMAT_DEFAULT;
// the device will be made unavailable later, so consider it disconnected right away
- mConnectedDevices.remove(
- makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address));
+ mConnectedDevices.remove(deviceKey);
// send the delayed message to make the device unavailable later
queueMsgUnderWakeLock(mAudioHandler,
- MSG_BTA2DP_DOCK_TIMEOUT,
- 0,
- 0,
- address,
- delayMs);
+ MSG_BTA2DP_DOCK_TIMEOUT,
+ a2dpCodec,
+ 0,
+ address,
+ delayMs);
}
// must be called synchronized on mConnectedDevices
private void makeA2dpSrcAvailable(String address) {
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP,
- AudioSystem.DEVICE_STATE_AVAILABLE, address, "");
+ AudioSystem.DEVICE_STATE_AVAILABLE, address, "",
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
mConnectedDevices.put(
makeDeviceListKey(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address),
new DeviceListSpec(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, "",
- address));
+ address, AudioSystem.AUDIO_FORMAT_DEFAULT));
}
// must be called synchronized on mConnectedDevices
private void makeA2dpSrcUnavailable(String address) {
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP,
- AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "");
+ AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "",
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
mConnectedDevices.remove(
makeDeviceListKey(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address));
}
@@ -6163,11 +6304,12 @@ public class AudioService extends IAudioService.Stub
setHearingAidVolume(index, AudioSystem.STREAM_MUSIC);
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_HEARING_AID,
- AudioSystem.DEVICE_STATE_AVAILABLE, address, name);
+ AudioSystem.DEVICE_STATE_AVAILABLE, address, name,
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
mConnectedDevices.put(
makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID, address),
new DeviceListSpec(AudioSystem.DEVICE_OUT_HEARING_AID, name,
- address));
+ address, AudioSystem.AUDIO_FORMAT_DEFAULT));
sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
AudioSystem.DEVICE_OUT_HEARING_AID, 0, null, 0);
sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE,
@@ -6179,7 +6321,8 @@ public class AudioService extends IAudioService.Stub
// must be called synchronized on mConnectedDevices
private void makeHearingAidDeviceUnavailable(String address) {
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_HEARING_AID,
- AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "");
+ AudioSystem.DEVICE_STATE_UNAVAILABLE, address, "",
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
mConnectedDevices.remove(
makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID, address));
// Remove Hearing Aid routes as well
@@ -6196,15 +6339,23 @@ public class AudioService extends IAudioService.Stub
return mAudioHandler.hasMessages(MSG_BTA2DP_DOCK_TIMEOUT);
}
- private void onSetA2dpSinkConnectionState(BluetoothDevice btDevice, int state, int a2dpVolume)
+ private void onSetA2dpSinkConnectionState(BluetoothA2dpDeviceInfo btInfo, int state)
{
- if (DEBUG_DEVICES) {
- Log.d(TAG, "onSetA2dpSinkConnectionState btDevice= " + btDevice+" state= " + state
- + " is dock: "+btDevice.isBluetoothDock());
+ if (btInfo == null) {
+ return;
}
+
+ BluetoothDevice btDevice = btInfo.getBtDevice();
+ int a2dpVolume = btInfo.getVolume();
+ int a2dpCodec = btInfo.getCodec();
+
if (btDevice == null) {
return;
}
+ if (DEBUG_DEVICES) {
+ Log.d(TAG, "onSetA2dpSinkConnectionState btDevice= " + btDevice + " state= " + state
+ + " is dock: " + btDevice.isBluetoothDock());
+ }
String address = btDevice.getAddress();
if (!BluetoothAdapter.checkBluetoothAddress(address)) {
address = "";
@@ -6226,7 +6377,7 @@ public class AudioService extends IAudioService.Stub
// the next time isConnected is evaluated, it will be false for the dock
}
} else {
- makeA2dpDeviceUnavailableNow(address);
+ makeA2dpDeviceUnavailableNow(address, deviceSpec.mDeviceCodecFormat);
}
} else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
if (btDevice.isBluetoothDock()) {
@@ -6238,7 +6389,8 @@ public class AudioService extends IAudioService.Stub
// a dock: cancel the dock timeout, and make the dock unavailable now
if (hasScheduledA2dpDockTimeout() && mDockAddress != null) {
cancelA2dpDeviceTimeout();
- makeA2dpDeviceUnavailableNow(mDockAddress);
+ makeA2dpDeviceUnavailableNow(mDockAddress,
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
}
}
if (a2dpVolume != -1) {
@@ -6250,13 +6402,18 @@ public class AudioService extends IAudioService.Stub
setDeviceVolume(streamState, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
}
makeA2dpDeviceAvailable(address, btDevice.getName(),
- "onSetA2dpSinkConnectionState");
+ "onSetA2dpSinkConnectionState", a2dpCodec);
}
}
}
- private void onSetA2dpSourceConnectionState(BluetoothDevice btDevice, int state)
+ private void onSetA2dpSourceConnectionState(BluetoothA2dpDeviceInfo btInfo, int state)
{
+ if (btInfo == null) {
+ return;
+ }
+ BluetoothDevice btDevice = btInfo.getBtDevice();
+
if (DEBUG_VOL) {
Log.d(TAG, "onSetA2dpSourceConnectionState btDevice=" + btDevice + " state=" + state);
}
@@ -6331,20 +6488,82 @@ public class AudioService extends IAudioService.Stub
return false;
}
- private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice)
+ private void onBluetoothA2dpDeviceConfigChange(BluetoothA2dpDeviceInfo btInfo)
{
+ if (btInfo == null) {
+ return;
+ }
+ BluetoothDevice btDevice = btInfo.getBtDevice();
+ int a2dpCodec = btInfo.getCodec();
+
+ if (btDevice == null) {
+ return;
+ }
if (DEBUG_DEVICES) {
Log.d(TAG, "onBluetoothA2dpDeviceConfigChange btDevice=" + btDevice);
}
+ String address = btDevice.getAddress();
+ if (!BluetoothAdapter.checkBluetoothAddress(address)) {
+ address = "";
+ }
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "onBluetoothA2dpDeviceConfigChange addr=" + address));
+
+ int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
+ synchronized (mConnectedDevices) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, btDevice)) {
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "A2dp config change ignored"));
+ return;
+ }
+ final String key = makeDeviceListKey(device, address);
+ final DeviceListSpec deviceSpec = mConnectedDevices.get(key);
+ if (deviceSpec == null) {
+ return;
+ }
+ // Device is connected
+ if (deviceSpec.mDeviceCodecFormat != a2dpCodec) {
+ deviceSpec.mDeviceCodecFormat = a2dpCodec;
+ mConnectedDevices.replace(key, deviceSpec);
+ }
+ if (DEBUG_DEVICES) {
+ Log.d(TAG, "onBluetoothA2dpDeviceConfigChange: codec="
+ + deviceSpec.mDeviceCodecFormat);
+ }
+ if (AudioSystem.handleDeviceConfigChange(device, address,
+ btDevice.getName(), deviceSpec.mDeviceCodecFormat)
+ != AudioSystem.AUDIO_STATUS_OK) {
+ int musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
+ // force A2DP device disconnection in case of error so that AudioService state is
+ // consistent with audio policy manager state
+ setBluetoothA2dpDeviceConnectionStateInt(
+ btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP,
+ false /* suppressNoisyIntent */, musicDevice, -1 /* a2dpVolume */);
+ }
+ }
+ }
+
+ /** message handler for MSG_A2DP_ACTIVE_DEVICE_CHANGE */
+ public void onBluetoothA2dpActiveDeviceChange(BluetoothA2dpDeviceInfo btInfo) {
+ if (btInfo == null) {
+ return;
+ }
+ BluetoothDevice btDevice = btInfo.getBtDevice();
+ int a2dpVolume = btInfo.getVolume();
+ int a2dpCodec = btInfo.getCodec();
+
if (btDevice == null) {
return;
}
+ if (DEBUG_DEVICES) {
+ Log.d(TAG, "onBluetoothA2dpActiveDeviceChange btDevice=" + btDevice);
+ }
String address = btDevice.getAddress();
if (!BluetoothAdapter.checkBluetoothAddress(address)) {
address = "";
}
mDeviceLogger.log(new AudioEventLogger.StringEvent(
- "onBluetoothA2dpDeviceConfigChange addr=" + address));
+ "onBluetoothA2dpActiveDeviceChange addr=" + address));
int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
synchronized (mConnectedDevices) {
@@ -6355,17 +6574,28 @@ public class AudioService extends IAudioService.Stub
}
final String key = makeDeviceListKey(device, address);
final DeviceListSpec deviceSpec = mConnectedDevices.get(key);
- if (deviceSpec != null) {
- // Device is connected
- int musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
- if (AudioSystem.handleDeviceConfigChange(device, address,
- btDevice.getName()) != AudioSystem.AUDIO_STATUS_OK) {
- // force A2DP device disconnection in case of error so that AudioService state is
- // consistent with audio policy manager state
- setBluetoothA2dpDeviceConnectionStateInt(
- btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP,
- false /* suppressNoisyIntent */, musicDevice, -1 /* a2dpVolume */);
- }
+ if (deviceSpec == null) {
+ return;
+ }
+
+ // Device is connected
+ if (a2dpVolume != -1) {
+ VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC];
+ // Convert index to internal representation in VolumeStreamState
+ a2dpVolume = a2dpVolume * 10;
+ streamState.setIndex(a2dpVolume, device,
+ "onBluetoothA2dpActiveDeviceChange");
+ setDeviceVolume(streamState, device);
+ }
+
+ if (AudioSystem.handleDeviceConfigChange(device, address,
+ btDevice.getName(), a2dpCodec) != AudioSystem.AUDIO_STATUS_OK) {
+ int musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
+ // force A2DP device disconnection in case of error so that AudioService state is
+ // consistent with audio policy manager state
+ setBluetoothA2dpDeviceConnectionStateInt(
+ btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP,
+ false /* suppressNoisyIntent */, musicDevice, -1 /* a2dpVolume */);
}
}
}
@@ -6398,19 +6628,22 @@ public class AudioService extends IAudioService.Stub
}
if (connect && !isConnected) {
final int res = AudioSystem.setDeviceConnectionState(device,
- AudioSystem.DEVICE_STATE_AVAILABLE, address, deviceName);
+ AudioSystem.DEVICE_STATE_AVAILABLE, address, deviceName,
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
if (res != AudioSystem.AUDIO_STATUS_OK) {
Slog.e(TAG, "not connecting device 0x" + Integer.toHexString(device) +
" due to command error " + res );
return false;
}
- mConnectedDevices.put(deviceKey, new DeviceListSpec(device, deviceName, address));
+ mConnectedDevices.put(deviceKey, new DeviceListSpec(device,
+ deviceName, address, AudioSystem.AUDIO_FORMAT_DEFAULT));
sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
device, 0, null, 0);
return true;
} else if (!connect && isConnected) {
AudioSystem.setDeviceConnectionState(device,
- AudioSystem.DEVICE_STATE_UNAVAILABLE, address, deviceName);
+ AudioSystem.DEVICE_STATE_UNAVAILABLE, address, deviceName,
+ AudioSystem.AUDIO_FORMAT_DEFAULT);
// always remove even if disconnection failed
mConnectedDevices.remove(deviceKey);
return true;
@@ -8062,8 +8295,10 @@ public class AudioService extends IAudioService.Stub
/** see AudioPolicy.setUidDeviceAffinity() */
public int setUidDeviceAffinity(IAudioPolicyCallback pcb, int uid,
- @NonNull int[] deviceTypes,
- @NonNull String[] deviceAddresses) {
+ @NonNull int[] deviceTypes, @NonNull String[] deviceAddresses) {
+ if (DEBUG_AP) {
+ Log.d(TAG, "setUidDeviceAffinity for " + pcb.asBinder() + " uid:" + uid);
+ }
synchronized (mAudioPolicies) {
final AudioPolicyProxy app =
checkUpdateForPolicy(pcb, "Cannot change device affinity in audio policy");
@@ -8073,21 +8308,23 @@ public class AudioService extends IAudioService.Stub
if (!app.hasMixRoutedToDevices(deviceTypes, deviceAddresses)) {
return AudioManager.ERROR;
}
+ return app.setUidDeviceAffinities(uid, deviceTypes, deviceAddresses);
}
- return AudioManager.SUCCESS;
}
/** see AudioPolicy.removeUidDeviceAffinity() */
public int removeUidDeviceAffinity(IAudioPolicyCallback pcb, int uid) {
+ if (DEBUG_AP) {
+ Log.d(TAG, "removeUidDeviceAffinity for " + pcb.asBinder() + " uid:" + uid);
+ }
synchronized (mAudioPolicies) {
final AudioPolicyProxy app =
checkUpdateForPolicy(pcb, "Cannot remove device affinity in audio policy");
if (app == null) {
return AudioManager.ERROR;
}
-
+ return app.removeUidDeviceAffinities(uid);
}
- return AudioManager.SUCCESS;
}
public int setFocusPropertiesForPolicy(int duckingBehavior, IAudioPolicyCallback pcb) {
@@ -8398,27 +8635,41 @@ public class AudioService extends IAudioService.Stub
Binder.restoreCallingIdentity(identity);
}
- void setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) {
+ int setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) {
final Integer Uid = new Integer(uid);
+ int res;
if (mUidDeviceAffinities.remove(Uid) != null) {
final long identity = Binder.clearCallingIdentity();
- AudioSystem.removeUidDeviceAffinities(uid);
+ res = AudioSystem.removeUidDeviceAffinities(uid);
Binder.restoreCallingIdentity(identity);
+ if (res != AudioSystem.SUCCESS) {
+ Log.e(TAG, "AudioSystem. removeUidDeviceAffinities(" + uid + ") failed, "
+ + " cannot call AudioSystem.setUidDeviceAffinities");
+ return AudioManager.ERROR;
+ }
}
final long identity = Binder.clearCallingIdentity();
- final int res = AudioSystem.setUidDeviceAffinities(uid, types, addresses);
+ res = AudioSystem.setUidDeviceAffinities(uid, types, addresses);
Binder.restoreCallingIdentity(identity);
if (res == AudioSystem.SUCCESS) {
mUidDeviceAffinities.put(Uid, new AudioDeviceArray(types, addresses));
+ return AudioManager.SUCCESS;
}
+ Log.e(TAG, "AudioSystem. setUidDeviceAffinities(" + uid + ") failed");
+ return AudioManager.ERROR;
}
- void removeUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) {
+ int removeUidDeviceAffinities(int uid) {
if (mUidDeviceAffinities.remove(new Integer(uid)) != null) {
final long identity = Binder.clearCallingIdentity();
- AudioSystem.removeUidDeviceAffinities(uid);
+ final int res = AudioSystem.removeUidDeviceAffinities(uid);
Binder.restoreCallingIdentity(identity);
+ if (res == AudioSystem.SUCCESS) {
+ return AudioManager.SUCCESS;
+ }
}
+ Log.e(TAG, "AudioSystem. removeUidDeviceAffinities failed");
+ return AudioManager.ERROR;
}
};
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 905f82693980..9d6628cf0c40 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -206,7 +206,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
switch (event) {
case AudioManager.RECORD_CONFIG_EVENT_STOP:
// return failure if an unknown recording session stopped
- configChanged = (mRecordConfigs.remove(new Integer(session)) != null);
+ configChanged = (mRecordConfigs.remove(new Integer(portId)) != null);
if (configChanged) {
sEventLogger.log(new RecordingEvent(event, uid, session, source, null));
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 36ca4dcbea33..41fedc5fab45 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -132,10 +132,13 @@ public class BiometricService extends SystemService {
Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED);
private final Uri FACE_UNLOCK_APP_ENABLED =
Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_APP_ENABLED);
+ private final Uri FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION =
+ Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION);
private final ContentResolver mContentResolver;
private boolean mFaceEnabledOnKeyguard;
private boolean mFaceEnabledForApps;
+ private boolean mFaceAlwaysRequireConfirmation;
/**
* Creates a content observer.
@@ -158,10 +161,15 @@ public class BiometricService extends SystemService {
false /* notifyForDescendents */,
this /* observer */,
UserHandle.USER_CURRENT);
+ mContentResolver.registerContentObserver(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
+ false /* notifyForDescendents */,
+ this /* observer */,
+ UserHandle.USER_CURRENT);
// Update the value immediately
onChange(true /* selfChange */, FACE_UNLOCK_KEYGUARD_ENABLED);
onChange(true /* selfChange */, FACE_UNLOCK_APP_ENABLED);
+ onChange(true /* selfChange */, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION);
}
@Override
@@ -185,6 +193,13 @@ public class BiometricService extends SystemService {
Settings.Secure.FACE_UNLOCK_APP_ENABLED,
1 /* default */,
UserHandle.USER_CURRENT) != 0;
+ } else if (FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION.equals(uri)) {
+ mFaceAlwaysRequireConfirmation =
+ Settings.Secure.getIntForUser(
+ mContentResolver,
+ Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
+ 0 /* default */,
+ UserHandle.USER_CURRENT) != 0;
}
}
@@ -195,6 +210,10 @@ public class BiometricService extends SystemService {
boolean getFaceEnabledForApps() {
return mFaceEnabledForApps;
}
+
+ boolean getFaceAlwaysRequireConfirmation() {
+ return mFaceAlwaysRequireConfirmation;
+ }
}
private final class EnabledOnKeyguardCallback implements IBinder.DeathRecipient {
@@ -332,10 +351,7 @@ public class BiometricService extends SystemService {
if (!runningTasks.isEmpty()) {
final String topPackage = runningTasks.get(0).topActivity.getPackageName();
if (mCurrentAuthSession != null
- && !topPackage.contentEquals(mCurrentAuthSession.mOpPackageName)
- && mCurrentAuthSession.mState != STATE_AUTH_STARTED) {
- // We only care about this state, since <Biometric>Service will
- // cancel any client that's still in STATE_AUTH_STARTED
+ && !topPackage.contentEquals(mCurrentAuthSession.mOpPackageName)) {
mStatusBarService.hideBiometricDialog();
mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
mCurrentAuthSession.mClientReceiver.onError(
@@ -395,7 +411,7 @@ public class BiometricService extends SystemService {
// Notify SysUI that the biometric has been authenticated. SysUI already knows
// the implicit/explicit state and will react accordingly.
- mStatusBarService.onBiometricAuthenticated();
+ mStatusBarService.onBiometricAuthenticated(true);
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
}
@@ -412,17 +428,20 @@ public class BiometricService extends SystemService {
return;
}
- mStatusBarService.onBiometricHelp(getContext().getResources().getString(
- com.android.internal.R.string.biometric_not_recognized));
- if (requireConfirmation) {
+ mStatusBarService.onBiometricAuthenticated(false);
+
+ // TODO: This logic will need to be updated if BP is multi-modal
+ if ((mCurrentAuthSession.mModality & TYPE_FACE) != 0) {
+ // Pause authentication. onBiometricAuthenticated(false) causes the
+ // dialog to show a "try again" button for passive modalities.
mCurrentAuthSession.mState = STATE_AUTH_PAUSED;
- mStatusBarService.showBiometricTryAgain();
// Cancel authentication. Skip the token/package check since we are
// cancelling from system server. The interface is permission protected so
// this is fine.
cancelInternal(null /* token */, null /* package */,
false /* fromClient */);
}
+
mCurrentAuthSession.mClientReceiver.onAuthenticationFailed();
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
@@ -442,8 +461,9 @@ public class BiometricService extends SystemService {
if (mCurrentAuthSession != null && mCurrentAuthSession.containsCookie(cookie)) {
if (mCurrentAuthSession.mState == STATE_AUTH_STARTED) {
mStatusBarService.onBiometricError(message);
- mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
if (error == BiometricConstants.BIOMETRIC_ERROR_CANCELED) {
+ mActivityTaskManager.unregisterTaskStackListener(
+ mTaskStackListener);
mCurrentAuthSession.mClientReceiver.onError(error, message);
mCurrentAuthSession.mState = STATE_AUTH_IDLE;
mCurrentAuthSession = null;
@@ -452,9 +472,14 @@ public class BiometricService extends SystemService {
// Send errors after the dialog is dismissed.
mHandler.postDelayed(() -> {
try {
- mCurrentAuthSession.mClientReceiver.onError(error, message);
- mCurrentAuthSession.mState = STATE_AUTH_IDLE;
- mCurrentAuthSession = null;
+ if (mCurrentAuthSession != null) {
+ mActivityTaskManager.unregisterTaskStackListener(
+ mTaskStackListener);
+ mCurrentAuthSession.mClientReceiver.onError(error,
+ message);
+ mCurrentAuthSession.mState = STATE_AUTH_IDLE;
+ mCurrentAuthSession = null;
+ }
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
}
@@ -518,6 +543,11 @@ public class BiometricService extends SystemService {
@Override
public void onDialogDismissed(int reason) throws RemoteException {
+ if (mCurrentAuthSession == null) {
+ Slog.e(TAG, "onDialogDismissed: " + reason + ", auth session null");
+ return;
+ }
+
if (reason != BiometricPrompt.DISMISSED_REASON_POSITIVE) {
// Positive button is used by passive modalities as a "confirm" button,
// do not send to client
@@ -579,8 +609,10 @@ public class BiometricService extends SystemService {
}
if (mPendingAuthSession.mModalitiesWaiting.isEmpty()) {
- final boolean mContinuing = mCurrentAuthSession != null
- && mCurrentAuthSession.mState == STATE_AUTH_PAUSED;
+ final boolean continuing = mCurrentAuthSession != null &&
+ (mCurrentAuthSession.mState == STATE_AUTH_PAUSED
+ || mCurrentAuthSession.mState == STATE_AUTH_PAUSED_CANCELED);
+
mCurrentAuthSession = mPendingAuthSession;
mPendingAuthSession = null;
@@ -602,7 +634,7 @@ public class BiometricService extends SystemService {
modality |= pair.getKey();
}
- if (!mContinuing) {
+ if (!continuing) {
mStatusBarService.showBiometricDialog(mCurrentAuthSession.mBundle,
mInternalReceiver, modality, requireConfirmation, userId);
mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
@@ -706,7 +738,8 @@ public class BiometricService extends SystemService {
mCurrentModality = modality;
- // Actually start authentication
+ // Start preparing for authentication. Authentication starts when
+ // all modalities requested have invoked onReadyForAuthentication.
authenticateInternal(token, sessionId, userId, receiver, opPackageName, bundle,
callingUid, callingPid, callingUserId, modality);
});
@@ -725,6 +758,9 @@ public class BiometricService extends SystemService {
IBiometricServiceReceiver receiver, String opPackageName, Bundle bundle,
int callingUid, int callingPid, int callingUserId, int modality) {
try {
+ boolean requireConfirmation = bundle.getBoolean(
+ BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true /* default */);
+
// Generate random cookies to pass to the services that should prepare to start
// authenticating. Store the cookie here and wait for all services to "ack"
// with the cookie. Once all cookies are received, we can show the prompt
@@ -748,7 +784,10 @@ public class BiometricService extends SystemService {
Slog.w(TAG, "Iris unsupported");
}
if ((modality & TYPE_FACE) != 0) {
- mFaceService.prepareForAuthentication(true /* requireConfirmation */,
+ // Check if the user has forced confirmation to be required in Settings.
+ requireConfirmation = requireConfirmation
+ || mSettingObserver.getFaceAlwaysRequireConfirmation();
+ mFaceService.prepareForAuthentication(requireConfirmation,
token, sessionId, userId, mInternalReceiver, opPackageName,
cookie, callingUid, callingPid, callingUserId);
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 32219aa5955f..174ecfa12ee6 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -116,6 +116,7 @@ public abstract class BiometricServiceBase extends SystemService
protected HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>();
// Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap.
protected HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>();
+ protected int mHALDeathCount;
protected class PerformanceStats {
public int accept; // number of accepted biometrics
@@ -596,6 +597,7 @@ public abstract class BiometricServiceBase extends SystemService
public void serviceDied(long cookie) {
Slog.e(getTag(), "HAL died");
mMetricsLogger.count(getMetrics().tagHalDied(), 1);
+ mHALDeathCount++;
handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
0 /*vendorCode */);
}
@@ -819,8 +821,6 @@ public abstract class BiometricServiceBase extends SystemService
// Should be done on a handler thread - not on the Binder's thread.
private void startAuthentication(AuthenticationClientImpl client, String opPackageName) {
- updateActiveGroup(client.getGroupId(), opPackageName);
-
if (DEBUG) Slog.v(getTag(), "startAuthentication(" + opPackageName + ")");
int lockoutMode = getLockoutMode();
diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java
index 72f73f6aaf67..a2aacdde4d9f 100644
--- a/services/core/java/com/android/server/biometrics/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/face/FaceService.java
@@ -133,10 +133,11 @@ public class FaceService extends BiometricServiceBase {
}
@Override // Binder call
- public void authenticate(final IBinder token, final long opId,
+ public void authenticate(final IBinder token, final long opId, int userId,
final IFaceServiceReceiver receiver, final int flags,
final String opPackageName) {
checkPermission(USE_BIOMETRIC_INTERNAL);
+ updateActiveGroup(userId, opPackageName);
final boolean restricted = isRestricted();
final AuthenticationClientImpl client = new FaceAuthClient(getContext(),
mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
@@ -156,7 +157,7 @@ public class FaceService extends BiometricServiceBase {
mDaemonWrapper, mHalDeviceId, token,
new BiometricPromptServiceListenerImpl(wrapperReceiver),
mCurrentUserId, 0 /* groupId */, opId, restricted, opPackageName, cookie,
- true /* requireConfirmation */);
+ requireConfirmation);
authenticateInternal(client, opId, opPackageName, callingUid, callingPid,
callingUserId);
}
@@ -674,6 +675,12 @@ public class FaceService extends BiometricServiceBase {
}
@Override
+ public void serviceDied(long cookie) {
+ super.serviceDied(cookie);
+ mDaemon = null;
+ }
+
+ @Override
protected void updateActiveGroup(int userId, String clientPackage) {
IBiometricsFace daemon = getFaceDaemon();
@@ -863,6 +870,8 @@ public class FaceService extends BiometricServiceBase {
Slog.e(TAG, "dump formatting failure", e);
}
pw.println(dump);
+ pw.println("HAL Deaths: " + mHALDeathCount);
+ mHALDeathCount = 0;
}
private void dumpProto(FileDescriptor fd) {
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 3895ef78b357..3db6a74a1c6c 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -159,6 +159,7 @@ public class FingerprintService extends BiometricServiceBase {
public void authenticate(final IBinder token, final long opId, final int groupId,
final IFingerprintServiceReceiver receiver, final int flags,
final String opPackageName) {
+ updateActiveGroup(groupId, opPackageName);
final boolean restricted = isRestricted();
final AuthenticationClientImpl client = new FingerprintAuthClient(getContext(),
mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
@@ -776,6 +777,12 @@ public class FingerprintService extends BiometricServiceBase {
}
@Override
+ public void serviceDied(long cookie) {
+ super.serviceDied(cookie);
+ mDaemon = null;
+ }
+
+ @Override
protected void updateActiveGroup(int userId, String clientPackage) {
IBiometricsFingerprint daemon = getFingerprintDaemon();
@@ -1073,6 +1080,8 @@ public class FingerprintService extends BiometricServiceBase {
Slog.e(TAG, "dump formatting failure", e);
}
pw.println(dump);
+ pw.println("HAL Deaths: " + mHALDeathCount);
+ mHALDeathCount = 0;
}
private void dumpProto(FileDescriptor fd) {
diff --git a/services/core/java/com/android/server/connectivity/ConnectivityConstants.java b/services/core/java/com/android/server/connectivity/ConnectivityConstants.java
index 24865bcd9a09..6fa98b8e8ad7 100644
--- a/services/core/java/com/android/server/connectivity/ConnectivityConstants.java
+++ b/services/core/java/com/android/server/connectivity/ConnectivityConstants.java
@@ -21,22 +21,6 @@ package com.android.server.connectivity;
* @hide
*/
public class ConnectivityConstants {
- // IPC constants
- public static final String ACTION_NETWORK_CONDITIONS_MEASURED =
- "android.net.conn.NETWORK_CONDITIONS_MEASURED";
- public static final String EXTRA_CONNECTIVITY_TYPE = "extra_connectivity_type";
- public static final String EXTRA_NETWORK_TYPE = "extra_network_type";
- public static final String EXTRA_RESPONSE_RECEIVED = "extra_response_received";
- public static final String EXTRA_IS_CAPTIVE_PORTAL = "extra_is_captive_portal";
- public static final String EXTRA_CELL_ID = "extra_cellid";
- public static final String EXTRA_SSID = "extra_ssid";
- public static final String EXTRA_BSSID = "extra_bssid";
- /** real time since boot */
- public static final String EXTRA_REQUEST_TIMESTAMP_MS = "extra_request_timestamp_ms";
- public static final String EXTRA_RESPONSE_TIMESTAMP_MS = "extra_response_timestamp_ms";
-
- public static final String PERMISSION_ACCESS_NETWORK_CONDITIONS =
- "android.permission.ACCESS_NETWORK_CONDITIONS";
// Penalty applied to scores of Networks that have not been validated.
public static final int UNVALIDATED_SCORE_PENALTY = 40;
diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java
index b8f057db290a..d8bb635f2ce8 100644
--- a/services/core/java/com/android/server/connectivity/DnsManager.java
+++ b/services/core/java/com/android/server/connectivity/DnsManager.java
@@ -18,10 +18,9 @@ package com.android.server.connectivity;
import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE_FALLBACK;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
-import static android.provider.Settings.Global.DNS_RESOLVER_MIN_SAMPLES;
import static android.provider.Settings.Global.DNS_RESOLVER_MAX_SAMPLES;
+import static android.provider.Settings.Global.DNS_RESOLVER_MIN_SAMPLES;
import static android.provider.Settings.Global.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS;
import static android.provider.Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT;
import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
@@ -35,6 +34,7 @@ import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkUtils;
import android.net.Uri;
+import android.net.shared.PrivateDnsConfig;
import android.os.Binder;
import android.os.INetworkManagementService;
import android.os.UserHandle;
@@ -43,10 +43,7 @@ import android.text.TextUtils;
import android.util.Pair;
import android.util.Slog;
-import com.android.server.connectivity.MockableSystemProperties;
-
import java.net.InetAddress;
-import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -54,10 +51,8 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
import java.util.Set;
-import java.util.StringJoiner;
+import java.util.stream.Collectors;
/**
@@ -123,43 +118,6 @@ public class DnsManager {
private static final int DNS_RESOLVER_DEFAULT_MIN_SAMPLES = 8;
private static final int DNS_RESOLVER_DEFAULT_MAX_SAMPLES = 64;
- public static class PrivateDnsConfig {
- public final boolean useTls;
- public final String hostname;
- public final InetAddress[] ips;
-
- public PrivateDnsConfig() {
- this(false);
- }
-
- public PrivateDnsConfig(boolean useTls) {
- this.useTls = useTls;
- this.hostname = "";
- this.ips = new InetAddress[0];
- }
-
- public PrivateDnsConfig(String hostname, InetAddress[] ips) {
- this.useTls = !TextUtils.isEmpty(hostname);
- this.hostname = useTls ? hostname : "";
- this.ips = (ips != null) ? ips : new InetAddress[0];
- }
-
- public PrivateDnsConfig(PrivateDnsConfig cfg) {
- useTls = cfg.useTls;
- hostname = cfg.hostname;
- ips = cfg.ips;
- }
-
- public boolean inStrictMode() {
- return useTls && !TextUtils.isEmpty(hostname);
- }
-
- public String toString() {
- return PrivateDnsConfig.class.getSimpleName() +
- "{" + useTls + ":" + hostname + "/" + Arrays.toString(ips) + "}";
- }
- }
-
public static PrivateDnsConfig getPrivateDnsConfig(ContentResolver cr) {
final String mode = getPrivateDnsMode(cr);
diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
index 0f8fc17047b9..8a3cdcad0230 100644
--- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
+++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
@@ -185,13 +185,13 @@ public class KeepaliveTracker {
}
void start(int slot) {
+ mSlot = slot;
int error = isValid();
if (error == SUCCESS) {
- mSlot = slot;
Log.d(TAG, "Starting keepalive " + mSlot + " on " + mNai.name());
mNai.asyncChannel.sendMessage(CMD_START_PACKET_KEEPALIVE, slot, mInterval, mPacket);
} else {
- notifyMessenger(NO_KEEPALIVE, error);
+ handleStopKeepalive(mNai, mSlot, error);
return;
}
}
@@ -277,6 +277,7 @@ public class KeepaliveTracker {
return;
}
ki.stop(reason);
+ Log.d(TAG, "Stopped keepalive " + slot + " on " + networkName);
networkKeepalives.remove(slot);
if (networkKeepalives.isEmpty()) {
mKeepalives.remove(nai);
diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
index 7bed50d04a5d..03beb6a7ff6d 100644
--- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java
+++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
@@ -16,8 +16,9 @@
package com.android.server.connectivity;
-import android.net.InterfaceConfiguration;
import android.net.ConnectivityManager;
+import android.net.INetd;
+import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkInfo;
@@ -60,6 +61,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
NetworkInfo.State.SUSPENDED,
};
+ private final INetd mNetd;
private final INetworkManagementService mNMService;
// The network we're running on, and its type.
@@ -77,7 +79,8 @@ public class Nat464Xlat extends BaseNetworkObserver {
private String mIface;
private State mState = State.IDLE;
- public Nat464Xlat(INetworkManagementService nmService, NetworkAgentInfo nai) {
+ public Nat464Xlat(NetworkAgentInfo nai, INetd netd, INetworkManagementService nmService) {
+ mNetd = netd;
mNMService = nmService;
mNetwork = nai;
}
@@ -142,7 +145,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
return;
}
try {
- mNMService.startClatd(baseIface);
+ mNetd.clatdStart(baseIface);
} catch(RemoteException|IllegalStateException e) {
Slog.e(TAG, "Error starting clatd on " + baseIface, e);
}
@@ -164,7 +167,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
*/
private void enterStoppingState() {
try {
- mNMService.stopClatd(mBaseIface);
+ mNetd.clatdStop(mBaseIface);
} catch(RemoteException|IllegalStateException e) {
Slog.e(TAG, "Error stopping clatd on " + mBaseIface, e);
}
@@ -206,7 +209,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
Slog.e(TAG, "startClat: Can't start clat on null interface");
return;
}
- // TODO: should we only do this if mNMService.startClatd() succeeds?
+ // TODO: should we only do this if mNetd.clatdStart() succeeds?
Slog.i(TAG, "Starting clatd on " + baseIface);
enterStartingState(baseIface);
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index e9b55da881e8..8ebca68f9efe 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -21,6 +21,8 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import android.content.Context;
+import android.net.INetd;
+import android.net.INetworkMonitor;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -31,7 +33,6 @@ import android.net.NetworkState;
import android.os.Handler;
import android.os.INetworkManagementService;
import android.os.Messenger;
-import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
import android.util.SparseArray;
@@ -39,11 +40,8 @@ import android.util.SparseArray;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.WakeupMessage;
import com.android.server.ConnectivityService;
-import com.android.server.connectivity.NetworkMonitor;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Comparator;
import java.util.Objects;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -128,7 +126,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public LinkProperties linkProperties;
// This should only be modified via ConnectivityService.updateCapabilities().
public NetworkCapabilities networkCapabilities;
- public final NetworkMonitor networkMonitor;
public final NetworkMisc networkMisc;
// Indicates if netd has been told to create this Network. From this point on the appropriate
// routing rules are setup and routes are added so packets can begin flowing over the Network.
@@ -241,15 +238,21 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
// Used by ConnectivityService to keep track of 464xlat.
public Nat464Xlat clatd;
+ // Set after asynchronous creation of the NetworkMonitor.
+ private volatile INetworkMonitor mNetworkMonitor;
+
private static final String TAG = ConnectivityService.class.getSimpleName();
private static final boolean VDBG = false;
private final ConnectivityService mConnService;
+ private final INetd mNetd;
+ private final INetworkManagementService mNMS;
private final Context mContext;
private final Handler mHandler;
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
- NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) {
+ NetworkMisc misc, ConnectivityService connService, INetd netd,
+ INetworkManagementService nms) {
this.messenger = messenger;
asyncChannel = ac;
network = net;
@@ -258,12 +261,20 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
networkCapabilities = nc;
currentScore = score;
mConnService = connService;
+ mNetd = netd;
+ mNMS = nms;
mContext = context;
mHandler = handler;
- networkMonitor = mConnService.createNetworkMonitor(context, handler, this, defaultRequest);
networkMisc = misc;
}
+ /**
+ * Inform NetworkAgentInfo that a new NetworkMonitor was created.
+ */
+ public void onNetworkMonitorCreated(INetworkMonitor networkMonitor) {
+ mNetworkMonitor = networkMonitor;
+ }
+
public ConnectivityService connService() {
return mConnService;
}
@@ -280,6 +291,15 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
return network;
}
+ /**
+ * Get the INetworkMonitor in this NetworkAgentInfo.
+ *
+ * <p>This will be null before {@link #onNetworkMonitorCreated(INetworkMonitor)} is called.
+ */
+ public INetworkMonitor networkMonitor() {
+ return mNetworkMonitor;
+ }
+
// Functions for manipulating the requests satisfied by this network.
//
// These functions must only called on ConnectivityService's main thread.
@@ -579,18 +599,18 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
if (Nat464Xlat.requiresClat(this) &&
( this.networkCapabilities.hasCapability(NET_CAPABILITY_INTERNET) ||
this.networkCapabilities.hasCapability(NET_CAPABILITY_MMS) )) {
- maybeStartClat(netd);
+ maybeStartClat();
} else {
maybeStopClat();
}
}
/** Ensure clat has started for this network. */
- public void maybeStartClat(INetworkManagementService netd) {
+ public void maybeStartClat() {
if (clatd != null && clatd.isStarted()) {
return;
}
- clatd = new Nat464Xlat(netd, this);
+ clatd = new Nat464Xlat(this, mNetd, mNMS);
clatd.start();
}
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java
index 3ea9810f2d76..97896889f243 100644
--- a/services/core/java/com/android/server/connectivity/PacManager.java
+++ b/services/core/java/com/android/server/connectivity/PacManager.java
@@ -282,6 +282,7 @@ public class PacManager {
private void setCurrentProxyScript(String script) {
if (mProxyService == null) {
Log.e(TAG, "setCurrentProxyScript: no proxy service");
+ return;
}
try {
mProxyService.setPacFile(script);
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 6d5ba97b35ba..bb52cb8826f8 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -1845,7 +1845,7 @@ public class Tethering extends BaseNetworkObserver {
final TetherState tetherState = new TetherState(
new IpServer(iface, mLooper, interfaceType, mLog, mNMService, mStatsService,
makeControlCallback(), mConfig.enableLegacyDhcpServer,
- mDeps.getIpServerDependencies()));
+ mDeps.getIpServerDependencies(mContext)));
mTetherStates.put(iface, tetherState);
tetherState.ipServer.start();
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
index d56b167b9a75..a42efe960ff9 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
@@ -34,32 +34,53 @@ import java.util.ArrayList;
* @hide
*/
public class TetheringDependencies {
+ /**
+ * Get a reference to the offload hardware interface to be used by tethering.
+ */
public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
return new OffloadHardwareInterface(h, log);
}
+ /**
+ * Get a reference to the UpstreamNetworkMonitor to be used by tethering.
+ */
public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target,
SharedLog log, int what) {
return new UpstreamNetworkMonitor(ctx, target, log, what);
}
+ /**
+ * Get a reference to the IPv6TetheringCoordinator to be used by tethering.
+ */
public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
ArrayList<IpServer> notifyList, SharedLog log) {
return new IPv6TetheringCoordinator(notifyList, log);
}
- public IpServer.Dependencies getIpServerDependencies() {
- return new IpServer.Dependencies();
+ /**
+ * Get dependencies to be used by IpServer.
+ */
+ public IpServer.Dependencies getIpServerDependencies(Context context) {
+ return new IpServer.Dependencies(context);
}
+ /**
+ * Indicates whether tethering is supported on the device.
+ */
public boolean isTetheringSupported() {
return true;
}
+ /**
+ * Get the NetworkRequest that should be fulfilled by the default network.
+ */
public NetworkRequest getDefaultNetworkRequest() {
return null;
}
+ /**
+ * Get a reference to the EntitlementManager to be used by tethering.
+ */
public EntitlementManager getEntitlementManager(Context ctx, SharedLog log,
MockableSystemProperties systemProperties) {
return new EntitlementManager(ctx, log, systemProperties);
diff --git a/services/core/java/com/android/server/content/SyncJobService.java b/services/core/java/com/android/server/content/SyncJobService.java
index bfcc629541f8..aaf9cbc168af 100644
--- a/services/core/java/com/android/server/content/SyncJobService.java
+++ b/services/core/java/com/android/server/content/SyncJobService.java
@@ -141,10 +141,7 @@ public class SyncJobService extends JobService {
final long runtime = nowUptime - startUptime;
- if (startUptime == 0) {
- wtf("Job " + jobId + " start uptime not found: "
- + " params=" + jobParametersToString(params));
- } else if (runtime > 60 * 1000) {
+ if (runtime > 60 * 1000) {
// WTF if startSyncH() hasn't happened, *unless* onStopJob() was called too soon.
// (1 minute threshold.)
// Also don't wtf when it's not ready to sync.
diff --git a/services/core/java/com/android/server/content/SyncLogger.java b/services/core/java/com/android/server/content/SyncLogger.java
index 5cbe5b958b7d..fc20ef20f63d 100644
--- a/services/core/java/com/android/server/content/SyncLogger.java
+++ b/services/core/java/com/android/server/content/SyncLogger.java
@@ -16,6 +16,7 @@
package com.android.server.content;
+import android.accounts.Account;
import android.app.job.JobParameters;
import android.os.Build;
import android.os.Environment;
@@ -31,6 +32,8 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IntPair;
import com.android.server.IoThread;
+import com.android.server.content.SyncManager.ActiveSyncContext;
+import com.android.server.content.SyncStorageEngine.EndPoint;
import libcore.io.IoUtils;
@@ -309,4 +312,20 @@ public class SyncLogger {
}
}
}
+
+ static String logSafe(Account account) {
+ return account == null ? "[null]" : account.toSafeString();
+ }
+
+ static String logSafe(EndPoint endPoint) {
+ return endPoint == null ? "[null]" : endPoint.toSafeString();
+ }
+
+ static String logSafe(SyncOperation operation) {
+ return operation == null ? "[null]" : operation.toSafeString();
+ }
+
+ static String logSafe(ActiveSyncContext asc) {
+ return asc == null ? "[null]" : asc.toSafeString();
+ }
}
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 8b93e041fa4c..7096477ce5f4 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -16,6 +16,8 @@
package com.android.server.content;
+import static com.android.server.content.SyncLogger.logSafe;
+
import android.accounts.Account;
import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
@@ -1140,7 +1142,7 @@ public class SyncManager {
/* ignore - local call */
}
if (checkAccountAccess && !canAccessAccount(account, owningPackage, owningUid)) {
- Log.w(TAG, "Access to " + account + " denied for package "
+ Log.w(TAG, "Access to " + logSafe(account) + " denied for package "
+ owningPackage + " in UID " + syncAdapterInfo.uid);
return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS;
}
@@ -1474,7 +1476,8 @@ public class SyncManager {
if (!syncOperation.ignoreBackoff()) {
Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(syncOperation.target);
if (backoff == null) {
- Slog.e(TAG, "Couldn't find backoff values for " + syncOperation.target);
+ Slog.e(TAG, "Couldn't find backoff values for "
+ + logSafe(syncOperation.target));
backoff = new Pair<Long, Long>(SyncStorageEngine.NOT_IN_BACKOFF_MODE,
SyncStorageEngine.NOT_IN_BACKOFF_MODE);
}
@@ -1745,8 +1748,8 @@ public class SyncManager {
scheduleSyncOperationH(operation);
} else {
// Otherwise do not reschedule.
- Log.d(TAG, "not retrying sync operation because the error is a hard error: "
- + operation);
+ Log.e(TAG, "not retrying sync operation because the error is a hard error: "
+ + logSafe(operation));
}
}
@@ -1881,11 +1884,12 @@ public class SyncManager {
sendSyncFinishedOrCanceledMessage(this, result);
}
- public void toString(StringBuilder sb) {
+ public void toString(StringBuilder sb, boolean logSafe) {
sb.append("startTime ").append(mStartTime)
.append(", mTimeoutStartTime ").append(mTimeoutStartTime)
.append(", mHistoryRowId ").append(mHistoryRowId)
- .append(", syncOperation ").append(mSyncOperation);
+ .append(", syncOperation ").append(
+ logSafe ? logSafe(mSyncOperation) : mSyncOperation);
}
public void onServiceConnected(ComponentName name, IBinder service) {
@@ -1947,7 +1951,13 @@ public class SyncManager {
public String toString() {
StringBuilder sb = new StringBuilder();
- toString(sb);
+ toString(sb, false);
+ return sb.toString();
+ }
+
+ public String toSafeString() {
+ StringBuilder sb = new StringBuilder();
+ toString(sb, true);
return sb.toString();
}
@@ -2036,7 +2046,7 @@ public class SyncManager {
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (!op.isPeriodic) {
- pw.println(op.dump(null, false, buckets));
+ pw.println(op.dump(null, false, buckets, /*logSafe=*/ false));
count++;
}
}
@@ -2053,7 +2063,7 @@ public class SyncManager {
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (op.isPeriodic) {
- pw.println(op.dump(null, false, buckets));
+ pw.println(op.dump(null, false, buckets, /*logSafe=*/ false));
count++;
}
}
@@ -2186,7 +2196,7 @@ public class SyncManager {
sb.setLength(0);
pw.print(formatDurationHMS(sb, durationInSeconds));
pw.print(" - ");
- pw.print(activeSyncContext.mSyncOperation.dump(pm, false, buckets));
+ pw.print(activeSyncContext.mSyncOperation.dump(pm, false, buckets, /*logSafe=*/ false));
pw.println();
}
pw.println();
@@ -2974,7 +2984,7 @@ public class SyncManager {
case SyncHandler.MESSAGE_CANCEL:
SyncStorageEngine.EndPoint endpoint = (SyncStorageEngine.EndPoint) msg.obj;
Bundle extras = msg.peekData();
- if (Log.isLoggable(TAG, Log.DEBUG)) {
+ if (isLoggable) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_CANCEL: "
+ endpoint + " bundle: " + extras);
}
@@ -2985,9 +2995,11 @@ public class SyncManager {
SyncFinishedOrCancelledMessagePayload payload =
(SyncFinishedOrCancelledMessagePayload) msg.obj;
if (!isSyncStillActiveH(payload.activeSyncContext)) {
- Log.d(TAG, "handleSyncHandlerMessage: dropping since the "
- + "sync is no longer active: "
- + payload.activeSyncContext);
+ if (isLoggable) {
+ Log.d(TAG, "handleSyncHandlerMessage: dropping since the "
+ + "sync is no longer active: "
+ + payload.activeSyncContext);
+ }
break;
}
if (isLoggable) {
@@ -3002,7 +3014,7 @@ public class SyncManager {
case SyncHandler.MESSAGE_SERVICE_CONNECTED: {
ServiceConnectionData msgData = (ServiceConnectionData) msg.obj;
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ if (isLoggable) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_SERVICE_CONNECTED: "
+ msgData.activeSyncContext);
}
@@ -3018,7 +3030,7 @@ public class SyncManager {
case SyncHandler.MESSAGE_SERVICE_DISCONNECTED: {
final ActiveSyncContext currentSyncContext =
((ServiceConnectionData) msg.obj).activeSyncContext;
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ if (isLoggable) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_SERVICE_DISCONNECTED: "
+ currentSyncContext);
}
@@ -3053,7 +3065,7 @@ public class SyncManager {
case SyncHandler.MESSAGE_MONITOR_SYNC:
ActiveSyncContext monitoredSyncContext = (ActiveSyncContext) msg.obj;
- if (Log.isLoggable(TAG, Log.DEBUG)) {
+ if (isLoggable) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_MONITOR_SYNC: " +
monitoredSyncContext.mSyncOperation.target);
}
@@ -3061,7 +3073,7 @@ public class SyncManager {
if (isSyncNotUsingNetworkH(monitoredSyncContext)) {
Log.w(TAG, String.format(
"Detected sync making no progress for %s. cancelling.",
- monitoredSyncContext));
+ logSafe(monitoredSyncContext)));
SyncJobService.callJobFinished(
monitoredSyncContext.mSyncOperation.jobId, false,
"no network activity");
@@ -3558,7 +3570,8 @@ public class SyncManager {
} catch (RuntimeException exc) {
mLogger.log("Sync failed with RuntimeException: ", exc.toString());
closeActiveSyncContext(activeSyncContext);
- Slog.e(TAG, "Caught RuntimeException while starting the sync " + syncOperation, exc);
+ Slog.e(TAG, "Caught RuntimeException while starting the sync "
+ + logSafe(syncOperation), exc);
}
}
@@ -3658,7 +3671,8 @@ public class SyncManager {
reschedulePeriodicSyncH(syncOperation);
}
} else {
- Log.w(TAG, "failed sync operation " + syncOperation + ", " + syncResult);
+ Log.w(TAG, "failed sync operation "
+ + logSafe(syncOperation) + ", " + syncResult);
syncOperation.retries++;
if (syncOperation.retries > mConstants.getMaxRetriesWithAppStandbyExemption()) {
@@ -4042,11 +4056,6 @@ public class SyncManager {
getJobScheduler().cancel(op.jobId);
}
- private void wtfWithLog(String message) {
- Slog.wtf(TAG, message);
- mLogger.log("WTF: ", message);
- }
-
public void resetTodayStats() {
mSyncStorageEngine.resetTodayStats(/*force=*/ true);
}
diff --git a/services/core/java/com/android/server/content/SyncOperation.java b/services/core/java/com/android/server/content/SyncOperation.java
index 25edf4070689..2abc2e60a47b 100644
--- a/services/core/java/com/android/server/content/SyncOperation.java
+++ b/services/core/java/com/android/server/content/SyncOperation.java
@@ -363,14 +363,19 @@ public class SyncOperation {
@Override
public String toString() {
- return dump(null, true, null);
+ return dump(null, true, null, false);
}
- String dump(PackageManager pm, boolean shorter, SyncAdapterStateFetcher appStates) {
+ public String toSafeString() {
+ return dump(null, true, null, true);
+ }
+
+ String dump(PackageManager pm, boolean shorter, SyncAdapterStateFetcher appStates,
+ boolean logSafe) {
StringBuilder sb = new StringBuilder();
sb.append("JobId=").append(jobId)
.append(" ")
- .append(target.account.name)
+ .append(logSafe ? "***" : target.account.name)
.append("/")
.append(target.account.type)
.append(" u")
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index bfd179141554..6b441a0d0f30 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -16,6 +16,8 @@
package com.android.server.content;
+import static com.android.server.content.SyncLogger.logSafe;
+
import android.accounts.Account;
import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
@@ -225,6 +227,15 @@ public class SyncStorageEngine {
sb.append(":u" + userId);
return sb.toString();
}
+
+ public String toSafeString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(account == null ? "ALL ACCS" : logSafe(account))
+ .append("/")
+ .append(provider == null ? "ALL PDRS" : provider);
+ sb.append(":u" + userId);
+ return sb.toString();
+ }
}
public static class AuthorityInfo {
@@ -1861,8 +1872,8 @@ public class SyncStorageEngine {
}
} else {
- Slog.w(TAG, "Failure adding authority: account="
- + accountName + " auth=" + authorityName
+ Slog.w(TAG, "Failure adding authority:"
+ + " auth=" + authorityName
+ " enabled=" + enabled
+ " syncable=" + syncable);
}
diff --git a/services/core/java/com/android/server/display/AppSaturationController.java b/services/core/java/com/android/server/display/AppSaturationController.java
new file mode 100644
index 000000000000..5d5e4f70ea7f
--- /dev/null
+++ b/services/core/java/com/android/server/display/AppSaturationController.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2019 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.display;
+
+import android.annotation.UserIdInt;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.ColorDisplayService.ColorTransformController;
+
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+class AppSaturationController {
+
+ private final Object mLock = new Object();
+
+ /**
+ * A package name has one or more userIds it is running under. Each userId has zero or one
+ * saturation level, and zero or more ColorTransformControllers.
+ */
+ @GuardedBy("mLock")
+ private final Map<String, SparseArray<SaturationController>> mAppsMap = new HashMap<>();
+
+ @VisibleForTesting
+ static final float[] TRANSLATION_VECTOR = {0f, 0f, 0f};
+
+ /**
+ * Add an {@link WeakReference<ColorTransformController>} for a given package and userId.
+ */
+ boolean addColorTransformController(String packageName, @UserIdInt int userId,
+ WeakReference<ColorTransformController> controller) {
+ synchronized (mLock) {
+ return getSaturationControllerLocked(packageName, userId)
+ .addColorTransformController(controller);
+ }
+ }
+
+ /**
+ * Set the saturation level ({@code ColorDisplayManager#SaturationLevel} constant for a given
+ * package name and userId.
+ */
+ public boolean setSaturationLevel(String packageName, @UserIdInt int userId,
+ int saturationLevel) {
+ synchronized (mLock) {
+ return getSaturationControllerLocked(packageName, userId)
+ .setSaturationLevel(saturationLevel);
+ }
+ }
+
+ /**
+ * Dump state information.
+ */
+ public void dump(PrintWriter pw) {
+ synchronized (mLock) {
+ pw.println("App Saturation: ");
+ if (mAppsMap.size() == 0) {
+ pw.println(" No packages");
+ return;
+ }
+ final List<String> packageNames = new ArrayList<>(mAppsMap.keySet());
+ Collections.sort(packageNames);
+ for (String packageName : packageNames) {
+ pw.println(" " + packageName + ":");
+ final SparseArray<SaturationController> appUserIdMap = mAppsMap.get(packageName);
+ for (int i = 0; i < appUserIdMap.size(); i++) {
+ pw.println(" " + appUserIdMap.keyAt(i) + ":");
+ appUserIdMap.valueAt(i).dump(pw);
+ }
+ }
+ }
+ }
+
+ /**
+ * Retrieve the SaturationController for a given package and userId, creating all intermediate
+ * connections as needed.
+ */
+ private SaturationController getSaturationControllerLocked(String packageName,
+ @UserIdInt int userId) {
+ return getOrCreateSaturationControllerLocked(getOrCreateUserIdMapLocked(packageName),
+ userId);
+ }
+
+ /**
+ * Retrieve or create the mapping between the app's given package name and its userIds (and
+ * their SaturationControllers).
+ */
+ private SparseArray<SaturationController> getOrCreateUserIdMapLocked(String packageName) {
+ if (mAppsMap.get(packageName) != null) {
+ return mAppsMap.get(packageName);
+ }
+
+ final SparseArray<SaturationController> appUserIdMap = new SparseArray<>();
+ mAppsMap.put(packageName, appUserIdMap);
+ return appUserIdMap;
+ }
+
+ /**
+ * Retrieve or create the mapping between an app's given userId and SaturationController.
+ */
+ private SaturationController getOrCreateSaturationControllerLocked(
+ SparseArray<SaturationController> appUserIdMap, @UserIdInt int userId) {
+ if (appUserIdMap.get(userId) != null) {
+ return appUserIdMap.get(userId);
+ }
+
+ final SaturationController saturationController = new SaturationController();
+ appUserIdMap.put(userId, saturationController);
+ return saturationController;
+ }
+
+ @VisibleForTesting
+ static void computeGrayscaleTransformMatrix(float saturation, float[] matrix) {
+ float desaturation = 1.0f - saturation;
+ float[] luminance = {0.231f * desaturation, 0.715f * desaturation,
+ 0.072f * desaturation};
+ matrix[0] = luminance[0] + saturation;
+ matrix[1] = luminance[0];
+ matrix[2] = luminance[0];
+ matrix[3] = luminance[1];
+ matrix[4] = luminance[1] + saturation;
+ matrix[5] = luminance[1];
+ matrix[6] = luminance[2];
+ matrix[7] = luminance[2];
+ matrix[8] = luminance[2] + saturation;
+ }
+
+ private static class SaturationController {
+
+ private final List<WeakReference<ColorTransformController>> mControllerRefs =
+ new ArrayList<>();
+ private int mSaturationLevel = 100;
+ private float[] mTransformMatrix = new float[9];
+
+ private boolean setSaturationLevel(int saturationLevel) {
+ mSaturationLevel = saturationLevel;
+ if (!mControllerRefs.isEmpty()) {
+ return updateState();
+ }
+ return false;
+ }
+
+ private boolean addColorTransformController(
+ WeakReference<ColorTransformController> controller) {
+ mControllerRefs.add(controller);
+ if (mSaturationLevel != 100) {
+ return updateState();
+ } else {
+ clearExpiredReferences();
+ }
+ return false;
+ }
+
+ private boolean updateState() {
+ computeGrayscaleTransformMatrix(mSaturationLevel / 100f, mTransformMatrix);
+
+ boolean updated = false;
+ final Iterator<WeakReference<ColorTransformController>> iterator = mControllerRefs
+ .iterator();
+ while (iterator.hasNext()) {
+ WeakReference<ColorTransformController> controllerRef = iterator.next();
+ final ColorTransformController controller = controllerRef.get();
+ if (controller != null) {
+ controller.applyAppSaturation(mTransformMatrix, TRANSLATION_VECTOR);
+ updated = true;
+ } else {
+ // Purge cleared refs lazily to avoid accumulating a lot of dead windows
+ iterator.remove();
+ }
+ }
+ return updated;
+
+ }
+
+ private void clearExpiredReferences() {
+ final Iterator<WeakReference<ColorTransformController>> iterator = mControllerRefs
+ .iterator();
+ while (iterator.hasNext()) {
+ WeakReference<ColorTransformController> controllerRef = iterator.next();
+ final ColorTransformController controller = controllerRef.get();
+ if (controller == null) {
+ iterator.remove();
+ }
+ }
+ }
+
+ private void dump(PrintWriter pw) {
+ pw.println(" mSaturationLevel: " + mSaturationLevel);
+ pw.println(" mControllerRefs count: " + mControllerRefs.size());
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 78b3c15500ea..d57431e6b58b 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -17,6 +17,12 @@
package com.android.server.display;
import android.annotation.Nullable;
+import android.app.ActivityManager.StackInfo;
+import android.app.ActivityTaskManager;
+import android.app.IActivityTaskManager;
+import android.app.TaskStackListener;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -27,6 +33,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.util.EventLog;
@@ -34,6 +41,7 @@ import android.util.MathUtils;
import android.util.Slog;
import android.util.TimeUtils;
+import com.android.internal.os.BackgroundThread;
import com.android.server.EventLogTags;
import java.io.PrintWriter;
@@ -41,7 +49,6 @@ import java.io.PrintWriter;
class AutomaticBrightnessController {
private static final String TAG = "AutomaticBrightnessController";
- private static final boolean DEBUG = false;
private static final boolean DEBUG_PRETEND_LIGHT_SENSOR_ABSENT = false;
// If true, enables the use of the screen auto-brightness adjustment setting.
@@ -56,16 +63,11 @@ class AutomaticBrightnessController {
// the user is satisfied with the result before storing the sample.
private static final int BRIGHTNESS_ADJUSTMENT_SAMPLE_DEBOUNCE_MILLIS = 10000;
- // Timeout after which we remove the effects any user interactions might've had on the
- // brightness mapping. This timeout doesn't start until we transition to a non-interactive
- // display policy so that we don't reset while users are using their devices, but also so that
- // we don't erroneously keep the short-term model if the device is dozing but the display is
- // fully on.
- private static final int SHORT_TERM_MODEL_TIMEOUT_MILLIS = 30000;
-
private static final int MSG_UPDATE_AMBIENT_LUX = 1;
private static final int MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE = 2;
private static final int MSG_INVALIDATE_SHORT_TERM_MODEL = 3;
+ private static final int MSG_UPDATE_FOREGROUND_APP = 4;
+ private static final int MSG_UPDATE_FOREGROUND_APP_SYNC = 5;
// Length of the ambient light horizon used to calculate the long term estimate of ambient
// light.
@@ -126,6 +128,15 @@ class AutomaticBrightnessController {
private final HysteresisLevels mAmbientBrightnessThresholds;
private final HysteresisLevels mScreenBrightnessThresholds;
+ private boolean mLoggingEnabled;
+
+ // Timeout after which we remove the effects any user interactions might've had on the
+ // brightness mapping. This timeout doesn't start until we transition to a non-interactive
+ // display policy so that we don't reset while users are using their devices, but also so that
+ // we don't erroneously keep the short-term model if the device is dozing but the display is
+ // fully on.
+ private long mShortTermModelTimeout;
+
// Amount of time to delay auto-brightness after screen on while waiting for
// the light sensor to warm-up in milliseconds.
// May be 0 if no warm-up is required.
@@ -192,13 +203,26 @@ class AutomaticBrightnessController {
private float mShortTermModelAnchor;
private float SHORT_TERM_MODEL_THRESHOLD_RATIO = 0.6f;
+ // Context-sensitive brightness configurations require keeping track of the foreground app's
+ // package name and category, which is done by registering a TaskStackListener to call back to
+ // us onTaskStackChanged, and then using the ActivityTaskManager to get the foreground app's
+ // package namd and PackageManager to get its category (so might as well cache them).
+ private String mForegroundAppPackageName;
+ private String mPendingForegroundAppPackageName;
+ private @ApplicationInfo.Category int mForegroundAppCategory;
+ private @ApplicationInfo.Category int mPendingForegroundAppCategory;
+ private TaskStackListenerImpl mTaskStackListener;
+ private IActivityTaskManager mActivityTaskManager;
+ private PackageManager mPackageManager;
+
public AutomaticBrightnessController(Callbacks callbacks, Looper looper,
SensorManager sensorManager, BrightnessMappingStrategy mapper,
int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor,
int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig,
long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig,
HysteresisLevels ambientBrightnessThresholds,
- HysteresisLevels screenBrightnessThresholds) {
+ HysteresisLevels screenBrightnessThresholds, long shortTermModelTimeout,
+ PackageManager packageManager) {
mCallbacks = callbacks;
mSensorManager = sensorManager;
mBrightnessMapper = mapper;
@@ -216,6 +240,7 @@ class AutomaticBrightnessController {
mWeightingIntercept = AMBIENT_LIGHT_LONG_HORIZON_MILLIS;
mAmbientBrightnessThresholds = ambientBrightnessThresholds;
mScreenBrightnessThresholds = screenBrightnessThresholds;
+ mShortTermModelTimeout = shortTermModelTimeout;
mShortTermModelValid = true;
mShortTermModelAnchor = -1;
@@ -226,6 +251,31 @@ class AutomaticBrightnessController {
if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) {
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
+
+ mActivityTaskManager = ActivityTaskManager.getService();
+ mPackageManager = packageManager;
+ mTaskStackListener = new TaskStackListenerImpl();
+ mForegroundAppPackageName = null;
+ mPendingForegroundAppPackageName = null;
+ mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
+ mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
+ }
+
+ /**
+ * Enable/disable logging.
+ *
+ * @param loggingEnabled
+ * Whether logging should be on/off.
+ *
+ * @return Whether the method succeeded or not.
+ */
+ public boolean setLoggingEnabled(boolean loggingEnabled) {
+ if (mLoggingEnabled == loggingEnabled) {
+ return false;
+ }
+ mBrightnessMapper.setLoggingEnabled(loggingEnabled);
+ mLoggingEnabled = loggingEnabled;
+ return true;
}
public int getAutomaticScreenBrightness() {
@@ -290,12 +340,12 @@ class AutomaticBrightnessController {
}
final int oldPolicy = mDisplayPolicy;
mDisplayPolicy = policy;
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "Display policy transitioning from " + oldPolicy + " to " + policy);
}
if (!isInteractivePolicy(policy) && isInteractivePolicy(oldPolicy)) {
mHandler.sendEmptyMessageDelayed(MSG_INVALIDATE_SHORT_TERM_MODEL,
- SHORT_TERM_MODEL_TIMEOUT_MILLIS);
+ mShortTermModelTimeout);
} else if (isInteractivePolicy(policy) && !isInteractivePolicy(oldPolicy)) {
mHandler.removeMessages(MSG_INVALIDATE_SHORT_TERM_MODEL);
}
@@ -317,7 +367,7 @@ class AutomaticBrightnessController {
mBrightnessMapper.addUserDataPoint(mAmbientLux, brightness);
mShortTermModelValid = true;
mShortTermModelAnchor = mAmbientLux;
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "ShortTermModel: anchor=" + mShortTermModelAnchor);
}
return true;
@@ -330,7 +380,7 @@ class AutomaticBrightnessController {
}
private void invalidateShortTermModel() {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "ShortTermModel: invalidate user data");
}
mShortTermModelValid = false;
@@ -377,13 +427,17 @@ class AutomaticBrightnessController {
pw.println(" mAmbientLightRingBuffer=" + mAmbientLightRingBuffer);
pw.println(" mScreenAutoBrightness=" + mScreenAutoBrightness);
pw.println(" mDisplayPolicy=" + DisplayPowerRequest.policyToString(mDisplayPolicy));
+ pw.println(" mShortTermModelTimeout=" + mShortTermModelTimeout);
pw.println(" mShortTermModelAnchor=" + mShortTermModelAnchor);
pw.println(" mShortTermModelValid=" + mShortTermModelValid);
pw.println(" mBrightnessAdjustmentSamplePending=" + mBrightnessAdjustmentSamplePending);
pw.println(" mBrightnessAdjustmentSampleOldLux=" + mBrightnessAdjustmentSampleOldLux);
pw.println(" mBrightnessAdjustmentSampleOldBrightness="
+ mBrightnessAdjustmentSampleOldBrightness);
- pw.println(" mShortTermModelValid=" + mShortTermModelValid);
+ pw.println(" mForegroundAppPackageName=" + mForegroundAppPackageName);
+ pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName);
+ pw.println(" mForegroundAppCategory=" + mForegroundAppCategory);
+ pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory);
pw.println();
mBrightnessMapper.dump(pw);
@@ -399,6 +453,7 @@ class AutomaticBrightnessController {
mLightSensorEnabled = true;
mLightSensorEnableTime = SystemClock.uptimeMillis();
mCurrentLightSensorRate = mInitialLightSensorRate;
+ registerForegroundAppUpdater();
mSensorManager.registerListener(mLightSensorListener, mLightSensor,
mCurrentLightSensorRate * 1000, mHandler);
return true;
@@ -411,6 +466,7 @@ class AutomaticBrightnessController {
mAmbientLightRingBuffer.clear();
mCurrentLightSensorRate = -1;
mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);
+ unregisterForegroundAppUpdater();
mSensorManager.unregisterListener(mLightSensorListener);
}
return false;
@@ -441,7 +497,7 @@ class AutomaticBrightnessController {
private void adjustLightSensorRate(int lightSensorRate) {
// if the light sensor rate changed, update the sensor listener
if (lightSensorRate != mCurrentLightSensorRate) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "adjustLightSensorRate: " +
"previousRate=" + mCurrentLightSensorRate + ", " +
"currentRate=" + lightSensorRate);
@@ -458,7 +514,7 @@ class AutomaticBrightnessController {
}
private void setAmbientLux(float lux) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "setAmbientLux(" + lux + ")");
}
if (lux < 0) {
@@ -476,7 +532,7 @@ class AutomaticBrightnessController {
final float maxAmbientLux =
mShortTermModelAnchor + mShortTermModelAnchor * SHORT_TERM_MODEL_THRESHOLD_RATIO;
if (minAmbientLux < mAmbientLux && mAmbientLux < maxAmbientLux) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "ShortTermModel: re-validate user data, ambient lux is " +
minAmbientLux + " < " + mAmbientLux + " < " + maxAmbientLux);
}
@@ -490,7 +546,7 @@ class AutomaticBrightnessController {
}
private float calculateAmbientLux(long now, long horizon) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "calculateAmbientLux(" + now + ", " + horizon + ")");
}
final int N = mAmbientLightRingBuffer.size();
@@ -509,7 +565,7 @@ class AutomaticBrightnessController {
break;
}
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "calculateAmbientLux: selected endIndex=" + endIndex + ", point=(" +
mAmbientLightRingBuffer.getTime(endIndex) + ", " +
mAmbientLightRingBuffer.getLux(endIndex) + ")");
@@ -527,7 +583,7 @@ class AutomaticBrightnessController {
final long startTime = eventTime - now;
float weight = calculateWeight(startTime, endTime);
float lux = mAmbientLightRingBuffer.getLux(i);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "calculateAmbientLux: [" + startTime + ", " + endTime + "]: " +
"lux=" + lux + ", " +
"weight=" + weight);
@@ -536,7 +592,7 @@ class AutomaticBrightnessController {
sum += lux * weight;
endTime = startTime;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "calculateAmbientLux: " +
"totalWeight=" + totalWeight + ", " +
"newAmbientLux=" + (sum / totalWeight));
@@ -591,7 +647,7 @@ class AutomaticBrightnessController {
final long timeWhenSensorWarmedUp =
mLightSensorWarmUpTimeConfig + mLightSensorEnableTime;
if (time < timeWhenSensorWarmedUp) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: " +
"time=" + time + ", " +
"timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
@@ -602,7 +658,7 @@ class AutomaticBrightnessController {
}
setAmbientLux(calculateAmbientLux(time, AMBIENT_LIGHT_SHORT_HORIZON_MILLIS));
mAmbientLuxValid = true;
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "updateAmbientLux: Initializing: " +
"mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " +
"mAmbientLux=" + mAmbientLux);
@@ -630,10 +686,10 @@ class AutomaticBrightnessController {
&& fastAmbientLux <= mAmbientDarkeningThreshold
&& nextDarkenTransition <= time)) {
setAmbientLux(fastAmbientLux);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "updateAmbientLux: "
+ ((fastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": "
- + "mAmbientBrighteningThreshold=" + mAmbientBrighteningThreshold + ", "
+ + "mBrighteningLuxThreshold=" + mAmbientBrighteningThreshold + ", "
+ "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", "
+ "mAmbientLux=" + mAmbientLux);
}
@@ -650,7 +706,7 @@ class AutomaticBrightnessController {
// weighted ambient lux or not.
nextTransitionTime =
nextTransitionTime > time ? nextTransitionTime : time + mNormalLightSensorRate;
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " +
nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime));
}
@@ -662,7 +718,8 @@ class AutomaticBrightnessController {
return;
}
- float value = mBrightnessMapper.getBrightness(mAmbientLux);
+ float value = mBrightnessMapper.getBrightness(mAmbientLux, mForegroundAppPackageName,
+ mForegroundAppCategory);
int newScreenAutoBrightness =
clampScreenBrightness(Math.round(value * PowerManager.BRIGHTNESS_ON));
@@ -673,7 +730,7 @@ class AutomaticBrightnessController {
if (mScreenAutoBrightness != -1
&& newScreenAutoBrightness > mScreenDarkeningThreshold
&& newScreenAutoBrightness < mScreenBrighteningThreshold) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "ignoring newScreenAutoBrightness: " + mScreenDarkeningThreshold
+ " < " + newScreenAutoBrightness + " < " + mScreenBrighteningThreshold);
}
@@ -681,8 +738,7 @@ class AutomaticBrightnessController {
}
if (mScreenAutoBrightness != newScreenAutoBrightness) {
-
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "updateAutoBrightness: " +
"mScreenAutoBrightness=" + mScreenAutoBrightness + ", " +
"newScreenAutoBrightness=" + newScreenAutoBrightness);
@@ -729,7 +785,7 @@ class AutomaticBrightnessController {
if (mBrightnessAdjustmentSamplePending) {
mBrightnessAdjustmentSamplePending = false;
if (mAmbientLuxValid && mScreenAutoBrightness >= 0) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "Auto-brightness adjustment changed by user: " +
"lux=" + mAmbientLux + ", " +
"brightness=" + mScreenAutoBrightness + ", " +
@@ -745,6 +801,83 @@ class AutomaticBrightnessController {
}
}
+ // Register a TaskStackListener to call back to us onTaskStackChanged, so we can update the
+ // foreground app's package name and category and correct the brightness accordingly.
+ private void registerForegroundAppUpdater() {
+ try {
+ mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
+ // This will not get called until the foreground app changes for the first time, so
+ // call it explicitly to get the current foreground app's info.
+ updateForegroundApp();
+ } catch (RemoteException e) {
+ if (mLoggingEnabled) {
+ Slog.e(TAG, "Failed to register foreground app updater: " + e);
+ }
+ // Nothing to do.
+ }
+ }
+
+ private void unregisterForegroundAppUpdater() {
+ try {
+ mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
+ } catch (RemoteException e) {
+ // Nothing to do.
+ }
+ mForegroundAppPackageName = null;
+ mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
+ }
+
+ // Set the foreground app's package name and category, so brightness can be corrected per app.
+ private void updateForegroundApp() {
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "Attempting to update foreground app");
+ }
+ // The ActivityTaskManager's lock tends to get contended, so this is done in a background
+ // thread and applied via this thread's handler synchronously.
+ BackgroundThread.getHandler().post(new Runnable() {
+ public void run() {
+ try {
+ // The foreground app is the top activity of the focused tasks stack.
+ final StackInfo info = mActivityTaskManager.getFocusedStackInfo();
+ if (info == null || info.topActivity == null) {
+ return;
+ }
+ final String packageName = info.topActivity.getPackageName();
+ // If the app didn't change, there's nothing to do. Otherwise, we have to
+ // update the category and re-apply the brightness correction.
+ if (mForegroundAppPackageName != null
+ && mForegroundAppPackageName.equals(packageName)) {
+ return;
+ }
+ mPendingForegroundAppPackageName = packageName;
+ mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
+ try {
+ ApplicationInfo app = mPackageManager.getApplicationInfo(packageName,
+ PackageManager.MATCH_ANY_USER);
+ mPendingForegroundAppCategory = app.category;
+ } catch (PackageManager.NameNotFoundException e) {
+ // Nothing to do
+ }
+ mHandler.sendEmptyMessage(MSG_UPDATE_FOREGROUND_APP_SYNC);
+ } catch (RemoteException e) {
+ // Nothing to do
+ }
+ }
+ });
+ }
+
+ private void updateForegroundAppSync() {
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "Updating foreground app: packageName=" + mPendingForegroundAppPackageName
+ + ", category=" + mPendingForegroundAppCategory);
+ }
+ mForegroundAppPackageName = mPendingForegroundAppPackageName;
+ mPendingForegroundAppPackageName = null;
+ mForegroundAppCategory = mPendingForegroundAppCategory;
+ mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
+ updateAutoBrightness(true /* sendUpdate */);
+ }
+
private final class AutomaticBrightnessHandler extends Handler {
public AutomaticBrightnessHandler(Looper looper) {
super(looper, null, true /*async*/);
@@ -764,6 +897,14 @@ class AutomaticBrightnessController {
case MSG_INVALIDATE_SHORT_TERM_MODEL:
invalidateShortTermModel();
break;
+
+ case MSG_UPDATE_FOREGROUND_APP:
+ updateForegroundApp();
+ break;
+
+ case MSG_UPDATE_FOREGROUND_APP_SYNC:
+ updateForegroundAppSync();
+ break;
}
}
}
@@ -784,6 +925,15 @@ class AutomaticBrightnessController {
}
};
+ // Call back whenever the tasks stack changes, which includes tasks being created, removed, and
+ // moving to top.
+ class TaskStackListenerImpl extends TaskStackListener {
+ @Override
+ public void onTaskStackChanged() {
+ mHandler.sendEmptyMessage(MSG_UPDATE_FOREGROUND_APP);
+ }
+ }
+
/** Callbacks to request updates to the display's power state. */
interface Callbacks {
void updateBrightness();
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index 76c191d5e9ea..9fce644d6c4b 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -17,9 +17,11 @@
package com.android.server.display;
import android.annotation.Nullable;
+import android.content.pm.ApplicationInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.BrightnessCorrection;
import android.os.PowerManager;
import android.util.MathUtils;
import android.util.Pair;
@@ -42,11 +44,12 @@ import java.util.Arrays;
*/
public abstract class BrightnessMappingStrategy {
private static final String TAG = "BrightnessMappingStrategy";
- private static final boolean DEBUG = false;
private static final float LUX_GRAD_SMOOTHING = 0.25f;
private static final float MAX_GRAD = 1.0f;
+ protected boolean mLoggingEnabled;
+
private static final Plog PLOG = Plog.createSystemPlog(TAG);
@Nullable
@@ -161,6 +164,22 @@ public abstract class BrightnessMappingStrategy {
}
/**
+ * Enable/disable logging.
+ *
+ * @param loggingEnabled
+ * Whether logging should be on/off.
+ *
+ * @return Whether the method succeeded or not.
+ */
+ public boolean setLoggingEnabled(boolean loggingEnabled) {
+ if (mLoggingEnabled == loggingEnabled) {
+ return false;
+ }
+ mLoggingEnabled = loggingEnabled;
+ return true;
+ }
+
+ /**
* Sets the {@link BrightnessConfiguration}.
*
* @param config The new configuration. If {@code null} is passed, the default configuration is
@@ -170,15 +189,33 @@ public abstract class BrightnessMappingStrategy {
public abstract boolean setBrightnessConfiguration(@Nullable BrightnessConfiguration config);
/**
- * Returns the desired brightness of the display based on the current ambient lux.
+ * Returns the desired brightness of the display based on the current ambient lux, including
+ * any context-related corrections.
*
* The returned brightness will be in the range [0, 1.0], where 1.0 is the display at max
* brightness and 0 is the display at minimum brightness.
*
* @param lux The current ambient brightness in lux.
+ * @param packageName the foreground app package name.
+ * @param category the foreground app package category.
* @return The desired brightness of the display normalized to the range [0, 1.0].
*/
- public abstract float getBrightness(float lux);
+ public abstract float getBrightness(float lux, String packageName,
+ @ApplicationInfo.Category int category);
+
+ /**
+ * Returns the desired brightness of the display based on the current ambient lux.
+ *
+ * The returned brightness wil be in the range [0, 1.0], where 1.0 is the display at max
+ * brightness and 0 is the display at minimum brightness.
+ *
+ * @param lux The current ambient brightness in lux.
+ *
+ * @return The desired brightness of the display normalized to the range [0, 1.0].
+ */
+ public float getBrightness(float lux) {
+ return getBrightness(lux, null /* packageName */, ApplicationInfo.CATEGORY_UNDEFINED);
+ }
/**
* Returns the current auto-brightness adjustment.
@@ -239,13 +276,13 @@ public abstract class BrightnessMappingStrategy {
public abstract void dump(PrintWriter pw);
- private static float normalizeAbsoluteBrightness(int brightness) {
+ protected float normalizeAbsoluteBrightness(int brightness) {
brightness = MathUtils.constrain(brightness,
PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON);
return (float) brightness / PowerManager.BRIGHTNESS_ON;
}
- private static Pair<float[], float[]> insertControlPoint(
+ private Pair<float[], float[]> insertControlPoint(
float[] luxLevels, float[] brightnessLevels, float lux, float brightness) {
final int idx = findInsertionPoint(luxLevels, lux);
final float[] newLuxLevels;
@@ -278,7 +315,7 @@ public abstract class BrightnessMappingStrategy {
* This assumes that {@code arr} is sorted. If all values in {@code arr} are greater
* than val, then it will return the length of arr as the insertion point.
*/
- private static int findInsertionPoint(float[] arr, float val) {
+ private int findInsertionPoint(float[] arr, float val) {
for (int i = 0; i < arr.length; i++) {
if (val <= arr[i]) {
return i;
@@ -287,8 +324,8 @@ public abstract class BrightnessMappingStrategy {
return arr.length;
}
- private static void smoothCurve(float[] lux, float[] brightness, int idx) {
- if (DEBUG) {
+ private void smoothCurve(float[] lux, float[] brightness, int idx) {
+ if (mLoggingEnabled) {
PLOG.logCurve("unsmoothed curve", lux, brightness);
}
float prevLux = lux[idx];
@@ -323,19 +360,19 @@ public abstract class BrightnessMappingStrategy {
prevBrightness = newBrightness;
brightness[i] = newBrightness;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.logCurve("smoothed curve", lux, brightness);
}
}
- private static float permissibleRatio(float currLux, float prevLux) {
+ private float permissibleRatio(float currLux, float prevLux) {
return MathUtils.exp(MAX_GRAD
* (MathUtils.log(currLux + LUX_GRAD_SMOOTHING)
- MathUtils.log(prevLux + LUX_GRAD_SMOOTHING)));
}
- private static float inferAutoBrightnessAdjustment(float maxGamma,
- float desiredBrightness, float currentBrightness) {
+ protected float inferAutoBrightnessAdjustment(float maxGamma, float desiredBrightness,
+ float currentBrightness) {
float adjustment = 0;
float gamma = Float.NaN;
// Extreme edge cases: use a simpler heuristic, as proper gamma correction around the edges
@@ -355,7 +392,7 @@ public abstract class BrightnessMappingStrategy {
adjustment = -MathUtils.log(gamma) / MathUtils.log(maxGamma);
}
adjustment = MathUtils.constrain(adjustment, -1, +1);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "inferAutoBrightnessAdjustment: " + maxGamma + "^" + -adjustment + "=" +
MathUtils.pow(maxGamma, -adjustment) + " == " + gamma);
Slog.d(TAG, "inferAutoBrightnessAdjustment: " + currentBrightness + "^" + gamma + "=" +
@@ -364,16 +401,16 @@ public abstract class BrightnessMappingStrategy {
return adjustment;
}
- private static Pair<float[], float[]> getAdjustedCurve(float[] lux, float[] brightness,
+ protected Pair<float[], float[]> getAdjustedCurve(float[] lux, float[] brightness,
float userLux, float userBrightness, float adjustment, float maxGamma) {
float[] newLux = lux;
float[] newBrightness = Arrays.copyOf(brightness, brightness.length);
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.logCurve("unadjusted curve", newLux, newBrightness);
}
adjustment = MathUtils.constrain(adjustment, -1, 1);
float gamma = MathUtils.pow(maxGamma, -adjustment);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "getAdjustedCurve: " + maxGamma + "^" + -adjustment + "=" +
MathUtils.pow(maxGamma, -adjustment) + " == " + gamma);
}
@@ -382,7 +419,7 @@ public abstract class BrightnessMappingStrategy {
newBrightness[i] = MathUtils.pow(newBrightness[i], gamma);
}
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.logCurve("gamma adjusted curve", newLux, newBrightness);
}
if (userLux != -1) {
@@ -390,7 +427,7 @@ public abstract class BrightnessMappingStrategy {
userBrightness);
newLux = curve.first;
newBrightness = curve.second;
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.logCurve("gamma and user adjusted curve", newLux, newBrightness);
// This is done for comparison.
curve = insertControlPoint(lux, brightness, userLux, userBrightness);
@@ -440,7 +477,7 @@ public abstract class BrightnessMappingStrategy {
mAutoBrightnessAdjustment = 0;
mUserLux = -1;
mUserBrightness = -1;
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.start("simple mapping strategy");
}
computeSpline();
@@ -452,7 +489,8 @@ public abstract class BrightnessMappingStrategy {
}
@Override
- public float getBrightness(float lux) {
+ public float getBrightness(float lux, String packageName,
+ @ApplicationInfo.Category int category) {
return mSpline.interpolate(lux);
}
@@ -467,7 +505,7 @@ public abstract class BrightnessMappingStrategy {
if (adjustment == mAutoBrightnessAdjustment) {
return false;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "setAutoBrightnessAdjustment: " + mAutoBrightnessAdjustment + " => " +
adjustment);
PLOG.start("auto-brightness adjustment");
@@ -485,7 +523,7 @@ public abstract class BrightnessMappingStrategy {
@Override
public void addUserDataPoint(float lux, float brightness) {
float unadjustedBrightness = getUnadjustedBrightness(lux);
- if (DEBUG){
+ if (mLoggingEnabled) {
Slog.d(TAG, "addUserDataPoint: (" + lux + "," + brightness + ")");
PLOG.start("add user data point")
.logPoint("user data point", lux, brightness)
@@ -494,7 +532,7 @@ public abstract class BrightnessMappingStrategy {
float adjustment = inferAutoBrightnessAdjustment(mMaxGamma,
brightness /* desiredBrightness */,
unadjustedBrightness /* currentBrightness */);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "addUserDataPoint: " + mAutoBrightnessAdjustment + " => " +
adjustment);
}
@@ -507,7 +545,7 @@ public abstract class BrightnessMappingStrategy {
@Override
public void clearUserDataPoints() {
if (mUserLux != -1) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "clearUserDataPoints: " + mAutoBrightnessAdjustment + " => 0");
PLOG.start("clear user data points")
.logPoint("user data point", mUserLux, mUserBrightness);
@@ -614,7 +652,7 @@ public abstract class BrightnessMappingStrategy {
mBacklightToNitsSpline = Spline.createSpline(normalizedBacklight, nits);
mDefaultConfig = config;
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.start("physical mapping strategy");
}
mConfig = config;
@@ -629,7 +667,7 @@ public abstract class BrightnessMappingStrategy {
if (config.equals(mConfig)) {
return false;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
PLOG.start("brightness configuration");
}
mConfig = config;
@@ -638,9 +676,17 @@ public abstract class BrightnessMappingStrategy {
}
@Override
- public float getBrightness(float lux) {
+ public float getBrightness(float lux, String packageName,
+ @ApplicationInfo.Category int category) {
float nits = mBrightnessSpline.interpolate(lux);
float backlight = mNitsToBacklightSpline.interpolate(nits);
+ // Correct the brightness according to the current application and its category, but
+ // only if no user data point is set (as this will oevrride the user setting).
+ if (mUserLux == -1) {
+ backlight = correctBrightness(backlight, packageName, category);
+ } else if (mLoggingEnabled) {
+ Slog.d(TAG, "user point set, correction not applied");
+ }
return backlight;
}
@@ -655,7 +701,7 @@ public abstract class BrightnessMappingStrategy {
if (adjustment == mAutoBrightnessAdjustment) {
return false;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "setAutoBrightnessAdjustment: " + mAutoBrightnessAdjustment + " => " +
adjustment);
PLOG.start("auto-brightness adjustment");
@@ -673,7 +719,7 @@ public abstract class BrightnessMappingStrategy {
@Override
public void addUserDataPoint(float lux, float brightness) {
float unadjustedBrightness = getUnadjustedBrightness(lux);
- if (DEBUG){
+ if (mLoggingEnabled) {
Slog.d(TAG, "addUserDataPoint: (" + lux + "," + brightness + ")");
PLOG.start("add user data point")
.logPoint("user data point", lux, brightness)
@@ -682,7 +728,7 @@ public abstract class BrightnessMappingStrategy {
float adjustment = inferAutoBrightnessAdjustment(mMaxGamma,
brightness /* desiredBrightness */,
unadjustedBrightness /* currentBrightness */);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "addUserDataPoint: " + mAutoBrightnessAdjustment + " => " +
adjustment);
}
@@ -695,7 +741,7 @@ public abstract class BrightnessMappingStrategy {
@Override
public void clearUserDataPoints() {
if (mUserLux != -1) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "clearUserDataPoints: " + mAutoBrightnessAdjustment + " => 0");
PLOG.start("clear user data points")
.logPoint("user data point", mUserLux, mUserBrightness);
@@ -758,5 +804,21 @@ public abstract class BrightnessMappingStrategy {
Spline spline = Spline.createSpline(curve.first, curve.second);
return mNitsToBacklightSpline.interpolate(spline.interpolate(lux));
}
+
+ private float correctBrightness(float brightness, String packageName, int category) {
+ if (packageName != null) {
+ BrightnessCorrection correction = mConfig.getCorrectionByPackageName(packageName);
+ if (correction != null) {
+ return correction.apply(brightness);
+ }
+ }
+ if (category != ApplicationInfo.CATEGORY_UNDEFINED) {
+ BrightnessCorrection correction = mConfig.getCorrectionByCategory(category);
+ if (correction != null) {
+ return correction.apply(brightness);
+ }
+ }
+ return brightness;
+ }
}
}
diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java
index 73d3d9591529..9223739406ee 100644
--- a/services/core/java/com/android/server/display/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/ColorDisplayService.java
@@ -18,20 +18,26 @@ package com.android.server.display;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_NIGHT_DISPLAY;
+import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_SATURATION;
+import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.Size;
import android.app.AlarmManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.database.ContentObserver;
+import android.graphics.ColorSpace;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.IColorDisplayManager;
import android.net.Uri;
@@ -39,28 +45,35 @@ import android.opengl.Matrix;
import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
+import android.os.Message;
import android.os.UserHandle;
import android.provider.Settings.Secure;
import android.provider.Settings.System;
import android.util.MathUtils;
import android.util.Slog;
+import android.view.accessibility.AccessibilityManager;
import android.view.animation.AnimationUtils;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ColorDisplayController;
+import com.android.internal.util.DumpUtils;
import com.android.server.DisplayThread;
import com.android.server.SystemService;
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
+import java.util.Arrays;
/**
* Controls the display's color transforms.
@@ -83,6 +96,10 @@ public final class ColorDisplayService extends SystemService {
Matrix.setIdentityM(MATRIX_IDENTITY, 0);
}
+ private static final int MSG_APPLY_NIGHT_DISPLAY_IMMEDIATE = 0;
+ private static final int MSG_APPLY_NIGHT_DISPLAY_ANIMATED = 1;
+ private static final int MSG_APPLY_GLOBAL_SATURATION = 2;
+
/**
* Evaluator used to animate color matrix transitions.
*/
@@ -139,30 +156,280 @@ public final class ColorDisplayService extends SystemService {
};
private final TintController mDisplayWhiteBalanceTintController = new TintController() {
-
+ // Three chromaticity coordinates per color: X, Y, and Z
+ private final int NUM_VALUES_PER_PRIMARY = 3;
+ // Four colors: red, green, blue, and white
+ private final int NUM_DISPLAY_PRIMARIES_VALS = 4 * NUM_VALUES_PER_PRIMARY;
+
+ private final Object mLock = new Object();
+ private int mTemperatureMin;
+ private int mTemperatureMax;
+ private int mTemperatureDefault;
+ private float[] mDisplayNominalWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
+ private ColorSpace.Rgb mDisplayColorSpaceRGB;
+ private float[] mChromaticAdaptationMatrix;
+ private int mCurrentColorTemperature;
+ private float[] mCurrentColorTemperatureXYZ;
+ private boolean mSetUp = false;
private float[] mMatrixDisplayWhiteBalance = new float[16];
@Override
public void setUp(Context context, boolean needsLinear) {
+ mSetUp = false;
+
+ final Resources res = getContext().getResources();
+ final String[] displayPrimariesValues = res.getStringArray(
+ R.array.config_displayWhiteBalanceDisplayPrimaries);
+ final String[] nominalWhiteValues = res.getStringArray(
+ R.array.config_displayWhiteBalanceDisplayNominalWhite);
+
+ if (displayPrimariesValues.length != NUM_DISPLAY_PRIMARIES_VALS) {
+ Slog.e(TAG, "Unexpected display white balance primaries resource length " +
+ displayPrimariesValues.length);
+ return;
+ }
+
+ if (nominalWhiteValues.length != NUM_VALUES_PER_PRIMARY) {
+ Slog.e(TAG, "Unexpected display white balance nominal white resource length " +
+ nominalWhiteValues.length);
+ return;
+ }
+
+ float[] displayRedGreenBlueXYZ =
+ new float[NUM_DISPLAY_PRIMARIES_VALS - NUM_VALUES_PER_PRIMARY];
+ float[] displayWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
+ for (int i = 0; i < displayRedGreenBlueXYZ.length; i++) {
+ displayRedGreenBlueXYZ[i] = Float.parseFloat(displayPrimariesValues[i]);
+ }
+ for (int i = 0; i < displayWhiteXYZ.length; i++) {
+ displayWhiteXYZ[i] = Float.parseFloat(
+ displayPrimariesValues[displayRedGreenBlueXYZ.length + i]);
+ }
+
+ final ColorSpace.Rgb displayColorSpaceRGB = new ColorSpace.Rgb(
+ "Display Color Space",
+ displayRedGreenBlueXYZ,
+ displayWhiteXYZ,
+ 2.2f // gamma, unused for display white balance
+ );
+
+ float[] displayNominalWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
+ for (int i = 0; i < nominalWhiteValues.length; i++) {
+ displayNominalWhiteXYZ[i] = Float.parseFloat(nominalWhiteValues[i]);
+ }
+
+ final int colorTemperatureMin = res.getInteger(
+ R.integer.config_displayWhiteBalanceColorTemperatureMin);
+ if (colorTemperatureMin <= 0) {
+ Slog.e(TAG, "display white balance minimum temperature must be greater than 0");
+ return;
+ }
+
+ final int colorTemperatureMax = res.getInteger(
+ R.integer.config_displayWhiteBalanceColorTemperatureMax);
+ if (colorTemperatureMax < colorTemperatureMin) {
+ Slog.e(TAG, "display white balance max temp must be greater or equal to min");
+ return;
+ }
+
+ final int colorTemperature = res.getInteger(
+ R.integer.config_displayWhiteBalanceColorTemperatureDefault);
+
+ synchronized (mLock) {
+ mDisplayColorSpaceRGB = displayColorSpaceRGB;
+ mDisplayNominalWhiteXYZ = displayNominalWhiteXYZ;
+ mTemperatureMin = colorTemperatureMin;
+ mTemperatureMax = colorTemperatureMax;
+ mTemperatureDefault = colorTemperature;
+ mSetUp = true;
+ }
+
+ setMatrix(mTemperatureDefault);
}
@Override
public float[] getMatrix() {
- return isActivated() ? mMatrixDisplayWhiteBalance : MATRIX_IDENTITY;
+ return mSetUp && isActivated() ? mMatrixDisplayWhiteBalance : MATRIX_IDENTITY;
}
@Override
public void setMatrix(int cct) {
+ if (!mSetUp) {
+ Slog.w(TAG, "Can't set display white balance temperature: uninitialized");
+ return;
+ }
+
+ if (cct < mTemperatureMin) {
+ Slog.w(TAG, "Requested display color temperature is below allowed minimum");
+ cct = mTemperatureMin;
+ } else if (cct > mTemperatureMax) {
+ Slog.w(TAG, "Requested display color temperature is above allowed maximum");
+ cct = mTemperatureMax;
+ }
+
+ Slog.d(TAG, "setDisplayWhiteBalanceTemperatureMatrix: cct = " + cct);
+
+ synchronized (mLock) {
+ mCurrentColorTemperature = cct;
+
+ // Adapt the display's nominal white point to match the requested CCT value
+ mCurrentColorTemperatureXYZ = ColorSpace.cctToIlluminantdXyz(cct);
+
+ mChromaticAdaptationMatrix =
+ ColorSpace.chromaticAdaptation(ColorSpace.Adaptation.BRADFORD,
+ mDisplayNominalWhiteXYZ, mCurrentColorTemperatureXYZ);
+
+ // Convert the adaptation matrix to RGB space
+ float[] result = ColorSpace.mul3x3(mChromaticAdaptationMatrix,
+ mDisplayColorSpaceRGB.getTransform());
+ result = ColorSpace.mul3x3(mDisplayColorSpaceRGB.getInverseTransform(), result);
+
+ // Normalize the transform matrix to peak white value in RGB space
+ final float adaptedMaxR = result[0] + result[3] + result[6];
+ final float adaptedMaxG = result[1] + result[4] + result[7];
+ final float adaptedMaxB = result[2] + result[5] + result[8];
+ final float denum = Math.max(Math.max(adaptedMaxR, adaptedMaxG), adaptedMaxB);
+ for (int i = 0; i < result.length; i++) {
+ result[i] /= denum;
+ }
+
+ Matrix.setIdentityM(mMatrixDisplayWhiteBalance, 0);
+ java.lang.System.arraycopy(result, 0, mMatrixDisplayWhiteBalance, 0, 3);
+ java.lang.System.arraycopy(result, 3, mMatrixDisplayWhiteBalance, 4, 3);
+ java.lang.System.arraycopy(result, 6, mMatrixDisplayWhiteBalance, 8, 3);
+ }
}
@Override
public int getLevel() {
return LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE;
}
+
+ /**
+ * Format a given matrix into a string.
+ *
+ * @param matrix the matrix to format
+ * @param cols number of columns in the matrix
+ */
+ private String matrixToString(float[] matrix, int cols) {
+ if (matrix == null || cols <= 0) {
+ Slog.e(TAG, "Invalid arguments when formatting matrix to string");
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder("");
+ for (int i = 0; i < matrix.length; i++) {
+ if (i % cols == 0) {
+ sb.append("\n ");
+ }
+ sb.append(String.format("%9.6f ", matrix[i]));
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public void dump(PrintWriter pw) {
+ synchronized (mLock) {
+ pw.println("ColorDisplayService");
+ pw.println(" mSetUp = " + mSetUp);
+
+ if (!mSetUp) {
+ return;
+ }
+
+ pw.println(" isActivated = " + isActivated());
+ pw.println(" mTemperatureMin = " + mTemperatureMin);
+ pw.println(" mTemperatureMax = " + mTemperatureMax);
+ pw.println(" mTemperatureDefault = " + mTemperatureDefault);
+ pw.println(" mCurrentColorTemperature = " + mCurrentColorTemperature);
+ pw.println(" mCurrentColorTemperatureXYZ = " +
+ matrixToString(mCurrentColorTemperatureXYZ, 3));
+ pw.println(" mDisplayColorSpaceRGB RGB-to-XYZ = " +
+ matrixToString(mDisplayColorSpaceRGB.getTransform(), 3));
+ pw.println(" mChromaticAdaptationMatrix = " +
+ matrixToString(mChromaticAdaptationMatrix, 3));
+ pw.println(" mDisplayColorSpaceRGB XYZ-to-RGB = " +
+ matrixToString(mDisplayColorSpaceRGB.getInverseTransform(), 3));
+ pw.println(" mMatrixDisplayWhiteBalance = " +
+ matrixToString(mMatrixDisplayWhiteBalance, 4));
+ }
+ }
+ };
+
+ private final TintController mGlobalSaturationTintController = new TintController() {
+
+ private float[] mMatrixGlobalSaturation = new float[16];
+
+ @Override
+ public void setUp(Context context, boolean needsLinear) {
+ }
+
+ @Override
+ public float[] getMatrix() {
+ return Arrays.copyOf(mMatrixGlobalSaturation, mMatrixGlobalSaturation.length);
+ }
+
+ @Override
+ public void setMatrix(int saturationLevel) {
+ if (saturationLevel < 0) {
+ saturationLevel = 0;
+ } else if (saturationLevel > 100) {
+ saturationLevel = 100;
+ }
+ Slog.d(TAG, "Setting saturation level: " + saturationLevel);
+
+ if (saturationLevel == 100) {
+ Matrix.setIdentityM(mMatrixGlobalSaturation, 0);
+ } else {
+ float saturation = saturationLevel * 0.1f;
+ float desaturation = 1.0f - saturation;
+ float[] luminance = {0.231f * desaturation, 0.715f * desaturation,
+ 0.072f * desaturation};
+ mMatrixGlobalSaturation[0] = luminance[0] + saturation;
+ mMatrixGlobalSaturation[1] = luminance[0];
+ mMatrixGlobalSaturation[2] = luminance[0];
+ mMatrixGlobalSaturation[4] = luminance[1];
+ mMatrixGlobalSaturation[5] = luminance[1] + saturation;
+ mMatrixGlobalSaturation[6] = luminance[1];
+ mMatrixGlobalSaturation[8] = luminance[2];
+ mMatrixGlobalSaturation[9] = luminance[2];
+ mMatrixGlobalSaturation[10] = luminance[2] + saturation;
+ }
+ }
+
+ @Override
+ public int getLevel() {
+ return LEVEL_COLOR_MATRIX_SATURATION;
+ }
+ };
+
+ /**
+ * Matrix and offset used for converting color to grayscale.
+ */
+ private static final float[] MATRIX_GRAYSCALE = new float[]{
+ .2126f, .2126f, .2126f, 0f,
+ .7152f, .7152f, .7152f, 0f,
+ .0722f, .0722f, .0722f, 0f,
+ 0f, 0f, 0f, 1f
+ };
+
+ /**
+ * Matrix and offset used for luminance inversion. Represents a transform from RGB to YIQ color
+ * space, rotation around the Y axis by 180 degrees, transform back to RGB color space, and
+ * subtraction from 1. The last row represents a non-multiplied addition, see surfaceflinger's
+ * ProgramCache for full implementation details.
+ */
+ private static final float[] MATRIX_INVERT_COLOR = new float[] {
+ 0.402f, -0.598f, -0.599f, 0f,
+ -1.174f, -0.174f, -1.175f, 0f,
+ -0.228f, -0.228f, 0.772f, 0f,
+ 1f, 1f, 1f, 1f
};
private final Handler mHandler;
+ private final AppSaturationController mAppSaturationController = new AppSaturationController();
+
private int mCurrentUser = UserHandle.USER_NULL;
private ContentObserver mUserSetupObserver;
private boolean mBootCompleted;
@@ -174,11 +441,9 @@ public final class ColorDisplayService extends SystemService {
private NightDisplayAutoMode mNightDisplayAutoMode;
- private Integer mDisplayWhiteBalanceColorTemperature;
-
public ColorDisplayService(Context context) {
super(context);
- mHandler = new Handler(Looper.getMainLooper());
+ mHandler = new TintHandler(Looper.getMainLooper());
}
@Override
@@ -302,12 +567,19 @@ public final class ColorDisplayService extends SystemService {
case System.DISPLAY_COLOR_MODE:
onDisplayColorModeChanged(mNightDisplayController.getColorMode());
break;
- case Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
case Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED:
- onAccessibilityTransformChanged();
+ onAccessibilityInversionChanged();
+ onAccessibilityActivated();
+ break;
+ case Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
+ onAccessibilityDaltonizerChanged();
+ onAccessibilityActivated();
+ break;
+ case Secure.ACCESSIBILITY_DISPLAY_DALTONIZER:
+ onAccessibilityDaltonizerChanged();
break;
case Secure.DISPLAY_WHITE_BALANCE_ENABLED:
- onDisplayWhiteBalanceEnabled(isDisplayWhiteBalanceSettingEnabled());
+ updateDisplayWhiteBalanceStatus();
break;
}
}
@@ -333,6 +605,9 @@ public final class ColorDisplayService extends SystemService {
cr.registerContentObserver(
Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED),
false /* notifyForDescendants */, mContentObserver, mCurrentUser);
+ cr.registerContentObserver(
+ Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER),
+ false /* notifyForDescendants */, mContentObserver, mCurrentUser);
cr.registerContentObserver(Secure.getUriFor(Secure.DISPLAY_WHITE_BALANCE_ENABLED),
false /* notifyForDescendants */, mContentObserver, mCurrentUser);
@@ -360,14 +635,9 @@ public final class ColorDisplayService extends SystemService {
if (ColorDisplayManager.isDisplayWhiteBalanceAvailable(getContext())) {
// Prepare the display white balance transform matrix.
- mDisplayWhiteBalanceTintController
- .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix());
- if (mDisplayWhiteBalanceColorTemperature != null) {
- mDisplayWhiteBalanceTintController
- .setMatrix(mDisplayWhiteBalanceColorTemperature);
- }
+ mDisplayWhiteBalanceTintController.setUp(getContext(), true /* needsLinear */);
- onDisplayWhiteBalanceEnabled(isDisplayWhiteBalanceSettingEnabled());
+ updateDisplayWhiteBalanceStatus();
}
}
@@ -404,6 +674,8 @@ public final class ColorDisplayService extends SystemService {
mNightDisplayAutoMode.onActivated(activated);
}
+ updateDisplayWhiteBalanceStatus();
+
applyTint(mNightDisplayTintController, false);
}
}
@@ -460,20 +732,49 @@ public final class ColorDisplayService extends SystemService {
.setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));
mNightDisplayTintController.setMatrix(mNightDisplayController.getColorTemperature());
- mDisplayWhiteBalanceTintController
- .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));
- if (mDisplayWhiteBalanceColorTemperature != null) {
- mDisplayWhiteBalanceTintController.setMatrix(mDisplayWhiteBalanceColorTemperature);
- }
+ updateDisplayWhiteBalanceStatus();
final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
dtm.setColorMode(mode, mNightDisplayTintController.getMatrix());
}
- private void onAccessibilityTransformChanged() {
+ private void onAccessibilityActivated() {
onDisplayColorModeChanged(mNightDisplayController.getColorMode());
}
+ /**
+ * Apply the accessibility daltonizer transform based on the settings value.
+ */
+ private void onAccessibilityDaltonizerChanged() {
+ final boolean enabled = Secure.getIntForUser(getContext().getContentResolver(),
+ Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, mCurrentUser) != 0;
+ final int daltonizerMode = enabled ? Secure.getIntForUser(getContext().getContentResolver(),
+ Secure.ACCESSIBILITY_DISPLAY_DALTONIZER,
+ AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY, mCurrentUser)
+ : AccessibilityManager.DALTONIZER_DISABLED;
+
+ final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
+ if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
+ // Monochromacy isn't supported by the native Daltonizer implementation; use grayscale.
+ dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE,
+ MATRIX_GRAYSCALE);
+ dtm.setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ } else {
+ dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE, null);
+ dtm.setDaltonizerMode(daltonizerMode);
+ }
+ }
+
+ /**
+ * Apply the accessibility inversion transform based on the settings value.
+ */
+ private void onAccessibilityInversionChanged() {
+ final boolean enabled = Secure.getIntForUser(getContext().getContentResolver(),
+ Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, mCurrentUser) != 0;
+ final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
+ dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_INVERT_COLOR,
+ enabled ? MATRIX_INVERT_COLOR : null);
+ }
/**
* Applies current color temperature matrix, or removes it if deactivated.
@@ -555,10 +856,15 @@ public final class ColorDisplayService extends SystemService {
return ldt.isBefore(compareTime) ? ldt.plusDays(1) : ldt;
}
- private void onDisplayWhiteBalanceEnabled(boolean enabled) {
- mDisplayWhiteBalanceTintController.setActivated(enabled);
- if (mDisplayWhiteBalanceListener != null) {
- mDisplayWhiteBalanceListener.onDisplayWhiteBalanceStatusChanged(enabled);
+ private void updateDisplayWhiteBalanceStatus() {
+ boolean oldActivated = mDisplayWhiteBalanceTintController.isActivated();
+ mDisplayWhiteBalanceTintController.setActivated(isDisplayWhiteBalanceSettingEnabled() &&
+ !mNightDisplayTintController.isActivated() &&
+ DisplayTransformManager.needsLinearColorMatrix());
+ boolean activated = mDisplayWhiteBalanceTintController.isActivated();
+
+ if (mDisplayWhiteBalanceListener != null && oldActivated != activated) {
+ mDisplayWhiteBalanceListener.onDisplayWhiteBalanceStatusChanged(activated);
}
}
@@ -596,6 +902,22 @@ public final class ColorDisplayService extends SystemService {
return LocalDateTime.MIN;
}
+ private boolean setAppSaturationLevelInternal(String packageName, int saturationLevel) {
+ return mAppSaturationController
+ .setSaturationLevel(packageName, mCurrentUser, saturationLevel);
+ }
+
+ private void dumpInternal(PrintWriter pw) {
+ pw.println("COLOR DISPLAY MANAGER dumpsys (color_display)");
+ pw.println("Night Display:");
+ if (ColorDisplayManager.isNightDisplayAvailable(getContext())) {
+ pw.println(" Activated: " + mNightDisplayTintController.isActivated());
+ } else {
+ pw.println(" Not available");
+ }
+ mAppSaturationController.dump(pw);
+ }
+
private abstract class NightDisplayAutoMode {
public abstract void onActivated(boolean activated);
@@ -840,6 +1162,12 @@ public final class ColorDisplayService extends SystemService {
}
/**
+ * Dump debug information.
+ */
+ public void dump(PrintWriter pw) {
+ }
+
+ /**
* Set up any constants needed for computing the matrix.
*/
public abstract void setUp(Context context, boolean needsLinear);
@@ -873,11 +1201,10 @@ public final class ColorDisplayService extends SystemService {
*/
public boolean setDisplayWhiteBalanceColorTemperature(int cct) {
// Update the transform matrix even if it can't be applied.
- mDisplayWhiteBalanceColorTemperature = cct;
mDisplayWhiteBalanceTintController.setMatrix(cct);
if (mDisplayWhiteBalanceTintController.isActivated()) {
- applyTint(mDisplayWhiteBalanceTintController, true);
+ applyTint(mDisplayWhiteBalanceTintController, false);
return true;
}
return false;
@@ -890,6 +1217,20 @@ public final class ColorDisplayService extends SystemService {
mDisplayWhiteBalanceListener = listener;
return mDisplayWhiteBalanceTintController.isActivated();
}
+
+ public void dump(PrintWriter pw) {
+ mDisplayWhiteBalanceTintController.dump(pw);
+ }
+
+ /**
+ * Adds a {@link WeakReference<ColorTransformController>} for a newly started activity, and
+ * invokes {@link ColorTransformController#applyAppSaturation(float[], float[])} if needed.
+ */
+ public boolean attachColorTransformController(String packageName, int uid,
+ WeakReference<ColorTransformController> controller) {
+ return mAppSaturationController
+ .addColorTransformController(packageName, uid, controller);
+ }
}
/**
@@ -904,6 +1245,32 @@ public final class ColorDisplayService extends SystemService {
void onDisplayWhiteBalanceStatusChanged(boolean enabled);
}
+ private final class TintHandler extends Handler {
+
+ TintHandler(Looper looper) {
+ super(looper, null, true /* async */);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_APPLY_GLOBAL_SATURATION:
+ mGlobalSaturationTintController.setMatrix(msg.arg1);
+ applyTint(mGlobalSaturationTintController, false);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Interface for applying transforms to a given AppWindow.
+ */
+ public interface ColorTransformController {
+
+ /** Apply the given saturation (grayscale) matrix to the associated AppWindow. */
+ void applyAppSaturation(@Size(9) float[] matrix, @Size(3) float[] translation);
+ }
+
private final class BinderService extends IColorDisplayManager.Stub {
@Override
@@ -915,5 +1282,52 @@ public final class ColorDisplayService extends SystemService {
Binder.restoreCallingIdentity(token);
}
}
+
+ @Override
+ public boolean setSaturationLevel(int level) {
+ final boolean hasTransformsPermission = getContext()
+ .checkCallingPermission(Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
+ == PackageManager.PERMISSION_GRANTED;
+ final boolean hasLegacyPermission = getContext()
+ .checkCallingPermission(Manifest.permission.CONTROL_DISPLAY_SATURATION)
+ == PackageManager.PERMISSION_GRANTED;
+ if (!hasTransformsPermission && !hasLegacyPermission) {
+ throw new SecurityException("Permission required to set display saturation level");
+ }
+ final long token = Binder.clearCallingIdentity();
+ try {
+ final Message message = mHandler.obtainMessage(MSG_APPLY_GLOBAL_SATURATION);
+ message.arg1 = level;
+ mHandler.sendMessage(message);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean setAppSaturationLevel(String packageName, int level) {
+ getContext().enforceCallingPermission(
+ Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS,
+ "Permission required to set display saturation level");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return setAppSaturationLevelInternal(packageName, level);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ dumpInternal(pw);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index b17a3369ff4b..4d3e072cbfcf 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -95,6 +95,7 @@ import com.android.server.SystemService;
import com.android.server.UiThread;
import com.android.server.wm.SurfaceAnimationThread;
import com.android.server.wm.WindowManagerInternal;
+import com.android.server.display.ColorDisplayService.ColorDisplayServiceInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -725,27 +726,6 @@ public final class DisplayManagerService extends SystemService {
}
}
- private void setSaturationLevelInternal(float level) {
- if (level < 0 || level > 1) {
- throw new IllegalArgumentException("Saturation level must be between 0 and 1");
- }
- float[] matrix = (level == 1.0f ? null : computeSaturationMatrix(level));
- DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
- dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_SATURATION, matrix);
- }
-
- private static float[] computeSaturationMatrix(float saturation) {
- float desaturation = 1.0f - saturation;
- float[] luminance = {0.231f * desaturation, 0.715f * desaturation, 0.072f * desaturation};
- float[] matrix = {
- luminance[0] + saturation, luminance[0], luminance[0], 0,
- luminance[1], luminance[1] + saturation, luminance[1], 0,
- luminance[2], luminance[2], luminance[2] + saturation, 0,
- 0, 0, 0, 1
- };
- return matrix;
- }
-
private int createVirtualDisplayInternal(IVirtualDisplayCallback callback,
IMediaProjection projection, int callingUid, String packageName, String name, int width,
int height, int densityDpi, Surface surface, int flags, String uniqueId) {
@@ -813,6 +793,16 @@ public final class DisplayManagerService extends SystemService {
}
}
+ private void setVirtualDisplayStateInternal(IBinder appToken, boolean isOn) {
+ synchronized (mSyncRoot) {
+ if (mVirtualDisplayAdapter == null) {
+ return;
+ }
+
+ mVirtualDisplayAdapter.setVirtualDisplayStateLocked(appToken, isOn);
+ }
+ }
+
private void registerDefaultDisplayAdapters() {
// Register default display adapters.
synchronized (mSyncRoot) {
@@ -1490,6 +1480,13 @@ public final class DisplayManagerService extends SystemService {
pw.println();
mPersistentDataStore.dump(pw);
+
+ final ColorDisplayServiceInternal cds = LocalServices.getService(
+ ColorDisplayServiceInternal.class);
+ if (cds != null) {
+ pw.println();
+ cds.dump(pw);
+ }
}
}
@@ -1846,19 +1843,6 @@ public final class DisplayManagerService extends SystemService {
}
@Override // Binder call
- public void setSaturationLevel(float level) {
- mContext.enforceCallingOrSelfPermission(
- Manifest.permission.CONTROL_DISPLAY_SATURATION,
- "Permission required to set display saturation level");
- final long token = Binder.clearCallingIdentity();
- try {
- setSaturationLevelInternal(level);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override // Binder call
public int createVirtualDisplay(IVirtualDisplayCallback callback,
IMediaProjection projection, String packageName, String name,
int width, int height, int densityDpi, Surface surface, int flags,
@@ -1966,6 +1950,16 @@ public final class DisplayManagerService extends SystemService {
}
@Override // Binder call
+ public void setVirtualDisplayState(IVirtualDisplayCallback callback, boolean isOn) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ setVirtualDisplayStateInternal(callback.asBinder(), isOn);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
@@ -2154,6 +2148,14 @@ public final class DisplayManagerService extends SystemService {
mContext.getPackageName());
}
+ void setAutoBrightnessLoggingEnabled(boolean enabled) {
+ if (mDisplayPowerController != null) {
+ synchronized (mSyncRoot) {
+ mDisplayPowerController.setAutoBrightnessLoggingEnabled(enabled);
+ }
+ }
+ }
+
private boolean validatePackageName(int uid, String packageName) {
if (packageName != null) {
String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
index 27cad1eece09..abbfc7b18f94 100644
--- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
+++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
@@ -17,14 +17,9 @@
package com.android.server.display;
import android.content.Intent;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.ShellCallback;
import android.os.ShellCommand;
-import android.util.Slog;
import java.io.PrintWriter;
-import java.lang.NumberFormatException;
class DisplayManagerShellCommand extends ShellCommand {
private static final String TAG = "DisplayManagerShellCommand";
@@ -46,6 +41,10 @@ class DisplayManagerShellCommand extends ShellCommand {
return setBrightness();
case "reset-brightness-configuration":
return resetBrightnessConfiguration();
+ case "ab-logging-enable":
+ return setAutoBrightnessLoggingEnabled(true);
+ case "ab-logging-disable":
+ return setAutoBrightnessLoggingEnabled(false);
default:
return handleDefaultCommands(cmd);
}
@@ -62,6 +61,10 @@ class DisplayManagerShellCommand extends ShellCommand {
pw.println(" Sets the current brightness to BRIGHTNESS (a number between 0 and 1).");
pw.println(" reset-brightness-configuration");
pw.println(" Reset the brightness to its default configuration.");
+ pw.println(" ab-logging-enable");
+ pw.println(" Enable auto-brightness logging.");
+ pw.println(" ab-logging-disable");
+ pw.println(" Disable auto-brightness logging.");
pw.println();
Intent.printIntentArgsHelp(pw , "");
}
@@ -89,4 +92,9 @@ class DisplayManagerShellCommand extends ShellCommand {
mService.resetBrightnessConfiguration();
return 0;
}
+
+ private int setAutoBrightnessLoggingEnabled(boolean enabled) {
+ mService.setAutoBrightnessLoggingEnabled(enabled);
+ return 0;
+ }
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 249270bfda7e..db3928ec5fde 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -461,6 +461,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
+ initialLightSensorRate + ") to be less than or equal to "
+ "config_autoBrightnessLightSensorRate (" + lightSensorRate + ").");
}
+ int shortTermModelTimeout = resources.getInteger(
+ com.android.internal.R.integer.config_autoBrightnessShortTermModelTimeout);
mBrightnessMapper = BrightnessMappingStrategy.create(resources);
if (mBrightnessMapper != null) {
@@ -470,7 +472,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds,
- screenBrightnessThresholds);
+ screenBrightnessThresholds, shortTermModelTimeout,
+ context.getPackageManager());
} else {
mUseSoftwareAutoBrightnessConfig = false;
}
@@ -1836,4 +1839,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mHandler.sendMessage(msg);
}
}
+
+ void setAutoBrightnessLoggingEnabled(boolean enabled) {
+ if (mAutomaticBrightnessController != null) {
+ mAutomaticBrightnessController.setLoggingEnabled(enabled);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java
index 89cef621a55d..9aec43b6eaed 100644
--- a/services/core/java/com/android/server/display/PersistentDataStore.java
+++ b/services/core/java/com/android/server/display/PersistentDataStore.java
@@ -16,13 +16,6 @@
package com.android.server.display;
-import com.android.internal.util.FastXmlSerializer;
-import com.android.internal.util.XmlUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
import android.annotation.Nullable;
import android.graphics.Point;
import android.hardware.display.BrightnessConfiguration;
@@ -30,13 +23,20 @@ import android.hardware.display.WifiDisplay;
import android.util.AtomicFile;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.Pair;
import android.util.SparseLongArray;
import android.util.TimeUtils;
import android.util.Xml;
import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FastXmlSerializer;
+import com.android.internal.util.XmlUtils;
+
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -50,12 +50,9 @@ import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Objects;
-import libcore.io.IoUtils;
-
/**
* Manages persistent state recorded by the display manager service as an XML file.
* Caller must acquire lock on the data store before accessing it.
@@ -110,14 +107,9 @@ final class PersistentDataStore {
private static final String TAG_BRIGHTNESS_CONFIGURATIONS = "brightness-configurations";
private static final String TAG_BRIGHTNESS_CONFIGURATION = "brightness-configuration";
- private static final String TAG_BRIGHTNESS_CURVE = "brightness-curve";
- private static final String TAG_BRIGHTNESS_POINT = "brightness-point";
private static final String ATTR_USER_SERIAL = "user-serial";
private static final String ATTR_PACKAGE_NAME = "package-name";
private static final String ATTR_TIME_STAMP = "timestamp";
- private static final String ATTR_LUX = "lux";
- private static final String ATTR_NITS = "nits";
- private static final String ATTR_DESCRIPTION = "description";
// Remembered Wifi display devices.
private ArrayList<WifiDisplay> mRememberedWifiDisplays = new ArrayList<WifiDisplay>();
@@ -646,7 +638,8 @@ final class PersistentDataStore {
}
try {
- BrightnessConfiguration config = loadConfigurationFromXml(parser);
+ BrightnessConfiguration config =
+ BrightnessConfiguration.loadFromXml(parser);
if (userSerial >= 0 && config != null) {
mConfigurations.put(userSerial, config);
if (timeStamp != -1) {
@@ -663,56 +656,6 @@ final class PersistentDataStore {
}
}
- private static BrightnessConfiguration loadConfigurationFromXml(XmlPullParser parser)
- throws IOException, XmlPullParserException {
- final int outerDepth = parser.getDepth();
- String description = null;
- Pair<float[], float[]> curve = null;
- while (XmlUtils.nextElementWithin(parser, outerDepth)) {
- if (TAG_BRIGHTNESS_CURVE.equals(parser.getName())) {
- description = parser.getAttributeValue(null, ATTR_DESCRIPTION);
- curve = loadCurveFromXml(parser);
- }
- }
- if (curve == null) {
- return null;
- }
- final BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(
- curve.first, curve.second);
- builder.setDescription(description);
- return builder.build();
- }
-
- private static Pair<float[], float[]> loadCurveFromXml(XmlPullParser parser)
- throws IOException, XmlPullParserException {
- final int outerDepth = parser.getDepth();
- List<Float> luxLevels = new ArrayList<>();
- List<Float> nitLevels = new ArrayList<>();
- while (XmlUtils.nextElementWithin(parser, outerDepth)) {
- if (TAG_BRIGHTNESS_POINT.equals(parser.getName())) {
- luxLevels.add(loadFloat(parser.getAttributeValue(null, ATTR_LUX)));
- nitLevels.add(loadFloat(parser.getAttributeValue(null, ATTR_NITS)));
- }
- }
- final int N = luxLevels.size();
- float[] lux = new float[N];
- float[] nits = new float[N];
- for (int i = 0; i < N; i++) {
- lux[i] = luxLevels.get(i);
- nits[i] = nitLevels.get(i);
- }
- return Pair.create(lux, nits);
- }
-
- private static float loadFloat(String val) {
- try {
- return Float.parseFloat(val);
- } catch (NullPointerException | NumberFormatException e) {
- Slog.e(TAG, "Failed to parse float loading brightness config", e);
- return Float.NEGATIVE_INFINITY;
- }
- }
-
public void saveToXml(XmlSerializer serializer) throws IOException {
for (int i = 0; i < mConfigurations.size(); i++) {
final int userSerial = mConfigurations.keyAt(i);
@@ -728,27 +671,11 @@ final class PersistentDataStore {
if (timestamp != -1) {
serializer.attribute(null, ATTR_TIME_STAMP, Long.toString(timestamp));
}
- saveConfigurationToXml(serializer, config);
+ config.saveToXml(serializer);
serializer.endTag(null, TAG_BRIGHTNESS_CONFIGURATION);
}
}
- private static void saveConfigurationToXml(XmlSerializer serializer,
- BrightnessConfiguration config) throws IOException {
- serializer.startTag(null, TAG_BRIGHTNESS_CURVE);
- if (config.getDescription() != null) {
- serializer.attribute(null, ATTR_DESCRIPTION, config.getDescription());
- }
- final Pair<float[], float[]> curve = config.getCurve();
- for (int i = 0; i < curve.first.length; i++) {
- serializer.startTag(null, TAG_BRIGHTNESS_POINT);
- serializer.attribute(null, ATTR_LUX, Float.toString(curve.first[i]));
- serializer.attribute(null, ATTR_NITS, Float.toString(curve.second[i]));
- serializer.endTag(null, TAG_BRIGHTNESS_POINT);
- }
- serializer.endTag(null, TAG_BRIGHTNESS_CURVE);
- }
-
public void dump(final PrintWriter pw, final String prefix) {
for (int i = 0; i < mConfigurations.size(); i++) {
final int userSerial = mConfigurations.keyAt(i);
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index 5aa585fcad75..1ca8dd3af4e2 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -147,6 +147,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
return device;
}
+ void setVirtualDisplayStateLocked(IBinder appToken, boolean isOn) {
+ VirtualDisplayDevice device = mVirtualDisplayDevices.get(appToken);
+ if (device != null) {
+ device.setDisplayState(isOn);
+ }
+ }
+
/**
* Returns the next unique index for the uniqueIdPrefix
*/
@@ -206,6 +213,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
private int mPendingChanges;
private int mUniqueIndex;
private Display.Mode mMode;
+ private boolean mIsDisplayOn;
public VirtualDisplayDevice(IBinder displayToken, IBinder appToken,
int ownerUid, String ownerPackageName,
@@ -226,6 +234,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
mDisplayState = Display.STATE_UNKNOWN;
mPendingChanges |= PENDING_SURFACE_CHANGE;
mUniqueIndex = uniqueIndex;
+ mIsDisplayOn = surface != null;
}
@Override
@@ -304,6 +313,14 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
}
}
+ void setDisplayState(boolean isOn) {
+ if (mIsDisplayOn != isOn) {
+ mIsDisplayOn = isOn;
+ mInfo = null;
+ sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
+ }
+ }
+
public void stopLocked() {
setSurfaceLocked(null);
mStopped = true;
@@ -375,7 +392,9 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
mInfo.type = Display.TYPE_VIRTUAL;
mInfo.touch = ((mFlags & VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH) == 0) ?
DisplayDeviceInfo.TOUCH_NONE : DisplayDeviceInfo.TOUCH_VIRTUAL;
- mInfo.state = mSurface != null ? Display.STATE_ON : Display.STATE_OFF;
+
+ mInfo.state = mIsDisplayOn ? Display.STATE_ON : Display.STATE_OFF;
+
mInfo.ownerUid = mOwnerUid;
mInfo.ownerPackageName = mOwnerPackageName;
}
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index ba05b49b7698..bffa8f486db7 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -18,13 +18,6 @@ package com.android.server.dreams;
import static android.Manifest.permission.BIND_DREAM_SERVICE;
-import com.android.internal.hardware.AmbientDisplayConfiguration;
-import com.android.internal.util.DumpUtils;
-import com.android.server.FgThread;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-
-import android.Manifest;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -53,6 +46,12 @@ import android.service.dreams.IDreamManager;
import android.util.Slog;
import android.view.Display;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.internal.util.DumpUtils;
+import com.android.server.FgThread;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -84,6 +83,7 @@ public final class DreamManagerService extends SystemService {
private boolean mCurrentDreamCanDoze;
private boolean mCurrentDreamIsDozing;
private boolean mCurrentDreamIsWaking;
+ private boolean mForceAmbientDisplayEnabled;
private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN;
private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
@@ -139,6 +139,7 @@ public final class DreamManagerService extends SystemService {
pw.println("mCurrentDreamCanDoze=" + mCurrentDreamCanDoze);
pw.println("mCurrentDreamIsDozing=" + mCurrentDreamIsDozing);
pw.println("mCurrentDreamIsWaking=" + mCurrentDreamIsWaking);
+ pw.println("mForceAmbientDisplayEnabled=" + mForceAmbientDisplayEnabled);
pw.println("mCurrentDreamDozeScreenState="
+ Display.stateToString(mCurrentDreamDozeScreenState));
pw.println("mCurrentDreamDozeScreenBrightness=" + mCurrentDreamDozeScreenBrightness);
@@ -257,6 +258,16 @@ public final class DreamManagerService extends SystemService {
}
}
+ private void forceAmbientDisplayEnabledInternal(boolean enabled) {
+ if (DEBUG) {
+ Slog.d(TAG, "Force ambient display enabled: " + enabled);
+ }
+
+ synchronized (mLock) {
+ mForceAmbientDisplayEnabled = enabled;
+ }
+ }
+
private ComponentName chooseDreamForUser(boolean doze, int userId) {
if (doze) {
ComponentName dozeComponent = getDozeComponent(userId);
@@ -328,7 +339,7 @@ public final class DreamManagerService extends SystemService {
}
private ComponentName getDozeComponent(int userId) {
- if (mDozeConfig.enabled(userId)) {
+ if (mForceAmbientDisplayEnabled || mDozeConfig.enabled(userId)) {
return ComponentName.unflattenFromString(mDozeConfig.ambientDisplayComponent());
} else {
return null;
@@ -631,6 +642,18 @@ public final class DreamManagerService extends SystemService {
Binder.restoreCallingIdentity(ident);
}
}
+
+ @Override // Binder call
+ public void forceAmbientDisplayEnabled(boolean enabled) {
+ checkPermission(android.Manifest.permission.DEVICE_POWER);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ forceAmbientDisplayEnabledInternal(enabled);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
private final class LocalService extends DreamManagerInternal {
diff --git a/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java
index ed17de5e8c35..137833cc9551 100644
--- a/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java
@@ -21,14 +21,15 @@ import android.hardware.tv.cec.V1_0.SendMessageResult;
* Feature action that handles Audio Return Channel initiated by AVR devices.
*/
public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction {
- // TODO(shubang): add tests
-
// State in which waits for ARC response.
private static final int STATE_WAITING_FOR_INITIATE_ARC_RESPONSE = 1;
private static final int STATE_ARC_INITIATED = 2;
// the required maximum response time specified in CEC 9.2
private static final int TIMEOUT_MS = 1000;
+ private static final int MAX_RETRY_COUNT = 5;
+
+ private int mSendRequestActiveSourceRetryCount = 0;
ArcInitiationActionFromAvr(HdmiCecLocalDevice source) {
super(source);
@@ -50,13 +51,25 @@ public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction {
}
switch (cmd.getOpcode()) {
case Constants.MESSAGE_FEATURE_ABORT:
+ if ((cmd.getParams()[0] & 0xFF) == Constants.MESSAGE_INITIATE_ARC) {
+ audioSystem().setArcStatus(false);
+ finish();
+ return true;
+ } else {
+ return false;
+ }
case Constants.MESSAGE_REPORT_ARC_TERMINATED:
audioSystem().setArcStatus(false);
finish();
return true;
case Constants.MESSAGE_REPORT_ARC_INITIATED:
mState = STATE_ARC_INITIATED;
- finish();
+ if (audioSystem().getActiveSource().physicalAddress != getSourcePath()
+ && audioSystem().isSystemAudioActivated()) {
+ sendRequestActiveSource();
+ } else {
+ finish();
+ }
return true;
}
return false;
@@ -91,4 +104,19 @@ public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction {
finish();
}
+ protected void sendRequestActiveSource() {
+ sendCommand(HdmiCecMessageBuilder.buildRequestActiveSource(getSourceAddress()),
+ result -> {
+ if (result != SendMessageResult.SUCCESS) {
+ if (mSendRequestActiveSourceRetryCount < MAX_RETRY_COUNT) {
+ mSendRequestActiveSourceRetryCount++;
+ sendRequestActiveSource();
+ } else {
+ finish();
+ }
+ } else {
+ finish();
+ }
+ });
+ }
}
diff --git a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
index 7e7332180f8a..eb7c0cd61132 100644
--- a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java
@@ -50,6 +50,9 @@ public class ArcTerminationActionFromAvr extends HdmiCecFeatureAction {
case Constants.MESSAGE_REPORT_ARC_TERMINATED:
mState = STATE_ARC_TERMINATED;
audioSystem().setArcStatus(false);
+ if (audioSystem().getLocalActivePort() == Constants.CEC_SWITCH_ARC) {
+ audioSystem().routeToInputFromPortId(audioSystem().getRoutingPort());
+ }
finish();
return true;
}
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 1f0f94a7bf0b..297a418fa5e3 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -17,6 +17,7 @@
package com.android.server.hdmi;
import android.annotation.IntDef;
+import android.annotation.StringDef;
import android.hardware.hdmi.HdmiDeviceInfo;
import java.lang.annotation.Retention;
@@ -222,6 +223,15 @@ final class Constants {
static final int AUDIO_CODEC_WMAPRO = 0xE; // Support WMA-Pro
static final int AUDIO_CODEC_MAX = 0xF;
+ @StringDef({
+ AUDIO_DEVICE_ARC_IN,
+ AUDIO_DEVICE_SPDIF,
+ })
+ public @interface AudioDevice {}
+
+ static final String AUDIO_DEVICE_ARC_IN = "ARC_IN";
+ static final String AUDIO_DEVICE_SPDIF = "SPDIF";
+
// Bit mask used to get the routing path of the top level device.
// When &'d with the path 1.2.2.0 (0x1220), for instance, gives 1.0.0.0.
static final int ROUTING_PATH_TOP_MASK = 0xF000;
@@ -256,6 +266,41 @@ final class Constants {
static final int USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = 1;
static final int NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = 2;
+ // Port id to record local active port for Routing Control features
+ // They are used to map to corresponding Inputs
+ // Current interface is only implemented for specific device.
+ // Developers can add more port number and map them to corresponding inputs on demand.
+ @IntDef({
+ CEC_SWITCH_HOME,
+ CEC_SWITCH_HDMI1,
+ CEC_SWITCH_HDMI2,
+ CEC_SWITCH_HDMI3,
+ CEC_SWITCH_HDMI4,
+ CEC_SWITCH_HDMI5,
+ CEC_SWITCH_HDMI6,
+ CEC_SWITCH_HDMI7,
+ CEC_SWITCH_HDMI8,
+ CEC_SWITCH_ARC,
+ CEC_SWITCH_BLUETOOTH,
+ CEC_SWITCH_OPTICAL,
+ CEC_SWITCH_AUX
+ })
+ @interface LocalActivePort {}
+ static final int CEC_SWITCH_HOME = 0;
+ static final int CEC_SWITCH_HDMI1 = 1;
+ static final int CEC_SWITCH_HDMI2 = 2;
+ static final int CEC_SWITCH_HDMI3 = 3;
+ static final int CEC_SWITCH_HDMI4 = 4;
+ static final int CEC_SWITCH_HDMI5 = 5;
+ static final int CEC_SWITCH_HDMI6 = 6;
+ static final int CEC_SWITCH_HDMI7 = 7;
+ static final int CEC_SWITCH_HDMI8 = 8;
+ static final int CEC_SWITCH_ARC = 17;
+ static final int CEC_SWITCH_BLUETOOTH = 18;
+ static final int CEC_SWITCH_OPTICAL = 19;
+ static final int CEC_SWITCH_AUX = 20;
+ static final int CEC_SWITCH_PORT_MAX = 21;
+
static final String PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM =
"persist.sys.hdmi.addr.audiosystem";
static final String PROPERTY_PREFERRED_ADDRESS_PLAYBACK = "persist.sys.hdmi.addr.playback";
@@ -273,6 +318,41 @@ final class Constants {
// TODO(OEM): Set this to true to enable 'Set Menu Language' feature. False by default.
static final String PROPERTY_SET_MENU_LANGUAGE = "ro.hdmi.set_menu_language";
+ /**
+ * Property to save the ARC port id on system audio device.
+ * <p>When ARC is initiated, this port will be used to turn on ARC.
+ */
+ static final String PROPERTY_SYSTEM_AUDIO_DEVICE_ARC_PORT =
+ "ro.hdmi.property_sytem_audio_device_arc_port";
+
+ /**
+ * Property to disable muting logic in System Audio Control handling. Default is true.
+ *
+ * <p>True means enabling muting logic.
+ * <p>False means never mute device.
+ */
+ static final String PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE =
+ "ro.hdmi.property_system_audio_mode_muting_enable";
+
+ /**
+ * When set to true the HdmiControlService will never request a Logical Address for the
+ * playback device type. Default is false.
+ *
+ * <p> This is useful when HDMI CEC multiple device types is not supported by the cec driver
+ */
+ static final String PROPERTY_HDMI_CEC_NEVER_CLAIM_PLAYBACK_LOGICAL_ADDRESS =
+ "ro.hdmi.property_hdmi_cec_never_claim_playback_logical_address";
+
+ /**
+ * A comma separated list of logical addresses that HdmiControlService
+ * will never assign local CEC devices to.
+ *
+ * <p> This is useful when HDMI CEC hardware module can't assign multiple logical addresses
+ * in the range same range of 0-7 or 8-15.
+ */
+ static final String PROPERTY_HDMI_CEC_NEVER_ASSIGN_LOGICAL_ADDRESSES =
+ "ro.hdmi.property_hdmi_cec_never_assign_logical_addresses";
+
// Set to false to allow playback device to go to suspend mode even
// when it's an active source. True by default.
static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake";
@@ -300,7 +380,7 @@ final class Constants {
* <p>Default is true.
*/
static final String PROPERTY_ARC_SUPPORT =
- "persist.sys.hdmi.property_arc_support";
+ "persist.sys.hdmi.property_arc_support";
/**
* Property to save the audio port to switch to when system audio control is on.
@@ -310,14 +390,16 @@ final class Constants {
* <p>Default is ARC port.
*/
static final String PROPERTY_SYSTEM_AUDIO_MODE_AUDIO_PORT =
- "persist.sys.hdmi.property_sytem_audio_mode_audio_port";
+ "persist.sys.hdmi.property_sytem_audio_mode_audio_port";
/**
- * Property to save the ARC port id on system audio device.
- * <p>When ARC is initiated, this port will be used to turn on ARC.
+ * Property to indicate if a CEC audio device should forward volume keys when system audio mode
+ * is off.
+ *
+ * <p>Default is false.
*/
- static final String PROPERTY_SYSTEM_AUDIO_DEVICE_ARC_PORT =
- "persist.sys.hdmi.property_sytem_audio_device_arc_port";
+ static final String PROPERTY_CEC_AUDIO_DEVICE_FORWARD_VOLUME_KEYS_SYSTEM_AUDIO_MODE_OFF =
+ "persist.sys.hdmi.property_cec_audio_device_forward_volume_keys_system_audio_mode_off";
/**
* Property to strip local audio of amplifier and use local speaker
diff --git a/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java b/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java
index 0495ff878ce0..71873198d798 100644
--- a/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java
+++ b/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java
@@ -50,8 +50,10 @@ public class DetectTvSystemAudioModeSupportAction extends HdmiCecFeatureAction {
if (mState != STATE_WAITING_FOR_FEATURE_ABORT) {
return false;
}
- finishAction(false);
- return true;
+ if ((cmd.getParams()[0] & 0xFF) == Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE) {
+ finishAction(false);
+ return true;
+ }
}
return false;
}
diff --git a/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java b/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
index b75e75feabb3..df0dc77613b1 100755
--- a/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
+++ b/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
+import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.util.Slog;
@@ -28,7 +29,7 @@ import java.util.List;
/**
* Feature action that handles device discovery sequences.
- * Device discovery is launched when TV device is woken from "Standby" state
+ * Device discovery is launched when device is woken from "Standby" state
* or enabled "Control for Hdmi" from disabled state.
*
* <p>Device discovery goes through the following steps.
@@ -51,6 +52,10 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
private static final int STATE_WAITING_FOR_OSD_NAME = 3;
// State in which the action is waiting for gathering vendor id of non-local devices.
private static final int STATE_WAITING_FOR_VENDOR_ID = 4;
+ // State in which the action is waiting for devices to be ready.
+ private static final int STATE_WAITING_FOR_DEVICES = 5;
+ // State in which the action is waiting for gathering power status of non-local devices.
+ private static final int STATE_WAITING_FOR_POWER = 6;
/**
* Interface used to report result of device discovery.
@@ -72,6 +77,7 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
private int mPhysicalAddress = Constants.INVALID_PHYSICAL_ADDRESS;
private int mPortId = Constants.INVALID_PORT_ID;
private int mVendorId = Constants.UNKNOWN_VENDOR_ID;
+ private int mPowerStatus = HdmiControlManager.POWER_STATUS_UNKNOWN;
private String mDisplayName = "";
private int mDeviceType = HdmiDeviceInfo.DEVICE_INACTIVE;
@@ -81,7 +87,7 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
private HdmiDeviceInfo toHdmiDeviceInfo() {
return new HdmiDeviceInfo(mLogicalAddress, mPhysicalAddress, mPortId, mDeviceType,
- mVendorId, mDisplayName);
+ mVendorId, mDisplayName, mPowerStatus);
}
}
@@ -89,15 +95,28 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
private final DeviceDiscoveryCallback mCallback;
private int mProcessedDeviceCount = 0;
private int mTimeoutRetry = 0;
+ private boolean mIsTvDevice = localDevice().mService.isTvDevice();
+ private final int mDelayPeriod;
/**
* Constructor.
*
* @param source an instance of {@link HdmiCecLocalDevice}.
+ * @param delay delay action for this period between query Physical Address and polling
*/
- DeviceDiscoveryAction(HdmiCecLocalDevice source, DeviceDiscoveryCallback callback) {
+ DeviceDiscoveryAction(HdmiCecLocalDevice source, DeviceDiscoveryCallback callback, int delay) {
super(source);
mCallback = Preconditions.checkNotNull(callback);
+ mDelayPeriod = delay;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param source an instance of {@link HdmiCecLocalDevice}.
+ */
+ DeviceDiscoveryAction(HdmiCecLocalDevice source, DeviceDiscoveryCallback callback) {
+ this(source, callback, 0);
}
@Override
@@ -116,7 +135,11 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
Slog.v(TAG, "Device detected: " + ackedAddress);
allocateDevices(ackedAddress);
- startPhysicalAddressStage();
+ if (mDelayPeriod > 0) {
+ startToDelayAction();
+ } else {
+ startPhysicalAddressStage();
+ }
}
}, Constants.POLL_ITERATION_REVERSE_ORDER
| Constants.POLL_STRATEGY_REMOTES_DEVICES, HdmiConfig.DEVICE_POLLING_RETRY);
@@ -130,6 +153,13 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
}
}
+ private void startToDelayAction() {
+ Slog.v(TAG, "Waiting for connected devices to be ready");
+ mState = STATE_WAITING_FOR_DEVICES;
+
+ checkAndProceedStage();
+ }
+
private void startPhysicalAddressStage() {
Slog.v(TAG, "Start [Physical Address Stage]:" + mDevices.size());
mProcessedDeviceCount = 0;
@@ -158,6 +188,11 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
addTimer(mState, HdmiConfig.TIMEOUT_MS);
}
+ private void delayActionWithTimePeriod(int timeDelay) {
+ mActionTimer.clearTimerMessage();
+ addTimer(mState, timeDelay);
+ }
+
private void startOsdNameStage() {
Slog.v(TAG, "Start [Osd Name Stage]:" + mDevices.size());
mProcessedDeviceCount = 0;
@@ -206,6 +241,29 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
addTimer(mState, HdmiConfig.TIMEOUT_MS);
}
+ private void startPowerStatusStage() {
+ Slog.v(TAG, "Start [Power Status Stage]:" + mDevices.size());
+ mProcessedDeviceCount = 0;
+ mState = STATE_WAITING_FOR_POWER;
+
+ checkAndProceedStage();
+ }
+
+ private void queryPowerStatus(int address) {
+ if (!verifyValidLogicalAddress(address)) {
+ checkAndProceedStage();
+ return;
+ }
+
+ mActionTimer.clearTimerMessage();
+
+ if (mayProcessMessageIfCached(address, Constants.MESSAGE_REPORT_POWER_STATUS)) {
+ return;
+ }
+ sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus(getSourceAddress(), address));
+ addTimer(mState, HdmiConfig.TIMEOUT_MS);
+ }
+
private boolean mayProcessMessageIfCached(int address, int opcode) {
HdmiCecMessage message = getCecMessageCache().getMessage(address, opcode);
if (message != null) {
@@ -244,6 +302,16 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
return true;
}
return false;
+ case STATE_WAITING_FOR_POWER:
+ if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) {
+ handleReportPowerStatus(cmd);
+ return true;
+ } else if ((cmd.getOpcode() == Constants.MESSAGE_FEATURE_ABORT)
+ && ((cmd.getParams()[0] & 0xFF) == Constants.MESSAGE_REPORT_POWER_STATUS)) {
+ handleReportPowerStatus(cmd);
+ return true;
+ }
+ return false;
case STATE_WAITING_FOR_DEVICE_POLLING:
// Fall through.
default:
@@ -265,16 +333,21 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
current.mPhysicalAddress = HdmiUtils.twoBytesToInt(params);
current.mPortId = getPortId(current.mPhysicalAddress);
current.mDeviceType = params[2] & 0xFF;
+ current.mDisplayName = HdmiUtils.getDefaultDeviceName(current.mDeviceType);
- tv().updateCecSwitchInfo(current.mLogicalAddress, current.mDeviceType,
+ // TODO(amyjojo): check if non-TV device needs to update cec switch info.
+ // This is to manager CEC device separately in case they don't have address.
+ if (mIsTvDevice) {
+ tv().updateCecSwitchInfo(current.mLogicalAddress, current.mDeviceType,
current.mPhysicalAddress);
-
+ }
increaseProcessedDeviceCount();
checkAndProceedStage();
}
private int getPortId(int physicalAddress) {
- return tv().getPortId(physicalAddress);
+ return mIsTvDevice ? tv().getPortId(physicalAddress)
+ : source().getPortId(physicalAddress);
}
private void handleSetOsdName(HdmiCecMessage cmd) {
@@ -324,6 +397,26 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
checkAndProceedStage();
}
+ private void handleReportPowerStatus(HdmiCecMessage cmd) {
+ Preconditions.checkState(mProcessedDeviceCount < mDevices.size());
+
+ DeviceInfo current = mDevices.get(mProcessedDeviceCount);
+ if (current.mLogicalAddress != cmd.getSource()) {
+ Slog.w(TAG, "Unmatched address[expected:" + current.mLogicalAddress + ", actual:"
+ + cmd.getSource());
+ return;
+ }
+
+ if (cmd.getOpcode() != Constants.MESSAGE_FEATURE_ABORT) {
+ byte[] params = cmd.getParams();
+ int powerStatus = params[0] & 0xFF;
+ current.mPowerStatus = powerStatus;
+ }
+
+ increaseProcessedDeviceCount();
+ checkAndProceedStage();
+ }
+
private void increaseProcessedDeviceCount() {
mProcessedDeviceCount++;
mTimeoutRetry = 0;
@@ -345,7 +438,9 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
mCallback.onDeviceDiscoveryDone(result);
finish();
// Process any commands buffered while device discovery action was in progress.
- tv().processAllDelayedMessages();
+ if (mIsTvDevice) {
+ tv().processAllDelayedMessages();
+ }
}
private void checkAndProceedStage() {
@@ -365,6 +460,9 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
startVendorIdStage();
return;
case STATE_WAITING_FOR_VENDOR_ID:
+ startPowerStatusStage();
+ return;
+ case STATE_WAITING_FOR_POWER:
wrapUpAndFinish();
return;
default:
@@ -378,6 +476,9 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
private void sendQueryCommand() {
int address = mDevices.get(mProcessedDeviceCount).mLogicalAddress;
switch (mState) {
+ case STATE_WAITING_FOR_DEVICES:
+ delayActionWithTimePeriod(mDelayPeriod);
+ return;
case STATE_WAITING_FOR_PHYSICAL_ADDRESS:
queryPhysicalAddress(address);
return;
@@ -387,6 +488,9 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
case STATE_WAITING_FOR_VENDOR_ID:
queryVendorId(address);
return;
+ case STATE_WAITING_FOR_POWER:
+ queryPowerStatus(address);
+ return;
default:
return;
}
@@ -398,13 +502,24 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
return;
}
+ if (mState == STATE_WAITING_FOR_DEVICES) {
+ startPhysicalAddressStage();
+ return;
+ }
if (++mTimeoutRetry < HdmiConfig.TIMEOUT_RETRY) {
sendQueryCommand();
return;
}
mTimeoutRetry = 0;
Slog.v(TAG, "Timeout[State=" + mState + ", Processed=" + mProcessedDeviceCount);
- removeDevice(mProcessedDeviceCount);
+ if (mState != STATE_WAITING_FOR_POWER && mState != STATE_WAITING_FOR_OSD_NAME) {
+ // We don't need to remove the device info if the power status is unknown.
+ // Some device does not have preferred OSD name and does not respond to Give OSD name.
+ // Like LG TV. We can give it default device name and not remove it.
+ removeDevice(mProcessedDeviceCount);
+ } else {
+ increaseProcessedDeviceCount();
+ }
checkAndProceedStage();
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index de6cdd48fb09..86be585e5d23 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -22,20 +22,25 @@ import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
+import android.os.SystemProperties;
import android.util.Slog;
import android.util.SparseArray;
+
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.HdmiAnnotations.IoThreadOnly;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiControlService.DevicePollingCallback;
+
+import libcore.util.EmptyArray;
+
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
-import java.util.function.Predicate;
import java.util.concurrent.ArrayBlockingQueue;
-import libcore.util.EmptyArray;
+import java.util.function.Predicate;
+
import sun.util.locale.LanguageTag;
/**
@@ -72,7 +77,7 @@ final class HdmiCecController {
private static final int NUM_LOGICAL_ADDRESS = 16;
- private static final int MAX_CEC_MESSAGE_HISTORY = 20;
+ private static final int MAX_CEC_MESSAGE_HISTORY = 200;
// Predicate for whether the given logical address is remote device's one or not.
private final Predicate<Integer> mRemoteDeviceAddressPredicate = new Predicate<Integer>() {
@@ -112,10 +117,18 @@ final class HdmiCecController {
private final NativeWrapper mNativeWrapperImpl;
+ /** List of logical addresses that should not be assigned to the current device.
+ *
+ * <p>Parsed from {@link Constants#PROPERTY_HDMI_CEC_NEVER_ASSIGN_LOGICAL_ADDRESSES}
+ */
+ private final List<Integer> mNeverAssignLogicalAddresses;
+
// Private constructor. Use HdmiCecController.create().
private HdmiCecController(HdmiControlService service, NativeWrapper nativeWrapper) {
mService = service;
mNativeWrapperImpl = nativeWrapper;
+ mNeverAssignLogicalAddresses = mService.getIntList(SystemProperties.get(
+ Constants.PROPERTY_HDMI_CEC_NEVER_ASSIGN_LOGICAL_ADDRESSES));
}
/**
@@ -208,7 +221,8 @@ final class HdmiCecController {
for (int i = 0; i < NUM_LOGICAL_ADDRESS; ++i) {
int curAddress = (startAddress + i) % NUM_LOGICAL_ADDRESS;
if (curAddress != Constants.ADDR_UNREGISTERED
- && deviceType == HdmiUtils.getTypeFromAddress(curAddress)) {
+ && deviceType == HdmiUtils.getTypeFromAddress(curAddress)
+ && !mNeverAssignLogicalAddresses.contains(curAddress)) {
boolean acked = false;
for (int j = 0; j < HdmiConfig.ADDRESS_ALLOCATION_RETRY; ++j) {
if (sendPollMessage(curAddress, curAddress, 1)) {
@@ -668,7 +682,7 @@ final class HdmiCecController {
void dump(final IndentingPrintWriter pw) {
for (int i = 0; i < mLocalDevices.size(); ++i) {
- pw.println("HdmiCecLocalDevice #" + i + ":");
+ pw.println("HdmiCecLocalDevice #" + mLocalDevices.keyAt(i) + ":");
pw.increaseIndent();
mLocalDevices.valueAt(i).dump(pw);
pw.decreaseIndent();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
index 11faa56f704a..2da698be56be 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
@@ -252,6 +252,10 @@ abstract class HdmiCecFeatureAction {
return (HdmiCecLocalDevicePlayback) mSource;
}
+ protected final HdmiCecLocalDeviceSource source() {
+ return (HdmiCecLocalDeviceSource) mSource;
+ }
+
protected final HdmiCecLocalDeviceTv tv() {
return (HdmiCecLocalDeviceTv) mSource;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 7860122ed9ea..414f6bbfb995 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -18,19 +18,24 @@ package com.android.server.hdmi;
import android.annotation.Nullable;
import android.hardware.hdmi.HdmiDeviceInfo;
+import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.input.InputManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Slog;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.hdmi.Constants.LocalActivePort;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -56,6 +61,7 @@ abstract class HdmiCecLocalDevice {
protected final int mDeviceType;
protected int mAddress;
protected int mPreferredAddress;
+ @GuardedBy("mLock")
protected HdmiDeviceInfo mDeviceInfo;
protected int mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE;
protected int mLastKeyRepeatCount = 0;
@@ -125,9 +131,6 @@ abstract class HdmiCecLocalDevice {
return s.toString();
}
}
- // Logical address of the active source.
- @GuardedBy("mLock")
- protected final ActiveSource mActiveSource = new ActiveSource();
// Active routing path. Physical address of the active source but not all the time, such as
// when the new active source does not claim itself to be one. Note that we don't keep
@@ -434,10 +437,14 @@ abstract class HdmiCecLocalDevice {
return true;
}
+ // Audio System device with no Playback device type
+ // needs to refactor this function if it's also a switch
protected boolean handleRoutingChange(HdmiCecMessage message) {
return false;
}
+ // Audio System device with no Playback device type
+ // needs to refactor this function if it's also a switch
protected boolean handleRoutingInformation(HdmiCecMessage message) {
return false;
}
@@ -706,16 +713,18 @@ abstract class HdmiCecLocalDevice {
return mDeviceType;
}
- @ServiceThreadOnly
+ @GuardedBy("mLock")
HdmiDeviceInfo getDeviceInfo() {
- assertRunOnServiceThread();
- return mDeviceInfo;
+ synchronized (mLock) {
+ return mDeviceInfo;
+ }
}
- @ServiceThreadOnly
+ @GuardedBy("mLock")
void setDeviceInfo(HdmiDeviceInfo info) {
- assertRunOnServiceThread();
- mDeviceInfo = info;
+ synchronized (mLock) {
+ mDeviceInfo = info;
+ }
}
// Returns true if the logical address is same as the argument.
@@ -855,9 +864,7 @@ abstract class HdmiCecLocalDevice {
}
ActiveSource getActiveSource() {
- synchronized (mLock) {
- return mActiveSource;
- }
+ return mService.getActiveSource();
}
void setActiveSource(ActiveSource newActive) {
@@ -869,10 +876,7 @@ abstract class HdmiCecLocalDevice {
}
void setActiveSource(int logicalAddress, int physicalAddress) {
- synchronized (mLock) {
- mActiveSource.logicalAddress = logicalAddress;
- mActiveSource.physicalAddress = physicalAddress;
- }
+ mService.setActiveSource(logicalAddress, physicalAddress);
mService.setLastInputForMhl(Constants.INVALID_PORT_ID);
}
@@ -910,6 +914,11 @@ abstract class HdmiCecLocalDevice {
setActivePath(mService.portIdToPath(portId));
}
+ // Returns the id of the port that the target device is connected to.
+ int getPortId(int physicalAddress) {
+ return mService.pathToPortId(physicalAddress);
+ }
+
@ServiceThreadOnly
HdmiCecMessageCache getCecMessageCache() {
assertRunOnServiceThread();
@@ -1017,6 +1026,19 @@ abstract class HdmiCecLocalDevice {
return Constants.ADDR_INVALID;
}
+ @ServiceThreadOnly
+ void invokeCallback(IHdmiControlCallback callback, int result) {
+ assertRunOnServiceThread();
+ if (callback == null) {
+ return;
+ }
+ try {
+ callback.onComplete(result);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Invoking callback failed:" + e);
+ }
+ }
+
void sendUserControlPressedAndReleased(int targetAddress, int cecKeycode) {
mService.sendCecCommand(
HdmiCecMessageBuilder.buildUserControlPressed(mAddress, targetAddress, cecKeycode));
@@ -1030,7 +1052,30 @@ abstract class HdmiCecLocalDevice {
pw.println("mAddress: " + mAddress);
pw.println("mPreferredAddress: " + mPreferredAddress);
pw.println("mDeviceInfo: " + mDeviceInfo);
- pw.println("mActiveSource: " + mActiveSource);
+ pw.println("mActiveSource: " + getActiveSource());
pw.println(String.format("mActiveRoutingPath: 0x%04x", mActiveRoutingPath));
}
+
+ /** Calculates the physical address for {@code activePortId}.
+ *
+ * <p>This method assumes current device physical address is valid.
+ * <p>If the current device is already the leaf of the whole CEC system
+ * and can't have devices under it, will return its own physical address.
+ *
+ * @param activePortId is the local active port Id
+ * @return the calculated physical address of the port
+ */
+ protected int getActivePathOnSwitchFromActivePortId(@LocalActivePort int activePortId) {
+ int myPhysicalAddress = mService.getPhysicalAddress();
+ int finalMask = activePortId << 8;
+ int mask;
+ for (mask = 0x0F00; mask > 0x000F; mask >>= 4) {
+ if ((myPhysicalAddress & mask) == 0) {
+ break;
+ } else {
+ finalMask >>= 4;
+ }
+ }
+ return finalMask | myPhysicalAddress;
+ }
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 9690ba877c1e..63214ed651b9 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -20,22 +20,50 @@ import static com.android.server.hdmi.Constants.PROPERTY_SYSTEM_AUDIO_CONTROL_ON
import static com.android.server.hdmi.Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON;
import android.annotation.Nullable;
+import android.content.Intent;
+import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
+import android.hardware.hdmi.HdmiPortInfo;
+import android.hardware.hdmi.IHdmiControlCallback;
import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioSystem;
+import android.media.tv.TvContract;
import android.os.SystemProperties;
+import android.provider.Settings.Global;
+import android.util.Slog;
+import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.Constants.AudioCodec;
+import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
+import com.android.server.hdmi.HdmiUtils.CodecSad;
+import com.android.server.hdmi.HdmiUtils.DeviceConfig;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* Represent a logical device of type {@link HdmiDeviceInfo#DEVICE_AUDIO_SYSTEM} residing in Android
* system.
*/
-public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
+public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
private static final String TAG = "HdmiCecLocalDeviceAudioSystem";
@@ -54,12 +82,183 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
// AVR as audio receiver.
@ServiceThreadOnly private boolean mArcEstablished = false;
+ // If the current device uses TvInput for ARC. We assume all other inputs also use TvInput
+ // when ARC is using TvInput.
+ private boolean mArcIntentUsed = SystemProperties
+ .get(Constants.PROPERTY_SYSTEM_AUDIO_DEVICE_ARC_PORT, "0").contains("tvinput");
+
+ // Keeps the mapping (HDMI port ID to TV input URI) to keep track of the TV inputs ready to
+ // accept input switching request from HDMI devices. Requests for which the corresponding
+ // input ID is not yet registered by TV input framework need to be buffered for delayed
+ // processing.
+ private final HashMap<Integer, String> mTvInputs = new HashMap<>();
+
+ // Copy of mDeviceInfos to guarantee thread-safety.
+ @GuardedBy("mLock")
+ private List<HdmiDeviceInfo> mSafeAllDeviceInfos = Collections.emptyList();
+
+ // Map-like container of all cec devices.
+ // device id is used as key of container.
+ private final SparseArray<HdmiDeviceInfo> mDeviceInfos = new SparseArray<>();
+
protected HdmiCecLocalDeviceAudioSystem(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
- mSystemAudioControlFeatureEnabled = true;
- // TODO(amyjojo) make System Audio Control controllable by users
- /*mSystemAudioControlFeatureEnabled =
- mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);*/
+ mRoutingControlFeatureEnabled =
+ mService.readBooleanSetting(Global.HDMI_CEC_SWITCH_ENABLED, false);
+ mSystemAudioControlFeatureEnabled =
+ mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);
+ // TODO(amyjojo): Maintain a portId to TvinputId map.
+ mTvInputs.put(2, "com.droidlogic.tvinput/.services.Hdmi1InputService/HW5");
+ mTvInputs.put(4, "com.droidlogic.tvinput/.services.Hdmi2InputService/HW6");
+ mTvInputs.put(1, "com.droidlogic.tvinput/.services.Hdmi3InputService/HW7");
+ }
+
+ private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml";
+
+ /**
+ * Called when a device is newly added or a new device is detected or
+ * an existing device is updated.
+ *
+ * @param info device info of a new device.
+ */
+ @ServiceThreadOnly
+ final void addCecDevice(HdmiDeviceInfo info) {
+ assertRunOnServiceThread();
+ HdmiDeviceInfo old = addDeviceInfo(info);
+ if (info.getPhysicalAddress() == mService.getPhysicalAddress()) {
+ // The addition of the device itself should not be notified.
+ // Note that different logical address could still be the same local device.
+ return;
+ }
+ if (old == null) {
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_ADD_DEVICE);
+ } else if (!old.equals(info)) {
+ invokeDeviceEventListener(old, HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE);
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_ADD_DEVICE);
+ }
+ }
+
+ /**
+ * Called when a device is removed or removal of device is detected.
+ *
+ * @param address a logical address of a device to be removed
+ */
+ @ServiceThreadOnly
+ final void removeCecDevice(int address) {
+ assertRunOnServiceThread();
+ HdmiDeviceInfo info = removeDeviceInfo(HdmiDeviceInfo.idForCecDevice(address));
+
+ mCecMessageCache.flushMessagesFrom(address);
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE);
+ }
+
+ /**
+ * Called when a device is updated.
+ *
+ * @param info device info of the updating device.
+ */
+ @ServiceThreadOnly
+ final void updateCecDevice(HdmiDeviceInfo info) {
+ assertRunOnServiceThread();
+ HdmiDeviceInfo old = addDeviceInfo(info);
+
+ if (old == null) {
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_ADD_DEVICE);
+ } else if (!old.equals(info)) {
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE);
+ }
+ }
+
+ /**
+ * Add a new {@link HdmiDeviceInfo}. It returns old device info which has the same
+ * logical address as new device info's.
+ *
+ * @param deviceInfo a new {@link HdmiDeviceInfo} to be added.
+ * @return {@code null} if it is new device. Otherwise, returns old {@HdmiDeviceInfo}
+ * that has the same logical address as new one has.
+ */
+ @ServiceThreadOnly
+ @VisibleForTesting
+ protected HdmiDeviceInfo addDeviceInfo(HdmiDeviceInfo deviceInfo) {
+ assertRunOnServiceThread();
+ HdmiDeviceInfo oldDeviceInfo = getCecDeviceInfo(deviceInfo.getLogicalAddress());
+ if (oldDeviceInfo != null) {
+ removeDeviceInfo(deviceInfo.getId());
+ }
+ mDeviceInfos.append(deviceInfo.getId(), deviceInfo);
+ updateSafeDeviceInfoList();
+ return oldDeviceInfo;
+ }
+
+ /**
+ * Remove a device info corresponding to the given {@code logicalAddress}.
+ * It returns removed {@link HdmiDeviceInfo} if exists.
+ *
+ * @param id id of device to be removed
+ * @return removed {@link HdmiDeviceInfo} it exists. Otherwise, returns {@code null}
+ */
+ @ServiceThreadOnly
+ private HdmiDeviceInfo removeDeviceInfo(int id) {
+ assertRunOnServiceThread();
+ HdmiDeviceInfo deviceInfo = mDeviceInfos.get(id);
+ if (deviceInfo != null) {
+ mDeviceInfos.remove(id);
+ }
+ updateSafeDeviceInfoList();
+ return deviceInfo;
+ }
+
+ /**
+ * Return a {@link HdmiDeviceInfo} corresponding to the given {@code logicalAddress}.
+ *
+ * @param logicalAddress logical address of the device to be retrieved
+ * @return {@link HdmiDeviceInfo} matched with the given {@code logicalAddress}.
+ * Returns null if no logical address matched
+ */
+ @ServiceThreadOnly
+ HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) {
+ assertRunOnServiceThread();
+ return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress));
+ }
+
+ @ServiceThreadOnly
+ private void updateSafeDeviceInfoList() {
+ assertRunOnServiceThread();
+ List<HdmiDeviceInfo> copiedDevices = HdmiUtils.sparseArrayToList(mDeviceInfos);
+ synchronized (mLock) {
+ mSafeAllDeviceInfos = copiedDevices;
+ }
+ }
+
+ @GuardedBy("mLock")
+ List<HdmiDeviceInfo> getSafeCecDevicesLocked() {
+ ArrayList<HdmiDeviceInfo> infoList = new ArrayList<>();
+ for (HdmiDeviceInfo info : mSafeAllDeviceInfos) {
+ infoList.add(info);
+ }
+ return infoList;
+ }
+
+ private void invokeDeviceEventListener(HdmiDeviceInfo info, int status) {
+ mService.invokeDeviceEventListeners(info, status);
+ }
+
+ @Override
+ @ServiceThreadOnly
+ void onHotplug(int portId, boolean connected) {
+ assertRunOnServiceThread();
+ if (connected) {
+ mService.wakeUp();
+ }
+ if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ mCecMessageCache.flushAll();
+ } else {
+ if (connected) {
+ launchDeviceDiscovery();
+ } else {
+ // TODO(amyjojo): remove device from mDeviceInfo
+ }
+ }
}
@Override
@@ -69,7 +268,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
mTvSystemAudioModeSupport = false;
// Record the last state of System Audio Control before going to standby
synchronized (mLock) {
- SystemProperties.set(
+ mService.writeStringSetting(
Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL,
mSystemAudioActivated ? "true" : "false");
}
@@ -80,6 +279,10 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
+ if (reason == mService.INITIATED_BY_ENABLE_CEC) {
+ mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+ getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST);
+ }
mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, mService.getPhysicalAddress(), mDeviceType));
@@ -92,12 +295,17 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
boolean lastSystemAudioControlStatus =
SystemProperties.getBoolean(Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, true);
systemAudioControlOnPowerOn(systemAudioControlOnPowerOnProp, lastSystemAudioControlStatus);
+ clearDeviceInfoList();
+ launchDeviceDiscovery();
startQueuedActions();
}
@Override
protected int findKeyReceiverAddress() {
- return Constants.ADDR_TV;
+ if (getActiveSource().isValid()) {
+ return getActiveSource().logicalAddress;
+ }
+ return Constants.ADDR_INVALID;
}
@VisibleForTesting
@@ -105,41 +313,101 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
int systemAudioOnPowerOnProp, boolean lastSystemAudioControlStatus) {
if ((systemAudioOnPowerOnProp == ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
|| ((systemAudioOnPowerOnProp == USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
- && lastSystemAudioControlStatus)) {
+ && lastSystemAudioControlStatus && isSystemAudioControlFeatureEnabled())) {
addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
}
}
- @ServiceThreadOnly
- protected boolean handleActiveSource(HdmiCecMessage message) {
- assertRunOnServiceThread();
- int logicalAddress = message.getSource();
- int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
- ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress);
- if (!mActiveSource.equals(activeSource)) {
- setActiveSource(activeSource);
- }
- return true;
- }
-
@Override
@ServiceThreadOnly
protected int getPreferredAddress() {
assertRunOnServiceThread();
return SystemProperties.getInt(
- Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM, Constants.ADDR_UNREGISTERED);
+ Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM, Constants.ADDR_UNREGISTERED);
}
@Override
@ServiceThreadOnly
protected void setPreferredAddress(int addr) {
assertRunOnServiceThread();
- SystemProperties.set(
+ mService.writeStringSetting(
Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM, String.valueOf(addr));
}
@Override
@ServiceThreadOnly
+ protected boolean handleReportPhysicalAddress(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ int path = HdmiUtils.twoBytesToInt(message.getParams());
+ int address = message.getSource();
+ int type = message.getParams()[2];
+
+ // Ignore if [Device Discovery Action] is going on.
+ if (hasAction(DeviceDiscoveryAction.class)) {
+ Slog.i(TAG, "Ignored while Device Discovery Action is in progress: " + message);
+ return true;
+ }
+
+ // Update the device info with TIF, note that the same device info could have added in
+ // device discovery and we do not want to override it with default OSD name. Therefore we
+ // need the following check to skip redundant device info updating.
+ HdmiDeviceInfo oldDevice = getCecDeviceInfo(address);
+ if (oldDevice == null || oldDevice.getPhysicalAddress() != path) {
+ addCecDevice(new HdmiDeviceInfo(
+ address, path, mService.pathToPortId(path), type,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(address)));
+ // if we are adding a new device info, send out a give osd name command
+ // to update the name of the device in TIF
+ mService.sendCecCommand(
+ HdmiCecMessageBuilder.buildGiveOsdNameCommand(mAddress, address));
+ return true;
+ }
+
+ Slog.w(TAG, "Device info exists. Not updating on Physical Address.");
+ return true;
+ }
+
+ @Override
+ protected boolean handleReportPowerStatus(HdmiCecMessage command) {
+ int newStatus = command.getParams()[0] & 0xFF;
+ updateDevicePowerStatus(command.getSource(), newStatus);
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleSetOsdName(HdmiCecMessage message) {
+ int source = message.getSource();
+ String osdName;
+ HdmiDeviceInfo deviceInfo = getCecDeviceInfo(source);
+ // If the device is not in device list, ignore it.
+ if (deviceInfo == null) {
+ Slog.i(TAG, "No source device info for <Set Osd Name>." + message);
+ return true;
+ }
+ try {
+ osdName = new String(message.getParams(), "US-ASCII");
+ } catch (UnsupportedEncodingException e) {
+ Slog.e(TAG, "Invalid <Set Osd Name> request:" + message, e);
+ return true;
+ }
+
+ if (deviceInfo.getDisplayName().equals(osdName)) {
+ Slog.d(TAG, "Ignore incoming <Set Osd Name> having same osd name:" + message);
+ return true;
+ }
+
+ Slog.d(TAG, "Updating device OSD name from "
+ + deviceInfo.getDisplayName()
+ + " to " + osdName);
+ updateCecDevice(new HdmiDeviceInfo(deviceInfo.getLogicalAddress(),
+ deviceInfo.getPhysicalAddress(), deviceInfo.getPortId(),
+ deviceInfo.getDeviceType(), deviceInfo.getVendorId(), osdName));
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
protected boolean handleReportAudioStatus(HdmiCecMessage message) {
assertRunOnServiceThread();
// TODO(amyjojo): implement report audio status handler
@@ -178,8 +446,11 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleGiveAudioStatus(HdmiCecMessage message) {
assertRunOnServiceThread();
-
- reportAudioStatus(message);
+ if (isSystemAudioControlFeatureEnabled()) {
+ reportAudioStatus(message.getSource());
+ } else {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ }
return true;
}
@@ -197,7 +468,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleRequestArcInitiate(HdmiCecMessage message) {
assertRunOnServiceThread();
- if (!SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) {
+ removeAction(ArcInitiationActionFromAvr.class);
+ if (!mService.readBooleanSetting(Constants.PROPERTY_ARC_SUPPORT, true)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE);
} else if (!isDirectConnectToTv()) {
HdmiLogger.debug("AVR device is not directly connected with TV");
@@ -218,6 +490,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
HdmiLogger.debug("ARC is not established between TV and AVR device");
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE);
} else {
+ removeAction(ArcTerminationActionFromAvr.class);
addAndStartAction(new ArcTerminationActionFromAvr(this));
}
return true;
@@ -235,13 +508,35 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE);
return true;
}
- AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo();
- if (deviceInfo == null) {
- mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE);
- return true;
+
+ List<DeviceConfig> config = null;
+ File file = new File(SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH);
+ if (file.exists()) {
+ try {
+ InputStream in = new FileInputStream(file);
+ config = HdmiUtils.ShortAudioDescriptorXmlParser.parse(in);
+ in.close();
+ } catch (IOException e) {
+ Slog.e(TAG, "Error reading file: " + file, e);
+ } catch (XmlPullParserException e) {
+ Slog.e(TAG, "Unable to parse file: " + file, e);
+ }
}
+
@AudioCodec int[] audioFormatCodes = parseAudioFormatCodes(message.getParams());
- byte[] sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes);
+ byte[] sadBytes;
+ if (config != null && config.size() > 0) {
+ sadBytes = getSupportedShortAudioDescriptorsFromConfig(config, audioFormatCodes);
+ } else {
+ AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo();
+ if (deviceInfo == null) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE);
+ return true;
+ }
+
+ sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes);
+ }
+
if (sadBytes.length == 0) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND);
} else {
@@ -254,14 +549,127 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
private byte[] getSupportedShortAudioDescriptors(
AudioDeviceInfo deviceInfo, @AudioCodec int[] audioFormatCodes) {
- // TODO(b/80297701) implement
- return new byte[] {};
+ ArrayList<byte[]> sads = new ArrayList<>(audioFormatCodes.length);
+ for (@AudioCodec int audioFormatCode : audioFormatCodes) {
+ byte[] sad = getSupportedShortAudioDescriptor(deviceInfo, audioFormatCode);
+ if (sad != null) {
+ if (sad.length == 3) {
+
+ sads.add(sad);
+ } else {
+ HdmiLogger.warning(
+ "Dropping Short Audio Descriptor with length %d for requested codec %x",
+ sad.length, audioFormatCode);
+ }
+ }
+ }
+ return getShortAudioDescriptorBytes(sads);
+ }
+
+ private byte[] getSupportedShortAudioDescriptorsFromConfig(
+ List<DeviceConfig> deviceConfig, @AudioCodec int[] audioFormatCodes) {
+ DeviceConfig deviceConfigToUse = null;
+ for (DeviceConfig device : deviceConfig) {
+ // TODO(amyjojo) use PROPERTY_SYSTEM_AUDIO_MODE_AUDIO_PORT to get the audio device name
+ if (device.name.equals("VX_AUDIO_DEVICE_IN_HDMI_ARC")) {
+ deviceConfigToUse = device;
+ break;
+ }
+ }
+ if (deviceConfigToUse == null) {
+ // TODO(amyjojo) use PROPERTY_SYSTEM_AUDIO_MODE_AUDIO_PORT to get the audio device name
+ Slog.w(TAG, "sadConfig.xml does not have required device info for "
+ + "VX_AUDIO_DEVICE_IN_HDMI_ARC");
+ return new byte[0];
+ }
+ HashMap<Integer, byte[]> map = new HashMap<>();
+ ArrayList<byte[]> sads = new ArrayList<>(audioFormatCodes.length);
+ for (CodecSad codecSad : deviceConfigToUse.supportedCodecs) {
+ map.put(codecSad.audioCodec, codecSad.sad);
+ }
+ for (int i = 0; i < audioFormatCodes.length; i++) {
+ if (map.containsKey(audioFormatCodes[i])) {
+ byte[] sad = map.get(audioFormatCodes[i]);
+ if (sad != null && sad.length == 3) {
+ sads.add(sad);
+ }
+ }
+ }
+ return getShortAudioDescriptorBytes(sads);
+ }
+
+ private byte[] getShortAudioDescriptorBytes(ArrayList<byte[]> sads) {
+ // Short Audio Descriptors are always 3 bytes long.
+ byte[] bytes = new byte[sads.size() * 3];
+ int index = 0;
+ for (byte[] sad : sads) {
+ System.arraycopy(sad, 0, bytes, index, 3);
+ index += 3;
+ }
+ return bytes;
+ }
+
+ /**
+ * Returns a 3 byte short audio descriptor as described in CEC 1.4 table 29 or null if the
+ * audioFormatCode is not supported.
+ */
+ @Nullable
+ private byte[] getSupportedShortAudioDescriptor(
+ AudioDeviceInfo deviceInfo, @AudioCodec int audioFormatCode) {
+ switch (audioFormatCode) {
+ case Constants.AUDIO_CODEC_NONE: {
+ return null;
+ }
+ case Constants.AUDIO_CODEC_LPCM: {
+ return getLpcmShortAudioDescriptor(deviceInfo);
+ }
+ // TODO(b/80297701): implement the rest of the codecs
+ case Constants.AUDIO_CODEC_DD:
+ case Constants.AUDIO_CODEC_MPEG1:
+ case Constants.AUDIO_CODEC_MP3:
+ case Constants.AUDIO_CODEC_MPEG2:
+ case Constants.AUDIO_CODEC_AAC:
+ case Constants.AUDIO_CODEC_DTS:
+ case Constants.AUDIO_CODEC_ATRAC:
+ case Constants.AUDIO_CODEC_ONEBITAUDIO:
+ case Constants.AUDIO_CODEC_DDP:
+ case Constants.AUDIO_CODEC_DTSHD:
+ case Constants.AUDIO_CODEC_TRUEHD:
+ case Constants.AUDIO_CODEC_DST:
+ case Constants.AUDIO_CODEC_WMAPRO:
+ default: {
+ return null;
+ }
+ }
+ }
+
+ @Nullable
+ private byte[] getLpcmShortAudioDescriptor(AudioDeviceInfo deviceInfo) {
+ // TODO(b/80297701): implement
+ return null;
}
@Nullable
private AudioDeviceInfo getSystemAudioDeviceInfo() {
- // TODO(b/80297701) implement
- // Get the audio device used for system audio mode.
+ AudioManager audioManager = mService.getContext().getSystemService(AudioManager.class);
+ if (audioManager == null) {
+ HdmiLogger.error(
+ "Error getting system audio device because AudioManager not available.");
+ return null;
+ }
+ AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+ HdmiLogger.debug("Found %d audio input devices", devices.length);
+ for (AudioDeviceInfo device : devices) {
+ HdmiLogger.debug("%s at port %s", device.getProductName(), device.getPort());
+ HdmiLogger.debug("Supported encodings are %s",
+ Arrays.stream(device.getEncodings()).mapToObj(
+ AudioFormat::toLogFriendlyEncoding
+ ).collect(Collectors.joining(", ")));
+ // TODO(b/80297701) use the actual device type that system audio mode is connected to.
+ if (device.getType() == AudioDeviceInfo.TYPE_HDMI_ARC) {
+ return device;
+ }
+ }
return null;
}
@@ -271,7 +679,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
for (int i = 0; i < params.length; i++) {
byte val = params[i];
audioFormatCodes[i] =
- val >= 1 && val <= Constants.AUDIO_CODEC_MAX ? val : Constants.AUDIO_CODEC_NONE;
+ val >= 1 && val <= Constants.AUDIO_CODEC_MAX ? val : Constants.AUDIO_CODEC_NONE;
}
return audioFormatCodes;
}
@@ -281,7 +689,23 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
protected boolean handleSystemAudioModeRequest(HdmiCecMessage message) {
assertRunOnServiceThread();
boolean systemAudioStatusOn = message.getParams().length != 0;
- if (!setSystemAudioMode(systemAudioStatusOn)) {
+ // Check if the request comes from a non-TV device.
+ // Need to check if TV supports System Audio Control
+ // if non-TV device tries to turn on the feature
+ if (message.getSource() != Constants.ADDR_TV) {
+ if (systemAudioStatusOn) {
+ handleSystemAudioModeOnFromNonTvDevice(message);
+ return true;
+ }
+ } else {
+ // If TV request the feature on
+ // cache TV supporting System Audio Control
+ // until Audio System loses its physical address.
+ setTvSystemAudioModeSupport(true);
+ }
+ // If TV or Audio System does not support the feature,
+ // will send abort command.
+ if (!checkSupportAndSetSystemAudioMode(systemAudioStatusOn)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
return true;
}
@@ -296,7 +720,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) {
assertRunOnServiceThread();
- if (!setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
+ if (!checkSupportAndSetSystemAudioMode(
+ HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
}
return true;
@@ -306,7 +731,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) {
assertRunOnServiceThread();
- if (!setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
+ if (!checkSupportAndSetSystemAudioMode(
+ HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
}
return true;
@@ -338,23 +764,35 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
private void notifyArcStatusToAudioService(boolean enabled) {
// Note that we don't set any name to ARC.
mService.getAudioManager()
- .setWiredDeviceConnectionState(AudioSystem.DEVICE_IN_HDMI, enabled ? 1 : 0, "", "");
+ .setWiredDeviceConnectionState(AudioSystem.DEVICE_IN_HDMI, enabled ? 1 : 0, "", "");
}
- private void reportAudioStatus(HdmiCecMessage message) {
+ void reportAudioStatus(int source) {
assertRunOnServiceThread();
int volume = mService.getAudioManager().getStreamVolume(AudioManager.STREAM_MUSIC);
boolean mute = mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
int maxVolume = mService.getAudioManager().getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ int minVolume = mService.getAudioManager().getStreamMinVolume(AudioManager.STREAM_MUSIC);
int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume);
+ HdmiLogger.debug("Reporting volume %i (%i-%i) as CEC volume %i", volume,
+ minVolume, maxVolume, scaledVolume);
mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportAudioStatus(
- mAddress, message.getSource(), scaledVolume, mute));
+ mAddress, source, scaledVolume, mute));
}
- protected boolean setSystemAudioMode(boolean newSystemAudioMode) {
+ /**
+ * Method to check if device support System Audio Control. If so, wake up device if necessary.
+ *
+ * <p> then call {@link #setSystemAudioMode(boolean)} to turn on or off System Audio Mode
+ * @param newSystemAudioMode turning feature on or off. True is on. False is off.
+ * @return true or false.
+ *
+ * <p>False when device does not support the feature. Otherwise returns true.
+ */
+ protected boolean checkSupportAndSetSystemAudioMode(boolean newSystemAudioMode) {
if (!isSystemAudioControlFeatureEnabled()) {
HdmiLogger.debug(
"Cannot turn "
@@ -366,15 +804,43 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
HdmiLogger.debug(
"System Audio Mode change[old:%b new:%b]",
mSystemAudioActivated, newSystemAudioMode);
- // Wake up device if System Audio Control is turned on but device is still on standby
- if (newSystemAudioMode && mService.isPowerStandbyOrTransient()) {
+ // Wake up device if System Audio Control is turned on
+ if (newSystemAudioMode) {
mService.wakeUp();
}
+ setSystemAudioMode(newSystemAudioMode);
+ return true;
+ }
+
+ /**
+ * Real work to turn on or off System Audio Mode.
+ *
+ * Use {@link #checkSupportAndSetSystemAudioMode(boolean)}
+ * if trying to turn on or off the feature.
+ */
+ private void setSystemAudioMode(boolean newSystemAudioMode) {
int targetPhysicalAddress = getActiveSource().physicalAddress;
- if (newSystemAudioMode && !isPhysicalAddressMeOrBelow(targetPhysicalAddress)) {
+ int port = mService.pathToPortId(targetPhysicalAddress);
+ if (newSystemAudioMode && port >= 0) {
switchToAudioInput();
}
- // TODO(b/80297700): Mute device when TV terminates the system audio control
+ // Mute device when feature is turned off and unmute device when feature is turned on.
+ // PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE is false when device never needs to be muted.
+ boolean currentMuteStatus =
+ mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
+ if (currentMuteStatus == newSystemAudioMode) {
+ if (mService.readBooleanSetting(
+ Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE, true)
+ || newSystemAudioMode) {
+ mService.getAudioManager()
+ .adjustStreamVolume(
+ AudioManager.STREAM_MUSIC,
+ newSystemAudioMode
+ ? AudioManager.ADJUST_UNMUTE
+ : AudioManager.ADJUST_MUTE,
+ 0);
+ }
+ }
updateAudioManagerForSystemAudio(newSystemAudioMode);
synchronized (mLock) {
if (mSystemAudioActivated != newSystemAudioMode) {
@@ -382,31 +848,19 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
mService.announceSystemAudioModeChange(newSystemAudioMode);
}
}
- return true;
- }
-
- /**
- * Method to check if the target device belongs to the subtree of the current device or not.
- *
- * <p>Return true if it does or if the two devices share the same physical address.
- *
- * <p>This check assumes both device physical address and target address are valid.
- *
- * @param targetPhysicalAddress is the physical address of the target device
- */
- protected boolean isPhysicalAddressMeOrBelow(int targetPhysicalAddress) {
- int myPhysicalAddress = mService.getPhysicalAddress();
- int xor = targetPhysicalAddress ^ myPhysicalAddress;
- // Return true if two addresses are the same
- // or if they only differs for one byte, but not the first byte,
- // and myPhysicalAddress is 0 after that byte
- if (xor == 0
- || ((xor & 0x0f00) == xor && (myPhysicalAddress & 0x0fff) == 0)
- || ((xor & 0x00f0) == xor && (myPhysicalAddress & 0x00ff) == 0)
- || ((xor & 0x000f) == xor && (myPhysicalAddress & 0x000f) == 0)) {
- return true;
+ // Init arc whenever System Audio Mode is on
+ // Terminate arc when System Audio Mode is off
+ // Since some TVs don't request ARC on with System Audio Mode on request
+ if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)
+ && isDirectConnectToTv()) {
+ if (newSystemAudioMode && !isArcEnabled()) {
+ removeAction(ArcInitiationActionFromAvr.class);
+ addAndStartAction(new ArcInitiationActionFromAvr(this));
+ } else if (!newSystemAudioMode && isArcEnabled()) {
+ removeAction(ArcTerminationActionFromAvr.class);
+ addAndStartAction(new ArcTerminationActionFromAvr(this));
+ }
}
- return false;
}
protected void switchToAudioInput() {
@@ -423,6 +877,13 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
HdmiLogger.debug("[A]UpdateSystemAudio mode[on=%b] output=[%X]", on, device);
}
+ void onSystemAduioControlFeatureSupportChanged(boolean enabled) {
+ setSystemAudioControlFeatureEnabled(enabled);
+ if (enabled) {
+ addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
+ }
+ }
+
@ServiceThreadOnly
void setSystemAudioControlFeatureEnabled(boolean enabled) {
assertRunOnServiceThread();
@@ -431,6 +892,42 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
}
}
+ @ServiceThreadOnly
+ void setRoutingControlFeatureEnables(boolean enabled) {
+ assertRunOnServiceThread();
+ synchronized (mLock) {
+ mRoutingControlFeatureEnabled = enabled;
+ }
+ }
+
+ @ServiceThreadOnly
+ void doManualPortSwitching(int portId, IHdmiControlCallback callback) {
+ assertRunOnServiceThread();
+ // TODO: validate port ID
+ if (portId == getLocalActivePort()) {
+ invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
+ return;
+ }
+ if (!mService.isControlEnabled()) {
+ setRoutingPort(portId);
+ setLocalActivePort(portId);
+ invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
+ return;
+ }
+ int oldPath = getRoutingPort() != Constants.CEC_SWITCH_HOME
+ ? mService.portIdToPath(getRoutingPort())
+ : getDeviceInfo().getPhysicalAddress();
+ int newPath = mService.portIdToPath(portId);
+ if (oldPath == newPath) {
+ return;
+ }
+ setRoutingPort(portId);
+ setLocalActivePort(portId);
+ HdmiCecMessage routingChange =
+ HdmiCecMessageBuilder.buildRoutingChange(mAddress, oldPath, newPath);
+ mService.sendCecCommand(routingChange);
+ }
+
boolean isSystemAudioControlFeatureEnabled() {
synchronized (mLock) {
return mSystemAudioControlFeatureEnabled;
@@ -450,7 +947,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
return;
}
- if (setSystemAudioMode(false)) {
+ if (checkSupportAndSetSystemAudioMode(false)) {
// send <Set System Audio Mode> [“Off”]
mService.sendCecCommand(
HdmiCecMessageBuilder.buildSetSystemAudioMode(
@@ -473,6 +970,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
* <p>The result of the query may be cached until Audio device type is put in standby or loses
* its physical address.
*/
+ // TODO(amyjojo): making mTvSystemAudioModeSupport null originally and fix the logic.
void queryTvSystemAudioModeSupport(TvSystemAudioModeSupportedCallback callback) {
if (!mTvSystemAudioModeSupport) {
addAndStartAction(new DetectTvSystemAudioModeSupportAction(this, callback));
@@ -481,6 +979,35 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
}
}
+ /**
+ * Handler of System Audio Mode Request on from non TV device
+ */
+ void handleSystemAudioModeOnFromNonTvDevice(HdmiCecMessage message) {
+ if (!isSystemAudioControlFeatureEnabled()) {
+ HdmiLogger.debug(
+ "Cannot turn on" + "system audio mode "
+ + "because the System Audio Control feature is disabled.");
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ return;
+ }
+ // Wake up device
+ mService.wakeUp();
+ // Check if TV supports System Audio Control.
+ // Handle broadcasting setSystemAudioMode on or aborting message on callback.
+ queryTvSystemAudioModeSupport(new TvSystemAudioModeSupportedCallback() {
+ public void onResult(boolean supported) {
+ if (supported) {
+ setSystemAudioMode(true);
+ mService.sendCecCommand(
+ HdmiCecMessageBuilder.buildSetSystemAudioMode(
+ mAddress, Constants.ADDR_BROADCAST, true));
+ } else {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ }
+ }
+ });
+ }
+
void setTvSystemAudioModeSupport(boolean supported) {
mTvSystemAudioModeSupport = supported;
}
@@ -491,4 +1018,195 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
return mArcEstablished;
}
}
+
+ @Override
+ protected void switchInputOnReceivingNewActivePath(int physicalAddress) {
+ int port = mService.pathToPortId(physicalAddress);
+ if (isSystemAudioActivated() && port < 0) {
+ // If system audio mode is on and the new active source is not under the current device,
+ // Will switch to ARC input.
+ // TODO(b/115637145): handle system aduio without ARC
+ routeToInputFromPortId(Constants.CEC_SWITCH_ARC);
+ } else if (mIsSwitchDevice && port >= 0) {
+ // If current device is a switch and the new active source is under it,
+ // will switch to the corresponding active path.
+ routeToInputFromPortId(port);
+ }
+ }
+
+ protected void routeToInputFromPortId(int portId) {
+ if (!isRoutingControlFeatureEnabled()) {
+ HdmiLogger.debug("Routing Control Feature is not enabled.");
+ return;
+ }
+ if (mArcIntentUsed) {
+ routeToTvInputFromPortId(portId);
+ } else {
+ // TODO(): implement input switching for devices not using TvInput.
+ }
+ }
+
+ protected void routeToTvInputFromPortId(int portId) {
+ if (portId < 0 || portId >= Constants.CEC_SWITCH_PORT_MAX) {
+ HdmiLogger.debug("Invalid port number for Tv Input switching.");
+ return;
+ }
+ // Wake up if the current device if ready to route.
+ mService.wakeUp();
+ if (portId == Constants.CEC_SWITCH_HOME && mService.isPlaybackDevice()) {
+ switchToHomeTvInput();
+ } else if (portId == Constants.CEC_SWITCH_ARC) {
+ switchToTvInput(SystemProperties.get(Constants.PROPERTY_SYSTEM_AUDIO_DEVICE_ARC_PORT));
+ setLocalActivePort(portId);
+ return;
+ } else {
+ String uri = mTvInputs.get(portId);
+ if (uri != null) {
+ switchToTvInput(mTvInputs.get(portId));
+ } else {
+ HdmiLogger.debug("Port number does not match any Tv Input.");
+ return;
+ }
+ }
+
+ setLocalActivePort(portId);
+ setRoutingPort(portId);
+ }
+
+ // For device to switch to specific TvInput with corresponding URI.
+ private void switchToTvInput(String uri) {
+ mService.getContext().startActivity(new Intent(Intent.ACTION_VIEW,
+ TvContract.buildChannelUriForPassthroughInput(uri))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+
+ // For device using TvInput to switch to Home.
+ private void switchToHomeTvInput() {
+ Intent activityIntent = new Intent(Intent.ACTION_MAIN)
+ .addCategory(Intent.CATEGORY_HOME)
+ .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP
+ | Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ mService.getContext().startActivity(activityIntent);
+ }
+
+ @Override
+ protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) {
+ int port = mService.pathToPortId(physicalAddress);
+ // Routing change or information sent from switches under the current device can be ignored.
+ if (port > 0) {
+ return;
+ }
+ // When other switches route to some other devices not under the current device,
+ // check system audio mode status and do ARC switch if needed.
+ if (port < 0 && isSystemAudioActivated()) {
+ handleRoutingChangeAndInformationForSystemAudio();
+ return;
+ }
+ // When other switches route to the current device
+ // and the current device is also a switch.
+ if (port == 0) {
+ handleRoutingChangeAndInformationForSwitch(message);
+ }
+ }
+
+ // Handle the system audio(ARC) part of the logic on receiving routing change or information.
+ private void handleRoutingChangeAndInformationForSystemAudio() {
+ // TODO(b/115637145): handle system aduio without ARC
+ routeToInputFromPortId(Constants.CEC_SWITCH_ARC);
+ }
+
+ // Handle the routing control part of the logic on receiving routing change or information.
+ private void handleRoutingChangeAndInformationForSwitch(HdmiCecMessage message) {
+ if (getRoutingPort() == Constants.CEC_SWITCH_HOME && mService.isPlaybackDevice()) {
+ routeToInputFromPortId(Constants.CEC_SWITCH_HOME);
+ mService.setAndBroadcastActiveSourceFromOneDeviceType(
+ message.getSource(), mService.getPhysicalAddress());
+ return;
+ }
+
+ int routingInformationPath = mService.portIdToPath(getRoutingPort());
+ // If current device is already the leaf of the whole HDMI system, will do nothing.
+ if (routingInformationPath == mService.getPhysicalAddress()) {
+ HdmiLogger.debug("Current device can't assign valid physical address"
+ + "to devices under it any more. "
+ + "It's physical address is " + routingInformationPath);
+ return;
+ }
+ // Otherwise will switch to the current active port and broadcast routing information.
+ mService.sendCecCommand(HdmiCecMessageBuilder.buildRoutingInformation(
+ mAddress, routingInformationPath));
+ routeToInputFromPortId(getRoutingPort());
+ }
+
+ protected void updateDevicePowerStatus(int logicalAddress, int newPowerStatus) {
+ HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress);
+ if (info == null) {
+ Slog.w(TAG, "Can not update power status of non-existing device:" + logicalAddress);
+ return;
+ }
+
+ if (info.getDevicePowerStatus() == newPowerStatus) {
+ return;
+ }
+
+ HdmiDeviceInfo newInfo = HdmiUtils.cloneHdmiDeviceInfo(info, newPowerStatus);
+ // addDeviceInfo replaces old device info with new one if exists.
+ addDeviceInfo(newInfo);
+
+ invokeDeviceEventListener(newInfo, HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE);
+ }
+
+ @ServiceThreadOnly
+ private void launchDeviceDiscovery() {
+ assertRunOnServiceThread();
+ if (hasAction(DeviceDiscoveryAction.class)) {
+ Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
+ removeAction(DeviceDiscoveryAction.class);
+ }
+ DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
+ new DeviceDiscoveryCallback() {
+ @Override
+ public void onDeviceDiscoveryDone(List<HdmiDeviceInfo> deviceInfos) {
+ for (HdmiDeviceInfo info : deviceInfos) {
+ addCecDevice(info);
+ }
+ }
+ });
+ addAndStartAction(action);
+ }
+
+ // Clear all device info.
+ @ServiceThreadOnly
+ private void clearDeviceInfoList() {
+ assertRunOnServiceThread();
+ for (HdmiDeviceInfo info : HdmiUtils.sparseArrayToList(mDeviceInfos)) {
+ if (info.getPhysicalAddress() == mService.getPhysicalAddress()) {
+ continue;
+ }
+ invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE);
+ }
+ mDeviceInfos.clear();
+ updateSafeDeviceInfoList();
+ }
+
+ @Override
+ protected void dump(IndentingPrintWriter pw) {
+ pw.println("HdmiCecLocalDeviceAudioSystem:");
+ pw.increaseIndent();
+ pw.println("mSystemAudioActivated: " + mSystemAudioActivated);
+ pw.println("isRoutingFeatureEnabled " + isRoutingControlFeatureEnabled());
+ pw.println("mSystemAudioControlFeatureEnabled: " + mSystemAudioControlFeatureEnabled);
+ pw.println("mTvSystemAudioModeSupport: " + mTvSystemAudioModeSupport);
+ pw.println("mArcEstablished: " + mArcEstablished);
+ pw.println("mArcIntentUsed: " + mArcIntentUsed);
+ pw.println("mRoutingPort: " + getRoutingPort());
+ pw.println("mLocalActivePort: " + getLocalActivePort());
+ HdmiUtils.dumpMap(pw, "mTvInputs:", mTvInputs);
+ HdmiUtils.dumpSparseArray(pw, "mDeviceInfos:", mDeviceInfos);
+ pw.decreaseIndent();
+ super.dump(pw);
+ }
+
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index d45b00bd904b..7a0c27906122 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -21,11 +21,11 @@ import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
-import android.os.RemoteException;
import android.os.SystemProperties;
import android.provider.Settings.Global;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocalePicker.LocaleInfo;
import com.android.internal.util.IndentingPrintWriter;
@@ -35,12 +35,10 @@ import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Locale;
-import java.util.List;
-
/**
* Represent a logical device of type Playback residing in Android system.
*/
-final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
+public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
private static final String TAG = "HdmiCecLocalDevicePlayback";
private static final boolean WAKE_ON_HOTPLUG =
@@ -49,8 +47,6 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
private static final boolean SET_MENU_LANGUAGE =
SystemProperties.getBoolean(Constants.PROPERTY_SET_MENU_LANGUAGE, false);
- private boolean mIsActiveSource = false;
-
// Used to keep the device awake while it is the active source. For devices that
// cannot wake up via CEC commands, this address the inconvenience of having to
// turn them on. True by default, and can be disabled (i.e. device can go to sleep
@@ -62,6 +58,11 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
// If true, turn off TV upon standby. False by default.
private boolean mAutoTvOff;
+ // Local active port number used for Routing Control.
+ // Default 0 means HOME is the current active path. Temp solution only.
+ // TODO(amyjojo): adding system constants for input ports to TIF mapping.
+ private int mLocalActivePath = 0;
+
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
@@ -76,6 +77,10 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
+ if (reason == mService.INITIATED_BY_ENABLE_CEC) {
+ mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+ getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST);
+ }
mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, mService.getPhysicalAddress(), mDeviceType));
mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
@@ -95,30 +100,11 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected void setPreferredAddress(int addr) {
assertRunOnServiceThread();
- SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK,
+ mService.writeStringSetting(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK,
String.valueOf(addr));
}
@ServiceThreadOnly
- void oneTouchPlay(IHdmiControlCallback callback) {
- assertRunOnServiceThread();
- List<OneTouchPlayAction> actions = getActions(OneTouchPlayAction.class);
- if (!actions.isEmpty()) {
- Slog.i(TAG, "oneTouchPlay already in progress");
- actions.get(0).addCallback(callback);
- return;
- }
- OneTouchPlayAction action = OneTouchPlayAction.create(this, Constants.ADDR_TV,
- callback);
- if (action == null) {
- Slog.w(TAG, "Cannot initiate oneTouchPlay");
- invokeCallback(callback, HdmiControlManager.RESULT_EXCEPTION);
- return;
- }
- addAndStartAction(action);
- }
-
- @ServiceThreadOnly
void queryDisplayStatus(IHdmiControlCallback callback) {
assertRunOnServiceThread();
List<DevicePowerStatusAction> actions = getActions(DevicePowerStatusAction.class);
@@ -137,16 +123,6 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
addAndStartAction(action);
}
- @ServiceThreadOnly
- private void invokeCallback(IHdmiControlCallback callback, int result) {
- assertRunOnServiceThread();
- try {
- callback.onComplete(result);
- } catch (RemoteException e) {
- Slog.e(TAG, "Invoking callback failed:" + e);
- }
- }
-
@Override
@ServiceThreadOnly
void onHotplug(int portId, boolean connected) {
@@ -189,7 +165,8 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
}
@ServiceThreadOnly
- void setActiveSource(boolean on) {
+ @VisibleForTesting
+ void setIsActiveSource(boolean on) {
assertRunOnServiceThread();
mIsActiveSource = on;
if (on) {
@@ -227,21 +204,6 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
return !getWakeLock().isHeld();
}
- @Override
- @ServiceThreadOnly
- protected boolean handleActiveSource(HdmiCecMessage message) {
- assertRunOnServiceThread();
- int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
- mayResetActiveSource(physicalAddress);
- return true; // Broadcast message.
- }
-
- private void mayResetActiveSource(int physicalAddress) {
- if (physicalAddress != mService.getPhysicalAddress()) {
- setActiveSource(false);
- }
- }
-
@ServiceThreadOnly
protected boolean handleUserControlPressed(HdmiCecMessage message) {
assertRunOnServiceThread();
@@ -250,42 +212,7 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
}
@Override
- @ServiceThreadOnly
- protected boolean handleSetStreamPath(HdmiCecMessage message) {
- assertRunOnServiceThread();
- int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
- maySetActiveSource(physicalAddress);
- maySendActiveSource(message.getSource());
- wakeUpIfActiveSource();
- return true; // Broadcast message.
- }
-
- // Samsung model we tested sends <Routing Change> and <Request Active Source>
- // in a row, and then changes the input to the internal source if there is no
- // <Active Source> in response. To handle this, we'll set ActiveSource aggressively.
- @Override
- @ServiceThreadOnly
- protected boolean handleRoutingChange(HdmiCecMessage message) {
- assertRunOnServiceThread();
- int newPath = HdmiUtils.twoBytesToInt(message.getParams(), 2);
- maySetActiveSource(newPath);
- return true; // Broadcast message.
- }
-
- @Override
- @ServiceThreadOnly
- protected boolean handleRoutingInformation(HdmiCecMessage message) {
- assertRunOnServiceThread();
- int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
- maySetActiveSource(physicalAddress);
- return true; // Broadcast message.
- }
-
- private void maySetActiveSource(int physicalAddress) {
- setActiveSource(physicalAddress == mService.getPhysicalAddress());
- }
-
- private void wakeUpIfActiveSource() {
+ protected void wakeUpIfActiveSource() {
if (!mIsActiveSource) {
return;
}
@@ -296,7 +223,8 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
}
}
- private void maySendActiveSource(int dest) {
+ @Override
+ protected void maySendActiveSource(int dest) {
if (mIsActiveSource) {
mService.sendCecCommand(HdmiCecMessageBuilder.buildActiveSource(
mAddress, mService.getPhysicalAddress()));
@@ -306,14 +234,6 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
}
}
- @Override
- @ServiceThreadOnly
- protected boolean handleRequestActiveSource(HdmiCecMessage message) {
- assertRunOnServiceThread();
- maySendActiveSource(message.getSource());
- return true; // Broadcast message.
- }
-
@ServiceThreadOnly
protected boolean handleSetMenuLanguage(HdmiCecMessage message) {
assertRunOnServiceThread();
@@ -361,16 +281,6 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
@Override
@ServiceThreadOnly
- protected void sendStandby(int deviceId) {
- assertRunOnServiceThread();
-
- // Playback device can send <Standby> to TV only. Ignore the parameter.
- int targetAddress = Constants.ADDR_TV;
- mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(mAddress, targetAddress));
- }
-
- @Override
- @ServiceThreadOnly
protected void disableDevice(boolean initiatedByCec, PendingActionClearedCallback callback) {
super.disableDevice(initiatedByCec, callback);
@@ -379,10 +289,20 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource(
mAddress, mService.getPhysicalAddress()));
}
- setActiveSource(false);
+ setIsActiveSource(false);
checkIfPendingActionsCleared();
}
+ private void routeToPort(int portId) {
+ // TODO(AMYJOJO): route to specific input of the port
+ mLocalActivePath = portId;
+ }
+
+ @VisibleForTesting
+ protected int getLocalActivePath() {
+ return mLocalActivePath;
+ }
+
@Override
protected void dump(final IndentingPrintWriter pw) {
super.dump(pw);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
new file mode 100644
index 000000000000..ae008b4bfa7a
--- /dev/null
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2018 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.hdmi;
+
+import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH;
+
+import android.hardware.hdmi.HdmiControlManager;
+import android.hardware.hdmi.HdmiPortInfo;
+import android.hardware.hdmi.IHdmiControlCallback;
+import android.os.SystemProperties;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.hdmi.Constants.LocalActivePort;
+import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
+
+import java.util.List;
+
+/**
+ * Represent a logical source device residing in Android system.
+ */
+abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
+
+ private static final String TAG = "HdmiCecLocalDeviceSource";
+
+ // Indicate if current device is Active Source or not
+ @VisibleForTesting
+ protected boolean mIsActiveSource = false;
+
+ // Device has cec switch functionality or not.
+ // Default is false.
+ protected boolean mIsSwitchDevice = SystemProperties.getBoolean(
+ PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH, false);
+
+ // Routing port number used for Routing Control.
+ // This records the default routing port or the previous valid routing port.
+ // Default is HOME input.
+ // Note that we don't save active path here because for source device,
+ // new Active Source physical address might not match the active path
+ @GuardedBy("mLock")
+ @LocalActivePort
+ private int mRoutingPort = Constants.CEC_SWITCH_HOME;
+
+ // This records the current input of the device.
+ // When device is switched to ARC input, mRoutingPort does not record it
+ // since it's not an HDMI port used for Routing Control.
+ // mLocalActivePort will record whichever input we switch to to keep tracking on
+ // the current input status of the device.
+ // This can help prevent duplicate switching and provide status information.
+ @GuardedBy("mLock")
+ @LocalActivePort
+ protected int mLocalActivePort = Constants.CEC_SWITCH_HOME;
+
+ // Whether the Routing Coutrol feature is enabled or not. False by default.
+ @GuardedBy("mLock")
+ protected boolean mRoutingControlFeatureEnabled;
+
+ protected HdmiCecLocalDeviceSource(HdmiControlService service, int deviceType) {
+ super(service, deviceType);
+ }
+
+ @Override
+ @ServiceThreadOnly
+ void onHotplug(int portId, boolean connected) {
+ assertRunOnServiceThread();
+ if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ mCecMessageCache.flushAll();
+ }
+ // We'll not clear mIsActiveSource on the hotplug event to pass CETC 11.2.2-2 ~ 3.
+ if (connected) {
+ mService.wakeUp();
+ }
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected void sendStandby(int deviceId) {
+ assertRunOnServiceThread();
+
+ // Send standby to TV only for now
+ int targetAddress = Constants.ADDR_TV;
+ mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(mAddress, targetAddress));
+ }
+
+ @ServiceThreadOnly
+ void oneTouchPlay(IHdmiControlCallback callback) {
+ assertRunOnServiceThread();
+ List<OneTouchPlayAction> actions = getActions(OneTouchPlayAction.class);
+ if (!actions.isEmpty()) {
+ Slog.i(TAG, "oneTouchPlay already in progress");
+ actions.get(0).addCallback(callback);
+ return;
+ }
+ OneTouchPlayAction action = OneTouchPlayAction.create(this, Constants.ADDR_TV,
+ callback);
+ if (action == null) {
+ Slog.w(TAG, "Cannot initiate oneTouchPlay");
+ invokeCallback(callback, HdmiControlManager.RESULT_EXCEPTION);
+ return;
+ }
+ addAndStartAction(action);
+ }
+
+ @ServiceThreadOnly
+ protected boolean handleActiveSource(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ int logicalAddress = message.getSource();
+ int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
+ ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress);
+ if (!getActiveSource().equals(activeSource)) {
+ setActiveSource(activeSource);
+ }
+ setIsActiveSource(physicalAddress == mService.getPhysicalAddress());
+ updateDevicePowerStatus(logicalAddress, HdmiControlManager.POWER_STATUS_ON);
+ if (isRoutingControlFeatureEnabled()) {
+ switchInputOnReceivingNewActivePath(physicalAddress);
+ }
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleRequestActiveSource(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ maySendActiveSource(message.getSource());
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleSetStreamPath(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
+ // If current device is the target path, set to Active Source.
+ // If the path is under the current device, should switch
+ if (physicalAddress == mService.getPhysicalAddress() && mService.isPlaybackDevice()) {
+ setAndBroadcastActiveSource(message, physicalAddress);
+ }
+ switchInputOnReceivingNewActivePath(physicalAddress);
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleRoutingChange(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ if (!isRoutingControlFeatureEnabled()) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ return true;
+ }
+ int newPath = HdmiUtils.twoBytesToInt(message.getParams(), 2);
+ // if the current device is a pure playback device
+ if (!mIsSwitchDevice
+ && newPath == mService.getPhysicalAddress()
+ && mService.isPlaybackDevice()) {
+ setAndBroadcastActiveSource(message, newPath);
+ }
+ handleRoutingChangeAndInformation(newPath, message);
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleRoutingInformation(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ if (!isRoutingControlFeatureEnabled()) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ return true;
+ }
+ int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
+ // if the current device is a pure playback device
+ if (!mIsSwitchDevice
+ && physicalAddress == mService.getPhysicalAddress()
+ && mService.isPlaybackDevice()) {
+ setAndBroadcastActiveSource(message, physicalAddress);
+ }
+ handleRoutingChangeAndInformation(physicalAddress, message);
+ return true;
+ }
+
+ // Method to switch Input with the new Active Path.
+ // All the devices with Switch functionality should implement this.
+ protected void switchInputOnReceivingNewActivePath(int physicalAddress) {
+ // do nothing
+ }
+
+ // Source device with Switch functionality should implement this method.
+ // TODO(): decide which type will handle the routing when multi device type is supported
+ protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) {
+ // do nothing
+ }
+
+ // Update the power status of the devices connected to the current device.
+ // This only works if the current device is a switch and keeps tracking the device info
+ // of the device connected to it.
+ protected void updateDevicePowerStatus(int logicalAddress, int newPowerStatus) {
+ // do nothing
+ }
+
+ // Active source claiming needs to be handled in Service
+ // since service can decide who will be the active source when the device supports
+ // multiple device types in this method.
+ // This method should only be called when the device can be the active source.
+ protected void setAndBroadcastActiveSource(HdmiCecMessage message, int physicalAddress) {
+ mService.setAndBroadcastActiveSource(
+ physicalAddress, getDeviceInfo().getDeviceType(), message.getSource());
+ }
+
+ @ServiceThreadOnly
+ void setIsActiveSource(boolean on) {
+ assertRunOnServiceThread();
+ mIsActiveSource = on;
+ }
+
+ protected void wakeUpIfActiveSource() {
+ if (!mIsActiveSource) {
+ return;
+ }
+ // Wake up the device
+ mService.wakeUp();
+ return;
+ }
+
+ protected void maySendActiveSource(int dest) {
+ if (mIsActiveSource) {
+ mService.sendCecCommand(HdmiCecMessageBuilder.buildActiveSource(
+ mAddress, mService.getPhysicalAddress()));
+ }
+ }
+
+ /**
+ * Set {@link #mRoutingPort} to a specific {@link LocalActivePort} to record the current active
+ * CEC Routing Control related port.
+ *
+ * @param portId The portId of the new routing port.
+ */
+ @VisibleForTesting
+ protected void setRoutingPort(@LocalActivePort int portId) {
+ synchronized (mLock) {
+ mRoutingPort = portId;
+ }
+ }
+
+ /**
+ * Get {@link #mRoutingPort}. This is useful when the device needs to route to the last valid
+ * routing port.
+ */
+ @LocalActivePort
+ protected int getRoutingPort() {
+ synchronized (mLock) {
+ return mRoutingPort;
+ }
+ }
+
+ /**
+ * Get {@link #mLocalActivePort}. This is useful when device needs to know the current active
+ * port.
+ */
+ @LocalActivePort
+ protected int getLocalActivePort() {
+ synchronized (mLock) {
+ return mLocalActivePort;
+ }
+ }
+
+ /**
+ * Set {@link #mLocalActivePort} to a specific {@link LocalActivePort} to record the current
+ * active port.
+ *
+ * <p>It does not have to be a Routing Control related port. For example it can be
+ * set to {@link Constants#CEC_SWITCH_ARC} but this port is System Audio related.
+ *
+ * @param activePort The portId of the new active port.
+ */
+ protected void setLocalActivePort(@LocalActivePort int activePort) {
+ synchronized (mLock) {
+ mLocalActivePort = activePort;
+ }
+ }
+
+ boolean isRoutingControlFeatureEnabled() {
+ synchronized (mLock) {
+ return mRoutingControlFeatureEnabled;
+ }
+ }
+
+ // Check if the device is trying to switch to the same input that is active right now.
+ // This can help avoid redundant port switching.
+ protected boolean isSwitchingToTheSameInput(@LocalActivePort int activePort) {
+ return activePort == getLocalActivePort();
+ }
+}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 25ca27836aa7..a8c435086e8e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -41,17 +41,18 @@ import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager.TvInputCallback;
-import android.os.RemoteException;
import android.provider.Settings.Global;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
+
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -307,7 +308,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
private void handleSelectInternalSource() {
assertRunOnServiceThread();
// Seq #18
- if (mService.isControlEnabled() && mActiveSource.logicalAddress != mAddress) {
+ if (mService.isControlEnabled() && getActiveSource().logicalAddress != mAddress) {
updateActiveSource(mAddress, mService.getPhysicalAddress());
if (mSkipRoutingControl) {
mSkipRoutingControl = false;
@@ -329,7 +330,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
void updateActiveSource(ActiveSource newActive) {
assertRunOnServiceThread();
// Seq #14
- if (mActiveSource.equals(newActive)) {
+ if (getActiveSource().equals(newActive)) {
return;
}
setActiveSource(newActive);
@@ -345,10 +346,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
}
}
- int getPortId(int physicalAddress) {
- return mService.pathToPortId(physicalAddress);
- }
-
/**
* Returns the previous port id kept to handle input switching on <Inactive Source>.
*/
@@ -402,7 +399,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
return;
}
- mActiveSource.invalidate();
+ getActiveSource().invalidate();
if (!mService.isControlEnabled()) {
setActivePortId(portId);
invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
@@ -452,17 +449,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
return Constants.ADDR_INVALID;
}
- private static void invokeCallback(IHdmiControlCallback callback, int result) {
- if (callback == null) {
- return;
- }
- try {
- callback.onComplete(result);
- } catch (RemoteException e) {
- Slog.e(TAG, "Invoking callback failed:" + e);
- }
- }
-
@Override
@ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) {
@@ -518,7 +504,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
} else {
// No HDMI port to switch to was found. Notify the input change listers to
// switch to the lastly shown internal input.
- mActiveSource.invalidate();
+ getActiveSource().invalidate();
setActivePath(Constants.INVALID_PHYSICAL_ADDRESS);
mService.invokeInputChangeListener(HdmiDeviceInfo.INACTIVE_DEVICE);
}
@@ -685,7 +671,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
byte[] params = message.getParams();
int currentPath = HdmiUtils.twoBytesToInt(params);
if (HdmiUtils.isAffectingActiveRoutingPath(getActivePath(), currentPath)) {
- mActiveSource.invalidate();
+ getActiveSource().invalidate();
removeAction(RoutingControlAction.class);
int newPath = HdmiUtils.twoBytesToInt(params, 2);
addAndStartAction(new RoutingControlAction(this, newPath, true, null));
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
index c0056158a9c5..f8b39627f236 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
@@ -17,6 +17,7 @@
package com.android.server.hdmi;
import android.annotation.Nullable;
+
import libcore.util.EmptyArray;
import java.util.Arrays;
@@ -111,12 +112,11 @@ public final class HdmiCecMessage {
@Override
public String toString() {
StringBuffer s = new StringBuffer();
- s.append(String.format("<%s> src: %d, dst: %d",
- opcodeToString(mOpcode), mSource, mDestination));
+ s.append(String.format("<%s> %X%X:%02X",
+ opcodeToString(mOpcode), mSource, mDestination, mOpcode));
if (mParams.length > 0) {
- s.append(", params:");
for (byte data : mParams) {
- s.append(String.format(" %02X", data));
+ s.append(String.format(":%02X", data));
}
}
return s.toString();
@@ -133,7 +133,7 @@ public final class HdmiCecMessage {
case Constants.MESSAGE_TUNER_STEP_DECREMENT:
return "Tuner Step Decrement";
case Constants.MESSAGE_TUNER_DEVICE_STATUS:
- return "Tuner Device Staus";
+ return "Tuner Device Status";
case Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS:
return "Give Tuner Device Status";
case Constants.MESSAGE_RECORD_ON:
@@ -207,7 +207,7 @@ public final class HdmiCecMessage {
case Constants.MESSAGE_DEVICE_VENDOR_ID:
return "Device Vendor Id";
case Constants.MESSAGE_VENDOR_COMMAND:
- return "Vendor Commandn";
+ return "Vendor Command";
case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN:
return "Vendor Remote Button Down";
case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP:
@@ -215,7 +215,7 @@ public final class HdmiCecMessage {
case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
return "Give Device Vendor Id";
case Constants.MESSAGE_MENU_REQUEST:
- return "Menu REquest";
+ return "Menu Request";
case Constants.MESSAGE_MENU_STATUS:
return "Menu Status";
case Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS:
@@ -247,7 +247,7 @@ public final class HdmiCecMessage {
case Constants.MESSAGE_SET_EXTERNAL_TIMER:
return "Set External Timer";
case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR:
- return "Repot Short Audio Descriptor";
+ return "Report Short Audio Descriptor";
case Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR:
return "Request Short Audio Descriptor";
case Constants.MESSAGE_INITIATE_ARC:
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
index 941c321d484a..3f949bab8a2e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
@@ -365,6 +365,20 @@ public class HdmiCecMessageBuilder {
}
/**
+ * Build &lt;Routing Information&gt; command.
+ *
+ * <p>This is a broadcast message sent to all devices on the bus.
+ *
+ * @param src source address of command
+ * @param physicalAddress physical address of the new active routing path
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildRoutingInformation(int src, int physicalAddress) {
+ return buildCommand(src, Constants.ADDR_BROADCAST,
+ Constants.MESSAGE_ROUTING_INFORMATION, physicalAddressToParam(physicalAddress));
+ }
+
+ /**
* Build &lt;Give Device Power Status&gt; command.
*
* @param src source address of command
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 3420b263eac5..46219d5cbe8a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -19,12 +19,15 @@ package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE;
import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE;
+import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH;
+import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static com.android.server.hdmi.Constants.DISABLED;
import static com.android.server.hdmi.Constants.ENABLED;
import static com.android.server.hdmi.Constants.OPTION_MHL_ENABLE;
import static com.android.server.hdmi.Constants.OPTION_MHL_INPUT_SWITCHING;
import static com.android.server.hdmi.Constants.OPTION_MHL_POWER_CHARGE;
import static com.android.server.hdmi.Constants.OPTION_MHL_SERVICE_CONTROL;
+import static com.android.server.power.ShutdownThread.SHUTDOWN_ACTION_PROPERTY;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
@@ -140,6 +143,14 @@ public class HdmiControlService extends SystemService {
static final int STANDBY_SCREEN_OFF = 0;
static final int STANDBY_SHUTDOWN = 1;
+ // Logical address of the active source.
+ @GuardedBy("mLock")
+ protected final ActiveSource mActiveSource = new ActiveSource();
+
+ private static final boolean isHdmiCecNeverClaimPlaybackLogicAddr =
+ SystemProperties.getBoolean(
+ Constants.PROPERTY_HDMI_CEC_NEVER_CLAIM_PLAYBACK_LOGICAL_ADDRESS, false);
+
/**
* Interface to report send result.
*/
@@ -175,9 +186,10 @@ public class HdmiControlService extends SystemService {
@Override
public void onReceive(Context context, Intent intent) {
assertRunOnServiceThread();
+ boolean isReboot = SystemProperties.get(SHUTDOWN_ACTION_PROPERTY).contains("1");
switch (intent.getAction()) {
case Intent.ACTION_SCREEN_OFF:
- if (isPowerOnOrTransient()) {
+ if (isPowerOnOrTransient() && !isReboot) {
onStandby(STANDBY_SCREEN_OFF);
}
break;
@@ -193,7 +205,7 @@ public class HdmiControlService extends SystemService {
}
break;
case Intent.ACTION_SHUTDOWN:
- if (isPowerOnOrTransient()) {
+ if (isPowerOnOrTransient() && !isReboot) {
onStandby(STANDBY_SHUTDOWN);
}
break;
@@ -336,6 +348,10 @@ public class HdmiControlService extends SystemService {
@Nullable
private Looper mIoLooper;
+ // Thread safe physical address
+ @GuardedBy("mLock")
+ private int mPhysicalAddress = Constants.INVALID_PHYSICAL_ADDRESS;
+
// Last input port before switching to the MHL port. Should switch back to this port
// when the mobile device sends the request one touch play with off.
// Gets invalidated if we go to other port/input.
@@ -413,7 +429,7 @@ public class HdmiControlService extends SystemService {
mSettingsObserver = new SettingsObserver(mHandler);
}
- private static List<Integer> getIntList(String string) {
+ protected static List<Integer> getIntList(String string) {
ArrayList<Integer> list = new ArrayList<>();
TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
splitter.setString(string);
@@ -555,7 +571,8 @@ public class HdmiControlService extends SystemService {
Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Global.MHL_INPUT_SWITCHING_ENABLED,
- Global.MHL_POWER_CHARGE_ENABLED
+ Global.MHL_POWER_CHARGE_ENABLED,
+ Global.HDMI_CEC_SWITCH_ENABLED
};
for (String s : settings) {
resolver.registerContentObserver(Global.getUriFor(s), false, mSettingsObserver,
@@ -596,6 +613,24 @@ public class HdmiControlService extends SystemService {
if (isTvDeviceEnabled()) {
tv().setSystemAudioControlFeatureEnabled(enabled);
}
+ if (isAudioSystemDevice()) {
+ if (audioSystem() == null) {
+ Slog.e(TAG, "Audio System device has not registered yet."
+ + " Can't turn system audio mode on.");
+ break;
+ }
+ audioSystem().onSystemAduioControlFeatureSupportChanged(enabled);
+ }
+ break;
+ case Global.HDMI_CEC_SWITCH_ENABLED:
+ if (isAudioSystemDevice()) {
+ if (audioSystem() == null) {
+ Slog.w(TAG, "Switch device has not registered yet."
+ + " Can't turn routing on.");
+ break;
+ }
+ audioSystem().setRoutingControlFeatureEnables(enabled);
+ }
break;
case Global.MHL_INPUT_SWITCHING_ENABLED:
setMhlInputChangeEnabled(enabled);
@@ -611,6 +646,7 @@ public class HdmiControlService extends SystemService {
return enabled ? ENABLED : DISABLED;
}
+ @VisibleForTesting
boolean readBooleanSetting(String key, boolean defVal) {
ContentResolver cr = getContext().getContentResolver();
return Global.getInt(cr, key, toInt(defVal)) == ENABLED;
@@ -621,6 +657,11 @@ public class HdmiControlService extends SystemService {
Global.putInt(cr, key, toInt(value));
}
+ void writeStringSetting(String key, String value) {
+ ContentResolver cr = getContext().getContentResolver();
+ Global.putString(cr, key, value);
+ }
+
private void initializeCec(int initiatedBy) {
mAddressAllocated = false;
mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true);
@@ -634,6 +675,10 @@ public class HdmiControlService extends SystemService {
// A container for [Device type, Local device info].
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
for (int type : mLocalDevices) {
+ if (type == HdmiDeviceInfo.DEVICE_PLAYBACK
+ && isHdmiCecNeverClaimPlaybackLogicAddr) {
+ continue;
+ }
HdmiCecLocalDevice localDevice = mCecController.getLocalDevice(type);
if (localDevice == null) {
localDevice = HdmiCecLocalDevice.create(this, type);
@@ -721,6 +766,10 @@ public class HdmiControlService extends SystemService {
assertRunOnServiceThread();
HdmiPortInfo[] cecPortInfo = null;
+ synchronized (mLock) {
+ mPhysicalAddress = getPhysicalAddress();
+ }
+
// CEC HAL provides majority of the info while MHL does only MHL support flag for
// each port. Return empty array if CEC HAL didn't provide the info.
if (mCecController != null) {
@@ -742,6 +791,9 @@ public class HdmiControlService extends SystemService {
mPortInfoMap = new UnmodifiableSparseArray<>(portInfoMap);
mPortDeviceMap = new UnmodifiableSparseArray<>(portDeviceMap);
+ if (mMhlController == null) {
+ return;
+ }
HdmiPortInfo[] mhlPortInfo = mMhlController.getPortInfos();
ArraySet<Integer> mhlSupportedPorts = new ArraySet<Integer>(mhlPortInfo.length);
for (HdmiPortInfo info : mhlPortInfo) {
@@ -796,13 +848,34 @@ public class HdmiControlService extends SystemService {
}
/**
- * Returns the id of HDMI port located at the top of the hierarchy of
- * the specified routing path. For the routing path 0x1220 (1.2.2.0), for instance,
- * the port id to be returned is the ID associated with the port address
- * 0x1000 (1.0.0.0) which is the topmost path of the given routing path.
+ * Returns the id of HDMI port located at the current device that runs this method.
+ *
+ * For TV with physical address 0x0000, target device 0x1120, we want port physical address
+ * 0x1000 to get the correct port id from {@link #mPortIdMap}. For device with Physical Address
+ * 0x2000, target device 0x2420, we want port address 0x24000 to get the port id.
+ *
+ * <p>Return {@link Constants#INVALID_PORT_ID} if target device does not connect to.
+ *
+ * @param path the target device's physical address.
+ * @return the id of the port that the target device eventually connects to
+ * on the current device.
*/
int pathToPortId(int path) {
- int portAddress = path & Constants.ROUTING_PATH_TOP_MASK;
+ int mask = 0xF000;
+ int finalMask = 0xF000;
+ int physicalAddress;
+ synchronized (mLock) {
+ physicalAddress = mPhysicalAddress;
+ }
+ int maskedAddress = physicalAddress;
+
+ while (maskedAddress != 0) {
+ maskedAddress = physicalAddress & mask;
+ finalMask |= mask;
+ mask >>= 4;
+ }
+
+ int portAddress = path & finalMask;
return mPortIdMap.get(portAddress, Constants.INVALID_PORT_ID);
}
@@ -995,9 +1068,18 @@ public class HdmiControlService extends SystemService {
void onHotplug(int portId, boolean connected) {
assertRunOnServiceThread();
- if (connected && !isTvDevice()) {
+ if (connected && !isTvDevice()
+ && getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ if (isSwitchDevice()) {
+ initPortInfo();
+ HdmiLogger.debug("initPortInfo for switch device when onHotplug from tx.");
+ }
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
for (int type : mLocalDevices) {
+ if (type == HdmiDeviceInfo.DEVICE_PLAYBACK
+ && isHdmiCecNeverClaimPlaybackLogicAddr) {
+ continue;
+ }
HdmiCecLocalDevice localDevice = mCecController.getLocalDevice(type);
if (localDevice == null) {
localDevice = HdmiCecLocalDevice.create(this, type);
@@ -1092,7 +1174,7 @@ public class HdmiControlService extends SystemService {
String displayName = Build.MODEL;
return new HdmiDeviceInfo(logicalAddress,
getPhysicalAddress(), pathToPortId(getPhysicalAddress()), deviceType,
- getVendorId(), displayName);
+ getVendorId(), displayName, powerStatus);
}
@ServiceThreadOnly
@@ -1311,6 +1393,33 @@ public class HdmiControlService extends SystemService {
HdmiCecLocalDeviceTv tv = tv();
if (tv == null) {
Slog.w(TAG, "Local tv device not available");
+ if (isPlaybackDevice()) {
+ // if playback device itself is the active source,
+ // return its own device info.
+ if (playback() != null && playback().mIsActiveSource) {
+ return playback().getDeviceInfo();
+ }
+ // Otherwise get the active source and look for it from the device list
+ ActiveSource activeSource = mActiveSource;
+ // If the active source is not set yet, return null
+ if (!activeSource.isValid()) {
+ return null;
+ }
+ if (audioSystem() != null) {
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ for (HdmiDeviceInfo info : audioSystem.getSafeCecDevicesLocked()) {
+ if (info.getLogicalAddress() == activeSource.logicalAddress) {
+ return info;
+ }
+ }
+ }
+ // If the device info is not in the list yet, return a device info with minimum
+ // information from mActiveSource.
+ return new HdmiDeviceInfo(activeSource.logicalAddress,
+ activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress),
+ HdmiUtils.getTypeFromAddress(activeSource.logicalAddress), 0,
+ HdmiUtils.getDefaultDeviceName(activeSource.logicalAddress));
+ }
return null;
}
ActiveSource activeSource = tv.getActiveSource();
@@ -1377,17 +1486,24 @@ public class HdmiControlService extends SystemService {
return;
}
HdmiCecLocalDeviceTv tv = tv();
- if (tv == null) {
- if (!mAddressAllocated) {
- mSelectRequestBuffer.set(SelectRequestBuffer.newPortSelect(
- HdmiControlService.this, portId, callback));
- return;
- }
- Slog.w(TAG, "Local tv device not available");
- invokeCallback(callback, HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE);
+ if (tv != null) {
+ tv.doManualPortSwitching(portId, callback);
+ return;
+ }
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ if (audioSystem != null) {
+ audioSystem.doManualPortSwitching(portId, callback);
return;
}
- tv.doManualPortSwitching(portId, callback);
+
+ if (!mAddressAllocated) {
+ mSelectRequestBuffer.set(SelectRequestBuffer.newPortSelect(
+ HdmiControlService.this, portId, callback));
+ return;
+ }
+ Slog.w(TAG, "Local device not available");
+ invokeCallback(callback, HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE);
+ return;
}
});
}
@@ -1482,6 +1598,14 @@ public class HdmiControlService extends SystemService {
}
@Override
+ public int getPhysicalAddress() {
+ enforceAccessPermission();
+ synchronized (mLock) {
+ return mPhysicalAddress;
+ }
+ }
+
+ @Override
public void setSystemAudioMode(final boolean enabled, final IHdmiControlCallback callback) {
enforceAccessPermission();
runOnServiceThread(new Runnable() {
@@ -1538,14 +1662,62 @@ public class HdmiControlService extends SystemService {
public List<HdmiDeviceInfo> getDeviceList() {
enforceAccessPermission();
HdmiCecLocalDeviceTv tv = tv();
- synchronized (mLock) {
- return (tv == null)
+ if (tv != null) {
+ synchronized (mLock) {
+ return tv.getSafeCecDevicesLocked();
+ }
+ } else {
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ synchronized (mLock) {
+ return (audioSystem == null)
? Collections.<HdmiDeviceInfo>emptyList()
- : tv.getSafeCecDevicesLocked();
+ : audioSystem.getSafeCecDevicesLocked();
+ }
}
}
@Override
+ public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {
+ enforceAccessPermission();
+ runOnServiceThread(new Runnable() {
+ @Override
+ public void run() {
+ Slog.w(TAG, "Device "
+ + logicalAddress + " power status is " + powerStatus
+ + " before standby command sent out");
+ sendCecCommand(HdmiCecMessageBuilder.buildStandby(
+ getRemoteControlSourceAddress(), logicalAddress));
+ }
+ });
+ }
+
+ @Override
+ public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {
+ // TODO(amyjojo): implement the method
+ }
+
+ @Override
+ // TODO(AMYJOJO): add a result callback
+ public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {
+ enforceAccessPermission();
+ runOnServiceThread(new Runnable() {
+ @Override
+ public void run() {
+ HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(
+ getRemoteControlSourceAddress(), physicalAddress);
+ if (pathToPortId(physicalAddress) != Constants.INVALID_PORT_ID) {
+ if (getSwitchDevice() != null) {
+ getSwitchDevice().handleSetStreamPath(setStreamPath);
+ } else {
+ Slog.e(TAG, "Can't get the correct local device to handle routing.");
+ }
+ }
+ sendCecCommand(setStreamPath);
+ }
+ });
+ }
+
+ @Override
public void setSystemAudioVolume(final int oldIndex, final int newIndex,
final int maxIndex) {
enforceAccessPermission();
@@ -1646,6 +1818,9 @@ public class HdmiControlService extends SystemService {
}
HdmiCecLocalDevice device = mCecController.getLocalDevice(deviceType);
if (device == null) {
+ device = audioSystem();
+ }
+ if (device == null) {
Slog.w(TAG, "Local device not available");
return;
}
@@ -1781,14 +1956,32 @@ public class HdmiControlService extends SystemService {
Slog.w(TAG, "audio system is not in system audio mode");
return;
}
- int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume);
-
- sendCecCommand(HdmiCecMessageBuilder
- .buildReportAudioStatus(
- device.getDeviceInfo().getLogicalAddress(),
- Constants.ADDR_TV,
- scaledVolume,
- isMute));
+ audioSystem().reportAudioStatus(Constants.ADDR_TV);
+ }
+ });
+ }
+
+ @Override
+ public void setSystemAudioModeOnForAudioOnlySource() {
+ enforceAccessPermission();
+ runOnServiceThread(new Runnable() {
+ @Override
+ public void run() {
+ if (!isAudioSystemDevice()) {
+ Slog.e(TAG, "Not an audio system device. Won't set system audio mode on");
+ return;
+ }
+ if (audioSystem() == null) {
+ Slog.e(TAG, "Audio System local device is not registered");
+ return;
+ }
+ if (!audioSystem().checkSupportAndSetSystemAudioMode(true)) {
+ Slog.e(TAG, "System Audio Mode is not supported.");
+ return;
+ }
+ sendCecCommand(
+ HdmiCecMessageBuilder.buildSetSystemAudioMode(
+ audioSystem().mAddress, Constants.ADDR_BROADCAST, true));
}
});
}
@@ -1798,36 +1991,64 @@ public class HdmiControlService extends SystemService {
if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) return;
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
- pw.println("mHdmiControlEnabled: " + mHdmiControlEnabled);
pw.println("mProhibitMode: " + mProhibitMode);
+ pw.println("mPowerStatus: " + mPowerStatus);
+
+ // System settings
+ pw.println("System_settings:");
+ pw.increaseIndent();
+ pw.println("mHdmiControlEnabled: " + mHdmiControlEnabled);
+ pw.println("mMhlInputChangeEnabled: " + mMhlInputChangeEnabled);
+ pw.decreaseIndent();
+
+ pw.println("mMhlController: ");
+ pw.increaseIndent();
+ mMhlController.dump(pw);
+ pw.decreaseIndent();
+
+ HdmiUtils.dumpIterable(pw, "mPortInfo:", mPortInfo);
if (mCecController != null) {
pw.println("mCecController: ");
pw.increaseIndent();
mCecController.dump(pw);
pw.decreaseIndent();
}
+ }
+ }
- pw.println("mMhlController: ");
- pw.increaseIndent();
- mMhlController.dump(pw);
- pw.decreaseIndent();
+ // Get the source address to send out commands to devices connected to the current device
+ // when other services interact with HdmiControlService.
+ private int getRemoteControlSourceAddress() {
+ if (isAudioSystemDevice()) {
+ return audioSystem().getDeviceInfo().getLogicalAddress();
+ } else if (isPlaybackDevice()) {
+ return playback().getDeviceInfo().getLogicalAddress();
+ }
+ return ADDR_UNREGISTERED;
+ }
- pw.println("mPortInfo: ");
- pw.increaseIndent();
- for (HdmiPortInfo hdmiPortInfo : mPortInfo) {
- pw.println("- " + hdmiPortInfo);
- }
- pw.decreaseIndent();
- pw.println("mPowerStatus: " + mPowerStatus);
+ // Get the switch device to do CEC routing control
+ @Nullable
+ private HdmiCecLocalDeviceSource getSwitchDevice() {
+ if (isAudioSystemDevice()) {
+ return audioSystem();
+ }
+ if (isPlaybackDevice()) {
+ return playback();
}
+ return null;
}
@ServiceThreadOnly
private void oneTouchPlay(final IHdmiControlCallback callback) {
assertRunOnServiceThread();
- HdmiCecLocalDevicePlayback source = playback();
+ HdmiCecLocalDeviceSource source = playback();
if (source == null) {
- Slog.w(TAG, "Local playback device not available");
+ source = audioSystem();
+ }
+
+ if (source == null) {
+ Slog.w(TAG, "Local source device not available");
invokeCallback(callback, HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE);
return;
}
@@ -2090,11 +2311,20 @@ public class HdmiControlService extends SystemService {
return mLocalDevices.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
}
+ boolean isPlaybackDevice() {
+ return mLocalDevices.contains(HdmiDeviceInfo.DEVICE_PLAYBACK);
+ }
+
+ boolean isSwitchDevice() {
+ return SystemProperties.getBoolean(
+ PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH, false);
+ }
+
boolean isTvDeviceEnabled() {
return isTvDevice() && tv() != null;
}
- private HdmiCecLocalDevicePlayback playback() {
+ protected HdmiCecLocalDevicePlayback playback() {
return (HdmiCecLocalDevicePlayback)
mCecController.getLocalDevice(HdmiDeviceInfo.DEVICE_PLAYBACK);
}
@@ -2465,6 +2695,77 @@ public class HdmiControlService extends SystemService {
setLastInputForMhl(Constants.INVALID_PORT_ID);
}
+ ActiveSource getActiveSource() {
+ synchronized (mLock) {
+ return mActiveSource;
+ }
+ }
+
+ void setActiveSource(int logicalAddress, int physicalAddress) {
+ synchronized (mLock) {
+ mActiveSource.logicalAddress = logicalAddress;
+ mActiveSource.physicalAddress = physicalAddress;
+ }
+ }
+
+ // This method should only be called when the device can be the active source
+ // and all the device types call into this method.
+ // For example, when receiving broadcast messages, all the device types will call this
+ // method but only one of them will be the Active Source.
+ protected void setAndBroadcastActiveSource(
+ int physicalAddress, int deviceType, int source) {
+ // If the device has both playback and audio system logical addresses,
+ // playback will claim active source. Otherwise audio system will.
+ if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) {
+ HdmiCecLocalDevicePlayback playback = playback();
+ playback.setIsActiveSource(true);
+ playback.wakeUpIfActiveSource();
+ playback.maySendActiveSource(source);
+ setActiveSource(playback.mAddress, physicalAddress);
+ }
+
+ if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) {
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ if (playback() != null) {
+ audioSystem.setIsActiveSource(false);
+ } else {
+ audioSystem.setIsActiveSource(true);
+ audioSystem.wakeUpIfActiveSource();
+ audioSystem.maySendActiveSource(source);
+ setActiveSource(audioSystem.mAddress, physicalAddress);
+ }
+ }
+ }
+
+ // This method should only be called when the device can be the active source
+ // and only one of the device types calls into this method.
+ // For example, when receiving One Touch Play, only playback device handles it
+ // and this method updates Active Source in all the device types sharing the same
+ // Physical Address.
+ protected void setAndBroadcastActiveSourceFromOneDeviceType(
+ int sourceAddress, int physicalAddress) {
+ // If the device has both playback and audio system logical addresses,
+ // playback will claim active source. Otherwise audio system will.
+ HdmiCecLocalDevicePlayback playback = playback();
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ if (playback != null) {
+ playback.setIsActiveSource(true);
+ playback.wakeUpIfActiveSource();
+ playback.maySendActiveSource(sourceAddress);
+ if (audioSystem != null) {
+ audioSystem.setIsActiveSource(false);
+ }
+ setActiveSource(playback.mAddress, physicalAddress);
+ } else {
+ if (audioSystem != null) {
+ audioSystem.setIsActiveSource(true);
+ audioSystem.wakeUpIfActiveSource();
+ audioSystem.maySendActiveSource(sourceAddress);
+ setActiveSource(audioSystem.mAddress, physicalAddress);
+ }
+ }
+ }
+
@ServiceThreadOnly
void setLastInputForMhl(int portId) {
assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java
index 2a8117fac68d..e44f1d1522ec 100644
--- a/services/core/java/com/android/server/hdmi/HdmiUtils.java
+++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java
@@ -16,19 +16,35 @@
package com.android.server.hdmi;
+import android.annotation.Nullable;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.Xml;
+import com.android.internal.util.HexDump;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.hdmi.Constants.AudioCodec;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.Objects;
/**
* Various utilities to handle HDMI CEC messages.
*/
final class HdmiUtils {
+ private static final String TAG = "HdmiUtils";
+
private static final int[] ADDRESS_TO_TYPE = {
HdmiDeviceInfo.DEVICE_TV, // ADDR_TV
HdmiDeviceInfo.DEVICE_RECORDER, // ADDR_RECORDER_1
@@ -65,6 +81,12 @@ final class HdmiUtils {
"Secondary_TV",
};
+ /**
+ * Return value of {@link #getLocalPortFromPhysicalAddress(int, int)}
+ */
+ static final int TARGET_NOT_UNDER_LOCAL_DEVICE = -1;
+ static final int TARGET_SAME_PHYSICAL_ADDRESS = 0;
+
private HdmiUtils() { /* cannot be instantiated */ }
/**
@@ -317,4 +339,339 @@ final class HdmiUtils {
info.getPhysicalAddress(), info.getPortId(), info.getDeviceType(),
info.getVendorId(), info.getDisplayName(), newPowerStatus);
}
+
+ /**
+ * Dump a {@link SparseArray} to the print writer.
+ *
+ * <p>The dump is formatted:
+ * <pre>
+ * name:
+ * key = value
+ * key = value
+ * ...
+ * </pre>
+ */
+ static <T> void dumpSparseArray(IndentingPrintWriter pw, String name,
+ SparseArray<T> sparseArray) {
+ printWithTrailingColon(pw, name);
+ pw.increaseIndent();
+ int size = sparseArray.size();
+ for (int i = 0; i < size; i++) {
+ int key = sparseArray.keyAt(i);
+ T value = sparseArray.get(key);
+ pw.printPair(Integer.toString(key), value);
+ pw.println();
+ }
+ pw.decreaseIndent();
+ }
+
+ private static void printWithTrailingColon(IndentingPrintWriter pw, String name) {
+ pw.println(name.endsWith(":") ? name : name.concat(":"));
+ }
+
+ /**
+ * Dump a {@link Map} to the print writer.
+ *
+ * <p>The dump is formatted:
+ * <pre>
+ * name:
+ * key = value
+ * key = value
+ * ...
+ * </pre>
+ */
+ static <K, V> void dumpMap(IndentingPrintWriter pw, String name, Map<K, V> map) {
+ printWithTrailingColon(pw, name);
+ pw.increaseIndent();
+ for (Map.Entry<K, V> entry: map.entrySet()) {
+ pw.printPair(entry.getKey().toString(), entry.getValue());
+ pw.println();
+ }
+ pw.decreaseIndent();
+ }
+
+ /**
+ * Dump a {@link Map} to the print writer.
+ *
+ * <p>The dump is formatted:
+ * <pre>
+ * name:
+ * value
+ * value
+ * ...
+ * </pre>
+ */
+ static <T> void dumpIterable(IndentingPrintWriter pw, String name, Iterable<T> values) {
+ printWithTrailingColon(pw, name);
+ pw.increaseIndent();
+ for (T value : values) {
+ pw.println(value);
+ }
+ pw.decreaseIndent();
+ }
+
+ /**
+ * Method to parse target physical address to the port number on the current device.
+ *
+ * <p>This check assumes target address is valid.
+ *
+ * @param targetPhysicalAddress is the physical address of the target device
+ * @param myPhysicalAddress is the physical address of the current device
+ * @return
+ * If the target device is under the current device, return the port number of current device
+ * that the target device is connected to. This also applies to the devices that are indirectly
+ * connected to the current device.
+ *
+ * <p>If the target device has the same physical address as the current device, return
+ * {@link #TARGET_SAME_PHYSICAL_ADDRESS}.
+ *
+ * <p>If the target device is not under the current device, return
+ * {@link #TARGET_NOT_UNDER_LOCAL_DEVICE}.
+ */
+ public static int getLocalPortFromPhysicalAddress(
+ int targetPhysicalAddress, int myPhysicalAddress) {
+ if (myPhysicalAddress == targetPhysicalAddress) {
+ return TARGET_SAME_PHYSICAL_ADDRESS;
+ }
+
+ int mask = 0xF000;
+ int finalMask = 0xF000;
+ int maskedAddress = myPhysicalAddress;
+
+ while (maskedAddress != 0) {
+ maskedAddress = myPhysicalAddress & mask;
+ finalMask |= mask;
+ mask >>= 4;
+ }
+
+ int portAddress = targetPhysicalAddress & finalMask;
+ if ((portAddress & (finalMask << 4)) != myPhysicalAddress) {
+ return TARGET_NOT_UNDER_LOCAL_DEVICE;
+ }
+
+ mask <<= 4;
+ int port = portAddress & mask;
+ while ((port >> 4) != 0) {
+ port >>= 4;
+ }
+ return port;
+ }
+
+ public static class ShortAudioDescriptorXmlParser {
+ // We don't use namespaces
+ private static final String NS = null;
+
+ // return a list of devices config
+ public static List<DeviceConfig> parse(InputStream in)
+ throws XmlPullParserException, IOException {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
+ parser.setInput(in, null);
+ parser.nextTag();
+ return readDevices(parser);
+ }
+
+ private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ throw new IllegalStateException();
+ }
+ int depth = 1;
+ while (depth != 0) {
+ switch (parser.next()) {
+ case XmlPullParser.END_TAG:
+ depth--;
+ break;
+ case XmlPullParser.START_TAG:
+ depth++;
+ break;
+ }
+ }
+ }
+
+ private static List<DeviceConfig> readDevices(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ List<DeviceConfig> devices = new ArrayList<>();
+
+ parser.require(XmlPullParser.START_TAG, NS, "config");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ // Starts by looking for the device tag
+ if (name.equals("device")) {
+ String deviceType = parser.getAttributeValue(null, "type");
+ DeviceConfig config = null;
+ if (deviceType != null) {
+ config = readDeviceConfig(parser, deviceType);
+ }
+ if (config != null) {
+ devices.add(config);
+ }
+ } else {
+ skip(parser);
+ }
+ }
+ return devices;
+ }
+
+ // Processes device tags in the config.
+ @Nullable
+ private static DeviceConfig readDeviceConfig(XmlPullParser parser, String deviceType)
+ throws XmlPullParserException, IOException {
+ List<CodecSad> codecSads = new ArrayList<>();
+ int format;
+ byte[] descriptor;
+
+ parser.require(XmlPullParser.START_TAG, NS, "device");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String tagName = parser.getName();
+
+ // Starts by looking for the supportedFormat tag
+ if (tagName.equals("supportedFormat")) {
+ String codecAttriValue = parser.getAttributeValue(null, "format");
+ String sadAttriValue = parser.getAttributeValue(null, "descriptor");
+ format = (codecAttriValue) == null
+ ? Constants.AUDIO_CODEC_NONE : formatNameToNum(codecAttriValue);
+ descriptor = readSad(sadAttriValue);
+ if (format != Constants.AUDIO_CODEC_NONE && descriptor != null) {
+ codecSads.add(new CodecSad(format, descriptor));
+ }
+ parser.nextTag();
+ parser.require(XmlPullParser.END_TAG, NS, "supportedFormat");
+ } else {
+ skip(parser);
+ }
+ }
+ if (codecSads.size() == 0) {
+ return null;
+ }
+ return new DeviceConfig(deviceType, codecSads);
+ }
+
+ // Processes sad attribute in the supportedFormat.
+ @Nullable
+ private static byte[] readSad(String sad) {
+ if (sad == null || sad.length() == 0) {
+ return null;
+ }
+ byte[] sadBytes = HexDump.hexStringToByteArray(sad);
+ if (sadBytes.length != 3) {
+ Slog.w(TAG, "SAD byte array length is not 3. Length = " + sadBytes.length);
+ return null;
+ }
+ return sadBytes;
+ }
+
+ @AudioCodec
+ private static int formatNameToNum(String codecAttriValue) {
+ switch (codecAttriValue) {
+ case "AUDIO_FORMAT_NONE":
+ return Constants.AUDIO_CODEC_NONE;
+ case "AUDIO_FORMAT_LPCM":
+ return Constants.AUDIO_CODEC_LPCM;
+ case "AUDIO_FORMAT_DD":
+ return Constants.AUDIO_CODEC_DD;
+ case "AUDIO_FORMAT_MPEG1":
+ return Constants.AUDIO_CODEC_MPEG1;
+ case "AUDIO_FORMAT_MP3":
+ return Constants.AUDIO_CODEC_MP3;
+ case "AUDIO_FORMAT_MPEG2":
+ return Constants.AUDIO_CODEC_MPEG2;
+ case "AUDIO_FORMAT_AAC":
+ return Constants.AUDIO_CODEC_AAC;
+ case "AUDIO_FORMAT_DTS":
+ return Constants.AUDIO_CODEC_DTS;
+ case "AUDIO_FORMAT_ATRAC":
+ return Constants.AUDIO_CODEC_ATRAC;
+ case "AUDIO_FORMAT_ONEBITAUDIO":
+ return Constants.AUDIO_CODEC_ONEBITAUDIO;
+ case "AUDIO_FORMAT_DDP":
+ return Constants.AUDIO_CODEC_DDP;
+ case "AUDIO_FORMAT_DTSHD":
+ return Constants.AUDIO_CODEC_DTSHD;
+ case "AUDIO_FORMAT_TRUEHD":
+ return Constants.AUDIO_CODEC_TRUEHD;
+ case "AUDIO_FORMAT_DST":
+ return Constants.AUDIO_CODEC_DST;
+ case "AUDIO_FORMAT_WMAPRO":
+ return Constants.AUDIO_CODEC_WMAPRO;
+ case "AUDIO_FORMAT_MAX":
+ return Constants.AUDIO_CODEC_MAX;
+ default:
+ return Constants.AUDIO_CODEC_NONE;
+ }
+ }
+ }
+
+ // Device configuration of its supported Codecs and their Short Audio Descriptors.
+ public static class DeviceConfig {
+ /** Name of the device. Should be {@link Constants.AudioDevice}. **/
+ public final String name;
+ /** List of a {@link CodecSad}. **/
+ public final List<CodecSad> supportedCodecs;
+
+ public DeviceConfig(String name, List<CodecSad> supportedCodecs) {
+ this.name = name;
+ this.supportedCodecs = supportedCodecs;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DeviceConfig) {
+ DeviceConfig that = (DeviceConfig) obj;
+ return that.name.equals(this.name)
+ && that.supportedCodecs.equals(this.supportedCodecs);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ name,
+ supportedCodecs.hashCode());
+ }
+ }
+
+ // Short Audio Descriptor of a specific Codec
+ public static class CodecSad {
+ /** Audio Codec. Should be {@link Constants.AudioCodec}. **/
+ public final int audioCodec;
+ /**
+ * Three-byte Short Audio Descriptor. See HDMI Specification 1.4b CEC 13.15.3 and
+ * ANSI-CTA-861-F-FINAL 7.5.2 Audio Data Block for more details.
+ */
+ public final byte[] sad;
+
+ public CodecSad(int audioCodec, byte[] sad) {
+ this.audioCodec = audioCodec;
+ this.sad = sad;
+ }
+
+ public CodecSad(int audioCodec, String sad) {
+ this.audioCodec = audioCodec;
+ this.sad = HexDump.hexStringToByteArray(sad);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CodecSad) {
+ CodecSad that = (CodecSad) obj;
+ return that.audioCodec == this.audioCodec
+ && Arrays.equals(that.sad, this.sad);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ audioCodec,
+ Arrays.hashCode(sad));
+ }
+ }
}
diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
index 5c66316da60c..354d8d1e43e0 100644
--- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
+++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
@@ -16,8 +16,8 @@
package com.android.server.hdmi;
import android.hardware.hdmi.HdmiControlManager;
-import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
+import android.hardware.hdmi.IHdmiControlCallback;
import android.os.RemoteException;
import android.util.Slog;
@@ -55,7 +55,7 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
private int mPowerStatusCounter = 0;
// Factory method. Ensures arguments are valid.
- static OneTouchPlayAction create(HdmiCecLocalDevicePlayback source,
+ static OneTouchPlayAction create(HdmiCecLocalDeviceSource source,
int targetAddress, IHdmiControlCallback callback) {
if (source == null || callback == null) {
Slog.e(TAG, "Wrong arguments");
@@ -83,9 +83,20 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
}
private void broadcastActiveSource() {
- sendCommand(HdmiCecMessageBuilder.buildActiveSource(getSourceAddress(), getSourcePath()));
- // Because only playback device can create this action, it's safe to cast.
- playback().setActiveSource(true);
+ // Because only source device can create this action, it's safe to cast.
+ HdmiCecLocalDeviceSource source = source();
+ source.mService.setAndBroadcastActiveSourceFromOneDeviceType(
+ mTargetAddress, getSourcePath());
+ // Set local active port to HOME when One Touch Play.
+ // Active Port and Current Input are handled by the switch functionality device.
+ if (source.mService.audioSystem() != null) {
+ source = source.mService.audioSystem();
+ }
+ if (source.getLocalActivePort() != Constants.CEC_SWITCH_HOME) {
+ source.switchInputOnReceivingNewActivePath(getSourcePath());
+ }
+ source.setRoutingPort(Constants.CEC_SWITCH_HOME);
+ source.setLocalActivePort(Constants.CEC_SWITCH_HOME);
}
private void queryDevicePowerStatus() {
diff --git a/services/core/java/com/android/server/hdmi/SelectRequestBuffer.java b/services/core/java/com/android/server/hdmi/SelectRequestBuffer.java
index 75986c7ba1c1..ba16260bbfb7 100644
--- a/services/core/java/com/android/server/hdmi/SelectRequestBuffer.java
+++ b/services/core/java/com/android/server/hdmi/SelectRequestBuffer.java
@@ -56,6 +56,10 @@ public class SelectRequestBuffer {
return mService.tv();
}
+ protected HdmiCecLocalDeviceAudioSystem audioSystem() {
+ return mService.audioSystem();
+ }
+
protected boolean isLocalDeviceReady() {
if (tv() == null) {
Slog.e(TAG, "Local tv device not available");
@@ -105,7 +109,15 @@ public class SelectRequestBuffer {
public void process() {
if (isLocalDeviceReady()) {
Slog.v(TAG, "calling delayed portSelect id:" + mId);
- tv().doManualPortSwitching(mId, mCallback);
+ HdmiCecLocalDeviceTv tv = tv();
+ if (tv != null) {
+ tv.doManualPortSwitching(mId, mCallback);
+ return;
+ }
+ HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
+ if (audioSystem != null) {
+ audioSystem.doManualPortSwitching(mId, mCallback);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java
index 2fdcb5106595..b6ebcd7c3ec2 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
import android.hardware.tv.cec.V1_0.SendMessageResult;
+
import com.android.internal.annotations.VisibleForTesting;
/**
@@ -40,7 +41,7 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
@Override
boolean start() {
- if (audioSystem().mActiveSource.physicalAddress == Constants.INVALID_PHYSICAL_ADDRESS) {
+ if (audioSystem().getActiveSource().physicalAddress == Constants.INVALID_PHYSICAL_ADDRESS) {
mState = STATE_WAITING_FOR_ACTIVE_SOURCE;
addTimer(mState, HdmiConfig.TIMEOUT_MS);
sendRequestActiveSource();
@@ -59,10 +60,8 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
return false;
}
mActionTimer.clearTimerMessage();
- int physicalAddress = HdmiUtils.twoBytesToInt(cmd.getParams());
- if (physicalAddress != getSourcePath()) {
- audioSystem().setActiveSource(cmd.getSource(), physicalAddress);
- }
+ // Broadcast message is also handled by other device types
+ audioSystem().handleActiveSource(cmd);
mState = STATE_WAITING_FOR_TV_SUPPORT;
queryTvSystemAudioModeSupport();
return true;
@@ -91,7 +90,7 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
mSendRequestActiveSourceRetryCount++;
sendRequestActiveSource();
} else {
- audioSystem().setSystemAudioMode(false);
+ audioSystem().checkSupportAndSetSystemAudioMode(false);
finish();
}
}
@@ -106,7 +105,7 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
mSendSetSystemAudioModeRetryCount++;
sendSetSystemAudioMode(on, dest);
} else {
- audioSystem().setSystemAudioMode(false);
+ audioSystem().checkSupportAndSetSystemAudioMode(false);
finish();
}
}
@@ -115,7 +114,16 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
private void handleActiveSourceTimeout() {
HdmiLogger.debug("Cannot get active source.");
- audioSystem().setSystemAudioMode(false);
+ // If not able to find Active Source and the current device has playbcak functionality,
+ // claim Active Source and start to query TV system audio mode support.
+ if (audioSystem().mService.isPlaybackDevice()) {
+ audioSystem().mService.setAndBroadcastActiveSourceFromOneDeviceType(
+ Constants.ADDR_BROADCAST, getSourcePath());
+ mState = STATE_WAITING_FOR_TV_SUPPORT;
+ queryTvSystemAudioModeSupport();
+ } else {
+ audioSystem().checkSupportAndSetSystemAudioMode(false);
+ }
finish();
}
@@ -123,12 +131,12 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction {
audioSystem().queryTvSystemAudioModeSupport(
supported -> {
if (supported) {
- if (audioSystem().setSystemAudioMode(true)) {
+ if (audioSystem().checkSupportAndSetSystemAudioMode(true)) {
sendSetSystemAudioMode(true, Constants.ADDR_BROADCAST);
}
finish();
} else {
- audioSystem().setSystemAudioMode(false);
+ audioSystem().checkSupportAndSetSystemAudioMode(false);
finish();
}
});
diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
index a3ebe2408fa3..8e26097cd55d 100644
--- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
@@ -274,10 +274,14 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
}
synchronized (mLock) {
- final S service = getServiceForUserLocked(userId);
- if (service != null) {
- service.setTemporaryServiceLocked(componentName, durationMs);
+ final S oldService = peekServiceForUserLocked(userId);
+ if (oldService != null) {
+ oldService.removeSelfFromCacheLocked();
}
+ mServiceNameResolver.setTemporaryService(userId, componentName, durationMs);
+
+ // Must update the service on cache so its initialization code is triggered
+ updateCachedServiceLocked(userId);
}
}
@@ -500,6 +504,7 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
protected void dumpLocked(@NonNull String prefix, @NonNull PrintWriter pw) {
boolean realDebug = debug;
boolean realVerbose = verbose;
+ final String prefix2 = " ";
try {
// Temporarily turn on full logging;
@@ -510,6 +515,13 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
if (mServiceNameResolver != null) {
pw.print(prefix); pw.print("Name resolver: ");
mServiceNameResolver.dumpShort(pw); pw.println();
+ final UserManager um = getContext().getSystemService(UserManager.class);
+ final List<UserInfo> users = um.getUsers();
+ for (int i = 0; i < users.size(); i++) {
+ final int userId = users.get(i).id;
+ pw.print(prefix2); pw.print(userId); pw.print(": ");
+ mServiceNameResolver.dumpShort(pw, userId); pw.println();
+ }
}
pw.print(prefix); pw.print("Disabled users: "); pw.println(mDisabledUsers);
pw.print(prefix); pw.print("Allow instant service: "); pw.println(mAllowInstantService);
@@ -522,7 +534,6 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
pw.println("none");
} else {
pw.println(size);
- final String prefix2 = " ";
for (int i = 0; i < size; i++) {
pw.print(prefix); pw.print("Service at "); pw.print(i); pw.println(": ");
final S service = mServicesCache.valueAt(i);
diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
index 556e4892807c..cd9ebcda009c 100644
--- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
@@ -214,7 +214,7 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst
/**
* Gets the current name of the service, which is either the default service or the
- * {@link #setTemporaryServiceLocked(String, int) temporary one}.
+ * {@link AbstractMasterSystemService#setTemporaryService(int, String, int) temporary one}.
*/
protected final @Nullable String getComponentNameLocked() {
return mMaster.mServiceNameResolver.getServiceName(mUserId);
@@ -228,17 +228,6 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst
}
/**
- * Temporary sets the service implementation.
- *
- * @param componentName name of the new component
- * @param durationMs how long the change will be valid (the service will be automatically reset
- * to the default component after this timeout expires).
- */
- protected final void setTemporaryServiceLocked(@NonNull String componentName, int durationMs) {
- mMaster.mServiceNameResolver.setTemporaryService(mUserId, componentName, durationMs);
- }
-
- /**
* Resets the temporary service implementation to the default component.
*/
protected final void resetTemporaryServiceLocked() {
diff --git a/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java b/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java
index 7027246a1bbe..7f198acfd743 100644
--- a/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java
+++ b/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java
@@ -159,7 +159,7 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR
@Override
public String toString() {
- return "FrameworkResourcesServiceNamer: temps=" + mTemporaryServiceNames;
+ return "FrameworkResourcesServiceNamer[temps=" + mTemporaryServiceNames + "]";
}
// TODO(b/117779333): support proto
diff --git a/services/core/java/com/android/server/infra/SecureSettingsServiceNameResolver.java b/services/core/java/com/android/server/infra/SecureSettingsServiceNameResolver.java
index bcaa9188ca62..cac7f53aad66 100644
--- a/services/core/java/com/android/server/infra/SecureSettingsServiceNameResolver.java
+++ b/services/core/java/com/android/server/infra/SecureSettingsServiceNameResolver.java
@@ -56,4 +56,9 @@ public final class SecureSettingsServiceNameResolver implements ServiceNameResol
public void dumpShort(@NonNull PrintWriter pw, @UserIdInt int userId) {
pw.print("defaultService="); pw.print(getDefaultServiceName(userId));
}
+
+ @Override
+ public String toString() {
+ return "SecureSettingsServiceNameResolver[" + mProperty + "]";
+ }
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index d96b6cba119b..669ff2b7bad5 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -138,6 +138,9 @@ public class InputManagerService extends IInputManager.Stub
private final Context mContext;
private final InputManagerHandler mHandler;
+ // Context cache used for loading pointer resources.
+ private Context mDisplayContext;
+
private final File mDoubleTouchGestureEnableFile;
private WindowManagerCallbacks mWindowManagerCallbacks;
@@ -213,8 +216,6 @@ public class InputManagerService extends IInputManager.Stub
private static native void nativeSetFocusedApplication(long ptr,
int displayId, InputApplicationHandle application);
private static native void nativeSetFocusedDisplay(long ptr, int displayId);
- private static native boolean nativeTransferTouchFocus(long ptr,
- InputChannel fromChannel, InputChannel toChannel);
private static native void nativeSetPointerSpeed(long ptr, int speed);
private static native void nativeSetShowTouches(long ptr, boolean enabled);
private static native void nativeSetInteractive(long ptr, boolean interactive);
@@ -1485,29 +1486,6 @@ public class InputManagerService extends IInputManager.Stub
nativeSetSystemUiVisibility(mPtr, visibility);
}
- /**
- * Atomically transfers touch focus from one window to another as identified by
- * their input channels. It is possible for multiple windows to have
- * touch focus if they support split touch dispatch
- * {@link android.view.WindowManager.LayoutParams#FLAG_SPLIT_TOUCH} but this
- * method only transfers touch focus of the specified window without affecting
- * other windows that may also have touch focus at the same time.
- * @param fromChannel The channel of a window that currently has touch focus.
- * @param toChannel The channel of the window that should receive touch focus in
- * place of the first.
- * @return True if the transfer was successful. False if the window with the
- * specified channel did not actually have touch focus at the time of the request.
- */
- public boolean transferTouchFocus(InputChannel fromChannel, InputChannel toChannel) {
- if (fromChannel == null) {
- throw new IllegalArgumentException("fromChannel must not be null.");
- }
- if (toChannel == null) {
- throw new IllegalArgumentException("toChannel must not be null.");
- }
- return nativeTransferTouchFocus(mPtr, fromChannel, toChannel);
- }
-
@Override // Binder call
public void tryPointerSpeed(int speed) {
if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED,
@@ -1785,15 +1763,17 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
- private void notifyFocusChanged(IBinder token) {
- if (mFocusedWindow != token) {
- if (mFocusedWindowHasCapture) {
- setPointerCapture(false);
- }
- if (token instanceof IWindow) {
- mFocusedWindow = (IWindow) token;
+ private void notifyFocusChanged(IBinder oldToken, IBinder newToken) {
+ if (mFocusedWindow != null) {
+ if (mFocusedWindow.asBinder() == newToken) {
+ Slog.w(TAG, "notifyFocusChanged called with unchanged mFocusedWindow="
+ + mFocusedWindow);
+ return;
}
+ setPointerCapture(false);
}
+
+ mFocusedWindow = IWindow.Stub.asInterface(newToken);
}
// Native callback.
@@ -1946,8 +1926,30 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
- private PointerIcon getPointerIcon() {
- return PointerIcon.getDefaultIcon(mContext);
+ private PointerIcon getPointerIcon(int displayId) {
+ return PointerIcon.getDefaultIcon(getContextForDisplay(displayId));
+ }
+
+ private Context getContextForDisplay(int displayId) {
+ if (mDisplayContext != null && mDisplayContext.getDisplay().getDisplayId() == displayId) {
+ return mDisplayContext;
+ }
+
+ if (mContext.getDisplay().getDisplayId() == displayId) {
+ mDisplayContext = mContext;
+ return mDisplayContext;
+ }
+
+ // Create and cache context for non-default display.
+ final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ final Display display = displayManager.getDisplay(displayId);
+ mDisplayContext = mContext.createDisplayContext(display);
+ return mDisplayContext;
+ }
+
+ // Native callback.
+ private int getPointerDisplayId() {
+ return mWindowManagerCallbacks.getPointerDisplayId();
}
// Native callback.
@@ -2017,6 +2019,8 @@ public class InputManagerService extends IInputManager.Stub
KeyEvent event, int policyFlags);
public int getPointerLayer();
+
+ public int getPointerDisplayId();
}
/**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
index 326479039ac8..d4b8eb2db007 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
@@ -16,7 +16,15 @@
package com.android.server.inputmethod;
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
+import android.view.inputmethod.InputMethodInfo;
+
+import com.android.server.LocalServices;
+
+import java.util.Collections;
+import java.util.List;
/**
* Input method manager local system service interface.
@@ -39,9 +47,25 @@ public abstract class InputMethodManagerInternal {
public abstract void startVrInputMethodNoCheck(ComponentName componentName);
/**
+ * Returns the list of installed input methods for the specified user.
+ *
+ * @param userId The user ID to be queried.
+ * @return A list of {@link InputMethodInfo}. VR-only IMEs are already excluded.
+ */
+ public abstract List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId);
+
+ /**
+ * Returns the list of installed input methods that are enabled for the specified user.
+ *
+ * @param userId The user ID to be queried.
+ * @return A list of {@link InputMethodInfo} that are enabled for {@code userId}.
+ */
+ public abstract List<InputMethodInfo> getEnabledInputMethodListAsUser(@UserIdInt int userId);
+
+ /**
* Fake implementation of {@link InputMethodManagerInternal}. All the methods do nothing.
*/
- public static final InputMethodManagerInternal NOP =
+ private static final InputMethodManagerInternal NOP =
new InputMethodManagerInternal() {
@Override
public void setInteractive(boolean interactive) {
@@ -54,5 +78,25 @@ public abstract class InputMethodManagerInternal {
@Override
public void startVrInputMethodNoCheck(ComponentName componentName) {
}
+
+ @Override
+ public List<InputMethodInfo> getInputMethodListAsUser(int userId) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<InputMethodInfo> getEnabledInputMethodListAsUser(int userId) {
+ return Collections.emptyList();
+ }
};
+
+ /**
+ * @return Global instance if exists. Otherwise, a dummy no-op instance.
+ */
+ @NonNull
+ public static InputMethodManagerInternal get() {
+ final InputMethodManagerInternal instance =
+ LocalServices.getService(InputMethodManagerInternal.class);
+ return instance != null ? instance : NOP;
+ }
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 5a7739c49b42..6c3cc58a1bd6 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -20,6 +20,7 @@ import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
+import static android.view.inputmethod.InputMethodSystemProperty.PER_PROFILE_IME_ENABLED;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -88,6 +89,7 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.UserManagerInternal;
import android.provider.Settings;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
@@ -291,6 +293,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
new DebugFlag("debug.optimize_startinput", false);
}
+ @UserIdInt
+ private int mLastSwitchUserId;
final Context mContext;
final Resources mRes;
@@ -306,6 +310,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private final HardKeyboardListener mHardKeyboardListener;
private final AppOpsManager mAppOpsManager;
private final UserManager mUserManager;
+ private final UserManagerInternal mUserManagerInternal;
// All known input methods. mMethodMap also serves as the global
// lock for this class.
@@ -1238,7 +1243,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// Uh oh, current input method is no longer around!
// Pick another one...
Slog.i(TAG, "Current input method removed: " + curInputMethodId);
- updateSystemUiLocked(mCurToken, 0 /* vis */, mBackDisposition);
+ updateSystemUiLocked(0 /* vis */, mBackDisposition);
if (!chooseNewDefaultIMELocked()) {
changed = true;
curIm = null;
@@ -1402,6 +1407,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}, true /*asyncHandler*/);
mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
mUserManager = mContext.getSystemService(UserManager.class);
+ mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
mHardKeyboardListener = new HardKeyboardListener();
mHasFeature = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INPUT_METHODS);
@@ -1436,6 +1442,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e);
}
+ mLastSwitchUserId = userId;
+
// mSettings should be created before buildInputMethodListLocked
mSettings = new InputMethodSettings(
mRes, context.getContentResolver(), mMethodMap, mMethodList, userId, !mSystemReady);
@@ -1484,7 +1492,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// If the system is not ready or the device is not yed unlocked by the user, then we use
// copy-on-write settings.
final boolean useCopyOnWriteSettings =
- !mSystemReady || !mUserManager.isUserUnlockingOrUnlocked(newUserId);
+ !mSystemReady || !mUserManagerInternal.isUserUnlockingOrUnlocked(newUserId);
mSettings.switchCurrentUser(newUserId, useCopyOnWriteSettings);
updateCurrentProfileIds();
// Additional subtypes should be reset when the user is changed
@@ -1523,6 +1531,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (DEBUG) Slog.d(TAG, "Switching user stage 3/3. newUserId=" + newUserId
+ " selectedIme=" + mSettings.getSelectedInputMethod());
+
+ mLastSwitchUserId = newUserId;
}
void updateCurrentProfileIds() {
@@ -1555,14 +1565,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mLastSystemLocales = mRes.getConfiguration().getLocales();
final int currentUserId = mSettings.getCurrentUserId();
mSettings.switchCurrentUser(currentUserId,
- !mUserManager.isUserUnlockingOrUnlocked(currentUserId));
+ !mUserManagerInternal.isUserUnlockingOrUnlocked(currentUserId));
mKeyguardManager = mContext.getSystemService(KeyguardManager.class);
mNotificationManager = mContext.getSystemService(NotificationManager.class);
mStatusBar = statusBar;
if (mStatusBar != null) {
mStatusBar.setIconVisibility(mSlotIme, false);
}
- updateSystemUiLocked(mCurToken, mImeWindowVis, mBackDisposition);
+ updateSystemUiLocked(mImeWindowVis, mBackDisposition);
mShowOngoingImeSwitcherForPhones = mRes.getBoolean(
com.android.internal.R.bool.show_ongoing_ime_switcher);
if (mShowOngoingImeSwitcherForPhones) {
@@ -1597,7 +1607,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// 1) it comes from the system process
// 2) the calling process' user id is identical to the current user id IMMS thinks.
@GuardedBy("mMethodMap")
- private boolean calledFromValidUserLocked() {
+ private boolean calledFromValidUserLocked(boolean allowCrossProfileAccess) {
final int uid = Binder.getCallingUid();
final int userId = UserHandle.getUserId(uid);
if (DEBUG) {
@@ -1607,7 +1617,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
+ mSettings.getCurrentUserId() + ", calling pid = " + Binder.getCallingPid()
+ InputMethodUtils.getApiCallStack());
}
- if (uid == Process.SYSTEM_UID || mSettings.isCurrentProfile(userId)) {
+ if (uid == Process.SYSTEM_UID) {
+ return true;
+ }
+ if (userId == mSettings.getCurrentUserId()) {
+ return true;
+ }
+ if (allowCrossProfileAccess && mSettings.isCurrentProfile(userId)) {
return true;
}
@@ -1638,16 +1654,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
* @return true if and only if non-null valid token is specified.
*/
@GuardedBy("mMethodMap")
- private boolean calledWithValidTokenLocked(@Nullable IBinder token) {
- if (token == null && Binder.getCallingPid() == Process.myPid()) {
- if (DEBUG) {
- // TODO(b/34851776): Basically it's the caller's fault if we reach here.
- Slog.d(TAG, "Bug 34851776 is detected callers=" + Debug.getCallers(10));
- }
- return false;
+ private boolean calledWithValidTokenLocked(@NonNull IBinder token) {
+ if (token == null) {
+ throw new InvalidParameterException("token must not be null.");
}
- if (token == null || token != mCurToken) {
- // TODO(b/34886274): The semantics of this verification is actually not well-defined.
+ if (token != mCurToken) {
Slog.e(TAG, "Ignoring " + Debug.getCaller() + " due to an invalid token."
+ " uid:" + Binder.getCallingUid() + " token:" + token);
return false;
@@ -1668,40 +1679,93 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public List<InputMethodInfo> getInputMethodList() {
- return getInputMethodList(false /* isVrOnly */);
+ final int callingUserId = UserHandle.getCallingUserId();
+ synchronized (mMethodMap) {
+ final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
+ mSettings.getCurrentUserId(), null);
+ if (resolvedUserIds.length != 1) {
+ return Collections.emptyList();
+ }
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getInputMethodListLocked(false /* isVrOnly */, resolvedUserIds[0]);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public List<InputMethodInfo> getVrInputMethodList() {
- return getInputMethodList(true /* isVrOnly */);
- }
-
- private List<InputMethodInfo> getInputMethodList(final boolean isVrOnly) {
+ final int callingUserId = UserHandle.getCallingUserId();
synchronized (mMethodMap) {
- // TODO: Make this work even for non-current users?
- if (!calledFromValidUserLocked()) {
+ final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
+ mSettings.getCurrentUserId(), null);
+ if (resolvedUserIds.length != 1) {
return Collections.emptyList();
}
- ArrayList<InputMethodInfo> methodList = new ArrayList<>();
- for (InputMethodInfo info : mMethodList) {
-
- if (info.isVrOnly() == isVrOnly) {
- methodList.add(info);
- }
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getInputMethodListLocked(true /* isVrOnly */, resolvedUserIds[0]);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
- return methodList;
}
}
@Override
public List<InputMethodInfo> getEnabledInputMethodList() {
+ final int callingUserId = UserHandle.getCallingUserId();
synchronized (mMethodMap) {
- // TODO: Make this work even for non-current users?
- if (!calledFromValidUserLocked()) {
+ final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
+ mSettings.getCurrentUserId(), null);
+ if (resolvedUserIds.length != 1) {
return Collections.emptyList();
}
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getEnabledInputMethodListLocked(resolvedUserIds[0]);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @GuardedBy("mMethodMap")
+ private List<InputMethodInfo> getInputMethodListLocked(boolean isVrOnly,
+ @UserIdInt int userId) {
+ final ArrayList<InputMethodInfo> methodList;
+ if (userId == mSettings.getCurrentUserId()) {
+ // Create a copy.
+ methodList = new ArrayList<>(mMethodList);
+ } else {
+ final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
+ methodList = new ArrayList<>();
+ final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap =
+ new ArrayMap<>();
+ AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
+ queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
+ methodList);
+ }
+ methodList.removeIf(imi -> imi.isVrOnly() != isVrOnly);
+ return methodList;
+ }
+
+ @GuardedBy("mMethodMap")
+ private List<InputMethodInfo> getEnabledInputMethodListLocked(@UserIdInt int userId) {
+ if (userId == mSettings.getCurrentUserId()) {
return mSettings.getEnabledInputMethodListLocked();
}
+ final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
+ final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
+ final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap =
+ new ArrayMap<>();
+ AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
+ queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
+ methodList);
+ final InputMethodSettings settings = new InputMethodSettings(mContext.getResources(),
+ mContext.getContentResolver(), methodMap, methodList, userId, true);
+ return settings.getEnabledInputMethodListLocked();
}
/**
@@ -1711,11 +1775,27 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(String imiId,
boolean allowsImplicitlySelectedSubtypes) {
+ final int callingUserId = UserHandle.getCallingUserId();
synchronized (mMethodMap) {
- // TODO: Make this work even for non-current users?
- if (!calledFromValidUserLocked()) {
+ final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
+ mSettings.getCurrentUserId(), null);
+ if (resolvedUserIds.length != 1) {
return Collections.emptyList();
}
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getEnabledInputMethodSubtypeListLocked(imiId,
+ allowsImplicitlySelectedSubtypes, resolvedUserIds[0]);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @GuardedBy("mMethodMap")
+ private List<InputMethodSubtype> getEnabledInputMethodSubtypeListLocked(String imiId,
+ boolean allowsImplicitlySelectedSubtypes, @UserIdInt int userId) {
+ if (userId == mSettings.getCurrentUserId()) {
final InputMethodInfo imi;
if (imiId == null && mCurMethodId != null) {
imi = mMethodMap.get(mCurMethodId);
@@ -1728,6 +1808,21 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return mSettings.getEnabledInputMethodSubtypeListLocked(
mContext, imi, allowsImplicitlySelectedSubtypes);
}
+ final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
+ final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
+ final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap =
+ new ArrayMap<>();
+ AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
+ queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
+ methodList);
+ final InputMethodInfo imi = methodMap.get(imiId);
+ if (imi == null) {
+ return Collections.emptyList();
+ }
+ final InputMethodSettings settings = new InputMethodSettings(mContext.getResources(),
+ mContext.getContentResolver(), methodMap, methodList, userId, true);
+ return settings.getEnabledInputMethodSubtypeListLocked(
+ mContext, imi, allowsImplicitlySelectedSubtypes);
}
/**
@@ -2160,7 +2255,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
sessionState.session.finishSession();
} catch (RemoteException e) {
Slog.w(TAG, "Session failed to close due to remote exception", e);
- updateSystemUiLocked(mCurToken, 0 /* vis */, mBackDisposition);
+ updateSystemUiLocked(0 /* vis */, mBackDisposition);
}
sessionState.session = null;
}
@@ -2319,14 +2414,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@BinderThread
@SuppressWarnings("deprecation")
- private void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
+ private void setImeWindowStatus(@NonNull IBinder token, int vis, int backDisposition) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return;
}
mImeWindowVis = vis;
mBackDisposition = backDisposition;
- updateSystemUiLocked(token, vis, backDisposition);
+ updateSystemUiLocked(vis, backDisposition);
}
final boolean dismissImeOnBackKeyPressed;
@@ -2346,14 +2441,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
(vis & InputMethodService.IME_VISIBLE) != 0, dismissImeOnBackKeyPressed);
}
- private void updateSystemUi(IBinder token, int vis, int backDisposition) {
- synchronized (mMethodMap) {
- updateSystemUiLocked(token, vis, backDisposition);
- }
- }
-
@BinderThread
- private void reportStartInput(IBinder token, IBinder startInputToken) {
+ private void reportStartInput(@NonNull IBinder token, IBinder startInputToken) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return;
@@ -2367,11 +2456,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
// Caution! This method is called in this class. Handle multi-user carefully
- private void updateSystemUiLocked(IBinder token, int vis, int backDisposition) {
- if (!calledWithValidTokenLocked(token)) {
+ private void updateSystemUiLocked(int vis, int backDisposition) {
+ if (mCurToken == null) {
return;
}
-
// TODO: Move this clearing calling identity block to setImeWindowStatus after making sure
// all updateSystemUi happens on system previlege.
final long ident = Binder.clearCallingIdentity();
@@ -2383,7 +2471,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// mImeWindowVis should be updated before calling shouldShowImeSwitcherLocked().
final boolean needsToShowImeSwitcher = shouldShowImeSwitcherLocked(vis);
if (mStatusBar != null) {
- mStatusBar.setImeWindowStatus(token, vis, backDisposition,
+ mStatusBar.setImeWindowStatus(mCurToken, vis, backDisposition,
needsToShowImeSwitcher);
}
final InputMethodInfo imi = mMethodMap.get(mCurMethodId);
@@ -2425,54 +2513,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- @Override
- public void registerSuggestionSpansForNotification(SuggestionSpan[] spans) {
- synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
- return;
- }
- final InputMethodInfo currentImi = mMethodMap.get(mCurMethodId);
- for (int i = 0; i < spans.length; ++i) {
- SuggestionSpan ss = spans[i];
- if (!TextUtils.isEmpty(ss.getNotificationTargetClassName())) {
- mSecureSuggestionSpans.put(ss, currentImi);
- }
- }
- }
- }
-
- @Override
- public boolean notifySuggestionPicked(SuggestionSpan span, String originalString, int index) {
- synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
- return false;
- }
- final InputMethodInfo targetImi = mSecureSuggestionSpans.get(span);
- // TODO: Do not send the intent if the process of the targetImi is already dead.
- if (targetImi != null) {
- final String[] suggestions = span.getSuggestions();
- if (index < 0 || index >= suggestions.length) return false;
- final String className = span.getNotificationTargetClassName();
- final Intent intent = new Intent();
- // Ensures that only a class in the original IME package will receive the
- // notification.
- intent.setClassName(targetImi.getPackageName(), className);
- intent.setAction(SuggestionSpan.ACTION_SUGGESTION_PICKED);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_BEFORE, originalString);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_AFTER, suggestions[index]);
- intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_HASHCODE, span.hashCode());
- final long ident = Binder.clearCallingIdentity();
- try {
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- return true;
- }
- }
- return false;
- }
-
void updateFromSettingsLocked(boolean enabledMayChange) {
updateInputMethodsFromSettingsLocked(enabledMayChange);
updateKeyboardFromSettingsLocked();
@@ -2573,7 +2613,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
setSelectedInputMethodAndSubtypeLocked(info, subtypeId, true);
if (mCurMethod != null) {
try {
- updateSystemUiLocked(mCurToken, mImeWindowVis, mBackDisposition);
+ updateSystemUiLocked(mImeWindowVis, mBackDisposition);
mCurMethod.changeInputMethodSubtype(newSubtype);
} catch (RemoteException e) {
Slog.w(TAG, "Failed to call changeInputMethodSubtype");
@@ -2611,7 +2651,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
ResultReceiver resultReceiver) {
int uid = Binder.getCallingUid();
synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return false;
}
final long ident = Binder.clearCallingIdentity();
@@ -2696,7 +2736,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
ResultReceiver resultReceiver) {
int uid = Binder.getCallingUid();
synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return false;
}
final long ident = Binder.clearCallingIdentity();
@@ -2803,10 +2843,28 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@SoftInputModeFlags int softInputMode, int windowFlags, EditorInfo attribute,
IInputContext inputContext, @MissingMethodFlags int missingMethods,
int unverifiedTargetSdkVersion) {
+ final int callingUserId = UserHandle.getCallingUserId();
+ final int userId;
+ if (PER_PROFILE_IME_ENABLED && attribute != null && attribute.targetInputMethodUser != null
+ && attribute.targetInputMethodUser.getIdentifier() != callingUserId) {
+ mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "Using EditorInfo.user requires INTERACT_ACROSS_USERS_FULL.");
+ userId = attribute.targetInputMethodUser.getIdentifier();
+ if (!mUserManagerInternal.isUserRunning(userId)) {
+ // There is a chance that we hit here because of race condition. Let's just return
+ // an error code instead of crashing the caller process, which at least has
+ // INTERACT_ACROSS_USERS_FULL permission thus is likely to be an important process.
+ Slog.e(TAG, "User #" + userId + " is not running.");
+ return InputBindResult.INVALID_USER;
+ }
+ } else {
+ userId = callingUserId;
+ }
InputBindResult res = null;
synchronized (mMethodMap) {
// Needs to check the validity before clearing calling identity
- final boolean calledFromValidUser = calledFromValidUserLocked();
+ // Note that cross-profile access is always allowed here to allow profile-switching.
+ final boolean calledFromValidUser = calledFromValidUserLocked(true);
final int windowDisplayId =
mWindowManagerInternal.getDisplayIdForWindow(windowToken);
final long ident = Binder.clearCallingIdentity();
@@ -2858,6 +2916,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return InputBindResult.INVALID_USER;
}
+ if (PER_PROFILE_IME_ENABLED && userId != mSettings.getCurrentUserId()) {
+ switchUserLocked(userId);
+ }
+
if (mCurFocusedWindow == windowToken) {
if (DEBUG) {
Slog.w(TAG, "Window already focused, ignoring focus gain of: " + client
@@ -3026,7 +3088,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
public void showInputMethodPickerFromClient(
IInputMethodClient client, int auxiliarySubtypeMode) {
synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return;
}
if(!canShowInputMethodPickerLocked(client)) {
@@ -3067,7 +3129,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@BinderThread
- private void setInputMethod(IBinder token, String id) {
+ private void setInputMethod(@NonNull IBinder token, String id) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return;
@@ -3077,7 +3139,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@BinderThread
- private void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) {
+ private void setInputMethodAndSubtype(@NonNull IBinder token, String id,
+ InputMethodSubtype subtype) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return;
@@ -3097,7 +3160,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
IInputMethodClient client, String inputMethodId) {
synchronized (mMethodMap) {
// TODO(yukawa): Should we verify the display ID?
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return;
}
executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
@@ -3106,7 +3169,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@BinderThread
- private boolean switchToPreviousInputMethod(IBinder token) {
+ private boolean switchToPreviousInputMethod(@NonNull IBinder token) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return false;
@@ -3178,7 +3241,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@BinderThread
- private boolean switchToNextInputMethod(IBinder token, boolean onlyCurrentIme) {
+ private boolean switchToNextInputMethod(@NonNull IBinder token, boolean onlyCurrentIme) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return false;
@@ -3212,7 +3275,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public InputMethodSubtype getLastInputMethodSubtype() {
synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return null;
}
final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked();
@@ -3250,7 +3313,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
synchronized (mMethodMap) {
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return;
}
if (!mSystemReady) {
@@ -3596,7 +3659,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private void handleSetInteractive(final boolean interactive) {
synchronized (mMethodMap) {
mIsInteractive = interactive;
- updateSystemUiLocked(mCurToken, interactive ? mImeWindowVis : 0, mBackDisposition);
+ updateSystemUiLocked(interactive ? mImeWindowVis : 0, mBackDisposition);
// Inform the current client of the change in active status
if (mCurClient != null && mCurClient.client != null) {
@@ -3927,7 +3990,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
attrs.privateFlags |= PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
attrs.setTitle("Select input method");
w.setAttributes(attrs);
- updateSystemUi(mCurToken, mImeWindowVis, mBackDisposition);
+ updateSystemUiLocked(mImeWindowVis, mBackDisposition);
mSwitchingDialog.show();
}
}
@@ -3987,7 +4050,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mSwitchingDialogTitleView = null;
}
- updateSystemUiLocked(mCurToken, mImeWindowVis, mBackDisposition);
+ updateSystemUiLocked(mImeWindowVis, mBackDisposition);
mDialogBuilder = null;
mIms = null;
}
@@ -4096,7 +4159,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
public InputMethodSubtype getCurrentInputMethodSubtype() {
synchronized (mMethodMap) {
// TODO: Make this work even for non-current users?
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return null;
}
return getCurrentInputMethodSubtypeLocked();
@@ -4146,7 +4209,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
public boolean setCurrentInputMethodSubtype(InputMethodSubtype subtype) {
synchronized (mMethodMap) {
// TODO: Make this work even for non-current users?
- if (!calledFromValidUserLocked()) {
+ if (!calledFromValidUserLocked(!PER_PROFILE_IME_ENABLED)) {
return false;
}
if (subtype != null && mCurMethodId != null) {
@@ -4161,6 +4224,18 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ private List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId) {
+ synchronized (mMethodMap) {
+ return getInputMethodListLocked(false, userId);
+ }
+ }
+
+ private List<InputMethodInfo> getEnabledInputMethodListAsUser(@UserIdInt int userId) {
+ synchronized (mMethodMap) {
+ return getEnabledInputMethodListLocked(userId);
+ }
+ }
+
private static final class LocalServiceImpl extends InputMethodManagerInternal {
@NonNull
private final InputMethodManagerService mService;
@@ -4186,6 +4261,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
public void startVrInputMethodNoCheck(@Nullable ComponentName componentName) {
mService.mHandler.obtainMessage(MSG_START_VR_INPUT, componentName).sendToTarget();
}
+
+ @Override
+ public List<InputMethodInfo> getInputMethodListAsUser(int userId) {
+ return mService.getInputMethodListAsUser(userId);
+ }
+
+ @Override
+ public List<InputMethodInfo> getEnabledInputMethodListAsUser(int userId) {
+ return mService.getEnabledInputMethodListAsUser(userId);
+ }
}
@BinderThread
@@ -4243,7 +4328,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@BinderThread
- private void reportFullscreenMode(IBinder token, boolean fullscreen) {
+ private void reportFullscreenMode(@NonNull IBinder token, boolean fullscreen) {
synchronized (mMethodMap) {
if (!calledWithValidTokenLocked(token)) {
return;
@@ -4424,6 +4509,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return refreshDebugProperties();
}
+ if ("get-last-switch-user-id".equals(cmd)) {
+ return mService.getLastSwitchUserId(this);
+ }
+
// For existing "adb shell ime <command>".
if ("ime".equals(cmd)) {
final String imeCommand = getNextArg();
@@ -4516,6 +4605,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// ----------------------------------------------------------------------
// Shell command handlers:
+ @BinderThread
+ @ShellCommandResult
+ private int getLastSwitchUserId(@NonNull ShellCommand shellCommand) {
+ synchronized (mMethodMap) {
+ shellCommand.getOutPrintWriter().println(mLastSwitchUserId);
+ return ShellCommandResult.SUCCESS;
+ }
+ }
+
/**
* Handles {@code adb shell ime list}.
* @param shellCommand {@link ShellCommand} object that is handling this command.
@@ -4526,6 +4624,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private int handleShellCommandListInputMethods(@NonNull ShellCommand shellCommand) {
boolean all = false;
boolean brief = false;
+ int userIdToBeResolved = UserHandle.USER_CURRENT;
while (true) {
final String nextOption = shellCommand.getNextOption();
if (nextOption == null) {
@@ -4538,19 +4637,34 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
case "-s":
brief = true;
break;
+ case "-u":
+ case "--user":
+ userIdToBeResolved = UserHandle.parseUserArg(shellCommand.getNextArgRequired());
+ break;
}
}
- final List<InputMethodInfo> methods = all ?
- getInputMethodList() : getEnabledInputMethodList();
- final PrintWriter pr = shellCommand.getOutPrintWriter();
- final Printer printer = x -> pr.println(x);
- final int N = methods.size();
- for (int i = 0; i < N; ++i) {
- if (brief) {
- pr.println(methods.get(i).getId());
- } else {
- pr.print(methods.get(i).getId()); pr.println(":");
- methods.get(i).dump(printer, " ");
+ synchronized (mMethodMap) {
+ final PrintWriter pr = shellCommand.getOutPrintWriter();
+ final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
+ mSettings.getCurrentUserId(), shellCommand.getErrPrintWriter());
+ for (int userId : userIds) {
+ final List<InputMethodInfo> methods = all
+ ? getInputMethodListLocked(false, userId)
+ : getEnabledInputMethodListLocked(userId);
+ if (userIds.length > 1) {
+ pr.print("User #");
+ pr.print(userId);
+ pr.println(":");
+ }
+ for (InputMethodInfo info : methods) {
+ if (brief) {
+ pr.println(info.getId());
+ } else {
+ pr.print(info.getId());
+ pr.println(":");
+ info.dump(pr::println, " ");
+ }
+ }
}
}
return ShellCommandResult.SUCCESS;
@@ -4649,8 +4763,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private static final class InputMethodPrivilegedOperationsImpl
extends IInputMethodPrivilegedOperations.Stub {
private final InputMethodManagerService mImms;
+ @NonNull
private final IBinder mToken;
- InputMethodPrivilegedOperationsImpl(InputMethodManagerService imms, IBinder token) {
+ InputMethodPrivilegedOperationsImpl(InputMethodManagerService imms,
+ @NonNull IBinder token) {
mImms = imms;
mToken = token;
}
@@ -4730,7 +4846,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@BinderThread
@Override
- public void notifyUserActionAsync() {
+ public void notifyUserAction() {
mImms.notifyUserAction(mToken);
}
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
index 1137bf967d24..88d1a9c0eb6c 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
@@ -29,21 +29,27 @@ import android.content.res.Resources;
import android.os.Build;
import android.os.LocaleList;
import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManagerInternal;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.IntArray;
import android.util.Pair;
import android.util.Printer;
import android.util.Slog;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSystemProperty;
import android.view.textservice.SpellCheckerInfo;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.inputmethod.StartInputFlags;
+import com.android.server.LocalServices;
import com.android.server.textservices.TextServicesManagerInternal;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
@@ -1286,4 +1292,62 @@ final class InputMethodUtils {
return true;
}
+ /**
+ * Converts a user ID, which can be a pseudo user ID such as {@link UserHandle#USER_ALL} to a
+ * list of real user IDs.
+ *
+ * <p>This method also converts profile user ID to profile parent user ID unless
+ * {@link InputMethodSystemProperty#PER_PROFILE_IME_ENABLED} is {@code true}.</p>
+ *
+ * @param userIdToBeResolved A user ID. Two pseudo user ID {@link UserHandle#USER_CURRENT} and
+ * {@link UserHandle#USER_ALL} are also supported
+ * @param currentUserId A real user ID, which will be used when {@link UserHandle#USER_CURRENT}
+ * is specified in {@code userIdToBeResolved}.
+ * @param warningWriter A {@link PrintWriter} to output some debug messages. {@code null} if
+ * no debug message is required.
+ * @return An integer array that contain user IDs.
+ */
+ static int[] resolveUserId(@UserIdInt int userIdToBeResolved,
+ @UserIdInt int currentUserId, @Nullable PrintWriter warningWriter) {
+ final UserManagerInternal userManagerInternal =
+ LocalServices.getService(UserManagerInternal.class);
+
+ if (userIdToBeResolved == UserHandle.USER_ALL) {
+ if (InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) {
+ return userManagerInternal.getUserIds();
+ }
+ final IntArray result = new IntArray();
+ for (int userId : userManagerInternal.getUserIds()) {
+ final int parentUserId = userManagerInternal.getProfileParentId(userId);
+ if (result.indexOf(parentUserId) < 0) {
+ result.add(parentUserId);
+ }
+ }
+ return result.toArray();
+ }
+
+ final int sourceUserId;
+ if (userIdToBeResolved == UserHandle.USER_CURRENT) {
+ sourceUserId = currentUserId;
+ } else if (userIdToBeResolved < 0) {
+ if (warningWriter != null) {
+ warningWriter.print("Pseudo user ID ");
+ warningWriter.print(userIdToBeResolved);
+ warningWriter.println(" is not supported.");
+ }
+ return new int[]{};
+ } else if (userManagerInternal.exists(userIdToBeResolved)) {
+ sourceUserId = userIdToBeResolved;
+ } else {
+ if (warningWriter != null) {
+ warningWriter.print("User #");
+ warningWriter.print(userIdToBeResolved);
+ warningWriter.println(" does not exit.");
+ }
+ return new int[]{};
+ }
+ final int resolvedUserId = InputMethodSystemProperty.PER_PROFILE_IME_ENABLED
+ ? sourceUserId : userManagerInternal.getProfileParentId(sourceUserId);
+ return new int[]{resolvedUserId};
+ }
}
diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
index 98ed3ea92fa1..6f0c5e83b4fe 100644
--- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
@@ -53,7 +53,6 @@ import android.os.ShellCallback;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
-import android.text.style.SuggestionSpan;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -163,6 +162,18 @@ public final class MultiClientInputMethodManagerService {
public void startVrInputMethodNoCheck(ComponentName componentName) {
reportNotSupported();
}
+
+ @Override
+ public List<InputMethodInfo> getInputMethodListAsUser(
+ @UserIdInt int userId) {
+ return userIdToInputMethodInfoMapper.getAsList(userId);
+ }
+
+ @Override
+ public List<InputMethodInfo> getEnabledInputMethodListAsUser(
+ @UserIdInt int userId) {
+ return userIdToInputMethodInfoMapper.getAsList(userId);
+ }
});
}
@@ -1513,20 +1524,6 @@ public final class MultiClientInputMethodManagerService {
@BinderThread
@Override
- public void registerSuggestionSpansForNotification(SuggestionSpan[] suggestionSpans) {
- reportNotSupported();
- }
-
- @BinderThread
- @Override
- public boolean notifySuggestionPicked(
- SuggestionSpan span, String originalString, int index) {
- reportNotSupported();
- return false;
- }
-
- @BinderThread
- @Override
public InputMethodSubtype getCurrentInputMethodSubtype() {
reportNotSupported();
return null;
diff --git a/services/core/java/com/android/server/job/JobConcurrencyManager.java b/services/core/java/com/android/server/job/JobConcurrencyManager.java
index 827c0f1df71a..4d9b5f5d01c6 100644
--- a/services/core/java/com/android/server/job/JobConcurrencyManager.java
+++ b/services/core/java/com/android/server/job/JobConcurrencyManager.java
@@ -18,16 +18,34 @@ package com.android.server.job;
import android.app.ActivityManager;
import android.app.job.JobInfo;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.PowerManager;
import android.os.RemoteException;
import android.util.Slog;
+import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.procstats.ProcessStats;
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.StatLogger;
+import com.android.server.job.JobSchedulerService.Constants;
import com.android.server.job.controllers.JobStatus;
import com.android.server.job.controllers.StateController;
import java.util.Iterator;
import java.util.List;
+/**
+ * This class decides, given the various configuration and the system status, how many more jobs
+ * can start.
+ */
class JobConcurrencyManager {
private static final String TAG = JobSchedulerService.TAG;
private static final boolean DEBUG = JobSchedulerService.DEBUG;
@@ -35,6 +53,16 @@ class JobConcurrencyManager {
private final Object mLock;
private final JobSchedulerService mService;
private final JobSchedulerService.Constants mConstants;
+ private final Context mContext;
+ private final Handler mHandler;
+
+ private PowerManager mPowerManager;
+
+ private boolean mCurrentInteractiveState;
+ private boolean mEffectiveInteractiveState;
+
+ private long mLastScreenOnRealtime;
+ private long mLastScreenOffRealtime;
private static final int MAX_JOB_CONTEXTS_COUNT = JobSchedulerService.MAX_JOB_CONTEXTS_COUNT;
@@ -50,10 +78,193 @@ class JobConcurrencyManager {
int[] mRecycledPreferredUidForContext = new int[MAX_JOB_CONTEXTS_COUNT];
+ /** Max job counts according to the current system state. */
+ private JobSchedulerService.MaxJobCounts mMaxJobCounts;
+
+ private final JobCountTracker mJobCountTracker = new JobCountTracker();
+
+ /** Current memory trim level. */
+ private int mLastMemoryTrimLevel;
+
+ /** Used to throttle heavy API calls. */
+ private long mNextSystemStateRefreshTime;
+ private static final int SYSTEM_STATE_REFRESH_MIN_INTERVAL = 1000;
+
+ private final StatLogger mStatLogger = new StatLogger(new String[]{
+ "assignJobsToContexts",
+ "refreshSystemState",
+ });
+
+ interface Stats {
+ int ASSIGN_JOBS_TO_CONTEXTS = 0;
+ int REFRESH_SYSTEM_STATE = 1;
+
+ int COUNT = REFRESH_SYSTEM_STATE + 1;
+ }
+
JobConcurrencyManager(JobSchedulerService service) {
mService = service;
mLock = mService.mLock;
mConstants = service.mConstants;
+ mContext = service.getContext();
+
+ mHandler = BackgroundThread.getHandler();
+ }
+
+ public void onSystemReady() {
+ mPowerManager = mContext.getSystemService(PowerManager.class);
+
+ final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ mContext.registerReceiver(mReceiver, filter);
+
+ onInteractiveStateChanged(mPowerManager.isInteractive());
+ }
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ switch (intent.getAction()) {
+ case Intent.ACTION_SCREEN_ON:
+ onInteractiveStateChanged(true);
+ break;
+ case Intent.ACTION_SCREEN_OFF:
+ onInteractiveStateChanged(false);
+ break;
+ }
+ }
+ };
+
+ /**
+ * Called when the screen turns on / off.
+ */
+ private void onInteractiveStateChanged(boolean interactive) {
+ synchronized (mLock) {
+ if (mCurrentInteractiveState == interactive) {
+ return;
+ }
+ mCurrentInteractiveState = interactive;
+ if (DEBUG) {
+ Slog.d(TAG, "Interactive: " + interactive);
+ }
+
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ if (interactive) {
+ mLastScreenOnRealtime = now;
+ mEffectiveInteractiveState = true;
+
+ mHandler.removeCallbacks(mRampUpForScreenOff);
+ } else {
+ mLastScreenOffRealtime = now;
+
+ // Set mEffectiveInteractiveState to false after the delay, when we may increase
+ // the concurrency.
+ // We don't need a wakeup alarm here. When there's a pending job, there should
+ // also be jobs running too, meaning the device should be awake.
+
+ // Note: we can't directly do postDelayed(this::rampUpForScreenOn), because
+ // we need the exact same instance for removeCallbacks().
+ mHandler.postDelayed(mRampUpForScreenOff,
+ mConstants.SCREEN_OFF_JOB_CONCURRENCY_INCREASE_DELAY_MS.getValue());
+ }
+ }
+ }
+
+ private final Runnable mRampUpForScreenOff = this::rampUpForScreenOff;
+
+ /**
+ * Called in {@link Constants#SCREEN_OFF_JOB_CONCURRENCY_INCREASE_DELAY_MS} after
+ * the screen turns off, in order to increase concurrency.
+ */
+ private void rampUpForScreenOff() {
+ synchronized (mLock) {
+ // Make sure the screen has really been off for the configured duration.
+ // (There could be a race.)
+ if (!mEffectiveInteractiveState) {
+ return;
+ }
+ if (mLastScreenOnRealtime > mLastScreenOffRealtime) {
+ return;
+ }
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ if ((mLastScreenOffRealtime
+ + mConstants.SCREEN_OFF_JOB_CONCURRENCY_INCREASE_DELAY_MS.getValue())
+ > now) {
+ return;
+ }
+
+ mEffectiveInteractiveState = false;
+
+ if (DEBUG) {
+ Slog.d(TAG, "Ramping up concurrency");
+ }
+
+ mService.maybeRunPendingJobsLocked();
+ }
+ }
+
+ private boolean isFgJob(JobStatus job) {
+ return job.lastEvaluatedPriority >= JobInfo.PRIORITY_TOP_APP;
+ }
+
+ @GuardedBy("mLock")
+ private void refreshSystemStateLocked() {
+ final long nowUptime = JobSchedulerService.sUptimeMillisClock.millis();
+
+ // Only refresh the information every so often.
+ if (nowUptime < mNextSystemStateRefreshTime) {
+ return;
+ }
+
+ final long start = mStatLogger.getTime();
+ mNextSystemStateRefreshTime = nowUptime + SYSTEM_STATE_REFRESH_MIN_INTERVAL;
+
+ mLastMemoryTrimLevel = ProcessStats.ADJ_MEM_FACTOR_NORMAL;
+ try {
+ mLastMemoryTrimLevel = ActivityManager.getService().getMemoryTrimLevel();
+ } catch (RemoteException e) {
+ }
+
+ mStatLogger.logDurationStat(Stats.REFRESH_SYSTEM_STATE, start);
+ }
+
+ @GuardedBy("mLock")
+ private void updateMaxCountsLocked() {
+ refreshSystemStateLocked();
+
+ if (mEffectiveInteractiveState) {
+ // Screen on
+ switch (mLastMemoryTrimLevel) {
+ case ProcessStats.ADJ_MEM_FACTOR_MODERATE:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_ON_MODERATE;
+ break;
+ case ProcessStats.ADJ_MEM_FACTOR_LOW:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_ON_LOW;
+ break;
+ case ProcessStats.ADJ_MEM_FACTOR_CRITICAL:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_ON_CRITICAL;
+ break;
+ default:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_ON_NORMAL;
+ break;
+ }
+ } else {
+ // Screen off
+ switch (mLastMemoryTrimLevel) {
+ case ProcessStats.ADJ_MEM_FACTOR_MODERATE:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_OFF_MODERATE;
+ break;
+ case ProcessStats.ADJ_MEM_FACTOR_LOW:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_OFF_LOW;
+ break;
+ case ProcessStats.ADJ_MEM_FACTOR_CRITICAL:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_OFF_CRITICAL;
+ break;
+ default:
+ mMaxJobCounts = mConstants.MAX_JOB_COUNTS_OFF_NORMAL;
+ break;
+ }
+ }
}
/**
@@ -62,7 +273,17 @@ class JobConcurrencyManager {
* run higher priority ones.
* Lock on mJobs before calling this function.
*/
+ @GuardedBy("mLock")
void assignJobsToContextsLocked() {
+ final long start = mStatLogger.getTime();
+
+ assignJobsToContextsInternalLocked();
+
+ mStatLogger.logDurationStat(Stats.ASSIGN_JOBS_TO_CONTEXTS, start);
+ }
+
+ @GuardedBy("mLock")
+ private void assignJobsToContextsInternalLocked() {
if (DEBUG) {
Slog.d(TAG, printPendingQueueLocked());
}
@@ -72,60 +293,63 @@ class JobConcurrencyManager {
final List<JobServiceContext> activeServices = mService.mActiveServices;
final List<StateController> controllers = mService.mControllers;
- int memLevel;
- try {
- memLevel = ActivityManager.getService().getMemoryTrimLevel();
- } catch (RemoteException e) {
- memLevel = ProcessStats.ADJ_MEM_FACTOR_NORMAL;
- }
- switch (memLevel) {
- case ProcessStats.ADJ_MEM_FACTOR_MODERATE:
- mService.mMaxActiveJobs = mConstants.BG_MODERATE_JOB_COUNT;
- break;
- case ProcessStats.ADJ_MEM_FACTOR_LOW:
- mService.mMaxActiveJobs = mConstants.BG_LOW_JOB_COUNT;
- break;
- case ProcessStats.ADJ_MEM_FACTOR_CRITICAL:
- mService.mMaxActiveJobs = mConstants.BG_CRITICAL_JOB_COUNT;
- break;
- default:
- mService.mMaxActiveJobs = mConstants.BG_NORMAL_JOB_COUNT;
- break;
- }
+ updateMaxCountsLocked();
// To avoid GC churn, we recycle the arrays.
JobStatus[] contextIdToJobMap = mRecycledAssignContextIdToJobMap;
boolean[] slotChanged = mRecycledSlotChanged;
int[] preferredUidForContext = mRecycledPreferredUidForContext;
- int numTotalRunningJobs = 0;
- int numForegroundJobs = 0;
+
+ // Initialize the work variables and also count running jobs.
+ mJobCountTracker.reset(
+ mMaxJobCounts.getTotalMax(),
+ mMaxJobCounts.getMaxBg(),
+ mMaxJobCounts.getMinBg());
+
for (int i=0; i<MAX_JOB_CONTEXTS_COUNT; i++) {
final JobServiceContext js = mService.mActiveServices.get(i);
final JobStatus status = js.getRunningJobLocked();
+
if ((contextIdToJobMap[i] = status) != null) {
- numTotalRunningJobs++;
- if (status.lastEvaluatedPriority >= JobInfo.PRIORITY_TOP_APP) {
- numForegroundJobs++;
- }
+ mJobCountTracker.incrementRunningJobCount(isFgJob(status));
}
+
slotChanged[i] = false;
preferredUidForContext[i] = js.getPreferredUid();
}
if (DEBUG) {
Slog.d(TAG, printContextIdToJobMap(contextIdToJobMap, "running jobs initial"));
}
- for (int i=0; i<pendingJobs.size(); i++) {
- final JobStatus nextPending = pendingJobs.get(i);
+
+ // Next, update the job priorities, and also count the pending FG / BG jobs.
+ for (int i = 0; i < pendingJobs.size(); i++) {
+ final JobStatus pending = pendingJobs.get(i);
// If job is already running, go to next job.
+ int jobRunningContext = findJobContextIdFromMap(pending, contextIdToJobMap);
+ if (jobRunningContext != -1) {
+ continue;
+ }
+
+ final int priority = mService.evaluateJobPriorityLocked(pending);
+ pending.lastEvaluatedPriority = priority;
+
+ mJobCountTracker.incrementPendingJobCount(isFgJob(pending));
+ }
+
+ mJobCountTracker.onCountDone();
+
+ for (int i = 0; i < pendingJobs.size(); i++) {
+ final JobStatus nextPending = pendingJobs.get(i);
+
+ // Unfortunately we need to repeat this relatively expensive check.
int jobRunningContext = findJobContextIdFromMap(nextPending, contextIdToJobMap);
if (jobRunningContext != -1) {
continue;
}
- final int priority = mService.evaluateJobPriorityLocked(nextPending);
- nextPending.lastEvaluatedPriority = priority;
+ final boolean isPendingFg = isFgJob(nextPending);
// Find an available slot for nextPending. The context should be available OR
// it should have lowest priority among all running jobs
@@ -137,18 +361,10 @@ class JobConcurrencyManager {
JobStatus job = contextIdToJobMap[j];
int preferredUid = preferredUidForContext[j];
if (job == null) {
- final boolean totalCountOk = numTotalRunningJobs < mService.mMaxActiveJobs;
- final boolean fgCountOk = (priority >= JobInfo.PRIORITY_TOP_APP)
- && (numForegroundJobs < mConstants.FG_JOB_COUNT);
final boolean preferredUidOkay = (preferredUid == nextPending.getUid())
|| (preferredUid == JobServiceContext.NO_PREFERRED_UID);
- // TODO: The following check is slightly wrong.
- // Depending on how the pending jobs are sorted, we sometimes cap the total
- // job count at mMaxActiveJobs (when all jobs are FG jobs), or
- // at [mMaxActiveJobs + FG_JOB_COUNT] (when there are mMaxActiveJobs BG jobs
- // and then FG_JOB_COUNT FG jobs.)
- if ((totalCountOk || fgCountOk) && preferredUidOkay) {
+ if (preferredUidOkay && mJobCountTracker.canJobStart(isPendingFg)) {
// This slot is free, and we haven't yet hit the limit on
// concurrent jobs... we can just throw the job in to here.
selectedContextId = j;
@@ -183,16 +399,18 @@ class JobConcurrencyManager {
}
if (startingJob) {
// Increase the counters when we're going to start a job.
- numTotalRunningJobs++;
- if (priority >= JobInfo.PRIORITY_TOP_APP) {
- numForegroundJobs++;
- }
+ mJobCountTracker.onStartingNewJob(isPendingFg);
}
}
if (DEBUG) {
Slog.d(TAG, printContextIdToJobMap(contextIdToJobMap, "running jobs final"));
}
- tracker.noteConcurrency(numTotalRunningJobs, numForegroundJobs);
+
+ mJobCountTracker.logStatus();
+
+ tracker.noteConcurrency(mJobCountTracker.getTotalRunningJobCountToNote(),
+ mJobCountTracker.getFgRunningJobCountToNote());
+
for (int i=0; i<MAX_JOB_CONTEXTS_COUNT; i++) {
boolean preservePreferredUid = false;
if (slotChanged[i]) {
@@ -228,7 +446,7 @@ class JobConcurrencyManager {
}
}
- int findJobContextIdFromMap(JobStatus jobStatus, JobStatus[] map) {
+ private static int findJobContextIdFromMap(JobStatus jobStatus, JobStatus[] map) {
for (int i=0; i<map.length; i++) {
if (map[i] != null && map[i].matches(jobStatus.getUid(), jobStatus.getJobId())) {
return i;
@@ -237,6 +455,7 @@ class JobConcurrencyManager {
return -1;
}
+ @GuardedBy("mLock")
private String printPendingQueueLocked() {
StringBuilder s = new StringBuilder("Pending queue: ");
Iterator<JobStatus> it = mService.mPendingJobs.iterator();
@@ -251,7 +470,7 @@ class JobConcurrencyManager {
return s.toString();
}
- private String printContextIdToJobMap(JobStatus[] map, String initial) {
+ private static String printContextIdToJobMap(JobStatus[] map, String initial) {
StringBuilder s = new StringBuilder(initial + ": ");
for (int i=0; i<map.length; i++) {
s.append("(")
@@ -262,4 +481,222 @@ class JobConcurrencyManager {
return s.toString();
}
+
+ public void dumpLocked(IndentingPrintWriter pw) {
+ final long now = System.currentTimeMillis();
+ final long nowRealtime = JobSchedulerService.sElapsedRealtimeClock.millis();
+
+ pw.println("Concurrency:");
+
+ pw.increaseIndent();
+ try {
+ pw.print("Screen state: current ");
+ pw.print(mCurrentInteractiveState ? "ON" : "OFF");
+ pw.print(" effective ");
+ pw.print(mEffectiveInteractiveState ? "ON" : "OFF");
+ pw.println();
+
+ pw.print("Last screen ON : ");
+ TimeUtils.dumpTimeWithDelta(pw, now - nowRealtime + mLastScreenOnRealtime, now);
+ pw.println();
+
+ pw.print("Last screen OFF: ");
+ TimeUtils.dumpTimeWithDelta(pw, now - nowRealtime + mLastScreenOffRealtime, now);
+ pw.println();
+
+ pw.println();
+
+ pw.println("Current max jobs:");
+ pw.println(" ");
+ pw.println(mJobCountTracker);
+
+ pw.println();
+
+ pw.print("mLastMemoryTrimLevel: ");
+ pw.print(mLastMemoryTrimLevel);
+ pw.println();
+
+ mStatLogger.dump(pw);
+ } finally {
+ pw.decreaseIndent();
+ }
+ }
+
+ public void dumpProtoLocked(ProtoOutputStream proto) {
+ // TODO Implement it.
+ }
+
+ /**
+ * This class decides, taking into account {@link #mMaxJobCounts} and how many jos are running /
+ * pending, how many more job can start.
+ *
+ * Extracted for testing and logging.
+ */
+ @VisibleForTesting
+ static class JobCountTracker {
+ private int mConfigNumTotalMaxJobs;
+ private int mConfigNumMaxBgJobs;
+ private int mConfigNumMinBgJobs;
+
+ private int mNumRunningFgJobs;
+ private int mNumRunningBgJobs;
+
+ private int mNumPendingFgJobs;
+ private int mNumPendingBgJobs;
+
+ private int mNumStartingFgJobs;
+ private int mNumStartingBgJobs;
+
+ private int mNumReservedForBg;
+ private int mNumActualMaxFgJobs;
+ private int mNumActualMaxBgJobs;
+
+ void reset(int numTotalMaxJobs, int numMaxBgJobs, int numMinBgJobs) {
+ mConfigNumTotalMaxJobs = numTotalMaxJobs;
+ mConfigNumMaxBgJobs = numMaxBgJobs;
+ mConfigNumMinBgJobs = numMinBgJobs;
+
+ mNumRunningFgJobs = 0;
+ mNumRunningBgJobs = 0;
+
+ mNumPendingFgJobs = 0;
+ mNumPendingBgJobs = 0;
+
+ mNumStartingFgJobs = 0;
+ mNumStartingBgJobs = 0;
+
+ mNumReservedForBg = 0;
+ mNumActualMaxFgJobs = 0;
+ mNumActualMaxBgJobs = 0;
+ }
+
+ void incrementRunningJobCount(boolean isFg) {
+ if (isFg) {
+ mNumRunningFgJobs++;
+ } else {
+ mNumRunningBgJobs++;
+ }
+ }
+
+ void incrementPendingJobCount(boolean isFg) {
+ if (isFg) {
+ mNumPendingFgJobs++;
+ } else {
+ mNumPendingBgJobs++;
+ }
+ }
+
+ void onStartingNewJob(boolean isFg) {
+ if (isFg) {
+ mNumStartingFgJobs++;
+ } else {
+ mNumStartingBgJobs++;
+ }
+ }
+
+ void onCountDone() {
+ // Note some variables are used only here but are made class members in order to have
+ // them on logcat / dumpsys.
+
+ // How many slots should we allocate to BG jobs at least?
+ // That's basically "getMinBg()", but if there are less jobs, decrease it.
+ // (e.g. even if min-bg is 2, if there's only 1 running+pending job, this has to be 1.)
+ final int reservedForBg = Math.min(
+ mConfigNumMinBgJobs,
+ mNumRunningBgJobs + mNumPendingBgJobs);
+
+ // However, if there are FG jobs already running, we have to adjust it.
+ mNumReservedForBg = Math.min(reservedForBg,
+ mConfigNumTotalMaxJobs - mNumRunningFgJobs);
+
+ // Max FG is [total - [number needed for BG jobs]]
+ // [number needed for BG jobs] is the bigger one of [running BG] or [reserved BG]
+ final int maxFg =
+ mConfigNumTotalMaxJobs - Math.max(mNumRunningBgJobs, mNumReservedForBg);
+
+ // The above maxFg is the theoretical max. If there are less FG jobs, the actual
+ // max FG will be lower accordingly.
+ mNumActualMaxFgJobs = Math.min(
+ maxFg,
+ mNumRunningFgJobs + mNumPendingFgJobs);
+
+ // Max BG is [total - actual max FG], but cap at [config max BG].
+ final int maxBg = Math.min(
+ mConfigNumMaxBgJobs,
+ mConfigNumTotalMaxJobs - mNumActualMaxFgJobs);
+
+ // If there are less BG jobs than maxBg, then reduce the actual max BG accordingly.
+ // This isn't needed for the logic to work, but this will give consistent output
+ // on logcat and dumpsys.
+ mNumActualMaxBgJobs = Math.min(
+ maxBg,
+ mNumRunningBgJobs + mNumPendingBgJobs);
+ }
+
+ boolean canJobStart(boolean isFg) {
+ if (isFg) {
+ return mNumRunningFgJobs + mNumStartingFgJobs < mNumActualMaxFgJobs;
+ } else {
+ return mNumRunningBgJobs + mNumStartingBgJobs < mNumActualMaxBgJobs;
+ }
+ }
+
+ public int getNumStartingFgJobs() {
+ return mNumStartingFgJobs;
+ }
+
+ public int getNumStartingBgJobs() {
+ return mNumStartingBgJobs;
+ }
+
+ int getTotalRunningJobCountToNote() {
+ return mNumRunningFgJobs + mNumRunningBgJobs
+ + mNumStartingFgJobs + mNumStartingBgJobs;
+ }
+
+ int getFgRunningJobCountToNote() {
+ return mNumRunningFgJobs + mNumStartingFgJobs;
+ }
+
+ void logStatus() {
+ if (DEBUG) {
+ Slog.d(TAG, "assignJobsToContexts: " + this);
+ }
+ }
+
+ public String toString() {
+ final int totalFg = mNumRunningFgJobs + mNumStartingFgJobs;
+ final int totalBg = mNumRunningBgJobs + mNumStartingBgJobs;
+ return String.format(
+ "Config={tot=%d bg min/max=%d/%d}"
+ + " Running: %d / %d (%d)"
+ + " Pending: %d / %d (%d)"
+ + " Actual max: %d%s / %d%s (%d%s)"
+ + " Starting: %d / %d (%d)"
+ + " Total: %d%s / %d%s (%d%s)",
+ mConfigNumTotalMaxJobs,
+ mConfigNumMinBgJobs,
+ mConfigNumMaxBgJobs,
+
+ mNumRunningFgJobs, mNumRunningBgJobs,
+ mNumRunningFgJobs + mNumRunningBgJobs,
+
+ mNumPendingFgJobs, mNumPendingBgJobs,
+ mNumPendingFgJobs + mNumPendingBgJobs,
+
+ mNumActualMaxFgJobs, (totalFg <= mConfigNumTotalMaxJobs) ? "" : "*",
+ mNumActualMaxBgJobs, (totalBg <= mConfigNumMaxBgJobs) ? "" : "*",
+
+ mNumActualMaxFgJobs + mNumActualMaxBgJobs,
+ (mNumActualMaxFgJobs + mNumActualMaxBgJobs <= mConfigNumTotalMaxJobs)
+ ? "" : "*",
+
+ mNumStartingFgJobs, mNumStartingBgJobs, mNumStartingFgJobs + mNumStartingBgJobs,
+
+ totalFg, (totalFg <= mNumActualMaxFgJobs) ? "" : "*",
+ totalBg, (totalBg <= mNumActualMaxBgJobs) ? "" : "*",
+ totalFg + totalBg, (totalFg + totalBg <= mConfigNumTotalMaxJobs) ? "" : "*"
+ );
+ }
+ }
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 3f9d928e1986..cc0ac9a7e0a9 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -224,12 +224,6 @@ public class JobSchedulerService extends com.android.server.SystemService
volatile boolean mInParole;
/**
- * Current limit on the number of concurrent JobServiceContext entries we want to
- * keep actively running a job.
- */
- int mMaxActiveJobs = 1;
-
- /**
* A mapping of which uids are currently in the foreground to their effective priority.
*/
final SparseIntArray mUidPriorityOverride = new SparseIntArray();
@@ -332,6 +326,71 @@ public class JobSchedulerService extends com.android.server.SystemService
}
}
+ static class MaxJobCounts {
+ private final KeyValueListParser.IntValue mTotal;
+ private final KeyValueListParser.IntValue mMaxBg;
+ private final KeyValueListParser.IntValue mMinBg;
+
+ MaxJobCounts(int totalDefault, String totalKey,
+ int maxBgDefault, String maxBgKey, int minBgDefault, String minBgKey) {
+ mTotal = new KeyValueListParser.IntValue(totalKey, totalDefault);
+ mMaxBg = new KeyValueListParser.IntValue(maxBgKey, maxBgDefault);
+ mMinBg = new KeyValueListParser.IntValue(minBgKey, minBgDefault);
+ }
+
+ public void parse(KeyValueListParser parser) {
+ mTotal.parse(parser);
+ mMaxBg.parse(parser);
+ mMinBg.parse(parser);
+
+ if (mTotal.getValue() < 1) {
+ mTotal.setValue(1);
+ } else if (mTotal.getValue() > MAX_JOB_CONTEXTS_COUNT) {
+ mTotal.setValue(MAX_JOB_CONTEXTS_COUNT);
+ }
+
+ if (mMaxBg.getValue() < 1) {
+ mMaxBg.setValue(1);
+ } else if (mMaxBg.getValue() > mTotal.getValue()) {
+ mMaxBg.setValue(mTotal.getValue());
+ }
+ if (mMinBg.getValue() < 0) {
+ mMinBg.setValue(0);
+ } else {
+ if (mMinBg.getValue() > mMaxBg.getValue()) {
+ mMinBg.setValue(mMaxBg.getValue());
+ }
+ if (mMinBg.getValue() >= mTotal.getValue()) {
+ mMinBg.setValue(mTotal.getValue() - 1);
+ }
+ }
+ }
+
+ public int getTotalMax() {
+ return mTotal.getValue();
+ }
+
+ public int getMaxBg() {
+ return mMaxBg.getValue();
+ }
+
+ public int getMinBg() {
+ return mMinBg.getValue();
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ mTotal.dump(pw, prefix);
+ mMaxBg.dump(pw, prefix);
+ mMinBg.dump(pw, prefix);
+ }
+
+ public void dumpProto(ProtoOutputStream proto, long tagTotal, long tagBg) {
+ mTotal.dumpProto(proto, tagTotal);
+ mMaxBg.dumpProto(proto, tagBg);
+ mMinBg.dumpProto(proto, tagBg);
+ }
+ }
+
/**
* All times are in milliseconds. These constants are kept synchronized with the system
* global Settings. Any access to this class or its fields should be done while
@@ -348,11 +407,14 @@ public class JobSchedulerService extends com.android.server.SystemService
private static final String KEY_MIN_READY_JOBS_COUNT = "min_ready_jobs_count";
private static final String KEY_HEAVY_USE_FACTOR = "heavy_use_factor";
private static final String KEY_MODERATE_USE_FACTOR = "moderate_use_factor";
- private static final String KEY_FG_JOB_COUNT = "fg_job_count";
- private static final String KEY_BG_NORMAL_JOB_COUNT = "bg_normal_job_count";
- private static final String KEY_BG_MODERATE_JOB_COUNT = "bg_moderate_job_count";
- private static final String KEY_BG_LOW_JOB_COUNT = "bg_low_job_count";
- private static final String KEY_BG_CRITICAL_JOB_COUNT = "bg_critical_job_count";
+
+ // The following values used to be used on P and below. Do not reuse them.
+ private static final String DEPRECATED_KEY_FG_JOB_COUNT = "fg_job_count";
+ private static final String DEPRECATED_KEY_BG_NORMAL_JOB_COUNT = "bg_normal_job_count";
+ private static final String DEPRECATED_KEY_BG_MODERATE_JOB_COUNT = "bg_moderate_job_count";
+ private static final String DEPRECATED_KEY_BG_LOW_JOB_COUNT = "bg_low_job_count";
+ private static final String DEPRECATED_KEY_BG_CRITICAL_JOB_COUNT = "bg_critical_job_count";
+
private static final String KEY_MAX_STANDARD_RESCHEDULE_COUNT
= "max_standard_reschedule_count";
private static final String KEY_MAX_WORK_RESCHEDULE_COUNT = "max_work_reschedule_count";
@@ -391,11 +453,6 @@ public class JobSchedulerService extends com.android.server.SystemService
private static final int DEFAULT_MIN_READY_JOBS_COUNT = 1;
private static final float DEFAULT_HEAVY_USE_FACTOR = .9f;
private static final float DEFAULT_MODERATE_USE_FACTOR = .5f;
- private static final int DEFAULT_FG_JOB_COUNT = 4;
- private static final int DEFAULT_BG_NORMAL_JOB_COUNT = 6;
- private static final int DEFAULT_BG_MODERATE_JOB_COUNT = 4;
- private static final int DEFAULT_BG_LOW_JOB_COUNT = 1;
- private static final int DEFAULT_BG_CRITICAL_JOB_COUNT = 1;
private static final int DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT = Integer.MAX_VALUE;
private static final int DEFAULT_MAX_WORK_RESCHEDULE_COUNT = Integer.MAX_VALUE;
private static final long DEFAULT_MIN_LINEAR_BACKOFF_TIME = JobInfo.MIN_BACKOFF_MILLIS;
@@ -468,30 +525,53 @@ public class JobSchedulerService extends com.android.server.SystemService
* This is the job execution factor that is considered to be moderate use of the system.
*/
float MODERATE_USE_FACTOR = DEFAULT_MODERATE_USE_FACTOR;
- /**
- * The number of MAX_JOB_CONTEXTS_COUNT we reserve for the foreground app.
- */
- int FG_JOB_COUNT = DEFAULT_FG_JOB_COUNT;
- /**
- * The maximum number of background jobs we allow when the system is in a normal
- * memory state.
- */
- int BG_NORMAL_JOB_COUNT = DEFAULT_BG_NORMAL_JOB_COUNT;
- /**
- * The maximum number of background jobs we allow when the system is in a moderate
- * memory state.
- */
- int BG_MODERATE_JOB_COUNT = DEFAULT_BG_MODERATE_JOB_COUNT;
- /**
- * The maximum number of background jobs we allow when the system is in a low
- * memory state.
- */
- int BG_LOW_JOB_COUNT = DEFAULT_BG_LOW_JOB_COUNT;
- /**
- * The maximum number of background jobs we allow when the system is in a critical
- * memory state.
- */
- int BG_CRITICAL_JOB_COUNT = DEFAULT_BG_CRITICAL_JOB_COUNT;
+
+ // Max job counts for screen on / off, for each memory trim level.
+ final MaxJobCounts MAX_JOB_COUNTS_ON_NORMAL = new MaxJobCounts(
+ 8, "max_job_total_on_normal",
+ 6, "max_job_max_bg_on_normal",
+ 2, "max_job_min_bg_on_normal");
+
+ final MaxJobCounts MAX_JOB_COUNTS_ON_MODERATE = new MaxJobCounts(
+ 8, "max_job_total_on_moderate",
+ 4, "max_job_max_bg_on_moderate",
+ 2, "max_job_min_bg_on_moderate");
+
+ final MaxJobCounts MAX_JOB_COUNTS_ON_LOW = new MaxJobCounts(
+ 5, "max_job_total_on_low",
+ 1, "max_job_max_bg_on_low",
+ 1, "max_job_min_bg_on_low");
+
+ final MaxJobCounts MAX_JOB_COUNTS_ON_CRITICAL = new MaxJobCounts(
+ 5, "max_job_total_on_critical",
+ 1, "max_job_max_bg_on_critical",
+ 1, "max_job_min_bg_on_critical");
+
+ final MaxJobCounts MAX_JOB_COUNTS_OFF_NORMAL = new MaxJobCounts(
+ 10, "max_job_total_off_normal",
+ 6, "max_job_max_bg_off_normal",
+ 2, "max_job_min_bg_off_normal");
+
+ final MaxJobCounts MAX_JOB_COUNTS_OFF_MODERATE = new MaxJobCounts(
+ 10, "max_job_total_off_moderate",
+ 4, "max_job_max_bg_off_moderate",
+ 2, "max_job_min_bg_off_moderate");
+
+ final MaxJobCounts MAX_JOB_COUNTS_OFF_LOW = new MaxJobCounts(
+ 5, "max_job_total_off_low",
+ 1, "max_job_max_bg_off_low",
+ 1, "max_job_min_bg_off_low");
+
+ final MaxJobCounts MAX_JOB_COUNTS_OFF_CRITICAL = new MaxJobCounts(
+ 5, "max_job_total_off_critical",
+ 1, "max_job_max_bg_off_critical",
+ 1, "max_job_min_bg_off_critical");
+
+ /** Wait for this long after screen off before increasing the job concurrency. */
+ final KeyValueListParser.IntValue SCREEN_OFF_JOB_CONCURRENCY_INCREASE_DELAY_MS =
+ new KeyValueListParser.IntValue(
+ "screen_off_job_concurrency_increase_delay_ms", 30_000);
+
/**
* The maximum number of times we allow a job to have itself rescheduled before
* giving up on it, for standard jobs.
@@ -566,7 +646,7 @@ public class JobSchedulerService extends com.android.server.SystemService
/**
* The quota window size of the particular standby bucket. Apps in this standby bucket are
- * expected to run only {@link QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
+ * expected to run only {@link #QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
* WINDOW_SIZE_MS.
*/
public long QUOTA_CONTROLLER_WINDOW_SIZE_ACTIVE_MS =
@@ -574,7 +654,7 @@ public class JobSchedulerService extends com.android.server.SystemService
/**
* The quota window size of the particular standby bucket. Apps in this standby bucket are
- * expected to run only {@link QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
+ * expected to run only {@link #QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
* WINDOW_SIZE_MS.
*/
public long QUOTA_CONTROLLER_WINDOW_SIZE_WORKING_MS =
@@ -582,7 +662,7 @@ public class JobSchedulerService extends com.android.server.SystemService
/**
* The quota window size of the particular standby bucket. Apps in this standby bucket are
- * expected to run only {@link QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
+ * expected to run only {@link #QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
* WINDOW_SIZE_MS.
*/
public long QUOTA_CONTROLLER_WINDOW_SIZE_FREQUENT_MS =
@@ -590,7 +670,7 @@ public class JobSchedulerService extends com.android.server.SystemService
/**
* The quota window size of the particular standby bucket. Apps in this standby bucket are
- * expected to run only {@link QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
+ * expected to run only {@link #QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS} within the past
* WINDOW_SIZE_MS.
*/
public long QUOTA_CONTROLLER_WINDOW_SIZE_RARE_MS =
@@ -631,28 +711,17 @@ public class JobSchedulerService extends com.android.server.SystemService
DEFAULT_HEAVY_USE_FACTOR);
MODERATE_USE_FACTOR = mParser.getFloat(KEY_MODERATE_USE_FACTOR,
DEFAULT_MODERATE_USE_FACTOR);
- FG_JOB_COUNT = mParser.getInt(KEY_FG_JOB_COUNT,
- DEFAULT_FG_JOB_COUNT);
- BG_NORMAL_JOB_COUNT = mParser.getInt(KEY_BG_NORMAL_JOB_COUNT,
- DEFAULT_BG_NORMAL_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_NORMAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_NORMAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_MODERATE_JOB_COUNT = mParser.getInt(KEY_BG_MODERATE_JOB_COUNT,
- DEFAULT_BG_MODERATE_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_MODERATE_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_MODERATE_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_LOW_JOB_COUNT = mParser.getInt(KEY_BG_LOW_JOB_COUNT,
- DEFAULT_BG_LOW_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_LOW_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_LOW_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_CRITICAL_JOB_COUNT = mParser.getInt(KEY_BG_CRITICAL_JOB_COUNT,
- DEFAULT_BG_CRITICAL_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_CRITICAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_CRITICAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
+
+ MAX_JOB_COUNTS_ON_NORMAL.parse(mParser);
+ MAX_JOB_COUNTS_ON_MODERATE.parse(mParser);
+ MAX_JOB_COUNTS_ON_LOW.parse(mParser);
+ MAX_JOB_COUNTS_ON_CRITICAL.parse(mParser);
+
+ MAX_JOB_COUNTS_OFF_NORMAL.parse(mParser);
+ MAX_JOB_COUNTS_OFF_MODERATE.parse(mParser);
+ MAX_JOB_COUNTS_OFF_LOW.parse(mParser);
+ MAX_JOB_COUNTS_OFF_CRITICAL.parse(mParser);
+
MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT,
DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT);
MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT,
@@ -712,11 +781,17 @@ public class JobSchedulerService extends com.android.server.SystemService
pw.printPair(KEY_MIN_READY_JOBS_COUNT, MIN_READY_JOBS_COUNT).println();
pw.printPair(KEY_HEAVY_USE_FACTOR, HEAVY_USE_FACTOR).println();
pw.printPair(KEY_MODERATE_USE_FACTOR, MODERATE_USE_FACTOR).println();
- pw.printPair(KEY_FG_JOB_COUNT, FG_JOB_COUNT).println();
- pw.printPair(KEY_BG_NORMAL_JOB_COUNT, BG_NORMAL_JOB_COUNT).println();
- pw.printPair(KEY_BG_MODERATE_JOB_COUNT, BG_MODERATE_JOB_COUNT).println();
- pw.printPair(KEY_BG_LOW_JOB_COUNT, BG_LOW_JOB_COUNT).println();
- pw.printPair(KEY_BG_CRITICAL_JOB_COUNT, BG_CRITICAL_JOB_COUNT).println();
+
+ MAX_JOB_COUNTS_ON_NORMAL.dump(pw, "");
+ MAX_JOB_COUNTS_ON_MODERATE.dump(pw, "");
+ MAX_JOB_COUNTS_ON_LOW.dump(pw, "");
+ MAX_JOB_COUNTS_ON_CRITICAL.dump(pw, "");
+
+ MAX_JOB_COUNTS_OFF_NORMAL.dump(pw, "");
+ MAX_JOB_COUNTS_OFF_MODERATE.dump(pw, "");
+ MAX_JOB_COUNTS_OFF_LOW.dump(pw, "");
+ MAX_JOB_COUNTS_OFF_CRITICAL.dump(pw, "");
+
pw.printPair(KEY_MAX_STANDARD_RESCHEDULE_COUNT, MAX_STANDARD_RESCHEDULE_COUNT).println();
pw.printPair(KEY_MAX_WORK_RESCHEDULE_COUNT, MAX_WORK_RESCHEDULE_COUNT).println();
pw.printPair(KEY_MIN_LINEAR_BACKOFF_TIME, MIN_LINEAR_BACKOFF_TIME).println();
@@ -762,11 +837,9 @@ public class JobSchedulerService extends com.android.server.SystemService
proto.write(ConstantsProto.MIN_READY_JOBS_COUNT, MIN_READY_JOBS_COUNT);
proto.write(ConstantsProto.HEAVY_USE_FACTOR, HEAVY_USE_FACTOR);
proto.write(ConstantsProto.MODERATE_USE_FACTOR, MODERATE_USE_FACTOR);
- proto.write(ConstantsProto.FG_JOB_COUNT, FG_JOB_COUNT);
- proto.write(ConstantsProto.BG_NORMAL_JOB_COUNT, BG_NORMAL_JOB_COUNT);
- proto.write(ConstantsProto.BG_MODERATE_JOB_COUNT, BG_MODERATE_JOB_COUNT);
- proto.write(ConstantsProto.BG_LOW_JOB_COUNT, BG_LOW_JOB_COUNT);
- proto.write(ConstantsProto.BG_CRITICAL_JOB_COUNT, BG_CRITICAL_JOB_COUNT);
+
+ // TODO Dump max job counts.
+
proto.write(ConstantsProto.MAX_STANDARD_RESCHEDULE_COUNT, MAX_STANDARD_RESCHEDULE_COUNT);
proto.write(ConstantsProto.MAX_WORK_RESCHEDULE_COUNT, MAX_WORK_RESCHEDULE_COUNT);
proto.write(ConstantsProto.MIN_LINEAR_BACKOFF_TIME_MS, MIN_LINEAR_BACKOFF_TIME);
@@ -1458,6 +1531,9 @@ public class JobSchedulerService extends com.android.server.SystemService
} catch (RemoteException e) {
// ignored; both services live in system_server
}
+
+ mConcurrencyManager.onSystemReady();
+
// Remove any jobs that are not associated with any of the current users.
cancelJobsForNonExistentUsers();
// Register thermal callback
@@ -1585,7 +1661,7 @@ public class JobSchedulerService extends com.android.server.SystemService
* Reschedules the given job based on the job's backoff policy. It doesn't make sense to
* specify an override deadline on a failed job (the failed job will run even though it's not
* ready), so we reschedule it with {@link JobStatus#NO_LATEST_RUNTIME}, but specify that any
- * ready job with {@link JobStatus#numFailures} > 0 will be executed.
+ * ready job with {@link JobStatus#getNumFailures()} > 0 will be executed.
*
* @param failureToReschedule Provided job status that we will reschedule.
* @return A newly instantiated JobStatus with the same constraints as the last job except
@@ -2367,7 +2443,7 @@ public class JobSchedulerService extends com.android.server.SystemService
* A controller can force a job into the pending queue even if it's already running, but
* here is where we decide whether to actually execute it.
*/
- private void maybeRunPendingJobsLocked() {
+ void maybeRunPendingJobsLocked() {
if (DEBUG) {
Slog.d(TAG, "pending queue: " + mPendingJobs.size() + " jobs.");
}
@@ -3380,9 +3456,12 @@ public class JobSchedulerService extends com.android.server.SystemService
pw.println();
pw.print("mReadyToRock="); pw.println(mReadyToRock);
pw.print("mReportedActive="); pw.println(mReportedActive);
- pw.print("mMaxActiveJobs="); pw.println(mMaxActiveJobs);
}
pw.println();
+
+ mConcurrencyManager.dumpLocked(pw);
+
+ pw.println();
pw.print("PersistStats: ");
pw.println(mJobs.getPersistStats());
}
@@ -3534,8 +3613,8 @@ public class JobSchedulerService extends com.android.server.SystemService
if (filterUid == -1) {
proto.write(JobSchedulerServiceDumpProto.IS_READY_TO_ROCK, mReadyToRock);
proto.write(JobSchedulerServiceDumpProto.REPORTED_ACTIVE, mReportedActive);
- proto.write(JobSchedulerServiceDumpProto.MAX_ACTIVE_JOBS, mMaxActiveJobs);
}
+ mConcurrencyManager.dumpProtoLocked(proto);
}
proto.flush();
diff --git a/services/core/java/com/android/server/job/controllers/QuotaController.java b/services/core/java/com/android/server/job/controllers/QuotaController.java
index ac2dbdf9450e..c16d1b4ecec5 100644
--- a/services/core/java/com/android/server/job/controllers/QuotaController.java
+++ b/services/core/java/com/android/server/job/controllers/QuotaController.java
@@ -26,7 +26,10 @@ import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
+import android.app.IUidObserver;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.BroadcastReceiver;
@@ -38,12 +41,14 @@ import android.os.BatteryManagerInternal;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
@@ -69,6 +74,11 @@ import java.util.function.Predicate;
* bucket, it will be eligible to run. When a job's bucket changes, its new quota is immediately
* applied to it.
*
+ * Jobs are throttled while an app is not in a foreground state. All jobs are allowed to run
+ * freely when an app enters the foreground state and are restricted when the app leaves the
+ * foreground state. However, jobs that are started while the app is in the TOP state are not
+ * restricted regardless of the app's state change.
+ *
* Test: atest com.android.server.job.controllers.QuotaControllerTest
*/
public final class QuotaController extends StateController {
@@ -97,6 +107,12 @@ public final class QuotaController extends StateController {
data.put(packageName, obj);
}
+ public void clear() {
+ for (int i = 0; i < mData.size(); ++i) {
+ mData.valueAt(i).clear();
+ }
+ }
+
/** Removes all the data for the user, if there was any. */
public void delete(int userId) {
mData.delete(userId);
@@ -119,6 +135,11 @@ public final class QuotaController extends StateController {
return null;
}
+ /** @see SparseArray#indexOfKey */
+ public int indexOfKey(int userId) {
+ return mData.indexOfKey(userId);
+ }
+
/** Returns the userId at the given index. */
public int keyAt(int index) {
return mData.keyAt(index);
@@ -294,6 +315,17 @@ public final class QuotaController extends StateController {
/** Cached calculation results for each app, with the standby buckets as the array indices. */
private final UserPackageMap<ExecutionStats[]> mExecutionStatsCache = new UserPackageMap<>();
+ /** List of UIDs currently in the foreground. */
+ private final SparseBooleanArray mForegroundUids = new SparseBooleanArray();
+
+ /**
+ * List of jobs that started while the UID was in the TOP state. There will be no more than
+ * 16 ({@link JobSchedulerService.MAX_JOB_CONTEXTS_COUNT}) running at once, so an ArraySet is
+ * fine.
+ */
+ private final ArraySet<JobStatus> mTopStartedJobs = new ArraySet<>();
+
+ private final ActivityManagerInternal mActivityManagerInternal;
private final AlarmManager mAlarmManager;
private final ChargingTracker mChargeTracker;
private final Handler mHandler;
@@ -343,6 +375,29 @@ public final class QuotaController extends StateController {
}
};
+ private final IUidObserver mUidObserver = new IUidObserver.Stub() {
+ @Override
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ mHandler.obtainMessage(MSG_UID_PROCESS_STATE_CHANGED, uid, procState).sendToTarget();
+ }
+
+ @Override
+ public void onUidGone(int uid, boolean disabled) {
+ }
+
+ @Override
+ public void onUidActive(int uid) {
+ }
+
+ @Override
+ public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ @Override
+ public void onUidCachedChanged(int uid, boolean cached) {
+ }
+ };
+
/**
* The rolling window size for each standby bucket. Within each window, an app will have 10
* minutes to run its jobs.
@@ -363,12 +418,15 @@ public final class QuotaController extends StateController {
private static final int MSG_CLEAN_UP_SESSIONS = 1;
/** Check if a package is now within its quota. */
private static final int MSG_CHECK_PACKAGE = 2;
+ /** Process state for a UID has changed. */
+ private static final int MSG_UID_PROCESS_STATE_CHANGED = 3;
public QuotaController(JobSchedulerService service) {
super(service);
mHandler = new QcHandler(mContext.getMainLooper());
mChargeTracker = new ChargingTracker();
mChargeTracker.startTracking();
+ mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
// Set up the app standby bucketing tracker
@@ -376,6 +434,14 @@ public final class QuotaController extends StateController {
UsageStatsManagerInternal.class);
usageStats.addAppIdleStateChangeListener(new StandbyTracker());
+ try {
+ ActivityManager.getService().registerUidObserver(mUidObserver,
+ ActivityManager.UID_OBSERVER_PROCSTATE,
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, null);
+ } catch (RemoteException e) {
+ // ignored; both services live in system_server
+ }
+
onConstantsUpdatedLocked();
}
@@ -399,11 +465,15 @@ public final class QuotaController extends StateController {
if (DEBUG) Slog.d(TAG, "Prepping for " + jobStatus.toShortString());
final int userId = jobStatus.getSourceUserId();
final String packageName = jobStatus.getSourcePackageName();
+ final int uid = jobStatus.getSourceUid();
Timer timer = mPkgTimers.get(userId, packageName);
if (timer == null) {
- timer = new Timer(userId, packageName);
+ timer = new Timer(uid, userId, packageName);
mPkgTimers.add(userId, packageName, timer);
}
+ if (mActivityManagerInternal.getUidProcessState(uid) == ActivityManager.PROCESS_STATE_TOP) {
+ mTopStartedJobs.add(jobStatus);
+ }
timer.startTrackingJob(jobStatus);
}
@@ -421,6 +491,7 @@ public final class QuotaController extends StateController {
if (jobs != null) {
jobs.remove(jobStatus);
}
+ mTopStartedJobs.remove(jobStatus);
}
}
@@ -511,6 +582,7 @@ public final class QuotaController extends StateController {
mInQuotaAlarmListeners.delete(userId, packageName);
}
mExecutionStatsCache.delete(userId, packageName);
+ mForegroundUids.delete(uid);
}
@Override
@@ -522,6 +594,20 @@ public final class QuotaController extends StateController {
mExecutionStatsCache.delete(userId);
}
+ private boolean isUidInForeground(int uid) {
+ if (UserHandle.isCore(uid)) {
+ return true;
+ }
+ synchronized (mLock) {
+ return mForegroundUids.get(uid);
+ }
+ }
+
+ /** @return true if the job was started while the app was in the TOP state. */
+ private boolean isTopStartedJob(@NonNull final JobStatus jobStatus) {
+ return mTopStartedJobs.contains(jobStatus);
+ }
+
/**
* Returns an appropriate standby bucket for the job, taking into account any standby
* exemptions.
@@ -537,9 +623,15 @@ public final class QuotaController extends StateController {
private boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) {
final int standbyBucket = getEffectiveStandbyBucket(jobStatus);
- // Jobs for the active app should always be able to run.
- return jobStatus.uidActive || isWithinQuotaLocked(
- jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket);
+ Timer timer = mPkgTimers.get(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName());
+ // A job is within quota if one of the following is true:
+ // 1. it was started while the app was in the TOP state
+ // 2. the app is currently in the foreground
+ // 3. the app overall is within its quota
+ return isTopStartedJob(jobStatus)
+ || isUidInForeground(jobStatus.getSourceUid())
+ || isWithinQuotaLocked(
+ jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket);
}
private boolean isWithinQuotaLocked(final int userId, @NonNull final String packageName,
@@ -800,7 +892,7 @@ public final class QuotaController extends StateController {
final boolean isCharging = mChargeTracker.isCharging();
if (DEBUG) Slog.d(TAG, "handleNewChargingStateLocked: " + isCharging);
// Deal with Timers first.
- mPkgTimers.forEach((t) -> t.onChargingChanged(nowElapsed, isCharging));
+ mPkgTimers.forEach((t) -> t.onStateChanged(nowElapsed, isCharging));
// Now update jobs.
maybeUpdateAllConstraintsLocked();
}
@@ -837,10 +929,15 @@ public final class QuotaController extends StateController {
boolean changed = false;
for (int i = jobs.size() - 1; i >= 0; --i) {
final JobStatus js = jobs.valueAt(i);
- if (js.uidActive) {
- // Jobs for the active app should always be able to run.
+ if (isTopStartedJob(js)) {
+ // Job was started while the app was in the TOP state so we should allow it to
+ // finish.
changed |= js.setQuotaConstraintSatisfied(true);
- } else if (realStandbyBucket == getEffectiveStandbyBucket(js)) {
+ } else if (realStandbyBucket != ACTIVE_INDEX
+ && realStandbyBucket == getEffectiveStandbyBucket(js)) {
+ // An app in the ACTIVE bucket may be out of quota while the job could be in quota
+ // for some reason. Therefore, avoid setting the real value here and check each job
+ // individually.
changed |= js.setQuotaConstraintSatisfied(realInQuota);
} else {
// This job is somehow exempted. Need to determine its own quota status.
@@ -854,7 +951,7 @@ public final class QuotaController extends StateController {
maybeScheduleStartAlarmLocked(userId, packageName, realStandbyBucket);
} else {
QcAlarmListener alarmListener = mInQuotaAlarmListeners.get(userId, packageName);
- if (alarmListener != null) {
+ if (alarmListener != null && alarmListener.isWaiting()) {
mAlarmManager.cancel(alarmListener);
// Set the trigger time to 0 so that the alarm doesn't think it's still waiting.
alarmListener.setTriggerTime(0);
@@ -863,6 +960,56 @@ public final class QuotaController extends StateController {
return changed;
}
+ private class UidConstraintUpdater implements Consumer<JobStatus> {
+ private final UserPackageMap<Integer> mToScheduleStartAlarms = new UserPackageMap<>();
+ public boolean wasJobChanged;
+
+ @Override
+ public void accept(JobStatus jobStatus) {
+ wasJobChanged |= jobStatus.setQuotaConstraintSatisfied(isWithinQuotaLocked(jobStatus));
+ final int userId = jobStatus.getSourceUserId();
+ final String packageName = jobStatus.getSourcePackageName();
+ final int realStandbyBucket = jobStatus.getStandbyBucket();
+ if (isWithinQuotaLocked(userId, packageName, realStandbyBucket)) {
+ QcAlarmListener alarmListener = mInQuotaAlarmListeners.get(userId, packageName);
+ if (alarmListener != null && alarmListener.isWaiting()) {
+ mAlarmManager.cancel(alarmListener);
+ // Set the trigger time to 0 so that the alarm doesn't think it's still waiting.
+ alarmListener.setTriggerTime(0);
+ }
+ } else {
+ mToScheduleStartAlarms.add(userId, packageName, realStandbyBucket);
+ }
+ }
+
+ void postProcess() {
+ for (int u = 0; u < mToScheduleStartAlarms.numUsers(); ++u) {
+ final int userId = mToScheduleStartAlarms.keyAt(u);
+ for (int p = 0; p < mToScheduleStartAlarms.numPackagesForUser(userId); ++p) {
+ final String packageName = mToScheduleStartAlarms.keyAt(u, p);
+ final int standbyBucket = mToScheduleStartAlarms.get(userId, packageName);
+ maybeScheduleStartAlarmLocked(userId, packageName, standbyBucket);
+ }
+ }
+ }
+
+ void reset() {
+ wasJobChanged = false;
+ mToScheduleStartAlarms.clear();
+ }
+ }
+
+ private final UidConstraintUpdater mUpdateUidConstraints = new UidConstraintUpdater();
+
+ private boolean maybeUpdateConstraintForUidLocked(final int uid) {
+ mService.getJobStore().forEachJobForSourceUid(uid, mUpdateUidConstraints);
+
+ mUpdateUidConstraints.postProcess();
+ boolean changed = mUpdateUidConstraints.wasJobChanged;
+ mUpdateUidConstraints.reset();
+ return changed;
+ }
+
/**
* Maybe schedule a non-wakeup alarm for the next time this package will have quota to run
* again. This should only be called if the package is already out of quota.
@@ -1052,6 +1199,7 @@ public final class QuotaController extends StateController {
private final class Timer {
private final Package mPkg;
+ private final int mUid;
// List of jobs currently running for this app that started when the app wasn't in the
// foreground.
@@ -1059,16 +1207,18 @@ public final class QuotaController extends StateController {
private long mStartTimeElapsed;
private int mBgJobCount;
- Timer(int userId, String packageName) {
+ Timer(int uid, int userId, String packageName) {
mPkg = new Package(userId, packageName);
+ mUid = uid;
}
void startTrackingJob(@NonNull JobStatus jobStatus) {
- if (jobStatus.uidActive) {
- // We intentionally don't pay attention to fg state changes after a job has started.
+ if (isTopStartedJob(jobStatus)) {
+ // We intentionally don't pay attention to fg state changes after a TOP job has
+ // started.
if (DEBUG) {
Slog.v(TAG,
- "Timer ignoring " + jobStatus.toShortString() + " because uidActive");
+ "Timer ignoring " + jobStatus.toShortString() + " because isTop");
}
return;
}
@@ -1076,7 +1226,7 @@ public final class QuotaController extends StateController {
synchronized (mLock) {
// Always track jobs, even when charging.
mRunningBgJobs.add(jobStatus);
- if (!mChargeTracker.isCharging()) {
+ if (shouldTrackLocked()) {
mBgJobCount++;
if (mRunningBgJobs.size() == 1) {
// Started tracking the first job.
@@ -1142,6 +1292,10 @@ public final class QuotaController extends StateController {
}
}
+ boolean isRunning(JobStatus jobStatus) {
+ return mRunningBgJobs.contains(jobStatus);
+ }
+
long getCurrentDuration(long nowElapsed) {
synchronized (mLock) {
return !isActive() ? 0 : nowElapsed - mStartTimeElapsed;
@@ -1154,17 +1308,21 @@ public final class QuotaController extends StateController {
}
}
- void onChargingChanged(long nowElapsed, boolean isCharging) {
+ private boolean shouldTrackLocked() {
+ return !mChargeTracker.isCharging() && !mForegroundUids.get(mUid);
+ }
+
+ void onStateChanged(long nowElapsed, boolean isQuotaFree) {
synchronized (mLock) {
- if (isCharging) {
+ if (isQuotaFree) {
emitSessionLocked(nowElapsed);
- } else {
+ } else if (shouldTrackLocked()) {
// Start timing from unplug.
if (mRunningBgJobs.size() > 0) {
mStartTimeElapsed = nowElapsed;
// NOTE: this does have the unfortunate consequence that if the device is
- // repeatedly plugged in and unplugged, the job count for a package may be
- // artificially high.
+ // repeatedly plugged in and unplugged, or an app changes foreground state
+ // very frequently, the job count for a package may be artificially high.
mBgJobCount = mRunningBgJobs.size();
// Starting the timer means that all cached execution stats are now
// incorrect.
@@ -1371,6 +1529,38 @@ public final class QuotaController extends StateController {
}
break;
}
+ case MSG_UID_PROCESS_STATE_CHANGED: {
+ final int uid = msg.arg1;
+ final int procState = msg.arg2;
+ final int userId = UserHandle.getUserId(uid);
+ final long nowElapsed = sElapsedRealtimeClock.millis();
+
+ synchronized (mLock) {
+ boolean isQuotaFree;
+ if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+ mForegroundUids.put(uid, true);
+ isQuotaFree = true;
+ } else {
+ mForegroundUids.delete(uid);
+ isQuotaFree = false;
+ }
+ // Update Timers first.
+ final int userIndex = mPkgTimers.indexOfKey(userId);
+ if (userIndex != -1) {
+ final int numPkgs = mPkgTimers.numPackagesForUser(userId);
+ for (int p = 0; p < numPkgs; ++p) {
+ Timer t = mPkgTimers.valueAt(userIndex, p);
+ if (t != null) {
+ t.onStateChanged(nowElapsed, isQuotaFree);
+ }
+ }
+ }
+ if (maybeUpdateConstraintForUidLocked(uid)) {
+ mStateChangedListener.onControllerStateChanged();
+ }
+ }
+ break;
+ }
}
}
}
@@ -1420,6 +1610,12 @@ public final class QuotaController extends StateController {
@VisibleForTesting
@NonNull
+ SparseBooleanArray getForegroundUids() {
+ return mForegroundUids;
+ }
+
+ @VisibleForTesting
+ @NonNull
Handler getHandler() {
return mHandler;
}
@@ -1450,6 +1646,10 @@ public final class QuotaController extends StateController {
pw.println("In parole: " + mInParole);
pw.println();
+ pw.print("Foreground UIDs: ");
+ pw.println(mForegroundUids.toString());
+ pw.println();
+
mTrackedJobs.forEach((jobs) -> {
for (int j = 0; j < jobs.size(); j++) {
final JobStatus js = jobs.valueAt(j);
@@ -1460,6 +1660,9 @@ public final class QuotaController extends StateController {
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
+ if (mTopStartedJobs.contains(js)) {
+ pw.print(" (TOP)");
+ }
pw.println();
pw.increaseIndent();
@@ -1511,6 +1714,11 @@ public final class QuotaController extends StateController {
proto.write(StateControllerProto.QuotaController.IS_CHARGING, mChargeTracker.isCharging());
proto.write(StateControllerProto.QuotaController.IS_IN_PAROLE, mInParole);
+ for (int i = 0; i < mForegroundUids.size(); ++i) {
+ proto.write(StateControllerProto.QuotaController.FOREGROUND_UIDS,
+ mForegroundUids.keyAt(i));
+ }
+
mTrackedJobs.forEach((jobs) -> {
for (int j = 0; j < jobs.size(); j++) {
final JobStatus js = jobs.valueAt(j);
@@ -1526,6 +1734,8 @@ public final class QuotaController extends StateController {
proto.write(
StateControllerProto.QuotaController.TrackedJob.EFFECTIVE_STANDBY_BUCKET,
getEffectiveStandbyBucket(js));
+ proto.write(StateControllerProto.QuotaController.TrackedJob.IS_TOP_STARTED_JOB,
+ mTopStartedJobs.contains(js));
proto.write(StateControllerProto.QuotaController.TrackedJob.HAS_QUOTA,
js.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
proto.write(StateControllerProto.QuotaController.TrackedJob.REMAINING_QUOTA_MS,
diff --git a/services/core/java/com/android/server/location/AbstractLocationProvider.java b/services/core/java/com/android/server/location/AbstractLocationProvider.java
index 4c7c420214bd..b3f101848692 100644
--- a/services/core/java/com/android/server/location/AbstractLocationProvider.java
+++ b/services/core/java/com/android/server/location/AbstractLocationProvider.java
@@ -29,7 +29,7 @@ import java.io.PrintWriter;
import java.util.List;
/**
- * Location Manager's interface for location providers.
+ * Location Manager's interface for location providers. Always starts as disabled.
*
* @hide
*/
@@ -41,12 +41,6 @@ public abstract class AbstractLocationProvider {
public interface LocationProviderManager {
/**
- * Called on location provider construction to make the location service aware of this
- * provider and what it's initial enabled/disabled state should be.
- */
- void onAttachProvider(AbstractLocationProvider locationProvider, boolean initiallyEnabled);
-
- /**
* May be called to inform the location service of a change in this location provider's
* enabled/disabled state.
*/
@@ -74,13 +68,7 @@ public abstract class AbstractLocationProvider {
private final LocationProviderManager mLocationProviderManager;
protected AbstractLocationProvider(LocationProviderManager locationProviderManager) {
- this(locationProviderManager, true);
- }
-
- protected AbstractLocationProvider(LocationProviderManager locationProviderManager,
- boolean initiallyEnabled) {
mLocationProviderManager = locationProviderManager;
- mLocationProviderManager.onAttachProvider(this, initiallyEnabled);
}
/**
diff --git a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
deleted file mode 100644
index 22fabb2cdd3e..000000000000
--- a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.location;
-
-import android.content.Context;
-import android.hardware.location.ActivityRecognitionHardware;
-import android.hardware.location.IActivityRecognitionHardwareClient;
-import android.hardware.location.IActivityRecognitionHardwareWatcher;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.internal.os.BackgroundThread;
-import com.android.server.ServiceWatcher;
-
-/**
- * Proxy class to bind GmsCore to the ActivityRecognitionHardware.
- *
- * @hide
- */
-public class ActivityRecognitionProxy {
-
- private static final String TAG = "ActivityRecognitionProxy";
-
- /**
- * Creates an instance of the proxy and binds it to the appropriate FusedProvider.
- *
- * @return An instance of the proxy if it could be bound, null otherwise.
- */
- public static ActivityRecognitionProxy createAndBind(
- Context context,
- boolean activityRecognitionHardwareIsSupported,
- ActivityRecognitionHardware activityRecognitionHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- ActivityRecognitionProxy activityRecognitionProxy = new ActivityRecognitionProxy(
- context,
- activityRecognitionHardwareIsSupported,
- activityRecognitionHardware,
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId);
-
- if (activityRecognitionProxy.mServiceWatcher.start()) {
- return activityRecognitionProxy;
- } else {
- return null;
- }
- }
-
- private final ServiceWatcher mServiceWatcher;
- private final boolean mIsSupported;
- private final ActivityRecognitionHardware mInstance;
-
- private ActivityRecognitionProxy(
- Context context,
- boolean activityRecognitionHardwareIsSupported,
- ActivityRecognitionHardware activityRecognitionHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- mIsSupported = activityRecognitionHardwareIsSupported;
- mInstance = activityRecognitionHardware;
-
- mServiceWatcher = new ServiceWatcher(
- context,
- TAG,
- "com.android.location.service.ActivityRecognitionProvider",
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId,
- BackgroundThread.getHandler()) {
- @Override
- protected void onBind() {
- runOnBinder(ActivityRecognitionProxy.this::initializeService);
- }
- };
- }
-
- private void initializeService(IBinder binder) {
- try {
- String descriptor = binder.getInterfaceDescriptor();
-
- if (IActivityRecognitionHardwareWatcher.class.getCanonicalName().equals(
- descriptor)) {
- IActivityRecognitionHardwareWatcher watcher =
- IActivityRecognitionHardwareWatcher.Stub.asInterface(binder);
- if (mInstance != null) {
- watcher.onInstanceChanged(mInstance);
- }
- } else if (IActivityRecognitionHardwareClient.class.getCanonicalName()
- .equals(descriptor)) {
- IActivityRecognitionHardwareClient client =
- IActivityRecognitionHardwareClient.Stub.asInterface(binder);
- client.onAvailabilityChanged(mIsSupported, mInstance);
- } else {
- Log.e(TAG, "Invalid descriptor found on connection: " + descriptor);
- }
- } catch (RemoteException e) {
- Log.w(TAG, e);
- }
- }
-}
diff --git a/services/core/java/com/android/server/location/GeofenceProxy.java b/services/core/java/com/android/server/location/GeofenceProxy.java
index ca4f7fee494a..38c7d491f706 100644
--- a/services/core/java/com/android/server/location/GeofenceProxy.java
+++ b/services/core/java/com/android/server/location/GeofenceProxy.java
@@ -113,8 +113,12 @@ public final class GeofenceProxy {
IGeofenceHardware geofenceHardware = IGeofenceHardware.Stub.asInterface(service);
try {
- geofenceHardware.setGpsGeofenceHardware(mGpsGeofenceHardware);
- geofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware);
+ if (mGpsGeofenceHardware != null) {
+ geofenceHardware.setGpsGeofenceHardware(mGpsGeofenceHardware);
+ }
+ if (mFusedGeofenceHardware != null) {
+ geofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware);
+ }
mGeofenceHardware = geofenceHardware;
mServiceWatcher.runOnBinder(mUpdateGeofenceHardware);
diff --git a/services/core/java/com/android/server/location/GnssConfiguration.java b/services/core/java/com/android/server/location/GnssConfiguration.java
new file mode 100644
index 000000000000..72259268aa81
--- /dev/null
+++ b/services/core/java/com/android/server/location/GnssConfiguration.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2019 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.location;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.os.SystemProperties;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.StatsLog;
+
+import libcore.io.IoUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+/**
+ * A utility class to hold GNSS configuration properties.
+ *
+ * The trigger to load/reload the configuration parameters should be managed by the class
+ * that owns an instance of this class.
+ *
+ * Instances of this class are not thread-safe and should either be used from a single thread
+ * or with external synchronization when used by multiple threads.
+ */
+class GnssConfiguration {
+ private static final String TAG = "GnssConfiguration";
+
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ //TODO(b/33112647): Create gps_debug.conf with commented career parameters.
+ private static final String DEBUG_PROPERTIES_FILE = "/etc/gps_debug.conf";
+
+ // config.xml properties
+ private static final String CONFIG_SUPL_HOST = "SUPL_HOST";
+ private static final String CONFIG_SUPL_PORT = "SUPL_PORT";
+ private static final String CONFIG_C2K_HOST = "C2K_HOST";
+ private static final String CONFIG_C2K_PORT = "C2K_PORT";
+ private static final String CONFIG_SUPL_VER = "SUPL_VER";
+ private static final String CONFIG_SUPL_MODE = "SUPL_MODE";
+ private static final String CONFIG_SUPL_ES = "SUPL_ES";
+ private static final String CONFIG_LPP_PROFILE = "LPP_PROFILE";
+ private static final String CONFIG_A_GLONASS_POS_PROTOCOL_SELECT =
+ "A_GLONASS_POS_PROTOCOL_SELECT";
+ private static final String CONFIG_USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL =
+ "USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL";
+ private static final String CONFIG_GPS_LOCK = "GPS_LOCK";
+ private static final String CONFIG_ES_EXTENSION_SEC = "ES_EXTENSION_SEC";
+ public static final String CONFIG_NFW_PROXY_APPS = "NFW_PROXY_APPS";
+
+ // Limit on NI emergency mode time extension after emergency sessions ends
+ private static final int MAX_EMERGENCY_MODE_EXTENSION_SECONDS = 300; // 5 minute maximum
+
+ // Persist property for LPP_PROFILE
+ static final String LPP_PROFILE = "persist.sys.gps.lpp";
+
+ // Represents an HAL interface version. Instances of this class are created in the JNI layer
+ // and returned through native methods.
+ private static class HalInterfaceVersion {
+ final int mMajor;
+ final int mMinor;
+
+ HalInterfaceVersion(int major, int minor) {
+ mMajor = major;
+ mMinor = minor;
+ }
+ }
+
+ /**
+ * Properties loaded from PROPERTIES_FILE.
+ */
+ private Properties mProperties;
+
+ private int mEsExtensionSec = 0;
+
+ private final Context mContext;
+
+ GnssConfiguration(Context context) {
+ mContext = context;
+ mProperties = new Properties();
+ }
+
+ /**
+ * Returns the full set of properties loaded.
+ */
+ Properties getProperties() {
+ return mProperties;
+ }
+
+ /**
+ * Returns the value of config parameter ES_EXTENSION_SEC. The value is range checked
+ * and constrained to min/max limits.
+ */
+ int getEsExtensionSec() {
+ return mEsExtensionSec;
+ }
+
+ /**
+ * Returns the value of config parameter SUPL_HOST or {@code null} if no value is
+ * provided.
+ */
+ String getSuplHost() {
+ return mProperties.getProperty(CONFIG_SUPL_HOST);
+ }
+
+ /**
+ * Returns the value of config parameter SUPL_PORT or {@code defaultPort} if no value is
+ * provided or if there is an error parsing the configured value.
+ */
+ int getSuplPort(int defaultPort) {
+ return getIntConfig(CONFIG_SUPL_PORT, defaultPort);
+ }
+
+ /**
+ * Returns the value of config parameter C2K_HOST or {@code null} if no value is
+ * provided.
+ */
+ String getC2KHost() {
+ return mProperties.getProperty(CONFIG_C2K_HOST);
+ }
+
+ /**
+ * Returns the value of config parameter C2K_PORT or {@code defaultPort} if no value is
+ * provided or if there is an error parsing the configured value.
+ */
+ int getC2KPort(int defaultPort) {
+ return getIntConfig(CONFIG_C2K_PORT, defaultPort);
+ }
+
+ /**
+ * Returns the value of config parameter SUPL_MODE or {@code defaultMode} if no value is
+ * provided or if there is an error parsing the configured value.
+ */
+ int getSuplMode(int defaultMode) {
+ return getIntConfig(CONFIG_SUPL_MODE, defaultMode);
+ }
+
+ /**
+ * Returns the value of config parameter SUPL_ES or {@code defaultSuplEs} if no value is
+ * provided or if there is an error parsing the configured value.
+ */
+ int getSuplEs(int defaulSuplEs) {
+ return getIntConfig(CONFIG_SUPL_ES, defaulSuplEs);
+ }
+
+ /**
+ * Returns the value of config parameter LPP_PROFILE or {@code null} if no value is
+ * provided.
+ */
+ String getLppProfile() {
+ return mProperties.getProperty(CONFIG_LPP_PROFILE);
+ }
+
+ /**
+ * Returns the list of proxy apps from the value of config parameter NFW_PROXY_APPS or
+ * {@Collections.EMPTY_LIST} if no value is provided.
+ */
+ List<String> getProxyApps() {
+ // Space separated list of Android proxy app package names.
+ String proxyAppsStr = mProperties.getProperty(CONFIG_NFW_PROXY_APPS);
+ if (TextUtils.isEmpty(proxyAppsStr)) {
+ return Collections.EMPTY_LIST;
+ }
+
+ String[] proxyAppsArray = proxyAppsStr.trim().split("\\s+");
+ if (proxyAppsArray.length == 0) {
+ return Collections.EMPTY_LIST;
+ }
+
+ // TODO(b/122856486): Validate proxy app names so that a system app or some popular app
+ // with location permission is not specified as a proxy app.
+ ArrayList proxyApps = new ArrayList(proxyAppsArray.length);
+ for (String proxyApp : proxyAppsArray) {
+ proxyApps.add(proxyApp);
+ }
+
+ return proxyApps;
+ }
+
+ /**
+ * Updates the GNSS HAL satellite blacklist.
+ */
+ void setSatelliteBlacklist(int[] constellations, int[] svids) {
+ native_set_satellite_blacklist(constellations, svids);
+ }
+
+ interface SetCarrierProperty {
+ boolean set(int value);
+ }
+
+ /**
+ * Loads the GNSS properties from carrier config file followed by the properties from
+ * gps debug config file.
+ */
+ void reloadGpsProperties() {
+ if (DEBUG) Log.d(TAG, "Reset GPS properties, previous size = " + mProperties.size());
+ loadPropertiesFromCarrierConfig();
+
+ String lpp_prof = SystemProperties.get(LPP_PROFILE);
+ if (!TextUtils.isEmpty(lpp_prof)) {
+ // override default value of this if lpp_prof is not empty
+ mProperties.setProperty(CONFIG_LPP_PROFILE, lpp_prof);
+ }
+ /*
+ * Overlay carrier properties from a debug configuration file.
+ */
+ loadPropertiesFromGpsDebugConfig(mProperties);
+
+ mEsExtensionSec = getRangeCheckedConfigEsExtensionSec();
+
+ logConfigurations();
+
+ final HalInterfaceVersion gnssConfigurationIfaceVersion =
+ native_get_gnss_configuration_version();
+ if (gnssConfigurationIfaceVersion != null) {
+ // Set to a range checked value.
+ if (isConfigEsExtensionSecSupported(gnssConfigurationIfaceVersion)
+ && !native_set_es_extension_sec(mEsExtensionSec)) {
+ Log.e(TAG, "Unable to set " + CONFIG_ES_EXTENSION_SEC + ": " + mEsExtensionSec);
+ }
+
+ Map<String, SetCarrierProperty> map = new HashMap<String, SetCarrierProperty>() {
+ {
+ put(CONFIG_SUPL_VER, GnssConfiguration::native_set_supl_version);
+ put(CONFIG_SUPL_MODE, GnssConfiguration::native_set_supl_mode);
+
+ if (isConfigSuplEsSupported(gnssConfigurationIfaceVersion)) {
+ put(CONFIG_SUPL_ES, GnssConfiguration::native_set_supl_es);
+ }
+
+ put(CONFIG_LPP_PROFILE, GnssConfiguration::native_set_lpp_profile);
+ put(CONFIG_A_GLONASS_POS_PROTOCOL_SELECT,
+ GnssConfiguration::native_set_gnss_pos_protocol_select);
+ put(CONFIG_USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL,
+ GnssConfiguration::native_set_emergency_supl_pdn);
+
+ if (isConfigGpsLockSupported(gnssConfigurationIfaceVersion)) {
+ put(CONFIG_GPS_LOCK, GnssConfiguration::native_set_gps_lock);
+ }
+ }
+ };
+
+ for (Entry<String, SetCarrierProperty> entry : map.entrySet()) {
+ String propertyName = entry.getKey();
+ String propertyValueString = mProperties.getProperty(propertyName);
+ if (propertyValueString != null) {
+ try {
+ int propertyValueInt = Integer.decode(propertyValueString);
+ boolean result = entry.getValue().set(propertyValueInt);
+ if (!result) {
+ Log.e(TAG, "Unable to set " + propertyName);
+ }
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Unable to parse propertyName: " + propertyValueString);
+ }
+ }
+ }
+ } else if (DEBUG) {
+ Log.d(TAG, "Skipped configuration update because GNSS configuration in GPS HAL is not"
+ + " supported");
+ }
+ }
+
+ private void logConfigurations() {
+ StatsLog.write(StatsLog.GNSS_CONFIGURATION_REPORTED,
+ getSuplHost(),
+ getSuplPort(0),
+ getC2KHost(),
+ getC2KPort(0),
+ getIntConfig(CONFIG_SUPL_VER, 0),
+ getSuplMode(0),
+ getSuplEs(0) == 1,
+ getIntConfig(CONFIG_LPP_PROFILE, 0),
+ getIntConfig(CONFIG_A_GLONASS_POS_PROTOCOL_SELECT, 0),
+ getIntConfig(CONFIG_USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, 0) == 1,
+ getIntConfig(CONFIG_GPS_LOCK, 0),
+ getEsExtensionSec(),
+ mProperties.getProperty(CONFIG_NFW_PROXY_APPS));
+ }
+
+ /**
+ * Loads GNSS properties from carrier config file.
+ */
+ void loadPropertiesFromCarrierConfig() {
+ CarrierConfigManager configManager = (CarrierConfigManager)
+ mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (configManager == null) {
+ return;
+ }
+ PersistableBundle configs = configManager.getConfigForSubId(
+ SubscriptionManager.getDefaultDataSubscriptionId());
+ if (configs == null) {
+ if (DEBUG) Log.d(TAG, "SIM not ready, use default carrier config.");
+ configs = CarrierConfigManager.getDefaultConfig();
+ }
+ for (String configKey : configs.keySet()) {
+ if (configKey.startsWith(CarrierConfigManager.Gps.KEY_PREFIX)) {
+ String key = configKey
+ .substring(CarrierConfigManager.Gps.KEY_PREFIX.length())
+ .toUpperCase();
+ Object value = configs.get(configKey);
+ if (value instanceof String) {
+ // All GPS properties are of String type; convert so.
+ if (DEBUG) Log.d(TAG, "Gps config: " + key + " = " + value);
+ mProperties.setProperty(key, (String) value);
+ }
+ }
+ }
+ }
+
+ private void loadPropertiesFromGpsDebugConfig(Properties properties) {
+ try {
+ File file = new File(DEBUG_PROPERTIES_FILE);
+ FileInputStream stream = null;
+ try {
+ stream = new FileInputStream(file);
+ properties.load(stream);
+ } finally {
+ IoUtils.closeQuietly(stream);
+ }
+ } catch (IOException e) {
+ if (DEBUG) Log.d(TAG, "Could not open GPS configuration file " + DEBUG_PROPERTIES_FILE);
+ }
+ }
+
+ private int getRangeCheckedConfigEsExtensionSec() {
+ int emergencyExtensionSeconds = getIntConfig(CONFIG_ES_EXTENSION_SEC, 0);
+ if (emergencyExtensionSeconds > MAX_EMERGENCY_MODE_EXTENSION_SECONDS) {
+ Log.w(TAG, CONFIG_ES_EXTENSION_SEC + ": " + emergencyExtensionSeconds
+ + " too high, reset to " + MAX_EMERGENCY_MODE_EXTENSION_SECONDS);
+ emergencyExtensionSeconds = MAX_EMERGENCY_MODE_EXTENSION_SECONDS;
+ } else if (emergencyExtensionSeconds < 0) {
+ Log.w(TAG, CONFIG_ES_EXTENSION_SEC + ": " + emergencyExtensionSeconds
+ + " is negative, reset to zero.");
+ emergencyExtensionSeconds = 0;
+ }
+ return emergencyExtensionSeconds;
+ }
+
+ private int getIntConfig(String configParameter, int defaultValue) {
+ String valueString = mProperties.getProperty(configParameter);
+ if (TextUtils.isEmpty(valueString)) {
+ return defaultValue;
+ }
+ try {
+ return Integer.parseInt(valueString);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Unable to parse config parameter " + configParameter + " value: "
+ + valueString + ". Using default value: " + defaultValue);
+ return defaultValue;
+ }
+ }
+
+ private static boolean isConfigEsExtensionSecSupported(
+ HalInterfaceVersion gnssConfiguartionIfaceVersion) {
+ // ES_EXTENSION_SEC is introduced in @2.0::IGnssConfiguration.hal
+ return gnssConfiguartionIfaceVersion.mMajor >= 2;
+ }
+
+ private static boolean isConfigSuplEsSupported(
+ HalInterfaceVersion gnssConfiguartionIfaceVersion) {
+ // SUPL_ES is deprecated in @2.0::IGnssConfiguration.hal
+ return gnssConfiguartionIfaceVersion.mMajor < 2;
+ }
+
+ private static boolean isConfigGpsLockSupported(
+ HalInterfaceVersion gnssConfiguartionIfaceVersion) {
+ // GPS_LOCK is deprecated in @2.0::IGnssConfiguration.hal
+ return gnssConfiguartionIfaceVersion.mMajor < 2;
+ }
+
+ private static native HalInterfaceVersion native_get_gnss_configuration_version();
+
+ private static native boolean native_set_supl_version(int version);
+
+ private static native boolean native_set_supl_mode(int mode);
+
+ private static native boolean native_set_supl_es(int es);
+
+ private static native boolean native_set_lpp_profile(int lppProfile);
+
+ private static native boolean native_set_gnss_pos_protocol_select(int gnssPosProtocolSelect);
+
+ private static native boolean native_set_gps_lock(int gpsLock);
+
+ private static native boolean native_set_emergency_supl_pdn(int emergencySuplPdn);
+
+ private static native boolean native_set_satellite_blacklist(int[] constellations, int[] svIds);
+
+ private static native boolean native_set_es_extension_sec(int emergencyExtensionSeconds);
+}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 54fc45cf3a72..41e73a7f8e2b 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -66,6 +66,7 @@ import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.Log;
+import android.util.StatsLog;
import com.android.internal.app.IBatteryStats;
import com.android.internal.location.GpsNetInitiatedHandler;
@@ -76,12 +77,7 @@ import com.android.internal.location.gnssmetrics.GnssMetrics;
import com.android.server.location.GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback;
import com.android.server.location.NtpTimeHelper.InjectNtpTimeCallback;
-import libcore.io.IoUtils;
-
-import java.io.File;
import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.IOException;
import java.io.PrintWriter;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -89,11 +85,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
/**
* A GNSS implementation of LocationProvider used by LocationManager.
@@ -149,7 +141,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private static final int LOCATION_HAS_SPEED_ACCURACY = 64;
private static final int LOCATION_HAS_BEARING_ACCURACY = 128;
-
// IMPORTANT - the GPS_DELETE_* symbols here must match GnssAidingData enum in IGnss.hal
private static final int GPS_DELETE_EPHEMERIS = 0x0001;
private static final int GPS_DELETE_ALMANAC = 0x0002;
@@ -202,9 +193,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private static final int AGPS_RIL_REQUEST_SETID_IMSI = 1;
private static final int AGPS_RIL_REQUEST_SETID_MSISDN = 2;
- //TODO(b/33112647): Create gps_debug.conf with commented career parameters.
- private static final String DEBUG_PROPERTIES_FILE = "/etc/gps_debug.conf";
-
// ref. location info
private static final int AGPS_REF_LOCATION_TYPE_GSM_CELLID = 1;
private static final int AGPS_REF_LOCATION_TYPE_UMTS_CELLID = 2;
@@ -377,7 +365,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
* Properties loaded from PROPERTIES_FILE.
* It must be accessed only inside {@link #mHandler}.
*/
- private Properties mProperties;
+ private GnssConfiguration mGnssConfiguration;
private String mSuplServerHost;
private int mSuplServerPort = TCP_MIN_PORT;
@@ -386,6 +374,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private boolean mSuplEsEnabled = false;
private final Context mContext;
+ private final Looper mLooper;
private final LocationExtras mLocationExtras = new LocationExtras();
private final GnssStatusListenerHelper mGnssStatusListenerHelper;
private final GnssSatelliteBlacklistHelper mGnssSatelliteBlacklistHelper;
@@ -396,6 +385,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private final NtpTimeHelper mNtpTimeHelper;
private final GnssBatchingProvider mGnssBatchingProvider;
private final GnssGeofenceProvider mGnssGeofenceProvider;
+ private GnssVisibilityControl mGnssVisibilityControl;
// Handler for processing events
private Handler mHandler;
@@ -413,12 +403,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP";
private final static String ALARM_TIMEOUT = "com.android.internal.location.ALARM_TIMEOUT";
- // Persist property for LPP_PROFILE
- private final static String LPP_PROFILE = "persist.sys.gps.lpp";
-
- // keeps track of the network connections and their types
- private HashMap<Network, NetworkInfo> mNetworkToConnectionType = new HashMap<Network, NetworkInfo>(5);
-
private final PowerManager mPowerManager;
private final AlarmManager mAlarmManager;
private final PendingIntent mWakeupIntent;
@@ -506,7 +490,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
*/
@Override
public void onUpdateSatelliteBlacklist(int[] constellations, int[] svids) {
- mHandler.post(() -> native_set_satellite_blacklist(constellations, svids));
+ mHandler.post(() -> mGnssConfiguration.setSatelliteBlacklist(constellations, svids));
}
private void subscriptionOrCarrierConfigChanged(Context context) {
@@ -529,17 +513,17 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
if (isKeepLppProfile) {
// load current properties for the carrier
- loadPropertiesFromCarrierConfig(context, mProperties);
- String lpp_profile = mProperties.getProperty("LPP_PROFILE");
+ mGnssConfiguration.loadPropertiesFromCarrierConfig();
+ String lpp_profile = mGnssConfiguration.getLppProfile();
// set the persist property LPP_PROFILE for the value
if (lpp_profile != null) {
- SystemProperties.set(LPP_PROFILE, lpp_profile);
+ SystemProperties.set(GnssConfiguration.LPP_PROFILE, lpp_profile);
}
} else {
// reset the persist property
- SystemProperties.set(LPP_PROFILE, "");
+ SystemProperties.set(GnssConfiguration.LPP_PROFILE, "");
}
- reloadGpsProperties(context, mProperties);
+ reloadGpsProperties();
mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
}
} else {
@@ -568,140 +552,25 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
return native_is_supported();
}
- interface SetCarrierProperty {
- boolean set(int value);
- }
-
- private void reloadGpsProperties(Context context, Properties properties) {
- if (DEBUG) Log.d(TAG, "Reset GPS properties, previous size = " + properties.size());
- loadPropertiesFromCarrierConfig(context, properties);
-
- String lpp_prof = SystemProperties.get(LPP_PROFILE);
- if (!TextUtils.isEmpty(lpp_prof)) {
- // override default value of this if lpp_prof is not empty
- properties.setProperty("LPP_PROFILE", lpp_prof);
- }
- /*
- * Overlay carrier properties from a debug configuration file.
- */
- loadPropertiesFromGpsDebugConfig(properties);
+ private void reloadGpsProperties() {
+ mGnssConfiguration.reloadGpsProperties();
+ setSuplHostPort();
// TODO: we should get rid of C2K specific setting.
- setSuplHostPort(properties.getProperty("SUPL_HOST"),
- properties.getProperty("SUPL_PORT"));
- mC2KServerHost = properties.getProperty("C2K_HOST");
- String portString = properties.getProperty("C2K_PORT");
- if (mC2KServerHost != null && portString != null) {
- try {
- mC2KServerPort = Integer.parseInt(portString);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse C2K_PORT: " + portString);
- }
- }
- if (native_is_gnss_configuration_supported()) {
- Map<String, SetCarrierProperty> map = new HashMap<String, SetCarrierProperty>() {
- {
- put("SUPL_VER", GnssLocationProvider::native_set_supl_version);
- put("SUPL_MODE", GnssLocationProvider::native_set_supl_mode);
- put("SUPL_ES", GnssLocationProvider::native_set_supl_es);
- put("LPP_PROFILE", GnssLocationProvider::native_set_lpp_profile);
- put("A_GLONASS_POS_PROTOCOL_SELECT",
- GnssLocationProvider::native_set_gnss_pos_protocol_select);
- put("USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL",
- GnssLocationProvider::native_set_emergency_supl_pdn);
- put("GPS_LOCK", GnssLocationProvider::native_set_gps_lock);
- }
- };
-
- for (Entry<String, SetCarrierProperty> entry : map.entrySet()) {
- String propertyName = entry.getKey();
- String propertyValueString = properties.getProperty(propertyName);
- if (propertyValueString != null) {
- try {
- int propertyValueInt = Integer.decode(propertyValueString);
- boolean result = entry.getValue().set(propertyValueInt);
- if (!result) {
- Log.e(TAG, "Unable to set " + propertyName);
- }
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse propertyName: " + propertyValueString);
- }
- }
- }
- } else if (DEBUG) {
- Log.d(TAG, "Skipped configuration update because GNSS configuration in GPS HAL is not"
- + " supported");
- }
-
- // SUPL_ES configuration.
- String suplESProperty = mProperties.getProperty("SUPL_ES");
- if (suplESProperty != null) {
- try {
- mSuplEsEnabled = (Integer.parseInt(suplESProperty) == 1);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse SUPL_ES: " + suplESProperty);
- }
- }
-
- String emergencyExtensionSecondsString
- = properties.getProperty("ES_EXTENSION_SEC", "0");
- try {
- int emergencyExtensionSeconds =
- Integer.parseInt(emergencyExtensionSecondsString);
- mNIHandler.setEmergencyExtensionSeconds(emergencyExtensionSeconds);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse ES_EXTENSION_SEC: "
- + emergencyExtensionSecondsString);
- }
- }
-
- private void loadPropertiesFromCarrierConfig(Context context, Properties properties) {
- CarrierConfigManager configManager = (CarrierConfigManager)
- mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
- if (configManager == null) {
- return;
- }
- PersistableBundle configs = configManager.getConfigForSubId(
- SubscriptionManager.getDefaultDataSubscriptionId());
- if (configs == null) {
- if (DEBUG) Log.d(TAG, "SIM not ready, use default carrier config.");
- configs = CarrierConfigManager.getDefaultConfig();
- }
- for (String configKey : configs.keySet()) {
- if (configKey.startsWith(CarrierConfigManager.Gps.KEY_PREFIX)) {
- String key = configKey
- .substring(CarrierConfigManager.Gps.KEY_PREFIX.length())
- .toUpperCase();
- Object value = configs.get(configKey);
- if (value instanceof String) {
- // All GPS properties are of String type; convert so.
- if (DEBUG) Log.d(TAG, "Gps config: " + key + " = " + value);
- properties.setProperty(key, (String) value);
- }
- }
- }
- }
-
- private void loadPropertiesFromGpsDebugConfig(Properties properties) {
- try {
- File file = new File(DEBUG_PROPERTIES_FILE);
- FileInputStream stream = null;
- try {
- stream = new FileInputStream(file);
- properties.load(stream);
- } finally {
- IoUtils.closeQuietly(stream);
- }
-
- } catch (IOException e) {
- if (DEBUG) Log.d(TAG, "Could not open GPS configuration file " + DEBUG_PROPERTIES_FILE);
+ mC2KServerHost = mGnssConfiguration.getC2KHost();
+ mC2KServerPort = mGnssConfiguration.getC2KPort(TCP_MIN_PORT);
+ mNIHandler.setEmergencyExtensionSeconds(mGnssConfiguration.getEsExtensionSec());
+ mSuplEsEnabled = mGnssConfiguration.getSuplEs(0) == 1;
+ if (mGnssVisibilityControl != null) {
+ mGnssVisibilityControl.updateProxyApps(mGnssConfiguration.getProxyApps());
}
}
public GnssLocationProvider(Context context, LocationProviderManager locationProviderManager,
Looper looper) {
- super(locationProviderManager, true);
+ super(locationProviderManager);
mContext = context;
+ mLooper = looper;
// Create a wake lock
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -737,7 +606,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
// relative long time, so the ctor() is kept to create objects needed by this instance,
// while IO initialization and registration is delegated to our internal handler
// this approach is just fine because events are posted to our handler anyway
- mProperties = new Properties();
+ mGnssConfiguration = new GnssConfiguration(mContext);
sendMessage(INITIALIZE_HANDLER, 0, null);
// Create a GPS net-initiated handler.
@@ -792,6 +661,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}, UserHandle.ALL, intentFilter, null, mHandler);
setProperties(PROPERTIES);
+ setEnabled(true);
}
/**
@@ -922,7 +792,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
mDownloadXtraWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS);
Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()");
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
- GpsXtraDownloader xtraDownloader = new GpsXtraDownloader(mProperties);
+ GpsXtraDownloader xtraDownloader = new GpsXtraDownloader(
+ mGnssConfiguration.getProperties());
byte[] data = xtraDownloader.downloadXtraData();
if (data != null) {
if (DEBUG) Log.d(TAG, "calling native_inject_xtra_data");
@@ -967,17 +838,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
}
- private void setSuplHostPort(String hostString, String portString) {
- if (hostString != null) {
- mSuplServerHost = hostString;
- }
- if (portString != null) {
- try {
- mSuplServerPort = Integer.parseInt(portString);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse SUPL_PORT: " + portString);
- }
- }
+ private void setSuplHostPort() {
+ mSuplServerHost = mGnssConfiguration.getSuplHost();
+ mSuplServerPort = mGnssConfiguration.getSuplPort(TCP_MIN_PORT);
if (mSuplServerHost != null
&& mSuplServerPort > TCP_MIN_PORT
&& mSuplServerPort <= TCP_MAX_PORT) {
@@ -990,23 +853,17 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
* Checks what SUPL mode to use, according to the AGPS mode as well as the
* allowed mode from properties.
*
- * @param properties GPS properties
* @param agpsEnabled whether AGPS is enabled by settings value
* @param singleShot whether "singleshot" is needed
* @return SUPL mode (MSA vs MSB vs STANDALONE)
*/
- private int getSuplMode(Properties properties, boolean agpsEnabled, boolean singleShot) {
+ private int getSuplMode(boolean agpsEnabled, boolean singleShot) {
if (agpsEnabled) {
- String modeString = properties.getProperty("SUPL_MODE");
- int suplMode = 0;
- if (!TextUtils.isEmpty(modeString)) {
- try {
- suplMode = Integer.parseInt(modeString);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse SUPL_MODE: " + modeString);
- return GPS_POSITION_MODE_STANDALONE;
- }
+ int suplMode = mGnssConfiguration.getSuplMode(0);
+ if (suplMode == 0) {
+ return GPS_POSITION_MODE_STANDALONE;
}
+
// MS-Based is the preferred mode for Assisted-GPS position computation, so we favor
// such mode when it is available
if (hasCapability(GPS_CAPABILITY_MSB) && (suplMode & AGPS_SUPL_MODE_MSB) != 0) {
@@ -1311,7 +1168,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
boolean agpsEnabled =
(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ASSISTED_GPS_ENABLED, 1) != 0);
- mPositionMode = getSuplMode(mProperties, agpsEnabled, singleShot);
+ mPositionMode = getSuplMode(agpsEnabled, singleShot);
if (DEBUG) {
String mode;
@@ -1674,7 +1531,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
// re-calls native_init() and other setup.
handleEnable();
// resend configuration into the restarted HAL service.
- reloadGpsProperties(mContext, mProperties);
+ reloadGpsProperties();
}
});
}
@@ -1856,6 +1713,24 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
", response: " + userResponse);
}
native_send_ni_response(notificationId, userResponse);
+
+ StatsLog.write(StatsLog.GNSS_NI_EVENT_REPORTED,
+ StatsLog.GNSS_NI_EVENT_REPORTED__EVENT_TYPE__NI_RESPONSE,
+ notificationId,
+ /* niType= */ 0,
+ /* needNotify= */ false,
+ /* needVerify= */ false,
+ /* privacyOverride= */ false,
+ /* timeout= */ 0,
+ /* defaultResponse= */ 0,
+ /* requestorId= */ null,
+ /* text= */ null,
+ /* requestorIdEncoding= */ 0,
+ /* textEncoding= */ 0,
+ mSuplEsEnabled,
+ mEnabled,
+ userResponse);
+
return true;
}
};
@@ -1905,6 +1780,22 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
notification.textEncoding = textEncoding;
mNIHandler.handleNiNotification(notification);
+ StatsLog.write(StatsLog.GNSS_NI_EVENT_REPORTED,
+ StatsLog.GNSS_NI_EVENT_REPORTED__EVENT_TYPE__NI_REQUEST,
+ notification.notificationId,
+ notification.niType,
+ notification.needNotify,
+ notification.needVerify,
+ notification.privacyOverride,
+ notification.timeout,
+ notification.defaultResponse,
+ notification.requestorId,
+ notification.text,
+ notification.requestorIdEncoding,
+ notification.textEncoding,
+ mSuplEsEnabled,
+ mEnabled,
+ /* userResponse= */ 0);
}
/**
@@ -1986,6 +1877,27 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
}
+ // Implements method nfwNotifyCb() in IGnssVisibilityControlCallback.hal.
+ @NativeEntryPoint
+ private void reportNfwNotification(String proxyAppPackageName, byte protocolStack,
+ String otherProtocolStackName, byte requestor, String requestorId, byte responseType,
+ boolean inEmergencyMode, boolean isCachedLocation) {
+ if (mGnssVisibilityControl == null) {
+ Log.e(TAG, "reportNfwNotification: mGnssVisibilityControl is not initialized.");
+ return;
+ }
+
+ mGnssVisibilityControl.reportNfwNotification(proxyAppPackageName, protocolStack,
+ otherProtocolStackName, requestor, requestorId, responseType, inEmergencyMode,
+ isCachedLocation);
+ }
+
+ // Implements method isInEmergencySession() in IGnssVisibilityControlCallback.hal.
+ @NativeEntryPoint
+ boolean isInEmergencySession() {
+ return mNIHandler.getInEmergency();
+ }
+
private void sendMessage(int message, int arg, Object obj) {
// hold a wake lock until this message is delivered
// note that this assumes the message will not be removed from the queue before
@@ -2074,9 +1986,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
native_cleanup();
}
+ if (native_is_gnss_visibility_control_supported()) {
+ mGnssVisibilityControl = new GnssVisibilityControl(mContext, mLooper);
+ }
+
// load default GPS configuration
// (this configuration might change in the future based on SIM changes)
- reloadGpsProperties(mContext, mProperties);
+ reloadGpsProperties();
// TODO: When this object "finishes" we should unregister by invoking
// SubscriptionManager.getInstance(mContext).unregister
@@ -2231,7 +2147,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private static native boolean native_is_supported();
- private static native boolean native_is_gnss_configuration_supported();
+ private static native boolean native_is_gnss_visibility_control_supported();
private static native void native_init_once();
@@ -2288,21 +2204,4 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
int lac, int cid);
private native void native_agps_set_id(int type, String setid);
-
- // GNSS Configuration
- private static native boolean native_set_supl_version(int version);
-
- private static native boolean native_set_supl_mode(int mode);
-
- private static native boolean native_set_supl_es(int es);
-
- private static native boolean native_set_lpp_profile(int lppProfile);
-
- private static native boolean native_set_gnss_pos_protocol_select(int gnssPosProtocolSelect);
-
- private static native boolean native_set_gps_lock(int gpsLock);
-
- private static native boolean native_set_emergency_supl_pdn(int emergencySuplPdn);
-
- private static native boolean native_set_satellite_blacklist(int[] constellations, int[] svIds);
}
diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java
new file mode 100644
index 000000000000..591889dde5de
--- /dev/null
+++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (C) 2019 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.location;
+
+import android.annotation.SuppressLint;
+import android.app.AppOpsManager;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.StatsLog;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Handles GNSS non-framework location access user visibility and control.
+ *
+ * The state of the GnssVisibilityControl object must be accessed/modified through the Handler
+ * thread only.
+ */
+class GnssVisibilityControl {
+ private static final String TAG = "GnssVisibilityControl";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ // Constants related to non-framework (NFW) location access permission proxy apps.
+ private static final String NFW_PROXY_APP_PKG_ACTIVITY_NAME_SUFFIX =
+ ".NonFrameworkLocationAccessActivity";
+ private static final String NFW_INTENT_ACTION_NFW_LOCATION_ACCESS_SUFFIX =
+ ".intent.action.NON_FRAMEWORK_LOCATION_ACCESS";
+ private static final String NFW_INTENT_TYPE = "text/plain";
+
+ private static final String LOCATION_PERMISSION_NAME =
+ "android.permission.ACCESS_FINE_LOCATION";
+
+ // Wakelocks
+ private static final String WAKELOCK_KEY = TAG;
+ private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
+ private final PowerManager.WakeLock mWakeLock;
+
+ private final AppOpsManager mAppOps;
+ private final PackageManager mPackageManager;
+
+ private final Handler mHandler;
+ private final Context mContext;
+
+ // Number of non-framework location access proxy apps is expected to be small (< 5).
+ private static final int HASH_MAP_INITIAL_CAPACITY_PROXY_APP_TO_LOCATION_PERMISSIONS = 7;
+ private HashMap<String, Boolean> mProxyAppToLocationPermissions = new HashMap<>(
+ HASH_MAP_INITIAL_CAPACITY_PROXY_APP_TO_LOCATION_PERMISSIONS);
+
+ private PackageManager.OnPermissionsChangedListener mOnPermissionsChangedListener =
+ uid -> postEvent(() -> handlePermissionsChanged(uid));
+
+ GnssVisibilityControl(Context context, Looper looper) {
+ mContext = context;
+ PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
+ mHandler = new Handler(looper);
+ mAppOps = mContext.getSystemService(AppOpsManager.class);
+ mPackageManager = mContext.getPackageManager();
+ // TODO(b/122855984): Handle global location settings on/off.
+ // TODO(b/122856189): Handle roaming case.
+ }
+
+ void updateProxyApps(List<String> nfwLocationAccessProxyApps) {
+ // NOTE: This class doesn't explicitly register and listen for SIM_STATE_CHANGED event
+ // but rather piggy backs on the GnssLocationProvider SIM_STATE_CHANGED handling
+ // so that the order of processing is preserved. GnssLocationProvider should
+ // first load the new config parameters for the new SIM and then call this method.
+ postEvent(() -> handleSubscriptionOrSimChanged(nfwLocationAccessProxyApps));
+ }
+
+ void reportNfwNotification(String proxyAppPackageName, byte protocolStack,
+ String otherProtocolStackName, byte requestor, String requestorId, byte responseType,
+ boolean inEmergencyMode, boolean isCachedLocation) {
+ postEvent(() -> handleNfwNotification(
+ new NfwNotification(proxyAppPackageName, protocolStack, otherProtocolStackName,
+ requestor, requestorId, responseType, inEmergencyMode, isCachedLocation)));
+ }
+
+ private void handleSubscriptionOrSimChanged(List<String> nfwLocationAccessProxyApps) {
+ if (nfwLocationAccessProxyApps.isEmpty()) {
+ // Stop listening for app permission changes. Clear the app list in GNSS HAL.
+ if (!mProxyAppToLocationPermissions.isEmpty()) {
+ mPackageManager.removeOnPermissionsChangeListener(mOnPermissionsChangedListener);
+ mProxyAppToLocationPermissions.clear();
+ updateNfwLocationAccessProxyAppsInGnssHal();
+ }
+ return;
+ }
+
+ if (mProxyAppToLocationPermissions.isEmpty()) {
+ mPackageManager.addOnPermissionsChangeListener(mOnPermissionsChangedListener);
+ } else {
+ mProxyAppToLocationPermissions.clear();
+ }
+
+ for (String proxApp : nfwLocationAccessProxyApps) {
+ mProxyAppToLocationPermissions.put(proxApp, hasLocationPermission(proxApp));
+ }
+
+ updateNfwLocationAccessProxyAppsInGnssHal();
+ }
+
+ // Represents NfwNotification structure in IGnssVisibilityControlCallback.hal
+ private static class NfwNotification {
+ private static final String KEY_PROTOCOL_STACK = "ProtocolStack";
+ private static final String KEY_OTHER_PROTOCOL_STACK_NAME = "OtherProtocolStackName";
+ private static final String KEY_REQUESTOR = "Requestor";
+ private static final String KEY_REQUESTOR_ID = "RequestorId";
+ private static final String KEY_RESPONSE_TYPE = "ResponseType";
+ private static final String KEY_IN_EMERGENCY_MODE = "InEmergencyMode";
+ private static final String KEY_IS_CACHED_LOCATION = "IsCachedLocation";
+
+ // This must match with NfwResponseType enum in IGnssVisibilityControlCallback.hal.
+ private static final byte NFW_RESPONSE_TYPE_REJECTED = 0;
+ private static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
+ private static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;
+
+ private final String mProxyAppPackageName;
+ private final byte mProtocolStack;
+ private final String mOtherProtocolStackName;
+ private final byte mRequestor;
+ private final String mRequestorId;
+ private final byte mResponseType;
+ private final boolean mInEmergencyMode;
+ private final boolean mIsCachedLocation;
+
+ NfwNotification(String proxyAppPackageName, byte protocolStack,
+ String otherProtocolStackName, byte requestor, String requestorId,
+ byte responseType, boolean inEmergencyMode, boolean isCachedLocation) {
+ mProxyAppPackageName = proxyAppPackageName;
+ mProtocolStack = protocolStack;
+ mOtherProtocolStackName = otherProtocolStackName;
+ mRequestor = requestor;
+ mRequestorId = requestorId;
+ mResponseType = responseType;
+ mInEmergencyMode = inEmergencyMode;
+ mIsCachedLocation = isCachedLocation;
+ }
+
+ void copyFieldsToIntent(Intent intent) {
+ intent.putExtra(KEY_PROTOCOL_STACK, mProtocolStack);
+ if (!TextUtils.isEmpty(mOtherProtocolStackName)) {
+ intent.putExtra(KEY_OTHER_PROTOCOL_STACK_NAME, mOtherProtocolStackName);
+ }
+ intent.putExtra(KEY_REQUESTOR, mRequestor);
+ if (!TextUtils.isEmpty(mRequestorId)) {
+ intent.putExtra(KEY_REQUESTOR_ID, mRequestorId);
+ }
+ intent.putExtra(KEY_RESPONSE_TYPE, mResponseType);
+ intent.putExtra(KEY_IN_EMERGENCY_MODE, mInEmergencyMode);
+ if (mResponseType == NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED) {
+ intent.putExtra(KEY_IS_CACHED_LOCATION, mIsCachedLocation);
+ }
+ }
+
+ @SuppressLint("DefaultLocale")
+ public String toString() {
+ return String.format(
+ "[Notification] proxyAppPackageName: %s, protocolStack: %d"
+ + ", otherProtocolStackName: %s, requestor: %d, requestorId: %s"
+ + ", responseType: %d, inEmergencyMode: %b, isCachedLocation: %b",
+ mProxyAppPackageName, mProtocolStack, mOtherProtocolStackName,
+ mRequestor, mRequestorId, mResponseType, mInEmergencyMode, mIsCachedLocation);
+ }
+
+ String getResponseTypeAsString() {
+ switch (mResponseType) {
+ case NFW_RESPONSE_TYPE_REJECTED:
+ return "REJECTED";
+ case NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED:
+ return "ACCEPTED_NO_LOCATION_PROVIDED";
+ case NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED:
+ return "ACCEPTED_LOCATION_PROVIDED";
+ default:
+ return "<Unknown>";
+ }
+ }
+ }
+
+ private void handlePermissionsChanged(int uid) {
+ if (mProxyAppToLocationPermissions.isEmpty()) {
+ return;
+ }
+
+ for (Map.Entry<String, Boolean> entry : mProxyAppToLocationPermissions.entrySet()) {
+ // Cannot cache uid since the application could be uninstalled and reinstalled.
+ final String proxyApp = entry.getKey();
+ final Integer nfwProxyAppUid = getApplicationUid(proxyApp);
+ if (nfwProxyAppUid == null || nfwProxyAppUid != uid) {
+ continue;
+ }
+
+ final boolean isLocationPermissionEnabled = hasLocationPermission(proxyApp);
+ if (isLocationPermissionEnabled != entry.getValue()) {
+ Log.i(TAG, "Location permission setting is changed to "
+ + (isLocationPermissionEnabled ? "enabled" : "disabled")
+ + " for non-framework location access proxy app "
+ + proxyApp);
+ entry.setValue(isLocationPermissionEnabled);
+ updateNfwLocationAccessProxyAppsInGnssHal();
+ return;
+ }
+ }
+ }
+
+ private Integer getApplicationUid(String pkgName) {
+ try {
+ return mPackageManager.getApplicationInfo(pkgName, 0).uid;
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) {
+ Log.d(TAG, "Non-framework location access proxy app "
+ + pkgName + " is not found.");
+ }
+ return null;
+ }
+ }
+
+ private boolean hasLocationPermission(String pkgName) {
+ return mPackageManager.checkPermission(LOCATION_PERMISSION_NAME, pkgName)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ private void updateNfwLocationAccessProxyAppsInGnssHal() {
+ // Get a count of proxy apps with location permission enabled to array creation size.
+ int countLocationPermissionEnabledProxyApps = 0;
+ for (Boolean hasLocationPermissionEnabled : mProxyAppToLocationPermissions.values()) {
+ if (hasLocationPermissionEnabled) {
+ ++countLocationPermissionEnabledProxyApps;
+ }
+ }
+
+ int i = 0;
+ String[] locationPermissionEnabledProxyApps =
+ new String[countLocationPermissionEnabledProxyApps];
+ for (Map.Entry<String, Boolean> entry : mProxyAppToLocationPermissions.entrySet()) {
+ final String proxyApp = entry.getKey();
+ final boolean hasLocationPermissionEnabled = entry.getValue();
+ if (hasLocationPermissionEnabled) {
+ locationPermissionEnabledProxyApps[i++] = proxyApp;
+ }
+ }
+
+ String proxyAppsStr = Arrays.toString(locationPermissionEnabledProxyApps);
+ Log.i(TAG, "Updating non-framework location access proxy apps in the GNSS HAL to: "
+ + proxyAppsStr);
+ boolean result = native_enable_nfw_location_access(locationPermissionEnabledProxyApps);
+ if (!result) {
+ Log.e(TAG, "Failed to update non-framework location access proxy apps in the"
+ + " GNSS HAL to: " + proxyAppsStr);
+ }
+ }
+
+ private void handleNfwNotification(NfwNotification nfwNotification) {
+ if (DEBUG) Log.d(TAG, nfwNotification.toString());
+
+ final String proxyAppPackageName = nfwNotification.mProxyAppPackageName;
+ Boolean isLocationPermissionEnabled = mProxyAppToLocationPermissions.get(
+ proxyAppPackageName);
+ boolean isLocationRequestAccepted =
+ nfwNotification.mResponseType != NfwNotification.NFW_RESPONSE_TYPE_REJECTED;
+ boolean isPermissionMismatched;
+ if (isLocationPermissionEnabled == null) {
+ isPermissionMismatched = isLocationRequestAccepted;
+ } else {
+ isPermissionMismatched = (isLocationPermissionEnabled != isLocationRequestAccepted);
+ }
+ logEvent(nfwNotification, isPermissionMismatched);
+
+ if (TextUtils.isEmpty(proxyAppPackageName)) {
+ Log.e(TAG, "ProxyAppPackageName field is not set. Not sending intent to proxy app for "
+ + nfwNotification);
+ return;
+ }
+
+ if (isLocationPermissionEnabled == null) {
+ // App is not in the configured list.
+ Log.e(TAG, "Could not find proxy app with name: " + proxyAppPackageName + " in the "
+ + "value specified for config parameter: "
+ + GnssConfiguration.CONFIG_NFW_PROXY_APPS + ". Not sending intent to proxy app"
+ + " for " + nfwNotification);
+ return;
+ }
+
+ // Send intent to non-framework location proxy app with notification information.
+ final Intent intent = new Intent(
+ proxyAppPackageName + NFW_INTENT_ACTION_NFW_LOCATION_ACCESS_SUFFIX);
+ final String proxAppActivityName =
+ proxyAppPackageName + NFW_PROXY_APP_PKG_ACTIVITY_NAME_SUFFIX;
+ intent.setClassName(proxyAppPackageName, proxAppActivityName);
+ intent.setType(NFW_INTENT_TYPE);
+ nfwNotification.copyFieldsToIntent(intent);
+
+ // Check if the proxy app is still installed.
+ final Integer clsAppUid = getApplicationUid(proxyAppPackageName);
+ if (clsAppUid == null || intent.resolveActivity(mPackageManager) == null) {
+ Log.i(TAG, "Proxy application " + proxyAppPackageName + " and/or activity "
+ + proxAppActivityName + " is not found. Not sending"
+ + " intent to proxy app for " + nfwNotification);
+ return;
+ }
+
+ // Display location icon attributed to this proxy app.
+ mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, clsAppUid, proxyAppPackageName);
+
+ // Log proxy app permission mismatch between framework and GNSS HAL.
+ if (isPermissionMismatched) {
+ Log.w(TAG, "Permission mismatch. Framework proxy app " + proxyAppPackageName
+ + " location permission is set to " + isLocationPermissionEnabled
+ + " but GNSS non-framework location access response type is "
+ + nfwNotification.getResponseTypeAsString() + " for " + nfwNotification);
+ }
+
+ // Notify proxy app.
+ try {
+ if (DEBUG) {
+ Log.d(TAG, "Sending non-framework location access notification intent: " + intent);
+ }
+ mContext.startActivityAsUser(intent, UserHandle.getUserHandleForUid(clsAppUid));
+ } catch (ActivityNotFoundException e) {
+ Log.w(TAG, "Activity not found. Failed to send non-framework location access"
+ + " notification intent to proxy app activity: " + proxAppActivityName);
+ }
+ }
+
+ private void logEvent(NfwNotification notification, boolean isPermissionMismatched) {
+ StatsLog.write(StatsLog.GNSS_NFW_NOTIFICATION_REPORTED,
+ notification.mProxyAppPackageName,
+ notification.mProtocolStack,
+ notification.mOtherProtocolStackName,
+ notification.mRequestor,
+ notification.mRequestorId,
+ notification.mResponseType,
+ notification.mInEmergencyMode,
+ notification.mIsCachedLocation,
+ isPermissionMismatched);
+ }
+
+ private void postEvent(Runnable event) {
+ // Hold a wake lock until this message is delivered.
+ // Note that this assumes the message will not be removed from the queue before
+ // it is handled (otherwise the wake lock would be leaked).
+ mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
+ if (!mHandler.post(runEventAndReleaseWakeLock(event))) {
+ mWakeLock.release();
+ }
+ }
+
+ private Runnable runEventAndReleaseWakeLock(Runnable event) {
+ return () -> {
+ try {
+ event.run();
+ } finally {
+ mWakeLock.release();
+ }
+ };
+ }
+
+ private native boolean native_enable_nfw_location_access(String[] proxyApps);
+}
diff --git a/services/core/java/com/android/server/location/LocationProviderProxy.java b/services/core/java/com/android/server/location/LocationProviderProxy.java
index dfcef70c8248..a6da8c5e7713 100644
--- a/services/core/java/com/android/server/location/LocationProviderProxy.java
+++ b/services/core/java/com/android/server/location/LocationProviderProxy.java
@@ -101,7 +101,7 @@ public class LocationProviderProxy extends AbstractLocationProvider {
private LocationProviderProxy(Context context, LocationProviderManager locationProviderManager,
String action, int overlaySwitchResId, int defaultServicePackageNameResId,
int initialPackageNamesResId) {
- super(locationProviderManager, false);
+ super(locationProviderManager);
mServiceWatcher = new ServiceWatcher(context, TAG, action, overlaySwitchResId,
defaultServicePackageNameResId, initialPackageNamesResId,
diff --git a/services/core/java/com/android/server/location/LocationRequestStatistics.java b/services/core/java/com/android/server/location/LocationRequestStatistics.java
index b7934d978bac..b7ccb26da64b 100644
--- a/services/core/java/com/android/server/location/LocationRequestStatistics.java
+++ b/services/core/java/com/android/server/location/LocationRequestStatistics.java
@@ -123,6 +123,9 @@ public class LocationRequestStatistics {
// in foreground.
private long mForegroundDurationMs;
+ // Time when package last went dormant (stopped requesting location)
+ private long mLastStopElapsedTimeMs;
+
private PackageStatistics() {
mInitialElapsedTimeMs = SystemClock.elapsedRealtime();
mNumActiveRequests = 0;
@@ -131,6 +134,7 @@ public class LocationRequestStatistics {
mSlowestIntervalMs = 0;
mForegroundDurationMs = 0;
mLastForegroundElapsedTimeMs = 0;
+ mLastStopElapsedTimeMs = 0;
}
private void startRequesting(long intervalMs) {
@@ -167,8 +171,8 @@ public class LocationRequestStatistics {
mNumActiveRequests--;
if (mNumActiveRequests == 0) {
- long lastDurationMs
- = SystemClock.elapsedRealtime() - mLastActivitationElapsedTimeMs;
+ mLastStopElapsedTimeMs = SystemClock.elapsedRealtime();
+ long lastDurationMs = mLastStopElapsedTimeMs - mLastActivitationElapsedTimeMs;
mTotalDurationMs += lastDurationMs;
updateForeground(false);
}
@@ -206,6 +210,13 @@ public class LocationRequestStatistics {
}
/**
+ * Returns the time since the last request stopped in ms.
+ */
+ public long getTimeSinceLastRequestStoppedMs() {
+ return SystemClock.elapsedRealtime() - mLastStopElapsedTimeMs;
+ }
+
+ /**
* Returns the fastest interval that has been tracked.
*/
public long getFastestIntervalMs() {
@@ -244,6 +255,10 @@ public class LocationRequestStatistics {
.append(" minutes");
if (isActive()) {
s.append(": Currently active");
+ } else {
+ s.append(": Last active ")
+ .append((getTimeSinceLastRequestStoppedMs() / 1000) / 60)
+ .append(" minutes ago");
}
return s.toString();
}
diff --git a/services/core/java/com/android/server/location/MockProvider.java b/services/core/java/com/android/server/location/MockProvider.java
index bfbebf74e93d..fe91c63e712b 100644
--- a/services/core/java/com/android/server/location/MockProvider.java
+++ b/services/core/java/com/android/server/location/MockProvider.java
@@ -43,7 +43,7 @@ public class MockProvider extends AbstractLocationProvider {
public MockProvider(
LocationProviderManager locationProviderManager, ProviderProperties properties) {
- super(locationProviderManager, true);
+ super(locationProviderManager);
mEnabled = true;
mLocation = null;
@@ -63,8 +63,11 @@ public class MockProvider extends AbstractLocationProvider {
/** Sets the location to report for this mock provider. */
public void setLocation(Location l) {
mLocation = new Location(l);
+ if (!mLocation.isFromMockProvider()) {
+ mLocation.setIsFromMockProvider(true);
+ }
if (mEnabled) {
- reportLocation(l);
+ reportLocation(mLocation);
}
}
diff --git a/services/core/java/com/android/server/location/PassiveProvider.java b/services/core/java/com/android/server/location/PassiveProvider.java
index 70d64b02e4b4..30260b2fe14c 100644
--- a/services/core/java/com/android/server/location/PassiveProvider.java
+++ b/services/core/java/com/android/server/location/PassiveProvider.java
@@ -43,11 +43,12 @@ public class PassiveProvider extends AbstractLocationProvider {
private boolean mReportLocation;
public PassiveProvider(LocationProviderManager locationProviderManager) {
- super(locationProviderManager, true);
+ super(locationProviderManager);
mReportLocation = false;
setProperties(PROPERTIES);
+ setEnabled(true);
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 1a620c9b923f..81a3de68a99c 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -21,10 +21,10 @@ import static android.Manifest.permission.READ_CONTACTS;
import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_ENABLED_KEY;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_HANDLE_KEY;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
import static com.android.internal.widget.LockPatternUtils.USER_FRP;
import static com.android.internal.widget.LockPatternUtils.frpCredentialEnabled;
import static com.android.internal.widget.LockPatternUtils.userOwnsFrpCredential;
@@ -81,9 +81,9 @@ import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
import android.security.keystore.UserNotAuthenticatedException;
import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.security.keystore.recovery.KeyChainSnapshot;
import android.service.gatekeeper.GateKeeperResponse;
import android.service.gatekeeper.IGateKeeperService;
import android.text.TextUtils;
@@ -109,9 +109,9 @@ import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.locksettings.LockSettingsStorage.CredentialHash;
import com.android.server.locksettings.LockSettingsStorage.PersistentData;
-import com.android.server.locksettings.recoverablekeystore.RecoverableKeyStoreManager;
import com.android.server.locksettings.SyntheticPasswordManager.AuthenticationResult;
import com.android.server.locksettings.SyntheticPasswordManager.AuthenticationToken;
+import com.android.server.locksettings.recoverablekeystore.RecoverableKeyStoreManager;
import com.android.server.wm.WindowManagerInternal;
import libcore.util.HexEncoding;
@@ -130,8 +130,8 @@ import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
-import java.util.Arrays;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -2162,11 +2162,24 @@ public class LockSettingsService extends ILockSettings.Stub {
}
@Override
- public @Nullable String importKey(@NonNull String alias, byte[] keyBytes) throws RemoteException {
+ public @Nullable String generateKeyWithMetadata(
+ @NonNull String alias, @Nullable byte[] metadata) throws RemoteException {
+ return mRecoverableKeyStoreManager.generateKeyWithMetadata(alias, metadata);
+ }
+
+ @Override
+ public @Nullable String importKey(@NonNull String alias, @NonNull byte[] keyBytes)
+ throws RemoteException {
return mRecoverableKeyStoreManager.importKey(alias, keyBytes);
}
@Override
+ public @Nullable String importKeyWithMetadata(@NonNull String alias, @NonNull byte[] keyBytes,
+ @Nullable byte[] metadata) throws RemoteException {
+ return mRecoverableKeyStoreManager.importKeyWithMetadata(alias, keyBytes, metadata);
+ }
+
+ @Override
public @Nullable String getKey(@NonNull String alias) throws RemoteException {
return mRecoverableKeyStoreManager.getKey(alias);
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index f1951b1e31b1..1f9b027be030 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -26,6 +26,7 @@ import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -258,9 +259,9 @@ public class KeySyncTask implements Runnable {
localLskfHash = hashCredentialsBySaltedSha256(salt, mCredential);
}
- Map<String, SecretKey> rawKeys;
+ Map<String, Pair<SecretKey, byte[]>> rawKeysWithMetadata;
try {
- rawKeys = getKeysToSync(recoveryAgentUid);
+ rawKeysWithMetadata = getKeysToSync(recoveryAgentUid);
} catch (GeneralSecurityException e) {
Log.e(TAG, "Failed to load recoverable keys for sync", e);
return;
@@ -278,7 +279,9 @@ public class KeySyncTask implements Runnable {
}
// Only include insecure key material for test
if (mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(rootCertAlias)) {
- rawKeys = mTestOnlyInsecureCertificateHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ rawKeysWithMetadata =
+ mTestOnlyInsecureCertificateHelper.keepOnlyWhitelistedInsecureKeys(
+ rawKeysWithMetadata);
}
SecretKey recoveryKey;
@@ -292,7 +295,7 @@ public class KeySyncTask implements Runnable {
Map<String, byte[]> encryptedApplicationKeys;
try {
encryptedApplicationKeys = KeySyncUtils.encryptKeysWithRecoveryKey(
- recoveryKey, rawKeys);
+ recoveryKey, rawKeysWithMetadata);
} catch (InvalidKeyException | NoSuchAlgorithmException e) {
Log.wtf(TAG,
"Should be impossible: could not encrypt application keys with random key",
@@ -356,7 +359,8 @@ public class KeySyncTask implements Runnable {
.setCounterId(counterId)
.setServerParams(vaultHandle)
.setKeyChainProtectionParams(metadataList)
- .setWrappedApplicationKeys(createApplicationKeyEntries(encryptedApplicationKeys))
+ .setWrappedApplicationKeys(
+ createApplicationKeyEntries(encryptedApplicationKeys, rawKeysWithMetadata))
.setEncryptedRecoveryKeyBlob(encryptedRecoveryKey);
try {
keyChainSnapshotBuilder.setTrustedHardwareCertPath(certPath);
@@ -405,7 +409,7 @@ public class KeySyncTask implements Runnable {
/**
* Returns all of the recoverable keys for the user.
*/
- private Map<String, SecretKey> getKeysToSync(int recoveryAgentUid)
+ private Map<String, Pair<SecretKey, byte[]>> getKeysToSync(int recoveryAgentUid)
throws InsecureUserException, KeyStoreException, UnrecoverableKeyException,
NoSuchAlgorithmException, NoSuchPaddingException, BadPlatformKeyException,
InvalidKeyException, InvalidAlgorithmParameterException, IOException {
@@ -521,12 +525,14 @@ public class KeySyncTask implements Runnable {
}
private static List<WrappedApplicationKey> createApplicationKeyEntries(
- Map<String, byte[]> encryptedApplicationKeys) {
+ Map<String, byte[]> encryptedApplicationKeys,
+ Map<String, Pair<SecretKey, byte[]>> originalKeysWithMetadata) {
ArrayList<WrappedApplicationKey> keyEntries = new ArrayList<>();
for (String alias : encryptedApplicationKeys.keySet()) {
keyEntries.add(new WrappedApplicationKey.Builder()
.setAlias(alias)
.setEncryptedKeyMaterial(encryptedApplicationKeys.get(alias))
+ .setMetadata(originalKeysWithMetadata.get(alias).second)
.build());
}
return keyEntries;
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
index 8e6f9cbbb260..24d575e27bdd 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
@@ -16,6 +16,9 @@
package com.android.server.locksettings.recoverablekeystore;
+import android.annotation.Nullable;
+import android.util.Pair;
+
import com.android.internal.annotations.VisibleForTesting;
import java.nio.ByteBuffer;
@@ -152,15 +155,28 @@ public class KeySyncUtils {
* @hide
*/
public static Map<String, byte[]> encryptKeysWithRecoveryKey(
- SecretKey recoveryKey, Map<String, SecretKey> keys)
+ SecretKey recoveryKey, Map<String, Pair<SecretKey, byte[]>> keys)
throws NoSuchAlgorithmException, InvalidKeyException {
HashMap<String, byte[]> encryptedKeys = new HashMap<>();
for (String alias : keys.keySet()) {
- SecretKey key = keys.get(alias);
+ SecretKey key = keys.get(alias).first;
+ byte[] metadata = keys.get(alias).second;
+ byte[] header;
+ if (metadata == null) {
+ header = ENCRYPTED_APPLICATION_KEY_HEADER;
+ } else {
+ // The provided metadata, if non-empty, will be bound to the authenticated
+ // encryption process of the key material. As a result, the ciphertext cannot be
+ // decrypted if a wrong metadata is provided during the recovery/decryption process.
+ // Note that Android P devices do not have the API to provide the optional metadata,
+ // so all the keys with non-empty metadata stored on Android Q+ devices cannot be
+ // recovered on Android P devices.
+ header = concat(ENCRYPTED_APPLICATION_KEY_HEADER, metadata);
+ }
byte[] encryptedKey = SecureBox.encrypt(
/*theirPublicKey=*/ null,
/*sharedSecret=*/ recoveryKey.getEncoded(),
- /*header=*/ ENCRYPTED_APPLICATION_KEY_HEADER,
+ /*header=*/ header,
/*payload=*/ key.getEncoded());
encryptedKeys.put(alias, encryptedKey);
}
@@ -257,12 +273,19 @@ public class KeySyncUtils {
* @throws AEADBadTagException if the message has been tampered with or was encrypted with a
* different key.
*/
- public static byte[] decryptApplicationKey(byte[] recoveryKey, byte[] encryptedApplicationKey)
+ public static byte[] decryptApplicationKey(byte[] recoveryKey, byte[] encryptedApplicationKey,
+ @Nullable byte[] applicationKeyMetadata)
throws NoSuchAlgorithmException, InvalidKeyException, AEADBadTagException {
+ byte[] header;
+ if (applicationKeyMetadata == null) {
+ header = ENCRYPTED_APPLICATION_KEY_HEADER;
+ } else {
+ header = concat(ENCRYPTED_APPLICATION_KEY_HEADER, applicationKeyMetadata);
+ }
return SecureBox.decrypt(
/*ourPrivateKey=*/ null,
/*sharedSecret=*/ recoveryKey,
- /*header=*/ ENCRYPTED_APPLICATION_KEY_HEADER,
+ /*header=*/ header,
/*encryptedPayload=*/ encryptedApplicationKey);
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
index c249468a80a7..1692e5cb9842 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
@@ -17,6 +17,8 @@
package com.android.server.locksettings.recoverablekeystore;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.util.Log;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
@@ -24,7 +26,6 @@ import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;
-import android.util.Log;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
@@ -84,6 +85,8 @@ public class RecoverableKeyGenerator {
* @param userId The user ID of the profile to which the calling app belongs.
* @param uid The uid of the application that will own the key.
* @param alias The alias by which the key will be known in the recoverable key store.
+ * @param metadata The optional metadata that will be authenticated (but unencrypted) together
+ * with the key material when the key is uploaded to cloud.
* @throws RecoverableKeyStorageException if there is some error persisting the key either to
* the database.
* @throws KeyStoreException if there is a KeyStore error wrapping the generated key.
@@ -92,12 +95,13 @@ public class RecoverableKeyGenerator {
* @hide
*/
public byte[] generateAndStoreKey(
- PlatformEncryptionKey platformKey, int userId, int uid, String alias)
+ PlatformEncryptionKey platformKey, int userId, int uid, String alias,
+ @Nullable byte[] metadata)
throws RecoverableKeyStorageException, KeyStoreException, InvalidKeyException {
mKeyGenerator.init(KEY_SIZE_BITS);
SecretKey key = mKeyGenerator.generateKey();
- WrappedKey wrappedKey = WrappedKey.fromSecretKey(platformKey, key);
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(platformKey, key, metadata);
long result = mDatabase.insertKey(userId, uid, alias, wrappedKey);
if (result == RESULT_CANNOT_INSERT_ROW) {
@@ -126,6 +130,8 @@ public class RecoverableKeyGenerator {
* @param uid The uid of the application that will own the key.
* @param alias The alias by which the key will be known in the recoverable key store.
* @param keyBytes The raw bytes of the AES key to be imported.
+ * @param metadata The optional metadata that will be authenticated (but unencrypted) together
+ * with the key material when the key is uploaded to cloud.
* @throws RecoverableKeyStorageException if there is some error persisting the key either to
* the database.
* @throws KeyStoreException if there is a KeyStore error wrapping the generated key.
@@ -135,11 +141,11 @@ public class RecoverableKeyGenerator {
*/
public void importKey(
@NonNull PlatformEncryptionKey platformKey, int userId, int uid, @NonNull String alias,
- @NonNull byte[] keyBytes)
+ @NonNull byte[] keyBytes, @Nullable byte[] metadata)
throws RecoverableKeyStorageException, KeyStoreException, InvalidKeyException {
SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM);
- WrappedKey wrappedKey = WrappedKey.fromSecretKey(platformKey, key);
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(platformKey, key, metadata);
long result = mDatabase.insertKey(userId, uid, alias, wrappedKey);
if (result == RESULT_CANNOT_INSERT_ROW) {
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index fc5184d1438f..ed864c0221c9 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -20,8 +20,8 @@ import static android.security.keystore.recovery.RecoveryController.ERROR_BAD_CE
import static android.security.keystore.recovery.RecoveryController.ERROR_DECRYPTION_FAILED;
import static android.security.keystore.recovery.RecoveryController.ERROR_DOWNGRADE_CERTIFICATE;
import static android.security.keystore.recovery.RecoveryController.ERROR_INSECURE_USER;
-import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_KEY_FORMAT;
import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
+import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_KEY_FORMAT;
import static android.security.keystore.recovery.RecoveryController.ERROR_NO_SNAPSHOT_PENDING;
import static android.security.keystore.recovery.RecoveryController.ERROR_SERVICE_INTERNAL_ERROR;
import static android.security.keystore.recovery.RecoveryController.ERROR_SESSION_EXPIRED;
@@ -35,12 +35,12 @@ import android.os.Binder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
+import android.security.KeyStore;
import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.RecoveryController;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.security.KeyStore;
import android.util.ArrayMap;
import android.util.Log;
@@ -59,7 +59,6 @@ import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnaps
import java.io.IOException;
import java.security.InvalidKeyException;
-import java.security.KeyFactory;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
@@ -70,7 +69,6 @@ import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -606,7 +604,8 @@ public class RecoverableKeyStoreManager {
try {
byte[] recoveryKey = decryptRecoveryKey(sessionEntry, encryptedRecoveryKey);
- Map<String, byte[]> keysByAlias = recoverApplicationKeys(recoveryKey, applicationKeys);
+ Map<String, byte[]> keysByAlias = recoverApplicationKeys(recoveryKey,
+ applicationKeys);
return importKeyMaterials(userId, uid, keysByAlias);
} catch (KeyStoreException e) {
throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
@@ -625,7 +624,8 @@ public class RecoverableKeyStoreManager {
* @throws KeyStoreException if an error occurs importing the key or getting the grant.
*/
private @NonNull Map<String, String> importKeyMaterials(
- int userId, int uid, Map<String, byte[]> keysByAlias) throws KeyStoreException {
+ int userId, int uid, Map<String, byte[]> keysByAlias)
+ throws KeyStoreException {
ArrayMap<String, String> grantAliasesByAlias = new ArrayMap<>(keysByAlias.size());
for (String alias : keysByAlias.keySet()) {
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, keysByAlias.get(alias));
@@ -674,9 +674,29 @@ public class RecoverableKeyStoreManager {
* Generates a key named {@code alias} in caller's namespace.
* The key is stored in system service keystore namespace.
*
+ * @param alias the alias provided by caller as a reference to the key.
* @return grant alias, which caller can use to access the key.
+ * @throws RemoteException if certain internal errors occur.
+ *
+ * @deprecated Use {@link #generateKeyWithMetadata(String, byte[])} instead.
*/
+ @Deprecated
public String generateKey(@NonNull String alias) throws RemoteException {
+ return generateKeyWithMetadata(alias, /*metadata=*/ null);
+ }
+
+ /**
+ * Generates a key named {@code alias} with the {@code metadata} in caller's namespace.
+ * The key is stored in system service keystore namespace.
+ *
+ * @param alias the alias provided by caller as a reference to the key.
+ * @param metadata the optional metadata blob that will authenticated (but unencrypted) together
+ * with the key material when the key is uploaded to cloud.
+ * @return grant alias, which caller can use to access the key.
+ * @throws RemoteException if certain internal errors occur.
+ */
+ public String generateKeyWithMetadata(@NonNull String alias, @Nullable byte[] metadata)
+ throws RemoteException {
checkRecoverKeyStorePermission();
Preconditions.checkNotNull(alias, "alias is null");
int uid = Binder.getCallingUid();
@@ -695,8 +715,8 @@ public class RecoverableKeyStoreManager {
}
try {
- byte[] secretKey =
- mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias);
+ byte[] secretKey = mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId,
+ uid, alias, metadata);
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey);
return getAlias(userId, uid, alias);
} catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
@@ -713,10 +733,30 @@ public class RecoverableKeyStoreManager {
* @return grant alias, which caller can use to access the key.
* @throws RemoteException if the given key is invalid or some internal errors occur.
*
+ * @deprecated Use {{@link #importKeyWithMetadata(String, byte[], byte[])}} instead.
+ *
* @hide
*/
+ @Deprecated
public @Nullable String importKey(@NonNull String alias, @NonNull byte[] keyBytes)
throws RemoteException {
+ return importKeyWithMetadata(alias, keyBytes, /*metadata=*/ null);
+ }
+
+ /**
+ * Imports a 256-bit AES-GCM key named {@code alias} with the given {@code metadata}. The key is
+ * stored in system service keystore namespace.
+ *
+ * @param alias the alias provided by caller as a reference to the key.
+ * @param keyBytes the raw bytes of the 256-bit AES key.
+ * @param metadata the metadata to be authenticated (but unencrypted) together with the key.
+ * @return grant alias, which caller can use to access the key.
+ * @throws RemoteException if the given key is invalid or some internal errors occur.
+ *
+ * @hide
+ */
+ public @Nullable String importKeyWithMetadata(@NonNull String alias, @NonNull byte[] keyBytes,
+ @Nullable byte[] metadata) throws RemoteException {
checkRecoverKeyStorePermission();
Preconditions.checkNotNull(alias, "alias is null");
Preconditions.checkNotNull(keyBytes, "keyBytes is null");
@@ -745,7 +785,8 @@ public class RecoverableKeyStoreManager {
try {
// Wrap the key by the platform key and store the wrapped key locally
- mRecoverableKeyGenerator.importKey(encryptionKey, userId, uid, alias, keyBytes);
+ mRecoverableKeyGenerator.importKey(encryptionKey, userId, uid, alias, keyBytes,
+ metadata);
// Import the key to Android KeyStore and get grant
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, keyBytes);
@@ -812,17 +853,17 @@ public class RecoverableKeyStoreManager {
* @return Map from alias to raw key material.
* @throws RemoteException if an error occurred decrypting the keys.
*/
- private @NonNull Map<String, byte[]> recoverApplicationKeys(
- @NonNull byte[] recoveryKey,
+ private @NonNull Map<String, byte[]> recoverApplicationKeys(@NonNull byte[] recoveryKey,
@NonNull List<WrappedApplicationKey> applicationKeys) throws RemoteException {
HashMap<String, byte[]> keyMaterialByAlias = new HashMap<>();
for (WrappedApplicationKey applicationKey : applicationKeys) {
String alias = applicationKey.getAlias();
byte[] encryptedKeyMaterial = applicationKey.getEncryptedKeyMaterial();
+ byte[] keyMetadata = applicationKey.getMetadata();
try {
- byte[] keyMaterial =
- KeySyncUtils.decryptApplicationKey(recoveryKey, encryptedKeyMaterial);
+ byte[] keyMaterial = KeySyncUtils.decryptApplicationKey(recoveryKey,
+ encryptedKeyMaterial, keyMetadata);
keyMaterialByAlias.put(alias, keyMaterial);
} catch (NoSuchAlgorithmException e) {
Log.wtf(TAG, "Missing SecureBox algorithm. AOSP required to support this.", e);
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java
index 5ba3cceec6d0..057429c3e7d4 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java
@@ -18,17 +18,20 @@ package com.android.server.locksettings.recoverablekeystore;
import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
-import com.android.internal.widget.LockPatternUtils;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.security.keystore.recovery.TrustedRootCertificates;
import android.util.Log;
+import android.util.Pair;
+
+import com.android.internal.widget.LockPatternUtils;
-import java.util.HashMap;
import java.security.cert.X509Certificate;
+import java.util.HashMap;
import java.util.Map;
+
import javax.crypto.SecretKey;
/**
@@ -90,16 +93,18 @@ public class TestOnlyInsecureCertificateHelper {
&& credential.startsWith(TrustedRootCertificates.INSECURE_PASSWORD_PREFIX);
}
- public Map<String, SecretKey> keepOnlyWhitelistedInsecureKeys(Map<String, SecretKey> rawKeys) {
+ public Map<String, Pair<SecretKey, byte[]>> keepOnlyWhitelistedInsecureKeys(
+ Map<String, Pair<SecretKey, byte[]>> rawKeys) {
if (rawKeys == null) {
return null;
}
- Map<String, SecretKey> filteredKeys = new HashMap<>();
- for (Map.Entry<String, SecretKey> entry : rawKeys.entrySet()) {
+ Map<String, Pair<SecretKey, byte[]>> filteredKeys = new HashMap<>();
+ for (Map.Entry<String, Pair<SecretKey, byte[]>> entry : rawKeys.entrySet()) {
String alias = entry.getKey();
if (alias != null
&& alias.startsWith(TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX)) {
- filteredKeys.put(entry.getKey(), entry.getValue());
+ filteredKeys.put(entry.getKey(),
+ Pair.create(entry.getValue().first, entry.getValue().second));
Log.d(TAG, "adding key with insecure alias " + alias + " to the recovery snapshot");
}
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
index 0077242b412a..09d7541102b5 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
@@ -16,8 +16,10 @@
package com.android.server.locksettings.recoverablekeystore;
+import android.annotation.Nullable;
import android.security.keystore.recovery.RecoveryController;
import android.util.Log;
+import android.util.Pair;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
@@ -49,6 +51,7 @@ public class WrappedKey {
private final int mRecoveryStatus;
private final byte[] mNonce;
private final byte[] mKeyMaterial;
+ private final byte[] mKeyMetadata;
/**
* Returns a wrapped form of {@code key}, using {@code wrappingKey} to encrypt the key material.
@@ -58,7 +61,8 @@ public class WrappedKey {
* {@link android.security.keystore.AndroidKeyStoreKey} for an example of a key that does
* not expose its key material.
*/
- public static WrappedKey fromSecretKey(PlatformEncryptionKey wrappingKey, SecretKey key)
+ public static WrappedKey fromSecretKey(PlatformEncryptionKey wrappingKey, SecretKey key,
+ @Nullable byte[] metadata)
throws InvalidKeyException, KeyStoreException {
if (key.getEncoded() == null) {
throw new InvalidKeyException(
@@ -96,6 +100,7 @@ public class WrappedKey {
return new WrappedKey(
/*nonce=*/ cipher.getIV(),
/*keyMaterial=*/ encryptedKeyMaterial,
+ /*keyMetadata=*/ metadata,
/*platformKeyGenerationId=*/ wrappingKey.getGenerationId(),
RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
}
@@ -110,11 +115,10 @@ public class WrappedKey {
* @see RecoveryController#RECOVERY_STATUS_SYNC_IN_PROGRESS
* @hide
*/
- public WrappedKey(byte[] nonce, byte[] keyMaterial, int platformKeyGenerationId) {
- mNonce = nonce;
- mKeyMaterial = keyMaterial;
- mPlatformKeyGenerationId = platformKeyGenerationId;
- mRecoveryStatus = RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS;
+ public WrappedKey(byte[] nonce, byte[] keyMaterial, @Nullable byte[] keyMetadata,
+ int platformKeyGenerationId) {
+ this(nonce, keyMaterial, keyMetadata, platformKeyGenerationId,
+ RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
}
/**
@@ -122,15 +126,18 @@ public class WrappedKey {
*
* @param nonce The nonce with which the key material was encrypted.
* @param keyMaterial The encrypted bytes of the key material.
+ * @param keyMetadata The metadata that will be authenticated (but unencrypted) together with
+ * the key material when the key is uploaded to cloud.
* @param platformKeyGenerationId The generation ID of the key used to wrap this key.
* @param recoveryStatus recovery status of the key.
*
* @hide
*/
- public WrappedKey(byte[] nonce, byte[] keyMaterial, int platformKeyGenerationId,
- int recoveryStatus) {
+ public WrappedKey(byte[] nonce, byte[] keyMaterial, @Nullable byte[] keyMetadata,
+ int platformKeyGenerationId, int recoveryStatus) {
mNonce = nonce;
mKeyMaterial = keyMaterial;
+ mKeyMetadata = keyMetadata;
mPlatformKeyGenerationId = platformKeyGenerationId;
mRecoveryStatus = recoveryStatus;
}
@@ -154,6 +161,15 @@ public class WrappedKey {
}
/**
+ * Returns the key metadata.
+ *
+ * @hide
+ */
+ public @Nullable byte[] getKeyMetadata() {
+ return mKeyMetadata;
+ }
+
+ /**
* Returns the generation ID of the platform key, with which this key was wrapped.
*
* @hide
@@ -181,12 +197,12 @@ public class WrappedKey {
*
* @hide
*/
- public static Map<String, SecretKey> unwrapKeys(
+ public static Map<String, Pair<SecretKey, byte[]>> unwrapKeys(
PlatformDecryptionKey platformKey,
Map<String, WrappedKey> wrappedKeys)
throws NoSuchAlgorithmException, NoSuchPaddingException, BadPlatformKeyException,
InvalidKeyException, InvalidAlgorithmParameterException {
- HashMap<String, SecretKey> unwrappedKeys = new HashMap<>();
+ HashMap<String, Pair<SecretKey, byte[]>> unwrappedKeys = new HashMap<>();
Cipher cipher = Cipher.getInstance(KEY_WRAP_CIPHER_ALGORITHM);
int platformKeyGenerationId = platformKey.getGenerationId();
@@ -219,7 +235,7 @@ public class WrappedKey {
e);
continue;
}
- unwrappedKeys.put(alias, key);
+ unwrappedKeys.put(alias, Pair.create(key, wrappedKey.getKeyMetadata()));
}
return unwrappedKeys;
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java
index b486834235dc..8a19d62de0b9 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java
@@ -23,19 +23,18 @@ import static com.android.server.locksettings.recoverablekeystore.serialization.
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALIAS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEY;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEYS;
-
-import static com.android.server.locksettings.recoverablekeystore.serialization
- .KeyChainSnapshotSchema.TAG_BACKEND_PUBLIC_KEY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_BACKEND_PUBLIC_KEY;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_COUNTER_ID;
-import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_SNAPSHOT;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_DERIVATION_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_METADATA;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_LOCK_SCREEN_UI_TYPE;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MAX_ATTEMPTS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MEMORY_DIFFICULTY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SALT;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SERVER_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SNAPSHOT_VERSION;
@@ -49,6 +48,9 @@ import android.security.keystore.recovery.WrappedApplicationKey;
import android.util.Base64;
import android.util.Xml;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -59,9 +61,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
/**
* Deserializes a {@link android.security.keystore.recovery.KeyChainSnapshot} instance from XML.
*/
@@ -191,6 +190,10 @@ public class KeyChainSnapshotDeserializer {
builder.setEncryptedKeyMaterial(readBlobTag(parser, TAG_KEY_MATERIAL));
break;
+ case TAG_KEY_METADATA:
+ builder.setMetadata(readBlobTag(parser, TAG_KEY_METADATA));
+ break;
+
default:
throw new KeyChainSnapshotParserException(String.format(
Locale.US, "Unexpected tag %s in wrappedApplicationKey", name));
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java
index 0f2c2fc6c959..8f85a27d4690 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java
@@ -52,6 +52,7 @@ class KeyChainSnapshotSchema {
static final String TAG_APPLICATION_KEY = "applicationKey";
static final String TAG_ALIAS = "alias";
static final String TAG_KEY_MATERIAL = "keyMaterial";
+ static final String TAG_KEY_METADATA = "keyMetadata";
// Statics only
private KeyChainSnapshotSchema() {}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java
index 235df698a674..527e879a198b 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java
@@ -24,25 +24,24 @@ import static com.android.server.locksettings.recoverablekeystore.serialization.
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALIAS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEY;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEYS;
-
-import static com.android.server.locksettings.recoverablekeystore.serialization
- .KeyChainSnapshotSchema.TAG_BACKEND_PUBLIC_KEY;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_COUNTER_ID;
-import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_SNAPSHOT;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_DERIVATION_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_METADATA;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_LOCK_SCREEN_UI_TYPE;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MAX_ATTEMPTS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MEMORY_DIFFICULTY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SALT;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SERVER_PARAMS;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SNAPSHOT_VERSION;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_TRUSTED_HARDWARE_CERT_PATH;
import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_USER_SECRET_TYPE;
+import android.annotation.Nullable;
import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.KeyDerivationParams;
@@ -103,6 +102,7 @@ public class KeyChainSnapshotSerializer {
XmlSerializer xmlSerializer, WrappedApplicationKey applicationKey) throws IOException {
writePropertyTag(xmlSerializer, TAG_ALIAS, applicationKey.getAlias());
writePropertyTag(xmlSerializer, TAG_KEY_MATERIAL, applicationKey.getEncryptedKeyMaterial());
+ writePropertyTag(xmlSerializer, TAG_KEY_METADATA, applicationKey.getMetadata());
}
private static void writeKeyChainProtectionParams(
@@ -181,8 +181,11 @@ public class KeyChainSnapshotSerializer {
}
private static void writePropertyTag(
- XmlSerializer xmlSerializer, String propertyName, byte[] propertyValue)
+ XmlSerializer xmlSerializer, String propertyName, @Nullable byte[] propertyValue)
throws IOException {
+ if (propertyValue == null) {
+ return;
+ }
xmlSerializer.startTag(NAMESPACE, propertyName);
xmlSerializer.text(Base64.encodeToString(propertyValue, /*flags=*/ Base64.DEFAULT));
xmlSerializer.endTag(NAMESPACE, propertyName);
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
index e69f73df0184..dffaffe677ad 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
@@ -104,6 +104,12 @@ public class RecoverableKeyStoreDb {
values.put(KeysEntry.COLUMN_NAME_LAST_SYNCED_AT, LAST_SYNCED_AT_UNSYNCED);
values.put(KeysEntry.COLUMN_NAME_GENERATION_ID, wrappedKey.getPlatformKeyGenerationId());
values.put(KeysEntry.COLUMN_NAME_RECOVERY_STATUS, wrappedKey.getRecoveryStatus());
+ byte[] keyMetadata = wrappedKey.getKeyMetadata();
+ if (keyMetadata == null) {
+ values.putNull(KeysEntry.COLUMN_NAME_KEY_METADATA);
+ } else {
+ values.put(KeysEntry.COLUMN_NAME_KEY_METADATA, keyMetadata);
+ }
return db.replace(KeysEntry.TABLE_NAME, /*nullColumnHack=*/ null, values);
}
@@ -119,7 +125,8 @@ public class RecoverableKeyStoreDb {
KeysEntry.COLUMN_NAME_NONCE,
KeysEntry.COLUMN_NAME_WRAPPED_KEY,
KeysEntry.COLUMN_NAME_GENERATION_ID,
- KeysEntry.COLUMN_NAME_RECOVERY_STATUS};
+ KeysEntry.COLUMN_NAME_RECOVERY_STATUS,
+ KeysEntry.COLUMN_NAME_KEY_METADATA};
String selection =
KeysEntry.COLUMN_NAME_UID + " = ? AND "
+ KeysEntry.COLUMN_NAME_ALIAS + " = ?";
@@ -155,7 +162,17 @@ public class RecoverableKeyStoreDb {
cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_GENERATION_ID));
int recoveryStatus = cursor.getInt(
cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_RECOVERY_STATUS));
- return new WrappedKey(nonce, keyMaterial, generationId, recoveryStatus);
+
+ // Retrieve the metadata associated with the key
+ byte[] keyMetadata;
+ int metadataIdx = cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_KEY_METADATA);
+ if (cursor.isNull(metadataIdx)) {
+ keyMetadata = null;
+ } else {
+ keyMetadata = cursor.getBlob(metadataIdx);
+ }
+
+ return new WrappedKey(nonce, keyMaterial, keyMetadata, generationId, recoveryStatus);
}
}
@@ -252,7 +269,8 @@ public class RecoverableKeyStoreDb {
KeysEntry.COLUMN_NAME_NONCE,
KeysEntry.COLUMN_NAME_WRAPPED_KEY,
KeysEntry.COLUMN_NAME_ALIAS,
- KeysEntry.COLUMN_NAME_RECOVERY_STATUS};
+ KeysEntry.COLUMN_NAME_RECOVERY_STATUS,
+ KeysEntry.COLUMN_NAME_KEY_METADATA};
String selection =
KeysEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ KeysEntry.COLUMN_NAME_UID + " = ? AND "
@@ -283,8 +301,18 @@ public class RecoverableKeyStoreDb {
cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_ALIAS));
int recoveryStatus = cursor.getInt(
cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_RECOVERY_STATUS));
- keys.put(alias, new WrappedKey(nonce, keyMaterial, platformKeyGenerationId,
- recoveryStatus));
+
+ // Retrieve the metadata associated with the key
+ byte[] keyMetadata;
+ int metadataIdx = cursor.getColumnIndexOrThrow(KeysEntry.COLUMN_NAME_KEY_METADATA);
+ if (cursor.isNull(metadataIdx)) {
+ keyMetadata = null;
+ } else {
+ keyMetadata = cursor.getBlob(metadataIdx);
+ }
+
+ keys.put(alias, new WrappedKey(nonce, keyMaterial, keyMetadata,
+ platformKeyGenerationId, recoveryStatus));
}
return keys;
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
index 22e77cc79831..b58ee4bc9d74 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
@@ -67,6 +67,12 @@ class RecoverableKeyStoreDbContract {
* Status of the key sync {@code RecoveryController#setRecoveryStatus}
*/
static final String COLUMN_NAME_RECOVERY_STATUS = "recovery_status";
+
+ /**
+ * Data blob that will be authenticated (but encrypted) together with the key when the key
+ * is uploaded to cloud.
+ */
+ static final String COLUMN_NAME_KEY_METADATA = "key_metadata";
}
/**
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
index 43efe9cc0cbb..b0613da35d28 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
@@ -32,7 +32,7 @@ import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKe
class RecoverableKeyStoreDbHelper extends SQLiteOpenHelper {
private static final String TAG = "RecoverableKeyStoreDbHp";
- static final int DATABASE_VERSION = 4;
+ static final int DATABASE_VERSION = 5;
private static final String DATABASE_NAME = "recoverablekeystore.db";
private static final String SQL_CREATE_KEYS_ENTRY =
@@ -46,6 +46,7 @@ class RecoverableKeyStoreDbHelper extends SQLiteOpenHelper {
+ KeysEntry.COLUMN_NAME_GENERATION_ID + " INTEGER,"
+ KeysEntry.COLUMN_NAME_LAST_SYNCED_AT + " INTEGER,"
+ KeysEntry.COLUMN_NAME_RECOVERY_STATUS + " INTEGER,"
+ + KeysEntry.COLUMN_NAME_KEY_METADATA + " BLOB,"
+ "UNIQUE(" + KeysEntry.COLUMN_NAME_UID + ","
+ KeysEntry.COLUMN_NAME_ALIAS + "))";
@@ -135,6 +136,11 @@ class RecoverableKeyStoreDbHelper extends SQLiteOpenHelper {
oldVersion = 4;
}
+ if (oldVersion < 5 && newVersion >= 5) {
+ upgradeDbForVersion5(db);
+ oldVersion = 5;
+ }
+
if (oldVersion != newVersion) {
Log.e(TAG, "Failed to update recoverablekeystore database to the most recent version");
}
@@ -166,6 +172,13 @@ class RecoverableKeyStoreDbHelper extends SQLiteOpenHelper {
/*defaultStr=*/ null);
}
+ private void upgradeDbForVersion5(SQLiteDatabase db) {
+ Log.d(TAG, "Updating recoverable keystore database to version 5");
+ // adds a column to store the metadata for application keys
+ addColumnToTable(db, KeysEntry.TABLE_NAME,
+ KeysEntry.COLUMN_NAME_KEY_METADATA, "BLOB", /*defaultStr=*/ null);
+ }
+
private static void addColumnToTable(
SQLiteDatabase db, String tableName, String column, String columnType,
String defaultStr) {
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 139d8ac6a8d5..7fffe8eb402a 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -19,7 +19,6 @@ package com.android.server.media;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioManagerInternal;
@@ -27,15 +26,15 @@ import android.media.AudioSystem;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.VolumeProvider;
+import android.media.session.ControllerCallbackLink;
import android.media.session.ISession;
-import android.media.session.ISessionCallback;
import android.media.session.ISessionController;
-import android.media.session.ISessionControllerCallback;
import android.media.session.MediaController;
import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaSession;
-import android.media.session.ParcelableVolumeInfo;
+import android.media.session.MediaSession.QueueItem;
import android.media.session.PlaybackState;
+import android.media.session.SessionCallbackLink;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
@@ -45,7 +44,6 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
-import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemClock;
import android.util.Log;
@@ -56,6 +54,7 @@ import com.android.server.LocalServices;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
/**
* This is the system implementation of a Session. Apps will interact with the
@@ -81,11 +80,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
private final ControllerStub mController;
private final SessionStub mSession;
private final SessionCb mSessionCb;
- private final MediaSessionService mService;
+ private final MediaSessionService.ServiceImpl mService;
private final Context mContext;
private final Object mLock = new Object();
- private final ArrayList<ISessionControllerCallbackHolder> mControllerCallbackHolders =
+ private final ArrayList<ControllerCallbackLinkHolder> mControllerCallbackHolders =
new ArrayList<>();
private long mFlags;
@@ -98,7 +97,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
// may result in throwing an exception.
private MediaMetadata mMetadata;
private PlaybackState mPlaybackState;
- private ParceledListSlice mQueue;
+ private List<QueueItem> mQueue;
private CharSequence mQueueTitle;
private int mRatingType;
// End TransportPerformer fields
@@ -117,11 +116,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
private boolean mIsActive = false;
private boolean mDestroyed = false;
- private long mDuration;
+ private long mDuration = -1;
private String mMetadataDescription;
public MediaSessionRecord(int ownerPid, int ownerUid, int userId, String ownerPackageName,
- ISessionCallback cb, String tag, MediaSessionService service, Looper handlerLooper) {
+ SessionCallbackLink cb, String tag, MediaSessionService.ServiceImpl service,
+ Looper handlerLooper) {
mOwnerPid = ownerPid;
mOwnerUid = ownerUid;
mUserId = userId;
@@ -250,7 +250,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
* @param useSuggested True to use adjustSuggestedStreamVolume instead of
*/
public void adjustVolume(String packageName, String opPackageName, int pid, int uid,
- ISessionControllerCallback caller, boolean asSystemService, int direction, int flags,
+ ControllerCallbackLink caller, boolean asSystemService, int direction, int flags,
boolean useSuggested) {
int previousFlagPlaySound = flags & AudioManager.FLAG_PLAY_SOUND;
if (isPlaybackActive() || hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY)) {
@@ -292,7 +292,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
private void setVolumeTo(String packageName, String opPackageName, int pid, int uid,
- ISessionControllerCallback caller, int value, int flags) {
+ ControllerCallbackLink caller, int value, int flags) {
if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
final int volumeValue = value;
@@ -441,7 +441,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
}
- public ISessionCallback getCallback() {
+ public SessionCallbackLink getCallback() {
return mSessionCb.mCb;
}
@@ -469,7 +469,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
+ ", max=" + mMaxVolume + ", current=" + mCurrentVolume);
pw.println(indent + "metadata: " + mMetadataDescription);
pw.println(indent + "queueTitle=" + mQueueTitle + ", size="
- + (mQueue == null ? 0 : mQueue.getList().size()));
+ + (mQueue == null ? 0 : mQueue.size()));
}
@Override
@@ -519,7 +519,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
private void logCallbackException(
- String msg, ISessionControllerCallbackHolder holder, Exception e) {
+ String msg, ControllerCallbackLinkHolder holder, Exception e) {
Log.v(TAG, msg + ", this=" + this + ", callback package=" + holder.mPackageName
+ ", exception=" + e);
}
@@ -530,16 +530,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onPlaybackStateChanged(mPlaybackState);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removed dead callback in pushPlaybackStateUpdate",
- holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushPlaybackStateUpdate",
- holder, e);
+ holder.mCallback.notifyPlaybackStateChanged(mPlaybackState);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushPlaybackStateUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushPlaybackStateUpdate",
+ holder, e);
+ }
}
}
}
@@ -551,14 +553,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onMetadataChanged(mMetadata);
- } catch (DeadObjectException e) {
- logCallbackException("Removing dead callback in pushMetadataUpdate", holder, e);
- mControllerCallbackHolders.remove(i);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushMetadataUpdate", holder, e);
+ holder.mCallback.notifyMetadataChanged(mMetadata);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushMetadataUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushMetadataUpdate",
+ holder, e);
+ }
}
}
}
@@ -570,14 +576,17 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onQueueChanged(mQueue);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removed dead callback in pushQueueUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushQueueUpdate", holder, e);
+ holder.mCallback.notifyQueueChanged(mQueue);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushQueueUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushQueueUpdate", holder, e);
+ }
}
}
}
@@ -589,16 +598,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onQueueTitleChanged(mQueueTitle);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removed dead callback in pushQueueTitleUpdate",
- holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushQueueTitleUpdate",
- holder, e);
+ holder.mCallback.notifyQueueTitleChanged(mQueueTitle);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushQueueTitleUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushQueueTitleUpdate",
+ holder, e);
+ }
}
}
}
@@ -610,14 +621,17 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onExtrasChanged(mExtras);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removed dead callback in pushExtrasUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushExtrasUpdate", holder, e);
+ holder.mCallback.notifyExtrasChanged(mExtras);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushExtrasUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushExtrasUpdate", holder, e);
+ }
}
}
}
@@ -628,16 +642,19 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
if (mDestroyed) {
return;
}
- ParcelableVolumeInfo info = mController.getVolumeAttributes();
+ PlaybackInfo info = mController.getVolumeAttributes();
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onVolumeInfoChanged(info);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removing dead callback in pushVolumeUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("Unexpected exception in pushVolumeUpdate", holder, e);
+ holder.mCallback.notifyVolumeInfoChanged(info);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushVolumeUpdate",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushVolumeUpdate", holder, e);
+ }
}
}
}
@@ -649,14 +666,16 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onEvent(event, data);
- } catch (DeadObjectException e) {
- mControllerCallbackHolders.remove(i);
- logCallbackException("Removing dead callback in pushEvent", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushEvent", holder, e);
+ holder.mCallback.notifyEvent(event, data);
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushEvent", holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushEvent", holder, e);
+ }
}
}
}
@@ -670,14 +689,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i);
+ ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i);
try {
- holder.mCallback.onSessionDestroyed();
- } catch (DeadObjectException e) {
- logCallbackException("Removing dead callback in pushEvent", holder, e);
- mControllerCallbackHolders.remove(i);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushEvent", holder, e);
+ holder.mCallback.notifySessionDestroyed();
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof DeadObjectException) {
+ mControllerCallbackHolders.remove(i);
+ logCallbackException("Removing dead callback in pushSessionDestroyed",
+ holder, e);
+ } else {
+ logCallbackException("unexpected exception in pushSessionDestroyed",
+ holder, e);
+ }
}
}
// After notifying clear all listeners
@@ -717,10 +740,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return result == null ? state : result;
}
- private int getControllerHolderIndexForCb(ISessionControllerCallback cb) {
- IBinder binder = cb.asBinder();
+ private int getControllerHolderIndexForCb(ControllerCallbackLink cb) {
+ IBinder binder = cb.getBinder();
for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) {
- if (binder.equals(mControllerCallbackHolders.get(i).mCallback.asBinder())) {
+ if (binder.equals(mControllerCallbackHolders.get(i).mCallback.getBinder())) {
return i;
}
}
@@ -844,7 +867,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public void setQueue(ParceledListSlice queue) {
+ public void setQueue(List<QueueItem> queue) {
synchronized (mLock) {
mQueue = queue;
}
@@ -921,9 +944,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
class SessionCb {
- private final ISessionCallback mCb;
+ private final SessionCallbackLink mCb;
- public SessionCb(ISessionCallback cb) {
+ SessionCb(SessionCallbackLink cb) {
mCb = cb;
}
@@ -931,224 +954,224 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
boolean asSystemService, KeyEvent keyEvent, int sequenceId, ResultReceiver cb) {
try {
if (asSystemService) {
- mCb.onMediaButton(mContext.getPackageName(), Process.myPid(),
+ mCb.notifyMediaButton(mContext.getPackageName(), Process.myPid(),
Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), sequenceId, cb);
} else {
- mCb.onMediaButton(packageName, pid, uid,
+ mCb.notifyMediaButton(packageName, pid, uid,
createMediaButtonIntent(keyEvent), sequenceId, cb);
}
return true;
- } catch (RemoteException e) {
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in sendMediaRequest.", e);
}
return false;
}
public boolean sendMediaButton(String packageName, int pid, int uid,
- ISessionControllerCallback caller, boolean asSystemService,
+ ControllerCallbackLink caller, boolean asSystemService,
KeyEvent keyEvent) {
try {
if (asSystemService) {
- mCb.onMediaButton(mContext.getPackageName(), Process.myPid(),
+ mCb.notifyMediaButton(mContext.getPackageName(), Process.myPid(),
Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), 0, null);
} else {
- mCb.onMediaButtonFromController(packageName, pid, uid, caller,
+ mCb.notifyMediaButtonFromController(packageName, pid, uid, caller,
createMediaButtonIntent(keyEvent));
}
return true;
- } catch (RemoteException e) {
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in sendMediaRequest.", e);
}
return false;
}
public void sendCommand(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) {
+ ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
try {
- mCb.onCommand(packageName, pid, uid, caller, command, args, cb);
- } catch (RemoteException e) {
+ mCb.notifyCommand(packageName, pid, uid, caller, command, args, cb);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in sendCommand.", e);
}
}
public void sendCustomAction(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String action,
+ ControllerCallbackLink caller, String action,
Bundle args) {
try {
- mCb.onCustomAction(packageName, pid, uid, caller, action, args);
- } catch (RemoteException e) {
+ mCb.notifyCustomAction(packageName, pid, uid, caller, action, args);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in sendCustomAction.", e);
}
}
public void prepare(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
try {
- mCb.onPrepare(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyPrepare(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in prepare.", e);
}
}
public void prepareFromMediaId(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String mediaId, Bundle extras) {
+ ControllerCallbackLink caller, String mediaId, Bundle extras) {
try {
- mCb.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras);
- } catch (RemoteException e) {
+ mCb.notifyPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in prepareFromMediaId.", e);
}
}
public void prepareFromSearch(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String query, Bundle extras) {
+ ControllerCallbackLink caller, String query, Bundle extras) {
try {
- mCb.onPrepareFromSearch(packageName, pid, uid, caller, query, extras);
- } catch (RemoteException e) {
+ mCb.notifyPrepareFromSearch(packageName, pid, uid, caller, query, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in prepareFromSearch.", e);
}
}
public void prepareFromUri(String packageName, int pid, int uid,
- ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
try {
- mCb.onPrepareFromUri(packageName, pid, uid, caller, uri, extras);
- } catch (RemoteException e) {
+ mCb.notifyPrepareFromUri(packageName, pid, uid, caller, uri, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in prepareFromUri.", e);
}
}
- public void play(String packageName, int pid, int uid, ISessionControllerCallback caller) {
+ public void play(String packageName, int pid, int uid, ControllerCallbackLink caller) {
try {
- mCb.onPlay(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyPlay(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in play.", e);
}
}
public void playFromMediaId(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String mediaId, Bundle extras) {
+ ControllerCallbackLink caller, String mediaId, Bundle extras) {
try {
- mCb.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
- } catch (RemoteException e) {
+ mCb.notifyPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in playFromMediaId.", e);
}
}
public void playFromSearch(String packageName, int pid, int uid,
- ISessionControllerCallback caller, String query, Bundle extras) {
+ ControllerCallbackLink caller, String query, Bundle extras) {
try {
- mCb.onPlayFromSearch(packageName, pid, uid, caller, query, extras);
- } catch (RemoteException e) {
+ mCb.notifyPlayFromSearch(packageName, pid, uid, caller, query, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in playFromSearch.", e);
}
}
public void playFromUri(String packageName, int pid, int uid,
- ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ ControllerCallbackLink caller, Uri uri, Bundle extras) {
try {
- mCb.onPlayFromUri(packageName, pid, uid, caller, uri, extras);
- } catch (RemoteException e) {
+ mCb.notifyPlayFromUri(packageName, pid, uid, caller, uri, extras);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in playFromUri.", e);
}
}
public void skipToTrack(String packageName, int pid, int uid,
- ISessionControllerCallback caller, long id) {
+ ControllerCallbackLink caller, long id) {
try {
- mCb.onSkipToTrack(packageName, pid, uid, caller, id);
- } catch (RemoteException e) {
+ mCb.notifySkipToTrack(packageName, pid, uid, caller, id);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in skipToTrack", e);
}
}
- public void pause(String packageName, int pid, int uid, ISessionControllerCallback caller) {
+ public void pause(String packageName, int pid, int uid, ControllerCallbackLink caller) {
try {
- mCb.onPause(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyPause(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in pause.", e);
}
}
- public void stop(String packageName, int pid, int uid, ISessionControllerCallback caller) {
+ public void stop(String packageName, int pid, int uid, ControllerCallbackLink caller) {
try {
- mCb.onStop(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyStop(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in stop.", e);
}
}
- public void next(String packageName, int pid, int uid, ISessionControllerCallback caller) {
+ public void next(String packageName, int pid, int uid, ControllerCallbackLink caller) {
try {
- mCb.onNext(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyNext(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in next.", e);
}
}
public void previous(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
try {
- mCb.onPrevious(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyPrevious(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in previous.", e);
}
}
public void fastForward(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
try {
- mCb.onFastForward(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyFastForward(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in fastForward.", e);
}
}
public void rewind(String packageName, int pid, int uid,
- ISessionControllerCallback caller) {
+ ControllerCallbackLink caller) {
try {
- mCb.onRewind(packageName, pid, uid, caller);
- } catch (RemoteException e) {
+ mCb.notifyRewind(packageName, pid, uid, caller);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in rewind.", e);
}
}
- public void seekTo(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ public void seekTo(String packageName, int pid, int uid, ControllerCallbackLink caller,
long pos) {
try {
- mCb.onSeekTo(packageName, pid, uid, caller, pos);
- } catch (RemoteException e) {
+ mCb.notifySeekTo(packageName, pid, uid, caller, pos);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in seekTo.", e);
}
}
- public void rate(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ public void rate(String packageName, int pid, int uid, ControllerCallbackLink caller,
Rating rating) {
try {
- mCb.onRate(packageName, pid, uid, caller, rating);
- } catch (RemoteException e) {
+ mCb.notifyRate(packageName, pid, uid, caller, rating);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in rate.", e);
}
}
public void adjustVolume(String packageName, int pid, int uid,
- ISessionControllerCallback caller, boolean asSystemService, int direction) {
+ ControllerCallbackLink caller, boolean asSystemService, int direction) {
try {
if (asSystemService) {
- mCb.onAdjustVolume(mContext.getPackageName(), Process.myPid(),
+ mCb.notifyAdjustVolume(mContext.getPackageName(), Process.myPid(),
Process.SYSTEM_UID, null, direction);
} else {
- mCb.onAdjustVolume(packageName, pid, uid, caller, direction);
+ mCb.notifyAdjustVolume(packageName, pid, uid, caller, direction);
}
- } catch (RemoteException e) {
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in adjustVolume.", e);
}
}
public void setVolumeTo(String packageName, int pid, int uid,
- ISessionControllerCallback caller, int value) {
+ ControllerCallbackLink caller, int value) {
try {
- mCb.onSetVolumeTo(packageName, pid, uid, caller, value);
- } catch (RemoteException e) {
+ mCb.notifySetVolumeTo(packageName, pid, uid, caller, value);
+ } catch (RuntimeException e) {
Slog.e(TAG, "Remote failure in setVolumeTo.", e);
}
}
@@ -1162,34 +1185,34 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
class ControllerStub extends ISessionController.Stub {
@Override
- public void sendCommand(String packageName, ISessionControllerCallback caller,
+ public void sendCommand(String packageName, ControllerCallbackLink caller,
String command, Bundle args, ResultReceiver cb) {
mSessionCb.sendCommand(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, command, args, cb);
}
@Override
- public boolean sendMediaButton(String packageName, ISessionControllerCallback cb,
+ public boolean sendMediaButton(String packageName, ControllerCallbackLink cb,
boolean asSystemService, KeyEvent keyEvent) {
return mSessionCb.sendMediaButton(packageName, Binder.getCallingPid(),
Binder.getCallingUid(), cb, asSystemService, keyEvent);
}
@Override
- public void registerCallbackListener(String packageName, ISessionControllerCallback cb) {
+ public void registerCallbackListener(String packageName, ControllerCallbackLink cb) {
synchronized (mLock) {
// If this session is already destroyed tell the caller and
// don't add them.
if (mDestroyed) {
try {
- cb.onSessionDestroyed();
+ cb.notifySessionDestroyed();
} catch (Exception e) {
// ignored
}
return;
}
if (getControllerHolderIndexForCb(cb) < 0) {
- mControllerCallbackHolders.add(new ISessionControllerCallbackHolder(cb,
+ mControllerCallbackHolders.add(new ControllerCallbackLinkHolder(cb,
packageName, Binder.getCallingUid()));
if (DEBUG) {
Log.d(TAG, "registering controller callback " + cb + " from controller"
@@ -1200,14 +1223,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public void unregisterCallbackListener(ISessionControllerCallback cb) {
+ public void unregisterCallbackListener(ControllerCallbackLink cb) {
synchronized (mLock) {
int index = getControllerHolderIndexForCb(cb);
if (index != -1) {
mControllerCallbackHolders.remove(index);
}
if (DEBUG) {
- Log.d(TAG, "unregistering callback " + cb.asBinder());
+ Log.d(TAG, "unregistering callback " + cb.getBinder());
}
}
}
@@ -1233,14 +1256,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public ParcelableVolumeInfo getVolumeAttributes() {
+ public PlaybackInfo getVolumeAttributes() {
int volumeType;
AudioAttributes attributes;
synchronized (mLock) {
if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
int current = mOptimisticVolume != -1 ? mOptimisticVolume : mCurrentVolume;
- return new ParcelableVolumeInfo(
- mVolumeType, mAudioAttrs, mVolumeControlType, mMaxVolume, current);
+ return new PlaybackInfo(mVolumeType, mVolumeControlType, mMaxVolume, current,
+ mAudioAttrs);
}
volumeType = mVolumeType;
attributes = mAudioAttrs;
@@ -1248,13 +1271,13 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
int stream = AudioAttributes.toLegacyStreamType(attributes);
int max = mAudioManager.getStreamMaxVolume(stream);
int current = mAudioManager.getStreamVolume(stream);
- return new ParcelableVolumeInfo(
- volumeType, attributes, VolumeProvider.VOLUME_CONTROL_ABSOLUTE, max, current);
+ return new PlaybackInfo(volumeType, VolumeProvider.VOLUME_CONTROL_ABSOLUTE, max,
+ current, attributes);
}
@Override
public void adjustVolume(String packageName, String opPackageName,
- ISessionControllerCallback caller, boolean asSystemService, int direction,
+ ControllerCallbackLink caller, boolean asSystemService, int direction,
int flags) {
int pid = Binder.getCallingPid();
int uid = Binder.getCallingUid();
@@ -1269,7 +1292,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public void setVolumeTo(String packageName, String opPackageName,
- ISessionControllerCallback caller, int value, int flags) {
+ ControllerCallbackLink caller, int value, int flags) {
int pid = Binder.getCallingPid();
int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
@@ -1282,110 +1305,110 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public void prepare(String packageName, ISessionControllerCallback caller) {
+ public void prepare(String packageName, ControllerCallbackLink caller) {
mSessionCb.prepare(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void prepareFromMediaId(String packageName, ISessionControllerCallback caller,
+ public void prepareFromMediaId(String packageName, ControllerCallbackLink caller,
String mediaId, Bundle extras) {
mSessionCb.prepareFromMediaId(packageName, Binder.getCallingPid(),
Binder.getCallingUid(), caller, mediaId, extras);
}
@Override
- public void prepareFromSearch(String packageName, ISessionControllerCallback caller,
+ public void prepareFromSearch(String packageName, ControllerCallbackLink caller,
String query, Bundle extras) {
mSessionCb.prepareFromSearch(packageName, Binder.getCallingPid(),
Binder.getCallingUid(), caller, query, extras);
}
@Override
- public void prepareFromUri(String packageName, ISessionControllerCallback caller,
+ public void prepareFromUri(String packageName, ControllerCallbackLink caller,
Uri uri, Bundle extras) {
mSessionCb.prepareFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, uri, extras);
}
@Override
- public void play(String packageName, ISessionControllerCallback caller) {
+ public void play(String packageName, ControllerCallbackLink caller) {
mSessionCb.play(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void playFromMediaId(String packageName, ISessionControllerCallback caller,
+ public void playFromMediaId(String packageName, ControllerCallbackLink caller,
String mediaId, Bundle extras) {
mSessionCb.playFromMediaId(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, mediaId, extras);
}
@Override
- public void playFromSearch(String packageName, ISessionControllerCallback caller,
+ public void playFromSearch(String packageName, ControllerCallbackLink caller,
String query, Bundle extras) {
mSessionCb.playFromSearch(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, query, extras);
}
@Override
- public void playFromUri(String packageName, ISessionControllerCallback caller,
+ public void playFromUri(String packageName, ControllerCallbackLink caller,
Uri uri, Bundle extras) {
mSessionCb.playFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, uri, extras);
}
@Override
- public void skipToQueueItem(String packageName, ISessionControllerCallback caller,
+ public void skipToQueueItem(String packageName, ControllerCallbackLink caller,
long id) {
mSessionCb.skipToTrack(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, id);
}
@Override
- public void pause(String packageName, ISessionControllerCallback caller) {
+ public void pause(String packageName, ControllerCallbackLink caller) {
mSessionCb.pause(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void stop(String packageName, ISessionControllerCallback caller) {
+ public void stop(String packageName, ControllerCallbackLink caller) {
mSessionCb.stop(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void next(String packageName, ISessionControllerCallback caller) {
+ public void next(String packageName, ControllerCallbackLink caller) {
mSessionCb.next(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void previous(String packageName, ISessionControllerCallback caller) {
+ public void previous(String packageName, ControllerCallbackLink caller) {
mSessionCb.previous(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller);
}
@Override
- public void fastForward(String packageName, ISessionControllerCallback caller) {
+ public void fastForward(String packageName, ControllerCallbackLink caller) {
mSessionCb.fastForward(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller);
}
@Override
- public void rewind(String packageName, ISessionControllerCallback caller) {
+ public void rewind(String packageName, ControllerCallbackLink caller) {
mSessionCb.rewind(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller);
}
@Override
- public void seekTo(String packageName, ISessionControllerCallback caller, long pos) {
+ public void seekTo(String packageName, ControllerCallbackLink caller, long pos) {
mSessionCb.seekTo(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller,
pos);
}
@Override
- public void rate(String packageName, ISessionControllerCallback caller, Rating rating) {
+ public void rate(String packageName, ControllerCallbackLink caller, Rating rating) {
mSessionCb.rate(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller,
rating);
}
@Override
- public void sendCustomAction(String packageName, ISessionControllerCallback caller,
+ public void sendCustomAction(String packageName, ControllerCallbackLink caller,
String action, Bundle args) {
mSessionCb.sendCustomAction(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
caller, action, args);
@@ -1404,7 +1427,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public ParceledListSlice getQueue() {
+ public List<QueueItem> getQueue() {
synchronized (mLock) {
return mQueue;
}
@@ -1433,12 +1456,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
}
- private class ISessionControllerCallbackHolder {
- private final ISessionControllerCallback mCallback;
+ private class ControllerCallbackLinkHolder {
+ private final ControllerCallbackLink mCallback;
private final String mPackageName;
private final int mUid;
- ISessionControllerCallbackHolder(ISessionControllerCallback callback, String packageName,
+ ControllerCallbackLinkHolder(ControllerCallbackLink callback, String packageName,
int uid) {
mCallback = callback;
mPackageName = packageName;
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index d51da995a37d..d20ed8c11009 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -16,71 +16,15 @@
package com.android.server.media;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.INotificationManager;
-import android.app.KeyguardManager;
-import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ServiceInfo;
-import android.content.pm.UserInfo;
-import android.database.ContentObserver;
-import android.media.AudioManager;
-import android.media.AudioManagerInternal;
-import android.media.AudioPlaybackConfiguration;
-import android.media.AudioSystem;
-import android.media.IAudioService;
-import android.media.IRemoteVolumeController;
-import android.media.session.IActiveSessionsListener;
-import android.media.session.ICallback;
-import android.media.session.IOnMediaKeyListener;
-import android.media.session.IOnVolumeKeyLongPressListener;
-import android.media.session.ISession;
-import android.media.session.ISessionCallback;
-import android.media.session.ISessionManager;
-import android.media.session.MediaSession;
-import android.media.session.MediaSessionManager;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
+import android.media.Session2Token;
import android.os.IBinder;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.speech.RecognizerIntent;
-import android.text.TextUtils;
import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.view.KeyEvent;
-import android.view.ViewConfiguration;
-import com.android.internal.util.DumpUtils;
-import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.Watchdog;
import com.android.server.Watchdog.Monitor;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -89,1829 +33,124 @@ import java.util.List;
public class MediaSessionService extends SystemService implements Monitor {
private static final String TAG = "MediaSessionService";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- // Leave log for key event always.
- private static final boolean DEBUG_KEY_EVENT = true;
- private static final int WAKELOCK_TIMEOUT = 5000;
- private static final int MEDIA_KEY_LISTENER_TIMEOUT = 1000;
-
- private final SessionManagerImpl mSessionManagerImpl;
-
- // Keeps the full user id for each user.
- private final SparseIntArray mFullUserIds = new SparseIntArray();
- private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<FullUserRecord>();
- private final ArrayList<SessionsListenerRecord> mSessionsListeners
- = new ArrayList<SessionsListenerRecord>();
- private final Object mLock = new Object();
- private final MessageHandler mHandler = new MessageHandler();
- private final PowerManager.WakeLock mMediaEventWakeLock;
- private final int mLongPressTimeout;
- private final INotificationManager mNotificationManager;
-
- private KeyguardManager mKeyguardManager;
- private IAudioService mAudioService;
- private AudioManagerInternal mAudioManagerInternal;
- private ActivityManager mActivityManager;
- private ContentResolver mContentResolver;
- private SettingsObserver mSettingsObserver;
- private boolean mHasFeatureLeanback;
-
- // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
- // It's always not null after the MediaSessionService is started.
- private FullUserRecord mCurrentFullUserRecord;
- private MediaSessionRecord mGlobalPrioritySession;
- private AudioPlayerStateMonitor mAudioPlayerStateMonitor;
-
- // Used to notify system UI when remote volume was changed. TODO find a
- // better way to handle this.
- private IRemoteVolumeController mRvc;
+ private final ServiceImpl mImpl;
public MediaSessionService(Context context) {
super(context);
- mSessionManagerImpl = new SessionManagerImpl();
- PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
- mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
- mNotificationManager = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ mImpl = new MediaSessionServiceImpl(context);
}
@Override
public void onStart() {
- publishBinderService(Context.MEDIA_SESSION_SERVICE, mSessionManagerImpl);
+ publishBinderService(Context.MEDIA_SESSION_SERVICE, mImpl.getServiceBinder());
Watchdog.getInstance().addMonitor(this);
- mKeyguardManager =
- (KeyguardManager) getContext().getSystemService(Context.KEYGUARD_SERVICE);
- mAudioService = getAudioService();
- mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
- mActivityManager =
- (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
- mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance();
- mAudioPlayerStateMonitor.registerListener(
- (config, isRemoved) -> {
- if (isRemoved || !config.isActive() || config.getPlayerType()
- == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
- return;
- }
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(
- UserHandle.getUserId(config.getClientUid()));
- if (user != null) {
- user.mPriorityStack.updateMediaButtonSessionIfNeeded();
- }
- }
- }, null /* handler */);
- mAudioPlayerStateMonitor.registerSelfIntoAudioServiceIfNeeded(mAudioService);
- mContentResolver = getContext().getContentResolver();
- mSettingsObserver = new SettingsObserver();
- mSettingsObserver.observe();
- mHasFeatureLeanback = getContext().getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_LEANBACK);
- updateUser();
- }
-
- private IAudioService getAudioService() {
- IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
- return IAudioService.Stub.asInterface(b);
- }
-
- private boolean isGlobalPriorityActiveLocked() {
- return mGlobalPrioritySession != null && mGlobalPrioritySession.isActive();
- }
-
- public void updateSession(MediaSessionRecord record) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (user == null) {
- Log.w(TAG, "Unknown session updated. Ignoring.");
- return;
- }
- if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Global priority session is updated, active=" + record.isActive());
- }
- user.pushAddressedPlayerChangedLocked();
- } else {
- if (!user.mPriorityStack.contains(record)) {
- Log.w(TAG, "Unknown session updated. Ignoring.");
- return;
- }
- user.mPriorityStack.onSessionStateChange(record);
- }
- mHandler.postSessionsChanged(record.getUserId());
- }
- }
-
- public void setGlobalPrioritySession(MediaSessionRecord record) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (mGlobalPrioritySession != record) {
- Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession
- + " to " + record);
- mGlobalPrioritySession = record;
- if (user != null && user.mPriorityStack.contains(record)) {
- // Handle the global priority session separately.
- // Otherwise, it can be the media button session regardless of the active state
- // because it or other system components might have been the lastly played media
- // app.
- user.mPriorityStack.removeSession(record);
- }
- }
- }
- }
-
- private List<MediaSessionRecord> getActiveSessionsLocked(int userId) {
- List<MediaSessionRecord> records = new ArrayList<>();
- if (userId == UserHandle.USER_ALL) {
- int size = mUserRecords.size();
- for (int i = 0; i < size; i++) {
- records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId));
- }
- } else {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null) {
- Log.w(TAG, "getSessions failed. Unknown user " + userId);
- return records;
- }
- records.addAll(user.mPriorityStack.getActiveSessions(userId));
- }
-
- // Return global priority session at the first whenever it's asked.
- if (isGlobalPriorityActiveLocked()
- && (userId == UserHandle.USER_ALL
- || userId == mGlobalPrioritySession.getUserId())) {
- records.add(0, mGlobalPrioritySession);
- }
- return records;
- }
-
- /**
- * Tells the system UI that volume has changed on an active remote session.
- */
- public void notifyRemoteVolumeChanged(int flags, MediaSessionRecord session) {
- if (mRvc == null || !session.isActive()) {
- return;
- }
- try {
- mRvc.remoteVolumeChanged(session.getControllerBinder(), flags);
- } catch (Exception e) {
- Log.wtf(TAG, "Error sending volume change to system UI.", e);
- }
- }
-
- public void onSessionPlaystateChanged(MediaSessionRecord record, int oldState, int newState) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (user == null || !user.mPriorityStack.contains(record)) {
- Log.d(TAG, "Unknown session changed playback state. Ignoring.");
- return;
- }
- user.mPriorityStack.onPlaystateChanged(record, oldState, newState);
- }
- }
-
- public void onSessionPlaybackTypeChanged(MediaSessionRecord record) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (user == null || !user.mPriorityStack.contains(record)) {
- Log.d(TAG, "Unknown session changed playback type. Ignoring.");
- return;
- }
- pushRemoteVolumeUpdateLocked(record.getUserId());
- }
+ mImpl.onStart();
}
@Override
public void onStartUser(int userId) {
- if (DEBUG) Log.d(TAG, "onStartUser: " + userId);
- updateUser();
+ mImpl.onStartUser(userId);
}
@Override
public void onSwitchUser(int userId) {
- if (DEBUG) Log.d(TAG, "onSwitchUser: " + userId);
- updateUser();
+ mImpl.onSwitchUser(userId);
}
+ // Called when the user with the userId is removed.
@Override
public void onStopUser(int userId) {
- if (DEBUG) Log.d(TAG, "onStopUser: " + userId);
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user != null) {
- if (user.mFullUserId == userId) {
- user.destroySessionsForUserLocked(UserHandle.USER_ALL);
- mUserRecords.remove(userId);
- } else {
- user.destroySessionsForUserLocked(userId);
- }
- }
- updateUser();
- }
+ mImpl.onStopUser(userId);
}
@Override
public void monitor() {
- synchronized (mLock) {
- // Check for deadlock
- }
- }
-
- protected void enforcePhoneStatePermission(int pid, int uid) {
- if (getContext().checkPermission(android.Manifest.permission.MODIFY_PHONE_STATE, pid, uid)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Must hold the MODIFY_PHONE_STATE permission.");
- }
- }
-
- void sessionDied(MediaSessionRecord session) {
- synchronized (mLock) {
- destroySessionLocked(session);
- }
- }
-
- void destroySession(MediaSessionRecord session) {
- synchronized (mLock) {
- destroySessionLocked(session);
- }
- }
-
- private void updateUser() {
- synchronized (mLock) {
- UserManager manager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
- mFullUserIds.clear();
- List<UserInfo> allUsers = manager.getUsers();
- if (allUsers != null) {
- for (UserInfo userInfo : allUsers) {
- if (userInfo.isManagedProfile()) {
- mFullUserIds.put(userInfo.id, userInfo.profileGroupId);
- } else {
- mFullUserIds.put(userInfo.id, userInfo.id);
- if (mUserRecords.get(userInfo.id) == null) {
- mUserRecords.put(userInfo.id, new FullUserRecord(userInfo.id));
- }
- }
- }
- }
- // Ensure that the current full user exists.
- int currentFullUserId = ActivityManager.getCurrentUser();
- mCurrentFullUserRecord = mUserRecords.get(currentFullUserId);
- if (mCurrentFullUserRecord == null) {
- Log.w(TAG, "Cannot find FullUserInfo for the current user " + currentFullUserId);
- mCurrentFullUserRecord = new FullUserRecord(currentFullUserId);
- mUserRecords.put(currentFullUserId, mCurrentFullUserRecord);
- }
- mFullUserIds.put(currentFullUserId, currentFullUserId);
- }
- }
-
- private void updateActiveSessionListeners() {
- synchronized (mLock) {
- for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
- SessionsListenerRecord listener = mSessionsListeners.get(i);
- try {
- enforceMediaPermissions(listener.mComponentName, listener.mPid, listener.mUid,
- listener.mUserId);
- } catch (SecurityException e) {
- Log.i(TAG, "ActiveSessionsListener " + listener.mComponentName
- + " is no longer authorized. Disconnecting.");
- mSessionsListeners.remove(i);
- try {
- listener.mListener
- .onActiveSessionsChanged(new ArrayList<MediaSession.Token>());
- } catch (Exception e1) {
- // ignore
- }
- }
- }
- }
- }
-
- /*
- * When a session is removed several things need to happen.
- * 1. We need to remove it from the relevant user.
- * 2. We need to remove it from the priority stack.
- * 3. We need to remove it from all sessions.
- * 4. If this is the system priority session we need to clear it.
- * 5. We need to unlink to death from the cb binder
- * 6. We need to tell the session to do any final cleanup (onDestroy)
- */
- private void destroySessionLocked(MediaSessionRecord session) {
- if (DEBUG) {
- Log.d(TAG, "Destroying " + session);
- }
- FullUserRecord user = getFullUserRecordLocked(session.getUserId());
- if (mGlobalPrioritySession == session) {
- mGlobalPrioritySession = null;
- if (session.isActive() && user != null) {
- user.pushAddressedPlayerChangedLocked();
- }
- } else {
- if (user != null) {
- user.mPriorityStack.removeSession(session);
- }
- }
-
- try {
- session.getCallback().asBinder().unlinkToDeath(session, 0);
- } catch (Exception e) {
- // ignore exceptions while destroying a session.
- }
- session.onDestroy();
- mHandler.postSessionsChanged(session.getUserId());
- }
-
- private void enforcePackageName(String packageName, int uid) {
- if (TextUtils.isEmpty(packageName)) {
- throw new IllegalArgumentException("packageName may not be empty");
- }
- String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
- final int packageCount = packages.length;
- for (int i = 0; i < packageCount; i++) {
- if (packageName.equals(packages[i])) {
- return;
- }
- }
- throw new IllegalArgumentException("packageName is not owned by the calling process");
+ mImpl.monitor();
}
/**
- * Checks a caller's authorization to register an IRemoteControlDisplay.
- * Authorization is granted if one of the following is true:
- * <ul>
- * <li>the caller has android.Manifest.permission.MEDIA_CONTENT_CONTROL
- * permission</li>
- * <li>the caller's listener is one of the enabled notification listeners
- * for the caller's user</li>
- * </ul>
+ * Updates session.
*/
- private void enforceMediaPermissions(ComponentName compName, int pid, int uid,
- int resolvedUserId) {
- if (isCurrentVolumeController(pid, uid)) return;
- if (getContext()
- .checkPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
- != PackageManager.PERMISSION_GRANTED
- && !isEnabledNotificationListener(compName, UserHandle.getUserId(uid),
- resolvedUserId)) {
- throw new SecurityException("Missing permission to control media.");
- }
- }
-
- private boolean isCurrentVolumeController(int pid, int uid) {
- return getContext().checkPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
- pid, uid) == PackageManager.PERMISSION_GRANTED;
- }
-
- private void enforceSystemUiPermission(String action, int pid, int uid) {
- if (!isCurrentVolumeController(pid, uid)) {
- throw new SecurityException("Only system ui may " + action);
- }
+ public void updateSession(MediaSessionRecord record) {
+ mImpl.updateSession(record);
}
/**
- * This checks if the component is an enabled notification listener for the
- * specified user. Enabled components may only operate on behalf of the user
- * they're running as.
- *
- * @param compName The component that is enabled.
- * @param userId The user id of the caller.
- * @param forUserId The user id they're making the request on behalf of.
- * @return True if the component is enabled, false otherwise
+ * Sets global priority session.
*/
- private boolean isEnabledNotificationListener(ComponentName compName, int userId,
- int forUserId) {
- if (userId != forUserId) {
- // You may not access another user's content as an enabled listener.
- return false;
- }
- if (DEBUG) {
- Log.d(TAG, "Checking if enabled notification listener " + compName);
- }
- if (compName != null) {
- try {
- return mNotificationManager.isNotificationListenerAccessGrantedForUser(
- compName, userId);
- } catch(RemoteException e) {
- Log.w(TAG, "Dead NotificationManager in isEnabledNotificationListener", e);
- }
- }
- return false;
+ public void setGlobalPrioritySession(MediaSessionRecord record) {
+ mImpl.setGlobalPrioritySession(record);
}
- private MediaSessionRecord createSessionInternal(int callerPid, int callerUid, int userId,
- String callerPackageName, ISessionCallback cb, String tag) throws RemoteException {
- synchronized (mLock) {
- return createSessionLocked(callerPid, callerUid, userId, callerPackageName, cb, tag);
- }
+ List<Session2Token> getSession2TokensLocked(int userId) {
+ return mImpl.getSession2TokensLocked(userId);
}
- /*
- * When a session is created the following things need to happen.
- * 1. Its callback binder needs a link to death
- * 2. It needs to be added to all sessions.
- * 3. It needs to be added to the priority stack.
- * 4. It needs to be added to the relevant user record.
+ /**
+ * Tells the system UI that volume has changed on an active remote session.
*/
- private MediaSessionRecord createSessionLocked(int callerPid, int callerUid, int userId,
- String callerPackageName, ISessionCallback cb, String tag) {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null) {
- Log.wtf(TAG, "Request from invalid user: " + userId);
- throw new RuntimeException("Session request from invalid user.");
- }
-
- final MediaSessionRecord session = new MediaSessionRecord(callerPid, callerUid, userId,
- callerPackageName, cb, tag, this, mHandler.getLooper());
- try {
- cb.asBinder().linkToDeath(session, 0);
- } catch (RemoteException e) {
- throw new RuntimeException("Media Session owner died prematurely.", e);
- }
-
- user.mPriorityStack.addSession(session);
- mHandler.postSessionsChanged(userId);
-
- if (DEBUG) {
- Log.d(TAG, "Created session for " + callerPackageName + " with tag " + tag);
- }
- return session;
- }
-
- private int findIndexOfSessionsListenerLocked(IActiveSessionsListener listener) {
- for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
- if (mSessionsListeners.get(i).mListener.asBinder() == listener.asBinder()) {
- return i;
- }
- }
- return -1;
- }
-
- private void pushSessionsChanged(int userId) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null) {
- Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId);
- return;
- }
- List<MediaSessionRecord> records = getActiveSessionsLocked(userId);
- int size = records.size();
- ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
- for (int i = 0; i < size; i++) {
- tokens.add(new MediaSession.Token(records.get(i).getControllerBinder()));
- }
- pushRemoteVolumeUpdateLocked(userId);
- for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
- SessionsListenerRecord record = mSessionsListeners.get(i);
- if (record.mUserId == UserHandle.USER_ALL || record.mUserId == userId) {
- try {
- record.mListener.onActiveSessionsChanged(tokens);
- } catch (RemoteException e) {
- Log.w(TAG, "Dead ActiveSessionsListener in pushSessionsChanged, removing",
- e);
- mSessionsListeners.remove(i);
- }
- }
- }
- }
- }
-
- private void pushRemoteVolumeUpdateLocked(int userId) {
- if (mRvc != null) {
- try {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null) {
- Log.w(TAG, "pushRemoteVolumeUpdateLocked failed. No user with id=" + userId);
- return;
- }
- MediaSessionRecord record = user.mPriorityStack.getDefaultRemoteSession(userId);
- mRvc.updateRemoteController(record == null ? null : record.getControllerBinder());
- } catch (RemoteException e) {
- Log.wtf(TAG, "Error sending default remote volume to sys ui.", e);
- }
- }
+ public void notifyRemoteVolumeChanged(int flags, MediaSessionRecord session) {
+ mImpl.notifyRemoteVolumeChanged(flags, session);
}
/**
- * Called when the media button receiver for the {@param record} is changed.
- *
- * @param record the media session whose media button receiver is updated.
+ * Called when session playstate is changed.
*/
- public void onMediaButtonReceiverChanged(MediaSessionRecord record) {
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- MediaSessionRecord mediaButtonSession =
- user.mPriorityStack.getMediaButtonSession();
- if (record == mediaButtonSession) {
- user.rememberMediaButtonReceiverLocked(mediaButtonSession);
- }
- }
- }
-
- private String getCallingPackageName(int uid) {
- String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
- if (packages != null && packages.length > 0) {
- return packages[0];
- }
- return "";
- }
-
- private void dispatchVolumeKeyLongPressLocked(KeyEvent keyEvent) {
- if (mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) {
- return;
- }
- try {
- mCurrentFullUserRecord.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send " + keyEvent + " to volume key long-press listener");
- }
- }
-
- private FullUserRecord getFullUserRecordLocked(int userId) {
- int fullUserId = mFullUserIds.get(userId, -1);
- if (fullUserId < 0) {
- return null;
- }
- return mUserRecords.get(fullUserId);
+ public void onSessionPlaystateChanged(MediaSessionRecord record, int oldState, int newState) {
+ mImpl.onSessionPlaystateChanged(record, oldState, newState);
}
/**
- * Information about a full user and its corresponding managed profiles.
- *
- * <p>Since the full user runs together with its managed profiles, a user wouldn't differentiate
- * them when he/she presses a media/volume button. So keeping media sessions for them in one
- * place makes more sense and increases the readability.</p>
- * <p>The contents of this object is guarded by {@link #mLock}.
+ * Called when session playback type is changed.
*/
- final class FullUserRecord implements MediaSessionStack.OnMediaButtonSessionChangedListener {
- public static final int COMPONENT_TYPE_INVALID = 0;
- public static final int COMPONENT_TYPE_BROADCAST = 1;
- public static final int COMPONENT_TYPE_ACTIVITY = 2;
- public static final int COMPONENT_TYPE_SERVICE = 3;
- private static final String COMPONENT_NAME_USER_ID_DELIM = ",";
-
- private final int mFullUserId;
- private final MediaSessionStack mPriorityStack;
- private PendingIntent mLastMediaButtonReceiver;
- private ComponentName mRestoredMediaButtonReceiver;
- private int mRestoredMediaButtonReceiverComponentType;
- private int mRestoredMediaButtonReceiverUserId;
-
- private IOnVolumeKeyLongPressListener mOnVolumeKeyLongPressListener;
- private int mOnVolumeKeyLongPressListenerUid;
- private KeyEvent mInitialDownVolumeKeyEvent;
- private int mInitialDownVolumeStream;
- private boolean mInitialDownMusicOnly;
-
- private IOnMediaKeyListener mOnMediaKeyListener;
- private int mOnMediaKeyListenerUid;
- private ICallback mCallback;
-
- public FullUserRecord(int fullUserId) {
- mFullUserId = fullUserId;
- mPriorityStack = new MediaSessionStack(mAudioPlayerStateMonitor, this);
- // Restore the remembered media button receiver before the boot.
- String mediaButtonReceiverInfo = Settings.Secure.getStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER, mFullUserId);
- if (mediaButtonReceiverInfo == null) {
- return;
- }
- String[] tokens = mediaButtonReceiverInfo.split(COMPONENT_NAME_USER_ID_DELIM);
- if (tokens == null || (tokens.length != 2 && tokens.length != 3)) {
- return;
- }
- mRestoredMediaButtonReceiver = ComponentName.unflattenFromString(tokens[0]);
- mRestoredMediaButtonReceiverUserId = Integer.parseInt(tokens[1]);
- if (tokens.length == 3) {
- mRestoredMediaButtonReceiverComponentType = Integer.parseInt(tokens[2]);
- } else {
- mRestoredMediaButtonReceiverComponentType =
- getComponentType(mRestoredMediaButtonReceiver);
- }
- }
-
- public void destroySessionsForUserLocked(int userId) {
- List<MediaSessionRecord> sessions = mPriorityStack.getPriorityList(false, userId);
- for (MediaSessionRecord session : sessions) {
- MediaSessionService.this.destroySessionLocked(session);
- }
- }
-
- public void dumpLocked(PrintWriter pw, String prefix) {
- pw.print(prefix + "Record for full_user=" + mFullUserId);
- // Dump managed profile user ids associated with this user.
- int size = mFullUserIds.size();
- for (int i = 0; i < size; i++) {
- if (mFullUserIds.keyAt(i) != mFullUserIds.valueAt(i)
- && mFullUserIds.valueAt(i) == mFullUserId) {
- pw.print(", profile_user=" + mFullUserIds.keyAt(i));
- }
- }
- pw.println();
- String indent = prefix + " ";
- pw.println(indent + "Volume key long-press listener: " + mOnVolumeKeyLongPressListener);
- pw.println(indent + "Volume key long-press listener package: " +
- getCallingPackageName(mOnVolumeKeyLongPressListenerUid));
- pw.println(indent + "Media key listener: " + mOnMediaKeyListener);
- pw.println(indent + "Media key listener package: " +
- getCallingPackageName(mOnMediaKeyListenerUid));
- pw.println(indent + "Callback: " + mCallback);
- pw.println(indent + "Last MediaButtonReceiver: " + mLastMediaButtonReceiver);
- pw.println(indent + "Restored MediaButtonReceiver: " + mRestoredMediaButtonReceiver);
- pw.println(indent + "Restored MediaButtonReceiverComponentType: "
- + mRestoredMediaButtonReceiverComponentType);
- mPriorityStack.dump(pw, indent);
- }
-
- @Override
- public void onMediaButtonSessionChanged(MediaSessionRecord oldMediaButtonSession,
- MediaSessionRecord newMediaButtonSession) {
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Media button session is changed to " + newMediaButtonSession);
- }
- synchronized (mLock) {
- if (oldMediaButtonSession != null) {
- mHandler.postSessionsChanged(oldMediaButtonSession.getUserId());
- }
- if (newMediaButtonSession != null) {
- rememberMediaButtonReceiverLocked(newMediaButtonSession);
- mHandler.postSessionsChanged(newMediaButtonSession.getUserId());
- }
- pushAddressedPlayerChangedLocked();
- }
- }
-
- // Remember media button receiver and keep it in the persistent storage.
- public void rememberMediaButtonReceiverLocked(MediaSessionRecord record) {
- PendingIntent receiver = record.getMediaButtonReceiver();
- mLastMediaButtonReceiver = receiver;
- mRestoredMediaButtonReceiver = null;
- mRestoredMediaButtonReceiverComponentType = COMPONENT_TYPE_INVALID;
-
- String mediaButtonReceiverInfo = "";
- if (receiver != null) {
- ComponentName component = receiver.getIntent().getComponent();
- if (component != null
- && record.getPackageName().equals(component.getPackageName())) {
- String componentName = component.flattenToString();
- int componentType = getComponentType(component);
- mediaButtonReceiverInfo = String.join(COMPONENT_NAME_USER_ID_DELIM,
- componentName, String.valueOf(record.getUserId()),
- String.valueOf(componentType));
- }
- }
- Settings.Secure.putStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER, mediaButtonReceiverInfo,
- mFullUserId);
- }
-
- private void pushAddressedPlayerChangedLocked() {
- if (mCallback == null) {
- return;
- }
- try {
- MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
- if (mediaButtonSession != null) {
- mCallback.onAddressedPlayerChangedToMediaSession(
- new MediaSession.Token(mediaButtonSession.getControllerBinder()));
- } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
- mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
- mCurrentFullUserRecord.mLastMediaButtonReceiver
- .getIntent().getComponent());
- } else if (mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
- mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
- mCurrentFullUserRecord.mRestoredMediaButtonReceiver);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
- }
- }
-
- private MediaSessionRecord getMediaButtonSessionLocked() {
- return isGlobalPriorityActiveLocked()
- ? mGlobalPrioritySession : mPriorityStack.getMediaButtonSession();
- }
-
- private int getComponentType(@Nullable ComponentName componentName) {
- if (componentName == null) {
- return COMPONENT_TYPE_INVALID;
- }
- PackageManager pm = getContext().getPackageManager();
- try {
- ActivityInfo activityInfo = pm.getActivityInfo(componentName,
- PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.GET_ACTIVITIES);
- if (activityInfo != null) {
- return COMPONENT_TYPE_ACTIVITY;
- }
- } catch (NameNotFoundException e) {
- }
- try {
- ServiceInfo serviceInfo = pm.getServiceInfo(componentName,
- PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.GET_SERVICES);
- if (serviceInfo != null) {
- return COMPONENT_TYPE_SERVICE;
- }
- } catch (NameNotFoundException e) {
- }
- // Pick legacy behavior for BroadcastReceiver or unknown.
- return COMPONENT_TYPE_BROADCAST;
- }
+ public void onSessionPlaybackTypeChanged(MediaSessionRecord record) {
+ mImpl.onSessionPlaybackTypeChanged(record);
}
- final class SessionsListenerRecord implements IBinder.DeathRecipient {
- private final IActiveSessionsListener mListener;
- private final ComponentName mComponentName;
- private final int mUserId;
- private final int mPid;
- private final int mUid;
-
- public SessionsListenerRecord(IActiveSessionsListener listener,
- ComponentName componentName,
- int userId, int pid, int uid) {
- mListener = listener;
- mComponentName = componentName;
- mUserId = userId;
- mPid = pid;
- mUid = uid;
- }
-
- @Override
- public void binderDied() {
- synchronized (mLock) {
- mSessionsListeners.remove(this);
- }
- }
+ protected void enforcePhoneStatePermission(int pid, int uid) {
+ mImpl.enforcePhoneStatePermission(pid, uid);
}
- final class SettingsObserver extends ContentObserver {
- private final Uri mSecureSettingsUri = Settings.Secure.getUriFor(
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
-
- private SettingsObserver() {
- super(null);
- }
-
- private void observe() {
- mContentResolver.registerContentObserver(mSecureSettingsUri,
- false, this, UserHandle.USER_ALL);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- updateActiveSessionListeners();
- }
+ void sessionDied(MediaSessionRecord session) {
+ mImpl.sessionDied(session);
}
- class SessionManagerImpl extends ISessionManager.Stub {
- private static final String EXTRA_WAKELOCK_ACQUIRED =
- "android.media.AudioService.WAKELOCK_ACQUIRED";
- private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number
-
- private boolean mVoiceButtonDown = false;
- private boolean mVoiceButtonHandled = false;
-
- @Override
- public ISession createSession(String packageName, ISessionCallback cb, String tag,
- int userId) throws RemoteException {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- enforcePackageName(packageName, uid);
- int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
- false /* allowAll */, true /* requireFull */, "createSession", packageName);
- if (cb == null) {
- throw new IllegalArgumentException("Controller callback cannot be null");
- }
- return createSessionInternal(pid, uid, resolvedUserId, packageName, cb, tag)
- .getSessionBinder();
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public List<IBinder> getSessions(ComponentName componentName, int userId) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
-
- try {
- int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
- ArrayList<IBinder> binders = new ArrayList<IBinder>();
- synchronized (mLock) {
- List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId);
- for (MediaSessionRecord record : records) {
- binders.add(record.getControllerBinder().asBinder());
- }
- }
- return binders;
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void addSessionsListener(IActiveSessionsListener listener,
- ComponentName componentName, int userId) throws RemoteException {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
-
- try {
- int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
- synchronized (mLock) {
- int index = findIndexOfSessionsListenerLocked(listener);
- if (index != -1) {
- Log.w(TAG, "ActiveSessionsListener is already added, ignoring");
- return;
- }
- SessionsListenerRecord record = new SessionsListenerRecord(listener,
- componentName, resolvedUserId, pid, uid);
- try {
- listener.asBinder().linkToDeath(record, 0);
- } catch (RemoteException e) {
- Log.e(TAG, "ActiveSessionsListener is dead, ignoring it", e);
- return;
- }
- mSessionsListeners.add(record);
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void removeSessionsListener(IActiveSessionsListener listener)
- throws RemoteException {
- synchronized (mLock) {
- int index = findIndexOfSessionsListenerLocked(listener);
- if (index != -1) {
- SessionsListenerRecord record = mSessionsListeners.remove(index);
- try {
- record.mListener.asBinder().unlinkToDeath(record, 0);
- } catch (Exception e) {
- // ignore exceptions, the record is being removed
- }
- }
- }
- }
-
- /**
- * Handles the dispatching of the media button events to one of the
- * registered listeners, or if there was none, broadcast an
- * ACTION_MEDIA_BUTTON intent to the rest of the system.
- *
- * @param packageName The caller package
- * @param asSystemService {@code true} if the event sent to the session as if it was come
- * from the system service instead of the app process. This helps sessions to
- * distinguish between the key injection by the app and key events from the
- * hardware devices. Should be used only when the volume key events aren't handled
- * by foreground activity. {@code false} otherwise to tell session about the real
- * caller.
- * @param keyEvent a non-null KeyEvent whose key code is one of the
- * supported media buttons
- * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held
- * while this key event is dispatched.
- */
- @Override
- public void dispatchMediaKeyEvent(String packageName, boolean asSystemService,
- KeyEvent keyEvent, boolean needWakeLock) {
- if (keyEvent == null || !KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
- Log.w(TAG, "Attempted to dispatch null or non-media key event.");
- return;
- }
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- if (DEBUG) {
- Log.d(TAG, "dispatchMediaKeyEvent, pkg=" + packageName + " pid=" + pid
- + ", uid=" + uid + ", asSystem=" + asSystemService + ", event="
- + keyEvent);
- }
- if (!isUserSetupComplete()) {
- // Global media key handling can have the side-effect of starting new
- // activities which is undesirable while setup is in progress.
- Slog.i(TAG, "Not dispatching media key event because user "
- + "setup is in progress.");
- return;
- }
-
- synchronized (mLock) {
- boolean isGlobalPriorityActive = isGlobalPriorityActiveLocked();
- if (isGlobalPriorityActive && uid != Process.SYSTEM_UID) {
- // Prevent dispatching key event through reflection while the global
- // priority session is active.
- Slog.i(TAG, "Only the system can dispatch media key event "
- + "to the global priority session.");
- return;
- }
- if (!isGlobalPriorityActive) {
- if (mCurrentFullUserRecord.mOnMediaKeyListener != null) {
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Send " + keyEvent + " to the media key listener");
- }
- try {
- mCurrentFullUserRecord.mOnMediaKeyListener.onMediaKey(keyEvent,
- new MediaKeyListenerResultReceiver(packageName, pid, uid,
- asSystemService, keyEvent, needWakeLock));
- return;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send " + keyEvent
- + " to the media key listener");
- }
- }
- }
- if (!isGlobalPriorityActive && isVoiceKey(keyEvent.getKeyCode())) {
- handleVoiceKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent,
- needWakeLock);
- } else {
- dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
- keyEvent, needWakeLock);
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void setCallback(ICallback callback) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- if (!UserHandle.isSameApp(uid, Process.BLUETOOTH_UID)) {
- throw new SecurityException("Only Bluetooth service processes can set"
- + " Callback");
- }
- synchronized (mLock) {
- int userId = UserHandle.getUserId(uid);
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null || user.mFullUserId != userId) {
- Log.w(TAG, "Only the full user can set the callback"
- + ", userId=" + userId);
- return;
- }
- user.mCallback = callback;
- Log.d(TAG, "The callback " + user.mCallback
- + " is set by " + getCallingPackageName(uid));
- if (user.mCallback == null) {
- return;
- }
- try {
- user.mCallback.asBinder().linkToDeath(
- new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- synchronized (mLock) {
- user.mCallback = null;
- }
- }
- }, 0);
- user.pushAddressedPlayerChangedLocked();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set callback", e);
- user.mCallback = null;
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void setOnVolumeKeyLongPressListener(IOnVolumeKeyLongPressListener listener) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- // Enforce SET_VOLUME_KEY_LONG_PRESS_LISTENER permission.
- if (getContext().checkPermission(
- android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER, pid, uid)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Must hold the SET_VOLUME_KEY_LONG_PRESS_LISTENER" +
- " permission.");
- }
-
- synchronized (mLock) {
- int userId = UserHandle.getUserId(uid);
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null || user.mFullUserId != userId) {
- Log.w(TAG, "Only the full user can set the volume key long-press listener"
- + ", userId=" + userId);
- return;
- }
- if (user.mOnVolumeKeyLongPressListener != null &&
- user.mOnVolumeKeyLongPressListenerUid != uid) {
- Log.w(TAG, "The volume key long-press listener cannot be reset"
- + " by another app , mOnVolumeKeyLongPressListener="
- + user.mOnVolumeKeyLongPressListenerUid
- + ", uid=" + uid);
- return;
- }
-
- user.mOnVolumeKeyLongPressListener = listener;
- user.mOnVolumeKeyLongPressListenerUid = uid;
-
- Log.d(TAG, "The volume key long-press listener "
- + listener + " is set by " + getCallingPackageName(uid));
-
- if (user.mOnVolumeKeyLongPressListener != null) {
- try {
- user.mOnVolumeKeyLongPressListener.asBinder().linkToDeath(
- new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- synchronized (mLock) {
- user.mOnVolumeKeyLongPressListener = null;
- }
- }
- }, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set death recipient "
- + user.mOnVolumeKeyLongPressListener);
- user.mOnVolumeKeyLongPressListener = null;
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void setOnMediaKeyListener(IOnMediaKeyListener listener) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- // Enforce SET_MEDIA_KEY_LISTENER permission.
- if (getContext().checkPermission(
- android.Manifest.permission.SET_MEDIA_KEY_LISTENER, pid, uid)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Must hold the SET_MEDIA_KEY_LISTENER" +
- " permission.");
- }
-
- synchronized (mLock) {
- int userId = UserHandle.getUserId(uid);
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user == null || user.mFullUserId != userId) {
- Log.w(TAG, "Only the full user can set the media key listener"
- + ", userId=" + userId);
- return;
- }
- if (user.mOnMediaKeyListener != null && user.mOnMediaKeyListenerUid != uid) {
- Log.w(TAG, "The media key listener cannot be reset by another app. "
- + ", mOnMediaKeyListenerUid=" + user.mOnMediaKeyListenerUid
- + ", uid=" + uid);
- return;
- }
-
- user.mOnMediaKeyListener = listener;
- user.mOnMediaKeyListenerUid = uid;
-
- Log.d(TAG, "The media key listener " + user.mOnMediaKeyListener
- + " is set by " + getCallingPackageName(uid));
-
- if (user.mOnMediaKeyListener != null) {
- try {
- user.mOnMediaKeyListener.asBinder().linkToDeath(
- new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- synchronized (mLock) {
- user.mOnMediaKeyListener = null;
- }
- }
- }, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set death recipient " + user.mOnMediaKeyListener);
- user.mOnMediaKeyListener = null;
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- /**
- * Handles the dispatching of the volume button events to one of the
- * registered listeners. If there's a volume key long-press listener and
- * there's no active global priority session, long-pressess will be sent to the
- * long-press listener instead of adjusting volume.
- *
- * @param packageName The caller's package name, obtained by Context#getPackageName()
- * @param opPackageName The caller's op package name, obtained by Context#getOpPackageName()
- * @param asSystemService {@code true} if the event sent to the session as if it was come
- * from the system service instead of the app process. This helps sessions to
- * distinguish between the key injection by the app and key events from the
- * hardware devices. Should be used only when the volume key events aren't handled
- * by foreground activity. {@code false} otherwise to tell session about the real
- * caller.
- * @param keyEvent a non-null KeyEvent whose key code is one of the
- * {@link KeyEvent#KEYCODE_VOLUME_UP},
- * {@link KeyEvent#KEYCODE_VOLUME_DOWN},
- * or {@link KeyEvent#KEYCODE_VOLUME_MUTE}.
- * @param stream stream type to adjust volume.
- * @param musicOnly true if both UI nor haptic feedback aren't needed when adjust volume.
- */
- @Override
- public void dispatchVolumeKeyEvent(String packageName, String opPackageName,
- boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) {
- if (keyEvent == null ||
- (keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_UP
- && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_DOWN
- && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_MUTE)) {
- Log.w(TAG, "Attempted to dispatch null or non-volume key event.");
- return;
- }
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
-
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "dispatchVolumeKeyEvent, pkg=" + packageName + ", pid=" + pid + ", uid="
- + uid + ", asSystem=" + asSystemService + ", event=" + keyEvent);
- }
-
- try {
- synchronized (mLock) {
- if (isGlobalPriorityActiveLocked()
- || mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) {
- dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
- asSystemService, keyEvent, stream, musicOnly);
- } else {
- // TODO: Consider the case when both volume up and down keys are pressed
- // at the same time.
- if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
- if (keyEvent.getRepeatCount() == 0) {
- // Keeps the copy of the KeyEvent because it can be reused.
- mCurrentFullUserRecord.mInitialDownVolumeKeyEvent =
- KeyEvent.obtain(keyEvent);
- mCurrentFullUserRecord.mInitialDownVolumeStream = stream;
- mCurrentFullUserRecord.mInitialDownMusicOnly = musicOnly;
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(
- MessageHandler.MSG_VOLUME_INITIAL_DOWN,
- mCurrentFullUserRecord.mFullUserId, 0),
- mLongPressTimeout);
- }
- if (keyEvent.getRepeatCount() > 0 || keyEvent.isLongPress()) {
- mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
- if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null) {
- dispatchVolumeKeyLongPressLocked(
- mCurrentFullUserRecord.mInitialDownVolumeKeyEvent);
- // Mark that the key is already handled.
- mCurrentFullUserRecord.mInitialDownVolumeKeyEvent = null;
- }
- dispatchVolumeKeyLongPressLocked(keyEvent);
- }
- } else { // if up
- mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
- if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null
- && mCurrentFullUserRecord.mInitialDownVolumeKeyEvent
- .getDownTime() == keyEvent.getDownTime()) {
- // Short-press. Should change volume.
- dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
- asSystemService,
- mCurrentFullUserRecord.mInitialDownVolumeKeyEvent,
- mCurrentFullUserRecord.mInitialDownVolumeStream,
- mCurrentFullUserRecord.mInitialDownMusicOnly);
- dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
- asSystemService, keyEvent, stream, musicOnly);
- } else {
- dispatchVolumeKeyLongPressLocked(keyEvent);
- }
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- private void dispatchVolumeKeyEventLocked(String packageName, String opPackageName, int pid,
- int uid, boolean asSystemService, KeyEvent keyEvent, int stream,
- boolean musicOnly) {
- boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
- boolean up = keyEvent.getAction() == KeyEvent.ACTION_UP;
- int direction = 0;
- boolean isMute = false;
- switch (keyEvent.getKeyCode()) {
- case KeyEvent.KEYCODE_VOLUME_UP:
- direction = AudioManager.ADJUST_RAISE;
- break;
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- direction = AudioManager.ADJUST_LOWER;
- break;
- case KeyEvent.KEYCODE_VOLUME_MUTE:
- isMute = true;
- break;
- }
- if (down || up) {
- int flags = AudioManager.FLAG_FROM_KEY;
- if (musicOnly) {
- // This flag is used when the screen is off to only affect active media.
- flags |= AudioManager.FLAG_ACTIVE_MEDIA_ONLY;
- } else {
- // These flags are consistent with the home screen
- if (up) {
- flags |= AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE;
- } else {
- flags |= AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE;
- }
- }
- if (direction != 0) {
- // If this is action up we want to send a beep for non-music events
- if (up) {
- direction = 0;
- }
- dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid,
- asSystemService, stream, direction, flags);
- } else if (isMute) {
- if (down && keyEvent.getRepeatCount() == 0) {
- dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid,
- asSystemService, stream, AudioManager.ADJUST_TOGGLE_MUTE, flags);
- }
- }
- }
- }
-
- @Override
- public void dispatchAdjustVolume(String packageName, String opPackageName,
- int suggestedStream, int delta, int flags) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- synchronized (mLock) {
- dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid, false,
- suggestedStream, delta, flags);
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void setRemoteVolumeController(IRemoteVolumeController rvc) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- enforceSystemUiPermission("listen for volume changes", pid, uid);
- mRvc = rvc;
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public boolean isGlobalPriorityActive() {
- synchronized (mLock) {
- return isGlobalPriorityActiveLocked();
- }
- }
-
- @Override
- public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
-
- pw.println("MEDIA SESSION SERVICE (dumpsys media_session)");
- pw.println();
-
- synchronized (mLock) {
- pw.println(mSessionsListeners.size() + " sessions listeners.");
- pw.println("Global priority session is " + mGlobalPrioritySession);
- if (mGlobalPrioritySession != null) {
- mGlobalPrioritySession.dump(pw, " ");
- }
- pw.println("User Records:");
- int count = mUserRecords.size();
- for (int i = 0; i < count; i++) {
- mUserRecords.valueAt(i).dumpLocked(pw, "");
- }
- mAudioPlayerStateMonitor.dump(getContext(), pw, "");
- }
- }
-
- /**
- * Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL
- * permission or an enabled notification listener)
- *
- * @param controllerPackageName package name of the controller app
- * @param controllerPid pid of the controller app
- * @param controllerUid uid of the controller app
- */
- @Override
- public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid)
- throws RemoteException {
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- // Don't perform sanity check between controllerPackageName and controllerUid.
- // When an (activity|service) runs on the another apps process by specifying
- // android:process in the AndroidManifest.xml, then PID and UID would have the
- // running process' information instead of the (activity|service) that has created
- // MediaController.
- // Note that we can use Context#getOpPackageName() instead of
- // Context#getPackageName() for getting package name that matches with the PID/UID,
- // but it doesn't tell which package has created the MediaController, so useless.
- return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName,
- controllerPid, controllerUid);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- // For MediaSession
- private int verifySessionsRequest(ComponentName componentName, int userId, final int pid,
- final int uid) {
- String packageName = null;
- if (componentName != null) {
- // If they gave us a component name verify they own the
- // package
- packageName = componentName.getPackageName();
- enforcePackageName(packageName, uid);
- }
- // Check that they can make calls on behalf of the user and
- // get the final user id
- int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
- true /* allowAll */, true /* requireFull */, "getSessions", packageName);
- // Check if they have the permissions or their component is
- // enabled for the user they're calling from.
- enforceMediaPermissions(componentName, pid, uid, resolvedUserId);
- return resolvedUserId;
- }
-
- private boolean hasMediaControlPermission(int resolvedUserId, String packageName,
- int pid, int uid) throws RemoteException {
- // Allow API calls from the System UI
- if (isCurrentVolumeController(pid, uid)) {
- return true;
- }
-
- // Check if it's system server or has MEDIA_CONTENT_CONTROL.
- // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
- // check here.
- if (uid == Process.SYSTEM_UID || getContext().checkPermission(
- android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
- == PackageManager.PERMISSION_GRANTED) {
- return true;
- } else if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
- }
-
- // You may not access another user's content as an enabled listener.
- final int userId = UserHandle.getUserId(uid);
- if (resolvedUserId != userId) {
- return false;
- }
-
- // TODO(jaewan): (Post-P) Propose NotificationManager#hasEnabledNotificationListener(
- // String pkgName) to notification team for optimization
- final List<ComponentName> enabledNotificationListeners =
- mNotificationManager.getEnabledNotificationListeners(userId);
- if (enabledNotificationListeners != null) {
- for (int i = 0; i < enabledNotificationListeners.size(); i++) {
- if (TextUtils.equals(packageName,
- enabledNotificationListeners.get(i).getPackageName())) {
- return true;
- }
- }
- }
- if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled "
- + "notification listener");
- }
- return false;
- }
-
- private void dispatchAdjustVolumeLocked(String packageName, String opPackageName, int pid,
- int uid, boolean asSystemService, int suggestedStream, int direction, int flags) {
- MediaSessionRecord session = isGlobalPriorityActiveLocked() ? mGlobalPrioritySession
- : mCurrentFullUserRecord.mPriorityStack.getDefaultVolumeSession();
-
- boolean preferSuggestedStream = false;
- if (isValidLocalStreamType(suggestedStream)
- && AudioSystem.isStreamActive(suggestedStream, 0)) {
- preferSuggestedStream = true;
- }
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags="
- + flags + ", suggestedStream=" + suggestedStream
- + ", preferSuggestedStream=" + preferSuggestedStream);
- }
- if (session == null || preferSuggestedStream) {
- if ((flags & AudioManager.FLAG_ACTIVE_MEDIA_ONLY) != 0
- && !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) {
- if (DEBUG) {
- Log.d(TAG, "No active session to adjust, skipping media only volume event");
- }
- return;
- }
-
- // Execute mAudioService.adjustSuggestedStreamVolume() on
- // handler thread of MediaSessionService.
- // This will release the MediaSessionService.mLock sooner and avoid
- // a potential deadlock between MediaSessionService.mLock and
- // ActivityManagerService lock.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- final String callingOpPackageName;
- final int callingUid;
- if (asSystemService) {
- callingOpPackageName = getContext().getOpPackageName();
- callingUid = Process.myUid();
- } else {
- callingOpPackageName = opPackageName;
- callingUid = uid;
- }
- try {
- mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(suggestedStream,
- direction, flags, callingOpPackageName, callingUid);
- } catch (SecurityException | IllegalArgumentException e) {
- Log.e(TAG, "Cannot adjust volume: direction=" + direction
- + ", suggestedStream=" + suggestedStream + ", flags=" + flags
- + ", packageName=" + packageName + ", uid=" + uid
- + ", asSystemService=" + asSystemService, e);
- }
- }
- });
- } else {
- session.adjustVolume(packageName, opPackageName, pid, uid, null, asSystemService,
- direction, flags, true);
- }
- }
-
- private void handleVoiceKeyEventLocked(String packageName, int pid, int uid,
- boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
- int action = keyEvent.getAction();
- boolean isLongPress = (keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
- if (action == KeyEvent.ACTION_DOWN) {
- if (keyEvent.getRepeatCount() == 0) {
- mVoiceButtonDown = true;
- mVoiceButtonHandled = false;
- } else if (mVoiceButtonDown && !mVoiceButtonHandled && isLongPress) {
- mVoiceButtonHandled = true;
- startVoiceInput(needWakeLock);
- }
- } else if (action == KeyEvent.ACTION_UP) {
- if (mVoiceButtonDown) {
- mVoiceButtonDown = false;
- if (!mVoiceButtonHandled && !keyEvent.isCanceled()) {
- // Resend the down then send this event through
- KeyEvent downEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_DOWN);
- dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
- downEvent, needWakeLock);
- dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
- keyEvent, needWakeLock);
- }
- }
- }
- }
-
- private void dispatchMediaKeyEventLocked(String packageName, int pid, int uid,
- boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
- MediaSessionRecord session = mCurrentFullUserRecord.getMediaButtonSessionLocked();
- if (session != null) {
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Sending " + keyEvent + " to " + session);
- }
- if (needWakeLock) {
- mKeyEventReceiver.aquireWakeLockLocked();
- }
- // If we don't need a wakelock use -1 as the id so we won't release it later.
- session.sendMediaButton(packageName, pid, uid, asSystemService, keyEvent,
- needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
- mKeyEventReceiver);
- if (mCurrentFullUserRecord.mCallback != null) {
- try {
- mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession(
- keyEvent, new MediaSession.Token(session.getControllerBinder()));
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send callback", e);
- }
- }
- } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null
- || mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
- if (needWakeLock) {
- mKeyEventReceiver.aquireWakeLockLocked();
- }
- Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
- mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
- // TODO: Find a way to also send PID/UID in secure way.
- String callerPackageName =
- (asSystemService) ? getContext().getPackageName() : packageName;
- mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callerPackageName);
- try {
- if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
- PendingIntent receiver = mCurrentFullUserRecord.mLastMediaButtonReceiver;
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Sending " + keyEvent
- + " to the last known PendingIntent " + receiver);
- }
- receiver.send(getContext(),
- needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
- mediaButtonIntent, mKeyEventReceiver, mHandler);
- if (mCurrentFullUserRecord.mCallback != null) {
- ComponentName componentName = mCurrentFullUserRecord
- .mLastMediaButtonReceiver.getIntent().getComponent();
- if (componentName != null) {
- mCurrentFullUserRecord.mCallback
- .onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, componentName);
- }
- }
- } else {
- ComponentName receiver =
- mCurrentFullUserRecord.mRestoredMediaButtonReceiver;
- int componentType = mCurrentFullUserRecord
- .mRestoredMediaButtonReceiverComponentType;
- UserHandle userHandle = UserHandle.of(mCurrentFullUserRecord
- .mRestoredMediaButtonReceiverUserId);
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
- + receiver + ", type=" + componentType);
- }
- mediaButtonIntent.setComponent(receiver);
- try {
- switch (componentType) {
- case FullUserRecord.COMPONENT_TYPE_ACTIVITY:
- getContext().startActivityAsUser(mediaButtonIntent, userHandle);
- break;
- case FullUserRecord.COMPONENT_TYPE_SERVICE:
- getContext().startForegroundServiceAsUser(mediaButtonIntent,
- userHandle);
- break;
- default:
- // Legacy behavior for other cases.
- getContext().sendBroadcastAsUser(mediaButtonIntent, userHandle);
- }
- } catch (Exception e) {
- Log.w(TAG, "Error sending media button to the restored intent "
- + receiver + ", type=" + componentType, e);
- }
- if (mCurrentFullUserRecord.mCallback != null) {
- mCurrentFullUserRecord.mCallback
- .onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, receiver);
- }
- }
- } catch (CanceledException e) {
- Log.i(TAG, "Error sending key event to media button receiver "
- + mCurrentFullUserRecord.mLastMediaButtonReceiver, e);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send callback", e);
- }
- }
- }
-
- private void startVoiceInput(boolean needWakeLock) {
- Intent voiceIntent = null;
- // select which type of search to launch:
- // - screen on and device unlocked: action is ACTION_WEB_SEARCH
- // - device locked or screen off: action is
- // ACTION_VOICE_SEARCH_HANDS_FREE
- // with EXTRA_SECURE set to true if the device is securely locked
- PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
- boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
- if (!isLocked && pm.isScreenOn()) {
- voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
- Log.i(TAG, "voice-based interactions: about to use ACTION_WEB_SEARCH");
- } else {
- voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
- voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE,
- isLocked && mKeyguardManager.isKeyguardSecure());
- Log.i(TAG, "voice-based interactions: about to use ACTION_VOICE_SEARCH_HANDS_FREE");
- }
- // start the search activity
- if (needWakeLock) {
- mMediaEventWakeLock.acquire();
- }
- try {
- if (voiceIntent != null) {
- voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- if (DEBUG) Log.d(TAG, "voiceIntent: " + voiceIntent);
- getContext().startActivityAsUser(voiceIntent, UserHandle.CURRENT);
- }
- } catch (ActivityNotFoundException e) {
- Log.w(TAG, "No activity for search: " + e);
- } finally {
- if (needWakeLock) {
- mMediaEventWakeLock.release();
- }
- }
- }
-
- private boolean isVoiceKey(int keyCode) {
- return keyCode == KeyEvent.KEYCODE_HEADSETHOOK
- || (!mHasFeatureLeanback && keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
- }
-
- private boolean isUserSetupComplete() {
- return Settings.Secure.getIntForUser(getContext().getContentResolver(),
- Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
- }
-
- // we only handle public stream types, which are 0-5
- private boolean isValidLocalStreamType(int streamType) {
- return streamType >= AudioManager.STREAM_VOICE_CALL
- && streamType <= AudioManager.STREAM_NOTIFICATION;
- }
-
- private class MediaKeyListenerResultReceiver extends ResultReceiver implements Runnable {
- private final String mPackageName;
- private final int mPid;
- private final int mUid;
- private final boolean mAsSystemService;
- private final KeyEvent mKeyEvent;
- private final boolean mNeedWakeLock;
- private boolean mHandled;
-
- private MediaKeyListenerResultReceiver(String packageName, int pid, int uid,
- boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
- super(mHandler);
- mHandler.postDelayed(this, MEDIA_KEY_LISTENER_TIMEOUT);
- mPackageName = packageName;
- mPid = pid;
- mUid = uid;
- mAsSystemService = asSystemService;
- mKeyEvent = keyEvent;
- mNeedWakeLock = needWakeLock;
- }
-
- @Override
- public void run() {
- Log.d(TAG, "The media key listener is timed-out for " + mKeyEvent);
- dispatchMediaKeyEvent();
- }
-
- @Override
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode == MediaSessionManager.RESULT_MEDIA_KEY_HANDLED) {
- mHandled = true;
- mHandler.removeCallbacks(this);
- return;
- }
- dispatchMediaKeyEvent();
- }
-
- private void dispatchMediaKeyEvent() {
- if (mHandled) {
- return;
- }
- mHandled = true;
- mHandler.removeCallbacks(this);
- synchronized (mLock) {
- if (!isGlobalPriorityActiveLocked()
- && isVoiceKey(mKeyEvent.getKeyCode())) {
- handleVoiceKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
- mKeyEvent, mNeedWakeLock);
- } else {
- dispatchMediaKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
- mKeyEvent, mNeedWakeLock);
- }
- }
- }
- }
-
- private KeyEventWakeLockReceiver mKeyEventReceiver = new KeyEventWakeLockReceiver(mHandler);
-
- class KeyEventWakeLockReceiver extends ResultReceiver implements Runnable,
- PendingIntent.OnFinished {
- private final Handler mHandler;
- private int mRefCount = 0;
- private int mLastTimeoutId = 0;
-
- public KeyEventWakeLockReceiver(Handler handler) {
- super(handler);
- mHandler = handler;
- }
-
- public void onTimeout() {
- synchronized (mLock) {
- if (mRefCount == 0) {
- // We've already released it, so just return
- return;
- }
- mLastTimeoutId++;
- mRefCount = 0;
- releaseWakeLockLocked();
- }
- }
-
- public void aquireWakeLockLocked() {
- if (mRefCount == 0) {
- mMediaEventWakeLock.acquire();
- }
- mRefCount++;
- mHandler.removeCallbacks(this);
- mHandler.postDelayed(this, WAKELOCK_TIMEOUT);
-
- }
-
- @Override
- public void run() {
- onTimeout();
- }
-
- @Override
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode < mLastTimeoutId) {
- // Ignore results from calls that were before the last
- // timeout, just in case.
- return;
- } else {
- synchronized (mLock) {
- if (mRefCount > 0) {
- mRefCount--;
- if (mRefCount == 0) {
- releaseWakeLockLocked();
- }
- }
- }
- }
- }
-
- private void releaseWakeLockLocked() {
- mMediaEventWakeLock.release();
- mHandler.removeCallbacks(this);
- }
-
- @Override
- public void onSendFinished(PendingIntent pendingIntent, Intent intent, int resultCode,
- String resultData, Bundle resultExtras) {
- onReceiveResult(resultCode, null);
- }
- };
-
- BroadcastReceiver mKeyEventDone = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent == null) {
- return;
- }
- Bundle extras = intent.getExtras();
- if (extras == null) {
- return;
- }
- synchronized (mLock) {
- if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)
- && mMediaEventWakeLock.isHeld()) {
- mMediaEventWakeLock.release();
- }
- }
- }
- };
+ void destroySession(MediaSessionRecord session) {
+ mImpl.destroySession(session);
}
- final class MessageHandler extends Handler {
- private static final int MSG_SESSIONS_CHANGED = 1;
- private static final int MSG_VOLUME_INITIAL_DOWN = 2;
- private final SparseArray<Integer> mIntegerCache = new SparseArray<>();
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SESSIONS_CHANGED:
- pushSessionsChanged((int) msg.obj);
- break;
- case MSG_VOLUME_INITIAL_DOWN:
- synchronized (mLock) {
- FullUserRecord user = mUserRecords.get((int) msg.arg1);
- if (user != null && user.mInitialDownVolumeKeyEvent != null) {
- dispatchVolumeKeyLongPressLocked(user.mInitialDownVolumeKeyEvent);
- // Mark that the key is already handled.
- user.mInitialDownVolumeKeyEvent = null;
- }
- }
- break;
- }
- }
+ void pushSession2TokensChangedLocked(int userId) {
+ mImpl.pushSession2TokensChangedLocked(userId);
+ }
- public void postSessionsChanged(int userId) {
- // Use object instead of the arguments when posting message to remove pending requests.
- Integer userIdInteger = mIntegerCache.get(userId);
- if (userIdInteger == null) {
- userIdInteger = Integer.valueOf(userId);
- mIntegerCache.put(userId, userIdInteger);
- }
- removeMessages(MSG_SESSIONS_CHANGED, userIdInteger);
- obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget();
- }
+ /**
+ * Called when media button receiver changed.
+ */
+ public void onMediaButtonReceiverChanged(MediaSessionRecord record) {
+ mImpl.onMediaButtonReceiverChanged(record);
+ }
+
+ abstract static class ServiceImpl {
+ public abstract void onStart();
+ public abstract void notifyRemoteVolumeChanged(int flags, MediaSessionRecord session);
+ public abstract void onSessionPlaystateChanged(
+ MediaSessionRecord record, int oldState, int newState);
+ public abstract void onSessionPlaybackTypeChanged(MediaSessionRecord record);
+ public abstract void onStartUser(int userId);
+ public abstract void onSwitchUser(int userId);
+ public abstract void monitor();
+ public abstract void onMediaButtonReceiverChanged(MediaSessionRecord record);
+ protected abstract void enforcePhoneStatePermission(int pid, int uid);
+ abstract void updateSession(MediaSessionRecord record);
+ abstract void setGlobalPrioritySession(MediaSessionRecord record);
+ abstract List<Session2Token> getSession2TokensLocked(int userId);
+ abstract void onStopUser(int userId);
+ abstract void sessionDied(MediaSessionRecord session);
+ abstract void destroySession(MediaSessionRecord session);
+ abstract void pushSession2TokensChangedLocked(int userId);
+ abstract Context getContext();
+ abstract IBinder getServiceBinder();
}
}
diff --git a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
new file mode 100644
index 000000000000..f374c6d204fd
--- /dev/null
+++ b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
@@ -0,0 +1,2142 @@
+/*
+ * Copyright 2019 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.media;
+
+import static android.os.UserHandle.USER_ALL;
+
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.INotificationManager;
+import android.app.KeyguardManager;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ServiceInfo;
+import android.content.pm.UserInfo;
+import android.database.ContentObserver;
+import android.media.AudioManager;
+import android.media.AudioManagerInternal;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioSystem;
+import android.media.IAudioService;
+import android.media.IRemoteVolumeController;
+import android.media.MediaController2;
+import android.media.Session2CommandGroup;
+import android.media.Session2Token;
+import android.media.session.IActiveSessionsListener;
+import android.media.session.ICallback;
+import android.media.session.IOnMediaKeyListener;
+import android.media.session.IOnVolumeKeyLongPressListener;
+import android.media.session.ISession;
+import android.media.session.ISession2TokensListener;
+import android.media.session.ISessionManager;
+import android.media.session.MediaSession;
+import android.media.session.MediaSessionManager;
+import android.media.session.SessionCallbackLink;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.speech.RecognizerIntent;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.view.KeyEvent;
+import android.view.ViewConfiguration;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.DumpUtils;
+import com.android.server.LocalServices;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * System implementation of MediaSessionManager
+ */
+public class MediaSessionServiceImpl extends MediaSessionService.ServiceImpl {
+ private static final String TAG = "MediaSessionService";
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ // Leave log for key event always.
+ private static final boolean DEBUG_KEY_EVENT = true;
+
+ private static final int WAKELOCK_TIMEOUT = 5000;
+ private static final int MEDIA_KEY_LISTENER_TIMEOUT = 1000;
+
+ private final Context mContext;
+ private final SessionManagerImpl mSessionManagerImpl;
+ private final MessageHandler mHandler = new MessageHandler();
+ private final PowerManager.WakeLock mMediaEventWakeLock;
+ private final int mLongPressTimeout;
+ private final INotificationManager mNotificationManager;
+ private final Object mLock = new Object();
+ // Keeps the full user id for each user.
+ @GuardedBy("mLock")
+ private final SparseIntArray mFullUserIds = new SparseIntArray();
+ @GuardedBy("mLock")
+ private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<FullUserRecord>();
+ @GuardedBy("mLock")
+ private final ArrayList<SessionsListenerRecord> mSessionsListeners =
+ new ArrayList<SessionsListenerRecord>();
+ // Map user id as index to list of Session2Tokens
+ // TODO: Keep session2 info in MediaSessionStack for prioritizing both session1 and session2 in
+ // one place.
+ @GuardedBy("mLock")
+ private final SparseArray<List<Session2Token>> mSession2TokensPerUser = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final List<Session2TokensListenerRecord> mSession2TokensListenerRecords =
+ new ArrayList<>();
+
+ private KeyguardManager mKeyguardManager;
+ private IAudioService mAudioService;
+ private AudioManagerInternal mAudioManagerInternal;
+ private ActivityManager mActivityManager;
+ private ContentResolver mContentResolver;
+ private SettingsObserver mSettingsObserver;
+ private boolean mHasFeatureLeanback;
+
+ // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
+ // It's always not null after the MediaSessionService is started.
+ private FullUserRecord mCurrentFullUserRecord;
+ private MediaSessionRecord mGlobalPrioritySession;
+ private AudioPlayerStateMonitor mAudioPlayerStateMonitor;
+
+ // Used to notify system UI when remote volume was changed. TODO find a
+ // better way to handle this.
+ private IRemoteVolumeController mRvc;
+
+ public MediaSessionServiceImpl(Context context) {
+ mContext = context;
+ mSessionManagerImpl = new SessionManagerImpl();
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
+ mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
+ mNotificationManager = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ }
+
+ Context getContext() {
+ return mContext;
+ }
+
+ IBinder getServiceBinder() {
+ return mSessionManagerImpl;
+ }
+
+ @Override
+ public void onStart() {
+ mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ mAudioService = getAudioService();
+ mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
+ mActivityManager =
+ (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance();
+ mAudioPlayerStateMonitor.registerListener(
+ (config, isRemoved) -> {
+ if (isRemoved || !config.isActive() || config.getPlayerType()
+ == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
+ return;
+ }
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(
+ UserHandle.getUserId(config.getClientUid()));
+ if (user != null) {
+ user.mPriorityStack.updateMediaButtonSessionIfNeeded();
+ }
+ }
+ }, null /* handler */);
+ mAudioPlayerStateMonitor.registerSelfIntoAudioServiceIfNeeded(mAudioService);
+ mContentResolver = mContext.getContentResolver();
+ mSettingsObserver = new SettingsObserver();
+ mSettingsObserver.observe();
+ mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_LEANBACK);
+
+ updateUser();
+ }
+
+ private IAudioService getAudioService() {
+ IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
+ return IAudioService.Stub.asInterface(b);
+ }
+
+ private boolean isGlobalPriorityActiveLocked() {
+ return mGlobalPrioritySession != null && mGlobalPrioritySession.isActive();
+ }
+
+ @Override
+ public void updateSession(MediaSessionRecord record) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
+ return;
+ }
+ if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Global priority session is updated, active=" + record.isActive());
+ }
+ user.pushAddressedPlayerChangedLocked();
+ } else {
+ if (!user.mPriorityStack.contains(record)) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
+ return;
+ }
+ user.mPriorityStack.onSessionStateChange(record);
+ }
+ mHandler.postSessionsChanged(record.getUserId());
+ }
+ }
+
+ @Override
+ public void setGlobalPrioritySession(MediaSessionRecord record) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (mGlobalPrioritySession != record) {
+ Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession
+ + " to " + record);
+ mGlobalPrioritySession = record;
+ if (user != null && user.mPriorityStack.contains(record)) {
+ // Handle the global priority session separately.
+ // Otherwise, it can be the media button session regardless of the active state
+ // because it or other system components might have been the lastly played media
+ // app.
+ user.mPriorityStack.removeSession(record);
+ }
+ }
+ }
+ }
+
+ private List<MediaSessionRecord> getActiveSessionsLocked(int userId) {
+ List<MediaSessionRecord> records = new ArrayList<>();
+ if (userId == USER_ALL) {
+ int size = mUserRecords.size();
+ for (int i = 0; i < size; i++) {
+ records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId));
+ }
+ } else {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "getSessions failed. Unknown user " + userId);
+ return records;
+ }
+ records.addAll(user.mPriorityStack.getActiveSessions(userId));
+ }
+
+ // Return global priority session at the first whenever it's asked.
+ if (isGlobalPriorityActiveLocked()
+ && (userId == USER_ALL || userId == mGlobalPrioritySession.getUserId())) {
+ records.add(0, mGlobalPrioritySession);
+ }
+ return records;
+ }
+
+ List<Session2Token> getSession2TokensLocked(int userId) {
+ List<Session2Token> list = new ArrayList<>();
+ if (userId == USER_ALL) {
+ for (int i = 0; i < mSession2TokensPerUser.size(); i++) {
+ list.addAll(mSession2TokensPerUser.valueAt(i));
+ }
+ } else {
+ list.addAll(mSession2TokensPerUser.get(userId));
+ }
+ return list;
+ }
+
+ /**
+ * Tells the system UI that volume has changed on an active remote session.
+ */
+ public void notifyRemoteVolumeChanged(int flags, MediaSessionRecord session) {
+ if (mRvc == null || !session.isActive()) {
+ return;
+ }
+ try {
+ mRvc.remoteVolumeChanged(session.getControllerBinder(), flags);
+ } catch (Exception e) {
+ Log.wtf(TAG, "Error sending volume change to system UI.", e);
+ }
+ }
+
+ @Override
+ public void onSessionPlaystateChanged(MediaSessionRecord record, int oldState, int newState) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null || !user.mPriorityStack.contains(record)) {
+ Log.d(TAG, "Unknown session changed playback state. Ignoring.");
+ return;
+ }
+ user.mPriorityStack.onPlaystateChanged(record, oldState, newState);
+ }
+ }
+
+ @Override
+ public void onSessionPlaybackTypeChanged(MediaSessionRecord record) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null || !user.mPriorityStack.contains(record)) {
+ Log.d(TAG, "Unknown session changed playback type. Ignoring.");
+ return;
+ }
+ pushRemoteVolumeUpdateLocked(record.getUserId());
+ }
+ }
+
+ @Override
+ public void onStartUser(int userId) {
+ if (DEBUG) Log.d(TAG, "onStartUser: " + userId);
+ updateUser();
+ }
+
+ @Override
+ public void onSwitchUser(int userId) {
+ if (DEBUG) Log.d(TAG, "onSwitchUser: " + userId);
+ updateUser();
+ }
+
+ // Called when the user with the userId is removed.
+ @Override
+ public void onStopUser(int userId) {
+ if (DEBUG) Log.d(TAG, "onStopUser: " + userId);
+ synchronized (mLock) {
+ // TODO: Also handle removing user in updateUser() because adding/switching user is
+ // handled in updateUser().
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user != null) {
+ if (user.mFullUserId == userId) {
+ user.destroySessionsForUserLocked(USER_ALL);
+ mUserRecords.remove(userId);
+ } else {
+ user.destroySessionsForUserLocked(userId);
+ }
+ }
+ mSession2TokensPerUser.remove(userId);
+ updateUser();
+ }
+ }
+
+ @Override
+ public void monitor() {
+ synchronized (mLock) {
+ // Check for deadlock
+ }
+ }
+
+ protected void enforcePhoneStatePermission(int pid, int uid) {
+ if (mContext.checkPermission(android.Manifest.permission.MODIFY_PHONE_STATE, pid, uid)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold the MODIFY_PHONE_STATE permission.");
+ }
+ }
+
+ void sessionDied(MediaSessionRecord session) {
+ synchronized (mLock) {
+ destroySessionLocked(session);
+ }
+ }
+
+ void destroySession(MediaSessionRecord session) {
+ synchronized (mLock) {
+ destroySessionLocked(session);
+ }
+ }
+
+ private void updateUser() {
+ synchronized (mLock) {
+ UserManager manager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mFullUserIds.clear();
+ List<UserInfo> allUsers = manager.getUsers();
+ if (allUsers != null) {
+ for (UserInfo userInfo : allUsers) {
+ if (userInfo.isManagedProfile()) {
+ mFullUserIds.put(userInfo.id, userInfo.profileGroupId);
+ } else {
+ mFullUserIds.put(userInfo.id, userInfo.id);
+ if (mUserRecords.get(userInfo.id) == null) {
+ mUserRecords.put(userInfo.id, new FullUserRecord(userInfo.id));
+ }
+ }
+ if (mSession2TokensPerUser.get(userInfo.id) == null) {
+ mSession2TokensPerUser.put(userInfo.id, new ArrayList<>());
+ }
+ }
+ }
+ // Ensure that the current full user exists.
+ int currentFullUserId = ActivityManager.getCurrentUser();
+ mCurrentFullUserRecord = mUserRecords.get(currentFullUserId);
+ if (mCurrentFullUserRecord == null) {
+ Log.w(TAG, "Cannot find FullUserInfo for the current user " + currentFullUserId);
+ mCurrentFullUserRecord = new FullUserRecord(currentFullUserId);
+ mUserRecords.put(currentFullUserId, mCurrentFullUserRecord);
+ if (mSession2TokensPerUser.get(currentFullUserId) == null) {
+ mSession2TokensPerUser.put(currentFullUserId, new ArrayList<>());
+ }
+ }
+ mFullUserIds.put(currentFullUserId, currentFullUserId);
+ }
+ }
+
+ private void updateActiveSessionListeners() {
+ synchronized (mLock) {
+ for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
+ SessionsListenerRecord listener = mSessionsListeners.get(i);
+ try {
+ enforceMediaPermissions(listener.componentName, listener.pid, listener.uid,
+ listener.userId);
+ } catch (SecurityException e) {
+ Log.i(TAG, "ActiveSessionsListener " + listener.componentName
+ + " is no longer authorized. Disconnecting.");
+ mSessionsListeners.remove(i);
+ try {
+ listener.listener
+ .onActiveSessionsChanged(new ArrayList<MediaSession.Token>());
+ } catch (Exception e1) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * When a session is removed several things need to happen.
+ * 1. We need to remove it from the relevant user.
+ * 2. We need to remove it from the priority stack.
+ * 3. We need to remove it from all sessions.
+ * 4. If this is the system priority session we need to clear it.
+ * 5. We need to unlink to death from the cb binder
+ * 6. We need to tell the session to do any final cleanup (onDestroy)
+ */
+ private void destroySessionLocked(MediaSessionRecord session) {
+ if (DEBUG) {
+ Log.d(TAG, "Destroying " + session);
+ }
+ FullUserRecord user = getFullUserRecordLocked(session.getUserId());
+ if (mGlobalPrioritySession == session) {
+ mGlobalPrioritySession = null;
+ if (session.isActive() && user != null) {
+ user.pushAddressedPlayerChangedLocked();
+ }
+ } else {
+ if (user != null) {
+ user.mPriorityStack.removeSession(session);
+ }
+ }
+
+ try {
+ session.getCallback().getBinder().unlinkToDeath(session, 0);
+ } catch (Exception e) {
+ // ignore exceptions while destroying a session.
+ }
+ session.onDestroy();
+ mHandler.postSessionsChanged(session.getUserId());
+ }
+
+ private void enforcePackageName(String packageName, int uid) {
+ if (TextUtils.isEmpty(packageName)) {
+ throw new IllegalArgumentException("packageName may not be empty");
+ }
+ String[] packages = mContext.getPackageManager().getPackagesForUid(uid);
+ final int packageCount = packages.length;
+ for (int i = 0; i < packageCount; i++) {
+ if (packageName.equals(packages[i])) {
+ return;
+ }
+ }
+ throw new IllegalArgumentException("packageName is not owned by the calling process");
+ }
+
+ /**
+ * Checks a caller's authorization to register an IRemoteControlDisplay.
+ * Authorization is granted if one of the following is true:
+ * <ul>
+ * <li>the caller has android.Manifest.permission.MEDIA_CONTENT_CONTROL
+ * permission</li>
+ * <li>the caller's listener is one of the enabled notification listeners
+ * for the caller's user</li>
+ * </ul>
+ */
+ private void enforceMediaPermissions(ComponentName compName, int pid, int uid,
+ int resolvedUserId) {
+ if (isCurrentVolumeController(pid, uid)) return;
+ if (mContext
+ .checkPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
+ != PackageManager.PERMISSION_GRANTED
+ && !isEnabledNotificationListener(compName, UserHandle.getUserId(uid),
+ resolvedUserId)) {
+ throw new SecurityException("Missing permission to control media.");
+ }
+ }
+
+ private boolean isCurrentVolumeController(int pid, int uid) {
+ return mContext.checkPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
+ pid, uid) == PackageManager.PERMISSION_GRANTED;
+ }
+
+ private void enforceSystemUiPermission(String action, int pid, int uid) {
+ if (!isCurrentVolumeController(pid, uid)) {
+ throw new SecurityException("Only system ui may " + action);
+ }
+ }
+
+ /**
+ * This checks if the component is an enabled notification listener for the
+ * specified user. Enabled components may only operate on behalf of the user
+ * they're running as.
+ *
+ * @param compName The component that is enabled.
+ * @param userId The user id of the caller.
+ * @param forUserId The user id they're making the request on behalf of.
+ * @return True if the component is enabled, false otherwise
+ */
+ private boolean isEnabledNotificationListener(ComponentName compName, int userId,
+ int forUserId) {
+ if (userId != forUserId) {
+ // You may not access another user's content as an enabled listener.
+ return false;
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Checking if enabled notification listener " + compName);
+ }
+ if (compName != null) {
+ try {
+ return mNotificationManager.isNotificationListenerAccessGrantedForUser(
+ compName, userId);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Dead NotificationManager in isEnabledNotificationListener", e);
+ }
+ }
+ return false;
+ }
+
+ private MediaSessionRecord createSessionInternal(int callerPid, int callerUid, int userId,
+ String callerPackageName, SessionCallbackLink cb, String tag) throws RemoteException {
+ synchronized (mLock) {
+ return createSessionLocked(callerPid, callerUid, userId, callerPackageName, cb, tag);
+ }
+ }
+
+ /*
+ * When a session is created the following things need to happen.
+ * 1. Its callback binder needs a link to death
+ * 2. It needs to be added to all sessions.
+ * 3. It needs to be added to the priority stack.
+ * 4. It needs to be added to the relevant user record.
+ */
+ private MediaSessionRecord createSessionLocked(int callerPid, int callerUid, int userId,
+ String callerPackageName, SessionCallbackLink cb, String tag) {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.wtf(TAG, "Request from invalid user: " + userId);
+ throw new RuntimeException("Session request from invalid user.");
+ }
+
+ final MediaSessionRecord session = new MediaSessionRecord(callerPid, callerUid, userId,
+ callerPackageName, cb, tag, this, mHandler.getLooper());
+ try {
+ cb.getBinder().linkToDeath(session, 0);
+ } catch (RemoteException e) {
+ throw new RuntimeException("Media Session owner died prematurely.", e);
+ }
+
+ user.mPriorityStack.addSession(session);
+ mHandler.postSessionsChanged(userId);
+
+ if (DEBUG) {
+ Log.d(TAG, "Created session for " + callerPackageName + " with tag " + tag);
+ }
+ return session;
+ }
+
+ private int findIndexOfSessionsListenerLocked(IActiveSessionsListener listener) {
+ for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
+ if (mSessionsListeners.get(i).listener.asBinder() == listener.asBinder()) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private int findIndexOfSession2TokensListenerLocked(ISession2TokensListener listener) {
+ for (int i = mSession2TokensListenerRecords.size() - 1; i >= 0; i--) {
+ if (mSession2TokensListenerRecords.get(i).listener.asBinder() == listener.asBinder()) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+ private void pushSessionsChanged(int userId) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId);
+ return;
+ }
+ List<MediaSessionRecord> records = getActiveSessionsLocked(userId);
+ int size = records.size();
+ ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
+ for (int i = 0; i < size; i++) {
+ tokens.add(new MediaSession.Token(records.get(i).getControllerBinder()));
+ }
+ pushRemoteVolumeUpdateLocked(userId);
+ for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
+ SessionsListenerRecord record = mSessionsListeners.get(i);
+ if (record.userId == USER_ALL || record.userId == userId) {
+ try {
+ record.listener.onActiveSessionsChanged(tokens);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Dead ActiveSessionsListener in pushSessionsChanged, removing",
+ e);
+ mSessionsListeners.remove(i);
+ }
+ }
+ }
+ }
+ }
+
+ private void pushRemoteVolumeUpdateLocked(int userId) {
+ if (mRvc != null) {
+ try {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "pushRemoteVolumeUpdateLocked failed. No user with id=" + userId);
+ return;
+ }
+ MediaSessionRecord record = user.mPriorityStack.getDefaultRemoteSession(userId);
+ mRvc.updateRemoteController(record == null ? null : record.getControllerBinder());
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error sending default remote volume to sys ui.", e);
+ }
+ }
+ }
+
+ void pushSession2TokensChangedLocked(int userId) {
+ List<Session2Token> allSession2Tokens = getSession2TokensLocked(USER_ALL);
+ List<Session2Token> session2Tokens = getSession2TokensLocked(userId);
+
+ for (int i = mSession2TokensListenerRecords.size() - 1; i >= 0; i--) {
+ Session2TokensListenerRecord listenerRecord = mSession2TokensListenerRecords.get(i);
+ try {
+ if (listenerRecord.userId == USER_ALL) {
+ listenerRecord.listener.onSession2TokensChanged(allSession2Tokens);
+ } else if (listenerRecord.userId == userId) {
+ listenerRecord.listener.onSession2TokensChanged(session2Tokens);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to notify Session2Token change. Removing listener.", e);
+ mSession2TokensListenerRecords.remove(i);
+ }
+ }
+ }
+
+ /**
+ * Called when the media button receiver for the {@code record} is changed.
+ *
+ * @param record the media session whose media button receiver is updated.
+ */
+ public void onMediaButtonReceiverChanged(MediaSessionRecord record) {
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ MediaSessionRecord mediaButtonSession =
+ user.mPriorityStack.getMediaButtonSession();
+ if (record == mediaButtonSession) {
+ user.rememberMediaButtonReceiverLocked(mediaButtonSession);
+ }
+ }
+ }
+
+ private String getCallingPackageName(int uid) {
+ String[] packages = mContext.getPackageManager().getPackagesForUid(uid);
+ if (packages != null && packages.length > 0) {
+ return packages[0];
+ }
+ return "";
+ }
+
+ private void dispatchVolumeKeyLongPressLocked(KeyEvent keyEvent) {
+ if (mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) {
+ return;
+ }
+ try {
+ mCurrentFullUserRecord.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send " + keyEvent + " to volume key long-press listener");
+ }
+ }
+
+ private FullUserRecord getFullUserRecordLocked(int userId) {
+ int fullUserId = mFullUserIds.get(userId, -1);
+ if (fullUserId < 0) {
+ return null;
+ }
+ return mUserRecords.get(fullUserId);
+ }
+
+ /**
+ * Information about a full user and its corresponding managed profiles.
+ *
+ * <p>Since the full user runs together with its managed profiles, a user wouldn't differentiate
+ * them when he/she presses a media/volume button. So keeping media sessions for them in one
+ * place makes more sense and increases the readability.</p>
+ * <p>The contents of this object is guarded by {@link #mLock}.
+ */
+ final class FullUserRecord implements MediaSessionStack.OnMediaButtonSessionChangedListener {
+ public static final int COMPONENT_TYPE_INVALID = 0;
+ public static final int COMPONENT_TYPE_BROADCAST = 1;
+ public static final int COMPONENT_TYPE_ACTIVITY = 2;
+ public static final int COMPONENT_TYPE_SERVICE = 3;
+ private static final String COMPONENT_NAME_USER_ID_DELIM = ",";
+
+ private final int mFullUserId;
+ private final MediaSessionStack mPriorityStack;
+ private PendingIntent mLastMediaButtonReceiver;
+ private ComponentName mRestoredMediaButtonReceiver;
+ private int mRestoredMediaButtonReceiverComponentType;
+ private int mRestoredMediaButtonReceiverUserId;
+
+ private IOnVolumeKeyLongPressListener mOnVolumeKeyLongPressListener;
+ private int mOnVolumeKeyLongPressListenerUid;
+ private KeyEvent mInitialDownVolumeKeyEvent;
+ private int mInitialDownVolumeStream;
+ private boolean mInitialDownMusicOnly;
+
+ private IOnMediaKeyListener mOnMediaKeyListener;
+ private int mOnMediaKeyListenerUid;
+ private ICallback mCallback;
+
+ FullUserRecord(int fullUserId) {
+ mFullUserId = fullUserId;
+ mPriorityStack = new MediaSessionStack(mAudioPlayerStateMonitor, this);
+ // Restore the remembered media button receiver before the boot.
+ String mediaButtonReceiverInfo = Settings.Secure.getStringForUser(mContentResolver,
+ Settings.System.MEDIA_BUTTON_RECEIVER, mFullUserId);
+ if (mediaButtonReceiverInfo == null) {
+ return;
+ }
+ String[] tokens = mediaButtonReceiverInfo.split(COMPONENT_NAME_USER_ID_DELIM);
+ if (tokens == null || (tokens.length != 2 && tokens.length != 3)) {
+ return;
+ }
+ mRestoredMediaButtonReceiver = ComponentName.unflattenFromString(tokens[0]);
+ mRestoredMediaButtonReceiverUserId = Integer.parseInt(tokens[1]);
+ if (tokens.length == 3) {
+ mRestoredMediaButtonReceiverComponentType = Integer.parseInt(tokens[2]);
+ } else {
+ mRestoredMediaButtonReceiverComponentType =
+ getComponentType(mRestoredMediaButtonReceiver);
+ }
+ }
+
+ public void destroySessionsForUserLocked(int userId) {
+ List<MediaSessionRecord> sessions = mPriorityStack.getPriorityList(false, userId);
+ for (MediaSessionRecord session : sessions) {
+ MediaSessionServiceImpl.this.destroySessionLocked(session);
+ }
+ }
+
+ public void dumpLocked(PrintWriter pw, String prefix) {
+ pw.print(prefix + "Record for full_user=" + mFullUserId);
+ // Dump managed profile user ids associated with this user.
+ int size = mFullUserIds.size();
+ for (int i = 0; i < size; i++) {
+ if (mFullUserIds.keyAt(i) != mFullUserIds.valueAt(i)
+ && mFullUserIds.valueAt(i) == mFullUserId) {
+ pw.print(", profile_user=" + mFullUserIds.keyAt(i));
+ }
+ }
+ pw.println();
+ String indent = prefix + " ";
+ pw.println(indent + "Volume key long-press listener: " + mOnVolumeKeyLongPressListener);
+ pw.println(indent + "Volume key long-press listener package: "
+ + getCallingPackageName(mOnVolumeKeyLongPressListenerUid));
+ pw.println(indent + "Media key listener: " + mOnMediaKeyListener);
+ pw.println(indent + "Media key listener package: "
+ + getCallingPackageName(mOnMediaKeyListenerUid));
+ pw.println(indent + "Callback: " + mCallback);
+ pw.println(indent + "Last MediaButtonReceiver: " + mLastMediaButtonReceiver);
+ pw.println(indent + "Restored MediaButtonReceiver: " + mRestoredMediaButtonReceiver);
+ pw.println(indent + "Restored MediaButtonReceiverComponentType: "
+ + mRestoredMediaButtonReceiverComponentType);
+ mPriorityStack.dump(pw, indent);
+ pw.println(indent + "Session2Tokens:");
+ for (int i = 0; i < mSession2TokensPerUser.size(); i++) {
+ List<Session2Token> list = mSession2TokensPerUser.valueAt(i);
+ if (list == null || list.size() == 0) {
+ continue;
+ }
+ for (Session2Token token : list) {
+ pw.println(indent + " " + token);
+ }
+ }
+ }
+
+ @Override
+ public void onMediaButtonSessionChanged(MediaSessionRecord oldMediaButtonSession,
+ MediaSessionRecord newMediaButtonSession) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Media button session is changed to " + newMediaButtonSession);
+ }
+ synchronized (mLock) {
+ if (oldMediaButtonSession != null) {
+ mHandler.postSessionsChanged(oldMediaButtonSession.getUserId());
+ }
+ if (newMediaButtonSession != null) {
+ rememberMediaButtonReceiverLocked(newMediaButtonSession);
+ mHandler.postSessionsChanged(newMediaButtonSession.getUserId());
+ }
+ pushAddressedPlayerChangedLocked();
+ }
+ }
+
+ // Remember media button receiver and keep it in the persistent storage.
+ public void rememberMediaButtonReceiverLocked(MediaSessionRecord record) {
+ PendingIntent receiver = record.getMediaButtonReceiver();
+ mLastMediaButtonReceiver = receiver;
+ mRestoredMediaButtonReceiver = null;
+ mRestoredMediaButtonReceiverComponentType = COMPONENT_TYPE_INVALID;
+
+ String mediaButtonReceiverInfo = "";
+ if (receiver != null) {
+ ComponentName component = receiver.getIntent().getComponent();
+ if (component != null
+ && record.getPackageName().equals(component.getPackageName())) {
+ String componentName = component.flattenToString();
+ int componentType = getComponentType(component);
+ mediaButtonReceiverInfo = String.join(COMPONENT_NAME_USER_ID_DELIM,
+ componentName, String.valueOf(record.getUserId()),
+ String.valueOf(componentType));
+ }
+ }
+ Settings.Secure.putStringForUser(mContentResolver,
+ Settings.System.MEDIA_BUTTON_RECEIVER, mediaButtonReceiverInfo,
+ mFullUserId);
+ }
+
+ private void pushAddressedPlayerChangedLocked() {
+ if (mCallback == null) {
+ return;
+ }
+ try {
+ MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
+ if (mediaButtonSession != null) {
+ mCallback.onAddressedPlayerChangedToMediaSession(
+ new MediaSession.Token(mediaButtonSession.getControllerBinder()));
+ } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
+ mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
+ mCurrentFullUserRecord.mLastMediaButtonReceiver
+ .getIntent().getComponent());
+ } else if (mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
+ mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
+ mCurrentFullUserRecord.mRestoredMediaButtonReceiver);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
+ }
+ }
+
+ private MediaSessionRecord getMediaButtonSessionLocked() {
+ return isGlobalPriorityActiveLocked()
+ ? mGlobalPrioritySession : mPriorityStack.getMediaButtonSession();
+ }
+
+ private int getComponentType(@Nullable ComponentName componentName) {
+ if (componentName == null) {
+ return COMPONENT_TYPE_INVALID;
+ }
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ ActivityInfo activityInfo = pm.getActivityInfo(componentName,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.GET_ACTIVITIES);
+ if (activityInfo != null) {
+ return COMPONENT_TYPE_ACTIVITY;
+ }
+ } catch (NameNotFoundException e) {
+ }
+ try {
+ ServiceInfo serviceInfo = pm.getServiceInfo(componentName,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.GET_SERVICES);
+ if (serviceInfo != null) {
+ return COMPONENT_TYPE_SERVICE;
+ }
+ } catch (NameNotFoundException e) {
+ }
+ // Pick legacy behavior for BroadcastReceiver or unknown.
+ return COMPONENT_TYPE_BROADCAST;
+ }
+ }
+
+ final class SessionsListenerRecord implements IBinder.DeathRecipient {
+ public final IActiveSessionsListener listener;
+ public final ComponentName componentName;
+ public final int userId;
+ public final int pid;
+ public final int uid;
+
+ SessionsListenerRecord(IActiveSessionsListener listener,
+ ComponentName componentName,
+ int userId, int pid, int uid) {
+ this.listener = listener;
+ this.componentName = componentName;
+ this.userId = userId;
+ this.pid = pid;
+ this.uid = uid;
+ }
+
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ mSessionsListeners.remove(this);
+ }
+ }
+ }
+
+ final class Session2TokensListenerRecord implements IBinder.DeathRecipient {
+ public final ISession2TokensListener listener;
+ public final int userId;
+
+ Session2TokensListenerRecord(ISession2TokensListener listener,
+ int userId) {
+ this.listener = listener;
+ this.userId = userId;
+ }
+
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ mSession2TokensListenerRecords.remove(this);
+ }
+ }
+ }
+
+ final class SettingsObserver extends ContentObserver {
+ private final Uri mSecureSettingsUri = Settings.Secure.getUriFor(
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
+
+ private SettingsObserver() {
+ super(null);
+ }
+
+ private void observe() {
+ mContentResolver.registerContentObserver(mSecureSettingsUri,
+ false, this, USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateActiveSessionListeners();
+ }
+ }
+
+ class SessionManagerImpl extends ISessionManager.Stub {
+ private static final String EXTRA_WAKELOCK_ACQUIRED =
+ "android.media.AudioService.WAKELOCK_ACQUIRED";
+ private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number
+
+ private boolean mVoiceButtonDown = false;
+ private boolean mVoiceButtonHandled = false;
+
+ @Override
+ public ISession createSession(String packageName, SessionCallbackLink cb, String tag,
+ int userId) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ enforcePackageName(packageName, uid);
+ int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
+ false /* allowAll */, true /* requireFull */, "createSession", packageName);
+ if (cb == null) {
+ throw new IllegalArgumentException("Controller callback cannot be null");
+ }
+ return createSessionInternal(pid, uid, resolvedUserId, packageName, cb, tag)
+ .getSessionBinder();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void notifySession2Created(Session2Token sessionToken) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (DEBUG) {
+ Log.d(TAG, "Session2 is created " + sessionToken);
+ }
+ if (uid != sessionToken.getUid()) {
+ throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid
+ + " but actually=" + sessionToken.getUid());
+ }
+ Controller2Callback callback = new Controller2Callback(sessionToken);
+ // Note: It's safe not to keep controller here because it wouldn't be GC'ed until
+ // it's closed.
+ // TODO: Keep controller as well for better readability
+ // because the GC behavior isn't straightforward.
+ MediaController2 controller = new MediaController2(mContext, sessionToken,
+ new HandlerExecutor(mHandler), callback);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public List<IBinder> getSessions(ComponentName componentName, int userId) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
+ ArrayList<IBinder> binders = new ArrayList<IBinder>();
+ synchronized (mLock) {
+ List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId);
+ for (MediaSessionRecord record : records) {
+ binders.add(record.getControllerBinder().asBinder());
+ }
+ }
+ return binders;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public List<Session2Token> getSession2Tokens(int userId) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ // Check that they can make calls on behalf of the user and
+ // get the final user id
+ int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
+ true /* allowAll */, true /* requireFull */, "getSession2Tokens",
+ null /* optional packageName */);
+ List<Session2Token> result;
+ synchronized (mLock) {
+ result = getSession2TokensLocked(resolvedUserId);
+ }
+ return result;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void addSessionsListener(IActiveSessionsListener listener,
+ ComponentName componentName, int userId) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
+ synchronized (mLock) {
+ int index = findIndexOfSessionsListenerLocked(listener);
+ if (index != -1) {
+ Log.w(TAG, "ActiveSessionsListener is already added, ignoring");
+ return;
+ }
+ SessionsListenerRecord record = new SessionsListenerRecord(listener,
+ componentName, resolvedUserId, pid, uid);
+ try {
+ listener.asBinder().linkToDeath(record, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "ActiveSessionsListener is dead, ignoring it", e);
+ return;
+ }
+ mSessionsListeners.add(record);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void removeSessionsListener(IActiveSessionsListener listener)
+ throws RemoteException {
+ synchronized (mLock) {
+ int index = findIndexOfSessionsListenerLocked(listener);
+ if (index != -1) {
+ SessionsListenerRecord record = mSessionsListeners.remove(index);
+ try {
+ record.listener.asBinder().unlinkToDeath(record, 0);
+ } catch (Exception e) {
+ // ignore exceptions, the record is being removed
+ }
+ }
+ }
+ }
+
+ @Override
+ public void addSession2TokensListener(ISession2TokensListener listener,
+ int userId) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ // Check that they can make calls on behalf of the user and get the final user id.
+ int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
+ true /* allowAll */, true /* requireFull */, "addSession2TokensListener",
+ null /* optional packageName */);
+ synchronized (mLock) {
+ int index = findIndexOfSession2TokensListenerLocked(listener);
+ if (index >= 0) {
+ Log.w(TAG, "addSession2TokensListener is already added, ignoring");
+ return;
+ }
+ mSession2TokensListenerRecords.add(
+ new Session2TokensListenerRecord(listener, resolvedUserId));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void removeSession2TokensListener(ISession2TokensListener listener) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ synchronized (mLock) {
+ int index = findIndexOfSession2TokensListenerLocked(listener);
+ if (index >= 0) {
+ Session2TokensListenerRecord listenerRecord =
+ mSession2TokensListenerRecords.remove(index);
+ try {
+ listenerRecord.listener.asBinder().unlinkToDeath(listenerRecord, 0);
+ } catch (Exception e) {
+ // Ignore exception.
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Handles the dispatching of the media button events to one of the
+ * registered listeners, or if there was none, broadcast an
+ * ACTION_MEDIA_BUTTON intent to the rest of the system.
+ *
+ * @param packageName The caller package
+ * @param asSystemService {@code true} if the event sent to the session as if it was come
+ * from the system service instead of the app process. This helps sessions to
+ * distinguish between the key injection by the app and key events from the
+ * hardware devices. Should be used only when the volume key events aren't handled
+ * by foreground activity. {@code false} otherwise to tell session about the real
+ * caller.
+ * @param keyEvent a non-null KeyEvent whose key code is one of the
+ * supported media buttons
+ * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held
+ * while this key event is dispatched.
+ */
+ @Override
+ public void dispatchMediaKeyEvent(String packageName, boolean asSystemService,
+ KeyEvent keyEvent, boolean needWakeLock) {
+ if (keyEvent == null || !KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
+ Log.w(TAG, "Attempted to dispatch null or non-media key event.");
+ return;
+ }
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (DEBUG) {
+ Log.d(TAG, "dispatchMediaKeyEvent, pkg=" + packageName + " pid=" + pid
+ + ", uid=" + uid + ", asSystem=" + asSystemService + ", event="
+ + keyEvent);
+ }
+ if (!isUserSetupComplete()) {
+ // Global media key handling can have the side-effect of starting new
+ // activities which is undesirable while setup is in progress.
+ Slog.i(TAG, "Not dispatching media key event because user "
+ + "setup is in progress.");
+ return;
+ }
+
+ synchronized (mLock) {
+ boolean isGlobalPriorityActive = isGlobalPriorityActiveLocked();
+ if (isGlobalPriorityActive && uid != Process.SYSTEM_UID) {
+ // Prevent dispatching key event through reflection while the global
+ // priority session is active.
+ Slog.i(TAG, "Only the system can dispatch media key event "
+ + "to the global priority session.");
+ return;
+ }
+ if (!isGlobalPriorityActive) {
+ if (mCurrentFullUserRecord.mOnMediaKeyListener != null) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Send " + keyEvent + " to the media key listener");
+ }
+ try {
+ mCurrentFullUserRecord.mOnMediaKeyListener.onMediaKey(keyEvent,
+ new MediaKeyListenerResultReceiver(packageName, pid, uid,
+ asSystemService, keyEvent, needWakeLock));
+ return;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send " + keyEvent
+ + " to the media key listener");
+ }
+ }
+ }
+ if (!isGlobalPriorityActive && isVoiceKey(keyEvent.getKeyCode())) {
+ handleVoiceKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent,
+ needWakeLock);
+ } else {
+ dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
+ keyEvent, needWakeLock);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void setCallback(ICallback callback) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (!UserHandle.isSameApp(uid, Process.BLUETOOTH_UID)) {
+ throw new SecurityException("Only Bluetooth service processes can set"
+ + " Callback");
+ }
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(uid);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the callback"
+ + ", userId=" + userId);
+ return;
+ }
+ user.mCallback = callback;
+ Log.d(TAG, "The callback " + user.mCallback
+ + " is set by " + getCallingPackageName(uid));
+ if (user.mCallback == null) {
+ return;
+ }
+ try {
+ user.mCallback.asBinder().linkToDeath(
+ new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ user.mCallback = null;
+ }
+ }
+ }, 0);
+ user.pushAddressedPlayerChangedLocked();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to set callback", e);
+ user.mCallback = null;
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void setOnVolumeKeyLongPressListener(IOnVolumeKeyLongPressListener listener) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Enforce SET_VOLUME_KEY_LONG_PRESS_LISTENER permission.
+ if (mContext.checkPermission(
+ android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER, pid, uid)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold the SET_VOLUME_KEY_LONG_PRESS_LISTENER"
+ + " permission.");
+ }
+
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(uid);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the volume key long-press listener"
+ + ", userId=" + userId);
+ return;
+ }
+ if (user.mOnVolumeKeyLongPressListener != null
+ && user.mOnVolumeKeyLongPressListenerUid != uid) {
+ Log.w(TAG, "The volume key long-press listener cannot be reset"
+ + " by another app , mOnVolumeKeyLongPressListener="
+ + user.mOnVolumeKeyLongPressListenerUid
+ + ", uid=" + uid);
+ return;
+ }
+
+ user.mOnVolumeKeyLongPressListener = listener;
+ user.mOnVolumeKeyLongPressListenerUid = uid;
+
+ Log.d(TAG, "The volume key long-press listener "
+ + listener + " is set by " + getCallingPackageName(uid));
+
+ if (user.mOnVolumeKeyLongPressListener != null) {
+ try {
+ user.mOnVolumeKeyLongPressListener.asBinder().linkToDeath(
+ new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ user.mOnVolumeKeyLongPressListener = null;
+ }
+ }
+ }, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to set death recipient "
+ + user.mOnVolumeKeyLongPressListener);
+ user.mOnVolumeKeyLongPressListener = null;
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void setOnMediaKeyListener(IOnMediaKeyListener listener) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Enforce SET_MEDIA_KEY_LISTENER permission.
+ if (mContext.checkPermission(
+ android.Manifest.permission.SET_MEDIA_KEY_LISTENER, pid, uid)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold the SET_MEDIA_KEY_LISTENER permission.");
+ }
+
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(uid);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the media key listener"
+ + ", userId=" + userId);
+ return;
+ }
+ if (user.mOnMediaKeyListener != null && user.mOnMediaKeyListenerUid != uid) {
+ Log.w(TAG, "The media key listener cannot be reset by another app. "
+ + ", mOnMediaKeyListenerUid=" + user.mOnMediaKeyListenerUid
+ + ", uid=" + uid);
+ return;
+ }
+
+ user.mOnMediaKeyListener = listener;
+ user.mOnMediaKeyListenerUid = uid;
+
+ Log.d(TAG, "The media key listener " + user.mOnMediaKeyListener
+ + " is set by " + getCallingPackageName(uid));
+
+ if (user.mOnMediaKeyListener != null) {
+ try {
+ user.mOnMediaKeyListener.asBinder().linkToDeath(
+ new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ user.mOnMediaKeyListener = null;
+ }
+ }
+ }, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to set death recipient " + user.mOnMediaKeyListener);
+ user.mOnMediaKeyListener = null;
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Handles the dispatching of the volume button events to one of the
+ * registered listeners. If there's a volume key long-press listener and
+ * there's no active global priority session, long-pressess will be sent to the
+ * long-press listener instead of adjusting volume.
+ *
+ * @param packageName The caller's package name, obtained by Context#getPackageName()
+ * @param opPackageName The caller's op package name, obtained by Context#getOpPackageName()
+ * @param asSystemService {@code true} if the event sent to the session as if it was come
+ * from the system service instead of the app process. This helps sessions to
+ * distinguish between the key injection by the app and key events from the
+ * hardware devices. Should be used only when the volume key events aren't handled
+ * by foreground activity. {@code false} otherwise to tell session about the real
+ * caller.
+ * @param keyEvent a non-null KeyEvent whose key code is one of the
+ * {@link KeyEvent#KEYCODE_VOLUME_UP},
+ * {@link KeyEvent#KEYCODE_VOLUME_DOWN},
+ * or {@link KeyEvent#KEYCODE_VOLUME_MUTE}.
+ * @param stream stream type to adjust volume.
+ * @param musicOnly true if both UI nor haptic feedback aren't needed when adjust volume.
+ */
+ @Override
+ public void dispatchVolumeKeyEvent(String packageName, String opPackageName,
+ boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) {
+ if (keyEvent == null
+ || (keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_UP
+ && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_DOWN
+ && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_MUTE)) {
+ Log.w(TAG, "Attempted to dispatch null or non-volume key event.");
+ return;
+ }
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "dispatchVolumeKeyEvent, pkg=" + packageName + ", pid=" + pid + ", uid="
+ + uid + ", asSystem=" + asSystemService + ", event=" + keyEvent);
+ }
+
+ try {
+ synchronized (mLock) {
+ if (isGlobalPriorityActiveLocked()
+ || mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) {
+ dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
+ asSystemService, keyEvent, stream, musicOnly);
+ } else {
+ // TODO: Consider the case when both volume up and down keys are pressed
+ // at the same time.
+ if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+ if (keyEvent.getRepeatCount() == 0) {
+ // Keeps the copy of the KeyEvent because it can be reused.
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent =
+ KeyEvent.obtain(keyEvent);
+ mCurrentFullUserRecord.mInitialDownVolumeStream = stream;
+ mCurrentFullUserRecord.mInitialDownMusicOnly = musicOnly;
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(
+ MessageHandler.MSG_VOLUME_INITIAL_DOWN,
+ mCurrentFullUserRecord.mFullUserId, 0),
+ mLongPressTimeout);
+ }
+ if (keyEvent.getRepeatCount() > 0 || keyEvent.isLongPress()) {
+ mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
+ if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null) {
+ dispatchVolumeKeyLongPressLocked(
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent);
+ // Mark that the key is already handled.
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent = null;
+ }
+ dispatchVolumeKeyLongPressLocked(keyEvent);
+ }
+ } else { // if up
+ mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
+ if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null
+ && mCurrentFullUserRecord.mInitialDownVolumeKeyEvent
+ .getDownTime() == keyEvent.getDownTime()) {
+ // Short-press. Should change volume.
+ dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
+ asSystemService,
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent,
+ mCurrentFullUserRecord.mInitialDownVolumeStream,
+ mCurrentFullUserRecord.mInitialDownMusicOnly);
+ dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
+ asSystemService, keyEvent, stream, musicOnly);
+ } else {
+ dispatchVolumeKeyLongPressLocked(keyEvent);
+ }
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ private void dispatchVolumeKeyEventLocked(String packageName, String opPackageName, int pid,
+ int uid, boolean asSystemService, KeyEvent keyEvent, int stream,
+ boolean musicOnly) {
+ boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
+ boolean up = keyEvent.getAction() == KeyEvent.ACTION_UP;
+ int direction = 0;
+ boolean isMute = false;
+ switch (keyEvent.getKeyCode()) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ direction = AudioManager.ADJUST_RAISE;
+ break;
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ direction = AudioManager.ADJUST_LOWER;
+ break;
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ isMute = true;
+ break;
+ }
+ if (down || up) {
+ int flags = AudioManager.FLAG_FROM_KEY;
+ if (musicOnly) {
+ // This flag is used when the screen is off to only affect active media.
+ flags |= AudioManager.FLAG_ACTIVE_MEDIA_ONLY;
+ } else {
+ // These flags are consistent with the home screen
+ if (up) {
+ flags |= AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE;
+ } else {
+ flags |= AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE;
+ }
+ }
+ if (direction != 0) {
+ // If this is action up we want to send a beep for non-music events
+ if (up) {
+ direction = 0;
+ }
+ dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid,
+ asSystemService, stream, direction, flags);
+ } else if (isMute) {
+ if (down && keyEvent.getRepeatCount() == 0) {
+ dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid,
+ asSystemService, stream, AudioManager.ADJUST_TOGGLE_MUTE, flags);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void dispatchAdjustVolume(String packageName, String opPackageName,
+ int suggestedStream, int delta, int flags) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid, false,
+ suggestedStream, delta, flags);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void setRemoteVolumeController(IRemoteVolumeController rvc) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ enforceSystemUiPermission("listen for volume changes", pid, uid);
+ mRvc = rvc;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public boolean isGlobalPriorityActive() {
+ synchronized (mLock) {
+ return isGlobalPriorityActiveLocked();
+ }
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+
+ pw.println("MEDIA SESSION SERVICE (dumpsys media_session)");
+ pw.println();
+
+ synchronized (mLock) {
+ pw.println(mSessionsListeners.size() + " sessions listeners.");
+ pw.println("Global priority session is " + mGlobalPrioritySession);
+ if (mGlobalPrioritySession != null) {
+ mGlobalPrioritySession.dump(pw, " ");
+ }
+ pw.println("User Records:");
+ int count = mUserRecords.size();
+ for (int i = 0; i < count; i++) {
+ mUserRecords.valueAt(i).dumpLocked(pw, "");
+ }
+ mAudioPlayerStateMonitor.dump(mContext, pw, "");
+ }
+ }
+
+ /**
+ * Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL
+ * permission or an enabled notification listener)
+ *
+ * @param controllerPackageName package name of the controller app
+ * @param controllerPid pid of the controller app
+ * @param controllerUid uid of the controller app
+ */
+ @Override
+ public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid)
+ throws RemoteException {
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Don't perform sanity check between controllerPackageName and controllerUid.
+ // When an (activity|service) runs on the another apps process by specifying
+ // android:process in the AndroidManifest.xml, then PID and UID would have the
+ // running process' information instead of the (activity|service) that has created
+ // MediaController.
+ // Note that we can use Context#getOpPackageName() instead of
+ // Context#getPackageName() for getting package name that matches with the PID/UID,
+ // but it doesn't tell which package has created the MediaController, so useless.
+ return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName,
+ controllerPid, controllerUid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ // For MediaSession
+ private int verifySessionsRequest(ComponentName componentName, int userId, final int pid,
+ final int uid) {
+ String packageName = null;
+ if (componentName != null) {
+ // If they gave us a component name verify they own the
+ // package
+ packageName = componentName.getPackageName();
+ enforcePackageName(packageName, uid);
+ }
+ // Check that they can make calls on behalf of the user and
+ // get the final user id
+ int resolvedUserId = ActivityManager.handleIncomingUser(pid, uid, userId,
+ true /* allowAll */, true /* requireFull */, "getSessions", packageName);
+ // Check if they have the permissions or their component is
+ // enabled for the user they're calling from.
+ enforceMediaPermissions(componentName, pid, uid, resolvedUserId);
+ return resolvedUserId;
+ }
+
+ private boolean hasMediaControlPermission(int resolvedUserId, String packageName,
+ int pid, int uid) throws RemoteException {
+ // Allow API calls from the System UI
+ if (isCurrentVolumeController(pid, uid)) {
+ return true;
+ }
+
+ // Check if it's system server or has MEDIA_CONTENT_CONTROL.
+ // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
+ // check here.
+ if (uid == Process.SYSTEM_UID || mContext.checkPermission(
+ android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
+ == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ } else if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
+ }
+
+ // You may not access another user's content as an enabled listener.
+ final int userId = UserHandle.getUserId(uid);
+ if (resolvedUserId != userId) {
+ return false;
+ }
+
+ // TODO(jaewan): (Post-P) Propose NotificationManager#hasEnabledNotificationListener(
+ // String pkgName) to notification team for optimization
+ final List<ComponentName> enabledNotificationListeners =
+ mNotificationManager.getEnabledNotificationListeners(userId);
+ if (enabledNotificationListeners != null) {
+ for (int i = 0; i < enabledNotificationListeners.size(); i++) {
+ if (TextUtils.equals(packageName,
+ enabledNotificationListeners.get(i).getPackageName())) {
+ return true;
+ }
+ }
+ }
+ if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled "
+ + "notification listener");
+ }
+ return false;
+ }
+
+ private void dispatchAdjustVolumeLocked(String packageName, String opPackageName, int pid,
+ int uid, boolean asSystemService, int suggestedStream, int direction, int flags) {
+ MediaSessionRecord session = isGlobalPriorityActiveLocked() ? mGlobalPrioritySession
+ : mCurrentFullUserRecord.mPriorityStack.getDefaultVolumeSession();
+
+ boolean preferSuggestedStream = false;
+ if (isValidLocalStreamType(suggestedStream)
+ && AudioSystem.isStreamActive(suggestedStream, 0)) {
+ preferSuggestedStream = true;
+ }
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags="
+ + flags + ", suggestedStream=" + suggestedStream
+ + ", preferSuggestedStream=" + preferSuggestedStream);
+ }
+ if (session == null || preferSuggestedStream) {
+ if ((flags & AudioManager.FLAG_ACTIVE_MEDIA_ONLY) != 0
+ && !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) {
+ if (DEBUG) {
+ Log.d(TAG, "No active session to adjust, skipping media only volume event");
+ }
+ return;
+ }
+
+ // Execute mAudioService.adjustSuggestedStreamVolume() on
+ // handler thread of MediaSessionService.
+ // This will release the MediaSessionService.mLock sooner and avoid
+ // a potential deadlock between MediaSessionService.mLock and
+ // ActivityManagerService lock.
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final String callingOpPackageName;
+ final int callingUid;
+ if (asSystemService) {
+ callingOpPackageName = mContext.getOpPackageName();
+ callingUid = Process.myUid();
+ } else {
+ callingOpPackageName = opPackageName;
+ callingUid = uid;
+ }
+ try {
+ mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(suggestedStream,
+ direction, flags, callingOpPackageName, callingUid);
+ } catch (SecurityException | IllegalArgumentException e) {
+ Log.e(TAG, "Cannot adjust volume: direction=" + direction
+ + ", suggestedStream=" + suggestedStream + ", flags=" + flags
+ + ", packageName=" + packageName + ", uid=" + uid
+ + ", asSystemService=" + asSystemService, e);
+ }
+ }
+ });
+ } else {
+ session.adjustVolume(packageName, opPackageName, pid, uid, null, asSystemService,
+ direction, flags, true);
+ }
+ }
+
+ private void handleVoiceKeyEventLocked(String packageName, int pid, int uid,
+ boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
+ int action = keyEvent.getAction();
+ boolean isLongPress = (keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
+ if (action == KeyEvent.ACTION_DOWN) {
+ if (keyEvent.getRepeatCount() == 0) {
+ mVoiceButtonDown = true;
+ mVoiceButtonHandled = false;
+ } else if (mVoiceButtonDown && !mVoiceButtonHandled && isLongPress) {
+ mVoiceButtonHandled = true;
+ startVoiceInput(needWakeLock);
+ }
+ } else if (action == KeyEvent.ACTION_UP) {
+ if (mVoiceButtonDown) {
+ mVoiceButtonDown = false;
+ if (!mVoiceButtonHandled && !keyEvent.isCanceled()) {
+ // Resend the down then send this event through
+ KeyEvent downEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_DOWN);
+ dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
+ downEvent, needWakeLock);
+ dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
+ keyEvent, needWakeLock);
+ }
+ }
+ }
+ }
+
+ private void dispatchMediaKeyEventLocked(String packageName, int pid, int uid,
+ boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
+ MediaSessionRecord session = mCurrentFullUserRecord.getMediaButtonSessionLocked();
+ if (session != null) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Sending " + keyEvent + " to " + session);
+ }
+ if (needWakeLock) {
+ mKeyEventReceiver.aquireWakeLockLocked();
+ }
+ // If we don't need a wakelock use -1 as the id so we won't release it later.
+ session.sendMediaButton(packageName, pid, uid, asSystemService, keyEvent,
+ needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
+ mKeyEventReceiver);
+ if (mCurrentFullUserRecord.mCallback != null) {
+ try {
+ mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession(
+ keyEvent, new MediaSession.Token(session.getControllerBinder()));
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
+ }
+ }
+ } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null
+ || mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
+ if (needWakeLock) {
+ mKeyEventReceiver.aquireWakeLockLocked();
+ }
+ Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+ mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
+ // TODO: Find a way to also send PID/UID in secure way.
+ String callerPackageName =
+ (asSystemService) ? mContext.getPackageName() : packageName;
+ mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callerPackageName);
+ try {
+ if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
+ PendingIntent receiver = mCurrentFullUserRecord.mLastMediaButtonReceiver;
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Sending " + keyEvent
+ + " to the last known PendingIntent " + receiver);
+ }
+ receiver.send(mContext,
+ needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
+ mediaButtonIntent, mKeyEventReceiver, mHandler);
+ if (mCurrentFullUserRecord.mCallback != null) {
+ ComponentName componentName = mCurrentFullUserRecord
+ .mLastMediaButtonReceiver.getIntent().getComponent();
+ if (componentName != null) {
+ mCurrentFullUserRecord.mCallback
+ .onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, componentName);
+ }
+ }
+ } else {
+ ComponentName receiver =
+ mCurrentFullUserRecord.mRestoredMediaButtonReceiver;
+ int componentType = mCurrentFullUserRecord
+ .mRestoredMediaButtonReceiverComponentType;
+ UserHandle userHandle = UserHandle.of(mCurrentFullUserRecord
+ .mRestoredMediaButtonReceiverUserId);
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
+ + receiver + ", type=" + componentType);
+ }
+ mediaButtonIntent.setComponent(receiver);
+ try {
+ switch (componentType) {
+ case FullUserRecord.COMPONENT_TYPE_ACTIVITY:
+ mContext.startActivityAsUser(mediaButtonIntent, userHandle);
+ break;
+ case FullUserRecord.COMPONENT_TYPE_SERVICE:
+ mContext.startForegroundServiceAsUser(mediaButtonIntent,
+ userHandle);
+ break;
+ default:
+ // Legacy behavior for other cases.
+ mContext.sendBroadcastAsUser(mediaButtonIntent, userHandle);
+ }
+ } catch (Exception e) {
+ Log.w(TAG, "Error sending media button to the restored intent "
+ + receiver + ", type=" + componentType, e);
+ }
+ if (mCurrentFullUserRecord.mCallback != null) {
+ mCurrentFullUserRecord.mCallback
+ .onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, receiver);
+ }
+ }
+ } catch (CanceledException e) {
+ Log.i(TAG, "Error sending key event to media button receiver "
+ + mCurrentFullUserRecord.mLastMediaButtonReceiver, e);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
+ }
+ }
+ }
+
+ private void startVoiceInput(boolean needWakeLock) {
+ Intent voiceIntent = null;
+ // select which type of search to launch:
+ // - screen on and device unlocked: action is ACTION_WEB_SEARCH
+ // - device locked or screen off: action is
+ // ACTION_VOICE_SEARCH_HANDS_FREE
+ // with EXTRA_SECURE set to true if the device is securely locked
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
+ if (!isLocked && pm.isScreenOn()) {
+ voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
+ Log.i(TAG, "voice-based interactions: about to use ACTION_WEB_SEARCH");
+ } else {
+ voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
+ voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE,
+ isLocked && mKeyguardManager.isKeyguardSecure());
+ Log.i(TAG, "voice-based interactions: about to use ACTION_VOICE_SEARCH_HANDS_FREE");
+ }
+ // start the search activity
+ if (needWakeLock) {
+ mMediaEventWakeLock.acquire();
+ }
+ try {
+ if (voiceIntent != null) {
+ voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ if (DEBUG) Log.d(TAG, "voiceIntent: " + voiceIntent);
+ mContext.startActivityAsUser(voiceIntent, UserHandle.CURRENT);
+ }
+ } catch (ActivityNotFoundException e) {
+ Log.w(TAG, "No activity for search: " + e);
+ } finally {
+ if (needWakeLock) {
+ mMediaEventWakeLock.release();
+ }
+ }
+ }
+
+ private boolean isVoiceKey(int keyCode) {
+ return keyCode == KeyEvent.KEYCODE_HEADSETHOOK
+ || (!mHasFeatureLeanback && keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
+ }
+
+ private boolean isUserSetupComplete() {
+ return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
+ }
+
+ // we only handle public stream types, which are 0-5
+ private boolean isValidLocalStreamType(int streamType) {
+ return streamType >= AudioManager.STREAM_VOICE_CALL
+ && streamType <= AudioManager.STREAM_NOTIFICATION;
+ }
+
+ private class MediaKeyListenerResultReceiver extends ResultReceiver implements Runnable {
+ private final String mPackageName;
+ private final int mPid;
+ private final int mUid;
+ private final boolean mAsSystemService;
+ private final KeyEvent mKeyEvent;
+ private final boolean mNeedWakeLock;
+ private boolean mHandled;
+
+ private MediaKeyListenerResultReceiver(String packageName, int pid, int uid,
+ boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
+ super(mHandler);
+ mHandler.postDelayed(this, MEDIA_KEY_LISTENER_TIMEOUT);
+ mPackageName = packageName;
+ mPid = pid;
+ mUid = uid;
+ mAsSystemService = asSystemService;
+ mKeyEvent = keyEvent;
+ mNeedWakeLock = needWakeLock;
+ }
+
+ @Override
+ public void run() {
+ Log.d(TAG, "The media key listener is timed-out for " + mKeyEvent);
+ dispatchMediaKeyEvent();
+ }
+
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode == MediaSessionManager.RESULT_MEDIA_KEY_HANDLED) {
+ mHandled = true;
+ mHandler.removeCallbacks(this);
+ return;
+ }
+ dispatchMediaKeyEvent();
+ }
+
+ private void dispatchMediaKeyEvent() {
+ if (mHandled) {
+ return;
+ }
+ mHandled = true;
+ mHandler.removeCallbacks(this);
+ synchronized (mLock) {
+ if (!isGlobalPriorityActiveLocked()
+ && isVoiceKey(mKeyEvent.getKeyCode())) {
+ handleVoiceKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
+ mKeyEvent, mNeedWakeLock);
+ } else {
+ dispatchMediaKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
+ mKeyEvent, mNeedWakeLock);
+ }
+ }
+ }
+ }
+
+ private KeyEventWakeLockReceiver mKeyEventReceiver = new KeyEventWakeLockReceiver(mHandler);
+
+ class KeyEventWakeLockReceiver extends ResultReceiver implements Runnable,
+ PendingIntent.OnFinished {
+ private final Handler mHandler;
+ private int mRefCount = 0;
+ private int mLastTimeoutId = 0;
+
+ KeyEventWakeLockReceiver(Handler handler) {
+ super(handler);
+ mHandler = handler;
+ }
+
+ public void onTimeout() {
+ synchronized (mLock) {
+ if (mRefCount == 0) {
+ // We've already released it, so just return
+ return;
+ }
+ mLastTimeoutId++;
+ mRefCount = 0;
+ releaseWakeLockLocked();
+ }
+ }
+
+ public void aquireWakeLockLocked() {
+ if (mRefCount == 0) {
+ mMediaEventWakeLock.acquire();
+ }
+ mRefCount++;
+ mHandler.removeCallbacks(this);
+ mHandler.postDelayed(this, WAKELOCK_TIMEOUT);
+
+ }
+
+ @Override
+ public void run() {
+ onTimeout();
+ }
+
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode < mLastTimeoutId) {
+ // Ignore results from calls that were before the last
+ // timeout, just in case.
+ return;
+ } else {
+ synchronized (mLock) {
+ if (mRefCount > 0) {
+ mRefCount--;
+ if (mRefCount == 0) {
+ releaseWakeLockLocked();
+ }
+ }
+ }
+ }
+ }
+
+ private void releaseWakeLockLocked() {
+ mMediaEventWakeLock.release();
+ mHandler.removeCallbacks(this);
+ }
+
+ @Override
+ public void onSendFinished(PendingIntent pendingIntent, Intent intent, int resultCode,
+ String resultData, Bundle resultExtras) {
+ onReceiveResult(resultCode, null);
+ }
+ };
+
+ BroadcastReceiver mKeyEventDone = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null) {
+ return;
+ }
+ Bundle extras = intent.getExtras();
+ if (extras == null) {
+ return;
+ }
+ synchronized (mLock) {
+ if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)
+ && mMediaEventWakeLock.isHeld()) {
+ mMediaEventWakeLock.release();
+ }
+ }
+ }
+ };
+ }
+
+ final class MessageHandler extends Handler {
+ private static final int MSG_SESSIONS_CHANGED = 1;
+ private static final int MSG_VOLUME_INITIAL_DOWN = 2;
+ private final SparseArray<Integer> mIntegerCache = new SparseArray<>();
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_SESSIONS_CHANGED:
+ pushSessionsChanged((int) msg.obj);
+ break;
+ case MSG_VOLUME_INITIAL_DOWN:
+ synchronized (mLock) {
+ FullUserRecord user = mUserRecords.get((int) msg.arg1);
+ if (user != null && user.mInitialDownVolumeKeyEvent != null) {
+ dispatchVolumeKeyLongPressLocked(user.mInitialDownVolumeKeyEvent);
+ // Mark that the key is already handled.
+ user.mInitialDownVolumeKeyEvent = null;
+ }
+ }
+ break;
+ }
+ }
+
+ public void postSessionsChanged(int userId) {
+ // Use object instead of the arguments when posting message to remove pending requests.
+ Integer userIdInteger = mIntegerCache.get(userId);
+ if (userIdInteger == null) {
+ userIdInteger = Integer.valueOf(userId);
+ mIntegerCache.put(userId, userIdInteger);
+ }
+ removeMessages(MSG_SESSIONS_CHANGED, userIdInteger);
+ obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget();
+ }
+ }
+
+ private class Controller2Callback extends MediaController2.ControllerCallback {
+ private final Session2Token mToken;
+
+ Controller2Callback(Session2Token token) {
+ mToken = token;
+ }
+
+ @Override
+ public void onConnected(MediaController2 controller, Session2CommandGroup allowedCommands) {
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(mToken.getUid());
+ mSession2TokensPerUser.get(userId).add(mToken);
+ pushSession2TokensChangedLocked(userId);
+ }
+ }
+
+ @Override
+ public void onDisconnected(MediaController2 controller) {
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(mToken.getUid());
+ mSession2TokensPerUser.get(userId).remove(mToken);
+ pushSession2TokensChangedLocked(userId);
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java b/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
index 6a5f563683a3..64c451d03caa 100644
--- a/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
+++ b/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
@@ -159,12 +159,13 @@ public final class RemoteDisplayProviderWatcher {
+ serviceInfo.packageName + "/" + serviceInfo.name);
return false;
}
- if (!hasCaptureVideoPermission(serviceInfo.packageName)) {
- // If the service does not have permission to capture video then it
- // isn't going to be terribly useful as a remote display, is it?
- // Kind of makes you wonder what it's doing there in the first place.
+ if (mPackageManager.checkPermission(Manifest.permission.REMOTE_DISPLAY_PROVIDER,
+ serviceInfo.packageName) != PackageManager.PERMISSION_GRANTED) {
+ // If the service does not have this permission then the system will not bind to it.
+ // This is to prevent non privileged apps declaring themselves as remote display
+ // providers just to be bound to by the system and keep their process alive.
Slog.w(TAG, "Ignoring remote display provider service because it does not "
- + "have the CAPTURE_VIDEO_OUTPUT or CAPTURE_SECURE_VIDEO_OUTPUT "
+ + "have the REMOTE_DISPLAY_PROVIDER "
+ "permission: " + serviceInfo.packageName + "/" + serviceInfo.name);
return false;
}
@@ -172,18 +173,6 @@ public final class RemoteDisplayProviderWatcher {
return true;
}
- private boolean hasCaptureVideoPermission(String packageName) {
- if (mPackageManager.checkPermission(Manifest.permission.CAPTURE_VIDEO_OUTPUT,
- packageName) == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- if (mPackageManager.checkPermission(Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT,
- packageName) == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- return false;
- }
-
private int findProvider(String packageName, String className) {
int count = mProviders.size();
for (int i = 0; i < count; i++) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 0d6dadfb1ad8..af55605975ca 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -270,14 +270,12 @@ import java.util.concurrent.TimeUnit;
* enforcement.
*
* <p>
- * This class uses 2-3 locks to synchronize state:
+ * This class uses 2 locks to synchronize state:
* <ul>
* <li>{@code mUidRulesFirstLock}: used to guard state related to individual UIDs (such as firewall
* rules).
* <li>{@code mNetworkPoliciesSecondLock}: used to guard state related to network interfaces (such
* as network policies).
- * <li>{@code allLocks}: not a "real" lock, but an indication (through @GuardedBy) that all locks
- * must be held.
* </ul>
*
* <p>
@@ -419,7 +417,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final Object mUidRulesFirstLock = new Object();
final Object mNetworkPoliciesSecondLock = new Object();
- @GuardedBy("allLocks") volatile boolean mSystemReady;
+ @GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"})
+ volatile boolean mSystemReady;
@GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictBackground;
@GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictPower;
@@ -558,7 +557,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private final ServiceThread mUidEventThread;
- @GuardedBy("allLocks")
+ @GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"})
private final AtomicFile mPolicyFile;
private final AppOpsManager mAppOps;
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index dc3bfbca893c..bffd60bcb87f 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -368,7 +368,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mStatsObservers = checkNotNull(statsObservers, "missing NetworkStatsObservers");
mSystemDir = checkNotNull(systemDir, "missing systemDir");
mBaseDir = checkNotNull(baseDir, "missing baseDir");
- mUseBpfTrafficStats = new File("/sys/fs/bpf/traffic_uid_stats_map").exists();
+ mUseBpfTrafficStats = new File("/sys/fs/bpf/map_netd_app_uid_stats_map").exists();
}
private void registerLocalService() {
@@ -962,12 +962,64 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override
public long getIfaceStats(String iface, int type) {
- return nativeGetIfaceStat(iface, type, checkBpfStatsEnable());
+ long nativeIfaceStats = nativeGetIfaceStat(iface, type, checkBpfStatsEnable());
+ if (nativeIfaceStats == -1) {
+ return nativeIfaceStats;
+ } else {
+ // When tethering offload is in use, nativeIfaceStats does not contain usage from
+ // offload, add it back here.
+ // When tethering offload is not in use, nativeIfaceStats contains tethering usage.
+ // this does not cause double-counting of tethering traffic, because
+ // NetdTetheringStatsProvider returns zero NetworkStats
+ // when called with STATS_PER_IFACE.
+ return nativeIfaceStats + getTetherStats(iface, type);
+ }
}
@Override
public long getTotalStats(int type) {
- return nativeGetTotalStat(type, checkBpfStatsEnable());
+ long nativeTotalStats = nativeGetTotalStat(type, checkBpfStatsEnable());
+ if (nativeTotalStats == -1) {
+ return nativeTotalStats;
+ } else {
+ // Refer to comment in getIfaceStats
+ return nativeTotalStats + getTetherStats(IFACE_ALL, type);
+ }
+ }
+
+ private long getTetherStats(String iface, int type) {
+ final NetworkStats tetherSnapshot;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ tetherSnapshot = getNetworkStatsTethering(STATS_PER_IFACE);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Error get TetherStats: " + e);
+ return 0;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ HashSet<String> limitIfaces;
+ if (iface == IFACE_ALL) {
+ limitIfaces = null;
+ } else {
+ limitIfaces = new HashSet<String>();
+ limitIfaces.add(iface);
+ }
+ NetworkStats.Entry entry = tetherSnapshot.getTotal(null, limitIfaces);
+ if (LOGD) Slog.d(TAG, "TetherStats: iface=" + iface + " type=" + type +
+ " entry=" + entry);
+ switch (type) {
+ case 0: // TYPE_RX_BYTES
+ return entry.rxBytes;
+ case 1: // TYPE_RX_PACKETS
+ return entry.rxPackets;
+ case 2: // TYPE_TX_BYTES
+ return entry.txBytes;
+ case 3: // TYPE_TX_PACKETS
+ return entry.txPackets;
+ default:
+ return 0;
+ }
}
private boolean checkBpfStatsEnable() {
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 88d73fb10902..c222e6948a3d 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -767,6 +767,23 @@ abstract public class ManagedServices {
return installed;
}
+ protected Set<String> getAllowedPackages() {
+ final Set<String> allowedPackages = new ArraySet<>();
+ for (int k = 0; k < mApproved.size(); k++) {
+ ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.valueAt(k);
+ for (int i = 0; i < allowedByType.size(); i++) {
+ final ArraySet<String> allowed = allowedByType.valueAt(i);
+ for (int j = 0; j < allowed.size(); j++) {
+ String pkgName = getPackageName(allowed.valueAt(j));
+ if (!TextUtils.isEmpty(pkgName)) {
+ allowedPackages.add(pkgName);
+ }
+ }
+ }
+ }
+ return allowedPackages;
+ }
+
private void trimApprovedListsAccordingToInstalledServices() {
int N = mApproved.size();
for (int i = 0 ; i < N; i++) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index c2c88258b067..20c4da416d1d 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -77,6 +77,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER;
import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER;
+import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER;
import static com.android.server.utils.PriorityDump.PRIORITY_ARG;
import static com.android.server.utils.PriorityDump.PRIORITY_ARG_CRITICAL;
import static com.android.server.utils.PriorityDump.PRIORITY_ARG_NORMAL;
@@ -765,8 +766,7 @@ public class NotificationManagerService extends SystemService {
.addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank)
.addTaggedData(MetricsEvent.NOTIFICATION_SHADE_COUNT, nv.count)
.addTaggedData(MetricsEvent.NOTIFICATION_ACTION_IS_SMART,
- (Notification.Action.SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION
- == action.getSemanticAction()) ? 1 : 0)
+ action.isContextual() ? 1 : 0)
.addTaggedData(
MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED,
generatedByAssistant ? 1 : 0));
@@ -878,7 +878,6 @@ public class NotificationManagerService extends SystemService {
if (r.hasBeenVisiblyExpanded()) {
logSmartSuggestionsVisible(r);
}
- final long now = System.currentTimeMillis();
if (userAction) {
MetricsLogger.action(r.getItemLogMaker()
.setType(expanded ? MetricsEvent.TYPE_DETAIL
@@ -888,9 +887,6 @@ public class NotificationManagerService extends SystemService {
r.recordExpanded();
reportUserInteraction(r);
}
- EventLogTags.writeNotificationExpansion(key,
- userAction ? 1 : 0, expanded ? 1 : 0,
- r.getLifespanMs(now), r.getFreshnessMs(now), r.getExposureMs(now));
mAssistants.notifyAssistantExpansionChangedLocked(r.sbn, userAction, expanded);
}
}
@@ -970,7 +966,7 @@ public class NotificationManagerService extends SystemService {
r.getNumSmartActionsAdded())
.addTaggedData(
MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED,
- r.getSuggestionsGeneratedByAssistant());
+ r.getSuggestionsGeneratedByAssistant() ? 1 : 0);
mMetricsLogger.write(logMaker);
}
}
@@ -1581,6 +1577,9 @@ public class NotificationManagerService extends SystemService {
mIsAutomotive =
mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0);
+
+ mPreferencesHelper.lockChannelsForOEM(getContext().getResources().getStringArray(
+ com.android.internal.R.array.config_nonBlockableNotificationPackages));
}
@Override
@@ -1702,8 +1701,16 @@ public class NotificationManagerService extends SystemService {
}
private void sendRegisteredOnlyBroadcast(String action) {
- getContext().sendBroadcastAsUser(new Intent(action)
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
+ Intent intent = new Intent(action);
+ getContext().sendBroadcastAsUser(intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ UserHandle.ALL, null);
+ // explicitly send the broadcast to all DND packages, even if they aren't currently running
+ intent.setFlags(0);
+ final Set<String> dndApprovedPackages = mConditionProviders.getAllowedPackages();
+ for (String pkg : dndApprovedPackages) {
+ intent.setPackage(pkg);
+ getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
+ }
}
@Override
@@ -2300,22 +2307,22 @@ public class NotificationManagerService extends SystemService {
}
@Override
- public boolean areAppOverlaysAllowed(String pkg) {
- return areAppOverlaysAllowedForPackage(pkg, Binder.getCallingUid());
+ public boolean areBubblesAllowed(String pkg) {
+ return areBubblesAllowedForPackage(pkg, Binder.getCallingUid());
}
@Override
- public boolean areAppOverlaysAllowedForPackage(String pkg, int uid) {
- checkCallerIsSystemOrSameApp(pkg);
-
- return mPreferencesHelper.areAppOverlaysAllowed(pkg, uid);
+ public boolean areBubblesAllowedForPackage(String pkg, int uid) {
+ enforceSystemOrSystemUIOrSamePackage(pkg,
+ "Caller not system or systemui or same package");
+ return mPreferencesHelper.areBubblessAllowed(pkg, uid);
}
@Override
- public void setAppOverlaysAllowed(String pkg, int uid, boolean allowed) {
+ public void setBubblesAllowed(String pkg, int uid, boolean allowed) {
checkCallerIsSystem();
- mPreferencesHelper.setAppOverlaysAllowed(pkg, uid, allowed);
+ mPreferencesHelper.setBubblesAllowed(pkg, uid, allowed);
handleSavePolicyFile();
}
@@ -2642,6 +2649,9 @@ public class NotificationManagerService extends SystemService {
// Zen
mConditionProviders.onPackagesChanged(true, packages, uids);
+ // Snoozing
+ mSnoozeHelper.clearData(UserHandle.getUserId(uid), packageName);
+
// Reset notification preferences
if (!fromApp) {
mPreferencesHelper.onPackagesChanged(
@@ -3495,7 +3505,7 @@ public class NotificationManagerService extends SystemService {
getContext().sendBroadcastAsUser(new Intent(
NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
.setPackage(pkg)
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT),
UserHandle.of(userId), null);
handleSavePolicyFile();
}
@@ -4442,7 +4452,8 @@ public class NotificationManagerService extends SystemService {
am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(),
WHITELIST_TOKEN, duration);
am.setPendingIntentAllowBgActivityStarts(pendingIntent.getTarget(),
- WHITELIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER));
+ WHITELIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER
+ | FLAG_SERVICE_SENDER));
}
}
}
@@ -5698,19 +5709,17 @@ public class NotificationManagerService extends SystemService {
}
int indexBefore = findNotificationRecordIndexLocked(record);
boolean interceptBefore = record.isIntercepted();
- float contactAffinityBefore = record.getContactAffinity();
int visibilityBefore = record.getPackageVisibilityOverride();
recon.applyChangesLocked(record);
applyZenModeLocked(record);
mRankingHelper.sort(mNotificationList);
int indexAfter = findNotificationRecordIndexLocked(record);
boolean interceptAfter = record.isIntercepted();
- float contactAffinityAfter = record.getContactAffinity();
int visibilityAfter = record.getPackageVisibilityOverride();
changed = indexBefore != indexAfter || interceptBefore != interceptAfter
|| visibilityBefore != visibilityAfter;
if (interceptBefore && !interceptAfter
- && Float.compare(contactAffinityBefore, contactAffinityAfter) != 0) {
+ && record.isNewEnoughForAlerting(System.currentTimeMillis())) {
buzzBeepBlinkLocked(record);
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index e2c64ca459a8..559874167429 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -91,7 +91,8 @@ import java.util.Objects;
public final class NotificationRecord {
static final String TAG = "NotificationRecord";
static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
- private static final int MAX_LOGTAG_LENGTH = 35;
+ // the period after which a notification is updated where it can make sound
+ private static final int MAX_SOUND_DELAY_MS = 2000;
final StatusBarNotification sbn;
IActivityManager mAm;
UriGrantsManagerInternal mUgmInternal;
@@ -125,7 +126,8 @@ public final class NotificationRecord {
private long mVisibleSinceMs;
// The most recent update time, or the creation time if no updates.
- private long mUpdateTimeMs;
+ @VisibleForTesting
+ final long mUpdateTimeMs;
// The most recent interruption time, or the creation time if no updates. Differs from the
// above value because updates are filtered based on whether they actually interrupted the
@@ -159,13 +161,10 @@ public final class NotificationRecord {
private ArrayList<String> mPeopleOverride;
private ArrayList<SnoozeCriterion> mSnoozeCriteria;
private boolean mShowBadge;
- private LogMaker mLogMaker;
private Light mLight;
- private String mGroupLogTag;
- private String mChannelIdLogTag;
/**
* This list contains system generated smart actions from NAS, app-generated smart actions are
- * stored in Notification.actions marked as SEMANTIC_ACTION_CONTEXTUAL_SUGGESTION.
+ * stored in Notification.actions with isContextual() set to true.
*/
private ArrayList<Notification.Action> mSystemGeneratedSmartActions;
private ArrayList<CharSequence> mSmartReplies;
@@ -786,7 +785,8 @@ public final class NotificationRecord {
mImportanceExplanation = "user";
}
if (!getChannel().hasUserSetImportance()
- && mAssistantImportance != IMPORTANCE_UNSPECIFIED) {
+ && mAssistantImportance != IMPORTANCE_UNSPECIFIED
+ && !getChannel().isImportanceLockedByOEM()) {
mImportance = mAssistantImportance;
mImportanceExplanation = "asst";
}
@@ -826,6 +826,10 @@ public final class NotificationRecord {
return mIntercept;
}
+ public boolean isNewEnoughForAlerting(long now) {
+ return getFreshnessMs(now) <= MAX_SOUND_DELAY_MS;
+ }
+
public void setHidden(boolean hidden) {
mHidden = hidden;
}
@@ -962,33 +966,6 @@ public final class NotificationRecord {
public void setOverrideGroupKey(String overrideGroupKey) {
sbn.setOverrideGroupKey(overrideGroupKey);
- mGroupLogTag = null;
- }
-
- private String getGroupLogTag() {
- if (mGroupLogTag == null) {
- mGroupLogTag = shortenTag(sbn.getGroup());
- }
- return mGroupLogTag;
- }
-
- private String getChannelIdLogTag() {
- if (mChannelIdLogTag == null) {
- mChannelIdLogTag = shortenTag(mChannel.getId());
- }
- return mChannelIdLogTag;
- }
-
- private String shortenTag(String longTag) {
- if (longTag == null) {
- return null;
- }
- if (longTag.length() < MAX_LOGTAG_LENGTH) {
- return longTag;
- } else {
- return longTag.substring(0, MAX_LOGTAG_LENGTH - 8) + "-" +
- Integer.toHexString(longTag.hashCode());
- }
}
public NotificationChannel getChannel() {
@@ -1265,24 +1242,9 @@ public final class NotificationRecord {
}
public LogMaker getLogMaker(long now) {
- if (mLogMaker == null) {
- // initialize fields that only change on update (so a new record)
- mLogMaker = new LogMaker(MetricsEvent.VIEW_UNKNOWN)
- .setPackageName(sbn.getPackageName())
- .addTaggedData(MetricsEvent.NOTIFICATION_ID, sbn.getId())
- .addTaggedData(MetricsEvent.NOTIFICATION_TAG, sbn.getTag())
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID, getChannelIdLogTag());
- }
- // reset fields that can change between updates, or are used by multiple logs
- return mLogMaker
- .clearCategory()
- .clearType()
- .clearSubtype()
+ return sbn.getLogMaker()
.clearTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX)
.addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_IMPORTANCE, mImportance)
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID, getGroupLogTag())
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY,
- sbn.getNotification().isGroupSummary() ? 1 : 0)
.addTaggedData(MetricsEvent.NOTIFICATION_SINCE_CREATE_MILLIS, getLifespanMs(now))
.addTaggedData(MetricsEvent.NOTIFICATION_SINCE_UPDATE_MILLIS, getFreshnessMs(now))
.addTaggedData(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS, getExposureMs(now))
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 7c0e0b0983fb..7a21aa208dfd 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -68,6 +68,7 @@ public class PreferencesHelper implements RankingConfig {
private static final String TAG = "NotificationPrefHelper";
private static final int XML_VERSION = 1;
private static final int UNKNOWN_UID = UserHandle.USER_NULL;
+ private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":";
@VisibleForTesting
static final String TAG_RANKING = "ranking";
@@ -80,7 +81,7 @@ public class PreferencesHelper implements RankingConfig {
private static final String ATT_NAME = "name";
private static final String ATT_UID = "uid";
private static final String ATT_ID = "id";
- private static final String ATT_APP_OVERLAY = "overlay";
+ private static final String ATT_ALLOW_BUBBLE = "allow_bubble";
private static final String ATT_PRIORITY = "priority";
private static final String ATT_VISIBILITY = "visibility";
private static final String ATT_IMPORTANCE = "importance";
@@ -93,7 +94,9 @@ public class PreferencesHelper implements RankingConfig {
private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
private static final boolean DEFAULT_SHOW_BADGE = true;
- private static final boolean DEFAULT_ALLOW_APP_OVERLAY = true;
+ private static final boolean DEFAULT_ALLOW_BUBBLE = true;
+ private static final boolean DEFAULT_OEM_LOCKED_IMPORTANCE = false;
+
/**
* Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
* fields.
@@ -106,7 +109,7 @@ public class PreferencesHelper implements RankingConfig {
@IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
public @interface LockableAppFields {
int USER_LOCKED_IMPORTANCE = 0x00000001;
- int USER_LOCKED_APP_OVERLAY = 0x00000002;
+ int USER_LOCKED_BUBBLE = 0x00000002;
}
// pkg|uid => PackagePreferences
@@ -174,7 +177,7 @@ public class PreferencesHelper implements RankingConfig {
XmlUtils.readBooleanAttribute(
parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE),
XmlUtils.readBooleanAttribute(
- parser, ATT_APP_OVERLAY, DEFAULT_ALLOW_APP_OVERLAY));
+ parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
r.importance = XmlUtils.readIntAttribute(
parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
r.priority = XmlUtils.readIntAttribute(
@@ -270,11 +273,11 @@ public class PreferencesHelper implements RankingConfig {
private PackagePreferences getOrCreatePackagePreferences(String pkg, int uid) {
return getOrCreatePackagePreferences(pkg, uid,
DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE,
- DEFAULT_ALLOW_APP_OVERLAY);
+ DEFAULT_ALLOW_BUBBLE);
}
private PackagePreferences getOrCreatePackagePreferences(String pkg, int uid, int importance,
- int priority, int visibility, boolean showBadge, boolean allowAppOverlay) {
+ int priority, int visibility, boolean showBadge, boolean allowBubble) {
final String key = packagePreferencesKey(pkg, uid);
synchronized (mPackagePreferences) {
PackagePreferences
@@ -288,7 +291,7 @@ public class PreferencesHelper implements RankingConfig {
r.priority = priority;
r.visibility = visibility;
r.showBadge = showBadge;
- r.appOverlay = allowAppOverlay;
+ r.allowBubble = allowBubble;
try {
createDefaultChannelIfNeeded(r);
@@ -390,7 +393,7 @@ public class PreferencesHelper implements RankingConfig {
|| r.channels.size() > 0
|| r.groups.size() > 0
|| r.delegate != null
- || r.appOverlay != DEFAULT_ALLOW_APP_OVERLAY;
+ || r.allowBubble != DEFAULT_ALLOW_BUBBLE;
if (hasNonDefaultSettings) {
out.startTag(null, TAG_PACKAGE);
out.attribute(null, ATT_NAME, r.pkg);
@@ -403,8 +406,8 @@ public class PreferencesHelper implements RankingConfig {
if (r.visibility != DEFAULT_VISIBILITY) {
out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
}
- if (r.appOverlay != DEFAULT_ALLOW_APP_OVERLAY) {
- out.attribute(null, ATT_APP_OVERLAY, Boolean.toString(r.appOverlay));
+ if (r.allowBubble != DEFAULT_ALLOW_BUBBLE) {
+ out.attribute(null, ATT_ALLOW_BUBBLE, Boolean.toString(r.allowBubble));
}
out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
@@ -450,14 +453,28 @@ public class PreferencesHelper implements RankingConfig {
out.endTag(null, TAG_RANKING);
}
- public void setAppOverlaysAllowed(String pkg, int uid, boolean allowed) {
+ /**
+ * Sets whether bubbles are allowed.
+ *
+ * @param pkg the package to allow or not allow bubbles for.
+ * @param uid the uid to allow or not allow bubbles for.
+ * @param allowed whether bubbles are allowed.
+ */
+ public void setBubblesAllowed(String pkg, int uid, boolean allowed) {
PackagePreferences p = getOrCreatePackagePreferences(pkg, uid);
- p.appOverlay = allowed;
- p.lockedAppFields = p.lockedAppFields | LockableAppFields.USER_LOCKED_APP_OVERLAY;
+ p.allowBubble = allowed;
+ p.lockedAppFields = p.lockedAppFields | LockableAppFields.USER_LOCKED_BUBBLE;
}
- public boolean areAppOverlaysAllowed(String pkg, int uid) {
- return getOrCreatePackagePreferences(pkg, uid).appOverlay;
+ /**
+ * Whether bubbles are allowed.
+ *
+ * @param pkg the package to check if bubbles are allowed for
+ * @param uid the uid to check if bubbles are allowed for.
+ * @return whether bubbles are allowed.
+ */
+ public boolean areBubblessAllowed(String pkg, int uid) {
+ return getOrCreatePackagePreferences(pkg, uid).allowBubble;
}
public int getAppLockedFields(String pkg, int uid) {
@@ -621,6 +638,12 @@ public class PreferencesHelper implements RankingConfig {
channel.setLockscreenVisibility(r.visibility);
}
clearLockedFields(channel);
+ channel.setImportanceLockedByOEM(r.oemLockedImportance);
+ if (!channel.isImportanceLockedByOEM()) {
+ if (r.futureOemLockedChannels.remove(channel.getId())) {
+ channel.setImportanceLockedByOEM(true);
+ }
+ }
if (channel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
channel.setLockscreenVisibility(
NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
@@ -664,6 +687,12 @@ public class PreferencesHelper implements RankingConfig {
} else {
updatedChannel.unlockFields(updatedChannel.getUserLockedFields());
}
+ // no importance updates are allowed if OEM blocked it
+ updatedChannel.setImportanceLockedByOEM(channel.isImportanceLockedByOEM());
+ if (updatedChannel.isImportanceLockedByOEM()) {
+ updatedChannel.setImportance(channel.getImportance());
+ }
+
r.channels.put(updatedChannel.getId(), updatedChannel);
if (onlyHasDefaultChannel(pkg, uid)) {
@@ -753,6 +782,44 @@ public class PreferencesHelper implements RankingConfig {
}
}
+ public void lockChannelsForOEM(String[] appOrChannelList) {
+ if (appOrChannelList == null) {
+ return;
+ }
+ for (String appOrChannel : appOrChannelList) {
+ if (!TextUtils.isEmpty(appOrChannel)) {
+ String[] appSplit = appOrChannel.split(NON_BLOCKABLE_CHANNEL_DELIM);
+ if (appSplit != null && appSplit.length > 0) {
+ String appName = appSplit[0];
+ String channelId = appSplit.length == 2 ? appSplit[1] : null;
+
+ synchronized (mPackagePreferences) {
+ for (PackagePreferences r : mPackagePreferences.values()) {
+ if (r.pkg.equals(appName)) {
+ if (channelId == null) {
+ // lock all channels for the app
+ r.oemLockedImportance = true;
+ for (NotificationChannel channel : r.channels.values()) {
+ channel.setImportanceLockedByOEM(true);
+ }
+ } else {
+ NotificationChannel channel = r.channels.get(channelId);
+ if (channel != null) {
+ channel.setImportanceLockedByOEM(true);
+ } else {
+ // if this channel shows up in the future, make sure it'll
+ // be locked immediately
+ r.futureOemLockedChannels.add(channelId);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
public NotificationChannelGroup getNotificationChannelGroupWithChannels(String pkg,
int uid, String groupId, boolean includeDeleted) {
Preconditions.checkNotNull(pkg);
@@ -1180,8 +1247,8 @@ public class PreferencesHelper implements RankingConfig {
if (original.canShowBadge() != update.canShowBadge()) {
update.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE);
}
- if (original.isAppOverlayAllowed() != update.isAppOverlayAllowed()) {
- update.lockFields(NotificationChannel.USER_LOCKED_ALLOW_APP_OVERLAY);
+ if (original.isBubbleAllowed() != update.isBubbleAllowed()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_ALLOW_BUBBLE);
}
}
@@ -1602,8 +1669,10 @@ public class PreferencesHelper implements RankingConfig {
int priority = DEFAULT_PRIORITY;
int visibility = DEFAULT_VISIBILITY;
boolean showBadge = DEFAULT_SHOW_BADGE;
- boolean appOverlay = DEFAULT_ALLOW_APP_OVERLAY;
+ boolean allowBubble = DEFAULT_ALLOW_BUBBLE;
int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
+ boolean oemLockedImportance = DEFAULT_OEM_LOCKED_IMPORTANCE;
+ List<String> futureOemLockedChannels = new ArrayList<>();
Delegate delegate = null;
ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index b1e914442871..b145e1eee3a3 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -106,9 +106,7 @@ public class RankingHelper {
synchronized (mProxyByGroupTmp) {
// record individual ranking result and nominate proxies for each group
- // Note: iteration is done backwards such that the index can be used as a sort key
- // in a string compare below
- for (int i = N - 1; i >= 0; i--) {
+ for (int i = 0; i < N; i++) {
final NotificationRecord record = notificationList.get(i);
record.setAuthoritativeRank(i);
final String groupKey = record.getGroupKey();
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index 2b581d601ad5..abc98412e126 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -17,6 +17,7 @@ package com.android.server.notification;
import android.annotation.NonNull;
import android.app.AlarmManager;
+import android.app.Notification;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -163,7 +164,6 @@ public class SnoozeHelper {
mSnoozedNotifications.get(userId).get(pkg);
if (recordsForPkg != null) {
final Set<Map.Entry<String, NotificationRecord>> records = recordsForPkg.entrySet();
- String key = null;
for (Map.Entry<String, NotificationRecord> record : records) {
final StatusBarNotification sbn = record.getValue().sbn;
if (Objects.equals(sbn.getTag(), tag) && sbn.getId() == id) {
@@ -305,6 +305,30 @@ public class SnoozeHelper {
}
}
+ protected void clearData(int userId, String pkg) {
+ ArrayMap<String, ArrayMap<String, NotificationRecord>> records =
+ mSnoozedNotifications.get(userId);
+ if (records == null) {
+ return;
+ }
+ ArrayMap<String, NotificationRecord> pkgRecords = records.get(pkg);
+ if (pkgRecords == null) {
+ return;
+ }
+ for (int i = pkgRecords.size() - 1; i >= 0; i--) {
+ final NotificationRecord r = pkgRecords.removeAt(i);
+ if (r != null) {
+ mPackages.remove(r.getKey());
+ mUsers.remove(r.getKey());
+ final PendingIntent pi = createPendingIntent(pkg, r.getKey(), userId);
+ mAm.cancel(pi);
+ MetricsLogger.action(r.getLogMaker()
+ .setCategory(MetricsProto.MetricsEvent.NOTIFICATION_SNOOZED)
+ .setType(MetricsProto.MetricsEvent.TYPE_DISMISS));
+ }
+ }
+ }
+
private PendingIntent createPendingIntent(String pkg, String key, int userId) {
return PendingIntent.getBroadcast(mContext,
REQUEST_CODE_REPOST,
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index e5b1878650d3..afc0b7230e27 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -375,8 +375,7 @@ public class ZenModeHelper {
newConfig = mConfig.copy();
for (int i = newConfig.automaticRules.size() - 1; i >= 0; i--) {
ZenRule rule = newConfig.automaticRules.get(newConfig.automaticRules.keyAt(i));
- if (rule.component.getPackageName().equals(packageName)
- && canManageAutomaticZenRule(rule)) {
+ if (rule.pkg.equals(packageName) && canManageAutomaticZenRule(rule)) {
newConfig.automaticRules.removeAt(i);
}
}
diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java
index 16143d3ae9e0..74fbea1544bd 100644
--- a/services/core/java/com/android/server/om/IdmapManager.java
+++ b/services/core/java/com/android/server/om/IdmapManager.java
@@ -24,11 +24,14 @@ import static com.android.server.om.OverlayManagerService.TAG;
import android.annotation.NonNull;
import android.content.om.OverlayInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.os.Build.VERSION_CODES;
import android.os.IBinder;
import android.os.IIdmap2;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.Slog;
@@ -51,6 +54,13 @@ class IdmapManager {
private final Installer mInstaller;
private IIdmap2 mIdmap2Service;
+ private static final boolean VENDOR_IS_Q_OR_LATER;
+ static {
+ // STOPSHIP(b/119390857): Check api version once Q sdk version is finalized
+ final String value = SystemProperties.get("ro.vndk.version", "Q");
+ VENDOR_IS_Q_OR_LATER = value.equals("Q") || value.equals("q");
+ }
+
IdmapManager(final Installer installer) {
mInstaller = installer;
if (FEATURE_FLAG_IDMAP2) {
@@ -69,10 +79,13 @@ class IdmapManager {
final String overlayPath = overlayPackage.applicationInfo.getBaseCodePath();
try {
if (FEATURE_FLAG_IDMAP2) {
- if (mIdmap2Service.verifyIdmap(overlayPath, userId)) {
+ int policies = determineFulfilledPolicies(overlayPackage);
+ boolean enforce = enforceOverlayable(overlayPackage);
+ if (mIdmap2Service.verifyIdmap(overlayPath, policies, enforce, userId)) {
return true;
}
- return mIdmap2Service.createIdmap(targetPath, overlayPath, userId) != null;
+ return mIdmap2Service.createIdmap(targetPath, overlayPath, policies, enforce,
+ userId) != null;
} else {
mInstaller.idmap(targetPath, overlayPath, sharedGid);
return true;
@@ -156,4 +169,71 @@ class IdmapManager {
}, SECOND_IN_MILLIS);
}
}
+
+ /**
+ * Checks if overlayable and policies should be enforced on the specified overlay for backwards
+ * compatibility with pre-Q overlays.
+ */
+ private boolean enforceOverlayable(@NonNull final PackageInfo overlayPackage) {
+ final ApplicationInfo ai = overlayPackage.applicationInfo;
+ if (ai.targetSdkVersion >= VERSION_CODES.Q) {
+ // Always enforce policies for overlays targeting Q+.
+ return true;
+ }
+
+ if (ai.isVendor() && !VENDOR_IS_Q_OR_LATER) {
+ // If the overlay is on a pre-Q vendor partition, do not enforce overlayable
+ // restrictions on this overlay because the pre-Q platform has no understanding of
+ // overlayable.
+ return false;
+ }
+
+ // Do not enforce overlayable restrictions on pre-Q overlays signed with the
+ // platform signature.
+ return !ai.isSignedWithPlatformKey();
+ }
+
+ /**
+ * Retrieves a bitmask for idmap2 that represents the policies the specified overlay fulfills.
+ * @throws SecurityException if the overlay is not allowed to overlay any resource
+ */
+ private int determineFulfilledPolicies(@NonNull final PackageInfo overlayPackage)
+ throws SecurityException {
+ final ApplicationInfo ai = overlayPackage.applicationInfo;
+ final boolean overlayIsQOrLater = ai.targetSdkVersion >= VERSION_CODES.Q;
+
+ int fulfilledPolicies = 0;
+
+ // TODO(b/119402606) : Add signature policy
+
+ // Vendor partition (/vendor)
+ if (ai.isVendor()) {
+ if (overlayIsQOrLater) {
+ fulfilledPolicies |= IIdmap2.POLICY_VENDOR_PARTITION;
+ } else if (VENDOR_IS_Q_OR_LATER) {
+ throw new SecurityException("Overlay must target Q sdk or higher");
+ }
+ }
+
+ // Product partition (/product)
+ if (ai.isProduct()) {
+ if (overlayIsQOrLater) {
+ fulfilledPolicies |= IIdmap2.POLICY_PRODUCT_PARTITION;
+ } else {
+ throw new SecurityException("Overlay must target Q sdk or higher");
+ }
+ }
+
+ // System partition (/system)
+ if (ai.isSystemApp()) {
+ if (overlayIsQOrLater) {
+ fulfilledPolicies |= IIdmap2.POLICY_SYSTEM_PARTITION;
+ } else {
+ throw new SecurityException("Overlay must target Q sdk or higher");
+ }
+ }
+
+ // All overlays can overlay resources with the public policy
+ return fulfilledPolicies | IIdmap2.POLICY_PUBLIC;
+ }
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index b0d2704196a6..1cbf0bfac05c 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -270,7 +270,9 @@ final class OverlayManagerServiceImpl {
Slog.d(TAG, "onTargetPackageUpgraded packageName=" + packageName + " userId=" + userId);
}
- updateAllOverlaysForTarget(packageName, userId, 0);
+ if (updateAllOverlaysForTarget(packageName, userId, 0)) {
+ mListener.onOverlaysChanged(packageName, userId);
+ }
}
void onTargetPackageRemoved(@NonNull final String packageName, final int userId) {
diff --git a/services/core/java/com/android/server/os/BugreportManagerService.java b/services/core/java/com/android/server/os/BugreportManagerService.java
new file mode 100644
index 000000000000..e2415911e929
--- /dev/null
+++ b/services/core/java/com/android/server/os/BugreportManagerService.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 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.os;
+
+import android.content.Context;
+
+import com.android.server.SystemService;
+
+/**
+ * Service that provides a privileged API to capture and consume bugreports.
+ *
+ * @hide
+ */
+public class BugreportManagerService extends SystemService {
+ private static final String TAG = "BugreportManagerService";
+
+ private BugreportManagerServiceImpl mService;
+
+ public BugreportManagerService(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ mService = new BugreportManagerServiceImpl(getContext());
+ // TODO(b/111441001): Needs sepolicy to be submitted first.
+ // publishBinderService(Context.BUGREPORT_SERVICE, mService);
+ }
+}
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
new file mode 100644
index 000000000000..1178cc18f828
--- /dev/null
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2019 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.os;
+
+import android.annotation.RequiresPermission;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.os.Binder;
+import android.os.BugreportParams;
+import android.os.IDumpstate;
+import android.os.IDumpstateListener;
+import android.os.IDumpstateToken;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.util.Slog;
+
+import java.io.FileDescriptor;
+
+// TODO(b/111441001):
+// 1. Handle the case where another bugreport is in progress
+// 2. Make everything threadsafe
+// 3. Pass validation & other errors on listener
+
+/**
+ * Implementation of the service that provides a privileged API to capture and consume bugreports.
+ *
+ * <p>Delegates the actualy generation to a native implementation of {@code Dumpstate}.
+ */
+class BugreportManagerServiceImpl extends IDumpstate.Stub {
+ private static final String TAG = "BugreportManagerService";
+ private static final long DEFAULT_BUGREPORT_SERVICE_TIMEOUT_MILLIS = 30 * 1000;
+
+ private IDumpstate mDs = null;
+ private final Context mContext;
+ private final AppOpsManager mAppOps;
+
+ BugreportManagerServiceImpl(Context context) {
+ mContext = context;
+ mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ }
+
+ @Override
+ @RequiresPermission(android.Manifest.permission.DUMP)
+ public IDumpstateToken setListener(String name, IDumpstateListener listener,
+ boolean getSectionDetails) throws RemoteException {
+ // TODO(b/111441001): Figure out if lazy setting of listener should be allowed
+ // and if so how to handle it.
+ throw new UnsupportedOperationException("setListener is not allowed on this service");
+ }
+
+ @Override
+ @RequiresPermission(android.Manifest.permission.DUMP)
+ public void startBugreport(int callingUidUnused, String callingPackage,
+ FileDescriptor bugreportFd, FileDescriptor screenshotFd,
+ int bugreportMode, IDumpstateListener listener) throws RemoteException {
+ int callingUid = Binder.getCallingUid();
+ // TODO(b/111441001): validate all arguments & ensure primary user
+ validate(bugreportMode);
+
+ mAppOps.checkPackage(callingUid, callingPackage);
+ mDs = getDumpstateService();
+ if (mDs == null) {
+ Slog.w(TAG, "Unable to get bugreport service");
+ // TODO(b/111441001): pass error on listener
+ return;
+ }
+ mDs.startBugreport(callingUid, callingPackage,
+ bugreportFd, screenshotFd, bugreportMode, listener);
+ }
+
+ private boolean validate(@BugreportParams.BugreportMode int mode) {
+ if (mode != BugreportParams.BUGREPORT_MODE_FULL
+ && mode != BugreportParams.BUGREPORT_MODE_INTERACTIVE
+ && mode != BugreportParams.BUGREPORT_MODE_REMOTE
+ && mode != BugreportParams.BUGREPORT_MODE_WEAR
+ && mode != BugreportParams.BUGREPORT_MODE_TELEPHONY
+ && mode != BugreportParams.BUGREPORT_MODE_WIFI) {
+ Slog.w(TAG, "Unknown bugreport mode: " + mode);
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Start and get a handle to the native implementation of {@code IDumpstate} which does the
+ * actual bugreport generation.
+ *
+ * <p>Generating bugreports requires root privileges. To limit the footprint
+ * of the root access, the actual generation in Dumpstate binary is accessed as a
+ * oneshot service 'bugreport'.
+ */
+ private IDumpstate getDumpstateService() {
+ // Start bugreport service.
+ SystemProperties.set("ctl.start", "bugreport");
+
+ IDumpstate ds = null;
+ boolean timedOut = false;
+ int totalTimeWaitedMillis = 0;
+ int seedWaitTimeMillis = 500;
+ while (!timedOut) {
+ // Note that the binder service on the native side is "dumpstate".
+ ds = IDumpstate.Stub.asInterface(ServiceManager.getService("dumpstate"));
+ if (ds != null) {
+ Slog.i(TAG, "Got bugreport service handle.");
+ break;
+ }
+ SystemClock.sleep(seedWaitTimeMillis);
+ Slog.i(TAG,
+ "Waiting to get dumpstate service handle (" + totalTimeWaitedMillis + "ms)");
+ totalTimeWaitedMillis += seedWaitTimeMillis;
+ seedWaitTimeMillis *= 2;
+ timedOut = totalTimeWaitedMillis > DEFAULT_BUGREPORT_SERVICE_TIMEOUT_MILLIS;
+ }
+ if (timedOut) {
+ Slog.w(TAG,
+ "Timed out waiting to get dumpstate service handle ("
+ + totalTimeWaitedMillis + "ms)");
+ }
+ return ds;
+ }
+}
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index d6ab5f717568..65fc9824c76e 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -27,24 +27,29 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.ServiceManager;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.util.ArraySet;
import android.util.Log;
+import android.util.StatsLog;
-import com.android.server.pm.dex.DexManager;
+import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;
import com.android.server.PinnerService;
+import com.android.server.pm.dex.DexManager;
import com.android.server.pm.dex.DexoptOptions;
import java.io.File;
+import java.nio.file.Paths;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
/**
* {@hide}
@@ -289,6 +294,50 @@ public class BackgroundDexOptService extends JobService {
return result;
}
+ /**
+ * Get the size of the directory. It uses recursion to go over all files.
+ * @param f
+ * @return
+ */
+ private long getDirectorySize(File f) {
+ long size = 0;
+ if (f.isDirectory()) {
+ for (File file: f.listFiles()) {
+ size += getDirectorySize(file);
+ }
+ } else {
+ size = f.length();
+ }
+ return size;
+ }
+
+ /**
+ * Get the size of a package.
+ * @param pkg
+ */
+ private long getPackageSize(PackageManagerService pm, String pkg) {
+ PackageInfo info = pm.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
+ long size = 0;
+ if (info != null && info.applicationInfo != null) {
+ File path = Paths.get(info.applicationInfo.sourceDir).toFile();
+ if (path.isFile()) {
+ path = path.getParentFile();
+ }
+ size += getDirectorySize(path);
+ if (!ArrayUtils.isEmpty(info.applicationInfo.splitSourceDirs)) {
+ for (String splitSourceDir : info.applicationInfo.splitSourceDirs) {
+ path = Paths.get(splitSourceDir).toFile();
+ if (path.isFile()) {
+ path = path.getParentFile();
+ }
+ size += getDirectorySize(path);
+ }
+ }
+ return size;
+ }
+ return 0;
+ }
+
private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
long lowStorageThreshold, boolean is_for_primary_dex,
ArraySet<String> failedPackageNames) {
@@ -315,8 +364,10 @@ public class BackgroundDexOptService extends JobService {
int reason;
boolean downgrade;
+ long package_size_before = 0; //used when the app is downgraded
// Downgrade unused packages.
if (unusedPackages.contains(pkg) && shouldDowngrade) {
+ package_size_before = getPackageSize(pm, pkg);
// This applies for system apps or if packages location is not a directory, i.e.
// monolithic install.
if (is_for_primary_dex && !pm.canHaveOatDir(pkg)) {
@@ -366,6 +417,10 @@ public class BackgroundDexOptService extends JobService {
synchronized (failedPackageNames) {
failedPackageNames.remove(pkg);
}
+ if (downgrade) {
+ StatsLog.write(StatsLog.APP_DOWNGRADED, pkg, package_size_before,
+ getPackageSize(pm, pkg), /*aggressive=*/ false);
+ }
}
}
notifyPinService(updatedPackages);
diff --git a/services/core/java/com/android/server/pm/ComponentResolver.java b/services/core/java/com/android/server/pm/ComponentResolver.java
index 3b11525e7cda..8facce112b52 100644
--- a/services/core/java/com/android/server/pm/ComponentResolver.java
+++ b/services/core/java/com/android/server/pm/ComponentResolver.java
@@ -42,6 +42,7 @@ import android.content.pm.ServiceInfo;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.DebugUtils;
import android.util.Log;
import android.util.LogPrinter;
import android.util.Pair;
@@ -60,6 +61,7 @@ import java.util.Set;
/** Resolves all Android component types [activities, services, providers and receivers]. */
public class ComponentResolver {
+ private static final boolean DEBUG = false;
private static final String TAG = "PackageManager";
private static final boolean DEBUG_FILTERS = false;
private static final boolean DEBUG_SHOW_INFO = false;
@@ -1198,22 +1200,48 @@ public class ComponentResolver {
return packageName.equals(info.activity.owner.packageName);
}
+ private void log(String reason, ActivityIntentInfo info, int match,
+ int userId) {
+ Slog.w(TAG, reason
+ + "; match: "
+ + DebugUtils.flagsToString(IntentFilter.class, "MATCH_", match)
+ + "; userId: " + userId
+ + "; intent info: " + info);
+ }
+
@Override
protected ResolveInfo newResult(PackageParser.ActivityIntentInfo info,
int match, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!sUserManager.exists(userId)) {
+ if (DEBUG) {
+ log("User doesn't exist", info, match, userId);
+ }
+ return null;
+ }
if (!sPackageManagerInternal.isEnabledAndMatches(info.activity.info, mFlags, userId)) {
+ if (DEBUG) {
+ log("!PackageManagerInternal.isEnabledAndMatches; mFlags="
+ + DebugUtils.flagsToString(PackageManager.class, "MATCH_", mFlags),
+ info, match, userId);
+ }
return null;
}
final PackageParser.Activity activity = info.activity;
PackageSetting ps = (PackageSetting) activity.owner.mExtras;
if (ps == null) {
+ if (DEBUG) {
+ log("info.activity.owner.mExtras == null", info, match, userId);
+ }
return null;
}
final PackageUserState userState = ps.readUserState(userId);
ActivityInfo ai =
PackageParser.generateActivityInfo(activity, mFlags, userState, userId);
if (ai == null) {
+ if (DEBUG) {
+ log("Failed to create ActivityInfo based on " + info.activity, info, match,
+ userId);
+ }
return null;
}
final boolean matchExplicitlyVisibleOnly =
@@ -1227,15 +1255,31 @@ public class ComponentResolver {
final boolean matchInstantApp = (mFlags & PackageManager.MATCH_INSTANT) != 0;
// throw out filters that aren't visible to ephemeral apps
if (matchVisibleToInstantApp && !(componentVisible || userState.instantApp)) {
+ if (DEBUG) {
+ log("Filter(s) not visible to ephemeral apps"
+ + "; matchVisibleToInstantApp=" + matchVisibleToInstantApp
+ + "; matchInstantApp=" + matchInstantApp
+ + "; info.isVisibleToInstantApp()=" + info.isVisibleToInstantApp()
+ + "; matchExplicitlyVisibleOnly=" + matchExplicitlyVisibleOnly
+ + "; info.isExplicitlyVisibleToInstantApp()="
+ + info.isExplicitlyVisibleToInstantApp(),
+ info, match, userId);
+ }
return null;
}
// throw out instant app filters if we're not explicitly requesting them
if (!matchInstantApp && userState.instantApp) {
+ if (DEBUG) {
+ log("Instant app filter is not explicitly requested", info, match, userId);
+ }
return null;
}
// throw out instant app filters if updates are available; will trigger
// instant app resolution
if (userState.instantApp && ps.isUpdateAvailable()) {
+ if (DEBUG) {
+ log("Instant app update is available", info, match, userId);
+ }
return null;
}
final ResolveInfo res = new ResolveInfo();
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index a5c083e1d03c..8a6105cb7fa9 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -621,6 +621,14 @@ public class Installer extends SystemService {
throw new InstallerException("Invalid instruction set: " + instructionSet);
}
+ public boolean compileLayouts(String apkPath, String packageName, String outDexFile, int uid) {
+ try {
+ return mInstalld.compileLayouts(apkPath, packageName, outDexFile, uid);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
public static class InstallerException extends Exception {
public InstallerException(String detailMessage) {
super(detailMessage);
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 7f1fb6c97e39..b6dae1977262 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -24,6 +24,7 @@ import android.app.AppDetailsActivity;
import android.app.AppGlobals;
import android.app.IApplicationThread;
import android.app.PendingIntent;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -115,6 +116,7 @@ public class LauncherAppsService extends SystemService {
private final ShortcutServiceInternal mShortcutServiceInternal;
private final PackageCallbackList<IOnAppsChangedListener> mListeners
= new PackageCallbackList<IOnAppsChangedListener>();
+ private final DevicePolicyManager mDpm;
private final MyPackageMonitor mPackageMonitor = new MyPackageMonitor();
@@ -133,6 +135,7 @@ public class LauncherAppsService extends SystemService {
LocalServices.getService(ShortcutServiceInternal.class));
mShortcutServiceInternal.addListener(mPackageMonitor);
mCallbackHandler = BackgroundThread.getHandler();
+ mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
}
@VisibleForTesting
@@ -301,6 +304,17 @@ public class LauncherAppsService extends SystemService {
}
@Override
+ public boolean shouldHideFromSuggestions(String packageName, UserHandle user) {
+ if (!canAccessProfile(user.getIdentifier(), "cannot get shouldHideFromSuggestions")) {
+ return false;
+ }
+ final PackageManagerInternal pmi = LocalServices.getService(
+ PackageManagerInternal.class);
+ int flags = pmi.getDistractingPackageRestrictions(packageName, user.getIdentifier());
+ return (flags & PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS) != 0;
+ }
+
+ @Override
public ParceledListSlice<ResolveInfo> getLauncherActivities(String callingPackage,
String packageName, UserHandle user) throws RemoteException {
ParceledListSlice<ResolveInfo> launcherActivities = queryActivitiesForUser(
@@ -313,30 +327,42 @@ public class LauncherAppsService extends SystemService {
Settings.Global.SHOW_HIDDEN_LAUNCHER_ICON_APPS_ENABLED, 1) == 0) {
return launcherActivities;
}
+ if (launcherActivities == null) {
+ // Cannot access profile, so we don't even return any hidden apps.
+ return null;
+ }
final int callingUid = injectBinderCallingUid();
- final ArrayList<ResolveInfo> result = new ArrayList<>(launcherActivities.getList());
- final PackageManagerInternal pmInt =
- LocalServices.getService(PackageManagerInternal.class);
- if (packageName != null) {
- // If this hidden app should not be shown, return the original list.
- // Otherwise, inject hidden activity that forwards user to app details page.
- if (result.size() > 0) {
+ final long ident = injectClearCallingIdentity();
+ try {
+ if (mUm.getUserInfo(user.getIdentifier()).isManagedProfile()) {
+ // Managed profile should not show hidden apps
return launcherActivities;
}
- ApplicationInfo appInfo = pmInt.getApplicationInfo(packageName, /*flags*/ 0,
- callingUid, user.getIdentifier());
- if (shouldShowHiddenApp(appInfo)) {
- ResolveInfo info = getHiddenAppActivityInfo(packageName, callingUid, user);
- if (info != null) {
- result.add(info);
- }
+ if (mDpm.getDeviceOwnerComponentOnAnyUser() != null) {
+ // Device owner devices should not show hidden apps
+ return launcherActivities;
}
- return new ParceledListSlice<>(result);
- }
- long ident = injectClearCallingIdentity();
- try {
+ final ArrayList<ResolveInfo> result = new ArrayList<>(launcherActivities.getList());
+ final PackageManagerInternal pmInt =
+ LocalServices.getService(PackageManagerInternal.class);
+ if (packageName != null) {
+ // If this hidden app should not be shown, return the original list.
+ // Otherwise, inject hidden activity that forwards user to app details page.
+ if (result.size() > 0) {
+ return launcherActivities;
+ }
+ ApplicationInfo appInfo = pmInt.getApplicationInfo(packageName, /*flags*/ 0,
+ callingUid, user.getIdentifier());
+ if (shouldShowHiddenApp(appInfo)) {
+ ResolveInfo info = getHiddenAppActivityInfo(packageName, callingUid, user);
+ if (info != null) {
+ result.add(info);
+ }
+ }
+ return new ParceledListSlice<>(result);
+ }
final HashSet<String> visiblePackages = new HashSet<>();
for (ResolveInfo info : result) {
visiblePackages.add(info.activityInfo.packageName);
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index f9e31aed1174..5412e9425adf 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -85,9 +85,6 @@ public class PackageDexOptimizer {
// One minute over PM WATCHDOG_TIMEOUT
private static final long WAKELOCK_TIMEOUT_MS = WATCHDOG_TIMEOUT + 1000 * 60;
- /** Special library name that skips shared libraries check during compilation. */
- public static final String SKIP_SHARED_LIBRARY_CHECK = "&";
-
@GuardedBy("mInstallLock")
private final Installer mInstaller;
private final Object mInstallLock;
@@ -397,23 +394,23 @@ public class PackageDexOptimizer {
Slog.e(TAG, "Could not infer CE/DE storage for package " + info.packageName);
return DEX_OPT_FAILED;
}
- Log.d(TAG, "Running dexopt on: " + path
- + " pkg=" + info.packageName + " isa=" + dexUseInfo.getLoaderIsas()
- + " dexoptFlags=" + printDexoptFlags(dexoptFlags)
- + " target-filter=" + compilerFilter);
-
- String classLoaderContext;
+ String classLoaderContext = null;
if (dexUseInfo.isUnknownClassLoaderContext() || dexUseInfo.isVariableClassLoaderContext()) {
- // If we have an unknown (not yet set), or a variable class loader chain, compile
- // without a context and mark the oat file with SKIP_SHARED_LIBRARY_CHECK. Note that
- // this might lead to a incorrect compilation.
- // TODO(calin): We should just extract in this case.
- classLoaderContext = SKIP_SHARED_LIBRARY_CHECK;
+ // If we have an unknown (not yet set), or a variable class loader chain. Just extract
+ // the dex file.
+ compilerFilter = "extract";
} else {
classLoaderContext = dexUseInfo.getClassLoaderContext();
}
int reason = options.getCompilationReason();
+ Log.d(TAG, "Running dexopt on: " + path
+ + " pkg=" + info.packageName + " isa=" + dexUseInfo.getLoaderIsas()
+ + " reason=" + getReasonName(reason)
+ + " dexoptFlags=" + printDexoptFlags(dexoptFlags)
+ + " target-filter=" + compilerFilter
+ + " class-loader-context=" + classLoaderContext);
+
try {
for (String isa : dexUseInfo.getLoaderIsas()) {
// Reuse the same dexopt path as for the primary apks. We don't need all the
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index d3b2528c1c76..72b0e7095742 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -225,6 +225,17 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
Slog.w(TAG, "Deleting orphan icon " + icon);
icon.delete();
}
+
+ // Invalid sessions might have been marked while parsing. Re-write the database with
+ // the updated information.
+ writeSessionsLocked();
+
+ for (int i = 0; i < mSessions.size(); i++) {
+ final PackageInstallerSession session = mSessions.valueAt(i);
+ if (session.isStaged()) {
+ mStagingManager.restoreSession(session);
+ }
+ }
}
}
@@ -534,7 +545,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
mInstallThread.getLooper(), mStagingManager, sessionId, userId,
installerPackageName, callingUid, params, createdMillis, stageDir, stageCid, false,
- false, null, SessionInfo.INVALID_ID);
+ false, null, SessionInfo.INVALID_ID, false, false, false, SessionInfo.NO_ERROR);
synchronized (mSessions) {
mSessions.put(sessionId, session);
@@ -1120,6 +1131,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress);
}
+ public void onStagedSessionChanged(PackageInstallerSession session) {
+ writeSessionsAsync();
+ mPm.sendSessionUpdatedBroadcast(session.generateInfo(false), session.userId);
+ }
+
public void onSessionFinished(final PackageInstallerSession session, boolean success) {
mCallbacks.notifySessionFinished(session.sessionId, session.userId, success);
@@ -1132,7 +1148,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
}
synchronized (mSessions) {
- mSessions.remove(session.sessionId);
+ if (!session.isStaged() || !success) {
+ mSessions.remove(session.sessionId);
+ }
addHistoricalSessionLocked(session);
final File appIconFile = buildAppIconFile(session.sessionId);
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 982daa5df2d5..12d335dd87ab 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -57,6 +57,7 @@ import android.content.pm.IPackageInstallerSession;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.SessionInfo;
+import android.content.pm.PackageInstaller.SessionInfo.StagedSessionErrorCode;
import android.content.pm.PackageInstaller.SessionParams;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
@@ -150,6 +151,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final String ATTR_MULTI_PACKAGE = "multiPackage";
private static final String ATTR_PARENT_SESSION_ID = "parentSessionId";
private static final String ATTR_STAGED_SESSION = "stagedSession";
+ private static final String ATTR_IS_READY = "isReady";
+ private static final String ATTR_IS_FAILED = "isFailed";
+ private static final String ATTR_IS_APPLIED = "isApplied";
+ private static final String ATTR_STAGED_SESSION_ERROR_CODE = "errorCode";
private static final String ATTR_MODE = "mode";
private static final String ATTR_INSTALL_FLAGS = "installFlags";
private static final String ATTR_INSTALL_LOCATION = "installLocation";
@@ -407,7 +412,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
int sessionId, int userId,
String installerPackageName, int installerUid, SessionParams params, long createdMillis,
File stageDir, String stageCid, boolean prepared, boolean sealed,
- @Nullable int[] childSessionIds, int parentSessionId) {
+ @Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
+ boolean isFailed, boolean isApplied, int stagedSessionErrorCode) {
mCallback = callback;
mContext = context;
mPm = pm;
@@ -437,7 +443,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
mPrepared = prepared;
-
+ mStagedSessionReady = isReady;
+ mStagedSessionFailed = isFailed;
+ mStagedSessionApplied = isApplied;
+ mStagedSessionErrorCode = stagedSessionErrorCode;
if (sealed) {
synchronized (mLock) {
try {
@@ -982,9 +991,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mSealed = true;
// Read transfers from the original owner stay open, but as the session's data
- // cannot be modified anymore, there is no leak of information.
- // For staged sessions, the validation is performed by StagingManager.
- if (!params.isMultiPackage && !params.isStaged) {
+ // cannot be modified anymore, there is no leak of information. For staged sessions,
+ // further validation may be performed by the staging manager.
+ if (!params.isMultiPackage) {
final PackageInfo pkgInfo = mPm.getPackageInfo(
params.appPackageName, PackageManager.GET_SIGNATURES
| PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
@@ -1328,18 +1337,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mSigningDetails = apk.signingDetails;
mResolvedBaseFile = addedFile;
- assertApkConsistentLocked(String.valueOf(addedFile), apk);
-
- if (mSigningDetails == PackageParser.SigningDetails.UNKNOWN) {
- try {
- // STOPSHIP: For APEX we should also implement proper APK Signature verification.
- mSigningDetails = ApkSignatureVerifier.plsCertsNoVerifyOnlyCerts(
- pkgInfo.applicationInfo.sourceDir,
- PackageParser.SigningDetails.SignatureSchemeVersion.JAR);
- } catch (PackageParserException e) {
- throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
- "Couldn't obtain signatures from base APK");
- }
+ // STOPSHIP: Ensure that we remove the non-staged version of APEX installs in production
+ // because we currently do not verify that signatures are consistent with the previously
+ // installed version in that case.
+ //
+ // When that happens, this hack can be reverted and we can rely on APEXd to map between
+ // APEX files and their package names instead of parsing it out of the AndroidManifest
+ // such as here.
+ if (params.appPackageName == null) {
+ params.appPackageName = mPackageName;
}
}
@@ -1374,7 +1380,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
"Missing existing base package");
}
// Default to require only if existing base has fs-verity.
- mVerityFound = params.mode == SessionParams.MODE_INHERIT_EXISTING
+ mVerityFound = PackageManagerServiceUtils.isApkVerityEnabled()
+ && params.mode == SessionParams.MODE_INHERIT_EXISTING
&& VerityUtils.hasFsverity(pkgInfo.applicationInfo.getBaseCodePath());
try {
@@ -2002,6 +2009,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mCallback.onSessionFinished(this, success);
}
+ /** {@hide} */
void setStagedSessionReady() {
synchronized (mLock) {
mStagedSessionReady = true;
@@ -2009,13 +2017,52 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mStagedSessionFailed = false;
mStagedSessionErrorCode = SessionInfo.NO_ERROR;
}
+ mCallback.onStagedSessionChanged(this);
+ }
+
+ /** {@hide} */
+ void setStagedSessionFailed(@StagedSessionErrorCode int errorCode) {
+ synchronized (mLock) {
+ mStagedSessionReady = false;
+ mStagedSessionApplied = false;
+ mStagedSessionFailed = true;
+ mStagedSessionErrorCode = errorCode;
+ }
+ mCallback.onStagedSessionChanged(this);
+ }
+
+ /** {@hide} */
+ void setStagedSessionApplied() {
+ synchronized (mLock) {
+ mStagedSessionReady = false;
+ mStagedSessionApplied = true;
+ mStagedSessionFailed = false;
+ mStagedSessionErrorCode = SessionInfo.NO_ERROR;
+ }
+ mCallback.onStagedSessionChanged(this);
+ }
+
+ /** {@hide} */
+ boolean isStagedSessionReady() {
+ return mStagedSessionReady;
+ }
+
+ /** {@hide} */
+ boolean isStagedSessionApplied() {
+ return mStagedSessionApplied;
+ }
+
+ /** {@hide} */
+ boolean isStagedSessionFailed() {
+ return mStagedSessionFailed;
}
private void destroyInternal() {
synchronized (mLock) {
mSealed = true;
- mDestroyed = true;
-
+ if (!params.isStaged) {
+ mDestroyed = true;
+ }
// Force shut down all bridges
for (RevocableFileDescriptor fd : mFds) {
fd.revoke();
@@ -2122,6 +2169,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
writeBooleanAttribute(out, ATTR_MULTI_PACKAGE, params.isMultiPackage);
writeBooleanAttribute(out, ATTR_STAGED_SESSION, params.isStaged);
+ writeBooleanAttribute(out, ATTR_IS_READY, mStagedSessionReady);
+ writeBooleanAttribute(out, ATTR_IS_FAILED, mStagedSessionFailed);
+ writeBooleanAttribute(out, ATTR_IS_APPLIED, mStagedSessionApplied);
+ writeIntAttribute(out, ATTR_STAGED_SESSION_ERROR_CODE, mStagedSessionErrorCode);
// TODO(patb,109941548): avoid writing to xml and instead infer / validate this after
// we've read all sessions.
writeIntAttribute(out, ATTR_PARENT_SESSION_ID, mParentSessionId);
@@ -2199,6 +2250,16 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return permissionsArray;
}
+ // Sanity check to be performed when the session is restored from an external file. Only one
+ // of the session states should be true, or none of them.
+ private static boolean isStagedSessionStateValid(boolean isReady, boolean isApplied,
+ boolean isFailed) {
+ return (!isReady && !isApplied && !isFailed)
+ || (isReady && !isApplied && !isFailed)
+ || (!isReady && isApplied && !isFailed)
+ || (!isReady && !isApplied && isFailed);
+ }
+
/**
* Read new session from a {@link XmlPullParser xml description} and create it.
*
@@ -2260,10 +2321,20 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
params.appIcon = BitmapFactory.decodeFile(appIconFile.getAbsolutePath());
params.appIconLastModified = appIconFile.lastModified();
}
+ final boolean isReady = readBooleanAttribute(in, ATTR_IS_READY);
+ final boolean isFailed = readBooleanAttribute(in, ATTR_IS_FAILED);
+ final boolean isApplied = readBooleanAttribute(in, ATTR_IS_APPLIED);
+ final int stagedSessionErrorCode = readIntAttribute(in, ATTR_STAGED_SESSION_ERROR_CODE);
+
+ if (!isStagedSessionStateValid(isReady, isApplied, isFailed)) {
+ throw new IllegalArgumentException("Can't restore staged session with invalid state.");
+ }
+
return new PackageInstallerSession(callback, context, pm, sessionProvider,
installerThread, stagingManager, sessionId, userId, installerPackageName,
installerUid, params, createdMillis, stageDir, stageCid, prepared, sealed,
- EMPTY_CHILD_SESSION_ARRAY, parentSessionId);
+ EMPTY_CHILD_SESSION_ARRAY, parentSessionId, isReady, isFailed, isApplied,
+ stagedSessionErrorCode);
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 31f0c80f6eff..5a06d6590232 100755
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -84,6 +84,7 @@ import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING;
import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.content.pm.PackageManager.RESTRICTION_NONE;
import static android.content.pm.PackageParser.isApkFile;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
@@ -238,6 +239,7 @@ import android.os.storage.StorageManager;
import android.os.storage.StorageManagerInternal;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
+import android.permission.PermissionControllerManager;
import android.provider.MediaStore;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
@@ -310,6 +312,7 @@ import com.android.server.pm.dex.ArtManagerService;
import com.android.server.pm.dex.DexManager;
import com.android.server.pm.dex.DexoptOptions;
import com.android.server.pm.dex.PackageDexUsage;
+import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.permission.BasePermission;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
@@ -317,7 +320,6 @@ import com.android.server.pm.permission.PermissionManagerInternal;
import com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionsState;
-import com.android.server.pm.permission.PermissionsState.PermissionState;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -370,6 +372,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -443,6 +446,11 @@ public class PackageManagerService extends IPackageManager.Stub
private static final boolean ENABLE_FREE_CACHE_V2 =
SystemProperties.getBoolean("fw.free_cache_v2", true);
+ private static final long BACKUP_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(60);
+
+ private static final boolean PRECOMPILED_LAYOUT_ENABLED =
+ SystemProperties.getBoolean("view.precompiled_layout_enabled", false);
+
private static final int RADIO_UID = Process.PHONE_UID;
private static final int LOG_UID = Process.LOG_UID;
private static final int NFC_UID = Process.NFC_UID;
@@ -885,6 +893,8 @@ public class PackageManagerService extends IPackageManager.Stub
// is used by other apps).
private final DexManager mDexManager;
+ private final ViewCompiler mViewCompiler;
+
private AtomicInteger mNextMoveId = new AtomicInteger();
private final MoveCallbacks mMoveCallbacks;
@@ -1340,6 +1350,8 @@ public class PackageManagerService extends IPackageManager.Stub
final @Nullable String mSystemTextClassifierPackage;
final @Nullable String mWellbeingPackage;
final @Nullable String mDocumenterPackage;
+ final @Nullable String mConfiguratorPackage;
+ final @Nullable String mAppPredictionServicePackage;
final @NonNull String mServicesSystemSharedLibraryPackageName;
final @NonNull String mSharedSystemSharedLibraryPackageName;
@@ -1456,8 +1468,9 @@ public class PackageManagerService extends IPackageManager.Stub
Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod,
args.traceCookie);
}
- } else {
- Slog.e(TAG, "Bogus post-install token " + msg.arg1);
+ } else if (DEBUG_INSTALL) {
+ // No post-install when we run restore from installExistingPackageForUser
+ Slog.i(TAG, "Nothing to do for post-install token " + msg.arg1);
}
Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", msg.arg1);
@@ -2257,6 +2270,8 @@ public class PackageManagerService extends IPackageManager.Stub
mArtManagerService = new ArtManagerService(mContext, this, installer, mInstallLock);
mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
+ mViewCompiler = new ViewCompiler(mInstallLock, mInstaller);
+
mOnPermissionChangeListeners = new OnPermissionChangeListeners(
FgThread.get().getLooper());
@@ -2863,6 +2878,9 @@ public class PackageManagerService extends IPackageManager.Stub
mWellbeingPackage = getWellbeingPackageName();
mDocumenterPackage = getDocumenterPackageName();
+ mConfiguratorPackage =
+ mContext.getString(R.string.config_deviceConfiguratorPackageName);
+ mAppPredictionServicePackage = getAppPredictionServicePackageName();
// Now that we know all of the shared libraries, update all clients to have
// the correct library paths.
@@ -3774,7 +3792,7 @@ public class PackageManagerService extends IPackageManager.Stub
/**
* Returns whether or not a full application can see an instant application.
* <p>
- * Currently, there are three cases in which this can occur:
+ * Currently, there are four cases in which this can occur:
* <ol>
* <li>The calling application is a "special" process. Special processes
* are those with a UID < {@link Process#FIRST_APPLICATION_UID}.</li>
@@ -3782,6 +3800,7 @@ public class PackageManagerService extends IPackageManager.Stub
* {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.</li>
* <li>The calling application is the default launcher on the
* system partition.</li>
+ * <li>The calling application is the default app prediction service.</li>
* </ol>
*/
private boolean canViewInstantApps(int callingUid, int userId) {
@@ -3799,6 +3818,11 @@ public class PackageManagerService extends IPackageManager.Stub
&& isCallerSameApp(homeComponent.getPackageName(), callingUid)) {
return true;
}
+ // TODO(b/122900055) Change/Remove this and replace with new permission role.
+ if (mAppPredictionServicePackage != null
+ && isCallerSameApp(mAppPredictionServicePackage, callingUid)) {
+ return true;
+ }
}
return false;
}
@@ -5514,13 +5538,13 @@ public class PackageManagerService extends IPackageManager.Stub
final int callingUserId = UserHandle.getUserId(callingUid);
final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
// Map to base uids.
- uid1 = UserHandle.getAppId(uid1);
- uid2 = UserHandle.getAppId(uid2);
+ final int appId1 = UserHandle.getAppId(uid1);
+ final int appId2 = UserHandle.getAppId(uid2);
// reader
synchronized (mPackages) {
Signature[] s1;
Signature[] s2;
- Object obj = mSettings.getSettingLPr(uid1);
+ Object obj = mSettings.getSettingLPr(appId1);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
if (isCallerInstantApp) {
@@ -5539,7 +5563,7 @@ public class PackageManagerService extends IPackageManager.Stub
} else {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
- obj = mSettings.getSettingLPr(uid2);
+ obj = mSettings.getSettingLPr(appId2);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
if (isCallerInstantApp) {
@@ -5594,11 +5618,11 @@ public class PackageManagerService extends IPackageManager.Stub
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getUserId(callingUid);
// Map to base uids.
- uid = UserHandle.getAppId(uid);
+ final int appId = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
final PackageParser.SigningDetails signingDetails;
- final Object obj = mSettings.getSettingLPr(uid);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
@@ -5714,10 +5738,10 @@ public class PackageManagerService extends IPackageManager.Stub
final int callingUid = Binder.getCallingUid();
final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
final int userId = UserHandle.getUserId(uid);
- uid = UserHandle.getAppId(uid);
+ final int appId = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
- Object obj = mSettings.getSettingLPr(uid);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
if (isCallerInstantApp) {
return null;
@@ -5752,8 +5776,9 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(callingUid) != null) {
return null;
}
+ final int appId = UserHandle.getAppId(uid);
synchronized (mPackages) {
- Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid));
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
return sus.name + ":" + sus.userId;
@@ -5780,8 +5805,8 @@ public class PackageManagerService extends IPackageManager.Stub
final String[] names = new String[uids.length];
synchronized (mPackages) {
for (int i = uids.length - 1; i >= 0; i--) {
- final int uid = uids[i];
- Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid));
+ final int appId = UserHandle.getAppId(uids[i]);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
names[i] = "shared:" + sus.name;
@@ -5829,8 +5854,9 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(callingUid) != null) {
return 0;
}
+ final int appId = UserHandle.getAppId(uid);
synchronized (mPackages) {
- Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid));
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
return sus.pkgFlags;
@@ -5851,8 +5877,9 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(callingUid) != null) {
return 0;
}
+ final int appId = UserHandle.getAppId(uid);
synchronized (mPackages) {
- Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid));
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
return sus.pkgPrivateFlags;
@@ -5872,10 +5899,10 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return false;
}
- uid = UserHandle.getAppId(uid);
+ final int appId = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
- Object obj = mSettings.getSettingLPr(uid);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
final Iterator<PackageSetting> it = sus.packages.iterator();
@@ -7896,8 +7923,13 @@ public class PackageManagerService extends IPackageManager.Stub
if (apex != null) {
try {
final ApexInfo[] activePkgs = apex.getActivePackages();
- for (ApexInfo apexInfo : activePkgs) {
- list.add(new PackageInfo(apexInfo));
+ for (ApexInfo ai : activePkgs) {
+ try {
+ list.add(PackageParser.generatePackageInfoFromApex(
+ new File(ai.packagePath), true /* collect certs */));
+ } catch (PackageParserException pe) {
+ throw new IllegalStateException("Unable to parse: " + ai, pe);
+ }
}
} catch (RemoteException e) {
Log.e(TAG, "Unable to retrieve packages from apexservice: " + e.toString());
@@ -8603,7 +8635,7 @@ public class PackageManagerService extends IPackageManager.Stub
* match one in a trusted source, and should be done separately.
*/
private boolean canSkipForcedApkVerification(String apkPath) {
- if (!PackageManagerServiceUtils.isLegacyApkVerityMode()) {
+ if (!PackageManagerServiceUtils.isLegacyApkVerityEnabled()) {
return VerityUtils.hasFsverity(apkPath);
}
@@ -9116,6 +9148,10 @@ public class PackageManagerService extends IPackageManager.Stub
pkgCompilationReason = PackageManagerService.REASON_BACKGROUND_DEXOPT;
}
+ if (PRECOMPILED_LAYOUT_ENABLED) {
+ mArtManagerService.compileLayouts(pkg);
+ }
+
// checkProfiles is false to avoid merging profiles during boot which
// might interfere with background compilation (b/28612421).
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
@@ -9260,6 +9296,21 @@ public class PackageManagerService extends IPackageManager.Stub
return performDexOpt(new DexoptOptions(packageName, compilerFilter, flags));
}
+ /**
+ * Ask the package manager to compile layouts in the given package.
+ */
+ @Override
+ public boolean compileLayouts(String packageName) {
+ PackageParser.Package pkg;
+ synchronized (mPackages) {
+ pkg = mPackages.get(packageName);
+ if (pkg == null) {
+ return false;
+ }
+ }
+ return mViewCompiler.compileLayouts(pkg);
+ }
+
/*package*/ boolean performDexOpt(DexoptOptions options) {
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return false;
@@ -12688,22 +12739,30 @@ public class PackageManagerService extends IPackageManager.Stub
info.sendPackageRemovedBroadcasts(true /*killApp*/);
}
+ private void sendDistractingPackagesChanged(String[] pkgList, int[] uidList, int userId,
+ int distractionFlags) {
+ final Bundle extras = new Bundle(3);
+ extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
+ extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidList);
+ extras.putInt(Intent.EXTRA_DISTRACTION_RESTRICTIONS, distractionFlags);
+ sendPackageBroadcast(Intent.ACTION_DISTRACTING_PACKAGES_CHANGED, null, extras,
+ Intent.FLAG_RECEIVER_REGISTERED_ONLY, null, null, new int[]{userId}, null);
+ }
+
private void sendPackagesSuspendedForUser(String[] pkgList, int[] uidList, int userId,
boolean suspended, PersistableBundle launcherExtras) {
- if (pkgList.length > 0) {
- Bundle extras = new Bundle(1);
- extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
- extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidList);
- if (launcherExtras != null) {
- extras.putBundle(Intent.EXTRA_LAUNCHER_EXTRAS,
- new Bundle(launcherExtras.deepCopy()));
- }
- sendPackageBroadcast(
- suspended ? Intent.ACTION_PACKAGES_SUSPENDED
- : Intent.ACTION_PACKAGES_UNSUSPENDED,
- null, extras, Intent.FLAG_RECEIVER_REGISTERED_ONLY, null, null,
- new int[] {userId}, null);
+ final Bundle extras = new Bundle(3);
+ extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
+ extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidList);
+ if (launcherExtras != null) {
+ extras.putBundle(Intent.EXTRA_LAUNCHER_EXTRAS,
+ new Bundle(launcherExtras.deepCopy()));
}
+ sendPackageBroadcast(
+ suspended ? Intent.ACTION_PACKAGES_SUSPENDED
+ : Intent.ACTION_PACKAGES_UNSUSPENDED,
+ null, extras, Intent.FLAG_RECEIVER_REGISTERED_ONLY, null, null,
+ new int[] {userId}, null);
}
/**
@@ -12742,6 +12801,11 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public int installExistingPackageAsUser(String packageName, int userId, int installFlags,
int installReason) {
+ if (DEBUG_INSTALL) {
+ Log.v(TAG, "installExistingPackageAsUser package=" + packageName + " userId=" + userId
+ + " installFlags=" + installFlags + " installReason=" + installReason);
+ }
+
final int callingUid = Binder.getCallingUid();
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES)
!= PackageManager.PERMISSION_GRANTED
@@ -12812,6 +12876,11 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized (mPackages) {
updateSequenceNumberLP(pkgSetting, new int[]{ userId });
}
+ // start async restore with no post-install since we finish install here
+ PackageInstalledInfo res =
+ createPackageInstalledInfo(PackageManager.INSTALL_SUCCEEDED);
+ res.pkg = pkgSetting.pkg;
+ restoreAndPostInstall(userId, res, null);
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -12853,6 +12922,62 @@ public class PackageManagerService extends IPackageManager.Stub
}
@Override
+ public String[] setDistractingPackageRestrictionsAsUser(String[] packageNames,
+ int restrictionFlags, int userId) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS,
+ "setPackagesSuspendedAsUser");
+
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid != Process.ROOT_UID && callingUid != Process.SYSTEM_UID
+ && UserHandle.getUserId(callingUid) != userId) {
+ throw new SecurityException("Calling uid " + callingUid + " cannot call for user "
+ + userId);
+ }
+ Preconditions.checkNotNull(packageNames, "packageNames cannot be null");
+
+ final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
+ final IntArray changedUids = new IntArray(packageNames.length);
+ final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
+
+ for (int i = 0; i < packageNames.length; i++) {
+ final String packageName = packageNames[i];
+ final PackageSetting pkgSetting;
+ synchronized (mPackages) {
+ pkgSetting = mSettings.mPackages.get(packageName);
+ if (pkgSetting == null || filterAppAccessLPr(pkgSetting, callingUid, userId)) {
+ Slog.w(TAG, "Could not find package setting for package: " + packageName
+ + ". Skipping...");
+ unactionedPackages.add(packageName);
+ continue;
+ }
+ }
+ if (restrictionFlags != 0 && !canSuspendPackageForUserInternal(packageName, userId)) {
+ unactionedPackages.add(packageName);
+ continue;
+ }
+ synchronized (mPackages) {
+ final int oldDistractionFlags = pkgSetting.getDistractionFlags(userId);
+ if (restrictionFlags != oldDistractionFlags) {
+ pkgSetting.setDistractionFlags(restrictionFlags, userId);
+ changedPackagesList.add(packageName);
+ changedUids.add(UserHandle.getUid(userId, pkgSetting.appId));
+ }
+ }
+ }
+
+ if (!changedPackagesList.isEmpty()) {
+ final String[] changedPackages = changedPackagesList.toArray(
+ new String[changedPackagesList.size()]);
+ sendDistractingPackagesChanged(changedPackages, changedUids.toArray(), userId,
+ restrictionFlags);
+ synchronized (mPackages) {
+ scheduleWritePackageRestrictionsLocked(userId);
+ }
+ }
+ return unactionedPackages.toArray(new String[0]);
+ }
+
+ @Override
public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
PersistableBundle appExtras, PersistableBundle launcherExtras,
SuspendDialogInfo dialogInfo, String callingPackage, int userId) {
@@ -12877,44 +13002,37 @@ public class PackageManagerService extends IPackageManager.Stub
final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
final IntArray changedUids = new IntArray(packageNames.length);
final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
- final long callingId = Binder.clearCallingIdentity();
- try {
- for (int i = 0; i < packageNames.length; i++) {
- final String packageName = packageNames[i];
- if (callingPackage.equals(packageName)) {
- Slog.w(TAG, "Calling package: " + callingPackage + " trying to "
- + (suspended ? "" : "un") + "suspend itself. Ignoring");
- unactionedPackages.add(packageName);
- continue;
- }
- PackageSetting pkgSetting;
- synchronized (mPackages) {
- pkgSetting = mSettings.mPackages.get(packageName);
- if (pkgSetting == null
- || filterAppAccessLPr(pkgSetting, callingUid, userId)) {
- Slog.w(TAG, "Could not find package setting for package: " + packageName
- + ". Skipping suspending/un-suspending.");
- unactionedPackages.add(packageName);
- continue;
- }
- }
- if (suspended && !canSuspendPackageForUserInternal(packageName, userId)) {
+
+ for (int i = 0; i < packageNames.length; i++) {
+ final String packageName = packageNames[i];
+ if (callingPackage.equals(packageName)) {
+ Slog.w(TAG, "Calling package: " + callingPackage + " trying to "
+ + (suspended ? "" : "un") + "suspend itself. Ignoring");
+ unactionedPackages.add(packageName);
+ continue;
+ }
+ final PackageSetting pkgSetting;
+ synchronized (mPackages) {
+ pkgSetting = mSettings.mPackages.get(packageName);
+ if (pkgSetting == null || filterAppAccessLPr(pkgSetting, callingUid, userId)) {
+ Slog.w(TAG, "Could not find package setting for package: " + packageName
+ + ". Skipping suspending/un-suspending.");
unactionedPackages.add(packageName);
continue;
}
- synchronized (mPackages) {
- pkgSetting = mSettings.mPackages.get(packageName);
- if (pkgSetting != null) {
- pkgSetting.setSuspended(suspended, callingPackage, dialogInfo, appExtras,
- launcherExtras, userId);
- }
- }
- changedPackagesList.add(packageName);
- changedUids.add(UserHandle.getUid(userId, pkgSetting.appId));
}
- } finally {
- Binder.restoreCallingIdentity(callingId);
+ if (suspended && !canSuspendPackageForUserInternal(packageName, userId)) {
+ unactionedPackages.add(packageName);
+ continue;
+ }
+ synchronized (mPackages) {
+ pkgSetting.setSuspended(suspended, callingPackage, dialogInfo, appExtras,
+ launcherExtras, userId);
+ }
+ changedPackagesList.add(packageName);
+ changedUids.add(UserHandle.getUid(userId, pkgSetting.appId));
}
+
if (!changedPackagesList.isEmpty()) {
final String[] changedPackages = changedPackagesList.toArray(
new String[changedPackagesList.size()]);
@@ -13066,88 +13184,87 @@ public class PackageManagerService extends IPackageManager.Stub
+ " cannot query getUnsuspendablePackagesForUser for user " + userId);
}
final ArraySet<String> unactionablePackages = new ArraySet<>();
- final long identity = Binder.clearCallingIdentity();
- try {
- for (String packageName : packageNames) {
- if (!canSuspendPackageForUserInternal(packageName, userId)) {
- unactionablePackages.add(packageName);
- }
+ for (String packageName : packageNames) {
+ if (!canSuspendPackageForUserInternal(packageName, userId)) {
+ unactionablePackages.add(packageName);
}
- } finally {
- Binder.restoreCallingIdentity(identity);
}
return unactionablePackages.toArray(new String[unactionablePackages.size()]);
}
private boolean canSuspendPackageForUserInternal(String packageName, int userId) {
- if (isPackageDeviceAdmin(packageName, userId)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": has an active device admin");
- return false;
- }
-
- String activeLauncherPackageName = getActiveLauncherPackageName(userId);
- if (packageName.equals(activeLauncherPackageName)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": contains the active launcher");
- return false;
- }
-
- if (packageName.equals(mRequiredInstallerPackage)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": required for package installation");
- return false;
- }
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ if (isPackageDeviceAdmin(packageName, userId)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": has an active device admin");
+ return false;
+ }
- if (packageName.equals(mRequiredUninstallerPackage)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": required for package uninstallation");
- return false;
- }
+ String activeLauncherPackageName = getActiveLauncherPackageName(userId);
+ if (packageName.equals(activeLauncherPackageName)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": contains the active launcher");
+ return false;
+ }
- if (packageName.equals(mRequiredVerifierPackage)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": required for package verification");
- return false;
- }
+ if (packageName.equals(mRequiredInstallerPackage)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": required for package installation");
+ return false;
+ }
- if (packageName.equals(getDefaultDialerPackageName(userId))) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": is the default dialer");
- return false;
- }
+ if (packageName.equals(mRequiredUninstallerPackage)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": required for package uninstallation");
+ return false;
+ }
- if (packageName.equals(mRequiredPermissionControllerPackage)) {
- Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": required for permissions management");
- return false;
- }
+ if (packageName.equals(mRequiredVerifierPackage)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": required for package verification");
+ return false;
+ }
- synchronized (mPackages) {
- if (mProtectedPackages.isPackageStateProtected(userId, packageName)) {
+ if (packageName.equals(getDefaultDialerPackageName(userId))) {
Slog.w(TAG, "Cannot suspend package \"" + packageName
- + "\": protected package");
+ + "\": is the default dialer");
return false;
}
- // Cannot suspend static shared libs as they are considered
- // a part of the using app (emulating static linking). Also
- // static libs are installed always on internal storage.
- PackageParser.Package pkg = mPackages.get(packageName);
- if (pkg != null && pkg.applicationInfo.isStaticSharedLibrary()) {
- Slog.w(TAG, "Cannot suspend package: " + packageName
- + " providing static shared library: "
- + pkg.staticSharedLibName);
+ if (packageName.equals(mRequiredPermissionControllerPackage)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": required for permissions management");
return false;
}
- }
- if (PLATFORM_PACKAGE_NAME.equals(packageName)) {
- Slog.w(TAG, "Cannot suspend the platform package: " + packageName);
- return false;
- }
+ synchronized (mPackages) {
+ if (mProtectedPackages.isPackageStateProtected(userId, packageName)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": protected package");
+ return false;
+ }
- return true;
+ // Cannot suspend static shared libs as they are considered
+ // a part of the using app (emulating static linking). Also
+ // static libs are installed always on internal storage.
+ PackageParser.Package pkg = mPackages.get(packageName);
+ if (pkg != null && pkg.applicationInfo.isStaticSharedLibrary()) {
+ Slog.w(TAG, "Cannot suspend package: " + packageName
+ + " providing static shared library: "
+ + pkg.staticSharedLibName);
+ return false;
+ }
+ }
+
+ if (PLATFORM_PACKAGE_NAME.equals(packageName)) {
+ Slog.w(TAG, "Cannot suspend the platform package: " + packageName);
+ return false;
+ }
+ return true;
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
}
private String getActiveLauncherPackageName(int userId) {
@@ -13593,7 +13710,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
Signature[] callerSignature;
- Object obj = mSettings.getSettingLPr(callingUid);
+ final int appId = UserHandle.getAppId(callingUid);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
callerSignature =
@@ -13702,8 +13820,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
for (InstallRequest request : installRequests) {
- resolvePackageInstalledInfo(request.args,
- request.installResult);
+ restoreAndPostInstall(request.args.user.getIdentifier(), request.installResult,
+ new PostInstallData(request.args, request.installResult));
}
});
}
@@ -13718,7 +13836,14 @@ public class PackageManagerService extends IPackageManager.Stub
return res;
}
- private void resolvePackageInstalledInfo(InstallArgs args, PackageInstalledInfo res) {
+ /** @param data Post-install is performed only if this is non-null. */
+ private void restoreAndPostInstall(
+ int userId, PackageInstalledInfo res, @Nullable PostInstallData data) {
+ if (DEBUG_INSTALL) {
+ Log.v(TAG, "restoreAndPostInstall userId=" + userId + " package="
+ + res.pkg.packageName);
+ }
+
// A restore should be performed at this point if (a) the install
// succeeded, (b) the operation is not an update, and (c) the new
// package has not opted out of backup participation.
@@ -13734,9 +13859,12 @@ public class PackageManagerService extends IPackageManager.Stub
int token;
if (mNextInstallToken < 0) mNextInstallToken = 1;
token = mNextInstallToken++;
+ if (data != null) {
+ mRunningInstalls.put(token, data);
+ } else if (DEBUG_INSTALL) {
+ Log.v(TAG, "No post-install required for " + token);
+ }
- PostInstallData data = new PostInstallData(args, res);
- mRunningInstalls.put(token, data);
if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token);
if (res.returnCode == PackageManager.INSTALL_SUCCEEDED && doRestore) {
@@ -13747,14 +13875,19 @@ public class PackageManagerService extends IPackageManager.Stub
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
if (bm != null) {
+ // For backwards compatibility as USER_ALL previously routed directly to USER_SYSTEM
+ // in the BackupManager. USER_ALL is used in compatibility tests.
+ if (userId == UserHandle.USER_ALL) {
+ userId = UserHandle.USER_SYSTEM;
+ }
if (DEBUG_INSTALL) {
- Log.v(TAG, "token " + token + " to BM for possible restore");
+ Log.v(TAG, "token " + token + " to BM for possible restore for user " + userId);
}
Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
try {
- // TODO: http://b/22388012
- if (bm.isBackupServiceActive(UserHandle.USER_SYSTEM)) {
- bm.restoreAtInstall(res.pkg.applicationInfo.packageName, token);
+ if (bm.isBackupServiceActive(userId)) {
+ bm.restoreAtInstallForUser(
+ userId, res.pkg.applicationInfo.packageName, token);
} else {
doRestore = false;
}
@@ -15685,13 +15818,25 @@ public class PackageManagerService extends IPackageManager.Stub
if (!hasDynamicLibraries) {
return null;
}
+ final boolean isUpdatedSystemApp = pkg.isUpdatedSystemApp();
+ // We may not yet have disabled the updated package yet, so be sure to grab the
+ // current setting if that's the case.
+ final PackageSetting updatedSystemPs = isUpdatedSystemApp
+ ? scanResult.request.disabledPkgSetting == null
+ ? scanResult.request.oldPkgSetting
+ : scanResult.request.disabledPkgSetting
+ : null;
+ if (isUpdatedSystemApp && (updatedSystemPs.pkg == null
+ || updatedSystemPs.pkg.libraryNames == null)) {
+ Slog.w(TAG, "Package " + pkg.packageName + " declares libraries that are not "
+ + "declared on the system image; skipping");
+ return null;
+ }
final ArrayList<SharedLibraryInfo> infos =
new ArrayList<>(scanResult.dynamicSharedLibraryInfos.size());
- final boolean updatedSystemApp = pkg.isUpdatedSystemApp();
for (SharedLibraryInfo info : scanResult.dynamicSharedLibraryInfos) {
- String name = info.getName();
- boolean allowed = false;
- if (updatedSystemApp) {
+ final String name = info.getName();
+ if (isUpdatedSystemApp) {
// New library entries can only be added through the
// system image. This is important to get rid of a lot
// of nasty edge cases: for example if we allowed a non-
@@ -15701,36 +15846,20 @@ public class PackageManagerService extends IPackageManager.Stub
// have allowed apps on the device which aren't compatible
// with it. Better to just have the restriction here, be
// conservative, and create many fewer cases that can negatively
- // impact the user experience. We may not yet have disabled the
- // updated package yet, so be sure to grab the current setting if
- // that's the case.
- final PackageSetting sysPs = scanResult.request.disabledPkgSetting == null
- ? scanResult.request.oldPkgSetting
- : scanResult.request.disabledPkgSetting;
- if (sysPs.pkg != null && sysPs.pkg.libraryNames != null) {
- for (int j = 0; j < sysPs.pkg.libraryNames.size(); j++) {
- if (name.equals(sysPs.pkg.libraryNames.get(j))) {
- allowed = true;
- break;
- }
- }
- }
- } else {
- allowed = true;
- }
- if (allowed) {
- if (sharedLibExists(
- name, SharedLibraryInfo.VERSION_UNDEFINED, existingSharedLibraries)) {
- Slog.w(TAG, "Package " + pkg.packageName + " library "
- + name + " already exists; skipping");
+ // impact the user experience.
+ if (!updatedSystemPs.pkg.libraryNames.contains(name)) {
+ Slog.w(TAG, "Package " + pkg.packageName + " declares library " + name
+ + " that is not declared on system image; skipping");
continue;
}
- infos.add(info);
- } else {
- Slog.w(TAG, "Package " + pkg.packageName + " declares lib "
- + name + " that is not declared on system image; skipping");
+ }
+ if (sharedLibExists(
+ name, SharedLibraryInfo.VERSION_UNDEFINED, existingSharedLibraries)) {
+ Slog.w(TAG, "Package " + pkg.packageName + " declares library " + name
+ + " that already exists; skipping");
continue;
}
+ infos.add(info);
}
return infos;
}
@@ -16113,6 +16242,13 @@ public class PackageManagerService extends IPackageManager.Stub
&& ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0);
if (performDexopt) {
+ // Compile the layout resources.
+ if (PRECOMPILED_LAYOUT_ENABLED) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "compileLayouts");
+ mViewCompiler.compileLayouts(pkg);
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
// Do not run PackageDexOptimizer through the local performDexOpt
// method because `pkg` may not be in `mPackages` yet.
@@ -16934,10 +17070,11 @@ public class PackageManagerService extends IPackageManager.Stub
*/
private void setUpFsVerityIfPossible(PackageParser.Package pkg) throws InstallerException,
PrepareFailure, IOException, DigestException, NoSuchAlgorithmException {
- if (!PackageManagerServiceUtils.isApkVerityEnabled()) {
+ final boolean standardMode = PackageManagerServiceUtils.isApkVerityEnabled();
+ final boolean legacyMode = PackageManagerServiceUtils.isLegacyApkVerityEnabled();
+ if (!standardMode && !legacyMode) {
return;
}
- final boolean legacyMode = PackageManagerServiceUtils.isLegacyApkVerityMode();
// Collect files we care for fs-verity setup.
ArrayMap<String, String> fsverityCandidates = new ArrayMap<>();
@@ -16981,19 +17118,29 @@ public class PackageManagerService extends IPackageManager.Stub
final String filePath = entry.getKey();
final String signaturePath = entry.getValue();
- final VerityUtils.SetupResult result = VerityUtils.generateApkVeritySetupData(
- filePath, signaturePath, legacyMode);
+ if (!legacyMode) {
+ // fs-verity is optional for now. Only set up if signature is provided.
+ if (new File(signaturePath).exists()) {
+ try {
+ VerityUtils.setUpFsverity(filePath, signaturePath);
+ } catch (IOException | DigestException | NoSuchAlgorithmException
+ | SecurityException e) {
+ throw new PrepareFailure(PackageManager.INSTALL_FAILED_BAD_SIGNATURE,
+ "Failed to enable fs-verity: " + e);
+ }
+ }
+ continue;
+ }
+
+ // In legacy mode, fs-verity can only be enabled by process with CAP_SYS_ADMIN.
+ final VerityUtils.SetupResult result = VerityUtils.generateApkVeritySetupData(filePath);
if (result.isOk()) {
if (Build.IS_DEBUGGABLE) Slog.i(TAG, "Enabling verity to " + filePath);
final FileDescriptor fd = result.getUnownedFileDescriptor();
try {
mInstaller.installApkVerity(filePath, fd, result.getContentSize());
-
- // In legacy mode, fs-verity can only be enabled by process with CAP_SYS_ADMIN.
- if (legacyMode) {
- final byte[] rootHash = VerityUtils.generateApkVerityRootHash(filePath);
- mInstaller.assertFsverityRootHashMatches(filePath, rootHash);
- }
+ final byte[] rootHash = VerityUtils.generateApkVerityRootHash(filePath);
+ mInstaller.assertFsverityRootHashMatches(filePath, rootHash);
} finally {
IoUtils.closeQuietly(fd);
}
@@ -18495,6 +18642,7 @@ public class PackageManagerService extends IPackageManager.Stub
true /*stopped*/,
true /*notLaunched*/,
false /*hidden*/,
+ 0 /*distractionFlags*/,
false /*suspended*/,
null /*suspendingPackage*/,
null /*dialogInfo*/,
@@ -18952,7 +19100,8 @@ public class PackageManagerService extends IPackageManager.Stub
@GuardedBy("mPackages")
private int getUidTargetSdkVersionLockedLPr(int uid) {
- Object obj = mSettings.getSettingLPr(uid);
+ final int appId = UserHandle.getAppId(uid);
+ final Object obj = mSettings.getSettingLPr(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
int vers = Build.VERSION_CODES.CUR_DEVELOPMENT;
@@ -19143,7 +19292,7 @@ public class PackageManagerService extends IPackageManager.Stub
// writer
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
- if (pkg == null || pkg.applicationInfo.uid != callingUid) {
+ if (pkg == null || !isCallerSameApp(packageName, callingUid)) {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
@@ -19584,28 +19733,32 @@ public class PackageManagerService extends IPackageManager.Stub
throw new SecurityException("Only the system may call getPermissionGrantBackup()");
}
- ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
- try {
- final XmlSerializer serializer = new FastXmlSerializer();
- serializer.setOutput(dataStream, StandardCharsets.UTF_8.name());
- serializer.startDocument(null, true);
- serializer.startTag(null, TAG_PERMISSION_BACKUP);
+ AtomicReference<byte[]> backup = new AtomicReference<>();
+ mContext.getSystemService(PermissionControllerManager.class).getRuntimePermissionBackup(
+ UserHandle.of(userId), mContext.getMainExecutor(), (b) -> {
+ synchronized (backup) {
+ backup.set(b);
+ backup.notifyAll();
+ }
+ });
- synchronized (mPackages) {
- serializeRuntimePermissionGrantsLPr(serializer, userId);
- }
+ long start = System.currentTimeMillis();
+ synchronized (backup) {
+ while (backup.get() == null) {
+ long timeLeft = start + BACKUP_TIMEOUT_MILLIS - System.currentTimeMillis();
+ if (timeLeft <= 0) {
+ return null;
+ }
- serializer.endTag(null, TAG_PERMISSION_BACKUP);
- serializer.endDocument();
- serializer.flush();
- } catch (Exception e) {
- if (DEBUG_BACKUP) {
- Slog.e(TAG, "Unable to write default apps for backup", e);
+ try {
+ backup.wait(timeLeft);
+ } catch (InterruptedException ignored) {
+ return null;
+ }
}
- return null;
}
- return dataStream.toByteArray();
+ return backup.get();
}
@Override
@@ -19631,66 +19784,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
@GuardedBy("mPackages")
- private void serializeRuntimePermissionGrantsLPr(XmlSerializer serializer, final int userId)
- throws IOException {
- serializer.startTag(null, TAG_ALL_GRANTS);
-
- final int N = mSettings.mPackages.size();
- for (int i = 0; i < N; i++) {
- final PackageSetting ps = mSettings.mPackages.valueAt(i);
- boolean pkgGrantsKnown = false;
-
- PermissionsState packagePerms = ps.getPermissionsState();
-
- for (PermissionState state : packagePerms.getRuntimePermissionStates(userId)) {
- final int grantFlags = state.getFlags();
- // only look at grants that are not system/policy fixed
- if ((grantFlags & SYSTEM_RUNTIME_GRANT_MASK) == 0) {
- final boolean isGranted = state.isGranted();
- // And only back up the user-twiddled state bits
- if (isGranted || (grantFlags & USER_RUNTIME_GRANT_MASK) != 0) {
- final String packageName = mSettings.mPackages.keyAt(i);
- if (!pkgGrantsKnown) {
- serializer.startTag(null, TAG_GRANT);
- serializer.attribute(null, ATTR_PACKAGE_NAME, packageName);
- pkgGrantsKnown = true;
- }
-
- final boolean userSet =
- (grantFlags & FLAG_PERMISSION_USER_SET) != 0;
- final boolean userFixed =
- (grantFlags & FLAG_PERMISSION_USER_FIXED) != 0;
- final boolean revoke =
- (grantFlags & FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0;
-
- serializer.startTag(null, TAG_PERMISSION);
- serializer.attribute(null, ATTR_PERMISSION_NAME, state.getName());
- if (isGranted) {
- serializer.attribute(null, ATTR_IS_GRANTED, "true");
- }
- if (userSet) {
- serializer.attribute(null, ATTR_USER_SET, "true");
- }
- if (userFixed) {
- serializer.attribute(null, ATTR_USER_FIXED, "true");
- }
- if (revoke) {
- serializer.attribute(null, ATTR_REVOKE_ON_UPGRADE, "true");
- }
- serializer.endTag(null, TAG_PERMISSION);
- }
- }
- }
-
- if (pkgGrantsKnown) {
- serializer.endTag(null, TAG_GRANT);
- }
- }
-
- serializer.endTag(null, TAG_ALL_GRANTS);
- }
-
- @GuardedBy("mPackages")
private void processRestoredPermissionGrantsLPr(XmlPullParser parser, int userId)
throws XmlPullParserException, IOException {
String pkgName = null;
@@ -19872,6 +19965,14 @@ public class PackageManagerService extends IPackageManager.Stub
.setPackage(launcherComponent.getPackageName());
mContext.sendBroadcastAsUser(launcherIntent, UserHandle.of(launcherUid));
}
+ // TODO(b/122900055) Change/Remove this and replace with new permission role.
+ if (mAppPredictionServicePackage != null) {
+ Intent predictorIntent = new Intent(PackageInstaller.ACTION_SESSION_COMMITTED)
+ .putExtra(PackageInstaller.EXTRA_SESSION, sessionInfo)
+ .putExtra(Intent.EXTRA_USER, UserHandle.of(userId))
+ .setPackage(mAppPredictionServicePackage);
+ mContext.sendBroadcastAsUser(predictorIntent, UserHandle.of(launcherUid));
+ }
}
}
@@ -20024,6 +20125,20 @@ public class PackageManagerService extends IPackageManager.Stub
return mContext.getString(R.string.config_defaultWellbeingPackage);
}
+ private String getAppPredictionServicePackageName() {
+ String flattenedAppPredictionServiceComponentName =
+ mContext.getString(R.string.config_defaultAppPredictionService);
+ if (flattenedAppPredictionServiceComponentName == null) {
+ return null;
+ }
+ ComponentName appPredictionServiceComponentName =
+ ComponentName.unflattenFromString(flattenedAppPredictionServiceComponentName);
+ if (appPredictionServiceComponentName == null) {
+ return null;
+ }
+ return appPredictionServiceComponentName.getPackageName();
+ }
+
@Override
public void setApplicationEnabledSetting(String appPackageName,
int newState, int flags, int userId, String callingPackage) {
@@ -23186,6 +23301,8 @@ public class PackageManagerService extends IPackageManager.Stub
return mWellbeingPackage;
case PackageManagerInternal.PACKAGE_DOCUMENTER:
return mDocumenterPackage;
+ case PackageManagerInternal.PACKAGE_CONFIGURATOR:
+ return mConfiguratorPackage;
}
return null;
}
@@ -23202,6 +23319,11 @@ public class PackageManagerService extends IPackageManager.Stub
}
@Override
+ public void setLocationExtraPackagesProvider(PackagesProvider provider) {
+ mDefaultPermissionPolicy.setLocationExtraPackagesProvider(provider);
+ }
+
+ @Override
public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
mDefaultPermissionPolicy.setVoiceInteractionPackagesProvider(provider);
}
@@ -23310,6 +23432,14 @@ public class PackageManagerService extends IPackageManager.Stub
}
@Override
+ public int getDistractingPackageRestrictions(String packageName, int userId) {
+ synchronized (mPackages) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ return (ps != null) ? ps.getDistractionFlags(userId) : RESTRICTION_NONE;
+ }
+ }
+
+ @Override
public int getPackageUid(String packageName, int flags, int userId) {
return PackageManagerService.this
.getPackageUid(packageName, flags, userId);
@@ -23724,6 +23854,21 @@ public class PackageManagerService extends IPackageManager.Stub
public void setEnableRollbackCode(int token, int enableRollbackCode) {
PackageManagerService.this.setEnableRollbackCode(token, enableRollbackCode);
}
+
+ /**
+ * Ask the package manager to compile layouts in the given package.
+ */
+ @Override
+ public boolean compileLayouts(String packageName) {
+ PackageParser.Package pkg;
+ synchronized (mPackages) {
+ pkg = mPackages.get(packageName);
+ if (pkg == null) {
+ return false;
+ }
+ }
+ return mArtManagerService.compileLayouts(pkg);
+ }
}
@GuardedBy("mPackages")
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 25169a24d932..6134d3098e3b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -555,19 +555,19 @@ public class PackageManagerServiceUtils {
/** Standard fs-verity. */
private static final int FSVERITY_ENABLED = 2;
- /** Returns true if APK Verity is enabled. */
+ /** Returns true if standard APK Verity is enabled. */
static boolean isApkVerityEnabled() {
- int mode = SystemProperties.getInt("ro.apk_verity.mode", FSVERITY_DISABLED);
- return mode == FSVERITY_LEGACY || mode == FSVERITY_ENABLED;
+ return SystemProperties.getInt("ro.apk_verity.mode", FSVERITY_DISABLED) == FSVERITY_ENABLED;
}
- static boolean isLegacyApkVerityMode() {
+ static boolean isLegacyApkVerityEnabled() {
return SystemProperties.getInt("ro.apk_verity.mode", FSVERITY_DISABLED) == FSVERITY_LEGACY;
}
/** Returns true to force apk verification if the updated package (in /data) is a priv app. */
static boolean isApkVerificationForced(@Nullable PackageSetting disabledPs) {
- return disabledPs != null && disabledPs.isPrivileged() && isApkVerityEnabled();
+ return disabledPs != null && disabledPs.isPrivileged() && (
+ isApkVerityEnabled() || isLegacyApkVerityEnabled());
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 2e9d26a0a0ca..022c1aad8113 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -40,6 +40,7 @@ import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.SessionParams;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -1170,6 +1171,7 @@ class PackageManagerShellCommand extends ShellCommand {
String checkProfilesRaw = null;
boolean secondaryDex = false;
String split = null;
+ boolean compileLayouts = false;
String opt;
while ((opt = getNextOption()) != null) {
@@ -1189,6 +1191,9 @@ class PackageManagerShellCommand extends ShellCommand {
case "-r":
compilationReason = getNextArgRequired();
break;
+ case "--compile-layouts":
+ compileLayouts = true;
+ break;
case "--check-prof":
checkProfilesRaw = getNextArgRequired();
break;
@@ -1220,14 +1225,16 @@ class PackageManagerShellCommand extends ShellCommand {
}
}
- if (compilerFilter != null && compilationReason != null) {
- pw.println("Cannot use compilation filter (\"-m\") and compilation reason (\"-r\") " +
- "at the same time");
- return 1;
- }
- if (compilerFilter == null && compilationReason == null) {
- pw.println("Cannot run without any of compilation filter (\"-m\") and compilation " +
- "reason (\"-r\") at the same time");
+ final boolean compilerFilterGiven = compilerFilter != null;
+ final boolean compilationReasonGiven = compilationReason != null;
+ // Make sure exactly one of -m, -r, or --compile-layouts is given.
+ if ((!compilerFilterGiven && !compilationReasonGiven && !compileLayouts)
+ || (!compilerFilterGiven && compilationReasonGiven && compileLayouts)
+ || (compilerFilterGiven && !compilationReasonGiven && compileLayouts)
+ || (compilerFilterGiven && compilationReasonGiven && !compileLayouts)
+ || (compilerFilterGiven && compilationReasonGiven && compileLayouts)) {
+ pw.println("Must specify exactly one of compilation filter (\"-m\"), compilation " +
+ "reason (\"-r\"), or compile layouts (\"--compile-layouts\")");
return 1;
}
@@ -1241,15 +1248,16 @@ class PackageManagerShellCommand extends ShellCommand {
return 1;
}
- String targetCompilerFilter;
- if (compilerFilter != null) {
+ String targetCompilerFilter = null;
+ if (compilerFilterGiven) {
if (!DexFile.isValidCompilerFilter(compilerFilter)) {
pw.println("Error: \"" + compilerFilter +
"\" is not a valid compilation filter.");
return 1;
}
targetCompilerFilter = compilerFilter;
- } else {
+ }
+ if (compilationReasonGiven) {
int reason = -1;
for (int i = 0; i < PackageManagerServiceCompilerMapping.REASON_STRINGS.length; i++) {
if (PackageManagerServiceCompilerMapping.REASON_STRINGS[i].equals(
@@ -1291,12 +1299,19 @@ class PackageManagerShellCommand extends ShellCommand {
pw.flush();
}
- boolean result = secondaryDex
+ boolean result = true;
+ if (compileLayouts) {
+ PackageManagerInternal internal = LocalServices.getService(
+ PackageManagerInternal.class);
+ result = internal.compileLayouts(packageName);
+ } else {
+ result = secondaryDex
? mInterface.performDexOptSecondary(packageName,
targetCompilerFilter, forceCompilation)
: mInterface.performDexOptMode(packageName,
checkProfiles, targetCompilerFilter, forceCompilation,
true /* bootComplete */, split);
+ }
if (!result) {
failedPackages.add(packageName);
}
@@ -2293,9 +2308,7 @@ class PackageManagerShellCommand extends ShellCommand {
break;
case "--apex":
sessionParams.installFlags |= PackageManager.INSTALL_APEX;
- // TODO(b/118865310): APEX packages should always imply
- // sessionParams.isStaged(). Enforce this when the staged
- // install workflow is complete.
+ sessionParams.setStaged();
break;
case "--multi-package":
sessionParams.setMultiPackage();
@@ -3006,6 +3019,7 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println(" --check-prof (true | false): look at profiles when doing dexopt?");
pw.println(" --secondary-dex: compile app secondary dex files");
pw.println(" --split SPLIT: compile only the given split name");
+ pw.println(" --compile-layouts: compile layout resources for faster inflation");
pw.println("");
pw.println(" force-dex-opt PACKAGE");
pw.println(" Force immediate execution of dex opt for the given PACKAGE.");
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 3c22f07ad108..58f262c4c889 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -392,6 +392,14 @@ public abstract class PackageSettingBase extends SettingBase {
modifyUserState(userId).hidden = hidden;
}
+ int getDistractionFlags(int userId) {
+ return readUserState(userId).distractionFlags;
+ }
+
+ void setDistractionFlags(int distractionFlags, int userId) {
+ modifyUserState(userId).distractionFlags = distractionFlags;
+ }
+
boolean getSuspended(int userId) {
return readUserState(userId).suspended;
}
@@ -423,7 +431,8 @@ public abstract class PackageSettingBase extends SettingBase {
}
void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped,
- boolean notLaunched, boolean hidden, boolean suspended, String suspendingPackage,
+ boolean notLaunched, boolean hidden, int distractionFlags, boolean suspended,
+ String suspendingPackage,
SuspendDialogInfo dialogInfo, PersistableBundle suspendedAppExtras,
PersistableBundle suspendedLauncherExtras, boolean instantApp,
boolean virtualPreload, String lastDisableAppCaller,
@@ -437,6 +446,7 @@ public abstract class PackageSettingBase extends SettingBase {
state.stopped = stopped;
state.notLaunched = notLaunched;
state.hidden = hidden;
+ state.distractionFlags = distractionFlags;
state.suspended = suspended;
state.suspendingPackage = suspendingPackage;
state.dialogInfo = dialogInfo;
@@ -607,6 +617,7 @@ public abstract class PackageSettingBase extends SettingBase {
}
proto.write(PackageProto.UserInfoProto.INSTALL_TYPE, installType);
proto.write(PackageProto.UserInfoProto.IS_HIDDEN, state.hidden);
+ proto.write(PackageProto.UserInfoProto.DISTRACTION_FLAGS, state.distractionFlags);
proto.write(PackageProto.UserInfoProto.IS_SUSPENDED, state.suspended);
if (state.suspended) {
proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE, state.suspendingPackage);
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index b47d96622e96..b4154c7476a1 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -17,8 +17,8 @@
package com.android.server.pm;
import android.content.pm.PackageParser;
-import android.content.pm.Signature;
import android.content.pm.PackageParser.SigningDetails;
+import android.content.pm.Signature;
import android.os.Environment;
import android.util.Slog;
import android.util.Xml;
@@ -81,6 +81,13 @@ public final class SELinuxMMAC {
sMacPermissions.add(new File(
Environment.getRootDirectory(), "/etc/selinux/plat_mac_permissions.xml"));
+ // Product mac permissions (optional).
+ final File productMacPermission = new File(
+ Environment.getProductDirectory(), "/etc/selinux/product_mac_permissions.xml");
+ if (productMacPermission.exists()) {
+ sMacPermissions.add(productMacPermission);
+ }
+
// Vendor mac permissions.
// The filename has been renamed from nonplat_mac_permissions to
// vendor_mac_permissions. Either of them should exist.
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index c524dba01ba6..b0f232607d88 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -223,6 +223,7 @@ public final class Settings {
private static final String ATTR_BLOCKED = "blocked";
// New name for the above attribute.
private static final String ATTR_HIDDEN = "hidden";
+ private static final String ATTR_DISTRACTION_FLAGS = "distraction_flags";
private static final String ATTR_SUSPENDED = "suspended";
private static final String ATTR_SUSPENDING_PACKAGE = "suspending-package";
/**
@@ -734,6 +735,7 @@ public final class Settings {
true /*stopped*/,
true /*notLaunched*/,
false /*hidden*/,
+ 0 /*distractionFlags*/,
false /*suspended*/,
null /*suspendingPackage*/,
null /*dialogInfo*/,
@@ -1628,6 +1630,7 @@ public final class Settings {
false /*stopped*/,
false /*notLaunched*/,
false /*hidden*/,
+ 0 /*distractionFlags*/,
false /*suspended*/,
null /*suspendingPackage*/,
null /*dialogInfo*/,
@@ -1703,6 +1706,8 @@ public final class Settings {
hidden = hiddenStr == null
? hidden : Boolean.parseBoolean(hiddenStr);
+ final int distractionFlags = XmlUtils.readIntAttribute(parser,
+ ATTR_DISTRACTION_FLAGS, 0);
final boolean suspended = XmlUtils.readBooleanAttribute(parser, ATTR_SUSPENDED,
false);
String suspendingPackage = parser.getAttributeValue(null,
@@ -1781,7 +1786,8 @@ public final class Settings {
setBlockUninstallLPw(userId, name, true);
}
ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
- hidden, suspended, suspendingPackage, suspendDialogInfo,
+ hidden, distractionFlags, suspended, suspendingPackage,
+ suspendDialogInfo,
suspendedAppExtras, suspendedLauncherExtras, instantApp, virtualPreload,
enabledCaller, enabledComponents, disabledComponents, verifState,
linkGeneration, installReason, harmfulAppWarning);
@@ -2089,6 +2095,10 @@ public final class Settings {
if (ustate.hidden) {
serializer.attribute(null, ATTR_HIDDEN, "true");
}
+ if (ustate.distractionFlags != 0) {
+ serializer.attribute(null, ATTR_DISTRACTION_FLAGS,
+ Integer.toString(ustate.distractionFlags));
+ }
if (ustate.suspended) {
serializer.attribute(null, ATTR_SUSPENDED, "true");
if (ustate.suspendingPackage != null) {
@@ -2780,13 +2790,13 @@ public final class Settings {
// dataPath - path to package's data path
// seinfo - seinfo label for the app (assigned at install time)
// gids - supplementary gids this app launches with
+ // profileableFromShellFlag - 0 or 1 if the package is profileable from shell.
//
// NOTE: We prefer not to expose all ApplicationInfo flags for now.
//
// DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
// FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
- // frameworks/base/libs/packagelistparser
- // system/core/run-as/run-as.c
+ // system/core/libpackagelistparser
//
sb.setLength(0);
sb.append(ai.packageName);
@@ -2806,6 +2816,8 @@ public final class Settings {
} else {
sb.append("none");
}
+ sb.append(" ");
+ sb.append(ai.isProfileableByShell() ? "1" : "0");
sb.append("\n");
writer.append(sb);
}
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 83f0fde066ec..563fd7f90c4b 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -20,8 +20,10 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.os.PersistableBundle;
import android.text.format.Formatter;
@@ -640,6 +642,55 @@ class ShortcutPackage extends ShortcutPackageItem {
}
/**
+ * Returns a list of ShortcutInfos that match the given intent filter and the category of
+ * available ShareTarget definitions in this package.
+ */
+ public List<ShortcutManager.ShareShortcutInfo> getMatchingShareTargets(
+ @NonNull IntentFilter filter) {
+ final List<ShareTargetInfo> matchedTargets = new ArrayList<>();
+ for (int i = 0; i < mShareTargets.size(); i++) {
+ final ShareTargetInfo target = mShareTargets.get(i);
+ for (ShareTargetInfo.TargetData data : target.mTargetData) {
+ if (filter.hasDataType(data.mMimeType)) {
+ // Matched at least with one data type
+ matchedTargets.add(target);
+ break;
+ }
+ }
+ }
+
+ if (matchedTargets.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // Get the list of all dynamic shortcuts in this package
+ final ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+ findAll(shortcuts, ShortcutInfo::isDynamicVisible, ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
+
+ final List<ShortcutManager.ShareShortcutInfo> result = new ArrayList<>();
+ for (int i = 0; i < shortcuts.size(); i++) {
+ final ShortcutInfo si = shortcuts.get(i);
+ for (int j = 0; j < matchedTargets.size(); j++) {
+ // Shortcut must have all of share target categories
+ boolean hasAllCategories = true;
+ final ShareTargetInfo target = matchedTargets.get(j);
+ for (int q = 0; q < target.mCategories.length; q++) {
+ if (!si.getCategories().contains(target.mCategories[q])) {
+ hasAllCategories = false;
+ break;
+ }
+ }
+ if (hasAllCategories) {
+ result.add(new ShortcutManager.ShareShortcutInfo(si, new ComponentName(
+ getPackageName(), target.mTargetClass)));
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
* Return the filenames (excluding path names) of icon bitmap files from this package.
*/
public ArraySet<String> getUsedBitmapFiles() {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 2b773f47e3e9..fdbaba24966b 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -46,6 +46,7 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
import android.content.res.Resources;
@@ -2149,6 +2150,23 @@ public class ShortcutService extends IShortcutService.Stub {
}
}
+ @Override
+ public ParceledListSlice<ShortcutManager.ShareShortcutInfo> getShareTargets(String packageName,
+ IntentFilter filter, @UserIdInt int userId) {
+ verifyCaller(packageName, userId);
+
+ synchronized (mLock) {
+ throwIfUserLockedL(userId);
+
+ final List<ShortcutManager.ShareShortcutInfo> shortcutInfoList = new ArrayList<>();
+
+ final ShortcutUser user = getUserShortcutsLocked(userId);
+ user.forAllPackages(p -> shortcutInfoList.addAll(p.getMatchingShareTargets(filter)));
+
+ return new ParceledListSlice<>(shortcutInfoList);
+ }
+ }
+
@GuardedBy("mLock")
private ParceledListSlice<ShortcutInfo> getShortcutsWithQueryLocked(@NonNull String packageName,
@UserIdInt int userId, int cloneFlags, @NonNull Predicate<ShortcutInfo> query) {
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 3beda6a3f92b..7bab0bbc7964 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -17,10 +17,25 @@
package com.android.server.pm;
import android.annotation.NonNull;
+import android.apex.ApexInfo;
+import android.apex.ApexInfoList;
+import android.apex.ApexSessionInfo;
+import android.apex.IApexService;
import android.content.pm.PackageInstaller;
+import android.content.pm.PackageInstaller.SessionInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageParser.PackageParserException;
+import android.content.pm.PackageParser.SigningDetails;
+import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
import android.content.pm.ParceledListSlice;
+import android.content.pm.Signature;
import android.os.Handler;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.text.TextUtils;
+import android.util.Slog;
import android.util.SparseArray;
+import android.util.apk.ApkSignatureVerifier;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
@@ -39,9 +54,6 @@ public class StagingManager {
private final PackageManagerService mPm;
private final Handler mBgHandler;
- // STOPSHIP: This is a temporary mock implementation of staged sessions. This variable
- // shouldn't be needed at all.
- // TODO(b/118865310): Implement staged sessions logic.
@GuardedBy("mStagedSessions")
private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>();
@@ -71,15 +83,121 @@ public class StagingManager {
return new ParceledListSlice<>(result);
}
- void commitSession(@NonNull PackageInstallerSession sessionInfo) {
- updateStoredSession(sessionInfo);
+ private static boolean validateApexSignatureLocked(String apexPath, String packageName) {
+ final SigningDetails signingDetails;
+ try {
+ signingDetails = ApkSignatureVerifier.verify(apexPath, SignatureSchemeVersion.JAR);
+ } catch (PackageParserException e) {
+ Slog.e(TAG, "Unable to parse APEX package: " + apexPath, e);
+ return false;
+ }
+
+ final IApexService apex = IApexService.Stub.asInterface(
+ ServiceManager.getService("apexservice"));
+ final ApexInfo apexInfo;
+ try {
+ apexInfo = apex.getActivePackage(packageName);
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to contact APEXD", re);
+ return false;
+ }
+
+ if (apexInfo == null || TextUtils.isEmpty(apexInfo.packageName)) {
+ // TODO: What is the right thing to do here ? This implies there's no active package
+ // with the given name. This should never be the case in production (where we only
+ // accept updates to existing APEXes) but may be required for testing.
+ return true;
+ }
+
+ final SigningDetails existingSigningDetails;
+ try {
+ existingSigningDetails = ApkSignatureVerifier.verify(
+ apexInfo.packagePath, SignatureSchemeVersion.JAR);
+ } catch (PackageParserException e) {
+ Slog.e(TAG, "Unable to parse APEX package: " + apexInfo.packagePath, e);
+ return false;
+ }
- mBgHandler.post(() -> {
- // TODO(b/118865310): Dispatch the session to apexd/PackageManager for verification. For
- // now we directly mark it as ready.
- sessionInfo.setStagedSessionReady();
- mPm.sendSessionUpdatedBroadcast(sessionInfo.generateInfo(), sessionInfo.userId);
- });
+ // Now that we have both sets of signatures, demand that they're an exact match.
+ if (Signature.areExactMatch(existingSigningDetails.signatures, signingDetails.signatures)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private static boolean submitSessionToApexService(int sessionId, ApexInfoList apexInfoList) {
+ final IApexService apex = IApexService.Stub.asInterface(
+ ServiceManager.getService("apexservice"));
+ boolean success;
+ try {
+ success = apex.submitStagedSession(sessionId, new int[0], apexInfoList);
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to contact apexservice", re);
+ return false;
+ }
+ return success;
+ }
+
+ private void preRebootVerification(@NonNull PackageInstallerSession session) {
+ boolean success = true;
+ if ((session.params.installFlags & PackageManager.INSTALL_APEX) != 0) {
+
+ final ApexInfoList apexInfoList = new ApexInfoList();
+
+ if (!submitSessionToApexService(session.sessionId, apexInfoList)) {
+ success = false;
+ } else {
+ // For APEXes, we validate the signature here before we mark the session as ready,
+ // so we fail the session early if there is a signature mismatch. For APKs, the
+ // signature verification will be done by the package manager at the point at which
+ // it applies the staged install.
+ //
+ // TODO: Decide whether we want to fail fast by detecting signature mismatches right
+ // away.
+ for (ApexInfo apexPackage : apexInfoList.apexInfos) {
+ if (!validateApexSignatureLocked(apexPackage.packagePath,
+ apexPackage.packageName)) {
+ success = false;
+ break;
+ }
+ }
+ }
+ }
+ if (success) {
+ session.setStagedSessionReady();
+ } else {
+ session.setStagedSessionFailed(SessionInfo.VERIFICATION_FAILED);
+ }
+ }
+
+ private void resumeSession(@NonNull PackageInstallerSession session) {
+ // Check with apexservice whether the apex
+ // packages have been activated.
+ final IApexService apex = IApexService.Stub.asInterface(
+ ServiceManager.getService("apexservice"));
+ ApexSessionInfo apexSessionInfo;
+ try {
+ apexSessionInfo = apex.getStagedSessionInfo(session.sessionId);
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to contact apexservice", re);
+ // TODO should we retry here? Mark the session as failed?
+ return;
+ }
+ if (apexSessionInfo.isActivationFailed || apexSessionInfo.isUnknown) {
+ session.setStagedSessionFailed(SessionInfo.ACTIVATION_FAILED);
+ }
+ if (apexSessionInfo.isActivated) {
+ session.setStagedSessionApplied();
+ // TODO(b/118865310) if multi-package proceed with the installation of APKs.
+ }
+ // TODO(b/118865310) if (apexSessionInfo.isVerified) { /* mark this as staged in apexd */ }
+ // In every other case apexd will retry to apply the session at next boot.
+ }
+
+ void commitSession(@NonNull PackageInstallerSession session) {
+ updateStoredSession(session);
+ mBgHandler.post(() -> preRebootVerification(session));
}
void createSession(@NonNull PackageInstallerSession sessionInfo) {
@@ -94,4 +212,22 @@ public class StagingManager {
mStagedSessions.remove(sessionInfo.sessionId);
}
}
+
+ void restoreSession(@NonNull PackageInstallerSession session) {
+ updateStoredSession(session);
+ // Check the state of the session and decide what to do next.
+ if (session.isStagedSessionFailed() || session.isStagedSessionApplied()) {
+ // Final states, nothing to do.
+ return;
+ }
+ if (!session.isStagedSessionReady()) {
+ // The framework got restarted before the pre-reboot verification could complete,
+ // restart the verification.
+ mBgHandler.post(() -> preRebootVerification(session));
+ } else {
+ // Session had already being marked ready. Start the checks to verify if there is any
+ // follow-up work.
+ mBgHandler.post(() -> resumeSession(session));
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index dd04652a29b3..aaa187468f8d 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -620,9 +620,6 @@ public class UserRestrictionsUtils {
&& callingUid != Process.SYSTEM_UID) {
return true;
} else if (String.valueOf(Settings.Secure.LOCATION_MODE_OFF).equals(value)) {
- // Note LOCATION_MODE will be converted into LOCATION_PROVIDERS_ALLOWED
- // in android.provider.Settings.Secure.putStringForUser(), so we shouldn't come
- // here normally, but we still protect it here from a direct provider write.
return false;
}
restriction = UserManager.DISALLOW_SHARE_LOCATION;
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 1f05dc966555..863bfd5ea391 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -472,6 +472,33 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
}
/**
+ * Compile layout resources in a given package.
+ */
+ public boolean compileLayouts(PackageParser.Package pkg) {
+ try {
+ final String packageName = pkg.packageName;
+ final String apkPath = pkg.baseCodePath;
+ final ApplicationInfo appInfo = pkg.applicationInfo;
+ final String outDexFile = appInfo.dataDir + "/code_cache/compiled_view.dex";
+ Log.i("PackageManager", "Compiling layouts in " + packageName + " (" + apkPath +
+ ") to " + outDexFile);
+ long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mInstallLock) {
+ return mInstaller.compileLayouts(apkPath, packageName, outDexFile,
+ appInfo.uid);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+ catch (Throwable e) {
+ Log.e("PackageManager", "Failed to compile layouts", e);
+ return false;
+ }
+ }
+
+ /**
* Build the profiles names for all the package code paths (excluding resource only paths).
* Return the map [code path -> profile name].
*/
diff --git a/services/core/java/com/android/server/pm/dex/DexLogger.java b/services/core/java/com/android/server/pm/dex/DexLogger.java
index 68a755b382ca..78fa82c6bcdd 100644
--- a/services/core/java/com/android/server/pm/dex/DexLogger.java
+++ b/services/core/java/com/android/server/pm/dex/DexLogger.java
@@ -28,7 +28,6 @@ import android.util.PackageUtils;
import android.util.Slog;
import android.util.SparseArray;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
@@ -53,21 +52,18 @@ public class DexLogger {
private final IPackageManager mPackageManager;
private final PackageDynamicCodeLoading mPackageDynamicCodeLoading;
- private final Object mInstallLock;
- @GuardedBy("mInstallLock")
private final Installer mInstaller;
- public DexLogger(IPackageManager pms, Installer installer, Object installLock) {
- this(pms, installer, installLock, new PackageDynamicCodeLoading());
+ public DexLogger(IPackageManager pms, Installer installer) {
+ this(pms, installer, new PackageDynamicCodeLoading());
}
@VisibleForTesting
- DexLogger(IPackageManager pms, Installer installer, Object installLock,
+ DexLogger(IPackageManager pms, Installer installer,
PackageDynamicCodeLoading packageDynamicCodeLoading) {
mPackageManager = pms;
mPackageDynamicCodeLoading = packageDynamicCodeLoading;
mInstaller = installer;
- mInstallLock = installLock;
}
public Set<String> getAllPackagesWithDynamicCodeLoading() {
@@ -131,14 +127,16 @@ public class DexLogger {
}
byte[] hash = null;
- synchronized (mInstallLock) {
- try {
- hash = mInstaller.hashSecondaryDexFile(filePath, packageName, appInfo.uid,
- appInfo.volumeUuid, storageFlags);
- } catch (InstallerException e) {
- Slog.e(TAG, "Got InstallerException when hashing file " + filePath
- + ": " + e.getMessage());
- }
+ try {
+ // Note that we do not take the install lock here. Hashing should never interfere
+ // with app update/compilation/removal. We may get anomalous results if a file
+ // changes while we hash it, but that can happen anyway and is harmless for our
+ // purposes.
+ hash = mInstaller.hashSecondaryDexFile(filePath, packageName, appInfo.uid,
+ appInfo.volumeUuid, storageFlags);
+ } catch (InstallerException e) {
+ Slog.e(TAG, "Got InstallerException when hashing file " + filePath
+ + ": " + e.getMessage());
}
String fileName = new File(filePath).getName();
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index e57d9d7ab61c..b54683673e7b 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -129,7 +129,7 @@ public class DexManager {
mPackageDexOptimizer = pdo;
mInstaller = installer;
mInstallLock = installLock;
- mDexLogger = new DexLogger(pms, installer, installLock);
+ mDexLogger = new DexLogger(pms, installer);
}
public DexLogger getDexLogger() {
diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
index 93ee44cdf0ce..91ad11e53538 100644
--- a/services/core/java/com/android/server/pm/dex/DexoptUtils.java
+++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
@@ -22,7 +22,6 @@ import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.os.ClassLoaderFactory;
-import com.android.server.pm.PackageDexOptimizer;
import java.io.File;
import java.util.List;
@@ -275,15 +274,11 @@ public final class DexoptUtils {
/**
* Encodes a single class loader dependency starting from {@param path} and
* {@param classLoaderName}.
- * When classpath is {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns
- * the same. This special property is used only during OTA.
* NOTE: Keep this in sync with the dexopt expectations! Right now that is either "PCL[path]"
* for a PathClassLoader or "DLC[path]" for a DelegateLastClassLoader.
*/
/*package*/ static String encodeClassLoader(String classpath, String classLoaderName) {
- if (classpath.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) {
- return classpath;
- }
+ classpath.getClass(); // Throw NPE if classpath is null
String classLoaderDexoptEncoding = classLoaderName;
if (ClassLoaderFactory.isPathClassLoaderName(classLoaderName)) {
classLoaderDexoptEncoding = "PCL";
@@ -306,16 +301,10 @@ public final class DexoptUtils {
/**
* Links to dependencies together in a format accepted by dexopt.
* For the special case when either of cl1 or cl2 equals
- * {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns the same. This
- * property is used only during OTA.
* NOTE: Keep this in sync with the dexopt expectations! Right now that is a list of split
* dependencies {@see encodeClassLoader} separated by ';'.
*/
/*package*/ static String encodeClassLoaderChain(String cl1, String cl2) {
- if (cl1.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK) ||
- cl2.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) {
- return PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK;
- }
if (cl1.isEmpty()) return cl2;
if (cl2.isEmpty()) return cl1;
return cl1 + ";" + cl2;
diff --git a/services/core/java/com/android/server/pm/dex/ViewCompiler.java b/services/core/java/com/android/server/pm/dex/ViewCompiler.java
new file mode 100644
index 000000000000..8d8e17e92b3d
--- /dev/null
+++ b/services/core/java/com/android/server/pm/dex/ViewCompiler.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 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.pm.dex;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageParser;
+import android.os.Binder;
+import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.pm.Installer;
+
+public class ViewCompiler {
+ private final Object mInstallLock;
+ @GuardedBy("mInstallLock")
+ private final Installer mInstaller;
+
+ public ViewCompiler(Object installLock, Installer installer) {
+ mInstallLock = installLock;
+ mInstaller = installer;
+ }
+
+ public boolean compileLayouts(PackageParser.Package pkg) {
+ try {
+ final String packageName = pkg.packageName;
+ final String apkPath = pkg.baseCodePath;
+ final ApplicationInfo appInfo = pkg.applicationInfo;
+ final String outDexFile = appInfo.dataDir + "/code_cache/compiled_view.dex";
+ Log.i("PackageManager", "Compiling layouts in " + packageName + " (" + apkPath +
+ ") to " + outDexFile);
+ long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mInstallLock) {
+ return mInstaller.compileLayouts(apkPath, packageName, outDexFile,
+ appInfo.uid);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ } catch (Throwable e) {
+ Log.e("PackageManager", "Failed to compile layouts", e);
+ return false;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java
index 3a49412357d8..17f83479a3b1 100644
--- a/services/core/java/com/android/server/pm/permission/BasePermission.java
+++ b/services/core/java/com/android/server/pm/permission/BasePermission.java
@@ -247,6 +247,10 @@ public final class BasePermission {
public boolean isDocumenter() {
return (protectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0;
}
+ public boolean isConfigurator() {
+ return (protectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR)
+ != 0;
+ }
public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) {
if (!origPackageName.equals(sourcePackageName)) {
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 789664d82332..d5af31300bf5 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -225,6 +225,7 @@ public final class DefaultPermissionGrantPolicy {
private final Handler mHandler;
private PackagesProvider mLocationPackagesProvider;
+ private PackagesProvider mLocationExtraPackagesProvider;
private PackagesProvider mVoiceInteractionPackagesProvider;
private PackagesProvider mSmsAppPackagesProvider;
private PackagesProvider mDialerAppPackagesProvider;
@@ -270,6 +271,13 @@ public final class DefaultPermissionGrantPolicy {
}
}
+ /** Sets the provider for loction extra packages. */
+ public void setLocationExtraPackagesProvider(PackagesProvider provider) {
+ synchronized (mLock) {
+ mLocationExtraPackagesProvider = provider;
+ }
+ }
+
public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mVoiceInteractionPackagesProvider = provider;
@@ -403,6 +411,7 @@ public final class DefaultPermissionGrantPolicy {
Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
final PackagesProvider locationPackagesProvider;
+ final PackagesProvider locationExtraPackagesProvider;
final PackagesProvider voiceInteractionPackagesProvider;
final PackagesProvider smsAppPackagesProvider;
final PackagesProvider dialerAppPackagesProvider;
@@ -412,6 +421,7 @@ public final class DefaultPermissionGrantPolicy {
synchronized (mLock) {
locationPackagesProvider = mLocationPackagesProvider;
+ locationExtraPackagesProvider = mLocationExtraPackagesProvider;
voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
smsAppPackagesProvider = mSmsAppPackagesProvider;
dialerAppPackagesProvider = mDialerAppPackagesProvider;
@@ -424,6 +434,8 @@ public final class DefaultPermissionGrantPolicy {
? voiceInteractionPackagesProvider.getPackages(userId) : null;
String[] locationPackageNames = (locationPackagesProvider != null)
? locationPackagesProvider.getPackages(userId) : null;
+ String[] locationExtraPackageNames = (locationExtraPackagesProvider != null)
+ ? locationExtraPackagesProvider.getPackages(userId) : null;
String[] smsAppPackageNames = (smsAppPackagesProvider != null)
? smsAppPackagesProvider.getPackages(userId) : null;
String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
@@ -523,7 +535,7 @@ public final class DefaultPermissionGrantPolicy {
}
// Cell Broadcast Receiver
- grantPermissionsToSystemPackage(
+ grantSystemFixedPermissionsToSystemPackage(
getDefaultSystemHandlerActivityPackage(Intents.SMS_CB_RECEIVED_ACTION, userId),
userId, SMS_PERMISSIONS);
@@ -638,6 +650,12 @@ public final class DefaultPermissionGrantPolicy {
LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
}
}
+ if (locationExtraPackageNames != null) {
+ // Also grant location permission to location extra packages.
+ for (String packageName : locationExtraPackageNames) {
+ grantPermissionsToSystemPackage(packageName, userId, LOCATION_PERMISSIONS);
+ }
+ }
// Music
Intent musicIntent = new Intent(Intent.ACTION_VIEW)
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 93964cb09ae6..30b5e49bc3fd 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1640,6 +1640,13 @@ public class PermissionManagerService {
// Special permissions for the system default text classifier.
allowed = true;
}
+ if (!allowed && bp.isConfigurator()
+ && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
+ PackageManagerInternal.PACKAGE_CONFIGURATOR,
+ UserHandle.USER_SYSTEM))) {
+ // Special permissions for the device configurator.
+ allowed = true;
+ }
if (!allowed && bp.isWellbeing()
&& pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
PackageManagerInternal.PACKAGE_WELLBEING, UserHandle.USER_SYSTEM))) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 2060aef37044..41cab2d7ebd3 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -84,8 +84,10 @@ import static android.view.WindowManagerGlobal.ADD_OKAY;
import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;
-import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
-import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
+import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs
+ .CAMERA_LENS_COVER_ABSENT;
+import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs
+ .CAMERA_LENS_UNCOVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DELEGATE;
@@ -478,6 +480,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mShortPressOnSleepBehavior;
int mShortPressOnWindowBehavior;
boolean mHasSoftInput = false;
+ boolean mHapticTextHandleEnabled;
boolean mUseTvRouting;
int mVeryLongPressTimeout;
boolean mAllowStartActivityForLongPressOnPowerDuringSetup;
@@ -565,6 +568,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean mScreenshotChordPowerKeyTriggered;
private long mScreenshotChordPowerKeyTime;
+ private static final long MOVING_DISPLAY_TO_TOP_DURATION_MILLIS = 10;
+ private volatile boolean mMovingDisplayToTopKeyTriggered;
+ private volatile long mMovingDisplayToTopKeyTime;
+
// Ringer toggle should reuse timing and triggering from screenshot power and a11y vol up
private int mRingerToggleChord = VOLUME_HUSH_OFF;
@@ -604,7 +611,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean mAodShowing;
private boolean mPerDisplayFocusEnabled = false;
- private int mTopFocusedDisplayId = INVALID_DISPLAY;
+ private volatile int mTopFocusedDisplayId = INVALID_DISPLAY;
private static final int MSG_ENABLE_POINTER_LOCATION = 1;
private static final int MSG_DISABLE_POINTER_LOCATION = 2;
@@ -632,6 +639,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_POWER_VERY_LONG_PRESS = 25;
private static final int MSG_NOTIFY_USER_ACTIVITY = 26;
private static final int MSG_RINGER_TOGGLE_CHORD = 27;
+ private static final int MSG_MOVE_DISPLAY_TO_TOP = 28;
private class PolicyHandler extends Handler {
@Override
@@ -727,6 +735,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case MSG_RINGER_TOGGLE_CHORD:
handleRingerChordGesture();
break;
+ case MSG_MOVE_DISPLAY_TO_TOP:
+ mWindowManagerFuncs.moveDisplayToTop(msg.arg1);
+ mMovingDisplayToTopKeyTriggered = false;
+ break;
}
}
}
@@ -808,6 +820,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
};
+ private Runnable mPossibleVeryLongPressReboot = new Runnable() {
+ @Override
+ public void run() {
+ mActivityManagerInternal.prepareForPossibleShutdown();
+ }
+ };
+
private void handleRingerChordGesture() {
if (mRingerToggleChord == VOLUME_HUSH_OFF) {
return;
@@ -953,6 +972,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Inform the StatusBar; but do not allow it to consume the event.
sendSystemKeyToStatusBarAsync(event.getKeyCode());
+ schedulePossibleVeryLongPressReboot();
+
// If the power key has still not yet been handled, then detect short
// press, long press, or multi press and decide what to do.
mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered
@@ -1056,6 +1077,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (hasVeryLongPressOnPowerBehavior()) {
mHandler.removeMessages(MSG_POWER_VERY_LONG_PRESS);
}
+ cancelPossibleVeryLongPressReboot();
}
private void cancelPendingBackKeyAction() {
@@ -1815,6 +1837,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mAllowStartActivityForLongPressOnPowerDuringSetup = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_allowStartActivityForLongPressOnPowerInSetup);
+ mHapticTextHandleEnabled = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_enableHapticTextHandle);
+
mUseTvRouting = AudioSystem.getPlatformType(mContext) == AudioSystem.PLATFORM_TELEVISION;
mHandleVolumeKeysInWM = mContext.getResources().getBoolean(
@@ -2270,9 +2295,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
final LayoutParams attrs = win.getAttrs();
- final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleLw() &&
- ((imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0
- || !canBeHiddenByKeyguardLw(imeTarget));
+ final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleLw()
+ && (imeTarget.canShowWhenLocked() || !canBeHiddenByKeyguardLw(imeTarget));
// Show IME over the keyguard if the target allows it
boolean allowWhenLocked = (win.isInputMethodWindow() || imeTarget == this)
@@ -2280,7 +2304,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (isKeyguardLocked() && isKeyguardOccluded()) {
// Show SHOW_WHEN_LOCKED windows if Keyguard is occluded.
- allowWhenLocked |= (attrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0
+ allowWhenLocked |= win.canShowWhenLocked()
// Show error dialogs over apps that are shown on lockscreen
|| (attrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0;
}
@@ -2558,12 +2582,25 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final int eventDisplayId = event.getDisplayId();
if (result == 0 && !mPerDisplayFocusEnabled
&& eventDisplayId != INVALID_DISPLAY && eventDisplayId != mTopFocusedDisplayId) {
- // Someone tries to send a key event to a display which doesn't have a focused window.
- // We drop the event here, or it will cause ANR.
- // TODO (b/121057974): The user may be confused about why the key doesn't work, so we
- // may need to deal with this problem.
- Slog.i(TAG, "Dropping this event targeting display #" + eventDisplayId
- + " because the focus is on display #" + mTopFocusedDisplayId);
+ // An event is targeting a non-focused display. Try to move the display to top so that
+ // it can become the focused display to interact with the user.
+ final long eventDownTime = event.getDownTime();
+ if (mMovingDisplayToTopKeyTime < eventDownTime) {
+ // We have not handled this event yet. Move the display to top, and then tell
+ // dispatcher to try again later.
+ mMovingDisplayToTopKeyTime = eventDownTime;
+ mMovingDisplayToTopKeyTriggered = true;
+ mHandler.sendMessage(
+ mHandler.obtainMessage(MSG_MOVE_DISPLAY_TO_TOP, eventDisplayId, 0));
+ return MOVING_DISPLAY_TO_TOP_DURATION_MILLIS;
+ } else if (mMovingDisplayToTopKeyTriggered) {
+ // The message has not been handled yet. Tell dispatcher to try again later.
+ return MOVING_DISPLAY_TO_TOP_DURATION_MILLIS;
+ }
+ // The target display is still not the top focused display. Drop the event because the
+ // display may not contain any window which can receive keys.
+ Slog.w(TAG, "Dropping key targeting non-focused display #" + eventDisplayId
+ + " keyCode=" + KeyEvent.keyCodeToString(event.getKeyCode()));
return -1;
}
return result;
@@ -4901,6 +4938,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void schedulePossibleVeryLongPressReboot() {
+ mHandler.removeCallbacks(mPossibleVeryLongPressReboot);
+ mHandler.postDelayed(mPossibleVeryLongPressReboot, mVeryLongPressTimeout);
+ }
+
+ private void cancelPossibleVeryLongPressReboot() {
+ mHandler.removeCallbacks(mPossibleVeryLongPressReboot);
+ }
+
// TODO (multidisplay): Support multiple displays in WindowManagerPolicy.
private void updateScreenOffSleepToken(boolean acquire) {
if (acquire) {
@@ -5158,8 +5204,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case HapticFeedbackConstants.CLOCK_TICK:
case HapticFeedbackConstants.CONTEXT_CLICK:
return VibrationEffect.get(VibrationEffect.EFFECT_TICK);
- case HapticFeedbackConstants.KEYBOARD_RELEASE:
case HapticFeedbackConstants.TEXT_HANDLE_MOVE:
+ if (!mHapticTextHandleEnabled) {
+ return null;
+ }
+ case HapticFeedbackConstants.KEYBOARD_RELEASE:
case HapticFeedbackConstants.VIRTUAL_KEY_RELEASE:
case HapticFeedbackConstants.ENTRY_BUMP:
case HapticFeedbackConstants.DRAG_CROSSING:
@@ -5324,11 +5373,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.println(mAllowStartActivityForLongPressOnPowerDuringSetup);
pw.print(prefix);
pw.print("mHasSoftInput="); pw.print(mHasSoftInput);
- pw.print(" mDismissImeOnBackKeyPressed="); pw.println(mDismissImeOnBackKeyPressed);
+ pw.print(" mHapticTextHandleEnabled="); pw.println(mHapticTextHandleEnabled);
+ pw.print(prefix);
+ pw.print("mDismissImeOnBackKeyPressed="); pw.print(mDismissImeOnBackKeyPressed);
+ pw.print(" mIncallPowerBehavior=");
+ pw.println(incallPowerBehaviorToString(mIncallPowerBehavior));
pw.print(prefix);
- pw.print("mIncallPowerBehavior=");
- pw.print(incallPowerBehaviorToString(mIncallPowerBehavior));
- pw.print(" mIncallBackBehavior=");
+ pw.print("mIncallBackBehavior=");
pw.print(incallBackBehaviorToString(mIncallBackBehavior));
pw.print(" mEndcallBehavior=");
pw.println(endcallBehaviorToString(mEndcallBehavior));
diff --git a/services/core/java/com/android/server/policy/TEST_MAPPING b/services/core/java/com/android/server/policy/TEST_MAPPING
index e212b0481ed6..437ef7392a3a 100644
--- a/services/core/java/com/android/server/policy/TEST_MAPPING
+++ b/services/core/java/com/android/server/policy/TEST_MAPPING
@@ -10,7 +10,7 @@
"include-annotation": "android.platform.test.annotations.Presubmit"
},
{
- "exclude-annotation": "android.support.test.filters.FlakyTest"
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
},
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 3da325c55b32..e1a911e8ada5 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -468,6 +468,9 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
/** @return true if this window desires key events. */
boolean canReceiveKeys();
+ /** @return true if the window can show over keyguard. */
+ boolean canShowWhenLocked();
+
/**
* Writes {@link com.android.server.wm.IdentifierProto} to stream.
*/
@@ -634,6 +637,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* Notifies window manager that user is switched.
*/
void onUserSwitched();
+
+ /**
+ * Hint to window manager that the user is interacting with a display that should be treated
+ * as the top display.
+ */
+ void moveDisplayToTop(int displayId);
}
/**
diff --git a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
new file mode 100644
index 000000000000..055c941f8b0a
--- /dev/null
+++ b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2018 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.policy.role;
+
+import android.annotation.NonNull;
+import android.app.role.RoleManager;
+import android.content.Context;
+import android.os.Debug;
+import android.provider.Settings;
+import android.util.Log;
+import android.util.Slog;
+
+import com.android.internal.telephony.SmsApplication;
+import com.android.internal.util.CollectionUtils;
+import com.android.server.role.RoleManagerService;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Logic to retrieve the various legacy(pre-Q) equivalents of role holders.
+ *
+ * Unlike {@link RoleManagerService} this is meant to be pretty high-level to allow for depending
+ * on all kinds of various systems that are historically involved in legacy role resolution,
+ * e.g. {@link SmsApplication}
+ *
+ * @see RoleManagerService#migrateRoleIfNecessary
+ */
+public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHoldersResolver {
+
+ private static final boolean DEBUG = false;
+ private static final String LOG_TAG = "LegacyRoleResolutionPol";
+
+ @NonNull
+ private final Context mContext;
+
+ public LegacyRoleResolutionPolicy(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public List<String> getRoleHolders(String roleName, int userId) {
+ switch (roleName) {
+ case RoleManager.ROLE_SMS: {
+ // Moved over from SmsApplication#getApplication
+ String result = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.SMS_DEFAULT_APPLICATION, userId);
+
+ // TODO: STOPSHIP: Remove the following code once we remove default_sms_application
+ // and use the new config_defaultRoleHolders.
+ if (result == null) {
+ Collection<SmsApplication.SmsApplicationData> applications =
+ SmsApplication.getApplicationCollectionAsUser(mContext, userId);
+ SmsApplication.SmsApplicationData applicationData;
+ String defaultPackage = mContext.getResources()
+ .getString(com.android.internal.R.string.default_sms_application);
+ applicationData =
+ SmsApplication.getApplicationForPackage(applications, defaultPackage);
+
+ if (applicationData == null) {
+ // Are there any applications?
+ if (applications.size() != 0) {
+ applicationData =
+ (SmsApplication.SmsApplicationData) applications.toArray()[0];
+ }
+ }
+ if (DEBUG) {
+ Log.i(LOG_TAG, "Found default sms app: " + applicationData
+ + " among: " + applications + " from " + Debug.getCallers(4));
+ }
+ SmsApplication.SmsApplicationData app = applicationData;
+ result = app == null ? null : app.mPackageName;
+ }
+
+ return CollectionUtils.singletonOrEmpty(result);
+ }
+ default: {
+ Slog.e(LOG_TAG, "Don't know how to find legacy role holders for " + roleName);
+ return Collections.emptyList();
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 5adc248cee79..c3f20aab568e 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -755,9 +755,10 @@ public class Notifier {
};
/**
- * Plays the wireless charging sound for both wireless and non-wireless charging
+ * If enabled, plays a sound and/or vibration when wireless or non-wireless charging has started
*/
- private void playChargingStartedSound(@UserIdInt int userId) {
+ private void playChargingStartedFeedback(@UserIdInt int userId) {
+ playChargingStartedVibration(userId);
final String soundPath = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.CHARGING_STARTED_SOUND);
if (isChargingFeedbackEnabled(userId) && soundPath != null) {
@@ -773,8 +774,7 @@ public class Notifier {
}
private void showWirelessChargingStarted(int batteryLevel, @UserIdInt int userId) {
- playWirelessChargingVibration(userId);
- playChargingStartedSound(userId);
+ playChargingStartedFeedback(userId);
if (mStatusBarManagerInternal != null) {
mStatusBarManagerInternal.showChargingAnimation(batteryLevel);
}
@@ -782,7 +782,7 @@ public class Notifier {
}
private void showWiredChargingStarted(@UserIdInt int userId) {
- playChargingStartedSound(userId);
+ playChargingStartedFeedback(userId);
mSuspendBlocker.release();
}
@@ -790,7 +790,7 @@ public class Notifier {
mTrustManager.setDeviceLockedForUser(userId, true /*locked*/);
}
- private void playWirelessChargingVibration(@UserIdInt int userId) {
+ private void playChargingStartedVibration(@UserIdInt int userId) {
final boolean vibrateEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.CHARGING_VIBRATION_ENABLED, 1, userId) != 0;
if (vibrateEnabled && isChargingFeedbackEnabled(userId)) {
diff --git a/services/core/java/com/android/server/power/OWNERS b/services/core/java/com/android/server/power/OWNERS
index 244ccb69e958..5cbe74c5986c 100644
--- a/services/core/java/com/android/server/power/OWNERS
+++ b/services/core/java/com/android/server/power/OWNERS
@@ -1,6 +1,4 @@
michaelwr@google.com
santoscordon@google.com
-per-file BatterySaverPolicy.java=omakoto@google.com
-per-file ShutdownThread.java=fkupolov@google.com
-per-file ThermalManagerService.java=wvw@google.com \ No newline at end of file
+per-file ThermalManagerService.java=wvw@google.com
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 565bb706a5d8..a02787308246 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -96,6 +96,7 @@ import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.power.batterysaver.BatterySaverController;
+import com.android.server.power.batterysaver.BatterySaverPolicy;
import com.android.server.power.batterysaver.BatterySaverStateMachine;
import com.android.server.power.batterysaver.BatterySavingStats;
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index 02689a90a98a..7d03d821d4c8 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -134,10 +134,14 @@ public class ThermalManagerService extends SystemService {
if (!halConnected) {
mHalWrapper = new ThermalHal20Wrapper();
halConnected = mHalWrapper.connectToHal();
- if (!halConnected) {
- mHalWrapper = new ThermalHal11Wrapper();
- halConnected = mHalWrapper.connectToHal();
- }
+ }
+ if (!halConnected) {
+ mHalWrapper = new ThermalHal11Wrapper();
+ halConnected = mHalWrapper.connectToHal();
+ }
+ if (!halConnected) {
+ mHalWrapper = new ThermalHal10Wrapper();
+ halConnected = mHalWrapper.connectToHal();
}
mHalWrapper.setCallback(this::onTemperatureChangedCallback);
if (!halConnected) {
@@ -616,6 +620,81 @@ public class ThermalManagerService extends SystemService {
}
}
+
+ static class ThermalHal10Wrapper extends ThermalHalWrapper {
+ /** Proxy object for the Thermal HAL 1.0 service. */
+ @GuardedBy("mHalLock")
+ private android.hardware.thermal.V1_0.IThermal mThermalHal10 = null;
+
+ @Override
+ protected List<Temperature> getCurrentTemperatures(boolean shouldFilter,
+ int type) {
+ synchronized (mHalLock) {
+ List<Temperature> ret = new ArrayList<>();
+ if (mThermalHal10 == null) {
+ return ret;
+ }
+ try {
+ mThermalHal10.getTemperatures(
+ (ThermalStatus status,
+ ArrayList<android.hardware.thermal.V1_0.Temperature>
+ temperatures) -> {
+ if (ThermalStatusCode.SUCCESS == status.code) {
+ for (android.hardware.thermal.V1_0.Temperature
+ temperature : temperatures) {
+ if (shouldFilter && type != temperature.type) {
+ continue;
+ }
+ // Thermal HAL 1.0 doesn't report current throttling status
+ ret.add(new Temperature(
+ temperature.currentValue, temperature.type,
+ temperature.name,
+ Temperature.THROTTLING_NONE));
+ }
+ } else {
+ Slog.e(TAG,
+ "Couldn't get temperatures because of HAL error: "
+ + status.debugMessage);
+ }
+
+ });
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Couldn't getCurrentTemperatures, reconnecting...", e);
+ connectToHal();
+ }
+ return ret;
+ }
+ }
+
+ @Override
+ protected boolean connectToHal() {
+ synchronized (mHalLock) {
+ try {
+ mThermalHal10 = android.hardware.thermal.V1_0.IThermal.getService();
+ mThermalHal10.linkToDeath(new DeathRecipient(),
+ THERMAL_HAL_DEATH_COOKIE);
+ Slog.i(TAG,
+ "Thermal HAL 1.0 service connected, no thermal call back will be "
+ + "called due to legacy API.");
+ } catch (NoSuchElementException | RemoteException e) {
+ Slog.e(TAG,
+ "Thermal HAL 1.0 service not connected.");
+ mThermalHal10 = null;
+ }
+ return (mThermalHal10 != null);
+ }
+ }
+
+ @Override
+ protected void dump(PrintWriter pw, String prefix) {
+ synchronized (mHalLock) {
+ pw.print(prefix);
+ pw.println("ThermalHAL 1.0 connected: " + (mThermalHal10 != null ? "yes"
+ : "no"));
+ }
+ }
+ }
+
static class ThermalHal11Wrapper extends ThermalHalWrapper {
/** Proxy object for the Thermal HAL 1.1 service. */
@GuardedBy("mHalLock")
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
index 6400c88b320f..1d74350de978 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
@@ -35,13 +35,13 @@ import android.util.ArrayMap;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
-import com.android.server.power.BatterySaverPolicy;
-import com.android.server.power.BatterySaverPolicy.BatterySaverPolicyListener;
import com.android.server.power.PowerManagerService;
+import com.android.server.power.batterysaver.BatterySaverPolicy.BatterySaverPolicyListener;
import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState;
import com.android.server.power.batterysaver.BatterySavingStats.DozeState;
import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState;
@@ -158,10 +158,9 @@ public class BatterySaverController implements BatterySaverPolicyListener {
mBatterySavingStats = batterySavingStats;
// Initialize plugins.
- final ArrayList<Plugin> plugins = new ArrayList<>();
- plugins.add(new BatterySaverLocationPlugin(mContext));
-
- mPlugins = plugins.toArray(new Plugin[plugins.size()]);
+ mPlugins = new Plugin[] {
+ new BatterySaverLocationPlugin(mContext)
+ };
}
/**
@@ -217,7 +216,7 @@ public class BatterySaverController implements BatterySaverPolicyListener {
super(looper);
}
- public void postStateChanged(boolean sendBroadcast, int reason) {
+ void postStateChanged(boolean sendBroadcast, int reason) {
obtainMessage(MSG_STATE_CHANGED, sendBroadcast ?
ARG_SEND_BROADCAST : ARG_DONT_SEND_BROADCAST, reason).sendToTarget();
}
@@ -244,9 +243,8 @@ public class BatterySaverController implements BatterySaverPolicyListener {
}
}
- /**
- * Called by {@link PowerManagerService} to update the battery saver state.
- */
+ /** Enable or disable full battery saver. */
+ @VisibleForTesting
public void enableBatterySaver(boolean enable, int reason) {
synchronized (mLock) {
if (mEnabled == enable) {
@@ -311,7 +309,7 @@ public class BatterySaverController implements BatterySaverPolicyListener {
reason);
mPreviouslyEnabled = mEnabled;
- listeners = mListeners.toArray(new LowPowerModeListener[mListeners.size()]);
+ listeners = mListeners.toArray(new LowPowerModeListener[0]);
enabled = mEnabled;
mIsInteractive = isInteractive;
diff --git a/services/core/java/com/android/server/power/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index cedb54801dc8..48a041eaab28 100644
--- a/services/core/java/com/android/server/power/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.power.batterysaver;
import android.content.ContentResolver;
import android.content.Context;
@@ -36,21 +36,19 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ConcurrentUtils;
-import com.android.server.power.batterysaver.BatterySavingStats;
-import com.android.server.power.batterysaver.CpuFrequencies;
+import com.android.server.power.PowerManagerService;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
- * Class to decide whether to turn on battery saver mode for specific service
+ * Class to decide whether to turn on battery saver mode for specific services.
*
* IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy.
* Do not call out with the lock held, such as AccessibilityManager. (Settings provider is okay.)
*
- * Test:
- atest ${ANDROID_BUILD_TOP}/frameworks/base/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
+ * Test: atest com.android.server.power.batterysaver.BatterySaverPolicyTest.java
*/
public class BatterySaverPolicy extends ContentObserver {
private static final String TAG = "BatterySaverPolicy";
@@ -200,8 +198,10 @@ public class BatterySaverPolicy extends ContentObserver {
onChange(true, null);
}
+ @VisibleForTesting
public void addListener(BatterySaverPolicyListener listener) {
synchronized (mLock) {
+ // TODO: set this in the constructor instead
mListeners.add(listener);
}
}
@@ -244,7 +244,7 @@ public class BatterySaverPolicy extends ContentObserver {
// Update.
updateConstantsLocked(setting, deviceSpecificSetting);
- listeners = mListeners.toArray(new BatterySaverPolicyListener[mListeners.size()]);
+ listeners = mListeners.toArray(new BatterySaverPolicyListener[0]);
}
// Notify the listeners.
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
index f262f6dabbe0..b7f28da499e9 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
@@ -15,8 +15,14 @@
*/
package com.android.server.power.batterysaver;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.PowerManager;
@@ -26,11 +32,11 @@ import android.provider.Settings.Global;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.server.EventLogTags;
-import com.android.server.power.BatterySaverPolicy;
import com.android.server.power.BatterySaverStateMachineProto;
import java.io.PrintWriter;
@@ -46,6 +52,8 @@ import java.io.PrintWriter;
*/
public class BatterySaverStateMachine {
private static final String TAG = "BatterySaverStateMachine";
+ private static final String DYNAMIC_MODE_NOTIF_CHANNEL_ID = "dynamic_mode_notification";
+ private static final int DYNAMIC_MODE_NOTIFICATION_ID = 1992;
private final Object mLock;
private static final boolean DEBUG = BatterySaverPolicy.DEBUG;
@@ -220,8 +228,8 @@ public class BatterySaverStateMachine {
}
/**
- * Run a {@link Runnable} on a background handler, but lazily. If the same {@link Runnable},
- * it'll be first removed before a new one is posted.
+ * Run a {@link Runnable} on a background handler, but lazily. If the same {@link Runnable} is
+ * already registered, it'll be first removed before being re-posted.
*/
@VisibleForTesting
void runOnBgThreadLazy(Runnable r, int delayMillis) {
@@ -484,6 +492,13 @@ public class BatterySaverStateMachine {
}
mBatterySaverController.enableBatterySaver(enable, intReason);
+ // Handle triggering the notification to show/hide when appropriate
+ if (intReason == BatterySaverController.REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_ON) {
+ runOnBgThread(this::triggerDynamicModeNotification);
+ } else if (!enable) {
+ runOnBgThread(this::hideDynamicModeNotification);
+ }
+
if (DEBUG) {
Slog.d(TAG, "Battery saver: Enabled=" + enable
+ " manual=" + manual
@@ -491,6 +506,44 @@ public class BatterySaverStateMachine {
}
}
+ private void triggerDynamicModeNotification() {
+ NotificationManager manager = mContext.getSystemService(NotificationManager.class);
+ ensureNotificationChannelExists(manager);
+
+ manager.notify(DYNAMIC_MODE_NOTIFICATION_ID, buildNotification());
+ }
+
+ private void ensureNotificationChannelExists(NotificationManager manager) {
+ NotificationChannel channel = new NotificationChannel(
+ DYNAMIC_MODE_NOTIF_CHANNEL_ID,
+ mContext.getText(
+ R.string.dynamic_mode_notification_channel_name),
+ NotificationManager.IMPORTANCE_DEFAULT);
+ channel.setSound(null, null);
+ manager.createNotificationChannel(channel);
+ }
+
+ private Notification buildNotification() {
+ Resources res = mContext.getResources();
+ Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent batterySaverIntent = PendingIntent.getActivity(
+ mContext, 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ return new Notification.Builder(mContext, DYNAMIC_MODE_NOTIF_CHANNEL_ID)
+ .setSmallIcon(R.drawable.ic_battery)
+ .setContentTitle(res.getString(R.string.dynamic_mode_notification_title))
+ .setContentText(res.getString(R.string.dynamic_mode_notification_summary))
+ .setContentIntent(batterySaverIntent)
+ .setOnlyAlertOnce(true)
+ .build();
+ }
+
+ private void hideDynamicModeNotification() {
+ NotificationManager manager = mContext.getSystemService(NotificationManager.class);
+ manager.cancel(DYNAMIC_MODE_NOTIFICATION_ID);
+ }
+
@GuardedBy("mLock")
private void updateSnoozingLocked(boolean snoozing, String reason) {
if (mBatterySaverSnoozing == snoozing) {
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
index 821320559017..79b44ebd8645 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
@@ -29,7 +29,6 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
-import com.android.server.power.BatterySaverPolicy;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index f37ca12bbd7f..5516b234925b 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -35,6 +35,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
+import android.os.Binder;
import android.os.Handler;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -92,6 +93,15 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
@NonNull
private final Object mLock = new Object();
+ @NonNull
+ private final RoleHoldersResolver mLegacyRoleResolver;
+
+ /** @see #getRoleHolders(String, int) */
+ public interface RoleHoldersResolver {
+ /** @return a list of packages that hold a given role for a given user */
+ List<String> getRoleHolders(String roleName, int userId);
+ }
+
/**
* Maps user id to its state.
*/
@@ -118,9 +128,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
@NonNull
private final Handler mListenerHandler = FgThread.getHandler();
- public RoleManagerService(@NonNull Context context) {
+ public RoleManagerService(@NonNull Context context,
+ @NonNull RoleHoldersResolver legacyRoleResolver) {
super(context);
+ mLegacyRoleResolver = legacyRoleResolver;
+
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
mAppOpsManager = context.getSystemService(AppOpsManager.class);
@@ -175,10 +188,17 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
private void performInitialGrantsIfNecessary(@UserIdInt int userId) {
RoleUserState userState;
userState = getOrCreateUserState(userId);
+
String packagesHash = computeComponentStateHash(userId);
String oldPackagesHash = userState.getPackagesHash();
boolean needGrant = !Objects.equals(packagesHash, oldPackagesHash);
if (needGrant) {
+
+ //TODO gradually add more role migrations statements here for remaining roles
+ // Make sure to implement LegacyRoleResolutionPolicy#getRoleHolders
+ // for a given role before adding a migration statement for it here
+ migrateRoleIfNecessary(RoleManager.ROLE_SMS, userId);
+
// Some vital packages state has changed since last role grant
// Run grants again
Slog.i(LOG_TAG, "Granting default permissions...");
@@ -205,6 +225,23 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
+ private void migrateRoleIfNecessary(String role, @UserIdInt int userId) {
+ // Any role for which we have a record are already migrated
+ RoleUserState userState = getOrCreateUserState(userId);
+ if (!userState.isRoleAvailable(role)) {
+ List<String> roleHolders = mLegacyRoleResolver.getRoleHolders(role, userId);
+ if (roleHolders.isEmpty()) {
+ return;
+ }
+ Slog.i(LOG_TAG, "Migrating " + role + ", legacy holders: " + roleHolders);
+ userState.addRoleName(role);
+ int size = roleHolders.size();
+ for (int i = 0; i < size; i++) {
+ userState.addRoleHolder(role, roleHolders.get(i));
+ }
+ }
+ }
+
@Nullable
private static String computeComponentStateHash(@UserIdInt int userId) {
PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
@@ -530,6 +567,17 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
@Override
+ public String getDefaultSmsPackage(int userId) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ return CollectionUtils.firstOrNull(
+ getRoleHoldersAsUser(RoleManager.ROLE_SMS, userId));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
@Nullable String[] args) {
if (!DumpUtils.checkDumpPermission(getContext(), LOG_TAG, fout)) {
diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java
index 630a39caeb08..02dcc4945664 100644
--- a/services/core/java/com/android/server/role/RoleUserState.java
+++ b/services/core/java/com/android/server/role/RoleUserState.java
@@ -193,14 +193,40 @@ public class RoleUserState {
*
* @param roleName the name of the role to query for
*
- * @return the set of role holders. {@code null} should not be returned and indicates an issue.
+ * @return the set of role holders, or {@code null} if and only if the role is not found
*/
@Nullable
public ArraySet<String> getRoleHolders(@NonNull String roleName) {
synchronized (mLock) {
throwIfDestroyedLocked();
- return new ArraySet<>(mRoles.get(roleName));
+ ArraySet<String> packageNames = mRoles.get(roleName);
+ if (packageNames == null) {
+ return null;
+ }
+ return new ArraySet<>(packageNames);
+ }
+ }
+
+ /**
+ * Adds the given role, effectively marking it as {@link #isRoleAvailable available}
+ *
+ * @param roleName the name of the role
+ *
+ * @return whether any changes were made
+ */
+ public boolean addRoleName(@NonNull String roleName) {
+ synchronized (mLock) {
+ throwIfDestroyedLocked();
+
+ if (!mRoles.containsKey(roleName)) {
+ mRoles.put(roleName, new ArraySet<>());
+ Slog.i(LOG_TAG, "Added new role: " + roleName);
+ scheduleWriteFileLocked();
+ return true;
+ } else {
+ return false;
+ }
}
}
@@ -231,13 +257,7 @@ public class RoleUserState {
int roleNamesSize = roleNames.size();
for (int i = 0; i < roleNamesSize; i++) {
- String roleName = roleNames.get(i);
-
- if (!mRoles.containsKey(roleName)) {
- mRoles.put(roleName, new ArraySet<>());
- Slog.i(LOG_TAG, "Added new role: " + roleName);
- changed = true;
- }
+ changed |= addRoleName(roleNames.get(i));
}
if (changed) {
@@ -252,8 +272,7 @@ public class RoleUserState {
* @param roleName the name of the role to add the holder to
* @param packageName the package name of the new holder
*
- * @return {@code false} only if the set of role holders is null, which should not happen and
- * indicates an issue.
+ * @return {@code false} if and only if the role is not found
*/
@CheckResult
public boolean addRoleHolder(@NonNull String roleName, @NonNull String packageName) {
@@ -286,8 +305,7 @@ public class RoleUserState {
* @param roleName the name of the role to remove the holder from
* @param packageName the package name of the holder to remove
*
- * @return {@code false} only if the set of role holders is null, which should not happen and
- * indicates an issue.
+ * @return {@code false} if and only if the role is not found
*/
@CheckResult
public boolean removeRoleHolder(@NonNull String roleName, @NonNull String packageName) {
diff --git a/services/core/java/com/android/server/rollback/PackageRollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java
index 15d12427f8be..f0589aac8239 100644
--- a/services/core/java/com/android/server/rollback/PackageRollbackData.java
+++ b/services/core/java/com/android/server/rollback/RollbackData.java
@@ -20,17 +20,21 @@ import android.content.rollback.PackageRollbackInfo;
import java.io.File;
import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
/**
- * Information about a rollback available for a particular package.
- * This is similar to {@link PackageRollbackInfo}, but extended with
- * additional information for internal bookkeeping.
+ * Information about a rollback available for a set of atomically installed
+ * packages.
*/
-class PackageRollbackData {
- public final PackageRollbackInfo info;
+class RollbackData {
+ /**
+ * The per-package rollback information.
+ */
+ public final List<PackageRollbackInfo> packages = new ArrayList<>();
/**
- * The directory where the apk backup is stored.
+ * The directory where the rollback data is stored.
*/
public final File backupDir;
@@ -38,12 +42,9 @@ class PackageRollbackData {
* The time when the upgrade occurred, for purposes of expiring
* rollback data.
*/
- public final Instant timestamp;
+ public Instant timestamp;
- PackageRollbackData(PackageRollbackInfo info,
- File backupDir, Instant timestamp) {
- this.info = info;
+ RollbackData(File backupDir) {
this.backupDir = backupDir;
- this.timestamp = timestamp;
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerService.java b/services/core/java/com/android/server/rollback/RollbackManagerService.java
index 8c3f04f3b8a8..4b5e76497f62 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerService.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerService.java
@@ -17,8 +17,6 @@
package com.android.server.rollback;
import android.content.Context;
-import android.os.SELinux;
-import android.util.Log;
import com.android.server.SystemService;
@@ -30,8 +28,6 @@ import com.android.server.SystemService;
*/
public final class RollbackManagerService extends SystemService {
- private static final String TAG = "RollbackManager";
-
private RollbackManagerServiceImpl mService;
public RollbackManagerService(Context context) {
@@ -41,12 +37,6 @@ public final class RollbackManagerService extends SystemService {
@Override
public void onStart() {
mService = new RollbackManagerServiceImpl(getContext());
-
- // TODO: Set up sepolicy to allow publishing the service.
- if (SELinux.isSELinuxEnforced()) {
- Log.w(TAG, "RollbackManager disabled pending selinux policy updates");
- } else {
- publishBinderService(Context.ROLLBACK_SERVICE, mService);
- }
+ publishBinderService(Context.ROLLBACK_SERVICE, mService);
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 0c2131203808..d12f7eda9a1b 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -63,9 +63,11 @@ import java.time.Instant;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -86,10 +88,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// mLock is held when they are called.
private final Object mLock = new Object();
+ // Package rollback data for rollback-enabled installs that have not yet
+ // been committed. Maps from sessionId to rollback data.
+ @GuardedBy("mLock")
+ private final Map<Integer, RollbackData> mPendingRollbacks = new HashMap<>();
+
+ // Map from child session id's for enabled rollbacks to their
+ // corresponding parent session ids.
+ @GuardedBy("mLock")
+ private final Map<Integer, Integer> mChildSessions = new HashMap<>();
+
// Package rollback data available to be used for rolling back a package.
// This list is null until the rollback data has been loaded.
@GuardedBy("mLock")
- private List<PackageRollbackData> mAvailableRollbacks;
+ private List<RollbackData> mAvailableRollbacks;
// The list of recently executed rollbacks.
// This list is null until the rollback data has been loaded.
@@ -102,14 +114,25 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// to store this data:
// /data/rollback/
// available/
- // com.package.A-XXX/
- // base.apk
- // rollback.json
- // com.package.B-YYY/
- // base.apk
- // rollback.json
+ // XXX/
+ // com.package.A/
+ // base.apk
+ // info.json
+ // enabled.txt
+ // YYY/
+ // com.package.B/
+ // base.apk
+ // info.json
+ // enabled.txt
// recently_executed.json
- // TODO: Use AtomicFile for rollback.json and recently_executed.json.
+ //
+ // * XXX, YYY are random strings from Files.createTempDirectory
+ // * info.json contains the package version to roll back from/to.
+ // * enabled.txt contains a timestamp for when the rollback was first
+ // made available. This file is not written until the rollback is made
+ // available.
+ //
+ // TODO: Use AtomicFile for all the .json files?
private final File mRollbackDataDir;
private final File mAvailableRollbacksDir;
private final File mRecentlyExecutedRollbacksFile;
@@ -135,6 +158,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// expiration.
getHandler().post(() -> ensureRollbackDataLoaded());
+ PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
+ installer.registerSessionCallback(new SessionCallback(), getHandler());
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
@@ -199,27 +225,23 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
android.Manifest.permission.MANAGE_ROLLBACKS,
"getAvailableRollback");
- PackageRollbackInfo.PackageVersion installedVersion =
- getInstalledPackageVersion(packageName);
- if (installedVersion == null) {
+ RollbackData data = getRollbackForPackage(packageName);
+ if (data == null) {
return null;
}
- synchronized (mLock) {
- // TODO: Have ensureRollbackDataLoadedLocked return the list of
- // available rollbacks, to hopefully avoid forgetting to call it?
- ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- PackageRollbackData data = mAvailableRollbacks.get(i);
- if (data.info.packageName.equals(packageName)
- && data.info.higherVersion.equals(installedVersion)) {
- // TODO: For atomic installs, check all dependent packages
- // for available rollbacks and include that info here.
- return new RollbackInfo(data.info);
- }
+ // Note: The rollback for the package ought to be for the currently
+ // installed version, otherwise the rollback data is out of date. In
+ // that rare case, we'll check when we execute the rollback whether
+ // it's out of date or not, so no need to check package versions here.
+
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.packageName.equals(packageName)) {
+ // TODO: Once the RollbackInfo API supports info about
+ // dependant packages, add that info here.
+ return new RollbackInfo(info);
}
}
-
return null;
}
@@ -229,16 +251,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
android.Manifest.permission.MANAGE_ROLLBACKS,
"getPackagesWithAvailableRollbacks");
- // TODO: This may return packages whose rollback is out of date or
- // expired. Presumably that's okay because the package rollback could
- // be expired anyway between when the caller calls this method and
- // when the caller calls getAvailableRollback for more details.
final Set<String> packageNames = new HashSet<>();
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- PackageRollbackData data = mAvailableRollbacks.get(i);
- packageNames.add(data.info.packageName);
+ RollbackData data = mAvailableRollbacks.get(i);
+ for (PackageRollbackInfo info : data.packages) {
+ packageNames.add(info.packageName);
+ }
}
}
return new StringParceledListSlice(new ArrayList<>(packageNames));
@@ -279,47 +299,49 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private void executeRollbackInternal(RollbackInfo rollback,
String callerPackageName, IntentSender statusReceiver) {
- String packageName = rollback.targetPackage.packageName;
- Log.i(TAG, "Initiating rollback of " + packageName);
+ String targetPackageName = rollback.targetPackage.packageName;
+ Log.i(TAG, "Initiating rollback of " + targetPackageName);
- PackageRollbackInfo.PackageVersion installedVersion =
- getInstalledPackageVersion(packageName);
- if (installedVersion == null) {
- // TODO: Test this case
- sendFailure(statusReceiver, "Target package to roll back is not installed");
+ // Get the latest RollbackData for the target package.
+ RollbackData data = getRollbackForPackage(targetPackageName);
+ if (data == null) {
+ sendFailure(statusReceiver, "No rollback available for package.");
return;
}
- if (!rollback.targetPackage.higherVersion.equals(installedVersion)) {
- // TODO: Test this case
- sendFailure(statusReceiver, "Target package version to roll back not installed.");
- return;
+ // Verify the latest rollback matches the version requested.
+ // TODO: Check dependant packages too once RollbackInfo includes that
+ // information.
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.packageName.equals(targetPackageName)
+ && !rollback.targetPackage.higherVersion.equals(info.higherVersion)) {
+ sendFailure(statusReceiver, "Rollback is out of date.");
+ return;
+ }
}
+ // Verify the RollbackData is up to date with what's installed on
+ // device.
// TODO: We assume that between now and the time we commit the
// downgrade install, the currently installed package version does not
// change. This is not safe to assume, particularly in the case of a
// rollback racing with a roll-forward fix of a buggy package.
// Figure out how to ensure we don't commit the rollback if
// roll forward happens at the same time.
- PackageRollbackData data = null;
- synchronized (mLock) {
- ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- PackageRollbackData available = mAvailableRollbacks.get(i);
- // TODO: Check if available.info.lowerVersion matches
- // rollback.targetPackage.lowerVersion?
- if (available.info.packageName.equals(packageName)
- && available.info.higherVersion.equals(installedVersion)) {
- data = available;
- break;
- }
+ for (PackageRollbackInfo info : data.packages) {
+ PackageRollbackInfo.PackageVersion installedVersion =
+ getInstalledPackageVersion(info.packageName);
+ if (installedVersion == null) {
+ // TODO: Test this case
+ sendFailure(statusReceiver, "Package to roll back is not installed");
+ return;
}
- }
- if (data == null) {
- sendFailure(statusReceiver, "Rollback not available");
- return;
+ if (!info.higherVersion.equals(installedVersion)) {
+ // TODO: Test this case
+ sendFailure(statusReceiver, "Package version to roll back not installed.");
+ return;
+ }
}
// Get a context for the caller to use to install the downgraded
@@ -334,29 +356,39 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageManager pm = context.getPackageManager();
try {
- PackageInstaller.Session session = null;
-
PackageInstaller packageInstaller = pm.getPackageInstaller();
- PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
+ PackageInstaller.SessionParams parentParams = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
- params.setAllowDowngrade(true);
- int sessionId = packageInstaller.createSession(params);
- session = packageInstaller.openSession(sessionId);
-
- // TODO: Will it always be called "base.apk"? What about splits?
- File baseApk = new File(data.backupDir, "base.apk");
- try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(baseApk,
- ParcelFileDescriptor.MODE_READ_ONLY)) {
- final long token = Binder.clearCallingIdentity();
- try {
- session.write("base.apk", 0, baseApk.length(), fd);
- } finally {
- Binder.restoreCallingIdentity(token);
+ parentParams.setAllowDowngrade(true);
+ parentParams.setMultiPackage();
+ int parentSessionId = packageInstaller.createSession(parentParams);
+ PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId);
+
+ for (PackageRollbackInfo info : data.packages) {
+ PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
+ PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+ params.setAllowDowngrade(true);
+ int sessionId = packageInstaller.createSession(params);
+ PackageInstaller.Session session = packageInstaller.openSession(sessionId);
+
+ // TODO: Will it always be called "base.apk"? What about splits?
+ // What about apex?
+ File packageDir = new File(data.backupDir, info.packageName);
+ File baseApk = new File(packageDir, "base.apk");
+ try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(baseApk,
+ ParcelFileDescriptor.MODE_READ_ONLY)) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ session.write("base.apk", 0, baseApk.length(), fd);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
+ parentSession.addChildSessionId(sessionId);
}
final LocalIntentReceiver receiver = new LocalIntentReceiver();
- session.commit(receiver.getIntentSender());
+ parentSession.commit(receiver.getIntentSender());
Intent result = receiver.getResult();
int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
@@ -371,13 +403,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
sendSuccess(statusReceiver);
Intent broadcast = new Intent(Intent.ACTION_PACKAGE_ROLLBACK_EXECUTED,
- Uri.fromParts("package", packageName, Manifest.permission.MANAGE_ROLLBACKS));
+ Uri.fromParts("package", targetPackageName,
+ Manifest.permission.MANAGE_ROLLBACKS));
// TODO: This call emits the warning "Calling a method in the
// system process without a qualified user". Fix that.
mContext.sendBroadcast(broadcast);
} catch (IOException e) {
- Log.e(TAG, "Unable to roll back " + packageName, e);
+ Log.e(TAG, "Unable to roll back " + targetPackageName, e);
sendFailure(statusReceiver, "IOException: " + e.toString());
return;
}
@@ -408,12 +441,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// testing anyway.
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<PackageRollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
- PackageRollbackData data = iter.next();
- if (data.info.packageName.equals(packageName)) {
- iter.remove();
- removeFile(data.backupDir);
+ RollbackData data = iter.next();
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.packageName.equals(packageName)) {
+ iter.remove();
+ removeFile(data.backupDir);
+ break;
+ }
}
}
}
@@ -453,27 +489,41 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
mAvailableRollbacksDir.mkdirs();
mAvailableRollbacks = new ArrayList<>();
for (File rollbackDir : mAvailableRollbacksDir.listFiles()) {
- if (rollbackDir.isDirectory()) {
- // TODO: How to detect and clean up an invalid rollback
- // directory? We don't know if it's invalid because something
- // went wrong, or if it's only temporarily invalid because
- // it's in the process of being created.
+ File enabledFile = new File(rollbackDir, "enabled.txt");
+ // TODO: Delete any directories without an enabled.txt? That could
+ // potentially delete pending rollback data if reloadPersistedData
+ // is called, though there's no reason besides testing for that to
+ // be called.
+ if (rollbackDir.isDirectory() && enabledFile.isFile()) {
+ RollbackData data = new RollbackData(rollbackDir);
try {
- File jsonFile = new File(rollbackDir, "rollback.json");
- String jsonString = IoUtils.readFileAsString(jsonFile.getAbsolutePath());
- JSONObject jsonObject = new JSONObject(jsonString);
- String packageName = jsonObject.getString("packageName");
- long higherVersionCode = jsonObject.getLong("higherVersionCode");
- long lowerVersionCode = jsonObject.getLong("lowerVersionCode");
- Instant timestamp = Instant.parse(jsonObject.getString("timestamp"));
- PackageRollbackData data = new PackageRollbackData(
- new PackageRollbackInfo(packageName,
- new PackageRollbackInfo.PackageVersion(higherVersionCode),
- new PackageRollbackInfo.PackageVersion(lowerVersionCode)),
- rollbackDir, timestamp);
+ PackageRollbackInfo info = null;
+ for (File packageDir : rollbackDir.listFiles()) {
+ if (packageDir.isDirectory()) {
+ File jsonFile = new File(packageDir, "info.json");
+ String jsonString = IoUtils.readFileAsString(
+ jsonFile.getAbsolutePath());
+ JSONObject jsonObject = new JSONObject(jsonString);
+ String packageName = jsonObject.getString("packageName");
+ long higherVersionCode = jsonObject.getLong("higherVersionCode");
+ long lowerVersionCode = jsonObject.getLong("lowerVersionCode");
+
+ data.packages.add(new PackageRollbackInfo(packageName,
+ new PackageRollbackInfo.PackageVersion(higherVersionCode),
+ new PackageRollbackInfo.PackageVersion(lowerVersionCode)));
+ }
+ }
+
+ if (data.packages.isEmpty()) {
+ throw new IOException("No package rollback info found");
+ }
+
+ String enabledString = IoUtils.readFileAsString(enabledFile.getAbsolutePath());
+ data.timestamp = Instant.parse(enabledString.trim());
mAvailableRollbacks.add(data);
} catch (IOException | JSONException | DateTimeParseException e) {
Log.e(TAG, "Unable to read rollback data at " + rollbackDir, e);
+ removeFile(rollbackDir);
}
}
}
@@ -521,13 +571,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<PackageRollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
- PackageRollbackData data = iter.next();
- if (data.info.packageName.equals(packageName)
- && !data.info.higherVersion.equals(installedVersion)) {
- iter.remove();
- removeFile(data.backupDir);
+ RollbackData data = iter.next();
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.packageName.equals(packageName)
+ && !info.higherVersion.equals(installedVersion)) {
+ iter.remove();
+ removeFile(data.backupDir);
+ break;
+ }
}
}
}
@@ -643,9 +696,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<PackageRollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
- PackageRollbackData data = iter.next();
+ RollbackData data = iter.next();
if (!now.isBefore(data.timestamp.plusMillis(ROLLBACK_LIFETIME_DURATION_MILLIS))) {
iter.remove();
removeFile(data.backupDir);
@@ -673,6 +726,23 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return mHandlerThread.getThreadHandler();
}
+ // Returns true if <code>session</code> has installFlags and code path
+ // matching the installFlags and new package code path given to
+ // enableRollback.
+ private boolean sessionMatchesForEnableRollback(PackageInstaller.SessionInfo session,
+ int installFlags, File newPackageCodePath) {
+ if (session == null || session.resolvedBaseCodePath == null) {
+ return false;
+ }
+
+ File packageCodePath = new File(session.resolvedBaseCodePath).getParentFile();
+ if (newPackageCodePath.equals(packageCodePath) && installFlags == session.installFlags) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Called via broadcast by the package manager when a package is being
* staged for install with rollback enabled. Called before the package has
@@ -705,6 +775,34 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
String packageName = newPackage.packageName;
Log.i(TAG, "Enabling rollback for install of " + packageName);
+ // Figure out the session id associated with this install.
+ int parentSessionId = PackageInstaller.SessionInfo.INVALID_ID;
+ int childSessionId = PackageInstaller.SessionInfo.INVALID_ID;
+ PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
+ for (PackageInstaller.SessionInfo info : installer.getAllSessions()) {
+ if (info.isMultiPackage()) {
+ for (int childId : info.getChildSessionIds()) {
+ PackageInstaller.SessionInfo child = installer.getSessionInfo(childId);
+ if (sessionMatchesForEnableRollback(child, installFlags, newPackageCodePath)) {
+ // TODO: Check we only have one matching session?
+ parentSessionId = info.getSessionId();
+ childSessionId = childId;
+ }
+ }
+ } else {
+ if (sessionMatchesForEnableRollback(info, installFlags, newPackageCodePath)) {
+ // TODO: Check we only have one matching session?
+ parentSessionId = info.getSessionId();
+ childSessionId = parentSessionId;
+ }
+ }
+ }
+
+ if (parentSessionId == PackageInstaller.SessionInfo.INVALID_ID) {
+ Log.e(TAG, "Unable to find session id for enabled rollback.");
+ return false;
+ }
+
PackageRollbackInfo.PackageVersion newVersion =
new PackageRollbackInfo.PackageVersion(newPackage.versionCode);
@@ -720,52 +818,53 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageRollbackInfo.PackageVersion installedVersion =
new PackageRollbackInfo.PackageVersion(installedPackage.getLongVersionCode());
- File backupDir;
+ PackageRollbackInfo info = new PackageRollbackInfo(
+ packageName, newVersion, installedVersion);
+
+ RollbackData data;
try {
- backupDir = Files.createTempDirectory(
- mAvailableRollbacksDir.toPath(), packageName + "-").toFile();
+ synchronized (mLock) {
+ mChildSessions.put(childSessionId, parentSessionId);
+ data = mPendingRollbacks.get(parentSessionId);
+ if (data == null) {
+ File backupDir = Files.createTempDirectory(
+ mAvailableRollbacksDir.toPath(), null).toFile();
+ data = new RollbackData(backupDir);
+ mPendingRollbacks.put(parentSessionId, data);
+ }
+ data.packages.add(info);
+ }
} catch (IOException e) {
Log.e(TAG, "Unable to create rollback for " + packageName, e);
return false;
}
- // TODO: Should the timestamp be for when we commit the install, not
- // when we create the pending one?
- Instant timestamp = Instant.now();
+ File packageDir = new File(data.backupDir, packageName);
+ packageDir.mkdirs();
try {
JSONObject json = new JSONObject();
json.put("packageName", packageName);
json.put("higherVersionCode", newVersion.versionCode);
json.put("lowerVersionCode", installedVersion.versionCode);
- json.put("timestamp", timestamp.toString());
- File jsonFile = new File(backupDir, "rollback.json");
+ File jsonFile = new File(packageDir, "info.json");
PrintWriter pw = new PrintWriter(jsonFile);
pw.println(json.toString());
pw.close();
} catch (IOException | JSONException e) {
Log.e(TAG, "Unable to create rollback for " + packageName, e);
- removeFile(backupDir);
+ removeFile(packageDir);
return false;
}
// TODO: Copy by hard link instead to save on cpu and storage space?
- int status = PackageManagerServiceUtils.copyPackage(installedPackage.codePath, backupDir);
+ int status = PackageManagerServiceUtils.copyPackage(installedPackage.codePath, packageDir);
if (status != PackageManager.INSTALL_SUCCEEDED) {
Log.e(TAG, "Unable to copy package for rollback for " + packageName);
- removeFile(backupDir);
+ removeFile(packageDir);
return false;
}
- PackageRollbackData data = new PackageRollbackData(
- new PackageRollbackInfo(packageName, newVersion, installedVersion),
- backupDir, timestamp);
-
- synchronized (mLock) {
- ensureRollbackDataLoadedLocked();
- mAvailableRollbacks.add(data);
- }
-
return true;
}
@@ -829,4 +928,89 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return new PackageRollbackInfo.PackageVersion(pkgInfo.getLongVersionCode());
}
+
+ private class SessionCallback extends PackageInstaller.SessionCallback {
+
+ @Override
+ public void onCreated(int sessionId) { }
+
+ @Override
+ public void onBadgingChanged(int sessionId) { }
+
+ @Override
+ public void onActiveChanged(int sessionId, boolean active) { }
+
+ @Override
+ public void onProgressChanged(int sessionId, float progress) { }
+
+ @Override
+ public void onFinished(int sessionId, boolean success) {
+ RollbackData data = null;
+ synchronized (mLock) {
+ Integer parentSessionId = mChildSessions.remove(sessionId);
+ if (parentSessionId != null) {
+ sessionId = parentSessionId;
+ }
+ data = mPendingRollbacks.remove(sessionId);
+ }
+
+ if (data != null) {
+ if (success) {
+ try {
+ data.timestamp = Instant.now();
+ File enabledFile = new File(data.backupDir, "enabled.txt");
+ PrintWriter pw = new PrintWriter(enabledFile);
+ pw.println(data.timestamp.toString());
+ pw.close();
+
+ synchronized (mLock) {
+ // Note: There is a small window of time between when
+ // the session has been committed by the package
+ // manager and when we make the rollback available
+ // here. Presumably the window is small enough that
+ // nobody will want to roll back the newly installed
+ // package before we make the rollback available.
+ // TODO: We'll lose the rollback data if the
+ // device reboots between when the session is
+ // committed and this point. Revisit this after
+ // adding support for rollback of staged installs.
+ ensureRollbackDataLoadedLocked();
+ mAvailableRollbacks.add(data);
+ }
+
+ scheduleExpiration(ROLLBACK_LIFETIME_DURATION_MILLIS);
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to enable rollback", e);
+ removeFile(data.backupDir);
+ }
+ } else {
+ // The install session was aborted, clean up the pending
+ // install.
+ removeFile(data.backupDir);
+ }
+ }
+ }
+ }
+
+ /*
+ * Returns the RollbackData, if any, for an available rollback that would
+ * roll back the given package. Note: This assumes we have at most one
+ * available rollback for a given package at any one time.
+ */
+ private RollbackData getRollbackForPackage(String packageName) {
+ synchronized (mLock) {
+ // TODO: Have ensureRollbackDataLoadedLocked return the list of
+ // available rollbacks, to hopefully avoid forgetting to call it?
+ ensureRollbackDataLoadedLocked();
+ for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
+ RollbackData data = mAvailableRollbacks.get(i);
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.packageName.equals(packageName)) {
+ return data;
+ }
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/services/core/java/com/android/server/rollback/TEST_MAPPING b/services/core/java/com/android/server/rollback/TEST_MAPPING
new file mode 100644
index 000000000000..c1d95ac85c23
--- /dev/null
+++ b/services/core/java/com/android/server/rollback/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "RollbackTest"
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/security/VerityUtils.java b/services/core/java/com/android/server/security/VerityUtils.java
index 839ed302ba73..b1db46fb3276 100644
--- a/services/core/java/com/android/server/security/VerityUtils.java
+++ b/services/core/java/com/android/server/security/VerityUtils.java
@@ -36,6 +36,7 @@ import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -59,6 +60,8 @@ abstract public class VerityUtils {
/** The maximum size of signature file. This is just to avoid potential abuse. */
private static final int MAX_SIGNATURE_FILE_SIZE_BYTES = 8192;
+ private static final int COMMON_LINUX_PAGE_SIZE_IN_BYTES = 4096;
+
private static final boolean DEBUG = false;
/** Returns true if the given file looks like containing an fs-verity signature. */
@@ -71,6 +74,48 @@ abstract public class VerityUtils {
return filePath + FSVERITY_SIGNATURE_FILE_EXTENSION;
}
+ /** Generates Merkle tree and fs-verity metadata then enables fs-verity. */
+ public static void setUpFsverity(@NonNull String filePath, String signaturePath)
+ throws IOException, DigestException, NoSuchAlgorithmException {
+ final PKCS7 pkcs7 = new PKCS7(Files.readAllBytes(Paths.get(signaturePath)));
+ final byte[] expectedMeasurement = pkcs7.getContentInfo().getContentBytes();
+ if (DEBUG) {
+ Slog.d(TAG, "Enabling fs-verity with signed fs-verity measurement "
+ + bytesToString(expectedMeasurement));
+ Slog.d(TAG, "PKCS#7 info: " + pkcs7);
+ }
+
+ final TrackedBufferFactory bufferFactory = new TrackedBufferFactory();
+ final byte[] actualMeasurement = generateFsverityMetadata(filePath, signaturePath,
+ bufferFactory);
+ try (RandomAccessFile raf = new RandomAccessFile(filePath, "rw")) {
+ FileChannel ch = raf.getChannel();
+ ch.position(roundUpToNextMultiple(ch.size(), COMMON_LINUX_PAGE_SIZE_IN_BYTES));
+ ByteBuffer buffer = bufferFactory.getBuffer();
+
+ long offset = buffer.position();
+ long size = buffer.limit();
+ while (offset < size) {
+ long s = ch.write(buffer);
+ offset += s;
+ size -= s;
+ }
+ }
+
+ if (!Arrays.equals(expectedMeasurement, actualMeasurement)) {
+ throw new SecurityException("fs-verity measurement mismatch: "
+ + bytesToString(actualMeasurement) + " != "
+ + bytesToString(expectedMeasurement));
+ }
+
+ // This can fail if the public key is not already in .fs-verity kernel keyring.
+ int errno = enableFsverityNative(filePath);
+ if (errno != 0) {
+ throw new IOException("Failed to enable fs-verity on " + filePath + ": "
+ + Os.strerror(errno));
+ }
+ }
+
/** Returns whether the file has fs-verity enabled. */
public static boolean hasFsverity(@NonNull String filePath) {
// NB: only measure but not check the actual measurement here. As long as this succeeds,
@@ -87,36 +132,18 @@ abstract public class VerityUtils {
}
/**
- * Generates Merkle tree and fs-verity metadata.
+ * Generates legacy Merkle tree and fs-verity metadata with Signing Block skipped.
*
* @return {@code SetupResult} that contains the result code, and when success, the
* {@code FileDescriptor} to read all the data from.
*/
- public static SetupResult generateApkVeritySetupData(@NonNull String apkPath,
- String signaturePath, boolean skipSigningBlock) {
+ public static SetupResult generateApkVeritySetupData(@NonNull String apkPath) {
if (DEBUG) {
- Slog.d(TAG, "Trying to install apk verity to " + apkPath + " with signature file "
- + signaturePath);
+ Slog.d(TAG, "Trying to install legacy apk verity to " + apkPath);
}
SharedMemory shm = null;
try {
- byte[] signedVerityHash;
- if (skipSigningBlock) {
- signedVerityHash = ApkSignatureVerifier.getVerityRootHash(apkPath);
- } else {
- Path path = Paths.get(signaturePath);
- if (Files.exists(path)) {
- // TODO(112037636): fail early if the signing key is not in .fs-verity keyring.
- PKCS7 pkcs7 = new PKCS7(Files.readAllBytes(path));
- signedVerityHash = pkcs7.getContentInfo().getContentBytes();
- if (DEBUG) {
- Slog.d(TAG, "fs-verity measurement = " + bytesToString(signedVerityHash));
- }
- } else {
- signedVerityHash = null;
- }
- }
-
+ final byte[] signedVerityHash = ApkSignatureVerifier.getVerityRootHash(apkPath);
if (signedVerityHash == null) {
if (DEBUG) {
Slog.d(TAG, "Skip verity tree generation since there is no signed root hash");
@@ -124,8 +151,8 @@ abstract public class VerityUtils {
return SetupResult.skipped();
}
- Pair<SharedMemory, Integer> result = generateFsVerityIntoSharedMemory(apkPath,
- signaturePath, signedVerityHash, skipSigningBlock);
+ Pair<SharedMemory, Integer> result =
+ generateFsVerityIntoSharedMemory(apkPath, signedVerityHash);
shm = result.first;
int contentSize = result.second;
FileDescriptor rfd = shm.getFileDescriptor();
@@ -156,7 +183,7 @@ abstract public class VerityUtils {
* {@see ApkSignatureVerifier#getVerityRootHash(String)}.
*/
public static byte[] getVerityRootHash(@NonNull String apkPath)
- throws IOException, SignatureNotFoundException, SecurityException {
+ throws IOException, SignatureNotFoundException {
return ApkSignatureVerifier.getVerityRootHash(apkPath);
}
@@ -172,9 +199,8 @@ abstract public class VerityUtils {
* includes SHA-256 of fs-verity descriptor and authenticated extensions.
*/
private static byte[] generateFsverityMetadata(String filePath, String signaturePath,
- @NonNull TrackedShmBufferFactory trackedBufferFactory)
- throws IOException, SignatureNotFoundException, SecurityException, DigestException,
- NoSuchAlgorithmException {
+ @NonNull ByteBufferFactory trackedBufferFactory)
+ throws IOException, DigestException, NoSuchAlgorithmException {
try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {
VerityBuilder.VerityResult result = VerityBuilder.generateFsVerityTree(
file, trackedBufferFactory);
@@ -184,6 +210,7 @@ abstract public class VerityUtils {
final byte[] measurement = generateFsverityDescriptorAndMeasurement(file,
result.rootHash, signaturePath, buffer);
+ buffer.flip();
return constructFsveritySignedDataNative(measurement);
}
}
@@ -243,6 +270,7 @@ abstract public class VerityUtils {
return md.digest();
}
+ private static native int enableFsverityNative(@NonNull String filePath);
private static native int measureFsverityNative(@NonNull String filePath);
private static native byte[] constructFsveritySignedDataNative(@NonNull byte[] measurement);
private static native byte[] constructFsverityDescriptorNative(long fileSize);
@@ -256,18 +284,13 @@ abstract public class VerityUtils {
* for fsverity setup. The data is aligned to the beginning of {@code SharedMemory}, and has
* length equals to the returned {@code Integer}.
*/
- private static Pair<SharedMemory, Integer> generateFsVerityIntoSharedMemory(
- String apkPath, String signaturePath, @NonNull byte[] expectedRootHash,
- boolean skipSigningBlock)
- throws IOException, SecurityException, DigestException, NoSuchAlgorithmException,
+ private static Pair<SharedMemory, Integer> generateFsVerityIntoSharedMemory(String apkPath,
+ @NonNull byte[] expectedRootHash)
+ throws IOException, DigestException, NoSuchAlgorithmException,
SignatureNotFoundException {
TrackedShmBufferFactory shmBufferFactory = new TrackedShmBufferFactory();
- byte[] generatedRootHash;
- if (skipSigningBlock) {
- generatedRootHash = ApkSignatureVerifier.generateApkVerity(apkPath, shmBufferFactory);
- } else {
- generatedRootHash = generateFsverityMetadata(apkPath, signaturePath, shmBufferFactory);
- }
+ byte[] generatedRootHash =
+ ApkSignatureVerifier.generateApkVerity(apkPath, shmBufferFactory);
// We only generate Merkle tree once here, so it's important to make sure the root hash
// matches the signed one in the apk.
if (!Arrays.equals(expectedRootHash, generatedRootHash)) {
@@ -345,7 +368,7 @@ abstract public class VerityUtils {
private ByteBuffer mBuffer;
@Override
- public ByteBuffer create(int capacity) throws SecurityException {
+ public ByteBuffer create(int capacity) {
try {
if (DEBUG) Slog.d(TAG, "Creating shared memory for apk verity");
// NB: This method is supposed to be called once according to the contract with
@@ -378,4 +401,30 @@ abstract public class VerityUtils {
return mBuffer == null ? -1 : mBuffer.limit();
}
}
+
+ /** A {@code ByteBufferFactory} that tracks the {@code ByteBuffer} it creates. */
+ private static class TrackedBufferFactory implements ByteBufferFactory {
+ private ByteBuffer mBuffer;
+
+ @Override
+ public ByteBuffer create(int capacity) {
+ if (mBuffer != null) {
+ throw new IllegalStateException("Multiple instantiation from this factory");
+ }
+ mBuffer = ByteBuffer.allocate(capacity);
+ return mBuffer;
+ }
+
+ public ByteBuffer getBuffer() {
+ return mBuffer;
+ }
+ }
+
+ /** Round up the number to the next multiple of the divisor. */
+ private static long roundUpToNextMultiple(long number, long divisor) {
+ if (number > (Long.MAX_VALUE - divisor)) {
+ throw new IllegalArgumentException("arithmetic overflow");
+ }
+ return ((number + (divisor - 1)) / divisor) * divisor;
+ }
}
diff --git a/services/core/java/com/android/server/signedconfig/GlobalSettingsConfigApplicator.java b/services/core/java/com/android/server/signedconfig/GlobalSettingsConfigApplicator.java
index 438c303de6cc..d77cf900a0a9 100644
--- a/services/core/java/com/android/server/signedconfig/GlobalSettingsConfigApplicator.java
+++ b/services/core/java/com/android/server/signedconfig/GlobalSettingsConfigApplicator.java
@@ -23,6 +23,7 @@ import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import android.util.StatsLog;
import java.security.GeneralSecurityException;
import java.util.Arrays;
@@ -66,12 +67,14 @@ class GlobalSettingsConfigApplicator {
private final Context mContext;
private final String mSourcePackage;
+ private final SignedConfigEvent mEvent;
private final SignatureVerifier mVerifier;
- GlobalSettingsConfigApplicator(Context context, String sourcePackage) {
+ GlobalSettingsConfigApplicator(Context context, String sourcePackage, SignedConfigEvent event) {
mContext = context;
mSourcePackage = sourcePackage;
- mVerifier = new SignatureVerifier();
+ mEvent = event;
+ mVerifier = new SignatureVerifier(mEvent);
}
private boolean checkSignature(String data, String signature) {
@@ -79,6 +82,7 @@ class GlobalSettingsConfigApplicator {
return mVerifier.verifySignature(data, signature);
} catch (GeneralSecurityException e) {
Slog.e(TAG, "Failed to verify signature", e);
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__SECURITY_EXCEPTION;
return false;
}
}
@@ -109,14 +113,17 @@ class GlobalSettingsConfigApplicator {
SignedConfig config;
try {
config = SignedConfig.parse(configStr, ALLOWED_KEYS, KEY_VALUE_MAPPERS);
+ mEvent.version = config.version;
} catch (InvalidConfigException e) {
Slog.e(TAG, "Failed to parse global settings from package " + mSourcePackage, e);
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__INVALID_CONFIG;
return;
}
int currentVersion = getCurrentConfigVersion();
if (currentVersion >= config.version) {
Slog.i(TAG, "Global settings from package " + mSourcePackage
+ " is older than existing: " + config.version + "<=" + currentVersion);
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__OLD_CONFIG;
return;
}
// We have new config!
@@ -126,10 +133,12 @@ class GlobalSettingsConfigApplicator {
config.getMatchingConfig(Build.VERSION.SDK_INT);
if (matchedConfig == null) {
Slog.i(TAG, "Settings is not applicable to current SDK version; ignoring");
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__NOT_APPLICABLE;
return;
}
Slog.i(TAG, "Updating global settings to version " + config.version);
updateCurrentConfig(config.version, matchedConfig.values);
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__APPLIED;
}
}
diff --git a/services/core/java/com/android/server/signedconfig/SignatureVerifier.java b/services/core/java/com/android/server/signedconfig/SignatureVerifier.java
index 944db84acc71..56db32a3071d 100644
--- a/services/core/java/com/android/server/signedconfig/SignatureVerifier.java
+++ b/services/core/java/com/android/server/signedconfig/SignatureVerifier.java
@@ -18,6 +18,7 @@ package com.android.server.signedconfig;
import android.os.Build;
import android.util.Slog;
+import android.util.StatsLog;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
@@ -42,11 +43,18 @@ public class SignatureVerifier {
private static final String DEBUG_KEY =
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaAn2XVifsLTHg616nTsOMVmlhBoECGbTEBTKKvdd2hO60"
+ "pj1pnU8SMkhYfaNxZuKgw9LNvOwlFwStboIYeZ3lQ==";
+ private static final String PROD_KEY =
+ "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+lky6wKyGL6lE1VrD0YTMHwb0Xwc+tzC8MvnrzVxodvTp"
+ + "VY/jV7V+Zktcx+pry43XPABFRXtbhTo+qykhyBA1g==";
+ private final SignedConfigEvent mEvent;
private final PublicKey mDebugKey;
+ private final PublicKey mProdKey;
- public SignatureVerifier() {
- mDebugKey = createKey(DEBUG_KEY);
+ public SignatureVerifier(SignedConfigEvent event) {
+ mEvent = event;
+ mDebugKey = Build.IS_DEBUGGABLE ? createKey(DEBUG_KEY) : null;
+ mProdKey = createKey(PROD_KEY);
}
private static PublicKey createKey(String base64) {
@@ -67,6 +75,14 @@ public class SignatureVerifier {
}
}
+ private boolean verifyWithPublicKey(PublicKey key, byte[] data, byte[] signature)
+ throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+ Signature verifier = Signature.getInstance("SHA256withECDSA");
+ verifier.initVerify(key);
+ verifier.update(data);
+ return verifier.verify(signature);
+ }
+
/**
* Verify a signature for signed config.
*
@@ -80,6 +96,7 @@ public class SignatureVerifier {
try {
signature = Base64.getDecoder().decode(base64Signature);
} catch (IllegalArgumentException e) {
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__BASE64_FAILURE_SIGNATURE;
Slog.e(TAG, "Failed to base64 decode signature");
return false;
}
@@ -89,11 +106,9 @@ public class SignatureVerifier {
if (Build.IS_DEBUGGABLE) {
if (mDebugKey != null) {
if (DBG) Slog.w(TAG, "Trying to verify signature using debug key");
- Signature verifier = Signature.getInstance("SHA256withECDSA");
- verifier.initVerify(mDebugKey);
- verifier.update(data);
- if (verifier.verify(signature)) {
+ if (verifyWithPublicKey(mDebugKey, data, signature)) {
Slog.i(TAG, "Verified config using debug key");
+ mEvent.verifiedWith = StatsLog.SIGNED_CONFIG_REPORTED__VERIFIED_WITH__DEBUG;
return true;
} else {
if (DBG) Slog.i(TAG, "Config verification failed using debug key");
@@ -102,8 +117,20 @@ public class SignatureVerifier {
Slog.w(TAG, "Debuggable build, but have no debug key");
}
}
- // TODO verify production key.
- Slog.w(TAG, "NO PRODUCTION KEY YET, FAILING VERIFICATION");
- return false;
+ if (mProdKey == null) {
+ Slog.e(TAG, "No prod key; construction failed?");
+ mEvent.status =
+ StatsLog.SIGNED_CONFIG_REPORTED__STATUS__SIGNATURE_CHECK_FAILED_PROD_KEY_ABSENT;
+ return false;
+ }
+ if (verifyWithPublicKey(mProdKey, data, signature)) {
+ Slog.i(TAG, "Verified config using production key");
+ mEvent.verifiedWith = StatsLog.SIGNED_CONFIG_REPORTED__VERIFIED_WITH__PRODUCTION;
+ return true;
+ } else {
+ if (DBG) Slog.i(TAG, "Verification failed using production key");
+ mEvent.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__SIGNATURE_CHECK_FAILED;
+ return false;
+ }
}
}
diff --git a/services/core/java/com/android/server/signedconfig/SignedConfigEvent.java b/services/core/java/com/android/server/signedconfig/SignedConfigEvent.java
new file mode 100644
index 000000000000..2f2062c6f2ee
--- /dev/null
+++ b/services/core/java/com/android/server/signedconfig/SignedConfigEvent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 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.signedconfig;
+
+import android.util.StatsLog;
+
+/**
+ * Helper class to allow a SignedConfigReported event to be built up in stages.
+ */
+public class SignedConfigEvent {
+
+ public int type = StatsLog.SIGNED_CONFIG_REPORTED__TYPE__UNKNOWN_TYPE;
+ public int status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__UNKNOWN_STATUS;
+ public int version = 0;
+ public String fromPackage = null;
+ public int verifiedWith = StatsLog.SIGNED_CONFIG_REPORTED__VERIFIED_WITH__NO_KEY;
+
+ /**
+ * Write this event to statslog.
+ */
+ public void send() {
+ StatsLog.write(StatsLog.SIGNED_CONFIG_REPORTED,
+ type, status, version, fromPackage, verifiedWith);
+ }
+
+}
diff --git a/services/core/java/com/android/server/signedconfig/SignedConfigService.java b/services/core/java/com/android/server/signedconfig/SignedConfigService.java
index 6bcee1413fa8..dc39542dc29f 100644
--- a/services/core/java/com/android/server/signedconfig/SignedConfigService.java
+++ b/services/core/java/com/android/server/signedconfig/SignedConfigService.java
@@ -26,6 +26,7 @@ import android.content.pm.PackageManagerInternal;
import android.net.Uri;
import android.os.Bundle;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.server.LocalServices;
@@ -82,21 +83,30 @@ public class SignedConfigService {
}
if (metaData.containsKey(KEY_GLOBAL_SETTINGS)
&& metaData.containsKey(KEY_GLOBAL_SETTINGS_SIGNATURE)) {
- String config = metaData.getString(KEY_GLOBAL_SETTINGS);
- String signature = metaData.getString(KEY_GLOBAL_SETTINGS_SIGNATURE);
+ SignedConfigEvent event = new SignedConfigEvent();
try {
- // Base64 encoding is standard (not URL safe) encoding: RFC4648
- config = new String(Base64.getDecoder().decode(config), StandardCharsets.UTF_8);
- } catch (IllegalArgumentException iae) {
- Slog.e(TAG, "Failed to base64 decode global settings config from " + packageName);
- return;
+ event.type = StatsLog.SIGNED_CONFIG_REPORTED__TYPE__GLOBAL_SETTINGS;
+ event.fromPackage = packageName;
+ String config = metaData.getString(KEY_GLOBAL_SETTINGS);
+ String signature = metaData.getString(KEY_GLOBAL_SETTINGS_SIGNATURE);
+ try {
+ // Base64 encoding is standard (not URL safe) encoding: RFC4648
+ config = new String(Base64.getDecoder().decode(config), StandardCharsets.UTF_8);
+ } catch (IllegalArgumentException iae) {
+ Slog.e(TAG, "Failed to base64 decode global settings config from "
+ + packageName);
+ event.status = StatsLog.SIGNED_CONFIG_REPORTED__STATUS__BASE64_FAILURE_CONFIG;
+ return;
+ }
+ if (DBG) {
+ Slog.d(TAG, "Got global settings config: " + config);
+ Slog.d(TAG, "Got global settings signature: " + signature);
+ }
+ new GlobalSettingsConfigApplicator(mContext, packageName, event).applyConfig(
+ config, signature);
+ } finally {
+ event.send();
}
- if (DBG) {
- Slog.d(TAG, "Got global settings config: " + config);
- Slog.d(TAG, "Got global settings signature: " + signature);
- }
- new GlobalSettingsConfigApplicator(mContext, packageName).applyConfig(
- config, signature);
} else {
if (DBG) Slog.d(TAG, "Package has no global settings config/signature.");
}
diff --git a/services/core/java/com/android/server/slice/SlicePermissionManager.java b/services/core/java/com/android/server/slice/SlicePermissionManager.java
index 315d5e39c94b..1d1c28f5f9b7 100644
--- a/services/core/java/com/android/server/slice/SlicePermissionManager.java
+++ b/services/core/java/com/android/server/slice/SlicePermissionManager.java
@@ -175,18 +175,24 @@ public class SlicePermissionManager implements DirtyTracker {
handlePersist();
}
for (String file : new File(mSliceDir.getAbsolutePath()).list()) {
- if (file.isEmpty()) continue;
try (ParserHolder parser = getParser(file)) {
- Persistable p;
- while (parser.parser.getEventType() != XmlPullParser.START_TAG) {
+ Persistable p = null;
+ while (parser.parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+ if (parser.parser.getEventType() == XmlPullParser.START_TAG) {
+ if (SliceClientPermissions.TAG_CLIENT.equals(parser.parser.getName())) {
+ p = SliceClientPermissions.createFrom(parser.parser, tracker);
+ } else {
+ p = SliceProviderPermissions.createFrom(parser.parser, tracker);
+ }
+ break;
+ }
parser.parser.next();
}
- if (SliceClientPermissions.TAG_CLIENT.equals(parser.parser.getName())) {
- p = SliceClientPermissions.createFrom(parser.parser, tracker);
+ if (p != null) {
+ p.writeTo(out);
} else {
- p = SliceProviderPermissions.createFrom(parser.parser, tracker);
+ Slog.w(TAG, "Invalid or empty slice permissions file: " + file);
}
- p.writeTo(out);
}
}
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index 30aa5280eac6..4e71a054fa80 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -43,6 +43,7 @@ import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.hardware.fingerprint.FingerprintManager;
import android.net.ConnectivityManager;
+import android.net.INetworkStatsService;
import android.net.Network;
import android.net.NetworkRequest;
import android.net.NetworkStats;
@@ -90,7 +91,6 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.procstats.IProcessStats;
import com.android.internal.app.procstats.ProcessStats;
-import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BinderCallsStats.ExportedCallStat;
@@ -210,6 +210,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
private final Context mContext;
private final AlarmManager mAlarmManager;
+ private final INetworkStatsService mNetworkStatsService;
@GuardedBy("sStatsdLock")
private static IStatsManager sStatsd;
private static final Object sStatsdLock = new Object();
@@ -257,6 +258,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
super();
mContext = context;
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ mNetworkStatsService = INetworkStatsService.Stub.asInterface(
+ ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
mBaseDir.mkdirs();
mAppUpdateReceiver = new AppUpdateReceiver();
mUserUpdateReceiver = new BroadcastReceiver() {
@@ -788,14 +791,14 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
if (ifaces.length == 0) {
return;
}
- NetworkStatsFactory nsf = new NetworkStatsFactory();
+ if (mNetworkStatsService == null) {
+ Slog.e(TAG, "NetworkStats Service is not available!");
+ return;
+ }
// Combine all the metrics per Uid into one record.
- NetworkStats stats =
- nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE,
- null)
- .groupedByUid();
+ NetworkStats stats = mNetworkStatsService.getDetailedUidStats(ifaces).groupedByUid();
addNetworkStats(tagId, pulledData, stats, false);
- } catch (java.io.IOException e) {
+ } catch (RemoteException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
@@ -812,12 +815,14 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
if (ifaces.length == 0) {
return;
}
- NetworkStatsFactory nsf = new NetworkStatsFactory();
+ if (mNetworkStatsService == null) {
+ Slog.e(TAG, "NetworkStats Service is not available!");
+ return;
+ }
NetworkStats stats = rollupNetworkStatsByFGBG(
- nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE,
- null));
+ mNetworkStatsService.getDetailedUidStats(ifaces));
addNetworkStats(tagId, pulledData, stats, true);
- } catch (java.io.IOException e) {
+ } catch (RemoteException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
@@ -834,14 +839,14 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
if (ifaces.length == 0) {
return;
}
- NetworkStatsFactory nsf = new NetworkStatsFactory();
+ if (mNetworkStatsService == null) {
+ Slog.e(TAG, "NetworkStats Service is not available!");
+ return;
+ }
// Combine all the metrics per Uid into one record.
- NetworkStats stats =
- nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE,
- null)
- .groupedByUid();
+ NetworkStats stats = mNetworkStatsService.getDetailedUidStats(ifaces).groupedByUid();
addNetworkStats(tagId, pulledData, stats, false);
- } catch (java.io.IOException e) {
+ } catch (RemoteException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
@@ -874,12 +879,14 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
if (ifaces.length == 0) {
return;
}
- NetworkStatsFactory nsf = new NetworkStatsFactory();
+ if (mNetworkStatsService == null) {
+ Slog.e(TAG, "NetworkStats Service is not available!");
+ return;
+ }
NetworkStats stats = rollupNetworkStatsByFGBG(
- nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE,
- null));
+ mNetworkStatsService.getDetailedUidStats(ifaces));
addNetworkStats(tagId, pulledData, stats, true);
- } catch (java.io.IOException e) {
+ } catch (RemoteException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
@@ -2058,6 +2065,17 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
mContext.unregisterReceiver(mShutdownEventReceiver);
cancelAnomalyAlarm();
cancelPullingAlarm();
+
+ BinderCallsStatsService.Internal binderStats =
+ LocalServices.getService(BinderCallsStatsService.Internal.class);
+ if (binderStats != null) {
+ binderStats.reset();
+ }
+
+ LooperStats looperStats = LocalServices.getService(LooperStats.class);
+ if (looperStats != null) {
+ looperStats.reset();
+ }
}
@Override
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index fc21adbdcca3..7c1e6198080d 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -598,11 +598,11 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
- public void onBiometricAuthenticated() {
+ public void onBiometricAuthenticated(boolean authenticated) {
enforceBiometricDialog();
if (mBar != null) {
try {
- mBar.onBiometricAuthenticated();
+ mBar.onBiometricAuthenticated(authenticated);
} catch (RemoteException ex) {
}
}
@@ -641,17 +641,6 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
}
- @Override
- public void showBiometricTryAgain() {
- enforceBiometricDialog();
- if (mBar != null) {
- try {
- mBar.showBiometricTryAgain();
- } catch (RemoteException ex) {
- }
- }
- }
-
// TODO(b/117478341): make it aware of multi-display if needed.
@Override
public void disable(int what, IBinder token, String pkg) {
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index f7cc4432f9bc..2700f9ddc203 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -24,7 +24,6 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileObserver;
@@ -42,13 +41,13 @@ import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.DataUnit;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.EventLogTags;
-import com.android.server.IoThread;
import com.android.server.SystemService;
import com.android.server.pm.InstructionSets;
import com.android.server.pm.PackageManagerService;
@@ -499,9 +498,15 @@ public class DeviceStorageMonitorService extends SystemService {
notification.flags |= Notification.FLAG_NO_CLEAR;
mNotifManager.notifyAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
notification, UserHandle.ALL);
+ StatsLog.write(StatsLog.LOW_STORAGE_STATE_CHANGED,
+ Objects.toString(vol.getDescription()),
+ StatsLog.LOW_STORAGE_STATE_CHANGED__STATE__ON);
} else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
mNotifManager.cancelAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
UserHandle.ALL);
+ StatsLog.write(StatsLog.LOW_STORAGE_STATE_CHANGED,
+ Objects.toString(vol.getDescription()),
+ StatsLog.LOW_STORAGE_STATE_CHANGED__STATE__OFF);
}
}
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index 2cab63aa680a..ef771406805b 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -510,7 +510,8 @@ public final class TextClassificationManagerService extends ITextClassifierServi
Slog.d(LOG_TAG, "Binding to " + serviceIntent.getComponent());
willBind = mContext.bindServiceAsUser(
serviceIntent, mConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
+ | Context.BIND_RESTRICT_ASSOCIATIONS,
UserHandle.of(mUserId));
mBinding = willBind;
} finally {
diff --git a/services/core/java/com/android/server/textservices/TextServicesManagerService.java b/services/core/java/com/android/server/textservices/TextServicesManagerService.java
index 65d5b10590fa..d4aa59d3ce85 100644
--- a/services/core/java/com/android/server/textservices/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/textservices/TextServicesManagerService.java
@@ -16,7 +16,7 @@
package com.android.server.textservices;
-import static android.view.textservice.TextServicesManager.DISABLE_PER_PROFILE_SPELL_CHECKER;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -43,6 +43,7 @@ import android.service.textservice.SpellCheckerService;
import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseArray;
+import android.view.inputmethod.InputMethodSystemProperty;
import android.view.textservice.SpellCheckerInfo;
import android.view.textservice.SpellCheckerSubtype;
@@ -334,7 +335,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
mContext = context;
mUserManager = mContext.getSystemService(UserManager.class);
mSpellCheckerOwnerUserIdMap = new LazyIntToIntMap(callingUserId -> {
- if (DISABLE_PER_PROFILE_SPELL_CHECKER) {
+ if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) {
final long token = Binder.clearCallingIdentity();
try {
final UserInfo parent = mUserManager.getProfileParent(callingUserId);
@@ -355,7 +356,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
private void initializeInternalStateLocked(@UserIdInt int userId) {
// When DISABLE_PER_PROFILE_SPELL_CHECKER is true, we make sure here that work profile users
// will never have non-null TextServicesData for their user ID.
- if (DISABLE_PER_PROFILE_SPELL_CHECKER
+ if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED
&& userId != mSpellCheckerOwnerUserIdMap.get(userId)) {
return;
}
@@ -514,8 +515,8 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
// TODO: Save SpellCheckerService by supported languages. Currently only one spell
// checker is saved.
@Override
- public SpellCheckerInfo getCurrentSpellChecker(String locale) {
- int userId = UserHandle.getCallingUserId();
+ public SpellCheckerInfo getCurrentSpellChecker(@UserIdInt int userId, String locale) {
+ verifyUser(userId);
synchronized (mLock) {
final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
if (tsd == null) return null;
@@ -528,11 +529,12 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
// TODO: Save SpellCheckerSubtype by supported languages by looking at "locale".
@Override
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
- boolean allowImplicitlySelectedSubtype) {
+ @UserIdInt int userId, boolean allowImplicitlySelectedSubtype) {
+ verifyUser(userId);
+
final int subtypeHashCode;
final SpellCheckerInfo sci;
final Locale systemLocale;
- final int userId = UserHandle.getCallingUserId();
synchronized (mLock) {
final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
@@ -592,17 +594,17 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
@Override
- public void getSpellCheckerService(String sciId, String locale,
+ public void getSpellCheckerService(@UserIdInt int userId, String sciId, String locale,
ITextServicesSessionListener tsListener, ISpellCheckerSessionListener scListener,
Bundle bundle) {
+ verifyUser(userId);
if (TextUtils.isEmpty(sciId) || tsListener == null || scListener == null) {
Slog.e(TAG, "getSpellCheckerService: Invalid input.");
return;
}
- int callingUserId = UserHandle.getCallingUserId();
synchronized (mLock) {
- final TextServicesData tsd = getDataFromCallingUserIdLocked(callingUserId);
+ final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
if (tsd == null) return;
HashMap<String, SpellCheckerInfo> spellCheckerMap = tsd.mSpellCheckerMap;
@@ -635,8 +637,8 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
@Override
- public boolean isSpellCheckerEnabled() {
- int userId = UserHandle.getCallingUserId();
+ public boolean isSpellCheckerEnabled(@UserIdInt int userId) {
+ verifyUser(userId);
synchronized (mLock) {
final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
@@ -672,11 +674,11 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
@Override
- public SpellCheckerInfo[] getEnabledSpellCheckers() {
- int callingUserId = UserHandle.getCallingUserId();
+ public SpellCheckerInfo[] getEnabledSpellCheckers(@UserIdInt int userId) {
+ verifyUser(userId);
synchronized (mLock) {
- final TextServicesData tsd = getDataFromCallingUserIdLocked(callingUserId);
+ final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
if (tsd == null) return null;
ArrayList<SpellCheckerInfo> spellCheckerList = tsd.mSpellCheckerList;
@@ -692,11 +694,12 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
@Override
- public void finishSpellCheckerService(ISpellCheckerSessionListener listener) {
+ public void finishSpellCheckerService(@UserIdInt int userId,
+ ISpellCheckerSessionListener listener) {
if (DBG) {
Slog.d(TAG, "FinishSpellCheckerService");
}
- int userId = UserHandle.getCallingUserId();
+ verifyUser(userId);
synchronized (mLock) {
final TextServicesData tsd = getDataFromCallingUserIdLocked(userId);
@@ -717,6 +720,15 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
}
+ private void verifyUser(@UserIdInt int userId) {
+ final int callingUserId = UserHandle.getCallingUserId();
+ if (userId != callingUserId) {
+ mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL,
+ "Cross-user interaction requires INTERACT_ACROSS_USERS_FULL. userId=" + userId
+ + " callingUserId=" + callingUserId);
+ }
+ }
+
private void setCurrentSpellCheckerLocked(@Nullable SpellCheckerInfo sci, TextServicesData tsd) {
final String sciId = (sci != null) ? sci.getId() : "";
if (DBG) {
@@ -780,7 +792,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
private TextServicesData getDataFromCallingUserIdLocked(@UserIdInt int callingUserId) {
final int spellCheckerOwnerUserId = mSpellCheckerOwnerUserIdMap.get(callingUserId);
final TextServicesData data = mUserData.get(spellCheckerOwnerUserId);
- if (DISABLE_PER_PROFILE_SPELL_CHECKER) {
+ if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) {
if (spellCheckerOwnerUserId != callingUserId) {
// Calling process is running under child profile.
if (data == null) {
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index f00877030145..69040a2ea974 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -84,11 +84,13 @@ import android.service.wallpaper.WallpaperService;
import android.system.ErrnoException;
import android.system.Os;
import android.util.EventLog;
+import android.util.FeatureFlagUtils;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.Xml;
import android.view.Display;
+import android.view.DisplayInfo;
import android.view.IWindowManager;
import com.android.internal.R;
@@ -350,12 +352,34 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
private void notifyWallpaperColorsChanged(@NonNull WallpaperData wallpaper, int which) {
+ if (wallpaper.connection != null) {
+ wallpaper.connection.forEachDisplayConnector(connector -> {
+ notifyWallpaperColorsChangedOnDisplay(wallpaper, which, connector.mDisplayId);
+ });
+ } else { // Lock wallpaper does not have WallpaperConnection.
+ notifyWallpaperColorsChangedOnDisplay(wallpaper, which, DEFAULT_DISPLAY);
+ }
+ }
+
+ private RemoteCallbackList<IWallpaperManagerCallback> getWallpaperCallbacks(int userId,
+ int displayId) {
+ RemoteCallbackList<IWallpaperManagerCallback> listeners = null;
+ final SparseArray<RemoteCallbackList<IWallpaperManagerCallback>> displayListeners =
+ mColorsChangedListeners.get(userId);
+ if (displayListeners != null) {
+ listeners = displayListeners.get(displayId);
+ }
+ return listeners;
+ }
+
+ private void notifyWallpaperColorsChangedOnDisplay(@NonNull WallpaperData wallpaper, int which,
+ int displayId) {
boolean needsExtraction;
synchronized (mLock) {
final RemoteCallbackList<IWallpaperManagerCallback> currentUserColorListeners =
- mColorsChangedListeners.get(wallpaper.userId);
+ getWallpaperCallbacks(wallpaper.userId, displayId);
final RemoteCallbackList<IWallpaperManagerCallback> userAllColorListeners =
- mColorsChangedListeners.get(UserHandle.USER_ALL);
+ getWallpaperCallbacks(UserHandle.USER_ALL, displayId);
// No-op until someone is listening to it.
if (emptyCallbackList(currentUserColorListeners) &&
emptyCallbackList(userAllColorListeners)) {
@@ -363,7 +387,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
if (DEBUG) {
- Slog.v(TAG, "notifyWallpaperColorsChanged " + which);
+ Slog.v(TAG, "notifyWallpaperColorsChangedOnDisplay " + which);
}
needsExtraction = wallpaper.primaryColors == null;
@@ -371,7 +395,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// Let's notify the current values, it's fine if it's null, it just means
// that we don't know yet.
- notifyColorListeners(wallpaper.primaryColors, which, wallpaper.userId);
+ notifyColorListeners(wallpaper.primaryColors, which, wallpaper.userId, displayId);
if (needsExtraction) {
extractColors(wallpaper);
@@ -381,7 +405,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
return;
}
}
- notifyColorListeners(wallpaper.primaryColors, which, wallpaper.userId);
+ notifyColorListeners(wallpaper.primaryColors, which, wallpaper.userId, displayId);
}
}
@@ -390,14 +414,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
private void notifyColorListeners(@NonNull WallpaperColors wallpaperColors, int which,
- int userId) {
+ int userId, int displayId) {
final IWallpaperManagerCallback keyguardListener;
final ArrayList<IWallpaperManagerCallback> colorListeners = new ArrayList<>();
synchronized (mLock) {
final RemoteCallbackList<IWallpaperManagerCallback> currentUserColorListeners =
- mColorsChangedListeners.get(userId);
+ getWallpaperCallbacks(userId, displayId);
final RemoteCallbackList<IWallpaperManagerCallback> userAllColorListeners =
- mColorsChangedListeners.get(UserHandle.USER_ALL);
+ getWallpaperCallbacks(UserHandle.USER_ALL, displayId);
keyguardListener = mKeyguardListener;
if (currentUserColorListeners != null) {
@@ -427,7 +451,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
}
- if (keyguardListener != null) {
+ // Only shows Keyguard on default display
+ if (keyguardListener != null && displayId == DEFAULT_DISPLAY) {
try {
keyguardListener.onWallpaperColorsChanged(wallpaperColors, which, userId);
} catch (RemoteException e) {
@@ -446,6 +471,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
String cropFile = null;
int wallpaperId;
+ if (wallpaper.equals(mFallbackWallpaper)) {
+ extractDefaultImageWallpaperColors();
+ return;
+ }
+
synchronized (mLock) {
// Not having a wallpaperComponent means it's a lock screen wallpaper.
final boolean imageWallpaper = mImageWallpaper.equals(wallpaper.wallpaperComponent)
@@ -482,6 +512,39 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
}
+ private void extractDefaultImageWallpaperColors() {
+ synchronized (mLock) {
+ if (mFallbackWallpaper.primaryColors != null) return;
+ }
+
+ if (DEBUG) Slog.d(TAG, "Extract default image wallpaper colors");
+ WallpaperColors colors = null;
+ final InputStream is = WallpaperManager.openDefaultWallpaper(mContext, FLAG_SYSTEM);
+ if (is != null) {
+ try {
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ final Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
+ if (bitmap != null) {
+ colors = WallpaperColors.fromBitmap(bitmap);
+ bitmap.recycle();
+ }
+ } catch (OutOfMemoryError e) {
+ Slog.w(TAG, "Can't decode default wallpaper stream", e);
+ } finally {
+ IoUtils.closeQuietly(is);
+ }
+ }
+
+ if (colors == null) {
+ Slog.e(TAG, "Extract default image wallpaper colors failed");
+ return;
+ }
+
+ synchronized (mLock) {
+ mFallbackWallpaper.primaryColors = colors;
+ }
+ }
+
/**
* Once a new wallpaper has been written via setWallpaper(...), it needs to be cropped
* for display.
@@ -539,6 +602,20 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// scale if the crop height winds up not matching the recommended metrics
needScale = (wpData.mHeight != cropHint.height());
+ //make sure screen aspect ratio is preserved if width is scaled under screen size
+ if (needScale) {
+ final DisplayInfo displayInfo = new DisplayInfo();
+ mDisplayManager.getDisplay(DEFAULT_DISPLAY).getDisplayInfo(displayInfo);
+ final float scaleByHeight = (float) wpData.mHeight / (float) cropHint.height();
+ final int newWidth = (int) (cropHint.width() * scaleByHeight);
+ if (newWidth < displayInfo.logicalWidth) {
+ final float screenAspectRatio =
+ (float) displayInfo.logicalHeight / (float) displayInfo.logicalWidth;
+ cropHint.bottom = (int) (cropHint.width() * screenAspectRatio);
+ needCrop = true;
+ }
+ }
+
if (DEBUG) {
Slog.v(TAG, "crop: w=" + cropHint.width() + " h=" + cropHint.height());
Slog.v(TAG, "dims: w=" + wpData.mWidth + " h=" + wpData.mHeight);
@@ -696,6 +773,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
targetWallpaper.connection.removeDisplayConnector(displayId);
removeDisplayData(displayId);
}
+ for (int i = mColorsChangedListeners.size() - 1; i >= 0; i--) {
+ final SparseArray<RemoteCallbackList<IWallpaperManagerCallback>> callbacks =
+ mColorsChangedListeners.valueAt(i);
+ callbacks.delete(displayId);
+ }
}
}
@@ -706,9 +788,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
/**
* Map of color listeners per user id.
- * The key will be the id of a user or UserHandle.USER_ALL - for wildcard listeners.
+ * The first key will be the id of a user or UserHandle.USER_ALL - for wildcard listeners.
+ * The secondary key will be the display id, which means which display the listener is
+ * interested in.
*/
- private final SparseArray<RemoteCallbackList<IWallpaperManagerCallback>>
+ private final SparseArray<SparseArray<RemoteCallbackList<IWallpaperManagerCallback>>>
mColorsChangedListeners;
private WallpaperData mLastWallpaper;
private IWallpaperManagerCallback mKeyguardListener;
@@ -904,14 +988,15 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
Slog.w(TAG, "Fallback wallpaper connection has not been created yet!!");
return;
}
- if (supportsMultiDisplay(systemConnection)
- && fallbackConnection.mDisplayConnector.size() != 0) {
- fallbackConnection.forEachDisplayConnector(connector -> {
- if (connector.mEngine != null) {
- connector.disconnectLocked();
- }
- });
- fallbackConnection.mDisplayConnector.clear();
+ if (supportsMultiDisplay(systemConnection)) {
+ if (fallbackConnection.mDisplayConnector.size() != 0) {
+ fallbackConnection.forEachDisplayConnector(connector -> {
+ if (connector.mEngine != null) {
+ connector.disconnectLocked();
+ }
+ });
+ fallbackConnection.mDisplayConnector.clear();
+ }
} else {
fallbackConnection.appendConnectorWithCondition(display ->
fallbackConnection.isUsableDisplay(display)
@@ -1228,9 +1313,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
/**
* Called by a live wallpaper if its colors have changed.
* @param primaryColors representation of wallpaper primary colors
+ * @param displayId for which display
*/
@Override
- public void onWallpaperColorsChanged(WallpaperColors primaryColors) {
+ public void onWallpaperColorsChanged(WallpaperColors primaryColors, int displayId) {
int which;
synchronized (mLock) {
// Do not broadcast changes on ImageWallpaper since it's handled
@@ -1243,14 +1329,16 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// Live wallpapers always are system wallpapers.
which = FLAG_SYSTEM;
- // It's also the lock screen wallpaper when we don't have a bitmap in there
- WallpaperData lockedWallpaper = mLockWallpaperMap.get(mWallpaper.userId);
- if (lockedWallpaper == null) {
- which |= FLAG_LOCK;
+ // It's also the lock screen wallpaper when we don't have a bitmap in there.
+ if (displayId == DEFAULT_DISPLAY) {
+ final WallpaperData lockedWallpaper = mLockWallpaperMap.get(mWallpaper.userId);
+ if (lockedWallpaper == null) {
+ which |= FLAG_LOCK;
+ }
}
}
if (which != 0) {
- notifyWallpaperColorsChanged(mWallpaper, which);
+ notifyWallpaperColorsChangedOnDisplay(mWallpaper, which, displayId);
}
}
@@ -1277,16 +1365,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
Slog.w(TAG, "Failed to set ambient mode state", e);
}
}
- // TODO(multi-display) So far, we have shared the same wallpaper on each display.
- // Once we have multiple wallpapers on multiple displays, please complete here.
- if (displayId == DEFAULT_DISPLAY) {
- try {
- // This will trigger onComputeColors in the wallpaper engine.
- // It's fine to be locked in here since the binder is oneway.
- connector.mEngine.requestWallpaperColors();
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to request wallpaper colors", e);
- }
+ try {
+ // This will trigger onComputeColors in the wallpaper engine.
+ // It's fine to be locked in here since the binder is oneway.
+ connector.mEngine.requestWallpaperColors();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to request wallpaper colors", e);
}
}
}
@@ -1681,6 +1765,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
FgThread.getHandler().post(() -> {
notifyWallpaperColorsChanged(systemWallpaper, FLAG_SYSTEM);
notifyWallpaperColorsChanged(lockWallpaper, FLAG_LOCK);
+ notifyWallpaperColorsChanged(mFallbackWallpaper, FLAG_SYSTEM);
});
}
@@ -1743,6 +1828,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// When clearing a wallpaper, broadcast new valid colors
if (data != null) {
notifyWallpaperColorsChanged(data, which);
+ notifyWallpaperColorsChanged(mFallbackWallpaper, FLAG_SYSTEM);
}
}
@@ -2084,35 +2170,47 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
@Override
- public void registerWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId) {
+ public void registerWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId,
+ int displayId) {
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, true, true, "registerWallpaperColorsCallback", null);
synchronized (mLock) {
- RemoteCallbackList<IWallpaperManagerCallback> userColorsChangedListeners =
- mColorsChangedListeners.get(userId);
- if (userColorsChangedListeners == null) {
- userColorsChangedListeners = new RemoteCallbackList<>();
- mColorsChangedListeners.put(userId, userColorsChangedListeners);
+ SparseArray<RemoteCallbackList<IWallpaperManagerCallback>>
+ userDisplayColorsChangedListeners = mColorsChangedListeners.get(userId);
+ if (userDisplayColorsChangedListeners == null) {
+ userDisplayColorsChangedListeners = new SparseArray<>();
+ mColorsChangedListeners.put(userId, userDisplayColorsChangedListeners);
}
- userColorsChangedListeners.register(cb);
+ RemoteCallbackList<IWallpaperManagerCallback> displayChangedListeners =
+ userDisplayColorsChangedListeners.get(displayId);
+ if (displayChangedListeners == null) {
+ displayChangedListeners = new RemoteCallbackList<>();
+ userDisplayColorsChangedListeners.put(displayId, displayChangedListeners);
+ }
+ displayChangedListeners.register(cb);
}
}
@Override
- public void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId) {
+ public void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId,
+ int displayId) {
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, true, true, "unregisterWallpaperColorsCallback", null);
synchronized (mLock) {
- final RemoteCallbackList<IWallpaperManagerCallback> userColorsChangedListeners =
- mColorsChangedListeners.get(userId);
- if (userColorsChangedListeners != null) {
- userColorsChangedListeners.unregister(cb);
+ SparseArray<RemoteCallbackList<IWallpaperManagerCallback>>
+ userDisplayColorsChangedListeners = mColorsChangedListeners.get(userId);
+ if (userDisplayColorsChangedListeners != null) {
+ RemoteCallbackList<IWallpaperManagerCallback> displayChangedListeners =
+ userDisplayColorsChangedListeners.get(displayId);
+ if (displayChangedListeners != null) {
+ displayChangedListeners.unregister(cb);
+ }
}
}
}
/**
- * TODO(b/115486823) Extends this method with specific display.
+ * TODO(multi-display) Extends this method with specific display.
* Propagate ambient state to wallpaper engine.
*
* @param inAmbientMode {@code true} when in ambient mode, {@code false} otherwise.
@@ -2123,9 +2221,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
synchronized (mLock) {
mInAmbientMode = inAmbientMode;
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
- if (data != null && data.connection != null && data.connection.mInfo != null
- && data.connection.mInfo.supportsAmbientMode()) {
- // TODO(b/115486823) Extends this method with specific display.
+ final boolean hasConnection = data != null && data.connection != null;
+ final WallpaperInfo info = hasConnection ? data.connection.mInfo : null;
+
+ // The wallpaper info is null for image wallpaper, also use the engine in this case.
+ if (hasConnection && (info == null && isAodImageWallpaperEnabled()
+ || info != null && info.supportsAmbientMode())) {
+ // TODO(multi-display) Extends this method with specific display.
engine = data.connection.getDisplayConnectorOrCreate(DEFAULT_DISPLAY).mEngine;
} else {
engine = null;
@@ -2141,6 +2243,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
}
+ private boolean isAodImageWallpaperEnabled() {
+ return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.AOD_IMAGEWALLPAPER_ENABLED);
+ }
+
@Override
public boolean setLockWallpaperCallback(IWallpaperManagerCallback cb) {
checkPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW);
@@ -2151,7 +2257,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
@Override
- public WallpaperColors getWallpaperColors(int which, int userId) throws RemoteException {
+ public WallpaperColors getWallpaperColors(int which, int userId, int displayId)
+ throws RemoteException {
if (which != FLAG_LOCK && which != FLAG_SYSTEM) {
throw new IllegalArgumentException("which should be either FLAG_LOCK or FLAG_SYSTEM");
}
@@ -2169,7 +2276,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// Try to get the system wallpaper anyway since it might
// also be the lock screen wallpaper
if (wallpaperData == null) {
- wallpaperData = mWallpaperMap.get(userId);
+ wallpaperData = findWallpaperAtDisplay(userId, displayId);
}
if (wallpaperData == null) {
@@ -2187,6 +2294,15 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
}
+ private WallpaperData findWallpaperAtDisplay(int userId, int displayId) {
+ if (mFallbackWallpaper != null && mFallbackWallpaper.connection != null
+ && mFallbackWallpaper.connection.containsDisplay(displayId)) {
+ return mFallbackWallpaper;
+ } else {
+ return mWallpaperMap.get(userId);
+ }
+ }
+
@Override
public ParcelFileDescriptor setWallpaper(String name, String callingPackage,
Rect cropHint, boolean allowBackup, Bundle extras, int which,
@@ -2382,6 +2498,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
if (shouldNotifyColors) {
notifyWallpaperColorsChanged(wallpaper, which);
+ notifyWallpaperColorsChanged(mFallbackWallpaper, FLAG_SYSTEM);
}
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index fe0b5c250da8..caebf1528270 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -1066,93 +1066,19 @@ final class AccessibilityController {
final int visibleWindowCount = visibleWindows.size();
HashSet<Integer> skipRemainingWindowsForTasks = new HashSet<>();
- for (int i = visibleWindowCount - 1; i >= 0; i--) {
- final WindowState windowState = visibleWindows.valueAt(i);
- final int flags = windowState.mAttrs.flags;
- final Task task = windowState.getTask();
- // If the window is part of a task that we're finished with - ignore.
- if (task != null && skipRemainingWindowsForTasks.contains(task.mTaskId)) {
- continue;
- }
-
- // Ignore non-touchable windows, except the split-screen divider, which is
- // occasionally non-touchable but still useful for identifying split-screen
- // mode.
- if (((flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
- && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)) {
- continue;
- }
+ // Iterate until we figure out what is touchable for the entire screen.
+ for (int i = visibleWindowCount - 1; i >= 0 && !unaccountedSpace.isEmpty(); i--) {
+ final WindowState windowState = visibleWindows.valueAt(i);
- // Compute the bounds in the screen.
final Rect boundsInScreen = mTempRect;
computeWindowBoundsInScreen(windowState, boundsInScreen);
- // If the window is completely covered by other windows - ignore.
- if (unaccountedSpace.quickReject(boundsInScreen)) {
- continue;
- }
-
- // Add windows of certain types not covered by modal windows.
- if (isReportedWindowType(windowState.mAttrs.type)) {
- // Add the window to the ones to be reported.
+ if (windowMattersToAccessibility(windowState, boundsInScreen, unaccountedSpace,
+ skipRemainingWindowsForTasks)) {
addPopulatedWindowInfo(windowState, boundsInScreen, windows, addedWindows);
- if (windowState.isFocused()) {
- focusedWindowAdded = true;
- }
- }
-
- if (windowState.mAttrs.type !=
- WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
-
- // Account for the space this window takes if the window
- // is not an accessibility overlay which does not change
- // the reported windows.
- unaccountedSpace.op(boundsInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
-
- // If a window is modal it prevents other windows from being touched
- if ((flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
- // Account for all space in the task, whether the windows in it are
- // touchable or not. The modal window blocks all touches from the task's
- // area.
- unaccountedSpace.op(windowState.getDisplayFrameLw(), unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
-
- if (task != null) {
- // If the window is associated with a particular task, we can skip the
- // rest of the windows for that task.
- skipRemainingWindowsForTasks.add(task.mTaskId);
- continue;
- } else {
- // If the window is not associated with a particular task, then it is
- // globally modal. In this case we can skip all remaining windows.
- break;
- }
- }
- }
-
- // We figured out what is touchable for the entire screen - done.
- if (unaccountedSpace.isEmpty()) {
- break;
- }
- }
-
- // Always report the focused window.
- if (!focusedWindowAdded) {
- for (int i = visibleWindowCount - 1; i >= 0; i--) {
- WindowState windowState = visibleWindows.valueAt(i);
- if (windowState.isFocused()) {
- // Compute the bounds in the screen.
- Rect boundsInScreen = mTempRect;
- computeWindowBoundsInScreen(windowState, boundsInScreen);
-
- // Add the window to the ones to be reported.
- addPopulatedWindowInfo(
- windowState, boundsInScreen, windows, addedWindows);
- break;
- }
+ updateUnaccountedSpace(windowState, boundsInScreen, unaccountedSpace,
+ skipRemainingWindowsForTasks);
}
}
@@ -1221,6 +1147,73 @@ final class AccessibilityController {
clearAndRecycleWindows(windows);
}
+ private boolean windowMattersToAccessibility(WindowState windowState, Rect boundsInScreen,
+ Region unaccountedSpace, HashSet<Integer> skipRemainingWindowsForTasks) {
+ if (windowState.isFocused()) {
+ return true;
+ }
+
+ // If the window is part of a task that we're finished with - ignore.
+ final Task task = windowState.getTask();
+ if (task != null && skipRemainingWindowsForTasks.contains(task.mTaskId)) {
+ return false;
+ }
+
+ // Ignore non-touchable windows, except the split-screen divider, which is
+ // occasionally non-touchable but still useful for identifying split-screen
+ // mode.
+ if (((windowState.mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
+ && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)) {
+ return false;
+ }
+
+ // If the window is completely covered by other windows - ignore.
+ if (unaccountedSpace.quickReject(boundsInScreen)) {
+ return false;
+ }
+
+ // Add windows of certain types not covered by modal windows.
+ if (isReportedWindowType(windowState.mAttrs.type)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private void updateUnaccountedSpace(WindowState windowState, Rect boundsInScreen,
+ Region unaccountedSpace, HashSet<Integer> skipRemainingWindowsForTasks) {
+ if (windowState.mAttrs.type
+ != WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+
+ // Account for the space this window takes if the window
+ // is not an accessibility overlay which does not change
+ // the reported windows.
+ unaccountedSpace.op(boundsInScreen, unaccountedSpace,
+ Region.Op.REVERSE_DIFFERENCE);
+
+ // If a window is modal it prevents other windows from being touched
+ if ((windowState.mAttrs.flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
+ // Account for all space in the task, whether the windows in it are
+ // touchable or not. The modal window blocks all touches from the task's
+ // area.
+ unaccountedSpace.op(windowState.getDisplayFrameLw(), unaccountedSpace,
+ Region.Op.REVERSE_DIFFERENCE);
+
+ final Task task = windowState.getTask();
+ if (task != null) {
+ // If the window is associated with a particular task, we can skip the
+ // rest of the windows for that task.
+ skipRemainingWindowsForTasks.add(task.mTaskId);
+ } else {
+ // If the window is not associated with a particular task, then it is
+ // globally modal. In this case we can skip all remaining windows.
+ unaccountedSpace.setEmpty();
+ }
+ }
+ }
+ }
+
private void computeWindowBoundsInScreen(WindowState windowState, Rect outBounds) {
// Get the touchable frame.
Region touchableRegion = mTempRegion1;
diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java
index 1968cf2ea069..919ef8163c21 100644
--- a/services/core/java/com/android/server/wm/ActivityDisplay.java
+++ b/services/core/java/com/android/server/wm/ActivityDisplay.java
@@ -286,12 +286,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
}
// Since positionChildAt() is called during the creation process of pinned stacks,
- // ActivityStack#getWindowContainerController() can be null. In this special case,
+ // ActivityStack#getStack() can be null. In this special case,
// since DisplayContest#positionStackAt() is called in TaskStack#onConfigurationChanged(),
// we don't have to call WindowContainerController#positionChildAt() here.
- if (stack.getWindowContainerController() != null && mDisplayContent != null) {
+ if (stack.getTaskStack() != null && mDisplayContent != null) {
mDisplayContent.positionStackAt(insertPosition,
- stack.getWindowContainerController().mContainer, includingParents);
+ stack.getTaskStack(), includingParents);
}
if (!wasContained) {
stack.setParent(this);
@@ -458,13 +458,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
@VisibleForTesting
<T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
int stackId, boolean onTop) {
- if (windowingMode == WINDOWING_MODE_PINNED) {
- return (T) new PinnedActivityStack(this, stackId,
- mRootActivityContainer.mStackSupervisor, onTop);
+ if (windowingMode == WINDOWING_MODE_PINNED && activityType != ACTIVITY_TYPE_STANDARD) {
+ throw new IllegalArgumentException("Stack with windowing mode cannot with non standard "
+ + "activity type.");
}
return (T) new ActivityStack(this, stackId,
- mRootActivityContainer.mStackSupervisor, windowingMode, activityType,
- onTop);
+ mRootActivityContainer.mStackSupervisor, windowingMode, activityType, onTop);
}
/**
@@ -567,22 +566,26 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
}
/**
- * Pause all activities in either all of the stacks or just the back stacks.
+ * Pause all activities in either all of the stacks or just the back stacks. This is done before
+ * resuming a new activity and to make sure that previously active activities are
+ * paused in stacks that are no longer visible or in pinned windowing mode. This does not
+ * pause activities in visible stacks, so if an activity is launched within the same stack/task,
+ * then we should explicitly pause that stack's top activity.
* @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
* @param resuming The resuming activity.
* @param dontWait The resuming activity isn't going to wait for all activities to be paused
* before resuming.
- * @return true if any activity was paused as a result of this call.
+ * @return {@code true} if any activity was paused as a result of this call.
*/
boolean pauseBackStacks(boolean userLeaving, ActivityRecord resuming, boolean dontWait) {
boolean someActivityPaused = false;
for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = mStacks.get(stackNdx);
- // TODO(b/111541062): Check if resumed activity on this display instead
- if (!mRootActivityContainer.isTopDisplayFocusedStack(stack)
- && stack.getResumedActivity() != null) {
+ final ActivityRecord resumedActivity = stack.getResumedActivity();
+ if (resumedActivity != null
+ && (!stack.shouldBeVisible(resuming) || !stack.isFocusable())) {
if (DEBUG_STATES) Slog.d(TAG_STATES, "pauseBackStacks: stack=" + stack +
- " mResumedActivity=" + stack.getResumedActivity());
+ " mResumedActivity=" + resumedActivity);
someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming,
dontWait);
}
@@ -679,6 +682,10 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
return;
}
+ // Collect the stacks that are necessary to be removed instead of performing the removal
+ // by looping mStacks, so that we don't miss any stacks after the stack size changed or
+ // stacks reordered.
+ final ArrayList<ActivityStack> stacks = new ArrayList<>();
for (int j = windowingModes.length - 1 ; j >= 0; --j) {
final int windowingMode = windowingModes[j];
for (int i = mStacks.size() - 1; i >= 0; --i) {
@@ -689,9 +696,13 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
if (stack.getWindowingMode() != windowingMode) {
continue;
}
- mRootActivityContainer.mStackSupervisor.removeStack(stack);
+ stacks.add(stack);
}
}
+
+ for (int i = stacks.size() - 1; i >= 0; --i) {
+ mRootActivityContainer.mStackSupervisor.removeStack(stacks.get(i));
+ }
}
void removeStacksWithActivityTypes(int... activityTypes) {
@@ -699,15 +710,23 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
return;
}
+ // Collect the stacks that are necessary to be removed instead of performing the removal
+ // by looping mStacks, so that we don't miss any stacks after the stack size changed or
+ // stacks reordered.
+ final ArrayList<ActivityStack> stacks = new ArrayList<>();
for (int j = activityTypes.length - 1 ; j >= 0; --j) {
final int activityType = activityTypes[j];
for (int i = mStacks.size() - 1; i >= 0; --i) {
final ActivityStack stack = mStacks.get(i);
if (stack.getActivityType() == activityType) {
- mRootActivityContainer.mStackSupervisor.removeStack(stack);
+ stacks.add(stack);
}
}
}
+
+ for (int i = stacks.size() - 1; i >= 0; --i) {
+ mRootActivityContainer.mStackSupervisor.removeStack(stacks.get(i));
+ }
}
void onStackWindowingModeChanged(ActivityStack stack) {
@@ -1072,8 +1091,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
return mSplitScreenPrimaryStack != null;
}
- PinnedActivityStack getPinnedStack() {
- return (PinnedActivityStack) mPinnedStack;
+ ActivityStack getPinnedStack() {
+ return mPinnedStack;
}
boolean hasPinnedStack() {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 02517fcc39ad..1d7acb467640 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -54,6 +54,7 @@ import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
import static android.content.pm.ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
import static android.content.pm.ActivityInfo.FLAG_IMMERSIVE;
+import static android.content.pm.ActivityInfo.FLAG_INHERIT_SHOW_WHEN_LOCKED;
import static android.content.pm.ActivityInfo.FLAG_MULTIPROCESS;
import static android.content.pm.ActivityInfo.FLAG_NO_HISTORY;
import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
@@ -142,6 +143,7 @@ import static org.xmlpull.v1.XmlPullParser.END_TAG;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager.TaskDescription;
import android.app.ActivityOptions;
import android.app.PendingIntent;
@@ -396,9 +398,15 @@ public final class ActivityRecord extends ConfigurationContainer {
int mRotationAnimationHint = -1;
private boolean mShowWhenLocked;
+ private boolean mInheritShownWhenLocked;
private boolean mTurnScreenOn;
/**
+ * Current sequencing integer of the configuration, for skipping old activity configurations.
+ */
+ private int mConfigurationSeq;
+
+ /**
* Temp configs used in {@link #ensureActivityConfiguration(int, boolean)}
*/
private final Configuration mTmpConfig = new Configuration();
@@ -737,9 +745,10 @@ public final class ActivityRecord extends ConfigurationContainer {
mLastReportedMultiWindowMode = inPictureInPictureMode;
final Configuration newConfig = new Configuration();
if (targetStackBounds != null && !targetStackBounds.isEmpty()) {
- task.computeResolvedOverrideConfiguration(newConfig,
- task.getParent().getConfiguration(),
- task.getRequestedOverrideConfiguration());
+ newConfig.setTo(task.getRequestedOverrideConfiguration());
+ Rect outBounds = newConfig.windowConfiguration.getBounds();
+ task.adjustForMinimalTaskDimensions(outBounds, outBounds);
+ task.computeConfigResourceOverrides(newConfig, task.getParent().getConfiguration());
}
schedulePictureInPictureModeChanged(newConfig);
scheduleMultiWindowModeChanged(newConfig);
@@ -1029,6 +1038,7 @@ public final class ActivityRecord extends ConfigurationContainer {
null : ComponentName.unflattenFromString(aInfo.requestedVrComponent);
mShowWhenLocked = (aInfo.flags & FLAG_SHOW_WHEN_LOCKED) != 0;
+ mInheritShownWhenLocked = (aInfo.privateFlags & FLAG_INHERIT_SHOW_WHEN_LOCKED) != 0;
mTurnScreenOn = (aInfo.flags & FLAG_TURN_SCREEN_ON) != 0;
mRotationAnimationHint = aInfo.rotationAnimation;
@@ -1517,14 +1527,6 @@ public final class ActivityRecord extends ConfigurationContainer {
return true;
}
- /**
- * @return true if the activity contains windows that have
- * {@link LayoutParams#FLAG_DISMISS_KEYGUARD} set
- */
- boolean hasDismissKeyguardWindows() {
- return mAtmService.mWindowManager.containsDismissKeyguardWindow(appToken);
- }
-
void makeFinishingLocked() {
if (finishing) {
return;
@@ -1980,30 +1982,84 @@ public final class ActivityRecord extends ConfigurationContainer {
try {
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
WindowVisibilityItem.obtain(true /* showWindow */));
- if (shouldPauseWhenBecomingVisible()) {
- // An activity must be in the {@link PAUSING} state for the system to validate
- // the move to {@link PAUSED}.
- setState(PAUSING, "makeVisibleIfNeeded");
+ makeActiveIfNeeded(null /* activeActivity*/);
+ } catch (Exception e) {
+ Slog.w(TAG, "Exception thrown sending visibility update: " + intent.getComponent(), e);
+ }
+ }
+
+ /**
+ * Make activity resumed or paused if needed.
+ * @param activeActivity an activity that is resumed or just completed pause action.
+ * We won't change the state of this activity.
+ */
+ boolean makeActiveIfNeeded(ActivityRecord activeActivity) {
+ if (shouldResumeActivity(activeActivity)) {
+ if (DEBUG_VISIBILITY) {
+ Slog.v("TAG_VISIBILITY", "Resume visible activity, " + this);
+ }
+ return getActivityStack().resumeTopActivityUncheckedLocked(activeActivity /* prev */,
+ null /* options */);
+ } else if (shouldPauseActivity(activeActivity)) {
+ if (DEBUG_VISIBILITY) {
+ Slog.v("TAG_VISIBILITY", "Pause visible activity, " + this);
+ }
+ // An activity must be in the {@link PAUSING} state for the system to validate
+ // the move to {@link PAUSED}.
+ setState(PAUSING, "makeVisibleIfNeeded");
+ try {
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
PauseActivityItem.obtain(finishing, false /* userLeaving */,
configChangeFlags, false /* dontReport */));
+ } catch (Exception e) {
+ Slog.w(TAG, "Exception thrown sending pause: " + intent.getComponent(), e);
}
- } catch (Exception e) {
- Slog.w(TAG, "Exception thrown sending visibility update: " + intent.getComponent(), e);
}
+ return false;
+ }
+
+ /**
+ * Check if activity should be moved to PAUSED state. The activity:
+ * - should be eligible to be made active (see {@link #shouldMakeActive(ActivityRecord)})
+ * - should be non-focusable
+ * - should not be currently pausing or paused
+ * @param activeActivity the activity that is active or just completed pause action. We won't
+ * resume if this activity is active.
+ */
+ private boolean shouldPauseActivity(ActivityRecord activeActivity) {
+ return shouldMakeActive(activeActivity) && !isFocusable() && !isState(PAUSING, PAUSED);
}
- /** Check if activity should be moved to PAUSED state when it becomes visible. */
- private boolean shouldPauseWhenBecomingVisible() {
- // If the activity is stopped or stopping, cycle to the paused state. We avoid doing
+ /**
+ * Check if activity should be moved to RESUMED state. The activity:
+ * - should be eligible to be made active (see {@link #shouldMakeActive(ActivityRecord)})
+ * - should be focusable
+ * @param activeActivity the activity that is active or just completed pause action. We won't
+ * resume if this activity is active.
+ */
+ private boolean shouldResumeActivity(ActivityRecord activeActivity) {
+ return shouldMakeActive(activeActivity) && isFocusable() && !isState(RESUMED);
+ }
+
+ /**
+ * Check if activity is eligible to be made active (resumed of paused). The activity:
+ * - should be paused, stopped or stopping
+ * - should not be the currently active one
+ * - should be either the topmost in task, or right below the top activity that is finishing
+ * If all of these conditions are not met at the same time, the activity cannot be made active.
+ */
+ private boolean shouldMakeActive(ActivityRecord activeActivity) {
+ // If the activity is stopped, stopping, cycle to an active state. We avoid doing
// this when there is an activity waiting to become translucent as the extra binder
// calls will lead to noticeable jank. A later call to
- // ActivityStack#ensureActivitiesVisibleLocked will bring the activity to the proper
- // paused state. We also avoid doing this for the activity the stack supervisor
- // considers the resumed activity, as normal means will bring the activity from STOPPED
- // to RESUMED. Adding PAUSING in this scenario will lead to double lifecycles.
- if (!isState(STOPPED, STOPPING) || getActivityStack().mTranslucentActivityWaiting != null
- || isResumedActivityOnDisplay()) {
+ // ActivityStack#ensureActivitiesVisibleLocked will bring the activity to a proper
+ // active state.
+ if (!isState(RESUMED, PAUSED, STOPPED, STOPPING)
+ || getActivityStack().mTranslucentActivityWaiting != null) {
+ return false;
+ }
+
+ if (this == activeActivity) {
return false;
}
@@ -2013,14 +2069,14 @@ public final class ActivityRecord extends ConfigurationContainer {
throw new IllegalStateException("Activity not found in its task");
}
if (positionInTask == task.mActivities.size() - 1) {
- // It's the topmost activity in the task - should become paused now
+ // It's the topmost activity in the task - should become resumed now
return true;
}
// Check if activity above is finishing now and this one becomes the topmost in task.
final ActivityRecord activityAbove = task.mActivities.get(positionInTask + 1);
if (activityAbove.finishing && results == null) {
- // We will only allow pausing if activity above wasn't launched for result. Otherwise it
- // will cause this activity to resume before getting result.
+ // We will only allow making active if activity above wasn't launched for result.
+ // Otherwise it will cause this activity to resume before getting result.
return true;
}
return false;
@@ -2555,8 +2611,16 @@ public final class ActivityRecord extends ConfigurationContainer {
return;
}
- final IBinder binder = freezeScreenIfNeeded ? appToken.asBinder() : null;
+ final IBinder binder =
+ (freezeScreenIfNeeded && appToken != null) ? appToken.asBinder() : null;
mAppWindowToken.setOrientation(requestedOrientation, binder, this);
+
+ // Push the new configuration to the requested app in case where it's not pushed, e.g. when
+ // the request is handled at task level with letterbox.
+ if (!getMergedOverrideConfiguration().equals(
+ mLastReportedConfiguration.getMergedConfiguration())) {
+ ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */);
+ }
}
int getOrientation() {
@@ -2599,7 +2663,6 @@ public final class ActivityRecord extends ConfigurationContainer {
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
private void updateOverrideConfiguration() {
- mTmpConfig.unset();
computeBounds(mTmpBounds);
if (mTmpBounds.equals(getRequestedOverrideBounds())) {
@@ -2610,13 +2673,54 @@ public final class ActivityRecord extends ConfigurationContainer {
// Bounds changed...update configuration to match.
if (!matchParentBounds()) {
- task.computeResolvedOverrideConfiguration(mTmpConfig,
- task.getParent().getConfiguration(), getRequestedOverrideConfiguration());
+ mTmpConfig.setTo(getRequestedOverrideConfiguration());
+ task.computeConfigResourceOverrides(mTmpConfig, task.getParent().getConfiguration());
+ } else {
+ mTmpConfig.unset();
}
onRequestedOverrideConfigurationChanged(mTmpConfig);
}
+ @Override
+ void resolveOverrideConfiguration(Configuration newParentConfiguration) {
+ super.resolveOverrideConfiguration(newParentConfiguration);
+
+ // Assign configuration sequence number into hierarchy because there is a different way than
+ // ensureActivityConfiguration() in this class that uses configuration in WindowState during
+ // layout traversals.
+ mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
+ getResolvedOverrideConfiguration().seq = mConfigurationSeq;
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newParentConfig) {
+ super.onConfigurationChanged(newParentConfig);
+
+ // Configuration's equality doesn't consider seq so if only seq number changes in resolved
+ // override configuration. Therefore ConfigurationContainer doesn't change merged override
+ // configuration, but it's used to push configuration changes so explicitly update that.
+ if (getMergedOverrideConfiguration().seq != getResolvedOverrideConfiguration().seq) {
+ onMergedOverrideConfigurationChanged();
+ }
+
+ // TODO(b/80414790): Remove code below after unification.
+ // Same as above it doesn't notify configuration listeners, and consequently AppWindowToken
+ // can't get updated seq number. However WindowState's merged override configuration needs
+ // to have this seq number because that's also used for activity config pushes during layout
+ // traversal. Therefore explicitly update them here.
+ if (mAppWindowToken == null) {
+ return;
+ }
+ final Configuration appWindowTokenRequestedOverrideConfig =
+ mAppWindowToken.getRequestedOverrideConfiguration();
+ if (appWindowTokenRequestedOverrideConfig.seq != getResolvedOverrideConfiguration().seq) {
+ appWindowTokenRequestedOverrideConfig.seq =
+ getResolvedOverrideConfiguration().seq;
+ mAppWindowToken.onMergedOverrideConfigurationChanged();
+ }
+ }
+
/** Returns true if the configuration is compatible with this activity. */
boolean isConfigurationCompatible(Configuration config) {
final int orientation = mAppWindowToken != null
@@ -3229,16 +3333,45 @@ public final class ActivityRecord extends ConfigurationContainer {
false /* preserveWindows */);
}
+ void setInheritShowWhenLocked(boolean inheritShowWhenLocked) {
+ mInheritShownWhenLocked = inheritShowWhenLocked;
+ mRootActivityContainer.ensureActivitiesVisible(null, 0, false);
+ }
+
/**
* @return true if the activity windowing mode is not
- * {@link android.app.WindowConfiguration#WINDOWING_MODE_PINNED} and activity contains
- * windows that have {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} set or if the activity
- * has set {@link #mShowWhenLocked}.
+ * {@link android.app.WindowConfiguration#WINDOWING_MODE_PINNED} and a) activity
+ * contains windows that have {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} set or if the
+ * activity has set {@link #mShowWhenLocked}, or b) if the activity has set
+ * {@link #mInheritShownWhenLocked} and the activity behind this satisfies the
+ * conditions a) above.
* Multi-windowing mode will be exited if true is returned.
*/
boolean canShowWhenLocked() {
- return !inPinnedWindowingMode() && (mShowWhenLocked
- || mAtmService.mWindowManager.containsShowWhenLockedWindow(appToken));
+ if (!inPinnedWindowingMode() && (mShowWhenLocked
+ || (mAppWindowToken != null && mAppWindowToken.containsShowWhenLockedWindow()))) {
+ return true;
+ } else if (mInheritShownWhenLocked) {
+ ActivityRecord r = getActivityBelow();
+ return r != null && !r.inPinnedWindowingMode() && (r.mShowWhenLocked
+ || (r.mAppWindowToken != null
+ && r.mAppWindowToken.containsShowWhenLockedWindow()));
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @return an {@link ActivityRecord} of the activity below this activity, or {@code null} if no
+ * such activity exists.
+ */
+ @Nullable
+ private ActivityRecord getActivityBelow() {
+ final int pos = task.mActivities.indexOf(this);
+ if (pos == -1) {
+ throw new IllegalStateException("Activity not found in its task");
+ }
+ return pos == 0 ? null : task.getChildAt(pos - 1);
}
void setTurnScreenOn(boolean turnScreenOn) {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 4645f7551d0e..0579fe333c37 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -114,6 +114,7 @@ import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
import android.app.AppGlobals;
import android.app.IActivityController;
+import android.app.RemoteAction;
import android.app.ResultInfo;
import android.app.WindowConfiguration.ActivityType;
import android.app.WindowConfiguration.WindowingMode;
@@ -176,8 +177,7 @@ import java.util.Set;
/**
* State and management of a single stack of activities.
*/
-public class ActivityStack<T extends StackWindowController> extends ConfigurationContainer
- implements StackWindowListener {
+public class ActivityStack extends ConfigurationContainer {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM;
private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE;
private static final String TAG_APP = TAG + POSTFIX_APP;
@@ -300,8 +300,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
final ActivityTaskManagerService mService;
- private final WindowManagerService mWindowManager;
- T mWindowContainerController;
+ final WindowManagerService mWindowManager;
public BoostFramework mPerf = null;
/**
@@ -362,6 +361,11 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
*/
boolean mForceHidden = false;
+ /**
+ * Used to keep resumeTopActivityUncheckedLocked() from being entered recursively
+ */
+ boolean mInResumeTopActivity = false;
+
private boolean mUpdateBoundsDeferred;
private boolean mUpdateBoundsDeferredCalled;
private boolean mUpdateDisplayedBoundsDeferredCalled;
@@ -401,6 +405,9 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
static final int DESTROY_ACTIVITIES_MSG = FIRST_ACTIVITY_STACK_MSG + 5;
static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 6;
+ // TODO: remove after unification.
+ TaskStack mTaskStack;
+
private static class ScheduleDestroyArgs {
final WindowProcessController mOwner;
final String mReason;
@@ -500,21 +507,30 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
// stacks on a wrong display.
mDisplayId = display.mDisplayId;
setActivityType(activityType);
- mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
- mTmpRect2);
+ createTaskStack(display.mDisplayId, onTop, mTmpRect2);
setWindowingMode(windowingMode, false /* animate */, false /* showRecents */,
false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */,
true /* creating */);
display.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM);
}
- T createStackWindowController(int displayId, boolean onTop, Rect outBounds) {
- return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds,
- mRootActivityContainer.mWindowManager);
+ void createTaskStack(int displayId, boolean onTop, Rect outBounds) {
+ final DisplayContent dc = mWindowManager.mRoot.getDisplayContent(displayId);
+ if (dc == null) {
+ throw new IllegalArgumentException("Trying to add stackId=" + mStackId
+ + " to unknown displayId=" + displayId);
+ }
+ mTaskStack = new TaskStack(mWindowManager, mStackId, this);
+ dc.setStackOnDisplay(mStackId, onTop, mTaskStack);
+ if (mTaskStack.matchParentBounds()) {
+ outBounds.setEmpty();
+ } else {
+ mTaskStack.getRawBounds(outBounds);
+ }
}
- T getWindowContainerController() {
- return mWindowContainerController;
+ TaskStack getTaskStack() {
+ return mTaskStack;
}
/**
@@ -558,6 +574,9 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
if (display == null) {
return;
}
+ if (getTaskStack() == null) {
+ return;
+ }
// Update bounds if applicable
boolean hasNewOverrideBounds = false;
@@ -565,8 +584,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
if (getRequestedOverrideWindowingMode() == WINDOWING_MODE_PINNED) {
// Pinned calculation already includes rotation
mTmpRect2.set(mTmpRect);
- hasNewOverrideBounds = getWindowContainerController().mContainer
- .calculatePinnedBoundsForConfigChange(mTmpRect2);
+ hasNewOverrideBounds = getTaskStack().calculatePinnedBoundsForConfigChange(mTmpRect2);
} else {
final int newRotation = getWindowConfiguration().getRotation();
if (!matchParentBounds()) {
@@ -593,7 +611,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
|| getRequestedOverrideWindowingMode()
== WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) {
mTmpRect2.set(mTmpRect);
- getWindowContainerController().mContainer
+ getTaskStack()
.calculateDockedBoundsForConfigChange(newParentConfig, mTmpRect2);
hasNewOverrideBounds = true;
}
@@ -791,7 +809,11 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
mTmpRect2.setEmpty();
if (windowingMode != WINDOWING_MODE_FULLSCREEN) {
- mWindowContainerController.getRawBounds(mTmpRect2);
+ if (mTaskStack.matchParentBounds()) {
+ mTmpRect2.setEmpty();
+ } else {
+ mTaskStack.getRawBounds(mTmpRect2);
+ }
}
if (!Objects.equals(getRequestedOverrideBounds(), mTmpRect2)) {
@@ -848,7 +870,12 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
// Reparent the window container before we try to update the position when adding it to
// the new display below
mTmpRect2.setEmpty();
- mWindowContainerController.reparent(activityDisplay.mDisplayId, mTmpRect2, onTop);
+ if (mTaskStack == null) {
+ // TODO: Remove after unification.
+ Log.w(TAG, "Task stack is not valid when reparenting.");
+ } else {
+ mTaskStack.reparent(activityDisplay.mDisplayId, mTmpRect2, onTop);
+ }
setBounds(mTmpRect2.isEmpty() ? null : mTmpRect2);
activityDisplay.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM);
if (!displayRemoved) {
@@ -881,8 +908,10 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
/** Removes the stack completely. Also calls WindowManager to do the same on its side. */
void remove() {
removeFromDisplay();
- mWindowContainerController.removeContainer();
- mWindowContainerController = null;
+ if (mTaskStack != null) {
+ mTaskStack.removeIfPossible();
+ mTaskStack = null;
+ }
onParentChanged();
}
@@ -895,26 +924,35 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
*/
void getStackDockedModeBounds(Rect dockedBounds, Rect currentTempTaskBounds,
Rect outStackBounds, Rect outTempTaskBounds) {
- mWindowContainerController.getStackDockedModeBounds(getParent().getConfiguration(),
- dockedBounds, currentTempTaskBounds,
- outStackBounds, outTempTaskBounds);
+ if (mTaskStack != null) {
+ mTaskStack.getStackDockedModeBoundsLocked(getParent().getConfiguration(), dockedBounds,
+ currentTempTaskBounds, outStackBounds, outTempTaskBounds);
+ } else {
+ outStackBounds.setEmpty();
+ outTempTaskBounds.setEmpty();
+ }
}
void prepareFreezingTaskBounds() {
- mWindowContainerController.prepareFreezingTaskBounds();
+ if (mTaskStack != null) {
+ // TODO: This cannot be false after unification.
+ mTaskStack.prepareFreezingTaskBounds();
+ }
}
void getWindowContainerBounds(Rect outBounds) {
- if (mWindowContainerController != null) {
- mWindowContainerController.getBounds(outBounds);
+ if (mTaskStack != null) {
+ mTaskStack.getBounds(outBounds);
return;
}
outBounds.setEmpty();
}
void positionChildWindowContainerAtTop(TaskRecord child) {
- mWindowContainerController.positionChildAtTop(child.getTask(),
- true /* includingParents */);
+ if (mTaskStack != null) {
+ // TODO: Remove after unification. This cannot be false after that.
+ mTaskStack.positionChildAtTop(child.getTask(), true /* includingParents */);
+ }
}
void positionChildWindowContainerAtBottom(TaskRecord child) {
@@ -923,14 +961,27 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
// task to bottom, the next focusable stack on the same display should be focused.
final ActivityStack nextFocusableStack = getDisplay().getNextFocusableStack(
child.getStack(), true /* ignoreCurrent */);
- mWindowContainerController.positionChildAtBottom(child.getTask(),
- nextFocusableStack == null /* includingParents */);
+ if (mTaskStack != null) {
+ // TODO: Remove after unification. This cannot be false after that.
+ mTaskStack.positionChildAtBottom(child.getTask(),
+ nextFocusableStack == null /* includingParents */);
+ }
}
/**
* Returns whether to defer the scheduling of the multi-window mode.
*/
boolean deferScheduleMultiWindowModeChanged() {
+ if (inPinnedWindowingMode()) {
+ // For the pinned stack, the deferring of the multi-window mode changed is tied to the
+ // transition animation into picture-in-picture, and is called once the animation
+ // completes, or is interrupted in a way that would leave the stack in a non-fullscreen
+ // state.
+ // @see BoundsAnimationController
+ // @see BoundsAnimationControllerTests
+ if (getTaskStack() == null) return false;
+ return getTaskStack().deferScheduleMultiWindowModeChanged();
+ }
return false;
}
@@ -1696,6 +1747,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
"Activity paused: token=" + token + ", timeout=" + timeout);
final ActivityRecord r = isInStackLocked(token);
+
if (r != null) {
mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
if (mPausingActivity == r) {
@@ -2052,8 +2104,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
boolean aboveTop = top != null;
final boolean stackShouldBeVisible = shouldBeVisible(starting);
boolean behindFullscreenActivity = !stackShouldBeVisible;
- boolean resumeNextActivity = mRootActivityContainer.isTopDisplayFocusedStack(this)
- && (isInStackLocked(starting) == null);
+ boolean resumeNextActivity = isFocusable() && isInStackLocked(starting) == null;
final boolean isTopNotPinnedStack =
isAttached() && getDisplay().isTopNotPinnedStack(this);
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
@@ -2114,6 +2165,10 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
if (r.handleAlreadyVisible()) {
resumeNextActivity = false;
}
+
+ if (notifyClients) {
+ r.makeActiveIfNeeded(starting);
+ }
} else {
r.makeVisibleIfNeeded(starting, notifyClients);
}
@@ -2214,7 +2269,8 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
.isKeyguardOrAodShowing(displayId);
final boolean keyguardLocked = mStackSupervisor.getKeyguardController().isKeyguardLocked();
final boolean showWhenLocked = r.canShowWhenLocked();
- final boolean dismissKeyguard = r.hasDismissKeyguardWindows();
+ final boolean dismissKeyguard = r.mAppWindowToken != null
+ && r.mAppWindowToken.containsDismissKeyguardWindow();
if (shouldBeVisible) {
if (dismissKeyguard && mTopDismissingKeyguardActivity == null) {
mTopDismissingKeyguardActivity = r;
@@ -2290,7 +2346,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
r.setVisible(true);
}
if (r != starting) {
- mStackSupervisor.startSpecificActivityLocked(r, andResume, false);
+ mStackSupervisor.startSpecificActivityLocked(r, andResume, true /* checkConfig */);
return true;
}
}
@@ -2468,7 +2524,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
*/
@GuardedBy("mService")
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
- if (mStackSupervisor.inResumeTopActivity) {
+ if (mInResumeTopActivity) {
// Don't even start recursing.
return false;
}
@@ -2476,7 +2532,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
boolean result = false;
try {
// Protect against recursion.
- mStackSupervisor.inResumeTopActivity = true;
+ mInResumeTopActivity = true;
result = resumeTopActivityInnerLocked(prev, options);
// When resuming the top activity, it may be necessary to pause the top activity (for
@@ -2491,7 +2547,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
checkReadyForSleep();
}
} finally {
- mStackSupervisor.inResumeTopActivity = false;
+ mInResumeTopActivity = false;
}
return result;
@@ -2524,7 +2580,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
// Find the next top-most activity to resume in this stack that is not finishing and is
// focusable. If it is not focusable, we will fall into the case below to resume the
// top activity in the next focusable task.
- final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
+ ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
final boolean hasRunningActivity = next != null;
@@ -2571,7 +2627,9 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
final boolean canShowWhenLocked = !mTopActivityOccludesKeyguard
&& next.canShowWhenLocked();
final boolean mayDismissKeyguard = mTopDismissingKeyguardActivity != next
- && next.hasDismissKeyguardWindows();
+ && next.mAppWindowToken != null
+ && next.mAppWindowToken.containsDismissKeyguardWindow();
+
if (canShowWhenLocked || mayDismissKeyguard) {
ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */,
!PRESERVE_WINDOWS);
@@ -2616,6 +2674,12 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
if (!mRootActivityContainer.allPausedActivitiesComplete()) {
if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,
"resumeTopActivityLocked: Skip resume: some activity pausing.");
+
+ // Adding previous activity to the waiting visible list, or it would be stopped
+ // before top activity being visible.
+ if (prev != null && !next.nowVisible) {
+ mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(prev);
+ }
return false;
}
@@ -2842,7 +2906,9 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
// the screen based on the new activity order.
boolean notUpdated = true;
- if (isFocusedStackOnDisplay()) {
+ // Activity should also be visible if set mLaunchTaskBehind to true (see
+ // ActivityRecord#shouldBeVisibleIgnoringKeyguard()).
+ if (shouldBeVisible(next)) {
// We have special rotation behavior when here is some active activity that
// requests specific orientation or Keyguard is locked. Make sure all activity
// visibilities are set correctly as well as the transition is updated if needed
@@ -3024,7 +3090,10 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
position = getAdjustedPositionForTask(task, position, null /* starting */);
mTaskHistory.remove(task);
mTaskHistory.add(position, task);
- mWindowContainerController.positionChildAt(task.getTask(), position);
+ if (mTaskStack != null) {
+ // TODO: this could not be false after unification.
+ mTaskStack.positionChildAt(task.getTask(), position);
+ }
updateTaskMovement(task, true);
}
@@ -4076,6 +4145,12 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
mStackSupervisor.mFinishingActivities.add(r);
r.resumeKeyDispatchingLocked();
mRootActivityContainer.resumeFocusedStacksTopActivities();
+ // If activity was not paused at this point - explicitly pause it to start finishing
+ // process. Finishing will be completed once it reports pause back.
+ if (r.isState(RESUMED) && mPausingActivity != null) {
+ startPausingLocked(false /* userLeaving */, false /* uiSleeping */, next /* resuming */,
+ false /* dontWait */);
+ }
return r;
}
@@ -4947,8 +5022,7 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
}
// TODO: Figure-out a way to consolidate with resize() method below.
- @Override
- public void requestResize(Rect bounds) {
+ void requestResize(Rect bounds) {
mService.resizeStack(mStackId, bounds,
true /* allowResizeInDockedMode */, false /* preserveWindows */,
false /* animate */, -1 /* animationDuration */);
@@ -4986,7 +5060,8 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
}
void onPipAnimationEndResize() {
- mWindowContainerController.onPipAnimationEndResize();
+ if (mTaskStack == null) return;
+ mTaskStack.onPipAnimationEndResize();
}
@@ -5532,6 +5607,65 @@ public class ActivityStack<T extends StackWindowController> extends Configuratio
}
}
+
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
+ if (getTaskStack() == null) return null;
+ return getTaskStack().getPictureInPictureBounds(aspectRatio, null /* currentStackBounds */);
+ }
+
+ void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
+ boolean fromFullscreen) {
+ if (!inPinnedWindowingMode()) return;
+ if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
+ mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
+ } else {
+ if (getTaskStack() == null) return;
+ getTaskStack().animateResizePinnedStack(toBounds, sourceHintBounds,
+ animationDuration, fromFullscreen);
+ }
+ }
+
+ private boolean skipResizeAnimation(boolean toFullscreen) {
+ if (!toFullscreen) {
+ return false;
+ }
+ final Configuration parentConfig = getParent().getConfiguration();
+ final ActivityRecord top = topRunningNonOverlayTaskActivity();
+ return top != null && !top.isConfigurationCompatible(parentConfig);
+ }
+
+ void setPictureInPictureAspectRatio(float aspectRatio) {
+ if (getTaskStack() == null) return;
+ getTaskStack().setPictureInPictureAspectRatio(aspectRatio);
+ }
+
+ void setPictureInPictureActions(List<RemoteAction> actions) {
+ if (getTaskStack() == null) return;
+ getTaskStack().setPictureInPictureActions(actions);
+ }
+
+ boolean isAnimatingBoundsToFullscreen() {
+ if (getTaskStack() == null) return false;
+ return getTaskStack().isAnimatingBoundsToFullscreen();
+ }
+
+ public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds,
+ boolean forceUpdate) {
+ // It is guaranteed that the activities requiring the update will be in the pinned stack at
+ // this point (either reparented before the animation into PiP, or before reparenting after
+ // the animation out of PiP)
+ synchronized (mService.mGlobalLock) {
+ if (!isAttached()) {
+ return;
+ }
+ ArrayList<TaskRecord> tasks = getAllTasks();
+ for (int i = 0; i < tasks.size(); i++) {
+ mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds,
+ forceUpdate);
+ }
+ }
+ }
+
public int getStackId() {
return mStackId;
}
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 108ea6e8aa1a..27def0c2beca 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -335,9 +335,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
*/
PowerManager.WakeLock mGoingToSleep;
- /** Used to keep resumeTopActivityUncheckedLocked() from being entered recursively */
- boolean inResumeTopActivity;
-
/**
* Temporary rect used during docked stack resize calculation so we don't need to create a new
* object each time.
@@ -955,6 +952,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
final WindowProcessController wpc =
mService.getProcessController(r.processName, r.info.applicationInfo.uid);
+ boolean knownToBeDead = false;
if (wpc != null && wpc.hasThread()) {
try {
if ((r.info.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0
@@ -973,6 +971,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// If a dead object exception was thrown -- fall through to
// restart the application.
+ knownToBeDead = true;
}
// Suppress transition until the new activity becomes ready, otherwise the keyguard can
@@ -986,7 +985,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// ATMS lock held.
final Message msg = PooledLambda.obtainMessage(
ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,
- r.info.applicationInfo, true, "activity", r.intent.getComponent());
+ r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());
mService.mH.sendMessage(msg);
}
@@ -1690,8 +1689,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
}
void resizePinnedStackLocked(Rect pinnedBounds, Rect tempPinnedTaskBounds) {
- // TODO(multi-display): Pinned stack display should be passed in.
- final PinnedActivityStack stack =
+ // TODO(multi-display): The display containing the stack should be passed in.
+ final ActivityStack stack =
mRootActivityContainer.getDefaultDisplay().getPinnedStack();
if (stack == null) {
Slog.w(TAG, "resizePinnedStackLocked: pinned stack not found");
@@ -1702,7 +1701,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// another AM call that is holding the AMS lock. In such a case, the pinnedBounds may be
// incorrect if AMS.resizeStackWithBoundsFromWindowManager() is already called while waiting
// for the AMS lock to be freed. So check and make sure these bounds are still good.
- final PinnedStackWindowController stackController = stack.getWindowContainerController();
+ final TaskStack stackController = stack.getTaskStack();
if (stackController.pinnedStackResizeDisallowed()) {
return;
}
@@ -1746,15 +1745,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
* invisible as well and added to the stopping list. After which we process the
* stopping list by handling the idle.
*/
- final PinnedActivityStack pinnedStack = (PinnedActivityStack) stack;
- pinnedStack.mForceHidden = true;
- pinnedStack.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
- pinnedStack.mForceHidden = false;
+ stack.mForceHidden = true;
+ stack.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
+ stack.mForceHidden = false;
activityIdleInternalLocked(null, false /* fromTimeout */,
true /* processPausingActivites */, null /* configuration */);
// Move all the tasks to the bottom of the fullscreen stack
- moveTasksToFullscreenStackLocked(pinnedStack, !ON_TOP);
+ moveTasksToFullscreenStackLocked(stack, !ON_TOP);
} else {
for (int i = tasks.size() - 1; i >= 0; i--) {
removeTaskByIdLocked(tasks.get(i).taskId, true /* killProcess */,
@@ -2682,6 +2680,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
try {
mService.moveTaskToFrontLocked(task.taskId, 0, options,
true /* fromRecents */);
+ // Apply options to prevent pendingOptions be taken by client to make sure
+ // the override pending app transition will be applied immediately.
+ targetActivity.applyOptionsLocked();
} finally {
mActivityMetricsLogger.notifyActivityLaunched(START_TASK_TO_FRONT,
targetActivity);
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 08596836ed4d..43c12064a3c1 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -179,7 +179,10 @@ public class ActivityStartController {
.setActivityOptions(options.toBundle())
.execute();
mLastHomeActivityStartRecord = tmpOutRecord[0];
- if (mSupervisor.inResumeTopActivity) {
+ final ActivityDisplay display =
+ mService.mRootActivityContainer.getActivityDisplay(displayId);
+ final ActivityStack homeStack = display != null ? display.getHomeStack() : null;
+ if (homeStack != null && homeStack.mInResumeTopActivity) {
// If we are in resume section already, home activity will be initialized, but not
// resumed (to avoid recursive resume) and will stay that way until something pokes it
// again. We need to schedule another resume.
@@ -297,6 +300,29 @@ public class ActivityStartController {
String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId,
boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
boolean allowBackgroundActivityStart) {
+ return startActivitiesInPackage(uid, 0 /* realCallingPid */, -1 /* realCallingUid */,
+ callingPackage, intents, resolvedTypes, resultTo, options, userId, validateIncomingUser,
+ originatingPendingIntent, allowBackgroundActivityStart);
+ }
+
+ /**
+ * Start intents as a package.
+ *
+ * @param uid Make a call as if this UID did.
+ * @param realCallingPid PID of the real caller.
+ * @param realCallingUid UID of the real caller.
+ * @param callingPackage Make a call as if this package did.
+ * @param intents Intents to start.
+ * @param userId Start the intents on this user.
+ * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID.
+ * @param originatingPendingIntent PendingIntentRecord that originated this activity start or
+ * null if not originated by PendingIntent
+ */
+ final int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
+ String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
+ SafeActivityOptions options, int userId, boolean validateIncomingUser,
+ PendingIntentRecord originatingPendingIntent,
+ boolean allowBackgroundActivityStart) {
final String reason = "startActivityInPackage";
@@ -304,12 +330,14 @@ public class ActivityStartController {
Binder.getCallingUid(), reason);
// TODO: Switch to user app stacks here.
- return startActivities(null, uid, callingPackage, intents, resolvedTypes, resultTo, options,
- userId, reason, originatingPendingIntent, allowBackgroundActivityStart);
+ return startActivities(null, uid, realCallingPid, realCallingUid, callingPackage, intents,
+ resolvedTypes, resultTo, options, userId, reason, originatingPendingIntent,
+ allowBackgroundActivityStart);
}
- int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
- Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options,
+ int startActivities(IApplicationThread caller, int callingUid, int incomingRealCallingPid,
+ int incomingRealCallingUid, String callingPackage, Intent[] intents,
+ String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options,
int userId, String reason, PendingIntentRecord originatingPendingIntent,
boolean allowBackgroundActivityStart) {
if (intents == null) {
@@ -322,8 +350,12 @@ public class ActivityStartController {
throw new IllegalArgumentException("intents are length different than resolvedTypes");
}
- final int realCallingPid = Binder.getCallingPid();
- final int realCallingUid = Binder.getCallingUid();
+ final int realCallingPid = incomingRealCallingPid != 0
+ ? incomingRealCallingPid
+ : Binder.getCallingPid();
+ final int realCallingUid = incomingRealCallingUid != -1
+ ? incomingRealCallingUid
+ : Binder.getCallingUid();
int callingPid;
if (callingUid >= 0) {
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 7f52da3ca16e..8cefc759d39a 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND;
import static android.app.Activity.RESULT_CANCELED;
import static android.app.ActivityManager.START_ABORTED;
import static android.app.ActivityManager.START_CANCELED;
@@ -50,6 +51,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -295,6 +297,8 @@ class ActivityStarter {
private static class Request {
private static final int DEFAULT_CALLING_UID = -1;
private static final int DEFAULT_CALLING_PID = 0;
+ static final int DEFAULT_REAL_CALLING_UID = -1;
+ static final int DEFAULT_REAL_CALLING_PID = 0;
IApplicationThread caller;
Intent intent;
@@ -307,11 +311,11 @@ class ActivityStarter {
IBinder resultTo;
String resultWho;
int requestCode;
- int callingPid = DEFAULT_CALLING_UID;
- int callingUid = DEFAULT_CALLING_PID;
+ int callingPid = DEFAULT_CALLING_PID;
+ int callingUid = DEFAULT_CALLING_UID;
String callingPackage;
- int realCallingPid;
- int realCallingUid;
+ int realCallingPid = DEFAULT_REAL_CALLING_PID;
+ int realCallingUid = DEFAULT_REAL_CALLING_UID;
int startFlags;
SafeActivityOptions activityOptions;
boolean ignoreTargetSecurity;
@@ -366,8 +370,8 @@ class ActivityStarter {
callingPid = DEFAULT_CALLING_PID;
callingUid = DEFAULT_CALLING_UID;
callingPackage = null;
- realCallingPid = 0;
- realCallingUid = 0;
+ realCallingPid = DEFAULT_REAL_CALLING_PID;
+ realCallingUid = DEFAULT_REAL_CALLING_UID;
startFlags = 0;
activityOptions = null;
ignoreTargetSecurity = false;
@@ -504,7 +508,8 @@ class ActivityStarter {
// for transactional diffs and preprocessing.
if (mRequest.mayWait) {
return startActivityMayWait(mRequest.caller, mRequest.callingUid,
- mRequest.callingPackage, mRequest.intent, mRequest.resolvedType,
+ mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid,
+ mRequest.intent, mRequest.resolvedType,
mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
@@ -749,8 +754,9 @@ class ActivityStarter {
// not sure if we need to create START_ABORTED_BACKGROUND so for now piggybacking
// on START_ABORTED
if (!abort) {
- abort |= shouldAbortBackgroundActivityStart(callingUid, callingPackage, realCallingUid,
- callerApp, originatingPendingIntent, allowBackgroundActivityStart);
+ abort |= shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage,
+ realCallingUid, callerApp, originatingPendingIntent,
+ allowBackgroundActivityStart, intent);
}
// Merge the two options bundles, while realCallerOptions takes precedence.
@@ -897,9 +903,10 @@ class ActivityStarter {
true /* doResume */, checkedOptions, inTask, outActivity);
}
- private boolean shouldAbortBackgroundActivityStart(int callingUid, final String callingPackage,
- int realCallingUid, WindowProcessController callerApp,
- PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) {
+ private boolean shouldAbortBackgroundActivityStart(int callingUid, int callingPid,
+ final String callingPackage, int realCallingUid, WindowProcessController callerApp,
+ PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart,
+ Intent intent) {
if (mService.isBackgroundActivityStartsEnabled()) {
return false;
}
@@ -912,19 +919,24 @@ class ActivityStarter {
return false;
}
// don't abort if the callingUid is in the foreground or is a persistent system process
- if (isUidForeground(callingUid) || isUidPersistentSystemProcess(callingUid)) {
+ final boolean isCallingUidForeground = isUidForeground(callingUid);
+ final boolean isCallingUidPersistentSystemProcess = isUidPersistentSystemProcess(
+ callingUid);
+ if (isCallingUidForeground || isCallingUidPersistentSystemProcess) {
return false;
}
// take realCallingUid into consideration
+ final boolean isRealCallingUidForeground = isUidForeground(realCallingUid);
+ final boolean isRealCallingUidPersistentSystemProcess = isUidPersistentSystemProcess(
+ realCallingUid);
if (realCallingUid != callingUid) {
// don't abort if the realCallingUid is in the foreground and callingUid isn't
- if (isUidForeground(realCallingUid)) {
+ if (isRealCallingUidForeground) {
return false;
}
// if the realCallingUid is a persistent system process, abort if the IntentSender
// wasn't whitelisted to start an activity
- if (isUidPersistentSystemProcess(realCallingUid) && (originatingPendingIntent != null)
- && allowBackgroundActivityStart) {
+ if (isRealCallingUidPersistentSystemProcess && allowBackgroundActivityStart) {
return false;
}
}
@@ -932,11 +944,28 @@ class ActivityStarter {
if (callerApp != null && callerApp.areBackgroundActivityStartsAllowed()) {
return false;
}
+ // don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission
+ if (mService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
+ == PERMISSION_GRANTED) {
+ return false;
+ }
// don't abort if the caller has the same uid as the recents component
if (mSupervisor.mRecentTasks.isCallerRecents(callingUid)) {
return false;
}
// anything that has fallen through will currently be aborted
+ Slog.w(TAG, "Blocking background activity start [callingPackage: " + callingPackage
+ + "; callingUid: " + callingUid
+ + "; isCallingUidForeground: " + isCallingUidForeground
+ + "; isCallingUidPersistentSystemProcess: " + isCallingUidPersistentSystemProcess
+ + "; realCallingUid: " + realCallingUid
+ + "; isRealCallingUidForeground: " + isRealCallingUidForeground
+ + "; isRealCallingUidPersistentSystemProcess: "
+ + isRealCallingUidPersistentSystemProcess
+ + "; originatingPendingIntent: " + originatingPendingIntent
+ + "; isBgStartWhitelisted: " + allowBackgroundActivityStart
+ + "; intent: " + intent
+ + "]");
// TODO: remove this toast after feature development is done
mService.mUiHandler.post(() -> {
Toast.makeText(mService.mContext,
@@ -949,7 +978,7 @@ class ActivityStarter {
/** Returns true if uid has a visible window or its process is in a top state. */
private boolean isUidForeground(int uid) {
return (mService.getUidStateLocked(uid) == ActivityManager.PROCESS_STATE_TOP)
- || mService.mWindowManager.isAnyWindowVisibleForUid(uid);
+ || mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid);
}
/** Returns true if uid is in a persistent state. */
@@ -972,18 +1001,19 @@ class ActivityStarter {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "logActivityStart");
final int callingUidProcState = mService.getUidStateLocked(callingUid);
final boolean callingUidHasAnyVisibleWindow =
- mService.mWindowManager.isAnyWindowVisibleForUid(callingUid);
+ mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(callingUid);
final int realCallingUidProcState = (callingUid == realCallingUid)
? callingUidProcState
: mService.getUidStateLocked(realCallingUid);
final boolean realCallingUidHasAnyVisibleWindow = (callingUid == realCallingUid)
? callingUidHasAnyVisibleWindow
- : mService.mWindowManager.isAnyWindowVisibleForUid(realCallingUid);
+ : mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(
+ realCallingUid);
final String targetPackage = (r != null) ? r.packageName : null;
final int targetUid = (r!= null) ? ((r.appInfo != null) ? r.appInfo.uid : -1) : -1;
final int targetUidProcState = mService.getUidStateLocked(targetUid);
final boolean targetUidHasAnyVisibleWindow = (targetUid != -1)
- ? mService.mWindowManager.isAnyWindowVisibleForUid(targetUid)
+ ? mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(targetUid)
: false;
final String targetWhitelistTag = (targetUid != -1)
? mService.getPendingTempWhitelistTagForUidLocked(targetUid)
@@ -1069,10 +1099,10 @@ class ActivityStarter {
}
private int startActivityMayWait(IApplicationThread caller, int callingUid,
- String callingPackage, Intent intent, String resolvedType,
- IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
- IBinder resultTo, String resultWho, int requestCode, int startFlags,
- ProfilerInfo profilerInfo, WaitResult outResult,
+ String callingPackage, int requestRealCallingPid, int requestRealCallingUid,
+ Intent intent, String resolvedType, IVoiceInteractionSession voiceSession,
+ IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, WaitResult outResult,
Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,
int userId, TaskRecord inTask, String reason,
boolean allowPendingRemoteAnimationRegistryLookup,
@@ -1084,8 +1114,12 @@ class ActivityStarter {
mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);
boolean componentSpecified = intent.getComponent() != null;
- final int realCallingPid = Binder.getCallingPid();
- final int realCallingUid = Binder.getCallingUid();
+ final int realCallingPid = requestRealCallingPid != Request.DEFAULT_REAL_CALLING_PID
+ ? requestRealCallingPid
+ : Binder.getCallingPid();
+ final int realCallingUid = requestRealCallingUid != Request.DEFAULT_REAL_CALLING_UID
+ ? requestRealCallingUid
+ : Binder.getCallingUid();
int callingPid;
if (callingUid >= 0) {
@@ -1605,7 +1639,7 @@ class ActivityStarter {
// Also, we don't want to resume activities in a task that currently has an overlay
// as the starting activity just needs to be in the visible paused state until the
// over is removed.
- mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ mTargetStack.ensureActivitiesVisibleLocked(mStartActivity, 0, !PRESERVE_WINDOWS);
// Go ahead and tell window manager to execute app transition for this activity
// since the app transition will not be triggered through the resume channel.
mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 0f286ce30ccd..67b00b2cfbf1 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -19,6 +19,7 @@ package com.android.server.wm;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.ActivityManager;
import android.app.AppProtoEnums;
import android.app.IActivityManager;
import android.app.IApplicationThread;
@@ -191,6 +192,8 @@ public abstract class ActivityTaskManagerInternal {
* Start intents as a package.
*
* @param uid Make a call as if this UID did.
+ * @param realCallingPid PID of the real caller.
+ * @param realCallingUid UID of the real caller.
* @param callingPackage Make a call as if this package did.
* @param intents Intents to start.
* @param userId Start the intents on this user.
@@ -200,9 +203,10 @@ public abstract class ActivityTaskManagerInternal {
* @param allowBackgroundActivityStart Whether the background activity start should be allowed
* from originatingPendingIntent
*/
- public abstract int startActivitiesInPackage(int uid, String callingPackage, Intent[] intents,
- String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId,
- boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
+ public abstract int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
+ String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
+ SafeActivityOptions options, int userId, boolean validateIncomingUser,
+ PendingIntentRecord originatingPendingIntent,
boolean allowBackgroundActivityStart);
public abstract int startActivityInPackage(int uid, int realCallingPid, int realCallingUid,
@@ -479,4 +483,10 @@ public abstract class ActivityTaskManagerInternal {
public abstract void setProfilerInfo(ProfilerInfo profilerInfo);
public abstract ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry();
+
+ /**
+ * Gets bitmap snapshot of the provided task id.
+ */
+ public abstract ActivityManager.TaskSnapshot getTaskSnapshot(int taskId,
+ boolean reducedResolution);
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 4d11ff2982b6..2e5fccb9a014 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -82,13 +82,10 @@ import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEA
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto
- .PREVIOUS_PROC_VISIBLE_TIME_MS;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage
- .MODE;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage
- .PACKAGE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE;
import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
@@ -210,6 +207,7 @@ import android.os.storage.StorageManager;
import android.provider.Settings;
import android.service.voice.IVoiceInteractionSession;
import android.service.voice.VoiceInteractionManagerInternal;
+import android.sysprop.DisplayProperties;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.text.format.Time;
@@ -245,7 +243,6 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -261,6 +258,7 @@ import com.android.server.am.EventLogTags;
import com.android.server.am.PendingIntentController;
import com.android.server.am.PendingIntentRecord;
import com.android.server.am.UserState;
+import com.android.server.appop.AppOpsService;
import com.android.server.firewall.IntentFirewall;
import com.android.server.pm.UserManagerService;
import com.android.server.uri.UriGrantsManagerInternal;
@@ -639,7 +637,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
- ActivityTaskManagerService(Context context) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public ActivityTaskManagerService(Context context) {
mContext = context;
mFactoryTest = FactoryTest.getMode();
mSystemThread = ActivityThread.currentActivityThread();
@@ -693,7 +692,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final boolean isPc = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
// Transfer any global setting for forcing RTL layout, into a System Property
- SystemProperties.set(DEVELOPMENT_FORCE_RTL, forceRtl ? "1":"0");
+ DisplayProperties.debug_force_rtl(forceRtl);
final Configuration configuration = new Configuration();
Settings.System.getConfiguration(resolver, configuration);
@@ -958,9 +957,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
enforceNotIsolatedCaller(reason);
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
// TODO: Switch to user app stacks here.
- return getActivityStartController().startActivities(caller, -1, callingPackage, intents,
- resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId, reason,
- null /* originatingPendingIntent */, false /* allowBackgroundActivityStart */);
+ return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage,
+ intents, resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId,
+ reason, null /* originatingPendingIntent */,
+ false /* allowBackgroundActivityStart */);
}
@Override
@@ -2406,7 +2406,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
try {
synchronized (mGlobalLock) {
if (animate) {
- final PinnedActivityStack stack = mRootActivityContainer.getStack(stackId);
+ final ActivityStack stack = mRootActivityContainer.getStack(stackId);
if (stack == null) {
Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
return;
@@ -3711,7 +3711,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- final PinnedActivityStack stack =
+ final ActivityStack stack =
mRootActivityContainer.getDefaultDisplay().getPinnedStack();
if (stack == null) {
Slog.w(TAG, "dismissPip: pinned stack not found.");
@@ -3833,9 +3833,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// If we are animating to fullscreen then we have already dispatched the PIP mode
// changed, so we should reflect that check here as well.
- final PinnedActivityStack stack = r.getActivityStack();
- final PinnedStackWindowController windowController = stack.getWindowContainerController();
- return !windowController.mContainer.isAnimatingBoundsToFullscreen();
+ final TaskStack taskStack = r.getActivityStack().getTaskStack();
+ return !taskStack.isAnimatingBoundsToFullscreen();
}
@Override
@@ -3869,7 +3868,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
r.pictureInPictureArgs.getSourceRectHint());
mRootActivityContainer.moveActivityToPinnedStack(
r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
- final PinnedActivityStack stack = r.getActivityStack();
+ final ActivityStack stack = r.getActivityStack();
stack.setPictureInPictureAspectRatio(aspectRatio);
stack.setPictureInPictureActions(actions);
MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid,
@@ -3913,7 +3912,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// If the activity is already in picture-in-picture, update the pinned stack now
// if it is not already expanding to fullscreen. Otherwise, the arguments will
// be used the next time the activity enters PiP
- final PinnedActivityStack stack = r.getActivityStack();
+ final ActivityStack stack = r.getActivityStack();
if (!stack.isAnimatingBoundsToFullscreen()) {
stack.setPictureInPictureAspectRatio(
r.pictureInPictureArgs.getAspectRatio());
@@ -4333,6 +4332,22 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
@Override
+ public void setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setInheritShowWhenLocked(inheritShowWhenLocked);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
public void setTurnScreenOn(IBinder token, boolean turnScreenOn) {
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.isInStackLocked(token);
@@ -5813,14 +5828,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
@Override
- public int startActivitiesInPackage(int uid, String callingPackage, Intent[] intents,
- String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId,
- boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
+ public int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
+ String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
+ SafeActivityOptions options, int userId, boolean validateIncomingUser,
+ PendingIntentRecord originatingPendingIntent,
boolean allowBackgroundActivityStart) {
synchronized (mGlobalLock) {
- return getActivityStartController().startActivitiesInPackage(uid, callingPackage,
- intents, resolvedTypes, resultTo, options, userId, validateIncomingUser,
- originatingPendingIntent, allowBackgroundActivityStart);
+ return getActivityStartController().startActivitiesInPackage(uid, realCallingPid,
+ realCallingUid, callingPackage, intents, resolvedTypes, resultTo, options,
+ userId, validateIncomingUser, originatingPendingIntent,
+ allowBackgroundActivityStart);
}
}
@@ -7011,5 +7028,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
return mStackSupervisor.getActivityMetricsLogger().getLaunchObserverRegistry();
}
}
+
+ @Override
+ public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
+ synchronized (mGlobalLock) {
+ return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution);
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 089640b32dd3..5f393ef59057 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -65,6 +65,8 @@ import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpe
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
+import static com.android.server.wm.AppTransitionProto.APP_TRANSITION_STATE;
+import static com.android.server.wm.AppTransitionProto.LAST_USED_APP_TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -73,8 +75,6 @@ import static com.android.server.wm.WindowManagerInternal.AppTransitionListener;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
-import static com.android.server.wm.AppTransitionProto.APP_TRANSITION_STATE;
-import static com.android.server.wm.AppTransitionProto.LAST_USED_APP_TRANSITION;
import android.annotation.DrawableRes;
import android.annotation.NonNull;
@@ -84,6 +84,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.ResourceId;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -547,7 +548,7 @@ public class AppTransition implements Dump {
}
Animation loadAnimationAttr(LayoutParams lp, int animAttr, int transit) {
- int resId = ResourceId.ID_NULL;
+ int resId = Resources.ID_NULL;
Context context = mContext;
if (animAttr >= 0) {
AttributeCache.Entry ent = getCachedAnimations(lp);
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index a5341ca11784..780eda49faf4 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -82,6 +82,7 @@ import static com.android.server.wm.WindowManagerService.logWithStack;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import android.annotation.CallSuper;
+import android.annotation.Size;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
@@ -113,11 +114,14 @@ import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ToBooleanFunction;
import com.android.server.AttributeCache;
+import com.android.server.LocalServices;
+import com.android.server.display.ColorDisplayService;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.policy.WindowManagerPolicy.StartingSurface;
import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.function.Consumer;
@@ -289,6 +293,20 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
private static final int STARTING_WINDOW_TYPE_SNAPSHOT = 1;
private static final int STARTING_WINDOW_TYPE_SPLASH_SCREEN = 2;
+ private AppSaturationInfo mLastAppSaturationInfo;
+
+ private final ColorDisplayService.ColorTransformController mColorTransformController =
+ (matrix, translation) -> mWmService.mH.post(() -> {
+ synchronized (mWmService.mGlobalLock) {
+ if (mLastAppSaturationInfo == null) {
+ mLastAppSaturationInfo = new AppSaturationInfo();
+ }
+
+ mLastAppSaturationInfo.setSaturation(matrix, translation);
+ updateColorTransform();
+ }
+ });
+
AppWindowToken(WindowManagerService service, IApplicationToken token,
ComponentName activityComponent, boolean voiceInteraction, DisplayContent dc,
long inputDispatchingTimeoutNanos, boolean fullscreen, boolean showForAllUsers,
@@ -311,6 +329,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// Application tokens start out hidden.
setHidden(true);
hiddenRequested = true;
+
+ ColorDisplayService.ColorDisplayServiceInternal cds = LocalServices.getService(
+ ColorDisplayService.ColorDisplayServiceInternal.class);
+ cds.attachColorTransformController(activityRecord.packageName, activityRecord.mUserId,
+ new WeakReference<>(mColorTransformController));
}
AppWindowToken(WindowManagerService service, IApplicationToken token,
@@ -968,6 +991,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
: null;
mLastParent = task;
+
+ updateColorTransform();
}
void postWindowRemoveStartingWindowCleanup(WindowState win) {
@@ -1714,7 +1739,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (mLetterbox == null) {
mLetterbox = new Letterbox(() -> makeChildSurface(null));
}
- mLetterbox.layout(getParent().getBounds(), w.getFrameLw());
+ getPosition(mTmpPoint);
+ mLetterbox.layout(getParent().getBounds(), w.getFrameLw(), mTmpPoint);
} else if (mLetterbox != null) {
mLetterbox.hide();
}
@@ -2355,7 +2381,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
public void onAnimationLeashDestroyed(Transaction t) {
super.onAnimationLeashDestroyed(t);
if (mAnimationBoundsLayer != null) {
- t.destroy(mAnimationBoundsLayer);
+ t.reparent(mAnimationBoundsLayer, null);
mAnimationBoundsLayer = null;
}
@@ -2815,4 +2841,22 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
mDisplayContent.mClosingApps.remove(this);
}
}
+
+ private void updateColorTransform() {
+ if (mSurfaceControl != null && mLastAppSaturationInfo != null) {
+ mPendingTransaction.setColorTransform(mSurfaceControl, mLastAppSaturationInfo.mMatrix,
+ mLastAppSaturationInfo.mTranslation);
+ mWmService.scheduleAnimationLocked();
+ }
+ }
+
+ private static class AppSaturationInfo {
+ float[] mMatrix = new float[9];
+ float[] mTranslation = new float[3];
+
+ void setSaturation(@Size(9) float[] matrix, @Size(3) float[] translation) {
+ System.arraycopy(matrix, 0, mMatrix, 0, mMatrix.length);
+ System.arraycopy(translation, 0, mTranslation, 0, mTranslation.length);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index ded45c9e3079..650d0be76dc5 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -37,6 +37,7 @@ import static com.android.server.wm.ConfigurationContainerProto.OVERRIDE_CONFIGU
import android.annotation.CallSuper;
import android.app.WindowConfiguration;
import android.content.res.Configuration;
+import android.graphics.Point;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
@@ -243,6 +244,14 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
}
/**
+ * Sets {@code out} to the top-left corner of the bounds as returned by {@link #getBounds()}.
+ */
+ public void getPosition(Point out) {
+ Rect bounds = getBounds();
+ out.set(bounds.left, bounds.top);
+ }
+
+ /**
* Returns the bounds requested on this container. These may not be the actual bounds the
* container ends up with due to policy constraints. The {@link Rect} handed back is
* shared for all calls to this method and should not be modified.
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index aea071f94ba2..c39060ee1922 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -129,7 +129,7 @@ class Dimmer {
final DimAnimatable dimAnimatable = new DimAnimatable(dimLayer);
mSurfaceAnimator = new SurfaceAnimator(dimAnimatable, () -> {
if (!mDimming) {
- dimAnimatable.getPendingTransaction().destroy(mDimLayer);
+ dimAnimatable.getPendingTransaction().reparent(mDimLayer, null);
}
}, mHost.mWmService);
}
@@ -300,7 +300,7 @@ class Dimmer {
if (!mDimState.mDimming) {
if (!mDimState.mAnimateExit) {
- t.destroy(mDimState.mDimLayer);
+ t.reparent(mDimState.mDimLayer, null);
} else {
startDimExit(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t);
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index fecc8da3d645..6527ca0e751d 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -328,14 +328,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
private int mLastOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
/**
- * Flag indicating that the application is receiving an orientation that has different metrics
- * than it expected. E.g. Portrait instead of Landscape.
- *
- * @see #updateRotationUnchecked()
- */
- private boolean mAltOrientation = false;
-
- /**
* Orientation forced by some window. If there is no visible window that specifies orientation
* it is set to {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED}.
*
@@ -1085,10 +1077,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return mLastOrientation;
}
- boolean getAltOrientation() {
- return mAltOrientation;
- }
-
int getLastWindowForcedOrientation() {
return mLastWindowForcedOrientation;
}
@@ -1130,15 +1118,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
boolean rotationNeedsUpdate() {
final int lastOrientation = getLastOrientation();
final int oldRotation = getRotation();
- final boolean oldAltOrientation = getAltOrientation();
final int rotation = mDisplayRotation.rotationForOrientation(lastOrientation, oldRotation);
- final boolean altOrientation = !mDisplayRotation.rotationHasCompatibleMetrics(
- lastOrientation, rotation);
- if (oldRotation == rotation && oldAltOrientation == altOrientation) {
- return false;
- }
- return true;
+ return oldRotation != rotation;
}
/**
@@ -1160,12 +1142,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
@Override
boolean onDescendantOrientationChanged(IBinder freezeDisplayToken,
ConfigurationContainer requestingContainer) {
+ final int previousRotation = mRotation;
final Configuration config = updateOrientationFromAppTokens(
getRequestedOverrideConfiguration(), freezeDisplayToken, false);
- // If display rotation class tells us that it doesn't consider app requested orientation,
- // this display won't rotate just because of an app changes its requested orientation. Thus
- // it indicates that this display chooses not to handle this request.
- final boolean handled = getDisplayRotation().respectAppRequestedOrientation();
+ // This event is considered handled iff a configuration propagation is triggered, because
+ // that's the only place lower level containers check if they need to do something to this
+ // request. The only guaranteed signal is that the display is rotated to a different
+ // orientation (i.e. rotating 180 degrees doesn't count).
+ final boolean handled = (mRotation - previousRotation) % 2 != 0;
if (config == null) {
return handled;
}
@@ -1334,7 +1318,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
final int oldRotation = mRotation;
final int lastOrientation = mLastOrientation;
- final boolean oldAltOrientation = mAltOrientation;
final int rotation = mDisplayRotation.rotationForOrientation(lastOrientation, oldRotation);
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Computed rotation=" + rotation + " for display id="
+ mDisplayId + " based on lastOrientation=" + lastOrientation
@@ -1366,35 +1349,26 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
final boolean rotateSeamlessly = mayRotateSeamlessly;
- // TODO: Implement forced rotation changes.
- // Set mAltOrientation to indicate that the application is receiving
- // an orientation that has different metrics than it expected.
- // eg. Portrait instead of Landscape.
-
- final boolean altOrientation = !mDisplayRotation.rotationHasCompatibleMetrics(
- lastOrientation, rotation);
-
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ " selected orientation " + lastOrientation
+ ", got rotation " + rotation + " which has "
- + (altOrientation ? "incompatible" : "compatible") + " metrics");
+ + " metrics");
- if (oldRotation == rotation && oldAltOrientation == altOrientation) {
+ if (oldRotation == rotation) {
// No change.
return false;
}
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ " rotation changed to " + rotation
- + (altOrientation ? " (alt)" : "") + " from " + oldRotation
- + (oldAltOrientation ? " (alt)" : "") + ", lastOrientation=" + lastOrientation);
+ + " from " + oldRotation
+ + ", lastOrientation=" + lastOrientation);
if (DisplayContent.deltaRotation(rotation, oldRotation) != 2) {
mWaitingForConfig = true;
}
mRotation = rotation;
- mAltOrientation = altOrientation;
mWmService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_ACTIVE;
mWmService.mH.sendNewMessageDelayed(WindowManagerService.H.WINDOW_FREEZE_TIMEOUT,
@@ -1536,26 +1510,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
private DisplayInfo updateDisplayAndOrientation(int uiMode) {
// Use the effective "visual" dimensions based on current rotation
final boolean rotated = (mRotation == ROTATION_90 || mRotation == ROTATION_270);
- final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
- final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
- int dw = realdw;
- int dh = realdh;
-
- if (mAltOrientation) {
- if (realdw > realdh) {
- // Turn landscape into portrait.
- int maxw = (int)(realdh/1.3f);
- if (maxw < realdw) {
- dw = maxw;
- }
- } else {
- // Turn portrait into landscape.
- int maxh = (int)(realdw/1.3f);
- if (maxh < realdh) {
- dh = maxh;
- }
- }
- }
+ final int dw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
+ final int dh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
// Update application display metrics.
final WmDisplayCutout wmDisplayCutout = calculateDisplayCutoutForRotation(mRotation);
@@ -2307,13 +2263,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
out.set(mDisplayFrames.mStable);
}
- TaskStack createStack(int stackId, boolean onTop, StackWindowController controller) {
- if (DEBUG_STACK) Slog.d(TAG_WM, "Create new stackId=" + stackId + " on displayId="
- + mDisplayId);
+ void setStackOnDisplay(int stackId, boolean onTop, TaskStack stack) {
+ if (DEBUG_STACK) {
+ Slog.d(TAG_WM, "Create new stackId=" + stackId + " on displayId=" + mDisplayId);
+ }
- final TaskStack stack = new TaskStack(mWmService, stackId, controller);
mTaskStackContainers.addStackToDisplay(stack, onTop);
- return stack;
}
void moveStackToDisplay(TaskStack stack, boolean onTop) {
@@ -3656,6 +3611,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
}
+ /** @returns the orientation of the display when it's rotation is ROTATION_0. */
+ int getNaturalOrientation() {
+ return mBaseDisplayWidth < mBaseDisplayHeight
+ ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
+ }
+
void performLayout(boolean initial, boolean updateInputWindows) {
if (!isLayoutNeeded()) {
return;
@@ -4009,7 +3970,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
/**
* Adds the stack to this container.
- * @see DisplayContent#createStack(int, boolean, StackWindowController)
*/
void addStackToDisplay(TaskStack stack, boolean onTop) {
addStackReferenceIfNeeded(stack);
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index bcc7be42333b..bc165dceb544 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -329,15 +329,6 @@ public class DisplayRotation {
return mFixedToUserRotation;
}
- /**
- * Returns {@code true} if this display rotation takes app requested orientation into
- * consideration; {@code false} otherwise. For the time being the only case where this is {@code
- * false} is when {@link #isFixedToUserRotation()} is {@code true}.
- */
- boolean respectAppRequestedOrientation() {
- return !mFixedToUserRotation;
- }
-
public int getLandscapeRotation() {
return mLandscapeRotation;
}
@@ -685,36 +676,6 @@ public class DisplayRotation {
return rotation == mPortraitRotation || rotation == mUpsideDownRotation;
}
- /**
- * Given an orientation constant and a rotation, returns true if the rotation
- * has compatible metrics to the requested orientation. For example, if
- * the application requested landscape and got seascape, then the rotation
- * has compatible metrics; if the application requested portrait and got landscape,
- * then the rotation has incompatible metrics; if the application did not specify
- * a preference, then anything goes.
- *
- * @param orientation An orientation constant, such as
- * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}.
- * @param rotation The rotation to check.
- * @return True if the rotation is compatible with the requested orientation.
- */
- boolean rotationHasCompatibleMetrics(int orientation, int rotation) {
- switch (orientation) {
- case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
- case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
- case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
- return isAnyPortrait(rotation);
-
- case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
- case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
- case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
- return isLandscapeOrSeascape(rotation);
-
- default:
- return true;
- }
- }
-
private boolean isValidRotationChoice(final int preferredRotation) {
// Determine if the given app orientation is compatible with the provided rotation choice.
switch (mCurrentAppOrientation) {
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 607ee767869f..786a3064ab4e 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -127,6 +127,7 @@ class DragState {
* {@code true} when {@link #closeLocked()} is called.
*/
private boolean mIsClosing;
+ IBinder mTransferTouchFromToken;
DragState(WindowManagerService service, DragDropController controller, IBinder token,
SurfaceControl surface, int flags, IBinder localWin) {
@@ -177,6 +178,8 @@ class DragState {
mTmpClipRect.set(0, 0, mDisplaySize.x, mDisplaySize.y);
t.setWindowCrop(mInputSurface, mTmpClipRect);
+ t.transferTouchFocus(mTransferTouchFromToken, h.token);
+ mTransferTouchFromToken = null;
}
/**
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index 639ed02a1e48..f9c9d33c561a 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -1,5 +1,6 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
@@ -9,7 +10,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.os.Debug;
import android.os.IBinder;
import android.util.Slog;
-import android.view.InputApplicationHandle;
import android.view.KeyEvent;
import android.view.WindowManager;
@@ -204,6 +204,37 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
+ WindowManagerService.TYPE_LAYER_OFFSET;
}
+ /** Callback to get pointer display id. */
+ @Override
+ public int getPointerDisplayId() {
+ synchronized (mService.mGlobalLock) {
+ // If desktop mode is not enabled, show on the default display.
+ if (!mService.mForceDesktopModeOnExternalDisplays) {
+ return DEFAULT_DISPLAY;
+ }
+
+ // Look for the topmost freeform display.
+ int firstExternalDisplayId = DEFAULT_DISPLAY;
+ for (int i = mService.mRoot.mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent displayContent = mService.mRoot.mChildren.get(i);
+ // Heuristic solution here. Currently when "Freeform windows" developer option is
+ // enabled we automatically put secondary displays in freeform mode and emulating
+ // "desktop mode". It also makes sense to show the pointer on the same display.
+ if (displayContent.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
+ return displayContent.getDisplayId();
+ }
+
+ if (firstExternalDisplayId == DEFAULT_DISPLAY
+ && displayContent.getDisplayId() != DEFAULT_DISPLAY) {
+ firstExternalDisplayId = displayContent.getDisplayId();
+ }
+ }
+
+ // Look for the topmost non-default display
+ return firstExternalDisplayId;
+ }
+ }
+
/** Waits until the built-in input devices have been configured. */
public boolean waitForInputDevicesReady(long timeoutMillis) {
synchronized (mInputDevicesReadyMonitor) {
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index fbb9e2905697..d6f161645327 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -25,6 +25,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
+import android.view.ViewRootImpl;
import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
@@ -158,7 +159,7 @@ class InsetsSourceProvider {
}
boolean isClientVisible() {
- return mClientVisible;
+ return !ViewRootImpl.USE_NEW_INSETS || mClientVisible;
}
private class ControlAdapter implements AnimationAdapter {
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index cc57b932092c..bc01f7c2595d 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -202,6 +202,9 @@ class InsetsStateController {
}
private void notifyPendingInsetsControlChanged() {
+ if (mPendingControlChanged.isEmpty()) {
+ return;
+ }
mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
for (int i = mPendingControlChanged.size() - 1; i >= 0; i--) {
final WindowState controllingWin = mPendingControlChanged.valueAt(i);
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 5f56fe59c1f2..177f244129f4 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -462,22 +462,19 @@ class KeyguardController {
mOccluded = false;
mDismissingKeyguardActivity = null;
- // Only the top activity of the focused stack on each display may control it's
- // occluded state.
- final ActivityStack focusedStack = display.getFocusedStack();
- if (focusedStack != null) {
- final ActivityRecord topDismissing =
- focusedStack.getTopDismissingKeyguardActivity();
- mOccluded = focusedStack.topActivityOccludesKeyguard() || (topDismissing != null
- && focusedStack.topRunningActivityLocked() == topDismissing
- && controller.canShowWhileOccluded(
+ final ActivityStack stack = getStackForControllingOccluding(display);
+ if (stack != null) {
+ final ActivityRecord topDismissing = stack.getTopDismissingKeyguardActivity();
+ mOccluded = stack.topActivityOccludesKeyguard() || (topDismissing != null
+ && stack.topRunningActivityLocked() == topDismissing
+ && controller.canShowWhileOccluded(
true /* dismissKeyguard */,
false /* showWhenLocked */));
- if (focusedStack.getTopDismissingKeyguardActivity() != null) {
- mDismissingKeyguardActivity = focusedStack.getTopDismissingKeyguardActivity();
+ if (stack.getTopDismissingKeyguardActivity() != null) {
+ mDismissingKeyguardActivity = stack.getTopDismissingKeyguardActivity();
}
- mOccluded |= controller.mWindowManager.isShowingDream();
}
+ mOccluded |= controller.mWindowManager.isShowingDream();
// TODO(b/113840485): Handle app transition for individual display, and apply occluded
// state change to secondary displays.
@@ -492,6 +489,23 @@ class KeyguardController {
}
}
+ /**
+ * Gets the stack used to check the occluded state.
+ * <p>
+ * Only the top non-pinned activity of the focusable stack on each display can control its
+ * occlusion state.
+ */
+ private ActivityStack getStackForControllingOccluding(ActivityDisplay display) {
+ for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
+ final ActivityStack stack = display.getChildAt(stackNdx);
+ if (stack != null && stack.isFocusableAndVisible()
+ && !stack.inPinnedWindowingMode()) {
+ return stack;
+ }
+ }
+ return null;
+ }
+
void dumpStatus(PrintWriter pw, String prefix) {
final StringBuilder sb = new StringBuilder();
sb.append(prefix);
diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
index 3062d34780b6..86dc66dbca3b 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
@@ -221,7 +221,7 @@ class LaunchParamsPersister {
}
private boolean saveTaskToLaunchParam(TaskRecord task, PersistableLaunchParams params) {
- final ActivityStack<?> stack = task.getStack();
+ final ActivityStack stack = task.getStack();
final int displayId = stack.mDisplayId;
final ActivityDisplay display =
mSupervisor.mRootActivityContainer.getActivityDisplay(displayId);
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index 1a2aa2f252e6..434084cc1f3d 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static android.view.SurfaceControl.HIDDEN;
+import android.graphics.Point;
import android.graphics.Rect;
import android.view.SurfaceControl;
@@ -30,6 +31,7 @@ import java.util.function.Supplier;
public class Letterbox {
private static final Rect EMPTY_RECT = new Rect();
+ private static final Point ZERO_POINT = new Point(0, 0);
private final Supplier<SurfaceControl.Builder> mFactory;
private final Rect mOuter = new Rect();
@@ -53,19 +55,20 @@ public class Letterbox {
* frames will be covered by black color surfaces.
*
* The caller must use {@link #applySurfaceChanges} to apply the new layout to the surface.
- *
* @param outer the outer frame of the letterbox (this frame will be black, except the area
- * that intersects with the {code inner} frame).
- * @param inner the inner frame of the letterbox (this frame will be clear)
+ * that intersects with the {code inner} frame), in global coordinates
+ * @param inner the inner frame of the letterbox (this frame will be clear), in global
+ * coordinates
+ * @param surfaceOrigin the origin of the surface factory in global coordinates
*/
- public void layout(Rect outer, Rect inner) {
+ public void layout(Rect outer, Rect inner, Point surfaceOrigin) {
mOuter.set(outer);
mInner.set(inner);
- mTop.layout(outer.left, outer.top, inner.right, inner.top);
- mLeft.layout(outer.left, inner.top, inner.left, outer.bottom);
- mBottom.layout(inner.left, inner.bottom, outer.right, outer.bottom);
- mRight.layout(inner.right, outer.top, outer.right, inner.bottom);
+ mTop.layout(outer.left, outer.top, inner.right, inner.top, surfaceOrigin);
+ mLeft.layout(outer.left, inner.top, inner.left, outer.bottom, surfaceOrigin);
+ mBottom.layout(inner.left, inner.bottom, outer.right, outer.bottom, surfaceOrigin);
+ mRight.layout(inner.right, outer.top, outer.right, inner.bottom, surfaceOrigin);
}
@@ -94,7 +97,7 @@ public class Letterbox {
* The caller must use {@link #applySurfaceChanges} to apply the new layout to the surface.
*/
public void hide() {
- layout(EMPTY_RECT, EMPTY_RECT);
+ layout(EMPTY_RECT, EMPTY_RECT, ZERO_POINT);
}
/**
@@ -130,20 +133,18 @@ public class Letterbox {
private final String mType;
private SurfaceControl mSurface;
- private final Rect mSurfaceFrame = new Rect();
- private final Rect mLayoutFrame = new Rect();
+ private final Rect mSurfaceFrameRelative = new Rect();
+ private final Rect mLayoutFrameGlobal = new Rect();
+ private final Rect mLayoutFrameRelative = new Rect();
public LetterboxSurface(String type) {
mType = type;
}
- public void layout(int left, int top, int right, int bottom) {
- if (mLayoutFrame.left == left && mLayoutFrame.top == top
- && mLayoutFrame.right == right && mLayoutFrame.bottom == bottom) {
- // Nothing changed.
- return;
- }
- mLayoutFrame.set(left, top, right, bottom);
+ public void layout(int left, int top, int right, int bottom, Point surfaceOrigin) {
+ mLayoutFrameGlobal.set(left, top, right, bottom);
+ mLayoutFrameRelative.set(mLayoutFrameGlobal);
+ mLayoutFrameRelative.offset(-surfaceOrigin.x, -surfaceOrigin.y);
}
private void createSurface() {
@@ -161,32 +162,37 @@ public class Letterbox {
}
public int getWidth() {
- return Math.max(0, mLayoutFrame.width());
+ return Math.max(0, mLayoutFrameGlobal.width());
}
public int getHeight() {
- return Math.max(0, mLayoutFrame.height());
+ return Math.max(0, mLayoutFrameGlobal.height());
}
+ /**
+ * Returns if the given {@code rect} overlaps with this letterbox piece.
+ * @param rect the area to check for overlap in global coordinates
+ */
public boolean isOverlappingWith(Rect rect) {
- if (getWidth() <= 0 || getHeight() <= 0) {
+ if (mLayoutFrameGlobal.isEmpty()) {
return false;
}
- return Rect.intersects(rect, mLayoutFrame);
+ return Rect.intersects(rect, mLayoutFrameGlobal);
}
public void applySurfaceChanges(SurfaceControl.Transaction t) {
- if (mSurfaceFrame.equals(mLayoutFrame)) {
+ if (mSurfaceFrameRelative.equals(mLayoutFrameRelative)) {
// Nothing changed.
return;
}
- mSurfaceFrame.set(mLayoutFrame);
- if (!mSurfaceFrame.isEmpty()) {
+ mSurfaceFrameRelative.set(mLayoutFrameRelative);
+ if (!mSurfaceFrameRelative.isEmpty()) {
if (mSurface == null) {
createSurface();
}
- t.setPosition(mSurface, mSurfaceFrame.left, mSurfaceFrame.top);
- t.setWindowCrop(mSurface, mSurfaceFrame.width(), mSurfaceFrame.height());
+ t.setPosition(mSurface, mSurfaceFrameRelative.left, mSurfaceFrameRelative.top);
+ t.setWindowCrop(mSurface, mSurfaceFrameRelative.width(),
+ mSurfaceFrameRelative.height());
t.show(mSurface);
} else if (mSurface != null) {
t.hide(mSurface);
@@ -194,7 +200,7 @@ public class Letterbox {
}
public boolean needsApplySurfaceChanges() {
- return !mSurfaceFrame.equals(mLayoutFrame);
+ return !mSurfaceFrameRelative.equals(mLayoutFrameRelative);
}
}
}
diff --git a/services/core/java/com/android/server/wm/PinnedActivityStack.java b/services/core/java/com/android/server/wm/PinnedActivityStack.java
deleted file mode 100644
index 2a05af4f473c..000000000000
--- a/services/core/java/com/android/server/wm/PinnedActivityStack.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2017 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.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-
-import android.app.RemoteAction;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * State and management of the pinned stack of activities.
- */
-class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
- implements PinnedStackWindowListener {
-
- PinnedActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
- boolean onTop) {
- super(display, stackId, supervisor, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, onTop);
- }
-
- @Override
- PinnedStackWindowController createStackWindowController(int displayId, boolean onTop,
- Rect outBounds) {
- return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds,
- mRootActivityContainer.mWindowManager);
- }
-
- Rect getDefaultPictureInPictureBounds(float aspectRatio) {
- return getWindowContainerController().getPictureInPictureBounds(aspectRatio,
- null /* currentStackBounds */);
- }
-
- void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
- boolean fromFullscreen) {
- if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
- mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
- } else {
- getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
- animationDuration, fromFullscreen);
- }
- }
-
- private boolean skipResizeAnimation(boolean toFullscreen) {
- if (!toFullscreen) {
- return false;
- }
- final Configuration parentConfig = getParent().getConfiguration();
- final ActivityRecord top = topRunningNonOverlayTaskActivity();
- return top != null && !top.isConfigurationCompatible(parentConfig);
- }
-
- void setPictureInPictureAspectRatio(float aspectRatio) {
- getWindowContainerController().setPictureInPictureAspectRatio(aspectRatio);
- }
-
- void setPictureInPictureActions(List<RemoteAction> actions) {
- getWindowContainerController().setPictureInPictureActions(actions);
- }
-
- boolean isAnimatingBoundsToFullscreen() {
- return getWindowContainerController().mContainer.isAnimatingBoundsToFullscreen();
- }
-
- /**
- * Returns whether to defer the scheduling of the multi-window mode.
- */
- boolean deferScheduleMultiWindowModeChanged() {
- // For the pinned stack, the deferring of the multi-window mode changed is tied to the
- // transition animation into picture-in-picture, and is called once the animation completes,
- // or is interrupted in a way that would leave the stack in a non-fullscreen state.
- // @see BoundsAnimationController
- // @see BoundsAnimationControllerTests
- return mWindowContainerController.deferScheduleMultiWindowModeChanged();
- }
-
- public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds,
- boolean forceUpdate) {
- // It is guaranteed that the activities requiring the update will be in the pinned stack at
- // this point (either reparented before the animation into PiP, or before reparenting after
- // the animation out of PiP)
- synchronized (mService.mGlobalLock) {
- if (!isAttached()) {
- return;
- }
- ArrayList<TaskRecord> tasks = getAllTasks();
- for (int i = 0; i < tasks.size(); i++ ) {
- mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds,
- forceUpdate);
- }
- }
- }
-}
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
deleted file mode 100644
index 518e39ba9d58..000000000000
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2017 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.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-
-import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
-import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
-import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
-import static com.android.server.wm.BoundsAnimationController.SchedulePipModeChangedState;
-
-import android.app.RemoteAction;
-import android.graphics.Rect;
-
-import java.util.List;
-
-/**
- * Controller for the pinned stack container. See {@link StackWindowController}.
- */
-public class PinnedStackWindowController extends StackWindowController {
-
- private Rect mTmpFromBounds = new Rect();
- private Rect mTmpToBounds = new Rect();
-
- public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
- int displayId, boolean onTop, Rect outBounds, WindowManagerService service) {
- super(stackId, listener, displayId, onTop, outBounds, service);
- }
-
- /**
- * @return the {@param currentStackBounds} transformed to the give {@param aspectRatio}. If
- * {@param currentStackBounds} is null, then the {@param aspectRatio} is applied to the
- * default bounds.
- */
- public Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) {
- synchronized (mGlobalLock) {
- if (!mService.mSupportsPictureInPicture || mContainer == null) {
- return null;
- }
-
- final DisplayContent displayContent = mContainer.getDisplayContent();
- if (displayContent == null) {
- return null;
- }
-
- final PinnedStackController pinnedStackController =
- displayContent.getPinnedStackController();
- if (stackBounds == null) {
- // Calculate the aspect ratio bounds from the default bounds
- stackBounds = pinnedStackController.getDefaultOrLastSavedBounds();
- }
-
- if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
- return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio,
- true /* useCurrentMinEdgeSize */);
- } else {
- return stackBounds;
- }
- }
- }
-
- /**
- * Animates the pinned stack.
- */
- public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
- int animationDuration, boolean fromFullscreen) {
- synchronized (mGlobalLock) {
- if (mContainer == null) {
- throw new IllegalArgumentException("Pinned stack container not found :(");
- }
-
- // Get the from-bounds
- final Rect fromBounds = new Rect();
- mContainer.getBounds(fromBounds);
-
- // Get non-null fullscreen to-bounds for animating if the bounds are null
- @SchedulePipModeChangedState int schedulePipModeChangedState =
- NO_PIP_MODE_CHANGED_CALLBACKS;
- final boolean toFullscreen = toBounds == null;
- if (toFullscreen) {
- if (fromFullscreen) {
- throw new IllegalArgumentException("Should not defer scheduling PiP mode"
- + " change on animation to fullscreen.");
- }
- schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START;
-
- mService.getStackBounds(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mTmpToBounds);
- if (!mTmpToBounds.isEmpty()) {
- // If there is a fullscreen bounds, use that
- toBounds = new Rect(mTmpToBounds);
- } else {
- // Otherwise, use the display bounds
- toBounds = new Rect();
- mContainer.getDisplayContent().getBounds(toBounds);
- }
- } else if (fromFullscreen) {
- schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END;
- }
-
- mContainer.setAnimationFinalBounds(sourceHintBounds, toBounds, toFullscreen);
-
- final Rect finalToBounds = toBounds;
- final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
- schedulePipModeChangedState;
- final DisplayContent displayContent = mContainer.getDisplayContent();
- displayContent.mBoundsAnimationController.getHandler().post(() -> {
- if (mContainer == null) {
- return;
- }
- displayContent.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
- finalToBounds, animationDuration, finalSchedulePipModeChangedState,
- fromFullscreen, toFullscreen);
- });
- }
- }
-
- /**
- * Sets the current picture-in-picture aspect ratio.
- */
- public void setPictureInPictureAspectRatio(float aspectRatio) {
- synchronized (mGlobalLock) {
- if (!mService.mSupportsPictureInPicture || mContainer == null) {
- return;
- }
-
- final PinnedStackController pinnedStackController =
- mContainer.getDisplayContent().getPinnedStackController();
-
- if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) {
- mContainer.getAnimationOrCurrentBounds(mTmpFromBounds);
- mTmpToBounds.set(mTmpFromBounds);
- getPictureInPictureBounds(aspectRatio, mTmpToBounds);
- if (!mTmpToBounds.equals(mTmpFromBounds)) {
- animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */,
- -1 /* duration */, false /* fromFullscreen */);
- }
- pinnedStackController.setAspectRatio(
- pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
- ? aspectRatio : -1f);
- }
- }
- }
-
- /**
- * Sets the current picture-in-picture actions.
- */
- public void setPictureInPictureActions(List<RemoteAction> actions) {
- synchronized (mGlobalLock) {
- if (!mService.mSupportsPictureInPicture || mContainer == null) {
- return;
- }
-
- mContainer.getDisplayContent().getPinnedStackController().setActions(actions);
- }
- }
-
- /**
- * @return whether the multi-window mode change should be deferred as a part of a transition
- * from fullscreen to non-fullscreen bounds.
- */
- public boolean deferScheduleMultiWindowModeChanged() {
- synchronized (mGlobalLock) {
- return mContainer.deferScheduleMultiWindowModeChanged();
- }
- }
-
- /**
- * @return whether the stack can be resized from the bounds animation.
- */
- public boolean pinnedStackResizeDisallowed() {
- synchronized (mGlobalLock) {
- return mContainer.pinnedStackResizeDisallowed();
- }
- }
-
- /**
- * The following calls are made from WM to AM.
- */
-
- /** Calls directly into activity manager so window manager lock shouldn't held. */
- public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds,
- boolean forceUpdate) {
- if (mListener != null) {
- PinnedStackWindowListener listener = (PinnedStackWindowListener) mListener;
- listener.updatePictureInPictureModeForPinnedStackAnimation(targetStackBounds,
- forceUpdate);
- }
- }
-}
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowListener.java b/services/core/java/com/android/server/wm/PinnedStackWindowListener.java
deleted file mode 100644
index 33e8a60329bf..000000000000
--- a/services/core/java/com/android/server/wm/PinnedStackWindowListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2017 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.wm;
-
-import android.graphics.Rect;
-
-/**
- * Interface used by the creator of {@link PinnedStackWindowController} to listen to changes with
- * the stack container.
- */
-public interface PinnedStackWindowListener extends StackWindowListener {
-
- /**
- * Called when the stack container pinned stack animation will change the picture-in-picture
- * mode. This is a direct call into ActivityManager.
- */
- default void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds,
- boolean forceUpdate) {}
-}
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index 53d3c5fd1496..e93da6ca771c 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -234,7 +234,7 @@ public class RootActivityContainer extends ConfigurationContainer
mWindowManager = wm;
setWindowContainer(mWindowManager.mRoot);
mDisplayManager = mService.mContext.getSystemService(DisplayManager.class);
- mDisplayManager.registerDisplayListener(this, mService.mH);
+ mDisplayManager.registerDisplayListener(this, mService.mUiHandler);
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
final Display[] displays = mDisplayManager.getDisplays();
@@ -955,7 +955,7 @@ public class RootActivityContainer extends ConfigurationContainer
mWindowManager.deferSurfaceLayout();
final ActivityDisplay display = r.getActivityStack().getDisplay();
- PinnedActivityStack stack = display.getPinnedStack();
+ ActivityStack stack = display.getPinnedStack();
// This will clear the pinned stack by moving an existing task to the full screen stack,
// ensuring only one task is present.
@@ -1108,28 +1108,41 @@ public class RootActivityContainer extends ConfigurationContainer
return false;
}
+ boolean result = false;
if (targetStack != null && (targetStack.isTopStackOnDisplay()
|| getTopDisplayFocusedStack() == targetStack)) {
- return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
+ result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
- // Resume all top activities in focused stacks on all displays.
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
+ boolean resumedOnDisplay = false;
final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- final ActivityStack focusedStack = display.getFocusedStack();
- if (focusedStack == null) {
- continue;
+ for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
+ final ActivityStack stack = display.getChildAt(stackNdx);
+ final ActivityRecord topRunningActivity = stack.topRunningActivityLocked();
+ if (!stack.isFocusableAndVisible() || topRunningActivity == null) {
+ continue;
+ }
+ if (topRunningActivity.isState(RESUMED)) {
+ // Kick off any lingering app transitions form the MoveTaskToFront operation.
+ stack.executeAppTransition(targetOptions);
+ } else {
+ resumedOnDisplay |= topRunningActivity.makeActiveIfNeeded(target);
+ }
}
- final ActivityRecord r = focusedStack.topRunningActivityLocked();
- if (r == null || !r.isState(RESUMED)) {
- focusedStack.resumeTopActivityUncheckedLocked(null, null);
- } else if (r.isState(RESUMED)) {
- // Kick off any lingering app transitions form the MoveTaskToFront operation.
- focusedStack.executeAppTransition(targetOptions);
+ if (!resumedOnDisplay) {
+ // In cases when there are no valid activities (e.g. device just booted or launcher
+ // crashed) it's possible that nothing was resumed on a display. Requesting resume
+ // of top activity in focused stack explicitly will make sure that at least home
+ // activity is started and resumed, and no recursion occurs.
+ final ActivityStack focusedStack = display.getFocusedStack();
+ if (focusedStack != null) {
+ focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
+ }
}
}
- return false;
+ return result;
}
void applySleepTokens(boolean applyToStacks) {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 4e70bbc277d8..8fb79477eb2f 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -23,6 +23,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
+import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
@@ -280,6 +281,15 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
/**
+ * Returns true if the callingUid has any non-toast window currently visible to the user.
+ */
+ boolean isAnyNonToastWindowVisibleForUid(int callingUid) {
+ return forAllWindows(w -> {
+ return w.getOwningUid() == callingUid && w.isVisible() && w.mAttrs.type != TYPE_TOAST;
+ }, true /* traverseTopToBottom */);
+ }
+
+ /**
* Returns the app window token for the input binder if it exist in the system.
* NOTE: Only one AppWindowToken is allowed to exist in the system for a binder token, since
* AppWindowToken represents an activity which can only exist on one display.
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index d85fdb03e4a6..58cf73a9a2bd 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -47,10 +47,9 @@ import android.view.IWindowId;
import android.view.IWindowSession;
import android.view.IWindowSessionCallback;
import android.view.InputChannel;
-import android.view.Surface;
+import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
-import android.view.InsetsState;
import android.view.WindowManager;
import com.android.internal.os.logging.MetricsLoggerWrapper;
@@ -187,7 +186,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
- Surface outSurface, InsetsState outInsetsState) {
+ SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
+ Binder.getCallingPid());
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
@@ -195,7 +194,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
outStableInsets, outsets, outBackdropFrame, cutout,
- mergedConfiguration, outSurface, outInsetsState);
+ mergedConfiguration, outSurfaceControl, outInsetsState);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
+ Binder.getCallingPid());
@@ -432,7 +431,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
@Override
public void insetsModified(IWindow window, InsetsState state) {
- synchronized (mService.mWindowMap) {
+ synchronized (mService.mGlobalLock) {
final WindowState windowState = mService.windowForClientLocked(this, window,
false /* throwOnError */);
if (windowState != null) {
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
deleted file mode 100644
index ada807b1ff3c..000000000000
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2016 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.wm;
-
-import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.util.Slog;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Controller for the stack container. This is created by activity manager to link activity stacks
- * to the stack container they use in window manager.
- *
- * Test class: {@link StackWindowControllerTests}
- */
-public class StackWindowController
- extends WindowContainerController<TaskStack, StackWindowListener> {
-
- private final int mStackId;
-
- private final H mHandler;
-
- final Rect mTmpBounds = new Rect();
-
- public StackWindowController(int stackId, StackWindowListener listener, int displayId,
- boolean onTop, Rect outBounds) {
- this(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance());
- }
-
- @VisibleForTesting
- public StackWindowController(int stackId, StackWindowListener listener,
- int displayId, boolean onTop, Rect outBounds, WindowManagerService service) {
- super(listener, service);
- mStackId = stackId;
- mHandler = new H(new WeakReference<>(this), service.mH.getLooper());
-
- final DisplayContent dc = mRoot.getDisplayContent(displayId);
- if (dc == null) {
- throw new IllegalArgumentException("Trying to add stackId=" + stackId
- + " to unknown displayId=" + displayId);
- }
-
- dc.createStack(stackId, onTop, this);
- getRawBounds(outBounds);
- }
-
- @Override
- public void removeContainer() {
- if (mContainer != null) {
- mContainer.removeIfPossible();
- super.removeContainer();
- }
- }
-
- void reparent(int displayId, Rect outStackBounds, boolean onTop) {
- if (mContainer == null) {
- throw new IllegalArgumentException("Trying to move unknown stackId=" + mStackId
- + " to displayId=" + displayId);
- }
-
- final DisplayContent targetDc = mRoot.getDisplayContent(displayId);
- if (targetDc == null) {
- throw new IllegalArgumentException("Trying to move stackId=" + mStackId
- + " to unknown displayId=" + displayId);
- }
-
- targetDc.moveStackToDisplay(mContainer, onTop);
- getRawBounds(outStackBounds);
- }
-
- void positionChildAt(Task child, int position) {
- if (DEBUG_STACK) {
- Slog.i(TAG_WM, "positionChildAt: positioning task=" + child + " at " + position);
- }
- if (child == null) {
- if (DEBUG_STACK) {
- Slog.i(TAG_WM, "positionChildAt: could not find task=" + this);
- }
- return;
- }
- if (mContainer == null) {
- if (DEBUG_STACK) {
- Slog.i(TAG_WM, "positionChildAt: could not find stack for task=" + mContainer);
- }
- return;
- }
- child.positionAt(position);
- mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
- }
-
- void positionChildAtTop(Task child, boolean includingParents) {
- if (child == null) {
- // TODO: Fix the call-points that cause this to happen.
- return;
- }
-
- mContainer.positionChildAt(POSITION_TOP, child, includingParents);
-
- final DisplayContent displayContent = mContainer.getDisplayContent();
- if (displayContent.mAppTransition.isTransitionSet()) {
- child.setSendingToBottom(false);
- }
- displayContent.layoutAndAssignWindowLayersIfNeeded();
- }
-
- void positionChildAtBottom(Task child, boolean includingParents) {
- if (child == null) {
- // TODO: Fix the call-points that cause this to happen.
- return;
- }
-
- mContainer.positionChildAt(POSITION_BOTTOM, child, includingParents);
-
- if (mContainer.getDisplayContent().mAppTransition.isTransitionSet()) {
- child.setSendingToBottom(true);
- }
- mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
- }
-
- /**
- * Re-sizes a stack and its containing tasks.
- *
- * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
- * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
- * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
- */
- public void resize(Rect bounds, SparseArray<Rect> taskBounds,
- SparseArray<Rect> taskTempInsetBounds) {
- if (mContainer == null) {
- throw new IllegalArgumentException("resizeStack: stack " + this + " not found.");
- }
- // We might trigger a configuration change. Save the current task bounds for freezing.
- mContainer.prepareFreezingTaskBounds();
- if (mContainer.setBounds(bounds, taskBounds, taskTempInsetBounds)
- && mContainer.isVisible()) {
- mContainer.getDisplayContent().setLayoutNeeded();
- mService.mWindowPlacerLocked.performSurfacePlacement();
- }
- }
-
- public void onPipAnimationEndResize() {
- mContainer.onPipAnimationEndResize();
- }
-
- /**
- * @see TaskStack.getStackDockedModeBoundsLocked(ConfigurationContainer, Rect, Rect, Rect)
- */
- public void getStackDockedModeBounds(Configuration parentConfig, Rect dockedBounds,
- Rect currentTempTaskBounds,
- Rect outStackBounds, Rect outTempTaskBounds) {
- if (mContainer != null) {
- mContainer.getStackDockedModeBoundsLocked(parentConfig, dockedBounds,
- currentTempTaskBounds, outStackBounds, outTempTaskBounds);
- return;
- }
- outStackBounds.setEmpty();
- outTempTaskBounds.setEmpty();
- }
-
- public void prepareFreezingTaskBounds() {
- if (mContainer == null) {
- throw new IllegalArgumentException("prepareFreezingTaskBounds: stack " + this
- + " not found.");
- }
- mContainer.prepareFreezingTaskBounds();
- }
-
- public void getRawBounds(Rect outBounds) {
- if (mContainer.matchParentBounds()) {
- outBounds.setEmpty();
- } else {
- mContainer.getRawBounds(outBounds);
- }
- }
-
- public void getBounds(Rect outBounds) {
- if (mContainer != null) {
- mContainer.getBounds(outBounds);
- return;
- }
- outBounds.setEmpty();
- }
-
- void requestResize(Rect bounds) {
- mHandler.obtainMessage(H.REQUEST_RESIZE, bounds).sendToTarget();
- }
-
- @Override
- public String toString() {
- return "{StackWindowController stackId=" + mStackId + "}";
- }
-
- private static final class H extends Handler {
-
- static final int REQUEST_RESIZE = 0;
-
- private final WeakReference<StackWindowController> mController;
-
- H(WeakReference<StackWindowController> controller, Looper looper) {
- super(looper);
- mController = controller;
- }
-
- @Override
- public void handleMessage(Message msg) {
- final StackWindowController controller = mController.get();
- final StackWindowListener listener = (controller != null)
- ? controller.mListener : null;
- if (listener == null) {
- return;
- }
- switch (msg.what) {
- case REQUEST_RESIZE:
- listener.requestResize((Rect) msg.obj);
- break;
- }
- }
- }
-}
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 11068ce8bace..9d9b48a5b36a 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -280,7 +280,7 @@ class SurfaceAnimator {
}
mService.mAnimationTransferMap.remove(mAnimation);
if (mLeash != null && destroyLeash) {
- t.destroy(mLeash);
+ t.reparent(mLeash, null);
scheduleAnim = true;
}
mLeash = null;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index d334bd298ada..a7dd55b8a160 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -209,26 +209,14 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta
super.removeImmediately();
}
- void reparent(StackWindowController stackController, int position, boolean moveParents) {
- if (DEBUG_STACK) {
- Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId
- + " to stack=" + stackController + " at " + position);
- }
- final TaskStack stack = stackController.mContainer;
- if (stack == null) {
- throw new IllegalArgumentException("reparent: could not find stack="
- + stackController);
- }
- reparent(stack, position, moveParents);
- getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
- }
-
-
void reparent(TaskStack stack, int position, boolean moveParents) {
if (stack == mStack) {
throw new IllegalArgumentException(
"task=" + this + " already child of stack=" + mStack);
}
+ if (stack == null) {
+ throw new IllegalArgumentException("reparent: could not find stack.");
+ }
if (DEBUG_STACK) Slog.i(TAG, "reParentTask: removing taskId=" + mTaskId
+ " from stack=" + mStack);
EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "reParentTask");
@@ -254,6 +242,7 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta
onDisplayChanged(displayContent);
prevDisplayContent.setLayoutNeeded();
}
+ getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
}
/** @see ActivityTaskManagerService#positionTaskInStack(int, int, int). */
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index 6acd8641271c..f3050a903c70 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -709,7 +709,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
final List<TaskRecord> tasksToCheck = new ArrayList<>();
for (int i = 0; i < display.getChildCount(); ++i) {
- ActivityStack<?> stack = display.getChildAt(i);
+ final ActivityStack stack = display.getChildAt(i);
if (!stack.inFreeformWindowingMode()) {
continue;
}
diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java
index e15bf5b9a6f0..916316549f39 100644
--- a/services/core/java/com/android/server/wm/TaskPositioningController.java
+++ b/services/core/java/com/android/server/wm/TaskPositioningController.java
@@ -24,6 +24,7 @@ import android.app.IActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
+import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Slog;
@@ -50,6 +51,7 @@ class TaskPositioningController {
private @Nullable TaskPositioner mTaskPositioner;
private final Rect mTmpClipRect = new Rect();
+ private IBinder mTransferTouchFromToken;
boolean isPositioningLocked() {
return mTaskPositioner != null;
@@ -102,6 +104,8 @@ class TaskPositioningController {
mTmpClipRect.set(0, 0, p.x, p.y);
t.setWindowCrop(mInputSurface, mTmpClipRect);
+ t.transferTouchFocus(mTransferTouchFromToken, h.token);
+ mTransferTouchFromToken = null;
}
boolean startMovingTask(IWindow window, float startX, float startY) {
@@ -170,7 +174,6 @@ class TaskPositioningController {
mPositioningDisplay = displayContent;
mTaskPositioner = TaskPositioner.create(mService);
- mTaskPositioner.register(displayContent);
// We need to grab the touch focus so that the touch events during the
// resizing/scrolling are not sent to the app. 'win' is the main window
@@ -181,12 +184,8 @@ class TaskPositioningController {
&& displayContent.mCurrentFocus.mAppToken == win.mAppToken) {
transferFocusFromWin = displayContent.mCurrentFocus;
}
- if (!mInputManager.transferTouchFocus(
- transferFocusFromWin.mInputChannel, mTaskPositioner.mServerChannel)) {
- Slog.e(TAG_WM, "startPositioningLocked: Unable to transfer touch focus");
- cleanUpTaskPositioner();
- return false;
- }
+ mTransferTouchFromToken = transferFocusFromWin.mInputChannel.getToken();
+ mTaskPositioner.register(displayContent);
mTaskPositioner.startDrag(win, resize, preserveOrientation, startX, startY);
return true;
diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java
index e3433228f2de..0529ed128130 100644
--- a/services/core/java/com/android/server/wm/TaskRecord.java
+++ b/services/core/java/com/android/server/wm/TaskRecord.java
@@ -44,6 +44,9 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
+import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -452,17 +455,10 @@ class TaskRecord extends ConfigurationContainer {
}
final Rect bounds = updateOverrideConfigurationFromLaunchBounds();
- final StackWindowController stackController = getStack().getWindowContainerController();
+ final TaskStack stack = getStack().getTaskStack();
- if (DEBUG_STACK) {
- Slog.i(TAG_WM, "TaskRecord: taskId=" + taskId
- + " stack=" + stackController + " bounds=" + bounds);
- }
-
- final TaskStack stack = stackController.mContainer;
if (stack == null) {
- throw new IllegalArgumentException("TaskRecord: invalid stack="
- + stackController);
+ throw new IllegalArgumentException("TaskRecord: invalid stack=" + mStack);
}
EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId);
mTask = new Task(taskId, stack, userId, mService.mWindowManager, mResizeMode,
@@ -702,6 +698,14 @@ class TaskRecord extends ConfigurationContainer {
return false;
}
+ final boolean toTopOfStack = position == MAX_VALUE;
+ if (toTopOfStack && toStack.getResumedActivity() != null
+ && toStack.topRunningActivityLocked() != null) {
+ // Pause the resumed activity on the target stack while re-parenting task on top of it.
+ toStack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
+ null /* resuming */, false /* pauseImmediately */);
+ }
+
final int toStackWindowingMode = toStack.getWindowingMode();
final ActivityRecord topActivity = getTopActivity();
@@ -739,7 +743,7 @@ class TaskRecord extends ConfigurationContainer {
// Must reparent first in window manager to avoid a situation where AM can delete the
// we are coming from in WM before we reparent because it became empty.
- mTask.reparent(toStack.getWindowContainerController(), position,
+ mTask.reparent(toStack.getTaskStack(), position,
moveStackMode == REPARENT_MOVE_STACK_TO_FRONT);
final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
@@ -971,10 +975,11 @@ class TaskRecord extends ConfigurationContainer {
*/
boolean isSameIntentFilter(ActivityRecord r) {
final Intent intent = new Intent(r.intent);
- // Correct the activity intent for aliasing. The task record intent will always be based on
- // the real activity that will be launched not the alias, so we need to use an intent with
- // the component name pointing to the real activity not the alias in the activity record.
- intent.setComponent(r.mActivityComponent);
+ // Make sure the component are the same if the input activity has the same real activity
+ // as the one in the task because either one of them could be the alias activity.
+ if (Objects.equals(realActivity, r.mActivityComponent) && this.intent != null) {
+ intent.setComponent(this.intent.getComponent());
+ }
return intent.filterEquals(this.intent);
}
@@ -1259,10 +1264,6 @@ class TaskRecord extends ConfigurationContainer {
setFrontOfTask();
}
- void addActivityAtBottom(ActivityRecord r) {
- addActivityAtIndex(0, r);
- }
-
void addActivityToTop(ActivityRecord r) {
addActivityAtIndex(mActivities.size(), r);
}
@@ -1278,6 +1279,34 @@ class TaskRecord extends ConfigurationContainer {
}
/**
+ * Checks if the top activity requires a particular orientation (either by override or
+ * activityInfo) and returns that. Otherwise, this returns ORIENTATION_UNDEFINED.
+ */
+ private int getTopActivityRequestedOrientation() {
+ ActivityRecord top = getTopActivity();
+ if (getRequestedOverrideConfiguration().orientation != ORIENTATION_UNDEFINED
+ || top == null) {
+ return getRequestedOverrideConfiguration().orientation;
+ }
+ int screenOrientation = top.getOrientation();
+ if (screenOrientation == ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) {
+ // NOSENSOR means the display's "natural" orientation, so return that.
+ ActivityDisplay display = mStack != null ? mStack.getDisplay() : null;
+ if (display != null && display.mDisplayContent != null) {
+ return mStack.getDisplay().mDisplayContent.getNaturalOrientation();
+ }
+ } else if (screenOrientation == ActivityInfo.SCREEN_ORIENTATION_LOCKED) {
+ // LOCKED means the activity's orientation remains unchanged, so return existing value.
+ return top.getConfiguration().orientation;
+ } else if (ActivityInfo.isFixedOrientationLandscape(screenOrientation)) {
+ return ORIENTATION_LANDSCAPE;
+ } else if (ActivityInfo.isFixedOrientationPortrait(screenOrientation)) {
+ return ORIENTATION_PORTRAIT;
+ }
+ return ORIENTATION_UNDEFINED;
+ }
+
+ /**
* Adds an activity {@param r} at the given {@param index}. The activity {@param r} must either
* be in the current task or unparented to any task.
*/
@@ -1741,7 +1770,7 @@ class TaskRecord extends ConfigurationContainer {
updateTaskDescription();
}
- private void adjustForMinimalTaskDimensions(Rect bounds, Rect previousBounds) {
+ void adjustForMinimalTaskDimensions(Rect bounds, Rect previousBounds) {
if (bounds == null) {
return;
}
@@ -1853,11 +1882,27 @@ class TaskRecord extends ConfigurationContainer {
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
+ // Check if the new configuration supports persistent bounds (eg. is Freeform) and if so
+ // restore the last recorded non-fullscreen bounds.
+ final boolean prevPersistTaskBounds = getWindowConfiguration().persistTaskBounds();
+ final boolean nextPersistTaskBounds =
+ getRequestedOverrideConfiguration().windowConfiguration.persistTaskBounds()
+ || newParentConfig.windowConfiguration.persistTaskBounds();
+ if (!prevPersistTaskBounds && nextPersistTaskBounds
+ && mLastNonFullscreenBounds != null && !mLastNonFullscreenBounds.isEmpty()) {
+ // Bypass onRequestedOverrideConfigurationChanged here to avoid infinite loop.
+ getRequestedOverrideConfiguration().windowConfiguration
+ .setBounds(mLastNonFullscreenBounds);
+ }
+
final boolean wasInMultiWindowMode = inMultiWindowMode();
super.onConfigurationChanged(newParentConfig);
if (wasInMultiWindowMode != inMultiWindowMode()) {
mService.mStackSupervisor.scheduleUpdateMultiWindowMode(this);
}
+
+ // If the configuration supports persistent bounds (eg. Freeform), keep track of the
+ // current (non-fullscreen) bounds for persistence.
if (getWindowConfiguration().persistTaskBounds()) {
final Rect currentBounds = getRequestedOverrideBounds();
if (!currentBounds.isEmpty()) {
@@ -2047,7 +2092,7 @@ class TaskRecord extends ConfigurationContainer {
* configuring an "inherit-bounds" window which means that all configuration settings would
* just be inherited from the parent configuration.
**/
- void computeConfigResourceOverrides(@NonNull Configuration inOutConfig, @NonNull Rect bounds,
+ void computeConfigResourceOverrides(@NonNull Configuration inOutConfig,
@NonNull Configuration parentConfig) {
int windowingMode = inOutConfig.windowConfiguration.getWindowingMode();
if (windowingMode == WINDOWING_MODE_UNDEFINED) {
@@ -2060,6 +2105,7 @@ class TaskRecord extends ConfigurationContainer {
}
density *= DisplayMetrics.DENSITY_DEFAULT_SCALE;
+ final Rect bounds = inOutConfig.windowConfiguration.getBounds();
Rect outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
if (outAppBounds == null || outAppBounds.isEmpty()) {
inOutConfig.windowConfiguration.setAppBounds(bounds);
@@ -2107,13 +2153,14 @@ class TaskRecord extends ConfigurationContainer {
// Iterating across all screen orientations, and return the minimum of the task
// width taking into account that the bounds might change because the snap
// algorithm snaps to a different value
- getSmallestScreenWidthDpForDockedBounds(bounds);
+ inOutConfig.smallestScreenWidthDp =
+ getSmallestScreenWidthDpForDockedBounds(bounds);
}
// otherwise, it will just inherit
}
}
- if (inOutConfig.orientation == Configuration.ORIENTATION_UNDEFINED) {
+ if (inOutConfig.orientation == ORIENTATION_UNDEFINED) {
inOutConfig.orientation = (inOutConfig.screenWidthDp <= inOutConfig.screenHeightDp)
? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
@@ -2134,36 +2181,56 @@ class TaskRecord extends ConfigurationContainer {
}
}
- // TODO(b/113900640): remove this once ActivityRecord is changed to not need it anymore.
- void computeResolvedOverrideConfiguration(Configuration inOutConfig, Configuration parentConfig,
- Configuration overrideConfig) {
- // Save previous bounds because adjustForMinimalTaskDimensions uses that to determine if it
- // changes left bound vs. right bound, or top bound vs. bottom bound.
- mTmpBounds.set(inOutConfig.windowConfiguration.getBounds());
-
- inOutConfig.setTo(overrideConfig);
-
- Rect outOverrideBounds = inOutConfig.windowConfiguration.getBounds();
- if (outOverrideBounds != null && !outOverrideBounds.isEmpty()) {
- adjustForMinimalTaskDimensions(outOverrideBounds, mTmpBounds);
-
- int windowingMode = overrideConfig.windowConfiguration.getWindowingMode();
- if (windowingMode == WINDOWING_MODE_UNDEFINED) {
- windowingMode = parentConfig.windowConfiguration.getWindowingMode();
- }
- if (windowingMode == WINDOWING_MODE_FREEFORM) {
- // by policy, make sure the window remains within parent
- fitWithinBounds(outOverrideBounds, parentConfig.windowConfiguration.getBounds());
+ @Override
+ void resolveOverrideConfiguration(Configuration newParentConfig) {
+ mTmpBounds.set(getResolvedOverrideConfiguration().windowConfiguration.getBounds());
+ super.resolveOverrideConfiguration(newParentConfig);
+ int windowingMode =
+ getRequestedOverrideConfiguration().windowConfiguration.getWindowingMode();
+ if (windowingMode == WINDOWING_MODE_UNDEFINED) {
+ windowingMode = newParentConfig.windowConfiguration.getWindowingMode();
+ }
+ Rect outOverrideBounds =
+ getResolvedOverrideConfiguration().windowConfiguration.getBounds();
+
+ if (windowingMode == WINDOWING_MODE_FULLSCREEN) {
+ // In FULLSCREEN mode, always start with empty bounds to indicate "fill parent"
+ outOverrideBounds.setEmpty();
+
+ // If the task or its top activity requires a different orientation, make it fit the
+ // available bounds by scaling down its bounds.
+ int forcedOrientation = getTopActivityRequestedOrientation();
+ if (forcedOrientation != ORIENTATION_UNDEFINED
+ && forcedOrientation != newParentConfig.orientation) {
+ final Rect parentBounds = newParentConfig.windowConfiguration.getBounds();
+ final int parentWidth = parentBounds.width();
+ final int parentHeight = parentBounds.height();
+ final float aspect = ((float) parentHeight) / parentWidth;
+ if (forcedOrientation == ORIENTATION_LANDSCAPE) {
+ final int height = (int) (parentWidth / aspect);
+ final int top = parentBounds.centerY() - height / 2;
+ outOverrideBounds.set(
+ parentBounds.left, top, parentBounds.right, top + height);
+ } else {
+ final int width = (int) (parentHeight * aspect);
+ final int left = parentBounds.centerX() - width / 2;
+ outOverrideBounds.set(
+ left, parentBounds.top, left + width, parentBounds.bottom);
+ }
}
+ }
- computeConfigResourceOverrides(inOutConfig, outOverrideBounds, parentConfig);
+ if (outOverrideBounds.isEmpty()) {
+ // If the task fills the parent, just inherit all the other configs from parent.
+ return;
}
- }
- @Override
- void resolveOverrideConfiguration(Configuration newParentConfig) {
- computeResolvedOverrideConfiguration(getResolvedOverrideConfiguration(), newParentConfig,
- getRequestedOverrideConfiguration());
+ adjustForMinimalTaskDimensions(outOverrideBounds, mTmpBounds);
+ if (windowingMode == WINDOWING_MODE_FREEFORM) {
+ // by policy, make sure the window remains within parent somewhere
+ fitWithinBounds(outOverrideBounds, newParentConfig.windowConfiguration.getBounds());
+ }
+ computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig);
}
Rect updateOverrideConfigurationFromLaunchBounds() {
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 9a56606aee7f..2d3e3aee4b7f 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -111,6 +111,7 @@ class TaskSnapshotSurface implements StartingSurface {
private static final String TITLE_FORMAT = "SnapshotStartingWindow for taskId=%s";
private final Window mWindow;
private final Surface mSurface;
+ private SurfaceControl mSurfaceControl;
private SurfaceControl mChildSurfaceControl;
private final IWindowSession mSession;
private final WindowManagerService mService;
@@ -136,7 +137,7 @@ class TaskSnapshotSurface implements StartingSurface {
final Window window = new Window();
final IWindowSession session = WindowManagerGlobal.getWindowSession();
window.setSession(session);
- final Surface surface = new Surface();
+ final SurfaceControl surfaceControl = new SurfaceControl();
final Rect tmpRect = new Rect();
final DisplayCutout.ParcelableWrapper tmpCutout = new DisplayCutout.ParcelableWrapper();
final Rect tmpFrame = new Rect();
@@ -213,14 +214,14 @@ class TaskSnapshotSurface implements StartingSurface {
// Local call.
}
final TaskSnapshotSurface snapshotSurface = new TaskSnapshotSurface(service, window,
- surface, snapshot, layoutParams.getTitle(), backgroundColor, statusBarColor,
+ surfaceControl, snapshot, layoutParams.getTitle(), backgroundColor, statusBarColor,
navigationBarColor, sysUiVis, windowFlags, windowPrivateFlags, taskBounds,
currentOrientation);
window.setOuter(snapshotSurface);
try {
session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, -1,
tmpFrame, tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect,
- tmpCutout, tmpMergedConfiguration, surface, mTmpInsetsState);
+ tmpCutout, tmpMergedConfiguration, surfaceControl, mTmpInsetsState);
} catch (RemoteException e) {
// Local call.
}
@@ -230,15 +231,16 @@ class TaskSnapshotSurface implements StartingSurface {
}
@VisibleForTesting
- TaskSnapshotSurface(WindowManagerService service, Window window, Surface surface,
+ TaskSnapshotSurface(WindowManagerService service, Window window, SurfaceControl surfaceControl,
TaskSnapshot snapshot, CharSequence title, int backgroundColor, int statusBarColor,
int navigationBarColor, int sysUiVis, int windowFlags, int windowPrivateFlags,
Rect taskBounds, int currentOrientation) {
mService = service;
+ mSurface = new Surface();
mHandler = new Handler(mService.mH.getLooper());
mSession = WindowManagerGlobal.getWindowSession();
mWindow = window;
- mSurface = surface;
+ mSurfaceControl = surfaceControl;
mSnapshot = snapshot;
mTitle = title;
mBackgroundPaint.setColor(backgroundColor != 0 ? backgroundColor : WHITE);
@@ -281,6 +283,8 @@ class TaskSnapshotSurface implements StartingSurface {
private void drawSnapshot() {
final GraphicBuffer buffer = mSnapshot.getSnapshot();
+ mSurface.copyFrom(mSurfaceControl);
+
if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Drawing snapshot surface sizeMismatch="
+ mSizeMismatch);
if (mSizeMismatch) {
@@ -310,13 +314,14 @@ class TaskSnapshotSurface implements StartingSurface {
if (!mSurface.isValid()) {
throw new IllegalStateException("mSurface does not hold a valid surface.");
}
- final SurfaceSession session = new SurfaceSession(mSurface);
+ final SurfaceSession session = new SurfaceSession();
// Keep a reference to it such that it doesn't get destroyed when finalized.
mChildSurfaceControl = new SurfaceControl.Builder(session)
.setName(mTitle + " - task-snapshot-surface")
.setBufferSize(buffer.getWidth(), buffer.getHeight())
.setFormat(buffer.getFormat())
+ .setParent(mSurfaceControl)
.build();
Surface surface = new Surface();
surface.copyFrom(mChildSurfaceControl);
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index ee74bdfaa113..8ed7d04f026d 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -21,6 +21,7 @@ import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LE
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
@@ -33,6 +34,10 @@ import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_RIGHT;
import static android.view.WindowManager.DOCKED_TOP;
+import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
+import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
+import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
+import static com.android.server.wm.BoundsAnimationController.SchedulePipModeChangedState;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS;
import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME;
@@ -47,10 +52,12 @@ import static com.android.server.wm.StackProto.ID;
import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT;
import static com.android.server.wm.StackProto.TASKS;
import static com.android.server.wm.StackProto.WINDOW_CONTAINER;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.CallSuper;
+import android.app.RemoteAction;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
@@ -71,9 +78,10 @@ import com.android.internal.policy.DockedDividerUtils;
import com.android.server.EventLogTags;
import java.io.PrintWriter;
+import java.util.List;
public class TaskStack extends WindowContainer<Task> implements
- BoundsAnimationTarget {
+ BoundsAnimationTarget, ConfigurationContainerListener {
/** Minimum size of an adjusted stack bounds relative to original stack bounds. Used to
* restrict IME adjustment so that a min portion of top stack remains visible.*/
private static final float ADJUSTED_STACK_FRACTION_MIN = 0.3f;
@@ -93,6 +101,10 @@ public class TaskStack extends WindowContainer<Task> implements
private Rect mTmpRect2 = new Rect();
private Rect mTmpRect3 = new Rect();
+ /** For Pinned stack controlling. */
+ private Rect mTmpFromBounds = new Rect();
+ private Rect mTmpToBounds = new Rect();
+
/** Stack bounds adjusted to screen content area (taking into account IM windows, etc.) */
private final Rect mAdjustedBounds = new Rect();
@@ -141,6 +153,9 @@ public class TaskStack extends WindowContainer<Task> implements
private Dimmer mDimmer = new Dimmer(this);
+ // TODO: remove after unification.
+ ActivityStack mActivityStack;
+
/**
* For {@link #prepareSurfaces}.
*/
@@ -150,10 +165,11 @@ public class TaskStack extends WindowContainer<Task> implements
private final AnimatingAppWindowTokenRegistry mAnimatingAppWindowTokenRegistry =
new AnimatingAppWindowTokenRegistry();
- TaskStack(WindowManagerService service, int stackId, StackWindowController controller) {
+ TaskStack(WindowManagerService service, int stackId, ActivityStack activityStack) {
super(service);
mStackId = stackId;
- setController(controller);
+ mActivityStack = activityStack;
+ activityStack.registerConfigurationChangeListener(this);
mDockedStackMinimizeThickness = service.mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.docked_stack_minimize_thickness);
EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId);
@@ -572,6 +588,49 @@ public class TaskStack extends WindowContainer<Task> implements
positionChildAt(position, task, moveParents /* includingParents */, showForAllUsers);
}
+ void positionChildAt(Task child, int position) {
+ if (DEBUG_STACK) {
+ Slog.i(TAG_WM, "positionChildAt: positioning task=" + child + " at " + position);
+ }
+ if (child == null) {
+ if (DEBUG_STACK) {
+ Slog.i(TAG_WM, "positionChildAt: could not find task=" + this);
+ }
+ return;
+ }
+ child.positionAt(position);
+ getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
+ }
+
+ void positionChildAtTop(Task child, boolean includingParents) {
+ if (child == null) {
+ // TODO: Fix the call-points that cause this to happen.
+ return;
+ }
+
+ positionChildAt(POSITION_TOP, child, includingParents);
+
+ final DisplayContent displayContent = getDisplayContent();
+ if (displayContent.mAppTransition.isTransitionSet()) {
+ child.setSendingToBottom(false);
+ }
+ displayContent.layoutAndAssignWindowLayersIfNeeded();
+ }
+
+ void positionChildAtBottom(Task child, boolean includingParents) {
+ if (child == null) {
+ // TODO: Fix the call-points that cause this to happen.
+ return;
+ }
+
+ positionChildAt(POSITION_BOTTOM, child, includingParents);
+
+ if (getDisplayContent().mAppTransition.isTransitionSet()) {
+ child.setSendingToBottom(true);
+ }
+ getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
+ }
+
@Override
void positionChildAt(int position, Task child, boolean includingParents) {
positionChildAt(position, child, includingParents, child.showForAllUsers());
@@ -596,6 +655,21 @@ public class TaskStack extends WindowContainer<Task> implements
EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, child.mTaskId, toTop, targetPosition);
}
+ void reparent(int displayId, Rect outStackBounds, boolean onTop) {
+ final DisplayContent targetDc = mWmService.mRoot.getDisplayContent(displayId);
+ if (targetDc == null) {
+ throw new IllegalArgumentException("Trying to move stackId=" + mStackId
+ + " to unknown displayId=" + displayId);
+ }
+
+ targetDc.moveStackToDisplay(this, onTop);
+ if (matchParentBounds()) {
+ outStackBounds.setEmpty();
+ } else {
+ getRawBounds(outStackBounds);
+ }
+ }
+
// TODO: We should really have users as a window container in the hierarchy so that we don't
// have to do complicated things like we are doing in this method.
private int findPositionForTask(Task task, int targetPosition, boolean showForAllUsers,
@@ -725,6 +799,23 @@ public class TaskStack extends WindowContainer<Task> implements
}
/**
+ * Re-sizes a stack and its containing tasks.
+ *
+ * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
+ * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
+ * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
+ */
+ void resize(Rect bounds, SparseArray<Rect> taskBounds,
+ SparseArray<Rect> taskTempInsetBounds) {
+ // We might trigger a configuration change. Save the current task bounds for freezing.
+ prepareFreezingTaskBounds();
+ if (setBounds(bounds, taskBounds, taskTempInsetBounds) && isVisible()) {
+ getDisplayContent().setLayoutNeeded();
+ mWmService.mWindowPlacerLocked.performSurfacePlacement();
+ }
+ }
+
+ /**
* Calculate an amount by which to expand the stack bounds in each direction.
* Used to make room for shadows in the pinned windowing mode.
*/
@@ -929,12 +1020,7 @@ public class TaskStack extends WindowContainer<Task> implements
(dockedStack == null || dockedStack == this) ? null : dockedStack.getRawBounds();
getStackDockedModeBoundsLocked(mDisplayContent.getConfiguration(), dockedBounds,
null /* currentTempTaskBounds */, bounds, tempBounds);
- getController().requestResize(bounds);
- }
-
- @Override
- StackWindowController getController() {
- return (StackWindowController) super.getController();
+ mActivityStack.requestResize(bounds);
}
@Override
@@ -947,6 +1033,14 @@ public class TaskStack extends WindowContainer<Task> implements
}
@Override
+ void removeImmediately() {
+ if (mActivityStack != null) {
+ mActivityStack.unregisterConfigurationChangeListener(this);
+ }
+ super.removeImmediately();
+ }
+
+ @Override
void onParentSet() {
super.onParentSet();
@@ -1572,14 +1666,13 @@ public class TaskStack extends WindowContainer<Task> implements
// I don't believe you...
}
- final PinnedStackWindowController controller =
- (PinnedStackWindowController) getController();
- if (schedulePipModeChangedCallback && controller != null) {
+ if (schedulePipModeChangedCallback && mActivityStack != null) {
// We need to schedule the PiP mode change before the animation up. It is possible
// in this case for the animation down to not have been completed, so always
// force-schedule and update to the client to ensure that it is notified that it
// is no longer in picture-in-picture mode
- controller.updatePictureInPictureModeForPinnedStackAnimation(null, forceUpdate);
+ mActivityStack.updatePictureInPictureModeForPinnedStackAnimation(null,
+ forceUpdate);
}
}
return true;
@@ -1592,12 +1685,10 @@ public class TaskStack extends WindowContainer<Task> implements
// Update to the final bounds if requested. This is done here instead of in the bounds
// animator to allow us to coordinate this after we notify the PiP mode changed
- final PinnedStackWindowController controller =
- (PinnedStackWindowController) getController();
- if (schedulePipModeChangedCallback && controller != null) {
+ if (schedulePipModeChangedCallback) {
// We need to schedule the PiP mode change after the animation down, so use the
// final bounds
- controller.updatePictureInPictureModeForPinnedStackAnimation(
+ mActivityStack.updatePictureInPictureModeForPinnedStackAnimation(
mBoundsAnimationTarget, false /* forceUpdate */);
}
@@ -1624,6 +1715,135 @@ public class TaskStack extends WindowContainer<Task> implements
}
}
+ /**
+ * @return the current stack bounds transformed to the given {@param aspectRatio}. If
+ * the default bounds is {@code null}, then the {@param aspectRatio} is applied to the
+ * default bounds.
+ */
+ Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) {
+ if (!mWmService.mSupportsPictureInPicture) {
+ return null;
+ }
+
+ final DisplayContent displayContent = getDisplayContent();
+ if (displayContent == null) {
+ return null;
+ }
+
+ if (!inPinnedWindowingMode()) {
+ return null;
+ }
+
+ final PinnedStackController pinnedStackController =
+ displayContent.getPinnedStackController();
+ if (stackBounds == null) {
+ // Calculate the aspect ratio bounds from the default bounds
+ stackBounds = pinnedStackController.getDefaultOrLastSavedBounds();
+ }
+
+ if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
+ return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio,
+ true /* useCurrentMinEdgeSize */);
+ } else {
+ return stackBounds;
+ }
+ }
+
+ /**
+ * Animates the pinned stack.
+ */
+ void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
+ int animationDuration, boolean fromFullscreen) {
+ if (!inPinnedWindowingMode()) {
+ return;
+ }
+ // Get the from-bounds
+ final Rect fromBounds = new Rect();
+ getBounds(fromBounds);
+
+ // Get non-null fullscreen to-bounds for animating if the bounds are null
+ @SchedulePipModeChangedState int schedulePipModeChangedState =
+ NO_PIP_MODE_CHANGED_CALLBACKS;
+ final boolean toFullscreen = toBounds == null;
+ if (toFullscreen) {
+ if (fromFullscreen) {
+ throw new IllegalArgumentException("Should not defer scheduling PiP mode"
+ + " change on animation to fullscreen.");
+ }
+ schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START;
+
+ mWmService.getStackBounds(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mTmpToBounds);
+ if (!mTmpToBounds.isEmpty()) {
+ // If there is a fullscreen bounds, use that
+ toBounds = new Rect(mTmpToBounds);
+ } else {
+ // Otherwise, use the display bounds
+ toBounds = new Rect();
+ getDisplayContent().getBounds(toBounds);
+ }
+ } else if (fromFullscreen) {
+ schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END;
+ }
+
+ setAnimationFinalBounds(sourceHintBounds, toBounds, toFullscreen);
+
+ final Rect finalToBounds = toBounds;
+ final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
+ schedulePipModeChangedState;
+ final DisplayContent displayContent = getDisplayContent();
+ displayContent.mBoundsAnimationController.getHandler().post(() -> {
+ displayContent.mBoundsAnimationController.animateBounds(this, fromBounds,
+ finalToBounds, animationDuration, finalSchedulePipModeChangedState,
+ fromFullscreen, toFullscreen);
+ });
+ }
+
+ /**
+ * Sets the current picture-in-picture aspect ratio.
+ */
+ void setPictureInPictureAspectRatio(float aspectRatio) {
+ if (!mWmService.mSupportsPictureInPicture) {
+ return;
+ }
+
+ if (!inPinnedWindowingMode()) {
+ return;
+ }
+
+ final PinnedStackController pinnedStackController =
+ getDisplayContent().getPinnedStackController();
+
+ if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) == 0) {
+ return;
+ }
+ getAnimationOrCurrentBounds(mTmpFromBounds);
+ mTmpToBounds.set(mTmpFromBounds);
+ getPictureInPictureBounds(aspectRatio, mTmpToBounds);
+ if (!mTmpToBounds.equals(mTmpFromBounds)) {
+ animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */,
+ -1 /* duration */, false /* fromFullscreen */);
+ }
+ pinnedStackController.setAspectRatio(
+ pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
+ ? aspectRatio : -1f);
+ }
+
+ /**
+ * Sets the current picture-in-picture actions.
+ */
+ void setPictureInPictureActions(List<RemoteAction> actions) {
+ if (!mWmService.mSupportsPictureInPicture) {
+ return;
+ }
+
+ if (!inPinnedWindowingMode()) {
+ return;
+ }
+
+ getDisplayContent().getPinnedStackController().setActions(actions);
+ }
+
@Override
public boolean isAttached() {
synchronized (mWmService.mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index fdb49e98a70b..06f602741adb 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -35,6 +35,10 @@ import com.android.server.wm.ActivityStackSupervisor;
import com.android.server.wm.ActivityDisplay;
import android.util.BoostFramework;
+/**
+ * 1. Adjust the top most focus display if touch down on some display.
+ * 2. Adjust the pointer icon when cursor moves to the task bounds.
+ */
public class TaskTapPointerEventListener implements PointerEventListener {
private final Region mTouchExcludeRegion = new Region();
@@ -72,7 +76,7 @@ public class TaskTapPointerEventListener implements PointerEventListener {
return;
}
WindowContainer parent = mDisplayContent.getParent();
- if (parent != null) {
+ if (parent != null && parent.getTopChild() != mDisplayContent) {
parent.positionChildAt(WindowContainer.POSITION_TOP, mDisplayContent,
true /* includingParents */);
}
@@ -88,8 +92,7 @@ public class TaskTapPointerEventListener implements PointerEventListener {
if (motionEvent.getDisplayId() != getDisplayId()) {
return;
}
- final int action = motionEvent.getAction();
- switch (action & MotionEvent.ACTION_MASK) {
+ switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
final int x = (int) motionEvent.getX();
final int y = (int) motionEvent.getY();
@@ -105,7 +108,7 @@ public class TaskTapPointerEventListener implements PointerEventListener {
}
}
break;
-
+ case MotionEvent.ACTION_HOVER_ENTER:
case MotionEvent.ACTION_HOVER_MOVE: {
final int x = (int) motionEvent.getX();
final int y = (int) motionEvent.getY();
@@ -133,6 +136,7 @@ public class TaskTapPointerEventListener implements PointerEventListener {
mPointerIconType = iconType;
if (mPointerIconType == TYPE_NOT_SPECIFIED) {
// Find the underlying window and ask it restore the pointer icon.
+ mService.mH.removeMessages(H.RESTORE_POINTER_ICON);
mService.mH.obtainMessage(H.RESTORE_POINTER_ICON,
x, y, mDisplayContent).sendToTarget();
} else {
@@ -141,6 +145,18 @@ public class TaskTapPointerEventListener implements PointerEventListener {
}
}
break;
+ case MotionEvent.ACTION_HOVER_EXIT: {
+ final int x = (int) motionEvent.getX();
+ final int y = (int) motionEvent.getY();
+ if (mPointerIconType != TYPE_NOT_SPECIFIED) {
+ mPointerIconType = TYPE_NOT_SPECIFIED;
+ // Find the underlying window and ask it to restore the pointer icon.
+ mService.mH.removeMessages(H.RESTORE_POINTER_ICON);
+ mService.mH.obtainMessage(H.RESTORE_POINTER_ICON,
+ x, y, mDisplayContent).sendToTarget();
+ }
+ }
+ break;
}
if (ActivityStackSupervisor.mIsPerfBoostAcquired && (mPerfObj != null)) {
if (ActivityStackSupervisor.mPerfHandle > 0) {
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 32c5a3b8688e..19058776d187 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -326,7 +326,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
if (mSurfaceControl != null) {
- mPendingTransaction.destroy(mSurfaceControl);
+ mPendingTransaction.reparent(mSurfaceControl, null);
// Merge to parent transaction to ensure the transactions on this WindowContainer are
// applied in native even if WindowContainer is removed.
@@ -437,6 +437,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
if (mChildren.peekLast() != child) {
mChildren.remove(child);
mChildren.add(child);
+ onChildPositionChanged();
}
if (includingParents && getParent() != null) {
getParent().positionChildAt(POSITION_TOP, this /* child */,
@@ -447,6 +448,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
if (mChildren.peekFirst() != child) {
mChildren.remove(child);
mChildren.addFirst(child);
+ onChildPositionChanged();
}
if (includingParents && getParent() != null) {
getParent().positionChildAt(POSITION_BOTTOM, this /* child */,
@@ -460,8 +462,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
// doing this adjustment here and remove any adjustments in the callers.
mChildren.remove(child);
mChildren.add(position, child);
+ onChildPositionChanged();
}
- onChildPositionChanged();
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 646fdd960adc..1691dc0e3806 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -158,8 +158,9 @@ public abstract class WindowManagerInternal {
default boolean registerInputChannel(
DragState state, Display display, InputManagerService service,
InputChannel source) {
+ state.mTransferTouchFromToken = source.getToken();
state.register(display);
- return service.transferTouchFocus(source, state.getInputChannel());
+ return true;
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index cfbf3eaf0d2a..8ba5592fe834 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -727,7 +727,7 @@ public class WindowManagerService extends IWindowManager.Stub
void updateSystemUiSettings() {
boolean changed;
- synchronized (mWindowMap) {
+ synchronized (mGlobalLock) {
changed = ImmersiveModeConfirmation.loadSetting(mCurrentUserId, mContext)
|| PolicyControl.reloadFromSetting(mContext);
}
@@ -1878,7 +1878,7 @@ public class WindowManagerService extends IWindowManager.Stub
long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Rect outVisibleInsets, Rect outStableInsets, Rect outOutsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
- Surface outSurface, InsetsState outInsetsState) {
+ SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
int result = 0;
boolean configChanged;
final boolean hasStatusBarPermission =
@@ -2051,7 +2051,7 @@ public class WindowManagerService extends IWindowManager.Stub
result = win.relayoutVisibleWindow(result, attrChanges, oldVisibility);
try {
- result = createSurfaceControl(outSurface, result, win, winAnimator);
+ result = createSurfaceControl(outSurfaceControl, result, win, winAnimator);
} catch (Exception e) {
displayContent.getInputMonitor().updateInputWindowsLw(true /*force*/);
@@ -2082,7 +2082,7 @@ public class WindowManagerService extends IWindowManager.Stub
// handled yet, or it might want to draw a last frame. If we already have a
// surface, let the client use that, but don't create new surface at this point.
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "relayoutWindow: getSurface");
- winAnimator.mSurfaceController.getSurface(outSurface);
+ winAnimator.mSurfaceController.getSurfaceControl(outSurfaceControl);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
} else {
if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win);
@@ -2090,7 +2090,7 @@ public class WindowManagerService extends IWindowManager.Stub
try {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "wmReleaseOutSurface_"
+ win.mAttrs.getTitle());
- outSurface.release();
+ outSurfaceControl.release();
} finally {
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
@@ -2186,7 +2186,7 @@ public class WindowManagerService extends IWindowManager.Stub
+ ", requestedHeight=" + requestedHeight
+ ", viewVisibility=" + viewVisibility
+ "\nRelayout returning frame=" + outFrame
- + ", surface=" + outSurface);
+ + ", surface=" + outSurfaceControl);
if (localLOGV || DEBUG_FOCUS) Slog.v(
TAG_WM, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
@@ -2256,7 +2256,7 @@ public class WindowManagerService extends IWindowManager.Stub
return focusMayChange;
}
- private int createSurfaceControl(Surface outSurface, int result, WindowState win,
+ private int createSurfaceControl(SurfaceControl outSurfaceControl, int result, WindowState win,
WindowStateAnimator winAnimator) {
if (!win.mHasSurface) {
result |= RELAYOUT_RES_SURFACE_CHANGED;
@@ -2270,13 +2270,13 @@ public class WindowManagerService extends IWindowManager.Stub
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
if (surfaceController != null) {
- surfaceController.getSurface(outSurface);
- if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " OUT SURFACE " + outSurface + ": copied");
+ surfaceController.getSurfaceControl(outSurfaceControl);
+ if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " OUT SURFACE " + outSurfaceControl + ": copied");
} else {
// For some reason there isn't a surface. Clear the
// caller's object so they see the same state.
Slog.w(TAG_WM, "Failed to create surface control for " + win);
- outSurface.release();
+ outSurfaceControl.release();
}
return result;
@@ -2633,12 +2633,23 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void onUserSwitched() {
mSettingsObserver.updateSystemUiSettings();
- synchronized (mWindowMap) {
+ synchronized (mGlobalLock) {
// force a re-application of focused window sysui visibility on each display.
mRoot.forAllDisplayPolicies(DisplayPolicy::resetSystemUiVisibilityLw);
}
}
+ @Override
+ public void moveDisplayToTop(int displayId) {
+ synchronized (mGlobalLock) {
+ final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+ if (displayContent != null && mRoot.getTopChild() != displayContent) {
+ mRoot.positionChildAt(WindowContainer.POSITION_TOP, displayContent,
+ true /* includingParents */);
+ }
+ }
+ }
+
/**
* Starts deferring layout passes. Useful when doing multiple changes but to optimize
* performance, only one layout pass should be done. This can be called multiple times, and
@@ -2655,28 +2666,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
/**
- * @return true if the activity contains windows that have
- * {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} set
- */
- public boolean containsShowWhenLockedWindow(IBinder token) {
- synchronized (mGlobalLock) {
- final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
- return wtoken != null && wtoken.containsShowWhenLockedWindow();
- }
- }
-
- /**
- * @return true if the activity contains windows that have
- * {@link LayoutParams#FLAG_DISMISS_KEYGUARD} set
- */
- public boolean containsDismissKeyguardWindow(IBinder token) {
- synchronized (mGlobalLock) {
- final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
- return wtoken != null && wtoken.containsDismissKeyguardWindow();
- }
- }
-
- /**
* Notifies activity manager that some Keyguard flags have changed and that it needs to
* reevaluate the visibilities of the activities.
* @param callback Runnable to be called when activity manager is done reevaluating visibilities
@@ -5767,17 +5756,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
/**
- * Returns true if the callingUid has any window currently visible to the user.
- */
- public boolean isAnyWindowVisibleForUid(int callingUid) {
- synchronized (mGlobalLock) {
- return mRoot.forAllWindows(w -> {
- return w.getOwningUid() == callingUid && w.isVisible();
- }, true /* traverseTopToBottom */);
- }
- }
-
- /**
* Called when a task has been removed from the recent tasks list.
* <p>
* Note: This doesn't go through {@link TaskWindowContainerController} yet as the window
@@ -5994,8 +5972,6 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" apps="); pw.print(mAppsFreezingScreen);
final DisplayContent defaultDisplayContent = getDefaultDisplayContentLocked();
pw.print(" mRotation="); pw.print(defaultDisplayContent.getRotation());
- pw.print(" mAltOrientation=");
- pw.println(defaultDisplayContent.getAltOrientation());
pw.print(" mLastWindowForcedOrientation=");
pw.print(defaultDisplayContent.getLastWindowForcedOrientation());
pw.print(" mLastOrientation=");
@@ -6195,7 +6171,7 @@ public class WindowManagerService extends IWindowManager.Stub
dumpWindowsLocked(pw, true, null);
}
return;
- } else if ("all".equals(cmd) || "a".equals(cmd)) {
+ } else if ("all".equals(cmd)) {
synchronized (mGlobalLock) {
dumpWindowsLocked(pw, true, null);
}
@@ -6441,7 +6417,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
void setForceDesktopModeOnExternalDisplays(boolean forceDesktopModeOnExternalDisplays) {
- synchronized (mWindowMap) {
+ synchronized (mGlobalLock) {
mForceDesktopModeOnExternalDisplays = forceDesktopModeOnExternalDisplays;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index cd29b3c29248..8f86c003e4b0 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2405,6 +2405,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
&& !cantReceiveTouchInput();
}
+ @Override
+ public boolean canShowWhenLocked() {
+ final boolean showBecauseOfActivity =
+ mAppToken != null && mAppToken.mActivityRecord.canShowWhenLocked();
+ final boolean showBecauseOfWindow = (getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0;
+ return showBecauseOfActivity || showBecauseOfWindow;
+ }
+
/** @return false if this window desires touch events. */
boolean cantReceiveTouchInput() {
return mAppToken != null && mAppToken.getTask() != null
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index ce627e23e6ee..c2a8e7efb5a5 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -478,8 +478,8 @@ class WindowSurfaceController {
return mSurfaceControl.getHandle();
}
- void getSurface(Surface outSurface) {
- outSurface.copyFrom(mSurfaceControl);
+ void getSurfaceControl(SurfaceControl outSurfaceControl) {
+ outSurfaceControl.copyFrom(mSurfaceControl);
}
int getLayer() {
diff --git a/services/core/java/com/android/server/wm/WindowTraceBuffer.java b/services/core/java/com/android/server/wm/WindowTraceBuffer.java
new file mode 100644
index 000000000000..936ee85697b8
--- /dev/null
+++ b/services/core/java/com/android/server/wm/WindowTraceBuffer.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
+
+import android.os.Trace;
+import android.util.proto.ProtoOutputStream;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Buffer used for window tracing.
+ */
+abstract class WindowTraceBuffer {
+ private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
+
+ final Object mBufferSizeLock = new Object();
+ final BlockingQueue<byte[]> mBuffer;
+ int mBufferSize;
+ private final int mBufferCapacity;
+ private final File mTraceFile;
+
+ WindowTraceBuffer(int size, File traceFile) throws IOException {
+ mBufferCapacity = size;
+ mTraceFile = traceFile;
+ mBuffer = new LinkedBlockingQueue<>();
+
+ initTraceFile();
+ }
+
+ int getAvailableSpace() {
+ return mBufferCapacity - mBufferSize;
+ }
+
+ /**
+ * Inserts the specified element into this buffer.
+ *
+ * This method is synchronized with {@code #take()} and {@code #clear()}
+ * for consistency.
+ *
+ * @param proto the element to add
+ * @return {@code true} if the inserted item was inserted into the buffer
+ * @throws IllegalStateException if the element cannot be added because it is larger
+ * than the buffer size.
+ */
+ boolean add(ProtoOutputStream proto) throws InterruptedException {
+ byte[] protoBytes = proto.getBytes();
+ int protoLength = protoBytes.length;
+ if (protoLength > mBufferCapacity) {
+ throw new IllegalStateException("Trace object too large for the buffer. Buffer size:"
+ + mBufferCapacity + " Object size: " + protoLength);
+ }
+ synchronized (mBufferSizeLock) {
+ boolean canAdd = canAdd(protoBytes);
+ if (canAdd) {
+ mBuffer.offer(protoBytes);
+ mBufferSize += protoLength;
+ }
+ return canAdd;
+ }
+ }
+
+ void writeNextBufferElementToFile() throws IOException {
+ byte[] proto;
+ try {
+ proto = take();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return;
+ }
+
+ try {
+ Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "writeToFile");
+ try (OutputStream os = new FileOutputStream(mTraceFile, true)) {
+ os.write(proto);
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
+ }
+ }
+
+ /**
+ * Retrieves and removes the head of this queue, waiting if necessary
+ * until an element becomes available.
+ *
+ * This method is synchronized with {@code #add(ProtoOutputStream)} and {@code #clear()}
+ * for consistency.
+ *
+ * @return the head of this buffer, or {@code null} if this buffer is empty
+ */
+ private byte[] take() throws InterruptedException {
+ byte[] item = mBuffer.take();
+ synchronized (mBufferSizeLock) {
+ mBufferSize -= item.length;
+ return item;
+ }
+ }
+
+ private void initTraceFile() throws IOException {
+ mTraceFile.delete();
+ try (OutputStream os = new FileOutputStream(mTraceFile)) {
+ mTraceFile.setReadable(true, false);
+ ProtoOutputStream proto = new ProtoOutputStream(os);
+ proto.write(MAGIC_NUMBER, MAGIC_NUMBER_VALUE);
+ proto.flush();
+ }
+ }
+
+ /**
+ * Checks if the element can be added to the buffer. The element is already certain to be
+ * smaller than the overall buffer size.
+ *
+ * @param protoBytes byte array representation of the Proto object to add
+ * @return <tt>true<</tt> if the element can be added to the buffer or not
+ */
+ abstract boolean canAdd(byte[] protoBytes) throws InterruptedException;
+
+ /**
+ * Flush all buffer content to the disk.
+ *
+ * @throws IOException if the buffer cannot write its contents to the {@link #mTraceFile}
+ */
+ abstract void writeToDisk() throws IOException, InterruptedException;
+
+ /**
+ * Builder for a {@code WindowTraceBuffer} which creates a {@link WindowTraceQueueBuffer}
+ */
+ static class Builder {
+ private File mTraceFile;
+ private int mBufferCapacity;
+
+
+ Builder setTraceFile(File traceFile) {
+ mTraceFile = traceFile;
+ return this;
+ }
+
+ Builder setBufferCapacity(int size) {
+ mBufferCapacity = size;
+ return this;
+ }
+
+ File getFile() {
+ return mTraceFile;
+ }
+
+ WindowTraceBuffer build() throws IOException {
+ if (mBufferCapacity <= 0) {
+ throw new IllegalStateException("Buffer capacity must be greater than 0.");
+ }
+
+ if (mTraceFile == null) {
+ throw new IllegalArgumentException("A valid trace file must be specified.");
+ }
+
+ return new WindowTraceQueueBuffer(mBufferCapacity, mTraceFile);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java b/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java
new file mode 100644
index 000000000000..b7fc7ac8cb5e
--- /dev/null
+++ b/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static android.os.Build.IS_USER;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * A buffer structure backed by a {@link java.util.concurrent.BlockingQueue} to store the first
+ * {@code #size size} bytes of window trace elements.
+ * Once the buffer is full it will no longer accepts new elements.
+ */
+class WindowTraceQueueBuffer extends WindowTraceBuffer {
+ private Thread mWriterThread;
+ private boolean mCancel;
+
+ @VisibleForTesting
+ WindowTraceQueueBuffer(int size, File traceFile, boolean startWriterThread) throws IOException {
+ super(size, traceFile);
+ if (startWriterThread) {
+ initializeWriterThread();
+ }
+ }
+
+ WindowTraceQueueBuffer(int size, File traceFile) throws IOException {
+ this(size, traceFile, !IS_USER);
+ }
+
+ private void initializeWriterThread() {
+ mCancel = false;
+ mWriterThread = new Thread(() -> {
+ try {
+ loop();
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to execute trace write loop thread", e);
+ }
+ }, "window_tracing");
+ mWriterThread.start();
+ }
+
+ private void loop() throws IOException {
+ while (!mCancel) {
+ writeNextBufferElementToFile();
+ }
+ }
+
+ private void restartWriterThread() throws InterruptedException {
+ if (mWriterThread != null) {
+ mCancel = true;
+ mWriterThread.interrupt();
+ mWriterThread.join();
+ initializeWriterThread();
+ }
+ }
+
+ @Override
+ boolean canAdd(byte[] protoBytes) {
+ long availableSpace = getAvailableSpace();
+ return availableSpace >= protoBytes.length;
+ }
+
+ @Override
+ void writeToDisk() throws InterruptedException {
+ while (!mBuffer.isEmpty()) {
+ mBufferSizeLock.wait();
+ mBufferSizeLock.notify();
+ }
+ restartWriterThread();
+ }
+}
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index 8fa56bb065c6..63539c4f9fd9 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -17,31 +17,23 @@
package com.android.server.wm;
import static android.os.Build.IS_USER;
+
import static com.android.server.wm.WindowManagerTraceFileProto.ENTRY;
-import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER;
-import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
-import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
import static com.android.server.wm.WindowManagerTraceProto.ELAPSED_REALTIME_NANOS;
import static com.android.server.wm.WindowManagerTraceProto.WHERE;
import static com.android.server.wm.WindowManagerTraceProto.WINDOW_MANAGER_SERVICE;
+import android.annotation.Nullable;
import android.content.Context;
import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.Trace;
-import android.annotation.Nullable;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
import java.io.PrintWriter;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
/**
* A class that allows window manager to dump its state continuously to a trace file, such that a
@@ -49,35 +41,42 @@ import java.util.concurrent.BlockingQueue;
*/
class WindowTracing {
+ /**
+ * Maximum buffer size, currently defined as 512 KB
+ * Size was experimentally defined to fit between 100 to 150 elements.
+ */
+ private static final int WINDOW_TRACE_BUFFER_SIZE = 512 * 1024;
private static final String TAG = "WindowTracing";
- private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
private final Object mLock = new Object();
- private final File mTraceFile;
- private final BlockingQueue<ProtoOutputStream> mWriteQueue = new ArrayBlockingQueue<>(200);
+ private final WindowTraceBuffer.Builder mBufferBuilder;
+
+ private WindowTraceBuffer mTraceBuffer;
private boolean mEnabled;
private volatile boolean mEnabledLockFree;
WindowTracing(File file) {
- mTraceFile = file;
+ mBufferBuilder = new WindowTraceBuffer.Builder()
+ .setTraceFile(file)
+ .setBufferCapacity(WINDOW_TRACE_BUFFER_SIZE);
}
void startTrace(@Nullable PrintWriter pw) throws IOException {
- if (IS_USER){
+ if (IS_USER) {
logAndPrintln(pw, "Error: Tracing is not supported on user builds.");
return;
}
synchronized (mLock) {
- logAndPrintln(pw, "Start tracing to " + mTraceFile + ".");
- mWriteQueue.clear();
- mTraceFile.delete();
- try (OutputStream os = new FileOutputStream(mTraceFile)) {
- mTraceFile.setReadable(true, false);
- ProtoOutputStream proto = new ProtoOutputStream(os);
- proto.write(MAGIC_NUMBER, MAGIC_NUMBER_VALUE);
- proto.flush();
+ logAndPrintln(pw, "Start tracing to " + mBufferBuilder.getFile() + ".");
+ if (mTraceBuffer != null) {
+ try {
+ mTraceBuffer.writeToDisk();
+ } catch (InterruptedException e) {
+ logAndPrintln(pw, "Error: Unable to flush the previous buffer.");
+ }
}
+ mTraceBuffer = mBufferBuilder.build();
mEnabled = mEnabledLockFree = true;
}
}
@@ -91,67 +90,42 @@ class WindowTracing {
}
void stopTrace(@Nullable PrintWriter pw) {
- if (IS_USER){
+ if (IS_USER) {
logAndPrintln(pw, "Error: Tracing is not supported on user builds.");
return;
}
synchronized (mLock) {
- logAndPrintln(pw, "Stop tracing to " + mTraceFile + ". Waiting for traces to flush.");
+ logAndPrintln(pw, "Stop tracing to " + mBufferBuilder.getFile()
+ + ". Waiting for traces to flush.");
mEnabled = mEnabledLockFree = false;
- while (!mWriteQueue.isEmpty()) {
+
+ synchronized (mLock) {
if (mEnabled) {
logAndPrintln(pw, "ERROR: tracing was re-enabled while waiting for flush.");
throw new IllegalStateException("tracing enabled while waiting for flush.");
}
try {
- mLock.wait();
- mLock.notify();
+ mTraceBuffer.writeToDisk();
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to write buffer to file", e);
} catch (InterruptedException e) {
- Thread.currentThread().interrupt();
+ Log.e(TAG, "Unable to interrupt window tracing file write thread", e);
}
}
- logAndPrintln(pw, "Trace written to " + mTraceFile + ".");
+ logAndPrintln(pw, "Trace written to " + mBufferBuilder.getFile() + ".");
}
}
- void appendTraceEntry(ProtoOutputStream proto) {
+ private void appendTraceEntry(ProtoOutputStream proto) {
if (!mEnabledLockFree) {
return;
}
- if (!mWriteQueue.offer(proto)) {
- Log.e(TAG, "Dropping window trace entry, queue full");
- }
- }
-
- void loop() {
- for (;;) {
- loopOnce();
- }
- }
-
- @VisibleForTesting
- void loopOnce() {
- ProtoOutputStream proto;
try {
- proto = mWriteQueue.take();
+ mTraceBuffer.add(proto);
} catch (InterruptedException e) {
+ Log.e(TAG, "Unable to add element to trace", e);
Thread.currentThread().interrupt();
- return;
- }
-
- synchronized (mLock) {
- try {
- Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "writeToFile");
- try (OutputStream os = new FileOutputStream(mTraceFile, true /* append */)) {
- os.write(proto.getBytes());
- }
- } catch (IOException e) {
- Log.e(TAG, "Failed to write file " + mTraceFile, e);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
- }
- mLock.notify();
}
}
@@ -161,11 +135,7 @@ class WindowTracing {
static WindowTracing createDefaultAndStartLooper(Context context) {
File file = new File("/data/misc/wmtrace/wm_trace.pb");
- WindowTracing windowTracing = new WindowTracing(file);
- if (!IS_USER){
- new Thread(windowTracing::loop, "window_tracing").start();
- }
- return windowTracing;
+ return new WindowTracing(file);
}
int onShellCommand(ShellCommand shell, String cmd) {
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index b4fe83704ff2..fb00aebb622f 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -107,6 +107,8 @@ cc_defaults {
"android.hardware.gnss@1.0",
"android.hardware.gnss@1.1",
"android.hardware.gnss@2.0",
+ "android.hardware.gnss.visibility_control@1.0",
+ "android.hardware.input.classifier@1.0",
"android.hardware.ir@1.0",
"android.hardware.light@2.0",
"android.hardware.power@1.0",
@@ -119,6 +121,7 @@ cc_defaults {
"android.hardware.vibrator@1.0",
"android.hardware.vibrator@1.1",
"android.hardware.vibrator@1.2",
+ "android.hardware.vibrator@1.3",
"android.hardware.vr@1.0",
"android.frameworks.schedulerservice@1.0",
"android.frameworks.sensorservice@1.0",
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index defcfd9a3370..63dca62104a1 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -22,6 +22,7 @@
#include <android/hardware/vibrator/1.1/types.h>
#include <android/hardware/vibrator/1.2/IVibrator.h>
#include <android/hardware/vibrator/1.2/types.h>
+#include <android/hardware/vibrator/1.3/IVibrator.h>
#include "jni.h"
#include <nativehelper/JNIHelp.h>
@@ -42,6 +43,7 @@ using android::hardware::vibrator::V1_1::Effect_1_1;
namespace V1_0 = android::hardware::vibrator::V1_0;
namespace V1_1 = android::hardware::vibrator::V1_1;
namespace V1_2 = android::hardware::vibrator::V1_2;
+namespace V1_3 = android::hardware::vibrator::V1_3;
namespace android {
@@ -136,6 +138,19 @@ static void vibratorSetAmplitude(JNIEnv*, jobject, jint amplitude) {
}
}
+static jboolean vibratorSupportsExternalControl(JNIEnv*, jobject) {
+ return halCall(&V1_3::IVibrator::supportsExternalControl).withDefault(false);
+}
+
+static void vibratorSetExternalControl(JNIEnv*, jobject, jboolean enabled) {
+ Status status = halCall(&V1_3::IVibrator::setExternalControl, static_cast<uint32_t>(enabled))
+ .withDefault(Status::UNKNOWN_ERROR);
+ if (status != Status::OK) {
+ ALOGE("Failed to set vibrator external control (%" PRIu32 ").",
+ static_cast<uint32_t>(status));
+ }
+}
+
static jlong vibratorPerformEffect(JNIEnv*, jobject, jlong effect, jint strength) {
Status status;
uint32_t lengthMs;
@@ -187,7 +202,9 @@ static const JNINativeMethod method_table[] = {
{ "vibratorOff", "()V", (void*)vibratorOff },
{ "vibratorSupportsAmplitudeControl", "()Z", (void*)vibratorSupportsAmplitudeControl},
{ "vibratorSetAmplitude", "(I)V", (void*)vibratorSetAmplitude},
- { "vibratorPerformEffect", "(JJ)J", (void*)vibratorPerformEffect}
+ { "vibratorPerformEffect", "(JJ)J", (void*)vibratorPerformEffect},
+ { "vibratorSupportsExternalControl", "()Z", (void*)vibratorSupportsExternalControl},
+ { "vibratorSetExternalControl", "(Z)V", (void*)vibratorSetExternalControl},
};
int register_android_server_VibratorService(JNIEnv *env)
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 43d2dcf7e0d1..90c9cc2b0a35 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -107,9 +107,11 @@ static struct {
jmethodID getLongPressTimeout;
jmethodID getPointerLayer;
jmethodID getPointerIcon;
+ jmethodID getPointerDisplayId;
jmethodID getKeyboardLayoutOverlay;
jmethodID getDeviceAlias;
jmethodID getTouchCalibrationForInputDevice;
+ jmethodID getContextForDisplay;
} gServiceClassInfo;
static struct {
@@ -174,15 +176,6 @@ static void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t styl
loadSystemIconAsSpriteWithPointerIcon(env, contextObj, style, &pointerIcon, outSpriteIcon);
}
-static void updatePointerControllerFromViewport(
- sp<PointerController> controller, const DisplayViewport* const viewport) {
- if (controller != nullptr && viewport != nullptr) {
- const int32_t width = viewport->logicalRight - viewport->logicalLeft;
- const int32_t height = viewport->logicalBottom - viewport->logicalTop;
- controller->setDisplayViewport(width, height, viewport->orientation);
- }
-}
-
enum {
WM_ACTION_PASS_TO_USER = 1,
};
@@ -252,7 +245,7 @@ public:
const sp<IBinder>& token,
const std::string& reason);
virtual void notifyInputChannelBroken(const sp<IBinder>& token);
- virtual void notifyFocusChanged(const sp<IBinder>& token);
+ virtual void notifyFocusChanged(const sp<IBinder>& oldToken, const sp<IBinder>& newToken);
virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags);
virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig);
virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags);
@@ -268,17 +261,16 @@ public:
/* --- PointerControllerPolicyInterface implementation --- */
- virtual void loadPointerIcon(SpriteIcon* icon);
- virtual void loadPointerResources(PointerResources* outResources);
+ virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId);
+ virtual void loadPointerResources(PointerResources* outResources, int32_t displayId);
virtual void loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources,
- std::map<int32_t, PointerAnimation>* outAnimationResources);
+ std::map<int32_t, PointerAnimation>* outAnimationResources, int32_t displayId);
virtual int32_t getDefaultPointerIconId();
virtual int32_t getCustomPointerIconId();
private:
sp<InputManager> mInputManager;
- jobject mContextObj;
jobject mServiceObj;
sp<Looper> mLooper;
@@ -310,14 +302,19 @@ private:
// Input devices to be disabled
SortedVector<int32_t> disabledInputDevices;
+
+ // Associated Pointer controller display.
+ int32_t pointerDisplayId;
} mLocked GUARDED_BY(mLock);
std::atomic<bool> mInteractive;
- void updateInactivityTimeoutLocked(const sp<PointerController>& controller);
+ void updateInactivityTimeoutLocked();
void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags);
void ensureSpriteControllerLocked();
-
+ const DisplayViewport* findDisplayViewportLocked(int32_t displayId);
+ int32_t getPointerDisplayId();
+ void updatePointerDisplayLocked();
static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName);
static inline JNIEnv* jniEnv() {
@@ -332,7 +329,6 @@ NativeInputManager::NativeInputManager(jobject contextObj,
mLooper(looper), mInteractive(true) {
JNIEnv* env = jniEnv();
- mContextObj = env->NewGlobalRef(contextObj);
mServiceObj = env->NewGlobalRef(serviceObj);
{
@@ -342,6 +338,7 @@ NativeInputManager::NativeInputManager(jobject contextObj,
mLocked.pointerGesturesEnabled = true;
mLocked.showTouches = false;
mLocked.pointerCapture = false;
+ mLocked.pointerDisplayId = ADISPLAY_ID_DEFAULT;
}
mInteractive = true;
@@ -353,7 +350,6 @@ NativeInputManager::NativeInputManager(jobject contextObj,
NativeInputManager::~NativeInputManager() {
JNIEnv* env = jniEnv();
- env->DeleteGlobalRef(mContextObj);
env->DeleteGlobalRef(mServiceObj);
}
@@ -391,9 +387,10 @@ bool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const c
return false;
}
-static const DisplayViewport* findInternalViewport(const std::vector<DisplayViewport>& viewports) {
- for (const DisplayViewport& v : viewports) {
- if (v.type == ViewportType::VIEWPORT_INTERNAL) {
+const DisplayViewport* NativeInputManager::findDisplayViewportLocked(int32_t displayId)
+ REQUIRES(mLock) {
+ for (const DisplayViewport& v : mLocked.viewports) {
+ if (v.displayId == displayId) {
return &v;
}
}
@@ -420,20 +417,14 @@ void NativeInputManager::setDisplayViewports(JNIEnv* env, jobjectArray viewportO
}
}
- const DisplayViewport* newInternalViewport = findInternalViewport(viewports);
- {
+ // Get the preferred pointer controller displayId.
+ int32_t pointerDisplayId = getPointerDisplayId();
+
+ { // acquire lock
AutoMutex _l(mLock);
- const DisplayViewport* oldInternalViewport = findInternalViewport(mLocked.viewports);
- // Internal viewport has changed if there wasn't one earlier, and there is one now, or,
- // if they are different.
- const bool internalViewportChanged = (newInternalViewport != nullptr) &&
- (oldInternalViewport == nullptr || (*oldInternalViewport != *newInternalViewport));
- if (internalViewportChanged) {
- sp<PointerController> controller = mLocked.pointerController.promote();
- updatePointerControllerFromViewport(controller, newInternalViewport);
- }
mLocked.viewports = viewports;
- }
+ mLocked.pointerDisplayId = pointerDisplayId;
+ } // release lock
mInputManager->getReader()->requestRefreshConfiguration(
InputReaderConfiguration::CHANGE_DISPLAY_INFO);
@@ -556,15 +547,42 @@ sp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32
controller = new PointerController(this, mLooper, mLocked.spriteController);
mLocked.pointerController = controller;
+ updateInactivityTimeoutLocked();
+ }
- const DisplayViewport* internalViewport = findInternalViewport(mLocked.viewports);
- updatePointerControllerFromViewport(controller, internalViewport);
+ updatePointerDisplayLocked();
- updateInactivityTimeoutLocked(controller);
- }
return controller;
}
+int32_t NativeInputManager::getPointerDisplayId() {
+ JNIEnv* env = jniEnv();
+ jint pointerDisplayId = env->CallIntMethod(mServiceObj,
+ gServiceClassInfo.getPointerDisplayId);
+ if (checkAndClearExceptionFromCallback(env, "getPointerDisplayId")) {
+ pointerDisplayId = ADISPLAY_ID_DEFAULT;
+ }
+
+ return pointerDisplayId;
+}
+
+void NativeInputManager::updatePointerDisplayLocked() REQUIRES(mLock) {
+ ATRACE_CALL();
+
+ sp<PointerController> controller = mLocked.pointerController.promote();
+ if (controller != nullptr) {
+ const DisplayViewport* viewport = findDisplayViewportLocked(mLocked.pointerDisplayId);
+ if (viewport == nullptr) {
+ ALOGW("Can't find pointer display viewport, fallback to default display.");
+ viewport = findDisplayViewportLocked(ADISPLAY_ID_DEFAULT);
+ }
+
+ if (viewport != nullptr) {
+ controller->setDisplayViewport(*viewport);
+ }
+ }
+}
+
void NativeInputManager::ensureSpriteControllerLocked() REQUIRES(mLock) {
if (mLocked.spriteController == nullptr) {
JNIEnv* env = jniEnv();
@@ -718,7 +736,8 @@ void NativeInputManager::notifyInputChannelBroken(const sp<IBinder>& token) {
}
}
-void NativeInputManager::notifyFocusChanged(const sp<IBinder>& token) {
+void NativeInputManager::notifyFocusChanged(const sp<IBinder>& oldToken,
+ const sp<IBinder>& newToken) {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("notifyFocusChanged");
#endif
@@ -726,12 +745,11 @@ void NativeInputManager::notifyFocusChanged(const sp<IBinder>& token) {
JNIEnv* env = jniEnv();
- jobject tokenObj = javaObjectForIBinder(env, token);
- if (tokenObj) {
- env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyFocusChanged,
- tokenObj);
- checkAndClearExceptionFromCallback(env, "notifyFocusChanged");
- }
+ jobject oldTokenObj = javaObjectForIBinder(env, oldToken);
+ jobject newTokenObj = javaObjectForIBinder(env, newToken);
+ env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyFocusChanged,
+ oldTokenObj, newTokenObj);
+ checkAndClearExceptionFromCallback(env, "notifyFocusChanged");
}
void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
@@ -821,16 +839,16 @@ void NativeInputManager::setSystemUiVisibility(int32_t visibility) {
if (mLocked.systemUiVisibility != visibility) {
mLocked.systemUiVisibility = visibility;
-
- sp<PointerController> controller = mLocked.pointerController.promote();
- if (controller != nullptr) {
- updateInactivityTimeoutLocked(controller);
- }
+ updateInactivityTimeoutLocked();
}
}
-void NativeInputManager::updateInactivityTimeoutLocked(const sp<PointerController>& controller)
- REQUIRES(mLock) {
+void NativeInputManager::updateInactivityTimeoutLocked() REQUIRES(mLock) {
+ sp<PointerController> controller = mLocked.pointerController.promote();
+ if (controller == nullptr) {
+ return;
+ }
+
bool lightsOut = mLocked.systemUiVisibility & ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN;
controller->setInactivityTimeout(lightsOut
? PointerController::INACTIVITY_TIMEOUT_SHORT
@@ -1182,19 +1200,22 @@ bool NativeInputManager::checkInjectEventsPermissionNonReentrant(
return result;
}
-void NativeInputManager::loadPointerIcon(SpriteIcon* icon) {
+void NativeInputManager::loadPointerIcon(SpriteIcon* icon, int32_t displayId) {
ATRACE_CALL();
JNIEnv* env = jniEnv();
ScopedLocalRef<jobject> pointerIconObj(env, env->CallObjectMethod(
- mServiceObj, gServiceClassInfo.getPointerIcon));
+ mServiceObj, gServiceClassInfo.getPointerIcon, displayId));
if (checkAndClearExceptionFromCallback(env, "getPointerIcon")) {
return;
}
+ ScopedLocalRef<jobject> displayContext(env, env->CallObjectMethod(
+ mServiceObj, gServiceClassInfo.getContextForDisplay, displayId));
+
PointerIcon pointerIcon;
status_t status = android_view_PointerIcon_load(env, pointerIconObj.get(),
- mContextObj, &pointerIcon);
+ displayContext.get(), &pointerIcon);
if (!status && !pointerIcon.isNullIcon()) {
*icon = SpriteIcon(pointerIcon.bitmap, pointerIcon.hotSpotX, pointerIcon.hotSpotY);
} else {
@@ -1202,28 +1223,34 @@ void NativeInputManager::loadPointerIcon(SpriteIcon* icon) {
}
}
-void NativeInputManager::loadPointerResources(PointerResources* outResources) {
+void NativeInputManager::loadPointerResources(PointerResources* outResources, int32_t displayId) {
ATRACE_CALL();
JNIEnv* env = jniEnv();
- loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER,
+ ScopedLocalRef<jobject> displayContext(env, env->CallObjectMethod(
+ mServiceObj, gServiceClassInfo.getContextForDisplay, displayId));
+
+ loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_HOVER,
&outResources->spotHover);
- loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_TOUCH,
+ loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_TOUCH,
&outResources->spotTouch);
- loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_ANCHOR,
+ loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_ANCHOR,
&outResources->spotAnchor);
}
void NativeInputManager::loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources,
- std::map<int32_t, PointerAnimation>* outAnimationResources) {
+ std::map<int32_t, PointerAnimation>* outAnimationResources, int32_t displayId) {
ATRACE_CALL();
JNIEnv* env = jniEnv();
+ ScopedLocalRef<jobject> displayContext(env, env->CallObjectMethod(
+ mServiceObj, gServiceClassInfo.getContextForDisplay, displayId));
+
for (int iconId = POINTER_ICON_STYLE_CONTEXT_MENU; iconId <= POINTER_ICON_STYLE_GRABBING;
++iconId) {
PointerIcon pointerIcon;
loadSystemIconAsSpriteWithPointerIcon(
- env, mContextObj, iconId, &pointerIcon, &((*outResources)[iconId]));
+ env, displayContext.get(), iconId, &pointerIcon, &((*outResources)[iconId]));
if (!pointerIcon.bitmapFrames.empty()) {
PointerAnimation& animationData = (*outAnimationResources)[iconId];
size_t numFrames = pointerIcon.bitmapFrames.size() + 1;
@@ -1238,7 +1265,7 @@ void NativeInputManager::loadAdditionalMouseResources(std::map<int32_t, SpriteIc
}
}
}
- loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_NULL,
+ loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_NULL,
&((*outResources)[POINTER_ICON_STYLE_NULL]));
}
@@ -1480,27 +1507,6 @@ static void nativeSetSystemUiVisibility(JNIEnv* /* env */,
im->setSystemUiVisibility(visibility);
}
-static jboolean nativeTransferTouchFocus(JNIEnv* env,
- jclass /* clazz */, jlong ptr, jobject fromChannelObj, jobject toChannelObj) {
- NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
-
- sp<InputChannel> fromChannel =
- android_view_InputChannel_getInputChannel(env, fromChannelObj);
- sp<InputChannel> toChannel =
- android_view_InputChannel_getInputChannel(env, toChannelObj);
-
- if (fromChannel == nullptr || toChannel == nullptr) {
- return JNI_FALSE;
- }
-
- if (im->getInputManager()->getDispatcher()->
- transferTouchFocus(fromChannel, toChannel)) {
- return JNI_TRUE;
- } else {
- return JNI_FALSE;
- }
-}
-
static void nativeSetPointerSpeed(JNIEnv* /* env */,
jclass /* clazz */, jlong ptr, jint speed) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
@@ -1688,8 +1694,6 @@ static const JNINativeMethod gInputManagerMethods[] = {
(void*) nativeSetInputDispatchMode },
{ "nativeSetSystemUiVisibility", "(JI)V",
(void*) nativeSetSystemUiVisibility },
- { "nativeTransferTouchFocus", "(JLandroid/view/InputChannel;Landroid/view/InputChannel;)Z",
- (void*) nativeTransferTouchFocus },
{ "nativeSetPointerSpeed", "(JI)V",
(void*) nativeSetPointerSpeed },
{ "nativeSetShowTouches", "(JZ)V",
@@ -1765,7 +1769,7 @@ int register_android_server_InputManager(JNIEnv* env) {
"notifyInputChannelBroken", "(Landroid/os/IBinder;)V");
GET_METHOD_ID(gServiceClassInfo.notifyFocusChanged, clazz,
- "notifyFocusChanged", "(Landroid/os/IBinder;)V");
+ "notifyFocusChanged", "(Landroid/os/IBinder;Landroid/os/IBinder;)V");
GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz,
"notifyANR",
@@ -1822,7 +1826,10 @@ int register_android_server_InputManager(JNIEnv* env) {
"getPointerLayer", "()I");
GET_METHOD_ID(gServiceClassInfo.getPointerIcon, clazz,
- "getPointerIcon", "()Landroid/view/PointerIcon;");
+ "getPointerIcon", "(I)Landroid/view/PointerIcon;");
+
+ GET_METHOD_ID(gServiceClassInfo.getPointerDisplayId, clazz,
+ "getPointerDisplayId", "()I");
GET_METHOD_ID(gServiceClassInfo.getKeyboardLayoutOverlay, clazz,
"getKeyboardLayoutOverlay",
@@ -1835,6 +1842,10 @@ int register_android_server_InputManager(JNIEnv* env) {
"getTouchCalibrationForInputDevice",
"(Ljava/lang/String;I)Landroid/hardware/input/TouchCalibration;");
+ GET_METHOD_ID(gServiceClassInfo.getContextForDisplay, clazz,
+ "getContextForDisplay",
+ "(I)Landroid/content/Context;")
+
// InputDevice
FIND_CLASS(gInputDeviceClassInfo.clazz, "android/view/InputDevice");
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 6d8fc1c88307..f3c19d099851 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -26,6 +26,7 @@
#include <android/hardware/gnss/1.1/IGnssMeasurement.h>
#include <android/hardware/gnss/2.0/IGnssMeasurement.h>
#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
+#include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "hardware_legacy/power.h"
@@ -80,7 +81,7 @@ static jmethodID method_correctionSatFlags;
static jmethodID method_correctionSatConstType;
static jmethodID method_correctionSatId;
static jmethodID method_correctionSatCarrierFreq;
-static jmethodID method_correctionSatIsLos;
+static jmethodID method_correctionSatIsLosProb;
static jmethodID method_correctionSatEpl;
static jmethodID method_correctionSatEplUnc;
static jmethodID method_correctionSatRefPlane;
@@ -88,6 +89,8 @@ static jmethodID method_correctionPlaneLatDeg;
static jmethodID method_correctionPlaneLngDeg;
static jmethodID method_correctionPlaneAltDeg;
static jmethodID method_correctionPlaneAzimDeg;
+static jmethodID method_reportNfwNotification;
+static jmethodID method_isInEmergencySession;
/*
* Save a pointer to JavaVm to attach/detach threads executing
@@ -135,6 +138,7 @@ using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss;
using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss;
using IGnssConfiguration_V1_0 = android::hardware::gnss::V1_0::IGnssConfiguration;
using IGnssConfiguration_V1_1 = android::hardware::gnss::V1_1::IGnssConfiguration;
+using IGnssConfiguration_V2_0 = android::hardware::gnss::V2_0::IGnssConfiguration;
using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement;
using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement;
using IGnssMeasurement_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurement;
@@ -151,6 +155,9 @@ using IAGnssCallback_V2_0 = android::hardware::gnss::V2_0::IAGnssCallback;
using IMeasurementCorrections =
android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
+using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;
+using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback;
+
struct GnssDeathRecipient : virtual public hidl_death_recipient
{
// hidl_death_recipient interface
@@ -179,6 +186,7 @@ sp<IGnssBatching> gnssBatchingIface = nullptr;
sp<IGnssDebug> gnssDebugIface = nullptr;
sp<IGnssConfiguration_V1_0> gnssConfigurationIface = nullptr;
sp<IGnssConfiguration_V1_1> gnssConfigurationIface_V1_1 = nullptr;
+sp<IGnssConfiguration_V2_0> gnssConfigurationIface_V2_0 = nullptr;
sp<IGnssNi> gnssNiIface = nullptr;
sp<IGnssMeasurement_V1_0> gnssMeasurementIface = nullptr;
sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr;
@@ -188,7 +196,7 @@ sp<IMeasurementCorrections> gnssCorrectionsIface = nullptr;
// This boolean is needed to ensure that Gnsss Measurement Corrections related method are only
// initalized when needed which will be few devices initially
bool firstGnssMeasurementCorrectionInjected = false;
-
+sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;
#define WAKE_LOCK_NAME "GPS"
@@ -313,6 +321,15 @@ static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
}
}
+static jobject createHalInterfaceVersionJavaObject(JNIEnv* env, jint major, jint minor) {
+ jclass versionClass =
+ env->FindClass("com/android/server/location/GnssConfiguration$HalInterfaceVersion");
+ jmethodID versionCtor = env->GetMethodID(versionClass, "<init>", "(II)V");
+ jobject version = env->NewObject(versionClass, versionCtor, major, minor);
+ env->DeleteLocalRef(versionClass);
+ return version;
+}
+
struct ScopedJniString {
ScopedJniString(JNIEnv* env, jstring javaString) : mEnv(env), mJavaString(javaString) {
mNativeString = mEnv->GetStringUTFChars(mJavaString, nullptr);
@@ -845,7 +862,7 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 {
Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_0(
const IGnssMeasurementCallback_V2_0::GnssData& data) {
- // TODO(b/119571122): implement gnssMeasurementCb_2_0
+ translateAndSetGnssData(data);
return Void();
}
@@ -883,9 +900,8 @@ size_t GnssMeasurementCallback::getMeasurementCount<IGnssMeasurementCallback_V1_
return data.measurementCount;
}
-template<>
-size_t GnssMeasurementCallback::getMeasurementCount<IGnssMeasurementCallback_V1_1::GnssData>
- (const IGnssMeasurementCallback_V1_1::GnssData& data) {
+template<class T>
+size_t GnssMeasurementCallback::getMeasurementCount(const T& data) {
return data.measurements.size();
}
@@ -947,6 +963,17 @@ void GnssMeasurementCallback::translateSingleGnssMeasurement
ADR_STATE_HALF_CYCLE_REPORTED));
}
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template<>
+void GnssMeasurementCallback::translateSingleGnssMeasurement
+ <IGnssMeasurementCallback_V2_0::GnssMeasurement>(
+ const IGnssMeasurementCallback_V2_0::GnssMeasurement* measurement_V2_0,
+ JavaObject& object) {
+ translateSingleGnssMeasurement(&(measurement_V2_0->v1_1), object);
+
+ SET(CodeType, (static_cast<int32_t>(measurement_V2_0->codeType)));
+}
+
jobject GnssMeasurementCallback::translateGnssClock(
JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssClock* clock) {
JavaObject object(env, "android/location/GnssClock");
@@ -1069,6 +1096,54 @@ Return<void> GnssNiCallback::niNotifyCb(
}
/*
+ * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal.
+ */
+struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback {
+ Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification)
+ override;
+ Return<bool> isInEmergencySession() override;
+};
+
+Return<void> GnssVisibilityControlCallback::nfwNotifyCb(
+ const IGnssVisibilityControlCallback::NfwNotification& notification) {
+ JNIEnv* env = getJniEnv();
+ jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str());
+ jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str());
+ jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());
+
+ if (proxyAppPackageName && otherProtocolStackName && requestorId) {
+ env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName,
+ notification.protocolStack, otherProtocolStackName,
+ notification.requestor, requestorId,
+ notification.inEmergencyMode, notification.isCachedLocation);
+ } else {
+ ALOGE("%s: OOM Error\n", __func__);
+ }
+
+ if (requestorId) {
+ env->DeleteLocalRef(requestorId);
+ }
+
+ if (otherProtocolStackName) {
+ env->DeleteLocalRef(otherProtocolStackName);
+ }
+
+ if (proxyAppPackageName) {
+ env->DeleteLocalRef(proxyAppPackageName);
+ }
+
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ return Void();
+}
+
+Return<bool> GnssVisibilityControlCallback::isInEmergencySession() {
+ JNIEnv* env = getJniEnv();
+ auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession);
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ return result;
+}
+
+/*
* AGnssCallback_V1_0 implements callback methods required by the IAGnssCallback 1.0 interface.
*/
struct AGnssCallback_V1_0 : public IAGnssCallback_V1_0 {
@@ -1302,6 +1377,9 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
"reportLocationBatch",
"([Landroid/location/Location;)V");
method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V");
+ method_reportNfwNotification = env->GetMethodID(clazz, "reportNfwNotification",
+ "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V");
+ method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z");
/*
* Save a pointer to JVM.
@@ -1377,12 +1455,6 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
if (gnssHal_V2_0 != nullptr) {
// TODO(b/119638366): getExtensionGnssMeasurement_1_1 from gnssHal_V2_0
auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0();
- auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
- if (!gnssCorrections.isOk()) {
- ALOGD("Unable to get a handle to GnssMeasurementCorrections interface");
- } else {
- gnssCorrectionsIface = gnssCorrections;
- }
if (!gnssMeasurement.isOk()) {
ALOGD("Unable to get a handle to GnssMeasurement_V2_0");
} else {
@@ -1390,6 +1462,12 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
gnssMeasurementIface_V1_1 = gnssMeasurementIface_V2_0;
gnssMeasurementIface = gnssMeasurementIface_V2_0;
}
+ auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
+ if (!gnssCorrections.isOk()) {
+ ALOGD("Unable to get a handle to GnssMeasurementCorrections interface");
+ } else {
+ gnssCorrectionsIface = gnssCorrections;
+ }
} else if (gnssHal_V1_1 != nullptr) {
auto gnssMeasurement = gnssHal_V1_1->getExtensionGnssMeasurement_1_1();
if (!gnssMeasurement.isOk()) {
@@ -1421,10 +1499,19 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
gnssNiIface = gnssNi;
}
- if (gnssHal_V1_1 != nullptr) {
+ if (gnssHal_V2_0 != nullptr) {
+ auto gnssConfiguration = gnssHal_V2_0->getExtensionGnssConfiguration_2_0();
+ if (!gnssConfiguration.isOk()) {
+ ALOGD("Unable to get a handle to GnssConfiguration_V2_0");
+ } else {
+ gnssConfigurationIface_V2_0 = gnssConfiguration;
+ gnssConfigurationIface_V1_1 = gnssConfigurationIface_V2_0;
+ gnssConfigurationIface = gnssConfigurationIface_V2_0;
+ }
+ } else if (gnssHal_V1_1 != nullptr) {
auto gnssConfiguration = gnssHal_V1_1->getExtensionGnssConfiguration_1_1();
if (!gnssConfiguration.isOk()) {
- ALOGD("Unable to get a handle to GnssConfiguration");
+ ALOGD("Unable to get a handle to GnssConfiguration_V1_1");
} else {
gnssConfigurationIface_V1_1 = gnssConfiguration;
gnssConfigurationIface = gnssConfigurationIface_V1_1;
@@ -1451,6 +1538,15 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
} else {
gnssBatchingIface = gnssBatching;
}
+
+ if (gnssHal_V2_0 != nullptr) {
+ auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl();
+ if (!gnssVisibilityControl.isOk()) {
+ ALOGD("Unable to get a handle to GnssVisibilityControl interface");
+ } else {
+ gnssVisibilityControlIface = gnssVisibilityControl;
+ }
+ }
}
static jboolean android_location_GnssLocationProvider_is_supported(
@@ -1463,9 +1559,23 @@ static jboolean android_location_GnssNetworkConnectivityHandler_is_agps_ril_supp
return (agnssRilIface != nullptr) ? JNI_TRUE : JNI_FALSE;
}
-static jboolean android_location_gpsLocationProvider_is_gnss_configuration_supported(
- JNIEnv* /* env */, jclass /* jclazz */) {
- return (gnssConfigurationIface != nullptr) ? JNI_TRUE : JNI_FALSE;
+static jobject android_location_GnssConfiguration_get_gnss_configuration_version(
+ JNIEnv* env, jclass /* jclazz */) {
+ jint major, minor;
+ if (gnssConfigurationIface_V2_0 != nullptr) {
+ major = 2;
+ minor = 0;
+ } else if (gnssConfigurationIface_V1_1 != nullptr) {
+ major = 1;
+ minor = 1;
+ } else if (gnssConfigurationIface != nullptr) {
+ major = 1;
+ minor = 0;
+ } else {
+ return nullptr;
+ }
+
+ return createHalInterfaceVersionJavaObject(env, major, minor);
}
static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject obj) {
@@ -1538,7 +1648,13 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject
if (agnssRilIface != nullptr) {
agnssRilIface->setCallback(aGnssRilCbIface);
} else {
- ALOGI("Unable to Initialize AGnss Ril interface\n");
+ ALOGI("Unable to initialize AGnss Ril interface\n");
+ }
+
+ if (gnssVisibilityControlIface != nullptr) {
+ sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface =
+ new GnssVisibilityControlCallback();
+ gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
}
return JNI_TRUE;
@@ -1940,6 +2056,11 @@ static jstring android_location_GnssLocationProvider_get_internal_state(JNIEnv*
return result;
}
+static jboolean android_location_GnssLocationProvider_is_gnss_visibility_control_supported(
+ JNIEnv* /* env */, jclass /* clazz */) {
+ return (gnssVisibilityControlIface != nullptr) ? JNI_TRUE : JNI_FALSE;
+}
+
static void android_location_GnssNetworkConnectivityHandler_update_network_state(JNIEnv* env,
jobject /* obj */,
jboolean connected,
@@ -2156,8 +2277,8 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
singleSatCorrClass, "getSatId", "()I");
method_correctionSatCarrierFreq = env->GetMethodID(
singleSatCorrClass, "getCarrierFrequencyHz", "()F");
- method_correctionSatIsLos = env->GetMethodID(
- singleSatCorrClass,"getSatIsLos", "()Z");
+ method_correctionSatIsLosProb = env->GetMethodID(
+ singleSatCorrClass,"getProbSatIsLos", "()F");
method_correctionSatEpl = env->GetMethodID(
singleSatCorrClass, "getExcessPathLengthMeters", "()F");
method_correctionSatEplUnc = env->GetMethodID(
@@ -2175,8 +2296,8 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId);
jfloat carrierFreqHz = env->CallFloatMethod(
singleSatCorrectionObj, method_correctionSatCarrierFreq);
- jboolean satIsLos = env->CallBooleanMethod(singleSatCorrectionObj,
- method_correctionSatIsLos);
+ jfloat probSatIsLos = env->CallFloatMethod(singleSatCorrectionObj,
+ method_correctionSatIsLosProb);
jfloat eplMeters =
env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl);
jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj,
@@ -2216,7 +2337,7 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
.constellation = static_cast<GnssConstellationType>(constType),
.svid = static_cast<uint16_t>(satId),
.carrierFrequencyHz = carrierFreqHz,
- .satIsLos = static_cast<bool>(satIsLos),
+ .probSatIsLos = probSatIsLos,
.excessPathLengthMeters = eplMeters,
.excessPathLengthUncertaintyMeters = eplUncMeters,
.reflectingPlane = reflectingPlane,
@@ -2278,9 +2399,9 @@ static jboolean android_location_GnssNavigationMessageProvider_stop_navigation_m
return boolToJbool(result.isOk());
}
-static jboolean android_location_GnssLocationProvider_set_emergency_supl_pdn(JNIEnv*,
- jobject,
- jint emergencySuplPdn) {
+static jboolean android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv*,
+ jobject,
+ jint emergencySuplPdn) {
if (gnssConfigurationIface == nullptr) {
ALOGE("no GNSS configuration interface available");
return JNI_FALSE;
@@ -2294,7 +2415,7 @@ static jboolean android_location_GnssLocationProvider_set_emergency_supl_pdn(JNI
}
}
-static jboolean android_location_GnssLocationProvider_set_supl_version(JNIEnv*,
+static jboolean android_location_GnssConfiguration_set_supl_version(JNIEnv*,
jobject,
jint version) {
if (gnssConfigurationIface == nullptr) {
@@ -2309,9 +2430,14 @@ static jboolean android_location_GnssLocationProvider_set_supl_version(JNIEnv*,
}
}
-static jboolean android_location_GnssLocationProvider_set_supl_es(JNIEnv*,
- jobject,
- jint suplEs) {
+static jboolean android_location_GnssConfiguration_set_supl_es(JNIEnv*,
+ jobject,
+ jint suplEs) {
+ if (gnssConfigurationIface_V2_0 != nullptr) {
+ ALOGI("Config parameter SUPL_ES is deprecated in IGnssConfiguration.hal version 2.0.");
+ return JNI_FALSE;
+ }
+
if (gnssConfigurationIface == nullptr) {
ALOGE("no GNSS configuration interface available");
return JNI_FALSE;
@@ -2325,9 +2451,9 @@ static jboolean android_location_GnssLocationProvider_set_supl_es(JNIEnv*,
}
}
-static jboolean android_location_GnssLocationProvider_set_supl_mode(JNIEnv*,
- jobject,
- jint mode) {
+static jboolean android_location_GnssConfiguration_set_supl_mode(JNIEnv*,
+ jobject,
+ jint mode) {
if (gnssConfigurationIface == nullptr) {
ALOGE("no GNSS configuration interface available");
return JNI_FALSE;
@@ -2341,9 +2467,14 @@ static jboolean android_location_GnssLocationProvider_set_supl_mode(JNIEnv*,
}
}
-static jboolean android_location_GnssLocationProvider_set_gps_lock(JNIEnv*,
- jobject,
- jint gpsLock) {
+static jboolean android_location_GnssConfiguration_set_gps_lock(JNIEnv*,
+ jobject,
+ jint gpsLock) {
+ if (gnssConfigurationIface_V2_0 != nullptr) {
+ ALOGI("Config parameter GPS_LOCK is deprecated in IGnssConfiguration.hal version 2.0.");
+ return JNI_FALSE;
+ }
+
if (gnssConfigurationIface == nullptr) {
ALOGE("no GNSS configuration interface available");
return JNI_FALSE;
@@ -2357,7 +2488,7 @@ static jboolean android_location_GnssLocationProvider_set_gps_lock(JNIEnv*,
}
}
-static jboolean android_location_GnssLocationProvider_set_lpp_profile(JNIEnv*,
+static jboolean android_location_GnssConfiguration_set_lpp_profile(JNIEnv*,
jobject,
jint lppProfile) {
if (gnssConfigurationIface == nullptr) {
@@ -2374,9 +2505,9 @@ static jboolean android_location_GnssLocationProvider_set_lpp_profile(JNIEnv*,
}
}
-static jboolean android_location_GnssLocationProvider_set_gnss_pos_protocol_select(JNIEnv*,
- jobject,
- jint gnssPosProtocol) {
+static jboolean android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv*,
+ jobject,
+ jint gnssPosProtocol) {
if (gnssConfigurationIface == nullptr) {
ALOGE("no GNSS configuration interface available");
return JNI_FALSE;
@@ -2390,7 +2521,7 @@ static jboolean android_location_GnssLocationProvider_set_gnss_pos_protocol_sele
}
}
-static jboolean android_location_GnssLocationProvider_set_satellite_blacklist(
+static jboolean android_location_GnssConfiguration_set_satellite_blacklist(
JNIEnv* env, jobject, jintArray constellations, jintArray sv_ids) {
if (gnssConfigurationIface_V1_1 == nullptr) {
ALOGI("No GNSS Satellite Blacklist interface available");
@@ -2431,6 +2562,27 @@ static jboolean android_location_GnssLocationProvider_set_satellite_blacklist(
}
}
+static jboolean android_location_GnssConfiguration_set_es_extension_sec(
+ JNIEnv*, jobject, jint emergencyExtensionSeconds) {
+ if (gnssConfigurationIface == nullptr) {
+ ALOGE("no GNSS configuration interface available");
+ return JNI_FALSE;
+ }
+
+ if (gnssConfigurationIface_V2_0 == nullptr) {
+ ALOGI("Config parameter ES_EXTENSION_SEC is not supported in IGnssConfiguration.hal"
+ " versions earlier than 2.0.");
+ return JNI_FALSE;
+ }
+
+ auto result = gnssConfigurationIface_V2_0->setEsExtensionSec(emergencyExtensionSeconds);
+ if (result.isOk()) {
+ return result;
+ } else {
+ return JNI_FALSE;
+ }
+}
+
static jint android_location_GnssBatchingProvider_get_batch_size(JNIEnv*, jclass) {
if (gnssBatchingIface == nullptr) {
return 0; // batching not supported, size = 0
@@ -2492,23 +2644,43 @@ static jboolean android_location_GnssBatchingProvider_stop_batch(JNIEnv*, jclass
return gnssBatchingIface->stop();
}
+static jboolean android_location_GnssVisibilityControl_enable_nfw_location_access(
+ JNIEnv* env, jobject, jobjectArray proxyApps) {
+ if (gnssVisibilityControlIface == nullptr) {
+ ALOGI("No GNSS Visibility Control interface available");
+ return JNI_FALSE;
+ }
+
+ const jsize length = env->GetArrayLength(proxyApps);
+ hidl_vec<hidl_string> hidlProxyApps(length);
+ for (int i = 0; i < length; ++i) {
+ jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i));
+ ScopedJniString jniProxyApp(env, proxyApp);
+ hidlProxyApps[i] = jniProxyApp;
+ }
+
+ auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps);
+ if (result.isOk()) {
+ return result;
+ } else {
+ return JNI_FALSE;
+ }
+}
+
static const JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"class_init_native", "()V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_class_init_native)},
{"native_is_supported", "()Z", reinterpret_cast<void *>(
android_location_GnssLocationProvider_is_supported)},
- {"native_is_gnss_configuration_supported", "()Z",
- reinterpret_cast<void *>(
- android_location_gpsLocationProvider_is_gnss_configuration_supported)},
{"native_init_once", "()V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_init_once)},
{"native_init", "()Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_init)},
{"native_cleanup", "()V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_cleanup)},
{"native_set_position_mode",
- "(IIIIIZ)Z",
- reinterpret_cast<void*>(android_location_GnssLocationProvider_set_position_mode)},
+ "(IIIIIZ)Z",
+ reinterpret_cast<void*>(android_location_GnssLocationProvider_set_position_mode)},
{"native_start", "()Z", reinterpret_cast<void*>(android_location_GnssLocationProvider_start)},
{"native_stop", "()Z", reinterpret_cast<void*>(android_location_GnssLocationProvider_stop)},
{"native_delete_aiding_data",
@@ -2545,31 +2717,8 @@ static const JNINativeMethod sMethods[] = {
{"native_get_internal_state",
"()Ljava/lang/String;",
reinterpret_cast<void *>(android_location_GnssLocationProvider_get_internal_state)},
- {"native_set_supl_es",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_supl_es)},
- {"native_set_supl_version",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_supl_version)},
- {"native_set_supl_mode",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_supl_mode)},
- {"native_set_lpp_profile",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_lpp_profile)},
- {"native_set_gnss_pos_protocol_select",
- "(I)Z",
- reinterpret_cast<void *>(
- android_location_GnssLocationProvider_set_gnss_pos_protocol_select)},
- {"native_set_gps_lock",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_gps_lock)},
- {"native_set_emergency_supl_pdn",
- "(I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_emergency_supl_pdn)},
- {"native_set_satellite_blacklist",
- "([I[I)Z",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_satellite_blacklist)},
+ {"native_is_gnss_visibility_control_supported", "()Z", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_is_gnss_visibility_control_supported)},
};
static const JNINativeMethod sMethodsBatching[] = {
@@ -2663,6 +2812,50 @@ static const JNINativeMethod sNetworkConnectivityMethods[] = {
reinterpret_cast<void *>(android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed)},
};
+static const JNINativeMethod sConfigurationMethods[] = {
+ /* name, signature, funcPtr */
+ {"native_get_gnss_configuration_version",
+ "()Lcom/android/server/location/GnssConfiguration$HalInterfaceVersion;",
+ reinterpret_cast<void *>(
+ android_location_GnssConfiguration_get_gnss_configuration_version)},
+ {"native_set_supl_es",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_supl_es)},
+ {"native_set_supl_version",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_supl_version)},
+ {"native_set_supl_mode",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_supl_mode)},
+ {"native_set_lpp_profile",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_lpp_profile)},
+ {"native_set_gnss_pos_protocol_select",
+ "(I)Z",
+ reinterpret_cast<void *>(
+ android_location_GnssConfiguration_set_gnss_pos_protocol_select)},
+ {"native_set_gps_lock",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_gps_lock)},
+ {"native_set_emergency_supl_pdn",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_emergency_supl_pdn)},
+ {"native_set_satellite_blacklist",
+ "([I[I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_satellite_blacklist)},
+ {"native_set_es_extension_sec",
+ "(I)Z",
+ reinterpret_cast<void *>(android_location_GnssConfiguration_set_es_extension_sec)},
+};
+
+static const JNINativeMethod sVisibilityControlMethods[] = {
+ /* name, signature, funcPtr */
+ {"native_enable_nfw_location_access",
+ "([Ljava/lang/String;)Z",
+ reinterpret_cast<void *>(
+ android_location_GnssVisibilityControl_enable_nfw_location_access)},
+};
+
int register_android_server_location_GnssLocationProvider(JNIEnv* env) {
jniRegisterNativeMethods(
env,
@@ -2689,6 +2882,16 @@ int register_android_server_location_GnssLocationProvider(JNIEnv* env) {
"com/android/server/location/GnssNetworkConnectivityHandler",
sNetworkConnectivityMethods,
NELEM(sNetworkConnectivityMethods));
+ jniRegisterNativeMethods(
+ env,
+ "com/android/server/location/GnssConfiguration",
+ sConfigurationMethods,
+ NELEM(sConfigurationMethods));
+ jniRegisterNativeMethods(
+ env,
+ "com/android/server/location/GnssVisibilityControl",
+ sVisibilityControlMethods,
+ NELEM(sVisibilityControlMethods));
return jniRegisterNativeMethods(
env,
"com/android/server/location/GnssLocationProvider",
diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp
index 3c87e42d926b..7dd30bd50c4e 100644
--- a/services/core/jni/com_android_server_security_VerityUtils.cpp
+++ b/services/core/jni/com_android_server_security_VerityUtils.cpp
@@ -75,6 +75,23 @@ class JavaByteArrayHolder {
jbyte* mElements;
};
+int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
+#if HAS_FSVERITY
+ const char* path = env->GetStringUTFChars(filePath, nullptr);
+ ::android::base::unique_fd rfd(open(path, O_RDONLY | O_CLOEXEC));
+ if (rfd.get() < 0) {
+ return errno;
+ }
+ if (ioctl(rfd.get(), FS_IOC_ENABLE_VERITY, nullptr) < 0) {
+ return errno;
+ }
+ return 0;
+#else
+ LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
+ return ENOSYS;
+#endif // HAS_FSVERITY
+}
+
int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
#if HAS_FSVERITY
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest) + kSha256Bytes);
@@ -82,14 +99,17 @@ int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
data->digest_size = kSha256Bytes; // the only input/output parameter
const char* path = env->GetStringUTFChars(filePath, nullptr);
- ::android::base::unique_fd rfd(open(path, O_RDONLY));
+ ::android::base::unique_fd rfd(open(path, O_RDONLY | O_CLOEXEC));
+ if (rfd.get() < 0) {
+ return errno;
+ }
if (ioctl(rfd.get(), FS_IOC_MEASURE_VERITY, data) < 0) {
return errno;
}
return 0;
#else
LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return -1;
+ return ENOSYS;
#endif // HAS_FSVERITY
}
@@ -172,6 +192,7 @@ jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */,
}
const JNINativeMethod sMethods[] = {
+ { "enableFsverityNative", "(Ljava/lang/String;)I", (void *)enableFsverity },
{ "measureFsverityNative", "(Ljava/lang/String;)I", (void *)measureFsverity },
{ "constructFsveritySignedDataNative", "([B)[B", (void *)constructFsveritySignedData },
{ "constructFsverityDescriptorNative", "(J)[B", (void *)constructFsverityDescriptor },
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java b/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
index 05912a5e3776..de5dd1749830 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
@@ -66,6 +66,9 @@ class AbUpdateInstaller extends UpdateInstaller {
map.put(
DOWNLOAD_STATE_INITIALIZATION_ERROR,
InstallUpdateCallback.UPDATE_ERROR_INCORRECT_OS_VERSION);
+ map.put(
+ UpdateEngine.ErrorCodeConstants.PAYLOAD_TIMESTAMP_ERROR,
+ InstallUpdateCallback.UPDATE_ERROR_INCORRECT_OS_VERSION);
// Error constants corresponding to errors related to bad update file.
map.put(
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 781e1c4a41d9..f8e24ff03410 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -221,7 +221,7 @@ import android.view.IWindowManager;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager;
import android.view.inputmethod.InputMethodInfo;
-import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSystemProperty;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -245,6 +245,7 @@ import com.android.server.LockGuard;
import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemService;
import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
+import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.pm.UserRestrictionsUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
@@ -491,7 +492,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
final UsageStatsManagerInternal mUsageStatsManagerInternal;
final TelephonyManager mTelephonyManager;
private final LockPatternUtils mLockPatternUtils;
- private final DevicePolicyConstants mConstants;
private final DeviceAdminServiceController mDeviceAdminServiceController;
private final OverlayPackagesProvider mOverlayPackagesProvider;
@@ -538,6 +538,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean();
private final SetupContentObserver mSetupContentObserver;
+ private final DevicePolicyConstantsObserver mConstantsObserver;
+
+ private DevicePolicyConstants mConstants;
private static boolean ENABLE_LOCK_GUARD = Build.IS_ENG
|| true // STOPSHIP Remove it.
@@ -2168,8 +2171,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mInjector = injector;
mContext = Preconditions.checkNotNull(injector.mContext);
mHandler = new Handler(Preconditions.checkNotNull(injector.getMyLooper()));
- mConstants = DevicePolicyConstants.loadFromString(
- mInjector.settingsGlobalGetString(Global.DEVICE_POLICY_CONSTANTS));
+
+ mConstantsObserver = new DevicePolicyConstantsObserver(mHandler);
+ mConstantsObserver.register();
+ mConstants = loadConstants();
mOwners = Preconditions.checkNotNull(injector.newOwners());
@@ -4990,26 +4995,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
private boolean resetPasswordInternal(String password, long tokenHandle, byte[] token,
int flags, int callingUid, int userHandle) {
int quality;
- final int realQuality;
synchronized (getLockObject()) {
quality = getPasswordQuality(null, userHandle, /* parent */ false);
if (quality == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
quality = PASSWORD_QUALITY_UNSPECIFIED;
}
final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password);
- realQuality = metrics.quality;
- if (quality != PASSWORD_QUALITY_UNSPECIFIED) {
-
- if (realQuality < quality
- && quality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
- Slog.w(LOG_TAG, "resetPassword: password quality 0x"
- + Integer.toHexString(realQuality)
- + " does not meet required quality 0x"
- + Integer.toHexString(quality));
- return false;
- }
- quality = Math.max(realQuality, quality);
+ final int realQuality = metrics.quality;
+ if (realQuality < quality
+ && quality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
+ Slog.w(LOG_TAG, "resetPassword: password quality 0x"
+ + Integer.toHexString(realQuality)
+ + " does not meet required quality 0x"
+ + Integer.toHexString(quality));
+ return false;
}
+ quality = Math.max(realQuality, quality);
int length = getPasswordMinimumLength(null, userHandle, /* parent */ false);
if (password.length() < length) {
Slog.w(LOG_TAG, "resetPassword: password length " + password.length()
@@ -5086,7 +5087,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
try {
if (token == null) {
if (!TextUtils.isEmpty(password)) {
- mLockPatternUtils.saveLockPassword(password, null, realQuality, userHandle);
+ mLockPatternUtils.saveLockPassword(password, null, quality, userHandle);
} else {
mLockPatternUtils.clearLock(null, userHandle);
}
@@ -5095,7 +5096,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
result = mLockPatternUtils.setLockCredentialWithToken(password,
TextUtils.isEmpty(password) ? LockPatternUtils.CREDENTIAL_TYPE_NONE
: LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
- realQuality, tokenHandle, token, userHandle);
+ quality, tokenHandle, token, userHandle);
}
boolean requireEntry = (flags & DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY) != 0;
if (requireEntry) {
@@ -5326,6 +5327,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
final int callingUserId = mInjector.userHandleGetCallingUserId();
+ ComponentName adminComponent = null;
synchronized (getLockObject()) {
// Make sure the caller has any active admin with the right policy or
// the required permission.
@@ -5336,8 +5338,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
android.Manifest.permission.LOCK_DEVICE);
final long ident = mInjector.binderClearCallingIdentity();
try {
- final ComponentName adminComponent = admin == null ?
- null : admin.info.getComponent();
+ adminComponent = admin == null ? null : admin.info.getComponent();
if (adminComponent != null) {
// For Profile Owners only, callers with only permission not allowed.
if ((flags & DevicePolicyManager.FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY) != 0) {
@@ -5389,6 +5390,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.LOCK_NOW)
+ .setAdmin(adminComponent)
.setInt(flags)
.write();
}
@@ -6105,7 +6107,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
synchronized (getLockObject()) {
delegates = getDelegatePackagesInternalLocked(scope, userId);
}
- if (delegates.size() != 1) {
+ if (delegates.size() == 0) {
+ return null;
+ } else if (delegates.size() > 1) {
Slog.wtf(LOG_TAG, "More than one delegate holds " + scope);
return null;
}
@@ -9192,21 +9196,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
Preconditions.checkNotNull(who, "ComponentName is null");
- // TODO When InputMethodManager supports per user calls remove
- // this restriction.
- if (!checkCallerIsCurrentUserOrProfile()) {
+ // TODO When InputMethodManager supports per user calls remove this restriction.
+ if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED
+ && !checkCallerIsCurrentUserOrProfile()) {
return false;
}
-
final int callingUserId = mInjector.userHandleGetCallingUserId();
if (packageList != null) {
- // InputMethodManager fetches input methods for current user.
- // So this can only be set when calling user is the current user
- // or parent is current user in case of managed profiles.
- InputMethodManager inputMethodManager =
- mContext.getSystemService(InputMethodManager.class);
- List<InputMethodInfo> enabledImes = inputMethodManager.getEnabledInputMethodList();
-
+ List<InputMethodInfo> enabledImes = InputMethodManagerInternal.get()
+ .getEnabledInputMethodListAsUser(callingUserId);
if (enabledImes != null) {
List<String> enabledPackages = new ArrayList<String>();
for (InputMethodInfo ime : enabledImes) {
@@ -9254,22 +9252,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public List getPermittedInputMethodsForCurrentUser() {
enforceManageUsers();
- UserInfo currentUser;
- try {
- currentUser = mInjector.getIActivityManager().getCurrentUser();
- } catch (RemoteException e) {
- Slog.e(LOG_TAG, "Failed to make remote calls to get current user", e);
- // Activity managed is dead, just allow all IMEs
- return null;
- }
- int userId = currentUser.id;
+ final int callingUserId = mInjector.userHandleGetCallingUserId();
synchronized (getLockObject()) {
List<String> result = null;
// If we have multiple profiles we return the intersection of the
// permitted lists. This can happen in cases where we have a device
// and profile owner.
- int[] profileIds = mUserManager.getProfileIdsWithDisabled(userId);
+ int[] profileIds = InputMethodSystemProperty.PER_PROFILE_IME_ENABLED
+ ? new int[]{callingUserId}
+ : mUserManager.getProfileIdsWithDisabled(callingUserId);
for (int profileId : profileIds) {
// Just loop though all admins, only device or profiles
// owners can have permitted lists set.
@@ -9290,9 +9282,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
// If we have a permitted list add all system input methods.
if (result != null) {
- InputMethodManager inputMethodManager =
- mContext.getSystemService(InputMethodManager.class);
- List<InputMethodInfo> imes = inputMethodManager.getInputMethodList();
+ List<InputMethodInfo> imes =
+ InputMethodManagerInternal.get().getInputMethodListAsUser(callingUserId);
if (imes != null) {
for (InputMethodInfo ime : imes) {
ServiceInfo serviceInfo = ime.getServiceInfo();
@@ -10967,6 +10958,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
+ private class DevicePolicyConstantsObserver extends ContentObserver {
+ final Uri mConstantsUri =
+ Settings.Global.getUriFor(Settings.Global.DEVICE_POLICY_CONSTANTS);
+
+ DevicePolicyConstantsObserver(Handler handler) {
+ super(handler);
+ }
+
+ void register() {
+ mInjector.registerContentObserver(
+ mConstantsUri, /* notifyForDescendents= */ false, this, UserHandle.USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ mConstants = loadConstants();
+ }
+ }
+
@VisibleForTesting
final class LocalService extends DevicePolicyManagerInternal {
private List<OnCrossProfileWidgetProvidersChangeListener> mWidgetProviderListeners;
@@ -14180,4 +14190,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return false;
}
}
+
+ private DevicePolicyConstants loadConstants() {
+ return DevicePolicyConstants.loadFromString(
+ mInjector.settingsGlobalGetString(Global.DEVICE_POLICY_CONSTANTS));
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java b/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java
index d0ec0eeebd5c..699bec2c9329 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java
@@ -23,6 +23,7 @@ import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USE
import static com.android.internal.util.Preconditions.checkNotNull;
import android.annotation.NonNull;
+import android.annotation.UserIdInt;
import android.app.admin.DeviceAdminReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -30,15 +31,13 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.util.ArraySet;
import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSystemProperty;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.view.IInputMethodManager;
+import com.android.server.inputmethod.InputMethodManagerInternal;
import java.util.Arrays;
import java.util.List;
@@ -53,18 +52,38 @@ public class OverlayPackagesProvider {
protected static final String TAG = "OverlayPackagesProvider";
private final PackageManager mPm;
- private final IInputMethodManager mIInputMethodManager;
private final Context mContext;
+ private final Injector mInjector;
public OverlayPackagesProvider(Context context) {
- this(context, getIInputMethodManager());
+ this(context, new DefaultInjector());
}
@VisibleForTesting
- OverlayPackagesProvider(Context context, IInputMethodManager iInputMethodManager) {
+ interface Injector {
+ boolean isPerProfileImeEnabled();
+ @NonNull
+ List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId);
+ }
+
+ private static final class DefaultInjector implements Injector {
+ @Override
+ public boolean isPerProfileImeEnabled() {
+ return InputMethodSystemProperty.PER_PROFILE_IME_ENABLED;
+ }
+
+ @NonNull
+ @Override
+ public List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId) {
+ return InputMethodManagerInternal.get().getInputMethodListAsUser(userId);
+ }
+ }
+
+ @VisibleForTesting
+ OverlayPackagesProvider(Context context, Injector injector) {
mContext = context;
mPm = checkNotNull(context.getPackageManager());
- mIInputMethodManager = checkNotNull(iInputMethodManager);
+ mInjector = checkNotNull(injector);
}
/**
@@ -89,10 +108,12 @@ public class OverlayPackagesProvider {
// Newly installed system apps are uninstalled when they are not required and are either
// disallowed or have a launcher icon.
nonRequiredApps.removeAll(getRequiredApps(provisioningAction, admin.getPackageName()));
- // Don't delete the system input method packages in case of Device owner provisioning.
- if (ACTION_PROVISION_MANAGED_DEVICE.equals(provisioningAction)
+ if (mInjector.isPerProfileImeEnabled()) {
+ nonRequiredApps.removeAll(getSystemInputMethods(userId));
+ } else if (ACTION_PROVISION_MANAGED_DEVICE.equals(provisioningAction)
|| ACTION_PROVISION_MANAGED_USER.equals(provisioningAction)) {
- nonRequiredApps.removeAll(getSystemInputMethods());
+ // Don't delete the system input method packages in case of Device owner provisioning.
+ nonRequiredApps.removeAll(getSystemInputMethods(userId));
}
nonRequiredApps.addAll(getDisallowedApps(provisioningAction));
return nonRequiredApps;
@@ -114,16 +135,8 @@ public class OverlayPackagesProvider {
return apps;
}
- private Set<String> getSystemInputMethods() {
- // InputMethodManager is final so it cannot be mocked.
- // So, we're using IInputMethodManager directly because it can be mocked.
- final List<InputMethodInfo> inputMethods;
- try {
- inputMethods = mIInputMethodManager.getInputMethodList();
- } catch (RemoteException e) {
- // Should not happen
- return null;
- }
+ private Set<String> getSystemInputMethods(int userId) {
+ final List<InputMethodInfo> inputMethods = mInjector.getInputMethodListAsUser(userId);
final Set<String> systemInputMethods = new ArraySet<>();
for (InputMethodInfo inputMethodInfo : inputMethods) {
ApplicationInfo applicationInfo = inputMethodInfo.getServiceInfo().applicationInfo;
@@ -149,11 +162,6 @@ public class OverlayPackagesProvider {
return disallowedApps;
}
- private static IInputMethodManager getIInputMethodManager() {
- final IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
- return IInputMethodManager.Stub.asInterface(b);
- }
-
private Set<String> getRequiredAppsSet(String provisioningAction) {
final int resId;
switch (provisioningAction) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java b/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java
index d8a875d7747b..cf68ccf9f306 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/UpdateInstaller.java
@@ -16,10 +16,13 @@
package com.android.server.devicepolicy;
+import android.annotation.Nullable;
import android.app.admin.DevicePolicyEventLogger;
import android.app.admin.DevicePolicyManager;
import android.app.admin.StartInstallingUpdateCallback;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.FileUtils;
@@ -41,7 +44,8 @@ abstract class UpdateInstaller {
private ParcelFileDescriptor mUpdateFileDescriptor;
private DevicePolicyConstants mConstants;
protected Context mContext;
- protected File mCopiedUpdateFile;
+
+ @Nullable protected File mCopiedUpdateFile;
static final String TAG = "UpdateInstaller";
private DevicePolicyManagerService.Injector mInjector;
@@ -59,7 +63,8 @@ abstract class UpdateInstaller {
public abstract void installUpdateInThread();
public void startInstallUpdate() {
- if (!checkIfBatteryIsSufficient()) {
+ mCopiedUpdateFile = null;
+ if (!isBatteryLevelSufficient()) {
notifyCallbackOnError(
DevicePolicyManager.InstallUpdateCallback.UPDATE_ERROR_BATTERY_LOW,
"The battery level must be above "
@@ -81,17 +86,21 @@ abstract class UpdateInstaller {
thread.start();
}
- private boolean checkIfBatteryIsSufficient() {
- BatteryManager batteryManager =
- (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE);
- if (batteryManager != null) {
- int chargePercentage = batteryManager
- .getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
- return batteryManager.isCharging()
- ? chargePercentage >= mConstants.BATTERY_THRESHOLD_CHARGING
- : chargePercentage >= mConstants.BATTERY_THRESHOLD_NOT_CHARGING;
- }
- return false;
+ private boolean isBatteryLevelSufficient() {
+ Intent batteryStatus = mContext.registerReceiver(
+ /* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ float batteryPercentage = calculateBatteryPercentage(batteryStatus);
+ boolean isBatteryPluggedIn =
+ batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, /* defaultValue= */ -1) > 0;
+ return isBatteryPluggedIn
+ ? batteryPercentage >= mConstants.BATTERY_THRESHOLD_CHARGING
+ : batteryPercentage >= mConstants.BATTERY_THRESHOLD_NOT_CHARGING;
+ }
+
+ private float calculateBatteryPercentage(Intent batteryStatus) {
+ int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, /* defaultValue= */ -1);
+ int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, /* defaultValue= */ -1);
+ return 100 * level / (float) scale;
}
private File copyUpdateFileToDataOtaPackageDir() {
@@ -127,7 +136,7 @@ abstract class UpdateInstaller {
}
void cleanupUpdateFile() {
- if (mCopiedUpdateFile.exists()) {
+ if (mCopiedUpdateFile != null && mCopiedUpdateFile.exists()) {
mCopiedUpdateFile.delete();
}
}
diff --git a/services/ipmemorystore/Android.bp b/services/ipmemorystore/Android.bp
new file mode 100644
index 000000000000..013cf5616904
--- /dev/null
+++ b/services/ipmemorystore/Android.bp
@@ -0,0 +1,4 @@
+java_library_static {
+ name: "services.ipmemorystore",
+ srcs: ["java/**/*.java"],
+}
diff --git a/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreDatabase.java b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreDatabase.java
new file mode 100644
index 000000000000..238f07715ce3
--- /dev/null
+++ b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreDatabase.java
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2018 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.net.ipmemorystore;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.NetworkUtils;
+import android.net.ipmemorystore.NetworkAttributes;
+import android.net.ipmemorystore.Status;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Encapsulating class for using the SQLite database backing the memory store.
+ *
+ * This class groups together the contracts and the SQLite helper used to
+ * use the database.
+ *
+ * @hide
+ */
+public class IpMemoryStoreDatabase {
+ private static final String TAG = IpMemoryStoreDatabase.class.getSimpleName();
+
+ /**
+ * Contract class for the Network Attributes table.
+ */
+ public static class NetworkAttributesContract {
+ public static final String TABLENAME = "NetworkAttributes";
+
+ public static final String COLNAME_L2KEY = "l2Key";
+ public static final String COLTYPE_L2KEY = "TEXT NOT NULL";
+
+ public static final String COLNAME_EXPIRYDATE = "expiryDate";
+ // Milliseconds since the Epoch, in true Java style
+ public static final String COLTYPE_EXPIRYDATE = "BIGINT";
+
+ public static final String COLNAME_ASSIGNEDV4ADDRESS = "assignedV4Address";
+ public static final String COLTYPE_ASSIGNEDV4ADDRESS = "INTEGER";
+
+ // Please note that the group hint is only a *hint*, hence its name. The client can offer
+ // this information to nudge the grouping in the decision it thinks is right, but it can't
+ // decide for the memory store what is the same L3 network.
+ public static final String COLNAME_GROUPHINT = "groupHint";
+ public static final String COLTYPE_GROUPHINT = "TEXT";
+
+ public static final String COLNAME_DNSADDRESSES = "dnsAddresses";
+ // Stored in marshalled form as is
+ public static final String COLTYPE_DNSADDRESSES = "BLOB";
+
+ public static final String COLNAME_MTU = "mtu";
+ public static final String COLTYPE_MTU = "INTEGER DEFAULT -1";
+
+ public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "
+ + TABLENAME + " ("
+ + COLNAME_L2KEY + " " + COLTYPE_L2KEY + " PRIMARY KEY NOT NULL, "
+ + COLNAME_EXPIRYDATE + " " + COLTYPE_EXPIRYDATE + ", "
+ + COLNAME_ASSIGNEDV4ADDRESS + " " + COLTYPE_ASSIGNEDV4ADDRESS + ", "
+ + COLNAME_GROUPHINT + " " + COLTYPE_GROUPHINT + ", "
+ + COLNAME_DNSADDRESSES + " " + COLTYPE_DNSADDRESSES + ", "
+ + COLNAME_MTU + " " + COLTYPE_MTU + ")";
+ public static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLENAME;
+ }
+
+ /**
+ * Contract class for the Private Data table.
+ */
+ public static class PrivateDataContract {
+ public static final String TABLENAME = "PrivateData";
+
+ public static final String COLNAME_L2KEY = "l2Key";
+ public static final String COLTYPE_L2KEY = "TEXT NOT NULL";
+
+ public static final String COLNAME_CLIENT = "client";
+ public static final String COLTYPE_CLIENT = "TEXT NOT NULL";
+
+ public static final String COLNAME_DATANAME = "dataName";
+ public static final String COLTYPE_DATANAME = "TEXT NOT NULL";
+
+ public static final String COLNAME_DATA = "data";
+ public static final String COLTYPE_DATA = "BLOB NOT NULL";
+
+ public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "
+ + TABLENAME + " ("
+ + COLNAME_L2KEY + " " + COLTYPE_L2KEY + ", "
+ + COLNAME_CLIENT + " " + COLTYPE_CLIENT + ", "
+ + COLNAME_DATANAME + " " + COLTYPE_DATANAME + ", "
+ + COLNAME_DATA + " " + COLTYPE_DATA + ", "
+ + "PRIMARY KEY ("
+ + COLNAME_L2KEY + ", "
+ + COLNAME_CLIENT + ", "
+ + COLNAME_DATANAME + "))";
+ public static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLENAME;
+ }
+
+ // To save memory when the DB is not used, close it after 30s of inactivity. This is
+ // determined manually based on what feels right.
+ private static final long IDLE_CONNECTION_TIMEOUT_MS = 30_000;
+
+ /** The SQLite DB helper */
+ public static class DbHelper extends SQLiteOpenHelper {
+ // Update this whenever changing the schema.
+ private static final int SCHEMA_VERSION = 2;
+ private static final String DATABASE_FILENAME = "IpMemoryStore.db";
+
+ public DbHelper(@NonNull final Context context) {
+ super(context, DATABASE_FILENAME, null, SCHEMA_VERSION);
+ setIdleConnectionTimeout(IDLE_CONNECTION_TIMEOUT_MS);
+ }
+
+ /** Called when the database is created */
+ public void onCreate(@NonNull final SQLiteDatabase db) {
+ db.execSQL(NetworkAttributesContract.CREATE_TABLE);
+ db.execSQL(PrivateDataContract.CREATE_TABLE);
+ }
+
+ /** Called when the database is upgraded */
+ public void onUpgrade(@NonNull final SQLiteDatabase db, final int oldVersion,
+ final int newVersion) {
+ // No upgrade supported yet.
+ db.execSQL(NetworkAttributesContract.DROP_TABLE);
+ db.execSQL(PrivateDataContract.DROP_TABLE);
+ onCreate(db);
+ }
+
+ /** Called when the database is downgraded */
+ public void onDowngrade(@NonNull final SQLiteDatabase db, final int oldVersion,
+ final int newVersion) {
+ // Downgrades always nuke all data and recreate an empty table.
+ db.execSQL(NetworkAttributesContract.DROP_TABLE);
+ db.execSQL(PrivateDataContract.DROP_TABLE);
+ onCreate(db);
+ }
+ }
+
+ @NonNull
+ private static byte[] encodeAddressList(@NonNull final List<InetAddress> addresses) {
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();
+ for (final InetAddress address : addresses) {
+ final byte[] b = address.getAddress();
+ os.write(b.length);
+ os.write(b, 0, b.length);
+ }
+ return os.toByteArray();
+ }
+
+ @NonNull
+ private static ArrayList<InetAddress> decodeAddressList(@NonNull final byte[] encoded) {
+ final ByteArrayInputStream is = new ByteArrayInputStream(encoded);
+ final ArrayList<InetAddress> addresses = new ArrayList<>();
+ int d = -1;
+ while ((d = is.read()) != -1) {
+ final byte[] bytes = new byte[d];
+ is.read(bytes, 0, d);
+ try {
+ addresses.add(InetAddress.getByAddress(bytes));
+ } catch (UnknownHostException e) { /* Hopefully impossible */ }
+ }
+ return addresses;
+ }
+
+ // Convert a NetworkAttributes object to content values to store them in a table compliant
+ // with the contract defined in NetworkAttributesContract.
+ @NonNull
+ private static ContentValues toContentValues(@NonNull final String key,
+ @Nullable final NetworkAttributes attributes, final long expiry) {
+ final ContentValues values = new ContentValues();
+ values.put(NetworkAttributesContract.COLNAME_L2KEY, key);
+ values.put(NetworkAttributesContract.COLNAME_EXPIRYDATE, expiry);
+ if (null != attributes) {
+ if (null != attributes.assignedV4Address) {
+ values.put(NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS,
+ NetworkUtils.inet4AddressToIntHTH(attributes.assignedV4Address));
+ }
+ if (null != attributes.groupHint) {
+ values.put(NetworkAttributesContract.COLNAME_GROUPHINT, attributes.groupHint);
+ }
+ if (null != attributes.dnsAddresses) {
+ values.put(NetworkAttributesContract.COLNAME_DNSADDRESSES,
+ encodeAddressList(attributes.dnsAddresses));
+ }
+ if (null != attributes.mtu) {
+ values.put(NetworkAttributesContract.COLNAME_MTU, attributes.mtu);
+ }
+ }
+ return values;
+ }
+
+ // Convert a byte array into content values to store it in a table compliant with the
+ // contract defined in PrivateDataContract.
+ @NonNull
+ private static ContentValues toContentValues(@NonNull final String key,
+ @NonNull final String clientId, @NonNull final String name,
+ @NonNull final byte[] data) {
+ final ContentValues values = new ContentValues();
+ values.put(PrivateDataContract.COLNAME_L2KEY, key);
+ values.put(PrivateDataContract.COLNAME_CLIENT, clientId);
+ values.put(PrivateDataContract.COLNAME_DATANAME, name);
+ values.put(PrivateDataContract.COLNAME_DATA, data);
+ return values;
+ }
+
+ private static final String[] EXPIRY_COLUMN = new String[] {
+ NetworkAttributesContract.COLNAME_EXPIRYDATE
+ };
+ static final int EXPIRY_ERROR = -1; // Legal values for expiry are positive
+
+ static final String SELECT_L2KEY = NetworkAttributesContract.COLNAME_L2KEY + " = ?";
+
+ // Returns the expiry date of the specified row, or one of the error codes above if the
+ // row is not found or some other error
+ static long getExpiry(@NonNull final SQLiteDatabase db, @NonNull final String key) {
+ final Cursor cursor = db.query(NetworkAttributesContract.TABLENAME,
+ EXPIRY_COLUMN, // columns
+ SELECT_L2KEY, // selection
+ new String[] { key }, // selectionArgs
+ null, // groupBy
+ null, // having
+ null // orderBy
+ );
+ // L2KEY is the primary key ; it should not be possible to get more than one
+ // result here. 0 results means the key was not found.
+ if (cursor.getCount() != 1) return EXPIRY_ERROR;
+ cursor.moveToFirst();
+ return cursor.getLong(0); // index in the EXPIRY_COLUMN array
+ }
+
+ static final int RELEVANCE_ERROR = -1; // Legal values for relevance are positive
+
+ // Returns the relevance of the specified row, or one of the error codes above if the
+ // row is not found or some other error
+ static int getRelevance(@NonNull final SQLiteDatabase db, @NonNull final String key) {
+ final long expiry = getExpiry(db, key);
+ return expiry < 0 ? (int) expiry : RelevanceUtils.computeRelevanceForNow(expiry);
+ }
+
+ // If the attributes are null, this will only write the expiry.
+ // Returns an int out of Status.{SUCCESS,ERROR_*}
+ static int storeNetworkAttributes(@NonNull final SQLiteDatabase db, @NonNull final String key,
+ final long expiry, @Nullable final NetworkAttributes attributes) {
+ final ContentValues cv = toContentValues(key, attributes, expiry);
+ db.beginTransaction();
+ try {
+ // Unfortunately SQLite does not have any way to do INSERT OR UPDATE. Options are
+ // to either insert with on conflict ignore then update (like done here), or to
+ // construct a custom SQL INSERT statement with nested select.
+ final long resultId = db.insertWithOnConflict(NetworkAttributesContract.TABLENAME,
+ null, cv, SQLiteDatabase.CONFLICT_IGNORE);
+ if (resultId < 0) {
+ db.update(NetworkAttributesContract.TABLENAME, cv, SELECT_L2KEY, new String[]{key});
+ }
+ db.setTransactionSuccessful();
+ return Status.SUCCESS;
+ } catch (SQLiteException e) {
+ // No space left on disk or something
+ Log.e(TAG, "Could not write to the memory store", e);
+ } finally {
+ db.endTransaction();
+ }
+ return Status.ERROR_STORAGE;
+ }
+
+ // Returns an int out of Status.{SUCCESS,ERROR_*}
+ static int storeBlob(@NonNull final SQLiteDatabase db, @NonNull final String key,
+ @NonNull final String clientId, @NonNull final String name,
+ @NonNull final byte[] data) {
+ final long res = db.insertWithOnConflict(PrivateDataContract.TABLENAME, null,
+ toContentValues(key, clientId, name, data), SQLiteDatabase.CONFLICT_REPLACE);
+ return (res == -1) ? Status.ERROR_STORAGE : Status.SUCCESS;
+ }
+
+ @Nullable
+ static NetworkAttributes retrieveNetworkAttributes(@NonNull final SQLiteDatabase db,
+ @NonNull final String key) {
+ final Cursor cursor = db.query(NetworkAttributesContract.TABLENAME,
+ null, // columns, null means everything
+ NetworkAttributesContract.COLNAME_L2KEY + " = ?", // selection
+ new String[] { key }, // selectionArgs
+ null, // groupBy
+ null, // having
+ null); // orderBy
+ // L2KEY is the primary key ; it should not be possible to get more than one
+ // result here. 0 results means the key was not found.
+ if (cursor.getCount() != 1) return null;
+ cursor.moveToFirst();
+
+ // Make sure the data hasn't expired
+ final long expiry = cursor.getLong(
+ cursor.getColumnIndexOrThrow(NetworkAttributesContract.COLNAME_EXPIRYDATE));
+ if (expiry < System.currentTimeMillis()) return null;
+
+ final NetworkAttributes.Builder builder = new NetworkAttributes.Builder();
+ final int assignedV4AddressInt = getInt(cursor,
+ NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS, 0);
+ final String groupHint = getString(cursor, NetworkAttributesContract.COLNAME_GROUPHINT);
+ final byte[] dnsAddressesBlob =
+ getBlob(cursor, NetworkAttributesContract.COLNAME_DNSADDRESSES);
+ final int mtu = getInt(cursor, NetworkAttributesContract.COLNAME_MTU, -1);
+ if (0 != assignedV4AddressInt) {
+ builder.setAssignedV4Address(NetworkUtils.intToInet4AddressHTH(assignedV4AddressInt));
+ }
+ builder.setGroupHint(groupHint);
+ if (null != dnsAddressesBlob) {
+ builder.setDnsAddresses(decodeAddressList(dnsAddressesBlob));
+ }
+ if (mtu >= 0) {
+ builder.setMtu(mtu);
+ }
+ return builder.build();
+ }
+
+ private static final String[] DATA_COLUMN = new String[] {
+ PrivateDataContract.COLNAME_DATA
+ };
+ @Nullable
+ static byte[] retrieveBlob(@NonNull final SQLiteDatabase db, @NonNull final String key,
+ @NonNull final String clientId, @NonNull final String name) {
+ final Cursor cursor = db.query(PrivateDataContract.TABLENAME,
+ DATA_COLUMN, // columns
+ PrivateDataContract.COLNAME_L2KEY + " = ? AND " // selection
+ + PrivateDataContract.COLNAME_CLIENT + " = ? AND "
+ + PrivateDataContract.COLNAME_DATANAME + " = ?",
+ new String[] { key, clientId, name }, // selectionArgs
+ null, // groupBy
+ null, // having
+ null); // orderBy
+ // The query above is querying by (composite) primary key, so it should not be possible to
+ // get more than one result here. 0 results means the key was not found.
+ if (cursor.getCount() != 1) return null;
+ cursor.moveToFirst();
+ return cursor.getBlob(0); // index in the DATA_COLUMN array
+ }
+
+ // Helper methods
+ static String getString(final Cursor cursor, final String columnName) {
+ final int columnIndex = cursor.getColumnIndex(columnName);
+ return (columnIndex >= 0) ? cursor.getString(columnIndex) : null;
+ }
+ static byte[] getBlob(final Cursor cursor, final String columnName) {
+ final int columnIndex = cursor.getColumnIndex(columnName);
+ return (columnIndex >= 0) ? cursor.getBlob(columnIndex) : null;
+ }
+ static int getInt(final Cursor cursor, final String columnName, final int defaultValue) {
+ final int columnIndex = cursor.getColumnIndex(columnName);
+ return (columnIndex >= 0) ? cursor.getInt(columnIndex) : defaultValue;
+ }
+}
diff --git a/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreService.java b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreService.java
new file mode 100644
index 000000000000..444b299d49e6
--- /dev/null
+++ b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/IpMemoryStoreService.java
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C) 2018 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.net.ipmemorystore;
+
+import static android.net.ipmemorystore.Status.ERROR_DATABASE_CANNOT_BE_OPENED;
+import static android.net.ipmemorystore.Status.ERROR_GENERIC;
+import static android.net.ipmemorystore.Status.ERROR_ILLEGAL_ARGUMENT;
+import static android.net.ipmemorystore.Status.SUCCESS;
+
+import static com.android.server.net.ipmemorystore.IpMemoryStoreDatabase.EXPIRY_ERROR;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.IIpMemoryStore;
+import android.net.ipmemorystore.Blob;
+import android.net.ipmemorystore.IOnBlobRetrievedListener;
+import android.net.ipmemorystore.IOnL2KeyResponseListener;
+import android.net.ipmemorystore.IOnNetworkAttributesRetrieved;
+import android.net.ipmemorystore.IOnSameNetworkResponseListener;
+import android.net.ipmemorystore.IOnStatusListener;
+import android.net.ipmemorystore.NetworkAttributes;
+import android.net.ipmemorystore.NetworkAttributesParcelable;
+import android.net.ipmemorystore.Status;
+import android.net.ipmemorystore.StatusParcelable;
+import android.net.ipmemorystore.Utils;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Implementation for the IP memory store.
+ * This component offers specialized services for network components to store and retrieve
+ * knowledge about networks, and provides intelligence that groups level 2 networks together
+ * into level 3 networks.
+ *
+ * @hide
+ */
+public class IpMemoryStoreService extends IIpMemoryStore.Stub {
+ private static final String TAG = IpMemoryStoreService.class.getSimpleName();
+ private static final int MAX_CONCURRENT_THREADS = 4;
+ private static final boolean DBG = true;
+
+ @NonNull
+ final Context mContext;
+ @Nullable
+ final SQLiteDatabase mDb;
+ @NonNull
+ final ExecutorService mExecutor;
+
+ /**
+ * Construct an IpMemoryStoreService object.
+ * This constructor will block on disk access to open the database.
+ * @param context the context to access storage with.
+ */
+ public IpMemoryStoreService(@NonNull final Context context) {
+ // Note that constructing the service will access the disk and block
+ // for some time, but it should make no difference to the clients. Because
+ // the interface is one-way, clients fire and forget requests, and the callback
+ // will get called eventually in any case, and the framework will wait for the
+ // service to be created to deliver subsequent requests.
+ // Avoiding this would mean the mDb member can't be final, which means the service would
+ // have to test for nullity, care for failure, and allow for a wait at every single access,
+ // which would make the code a lot more complex and require all methods to possibly block.
+ mContext = context;
+ SQLiteDatabase db;
+ final IpMemoryStoreDatabase.DbHelper helper = new IpMemoryStoreDatabase.DbHelper(context);
+ try {
+ db = helper.getWritableDatabase();
+ if (null == db) Log.e(TAG, "Unexpected null return of getWriteableDatabase");
+ } catch (final SQLException e) {
+ Log.e(TAG, "Can't open the Ip Memory Store database", e);
+ db = null;
+ } catch (final Exception e) {
+ Log.wtf(TAG, "Impossible exception Ip Memory Store database", e);
+ db = null;
+ }
+ mDb = db;
+ // The work-stealing thread pool executor will spawn threads as needed up to
+ // the max only when there is no free thread available. This generally behaves
+ // exactly like one would expect it intuitively :
+ // - When work arrives, it will spawn a new thread iff there are no available threads
+ // - When there is no work to do it will shutdown threads after a while (the while
+ // being equal to 2 seconds (not configurable) when max threads are spun up and
+ // twice as much for every one less thread)
+ // - When all threads are busy the work is enqueued and waits for any worker
+ // to become available.
+ // Because the stealing pool is made for very heavily parallel execution of
+ // small tasks that spawn others, it creates a queue per thread that in this
+ // case is overhead. However, the three behaviors above make it a superior
+ // choice to cached or fixedThreadPoolExecutor, neither of which can actually
+ // enqueue a task waiting for a thread to be free. This can probably be solved
+ // with judicious subclassing of ThreadPoolExecutor, but that's a lot of dangerous
+ // complexity for little benefit in this case.
+ mExecutor = Executors.newWorkStealingPool(MAX_CONCURRENT_THREADS);
+ }
+
+ /**
+ * Shutdown the memory store service, cancelling running tasks and dropping queued tasks.
+ *
+ * This is provided to give a way to clean up, and is meant to be available in case of an
+ * emergency shutdown.
+ */
+ public void shutdown() {
+ // By contrast with ExecutorService#shutdown, ExecutorService#shutdownNow tries
+ // to cancel the existing tasks, and does not wait for completion. It does not
+ // guarantee the threads can be terminated in any given amount of time.
+ mExecutor.shutdownNow();
+ if (mDb != null) mDb.close();
+ }
+
+ /** Helper function to make a status object */
+ private StatusParcelable makeStatus(final int code) {
+ return new Status(code).toParcelable();
+ }
+
+ /**
+ * Store network attributes for a given L2 key.
+ *
+ * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2
+ * key and only care about grouping can pass a unique ID here like the ones
+ * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low
+ * relevance of such a network will lead to it being evicted soon if it's not
+ * refreshed. Use findL2Key to try and find a similar L2Key to these attributes.
+ * @param attributes The attributes for this network.
+ * @param listener A listener to inform of the completion of this call, or null if the client
+ * is not interested in learning about success/failure.
+ * Through the listener, returns the L2 key. This is useful if the L2 key was not specified.
+ * If the call failed, the L2 key will be null.
+ */
+ // Note that while l2Key and attributes are non-null in spirit, they are received from
+ // another process. If the remote process decides to ignore everything and send null, this
+ // process should still not crash.
+ @Override
+ public void storeNetworkAttributes(@Nullable final String l2Key,
+ @Nullable final NetworkAttributesParcelable attributes,
+ @Nullable final IOnStatusListener listener) {
+ // Because the parcelable is 100% mutable, the thread may not see its members initialized.
+ // Therefore either an immutable object is created on this same thread before it's passed
+ // to the executor, or there need to be a write barrier here and a read barrier in the
+ // remote thread.
+ final NetworkAttributes na = null == attributes ? null : new NetworkAttributes(attributes);
+ mExecutor.execute(() -> {
+ try {
+ final int code = storeNetworkAttributesAndBlobSync(l2Key, na,
+ null /* clientId */, null /* name */, null /* data */);
+ if (null != listener) listener.onComplete(makeStatus(code));
+ } catch (final RemoteException e) {
+ // Client at the other end died
+ }
+ });
+ }
+
+ /**
+ * Store a binary blob associated with an L2 key and a name.
+ *
+ * @param l2Key The L2 key for this network.
+ * @param clientId The ID of the client.
+ * @param name The name of this data.
+ * @param blob The data to store.
+ * @param listener The listener that will be invoked to return the answer, or null if the
+ * is not interested in learning about success/failure.
+ * Through the listener, returns a status to indicate success or failure.
+ */
+ @Override
+ public void storeBlob(@Nullable final String l2Key, @Nullable final String clientId,
+ @Nullable final String name, @Nullable final Blob blob,
+ @Nullable final IOnStatusListener listener) {
+ final byte[] data = null == blob ? null : blob.data;
+ mExecutor.execute(() -> {
+ try {
+ final int code = storeNetworkAttributesAndBlobSync(l2Key,
+ null /* NetworkAttributes */, clientId, name, data);
+ if (null != listener) listener.onComplete(makeStatus(code));
+ } catch (final RemoteException e) {
+ // Client at the other end died
+ }
+ });
+ }
+
+ /**
+ * Helper method for storeNetworkAttributes and storeBlob.
+ *
+ * Either attributes or none of clientId, name and data may be null. This will write the
+ * passed data if non-null, and will write attributes if non-null, but in any case it will
+ * bump the relevance up.
+ * Returns a success code from Status.
+ */
+ private int storeNetworkAttributesAndBlobSync(@Nullable final String l2Key,
+ @Nullable final NetworkAttributes attributes,
+ @Nullable final String clientId,
+ @Nullable final String name, @Nullable final byte[] data) {
+ if (null == l2Key) return ERROR_ILLEGAL_ARGUMENT;
+ if (null == attributes && null == data) return ERROR_ILLEGAL_ARGUMENT;
+ if (null != data && (null == clientId || null == name)) return ERROR_ILLEGAL_ARGUMENT;
+ if (null == mDb) return ERROR_DATABASE_CANNOT_BE_OPENED;
+ try {
+ final long oldExpiry = IpMemoryStoreDatabase.getExpiry(mDb, l2Key);
+ final long newExpiry = RelevanceUtils.bumpExpiryDate(
+ oldExpiry == EXPIRY_ERROR ? System.currentTimeMillis() : oldExpiry);
+ final int errorCode =
+ IpMemoryStoreDatabase.storeNetworkAttributes(mDb, l2Key, newExpiry, attributes);
+ // If no blob to store, the client is interested in the result of storing the attributes
+ if (null == data) return errorCode;
+ // Otherwise it's interested in the result of storing the blob
+ return IpMemoryStoreDatabase.storeBlob(mDb, l2Key, clientId, name, data);
+ } catch (Exception e) {
+ if (DBG) {
+ Log.e(TAG, "Exception while storing for key {" + l2Key
+ + "} ; NetworkAttributes {" + (null == attributes ? "null" : attributes)
+ + "} ; clientId {" + (null == clientId ? "null" : clientId)
+ + "} ; name {" + (null == name ? "null" : name)
+ + "} ; data {" + Utils.byteArrayToString(data) + "}", e);
+ }
+ }
+ return ERROR_GENERIC;
+ }
+
+ /**
+ * Returns the best L2 key associated with the attributes.
+ *
+ * This will find a record that would be in the same group as the passed attributes. This is
+ * useful to choose the key for storing a sample or private data when the L2 key is not known.
+ * If multiple records are group-close to these attributes, the closest match is returned.
+ * If multiple records have the same closeness, the one with the smaller (unicode codepoint
+ * order) L2 key is returned.
+ * If no record matches these attributes, null is returned.
+ *
+ * @param attributes The attributes of the network to find.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the L2 key if one matched, or null.
+ */
+ @Override
+ public void findL2Key(@NonNull final NetworkAttributesParcelable attributes,
+ @NonNull final IOnL2KeyResponseListener listener) {
+ // TODO : implement this.
+ }
+
+ /**
+ * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point
+ * to the same L3 network. Group-closeness is used to determine this.
+ *
+ * @param l2Key1 The key for the first network.
+ * @param l2Key2 The key for the second network.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, a SameL3NetworkResponse containing the answer and confidence.
+ */
+ @Override
+ public void isSameNetwork(@NonNull final String l2Key1, @NonNull final String l2Key2,
+ @NonNull final IOnSameNetworkResponseListener listener) {
+ // TODO : implement this.
+ }
+
+ /**
+ * Retrieve the network attributes for a key.
+ * If no record is present for this key, this will return null attributes.
+ *
+ * @param l2Key The key of the network to query.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the network attributes and the L2 key associated with
+ * the query.
+ */
+ @Override
+ public void retrieveNetworkAttributes(@Nullable final String l2Key,
+ @Nullable final IOnNetworkAttributesRetrieved listener) {
+ if (null == listener) return;
+ mExecutor.execute(() -> {
+ try {
+ if (null == l2Key) {
+ listener.onL2KeyResponse(makeStatus(ERROR_ILLEGAL_ARGUMENT), l2Key, null);
+ return;
+ }
+ if (null == mDb) {
+ listener.onL2KeyResponse(makeStatus(ERROR_DATABASE_CANNOT_BE_OPENED), l2Key,
+ null);
+ return;
+ }
+ try {
+ final NetworkAttributes attributes =
+ IpMemoryStoreDatabase.retrieveNetworkAttributes(mDb, l2Key);
+ listener.onL2KeyResponse(makeStatus(SUCCESS), l2Key,
+ null == attributes ? null : attributes.toParcelable());
+ } catch (final Exception e) {
+ listener.onL2KeyResponse(makeStatus(ERROR_GENERIC), l2Key, null);
+ }
+ } catch (final RemoteException e) {
+ // Client at the other end died
+ }
+ });
+ }
+
+ /**
+ * Retrieve previously stored private data.
+ * If no data was stored for this L2 key and name this will return null.
+ *
+ * @param l2Key The L2 key.
+ * @param clientId The id of the client that stored this data.
+ * @param name The name of the data.
+ * @param listener The listener that will be invoked to return the answer.
+ * Through the listener, returns the private data if any or null if none, with the L2 key
+ * and the name of the data associated with the query.
+ */
+ @Override
+ public void retrieveBlob(@NonNull final String l2Key, @NonNull final String clientId,
+ @NonNull final String name, @NonNull final IOnBlobRetrievedListener listener) {
+ if (null == listener) return;
+ mExecutor.execute(() -> {
+ try {
+ if (null == l2Key) {
+ listener.onBlobRetrieved(makeStatus(ERROR_ILLEGAL_ARGUMENT), l2Key, name, null);
+ return;
+ }
+ if (null == mDb) {
+ listener.onBlobRetrieved(makeStatus(ERROR_DATABASE_CANNOT_BE_OPENED), l2Key,
+ name, null);
+ return;
+ }
+ try {
+ final Blob b = new Blob();
+ b.data = IpMemoryStoreDatabase.retrieveBlob(mDb, l2Key, clientId, name);
+ listener.onBlobRetrieved(makeStatus(SUCCESS), l2Key, name, b);
+ } catch (final Exception e) {
+ listener.onBlobRetrieved(makeStatus(ERROR_GENERIC), l2Key, name, null);
+ }
+ } catch (final RemoteException e) {
+ // Client at the other end died
+ }
+ });
+ }
+}
diff --git a/services/ipmemorystore/java/com/android/server/net/ipmemorystore/RelevanceUtils.java b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/RelevanceUtils.java
new file mode 100644
index 000000000000..aa454008958d
--- /dev/null
+++ b/services/ipmemorystore/java/com/android/server/net/ipmemorystore/RelevanceUtils.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2018 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.net.ipmemorystore;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * A class containing the logic around the relevance value for
+ * IP Memory Store.
+ *
+ * @hide
+ */
+public class RelevanceUtils {
+ /**
+ * The relevance is a decaying value that gets lower and lower until it
+ * reaches 0 after some time passes. It follows an exponential decay law,
+ * dropping slowly at first then faster and faster, because a network is
+ * likely to be visited again if it was visited not long ago, and the longer
+ * it hasn't been visited the more likely it is that it won't be visited
+ * again. For example, a network visited on holiday should stay fresh for
+ * the duration of the holiday and persist for a while, but after the venue
+ * hasn't been visited for a while it should quickly be discarded. What
+ * should accelerate forgetting the network is extended periods without
+ * visits, so that occasional venues get discarded but regular visits keep
+ * the network relevant, even if the visits are infrequent.
+ *
+ * This function must be stable by iteration, meaning that adjusting the same value
+ * for different dates iteratively multiple times should give the same result.
+ * Formally, if f is the decay function that associates a relevance x at a date d1
+ * to the value at ulterior date d3, then for any date d2 between d1 and d3 :
+ * f(x, d3 - d1) = f(f(x, d3 - d2), d2 - d1). Intuitively, this property simply
+ * means it should be the same to compute and store back the value after two months,
+ * or to do it once after one month, store it back, and do it again after another
+ * months has passed.
+ * The pair of the relevance and date define the entire curve, so any pair
+ * of values on the curve will define the same curve. Setting one of them to a
+ * constant, so as not to have to store it, means the other one will always suffice
+ * to describe the curve. For example, only storing the date for a known, constant
+ * value of the relevance is an efficient way of remembering this information (and
+ * to compare relevances together, as f is monotonically decreasing).
+ *
+ *** Choosing the function :
+ * Functions of the kind described above are standard exponential decay functions
+ * like the ones that govern atomic decay where the value at any given date can be
+ * computed uniformly from the value at a previous date and the time elapsed since
+ * that date. It is simple to picture this kind of function as one where after a
+ * given period of time called the half-life, the relevance value will have been
+ * halved. Decay of this kind is expressed in function of the previous value by
+ * functions like
+ * f(x, t) = x * F ^ (t / L)
+ * ...where x is the value, t is the elapsed time, L is the half-life (or more
+ * generally the F-th-life) and F the decay factor (typically 0.5, hence why L is
+ * usually called the half-life). The ^ symbol here is used for exponentiation.
+ * Or, starting at a given M for t = 0 :
+ * f(t) = M * F ^ (t / L)
+ *
+ * Because a line in the store needs to become irrelevant at some point but
+ * this class of functions never go to 0, a minimum cutoff has to be chosen to
+ * represent irrelevance. The simpler way of doing this is to simply add this
+ * minimum cutoff to the computation before and removing it after.
+ * Thus the function becomes :
+ * f(x, t) = ((x + K) * F ^ (t / L)) - K
+ * ...where K is the minimum cutoff, L the half-life, and F the factor between
+ * the original x and x after its half-life. Strictly speaking using the word
+ * "half-life" implies that F = 0.5, but the relation works for any value of F.
+ *
+ * It is easy enough to check that this function satisfies the stability
+ * relation that was given above for any value of F, L and K, which become
+ * parameters that can be defined at will.
+ *
+ * relevance
+ * 1.0 |
+ * |\
+ * | \
+ * | \ (this graph rendered with L = 75 days and K = 1/40)
+ * 0.75| ',
+ * | \
+ * | '.
+ * | \.
+ * | \
+ * 0.5 | '\
+ * | ''.
+ * | ''.
+ * | ''.
+ * 0.25| '''..
+ * | '''..
+ * | ''''....
+ * | '''''..........
+ * 0 +-------------------------------------------------------''''''''''----
+ * 0 50 100 150 200 250 300 350 400 days
+ *
+ *** Choosing the parameters
+ * The maximum M is an arbitrary parameter that simply scales the curve.
+ * The tradeoff for M is pretty simple : if the relevance is going to be an
+ * integer, the bigger M is the more precision there is in the relevance.
+ * However, values of M that are easy for humans to read are preferable to
+ * help debugging, and a suitably low value may be enough to ensure there
+ * won't be integer overflows in intermediate computations.
+ * A value of 1_000_000 probably is plenty for precision, while still in the
+ * low range of what ints can represent.
+ *
+ * F and L are parameters to be chosen arbitrarily and have an impact on how
+ * fast the relevance will be decaying at first, keeping in mind that
+ * the 400 days value and the cap stay the same. In simpler words, F and L
+ * define the steepness of the curve.
+ * To keep things simple (and familiar) F is arbitrarily chosen to be 0.5, and
+ * L is set to 200 days visually to achieve the desired effect. Refer to the
+ * illustration above to get a feel of how that feels.
+ *
+ * Moreover, the memory store works on an assumption that the relevance should
+ * be capped, and that an entry with capped relevance should decay in 400 days.
+ * This is on premises that the networks a device will need to remember the
+ * longest should be networks visited about once a year.
+ * For this reason, the relevance is at the maximum M 400 days before expiry :
+ * f(M, 400 days) = 0
+ * From replacing this with the value of the function, K can then be derived
+ * from the values of M, F and L :
+ * (M + K) * F ^ (t / L) - K = 0
+ * K = M * F ^ (400 days / L) / (1 - F ^ (400 days / L))
+ * Replacing with actual values this gives :
+ * K = 1_000_000 * 0.5 ^ (400 / 200) / (1 - 0.5 ^ (400 / 200))
+ * = 1_000_000 / 3 ≈ 333_333.3
+ * This ensures the function has the desired profile, the desired value at
+ * cap, and the desired value at expiry.
+ *
+ *** Useful relations
+ * Let's define the expiry time for any given relevance x as the interval of
+ * time such as :
+ * f(x, expiry) = 0
+ * which can be rewritten
+ * ((x + K) * F ^ (expiry / L)) = K
+ * ...giving an expression of the expiry in function of the relevance x as
+ * expiry = L * logF(K / (x + K))
+ * Conversely the relevance x can be expressed in function of the expiry as
+ * x = K / F ^ (expiry / L) - K
+ * These relations are useful in utility functions.
+ *
+ *** Bumping things up
+ * The last issue therefore is to decide how to bump up the relevance. The
+ * simple approach is to simply lift up the curve a little bit by a constant
+ * normalized amount, delaying the time of expiry. For example increasing
+ * the relevance by an amount I gives :
+ * x2 = x1 + I
+ * x2 and x1 correspond to two different expiry times expiry2 and expiry1,
+ * and replacing x1 and x2 in the relation above with their expression in
+ * function of the expiry comes :
+ * K / F ^ (expiry2 / L) - K = K / F ^ (expiry1 / L) - K + I
+ * which resolves to :
+ * expiry2 = L * logF(K / (I + K / F ^ (expiry1 / L)))
+ *
+ * In this implementation, the bump is defined as 1/25th of the cap for
+ * the relevance. This means a network will be remembered for the maximum
+ * period of 400 days if connected 25 times in succession not accounting
+ * for decay. Of course decay actually happens so it will take more than 25
+ * connections for any given network to actually reach the cap, but because
+ * decay is slow at first, it is a good estimate of how fast cap happens.
+ *
+ * Specifically, it gives the following four results :
+ * - A network that a device connects to once hits irrelevance about 32.7 days after
+ * it was first registered if never connected again.
+ * - A network that a device connects to once a day at a fixed hour will hit the cap
+ * on the 27th connection.
+ * - A network that a device connects to once a week at a fixed hour will hit the cap
+ * on the 57th connection.
+ * - A network that a device connects to every day for 7 straight days then never again
+ * expires 144 days after the last connection.
+ * These metrics tend to match pretty well the requirements.
+ */
+
+ // TODO : make these constants configurable at runtime. Don't forget to build it so that
+ // changes will wipe the database, migrate the values, or otherwise make sure the relevance
+ // values are still meaningful.
+
+ // How long, in milliseconds, is a capped relevance valid for, or in other
+ // words how many milliseconds after its relevance was set to RELEVANCE_CAP does
+ // any given line expire. 400 days.
+ @VisibleForTesting
+ public static final long CAPPED_RELEVANCE_LIFETIME_MS = 400L * 24 * 60 * 60 * 1000;
+
+ // The constant that represents a normalized 1.0 value for the relevance. In other words,
+ // the cap for the relevance. This is referred to as M in the explanation above.
+ @VisibleForTesting
+ public static final int CAPPED_RELEVANCE = 1_000_000;
+
+ // The decay factor. After a half-life, the relevance will have decayed by this value.
+ // This is referred to as F in the explanation above.
+ private static final double DECAY_FACTOR = 0.5;
+
+ // The half-life. After this time, the relevance will have decayed by a factor DECAY_FACTOR.
+ // This is referred to as L in the explanation above.
+ private static final long HALF_LIFE_MS = 200L * 24 * 60 * 60 * 1000;
+
+ // The value of the frame change. This is referred to as K in the explanation above.
+ private static final double IRRELEVANCE_FLOOR =
+ CAPPED_RELEVANCE * powF((double) CAPPED_RELEVANCE_LIFETIME_MS / HALF_LIFE_MS)
+ / (1 - powF((double) CAPPED_RELEVANCE_LIFETIME_MS / HALF_LIFE_MS));
+
+ // How much to bump the relevance by every time a line is written to.
+ @VisibleForTesting
+ public static final int RELEVANCE_BUMP = CAPPED_RELEVANCE / 25;
+
+ // Java doesn't include a function for the logarithm in an arbitrary base, so implement it
+ private static final double LOG_DECAY_FACTOR = Math.log(DECAY_FACTOR);
+ private static double logF(final double value) {
+ return Math.log(value) / LOG_DECAY_FACTOR;
+ }
+
+ // Utility function to get a power of the decay factor, to simplify the code.
+ private static double powF(final double value) {
+ return Math.pow(DECAY_FACTOR, value);
+ }
+
+ /**
+ * Compute the value of the relevance now given an expiry date.
+ *
+ * @param expiry the date at which the column in the database expires.
+ * @return the adjusted value of the relevance for this moment in time.
+ */
+ public static int computeRelevanceForNow(final long expiry) {
+ return computeRelevanceForTargetDate(expiry, System.currentTimeMillis());
+ }
+
+ /**
+ * Compute the value of the relevance at a given date from an expiry date.
+ *
+ * Because relevance decays with time, a relevance in the past corresponds to
+ * a different relevance later.
+ *
+ * Relevance is always a positive value. 0 means not relevant at all.
+ *
+ * See the explanation at the top of this file to get the justification for this
+ * computation.
+ *
+ * @param expiry the date at which the column in the database expires.
+ * @param target the target date to adjust the relevance to.
+ * @return the adjusted value of the relevance for the target moment.
+ */
+ public static int computeRelevanceForTargetDate(final long expiry, final long target) {
+ final long delay = expiry - target;
+ if (delay >= CAPPED_RELEVANCE_LIFETIME_MS) return CAPPED_RELEVANCE;
+ if (delay <= 0) return 0;
+ return (int) (IRRELEVANCE_FLOOR / powF((float) delay / HALF_LIFE_MS) - IRRELEVANCE_FLOOR);
+ }
+
+ /**
+ * Compute the expiry duration adjusted up for a new fresh write.
+ *
+ * Every time data is written to the memory store for a given line, the
+ * relevance is bumped up by a certain amount, which will boost the priority
+ * of this line for computation of group attributes, and delay (possibly
+ * indefinitely, if the line is accessed regularly) forgetting the data stored
+ * in that line.
+ * As opposed to bumpExpiryDate, this function uses a duration from now to expiry.
+ *
+ * See the explanation at the top of this file for a justification of this computation.
+ *
+ * @param oldExpiryDuration the old expiry duration in milliseconds from now.
+ * @return the expiry duration representing a bumped up relevance value.
+ */
+ public static long bumpExpiryDuration(final long oldExpiryDuration) {
+ // L * logF(K / (I + K / F ^ (expiry1 / L))), as documented above
+ final double divisionFactor = powF(((double) oldExpiryDuration) / HALF_LIFE_MS);
+ final double oldRelevance = IRRELEVANCE_FLOOR / divisionFactor;
+ final long newDuration =
+ (long) (HALF_LIFE_MS * logF(IRRELEVANCE_FLOOR / (RELEVANCE_BUMP + oldRelevance)));
+ return Math.min(newDuration, CAPPED_RELEVANCE_LIFETIME_MS);
+ }
+
+ /**
+ * Compute the new expiry date adjusted up for a new fresh write.
+ *
+ * Every time data is written to the memory store for a given line, the
+ * relevance is bumped up by a certain amount, which will boost the priority
+ * of this line for computation of group attributes, and delay (possibly
+ * indefinitely, if the line is accessed regularly) forgetting the data stored
+ * in that line.
+ * As opposed to bumpExpiryDuration, this function takes the old timestamp and returns the
+ * new timestamp.
+ *
+ * {@see bumpExpiryDuration}, and keep in mind that the bump depends on when this is called,
+ * because the relevance decays exponentially, therefore bumping up a high relevance (for a
+ * date far in the future) is less potent than bumping up a low relevance (for a date in
+ * a close future).
+ *
+ * @param oldExpiryDate the old date of expiration.
+ * @return the new expiration date after the relevance bump.
+ */
+ public static long bumpExpiryDate(final long oldExpiryDate) {
+ final long now = System.currentTimeMillis();
+ final long newDuration = bumpExpiryDuration(oldExpiryDate - now);
+ return now + newDuration;
+ }
+}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 7f84a9073327..09ecc7e3a915 100755
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -75,6 +75,7 @@ import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.widget.ILockSettings;
import com.android.server.am.ActivityManagerService;
import com.android.server.appbinding.AppBindingService;
+import com.android.server.attention.AttentionManagerService;
import com.android.server.audio.AudioService;
import com.android.server.biometrics.BiometricService;
import com.android.server.biometrics.face.FaceService;
@@ -103,10 +104,12 @@ import com.android.server.media.MediaUpdateService;
import com.android.server.media.projection.MediaProjectionManagerService;
import com.android.server.net.NetworkPolicyManagerService;
import com.android.server.net.NetworkStatsService;
+import com.android.server.net.ipmemorystore.IpMemoryStoreService;
import com.android.server.net.watchlist.NetworkWatchlistService;
import com.android.server.notification.NotificationManagerService;
import com.android.server.oemlock.OemLockService;
import com.android.server.om.OverlayManagerService;
+import com.android.server.os.BugreportManagerService;
import com.android.server.os.DeviceIdentifiersPolicyService;
import com.android.server.os.SchedulingPolicyService;
import com.android.server.pm.BackgroundDexOptService;
@@ -119,6 +122,7 @@ import com.android.server.pm.PackageManagerService;
import com.android.server.pm.ShortcutService;
import com.android.server.pm.UserManagerService;
import com.android.server.policy.PhoneWindowManager;
+import com.android.server.policy.role.LegacyRoleResolutionPolicy;
import com.android.server.power.PowerManagerService;
import com.android.server.power.ShutdownThread;
import com.android.server.power.ThermalManagerService;
@@ -152,6 +156,8 @@ import dalvik.system.PathClassLoader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
+import com.google.android.startop.iorap.IorapForwardingService;
+
import java.io.File;
import java.io.IOException;
import java.util.Locale;
@@ -263,6 +269,10 @@ public final class SystemServer {
"com.android.server.accessibility.AccessibilityManagerService$Lifecycle";
private static final String ADB_SERVICE_CLASS =
"com.android.server.adb.AdbService$Lifecycle";
+ private static final String APP_PREDICTION_MANAGER_SERVICE_CLASS =
+ "com.android.server.appprediction.AppPredictionManagerService";
+ private static final String CONTENT_SUGGESTIONS_SERVICE_CLASS =
+ "com.android.server.contentsuggestions.ContentSuggestionsManagerService";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
@@ -789,6 +799,11 @@ public final class SystemServer {
traceBeginAndSlog("StartRollbackManagerService");
mSystemServiceManager.startService(RollbackManagerService.class);
traceEnd();
+
+ // Service to capture bugreports.
+ traceBeginAndSlog("StartBugreportManagerService");
+ mSystemServiceManager.startService(BugreportManagerService.class);
+ traceEnd();
}
/**
@@ -1014,15 +1029,30 @@ public final class SystemServer {
mSystemServiceManager.startService(PinnerService.class);
traceEnd();
+ traceBeginAndSlog("IorapForwardingService");
+ mSystemServiceManager.startService(IorapForwardingService.class);
+ traceEnd();
+
traceBeginAndSlog("SignedConfigService");
SignedConfigService.registerUpdateReceiver(mSystemContext);
traceEnd();
-
} catch (RuntimeException e) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting core service", e);
}
+ // Before things start rolling, be sure we have decided whether
+ // we are in safe mode.
+ final boolean safeMode = wm.detectSafeMode();
+ if (safeMode) {
+ // If yes, immediately turn on the global setting for airplane mode.
+ // Note that this does not send broadcasts at this stage because
+ // subsystems are not yet up. We will send broadcasts later to ensure
+ // all listeners have the chance to react with special handling.
+ Settings.Global.putInt(context.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 1);
+ }
+
StatusBarManagerService statusBar = null;
INotificationManager notification = null;
LocationManagerService location = null;
@@ -1156,6 +1186,16 @@ public final class SystemServer {
startContentCaptureService(context);
+ // App prediction manager service
+ traceBeginAndSlog("StartAppPredictionService");
+ mSystemServiceManager.startService(APP_PREDICTION_MANAGER_SERVICE_CLASS);
+ traceEnd();
+
+ // Content suggestions manager service
+ traceBeginAndSlog("StartContentSuggestionsService");
+ mSystemServiceManager.startService(CONTENT_SUGGESTIONS_SERVICE_CLASS);
+ traceEnd();
+
// NOTE: ClipboardService indirectly depends on IntelligenceService
traceBeginAndSlog("StartClipboardService");
mSystemServiceManager.startService(ClipboardService.class);
@@ -1170,6 +1210,15 @@ public final class SystemServer {
}
traceEnd();
+ traceBeginAndSlog("StartIpMemoryStoreService");
+ try {
+ ServiceManager.addService(Context.IP_MEMORY_STORE_SERVICE,
+ new IpMemoryStoreService(context));
+ } catch (Throwable e) {
+ reportWtf("starting IP Memory Store Service", e);
+ }
+ traceEnd();
+
traceBeginAndSlog("StartIpSecService");
try {
ipSecService = IpSecService.create(context);
@@ -1190,6 +1239,10 @@ public final class SystemServer {
traceEnd();
}
+ traceBeginAndSlog("StartAttentionManagerService");
+ mSystemServiceManager.startService(AttentionManagerService.class);
+ traceEnd();
+
traceBeginAndSlog("StartNetworkScoreService");
mSystemServiceManager.startService(NetworkScoreService.Lifecycle.class);
traceEnd();
@@ -1816,9 +1869,6 @@ public final class SystemServer {
mSystemServiceManager.startService(StatsCompanionService.Lifecycle.class);
traceEnd();
- // Before things start rolling, be sure we have decided whether
- // we are in safe mode.
- final boolean safeMode = wm.detectSafeMode();
if (safeMode) {
traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");
mActivityManagerService.enterSafeMode();
@@ -2002,7 +2052,8 @@ public final class SystemServer {
// Grants default permissions and defines roles
traceBeginAndSlog("StartRoleManagerService");
- mSystemServiceManager.startService(RoleManagerService.class);
+ mSystemServiceManager.startService(new RoleManagerService(
+ mSystemContext, new LegacyRoleResolutionPolicy(mSystemContext)));
traceEnd();
// No dependency on Webview preparation in system server. But this should
@@ -2035,6 +2086,20 @@ public final class SystemServer {
reportWtf("starting System UI", e);
}
traceEnd();
+ // Enable airplane mode in safe mode. setAirplaneMode() cannot be called
+ // earlier as it sends broadcasts to other services.
+ // TODO: This may actually be too late if radio firmware already started leaking
+ // RF before the respective services start. However, fixing this requires changes
+ // to radio firmware and interfaces.
+ if (safeMode) {
+ traceBeginAndSlog("EnableAirplaneModeInSafeMode");
+ try {
+ connectivityF.setAirplaneMode(true);
+ } catch (Throwable e) {
+ reportWtf("enabling Airplane Mode during Safe Mode bootup", e);
+ }
+ traceEnd();
+ }
traceBeginAndSlog("MakeNetworkManagementServiceReady");
try {
if (networkManagementF != null) {
@@ -2229,7 +2294,7 @@ public final class SystemServer {
windowManager.onSystemUiStarted();
}
- private static void traceBeginAndSlog(String name) {
+ private static void traceBeginAndSlog(@NonNull String name) {
Slog.i(TAG, name);
BOOT_TIMINGS_TRACE_LOG.traceBegin(name);
}
diff --git a/services/net/Android.bp b/services/net/Android.bp
index e0ae68f20483..3b4d6a75591f 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -2,3 +2,19 @@ java_library_static {
name: "services.net",
srcs: ["java/**/*.java"],
}
+
+// TODO: move to networking module with DhcpClient and remove lib
+java_library {
+ name: "dhcp-packet-lib",
+ srcs: [
+ "java/android/net/dhcp/*Packet.java",
+ ]
+}
+
+filegroup {
+ name: "services-networkstack-shared-srcs",
+ srcs: [
+ "java/android/net/util/FdEventsReader.java", // TODO: move to NetworkStack with IpClient
+ "java/android/net/shared/*.java",
+ ]
+}
diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java
index f0379059a5f7..d8e2869e6ca5 100644
--- a/services/net/java/android/net/apf/ApfFilter.java
+++ b/services/net/java/android/net/apf/ApfFilter.java
@@ -16,8 +16,19 @@
package android.net.apf;
-import static android.net.util.NetworkConstants.*;
-import static android.system.OsConstants.*;
+import static android.net.util.NetworkConstants.ICMPV6_ECHO_REQUEST_TYPE;
+import static android.net.util.NetworkConstants.ICMPV6_NEIGHBOR_ADVERTISEMENT;
+import static android.net.util.NetworkConstants.ICMPV6_ROUTER_ADVERTISEMENT;
+import static android.net.util.NetworkConstants.ICMPV6_ROUTER_SOLICITATION;
+import static android.system.OsConstants.AF_PACKET;
+import static android.system.OsConstants.ARPHRD_ETHER;
+import static android.system.OsConstants.ETH_P_ARP;
+import static android.system.OsConstants.ETH_P_IP;
+import static android.system.OsConstants.ETH_P_IPV6;
+import static android.system.OsConstants.IPPROTO_ICMPV6;
+import static android.system.OsConstants.IPPROTO_UDP;
+import static android.system.OsConstants.SOCK_RAW;
+
import static com.android.internal.util.BitUtils.bytesToBEInt;
import static com.android.internal.util.BitUtils.getUint16;
import static com.android.internal.util.BitUtils.getUint32;
@@ -34,7 +45,7 @@ import android.net.LinkProperties;
import android.net.NetworkUtils;
import android.net.apf.ApfGenerator.IllegalInstructionException;
import android.net.apf.ApfGenerator.Register;
-import android.net.ip.IpClient;
+import android.net.ip.IpClientCallbacks;
import android.net.metrics.ApfProgramEvent;
import android.net.metrics.ApfStats;
import android.net.metrics.IpConnectivityLog;
@@ -48,10 +59,14 @@ import android.system.PacketSocketAddress;
import android.text.format.DateUtils;
import android.util.Log;
import android.util.Pair;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.HexDump;
import com.android.internal.util.IndentingPrintWriter;
+
+import libcore.io.IoBridge;
+
import java.io.FileDescriptor;
import java.io.IOException;
import java.net.Inet4Address;
@@ -63,7 +78,6 @@ import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
-import libcore.io.IoBridge;
/**
* For networks that support packet filtering via APF programs, {@code ApfFilter}
@@ -308,7 +322,7 @@ public class ApfFilter {
private static final int APF_MAX_ETH_TYPE_BLACK_LIST_LEN = 20;
private final ApfCapabilities mApfCapabilities;
- private final IpClient.Callback mIpClientCallback;
+ private final IpClientCallbacks mIpClientCallback;
private final InterfaceParams mInterfaceParams;
private final IpConnectivityLog mMetricsLog;
@@ -349,7 +363,7 @@ public class ApfFilter {
@VisibleForTesting
ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
- IpClient.Callback ipClientCallback, IpConnectivityLog log) {
+ IpClientCallbacks ipClientCallback, IpConnectivityLog log) {
mApfCapabilities = config.apfCapabilities;
mIpClientCallback = ipClientCallback;
mInterfaceParams = ifParams;
@@ -1390,7 +1404,7 @@ public class ApfFilter {
* filtering using APF programs.
*/
public static ApfFilter maybeCreate(Context context, ApfConfiguration config,
- InterfaceParams ifParams, IpClient.Callback ipClientCallback) {
+ InterfaceParams ifParams, IpClientCallbacks ipClientCallback) {
if (context == null || config == null || ifParams == null) return null;
ApfCapabilities apfCapabilities = config.apfCapabilities;
if (apfCapabilities == null) return null;
diff --git a/services/net/java/android/net/dhcp/DhcpPacket.java b/services/net/java/android/net/dhcp/DhcpPacket.java
index 535160125737..d968ed114b93 100644
--- a/services/net/java/android/net/dhcp/DhcpPacket.java
+++ b/services/net/java/android/net/dhcp/DhcpPacket.java
@@ -1,8 +1,5 @@
package android.net.dhcp;
-import static android.net.util.NetworkConstants.IPV4_MAX_MTU;
-import static android.net.util.NetworkConstants.IPV4_MIN_MTU;
-
import android.annotation.Nullable;
import android.net.DhcpResults;
import android.net.LinkAddress;
@@ -37,6 +34,9 @@ import java.util.List;
public abstract class DhcpPacket {
protected static final String TAG = "DhcpPacket";
+ // TODO: use NetworkStackConstants.IPV4_MIN_MTU once this class is moved to the network stack.
+ private static final int IPV4_MIN_MTU = 68;
+
// dhcpcd has a minimum lease of 20 seconds, but DhcpStateMachine would refuse to wake up the
// CPU for anything shorter than 5 minutes. For sanity's sake, this must be higher than the
// DHCP client timeout.
diff --git a/services/net/java/android/net/dhcp/DhcpServingParamsParcelExt.java b/services/net/java/android/net/dhcp/DhcpServingParamsParcelExt.java
new file mode 100644
index 000000000000..f068c3ac16e2
--- /dev/null
+++ b/services/net/java/android/net/dhcp/DhcpServingParamsParcelExt.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.dhcp;
+
+import static android.net.NetworkUtils.inet4AddressToIntHTH;
+
+import android.annotation.NonNull;
+import android.net.LinkAddress;
+
+import com.google.android.collect.Sets;
+
+import java.net.Inet4Address;
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * Subclass of {@link DhcpServingParamsParcel} with additional utility methods for building.
+ *
+ * <p>This utility class does not check for validity of the parameters: invalid parameters are
+ * reported by the receiving module when unparceling the parcel.
+ *
+ * @see DhcpServingParams
+ * @hide
+ */
+public class DhcpServingParamsParcelExt extends DhcpServingParamsParcel {
+ public static final int MTU_UNSET = 0;
+
+ /**
+ * Set the server address and served prefix for the DHCP server.
+ *
+ * <p>This parameter is required.
+ */
+ public DhcpServingParamsParcelExt setServerAddr(@NonNull LinkAddress serverAddr) {
+ this.serverAddr = inet4AddressToIntHTH((Inet4Address) serverAddr.getAddress());
+ this.serverAddrPrefixLength = serverAddr.getPrefixLength();
+ return this;
+ }
+
+ /**
+ * Set the default routers to be advertised to DHCP clients.
+ *
+ * <p>Each router must be inside the served prefix. This may be an empty set, but it must
+ * always be set explicitly.
+ */
+ public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Set<Inet4Address> defaultRouters) {
+ this.defaultRouters = toIntArray(defaultRouters);
+ return this;
+ }
+
+ /**
+ * Set the default routers to be advertised to DHCP clients.
+ *
+ * <p>Each router must be inside the served prefix. This may be an empty list of routers,
+ * but it must always be set explicitly.
+ */
+ public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Inet4Address... defaultRouters) {
+ return setDefaultRouters(Sets.newArraySet(defaultRouters));
+ }
+
+ /**
+ * Convenience method to build the parameters with no default router.
+ *
+ * <p>Equivalent to calling {@link #setDefaultRouters(Inet4Address...)} with no address.
+ */
+ public DhcpServingParamsParcelExt setNoDefaultRouter() {
+ return setDefaultRouters();
+ }
+
+ /**
+ * Set the DNS servers to be advertised to DHCP clients.
+ *
+ * <p>This may be an empty set, but it must always be set explicitly.
+ */
+ public DhcpServingParamsParcelExt setDnsServers(@NonNull Set<Inet4Address> dnsServers) {
+ this.dnsServers = toIntArray(dnsServers);
+ return this;
+ }
+
+ /**
+ * Set the DNS servers to be advertised to DHCP clients.
+ *
+ * <p>This may be an empty list of servers, but it must always be set explicitly.
+ */
+ public DhcpServingParamsParcelExt setDnsServers(@NonNull Inet4Address... dnsServers) {
+ return setDnsServers(Sets.newArraySet(dnsServers));
+ }
+
+ /**
+ * Convenience method to build the parameters with no DNS server.
+ *
+ * <p>Equivalent to calling {@link #setDnsServers(Inet4Address...)} with no address.
+ */
+ public DhcpServingParamsParcelExt setNoDnsServer() {
+ return setDnsServers();
+ }
+
+ /**
+ * Set excluded addresses that the DHCP server is not allowed to assign to clients.
+ *
+ * <p>This parameter is optional. DNS servers and default routers are always excluded
+ * and do not need to be set here.
+ */
+ public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Set<Inet4Address> excludedAddrs) {
+ this.excludedAddrs = toIntArray(excludedAddrs);
+ return this;
+ }
+
+ /**
+ * Set excluded addresses that the DHCP server is not allowed to assign to clients.
+ *
+ * <p>This parameter is optional. DNS servers and default routers are always excluded
+ * and do not need to be set here.
+ */
+ public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) {
+ return setExcludedAddrs(Sets.newArraySet(excludedAddrs));
+ }
+
+ /**
+ * Set the lease time for leases assigned by the DHCP server.
+ *
+ * <p>This parameter is required.
+ */
+ public DhcpServingParamsParcelExt setDhcpLeaseTimeSecs(long dhcpLeaseTimeSecs) {
+ this.dhcpLeaseTimeSecs = dhcpLeaseTimeSecs;
+ return this;
+ }
+
+ /**
+ * Set the link MTU to be advertised to DHCP clients.
+ *
+ * <p>If set to {@link #MTU_UNSET}, no MTU will be advertised to clients. This parameter
+ * is optional and defaults to {@link #MTU_UNSET}.
+ */
+ public DhcpServingParamsParcelExt setLinkMtu(int linkMtu) {
+ this.linkMtu = linkMtu;
+ return this;
+ }
+
+ /**
+ * Set whether the DHCP server should send the ANDROID_METERED vendor-specific option.
+ *
+ * <p>If not set, the default value is false.
+ */
+ public DhcpServingParamsParcelExt setMetered(boolean metered) {
+ this.metered = metered;
+ return this;
+ }
+
+ private static int[] toIntArray(@NonNull Collection<Inet4Address> addrs) {
+ int[] res = new int[addrs.size()];
+ int i = 0;
+ for (Inet4Address addr : addrs) {
+ res[i] = inet4AddressToIntHTH(addr);
+ i++;
+ }
+ return res;
+ }
+}
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 641c1dfc815b..427267e7003c 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -16,19 +16,19 @@
package android.net.ip;
-import com.android.internal.util.HexDump;
-import com.android.internal.util.MessageUtils;
-import com.android.internal.util.WakeupMessage;
+import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable;
import android.content.Context;
import android.net.DhcpResults;
import android.net.INetd;
import android.net.IpPrefix;
import android.net.LinkAddress;
-import android.net.LinkProperties.ProvisioningChange;
import android.net.LinkProperties;
+import android.net.LinkProperties.ProvisioningChange;
import android.net.Network;
+import android.net.ProvisioningConfigurationParcelable;
import android.net.ProxyInfo;
+import android.net.ProxyInfoParcelable;
import android.net.RouteInfo;
import android.net.StaticIpConfiguration;
import android.net.apf.ApfCapabilities;
@@ -36,10 +36,10 @@ import android.net.apf.ApfFilter;
import android.net.dhcp.DhcpClient;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpManagerEvent;
+import android.net.shared.InitialConfiguration;
import android.net.util.InterfaceParams;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService;
-import android.net.util.NetworkConstants;
import android.net.util.SharedLog;
import android.os.ConditionVariable;
import android.os.INetworkManagementService;
@@ -52,29 +52,24 @@ import android.util.LocalLog;
import android.util.Log;
import android.util.SparseArray;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IState;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.MessageUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
+import com.android.internal.util.WakeupMessage;
import com.android.server.net.NetlinkTracker;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
import java.net.InetAddress;
-import java.net.SocketException;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
-import java.util.Objects;
import java.util.List;
-import java.util.Set;
-import java.util.StringJoiner;
+import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.function.Predicate;
@@ -135,83 +130,17 @@ public class IpClient extends StateMachine {
}
/**
- * Callbacks for handling IpClient events.
- *
- * These methods are called by IpClient on its own thread. Implementations
- * of this class MUST NOT carry out long-running computations or hold locks
- * for which there might be contention with other code calling public
- * methods of the same IpClient instance.
+ * TODO: remove after migrating clients to use IpClientCallbacks directly
+ * @see IpClientCallbacks
*/
- public static class Callback {
- // In order to receive onPreDhcpAction(), call #withPreDhcpAction()
- // when constructing a ProvisioningConfiguration.
- //
- // Implementations of onPreDhcpAction() must call
- // IpClient#completedPreDhcpAction() to indicate that DHCP is clear
- // to proceed.
- public void onPreDhcpAction() {}
- public void onPostDhcpAction() {}
-
- // This is purely advisory and not an indication of provisioning
- // success or failure. This is only here for callers that want to
- // expose DHCPv4 results to other APIs (e.g., WifiInfo#setInetAddress).
- // DHCPv4 or static IPv4 configuration failure or success can be
- // determined by whether or not the passed-in DhcpResults object is
- // null or not.
- public void onNewDhcpResults(DhcpResults dhcpResults) {}
-
- public void onProvisioningSuccess(LinkProperties newLp) {}
- public void onProvisioningFailure(LinkProperties newLp) {}
-
- // Invoked on LinkProperties changes.
- public void onLinkPropertiesChange(LinkProperties newLp) {}
-
- // Called when the internal IpReachabilityMonitor (if enabled) has
- // detected the loss of a critical number of required neighbors.
- public void onReachabilityLost(String logMsg) {}
-
- // Called when the IpClient state machine terminates.
- public void onQuit() {}
-
- // Install an APF program to filter incoming packets.
- public void installPacketFilter(byte[] filter) {}
-
- // Asynchronously read back the APF program & data buffer from the wifi driver.
- // Due to Wifi HAL limitations, the current implementation only supports dumping the entire
- // buffer. In response to this request, the driver returns the data buffer asynchronously
- // by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message.
- public void startReadPacketFilter() {}
-
- // If multicast filtering cannot be accomplished with APF, this function will be called to
- // actuate multicast filtering using another means.
- public void setFallbackMulticastFilter(boolean enabled) {}
-
- // Enabled/disable Neighbor Discover offload functionality. This is
- // called, for example, whenever 464xlat is being started or stopped.
- public void setNeighborDiscoveryOffload(boolean enable) {}
- }
+ public static class Callback extends IpClientCallbacks {}
- public static class WaitForProvisioningCallback extends Callback {
- private final ConditionVariable mCV = new ConditionVariable();
- private LinkProperties mCallbackLinkProperties;
-
- public LinkProperties waitForProvisioning() {
- mCV.block();
- return mCallbackLinkProperties;
- }
-
- @Override
- public void onProvisioningSuccess(LinkProperties newLp) {
- mCallbackLinkProperties = newLp;
- mCV.open();
- }
-
- @Override
- public void onProvisioningFailure(LinkProperties newLp) {
- mCallbackLinkProperties = null;
- mCV.open();
- }
- }
+ /**
+ * TODO: remove once clients are migrated to IpClientUtil.WaitForProvisioningCallback
+ * @see IpClientUtil.WaitForProvisioningCallbacks
+ */
+ public static class WaitForProvisioningCallback
+ extends IpClientUtil.WaitForProvisioningCallbacks {}
// Use a wrapper class to log in order to ensure complete and detailed
// logging. This method is lighter weight than annotations/reflection
@@ -233,12 +162,12 @@ public class IpClient extends StateMachine {
// once passed on to the callback they may be modified by another thread.
//
// TODO: Find an lighter weight approach.
- private class LoggingCallbackWrapper extends Callback {
+ private class LoggingCallbackWrapper extends IpClientCallbacks {
private static final String PREFIX = "INVOKE ";
- private final Callback mCallback;
+ private final IpClientCallbacks mCallback;
- public LoggingCallbackWrapper(Callback callback) {
- mCallback = (callback != null) ? callback : new Callback();
+ LoggingCallbackWrapper(IpClientCallbacks callback) {
+ mCallback = (callback != null) ? callback : new IpClientCallbacks();
}
private void log(String msg) {
@@ -308,293 +237,103 @@ public class IpClient extends StateMachine {
}
/**
- * This class encapsulates parameters to be passed to
- * IpClient#startProvisioning(). A defensive copy is made by IpClient
- * and the values specified herein are in force until IpClient#stop()
- * is called.
- *
- * Example use:
- *
- * final ProvisioningConfiguration config =
- * mIpClient.buildProvisioningConfiguration()
- * .withPreDhcpAction()
- * .withProvisioningTimeoutMs(36 * 1000)
- * .build();
- * mIpClient.startProvisioning(config);
- * ...
- * mIpClient.stop();
- *
- * The specified provisioning configuration will only be active until
- * IpClient#stop() is called. Future calls to IpClient#startProvisioning()
- * must specify the configuration again.
+ * TODO: remove after migrating clients to use the shared configuration class directly.
+ * @see android.net.shared.ProvisioningConfiguration
*/
- public static class ProvisioningConfiguration {
- // TODO: Delete this default timeout once those callers that care are
- // fixed to pass in their preferred timeout.
- //
- // We pick 36 seconds so we can send DHCP requests at
- //
- // t=0, t=2, t=6, t=14, t=30
- //
- // allowing for 10% jitter.
- private static final int DEFAULT_TIMEOUT_MS = 36 * 1000;
-
- public static class Builder {
- private ProvisioningConfiguration mConfig = new ProvisioningConfiguration();
+ public static class ProvisioningConfiguration
+ extends android.net.shared.ProvisioningConfiguration {
+ public ProvisioningConfiguration(android.net.shared.ProvisioningConfiguration other) {
+ super(other);
+ }
+ /**
+ * @see android.net.shared.ProvisioningConfiguration.Builder
+ */
+ public static class Builder extends android.net.shared.ProvisioningConfiguration.Builder {
+ // Override all methods to have a return type matching this Builder
+ @Override
public Builder withoutIPv4() {
- mConfig.mEnableIPv4 = false;
+ super.withoutIPv4();
return this;
}
+ @Override
public Builder withoutIPv6() {
- mConfig.mEnableIPv6 = false;
+ super.withoutIPv6();
return this;
}
+ @Override
public Builder withoutMultinetworkPolicyTracker() {
- mConfig.mUsingMultinetworkPolicyTracker = false;
+ super.withoutMultinetworkPolicyTracker();
return this;
}
+ @Override
public Builder withoutIpReachabilityMonitor() {
- mConfig.mUsingIpReachabilityMonitor = false;
+ super.withoutIpReachabilityMonitor();
return this;
}
+ @Override
public Builder withPreDhcpAction() {
- mConfig.mRequestedPreDhcpActionMs = DEFAULT_TIMEOUT_MS;
+ super.withPreDhcpAction();
return this;
}
+ @Override
public Builder withPreDhcpAction(int dhcpActionTimeoutMs) {
- mConfig.mRequestedPreDhcpActionMs = dhcpActionTimeoutMs;
- return this;
- }
-
- public Builder withInitialConfiguration(InitialConfiguration initialConfig) {
- mConfig.mInitialConfig = initialConfig;
+ super.withPreDhcpAction(dhcpActionTimeoutMs);
return this;
}
+ @Override
public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) {
- mConfig.mStaticIpConfig = staticConfig;
+ super.withStaticConfiguration(staticConfig);
return this;
}
+ @Override
public Builder withApfCapabilities(ApfCapabilities apfCapabilities) {
- mConfig.mApfCapabilities = apfCapabilities;
+ super.withApfCapabilities(apfCapabilities);
return this;
}
+ @Override
public Builder withProvisioningTimeoutMs(int timeoutMs) {
- mConfig.mProvisioningTimeoutMs = timeoutMs;
+ super.withProvisioningTimeoutMs(timeoutMs);
return this;
}
+ @Override
public Builder withRandomMacAddress() {
- mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_EUI64;
+ super.withRandomMacAddress();
return this;
}
+ @Override
public Builder withStableMacAddress() {
- mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY;
+ super.withStableMacAddress();
return this;
}
+ @Override
public Builder withNetwork(Network network) {
- mConfig.mNetwork = network;
+ super.withNetwork(network);
return this;
}
+ @Override
public Builder withDisplayName(String displayName) {
- mConfig.mDisplayName = displayName;
+ super.withDisplayName(displayName);
return this;
}
+ @Override
public ProvisioningConfiguration build() {
return new ProvisioningConfiguration(mConfig);
}
}
-
- /* package */ boolean mEnableIPv4 = true;
- /* package */ boolean mEnableIPv6 = true;
- /* package */ boolean mUsingMultinetworkPolicyTracker = true;
- /* package */ boolean mUsingIpReachabilityMonitor = true;
- /* package */ int mRequestedPreDhcpActionMs;
- /* package */ InitialConfiguration mInitialConfig;
- /* package */ StaticIpConfiguration mStaticIpConfig;
- /* package */ ApfCapabilities mApfCapabilities;
- /* package */ int mProvisioningTimeoutMs = DEFAULT_TIMEOUT_MS;
- /* package */ int mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY;
- /* package */ public boolean mRapidCommit;
- /* package */ public boolean mDiscoverSent;
- /* package */ Network mNetwork = null;
- /* package */ String mDisplayName = null;
-
- public ProvisioningConfiguration() {} // used by Builder
-
- public ProvisioningConfiguration(ProvisioningConfiguration other) {
- mEnableIPv4 = other.mEnableIPv4;
- mEnableIPv6 = other.mEnableIPv6;
- mUsingMultinetworkPolicyTracker = other.mUsingMultinetworkPolicyTracker;
- mUsingIpReachabilityMonitor = other.mUsingIpReachabilityMonitor;
- mRequestedPreDhcpActionMs = other.mRequestedPreDhcpActionMs;
- mInitialConfig = InitialConfiguration.copy(other.mInitialConfig);
- mStaticIpConfig = other.mStaticIpConfig;
- mApfCapabilities = other.mApfCapabilities;
- mProvisioningTimeoutMs = other.mProvisioningTimeoutMs;
- mRapidCommit = other.mRapidCommit;
- mDiscoverSent = other.mDiscoverSent;
- mIPv6AddrGenMode = other.mIPv6AddrGenMode;
- mNetwork = other.mNetwork;
- mDisplayName = other.mDisplayName;
- }
-
- @Override
- public String toString() {
- return new StringJoiner(", ", getClass().getSimpleName() + "{", "}")
- .add("mEnableIPv4: " + mEnableIPv4)
- .add("mEnableIPv6: " + mEnableIPv6)
- .add("mUsingMultinetworkPolicyTracker: " + mUsingMultinetworkPolicyTracker)
- .add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor)
- .add("mRequestedPreDhcpActionMs: " + mRequestedPreDhcpActionMs)
- .add("mInitialConfig: " + mInitialConfig)
- .add("mStaticIpConfig: " + mStaticIpConfig)
- .add("mApfCapabilities: " + mApfCapabilities)
- .add("mProvisioningTimeoutMs: " + mProvisioningTimeoutMs)
- .add("mIPv6AddrGenMode: " + mIPv6AddrGenMode)
- .add("mNetwork: " + mNetwork)
- .add("mDisplayName: " + mDisplayName)
- .toString();
- }
-
- public boolean isValid() {
- return (mInitialConfig == null) || mInitialConfig.isValid();
- }
- }
-
- public static class InitialConfiguration {
- public final Set<LinkAddress> ipAddresses = new HashSet<>();
- public final Set<IpPrefix> directlyConnectedRoutes = new HashSet<>();
- public final Set<InetAddress> dnsServers = new HashSet<>();
- public Inet4Address gateway; // WiFi legacy behavior with static ipv4 config
-
- public static InitialConfiguration copy(InitialConfiguration config) {
- if (config == null) {
- return null;
- }
- InitialConfiguration configCopy = new InitialConfiguration();
- configCopy.ipAddresses.addAll(config.ipAddresses);
- configCopy.directlyConnectedRoutes.addAll(config.directlyConnectedRoutes);
- configCopy.dnsServers.addAll(config.dnsServers);
- return configCopy;
- }
-
- @Override
- public String toString() {
- return String.format(
- "InitialConfiguration(IPs: {%s}, prefixes: {%s}, DNS: {%s}, v4 gateway: %s)",
- join(", ", ipAddresses), join(", ", directlyConnectedRoutes),
- join(", ", dnsServers), gateway);
- }
-
- public boolean isValid() {
- if (ipAddresses.isEmpty()) {
- return false;
- }
-
- // For every IP address, there must be at least one prefix containing that address.
- for (LinkAddress addr : ipAddresses) {
- if (!any(directlyConnectedRoutes, (p) -> p.contains(addr.getAddress()))) {
- return false;
- }
- }
- // For every dns server, there must be at least one prefix containing that address.
- for (InetAddress addr : dnsServers) {
- if (!any(directlyConnectedRoutes, (p) -> p.contains(addr))) {
- return false;
- }
- }
- // All IPv6 LinkAddresses have an RFC7421-suitable prefix length
- // (read: compliant with RFC4291#section2.5.4).
- if (any(ipAddresses, not(InitialConfiguration::isPrefixLengthCompliant))) {
- return false;
- }
- // If directlyConnectedRoutes contains an IPv6 default route
- // then ipAddresses MUST contain at least one non-ULA GUA.
- if (any(directlyConnectedRoutes, InitialConfiguration::isIPv6DefaultRoute)
- && all(ipAddresses, not(InitialConfiguration::isIPv6GUA))) {
- return false;
- }
- // The prefix length of routes in directlyConnectedRoutes be within reasonable
- // bounds for IPv6: /48-/64 just as we’d accept in RIOs.
- if (any(directlyConnectedRoutes, not(InitialConfiguration::isPrefixLengthCompliant))) {
- return false;
- }
- // There no more than one IPv4 address
- if (ipAddresses.stream().filter(LinkAddress::isIPv4).count() > 1) {
- return false;
- }
-
- return true;
- }
-
- /**
- * @return true if the given list of addressess and routes satisfies provisioning for this
- * InitialConfiguration. LinkAddresses and RouteInfo objects are not compared with equality
- * because addresses and routes seen by Netlink will contain additional fields like flags,
- * interfaces, and so on. If this InitialConfiguration has no IP address specified, the
- * provisioning check always fails.
- *
- * If the given list of routes is null, only addresses are taken into considerations.
- */
- public boolean isProvisionedBy(List<LinkAddress> addresses, List<RouteInfo> routes) {
- if (ipAddresses.isEmpty()) {
- return false;
- }
-
- for (LinkAddress addr : ipAddresses) {
- if (!any(addresses, (addrSeen) -> addr.isSameAddressAs(addrSeen))) {
- return false;
- }
- }
-
- if (routes != null) {
- for (IpPrefix prefix : directlyConnectedRoutes) {
- if (!any(routes, (routeSeen) -> isDirectlyConnectedRoute(routeSeen, prefix))) {
- return false;
- }
- }
- }
-
- return true;
- }
-
- private static boolean isDirectlyConnectedRoute(RouteInfo route, IpPrefix prefix) {
- return !route.hasGateway() && prefix.equals(route.getDestination());
- }
-
- private static boolean isPrefixLengthCompliant(LinkAddress addr) {
- return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength());
- }
-
- private static boolean isPrefixLengthCompliant(IpPrefix prefix) {
- return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
- }
-
- private static boolean isCompliantIPv6PrefixLength(int prefixLength) {
- return (NetworkConstants.RFC6177_MIN_PREFIX_LENGTH <= prefixLength)
- && (prefixLength <= NetworkConstants.RFC7421_PREFIX_LENGTH);
- }
-
- private static boolean isIPv6DefaultRoute(IpPrefix prefix) {
- return prefix.getAddress().equals(Inet6Address.ANY);
- }
-
- private static boolean isIPv6GUA(LinkAddress addr) {
- return addr.isIPv6() && addr.isGlobalPreferred();
- }
}
public static final String DUMP_ARG = "ipclient";
@@ -643,7 +382,7 @@ public class IpClient extends StateMachine {
private final String mInterfaceName;
private final String mClatInterfaceName;
@VisibleForTesting
- protected final Callback mCallback;
+ protected final IpClientCallbacks mCallback;
private final Dependencies mDependencies;
private final CountDownLatch mShutdownLatch;
private final INetworkManagementService mNwService;
@@ -662,7 +401,7 @@ public class IpClient extends StateMachine {
* Non-final member variables accessed only from within our StateMachine.
*/
private LinkProperties mLinkProperties;
- private ProvisioningConfiguration mConfiguration;
+ private android.net.shared.ProvisioningConfiguration mConfiguration;
private MultinetworkPolicyTracker mMultinetworkPolicyTracker;
private IpReachabilityMonitor mIpReachabilityMonitor;
private DhcpClient mDhcpClient;
@@ -696,7 +435,7 @@ public class IpClient extends StateMachine {
}
}
- public IpClient(Context context, String ifName, Callback callback) {
+ public IpClient(Context context, String ifName, IpClientCallbacks callback) {
this(context, ifName, callback, new Dependencies());
}
@@ -704,7 +443,7 @@ public class IpClient extends StateMachine {
* An expanded constructor, useful for dependency injection.
* TODO: migrate all test users to mock IpClient directly and remove this ctor.
*/
- public IpClient(Context context, String ifName, Callback callback,
+ public IpClient(Context context, String ifName, IpClientCallbacks callback,
INetworkManagementService nwService) {
this(context, ifName, callback, new Dependencies() {
@Override
@@ -713,7 +452,7 @@ public class IpClient extends StateMachine {
}
@VisibleForTesting
- IpClient(Context context, String ifName, Callback callback, Dependencies deps) {
+ IpClient(Context context, String ifName, IpClientCallbacks callback, Dependencies deps) {
super(IpClient.class.getSimpleName() + "." + ifName);
Preconditions.checkNotNull(ifName);
Preconditions.checkNotNull(callback);
@@ -800,6 +539,57 @@ public class IpClient extends StateMachine {
startStateMachineUpdaters();
}
+ /**
+ * Make a IIpClient connector to communicate with this IpClient.
+ */
+ public IIpClient makeConnector() {
+ return new IpClientConnector();
+ }
+
+ class IpClientConnector extends IIpClient.Stub {
+ @Override
+ public void completedPreDhcpAction() {
+ IpClient.this.completedPreDhcpAction();
+ }
+ @Override
+ public void confirmConfiguration() {
+ IpClient.this.confirmConfiguration();
+ }
+ @Override
+ public void readPacketFilterComplete(byte[] data) {
+ IpClient.this.readPacketFilterComplete(data);
+ }
+ @Override
+ public void shutdown() {
+ IpClient.this.shutdown();
+ }
+ @Override
+ public void startProvisioning(ProvisioningConfigurationParcelable req) {
+ IpClient.this.startProvisioning(
+ android.net.shared.ProvisioningConfiguration.fromStableParcelable(req));
+ }
+ @Override
+ public void stop() {
+ IpClient.this.stop();
+ }
+ @Override
+ public void setTcpBufferSizes(String tcpBufferSizes) {
+ IpClient.this.setTcpBufferSizes(tcpBufferSizes);
+ }
+ @Override
+ public void setHttpProxy(ProxyInfoParcelable proxyInfo) {
+ IpClient.this.setHttpProxy(fromStableParcelable(proxyInfo));
+ }
+ @Override
+ public void setMulticastFilter(boolean enabled) {
+ IpClient.this.setMulticastFilter(enabled);
+ }
+ // TODO: remove and have IpClient logs dumped in NetworkStack dumpsys
+ public void dumpIpClientLogs(FileDescriptor fd, PrintWriter pw, String[] args) {
+ IpClient.this.dump(fd, pw, args);
+ }
+ }
+
private void configureAndStartStateMachine() {
addState(mStoppedState);
addState(mStartedState);
@@ -833,7 +623,9 @@ public class IpClient extends StateMachine {
mShutdownLatch.countDown();
}
- // Shut down this IpClient instance altogether.
+ /**
+ * Shut down this IpClient instance altogether.
+ */
public void shutdown() {
stop();
sendMessage(CMD_TERMINATE_AFTER_STOP);
@@ -854,7 +646,10 @@ public class IpClient extends StateMachine {
return new ProvisioningConfiguration.Builder();
}
- public void startProvisioning(ProvisioningConfiguration req) {
+ /**
+ * Start provisioning with the provided parameters.
+ */
+ public void startProvisioning(android.net.shared.ProvisioningConfiguration req) {
if (!req.isValid()) {
doImmediateProvisioningFailure(IpManagerEvent.ERROR_INVALID_PROVISIONING);
return;
@@ -868,7 +663,7 @@ public class IpClient extends StateMachine {
}
mCallback.setNeighborDiscoveryOffload(true);
- sendMessage(CMD_START, new ProvisioningConfiguration(req));
+ sendMessage(CMD_START, new android.net.shared.ProvisioningConfiguration(req));
}
// TODO: Delete this.
@@ -879,7 +674,7 @@ public class IpClient extends StateMachine {
}
public void startProvisioning() {
- startProvisioning(new ProvisioningConfiguration());
+ startProvisioning(new android.net.shared.ProvisioningConfiguration());
}
public void stop() {
@@ -935,7 +730,7 @@ public class IpClient extends StateMachine {
// Thread-unsafe access to mApfFilter but just used for debugging.
final ApfFilter apfFilter = mApfFilter;
- final ProvisioningConfiguration provisioningConfig = mConfiguration;
+ final android.net.shared.ProvisioningConfiguration provisioningConfig = mConfiguration;
final ApfCapabilities apfCapabilities = (provisioningConfig != null)
? provisioningConfig.mApfCapabilities : null;
@@ -1478,7 +1273,7 @@ public class IpClient extends StateMachine {
break;
case CMD_START:
- mConfiguration = (ProvisioningConfiguration) msg.obj;
+ mConfiguration = (android.net.shared.ProvisioningConfiguration) msg.obj;
transitionTo(mStartedState);
break;
diff --git a/services/net/java/android/net/ip/IpClientUtil.java b/services/net/java/android/net/ip/IpClientUtil.java
new file mode 100644
index 000000000000..0aec10149b23
--- /dev/null
+++ b/services/net/java/android/net/ip/IpClientUtil.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ip;
+
+import android.content.Context;
+import android.net.LinkProperties;
+import android.os.ConditionVariable;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+
+/**
+ * Utilities and wrappers to simplify communication with IpClient, which lives in the NetworkStack
+ * process.
+ *
+ * @hide
+ */
+public class IpClientUtil {
+ // TODO: remove once IpClient dumps are moved to NetworkStack and callers don't need this arg
+ public static final String DUMP_ARG = IpClient.DUMP_ARG;
+
+ /**
+ * Subclass of {@link IpClientCallbacks} allowing clients to block until provisioning is
+ * complete with {@link WaitForProvisioningCallbacks#waitForProvisioning()}.
+ */
+ public static class WaitForProvisioningCallbacks extends IpClientCallbacks {
+ private final ConditionVariable mCV = new ConditionVariable();
+ private LinkProperties mCallbackLinkProperties;
+
+ /**
+ * Block until either {@link #onProvisioningSuccess(LinkProperties)} or
+ * {@link #onProvisioningFailure(LinkProperties)} is called.
+ */
+ public LinkProperties waitForProvisioning() {
+ mCV.block();
+ return mCallbackLinkProperties;
+ }
+
+ @Override
+ public void onProvisioningSuccess(LinkProperties newLp) {
+ mCallbackLinkProperties = newLp;
+ mCV.open();
+ }
+
+ @Override
+ public void onProvisioningFailure(LinkProperties newLp) {
+ mCallbackLinkProperties = null;
+ mCV.open();
+ }
+ }
+
+ /**
+ * Create a new IpClient.
+ *
+ * <p>This is a convenience method to allow clients to use {@link IpClientCallbacks} instead of
+ * {@link IIpClientCallbacks}.
+ */
+ public static void makeIpClient(Context context, String ifName, IpClientCallbacks callback) {
+ // TODO: request IpClient asynchronously from NetworkStack.
+ final IpClient ipClient = new IpClient(context, ifName, callback);
+ callback.onIpClientCreated(ipClient.makeConnector());
+ }
+
+ /**
+ * Dump logs for the specified IpClient.
+ * TODO: remove logging from this method once IpClient logs are dumped in NetworkStack dumpsys,
+ * then remove callers and delete.
+ */
+ public static void dumpIpClient(
+ IIpClient connector, FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!(connector instanceof IpClient.IpClientConnector)) {
+ pw.println("Invalid connector");
+ return;
+ }
+ ((IpClient.IpClientConnector) connector).dumpIpClientLogs(fd, pw, args);
+ }
+}
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
deleted file mode 100644
index 2eb36a22de55..000000000000
--- a/services/net/java/android/net/ip/IpManager.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.ip;
-
-import android.content.Context;
-import android.net.INetd;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.StaticIpConfiguration;
-import android.net.apf.ApfCapabilities;
-import android.net.util.NetdService;
-import android.os.INetworkManagementService;
-import android.os.ServiceManager;
-import android.net.apf.ApfCapabilities;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-
-/*
- * TODO: Delete this altogether in favor of its renamed successor: IpClient.
- *
- * @hide
- */
-public class IpManager extends IpClient {
- public static class ProvisioningConfiguration extends IpClient.ProvisioningConfiguration {
- public ProvisioningConfiguration(IpClient.ProvisioningConfiguration ipcConfig) {
- super(ipcConfig);
- }
-
- public static class Builder extends IpClient.ProvisioningConfiguration.Builder {
- @Override
- public Builder withoutIPv4() {
- super.withoutIPv4();
- return this;
- }
- @Override
- public Builder withoutIPv6() {
- super.withoutIPv6();
- return this;
- }
- @Override
- public Builder withoutIpReachabilityMonitor() {
- super.withoutIpReachabilityMonitor();
- return this;
- }
- @Override
- public Builder withPreDhcpAction() {
- super.withPreDhcpAction();
- return this;
- }
- @Override
- public Builder withPreDhcpAction(int dhcpActionTimeoutMs) {
- super.withPreDhcpAction(dhcpActionTimeoutMs);
- return this;
- }
- // No Override; locally defined type.
- public Builder withInitialConfiguration(InitialConfiguration initialConfig) {
- super.withInitialConfiguration((IpClient.InitialConfiguration) initialConfig);
- return this;
- }
- @Override
- public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) {
- super.withStaticConfiguration(staticConfig);
- return this;
- }
- @Override
- public Builder withApfCapabilities(ApfCapabilities apfCapabilities) {
- super.withApfCapabilities(apfCapabilities);
- return this;
- }
- @Override
- public Builder withProvisioningTimeoutMs(int timeoutMs) {
- super.withProvisioningTimeoutMs(timeoutMs);
- return this;
- }
- @Override
- public Builder withNetwork(Network network) {
- super.withNetwork(network);
- return this;
- }
- @Override
- public Builder withDisplayName(String displayName) {
- super.withDisplayName(displayName);
- return this;
- }
- @Override
- public ProvisioningConfiguration build() {
- return new ProvisioningConfiguration(super.build());
- }
- }
- }
-
- public static ProvisioningConfiguration.Builder buildProvisioningConfiguration() {
- return new ProvisioningConfiguration.Builder();
- }
-
- public static class InitialConfiguration extends IpClient.InitialConfiguration {
- }
-
- public static class Callback extends IpClient.Callback {
- }
-
- public IpManager(Context context, String ifName, Callback callback) {
- super(context, ifName, callback);
- }
-
- public void startProvisioning(ProvisioningConfiguration req) {
- super.startProvisioning((IpClient.ProvisioningConfiguration) req);
- }
-}
diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java
index 57f1dd08634f..8656b1f83192 100644
--- a/services/net/java/android/net/ip/IpServer.java
+++ b/services/net/java/android/net/ip/IpServer.java
@@ -17,20 +17,26 @@
package android.net.ip;
import static android.net.NetworkUtils.numericToInetAddress;
-import static android.net.util.NetworkConstants.asByte;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static android.net.util.NetworkConstants.FF;
import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH;
+import static android.net.util.NetworkConstants.asByte;
+import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetd;
+import android.net.INetworkStackStatusCallback;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
+import android.net.NetworkStack;
import android.net.RouteInfo;
-import android.net.dhcp.DhcpServer;
-import android.net.dhcp.DhcpServingParams;
+import android.net.dhcp.DhcpServerCallbacks;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.DhcpServingParamsParcelExt;
+import android.net.dhcp.IDhcpServer;
import android.net.ip.RouterAdvertisementDaemon.RaParams;
import android.net.util.InterfaceParams;
import android.net.util.InterfaceSet;
@@ -128,6 +134,10 @@ public class IpServer extends StateMachine {
}
public static class Dependencies {
+ private final Context mContext;
+ public Dependencies(Context context) {
+ mContext = context;
+ }
public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) {
return new RouterAdvertisementDaemon(ifParams);
}
@@ -140,9 +150,12 @@ public class IpServer extends StateMachine {
return NetdService.getInstance();
}
- public DhcpServer makeDhcpServer(Looper looper, String ifName,
- DhcpServingParams params, SharedLog log) {
- return new DhcpServer(looper, ifName, params, log);
+ /**
+ * Create a DhcpServer instance to be used by IpServer.
+ */
+ public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
+ DhcpServerCallbacks cb) {
+ mContext.getSystemService(NetworkStack.class).makeDhcpServer(ifName, params, cb);
}
}
@@ -199,7 +212,10 @@ public class IpServer extends StateMachine {
// Advertisements (otherwise, we do not add them to mLinkProperties at all).
private LinkProperties mLastIPv6LinkProperties;
private RouterAdvertisementDaemon mRaDaemon;
- private DhcpServer mDhcpServer;
+
+ // To be accessed only on the handler thread
+ private int mDhcpServerStartIndex = 0;
+ private IDhcpServer mDhcpServer;
private RaParams mLastRaParams;
public IpServer(
@@ -255,35 +271,109 @@ public class IpServer extends StateMachine {
private boolean startIPv4() { return configureIPv4(true); }
+ /**
+ * Convenience wrapper around INetworkStackStatusCallback to run callbacks on the IpServer
+ * handler.
+ *
+ * <p>Different instances of this class can be created for each call to IDhcpServer methods,
+ * with different implementations of the callback, to differentiate handling of success/error in
+ * each call.
+ */
+ private abstract class OnHandlerStatusCallback extends INetworkStackStatusCallback.Stub {
+ @Override
+ public void onStatusAvailable(int statusCode) {
+ getHandler().post(() -> callback(statusCode));
+ }
+
+ public abstract void callback(int statusCode);
+ }
+
+ private class DhcpServerCallbacksImpl extends DhcpServerCallbacks {
+ private final int mStartIndex;
+
+ private DhcpServerCallbacksImpl(int startIndex) {
+ mStartIndex = startIndex;
+ }
+
+ @Override
+ public void onDhcpServerCreated(int statusCode, IDhcpServer server) throws RemoteException {
+ getHandler().post(() -> {
+ // We are on the handler thread: mDhcpServerStartIndex can be read safely.
+ if (mStartIndex != mDhcpServerStartIndex) {
+ // This start request is obsolete. When the |server| binder token goes out of
+ // scope, the garbage collector will finalize it, which causes the network stack
+ // process garbage collector to collect the server itself.
+ return;
+ }
+
+ if (statusCode != STATUS_SUCCESS) {
+ mLog.e("Error obtaining DHCP server: " + statusCode);
+ handleError();
+ return;
+ }
+
+ mDhcpServer = server;
+ try {
+ mDhcpServer.start(new OnHandlerStatusCallback() {
+ @Override
+ public void callback(int startStatusCode) {
+ if (startStatusCode != STATUS_SUCCESS) {
+ mLog.e("Error starting DHCP server: " + startStatusCode);
+ handleError();
+ }
+ }
+ });
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ });
+ }
+
+ private void handleError() {
+ mLastError = ConnectivityManager.TETHER_ERROR_DHCPSERVER_ERROR;
+ transitionTo(mInitialState);
+ }
+ }
+
private boolean startDhcp(Inet4Address addr, int prefixLen) {
if (mUsingLegacyDhcp) {
return true;
}
- final DhcpServingParams params;
- try {
- params = new DhcpServingParams.Builder()
- .setDefaultRouters(addr)
- .setDhcpLeaseTimeSecs(DHCP_LEASE_TIME_SECS)
- .setDnsServers(addr)
- .setServerAddr(new LinkAddress(addr, prefixLen))
- .setMetered(true)
- .build();
- // TODO: also advertise link MTU
- } catch (DhcpServingParams.InvalidParameterException e) {
- Log.e(TAG, "Invalid DHCP parameters", e);
- return false;
- }
-
- mDhcpServer = mDeps.makeDhcpServer(getHandler().getLooper(), mIfaceName, params,
- mLog.forSubComponent("DHCP"));
- mDhcpServer.start();
+ final DhcpServingParamsParcel params;
+ params = new DhcpServingParamsParcelExt()
+ .setDefaultRouters(addr)
+ .setDhcpLeaseTimeSecs(DHCP_LEASE_TIME_SECS)
+ .setDnsServers(addr)
+ .setServerAddr(new LinkAddress(addr, prefixLen))
+ .setMetered(true);
+ // TODO: also advertise link MTU
+
+ mDhcpServerStartIndex++;
+ mDeps.makeDhcpServer(
+ mIfaceName, params, new DhcpServerCallbacksImpl(mDhcpServerStartIndex));
return true;
}
private void stopDhcp() {
+ // Make all previous start requests obsolete so servers are not started later
+ mDhcpServerStartIndex++;
+
if (mDhcpServer != null) {
- mDhcpServer.stop();
- mDhcpServer = null;
+ try {
+ mDhcpServer.stop(new OnHandlerStatusCallback() {
+ @Override
+ public void callback(int statusCode) {
+ if (statusCode != STATUS_SUCCESS) {
+ mLog.e("Error stopping DHCP server: " + statusCode);
+ mLastError = ConnectivityManager.TETHER_ERROR_DHCPSERVER_ERROR;
+ // Not much more we can do here
+ }
+ }
+ });
+ mDhcpServer = null;
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
}
diff --git a/services/net/java/android/net/netlink/ConntrackMessage.java b/services/net/java/android/net/netlink/ConntrackMessage.java
index 605c46b3b4e0..4ee64321f262 100644
--- a/services/net/java/android/net/netlink/ConntrackMessage.java
+++ b/services/net/java/android/net/netlink/ConntrackMessage.java
@@ -28,7 +28,6 @@ import static java.nio.ByteOrder.BIG_ENDIAN;
import android.system.OsConstants;
import android.util.Log;
-import libcore.io.SizeOf;
import java.net.Inet4Address;
import java.net.Inet6Address;
diff --git a/services/net/java/android/net/netlink/StructNfGenMsg.java b/services/net/java/android/net/netlink/StructNfGenMsg.java
index 99695e23b248..8155977b6e6a 100644
--- a/services/net/java/android/net/netlink/StructNfGenMsg.java
+++ b/services/net/java/android/net/netlink/StructNfGenMsg.java
@@ -16,8 +16,6 @@
package android.net.netlink;
-import libcore.io.SizeOf;
-
import java.nio.ByteBuffer;
@@ -29,7 +27,7 @@ import java.nio.ByteBuffer;
* @hide
*/
public class StructNfGenMsg {
- public static final int STRUCT_SIZE = 2 + SizeOf.SHORT;
+ public static final int STRUCT_SIZE = 2 + Short.BYTES;
public static final int NFNETLINK_V0 = 0;
diff --git a/services/net/java/android/net/netlink/StructNlAttr.java b/services/net/java/android/net/netlink/StructNlAttr.java
index 811bdbbe821a..28a4e883a316 100644
--- a/services/net/java/android/net/netlink/StructNlAttr.java
+++ b/services/net/java/android/net/netlink/StructNlAttr.java
@@ -17,7 +17,6 @@
package android.net.netlink;
import android.net.netlink.NetlinkConstants;
-import libcore.io.SizeOf;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -117,7 +116,7 @@ public class StructNlAttr {
public StructNlAttr(short type, short value, ByteOrder order) {
this(order);
nla_type = type;
- setValue(new byte[SizeOf.SHORT]);
+ setValue(new byte[Short.BYTES]);
getValueAsByteBuffer().putShort(value);
}
@@ -128,7 +127,7 @@ public class StructNlAttr {
public StructNlAttr(short type, int value, ByteOrder order) {
this(order);
nla_type = type;
- setValue(new byte[SizeOf.INT]);
+ setValue(new byte[Integer.BYTES]);
getValueAsByteBuffer().putInt(value);
}
@@ -164,7 +163,7 @@ public class StructNlAttr {
public int getValueAsInt(int defaultValue) {
final ByteBuffer byteBuffer = getValueAsByteBuffer();
- if (byteBuffer == null || byteBuffer.remaining() != SizeOf.INT) {
+ if (byteBuffer == null || byteBuffer.remaining() != Integer.BYTES) {
return defaultValue;
}
return getValueAsByteBuffer().getInt();
diff --git a/services/net/java/android/net/netlink/StructNlMsgErr.java b/services/net/java/android/net/netlink/StructNlMsgErr.java
index f095af43c743..6fcc6e69da5b 100644
--- a/services/net/java/android/net/netlink/StructNlMsgErr.java
+++ b/services/net/java/android/net/netlink/StructNlMsgErr.java
@@ -18,7 +18,6 @@ package android.net.netlink;
import android.net.netlink.NetlinkConstants;
import android.net.netlink.StructNlMsgHdr;
-import libcore.io.SizeOf;
import java.nio.ByteBuffer;
@@ -31,7 +30,7 @@ import java.nio.ByteBuffer;
* @hide
*/
public class StructNlMsgErr {
- public static final int STRUCT_SIZE = SizeOf.INT + StructNlMsgHdr.STRUCT_SIZE;
+ public static final int STRUCT_SIZE = Integer.BYTES + StructNlMsgHdr.STRUCT_SIZE;
public static boolean hasAvailableSpace(ByteBuffer byteBuffer) {
return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE;
diff --git a/services/net/java/android/net/shared/InitialConfiguration.java b/services/net/java/android/net/shared/InitialConfiguration.java
new file mode 100644
index 000000000000..bc2373f4aabc
--- /dev/null
+++ b/services/net/java/android/net/shared/InitialConfiguration.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.shared.ParcelableUtil.fromParcelableArray;
+import static android.net.shared.ParcelableUtil.toParcelableArray;
+import static android.text.TextUtils.join;
+
+import android.net.InitialConfigurationParcelable;
+import android.net.IpPrefix;
+import android.net.IpPrefixParcelable;
+import android.net.LinkAddress;
+import android.net.LinkAddressParcelable;
+import android.net.RouteInfo;
+
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Predicate;
+
+/** @hide */
+public class InitialConfiguration {
+ public final Set<LinkAddress> ipAddresses = new HashSet<>();
+ public final Set<IpPrefix> directlyConnectedRoutes = new HashSet<>();
+ public final Set<InetAddress> dnsServers = new HashSet<>();
+
+ private static final int RFC6177_MIN_PREFIX_LENGTH = 48;
+ private static final int RFC7421_PREFIX_LENGTH = 64;
+
+ /**
+ * Create a InitialConfiguration that is a copy of the specified configuration.
+ */
+ public static InitialConfiguration copy(InitialConfiguration config) {
+ if (config == null) {
+ return null;
+ }
+ InitialConfiguration configCopy = new InitialConfiguration();
+ configCopy.ipAddresses.addAll(config.ipAddresses);
+ configCopy.directlyConnectedRoutes.addAll(config.directlyConnectedRoutes);
+ configCopy.dnsServers.addAll(config.dnsServers);
+ return configCopy;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "InitialConfiguration(IPs: {%s}, prefixes: {%s}, DNS: {%s})",
+ join(", ", ipAddresses), join(", ", directlyConnectedRoutes),
+ join(", ", dnsServers));
+ }
+
+ /**
+ * Tests whether the contents of this IpConfiguration represent a valid configuration.
+ */
+ public boolean isValid() {
+ if (ipAddresses.isEmpty()) {
+ return false;
+ }
+
+ // For every IP address, there must be at least one prefix containing that address.
+ for (LinkAddress addr : ipAddresses) {
+ if (!any(directlyConnectedRoutes, (p) -> p.contains(addr.getAddress()))) {
+ return false;
+ }
+ }
+ // For every dns server, there must be at least one prefix containing that address.
+ for (InetAddress addr : dnsServers) {
+ if (!any(directlyConnectedRoutes, (p) -> p.contains(addr))) {
+ return false;
+ }
+ }
+ // All IPv6 LinkAddresses have an RFC7421-suitable prefix length
+ // (read: compliant with RFC4291#section2.5.4).
+ if (any(ipAddresses, not(InitialConfiguration::isPrefixLengthCompliant))) {
+ return false;
+ }
+ // If directlyConnectedRoutes contains an IPv6 default route
+ // then ipAddresses MUST contain at least one non-ULA GUA.
+ if (any(directlyConnectedRoutes, InitialConfiguration::isIPv6DefaultRoute)
+ && all(ipAddresses, not(InitialConfiguration::isIPv6GUA))) {
+ return false;
+ }
+ // The prefix length of routes in directlyConnectedRoutes be within reasonable
+ // bounds for IPv6: /48-/64 just as we’d accept in RIOs.
+ if (any(directlyConnectedRoutes, not(InitialConfiguration::isPrefixLengthCompliant))) {
+ return false;
+ }
+ // There no more than one IPv4 address
+ if (ipAddresses.stream().filter(LinkAddress::isIPv4).count() > 1) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @return true if the given list of addressess and routes satisfies provisioning for this
+ * InitialConfiguration. LinkAddresses and RouteInfo objects are not compared with equality
+ * because addresses and routes seen by Netlink will contain additional fields like flags,
+ * interfaces, and so on. If this InitialConfiguration has no IP address specified, the
+ * provisioning check always fails.
+ *
+ * If the given list of routes is null, only addresses are taken into considerations.
+ */
+ public boolean isProvisionedBy(List<LinkAddress> addresses, List<RouteInfo> routes) {
+ if (ipAddresses.isEmpty()) {
+ return false;
+ }
+
+ for (LinkAddress addr : ipAddresses) {
+ if (!any(addresses, (addrSeen) -> addr.isSameAddressAs(addrSeen))) {
+ return false;
+ }
+ }
+
+ if (routes != null) {
+ for (IpPrefix prefix : directlyConnectedRoutes) {
+ if (!any(routes, (routeSeen) -> isDirectlyConnectedRoute(routeSeen, prefix))) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Convert this configuration to a {@link InitialConfigurationParcelable}.
+ */
+ public InitialConfigurationParcelable toStableParcelable() {
+ final InitialConfigurationParcelable p = new InitialConfigurationParcelable();
+ p.ipAddresses = toParcelableArray(ipAddresses,
+ LinkPropertiesParcelableUtil::toStableParcelable, LinkAddressParcelable.class);
+ p.directlyConnectedRoutes = toParcelableArray(directlyConnectedRoutes,
+ LinkPropertiesParcelableUtil::toStableParcelable, IpPrefixParcelable.class);
+ p.dnsServers = toParcelableArray(
+ dnsServers, IpConfigurationParcelableUtil::parcelAddress, String.class);
+ return p;
+ }
+
+ /**
+ * Create an instance of {@link InitialConfiguration} based on the contents of the specified
+ * {@link InitialConfigurationParcelable}.
+ */
+ public static InitialConfiguration fromStableParcelable(InitialConfigurationParcelable p) {
+ if (p == null) return null;
+ final InitialConfiguration config = new InitialConfiguration();
+ config.ipAddresses.addAll(fromParcelableArray(
+ p.ipAddresses, LinkPropertiesParcelableUtil::fromStableParcelable));
+ config.directlyConnectedRoutes.addAll(fromParcelableArray(
+ p.directlyConnectedRoutes, LinkPropertiesParcelableUtil::fromStableParcelable));
+ config.dnsServers.addAll(
+ fromParcelableArray(p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress));
+ return config;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof InitialConfiguration)) return false;
+ final InitialConfiguration other = (InitialConfiguration) obj;
+ return ipAddresses.equals(other.ipAddresses)
+ && directlyConnectedRoutes.equals(other.directlyConnectedRoutes)
+ && dnsServers.equals(other.dnsServers);
+ }
+
+ private static boolean isDirectlyConnectedRoute(RouteInfo route, IpPrefix prefix) {
+ return !route.hasGateway() && prefix.equals(route.getDestination());
+ }
+
+ private static boolean isPrefixLengthCompliant(LinkAddress addr) {
+ return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength());
+ }
+
+ private static boolean isPrefixLengthCompliant(IpPrefix prefix) {
+ return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
+ }
+
+ private static boolean isCompliantIPv6PrefixLength(int prefixLength) {
+ return (RFC6177_MIN_PREFIX_LENGTH <= prefixLength)
+ && (prefixLength <= RFC7421_PREFIX_LENGTH);
+ }
+
+ private static boolean isIPv6DefaultRoute(IpPrefix prefix) {
+ return prefix.getAddress().equals(Inet6Address.ANY);
+ }
+
+ private static boolean isIPv6GUA(LinkAddress addr) {
+ return addr.isIPv6() && addr.isGlobalPreferred();
+ }
+
+ // TODO: extract out into CollectionUtils.
+
+ /**
+ * Indicate whether any element of the specified iterable verifies the specified predicate.
+ */
+ public static <T> boolean any(Iterable<T> coll, Predicate<T> fn) {
+ for (T t : coll) {
+ if (fn.test(t)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Indicate whether all elements of the specified iterable verifies the specified predicate.
+ */
+ public static <T> boolean all(Iterable<T> coll, Predicate<T> fn) {
+ return !any(coll, not(fn));
+ }
+
+ /**
+ * Create a predicate that returns the opposite value of the specified predicate.
+ */
+ public static <T> Predicate<T> not(Predicate<T> fn) {
+ return (t) -> !fn.test(t);
+ }
+}
diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
new file mode 100644
index 000000000000..2c368c81523e
--- /dev/null
+++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.shared.ParcelableUtil.fromParcelableArray;
+import static android.net.shared.ParcelableUtil.toParcelableArray;
+
+import android.annotation.Nullable;
+import android.net.ApfCapabilitiesParcelable;
+import android.net.DhcpResults;
+import android.net.DhcpResultsParcelable;
+import android.net.InetAddresses;
+import android.net.StaticIpConfiguration;
+import android.net.StaticIpConfigurationParcelable;
+import android.net.apf.ApfCapabilities;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+
+/**
+ * Collection of utility methods to convert to and from stable AIDL parcelables for IpClient
+ * configuration classes.
+ * @hide
+ */
+public final class IpConfigurationParcelableUtil {
+ /**
+ * Convert a StaticIpConfiguration to a StaticIpConfigurationParcelable.
+ */
+ public static StaticIpConfigurationParcelable toStableParcelable(
+ @Nullable StaticIpConfiguration config) {
+ if (config == null) return null;
+ final StaticIpConfigurationParcelable p = new StaticIpConfigurationParcelable();
+ p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.ipAddress);
+ p.gateway = parcelAddress(config.gateway);
+ p.dnsServers = toParcelableArray(
+ config.dnsServers, IpConfigurationParcelableUtil::parcelAddress, String.class);
+ p.domains = config.domains;
+ return p;
+ }
+
+ /**
+ * Convert a StaticIpConfigurationParcelable to a StaticIpConfiguration.
+ */
+ public static StaticIpConfiguration fromStableParcelable(
+ @Nullable StaticIpConfigurationParcelable p) {
+ if (p == null) return null;
+ final StaticIpConfiguration config = new StaticIpConfiguration();
+ config.ipAddress = LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress);
+ config.gateway = unparcelAddress(p.gateway);
+ config.dnsServers.addAll(fromParcelableArray(
+ p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress));
+ config.domains = p.domains;
+ return config;
+ }
+
+ /**
+ * Convert DhcpResults to a DhcpResultsParcelable.
+ */
+ public static DhcpResultsParcelable toStableParcelable(@Nullable DhcpResults results) {
+ if (results == null) return null;
+ final DhcpResultsParcelable p = new DhcpResultsParcelable();
+ p.baseConfiguration = toStableParcelable((StaticIpConfiguration) results);
+ p.leaseDuration = results.leaseDuration;
+ p.mtu = results.mtu;
+ p.serverAddress = parcelAddress(results.serverAddress);
+ p.vendorInfo = results.vendorInfo;
+ return p;
+ }
+
+ /**
+ * Convert a DhcpResultsParcelable to DhcpResults.
+ */
+ public static DhcpResults fromStableParcelable(@Nullable DhcpResultsParcelable p) {
+ if (p == null) return null;
+ final DhcpResults results = new DhcpResults(fromStableParcelable(p.baseConfiguration));
+ results.leaseDuration = p.leaseDuration;
+ results.mtu = p.mtu;
+ results.serverAddress = (Inet4Address) unparcelAddress(p.serverAddress);
+ results.vendorInfo = p.vendorInfo;
+ return results;
+ }
+
+ /**
+ * Convert ApfCapabilities to ApfCapabilitiesParcelable.
+ */
+ public static ApfCapabilitiesParcelable toStableParcelable(@Nullable ApfCapabilities caps) {
+ if (caps == null) return null;
+ final ApfCapabilitiesParcelable p = new ApfCapabilitiesParcelable();
+ p.apfVersionSupported = caps.apfVersionSupported;
+ p.maximumApfProgramSize = caps.maximumApfProgramSize;
+ p.apfPacketFormat = caps.apfPacketFormat;
+ return p;
+ }
+
+ /**
+ * Convert ApfCapabilitiesParcelable toApfCapabilities.
+ */
+ public static ApfCapabilities fromStableParcelable(@Nullable ApfCapabilitiesParcelable p) {
+ if (p == null) return null;
+ return new ApfCapabilities(
+ p.apfVersionSupported, p.maximumApfProgramSize, p.apfPacketFormat);
+ }
+
+ /**
+ * Convert InetAddress to String.
+ * TODO: have an InetAddressParcelable
+ */
+ public static String parcelAddress(@Nullable InetAddress addr) {
+ if (addr == null) return null;
+ return addr.getHostAddress();
+ }
+
+ /**
+ * Convert String to InetAddress.
+ * TODO: have an InetAddressParcelable
+ */
+ public static InetAddress unparcelAddress(@Nullable String addr) {
+ if (addr == null) return null;
+ return InetAddresses.parseNumericAddress(addr);
+ }
+}
diff --git a/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java b/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java
new file mode 100644
index 000000000000..d5213dfcebf8
--- /dev/null
+++ b/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.shared.IpConfigurationParcelableUtil.parcelAddress;
+import static android.net.shared.IpConfigurationParcelableUtil.unparcelAddress;
+import static android.net.shared.ParcelableUtil.fromParcelableArray;
+import static android.net.shared.ParcelableUtil.toParcelableArray;
+
+import android.annotation.Nullable;
+import android.net.IpPrefix;
+import android.net.IpPrefixParcelable;
+import android.net.LinkAddress;
+import android.net.LinkAddressParcelable;
+import android.net.LinkProperties;
+import android.net.LinkPropertiesParcelable;
+import android.net.ProxyInfo;
+import android.net.ProxyInfoParcelable;
+import android.net.RouteInfo;
+import android.net.RouteInfoParcelable;
+import android.net.Uri;
+
+import java.util.Arrays;
+
+/**
+ * Collection of utility methods to convert to and from stable AIDL parcelables for LinkProperties
+ * and its attributes.
+ * @hide
+ */
+public final class LinkPropertiesParcelableUtil {
+
+ /**
+ * Convert a ProxyInfo to a ProxyInfoParcelable
+ */
+ public static ProxyInfoParcelable toStableParcelable(@Nullable ProxyInfo proxyInfo) {
+ if (proxyInfo == null) {
+ return null;
+ }
+ final ProxyInfoParcelable parcel = new ProxyInfoParcelable();
+ parcel.host = proxyInfo.getHost();
+ parcel.port = proxyInfo.getPort();
+ parcel.exclusionList = proxyInfo.getExclusionList();
+ parcel.pacFileUrl = proxyInfo.getPacFileUrl().toString();
+ return parcel;
+ }
+
+ /**
+ * Convert a ProxyInfoParcelable to a ProxyInfo
+ */
+ public static ProxyInfo fromStableParcelable(@Nullable ProxyInfoParcelable parcel) {
+ if (parcel == null) {
+ return null;
+ }
+ if (Uri.EMPTY.toString().equals(parcel.pacFileUrl)) {
+ return ProxyInfo.buildDirectProxy(
+ parcel.host, parcel.port, Arrays.asList(parcel.exclusionList));
+ } else {
+ return ProxyInfo.buildPacProxy(Uri.parse(parcel.pacFileUrl));
+ }
+ }
+
+ /**
+ * Convert an IpPrefixParcelable to an IpPrefix
+ */
+ public static IpPrefixParcelable toStableParcelable(@Nullable IpPrefix ipPrefix) {
+ if (ipPrefix == null) {
+ return null;
+ }
+ final IpPrefixParcelable parcel = new IpPrefixParcelable();
+ parcel.address = parcelAddress(ipPrefix.getAddress());
+ parcel.prefixLength = ipPrefix.getPrefixLength();
+ return parcel;
+ }
+
+ /**
+ * Convert an IpPrefix to an IpPrefixParcelable
+ */
+ public static IpPrefix fromStableParcelable(@Nullable IpPrefixParcelable parcel) {
+ if (parcel == null) {
+ return null;
+ }
+ return new IpPrefix(unparcelAddress(parcel.address), parcel.prefixLength);
+ }
+
+ /**
+ * Convert a RouteInfoParcelable to a RouteInfo
+ */
+ public static RouteInfoParcelable toStableParcelable(@Nullable RouteInfo routeInfo) {
+ if (routeInfo == null) {
+ return null;
+ }
+ final RouteInfoParcelable parcel = new RouteInfoParcelable();
+ parcel.destination = toStableParcelable(routeInfo.getDestination());
+ parcel.gatewayAddr = parcelAddress(routeInfo.getGateway());
+ parcel.ifaceName = routeInfo.getInterface();
+ parcel.type = routeInfo.getType();
+ return parcel;
+ }
+
+ /**
+ * Convert a RouteInfo to a RouteInfoParcelable
+ */
+ public static RouteInfo fromStableParcelable(@Nullable RouteInfoParcelable parcel) {
+ if (parcel == null) {
+ return null;
+ }
+ final IpPrefix destination = fromStableParcelable(parcel.destination);
+ return new RouteInfo(
+ destination, unparcelAddress(parcel.gatewayAddr),
+ parcel.ifaceName, parcel.type);
+ }
+
+ /**
+ * Convert a LinkAddressParcelable to a LinkAddress
+ */
+ public static LinkAddressParcelable toStableParcelable(@Nullable LinkAddress la) {
+ if (la == null) {
+ return null;
+ }
+ final LinkAddressParcelable parcel = new LinkAddressParcelable();
+ parcel.address = parcelAddress(la.getAddress());
+ parcel.prefixLength = la.getPrefixLength();
+ parcel.flags = la.getFlags();
+ parcel.scope = la.getScope();
+ return parcel;
+ }
+
+ /**
+ * Convert a LinkAddress to a LinkAddressParcelable
+ */
+ public static LinkAddress fromStableParcelable(@Nullable LinkAddressParcelable parcel) {
+ if (parcel == null) {
+ return null;
+ }
+ return new LinkAddress(
+ unparcelAddress(parcel.address),
+ parcel.prefixLength,
+ parcel.flags,
+ parcel.scope);
+ }
+
+ /**
+ * Convert a LinkProperties to a LinkPropertiesParcelable
+ */
+ public static LinkPropertiesParcelable toStableParcelable(@Nullable LinkProperties lp) {
+ if (lp == null) {
+ return null;
+ }
+ final LinkPropertiesParcelable parcel = new LinkPropertiesParcelable();
+ parcel.ifaceName = lp.getInterfaceName();
+ parcel.linkAddresses = toParcelableArray(
+ lp.getLinkAddresses(),
+ LinkPropertiesParcelableUtil::toStableParcelable,
+ LinkAddressParcelable.class);
+ parcel.dnses = toParcelableArray(
+ lp.getDnsServers(), IpConfigurationParcelableUtil::parcelAddress, String.class);
+ parcel.pcscfs = toParcelableArray(
+ lp.getPcscfServers(), IpConfigurationParcelableUtil::parcelAddress, String.class);
+ parcel.validatedPrivateDnses = toParcelableArray(lp.getValidatedPrivateDnsServers(),
+ IpConfigurationParcelableUtil::parcelAddress, String.class);
+ parcel.usePrivateDns = lp.isPrivateDnsActive();
+ parcel.privateDnsServerName = lp.getPrivateDnsServerName();
+ parcel.domains = lp.getDomains();
+ parcel.routes = toParcelableArray(
+ lp.getRoutes(), LinkPropertiesParcelableUtil::toStableParcelable,
+ RouteInfoParcelable.class);
+ parcel.httpProxy = toStableParcelable(lp.getHttpProxy());
+ parcel.mtu = lp.getMtu();
+ parcel.tcpBufferSizes = lp.getTcpBufferSizes();
+ parcel.nat64Prefix = toStableParcelable(lp.getNat64Prefix());
+ parcel.stackedLinks = toParcelableArray(
+ lp.getStackedLinks(), LinkPropertiesParcelableUtil::toStableParcelable,
+ LinkPropertiesParcelable.class);
+ return parcel;
+ }
+
+ /**
+ * Convert a LinkPropertiesParcelable to a LinkProperties
+ */
+ public static LinkProperties fromStableParcelable(@Nullable LinkPropertiesParcelable parcel) {
+ if (parcel == null) {
+ return null;
+ }
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(parcel.ifaceName);
+ lp.setLinkAddresses(fromParcelableArray(parcel.linkAddresses,
+ LinkPropertiesParcelableUtil::fromStableParcelable));
+ lp.setDnsServers(fromParcelableArray(
+ parcel.dnses, IpConfigurationParcelableUtil::unparcelAddress));
+ lp.setPcscfServers(fromParcelableArray(
+ parcel.pcscfs, IpConfigurationParcelableUtil::unparcelAddress));
+ lp.setValidatedPrivateDnsServers(
+ fromParcelableArray(parcel.validatedPrivateDnses,
+ IpConfigurationParcelableUtil::unparcelAddress));
+ lp.setUsePrivateDns(parcel.usePrivateDns);
+ lp.setPrivateDnsServerName(parcel.privateDnsServerName);
+ lp.setDomains(parcel.domains);
+ for (RouteInfoParcelable route : parcel.routes) {
+ lp.addRoute(fromStableParcelable(route));
+ }
+ lp.setHttpProxy(fromStableParcelable(parcel.httpProxy));
+ lp.setMtu(parcel.mtu);
+ lp.setTcpBufferSizes(parcel.tcpBufferSizes);
+ lp.setNat64Prefix(fromStableParcelable(parcel.nat64Prefix));
+ for (LinkPropertiesParcelable stackedLink : parcel.stackedLinks) {
+ lp.addStackedLink(fromStableParcelable(stackedLink));
+ }
+ return lp;
+ }
+}
diff --git a/services/net/java/android/net/shared/NetworkMonitorUtils.java b/services/net/java/android/net/shared/NetworkMonitorUtils.java
new file mode 100644
index 000000000000..463cf2af2897
--- /dev/null
+++ b/services/net/java/android/net/shared/NetworkMonitorUtils.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.content.Context;
+import android.net.NetworkCapabilities;
+import android.provider.Settings;
+
+/** @hide */
+public class NetworkMonitorUtils {
+
+ // Network conditions broadcast constants
+ public static final String ACTION_NETWORK_CONDITIONS_MEASURED =
+ "android.net.conn.NETWORK_CONDITIONS_MEASURED";
+ public static final String EXTRA_CONNECTIVITY_TYPE = "extra_connectivity_type";
+ public static final String EXTRA_NETWORK_TYPE = "extra_network_type";
+ public static final String EXTRA_RESPONSE_RECEIVED = "extra_response_received";
+ public static final String EXTRA_IS_CAPTIVE_PORTAL = "extra_is_captive_portal";
+ public static final String EXTRA_CELL_ID = "extra_cellid";
+ public static final String EXTRA_SSID = "extra_ssid";
+ public static final String EXTRA_BSSID = "extra_bssid";
+ /** real time since boot */
+ public static final String EXTRA_REQUEST_TIMESTAMP_MS = "extra_request_timestamp_ms";
+ public static final String EXTRA_RESPONSE_TIMESTAMP_MS = "extra_response_timestamp_ms";
+ public static final String PERMISSION_ACCESS_NETWORK_CONDITIONS =
+ "android.permission.ACCESS_NETWORK_CONDITIONS";
+
+ // TODO: once the URL is a resource overlay, remove and have the resource define the default
+ private static final String DEFAULT_HTTP_URL =
+ "http://connectivitycheck.gstatic.com/generate_204";
+
+ /**
+ * Get the captive portal server HTTP URL that is configured on the device.
+ */
+ public static String getCaptivePortalServerHttpUrl(Context context) {
+ final String settingUrl = Settings.Global.getString(
+ context.getContentResolver(),
+ Settings.Global.CAPTIVE_PORTAL_HTTP_URL);
+ return settingUrl != null ? settingUrl : DEFAULT_HTTP_URL;
+ }
+
+ /**
+ * Return whether validation is required for a network.
+ * @param dfltNetCap Default requested network capabilities.
+ * @param nc Network capabilities of the network to test.
+ */
+ public static boolean isValidationRequired(
+ NetworkCapabilities dfltNetCap, NetworkCapabilities nc) {
+ // TODO: Consider requiring validation for DUN networks.
+ return dfltNetCap.satisfiedByNetworkCapabilities(nc);
+ }
+}
diff --git a/services/net/java/android/net/shared/NetworkParcelableUtil.java b/services/net/java/android/net/shared/NetworkParcelableUtil.java
new file mode 100644
index 000000000000..d0b54b8b81d0
--- /dev/null
+++ b/services/net/java/android/net/shared/NetworkParcelableUtil.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.annotation.Nullable;
+import android.net.Network;
+import android.net.NetworkParcelable;
+
+/**
+ * Utility methods to convert to/from stable AIDL parcelables for network attribute classes.
+ * @hide
+ */
+public final class NetworkParcelableUtil {
+ /**
+ * Convert from a Network to a NetworkParcelable.
+ */
+ public static NetworkParcelable toStableParcelable(@Nullable Network network) {
+ if (network == null) {
+ return null;
+ }
+ final NetworkParcelable p = new NetworkParcelable();
+ p.networkHandle = network.getNetworkHandle();
+
+ return p;
+ }
+
+ /**
+ * Convert from a NetworkParcelable to a Network.
+ */
+ public static Network fromStableParcelable(@Nullable NetworkParcelable p) {
+ if (p == null) {
+ return null;
+ }
+ return Network.fromNetworkHandle(p.networkHandle);
+ }
+}
diff --git a/services/net/java/android/net/shared/ParcelableUtil.java b/services/net/java/android/net/shared/ParcelableUtil.java
new file mode 100644
index 000000000000..3f4030047938
--- /dev/null
+++ b/services/net/java/android/net/shared/ParcelableUtil.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.annotation.NonNull;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.function.Function;
+
+/**
+ * Utility methods to help convert to/from stable parcelables.
+ * @hide
+ */
+public final class ParcelableUtil {
+ // Below methods could be implemented easily with streams, but streams are frowned upon in
+ // frameworks code.
+
+ /**
+ * Convert a list of BaseType items to an array of ParcelableType items using the specified
+ * converter function.
+ */
+ public static <ParcelableType, BaseType> ParcelableType[] toParcelableArray(
+ @NonNull Collection<BaseType> base,
+ @NonNull Function<BaseType, ParcelableType> conv,
+ @NonNull Class<ParcelableType> parcelClass) {
+ final ParcelableType[] out = (ParcelableType[]) Array.newInstance(parcelClass, base.size());
+ int i = 0;
+ for (BaseType b : base) {
+ out[i] = conv.apply(b);
+ i++;
+ }
+ return out;
+ }
+
+ /**
+ * Convert an array of ParcelableType items to a list of BaseType items using the specified
+ * converter function.
+ */
+ public static <ParcelableType, BaseType> ArrayList<BaseType> fromParcelableArray(
+ @NonNull ParcelableType[] parceled, @NonNull Function<ParcelableType, BaseType> conv) {
+ final ArrayList<BaseType> out = new ArrayList<>(parceled.length);
+ for (ParcelableType t : parceled) {
+ out.add(conv.apply(t));
+ }
+ return out;
+ }
+}
diff --git a/services/net/java/android/net/shared/PrivateDnsConfig.java b/services/net/java/android/net/shared/PrivateDnsConfig.java
new file mode 100644
index 000000000000..c7dc5306b51b
--- /dev/null
+++ b/services/net/java/android/net/shared/PrivateDnsConfig.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.shared.ParcelableUtil.fromParcelableArray;
+import static android.net.shared.ParcelableUtil.toParcelableArray;
+
+import android.net.PrivateDnsConfigParcel;
+import android.text.TextUtils;
+
+import java.net.InetAddress;
+import java.util.Arrays;
+
+/** @hide */
+public class PrivateDnsConfig {
+ public final boolean useTls;
+ public final String hostname;
+ public final InetAddress[] ips;
+
+ public PrivateDnsConfig() {
+ this(false);
+ }
+
+ public PrivateDnsConfig(boolean useTls) {
+ this.useTls = useTls;
+ this.hostname = "";
+ this.ips = new InetAddress[0];
+ }
+
+ public PrivateDnsConfig(String hostname, InetAddress[] ips) {
+ this.useTls = !TextUtils.isEmpty(hostname);
+ this.hostname = useTls ? hostname : "";
+ this.ips = (ips != null) ? ips : new InetAddress[0];
+ }
+
+ public PrivateDnsConfig(PrivateDnsConfig cfg) {
+ useTls = cfg.useTls;
+ hostname = cfg.hostname;
+ ips = cfg.ips;
+ }
+
+ /**
+ * Indicates whether this is a strict mode private DNS configuration.
+ */
+ public boolean inStrictMode() {
+ return useTls && !TextUtils.isEmpty(hostname);
+ }
+
+ @Override
+ public String toString() {
+ return PrivateDnsConfig.class.getSimpleName()
+ + "{" + useTls + ":" + hostname + "/" + Arrays.toString(ips) + "}";
+ }
+
+ /**
+ * Create a stable AIDL-compatible parcel from the current instance.
+ */
+ public PrivateDnsConfigParcel toParcel() {
+ final PrivateDnsConfigParcel parcel = new PrivateDnsConfigParcel();
+ parcel.hostname = hostname;
+ parcel.ips = toParcelableArray(
+ Arrays.asList(ips), IpConfigurationParcelableUtil::parcelAddress, String.class);
+
+ return parcel;
+ }
+
+ /**
+ * Build a configuration from a stable AIDL-compatible parcel.
+ */
+ public static PrivateDnsConfig fromParcel(PrivateDnsConfigParcel parcel) {
+ InetAddress[] ips = new InetAddress[parcel.ips.length];
+ ips = fromParcelableArray(parcel.ips, IpConfigurationParcelableUtil::unparcelAddress)
+ .toArray(ips);
+ return new PrivateDnsConfig(parcel.hostname, ips);
+ }
+}
diff --git a/services/net/java/android/net/shared/ProvisioningConfiguration.java b/services/net/java/android/net/shared/ProvisioningConfiguration.java
new file mode 100644
index 000000000000..c4d1e121ff3c
--- /dev/null
+++ b/services/net/java/android/net/shared/ProvisioningConfiguration.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.annotation.Nullable;
+import android.net.INetd;
+import android.net.Network;
+import android.net.ProvisioningConfigurationParcelable;
+import android.net.StaticIpConfiguration;
+import android.net.apf.ApfCapabilities;
+import android.net.ip.IIpClient;
+
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * This class encapsulates parameters to be passed to
+ * IpClient#startProvisioning(). A defensive copy is made by IpClient
+ * and the values specified herein are in force until IpClient#stop()
+ * is called.
+ *
+ * Example use:
+ *
+ * final ProvisioningConfiguration config =
+ * new ProvisioningConfiguration.Builder()
+ * .withPreDhcpAction()
+ * .withProvisioningTimeoutMs(36 * 1000)
+ * .build();
+ * mIpClient.startProvisioning(config.toStableParcelable());
+ * ...
+ * mIpClient.stop();
+ *
+ * The specified provisioning configuration will only be active until
+ * IIpClient#stop() is called. Future calls to IIpClient#startProvisioning()
+ * must specify the configuration again.
+ * @hide
+ */
+public class ProvisioningConfiguration {
+ // TODO: Delete this default timeout once those callers that care are
+ // fixed to pass in their preferred timeout.
+ //
+ // We pick 36 seconds so we can send DHCP requests at
+ //
+ // t=0, t=2, t=6, t=14, t=30
+ //
+ // allowing for 10% jitter.
+ private static final int DEFAULT_TIMEOUT_MS = 36 * 1000;
+
+ /**
+ * Builder to create a {@link ProvisioningConfiguration}.
+ */
+ public static class Builder {
+ protected ProvisioningConfiguration mConfig = new ProvisioningConfiguration();
+
+ /**
+ * Specify that the configuration should not enable IPv4. It is enabled by default.
+ */
+ public Builder withoutIPv4() {
+ mConfig.mEnableIPv4 = false;
+ return this;
+ }
+
+ /**
+ * Specify that the configuration should not enable IPv6. It is enabled by default.
+ */
+ public Builder withoutIPv6() {
+ mConfig.mEnableIPv6 = false;
+ return this;
+ }
+
+ /**
+ * Specify that the configuration should not use a MultinetworkPolicyTracker. It is used
+ * by default.
+ */
+ public Builder withoutMultinetworkPolicyTracker() {
+ mConfig.mUsingMultinetworkPolicyTracker = false;
+ return this;
+ }
+
+ /**
+ * Specify that the configuration should not use a IpReachabilityMonitor. It is used by
+ * default.
+ */
+ public Builder withoutIpReachabilityMonitor() {
+ mConfig.mUsingIpReachabilityMonitor = false;
+ return this;
+ }
+
+ /**
+ * Identical to {@link #withPreDhcpAction(int)}, using a default timeout.
+ * @see #withPreDhcpAction(int)
+ */
+ public Builder withPreDhcpAction() {
+ mConfig.mRequestedPreDhcpActionMs = DEFAULT_TIMEOUT_MS;
+ return this;
+ }
+
+ /**
+ * Specify that {@link IpClientCallbacks#onPreDhcpAction()} should be called. Clients must
+ * call {@link IIpClient#completedPreDhcpAction()} when the callback called. This behavior
+ * is disabled by default.
+ * @param dhcpActionTimeoutMs Timeout for clients to call completedPreDhcpAction().
+ */
+ public Builder withPreDhcpAction(int dhcpActionTimeoutMs) {
+ mConfig.mRequestedPreDhcpActionMs = dhcpActionTimeoutMs;
+ return this;
+ }
+
+ /**
+ * Specify the initial provisioning configuration.
+ */
+ public Builder withInitialConfiguration(InitialConfiguration initialConfig) {
+ mConfig.mInitialConfig = initialConfig;
+ return this;
+ }
+
+ /**
+ * Specify a static configuration for provisioning.
+ */
+ public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) {
+ mConfig.mStaticIpConfig = staticConfig;
+ return this;
+ }
+
+ /**
+ * Specify ApfCapabilities.
+ */
+ public Builder withApfCapabilities(ApfCapabilities apfCapabilities) {
+ mConfig.mApfCapabilities = apfCapabilities;
+ return this;
+ }
+
+ /**
+ * Specify the timeout to use for provisioning.
+ */
+ public Builder withProvisioningTimeoutMs(int timeoutMs) {
+ mConfig.mProvisioningTimeoutMs = timeoutMs;
+ return this;
+ }
+
+ /**
+ * Specify that IPv6 address generation should use a random MAC address.
+ */
+ public Builder withRandomMacAddress() {
+ mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_EUI64;
+ return this;
+ }
+
+ /**
+ * Specify that IPv6 address generation should use a stable MAC address.
+ */
+ public Builder withStableMacAddress() {
+ mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY;
+ return this;
+ }
+
+ /**
+ * Specify the network to use for provisioning.
+ */
+ public Builder withNetwork(Network network) {
+ mConfig.mNetwork = network;
+ return this;
+ }
+
+ /**
+ * Specify the display name that the IpClient should use.
+ */
+ public Builder withDisplayName(String displayName) {
+ mConfig.mDisplayName = displayName;
+ return this;
+ }
+
+ /**
+ * Build the configuration using previously specified parameters.
+ */
+ public ProvisioningConfiguration build() {
+ return new ProvisioningConfiguration(mConfig);
+ }
+ }
+
+ public boolean mEnableIPv4 = true;
+ public boolean mEnableIPv6 = true;
+ public boolean mUsingMultinetworkPolicyTracker = true;
+ public boolean mUsingIpReachabilityMonitor = true;
+ public int mRequestedPreDhcpActionMs;
+ public InitialConfiguration mInitialConfig;
+ public StaticIpConfiguration mStaticIpConfig;
+ public ApfCapabilities mApfCapabilities;
+ public int mProvisioningTimeoutMs = DEFAULT_TIMEOUT_MS;
+ public int mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY;
+ public boolean mRapidCommit;
+ public boolean mDiscoverSent;
+ public Network mNetwork = null;
+ public String mDisplayName = null;
+
+ public ProvisioningConfiguration() {} // used by Builder
+
+ public ProvisioningConfiguration(ProvisioningConfiguration other) {
+ mEnableIPv4 = other.mEnableIPv4;
+ mEnableIPv6 = other.mEnableIPv6;
+ mUsingMultinetworkPolicyTracker = other.mUsingMultinetworkPolicyTracker;
+ mUsingIpReachabilityMonitor = other.mUsingIpReachabilityMonitor;
+ mRequestedPreDhcpActionMs = other.mRequestedPreDhcpActionMs;
+ mInitialConfig = InitialConfiguration.copy(other.mInitialConfig);
+ mStaticIpConfig = other.mStaticIpConfig == null
+ ? null
+ : new StaticIpConfiguration(other.mStaticIpConfig);
+ mApfCapabilities = other.mApfCapabilities;
+ mProvisioningTimeoutMs = other.mProvisioningTimeoutMs;
+ mRapidCommit = other.mRapidCommit;
+ mDiscoverSent = other.mDiscoverSent;
+ mIPv6AddrGenMode = other.mIPv6AddrGenMode;
+ mNetwork = other.mNetwork;
+ mDisplayName = other.mDisplayName;
+ }
+
+ /**
+ * Create a ProvisioningConfigurationParcelable from this ProvisioningConfiguration.
+ */
+ public ProvisioningConfigurationParcelable toStableParcelable() {
+ final ProvisioningConfigurationParcelable p = new ProvisioningConfigurationParcelable();
+ p.enableIPv4 = mEnableIPv4;
+ p.enableIPv6 = mEnableIPv6;
+ p.usingMultinetworkPolicyTracker = mUsingMultinetworkPolicyTracker;
+ p.usingIpReachabilityMonitor = mUsingIpReachabilityMonitor;
+ p.requestedPreDhcpActionMs = mRequestedPreDhcpActionMs;
+ p.initialConfig = mInitialConfig == null ? null : mInitialConfig.toStableParcelable();
+ p.staticIpConfig = IpConfigurationParcelableUtil.toStableParcelable(mStaticIpConfig);
+ p.apfCapabilities = IpConfigurationParcelableUtil.toStableParcelable(mApfCapabilities);
+ p.provisioningTimeoutMs = mProvisioningTimeoutMs;
+ p.ipv6AddrGenMode = mIPv6AddrGenMode;
+ p.network = NetworkParcelableUtil.toStableParcelable(mNetwork);
+ p.displayName = mDisplayName;
+ return p;
+ }
+
+ /**
+ * Create a ProvisioningConfiguration from a ProvisioningConfigurationParcelable.
+ */
+ public static ProvisioningConfiguration fromStableParcelable(
+ @Nullable ProvisioningConfigurationParcelable p) {
+ if (p == null) return null;
+ final ProvisioningConfiguration config = new ProvisioningConfiguration();
+ config.mEnableIPv4 = p.enableIPv4;
+ config.mEnableIPv6 = p.enableIPv6;
+ config.mUsingMultinetworkPolicyTracker = p.usingMultinetworkPolicyTracker;
+ config.mUsingIpReachabilityMonitor = p.usingIpReachabilityMonitor;
+ config.mRequestedPreDhcpActionMs = p.requestedPreDhcpActionMs;
+ config.mInitialConfig = InitialConfiguration.fromStableParcelable(p.initialConfig);
+ config.mStaticIpConfig = IpConfigurationParcelableUtil.fromStableParcelable(
+ p.staticIpConfig);
+ config.mApfCapabilities = IpConfigurationParcelableUtil.fromStableParcelable(
+ p.apfCapabilities);
+ config.mProvisioningTimeoutMs = p.provisioningTimeoutMs;
+ config.mIPv6AddrGenMode = p.ipv6AddrGenMode;
+ config.mNetwork = NetworkParcelableUtil.fromStableParcelable(p.network);
+ config.mDisplayName = p.displayName;
+ return config;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(", ", getClass().getSimpleName() + "{", "}")
+ .add("mEnableIPv4: " + mEnableIPv4)
+ .add("mEnableIPv6: " + mEnableIPv6)
+ .add("mUsingMultinetworkPolicyTracker: " + mUsingMultinetworkPolicyTracker)
+ .add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor)
+ .add("mRequestedPreDhcpActionMs: " + mRequestedPreDhcpActionMs)
+ .add("mInitialConfig: " + mInitialConfig)
+ .add("mStaticIpConfig: " + mStaticIpConfig)
+ .add("mApfCapabilities: " + mApfCapabilities)
+ .add("mProvisioningTimeoutMs: " + mProvisioningTimeoutMs)
+ .add("mIPv6AddrGenMode: " + mIPv6AddrGenMode)
+ .add("mNetwork: " + mNetwork)
+ .add("mDisplayName: " + mDisplayName)
+ .toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof ProvisioningConfiguration)) return false;
+ final ProvisioningConfiguration other = (ProvisioningConfiguration) obj;
+ return mEnableIPv4 == other.mEnableIPv4
+ && mEnableIPv6 == other.mEnableIPv6
+ && mUsingMultinetworkPolicyTracker == other.mUsingMultinetworkPolicyTracker
+ && mUsingIpReachabilityMonitor == other.mUsingIpReachabilityMonitor
+ && mRequestedPreDhcpActionMs == other.mRequestedPreDhcpActionMs
+ && Objects.equals(mInitialConfig, other.mInitialConfig)
+ && Objects.equals(mStaticIpConfig, other.mStaticIpConfig)
+ && Objects.equals(mApfCapabilities, other.mApfCapabilities)
+ && mProvisioningTimeoutMs == other.mProvisioningTimeoutMs
+ && mIPv6AddrGenMode == other.mIPv6AddrGenMode
+ && Objects.equals(mNetwork, other.mNetwork)
+ && Objects.equals(mDisplayName, other.mDisplayName);
+ }
+
+ public boolean isValid() {
+ return (mInitialConfig == null) || mInitialConfig.isValid();
+ }
+}
diff --git a/services/net/java/android/net/util/InterfaceParams.java b/services/net/java/android/net/util/InterfaceParams.java
index a4b2fbb6d963..7b060da01a89 100644
--- a/services/net/java/android/net/util/InterfaceParams.java
+++ b/services/net/java/android/net/util/InterfaceParams.java
@@ -16,9 +16,9 @@
package android.net.util;
-import static android.net.MacAddress.ALL_ZEROS_ADDRESS;
import static android.net.util.NetworkConstants.ETHER_MTU;
import static android.net.util.NetworkConstants.IPV6_MIN_MTU;
+
import static com.android.internal.util.Preconditions.checkArgument;
import android.net.MacAddress;
@@ -67,7 +67,8 @@ public class InterfaceParams {
checkArgument((index > 0), "invalid interface index");
this.name = name;
this.index = index;
- this.macAddr = (macAddr != null) ? macAddr : ALL_ZEROS_ADDRESS;
+ this.macAddr = (macAddr != null) ? macAddr : MacAddress.fromBytes(new byte[] {
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 });
this.defaultMtu = (defaultMtu > IPV6_MIN_MTU) ? defaultMtu : IPV6_MIN_MTU;
}
diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java
index 3defe56939f5..c183b81362dc 100644
--- a/services/net/java/android/net/util/NetworkConstants.java
+++ b/services/net/java/android/net/util/NetworkConstants.java
@@ -16,9 +16,6 @@
package android.net.util;
-import java.nio.ByteBuffer;
-
-
/**
* Networking protocol constants.
*
@@ -81,8 +78,6 @@ public final class NetworkConstants {
* - https://tools.ietf.org/html/rfc791
*/
public static final int IPV4_HEADER_MIN_LEN = 20;
- public static final int IPV4_MIN_MTU = 68;
- public static final int IPV4_MAX_MTU = 65_535;
public static final int IPV4_IHL_MASK = 0xf;
public static final int IPV4_FLAGS_OFFSET = 6;
public static final int IPV4_FRAGMENT_MASK = 0x1fff;
diff --git a/services/net/java/android/net/util/SharedLog.java b/services/net/java/android/net/util/SharedLog.java
index 5a73a4e492ee..2cdb2b04f8f7 100644
--- a/services/net/java/android/net/util/SharedLog.java
+++ b/services/net/java/android/net/util/SharedLog.java
@@ -32,11 +32,12 @@ import java.util.StringJoiner;
*
* All access to class methods other than dump() must be on the same thread.
*
+ * TODO: this is a copy of SharedLog in the NetworkStack. Remove after Tethering is migrated.
* @hide
*/
public class SharedLog {
- private final static int DEFAULT_MAX_RECORDS = 500;
- private final static String COMPONENT_DELIMITER = ".";
+ private static final int DEFAULT_MAX_RECORDS = 500;
+ private static final String COMPONENT_DELIMITER = ".";
private enum Category {
NONE,
@@ -69,6 +70,13 @@ public class SharedLog {
mComponent = component;
}
+ public String getTag() {
+ return mTag;
+ }
+
+ /**
+ * Create a SharedLog based on this log with an additional component prefix on each logged line.
+ */
public SharedLog forSubComponent(String component) {
if (!isRootLogInstance()) {
component = mComponent + COMPONENT_DELIMITER + component;
@@ -76,6 +84,11 @@ public class SharedLog {
return new SharedLog(mLocalLog, mTag, component);
}
+ /**
+ * Dump the contents of this log.
+ *
+ * <p>This method may be called on any thread.
+ */
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
mLocalLog.readOnlyLocalLog().dump(fd, writer, args);
}
@@ -84,10 +97,21 @@ public class SharedLog {
// Methods that both log an entry and emit it to the system log.
//////
+ /**
+ * Log an error due to an exception. This does not include the exception stacktrace.
+ *
+ * <p>The log entry will be also added to the system log.
+ * @see #e(String, Throwable)
+ */
public void e(Exception e) {
Log.e(mTag, record(Category.ERROR, e.toString()));
}
+ /**
+ * Log an error message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
public void e(String msg) {
Log.e(mTag, record(Category.ERROR, msg));
}
@@ -96,7 +120,7 @@ public class SharedLog {
* Log an error due to an exception, with the exception stacktrace if provided.
*
* <p>The error and exception message appear in the shared log, but the stacktrace is only
- * logged in general log output (logcat).
+ * logged in general log output (logcat). The log entry will be also added to the system log.
*/
public void e(@NonNull String msg, @Nullable Throwable exception) {
if (exception == null) {
@@ -106,10 +130,20 @@ public class SharedLog {
Log.e(mTag, record(Category.ERROR, msg + ": " + exception.getMessage()), exception);
}
+ /**
+ * Log an informational message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
public void i(String msg) {
Log.i(mTag, record(Category.NONE, msg));
}
+ /**
+ * Log a warning message.
+ *
+ * <p>The log entry will be also added to the system log.
+ */
public void w(String msg) {
Log.w(mTag, record(Category.WARN, msg));
}
@@ -118,14 +152,30 @@ public class SharedLog {
// Methods that only log an entry (and do NOT emit to the system log).
//////
+ /**
+ * Log a general message to be only included in the in-memory log.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ */
public void log(String msg) {
record(Category.NONE, msg);
}
+ /**
+ * Log a general, formatted message to be only included in the in-memory log.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ * @see String#format(String, Object...)
+ */
public void logf(String fmt, Object... args) {
log(String.format(fmt, args));
}
+ /**
+ * Log a message with MARK level.
+ *
+ * <p>The log entry will *not* be added to the system log.
+ */
public void mark(String msg) {
record(Category.MARK, msg);
}
diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk
index 9159f0d47621..0cf0d3402dea 100644
--- a/services/robotests/Android.mk
+++ b/services/robotests/Android.mk
@@ -26,9 +26,6 @@ LOCAL_MODULE_TAGS := optional
LOCAL_PRIVILEGED_MODULE := true
LOCAL_STATIC_JAVA_LIBRARIES := \
- bmgrlib \
- bu \
- services.backup \
services.core \
services.net
@@ -41,8 +38,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE := FrameworksServicesRoboTests
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
- $(call all-java-files-under, backup/src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/res
@@ -82,8 +78,7 @@ LOCAL_JAVA_LIBRARIES := \
LOCAL_TEST_PACKAGE := FrameworksServicesLib
-LOCAL_ROBOTEST_FILES := $(call find-files-in-subdirs,$(LOCAL_PATH)/src,*Test.java,.) \
- $(call find-files-in-subdirs,$(LOCAL_PATH)/backup/src,*Test.java,.)
+LOCAL_ROBOTEST_FILES := $(call find-files-in-subdirs,$(LOCAL_PATH)/src,*Test.java,.)
include external/robolectric-shadows/run_robotests.mk
diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
index b8723c520cf8..b8db3f39eb62 100644
--- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
@@ -16,6 +16,7 @@
package com.android.server.backup;
+import static android.Manifest.permission.BACKUP;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThread;
@@ -45,6 +46,7 @@ import android.platform.test.annotations.Presubmit;
import android.util.SparseArray;
import com.android.server.backup.testing.TransportData;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBinder;
import org.junit.After;
@@ -64,7 +66,7 @@ import java.io.PrintWriter;
/** Tests for the user-aware backup/restore system service {@link BackupManagerService}. */
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBinder.class})
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowBinder.class})
@Presubmit
public class BackupManagerServiceTest {
private static final String TEST_PACKAGE = "package";
@@ -192,6 +194,19 @@ public class BackupManagerServiceTest {
/** Test that the service unregisters users when stopped. */
@Test
+ public void testStopServiceForUser_forRegisteredUser_tearsDownCorrectUser() throws Exception {
+ BackupManagerService backupManagerService =
+ createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+
+ backupManagerService.stopServiceForUser(mUserOneId);
+
+ verify(mUserOneService).tearDownService();
+ verify(mUserTwoService, never()).tearDownService();
+ }
+
+ /** Test that the service unregisters users when stopped. */
+ @Test
public void testStopServiceForUser_forUnknownUser_doesNothing() throws Exception {
BackupManagerService backupManagerService = createService();
@@ -1061,7 +1076,7 @@ public class BackupManagerServiceTest {
createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
FullBackupJob job = new FullBackupJob();
- backupManagerService.beginFullBackup(job);
+ backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job);
verify(mUserOneService).beginFullBackup(job);
}
@@ -1072,7 +1087,7 @@ public class BackupManagerServiceTest {
BackupManagerService backupManagerService = createService();
FullBackupJob job = new FullBackupJob();
- backupManagerService.beginFullBackup(job);
+ backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job);
verify(mUserOneService, never()).beginFullBackup(job);
}
@@ -1083,7 +1098,7 @@ public class BackupManagerServiceTest {
BackupManagerService backupManagerService =
createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
- backupManagerService.endFullBackup();
+ backupManagerService.endFullBackup(UserHandle.USER_SYSTEM);
verify(mUserOneService).endFullBackup();
}
@@ -1093,7 +1108,7 @@ public class BackupManagerServiceTest {
public void testEndFullBackup_onUnknownUser_doesNotPropagateCall() throws Exception {
BackupManagerService backupManagerService = createService();
- backupManagerService.endFullBackup();
+ backupManagerService.endFullBackup(UserHandle.USER_SYSTEM);
verify(mUserOneService, never()).endFullBackup();
}
@@ -1528,6 +1543,7 @@ public class BackupManagerServiceTest {
}
private BackupManagerService createService() {
+ mShadowContext.grantPermissions(BACKUP);
return new BackupManagerService(
mContext, new Trampoline(mContext), startBackupThread(null));
}
diff --git a/services/robotests/backup/src/com/android/server/backup/FullBackupJobTest.java b/services/robotests/backup/src/com/android/server/backup/FullBackupJobTest.java
new file mode 100644
index 000000000000..9a78d0b3f456
--- /dev/null
+++ b/services/robotests/backup/src/com/android/server/backup/FullBackupJobTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2019 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.backup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.annotation.UserIdInt;
+import android.app.job.JobScheduler;
+import android.content.Context;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowJobScheduler;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowJobScheduler.class})
+@Presubmit
+public class FullBackupJobTest {
+ private Context mContext;
+ private BackupManagerConstants mConstants;
+ private ShadowJobScheduler mShadowJobScheduler;
+
+ @UserIdInt private int mUserOneId;
+ @UserIdInt private int mUserTwoId;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = RuntimeEnvironment.application;
+ mConstants = new BackupManagerConstants(Handler.getMain(), mContext.getContentResolver());
+ mConstants.start();
+
+ mShadowJobScheduler = Shadows.shadowOf(mContext.getSystemService(JobScheduler.class));
+
+ mUserOneId = UserHandle.USER_SYSTEM;
+ mUserTwoId = mUserOneId + 1;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mConstants.stop();
+ FullBackupJob.cancel(mUserOneId, mContext);
+ FullBackupJob.cancel(mUserTwoId, mContext);
+ }
+
+ @Test
+ public void testSchedule_afterScheduling_jobExists() {
+ FullBackupJob.schedule(mUserOneId, mContext, 0, mConstants);
+ FullBackupJob.schedule(mUserTwoId, mContext, 0, mConstants);
+
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserOneId))).isNotNull();
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserTwoId))).isNotNull();
+ }
+
+ @Test
+ public void testCancel_afterCancelling_jobDoesntExist() {
+ FullBackupJob.schedule(mUserOneId, mContext, 0, mConstants);
+ FullBackupJob.schedule(mUserTwoId, mContext, 0, mConstants);
+ FullBackupJob.cancel(mUserOneId, mContext);
+ FullBackupJob.cancel(mUserTwoId, mContext);
+
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserOneId))).isNull();
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserTwoId))).isNull();
+ }
+//
+ @Test
+ public void testSchedule_onlySchedulesForRequestedUser() {
+ FullBackupJob.schedule(mUserOneId, mContext, 0, mConstants);
+
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserOneId))).isNotNull();
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserTwoId))).isNull();
+ }
+//
+ @Test
+ public void testCancel_onlyCancelsForRequestedUser() {
+ FullBackupJob.schedule(mUserOneId, mContext, 0, mConstants);
+ FullBackupJob.schedule(mUserTwoId, mContext, 0, mConstants);
+ FullBackupJob.cancel(mUserOneId, mContext);
+
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserOneId))).isNull();
+ assertThat(mShadowJobScheduler.getPendingJob(getJobIdForUserId(mUserTwoId))).isNotNull();
+ }
+
+ private static int getJobIdForUserId(int userId) {
+ return JobIdManager.getJobIdForUserId(FullBackupJob.MIN_JOB_ID, FullBackupJob.MAX_JOB_ID,
+ userId);
+ }
+}
diff --git a/services/robotests/backup/src/com/android/server/backup/JobIdManagerTest.java b/services/robotests/backup/src/com/android/server/backup/JobIdManagerTest.java
new file mode 100644
index 000000000000..f8bb1ee60b80
--- /dev/null
+++ b/services/robotests/backup/src/com/android/server/backup/JobIdManagerTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 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.backup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.annotation.UserIdInt;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import static org.testng.Assert.expectThrows;
+
+@RunWith(RobolectricTestRunner.class)
+@Presubmit
+public class JobIdManagerTest {
+ private static final int MIN_JOB_ID = 10;
+ private static final int MAX_JOB_ID = 20;
+
+ @UserIdInt private int mUserOneId;
+ @UserIdInt private int mUserTwoId;
+
+ @Before
+ public void setUp() {
+ mUserOneId = UserHandle.USER_SYSTEM;
+ mUserTwoId = mUserOneId + 1;
+ }
+
+ @Test
+ public void testGetJobIdForUserId_returnsDifferentJobIdsForDifferentUsers() {
+ int jobIdOne = JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, mUserOneId);
+ int jobIdTwo = JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, mUserTwoId);
+
+ assertThat(jobIdOne).isNotEqualTo(jobIdTwo);
+ }
+
+ @Test
+ public void testGetJobIdForUserId_returnsSameJobIdForSameUser() {
+ int jobIdOne = JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, mUserOneId);
+ int jobIdTwo = JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID, mUserOneId);
+
+ assertThat(jobIdOne).isEqualTo(jobIdTwo);
+ }
+
+ @Test
+ public void testGetJobIdForUserId_throwsExceptionIfRangeIsExceeded() {
+ expectThrows(
+ RuntimeException.class,
+ () -> JobIdManager.getJobIdForUserId(MIN_JOB_ID, MAX_JOB_ID,
+ MAX_JOB_ID + 1));
+ }
+}
diff --git a/services/robotests/backup/src/com/android/server/backup/KeyValueBackupJobTest.java b/services/robotests/backup/src/com/android/server/backup/KeyValueBackupJobTest.java
index 8e17209e1f50..8d9e44fbf1ad 100644
--- a/services/robotests/backup/src/com/android/server/backup/KeyValueBackupJobTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/KeyValueBackupJobTest.java
@@ -18,8 +18,10 @@ package com.android.server.backup;
import static com.google.common.truth.Truth.assertThat;
+import android.annotation.UserIdInt;
import android.content.Context;
import android.os.Handler;
+import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import org.junit.After;
@@ -35,32 +37,67 @@ public class KeyValueBackupJobTest {
private Context mContext;
private BackupManagerConstants mConstants;
+ @UserIdInt private int mUserOneId;
+ @UserIdInt private int mUserTwoId;
+
@Before
public void setUp() throws Exception {
mContext = RuntimeEnvironment.application;
mConstants = new BackupManagerConstants(Handler.getMain(), mContext.getContentResolver());
mConstants.start();
+
+ mUserOneId = UserHandle.USER_SYSTEM;
+ mUserTwoId = mUserOneId + 1;
}
@After
public void tearDown() throws Exception {
mConstants.stop();
- KeyValueBackupJob.cancel(mContext);
+ KeyValueBackupJob.cancel(mUserOneId, mContext);
+ KeyValueBackupJob.cancel(mUserTwoId, mContext);
}
@Test
public void testIsScheduled_beforeScheduling_returnsFalse() {
- boolean isScheduled = KeyValueBackupJob.isScheduled();
-
- assertThat(isScheduled).isFalse();
+ assertThat(KeyValueBackupJob.isScheduled(mUserOneId)).isFalse();
+ assertThat(KeyValueBackupJob.isScheduled(mUserTwoId)).isFalse();
}
@Test
public void testIsScheduled_afterScheduling_returnsTrue() {
- KeyValueBackupJob.schedule(mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserOneId, mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserTwoId, mContext, mConstants);
+
+ assertThat(KeyValueBackupJob.isScheduled(mUserOneId)).isTrue();
+ assertThat(KeyValueBackupJob.isScheduled(mUserTwoId)).isTrue();
+ }
+
+ @Test
+ public void testIsScheduled_afterCancelling_returnsFalse() {
+ KeyValueBackupJob.schedule(mUserOneId, mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserTwoId, mContext, mConstants);
+ KeyValueBackupJob.cancel(mUserOneId, mContext);
+ KeyValueBackupJob.cancel(mUserTwoId, mContext);
- boolean isScheduled = KeyValueBackupJob.isScheduled();
+ assertThat(KeyValueBackupJob.isScheduled(mUserOneId)).isFalse();
+ assertThat(KeyValueBackupJob.isScheduled(mUserTwoId)).isFalse();
+ }
+
+ @Test
+ public void testIsScheduled_afterScheduling_returnsTrueOnlyForScheduledUser() {
+ KeyValueBackupJob.schedule(mUserOneId, mContext, mConstants);
+
+ assertThat(KeyValueBackupJob.isScheduled(mUserOneId)).isTrue();
+ assertThat(KeyValueBackupJob.isScheduled(mUserTwoId)).isFalse();
+ }
+
+ @Test
+ public void testIsScheduled_afterCancelling_returnsFalseOnlyForCancelledUser() {
+ KeyValueBackupJob.schedule(mUserOneId, mContext, mConstants);
+ KeyValueBackupJob.schedule(mUserTwoId, mContext, mConstants);
+ KeyValueBackupJob.cancel(mUserOneId, mContext);
- assertThat(isScheduled).isTrue();
+ assertThat(KeyValueBackupJob.isScheduled(mUserOneId)).isFalse();
+ assertThat(KeyValueBackupJob.isScheduled(mUserTwoId)).isTrue();
}
}
diff --git a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java
index 693092da0334..9a6e003c1317 100644
--- a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java
@@ -41,6 +41,7 @@ import static java.util.stream.Collectors.toSet;
import static java.util.stream.Stream.concat;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.backup.BackupManager;
import android.app.backup.BackupTransport;
import android.content.ComponentName;
@@ -48,6 +49,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import com.android.server.backup.testing.TransportData;
@@ -56,7 +58,9 @@ import com.android.server.backup.transport.OnTransportRegisteredListener;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.transport.TransportClientManager;
import com.android.server.backup.transport.TransportNotRegisteredException;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -64,6 +68,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPackageManager;
import java.util.ArrayList;
@@ -73,6 +78,7 @@ import java.util.Set;
import java.util.stream.Stream;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
@Presubmit
public class TransportManagerTest {
private static final String PACKAGE_A = "some.package.a";
@@ -84,12 +90,14 @@ public class TransportManagerTest {
private TransportData mTransportA2;
private TransportData mTransportB1;
private ShadowPackageManager mShadowPackageManager;
+ private @UserIdInt int mUserId;
private Context mContext;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ mUserId = UserHandle.USER_SYSTEM;
mContext = RuntimeEnvironment.application;
mShadowPackageManager = shadowOf(mContext.getPackageManager());
@@ -98,6 +106,12 @@ public class TransportManagerTest {
mTransportB1 = genericTransport(PACKAGE_B, "TransportBaz");
}
+ /** Reset shadow state. */
+ @After
+ public void tearDown() throws Exception {
+ ShadowApplicationPackageManager.reset();
+ }
+
@Test
public void testRegisterTransports() throws Exception {
setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
@@ -662,7 +676,8 @@ public class TransportManagerTest {
packageInfo.packageName = packageName;
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.privateFlags = flags;
- mShadowPackageManager.addPackage(packageInfo);
+ mShadowPackageManager.installPackage(packageInfo);
+ ShadowApplicationPackageManager.addInstalledPackage(packageName, packageInfo);
}
private TransportManager createTransportManagerWithRegisteredTransports(
@@ -684,6 +699,7 @@ public class TransportManagerTest {
@Nullable TransportData selectedTransport, TransportData... transports) {
TransportManager transportManager =
new TransportManager(
+ mUserId,
mContext,
merge(selectedTransport, transports)
.stream()
diff --git a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
index bb60c27a2543..427aed7364d2 100644
--- a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
@@ -42,6 +42,8 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.os.Binder;
import android.os.HandlerThread;
import android.os.PowerManager;
@@ -54,6 +56,7 @@ import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.TransportNotRegisteredException;
import com.android.server.testing.shadows.ShadowAppBackupUtils;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBinder;
import com.android.server.testing.shadows.ShadowKeyValueBackupJob;
import com.android.server.testing.shadows.ShadowKeyValueBackupTask;
@@ -80,7 +83,7 @@ import java.util.List;
* UserBackupManagerService} that performs operations for its target user.
*/
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowAppBackupUtils.class})
+@Config(shadows = {ShadowAppBackupUtils.class, ShadowApplicationPackageManager.class})
@Presubmit
public class UserBackupManagerServiceTest {
private static final String TAG = "BMSTest";
@@ -137,6 +140,7 @@ public class UserBackupManagerServiceTest {
public void tearDown() throws Exception {
mBackupThread.quit();
ShadowAppBackupUtils.reset();
+ ShadowApplicationPackageManager.reset();
}
/**
@@ -195,6 +199,7 @@ public class UserBackupManagerServiceTest {
public void testIsAppEligibleForBackup_whenAppNotEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
setUpCurrentTransport(mTransportManager, mTransport);
+ registerPackages(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1);
@@ -210,6 +215,7 @@ public class UserBackupManagerServiceTest {
public void testIsAppEligibleForBackup_whenAppEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport());
+ registerPackages(PACKAGE_1);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
@@ -228,6 +234,7 @@ public class UserBackupManagerServiceTest {
public void testIsAppEligibleForBackup_withoutPermission() throws Exception {
mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
setUpCurrentTransport(mTransportManager, mTransport);
+ registerPackages(PACKAGE_1);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
@@ -245,6 +252,7 @@ public class UserBackupManagerServiceTest {
public void testFilterAppsEligibleForBackup() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
TransportMock transportMock = setUpCurrentTransport(mTransportManager, mTransport);
+ registerPackages(PACKAGE_1, PACKAGE_2);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
@@ -264,6 +272,7 @@ public class UserBackupManagerServiceTest {
@Test
public void testFilterAppsEligibleForBackup_whenNoneIsEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ registerPackages(PACKAGE_1, PACKAGE_2);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
String[] filtered =
@@ -281,6 +290,7 @@ public class UserBackupManagerServiceTest {
public void testFilterAppsEligibleForBackup_withoutPermission() throws Exception {
mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
setUpCurrentTransport(mTransportManager, mTransport);
+ registerPackages(PACKAGE_1, PACKAGE_2);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
expectThrows(
@@ -504,10 +514,14 @@ public class UserBackupManagerServiceTest {
private void setUpForUpdateTransportAttributes() throws Exception {
mTransportComponent = mTransport.getTransportComponent();
String transportPackage = mTransportComponent.getPackageName();
+ PackageInfo packageInfo = getPackageInfo(transportPackage);
ShadowPackageManager shadowPackageManager = shadowOf(mContext.getPackageManager());
- shadowPackageManager.addPackage(transportPackage);
+ shadowPackageManager.installPackage(packageInfo);
shadowPackageManager.setPackagesForUid(PACKAGE_UID, transportPackage);
+ // Set up for user invocations on ApplicationPackageManager.
+ ShadowApplicationPackageManager.addInstalledPackage(transportPackage, packageInfo);
+ ShadowApplicationPackageManager.setPackageUid(transportPackage, PACKAGE_UID);
mTransportUid = mContext.getPackageManager().getPackageUid(transportPackage, 0);
}
@@ -749,7 +763,7 @@ public class UserBackupManagerServiceTest {
private void setUpForRequestBackup(String... packages) throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
for (String packageName : packages) {
- mShadowPackageManager.addPackage(packageName);
+ registerPackages(packageName);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(packageName);
}
setUpCurrentTransport(mTransportManager, mTransport);
@@ -829,7 +843,7 @@ public class UserBackupManagerServiceTest {
public void testRequestBackup_whenNotProvisioned() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
- backupManagerService.setProvisioned(false);
+ backupManagerService.setSetupComplete(false);
int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
@@ -848,7 +862,7 @@ public class UserBackupManagerServiceTest {
setUpCurrentTransport(mTransportManager, mTransport.unregistered());
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
backupManagerService.setEnabled(true);
- backupManagerService.setProvisioned(true);
+ backupManagerService.setSetupComplete(true);
int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
@@ -864,11 +878,11 @@ public class UserBackupManagerServiceTest {
@Test
public void testRequestBackup_whenAppNotEligibleForBackup() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
- mShadowPackageManager.addPackage(PACKAGE_1);
+ registerPackages(PACKAGE_1);
setUpCurrentTransport(mTransportManager, mTransport);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
backupManagerService.setEnabled(true);
- backupManagerService.setProvisioned(true);
+ backupManagerService.setSetupComplete(true);
// Haven't set PACKAGE_1 as eligible
int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
@@ -965,14 +979,13 @@ public class UserBackupManagerServiceTest {
private UserBackupManagerService createBackupManagerServiceForRequestBackup() {
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
backupManagerService.setEnabled(true);
- backupManagerService.setProvisioned(true);
+ backupManagerService.setSetupComplete(true);
return backupManagerService;
}
/**
- * Test verifying that {@link UserBackupManagerService#createAndInitializeService(Context,
- * Trampoline, HandlerThread, File, File, TransportManager)} posts a transport registration task
- * to the backup thread.
+ * Test verifying that creating a new instance posts a transport registration task to the backup
+ * thread.
*/
@Test
public void testCreateAndInitializeService_postRegisterTransports() {
@@ -992,9 +1005,8 @@ public class UserBackupManagerServiceTest {
}
/**
- * Test verifying that {@link UserBackupManagerService#createAndInitializeService(Context,
- * Trampoline, HandlerThread, File, File, TransportManager)} does not directly register
- * transports on the main thread.
+ * Test verifying that creating a new instance does not directly register transports on the main
+ * thread.
*/
@Test
public void testCreateAndInitializeService_doesNotRegisterTransportsSynchronously() {
@@ -1013,11 +1025,7 @@ public class UserBackupManagerServiceTest {
verify(mTransportManager, never()).registerTransports();
}
- /**
- * Test checking non-null argument on {@link
- * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File,
- * File, TransportManager)}.
- */
+ /** Test checking non-null argument on instance creation. */
@Test
public void testCreateAndInitializeService_withNullContext_throws() {
expectThrows(
@@ -1033,11 +1041,7 @@ public class UserBackupManagerServiceTest {
mTransportManager));
}
- /**
- * Test checking non-null argument on {@link
- * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File,
- * File, TransportManager)}.
- */
+ /** Test checking non-null argument on instance creation. */
@Test
public void testCreateAndInitializeService_withNullTrampoline_throws() {
expectThrows(
@@ -1053,11 +1057,7 @@ public class UserBackupManagerServiceTest {
mTransportManager));
}
- /**
- * Test checking non-null argument on {@link
- * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File,
- * File, TransportManager)}.
- */
+ /** Test checking non-null argument on instance creation. */
@Test
public void testCreateAndInitializeService_withNullBackupThread_throws() {
expectThrows(
@@ -1073,11 +1073,7 @@ public class UserBackupManagerServiceTest {
mTransportManager));
}
- /**
- * Test checking non-null argument on {@link
- * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File,
- * File, TransportManager)}.
- */
+ /** Test checking non-null argument on instance creation. */
@Test
public void testCreateAndInitializeService_withNullStateDir_throws() {
expectThrows(
@@ -1145,6 +1141,22 @@ public class UserBackupManagerServiceTest {
backupManagerService.setPowerManager(powerManagerMock);
}
+ private PackageInfo getPackageInfo(String packageName) {
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.packageName = packageName;
+ packageInfo.applicationInfo = new ApplicationInfo();
+ packageInfo.applicationInfo.packageName = packageName;
+ return packageInfo;
+ }
+
+ private void registerPackages(String... packages) {
+ for (String packageName : packages) {
+ PackageInfo packageInfo = getPackageInfo(packageName);
+ mShadowPackageManager.installPackage(packageInfo);
+ ShadowApplicationPackageManager.addInstalledPackage(packageName, packageInfo);
+ }
+ }
+
/**
* We can't mock the void method {@link #schedule(Context, long, BackupManagerConstants)} so we
* extend {@link ShadowKeyValueBackupJob} and throw an exception at the end of the method.
@@ -1155,8 +1167,9 @@ public class UserBackupManagerServiceTest {
* Implementation of {@link ShadowKeyValueBackupJob#schedule(Context, long,
* BackupManagerConstants)} that throws an {@link IllegalArgumentException}.
*/
- public static void schedule(Context ctx, long delay, BackupManagerConstants constants) {
- ShadowKeyValueBackupJob.schedule(ctx, delay, constants);
+ public static void schedule(int userId, Context ctx, long delay,
+ BackupManagerConstants constants) {
+ ShadowKeyValueBackupJob.schedule(userId, ctx, delay, constants);
throw new IllegalArgumentException();
}
}
diff --git a/services/robotests/backup/src/com/android/server/backup/fullbackup/AppMetadataBackupWriterTest.java b/services/robotests/backup/src/com/android/server/backup/fullbackup/AppMetadataBackupWriterTest.java
index 423512ce4b70..aca48b647efa 100644
--- a/services/robotests/backup/src/com/android/server/backup/fullbackup/AppMetadataBackupWriterTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/fullbackup/AppMetadataBackupWriterTest.java
@@ -12,6 +12,7 @@ import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.Application;
import android.app.backup.BackupDataInput;
import android.app.backup.FullBackupDataOutput;
@@ -62,6 +63,7 @@ public class AppMetadataBackupWriterTest {
private static final String TEST_PACKAGE_INSTALLER = "com.test.package.installer";
private static final Long TEST_PACKAGE_VERSION_CODE = 100L;
+ private @UserIdInt int mUserId;
private PackageManager mPackageManager;
private ShadowApplicationPackageManager mShadowPackageManager;
private File mFilesDir;
@@ -72,6 +74,7 @@ public class AppMetadataBackupWriterTest {
public void setUp() throws Exception {
Application application = RuntimeEnvironment.application;
+ mUserId = UserHandle.USER_SYSTEM;
mPackageManager = application.getPackageManager();
mShadowPackageManager = (ShadowApplicationPackageManager) shadowOf(mPackageManager);
@@ -352,7 +355,7 @@ public class AppMetadataBackupWriterTest {
byte[] obbBytes = "obb".getBytes();
File obbFile = createObbFileAndWrite(obbDir, obbBytes);
- mBackupWriter.backupObb(packageInfo);
+ mBackupWriter.backupObb(mUserId, packageInfo);
byte[] writtenBytes = getWrittenBytes(mBackupDataOutputFile, /* includeTarHeader */ false);
assertThat(writtenBytes).isEqualTo(obbBytes);
@@ -366,7 +369,7 @@ public class AppMetadataBackupWriterTest {
File obbDir = createObbDirForPackage(packageInfo.packageName);
// No obb file created.
- mBackupWriter.backupObb(packageInfo);
+ mBackupWriter.backupObb(mUserId, packageInfo);
assertThat(mBackupDataOutputFile.length()).isEqualTo(0);
}
diff --git a/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java b/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java
new file mode 100644
index 000000000000..bfb2b1479c74
--- /dev/null
+++ b/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2019 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.backup.internal;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.platform.test.annotations.Presubmit;
+import android.provider.Settings;
+
+import com.android.server.backup.KeyValueBackupJob;
+import com.android.server.backup.TransportManager;
+import com.android.server.backup.UserBackupManagerService;
+import com.android.server.backup.testing.BackupManagerServiceTestUtils;
+import com.android.server.backup.testing.TestUtils;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.io.File;
+
+/**
+ * Tests verifying the interaction between {@link SetupObserver} and {@link
+ * UserBackupManagerService}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+@Presubmit
+public class SetupObserverTest {
+ private static final String TAG = "SetupObserverTest";
+ private static final int USER_ID = 10;
+
+ @Mock private TransportManager mTransportManager;
+
+ private Context mContext;
+ private UserBackupManagerService mUserBackupManagerService;
+ private HandlerThread mHandlerThread;
+
+ /** Setup state. */
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mHandlerThread = BackupManagerServiceTestUtils.startSilentBackupThread(TAG);
+ mUserBackupManagerService =
+ BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks(
+ USER_ID,
+ mContext,
+ mHandlerThread,
+ new File(mContext.getDataDir(), "test1"),
+ new File(mContext.getDataDir(), "test2"),
+ mTransportManager);
+ }
+
+ /** Test observer handles changes from not setup -> setup correctly. */
+ @Test
+ public void testOnChange_whenNewlySetup_updatesState() throws Exception {
+ SetupObserver setupObserver = new SetupObserver(mUserBackupManagerService, new Handler());
+ mUserBackupManagerService.setSetupComplete(false);
+ changeSetupCompleteSettingForUser(true, USER_ID);
+
+ setupObserver.onChange(true);
+
+ assertThat(mUserBackupManagerService.isSetupComplete()).isTrue();
+ }
+
+ /** Test observer handles changes from setup -> not setup correctly. */
+ @Test
+ public void testOnChange_whenPreviouslySetup_doesNotUpdateState() throws Exception {
+ SetupObserver setupObserver = new SetupObserver(mUserBackupManagerService, new Handler());
+ mUserBackupManagerService.setSetupComplete(true);
+ changeSetupCompleteSettingForUser(false, USER_ID);
+
+ setupObserver.onChange(true);
+
+ assertThat(mUserBackupManagerService.isSetupComplete()).isTrue();
+ }
+
+ /** Test observer handles changes from not setup -> not setup correctly. */
+ @Test
+ public void testOnChange_whenNotPreviouslySetup_doesNotUpdateStateIfNoChange()
+ throws Exception {
+ SetupObserver setupObserver = new SetupObserver(mUserBackupManagerService, new Handler());
+ mUserBackupManagerService.setSetupComplete(false);
+ changeSetupCompleteSettingForUser(false, USER_ID);
+
+ setupObserver.onChange(true);
+
+ assertThat(mUserBackupManagerService.isSetupComplete()).isFalse();
+ }
+
+ /** Test observer handles changes from not setup -> setup correctly. */
+ @Test
+ public void testOnChange_whenNewlySetup_schedulesBackup() throws Exception {
+ SetupObserver setupObserver = new SetupObserver(mUserBackupManagerService, new Handler());
+ mUserBackupManagerService.setSetupComplete(false);
+ changeSetupCompleteSettingForUser(true, USER_ID);
+ // Setup conditions for a full backup job to be scheduled.
+ mUserBackupManagerService.setEnabled(true);
+ mUserBackupManagerService.enqueueFullBackup("testPackage", /* lastBackedUp */ 0);
+ // Clear the handler of all pending tasks. This is to prevent the below assertion on the
+ // handler from encountering false positives due to other tasks being scheduled as part of
+ // setup work.
+ TestUtils.runToEndOfTasks(mHandlerThread.getLooper());
+
+ setupObserver.onChange(true);
+
+ assertThat(KeyValueBackupJob.isScheduled(mUserBackupManagerService.getUserId())).isTrue();
+ // Verifies that the full backup job is scheduled. The job is scheduled via a posted message
+ // on the backup handler so we verify that a message exists.
+ assertThat(mUserBackupManagerService.getBackupHandler().hasMessagesOrCallbacks()).isTrue();
+ }
+
+ private void changeSetupCompleteSettingForUser(boolean value, int userId) {
+ Settings.Secure.putIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.USER_SETUP_COMPLETE,
+ value ? 1 : 0,
+ userId);
+ }
+}
diff --git a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
index 5e84ab0d66f7..4811523b22f9 100644
--- a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
@@ -115,6 +115,7 @@ import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.testing.shadows.FrameworkShadowLooper;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBackupDataInput;
import com.android.server.testing.shadows.ShadowBackupDataOutput;
import com.android.server.testing.shadows.ShadowEventLog;
@@ -157,6 +158,7 @@ import java.util.stream.Stream;
@Config(
shadows = {
FrameworkShadowLooper.class,
+ ShadowApplicationPackageManager.class,
ShadowBackupDataInput.class,
ShadowBackupDataOutput.class,
ShadowEventLog.class,
@@ -244,6 +246,7 @@ public class KeyValueBackupTaskTest {
@After
public void tearDown() throws Exception {
ShadowBackupDataInput.reset();
+ ShadowApplicationPackageManager.reset();
}
@Test
@@ -2432,10 +2435,12 @@ public class KeyValueBackupTaskTest {
private AgentMock setUpAgent(PackageData packageData) {
try {
+ String packageName = packageData.packageName;
mPackageManager.setApplicationEnabledSetting(
- packageData.packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
+ packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
PackageInfo packageInfo = getPackageInfo(packageData);
- mShadowPackageManager.addPackage(packageInfo);
+ mShadowPackageManager.installPackage(packageInfo);
+ ShadowApplicationPackageManager.addInstalledPackage(packageName, packageInfo);
mContext.sendBroadcast(getPackageAddedIntent(packageData));
// Run the backup looper because on the receiver we post MSG_SCHEDULE_BACKUP_PACKAGE
mShadowBackupLooper.runToEndOfTasks();
@@ -2531,7 +2536,7 @@ public class KeyValueBackupTaskTest {
private PackageManagerBackupAgent createPmAgent() {
PackageManagerBackupAgent pmAgent =
- new PackageManagerBackupAgent(mApplication.getPackageManager());
+ new PackageManagerBackupAgent(mApplication.getPackageManager(), USER_ID);
pmAgent.attach(mApplication);
pmAgent.onCreate();
return pmAgent;
@@ -2721,7 +2726,7 @@ public class KeyValueBackupTaskTest {
throws RemoteException, IOException {
verify(transportMock.transport).requestBackupTime();
assertBackupPendingFor(packages);
- assertThat(KeyValueBackupJob.isScheduled()).isTrue();
+ assertThat(KeyValueBackupJob.isScheduled(mBackupManagerService.getUserId())).isTrue();
}
private void assertBackupPendingFor(PackageData... packages) throws IOException {
@@ -2836,7 +2841,7 @@ public class KeyValueBackupTaskTest {
ThrowingPackageManagerBackupAgent(
PackageManager packageManager, RuntimeException exception) {
- super(packageManager);
+ super(packageManager, USER_ID);
mException = exception;
}
diff --git a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
index 4009876314e8..f17a9fe48c61 100644
--- a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -57,6 +57,7 @@ import com.android.server.backup.internal.BackupHandler;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowEventLog;
import com.android.server.testing.shadows.ShadowPerformUnifiedRestoreTask;
@@ -77,7 +78,13 @@ import org.robolectric.shadows.ShadowPackageManager;
import java.util.ArrayDeque;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowEventLog.class, ShadowPerformUnifiedRestoreTask.class, ShadowBinder.class})
+@Config(
+ shadows = {
+ ShadowApplicationPackageManager.class,
+ ShadowBinder.class,
+ ShadowEventLog.class,
+ ShadowPerformUnifiedRestoreTask.class
+ })
@Presubmit
public class ActiveRestoreSessionTest {
private static final String PACKAGE_1 = "com.example.package1";
@@ -140,6 +147,7 @@ public class ActiveRestoreSessionTest {
@After
public void tearDown() throws Exception {
+ ShadowApplicationPackageManager.reset();
ShadowPerformUnifiedRestoreTask.reset();
}
@@ -561,7 +569,8 @@ public class ActiveRestoreSessionTest {
packageInfo.packageName = packageName;
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.uid = uid;
- mShadowPackageManager.addPackage(packageInfo);
+ mShadowPackageManager.installPackage(packageInfo);
+ ShadowApplicationPackageManager.addInstalledPackage(packageName, packageInfo);
}
private IRestoreSession createActiveRestoreSession(
diff --git a/services/robotests/backup/src/com/android/server/backup/transport/TransportClientManagerTest.java b/services/robotests/backup/src/com/android/server/backup/transport/TransportClientManagerTest.java
index 7dd0d927edd0..f033af8a9b63 100644
--- a/services/robotests/backup/src/com/android/server/backup/transport/TransportClientManagerTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/transport/TransportClientManagerTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -49,6 +50,7 @@ public class TransportClientManagerTest {
@Mock private Context mContext;
@Mock private TransportConnectionListener mTransportConnectionListener;
+ private @UserIdInt int mUserId;
private TransportClientManager mTransportClientManager;
private ComponentName mTransportComponent;
private Intent mBindIntent;
@@ -57,7 +59,9 @@ public class TransportClientManagerTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
- mTransportClientManager = new TransportClientManager(mContext, new TransportStats());
+ mUserId = UserHandle.USER_SYSTEM;
+ mTransportClientManager =
+ new TransportClientManager(mUserId, mContext, new TransportStats());
mTransportComponent = new ComponentName(PACKAGE_NAME, CLASS_NAME);
mBindIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST).setComponent(mTransportComponent);
diff --git a/services/robotests/backup/src/com/android/server/backup/transport/TransportClientTest.java b/services/robotests/backup/src/com/android/server/backup/transport/TransportClientTest.java
index 7281a3c87a29..392f2ca9490e 100644
--- a/services/robotests/backup/src/com/android/server/backup/transport/TransportClientTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/transport/TransportClientTest.java
@@ -36,6 +36,7 @@ import static org.robolectric.shadow.api.Shadow.extract;
import static org.testng.Assert.expectThrows;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -83,6 +84,7 @@ public class TransportClientTest {
@Mock private TransportConnectionListener mTransportConnectionListener;
@Mock private TransportConnectionListener mTransportConnectionListener2;
@Mock private IBackupTransport.Stub mTransportBinder;
+ @UserIdInt private int mUserId;
private TransportStats mTransportStats;
private TransportClient mTransportClient;
private ComponentName mTransportComponent;
@@ -96,6 +98,7 @@ public class TransportClientTest {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ mUserId = UserHandle.USER_SYSTEM;
Looper mainLooper = Looper.getMainLooper();
mShadowMainLooper = extract(mainLooper);
mTransportComponent =
@@ -105,6 +108,7 @@ public class TransportClientTest {
mBindIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST).setComponent(mTransportComponent);
mTransportClient =
new TransportClient(
+ mUserId,
mContext,
mTransportStats,
mBindIntent,
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
index 5fffb149fd96..aefc871d2639 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
@@ -54,7 +54,10 @@ public class ShadowAppBackupUtils {
@Implementation
protected static boolean appIsRunningAndEligibleForBackupWithTransport(
- @Nullable TransportClient transportClient, String packageName, PackageManager pm) {
+ @Nullable TransportClient transportClient,
+ String packageName,
+ PackageManager pm,
+ int userId) {
return sAppsRunningAndEligibleForBackupWithTransport.contains(packageName);
}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowApplicationPackageManager.java b/services/robotests/src/com/android/server/testing/shadows/ShadowApplicationPackageManager.java
new file mode 100644
index 000000000000..ab121eddff06
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowApplicationPackageManager.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2019 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.testing.shadows;
+
+import static android.content.pm.PackageManager.NameNotFoundException;
+
+import android.app.ApplicationPackageManager;
+import android.content.pm.PackageInfo;
+import android.util.ArrayMap;
+
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Extends {@link org.robolectric.shadows.ShadowApplicationPackageManager} to return the correct
+ * package in user-specific invocations.
+ */
+@Implements(value = ApplicationPackageManager.class)
+public class ShadowApplicationPackageManager
+ extends org.robolectric.shadows.ShadowApplicationPackageManager {
+ private static final Map<String, PackageInfo> sPackageInfos = new ArrayMap<>();
+ private static final List<PackageInfo> sInstalledPackages = new ArrayList<>();
+ private static final Map<String, Integer> sPackageUids = new ArrayMap<>();
+
+ /**
+ * Registers the package {@code packageName} to be returned when invoking {@link
+ * ApplicationPackageManager#getPackageInfoAsUser(String, int, int)} and {@link
+ * ApplicationPackageManager#getInstalledPackagesAsUser(int, int)}.
+ */
+ public static void addInstalledPackage(String packageName, PackageInfo packageInfo) {
+ sPackageInfos.put(packageName, packageInfo);
+ sInstalledPackages.add(packageInfo);
+ }
+
+ /**
+ * Sets the package uid {@code packageUid} for the package {@code packageName} to be returned
+ * when invoking {@link ApplicationPackageManager#getPackageUidAsUser(String, int, int)}.
+ */
+ public static void setPackageUid(String packageName, int packageUid) {
+ sPackageUids.put(packageName, packageUid);
+ }
+
+ @Override
+ protected PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId)
+ throws NameNotFoundException {
+ if (!sPackageInfos.containsKey(packageName)) {
+ throw new NameNotFoundException(packageName);
+ }
+ return sPackageInfos.get(packageName);
+ }
+
+ @Override
+ protected List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
+ return sInstalledPackages;
+ }
+
+ @Override
+ protected int getPackageUidAsUser(String packageName, int flags, int userId)
+ throws NameNotFoundException {
+ if (!sPackageUids.containsKey(packageName)) {
+ throw new NameNotFoundException(packageName);
+ }
+ return sPackageUids.get(packageName);
+ }
+
+ /** Clear package state. */
+ @Resetter
+ public static void reset() {
+ sPackageInfos.clear();
+ sInstalledPackages.clear();
+ org.robolectric.shadows.ShadowApplicationPackageManager.reset();
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java
index 23c44b0e8c83..f90ea6aff41b 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java
@@ -34,7 +34,8 @@ public class ShadowKeyValueBackupJob {
}
@Implementation
- protected static void schedule(Context ctx, long delay, BackupManagerConstants constants) {
+ protected static void schedule(int userId, Context ctx, long delay,
+ BackupManagerConstants constants) {
callingUid = Binder.getCallingUid();
}
}
diff --git a/services/startop/Android.bp b/services/startop/Android.bp
new file mode 100644
index 000000000000..093b4ec66ddf
--- /dev/null
+++ b/services/startop/Android.bp
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+java_library_static {
+ name: "services.startop",
+
+ static_libs: [
+ // frameworks/base/startop/iorap
+ "services.startop.iorap",
+ ],
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
index 148faada6381..6a153d5346ed 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
@@ -60,6 +60,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.util.Log;
import android.util.SparseArray;
@@ -81,6 +82,7 @@ import org.mockito.quality.Strictness;
import java.util.ArrayList;
+@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class AlarmManagerServiceTest {
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index f1cd0cd6d30c..57ee6dcad9f2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -33,6 +33,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -43,7 +44,12 @@ import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
+import android.app.AppGlobals;
+import android.app.IActivityManager;
+import android.app.IUidObserver;
import android.app.job.JobInfo;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
@@ -56,13 +62,16 @@ import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
import android.os.Handler;
import android.os.Looper;
+import android.os.RemoteException;
import android.os.SystemClock;
+import android.util.SparseBooleanArray;
import androidx.test.runner.AndroidJUnit4;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobSchedulerService.Constants;
+import com.android.server.job.JobStore;
import com.android.server.job.controllers.QuotaController.ExecutionStats;
import com.android.server.job.controllers.QuotaController.TimingSession;
@@ -96,9 +105,13 @@ public class QuotaControllerTest {
private BroadcastReceiver mChargingReceiver;
private Constants mConstants;
private QuotaController mQuotaController;
+ private int mSourceUid;
+ private IUidObserver mUidObserver;
private MockitoSession mMockingSession;
@Mock
+ private ActivityManagerInternal mActivityMangerInternal;
+ @Mock
private AlarmManager mAlarmManager;
@Mock
private Context mContext;
@@ -107,6 +120,8 @@ public class QuotaControllerTest {
@Mock
private UsageStatsManagerInternal mUsageStatsManager;
+ private JobStore mJobStore;
+
@Before
public void setUp() {
mMockingSession = mockitoSession()
@@ -123,8 +138,17 @@ public class QuotaControllerTest {
when(mJobSchedulerService.getLock()).thenReturn(mJobSchedulerService);
when(mJobSchedulerService.getConstants()).thenReturn(mConstants);
// Called in QuotaController constructor.
+ IActivityManager activityManager = ActivityManager.getService();
+ spyOn(activityManager);
+ try {
+ doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
+ } catch (RemoteException e) {
+ fail("registerUidObserver threw exception: " + e.getMessage());
+ }
when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
when(mContext.getSystemService(Context.ALARM_SERVICE)).thenReturn(mAlarmManager);
+ doReturn(mActivityMangerInternal)
+ .when(() -> LocalServices.getService(ActivityManagerInternal.class));
doReturn(mock(BatteryManagerInternal.class))
.when(() -> LocalServices.getService(BatteryManagerInternal.class));
doReturn(mUsageStatsManager)
@@ -132,6 +156,9 @@ public class QuotaControllerTest {
// Used in JobStatus.
doReturn(mock(PackageManagerInternal.class))
.when(() -> LocalServices.getService(PackageManagerInternal.class));
+ // Used in QuotaController.Handler.
+ mJobStore = JobStore.initAndGetForTesting(mContext, mContext.getFilesDir());
+ when(mJobSchedulerService.getJobStore()).thenReturn(mJobStore);
// Freeze the clocks at 24 hours after this moment in time. Several tests create sessions
// in the past, and QuotaController sometimes floors values at 0, so if the test time
@@ -150,10 +177,23 @@ public class QuotaControllerTest {
// Capture the listeners.
ArgumentCaptor<BroadcastReceiver> receiverCaptor =
ArgumentCaptor.forClass(BroadcastReceiver.class);
+ ArgumentCaptor<IUidObserver> uidObserverCaptor =
+ ArgumentCaptor.forClass(IUidObserver.class);
mQuotaController = new QuotaController(mJobSchedulerService);
verify(mContext).registerReceiver(receiverCaptor.capture(), any());
mChargingReceiver = receiverCaptor.getValue();
+ try {
+ verify(activityManager).registerUidObserver(
+ uidObserverCaptor.capture(),
+ eq(ActivityManager.UID_OBSERVER_PROCSTATE),
+ eq(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE),
+ any());
+ mUidObserver = uidObserverCaptor.getValue();
+ mSourceUid = AppGlobals.getPackageManager().getPackageUid(SOURCE_PACKAGE, 0, 0);
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
}
@After
@@ -182,6 +222,25 @@ public class QuotaControllerTest {
mChargingReceiver.onReceive(mContext, intent);
}
+ private void setProcessState(int procState) {
+ try {
+ doReturn(procState).when(mActivityMangerInternal).getUidProcessState(mSourceUid);
+ SparseBooleanArray foregroundUids = mQuotaController.getForegroundUids();
+ spyOn(foregroundUids);
+ mUidObserver.onUidStateChanged(mSourceUid, procState, 0);
+ if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+ verify(foregroundUids, timeout(SECOND_IN_MILLIS).times(1))
+ .put(eq(mSourceUid), eq(true));
+ assertTrue(foregroundUids.get(mSourceUid));
+ } else {
+ verify(foregroundUids, timeout(SECOND_IN_MILLIS).times(1)).delete(eq(mSourceUid));
+ assertFalse(foregroundUids.get(mSourceUid));
+ }
+ } catch (RemoteException e) {
+ fail("registerUidObserver threw exception: " + e.getMessage());
+ }
+ }
+
private void setStandbyBucket(int bucketIndex) {
int bucket;
switch (bucketIndex) {
@@ -204,9 +263,18 @@ public class QuotaControllerTest {
anyLong())).thenReturn(bucket);
}
- private void setStandbyBucket(int bucketIndex, JobStatus job) {
+ private void setStandbyBucket(int bucketIndex, JobStatus... jobs) {
setStandbyBucket(bucketIndex);
- job.setStandbyBucket(bucketIndex);
+ for (JobStatus job : jobs) {
+ job.setStandbyBucket(bucketIndex);
+ }
+ }
+
+ private void trackJobs(JobStatus... jobs) {
+ for (JobStatus job : jobs) {
+ mJobStore.add(job);
+ mQuotaController.maybeStartTrackingJobLocked(job, null);
+ }
}
private JobStatus createJobStatus(String testTag, int jobId) {
@@ -214,8 +282,11 @@ public class QuotaControllerTest {
new ComponentName(mContext, "TestQuotaJobService"))
.setMinimumLatency(Math.abs(jobId) + 1)
.build();
- return JobStatus.createFromJobInfo(
+ JobStatus js = JobStatus.createFromJobInfo(
jobInfo, CALLING_UID, SOURCE_PACKAGE, SOURCE_USER_ID, testTag);
+ // Make sure tests aren't passing just because the default bucket is likely ACTIVE.
+ js.setStandbyBucket(FREQUENT_INDEX);
+ return js;
}
private TimingSession createTimingSession(long start, long duration, int count) {
@@ -709,6 +780,7 @@ public class QuotaControllerTest {
verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
JobStatus jobStatus = createJobStatus("testMaybeScheduleStartAlarmLocked_Active", 1);
+ setStandbyBucket(standbyBucket, jobStatus);
mQuotaController.maybeStartTrackingJobLocked(jobStatus, null);
mQuotaController.prepareForExecutionLocked(jobStatus);
advanceElapsedClock(5 * MINUTE_IN_MILLIS);
@@ -1339,19 +1411,23 @@ public class QuotaControllerTest {
setDischarging();
JobStatus jobStatus = createJobStatus("testTimerTracking_AllForeground", 1);
- jobStatus.uidActive = true;
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
mQuotaController.maybeStartTrackingJobLocked(jobStatus, null);
assertNull(mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
mQuotaController.prepareForExecutionLocked(jobStatus);
advanceElapsedClock(5 * SECOND_IN_MILLIS);
+ // Change to a state that should still be considered foreground.
+ setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ advanceElapsedClock(5 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobStatus, null, false);
assertNull(mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
}
/**
- * Tests that Timers properly track overlapping foreground and background jobs.
+ * Tests that Timers properly track sessions when switching between foreground and background
+ * states.
*/
@Test
public void testTimerTracking_ForegroundAndBackground() {
@@ -1360,7 +1436,6 @@ public class QuotaControllerTest {
JobStatus jobBg1 = createJobStatus("testTimerTracking_ForegroundAndBackground", 1);
JobStatus jobBg2 = createJobStatus("testTimerTracking_ForegroundAndBackground", 2);
JobStatus jobFg3 = createJobStatus("testTimerTracking_ForegroundAndBackground", 3);
- jobFg3.uidActive = true;
mQuotaController.maybeStartTrackingJobLocked(jobBg1, null);
mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
mQuotaController.maybeStartTrackingJobLocked(jobFg3, null);
@@ -1368,6 +1443,7 @@ public class QuotaControllerTest {
List<TimingSession> expected = new ArrayList<>();
// UID starts out inactive.
+ setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
long start = JobSchedulerService.sElapsedRealtimeClock.millis();
mQuotaController.prepareForExecutionLocked(jobBg1);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
@@ -1379,48 +1455,223 @@ public class QuotaControllerTest {
// Bg job starts while inactive, spans an entire active session, and ends after the
// active session.
- // Fg job starts after the bg job and ends before the bg job.
- // Entire bg job duration should be counted since it started before active session. However,
- // count should only be 1 since Timer shouldn't count fg jobs.
+ // App switching to foreground state then fg job starts.
+ // App remains in foreground state after coming to foreground, so there should only be one
+ // session.
start = JobSchedulerService.sElapsedRealtimeClock.millis();
mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
mQuotaController.prepareForExecutionLocked(jobBg2);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1));
+ setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
mQuotaController.prepareForExecutionLocked(jobFg3);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobFg3, null, false);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobBg2, null, false);
- expected.add(createTimingSession(start, 30 * SECOND_IN_MILLIS, 1));
assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
advanceElapsedClock(SECOND_IN_MILLIS);
// Bg job 1 starts, then fg job starts. Bg job 1 job ends. Shortly after, uid goes
// "inactive" and then bg job 2 starts. Then fg job ends.
- // This should result in two TimingSessions with a count of one each.
+ // This should result in two TimingSessions:
+ // * The first should have a count of 1
+ // * The second should have a count of 2 since it will include both jobs
start = JobSchedulerService.sElapsedRealtimeClock.millis();
mQuotaController.maybeStartTrackingJobLocked(jobBg1, null);
mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
mQuotaController.maybeStartTrackingJobLocked(jobFg3, null);
+ setProcessState(ActivityManager.PROCESS_STATE_LAST_ACTIVITY);
mQuotaController.prepareForExecutionLocked(jobBg1);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1));
+ setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
mQuotaController.prepareForExecutionLocked(jobFg3);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobBg1, jobBg1, true);
- expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 1));
advanceElapsedClock(10 * SECOND_IN_MILLIS); // UID "inactive" now
start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING);
mQuotaController.prepareForExecutionLocked(jobBg2);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobFg3, null, false);
advanceElapsedClock(10 * SECOND_IN_MILLIS);
mQuotaController.maybeStopTrackingJobLocked(jobBg2, null, false);
- expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 1));
+ expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 2));
assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
}
/**
+ * Tests that Timers properly track overlapping top and background jobs.
+ */
+ @Test
+ public void testTimerTracking_TopAndNonTop() {
+ setDischarging();
+
+ JobStatus jobBg1 = createJobStatus("testTimerTracking_TopAndNonTop", 1);
+ JobStatus jobBg2 = createJobStatus("testTimerTracking_TopAndNonTop", 2);
+ JobStatus jobFg1 = createJobStatus("testTimerTracking_TopAndNonTop", 3);
+ JobStatus jobTop = createJobStatus("testTimerTracking_TopAndNonTop", 4);
+ mQuotaController.maybeStartTrackingJobLocked(jobBg1, null);
+ mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
+ mQuotaController.maybeStartTrackingJobLocked(jobFg1, null);
+ mQuotaController.maybeStartTrackingJobLocked(jobTop, null);
+ assertNull(mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
+ List<TimingSession> expected = new ArrayList<>();
+
+ // UID starts out inactive.
+ setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ long start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ mQuotaController.prepareForExecutionLocked(jobBg1);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobBg1, jobBg1, true);
+ expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1));
+ assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
+
+ advanceElapsedClock(SECOND_IN_MILLIS);
+
+ // Bg job starts while inactive, spans an entire active session, and ends after the
+ // active session.
+ // App switching to top state then fg job starts.
+ // App remains in top state after coming to top, so there should only be one
+ // session.
+ start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
+ mQuotaController.prepareForExecutionLocked(jobBg2);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1));
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
+ mQuotaController.prepareForExecutionLocked(jobTop);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobTop, null, false);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobBg2, null, false);
+ assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
+
+ advanceElapsedClock(SECOND_IN_MILLIS);
+
+ // Bg job 1 starts, then top job starts. Bg job 1 job ends. Then app goes to
+ // foreground_service and a new job starts. Shortly after, uid goes
+ // "inactive" and then bg job 2 starts. Then top job ends, followed by bg and fg jobs.
+ // This should result in two TimingSessions:
+ // * The first should have a count of 1
+ // * The second should have a count of 2, which accounts for the bg2 and fg, but not top
+ // jobs.
+ start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ mQuotaController.maybeStartTrackingJobLocked(jobBg1, null);
+ mQuotaController.maybeStartTrackingJobLocked(jobBg2, null);
+ mQuotaController.maybeStartTrackingJobLocked(jobTop, null);
+ setProcessState(ActivityManager.PROCESS_STATE_LAST_ACTIVITY);
+ mQuotaController.prepareForExecutionLocked(jobBg1);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1));
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
+ mQuotaController.prepareForExecutionLocked(jobTop);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobBg1, jobBg1, true);
+ advanceElapsedClock(5 * SECOND_IN_MILLIS);
+ setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ mQuotaController.prepareForExecutionLocked(jobFg1);
+ advanceElapsedClock(5 * SECOND_IN_MILLIS);
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS); // UID "inactive" now
+ start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ mQuotaController.prepareForExecutionLocked(jobBg2);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobTop, null, false);
+ advanceElapsedClock(10 * SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(jobBg2, null, false);
+ mQuotaController.maybeStopTrackingJobLocked(jobFg1, null, false);
+ expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 2));
+ assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE));
+ }
+
+ /**
+ * Tests that TOP jobs aren't stopped when an app runs out of quota.
+ */
+ @Test
+ public void testTracking_OutOfQuota_ForegroundAndBackground() {
+ setDischarging();
+
+ JobStatus jobBg = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 1);
+ JobStatus jobTop = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 2);
+ trackJobs(jobBg, jobTop);
+ setStandbyBucket(WORKING_INDEX, jobTop, jobBg); // 2 hour window
+ // Now the package only has 20 seconds to run.
+ final long remainingTimeMs = 20 * SECOND_IN_MILLIS;
+ mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+ createTimingSession(
+ JobSchedulerService.sElapsedRealtimeClock.millis() - HOUR_IN_MILLIS,
+ 10 * MINUTE_IN_MILLIS - remainingTimeMs, 1));
+
+ InOrder inOrder = inOrder(mJobSchedulerService);
+
+ // UID starts out inactive.
+ setProcessState(ActivityManager.PROCESS_STATE_SERVICE);
+ // Start the job.
+ mQuotaController.prepareForExecutionLocked(jobBg);
+ advanceElapsedClock(remainingTimeMs / 2);
+ // New job starts after UID is in the foreground. Since the app is now in the foreground, it
+ // should continue to have remainingTimeMs / 2 time remaining.
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
+ mQuotaController.prepareForExecutionLocked(jobTop);
+ advanceElapsedClock(remainingTimeMs);
+
+ // Wait for some extra time to allow for job processing.
+ inOrder.verify(mJobSchedulerService,
+ timeout(remainingTimeMs + 2 * SECOND_IN_MILLIS).times(0))
+ .onControllerStateChanged();
+ assertEquals(remainingTimeMs / 2, mQuotaController.getRemainingExecutionTimeLocked(jobBg));
+ assertEquals(remainingTimeMs / 2, mQuotaController.getRemainingExecutionTimeLocked(jobTop));
+ // Go to a background state.
+ setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ advanceElapsedClock(remainingTimeMs / 2 + 1);
+ inOrder.verify(mJobSchedulerService,
+ timeout(remainingTimeMs / 2 + 2 * SECOND_IN_MILLIS).times(1))
+ .onControllerStateChanged();
+ // Top job should still be allowed to run.
+ assertFalse(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+
+ // New jobs to run.
+ JobStatus jobBg2 = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 3);
+ JobStatus jobTop2 = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 4);
+ JobStatus jobFg = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 5);
+ setStandbyBucket(WORKING_INDEX, jobBg2, jobTop2, jobFg);
+
+ advanceElapsedClock(20 * SECOND_IN_MILLIS);
+ setProcessState(ActivityManager.PROCESS_STATE_TOP);
+ inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1))
+ .onControllerStateChanged();
+ trackJobs(jobFg, jobTop);
+ mQuotaController.prepareForExecutionLocked(jobTop);
+ assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertTrue(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertTrue(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+
+ // App still in foreground so everything should be in quota.
+ advanceElapsedClock(20 * SECOND_IN_MILLIS);
+ setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertTrue(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertTrue(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+
+ advanceElapsedClock(20 * SECOND_IN_MILLIS);
+ setProcessState(ActivityManager.PROCESS_STATE_SERVICE);
+ inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1))
+ .onControllerStateChanged();
+ // App is now in background and out of quota. Fg should now change to out of quota since it
+ // wasn't started. Top should remain in quota since it started when the app was in TOP.
+ assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertFalse(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ assertFalse(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ trackJobs(jobBg2);
+ assertFalse(jobBg2.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ }
+
+ /**
* Tests that a job is properly updated and JobSchedulerService is notified when a job reaches
* its quota.
*/
diff --git a/services/tests/rescueparty/Android.bp b/services/tests/rescueparty/Android.bp
new file mode 100644
index 000000000000..6733af4eb26a
--- /dev/null
+++ b/services/tests/rescueparty/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2008 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.
+
+cc_test {
+ name: "log_rescueparty_reset_event_reported",
+ srcs: ["log_rescueparty_reset_event_reported.cpp"],
+ shared_libs: [
+ "libbase",
+ "libstatslog",
+ ],
+ gtest: false,
+}
diff --git a/services/tests/rescueparty/how_to_run.txt b/services/tests/rescueparty/how_to_run.txt
new file mode 100644
index 000000000000..9528d39358eb
--- /dev/null
+++ b/services/tests/rescueparty/how_to_run.txt
@@ -0,0 +1,9 @@
+# Per http://go/westworld-local-development#step3-test-atom-and-metric-locally-on-device ,
+# In one terminal:
+make statsd_testdrive
+./out/host/linux-x86/bin/statsd_testdrive 122
+
+# In another terminal:
+mma -j $(nproc) log_rescueparty_reset_event_reported
+adb push $OUT/testcases/log_rescueparty_reset_event_reported/arm64/log_rescueparty_reset_event_reported /data
+adb shell /data/log_rescueparty_reset_event_reported 1234
diff --git a/services/tests/rescueparty/log_rescueparty_reset_event_reported.cpp b/services/tests/rescueparty/log_rescueparty_reset_event_reported.cpp
new file mode 100644
index 000000000000..4aea91784092
--- /dev/null
+++ b/services/tests/rescueparty/log_rescueparty_reset_event_reported.cpp
@@ -0,0 +1,24 @@
+// Copyright (C) 2008 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.
+
+#include <statslog.h>
+#include <cstdlib>
+
+int main(int argc, const char** argv) {
+ int level = 0;
+ if (argc > 1) {
+ level = std::atoi(argv[1]);
+ }
+ android::util::stats_write(android::util::RESCUE_PARTY_RESET_REPORTED, level);
+}
diff --git a/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java
index ec5d93edc126..68f696b26a26 100644
--- a/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java
@@ -227,6 +227,22 @@ public class StorageManagerServiceTest {
}
@Test
+ public void testPackageInLegacyMode() throws Exception {
+ setStorageMountMode(PID_RED, UID_COLORS, Zygote.MOUNT_EXTERNAL_LEGACY);
+
+ // Both app and system have the same view
+ assertTranslation(
+ "/storage/emulated/0/Android/data/com.red/foo.jpg",
+ "/storage/emulated/0/Android/data/com.red/foo.jpg",
+ PID_RED, UID_COLORS);
+
+ assertTranslation(
+ "/storage/emulated/0/Android/sandbox/com.grey/bar.jpg",
+ "/storage/emulated/0/Android/sandbox/com.grey/bar.jpg",
+ PID_RED, UID_COLORS);
+ }
+
+ @Test
public void testInstallerPackage() throws Exception {
setStorageMountMode(PID_GREY, UID_GREY, Zygote.MOUNT_EXTERNAL_INSTALLER);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
index e4fe5995ce2f..00a60b91ec5c 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -117,7 +117,7 @@ public class ActivityManagerInternalTest {
thread2.assertWaiting("Unexpected state for " + record2);
thread2.interrupt();
- mAms.mActiveUids.clear();
+ mAms.mProcessList.mActiveUids.clear();
}
private UidRecord addActiveUidRecord(int uid, long curProcStateSeq,
@@ -126,7 +126,7 @@ public class ActivityManagerInternalTest {
record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
record.curProcStateSeq = curProcStateSeq;
record.waitingForNetwork = true;
- mAms.mActiveUids.put(uid, record);
+ mAms.mProcessList.mActiveUids.put(uid, record);
return record;
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 767eb60de4f8..419c73611cb9 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -29,6 +29,8 @@ import static android.app.ActivityManager.PROCESS_STATE_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_TOP;
import static android.util.DebugUtils.valueToString;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.server.am.ActivityManagerInternalTest.CustomThread;
import static com.android.server.am.ActivityManagerService.DISPATCH_UIDS_CHANGED_UI_MSG;
import static com.android.server.am.ActivityManagerService.Injector;
@@ -68,7 +70,10 @@ import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
import androidx.test.filters.SmallTest;
-import com.android.server.AppOpsService;
+import com.android.server.appop.AppOpsService;
+import com.android.server.am.ProcessList.IsolatedUidRange;
+import com.android.server.am.ProcessList.IsolatedUidRangeAllocator;
+import com.android.server.wm.ActivityTaskManagerService;
import org.junit.After;
import org.junit.Before;
@@ -109,7 +114,7 @@ public class ActivityManagerServiceTest {
UidRecord.CHANGE_ACTIVE
};
- @Mock private Context mContext;
+ private Context mContext = getInstrumentation().getTargetContext();
@Mock private AppOpsService mAppOpsService;
@Mock private PackageManager mPackageManager;
@@ -128,8 +133,8 @@ public class ActivityManagerServiceTest {
mInjector = new TestInjector();
mAms = new ActivityManagerService(mInjector);
mAms.mWaitForNetworkTimeoutMs = 2000;
-
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mAms.mActivityTaskManager = new ActivityTaskManagerService(mContext);
+ mAms.mActivityTaskManager.initialize(null, null, mHandler.getLooper());
}
@After
@@ -248,7 +253,7 @@ public class ActivityManagerServiceTest {
final UidRecord uidRec = new UidRecord(uid, null /* atmInternal */);
uidRec.waitingForNetwork = true;
uidRec.hasInternetPermission = true;
- mAms.mActiveUids.put(uid, uidRec);
+ mAms.mProcessList.mActiveUids.put(uid, uidRec);
final ProcessRecord appRec = new ProcessRecord(mAms, new ApplicationInfo(), TAG, uid);
appRec.thread = Mockito.mock(IApplicationThread.class);
@@ -291,6 +296,113 @@ public class ActivityManagerServiceTest {
}
}
+ private void validateAppZygoteIsolatedUidRange(IsolatedUidRange uidRange) {
+ assertNotNull(uidRange);
+ assertTrue(uidRange.mFirstUid >= Process.FIRST_APP_ZYGOTE_ISOLATED_UID
+ && uidRange.mFirstUid <= Process.LAST_APP_ZYGOTE_ISOLATED_UID);
+ assertTrue(uidRange.mLastUid >= Process.FIRST_APP_ZYGOTE_ISOLATED_UID
+ && uidRange.mLastUid <= Process.LAST_APP_ZYGOTE_ISOLATED_UID);
+ assertTrue(uidRange.mLastUid > uidRange.mFirstUid
+ && ((uidRange.mLastUid - uidRange.mFirstUid + 1)
+ == Process.NUM_UIDS_PER_APP_ZYGOTE));
+ }
+
+ private void verifyUidRangesNoOverlap(IsolatedUidRange uidRange1, IsolatedUidRange uidRange2) {
+ IsolatedUidRange lowRange = uidRange1.mFirstUid <= uidRange2.mFirstUid ? uidRange1 : uidRange2;
+ IsolatedUidRange highRange = lowRange == uidRange1 ? uidRange2 : uidRange1;
+
+ assertTrue(highRange.mFirstUid > lowRange.mLastUid);
+ }
+
+ @Test
+ public void testIsolatedUidRangeAllocator() {
+ final IsolatedUidRangeAllocator allocator = mAms.mProcessList.mAppIsolatedUidRangeAllocator;
+
+ // Create initial range
+ ApplicationInfo appInfo = new ApplicationInfo();
+ appInfo.processName = "com.android.test.app";
+ appInfo.uid = 10000;
+ final IsolatedUidRange range = allocator.getOrCreateIsolatedUidRangeLocked(appInfo);
+ validateAppZygoteIsolatedUidRange(range);
+ verifyIsolatedUidAllocator(range);
+
+ // Create a second range
+ ApplicationInfo appInfo2 = new ApplicationInfo();
+ appInfo2.processName = "com.android.test.app2";
+ appInfo2.uid = 10001;
+ IsolatedUidRange range2 = allocator.getOrCreateIsolatedUidRangeLocked(appInfo2);
+ validateAppZygoteIsolatedUidRange(range2);
+ verifyIsolatedUidAllocator(range2);
+
+ // Verify ranges don't overlap
+ verifyUidRangesNoOverlap(range, range2);
+
+ // Free range, reallocate and verify
+ allocator.freeUidRangeLocked(appInfo2);
+ range2 = allocator.getOrCreateIsolatedUidRangeLocked(appInfo2);
+ validateAppZygoteIsolatedUidRange(range2);
+ verifyUidRangesNoOverlap(range, range2);
+ verifyIsolatedUidAllocator(range2);
+
+ // Free both, then try to allocate the maximum number of UID ranges
+ allocator.freeUidRangeLocked(appInfo);
+ allocator.freeUidRangeLocked(appInfo2);
+
+ int maxNumUidRanges = (Process.LAST_APP_ZYGOTE_ISOLATED_UID
+ - Process.FIRST_APP_ZYGOTE_ISOLATED_UID + 1) / Process.NUM_UIDS_PER_APP_ZYGOTE;
+ for (int i = 0; i < maxNumUidRanges; i++) {
+ appInfo = new ApplicationInfo();
+ appInfo.uid = 10000 + i;
+ appInfo.processName = "com.android.test.app" + Integer.toString(i);
+ IsolatedUidRange uidRange = allocator.getOrCreateIsolatedUidRangeLocked(appInfo);
+ validateAppZygoteIsolatedUidRange(uidRange);
+ verifyIsolatedUidAllocator(uidRange);
+ }
+
+ // Try to allocate another one and make sure it fails
+ appInfo = new ApplicationInfo();
+ appInfo.uid = 9000;
+ appInfo.processName = "com.android.test.app.failed";
+ IsolatedUidRange failedRange = allocator.getOrCreateIsolatedUidRangeLocked(appInfo);
+
+ assertNull(failedRange);
+ }
+
+ public void verifyIsolatedUid(ProcessList.IsolatedUidRange range, int uid) {
+ assertTrue(uid >= range.mFirstUid && uid <= range.mLastUid);
+ }
+
+ public void verifyIsolatedUidAllocator(ProcessList.IsolatedUidRange range) {
+ int uid = range.allocateIsolatedUidLocked(0);
+ verifyIsolatedUid(range, uid);
+
+ int uid2 = range.allocateIsolatedUidLocked(0);
+ verifyIsolatedUid(range, uid2);
+ assertTrue(uid2 != uid);
+
+ // Free both
+ range.freeIsolatedUidLocked(uid);
+ range.freeIsolatedUidLocked(uid2);
+
+ // Allocate the entire range
+ for (int i = 0; i < (range.mLastUid - range.mFirstUid + 1); ++i) {
+ uid = range.allocateIsolatedUidLocked(0);
+ verifyIsolatedUid(range, uid);
+ }
+
+ // Ensure the next one fails
+ uid = range.allocateIsolatedUidLocked(0);
+ assertEquals(uid, -1);
+ }
+
+ @Test
+ public void testGlobalIsolatedUidAllocator() {
+ final IsolatedUidRange globalUidRange = mAms.mProcessList.mGlobalIsolatedUids;
+ assertEquals(globalUidRange.mFirstUid, Process.FIRST_ISOLATED_UID);
+ assertEquals(globalUidRange.mLastUid, Process.LAST_ISOLATED_UID);
+ verifyIsolatedUidAllocator(globalUidRange);
+ }
+
@Test
public void testBlockStateForUid() {
final UidRecord uidRec = new UidRecord(TEST_UID, null /* atmInternal */);
@@ -603,7 +715,8 @@ public class ActivityManagerServiceTest {
// Verify that when uid state changes to CHANGE_GONE or CHANGE_GONE_IDLE, then it
// will be removed from validateUids.
- assertNotEquals("validateUids should not be empty", 0, mAms.mValidateUids.size());
+ assertNotEquals("validateUids should not be empty", 0,
+ mAms.mValidateUids.size());
for (int i = 0; i < pendingItemsForUids.size(); ++i) {
final UidRecord.ChangeItem item = pendingItemsForUids.get(i);
// Assign CHANGE_GONE_IDLE to some items and CHANGE_GONE to the others, using even/odd
@@ -741,7 +854,7 @@ public class ActivityManagerServiceTest {
record.curProcStateSeq = curProcStateSeq;
record.lastDispatchedProcStateSeq = lastDispatchedProcStateSeq;
record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
- mAms.mActiveUids.put(Process.myUid(), record);
+ mAms.mProcessList.mActiveUids.put(Process.myUid(), record);
CustomThread thread = new CustomThread(record.networkStateLock, new Runnable() {
@Override
@@ -764,7 +877,7 @@ public class ActivityManagerServiceTest {
thread.assertTerminated(errMsg);
}
- mAms.mActiveUids.clear();
+ mAms.mProcessList.mActiveUids.clear();
}
private static class TestHandler extends Handler {
diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
index 05cb48b7d64d..1dfce51725f1 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
@@ -25,7 +25,8 @@ import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
-import com.android.server.AppOpsService;
+import com.android.server.appop.AppOpsService;
+import com.android.server.wm.ActivityTaskManagerService;
import org.junit.Before;
import org.junit.Test;
@@ -62,13 +63,15 @@ public class AppErrorDialogTest {
return false;
}
});
+ mService.mActivityTaskManager = new ActivityTaskManagerService(mContext);
+ mService.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
}
@Test
@UiThreadTest
public void testCreateWorks() {
AppErrorDialog.Data data = new AppErrorDialog.Data();
- data.proc = new ProcessRecord(null, mContext.getApplicationInfo(), "name", 12345);
+ data.proc = new ProcessRecord(mService, mContext.getApplicationInfo(), "name", 12345);
data.result = new AppErrorResult();
AppErrorDialog dialog = new AppErrorDialog(mContext, mService, data);
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index 9626990efdcd..cbdc6c3faadd 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -34,7 +34,7 @@ import android.test.mock.MockContentResolver;
import androidx.test.filters.SmallTest;
import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.server.AppOpsService;
+import com.android.server.appop.AppOpsService;
import org.junit.AfterClass;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
index 7e0dfcfd73f0..65c5781a9114 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.appops;
+package com.android.server.appop;
import static com.google.common.truth.Truth.assertThat;
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
index edd89f9e61d1..edd89f9e61d1 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsNotedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java
index 4ae9bea7617c..36f84d053817 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.server;
+package com.android.server.appop;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_ERRORED;
@@ -36,6 +36,7 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.server.appop.AppOpsService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java
index aac96a1dd847..eb0c6279ea99 100644
--- a/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server;
+package com.android.server.appop;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index db83505900c5..6a9a12133e70 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -1149,31 +1149,31 @@ public class TrampolineTest {
@Test
public void beginFullBackup_calledBeforeInitialize_ignored() throws RemoteException {
- mTrampoline.beginFullBackup(new FullBackupJob());
+ mTrampoline.beginFullBackup(mUserId, new FullBackupJob());
verifyNoMoreInteractions(mBackupManagerServiceMock);
}
@Test
public void beginFullBackup_forwarded() throws RemoteException {
FullBackupJob fullBackupJob = new FullBackupJob();
- when(mBackupManagerServiceMock.beginFullBackup(fullBackupJob)).thenReturn(true);
+ when(mBackupManagerServiceMock.beginFullBackup(mUserId, fullBackupJob)).thenReturn(true);
mTrampoline.initializeService();
- assertTrue(mTrampoline.beginFullBackup(fullBackupJob));
- verify(mBackupManagerServiceMock).beginFullBackup(fullBackupJob);
+ assertTrue(mTrampoline.beginFullBackup(mUserId, fullBackupJob));
+ verify(mBackupManagerServiceMock).beginFullBackup(mUserId, fullBackupJob);
}
@Test
public void endFullBackup_calledBeforeInitialize_ignored() throws RemoteException {
- mTrampoline.endFullBackup();
+ mTrampoline.endFullBackup(mUserId);
verifyNoMoreInteractions(mBackupManagerServiceMock);
}
@Test
public void endFullBackup_forwarded() throws RemoteException {
mTrampoline.initializeService();
- mTrampoline.endFullBackup();
- verify(mBackupManagerServiceMock).endFullBackup();
+ mTrampoline.endFullBackup(mUserId);
+ verify(mBackupManagerServiceMock).endFullBackup(mUserId);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
index 34edd9fb020b..757a046e9133 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
@@ -32,7 +32,6 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
-import android.os.RemoteException;
import android.test.AndroidTestCase;
import android.test.mock.MockPackageManager;
import android.view.inputmethod.InputMethodInfo;
@@ -40,7 +39,6 @@ import android.view.inputmethod.InputMethodInfo;
import androidx.test.InstrumentationRegistry;
import com.android.internal.R;
-import com.android.internal.view.IInputMethodManager;
import org.junit.Before;
import org.junit.Test;
@@ -61,8 +59,8 @@ public class OverlayPackagesProviderTest extends AndroidTestCase {
private @Mock
Resources mResources;
- private @Mock
- IInputMethodManager mIInputMethodManager;
+ @Mock
+ private OverlayPackagesProvider.Injector mInjector;
private @Mock
Context mTestContext;
private Resources mRealResources;
@@ -81,6 +79,7 @@ public class OverlayPackagesProviderTest extends AndroidTestCase {
InstrumentationRegistry.getTargetContext().getCacheDir());
setSystemInputMethods();
+ setIsPerProfileModeEnabled(false);
setRequiredAppsManagedDevice();
setVendorRequiredAppsManagedDevice();
setDisallowedAppsManagedDevice();
@@ -95,7 +94,7 @@ public class OverlayPackagesProviderTest extends AndroidTestCase {
setVendorDisallowedAppsManagedUser();
mRealResources = InstrumentationRegistry.getTargetContext().getResources();
- mHelper = new OverlayPackagesProvider(mTestContext, mIInputMethodManager);
+ mHelper = new OverlayPackagesProvider(mTestContext, mInjector);
}
@Test
@@ -165,6 +164,15 @@ public class OverlayPackagesProviderTest extends AndroidTestCase {
}
@Test
+ public void testProfileOwnerImesAreRequiredForPerProfileImeMode() {
+ setSystemAppsWithLauncher("app.a", "app.b");
+ setSystemInputMethods("app.a");
+ setIsPerProfileModeEnabled(true);
+
+ verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "app.b");
+ }
+
+ @Test
public void testManagedUserImesAreRequired() {
setSystemAppsWithLauncher("app.a", "app.b");
setSystemInputMethods("app.a");
@@ -333,11 +341,11 @@ public class OverlayPackagesProviderTest extends AndroidTestCase {
InputMethodInfo inputMethodInfo = new InputMethodInfo(ri, false, null, null, 0, false);
inputMethods.add(inputMethodInfo);
}
- try {
- when(mIInputMethodManager.getInputMethodList()).thenReturn(inputMethods);
- } catch (RemoteException e) {
- fail(e.toString());
- }
+ when(mInjector.getInputMethodListAsUser(eq(TEST_USER_ID))).thenReturn(inputMethods);
+ }
+
+ private void setIsPerProfileModeEnabled(boolean enabled) {
+ when(mInjector.isPerProfileImeEnabled()).thenReturn(enabled);
}
private void setSystemAppsWithLauncher(String... apps) {
diff --git a/services/tests/servicestests/src/com/android/server/display/AppSaturationControllerTest.java b/services/tests/servicestests/src/com/android/server/display/AppSaturationControllerTest.java
new file mode 100644
index 000000000000..e51884429718
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/display/AppSaturationControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2019 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.display;
+
+import static com.android.server.display.AppSaturationController.TRANSLATION_VECTOR;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.ActivityManager;
+import android.os.UserHandle;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.display.ColorDisplayService.ColorTransformController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.lang.ref.WeakReference;
+
+@RunWith(AndroidJUnit4.class)
+public class AppSaturationControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.android.test";
+
+ private int mUserId;
+ private AppSaturationController mAppSaturationController;
+ private float[] mMatrix;
+
+ @Mock
+ private ColorTransformController mColorTransformController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mUserId = ActivityManager.getCurrentUser();
+ mAppSaturationController = new AppSaturationController();
+ mMatrix = new float[9];
+ }
+
+ @After
+ public void tearDown() {
+ mAppSaturationController = null;
+ mUserId = UserHandle.USER_NULL;
+ }
+
+ @Test
+ public void addColorTransformController_appliesExistingSaturation() {
+ final WeakReference<ColorTransformController> ref = new WeakReference<>(
+ mColorTransformController);
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 30);
+ mAppSaturationController.addColorTransformController(TEST_PACKAGE_NAME, mUserId, ref);
+ AppSaturationController.computeGrayscaleTransformMatrix(.3f, mMatrix);
+ verify(mColorTransformController).applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ }
+
+ @Test
+ public void setSaturationLevel_resetToDefault() {
+ final WeakReference<ColorTransformController> ref = new WeakReference<>(
+ mColorTransformController);
+ mAppSaturationController.addColorTransformController(TEST_PACKAGE_NAME, mUserId, ref);
+ verify(mColorTransformController, never())
+ .applyAppSaturation(any(), eq(TRANSLATION_VECTOR));
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 30);
+ AppSaturationController.computeGrayscaleTransformMatrix(.3f, mMatrix);
+ verify(mColorTransformController, times(1))
+ .applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 100);
+ AppSaturationController.computeGrayscaleTransformMatrix(1.0f, mMatrix);
+ verify(mColorTransformController, times(2))
+ .applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ }
+
+ @Test
+ public void setSaturationLevel_updateLevel() {
+ final WeakReference<ColorTransformController> ref = new WeakReference<>(
+ mColorTransformController);
+ mAppSaturationController.addColorTransformController(TEST_PACKAGE_NAME, mUserId, ref);
+ verify(mColorTransformController, never())
+ .applyAppSaturation(any(), eq(TRANSLATION_VECTOR));
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 30);
+ AppSaturationController.computeGrayscaleTransformMatrix(.3f, mMatrix);
+ verify(mColorTransformController).applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 70);
+ AppSaturationController.computeGrayscaleTransformMatrix(.7f, mMatrix);
+ verify(mColorTransformController, times(2))
+ .applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ mAppSaturationController.setSaturationLevel(TEST_PACKAGE_NAME, mUserId, 100);
+ AppSaturationController.computeGrayscaleTransformMatrix(1.0f, mMatrix);
+ verify(mColorTransformController, times(3))
+ .applyAppSaturation(eq(mMatrix), eq(TRANSLATION_VECTOR));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
index abf90402250c..4742a73b17a8 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -389,7 +389,7 @@ public class DisplayManagerServiceTest {
if (attr == null) return; //sampling not supported on device, skip remainder of test.
boolean enabled = displayManager.setDisplayedContentSamplingEnabledInternal(0, true, 0, 0);
- assertTrue(!enabled);
+ assertTrue(enabled);
displayManager.setDisplayedContentSamplingEnabledInternal(0, false, 0, 0);
DisplayedContentSample sample = displayManager.getDisplayedContentSampleInternal(0, 0, 0);
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java
new file mode 100644
index 000000000000..eb9b98ec65f7
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2018 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.hdmi;
+
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.annotation.Nullable;
+import android.app.Instrumentation;
+import android.hardware.hdmi.HdmiDeviceInfo;
+import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.os.Looper;
+import android.os.test.TestLooper;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+
+/** Tests for {@link ArcInitiationActionFromAvrTest} */
+@SmallTest
+@RunWith(JUnit4.class)
+public class ArcInitiationActionFromAvrTest {
+
+ private HdmiDeviceInfo mDeviceInfoForTests;
+ private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
+ private HdmiCecController mHdmiCecController;
+ private HdmiControlService mHdmiControlService;
+ private FakeNativeWrapper mNativeWrapper;
+ private ArcInitiationActionFromAvr mAction;
+
+ private TestLooper mTestLooper = new TestLooper();
+ private boolean mSendCecCommandSuccess;
+ private boolean mShouldDispatchARCInitiated;
+ private boolean mArcInitSent;
+ private boolean mRequestActiveSourceSent;
+ private Instrumentation mInstrumentation;
+ private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
+
+ @Before
+ public void setUp() {
+ mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1);
+
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+
+ mHdmiControlService =
+ new HdmiControlService(mInstrumentation.getTargetContext()) {
+ @Override
+ void sendCecCommand(
+ HdmiCecMessage command, @Nullable SendMessageCallback callback) {
+ switch (command.getOpcode()) {
+ case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE:
+ if (callback != null) {
+ callback.onSendCompleted(
+ mSendCecCommandSuccess
+ ? SendMessageResult.SUCCESS
+ : SendMessageResult.NACK);
+ }
+ mRequestActiveSourceSent = true;
+ break;
+ case Constants.MESSAGE_INITIATE_ARC:
+ if (callback != null) {
+ callback.onSendCompleted(
+ mSendCecCommandSuccess
+ ? SendMessageResult.SUCCESS
+ : SendMessageResult.NACK);
+ }
+ mArcInitSent = true;
+ if (mShouldDispatchARCInitiated) {
+ mHdmiCecLocalDeviceAudioSystem.dispatchMessage(
+ HdmiCecMessageBuilder.buildReportArcInitiated(
+ Constants.ADDR_TV,
+ Constants.ADDR_AUDIO_SYSTEM));
+ }
+ break;
+ default:
+ }
+ }
+
+ @Override
+ boolean isPowerStandby() {
+ return false;
+ }
+
+ @Override
+ boolean isAddressAllocated() {
+ return true;
+ }
+
+ @Override
+ Looper getServiceLooper() {
+ return mTestLooper.getLooper();
+ }
+ };
+
+ mHdmiCecLocalDeviceAudioSystem =
+ new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) {
+ @Override
+ HdmiDeviceInfo getDeviceInfo() {
+ return mDeviceInfoForTests;
+ }
+
+ @Override
+ void setArcStatus(boolean enabled) {
+ // do nothing
+ }
+
+ @Override
+ protected boolean isSystemAudioActivated() {
+ return true;
+ }
+ };
+
+ mHdmiCecLocalDeviceAudioSystem.init();
+ Looper looper = mTestLooper.getLooper();
+ mHdmiControlService.setIoLooper(looper);
+ mNativeWrapper = new FakeNativeWrapper();
+ mHdmiCecController =
+ HdmiCecController.createWithNativeWrapper(this.mHdmiControlService, mNativeWrapper);
+ mHdmiControlService.setCecController(mHdmiCecController);
+ mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+ mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
+ mHdmiControlService.initPortInfo();
+ mAction = new ArcInitiationActionFromAvr(mHdmiCecLocalDeviceAudioSystem);
+
+ mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
+ mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+ mTestLooper.dispatchAll();
+ }
+
+ @Ignore("b/120845532")
+ @Test
+ public void arcInitiation_requestActiveSource() {
+ mSendCecCommandSuccess = true;
+ mShouldDispatchARCInitiated = true;
+ mRequestActiveSourceSent = false;
+ mArcInitSent = false;
+
+ mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction);
+ mTestLooper.dispatchAll();
+
+ assertThat(mArcInitSent).isTrue();
+ assertThat(mRequestActiveSourceSent).isTrue();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java
index 7484edd286f0..8607ec66a5ba 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java
@@ -18,8 +18,12 @@ package com.android.server.hdmi;
import android.hardware.hdmi.HdmiPortInfo;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.MessageQueue;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.hdmi.HdmiCecController.NativeWrapper;
+
+import com.google.common.collect.Iterables;
+
import java.util.ArrayList;
import java.util.List;
@@ -45,8 +49,8 @@ final class FakeNativeWrapper implements NativeWrapper {
};
private final List<HdmiCecMessage> mResultMessages = new ArrayList<>();
- private HdmiCecMessage mResultMessage;
private int mMyPhysicalAddress = 0;
+ private HdmiPortInfo[] mHdmiPortInfo = null;
@Override
public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
@@ -89,9 +93,11 @@ final class FakeNativeWrapper implements NativeWrapper {
@Override
public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
- HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1];
- hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000, true, true, true);
- return hdmiPortInfo;
+ if (mHdmiPortInfo == null) {
+ mHdmiPortInfo = new HdmiPortInfo[1];
+ mHdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000, true, true, true);
+ }
+ return mHdmiPortInfo;
}
@Override
@@ -112,11 +118,12 @@ final class FakeNativeWrapper implements NativeWrapper {
return new ArrayList<>(mResultMessages);
}
- public HdmiCecMessage getOnlyResultMessage() throws Exception {
- if (mResultMessages.size() != 1) {
- throw new Exception("There is not exactly one message");
- }
- return mResultMessages.get(0);
+ public HdmiCecMessage getOnlyResultMessage() throws IllegalArgumentException {
+ return Iterables.getOnlyElement(mResultMessages);
+ }
+
+ public void clearResultMessages() {
+ mResultMessages.clear();
}
public void setPollAddressResponse(int logicalAddress, int response) {
@@ -127,4 +134,10 @@ final class FakeNativeWrapper implements NativeWrapper {
protected void setPhysicalAddress(int physicalAddress) {
mMyPhysicalAddress = physicalAddress;
}
+
+ @VisibleForTesting
+ protected void setPortInfo(HdmiPortInfo[] hdmiPortInfo) {
+ mHdmiPortInfo = new HdmiPortInfo[hdmiPortInfo.length];
+ System.arraycopy(hdmiPortInfo, 0, mHdmiPortInfo, 0, hdmiPortInfo.length);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
index da840be9bca7..5d8131f35eb7 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -18,6 +18,7 @@ package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
@@ -25,15 +26,19 @@ import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_3;
import static com.android.server.hdmi.Constants.ADDR_SPECIFIC_USE;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
+
import static junit.framework.Assert.assertEquals;
import android.content.Context;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Looper;
import android.os.test.TestLooper;
+
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+
import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 9e3a0eaa68f6..3a6cdc2ad7c9 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -15,23 +15,29 @@
*/
package com.android.server.hdmi;
+import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE;
+import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE;
+
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
+import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
+import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
+import static com.android.server.hdmi.Constants.ADDR_TUNER_1;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
-import static com.google.common.truth.Truth.assertThat;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+import android.hardware.hdmi.HdmiDeviceInfo;
+import android.hardware.hdmi.HdmiPortInfo;
import android.media.AudioManager;
import android.os.Looper;
-import android.os.SystemProperties;
import android.os.test.TestLooper;
+
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+
import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
import org.junit.Before;
@@ -41,7 +47,6 @@ import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.ArrayList;
-
@SmallTest
@RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDeviceAudioSystem} class. */
@@ -54,6 +59,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController;
private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
+ private HdmiCecLocalDevicePlayback mHdmiCecLocalDevicePlayback;
private FakeNativeWrapper mNativeWrapper;
private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper();
@@ -61,90 +67,156 @@ public class HdmiCecLocalDeviceAudioSystemTest {
private int mMusicVolume;
private int mMusicMaxVolume;
private boolean mMusicMute;
+ private static final int SELF_PHYSICAL_ADDRESS = 0x2000;
+ private static final int HDMI_1_PHYSICAL_ADDRESS = 0x2100;
+ private static final int HDMI_2_PHYSICAL_ADDRESS = 0x2200;
+ private static final int HDMI_3_PHYSICAL_ADDRESS = 0x2300;
+ private int mInvokeDeviceEventState;
+ private HdmiDeviceInfo mDeviceInfo;
+ private boolean mMutingEnabled;
+ private boolean mArcSupport;
+ private HdmiPortInfo[] mHdmiPortInfo;
@Before
public void setUp() {
mHdmiControlService =
- new HdmiControlService(InstrumentationRegistry.getTargetContext()) {
- @Override
- AudioManager getAudioManager() {
- return new AudioManager() {
- @Override
- public int getStreamVolume(int streamType) {
- switch (streamType) {
- case STREAM_MUSIC:
- return mMusicVolume;
- default:
- return 0;
- }
+ new HdmiControlService(InstrumentationRegistry.getTargetContext()) {
+ @Override
+ AudioManager getAudioManager() {
+ return new AudioManager() {
+ @Override
+ public int getStreamVolume(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicVolume;
+ default:
+ return 0;
}
-
- @Override
- public boolean isStreamMute(int streamType) {
- switch (streamType) {
- case STREAM_MUSIC:
- return mMusicMute;
- default:
- return false;
- }
+ }
+
+ @Override
+ public boolean isStreamMute(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicMute;
+ default:
+ return false;
}
-
- @Override
- public int getStreamMaxVolume(int streamType) {
- switch (streamType) {
- case STREAM_MUSIC:
- return mMusicMaxVolume;
- default:
- return 100;
- }
+ }
+
+ @Override
+ public int getStreamMaxVolume(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicMaxVolume;
+ default:
+ return 100;
}
-
- @Override
- public void adjustStreamVolume(
- int streamType, int direction, int flags) {
- switch (streamType) {
- case STREAM_MUSIC:
- if (direction == AudioManager.ADJUST_UNMUTE) {
- mMusicMute = false;
- } else if (direction == AudioManager.ADJUST_MUTE) {
- mMusicMute = true;
- }
- default:
- }
+ }
+
+ @Override
+ public void adjustStreamVolume(
+ int streamType, int direction, int flags) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ if (direction == AudioManager.ADJUST_UNMUTE) {
+ mMusicMute = false;
+ } else if (direction == AudioManager.ADJUST_MUTE) {
+ mMusicMute = true;
+ }
+ break;
+ default:
}
+ }
- @Override
- public void setWiredDeviceConnectionState(
+ @Override
+ public void setWiredDeviceConnectionState(
int type, int state, String address, String name) {
- // Do nothing.
- }
- };
+ // Do nothing.
+ }
+ };
+ }
+
+ @Override
+ void wakeUp() {}
+
+ @Override
+ void invokeDeviceEventListeners(HdmiDeviceInfo device, int status) {
+ mDeviceInfo = device;
+ mInvokeDeviceEventState = status;
+ }
+
+ @Override
+ void writeStringSetting(String key, String value) {
+ // do nothing
+ }
+
+ @Override
+ boolean readBooleanSetting(String key, boolean defVal) {
+ switch (key) {
+ case Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE:
+ return mMutingEnabled;
+ case Constants.PROPERTY_ARC_SUPPORT:
+ return mArcSupport;
+ default:
+ return defVal;
}
-
- @Override
- void wakeUp() {}
- };
+ }
+ };
mMyLooper = mTestLooper.getLooper();
mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
+ mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService) {
+ @Override
+ void setIsActiveSource(boolean on) {
+ mIsActiveSource = on;
+ }
+
+ @Override
+ protected int getPreferredAddress() {
+ return ADDR_PLAYBACK_1;
+ }
+ };
mHdmiCecLocalDeviceAudioSystem.init();
+ mHdmiCecLocalDevicePlayback.init();
mHdmiControlService.setIoLooper(mMyLooper);
mNativeWrapper = new FakeNativeWrapper();
+ mNativeWrapper.setPhysicalAddress(SELF_PHYSICAL_ADDRESS);
mHdmiCecController =
- HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper);
+ HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper);
mHdmiControlService.setCecController(mHdmiCecController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
+ mLocalDevices.add(mHdmiCecLocalDevicePlayback);
+ mHdmiCecLocalDeviceAudioSystem.setRoutingControlFeatureEnables(true);
+ mHdmiPortInfo = new HdmiPortInfo[4];
+ mHdmiPortInfo[0] =
+ new HdmiPortInfo(
+ 0, HdmiPortInfo.PORT_INPUT, SELF_PHYSICAL_ADDRESS, true, false, false);
+ mHdmiPortInfo[1] =
+ new HdmiPortInfo(
+ 2, HdmiPortInfo.PORT_INPUT, HDMI_1_PHYSICAL_ADDRESS, true, false, false);
+ mHdmiPortInfo[2] =
+ new HdmiPortInfo(
+ 1, HdmiPortInfo.PORT_INPUT, HDMI_2_PHYSICAL_ADDRESS, true, false, false);
+ mHdmiPortInfo[3] =
+ new HdmiPortInfo(
+ 4, HdmiPortInfo.PORT_INPUT, HDMI_3_PHYSICAL_ADDRESS, true, false, false);
+ mNativeWrapper.setPortInfo(mHdmiPortInfo);
mHdmiControlService.initPortInfo();
// No TV device interacts with AVR so system audio control won't be turned on here
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
- SystemProperties.set(Constants.PROPERTY_ARC_SUPPORT, "true");
+ mNativeWrapper.clearResultMessages();
+ mMutingEnabled = true;
+ mArcSupport = true;
+ mInvokeDeviceEventState = 0;
+ mDeviceInfo = null;
}
@Test
- public void handleGiveAudioStatus_volume_10_mute_true() {
+ public void handleGiveAudioStatus_volume_10_mute_true() throws Exception {
mMusicVolume = 10;
mMusicMute = true;
mMusicMaxVolume = 20;
@@ -154,25 +226,24 @@ public class HdmiCecLocalDeviceAudioSystemTest {
ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);
HdmiCecMessage messageGive =
HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive))
- .isTrue();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)).isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
@Test
- public void handleGiveSystemAudioModeStatus_originalOff() {
+ public void handleGiveSystemAudioModeStatus_originalOff() throws Exception {
HdmiCecMessage expectedMessage =
- HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
+ HdmiCecMessageBuilder.buildReportSystemAudioMode(
+ ADDR_AUDIO_SYSTEM, ADDR_TV, false);
HdmiCecMessage messageGive =
HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
- .isTrue();
+ .isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
- @Ignore("b/80297700")
@Test
public void handleRequestShortAudioDescriptor_featureDisabled() throws Exception {
HdmiCecMessage expectedMessage =
@@ -184,9 +255,9 @@ public class HdmiCecLocalDeviceAudioSystemTest {
mHdmiCecLocalDeviceAudioSystem.setSystemAudioControlFeatureEnabled(false);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
- MESSAGE_REQUEST_SAD_LCPM))
- .isTrue();
+ mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
+ MESSAGE_REQUEST_SAD_LCPM))
+ .isTrue();
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
@@ -200,15 +271,17 @@ public class HdmiCecLocalDeviceAudioSystemTest {
Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
Constants.ABORT_NOT_IN_CORRECT_MODE);
- mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(false);
+ mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
- MESSAGE_REQUEST_SAD_LCPM))
- .isEqualTo(true);
+ mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
+ MESSAGE_REQUEST_SAD_LCPM))
+ .isEqualTo(true);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
+ // Testing device has sadConfig.xml
+ @Ignore("b/120845532")
@Test
public void handleRequestShortAudioDescriptor_noAudioDeviceInfo() throws Exception {
HdmiCecMessage expectedMessage =
@@ -218,17 +291,17 @@ public class HdmiCecLocalDeviceAudioSystemTest {
Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
Constants.ABORT_UNABLE_TO_DETERMINE);
- mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true);
+ mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
- MESSAGE_REQUEST_SAD_LCPM))
- .isEqualTo(true);
+ mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
+ MESSAGE_REQUEST_SAD_LCPM))
+ .isEqualTo(true);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
@Test
- public void handleSetSystemAudioMode_setOn_orignalOff() {
+ public void handleSetSystemAudioMode_setOn_orignalOff() throws Exception {
mMusicMute = true;
HdmiCecMessage messageSet =
HdmiCecMessageBuilder.buildSetSystemAudioMode(ADDR_TV, ADDR_AUDIO_SYSTEM, true);
@@ -238,25 +311,24 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
- .isTrue();
+ .isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
// Check if correctly turned on
+ mNativeWrapper.clearResultMessages();
expectedMessage =
- HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet))
- .isTrue();
+ HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)).isTrue();
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
- .isTrue();
+ .isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
assertThat(mMusicMute).isFalse();
}
- @Ignore("b/80297700")
@Test
- public void handleSystemAudioModeRequest_turnOffByTv() {
+ public void handleSystemAudioModeRequest_turnOffByTv() throws Exception {
assertThat(mMusicMute).isFalse();
// Check if feature correctly turned off
HdmiCecMessage messageGive =
@@ -268,91 +340,91 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessageBuilder.buildSetSystemAudioMode(
ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff))
- .isTrue();
+ .isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
+
+ mNativeWrapper.clearResultMessages();
expectedMessage =
- HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
+ HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
- .isTrue();
+ .isTrue();
mTestLooper.dispatchAll();
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
assertThat(mMusicMute).isTrue();
}
- @Ignore("b/80297700")
@Test
- public void onStandbyAudioSystem_currentSystemAudioControlOn() {
+ public void onStandbyAudioSystem_currentSystemAudioControlOn() throws Exception {
// Set system audio control on first
- mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true);
+ mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
// Check if standby correctly turns off the feature
mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildSetSystemAudioMode(
ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
- assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
assertThat(mMusicMute).isTrue();
}
@Test
- public void systemAudioControlOnPowerOn_alwaysOn() {
+ public void systemAudioControlOnPowerOn_alwaysOn() throws Exception {
mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.getActions(
- SystemAudioInitiationActionFromAvr.class))
- .isNotEmpty();
+ mHdmiCecLocalDeviceAudioSystem.getActions(
+ SystemAudioInitiationActionFromAvr.class))
+ .isNotEmpty();
}
@Test
- public void systemAudioControlOnPowerOn_neverOn() {
+ public void systemAudioControlOnPowerOn_neverOn() throws Exception {
mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Constants.NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.getActions(
- SystemAudioInitiationActionFromAvr.class))
- .isEmpty();
+ mHdmiCecLocalDeviceAudioSystem.getActions(
+ SystemAudioInitiationActionFromAvr.class))
+ .isEmpty();
}
@Test
- public void systemAudioControlOnPowerOn_useLastState_off() {
+ public void systemAudioControlOnPowerOn_useLastState_off() throws Exception {
mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.getActions(
- SystemAudioInitiationActionFromAvr.class))
- .isEmpty();
+ mHdmiCecLocalDeviceAudioSystem.getActions(
+ SystemAudioInitiationActionFromAvr.class))
+ .isEmpty();
}
@Test
- public void systemAudioControlOnPowerOn_useLastState_on() {
+ public void systemAudioControlOnPowerOn_useLastState_on() throws Exception {
mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
assertThat(
- mHdmiCecLocalDeviceAudioSystem.getActions(
- SystemAudioInitiationActionFromAvr.class))
- .isNotEmpty();
+ mHdmiCecLocalDeviceAudioSystem.getActions(
+ SystemAudioInitiationActionFromAvr.class))
+ .isNotEmpty();
}
@Test
- public void handleActiveSource_updateActiveSource() {
+ public void handleActiveSource_updateActiveSource() throws Exception {
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000);
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message))
- .isTrue();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource))
- .isTrue();
+ .isTrue();
}
@Test
- public void terminateSystemAudioMode_systemAudioModeOff() {
- mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(false);
+ public void terminateSystemAudioMode_systemAudioModeOff() throws Exception {
+ mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
mMusicMute = false;
HdmiCecMessage message =
@@ -361,13 +433,12 @@ public class HdmiCecLocalDeviceAudioSystemTest {
mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode();
assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
assertThat(mMusicMute).isFalse();
- assertThat(mNativeWrapper.getResultMessages()).doesNotContain(message);
+ assertThat(mNativeWrapper.getResultMessages()).isEmpty();
}
- @Ignore("b/80297700")
@Test
- public void terminateSystemAudioMode_systemAudioModeOn() {
- mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true);
+ public void terminateSystemAudioMode_systemAudioModeOn() throws Exception {
+ mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
mMusicMute = false;
HdmiCecMessage expectedMessage =
@@ -381,124 +452,244 @@ public class HdmiCecLocalDeviceAudioSystemTest {
}
@Test
- public void isPhysicalAddressMeOrBelow_isMe() {
- int targetPhysicalAddress = 0x1000;
- mNativeWrapper.setPhysicalAddress(0x1000);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isTrue();
+ public void handleRequestArcInitiate_isNotDirectConnectedToTv() throws Exception {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildFeatureAbortCommand(
+ ADDR_AUDIO_SYSTEM,
+ ADDR_TV,
+ Constants.MESSAGE_REQUEST_ARC_INITIATION,
+ Constants.ABORT_NOT_IN_CORRECT_MODE);
+ mNativeWrapper.setPhysicalAddress(0x1100);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
- public void isPhysicalAddressMeOrBelow_isBelow() {
- int targetPhysicalAddress = 0x1100;
+ public void handleRequestArcInitiate_startArcInitiationActionFromAvr() throws Exception {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
mNativeWrapper.setPhysicalAddress(0x1000);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isTrue();
+ mHdmiCecLocalDeviceAudioSystem.removeAction(ArcInitiationActionFromAvr.class);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcInitiationActionFromAvr.class))
+ .isNotEmpty();
}
@Test
- public void isPhysicalAddressMeOrBelow_neitherMeNorBelow() {
- int targetPhysicalAddress = 0x3000;
- mNativeWrapper.setPhysicalAddress(0x2000);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isFalse();
-
- targetPhysicalAddress = 0x2200;
- mNativeWrapper.setPhysicalAddress(0x3300);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isFalse();
-
- targetPhysicalAddress = 0x2213;
- mNativeWrapper.setPhysicalAddress(0x2212);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isFalse();
-
- targetPhysicalAddress = 0x2340;
- mNativeWrapper.setPhysicalAddress(0x2310);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isPhysicalAddressMeOrBelow(targetPhysicalAddress))
- .isFalse();
+ public void handleRequestArcTerminate_arcIsOn_startTerminationActionFromAvr() throws Exception {
+ mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
+ assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue();
+
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
+ mHdmiCecLocalDeviceAudioSystem.removeAction(ArcTerminationActionFromAvr.class);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcTerminationActionFromAvr.class))
+ .isNotEmpty();
}
@Test
- public void handleRequestArcInitiate_isNotDirectConnectedToTv() {
- HdmiCecMessage message = HdmiCecMessageBuilder
- .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
- HdmiCecMessage expectedMessage = HdmiCecMessageBuilder
- .buildFeatureAbortCommand(
- ADDR_AUDIO_SYSTEM, ADDR_TV,
- Constants.MESSAGE_REQUEST_ARC_INITIATION,
- Constants.ABORT_NOT_IN_CORRECT_MODE);
- mNativeWrapper.setPhysicalAddress(0x1100);
+ public void handleRequestArcTerminate_arcIsNotOn() throws Exception {
+ assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse();
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildFeatureAbortCommand(
+ ADDR_AUDIO_SYSTEM,
+ ADDR_TV,
+ Constants.MESSAGE_REQUEST_ARC_TERMINATION,
+ Constants.ABORT_NOT_IN_CORRECT_MODE);
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
- .isTrue();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
- public void handleRequestArcInitiate_startArcInitiationActionFromAvr() {
- HdmiCecMessage message = HdmiCecMessageBuilder
- .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
- mNativeWrapper.setPhysicalAddress(0x1000);
- mHdmiCecLocalDeviceAudioSystem.removeAction(
- ArcInitiationActionFromAvr.class);
+ public void handleRequestArcInit_arcIsNotSupported() throws Exception {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildFeatureAbortCommand(
+ ADDR_AUDIO_SYSTEM,
+ ADDR_TV,
+ Constants.MESSAGE_REQUEST_ARC_INITIATION,
+ Constants.ABORT_UNRECOGNIZED_OPCODE);
+ mArcSupport = false;
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
- .isTrue();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
mTestLooper.dispatchAll();
- assertThat(mHdmiCecLocalDeviceAudioSystem
- .getActions(ArcInitiationActionFromAvr.class)).isNotEmpty();
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
+ }
+
+ public void handleSystemAudioModeRequest_fromNonTV_tVNotSupport() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildSystemAudioModeRequest(
+ ADDR_TUNER_1, ADDR_AUDIO_SYSTEM,
+ SELF_PHYSICAL_ADDRESS, true);
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildFeatureAbortCommand(
+ ADDR_AUDIO_SYSTEM,
+ ADDR_TUNER_1,
+ Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST,
+ Constants.ABORT_REFUSED);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
}
@Test
- public void handleRequestArcTerminate_arcIsOn_startTerminationActionFromAvr() {
+ public void handleSystemAudioModeRequest_fromNonTV_tVSupport() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildSystemAudioModeRequest(
+ ADDR_TUNER_1, ADDR_AUDIO_SYSTEM,
+ SELF_PHYSICAL_ADDRESS, true);
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildSetSystemAudioMode(
+ ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true);
+ mHdmiCecLocalDeviceAudioSystem.setTvSystemAudioModeSupport(true);
+
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
+ }
+
+ @Test
+ public void handleActiveSource_activeSourceFromTV_swithToArc() {
mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
- assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue();
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
- HdmiCecMessage message = HdmiCecMessageBuilder
- .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
- mHdmiCecLocalDeviceAudioSystem.removeAction(
- ArcTerminationActionFromAvr.class);
+ ActiveSource expectedActiveSource = ActiveSource.of(ADDR_TV, 0x0000);
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message))
- .isTrue();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
- assertThat(mHdmiCecLocalDeviceAudioSystem
- .getActions(ArcTerminationActionFromAvr.class)).isNotEmpty();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
+ .isEqualTo(expectedActiveSource);
}
@Test
- public void handleRequestArcTerminate_arcIsNotOn() {
- assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse();
- HdmiCecMessage message = HdmiCecMessageBuilder
- .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
- HdmiCecMessage expectedMessage = HdmiCecMessageBuilder
- .buildFeatureAbortCommand(
- ADDR_AUDIO_SYSTEM, ADDR_TV,
- Constants.MESSAGE_REQUEST_ARC_TERMINATION,
- Constants.ABORT_NOT_IN_CORRECT_MODE);
-
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message))
- .isTrue();
+ public void handleRoutingChange_currentActivePortIsHome() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x3000, SELF_PHYSICAL_ADDRESS);
+
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS);
+ ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS);
+ int expectedLocalActivePort = Constants.CEC_SWITCH_HOME;
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue();
mTestLooper.dispatchAll();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
+ .isEqualTo(expectedActiveSource);
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getRoutingPort())
+ .isEqualTo(expectedLocalActivePort);
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
- public void handleRequestArcInit_arcIsNotSupported() {
- HdmiCecMessage message = HdmiCecMessageBuilder
- .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
- HdmiCecMessage expectedMessage = HdmiCecMessageBuilder
- .buildFeatureAbortCommand(
- ADDR_AUDIO_SYSTEM, ADDR_TV,
- Constants.MESSAGE_REQUEST_ARC_INITIATION,
- Constants.ABORT_UNRECOGNIZED_OPCODE);
- SystemProperties.set(Constants.PROPERTY_ARC_SUPPORT, "false");
-
- assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
- .isTrue();
+ public void handleRoutingInformation_currentActivePortIsHDMI1() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, SELF_PHYSICAL_ADDRESS);
+ mHdmiCecLocalDeviceAudioSystem.setRoutingPort(mHdmiPortInfo[1].getId());
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildRoutingInformation(
+ ADDR_AUDIO_SYSTEM, HDMI_1_PHYSICAL_ADDRESS);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingInformation(message)).isTrue();
+ mTestLooper.dispatchAll();
+ assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
+ }
+
+ @Ignore("b/120845532")
+ @Test
+ public void handleRoutingChange_homeIsActive_playbackSendActiveSource() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x2000);
+
+ HdmiCecMessage expectedMessage =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, 0x2000);
+
+ assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
+
+ @Test
+ public void updateCecDevice_deviceNotExists_addDevice() {
+ assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_ADD_DEVICE);
+ HdmiDeviceInfo newDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
+
+ mHdmiCecLocalDeviceAudioSystem.updateCecDevice(newDevice);
+ assertThat(mDeviceInfo).isEqualTo(newDevice);
+ assertThat(mHdmiCecLocalDeviceAudioSystem
+ .getCecDeviceInfo(newDevice.getLogicalAddress())).isEqualTo(newDevice);
+ assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_ADD_DEVICE);
+ }
+
+ @Test
+ public void updateCecDevice_deviceExists_doNothing() {
+ mInvokeDeviceEventState = 0;
+ HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
+ mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
+
+ mHdmiCecLocalDeviceAudioSystem.updateCecDevice(oldDevice);
+ assertThat(mInvokeDeviceEventState).isEqualTo(0);
+ }
+
+ @Test
+ public void updateCecDevice_deviceInfoDifferent_updateDevice() {
+ assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_UPDATE_DEVICE);
+ HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
+ mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
+
+ HdmiDeviceInfo differentDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_1, 0x2300, 4, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
+
+ mHdmiCecLocalDeviceAudioSystem.updateCecDevice(differentDevice);
+ assertThat(mDeviceInfo).isEqualTo(differentDevice);
+ assertThat(mHdmiCecLocalDeviceAudioSystem
+ .getCecDeviceInfo(differentDevice.getLogicalAddress())).isEqualTo(differentDevice);
+ assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_UPDATE_DEVICE);
+ }
+
+ @Test
+ public void handleReportPhysicalAddress_differentPath_addDevice() {
+ assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_ADD_DEVICE);
+ HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
+ mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
+
+ HdmiDeviceInfo differentDevice = new HdmiDeviceInfo(
+ ADDR_PLAYBACK_2, 0x2200, 1, HdmiDeviceInfo.DEVICE_PLAYBACK,
+ Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_2));
+ HdmiCecMessage reportPhysicalAddress = HdmiCecMessageBuilder
+ .buildReportPhysicalAddressCommand(
+ ADDR_PLAYBACK_2, 0x2200, HdmiDeviceInfo.DEVICE_PLAYBACK);
+ mHdmiCecLocalDeviceAudioSystem.handleReportPhysicalAddress(reportPhysicalAddress);
+
+ mTestLooper.dispatchAll();
+ assertThat(mDeviceInfo).isEqualTo(differentDevice);
+ assertThat(mHdmiCecLocalDeviceAudioSystem
+ .getCecDeviceInfo(differentDevice.getLogicalAddress())).isEqualTo(differentDevice);
+ assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_ADD_DEVICE);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
new file mode 100644
index 000000000000..feae4eed7eb1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.hdmi;
+
+import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Looper;
+import android.os.test.TestLooper;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+
+@SmallTest
+@RunWith(JUnit4.class)
+/** Tests for {@link HdmiCecLocalDevicePlayback} class. */
+public class HdmiCecLocalDevicePlaybackTest {
+
+ private HdmiControlService mHdmiControlService;
+ private HdmiCecController mHdmiCecController;
+ private HdmiCecLocalDevicePlayback mHdmiCecLocalDevicePlayback;
+ private FakeNativeWrapper mNativeWrapper;
+ private Looper mMyLooper;
+ private TestLooper mTestLooper = new TestLooper();
+ private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
+ private int mPlaybackPhysicalAddress;
+
+ @Before
+ public void setUp() {
+ mHdmiControlService =
+ new HdmiControlService(InstrumentationRegistry.getTargetContext()) {
+ @Override
+ void wakeUp() {
+ }
+
+ @Override
+ boolean isControlEnabled() {
+ return true;
+ }
+ };
+
+ mMyLooper = mTestLooper.getLooper();
+ mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService);
+ mHdmiCecLocalDevicePlayback.init();
+ mHdmiControlService.setIoLooper(mMyLooper);
+ mNativeWrapper = new FakeNativeWrapper();
+ mHdmiCecController =
+ HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper);
+ mHdmiControlService.setCecController(mHdmiCecController);
+ mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+ mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
+ mLocalDevices.add(mHdmiCecLocalDevicePlayback);
+ mHdmiControlService.initPortInfo();
+ mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+ mTestLooper.dispatchAll();
+ mNativeWrapper.clearResultMessages();
+ mPlaybackPhysicalAddress = 0x2000;
+ mNativeWrapper.setPhysicalAddress(mPlaybackPhysicalAddress);
+ }
+
+ // Playback device does not handle routing control related feature right now
+ @Ignore("b/120845532")
+ @Test
+ public void handleSetStreamPath_underCurrentDevice() {
+ assertThat(mHdmiCecLocalDevicePlayback.getLocalActivePath()).isEqualTo(0);
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x2100);
+ assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
+ // TODO(amyjojo): Move set and get LocalActivePath to Control Service.
+ assertThat(mHdmiCecLocalDevicePlayback.getLocalActivePath()).isEqualTo(1);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
index c7809d3f2f29..ef974f2e01bb 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
@@ -18,6 +18,7 @@ package com.android.server.hdmi;
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_TV;
+
import static com.google.common.truth.Truth.assertThat;
import android.hardware.hdmi.HdmiDeviceInfo;
@@ -51,6 +52,14 @@ public class HdmiCecMessageBuilderTest {
assertThat(message).isEqualTo(buildMessage("05:A4:06:01"));
}
+ @Test
+ public void buildRoutingInformation() {
+ HdmiCecMessage message =
+ HdmiCecMessageBuilder.buildRoutingInformation(
+ ADDR_AUDIO_SYSTEM, 0x2100);
+ assertThat(message).isEqualTo(buildMessage("5F:81:21:00"));
+ }
+
/**
* Build a CEC message from a hex byte string with bytes separated by {@code :}.
*
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
index 18c9a653dc7d..1f660742122d 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
@@ -20,13 +20,18 @@ import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import android.hardware.hdmi.HdmiPortInfo;
import android.os.Looper;
import android.os.test.TestLooper;
+
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -102,6 +107,7 @@ public class HdmiControlServiceTest {
private TestLooper mTestLooper = new TestLooper();
private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
private boolean mStandbyMessageReceived;
+ private HdmiPortInfo[] mHdmiPortInfo;
@Before
public void SetUp() {
@@ -131,6 +137,16 @@ public class HdmiControlServiceTest {
mLocalDevices.add(mMyAudioSystemDevice);
mLocalDevices.add(mMyPlaybackDevice);
+ mHdmiPortInfo = new HdmiPortInfo[4];
+ mHdmiPortInfo[0] =
+ new HdmiPortInfo(1, HdmiPortInfo.PORT_INPUT, 0x2100, true, false, false);
+ mHdmiPortInfo[1] =
+ new HdmiPortInfo(2, HdmiPortInfo.PORT_INPUT, 0x2200, true, false, false);
+ mHdmiPortInfo[2] =
+ new HdmiPortInfo(3, HdmiPortInfo.PORT_INPUT, 0x2000, true, false, false);
+ mHdmiPortInfo[3] =
+ new HdmiPortInfo(4, HdmiPortInfo.PORT_INPUT, 0x3000, true, false, false);
+ mNativeWrapper.setPortInfo(mHdmiPortInfo);
mHdmiControlService.initPortInfo();
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
@@ -159,4 +175,27 @@ public class HdmiControlServiceTest {
assertTrue(mMyPlaybackDevice.isDisabled());
assertTrue(mMyAudioSystemDevice.isDisabled());
}
+
+ @Test
+ public void pathToPort_pathExists_weAreNonTv() {
+ mNativeWrapper.setPhysicalAddress(0x2000);
+ mHdmiControlService.initPortInfo();
+ assertThat(mHdmiControlService.pathToPortId(0x2120)).isEqualTo(1);
+ assertThat(mHdmiControlService.pathToPortId(0x2234)).isEqualTo(2);
+ }
+
+ @Test
+ public void pathToPort_pathExists_weAreTv() {
+ mNativeWrapper.setPhysicalAddress(0x0000);
+ mHdmiControlService.initPortInfo();
+ assertThat(mHdmiControlService.pathToPortId(0x2120)).isEqualTo(3);
+ assertThat(mHdmiControlService.pathToPortId(0x3234)).isEqualTo(4);
+ }
+
+ @Test
+ public void pathToPort_pathInvalid() {
+ mNativeWrapper.setPhysicalAddress(0x2000);
+ mHdmiControlService.initPortInfo();
+ assertThat(mHdmiControlService.pathToPortId(0x1000)).isEqualTo(Constants.INVALID_PORT_ID);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java
new file mode 100644
index 000000000000..985c6476d767
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 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.hdmi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.util.Slog;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.server.hdmi.HdmiUtils.CodecSad;
+import com.android.server.hdmi.HdmiUtils.DeviceConfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+@SmallTest
+@RunWith(JUnit4.class)
+/** Tests for {@link HdmiUtils} class. */
+public class HdmiUtilsTest {
+
+ private static final String TAG = "HdmiUtilsTest";
+
+ private final String mExampleXML =
+ "<!-- A sample Short Audio Descriptor configuration xml -->"
+ + "<config version=\"1.0\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">"
+ + "<device type=\"VX_AUDIO_DEVICE_IN_HDMI_ARC\">"
+ + "<supportedFormat format=\"AUDIO_FORMAT_LPCM\" descriptor=\"011a03\"/>"
+ + "<supportedFormat format=\"AUDIO_FORMAT_DD\" descriptor=\"0d0506\"/>"
+ + "</device>"
+ + "<device type=\"AUDIO_DEVICE_IN_SPDIF\">"
+ + "<supportedFormat format=\"AUDIO_FORMAT_LPCM\" descriptor=\"010203\"/>"
+ + "<supportedFormat format=\"AUDIO_FORMAT_DD\" descriptor=\"040506\"/>"
+ + "</device>"
+ + "</config>";
+
+ @Test
+ public void pathToPort_isMe() {
+ int targetPhysicalAddress = 0x1000;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_SAME_PHYSICAL_ADDRESS);
+ }
+
+ @Test
+ public void pathToPort_isDirectlyBelow() {
+ int targetPhysicalAddress = 0x1100;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1);
+ }
+
+ @Test
+ public void pathToPort_isBelow() {
+ int targetPhysicalAddress = 0x1110;
+ int myPhysicalAddress = 0x1000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1);
+ }
+
+ @Test
+ public void pathToPort_neitherMeNorBelow() {
+ int targetPhysicalAddress = 0x3000;
+ int myPhysicalAddress = 0x2000;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2200;
+ myPhysicalAddress = 0x3300;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2213;
+ myPhysicalAddress = 0x2212;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+
+ targetPhysicalAddress = 0x2340;
+ myPhysicalAddress = 0x2310;
+ assertThat(HdmiUtils.getLocalPortFromPhysicalAddress(
+ targetPhysicalAddress, myPhysicalAddress)).isEqualTo(
+ HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE);
+ }
+
+ @Test
+ public void parseSampleXML() {
+ List<DeviceConfig> config = new ArrayList<>();
+ try {
+ config = HdmiUtils.ShortAudioDescriptorXmlParser.parse(
+ new ByteArrayInputStream(mExampleXML.getBytes(StandardCharsets.UTF_8)));
+ } catch (IOException e) {
+ Slog.e(TAG, e.getMessage(), e);
+ } catch (XmlPullParserException e) {
+ Slog.e(TAG, e.getMessage(), e);
+ }
+
+ CodecSad expectedCodec1 = new CodecSad(Constants.AUDIO_CODEC_LPCM, "011a03");
+ CodecSad expectedCodec2 = new CodecSad(Constants.AUDIO_CODEC_DD, "0d0506");
+ CodecSad expectedCodec3 = new CodecSad(Constants.AUDIO_CODEC_LPCM, "010203");
+ CodecSad expectedCodec4 = new CodecSad(Constants.AUDIO_CODEC_DD, "040506");
+
+ List<CodecSad> expectedList1 = new ArrayList<>();
+ expectedList1.add(expectedCodec1);
+ expectedList1.add(expectedCodec2);
+
+ List<CodecSad> expectedList2 = new ArrayList<>();
+ expectedList2.add(expectedCodec3);
+ expectedList2.add(expectedCodec4);
+
+ DeviceConfig expectedDevice1 = new DeviceConfig(
+ "VX_AUDIO_DEVICE_IN_HDMI_ARC", expectedList1);
+ DeviceConfig expectedDevice2 = new DeviceConfig(
+ "AUDIO_DEVICE_IN_SPDIF", expectedList2);
+
+ List<DeviceConfig> expectedConfig = new ArrayList<>();
+ expectedConfig.add(expectedDevice1);
+ expectedConfig.add(expectedDevice2);
+
+ assertThat(config).isEqualTo(expectedConfig);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
index d914b9a090a2..440a49ab81fc 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
@@ -26,9 +26,12 @@ import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.AudioManager;
import android.os.Looper;
import android.os.test.TestLooper;
+
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -49,6 +52,9 @@ public class SystemAudioInitiationActionFromAvrTest {
private int mMsgRequestActiveSourceCount;
private int mMsgSetSystemAudioModeCount;
private int mQueryTvSystemAudioModeSupportCount;
+ private boolean mArcEnabled;
+ private boolean mIsPlaybackDevice;
+ private boolean mBroadcastActiveSource;
@Before
public void SetUp() {
@@ -80,6 +86,8 @@ public class SystemAudioInitiationActionFromAvrTest {
callback.onSendCompleted(SendMessageResult.NACK);
}
break;
+ case Constants.MESSAGE_INITIATE_ARC:
+ break;
default:
throw new IllegalArgumentException("Unexpected message");
}
@@ -132,6 +140,22 @@ public class SystemAudioInitiationActionFromAvrTest {
int getPhysicalAddress() {
return 0;
}
+
+ @Override
+ boolean isPlaybackDevice() {
+ return mIsPlaybackDevice;
+ }
+
+ @Override
+ public void setAndBroadcastActiveSourceFromOneDeviceType(
+ int sourceAddress, int physicalAddress) {
+ mBroadcastActiveSource = true;
+ }
+
+ @Override
+ int pathToPortId(int path) {
+ return -1;
+ }
};
mHdmiCecLocalDeviceAudioSystem =
new HdmiCecLocalDeviceAudioSystem(hdmiControlService) {
@@ -148,6 +172,11 @@ public class SystemAudioInitiationActionFromAvrTest {
HdmiDeviceInfo getDeviceInfo() {
return mDeviceInfoForTests;
}
+
+ @Override
+ void setArcStatus(boolean enabled) {
+ mArcEnabled = enabled;
+ }
};
mHdmiCecLocalDeviceAudioSystem.init();
Looper looper = mTestLooper.getLooper();
@@ -159,7 +188,7 @@ public class SystemAudioInitiationActionFromAvrTest {
resetTestVariables();
mShouldDispatchActiveSource = false;
- assertThat(mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress)
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress)
.isEqualTo(Constants.INVALID_PHYSICAL_ADDRESS);
mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
@@ -171,7 +200,7 @@ public class SystemAudioInitiationActionFromAvrTest {
assertThat(mQueryTvSystemAudioModeSupportCount).isEqualTo(0);
assertFalse(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated());
- assertThat(mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress)
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress)
.isEqualTo(Constants.INVALID_PHYSICAL_ADDRESS);
}
@@ -206,14 +235,15 @@ public class SystemAudioInitiationActionFromAvrTest {
assertThat(mQueryTvSystemAudioModeSupportCount).isEqualTo(1);
assertTrue(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated());
- assertThat(mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress).isEqualTo(1002);
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress)
+ .isEqualTo(1002);
}
@Test
public void testKnownActiveSource() {
resetTestVariables();
mTvSystemAudioModeSupport = true;
- mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress = 1001;
+ mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress = 1001;
mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
new SystemAudioInitiationActionFromAvr(mHdmiCecLocalDeviceAudioSystem));
@@ -233,7 +263,7 @@ public class SystemAudioInitiationActionFromAvrTest {
mTryCountBeforeSucceed = 3;
assertThat(mTryCountBeforeSucceed)
.isAtMost(SystemAudioInitiationActionFromAvr.MAX_RETRY_COUNT);
- assertThat(mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress)
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress)
.isEqualTo(Constants.INVALID_PHYSICAL_ADDRESS);
mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
@@ -246,12 +276,33 @@ public class SystemAudioInitiationActionFromAvrTest {
assertTrue(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated());
}
+ @Ignore("b/120845532")
+ @Test
+ public void testIsPlaybackDevice_cannotReceiveActiveSource() {
+ resetTestVariables();
+ mIsPlaybackDevice = true;
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress)
+ .isEqualTo(Constants.INVALID_PHYSICAL_ADDRESS);
+
+ mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
+ new SystemAudioInitiationActionFromAvr(mHdmiCecLocalDeviceAudioSystem));
+ mTestLooper.dispatchAll();
+
+ assertThat(mMsgRequestActiveSourceCount).isEqualTo(1);
+ assertThat(mBroadcastActiveSource).isTrue();
+ assertThat(mQueryTvSystemAudioModeSupportCount).isEqualTo(1);
+ assertThat(mMsgSetSystemAudioModeCount).isEqualTo(1);
+ assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
+ }
+
private void resetTestVariables() {
mMsgRequestActiveSourceCount = 0;
mMsgSetSystemAudioModeCount = 0;
mQueryTvSystemAudioModeSupportCount = 0;
mTryCountBeforeSucceed = 0;
- mHdmiCecLocalDeviceAudioSystem.mActiveSource.physicalAddress =
+ mIsPlaybackDevice = false;
+ mBroadcastActiveSource = false;
+ mHdmiCecLocalDeviceAudioSystem.getActiveSource().physicalAddress =
Constants.INVALID_PHYSICAL_ADDRESS;
}
}
diff --git a/services/tests/servicestests/src/com/android/server/job/JobCountTrackerTest.java b/services/tests/servicestests/src/com/android/server/job/JobCountTrackerTest.java
new file mode 100644
index 000000000000..e5529cb899cc
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/job/JobCountTrackerTest.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 2019 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.job;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.util.Log;
+
+import com.android.server.job.JobConcurrencyManager.JobCountTracker;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Random;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+/**
+ * Test for {@link com.android.server.job.JobConcurrencyManager.JobCountTracker}.
+ */
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class JobCountTrackerTest {
+ private static final String TAG = "JobCountTrackerTest";
+
+ private Random mRandom;
+ private JobCountTracker mJobCountTracker;
+
+ @Before
+ public void setUp() {
+ mRandom = new Random(1); // Always use the same series of pseudo random values.
+ mJobCountTracker = new JobCountTracker();
+ }
+
+ /**
+ * Represents running and pending jobs.
+ */
+ class Jobs {
+ public int runningFg;
+ public int runningBg;
+ public int pendingFg;
+ public int pendingBg;
+
+ public void maybeEnqueueJobs(double startRatio, double fgJobRatio) {
+ while (mRandom.nextDouble() < startRatio) {
+ if (mRandom.nextDouble() < fgJobRatio) {
+ pendingFg++;
+ } else {
+ pendingBg++;
+ }
+ }
+ }
+
+ public void maybeFinishJobs(double stopRatio) {
+ for (int i = runningBg; i > 0; i--) {
+ if (mRandom.nextDouble() < stopRatio) {
+ runningBg--;
+ }
+ }
+ for (int i = runningFg; i > 0; i--) {
+ if (mRandom.nextDouble() < stopRatio) {
+ runningFg--;
+ }
+ }
+ }
+ }
+
+
+ private void startPendingJobs(Jobs jobs, int totalMax, int maxBg, int minBg) {
+ mJobCountTracker.reset(totalMax, maxBg, minBg);
+
+ for (int i = 0; i < jobs.runningFg; i++) {
+ mJobCountTracker.incrementRunningJobCount(true);
+ }
+ for (int i = 0; i < jobs.runningBg; i++) {
+ mJobCountTracker.incrementRunningJobCount(false);
+ }
+
+ for (int i = 0; i < jobs.pendingFg; i++) {
+ mJobCountTracker.incrementPendingJobCount(true);
+ }
+ for (int i = 0; i < jobs.pendingBg; i++) {
+ mJobCountTracker.incrementPendingJobCount(false);
+ }
+
+ mJobCountTracker.onCountDone();
+
+ while ((jobs.pendingFg > 0 && mJobCountTracker.canJobStart(true))
+ || (jobs.pendingBg > 0 && mJobCountTracker.canJobStart(false))) {
+ final boolean isStartingFg = mRandom.nextBoolean();
+
+ if (isStartingFg) {
+ if (jobs.pendingFg > 0 && mJobCountTracker.canJobStart(true)) {
+ jobs.pendingFg--;
+ jobs.runningFg++;
+ mJobCountTracker.onStartingNewJob(true);
+ }
+ } else {
+ if (jobs.pendingBg > 0 && mJobCountTracker.canJobStart(false)) {
+ jobs.pendingBg--;
+ jobs.runningBg++;
+ mJobCountTracker.onStartingNewJob(false);
+ }
+ }
+ }
+
+ Log.i(TAG, "" + mJobCountTracker);
+ }
+
+ /**
+ * Used by the following testRandom* tests.
+ */
+ private void checkRandom(Jobs jobs, int numTests, int totalMax, int maxBg, int minBg,
+ double startRatio, double fgJobRatio, double stopRatio) {
+ for (int i = 0; i < numTests; i++) {
+
+ jobs.maybeFinishJobs(stopRatio);
+ jobs.maybeEnqueueJobs(startRatio, fgJobRatio);
+
+ startPendingJobs(jobs, totalMax, maxBg, minBg);
+
+ assertThat(jobs.runningFg).isAtMost(totalMax);
+ assertThat(jobs.runningBg).isAtMost(totalMax);
+ assertThat(jobs.runningFg + jobs.runningBg).isAtMost(totalMax);
+ assertThat(jobs.runningBg).isAtMost(maxBg);
+ }
+ }
+
+ /**
+ * Randomly enqueue / stop jobs and make sure we won't run more jobs than we should.
+ */
+ @Test
+ public void testRandom1() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 6;
+ final int maxBg = 4;
+ final int minBg = 2;
+ final double stopRatio = 0.1;
+ final double fgJobRatio = 0.5;
+ final double startRatio = 0.1;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio , stopRatio);
+ }
+
+ @Test
+ public void testRandom2() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 2;
+ final int maxBg = 2;
+ final int minBg = 0;
+ final double stopRatio = 0.5;
+ final double fgJobRatio = 0.5;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom3() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 2;
+ final int maxBg = 2;
+ final int minBg = 2;
+ final double stopRatio = 0.5;
+ final double fgJobRatio = 0.5;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom4() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 10;
+ final int maxBg = 2;
+ final int minBg = 0;
+ final double stopRatio = 0.5;
+ final double fgJobRatio = 0.5;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom5() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 6;
+ final int maxBg = 4;
+ final int minBg = 2;
+ final double stopRatio = 0.5;
+ final double fgJobRatio = 0.1;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom6() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 6;
+ final int maxBg = 4;
+ final int minBg = 2;
+ final double stopRatio = 0.5;
+ final double fgJobRatio = 0.9;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom7() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 6;
+ final int maxBg = 4;
+ final int minBg = 2;
+ final double stopRatio = 0.4;
+ final double fgJobRatio = 0.1;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ @Test
+ public void testRandom8() {
+ final Jobs jobs = new Jobs();
+
+ final int numTests = 5000;
+ final int totalMax = 6;
+ final int maxBg = 4;
+ final int minBg = 2;
+ final double stopRatio = 0.4;
+ final double fgJobRatio = 0.9;
+ final double startRatio = 0.5;
+
+ checkRandom(jobs, numTests, totalMax, maxBg, minBg, startRatio, fgJobRatio, stopRatio);
+ }
+
+ /** Used by the following tests */
+ private void checkSimple(int totalMax, int maxBg, int minBg,
+ int runningFg, int runningBg, int pendingFg, int pendingBg,
+ int resultRunningFg, int resultRunningBg, int resultPendingFg, int resultPendingBg) {
+ final Jobs jobs = new Jobs();
+ jobs.runningFg = runningFg;
+ jobs.runningBg = runningBg;
+ jobs.pendingFg = pendingFg;
+ jobs.pendingBg = pendingBg;
+
+ startPendingJobs(jobs, totalMax, maxBg, minBg);
+
+ assertThat(jobs.runningFg).isEqualTo(resultRunningFg);
+ assertThat(jobs.runningBg).isEqualTo(resultRunningBg);
+
+ assertThat(jobs.pendingFg).isEqualTo(resultPendingFg);
+ assertThat(jobs.pendingBg).isEqualTo(resultPendingBg);
+ }
+
+
+ @Test
+ public void testBasic() {
+ // Args are:
+ // First 3: Total-max, bg-max, bg-min.
+ // Next 2: Running FG / BG
+ // Next 2: Pending FG / BG
+ // Next 4: Result running FG / BG, pending FG/BG.
+ checkSimple(6, 4, 2, /*run=*/ 0, 0, /*pen=*/ 1, 0, /*res run/pen=*/ 1, 0, 0, 0);
+
+ checkSimple(6, 4, 2, /*run=*/ 0, 0, /*pen=*/ 10, 0, /*res run/pen=*/ 6, 0, 4, 0);
+
+ // When there are BG jobs pending, 2 (min-BG) jobs should run.
+ checkSimple(6, 4, 2, /*run=*/ 0, 0, /*pen=*/ 10, 1, /*res run/pen=*/ 5, 1, 5, 0);
+ checkSimple(6, 4, 2, /*run=*/ 0, 0, /*pen=*/ 10, 3, /*res run/pen=*/ 4, 2, 6, 1);
+
+ checkSimple(6, 4, 2, /*run=*/ 6, 0, /*pen=*/ 10, 3, /*res run/pen=*/ 6, 0, 10, 3);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/job/MaxJobCountsTest.java b/services/tests/servicestests/src/com/android/server/job/MaxJobCountsTest.java
new file mode 100644
index 000000000000..01199a36ff5b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/job/MaxJobCountsTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019 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.job;
+
+import android.util.KeyValueListParser;
+
+import com.android.server.job.JobSchedulerService.MaxJobCounts;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class MaxJobCountsTest {
+
+ private void check(String config,
+ int defaultTotal, int defaultMaxBg, int defaultMinBg,
+ int expectedTotal, int expectedMaxBg, int expectedMinBg) {
+ final KeyValueListParser parser = new KeyValueListParser(',');
+ parser.setString(config);
+
+ final MaxJobCounts counts = new JobSchedulerService.MaxJobCounts(
+ defaultTotal, "total",
+ defaultMaxBg, "maxbg",
+ defaultMinBg, "minbg");
+
+ counts.parse(parser);
+
+ Assert.assertEquals(expectedTotal, counts.getTotalMax());
+ Assert.assertEquals(expectedMaxBg, counts.getMaxBg());
+ Assert.assertEquals(expectedMinBg, counts.getMinBg());
+ }
+
+ @Test
+ public void test() {
+ check("", /*default*/ 5, 1, 0, /*expected*/ 5, 1, 0);
+ check("", /*default*/ 5, 0, 0, /*expected*/ 5, 1, 0);
+ check("", /*default*/ 0, 0, 0, /*expected*/ 1, 1, 0);
+ check("", /*default*/ -1, -1, -1, /*expected*/ 1, 1, 0);
+ check("", /*default*/ 5, 5, 5, /*expected*/ 5, 5, 4);
+ check("", /*default*/ 6, 5, 6, /*expected*/ 6, 5, 5);
+ check("", /*default*/ 4, 5, 6, /*expected*/ 4, 4, 3);
+ check("", /*default*/ 5, 1, 1, /*expected*/ 5, 1, 1);
+
+ check("total=5,maxbg=4,minbg=3", /*default*/ 9, 9, 9, /*expected*/ 5, 4, 3);
+ check("total=5", /*default*/ 9, 9, 9, /*expected*/ 5, 5, 4);
+ check("maxbg=4", /*default*/ 9, 9, 9, /*expected*/ 9, 4, 4);
+ check("minbg=3", /*default*/ 9, 9, 9, /*expected*/ 9, 9, 3);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 8a9e5d181777..c2d4846b14c0 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -23,6 +23,7 @@ import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FOR
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertArrayEquals;
@@ -91,6 +92,9 @@ public class KeySyncTaskTest {
private static final byte[] TEST_VAULT_HANDLE =
new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
private static final String TEST_APP_KEY_ALIAS = "rcleaver";
+ private static final byte[] TEST_APP_KEY_METADATA_NULL = null;
+ private static final byte[] TEST_APP_KEY_METADATA_NON_NULL =
+ "mdata".getBytes(StandardCharsets.UTF_8);
private static final int TEST_GENERATION_ID = 2;
private static final int TEST_CREDENTIAL_TYPE = CREDENTIAL_TYPE_PATTERN;
private static final String TEST_CREDENTIAL = "pas123";
@@ -251,7 +255,7 @@ public class KeySyncTaskTest {
TEST_USER_ID,
TEST_RECOVERY_AGENT_UID,
TEST_APP_KEY_ALIAS,
- WrappedKey.fromSecretKey(mEncryptKey, applicationKey));
+ WrappedKey.fromSecretKey(mEncryptKey, applicationKey, TEST_APP_KEY_METADATA_NULL));
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
mKeySyncTask.run();
@@ -267,7 +271,7 @@ public class KeySyncTaskTest {
TEST_USER_ID,
TEST_RECOVERY_AGENT_UID,
TEST_APP_KEY_ALIAS,
- WrappedKey.fromSecretKey(mEncryptKey, applicationKey));
+ WrappedKey.fromSecretKey(mEncryptKey, applicationKey, TEST_APP_KEY_METADATA_NULL));
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
@@ -545,18 +549,20 @@ public class KeySyncTaskTest {
assertEquals(TEST_APP_KEY_ALIAS, keyData.getAlias());
assertThat(keyData.getAlias()).isEqualTo(keyData.getAlias());
byte[] appKey = KeySyncUtils.decryptApplicationKey(
- recoveryKey, keyData.getEncryptedKeyMaterial());
+ recoveryKey, keyData.getEncryptedKeyMaterial(), TEST_APP_KEY_METADATA_NULL);
assertThat(appKey).isEqualTo(applicationKey.getEncoded());
}
@Test
- public void run_sendsEncryptedKeysIfAvailableToSync_withCertPath() throws Exception {
+ public void run_sendsEncryptedKeysIfAvailableToSync_withCertPath_withNullKeyMetadata()
+ throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setServerParams(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
- addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS,
+ TEST_APP_KEY_METADATA_NULL);
mKeySyncTask.run();
@@ -564,6 +570,33 @@ public class KeySyncTaskTest {
verify(mSnapshotListenersStorage).recoverySnapshotAvailable(TEST_RECOVERY_AGENT_UID);
List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
assertThat(applicationKeys).hasSize(1);
+ WrappedApplicationKey keyData = applicationKeys.get(0);
+ assertThat(keyData.getAlias()).isEqualTo(TEST_APP_KEY_ALIAS);
+ assertThat(keyData.getMetadata()).isEqualTo(TEST_APP_KEY_METADATA_NULL);
+ assertThat(keyChainSnapshot.getTrustedHardwareCertPath())
+ .isEqualTo(TestData.CERT_PATH_1);
+ }
+
+ @Test
+ public void run_sendsEncryptedKeysIfAvailableToSync_withCertPath_withNonNullKeyMetadata()
+ throws Exception {
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setServerParams(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+ when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS,
+ TEST_APP_KEY_METADATA_NON_NULL);
+
+ mKeySyncTask.run();
+
+ KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+ verify(mSnapshotListenersStorage).recoverySnapshotAvailable(TEST_RECOVERY_AGENT_UID);
+ List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
+ assertThat(applicationKeys).hasSize(1);
+ WrappedApplicationKey keyData = applicationKeys.get(0);
+ assertThat(keyData.getAlias()).isEqualTo(TEST_APP_KEY_ALIAS);
+ assertThat(keyData.getMetadata()).isEqualTo(TEST_APP_KEY_METADATA_NON_NULL);
assertThat(keyChainSnapshot.getTrustedHardwareCertPath())
.isEqualTo(TestData.CERT_PATH_1);
}
@@ -788,6 +821,11 @@ public class KeySyncTaskTest {
private SecretKey addApplicationKey(int userId, int recoveryAgentUid, String alias)
throws Exception{
+ return addApplicationKey(userId, recoveryAgentUid, alias, TEST_APP_KEY_METADATA_NULL);
+ }
+
+ private SecretKey addApplicationKey(int userId, int recoveryAgentUid, String alias,
+ byte[] metadata) throws Exception {
SecretKey applicationKey = generateKey();
mRecoverableKeyStoreDb.setServerParams(
userId, recoveryAgentUid, TEST_VAULT_HANDLE);
@@ -800,7 +838,7 @@ public class KeySyncTaskTest {
userId,
recoveryAgentUid,
alias,
- WrappedKey.fromSecretKey(mEncryptKey, applicationKey));
+ WrappedKey.fromSecretKey(mEncryptKey, applicationKey, metadata));
return applicationKey;
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
index f832d3ceef8e..178fd104a1ae 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
@@ -22,6 +22,8 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import android.util.Pair;
+
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -65,7 +67,8 @@ public class KeySyncUtilsTest {
private static final byte[] RECOVERY_RESPONSE_HEADER =
"V1 reencrypted_recovery_key".getBytes(StandardCharsets.UTF_8);
private static final int PUBLIC_KEY_LENGTH_BYTES = 65;
-
+ private static final byte[] NULL_METADATA = null;
+ private static final byte[] NON_NULL_METADATA = "somemetadata".getBytes(StandardCharsets.UTF_8);
@Test
public void calculateThmKfHash_isShaOfLockScreenHashWithPrefix() throws Exception {
@@ -125,18 +128,35 @@ public class KeySyncUtilsTest {
}
@Test
- public void decryptApplicationKey_decryptsAnApplicationKeyEncryptedWithSecureBox()
- throws Exception {
+ public void decryptApplicationKey_decryptsAnApplicationKey_nullMetadata() throws Exception {
String alias = "phoebe";
SecretKey recoveryKey = KeySyncUtils.generateRecoveryKey();
SecretKey applicationKey = generateApplicationKey();
Map<String, byte[]> encryptedKeys =
KeySyncUtils.encryptKeysWithRecoveryKey(
- recoveryKey, ImmutableMap.of(alias, applicationKey));
+ recoveryKey,
+ ImmutableMap.of(alias, Pair.create(applicationKey, NULL_METADATA)));
byte[] encryptedKey = encryptedKeys.get(alias);
- byte[] keyMaterial =
- KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(), encryptedKey);
+ byte[] keyMaterial = KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(),
+ encryptedKey, NULL_METADATA);
+
+ assertArrayEquals(applicationKey.getEncoded(), keyMaterial);
+ }
+
+ @Test
+ public void decryptApplicationKey_decryptsAnApplicationKey_nonNullMetadata() throws Exception {
+ String alias = "phoebe";
+ SecretKey recoveryKey = KeySyncUtils.generateRecoveryKey();
+ SecretKey applicationKey = generateApplicationKey();
+ Map<String, byte[]> encryptedKeys =
+ KeySyncUtils.encryptKeysWithRecoveryKey(
+ recoveryKey,
+ ImmutableMap.of(alias, Pair.create(applicationKey, NON_NULL_METADATA)));
+ byte[] encryptedKey = encryptedKeys.get(alias);
+
+ byte[] keyMaterial = KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(),
+ encryptedKey, NON_NULL_METADATA);
assertArrayEquals(applicationKey.getEncoded(), keyMaterial);
}
@@ -147,12 +167,13 @@ public class KeySyncUtilsTest {
Map<String, byte[]> encryptedKeys =
KeySyncUtils.encryptKeysWithRecoveryKey(
KeySyncUtils.generateRecoveryKey(),
- ImmutableMap.of("casper", generateApplicationKey()));
+ ImmutableMap.of("casper",
+ Pair.create(generateApplicationKey(), NULL_METADATA)));
byte[] encryptedKey = encryptedKeys.get(alias);
try {
- KeySyncUtils.decryptApplicationKey(
- KeySyncUtils.generateRecoveryKey().getEncoded(), encryptedKey);
+ KeySyncUtils.decryptApplicationKey(KeySyncUtils.generateRecoveryKey().getEncoded(),
+ encryptedKey, NULL_METADATA);
fail("Did not throw decrypting with bad key.");
} catch (AEADBadTagException error) {
// expected
@@ -160,6 +181,47 @@ public class KeySyncUtilsTest {
}
@Test
+ public void decryptApplicationKey_throwsIfWrongMetadata() throws Exception {
+ String alias1 = "casper1";
+ String alias2 = "casper2";
+ String alias3 = "casper3";
+ SecretKey recoveryKey = KeySyncUtils.generateRecoveryKey();
+
+ Map<String, byte[]> encryptedKeys =
+ KeySyncUtils.encryptKeysWithRecoveryKey(
+ recoveryKey,
+ ImmutableMap.of(
+ alias1,
+ Pair.create(generateApplicationKey(), NULL_METADATA),
+ alias2,
+ Pair.create(generateApplicationKey(), NON_NULL_METADATA),
+ alias3,
+ Pair.create(generateApplicationKey(), NON_NULL_METADATA)));
+
+ try {
+ KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(),
+ encryptedKeys.get(alias1), NON_NULL_METADATA);
+ fail("Did not throw decrypting with wrong metadata.");
+ } catch (AEADBadTagException error) {
+ // expected
+ }
+ try {
+ KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(),
+ encryptedKeys.get(alias2), NULL_METADATA);
+ fail("Did not throw decrypting with wrong metadata.");
+ } catch (AEADBadTagException error) {
+ // expected
+ }
+ try {
+ KeySyncUtils.decryptApplicationKey(recoveryKey.getEncoded(),
+ encryptedKeys.get(alias3), "different".getBytes(StandardCharsets.UTF_8));
+ fail("Did not throw decrypting with wrong metadata.");
+ } catch (AEADBadTagException error) {
+ // expected
+ }
+ }
+
+ @Test
public void decryptRecoveryKey_decryptsALocallyEncryptedKey() throws Exception {
SecretKey recoveryKey = KeySyncUtils.generateRecoveryKey();
byte[] encrypted = KeySyncUtils.locallyEncryptRecoveryKey(
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
index 48afb8b6abcb..c295177814b0 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
@@ -20,6 +20,7 @@ import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
import android.content.Context;
import android.security.keystore.AndroidKeyStoreSecretKey;
@@ -60,6 +61,9 @@ public class RecoverableKeyGeneratorTest {
private static final int TEST_USER_ID = 1000;
private static final int KEYSTORE_UID_SELF = -1;
private static final int GCM_TAG_LENGTH_BITS = 128;
+ private static final byte[] NULL_METADATA = null;
+ private static final byte[] NON_NULL_METADATA = "test-metadata".getBytes(
+ StandardCharsets.UTF_8);
private PlatformEncryptionKey mPlatformKey;
private PlatformDecryptionKey mDecryptKey;
@@ -90,18 +94,29 @@ public class RecoverableKeyGeneratorTest {
}
@Test
- public void generateAndStoreKey_storesWrappedKey() throws Exception {
+ public void generateAndStoreKey_storesWrappedKey_nullMetadata() throws Exception {
mRecoverableKeyGenerator.generateAndStoreKey(
- mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS);
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, NULL_METADATA);
WrappedKey wrappedKey = mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS);
assertNotNull(wrappedKey);
+ assertNull(wrappedKey.getKeyMetadata());
+ }
+
+ @Test
+ public void generateAndStoreKey_storesWrappedKey_nonNullMetadata() throws Exception {
+ mRecoverableKeyGenerator.generateAndStoreKey(
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, NON_NULL_METADATA);
+
+ WrappedKey wrappedKey = mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS);
+ assertNotNull(wrappedKey);
+ assertArrayEquals(NON_NULL_METADATA, wrappedKey.getKeyMetadata());
}
@Test
public void generateAndStoreKey_returnsRawMaterialOfCorrectLength() throws Exception {
byte[] rawKey = mRecoverableKeyGenerator.generateAndStoreKey(
- mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS);
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, NON_NULL_METADATA);
assertEquals(KEY_SIZE_BYTES, rawKey.length);
}
@@ -109,7 +124,7 @@ public class RecoverableKeyGeneratorTest {
@Test
public void generateAndStoreKey_storesTheWrappedVersionOfTheRawMaterial() throws Exception {
byte[] rawMaterial = mRecoverableKeyGenerator.generateAndStoreKey(
- mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS);
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, NULL_METADATA);
WrappedKey wrappedKey = mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS);
Cipher cipher = Cipher.getInstance(KEY_WRAP_ALGORITHM);
@@ -120,10 +135,30 @@ public class RecoverableKeyGeneratorTest {
}
@Test
+ public void importKey_storesNullMetadata() throws Exception {
+ mRecoverableKeyGenerator.importKey(
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS,
+ randomBytes(KEY_SIZE_BYTES),
+ NULL_METADATA);
+ assertNull(mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS).getKeyMetadata());
+ }
+
+ @Test
+ public void importKey_storesNonNullMetadata() throws Exception {
+ mRecoverableKeyGenerator.importKey(
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS,
+ randomBytes(KEY_SIZE_BYTES),
+ NON_NULL_METADATA);
+ assertArrayEquals(NON_NULL_METADATA,
+ mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS).getKeyMetadata());
+ }
+
+ @Test
public void importKey_storesTheWrappedVersionOfTheRawMaterial() throws Exception {
byte[] rawMaterial = randomBytes(KEY_SIZE_BYTES);
mRecoverableKeyGenerator.importKey(
- mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, rawMaterial);
+ mPlatformKey, TEST_USER_ID, KEYSTORE_UID_SELF, TEST_ALIAS, rawMaterial,
+ NULL_METADATA);
WrappedKey wrappedKey = mRecoverableKeyStoreDb.getKey(KEYSTORE_UID_SELF, TEST_ALIAS);
Cipher cipher = Cipher.getInstance(KEY_WRAP_ALGORITHM);
@@ -145,10 +180,6 @@ public class RecoverableKeyGeneratorTest {
return (AndroidKeyStoreSecretKey) keyGenerator.generateKey();
}
- private static byte[] getUtf8Bytes(String s) {
- return s.getBytes(StandardCharsets.UTF_8);
- }
-
private static byte[] randomBytes(int n) {
byte[] bytes = new byte[n];
new Random().nextBytes(bytes);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index b15863dd3613..c78b96d2d294 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -52,6 +52,7 @@ import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
+import android.util.Pair;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -134,6 +135,8 @@ public class RecoverableKeyStoreManagerTest {
private static final int GENERATION_ID = 1;
private static final byte[] NONCE = getUtf8Bytes("nonce");
private static final byte[] KEY_MATERIAL = getUtf8Bytes("keymaterial");
+ private static final byte[] KEY_METADATA_NULL = null;
+ private static final byte[] KEY_METADATA_NON_NULL = getUtf8Bytes("keymetametadata");
private static final String KEY_ALGORITHM = "AES";
private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore";
private static final String WRAPPING_KEY_ALIAS = "RecoverableKeyStoreManagerTest/WrappingKey";
@@ -231,6 +234,77 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
+ public void importKeyWithMetadata_nullMetadata_storesTheKey() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ byte[] keyMaterial = randomBytes(APPLICATION_KEY_SIZE_BYTES);
+
+ mRecoverableKeyStoreManager.importKeyWithMetadata(
+ TEST_ALIAS, keyMaterial, KEY_METADATA_NULL);
+
+ assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ }
+
+ @Test
+ public void importKeyWithMetadata_nonNullMetadata_storesTheKey() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ byte[] keyMaterial = randomBytes(APPLICATION_KEY_SIZE_BYTES);
+
+ mRecoverableKeyStoreManager.importKeyWithMetadata(
+ TEST_ALIAS, keyMaterial, KEY_METADATA_NON_NULL);
+
+ assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ }
+
+ @Test
+ public void importKeyWithMetadata_throwsIfInvalidLength() throws Exception {
+ byte[] keyMaterial = randomBytes(APPLICATION_KEY_SIZE_BYTES - 1);
+ try {
+ mRecoverableKeyStoreManager.importKeyWithMetadata(
+ TEST_ALIAS, keyMaterial, KEY_METADATA_NON_NULL);
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.getMessage()).contains("not contain 256 bits");
+ }
+ }
+
+ @Test
+ public void importKeyWithMetadata_throwsIfNullKey() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.importKeyWithMetadata(
+ TEST_ALIAS, /*keyBytes=*/ null, KEY_METADATA_NON_NULL);
+ fail("should have thrown");
+ } catch (NullPointerException e) {
+ assertThat(e.getMessage()).contains("is null");
+ }
+ }
+
+ @Test
+ public void generateKeyWithMetadata_nullMetadata_storesTheKey() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+
+ mRecoverableKeyStoreManager.generateKeyWithMetadata(TEST_ALIAS, KEY_METADATA_NULL);
+
+ assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ }
+
+ @Test
+ public void generateKeyWithMetadata_nonNullMetadata_storesTheKey() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+
+ mRecoverableKeyStoreManager.generateKeyWithMetadata(TEST_ALIAS, KEY_METADATA_NON_NULL);
+
+ assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ }
+
+ @Test
public void removeKey_removesAKey() throws Exception {
int uid = Binder.getCallingUid();
mRecoverableKeyStoreManager.generateKey(TEST_ALIAS);
@@ -1143,7 +1217,10 @@ public class RecoverableKeyStoreManagerTest {
int status = 100;
int status2 = 200;
String alias = "key1";
- WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, GENERATION_ID, status);
+ byte[] keyMetadata = null;
+
+ WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, keyMetadata, GENERATION_ID,
+ status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
Map<String, Integer> statuses =
mRecoverableKeyStoreManager.getRecoveryStatus();
@@ -1169,7 +1246,8 @@ public class RecoverableKeyStoreManagerTest {
private static byte[] encryptedApplicationKey(
SecretKey recoveryKey, byte[] applicationKey) throws Exception {
return KeySyncUtils.encryptKeysWithRecoveryKey(recoveryKey, ImmutableMap.of(
- TEST_ALIAS, new SecretKeySpec(applicationKey, "AES")
+ TEST_ALIAS,
+ Pair.create(new SecretKeySpec(applicationKey, "AES"), /*metadata=*/ null)
)).get(TEST_ALIAS);
}
@@ -1203,7 +1281,7 @@ public class RecoverableKeyStoreManagerTest {
private void generateKeyAndSimulateSync(int userId, int uid, int snapshotVersion)
throws Exception{
- mRecoverableKeyStoreManager.generateKey(TEST_ALIAS);
+ mRecoverableKeyStoreManager.generateKeyWithMetadata(TEST_ALIAS, KEY_METADATA_NULL);
// Simulate key sync.
mRecoverableKeyStoreDb.setSnapshotVersion(userId, uid, snapshotVersion);
mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
index 944d6e0512eb..9b4c3beac582 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
@@ -3,6 +3,7 @@ package com.android.server.locksettings.recoverablekeystore;
import static com.google.common.truth.Truth.assertThat;
import android.security.keystore.recovery.TrustedRootCertificates;
+import android.util.Pair;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -64,10 +65,10 @@ public class TestOnlyInsecureCertificateHelperTest {
@Test
public void testKeepOnlyWhitelistedInsecureKeys_emptyKeysList() throws Exception {
- Map<String, SecretKey> rawKeys = new HashMap<>();
- Map<String, SecretKey> expectedResult = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> rawKeys = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> expectedResult = new HashMap<>();
- Map<String, SecretKey> filteredKeys =
+ Map<String, Pair<SecretKey, byte[]>> filteredKeys =
mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
assertThat(filteredKeys.entrySet()).containsAllIn(rawKeys.entrySet());
@@ -75,13 +76,13 @@ public class TestOnlyInsecureCertificateHelperTest {
@Test
public void testKeepOnlyWhitelistedInsecureKeys_singleNonWhitelistedKey() throws Exception {
- Map<String, SecretKey> rawKeys = new HashMap<>();
- Map<String, SecretKey> expectedResult = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> rawKeys = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> expectedResult = new HashMap<>();
String alias = "secureAlias";
- rawKeys.put(alias, TestData.generateKey());
+ rawKeys.put(alias, Pair.create(TestData.generateKey(), /*metadata=*/ null));
- Map<String, SecretKey> filteredKeys =
+ Map<String, Pair<SecretKey, byte[]>> filteredKeys =
mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
@@ -89,14 +90,14 @@ public class TestOnlyInsecureCertificateHelperTest {
@Test
public void testKeepOnlyWhitelistedInsecureKeys_singleWhitelistedKey() throws Exception {
- Map<String, SecretKey> rawKeys = new HashMap<>();
- Map<String, SecretKey> expectedResult = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> rawKeys = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> expectedResult = new HashMap<>();
String alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX;
- rawKeys.put(alias, TestData.generateKey());
+ rawKeys.put(alias, Pair.create(TestData.generateKey(), /*metadata=*/ null));
expectedResult.put(alias, rawKeys.get(alias));
- Map<String, SecretKey> filteredKeys =
+ Map<String, Pair<SecretKey, byte[]>> filteredKeys =
mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
@@ -104,21 +105,21 @@ public class TestOnlyInsecureCertificateHelperTest {
@Test
public void testKeepOnlyWhitelistedInsecureKeys() throws Exception {
- Map<String, SecretKey> rawKeys = new HashMap<>();
- Map<String, SecretKey> expectedResult = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> rawKeys = new HashMap<>();
+ Map<String, Pair<SecretKey, byte[]>> expectedResult = new HashMap<>();
String alias = "SECURE_ALIAS" + TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX;
- rawKeys.put(alias, TestData.generateKey());
+ rawKeys.put(alias, Pair.create(TestData.generateKey(), /*metadata=*/ null));
alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "1";
- rawKeys.put(alias, TestData.generateKey());
+ rawKeys.put(alias, Pair.create(TestData.generateKey(), /*metadata=*/ null));
expectedResult.put(alias, rawKeys.get(alias));
alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "2";
- rawKeys.put(alias, TestData.generateKey());
+ rawKeys.put(alias, Pair.create(TestData.generateKey(), /*metadata=*/ null));
expectedResult.put(alias, rawKeys.get(alias));
- Map<String, SecretKey> filteredKeys =
+ Map<String, Pair<SecretKey, byte[]>> filteredKeys =
mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
index b5ee60e7ec24..9813ab74721e 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.fail;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
+import android.util.Pair;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -32,6 +33,7 @@ import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Map;
@@ -47,26 +49,49 @@ public class WrappedKeyTest {
private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore";
private static final String KEY_ALGORITHM = "AES";
private static final String CIPHER_ALGORITHM = "AES/GCM/NoPadding";
- private static final String WRAPPING_KEY_ALIAS = "WrappedKeyTestWrappingKeyAlias";
+ private static final String WRAPPED_KEY_ALIAS = "WrappedKeyTestWrappingKeyAlias";
private static final int GENERATION_ID = 1;
private static final int GCM_TAG_LENGTH_BYTES = 16;
private static final int BITS_PER_BYTE = 8;
private static final int GCM_TAG_LENGTH_BITS = GCM_TAG_LENGTH_BYTES * BITS_PER_BYTE;
+ private static final byte[] NULL_METADATA = null;
+ private static final byte[] NON_NULL_METADATA = "keyMetadata".getBytes(StandardCharsets.UTF_8);
@After
public void tearDown() throws Exception {
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER);
keyStore.load(/*param=*/ null);
- keyStore.deleteEntry(WRAPPING_KEY_ALIAS);
+ keyStore.deleteEntry(WRAPPED_KEY_ALIAS);
+ }
+
+ // TODO: Add tests for non-null metadata
+
+ @Test
+ public void fromSecretKey_createsWrappedKeyThatCanBeUnwrapped_nullMetadata() throws Exception {
+ PlatformEncryptionKey wrappingKey = new PlatformEncryptionKey(
+ GENERATION_ID, generateAndroidKeyStoreKey());
+ SecretKey rawKey = generateKey();
+
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(wrappingKey, rawKey, NULL_METADATA);
+
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+ cipher.init(
+ Cipher.UNWRAP_MODE,
+ wrappingKey.getKey(),
+ new GCMParameterSpec(GCM_TAG_LENGTH_BITS, wrappedKey.getNonce()));
+ SecretKey unwrappedKey = (SecretKey) cipher.unwrap(
+ wrappedKey.getKeyMaterial(), KEY_ALGORITHM, Cipher.SECRET_KEY);
+ assertEquals(rawKey, unwrappedKey);
}
@Test
- public void fromSecretKey_createsWrappedKeyThatCanBeUnwrapped() throws Exception {
+ public void fromSecretKey_createsWrappedKeyThatCanBeUnwrapped_nonNullMetadata()
+ throws Exception {
PlatformEncryptionKey wrappingKey = new PlatformEncryptionKey(
GENERATION_ID, generateAndroidKeyStoreKey());
SecretKey rawKey = generateKey();
- WrappedKey wrappedKey = WrappedKey.fromSecretKey(wrappingKey, rawKey);
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(wrappingKey, rawKey, NON_NULL_METADATA);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(
@@ -84,27 +109,47 @@ public class WrappedKeyTest {
GENERATION_ID, generateAndroidKeyStoreKey());
SecretKey rawKey = generateKey();
- WrappedKey wrappedKey = WrappedKey.fromSecretKey(wrappingKey, rawKey);
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(wrappingKey, rawKey, NULL_METADATA);
assertEquals(GENERATION_ID, wrappedKey.getPlatformKeyGenerationId());
}
@Test
- public void decryptWrappedKeys_decryptsWrappedKeys() throws Exception {
+ public void decryptWrappedKeys_decryptsWrappedKeys_nullMetadata() throws Exception {
String alias = "karlin";
AndroidKeyStoreSecretKey platformKey = generateAndroidKeyStoreKey();
SecretKey appKey = generateKey();
WrappedKey wrappedKey = WrappedKey.fromSecretKey(
- new PlatformEncryptionKey(GENERATION_ID, platformKey), appKey);
+ new PlatformEncryptionKey(GENERATION_ID, platformKey), appKey, NULL_METADATA);
HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
keysByAlias.put(alias, wrappedKey);
- Map<String, SecretKey> unwrappedKeys = WrappedKey.unwrapKeys(
+ Map<String, Pair<SecretKey, byte[]>> unwrappedKeys = WrappedKey.unwrapKeys(
new PlatformDecryptionKey(GENERATION_ID, platformKey), keysByAlias);
assertEquals(1, unwrappedKeys.size());
assertTrue(unwrappedKeys.containsKey(alias));
- assertArrayEquals(appKey.getEncoded(), unwrappedKeys.get(alias).getEncoded());
+ assertArrayEquals(appKey.getEncoded(), unwrappedKeys.get(alias).first.getEncoded());
+ assertArrayEquals(null, unwrappedKeys.get(alias).second);
+ }
+
+ @Test
+ public void decryptWrappedKeys_decryptsWrappedKeys_nonNullMetadata() throws Exception {
+ String alias = "karlin";
+ AndroidKeyStoreSecretKey platformKey = generateAndroidKeyStoreKey();
+ SecretKey appKey = generateKey();
+ WrappedKey wrappedKey = WrappedKey.fromSecretKey(
+ new PlatformEncryptionKey(GENERATION_ID, platformKey), appKey, NON_NULL_METADATA);
+ HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
+ keysByAlias.put(alias, wrappedKey);
+
+ Map<String, Pair<SecretKey, byte[]>> unwrappedKeys = WrappedKey.unwrapKeys(
+ new PlatformDecryptionKey(GENERATION_ID, platformKey), keysByAlias);
+
+ assertEquals(1, unwrappedKeys.size());
+ assertTrue(unwrappedKeys.containsKey(alias));
+ assertArrayEquals(appKey.getEncoded(), unwrappedKeys.get(alias).first.getEncoded());
+ assertArrayEquals(NON_NULL_METADATA, unwrappedKeys.get(alias).second);
}
@Test
@@ -113,11 +158,11 @@ public class WrappedKeyTest {
AndroidKeyStoreSecretKey platformKey = generateAndroidKeyStoreKey();
SecretKey appKey = generateKey();
WrappedKey wrappedKey = WrappedKey.fromSecretKey(
- new PlatformEncryptionKey(GENERATION_ID, platformKey), appKey);
+ new PlatformEncryptionKey(GENERATION_ID, platformKey), appKey, NULL_METADATA);
HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
keysByAlias.put(alias, wrappedKey);
- Map<String, SecretKey> unwrappedKeys = WrappedKey.unwrapKeys(
+ Map<String, Pair<SecretKey, byte[]>> unwrappedKeys = WrappedKey.unwrapKeys(
new PlatformDecryptionKey(GENERATION_ID, generateAndroidKeyStoreKey()),
keysByAlias);
@@ -128,7 +173,8 @@ public class WrappedKeyTest {
public void decryptWrappedKeys_throwsIfPlatformKeyGenerationIdDoesNotMatch() throws Exception {
AndroidKeyStoreSecretKey platformKey = generateAndroidKeyStoreKey();
WrappedKey wrappedKey = WrappedKey.fromSecretKey(
- new PlatformEncryptionKey(GENERATION_ID, platformKey), generateKey());
+ new PlatformEncryptionKey(GENERATION_ID, platformKey), generateKey(),
+ /*metadata=*/ null);
HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
keysByAlias.put("benji", wrappedKey);
@@ -156,19 +202,11 @@ public class WrappedKeyTest {
KEY_ALGORITHM,
ANDROID_KEY_STORE_PROVIDER);
keyGenerator.init(new KeyGenParameterSpec.Builder(
- WRAPPING_KEY_ALIAS,
+ WRAPPED_KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build());
return (AndroidKeyStoreSecretKey) keyGenerator.generateKey();
}
-
- private PlatformDecryptionKey generatePlatformDecryptionKey() throws Exception {
- return generatePlatformDecryptionKey(GENERATION_ID);
- }
-
- private PlatformDecryptionKey generatePlatformDecryptionKey(int generationId) throws Exception {
- return new PlatformDecryptionKey(generationId, generateAndroidKeyStoreKey());
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
index 880255d79eb7..9c03df8e4369 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
@@ -55,12 +55,15 @@ public class KeyChainSnapshotSerializerTest {
private static final String TEST_KEY_1_ALIAS = "key1";
private static final byte[] TEST_KEY_1_BYTES = new byte[] { 66, 77, 88 };
+ private static final byte[] TEST_KEY_1_METADATA = new byte[] { 89, 87 };
private static final String TEST_KEY_2_ALIAS = "key2";
private static final byte[] TEST_KEY_2_BYTES = new byte[] { 99, 33, 11 };
+ private static final byte[] TEST_KEY_2_METADATA = new byte[] {};
private static final String TEST_KEY_3_ALIAS = "key3";
private static final byte[] TEST_KEY_3_BYTES = new byte[] { 2, 8, 100 };
+ private static final byte[] TEST_KEY_3_METADATA = new byte[] { 121 };
@Test
public void roundTrip_persistsCounterId() throws Exception {
@@ -144,6 +147,17 @@ public class KeyChainSnapshotSerializerTest {
}
@Test
+ public void roundTripKeys_0_persistsKeyMetadata_absent() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ false).get(0).getMetadata()).isEqualTo(null);
+ }
+
+ @Test
+ public void roundTripKeys_0_persistsKeyMetadata_present() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ true).get(0).getMetadata())
+ .isEqualTo(TEST_KEY_1_METADATA);
+ }
+
+ @Test
public void roundTripKeys_1_persistsAlias() throws Exception {
assertThat(roundTripKeys().get(1).getAlias()).isEqualTo(TEST_KEY_2_ALIAS);
}
@@ -154,6 +168,17 @@ public class KeyChainSnapshotSerializerTest {
}
@Test
+ public void roundTripKeys_1_persistsKeyMetadata_absent() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ false).get(1).getMetadata()).isEqualTo(null);
+ }
+
+ @Test
+ public void roundTripKeys_1_persistsKeyMetadata_present() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ true).get(1).getMetadata())
+ .isEqualTo(TEST_KEY_2_METADATA);
+ }
+
+ @Test
public void roundTripKeys_2_persistsAlias() throws Exception {
assertThat(roundTripKeys().get(2).getAlias()).isEqualTo(TEST_KEY_3_ALIAS);
}
@@ -164,28 +189,74 @@ public class KeyChainSnapshotSerializerTest {
}
@Test
- public void serialize_doesNotThrowForTestSnapshot() throws Exception {
+ public void roundTripKeys_2_persistsKeyMetadata_absent() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ false).get(2).getMetadata()).isEqualTo(null);
+ }
+
+ @Test
+ public void roundTripKeys_2_persistsKeyMetadata_present() throws Exception {
+ assertThat(roundTripKeys(/*withKeyMetadata=*/ true).get(2).getMetadata())
+ .isEqualTo(TEST_KEY_3_METADATA);
+ }
+
+ @Test
+ public void serialize_doesNotThrowForTestSnapshotWithoutKeyMetadata() throws Exception {
KeyChainSnapshotSerializer.serialize(
- createTestKeyChainSnapshot(), new ByteArrayOutputStream());
+ createTestKeyChainSnapshot(/*withKeyMetadata=*/ false),
+ new ByteArrayOutputStream());
+ }
+
+ @Test
+ public void serialize_doesNotThrowForTestSnapshotWithKeyMetadata() throws Exception {
+ KeyChainSnapshotSerializer.serialize(
+ createTestKeyChainSnapshotWithKeyMetadata(), new ByteArrayOutputStream());
}
private static List<WrappedApplicationKey> roundTripKeys() throws Exception {
return roundTrip().getWrappedApplicationKeys();
}
+ private static List<WrappedApplicationKey> roundTripKeys(boolean withKeyMetadata)
+ throws Exception {
+ return roundTrip(withKeyMetadata).getWrappedApplicationKeys();
+ }
+
private static KeyChainProtectionParams roundTripParams() throws Exception {
- return roundTrip().getKeyChainProtectionParams().get(0);
+ return roundTrip(/*withKeyMetadata=*/ false).getKeyChainProtectionParams().get(0);
}
public static KeyChainSnapshot roundTrip() throws Exception {
- KeyChainSnapshot snapshot = createTestKeyChainSnapshot();
+ return roundTrip(/*withKeyMetadata=*/ false);
+ }
+
+ public static KeyChainSnapshot roundTrip(boolean withKeyMetadata) throws Exception {
+ KeyChainSnapshot snapshot = createTestKeyChainSnapshot(withKeyMetadata);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
KeyChainSnapshotSerializer.serialize(snapshot, byteArrayOutputStream);
return KeyChainSnapshotDeserializer.deserialize(
new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
}
- private static KeyChainSnapshot createTestKeyChainSnapshot() throws Exception {
+ private static KeyChainSnapshot createTestKeyChainSnapshot(boolean withKeyMetadata)
+ throws Exception {
+ KeyChainSnapshot.Builder builder = new KeyChainSnapshot.Builder()
+ .setCounterId(COUNTER_ID)
+ .setSnapshotVersion(SNAPSHOT_VERSION)
+ .setServerParams(SERVER_PARAMS)
+ .setMaxAttempts(MAX_ATTEMPTS)
+ .setEncryptedRecoveryKeyBlob(KEY_BLOB)
+ .setKeyChainProtectionParams(createKeyChainProtectionParamsList())
+ .setTrustedHardwareCertPath(CERT_PATH);
+ if (withKeyMetadata) {
+ builder.setWrappedApplicationKeys(createKeysWithMetadata());
+ } else {
+ builder.setWrappedApplicationKeys(createKeysWithoutMetadata());
+ }
+ return builder.build();
+ }
+
+ private static KeyChainSnapshot createTestKeyChainSnapshotWithKeyMetadata()
+ throws Exception {
return new KeyChainSnapshot.Builder()
.setCounterId(COUNTER_ID)
.setSnapshotVersion(SNAPSHOT_VERSION)
@@ -193,16 +264,24 @@ public class KeyChainSnapshotSerializerTest {
.setMaxAttempts(MAX_ATTEMPTS)
.setEncryptedRecoveryKeyBlob(KEY_BLOB)
.setKeyChainProtectionParams(createKeyChainProtectionParamsList())
- .setWrappedApplicationKeys(createKeys())
+ .setWrappedApplicationKeys(createKeysWithMetadata())
.setTrustedHardwareCertPath(CERT_PATH)
.build();
}
- private static List<WrappedApplicationKey> createKeys() {
+ private static List<WrappedApplicationKey> createKeysWithoutMetadata() {
ArrayList<WrappedApplicationKey> keyList = new ArrayList<>();
- keyList.add(createKey(TEST_KEY_1_ALIAS, TEST_KEY_1_BYTES));
- keyList.add(createKey(TEST_KEY_2_ALIAS, TEST_KEY_2_BYTES));
- keyList.add(createKey(TEST_KEY_3_ALIAS, TEST_KEY_3_BYTES));
+ keyList.add(createKey(TEST_KEY_1_ALIAS, TEST_KEY_1_BYTES, /*metadata=*/ null));
+ keyList.add(createKey(TEST_KEY_2_ALIAS, TEST_KEY_2_BYTES, /*metadata=*/ null));
+ keyList.add(createKey(TEST_KEY_3_ALIAS, TEST_KEY_3_BYTES, /*metadata=*/ null));
+ return keyList;
+ }
+
+ private static List<WrappedApplicationKey> createKeysWithMetadata() {
+ ArrayList<WrappedApplicationKey> keyList = new ArrayList<>();
+ keyList.add(createKey(TEST_KEY_1_ALIAS, TEST_KEY_1_BYTES, TEST_KEY_1_METADATA));
+ keyList.add(createKey(TEST_KEY_2_ALIAS, TEST_KEY_2_BYTES, TEST_KEY_2_METADATA));
+ keyList.add(createKey(TEST_KEY_3_ALIAS, TEST_KEY_3_BYTES, TEST_KEY_3_METADATA));
return keyList;
}
@@ -221,10 +300,13 @@ public class KeyChainSnapshotSerializerTest {
return keyChainProtectionParamsList;
}
- private static WrappedApplicationKey createKey(String alias, byte[] bytes) {
- return new WrappedApplicationKey.Builder()
+ private static WrappedApplicationKey createKey(String alias, byte[] bytes, byte[] metadata) {
+ WrappedApplicationKey.Builder builder = new WrappedApplicationKey.Builder()
.setAlias(alias)
- .setEncryptedKeyMaterial(bytes)
- .build();
+ .setEncryptedKeyMaterial(bytes);
+ if (metadata != null) {
+ builder.setMetadata(metadata);
+ }
+ return builder.build();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
index 7130b4226ef1..35215c34d8f0 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
@@ -60,6 +60,7 @@ public class RecoverableKeyStoreDbHelperTest {
private static final String TEST_ROOT_ALIAS = "root_cert_alias";
private static final byte[] TEST_CERT_PATH = "test-cert-path".getBytes(UTF_8);
private static final long TEST_CERT_SERIAL = 1000L;
+ private static final byte[] TEST_KEY_METADATA = "test-key-metadata".getBytes(UTF_8);
private static final String SQL_CREATE_V2_TABLE_KEYS =
"CREATE TABLE " + KeysEntry.TABLE_NAME + "( "
@@ -120,14 +121,14 @@ public class RecoverableKeyStoreDbHelperTest {
@Test
public void onCreate() throws Exception {
mDatabaseHelper.onCreate(mDatabase);
- checkAllColumns();
+ checkAllColumns_latest();
}
@Test
public void onUpgrade_beforeV2() throws Exception {
mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 1,
RecoverableKeyStoreDbHelper.DATABASE_VERSION);
- checkAllColumns();
+ checkAllColumns_latest();
}
@Test
@@ -135,11 +136,11 @@ public class RecoverableKeyStoreDbHelperTest {
createV2Tables();
mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 2,
RecoverableKeyStoreDbHelper.DATABASE_VERSION);
- checkAllColumns();
+ checkAllColumns_latest();
}
@Test
- public void onUpgrade_v2_to_v3_to_v4() throws Exception {
+ public void onUpgrade_v2_to_v3_to_v4_to_latest() throws Exception {
createV2Tables();
assertThat(isRootOfTrustTableAvailable()).isFalse(); // V2 doesn't have the table;
@@ -148,9 +149,12 @@ public class RecoverableKeyStoreDbHelperTest {
assertThat(isRootOfTrustTableAvailable()).isFalse(); // V3 doesn't have the table;
- mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 3,
+ mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 3, /*newVersion=*/ 4);
+ checkAllColumns_v4();
+
+ mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 4,
RecoverableKeyStoreDbHelper.DATABASE_VERSION);
- checkAllColumns();
+ checkAllColumns_latest();
}
private boolean isRootOfTrustTableAvailable() {
@@ -160,11 +164,11 @@ public class RecoverableKeyStoreDbHelperTest {
values.put(RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS, TEST_ROOT_ALIAS);
values.put(RootOfTrustEntry.COLUMN_NAME_CERT_PATH, TEST_CERT_PATH);
values.put(RootOfTrustEntry.COLUMN_NAME_CERT_SERIAL, TEST_CERT_SERIAL);
- return mDatabase.insert(RootOfTrustEntry.TABLE_NAME, /*nullColumnHack=*/ null, values)
+ return mDatabase.replace(RootOfTrustEntry.TABLE_NAME, /*nullColumnHack=*/ null, values)
> -1;
}
- private void checkAllColumns() throws Exception {
+ private void checkAllColumns_v4() throws Exception {
// Check the table containing encrypted application keys
ContentValues values = new ContentValues();
values.put(KeysEntry.COLUMN_NAME_USER_ID, TEST_USER_ID);
@@ -175,7 +179,7 @@ public class RecoverableKeyStoreDbHelperTest {
values.put(KeysEntry.COLUMN_NAME_GENERATION_ID, TEST_GENERATION_ID);
values.put(KeysEntry.COLUMN_NAME_LAST_SYNCED_AT, TEST_LAST_SYNCED_AT);
values.put(KeysEntry.COLUMN_NAME_RECOVERY_STATUS, TEST_RECOVERY_STATUS);
- assertThat(mDatabase.insert(KeysEntry.TABLE_NAME, /*nullColumnHack=*/ null, values))
+ assertThat(mDatabase.replace(KeysEntry.TABLE_NAME, /*nullColumnHack=*/ null, values))
.isGreaterThan(-1L);
// Check the table about user metadata
@@ -183,7 +187,8 @@ public class RecoverableKeyStoreDbHelperTest {
values.put(UserMetadataEntry.COLUMN_NAME_USER_ID, TEST_USER_ID);
values.put(UserMetadataEntry.COLUMN_NAME_PLATFORM_KEY_GENERATION_ID,
TEST_PLATFORM_KEY_GENERATION_ID);
- assertThat(mDatabase.insert(UserMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null, values))
+ assertThat(
+ mDatabase.replace(UserMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null, values))
.isGreaterThan(-1L);
// Check the table about recovery service metadata
@@ -202,11 +207,32 @@ public class RecoverableKeyStoreDbHelperTest {
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH, TEST_CERT_PATH);
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL, TEST_CERT_SERIAL);
assertThat(
- mDatabase.insert(RecoveryServiceMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null,
+ mDatabase.replace(RecoveryServiceMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null,
values))
.isGreaterThan(-1L);
// Check the table about recovery service and root of trust data introduced in V4
assertThat(isRootOfTrustTableAvailable()).isTrue();
}
+
+ private void checkAllColumns_latest() throws Exception {
+ // Check all columns of the previous version first.
+ checkAllColumns_v4();
+
+ ContentValues values = new ContentValues();
+ values.put(KeysEntry.COLUMN_NAME_USER_ID, TEST_USER_ID);
+ values.put(KeysEntry.COLUMN_NAME_UID, TEST_UID);
+ values.put(KeysEntry.COLUMN_NAME_ALIAS, TEST_ALIAS);
+ values.put(KeysEntry.COLUMN_NAME_NONCE, TEST_NONCE);
+ values.put(KeysEntry.COLUMN_NAME_WRAPPED_KEY, TEST_WRAPPED_KEY);
+ values.put(KeysEntry.COLUMN_NAME_GENERATION_ID, TEST_GENERATION_ID);
+ values.put(KeysEntry.COLUMN_NAME_LAST_SYNCED_AT, TEST_LAST_SYNCED_AT);
+ values.put(KeysEntry.COLUMN_NAME_RECOVERY_STATUS, TEST_RECOVERY_STATUS);
+
+ // This column is added when upgrading from v4 to v5
+ values.put(KeysEntry.COLUMN_NAME_KEY_METADATA, TEST_KEY_METADATA);
+
+ assertThat(mDatabase.replace(KeysEntry.TABLE_NAME, /*nullColumnHack=*/ null, values))
+ .isGreaterThan(-1L);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
index 6a26f8c72e81..7de9ffc7f3cc 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
@@ -80,25 +80,33 @@ public class RecoverableKeyStoreDbTest {
public void insertKey_replacesOldKey() {
int userId = 12;
int uid = 10009;
- String alias = "test";
- WrappedKey oldWrappedKey = new WrappedKey(
- getUtf8Bytes("nonce1"),
- getUtf8Bytes("keymaterial1"),
- /*platformKeyGenerationId=*/ 1);
- mRecoverableKeyStoreDb.insertKey(
- userId, uid, alias, oldWrappedKey);
- byte[] nonce = getUtf8Bytes("nonce2");
- byte[] keyMaterial = getUtf8Bytes("keymaterial2");
- WrappedKey newWrappedKey = new WrappedKey(
- nonce, keyMaterial, /*platformKeyGenerationId=*/2);
+ String alias = "test-alias";
- mRecoverableKeyStoreDb.insertKey(
- userId, uid, alias, newWrappedKey);
+ byte[] nonce = getUtf8Bytes("nonce1");
+ byte[] keyMaterial = getUtf8Bytes("keymaterial1");
+ byte[] keyMetadata = null;
+ int generationId = 1;
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId);
+ mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
assertArrayEquals(nonce, retrievedKey.getNonce());
assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
- assertEquals(2, retrievedKey.getPlatformKeyGenerationId());
+ assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
+ assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
+
+ nonce = getUtf8Bytes("nonce2");
+ keyMaterial = getUtf8Bytes("keymaterial2");
+ keyMetadata = getUtf8Bytes("keymetadata2");
+ generationId = 2;
+ wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId);
+ mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
+
+ retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
+ assertArrayEquals(nonce, retrievedKey.getNonce());
+ assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
+ assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
+ assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
}
@Test
@@ -108,10 +116,12 @@ public class RecoverableKeyStoreDbTest {
WrappedKey key1 = new WrappedKey(
getUtf8Bytes("nonce1"),
getUtf8Bytes("key1"),
+ /*metadata=*/ null,
/*platformKeyGenerationId=*/ 1);
WrappedKey key2 = new WrappedKey(
getUtf8Bytes("nonce2"),
getUtf8Bytes("key2"),
+ /*metadata=*/ null,
/*platformKeyGenerationId=*/ 1);
mRecoverableKeyStoreDb.insertKey(userId, /*uid=*/ 1, alias, key1);
@@ -133,6 +143,7 @@ public class RecoverableKeyStoreDbTest {
WrappedKey key = new WrappedKey(
getUtf8Bytes("nonce1"),
getUtf8Bytes("key1"),
+ /*metadata=*/ null,
/*platformKeyGenerationId=*/ 1);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, key);
@@ -158,13 +169,16 @@ public class RecoverableKeyStoreDbTest {
String alias = "test";
byte[] nonce = getUtf8Bytes("nonce");
byte[] keyMaterial = getUtf8Bytes("keymaterial");
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, 120);
+ byte[] keyMetadata = getUtf8Bytes("keymetametametadata");
+
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId, 120);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
assertArrayEquals(nonce, retrievedKey.getNonce());
assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
+ assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
assertEquals(status,retrievedKey.getRecoveryStatus());
}
@@ -174,20 +188,37 @@ public class RecoverableKeyStoreDbTest {
int userId = 12;
int uid = 1009;
int generationId = 6;
- String alias = "test";
- byte[] nonce = getUtf8Bytes("nonce");
- byte[] keyMaterial = getUtf8Bytes("keymaterial");
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId);
- mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
+
+ String alias1 = "alias1";
+ byte[] nonce1 = getUtf8Bytes("nonce1");
+ byte[] keyMaterial1 = getUtf8Bytes("keymaterial1");
+ byte[] keyMetadata1 = getUtf8Bytes("keyallmetadata1");
+ WrappedKey wrappedKey1 = new WrappedKey(nonce1, keyMaterial1, keyMetadata1, generationId);
+ mRecoverableKeyStoreDb.insertKey(userId, uid, alias1, wrappedKey1);
+
+ String alias2 = "alias2";
+ byte[] nonce2 = getUtf8Bytes("nonce2");
+ byte[] keyMaterial2 = getUtf8Bytes("keymaterial2");
+ byte[] keyMetadata2 = null;
+ WrappedKey wrappedKey2 = new WrappedKey(nonce2, keyMaterial2, keyMetadata2, generationId);
+ mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey2);
Map<String, WrappedKey> keys = mRecoverableKeyStoreDb.getAllKeys(userId, uid, generationId);
+ assertEquals(2, keys.size());
- assertEquals(1, keys.size());
- assertTrue(keys.containsKey(alias));
- WrappedKey retrievedKey = keys.get(alias);
- assertArrayEquals(nonce, retrievedKey.getNonce());
- assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
- assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
+ assertTrue(keys.containsKey(alias1));
+ WrappedKey retrievedKey1 = keys.get(alias1);
+ assertArrayEquals(nonce1, retrievedKey1.getNonce());
+ assertArrayEquals(keyMaterial1, retrievedKey1.getKeyMaterial());
+ assertArrayEquals(keyMetadata1, retrievedKey1.getKeyMetadata());
+ assertEquals(generationId, retrievedKey1.getPlatformKeyGenerationId());
+
+ assertTrue(keys.containsKey(alias2));
+ WrappedKey retrievedKey2 = keys.get(alias2);
+ assertArrayEquals(nonce2, retrievedKey2.getNonce());
+ assertArrayEquals(keyMaterial2, retrievedKey2.getKeyMaterial());
+ assertArrayEquals(keyMetadata2, retrievedKey2.getKeyMetadata());
+ assertEquals(generationId, retrievedKey2.getPlatformKeyGenerationId());
}
@Test
@@ -197,6 +228,7 @@ public class RecoverableKeyStoreDbTest {
WrappedKey wrappedKey = new WrappedKey(
getUtf8Bytes("nonce"),
getUtf8Bytes("keymaterial"),
+ /*metadata=*/ null,
/*platformKeyGenerationId=*/ 5);
mRecoverableKeyStoreDb.insertKey(
userId, uid, /*alias=*/ "test", wrappedKey);
@@ -212,7 +244,8 @@ public class RecoverableKeyStoreDbTest {
int generationId = 12;
int uid = 10009;
WrappedKey wrappedKey = new WrappedKey(
- getUtf8Bytes("nonce"), getUtf8Bytes("keymaterial"), generationId);
+ getUtf8Bytes("nonce"), getUtf8Bytes("keymaterial"), /*metadata=*/ null,
+ generationId);
mRecoverableKeyStoreDb.insertKey(
/*userId=*/ 1, uid, /*alias=*/ "test", wrappedKey);
@@ -255,7 +288,10 @@ public class RecoverableKeyStoreDbTest {
String alias = "test";
byte[] nonce = getUtf8Bytes("nonce");
byte[] keyMaterial = getUtf8Bytes("keymaterial");
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, status);
+ byte[] keyMetadata = null;
+
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
+ status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
@@ -279,12 +315,16 @@ public class RecoverableKeyStoreDbTest {
String alias3 = "test3";
byte[] nonce = getUtf8Bytes("nonce");
byte[] keyMaterial = getUtf8Bytes("keymaterial");
+ byte[] keyMetadata = null;
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, status);
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
+ status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey);
- WrappedKey wrappedKey2 = new WrappedKey(nonce, keyMaterial, generationId, status);
- mRecoverableKeyStoreDb.insertKey(userId, uid, alias3, wrappedKey);
- WrappedKey wrappedKeyWithDefaultStatus = new WrappedKey(nonce, keyMaterial, generationId);
+ WrappedKey wrappedKey2 = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
+ status);
+ mRecoverableKeyStoreDb.insertKey(userId, uid, alias3, wrappedKey2);
+ WrappedKey wrappedKeyWithDefaultStatus = new WrappedKey(nonce, keyMaterial, keyMetadata,
+ generationId);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKeyWithDefaultStatus);
Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
@@ -333,7 +373,10 @@ public class RecoverableKeyStoreDbTest {
String alias = "test";
byte[] nonce = getUtf8Bytes("nonce");
byte[] keyMaterial = getUtf8Bytes("keymaterial");
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, status);
+ byte[] keyMetadata = null;
+
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
+ status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
@@ -357,7 +400,10 @@ public class RecoverableKeyStoreDbTest {
String alias = "test";
byte[] nonce = getUtf8Bytes("nonce");
byte[] keyMaterial = getUtf8Bytes("keymaterial");
- WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, status);
+ byte[] keyMetadata = null;
+
+ WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
+ status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 1f5c64e92ac0..bc1f7981258d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -42,6 +42,7 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.IUidObserver;
+import android.app.Person;
import android.app.usage.UsageStatsManagerInternal;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -1588,6 +1589,14 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
}
/**
+ * Make a Person.
+ */
+ protected Person makePerson(CharSequence name, String key, String uri) {
+ final Person.Builder builder = new Person.Builder();
+ return builder.setName(name).setKey(key).setUri(uri).build();
+ }
+
+ /**
* Make an component name, with the client context.
*/
@NonNull
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 517b5ade44b8..6d28ed19af4f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -35,6 +35,7 @@ import static org.junit.Assert.fail;
import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.content.pm.PackageUserState;
import android.content.pm.SuspendDialogInfo;
@@ -226,8 +227,8 @@ public class PackageManagerSettingsTests {
settingsUnderTest.mPackages.put(PACKAGE_NAME_3, createPackageSetting(PACKAGE_NAME_3));
// now read and verify
settingsUnderTest.readPackageRestrictionsLPr(0);
- final PackageUserState readPus1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1).
- readUserState(0);
+ final PackageUserState readPus1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1)
+ .readUserState(0);
assertThat(readPus1.suspended, is(true));
assertThat(readPus1.suspendingPackage, equalTo("suspendingPackage1"));
assertThat(readPus1.dialogInfo, equalTo(dialogInfo1));
@@ -235,16 +236,16 @@ public class PackageManagerSettingsTests {
assertThat(BaseBundle.kindofEquals(readPus1.suspendedLauncherExtras, launcherExtras1),
is(true));
- final PackageUserState readPus2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2).
- readUserState(0);
+ final PackageUserState readPus2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2)
+ .readUserState(0);
assertThat(readPus2.suspended, is(true));
assertThat(readPus2.suspendingPackage, equalTo("suspendingPackage2"));
assertThat(readPus2.dialogInfo, is(nullValue()));
assertThat(readPus2.suspendedAppExtras, is(nullValue()));
assertThat(readPus2.suspendedLauncherExtras, is(nullValue()));
- final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3).
- readUserState(0);
+ final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3)
+ .readUserState(0);
assertThat(readPus3.suspended, is(false));
assertThat(readPus3.suspendingPackage, is(nullValue()));
assertThat(readPus3.dialogInfo, is(nullValue()));
@@ -254,11 +255,59 @@ public class PackageManagerSettingsTests {
@Test
public void testPackageRestrictionsSuspendedDefault() {
- final PackageSetting defaultSetting = createPackageSetting(PACKAGE_NAME_1);
+ final PackageSetting defaultSetting = createPackageSetting(PACKAGE_NAME_1);
assertThat(defaultSetting.getSuspended(0), is(false));
}
@Test
+ public void testReadWritePackageRestrictions_distractionFlags() {
+ final Context context = InstrumentationRegistry.getTargetContext();
+ final Settings settingsUnderTest = new Settings(context.getFilesDir(), null, new Object());
+ final PackageSetting ps1 = createPackageSetting(PACKAGE_NAME_1);
+ final PackageSetting ps2 = createPackageSetting(PACKAGE_NAME_2);
+ final PackageSetting ps3 = createPackageSetting(PACKAGE_NAME_3);
+
+ final int distractionFlags1 = PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS;
+ ps1.setDistractionFlags(distractionFlags1, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_1, ps1);
+
+ final int distractionFlags2 = PackageManager.RESTRICTION_HIDE_NOTIFICATIONS
+ | PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS;
+ ps2.setDistractionFlags(distractionFlags2, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_2, ps2);
+
+ final int distractionFlags3 = PackageManager.RESTRICTION_NONE;
+ ps3.setDistractionFlags(distractionFlags3, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_3, ps3);
+
+ settingsUnderTest.writePackageRestrictionsLPr(0);
+
+ settingsUnderTest.mPackages.clear();
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_1, createPackageSetting(PACKAGE_NAME_1));
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_2, createPackageSetting(PACKAGE_NAME_2));
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_3, createPackageSetting(PACKAGE_NAME_3));
+ // now read and verify
+ settingsUnderTest.readPackageRestrictionsLPr(0);
+ final PackageUserState readPus1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1)
+ .readUserState(0);
+ assertThat(readPus1.distractionFlags, is(distractionFlags1));
+
+ final PackageUserState readPus2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2)
+ .readUserState(0);
+ assertThat(readPus2.distractionFlags, is(distractionFlags2));
+
+ final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3)
+ .readUserState(0);
+ assertThat(readPus3.distractionFlags, is(distractionFlags3));
+ }
+
+ @Test
+ public void testPackageRestrictionsDistractionFlagsDefault() {
+ final PackageSetting defaultSetting = createPackageSetting(PACKAGE_NAME_1);
+ assertThat(defaultSetting.getDistractionFlags(0), is(PackageManager.RESTRICTION_NONE));
+ }
+
+ @Test
public void testEnableDisable() {
// Write the package files and make sure they're parsed properly the first time
writeOldFiles();
@@ -692,6 +741,7 @@ public class PackageManagerSettingsTests {
assertThat(userState.notLaunched, is(notLaunched));
assertThat(userState.stopped, is(stopped));
assertThat(userState.suspended, is(false));
+ assertThat(userState.distractionFlags, is(0));
if (oldUserState != null) {
assertThat(userState.equals(oldUserState), is(not(userStateChanged)));
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index ce59e6ec9760..85909d564a7b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -276,6 +276,7 @@ public class PackageParserTest {
assertEquals(a.mRestrictedAccountType, b.mRestrictedAccountType);
assertEquals(a.mRequiredAccountType, b.mRequiredAccountType);
assertEquals(a.mOverlayTarget, b.mOverlayTarget);
+ assertEquals(a.mOverlayTargetName, b.mOverlayTargetName);
assertEquals(a.mOverlayCategory, b.mOverlayCategory);
assertEquals(a.mOverlayPriority, b.mOverlayPriority);
assertEquals(a.mOverlayIsStatic, b.mOverlayIsStatic);
@@ -545,6 +546,7 @@ public class PackageParserTest {
pkg.mOverlayCategory = "foo24";
pkg.mOverlayIsStatic = true;
+ pkg.mOverlayTargetName = "foo26";
pkg.baseHardwareAccelerated = true;
pkg.coreApp = true;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
index f0ed612400ed..8eaf35f6432f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
@@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
+import android.content.pm.PackageManager;
import android.content.pm.PackageUserState;
import android.content.pm.SuspendDialogInfo;
import android.os.PersistableBundle;
@@ -227,4 +228,19 @@ public class PackageUserStateTest {
assertThat(testUserState1.equals(testUserState2), is(true));
}
+ @Test
+ public void testPackageUserState06() {
+ final PackageUserState userState1 = new PackageUserState();
+ assertThat(userState1.distractionFlags, is(PackageManager.RESTRICTION_NONE));
+ userState1.distractionFlags = PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS;
+
+ final PackageUserState copyOfUserState1 = new PackageUserState(userState1);
+ assertThat(userState1.distractionFlags, is(copyOfUserState1.distractionFlags));
+ assertThat(userState1.equals(copyOfUserState1), is(true));
+
+ final PackageUserState userState2 = new PackageUserState(userState1);
+ userState2.distractionFlags = PackageManager.RESTRICTION_HIDE_NOTIFICATIONS;
+ assertThat(userState1.equals(userState2), is(false));
+ }
+
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 9b59f9151fd0..8d0365b534b5 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -248,6 +248,8 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
.setRank(123)
+ .setPerson(makePerson("person", "personKey", "personUri"))
+ .setLongLived()
.setExtras(pb)
.build();
si.addFlags(ShortcutInfo.FLAG_PINNED);
@@ -267,9 +269,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
assertEquals("action", si.getIntent().getAction());
assertEquals("val", si.getIntent().getStringExtra("key"));
assertEquals(123, si.getRank());
+ assertEquals("person", si.getPersons()[0].getName());
+ assertEquals("personKey", si.getPersons()[0].getKey());
+ assertEquals("personUri", si.getPersons()[0].getUri());
assertEquals(1, si.getExtras().getInt("k"));
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
+ assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags());
assertEquals("abc", si.getBitmapPath());
assertEquals(456, si.getIconResourceId());
@@ -345,6 +350,8 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
.setRank(123)
+ .setPerson(makePerson("person", "personKey", "personUri"))
+ .setLongLived()
.setExtras(pb)
.build();
sorig.addFlags(ShortcutInfo.FLAG_PINNED);
@@ -368,9 +375,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
assertEquals("action", si.getIntent().getAction());
assertEquals("val", si.getIntent().getStringExtra("key"));
assertEquals(123, si.getRank());
+ assertEquals("person", si.getPersons()[0].getName());
+ assertEquals("personKey", si.getPersons()[0].getKey());
+ assertEquals("personUri", si.getPersons()[0].getUri());
assertEquals(1, si.getExtras().getInt("k"));
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
+ assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags());
assertEquals("abc", si.getBitmapPath());
assertEquals(456, si.getIconResourceId());
assertEquals("string/r456", si.getIconResName());
@@ -388,9 +398,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
assertEquals("action", si.getIntent().getAction());
assertEquals("val", si.getIntent().getStringExtra("key"));
assertEquals(123, si.getRank());
+ assertEquals("person", si.getPersons()[0].getName());
+ assertEquals("personKey", si.getPersons()[0].getKey());
+ assertEquals("personUri", si.getPersons()[0].getUri());
assertEquals(1, si.getExtras().getInt("k"));
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
+ assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags());
assertEquals(null, si.getBitmapPath());
assertEquals(456, si.getIconResourceId());
@@ -408,9 +421,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
assertEquals(null, si.getIntent());
assertEquals(123, si.getRank());
+ assertEquals("person", si.getPersons()[0].getName());
+ assertEquals("personKey", si.getPersons()[0].getKey());
+ assertEquals("personUri", si.getPersons()[0].getUri());
assertEquals(1, si.getExtras().getInt("k"));
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
+ assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags());
assertEquals(null, si.getBitmapPath());
assertEquals(456, si.getIconResourceId());
@@ -428,9 +444,11 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
assertEquals(null, si.getCategories());
assertEquals(null, si.getIntent());
assertEquals(0, si.getRank());
+ assertEquals(null, si.getPersons());
assertEquals(null, si.getExtras());
- assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
+ assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY
+ | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags());
assertEquals(null, si.getBitmapPath());
assertEquals(456, si.getIconResourceId());
@@ -692,6 +710,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
si = sorig.clone(/* flags=*/ 0);
si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
+ .setPerson(makePerson("person", "", "")).build());
+ assertEquals("text", si.getText());
+ assertEquals("person", si.getPersons()[0].getName());
+
+ si = sorig.clone(/* flags=*/ 0);
+ si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
.setIntent(makeIntent("action2", ShortcutActivity.class)).build());
assertEquals("text", si.getText());
assertEquals("action2", si.getIntent().getAction());
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index 823b7a5ee545..3ebc6ad9b906 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -544,6 +544,18 @@ public class UserManagerTest extends AndroidTestCase {
switchUser(-1, UserHandle.of(startUser), false);
}
+ public void testSwitchUserByHandle_ThrowsException() {
+ synchronized (mUserSwitchLock) {
+ try {
+ ActivityManager am = getContext().getSystemService(ActivityManager.class);
+ am.switchUser(null);
+ fail("Expected IllegalArgumentException on passing in a null UserHandle.");
+ } catch (IllegalArgumentException expected) {
+ // Do nothing - exception is expected.
+ }
+ }
+ }
+
@MediumTest
public void testConcurrentUserCreate() throws Exception {
int userCount = mUserManager.getUserCount();
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
index 3b6b48b6aa3f..f817e8e33b31 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
@@ -77,7 +77,6 @@ public class DexLoggerTests {
@Mock IPackageManager mPM;
@Mock Installer mInstaller;
- private final Object mInstallLock = new Object();
private PackageDynamicCodeLoading mPackageDynamicCodeLoading;
private DexLogger mDexLogger;
@@ -103,7 +102,7 @@ public class DexLoggerTests {
};
// For test purposes capture log messages as well as sending to the event log.
- mDexLogger = new DexLogger(mPM, mInstaller, mInstallLock, mPackageDynamicCodeLoading) {
+ mDexLogger = new DexLogger(mPM, mInstaller, mPackageDynamicCodeLoading) {
@Override
void writeDclEvent(int uid, String message) {
super.writeDclEvent(uid, message);
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
index 813fa8237096..d9faaa418c88 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
@@ -16,8 +16,6 @@
package com.android.server.pm.dex;
-import static com.android.server.pm.PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -31,16 +29,16 @@ import android.util.SparseArray;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import dalvik.system.DelegateLastClassLoader;
import dalvik.system.DexClassLoader;
import dalvik.system.PathClassLoader;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.File;
-import java.util.Arrays;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -412,12 +410,6 @@ public class DexoptUtilsTest {
@Test
public void testEncodeClassLoader() {
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
- SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.PathClassLoader"));
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
- SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DexClassLoader"));
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
- SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DelegateLastClassLoader"));
assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz",
"dalvik.system.PathClassLoader"));
assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz",
@@ -435,15 +427,8 @@ public class DexoptUtilsTest {
@Test
public void testEncodeClassLoaderChain() {
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain(
- SKIP_SHARED_LIBRARY_CHECK, "PCL[a]"));
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]",
- SKIP_SHARED_LIBRARY_CHECK));
assertEquals("PCL[a];DLC[b]", DexoptUtils.encodeClassLoaderChain("PCL[a]",
"DLC[b]"));
- assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]",
- SKIP_SHARED_LIBRARY_CHECK));
-
try {
DexoptUtils.encodeClassLoaderChain("a", null);
fail(); // exception is expected
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 561c61fb979f..0dff03f2f53e 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -47,6 +47,7 @@ import com.android.server.lights.LightsManager;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.power.PowerManagerService.Injector;
import com.android.server.power.PowerManagerService.NativeWrapper;
+import com.android.server.power.batterysaver.BatterySaverPolicy;
import com.android.server.power.batterysaver.BatterySavingStats;
import org.junit.Rule;
diff --git a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
index acf511e38738..73eefcf618b0 100644
--- a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.power.batterysaver;
import static com.google.common.truth.Truth.assertThat;
@@ -31,13 +31,12 @@ import android.util.ArrayMap;
import com.android.frameworks.servicestests.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
-import com.android.server.power.batterysaver.BatterySavingStats;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
- * Tests for {@link com.android.server.power.BatterySaverPolicy}
+ * Tests for {@link com.android.server.power.batterysaver.BatterySaverPolicy}
*/
public class BatterySaverPolicyTest extends AndroidTestCase {
private static final boolean BATTERY_SAVER_ON = true;
@@ -62,7 +61,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
private class BatterySaverPolicyForTest extends BatterySaverPolicy {
- public BatterySaverPolicyForTest(Object lock, Context context,
+ BatterySaverPolicyForTest(Object lock, Context context,
BatterySavingStats batterySavingStats) {
super(lock, context, batterySavingStats);
}
@@ -269,15 +268,15 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
mBatterySaverPolicy.onChange();
assertThat(mBatterySaverPolicy.getFileValues(true).toString()).isEqualTo("{}");
assertThat(mBatterySaverPolicy.getFileValues(false).toString())
- .isEqualTo("{/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq=123, " +
- "/sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq=456}");
+ .isEqualTo("{/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq=123, "
+ + "/sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq=456}");
mDeviceSpecificConfigResId = R.string.config_batterySaverDeviceSpecificConfig_3;
mBatterySaverPolicy.onChange();
assertThat(mBatterySaverPolicy.getFileValues(true).toString())
- .isEqualTo("{/sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq=333, " +
- "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq=444}");
+ .isEqualTo("{/sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq=333, "
+ + "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq=444}");
assertThat(mBatterySaverPolicy.getFileValues(false).toString())
.isEqualTo("{/sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq=222}");
@@ -287,9 +286,9 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
mBatterySaverPolicy.onChange();
assertThat(mBatterySaverPolicy.getFileValues(true).toString())
- .isEqualTo("{/sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq=1234567890, " +
- "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq=14, " +
- "/sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq=15}");
+ .isEqualTo("{/sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq=1234567890, "
+ + "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq=14, "
+ + "/sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq=15}");
assertThat(mBatterySaverPolicy.getFileValues(false).toString()).isEqualTo("{}");
}
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 41d569106922..8171469d4da4 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -61,6 +61,7 @@ import android.util.ArraySet;
import android.view.Display;
import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -416,6 +417,7 @@ public class AppStandbyControllerTests {
}
@Test
+ @FlakyTest(bugId = 119774928)
public void testEnabledState() throws Exception {
TestParoleListener paroleListener = new TestParoleListener();
mController.addListener(paroleListener);
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 8496a961959d..b348aeef802e 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -699,10 +699,52 @@ public class AppTimeLimitControllerTests {
assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
}
+ /** Verify the timeout message is delivered at the right time after past usage was reported */
+ @Test
+ public void testAppUsageObserver_PastUsage() throws Exception {
+ setTime(10_000L);
+ addAppUsageObserver(OBS_ID1, GROUP1, 6_000L);
+ setTime(20_000L);
+ startPastUsage(PKG_SOC1, 5_000);
+ setTime(21_000L);
+ assertTrue(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Verify that the observer was removed
+ assertFalse(hasAppUsageObserver(UID, OBS_ID1));
+ }
+
+ /**
+ * Verify the timeout message is delivered at the right time after past usage was reported
+ * that overlaps with already known usage
+ */
+ @Test
+ public void testAppUsageObserver_PastUsageOverlap() throws Exception {
+ setTime(0L);
+ addAppUsageObserver(OBS_ID1, GROUP1, 20_000L);
+ setTime(10_000L);
+ startUsage(PKG_SOC1);
+ setTime(20_000L);
+ stopUsage(PKG_SOC1);
+ setTime(25_000L);
+ startPastUsage(PKG_SOC1, 9_000);
+ setTime(26_000L);
+ // the 4 seconds of overlapped usage should not be counted
+ assertFalse(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
+ setTime(30_000L);
+ assertTrue(mLimitReachedLatch.await(4_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Verify that the observer was removed
+ assertFalse(hasAppUsageObserver(UID, OBS_ID1));
+ }
+
private void startUsage(String packageName) {
mController.noteUsageStart(packageName, USER_ID);
}
+ private void startPastUsage(String packageName, int timeAgo) {
+ mController.noteUsageStart(packageName, USER_ID, timeAgo);
+ }
+
private void stopUsage(String packageName) {
mController.noteUsageStop(packageName, USER_ID);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index 8b65e763b088..20f72bfe9938 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -613,7 +613,7 @@ public class ManagedServicesTest extends UiServiceTestCase {
}
@Test
- public void testGetAllowedPackages() throws Exception {
+ public void testGetAllowedPackages_byUser() throws Exception {
for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
mIpm, approvalLevel);
@@ -681,6 +681,30 @@ public class ManagedServicesTest extends UiServiceTestCase {
}
@Test
+ public void testGetAllowedPackages() throws Exception {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, APPROVAL_BY_COMPONENT);
+ loadXml(service);
+ service.mApprovalLevel = APPROVAL_BY_PACKAGE;
+ loadXml(service);
+
+ List<String> allowedPackages = new ArrayList<>();
+ allowedPackages.add("this.is.a.package.name");
+ allowedPackages.add("another.package");
+ allowedPackages.add("secondary");
+ allowedPackages.add("this.is.another.package");
+ allowedPackages.add("package");
+ allowedPackages.add("component");
+ allowedPackages.add("bananas!");
+
+ Set<String> actual = service.getAllowedPackages();
+ assertEquals(allowedPackages.size(), actual.size());
+ for (String pkg : allowedPackages) {
+ assertTrue(actual.contains(pkg));
+ }
+ }
+
+ @Test
public void testOnUserRemoved() throws Exception {
for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 83c1c7670338..94b21af65799 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -3511,9 +3511,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
- public void testAppOverlay() throws Exception {
- mBinderService.setAppOverlaysAllowed(PKG, mUid, false);
- assertFalse(mBinderService.areAppOverlaysAllowedForPackage(PKG, mUid));
+ public void testBubble() throws Exception {
+ mBinderService.setBubblesAllowed(PKG, mUid, false);
+ assertFalse(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
}
@Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index 65e640f5f73c..b9ae7d5e3f93 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -56,8 +56,8 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.Adjustment;
import android.service.notification.StatusBarNotification;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.R;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -87,14 +87,7 @@ public class NotificationRecordTest extends UiServiceTestCase {
private final String channelId = "channel";
private NotificationChannel channel =
new NotificationChannel(channelId, "test", NotificationManager.IMPORTANCE_DEFAULT);
- private final String channelIdLong =
- "give_a_developer_a_string_argument_and_who_knows_what_they_will_pass_in_there";
private final String groupId = "group";
- private final String groupIdOverride = "other_group";
- private final String groupIdLong =
- "0|com.foo.bar|g:content://com.foo.bar.ui/account%3A-0000000/account/";
- private NotificationChannel channelLongId =
- new NotificationChannel(channelIdLong, "long", NotificationManager.IMPORTANCE_DEFAULT);
private NotificationChannel defaultChannel =
new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "test",
NotificationManager.IMPORTANCE_UNSPECIFIED);
@@ -408,73 +401,27 @@ public class NotificationRecordTest extends UiServiceTestCase {
}
@Test
- public void testLogmakerShortChannel() {
+ public void testLogMaker() {
+ long timestamp = 1000L;
StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /* defaultLights */, null /* group */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
- final LogMaker logMaker = record.getLogMaker();
+ final LogMaker logMaker = record.getLogMaker(timestamp);
+
+ assertNull(logMaker.getTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX));
assertEquals(channelId,
(String) logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID));
assertEquals(channel.getImportance(),
logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_IMPORTANCE));
- }
-
- @Test
- public void testLogmakerLongChannel() {
- StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
- true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
- false /* lights */, false /*defaultLights */, null /* group */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channelLongId);
- final String loggedId = (String)
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID);
- assertEquals(channelIdLong.substring(0,10), loggedId.substring(0, 10));
- }
-
- @Test
- public void testLogmakerNoGroup() {
- StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
- true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
- false /* lights */, false /*defaultLights */, null /* group */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
- assertNull(record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
- }
-
- @Test
- public void testLogmakerShortGroup() {
- StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
- true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
- false /* lights */, false /* defaultLights */, groupId /* group */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
- assertEquals(groupId,
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
- }
-
- @Test
- public void testLogmakerLongGroup() {
- StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
- true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
- false /* lights */, false /* defaultLights */, groupIdLong /* group */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
- final String loggedId = (String)
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID);
- assertEquals(groupIdLong.substring(0,10), loggedId.substring(0, 10));
- }
-
- @Test
- public void testLogmakerOverrideGroup() {
- StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
- true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
- false /* lights */, false /* defaultLights */, groupId /* group */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
- assertEquals(groupId,
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
- record.setOverrideGroupKey(groupIdOverride);
- assertEquals(groupIdOverride,
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
- record.setOverrideGroupKey(null);
- assertEquals(groupId,
- record.getLogMaker().getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+ assertEquals(record.getLifespanMs(timestamp),
+ (int) logMaker.getTaggedData(MetricsEvent.NOTIFICATION_SINCE_CREATE_MILLIS));
+ assertEquals(record.getFreshnessMs(timestamp),
+ (int) logMaker.getTaggedData(MetricsEvent.NOTIFICATION_SINCE_UPDATE_MILLIS));
+ assertEquals(record.getExposureMs(timestamp),
+ (int) logMaker.getTaggedData(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS));
+ assertEquals(record.getInterruptionMs(timestamp),
+ (int) logMaker.getTaggedData(MetricsEvent.NOTIFICATION_SINCE_INTERRUPTION_MILLIS));
}
@Test
@@ -825,4 +772,72 @@ public class NotificationRecordTest extends UiServiceTestCase {
assertNotEquals(-1, record.getLastAudiblyAlertedMs());
}
+
+ @Test
+ public void testIsNewEnoughForAlerting_new() {
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ assertTrue(record.isNewEnoughForAlerting(record.mUpdateTimeMs));
+ }
+
+ @Test
+ public void testIsNewEnoughForAlerting_old() {
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ assertFalse(record.isNewEnoughForAlerting(record.mUpdateTimeMs + (1000 * 60 * 60)));
+ }
+
+ @Test
+ public void testIgnoreImportanceAdjustmentsForOemLockedChannels() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ channel.setImportanceLockedByOEM(true);
+
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ assertEquals(IMPORTANCE_DEFAULT, record.getImportance());
+
+ Bundle bundle = new Bundle();
+ bundle.putInt(Adjustment.KEY_IMPORTANCE, IMPORTANCE_LOW);
+ Adjustment adjustment = new Adjustment(
+ PKG_O, record.getKey(), bundle, "", record.getUserId());
+
+ record.addAdjustment(adjustment);
+ record.applyAdjustments();
+ record.calculateImportance();
+
+ assertEquals(IMPORTANCE_DEFAULT, record.getImportance());
+ }
+
+ @Test
+ public void testApplyImportanceAdjustmentsForNonOemLockedChannels() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ channel.setImportanceLockedByOEM(false);
+
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ assertEquals(IMPORTANCE_DEFAULT, record.getImportance());
+
+ Bundle bundle = new Bundle();
+ bundle.putInt(Adjustment.KEY_IMPORTANCE, IMPORTANCE_LOW);
+ Adjustment adjustment = new Adjustment(
+ PKG_O, record.getKey(), bundle, "", record.getUserId());
+
+ record.addAdjustment(adjustment);
+ record.applyAdjustments();
+ record.calculateImportance();
+
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 0b7348194b26..24a1f8c19f12 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -809,7 +809,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
channel.setShowBadge(true);
- channel.setAllowAppOverlay(false);
+ channel.setAllowBubbles(false);
int lockMask = 0;
for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
@@ -826,7 +826,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertFalse(savedChannel.canBypassDnd());
assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
- assertEquals(channel.canOverlayApps(), savedChannel.canOverlayApps());
+ assertEquals(channel.canBubble(), savedChannel.canBubble());
verify(mHandler, never()).requestSort();
}
@@ -840,7 +840,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
channel.setShowBadge(true);
- channel.setAllowAppOverlay(false);
+ channel.setAllowBubbles(false);
int lockMask = 0;
for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
@@ -857,7 +857,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertFalse(savedChannel.canBypassDnd());
assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
- assertEquals(channel.canOverlayApps(), savedChannel.canOverlayApps());
+ assertEquals(channel.canBubble(), savedChannel.canBubble());
}
@Test
@@ -969,16 +969,16 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
- public void testLockFields_appOverlay() {
+ public void testLockFields_allowBubble() {
mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, getChannel(), true, false);
assertEquals(0,
mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, getChannel().getId(), false)
.getUserLockedFields());
final NotificationChannel update = getChannel();
- update.setAllowAppOverlay(false);
+ update.setAllowBubbles(false);
mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, update, true);
- assertEquals(NotificationChannel.USER_LOCKED_ALLOW_APP_OVERLAY,
+ assertEquals(NotificationChannel.USER_LOCKED_ALLOW_BUBBLE,
mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, update.getId(), false)
.getUserLockedFields());
}
@@ -2161,30 +2161,147 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
- public void testAllowAppOverlay_defaults() throws Exception {
- assertTrue(mHelper.areAppOverlaysAllowed(PKG_O, UID_O));
+ public void testAllowBubbles_defaults() throws Exception {
+ assertTrue(mHelper.areBubblessAllowed(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
loadStreamXml(baos, false);
- assertTrue(mHelper.areAppOverlaysAllowed(PKG_O, UID_O));
+ assertTrue(mHelper.areBubblessAllowed(PKG_O, UID_O));
assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
}
@Test
- public void testAllowAppOverlay_xml() throws Exception {
- mHelper.setAppOverlaysAllowed(PKG_O, UID_O, false);
- assertFalse(mHelper.areAppOverlaysAllowed(PKG_O, UID_O));
- assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_APP_OVERLAY,
+ public void testAllowBubbles_xml() throws Exception {
+ mHelper.setBubblesAllowed(PKG_O, UID_O, false);
+ assertFalse(mHelper.areBubblessAllowed(PKG_O, UID_O));
+ assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
mHelper.getAppLockedFields(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
loadStreamXml(baos, false);
- assertFalse(mHelper.areAppOverlaysAllowed(PKG_O, UID_O));
- assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_APP_OVERLAY,
+ assertFalse(mHelper.areBubblessAllowed(PKG_O, UID_O));
+ assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
mHelper.getAppLockedFields(PKG_O, UID_O));
}
+
+ @Test
+ public void testLockChannelsForOEM_emptyList() {
+ mHelper.lockChannelsForOEM(null);
+ mHelper.lockChannelsForOEM(new String[0]);
+ // no exception
+ }
+
+ @Test
+ public void testLockChannelsForOEM_appWide() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_LOW);
+ NotificationChannel c = new NotificationChannel("c", "c", IMPORTANCE_DEFAULT);
+ // different uids, same package
+ mHelper.createNotificationChannel(PKG_O, 3, a, true, false);
+ mHelper.createNotificationChannel(PKG_O, 3, b, false, false);
+ mHelper.createNotificationChannel(PKG_O, 30, c, true, true);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O});
+
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, a.getId(), false)
+ .isImportanceLockedByOEM());
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, b.getId(), false)
+ .isImportanceLockedByOEM());
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 30, c.getId(), false)
+ .isImportanceLockedByOEM());
+ }
+
+ @Test
+ public void testLockChannelsForOEM_onlyGivenPkg() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG_O, 3, a, true, false);
+ mHelper.createNotificationChannel(PKG_N_MR1, 30, b, false, false);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O});
+
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, a.getId(), false)
+ .isImportanceLockedByOEM());
+ assertFalse(mHelper.getNotificationChannel(PKG_N_MR1, 30, b.getId(), false)
+ .isImportanceLockedByOEM());
+ }
+
+ @Test
+ public void testLockChannelsForOEM_channelSpecific() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_LOW);
+ NotificationChannel c = new NotificationChannel("c", "c", IMPORTANCE_DEFAULT);
+ // different uids, same package
+ mHelper.createNotificationChannel(PKG_O, 3, a, true, false);
+ mHelper.createNotificationChannel(PKG_O, 3, b, false, false);
+ mHelper.createNotificationChannel(PKG_O, 30, c, true, true);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O + ":b", PKG_O + ":c"});
+
+ assertFalse(mHelper.getNotificationChannel(PKG_O, 3, a.getId(), false)
+ .isImportanceLockedByOEM());
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, b.getId(), false)
+ .isImportanceLockedByOEM());
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 30, c.getId(), false)
+ .isImportanceLockedByOEM());
+ }
+
+ @Test
+ public void testLockChannelsForOEM_channelDoesNotExistYet_appWide() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG_O, 3, a, true, false);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O});
+
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, a.getId(), false)
+ .isImportanceLockedByOEM());
+
+ mHelper.createNotificationChannel(PKG_O, 3, b, true, false);
+ assertTrue(mHelper.getNotificationChannel(PKG_O, 3, b.getId(), false)
+ .isImportanceLockedByOEM());
+ }
+
+ @Test
+ public void testLockChannelsForOEM_channelDoesNotExistYet_channelSpecific() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG_O, UID_O, a, true, false);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O + ":a", PKG_O + ":b"});
+
+ assertTrue(mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false)
+ .isImportanceLockedByOEM());
+
+ mHelper.createNotificationChannel(PKG_O, UID_O, b, true, false);
+ assertTrue(mHelper.getNotificationChannel(PKG_O, UID_O, b.getId(), false)
+ .isImportanceLockedByOEM());
+ }
+
+ @Test
+ public void testUpdateNotificationChannel_oemLockedImportance() {
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(PKG_O, UID_O, a, true, false);
+
+ mHelper.lockChannelsForOEM(new String[] {PKG_O});
+
+ NotificationChannel update = new NotificationChannel("a", "a", IMPORTANCE_NONE);
+ update.setAllowBubbles(false);
+
+ mHelper.updateNotificationChannel(PKG_O, UID_O, update, true);
+
+ assertEquals(IMPORTANCE_HIGH,
+ mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).getImportance());
+ assertEquals(false,
+ mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).canBubble());
+
+ mHelper.updateNotificationChannel(PKG_O, UID_O, update, true);
+
+ assertEquals(IMPORTANCE_HIGH,
+ mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).getImportance());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 5638cb360c78..c79e1db0a745 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -15,8 +15,11 @@
*/
package com.android.server.notification;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static junit.framework.TestCase.assertEquals;
+
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.anyInt;
@@ -153,7 +156,7 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
mRecordGroupGSortA = new NotificationRecord(mContext, new StatusBarNotification(
PKG, PKG, 1, null, 0, 0, mNotiGroupGSortA, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getLowChannel());
mNotiGroupGSortB = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("B")
@@ -163,7 +166,7 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
mRecordGroupGSortB = new NotificationRecord(mContext, new StatusBarNotification(
PKG, PKG, 1, null, 0, 0, mNotiGroupGSortB, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroup = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("C")
@@ -171,7 +174,7 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
mRecordNoGroup = new NotificationRecord(mContext, new StatusBarNotification(
PKG, PKG, 1, null, 0, 0, mNotiNoGroup, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroup2 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("D")
@@ -179,7 +182,7 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
mRecordNoGroup2 = new NotificationRecord(mContext, new StatusBarNotification(
PKG, PKG, 1, null, 0, 0, mNotiNoGroup2, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroupSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("E")
@@ -188,7 +191,7 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
mRecordNoGroupSortA = new NotificationRecord(mContext, new StatusBarNotification(
PKG, PKG, 1, null, 0, 0, mNotiNoGroupSortA, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getLowChannel());
mAudioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
@@ -197,11 +200,16 @@ public class RankingHelperTest extends UiServiceTestCase {
.build();
}
- private NotificationChannel getDefaultChannel() {
+ private NotificationChannel getLowChannel() {
return new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "name",
IMPORTANCE_LOW);
}
+ private NotificationChannel getDefaultChannel() {
+ return new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "name",
+ IMPORTANCE_DEFAULT);
+ }
+
@Test
public void testSortShouldRespectCritical() throws Exception {
ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(7);
@@ -285,4 +293,40 @@ public class RankingHelperTest extends UiServiceTestCase {
ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>();
mHelper.sort(notificationList);
}
+
+ @Test
+ public void testGroupNotifications_highestIsProxy() {
+ ArrayList<NotificationRecord> notificationList = new ArrayList<>();
+ // this should be the last in the list, except it's in a group with a high child
+ Notification lowSummaryN = new Notification.Builder(mContext, "")
+ .setGroup("group")
+ .setGroupSummary(true)
+ .build();
+ NotificationRecord lowSummary = new NotificationRecord(mContext, new StatusBarNotification(
+ PKG, PKG, 1, "summary", 0, 0, lowSummaryN, USER,
+ null, System.currentTimeMillis()), getLowChannel());
+ notificationList.add(lowSummary);
+
+ Notification lowN = new Notification.Builder(mContext, "").build();
+ NotificationRecord low = new NotificationRecord(mContext, new StatusBarNotification(
+ PKG, PKG, 1, "low", 0, 0, lowN, USER,
+ null, System.currentTimeMillis()), getLowChannel());
+ low.setContactAffinity(0.5f);
+ notificationList.add(low);
+
+ Notification highChildN = new Notification.Builder(mContext, "")
+ .setGroup("group")
+ .setGroupSummary(false)
+ .build();
+ NotificationRecord highChild = new NotificationRecord(mContext, new StatusBarNotification(
+ PKG, PKG, 1, "child", 0, 0, highChildN, USER,
+ null, System.currentTimeMillis()), getDefaultChannel());
+ notificationList.add(highChild);
+
+ mHelper.sort(notificationList);
+
+ assertEquals(lowSummary, notificationList.get(0));
+ assertEquals(highChild, notificationList.get(1));
+ assertEquals(low, notificationList.get(2));
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
index 49f134fdeac0..174c5fa6a51e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
@@ -299,6 +299,59 @@ public class SnoozeHelperTest extends UiServiceTestCase {
assertEquals(1, mSnoozeHelper.getSnoozed(UserHandle.USER_SYSTEM, "pkg").size());
}
+ @Test
+ public void testClearData() {
+ // snooze 2 from same package
+ NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
+
+ // clear data
+ mSnoozeHelper.clearData(UserHandle.USER_SYSTEM, "pkg");
+
+ // nothing snoozed; alarms canceled
+ assertFalse(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ assertFalse(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
+ // twice for initial snooze, twice for canceling the snooze
+ verify(mAm, times(4)).cancel(any(PendingIntent.class));
+ }
+
+ @Test
+ public void testClearData_otherRecordsUntouched() {
+ // 2 packages, 2 users
+ NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL);
+ NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ mSnoozeHelper.snooze(r3, 1000);
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_ALL, r2.sbn.getPackageName(), r2.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
+
+ // clear data
+ mSnoozeHelper.clearData(UserHandle.USER_SYSTEM, "pkg");
+
+ assertFalse(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_ALL, r2.sbn.getPackageName(), r2.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
+ // once for each initial snooze, once for canceling one snooze
+ verify(mAm, times(4)).cancel(any(PendingIntent.class));
+ }
+
private NotificationRecord getNotificationRecord(String pkg, int id, String tag,
UserHandle user, String groupKey, boolean groupSummary) {
Notification n = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
index b315e514d6a6..efefee119e5f 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
@@ -16,6 +16,7 @@ package com.android.server.slice;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import android.content.ContentProvider;
import android.content.ContentResolver;
@@ -26,6 +27,7 @@ import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import android.util.Log;
import android.util.Xml.Encoding;
import com.android.server.UiServiceTestCase;
@@ -46,10 +48,12 @@ import java.io.IOException;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
public class SlicePermissionManagerTest extends UiServiceTestCase {
+ private static final String TAG = "SlicePerManTest";
@Test
public void testGrant() {
- File sliceDir = new File(mContext.getDataDir(), "system/slices");
+ File sliceDir = new File(mContext.getCacheDir(), "testGrantSlices");
+ Log.v(TAG, "testGrant: slice permissions stored in " + sliceDir.getAbsolutePath());
SlicePermissionManager permissions = new SlicePermissionManager(mContext,
TestableLooper.get(this).getLooper(), sliceDir);
Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
@@ -59,11 +63,15 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
permissions.grantSliceAccess("my.pkg", 0, "provider.pkg", 0, uri);
assertTrue(permissions.hasPermission("my.pkg", 0, uri));
+
+ // Cleanup.
+ assertTrue(FileUtils.deleteContentsAndDir(sliceDir));
}
@Test
public void testBackup() throws XmlPullParserException, IOException {
- File sliceDir = new File(mContext.getDataDir(), "system/slices");
+ File sliceDir = new File(mContext.getCacheDir(), "testBackupSlices");
+ Log.v(TAG, "testBackup: slice permissions stored in " + sliceDir.getAbsolutePath());
Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority("authority")
.path("something").build();
@@ -90,7 +98,10 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
TestableLooper.get(this).getLooper());
permissions.readRestore(parser);
- assertTrue(permissions.hasFullAccess("com.android.mypkg", 10));
+ if (!permissions.hasFullAccess("com.android.mypkg", 10)) {
+ fail("com.android.mypkg@10 did not have full access. backup file: "
+ + output.toString());
+ }
assertTrue(permissions.hasPermission("com.android.otherpkg", 0,
ContentProvider.maybeAddUserId(uri, 1)));
permissions.removePkg("com.android.lastpkg", 1);
@@ -102,8 +113,9 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
}
@Test
- public void testInvalid() throws Exception {
- File sliceDir = new File(mContext.getCacheDir(), "slices-test");
+ public void testInvalid() {
+ File sliceDir = new File(mContext.getCacheDir(), "testInvalidSlices");
+ Log.v(TAG, "testInvalid: slice permissions stored in " + sliceDir.getAbsolutePath());
if (!sliceDir.exists()) {
sliceDir.mkdir();
}
@@ -118,7 +130,8 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
@Override
public void writeTo(XmlSerializer out) throws IOException {
- throw new RuntimeException("this doesn't work");
+ throw new RuntimeException("this RuntimeException inside junk.writeTo() "
+ + "should be caught and suppressed by surrounding code");
}
};
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
index 5bf3d2dabe24..56f4a8544f00 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
@@ -36,6 +36,9 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import android.platform.test.annotations.Presubmit;
@@ -54,11 +57,6 @@ import org.junit.Test;
@Presubmit
public class ActivityDisplayTests extends ActivityTestsBase {
- @Before
- public void setUp() throws Exception {
- setupActivityTaskManagerService();
- }
-
@Test
public void testLastFocusedStackIsUpdatedWhenMovingStack() {
// Create a stack at bottom.
@@ -277,4 +275,60 @@ public class ActivityDisplayTests extends ActivityTestsBase {
assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop());
assertEquals(anotherAlwaysOnTopStack, display.getChildAt(topPosition - 1));
}
+
+ @Test
+ public void testRemoveStackInWindowingModes() {
+ removeStackTests(() -> mRootActivityContainer.removeStacksInWindowingModes(
+ WINDOWING_MODE_FULLSCREEN));
+ }
+
+ @Test
+ public void testRemoveStackWithActivityTypes() {
+ removeStackTests(
+ () -> mRootActivityContainer.removeStacksWithActivityTypes(ACTIVITY_TYPE_STANDARD));
+ }
+
+ private void removeStackTests(Runnable runnable) {
+ final ActivityDisplay display = mRootActivityContainer.getDefaultDisplay();
+ final ActivityStack stack1 = display.createStack(WINDOWING_MODE_FULLSCREEN,
+ ACTIVITY_TYPE_STANDARD, ON_TOP);
+ final ActivityStack stack2 = display.createStack(WINDOWING_MODE_FULLSCREEN,
+ ACTIVITY_TYPE_STANDARD, ON_TOP);
+ final ActivityStack stack3 = display.createStack(WINDOWING_MODE_FULLSCREEN,
+ ACTIVITY_TYPE_STANDARD, ON_TOP);
+ final ActivityStack stack4 = display.createStack(WINDOWING_MODE_FULLSCREEN,
+ ACTIVITY_TYPE_STANDARD, ON_TOP);
+ final TaskRecord task1 = new TaskBuilder(mService.mStackSupervisor).setStack(
+ stack1).setTaskId(1).build();
+ final TaskRecord task2 = new TaskBuilder(mService.mStackSupervisor).setStack(
+ stack2).setTaskId(2).build();
+ final TaskRecord task3 = new TaskBuilder(mService.mStackSupervisor).setStack(
+ stack3).setTaskId(3).build();
+ final TaskRecord task4 = new TaskBuilder(mService.mStackSupervisor).setStack(
+ stack4).setTaskId(4).build();
+
+ // Reordering stacks while removing stacks.
+ doAnswer(invocation -> {
+ display.positionChildAtTop(stack3, false);
+ return true;
+ }).when(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(),
+ any());
+
+ // Removing stacks from the display while removing stacks.
+ doAnswer(invocation -> {
+ display.removeChild(stack2);
+ return true;
+ }).when(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(),
+ any());
+
+ runnable.run();
+ verify(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(),
+ any());
+ verify(mSupervisor).removeTaskByIdLocked(eq(task3.taskId), anyBoolean(), anyBoolean(),
+ any());
+ verify(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(),
+ any());
+ verify(mSupervisor).removeTaskByIdLocked(eq(task1.taskId), anyBoolean(), anyBoolean(),
+ any());
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
index cac9cf69ce4d..ee228610ab21 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
@@ -70,8 +70,6 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
@Before
public void setUpAMLO() throws Exception {
- setupActivityTaskManagerService();
-
mLaunchObserver = mock(ActivityMetricsLaunchObserver.class);
// ActivityStackSupervisor always creates its own instance of ActivityMetricsLogger.
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index b6f181758d3a..319ffed3778c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -19,13 +19,19 @@ package com.android.server.wm;
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_BOTTOM;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_RIGHT;
import static com.android.server.wm.ActivityStack.ActivityState.INITIALIZING;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_MOVING;
@@ -36,10 +42,14 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.app.ActivityOptions;
+import android.app.servertransaction.ActivityConfigurationChangeItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.PauseActivityItem;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
+import android.util.MergedConfiguration;
import android.util.MutableBoolean;
import androidx.test.filters.MediumTest;
@@ -63,10 +73,12 @@ public class ActivityRecordTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
- mStack = new StackBuilder(mRootActivityContainer).build();
+ mStack = (TestActivityStack) new StackBuilder(mRootActivityContainer).build();
mTask = mStack.getChildAt(0);
mActivity = mTask.getTopActivity();
+
+ doReturn(false).when(mService).isBooting();
+ doReturn(true).when(mService).isBooted();
}
@Test
@@ -109,22 +121,23 @@ public class ActivityRecordTests extends ActivityTestsBase {
mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped");
- // The activity is in the focused stack so it should not move to paused.
+ // The activity is in the focused stack so it should be resumed.
mActivity.makeVisibleIfNeeded(null /* starting */, true /* reportToClient */);
- assertTrue(mActivity.isState(STOPPED));
+ assertTrue(mActivity.isState(RESUMED));
assertFalse(pauseFound.value);
- // Clear focused stack
- final ActivityDisplay display = mRootActivityContainer.getDefaultDisplay();
- when(display.getFocusedStack()).thenReturn(null);
+ // Make the activity non focusable
+ mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped");
+ doReturn(false).when(mActivity).isFocusable();
- // In the unfocused stack, the activity should move to paused.
+ // If the activity is not focusable, it should move to paused.
mActivity.makeVisibleIfNeeded(null /* starting */, true /* reportToClient */);
assertTrue(mActivity.isState(PAUSING));
assertTrue(pauseFound.value);
// Make sure that the state does not change for current non-stopping states.
mActivity.setState(INITIALIZING, "testPausingWhenVisibleFromStopped");
+ doReturn(true).when(mActivity).isFocusable();
mActivity.makeVisibleIfNeeded(null /* starting */, true /* reportToClient */);
@@ -210,4 +223,149 @@ public class ActivityRecordTests extends ActivityTestsBase {
assertNull(mActivity.pendingOptions);
assertNotNull(activity2.pendingOptions);
}
+
+ @Test
+ public void testNewOverrideConfigurationIncrementsSeq() {
+ final Configuration newConfig = new Configuration();
+
+ final int prevSeq = mActivity.getMergedOverrideConfiguration().seq;
+ mActivity.onRequestedOverrideConfigurationChanged(newConfig);
+ assertEquals(prevSeq + 1, mActivity.getMergedOverrideConfiguration().seq);
+ }
+
+ @Test
+ public void testNewParentConfigurationIncrementsSeq() {
+ final Configuration newConfig = new Configuration(
+ mTask.getRequestedOverrideConfiguration());
+ newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
+ ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT;
+
+ final int prevSeq = mActivity.getMergedOverrideConfiguration().seq;
+ mTask.onRequestedOverrideConfigurationChanged(newConfig);
+ assertEquals(prevSeq + 1, mActivity.getMergedOverrideConfiguration().seq);
+ }
+
+ @Test
+ public void testNotifiesSeqIncrementToAppToken() {
+ final Configuration appWindowTokenRequestedOrientation = mock(Configuration.class);
+ mActivity.mAppWindowToken = mock(AppWindowToken.class);
+ doReturn(appWindowTokenRequestedOrientation).when(mActivity.mAppWindowToken)
+ .getRequestedOverrideConfiguration();
+
+ final Configuration newConfig = new Configuration();
+ newConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
+
+ final int prevSeq = mActivity.getMergedOverrideConfiguration().seq;
+ mActivity.onRequestedOverrideConfigurationChanged(newConfig);
+ assertEquals(prevSeq + 1, appWindowTokenRequestedOrientation.seq);
+ verify(mActivity.mAppWindowToken).onMergedOverrideConfigurationChanged();
+ }
+
+ @Test
+ public void testSetsRelaunchReason_NotDragResizing() {
+ mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing");
+
+ mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration());
+ mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
+ mActivity.getConfiguration()));
+
+ mActivity.info.configChanges &= ~ActivityInfo.CONFIG_ORIENTATION;
+ final Configuration newConfig = new Configuration(mTask.getConfiguration());
+ newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
+ ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT;
+ mTask.onRequestedOverrideConfigurationChanged(newConfig);
+
+ mActivity.mRelaunchReason = ActivityTaskManagerService.RELAUNCH_REASON_NONE;
+
+ mActivity.ensureActivityConfiguration(0, false, false);
+
+ assertEquals(ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE,
+ mActivity.mRelaunchReason);
+ }
+
+ @Test
+ public void testSetsRelaunchReason_DragResizing() {
+ mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing");
+
+ mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration());
+ mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
+ mActivity.getConfiguration()));
+
+ mActivity.info.configChanges &= ~ActivityInfo.CONFIG_ORIENTATION;
+ final Configuration newConfig = new Configuration(mTask.getConfiguration());
+ newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
+ ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT;
+ mTask.onRequestedOverrideConfigurationChanged(newConfig);
+
+ doReturn(true).when(mTask.getTask()).isDragResizing();
+
+ mActivity.mRelaunchReason = ActivityTaskManagerService.RELAUNCH_REASON_NONE;
+
+ mActivity.ensureActivityConfiguration(0, false, false);
+
+ assertEquals(ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE,
+ mActivity.mRelaunchReason);
+ }
+
+ @Test
+ public void testSetsRelaunchReason_NonResizeConfigChanges() {
+ mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing");
+
+ mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration());
+ mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
+ mActivity.getConfiguration()));
+
+ mActivity.info.configChanges &= ~ActivityInfo.CONFIG_FONT_SCALE;
+ final Configuration newConfig = new Configuration(mTask.getConfiguration());
+ newConfig.fontScale = 5;
+ mTask.onRequestedOverrideConfigurationChanged(newConfig);
+
+ mActivity.mRelaunchReason =
+ ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
+
+ mActivity.ensureActivityConfiguration(0, false, false);
+
+ assertEquals(ActivityTaskManagerService.RELAUNCH_REASON_NONE,
+ mActivity.mRelaunchReason);
+ }
+
+ @Test
+ public void testSetRequestedOrientationUpdatesConfiguration() throws Exception {
+ mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing");
+
+ mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration());
+ mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
+ mActivity.getConfiguration()));
+
+ mActivity.info.configChanges |= ActivityInfo.CONFIG_ORIENTATION;
+ final Configuration newConfig = new Configuration(mActivity.getConfiguration());
+ newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
+ ? Configuration.ORIENTATION_LANDSCAPE
+ : Configuration.ORIENTATION_PORTRAIT;
+
+ // Mimic the behavior that display doesn't handle app's requested orientation.
+ doAnswer(invocation -> {
+ mTask.onConfigurationChanged(newConfig);
+ return null;
+ }).when(mActivity.mAppWindowToken).setOrientation(anyInt(), any(), any());
+
+ final int requestedOrientation;
+ switch (newConfig.orientation) {
+ case Configuration.ORIENTATION_LANDSCAPE:
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+ break;
+ case Configuration.ORIENTATION_PORTRAIT:
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+ break;
+ default:
+ throw new IllegalStateException("Orientation in new config should be either"
+ + "landscape or portrait.");
+ }
+ mActivity.setRequestedOrientation(requestedOrientation);
+
+ final ActivityConfigurationChangeItem expected =
+ ActivityConfigurationChangeItem.obtain(newConfig);
+ verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()),
+ eq(mActivity.appToken), eq(expected));
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java
index f7b5d26ac87e..59e71c417439 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java
@@ -64,7 +64,6 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
mFullscreenStack = mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index b2a28699e6a0..35c1edeace2d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -36,6 +36,8 @@ import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
+import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
+import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
import static com.google.common.truth.Truth.assertThat;
@@ -73,7 +75,6 @@ public class ActivityStackTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
mDefaultDisplay = mRootActivityContainer.getDefaultDisplay();
mStack = spy(mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
true /* onTop */));
@@ -264,13 +265,13 @@ public class ActivityStackTests extends ActivityTestsBase {
// Do not move display to back because there is still another stack.
stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
- verify(stack2.getWindowContainerController()).positionChildAtBottom(any(),
+ verify(stack2.getTaskStack()).positionChildAtBottom(any(),
eq(false) /* includingParents */);
// Also move display to back because there is only one stack left.
display.removeChild(stack1);
stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
- verify(stack2.getWindowContainerController()).positionChildAtBottom(any(),
+ verify(stack2.getTaskStack()).positionChildAtBottom(any(),
eq(true) /* includingParents */);
}
@@ -687,6 +688,62 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
+ public void testHandleAppDied_RelaunchesAfterCrashDuringWindowingModeResize() {
+ final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+ activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
+ activity.launchCount = 1;
+ activity.haveState = false;
+
+ mStack.handleAppDiedLocked(activity.app);
+
+ assertEquals(1, mTask.mActivities.size());
+ assertEquals(1, mStack.getAllTasks().size());
+ }
+
+ @Test
+ public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringWindowingModeResize() {
+ final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+ activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
+ activity.launchCount = 3;
+ activity.haveState = false;
+
+ mStack.handleAppDiedLocked(activity.app);
+
+ assertThat(mTask.mActivities).isEmpty();
+ assertThat(mStack.getAllTasks()).isEmpty();
+ }
+
+ @Test
+ public void testHandleAppDied_RelaunchesAfterCrashDuringFreeResize() {
+ final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+ activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
+ activity.launchCount = 1;
+ activity.haveState = false;
+
+ mStack.handleAppDiedLocked(activity.app);
+
+ assertEquals(1, mTask.mActivities.size());
+ assertEquals(1, mStack.getAllTasks().size());
+ }
+
+ @Test
+ public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringFreeResize() {
+ final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+ activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
+ activity.launchCount = 3;
+ activity.haveState = false;
+
+ mStack.handleAppDiedLocked(activity.app);
+
+ assertThat(mTask.mActivities).isEmpty();
+ assertThat(mStack.getAllTasks()).isEmpty();
+ }
+
+ @Test
public void testFinishCurrentActivity() {
// Create 2 activities on a new display.
final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java
index 2ba2fdbcb959..96db38b14ad5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java
@@ -56,7 +56,6 @@ public class ActivityStartControllerTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- mService = createActivityTaskManagerService();
mFactory = mock(Factory.class);
mController = new ActivityStartController(mService, mService.mStackSupervisor, mFactory);
mStarter = spy(new ActivityStarter(mController, mService,
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index 4662799fc248..b3e5169fb0e8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -118,7 +118,6 @@ public class ActivityStarterTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
mController = mock(ActivityStartController.class);
mActivityMetricsLogger = mock(ActivityMetricsLogger.class);
clearInvocations(mActivityMetricsLogger);
@@ -144,7 +143,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
.setStack(mService.mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */))
.build();
- assertThat((Object) task2.getStack()).isInstanceOf(PinnedActivityStack.class);
+ assertThat((Object) task2.getStack()).isInstanceOf(ActivityStack.class);
mStarter.updateBounds(task2, bounds);
verify(mService, times(1)).resizeStack(eq(task2.getStack().mStackId),
@@ -648,10 +647,10 @@ public class ActivityStarterTests extends ActivityTestsBase {
boolean hasForegroundActivities, boolean callerIsRecents,
boolean callerIsTempWhitelisted) {
// window visibility
- doReturn(callingUidHasVisibleWindow).when(mService.mWindowManager).isAnyWindowVisibleForUid(
- callingUid);
- doReturn(realCallingUidHasVisibleWindow).when(mService.mWindowManager)
- .isAnyWindowVisibleForUid(realCallingUid);
+ doReturn(callingUidHasVisibleWindow).when(mService.mWindowManager.mRoot)
+ .isAnyNonToastWindowVisibleForUid(callingUid);
+ doReturn(realCallingUidHasVisibleWindow).when(mService.mWindowManager.mRoot)
+ .isAnyNonToastWindowVisibleForUid(realCallingUid);
// process importance
doReturn(callingUidProcState).when(mService).getUidStateLocked(callingUid);
doReturn(realCallingUidProcState).when(mService).getUidStateLocked(realCallingUid);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index 569c6d4af37d..ea8f33f0c630 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -31,6 +31,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyString;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -54,6 +55,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Handler;
import android.os.Looper;
+import android.os.PowerManager;
import android.os.Process;
import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
@@ -62,11 +64,11 @@ import android.view.Display;
import android.view.DisplayInfo;
import com.android.internal.app.IVoiceInteractor;
-import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.ServiceThread;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.PendingIntentController;
+import com.android.server.appop.AppOpsService;
import com.android.server.firewall.IntentFirewall;
import com.android.server.uri.UriGrantsManagerInternal;
@@ -110,22 +112,19 @@ class ActivityTestsBase {
@Before
public void setUpBase() {
mTestInjector.setUp();
- }
-
- @After
- public void tearDownBase() {
- mTestInjector.tearDown();
- }
- ActivityTaskManagerService createActivityTaskManagerService() {
mService = new TestActivityTaskManagerService(mContext);
mSupervisor = mService.mStackSupervisor;
mRootActivityContainer = mService.mRootActivityContainer;
- return mService;
}
- void setupActivityTaskManagerService() {
- createActivityTaskManagerService();
+ @After
+ public void tearDownBase() {
+ mTestInjector.tearDown();
+ if (mService != null) {
+ mService.setWindowManager(null);
+ mService = null;
+ }
}
/** Creates a {@link TestActivityDisplay}. */
@@ -144,6 +143,13 @@ class ActivityTestsBase {
return display;
}
+ /** Creates and adds a {@link TestActivityDisplay} to supervisor at the given position. */
+ TestActivityDisplay addNewActivityDisplayAt(DisplayInfo info, int position) {
+ final TestActivityDisplay display = createNewActivityDisplay(info);
+ mRootActivityContainer.addChild(display, position);
+ return display;
+ }
+
/**
* Builder for creating new activities.
*/
@@ -154,6 +160,7 @@ class ActivityTestsBase {
private final ActivityTaskManagerService mService;
private ComponentName mComponent;
+ private String mTargetActivity;
private TaskRecord mTaskRecord;
private int mUid;
private boolean mCreateTask;
@@ -170,6 +177,11 @@ class ActivityTestsBase {
return this;
}
+ ActivityBuilder setTargetActivity(String targetActivity) {
+ mTargetActivity = targetActivity;
+ return this;
+ }
+
static ComponentName getDefaultComponent() {
return ComponentName.createRelative(DEFAULT_COMPONENT_PACKAGE_NAME,
DEFAULT_COMPONENT_PACKAGE_NAME);
@@ -224,6 +236,10 @@ class ActivityTestsBase {
aInfo.applicationInfo = new ApplicationInfo();
aInfo.applicationInfo.packageName = mComponent.getPackageName();
aInfo.applicationInfo.uid = mUid;
+ aInfo.packageName = mComponent.getPackageName();
+ if (mTargetActivity != null) {
+ aInfo.targetActivity = mTargetActivity;
+ }
aInfo.flags |= mActivityFlags;
aInfo.launchMode = mLaunchMode;
@@ -234,7 +250,13 @@ class ActivityTestsBase {
mService.mStackSupervisor, null /* options */, null /* sourceRecord */);
spyOn(activity);
activity.mAppWindowToken = mock(AppWindowToken.class);
+ doCallRealMethod().when(activity.mAppWindowToken).getOrientationIgnoreVisibility();
+ doCallRealMethod().when(activity.mAppWindowToken)
+ .setOrientation(anyInt(), any(), any());
+ doCallRealMethod().when(activity.mAppWindowToken).setOrientation(anyInt());
doNothing().when(activity).removeWindowContainer();
+ doReturn(mock(Configuration.class)).when(activity.mAppWindowToken)
+ .getRequestedOverrideConfiguration();
if (mTaskRecord != null) {
mTaskRecord.addActivityToTop(activity);
@@ -346,6 +368,7 @@ class ActivityTestsBase {
mStack.addTask(task, true, "creating test task");
task.setStack(mStack);
task.setTask();
+ mStack.getTaskStack().addChild(task.mTask, 0);
}
task.touchActiveTime();
@@ -365,7 +388,10 @@ class ActivityTestsBase {
setTask();
}
- private void setTask() {
+ void setTask() {
+ Task mockTask = mock(Task.class);
+ mockTask.mTaskRecord = this;
+ doCallRealMethod().when(mockTask).onDescendantOrientationChanged(any(), any());
setTask(mock(Task.class));
}
}
@@ -400,6 +426,7 @@ class ActivityTestsBase {
doReturn(mock(IPackageManager.class)).when(this).getPackageManager();
// allow background activity starts by default
doReturn(true).when(this).isBackgroundActivityStartsEnabled();
+ doNothing().when(this).updateCpuStats();
}
void setup(IntentFirewall intentFirewall, PendingIntentController intentController,
@@ -555,6 +582,8 @@ class ActivityTestsBase {
doNothing().when(this).acquireLaunchWakelock();
doReturn(mKeyguardController).when(this).getKeyguardController();
+ mLaunchingActivity = mock(PowerManager.WakeLock.class);
+
initialize();
}
@@ -597,7 +626,7 @@ class ActivityTestsBase {
@SuppressWarnings("TypeParameterUnusedInFormals")
@Override
- <T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
+ ActivityStack createStackUnchecked(int windowingMode, int activityType,
int stackId, boolean onTop) {
return new StackBuilder(mSupervisor.mRootActivityContainer).setDisplay(this)
.setWindowingMode(windowingMode).setActivityType(activityType)
@@ -619,7 +648,13 @@ class ActivityTestsBase {
}
}
+ private static WindowManagerService sMockWindowManagerService;
+
private static WindowManagerService prepareMockWindowManager() {
+ if (sMockWindowManagerService != null) {
+ return sMockWindowManagerService;
+ }
+
final WindowManagerService service = mock(WindowManagerService.class);
service.mRoot = mock(RootWindowContainer.class);
@@ -631,6 +666,7 @@ class ActivityTestsBase {
return null;
}).when(service).inSurfaceTransaction(any());
+ sMockWindowManagerService = service;
return service;
}
@@ -639,10 +675,9 @@ class ActivityTestsBase {
* method is called. Note that its functionality depends on the implementations of the
* construction arguments.
*/
- protected static class TestActivityStack<T extends StackWindowController>
- extends ActivityStack<T> {
+ protected static class TestActivityStack
+ extends ActivityStack {
private int mOnActivityRemovedFromStackCount = 0;
- private T mContainerController;
static final int IS_TRANSLUCENT_UNSET = 0;
static final int IS_TRANSLUCENT_FALSE = 1;
@@ -682,20 +717,20 @@ class ActivityTestsBase {
}
@Override
- protected T createStackWindowController(int displayId, boolean onTop, Rect outBounds) {
- mContainerController = (T) WindowTestUtils.createMockStackWindowContainerController();
+ protected void createTaskStack(int displayId, boolean onTop, Rect outBounds) {
+ mTaskStack = WindowTestUtils.createMockTaskStack();
// Primary pinned stacks require a non-empty out bounds to be set or else all tasks
// will be moved to the full screen stack.
if (getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
outBounds.set(0, 0, 100, 100);
}
- return mContainerController;
+
}
@Override
- T getWindowContainerController() {
- return mContainerController;
+ TaskStack getTaskStack() {
+ return mTaskStack;
}
void setIsTranslucent(boolean isTranslucent) {
@@ -785,27 +820,23 @@ class ActivityTestsBase {
}
@SuppressWarnings("TypeParameterUnusedInFormals")
- <T extends ActivityStack> T build() {
+ ActivityStack build() {
final int stackId = mStackId >= 0 ? mStackId : mDisplay.getNextStackId();
if (mWindowingMode == WINDOWING_MODE_PINNED) {
- return (T) new PinnedActivityStack(mDisplay, stackId,
- mRootActivityContainer.mStackSupervisor, mOnTop) {
+ return new ActivityStack(mDisplay, stackId, mRootActivityContainer.mStackSupervisor,
+ mWindowingMode, ACTIVITY_TYPE_STANDARD, mOnTop) {
@Override
Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return new Rect(50, 50, 100, 100);
}
@Override
- PinnedStackWindowController createStackWindowController(int displayId,
- boolean onTop, Rect outBounds) {
- PinnedStackWindowController controller =
- mock(PinnedStackWindowController.class);
- controller.mContainer = mock(TaskStack.class);
- return controller;
+ void createTaskStack(int displayId, boolean onTop, Rect outBounds) {
+ mTaskStack = mock(TaskStack.class);
}
};
} else {
- return (T) new TestActivityStack(mDisplay, stackId,
+ return new TestActivityStack(mDisplay, stackId,
mRootActivityContainer.mStackSupervisor, mWindowingMode,
mActivityType, mOnTop, mCreateActivity);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index fa4228908cea..123de2d227bc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -39,7 +39,9 @@ import android.view.Display;
import androidx.test.filters.SmallTest;
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
/**
@@ -52,15 +54,34 @@ import org.junit.Test;
@Presubmit
public class AppTransitionTests extends WindowTestsBase {
+ private static RootWindowContainer sOriginalRootWindowContainer;
+
private DisplayContent mDc;
+ @BeforeClass
+ public static void setUpRootWindowContainerMock() {
+ final WindowManagerService wm = TestSystemServices.getWindowManagerService();
+ // For unit test, we don't need to test performSurfacePlacement to prevent some abnormal
+ // interaction with surfaceflinger native side.
+ sOriginalRootWindowContainer = wm.mRoot;
+ // Creating spied mock of RootWindowContainer shouldn't be done in @Before, since it will
+ // create unnecessary nested spied objects chain, because WindowManagerService object under
+ // test is a single instance shared among all tests that extend WindowTestsBase class.
+ // Instead it should be done once before running all tests in this test class.
+ wm.mRoot = spy(wm.mRoot);
+ doNothing().when(wm.mRoot).performSurfacePlacement(anyBoolean());
+ }
+
+ @AfterClass
+ public static void tearDownRootWindowContainerMock() {
+ final WindowManagerService wm = TestSystemServices.getWindowManagerService();
+ wm.mRoot = sOriginalRootWindowContainer;
+ sOriginalRootWindowContainer = null;
+ }
+
@Before
public void setUp() throws Exception {
mDc = mWm.getDefaultDisplayContentLocked();
- // For unit test, we don't need to test performSurfacePlacement to prevent some
- // abnormal interaction with surfaceflinger native side.
- mWm.mRoot = spy(mWm.mRoot);
- doNothing().when(mWm.mRoot).performSurfacePlacement(anyBoolean());
}
@Test
@@ -160,7 +181,7 @@ public class AppTransitionTests extends WindowTestsBase {
assertTrue(dc1.mOpeningApps.size() > 0);
// Move stack to another display.
- stack1.getController().reparent(dc2.getDisplayId(), new Rect(), true);
+ stack1.reparent(dc2.getDisplayId(), new Rect(), true);
// Verify if token are cleared from both pending transition list in former display.
assertFalse(dc1.mOpeningApps.contains(token1));
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java
index dcfb8797eaba..d0b9225715c4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java
@@ -87,8 +87,8 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase {
verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
callbackCaptor.getValue().onAnimationFinished(mSpec);
- verify(mTransaction).destroy(eq(leash));
- verify(mTransaction).destroy(eq(animationBoundsLayer));
+ verify(mTransaction).reparent(eq(leash), eq(null));
+ verify(mTransaction).reparent(eq(animationBoundsLayer), eq(null));
assertThat(mToken.mNeedsAnimationBoundsLayer).isFalse();
}
@@ -100,8 +100,8 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase {
final SurfaceControl animationBoundsLayer = mToken.mAnimationBoundsLayer;
mToken.mSurfaceAnimator.cancelAnimation();
- verify(mTransaction).destroy(eq(leash));
- verify(mTransaction).destroy(eq(animationBoundsLayer));
+ verify(mTransaction).reparent(eq(leash), eq(null));
+ verify(mTransaction).reparent(eq(animationBoundsLayer), eq(null));
assertThat(mToken.mNeedsAnimationBoundsLayer).isFalse();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
index ee1c8dfdd319..f99cd4b18647 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
@@ -212,7 +212,7 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.updateDims(mTransaction, new Rect());
verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
- verify(mHost.getPendingTransaction()).destroy(dimLayer);
+ verify(mHost.getPendingTransaction()).reparent(dimLayer, null);
}
@Test
@@ -269,7 +269,7 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.updateDims(mTransaction, new Rect());
verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
- verify(mTransaction).destroy(dimLayer);
+ verify(mTransaction).reparent(dimLayer, null);
}
private SurfaceControl getDimLayer() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 3826fac22b05..f3994630adee 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -59,6 +59,7 @@ import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.util.DisplayMetrics;
import android.view.DisplayCutout;
+import android.view.DisplayInfo;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.Surface;
@@ -584,15 +585,17 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testOnDescendantOrientationRequestChanged() {
- final DisplayContent dc = createNewDisplay();
+ final DisplayInfo info = new DisplayInfo();
+ info.logicalWidth = 1080;
+ info.logicalHeight = 1920;
+ info.logicalDensityDpi = 240;
+ final DisplayContent dc = createNewDisplay(info);
+ dc.configureDisplayPolicy();
mWm.mAtmService.mRootActivityContainer = mock(RootActivityContainer.class);
- final int newOrientation = dc.getLastOrientation() == SCREEN_ORIENTATION_LANDSCAPE
- ? SCREEN_ORIENTATION_PORTRAIT
- : SCREEN_ORIENTATION_LANDSCAPE;
final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w");
window.getTask().mTaskRecord = mock(TaskRecord.class, ExtendedMockito.RETURNS_DEEP_STUBS);
- window.mAppToken.setOrientation(newOrientation);
+ window.mAppToken.mOrientation = SCREEN_ORIENTATION_LANDSCAPE;
ActivityRecord activityRecord = mock(ActivityRecord.class);
@@ -603,21 +606,22 @@ public class DisplayContentTests extends WindowTestsBase {
verify(mWm.mAtmService).updateDisplayOverrideConfigurationLocked(captor.capture(),
same(activityRecord), anyBoolean(), eq(dc.getDisplayId()));
final Configuration newDisplayConfig = captor.getValue();
- assertEquals(Configuration.ORIENTATION_PORTRAIT, newDisplayConfig.orientation);
+ assertEquals(Configuration.ORIENTATION_LANDSCAPE, newDisplayConfig.orientation);
}
@Test
public void testOnDescendantOrientationRequestChanged_FrozenToUserRotation() {
- final DisplayContent dc = createNewDisplay();
+ final DisplayInfo info = new DisplayInfo();
+ info.logicalWidth = 1080;
+ info.logicalHeight = 1920;
+ info.logicalDensityDpi = 240;
+ final DisplayContent dc = createNewDisplay(info);
dc.getDisplayRotation().setFixedToUserRotation(true);
mWm.mAtmService.mRootActivityContainer = mock(RootActivityContainer.class);
- final int newOrientation = dc.getLastOrientation() == SCREEN_ORIENTATION_LANDSCAPE
- ? SCREEN_ORIENTATION_PORTRAIT
- : SCREEN_ORIENTATION_LANDSCAPE;
final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w");
window.getTask().mTaskRecord = mock(TaskRecord.class, ExtendedMockito.RETURNS_DEEP_STUBS);
- window.mAppToken.setOrientation(newOrientation);
+ window.mAppToken.mOrientation = SCREEN_ORIENTATION_LANDSCAPE;
ActivityRecord activityRecord = mock(ActivityRecord.class);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
index 6b31e6fdbd28..d05711e914c0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
@@ -33,7 +33,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.content.ContentResolver;
@@ -63,6 +62,7 @@ import com.android.server.statusbar.StatusBarManagerInternal;
import org.junit.After;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -86,7 +86,7 @@ public class DisplayRotationTests {
private StatusBarManagerInternal mPreviousStatusBarManagerInternal;
- private WindowManagerService mMockWm;
+ private static WindowManagerService sMockWm;
private DisplayContent mMockDisplayContent;
private DisplayPolicy mMockDisplayPolicy;
private Context mMockContext;
@@ -108,13 +108,16 @@ public class DisplayRotationTests {
private DisplayRotation mTarget;
+ @BeforeClass
+ public static void setUpOnce() {
+ sMockWm = mock(WindowManagerService.class);
+ sMockWm.mPowerManagerInternal = mock(PowerManagerInternal.class);
+ }
+
@Before
public void setUp() {
FakeSettingsProvider.clearSettingsProvider();
- mMockWm = mock(WindowManagerService.class);
- mMockWm.mPowerManagerInternal = mock(PowerManagerInternal.class);
-
mPreviousStatusBarManagerInternal = LocalServices.getService(
StatusBarManagerInternal.class);
LocalServices.removeServiceForTest(StatusBarManagerInternal.class);
@@ -452,7 +455,7 @@ public class DisplayRotationTests {
mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
assertTrue(waitForUiHandler());
- verify(mMockWm).updateRotation(false, false);
+ verify(sMockWm).updateRotation(false, false);
}
@Test
@@ -608,23 +611,6 @@ public class DisplayRotationTests {
// ========================
// Non-rotation API Tests
// ========================
- @Test
- public void testRespectsAppRequestedOrientationByDefault() throws Exception {
- mBuilder.build();
-
- assertTrue("Display rotation should respect app requested orientation by"
- + " default.", mTarget.respectAppRequestedOrientation());
- }
-
- @Test
- public void testNotRespectAppRequestedOrientation_FixedToUserRotation() throws Exception {
- mBuilder.build();
- mTarget.setFixedToUserRotation(true);
-
- assertFalse("Display rotation shouldn't respect app requested orientation if"
- + " fixed to user rotation.", mTarget.respectAppRequestedOrientation());
- }
-
/**
* Call {@link DisplayRotation#configure(int, int, int, int)} to configure {@link #mTarget}
* according to given parameters.
@@ -833,8 +819,9 @@ public class DisplayRotationTests {
.thenReturn(mFakeSettingsProvider.getIContentProvider());
mMockDisplayWindowSettings = mock(DisplayWindowSettings.class);
- mTarget = new DisplayRotation(mMockWm, mMockDisplayContent, mMockDisplayPolicy,
+ mTarget = new DisplayRotation(sMockWm, mMockDisplayContent, mMockDisplayPolicy,
mMockDisplayWindowSettings, mMockContext, new Object());
+ reset(sMockWm);
captureObservers();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
index f1c6eab2143d..68d8bc078d54 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
@@ -20,11 +20,9 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -96,8 +94,8 @@ public class DragDropControllerTests extends WindowTestsBase {
private WindowState createDropTargetWindow(String name, int ownerId) {
final WindowTestUtils.TestAppWindowToken token = WindowTestUtils.createTestAppWindowToken(
mDisplayContent);
- final TaskStack stack = createStackControllerOnStackOnDisplay(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
+ final TaskStack stack = createTaskStackOnDisplay(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mDisplayContent);
final Task task = createTaskInStack(stack, ownerId);
task.addChild(token, 0);
@@ -125,7 +123,6 @@ public class DragDropControllerTests extends WindowTestsBase {
mDisplayContent = spy(mDisplayContent);
mWindow = createDropTargetWindow("Drag test window", 0);
doReturn(mWindow).when(mDisplayContent).getTouchableWinAtPointLocked(0, 0);
- when(mWm.mInputManager.transferTouchFocus(any(), any())).thenReturn(true);
synchronized (mWm.mGlobalLock) {
mWm.mWindowMap.put(mWindow.mClient.asBinder(), mWindow);
@@ -176,7 +173,6 @@ public class DragDropControllerTests extends WindowTestsBase {
.setFormat(PixelFormat.TRANSLUCENT)
.build();
- assertTrue(mWm.mInputManager.transferTouchFocus(null, null));
mToken = mTarget.performDrag(
new SurfaceSession(), 0, 0, mWindow.mClient, flag, surface, 0, 0, 0, 0, 0,
data);
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
index 8c3dec7f1e75..b28ae40d5056 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
@@ -71,7 +71,6 @@ public class LaunchParamsControllerTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- mService = createActivityTaskManagerService();
mPersister = new TestLaunchParamsPersister();
mController = new LaunchParamsController(mService, mPersister);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
index 86353643c128..aeda473a9e6e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
@@ -102,8 +102,6 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase {
mFolder = new File(cacheFolder, "launch_params_tests");
deleteRecursively(mFolder);
- setupActivityTaskManagerService();
-
mDisplayUniqueId = "test:" + Integer.toString(sNextUniqueId++);
final DisplayInfo info = new DisplayInfo();
info.uniqueId = mDisplayUniqueId;
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
new file mode 100644
index 000000000000..c52c8d7eb7bd
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.SurfaceControl;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+
+import java.util.function.Supplier;
+
+@SmallTest
+@Presubmit
+public class LetterboxTest {
+
+ Letterbox mLetterbox;
+ SurfaceControlMocker mSurfaces;
+ SurfaceControl.Transaction mTransaction;
+
+ @Before
+ public void setUp() throws Exception {
+ mSurfaces = new SurfaceControlMocker();
+ mLetterbox = new Letterbox(mSurfaces);
+ mTransaction = mock(SurfaceControl.Transaction.class);
+ }
+
+ @Test
+ public void testOverlappingWith_usesGlobalCoordinates() {
+ mLetterbox.layout(new Rect(0, 0, 10, 50), new Rect(0, 2, 10, 45), new Point(1000, 2000));
+ assertTrue(mLetterbox.isOverlappingWith(new Rect(0, 0, 1, 1)));
+ }
+
+ @Test
+ public void testSurfaceOrigin_applied() {
+ mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+ mLetterbox.applySurfaceChanges(mTransaction);
+ verify(mTransaction).setPosition(mSurfaces.top, -1000, -2000);
+ }
+
+ @Test
+ public void testSurfaceOrigin_changeCausesReapply() {
+ mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+ mLetterbox.applySurfaceChanges(mTransaction);
+ clearInvocations(mTransaction);
+ mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(0, 0));
+ assertTrue(mLetterbox.needsApplySurfaceChanges());
+ mLetterbox.applySurfaceChanges(mTransaction);
+ verify(mTransaction).setPosition(mSurfaces.top, 0, 0);
+ }
+
+ class SurfaceControlMocker implements Supplier<SurfaceControl.Builder> {
+ private SurfaceControl.Builder mLeftBuilder;
+ public SurfaceControl left;
+ private SurfaceControl.Builder mTopBuilder;
+ public SurfaceControl top;
+ private SurfaceControl.Builder mRightBuilder;
+ public SurfaceControl right;
+ private SurfaceControl.Builder mBottomBuilder;
+ public SurfaceControl bottom;
+
+ @Override
+ public SurfaceControl.Builder get() {
+ final SurfaceControl.Builder builder = mock(SurfaceControl.Builder.class,
+ InvocationOnMock::getMock);
+ when(builder.setName(anyString())).then((i) -> {
+ if (((String) i.getArgument(0)).contains("left")) {
+ mLeftBuilder = (SurfaceControl.Builder) i.getMock();
+ } else if (((String) i.getArgument(0)).contains("top")) {
+ mTopBuilder = (SurfaceControl.Builder) i.getMock();
+ } else if (((String) i.getArgument(0)).contains("right")) {
+ mRightBuilder = (SurfaceControl.Builder) i.getMock();
+ } else if (((String) i.getArgument(0)).contains("bottom")) {
+ mBottomBuilder = (SurfaceControl.Builder) i.getMock();
+ }
+ return i.getMock();
+ });
+
+ doAnswer((i) -> {
+ final SurfaceControl control = mock(SurfaceControl.class);
+ if (i.getMock() == mLeftBuilder) {
+ left = control;
+ } else if (i.getMock() == mTopBuilder) {
+ top = control;
+ } else if (i.getMock() == mRightBuilder) {
+ right = control;
+ } else if (i.getMock() == mBottomBuilder) {
+ bottom = control;
+ }
+ return control;
+ }).when(builder).build();
+ return builder;
+ }
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java
index a9f150b10e73..e24eb75a2750 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java
@@ -34,7 +34,12 @@ import static android.telecom.TelecomManager.EMERGENCY_DIALER_COMPONENT;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyString;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.isNull;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
@@ -47,10 +52,6 @@ import static com.android.server.wm.LockTaskController.STATUS_BAR_MASK_PINNED;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
import android.app.StatusBarManager;
import android.app.admin.DevicePolicyManager;
@@ -115,6 +116,7 @@ public class LockTaskControllerTest {
private LockTaskController mLockTaskController;
private Context mContext;
+ private String mPackageName;
private String mLockToAppSetting;
@Before
@@ -122,6 +124,7 @@ public class LockTaskControllerTest {
MockitoAnnotations.initMocks(this);
mContext = getInstrumentation().getTargetContext();
+ mPackageName = mContext.getPackageName();
mLockToAppSetting = Settings.Secure.getString(mContext.getContentResolver(),
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED);
@@ -146,6 +149,7 @@ public class LockTaskControllerTest {
@After
public void tearDown() throws Exception {
+ mLockTaskController.setWindowManager(null);
Settings.Secure.putString(mContext.getContentResolver(),
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, mLockToAppSetting);
}
@@ -223,7 +227,7 @@ public class LockTaskControllerTest {
// THEN lock task mode should be started
verifyLockTaskStarted(STATUS_BAR_MASK_PINNED, DISABLE2_NONE);
// THEN screen pinning toast should be shown
- verify(mStatusBarService).showPinningEnterExitToast(true /* entering */);
+ verify(mStatusBarService).showPinningEnterExitToast(eq(true /* entering */));
}
@Test
@@ -390,9 +394,9 @@ public class LockTaskControllerTest {
// THEN lock task mode should have been finished
verifyLockTaskStopped(times(1));
// THEN the keyguard should be shown
- verify(mLockPatternUtils).requireCredentialEntry(UserHandle.USER_ALL);
+ verify(mLockPatternUtils).requireCredentialEntry(eq(UserHandle.USER_ALL));
// THEN screen pinning toast should be shown
- verify(mStatusBarService).showPinningEnterExitToast(false /* entering */);
+ verify(mStatusBarService).showPinningEnterExitToast(eq(false /* entering */));
}
@Test
@@ -509,9 +513,9 @@ public class LockTaskControllerTest {
& ~DISABLE_HOME;
int expectedFlags2 = DISABLE2_MASK;
verify(mStatusBarService).disable(eq(expectedFlags), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
verify(mStatusBarService).disable2(eq(expectedFlags2), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
// reset invocation counter
reset(mStatusBarService);
@@ -526,9 +530,9 @@ public class LockTaskControllerTest {
expectedFlags2 = DISABLE2_MASK
& ~DISABLE2_NOTIFICATION_SHADE;
verify(mStatusBarService).disable(eq(expectedFlags), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
verify(mStatusBarService).disable2(eq(expectedFlags2), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
}
@Test
@@ -548,9 +552,9 @@ public class LockTaskControllerTest {
// THEN status bar shouldn't change
verify(mStatusBarService, never()).disable(anyInt(), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
verify(mStatusBarService, never()).disable2(anyInt(), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
}
@Test
@@ -657,14 +661,14 @@ public class LockTaskControllerTest {
verify(mWindowManager).disableKeyguard(any(IBinder.class), anyString(), eq(TEST_USER_ID));
// THEN the status bar should have been disabled
verify(mStatusBarService).disable(eq(statusBarMask), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
verify(mStatusBarService).disable2(eq(statusBarMask2), any(IBinder.class),
- eq(mContext.getPackageName()));
+ eq(mPackageName));
// THEN recents should have been notified
verify(mRecentTasks).onLockTaskModeStateChanged(anyInt(), eq(TEST_USER_ID));
// THEN the DO/PO should be informed about the operation
- verify(mDevicePolicyManager).notifyLockTaskModeChanged(true, TEST_PACKAGE_NAME,
- TEST_USER_ID);
+ verify(mDevicePolicyManager).notifyLockTaskModeChanged(eq(true), eq(TEST_PACKAGE_NAME),
+ eq(TEST_USER_ID));
}
private void verifyLockTaskStopped(VerificationMode mode) throws Exception {
@@ -672,11 +676,12 @@ public class LockTaskControllerTest {
verify(mWindowManager, mode).reenableKeyguard(any(IBinder.class), eq(TEST_USER_ID));
// THEN the status bar should have been disabled
verify(mStatusBarService, mode).disable(eq(StatusBarManager.DISABLE_NONE),
- any(IBinder.class), eq(mContext.getPackageName()));
+ any(IBinder.class), eq(mPackageName));
verify(mStatusBarService, mode).disable2(eq(StatusBarManager.DISABLE2_NONE),
- any(IBinder.class), eq(mContext.getPackageName()));
+ any(IBinder.class), eq(mPackageName));
// THEN the DO/PO should be informed about the operation
- verify(mDevicePolicyManager, mode).notifyLockTaskModeChanged(false, null, TEST_USER_ID);
+ verify(mDevicePolicyManager, mode).notifyLockTaskModeChanged(eq(false), isNull(),
+ eq(TEST_USER_ID));
}
/**
diff --git a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
index efd7d25c586d..beaac8e58686 100644
--- a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
@@ -52,7 +52,6 @@ public class PendingRemoteAnimationRegistryTest extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mService = createActivityTaskManagerService();
mService.mH.runWithScissors(() -> {
mHandler = new TestHandler(null, mClock);
}, 0);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index ad2a708b88d9..413b6f4b3905 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -143,8 +143,8 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
@Test
public void testTimeout_scaled() throws Exception {
- mWm.setAnimationScale(2, 5.0f);
try {
+ mWm.setAnimationScale(2, 5.0f);
final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
"testWin");
final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index 58302d6b8b75..e3bacf96a86c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -82,7 +82,6 @@ public class RootActivityContainerTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
mFullscreenStack = mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
}
@@ -323,8 +322,8 @@ public class RootActivityContainerTests extends ActivityTestsBase {
public void testFindTaskToMoveToFrontWhenRecentsOnTop() {
// Create stack/task on default display.
final ActivityDisplay display = mRootActivityContainer.getDefaultDisplay();
- final TestActivityStack targetStack =
- new StackBuilder(mRootActivityContainer).setOnTop(false).build();
+ final TestActivityStack targetStack = (TestActivityStack) new StackBuilder(
+ mRootActivityContainer).setOnTop(false).build();
final TaskRecord targetTask = targetStack.getChildAt(0);
// Create Recents on top of the display.
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
new file mode 100644
index 000000000000..45fe5d24adf5
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Tests for RootWindowContainer.
+ *
+ * Build/Install/Run:
+ * atest WmTests:RootWindowContainerTests
+ */
+@SmallTest
+@Presubmit
+public class RootWindowContainerTests extends WindowTestsBase {
+
+ private static final int FAKE_CALLING_UID = 667;
+
+ @Test
+ public void testIsAnyNonToastWindowVisibleForUid_oneToastOneNonToastBothVisible() {
+ final WindowState toastyToast = createWindow(null, TYPE_TOAST, "toast", FAKE_CALLING_UID);
+ final WindowState app = createWindow(null, TYPE_APPLICATION, "app", FAKE_CALLING_UID);
+ toastyToast.mHasSurface = true;
+ app.mHasSurface = true;
+
+ assertTrue(toastyToast.isVisible());
+ assertTrue(app.isVisible());
+ assertTrue(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
+ }
+
+ @Test
+ public void testIsAnyNonToastWindowVisibleForUid_onlyToastVisible() {
+ final WindowState toastyToast = createWindow(null, TYPE_TOAST, "toast", FAKE_CALLING_UID);
+ toastyToast.mHasSurface = true;
+
+ assertTrue(toastyToast.isVisible());
+ assertFalse(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
+ }
+
+ @Test
+ public void testIsAnyNonToastWindowVisibleForUid_aFewNonToastButNoneVisible() {
+ final WindowState topBar = createWindow(null, TYPE_STATUS_BAR, "topBar", FAKE_CALLING_UID);
+ final WindowState app = createWindow(null, TYPE_APPLICATION, "app", FAKE_CALLING_UID);
+
+ assertFalse(topBar.isVisible());
+ assertFalse(app.isVisible());
+ assertFalse(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
+ }
+}
+
diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
index a8b6dc373cbf..dc964806b7a9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
@@ -49,7 +49,6 @@ public class RunningTasksTest extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
mRunningTasks = new RunningTasks();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
index 36eccd1892a7..03aba39517eb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
@@ -33,6 +33,8 @@ import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -58,7 +60,6 @@ import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.TextView;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import org.junit.After;
@@ -80,8 +81,8 @@ import java.util.function.BooleanSupplier;
@Presubmit
public class ScreenDecorWindowTests {
- private final Context mContext = InstrumentationRegistry.getTargetContext();
- private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ private final Context mContext = getInstrumentation().getTargetContext();
+ private final Instrumentation mInstrumentation = getInstrumentation();
private WindowManager mWm;
private ArrayList<View> mWindows = new ArrayList<>();
diff --git a/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java
deleted file mode 100644
index 5690b58737ab..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2017 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.wm;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.graphics.Rect;
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Test class for {@link StackWindowController}.
- *
- * Build/Install/Run:
- * atest FrameworksServicesTests:StackWindowControllerTests
- */
-@SmallTest
-@Presubmit
-public class StackWindowControllerTests extends WindowTestsBase {
- @Test
- public void testRemoveContainer() {
- final StackWindowController stackController =
- createStackControllerOnDisplay(mDisplayContent);
- final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController);
-
- final TaskStack stack = stackController.mContainer;
- assertNotNull(stack);
- assertNotNull(task);
- stackController.removeContainer();
- // Assert that the container was removed.
- assertNull(stackController.mContainer);
- assertNull(stack.getDisplayContent());
- assertNull(task.getDisplayContent());
- assertNull(task.mStack);
- }
-
- @Test
- public void testRemoveContainer_deferRemoval() {
- final StackWindowController stackController =
- createStackControllerOnDisplay(mDisplayContent);
- final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController);
-
- final TaskStack stack = stackController.mContainer;
- // Stack removal is deferred if one of its child is animating.
- task.setLocalIsAnimating(true);
-
- stackController.removeContainer();
- // For the case of deferred removal the stack controller will no longer be connected to the
- // container, but the task controller will still be connected to the its container until
- // the stack window container is removed.
- assertNull(stackController.mContainer);
- assertNull(stack.getController());
- assertNotNull(task);
-
- stack.removeImmediately();
- // After removing, the task will be isolated.
- assertNull(task.getParent());
- assertEquals(task.getChildCount(), 0);
- assertNull(task.getController());
- }
-
- @Test
- public void testReparent() {
- // Create first stack on primary display.
- final StackWindowController stack1Controller =
- createStackControllerOnDisplay(mDisplayContent);
- final TaskStack stack1 = stack1Controller.mContainer;
- final WindowTestUtils.TestTask task1 = WindowTestUtils.createTestTask(stack1Controller);
- task1.mOnDisplayChangedCalled = false;
-
- // Create second display and put second stack on it.
- final DisplayContent dc = createNewDisplay();
- final StackWindowController stack2Controller =
- createStackControllerOnDisplay(dc);
- final TaskStack stack2 = stack2Controller.mContainer;
-
- // Reparent
- stack1Controller.reparent(dc.getDisplayId(), new Rect(), true /* onTop */);
- assertEquals(dc, stack1.getDisplayContent());
- final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1);
- final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2);
- assertEquals(stack1PositionInParent, stack2PositionInParent + 1);
- assertTrue(task1.mOnDisplayChangedCalled);
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
index d14f30db8e9f..ad80cd6ddfb7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -96,7 +96,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
callbackCaptor.getValue().onAnimationFinished(mSpec);
assertNotAnimating(mAnimatable);
assertTrue(mAnimatable.mFinishedCallbackCalled);
- verify(mTransaction).destroy(eq(mAnimatable.mLeash));
+ verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null));
// TODO: Verify reparenting once we use mPendingTransaction to reparent it back
}
@@ -106,7 +106,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
final SurfaceControl firstLeash = mAnimatable.mLeash;
mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2, true /* hidden */);
- verify(mTransaction).destroy(eq(firstLeash));
+ verify(mTransaction).reparent(eq(firstLeash), eq(null));
assertFalse(mAnimatable.mFinishedCallbackCalled);
final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
@@ -133,7 +133,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
assertNotAnimating(mAnimatable);
verify(mSpec).onAnimationCancelled(any());
assertTrue(mAnimatable.mFinishedCallbackCalled);
- verify(mTransaction).destroy(eq(mAnimatable.mLeash));
+ verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null));
}
@Test
@@ -155,7 +155,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
verifyZeroInteractions(mSpec);
assertNotAnimating(mAnimatable);
assertTrue(mAnimatable.mFinishedCallbackCalled);
- verify(mTransaction).destroy(eq(mAnimatable.mLeash));
+ verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null));
}
@Test
@@ -171,11 +171,11 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
assertNotAnimating(mAnimatable);
assertAnimating(mAnimatable2);
assertEquals(leash, mAnimatable2.mSurfaceAnimator.mLeash);
- verify(mTransaction, never()).destroy(eq(leash));
+ verify(mTransaction, never()).reparent(eq(leash), eq(null));
callbackCaptor.getValue().onAnimationFinished(mSpec);
assertNotAnimating(mAnimatable2);
assertTrue(mAnimatable2.mFinishedCallbackCalled);
- verify(mTransaction).destroy(eq(leash));
+ verify(mTransaction).reparent(eq(leash), eq(null));
}
@Test
@@ -198,7 +198,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
mDeferFinishAnimatable.mEndDeferFinishCallback.run();
assertNotAnimating(mAnimatable2);
assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled);
- verify(mTransaction).destroy(eq(mDeferFinishAnimatable.mLeash));
+ verify(mTransaction).reparent(eq(mDeferFinishAnimatable.mLeash), eq(null));
}
private void assertAnimating(MyAnimatable animatable) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
index 53e99fae95d4..ace179acdeb5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
@@ -75,10 +75,6 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
- setupActivityTaskManagerService();
- mService.mSupportsFreeformWindowManagement = true;
- when(mSupervisor.canUseActivityOptionsLaunchBounds(any())).thenCallRealMethod();
-
mActivity = new ActivityBuilder(mService).build();
mActivity.appInfo.targetSdkVersion = Build.VERSION_CODES.N_MR1;
mActivity.info.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
index c343fe7d0675..8c6ac23c9202 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
@@ -18,7 +18,6 @@ package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
@@ -58,10 +57,6 @@ public class TaskPositioningControllerTests extends WindowTestsBase {
assertNotNull(mWm.mTaskPositioningController);
mTarget = mWm.mTaskPositioningController;
- when(mWm.mInputManager.transferTouchFocus(
- any(InputChannel.class),
- any(InputChannel.class))).thenReturn(true);
-
mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window");
mWindow.mInputChannel = new InputChannel();
synchronized (mWm.mGlobalLock) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
index 7da85af444d6..e182c45f009e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
@@ -21,6 +21,18 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
@@ -41,6 +53,7 @@ import android.platform.test.annotations.Presubmit;
import android.service.voice.IVoiceInteractionSession;
import android.util.Xml;
import android.view.DisplayInfo;
+import android.view.Surface;
import androidx.test.filters.MediumTest;
@@ -77,7 +90,6 @@ public class TaskRecordTests extends ActivityTestsBase {
@Before
public void setUp() throws Exception {
TaskRecord.setTaskRecordFactory(null);
- setupActivityTaskManagerService();
mParentBounds = new Rect(10 /*left*/, 30 /*top*/, 80 /*right*/, 60 /*bottom*/);
}
@@ -133,17 +145,6 @@ public class TaskRecordTests extends ActivityTestsBase {
assertTrue(task.returnsToHomeStack());
}
- /** Ensures that bounds are clipped to their parent. */
- @Test
- public void testAppBounds_BoundsClipping() {
- final Rect shiftedBounds = new Rect(mParentBounds);
- shiftedBounds.offset(10, 10);
- final Rect expectedBounds = new Rect(mParentBounds);
- expectedBounds.intersect(shiftedBounds);
- testStackBoundsConfiguration(WINDOWING_MODE_FULLSCREEN, mParentBounds, shiftedBounds,
- expectedBounds);
- }
-
/** Ensures that empty bounds are not propagated to the configuration. */
@Test
public void testAppBounds_EmptyBounds() {
@@ -167,36 +168,201 @@ public class TaskRecordTests extends ActivityTestsBase {
final Rect insetBounds = new Rect(mParentBounds);
insetBounds.inset(5, 5, 5, 5);
testStackBoundsConfiguration(
- WINDOWING_MODE_FULLSCREEN, mParentBounds, insetBounds, insetBounds);
+ WINDOWING_MODE_FREEFORM, mParentBounds, insetBounds, insetBounds);
}
- /** Ensures that full screen free form bounds are clipped */
+ /** Tests that the task bounds adjust properly to changes between FULLSCREEN and FREEFORM */
@Test
- public void testAppBounds_FullScreenFreeFormBounds() {
+ public void testBoundsOnModeChangeFreeformToFullscreen() {
ActivityDisplay display = mService.mRootActivityContainer.getDefaultDisplay();
+ ActivityStack stack = new StackBuilder(mRootActivityContainer).setDisplay(display)
+ .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+ TaskRecord task = stack.getChildAt(0);
+ task.getRootActivity().mAppWindowToken.setOrientation(SCREEN_ORIENTATION_UNSPECIFIED);
DisplayInfo info = new DisplayInfo();
display.mDisplay.getDisplayInfo(info);
final Rect fullScreenBounds = new Rect(0, 0, info.logicalWidth, info.logicalHeight);
- testStackBoundsConfiguration(WINDOWING_MODE_FULLSCREEN, mParentBounds, fullScreenBounds,
- mParentBounds);
+ final Rect freeformBounds = new Rect(fullScreenBounds);
+ freeformBounds.inset((int) (freeformBounds.width() * 0.2),
+ (int) (freeformBounds.height() * 0.2));
+ task.setBounds(freeformBounds);
+
+ assertEquals(freeformBounds, task.getBounds());
+
+ // FULLSCREEN inherits bounds
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ assertEquals(fullScreenBounds, task.getBounds());
+ assertEquals(freeformBounds, task.mLastNonFullscreenBounds);
+
+ // FREEFORM restores bounds
+ stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ assertEquals(freeformBounds, task.getBounds());
+ }
+
+ /**
+ * This is a temporary hack to trigger an onConfigurationChange at the task level after an
+ * orientation is requested. Normally this is done by the onDescendentOrientationChanged call
+ * up the WM hierarchy, but since the WM hierarchy is mocked out, it doesn't happen here.
+ * TODO: remove this when we either get a WM hierarchy or when hierarchies are merged.
+ */
+ private void setActivityRequestedOrientation(ActivityRecord activity, int orientation) {
+ activity.setRequestedOrientation(orientation);
+ ConfigurationContainer taskRecord = activity.getParent();
+ taskRecord.onConfigurationChanged(taskRecord.getParent().getConfiguration());
+ }
+
+ /**
+ * Tests that a task with forced orientation has orientation-consistent bounds within the
+ * parent.
+ */
+ @Test
+ public void testFullscreenBoundsForcedOrientation() {
+ final Rect fullScreenBounds = new Rect(0, 0, 1920, 1080);
+ final Rect fullScreenBoundsPort = new Rect(0, 0, 1080, 1920);
+ DisplayInfo info = new DisplayInfo();
+ info.logicalWidth = fullScreenBounds.width();
+ info.logicalHeight = fullScreenBounds.height();
+ ActivityDisplay display = addNewActivityDisplayAt(info, POSITION_TOP);
+ assertTrue(mRootActivityContainer.getActivityDisplay(display.mDisplayId) != null);
+ // Override display orientation. Normally this is available via DisplayContent, but DC
+ // is mocked-out.
+ display.getRequestedOverrideConfiguration().orientation =
+ Configuration.ORIENTATION_LANDSCAPE;
+ display.onRequestedOverrideConfigurationChanged(
+ display.getRequestedOverrideConfiguration());
+ ActivityStack stack = new StackBuilder(mRootActivityContainer)
+ .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(display).build();
+ TaskRecord task = stack.getChildAt(0);
+ ActivityRecord root = task.getTopActivity();
+ assertEquals(root, task.getTopActivity());
+
+ assertEquals(fullScreenBounds, task.getBounds());
+
+ // Setting app to fixed portrait fits within parent
+ setActivityRequestedOrientation(root, SCREEN_ORIENTATION_PORTRAIT);
+ assertEquals(root, task.getRootActivity());
+ assertEquals(SCREEN_ORIENTATION_PORTRAIT, task.getRootActivity().getOrientation());
+ assertTrue(task.getBounds().width() < task.getBounds().height());
+ assertEquals(fullScreenBounds.height(), task.getBounds().height());
+
+ // Top activity gets used
+ ActivityRecord top = new ActivityBuilder(mService).setTask(task).setStack(stack).build();
+ assertEquals(top, task.getTopActivity());
+ setActivityRequestedOrientation(top, SCREEN_ORIENTATION_LANDSCAPE);
+ assertTrue(task.getBounds().width() > task.getBounds().height());
+ assertEquals(task.getBounds().width(), fullScreenBounds.width());
+
+ // Setting app to unspecified restores
+ setActivityRequestedOrientation(top, SCREEN_ORIENTATION_UNSPECIFIED);
+ assertEquals(fullScreenBounds, task.getBounds());
+
+ // Setting app to fixed landscape and changing display
+ setActivityRequestedOrientation(top, SCREEN_ORIENTATION_LANDSCAPE);
+ // simulate display orientation changing (normally done via DisplayContent)
+ display.getRequestedOverrideConfiguration().orientation =
+ Configuration.ORIENTATION_PORTRAIT;
+ display.setBounds(fullScreenBoundsPort);
+ assertTrue(task.getBounds().width() > task.getBounds().height());
+ assertEquals(fullScreenBoundsPort.width(), task.getBounds().width());
+
+ // in FREEFORM, no constraint
+ final Rect freeformBounds = new Rect(display.getBounds());
+ freeformBounds.inset((int) (freeformBounds.width() * 0.2),
+ (int) (freeformBounds.height() * 0.2));
+ stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ task.setBounds(freeformBounds);
+ assertEquals(freeformBounds, task.getBounds());
+
+ // FULLSCREEN letterboxes bounds
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ assertTrue(task.getBounds().width() > task.getBounds().height());
+ assertEquals(fullScreenBoundsPort.width(), task.getBounds().width());
+
+ // FREEFORM restores bounds as before
+ stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ assertEquals(freeformBounds, task.getBounds());
+ }
+
+ @Test
+ public void testUpdatesForcedOrientationInBackground() {
+ final DisplayInfo info = new DisplayInfo();
+ info.logicalWidth = 1920;
+ info.logicalHeight = 1080;
+ final ActivityDisplay display = addNewActivityDisplayAt(info, POSITION_TOP);
+ doCallRealMethod().when(display.mDisplayContent).setDisplayRotation(any());
+ display.mDisplayContent.setDisplayRotation(mock(DisplayRotation.class));
+ doCallRealMethod().when(display.mDisplayContent).onDescendantOrientationChanged(any(),
+ any());
+ doCallRealMethod().when(display.mDisplayContent).setRotation(anyInt());
+ doAnswer(invocation -> {
+ display.mDisplayContent.setRotation(Surface.ROTATION_0);
+ return null;
+ }).when(display.mDisplayContent).updateOrientationFromAppTokens(any(), any(), anyBoolean());
+
+ final ActivityStack stack = new StackBuilder(mRootActivityContainer)
+ .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(display).build();
+ final TaskRecord task = stack.getChildAt(0);
+ final ActivityRecord activity = task.getRootActivity();
+
+ // Wire up app window token and task.
+ doCallRealMethod().when(activity.mAppWindowToken).setOrientation(anyInt(), any(), any());
+ doCallRealMethod().when(activity.mAppWindowToken).onDescendantOrientationChanged(any(),
+ any());
+ doReturn(task.mTask).when(activity.mAppWindowToken).getParent();
+
+ // Wire up task and stack.
+ task.mTask.mTaskRecord = task;
+ doCallRealMethod().when(task.mTask).onDescendantOrientationChanged(any(), any());
+ doReturn(stack.getTaskStack()).when(task.mTask).getParent();
+
+ // Wire up stack and display content.
+ doCallRealMethod().when(stack.mTaskStack).onDescendantOrientationChanged(any(), any());
+ doReturn(display.mDisplayContent).when(stack.mTaskStack).getParent();
+
+ activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ assertTrue("Bounds of the task should be pillarboxed.",
+ task.getBounds().width() < task.getBounds().height());
+
+ activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+ assertTrue("Bounds of the task should be fullscreen.",
+ task.getBounds().equals(new Rect(0, 0, 1920, 1080)));
}
/** Ensures that the alias intent won't have target component resolved. */
@Test
public void testTaskIntentActivityAlias() {
- final String aliasActivity = DEFAULT_COMPONENT_PACKAGE_NAME + ".aliasActivity";
- final String targetActivity = DEFAULT_COMPONENT_PACKAGE_NAME + ".targetActivity";
+ final String aliasClassName = DEFAULT_COMPONENT_PACKAGE_NAME + ".aliasActivity";
+ final String targetClassName = DEFAULT_COMPONENT_PACKAGE_NAME + ".targetActivity";
+ final ComponentName aliasComponent =
+ new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME, aliasClassName);
+ final ComponentName targetComponent =
+ new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME, targetClassName);
+
final Intent intent = new Intent();
- intent.setComponent(new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME, aliasActivity));
+ intent.setComponent(aliasComponent);
final ActivityInfo info = new ActivityInfo();
info.applicationInfo = new ApplicationInfo();
info.packageName = DEFAULT_COMPONENT_PACKAGE_NAME;
- info.targetActivity = targetActivity;
+ info.targetActivity = targetClassName;
final TaskRecord task = TaskRecord.create(mService, 1 /* taskId */, info, intent,
null /* taskDescription */);
- assertEquals("The alias activity component should be saved in task intent.", aliasActivity,
+ assertEquals("The alias activity component should be saved in task intent.", aliasClassName,
task.intent.getComponent().getClassName());
+
+ ActivityRecord aliasActivity = new ActivityBuilder(mService).setComponent(
+ aliasComponent).setTargetActivity(targetClassName).build();
+ assertEquals("Should be the same intent filter.", true,
+ task.isSameIntentFilter(aliasActivity));
+
+ ActivityRecord targetActivity = new ActivityBuilder(mService).setComponent(
+ targetComponent).build();
+ assertEquals("Should be the same intent filter.", true,
+ task.isSameIntentFilter(targetActivity));
+
+ ActivityRecord defaultActivity = new ActivityBuilder(mService).build();
+ assertEquals("Should not be the same intent filter.", false,
+ task.isSameIntentFilter(defaultActivity));
}
private void testStackBoundsConfiguration(int windowingMode, Rect parentBounds, Rect bounds,
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
index 624ef9ba1653..ca815eca9a1f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
@@ -39,6 +39,7 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.view.Surface;
+import android.view.SurfaceControl;
import androidx.test.filters.SmallTest;
@@ -65,7 +66,7 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase {
final TaskSnapshot snapshot = new TaskSnapshot(new ComponentName("", ""), buffer,
ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */,
WINDOWING_MODE_FULLSCREEN, 0 /* systemUiVisibility */, false /* isTranslucent */);
- mSurface = new TaskSnapshotSurface(mWm, new Window(), new Surface(), snapshot, "Test",
+ mSurface = new TaskSnapshotSurface(mWm, new Window(), new SurfaceControl(), snapshot, "Test",
Color.WHITE, Color.RED, Color.BLUE, sysuiVis, windowFlags, 0, taskBounds,
ORIENTATION_PORTRAIT);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java
index f01e9f0662c9..74ccccca43bb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java
@@ -47,8 +47,8 @@ public class TaskStackContainersTests extends WindowTestsBase {
@Before
public void setUp() throws Exception {
- mPinnedStack = createStackControllerOnStackOnDisplay(
- WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
+ mPinnedStack = createTaskStackOnDisplay(
+ WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
// Stack should contain visible app window to be considered visible.
final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */);
assertFalse(mPinnedStack.isVisible());
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
index 7ac331829fb1..2554237cdbf5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
@@ -20,8 +20,12 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -106,4 +110,62 @@ public class TaskStackTests extends WindowTestsBase {
assertNull(stack.getDisplayContent());
assertNull(task.mStack);
}
+
+ @Test
+ public void testRemoveContainer() {
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
+ final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack);
+
+ assertNotNull(stack);
+ assertNotNull(task);
+ stack.removeIfPossible();
+ // Assert that the container was removed.
+ assertNull(stack.getParent());
+ assertEquals(0, stack.getChildCount());
+ assertNull(stack.getDisplayContent());
+ assertNull(task.getDisplayContent());
+ assertNull(task.mStack);
+ }
+
+ @Test
+ public void testRemoveContainer_deferRemoval() {
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
+ final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack);
+
+ // Stack removal is deferred if one of its child is animating.
+ task.setLocalIsAnimating(true);
+
+ stack.removeIfPossible();
+ // For the case of deferred removal the task controller will still be connected to the its
+ // container until the stack window container is removed.
+ assertNotNull(stack.getParent());
+ assertNotEquals(0, stack.getChildCount());
+ assertNotNull(task);
+
+ stack.removeImmediately();
+ // After removing, the task will be isolated.
+ assertNull(task.getParent());
+ assertEquals(0, task.getChildCount());
+ assertNull(task.getController());
+ }
+
+ @Test
+ public void testReparent() {
+ // Create first stack on primary display.
+ final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
+ final WindowTestUtils.TestTask task1 = WindowTestUtils.createTestTask(stack1);
+ task1.mOnDisplayChangedCalled = false;
+
+ // Create second display and put second stack on it.
+ final DisplayContent dc = createNewDisplay();
+ final TaskStack stack2 = createTaskStackOnDisplay(dc);
+
+ // Reparent
+ stack1.reparent(dc.getDisplayId(), new Rect(), true /* onTop */);
+ assertEquals(dc, stack1.getDisplayContent());
+ final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1);
+ final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2);
+ assertEquals(stack1PositionInParent, stack2PositionInParent + 1);
+ assertTrue(task1.mOnDisplayChangedCalled);
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index 3e32ed37a6f3..ae211d3f1e38 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -40,8 +40,7 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testRemoveContainer() {
- final StackWindowController stackController1 =
- createStackControllerOnDisplay(mDisplayContent);
+ final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent);
final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1);
final WindowTestUtils.TestAppWindowToken appToken =
WindowTestUtils.createAppWindowTokenInTask(mDisplayContent, task);
@@ -49,14 +48,13 @@ public class TaskTests extends WindowTestsBase {
task.removeIfPossible();
// Assert that the container was removed.
assertNull(task.getParent());
- assertEquals(task.getChildCount(), 0);
+ assertEquals(0, task.getChildCount());
assertNull(appToken.getParent());
}
@Test
public void testRemoveContainer_deferRemoval() {
- final StackWindowController stackController1 =
- createStackControllerOnDisplay(mDisplayContent);
+ final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent);
final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1);
final WindowTestUtils.TestAppWindowToken appToken =
WindowTestUtils.createAppWindowTokenInTask(mDisplayContent, task);
@@ -67,22 +65,20 @@ public class TaskTests extends WindowTestsBase {
// For the case of deferred removal the task will still be connected to the its app token
// until the task window container is removed.
assertNotNull(task.getParent());
- assertNotEquals(task.getChildCount(), 0);
+ assertNotEquals(0, task.getChildCount());
assertNotNull(appToken.getParent());
task.removeImmediately();
assertNull(task.getParent());
- assertEquals(task.getChildCount(), 0);
+ assertEquals(0, task.getChildCount());
assertNull(appToken.getParent());
}
@Test
public void testReparent() {
- final StackWindowController stackController1 =
- createStackControllerOnDisplay(mDisplayContent);
+ final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent);
final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1);
- final StackWindowController stackController2 =
- createStackControllerOnDisplay(mDisplayContent);
+ final TaskStack stackController2 = createTaskStackOnDisplay(mDisplayContent);
final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stackController2);
boolean gotException = false;
@@ -93,20 +89,17 @@ public class TaskTests extends WindowTestsBase {
}
assertTrue("Should not be able to reparent to the same parent", gotException);
- final StackWindowController stackController3 =
- createStackControllerOnDisplay(mDisplayContent);
- stackController3.setContainer(null);
gotException = false;
try {
- task.reparent(stackController3, 0, false/* moveParents */);
+ task.reparent(null, 0, false/* moveParents */);
} catch (IllegalArgumentException e) {
gotException = true;
}
- assertTrue("Should not be able to reparent to a stack that doesn't have a container",
+ assertTrue("Should not be able to reparent to a stack that doesn't exist",
gotException);
task.reparent(stackController2, 0, false/* moveParents */);
- assertEquals(stackController2.mContainer, task.getParent());
+ assertEquals(stackController2, task.getParent());
assertEquals(0, task.positionInParent());
assertEquals(1, task2.positionInParent());
}
@@ -114,20 +107,17 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testReparent_BetweenDisplays() {
// Create first stack on primary display.
- final StackWindowController stack1Controller =
- createStackControllerOnDisplay(mDisplayContent);
- final TaskStack stack1 = stack1Controller.mContainer;
- final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack1Controller);
+ final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
+ final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack1);
task.mOnDisplayChangedCalled = false;
assertEquals(mDisplayContent, stack1.getDisplayContent());
// Create second display and put second stack on it.
final DisplayContent dc = createNewDisplay();
- final StackWindowController stack2Controller = createStackControllerOnDisplay(dc);
- final TaskStack stack2 = stack2Controller.mContainer;
- final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stack2Controller);
+ final TaskStack stack2 = createTaskStackOnDisplay(dc);
+ final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stack2);
// Reparent and check state
- task.reparent(stack2Controller, 0, false /* moveParents */);
+ task.reparent(stack2, 0, false /* moveParents */);
assertEquals(stack2, task.getParent());
assertEquals(0, task.positionInParent());
assertEquals(1, task2.positionInParent());
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java b/services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java
new file mode 100644
index 000000000000..b151fb7a613c
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyString;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.nullable;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+
+import android.app.ActivityManagerInternal;
+import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.hardware.display.DisplayManagerInternal;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.PowerManagerInternal;
+import android.os.PowerSaveState;
+import android.os.UserHandle;
+import android.view.Display;
+import android.view.InputChannel;
+
+import com.android.dx.mockito.inline.extended.StaticMockitoSession;
+import com.android.server.LocalServices;
+import com.android.server.LockGuard;
+import com.android.server.Watchdog;
+import com.android.server.input.InputManagerService;
+import com.android.server.policy.WindowManagerPolicy;
+
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.quality.Strictness;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * A Test utility class to create a mock {@link WindowManagerService} instance for tests.
+ */
+class TestSystemServices {
+ private static StaticMockitoSession sMockitoSession;
+ private static WindowManagerService sService;
+ private static TestWindowManagerPolicy sPolicy;
+
+ static void setUpWindowManagerService() {
+ sMockitoSession = mockitoSession()
+ .spyStatic(LockGuard.class)
+ .spyStatic(Watchdog.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
+
+ runWithDexmakerShareClassLoader(TestSystemServices::setUpTestWindowService);
+ }
+
+ static void tearDownWindowManagerService() {
+ waitUntilWindowManagerHandlersIdle();
+ removeLocalServices();
+ sService = null;
+ sPolicy = null;
+
+ sMockitoSession.finishMocking();
+ }
+
+ private static void setUpTestWindowService() {
+ doReturn(null).when(() -> LockGuard.installLock(any(), anyInt()));
+ doReturn(mock(Watchdog.class)).when(Watchdog::getInstance);
+
+ final Context context = getInstrumentation().getTargetContext();
+ spyOn(context);
+
+ doReturn(null).when(context)
+ .registerReceiver(nullable(BroadcastReceiver.class), any(IntentFilter.class));
+ doReturn(null).when(context)
+ .registerReceiverAsUser(any(BroadcastReceiver.class), any(UserHandle.class),
+ any(IntentFilter.class), nullable(String.class), nullable(Handler.class));
+
+ final ContentResolver contentResolver = context.getContentResolver();
+ spyOn(contentResolver);
+ doNothing().when(contentResolver)
+ .registerContentObserver(any(Uri.class), anyBoolean(), any(ContentObserver.class),
+ anyInt());
+
+ final AppOpsManager appOpsManager = mock(AppOpsManager.class);
+ doReturn(appOpsManager).when(context)
+ .getSystemService(eq(Context.APP_OPS_SERVICE));
+
+ removeLocalServices();
+
+ final DisplayManagerInternal dmi = mock(DisplayManagerInternal.class);
+ LocalServices.addService(DisplayManagerInternal.class, dmi);
+
+ final PowerManagerInternal pmi = mock(PowerManagerInternal.class);
+ LocalServices.addService(PowerManagerInternal.class, pmi);
+ final PowerSaveState state = new PowerSaveState.Builder().build();
+ doReturn(state).when(pmi).getLowPowerState(anyInt());
+
+ final ActivityManagerInternal ami = mock(ActivityManagerInternal.class);
+ LocalServices.addService(ActivityManagerInternal.class, ami);
+
+ final ActivityTaskManagerInternal atmi = mock(ActivityTaskManagerInternal.class);
+ LocalServices.addService(ActivityTaskManagerInternal.class, atmi);
+ doAnswer((InvocationOnMock invocationOnMock) -> {
+ final Runnable runnable = invocationOnMock.getArgument(0);
+ if (runnable != null) {
+ runnable.run();
+ }
+ return null;
+ }).when(atmi).notifyKeyguardFlagsChanged(nullable(Runnable.class), anyInt());
+
+ final InputManagerService ims = mock(InputManagerService.class);
+ // InputChannel is final and can't be mocked.
+ final InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM);
+ if (input != null && input.length > 1) {
+ doReturn(input[1]).when(ims).monitorInput(anyString(), anyInt());
+ }
+
+ final ActivityTaskManagerService atms = mock(ActivityTaskManagerService.class);
+ final WindowManagerGlobalLock wmLock = new WindowManagerGlobalLock();
+ doReturn(wmLock).when(atms).getGlobalLock();
+
+ sPolicy = new TestWindowManagerPolicy(TestSystemServices::getWindowManagerService);
+ sService = WindowManagerService.main(context, ims, false, false, sPolicy, atms);
+
+ sService.onInitReady();
+
+ final Display display = sService.mDisplayManager.getDisplay(DEFAULT_DISPLAY);
+ // Display creation is driven by the ActivityManagerService via
+ // ActivityStackSupervisor. We emulate those steps here.
+ sService.mRoot.createDisplayContent(display, mock(ActivityDisplay.class));
+ }
+
+ private static void removeLocalServices() {
+ LocalServices.removeServiceForTest(DisplayManagerInternal.class);
+ LocalServices.removeServiceForTest(PowerManagerInternal.class);
+ LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class);
+ LocalServices.removeServiceForTest(WindowManagerInternal.class);
+ LocalServices.removeServiceForTest(WindowManagerPolicy.class);
+ }
+
+ static WindowManagerService getWindowManagerService() {
+ return sService;
+ }
+
+ static void cleanupWindowManagerHandlers() {
+ final WindowManagerService wm = getWindowManagerService();
+ if (wm == null) {
+ return;
+ }
+ wm.mH.removeCallbacksAndMessages(null);
+ wm.mAnimationHandler.removeCallbacksAndMessages(null);
+ SurfaceAnimationThread.getHandler().removeCallbacksAndMessages(null);
+ }
+
+ static void waitUntilWindowManagerHandlersIdle() {
+ final WindowManagerService wm = getWindowManagerService();
+ if (wm == null) {
+ return;
+ }
+ // Removing delayed FORCE_GC message decreases time for waiting idle.
+ wm.mH.removeMessages(WindowManagerService.H.FORCE_GC);
+ waitHandlerIdle(wm.mH);
+ waitHandlerIdle(wm.mAnimationHandler);
+ waitHandlerIdle(SurfaceAnimationThread.getHandler());
+ }
+
+ private static void waitHandlerIdle(Handler handler) {
+ if (!handler.hasMessagesOrCallbacks()) {
+ return;
+ }
+ final CountDownLatch latch = new CountDownLatch(1);
+ // Wait for delayed messages are processed.
+ handler.getLooper().getQueue().addIdleHandler(() -> {
+ if (handler.hasMessagesOrCallbacks()) {
+ return true; // keep idle handler.
+ }
+ latch.countDown();
+ return false; // remove idle handler.
+ });
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ }
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
index d9ef10d7eecb..0a4a8a43fbc5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
@@ -16,12 +16,15 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.DisplayCutout.BOUNDS_POSITION_TOP;
import static android.view.DisplayCutout.fromBoundingRect;
import static android.view.WindowManager.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
import android.app.ActivityManager.TaskDescription;
import android.content.res.Configuration;
@@ -58,7 +61,7 @@ public class WindowFrameTests extends WindowTestsBase {
boolean mDockedResizingForTest = false;
WindowStateWithTask(WindowManagerService wm, IWindow iWindow, WindowToken windowToken,
WindowManager.LayoutParams attrs, Task t) {
- super(wm, null, iWindow, windowToken, null, 0, 0, attrs, 0, 0,
+ super(wm, mock(Session.class), iWindow, windowToken, null, 0, 0, attrs, 0, 0,
false /* ownerCanAddInternalSystemWindow */);
mTask = t;
}
@@ -113,9 +116,9 @@ public class WindowFrameTests extends WindowTestsBase {
@Before
public void setUp() throws Exception {
- mWindowToken = WindowTestUtils.createTestAppWindowToken(
- mWm.getDefaultDisplayContentLocked());
- mStubStack = new TaskStack(mWm, 0, null);
+ mWindowToken = createAppWindowToken(mWm.getDefaultDisplayContentLocked(),
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ mStubStack = WindowTestUtils.createMockTaskStack();
}
// Do not use this function directly in the tests below. Instead, use more explicit function
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRule.java
deleted file mode 100644
index 04e433e98678..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceRule.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2018 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.wm;
-
-import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
-import static android.view.Display.DEFAULT_DISPLAY;
-
-import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
-
-import android.app.ActivityManagerInternal;
-import android.content.Context;
-import android.hardware.display.DisplayManagerInternal;
-import android.os.PowerManagerInternal;
-import android.os.PowerSaveState;
-import android.view.Display;
-import android.view.InputChannel;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Transaction;
-
-import com.android.server.LocalServices;
-import com.android.server.input.InputManagerService;
-import com.android.server.policy.WindowManagerPolicy;
-
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-import org.mockito.invocation.InvocationOnMock;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A test rule that sets up a fresh WindowManagerService instance before each test and makes sure
- * to properly tear it down after.
- *
- * <p>
- * Usage:
- * <pre>
- * {@literal @}Rule
- * public final WindowManagerServiceRule mWmRule = new WindowManagerServiceRule();
- * </pre>
- */
-public class WindowManagerServiceRule implements TestRule {
-
- private WindowManagerService mService;
- private TestWindowManagerPolicy mPolicy;
- // Record all {@link SurfaceControl.Transaction} created while testing and releases native
- // resources when test finishes.
- private final List<WeakReference<Transaction>> mSurfaceTransactions = new ArrayList<>();
- // Record all {@link SurfaceControl} created while testing and releases native resources when
- // test finishes.
- private final List<WeakReference<SurfaceControl>> mSurfaceControls = new ArrayList<>();
-
- @Override
- public Statement apply(Statement base, Description description) {
- return new Statement() {
- @Override
- public void evaluate() throws Throwable {
- runWithDexmakerShareClassLoader(this::setUp);
- try {
- base.evaluate();
- } finally {
- tearDown();
- }
- }
-
- private void setUp() {
- final Context context = getInstrumentation().getTargetContext();
-
- removeServices();
-
- LocalServices.addService(DisplayManagerInternal.class,
- mock(DisplayManagerInternal.class));
-
- LocalServices.addService(PowerManagerInternal.class,
- mock(PowerManagerInternal.class));
- final PowerManagerInternal pm =
- LocalServices.getService(PowerManagerInternal.class);
- doNothing().when(pm).registerLowPowerModeObserver(any());
- PowerSaveState state = new PowerSaveState.Builder().build();
- doReturn(state).when(pm).getLowPowerState(anyInt());
-
- LocalServices.addService(ActivityManagerInternal.class,
- mock(ActivityManagerInternal.class));
- LocalServices.addService(ActivityTaskManagerInternal.class,
- mock(ActivityTaskManagerInternal.class));
- final ActivityTaskManagerInternal atm =
- LocalServices.getService(ActivityTaskManagerInternal.class);
- doAnswer((InvocationOnMock invocationOnMock) -> {
- final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
- if (runnable != null) {
- runnable.run();
- }
- return null;
- }).when(atm).notifyKeyguardFlagsChanged(any(), anyInt());
-
- InputManagerService ims = mock(InputManagerService.class);
- // InputChannel is final and can't be mocked.
- InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM);
- if (input != null && input.length > 1) {
- doReturn(input[1]).when(ims).monitorInput(anyString(), anyInt());
- }
- ActivityTaskManagerService atms = mock(ActivityTaskManagerService.class);
- when(atms.getGlobalLock()).thenReturn(new WindowManagerGlobalLock());
-
- mService = WindowManagerService.main(context, ims, false, false,
- mPolicy = new TestWindowManagerPolicy(
- WindowManagerServiceRule.this::getWindowManagerService), atms);
- mService.mTransactionFactory = () -> {
- final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
- mSurfaceTransactions.add(new WeakReference<>(transaction));
- return transaction;
- };
- mService.mSurfaceBuilderFactory = session -> new SurfaceControl.Builder(session) {
- @Override
- public SurfaceControl build() {
- final SurfaceControl control = super.build();
- mSurfaceControls.add(new WeakReference<>(control));
- return control;
- }
- };
-
- mService.onInitReady();
-
- final Display display = mService.mDisplayManager.getDisplay(DEFAULT_DISPLAY);
- // Display creation is driven by the ActivityManagerService via
- // ActivityStackSupervisor. We emulate those steps here.
- mService.mRoot.createDisplayContent(display, mock(ActivityDisplay.class));
- }
-
- private void removeServices() {
- LocalServices.removeServiceForTest(DisplayManagerInternal.class);
- LocalServices.removeServiceForTest(PowerManagerInternal.class);
- LocalServices.removeServiceForTest(ActivityManagerInternal.class);
- LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class);
- LocalServices.removeServiceForTest(WindowManagerInternal.class);
- LocalServices.removeServiceForTest(WindowManagerPolicy.class);
- }
-
- private void tearDown() {
- cancelAllPendingAnimations();
- waitUntilWindowManagerHandlersIdle();
- destroyAllSurfaceTransactions();
- destroyAllSurfaceControls();
- removeServices();
- mService = null;
- mPolicy = null;
- }
- };
- }
-
- WindowManagerService getWindowManagerService() {
- return mService;
- }
-
- private void cancelAllPendingAnimations() {
- for (final WeakReference<SurfaceControl> reference : mSurfaceControls) {
- final SurfaceControl sc = reference.get();
- if (sc != null) {
- mService.mSurfaceAnimationRunner.onAnimationCancelled(sc);
- }
- }
- }
-
- void waitUntilWindowManagerHandlersIdle() {
- final WindowManagerService wm = getWindowManagerService();
- if (wm == null) {
- return;
- }
- wm.mH.removeCallbacksAndMessages(null);
- wm.mAnimationHandler.removeCallbacksAndMessages(null);
- SurfaceAnimationThread.getHandler().removeCallbacksAndMessages(null);
- wm.mH.runWithScissors(() -> { }, 0);
- wm.mAnimationHandler.runWithScissors(() -> { }, 0);
- SurfaceAnimationThread.getHandler().runWithScissors(() -> { }, 0);
- }
-
- private void destroyAllSurfaceTransactions() {
- for (final WeakReference<Transaction> reference : mSurfaceTransactions) {
- final Transaction transaction = reference.get();
- if (transaction != null) {
- reference.clear();
- transaction.close();
- }
- }
- }
-
- private void destroyAllSurfaceControls() {
- for (final WeakReference<SurfaceControl> reference : mSurfaceControls) {
- final SurfaceControl control = reference.get();
- if (control != null) {
- reference.clear();
- control.destroy();
- }
- }
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
index 20fc5ae2454e..44e998b7e62a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
@@ -103,12 +103,10 @@ public class WindowTestUtils {
}
/**
- * Creates a mock instance of {@link StackWindowController}.
+ * Creates a mock instance of {@link TestTaskStack}.
*/
- public static StackWindowController createMockStackWindowContainerController() {
- StackWindowController controller = mock(StackWindowController.class);
- controller.mContainer = mock(TestTaskStack.class);
- return controller;
+ public static TaskStack createMockTaskStack() {
+ return mock(TestTaskStack.class);
}
/** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
@@ -201,6 +199,11 @@ public class WindowTestUtils {
}
@Override
+ void onParentSet() {
+ // Do nothing.
+ }
+
+ @Override
boolean isOnTop() {
return mOnTop;
}
@@ -283,10 +286,9 @@ public class WindowTestUtils {
}
}
- public static TestTask createTestTask(StackWindowController stackWindowController) {
- return new TestTask(sNextTaskId++, stackWindowController.mContainer, 0,
- stackWindowController.mService, RESIZE_MODE_UNRESIZEABLE, false,
- mock(TaskRecord.class));
+ public static TestTask createTestTask(TaskStack stack) {
+ return new TestTask(sNextTaskId++, stack, 0, stack.mWmService, RESIZE_MODE_UNRESIZEABLE,
+ false, mock(TaskRecord.class));
}
public static class TestIApplicationToken implements IApplicationToken {
@@ -334,5 +336,10 @@ public class WindowTestUtils {
mHasSurface = hadSurface;
}
+
+ @Override
+ void onParentSet() {
+ // Do nothing;
+ }
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 5c3368bd25ac..e38118e875e0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -41,7 +41,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import android.content.Context;
import android.content.res.Configuration;
-import android.graphics.Rect;
import android.hardware.display.DisplayManagerGlobal;
import android.testing.DexmakerShareClassLoaderRule;
import android.util.Log;
@@ -53,6 +52,7 @@ import android.view.WindowManager;
import com.android.server.AttributeCache;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
@@ -95,17 +95,22 @@ class WindowTestsBase {
public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
new DexmakerShareClassLoaderRule();
- @Rule
- public final WindowManagerServiceRule mWmRule = new WindowManagerServiceRule();
-
- static WindowState.PowerManagerWrapper sPowerManagerWrapper; // TODO(roosa): make non-static.
+ static WindowState.PowerManagerWrapper sPowerManagerWrapper;
@BeforeClass
public static void setUpOnceBase() {
AttributeCache.init(getInstrumentation().getTargetContext());
+
+ TestSystemServices.setUpWindowManagerService();
+
sPowerManagerWrapper = mock(WindowState.PowerManagerWrapper.class);
}
+ @AfterClass
+ public static void tearDonwOnceBase() {
+ TestSystemServices.tearDownWindowManagerService();
+ }
+
@Before
public void setUpBase() {
// If @Before throws an exception, the error isn't logged. This will make sure any failures
@@ -115,7 +120,7 @@ class WindowTestsBase {
final Context context = getInstrumentation().getTargetContext();
- mWm = mWmRule.getWindowManagerService();
+ mWm = TestSystemServices.getWindowManagerService();
beforeCreateDisplay();
context.getDisplay().getDisplayInfo(mDisplayInfo);
@@ -192,8 +197,8 @@ class WindowTestsBase {
mDisplayContent.mInputMethodTarget = null;
}
- // Wait until everything is really cleaned up.
- waitUntilHandlersIdle();
+ // Cleaned up everything in Handler.
+ TestSystemServices.cleanupWindowManagerHandlers();
} catch (Exception e) {
Log.e(TAG, "Failed to tear down test", e);
throw e;
@@ -214,7 +219,7 @@ class WindowTestsBase {
* Waits until the main handler for WM has processed all messages.
*/
void waitUntilHandlersIdle() {
- mWmRule.waitUntilWindowManagerHandlersIdle();
+ TestSystemServices.waitUntilWindowManagerHandlersIdle();
}
private WindowToken createWindowToken(
@@ -234,8 +239,7 @@ class WindowTestsBase {
WindowTestUtils.TestAppWindowToken createTestAppWindowToken(DisplayContent dc, int
windowingMode, int activityType) {
- final TaskStack stack = createStackControllerOnStackOnDisplay(windowingMode, activityType,
- dc).mContainer;
+ final TaskStack stack = createTaskStackOnDisplay(windowingMode, activityType, dc);
final Task task = createTaskInStack(stack, 0 /* userId */);
final WindowTestUtils.TestAppWindowToken appWindowToken =
WindowTestUtils.createTestAppWindowToken(dc);
@@ -251,6 +255,14 @@ class WindowTestsBase {
}
}
+ WindowState createWindow(WindowState parent, int type, String name, int ownerId) {
+ synchronized (mWm.mGlobalLock) {
+ return (parent == null)
+ ? createWindow(parent, type, mDisplayContent, name, ownerId)
+ : createWindow(parent, type, parent.mToken, name, ownerId);
+ }
+ }
+
WindowState createWindowOnStack(WindowState parent, int windowingMode, int activityType,
int type, DisplayContent dc, String name) {
synchronized (mWm.mGlobalLock) {
@@ -271,7 +283,16 @@ class WindowTestsBase {
synchronized (mWm.mGlobalLock) {
final WindowToken token = createWindowToken(
dc, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, type);
- return createWindow(parent, type, token, name);
+ return createWindow(parent, type, token, name, 0 /* ownerId */);
+ }
+ }
+
+ WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
+ int ownerId) {
+ synchronized (mWm.mGlobalLock) {
+ final WindowToken token = createWindowToken(
+ dc, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, type);
+ return createWindow(parent, type, token, name, ownerId);
}
}
@@ -293,6 +314,14 @@ class WindowTestsBase {
}
WindowState createWindow(WindowState parent, int type, WindowToken token, String name,
+ int ownerId) {
+ synchronized (mWm.mGlobalLock) {
+ return createWindow(parent, type, token, name, ownerId,
+ false /* ownerCanAddInternalSystemWindow */);
+ }
+ }
+
+ WindowState createWindow(WindowState parent, int type, WindowToken token, String name,
int ownerId, boolean ownerCanAddInternalSystemWindow) {
return createWindow(parent, type, token, name, ownerId, ownerCanAddInternalSystemWindow,
mWm, mMockSession, mIWindow);
@@ -319,28 +348,20 @@ class WindowTestsBase {
/** Creates a {@link TaskStack} and adds it to the specified {@link DisplayContent}. */
TaskStack createTaskStackOnDisplay(DisplayContent dc) {
synchronized (mWm.mGlobalLock) {
- return createStackControllerOnDisplay(dc).mContainer;
- }
- }
-
- StackWindowController createStackControllerOnDisplay(DisplayContent dc) {
- synchronized (mWm.mGlobalLock) {
- return createStackControllerOnStackOnDisplay(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, dc);
+ return createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, dc);
}
}
- StackWindowController createStackControllerOnStackOnDisplay(
- int windowingMode, int activityType, DisplayContent dc) {
+ TaskStack createTaskStackOnDisplay(int windowingMode, int activityType, DisplayContent dc) {
synchronized (mWm.mGlobalLock) {
final Configuration overrideConfig = new Configuration();
overrideConfig.windowConfiguration.setWindowingMode(windowingMode);
overrideConfig.windowConfiguration.setActivityType(activityType);
final int stackId = ++sNextStackId;
- final StackWindowController controller = new StackWindowController(stackId, null,
- dc.getDisplayId(), true /* onTop */, new Rect(), mWm);
- controller.onRequestedOverrideConfigurationChanged(overrideConfig);
- return controller;
+ final TaskStack stack = new TaskStack(mWm, stackId, mock(ActivityStack.class));
+ dc.setStackOnDisplay(stackId, true, stack);
+ stack.onRequestedOverrideConfigurationChanged(overrideConfig);
+ return stack;
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java
new file mode 100644
index 000000000000..8d834974148c
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2019 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.wm;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.platform.test.annotations.Presubmit;
+import android.util.proto.ProtoOutputStream;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+
+
+/**
+ * Test class for {@link WindowTraceBuffer} and {@link WindowTraceQueueBuffer}.
+ *
+ * Build/Install/Run:
+ * atest WmTests:WindowTraceBufferTest
+ */
+@SmallTest
+@Presubmit
+public class WindowTraceBufferTest {
+ private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
+
+ private File mFile;
+
+ @Before
+ public void setUp() throws Exception {
+ final Context testContext = getInstrumentation().getContext();
+ mFile = testContext.getFileStreamPath("tracing_test.dat");
+ mFile.delete();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mFile.delete();
+ }
+
+ @Test
+ public void testTraceQueueBuffer_addItem() throws Exception {
+ ProtoOutputStream toWrite1 = getDummy(1);
+ ProtoOutputStream toWrite2 = getDummy(2);
+ ProtoOutputStream toWrite3 = getDummy(3);
+ byte[] toWrite1Bytes = toWrite1.getBytes();
+ byte[] toWrite2Bytes = toWrite2.getBytes();
+ byte[] toWrite3Bytes = toWrite3.getBytes();
+
+ final int objectSize = toWrite1.getBytes().length;
+ final int bufferCapacity = objectSize * 2;
+
+ final WindowTraceBuffer buffer = buildQueueBuffer(bufferCapacity);
+
+ buffer.add(toWrite1);
+ assertTrue("First element should be in the list",
+ buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite1Bytes)));
+
+ buffer.add(toWrite2);
+ assertTrue("First element should be in the list",
+ buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite1Bytes)));
+ assertTrue("Second element should be in the list",
+ buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite2Bytes)));
+
+ buffer.add(toWrite3);
+
+ assertTrue("Third element should not be in the list",
+ buffer.mBuffer.stream().noneMatch(p -> Arrays.equals(p, toWrite3Bytes)));
+
+ assertEquals("Buffer should have 2 elements", buffer.mBuffer.size(), 2);
+ assertEquals(String.format("Buffer is full, used space should be %d", bufferCapacity),
+ buffer.mBufferSize, bufferCapacity);
+ assertEquals("Buffer is full, available space should be 0",
+ buffer.getAvailableSpace(), 0);
+ }
+
+ private ProtoOutputStream getDummy(int value) {
+ ProtoOutputStream toWrite = new ProtoOutputStream();
+ toWrite.write(MAGIC_NUMBER, value);
+ toWrite.flush();
+
+ return toWrite;
+ }
+
+ private WindowTraceBuffer buildQueueBuffer(int size) throws IOException {
+ return new WindowTraceQueueBuffer(size, mFile, false);
+ }
+}
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 8e1ede116abf..2ed11fe92e15 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -23,7 +23,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
@@ -62,6 +61,8 @@ public class AppTimeLimitController {
private static final long ONE_MINUTE = 60_000L;
+ private static final Integer ONE = new Integer(1);
+
/** Collection of data for each user that has reported usage */
@GuardedBy("mLock")
private final SparseArray<UserData> mUsers = new SparseArray<>();
@@ -79,11 +80,11 @@ public class AppTimeLimitController {
private @UserIdInt
int userId;
- /** Set of the currently active entities */
- private final ArraySet<String> currentlyActive = new ArraySet<>();
+ /** Count of the currently active entities */
+ public final ArrayMap<String, Integer> currentlyActive = new ArrayMap<>();
/** Map from entity name for quick lookup */
- private final ArrayMap<String, ArrayList<UsageGroup>> observedMap = new ArrayMap<>();
+ public final ArrayMap<String, ArrayList<UsageGroup>> observedMap = new ArrayMap<>();
private UserData(@UserIdInt int userId) {
this.userId = userId;
@@ -94,7 +95,7 @@ public class AppTimeLimitController {
// TODO: Consider using a bloom filter here if number of actives becomes large
final int size = entities.length;
for (int i = 0; i < size; i++) {
- if (currentlyActive.contains(entities[i])) {
+ if (currentlyActive.containsKey(entities[i])) {
return true;
}
}
@@ -137,7 +138,7 @@ public class AppTimeLimitController {
pw.print(" Currently Active:");
final int nActive = currentlyActive.size();
for (int i = 0; i < nActive; i++) {
- pw.print(currentlyActive.valueAt(i));
+ pw.print(currentlyActive.keyAt(i));
pw.print(", ");
}
pw.println();
@@ -233,6 +234,7 @@ public class AppTimeLimitController {
protected long mUsageTimeMs;
protected int mActives;
protected long mLastKnownUsageTimeMs;
+ protected long mLastUsageEndTimeMs;
protected WeakReference<UserData> mUserRef;
protected WeakReference<ObserverAppData> mObserverAppRef;
protected PendingIntent mLimitReachedCallback;
@@ -271,9 +273,15 @@ public class AppTimeLimitController {
@GuardedBy("mLock")
void noteUsageStart(long startTimeMs, long currentTimeMs) {
if (mActives++ == 0) {
+ // If last known usage ended after the start of this usage, there is overlap
+ // between the last usage session and this one. Avoid double counting by only
+ // counting from the end of the last session. This has a rare side effect that some
+ // usage will not be accounted for if the previous session started and stopped
+ // within this current usage.
+ startTimeMs = mLastUsageEndTimeMs > startTimeMs ? mLastUsageEndTimeMs : startTimeMs;
mLastKnownUsageTimeMs = startTimeMs;
final long timeRemaining =
- mTimeLimitMs - mUsageTimeMs + currentTimeMs - startTimeMs;
+ mTimeLimitMs - mUsageTimeMs - currentTimeMs + startTimeMs;
if (timeRemaining > 0) {
if (DEBUG) {
Slog.d(TAG, "Posting timeout for " + mObserverId + " for "
@@ -287,7 +295,7 @@ public class AppTimeLimitController {
mActives = mObserved.length;
final UserData user = mUserRef.get();
if (user == null) return;
- final Object[] array = user.currentlyActive.toArray();
+ final Object[] array = user.currentlyActive.keySet().toArray();
Slog.e(TAG,
"Too many noted usage starts! Observed entities: " + Arrays.toString(
mObserved) + " Active Entities: " + Arrays.toString(array));
@@ -300,6 +308,8 @@ public class AppTimeLimitController {
if (--mActives == 0) {
final boolean limitNotCrossed = mUsageTimeMs < mTimeLimitMs;
mUsageTimeMs += stopTimeMs - mLastKnownUsageTimeMs;
+
+ mLastUsageEndTimeMs = stopTimeMs;
if (limitNotCrossed && mUsageTimeMs >= mTimeLimitMs) {
// Crossed the limit
if (DEBUG) Slog.d(TAG, "MTB informing group obs=" + mObserverId);
@@ -312,7 +322,7 @@ public class AppTimeLimitController {
mActives = 0;
final UserData user = mUserRef.get();
if (user == null) return;
- final Object[] array = user.currentlyActive.toArray();
+ final Object[] array = user.currentlyActive.keySet().toArray();
Slog.e(TAG,
"Too many noted usage stops! Observed entities: " + Arrays.toString(
mObserved) + " Active Entities: " + Arrays.toString(array));
@@ -409,7 +419,6 @@ public class AppTimeLimitController {
}
class SessionUsageGroup extends UsageGroup {
- private long mLastUsageEndTimeMs;
private long mNewSessionThresholdMs;
private PendingIntent mSessionEndCallback;
@@ -451,7 +460,6 @@ public class AppTimeLimitController {
public void noteUsageStop(long stopTimeMs) {
super.noteUsageStop(stopTimeMs);
if (mActives == 0) {
- mLastUsageEndTimeMs = stopTimeMs;
if (mUsageTimeMs >= mTimeLimitMs) {
// Usage has ended. Schedule the session end callback to be triggered once
// the new session threshold has been reached
@@ -467,7 +475,10 @@ public class AppTimeLimitController {
UserData user = mUserRef.get();
if (user == null) return;
if (mListener != null) {
- mListener.onSessionEnd(mObserverId, user.userId, mUsageTimeMs, mSessionEndCallback);
+ mListener.onSessionEnd(mObserverId,
+ user.userId,
+ mUsageTimeMs,
+ mSessionEndCallback);
}
}
@@ -599,7 +610,7 @@ public class AppTimeLimitController {
// TODO: Consider using a bloom filter here if number of actives becomes large
final int size = group.mObserved.length;
for (int i = 0; i < size; i++) {
- if (user.currentlyActive.contains(group.mObserved[i])) {
+ if (user.currentlyActive.containsKey(group.mObserved[i])) {
// Entity is currently active. Start group's usage.
group.noteUsageStart(currentTimeMs);
}
@@ -717,21 +728,28 @@ public class AppTimeLimitController {
/**
* Called when an entity becomes active.
*
- * @param name The entity that became active
- * @param userId The user
+ * @param name The entity that became active
+ * @param userId The user
+ * @param timeAgoMs Time since usage was started
*/
- public void noteUsageStart(String name, int userId) throws IllegalArgumentException {
+ public void noteUsageStart(String name, int userId, long timeAgoMs)
+ throws IllegalArgumentException {
synchronized (mLock) {
UserData user = getOrCreateUserDataLocked(userId);
if (DEBUG) Slog.d(TAG, "Usage entity " + name + " became active");
- if (user.currentlyActive.contains(name)) {
- throw new IllegalArgumentException(
- "Unable to start usage for " + name + ", already in use");
+
+ final int index = user.currentlyActive.indexOfKey(name);
+ if (index >= 0) {
+ final Integer count = user.currentlyActive.valueAt(index);
+ if (count != null) {
+ // There are multiple instances of this entity. Just increment the count.
+ user.currentlyActive.setValueAt(index, count + 1);
+ return;
+ }
}
final long currentTime = getUptimeMillis();
- // Add to the list of active entities
- user.currentlyActive.add(name);
+ user.currentlyActive.put(name, ONE);
ArrayList<UsageGroup> groups = user.observedMap.get(name);
if (groups == null) return;
@@ -739,12 +757,22 @@ public class AppTimeLimitController {
final int size = groups.size();
for (int i = 0; i < size; i++) {
UsageGroup group = groups.get(i);
- group.noteUsageStart(currentTime);
+ group.noteUsageStart(currentTime - timeAgoMs, currentTime);
}
}
}
/**
+ * Called when an entity becomes active.
+ *
+ * @param name The entity that became active
+ * @param userId The user
+ */
+ public void noteUsageStart(String name, int userId) throws IllegalArgumentException {
+ noteUsageStart(name, userId, 0);
+ }
+
+ /**
* Called when an entity becomes inactive.
*
* @param name The entity that became inactive
@@ -754,10 +782,21 @@ public class AppTimeLimitController {
synchronized (mLock) {
UserData user = getOrCreateUserDataLocked(userId);
if (DEBUG) Slog.d(TAG, "Usage entity " + name + " became inactive");
- if (!user.currentlyActive.remove(name)) {
+
+ final int index = user.currentlyActive.indexOfKey(name);
+ if (index < 0) {
throw new IllegalArgumentException(
"Unable to stop usage for " + name + ", not in use");
}
+
+ final Integer count = user.currentlyActive.valueAt(index);
+ if (!count.equals(ONE)) {
+ // There are multiple instances of this entity. Just decrement the count.
+ user.currentlyActive.setValueAt(index, count - 1);
+ return;
+ }
+
+ user.currentlyActive.removeAt(index);
final long currentTime = getUptimeMillis();
// Check if any of the groups need to watch for this entity
@@ -769,6 +808,7 @@ public class AppTimeLimitController {
UsageGroup group = groups.get(i);
group.noteUsageStop(currentTime);
}
+
}
}
@@ -780,7 +820,8 @@ public class AppTimeLimitController {
@GuardedBy("mLock")
private void postInformSessionEndListenerLocked(SessionUsageGroup group, long timeout) {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MyHandler.MSG_INFORM_SESSION_END, group),
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MyHandler.MSG_INFORM_SESSION_END, group),
timeout);
}
@@ -800,7 +841,27 @@ public class AppTimeLimitController {
mHandler.removeMessages(MyHandler.MSG_CHECK_TIMEOUT, group);
}
- void dump(PrintWriter pw) {
+ void dump(String[] args, PrintWriter pw) {
+ if (args != null) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if ("actives".equals(arg)) {
+ synchronized (mLock) {
+ final int nUsers = mUsers.size();
+ for (int user = 0; user < nUsers; user++) {
+ final ArrayMap<String, Integer> actives =
+ mUsers.valueAt(user).currentlyActive;
+ final int nActive = actives.size();
+ for (int active = 0; active < nActive; active++) {
+ pw.println(actives.keyAt(active));
+ }
+ }
+ }
+ return;
+ }
+ }
+ }
+
synchronized (mLock) {
pw.println("\n App Time Limits");
final int nUsers = mUsers.size();
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 94cc6502a12d..9a5bd1379717 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -22,6 +22,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED;
import static android.app.usage.UsageEvents.Event.CONFIGURATION_CHANGE;
import static android.app.usage.UsageEvents.Event.CONTINUE_PREVIOUS_DAY;
import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE;
+import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageEvents.Event.END_OF_DAY;
import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK;
import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START;
@@ -66,7 +67,7 @@ public class IntervalStats {
public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>();
public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>();
public Configuration activeConfiguration;
- public EventList events;
+ public EventList events = new EventList();
// A string cache. This is important as when we're parsing XML files, we don't want to
// keep hundreds of strings that have the same contents. We will read the string
@@ -112,6 +113,9 @@ public class IntervalStats {
}
+ public IntervalStats() {
+ }
+
/**
* Gets the UsageStats object for the given package, or creates one and adds it internally.
*/
@@ -253,6 +257,7 @@ public class IntervalStats {
case ROLLOVER_FOREGROUND_SERVICE:
case CONTINUE_PREVIOUS_DAY:
case CONTINUING_FOREGROUND_SERVICE:
+ case DEVICE_SHUTDOWN:
return true;
}
return false;
@@ -281,8 +286,9 @@ public class IntervalStats {
@VisibleForTesting
public void update(String packageName, String className, long timeStamp, int eventType,
int instanceId) {
- if (eventType == FLUSH_TO_DISK) {
- // FLUSH_TO_DISK are sent to all packages.
+ if (eventType == DEVICE_SHUTDOWN
+ || eventType == FLUSH_TO_DISK) {
+ // DEVICE_SHUTDOWN and FLUSH_TO_DISK are sent to all packages.
final int size = packageStats.size();
for (int i = 0; i < size; i++) {
UsageStats usageStats = packageStats.valueAt(i);
@@ -321,9 +327,6 @@ public class IntervalStats {
*/
@VisibleForTesting
public void addEvent(Event event) {
- if (events == null) {
- events = new EventList();
- }
// Cache common use strings
event.mPackage = getCachedStringRef(event.mPackage);
if (event.mClass != null) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 57dc08fcd253..76a3aa81530e 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -18,6 +18,7 @@ package com.android.server.usage;
import static android.app.usage.UsageEvents.Event.CHOOSER_ACTION;
import static android.app.usage.UsageEvents.Event.CONFIGURATION_CHANGE;
+import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK;
import static android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION;
import static android.app.usage.UsageEvents.Event.SHORTCUT_INVOCATION;
@@ -53,6 +54,7 @@ import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
+import android.os.IBinder;
import android.os.IDeviceIdleController;
import android.os.Looper;
import android.os.Message;
@@ -105,6 +107,8 @@ public class UsageStatsService extends SystemService implements
private static final boolean ENABLE_KERNEL_UPDATES = true;
private static final File KERNEL_COUNTER_FILE = new File("/proc/uid_procstat/set");
+ private static final char TOKEN_DELIMITER = '/';
+
// Handler message types.
static final int MSG_REPORT_EVENT = 0;
static final int MSG_FLUSH_TO_DISK = 1;
@@ -135,6 +139,10 @@ public class UsageStatsService extends SystemService implements
/** Manages app time limit observers */
AppTimeLimitController mAppTimeLimit;
+ final SparseArray<ArraySet<String>> mUsageReporters = new SparseArray();
+ final SparseArray<String> mVisibleActivities = new SparseArray();
+
+
private UsageStatsManagerInternal.AppIdleStateChangeListener mStandbyChangeListener =
new UsageStatsManagerInternal.AppIdleStateChangeListener() {
@Override
@@ -270,7 +278,7 @@ public class UsageStatsService extends SystemService implements
mHandler.obtainMessage(MSG_REMOVE_USER, userId, 0).sendToTarget();
}
} else if (Intent.ACTION_USER_STARTED.equals(action)) {
- if (userId >=0) {
+ if (userId >= 0) {
mAppStandby.postCheckIdleStates(userId);
}
}
@@ -409,11 +417,30 @@ public class UsageStatsService extends SystemService implements
*/
void shutdown() {
synchronized (mLock) {
+ mHandler.removeMessages(MSG_REPORT_EVENT);
+ Event event = new Event(DEVICE_SHUTDOWN, SystemClock.elapsedRealtime());
+ // orderly shutdown, the last event is DEVICE_SHUTDOWN.
+ reportEventToAllUserId(event);
flushToDiskLocked();
}
}
/**
+ * After power button is pressed for 3.5 seconds
+ * (as defined in {@link com.android.internal.R.integer#config_veryLongPressTimeout}),
+ * report DEVICE_SHUTDOWN event and persist the database. If the power button is pressed for 10
+ * seconds and the device is shutdown, the database is already persisted and we are not losing
+ * data.
+ * This method is called from PhoneWindowManager, do not synchronize on mLock otherwise
+ * PhoneWindowManager may be blocked.
+ */
+ void prepareForPossibleShutdown() {
+ Event event = new Event(DEVICE_SHUTDOWN, SystemClock.elapsedRealtime());
+ mHandler.obtainMessage(MSG_REPORT_EVENT_TO_ALL_USERID, event).sendToTarget();
+ mHandler.sendEmptyMessage(MSG_FLUSH_TO_DISK);
+ }
+
+ /**
* Called by the Binder stub.
*/
void reportEvent(Event event, int userId) {
@@ -434,17 +461,46 @@ public class UsageStatsService extends SystemService implements
mAppStandby.reportEvent(event, elapsedRealtime, userId);
switch (event.mEventType) {
case Event.ACTIVITY_RESUMED:
- try {
- mAppTimeLimit.noteUsageStart(event.getPackageName(), userId);
- } catch (IllegalArgumentException iae) {
- Slog.e(TAG, "Failed to note usage start", iae);
+ synchronized (mVisibleActivities) {
+ mVisibleActivities.put(event.mInstanceId, event.getClassName());
+ try {
+ mAppTimeLimit.noteUsageStart(event.getPackageName(), userId);
+ } catch (IllegalArgumentException iae) {
+ Slog.e(TAG, "Failed to note usage start", iae);
+ }
}
break;
- case Event.ACTIVITY_PAUSED:
- try {
- mAppTimeLimit.noteUsageStop(event.getPackageName(), userId);
- } catch (IllegalArgumentException iae) {
- Slog.e(TAG, "Failed to note usage stop", iae);
+ case Event.ACTIVITY_STOPPED:
+ case Event.ACTIVITY_DESTROYED:
+ ArraySet<String> tokens;
+ synchronized (mUsageReporters) {
+ tokens = mUsageReporters.removeReturnOld(event.mInstanceId);
+ }
+ if (tokens != null) {
+ synchronized (tokens) {
+ final int size = tokens.size();
+ // Stop usage on behalf of a UsageReporter that stopped
+ for (int i = 0; i < size; i++) {
+ final String token = tokens.valueAt(i);
+ try {
+ mAppTimeLimit.noteUsageStop(
+ buildFullToken(event.getPackageName(), token), userId);
+ } catch (IllegalArgumentException iae) {
+ Slog.w(TAG, "Failed to stop usage for during reporter death: "
+ + iae);
+ }
+ }
+ }
+ }
+
+ synchronized (mVisibleActivities) {
+ if (mVisibleActivities.removeReturnOld(event.mInstanceId) != null) {
+ try {
+ mAppTimeLimit.noteUsageStop(event.getPackageName(), userId);
+ } catch (IllegalArgumentException iae) {
+ Slog.w(TAG, "Failed to note usage stop", iae);
+ }
+ }
}
break;
}
@@ -599,6 +655,14 @@ public class UsageStatsService extends SystemService implements
return beginTime <= currentTime && beginTime < endTime;
}
+ private String buildFullToken(String packageName, String token) {
+ final StringBuilder sb = new StringBuilder(packageName.length() + token.length() + 1);
+ sb.append(packageName);
+ sb.append(TOKEN_DELIMITER);
+ sb.append(token);
+ return sb.toString();
+ }
+
private void flushToDiskLocked() {
final int userCount = mUserState.size();
for (int i = 0; i < userCount; i++) {
@@ -627,8 +691,7 @@ public class UsageStatsService extends SystemService implements
String arg = args[i];
if ("--checkin".equals(arg)) {
checkin = true;
- } else
- if ("-c".equals(arg)) {
+ } else if ("-c".equals(arg)) {
compact = true;
} else if ("flush".equals(arg)) {
flushToDiskLocked();
@@ -637,6 +700,15 @@ public class UsageStatsService extends SystemService implements
} else if ("is-app-standby-enabled".equals(arg)) {
pw.println(mAppStandby.mAppIdleEnabled);
return;
+ } else if ("apptimelimit".equals(arg)) {
+ if (i + 1 >= args.length) {
+ mAppTimeLimit.dump(null, pw);
+ } else {
+ final String[] remainingArgs =
+ Arrays.copyOfRange(args, i + 1, args.length);
+ mAppTimeLimit.dump(remainingArgs, pw);
+ }
+ return;
} else if (arg != null && !arg.startsWith("-")) {
// Anything else that doesn't start with '-' is a pkg to filter
pkg = arg;
@@ -666,7 +738,7 @@ public class UsageStatsService extends SystemService implements
mAppStandby.dumpState(args, pw);
}
- mAppTimeLimit.dump(pw);
+ mAppTimeLimit.dump(null, pw);
}
}
@@ -1231,16 +1303,82 @@ public class UsageStatsService extends SystemService implements
final int userId = UserHandle.getUserId(callingUid);
final long token = Binder.clearCallingIdentity();
try {
- UsageStatsService.this.unregisterUsageSessionObserver(callingUid, sessionObserverId, userId);
+ UsageStatsService.this.unregisterUsageSessionObserver(callingUid, sessionObserverId,
+ userId);
} finally {
Binder.restoreCallingIdentity(token);
}
}
+
+ @Override
+ public void reportUsageStart(IBinder activity, String token, String callingPackage) {
+ reportPastUsageStart(activity, token, 0, callingPackage);
+ }
+
+ @Override
+ public void reportPastUsageStart(IBinder activity, String token, long timeAgoMs,
+ String callingPackage) {
+
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
+ final long binderToken = Binder.clearCallingIdentity();
+ try {
+ ArraySet<String> tokens;
+ synchronized (mUsageReporters) {
+ tokens = mUsageReporters.get(activity.hashCode());
+ if (tokens == null) {
+ tokens = new ArraySet();
+ mUsageReporters.put(activity.hashCode(), tokens);
+ }
+ }
+
+ synchronized (tokens) {
+ if (!tokens.add(token)) {
+ throw new IllegalArgumentException(token + " for " + callingPackage
+ + " is already reported as started for this activity");
+ }
+ }
+
+ mAppTimeLimit.noteUsageStart(buildFullToken(callingPackage, token),
+ userId, timeAgoMs);
+ } finally {
+ Binder.restoreCallingIdentity(binderToken);
+ }
+ }
+
+ @Override
+ public void reportUsageStop(IBinder activity, String token, String callingPackage) {
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
+ final long binderToken = Binder.clearCallingIdentity();
+ try {
+ ArraySet<String> tokens;
+ synchronized (mUsageReporters) {
+ tokens = mUsageReporters.get(activity.hashCode());
+ if (tokens == null) {
+ throw new IllegalArgumentException(
+ "Unknown reporter trying to stop token " + token + " for "
+ + callingPackage);
+ }
+ }
+
+ synchronized (tokens) {
+ if (!tokens.remove(token)) {
+ throw new IllegalArgumentException(token + " for " + callingPackage
+ + " is already reported as stopped for this activity");
+ }
+ }
+ mAppTimeLimit.noteUsageStop(buildFullToken(callingPackage, token), userId);
+ } finally {
+ Binder.restoreCallingIdentity(binderToken);
+ }
+ }
}
void registerAppUsageObserver(int callingUid, int observerId, String[] packages,
long timeLimitMs, PendingIntent callbackIntent, int userId) {
- mAppTimeLimit.addAppUsageObserver(callingUid, observerId, packages, timeLimitMs, callbackIntent,
+ mAppTimeLimit.addAppUsageObserver(callingUid, observerId, packages, timeLimitMs,
+ callbackIntent,
userId);
}
@@ -1369,6 +1507,11 @@ public class UsageStatsService extends SystemService implements
}
@Override
+ public void prepareForPossibleShutdown() {
+ UsageStatsService.this.prepareForPossibleShutdown();
+ }
+
+ @Override
public void addAppIdleStateChangeListener(AppIdleStateChangeListener listener) {
mAppStandby.addListener(listener);
listener.onParoleStateChanged(isAppIdleParoleOn());
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 5128ae1f9130..2d1098c7cf5c 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -16,6 +16,7 @@
package com.android.server.usage;
+import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageStatsManager.INTERVAL_BEST;
import static android.app.usage.UsageStatsManager.INTERVAL_COUNT;
import static android.app.usage.UsageStatsManager.INTERVAL_DAILY;
@@ -134,6 +135,18 @@ class UserUsageStatsService {
updateRolloverDeadline();
}
+ // During system reboot, add a DEVICE_SHUTDOWN event to the end of event list, the timestamp
+ // is last time UsageStatsDatabase is persisted to disk.
+ final IntervalStats currentDailyStats = mCurrentStats[INTERVAL_DAILY];
+ if (currentDailyStats != null) {
+ final int size = currentDailyStats.events.size();
+ if (size == 0 || currentDailyStats.events.get(size - 1).mEventType != DEVICE_SHUTDOWN) {
+ // The last event in event list is not DEVICE_SHUTDOWN, then we insert one.
+ final Event event = new Event(DEVICE_SHUTDOWN, currentDailyStats.lastTimeSaved);
+ currentDailyStats.addEvent(event);
+ }
+ }
+
if (mDatabase.isNewUpdate()) {
notifyNewUpdate();
}
@@ -175,7 +188,9 @@ class UserUsageStatsService {
// ACTIVITY_STOPPED.
&& event.mEventType != Event.ACTIVITY_DESTROYED
// FLUSH_TO_DISK is a private event.
- && event.mEventType != Event.FLUSH_TO_DISK) {
+ && event.mEventType != Event.FLUSH_TO_DISK
+ // DEVICE_SHUTDOWN is added to event list after reboot.
+ && event.mEventType != Event.DEVICE_SHUTDOWN) {
currentDailyStats.addEvent(event);
}
@@ -393,10 +408,6 @@ class UserUsageStatsService {
@Override
public void combine(IntervalStats stats, boolean mutable,
List<Event> accumulatedResult) {
- if (stats.events == null) {
- return;
- }
-
final int startIndex = stats.events.firstIndexOnOrAfter(beginTime);
final int size = stats.events.size();
for (int i = startIndex; i < size; i++) {
@@ -434,10 +445,6 @@ class UserUsageStatsService {
names.add(packageName);
final List<Event> results = queryStats(INTERVAL_DAILY,
beginTime, endTime, (stats, mutable, accumulatedResult) -> {
- if (stats.events == null) {
- return;
- }
-
final int startIndex = stats.events.firstIndexOnOrAfter(beginTime);
final int size = stats.events.size();
for (int i = startIndex; i < size; i++) {
@@ -696,10 +703,6 @@ class UserUsageStatsService {
@Override
public void combine(IntervalStats stats, boolean mutable,
List<Event> accumulatedResult) {
- if (stats.events == null) {
- return;
- }
-
final int startIndex = stats.events.firstIndexOnOrAfter(beginTime);
final int size = stats.events.size();
for (int i = startIndex; i < size; i++) {
@@ -925,10 +928,12 @@ class UserUsageStatsService {
return "SCREEN_INTERACTIVE";
case Event.SCREEN_NON_INTERACTIVE:
return "SCREEN_NON_INTERACTIVE";
- case UsageEvents.Event.KEYGUARD_SHOWN:
+ case Event.KEYGUARD_SHOWN:
return "KEYGUARD_SHOWN";
- case UsageEvents.Event.KEYGUARD_HIDDEN:
+ case Event.KEYGUARD_HIDDEN:
return "KEYGUARD_HIDDEN";
+ case Event.DEVICE_SHUTDOWN:
+ return "DEVICE_SHUTDOWN";
default:
return "UNKNOWN_TYPE_" + eventType;
}
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 5b1fa44d96b4..8f9e96f176c9 100755
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -1751,8 +1751,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mGadgetProxy.linkToDeath(new UsbGadgetDeathRecipient(),
USB_GADGET_HAL_DEATH_COOKIE);
mCurrentFunctions = UsbManager.FUNCTION_NONE;
- mGadgetProxy.getCurrentUsbFunctions(new UsbGadgetCallback());
mCurrentUsbFunctionsRequested = true;
+ mGadgetProxy.getCurrentUsbFunctions(new UsbGadgetCallback());
}
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
updateState(state);
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index 904d55e6d0f3..00c75480ba80 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -418,12 +418,10 @@ public class UsbHostManager {
parser.getRawDescriptors());
// Stats collection
- if (parser.hasAudioInterface()) {
- StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, newDevice.getVendorId(),
- newDevice.getProductId(), parser.hasAudioInterface(),
- parser.hasHIDInterface(), parser.hasStorageInterface(),
- StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_CONNECTED, 0);
- }
+ StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, newDevice.getVendorId(),
+ newDevice.getProductId(), parser.hasAudioInterface(),
+ parser.hasHIDInterface(), parser.hasStorageInterface(),
+ StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_CONNECTED, 0);
}
}
@@ -455,14 +453,12 @@ public class UsbHostManager {
if (current != null) {
UsbDescriptorParser parser = new UsbDescriptorParser(deviceAddress,
current.mDescriptors);
- if (parser.hasAudioInterface()) {
// Stats collection
- StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, device.getVendorId(),
- device.getProductId(), parser.hasAudioInterface(),
- parser.hasHIDInterface(), parser.hasStorageInterface(),
- StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_DISCONNECTED,
- System.currentTimeMillis() - current.mTimestamp);
- }
+ StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, device.getVendorId(),
+ device.getProductId(), parser.hasAudioInterface(),
+ parser.hasHIDInterface(), parser.hasStorageInterface(),
+ StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_DISCONNECTED,
+ System.currentTimeMillis() - current.mTimestamp);
}
} else {
Slog.d(TAG, "Removed device at " + deviceAddress + " was already gone");
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index 38efc743fe34..3d7cbb51a3ad 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -657,9 +657,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
return;
}
- if (event.status != SoundTrigger.RECOGNITION_STATUS_GET_STATE_RESPONSE) {
- model.setStopped();
- }
+ model.setStopped();
+
try {
callback.onGenericSoundTriggerDetected((GenericRecognitionEvent) event);
} catch (DeadObjectException e) {
@@ -802,9 +801,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
return;
}
- if (event.status != SoundTrigger.RECOGNITION_STATUS_GET_STATE_RESPONSE) {
- modelData.setStopped();
- }
+ modelData.setStopped();
try {
modelData.getCallback().onKeyphraseDetected((KeyphraseRecognitionEvent) event);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index bbf3d45d7c99..613c4ffceffc 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -371,14 +371,15 @@ public class VoiceInteractionManagerService extends SystemService {
}
private boolean shouldEnableService(Context context) {
- // VoiceInteractionService should not be enabled on any low RAM devices
- // or devices that have not declared the recognition feature, unless the
- // device's configuration has explicitly set the config flag for a fixed
+ // VoiceInteractionService should not be enabled on devices that have not declared the
+ // recognition feature (including low-ram devices where notLowRam="true" takes effect),
+ // unless the device's configuration has explicitly set the config flag for a fixed
// voice interaction service.
- return (!ActivityManager.isLowRamDeviceStatic()
- && context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_VOICE_RECOGNIZERS)) ||
- getForceVoiceInteractionServicePackage(context.getResources()) != null;
+ if (getForceVoiceInteractionServicePackage(context.getResources()) != null) {
+ return true;
+ }
+ return context.getPackageManager()
+ .hasSystemFeature(PackageManager.FEATURE_VOICE_RECOGNIZERS);
}
private String getForceVoiceInteractionServicePackage(Resources res) {
diff --git a/startop/iorap/Android.bp b/startop/iorap/Android.bp
index b3b09001e7ee..59a80fbae792 100644
--- a/startop/iorap/Android.bp
+++ b/startop/iorap/Android.bp
@@ -13,7 +13,7 @@
// limitations under the License.
java_library_static {
- name: "libiorap-java",
+ name: "services.startop.iorap",
aidl: {
include_dirs: [
@@ -21,6 +21,8 @@ java_library_static {
],
},
+ libs: ["services.core"],
+
srcs: [
":iorap-aidl",
"**/*.java",
diff --git a/startop/iorap/src/com/google/android/startop/iorap/AppLaunchEvent.java b/startop/iorap/src/com/google/android/startop/iorap/AppLaunchEvent.java
new file mode 100644
index 000000000000..c2e4581285fd
--- /dev/null
+++ b/startop/iorap/src/com/google/android/startop/iorap/AppLaunchEvent.java
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2018 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.google.android.startop.iorap;
+
+import android.annotation.LongDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+// TODO: fix this. either move this class into system server or add a dependency on
+// these wm classes to libiorap-java and libiorap-java-tests (somehow).
+import com.android.server.wm.ActivityMetricsLaunchObserver;
+import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto;
+import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Objects;
+
+/**
+ * Provide a hint to iorapd that an app launch sequence has transitioned state.<br /><br />
+ *
+ * Knowledge of when an activity starts/stops can be used by iorapd to increase system
+ * performance (e.g. by launching perfetto tracing to record an io profile, or by
+ * playing back an ioprofile via readahead) over the long run.<br /><br />
+ *
+ * /@see com.google.android.startop.iorap.IIorap#onAppLaunchEvent <br /><br />
+ * @see com.android.server.wm.ActivityMetricsLaunchObserver
+ * ActivityMetricsLaunchObserver for the possible event states.
+ * @hide
+ */
+public abstract class AppLaunchEvent implements Parcelable {
+ @LongDef
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SequenceId {}
+
+ public final @SequenceId
+ long sequenceId;
+
+ protected AppLaunchEvent(@SequenceId long sequenceId) {
+ this.sequenceId = sequenceId;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof AppLaunchEvent) {
+ return equals((AppLaunchEvent) other);
+ }
+ return false;
+ }
+
+ protected boolean equals(AppLaunchEvent other) {
+ return sequenceId == other.sequenceId;
+ }
+
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() +
+ "{" + "sequenceId=" + Long.toString(sequenceId) +
+ toStringBody() + "}";
+ }
+
+ protected String toStringBody() { return ""; };
+
+ // List of possible variants:
+
+ public static final class IntentStarted extends AppLaunchEvent {
+ @NonNull
+ public final Intent intent;
+
+ public IntentStarted(@SequenceId long sequenceId, Intent intent) {
+ super(sequenceId);
+ this.intent = intent;
+
+ Objects.requireNonNull(intent, "intent");
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof IntentStarted) {
+ return intent.equals(((IntentStarted)other).intent) &&
+ super.equals(other);
+ }
+ return false;
+ }
+
+ @Override
+ protected String toStringBody() {
+ return ", intent=" + intent.toString();
+ }
+
+
+ @Override
+ protected void writeToParcelImpl(Parcel p, int flags) {
+ super.writeToParcelImpl(p, flags);
+ intent.writeToParcel(p, flags);
+ }
+
+ IntentStarted(Parcel p) {
+ super(p);
+ intent = Intent.CREATOR.createFromParcel(p);
+ }
+ }
+
+ public static final class IntentFailed extends AppLaunchEvent {
+ public IntentFailed(@SequenceId long sequenceId) {
+ super(sequenceId);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof IntentFailed) {
+ return super.equals(other);
+ }
+ return false;
+ }
+
+ IntentFailed(Parcel p) {
+ super(p);
+ }
+ }
+
+ public static abstract class BaseWithActivityRecordData extends AppLaunchEvent {
+ public final @NonNull
+ @ActivityRecordProto byte[] activityRecordSnapshot;
+
+ protected BaseWithActivityRecordData(@SequenceId long sequenceId,
+ @NonNull @ActivityRecordProto byte[] snapshot) {
+ super(sequenceId);
+ activityRecordSnapshot = snapshot;
+
+ Objects.requireNonNull(snapshot, "snapshot");
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof BaseWithActivityRecordData) {
+ return activityRecordSnapshot.equals(
+ ((BaseWithActivityRecordData)other).activityRecordSnapshot) &&
+ super.equals(other);
+ }
+ return false;
+ }
+
+ @Override
+ protected String toStringBody() {
+ return ", " + activityRecordSnapshot.toString();
+ }
+
+ @Override
+ protected void writeToParcelImpl(Parcel p, int flags) {
+ super.writeToParcelImpl(p, flags);
+ ActivityRecordProtoParcelable.write(p, activityRecordSnapshot, flags);
+ }
+
+ BaseWithActivityRecordData(Parcel p) {
+ super(p);
+ activityRecordSnapshot = ActivityRecordProtoParcelable.create(p);
+ }
+ }
+
+ public static final class ActivityLaunched extends BaseWithActivityRecordData {
+ public final @ActivityMetricsLaunchObserver.Temperature
+ int temperature;
+
+ public ActivityLaunched(@SequenceId long sequenceId,
+ @NonNull @ActivityRecordProto byte[] snapshot,
+ @ActivityMetricsLaunchObserver.Temperature int temperature) {
+ super(sequenceId, snapshot);
+ this.temperature = temperature;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof ActivityLaunched) {
+ return temperature == ((ActivityLaunched)other).temperature &&
+ super.equals(other);
+ }
+ return false;
+ }
+
+ @Override
+ protected String toStringBody() {
+ return ", temperature=" + Integer.toString(temperature);
+ }
+
+ @Override
+ protected void writeToParcelImpl(Parcel p, int flags) {
+ super.writeToParcelImpl(p, flags);
+ p.writeInt(temperature);
+ }
+
+ ActivityLaunched(Parcel p) {
+ super(p);
+ temperature = p.readInt();
+ }
+ }
+
+ public static final class ActivityLaunchFinished extends BaseWithActivityRecordData {
+ public ActivityLaunchFinished(@SequenceId long sequenceId,
+ @NonNull @ActivityRecordProto byte[] snapshot) {
+ super(sequenceId, snapshot);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof ActivityLaunched) {
+ return super.equals(other);
+ }
+ return false;
+ }
+ }
+
+ public static class ActivityLaunchCancelled extends AppLaunchEvent {
+ public final @Nullable
+ @ActivityRecordProto byte[] activityRecordSnapshot;
+
+ public ActivityLaunchCancelled(@SequenceId long sequenceId,
+ @Nullable @ActivityRecordProto byte[] snapshot) {
+ super(sequenceId);
+ activityRecordSnapshot = snapshot;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof ActivityLaunchCancelled) {
+ return Objects.equals(activityRecordSnapshot,
+ ((ActivityLaunchCancelled)other).activityRecordSnapshot) &&
+ super.equals(other);
+ }
+ return false;
+ }
+
+ @Override
+ protected String toStringBody() {
+ return ", " + activityRecordSnapshot.toString();
+ }
+
+ @Override
+ protected void writeToParcelImpl(Parcel p, int flags) {
+ super.writeToParcelImpl(p, flags);
+ if (activityRecordSnapshot != null) {
+ p.writeBoolean(true);
+ ActivityRecordProtoParcelable.write(p, activityRecordSnapshot, flags);
+ } else {
+ p.writeBoolean(false);
+ }
+ }
+
+ ActivityLaunchCancelled(Parcel p) {
+ super(p);
+ if (p.readBoolean()) {
+ activityRecordSnapshot = ActivityRecordProtoParcelable.create(p);
+ } else {
+ activityRecordSnapshot = null;
+ }
+ }
+ }
+
+ @Override
+ public @ContentsFlags int describeContents() { return 0; }
+
+ @Override
+ public void writeToParcel(Parcel p, @WriteFlags int flags) {
+ p.writeInt(getTypeIndex());
+
+ writeToParcelImpl(p, flags);
+ }
+
+
+ public static Creator<AppLaunchEvent> CREATOR =
+ new Creator<AppLaunchEvent>() {
+ @Override
+ public AppLaunchEvent createFromParcel(Parcel source) {
+ int typeIndex = source.readInt();
+
+ Class<?> kls = getClassFromTypeIndex(typeIndex);
+ if (kls == null) {
+ throw new IllegalArgumentException("Invalid type index: " + typeIndex);
+ }
+
+ try {
+ return (AppLaunchEvent) kls.getConstructor(Parcel.class).newInstance(source);
+ } catch (InstantiationException e) {
+ throw new AssertionError(e);
+ } catch (IllegalAccessException e) {
+ throw new AssertionError(e);
+ } catch (InvocationTargetException e) {
+ throw new AssertionError(e);
+ } catch (NoSuchMethodException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ @Override
+ public AppLaunchEvent[] newArray(int size) {
+ return new AppLaunchEvent[0];
+ }
+ };
+
+ protected void writeToParcelImpl(Parcel p, int flags) {
+ p.writeLong(sequenceId);
+ }
+
+ protected AppLaunchEvent(Parcel p) {
+ sequenceId = p.readLong();
+ }
+
+ private int getTypeIndex() {
+ for (int i = 0; i < sTypes.length; ++i) {
+ if (sTypes[i].equals(this.getClass())) {
+ return i;
+ }
+ }
+ throw new AssertionError("sTypes did not include this type: " + this.getClass());
+ }
+
+ private static @Nullable Class<?> getClassFromTypeIndex(int typeIndex) {
+ if (typeIndex >= 0 && typeIndex < sTypes.length) {
+ return sTypes[typeIndex];
+ }
+ return null;
+ }
+
+ // Index position matters: It is used to encode the specific type in parceling.
+ // Keep up-to-date with C++ side.
+ private static Class<?>[] sTypes = new Class[] {
+ IntentStarted.class,
+ IntentFailed.class,
+ ActivityLaunched.class,
+ ActivityLaunchFinished.class,
+ ActivityLaunchCancelled.class,
+ };
+
+ // TODO: move to @ActivityRecordProto byte[] once we have unit tests.
+ public static class ActivityRecordProtoParcelable {
+ public static void write(Parcel p, @ActivityRecordProto byte[] activityRecordSnapshot,
+ int flags) {
+ p.writeByteArray(activityRecordSnapshot);
+ }
+
+ public static @ActivityRecordProto byte[] create(Parcel p) {
+ byte[] data = p.createByteArray();
+
+ return data;
+ }
+ }
+}
diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
new file mode 100644
index 000000000000..7fcad360b8fe
--- /dev/null
+++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2018 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.google.android.startop.iorap;
+// TODO: rename to com.android.server.startop.iorap
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.wm.ActivityMetricsLaunchObserver;
+import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto;
+import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature;
+import com.android.server.wm.ActivityMetricsLaunchObserverRegistry;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
+/**
+ * System-server-local proxy into the {@code IIorap} native service.
+ */
+public class IorapForwardingService extends SystemService {
+
+ public static final boolean DEBUG = true; // TODO: read from a getprop?
+ public static final String TAG = "IorapForwardingService";
+
+ private IIorap mIorapRemote;
+
+ /**
+ * Initializes the system service.
+ * <p>
+ * Subclasses must define a single argument constructor that accepts the context
+ * and passes it to super.
+ * </p>
+ *
+ * @param context The system server context.
+ */
+ public IorapForwardingService(Context context) {
+ super(context);
+ }
+
+ //<editor-fold desc="Providers">
+ /*
+ * Providers for external dependencies:
+ * - These are marked as protected to allow tests to inject different values via mocks.
+ */
+
+ @VisibleForTesting
+ protected ActivityMetricsLaunchObserverRegistry provideLaunchObserverRegistry() {
+ ActivityTaskManagerInternal amtInternal =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
+ ActivityMetricsLaunchObserverRegistry launchObserverRegistry =
+ amtInternal.getLaunchObserverRegistry();
+ return launchObserverRegistry;
+ }
+
+ @VisibleForTesting
+ protected IIorap provideIorapRemote() {
+ try {
+ return IIorap.Stub.asInterface(ServiceManager.getServiceOrThrow("iorapd"));
+ } catch (ServiceManager.ServiceNotFoundException e) {
+ // TODO: how do we handle service being missing?
+ throw new AssertionError(e);
+ }
+ }
+
+ //</editor-fold>
+
+ @Override
+ public void onStart() {
+ if (DEBUG) {
+ Log.v(TAG, "onStart");
+ }
+
+ // Connect to the native binder service.
+ mIorapRemote = provideIorapRemote();
+ invokeRemote( () -> mIorapRemote.setTaskListener(new RemoteTaskListener()) );
+
+ // Listen to App Launch Sequence events from ActivityTaskManager,
+ // and forward them to the native binder service.
+ ActivityMetricsLaunchObserverRegistry launchObserverRegistry =
+ provideLaunchObserverRegistry();
+ launchObserverRegistry.registerLaunchObserver(new AppLaunchObserver());
+ }
+
+ private class AppLaunchObserver implements ActivityMetricsLaunchObserver {
+ // We add a synthetic sequence ID here to make it easier to differentiate new
+ // launch sequences on the native side.
+ private @AppLaunchEvent.SequenceId long mSequenceId = -1;
+
+ @Override
+ public void onIntentStarted(@NonNull Intent intent) {
+ // #onIntentStarted [is the only transition that] initiates a new launch sequence.
+ ++mSequenceId;
+
+ if (DEBUG) {
+ Log.v(TAG, String.format("AppLaunchObserver#onIntentStarted(%d, %s)",
+ mSequenceId, intent));
+ }
+
+ invokeRemote(() ->
+ mIorapRemote.onAppLaunchEvent(RequestId.nextValueForSequence(),
+ new AppLaunchEvent.IntentStarted(mSequenceId, intent))
+ );
+ }
+
+ @Override
+ public void onIntentFailed() {
+ if (DEBUG) {
+ Log.v(TAG, String.format("AppLaunchObserver#onIntentFailed(%d)", mSequenceId));
+ }
+
+ invokeRemote(() ->
+ mIorapRemote.onAppLaunchEvent(RequestId.nextValueForSequence(),
+ new AppLaunchEvent.IntentFailed(mSequenceId))
+ );
+ }
+
+ @Override
+ public void onActivityLaunched(@NonNull @ActivityRecordProto byte[] activity,
+ @Temperature int temperature) {
+ if (DEBUG) {
+ Log.v(TAG, String.format("AppLaunchObserver#onActivityLaunched(%d, %s, %d)",
+ mSequenceId, activity, temperature));
+ }
+
+ invokeRemote(() ->
+ mIorapRemote.onAppLaunchEvent(RequestId.nextValueForSequence(),
+ new AppLaunchEvent.ActivityLaunched(mSequenceId, activity, temperature))
+ );
+ }
+
+ @Override
+ public void onActivityLaunchCancelled(@Nullable @ActivityRecordProto byte[] activity) {
+ if (DEBUG) {
+ Log.v(TAG, String.format("AppLaunchObserver#onActivityLaunchCancelled(%d, %s)",
+ mSequenceId, activity));
+ }
+
+ invokeRemote(() ->
+ mIorapRemote.onAppLaunchEvent(RequestId.nextValueForSequence(),
+ new AppLaunchEvent.ActivityLaunchCancelled(mSequenceId,
+ activity)));
+ }
+
+ @Override
+ public void onActivityLaunchFinished(@NonNull @ActivityRecordProto byte[] activity) {
+ if (DEBUG) {
+ Log.v(TAG, String.format("AppLaunchObserver#onActivityLaunchFinished(%d, %s)",
+ mSequenceId, activity));
+ }
+
+ invokeRemote(() ->
+ mIorapRemote.onAppLaunchEvent(RequestId.nextValueForSequence(),
+ new AppLaunchEvent.ActivityLaunchCancelled(mSequenceId, activity))
+ );
+ }
+ }
+
+ private class RemoteTaskListener extends ITaskListener.Stub {
+ @Override
+ public void onProgress(RequestId requestId, TaskResult result) throws RemoteException {
+ if (DEBUG) {
+ Log.v(TAG,
+ String.format("RemoteTaskListener#onProgress(%s, %s)", requestId, result));
+ }
+
+ // TODO: implement rest.
+ }
+
+ @Override
+ public void onComplete(RequestId requestId, TaskResult result) throws RemoteException {
+ if (DEBUG) {
+ Log.v(TAG,
+ String.format("RemoteTaskListener#onComplete(%s, %s)", requestId, result));
+ }
+
+ // TODO: implement rest.
+ }
+ }
+
+ private interface RemoteRunnable {
+ void run() throws RemoteException;
+ }
+
+ private static void invokeRemote(RemoteRunnable r) {
+ try {
+ r.run();
+ } catch (RemoteException e) {
+ // TODO: what do we do with exceptions?
+ throw new AssertionError("not implemented", e);
+ }
+ }
+}
diff --git a/startop/iorap/src/com/google/android/startop/iorap/RequestId.java b/startop/iorap/src/com/google/android/startop/iorap/RequestId.java
index 2c79319a1459..adb3a910f7fe 100644
--- a/startop/iorap/src/com/google/android/startop/iorap/RequestId.java
+++ b/startop/iorap/src/com/google/android/startop/iorap/RequestId.java
@@ -71,7 +71,7 @@ public class RequestId implements Parcelable {
@Override
public String toString() {
- return String.format("{requestId: %ld}", requestId);
+ return String.format("{requestId: %d}", requestId);
}
@Override
diff --git a/startop/iorap/tests/Android.bp b/startop/iorap/tests/Android.bp
index 76057846e896..5ac4a46b81f1 100644
--- a/startop/iorap/tests/Android.bp
+++ b/startop/iorap/tests/Android.bp
@@ -18,8 +18,15 @@ java_library {
srcs: ["src/**/*.kt"],
static_libs: [
- // non-test dependencies
- "libiorap-java",
+ // Non-test dependencies
+
+ // library under test
+ "services.startop.iorap",
+ // need the system_server code to be on the classpath,
+ "services.core",
+
+ // Test Dependencies
+
// test android dependencies
"platform-test-annotations",
"android-support-test",
diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp
index 91cec554d7cd..7dc83c3db868 100644
--- a/startop/view_compiler/Android.bp
+++ b/startop/view_compiler/Android.bp
@@ -22,26 +22,46 @@ cc_defaults {
shared_libs: [
"libbase",
"libdexfile",
+ "libz",
"slicer",
],
static_libs: [
"libtinyxml2",
+ "liblog",
+ "libutils",
+ "libziparchive",
],
+ cppflags: ["-std=c++17"],
+ target: {
+ android: {
+ shared_libs: [
+ "libandroidfw",
+ ],
+ },
+ host: {
+ static_libs: [
+ "libandroidfw",
+ ],
+ },
+ },
}
-cc_library_host_static {
+cc_library_static {
name: "libviewcompiler",
defaults: ["viewcompiler_defaults"],
srcs: [
+ "apk_layout_compiler.cc",
"dex_builder.cc",
+ "dex_layout_compiler.cc",
"java_lang_builder.cc",
"tinyxml_layout_parser.cc",
"util.cc",
"layout_validation.cc",
],
+ host_supported: true,
}
-cc_binary_host {
+cc_binary {
name: "viewcompiler",
defaults: ["viewcompiler_defaults"],
srcs: [
@@ -51,6 +71,7 @@ cc_binary_host {
"libgflags",
"libviewcompiler",
],
+ host_supported: true
}
cc_test_host {
diff --git a/startop/view_compiler/apk_layout_compiler.cc b/startop/view_compiler/apk_layout_compiler.cc
new file mode 100644
index 000000000000..09cdbd5fee58
--- /dev/null
+++ b/startop/view_compiler/apk_layout_compiler.cc
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#include "apk_layout_compiler.h"
+#include "dex_layout_compiler.h"
+#include "java_lang_builder.h"
+#include "layout_validation.h"
+#include "util.h"
+
+#include "androidfw/ApkAssets.h"
+#include "androidfw/AssetManager2.h"
+#include "androidfw/ResourceTypes.h"
+
+#include <iostream>
+#include <locale>
+
+#include "android-base/stringprintf.h"
+
+namespace startop {
+
+using android::ResXMLParser;
+using android::base::StringPrintf;
+
+class ResXmlVisitorAdapter {
+ public:
+ ResXmlVisitorAdapter(ResXMLParser* parser) : parser_{parser} {}
+
+ template <typename Visitor>
+ void Accept(Visitor* visitor) {
+ size_t depth{0};
+ do {
+ switch (parser_->next()) {
+ case ResXMLParser::START_DOCUMENT:
+ depth++;
+ visitor->VisitStartDocument();
+ break;
+ case ResXMLParser::END_DOCUMENT:
+ depth--;
+ visitor->VisitEndDocument();
+ break;
+ case ResXMLParser::START_TAG: {
+ depth++;
+ size_t name_length = 0;
+ const char16_t* name = parser_->getElementName(&name_length);
+ visitor->VisitStartTag(std::u16string{name, name_length});
+ break;
+ }
+ case ResXMLParser::END_TAG:
+ depth--;
+ visitor->VisitEndTag();
+ break;
+ default:;
+ }
+ } while (depth > 0 || parser_->getEventType() == ResXMLParser::FIRST_CHUNK_CODE);
+ }
+
+ private:
+ ResXMLParser* parser_;
+};
+
+bool CanCompileLayout(ResXMLParser* parser) {
+ ResXmlVisitorAdapter adapter{parser};
+ LayoutValidationVisitor visitor;
+ adapter.Accept(&visitor);
+
+ return visitor.can_compile();
+}
+
+namespace {
+void CompileApkAssetsLayouts(const std::unique_ptr<const android::ApkAssets>& assets,
+ CompilationTarget target, std::ostream& target_out) {
+ android::AssetManager2 resources;
+ resources.SetApkAssets({assets.get()});
+
+ std::string package_name;
+
+ // TODO: handle multiple packages better
+ bool first = true;
+ for (const auto& package : assets->GetLoadedArsc()->GetPackages()) {
+ CHECK(first);
+ package_name = package->GetPackageName();
+ first = false;
+ }
+
+ dex::DexBuilder dex_file;
+ dex::ClassBuilder compiled_view{
+ dex_file.MakeClass(StringPrintf("%s.CompiledView", package_name.c_str()))};
+ std::vector<dex::MethodBuilder> methods;
+
+ assets->ForEachFile("res/", [&](const android::StringPiece& s, android::FileType) {
+ if (s == "layout") {
+ auto path = StringPrintf("res/%s/", s.to_string().c_str());
+ assets->ForEachFile(path, [&](const android::StringPiece& layout_file, android::FileType) {
+ auto layout_path = StringPrintf("%s%s", path.c_str(), layout_file.to_string().c_str());
+ android::ApkAssetsCookie cookie = android::kInvalidCookie;
+ auto asset = resources.OpenNonAsset(layout_path, android::Asset::ACCESS_RANDOM, &cookie);
+ CHECK(asset);
+ CHECK(android::kInvalidCookie != cookie);
+ const auto dynamic_ref_table = resources.GetDynamicRefTableForCookie(cookie);
+ CHECK(nullptr != dynamic_ref_table);
+ android::ResXMLTree xml_tree{dynamic_ref_table};
+ xml_tree.setTo(asset->getBuffer(/*wordAligned=*/true),
+ asset->getLength(),
+ /*copy_data=*/true);
+ android::ResXMLParser parser{xml_tree};
+ parser.restart();
+ if (CanCompileLayout(&parser)) {
+ parser.restart();
+ const std::string layout_name = startop::util::FindLayoutNameFromFilename(layout_path);
+ ResXmlVisitorAdapter adapter{&parser};
+ switch (target) {
+ case CompilationTarget::kDex: {
+ methods.push_back(compiled_view.CreateMethod(
+ layout_name,
+ dex::Prototype{dex::TypeDescriptor::FromClassname("android.view.View"),
+ dex::TypeDescriptor::FromClassname("android.content.Context"),
+ dex::TypeDescriptor::Int()}));
+ DexViewBuilder builder(&methods.back());
+ builder.Start();
+ LayoutCompilerVisitor visitor{&builder};
+ adapter.Accept(&visitor);
+ builder.Finish();
+ methods.back().Encode();
+ break;
+ }
+ case CompilationTarget::kJavaLanguage: {
+ JavaLangViewBuilder builder{package_name, layout_name, target_out};
+ builder.Start();
+ LayoutCompilerVisitor visitor{&builder};
+ adapter.Accept(&visitor);
+ builder.Finish();
+ break;
+ }
+ }
+ }
+ });
+ }
+ });
+
+ if (target == CompilationTarget::kDex) {
+ slicer::MemView image{dex_file.CreateImage()};
+ target_out.write(image.ptr<const char>(), image.size());
+ }
+}
+} // namespace
+
+void CompileApkLayouts(const std::string& filename, CompilationTarget target,
+ std::ostream& target_out) {
+ auto assets = android::ApkAssets::Load(filename);
+ CompileApkAssetsLayouts(assets, target, target_out);
+}
+
+void CompileApkLayoutsFd(android::base::unique_fd fd, CompilationTarget target,
+ std::ostream& target_out) {
+ constexpr const char* friendly_name{"viewcompiler assets"};
+ auto assets = android::ApkAssets::LoadFromFd(
+ std::move(fd), friendly_name, /*system=*/false, /*force_shared_lib=*/false);
+ CompileApkAssetsLayouts(assets, target, target_out);
+}
+
+} // namespace startop
diff --git a/startop/view_compiler/apk_layout_compiler.h b/startop/view_compiler/apk_layout_compiler.h
new file mode 100644
index 000000000000..03bd545d9121
--- /dev/null
+++ b/startop/view_compiler/apk_layout_compiler.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#ifndef APK_LAYOUT_COMPILER_H_
+#define APK_LAYOUT_COMPILER_H_
+
+#include <string>
+
+#include "android-base/unique_fd.h"
+
+namespace startop {
+
+enum class CompilationTarget { kJavaLanguage, kDex };
+
+void CompileApkLayouts(const std::string& filename, CompilationTarget target,
+ std::ostream& target_out);
+void CompileApkLayoutsFd(android::base::unique_fd fd, CompilationTarget target,
+ std::ostream& target_out);
+
+} // namespace startop
+
+#endif // APK_LAYOUT_COMPILER_H_ \ No newline at end of file
diff --git a/startop/view_compiler/dex_builder_test/Android.bp b/startop/view_compiler/dex_builder_test/Android.bp
index 4449ea0f707e..d4f38ed148c9 100644
--- a/startop/view_compiler/dex_builder_test/Android.bp
+++ b/startop/view_compiler/dex_builder_test/Android.bp
@@ -14,16 +14,30 @@
// limitations under the License.
//
+genrule {
+ name: "generate_compiled_layout",
+ tools: [":viewcompiler"],
+ cmd: "$(location :viewcompiler) $(in) --dex --out $(out) --package android.startop.test",
+ srcs: ["res/layout/layout1.xml"],
+ out: [
+ "layout1.dex",
+ ],
+}
+
android_test {
name: "dex-builder-test",
- srcs: ["src/android/startop/test/DexBuilderTest.java"],
+ srcs: [
+ "src/android/startop/test/DexBuilderTest.java",
+ "src/android/startop/test/LayoutCompilerTest.java",
+ ],
sdk_version: "current",
- data: [":generate_dex_testcases"],
+ data: [":generate_dex_testcases", ":generate_compiled_layout"],
static_libs: [
"android-support-test",
"guava",
],
manifest: "AndroidManifest.xml",
+ resource_dirs: ["res"],
test_config: "AndroidTest.xml",
test_suites: ["general-tests"],
}
diff --git a/startop/view_compiler/dex_builder_test/AndroidTest.xml b/startop/view_compiler/dex_builder_test/AndroidTest.xml
index 6f90cf3b81a7..68d8fdc444d8 100644
--- a/startop/view_compiler/dex_builder_test/AndroidTest.xml
+++ b/startop/view_compiler/dex_builder_test/AndroidTest.xml
@@ -25,6 +25,7 @@
<option name="cleanup" value="true" />
<option name="push" value="trivial.dex->/data/local/tmp/dex-builder-test/trivial.dex" />
<option name="push" value="simple.dex->/data/local/tmp/dex-builder-test/simple.dex" />
+ <option name="push" value="layout1.dex->/data/local/tmp/dex-builder-test/layout1.dex" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
diff --git a/startop/view_compiler/dex_builder_test/res/layout/layout1.xml b/startop/view_compiler/dex_builder_test/res/layout/layout1.xml
new file mode 100644
index 000000000000..0f9375c6ebce
--- /dev/null
+++ b/startop/view_compiler/dex_builder_test/res/layout/layout1.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical"
+ android:gravity="center">
+
+ <Button
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+ <Button
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+ </LinearLayout>
diff --git a/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java b/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java
new file mode 100644
index 000000000000..ce3ce8328559
--- /dev/null
+++ b/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package android.startop.test;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.view.View;
+import com.google.common.io.ByteStreams;
+import dalvik.system.InMemoryDexClassLoader;
+import dalvik.system.PathClassLoader;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import org.junit.Assert;
+import org.junit.Test;
+
+// Adding tests here requires changes in several other places. See README.md in
+// the view_compiler directory for more information.
+public class LayoutCompilerTest {
+ static ClassLoader loadDexFile(String filename) throws Exception {
+ return new PathClassLoader("/data/local/tmp/dex-builder-test/" + filename,
+ ClassLoader.getSystemClassLoader());
+ }
+
+ @Test
+ public void loadAndInflaterLayout1() throws Exception {
+ ClassLoader dex_file = loadDexFile("layout1.dex");
+ Class compiled_view = dex_file.loadClass("android.startop.test.CompiledView");
+ Method layout1 = compiled_view.getMethod("layout1", Context.class, int.class);
+ Context context = InstrumentationRegistry.getTargetContext();
+ layout1.invoke(null, context, R.layout.layout1);
+ }
+}
diff --git a/startop/view_compiler/dex_layout_compiler.cc b/startop/view_compiler/dex_layout_compiler.cc
new file mode 100644
index 000000000000..c68793d10399
--- /dev/null
+++ b/startop/view_compiler/dex_layout_compiler.cc
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#include "dex_layout_compiler.h"
+#include "layout_validation.h"
+
+#include "android-base/stringprintf.h"
+
+namespace startop {
+
+using android::base::StringPrintf;
+
+void LayoutValidationVisitor::VisitStartTag(const std::u16string& name) {
+ if (0 == name.compare(u"merge")) {
+ message_ = "Merge tags are not supported";
+ can_compile_ = false;
+ }
+ if (0 == name.compare(u"include")) {
+ message_ = "Include tags are not supported";
+ can_compile_ = false;
+ }
+ if (0 == name.compare(u"view")) {
+ message_ = "View tags are not supported";
+ can_compile_ = false;
+ }
+ if (0 == name.compare(u"fragment")) {
+ message_ = "Fragment tags are not supported";
+ can_compile_ = false;
+ }
+}
+
+DexViewBuilder::DexViewBuilder(dex::MethodBuilder* method)
+ : method_{method},
+ context_{dex::Value::Parameter(0)},
+ resid_{dex::Value::Parameter(1)},
+ inflater_{method->MakeRegister()},
+ xml_{method->MakeRegister()},
+ attrs_{method->MakeRegister()},
+ classname_tmp_{method->MakeRegister()},
+ xml_next_{method->dex_file()->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.content.res.XmlResourceParser"), "next",
+ dex::Prototype{dex::TypeDescriptor::Int()})},
+ try_create_view_{method->dex_file()->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.view.LayoutInflater"), "tryCreateView",
+ dex::Prototype{dex::TypeDescriptor::FromClassname("android.view.View"),
+ dex::TypeDescriptor::FromClassname("android.view.View"),
+ dex::TypeDescriptor::FromClassname("java.lang.String"),
+ dex::TypeDescriptor::FromClassname("android.content.Context"),
+ dex::TypeDescriptor::FromClassname("android.util.AttributeSet")})},
+ generate_layout_params_{method->dex_file()->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.view.ViewGroup"), "generateLayoutParams",
+ dex::Prototype{dex::TypeDescriptor::FromClassname("android.view.ViewGroup$LayoutParams"),
+ dex::TypeDescriptor::FromClassname("android.util.AttributeSet")})},
+ add_view_{method->dex_file()->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.view.ViewGroup"), "addView",
+ dex::Prototype{
+ dex::TypeDescriptor::Void(),
+ dex::TypeDescriptor::FromClassname("android.view.View"),
+ dex::TypeDescriptor::FromClassname("android.view.ViewGroup$LayoutParams")})},
+ // The register stack starts with one register, which will be null for the root view.
+ register_stack_{{method->MakeRegister()}} {}
+
+void DexViewBuilder::Start() {
+ dex::DexBuilder* const dex = method_->dex_file();
+
+ // LayoutInflater inflater = LayoutInflater.from(context);
+ auto layout_inflater_from = dex->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.view.LayoutInflater"),
+ "from",
+ dex::Prototype{dex::TypeDescriptor::FromClassname("android.view.LayoutInflater"),
+ dex::TypeDescriptor::FromClassname("android.content.Context")});
+ method_->AddInstruction(
+ dex::Instruction::InvokeStaticObject(layout_inflater_from.id, /*dest=*/inflater_, context_));
+
+ // Resources res = context.getResources();
+ auto context_type = dex::TypeDescriptor::FromClassname("android.content.Context");
+ auto resources_type = dex::TypeDescriptor::FromClassname("android.content.res.Resources");
+ auto get_resources =
+ dex->GetOrDeclareMethod(context_type, "getResources", dex::Prototype{resources_type});
+ method_->AddInstruction(dex::Instruction::InvokeVirtualObject(get_resources.id, xml_, context_));
+
+ // XmlResourceParser xml = res.getLayout(resid);
+ auto xml_resource_parser_type =
+ dex::TypeDescriptor::FromClassname("android.content.res.XmlResourceParser");
+ auto get_layout =
+ dex->GetOrDeclareMethod(resources_type,
+ "getLayout",
+ dex::Prototype{xml_resource_parser_type, dex::TypeDescriptor::Int()});
+ method_->AddInstruction(dex::Instruction::InvokeVirtualObject(get_layout.id, xml_, xml_, resid_));
+
+ // AttributeSet attrs = Xml.asAttributeSet(xml);
+ auto as_attribute_set = dex->GetOrDeclareMethod(
+ dex::TypeDescriptor::FromClassname("android.util.Xml"),
+ "asAttributeSet",
+ dex::Prototype{dex::TypeDescriptor::FromClassname("android.util.AttributeSet"),
+ dex::TypeDescriptor::FromClassname("org.xmlpull.v1.XmlPullParser")});
+ method_->AddInstruction(dex::Instruction::InvokeStaticObject(as_attribute_set.id, attrs_, xml_));
+
+ // xml.next(); // start document
+ method_->AddInstruction(dex::Instruction::InvokeInterface(xml_next_.id, {}, xml_));
+}
+
+void DexViewBuilder::Finish() {}
+
+namespace {
+std::string ResolveName(const std::string& name) {
+ if (name == "View") return "android.view.View";
+ if (name == "ViewGroup") return "android.view.ViewGroup";
+ if (name.find(".") == std::string::npos) {
+ return StringPrintf("android.widget.%s", name.c_str());
+ }
+ return name;
+}
+} // namespace
+
+void DexViewBuilder::StartView(const std::string& name, bool is_viewgroup) {
+ bool const is_root_view = view_stack_.empty();
+
+ // xml.next(); // start tag
+ method_->AddInstruction(dex::Instruction::InvokeInterface(xml_next_.id, {}, xml_));
+
+ dex::Value view = AcquireRegister();
+ // try to create the view using the factories
+ method_->BuildConstString(classname_tmp_,
+ name); // TODO: the need to fully qualify the classname
+ if (is_root_view) {
+ dex::Value null = AcquireRegister();
+ method_->BuildConst4(null, 0);
+ method_->AddInstruction(dex::Instruction::InvokeVirtualObject(
+ try_create_view_.id, view, inflater_, null, classname_tmp_, context_, attrs_));
+ ReleaseRegister();
+ } else {
+ method_->AddInstruction(dex::Instruction::InvokeVirtualObject(
+ try_create_view_.id, view, inflater_, GetCurrentView(), classname_tmp_, context_, attrs_));
+ }
+ auto label = method_->MakeLabel();
+ // branch if not null
+ method_->AddInstruction(
+ dex::Instruction::OpWithArgs(dex::Instruction::Op::kBranchNEqz, /*dest=*/{}, view, label));
+
+ // If null, create the class directly.
+ method_->BuildNew(view,
+ dex::TypeDescriptor::FromClassname(ResolveName(name)),
+ dex::Prototype{dex::TypeDescriptor::Void(),
+ dex::TypeDescriptor::FromClassname("android.content.Context"),
+ dex::TypeDescriptor::FromClassname("android.util.AttributeSet")},
+ context_,
+ attrs_);
+
+ method_->AddInstruction(
+ dex::Instruction::OpWithArgs(dex::Instruction::Op::kBindLabel, /*dest=*/{}, label));
+
+ if (is_viewgroup) {
+ // Cast to a ViewGroup so we can add children later.
+ const ir::Type* view_group_def = method_->dex_file()->GetOrAddType(
+ dex::TypeDescriptor::FromClassname("android.view.ViewGroup").descriptor());
+ method_->AddInstruction(dex::Instruction::Cast(view, dex::Value::Type(view_group_def->orig_index)));
+ }
+
+ if (!is_root_view) {
+ // layout_params = parent.generateLayoutParams(attrs);
+ dex::Value layout_params{AcquireRegister()};
+ method_->AddInstruction(dex::Instruction::InvokeVirtualObject(
+ generate_layout_params_.id, layout_params, GetCurrentView(), attrs_));
+ view_stack_.push_back({view, layout_params});
+ } else {
+ view_stack_.push_back({view, {}});
+ }
+}
+
+void DexViewBuilder::FinishView() {
+ if (view_stack_.size() == 1) {
+ method_->BuildReturn(GetCurrentView(), /*is_object=*/true);
+ } else {
+ // parent.add(view, layout_params)
+ method_->AddInstruction(dex::Instruction::InvokeVirtual(
+ add_view_.id, /*dest=*/{}, GetParentView(), GetCurrentView(), GetCurrentLayoutParams()));
+ // xml.next(); // end tag
+ method_->AddInstruction(dex::Instruction::InvokeInterface(xml_next_.id, {}, xml_));
+ }
+ PopViewStack();
+}
+
+dex::Value DexViewBuilder::AcquireRegister() {
+ top_register_++;
+ if (register_stack_.size() == top_register_) {
+ register_stack_.push_back(method_->MakeRegister());
+ }
+ return register_stack_[top_register_];
+}
+
+void DexViewBuilder::ReleaseRegister() { top_register_--; }
+
+dex::Value DexViewBuilder::GetCurrentView() const { return view_stack_.back().view; }
+dex::Value DexViewBuilder::GetCurrentLayoutParams() const {
+ return view_stack_.back().layout_params.value();
+}
+dex::Value DexViewBuilder::GetParentView() const {
+ return view_stack_[view_stack_.size() - 2].view;
+}
+
+void DexViewBuilder::PopViewStack() {
+ const auto& top = view_stack_.back();
+ // release the layout params if we have them
+ if (top.layout_params.has_value()) {
+ ReleaseRegister();
+ }
+ // Unconditionally release the view register.
+ ReleaseRegister();
+ view_stack_.pop_back();
+}
+
+} // namespace startop \ No newline at end of file
diff --git a/startop/view_compiler/dex_layout_compiler.h b/startop/view_compiler/dex_layout_compiler.h
new file mode 100644
index 000000000000..170a1a610297
--- /dev/null
+++ b/startop/view_compiler/dex_layout_compiler.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#ifndef DEX_LAYOUT_COMPILER_H_
+#define DEX_LAYOUT_COMPILER_H_
+
+#include "dex_builder.h"
+
+#include <codecvt>
+#include <locale>
+#include <string>
+#include <vector>
+
+namespace startop {
+
+// This visitor does the actual view compilation, using a supplied builder.
+template <typename Builder>
+class LayoutCompilerVisitor {
+ public:
+ explicit LayoutCompilerVisitor(Builder* builder) : builder_{builder} {}
+
+ void VisitStartDocument() { builder_->Start(); }
+ void VisitEndDocument() { builder_->Finish(); }
+ void VisitStartTag(const std::u16string& name) {
+ parent_stack_.push_back(ViewEntry{
+ std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(name), {}});
+ }
+ void VisitEndTag() {
+ auto entry = parent_stack_.back();
+ parent_stack_.pop_back();
+
+ if (parent_stack_.empty()) {
+ GenerateCode(entry);
+ } else {
+ parent_stack_.back().children.push_back(entry);
+ }
+ }
+
+ private:
+ struct ViewEntry {
+ std::string name;
+ std::vector<ViewEntry> children;
+ };
+
+ void GenerateCode(const ViewEntry& view) {
+ builder_->StartView(view.name, !view.children.empty());
+ for (const auto& child : view.children) {
+ GenerateCode(child);
+ }
+ builder_->FinishView();
+ }
+
+ Builder* builder_;
+
+ std::vector<ViewEntry> parent_stack_;
+};
+
+class DexViewBuilder {
+ public:
+ DexViewBuilder(dex::MethodBuilder* method);
+
+ void Start();
+ void Finish();
+ void StartView(const std::string& name, bool is_viewgroup);
+ void FinishView();
+
+ private:
+ // Accessors for the stack of views that are under construction.
+ dex::Value AcquireRegister();
+ void ReleaseRegister();
+ dex::Value GetCurrentView() const;
+ dex::Value GetCurrentLayoutParams() const;
+ dex::Value GetParentView() const;
+ void PopViewStack();
+
+ dex::MethodBuilder* method_;
+
+ // Registers used for code generation
+ dex::Value const context_;
+ dex::Value const resid_;
+ const dex::Value inflater_;
+ const dex::Value xml_;
+ const dex::Value attrs_;
+ const dex::Value classname_tmp_;
+
+ const dex::MethodDeclData xml_next_;
+ const dex::MethodDeclData try_create_view_;
+ const dex::MethodDeclData generate_layout_params_;
+ const dex::MethodDeclData add_view_;
+
+ // used for keeping track of which registers are in use
+ size_t top_register_{0};
+ std::vector<dex::Value> register_stack_;
+
+ // Keep track of the views currently in progress.
+ struct ViewEntry {
+ dex::Value view;
+ std::optional<dex::Value> layout_params;
+ };
+ std::vector<ViewEntry> view_stack_;
+};
+
+} // namespace startop
+
+#endif // DEX_LAYOUT_COMPILER_H_
diff --git a/startop/view_compiler/java_lang_builder.cc b/startop/view_compiler/java_lang_builder.cc
index 0b8754fc7096..920caeecf58e 100644
--- a/startop/view_compiler/java_lang_builder.cc
+++ b/startop/view_compiler/java_lang_builder.cc
@@ -67,7 +67,7 @@ void JavaLangViewBuilder::Finish() const {
"}\n"; // end CompiledView
}
-void JavaLangViewBuilder::StartView(const string& class_name) {
+void JavaLangViewBuilder::StartView(const string& class_name, bool /*is_viewgroup*/) {
const string view_var = MakeVar("view");
const string layout_var = MakeVar("layout");
std::string parent = "null";
diff --git a/startop/view_compiler/java_lang_builder.h b/startop/view_compiler/java_lang_builder.h
index c8d20b23cd13..69356d3a6594 100644
--- a/startop/view_compiler/java_lang_builder.h
+++ b/startop/view_compiler/java_lang_builder.h
@@ -35,7 +35,7 @@ class JavaLangViewBuilder {
void Finish() const;
// Begin creating a view (i.e. process the opening tag)
- void StartView(const std::string& class_name);
+ void StartView(const std::string& class_name, bool is_viewgroup);
// Finish a view, after all of its child nodes have been processed.
void FinishView();
diff --git a/startop/view_compiler/main.cc b/startop/view_compiler/main.cc
index 609bcf377b46..11ecde27f5cd 100644
--- a/startop/view_compiler/main.cc
+++ b/startop/view_compiler/main.cc
@@ -16,8 +16,12 @@
#include "gflags/gflags.h"
+#include "android-base/stringprintf.h"
+#include "apk_layout_compiler.h"
#include "dex_builder.h"
+#include "dex_layout_compiler.h"
#include "java_lang_builder.h"
+#include "layout_validation.h"
#include "tinyxml_layout_parser.h"
#include "util.h"
@@ -32,49 +36,67 @@
namespace {
using namespace tinyxml2;
+using android::base::StringPrintf;
+using startop::dex::ClassBuilder;
+using startop::dex::DexBuilder;
+using startop::dex::MethodBuilder;
+using startop::dex::Prototype;
+using startop::dex::TypeDescriptor;
using namespace startop::util;
using std::string;
constexpr char kStdoutFilename[]{"stdout"};
+DEFINE_bool(apk, false, "Compile layouts in an APK");
DEFINE_bool(dex, false, "Generate a DEX file instead of Java");
+DEFINE_int32(infd, -1, "Read input from the given file descriptor");
DEFINE_string(out, kStdoutFilename, "Where to write the generated class");
DEFINE_string(package, "", "The package name for the generated class (required)");
-class ViewCompilerXmlVisitor : public XMLVisitor {
+template <typename Visitor>
+class XmlVisitorAdapter : public XMLVisitor {
public:
- explicit ViewCompilerXmlVisitor(JavaLangViewBuilder* builder) : builder_(builder) {}
+ explicit XmlVisitorAdapter(Visitor* visitor) : visitor_{visitor} {}
bool VisitEnter(const XMLDocument& /*doc*/) override {
- builder_->Start();
+ visitor_->VisitStartDocument();
return true;
}
bool VisitExit(const XMLDocument& /*doc*/) override {
- builder_->Finish();
+ visitor_->VisitEndDocument();
return true;
}
bool VisitEnter(const XMLElement& element, const XMLAttribute* /*firstAttribute*/) override {
- builder_->StartView(element.Name());
+ visitor_->VisitStartTag(
+ std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(
+ element.Name()));
return true;
}
bool VisitExit(const XMLElement& /*element*/) override {
- builder_->FinishView();
+ visitor_->VisitEndTag();
return true;
}
private:
- JavaLangViewBuilder* builder_;
+ Visitor* visitor_;
};
+template <typename Builder>
+void CompileLayout(XMLDocument* xml, Builder* builder) {
+ startop::LayoutCompilerVisitor visitor{builder};
+ XmlVisitorAdapter<decltype(visitor)> adapter{&visitor};
+ xml->Accept(&adapter);
+}
+
} // end namespace
int main(int argc, char** argv) {
constexpr size_t kProgramName = 0;
constexpr size_t kFileNameParam = 1;
- constexpr size_t kNumRequiredArgs = 2;
+ constexpr size_t kNumRequiredArgs = 1;
gflags::SetUsageMessage(
"Compile XML layout files into equivalent Java language code\n"
@@ -83,21 +105,37 @@ int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, /*remove_flags*/ true);
gflags::CommandLineFlagInfo cmd = gflags::GetCommandLineFlagInfoOrDie("package");
- if (argc != kNumRequiredArgs || cmd.is_default) {
+ if (argc < kNumRequiredArgs || cmd.is_default) {
gflags::ShowUsageWithFlags(argv[kProgramName]);
return 1;
}
- if (FLAGS_dex) {
- startop::dex::WriteTestDexFile("test.dex");
+ const bool is_stdout = FLAGS_out == kStdoutFilename;
+
+ std::ofstream outfile;
+ if (!is_stdout) {
+ outfile.open(FLAGS_out);
+ }
+
+ if (FLAGS_apk) {
+ const startop::CompilationTarget target =
+ FLAGS_dex ? startop::CompilationTarget::kDex : startop::CompilationTarget::kJavaLanguage;
+ if (FLAGS_infd >= 0) {
+ startop::CompileApkLayoutsFd(
+ android::base::unique_fd{FLAGS_infd}, target, is_stdout ? std::cout : outfile);
+ } else {
+ if (argc < 2) {
+ gflags::ShowUsageWithFlags(argv[kProgramName]);
+ return 1;
+ }
+ const char* const filename = argv[kFileNameParam];
+ startop::CompileApkLayouts(filename, target, is_stdout ? std::cout : outfile);
+ }
return 0;
}
const char* const filename = argv[kFileNameParam];
- const string layout_name = FindLayoutNameFromFilename(filename);
-
- // We want to generate Java language code to inflate exactly this layout. This means
- // generating code to walk the resource XML too.
+ const string layout_name = startop::util::FindLayoutNameFromFilename(filename);
XMLDocument xml;
xml.LoadFile(filename);
@@ -108,15 +146,27 @@ int main(int argc, char** argv) {
return 1;
}
- std::ofstream outfile;
- if (FLAGS_out != kStdoutFilename) {
- outfile.open(FLAGS_out);
+ if (FLAGS_dex) {
+ DexBuilder dex_file;
+ string class_name = StringPrintf("%s.CompiledView", FLAGS_package.c_str());
+ ClassBuilder compiled_view{dex_file.MakeClass(class_name)};
+ MethodBuilder method{compiled_view.CreateMethod(
+ layout_name,
+ Prototype{TypeDescriptor::FromClassname("android.view.View"),
+ TypeDescriptor::FromClassname("android.content.Context"),
+ TypeDescriptor::Int()})};
+ startop::DexViewBuilder builder{&method};
+ CompileLayout(&xml, &builder);
+ method.Encode();
+
+ slicer::MemView image{dex_file.CreateImage()};
+
+ (is_stdout ? std::cout : outfile).write(image.ptr<const char>(), image.size());
+ } else {
+ // Generate Java language output.
+ JavaLangViewBuilder builder{FLAGS_package, layout_name, is_stdout ? std::cout : outfile};
+
+ CompileLayout(&xml, &builder);
}
- JavaLangViewBuilder builder{
- FLAGS_package, layout_name, FLAGS_out == kStdoutFilename ? std::cout : outfile};
-
- ViewCompilerXmlVisitor visitor{&builder};
- xml.Accept(&visitor);
-
return 0;
}
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 8f118d839084..f3b734abbcdc 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -239,6 +239,30 @@ public final class Call {
"android.telecom.event.HANDOVER_FAILED";
public static class Details {
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(
+ prefix = { "DIRECTION_" },
+ value = {DIRECTION_UNKNOWN, DIRECTION_INCOMING, DIRECTION_OUTGOING})
+ public @interface CallDirection {}
+
+ /**
+ * Indicates that the call is neither and incoming nor an outgoing call. This can be the
+ * case for calls reported directly by a {@link ConnectionService} in special cases such as
+ * call handovers.
+ */
+ public static final int DIRECTION_UNKNOWN = -1;
+
+ /**
+ * Indicates that the call is an incoming call.
+ */
+ public static final int DIRECTION_INCOMING = 0;
+
+ /**
+ * Indicates that the call is an outgoing call.
+ */
+ public static final int DIRECTION_OUTGOING = 1;
+
/** Call can currently be put on hold or unheld. */
public static final int CAPABILITY_HOLD = 0x00000001;
@@ -532,6 +556,7 @@ public final class Call {
private final Bundle mIntentExtras;
private final long mCreationTimeMillis;
private final CallIdentification mCallIdentification;
+ private final @CallDirection int mCallDirection;
/**
* Whether the supplied capabilities supports the specified capability.
@@ -857,6 +882,14 @@ public final class Call {
return mCallIdentification;
}
+ /**
+ * Indicates whether the call is an incoming or outgoing call.
+ * @return The call's direction.
+ */
+ public @CallDirection int getCallDirection() {
+ return mCallDirection;
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof Details) {
@@ -878,7 +911,8 @@ public final class Call {
areBundlesEqual(mExtras, d.mExtras) &&
areBundlesEqual(mIntentExtras, d.mIntentExtras) &&
Objects.equals(mCreationTimeMillis, d.mCreationTimeMillis) &&
- Objects.equals(mCallIdentification, d.mCallIdentification);
+ Objects.equals(mCallIdentification, d.mCallIdentification) &&
+ Objects.equals(mCallDirection, d.mCallDirection);
}
return false;
}
@@ -900,7 +934,8 @@ public final class Call {
mExtras,
mIntentExtras,
mCreationTimeMillis,
- mCallIdentification);
+ mCallIdentification,
+ mCallDirection);
}
/** {@hide} */
@@ -921,7 +956,8 @@ public final class Call {
Bundle extras,
Bundle intentExtras,
long creationTimeMillis,
- CallIdentification callIdentification) {
+ CallIdentification callIdentification,
+ int callDirection) {
mTelecomCallId = telecomCallId;
mHandle = handle;
mHandlePresentation = handlePresentation;
@@ -939,6 +975,7 @@ public final class Call {
mIntentExtras = intentExtras;
mCreationTimeMillis = creationTimeMillis;
mCallIdentification = callIdentification;
+ mCallDirection = callDirection;
}
/** {@hide} */
@@ -960,7 +997,8 @@ public final class Call {
parcelableCall.getExtras(),
parcelableCall.getIntentExtras(),
parcelableCall.getCreationTimeMillis(),
- parcelableCall.getCallIdentification());
+ parcelableCall.getCallIdentification(),
+ parcelableCall.getCallDirection());
}
@Override
diff --git a/telecomm/java/android/telecom/CallIdentification.java b/telecomm/java/android/telecom/CallIdentification.java
index 97af06c1d64c..87834fd5109d 100644
--- a/telecomm/java/android/telecom/CallIdentification.java
+++ b/telecomm/java/android/telecom/CallIdentification.java
@@ -250,8 +250,8 @@ public final class CallIdentification implements Parcelable {
mDetails = details;
mPhoto = photo;
mNuisanceConfidence = nuisanceConfidence;
- mCallScreeningAppName = callScreeningPackageName;
- mCallScreeningPackageName = callScreeningAppName;
+ mCallScreeningAppName = callScreeningAppName;
+ mCallScreeningPackageName = callScreeningPackageName;
}
private String mName;
@@ -430,4 +430,22 @@ public final class CallIdentification implements Parcelable {
return Objects.hash(mName, mDescription, mDetails, mPhoto, mNuisanceConfidence,
mCallScreeningAppName, mCallScreeningPackageName);
}
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[CallId mName=");
+ sb.append(Log.pii(mName));
+ sb.append(", mDesc=");
+ sb.append(mDescription);
+ sb.append(", mDet=");
+ sb.append(mDetails);
+ sb.append(", conf=");
+ sb.append(mNuisanceConfidence);
+ sb.append(", appName=");
+ sb.append(mCallScreeningAppName);
+ sb.append(", pkgName=");
+ sb.append(mCallScreeningPackageName);
+ return sb.toString();
+ }
}
diff --git a/telecomm/java/android/telecom/CallRedirectionService.java b/telecomm/java/android/telecom/CallRedirectionService.java
index b906d0bf3136..329911776993 100644
--- a/telecomm/java/android/telecom/CallRedirectionService.java
+++ b/telecomm/java/android/telecom/CallRedirectionService.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.NonNull;
import android.annotation.SdkConstant;
import android.app.Service;
import android.content.Intent;
@@ -27,8 +28,8 @@ import android.os.Message;
import android.os.RemoteException;
import com.android.internal.os.SomeArgs;
-import com.android.internal.telecom.ICallRedirectionService;
import com.android.internal.telecom.ICallRedirectionAdapter;
+import com.android.internal.telecom.ICallRedirectionService;
/**
* This service can be implemented to interact between Telecom and its implementor
@@ -62,22 +63,35 @@ public abstract class CallRedirectionService extends Service {
/**
* Telecom calls this method to inform the implemented {@link CallRedirectionService} of
- * a new outgoing call which is being placed.
+ * a new outgoing call which is being placed. Telecom does not request to redirect emergency
+ * calls and does not request to redirect calls with gateway information.
+ *
+ * <p>Telecom will cancel the call if Telecom does not receive a response in 5 seconds from
+ * the implemented {@link CallRedirectionService} set by users.
*
- * The implemented {@link CallRedirectionService} can call {@link #placeCallUnmodified()},
- * {@link #redirectCall(Uri, PhoneAccountHandle)}, and {@link #cancelCall()} only from here.
+ * <p>The implemented {@link CallRedirectionService} can call {@link #placeCallUnmodified()},
+ * {@link #redirectCall(Uri, PhoneAccountHandle, boolean)}, and {@link #cancelCall()} only
+ * from here.
*
- * @param handle the phone number dialed by the user
- * @param targetPhoneAccount the {@link PhoneAccountHandle} on which the call will be placed.
+ * @param handle the phone number dialed by the user, represented in E.164 format if possible
+ * @param initialPhoneAccount the {@link PhoneAccountHandle} on which the call will be placed.
+ * @param allowInteractiveResponse a boolean to tell if the implemented
+ * {@link CallRedirectionService} should allow interactive
+ * responses with users. Will be {@code false} if, for example
+ * the device is in car mode and the user would not be able to
+ * interact with their device.
*/
- public abstract void onPlaceCall(Uri handle, PhoneAccountHandle targetPhoneAccount);
+ public abstract void onPlaceCall(@NonNull Uri handle,
+ @NonNull PhoneAccountHandle initialPhoneAccount,
+ boolean allowInteractiveResponse);
/**
* The implemented {@link CallRedirectionService} calls this method to response a request
- * received via {@link #onPlaceCall(Uri, PhoneAccountHandle)} to inform Telecom that no changes
- * are required to the outgoing call, and that the call should be placed as-is.
+ * received via {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)} to inform Telecom that
+ * no changes are required to the outgoing call, and that the call should be placed as-is.
*
- * This can only be called from implemented {@link #onPlaceCall(Uri, PhoneAccountHandle)}.
+ * <p>This can only be called from implemented
+ * {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)}.
*
*/
public final void placeCallUnmodified() {
@@ -89,29 +103,39 @@ public abstract class CallRedirectionService extends Service {
/**
* The implemented {@link CallRedirectionService} calls this method to response a request
- * received via {@link #onPlaceCall(Uri, PhoneAccountHandle)} to inform Telecom that changes
- * are required to the phone number or/and {@link PhoneAccountHandle} for the outgoing call.
+ * received via {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)} to inform Telecom that
+ * changes are required to the phone number or/and {@link PhoneAccountHandle} for the outgoing
+ * call. Telecom will cancel the call if the implemented {@link CallRedirectionService}
+ * replies Telecom a handle for an emergency number.
*
- * This can only be called from implemented {@link #onPlaceCall(Uri, PhoneAccountHandle)}.
+ * <p>This can only be called from implemented
+ * {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)}.
*
* @param handle the new phone number to dial
* @param targetPhoneAccount the {@link PhoneAccountHandle} to use when placing the call.
* If {@code null}, no change will be made to the
* {@link PhoneAccountHandle} used to place the call.
+ * @param confirmFirst Telecom will ask users to confirm the redirection via a yes/no dialog
+ * if the confirmFirst is true, and if the redirection request of this
+ * response was sent with a true flag of allowInteractiveResponse via
+ * {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)}
*/
- public final void redirectCall(Uri handle, PhoneAccountHandle targetPhoneAccount) {
+ public final void redirectCall(@NonNull Uri handle,
+ @NonNull PhoneAccountHandle targetPhoneAccount,
+ boolean confirmFirst) {
try {
- mCallRedirectionAdapter.redirectCall(handle, targetPhoneAccount);
+ mCallRedirectionAdapter.redirectCall(handle, targetPhoneAccount, confirmFirst);
} catch (RemoteException e) {
}
}
/**
* The implemented {@link CallRedirectionService} calls this method to response a request
- * received via {@link #onPlaceCall(Uri, PhoneAccountHandle)} to inform Telecom that an outgoing
- * call should be canceled entirely.
+ * received via {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)} to inform Telecom that
+ * an outgoing call should be canceled entirely.
*
- * This can only be called from implemented {@link #onPlaceCall(Uri, PhoneAccountHandle)}.
+ * <p>This can only be called from implemented
+ * {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)}.
*
*/
public final void cancelCall() {
@@ -137,7 +161,8 @@ public abstract class CallRedirectionService extends Service {
SomeArgs args = (SomeArgs) msg.obj;
try {
mCallRedirectionAdapter = (ICallRedirectionAdapter) args.arg1;
- onPlaceCall((Uri) args.arg2, (PhoneAccountHandle) args.arg3);
+ onPlaceCall((Uri) args.arg2, (PhoneAccountHandle) args.arg3,
+ (boolean) args.arg4);
} finally {
args.recycle();
}
@@ -152,15 +177,20 @@ public abstract class CallRedirectionService extends Service {
* Telecom calls this method to inform the CallRedirectionService of a new outgoing call
* which is about to be placed.
* @param handle the phone number dialed by the user
- * @param targetPhoneAccount the URI of the number the user dialed
+ * @param initialPhoneAccount the URI of the number the user dialed
+ * @param allowInteractiveResponse a boolean to tell if the implemented
+ * {@link CallRedirectionService} should allow interactive
+ * responses with users.
*/
@Override
- public void placeCall(ICallRedirectionAdapter adapter, Uri handle,
- PhoneAccountHandle targetPhoneAccount) {
+ public void placeCall(@NonNull ICallRedirectionAdapter adapter, @NonNull Uri handle,
+ @NonNull PhoneAccountHandle initialPhoneAccount,
+ boolean allowInteractiveResponse) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = adapter;
args.arg2 = handle;
- args.arg3 = targetPhoneAccount;
+ args.arg3 = initialPhoneAccount;
+ args.arg4 = allowInteractiveResponse;
mHandler.obtainMessage(MSG_PLACE_CALL, args).sendToTarget();
}
}
diff --git a/telecomm/java/android/telecom/CallScreeningService.java b/telecomm/java/android/telecom/CallScreeningService.java
index be96b3cac6f6..826ad82dfbb2 100644
--- a/telecomm/java/android/telecom/CallScreeningService.java
+++ b/telecomm/java/android/telecom/CallScreeningService.java
@@ -21,6 +21,7 @@ import android.annotation.SdkConstant;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
+import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -33,8 +34,9 @@ import com.android.internal.telecom.ICallScreeningService;
/**
* This service can be implemented by the default dialer (see
- * {@link TelecomManager#getDefaultDialerPackage()}) to allow or disallow incoming calls before
- * they are shown to a user.
+ * {@link TelecomManager#getDefaultDialerPackage()}) or a third party app to allow or disallow
+ * incoming calls before they are shown to a user. This service can also provide
+ * {@link CallIdentification} information for calls.
* <p>
* Below is an example manifest registration for a {@code CallScreeningService}.
* <pre>
@@ -56,6 +58,34 @@ import com.android.internal.telecom.ICallScreeningService;
* information about a {@link Call.Details call} which will be shown to the user in the
* Dialer app.</li>
* </ol>
+ * <p>
+ * <h2>Becoming the {@link CallScreeningService}</h2>
+ * Telecom will bind to a single app chosen by the user which implements the
+ * {@link CallScreeningService} API when there are new incoming and outgoing calls.
+ * <p>
+ * The code snippet below illustrates how your app can request that it fills the call screening
+ * role.
+ * <pre>
+ * {@code
+ * private static final int REQUEST_ID = 1;
+ *
+ * public void requestRole() {
+ * RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
+ * Intent intent = roleManager.createRequestRoleIntent("android.app.role.CALL_SCREENING_APP");
+ * startActivityForResult(intent, REQUEST_ID);
+ * }
+ *
+ * &#64;Override
+ * public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ * if (requestCode == REQUEST_ID) {
+ * if (resultCode == android.app.Activity.RESULT_OK) {
+ * // Your app is now the call screening app
+ * } else {
+ * // Your app is not the call screening app
+ * }
+ * }
+ * }
+ * </pre>
*/
public abstract class CallScreeningService extends Service {
/**
@@ -222,30 +252,46 @@ public abstract class CallScreeningService extends Service {
}
/**
- * Called when a new incoming call is added.
- * {@link CallScreeningService#respondToCall(Call.Details, CallScreeningService.CallResponse)}
- * should be called to allow or disallow the call.
+ * Called when a new incoming or outgoing call is added which is not in the user's contact list.
+ * <p>
+ * A {@link CallScreeningService} must indicate whether an incoming call is allowed or not by
+ * calling
+ * {@link CallScreeningService#respondToCall(Call.Details, CallScreeningService.CallResponse)}.
+ * Your app can tell if a call is an incoming call by checking to see if
+ * {@link Call.Details#getCallDirection()} is {@link Call.Details#DIRECTION_INCOMING}.
+ * <p>
+ * For incoming or outgoing calls, the {@link CallScreeningService} can call
+ * {@link #provideCallIdentification(Call.Details, CallIdentification)} in order to provide
+ * {@link CallIdentification} for the call.
* <p>
* Note: The {@link Call.Details} instance provided to a call screening service will only have
* the following properties set. The rest of the {@link Call.Details} properties will be set to
* their default value or {@code null}.
* <ul>
- * <li>{@link Call.Details#getState()}</li>
+ * <li>{@link Call.Details#getCallDirection()}</li>
* <li>{@link Call.Details#getConnectTimeMillis()}</li>
* <li>{@link Call.Details#getCreationTimeMillis()}</li>
* <li>{@link Call.Details#getHandle()}</li>
* <li>{@link Call.Details#getHandlePresentation()}</li>
* </ul>
+ * <p>
+ * Only calls where the {@link Call.Details#getHandle() handle} {@link Uri#getScheme() scheme}
+ * is {@link PhoneAccount#SCHEME_TEL} are passed for call
+ * screening. Further, only calls which are not in the user's contacts are passed for
+ * screening. For outgoing calls, no post-dial digits are passed.
*
- * @param callDetails Information about a new incoming call, see {@link Call.Details}.
+ * @param callDetails Information about a new call, see {@link Call.Details}.
*/
public abstract void onScreenCall(@NonNull Call.Details callDetails);
/**
- * Responds to the given call, either allowing it or disallowing it.
+ * Responds to the given incoming call, either allowing it or disallowing it.
* <p>
* The {@link CallScreeningService} calls this method to inform the system whether the call
* should be silently blocked or not.
+ * <p>
+ * Calls to this method are ignored unless the {@link Call.Details#getCallDirection()} is
+ * {@link Call.Details#DIRECTION_INCOMING}.
*
* @param callDetails The call to allow.
* <p>
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 165349216d44..8b7299fa890f 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -525,6 +525,13 @@ public abstract class Connection extends Conferenceable {
*/
public static final String EXTRA_CALL_PROPERTY =
"android.telecom.extra.EXTRA_CALL_PROPERTY";
+ /**
+ * Boolean connection extra key set on the extras passed to
+ * {@link Connection#sendConnectionEvent} which indicates that audio is present
+ * on the RTT call when the extra value is true.
+ */
+ public static final String EXTRA_IS_RTT_AUDIO_PRESENT =
+ "android.telecom.extra.IS_RTT_AUDIO_PRESENT";
/**
* Connection event used to inform Telecom that it should play the on hold tone. This is used
@@ -648,6 +655,12 @@ public abstract class Connection extends Conferenceable {
*/
public static final String EVENT_CALL_PROPERTY_CHANGED =
"android.telecom.event.EVENT_CALL_PROPERTY_CHANGED";
+ /**
+ * Connection event used to inform an {@link InCallService} that the RTT audio indication
+ * has changed.
+ */
+ public static final String EVENT_RTT_AUDIO_INDICATION_CHANGED =
+ "android.telecom.event.RTT_AUDIO_INDICATION_CHANGED";
// Flag controlling whether PII is emitted into the logs
private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 1aeeca73c0b9..f5f0af7e4666 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -40,11 +40,30 @@ import java.util.Collections;
import java.util.List;
/**
- * This service is implemented by any app that wishes to provide the user-interface for managing
- * phone calls. Telecom binds to this service while there exists a live (active or incoming) call,
- * and uses it to notify the in-call app of any live and recently disconnected calls. An app must
- * first be set as the default phone app (See {@link TelecomManager#getDefaultDialerPackage()})
- * before the telecom service will bind to its {@code InCallService} implementation.
+ * This service is implemented by an app that wishes to provide functionality for managing
+ * phone calls.
+ * <p>
+ * There are three types of apps which Telecom can bind to when there exists a live (active or
+ * incoming) call:
+ * <ol>
+ * <li>Default Dialer/Phone app - the default dialer/phone app is one which provides the
+ * in-call user interface while the device is in a call. A device is bundled with a system
+ * provided default dialer/phone app. The user may choose a single app to take over this role
+ * from the system app.</li>
+ * <li>Default Car-mode Dialer/Phone app - the default car-mode dialer/phone app is one which
+ * provides the in-call user interface while the device is in a call and the device is in car
+ * mode. The user may choose a single app to fill this role.</li>
+ * <li>Call Companion app - a call companion app is one which provides no user interface itself,
+ * but exposes call information to another display surface, such as a wearable device. The
+ * user may choose multiple apps to fill this role.</li>
+ * </ol>
+ * <p>
+ * Apps which wish to fulfill one of the above roles use the {@link android.app.role.RoleManager}
+ * to request that they fill the desired role.
+ *
+ * <h2>Becoming the Default Phone App</h2>
+ * An app filling the role of the default phone app provides a user interface while the device is in
+ * a call, and the device is not in car mode.
* <p>
* Below is an example manifest registration for an {@code InCallService}. The meta-data
* {@link TelecomManager#METADATA_IN_CALL_SERVICE_UI} indicates that this particular
@@ -82,12 +101,34 @@ import java.util.List;
* }
* </pre>
* <p>
- * When a user installs your application and runs it for the first time, you should prompt the user
- * to see if they would like your application to be the new default phone app. See the
- * {@link TelecomManager#ACTION_CHANGE_DEFAULT_DIALER} intent documentation for more information on
- * how to do this.
+ * When a user installs your application and runs it for the first time, you should use the
+ * {@link android.app.role.RoleManager} to prompt the user to see if they would like your app to
+ * be the new default phone app.
+ * <p id="requestRole">
+ * The code below shows how your app can request to become the default phone/dialer app:
+ * <pre>
+ * {@code
+ * private static final int REQUEST_ID = 1;
+ *
+ * public void requestRole() {
+ * RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
+ * Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
+ * startActivityForResult(intent, REQUEST_ID);
+ * }
+ *
+ * &#64;Override
+ * public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ * if (requestCode == REQUEST_ID) {
+ * if (resultCode == android.app.Activity.RESULT_OK) {
+ * // Your app is now the default dialer app
+ * } else {
+ * // Your app is not the default dialer app
+ * }
+ * }
+ * }
+ * </pre>
* <p id="incomingCallNotification">
- * <h2>Showing the Incoming Call Notification</h2>
+ * <h3>Showing the Incoming Call Notification</h3>
* When your app receives a new incoming call via {@link InCallService#onCallAdded(Call)}, it is
* responsible for displaying an incoming call UI for the incoming call. It should do this using
* {@link android.app.NotificationManager} APIs to post a new incoming call notification.
@@ -121,7 +162,7 @@ import java.util.List;
* heads-up notification if the user is actively using the phone. When the user is not using the
* phone, your full-screen incoming call UI is used instead.
* For example:
- * <pre><code>
+ * <pre><code>{@code
* // Create an intent which triggers your fullscreen incoming call user interface.
* Intent intent = new Intent(Intent.ACTION_MAIN, null);
* intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -151,7 +192,49 @@ import java.util.List;
* NotificationManager notificationManager = mContext.getSystemService(
* NotificationManager.class);
* notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, builder.build());
- * </code></pre>
+ * }</pre>
+ * <p>
+ * <h2>Becoming the Default Car-mode Phone App</h2>
+ * An app filling the role of the default car-mode dialer/phone app provides a user interface while
+ * the device is in a call, and in car mode. See
+ * {@link android.app.UiModeManager#ACTION_ENTER_CAR_MODE} for more information about car mode.
+ * When the device is in car mode, Telecom binds to the default car-mode dialer/phone app instead
+ * of the usual dialer/phone app.
+ * <p>
+ * Similar to the requirements for becoming the default dialer/phone app, your app must declare a
+ * manifest entry for its {@link InCallService} implementation. Your manifest entry should ensure
+ * the following conditions are met:
+ * <ul>
+ * <li>Do NOT declare the {@link TelecomManager#METADATA_IN_CALL_SERVICE_UI} metadata.</li>
+ * <li>Set the {@link TelecomManager#METADATA_IN_CALL_SERVICE_CAR_MODE_UI} metadata to
+ * {@code true}<li>
+ * <li>Your app must request the permission
+ * {@link android.Manifest.permission.CALL_COMPANION_APP}.</li>
+ * </ul>
+ * <p>
+ * Your app should request to fill the role {@code android.app.role.CAR_MODE_DIALER_APP} in order to
+ * become the default (see <a href="#requestRole">above</a> for how to request your app fills this
+ * role).
+ *
+ * <h2>Becoming a Call Companion App</h2>
+ * An app which fills the companion app role does not directly provide a user interface while the
+ * device is in a call. Instead, it is typically used to relay information about calls to another
+ * display surface, such as a wearable device.
+ * <p>
+ * Similar to the requirements for becoming the default dialer/phone app, your app must declare a
+ * manifest entry for its {@link InCallService} implementation. Your manifest entry should
+ * ensure the following conditions are met:
+ * <ul>
+ * <li>Do NOT declare the {@link TelecomManager#METADATA_IN_CALL_SERVICE_UI} metadata.</li>
+ * <li>Do NOT declare the {@link TelecomManager#METADATA_IN_CALL_SERVICE_CAR_MODE_UI}
+ * metadata.</li>
+ * <li>Your app must request the permission
+ * {@link android.Manifest.permission.CALL_COMPANION_APP}.</li>
+ * </ul>
+ * <p>
+ * Your app should request to fill the role {@code android.app.role.CALL_COMPANION_APP} in order to
+ * become a call companion app (see <a href="#requestRole">above</a> for how to request your app
+ * fills this role).
*/
public abstract class InCallService extends Service {
diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java
index 911786e455c2..f7dec83c3ace 100644
--- a/telecomm/java/android/telecom/ParcelableCall.java
+++ b/telecomm/java/android/telecom/ParcelableCall.java
@@ -24,6 +24,7 @@ import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
+import android.telecom.Call.Details.CallDirection;
import java.util.ArrayList;
import java.util.Collections;
@@ -64,6 +65,7 @@ public final class ParcelableCall implements Parcelable {
private final Bundle mExtras;
private final long mCreationTimeMillis;
private final CallIdentification mCallIdentification;
+ private final int mCallDirection;
public ParcelableCall(
String id,
@@ -92,7 +94,8 @@ public final class ParcelableCall implements Parcelable {
Bundle intentExtras,
Bundle extras,
long creationTimeMillis,
- CallIdentification callIdentification) {
+ CallIdentification callIdentification,
+ int callDirection) {
mId = id;
mState = state;
mDisconnectCause = disconnectCause;
@@ -120,6 +123,7 @@ public final class ParcelableCall implements Parcelable {
mExtras = extras;
mCreationTimeMillis = creationTimeMillis;
mCallIdentification = callIdentification;
+ mCallDirection = callDirection;
}
/** The unique ID of the call. */
@@ -318,6 +322,13 @@ public final class ParcelableCall implements Parcelable {
return mCallIdentification;
}
+ /**
+ * Indicates whether the call is an incoming or outgoing call.
+ */
+ public @CallDirection int getCallDirection() {
+ return mCallDirection;
+ }
+
/** Responsible for creating ParcelableCall objects for deserialized Parcels. */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public static final Parcelable.Creator<ParcelableCall> CREATOR =
@@ -356,6 +367,7 @@ public final class ParcelableCall implements Parcelable {
ParcelableRttCall rttCall = source.readParcelable(classLoader);
long creationTimeMillis = source.readLong();
CallIdentification callIdentification = source.readParcelable(classLoader);
+ int callDirection = source.readInt();
return new ParcelableCall(
id,
state,
@@ -383,7 +395,8 @@ public final class ParcelableCall implements Parcelable {
intentExtras,
extras,
creationTimeMillis,
- callIdentification);
+ callIdentification,
+ callDirection);
}
@Override
@@ -429,6 +442,7 @@ public final class ParcelableCall implements Parcelable {
destination.writeParcelable(mRttCall, 0);
destination.writeLong(mCreationTimeMillis);
destination.writeParcelable(mCallIdentification, 0);
+ destination.writeInt(mCallDirection);
}
@Override
diff --git a/telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl b/telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl
index 46bf983f52a2..0a42a3f4f02e 100644
--- a/telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl
@@ -31,5 +31,6 @@ oneway interface ICallRedirectionAdapter {
void placeCallUnmodified();
- void redirectCall(in Uri handle, in PhoneAccountHandle targetPhoneAccount);
+ void redirectCall(in Uri handle, in PhoneAccountHandle targetPhoneAccount,
+ boolean confirmFirst);
}
diff --git a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
index d8d360beb64d..c1bc44007b0b 100644
--- a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
@@ -30,5 +30,5 @@ import com.android.internal.telecom.ICallRedirectionAdapter;
*/
oneway interface ICallRedirectionService {
void placeCall(in ICallRedirectionAdapter adapter, in Uri handle,
- in PhoneAccountHandle targetPhoneAccount);
+ in PhoneAccountHandle initialPhoneAccount, boolean allowInteractiveResponse);
}
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index 964d3f488a28..76a759f2dd7d 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -2068,6 +2068,12 @@ public final class Telephony {
/**
* Helper functions for the "threads" table used by MMS and SMS.
+ *
+ * Thread IDs are determined by the participants in a conversation and can be used to match
+ * both SMS and MMS messages.
+ *
+ * To avoid issues where applications might cache a thread ID, the thread ID of a deleted thread
+ * must not be reused to point at a new thread.
*/
public static final class Threads implements ThreadsColumns {
@@ -2121,14 +2127,10 @@ public final class Telephony {
}
/**
- * Given the recipients list and subject of an unsaved message,
- * return its thread ID. If the message starts a new thread,
- * allocate a new thread ID. Otherwise, use the appropriate
- * existing thread ID.
- *
- * <p>Find the thread ID of the same set of recipients (in any order,
- * without any additions). If one is found, return it. Otherwise,
- * return a unique thread ID.</p>
+ * Given a set of recipients return its thread ID.
+ * <p>
+ * If a thread exists containing the provided participants, return its thread ID. Otherwise,
+ * this will create a new thread containing the provided participants and return its ID.
*/
public static long getOrCreateThreadId(
Context context, Set<String> recipients) {
diff --git a/telephony/java/android/telephony/AvailableNetworkInfo.java b/telephony/java/android/telephony/AvailableNetworkInfo.java
index fe07370394ad..4da79b34a55e 100644
--- a/telephony/java/android/telephony/AvailableNetworkInfo.java
+++ b/telephony/java/android/telephony/AvailableNetworkInfo.java
@@ -110,6 +110,7 @@ public final class AvailableNetworkInfo implements Parcelable {
private AvailableNetworkInfo(Parcel in) {
mSubId = in.readInt();
mPriority = in.readInt();
+ mMccMncs = new ArrayList<>();
in.readStringList(mMccMncs);
}
diff --git a/telephony/java/android/telephony/CallAttributes.aidl b/telephony/java/android/telephony/CallAttributes.aidl
new file mode 100644
index 000000000000..69127df19714
--- /dev/null
+++ b/telephony/java/android/telephony/CallAttributes.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+parcelable CallAttributes;
+
diff --git a/telephony/java/android/telephony/CallAttributes.java b/telephony/java/android/telephony/CallAttributes.java
new file mode 100644
index 000000000000..2b99ce1d8252
--- /dev/null
+++ b/telephony/java/android/telephony/CallAttributes.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.telephony.TelephonyManager.NetworkType;
+
+import java.util.Objects;
+
+/**
+ * Contains information about a call's attributes as passed up from the HAL. If there are multiple
+ * ongoing calls, the CallAttributes will pertain to the call in the foreground.
+ * @hide
+ */
+@SystemApi
+public class CallAttributes implements Parcelable {
+ private PreciseCallState mPreciseCallState;
+ @NetworkType
+ private int mNetworkType; // TelephonyManager.NETWORK_TYPE_* ints
+ private CallQuality mCallQuality;
+
+
+ public CallAttributes(PreciseCallState state, @NetworkType int networkType,
+ CallQuality callQuality) {
+ this.mPreciseCallState = state;
+ this.mNetworkType = networkType;
+ this.mCallQuality = callQuality;
+ }
+
+ @Override
+ public String toString() {
+ return "mPreciseCallState=" + mPreciseCallState + " mNetworkType=" + mNetworkType
+ + " mCallQuality=" + mCallQuality;
+ }
+
+ private CallAttributes(Parcel in) {
+ mPreciseCallState = (PreciseCallState) in.readValue(mPreciseCallState.getClass()
+ .getClassLoader());
+ mNetworkType = in.readInt();
+ mCallQuality = (CallQuality) in.readValue(mCallQuality.getClass().getClassLoader());
+ }
+
+ // getters
+ /**
+ * Returns the {@link PreciseCallState} of the call.
+ */
+ public PreciseCallState getPreciseCallState() {
+ return mPreciseCallState;
+ }
+
+ /**
+ * Returns the {@link TelephonyManager#NetworkType} of the call.
+ *
+ * @see TelephonyManager#NETWORK_TYPE_UNKNOWN
+ * @see TelephonyManager#NETWORK_TYPE_GPRS
+ * @see TelephonyManager#NETWORK_TYPE_EDGE
+ * @see TelephonyManager#NETWORK_TYPE_UMTS
+ * @see TelephonyManager#NETWORK_TYPE_CDMA
+ * @see TelephonyManager#NETWORK_TYPE_EVDO_0
+ * @see TelephonyManager#NETWORK_TYPE_EVDO_A
+ * @see TelephonyManager#NETWORK_TYPE_1xRTT
+ * @see TelephonyManager#NETWORK_TYPE_HSDPA
+ * @see TelephonyManager#NETWORK_TYPE_HSUPA
+ * @see TelephonyManager#NETWORK_TYPE_HSPA
+ * @see TelephonyManager#NETWORK_TYPE_IDEN
+ * @see TelephonyManager#NETWORK_TYPE_EVDO_B
+ * @see TelephonyManager#NETWORK_TYPE_LTE
+ * @see TelephonyManager#NETWORK_TYPE_EHRPD
+ * @see TelephonyManager#NETWORK_TYPE_HSPAP
+ * @see TelephonyManager#NETWORK_TYPE_GSM
+ * @see TelephonyManager#NETWORK_TYPE_TD_SCDMA
+ * @see TelephonyManager#NETWORK_TYPE_IWLAN
+ * @see TelephonyManager#NETWORK_TYPE_LTE_CA
+ * @see TelephonyManager#NETWORK_TYPE_NR
+ */
+ @NetworkType
+ public int getNetworkType() {
+ return mNetworkType;
+ }
+
+ /**
+ * Returns the {#link CallQuality} of the call.
+ */
+ public CallQuality getCallQuality() {
+ return mCallQuality;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mPreciseCallState, mNetworkType, mCallQuality);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || !(o instanceof CallAttributes) || hashCode() != o.hashCode()) {
+ return false;
+ }
+
+ if (this == o) {
+ return true;
+ }
+
+ CallAttributes s = (CallAttributes) o;
+
+ return (mPreciseCallState == s.mPreciseCallState
+ && mNetworkType == s.mNetworkType
+ && mCallQuality == s.mCallQuality);
+ }
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ public @Parcelable.ContentsFlags int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@link Parcelable#writeToParcel}
+ */
+ public void writeToParcel(Parcel dest, @Parcelable.WriteFlags int flags) {
+ mPreciseCallState.writeToParcel(dest, flags);
+ dest.writeInt(mNetworkType);
+ mCallQuality.writeToParcel(dest, flags);
+ }
+
+ public static final Parcelable.Creator<CallAttributes> CREATOR = new Parcelable.Creator() {
+ public CallAttributes createFromParcel(Parcel in) {
+ return new CallAttributes(in);
+ }
+
+ public CallAttributes[] newArray(int size) {
+ return new CallAttributes[size];
+ }
+ };
+}
diff --git a/telephony/java/android/telephony/CallQuality.aidl b/telephony/java/android/telephony/CallQuality.aidl
new file mode 100644
index 000000000000..f54355f48ad5
--- /dev/null
+++ b/telephony/java/android/telephony/CallQuality.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+parcelable CallQuality;
+
diff --git a/telephony/java/android/telephony/CallQuality.java b/telephony/java/android/telephony/CallQuality.java
new file mode 100644
index 000000000000..b27f6b44370f
--- /dev/null
+++ b/telephony/java/android/telephony/CallQuality.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Parcelable object to handle call quality.
+ * <p>
+ * Currently this supports IMS calls.
+ * <p>
+ * It provides the call quality level, duration, and additional information related to RTP packets,
+ * jitter and delay.
+ * <p>
+ * If there are multiple active calls, the CallQuality will pertain to the call in the foreground.
+ *
+ * @hide
+ */
+@SystemApi
+public final class CallQuality implements Parcelable {
+
+ // Constants representing the call quality level (see #CallQuality);
+ public static final int CALL_QUALITY_EXCELLENT = 0;
+ public static final int CALL_QUALITY_GOOD = 1;
+ public static final int CALL_QUALITY_FAIR = 2;
+ public static final int CALL_QUALITY_POOR = 3;
+ public static final int CALL_QUALITY_BAD = 4;
+ public static final int CALL_QUALITY_NOT_AVAILABLE = 5;
+
+ /**
+ * Call quality
+ * @hide
+ */
+ @IntDef(prefix = { "CALL_QUALITY_" }, value = {
+ CALL_QUALITY_EXCELLENT,
+ CALL_QUALITY_GOOD,
+ CALL_QUALITY_FAIR,
+ CALL_QUALITY_POOR,
+ CALL_QUALITY_BAD,
+ CALL_QUALITY_NOT_AVAILABLE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CallQualityLevel {}
+
+ @CallQualityLevel
+ private int mDownlinkCallQualityLevel;
+ @CallQualityLevel
+ private int mUplinkCallQualityLevel;
+ private int mCallDuration;
+ private int mNumRtpPacketsTransmitted;
+ private int mNumRtpPacketsReceived;
+ private int mNumRtpPacketsTransmittedLost;
+ private int mNumRtpPacketsNotReceived;
+ private int mAverageRelativeJitter;
+ private int mMaxRelativeJitter;
+ private int mAverageRoundTripTime;
+ private int mCodecType;
+
+ /** @hide **/
+ public CallQuality(Parcel in) {
+ mDownlinkCallQualityLevel = in.readInt();
+ mUplinkCallQualityLevel = in.readInt();
+ mCallDuration = in.readInt();
+ mNumRtpPacketsTransmitted = in.readInt();
+ mNumRtpPacketsReceived = in.readInt();
+ mNumRtpPacketsTransmittedLost = in.readInt();
+ mNumRtpPacketsNotReceived = in.readInt();
+ mAverageRelativeJitter = in.readInt();
+ mMaxRelativeJitter = in.readInt();
+ mAverageRoundTripTime = in.readInt();
+ mCodecType = in.readInt();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param callQualityLevel the call quality level (see #CallQualityLevel)
+ * @param callDuration the call duration in milliseconds
+ * @param numRtpPacketsTransmitted RTP packets sent to network
+ * @param numRtpPacketsReceived RTP packets received from network
+ * @param numRtpPacketsTransmittedLost RTP packets which were lost in network and never
+ * transmitted
+ * @param numRtpPacketsNotReceived RTP packets which were lost in network and never recieved
+ * @param averageRelativeJitter average relative jitter in milliseconds
+ * @param maxRelativeJitter maximum relative jitter in milliseconds
+ * @param averageRoundTripTime average round trip delay in milliseconds
+ * @param codecType the codec type
+ */
+ public CallQuality(
+ @CallQualityLevel int downlinkCallQualityLevel,
+ @CallQualityLevel int uplinkCallQualityLevel,
+ int callDuration,
+ int numRtpPacketsTransmitted,
+ int numRtpPacketsReceived,
+ int numRtpPacketsTransmittedLost,
+ int numRtpPacketsNotReceived,
+ int averageRelativeJitter,
+ int maxRelativeJitter,
+ int averageRoundTripTime,
+ int codecType) {
+ this.mDownlinkCallQualityLevel = downlinkCallQualityLevel;
+ this.mUplinkCallQualityLevel = uplinkCallQualityLevel;
+ this.mCallDuration = callDuration;
+ this.mNumRtpPacketsTransmitted = numRtpPacketsTransmitted;
+ this.mNumRtpPacketsReceived = numRtpPacketsReceived;
+ this.mNumRtpPacketsTransmittedLost = numRtpPacketsTransmittedLost;
+ this.mNumRtpPacketsNotReceived = numRtpPacketsNotReceived;
+ this.mAverageRelativeJitter = averageRelativeJitter;
+ this.mMaxRelativeJitter = maxRelativeJitter;
+ this.mAverageRoundTripTime = averageRoundTripTime;
+ this.mCodecType = codecType;
+ }
+
+ // getters
+ /**
+ * Returns the downlink CallQualityLevel for a given ongoing call.
+ */
+ @CallQualityLevel
+ public int getDownlinkCallQualityLevel() {
+ return mDownlinkCallQualityLevel;
+ }
+
+ /**
+ * Returns the uplink CallQualityLevel for a given ongoing call.
+ */
+ @CallQualityLevel
+ public int getUplinkCallQualityLevel() {
+ return mUplinkCallQualityLevel;
+ }
+
+ /**
+ * Returns the duration of the call, in milliseconds.
+ */
+ public int getCallDuration() {
+ return mCallDuration;
+ }
+
+ /**
+ * Returns the total number of RTP packets transmitted by this device for a given ongoing call.
+ */
+ public int getNumRtpPacketsTransmitted() {
+ return mNumRtpPacketsTransmitted;
+ }
+
+ /**
+ * Returns the total number of RTP packets received by this device for a given ongoing call.
+ */
+ public int getNumRtpPacketsReceived() {
+ return mNumRtpPacketsReceived;
+ }
+
+ /**
+ * Returns the number of RTP packets which were sent by this device but were lost in the
+ * network before reaching the other party.
+ */
+ public int getNumRtpPacketsTransmittedLost() {
+ return mNumRtpPacketsTransmittedLost;
+ }
+
+ /**
+ * Returns the number of RTP packets which were sent by the other party but were lost in the
+ * network before reaching this device.
+ */
+ public int getNumRtpPacketsNotReceived() {
+ return mNumRtpPacketsNotReceived;
+ }
+
+ /**
+ * Returns the average relative jitter in milliseconds. Jitter represents the amount of variance
+ * in interarrival time of packets, for example, if two packets are sent 2 milliseconds apart
+ * but received 3 milliseconds apart, the relative jitter between those packets is 1
+ * millisecond.
+ *
+ * <p>See RFC 3550 for more information on jitter calculations.
+ */
+ public int getAverageRelativeJitter() {
+ return mAverageRelativeJitter;
+ }
+
+ /**
+ * Returns the maximum relative jitter for a given ongoing call. Jitter represents the amount of
+ * variance in interarrival time of packets, for example, if two packets are sent 2 milliseconds
+ * apart but received 3 milliseconds apart, the relative jitter between those packets is 1
+ * millisecond.
+ *
+ * <p>See RFC 3550 for more information on jitter calculations.
+ */
+ public int getMaxRelativeJitter() {
+ return mMaxRelativeJitter;
+ }
+
+ /**
+ * Returns the average round trip time in milliseconds.
+ */
+ public int getAverageRoundTripTime() {
+ return mAverageRoundTripTime;
+ }
+
+ /**
+ * Returns the codec type. This value corresponds to the AUDIO_QUALITY_* constants in
+ * {@link ImsStreamMediaProfile}.
+ *
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_NONE
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_AMR
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_AMR_WB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_QCELP13K
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_B
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_WB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_NW
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_EFR
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_FR
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_HR
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711U
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G723
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711A
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G722
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711AB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_G729
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_NB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_WB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_SWB
+ * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_FB
+ */
+ public int getCodecType() {
+ return mCodecType;
+ }
+
+ // Parcelable things
+ @Override
+ public String toString() {
+ return "CallQuality: {downlinkCallQualityLevel=" + mDownlinkCallQualityLevel
+ + " uplinkCallQualityLevel=" + mUplinkCallQualityLevel
+ + " callDuration=" + mCallDuration
+ + " numRtpPacketsTransmitted=" + mNumRtpPacketsTransmitted
+ + " numRtpPacketsReceived=" + mNumRtpPacketsReceived
+ + " numRtpPacketsTransmittedLost=" + mNumRtpPacketsTransmittedLost
+ + " numRtpPacketsNotReceived=" + mNumRtpPacketsNotReceived
+ + " averageRelativeJitter=" + mAverageRelativeJitter
+ + " maxRelativeJitter=" + mMaxRelativeJitter
+ + " averageRoundTripTime=" + mAverageRoundTripTime
+ + " codecType=" + mCodecType
+ + "}";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ mDownlinkCallQualityLevel,
+ mUplinkCallQualityLevel,
+ mCallDuration,
+ mNumRtpPacketsTransmitted,
+ mNumRtpPacketsReceived,
+ mNumRtpPacketsTransmittedLost,
+ mNumRtpPacketsNotReceived,
+ mAverageRelativeJitter,
+ mMaxRelativeJitter,
+ mAverageRoundTripTime,
+ mCodecType);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || !(o instanceof CallQuality) || hashCode() != o.hashCode()) {
+ return false;
+ }
+
+ if (this == o) {
+ return true;
+ }
+
+ CallQuality s = (CallQuality) o;
+
+ return (mDownlinkCallQualityLevel == s.mDownlinkCallQualityLevel
+ && mUplinkCallQualityLevel == s.mUplinkCallQualityLevel
+ && mCallDuration == s.mCallDuration
+ && mNumRtpPacketsTransmitted == s.mNumRtpPacketsTransmitted
+ && mNumRtpPacketsReceived == s.mNumRtpPacketsReceived
+ && mNumRtpPacketsTransmittedLost == s.mNumRtpPacketsTransmittedLost
+ && mNumRtpPacketsNotReceived == s.mNumRtpPacketsNotReceived
+ && mAverageRelativeJitter == s.mAverageRelativeJitter
+ && mMaxRelativeJitter == s.mMaxRelativeJitter
+ && mAverageRoundTripTime == s.mAverageRoundTripTime
+ && mCodecType == s.mCodecType);
+ }
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ public @Parcelable.ContentsFlags int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@link Parcelable#writeToParcel}
+ */
+ public void writeToParcel(Parcel dest, @Parcelable.WriteFlags int flags) {
+ dest.writeInt(mDownlinkCallQualityLevel);
+ dest.writeInt(mUplinkCallQualityLevel);
+ dest.writeInt(mCallDuration);
+ dest.writeInt(mNumRtpPacketsTransmitted);
+ dest.writeInt(mNumRtpPacketsReceived);
+ dest.writeInt(mNumRtpPacketsTransmittedLost);
+ dest.writeInt(mNumRtpPacketsNotReceived);
+ dest.writeInt(mAverageRelativeJitter);
+ dest.writeInt(mMaxRelativeJitter);
+ dest.writeInt(mAverageRoundTripTime);
+ dest.writeInt(mCodecType);
+ }
+
+ public static final Parcelable.Creator<CallQuality> CREATOR = new Parcelable.Creator() {
+ public CallQuality createFromParcel(Parcel in) {
+ return new CallQuality(in);
+ }
+
+ public CallQuality[] newArray(int size) {
+ return new CallQuality[size];
+ }
+ };
+}
diff --git a/telephony/java/android/telephony/CarrierRestrictionRules.aidl b/telephony/java/android/telephony/CarrierRestrictionRules.aidl
new file mode 100644
index 000000000000..8b1f0b918901
--- /dev/null
+++ b/telephony/java/android/telephony/CarrierRestrictionRules.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018 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.
+ */
+
+/** @hide */
+package android.telephony;
+
+parcelable CarrierRestrictionRules;
diff --git a/telephony/java/android/telephony/CarrierRestrictionRules.java b/telephony/java/android/telephony/CarrierRestrictionRules.java
new file mode 100644
index 000000000000..37847aef9167
--- /dev/null
+++ b/telephony/java/android/telephony/CarrierRestrictionRules.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.service.carrier.CarrierIdentifier;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains the list of carrier restrictions.
+ * Allowed list: it indicates the list of carriers that are allowed.
+ * Excluded list: it indicates the list of carriers that are excluded.
+ * Default carrier restriction: it indicates the default behavior and the priority between the two
+ * lists:
+ * - not allowed: the device only allows usage of carriers that are present in the allowed list
+ * and not present in the excluded list. This implies that if a carrier is not present in either
+ * list, it is not allowed.
+ * - allowed: the device allows all carriers, except those present in the excluded list and not
+ * present in the allowed list. This implies that if a carrier is not present in either list,
+ * it is allowed.
+ * MultiSim policy: it indicates the behavior in case of devices with two or more SIM cards.
+ * - MULTISIM_POLICY_NONE: the same configuration is applied to all SIM slots independently. This
+ * is the default value if none is set.
+ * - MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT: it indicates that any SIM card can be used
+ * as far as one SIM card matching the configuration is present in the device.
+ *
+ * Both lists support the character '?' as wild character. For example, an entry indicating
+ * MCC=310 and MNC=??? will match all networks with MCC=310.
+ *
+ * Example 1: Allowed list contains MCC and MNC of operator A. Excluded list contains operator B,
+ * which has same MCC and MNC, but also GID1 value. The priority allowed list is set
+ * to true. Only SIM cards of operator A are allowed, but not those of B or any other
+ * operator.
+ * Example 2: Allowed list contains MCC and MNC of operator A. Excluded list contains an entry
+ * with same MCC, and '???' as MNC. The priority allowed list is set to false.
+ * SIM cards of operator A and all SIM cards with a different MCC value are allowed.
+ * SIM cards of operators with same MCC value and different MNC are not allowed.
+ * @hide
+ */
+@SystemApi
+public final class CarrierRestrictionRules implements Parcelable {
+ /**
+ * The device only allows usage of carriers that are present in the allowed list and not
+ * present in the excluded list. This implies that if a carrier is not present in either list,
+ * it is not allowed.
+ */
+ public static final int CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED = 0;
+
+ /**
+ * The device allows all carriers, except those present in the excluded list and not present
+ * in the allowed list. This implies that if a carrier is not present in either list, it is
+ * allowed.
+ */
+ public static final int CARRIER_RESTRICTION_DEFAULT_ALLOWED = 1;
+
+ /** The same configuration is applied to all SIM slots independently. */
+ public static final int MULTISIM_POLICY_NONE = 0;
+
+ /** Any SIM card can be used as far as one SIM card matching the configuration is present. */
+ public static final int MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT = 1;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = "MULTISIM_POLICY_",
+ value = {MULTISIM_POLICY_NONE, MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT})
+ public @interface MultiSimPolicy {}
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = "CARRIER_RESTRICTION_DEFAULT_",
+ value = {CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED, CARRIER_RESTRICTION_DEFAULT_ALLOWED})
+ public @interface CarrierRestrictionDefault {}
+
+ private List<CarrierIdentifier> mAllowedCarriers;
+ private List<CarrierIdentifier> mExcludedCarriers;
+ @CarrierRestrictionDefault
+ private int mCarrierRestrictionDefault;
+ @MultiSimPolicy
+ private int mMultiSimPolicy;
+
+ private CarrierRestrictionRules() {
+ mAllowedCarriers = new ArrayList<CarrierIdentifier>();
+ mExcludedCarriers = new ArrayList<CarrierIdentifier>();
+ mCarrierRestrictionDefault = CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED;
+ mMultiSimPolicy = MULTISIM_POLICY_NONE;
+ }
+
+ private CarrierRestrictionRules(Parcel in) {
+ mAllowedCarriers = new ArrayList<CarrierIdentifier>();
+ mExcludedCarriers = new ArrayList<CarrierIdentifier>();
+
+ in.readTypedList(mAllowedCarriers, CarrierIdentifier.CREATOR);
+ in.readTypedList(mExcludedCarriers, CarrierIdentifier.CREATOR);
+ mCarrierRestrictionDefault = in.readInt();
+ mMultiSimPolicy = in.readInt();
+ }
+
+ /**
+ * Creates a new builder for this class
+ * @hide
+ */
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ /**
+ * Indicates if all carriers are allowed
+ */
+ public boolean isAllCarriersAllowed() {
+ return (mAllowedCarriers.isEmpty() && mExcludedCarriers.isEmpty()
+ && mCarrierRestrictionDefault == CARRIER_RESTRICTION_DEFAULT_ALLOWED);
+ }
+
+ /**
+ * Retrieves list of allowed carriers
+ *
+ * @return the list of allowed carriers
+ */
+ public @NonNull List<CarrierIdentifier> getAllowedCarriers() {
+ return mAllowedCarriers;
+ }
+
+ /**
+ * Retrieves list of excluded carriers
+ *
+ * @return the list of excluded carriers
+ */
+ public @NonNull List<CarrierIdentifier> getExcludedCarriers() {
+ return mExcludedCarriers;
+ }
+
+ /**
+ * Retrieves the default behavior of carrier restrictions
+ */
+ public @CarrierRestrictionDefault int getDefaultCarrierRestriction() {
+ return mCarrierRestrictionDefault;
+ }
+
+ /**
+ * @return The policy used for multi-SIM devices
+ */
+ public @MultiSimPolicy int getMultiSimPolicy() {
+ return mMultiSimPolicy;
+ }
+
+ /**
+ * {@link Parcelable#writeToParcel}
+ */
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeTypedList(mAllowedCarriers);
+ out.writeTypedList(mExcludedCarriers);
+ out.writeInt(mCarrierRestrictionDefault);
+ out.writeInt(mMultiSimPolicy);
+ }
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@link Parcelable.Creator}
+ */
+ public static final Creator<CarrierRestrictionRules> CREATOR =
+ new Creator<CarrierRestrictionRules>() {
+ @Override
+ public CarrierRestrictionRules createFromParcel(Parcel in) {
+ return new CarrierRestrictionRules(in);
+ }
+
+ @Override
+ public CarrierRestrictionRules[] newArray(int size) {
+ return new CarrierRestrictionRules[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return "CarrierRestrictionRules(allowed:" + mAllowedCarriers + ", excluded:"
+ + mExcludedCarriers + ", default:" + mCarrierRestrictionDefault
+ + ", multisim policy:" + mMultiSimPolicy + ")";
+ }
+
+ /**
+ * Builder for a {@link CarrierRestrictionRules}.
+ */
+ public static class Builder {
+ private final CarrierRestrictionRules mRules;
+
+ /** {@hide} */
+ public Builder() {
+ mRules = new CarrierRestrictionRules();
+ }
+
+ /** build command */
+ public CarrierRestrictionRules build() {
+ return mRules;
+ }
+
+ /**
+ * Indicate that all carriers are allowed.
+ */
+ public Builder setAllCarriersAllowed() {
+ mRules.mAllowedCarriers.clear();
+ mRules.mExcludedCarriers.clear();
+ mRules.mCarrierRestrictionDefault = CARRIER_RESTRICTION_DEFAULT_ALLOWED;
+ return this;
+ }
+
+ /**
+ * Set list of allowed carriers.
+ *
+ * @param allowedCarriers list of allowed carriers
+ */
+ public Builder setAllowedCarriers(List<CarrierIdentifier> allowedCarriers) {
+ mRules.mAllowedCarriers = new ArrayList<CarrierIdentifier>(allowedCarriers);
+ return this;
+ }
+
+ /**
+ * Set list of excluded carriers.
+ *
+ * @param excludedCarriers list of excluded carriers
+ */
+ public Builder setExcludedCarriers(List<CarrierIdentifier> excludedCarriers) {
+ mRules.mExcludedCarriers = new ArrayList<CarrierIdentifier>(excludedCarriers);
+ return this;
+ }
+
+ /**
+ * Set the default behavior of the carrier restrictions
+ *
+ * @param carrierRestrictionDefault prioritized carrier list
+ */
+ public Builder setDefaultCarrierRestriction(
+ @CarrierRestrictionDefault int carrierRestrictionDefault) {
+ mRules.mCarrierRestrictionDefault = carrierRestrictionDefault;
+ return this;
+ }
+
+ /**
+ * Set the policy to be used for multi-SIM devices
+ *
+ * @param multiSimPolicy multi SIM policy
+ */
+ public Builder setMultiSimPolicy(@MultiSimPolicy int multiSimPolicy) {
+ mRules.mMultiSimPolicy = multiSimPolicy;
+ return this;
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/CellConfigLte.java b/telephony/java/android/telephony/CellConfigLte.java
index 35769f04c5ae..eafbfbc5076d 100644
--- a/telephony/java/android/telephony/CellConfigLte.java
+++ b/telephony/java/android/telephony/CellConfigLte.java
@@ -34,6 +34,11 @@ public class CellConfigLte implements Parcelable {
}
/** @hide */
+ public CellConfigLte(android.hardware.radio.V1_4.CellConfigLte cellConfig) {
+ mIsEndcAvailable = cellConfig.isEndcAvailable;
+ }
+
+ /** @hide */
public CellConfigLte(boolean isEndcAvailable) {
mIsEndcAvailable = isEndcAvailable;
}
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index b761bd7bf70c..8ce5c54c810e 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -19,8 +19,10 @@ package android.telephony;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
+import android.hardware.radio.V1_4.CellInfo.Info;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.SystemClock;
import com.android.internal.annotations.VisibleForTesting;
@@ -318,6 +320,13 @@ public abstract class CellInfo implements Parcelable {
}
/** @hide */
+ protected CellInfo(android.hardware.radio.V1_4.CellInfo ci) {
+ this.mRegistered = ci.isRegistered;
+ this.mTimeStamp = SystemClock.elapsedRealtimeNanos();
+ this.mCellConnectionStatus = ci.connectionStatus;
+ }
+
+ /** @hide */
public static CellInfo create(android.hardware.radio.V1_0.CellInfo ci) {
if (ci == null) return null;
switch(ci.cellInfoType) {
@@ -342,4 +351,17 @@ public abstract class CellInfo implements Parcelable {
default: return null;
}
}
+
+ /** @hide */
+ public static CellInfo create(android.hardware.radio.V1_4.CellInfo ci) {
+ if (ci == null) return null;
+ switch (ci.info.getDiscriminator()) {
+ case Info.hidl_discriminator.gsm: return new CellInfoGsm(ci);
+ case Info.hidl_discriminator.cdma: return new CellInfoCdma(ci);
+ case Info.hidl_discriminator.lte: return new CellInfoLte(ci);
+ case Info.hidl_discriminator.wcdma: return new CellInfoWcdma(ci);
+ case Info.hidl_discriminator.tdscdma: return new CellInfoTdscdma(ci);
+ default: return null;
+ }
+ }
}
diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java
index c9f07dab6bbd..4440108879f2 100644
--- a/telephony/java/android/telephony/CellInfoCdma.java
+++ b/telephony/java/android/telephony/CellInfoCdma.java
@@ -67,6 +67,15 @@ public final class CellInfoCdma extends CellInfo implements Parcelable {
new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo);
}
+ /** @hide */
+ public CellInfoCdma(android.hardware.radio.V1_4.CellInfo ci) {
+ super(ci);
+ final android.hardware.radio.V1_2.CellInfoCdma cic = ci.info.cdma();
+ mCellIdentityCdma = new CellIdentityCdma(cic.cellIdentityCdma);
+ mCellSignalStrengthCdma =
+ new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo);
+ }
+
@Override
public CellIdentityCdma getCellIdentity() {
return mCellIdentityCdma;
diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java
index ad16dfae7295..248adfcb2d90 100644
--- a/telephony/java/android/telephony/CellInfoGsm.java
+++ b/telephony/java/android/telephony/CellInfoGsm.java
@@ -63,6 +63,14 @@ public final class CellInfoGsm extends CellInfo implements Parcelable {
mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm);
}
+ /** @hide */
+ public CellInfoGsm(android.hardware.radio.V1_4.CellInfo ci) {
+ super(ci);
+ final android.hardware.radio.V1_2.CellInfoGsm cig = ci.info.gsm();
+ mCellIdentityGsm = new CellIdentityGsm(cig.cellIdentityGsm);
+ mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm);
+ }
+
@Override
public CellIdentityGsm getCellIdentity() {
return mCellIdentityGsm;
diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java
index 75938317bf44..8e8ce8a1f5de 100644
--- a/telephony/java/android/telephony/CellInfoLte.java
+++ b/telephony/java/android/telephony/CellInfoLte.java
@@ -70,6 +70,15 @@ public final class CellInfoLte extends CellInfo implements Parcelable {
mCellConfig = new CellConfigLte();
}
+ /** @hide */
+ public CellInfoLte(android.hardware.radio.V1_4.CellInfo ci) {
+ super(ci);
+ final android.hardware.radio.V1_4.CellInfoLte cil = ci.info.lte();
+ mCellIdentityLte = new CellIdentityLte(cil.base.cellIdentityLte);
+ mCellSignalStrengthLte = new CellSignalStrengthLte(cil.base.signalStrengthLte);
+ mCellConfig = new CellConfigLte(cil.cellConfig);
+ }
+
@Override
public CellIdentityLte getCellIdentity() {
if (DBG) log("getCellIdentity: " + mCellIdentityLte);
diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java
index a8c49b7bf68e..2ab38fb77a90 100644
--- a/telephony/java/android/telephony/CellInfoTdscdma.java
+++ b/telephony/java/android/telephony/CellInfoTdscdma.java
@@ -64,6 +64,14 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable {
mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma);
}
+ /** @hide */
+ public CellInfoTdscdma(android.hardware.radio.V1_4.CellInfo ci) {
+ super(ci);
+ final android.hardware.radio.V1_2.CellInfoTdscdma cit = ci.info.tdscdma();
+ mCellIdentityTdscdma = new CellIdentityTdscdma(cit.cellIdentityTdscdma);
+ mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma);
+ }
+
@Override public CellIdentityTdscdma getCellIdentity() {
return mCellIdentityTdscdma;
}
diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java
index a427e80fd65c..65e047077639 100644
--- a/telephony/java/android/telephony/CellInfoWcdma.java
+++ b/telephony/java/android/telephony/CellInfoWcdma.java
@@ -63,6 +63,14 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable {
mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma);
}
+ /** @hide */
+ public CellInfoWcdma(android.hardware.radio.V1_4.CellInfo ci) {
+ super(ci);
+ final android.hardware.radio.V1_2.CellInfoWcdma ciw = ci.info.wcdma();
+ mCellIdentityWcdma = new CellIdentityWcdma(ciw.cellIdentityWcdma);
+ mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma);
+ }
+
@Override
public CellIdentityWcdma getCellIdentity() {
return mCellIdentityWcdma;
diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java
index 893dbe31ce0b..61c6b48976c5 100644
--- a/telephony/java/android/telephony/CellSignalStrengthLte.java
+++ b/telephony/java/android/telephony/CellSignalStrengthLte.java
@@ -30,7 +30,7 @@ import java.util.Objects;
public final class CellSignalStrengthLte extends CellSignalStrength implements Parcelable {
private static final String LOG_TAG = "CellSignalStrengthLte";
- private static final boolean DBG = true;
+ private static final boolean DBG = false;
/**
* Indicates the unknown or undetectable RSSI value in ASU.
diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java
index c53b37d8ae6a..26ec6ded8224 100644
--- a/telephony/java/android/telephony/DataFailCause.java
+++ b/telephony/java/android/telephony/DataFailCause.java
@@ -17,6 +17,7 @@ package android.telephony;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.content.Context;
import android.os.PersistableBundle;
@@ -34,6 +35,7 @@ import java.util.Set;
* Returned as the reason for a data connection failure as defined by modem and some local errors.
* @hide
*/
+@SystemApi
public final class DataFailCause {
/** There is no failure */
public static final int NONE = 0;
@@ -101,8 +103,8 @@ public final class DataFailCause {
public static final int PDN_CONN_DOES_NOT_EXIST = 0x36;
/** Multiple connections to a same PDN is not allowed. */
public static final int MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 0x37;
- /** Packet Data Protocol (PDP) */
- public static final int MAX_ACTIVE_PDP_CONTEXT_REACHED = 0x41;
+ /** Max number of Packet Data Protocol (PDP) context reached. */
+ public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 0x41;
/** Unsupported APN in current public land mobile network (PLMN). */
public static final int UNSUPPORTED_APN_IN_CURRENT_PLMN = 0x42;
/** Invalid transaction id. */
@@ -165,22 +167,36 @@ public final class DataFailCause {
// Local errors generated by Vendor RIL
// specified in ril.h
+ /** Data fail due to registration failure. */
public static final int REGISTRATION_FAIL = -1;
+ /** Data fail due to GPRS registration failure. */
public static final int GPRS_REGISTRATION_FAIL = -2;
+ /** Data call drop due to network/modem disconnect. */
public static final int SIGNAL_LOST = -3; /* no retry */
+ /**
+ * Preferred technology has changed, must retry with parameters appropriate for new technology.
+ */
public static final int PREF_RADIO_TECH_CHANGED = -4;
+ /** data call was disconnected because radio was resetting, powered off. */
public static final int RADIO_POWER_OFF = -5; /* no retry */
+ /** Data call was disconnected by modem because tethered. */
public static final int TETHERED_CALL_ACTIVE = -6; /* no retry */
+ /** Data call fail due to unspecific errors. */
public static final int ERROR_UNSPECIFIED = 0xFFFF;
// Errors generated by the Framework
// specified here
+ /** Unknown data failure cause. */
public static final int UNKNOWN = 0x10000;
+ /** Data fail due to radio not unavailable. */
public static final int RADIO_NOT_AVAILABLE = 0x10001; /* no retry */
+ /** @hide */
public static final int UNACCEPTABLE_NETWORK_PARAMETER = 0x10002; /* no retry */
+ /** @hide */
public static final int CONNECTION_TO_DATACONNECTIONAC_BROKEN = 0x10003;
+ /** Data connection was lost. */
public static final int LOST_CONNECTION = 0x10004;
- /** Data was reset by framework. */
+ /** @hide */
public static final int RESET_BY_FRAMEWORK = 0x10005;
/** @hide */
@@ -216,7 +232,7 @@ public final class DataFailCause {
ESM_INFO_NOT_RECEIVED,
PDN_CONN_DOES_NOT_EXIST,
MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED,
- MAX_ACTIVE_PDP_CONTEXT_REACHED,
+ ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED,
UNSUPPORTED_APN_IN_CURRENT_PLMN,
INVALID_TRANSACTION_ID,
MESSAGE_INCORRECT_SEMANTIC,
@@ -308,8 +324,8 @@ public final class DataFailCause {
sFailCauseMap.put(PDN_CONN_DOES_NOT_EXIST, "PDN_CONN_DOES_NOT_EXIST");
sFailCauseMap.put(MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED,
"MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED");
- sFailCauseMap.put(MAX_ACTIVE_PDP_CONTEXT_REACHED,
- "MAX_ACTIVE_PDP_CONTEXT_REACHED");
+ sFailCauseMap.put(ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED,
+ "ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED");
sFailCauseMap.put(UNSUPPORTED_APN_IN_CURRENT_PLMN,
"UNSUPPORTED_APN_IN_CURRENT_PLMN");
sFailCauseMap.put(INVALID_TRANSACTION_ID, "INVALID_TRANSACTION_ID");
@@ -369,6 +385,9 @@ public final class DataFailCause {
sFailCauseMap.put(RESET_BY_FRAMEWORK, "RESET_BY_FRAMEWORK");
}
+ private DataFailCause() {
+ }
+
/**
* Map of subId -> set of data call setup permanent failure for the carrier.
*/
@@ -382,6 +401,8 @@ public final class DataFailCause {
* @param cause data disconnect cause
* @param subId subscription index
* @return true if the fail cause code needs platform to trigger a modem restart.
+ *
+ * @hide
*/
public static boolean isRadioRestartFailure(@NonNull Context context, @FailCause int cause,
int subId) {
@@ -410,6 +431,7 @@ public final class DataFailCause {
return false;
}
+ /** @hide */
public static boolean isPermanentFailure(@NonNull Context context, @FailCause int failCause,
int subId) {
synchronized (sPermanentFailureCache) {
@@ -469,6 +491,7 @@ public final class DataFailCause {
}
}
+ /** @hide */
public static boolean isEventLoggable(@FailCause int dataFailCause) {
return (dataFailCause == OPERATOR_BARRED) || (dataFailCause == INSUFFICIENT_RESOURCES)
|| (dataFailCause == UNKNOWN_PDP_ADDRESS_TYPE)
@@ -488,11 +511,13 @@ public final class DataFailCause {
|| (dataFailCause == UNACCEPTABLE_NETWORK_PARAMETER);
}
+ /** @hide */
public static String toString(@FailCause int dataFailCause) {
int cause = getFailCause(dataFailCause);
return (cause == UNKNOWN) ? "UNKNOWN(" + dataFailCause + ")" : sFailCauseMap.get(cause);
}
+ /** @hide */
public static int getFailCause(@FailCause int failCause) {
if (sFailCauseMap.containsKey(failCause)) {
return failCause;
diff --git a/telephony/java/android/telephony/DataSpecificRegistrationStates.java b/telephony/java/android/telephony/DataSpecificRegistrationStates.java
index 5d809d0b7c36..d6a8065feabe 100644
--- a/telephony/java/android/telephony/DataSpecificRegistrationStates.java
+++ b/telephony/java/android/telephony/DataSpecificRegistrationStates.java
@@ -44,13 +44,19 @@ public class DataSpecificRegistrationStates implements Parcelable{
*/
public final boolean isEnDcAvailable;
+ /**
+ * Provides network support info for LTE VoPS and LTE Emergency bearer support
+ */
+ public final LteVopsSupportInfo lteVopsSupportInfo;
+
DataSpecificRegistrationStates(
int maxDataCalls, boolean isDcNrRestricted, boolean isNrAvailable,
- boolean isEnDcAvailable) {
+ boolean isEnDcAvailable, LteVopsSupportInfo lteVops) {
this.maxDataCalls = maxDataCalls;
this.isDcNrRestricted = isDcNrRestricted;
this.isNrAvailable = isNrAvailable;
this.isEnDcAvailable = isEnDcAvailable;
+ this.lteVopsSupportInfo = lteVops;
}
private DataSpecificRegistrationStates(Parcel source) {
@@ -58,6 +64,7 @@ public class DataSpecificRegistrationStates implements Parcelable{
isDcNrRestricted = source.readBoolean();
isNrAvailable = source.readBoolean();
isEnDcAvailable = source.readBoolean();
+ lteVopsSupportInfo = LteVopsSupportInfo.CREATOR.createFromParcel(source);
}
@Override
@@ -66,6 +73,7 @@ public class DataSpecificRegistrationStates implements Parcelable{
dest.writeBoolean(isDcNrRestricted);
dest.writeBoolean(isNrAvailable);
dest.writeBoolean(isEnDcAvailable);
+ lteVopsSupportInfo.writeToParcel(dest, flags);
}
@Override
@@ -81,13 +89,15 @@ public class DataSpecificRegistrationStates implements Parcelable{
.append(" isDcNrRestricted = " + isDcNrRestricted)
.append(" isNrAvailable = " + isNrAvailable)
.append(" isEnDcAvailable = " + isEnDcAvailable)
+ .append(lteVopsSupportInfo.toString())
.append(" }")
.toString();
}
@Override
public int hashCode() {
- return Objects.hash(maxDataCalls, isDcNrRestricted, isNrAvailable, isEnDcAvailable);
+ return Objects.hash(maxDataCalls, isDcNrRestricted, isNrAvailable, isEnDcAvailable,
+ lteVopsSupportInfo);
}
@Override
@@ -100,7 +110,8 @@ public class DataSpecificRegistrationStates implements Parcelable{
return this.maxDataCalls == other.maxDataCalls
&& this.isDcNrRestricted == other.isDcNrRestricted
&& this.isNrAvailable == other.isNrAvailable
- && this.isEnDcAvailable == other.isEnDcAvailable;
+ && this.isEnDcAvailable == other.isEnDcAvailable
+ && this.lteVopsSupportInfo.equals(other.lteVopsSupportInfo);
}
public static final Parcelable.Creator<DataSpecificRegistrationStates> CREATOR =
@@ -115,4 +126,4 @@ public class DataSpecificRegistrationStates implements Parcelable{
return new DataSpecificRegistrationStates[size];
}
};
-} \ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/ICellInfoCallback.aidl b/telephony/java/android/telephony/ICellInfoCallback.aidl
index 7fb62682703a..ee3c1b1be6d9 100644
--- a/telephony/java/android/telephony/ICellInfoCallback.aidl
+++ b/telephony/java/android/telephony/ICellInfoCallback.aidl
@@ -16,6 +16,7 @@
package android.telephony;
+import android.os.ParcelableException;
import android.telephony.CellInfo;
import java.util.List;
@@ -27,4 +28,5 @@ import java.util.List;
oneway interface ICellInfoCallback
{
void onCellInfo(in List<CellInfo> state);
+ void onError(in int errorCode, in ParcelableException detail);
}
diff --git a/telephony/java/android/telephony/LteVopsSupportInfo.aidl b/telephony/java/android/telephony/LteVopsSupportInfo.aidl
new file mode 100644
index 000000000000..598459853d1c
--- /dev/null
+++ b/telephony/java/android/telephony/LteVopsSupportInfo.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+parcelable LteVopsSupportInfo;
diff --git a/telephony/java/android/telephony/LteVopsSupportInfo.java b/telephony/java/android/telephony/LteVopsSupportInfo.java
new file mode 100644
index 000000000000..0ae85c0dfa6c
--- /dev/null
+++ b/telephony/java/android/telephony/LteVopsSupportInfo.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Class stores information related to LTE network VoPS support
+ * @hide
+ */
+@SystemApi
+public final class LteVopsSupportInfo implements Parcelable {
+
+ /**@hide*/
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(
+ value = {LTE_STATUS_NOT_AVAILABLE, LTE_STATUS_SUPPORTED,
+ LTE_STATUS_NOT_SUPPORTED}, prefix = "LTE_STATUS_")
+ public @interface LteVopsStatus {}
+ /**
+ * Indicates information not available from modem.
+ */
+ public static final int LTE_STATUS_NOT_AVAILABLE = 1;
+
+ /**
+ * Indicates network support the feature.
+ */
+ public static final int LTE_STATUS_SUPPORTED = 2;
+
+ /**
+ * Indicates network does not support the feature.
+ */
+ public static final int LTE_STATUS_NOT_SUPPORTED = 3;
+
+ @LteVopsStatus
+ private final int mVopsSupport;
+ @LteVopsStatus
+ private final int mEmcBearerSupport;
+
+ public LteVopsSupportInfo(@LteVopsStatus int vops, @LteVopsStatus int emergency) {
+ mVopsSupport = vops;
+ mEmcBearerSupport = emergency;
+ }
+
+ /**
+ * Provides the LTE VoPS support capability as described in:
+ * 3GPP 24.301 EPS network feature support -> IMS VoPS
+ */
+ public @LteVopsStatus int getVopsSupport() {
+ return mVopsSupport;
+ }
+
+ /**
+ * Provides the LTE Emergency bearer support capability as described in:
+ * 3GPP 24.301 EPS network feature support -> EMC BS
+ * 25.331 LTE RRC SIB1 : ims-EmergencySupport-r9
+ */
+ public @LteVopsStatus int getEmcBearerSupport() {
+ return mEmcBearerSupport;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mVopsSupport);
+ out.writeInt(mEmcBearerSupport);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || !(o instanceof LteVopsSupportInfo)) {
+ return false;
+ }
+ if (this == o) return true;
+ LteVopsSupportInfo other = (LteVopsSupportInfo) o;
+ return mVopsSupport == other.mVopsSupport
+ && mEmcBearerSupport == other.mEmcBearerSupport;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mVopsSupport, mEmcBearerSupport);
+ }
+
+ /**
+ * @return string representation.
+ */
+ @Override
+ public String toString() {
+ return ("LteVopsSupportInfo : "
+ + " mVopsSupport = " + mVopsSupport
+ + " mEmcBearerSupport = " + mEmcBearerSupport);
+ }
+
+ public static final Creator<LteVopsSupportInfo> CREATOR =
+ new Creator<LteVopsSupportInfo>() {
+ @Override
+ public LteVopsSupportInfo createFromParcel(Parcel in) {
+ return new LteVopsSupportInfo(in);
+ }
+
+ @Override
+ public LteVopsSupportInfo[] newArray(int size) {
+ return new LteVopsSupportInfo[size];
+ }
+ };
+
+ private LteVopsSupportInfo(Parcel in) {
+ mVopsSupport = in.readInt();
+ mEmcBearerSupport = in.readInt();
+ }
+}
diff --git a/telephony/java/android/telephony/NetworkRegistrationState.java b/telephony/java/android/telephony/NetworkRegistrationState.java
index b00665e26ff2..ceb76b57ae0c 100644
--- a/telephony/java/android/telephony/NetworkRegistrationState.java
+++ b/telephony/java/android/telephony/NetworkRegistrationState.java
@@ -219,12 +219,13 @@ public class NetworkRegistrationState implements Parcelable {
public NetworkRegistrationState(int domain, int transportType, int regState,
int accessNetworkTechnology, int rejectCause, boolean emergencyOnly,
int[] availableServices, @Nullable CellIdentity cellIdentity, int maxDataCalls,
- boolean isDcNrRestricted, boolean isNrAvailable, boolean isEndcAvailable) {
+ boolean isDcNrRestricted, boolean isNrAvailable, boolean isEndcAvailable,
+ LteVopsSupportInfo lteVopsSupportInfo) {
this(domain, transportType, regState, accessNetworkTechnology, rejectCause, emergencyOnly,
availableServices, cellIdentity);
mDataSpecificStates = new DataSpecificRegistrationStates(
- maxDataCalls, isDcNrRestricted, isNrAvailable, isEndcAvailable);
+ maxDataCalls, isDcNrRestricted, isNrAvailable, isEndcAvailable, lteVopsSupportInfo);
updateNrStatus(mDataSpecificStates);
}
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index 9317aa73ffc2..9fee5932dadc 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -184,14 +184,17 @@ public class PhoneStateListener {
public static final int LISTEN_PRECISE_CALL_STATE = 0x00000800;
/**
- * Listen for precise changes and fails on the data connection (cellular).
+ * Listen for {@link PreciseDataConnectionState} on the data connection (cellular).
+ *
* {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
* READ_PRECISE_PHONE_STATE}
*
* @see #onPreciseDataConnectionStateChanged
+ *
* @hide
*/
+ @SystemApi
public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 0x00001000;
/**
@@ -293,7 +296,7 @@ public class PhoneStateListener {
/**
* Listen for changes to preferred data subId.
- * See {@link SubscriptionManager#setPreferredData(int)}
+ * See {@link SubscriptionManager#setPreferredDataSubId(int)}
* for more details.
*
* @see #onPreferredDataSubIdChanged
@@ -332,6 +335,18 @@ public class PhoneStateListener {
@SystemApi
public static final int LISTEN_CALL_DISCONNECT_CAUSES = 0x02000000;
+ /**
+ * Listen for changes to the call attributes of a currently active call.
+ * {@more}
+ * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+ * READ_PRECISE_PHONE_STATE}
+ *
+ * @see #onCallAttributesChanged
+ * @hide
+ */
+ @SystemApi
+ public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 0x04000000;
+
/*
* Subscription used to listen to the phone state changes
* @hide
@@ -564,10 +579,11 @@ public class PhoneStateListener {
/**
* Callback invoked when data connection state changes with precise information.
+ * @param dataConnectionState {@link PreciseDataConnectionState}
*
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public void onPreciseDataConnectionStateChanged(
PreciseDataConnectionState dataConnectionState) {
// default implementation empty
@@ -679,6 +695,17 @@ public class PhoneStateListener {
}
/**
+ * Callback invoked when the call attributes changes. Requires
+ * the READ_PRIVILEGED_PHONE_STATE permission.
+ * @param callAttributes the call attributes
+ * @hide
+ */
+ @SystemApi
+ public void onCallAttributesChanged(CallAttributes callAttributes) {
+ // default implementation empty
+ }
+
+ /**
* Callback invoked when modem radio power state changes. Requires
* the READ_PRIVILEGED_PHONE_STATE permission.
* @param state the modem radio power state
@@ -778,9 +805,11 @@ public class PhoneStateListener {
PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
if (psl == null) return;
- Binder.withCleanCallingIdentity(
- () -> mExecutor.execute(
- () -> psl.onDataConnectionStateChanged(state, networkType)));
+ Binder.withCleanCallingIdentity(() -> mExecutor.execute(
+ () -> {
+ psl.onDataConnectionStateChanged(state, networkType);
+ psl.onDataConnectionStateChanged(state);
+ }));
}
public void onDataActivity(int direction) {
@@ -937,6 +966,14 @@ public class PhoneStateListener {
() -> mExecutor.execute(() -> psl.onRadioPowerStateChanged(state)));
}
+ public void onCallAttributesChanged(CallAttributes callAttributes) {
+ PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
+ if (psl == null) return;
+
+ Binder.withCleanCallingIdentity(
+ () -> mExecutor.execute(() -> psl.onCallAttributesChanged(callAttributes)));
+ }
+
public void onPreferredDataSubIdChanged(int subId) {
PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
if (psl == null) return;
diff --git a/telephony/java/android/telephony/PreciseDataConnectionState.java b/telephony/java/android/telephony/PreciseDataConnectionState.java
index 83738997a067..57a18266259a 100644
--- a/telephony/java/android/telephony/PreciseDataConnectionState.java
+++ b/telephony/java/android/telephony/PreciseDataConnectionState.java
@@ -16,10 +16,12 @@
package android.telephony;
+import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.net.LinkProperties;
import android.os.Parcel;
import android.os.Parcelable;
+import android.telephony.data.ApnSetting;
import java.util.Objects;
@@ -31,7 +33,7 @@ import java.util.Objects;
* <ul>
* <li>Data connection state.
* <li>Network type of the connection.
- * <li>APN type.
+ * <li>APN types.
* <li>APN.
* <li>The properties of the network link.
* <li>Data connection fail cause.
@@ -39,14 +41,15 @@ import java.util.Objects;
*
* @hide
*/
-public class PreciseDataConnectionState implements Parcelable {
+@SystemApi
+public final class PreciseDataConnectionState implements Parcelable {
- private int mState = TelephonyManager.DATA_UNKNOWN;
- private int mNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
- private String mAPNType = "";
+ private @TelephonyManager.DataState int mState = TelephonyManager.DATA_UNKNOWN;
+ private @TelephonyManager.NetworkType int mNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ private @DataFailCause.FailCause int mFailCause = DataFailCause.NONE;
+ private @ApnSetting.ApnType int mAPNTypes = ApnSetting.TYPE_NONE;
private String mAPN = "";
private LinkProperties mLinkProperties = null;
- private String mFailCause = "";
/**
* Constructor
@@ -54,11 +57,14 @@ public class PreciseDataConnectionState implements Parcelable {
* @hide
*/
@UnsupportedAppUsage
- public PreciseDataConnectionState(int state, int networkType, String apnType, String apn,
- LinkProperties linkProperties, String failCause) {
+ public PreciseDataConnectionState(@TelephonyManager.DataState int state,
+ @TelephonyManager.NetworkType int networkType,
+ @ApnSetting.ApnType int apnTypes, String apn,
+ LinkProperties linkProperties,
+ @DataFailCause.FailCause int failCause) {
mState = state;
mNetworkType = networkType;
- mAPNType = apnType;
+ mAPNTypes = apnTypes;
mAPN = apn;
mLinkProperties = linkProperties;
mFailCause = failCause;
@@ -74,73 +80,52 @@ public class PreciseDataConnectionState implements Parcelable {
/**
* Construct a PreciseDataConnectionState object from the given parcel.
+ *
+ * @hide
*/
private PreciseDataConnectionState(Parcel in) {
mState = in.readInt();
mNetworkType = in.readInt();
- mAPNType = in.readString();
+ mAPNTypes = in.readInt();
mAPN = in.readString();
mLinkProperties = (LinkProperties)in.readParcelable(null);
- mFailCause = in.readString();
+ mFailCause = in.readInt();
}
/**
- * Get data connection state
- *
- * @see TelephonyManager#DATA_UNKNOWN
- * @see TelephonyManager#DATA_DISCONNECTED
- * @see TelephonyManager#DATA_CONNECTING
- * @see TelephonyManager#DATA_CONNECTED
- * @see TelephonyManager#DATA_SUSPENDED
+ * Returns the state of data connection that supported the apn types returned by
+ * {@link #getDataConnectionApnTypeBitMask()}
*/
- @UnsupportedAppUsage
- public int getDataConnectionState() {
+ public @TelephonyManager.DataState int getDataConnectionState() {
return mState;
}
/**
- * Get data connection network type
- *
- * @see TelephonyManager#NETWORK_TYPE_UNKNOWN
- * @see TelephonyManager#NETWORK_TYPE_GPRS
- * @see TelephonyManager#NETWORK_TYPE_EDGE
- * @see TelephonyManager#NETWORK_TYPE_UMTS
- * @see TelephonyManager#NETWORK_TYPE_CDMA
- * @see TelephonyManager#NETWORK_TYPE_EVDO_0
- * @see TelephonyManager#NETWORK_TYPE_EVDO_A
- * @see TelephonyManager#NETWORK_TYPE_1xRTT
- * @see TelephonyManager#NETWORK_TYPE_HSDPA
- * @see TelephonyManager#NETWORK_TYPE_HSUPA
- * @see TelephonyManager#NETWORK_TYPE_HSPA
- * @see TelephonyManager#NETWORK_TYPE_IDEN
- * @see TelephonyManager#NETWORK_TYPE_EVDO_B
- * @see TelephonyManager#NETWORK_TYPE_LTE
- * @see TelephonyManager#NETWORK_TYPE_EHRPD
- * @see TelephonyManager#NETWORK_TYPE_HSPAP
+ * Returns the network type associated with this data connection.
+ * @hide
*/
- @UnsupportedAppUsage
- public int getDataConnectionNetworkType() {
+ public @TelephonyManager.NetworkType int getDataConnectionNetworkType() {
return mNetworkType;
}
/**
- * Get data connection APN type
+ * Returns the data connection APN types supported by this connection and triggers
+ * {@link PreciseDataConnectionState} change.
*/
- @UnsupportedAppUsage
- public String getDataConnectionAPNType() {
- return mAPNType;
+ public @ApnSetting.ApnType int getDataConnectionApnTypeBitMask() {
+ return mAPNTypes;
}
/**
- * Get data connection APN.
+ * Returns APN {@link ApnSetting} of this data connection.
*/
- @UnsupportedAppUsage
- public String getDataConnectionAPN() {
+ public String getDataConnectionApn() {
return mAPN;
}
/**
- * Get the properties of the network link.
+ * Get the properties of the network link {@link LinkProperties}.
+ * @hide
*/
@UnsupportedAppUsage
public LinkProperties getDataConnectionLinkProperties() {
@@ -148,10 +133,9 @@ public class PreciseDataConnectionState implements Parcelable {
}
/**
- * Get data connection fail cause, in case there was a failure.
+ * Returns data connection fail cause, in case there was a failure.
*/
- @UnsupportedAppUsage
- public String getDataConnectionFailCause() {
+ public @DataFailCause.FailCause int getDataConnectionFailCause() {
return mFailCause;
}
@@ -164,10 +148,10 @@ public class PreciseDataConnectionState implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mState);
out.writeInt(mNetworkType);
- out.writeString(mAPNType);
+ out.writeInt(mAPNTypes);
out.writeString(mAPN);
out.writeParcelable(mLinkProperties, flags);
- out.writeString(mFailCause);
+ out.writeInt(mFailCause);
}
public static final Parcelable.Creator<PreciseDataConnectionState> CREATOR
@@ -184,56 +168,23 @@ public class PreciseDataConnectionState implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mState, mNetworkType, mAPNType, mAPN, mLinkProperties, mFailCause);
+ return Objects.hash(mState, mNetworkType, mAPNTypes, mAPN, mLinkProperties,
+ mFailCause);
}
@Override
public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
+
+ if (!(obj instanceof PreciseDataConnectionState)) {
return false;
}
+
PreciseDataConnectionState other = (PreciseDataConnectionState) obj;
- if (mAPN == null) {
- if (other.mAPN != null) {
- return false;
- }
- } else if (!mAPN.equals(other.mAPN)) {
- return false;
- }
- if (mAPNType == null) {
- if (other.mAPNType != null) {
- return false;
- }
- } else if (!mAPNType.equals(other.mAPNType)) {
- return false;
- }
- if (mFailCause == null) {
- if (other.mFailCause != null) {
- return false;
- }
- } else if (!mFailCause.equals(other.mFailCause)) {
- return false;
- }
- if (mLinkProperties == null) {
- if (other.mLinkProperties != null) {
- return false;
- }
- } else if (!mLinkProperties.equals(other.mLinkProperties)) {
- return false;
- }
- if (mNetworkType != other.mNetworkType) {
- return false;
- }
- if (mState != other.mState) {
- return false;
- }
- return true;
+ return Objects.equals(mAPN, other.mAPN) && mAPNTypes == other.mAPNTypes
+ && mFailCause == other.mFailCause
+ && Objects.equals(mLinkProperties, other.mLinkProperties)
+ && mNetworkType == other.mNetworkType
+ && mState == other.mState;
}
@Override
@@ -242,10 +193,10 @@ public class PreciseDataConnectionState implements Parcelable {
sb.append("Data Connection state: " + mState);
sb.append(", Network type: " + mNetworkType);
- sb.append(", APN type: " + mAPNType);
+ sb.append(", APN types: " + ApnSetting.getApnTypesStringFromBitmask(mAPNTypes));
sb.append(", APN: " + mAPN);
sb.append(", Link properties: " + mLinkProperties);
- sb.append(", Fail cause: " + mFailCause);
+ sb.append(", Fail cause: " + DataFailCause.toString(mFailCause));
return sb.toString();
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 9fc1b6f76e77..bf9bf9a1ba8f 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -170,7 +170,8 @@ public class ServiceState implements Parcelable {
RIL_RADIO_TECHNOLOGY_GSM,
RIL_RADIO_TECHNOLOGY_TD_SCDMA,
RIL_RADIO_TECHNOLOGY_IWLAN,
- RIL_RADIO_TECHNOLOGY_LTE_CA})
+ RIL_RADIO_TECHNOLOGY_LTE_CA,
+ RIL_RADIO_TECHNOLOGY_NR})
public @interface RilRadioTechnology {}
/**
* Available radio technologies for GSM, UMTS and CDMA.
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index ef185c5eeaf1..ad3ca6d129c9 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -24,6 +24,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Objects;
/**
@@ -84,11 +86,6 @@ public class SignalStrength implements Parcelable {
CellSignalStrengthTdscdma mTdscdma;
CellSignalStrengthLte mLte;
- /** Parameters from the framework */
- @UnsupportedAppUsage
- private int mLteRsrpBoost; // offset to be reduced from the rsrp threshold while calculating
- // signal strength level
-
/**
* Create a new SignalStrength from a intent notifier Bundle
*
@@ -138,7 +135,6 @@ public class SignalStrength implements Parcelable {
mWcdma = wcdma;
mTdscdma = tdscdma;
mLte = lte;
- mLteRsrpBoost = 0;
}
/**
@@ -178,9 +174,37 @@ public class SignalStrength implements Parcelable {
return mLte;
}
+ /**
+ * Returns a List of CellSignalStrength Components of this SignalStrength Report.
+ *
+ * Use this API to access underlying
+ * {@link android.telephony#CellSignalStrength CellSignalStrength} objects that provide more
+ * granular information about the SignalStrength report. Only valid (non-empty)
+ * CellSignalStrengths will be returned. The order of any returned elements is not guaranteed,
+ * and the list may contain more than one instance of a CellSignalStrength type.
+ *
+ * @return a List of CellSignalStrength or an empty List if there are no valid measurements.
+ *
+ * @see android.telephony#CellSignalStrength
+ * @see android.telephony#CellSignalStrengthNr
+ * @see android.telephony#CellSignalStrengthLte
+ * @see android.telephony#CellSignalStrengthTdscdma
+ * @see android.telephony#CellSignalStrengthWcdma
+ * @see android.telephony#CellSignalStrengthCdma
+ * @see android.telephony#CellSignalStrengthGsm
+ */
+ public @NonNull List<CellSignalStrength> getCellSignalStrengths() {
+ List<CellSignalStrength> cssList = new ArrayList<>(2); // Usually have 2 or fewer elems
+ if (mLte.isValid()) cssList.add(mLte);
+ if (mCdma.isValid()) cssList.add(mCdma);
+ if (mTdscdma.isValid()) cssList.add(mTdscdma);
+ if (mWcdma.isValid()) cssList.add(mWcdma);
+ if (mGsm.isValid()) cssList.add(mGsm);
+ return cssList;
+ }
+
/** @hide */
public void updateLevel(PersistableBundle cc, ServiceState ss) {
- mLteRsrpBoost = ss.getLteEarfcnRsrpBoost();
mCdma.updateLevel(cc, ss);
mGsm.updateLevel(cc, ss);
mWcdma.updateLevel(cc, ss);
@@ -210,7 +234,6 @@ public class SignalStrength implements Parcelable {
mWcdma = new CellSignalStrengthWcdma(s.mWcdma);
mTdscdma = new CellSignalStrengthTdscdma(s.mTdscdma);
mLte = new CellSignalStrengthLte(s.mLte);
- mLteRsrpBoost = s.mLteRsrpBoost;
}
/**
@@ -227,7 +250,6 @@ public class SignalStrength implements Parcelable {
mWcdma = in.readParcelable(CellSignalStrengthWcdma.class.getClassLoader());
mTdscdma = in.readParcelable(CellSignalStrengthTdscdma.class.getClassLoader());
mLte = in.readParcelable(CellSignalStrengthLte.class.getClassLoader());
- mLteRsrpBoost = in.readInt();
}
/**
@@ -239,8 +261,6 @@ public class SignalStrength implements Parcelable {
out.writeParcelable(mWcdma, flags);
out.writeParcelable(mTdscdma, flags);
out.writeParcelable(mLte, flags);
-
- out.writeInt(mLteRsrpBoost);
}
/**
@@ -353,11 +373,6 @@ public class SignalStrength implements Parcelable {
return mLte.getCqi();
}
- /** @hide */
- public int getLteRsrpBoost() {
- return mLteRsrpBoost;
- }
-
/**
* Retrieve an abstract level value for the overall signal strength.
*
@@ -369,7 +384,7 @@ public class SignalStrength implements Parcelable {
public int getLevel() {
int level = getPrimary().getLevel();
if (level < SIGNAL_STRENGTH_NONE_OR_UNKNOWN || level > SIGNAL_STRENGTH_GREAT) {
- log("Invalid Level " + level + ", this=" + this);
+ loge("Invalid Level " + level + ", this=" + this);
return SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
}
return getPrimary().getLevel();
@@ -585,7 +600,7 @@ public class SignalStrength implements Parcelable {
*/
@Override
public int hashCode() {
- return Objects.hash(mCdma, mGsm, mWcdma, mTdscdma, mLte, mLteRsrpBoost);
+ return Objects.hash(mCdma, mGsm, mWcdma, mTdscdma, mLte);
}
/**
@@ -601,8 +616,7 @@ public class SignalStrength implements Parcelable {
&& mGsm.equals(s.mGsm)
&& mWcdma.equals(s.mWcdma)
&& mTdscdma.equals(s.mTdscdma)
- && mLte.equals(s.mLte)
- && mLteRsrpBoost == s.mLteRsrpBoost;
+ && mLte.equals(s.mLte);
}
/**
@@ -616,7 +630,6 @@ public class SignalStrength implements Parcelable {
.append(",mWcdma=").append(mWcdma)
.append(",mTdscdma=").append(mTdscdma)
.append(",mLte=").append(mLte)
- .append(",mLteRsrpBoost=").append(mLteRsrpBoost)
.append(",primary=").append(getPrimary().getClass().getSimpleName())
.append("}")
.toString();
@@ -635,8 +648,6 @@ public class SignalStrength implements Parcelable {
mWcdma = m.getParcelable("Wcdma");
mTdscdma = m.getParcelable("Tdscdma");
mLte = m.getParcelable("Lte");
-
- mLteRsrpBoost = m.getInt("LteRsrpBoost");
}
/**
@@ -652,14 +663,19 @@ public class SignalStrength implements Parcelable {
m.putParcelable("Wcdma", mWcdma);
m.putParcelable("Tdscdma", mTdscdma);
m.putParcelable("Lte", mLte);
-
- m.putInt("LteRsrpBoost", mLteRsrpBoost);
}
/**
- * log
+ * log warning
*/
private static void log(String s) {
Rlog.w(LOG_TAG, s);
}
+
+ /**
+ * log error
+ */
+ private static void loge(String s) {
+ Rlog.e(LOG_TAG, s);
+ }
}
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index a1e8b199d2a0..51d5ab17ee16 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -174,6 +174,16 @@ public class SubscriptionInfo implements Parcelable {
private boolean mIsGroupDisabled = false;
/**
+ * Profile class, PROFILE_CLASS_TESTING, PROFILE_CLASS_OPERATIONAL
+ * PROFILE_CLASS_PROVISIONING, or PROFILE_CLASS_UNSET.
+ * A profile on the eUICC can be defined as test, operational, provisioning, or unset.
+ * The profile class will be populated from the profile metadata if present. Otherwise,
+ * the profile class defaults to unset if there is no profile metadata or the subscription
+ * is not on an eUICC ({@link #isEmbedded} returns false).
+ */
+ private int mProfileClass;
+
+ /**
* @hide
*/
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
@@ -182,7 +192,8 @@ public class SubscriptionInfo implements Parcelable {
@Nullable UiccAccessRule[] accessRules, String cardString) {
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardString,
- false, null, true, TelephonyManager.UNKNOWN_CARRIER_ID);
+ false, null, true, TelephonyManager.UNKNOWN_CARRIER_ID,
+ SubscriptionManager.PROFILE_CLASS_DEFAULT);
}
/**
@@ -192,10 +203,10 @@ public class SubscriptionInfo implements Parcelable {
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@Nullable UiccAccessRule[] accessRules, String cardString, boolean isOpportunistic,
- @Nullable String groupUUID, boolean isMetered, int carrierId) {
+ @Nullable String groupUUID, boolean isMetered, int carrierId, int profileClass) {
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardString, -1,
- isOpportunistic, groupUUID, isMetered, false, carrierId);
+ isOpportunistic, groupUUID, isMetered, false, carrierId, profileClass);
}
/**
@@ -206,7 +217,7 @@ public class SubscriptionInfo implements Parcelable {
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@Nullable UiccAccessRule[] accessRules, String cardString, int cardId,
boolean isOpportunistic, @Nullable String groupUUID, boolean isMetered,
- boolean isGroupDisabled, int carrierid) {
+ boolean isGroupDisabled, int carrierid, int profileClass) {
this.mId = id;
this.mIccId = iccId;
this.mSimSlotIndex = simSlotIndex;
@@ -229,6 +240,7 @@ public class SubscriptionInfo implements Parcelable {
this.mIsMetered = isMetered;
this.mIsGroupDisabled = isGroupDisabled;
this.mCarrierId = carrierid;
+ this.mProfileClass = profileClass;
}
@@ -466,6 +478,15 @@ public class SubscriptionInfo implements Parcelable {
}
/**
+ * @return the profile class of this subscription.
+ * @hide
+ */
+ @SystemApi
+ public @SubscriptionManager.ProfileClass int getProfileClass() {
+ return this.mProfileClass;
+ }
+
+ /**
* Checks whether the app with the given context is authorized to manage this subscription
* according to its metadata. Only supported for embedded subscriptions (if {@link #isEmbedded}
* returns true).
@@ -590,11 +611,12 @@ public class SubscriptionInfo implements Parcelable {
boolean isMetered = source.readBoolean();
boolean isGroupDisabled = source.readBoolean();
int carrierid = source.readInt();
+ int profileClass = source.readInt();
return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName,
nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso,
isEmbedded, accessRules, cardString, cardId, isOpportunistic, groupUUID,
- isMetered, isGroupDisabled, carrierid);
+ isMetered, isGroupDisabled, carrierid, profileClass);
}
@Override
@@ -627,6 +649,7 @@ public class SubscriptionInfo implements Parcelable {
dest.writeBoolean(mIsMetered);
dest.writeBoolean(mIsGroupDisabled);
dest.writeInt(mCarrierId);
+ dest.writeInt(mProfileClass);
}
@Override
@@ -662,7 +685,8 @@ public class SubscriptionInfo implements Parcelable {
+ " accessRules " + Arrays.toString(mAccessRules)
+ " cardString=" + cardStringToPrint + " cardId=" + mCardId
+ " isOpportunistic " + mIsOpportunistic + " mGroupUUID=" + mGroupUUID
- + " isMetered=" + mIsMetered + " mIsGroupDisabled=" + mIsGroupDisabled + "}";
+ + " isMetered=" + mIsMetered + " mIsGroupDisabled=" + mIsGroupDisabled
+ + " profileClass=" + mProfileClass + "}";
}
@Override
@@ -670,7 +694,7 @@ public class SubscriptionInfo implements Parcelable {
return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded,
mIsOpportunistic, mGroupUUID, mIsMetered, mIccId, mNumber, mMcc, mMnc,
mCountryIso, mCardString, mCardId, mDisplayName, mCarrierName, mAccessRules,
- mIsGroupDisabled, mCarrierId);
+ mIsGroupDisabled, mCarrierId, mProfileClass);
}
@Override
@@ -705,6 +729,7 @@ public class SubscriptionInfo implements Parcelable {
&& Objects.equals(mCardId, toCompare.mCardId)
&& TextUtils.equals(mDisplayName, toCompare.mDisplayName)
&& TextUtils.equals(mCarrierName, toCompare.mCarrierName)
- && Arrays.equals(mAccessRules, toCompare.mAccessRules);
+ && Arrays.equals(mAccessRules, toCompare.mAccessRules)
+ && mProfileClass == toCompare.mProfileClass;
}
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 2c712a1c36e1..9fa4c3ce899f 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -22,6 +22,7 @@ import static android.net.NetworkPolicyManager.OVERRIDE_UNMETERED;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.DurationMillisLong;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -62,6 +63,8 @@ import com.android.internal.telephony.ISub;
import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.PhoneConstants;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -599,6 +602,73 @@ public class SubscriptionManager {
* @hide
*/
public static final String IS_METERED = "is_metered";
+
+ /**
+ * TelephonyProvider column name for the profile class of a subscription
+ * Only present if {@link #IS_EMBEDDED} is 1.
+ * <P>Type: INTEGER (int)</P>
+ * @hide
+ */
+ public static final String PROFILE_CLASS = "profile_class";
+
+ /**
+ * Profile class of the subscription
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "PROFILE_CLASS_" }, value = {
+ PROFILE_CLASS_TESTING,
+ PROFILE_CLASS_PROVISIONING,
+ PROFILE_CLASS_OPERATIONAL,
+ PROFILE_CLASS_UNSET,
+ PROFILE_CLASS_DEFAULT
+ })
+ public @interface ProfileClass {}
+
+ /**
+ * A testing profile can be pre-loaded or downloaded onto
+ * the eUICC and provides connectivity to test equipment
+ * for the purpose of testing the device and the eUICC. It
+ * is not intended to store any operator credentials.
+ * @hide
+ */
+ @SystemApi
+ public static final int PROFILE_CLASS_TESTING = 0;
+
+ /**
+ * A provisioning profile is pre-loaded onto the eUICC and
+ * provides connectivity to a mobile network solely for the
+ * purpose of provisioning profiles.
+ * @hide
+ */
+ @SystemApi
+ public static final int PROFILE_CLASS_PROVISIONING = 1;
+
+ /**
+ * An operational profile can be pre-loaded or downloaded
+ * onto the eUICC and provides services provided by the
+ * operator.
+ * @hide
+ */
+ @SystemApi
+ public static final int PROFILE_CLASS_OPERATIONAL = 2;
+
+ /**
+ * The profile class is unset. This occurs when profile class
+ * info is not available. The subscription either has no profile
+ * metadata or the profile metadata did not encode profile class.
+ * @hide
+ */
+ @SystemApi
+ public static final int PROFILE_CLASS_UNSET = -1;
+
+ /**
+ * Default profile class
+ * @hide
+ */
+ @SystemApi
+ public static final int PROFILE_CLASS_DEFAULT = PROFILE_CLASS_UNSET;
+
/**
* Broadcast Action: The user has changed one of the default subs related to
* data, phone calls, or sms</p>
@@ -1102,17 +1172,33 @@ public class SubscriptionManager {
@SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
- List<SubscriptionInfo> result = null;
+ return getActiveSubscriptionInfoList(false);
+ }
+
+ /**
+ * This is similar to {@link #getActiveSubscriptionInfoList()}, but if userVisibleOnly
+ * is true, it will filter out the hidden subscriptions.
+ *
+ * @hide
+ */
+ public List<SubscriptionInfo> getActiveSubscriptionInfoList(boolean userVisibleOnly) {
+ List<SubscriptionInfo> activeList = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
if (iSub != null) {
- result = iSub.getActiveSubscriptionInfoList(mContext.getOpPackageName());
+ activeList = iSub.getActiveSubscriptionInfoList(mContext.getOpPackageName());
}
} catch (RemoteException ex) {
// ignore it
}
- return result;
+
+ if (!userVisibleOnly || activeList == null) {
+ return activeList;
+ } else {
+ return activeList.stream().filter(subInfo -> !shouldHideSubscription(subInfo))
+ .collect(Collectors.toList());
+ }
}
/**
@@ -2367,10 +2453,39 @@ public class SubscriptionManager {
*
*/
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public void setPreferredData(int subId) {
- if (VDBG) logd("[setPreferredData]+ subId:" + subId);
- setSubscriptionPropertyHelper(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
- "setPreferredData", (iSub)-> iSub.setPreferredData(subId));
+ public void setPreferredDataSubscriptionId(int subId) {
+ if (VDBG) logd("[setPreferredDataSubscriptionId]+ subId:" + subId);
+ setSubscriptionPropertyHelper(DEFAULT_SUBSCRIPTION_ID, "setPreferredDataSubscriptionId",
+ (iSub)-> iSub.setPreferredDataSubscriptionId(subId));
+ }
+
+ /**
+ * Get which subscription is preferred for cellular data.
+ * It's also usually the subscription we set up internet connection on.
+ *
+ * PreferredData overwrites user setting of default data subscription. And it's used
+ * by AlternativeNetworkService or carrier apps to switch primary and CBRS
+ * subscription dynamically in multi-SIM devices.
+ *
+ * @return preferred subscription id for cellular data. {@link DEFAULT_SUBSCRIPTION_ID} if
+ * there's no prefered subscription.
+ *
+ * @hide
+ *
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public int getPreferredDataSubscriptionId() {
+ int preferredSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+ try {
+ ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+ if (iSub != null) {
+ preferredSubId = iSub.getPreferredDataSubscriptionId();
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
+
+ return preferredSubId;
}
/**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index bc8e0be353b3..1598ef82fa32 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -76,8 +76,8 @@ import com.android.ims.internal.IImsServiceFeatureCallback;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telecom.ITelecomService;
import com.android.internal.telephony.CellNetworkScanResult;
-import com.android.internal.telephony.IAns;
import com.android.internal.telephony.INumberVerificationCallback;
+import com.android.internal.telephony.IOns;
import com.android.internal.telephony.IPhoneSubInfo;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.ITelephonyRegistry;
@@ -4591,9 +4591,18 @@ public class TelephonyManager {
}
}
- /** Data connection state: Unknown. Used before we know the state.
- * @hide
- */
+ /** @hide */
+ @IntDef(prefix = {"DATA_"}, value = {
+ DATA_UNKNOWN,
+ DATA_DISCONNECTED,
+ DATA_CONNECTING,
+ DATA_CONNECTED,
+ DATA_SUSPENDED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DataState{}
+
+ /** Data connection state: Unknown. Used before we know the state. */
public static final int DATA_UNKNOWN = -1;
/** Data connection state: Disconnected. IP traffic not available. */
public static final int DATA_DISCONNECTED = 0;
@@ -4648,8 +4657,8 @@ public class TelephonyManager {
return ITelephonyRegistry.Stub.asInterface(ServiceManager.getService("telephony.registry"));
}
- private IAns getIAns() {
- return IAns.Stub.asInterface(ServiceManager.getService("ians"));
+ private IOns getIOns() {
+ return IOns.Stub.asInterface(ServiceManager.getService("ions"));
}
//
@@ -4895,19 +4904,53 @@ public class TelephonyManager {
/** Callback for providing asynchronous {@link CellInfo} on request */
public abstract static class CellInfoCallback {
/**
- * Response to
+ * Success response to
* {@link android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()}.
*
- * <p>Invoked when there is a response to
+ * Invoked when there is a response to
* {@link android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()}
* to provide a list of {@link CellInfo}. If no {@link CellInfo} is available then an empty
- * list will be provided. If an error occurs, null will be provided.
+ * list will be provided. If an error occurs, null will be provided unless the onError
+ * callback is overridden.
*
* @param cellInfo a list of {@link CellInfo}, an empty list, or null.
*
* {@see android.telephony.TelephonyManager#getAllCellInfo getAllCellInfo()}
*/
- public abstract void onCellInfo(List<CellInfo> cellInfo);
+ public abstract void onCellInfo(@NonNull List<CellInfo> cellInfo);
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"ERROR_"}, value = {ERROR_TIMEOUT, ERROR_MODEM_ERROR})
+ public @interface CellInfoCallbackError {}
+
+ /**
+ * The system timed out waiting for a response from the Radio.
+ */
+ public static final int ERROR_TIMEOUT = 1;
+
+ /**
+ * The modem returned a failure.
+ */
+ public static final int ERROR_MODEM_ERROR = 2;
+
+ /**
+ * Error response to
+ * {@link android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()}.
+ *
+ * Invoked when an error condition prevents updated {@link CellInfo} from being fetched
+ * and returned from the modem. Callers of requestCellInfoUpdate() should override this
+ * function to receive detailed status information in the event of an error. By default,
+ * this function will invoke onCellInfo() with null.
+ *
+ * @param errorCode an error code indicating the type of failure.
+ * @param detail a Throwable object with additional detail regarding the failure if
+ * available, otherwise null.
+ */
+ public void onError(@CellInfoCallbackError int errorCode, @Nullable Throwable detail) {
+ // By default, simply invoke the success callback with an empty list.
+ onCellInfo(new ArrayList<CellInfo>());
+ }
};
/**
@@ -4934,6 +4977,12 @@ public class TelephonyManager {
Binder.withCleanCallingIdentity(() ->
executor.execute(() -> callback.onCellInfo(cellInfo)));
}
+
+ public void onError(int errorCode, android.os.ParcelableException detail) {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> callback.onError(
+ errorCode, detail.getCause())));
+ }
}, getOpPackageName());
} catch (RemoteException ex) {
@@ -4968,6 +5017,12 @@ public class TelephonyManager {
Binder.withCleanCallingIdentity(() ->
executor.execute(() -> callback.onCellInfo(cellInfo)));
}
+
+ public void onError(int errorCode, android.os.ParcelableException detail) {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> callback.onError(
+ errorCode, detail.getCause())));
+ }
}, getOpPackageName(), workSource);
} catch (RemoteException ex) {
}
@@ -5855,9 +5910,14 @@ public class TelephonyManager {
/**
* Returns the IMS Service Table (IST) that was loaded from the ISIM.
+ *
+ * See 3GPP TS 31.103 (Section 4.2.7) for the definition and more information on this table.
+ *
* @return IMS Service Table or null if not present or not loaded
* @hide
*/
+ @SystemApi
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getIsimIst() {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -9001,6 +9061,8 @@ public class TelephonyManager {
* <p>This method works only on devices with {@link
* android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled.
*
+ * @deprecated use setCarrierRestrictionRules instead
+ *
* @return The number of carriers set successfully. Should be length of
* carrierList on success; -1 if carrierList null or on error.
* @hide
@@ -9008,44 +9070,144 @@ public class TelephonyManager {
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) {
+ // Execute the method setCarrierRestrictionRules with an empty excluded list and
+ // indicating priority for the allowed list.
+ CarrierRestrictionRules carrierRestrictionRules = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(carriers)
+ .setDefaultCarrierRestriction(
+ CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED)
+ .build();
+
+ int result = setCarrierRestrictionRules(carrierRestrictionRules);
+
+ // Convert boolean result into int, as required by this method.
+ if (result == SET_CARRIER_RESTRICTION_SUCCESS) {
+ return carriers.size();
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * The carrier restrictions were successfully set.
+ * @hide
+ */
+ @SystemApi
+ public static final int SET_CARRIER_RESTRICTION_SUCCESS = 0;
+
+ /**
+ * The carrier restrictions were not set due to lack of support in the modem. This can happen
+ * if the modem does not support setting the carrier restrictions or if the configuration
+ * passed in the {@code setCarrierRestrictionRules} is not supported by the modem.
+ * @hide
+ */
+ @SystemApi
+ public static final int SET_CARRIER_RESTRICTION_NOT_SUPPORTED = 1;
+
+ /**
+ * The setting of carrier restrictions failed.
+ * @hide
+ */
+ @SystemApi
+ public static final int SET_CARRIER_RESTRICTION_ERROR = 2;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"SET_CARRIER_RESTRICTION_"},
+ value = {
+ SET_CARRIER_RESTRICTION_SUCCESS,
+ SET_CARRIER_RESTRICTION_NOT_SUPPORTED,
+ SET_CARRIER_RESTRICTION_ERROR
+ })
+ public @interface SetCarrierRestrictionResult {}
+
+ /**
+ * Set the allowed carrier list and the excluded carrier list indicating the priority between
+ * the two lists.
+ * Requires system privileges.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE}
+ *
+ * <p>This method works only on devices with {@link
+ * android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled.
+ *
+ * @return {@link #SET_CARRIER_RESTRICTION_SUCCESS} in case of success.
+ * {@link #SET_CARRIER_RESTRICTION_NOT_SUPPORTED} if the modem does not support the
+ * configuration. {@link #SET_CARRIER_RESTRICTION_ERROR} in all other error cases.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ @SetCarrierRestrictionResult
+ public int setCarrierRestrictionRules(@NonNull CarrierRestrictionRules rules) {
try {
ITelephony service = getITelephony();
if (service != null) {
- return service.setAllowedCarriers(slotIndex, carriers);
+ return service.setAllowedCarriers(rules);
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#setAllowedCarriers", e);
} catch (NullPointerException e) {
Log.e(TAG, "Error calling ITelephony#setAllowedCarriers", e);
}
- return -1;
+ return SET_CARRIER_RESTRICTION_ERROR;
}
/**
* Get the allowed carrier list for slotIndex.
- * Require system privileges. In the future we may add this to carrier APIs.
+ * Requires system privileges.
*
* <p>This method returns valid data on devices with {@link
* android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled.
*
+ * @deprecated Apps should use {@link getCarriersRestrictionRules} to retrieve the list of
+ * allowed and excliuded carriers, as the result of this API is valid only when the excluded
+ * list is empty. This API could return an empty list, even if some restrictions are present.
+ *
* @return List of {@link android.telephony.CarrierIdentifier}; empty list
* means all carriers are allowed.
* @hide
*/
+ @Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public List<CarrierIdentifier> getAllowedCarriers(int slotIndex) {
+ CarrierRestrictionRules carrierRestrictionRule = getCarrierRestrictionRules();
+ if (carrierRestrictionRule != null) {
+ return carrierRestrictionRule.getAllowedCarriers();
+ }
+ return new ArrayList<CarrierIdentifier>(0);
+ }
+
+ /**
+ * Get the allowed carrier list and the excluded carrier list indicating the priority between
+ * the two lists.
+ * Require system privileges. In the future we may add this to carrier APIs.
+ *
+ * <p>This method returns valid data on devices with {@link
+ * android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled.
+ *
+ * @return {@link CarrierRestrictionRules} which contains the allowed carrier list and the
+ * excluded carrier list with the priority between the two lists. Returns {@code null}
+ * in case of error.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @Nullable
+ public CarrierRestrictionRules getCarrierRestrictionRules() {
try {
ITelephony service = getITelephony();
if (service != null) {
- return service.getAllowedCarriers(slotIndex);
+ return service.getAllowedCarriers();
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#getAllowedCarriers", e);
} catch (NullPointerException e) {
Log.e(TAG, "Error calling ITelephony#getAllowedCarriers", e);
}
- return new ArrayList<CarrierIdentifier>(0);
+ return null;
}
/**
@@ -9448,10 +9610,10 @@ public class TelephonyManager {
}
/**
- * Enable or disable AlternativeNetworkService.
+ * Enable or disable OpportunisticNetworkService.
*
* This method should be called to enable or disable
- * AlternativeNetwork service on the device.
+ * OpportunisticNetwork service on the device.
*
* <p>
* Requires Permission:
@@ -9462,25 +9624,25 @@ public class TelephonyManager {
* @hide
*/
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public boolean setAlternativeNetworkState(boolean enable) {
+ public boolean setOpportunisticNetworkState(boolean enable) {
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
boolean ret = false;
try {
- IAns iAlternativeNetworkService = getIAns();
- if (iAlternativeNetworkService != null) {
- ret = iAlternativeNetworkService.setEnable(enable, pkgForDebug);
+ IOns iOpportunisticNetworkService = getIOns();
+ if (iOpportunisticNetworkService != null) {
+ ret = iOpportunisticNetworkService.setEnable(enable, pkgForDebug);
}
} catch (RemoteException ex) {
- Rlog.e(TAG, "enableAlternativeNetwork RemoteException", ex);
+ Rlog.e(TAG, "enableOpportunisticNetwork RemoteException", ex);
}
return ret;
}
/**
- * is AlternativeNetworkService enabled
+ * is OpportunisticNetworkService enabled
*
- * This method should be called to determine if the AlternativeNetworkService is
+ * This method should be called to determine if the OpportunisticNetworkService is
* enabled
*
* <p>
@@ -9489,17 +9651,17 @@ public class TelephonyManager {
* @hide
*/
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
- public boolean isAlternativeNetworkEnabled() {
+ public boolean isOpportunisticNetworkEnabled() {
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
boolean isEnabled = false;
try {
- IAns iAlternativeNetworkService = getIAns();
- if (iAlternativeNetworkService != null) {
- isEnabled = iAlternativeNetworkService.isEnabled(pkgForDebug);
+ IOns iOpportunisticNetworkService = getIOns();
+ if (iOpportunisticNetworkService != null) {
+ isEnabled = iOpportunisticNetworkService.isEnabled(pkgForDebug);
}
} catch (RemoteException ex) {
- Rlog.e(TAG, "enableAlternativeNetwork RemoteException", ex);
+ Rlog.e(TAG, "enableOpportunisticNetwork RemoteException", ex);
}
return isEnabled;
@@ -9854,12 +10016,13 @@ public class TelephonyManager {
public boolean setPreferredOpportunisticDataSubscription(int subId) {
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
try {
- IAns iAlternativeNetworkService = getIAns();
- if (iAlternativeNetworkService != null) {
- return iAlternativeNetworkService.setPreferredData(subId, pkgForDebug);
+ IOns iOpportunisticNetworkService = getIOns();
+ if (iOpportunisticNetworkService != null) {
+ return iOpportunisticNetworkService
+ .setPreferredDataSubscriptionId(subId, pkgForDebug);
}
} catch (RemoteException ex) {
- Rlog.e(TAG, "setPreferredData RemoteException", ex);
+ Rlog.e(TAG, "setPreferredDataSubscriptionId RemoteException", ex);
}
return false;
}
@@ -9878,12 +10041,12 @@ public class TelephonyManager {
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
try {
- IAns iAlternativeNetworkService = getIAns();
- if (iAlternativeNetworkService != null) {
- subId = iAlternativeNetworkService.getPreferredData(pkgForDebug);
+ IOns iOpportunisticNetworkService = getIOns();
+ if (iOpportunisticNetworkService != null) {
+ subId = iOpportunisticNetworkService.getPreferredDataSubscriptionId(pkgForDebug);
}
} catch (RemoteException ex) {
- Rlog.e(TAG, "getPreferredData RemoteException", ex);
+ Rlog.e(TAG, "getPreferredDataSubscriptionId RemoteException", ex);
}
return subId;
}
@@ -9891,8 +10054,8 @@ public class TelephonyManager {
/**
* Update availability of a list of networks in the current location.
*
- * This api should be called to inform AlternativeNetwork Service about the availability
- * of a network at the current location. This information will be used by AlternativeNetwork
+ * This api should be called to inform OpportunisticNetwork Service about the availability
+ * of a network at the current location. This information will be used by OpportunisticNetwork
* service to decide to attach to the network opportunistically. If an empty list is passed,
* it is assumed that no network is available.
* Requires that the calling app has carrier privileges on both primary and
@@ -9907,9 +10070,9 @@ public class TelephonyManager {
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
boolean ret = false;
try {
- IAns iAlternativeNetworkService = getIAns();
- if (iAlternativeNetworkService != null) {
- ret = iAlternativeNetworkService.updateAvailableNetworks(availableNetworks,
+ IOns iOpportunisticNetworkService = getIOns();
+ if (iOpportunisticNetworkService != null && availableNetworks != null) {
+ ret = iOpportunisticNetworkService.updateAvailableNetworks(availableNetworks,
pkgForDebug);
}
} catch (RemoteException ex) {
@@ -9917,4 +10080,33 @@ public class TelephonyManager {
}
return ret;
}
+
+ /**
+ * Enable or disable a logical modem stack. When a logical modem is disabled, the corresponding
+ * SIM will still be visible to the user but its mapping modem will not have any radio activity.
+ * For example, we will disable a modem when user or system believes the corresponding SIM
+ * is temporarily not needed (e.g. out of coverage), and will enable it back on when needed.
+ *
+ * Requires that the calling app has permission
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ * @param slotIndex which corresponding modem will operate on.
+ * @param enable whether to enable or disable the modem stack.
+ * @return whether the operation is successful.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public boolean enableModemForSlot(int slotIndex, boolean enable) {
+ boolean ret = false;
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ ret = telephony.enableModemForSlot(slotIndex, enable);
+ }
+ } catch (RemoteException ex) {
+ Log.e(TAG, "enableModem RemoteException", ex);
+ }
+ return ret;
+ }
}
diff --git a/telephony/java/android/telephony/emergency/EmergencyNumber.java b/telephony/java/android/telephony/emergency/EmergencyNumber.java
index fe062d5d974a..e68256d086bc 100644
--- a/telephony/java/android/telephony/emergency/EmergencyNumber.java
+++ b/telephony/java/android/telephony/emergency/EmergencyNumber.java
@@ -27,8 +27,10 @@ import android.telephony.Rlog;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -175,6 +177,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
* Bit-field which indicates the number is from the platform-maintained database.
*/
public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 1 << 4;
+ /**
+ * Bit-field which indicates the number is from test mode.
+ *
+ * @hide
+ */
+ public static final int EMERGENCY_NUMBER_SOURCE_TEST = 1 << 5;
/** Bit-field which indicates the number is from the modem config. */
public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG =
EmergencyNumberSource.MODEM_CONFIG;
@@ -198,21 +206,56 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_DEFAULT);
}
+ /**
+ * Indicated the framework does not know whether an emergency call should be placed using
+ * emergency or normal call routing. This means the underlying radio or IMS implementation is
+ * free to determine for itself how to route the call.
+ */
+ public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0;
+ /**
+ * Indicates the radio or IMS implementation must handle the call through emergency routing.
+ */
+ public static final int EMERGENCY_CALL_ROUTING_EMERGENCY = 1;
+ /**
+ * Indicates the radio or IMS implementation must handle the call through normal call routing.
+ */
+ public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2;
+
+ /**
+ * The routing to tell how to handle the call for the corresponding emergency number.
+ *
+ * @hide
+ */
+ @IntDef(flag = false, prefix = { "EMERGENCY_CALL_ROUTING_" }, value = {
+ EMERGENCY_CALL_ROUTING_UNKNOWN,
+ EMERGENCY_CALL_ROUTING_EMERGENCY,
+ EMERGENCY_CALL_ROUTING_NORMAL
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface EmergencyCallRouting {}
+
+
private final String mNumber;
private final String mCountryIso;
private final String mMnc;
private final int mEmergencyServiceCategoryBitmask;
+ private final List<String> mEmergencyUrns;
private final int mEmergencyNumberSourceBitmask;
+ private final int mEmergencyCallRouting;
/** @hide */
- public EmergencyNumber(@NonNull String number, @NonNull String countryIso,
- @NonNull String mnc, int emergencyServiceCategories,
- int emergencyNumberSources) {
+ public EmergencyNumber(@NonNull String number, @NonNull String countryIso, @NonNull String mnc,
+ @EmergencyServiceCategories int emergencyServiceCategories,
+ @NonNull List<String> emergencyUrns,
+ @EmergencyNumberSources int emergencyNumberSources,
+ @EmergencyCallRouting int emergencyCallRouting) {
this.mNumber = number;
this.mCountryIso = countryIso;
this.mMnc = mnc;
this.mEmergencyServiceCategoryBitmask = emergencyServiceCategories;
+ this.mEmergencyUrns = emergencyUrns;
this.mEmergencyNumberSourceBitmask = emergencyNumberSources;
+ this.mEmergencyCallRouting = emergencyCallRouting;
}
/** @hide */
@@ -221,9 +264,36 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
mCountryIso = source.readString();
mMnc = source.readString();
mEmergencyServiceCategoryBitmask = source.readInt();
+ mEmergencyUrns = source.createStringArrayList();
mEmergencyNumberSourceBitmask = source.readInt();
+ mEmergencyCallRouting = source.readInt();
}
+ @Override
+ /** @hide */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mNumber);
+ dest.writeString(mCountryIso);
+ dest.writeString(mMnc);
+ dest.writeInt(mEmergencyServiceCategoryBitmask);
+ dest.writeStringList(mEmergencyUrns);
+ dest.writeInt(mEmergencyNumberSourceBitmask);
+ dest.writeInt(mEmergencyCallRouting);
+ }
+
+ public static final Parcelable.Creator<EmergencyNumber> CREATOR =
+ new Parcelable.Creator<EmergencyNumber>() {
+ @Override
+ public EmergencyNumber createFromParcel(Parcel in) {
+ return new EmergencyNumber(in);
+ }
+
+ @Override
+ public EmergencyNumber[] newArray(int size) {
+ return new EmergencyNumber[size];
+ }
+ };
+
/**
* Get the dialing number of the emergency number.
*
@@ -264,6 +334,21 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
}
/**
+ * Returns the bitmask of emergency service categories of the emergency number for
+ * internal dialing.
+ *
+ * @return bitmask of the emergency service categories
+ *
+ * @hide
+ */
+ public @EmergencyServiceCategories int getEmergencyServiceCategoryBitmaskInternalDial() {
+ if (mEmergencyNumberSourceBitmask == EMERGENCY_NUMBER_SOURCE_DATABASE) {
+ return EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
+ }
+ return mEmergencyServiceCategoryBitmask;
+ }
+
+ /**
* Returns the emergency service categories of the emergency number.
*
* Note: if the emergency number is in {@link #EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED}, only
@@ -287,6 +372,22 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
}
/**
+ * Returns the list of emergency Uniform Resources Names (URN) of the emergency number.
+ *
+ * For example, {@code urn:service:sos} is the generic URN for contacting emergency services
+ * of all type.
+ *
+ * Reference: 3gpp 24.503, Section 5.1.6.8.1 - General;
+ * RFC 5031
+ *
+ * @return list of emergency Uniform Resources Names (URN) or an empty list if the emergency
+ * number does not have a specified emergency Uniform Resource Name.
+ */
+ public @NonNull List<String> getEmergencyUrns() {
+ return mEmergencyUrns;
+ }
+
+ /**
* Checks if the emergency service category is unspecified for the emergency number
* {@link #EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED}.
*
@@ -352,14 +453,17 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
return (mEmergencyNumberSourceBitmask & sources) == sources;
}
- @Override
- /** @hide */
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mNumber);
- dest.writeString(mCountryIso);
- dest.writeString(mMnc);
- dest.writeInt(mEmergencyServiceCategoryBitmask);
- dest.writeInt(mEmergencyNumberSourceBitmask);
+ /**
+ * Returns the emergency call routing information.
+ *
+ * <p>Some regions require some emergency numbers which are not routed using typical emergency
+ * call processing, but are instead placed as regular phone calls. The emergency call routing
+ * field provides information about how an emergency call will be routed when it is placed.
+ *
+ * @return the emergency call routing requirement
+ */
+ public @EmergencyCallRouting int getEmergencyCallRouting() {
+ return mEmergencyCallRouting;
}
@Override
@@ -373,7 +477,9 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
return "EmergencyNumber:" + "Number-" + mNumber + "|CountryIso-" + mCountryIso
+ "|Mnc-" + mMnc
+ "|ServiceCategories-" + Integer.toBinaryString(mEmergencyServiceCategoryBitmask)
- + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask);
+ + "|Urns-" + mEmergencyUrns
+ + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask)
+ + "|Routing-" + Integer.toBinaryString(mEmergencyCallRouting);
}
@Override
@@ -381,7 +487,20 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
if (!EmergencyNumber.class.isInstance(o)) {
return false;
}
- return (o == this || toString().equals(o.toString()));
+ EmergencyNumber other = (EmergencyNumber) o;
+ return mNumber.equals(other.mNumber)
+ && mCountryIso.equals(other.mCountryIso)
+ && mMnc.equals(other.mMnc)
+ && mEmergencyServiceCategoryBitmask == other.mEmergencyServiceCategoryBitmask
+ && mEmergencyUrns.equals(other.mEmergencyUrns)
+ && mEmergencyNumberSourceBitmask == other.mEmergencyNumberSourceBitmask
+ && mEmergencyCallRouting == other.mEmergencyCallRouting;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mNumber, mCountryIso, mMnc, mEmergencyServiceCategoryBitmask,
+ mEmergencyUrns, mEmergencyNumberSourceBitmask, mEmergencyCallRouting);
}
/**
@@ -462,12 +581,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
continue;
}
for (int j = i + 1; j < emergencyNumberList.size(); j++) {
- if (isSameEmergencyNumber(
+ if (areSameEmergencyNumbers(
emergencyNumberList.get(i), emergencyNumberList.get(j))) {
Rlog.e(LOG_TAG, "Found unexpected duplicate numbers: "
+ emergencyNumberList.get(i) + " vs " + emergencyNumberList.get(j));
// Set the merged emergency number in the current position
- emergencyNumberList.set(i, mergeNumbers(
+ emergencyNumberList.set(i, mergeSameEmergencyNumbers(
emergencyNumberList.get(i), emergencyNumberList.get(j)));
// Mark the emergency number has been merged
mergedEmergencyNumber.add(emergencyNumberList.get(j));
@@ -480,14 +599,15 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
emergencyNumberList.remove(i--);
}
}
+ Collections.sort(emergencyNumberList);
}
/**
* Check if two emergency numbers are the same.
*
* A unique EmergencyNumber has a unique combination of ‘number’, ‘mcc’, 'mnc' and
- * 'categories' fields. Multiple Emergency Number Sources should be merged into one bitfield
- * for the same EmergencyNumber.
+ * 'categories', and 'routing' fields. Multiple Emergency Number Sources should be
+ * merged into one bitfield for the same EmergencyNumber.
*
* @param first first EmergencyNumber to compare
* @param second second EmergencyNumber to compare
@@ -495,8 +615,8 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
*
* @hide
*/
- public static boolean isSameEmergencyNumber(@NonNull EmergencyNumber first,
- @NonNull EmergencyNumber second) {
+ public static boolean areSameEmergencyNumbers(@NonNull EmergencyNumber first,
+ @NonNull EmergencyNumber second) {
if (!first.getNumber().equals(second.getNumber())) {
return false;
}
@@ -510,11 +630,24 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
!= second.getEmergencyServiceCategoryBitmask()) {
return false;
}
+ if (first.getEmergencyUrns().equals(second.getEmergencyUrns())) {
+ return false;
+ }
+ if (first.getEmergencyCallRouting() != second.getEmergencyCallRouting()) {
+ return false;
+ }
+ // Never merge two numbers if one of them is from test mode but the other one is not;
+ // This supports to remove a number from the test mode.
+ if (first.isFromSources(EMERGENCY_NUMBER_SOURCE_TEST)
+ ^ second.isFromSources(EMERGENCY_NUMBER_SOURCE_TEST)) {
+ return false;
+ }
return true;
}
/**
- * Get a merged EmergencyNumber for two numbers if they are the same.
+ * Get a merged EmergencyNumber from two same emergency numbers. Two emergency numbers are
+ * the same if {@link #areSameEmergencyNumbers} returns {@code true}.
*
* @param first first EmergencyNumber to compare
* @param second second EmergencyNumber to compare
@@ -522,27 +655,25 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
*
* @hide
*/
- public static EmergencyNumber mergeNumbers(@NonNull EmergencyNumber first,
- @NonNull EmergencyNumber second) {
- if (isSameEmergencyNumber(first, second)) {
+ public static EmergencyNumber mergeSameEmergencyNumbers(@NonNull EmergencyNumber first,
+ @NonNull EmergencyNumber second) {
+ if (areSameEmergencyNumbers(first, second)) {
return new EmergencyNumber(first.getNumber(), first.getCountryIso(), first.getMnc(),
first.getEmergencyServiceCategoryBitmask(),
+ first.getEmergencyUrns(),
first.getEmergencyNumberSourceBitmask()
- | second.getEmergencyNumberSourceBitmask());
+ | second.getEmergencyNumberSourceBitmask(),
+ first.getEmergencyCallRouting());
}
return null;
}
- public static final Parcelable.Creator<EmergencyNumber> CREATOR =
- new Parcelable.Creator<EmergencyNumber>() {
- @Override
- public EmergencyNumber createFromParcel(Parcel in) {
- return new EmergencyNumber(in);
- }
-
- @Override
- public EmergencyNumber[] newArray(int size) {
- return new EmergencyNumber[size];
- }
- };
+ /**
+ * Validate Emergency Number address that only allows '0'-'9', '*', or '#'
+ *
+ * @hide
+ */
+ public static boolean validateEmergencyNumberAddress(String address) {
+ return address.matches("[0-9*#]+");
+ }
}
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index 6326cc688914..0e5c71d6ef90 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.telephony.TelephonyManager;
import com.android.internal.telephony.euicc.IEuiccController;
@@ -40,7 +41,11 @@ import java.lang.annotation.RetentionPolicy;
* EuiccManager is the application interface to eUICCs, or eSIMs/embedded SIMs.
*
* <p>You do not instantiate this class directly; instead, you retrieve an instance through
- * {@link Context#getSystemService(String)} and {@link Context#EUICC_SERVICE}.
+ * {@link Context#getSystemService(String)} and {@link Context#EUICC_SERVICE}. This instance will be
+ * created using the default eUICC.
+ *
+ * <p>On a device with multiple eUICCs, you may want to create multiple EuiccManagers. To do this
+ * you can call {@link #createForCardId}.
*
* <p>See {@link #isEnabled} before attempting to use these APIs.
*/
@@ -318,10 +323,29 @@ public class EuiccManager {
public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5;
private final Context mContext;
+ private final int mCardId;
/** @hide */
public EuiccManager(Context context) {
mContext = context;
+ TelephonyManager tm = (TelephonyManager)
+ context.getSystemService(Context.TELEPHONY_SERVICE);
+ mCardId = tm.getCardIdForDefaultEuicc();
+ }
+
+ /** @hide */
+ private EuiccManager(Context context, int cardId) {
+ mContext = context;
+ mCardId = cardId;
+ }
+
+ /**
+ * Create a new EuiccManager object pinned to the given card ID.
+ *
+ * @return an EuiccManager that uses the given card ID for all calls.
+ */
+ public EuiccManager createForCardId(int cardId) {
+ return new EuiccManager(mContext, cardId);
}
/**
@@ -337,14 +361,15 @@ public class EuiccManager {
public boolean isEnabled() {
// In the future, this may reach out to IEuiccController (if non-null) to check any dynamic
// restrictions.
- return getIEuiccController() != null;
+ return getIEuiccController() != null && mCardId != TelephonyManager.INVALID_CARD_ID;
}
/**
* Returns the EID identifying the eUICC hardware.
*
* <p>Requires that the calling app has carrier privileges on the active subscription on the
- * eUICC.
+ * current eUICC. A calling app with carrier privileges for one eUICC may not necessarily have
+ * access to the EID of another eUICC.
*
* @return the EID. May be null if {@link #isEnabled()} is false or the eUICC is not ready.
*/
@@ -354,7 +379,7 @@ public class EuiccManager {
return null;
}
try {
- return getIEuiccController().getEid();
+ return getIEuiccController().getEid(mCardId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -377,7 +402,7 @@ public class EuiccManager {
return EUICC_OTA_STATUS_UNAVAILABLE;
}
try {
- return getIEuiccController().getOtaStatus();
+ return getIEuiccController().getOtaStatus(mCardId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -387,10 +412,10 @@ public class EuiccManager {
* Attempt to download the given {@link DownloadableSubscription}.
*
* <p>Requires the {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission,
- * or the calling app must be authorized to manage both the currently-active subscription and
- * the subscription to be downloaded according to the subscription metadata. Without the former,
- * an {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be returned in the callback
- * intent to prompt the user to accept the download.
+ * or the calling app must be authorized to manage both the currently-active subscription on the
+ * current eUICC and the subscription to be downloaded according to the subscription metadata.
+ * Without the former, an {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be
+ * returned in the callback intent to prompt the user to accept the download.
*
* @param subscription the subscription to download.
* @param switchAfterDownload if true, the profile will be activated upon successful download.
@@ -404,7 +429,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().downloadSubscription(subscription, switchAfterDownload,
+ getIEuiccController().downloadSubscription(mCardId, subscription, switchAfterDownload,
mContext.getOpPackageName(), null /* resolvedBundle */, callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -471,7 +496,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().continueOperation(resolutionIntent, resolutionExtras);
+ getIEuiccController().continueOperation(mCardId, resolutionIntent, resolutionExtras);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -503,8 +528,8 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().getDownloadableSubscriptionMetadata(
- subscription, mContext.getOpPackageName(), callbackIntent);
+ getIEuiccController().getDownloadableSubscriptionMetadata(mCardId, subscription,
+ mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -533,7 +558,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().getDefaultDownloadableSubscriptionList(
+ getIEuiccController().getDefaultDownloadableSubscriptionList(mCardId,
mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -552,7 +577,7 @@ public class EuiccManager {
return null;
}
try {
- return getIEuiccController().getEuiccInfo();
+ return getIEuiccController().getEuiccInfo(mCardId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -578,7 +603,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().deleteSubscription(
+ getIEuiccController().deleteSubscription(mCardId,
subscriptionId, mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -606,7 +631,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().switchToSubscription(
+ getIEuiccController().switchToSubscription(mCardId,
subscriptionId, mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -616,14 +641,13 @@ public class EuiccManager {
/**
* Update the nickname for the given subscription.
*
- * <p>Requires that the calling app has the
- * {@link android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission. This is for
- * internal system use only.
+ * <p>Requires that the calling app has carrier privileges according to the metadata of the
+ * profile to be updated, or the
+ * {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission.
*
* @param subscriptionId the ID of the subscription to update.
* @param nickname the new nickname to apply.
* @param callbackIntent a PendingIntent to launch when the operation completes.
- * @hide
*/
@RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void updateSubscriptionNickname(
@@ -633,8 +657,8 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().updateSubscriptionNickname(
- subscriptionId, nickname, callbackIntent);
+ getIEuiccController().updateSubscriptionNickname(mCardId,
+ subscriptionId, nickname, mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -657,7 +681,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().eraseSubscriptions(callbackIntent);
+ getIEuiccController().eraseSubscriptions(mCardId, callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -687,7 +711,7 @@ public class EuiccManager {
return;
}
try {
- getIEuiccController().retainSubscriptionsForFactoryReset(callbackIntent);
+ getIEuiccController().retainSubscriptionsForFactoryReset(mCardId, callbackIntent);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java
index 38341d0c32e0..1eb505956603 100644
--- a/telephony/java/android/telephony/ims/ImsCallProfile.java
+++ b/telephony/java/android/telephony/ims/ImsCallProfile.java
@@ -24,13 +24,17 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.telecom.VideoProfile;
import android.telephony.emergency.EmergencyNumber;
+import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting;
import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.PhoneConstants;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
/**
* Parcelable object to handle IMS call profile.
@@ -326,6 +330,32 @@ public final class ImsCallProfile implements Parcelable {
EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
/**
+ * The emergency Uniform Resource Names (URN), only valid if {@link #getServiceType} returns
+ * {@link #SERVICE_TYPE_EMERGENCY}.
+ *
+ * Reference: 3gpp 24.503, Section 5.1.6.8.1 - General;
+ * 3gpp 22.101, Section 10 - Emergency Calls.
+ */
+ private List<String> mEmergencyUrns = new ArrayList<>();
+
+ /**
+ * The emergency call routing, only valid if {@link #getServiceType} returns
+ * {@link #SERVICE_TYPE_EMERGENCY}
+ *
+ * If valid, the value is any of the following constants:
+ * <ol>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li>
+ * </ol>
+ */
+ private @EmergencyCallRouting int mEmergencyCallRouting =
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
+
+ /** Indicates if the call is for testing purpose */
+ private boolean mEmergencyCallTesting = false;
+
+ /**
* Extras associated with this {@link ImsCallProfile}.
* <p>
* Valid data types include:
@@ -508,10 +538,14 @@ public final class ImsCallProfile implements Parcelable {
@Override
public String toString() {
- return "{ serviceType=" + mServiceType +
- ", callType=" + mCallType +
- ", restrictCause=" + mRestrictCause +
- ", mediaProfile=" + mMediaProfile.toString() + " }";
+ return "{ serviceType=" + mServiceType
+ + ", callType=" + mCallType
+ + ", restrictCause=" + mRestrictCause
+ + ", mediaProfile=" + mMediaProfile.toString()
+ + ", emergencyServiceCategories=" + mEmergencyServiceCategories
+ + ", emergencyUrns=" + mEmergencyUrns
+ + ", emergencyCallRouting=" + mEmergencyCallRouting
+ + ", emergencyCallTesting=" + mEmergencyCallTesting + " }";
}
@Override
@@ -527,6 +561,9 @@ public final class ImsCallProfile implements Parcelable {
out.writeBundle(filteredExtras);
out.writeParcelable(mMediaProfile, 0);
out.writeInt(mEmergencyServiceCategories);
+ out.writeStringList(mEmergencyUrns);
+ out.writeInt(mEmergencyCallRouting);
+ out.writeBoolean(mEmergencyCallTesting);
}
private void readFromParcel(Parcel in) {
@@ -535,6 +572,9 @@ public final class ImsCallProfile implements Parcelable {
mCallExtras = in.readBundle();
mMediaProfile = in.readParcelable(ImsStreamMediaProfile.class.getClassLoader());
mEmergencyServiceCategories = in.readInt();
+ mEmergencyUrns = in.createStringArrayList();
+ mEmergencyCallRouting = in.readInt();
+ mEmergencyCallTesting = in.readBoolean();
}
public static final Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() {
@@ -745,6 +785,24 @@ public final class ImsCallProfile implements Parcelable {
}
/**
+ * Set the emergency number information. The set value is valid
+ * only if {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY}
+ *
+ * Reference: 3gpp 23.167, Section 6 - Functional description;
+ * 3gpp 24.503, Section 5.1.6.8.1 - General;
+ * 3gpp 22.101, Section 10 - Emergency Calls.
+ *
+ * @hide
+ */
+ public void setEmergencyCallInfo(EmergencyNumber num) {
+ setEmergencyServiceCategories(num.getEmergencyServiceCategoryBitmaskInternalDial());
+ setEmergencyUrns(num.getEmergencyUrns());
+ setEmergencyCallRouting(num.getEmergencyCallRouting());
+ setEmergencyCallTesting(num.getEmergencyNumberSourceBitmask()
+ == EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST);
+ }
+
+ /**
* Set the emergency service categories. The set value is valid only if
* {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY}
*
@@ -763,12 +821,50 @@ public final class ImsCallProfile implements Parcelable {
* Reference: 3gpp 23.167, Section 6 - Functional description;
* 3gpp 22.101, Section 10 - Emergency Calls.
*/
+ @VisibleForTesting
public void setEmergencyServiceCategories(
@EmergencyServiceCategories int emergencyServiceCategories) {
mEmergencyServiceCategories = emergencyServiceCategories;
}
/**
+ * Set the emergency Uniform Resource Names (URN), only valid if {@link #getServiceType}
+ * returns {@link #SERVICE_TYPE_EMERGENCY}.
+ *
+ * Reference: 3gpp 24.503, Section 5.1.6.8.1 - General;
+ * 3gpp 22.101, Section 10 - Emergency Calls.
+ */
+ @VisibleForTesting
+ public void setEmergencyUrns(List<String> emergencyUrns) {
+ mEmergencyUrns = emergencyUrns;
+ }
+
+ /**
+ * Set the emergency call routing, only valid if {@link #getServiceType} returns
+ * {@link #SERVICE_TYPE_EMERGENCY}
+ *
+ * If valid, the value is any of the following constants:
+ * <ol>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li>
+ * </ol>
+ */
+ @VisibleForTesting
+ public void setEmergencyCallRouting(@EmergencyCallRouting int emergencyCallRouting) {
+ mEmergencyCallRouting = emergencyCallRouting;
+ }
+
+ /**
+ * Set if this is for testing emergency call, only valid if {@link #getServiceType} returns
+ * {@link #SERVICE_TYPE_EMERGENCY}.
+ */
+ @VisibleForTesting
+ public void setEmergencyCallTesting(boolean isTesting) {
+ mEmergencyCallTesting = isTesting;
+ }
+
+ /**
* Get the emergency service categories, only valid if {@link #getServiceType} returns
* {@link #SERVICE_TYPE_EMERGENCY}
*
@@ -792,4 +888,37 @@ public final class ImsCallProfile implements Parcelable {
public @EmergencyServiceCategories int getEmergencyServiceCategories() {
return mEmergencyServiceCategories;
}
+
+ /**
+ * Get the emergency Uniform Resource Names (URN), only valid if {@link #getServiceType}
+ * returns {@link #SERVICE_TYPE_EMERGENCY}.
+ *
+ * Reference: 3gpp 24.503, Section 5.1.6.8.1 - General;
+ * 3gpp 22.101, Section 10 - Emergency Calls.
+ */
+ public List<String> getEmergencyUrns() {
+ return mEmergencyUrns;
+ }
+
+ /**
+ * Get the emergency call routing, only valid if {@link #getServiceType} returns
+ * {@link #SERVICE_TYPE_EMERGENCY}
+ *
+ * If valid, the value is any of the following constants:
+ * <ol>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li>
+ * </ol>
+ */
+ public @EmergencyCallRouting int getEmergencyCallRouting() {
+ return mEmergencyCallRouting;
+ }
+
+ /**
+ * Get if the emergency call is for testing purpose.
+ */
+ public boolean isEmergencyCallTesting() {
+ return mEmergencyCallTesting;
+ }
}
diff --git a/telephony/java/android/telephony/ims/ImsCallSession.java b/telephony/java/android/telephony/ims/ImsCallSession.java
index b6c1b6c060a6..16018978fb8d 100644
--- a/telephony/java/android/telephony/ims/ImsCallSession.java
+++ b/telephony/java/android/telephony/ims/ImsCallSession.java
@@ -18,6 +18,7 @@ package android.telephony.ims;
import android.os.Message;
import android.os.RemoteException;
+import android.telephony.CallQuality;
import android.telephony.ims.aidl.IImsCallSessionListener;
import android.util.Log;
@@ -453,6 +454,20 @@ public class ImsCallSession {
public void callSessionPropertyChanged(int property) {
// no-op
}
+
+ /**
+ * While in call, there has been a change in RTT audio indicator.
+ */
+ public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Called when the IMS service reports a change to the call quality.
+ */
+ public void callQualityChanged(CallQuality callQuality) {
+ // no-op
+ }
}
private final IImsCallSession miSession;
@@ -1420,6 +1435,26 @@ public class ImsCallSession {
mListener.callSessionPropertyChanged(property);
}
}
+
+ /**
+ * While in call, there has been a change in RTT audio indicator.
+ */
+ @Override
+ public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionRttAudioIndicatorChanged(profile);
+ }
+ }
+
+ /**
+ * Call quality updated
+ */
+ @Override
+ public void callQualityChanged(CallQuality callQuality) {
+ if (mListener != null) {
+ mListener.callQualityChanged(callQuality);
+ }
+ }
}
/**
diff --git a/telephony/java/android/telephony/ims/ImsCallSessionListener.java b/telephony/java/android/telephony/ims/ImsCallSessionListener.java
index 0c952b64cd26..6cf5a193889e 100644
--- a/telephony/java/android/telephony/ims/ImsCallSessionListener.java
+++ b/telephony/java/android/telephony/ims/ImsCallSessionListener.java
@@ -18,6 +18,7 @@ package android.telephony.ims;
import android.annotation.SystemApi;
import android.os.RemoteException;
+import android.telephony.CallQuality;
import android.telephony.ims.aidl.IImsCallSessionListener;
import android.telephony.ims.stub.ImsCallSessionImplBase;
@@ -613,5 +614,31 @@ public class ImsCallSessionListener {
throw new RuntimeException(e);
}
}
+
+ /**
+ * While in call, there has been a change in RTT audio indicator.
+ *
+ * @param profile updated ImsStreamMediaProfile
+ */
+ public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
+ try {
+ mListener.callSessionRttAudioIndicatorChanged(profile);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * The call quality has changed.
+ *
+ * @param callQuality The new call quality
+ */
+ public void callQualityChanged(CallQuality callQuality) {
+ try {
+ mListener.callQualityChanged(callQuality);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index 122626f0c77a..9414abd98b1c 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -92,7 +92,7 @@ public class ImsMmTelManager {
public static final int WIFI_MODE_WIFI_PREFERRED = 2;
/**
- * Callback class for receiving Registration callback events.
+ * Callback class for receiving IMS network Registration callback events.
* @see #registerImsRegistrationCallback(Executor, RegistrationCallback) (RegistrationCallback)
* @see #unregisterImsRegistrationCallback(RegistrationCallback)
*/
@@ -241,7 +241,8 @@ public class ImsMmTelManager {
}
/**
- * Receives IMS capability status updates from the ImsService.
+ * Receives IMS capability status updates from the ImsService. This information is also
+ * available via the {@link #isAvailable(int, int)} method below.
*
* @see #registerMmTelCapabilityCallback(Executor, CapabilityCallback) (CapabilityCallback)
* @see #unregisterMmTelCapabilityCallback(CapabilityCallback)
@@ -290,6 +291,8 @@ public class ImsMmTelManager {
* If unavailable, the feature is not able to support the unavailable capability at this
* time.
*
+ * This information can also be queried using the {@link #isAvailable(int, int)} API.
+ *
* @param capabilities The new availability of the capabilities.
*/
public void onCapabilitiesStatusChanged(
@@ -304,7 +307,7 @@ public class ImsMmTelManager {
/**@hide*/
// Only exposed as public method for compatibility with deprecated ImsManager APIs.
// TODO: clean up dependencies and change back to private visibility.
- public void setExecutor(Executor executor) {
+ public final void setExecutor(Executor executor) {
mBinder.setExecutor(executor);
}
}
@@ -342,8 +345,7 @@ public class ImsMmTelManager {
* Registers a {@link RegistrationCallback} with the system, which will provide registration
* updates for the subscription specified in {@link #createForSubscriptionId(Context, int)}. Use
* {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to Subscription changed
- * events and call {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up
- * after a subscription is removed.
+ * events and call {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up.
*
* When the callback is registered, it will initiate the callback c to be called with the
* current registration state.
@@ -351,6 +353,12 @@ public class ImsMmTelManager {
* @param executor The executor the callback events should be run on.
* @param c The {@link RegistrationCallback} to be added.
* @see #unregisterImsRegistrationCallback(RegistrationCallback)
+ * @throws IllegalArgumentException if the subscription associated with this callback is not
+ * active (SIM is not inserted, ESIM inactive) or invalid, or a null {@link Executor} or
+ * {@link CapabilityCallback} callback.
+ * @throws IllegalStateException if the subscription associated with this callback is valid, but
+ * the {@link ImsService} associated with the subscription is not available. This can happen if
+ * the service crashed, for example.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerImsRegistrationCallback(@CallbackExecutor Executor executor,
@@ -370,11 +378,17 @@ public class ImsMmTelManager {
}
/**
- * Removes an existing {@link RegistrationCallback}. Ensure to call this method when cleaning
- * up to avoid memory leaks or when the subscription is removed.
+ * Removes an existing {@link RegistrationCallback}.
+ *
+ * When the subscription associated with this callback is removed (SIM removed, ESIM swap,
+ * etc...), this callback will automatically be removed. If this method is called for an
+ * inactive subscription, it will result in a no-op.
+ *
* @param c The {@link RegistrationCallback} to be removed.
* @see SubscriptionManager.OnSubscriptionsChangedListener
* @see #registerImsRegistrationCallback(Executor, RegistrationCallback)
+ * @throws IllegalArgumentException if the subscription ID associated with this callback is
+ * invalid.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterImsRegistrationCallback(@NonNull RegistrationCallback c) {
@@ -389,12 +403,14 @@ public class ImsMmTelManager {
}
/**
- * Registers a {@link CapabilityCallback} with the system, which will provide MmTel capability
- * updates for the subscription specified in {@link #createForSubscriptionId(Context, int)}.
+ * Registers a {@link CapabilityCallback} with the system, which will provide MmTel service
+ * availability updates for the subscription specified in
+ * {@link #createForSubscriptionId(Context, int)}. The method {@link #isAvailable(int, int)}
+ * can also be used to query this information at any time.
+ *
* Use {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to
* subscription changed events and call
- * {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up after a
- * subscription is removed.
+ * {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up.
*
* When the callback is registered, it will initiate the callback c to be called with the
* current capabilities.
@@ -402,9 +418,15 @@ public class ImsMmTelManager {
* @param executor The executor the callback events should be run on.
* @param c The MmTel {@link CapabilityCallback} to be registered.
* @see #unregisterMmTelCapabilityCallback(CapabilityCallback)
+ * @throws IllegalArgumentException if the subscription associated with this callback is not
+ * active (SIM is not inserted, ESIM inactive) or invalid, or a null {@link Executor} or
+ * {@link CapabilityCallback} callback.
+ * @throws IllegalStateException if the subscription associated with this callback is valid, but
+ * the {@link ImsService} associated with the subscription is not available. This can happen if
+ * the service crashed, for example.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
- public void registerMmTelCapabilityCallback(@CallbackExecutor Executor executor,
+ public void registerMmTelCapabilityCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull CapabilityCallback c) {
if (c == null) {
throw new IllegalArgumentException("Must include a non-null RegistrationCallback.");
@@ -421,10 +443,15 @@ public class ImsMmTelManager {
}
/**
- * Removes an existing MmTel {@link CapabilityCallback}. Be sure to call this when cleaning
- * up to avoid memory leaks.
+ * Removes an existing MmTel {@link CapabilityCallback}.
+ *
+ * When the subscription associated with this callback is removed (SIM removed, ESIM swap,
+ * etc...), this callback will automatically be removed. If this method is called for an
+ * inactive subscription, it will result in a no-op.
* @param c The MmTel {@link CapabilityCallback} to be removed.
* @see #registerMmTelCapabilityCallback(Executor, CapabilityCallback)
+ * @throws IllegalArgumentException if the subscription ID associated with this callback is
+ * invalid.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterMmTelCapabilityCallback(@NonNull CapabilityCallback c) {
@@ -714,7 +741,7 @@ public class ImsMmTelManager {
* @see #setVoWiFiRoamingSetting(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
- @WiFiCallingMode int getVoWiFiRoamingModeSetting() {
+ public @WiFiCallingMode int getVoWiFiRoamingModeSetting() {
try {
return getITelephony().getVoWiFiRoamingModeSetting(mSubId);
} catch (RemoteException e) {
diff --git a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java
index 52d72b5847b5..837ef54a2f24 100644
--- a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java
+++ b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java
@@ -97,6 +97,9 @@ public final class ImsStreamMediaProfile implements Parcelable {
// Rtt related information
/** @hide */
public int mRttMode;
+ // RTT Audio Speech Indicator
+ /** @hide */
+ public boolean mHasRttAudioSpeech = false;
/** @hide */
public ImsStreamMediaProfile(Parcel in) {
@@ -197,7 +200,8 @@ public final class ImsStreamMediaProfile implements Parcelable {
", audioDirection=" + mAudioDirection +
", videoQuality=" + mVideoQuality +
", videoDirection=" + mVideoDirection +
- ", rttMode=" + mRttMode + " }";
+ ", rttMode=" + mRttMode +
+ ", hasRttAudioSpeech=" + mHasRttAudioSpeech + " }";
}
@Override
@@ -212,6 +216,7 @@ public final class ImsStreamMediaProfile implements Parcelable {
out.writeInt(mVideoQuality);
out.writeInt(mVideoDirection);
out.writeInt(mRttMode);
+ out.writeBoolean(mHasRttAudioSpeech);
}
private void readFromParcel(Parcel in) {
@@ -220,6 +225,7 @@ public final class ImsStreamMediaProfile implements Parcelable {
mVideoQuality = in.readInt();
mVideoDirection = in.readInt();
mRttMode = in.readInt();
+ mHasRttAudioSpeech = in.readBoolean();
}
public static final Creator<ImsStreamMediaProfile> CREATOR =
@@ -250,6 +256,10 @@ public final class ImsStreamMediaProfile implements Parcelable {
mRttMode = rttMode;
}
+ public void setRttAudioSpeech(boolean audioOn) {
+ mHasRttAudioSpeech = audioOn;
+ }
+
public int getAudioQuality() {
return mAudioQuality;
}
@@ -269,4 +279,8 @@ public final class ImsStreamMediaProfile implements Parcelable {
public int getRttMode() {
return mRttMode;
}
+
+ public boolean getRttAudioSpeech() {
+ return mHasRttAudioSpeech;
+ }
}
diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java
index 916e282f642e..d37198a3e25d 100644
--- a/telephony/java/android/telephony/ims/ProvisioningManager.java
+++ b/telephony/java/android/telephony/ims/ProvisioningManager.java
@@ -133,33 +133,40 @@ public class ProvisioningManager {
}
/**
- * Register a new {@link Callback} to listen to changes to changes in
- * IMS provisioning. Use {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to
- * Subscription changed events and call
- * {@link #unregisterProvisioningChangedCallback(Callback)} to clean up after a
- * subscription is removed.
+ * Register a new {@link Callback} to listen to changes to changes in IMS provisioning.
+ *
+ * When the subscription associated with this callback is removed (SIM removed, ESIM swap,
+ * etc...), this callback will automatically be removed.
* @param executor The {@link Executor} to call the callback methods on
* @param callback The provisioning callbackto be registered.
* @see #unregisterProvisioningChangedCallback(Callback)
* @see SubscriptionManager.OnSubscriptionsChangedListener
+ * @throws IllegalArgumentException if the subscription associated with this callback is not
+ * active (SIM is not inserted, ESIM inactive) or the subscription is invalid.
+ * @throws IllegalStateException if the subscription associated with this callback is valid, but
+ * the {@link ImsService} associated with the subscription is not available. This can happen if
+ * the service crashed, for example.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerProvisioningChangedCallback(@CallbackExecutor Executor executor,
@NonNull Callback callback) {
callback.setExecutor(executor);
try {
- getITelephony().registerImsProvisioningChangedCallback(mSubId,
- callback.getBinder());
+ getITelephony().registerImsProvisioningChangedCallback(mSubId, callback.getBinder());
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
}
/**
- * Unregister an existing {@link Callback}. Ensure to call this method when cleaning
- * up to avoid memory leaks or when the subscription is removed.
+ * Unregister an existing {@link Callback}. When the subscription associated with this
+ * callback is removed (SIM removed, ESIM swap, etc...), this callback will automatically be
+ * removed. If this method is called for an inactive subscription, it will result in a no-op.
* @param callback The existing {@link Callback} to be removed.
* @see #registerProvisioningChangedCallback(Executor, Callback)
+ *
+ * @throws IllegalArgumentException if the subscription associated with this callback is
+ * invalid.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterProvisioningChangedCallback(@NonNull Callback callback) {
diff --git a/telephony/java/android/telephony/ims/RcsParticipant.java b/telephony/java/android/telephony/ims/RcsParticipant.java
index 70500aaa2e8b..f678ec7e435b 100644
--- a/telephony/java/android/telephony/ims/RcsParticipant.java
+++ b/telephony/java/android/telephony/ims/RcsParticipant.java
@@ -15,22 +15,111 @@
*/
package android.telephony.ims;
+import static android.telephony.ims.RcsMessageStore.TAG;
+
+import android.annotation.NonNull;
+import android.annotation.WorkerThread;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.telephony.Rlog;
+import android.telephony.ims.aidl.IRcs;
+import android.text.TextUtils;
+
+import com.android.internal.util.Preconditions;
/**
* RcsParticipant is an RCS capable contact that can participate in {@link RcsThread}s.
* @hide - TODO(sahinc) make this public
*/
public class RcsParticipant implements Parcelable {
+ // The row ID of this participant in the database
+ private int mId;
+ // The phone number of this participant
+ private String mCanonicalAddress;
+ // The RCS alias of this participant. This is different than the name of the contact in the
+ // Contacts app - i.e. RCS protocol allows users to define aliases for themselves that doesn't
+ // require other users to add them as contacts and give them a name.
+ private String mAlias;
+
/**
- * Returns the row id of this participant.
+ * Constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
+ * to create instances of participants. This is not meant to be part of the SDK.
+ *
+ * @hide
+ */
+ public RcsParticipant(int id, @NonNull String canonicalAddress) {
+ mId = id;
+ mCanonicalAddress = canonicalAddress;
+ }
+
+ /**
+ * @return Returns the canonical address (i.e. normalized phone number) for this participant
+ */
+ public String getCanonicalAddress() {
+ return mCanonicalAddress;
+ }
+
+ /**
+ * Sets the canonical address for this participant and updates it in storage.
+ * @param canonicalAddress the canonical address to update to.
+ */
+ @WorkerThread
+ public void setCanonicalAddress(@NonNull String canonicalAddress) {
+ Preconditions.checkNotNull(canonicalAddress);
+ if (canonicalAddress.equals(mCanonicalAddress)) {
+ return;
+ }
+
+ mCanonicalAddress = canonicalAddress;
+
+ try {
+ IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
+ if (iRcs != null) {
+ iRcs.updateRcsParticipantCanonicalAddress(mId, mCanonicalAddress);
+ }
+ } catch (RemoteException re) {
+ Rlog.e(TAG, "RcsParticipant: Exception happened during setCanonicalAddress", re);
+ }
+ }
+
+ /**
+ * @return Returns the alias for this participant. Alias is usually the real name of the person
+ * themselves.
+ */
+ public String getAlias() {
+ return mAlias;
+ }
+
+ /**
+ * Sets the alias for this participant and persists it in storage. Alias is usually the real
+ * name of the person themselves.
+ */
+ @WorkerThread
+ public void setAlias(String alias) {
+ if (TextUtils.equals(mAlias, alias)) {
+ return;
+ }
+ mAlias = alias;
+
+ try {
+ IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
+ if (iRcs != null) {
+ iRcs.updateRcsParticipantAlias(mId, mAlias);
+ }
+ } catch (RemoteException re) {
+ Rlog.e(TAG, "RcsParticipant: Exception happened during setCanonicalAddress", re);
+ }
+ }
+
+ /**
+ * Returns the row id of this participant. This is not meant to be part of the SDK
*
- * TODO(sahinc) implement
* @hide
*/
public int getId() {
- return 12345;
+ return mId;
}
public static final Creator<RcsParticipant> CREATOR = new Creator<RcsParticipant>() {
@@ -46,6 +135,9 @@ public class RcsParticipant implements Parcelable {
};
protected RcsParticipant(Parcel in) {
+ mId = in.readInt();
+ mCanonicalAddress = in.readString();
+ mAlias = in.readString();
}
@Override
@@ -55,6 +147,8 @@ public class RcsParticipant implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
-
+ dest.writeInt(mId);
+ dest.writeString(mCanonicalAddress);
+ dest.writeString(mAlias);
}
}
diff --git a/telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl b/telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl
index 765f43bd4581..71f1aa45a79d 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl
@@ -16,6 +16,7 @@
package android.telephony.ims.aidl;
+import android.telephony.CallQuality;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsReasonInfo;
@@ -126,14 +127,15 @@ oneway interface IImsCallSessionListener {
*/
void callSessionRttModifyRequestReceived(in ImsCallProfile callProfile);
- /* Device issued RTT modify request and inturn received response
+ /**
+ * Device issued RTT modify request and inturn received response
* from Remote UE
* @param status Will be one of the following values from:
* - {@link Connection.RttModifyStatus}
*/
void callSessionRttModifyResponseReceived(int status);
- /*
+ /**
* While in call, device received RTT message from Remote UE
* @param rttMessage Received RTT message
*/
@@ -146,4 +148,16 @@ oneway interface IImsCallSessionListener {
* {e.g. @see Connection#PROPERTY_RTT_AUDIO_SPEECH}
*/
void callSessionPropertyChanged(in int property);
+
+ /**
+ * While in call, there has been a change in RTT audio indicator.
+ * @param profile updated ImsStreamMediaProfile
+ */
+ void callSessionRttAudioIndicatorChanged(in ImsStreamMediaProfile profile);
+
+ /**
+ * Notifies of a change to the call quality.
+ * @param callQuality then updated call quality
+ */
+ void callQualityChanged(in CallQuality callQuality);
}
diff --git a/telephony/java/android/telephony/ims/aidl/IRcs.aidl b/telephony/java/android/telephony/ims/aidl/IRcs.aidl
index 9badac5be230..0c958ba719f3 100644
--- a/telephony/java/android/telephony/ims/aidl/IRcs.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IRcs.aidl
@@ -37,8 +37,13 @@ interface IRcs {
Rcs1To1Thread createRcs1To1Thread(in RcsParticipant participant);
- RcsParticipant createRcsParticipant(String canonicalAddress);
-
// RcsThread APIs
int getMessageCount(int rcsThreadId);
+
+ // RcsParticipant APIs
+ RcsParticipant createRcsParticipant(String canonicalAddress);
+
+ void updateRcsParticipantCanonicalAddress(int id, String canonicalAddress);
+
+ void updateRcsParticipantAlias(int id, String alias);
} \ No newline at end of file
diff --git a/telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java b/telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java
index f8266bc41201..6c1b5d40813c 100644
--- a/telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java
+++ b/telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java
@@ -18,19 +18,18 @@ package android.telephony.ims.compat.stub;
import android.os.Message;
import android.os.RemoteException;
-
+import android.telephony.CallQuality;
import android.telephony.ims.ImsCallProfile;
+import android.telephony.ims.ImsCallSession;
import android.telephony.ims.ImsConferenceState;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.ImsSuppServiceNotification;
import android.telephony.ims.aidl.IImsCallSessionListener;
+
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsVideoCallProvider;
-import android.annotation.UnsupportedAppUsage;
-import android.telephony.ims.ImsCallSession;
-
/**
* Compat implementation of ImsCallSessionImplBase for older implementations.
*
@@ -596,5 +595,16 @@ public class ImsCallSessionImplBase extends IImsCallSession.Stub {
public void callSessionPropertyChanged(int property) throws RemoteException {
mNewListener.callSessionPropertyChanged(property);
}
+
+ @Override
+ public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile)
+ throws RemoteException {
+ mNewListener.callSessionRttAudioIndicatorChanged(profile);
+ }
+
+ @Override
+ public void callQualityChanged(CallQuality callQuality) throws RemoteException {
+ mNewListener.callQualityChanged(callQuality);
+ }
}
}
diff --git a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
index 52d3822cd4f8..ffa36537ea97 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
@@ -16,6 +16,7 @@
package com.android.ims.internal;
+import android.telephony.CallQuality;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsReasonInfo;
@@ -140,14 +141,15 @@ oneway interface IImsCallSessionListener {
void callSessionRttModifyRequestReceived(in IImsCallSession session,
in ImsCallProfile callProfile);
- /* Device issued RTT modify request and inturn received response
+ /**
+ * Device issued RTT modify request and inturn received response
* from Remote UE
* @param status Will be one of the following values from:
* - {@link Connection.RttModifyStatus}
*/
void callSessionRttModifyResponseReceived(in int status);
- /*
+ /**
* While in call, device received RTT message from Remote UE
* @param rttMessage Received RTT message
*/
@@ -160,4 +162,16 @@ oneway interface IImsCallSessionListener {
* {e.g. @see Connection#PROPERTY_RTT_AUDIO_SPEECH}
*/
void callSessionPropertyChanged(in int property);
+
+ /**
+ * While in call, there has been a change in RTT audio indicator.
+ * @param profile updated ImsStreamMediaProfile
+ */
+ void callSessionRttAudioIndicatorChanged(in ImsStreamMediaProfile profile);
+
+ /**
+ * Notifies of a change to the call quality.
+ * @param callQuality then updated call quality
+ */
+ void callQualityChanged(in CallQuality callQuality);
}
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 96f7a1bc22a0..6e8d038eda4f 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -66,7 +66,8 @@ public class DctConstants {
public static final int EVENT_DATA_CONNECTION_DETACHED = BASE + 9;
public static final int EVENT_ROAMING_ON = BASE + 11;
public static final int EVENT_ROAMING_OFF = BASE + 12;
- public static final int EVENT_ENABLE_NEW_APN = BASE + 13;
+ public static final int EVENT_ENABLE_APN = BASE + 13;
+ public static final int EVENT_DISABLE_APN = BASE + 14;
public static final int EVENT_DISCONNECT_DONE = BASE + 15;
public static final int EVENT_DATA_CONNECTION_ATTACHED = BASE + 16;
public static final int EVENT_DATA_STALL_ALARM = BASE + 17;
@@ -86,12 +87,13 @@ public class DctConstants {
public static final int CMD_NET_STAT_POLL = BASE + 40;
public static final int EVENT_DATA_RAT_CHANGED = BASE + 41;
public static final int CMD_CLEAR_PROVISIONING_SPINNER = BASE + 42;
- public static final int EVENT_REDIRECTION_DETECTED = BASE + 44;
+ public static final int EVENT_NETWORK_STATUS_CHANGED = BASE + 44;
public static final int EVENT_PCO_DATA_RECEIVED = BASE + 45;
public static final int EVENT_DATA_ENABLED_CHANGED = BASE + 46;
public static final int EVENT_DATA_RECONNECT = BASE + 47;
public static final int EVENT_ROAMING_SETTING_CHANGE = BASE + 48;
public static final int EVENT_DATA_SERVICE_BINDING_CHANGED = BASE + 49;
+ public static final int EVENT_DEVICE_PROVISIONED_CHANGE = BASE + 50;
/***** Constants *****/
diff --git a/telephony/java/com/android/internal/telephony/IAns.aidl b/telephony/java/com/android/internal/telephony/IOns.aidl
index 98bcd415a1ca..0e3d12b7f838 100755
--- a/telephony/java/com/android/internal/telephony/IAns.aidl
+++ b/telephony/java/com/android/internal/telephony/IOns.aidl
@@ -18,13 +18,13 @@ package com.android.internal.telephony;
import android.telephony.AvailableNetworkInfo;
-interface IAns {
+interface IOns {
/**
- * Enable or disable Alternative Network service.
+ * Enable or disable Opportunistic Network service.
*
* This method should be called to enable or disable
- * AlternativeNetwork service on the device.
+ * OpportunisticNetwork service on the device.
*
* <p>
* Requires Permission:
@@ -38,9 +38,9 @@ interface IAns {
boolean setEnable(boolean enable, String callingPackage);
/**
- * is Alternative Network service enabled
+ * is Opportunistic Network service enabled
*
- * This method should be called to determine if the Alternative Network service is enabled
+ * This method should be called to determine if the Opportunistic Network service is enabled
*
* <p>
* Requires Permission:
@@ -66,7 +66,7 @@ interface IAns {
* @return true if request is accepted, else false.
*
*/
- boolean setPreferredData(int subId, String callingPackage);
+ boolean setPreferredDataSubscriptionId(int subId, String callingPackage);
/**
* Get preferred opportunistic data subscription Id
@@ -78,13 +78,13 @@ interface IAns {
* subscription id
*
*/
- int getPreferredData(String callingPackage);
+ int getPreferredDataSubscriptionId(String callingPackage);
/**
* Update availability of a list of networks in the current location.
*
* This api should be called if the caller is aware of the availability of a network
- * at the current location. This information will be used by AlternativeNetwork service
+ * at the current location. This information will be used by OpportunisticNetwork service
* to decide to attach to the network. If an empty list is passed,
* it is assumed that no network is available.
* Requires that the calling app has carrier privileges on both primary and
diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
index 00cf9c3577ec..3dbebe832fac 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -17,14 +17,15 @@
package com.android.internal.telephony;
import android.os.Bundle;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
+import android.telephony.CallAttributes;
import android.telephony.CellInfo;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.PhoneCapability;
import android.telephony.PhysicalChannelConfig;
import android.telephony.PreciseCallState;
import android.telephony.PreciseDataConnectionState;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
import android.telephony.emergency.EmergencyNumber;
oneway interface IPhoneStateListener {
@@ -54,6 +55,7 @@ oneway interface IPhoneStateListener {
void onPhoneCapabilityChanged(in PhoneCapability capability);
void onPreferredDataSubIdChanged(in int subId);
void onRadioPowerStateChanged(in int state);
+ void onCallAttributesChanged(in CallAttributes callAttributes);
void onEmergencyNumberListChanged(in Map emergencyNumberList);
void onCallDisconnectCauseChanged(in int disconnectCause, in int preciseDisconnectCause);
}
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index d169b7d04f5c..577ddbda50fa 100755
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -200,7 +200,15 @@ interface ISub {
* @hide
*
*/
- int setPreferredData(int subId);
+ int setPreferredDataSubscriptionId(int subId);
+
+ /**
+ * Get which subscription is preferred for cellular data.
+ *
+ * @hide
+ *
+ */
+ int getPreferredDataSubscriptionId();
/**
* Get User downloaded Profiles.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index c5d82c5949f0..5736a465d449 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -28,6 +28,7 @@ import android.net.Uri;
import android.service.carrier.CarrierIdentifier;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.ClientRequestStats;
import android.telephony.IccOpenLogicalChannelResponse;
@@ -41,6 +42,7 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyHistogram;
import android.telephony.VisualVoicemailSmsFilterSettings;
+import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback;
@@ -1292,22 +1294,27 @@ interface ITelephony {
List<TelephonyHistogram> getTelephonyHistograms();
/**
- * Set the allowed carrier list for slotIndex
- * Require system privileges. In the future we may add this to carrier APIs.
+ * Set the allowed carrier list and the excluded carrier list, indicating the priority between
+ * the two lists.
*
- * @return The number of carriers set successfully. Should match length of
- * carriers on success.
+ * <p>Requires system privileges. In the future we may add this to carrier APIs.
+ *
+ * @return {@link #SET_CARRIER_RESTRICTION_SUCCESS} in case of success.
+ * {@link #SET_CARRIER_RESTRICTION_NOT_SUPPORTED} if the modem does not support the
+ * configuration. {@link #SET_CARRIER_RESTRICTION_ERROR} in all other error cases.
*/
- int setAllowedCarriers(int slotIndex, in List<CarrierIdentifier> carriers);
+ int setAllowedCarriers(in CarrierRestrictionRules carrierRestrictionRules);
/**
- * Get the allowed carrier list for slotIndex.
- * Require system privileges. In the future we may add this to carrier APIs.
+ * Get the allowed carrier list and the excluded carrier list indicating the priority between
+ * the two lists.
+ *
+ * <p>Requires system privileges. In the future we may add this to carrier APIs.
*
- * @return List of {@link android.service.carrier.CarrierIdentifier}; empty list
- * means all carriers are allowed.
+ * @return {@link CarrierRestrictionRules}; empty lists mean all carriers are allowed. It
+ * returns null in case of error.
*/
- List<CarrierIdentifier> getAllowedCarriers(int slotIndex);
+ CarrierRestrictionRules getAllowedCarriers();
/**
* Returns carrier id of the given subscription.
@@ -1776,4 +1783,19 @@ interface ITelephony {
* Set the String provisioning value for the provisioning key specified.
*/
int setImsProvisioningString(int subId, int key, String value);
+
+ /**
+ * Update Emergency Number List for Test Mode.
+ */
+ void updateEmergencyNumberListTestMode(int action, in EmergencyNumber num);
+
+ /**
+ * Get the full emergency number list for Test Mode.
+ */
+ List<String> getEmergencyNumberListTestMode();
+
+ /**
+ * Enable or disable a logical modem stack associated with the slotIndex.
+ */
+ boolean enableModemForSlot(int slotIndex, boolean enable);
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 02a6f311c1da..2be1f419db4d 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -20,6 +20,7 @@ import android.content.Intent;
import android.net.LinkProperties;
import android.net.NetworkCapabilities;
import android.os.Bundle;
+import android.telephony.CallQuality;
import android.telephony.CellInfo;
import android.telephony.PhoneCapability;
import android.telephony.PhysicalChannelConfig;
@@ -65,10 +66,10 @@ interface ITelephonyRegistry {
void notifyPhysicalChannelConfigurationForSubscriber(in int subId,
in List<PhysicalChannelConfig> configs);
void notifyPreciseCallState(int ringingCallState, int foregroundCallState,
- int backgroundCallState);
+ int backgroundCallState, int phoneId);
void notifyDisconnectCause(int disconnectCause, int preciseDisconnectCause);
void notifyPreciseDataConnectionFailed(String apnType, String apn,
- String failCause);
+ int failCause);
void notifyCellInfoForSubscriber(in int subId, in List<CellInfo> cellInfo);
void notifySrvccStateChanged(in int subId, in int lteState);
void notifySimActivationStateChangedForPhoneId(in int phoneId, in int subId,
@@ -82,4 +83,5 @@ interface ITelephonyRegistry {
void notifyPreferredDataSubIdChanged(int preferredSubId);
void notifyRadioPowerStateChanged(in int state);
void notifyEmergencyNumberList();
+ void notifyCallQualityChanged(in CallQuality callQuality, int phoneId);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 1c103a9fc747..930003462110 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -489,6 +489,7 @@ public interface RILConstants {
int RIL_REQUEST_STOP_NETWORK_SCAN = 143;
int RIL_REQUEST_START_KEEPALIVE = 144;
int RIL_REQUEST_STOP_KEEPALIVE = 145;
+ int RIL_REQUEST_ENABLE_MODEM = 146;
/* The following requests are not defined in RIL.h */
int RIL_REQUEST_HAL_NON_RIL_BASE = 200;
diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java
index 9874f809c0b4..a508b068065f 100644
--- a/telephony/java/com/android/internal/telephony/SmsApplication.java
+++ b/telephony/java/com/android/internal/telephony/SmsApplication.java
@@ -18,6 +18,8 @@ package com.android.internal.telephony;
import android.Manifest.permission;
import android.app.AppOpsManager;
+import android.app.role.RoleManager;
+import android.app.role.RoleManagerCallback;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -29,13 +31,12 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Binder;
import android.os.Debug;
import android.os.Process;
import android.os.UserHandle;
-import android.provider.Settings;
import android.provider.Telephony;
import android.provider.Telephony.Sms.Intents;
import android.telephony.Rlog;
@@ -50,6 +51,10 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
/**
* Class for managing the primary application that we will deliver SMS/MMS messages to
@@ -67,6 +72,7 @@ public final class SmsApplication {
private static final String SCHEME_SMSTO = "smsto";
private static final String SCHEME_MMS = "mms";
private static final String SCHEME_MMSTO = "mmsto";
+ private static final boolean DEBUG = false;
private static final boolean DEBUG_MULTIUSER = false;
private static final int[] DEFAULT_APP_EXCLUSIVE_APPOPS = {
@@ -240,7 +246,11 @@ public final class SmsApplication {
// Get the list of apps registered for SMS
Intent intent = new Intent(Intents.SMS_DELIVER_ACTION);
- List<ResolveInfo> smsReceivers = packageManager.queryBroadcastReceiversAsUser(intent, 0,
+ if (DEBUG) {
+ intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
+ }
+ List<ResolveInfo> smsReceivers = packageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
userId);
HashMap<String, SmsApplicationData> receivers = new HashMap<String, SmsApplicationData>();
@@ -266,7 +276,8 @@ public final class SmsApplication {
// Update any existing entries with mms receiver class
intent = new Intent(Intents.WAP_PUSH_DELIVER_ACTION);
intent.setDataAndType(null, "application/vnd.wap.mms-message");
- List<ResolveInfo> mmsReceivers = packageManager.queryBroadcastReceiversAsUser(intent, 0,
+ List<ResolveInfo> mmsReceivers = packageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
userId);
for (ResolveInfo resolveInfo : mmsReceivers) {
final ActivityInfo activityInfo = resolveInfo.activityInfo;
@@ -286,7 +297,8 @@ public final class SmsApplication {
// Update any existing entries with respond via message intent class.
intent = new Intent(TelephonyManager.ACTION_RESPOND_VIA_MESSAGE,
Uri.fromParts(SCHEME_SMSTO, "", null));
- List<ResolveInfo> respondServices = packageManager.queryIntentServicesAsUser(intent, 0,
+ List<ResolveInfo> respondServices = packageManager.queryIntentServicesAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
userId);
for (ResolveInfo resolveInfo : respondServices) {
final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
@@ -306,7 +318,8 @@ public final class SmsApplication {
// Update any existing entries with supports send to.
intent = new Intent(Intent.ACTION_SENDTO,
Uri.fromParts(SCHEME_SMSTO, "", null));
- List<ResolveInfo> sendToActivities = packageManager.queryIntentActivitiesAsUser(intent, 0,
+ List<ResolveInfo> sendToActivities = packageManager.queryIntentActivitiesAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
userId);
for (ResolveInfo resolveInfo : sendToActivities) {
final ActivityInfo activityInfo = resolveInfo.activityInfo;
@@ -323,7 +336,9 @@ public final class SmsApplication {
// Update any existing entries with the default sms changed handler.
intent = new Intent(Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED);
List<ResolveInfo> smsAppChangedReceivers =
- packageManager.queryBroadcastReceiversAsUser(intent, 0, userId);
+ packageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "getApplicationCollectionInternal smsAppChangedActivities=" +
smsAppChangedReceivers);
@@ -348,7 +363,9 @@ public final class SmsApplication {
// Update any existing entries with the external provider changed handler.
intent = new Intent(Telephony.Sms.Intents.ACTION_EXTERNAL_PROVIDER_CHANGE);
List<ResolveInfo> providerChangedReceivers =
- packageManager.queryBroadcastReceiversAsUser(intent, 0, userId);
+ packageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "getApplicationCollectionInternal providerChangedActivities=" +
providerChangedReceivers);
@@ -373,7 +390,9 @@ public final class SmsApplication {
// Update any existing entries with the sim full handler.
intent = new Intent(Intents.SIM_FULL_ACTION);
List<ResolveInfo> simFullReceivers =
- packageManager.queryBroadcastReceiversAsUser(intent, 0, userId);
+ packageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "getApplicationCollectionInternal simFullReceivers="
+ simFullReceivers);
@@ -406,7 +425,8 @@ public final class SmsApplication {
if (smsApplicationData != null) {
if (!smsApplicationData.isComplete()) {
Log.w(LOG_TAG, "Package " + packageName
- + " lacks required manifest declarations to be a default sms app");
+ + " lacks required manifest declarations to be a default sms app: "
+ + smsApplicationData);
receivers.remove(packageName);
}
}
@@ -418,7 +438,7 @@ public final class SmsApplication {
* Checks to see if we have a valid installed SMS application for the specified package name
* @return Data for the specified package name or null if there isn't one
*/
- private static SmsApplicationData getApplicationForPackage(
+ public static SmsApplicationData getApplicationForPackage(
Collection<SmsApplicationData> applications, String packageName) {
if (packageName == null) {
return null;
@@ -456,8 +476,7 @@ public final class SmsApplication {
Log.i(LOG_TAG, "getApplication userId=" + userId);
}
// Determine which application receives the broadcast
- String defaultApplication = Settings.Secure.getStringForUser(context.getContentResolver(),
- Settings.Secure.SMS_DEFAULT_APPLICATION, userId);
+ String defaultApplication = getDefaultSmsPackage(context, userId);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "getApplication defaultApp=" + defaultApplication);
}
@@ -469,27 +488,6 @@ public final class SmsApplication {
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "getApplication appData=" + applicationData);
}
- // Picking a new SMS app requires AppOps and Settings.Secure permissions, so we only do
- // this if the caller asked us to.
- if (updateIfNeeded && applicationData == null) {
- // Try to find the default SMS package for this device
- Resources r = context.getResources();
- String defaultPackage =
- r.getString(com.android.internal.R.string.default_sms_application);
- applicationData = getApplicationForPackage(applications, defaultPackage);
-
- if (applicationData == null) {
- // Are there any applications?
- if (applications.size() != 0) {
- applicationData = (SmsApplicationData)applications.toArray()[0];
- }
- }
-
- // If we found a new default app, update the setting
- if (applicationData != null) {
- setDefaultApplicationInternal(applicationData.mPackageName, context, userId);
- }
- }
// If we found a package, make sure AppOps permissions are set up correctly
if (applicationData != null) {
@@ -513,7 +511,7 @@ public final class SmsApplication {
// current SMS app will already be the preferred activity - but checking whether or
// not this is true is just as expensive as reconfiguring the preferred activity so
// we just reconfigure every time.
- updateDefaultSmsApp(context, userId, applicationData);
+ defaultSmsAppChanged(context);
}
}
if (DEBUG_MULTIUSER) {
@@ -522,16 +520,17 @@ public final class SmsApplication {
return applicationData;
}
- private static void updateDefaultSmsApp(Context context, int userId,
- SmsApplicationData applicationData) {
+ private static String getDefaultSmsPackage(Context context, int userId) {
+ return context.getSystemService(RoleManager.class).getDefaultSmsPackage(userId);
+ }
+
+ /**
+ * Grants various permissions and appops on sms app change
+ */
+ private static void defaultSmsAppChanged(Context context) {
PackageManager packageManager = context.getPackageManager();
AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
- // Configure this as the preferred activity for SENDTO sms/mms intents
- configurePreferredActivity(packageManager, new ComponentName(
- applicationData.mPackageName, applicationData.mSendToClass),
- userId);
-
// Assign permission to special system apps
assignExclusiveSmsPermissionsToSystemApp(context, packageManager, appOps,
PHONE_PACKAGE_NAME);
@@ -603,8 +602,7 @@ public final class SmsApplication {
final UserHandle userHandle = UserHandle.of(userId);
// Get old package name
- String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
- Settings.Secure.SMS_DEFAULT_APPLICATION, userId);
+ String oldPackageName = getDefaultSmsPackage(context, userId);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "setDefaultApplicationInternal old=" + oldPackageName +
@@ -636,16 +634,29 @@ public final class SmsApplication {
}
}
- // Update the secure setting.
- Settings.Secure.putStringForUser(context.getContentResolver(),
- Settings.Secure.SMS_DEFAULT_APPLICATION, applicationData.mPackageName,
- userId);
-
- // Allow relevant appops for the newly configured default SMS app.
- setExclusiveAppops(applicationData.mPackageName, appOps, applicationData.mUid,
- AppOpsManager.MODE_ALLOWED);
+ // Update the setting.
+ CompletableFuture<Void> res = new CompletableFuture<>();
+ context.getSystemService(RoleManager.class).addRoleHolderAsUser(
+ RoleManager.ROLE_SMS, applicationData.mPackageName, UserHandle.of(userId),
+ AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
+ @Override
+ public void onSuccess() {
+ res.complete(null);
+ }
+
+ @Override
+ public void onFailure() {
+ res.completeExceptionally(new RuntimeException());
+ }
+ });
+ try {
+ res.get(5, TimeUnit.SECONDS);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ Log.e(LOG_TAG, "Exception while adding sms role holder " + applicationData, e);
+ return;
+ }
- updateDefaultSmsApp(context, userId, applicationData);
+ defaultSmsAppChanged(context);
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "setDefaultApplicationInternal oldAppData=" + oldAppData);
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 2a648bd8b252..8523554aae63 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -501,4 +501,18 @@ public class TelephonyIntents {
*/
public static final String ACTION_LINE1_NUMBER_ERROR_DETECTED =
"com.android.internal.telephony.ACTION_LINE1_NUMBER_ERROR_DETECTED";
+
+ /**
+ * Broadcast action to notify radio bug.
+ *
+ * Requires the READ_PRIVILEGED_PHONE_STATE permission.
+ *
+ * @hide
+ */
+ public static final String ACTION_REPORT_RADIO_BUG =
+ "com.android.internal.telephony.ACTION_REPORT_RADIO_BUG";
+
+ // ACTION_REPORT_RADIO_BUG extra keys
+ public static final String EXTRA_SLOT_ID = "slotId";
+ public static final String EXTRA_RADIO_BUG_TYPE = "radioBugType";
}
diff --git a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
index 870a689f85b1..14a36c8c840d 100644
--- a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
+++ b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
@@ -24,22 +24,25 @@ import android.telephony.euicc.EuiccInfo;
/** @hide */
interface IEuiccController {
- oneway void continueOperation(in Intent resolutionIntent, in Bundle resolutionExtras);
- oneway void getDownloadableSubscriptionMetadata(in DownloadableSubscription subscription,
+ oneway void continueOperation(int cardId, in Intent resolutionIntent,
+ in Bundle resolutionExtras);
+ oneway void getDownloadableSubscriptionMetadata(int cardId,
+ in DownloadableSubscription subscription,
String callingPackage, in PendingIntent callbackIntent);
- oneway void getDefaultDownloadableSubscriptionList(
+ oneway void getDefaultDownloadableSubscriptionList(int cardId,
String callingPackage, in PendingIntent callbackIntent);
- String getEid();
- int getOtaStatus();
- oneway void downloadSubscription(in DownloadableSubscription subscription,
- boolean switchAfterDownload, String callingPackage, in Bundle resolvedBundle, in PendingIntent callbackIntent);
- EuiccInfo getEuiccInfo();
- oneway void deleteSubscription(int subscriptionId, String callingPackage,
+ String getEid(int cardId);
+ int getOtaStatus(int cardId);
+ oneway void downloadSubscription(int cardId, in DownloadableSubscription subscription,
+ boolean switchAfterDownload, String callingPackage, in Bundle resolvedBundle,
in PendingIntent callbackIntent);
- oneway void switchToSubscription(int subscriptionId, String callingPackage,
+ EuiccInfo getEuiccInfo(int cardId);
+ oneway void deleteSubscription(int cardId, int subscriptionId, String callingPackage,
in PendingIntent callbackIntent);
- oneway void updateSubscriptionNickname(int subscriptionId, String nickname,
+ oneway void switchToSubscription(int cardId, int subscriptionId, String callingPackage,
in PendingIntent callbackIntent);
- oneway void eraseSubscriptions(in PendingIntent callbackIntent);
- oneway void retainSubscriptionsForFactoryReset(in PendingIntent callbackIntent);
-} \ No newline at end of file
+ oneway void updateSubscriptionNickname(int cardId, int subscriptionId, String nickname,
+ String callingPackage, in PendingIntent callbackIntent);
+ oneway void eraseSubscriptions(int cardId, in PendingIntent callbackIntent);
+ oneway void retainSubscriptionsForFactoryReset(int cardId, in PendingIntent callbackIntent);
+}
diff --git a/test-base/api/current.txt b/test-base/api/current.txt
index 7ebd6aa8a4a2..750fb5988327 100644
--- a/test-base/api/current.txt
+++ b/test-base/api/current.txt
@@ -1,81 +1,87 @@
+// Signature format: 2.0
package android.test {
- public deprecated class AndroidTestCase extends junit.framework.TestCase {
- ctor public AndroidTestCase();
- method public void assertActivityRequiresPermission(java.lang.String, java.lang.String, java.lang.String);
- method public void assertReadingContentUriRequiresPermission(android.net.Uri, java.lang.String);
- method public void assertWritingContentUriRequiresPermission(android.net.Uri, java.lang.String);
- method public android.content.Context getContext();
- method protected void scrubClass(java.lang.Class<?>) throws java.lang.IllegalAccessException;
- method public void setContext(android.content.Context);
- method public void testAndroidTestCaseSetupProperly();
- field protected android.content.Context mContext;
+ @Deprecated public class AndroidTestCase extends junit.framework.TestCase {
+ ctor @Deprecated public AndroidTestCase();
+ method @Deprecated public void assertActivityRequiresPermission(String, String, String);
+ method @Deprecated public void assertReadingContentUriRequiresPermission(android.net.Uri, String);
+ method @Deprecated public void assertWritingContentUriRequiresPermission(android.net.Uri, String);
+ method @Deprecated public android.content.Context getContext();
+ method @Deprecated protected void scrubClass(Class<?>) throws java.lang.IllegalAccessException;
+ method @Deprecated public void setContext(android.content.Context);
+ method @Deprecated @android.test.suitebuilder.annotation.Suppress public void testAndroidTestCaseSetupProperly();
+ field @Deprecated protected android.content.Context mContext;
}
- public abstract deprecated class FlakyTest implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface FlakyTest {
+ method @Deprecated public abstract int tolerance() default 1;
}
- public deprecated class InstrumentationTestCase extends junit.framework.TestCase {
- ctor public InstrumentationTestCase();
- method public android.app.Instrumentation getInstrumentation();
- method public deprecated void injectInsrumentation(android.app.Instrumentation);
- method public void injectInstrumentation(android.app.Instrumentation);
- method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
- method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
- method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable;
- method public void sendKeys(java.lang.String);
- method public void sendKeys(int...);
- method public void sendRepeatedKeys(int...);
+ @Deprecated public class InstrumentationTestCase extends junit.framework.TestCase {
+ ctor @Deprecated public InstrumentationTestCase();
+ method @Deprecated public android.app.Instrumentation getInstrumentation();
+ method @Deprecated public void injectInsrumentation(android.app.Instrumentation);
+ method @Deprecated public void injectInstrumentation(android.app.Instrumentation);
+ method @Deprecated public final <T extends android.app.Activity> T launchActivity(String, Class<T>, android.os.Bundle);
+ method @Deprecated public final <T extends android.app.Activity> T launchActivityWithIntent(String, Class<T>, android.content.Intent);
+ method @Deprecated public void runTestOnUiThread(Runnable) throws java.lang.Throwable;
+ method @Deprecated public void sendKeys(String);
+ method @Deprecated public void sendKeys(int...);
+ method @Deprecated public void sendRepeatedKeys(int...);
}
- public deprecated class InstrumentationTestSuite extends junit.framework.TestSuite {
- ctor public InstrumentationTestSuite(android.app.Instrumentation);
- ctor public InstrumentationTestSuite(java.lang.String, android.app.Instrumentation);
- ctor public InstrumentationTestSuite(java.lang.Class, android.app.Instrumentation);
- method public void addTestSuite(java.lang.Class);
+ @Deprecated public class InstrumentationTestSuite extends junit.framework.TestSuite {
+ ctor @Deprecated public InstrumentationTestSuite(android.app.Instrumentation);
+ ctor @Deprecated public InstrumentationTestSuite(String, android.app.Instrumentation);
+ ctor @Deprecated public InstrumentationTestSuite(Class, android.app.Instrumentation);
+ method @Deprecated public void addTestSuite(Class);
}
- public abstract deprecated interface PerformanceTestCase {
- method public abstract boolean isPerformanceOnly();
- method public abstract int startPerformance(android.test.PerformanceTestCase.Intermediates);
+ @Deprecated public interface PerformanceTestCase {
+ method @Deprecated public boolean isPerformanceOnly();
+ method @Deprecated public int startPerformance(android.test.PerformanceTestCase.Intermediates);
}
- public static abstract interface PerformanceTestCase.Intermediates {
- method public abstract void addIntermediate(java.lang.String);
- method public abstract void addIntermediate(java.lang.String, long);
- method public abstract void finishTiming(boolean);
- method public abstract void setInternalIterations(int);
- method public abstract void startTiming(boolean);
+ @Deprecated public static interface PerformanceTestCase.Intermediates {
+ method @Deprecated public void addIntermediate(String);
+ method @Deprecated public void addIntermediate(String, long);
+ method @Deprecated public void finishTiming(boolean);
+ method @Deprecated public void setInternalIterations(int);
+ method @Deprecated public void startTiming(boolean);
}
- public abstract deprecated class UiThreadTest implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface RepetitiveTest {
+ method @Deprecated public abstract int numIterations() default 1;
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface UiThreadTest {
}
}
package android.test.suitebuilder.annotation {
- public abstract deprecated class LargeTest implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface LargeTest {
}
- public abstract deprecated class MediumTest implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface MediumTest {
}
- public abstract deprecated class SmallTest implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface SmallTest {
}
- public abstract deprecated class Smoke implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface Smoke {
}
- public abstract deprecated class Suppress implements java.lang.annotation.Annotation {
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface Suppress {
}
}
package com.android.internal.util {
- public abstract deprecated interface Predicate<T> {
- method public abstract boolean apply(T);
+ @Deprecated public interface Predicate<T> {
+ method @Deprecated public boolean apply(T);
}
}
@@ -84,117 +90,117 @@ package junit.framework {
public class Assert {
ctor protected Assert();
- method public static void assertEquals(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void assertEquals(java.lang.Object, java.lang.Object);
- method public static void assertEquals(java.lang.String, java.lang.String, java.lang.String);
- method public static void assertEquals(java.lang.String, java.lang.String);
- method public static void assertEquals(java.lang.String, double, double, double);
+ method public static void assertEquals(String, Object, Object);
+ method public static void assertEquals(Object, Object);
+ method public static void assertEquals(String, String, String);
+ method public static void assertEquals(String, String);
+ method public static void assertEquals(String, double, double, double);
method public static void assertEquals(double, double, double);
- method public static void assertEquals(java.lang.String, float, float, float);
+ method public static void assertEquals(String, float, float, float);
method public static void assertEquals(float, float, float);
- method public static void assertEquals(java.lang.String, long, long);
+ method public static void assertEquals(String, long, long);
method public static void assertEquals(long, long);
- method public static void assertEquals(java.lang.String, boolean, boolean);
+ method public static void assertEquals(String, boolean, boolean);
method public static void assertEquals(boolean, boolean);
- method public static void assertEquals(java.lang.String, byte, byte);
+ method public static void assertEquals(String, byte, byte);
method public static void assertEquals(byte, byte);
- method public static void assertEquals(java.lang.String, char, char);
+ method public static void assertEquals(String, char, char);
method public static void assertEquals(char, char);
- method public static void assertEquals(java.lang.String, short, short);
+ method public static void assertEquals(String, short, short);
method public static void assertEquals(short, short);
- method public static void assertEquals(java.lang.String, int, int);
+ method public static void assertEquals(String, int, int);
method public static void assertEquals(int, int);
- method public static void assertFalse(java.lang.String, boolean);
+ method public static void assertFalse(String, boolean);
method public static void assertFalse(boolean);
- method public static void assertNotNull(java.lang.Object);
- method public static void assertNotNull(java.lang.String, java.lang.Object);
- method public static void assertNotSame(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void assertNotSame(java.lang.Object, java.lang.Object);
- method public static void assertNull(java.lang.Object);
- method public static void assertNull(java.lang.String, java.lang.Object);
- method public static void assertSame(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void assertSame(java.lang.Object, java.lang.Object);
- method public static void assertTrue(java.lang.String, boolean);
+ method public static void assertNotNull(Object);
+ method public static void assertNotNull(String, Object);
+ method public static void assertNotSame(String, Object, Object);
+ method public static void assertNotSame(Object, Object);
+ method public static void assertNull(Object);
+ method public static void assertNull(String, Object);
+ method public static void assertSame(String, Object, Object);
+ method public static void assertSame(Object, Object);
+ method public static void assertTrue(String, boolean);
method public static void assertTrue(boolean);
- method public static void fail(java.lang.String);
+ method public static void fail(String);
method public static void fail();
- method public static void failNotEquals(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void failNotSame(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void failSame(java.lang.String);
- method public static java.lang.String format(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void failNotEquals(String, Object, Object);
+ method public static void failNotSame(String, Object, Object);
+ method public static void failSame(String);
+ method public static String format(String, Object, Object);
}
public class AssertionFailedError extends java.lang.AssertionError {
ctor public AssertionFailedError();
- ctor public AssertionFailedError(java.lang.String);
+ ctor public AssertionFailedError(String);
}
public class ComparisonFailure extends junit.framework.AssertionFailedError {
- ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
- method public java.lang.String getActual();
- method public java.lang.String getExpected();
+ ctor public ComparisonFailure(String, String, String);
+ method public String getActual();
+ method public String getExpected();
}
- public abstract interface Protectable {
- method public abstract void protect() throws java.lang.Throwable;
+ public interface Protectable {
+ method public void protect() throws java.lang.Throwable;
}
- public abstract interface Test {
- method public abstract int countTestCases();
- method public abstract void run(junit.framework.TestResult);
+ public interface Test {
+ method public int countTestCases();
+ method public void run(junit.framework.TestResult);
}
public abstract class TestCase extends junit.framework.Assert implements junit.framework.Test {
ctor public TestCase();
- ctor public TestCase(java.lang.String);
+ ctor public TestCase(String);
method public int countTestCases();
method protected junit.framework.TestResult createResult();
- method public java.lang.String getName();
+ method public String getName();
method public junit.framework.TestResult run();
method public void run(junit.framework.TestResult);
method public void runBare() throws java.lang.Throwable;
method protected void runTest() throws java.lang.Throwable;
- method public void setName(java.lang.String);
+ method public void setName(String);
method protected void setUp() throws java.lang.Exception;
method protected void tearDown() throws java.lang.Exception;
}
public class TestFailure {
- ctor public TestFailure(junit.framework.Test, java.lang.Throwable);
- method public java.lang.String exceptionMessage();
+ ctor public TestFailure(junit.framework.Test, Throwable);
+ method public String exceptionMessage();
method public junit.framework.Test failedTest();
method public boolean isFailure();
- method public java.lang.Throwable thrownException();
- method public java.lang.String trace();
+ method public Throwable thrownException();
+ method public String trace();
field protected junit.framework.Test fFailedTest;
- field protected java.lang.Throwable fThrownException;
+ field protected Throwable fThrownException;
}
- public abstract interface TestListener {
- method public abstract void addError(junit.framework.Test, java.lang.Throwable);
- method public abstract void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
- method public abstract void endTest(junit.framework.Test);
- method public abstract void startTest(junit.framework.Test);
+ public interface TestListener {
+ method public void addError(junit.framework.Test, Throwable);
+ method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method public void endTest(junit.framework.Test);
+ method public void startTest(junit.framework.Test);
}
public class TestResult {
ctor public TestResult();
- method public synchronized void addError(junit.framework.Test, java.lang.Throwable);
- method public synchronized void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
- method public synchronized void addListener(junit.framework.TestListener);
+ method public void addError(junit.framework.Test, Throwable);
+ method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method public void addListener(junit.framework.TestListener);
method public void endTest(junit.framework.Test);
- method public synchronized int errorCount();
- method public synchronized java.util.Enumeration<junit.framework.TestFailure> errors();
- method public synchronized int failureCount();
- method public synchronized java.util.Enumeration<junit.framework.TestFailure> failures();
- method public synchronized void removeListener(junit.framework.TestListener);
+ method public int errorCount();
+ method public java.util.Enumeration<junit.framework.TestFailure> errors();
+ method public int failureCount();
+ method public java.util.Enumeration<junit.framework.TestFailure> failures();
+ method public void removeListener(junit.framework.TestListener);
method protected void run(junit.framework.TestCase);
- method public synchronized int runCount();
+ method public int runCount();
method public void runProtected(junit.framework.Test, junit.framework.Protectable);
- method public synchronized boolean shouldStop();
+ method public boolean shouldStop();
method public void startTest(junit.framework.Test);
- method public synchronized void stop();
- method public synchronized boolean wasSuccessful();
+ method public void stop();
+ method public boolean wasSuccessful();
field protected java.util.Vector<junit.framework.TestFailure> fErrors;
field protected java.util.Vector<junit.framework.TestFailure> fFailures;
field protected java.util.Vector<junit.framework.TestListener> fListeners;
@@ -203,24 +209,24 @@ package junit.framework {
public class TestSuite implements junit.framework.Test {
ctor public TestSuite();
- ctor public TestSuite(java.lang.Class<?>);
- ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>, java.lang.String);
- ctor public TestSuite(java.lang.String);
- ctor public TestSuite(java.lang.Class<?>...);
- ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>[], java.lang.String);
+ ctor public TestSuite(Class<?>);
+ ctor public TestSuite(Class<? extends junit.framework.TestCase>, String);
+ ctor public TestSuite(String);
+ ctor public TestSuite(Class<?>...);
+ ctor public TestSuite(Class<? extends junit.framework.TestCase>[], String);
method public void addTest(junit.framework.Test);
- method public void addTestSuite(java.lang.Class<? extends junit.framework.TestCase>);
+ method public void addTestSuite(Class<? extends junit.framework.TestCase>);
method public int countTestCases();
- method public static junit.framework.Test createTest(java.lang.Class<?>, java.lang.String);
- method public java.lang.String getName();
- method public static java.lang.reflect.Constructor<?> getTestConstructor(java.lang.Class<?>) throws java.lang.NoSuchMethodException;
+ method public static junit.framework.Test createTest(Class<?>, String);
+ method public String getName();
+ method public static java.lang.reflect.Constructor<?> getTestConstructor(Class<?>) throws java.lang.NoSuchMethodException;
method public void run(junit.framework.TestResult);
method public void runTest(junit.framework.Test, junit.framework.TestResult);
- method public void setName(java.lang.String);
+ method public void setName(String);
method public junit.framework.Test testAt(int);
method public int testCount();
method public java.util.Enumeration<junit.framework.Test> tests();
- method public static junit.framework.Test warning(java.lang.String);
+ method public static junit.framework.Test warning(String);
}
}
diff --git a/test-base/api/removed.txt b/test-base/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-base/api/removed.txt
+++ b/test-base/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-base/api/system-current.txt b/test-base/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-base/api/system-current.txt
+++ b/test-base/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-base/api/system-removed.txt b/test-base/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-base/api/system-removed.txt
+++ b/test-base/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-base/api/test-current.txt b/test-base/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-base/api/test-current.txt
+++ b/test-base/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-base/api/test-removed.txt b/test-base/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-base/api/test-removed.txt
+++ b/test-base/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-base/src/android/test/RepetitiveTest.java b/test-base/src/android/test/RepetitiveTest.java
index 6a7130e68e61..13e89d2d92a6 100644
--- a/test-base/src/android/test/RepetitiveTest.java
+++ b/test-base/src/android/test/RepetitiveTest.java
@@ -26,8 +26,10 @@ import java.lang.annotation.Target;
* When the annotation is present, the test method is executed the number of times specified by
* numIterations and defaults to 1.
*
- * {@hide} Not needed for public API.
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+@Deprecated
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepetitiveTest {
@@ -37,4 +39,4 @@ public @interface RepetitiveTest {
* @return The total number of iterations, the default is 1.
*/
int numIterations() default 1;
-} \ No newline at end of file
+}
diff --git a/test-legacy/Android.bp b/test-legacy/Android.bp
index 833c714f07b0..a69f422b3bdb 100644
--- a/test-legacy/Android.bp
+++ b/test-legacy/Android.bp
@@ -25,7 +25,7 @@ java_library_static {
static_libs: [
"android.test.base-minus-junit",
"android.test.runner-minus-junit",
- "android.test.mock.impl",
+ "android.test.mock_static",
],
no_framework_libs: true,
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index 37158e5fe0b9..43b765d8b783 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -25,7 +25,24 @@ java_sdk_library {
"android.test.mock",
],
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: ["core/java"],
srcs_lib_whitelist_pkgs: ["android"],
- metalava_enabled: false,
compile_dex: true,
}
+
+// Build the android.test.mock_static library
+// ==========================================
+// This is only intended for inclusion in the legacy-android-test.
+// Must not be used elewhere.
+java_library_static {
+ name: "android.test.mock_static",
+
+ java_version: "1.8",
+ srcs: ["src/**/*.java"],
+
+ no_framework_libs: true,
+ libs: [
+ "framework",
+ ],
+}
diff --git a/test-mock/api/current.txt b/test-mock/api/current.txt
index 5b58dd5d758b..a181bc387d36 100644
--- a/test-mock/api/current.txt
+++ b/test-mock/api/current.txt
@@ -1,126 +1,127 @@
+// Signature format: 2.0
package android.test.mock {
- public deprecated class MockAccountManager {
- method public static android.accounts.AccountManager newMockAccountManager(android.content.Context);
+ @Deprecated public class MockAccountManager {
+ method @Deprecated public static android.accounts.AccountManager newMockAccountManager(android.content.Context);
}
- public deprecated class MockApplication extends android.app.Application {
- ctor public MockApplication();
+ @Deprecated public class MockApplication extends android.app.Application {
+ ctor @Deprecated public MockApplication();
}
public class MockContentProvider extends android.content.ContentProvider {
ctor protected MockContentProvider();
ctor public MockContentProvider(android.content.Context);
- ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
+ ctor public MockContentProvider(android.content.Context, String, String, android.content.pm.PathPermission[]);
method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>);
- method public static deprecated void attachInfoForTesting(android.content.ContentProvider, android.content.Context, android.content.pm.ProviderInfo);
- method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- method public java.lang.String getType(android.net.Uri);
+ method @Deprecated public static void attachInfoForTesting(android.content.ContentProvider, android.content.Context, android.content.pm.ProviderInfo);
+ method public int delete(android.net.Uri, String, String[]);
+ method public String getType(android.net.Uri);
method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public boolean onCreate();
- method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
- method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, String, android.os.Bundle);
+ method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+ method public int update(android.net.Uri, android.content.ContentValues, String, String[]);
}
public class MockContentResolver extends android.content.ContentResolver {
ctor public MockContentResolver();
ctor public MockContentResolver(android.content.Context);
- method public void addProvider(java.lang.String, android.content.ContentProvider);
+ method public void addProvider(String, android.content.ContentProvider);
}
public class MockContext extends android.content.Context {
ctor public MockContext();
- method public boolean bindIsolatedService(android.content.Intent, android.content.ServiceConnection, int, java.lang.String);
+ method public boolean bindIsolatedService(android.content.Intent, android.content.ServiceConnection, int, String);
method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- method public int checkCallingOrSelfPermission(java.lang.String);
+ method public int checkCallingOrSelfPermission(String);
method public int checkCallingOrSelfUriPermission(android.net.Uri, int);
- method public int checkCallingPermission(java.lang.String);
+ method public int checkCallingPermission(String);
method public int checkCallingUriPermission(android.net.Uri, int);
- method public int checkPermission(java.lang.String, int, int);
- method public int checkSelfPermission(java.lang.String);
+ method public int checkPermission(String, int, int);
+ method public int checkSelfPermission(String);
method public int checkUriPermission(android.net.Uri, int, int, int);
- method public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
+ method public int checkUriPermission(android.net.Uri, String, String, int, int, int);
method public void clearWallpaper();
method public android.content.Context createConfigurationContext(android.content.res.Configuration);
- method public android.content.Context createContextForSplit(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createContextForSplit(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.Context createDeviceProtectedStorageContext();
method public android.content.Context createDisplayContext(android.view.Display);
- method public android.content.Context createPackageContext(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.lang.String[] databaseList();
- method public boolean deleteDatabase(java.lang.String);
- method public boolean deleteFile(java.lang.String);
- method public boolean deleteSharedPreferences(java.lang.String);
- method public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- method public void enforceCallingPermission(java.lang.String, java.lang.String);
- method public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- method public void enforcePermission(java.lang.String, int, int, java.lang.String);
- method public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- method public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- method public java.lang.String[] fileList();
+ method public android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public String[] databaseList();
+ method public boolean deleteDatabase(String);
+ method public boolean deleteFile(String);
+ method public boolean deleteSharedPreferences(String);
+ method public void enforceCallingOrSelfPermission(String, String);
+ method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
+ method public void enforceCallingPermission(String, String);
+ method public void enforceCallingUriPermission(android.net.Uri, int, String);
+ method public void enforcePermission(String, int, int, String);
+ method public void enforceUriPermission(android.net.Uri, int, int, int, String);
+ method public void enforceUriPermission(android.net.Uri, String, String, int, int, int, String);
+ method public String[] fileList();
method public android.content.Context getApplicationContext();
method public android.content.pm.ApplicationInfo getApplicationInfo();
method public android.content.res.AssetManager getAssets();
method public java.io.File getCacheDir();
- method public java.lang.ClassLoader getClassLoader();
+ method public ClassLoader getClassLoader();
method public java.io.File getCodeCacheDir();
method public android.content.ContentResolver getContentResolver();
method public java.io.File getDataDir();
- method public java.io.File getDatabasePath(java.lang.String);
- method public java.io.File getDir(java.lang.String, int);
+ method public java.io.File getDatabasePath(String);
+ method public java.io.File getDir(String, int);
method public java.io.File getExternalCacheDir();
method public java.io.File[] getExternalCacheDirs();
- method public java.io.File getExternalFilesDir(java.lang.String);
- method public java.io.File[] getExternalFilesDirs(java.lang.String);
+ method public java.io.File getExternalFilesDir(String);
+ method public java.io.File[] getExternalFilesDirs(String);
method public java.io.File[] getExternalMediaDirs();
- method public java.io.File getFileStreamPath(java.lang.String);
+ method public java.io.File getFileStreamPath(String);
method public java.io.File getFilesDir();
method public android.os.Looper getMainLooper();
method public java.io.File getNoBackupFilesDir();
method public java.io.File getObbDir();
method public java.io.File[] getObbDirs();
- method public java.lang.String getOpPackageName();
- method public java.lang.String getPackageCodePath();
+ method public String getOpPackageName();
+ method public String getPackageCodePath();
method public android.content.pm.PackageManager getPackageManager();
- method public java.lang.String getPackageName();
- method public java.lang.String getPackageResourcePath();
+ method public String getPackageName();
+ method public String getPackageResourcePath();
method public android.content.res.Resources getResources();
- method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- method public java.lang.Object getSystemService(java.lang.String);
- method public java.lang.String getSystemServiceName(java.lang.Class<?>);
+ method public android.content.SharedPreferences getSharedPreferences(String, int);
+ method public Object getSystemService(String);
+ method public String getSystemServiceName(Class<?>);
method public android.content.res.Resources.Theme getTheme();
method public android.graphics.drawable.Drawable getWallpaper();
method public int getWallpaperDesiredMinimumHeight();
method public int getWallpaperDesiredMinimumWidth();
- method public void grantUriPermission(java.lang.String, android.net.Uri, int);
+ method public void grantUriPermission(String, android.net.Uri, int);
method public boolean isDeviceProtectedStorage();
- method public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- method public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- method public java.io.FileInputStream openFileInput(java.lang.String) throws java.io.FileNotFoundException;
- method public java.io.FileOutputStream openFileOutput(java.lang.String, int) throws java.io.FileNotFoundException;
- method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
- method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
+ method public boolean moveDatabaseFrom(android.content.Context, String);
+ method public boolean moveSharedPreferencesFrom(android.content.Context, String);
+ method public java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
+ method public java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler, int);
method public void removeStickyBroadcast(android.content.Intent);
method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
- method public void revokeUriPermission(java.lang.String, android.net.Uri, int);
+ method public void revokeUriPermission(String, android.net.Uri, int);
method public void sendBroadcast(android.content.Intent);
- method public void sendBroadcast(android.content.Intent, java.lang.String);
+ method public void sendBroadcast(android.content.Intent, String);
method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, String);
+ method public void sendOrderedBroadcast(android.content.Intent, String);
+ method public void sendOrderedBroadcast(android.content.Intent, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
+ method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
method public void sendStickyBroadcast(android.content.Intent);
method public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- method public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- method public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
+ method public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
method public void setTheme(int);
method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
@@ -129,7 +130,7 @@ package android.test.mock {
method public void startActivity(android.content.Intent);
method public void startActivity(android.content.Intent, android.os.Bundle);
method public android.content.ComponentName startForegroundService(android.content.Intent);
- method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
+ method public boolean startInstrumentation(android.content.ComponentName, String, android.os.Bundle);
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public android.content.ComponentName startService(android.content.Intent);
@@ -139,168 +140,168 @@ package android.test.mock {
method public void updateServiceGroup(android.content.ServiceConnection, int, int);
}
- public deprecated class MockCursor implements android.database.Cursor {
- ctor public MockCursor();
- method public void close();
- method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
- method public deprecated void deactivate();
- method public byte[] getBlob(int);
- method public int getColumnCount();
- method public int getColumnIndex(java.lang.String);
- method public int getColumnIndexOrThrow(java.lang.String);
- method public java.lang.String getColumnName(int);
- method public java.lang.String[] getColumnNames();
- method public int getCount();
- method public double getDouble(int);
- method public android.os.Bundle getExtras();
- method public float getFloat(int);
- method public int getInt(int);
- method public long getLong(int);
- method public android.net.Uri getNotificationUri();
- method public int getPosition();
- method public short getShort(int);
- method public java.lang.String getString(int);
- method public int getType(int);
- method public boolean getWantsAllOnMoveCalls();
- method public boolean isAfterLast();
- method public boolean isBeforeFirst();
- method public boolean isClosed();
- method public boolean isFirst();
- method public boolean isLast();
- method public boolean isNull(int);
- method public boolean move(int);
- method public boolean moveToFirst();
- method public boolean moveToLast();
- method public boolean moveToNext();
- method public boolean moveToPosition(int);
- method public boolean moveToPrevious();
- method public void registerContentObserver(android.database.ContentObserver);
- method public void registerDataSetObserver(android.database.DataSetObserver);
- method public deprecated boolean requery();
- method public android.os.Bundle respond(android.os.Bundle);
- method public void setExtras(android.os.Bundle);
- method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
- method public void unregisterContentObserver(android.database.ContentObserver);
- method public void unregisterDataSetObserver(android.database.DataSetObserver);
+ @Deprecated public class MockCursor implements android.database.Cursor {
+ ctor @Deprecated public MockCursor();
+ method @Deprecated public void close();
+ method @Deprecated public void copyStringToBuffer(int, android.database.CharArrayBuffer);
+ method @Deprecated public void deactivate();
+ method @Deprecated public byte[] getBlob(int);
+ method @Deprecated public int getColumnCount();
+ method @Deprecated public int getColumnIndex(String);
+ method @Deprecated public int getColumnIndexOrThrow(String);
+ method @Deprecated public String getColumnName(int);
+ method @Deprecated public String[] getColumnNames();
+ method @Deprecated public int getCount();
+ method @Deprecated public double getDouble(int);
+ method @Deprecated public android.os.Bundle getExtras();
+ method @Deprecated public float getFloat(int);
+ method @Deprecated public int getInt(int);
+ method @Deprecated public long getLong(int);
+ method @Deprecated public android.net.Uri getNotificationUri();
+ method @Deprecated public int getPosition();
+ method @Deprecated public short getShort(int);
+ method @Deprecated public String getString(int);
+ method @Deprecated public int getType(int);
+ method @Deprecated public boolean getWantsAllOnMoveCalls();
+ method @Deprecated public boolean isAfterLast();
+ method @Deprecated public boolean isBeforeFirst();
+ method @Deprecated public boolean isClosed();
+ method @Deprecated public boolean isFirst();
+ method @Deprecated public boolean isLast();
+ method @Deprecated public boolean isNull(int);
+ method @Deprecated public boolean move(int);
+ method @Deprecated public boolean moveToFirst();
+ method @Deprecated public boolean moveToLast();
+ method @Deprecated public boolean moveToNext();
+ method @Deprecated public boolean moveToPosition(int);
+ method @Deprecated public boolean moveToPrevious();
+ method @Deprecated public void registerContentObserver(android.database.ContentObserver);
+ method @Deprecated public void registerDataSetObserver(android.database.DataSetObserver);
+ method @Deprecated public boolean requery();
+ method @Deprecated public android.os.Bundle respond(android.os.Bundle);
+ method @Deprecated public void setExtras(android.os.Bundle);
+ method @Deprecated public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
+ method @Deprecated public void unregisterContentObserver(android.database.ContentObserver);
+ method @Deprecated public void unregisterDataSetObserver(android.database.DataSetObserver);
}
- public deprecated class MockDialogInterface implements android.content.DialogInterface {
- ctor public MockDialogInterface();
- method public void cancel();
- method public void dismiss();
+ @Deprecated public class MockDialogInterface implements android.content.DialogInterface {
+ ctor @Deprecated public MockDialogInterface();
+ method @Deprecated public void cancel();
+ method @Deprecated public void dismiss();
}
- public deprecated class MockPackageManager extends android.content.pm.PackageManager {
- ctor public MockPackageManager();
- method public void addPackageToPreferred(java.lang.String);
- method public boolean addPermission(android.content.pm.PermissionInfo);
- method public boolean addPermissionAsync(android.content.pm.PermissionInfo);
- method public void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
- method public boolean canRequestPackageInstalls();
- method public java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
- method public int checkPermission(java.lang.String, java.lang.String);
- method public int checkSignatures(java.lang.String, java.lang.String);
- method public int checkSignatures(int, int);
+ @Deprecated public class MockPackageManager extends android.content.pm.PackageManager {
+ ctor @Deprecated public MockPackageManager();
+ method @Deprecated public void addPackageToPreferred(String);
+ method @Deprecated public boolean addPermission(android.content.pm.PermissionInfo);
+ method @Deprecated public boolean addPermissionAsync(android.content.pm.PermissionInfo);
+ method @Deprecated public void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
+ method @Deprecated public boolean canRequestPackageInstalls();
+ method @Deprecated public String[] canonicalToCurrentPackageNames(String[]);
+ method @Deprecated public int checkPermission(String, String);
+ method @Deprecated public int checkSignatures(String, String);
+ method @Deprecated public int checkSignatures(int, int);
method public void clearInstantAppCookie();
- method public void clearPackagePreferredActivities(java.lang.String);
- method public java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
- method public void extendVerificationTimeout(int, int, long);
- method public android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.graphics.drawable.Drawable getActivityBanner(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.graphics.drawable.Drawable getActivityIcon(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.graphics.drawable.Drawable getActivityLogo(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.util.List<android.content.IntentFilter> getAllIntentFilters(java.lang.String);
- method public java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
- method public android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
- method public android.graphics.drawable.Drawable getApplicationBanner(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public int getApplicationEnabledSetting(java.lang.String);
- method public android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
- method public android.graphics.drawable.Drawable getApplicationIcon(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
- method public android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
- method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public void clearPackagePreferredActivities(String);
+ method @Deprecated public String[] currentToCanonicalPackageNames(String[]);
+ method @Deprecated public void extendVerificationTimeout(int, int, long);
+ method @Deprecated public android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getActivityBanner(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getActivityIcon(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getActivityLogo(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public java.util.List<android.content.IntentFilter> getAllIntentFilters(String);
+ method @Deprecated public java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationBanner(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public int getApplicationEnabledSetting(String);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationIcon(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.ApplicationInfo getApplicationInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
+ method @Deprecated public android.graphics.drawable.Drawable getApplicationLogo(String) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.pm.ChangedPackages getChangedPackages(int);
- method public int getComponentEnabledSetting(android.content.ComponentName);
- method public android.graphics.drawable.Drawable getDefaultActivityIcon();
- method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
- method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
- method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
- method public java.lang.String getInstallerPackageName(java.lang.String);
+ method @Deprecated public int getComponentEnabledSetting(android.content.ComponentName);
+ method @Deprecated public android.graphics.drawable.Drawable getDefaultActivityIcon();
+ method @Deprecated public android.graphics.drawable.Drawable getDrawable(String, int, android.content.pm.ApplicationInfo);
+ method @Deprecated public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
+ method @Deprecated public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
+ method @Deprecated public String getInstallerPackageName(String);
method public byte[] getInstantAppCookie();
method public int getInstantAppCookieMaxBytes();
- method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.Intent getLaunchIntentForPackage(java.lang.String);
- method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
- method public java.lang.String getNameForUid(int);
- method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.Intent getLaunchIntentForPackage(String);
+ method @Deprecated public android.content.Intent getLeanbackLaunchIntentForPackage(String);
+ method @Deprecated public String getNameForUid(int);
+ method @Deprecated public int[] getPackageGids(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public int[] getPackageGids(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.PackageInfo getPackageInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.pm.PackageInstaller getPackageInstaller();
- method public int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.lang.String[] getPackagesForUid(int);
- method public java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
- method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, java.lang.String);
- method public java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
- method public android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
- method public android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
- method public android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
- method public java.lang.String[] getSystemSharedLibraryNames();
- method public java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
- method public android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
- method public android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
- method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
- method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
- method public boolean hasSystemFeature(java.lang.String);
- method public boolean hasSystemFeature(java.lang.String, int);
+ method @Deprecated public int getPackageUid(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public String[] getPackagesForUid(int);
+ method @Deprecated public java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(String[], int);
+ method @Deprecated public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.PermissionInfo getPermissionInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, String);
+ method @Deprecated public java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
+ method @Deprecated public android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
+ method @Deprecated public android.content.res.Resources getResourcesForApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated @NonNull public java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
+ method @Deprecated public android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
+ method @Deprecated public String[] getSystemSharedLibraryNames();
+ method @Deprecated public CharSequence getText(String, int, android.content.pm.ApplicationInfo);
+ method @Deprecated public android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
+ method @Deprecated public android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
+ method @Deprecated public CharSequence getUserBadgedLabel(CharSequence, android.os.UserHandle);
+ method @Deprecated public android.content.res.XmlResourceParser getXml(String, int, android.content.pm.ApplicationInfo);
+ method @Deprecated public boolean hasSystemFeature(String);
+ method @Deprecated public boolean hasSystemFeature(String, int);
method public boolean isInstantApp();
- method public boolean isInstantApp(java.lang.String);
- method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
- method public boolean isSafeMode();
- method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
- method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
- method public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
- method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
- method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public void removePackageFromPreferred(java.lang.String);
- method public void removePermission(java.lang.String);
- method public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
- method public android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
- method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
- method public android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
- method public void setApplicationCategoryHint(java.lang.String, int);
- method public void setApplicationEnabledSetting(java.lang.String, int, int);
- method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
- method public void setInstallerPackageName(java.lang.String, java.lang.String);
- method public void updateInstantAppCookie(byte[]);
- method public void verifyPendingInstall(int, int);
+ method public boolean isInstantApp(String);
+ method @Deprecated public boolean isPermissionRevokedByPolicy(String, String);
+ method @Deprecated public boolean isSafeMode();
+ method @Deprecated public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
+ method @Deprecated public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(String, int, int);
+ method @Deprecated public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(String, int);
+ method @Deprecated public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
+ method @Deprecated public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+ method @Deprecated public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
+ method @Deprecated public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
+ method @Deprecated public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated public void removePackageFromPreferred(String);
+ method @Deprecated public void removePermission(String);
+ method @Deprecated public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
+ method @Deprecated public android.content.pm.ProviderInfo resolveContentProvider(String, int);
+ method @Deprecated public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
+ method @Deprecated public android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
+ method public void setApplicationCategoryHint(String, int);
+ method @Deprecated public void setApplicationEnabledSetting(String, int, int);
+ method @Deprecated public void setComponentEnabledSetting(android.content.ComponentName, int, int);
+ method @Deprecated public void setInstallerPackageName(String, String);
+ method public void updateInstantAppCookie(@NonNull byte[]);
+ method @Deprecated public void verifyPendingInstall(int, int);
}
- public deprecated class MockResources extends android.content.res.Resources {
- ctor public MockResources();
- method public int getColor(int) throws android.content.res.Resources.NotFoundException;
- method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
- method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
- method public android.graphics.Movie getMovie(int) throws android.content.res.Resources.NotFoundException;
- method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
+ @Deprecated public class MockResources extends android.content.res.Resources {
+ ctor @Deprecated public MockResources();
+ method @Deprecated public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public android.graphics.Movie getMovie(int) throws android.content.res.Resources.NotFoundException;
+ method @Deprecated public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
}
- public deprecated class MockService {
- method public static <T extends android.app.Service> void attachForTesting(android.app.Service, android.content.Context, java.lang.String, android.app.Application);
+ @Deprecated public class MockService {
+ method @Deprecated public static <T extends android.app.Service> void attachForTesting(android.app.Service, android.content.Context, String, android.app.Application);
}
}
diff --git a/test-mock/api/removed.txt b/test-mock/api/removed.txt
index bd109a887933..1496c356da08 100644
--- a/test-mock/api/removed.txt
+++ b/test-mock/api/removed.txt
@@ -1,14 +1,15 @@
+// Signature format: 2.0
package android.test.mock {
public class MockContext extends android.content.Context {
method public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- method public java.io.File getSharedPreferencesPath(java.lang.String);
+ method public java.io.File getSharedPreferencesPath(String);
}
- public deprecated class MockPackageManager extends android.content.pm.PackageManager {
- method public deprecated java.lang.String getDefaultBrowserPackageName(int);
- method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int);
- method public boolean setInstantAppCookie(byte[]);
+ @Deprecated public class MockPackageManager extends android.content.pm.PackageManager {
+ method @Deprecated public String getDefaultBrowserPackageName(int);
+ method @Deprecated public boolean setDefaultBrowserPackageName(String, int);
+ method public boolean setInstantAppCookie(@NonNull byte[]);
}
}
diff --git a/test-mock/api/system-current.txt b/test-mock/api/system-current.txt
index 2b968aec1496..f87785bfac18 100644
--- a/test-mock/api/system-current.txt
+++ b/test-mock/api/system-current.txt
@@ -1,38 +1,39 @@
+// Signature format: 2.0
package android.test.mock {
public class MockContext extends android.content.Context {
method public android.content.Context createCredentialProtectedStorageContext();
method public java.io.File getPreloadsFileCache();
method public boolean isCredentialProtectedStorage();
- method public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendBroadcast(android.content.Intent, String, android.os.Bundle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, String, android.os.Bundle);
+ method public void sendOrderedBroadcast(android.content.Intent, String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
}
- public deprecated class MockPackageManager extends android.content.pm.PackageManager {
+ @Deprecated public class MockPackageManager extends android.content.pm.PackageManager {
method public void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
method public boolean arePermissionsIndividuallyControlled();
- method public java.util.List<android.content.IntentFilter> getAllIntentFilters(java.lang.String);
- method public java.lang.String getDefaultBrowserPackageNameAsUser(int);
+ method @Deprecated public java.util.List<android.content.IntentFilter> getAllIntentFilters(String);
+ method public String getDefaultBrowserPackageNameAsUser(int);
method public java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
- method public android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
+ method public android.graphics.drawable.Drawable getInstantAppIcon(String);
method public android.content.ComponentName getInstantAppInstallerComponent();
method public android.content.ComponentName getInstantAppResolverSettingsComponent();
method public java.util.List<android.content.pm.InstantAppInfo> getInstantApps();
- method public java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
- method public int getIntentVerificationStatusAsUser(java.lang.String, int);
- method public int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
- method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
+ method public java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(String);
+ method public int getIntentVerificationStatusAsUser(String, int);
+ method public int getPermissionFlags(String, String, android.os.UserHandle);
+ method public void grantRuntimePermission(String, String, android.os.UserHandle);
+ method public int installExistingPackage(String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int installExistingPackage(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void registerDexModule(String, @Nullable android.content.pm.PackageManager.DexModuleRegisterCallback);
method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
- method public void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
- method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
- method public void setUpdateAvailable(java.lang.String, boolean);
- method public boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
- method public void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
+ method public void revokeRuntimePermission(String, String, android.os.UserHandle);
+ method public boolean setDefaultBrowserPackageNameAsUser(String, int);
+ method public String[] setPackagesSuspended(String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, String);
+ method public void setUpdateAvailable(String, boolean);
+ method public boolean updateIntentVerificationStatusAsUser(String, int, int);
+ method public void updatePermissionFlags(String, String, int, int, android.os.UserHandle);
method public void verifyIntentFilter(int, int, java.util.List<java.lang.String>);
}
diff --git a/test-mock/api/system-removed.txt b/test-mock/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-mock/api/system-removed.txt
+++ b/test-mock/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-mock/api/test-current.txt b/test-mock/api/test-current.txt
index 8b2c815432ea..ab10800ac534 100644
--- a/test-mock/api/test-current.txt
+++ b/test-mock/api/test-current.txt
@@ -1,17 +1,18 @@
+// Signature format: 2.0
package android.test.mock {
- public deprecated class MockPackageManager extends android.content.pm.PackageManager {
+ @Deprecated public class MockPackageManager extends android.content.pm.PackageManager {
method public boolean arePermissionsIndividuallyControlled();
- method public java.lang.String getDefaultBrowserPackageNameAsUser(int);
- method public int getInstallReason(java.lang.String, android.os.UserHandle);
+ method public String getDefaultBrowserPackageNameAsUser(int);
+ method public int getInstallReason(String, android.os.UserHandle);
method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
method public java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
- method public java.lang.String[] getNamesForUids(int[]);
- method public java.lang.String getPermissionControllerPackageName();
- method public java.lang.String getServicesSystemSharedLibraryPackageName();
- method public java.lang.String getSharedSystemSharedLibraryPackageName();
- method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public String[] getNamesForUids(int[]);
+ method public String getPermissionControllerPackageName();
+ method @NonNull public String getServicesSystemSharedLibraryPackageName();
+ method @NonNull public String getSharedSystemSharedLibraryPackageName();
+ method public void grantRuntimePermission(String, String, android.os.UserHandle);
+ method public void revokeRuntimePermission(String, String, android.os.UserHandle);
}
}
diff --git a/test-mock/api/test-removed.txt b/test-mock/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-mock/api/test-removed.txt
+++ b/test-mock/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-runner/api/current.txt b/test-runner/api/current.txt
index 4ba1b8f2fdc1..c093ac7c8d4d 100644
--- a/test-runner/api/current.txt
+++ b/test-runner/api/current.txt
@@ -1,102 +1,103 @@
+// Signature format: 2.0
package android.test {
- public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
- ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>);
- ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean);
- method public T getActivity();
- method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
+ @Deprecated public abstract class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor @Deprecated public ActivityInstrumentationTestCase(String, Class<T>);
+ ctor @Deprecated public ActivityInstrumentationTestCase(String, Class<T>, boolean);
+ method @Deprecated public T getActivity();
+ method @Deprecated public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
}
- public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
- ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>);
- ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>);
- method public T getActivity();
- method public void setActivityInitialTouchMode(boolean);
- method public void setActivityIntent(android.content.Intent);
+ @Deprecated public abstract class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor @Deprecated public ActivityInstrumentationTestCase2(String, Class<T>);
+ ctor @Deprecated public ActivityInstrumentationTestCase2(Class<T>);
+ method @Deprecated public T getActivity();
+ method @Deprecated public void setActivityInitialTouchMode(boolean);
+ method @Deprecated public void setActivityIntent(android.content.Intent);
}
- public abstract deprecated class ActivityTestCase extends android.test.InstrumentationTestCase {
- ctor public ActivityTestCase();
- method protected android.app.Activity getActivity();
- method protected void scrubClass(java.lang.Class<?>) throws java.lang.IllegalAccessException;
- method protected void setActivity(android.app.Activity);
+ @Deprecated public abstract class ActivityTestCase extends android.test.InstrumentationTestCase {
+ ctor @Deprecated public ActivityTestCase();
+ method @Deprecated protected android.app.Activity getActivity();
+ method @Deprecated protected void scrubClass(Class<?>) throws java.lang.IllegalAccessException;
+ method @Deprecated protected void setActivity(android.app.Activity);
}
- public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
- ctor public ActivityUnitTestCase(java.lang.Class<T>);
- method public T getActivity();
- method public int getFinishedActivityRequest();
- method public int getRequestedOrientation();
- method public android.content.Intent getStartedActivityIntent();
- method public int getStartedActivityRequest();
- method public boolean isFinishCalled();
- method public void setActivityContext(android.content.Context);
- method public void setApplication(android.app.Application);
- method protected T startActivity(android.content.Intent, android.os.Bundle, java.lang.Object);
+ @Deprecated public abstract class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor @Deprecated public ActivityUnitTestCase(Class<T>);
+ method @Deprecated public T getActivity();
+ method @Deprecated public int getFinishedActivityRequest();
+ method @Deprecated public int getRequestedOrientation();
+ method @Deprecated public android.content.Intent getStartedActivityIntent();
+ method @Deprecated public int getStartedActivityRequest();
+ method @Deprecated public boolean isFinishCalled();
+ method @Deprecated public void setActivityContext(android.content.Context);
+ method @Deprecated public void setApplication(android.app.Application);
+ method @Deprecated protected T startActivity(android.content.Intent, android.os.Bundle, Object);
}
- public deprecated class AndroidTestRunner extends junit.runner.BaseTestRunner {
- ctor public AndroidTestRunner();
- method public void addTestListener(junit.framework.TestListener);
- method public void clearTestListeners();
- method protected junit.framework.TestResult createTestResult();
- method public java.util.List<junit.framework.TestCase> getTestCases();
- method public java.lang.String getTestClassName();
- method public junit.framework.TestResult getTestResult();
- method protected java.lang.Class loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
- method protected void runFailed(java.lang.String);
- method public void runTest();
- method public void runTest(junit.framework.TestResult);
- method public void setContext(android.content.Context);
- method public deprecated void setInstrumentaiton(android.app.Instrumentation);
- method public void setInstrumentation(android.app.Instrumentation);
- method public void setTest(junit.framework.Test);
- method public void setTestClassName(java.lang.String, java.lang.String);
- method public void testEnded(java.lang.String);
- method public void testFailed(int, junit.framework.Test, java.lang.Throwable);
- method public void testStarted(java.lang.String);
+ @Deprecated public class AndroidTestRunner extends junit.runner.BaseTestRunner {
+ ctor @Deprecated public AndroidTestRunner();
+ method @Deprecated public void addTestListener(junit.framework.TestListener);
+ method @Deprecated public void clearTestListeners();
+ method @Deprecated protected junit.framework.TestResult createTestResult();
+ method @Deprecated public java.util.List<junit.framework.TestCase> getTestCases();
+ method @Deprecated public String getTestClassName();
+ method @Deprecated public junit.framework.TestResult getTestResult();
+ method @Deprecated protected Class loadSuiteClass(String) throws java.lang.ClassNotFoundException;
+ method @Deprecated protected void runFailed(String);
+ method @Deprecated public void runTest();
+ method @Deprecated public void runTest(junit.framework.TestResult);
+ method @Deprecated public void setContext(android.content.Context);
+ method @Deprecated public void setInstrumentaiton(android.app.Instrumentation);
+ method @Deprecated public void setInstrumentation(android.app.Instrumentation);
+ method @Deprecated public void setTest(junit.framework.Test);
+ method @Deprecated public void setTestClassName(String, String);
+ method @Deprecated public void testEnded(String);
+ method @Deprecated public void testFailed(int, junit.framework.Test, Throwable);
+ method @Deprecated public void testStarted(String);
}
- public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
- ctor public ApplicationTestCase(java.lang.Class<T>);
- method protected final void createApplication();
- method public T getApplication();
- method public android.content.Context getSystemContext();
- method protected final void terminateApplication();
- method public final void testApplicationTestCaseSetUpProperly() throws java.lang.Exception;
+ @Deprecated public abstract class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
+ ctor @Deprecated public ApplicationTestCase(Class<T>);
+ method @Deprecated protected final void createApplication();
+ method @Deprecated public T getApplication();
+ method @Deprecated public android.content.Context getSystemContext();
+ method @Deprecated protected final void terminateApplication();
+ method @Deprecated public final void testApplicationTestCaseSetUpProperly() throws java.lang.Exception;
}
- public deprecated class AssertionFailedError extends java.lang.Error {
- ctor public AssertionFailedError();
- ctor public AssertionFailedError(java.lang.String);
+ @Deprecated public class AssertionFailedError extends java.lang.Error {
+ ctor @Deprecated public AssertionFailedError();
+ ctor @Deprecated public AssertionFailedError(String);
}
- public deprecated class ComparisonFailure extends android.test.AssertionFailedError {
- ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
+ @Deprecated public class ComparisonFailure extends android.test.AssertionFailedError {
+ ctor @Deprecated public ComparisonFailure(String, String, String);
}
- public deprecated class InstrumentationTestRunner extends android.app.Instrumentation implements android.test.TestSuiteProvider {
- ctor public InstrumentationTestRunner();
- method public junit.framework.TestSuite getAllTests();
- method protected android.test.AndroidTestRunner getAndroidTestRunner();
- method public android.os.Bundle getArguments();
- method public java.lang.ClassLoader getLoader();
- method public junit.framework.TestSuite getTestSuite();
- field public static final java.lang.String REPORT_KEY_NAME_CLASS = "class";
- field public static final java.lang.String REPORT_KEY_NAME_TEST = "test";
- field public static final java.lang.String REPORT_KEY_NUM_CURRENT = "current";
- field public static final java.lang.String REPORT_KEY_NUM_TOTAL = "numtests";
- field public static final java.lang.String REPORT_KEY_STACK = "stack";
- field public static final java.lang.String REPORT_VALUE_ID = "InstrumentationTestRunner";
- field public static final int REPORT_VALUE_RESULT_ERROR = -1; // 0xffffffff
- field public static final int REPORT_VALUE_RESULT_FAILURE = -2; // 0xfffffffe
- field public static final int REPORT_VALUE_RESULT_OK = 0; // 0x0
- field public static final int REPORT_VALUE_RESULT_START = 1; // 0x1
+ @Deprecated public class InstrumentationTestRunner extends android.app.Instrumentation implements android.test.TestSuiteProvider {
+ ctor @Deprecated public InstrumentationTestRunner();
+ method @Deprecated public junit.framework.TestSuite getAllTests();
+ method @Deprecated protected android.test.AndroidTestRunner getAndroidTestRunner();
+ method @Deprecated public android.os.Bundle getArguments();
+ method @Deprecated public ClassLoader getLoader();
+ method @Deprecated public junit.framework.TestSuite getTestSuite();
+ field @Deprecated public static final String REPORT_KEY_NAME_CLASS = "class";
+ field @Deprecated public static final String REPORT_KEY_NAME_TEST = "test";
+ field @Deprecated public static final String REPORT_KEY_NUM_CURRENT = "current";
+ field @Deprecated public static final String REPORT_KEY_NUM_TOTAL = "numtests";
+ field @Deprecated public static final String REPORT_KEY_STACK = "stack";
+ field @Deprecated public static final String REPORT_VALUE_ID = "InstrumentationTestRunner";
+ field @Deprecated public static final int REPORT_VALUE_RESULT_ERROR = -1; // 0xffffffff
+ field @Deprecated public static final int REPORT_VALUE_RESULT_FAILURE = -2; // 0xfffffffe
+ field @Deprecated public static final int REPORT_VALUE_RESULT_OK = 0; // 0x0
+ field @Deprecated public static final int REPORT_VALUE_RESULT_START = 1; // 0x1
}
- public deprecated class IsolatedContext extends android.content.ContextWrapper {
- ctor public IsolatedContext(android.content.ContentResolver, android.content.Context);
- method public java.util.List<android.content.Intent> getAndClearBroadcastIntents();
+ @Deprecated public class IsolatedContext extends android.content.ContextWrapper {
+ ctor @Deprecated public IsolatedContext(android.content.ContentResolver, android.content.Context);
+ method @Deprecated public java.util.List<android.content.Intent> getAndClearBroadcastIntents();
}
public class LoaderTestCase extends android.test.AndroidTestCase {
@@ -104,184 +105,184 @@ package android.test {
method public <T> T getLoaderResultSynchronously(android.content.Loader<T>);
}
- public final deprecated class MoreAsserts {
- method public static void assertAssignableFrom(java.lang.Class<?>, java.lang.Object);
- method public static void assertAssignableFrom(java.lang.Class<?>, java.lang.Class<?>);
- method public static java.util.regex.MatchResult assertContainsRegex(java.lang.String, java.lang.String, java.lang.String);
- method public static java.util.regex.MatchResult assertContainsRegex(java.lang.String, java.lang.String);
- method public static void assertContentsInAnyOrder(java.lang.String, java.lang.Iterable<?>, java.lang.Object...);
- method public static void assertContentsInAnyOrder(java.lang.Iterable<?>, java.lang.Object...);
- method public static void assertContentsInOrder(java.lang.String, java.lang.Iterable<?>, java.lang.Object...);
- method public static void assertContentsInOrder(java.lang.Iterable<?>, java.lang.Object...);
- method public static void assertEmpty(java.lang.String, java.lang.Iterable<?>);
- method public static void assertEmpty(java.lang.Iterable<?>);
- method public static void assertEmpty(java.lang.String, java.util.Map<?, ?>);
- method public static void assertEmpty(java.util.Map<?, ?>);
- method public static void assertEquals(java.lang.String, byte[], byte[]);
- method public static void assertEquals(byte[], byte[]);
- method public static void assertEquals(java.lang.String, int[], int[]);
- method public static void assertEquals(int[], int[]);
- method public static void assertEquals(java.lang.String, double[], double[]);
- method public static void assertEquals(double[], double[]);
- method public static void assertEquals(java.lang.String, java.lang.Object[], java.lang.Object[]);
- method public static void assertEquals(java.lang.Object[], java.lang.Object[]);
- method public static void assertEquals(java.lang.String, java.util.Set<?>, java.util.Set<?>);
- method public static void assertEquals(java.util.Set<?>, java.util.Set<?>);
- method public static java.util.regex.MatchResult assertMatchesRegex(java.lang.String, java.lang.String, java.lang.String);
- method public static java.util.regex.MatchResult assertMatchesRegex(java.lang.String, java.lang.String);
- method public static void assertNotContainsRegex(java.lang.String, java.lang.String, java.lang.String);
- method public static void assertNotContainsRegex(java.lang.String, java.lang.String);
- method public static void assertNotEmpty(java.lang.String, java.lang.Iterable<?>);
- method public static void assertNotEmpty(java.lang.Iterable<?>);
- method public static void assertNotEmpty(java.lang.String, java.util.Map<?, ?>);
- method public static void assertNotEmpty(java.util.Map<?, ?>);
- method public static void assertNotEqual(java.lang.String, java.lang.Object, java.lang.Object);
- method public static void assertNotEqual(java.lang.Object, java.lang.Object);
- method public static void assertNotMatchesRegex(java.lang.String, java.lang.String, java.lang.String);
- method public static void assertNotMatchesRegex(java.lang.String, java.lang.String);
- method public static void checkEqualsAndHashCodeMethods(java.lang.String, java.lang.Object, java.lang.Object, boolean);
- method public static void checkEqualsAndHashCodeMethods(java.lang.Object, java.lang.Object, boolean);
+ @Deprecated public final class MoreAsserts {
+ method @Deprecated public static void assertAssignableFrom(Class<?>, Object);
+ method @Deprecated public static void assertAssignableFrom(Class<?>, Class<?>);
+ method @Deprecated public static java.util.regex.MatchResult assertContainsRegex(String, String, String);
+ method @Deprecated public static java.util.regex.MatchResult assertContainsRegex(String, String);
+ method @Deprecated public static void assertContentsInAnyOrder(String, Iterable<?>, java.lang.Object...);
+ method @Deprecated public static void assertContentsInAnyOrder(Iterable<?>, java.lang.Object...);
+ method @Deprecated public static void assertContentsInOrder(String, Iterable<?>, java.lang.Object...);
+ method @Deprecated public static void assertContentsInOrder(Iterable<?>, java.lang.Object...);
+ method @Deprecated public static void assertEmpty(String, Iterable<?>);
+ method @Deprecated public static void assertEmpty(Iterable<?>);
+ method @Deprecated public static void assertEmpty(String, java.util.Map<?,?>);
+ method @Deprecated public static void assertEmpty(java.util.Map<?,?>);
+ method @Deprecated public static void assertEquals(String, byte[], byte[]);
+ method @Deprecated public static void assertEquals(byte[], byte[]);
+ method @Deprecated public static void assertEquals(String, int[], int[]);
+ method @Deprecated public static void assertEquals(int[], int[]);
+ method @Deprecated public static void assertEquals(String, double[], double[]);
+ method @Deprecated public static void assertEquals(double[], double[]);
+ method @Deprecated public static void assertEquals(String, Object[], Object[]);
+ method @Deprecated public static void assertEquals(Object[], Object[]);
+ method @Deprecated public static void assertEquals(String, java.util.Set<?>, java.util.Set<?>);
+ method @Deprecated public static void assertEquals(java.util.Set<?>, java.util.Set<?>);
+ method @Deprecated public static java.util.regex.MatchResult assertMatchesRegex(String, String, String);
+ method @Deprecated public static java.util.regex.MatchResult assertMatchesRegex(String, String);
+ method @Deprecated public static void assertNotContainsRegex(String, String, String);
+ method @Deprecated public static void assertNotContainsRegex(String, String);
+ method @Deprecated public static void assertNotEmpty(String, Iterable<?>);
+ method @Deprecated public static void assertNotEmpty(Iterable<?>);
+ method @Deprecated public static void assertNotEmpty(String, java.util.Map<?,?>);
+ method @Deprecated public static void assertNotEmpty(java.util.Map<?,?>);
+ method @Deprecated public static void assertNotEqual(String, Object, Object);
+ method @Deprecated public static void assertNotEqual(Object, Object);
+ method @Deprecated public static void assertNotMatchesRegex(String, String, String);
+ method @Deprecated public static void assertNotMatchesRegex(String, String);
+ method @Deprecated public static void checkEqualsAndHashCodeMethods(String, Object, Object, boolean);
+ method @Deprecated public static void checkEqualsAndHashCodeMethods(Object, Object, boolean);
}
- public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
- ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String);
- method public android.test.mock.MockContentResolver getMockContentResolver();
- method public android.test.IsolatedContext getMockContext();
- method public T getProvider();
- method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ @Deprecated public abstract class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
+ ctor @Deprecated public ProviderTestCase(Class<T>, String);
+ method @Deprecated public android.test.mock.MockContentResolver getMockContentResolver();
+ method @Deprecated public android.test.IsolatedContext getMockContext();
+ method @Deprecated public T getProvider();
+ method @Deprecated public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, Class<T>, String, String, int, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
}
public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
- ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String);
+ ctor public ProviderTestCase2(Class<T>, String);
method public android.test.mock.MockContentResolver getMockContentResolver();
method public android.test.IsolatedContext getMockContext();
method public T getProvider();
- method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, String, Class<T>, String, String, int, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
}
- public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper {
- ctor public RenamingDelegatingContext(android.content.Context, java.lang.String);
- ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String);
- method public java.lang.String getDatabasePrefix();
- method public void makeExistingFilesAndDbsAccessible();
- method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
- method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ @Deprecated public class RenamingDelegatingContext extends android.content.ContextWrapper {
+ ctor @Deprecated public RenamingDelegatingContext(android.content.Context, String);
+ ctor @Deprecated public RenamingDelegatingContext(android.content.Context, android.content.Context, String);
+ method @Deprecated public String getDatabasePrefix();
+ method @Deprecated public void makeExistingFilesAndDbsAccessible();
+ method @Deprecated public static <T extends android.content.ContentProvider> T providerWithRenamedContext(Class<T>, android.content.Context, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method @Deprecated public static <T extends android.content.ContentProvider> T providerWithRenamedContext(Class<T>, android.content.Context, String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
}
- public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
- ctor public ServiceTestCase(java.lang.Class<T>);
- method protected android.os.IBinder bindService(android.content.Intent);
- method public android.app.Application getApplication();
- method public T getService();
- method public android.content.Context getSystemContext();
- method public void setApplication(android.app.Application);
- method protected void setupService();
- method protected void shutdownService();
- method protected void startService(android.content.Intent);
- method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
+ @Deprecated public abstract class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
+ ctor @Deprecated public ServiceTestCase(Class<T>);
+ method @Deprecated protected android.os.IBinder bindService(android.content.Intent);
+ method @Deprecated public android.app.Application getApplication();
+ method @Deprecated public T getService();
+ method @Deprecated public android.content.Context getSystemContext();
+ method @Deprecated public void setApplication(android.app.Application);
+ method @Deprecated protected void setupService();
+ method @Deprecated protected void shutdownService();
+ method @Deprecated protected void startService(android.content.Intent);
+ method @Deprecated public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
}
- public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
- ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>);
- method public T getActivity();
- method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
+ @Deprecated public abstract class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
+ ctor @Deprecated public SingleLaunchActivityTestCase(String, Class<T>);
+ method @Deprecated public T getActivity();
+ method @Deprecated public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
}
- public deprecated class SyncBaseInstrumentation extends android.test.InstrumentationTestCase {
- ctor public SyncBaseInstrumentation();
- method protected void cancelSyncsandDisableAutoSync();
- method protected void syncProvider(android.net.Uri, java.lang.String, java.lang.String) throws java.lang.Exception;
+ @Deprecated public class SyncBaseInstrumentation extends android.test.InstrumentationTestCase {
+ ctor @Deprecated public SyncBaseInstrumentation();
+ method @Deprecated protected void cancelSyncsandDisableAutoSync();
+ method @Deprecated protected void syncProvider(android.net.Uri, String, String) throws java.lang.Exception;
}
- public abstract deprecated interface TestSuiteProvider {
- method public abstract junit.framework.TestSuite getTestSuite();
+ @Deprecated public interface TestSuiteProvider {
+ method @Deprecated public junit.framework.TestSuite getTestSuite();
}
- public deprecated class TouchUtils {
- ctor public TouchUtils();
- method public static void clickView(android.test.InstrumentationTestCase, android.view.View);
- method public static deprecated void drag(android.test.ActivityInstrumentationTestCase, float, float, float, float, int);
- method public static void drag(android.test.InstrumentationTestCase, float, float, float, float, int);
- method public static deprecated void dragQuarterScreenDown(android.test.ActivityInstrumentationTestCase);
- method public static void dragQuarterScreenDown(android.test.InstrumentationTestCase, android.app.Activity);
- method public static deprecated void dragQuarterScreenUp(android.test.ActivityInstrumentationTestCase);
- method public static void dragQuarterScreenUp(android.test.InstrumentationTestCase, android.app.Activity);
- method public static deprecated int dragViewBy(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
- method public static deprecated int dragViewBy(android.test.InstrumentationTestCase, android.view.View, int, int, int);
- method public static deprecated int dragViewTo(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
- method public static int dragViewTo(android.test.InstrumentationTestCase, android.view.View, int, int, int);
- method public static deprecated void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View);
- method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View);
- method public static deprecated void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View, int);
- method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View, int);
- method public static deprecated void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View);
- method public static deprecated void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View, int);
- method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View);
- method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View, int);
- method public static deprecated int dragViewToX(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
- method public static int dragViewToX(android.test.InstrumentationTestCase, android.view.View, int, int);
- method public static deprecated int dragViewToY(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
- method public static int dragViewToY(android.test.InstrumentationTestCase, android.view.View, int, int);
- method public static deprecated void longClickView(android.test.ActivityInstrumentationTestCase, android.view.View);
- method public static void longClickView(android.test.InstrumentationTestCase, android.view.View);
- method public static deprecated void scrollToBottom(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
- method public static void scrollToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
- method public static deprecated void scrollToTop(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
- method public static void scrollToTop(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
- method public static void tapView(android.test.InstrumentationTestCase, android.view.View);
- method public static void touchAndCancelView(android.test.InstrumentationTestCase, android.view.View);
+ @Deprecated public class TouchUtils {
+ ctor @Deprecated public TouchUtils();
+ method @Deprecated public static void clickView(android.test.InstrumentationTestCase, android.view.View);
+ method @Deprecated public static void drag(android.test.ActivityInstrumentationTestCase, float, float, float, float, int);
+ method @Deprecated public static void drag(android.test.InstrumentationTestCase, float, float, float, float, int);
+ method @Deprecated public static void dragQuarterScreenDown(android.test.ActivityInstrumentationTestCase);
+ method @Deprecated public static void dragQuarterScreenDown(android.test.InstrumentationTestCase, android.app.Activity);
+ method @Deprecated public static void dragQuarterScreenUp(android.test.ActivityInstrumentationTestCase);
+ method @Deprecated public static void dragQuarterScreenUp(android.test.InstrumentationTestCase, android.app.Activity);
+ method @Deprecated public static int dragViewBy(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
+ method @Deprecated public static int dragViewBy(android.test.InstrumentationTestCase, android.view.View, int, int, int);
+ method @Deprecated public static int dragViewTo(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
+ method @Deprecated public static int dragViewTo(android.test.InstrumentationTestCase, android.view.View, int, int, int);
+ method @Deprecated public static void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method @Deprecated public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View);
+ method @Deprecated public static void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View, int);
+ method @Deprecated public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View, int);
+ method @Deprecated public static void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method @Deprecated public static void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View, int);
+ method @Deprecated public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View);
+ method @Deprecated public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View, int);
+ method @Deprecated public static int dragViewToX(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
+ method @Deprecated public static int dragViewToX(android.test.InstrumentationTestCase, android.view.View, int, int);
+ method @Deprecated public static int dragViewToY(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
+ method @Deprecated public static int dragViewToY(android.test.InstrumentationTestCase, android.view.View, int, int);
+ method @Deprecated public static void longClickView(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method @Deprecated public static void longClickView(android.test.InstrumentationTestCase, android.view.View);
+ method @Deprecated public static void scrollToBottom(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
+ method @Deprecated public static void scrollToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
+ method @Deprecated public static void scrollToTop(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
+ method @Deprecated public static void scrollToTop(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
+ method @Deprecated public static void tapView(android.test.InstrumentationTestCase, android.view.View);
+ method @Deprecated public static void touchAndCancelView(android.test.InstrumentationTestCase, android.view.View);
}
- public deprecated class ViewAsserts {
- method public static void assertBaselineAligned(android.view.View, android.view.View);
- method public static void assertBottomAligned(android.view.View, android.view.View);
- method public static void assertBottomAligned(android.view.View, android.view.View, int);
- method public static void assertGroupContains(android.view.ViewGroup, android.view.View);
- method public static void assertGroupIntegrity(android.view.ViewGroup);
- method public static void assertGroupNotContains(android.view.ViewGroup, android.view.View);
- method public static void assertHasScreenCoordinates(android.view.View, android.view.View, int, int);
- method public static void assertHorizontalCenterAligned(android.view.View, android.view.View);
- method public static void assertLeftAligned(android.view.View, android.view.View);
- method public static void assertLeftAligned(android.view.View, android.view.View, int);
- method public static void assertOffScreenAbove(android.view.View, android.view.View);
- method public static void assertOffScreenBelow(android.view.View, android.view.View);
- method public static void assertOnScreen(android.view.View, android.view.View);
- method public static void assertRightAligned(android.view.View, android.view.View);
- method public static void assertRightAligned(android.view.View, android.view.View, int);
- method public static void assertTopAligned(android.view.View, android.view.View);
- method public static void assertTopAligned(android.view.View, android.view.View, int);
- method public static void assertVerticalCenterAligned(android.view.View, android.view.View);
+ @Deprecated public class ViewAsserts {
+ method @Deprecated public static void assertBaselineAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertBottomAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertBottomAligned(android.view.View, android.view.View, int);
+ method @Deprecated public static void assertGroupContains(android.view.ViewGroup, android.view.View);
+ method @Deprecated public static void assertGroupIntegrity(android.view.ViewGroup);
+ method @Deprecated public static void assertGroupNotContains(android.view.ViewGroup, android.view.View);
+ method @Deprecated public static void assertHasScreenCoordinates(android.view.View, android.view.View, int, int);
+ method @Deprecated public static void assertHorizontalCenterAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertLeftAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertLeftAligned(android.view.View, android.view.View, int);
+ method @Deprecated public static void assertOffScreenAbove(android.view.View, android.view.View);
+ method @Deprecated public static void assertOffScreenBelow(android.view.View, android.view.View);
+ method @Deprecated public static void assertOnScreen(android.view.View, android.view.View);
+ method @Deprecated public static void assertRightAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertRightAligned(android.view.View, android.view.View, int);
+ method @Deprecated public static void assertTopAligned(android.view.View, android.view.View);
+ method @Deprecated public static void assertTopAligned(android.view.View, android.view.View, int);
+ method @Deprecated public static void assertVerticalCenterAligned(android.view.View, android.view.View);
}
}
package android.test.suitebuilder {
- public deprecated class TestMethod {
- ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
- ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
- ctor public TestMethod(junit.framework.TestCase);
- method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
- method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
- method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass();
- method public java.lang.String getEnclosingClassname();
- method public java.lang.String getName();
+ @Deprecated public class TestMethod {
+ ctor @Deprecated public TestMethod(java.lang.reflect.Method, Class<? extends junit.framework.TestCase>);
+ ctor @Deprecated public TestMethod(String, Class<? extends junit.framework.TestCase>);
+ ctor @Deprecated public TestMethod(junit.framework.TestCase);
+ method @Deprecated public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
+ method @Deprecated public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T>);
+ method @Deprecated public Class<? extends junit.framework.TestCase> getEnclosingClass();
+ method @Deprecated public String getEnclosingClassname();
+ method @Deprecated public String getName();
}
- public deprecated class TestSuiteBuilder {
- ctor public TestSuiteBuilder(java.lang.Class);
- ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
- method public final junit.framework.TestSuite build();
- method public android.test.suitebuilder.TestSuiteBuilder excludePackages(java.lang.String...);
- method protected java.lang.String getSuiteName();
- method public final android.test.suitebuilder.TestSuiteBuilder includeAllPackagesUnderHere();
- method public android.test.suitebuilder.TestSuiteBuilder includePackages(java.lang.String...);
- method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
+ @Deprecated public class TestSuiteBuilder {
+ ctor @Deprecated public TestSuiteBuilder(Class);
+ ctor @Deprecated public TestSuiteBuilder(String, ClassLoader);
+ method @Deprecated public final junit.framework.TestSuite build();
+ method @Deprecated public android.test.suitebuilder.TestSuiteBuilder excludePackages(java.lang.String...);
+ method @Deprecated protected String getSuiteName();
+ method @Deprecated public final android.test.suitebuilder.TestSuiteBuilder includeAllPackagesUnderHere();
+ method @Deprecated public android.test.suitebuilder.TestSuiteBuilder includePackages(java.lang.String...);
+ method @Deprecated public android.test.suitebuilder.TestSuiteBuilder named(String);
}
- public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
- ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
- method public void testSuiteConstructionFailed();
+ @Deprecated public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ ctor @Deprecated public TestSuiteBuilder.FailedToCreateTests(Exception);
+ method @Deprecated public void testSuiteConstructionFailed();
}
}
@@ -290,44 +291,44 @@ package junit.runner {
public abstract class BaseTestRunner implements junit.framework.TestListener {
ctor public BaseTestRunner();
- method public synchronized void addError(junit.framework.Test, java.lang.Throwable);
- method public synchronized void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method public void addError(junit.framework.Test, Throwable);
+ method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
method protected void clearStatus();
- method public java.lang.String elapsedTimeAsString(long);
- method public synchronized void endTest(junit.framework.Test);
- method public java.lang.String extractClassName(java.lang.String);
- method public static java.lang.String getFilteredTrace(java.lang.Throwable);
- method public static java.lang.String getFilteredTrace(java.lang.String);
- method public deprecated junit.runner.TestSuiteLoader getLoader();
- method public static java.lang.String getPreference(java.lang.String);
- method public static int getPreference(java.lang.String, int);
+ method public String elapsedTimeAsString(long);
+ method public void endTest(junit.framework.Test);
+ method public String extractClassName(String);
+ method public static String getFilteredTrace(Throwable);
+ method public static String getFilteredTrace(String);
+ method @Deprecated public junit.runner.TestSuiteLoader getLoader();
+ method public static String getPreference(String);
+ method public static int getPreference(String, int);
method protected static java.util.Properties getPreferences();
- method public junit.framework.Test getTest(java.lang.String);
- method public static deprecated boolean inVAJava();
- method protected java.lang.Class<?> loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
- method protected java.lang.String processArguments(java.lang.String[]);
- method protected abstract void runFailed(java.lang.String);
+ method public junit.framework.Test getTest(String);
+ method @Deprecated public static boolean inVAJava();
+ method protected Class<?> loadSuiteClass(String) throws java.lang.ClassNotFoundException;
+ method protected String processArguments(String[]);
+ method protected abstract void runFailed(String);
method public static void savePreferences() throws java.io.IOException;
method public void setLoading(boolean);
- method public void setPreference(java.lang.String, java.lang.String);
+ method public void setPreference(String, String);
method protected static void setPreferences(java.util.Properties);
method protected static boolean showStackRaw();
- method public synchronized void startTest(junit.framework.Test);
- method public abstract void testEnded(java.lang.String);
- method public abstract void testFailed(int, junit.framework.Test, java.lang.Throwable);
- method public abstract void testStarted(java.lang.String);
- method public static java.lang.String truncate(java.lang.String);
+ method public void startTest(junit.framework.Test);
+ method public abstract void testEnded(String);
+ method public abstract void testFailed(int, junit.framework.Test, Throwable);
+ method public abstract void testStarted(String);
+ method public static String truncate(String);
method protected boolean useReloadingTestSuiteLoader();
- field public static final java.lang.String SUITE_METHODNAME = "suite";
+ field public static final String SUITE_METHODNAME = "suite";
}
- public abstract interface TestSuiteLoader {
- method public abstract java.lang.Class load(java.lang.String) throws java.lang.ClassNotFoundException;
- method public abstract java.lang.Class reload(java.lang.Class) throws java.lang.ClassNotFoundException;
+ public interface TestSuiteLoader {
+ method public Class load(String) throws java.lang.ClassNotFoundException;
+ method public Class reload(Class) throws java.lang.ClassNotFoundException;
}
public class Version {
- method public static java.lang.String id();
+ method public static String id();
}
}
diff --git a/test-runner/api/removed.txt b/test-runner/api/removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-runner/api/removed.txt
+++ b/test-runner/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-runner/api/system-current.txt b/test-runner/api/system-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-runner/api/system-current.txt
+++ b/test-runner/api/system-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-runner/api/system-removed.txt b/test-runner/api/system-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-runner/api/system-removed.txt
+++ b/test-runner/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-runner/api/test-current.txt b/test-runner/api/test-current.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-runner/api/test-current.txt
+++ b/test-runner/api/test-current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/test-runner/api/test-removed.txt b/test-runner/api/test-removed.txt
index e69de29bb2d1..d802177e249b 100644
--- a/test-runner/api/test-removed.txt
+++ b/test-runner/api/test-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/tests/ActivityViewTest/Android.mk b/tests/ActivityViewTest/Android.mk
index 9c8076417bc8..9c7ca7eb5d00 100644
--- a/tests/ActivityViewTest/Android.mk
+++ b/tests/ActivityViewTest/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := ActivityViewTest
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/tests/ActivityViewTest/AndroidManifest.xml b/tests/ActivityViewTest/AndroidManifest.xml
index de54cc9986e5..17eb029166f0 100644
--- a/tests/ActivityViewTest/AndroidManifest.xml
+++ b/tests/ActivityViewTest/AndroidManifest.xml
@@ -35,17 +35,20 @@
<activity android:name=".ActivityViewActivity"
android:label="AV"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density">
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density"
+ android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
<activity android:name=".ActivityViewResizeActivity"
android:label="AV Resize"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density">
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density"
+ android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
<activity android:name=".ActivityViewScrollActivity"
android:label="AV Scroll"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density">
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density"
+ android:windowSoftInputMode="stateHidden">
</activity>
<activity android:name=".ActivityViewTestActivity"
@@ -54,5 +57,10 @@
android:exported="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density">
</activity>
+
+ <activity android:name=".ActivityViewVisibilityActivity"
+ android:label="AV Visibility"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density">
+ </activity>
</application>
</manifest>
diff --git a/tests/ActivityViewTest/res/layout/activity_view_main_activity.xml b/tests/ActivityViewTest/res/layout/activity_view_main_activity.xml
index ba2e91166440..efcaef679a9c 100644
--- a/tests/ActivityViewTest/res/layout/activity_view_main_activity.xml
+++ b/tests/ActivityViewTest/res/layout/activity_view_main_activity.xml
@@ -41,4 +41,10 @@
android:text="Test Resize ActivityView"
android:textAllCaps="false"/>
+ <Button
+ android:id="@+id/visibility_activity_view_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Test ActivityView Visibility"
+ android:textAllCaps="false"/>
</LinearLayout>
diff --git a/tests/ActivityViewTest/res/layout/activity_view_test_activity.xml b/tests/ActivityViewTest/res/layout/activity_view_test_activity.xml
index f7ec56264c3a..338d68adfafb 100644
--- a/tests/ActivityViewTest/res/layout/activity_view_test_activity.xml
+++ b/tests/ActivityViewTest/res/layout/activity_view_test_activity.xml
@@ -15,6 +15,7 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/test_activity_root"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -60,11 +61,10 @@
android:background="#00000000"
android:gravity="center" />
- <View
- android:id="@+id/touch_intercept_view"
+ <EditText
+ android:id="@+id/test_activity_edittext"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#00000000"
- />
-
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_margin="16dp" />
</RelativeLayout> \ No newline at end of file
diff --git a/tests/ActivityViewTest/res/layout/activity_view_visibility_activity.xml b/tests/ActivityViewTest/res/layout/activity_view_visibility_activity.xml
new file mode 100644
index 000000000000..d29d4dfc0428
--- /dev/null
+++ b/tests/ActivityViewTest/res/layout/activity_view_visibility_activity.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#cfd8dc">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/activity_launch_button"
+ android:layout_width="200dp"
+ android:layout_height="wrap_content"
+ android:text="Launch test activity" />
+
+ <Spinner
+ android:id="@+id/visibility_spinner"
+ android:layout_width="200dp"
+ android:layout_height="match_parent"/>
+
+ </LinearLayout>
+
+ <ActivityView
+ android:id="@+id/activity_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</LinearLayout>
diff --git a/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewMainActivity.java b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewMainActivity.java
index 66f0c6a56afd..4f09c28fe711 100644
--- a/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewMainActivity.java
+++ b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewMainActivity.java
@@ -35,5 +35,8 @@ public class ActivityViewMainActivity extends Activity {
findViewById(R.id.resize_activity_view_button).setOnClickListener(
v -> startActivity(new Intent(this, ActivityViewResizeActivity.class)));
+
+ findViewById(R.id.visibility_activity_view_button).setOnClickListener(
+ v -> startActivity(new Intent(this, ActivityViewVisibilityActivity.class)));
}
}
diff --git a/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewTestActivity.java b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewTestActivity.java
index 0d62786f40b0..52aba2b13c42 100644
--- a/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewTestActivity.java
+++ b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewTestActivity.java
@@ -24,31 +24,31 @@ import static android.view.MotionEvent.ACTION_UP;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
+import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.TextView;
-public class ActivityViewTestActivity extends Activity implements View.OnTouchListener {
+public class ActivityViewTestActivity extends Activity {
+ private static final String TAG = "ActivityViewTestActivity";
+ private View mRoot;
private TextView mTextView;
private TextView mWidthTextView;
private TextView mHeightTextView;
private TextView mTouchStateTextView;
- private View mTouchInterceptView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_test_activity);
-
+ mRoot = findViewById(R.id.test_activity_root);
mTextView = findViewById(R.id.test_activity_title);
mWidthTextView = findViewById(R.id.test_activity_width_text);
mHeightTextView = findViewById(R.id.test_activity_height_text);
mTouchStateTextView = findViewById(R.id.test_activity_touch_state);
- mTouchInterceptView = findViewById(R.id.touch_intercept_view);
- mTouchInterceptView.setOnTouchListener(this);
- ViewTreeObserver viewTreeObserver = mTouchInterceptView.getViewTreeObserver();
+ ViewTreeObserver viewTreeObserver = mRoot.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(this::updateDimensionTexts);
}
@@ -86,12 +86,13 @@ public class ActivityViewTestActivity extends Activity implements View.OnTouchLi
}
private void updateStateText(String state) {
+ Log.d(TAG, state);
mTextView.setText(state);
}
private void updateDimensionTexts() {
- mWidthTextView.setText("" + mTouchInterceptView.getWidth());
- mHeightTextView.setText("" + mTouchInterceptView.getHeight());
+ mWidthTextView.setText("" + mRoot.getWidth());
+ mHeightTextView.setText("" + mRoot.getHeight());
}
private void updateTouchState(MotionEvent event) {
@@ -108,8 +109,8 @@ public class ActivityViewTestActivity extends Activity implements View.OnTouchLi
}
@Override
- public boolean onTouch(View v, MotionEvent event) {
+ public boolean dispatchTouchEvent(MotionEvent event) {
updateTouchState(event);
- return true;
+ return super.dispatchTouchEvent(event);
}
}
diff --git a/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewVisibilityActivity.java b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewVisibilityActivity.java
new file mode 100644
index 000000000000..ecd2cf3c578e
--- /dev/null
+++ b/tests/ActivityViewTest/src/com/google/android/test/activityview/ActivityViewVisibilityActivity.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2019 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.google.android.test.activityview;
+
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+
+import android.app.Activity;
+import android.app.ActivityView;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+
+public class ActivityViewVisibilityActivity extends Activity {
+ private static final String[] sVisibilityOptions = {"VISIBLE", "INVISIBLE", "GONE"};
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_view_visibility_activity);
+
+ final ActivityView activityView = findViewById(R.id.activity_view);
+ final Button launchButton = findViewById(R.id.activity_launch_button);
+ launchButton.setOnClickListener(v -> {
+ final Intent intent = new Intent(this, ActivityViewTestActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+ activityView.startActivity(intent);
+ });
+
+ final Spinner visibilitySpinner = findViewById(R.id.visibility_spinner);
+ final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
+ android.R.layout.simple_spinner_item, sVisibilityOptions);
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ visibilitySpinner.setAdapter(adapter);
+ visibilitySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ switch (position) {
+ case 0:
+ activityView.setVisibility(VISIBLE);
+ break;
+ case 1:
+ activityView.setVisibility(INVISIBLE);
+ break;
+ case 2:
+ activityView.setVisibility(GONE);
+ break;
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
+ }
+}
diff --git a/tests/PackageWatchdog/Android.mk b/tests/PackageWatchdog/Android.mk
new file mode 100644
index 000000000000..1c1c2a426d15
--- /dev/null
+++ b/tests/PackageWatchdog/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2019 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# PackageWatchdogTest
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_PACKAGE_NAME := PackageWatchdogTest
+LOCAL_MODULE_TAGS := tests
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ junit \
+ frameworks-base-testutils \
+ android-support-test \
+ services.core
+
+LOCAL_JAVA_LIBRARIES := \
+ android.test.runner
+
+LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_COMPATIBILITY_SUITE := device-tests
+
+include $(BUILD_PACKAGE)
diff --git a/tests/PackageWatchdog/AndroidManifest.xml b/tests/PackageWatchdog/AndroidManifest.xml
new file mode 100644
index 000000000000..fa89528403c3
--- /dev/null
+++ b/tests/PackageWatchdog/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.tests.packagewatchdog" >
+
+ <application android:debuggable="true">
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.tests.packagewatchdog"
+ android:label="PackageWatchdog Test"/>
+</manifest>
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
new file mode 100644
index 000000000000..ec07037b3a8f
--- /dev/null
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2019 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;
+
+import static com.android.server.PackageWatchdog.TRIGGER_FAILURE_COUNT;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.os.test.TestLooper;
+import android.support.test.InstrumentationRegistry;
+
+import com.android.server.PackageWatchdog.PackageHealthObserver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+// TODO(zezeozue): Write test without using PackageWatchdog#getPackages. Just rely on
+// behavior of observers receiving crash notifications or not to determine if it's registered
+/**
+ * Test PackageWatchdog.
+ */
+public class PackageWatchdogTest {
+ private static final String APP_A = "com.package.a";
+ private static final String APP_B = "com.package.b";
+ private static final String OBSERVER_NAME_1 = "observer1";
+ private static final String OBSERVER_NAME_2 = "observer2";
+ private static final String OBSERVER_NAME_3 = "observer3";
+ private static final long SHORT_DURATION = TimeUnit.SECONDS.toMillis(1);
+ private static final long LONG_DURATION = TimeUnit.SECONDS.toMillis(5);
+ private TestLooper mTestLooper;
+
+ @Before
+ public void setUp() throws Exception {
+ mTestLooper = new TestLooper();
+ mTestLooper.startAutoDispatch();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ new File(InstrumentationRegistry.getContext().getFilesDir(),
+ "package-watchdog.xml").delete();
+ }
+
+ /**
+ * Test registration, unregistration, package expiry and duration reduction
+ */
+ @Test
+ public void testRegistration() throws Exception {
+ PackageWatchdog watchdog = createWatchdog();
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
+ TestObserver observer3 = new TestObserver(OBSERVER_NAME_3);
+
+ // Start observing for observer1 which will be unregistered
+ watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
+ // Start observing for observer2 which will expire
+ watchdog.startObservingHealth(observer2, Arrays.asList(APP_A, APP_B), SHORT_DURATION);
+ // Start observing for observer3 which will have expiry duration reduced
+ watchdog.startObservingHealth(observer3, Arrays.asList(APP_A), LONG_DURATION);
+
+ // Verify packages observed at start
+ // 1
+ assertEquals(1, watchdog.getPackages(observer1).size());
+ assertTrue(watchdog.getPackages(observer1).contains(APP_A));
+ // 2
+ assertEquals(2, watchdog.getPackages(observer2).size());
+ assertTrue(watchdog.getPackages(observer2).contains(APP_A));
+ assertTrue(watchdog.getPackages(observer2).contains(APP_B));
+ // 3
+ assertEquals(1, watchdog.getPackages(observer3).size());
+ assertTrue(watchdog.getPackages(observer3).contains(APP_A));
+
+ // Then unregister observer1
+ watchdog.unregisterHealthObserver(observer1);
+
+ // Verify observer2 and observer3 left
+ // 1
+ assertNull(watchdog.getPackages(observer1));
+ // 2
+ assertEquals(2, watchdog.getPackages(observer2).size());
+ assertTrue(watchdog.getPackages(observer2).contains(APP_A));
+ assertTrue(watchdog.getPackages(observer2).contains(APP_B));
+ // 3
+ assertEquals(1, watchdog.getPackages(observer3).size());
+ assertTrue(watchdog.getPackages(observer3).contains(APP_A));
+
+ // Then advance time a little and run messages in Handlers so observer2 expires
+ Thread.sleep(SHORT_DURATION);
+ mTestLooper.dispatchAll();
+
+ // Verify observer3 left with reduced expiry duration
+ // 1
+ assertNull(watchdog.getPackages(observer1));
+ // 2
+ assertNull(watchdog.getPackages(observer2));
+ // 3
+ assertEquals(1, watchdog.getPackages(observer3).size());
+ assertTrue(watchdog.getPackages(observer3).contains(APP_A));
+
+ // Then advance time some more and run messages in Handlers so observer3 expires
+ Thread.sleep(LONG_DURATION);
+ mTestLooper.dispatchAll();
+
+ // Verify observer3 expired
+ // 1
+ assertNull(watchdog.getPackages(observer1));
+ // 2
+ assertNull(watchdog.getPackages(observer2));
+ // 3
+ assertNull(watchdog.getPackages(observer3));
+ }
+
+ /**
+ * Test package observers are persisted and loaded on startup
+ */
+ @Test
+ public void testPersistence() throws Exception {
+ PackageWatchdog watchdog1 = createWatchdog();
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
+
+ watchdog1.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
+ watchdog1.startObservingHealth(observer2, Arrays.asList(APP_A, APP_B), SHORT_DURATION);
+
+ // Verify 2 observers are registered and saved internally
+ // 1
+ assertEquals(1, watchdog1.getPackages(observer1).size());
+ assertTrue(watchdog1.getPackages(observer1).contains(APP_A));
+ // 2
+ assertEquals(2, watchdog1.getPackages(observer2).size());
+ assertTrue(watchdog1.getPackages(observer2).contains(APP_A));
+ assertTrue(watchdog1.getPackages(observer2).contains(APP_B));
+
+
+ // Then advance time and run IO Handler so file is saved
+ mTestLooper.dispatchAll();
+
+ // Then start a new watchdog
+ PackageWatchdog watchdog2 = createWatchdog();
+
+ // Verify the new watchdog loads observers on startup but nothing registered
+ assertEquals(0, watchdog2.getPackages(observer1).size());
+ assertEquals(0, watchdog2.getPackages(observer2).size());
+ // Verify random observer not saved returns null
+ assertNull(watchdog2.getPackages(new TestObserver(OBSERVER_NAME_3)));
+
+ // Then regiser observer1
+ watchdog2.registerHealthObserver(observer1);
+ watchdog2.registerHealthObserver(observer2);
+
+ // Verify 2 observers are registered after reload
+ // 1
+ assertEquals(1, watchdog1.getPackages(observer1).size());
+ assertTrue(watchdog1.getPackages(observer1).contains(APP_A));
+ // 2
+ assertEquals(2, watchdog1.getPackages(observer2).size());
+ assertTrue(watchdog1.getPackages(observer2).contains(APP_A));
+ assertTrue(watchdog1.getPackages(observer2).contains(APP_B));
+ }
+
+ /**
+ * Test package failure under threshold does not notify observers
+ */
+ @Test
+ public void testNoPackageFailureBeforeThreshold() throws Exception {
+ PackageWatchdog watchdog = createWatchdog();
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
+
+ watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
+ watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
+
+ // Then fail APP_A below the threshold
+ for (int i = 0; i < TRIGGER_FAILURE_COUNT - 1; i++) {
+ watchdog.onPackageFailure(new String[]{APP_A});
+ }
+
+ // Verify that observers are not notified
+ assertEquals(0, observer1.mFailedPackages.size());
+ assertEquals(0, observer2.mFailedPackages.size());
+ }
+
+ /**
+ * Test package failure and notifies all observer since none handles the failure
+ */
+ @Test
+ public void testPackageFailureNotifyAll() throws Exception {
+ PackageWatchdog watchdog = createWatchdog();
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
+
+ // Start observing for observer1 and observer2 without handling failures
+ watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
+ watchdog.startObservingHealth(observer1, Arrays.asList(APP_A, APP_B), SHORT_DURATION);
+
+ // Then fail APP_A and APP_B above the threshold
+ for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
+ watchdog.onPackageFailure(new String[]{APP_A, APP_B});
+ }
+
+ // Verify all observers are notifed of all package failures
+ List<String> observer1Packages = observer1.mFailedPackages;
+ List<String> observer2Packages = observer2.mFailedPackages;
+ assertEquals(2, observer1Packages.size());
+ assertEquals(1, observer2Packages.size());
+ assertEquals(APP_A, observer1Packages.get(0));
+ assertEquals(APP_B, observer1Packages.get(1));
+ assertEquals(APP_A, observer2Packages.get(0));
+ }
+
+ /**
+ * Test package failure and notifies only one observer because it handles the failure
+ */
+ @Test
+ public void testPackageFailureNotifyOne() throws Exception {
+ PackageWatchdog watchdog = createWatchdog();
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1, true /* shouldHandle */);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2, true /* shouldHandle */);
+
+ // Start observing for observer1 and observer2 with failure handling
+ watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
+ watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
+
+ // Then fail APP_A above the threshold
+ for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
+ watchdog.onPackageFailure(new String[]{APP_A});
+ }
+
+ // Verify only one observer is notifed
+ assertEquals(1, observer1.mFailedPackages.size());
+ assertEquals(APP_A, observer1.mFailedPackages.get(0));
+ assertEquals(0, observer2.mFailedPackages.size());
+ }
+
+ private PackageWatchdog createWatchdog() {
+ return new PackageWatchdog(InstrumentationRegistry.getContext(),
+ mTestLooper.getLooper());
+ }
+
+ private static class TestObserver implements PackageHealthObserver {
+ private final String mName;
+ private boolean mShouldHandle;
+ final List<String> mFailedPackages = new ArrayList<>();
+
+ TestObserver(String name) {
+ mName = name;
+ }
+
+ TestObserver(String name, boolean shouldHandle) {
+ mName = name;
+ mShouldHandle = shouldHandle;
+ }
+
+ public boolean onHealthCheckFailed(String packageName) {
+ mFailedPackages.add(packageName);
+ return mShouldHandle;
+ }
+
+ public String getName() {
+ return mName;
+ }
+ }
+}
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsParticipantTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantTest.java
new file mode 100644
index 000000000000..c402dbffc84b
--- /dev/null
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 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.tests.ims;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Bundle;
+import android.support.test.runner.AndroidJUnit4;
+import android.telephony.ims.RcsParticipant;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RcsParticipantTest {
+ private static final int ID = 123;
+ private static final String ALIAS = "alias";
+ private static final String CANONICAL_ADDRESS = "+1234567890";
+
+ @Test
+ public void testCanUnparcel() {
+ RcsParticipant rcsParticipant = new RcsParticipant(ID, CANONICAL_ADDRESS);
+ rcsParticipant.setAlias(ALIAS);
+
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("Some key", rcsParticipant);
+ rcsParticipant = bundle.getParcelable("Some key");
+
+ assertThat(rcsParticipant.getId()).isEqualTo(ID);
+ assertThat(rcsParticipant.getAlias()).isEqualTo(ALIAS);
+ assertThat(rcsParticipant.getCanonicalAddress()).isEqualTo(CANONICAL_ADDRESS);
+ }
+}
diff --git a/tests/RollbackTest/TEST_MAPPING b/tests/RollbackTest/TEST_MAPPING
new file mode 100644
index 000000000000..c1d95ac85c23
--- /dev/null
+++ b/tests/RollbackTest/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "RollbackTest"
+ }
+ ]
+}
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index 0ccfb19d3f0b..c2e735e184b0 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -108,6 +108,10 @@ public class RollbackTest {
}
// The app should not be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is uninstalled and when the previously
+ // available rollback, if any, is removed.
+ Thread.sleep(1000);
assertNull(rm.getAvailableRollback(TEST_APP_A));
assertFalse(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
@@ -125,6 +129,10 @@ public class RollbackTest {
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
// The app should now be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
RollbackInfo rollback = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollback);
@@ -170,10 +178,10 @@ public class RollbackTest {
}
/**
- * Test that rollback data is properly persisted.
+ * Test that multiple available rollbacks are properly persisted.
*/
@Test
- public void testRollbackDataPersistence() throws Exception {
+ public void testAvailableRollbackPersistence() throws Exception {
try {
RollbackTestUtils.adoptShellPermissionIdentity(
Manifest.permission.INSTALL_PACKAGES,
@@ -182,30 +190,157 @@ public class RollbackTest {
RollbackManager rm = RollbackTestUtils.getRollbackManager();
- // Prep installation of TEST_APP_A
RollbackTestUtils.uninstall(TEST_APP_A);
RollbackTestUtils.install("RollbackTestAppAv1.apk", false);
RollbackTestUtils.install("RollbackTestAppAv2.apk", true);
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ RollbackTestUtils.uninstall(TEST_APP_B);
+ RollbackTestUtils.install("RollbackTestAppBv1.apk", false);
+ RollbackTestUtils.install("RollbackTestAppBv2.apk", true);
+ assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
+
+ // Both test apps should now be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
+
+ assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
+ RollbackInfo rollbackA = rm.getAvailableRollback(TEST_APP_A);
+ assertNotNull(rollbackA);
+ assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
+ assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
+
+ assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
+ RollbackInfo rollbackB = rm.getAvailableRollback(TEST_APP_B);
+ assertNotNull(rollbackB);
+ assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
+ assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
+
+ // Reload the persisted data.
+ rm.reloadPersistedData();
+
+ // The apps should still be available for rollback.
+ rollbackA = rm.getAvailableRollback(TEST_APP_A);
+ assertNotNull(rollbackA);
+ assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
+ assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
+
+ assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
+ rollbackB = rm.getAvailableRollback(TEST_APP_B);
+ assertNotNull(rollbackB);
+ assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
+ assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
+
+ // Rollback of B should not rollback A
+ RollbackTestUtils.rollback(rollbackB);
+ assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
+ } finally {
+ RollbackTestUtils.dropShellPermissionIdentity();
+ }
+ }
+
+ /**
+ * Test that available multi-package rollbacks are properly persisted.
+ */
+ @Test
+ public void testAvailableMultiPackageRollbackPersistence() throws Exception {
+ try {
+ RollbackTestUtils.adoptShellPermissionIdentity(
+ Manifest.permission.INSTALL_PACKAGES,
+ Manifest.permission.DELETE_PACKAGES,
+ Manifest.permission.MANAGE_ROLLBACKS);
+
+ RollbackManager rm = RollbackTestUtils.getRollbackManager();
+
+ RollbackTestUtils.uninstall(TEST_APP_A);
+ RollbackTestUtils.uninstall(TEST_APP_B);
+ RollbackTestUtils.installMultiPackage(false,
+ "RollbackTestAppAv1.apk",
+ "RollbackTestAppBv1.apk");
+ RollbackTestUtils.installMultiPackage(true,
+ "RollbackTestAppAv2.apk",
+ "RollbackTestAppBv2.apk");
+ assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
+
// The app should now be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
+
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
- RollbackInfo rollback = rm.getAvailableRollback(TEST_APP_A);
- assertNotNull(rollback);
- assertEquals(TEST_APP_A, rollback.targetPackage.packageName);
- assertEquals(2, rollback.targetPackage.higherVersion.versionCode);
- assertEquals(1, rollback.targetPackage.lowerVersion.versionCode);
+ RollbackInfo rollbackA = rm.getAvailableRollback(TEST_APP_A);
+ assertNotNull(rollbackA);
+ assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
+ assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
+
+ assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
+ RollbackInfo rollbackB = rm.getAvailableRollback(TEST_APP_B);
+ assertNotNull(rollbackB);
+ assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
+ assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
// Reload the persisted data.
rm.reloadPersistedData();
- // The app should still be available for rollback.
+ // The apps should still be available for rollback.
+ rollbackA = rm.getAvailableRollback(TEST_APP_A);
+ assertNotNull(rollbackA);
+ assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
+ assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
+
+ assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
+ rollbackB = rm.getAvailableRollback(TEST_APP_B);
+ assertNotNull(rollbackB);
+ assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
+ assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
+ assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
+
+ // Rollback of B should rollback A as well
+ RollbackTestUtils.rollback(rollbackB);
+ assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
+ } finally {
+ RollbackTestUtils.dropShellPermissionIdentity();
+ }
+ }
+
+ /**
+ * Test that recently executed rollback data is properly persisted.
+ */
+ @Test
+ public void testRecentlyExecutedRollbackPersistence() throws Exception {
+ try {
+ RollbackTestUtils.adoptShellPermissionIdentity(
+ Manifest.permission.INSTALL_PACKAGES,
+ Manifest.permission.DELETE_PACKAGES,
+ Manifest.permission.MANAGE_ROLLBACKS);
+
+ RollbackManager rm = RollbackTestUtils.getRollbackManager();
+
+ RollbackTestUtils.uninstall(TEST_APP_A);
+ RollbackTestUtils.install("RollbackTestAppAv1.apk", false);
+ RollbackTestUtils.install("RollbackTestAppAv2.apk", true);
+ assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+
+ // The app should now be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
- rollback = rm.getAvailableRollback(TEST_APP_A);
- assertNotNull(rollback);
- assertEquals(TEST_APP_A, rollback.targetPackage.packageName);
- assertEquals(2, rollback.targetPackage.higherVersion.versionCode);
- assertEquals(1, rollback.targetPackage.lowerVersion.versionCode);
+ RollbackInfo rollback = rm.getAvailableRollback(TEST_APP_A);
// Roll back the app.
RollbackTestUtils.rollback(rollback);
@@ -263,6 +398,10 @@ public class RollbackTest {
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
// The app should now be available for rollback.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
RollbackInfo rollback = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollback);
@@ -405,6 +544,10 @@ public class RollbackTest {
// Both test apps should now be available for rollback, and the
// targetPackage returned for rollback should be correct.
+ // TODO: See if there is a way to remove this race condition
+ // between when the app is installed and when the rollback
+ // is made available.
+ Thread.sleep(1000);
RollbackInfo rollbackA = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollbackA);
assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
@@ -491,7 +634,7 @@ public class RollbackTest {
* TODO: Stop ignoring this test once support for multi-package rollback
* is implemented.
*/
- @Ignore @Test
+ @Test
public void testMultiPackage() throws Exception {
try {
RollbackTestUtils.adoptShellPermissionIdentity(
diff --git a/tests/UsageReportingTest/Android.mk b/tests/UsageReportingTest/Android.mk
new file mode 100644
index 000000000000..afb6e16b1fdf
--- /dev/null
+++ b/tests/UsageReportingTest/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_USE_AAPT2 := true
+LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
+
+LOCAL_CERTIFICATE := platform
+
+LOCAL_PACKAGE_NAME := UsageReportingTest
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
+include $(BUILD_PACKAGE)
diff --git a/tests/UsageReportingTest/AndroidManifest.xml b/tests/UsageReportingTest/AndroidManifest.xml
new file mode 100644
index 000000000000..be0b09e972a5
--- /dev/null
+++ b/tests/UsageReportingTest/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Note: Add android:sharedUserId="android.uid.system" to the root element to simulate the system UID
+ caller case.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.tests.usagereporter"
+ >
+
+ <application android:label="@string/reporter_app">
+ <activity android:name="UsageReporterActivity"
+ android:label="UsageReporter">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ </application>
+</manifest>
diff --git a/tests/UsageReportingTest/res/layout/row_item.xml b/tests/UsageReportingTest/res/layout/row_item.xml
new file mode 100644
index 000000000000..1eb2dab29124
--- /dev/null
+++ b/tests/UsageReportingTest/res/layout/row_item.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:background="@color/inactive_color">
+
+ <TextView android:id="@+id/token"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textStyle="bold"/>
+
+ <Button android:id="@+id/start" style="@style/ActionButton"
+ android:text="@string/start" />
+
+ <Button android:id="@+id/stop" style="@style/ActionButton"
+ android:text="@string/stop" />
+</LinearLayout>
diff --git a/tests/UsageReportingTest/res/menu/main.xml b/tests/UsageReportingTest/res/menu/main.xml
new file mode 100644
index 000000000000..9847c2dce8f2
--- /dev/null
+++ b/tests/UsageReportingTest/res/menu/main.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/add_token"
+ android:title="@string/add_token"/>
+ <item android:id="@+id/add_many_tokens"
+ android:title="@string/add_many_tokens"/>
+ <item android:id="@+id/stop_all"
+ android:title="@string/stop_all_tokens"/>
+ <group android:checkableBehavior="all">
+ <item android:id="@+id/restore_on_start"
+ android:title="@string/restore_tokens_on_start"/>
+ </group>
+</menu> \ No newline at end of file
diff --git a/tests/UsageReportingTest/res/values/colors.xml b/tests/UsageReportingTest/res/values/colors.xml
new file mode 100644
index 000000000000..03bcf8a60182
--- /dev/null
+++ b/tests/UsageReportingTest/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<resources>
+ <color name="active_color">#FFF</color>
+ <color name="inactive_color">#AAA</color>
+</resources> \ No newline at end of file
diff --git a/tests/UsageReportingTest/res/values/strings.xml b/tests/UsageReportingTest/res/values/strings.xml
new file mode 100644
index 000000000000..015290e732a0
--- /dev/null
+++ b/tests/UsageReportingTest/res/values/strings.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<resources>
+ <!-- Do not translate -->
+ <string name="reporter_app">Usage Reporter App</string>
+ <!-- Do not translate -->
+ <string name="start">Start</string>
+ <!-- Do not translate -->
+ <string name="stop">Stop</string>
+ <!-- Do not translate -->
+ <string name="default_token">SuperSecretToken</string>
+
+ <!-- Do not translate -->
+ <string name="add_token">Add Token</string>
+ <!-- Do not translate -->
+ <string name="add_many_tokens">Add Many Tokens</string>
+ <!-- Do not translate -->
+ <string name="stop_all_tokens">Stop All</string>
+ <!-- Do not translate -->
+ <string name="restore_tokens_on_start">Readd Tokens on Start</string>
+
+
+ <!-- Do not translate -->
+ <string name="token_query">Enter token(s) (delimit tokens with commas)</string>
+ <!-- Do not translate -->
+ <string name="many_tokens_query">Generate how many tokens?</string>
+ <!-- Do not translate -->
+ <string name="stop_all_tokens_query">Stop all tokens?</string>
+ <!-- Do not translate -->
+ <string name="ok">OK</string>
+ <!-- Do not translate -->
+ <string name="cancel">Cancel</string>
+</resources> \ No newline at end of file
diff --git a/tests/UsageReportingTest/res/values/styles.xml b/tests/UsageReportingTest/res/values/styles.xml
new file mode 100644
index 000000000000..e5b86c5e836b
--- /dev/null
+++ b/tests/UsageReportingTest/res/values/styles.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<resources>
+ <style name="ActionButton">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.ActionButton</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.ActionButton">
+ <item name="android:textStyle">italic</item>
+ </style>
+
+</resources>
diff --git a/tests/UsageReportingTest/src/com/android/tests/usagereporter/UsageReporterActivity.java b/tests/UsageReportingTest/src/com/android/tests/usagereporter/UsageReporterActivity.java
new file mode 100644
index 000000000000..946be8fe93d3
--- /dev/null
+++ b/tests/UsageReportingTest/src/com/android/tests/usagereporter/UsageReporterActivity.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2018 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.tests.usagereporter;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.app.usage.UsageStatsManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+
+public class UsageReporterActivity extends ListActivity {
+
+ private Activity mActivity;
+ private final ArrayList<String> mTokens = new ArrayList();
+ private final ArraySet<String> mActives = new ArraySet();
+ private UsageStatsManager mUsageStatsManager;
+ private Adapter mAdapter;
+ private boolean mRestoreOnStart = false;
+ private static Context sContext;
+
+ /** Called with the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ sContext = getApplicationContext();
+
+ mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
+
+ mAdapter = new Adapter();
+ setListAdapter(mAdapter);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mActivity = this;
+
+
+ if (mRestoreOnStart) {
+ ArrayList<String> removed = null;
+ for (String token : mActives) {
+ try {
+ mUsageStatsManager.reportUsageStart(mActivity, token);
+ } catch (Exception e) {
+ // Somthing went wrong, recover and move on
+ if (removed == null) {
+ removed = new ArrayList();
+ }
+ removed.add(token);
+ }
+ }
+ if (removed != null) {
+ for (String token : removed) {
+ mActives.remove(token);
+ }
+ }
+ } else {
+ mActives.clear();
+ }
+ }
+
+ /**
+ * Called when the activity is about to start interacting with the user.
+ */
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mAdapter.notifyDataSetChanged();
+ }
+
+
+ /**
+ * Called when your activity's options menu needs to be created.
+ */
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.main, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+
+ /**
+ * Called when a menu item is selected.
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.add_token:
+ callAddToken();
+ return true;
+ case R.id.add_many_tokens:
+ callAddManyTokens();
+ return true;
+ case R.id.stop_all:
+ callStopAll();
+ return true;
+ case R.id.restore_on_start:
+ mRestoreOnStart = !mRestoreOnStart;
+ item.setChecked(mRestoreOnStart);
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void callAddToken() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.token_query));
+ final EditText input = new EditText(this);
+ input.setInputType(InputType.TYPE_CLASS_TEXT);
+ input.setHint(getString(R.string.default_token));
+ builder.setView(input);
+
+ builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String tokenNames = input.getText().toString().trim();
+ if (TextUtils.isEmpty(tokenNames)) {
+ tokenNames = getString(R.string.default_token);
+ }
+ String[] tokens = tokenNames.split(",");
+ for (String token : tokens) {
+ if (mTokens.contains(token)) continue;
+ mTokens.add(token);
+ }
+ mAdapter.notifyDataSetChanged();
+
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+ }
+ });
+
+ builder.show();
+ }
+
+ private void callAddManyTokens() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.many_tokens_query));
+ final EditText input = new EditText(this);
+ input.setInputType(InputType.TYPE_CLASS_NUMBER);
+ builder.setView(input);
+
+ builder.setPositiveButton(getString(R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String val = input.getText().toString().trim();
+ if (TextUtils.isEmpty(val)) return;
+ int n = Integer.parseInt(val);
+ for (int i = 0; i < n; i++) {
+ final String token = getString(R.string.default_token) + i;
+ if (mTokens.contains(token)) continue;
+ mTokens.add(token);
+ }
+ mAdapter.notifyDataSetChanged();
+
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+ }
+ });
+
+ builder.show();
+ }
+
+ private void callStopAll() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.stop_all_tokens_query));
+
+ builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ for (String token : mActives) {
+ mUsageStatsManager.reportUsageStop(mActivity, token);
+ }
+ mActives.clear();
+ mAdapter.notifyDataSetChanged();
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+ }
+ });
+ builder.show();
+ }
+
+ /**
+ * A call-back for when the user presses the back button.
+ */
+ OnClickListener mStartListener = new OnClickListener() {
+ public void onClick(View v) {
+ final View parent = (View) v.getParent();
+ final String token = ((TextView) parent.findViewById(R.id.token)).getText().toString();
+ try {
+ mUsageStatsManager.reportUsageStart(mActivity, token);
+ } catch (Exception e) {
+ Toast.makeText(sContext, e.toString(), Toast.LENGTH_LONG).show();
+ }
+ parent.setBackgroundColor(getColor(R.color.active_color));
+ mActives.add(token);
+ }
+ };
+
+ /**
+ * A call-back for when the user presses the clear button.
+ */
+ OnClickListener mStopListener = new OnClickListener() {
+ public void onClick(View v) {
+ final View parent = (View) v.getParent();
+
+ final String token = ((TextView) parent.findViewById(R.id.token)).getText().toString();
+ try {
+ mUsageStatsManager.reportUsageStop(mActivity, token);
+ } catch (Exception e) {
+ Toast.makeText(sContext, e.toString(), Toast.LENGTH_LONG).show();
+ }
+ parent.setBackgroundColor(getColor(R.color.inactive_color));
+ mActives.remove(token);
+ }
+ };
+
+
+ private class Adapter extends BaseAdapter {
+ @Override
+ public int getCount() {
+ return mTokens.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mTokens.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final ViewHolder holder;
+ if (convertView == null) {
+ convertView = LayoutInflater.from(UsageReporterActivity.this)
+ .inflate(R.layout.row_item, parent, false);
+ holder = new ViewHolder();
+ holder.tokenName = (TextView) convertView.findViewById(R.id.token);
+
+ holder.startButton = ((Button) convertView.findViewById(R.id.start));
+ holder.startButton.setOnClickListener(mStartListener);
+ holder.stopButton = ((Button) convertView.findViewById(R.id.stop));
+ holder.stopButton.setOnClickListener(mStopListener);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ final String token = mTokens.get(position);
+ holder.tokenName.setText(mTokens.get(position));
+ if (mActives.contains(token)) {
+ convertView.setBackgroundColor(getColor(R.color.active_color));
+ } else {
+ convertView.setBackgroundColor(getColor(R.color.inactive_color));
+ }
+ return convertView;
+ }
+ }
+
+ private static class ViewHolder {
+ public TextView tokenName;
+ public Button startButton;
+ public Button stopButton;
+ }
+}
diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
index 3d8ce21a2c00..3c628f6e0013 100644
--- a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
+++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
@@ -155,7 +155,7 @@ public class UsageStatsActivity extends ListActivity {
intent.setPackage(getPackageName());
intent.putExtra(EXTRA_KEY_TIMEOUT, true);
mUsageStatsManager.registerAppUsageObserver(1, packages,
- 30, TimeUnit.SECONDS, PendingIntent.getActivity(UsageStatsActivity.this,
+ 60, TimeUnit.SECONDS, PendingIntent.getActivity(UsageStatsActivity.this,
1, intent, 0));
}
}
diff --git a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
index d5987a5373b4..85646987940f 100644
--- a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
+++ b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
@@ -28,6 +28,7 @@ import android.view.DisplayCutout;
import android.view.IWindowSession;
import android.view.InsetsState;
import android.view.Surface;
+import android.view.SurfaceControl;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
@@ -106,7 +107,7 @@ public class MainActivity extends Activity {
window.mSeq, mLayoutParams, -1, -1, View.VISIBLE, 0, -1, mTmpRect,
mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect,
new DisplayCutout.ParcelableWrapper(), new MergedConfiguration(),
- new Surface(), new InsetsState());
+ new SurfaceControl(), new InsetsState());
} catch (RemoteException e) {
e.printStackTrace();
}
diff --git a/tests/net/Android.mk b/tests/net/Android.mk
index 9d1edbf1eaf0..685067377166 100644
--- a/tests/net/Android.mk
+++ b/tests/net/Android.mk
@@ -18,6 +18,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
mockito-target-minus-junit4 \
platform-test-annotations \
services.core \
+ services.ipmemorystore \
services.net
LOCAL_JAVA_LIBRARIES := \
@@ -53,6 +54,7 @@ LOCAL_JNI_SHARED_LIBRARIES := \
libnativehelper \
libpackagelistparser \
libpcre2 \
+ libprocessgroup \
libselinux \
libui \
libutils \
diff --git a/tests/net/java/android/net/IpMemoryStoreTest.java b/tests/net/java/android/net/IpMemoryStoreTest.java
new file mode 100644
index 000000000000..eae9710215ca
--- /dev/null
+++ b/tests/net/java/android/net/IpMemoryStoreTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.content.Context;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IpMemoryStoreTest {
+ @Mock
+ Context mMockContext;
+ @Mock
+ IIpMemoryStore mMockService;
+ IpMemoryStore mStore;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mStore = new IpMemoryStore(mMockContext, mMockService);
+ }
+
+ @Test
+ public void testNetworkAttributes() {
+ // TODO : implement this
+ }
+
+ @Test
+ public void testPrivateData() {
+ // TODO : implement this
+ }
+
+ @Test
+ public void testFindL2Key() {
+ // TODO : implement this
+ }
+
+ @Test
+ public void testIsSameNetwork() {
+ // TODO : implement this
+ }
+
+}
diff --git a/tests/net/java/android/net/LinkPropertiesTest.java b/tests/net/java/android/net/LinkPropertiesTest.java
index 9695e9a033b8..299fbefc78e4 100644
--- a/tests/net/java/android/net/LinkPropertiesTest.java
+++ b/tests/net/java/android/net/LinkPropertiesTest.java
@@ -18,6 +18,7 @@ package android.net;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -33,6 +34,9 @@ import android.support.test.runner.AndroidJUnit4;
import android.system.OsConstants;
import android.util.ArraySet;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
@@ -41,9 +45,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class LinkPropertiesTest {
@@ -53,6 +54,8 @@ public class LinkPropertiesTest {
private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
private static InetAddress DNS6 = NetworkUtils.numericToInetAddress("2001:4860:4860::8888");
+ private static InetAddress PCSCFV6 = NetworkUtils.numericToInetAddress(
+ "2001:0db8:85a3:0000:0000:8a2e:0370:1");
private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
private static InetAddress GATEWAY61 = NetworkUtils.numericToInetAddress("fe80::6:0000:613");
@@ -86,6 +89,9 @@ public class LinkPropertiesTest {
assertTrue(source.isIdenticalValidatedPrivateDnses(target));
assertTrue(target.isIdenticalValidatedPrivateDnses(source));
+ assertTrue(source.isIdenticalPcscfs(target));
+ assertTrue(target.isIdenticalPcscfs(source));
+
assertTrue(source.isIdenticalRoutes(target));
assertTrue(target.isIdenticalRoutes(source));
@@ -128,6 +134,8 @@ public class LinkPropertiesTest {
// set 2 dnses
source.addDnsServer(DNS1);
source.addDnsServer(DNS2);
+ // set 1 pcscf
+ source.addPcscfServer(PCSCFV6);
// set 2 gateways
source.addRoute(new RouteInfo(GATEWAY1));
source.addRoute(new RouteInfo(GATEWAY2));
@@ -141,6 +149,7 @@ public class LinkPropertiesTest {
target.addLinkAddress(LINKADDRV6);
target.addDnsServer(DNS1);
target.addDnsServer(DNS2);
+ target.addPcscfServer(PCSCFV6);
target.addRoute(new RouteInfo(GATEWAY1));
target.addRoute(new RouteInfo(GATEWAY2));
target.setMtu(MTU);
@@ -154,6 +163,7 @@ public class LinkPropertiesTest {
target.addLinkAddress(LINKADDRV6);
target.addDnsServer(DNS1);
target.addDnsServer(DNS2);
+ target.addPcscfServer(PCSCFV6);
target.addRoute(new RouteInfo(GATEWAY1));
target.addRoute(new RouteInfo(GATEWAY2));
target.setMtu(MTU);
@@ -167,6 +177,7 @@ public class LinkPropertiesTest {
target.addLinkAddress(LINKADDRV6);
target.addDnsServer(DNS1);
target.addDnsServer(DNS2);
+ target.addPcscfServer(PCSCFV6);
target.addRoute(new RouteInfo(GATEWAY1));
target.addRoute(new RouteInfo(GATEWAY2));
target.setMtu(MTU);
@@ -179,6 +190,21 @@ public class LinkPropertiesTest {
// change dnses
target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
target.addDnsServer(DNS2);
+ target.addPcscfServer(PCSCFV6);
+ target.addRoute(new RouteInfo(GATEWAY1));
+ target.addRoute(new RouteInfo(GATEWAY2));
+ target.setMtu(MTU);
+ assertFalse(source.equals(target));
+
+ target.clear();
+ target.setInterfaceName(NAME);
+ target.addLinkAddress(LINKADDRV4);
+ target.addLinkAddress(LINKADDRV6);
+ target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
+ target.addDnsServer(DNS2);
+ // change pcscf
+ target.addPcscfServer(NetworkUtils.numericToInetAddress(
+ "2001::1"));
target.addRoute(new RouteInfo(GATEWAY1));
target.addRoute(new RouteInfo(GATEWAY2));
target.setMtu(MTU);
@@ -479,6 +505,40 @@ public class LinkPropertiesTest {
}
@Test
+ public void testNat64Prefix() throws Exception {
+ LinkProperties lp = new LinkProperties();
+ lp.addLinkAddress(LINKADDRV4);
+ lp.addLinkAddress(LINKADDRV6);
+
+ assertNull(lp.getNat64Prefix());
+
+ IpPrefix p = new IpPrefix("64:ff9b::/96");
+ lp.setNat64Prefix(p);
+ assertEquals(p, lp.getNat64Prefix());
+
+ p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
+ lp.setNat64Prefix(p);
+ assertEquals(p, lp.getNat64Prefix());
+
+ p = new IpPrefix("2001:db8:a:b:1:2::/80");
+ try {
+ lp.setNat64Prefix(p);
+ } catch (IllegalArgumentException expected) {
+ }
+
+ p = new IpPrefix("64:ff9b::/64");
+ try {
+ lp.setNat64Prefix(p);
+ } catch (IllegalArgumentException expected) {
+ }
+
+ assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
+
+ lp.setNat64Prefix(null);
+ assertNull(lp.getNat64Prefix());
+ }
+
+ @Test
public void testIsProvisioned() {
LinkProperties lp4 = new LinkProperties();
assertFalse("v4only:empty", lp4.isProvisioned());
@@ -789,8 +849,20 @@ public class LinkPropertiesTest {
assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed)));
}
+ private void assertParcelingIsLossless(LinkProperties source) {
+ Parcel p = Parcel.obtain();
+ source.writeToParcel(p, /* flags */ 0);
+ p.setDataPosition(0);
+ final byte[] marshalled = p.marshall();
+ p = Parcel.obtain();
+ p.unmarshall(marshalled, 0, marshalled.length);
+ p.setDataPosition(0);
+ LinkProperties dest = LinkProperties.CREATOR.createFromParcel(p);
+ assertEquals(source, dest);
+ }
+
@Test
- public void testLinkPropertiesParcelable() {
+ public void testLinkPropertiesParcelable() throws Exception {
LinkProperties source = new LinkProperties();
source.setInterfaceName(NAME);
// set 2 link addresses
@@ -808,15 +880,14 @@ public class LinkPropertiesTest {
source.setMtu(MTU);
- Parcel p = Parcel.obtain();
- source.writeToParcel(p, /* flags */ 0);
- p.setDataPosition(0);
- final byte[] marshalled = p.marshall();
- p = Parcel.obtain();
- p.unmarshall(marshalled, 0, marshalled.length);
- p.setDataPosition(0);
- LinkProperties dest = LinkProperties.CREATOR.createFromParcel(p);
+ source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
- assertEquals(source, dest);
+ assertParcelingIsLossless(source);
+ }
+
+ @Test
+ public void testParcelUninitialized() throws Exception {
+ LinkProperties empty = new LinkProperties();
+ assertParcelingIsLossless(empty);
}
}
diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java
index 151b5594216a..aaed659f88a0 100644
--- a/tests/net/java/android/net/apf/ApfTest.java
+++ b/tests/net/java/android/net/apf/ApfTest.java
@@ -16,10 +16,19 @@
package android.net.apf;
-import static android.net.util.NetworkConstants.*;
-import static android.system.OsConstants.*;
+import static android.net.util.NetworkConstants.ICMPV6_ECHO_REQUEST_TYPE;
+import static android.net.util.NetworkConstants.ICMPV6_ROUTER_ADVERTISEMENT;
+import static android.system.OsConstants.AF_UNIX;
+import static android.system.OsConstants.ARPHRD_ETHER;
+import static android.system.OsConstants.ETH_P_ARP;
+import static android.system.OsConstants.ETH_P_IP;
+import static android.system.OsConstants.ETH_P_IPV6;
+import static android.system.OsConstants.IPPROTO_ICMPV6;
+import static android.system.OsConstants.IPPROTO_UDP;
+import static android.system.OsConstants.SOCK_STREAM;
+
import static com.android.internal.util.BitUtils.bytesToBEInt;
-import static com.android.internal.util.BitUtils.put;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -33,7 +42,7 @@ import android.net.LinkProperties;
import android.net.apf.ApfFilter.ApfConfiguration;
import android.net.apf.ApfGenerator.IllegalInstructionException;
import android.net.apf.ApfGenerator.Register;
-import android.net.ip.IpClient;
+import android.net.ip.IpClientCallbacks;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.RaEvent;
import android.net.util.InterfaceParams;
@@ -47,8 +56,20 @@ import android.system.ErrnoException;
import android.system.Os;
import android.text.format.DateUtils;
import android.util.Log;
+
import com.android.frameworks.tests.net.R;
import com.android.internal.util.HexDump;
+
+import libcore.io.IoUtils;
+import libcore.io.Streams;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
@@ -59,14 +80,6 @@ import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Random;
-import libcore.io.IoUtils;
-import libcore.io.Streams;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
/**
* Tests for APF program generator and interpreter.
@@ -902,7 +915,7 @@ public class ApfTest {
HexDump.toHexString(data, false), result);
}
- private class MockIpClientCallback extends IpClient.Callback {
+ private class MockIpClientCallback extends IpClientCallbacks {
private final ConditionVariable mGotApfProgram = new ConditionVariable();
private byte[] mLastApfProgram;
@@ -933,7 +946,7 @@ public class ApfTest {
private final long mFixedTimeMs = SystemClock.elapsedRealtime();
public TestApfFilter(Context context, ApfConfiguration config,
- IpClient.Callback ipClientCallback, IpConnectivityLog log) throws Exception {
+ IpClientCallbacks ipClientCallback, IpConnectivityLog log) throws Exception {
super(context, config, InterfaceParams.getByName("lo"), ipClientCallback, log);
}
@@ -1062,7 +1075,7 @@ public class ApfTest {
private static final byte[] IPV4_ANY_HOST_ADDR = {0, 0, 0, 0};
// Helper to initialize a default apfFilter.
- private ApfFilter setupApfFilter(IpClient.Callback ipClientCallback, ApfConfiguration config)
+ private ApfFilter setupApfFilter(IpClientCallbacks ipClientCallback, ApfConfiguration config)
throws Exception {
LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
LinkProperties lp = new LinkProperties();
diff --git a/tests/net/java/android/net/dhcp/DhcpServingParamsParcelExtTest.java b/tests/net/java/android/net/dhcp/DhcpServingParamsParcelExtTest.java
new file mode 100644
index 000000000000..4a6f20a043bb
--- /dev/null
+++ b/tests/net/java/android/net/dhcp/DhcpServingParamsParcelExtTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.dhcp;
+
+import static android.net.InetAddresses.parseNumericAddress;
+
+import static com.google.android.collect.Sets.newHashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.net.LinkAddress;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.net.Inet4Address;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DhcpServingParamsParcelExtTest {
+ private static final Inet4Address TEST_ADDRESS = inet4Addr("192.168.0.123");
+ private static final int TEST_ADDRESS_PARCELED = 0xc0a8007b;
+ private static final int TEST_PREFIX_LENGTH = 17;
+ private static final int TEST_LEASE_TIME_SECS = 120;
+ private static final int TEST_MTU = 1000;
+ private static final Set<Inet4Address> TEST_ADDRESS_SET =
+ newHashSet(inet4Addr("192.168.1.123"), inet4Addr("192.168.1.124"));
+ private static final Set<Integer> TEST_ADDRESS_SET_PARCELED =
+ newHashSet(0xc0a8017b, 0xc0a8017c);
+
+ private DhcpServingParamsParcelExt mParcel;
+
+ @Before
+ public void setUp() {
+ mParcel = new DhcpServingParamsParcelExt();
+ }
+
+ @Test
+ public void testSetServerAddr() {
+ mParcel.setServerAddr(new LinkAddress(TEST_ADDRESS, TEST_PREFIX_LENGTH));
+
+ assertEquals(TEST_ADDRESS_PARCELED, mParcel.serverAddr);
+ assertEquals(TEST_PREFIX_LENGTH, mParcel.serverAddrPrefixLength);
+ }
+
+ @Test
+ public void testSetDefaultRouters() {
+ mParcel.setDefaultRouters(TEST_ADDRESS_SET);
+ assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.defaultRouters));
+ }
+
+ @Test
+ public void testSetDnsServers() {
+ mParcel.setDnsServers(TEST_ADDRESS_SET);
+ assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.dnsServers));
+ }
+
+ @Test
+ public void testSetExcludedAddrs() {
+ mParcel.setExcludedAddrs(TEST_ADDRESS_SET);
+ assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.excludedAddrs));
+ }
+
+ @Test
+ public void testSetDhcpLeaseTimeSecs() {
+ mParcel.setDhcpLeaseTimeSecs(TEST_LEASE_TIME_SECS);
+ assertEquals(TEST_LEASE_TIME_SECS, mParcel.dhcpLeaseTimeSecs);
+ }
+
+ @Test
+ public void testSetLinkMtu() {
+ mParcel.setLinkMtu(TEST_MTU);
+ assertEquals(TEST_MTU, mParcel.linkMtu);
+ }
+
+ @Test
+ public void testSetMetered() {
+ mParcel.setMetered(true);
+ assertTrue(mParcel.metered);
+ mParcel.setMetered(false);
+ assertFalse(mParcel.metered);
+ }
+
+ private static Inet4Address inet4Addr(String addr) {
+ return (Inet4Address) parseNumericAddress(addr);
+ }
+
+ private static Set<Integer> asSet(int[] ints) {
+ return IntStream.of(ints).boxed().collect(Collectors.toSet());
+ }
+}
diff --git a/tests/net/java/android/net/ip/IpClientTest.java b/tests/net/java/android/net/ip/IpClientTest.java
index cba3c6572c46..a2dcfef50a49 100644
--- a/tests/net/java/android/net/ip/IpClientTest.java
+++ b/tests/net/java/android/net/ip/IpClientTest.java
@@ -23,7 +23,6 @@ import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.timeout;
@@ -40,9 +39,8 @@ import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.MacAddress;
import android.net.RouteInfo;
-import android.net.ip.IpClient.Callback;
-import android.net.ip.IpClient.InitialConfiguration;
-import android.net.ip.IpClient.ProvisioningConfiguration;
+import android.net.shared.InitialConfiguration;
+import android.net.shared.ProvisioningConfiguration;
import android.net.util.InterfaceParams;
import android.os.INetworkManagementService;
import android.provider.Settings;
@@ -50,8 +48,8 @@ import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
-import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.R;
+import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.net.BaseNetworkObserver;
import org.junit.Before;
@@ -63,8 +61,8 @@ import org.mockito.MockitoAnnotations;
import java.net.InetAddress;
import java.util.Arrays;
-import java.util.List;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
/**
@@ -87,7 +85,7 @@ public class IpClientTest {
@Mock private INetworkManagementService mNMService;
@Mock private INetd mNetd;
@Mock private Resources mResources;
- @Mock private Callback mCb;
+ @Mock private IpClientCallbacks mCb;
@Mock private AlarmManager mAlarm;
@Mock private IpClient.Dependencies mDependecies;
private MockContentResolver mContentResolver;
@@ -179,7 +177,7 @@ public class IpClientTest {
public void testInterfaceNotFoundFailsImmediately() throws Exception {
setTestInterfaceParams(null);
final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mDependecies);
- ipc.startProvisioning(new IpClient.ProvisioningConfiguration());
+ ipc.startProvisioning(new ProvisioningConfiguration());
verify(mCb, times(1)).onProvisioningFailure(any());
ipc.shutdown();
}
diff --git a/tests/net/java/android/net/ip/IpServerTest.java b/tests/net/java/android/net/ip/IpServerTest.java
index 2c675c68a076..c3162af1868d 100644
--- a/tests/net/java/android/net/ip/IpServerTest.java
+++ b/tests/net/java/android/net/ip/IpServerTest.java
@@ -16,31 +16,37 @@
package android.net.ip;
+import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
+import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TETHERING_WIFI;
+import static android.net.ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
+import static android.net.NetworkUtils.intToInet4AddressHTH;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
+import static android.net.ip.IpServer.STATE_AVAILABLE;
+import static android.net.ip.IpServer.STATE_TETHERED;
+import static android.net.ip.IpServer.STATE_UNAVAILABLE;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import static android.net.ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
-import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
-import static android.net.ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
-import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
-import static android.net.ConnectivityManager.TETHERING_USB;
-import static android.net.ConnectivityManager.TETHERING_WIFI;
-import static android.net.ip.IpServer.STATE_AVAILABLE;
-import static android.net.ip.IpServer.STATE_TETHERED;
-import static android.net.ip.IpServer.STATE_UNAVAILABLE;
-
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.IpPrefix;
@@ -48,8 +54,9 @@ import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.MacAddress;
import android.net.RouteInfo;
-import android.net.dhcp.DhcpServer;
-import android.net.dhcp.DhcpServingParams;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServer;
+import android.net.dhcp.IDhcpServerCallbacks;
import android.net.util.InterfaceParams;
import android.net.util.InterfaceSet;
import android.net.util.SharedLog;
@@ -60,8 +67,6 @@ import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.TextUtils;
-import java.net.Inet4Address;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,6 +76,8 @@ import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.Inet4Address;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
public class IpServerTest {
@@ -82,16 +89,18 @@ public class IpServerTest {
private static final InterfaceParams TEST_IFACE_PARAMS = new InterfaceParams(
IFACE_NAME, 42 /* index */, MacAddress.ALL_ZEROS_ADDRESS, 1500 /* defaultMtu */);
+ private static final int MAKE_DHCPSERVER_TIMEOUT_MS = 1000;
+
@Mock private INetworkManagementService mNMService;
@Mock private INetworkStatsService mStatsService;
@Mock private IpServer.Callback mCallback;
@Mock private InterfaceConfiguration mInterfaceConfiguration;
@Mock private SharedLog mSharedLog;
- @Mock private DhcpServer mDhcpServer;
+ @Mock private IDhcpServer mDhcpServer;
@Mock private RouterAdvertisementDaemon mRaDaemon;
@Mock private IpServer.Dependencies mDependencies;
- @Captor private ArgumentCaptor<DhcpServingParams> mDhcpParamsCaptor;
+ @Captor private ArgumentCaptor<DhcpServingParamsParcel> mDhcpParamsCaptor;
private final TestLooper mLooper = new TestLooper();
private final ArgumentCaptor<LinkProperties> mLinkPropertiesCaptor =
@@ -112,8 +121,18 @@ public class IpServerTest {
mLooper.dispatchAll();
reset(mNMService, mStatsService, mCallback);
when(mNMService.getInterfaceConfig(IFACE_NAME)).thenReturn(mInterfaceConfiguration);
- when(mDependencies.makeDhcpServer(
- any(), any(), mDhcpParamsCaptor.capture(), any())).thenReturn(mDhcpServer);
+
+ doAnswer(inv -> {
+ final IDhcpServerCallbacks cb = inv.getArgument(2);
+ new Thread(() -> {
+ try {
+ cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer);
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
+ }).run();
+ return null;
+ }).when(mDependencies).makeDhcpServer(any(), mDhcpParamsCaptor.capture(), any());
when(mDependencies.getRouterAdvertisementDaemon(any())).thenReturn(mRaDaemon);
when(mDependencies.getInterfaceParams(IFACE_NAME)).thenReturn(TEST_IFACE_PARAMS);
@@ -399,21 +418,20 @@ public class IpServerTest {
initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, true /* usingLegacyDhcp */);
dispatchTetherConnectionChanged(UPSTREAM_IFACE);
- verify(mDependencies, never()).makeDhcpServer(any(), any(), any(), any());
+ verify(mDependencies, never()).makeDhcpServer(any(), any(), any());
}
- private void assertDhcpStarted(IpPrefix expectedPrefix) {
- verify(mDependencies, times(1)).makeDhcpServer(
- eq(mLooper.getLooper()), eq(IFACE_NAME), any(), eq(mSharedLog));
- verify(mDhcpServer, times(1)).start();
- final DhcpServingParams params = mDhcpParamsCaptor.getValue();
+ private void assertDhcpStarted(IpPrefix expectedPrefix) throws Exception {
+ verify(mDependencies, times(1)).makeDhcpServer(eq(IFACE_NAME), any(), any());
+ verify(mDhcpServer, timeout(MAKE_DHCPSERVER_TIMEOUT_MS).times(1)).start(any());
+ final DhcpServingParamsParcel params = mDhcpParamsCaptor.getValue();
// Last address byte is random
- assertTrue(expectedPrefix.contains(params.serverAddr.getAddress()));
- assertEquals(expectedPrefix.getPrefixLength(), params.serverAddr.getPrefixLength());
- assertEquals(1, params.defaultRouters.size());
- assertEquals(params.serverAddr.getAddress(), params.defaultRouters.iterator().next());
- assertEquals(1, params.dnsServers.size());
- assertEquals(params.serverAddr.getAddress(), params.dnsServers.iterator().next());
+ assertTrue(expectedPrefix.contains(intToInet4AddressHTH(params.serverAddr)));
+ assertEquals(expectedPrefix.getPrefixLength(), params.serverAddrPrefixLength);
+ assertEquals(1, params.defaultRouters.length);
+ assertEquals(params.serverAddr, params.defaultRouters[0]);
+ assertEquals(1, params.dnsServers.length);
+ assertEquals(params.serverAddr, params.dnsServers[0]);
assertEquals(DHCP_LEASE_TIME_SECS, params.dhcpLeaseTimeSecs);
}
@@ -458,7 +476,7 @@ public class IpServerTest {
addr4 = addr;
break;
}
- assertTrue("missing IPv4 address", addr4 != null);
+ assertNotNull("missing IPv4 address", addr4);
// Assert the presence of the associated directly connected route.
final RouteInfo directlyConnected = new RouteInfo(addr4, null, lp.getInterfaceName());
diff --git a/tests/net/java/android/net/ipmemorystore/ParcelableTests.java b/tests/net/java/android/net/ipmemorystore/ParcelableTests.java
new file mode 100644
index 000000000000..1fc67a8212ae
--- /dev/null
+++ b/tests/net/java/android/net/ipmemorystore/ParcelableTests.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ipmemorystore;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.lang.reflect.Modifier;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ParcelableTests {
+ @Test
+ public void testNetworkAttributesParceling() throws Exception {
+ final NetworkAttributes.Builder builder = new NetworkAttributes.Builder();
+ NetworkAttributes in = builder.build();
+ assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable())));
+
+ builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("1.2.3.4"));
+ // groupHint stays null this time around
+ builder.setDnsAddresses(Collections.emptyList());
+ builder.setMtu(18);
+ in = builder.build();
+ assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable())));
+
+ builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("6.7.8.9"));
+ builder.setGroupHint("groupHint");
+ builder.setDnsAddresses(Arrays.asList(
+ InetAddress.getByName("ACA1:652B:0911:DE8F:1200:115E:913B:AA2A"),
+ InetAddress.getByName("6.7.8.9")));
+ builder.setMtu(1_000_000);
+ in = builder.build();
+ assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable())));
+
+ builder.setMtu(null);
+ in = builder.build();
+ assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable())));
+
+ // Verify that this test does not miss any new field added later.
+ // If any field is added to NetworkAttributes it must be tested here for parceling
+ // roundtrip.
+ assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields())
+ .filter(f -> !Modifier.isStatic(f.getModifiers())).count());
+ }
+
+ @Test
+ public void testPrivateDataParceling() throws Exception {
+ final Blob in = new Blob();
+ in.data = new byte[] {89, 111, 108, 111};
+ final Blob out = parcelingRoundTrip(in);
+ // Object.equals on byte[] tests the references
+ assertEquals(in.data.length, out.data.length);
+ assertTrue(Arrays.equals(in.data, out.data));
+ }
+
+ @Test
+ public void testSameL3NetworkResponseParceling() throws Exception {
+ final SameL3NetworkResponseParcelable parcelable = new SameL3NetworkResponseParcelable();
+ parcelable.l2Key1 = "key 1";
+ parcelable.l2Key2 = "key 2";
+ parcelable.confidence = 0.43f;
+
+ final SameL3NetworkResponse in = new SameL3NetworkResponse(parcelable);
+ assertEquals("key 1", in.l2Key1);
+ assertEquals("key 2", in.l2Key2);
+ assertEquals(0.43f, in.confidence, 0.01f /* delta */);
+
+ final SameL3NetworkResponse out =
+ new SameL3NetworkResponse(parcelingRoundTrip(in.toParcelable()));
+
+ assertEquals(in, out);
+ assertEquals(in.l2Key1, out.l2Key1);
+ assertEquals(in.l2Key2, out.l2Key2);
+ assertEquals(in.confidence, out.confidence, 0.01f /* delta */);
+ }
+
+ private <T extends Parcelable> T parcelingRoundTrip(final T in) throws Exception {
+ final Parcel p = Parcel.obtain();
+ in.writeToParcel(p, /* flags */ 0);
+ p.setDataPosition(0);
+ final byte[] marshalledData = p.marshall();
+ p.recycle();
+
+ final Parcel q = Parcel.obtain();
+ q.unmarshall(marshalledData, 0, marshalledData.length);
+ q.setDataPosition(0);
+
+ final Parcelable.Creator<T> creator = (Parcelable.Creator<T>)
+ in.getClass().getField("CREATOR").get(null); // static object, so null receiver
+ final T unmarshalled = (T) creator.createFromParcel(q);
+ q.recycle();
+ return unmarshalled;
+ }
+}
diff --git a/tests/net/java/android/net/shared/InitialConfigurationTest.java b/tests/net/java/android/net/shared/InitialConfigurationTest.java
new file mode 100644
index 000000000000..78792bdfe4f9
--- /dev/null
+++ b/tests/net/java/android/net/shared/InitialConfigurationTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.InetAddresses.parseNumericAddress;
+import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+/**
+ * Tests for {@link InitialConfiguration}
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class InitialConfigurationTest {
+ private InitialConfiguration mConfig;
+
+ @Before
+ public void setUp() {
+ mConfig = new InitialConfiguration();
+ mConfig.ipAddresses.addAll(Arrays.asList(
+ new LinkAddress(parseNumericAddress("192.168.45.45"), 16),
+ new LinkAddress(parseNumericAddress("2001:db8::45"), 33)));
+ mConfig.directlyConnectedRoutes.addAll(Arrays.asList(
+ new IpPrefix(parseNumericAddress("192.168.46.46"), 17),
+ new IpPrefix(parseNumericAddress("2001:db8::46"), 34)));
+ mConfig.dnsServers.addAll(Arrays.asList(
+ parseNumericAddress("192.168.47.47"),
+ parseNumericAddress("2001:db8::47")));
+ // Any added InitialConfiguration field must be included in equals() to be tested properly
+ assertFieldCountEquals(3, InitialConfiguration.class);
+ }
+
+ @Test
+ public void testParcelUnparcelInitialConfiguration() {
+ final InitialConfiguration unparceled =
+ InitialConfiguration.fromStableParcelable(mConfig.toStableParcelable());
+ assertEquals(mConfig, unparceled);
+ }
+
+ @Test
+ public void testEquals() {
+ assertEquals(mConfig, InitialConfiguration.copy(mConfig));
+
+ assertNotEqualsAfterChange(c -> c.ipAddresses.add(
+ new LinkAddress(parseNumericAddress("192.168.47.47"), 24)));
+ assertNotEqualsAfterChange(c -> c.directlyConnectedRoutes.add(
+ new IpPrefix(parseNumericAddress("192.168.46.46"), 32)));
+ assertNotEqualsAfterChange(c -> c.dnsServers.add(parseNumericAddress("2001:db8::49")));
+ assertFieldCountEquals(3, InitialConfiguration.class);
+ }
+
+ private void assertNotEqualsAfterChange(Consumer<InitialConfiguration> mutator) {
+ final InitialConfiguration newConfig = InitialConfiguration.copy(mConfig);
+ mutator.accept(newConfig);
+ assertNotEquals(mConfig, newConfig);
+ }
+}
diff --git a/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
new file mode 100644
index 000000000000..14df392cbe07
--- /dev/null
+++ b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.InetAddresses.parseNumericAddress;
+import static android.net.shared.IpConfigurationParcelableUtil.fromStableParcelable;
+import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable;
+import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.DhcpResults;
+import android.net.LinkAddress;
+import android.net.StaticIpConfiguration;
+import android.net.apf.ApfCapabilities;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.net.Inet4Address;
+
+/**
+ * Tests for {@link IpConfigurationParcelableUtil}.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IpConfigurationParcelableUtilTest {
+ private StaticIpConfiguration mStaticIpConfiguration;
+ private DhcpResults mDhcpResults;
+
+ @Before
+ public void setUp() {
+ mStaticIpConfiguration = new StaticIpConfiguration();
+ mStaticIpConfiguration.ipAddress = new LinkAddress(parseNumericAddress("2001:db8::42"), 64);
+ mStaticIpConfiguration.gateway = parseNumericAddress("192.168.42.42");
+ mStaticIpConfiguration.dnsServers.add(parseNumericAddress("2001:db8::43"));
+ mStaticIpConfiguration.dnsServers.add(parseNumericAddress("192.168.43.43"));
+ mStaticIpConfiguration.domains = "example.com";
+ // Any added StaticIpConfiguration field must be included in equals() to be tested properly
+ assertFieldCountEquals(4, StaticIpConfiguration.class);
+
+ mDhcpResults = new DhcpResults(mStaticIpConfiguration);
+ mDhcpResults.serverAddress = (Inet4Address) parseNumericAddress("192.168.44.44");
+ mDhcpResults.vendorInfo = "TEST_VENDOR_INFO";
+ mDhcpResults.leaseDuration = 3600;
+ mDhcpResults.mtu = 1450;
+ // Any added DhcpResults field must be included in equals() to be tested properly
+ assertFieldCountEquals(4, DhcpResults.class);
+ }
+
+ @Test
+ public void testParcelUnparcelStaticConfiguration() {
+ doStaticConfigurationParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelStaticConfiguration_NullIpAddress() {
+ mStaticIpConfiguration.ipAddress = null;
+ doStaticConfigurationParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelStaticConfiguration_NullGateway() {
+ mStaticIpConfiguration.gateway = null;
+ doStaticConfigurationParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelStaticConfiguration_NullDomains() {
+ mStaticIpConfiguration.domains = null;
+ doStaticConfigurationParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelStaticConfiguration_EmptyDomains() {
+ mStaticIpConfiguration.domains = "";
+ doStaticConfigurationParcelUnparcelTest();
+ }
+
+ private void doStaticConfigurationParcelUnparcelTest() {
+ final StaticIpConfiguration unparceled =
+ fromStableParcelable(toStableParcelable(mStaticIpConfiguration));
+ assertEquals(mStaticIpConfiguration, unparceled);
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults() {
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults_NullServerAddress() {
+ mDhcpResults.serverAddress = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults_NullVendorInfo() {
+ mDhcpResults.vendorInfo = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ private void doDhcpResultsParcelUnparcelTest() {
+ final DhcpResults unparceled = fromStableParcelable(toStableParcelable(mDhcpResults));
+ assertEquals(mDhcpResults, unparceled);
+ }
+
+ @Test
+ public void testParcelUnparcelApfCapabilities() {
+ final ApfCapabilities caps = new ApfCapabilities(123, 456, 789);
+ assertEquals(caps, fromStableParcelable(toStableParcelable(caps)));
+ }
+}
diff --git a/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java b/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java
new file mode 100644
index 000000000000..6f711c0b5743
--- /dev/null
+++ b/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable;
+import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable;
+import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.InetAddresses;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.ProxyInfo;
+import android.net.RouteInfo;
+import android.net.Uri;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/**
+ * Tests for {@link LinkPropertiesParcelableUtil}
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LinkPropertiesParcelableUtilTest {
+ private LinkProperties mLinkProperties;
+
+ private static final String TEST_LINKPROPS_IFACE = "TEST_IFACE";
+ private static final String TEST_STACKED_LINK_1_IFACE = "TEST_STACKED_IFACE_1";
+ private static final String TEST_STACKED_LINK_2_IFACE = "TEST_STACKED_IFACE_2";
+
+ @Before
+ public void setUp() {
+ mLinkProperties = makeLinkProperties(TEST_LINKPROPS_IFACE);
+ mLinkProperties.addStackedLink(makeLinkProperties(TEST_STACKED_LINK_1_IFACE));
+ mLinkProperties.addStackedLink(makeLinkProperties(TEST_STACKED_LINK_2_IFACE));
+ }
+
+ private static LinkProperties makeLinkProperties(String iface) {
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(iface);
+ lp.setLinkAddresses(Arrays.asList(
+ new LinkAddress(InetAddresses.parseNumericAddress("192.168.0.42"), 16),
+ new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::7"), 42)));
+ lp.setDnsServers(Arrays.asList(
+ InetAddresses.parseNumericAddress("2001:db8::42"),
+ InetAddresses.parseNumericAddress("192.168.1.1")
+ ));
+ lp.setValidatedPrivateDnsServers(Arrays.asList(
+ InetAddresses.parseNumericAddress("2001:db8::43"),
+ InetAddresses.parseNumericAddress("192.168.42.43")
+ ));
+ lp.setPcscfServers(Arrays.asList(
+ InetAddresses.parseNumericAddress("2001:db8::47"),
+ InetAddresses.parseNumericAddress("192.168.42.47")
+ ));
+ lp.setUsePrivateDns(true);
+ lp.setPrivateDnsServerName("test.example.com");
+ lp.setDomains("test1.example.com,test2.example.com");
+ lp.addRoute(new RouteInfo(
+ new IpPrefix(InetAddresses.parseNumericAddress("2001:db8::44"), 45),
+ InetAddresses.parseNumericAddress("2001:db8::45"),
+ iface,
+ RouteInfo.RTN_UNICAST
+ ));
+ lp.addRoute(new RouteInfo(
+ new IpPrefix(InetAddresses.parseNumericAddress("192.168.44.45"), 16),
+ InetAddresses.parseNumericAddress("192.168.45.1"),
+ iface,
+ RouteInfo.RTN_THROW
+ ));
+ lp.setHttpProxy(new ProxyInfo("test3.example.com", 8000,
+ "excl1.example.com,excl2.example.com"));
+ lp.setMtu(5000);
+ lp.setTcpBufferSizes("1,2,3,4,5,6");
+ lp.setNat64Prefix(new IpPrefix(InetAddresses.parseNumericAddress("2001:db8::48"), 96));
+
+ // Verify that this test does not miss any new field added later.
+ // If any added field is not included in LinkProperties#equals, assertLinkPropertiesEquals
+ // must also be updated.
+ assertFieldCountEquals(14, LinkProperties.class);
+
+ return lp;
+ }
+
+ @Test
+ public void testParcelUnparcel() {
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullInterface() {
+ mLinkProperties.setInterfaceName(null);
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullPrivateDnsServer() {
+ mLinkProperties.setPrivateDnsServerName(null);
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullDomains() {
+ mLinkProperties.setDomains(null);
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullProxy() {
+ mLinkProperties.setHttpProxy(null);
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullTcpBufferSizes() {
+ mLinkProperties.setTcpBufferSizes(null);
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_EmptyLinkAddresses() {
+ mLinkProperties.setLinkAddresses(Collections.emptyList());
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_EmptyDnses() {
+ mLinkProperties.setDnsServers(Collections.emptyList());
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_EmptyValidatedPrivateDnses() {
+ mLinkProperties.setValidatedPrivateDnsServers(Collections.emptyList());
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_EmptyRoutes() {
+ for (RouteInfo r : mLinkProperties.getAllRoutes()) {
+ mLinkProperties.removeRoute(r);
+ }
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_PacFileProxyInfo() {
+ mLinkProperties.setHttpProxy(new ProxyInfo(Uri.parse("http://pacfile.example.com")));
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullNat64Prefix() {
+ mLinkProperties.setNat64Prefix(null);
+ doParcelUnparcelTest();
+ }
+
+ private void doParcelUnparcelTest() {
+ final LinkProperties unparceled = fromStableParcelable(toStableParcelable(mLinkProperties));
+ assertLinkPropertiesEquals(mLinkProperties, unparceled);
+ }
+
+ private static void assertLinkPropertiesEquals(LinkProperties expected, LinkProperties actual) {
+ assertEquals(expected, actual);
+
+ // LinkProperties equals() does not include stacked links
+ assertEquals(expected.getStackedLinks(), actual.getStackedLinks());
+ }
+}
diff --git a/tests/net/java/android/net/shared/ParcelableTestUtil.java b/tests/net/java/android/net/shared/ParcelableTestUtil.java
new file mode 100644
index 000000000000..088ea3c1d1ed
--- /dev/null
+++ b/tests/net/java/android/net/shared/ParcelableTestUtil.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Modifier;
+import java.util.Arrays;
+
+/**
+ * Utility classes to write tests for stable AIDL parceling/unparceling
+ */
+public final class ParcelableTestUtil {
+
+ /**
+ * Verifies that the number of nonstatic fields in a class equals a given count.
+ *
+ * <p>This assertion serves as a reminder to update test code around it if fields are added
+ * after the test is written.
+ * @param count Expected number of nonstatic fields in the class.
+ * @param clazz Class to test.
+ */
+ public static <T> void assertFieldCountEquals(int count, Class<T> clazz) {
+ assertEquals(count, Arrays.stream(clazz.getDeclaredFields())
+ .filter(f -> !Modifier.isStatic(f.getModifiers())).count());
+ }
+}
diff --git a/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java b/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java
new file mode 100644
index 000000000000..6ea47d2160a7
--- /dev/null
+++ b/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import static android.net.InetAddresses.parseNumericAddress;
+import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+import static android.net.shared.ProvisioningConfiguration.fromStableParcelable;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.net.LinkAddress;
+import android.net.Network;
+import android.net.StaticIpConfiguration;
+import android.net.apf.ApfCapabilities;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.function.Consumer;
+
+/**
+ * Tests for {@link ProvisioningConfiguration}.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ProvisioningConfigurationTest {
+ private ProvisioningConfiguration mConfig;
+
+ @Before
+ public void setUp() {
+ mConfig = new ProvisioningConfiguration();
+ mConfig.mEnableIPv4 = true;
+ mConfig.mEnableIPv6 = true;
+ mConfig.mUsingMultinetworkPolicyTracker = true;
+ mConfig.mUsingIpReachabilityMonitor = true;
+ mConfig.mRequestedPreDhcpActionMs = 42;
+ mConfig.mInitialConfig = new InitialConfiguration();
+ mConfig.mInitialConfig.ipAddresses.add(
+ new LinkAddress(parseNumericAddress("192.168.42.42"), 24));
+ mConfig.mStaticIpConfig = new StaticIpConfiguration();
+ mConfig.mStaticIpConfig.ipAddress =
+ new LinkAddress(parseNumericAddress("2001:db8::42"), 90);
+ // Not testing other InitialConfig or StaticIpConfig members: they have their own unit tests
+ mConfig.mApfCapabilities = new ApfCapabilities(1, 2, 3);
+ mConfig.mProvisioningTimeoutMs = 4200;
+ mConfig.mIPv6AddrGenMode = 123;
+ mConfig.mNetwork = new Network(321);
+ mConfig.mDisplayName = "test_config";
+ // Any added field must be included in equals() to be tested properly
+ assertFieldCountEquals(12, ProvisioningConfiguration.class);
+ }
+
+ @Test
+ public void testParcelUnparcel() {
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullInitialConfiguration() {
+ mConfig.mInitialConfig = null;
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullStaticConfiguration() {
+ mConfig.mStaticIpConfig = null;
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullApfCapabilities() {
+ mConfig.mApfCapabilities = null;
+ doParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcel_NullNetwork() {
+ mConfig.mNetwork = null;
+ doParcelUnparcelTest();
+ }
+
+ private void doParcelUnparcelTest() {
+ final ProvisioningConfiguration unparceled =
+ fromStableParcelable(mConfig.toStableParcelable());
+ assertEquals(mConfig, unparceled);
+ }
+
+ @Test
+ public void testEquals() {
+ assertEquals(mConfig, new ProvisioningConfiguration(mConfig));
+
+ assertNotEqualsAfterChange(c -> c.mEnableIPv4 = false);
+ assertNotEqualsAfterChange(c -> c.mEnableIPv6 = false);
+ assertNotEqualsAfterChange(c -> c.mUsingMultinetworkPolicyTracker = false);
+ assertNotEqualsAfterChange(c -> c.mUsingIpReachabilityMonitor = false);
+ assertNotEqualsAfterChange(c -> c.mRequestedPreDhcpActionMs++);
+ assertNotEqualsAfterChange(c -> c.mInitialConfig.ipAddresses.add(
+ new LinkAddress(parseNumericAddress("192.168.47.47"), 16)));
+ assertNotEqualsAfterChange(c -> c.mInitialConfig = null);
+ assertNotEqualsAfterChange(c -> c.mStaticIpConfig.ipAddress =
+ new LinkAddress(parseNumericAddress("2001:db8::47"), 64));
+ assertNotEqualsAfterChange(c -> c.mStaticIpConfig = null);
+ assertNotEqualsAfterChange(c -> c.mApfCapabilities = new ApfCapabilities(4, 5, 6));
+ assertNotEqualsAfterChange(c -> c.mApfCapabilities = null);
+ assertNotEqualsAfterChange(c -> c.mProvisioningTimeoutMs++);
+ assertNotEqualsAfterChange(c -> c.mIPv6AddrGenMode++);
+ assertNotEqualsAfterChange(c -> c.mNetwork = new Network(123));
+ assertNotEqualsAfterChange(c -> c.mNetwork = null);
+ assertNotEqualsAfterChange(c -> c.mDisplayName = "other_test");
+ assertNotEqualsAfterChange(c -> c.mDisplayName = null);
+ assertFieldCountEquals(12, ProvisioningConfiguration.class);
+ }
+
+ private void assertNotEqualsAfterChange(Consumer<ProvisioningConfiguration> mutator) {
+ final ProvisioningConfiguration newConfig = new ProvisioningConfiguration(mConfig);
+ mutator.accept(newConfig);
+ assertNotEquals(mConfig, newConfig);
+ }
+}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 71529fdffd5f..882babff4aee 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -26,6 +26,8 @@ import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
import static android.net.ConnectivityManager.TYPE_NONE;
import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
@@ -69,17 +71,19 @@ import static org.junit.Assert.fail;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -89,7 +93,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
-import android.net.CaptivePortal;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.PacketKeepalive;
@@ -97,6 +100,8 @@ import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException;
import android.net.ConnectivityThread;
import android.net.INetd;
+import android.net.INetworkMonitor;
+import android.net.INetworkMonitorCallbacks;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
@@ -114,12 +119,13 @@ import android.net.NetworkInfo.DetailedState;
import android.net.NetworkMisc;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
+import android.net.NetworkStack;
import android.net.NetworkUtils;
import android.net.RouteInfo;
-import android.net.StringNetworkSpecifier;
import android.net.UidRange;
-import android.net.captiveportal.CaptivePortalProbeResult;
import android.net.metrics.IpConnectivityLog;
+import android.net.shared.NetworkMonitorUtils;
+import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker;
import android.os.ConditionVariable;
import android.os.Handler;
@@ -138,6 +144,7 @@ import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -148,12 +155,9 @@ import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.connectivity.ConnectivityConstants;
import com.android.server.connectivity.DefaultNetworkMetrics;
-import com.android.server.connectivity.DnsManager;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.connectivity.MockableSystemProperties;
import com.android.server.connectivity.Nat464Xlat;
-import com.android.server.connectivity.NetworkAgentInfo;
-import com.android.server.connectivity.NetworkMonitor;
import com.android.server.connectivity.Tethering;
import com.android.server.connectivity.Vpn;
import com.android.server.net.NetworkPinner;
@@ -168,6 +172,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
+import org.mockito.stubbing.Answer;
import java.net.Inet4Address;
import java.net.InetAddress;
@@ -230,6 +235,7 @@ public class ConnectivityServiceTest {
@Mock INetworkStatsService mStatsService;
@Mock INetworkPolicyManager mNpm;
@Mock INetd mMockNetd;
+ @Mock NetworkStack mNetworkStack;
private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class);
@@ -299,6 +305,7 @@ public class ConnectivityServiceTest {
public Object getSystemService(String name) {
if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class);
+ if (Context.NETWORK_STACK_SERVICE.equals(name)) return mNetworkStack;
return super.getSystemService(name);
}
@@ -386,7 +393,7 @@ public class ConnectivityServiceTest {
}
private class MockNetworkAgent {
- private final WrappedNetworkMonitor mWrappedNetworkMonitor;
+ private final INetworkMonitor mNetworkMonitor;
private final NetworkInfo mNetworkInfo;
private final NetworkCapabilities mNetworkCapabilities;
private final HandlerThread mHandlerThread;
@@ -402,6 +409,26 @@ public class ConnectivityServiceTest {
// mNetworkStatusReceived.
private String mRedirectUrl;
+ private INetworkMonitorCallbacks mNmCallbacks;
+ private int mNmValidationResult = NETWORK_TEST_RESULT_INVALID;
+ private String mNmValidationRedirectUrl = null;
+ private boolean mNmProvNotificationRequested = false;
+
+ void setNetworkValid() {
+ mNmValidationResult = NETWORK_TEST_RESULT_VALID;
+ mNmValidationRedirectUrl = null;
+ }
+
+ void setNetworkInvalid() {
+ mNmValidationResult = NETWORK_TEST_RESULT_INVALID;
+ mNmValidationRedirectUrl = null;
+ }
+
+ void setNetworkPortal(String redirectUrl) {
+ setNetworkInvalid();
+ mNmValidationRedirectUrl = redirectUrl;
+ }
+
MockNetworkAgent(int transport) {
this(transport, new LinkProperties());
}
@@ -434,6 +461,29 @@ public class ConnectivityServiceTest {
}
mHandlerThread = new HandlerThread("Mock-" + typeName);
mHandlerThread.start();
+
+ mNetworkMonitor = mock(INetworkMonitor.class);
+ final Answer validateAnswer = inv -> {
+ new Thread(this::onValidationRequested).start();
+ return null;
+ };
+
+ try {
+ doAnswer(validateAnswer).when(mNetworkMonitor).notifyNetworkConnected();
+ doAnswer(validateAnswer).when(mNetworkMonitor).forceReevaluation(anyInt());
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
+
+ final ArgumentCaptor<Network> nmNetworkCaptor =
+ ArgumentCaptor.forClass(Network.class);
+ final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor =
+ ArgumentCaptor.forClass(INetworkMonitorCallbacks.class);
+ doNothing().when(mNetworkStack).makeNetworkMonitor(
+ nmNetworkCaptor.capture(),
+ any() /* name */,
+ nmCbCaptor.capture());
+
mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
"Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
linkProperties, mScore, new NetworkMisc()) {
@@ -465,10 +515,40 @@ public class ConnectivityServiceTest {
mPreventReconnectReceived.open();
}
};
+
+ assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId);
+ mNmCallbacks = nmCbCaptor.getValue();
+
+ try {
+ mNmCallbacks.onNetworkMonitorCreated(mNetworkMonitor);
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
+
// Waits for the NetworkAgent to be registered, which includes the creation of the
// NetworkMonitor.
waitForIdle();
- mWrappedNetworkMonitor = mService.getLastCreatedWrappedNetworkMonitor();
+ }
+
+ private void onValidationRequested() {
+ try {
+ if (mNmProvNotificationRequested
+ && mNmValidationResult == NETWORK_TEST_RESULT_VALID) {
+ mNmCallbacks.hideProvisioningNotification();
+ mNmProvNotificationRequested = false;
+ }
+
+ mNmCallbacks.notifyNetworkTested(
+ mNmValidationResult, mNmValidationRedirectUrl);
+
+ if (mNmValidationRedirectUrl != null) {
+ mNmCallbacks.showProvisioningNotification(
+ "test_provisioning_notif_action");
+ mNmProvNotificationRequested = true;
+ }
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
}
public void adjustScore(int change) {
@@ -539,7 +619,7 @@ public class ConnectivityServiceTest {
NetworkCallback callback = null;
final ConditionVariable validatedCv = new ConditionVariable();
if (validated) {
- mWrappedNetworkMonitor.gen204ProbeResult = 204;
+ setNetworkValid();
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(mNetworkCapabilities.getTransportTypes()[0])
.clearCapabilities()
@@ -564,15 +644,14 @@ public class ConnectivityServiceTest {
if (validated) {
// Wait for network to validate.
waitFor(validatedCv);
- mWrappedNetworkMonitor.gen204ProbeResult = 500;
+ setNetworkInvalid();
}
if (callback != null) mCm.unregisterNetworkCallback(callback);
}
public void connectWithCaptivePortal(String redirectUrl) {
- mWrappedNetworkMonitor.gen204ProbeResult = 200;
- mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl;
+ setNetworkPortal(redirectUrl);
connect(false);
}
@@ -603,10 +682,6 @@ public class ConnectivityServiceTest {
return mDisconnected;
}
- public WrappedNetworkMonitor getWrappedNetworkMonitor() {
- return mWrappedNetworkMonitor;
- }
-
public void sendLinkProperties(LinkProperties lp) {
mNetworkAgent.sendLinkProperties(lp);
}
@@ -880,28 +955,6 @@ public class ConnectivityServiceTest {
}
}
- // NetworkMonitor implementation allowing overriding of Internet connectivity probe result.
- private class WrappedNetworkMonitor extends NetworkMonitor {
- public final Handler connectivityHandler;
- // HTTP response code fed back to NetworkMonitor for Internet connectivity probe.
- public int gen204ProbeResult = 500;
- public String gen204ProbeRedirectUrl = null;
-
- public WrappedNetworkMonitor(Context context, Handler handler,
- NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest,
- IpConnectivityLog log) {
- super(context, handler, networkAgentInfo, defaultRequest, log,
- NetworkMonitor.Dependencies.DEFAULT);
- connectivityHandler = handler;
- }
-
- @Override
- protected CaptivePortalProbeResult isCaptivePortal() {
- if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); }
- return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null);
- }
- }
-
private class WrappedMultinetworkPolicyTracker extends MultinetworkPolicyTracker {
public volatile boolean configRestrictsAvoidBadWifi;
public volatile int configMeteredMultipathPreference;
@@ -923,7 +976,6 @@ public class ConnectivityServiceTest {
private class WrappedConnectivityService extends ConnectivityService {
public WrappedMultinetworkPolicyTracker wrappedMultinetworkPolicyTracker;
- private WrappedNetworkMonitor mLastCreatedNetworkMonitor;
private MockableSystemProperties mSystemProperties;
public WrappedConnectivityService(Context context, INetworkManagementService netManager,
@@ -971,15 +1023,6 @@ public class ConnectivityServiceTest {
}
}
- @Override
- public NetworkMonitor createNetworkMonitor(Context context, Handler handler,
- NetworkAgentInfo nai, NetworkRequest defaultRequest) {
- final WrappedNetworkMonitor monitor = new WrappedNetworkMonitor(
- context, handler, nai, defaultRequest, mock(IpConnectivityLog.class));
- mLastCreatedNetworkMonitor = monitor;
- return monitor;
- }
-
public Nat464Xlat getNat464Xlat(MockNetworkAgent mna) {
return getNetworkAgentInfoForNetwork(mna.getNetwork()).clatd;
}
@@ -1017,10 +1060,6 @@ public class ConnectivityServiceTest {
protected void registerNetdEventCallback() {
}
- public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() {
- return mLastCreatedNetworkMonitor;
- }
-
public void mockVpn(int uid) {
synchronized (mVpns) {
int userId = UserHandle.getUserId(uid);
@@ -2439,7 +2478,7 @@ public class ConnectivityServiceTest {
// Make captive portal disappear then revalidate.
// Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204;
+ mWiFiNetworkAgent.setNetworkValid();
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true);
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
@@ -2448,13 +2487,13 @@ public class ConnectivityServiceTest {
// Break network connectivity.
// Expect NET_CAPABILITY_VALIDATED onLost callback.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 500;
+ mWiFiNetworkAgent.setNetworkInvalid();
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false);
validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
}
@Test
- public void testCaptivePortalApp() {
+ public void testCaptivePortalApp() throws RemoteException {
final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build();
@@ -2477,21 +2516,19 @@ public class ConnectivityServiceTest {
mServiceContext.expectNoStartActivityIntent(fastTimeoutMs);
// Turn into a captive portal.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 302;
+ mWiFiNetworkAgent.setNetworkPortal("http://example.com");
mCm.reportNetworkConnectivity(wifiNetwork, false);
captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
- // Check that startCaptivePortalApp sends the expected intent.
+ // Check that startCaptivePortalApp sends the expected command to NetworkMonitor.
mCm.startCaptivePortalApp(wifiNetwork);
- Intent intent = mServiceContext.expectStartActivityIntent(TIMEOUT_MS);
- assertEquals(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN, intent.getAction());
- assertEquals(wifiNetwork, intent.getExtra(ConnectivityManager.EXTRA_NETWORK));
-
- // Have the app report that the captive portal is dismissed, and check that we revalidate.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204;
- CaptivePortal c = (CaptivePortal) intent.getExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
- c.reportCaptivePortalDismissed();
+ verify(mWiFiNetworkAgent.mNetworkMonitor, timeout(TIMEOUT_MS).times(1))
+ .launchCaptivePortalApp();
+
+ // Report that the captive portal is dismissed, and check that callbacks are fired
+ mWiFiNetworkAgent.setNetworkValid();
+ mWiFiNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid());
validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
@@ -2524,36 +2561,82 @@ public class ConnectivityServiceTest {
waitFor(avoidCv);
assertNoCallbacks(captivePortalCallback, validatedCallback);
-
- // Now test ignore mode.
- setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE);
-
- // Bring up a network with a captive portal.
- // Since we're ignoring captive portals, the network will validate.
- mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
- String secondRedirectUrl = "http://example.com/secondPath";
- mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl);
-
- // Expect NET_CAPABILITY_VALIDATED onAvailable callback.
- validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
- // But there should be no CaptivePortal callback.
- captivePortalCallback.assertNoCallback();
}
private NetworkRequest.Builder newWifiRequestBuilder() {
return new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI);
}
+ /**
+ * Verify request matching behavior with network specifiers.
+ *
+ * Note: this test is somewhat problematic since it involves removing capabilities from
+ * agents - i.e. agents rejecting requests which they previously accepted. This is flagged
+ * as a WTF bug in
+ * {@link ConnectivityService#mixInCapabilities(NetworkAgentInfo, NetworkCapabilities)} but
+ * does work.
+ */
@Test
public void testNetworkSpecifier() {
+ // A NetworkSpecifier subclass that matches all networks but must not be visible to apps.
+ class ConfidentialMatchAllNetworkSpecifier extends NetworkSpecifier implements
+ Parcelable {
+ @Override
+ public boolean satisfiedBy(NetworkSpecifier other) {
+ return true;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {}
+
+ @Override
+ public NetworkSpecifier redact() {
+ return null;
+ }
+ }
+
+ // A network specifier that matches either another LocalNetworkSpecifier with the same
+ // string or a ConfidentialMatchAllNetworkSpecifier, and can be passed to apps as is.
+ class LocalStringNetworkSpecifier extends NetworkSpecifier implements Parcelable {
+ private String mString;
+
+ LocalStringNetworkSpecifier(String string) {
+ mString = string;
+ }
+
+ @Override
+ public boolean satisfiedBy(NetworkSpecifier other) {
+ if (other instanceof LocalStringNetworkSpecifier) {
+ return TextUtils.equals(mString,
+ ((LocalStringNetworkSpecifier) other).mString);
+ }
+ if (other instanceof ConfidentialMatchAllNetworkSpecifier) return true;
+ return false;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {}
+ }
+
+
NetworkRequest rEmpty1 = newWifiRequestBuilder().build();
NetworkRequest rEmpty2 = newWifiRequestBuilder().setNetworkSpecifier((String) null).build();
NetworkRequest rEmpty3 = newWifiRequestBuilder().setNetworkSpecifier("").build();
NetworkRequest rEmpty4 = newWifiRequestBuilder().setNetworkSpecifier(
(NetworkSpecifier) null).build();
- NetworkRequest rFoo = newWifiRequestBuilder().setNetworkSpecifier("foo").build();
+ NetworkRequest rFoo = newWifiRequestBuilder().setNetworkSpecifier(
+ new LocalStringNetworkSpecifier("foo")).build();
NetworkRequest rBar = newWifiRequestBuilder().setNetworkSpecifier(
- new StringNetworkSpecifier("bar")).build();
+ new LocalStringNetworkSpecifier("bar")).build();
TestNetworkCallback cEmpty1 = new TestNetworkCallback();
TestNetworkCallback cEmpty2 = new TestNetworkCallback();
@@ -2562,7 +2645,7 @@ public class ConnectivityServiceTest {
TestNetworkCallback cFoo = new TestNetworkCallback();
TestNetworkCallback cBar = new TestNetworkCallback();
TestNetworkCallback[] emptyCallbacks = new TestNetworkCallback[] {
- cEmpty1, cEmpty2, cEmpty3 };
+ cEmpty1, cEmpty2, cEmpty3, cEmpty4 };
mCm.registerNetworkCallback(rEmpty1, cEmpty1);
mCm.registerNetworkCallback(rEmpty2, cEmpty2);
@@ -2571,6 +2654,9 @@ public class ConnectivityServiceTest {
mCm.registerNetworkCallback(rFoo, cFoo);
mCm.registerNetworkCallback(rBar, cBar);
+ LocalStringNetworkSpecifier nsFoo = new LocalStringNetworkSpecifier("foo");
+ LocalStringNetworkSpecifier nsBar = new LocalStringNetworkSpecifier("bar");
+
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(false);
cEmpty1.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
@@ -2579,30 +2665,54 @@ public class ConnectivityServiceTest {
cEmpty4.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
assertNoCallbacks(cFoo, cBar);
- mWiFiNetworkAgent.setNetworkSpecifier(new StringNetworkSpecifier("foo"));
+ mWiFiNetworkAgent.setNetworkSpecifier(nsFoo);
cFoo.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
for (TestNetworkCallback c: emptyCallbacks) {
- c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent);
+ c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsFoo),
+ mWiFiNetworkAgent);
}
- cFoo.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent);
+ cFoo.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsFoo),
+ mWiFiNetworkAgent);
+ assertEquals(nsFoo,
+ mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier());
cFoo.assertNoCallback();
- mWiFiNetworkAgent.setNetworkSpecifier(new StringNetworkSpecifier("bar"));
+ mWiFiNetworkAgent.setNetworkSpecifier(nsBar);
cFoo.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
cBar.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
for (TestNetworkCallback c: emptyCallbacks) {
- c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent);
+ c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsBar),
+ mWiFiNetworkAgent);
}
- cBar.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent);
+ cBar.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsBar),
+ mWiFiNetworkAgent);
+ assertEquals(nsBar,
+ mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier());
+ cBar.assertNoCallback();
+
+ mWiFiNetworkAgent.setNetworkSpecifier(new ConfidentialMatchAllNetworkSpecifier());
+ cFoo.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
+ for (TestNetworkCallback c : emptyCallbacks) {
+ c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null,
+ mWiFiNetworkAgent);
+ }
+ cFoo.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null,
+ mWiFiNetworkAgent);
+ cBar.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null,
+ mWiFiNetworkAgent);
+ assertNull(
+ mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier());
+ cFoo.assertNoCallback();
cBar.assertNoCallback();
mWiFiNetworkAgent.setNetworkSpecifier(null);
+ cFoo.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
cBar.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
for (TestNetworkCallback c: emptyCallbacks) {
c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent);
}
- assertNoCallbacks(cEmpty1, cEmpty2, cEmpty3, cFoo, cBar);
+ assertNoCallbacks(cEmpty1, cEmpty2, cEmpty3, cEmpty4, cFoo, cBar);
}
@Test
@@ -3169,7 +3279,7 @@ public class ConnectivityServiceTest {
Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
// Fail validation on wifi.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
+ mWiFiNetworkAgent.setNetworkInvalid();
mCm.reportNetworkConnectivity(wifiNetwork, false);
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
@@ -3213,7 +3323,7 @@ public class ConnectivityServiceTest {
wifiNetwork = mWiFiNetworkAgent.getNetwork();
// Fail validation on wifi and expect the dialog to appear.
- mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
+ mWiFiNetworkAgent.setNetworkInvalid();
mCm.reportNetworkConnectivity(wifiNetwork, false);
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
@@ -4002,11 +4112,9 @@ public class ConnectivityServiceTest {
final String TLS_SERVER6 = "2001:db8:53::53";
final InetAddress[] TLS_IPS = new InetAddress[]{ InetAddress.getByName(TLS_SERVER6) };
final String[] TLS_SERVERS = new String[]{ TLS_SERVER6 };
- final Handler h = mCellNetworkAgent.getWrappedNetworkMonitor().connectivityHandler;
- h.sendMessage(h.obtainMessage(
- NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0,
- mCellNetworkAgent.getNetwork().netId,
- new DnsManager.PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS)));
+ mCellNetworkAgent.mNmCallbacks.notifyPrivateDnsConfigResolved(
+ new PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS).toParcel());
+
waitForIdle();
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
anyInt(), mStringArrayCaptor.capture(), any(), any(),
@@ -4294,6 +4402,12 @@ public class ConnectivityServiceTest {
ranges.add(new UidRange(uid, uid));
mMockVpn.setNetworkAgent(vpnNetworkAgent);
mMockVpn.setUids(ranges);
+ // VPN networks do not satisfy the default request and are automatically validated
+ // by NetworkMonitor
+ assertFalse(NetworkMonitorUtils.isValidationRequired(
+ mCm.getDefaultRequest().networkCapabilities, vpnNetworkAgent.mNetworkCapabilities));
+ vpnNetworkAgent.setNetworkValid();
+
vpnNetworkAgent.connect(false);
mMockVpn.connect();
@@ -4656,7 +4770,7 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(true);
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
- verify(mNetworkManagementService, times(1)).startClatd(MOBILE_IFNAME);
+ verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME);
Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
// Clat iface up, expect stack link updated.
@@ -4683,7 +4797,7 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle();
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
- verify(mNetworkManagementService, times(1)).stopClatd(MOBILE_IFNAME);
+ verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
// Clat iface removed, expect linkproperties revert to original one
clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index d8f961850906..a844cfeeeb80 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -535,7 +535,10 @@ public class IpSecServiceParameterizedTest {
IpSecTransformResponse createTransformResp =
mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
- ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
+
+ Socket socket = new Socket();
+ socket.bind(null);
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
int resourceId = createTransformResp.resourceId;
mIpSecService.applyTransportModeTransform(pfd, IpSecManager.DIRECTION_OUT, resourceId);
@@ -552,7 +555,9 @@ public class IpSecServiceParameterizedTest {
@Test
public void testRemoveTransportModeTransform() throws Exception {
- ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
+ Socket socket = new Socket();
+ socket.bind(null);
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mIpSecService.removeTransportModeTransforms(pfd);
verify(mMockNetd).ipSecRemoveTransportModeTransform(pfd);
diff --git a/tests/net/java/com/android/server/IpSecServiceTest.java b/tests/net/java/com/android/server/IpSecServiceTest.java
index 724446e11c83..5be7c7bb2040 100644
--- a/tests/net/java/com/android/server/IpSecServiceTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceTest.java
@@ -422,7 +422,9 @@ public class IpSecServiceTest {
@Test
public void testRemoveTransportModeTransform() throws Exception {
- ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
+ Socket socket = new Socket();
+ socket.bind(null);
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mIpSecService.removeTransportModeTransforms(pfd);
verify(mMockNetd).ipSecRemoveTransportModeTransform(pfd);
diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
index 01b468af9447..38322e925a24 100644
--- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
@@ -17,7 +17,6 @@
package com.android.server.connectivity;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
@@ -29,13 +28,13 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
-import android.content.ContentResolver;
import android.content.Context;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
import android.net.RouteInfo;
+import android.net.shared.PrivateDnsConfig;
import android.os.INetworkManagementService;
import android.provider.Settings;
import android.support.test.filters.SmallTest;
@@ -43,18 +42,16 @@ import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.server.connectivity.DnsManager.PrivateDnsConfig;
-import com.android.server.connectivity.MockableSystemProperties;
-import java.net.InetAddress;
-import java.util.Arrays;
-
-import org.junit.runner.RunWith;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.InetAddress;
+import java.util.Arrays;
+
/**
* Tests for {@link DnsManager}.
*
@@ -133,7 +130,7 @@ public class DnsManagerTest {
PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com");
mDnsManager.updatePrivateDns(new Network(TEST_NETID),
- new DnsManager.PrivateDnsConfig("strictmode.com", new InetAddress[] {
+ new PrivateDnsConfig("strictmode.com", new InetAddress[] {
InetAddress.parseNumericAddress("6.6.6.6"),
InetAddress.parseNumericAddress("2001:db8:66:66::1")
}));
diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
index 354cf2f2239e..9578ded1a089 100644
--- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
@@ -23,31 +23,33 @@ import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.reset;
import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityManager;
+import android.net.INetd;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkMisc;
-import android.support.test.runner.AndroidJUnit4;
+import android.net.NetworkStack;
+import android.os.INetworkManagementService;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.format.DateUtils;
import com.android.internal.R;
import com.android.server.ConnectivityService;
-import com.android.server.connectivity.NetworkNotificationManager;
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
-import org.junit.runner.RunWith;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -66,17 +68,22 @@ public class LingerMonitorTest {
LingerMonitor mMonitor;
@Mock ConnectivityService mConnService;
+ @Mock INetd mNetd;
+ @Mock INetworkManagementService mNMS;
@Mock Context mCtx;
@Mock NetworkMisc mMisc;
@Mock NetworkNotificationManager mNotifier;
@Mock Resources mResources;
+ @Mock NetworkStack mNetworkStack;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mCtx.getResources()).thenReturn(mResources);
when(mCtx.getPackageName()).thenReturn("com.android.server.connectivity");
- when(mConnService.createNetworkMonitor(any(), any(), any(), any())).thenReturn(null);
+ when(mCtx.getSystemServiceName(NetworkStack.class))
+ .thenReturn(Context.NETWORK_STACK_SERVICE);
+ when(mCtx.getSystemService(Context.NETWORK_STACK_SERVICE)).thenReturn(mNetworkStack);
mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, HIGH_RATE_LIMIT);
}
@@ -349,7 +356,7 @@ public class LingerMonitorTest {
caps.addCapability(0);
caps.addTransportType(transport);
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
- caps, 50, mCtx, null, mMisc, null, mConnService);
+ caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS);
nai.everValidated = true;
return nai;
}
diff --git a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
index bf42412d68d8..07b1d057c882 100644
--- a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
+++ b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
@@ -17,9 +17,7 @@
package com.android.server.connectivity;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -27,6 +25,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.net.ConnectivityManager;
+import android.net.INetd;
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -57,6 +56,7 @@ public class Nat464XlatTest {
@Mock ConnectivityService mConnectivity;
@Mock NetworkMisc mMisc;
+ @Mock INetd mNetd;
@Mock INetworkManagementService mNms;
@Mock InterfaceConfiguration mConfig;
@Mock NetworkAgentInfo mNai;
@@ -65,7 +65,7 @@ public class Nat464XlatTest {
Handler mHandler;
Nat464Xlat makeNat464Xlat() {
- return new Nat464Xlat(mNms, mNai);
+ return new Nat464Xlat(mNai, mNetd, mNms);
}
@Before
@@ -129,7 +129,7 @@ public class Nat464XlatTest {
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNms).startClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE));
// Stacked interface up notification arrives.
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
@@ -144,7 +144,7 @@ public class Nat464XlatTest {
// ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
nat.stop();
- verify(mNms).stopClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStop(eq(BASE_IFACE));
// Stacked interface removed notification arrives.
nat.interfaceRemoved(STACKED_IFACE);
@@ -156,7 +156,7 @@ public class Nat464XlatTest {
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
assertIdle(nat);
- verifyNoMoreInteractions(mNms, mConnectivity);
+ verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
}
@Test
@@ -168,7 +168,7 @@ public class Nat464XlatTest {
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNms).startClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE));
// Stacked interface up notification arrives.
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
@@ -185,7 +185,7 @@ public class Nat464XlatTest {
mLooper.dispatchNext();
verify(mNms).unregisterObserver(eq(nat));
- verify(mNms).stopClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStop(eq(BASE_IFACE));
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
assertTrue(c.getValue().getStackedLinks().isEmpty());
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
@@ -194,7 +194,7 @@ public class Nat464XlatTest {
// ConnectivityService stops clat: no-op.
nat.stop();
- verifyNoMoreInteractions(mNms, mConnectivity);
+ verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
}
@Test
@@ -205,13 +205,13 @@ public class Nat464XlatTest {
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNms).startClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE));
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
nat.stop();
verify(mNms).unregisterObserver(eq(nat));
- verify(mNms).stopClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStop(eq(BASE_IFACE));
assertIdle(nat);
// In-flight interface up notification arrives: no-op
@@ -225,7 +225,7 @@ public class Nat464XlatTest {
assertIdle(nat);
- verifyNoMoreInteractions(mNms, mConnectivity);
+ verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
}
@Test
@@ -236,16 +236,16 @@ public class Nat464XlatTest {
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNms).startClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE));
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
nat.stop();
verify(mNms).unregisterObserver(eq(nat));
- verify(mNms).stopClatd(eq(BASE_IFACE));
+ verify(mNetd).clatdStop(eq(BASE_IFACE));
assertIdle(nat);
- verifyNoMoreInteractions(mNms, mConnectivity);
+ verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
}
static void assertIdle(Nat464Xlat nat) {
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index e6b43d286a3d..1ea83c2bbb6b 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -27,6 +27,7 @@ import static android.net.ConnectivityManager.TETHERING_USB;
import static android.net.ConnectivityManager.TETHERING_WIFI;
import static android.net.ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
@@ -37,6 +38,7 @@ import static android.provider.Settings.Global.TETHER_ENABLE_LEGACY_DHCP_SERVER;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Matchers.anyInt;
@@ -47,6 +49,8 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -74,8 +78,9 @@ import android.net.NetworkInfo;
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.RouteInfo;
-import android.net.dhcp.DhcpServer;
-import android.net.dhcp.DhcpServingParams;
+import android.net.dhcp.DhcpServerCallbacks;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServer;
import android.net.ip.IpServer;
import android.net.ip.RouterAdvertisementDaemon;
import android.net.util.InterfaceParams;
@@ -86,7 +91,6 @@ import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.INetworkManagementService;
-import android.os.Looper;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -129,6 +133,8 @@ public class TetheringTest {
private static final String TEST_USB_IFNAME = "test_rndis0";
private static final String TEST_WLAN_IFNAME = "test_wlan0";
+ private static final int DHCPSERVER_START_TIMEOUT_MS = 1000;
+
@Mock private ApplicationInfo mApplicationInfo;
@Mock private Context mContext;
@Mock private INetworkManagementService mNMService;
@@ -143,9 +149,11 @@ public class TetheringTest {
@Mock private UpstreamNetworkMonitor mUpstreamNetworkMonitor;
@Mock private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
@Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon;
- @Mock private DhcpServer mDhcpServer;
+ @Mock private IDhcpServer mDhcpServer;
@Mock private INetd mNetd;
+ private final MockIpServerDependencies mIpServerDependencies =
+ spy(new MockIpServerDependencies());
private final MockTetheringDependencies mTetheringDependencies =
new MockTetheringDependencies();
@@ -185,6 +193,47 @@ public class TetheringTest {
}
}
+ public class MockIpServerDependencies extends IpServer.Dependencies {
+ MockIpServerDependencies() {
+ super(null);
+ }
+
+ @Override
+ public RouterAdvertisementDaemon getRouterAdvertisementDaemon(
+ InterfaceParams ifParams) {
+ return mRouterAdvertisementDaemon;
+ }
+
+ @Override
+ public InterfaceParams getInterfaceParams(String ifName) {
+ assertTrue("Non-mocked interface " + ifName,
+ ifName.equals(TEST_USB_IFNAME)
+ || ifName.equals(TEST_WLAN_IFNAME)
+ || ifName.equals(TEST_MOBILE_IFNAME));
+ final String[] ifaces = new String[] {
+ TEST_USB_IFNAME, TEST_WLAN_IFNAME, TEST_MOBILE_IFNAME };
+ return new InterfaceParams(ifName, ArrayUtils.indexOf(ifaces, ifName) + IFINDEX_OFFSET,
+ MacAddress.ALL_ZEROS_ADDRESS);
+ }
+
+ @Override
+ public INetd getNetdService() {
+ return mNetd;
+ }
+
+ @Override
+ public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
+ DhcpServerCallbacks cb) {
+ new Thread(() -> {
+ try {
+ cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer);
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
+ }).run();
+ }
+ }
+
public class MockTetheringDependencies extends TetheringDependencies {
StateMachine upstreamNetworkMonitorMasterSM;
ArrayList<IpServer> ipv6CoordinatorNotifyList;
@@ -216,35 +265,8 @@ public class TetheringTest {
}
@Override
- public IpServer.Dependencies getIpServerDependencies() {
- return new IpServer.Dependencies() {
- @Override
- public RouterAdvertisementDaemon getRouterAdvertisementDaemon(
- InterfaceParams ifParams) {
- return mRouterAdvertisementDaemon;
- }
-
- @Override
- public InterfaceParams getInterfaceParams(String ifName) {
- final String[] ifaces = new String[] {
- TEST_USB_IFNAME, TEST_WLAN_IFNAME, TEST_MOBILE_IFNAME };
- final int index = ArrayUtils.indexOf(ifaces, ifName);
- assertTrue("Non-mocked interface: " + ifName, index >= 0);
- return new InterfaceParams(ifName, index + IFINDEX_OFFSET,
- MacAddress.ALL_ZEROS_ADDRESS);
- }
-
- @Override
- public INetd getNetdService() {
- return mNetd;
- }
-
- @Override
- public DhcpServer makeDhcpServer(Looper looper, String ifName,
- DhcpServingParams params, SharedLog log) {
- return mDhcpServer;
- }
- };
+ public IpServer.Dependencies getIpServerDependencies(Context context) {
+ return mIpServerDependencies;
}
@Override
@@ -546,7 +568,7 @@ public class TetheringTest {
sendIPv6TetherUpdates(upstreamState);
verify(mRouterAdvertisementDaemon, never()).buildNewRa(any(), notNull());
- verify(mDhcpServer, times(1)).start();
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).start(any());
}
@Test
@@ -557,7 +579,7 @@ public class TetheringTest {
runUsbTethering(upstreamState);
sendIPv6TetherUpdates(upstreamState);
- verify(mDhcpServer, never()).start();
+ verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any());
}
@Test
@@ -581,7 +603,7 @@ public class TetheringTest {
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
verify(mRouterAdvertisementDaemon, times(1)).start();
- verify(mDhcpServer, times(1)).start();
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).start(any());
sendIPv6TetherUpdates(upstreamState);
verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
@@ -595,7 +617,7 @@ public class TetheringTest {
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
- verify(mDhcpServer, times(1)).start();
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).start(any());
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME,
TEST_XLAT_MOBILE_IFNAME);
@@ -612,7 +634,7 @@ public class TetheringTest {
runUsbTethering(upstreamState);
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
- verify(mDhcpServer, times(1)).start();
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).start(any());
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
// Then 464xlat comes up
@@ -636,7 +658,7 @@ public class TetheringTest {
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
// DHCP not restarted on downstream (still times(1))
- verify(mDhcpServer, times(1)).start();
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).start(any());
}
@Test
diff --git a/tests/net/java/com/android/server/net/ipmemorystore/IpMemoryStoreServiceTest.java b/tests/net/java/com/android/server/net/ipmemorystore/IpMemoryStoreServiceTest.java
new file mode 100644
index 000000000000..94bcd28bf009
--- /dev/null
+++ b/tests/net/java/com/android/server/net/ipmemorystore/IpMemoryStoreServiceTest.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2018 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.net.ipmemorystore;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+
+import android.content.Context;
+import android.net.ipmemorystore.Blob;
+import android.net.ipmemorystore.IOnBlobRetrievedListener;
+import android.net.ipmemorystore.IOnNetworkAttributesRetrieved;
+import android.net.ipmemorystore.IOnStatusListener;
+import android.net.ipmemorystore.NetworkAttributes;
+import android.net.ipmemorystore.NetworkAttributesParcelable;
+import android.net.ipmemorystore.Status;
+import android.net.ipmemorystore.StatusParcelable;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.File;
+import java.lang.reflect.Modifier;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/** Unit tests for {@link IpMemoryStoreService}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class IpMemoryStoreServiceTest {
+ private static final String TEST_CLIENT_ID = "testClientId";
+ private static final String TEST_DATA_NAME = "testData";
+
+ @Mock
+ private Context mMockContext;
+ private File mDbFile;
+
+ private IpMemoryStoreService mService;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ final Context context = InstrumentationRegistry.getContext();
+ final File dir = context.getFilesDir();
+ mDbFile = new File(dir, "test.db");
+ doReturn(mDbFile).when(mMockContext).getDatabasePath(anyString());
+ mService = new IpMemoryStoreService(mMockContext);
+ }
+
+ @After
+ public void tearDown() {
+ mService.shutdown();
+ mDbFile.delete();
+ }
+
+ /** Helper method to make a vanilla IOnStatusListener */
+ private IOnStatusListener onStatus(Consumer<Status> functor) {
+ return new IOnStatusListener() {
+ @Override
+ public void onComplete(final StatusParcelable statusParcelable) throws RemoteException {
+ functor.accept(new Status(statusParcelable));
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ };
+ }
+
+ /** Helper method to make an IOnBlobRetrievedListener */
+ private interface OnBlobRetrievedListener {
+ void onBlobRetrieved(Status status, String l2Key, String name, byte[] data);
+ }
+ private IOnBlobRetrievedListener onBlobRetrieved(final OnBlobRetrievedListener functor) {
+ return new IOnBlobRetrievedListener() {
+ @Override
+ public void onBlobRetrieved(final StatusParcelable statusParcelable,
+ final String l2Key, final String name, final Blob blob) throws RemoteException {
+ functor.onBlobRetrieved(new Status(statusParcelable), l2Key, name,
+ null == blob ? null : blob.data);
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ };
+ }
+
+ /** Helper method to make an IOnNetworkAttributesRetrievedListener */
+ private interface OnNetworkAttributesRetrievedListener {
+ void onNetworkAttributesRetrieved(Status status, String l2Key, NetworkAttributes attr);
+ }
+ private IOnNetworkAttributesRetrieved onNetworkAttributesRetrieved(
+ final OnNetworkAttributesRetrievedListener functor) {
+ return new IOnNetworkAttributesRetrieved() {
+ @Override
+ public void onL2KeyResponse(final StatusParcelable status, final String l2Key,
+ final NetworkAttributesParcelable attributes)
+ throws RemoteException {
+ functor.onNetworkAttributesRetrieved(new Status(status), l2Key,
+ null == attributes ? null : new NetworkAttributes(attributes));
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ };
+ }
+
+ // Helper method to factorize some boilerplate
+ private void doLatched(final String timeoutMessage, final Consumer<CountDownLatch> functor) {
+ final CountDownLatch latch = new CountDownLatch(1);
+ functor.accept(latch);
+ try {
+ latch.await(5000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail(timeoutMessage);
+ }
+ }
+
+ @Test
+ public void testNetworkAttributes() {
+ final NetworkAttributes.Builder na = new NetworkAttributes.Builder();
+ try {
+ na.setAssignedV4Address(
+ (Inet4Address) Inet4Address.getByAddress(new byte[]{1, 2, 3, 4}));
+ } catch (UnknownHostException e) { /* Can't happen */ }
+ na.setGroupHint("hint1");
+ na.setMtu(219);
+ final String l2Key = UUID.randomUUID().toString();
+ NetworkAttributes attributes = na.build();
+ doLatched("Did not complete storing attributes", latch ->
+ mService.storeNetworkAttributes(l2Key, attributes.toParcelable(),
+ onStatus(status -> {
+ assertTrue("Store status not successful : " + status.resultCode,
+ status.isSuccess());
+ latch.countDown();
+ })));
+
+ doLatched("Did not complete retrieving attributes", latch ->
+ mService.retrieveNetworkAttributes(l2Key, onNetworkAttributesRetrieved(
+ (status, key, attr) -> {
+ assertTrue("Retrieve network attributes not successful : "
+ + status.resultCode, status.isSuccess());
+ assertEquals(l2Key, key);
+ assertEquals(attributes, attr);
+ latch.countDown();
+ })));
+
+ final NetworkAttributes.Builder na2 = new NetworkAttributes.Builder();
+ try {
+ na.setDnsAddresses(Arrays.asList(
+ new InetAddress[] {Inet6Address.getByName("0A1C:2E40:480A::1CA6")}));
+ } catch (UnknownHostException e) { /* Still can't happen */ }
+ final NetworkAttributes attributes2 = na2.build();
+ doLatched("Did not complete storing attributes 2", latch ->
+ mService.storeNetworkAttributes(l2Key, attributes2.toParcelable(),
+ onStatus(status -> latch.countDown())));
+
+ doLatched("Did not complete retrieving attributes 2", latch ->
+ mService.retrieveNetworkAttributes(l2Key, onNetworkAttributesRetrieved(
+ (status, key, attr) -> {
+ assertTrue("Retrieve network attributes not successful : "
+ + status.resultCode, status.isSuccess());
+ assertEquals(l2Key, key);
+ assertEquals(attributes.assignedV4Address, attr.assignedV4Address);
+ assertEquals(attributes.groupHint, attr.groupHint);
+ assertEquals(attributes.mtu, attr.mtu);
+ assertEquals(attributes2.dnsAddresses, attr.dnsAddresses);
+ latch.countDown();
+ })));
+
+ doLatched("Did not complete retrieving attributes 3", latch ->
+ mService.retrieveNetworkAttributes(l2Key + "nonexistent",
+ onNetworkAttributesRetrieved(
+ (status, key, attr) -> {
+ assertTrue("Retrieve network attributes not successful : "
+ + status.resultCode, status.isSuccess());
+ assertEquals(l2Key + "nonexistent", key);
+ assertNull("Retrieved data not stored", attr);
+ latch.countDown();
+ }
+ )));
+
+ // Verify that this test does not miss any new field added later.
+ // If any field is added to NetworkAttributes it must be tested here for storing
+ // and retrieving.
+ assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields())
+ .filter(f -> !Modifier.isStatic(f.getModifiers())).count());
+ }
+
+ @Test
+ public void testInvalidAttributes() {
+ doLatched("Did not complete storing bad attributes", latch ->
+ mService.storeNetworkAttributes("key", null, onStatus(status -> {
+ assertFalse("Success storing on a null key",
+ status.isSuccess());
+ assertEquals(Status.ERROR_ILLEGAL_ARGUMENT, status.resultCode);
+ latch.countDown();
+ })));
+
+ final NetworkAttributes na = new NetworkAttributes.Builder().setMtu(2).build();
+ doLatched("Did not complete storing bad attributes", latch ->
+ mService.storeNetworkAttributes(null, na.toParcelable(), onStatus(status -> {
+ assertFalse("Success storing null attributes on a null key",
+ status.isSuccess());
+ assertEquals(Status.ERROR_ILLEGAL_ARGUMENT, status.resultCode);
+ latch.countDown();
+ })));
+
+ doLatched("Did not complete storing bad attributes", latch ->
+ mService.storeNetworkAttributes(null, null, onStatus(status -> {
+ assertFalse("Success storing null attributes on a null key",
+ status.isSuccess());
+ assertEquals(Status.ERROR_ILLEGAL_ARGUMENT, status.resultCode);
+ latch.countDown();
+ })));
+
+ doLatched("Did not complete retrieving bad attributes", latch ->
+ mService.retrieveNetworkAttributes(null, onNetworkAttributesRetrieved(
+ (status, key, attr) -> {
+ assertFalse("Success retrieving attributes for a null key",
+ status.isSuccess());
+ assertEquals(Status.ERROR_ILLEGAL_ARGUMENT, status.resultCode);
+ assertNull(key);
+ assertNull(attr);
+ })));
+ }
+
+ @Test
+ public void testPrivateData() {
+ final Blob b = new Blob();
+ b.data = new byte[] { -3, 6, 8, -9, 12, -128, 0, 89, 112, 91, -34 };
+ final String l2Key = UUID.randomUUID().toString();
+ doLatched("Did not complete storing private data", latch ->
+ mService.storeBlob(l2Key, TEST_CLIENT_ID, TEST_DATA_NAME, b,
+ onStatus(status -> {
+ assertTrue("Store status not successful : " + status.resultCode,
+ status.isSuccess());
+ latch.countDown();
+ })));
+
+ doLatched("Did not complete retrieving private data", latch ->
+ mService.retrieveBlob(l2Key, TEST_CLIENT_ID, TEST_DATA_NAME, onBlobRetrieved(
+ (status, key, name, data) -> {
+ assertTrue("Retrieve blob status not successful : " + status.resultCode,
+ status.isSuccess());
+ assertEquals(l2Key, key);
+ assertEquals(name, TEST_DATA_NAME);
+ Arrays.equals(b.data, data);
+ latch.countDown();
+ })));
+
+ // Most puzzling error message ever
+ doLatched("Did not complete retrieving nothing", latch ->
+ mService.retrieveBlob(l2Key, TEST_CLIENT_ID, TEST_DATA_NAME + "2", onBlobRetrieved(
+ (status, key, name, data) -> {
+ assertTrue("Retrieve blob status not successful : " + status.resultCode,
+ status.isSuccess());
+ assertEquals(l2Key, key);
+ assertEquals(name, TEST_DATA_NAME + "2");
+ assertNull(data);
+ latch.countDown();
+ })));
+ }
+
+ @Test
+ public void testFindL2Key() {
+ // TODO : implement this
+ }
+
+ @Test
+ public void testIsSameNetwork() {
+ // TODO : implement this
+ }
+}
diff --git a/tests/net/java/com/android/server/net/ipmemorystore/RelevanceUtilsTests.java b/tests/net/java/com/android/server/net/ipmemorystore/RelevanceUtilsTests.java
new file mode 100644
index 000000000000..8d367e2fc387
--- /dev/null
+++ b/tests/net/java/com/android/server/net/ipmemorystore/RelevanceUtilsTests.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2018 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.net.ipmemorystore;
+
+import static com.android.server.net.ipmemorystore.RelevanceUtils.CAPPED_RELEVANCE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit tests for {@link RelevanceUtils}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RelevanceUtilsTests {
+ @Test
+ public void testComputeRelevanceForTargetDate() {
+ final long dayInMillis = 24L * 60 * 60 * 1000;
+ final long base = 1_000_000L; // any given point in time
+ // Relevance when the network expires in 1000 years must be capped
+ assertEquals(CAPPED_RELEVANCE, RelevanceUtils.computeRelevanceForTargetDate(
+ base + 1000L * dayInMillis, base));
+ // Relevance when expiry is before the date must be 0
+ assertEquals(0, RelevanceUtils.computeRelevanceForTargetDate(base - 1, base));
+ // Make sure the relevance for a given target date is higher if the expiry is further
+ // in the future
+ assertTrue(RelevanceUtils.computeRelevanceForTargetDate(base + 100 * dayInMillis, base)
+ < RelevanceUtils.computeRelevanceForTargetDate(base + 150 * dayInMillis, base));
+
+ // Make sure the relevance falls slower as the expiry is closing in. This is to ensure
+ // the decay is indeed logarithmic.
+ final int relevanceAtExpiry = RelevanceUtils.computeRelevanceForTargetDate(base, base);
+ final int relevance50DaysBeforeExpiry =
+ RelevanceUtils.computeRelevanceForTargetDate(base + 50 * dayInMillis, base);
+ final int relevance100DaysBeforeExpiry =
+ RelevanceUtils.computeRelevanceForTargetDate(base + 100 * dayInMillis, base);
+ final int relevance150DaysBeforeExpiry =
+ RelevanceUtils.computeRelevanceForTargetDate(base + 150 * dayInMillis, base);
+ assertEquals(0, relevanceAtExpiry);
+ assertTrue(relevance50DaysBeforeExpiry - relevanceAtExpiry
+ < relevance100DaysBeforeExpiry - relevance50DaysBeforeExpiry);
+ assertTrue(relevance100DaysBeforeExpiry - relevance50DaysBeforeExpiry
+ < relevance150DaysBeforeExpiry - relevance100DaysBeforeExpiry);
+ }
+
+ @Test
+ public void testIncreaseRelevance() {
+ long expiry = System.currentTimeMillis();
+
+ final long firstBump = RelevanceUtils.bumpExpiryDate(expiry);
+ // Though a few milliseconds might have elapsed, the first bump should push the duration
+ // to days in the future, so unless this test takes literal days between these two lines,
+ // this should always pass.
+ assertTrue(firstBump > expiry);
+
+ expiry = 0;
+ long lastDifference = Long.MAX_VALUE;
+ // The relevance should be capped in at most this many steps. Otherwise, fail.
+ final int steps = 1000;
+ for (int i = 0; i < steps; ++i) {
+ final long newExpiry = RelevanceUtils.bumpExpiryDuration(expiry);
+ if (newExpiry == expiry) {
+ // The relevance should be capped. Make sure it is, then exit without failure.
+ assertEquals(newExpiry, RelevanceUtils.CAPPED_RELEVANCE_LIFETIME_MS);
+ return;
+ }
+ // Make sure the new expiry is further in the future than last time.
+ assertTrue(newExpiry > expiry);
+ // Also check that it was not bumped as much as the last bump, because the
+ // decay must be exponential.
+ assertTrue(newExpiry - expiry < lastDifference);
+ lastDifference = newExpiry - expiry;
+ expiry = newExpiry;
+ }
+ fail("Relevance failed to go to the maximum value after " + steps + " bumps");
+ }
+
+ @Test
+ public void testContinuity() {
+ final long expiry = System.currentTimeMillis();
+
+ // Relevance at expiry and after expiry should be the cap.
+ final int relevanceBeforeMaxLifetime = RelevanceUtils.computeRelevanceForTargetDate(expiry,
+ expiry - (RelevanceUtils.CAPPED_RELEVANCE_LIFETIME_MS + 1_000_000));
+ assertEquals(relevanceBeforeMaxLifetime, CAPPED_RELEVANCE);
+ final int relevanceForMaxLifetime = RelevanceUtils.computeRelevanceForTargetDate(expiry,
+ expiry - RelevanceUtils.CAPPED_RELEVANCE_LIFETIME_MS);
+ assertEquals(relevanceForMaxLifetime, CAPPED_RELEVANCE);
+
+ // If the max relevance is reached at the cap lifetime, one millisecond less than this
+ // should be very close. Strictly speaking this is a bit brittle, but it should be
+ // good enough for the purposes of the memory store.
+ final int relevanceForOneMillisecLessThanCap = RelevanceUtils.computeRelevanceForTargetDate(
+ expiry, expiry - RelevanceUtils.CAPPED_RELEVANCE_LIFETIME_MS + 1);
+ assertTrue(relevanceForOneMillisecLessThanCap <= CAPPED_RELEVANCE);
+ assertTrue(relevanceForOneMillisecLessThanCap >= CAPPED_RELEVANCE - 10);
+
+ // Likewise the relevance one millisecond before expiry should be very close to 0. It's
+ // fine if it rounds down to 0.
+ final int relevanceOneMillisecBeforeExpiry = RelevanceUtils.computeRelevanceForTargetDate(
+ expiry, expiry - 1);
+ assertTrue(relevanceOneMillisecBeforeExpiry <= 10);
+ assertTrue(relevanceOneMillisecBeforeExpiry >= 0);
+
+ final int relevanceAtExpiry = RelevanceUtils.computeRelevanceForTargetDate(expiry, expiry);
+ assertEquals(relevanceAtExpiry, 0);
+ final int relevanceAfterExpiry = RelevanceUtils.computeRelevanceForTargetDate(expiry,
+ expiry + 1_000_000);
+ assertEquals(relevanceAfterExpiry, 0);
+ }
+
+ // testIncreaseRelevance makes sure bumping the expiry continuously always yields a
+ // monotonically increasing date as a side effect, but this tests that the relevance (as
+ // opposed to the expiry date) increases monotonically with increasing periods.
+ @Test
+ public void testMonotonicity() {
+ // Hopefully the relevance is granular enough to give a different value for every one
+ // of this number of steps.
+ final int steps = 40;
+ final long expiry = System.currentTimeMillis();
+
+ int lastRelevance = -1;
+ for (int i = 0; i < steps; ++i) {
+ final long date = expiry - i * (RelevanceUtils.CAPPED_RELEVANCE_LIFETIME_MS / steps);
+ final int relevance = RelevanceUtils.computeRelevanceForTargetDate(expiry, date);
+ assertTrue(relevance > lastRelevance);
+ lastRelevance = relevance;
+ }
+ }
+}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index c42a8889e373..7783e108f674 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -58,6 +58,7 @@ cc_defaults {
"libprotobuf-cpp-lite",
"libz",
],
+ stl: "libc++_static",
group_static_libs: true,
}
@@ -114,6 +115,7 @@ cc_library_host_static {
"optimize/MultiApkGenerator.cpp",
"optimize/ResourceDeduper.cpp",
"optimize/ResourceFilter.cpp",
+ "optimize/ResourcePathShortener.cpp",
"optimize/VersionCollapser.cpp",
"process/SymbolTable.cpp",
"split/TableSplitter.cpp",
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index b353ff00a23f..45719ef474cd 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -223,8 +223,17 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
io::IFile* file = iterator->Next();
std::string path = file->GetSource().path;
+ std::string output_path = path;
+ bool is_resource = path.find("res/") == 0;
+ if (is_resource) {
+ auto it = options.shortened_path_map.find(path);
+ if (it != options.shortened_path_map.end()) {
+ output_path = it->second;
+ }
+ }
+
// Skip resources that are not referenced if requested.
- if (path.find("res/") == 0 && referenced_resources.find(path) == referenced_resources.end()) {
+ if (is_resource && referenced_resources.find(output_path) == referenced_resources.end()) {
if (context->IsVerbose()) {
context->GetDiagnostics()->Note(DiagMessage()
<< "Removing resource '" << path << "' from APK.");
@@ -283,7 +292,8 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
return false;
}
} else {
- if (!io::CopyFileToArchivePreserveCompression(context, file, path, writer)) {
+ if (!io::CopyFileToArchivePreserveCompression(
+ context, file, output_path, writer)) {
return false;
}
}
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 58702dc465cc..2f8ca2d62061 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -714,7 +714,8 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser,
}
}
- diag_->Warn(DiagMessage(out_resource->source)
+ // If the resource type was not recognized, write the error and return false.
+ diag_->Error(DiagMessage(out_resource->source)
<< "unknown resource type '" << parser->element_name() << "'");
return false;
}
@@ -1164,8 +1165,6 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource
current_policies |= OverlayableItem::Policy::kPublic;
} else if (trimmed_part == "product") {
current_policies |= OverlayableItem::Policy::kProduct;
- } else if (trimmed_part == "product_services") {
- current_policies |= OverlayableItem::Policy::kProductServices;
} else if (trimmed_part == "system") {
current_policies |= OverlayableItem::Policy::kSystem;
} else if (trimmed_part == "vendor") {
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index debca9c1e1ba..827c7deaf452 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -935,9 +935,6 @@ TEST_F(ResourceParserTest, ParseOverlayablePolicy) {
<policy type="product">
<item type="string" name="bar" />
</policy>
- <policy type="product_services">
- <item type="string" name="baz" />
- </policy>
<policy type="system">
<item type="string" name="fiz" />
</policy>
@@ -966,14 +963,6 @@ TEST_F(ResourceParserTest, ParseOverlayablePolicy) {
EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name"));
EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kProduct));
- search_result = table_.FindResource(test::ParseNameOrDie("string/baz"));
- ASSERT_TRUE(search_result);
- ASSERT_THAT(search_result.value().entry, NotNull());
- ASSERT_TRUE(search_result.value().entry->overlayable_item);
- result_overlayable_item = search_result.value().entry->overlayable_item.value();
- EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name"));
- EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kProductServices));
-
search_result = table_.FindResource(test::ParseNameOrDie("string/fiz"));
ASSERT_TRUE(search_result);
ASSERT_THAT(search_result.value().entry, NotNull());
@@ -1028,7 +1017,7 @@ TEST_F(ResourceParserTest, ParseOverlayableBadPolicyError) {
TEST_F(ResourceParserTest, ParseOverlayableMultiplePolicy) {
std::string input = R"(
<overlayable name="Name">
- <policy type="vendor|product_services">
+ <policy type="vendor|public">
<item type="string" name="foo" />
</policy>
<policy type="product|system">
@@ -1044,7 +1033,7 @@ TEST_F(ResourceParserTest, ParseOverlayableMultiplePolicy) {
OverlayableItem result_overlayable_item = search_result.value().entry->overlayable_item.value();
EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name"));
EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kVendor
- | OverlayableItem::Policy::kProductServices));
+ | OverlayableItem::Policy::kPublic));
search_result = table_.FindResource(test::ParseNameOrDie("string/bar"));
ASSERT_TRUE(search_result);
@@ -1139,7 +1128,7 @@ TEST_F(ResourceParserTest, NestPolicyInOverlayableError) {
std::string input = R"(
<overlayable name="Name">
<policy type="vendor|product">
- <policy type="product_services">
+ <policy type="public">
<item type="string" name="foo" />
</policy>
</policy>
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index eaf6a47a15fd..7ca99ea42b50 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -92,9 +92,6 @@ struct OverlayableItem {
// The resource can be overlaid by any overlay on the product partition.
kProduct = 0x08,
-
- // The resource can be overlaid by any overlay on the product services partition.
- kProductServices = 0x10
};
std::shared_ptr<Overlayable> overlayable;
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index a733134f123c..b97dc6b205ca 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -248,7 +248,7 @@ TEST(ResourceTableTest, SetOverlayable) {
Source("res/values/overlayable.xml", 40));
OverlayableItem overlayable_item(overlayable);
overlayable_item.policies |= OverlayableItem::Policy::kProduct;
- overlayable_item.policies |= OverlayableItem::Policy::kProductServices;
+ overlayable_item.policies |= OverlayableItem::Policy::kVendor;
overlayable_item.comment = "comment";
overlayable_item.source = Source("res/values/overlayable.xml", 42);
@@ -265,7 +265,7 @@ TEST(ResourceTableTest, SetOverlayable) {
EXPECT_THAT(result_overlayable_item.overlayable->source.path, Eq("res/values/overlayable.xml"));
EXPECT_THAT(result_overlayable_item.overlayable->source.line, 40);
EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kProduct
- | OverlayableItem::Policy::kProductServices));
+ | OverlayableItem::Policy::kVendor));
ASSERT_THAT(result_overlayable_item.comment, StrEq("comment"));
EXPECT_THAT(result_overlayable_item.source.path, Eq("res/values/overlayable.xml"));
EXPECT_THAT(result_overlayable_item.source.line, 42);
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index c6f91527c91c..ab4805f626a5 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -16,6 +16,7 @@
#include "ResourceUtils.h"
+#include <algorithm>
#include <sstream>
#include "android-base/stringprintf.h"
@@ -503,6 +504,14 @@ Maybe<int> ParseSdkVersion(const StringPiece& str) {
if (entry.first == trimmed_str) {
return entry.second;
}
+
+ // Try parsing codename from "[codename].[preview_sdk_fingerprint]" value.
+ const StringPiece::const_iterator begin = std::begin(trimmed_str);
+ const StringPiece::const_iterator end = std::end(trimmed_str);
+ const StringPiece::const_iterator codename_end = std::find(begin, end, '.');
+ if (codename_end != end && entry.first == trimmed_str.substr(begin, codename_end)) {
+ return entry.second;
+ }
return {};
}
diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp
index 5ce464074335..9018b0fc372a 100644
--- a/tools/aapt2/ResourceUtils_test.cpp
+++ b/tools/aapt2/ResourceUtils_test.cpp
@@ -16,6 +16,7 @@
#include "ResourceUtils.h"
+#include "SdkConstants.h"
#include "Resource.h"
#include "test/Test.h"
@@ -212,6 +213,17 @@ TEST(ResourceUtilsTest, ItemsWithWhitespaceAreParsedCorrectly) {
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened))));
}
+TEST(ResourceUtilsTest, ParseSdkVersionWithCodename) {
+ const android::StringPiece codename =
+ GetDevelopmentSdkCodeNameAndVersion().first;
+ const int version = GetDevelopmentSdkCodeNameAndVersion().second;
+
+ EXPECT_THAT(ResourceUtils::ParseSdkVersion(codename), Eq(Maybe<int>(version)));
+ EXPECT_THAT(
+ ResourceUtils::ParseSdkVersion(codename.to_string() + ".fingerprint"),
+ Eq(Maybe<int>(version)));
+}
+
TEST(ResourceUtilsTest, StringBuilderWhitespaceRemoval) {
EXPECT_THAT(ResourceUtils::StringBuilder()
.AppendText(" hey guys ")
diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto
index da541be9502b..73b568e77689 100644
--- a/tools/aapt2/Resources.proto
+++ b/tools/aapt2/Resources.proto
@@ -155,7 +155,6 @@ message OverlayableItem {
SYSTEM = 1;
VENDOR = 2;
PRODUCT = 3;
- PRODUCT_SERVICES = 4;
}
// The location of the <item> declaration in source.
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 52375a39b93f..92beb4eb7ce4 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -701,7 +701,10 @@ int Compile(IAaptContext* context, io::IFileCollection* inputs, IArchiveWriter*
}
const std::string out_path = BuildIntermediateContainerFilename(path_data);
- error |= !compile_func(context, options, path_data, file, output_writer, out_path);
+ if (!compile_func(context, options, path_data, file, output_writer, out_path)) {
+ context->GetDiagnostics()->Error(DiagMessage(file->GetSource()) << "file failed to compile");
+ error = true;
+ }
}
return error ? 1 : 0;
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index 328b0beda372..2e6af18c1948 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -41,6 +41,7 @@
#include "optimize/MultiApkGenerator.h"
#include "optimize/ResourceDeduper.h"
#include "optimize/ResourceFilter.h"
+#include "optimize/ResourcePathShortener.h"
#include "optimize/VersionCollapser.h"
#include "split/TableSplitter.h"
#include "util/Files.h"
@@ -52,6 +53,7 @@ using ::android::ConfigDescription;
using ::android::ResTable_config;
using ::android::StringPiece;
using ::android::base::ReadFileToString;
+using ::android::base::WriteStringToFile;
using ::android::base::StringAppendF;
using ::android::base::StringPrintf;
@@ -143,6 +145,21 @@ class Optimizer {
return 1;
}
+ if (options_.shorten_resource_paths) {
+ ResourcePathShortener shortener(options_.table_flattener_options.shortened_path_map);
+ if (!shortener.Consume(context_, apk->GetResourceTable())) {
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed shortening resource paths");
+ return 1;
+ }
+ if (options_.shortened_paths_map_path
+ && !WriteShortenedPathsMap(options_.table_flattener_options.shortened_path_map,
+ options_.shortened_paths_map_path.value())) {
+ context_->GetDiagnostics()->Error(DiagMessage()
+ << "failed to write shortened resource paths to file");
+ return 1;
+ }
+ }
+
// Adjust the SplitConstraints so that their SDK version is stripped if it is less than or
// equal to the minSdk.
options_.split_constraints =
@@ -264,6 +281,15 @@ class Optimizer {
ArchiveEntry::kAlign, writer);
}
+ bool WriteShortenedPathsMap(const std::map<std::string, std::string> &path_map,
+ const std::string &file_path) {
+ std::stringstream ss;
+ for (auto it = path_map.cbegin(); it != path_map.cend(); ++it) {
+ ss << it->first << " -> " << it->second << "\n";
+ }
+ return WriteStringToFile(ss.str(), file_path);
+ }
+
OptimizeOptions options_;
OptimizeContext* context_;
};
diff --git a/tools/aapt2/cmd/Optimize.h b/tools/aapt2/cmd/Optimize.h
index d07305bc3e04..7f4a3ed85364 100644
--- a/tools/aapt2/cmd/Optimize.h
+++ b/tools/aapt2/cmd/Optimize.h
@@ -55,6 +55,12 @@ struct OptimizeOptions {
// Set of artifacts to keep when generating multi-APK splits. If the list is empty, all artifacts
// are kept and will be written as output.
std::unordered_set<std::string> kept_artifacts;
+
+ // Whether or not to shorten resource paths in the APK.
+ bool shorten_resource_paths;
+
+ // Path to the output map of original resource paths to shortened paths.
+ Maybe<std::string> shortened_paths_map_path;
};
class OptimizeCommand : public Command {
@@ -101,6 +107,12 @@ class OptimizeCommand : public Command {
AddOptionalSwitch("--enable-resource-obfuscation",
"Enables obfuscation of key string pool to single value",
&options_.table_flattener_options.collapse_key_stringpool);
+ AddOptionalSwitch("--enable-resource-path-shortening",
+ "Enables shortening of the path of the resources inside the APK.",
+ &options_.shorten_resource_paths);
+ AddOptionalFlag("--resource-path-shortening-map",
+ "Path to output the map of old resource paths to shortened paths.",
+ &options_.shortened_paths_map_path);
AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
}
@@ -109,6 +121,9 @@ class OptimizeCommand : public Command {
private:
OptimizeOptions options_;
+ bool WriteObfuscatedPathsMap(const std::map<std::string, std::string> &path_map,
+ const std::string &file_path);
+
Maybe<std::string> config_path_;
Maybe<std::string> whitelist_path_;
Maybe<std::string> resources_config_path_;
@@ -122,4 +137,4 @@ class OptimizeCommand : public Command {
}// namespace aapt
-#endif //AAPT2_OPTIMIZE_H \ No newline at end of file
+#endif //AAPT2_OPTIMIZE_H
diff --git a/tools/aapt2/format/binary/BinaryResourceParser.cpp b/tools/aapt2/format/binary/BinaryResourceParser.cpp
index c496ff0e159b..40aaa05c2b30 100644
--- a/tools/aapt2/format/binary/BinaryResourceParser.cpp
+++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp
@@ -42,6 +42,19 @@ namespace aapt {
namespace {
+static std::u16string strcpy16_dtoh(const char16_t* src, size_t len) {
+ size_t utf16_len = strnlen16(src, len);
+ if (utf16_len == 0) {
+ return {};
+ }
+ std::u16string dst;
+ dst.resize(utf16_len);
+ for (size_t i = 0; i < utf16_len; i++) {
+ dst[i] = util::DeviceToHost16(src[i]);
+ }
+ return dst;
+}
+
// Visitor that converts a reference's resource ID to a resource name, given a mapping from
// resource ID to resource name.
class ReferenceIdToNameVisitor : public DescendingValueVisitor {
@@ -176,12 +189,8 @@ bool BinaryResourceParser::ParsePackage(const ResChunk_header* chunk) {
}
// Extract the package name.
- size_t len = strnlen16((const char16_t*)package_header->name, arraysize(package_header->name));
- std::u16string package_name;
- package_name.resize(len);
- for (size_t i = 0; i < len; i++) {
- package_name[i] = util::DeviceToHost16(package_header->name[i]);
- }
+ std::u16string package_name = strcpy16_dtoh((const char16_t*)package_header->name,
+ arraysize(package_header->name));
ResourceTablePackage* package =
table_->CreatePackage(util::Utf16ToUtf8(package_name), static_cast<uint8_t>(package_id));
@@ -435,6 +444,11 @@ bool BinaryResourceParser::ParseOverlayable(const ResChunk_header* chunk) {
}
auto overlayable = std::make_shared<Overlayable>();
+ overlayable->name = util::Utf16ToUtf8(strcpy16_dtoh((const char16_t*)header->name,
+ arraysize(header->name)));
+ overlayable->actor = util::Utf16ToUtf8(strcpy16_dtoh((const char16_t*)header->actor,
+ arraysize(header->name)));
+ overlayable->source = source_.WithLine(0);
ResChunkPullParser parser(GetChunkData(chunk),
GetChunkDataLen(chunk));
@@ -459,10 +473,6 @@ bool BinaryResourceParser::ParseOverlayable(const ResChunk_header* chunk) {
& ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION) {
policies |= OverlayableItem::Policy::kProduct;
}
- if (policy_header->policy_flags
- & ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION) {
- policies |= OverlayableItem::Policy::kProductServices;
- }
const ResTable_ref* const ref_begin = reinterpret_cast<const ResTable_ref*>(
((uint8_t *)policy_header) + util::DeviceToHost32(policy_header->header.headerSize));
diff --git a/tools/aapt2/format/binary/TableFlattener.cpp b/tools/aapt2/format/binary/TableFlattener.cpp
index 931d57b1c08a..9d341cc1ca4a 100644
--- a/tools/aapt2/format/binary/TableFlattener.cpp
+++ b/tools/aapt2/format/binary/TableFlattener.cpp
@@ -217,9 +217,10 @@ class MapFlattenVisitor : public ValueVisitor {
size_t entry_count_ = 0;
};
-struct PolicyChunk {
- uint32_t policy_flags;
- std::set<ResourceId> ids;
+struct OverlayableChunk {
+ std::string actor;
+ Source source;
+ std::map<OverlayableItem::PolicyFlags, std::set<ResourceId>> policy_ids;
};
class PackageFlattener {
@@ -421,8 +422,9 @@ class PackageFlattener {
return sorted_entries;
}
- void FlattenOverlayable(BigBuffer* buffer) {
- std::vector<PolicyChunk> policies;
+ bool FlattenOverlayable(BigBuffer* buffer) {
+ std::set<ResourceId> seen_ids;
+ std::map<std::string, OverlayableChunk> overlayable_chunks;
CHECK(bool(package_->id)) << "package must have an ID set when flattening <overlayable>";
for (auto& type : package_->types) {
@@ -433,79 +435,116 @@ class PackageFlattener {
continue;
}
- OverlayableItem& overlayable = entry->overlayable_item.value();
- uint32_t policy_flags = OverlayableItem::Policy::kNone;
- if (overlayable.policies & OverlayableItem::Policy::kPublic) {
- policy_flags |= ResTable_overlayable_policy_header::POLICY_PUBLIC;
- }
- if (overlayable.policies & OverlayableItem::Policy::kSystem) {
- policy_flags |= ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION;
- }
- if (overlayable.policies & OverlayableItem::Policy::kVendor) {
- policy_flags |= ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION;
- }
- if (overlayable.policies & OverlayableItem::Policy::kProduct) {
- policy_flags |= ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION;
- }
- if (overlayable.policies & OverlayableItem::Policy::kProductServices) {
- policy_flags |= ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION;
+ OverlayableItem& item = entry->overlayable_item.value();
+
+ // Resource ids should only appear once in the resource table
+ ResourceId id = android::make_resid(package_->id.value(), type->id.value(),
+ entry->id.value());
+ CHECK(seen_ids.find(id) == seen_ids.end())
+ << "multiple overlayable definitions found for resource "
+ << ResourceName(package_->name, type->type, entry->name).to_string();
+ seen_ids.insert(id);
+
+ // Find the overlayable chunk with the specified name
+ OverlayableChunk* overlayable_chunk = nullptr;
+ auto iter = overlayable_chunks.find(item.overlayable->name);
+ if (iter == overlayable_chunks.end()) {
+ OverlayableChunk chunk{item.overlayable->actor, item.overlayable->source};
+ overlayable_chunk =
+ &overlayable_chunks.insert({item.overlayable->name, chunk}).first->second;
+ } else {
+ OverlayableChunk& chunk = iter->second;
+ if (!(chunk.source == item.overlayable->source)) {
+ // The name of an overlayable set of resources must be unique
+ context_->GetDiagnostics()->Error(DiagMessage(item.overlayable->source)
+ << "duplicate overlayable name"
+ << item.overlayable->name << "'");
+ context_->GetDiagnostics()->Error(DiagMessage(chunk.source)
+ << "previous declaration here");
+ return false;
+ }
+
+ CHECK(chunk.actor == item.overlayable->actor);
+ overlayable_chunk = &chunk;
}
- if (overlayable.policies == OverlayableItem::Policy::kNone) {
+ uint32_t policy_flags = 0;
+ if (item.policies == OverlayableItem::Policy::kNone) {
// Encode overlayable entries defined without a policy as publicly overlayable
policy_flags |= ResTable_overlayable_policy_header::POLICY_PUBLIC;
- }
-
- // Find the overlayable policy chunk with the same policies as the entry
- PolicyChunk* policy_chunk = nullptr;
- for (PolicyChunk& policy : policies) {
- if (policy.policy_flags == policy_flags) {
- policy_chunk = &policy;
- break;
+ } else {
+ if (item.policies & OverlayableItem::Policy::kPublic) {
+ policy_flags |= ResTable_overlayable_policy_header::POLICY_PUBLIC;
+ }
+ if (item.policies & OverlayableItem::Policy::kSystem) {
+ policy_flags |= ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION;
+ }
+ if (item.policies & OverlayableItem::Policy::kVendor) {
+ policy_flags |= ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION;
+ }
+ if (item.policies & OverlayableItem::Policy::kProduct) {
+ policy_flags |= ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION;
}
}
- // Create a new policy chunk if an existing one with the same policy cannot be found
- if (policy_chunk == nullptr) {
- PolicyChunk p;
- p.policy_flags = policy_flags;
- policies.push_back(p);
- policy_chunk = &policies.back();
+ auto policy = overlayable_chunk->policy_ids.find(policy_flags);
+ if (policy != overlayable_chunk->policy_ids.end()) {
+ policy->second.insert(id);
+ } else {
+ overlayable_chunk->policy_ids.insert(
+ std::make_pair(policy_flags, std::set<ResourceId>{id}));
}
-
- policy_chunk->ids.insert(android::make_resid(package_->id.value(), type->id.value(),
- entry->id.value()));
}
}
- if (policies.empty()) {
- // Only write the overlayable chunk if the APK has overlayable entries
- return;
- }
-
- ChunkWriter writer(buffer);
- writer.StartChunk<ResTable_overlayable_header>(RES_TABLE_OVERLAYABLE_TYPE);
-
- // Write each policy block for the overlayable
- for (PolicyChunk& policy : policies) {
- ChunkWriter policy_writer(buffer);
- ResTable_overlayable_policy_header* policy_type =
- policy_writer.StartChunk<ResTable_overlayable_policy_header>(
- RES_TABLE_OVERLAYABLE_POLICY_TYPE);
- policy_type->policy_flags = util::HostToDevice32(policy.policy_flags);
- policy_type->entry_count = util::HostToDevice32(static_cast<uint32_t>(policy.ids.size()));
-
- // Write the ids after the policy header
- ResTable_ref* id_block = policy_writer.NextBlock<ResTable_ref>(policy.ids.size());
- for (const ResourceId& id : policy.ids) {
- id_block->ident = util::HostToDevice32(id.id);
- id_block++;
+ for (auto& overlayable_pair : overlayable_chunks) {
+ std::string name = overlayable_pair.first;
+ OverlayableChunk& overlayable = overlayable_pair.second;
+
+ // Write the header of the overlayable chunk
+ ChunkWriter overlayable_writer(buffer);
+ auto* overlayable_type =
+ overlayable_writer.StartChunk<ResTable_overlayable_header>(RES_TABLE_OVERLAYABLE_TYPE);
+ if (name.size() >= arraysize(overlayable_type->name)) {
+ diag_->Error(DiagMessage() << "overlayable name '" << name
+ << "' exceeds maximum length ("
+ << arraysize(overlayable_type->name)
+ << " utf16 characters)");
+ return false;
}
-
- policy_writer.Finish();
+ strcpy16_htod(overlayable_type->name, arraysize(overlayable_type->name),
+ util::Utf8ToUtf16(name));
+
+ if (overlayable.actor.size() >= arraysize(overlayable_type->actor)) {
+ diag_->Error(DiagMessage() << "overlayable name '" << overlayable.actor
+ << "' exceeds maximum length ("
+ << arraysize(overlayable_type->actor)
+ << " utf16 characters)");
+ return false;
+ }
+ strcpy16_htod(overlayable_type->actor, arraysize(overlayable_type->actor),
+ util::Utf8ToUtf16(overlayable.actor));
+
+ // Write each policy block for the overlayable
+ for (auto& policy_ids : overlayable.policy_ids) {
+ ChunkWriter policy_writer(buffer);
+ auto* policy_type = policy_writer.StartChunk<ResTable_overlayable_policy_header>(
+ RES_TABLE_OVERLAYABLE_POLICY_TYPE);
+ policy_type->policy_flags = util::HostToDevice32(static_cast<uint32_t>(policy_ids.first));
+ policy_type->entry_count = util::HostToDevice32(static_cast<uint32_t>(
+ policy_ids.second.size()));
+ // Write the ids after the policy header
+ auto* id_block = policy_writer.NextBlock<ResTable_ref>(policy_ids.second.size());
+ for (const ResourceId& id : policy_ids.second) {
+ id_block->ident = util::HostToDevice32(id.id);
+ id_block++;
+ }
+ policy_writer.Finish();
+ }
+ overlayable_writer.Finish();
}
- writer.Finish();
+ return true;
}
bool FlattenTypeSpec(ResourceTableType* type, std::vector<ResourceEntry*>* sorted_entries,
diff --git a/tools/aapt2/format/binary/TableFlattener.h b/tools/aapt2/format/binary/TableFlattener.h
index 635cb21f514c..71330e3fb74f 100644
--- a/tools/aapt2/format/binary/TableFlattener.h
+++ b/tools/aapt2/format/binary/TableFlattener.h
@@ -46,6 +46,9 @@ struct TableFlattenerOptions {
// When true, sort the entries in the values string pool by priority and configuration.
bool sort_stringpool_entries = true;
+
+ // Map from original resource paths to shortened resource paths.
+ std::map<std::string, std::string> shortened_path_map;
};
class TableFlattener : public IResourceTableConsumer {
diff --git a/tools/aapt2/format/binary/TableFlattener_test.cpp b/tools/aapt2/format/binary/TableFlattener_test.cpp
index a5fb6fd6d7aa..ddc117399390 100644
--- a/tools/aapt2/format/binary/TableFlattener_test.cpp
+++ b/tools/aapt2/format/binary/TableFlattener_test.cpp
@@ -657,36 +657,34 @@ TEST_F(TableFlattenerTest, FlattenOverlayable) {
TEST_F(TableFlattenerTest, FlattenMultipleOverlayablePolicies) {
auto overlayable = std::make_shared<Overlayable>("TestName", "overlay://theme");
std::string name_zero = "com.app.test:integer/overlayable_zero_item";
- OverlayableItem overlayable_zero_item(overlayable);
- overlayable_zero_item.policies |= OverlayableItem::Policy::kProduct;
- overlayable_zero_item.policies |= OverlayableItem::Policy::kSystem;
- overlayable_zero_item.policies |= OverlayableItem::Policy::kProductServices;
+ OverlayableItem overlayable_item_zero(overlayable);
+ overlayable_item_zero.policies |= OverlayableItem::Policy::kProduct;
+ overlayable_item_zero.policies |= OverlayableItem::Policy::kSystem;
std::string name_one = "com.app.test:integer/overlayable_one_item";
- OverlayableItem overlayable_one_item(overlayable);
- overlayable_one_item.policies |= OverlayableItem::Policy::kPublic;
- overlayable_one_item.policies |= OverlayableItem::Policy::kProductServices;
+ OverlayableItem overlayable_item_one(overlayable);
+ overlayable_item_one.policies |= OverlayableItem::Policy::kPublic;
std::string name_two = "com.app.test:integer/overlayable_two_item";
- OverlayableItem overlayable_two_item(overlayable);
- overlayable_two_item.policies |= OverlayableItem::Policy::kProduct;
- overlayable_two_item.policies |= OverlayableItem::Policy::kSystem;
- overlayable_two_item.policies |= OverlayableItem::Policy::kVendor;
+ OverlayableItem overlayable_item_two(overlayable);
+ overlayable_item_two.policies |= OverlayableItem::Policy::kProduct;
+ overlayable_item_two.policies |= OverlayableItem::Policy::kSystem;
+ overlayable_item_two.policies |= OverlayableItem::Policy::kVendor;
std::string name_three = "com.app.test:integer/overlayable_three_item";
- OverlayableItem overlayable_three_item(overlayable);
+ OverlayableItem overlayable_item_three(overlayable);
std::unique_ptr<ResourceTable> table =
test::ResourceTableBuilder()
.SetPackageId("com.app.test", 0x7f)
.AddSimple(name_zero, ResourceId(0x7f020000))
- .SetOverlayable(name_zero, overlayable_zero_item)
+ .SetOverlayable(name_zero, overlayable_item_zero)
.AddSimple(name_one, ResourceId(0x7f020001))
- .SetOverlayable(name_one, overlayable_one_item)
+ .SetOverlayable(name_one, overlayable_item_one)
.AddSimple(name_two, ResourceId(0x7f020002))
- .SetOverlayable(name_two, overlayable_two_item)
+ .SetOverlayable(name_two, overlayable_item_two)
.AddSimple(name_three, ResourceId(0x7f020003))
- .SetOverlayable(name_three, overlayable_three_item)
+ .SetOverlayable(name_three, overlayable_item_three)
.Build();
ResourceTable output_table;
@@ -698,16 +696,14 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayablePolicies) {
ASSERT_TRUE(search_result.value().entry->overlayable_item);
OverlayableItem& overlayable_item = search_result.value().entry->overlayable_item.value();
EXPECT_EQ(overlayable_item.policies, OverlayableItem::Policy::kSystem
- | OverlayableItem::Policy::kProduct
- | OverlayableItem::Policy::kProductServices);
+ | OverlayableItem::Policy::kProduct);
search_result = output_table.FindResource(test::ParseNameOrDie(name_one));
ASSERT_TRUE(search_result);
ASSERT_THAT(search_result.value().entry, NotNull());
ASSERT_TRUE(search_result.value().entry->overlayable_item);
overlayable_item = search_result.value().entry->overlayable_item.value();
- EXPECT_EQ(overlayable_item.policies, OverlayableItem::Policy::kPublic
- | OverlayableItem::Policy::kProductServices);
+ EXPECT_EQ(overlayable_item.policies, OverlayableItem::Policy::kPublic);
search_result = output_table.FindResource(test::ParseNameOrDie(name_two));
ASSERT_TRUE(search_result);
@@ -724,6 +720,80 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayablePolicies) {
ASSERT_TRUE(search_result.value().entry->overlayable_item);
overlayable_item = search_result.value().entry->overlayable_item.value();
EXPECT_EQ(overlayable_item.policies, OverlayableItem::Policy::kPublic);
+ EXPECT_EQ(overlayable_item.overlayable->name, "TestName");
+ EXPECT_EQ(overlayable_item.overlayable->actor, "overlay://theme");
+ EXPECT_EQ(overlayable_item.policies, OverlayableItem::Policy::kPublic);
+}
+
+TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) {
+ auto group = std::make_shared<Overlayable>("TestName", "overlay://theme");
+ std::string name_zero = "com.app.test:integer/overlayable_zero";
+ OverlayableItem overlayable_item_zero(group);
+ overlayable_item_zero.policies |= OverlayableItem::Policy::kProduct;
+ overlayable_item_zero.policies |= OverlayableItem::Policy::kSystem;
+
+ auto group_one = std::make_shared<Overlayable>("OtherName", "overlay://customization");
+ std::string name_one = "com.app.test:integer/overlayable_one";
+ OverlayableItem overlayable_item_one(group_one);
+ overlayable_item_one.policies |= OverlayableItem::Policy::kPublic;
+
+ std::string name_two = "com.app.test:integer/overlayable_two";
+ OverlayableItem overlayable_item_two(group);
+ overlayable_item_two.policies |= OverlayableItem::Policy::kProduct;
+ overlayable_item_two.policies |= OverlayableItem::Policy::kSystem;
+ overlayable_item_two.policies |= OverlayableItem::Policy::kVendor;
+
+ std::string name_three = "com.app.test:integer/overlayable_three";
+ OverlayableItem overlayable_item_three(group_one);
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("com.app.test", 0x7f)
+ .AddSimple(name_zero, ResourceId(0x7f020000))
+ .SetOverlayable(name_zero, overlayable_item_zero)
+ .AddSimple(name_one, ResourceId(0x7f020001))
+ .SetOverlayable(name_one, overlayable_item_one)
+ .AddSimple(name_two, ResourceId(0x7f020002))
+ .SetOverlayable(name_two, overlayable_item_two)
+ .AddSimple(name_three, ResourceId(0x7f020003))
+ .SetOverlayable(name_three, overlayable_item_three)
+ .Build();
+ ResourceTable output_table;
+ ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &output_table));
+ auto search_result = output_table.FindResource(test::ParseNameOrDie(name_zero));
+ ASSERT_TRUE(search_result);
+ ASSERT_THAT(search_result.value().entry, NotNull());
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ OverlayableItem& result_overlayable = search_result.value().entry->overlayable_item.value();
+ EXPECT_EQ(result_overlayable.overlayable->name, "TestName");
+ EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://theme");
+ EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kSystem
+ | OverlayableItem::Policy::kProduct);
+ search_result = output_table.FindResource(test::ParseNameOrDie(name_one));
+ ASSERT_TRUE(search_result);
+ ASSERT_THAT(search_result.value().entry, NotNull());
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ result_overlayable = search_result.value().entry->overlayable_item.value();
+ EXPECT_EQ(result_overlayable.overlayable->name, "OtherName");
+ EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://customization");
+ EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kPublic);
+ search_result = output_table.FindResource(test::ParseNameOrDie(name_two));
+ ASSERT_TRUE(search_result);
+ ASSERT_THAT(search_result.value().entry, NotNull());
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ result_overlayable = search_result.value().entry->overlayable_item.value();
+ EXPECT_EQ(result_overlayable.overlayable->name, "TestName");
+ EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://theme");
+ EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kSystem
+ | OverlayableItem::Policy::kProduct
+ | OverlayableItem::Policy::kVendor);
+ search_result = output_table.FindResource(test::ParseNameOrDie(name_three));
+ ASSERT_TRUE(search_result);
+ ASSERT_THAT(search_result.value().entry, NotNull());
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ result_overlayable = search_result.value().entry->overlayable_item.value();
+ EXPECT_EQ(result_overlayable.overlayable->name, "OtherName");
+ EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://customization");
+ EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kPublic);
}
} // namespace aapt
diff --git a/tools/aapt2/format/proto/ProtoDeserialize.cpp b/tools/aapt2/format/proto/ProtoDeserialize.cpp
index 6b5746d63bf8..aff1b391f861 100644
--- a/tools/aapt2/format/proto/ProtoDeserialize.cpp
+++ b/tools/aapt2/format/proto/ProtoDeserialize.cpp
@@ -390,9 +390,6 @@ bool DeserializeOverlayableItemFromPb(const pb::OverlayableItem& pb_overlayable,
case pb::OverlayableItem::PRODUCT:
out_overlayable->policies |= OverlayableItem::Policy::kProduct;
break;
- case pb::OverlayableItem::PRODUCT_SERVICES:
- out_overlayable->policies |= OverlayableItem::Policy::kProductServices;
- break;
default:
*out_error = "unknown overlayable policy";
return false;
diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp
index 76fbb464b62a..b549e2369f98 100644
--- a/tools/aapt2/format/proto/ProtoSerialize.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize.cpp
@@ -303,9 +303,6 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item
if (overlayable_item.policies & OverlayableItem::Policy::kProduct) {
pb_overlayable_item->add_policy(pb::OverlayableItem::PRODUCT);
}
- if (overlayable_item.policies & OverlayableItem::Policy::kProductServices) {
- pb_overlayable_item->add_policy(pb::OverlayableItem::PRODUCT_SERVICES);
- }
if (overlayable_item.policies & OverlayableItem::Policy::kSystem) {
pb_overlayable_item->add_policy(pb::OverlayableItem::SYSTEM);
}
diff --git a/tools/aapt2/format/proto/ProtoSerialize_test.cpp b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
index 4a3c1b86236e..cce3939704cf 100644
--- a/tools/aapt2/format/proto/ProtoSerialize_test.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
@@ -519,7 +519,7 @@ TEST(ProtoSerializeTest, SerializeAndDeserializeOverlayable) {
OverlayableItem overlayable_item_bar(std::make_shared<Overlayable>(
"TaskBar", "overlay://theme"));
- overlayable_item_bar.policies |= OverlayableItem::Policy::kProductServices;
+ overlayable_item_bar.policies |= OverlayableItem::Policy::kPublic;
overlayable_item_bar.policies |= OverlayableItem::Policy::kVendor;
OverlayableItem overlayable_item_baz(std::make_shared<Overlayable>(
@@ -565,7 +565,7 @@ TEST(ProtoSerializeTest, SerializeAndDeserializeOverlayable) {
overlayable_item = search_result.value().entry->overlayable_item.value();
EXPECT_THAT(overlayable_item.overlayable->name, Eq("TaskBar"));
EXPECT_THAT(overlayable_item.overlayable->actor, Eq("overlay://theme"));
- EXPECT_THAT(overlayable_item.policies, Eq(OverlayableItem::Policy::kProductServices
+ EXPECT_THAT(overlayable_item.policies, Eq(OverlayableItem::Policy::kPublic
| OverlayableItem::Policy::kVendor));
search_result = new_table.FindResource(test::ParseNameOrDie("com.app.a:bool/baz"));
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 85bf6f218ba0..5812ec44f1fb 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -213,6 +213,27 @@ static bool VerifyUsesFeature(xml::Element* el, SourcePathDiagnostics* diag) {
return true;
}
+static bool AddDeprecatedUsesFeatures(xml::Element* el, SourcePathDiagnostics* diag) {
+ if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "name")) {
+ if (attr->value.empty()) {
+ return true;
+ }
+
+ // Add "android.hardware.fingerprint" when "android.hardware.biometric.fingerprint" is found,
+ // since the former is deprecated in Q and the latter is not present pre-Q. (see b/115639644)
+ if (attr->value == "android.hardware.biometrics.fingerprint") {
+ auto element = el->CloneElement([&](const xml::Element& el, xml::Element* out_el) {
+ xml::Attribute* cloned_attr = out_el->FindOrCreateAttribute(xml::kSchemaAndroid, "name");
+ cloned_attr->value = "android.hardware.fingerprint";
+ });
+
+ el->parent->AppendChild(std::move(element));
+ }
+ }
+
+ return true;
+}
+
bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor,
IDiagnostics* diag) {
// First verify some options.
@@ -247,6 +268,7 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor,
// Common <uses-feature> actions.
xml::XmlNodeAction uses_feature_action;
uses_feature_action.Action(VerifyUsesFeature);
+ uses_feature_action.Action(AddDeprecatedUsesFeatures);
// Common component actions.
xml::XmlNodeAction component_action;
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index adea6273bc8b..fcc9f559a73f 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -832,4 +832,36 @@ TEST_F(ManifestFixerTest, UsesLibraryMustHaveNonEmptyName) {
EXPECT_THAT(Verify(input), NotNull());
}
+TEST_F(ManifestFixerTest, UsesFeatureAddDeprecated) {
+ std::string input = R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android">
+ <uses-feature android:name="android.hardware.biometrics.fingerprint" />
+ <feature-group>
+ <uses-feature android:name="android.hardware.biometrics.fingerprint" />
+ </feature-group>
+ </manifest>)";
+
+ std::unique_ptr<xml::XmlResource> manifest = Verify(input);
+ ASSERT_THAT(manifest, NotNull());
+ EXPECT_THAT(manifest->root->FindChildWithAttribute("", "uses-feature",
+ xml::kSchemaAndroid, "name",
+ "android.hardware.biometrics.fingerprint"),
+ Ne(nullptr));
+ EXPECT_THAT(manifest->root->FindChildWithAttribute("", "uses-feature",
+ xml::kSchemaAndroid, "name",
+ "android.hardware.fingerprint"),
+ Ne(nullptr));
+
+ xml::Element* feature_group = manifest->root->FindChild("", "feature-group");
+ ASSERT_THAT(feature_group, Ne(nullptr));
+
+ EXPECT_THAT(feature_group->FindChildWithAttribute("", "uses-feature", xml::kSchemaAndroid, "name",
+ "android.hardware.biometrics.fingerprint"),
+ Ne(nullptr));
+ EXPECT_THAT(feature_group->FindChildWithAttribute("", "uses-feature", xml::kSchemaAndroid, "name",
+ "android.hardware.fingerprint"),
+ Ne(nullptr));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index 921d634e583e..ad3674e16774 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -484,7 +484,7 @@ TEST_F(TableMergerTest, SetOverlayableLater) {
OverlayableItem overlayable_item(overlayable);
overlayable_item.policies |= OverlayableItem::Policy::kPublic;
- overlayable_item.policies |= OverlayableItem::Policy::kProductServices;
+ overlayable_item.policies |= OverlayableItem::Policy::kSystem;
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
@@ -506,7 +506,7 @@ TEST_F(TableMergerTest, SetOverlayableLater) {
EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("CustomizableResources"));
EXPECT_THAT(result_overlayable_item.overlayable->actor, Eq("overlay://customization"));
EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kPublic
- | OverlayableItem::Policy::kProductServices));
+ | OverlayableItem::Policy::kSystem));
}
TEST_F(TableMergerTest, SameResourceDifferentNameFail) {
diff --git a/tools/aapt2/optimize/ResourcePathShortener.cpp b/tools/aapt2/optimize/ResourcePathShortener.cpp
new file mode 100644
index 000000000000..c5df3dd00db9
--- /dev/null
+++ b/tools/aapt2/optimize/ResourcePathShortener.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#include "optimize/ResourcePathShortener.h"
+
+#include <math.h>
+#include <unordered_set>
+
+#include "androidfw/StringPiece.h"
+
+#include "ResourceTable.h"
+#include "ValueVisitor.h"
+
+
+static const std::string base64_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789-_";
+
+namespace aapt {
+
+ResourcePathShortener::ResourcePathShortener(
+ std::map<std::string, std::string>& path_map_out)
+ : path_map_(path_map_out) {
+}
+
+std::string ShortenFileName(const android::StringPiece& file_path, int output_length) {
+ std::size_t hash_num = std::hash<android::StringPiece>{}(file_path);
+ std::string result = "";
+ // Convert to (modified) base64 so that it is a proper file path.
+ for (int i = 0; i < output_length; i++) {
+ uint8_t sextet = hash_num & 0x3f;
+ hash_num >>= 6;
+ result += base64_chars[sextet];
+ }
+ return result;
+}
+
+
+// Calculate the optimal hash length such that an average of 10% of resources
+// collide in their shortened path.
+// Reference: http://matt.might.net/articles/counting-hash-collisions/
+int OptimalShortenedLength(int num_resources) {
+ int num_chars = 2;
+ double N = 64*64; // hash space when hash is 2 chars long
+ double max_collisions = num_resources * 0.1;
+ while (num_resources - N + N * pow((N - 1) / N, num_resources) > max_collisions) {
+ N *= 64;
+ num_chars++;
+ }
+ return num_chars;
+}
+
+std::string GetShortenedPath(const android::StringPiece& shortened_filename,
+ const android::StringPiece& extension, int collision_count) {
+ std::string shortened_path = "res/" + shortened_filename.to_string();
+ if (collision_count > 0) {
+ shortened_path += std::to_string(collision_count);
+ }
+ shortened_path += extension;
+ return shortened_path;
+}
+
+bool ResourcePathShortener::Consume(IAaptContext* context, ResourceTable* table) {
+ // used to detect collisions
+ std::unordered_set<std::string> shortened_paths;
+ std::unordered_set<FileReference*> file_refs;
+ for (auto& package : table->packages) {
+ for (auto& type : package->types) {
+ for (auto& entry : type->entries) {
+ for (auto& config_value : entry->values) {
+ FileReference* file_ref = ValueCast<FileReference>(config_value->value.get());
+ if (file_ref) {
+ file_refs.insert(file_ref);
+ }
+ }
+ }
+ }
+ }
+ int num_chars = OptimalShortenedLength(file_refs.size());
+ for (auto& file_ref : file_refs) {
+ android::StringPiece res_subdir, actual_filename, extension;
+ util::ExtractResFilePathParts(*file_ref->path, &res_subdir, &actual_filename, &extension);
+
+ std::string shortened_filename = ShortenFileName(*file_ref->path, num_chars);
+ int collision_count = 0;
+ std::string shortened_path = GetShortenedPath(shortened_filename, extension, collision_count);
+ while (shortened_paths.find(shortened_path) != shortened_paths.end()) {
+ collision_count++;
+ shortened_path = GetShortenedPath(shortened_filename, extension, collision_count);
+ }
+ shortened_paths.insert(shortened_path);
+ path_map_.insert({*file_ref->path, shortened_path});
+ file_ref->path = table->string_pool.MakeRef(shortened_path, file_ref->path.GetContext());
+ }
+ return true;
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/optimize/ResourcePathShortener.h b/tools/aapt2/optimize/ResourcePathShortener.h
new file mode 100644
index 000000000000..f1074ef083bd
--- /dev/null
+++ b/tools/aapt2/optimize/ResourcePathShortener.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#ifndef AAPT_OPTIMIZE_RESOURCEPATHSHORTENER_H
+#define AAPT_OPTIMIZE_RESOURCEPATHSHORTENER_H
+
+#include <map>
+
+#include "android-base/macros.h"
+
+#include "process/IResourceTableConsumer.h"
+
+namespace aapt {
+
+class ResourceTable;
+
+// Maps resources in the apk to shortened paths.
+class ResourcePathShortener : public IResourceTableConsumer {
+ public:
+ explicit ResourcePathShortener(std::map<std::string, std::string>& path_map_out);
+
+ bool Consume(IAaptContext* context, ResourceTable* table) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ResourcePathShortener);
+ std::map<std::string, std::string>& path_map_;
+};
+
+} // namespace aapt
+
+#endif // AAPT_OPTIMIZE_RESOURCEPATHSHORTENER_H
diff --git a/tools/aapt2/optimize/ResourcePathShortener_test.cpp b/tools/aapt2/optimize/ResourcePathShortener_test.cpp
new file mode 100644
index 000000000000..88cadc76c336
--- /dev/null
+++ b/tools/aapt2/optimize/ResourcePathShortener_test.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#include "optimize/ResourcePathShortener.h"
+
+#include "ResourceTable.h"
+#include "test/Test.h"
+
+using ::aapt::test::GetValue;
+using ::testing::Not;
+using ::testing::NotNull;
+using ::testing::Eq;
+
+namespace aapt {
+
+TEST(ResourcePathShortenerTest, FileRefPathsChangedInResourceTable) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddFileReference("android:drawable/xmlfile", "res/drawables/xmlfile.xml")
+ .AddFileReference("android:drawable/xmlfile2", "res/drawables/xmlfile2.xml")
+ .AddString("android:string/string", "res/should/still/be/the/same.png")
+ .Build();
+
+ std::map<std::string, std::string> path_map;
+ ASSERT_TRUE(ResourcePathShortener(path_map).Consume(context.get(), table.get()));
+
+ // Expect that the path map is populated
+ ASSERT_THAT(path_map.find("res/drawables/xmlfile.xml"), Not(Eq(path_map.end())));
+ ASSERT_THAT(path_map.find("res/drawables/xmlfile2.xml"), Not(Eq(path_map.end())));
+
+ // The file paths were changed
+ EXPECT_THAT(path_map.at("res/drawables/xmlfile.xml"), Not(Eq("res/drawables/xmlfile.xml")));
+ EXPECT_THAT(path_map.at("res/drawables/xmlfile2.xml"), Not(Eq("res/drawables/xmlfile2.xml")));
+
+ // Different file paths should remain different
+ EXPECT_THAT(path_map["res/drawables/xmlfile.xml"],
+ Not(Eq(path_map["res/drawables/xmlfile2.xml"])));
+
+ FileReference* ref =
+ GetValue<FileReference>(table.get(), "android:drawable/xmlfile");
+ ASSERT_THAT(ref, NotNull());
+ // The map correctly points to the new location of the file
+ EXPECT_THAT(path_map["res/drawables/xmlfile.xml"], Eq(*ref->path));
+
+ // Strings should not be affected, only file paths
+ EXPECT_THAT(
+ *GetValue<String>(table.get(), "android:string/string")->value,
+ Eq("res/should/still/be/the/same.png"));
+ EXPECT_THAT(path_map.find("res/should/still/be/the/same.png"), Eq(path_map.end()));
+}
+
+} // namespace aapt
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 6476abd8268e..d1fe43ea0c7c 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -26,7 +26,7 @@ $ git blame api/current.txt -t -e > /tmp/currentblame.txt
$ apilint.py /tmp/currentblame.txt previous.txt --no-color
"""
-import re, sys, collections, traceback, argparse
+import re, sys, collections, traceback, argparse, itertools
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
@@ -50,45 +50,37 @@ def format(fg=None, bg=None, bright=False, bold=False, dim=False, reset=False):
return "\033[%sm" % (";".join(codes))
-def ident(raw):
- """Strips superficial signature changes, giving us a strong key that
- can be used to identify members across API levels."""
- raw = raw.replace(" deprecated ", " ")
- raw = raw.replace(" synchronized ", " ")
- raw = raw.replace(" final ", " ")
- raw = re.sub("<.+?>", "", raw)
- if " throws " in raw:
- raw = raw[:raw.index(" throws ")]
- return raw
-
-
class Field():
- def __init__(self, clazz, line, raw, blame):
+ def __init__(self, clazz, line, raw, blame, sig_format = 1):
self.clazz = clazz
self.line = line
self.raw = raw.strip(" {;")
self.blame = blame
- # drop generics for now; may need multiple passes
- raw = re.sub("<[^<]+?>", "", raw)
- raw = re.sub("<[^<]+?>", "", raw)
+ if sig_format == 2:
+ V2LineParser(raw).parse_into_field(self)
+ elif sig_format == 1:
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
- raw = raw.split()
- self.split = list(raw)
+ raw = raw.split()
+ self.split = list(raw)
- for r in ["field", "volatile", "transient", "public", "protected", "static", "final", "deprecated"]:
- while r in raw: raw.remove(r)
+ for r in ["field", "volatile", "transient", "public", "protected", "static", "final", "deprecated"]:
+ while r in raw: raw.remove(r)
- # ignore annotations for now
- raw = [ r for r in raw if not r.startswith("@") ]
+ # ignore annotations for now
+ raw = [ r for r in raw if not r.startswith("@") ]
- self.typ = raw[0]
- self.name = raw[1].strip(";")
- if len(raw) >= 4 and raw[2] == "=":
- self.value = raw[3].strip(';"')
- else:
- self.value = None
- self.ident = ident(self.raw)
+ self.typ = raw[0]
+ self.name = raw[1].strip(";")
+ if len(raw) >= 4 and raw[2] == "=":
+ self.value = raw[3].strip(';"')
+ else:
+ self.value = None
+
+ self.ident = "-".join((self.typ, self.name, self.value or ""))
def __hash__(self):
return hash(self.raw)
@@ -96,48 +88,55 @@ class Field():
def __repr__(self):
return self.raw
-
class Method():
- def __init__(self, clazz, line, raw, blame):
+ def __init__(self, clazz, line, raw, blame, sig_format = 1):
self.clazz = clazz
self.line = line
self.raw = raw.strip(" {;")
self.blame = blame
- # drop generics for now; may need multiple passes
- raw = re.sub("<[^<]+?>", "", raw)
- raw = re.sub("<[^<]+?>", "", raw)
-
- # handle each clause differently
- raw_prefix, raw_args, _, raw_throws = re.match(r"(.*?)\((.*?)\)( throws )?(.*?);$", raw).groups()
-
- # parse prefixes
- raw = re.split("[\s]+", raw_prefix)
- for r in ["", ";"]:
- while r in raw: raw.remove(r)
- self.split = list(raw)
-
- for r in ["method", "public", "protected", "static", "final", "deprecated", "abstract", "default", "operator"]:
- while r in raw: raw.remove(r)
-
- self.typ = raw[0]
- self.name = raw[1]
-
- # parse args
- self.args = []
- for arg in re.split(",\s*", raw_args):
- arg = re.split("\s", arg)
- # ignore annotations for now
- arg = [ a for a in arg if not a.startswith("@") ]
- if len(arg[0]) > 0:
- self.args.append(arg[0])
+ if sig_format == 2:
+ V2LineParser(raw).parse_into_method(self)
+ elif sig_format == 1:
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
+
+ # handle each clause differently
+ raw_prefix, raw_args, _, raw_throws = re.match(r"(.*?)\((.*?)\)( throws )?(.*?);$", raw).groups()
+
+ # parse prefixes
+ raw = re.split("[\s]+", raw_prefix)
+ for r in ["", ";"]:
+ while r in raw: raw.remove(r)
+ self.split = list(raw)
+
+ for r in ["method", "public", "protected", "static", "final", "deprecated", "abstract", "default", "operator", "synchronized"]:
+ while r in raw: raw.remove(r)
+
+ self.typ = raw[0]
+ self.name = raw[1]
+
+ # parse args
+ self.args = []
+ for arg in re.split(",\s*", raw_args):
+ arg = re.split("\s", arg)
+ # ignore annotations for now
+ arg = [ a for a in arg if not a.startswith("@") ]
+ if len(arg[0]) > 0:
+ self.args.append(arg[0])
+
+ # parse throws
+ self.throws = []
+ for throw in re.split(",\s*", raw_throws):
+ self.throws.append(throw)
+ else:
+ raise ValueError("Unknown signature format: " + sig_format)
- # parse throws
- self.throws = []
- for throw in re.split(",\s*", raw_throws):
- self.throws.append(throw)
+ self.ident = "-".join((self.typ, self.name, "-".join(self.args)))
- self.ident = ident(self.raw)
+ def sig_matches(self, typ, name, args):
+ return typ == self.typ and name == self.name and args == self.args
def __hash__(self):
return hash(self.raw)
@@ -147,7 +146,7 @@ class Method():
class Class():
- def __init__(self, pkg, line, raw, blame):
+ def __init__(self, pkg, line, raw, blame, sig_format = 1):
self.pkg = pkg
self.line = line
self.raw = raw.strip(" {;")
@@ -156,31 +155,44 @@ class Class():
self.fields = []
self.methods = []
- # drop generics for now; may need multiple passes
- raw = re.sub("<[^<]+?>", "", raw)
- raw = re.sub("<[^<]+?>", "", raw)
+ if sig_format == 2:
+ V2LineParser(raw).parse_into_class(self)
+ elif sig_format == 1:
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
+
+ raw = raw.split()
+ self.split = list(raw)
+ if "class" in raw:
+ self.fullname = raw[raw.index("class")+1]
+ elif "interface" in raw:
+ self.fullname = raw[raw.index("interface")+1]
+ elif "@interface" in raw:
+ self.fullname = raw[raw.index("@interface")+1]
+ else:
+ raise ValueError("Funky class type %s" % (self.raw))
- raw = raw.split()
- self.split = list(raw)
- if "class" in raw:
- self.fullname = raw[raw.index("class")+1]
- elif "interface" in raw:
- self.fullname = raw[raw.index("interface")+1]
- elif "@interface" in raw:
- self.fullname = raw[raw.index("@interface")+1]
- else:
- raise ValueError("Funky class type %s" % (self.raw))
+ if "extends" in raw:
+ self.extends = raw[raw.index("extends")+1]
+ else:
+ self.extends = None
- if "extends" in raw:
- self.extends = raw[raw.index("extends")+1]
- self.extends_path = self.extends.split(".")
+ if "implements" in raw:
+ self.implements = raw[raw.index("implements")+1]
+ else:
+ self.implements = None
else:
- self.extends = None
- self.extends_path = []
+ raise ValueError("Unknown signature format: " + sig_format)
self.fullname = self.pkg.name + "." + self.fullname
self.fullname_path = self.fullname.split(".")
+ if self.extends is not None:
+ self.extends_path = self.extends.split(".")
+ else:
+ self.extends_path = []
+
self.name = self.fullname[self.fullname.rindex(".")+1:]
def merge_from(self, other):
@@ -208,6 +220,330 @@ class Package():
def __repr__(self):
return self.raw
+class V2Tokenizer(object):
+ __slots__ = ["raw"]
+
+ DELIMITER = re.compile(r'\s+|[()@<>;,={}/"!?]|\[\]|\.\.\.')
+ STRING_SPECIAL = re.compile(r'["\\]')
+
+ def __init__(self, raw):
+ self.raw = raw
+
+ def tokenize(self):
+ tokens = []
+ current = 0
+ raw = self.raw
+ length = len(raw)
+
+ while current < length:
+ while current < length:
+ start = current
+ match = V2Tokenizer.DELIMITER.search(raw, start)
+ if match is not None:
+ match_start = match.start()
+ if match_start == current:
+ end = match.end()
+ else:
+ end = match_start
+ else:
+ end = length
+
+ token = raw[start:end]
+ current = end
+
+ if token == "" or token[0] == " ":
+ continue
+ else:
+ break
+
+ if token == "@":
+ if raw[start:start+11] == "@interface ":
+ current = start + 11
+ tokens.append("@interface")
+ continue
+ elif token == '/':
+ if raw[start:start+2] == "//":
+ current = length
+ continue
+ elif token == '"':
+ current, string_token = self.tokenize_string(raw, length, current)
+ tokens.append(token + string_token)
+ continue
+
+ tokens.append(token)
+
+ return tokens
+
+ def tokenize_string(self, raw, length, current):
+ start = current
+ end = length
+ while start < end:
+ match = V2Tokenizer.STRING_SPECIAL.search(raw, start)
+ if match:
+ if match.group() == '"':
+ end = match.end()
+ break
+ elif match.group() == '\\':
+ # ignore whatever is after the slash
+ start += 2
+ else:
+ raise ValueError("Unexpected match: `%s`" % (match.group()))
+ else:
+ raise ValueError("Unexpected EOF tokenizing string: `%s`" % (raw[current - 1:],))
+
+ token = raw[current:end]
+ return end, token
+
+class V2LineParser(object):
+ __slots__ = ["tokenized", "current", "len"]
+
+ MODIFIERS = set("public protected internal private abstract default static final transient volatile synchronized native operator sealed strictfp infix inline suspend vararg".split())
+ JAVA_LANG_TYPES = set("AbstractMethodError AbstractStringBuilder Appendable ArithmeticException ArrayIndexOutOfBoundsException ArrayStoreException AssertionError AutoCloseable Boolean BootstrapMethodError Byte Character CharSequence Class ClassCastException ClassCircularityError ClassFormatError ClassLoader ClassNotFoundException Cloneable CloneNotSupportedException Comparable Compiler Deprecated Double Enum EnumConstantNotPresentException Error Exception ExceptionInInitializerError Float FunctionalInterface IllegalAccessError IllegalAccessException IllegalArgumentException IllegalMonitorStateException IllegalStateException IllegalThreadStateException IncompatibleClassChangeError IndexOutOfBoundsException InheritableThreadLocal InstantiationError InstantiationException Integer InternalError InterruptedException Iterable LinkageError Long Math NegativeArraySizeException NoClassDefFoundError NoSuchFieldError NoSuchFieldException NoSuchMethodError NoSuchMethodException NullPointerException Number NumberFormatException Object OutOfMemoryError Override Package package-info.java Process ProcessBuilder ProcessEnvironment ProcessImpl Readable ReflectiveOperationException Runnable Runtime RuntimeException RuntimePermission SafeVarargs SecurityException SecurityManager Short StackOverflowError StackTraceElement StrictMath String StringBuffer StringBuilder StringIndexOutOfBoundsException SuppressWarnings System Thread ThreadDeath ThreadGroup ThreadLocal Throwable TypeNotPresentException UNIXProcess UnknownError UnsatisfiedLinkError UnsupportedClassVersionError UnsupportedOperationException VerifyError VirtualMachineError Void".split())
+
+ def __init__(self, raw):
+ self.tokenized = V2Tokenizer(raw).tokenize()
+ self.current = 0
+ self.len = len(self.tokenized)
+
+ def parse_into_method(self, method):
+ method.split = []
+ kind = self.parse_one_of("ctor", "method")
+ method.split.append(kind)
+ annotations = self.parse_annotations()
+ method.split.extend(self.parse_modifiers())
+ self.parse_matching_paren("<", ">")
+ if "@Deprecated" in annotations:
+ method.split.append("deprecated")
+ if kind == "ctor":
+ method.typ = "ctor"
+ else:
+ method.typ = self.parse_type()
+ method.split.append(method.typ)
+ method.name = self.parse_name()
+ method.split.append(method.name)
+ self.parse_token("(")
+ method.args = self.parse_args()
+ self.parse_token(")")
+ method.throws = self.parse_throws()
+ if "@interface" in method.clazz.split:
+ self.parse_annotation_default()
+ self.parse_token(";")
+ self.parse_eof()
+
+ def parse_into_class(self, clazz):
+ clazz.split = []
+ annotations = self.parse_annotations()
+ if "@Deprecated" in annotations:
+ clazz.split.append("deprecated")
+ clazz.split.extend(self.parse_modifiers())
+ kind = self.parse_one_of("class", "interface", "@interface", "enum")
+ if kind == "enum":
+ # enums are implicitly final
+ clazz.split.append("final")
+ clazz.split.append(kind)
+ clazz.fullname = self.parse_name()
+ self.parse_matching_paren("<", ">")
+ extends = self.parse_extends()
+ clazz.extends = extends[0] if extends else None
+ implements = self.parse_implements()
+ clazz.implements = implements[0] if implements else None
+ # The checks assume that interfaces are always found in implements, which isn't true for
+ # subinterfaces.
+ if not implements and "interface" in clazz.split:
+ clazz.implements = clazz.extends
+ self.parse_token("{")
+ self.parse_eof()
+
+ def parse_into_field(self, field):
+ kind = self.parse_one_of("field", "property")
+ field.split = [kind]
+ annotations = self.parse_annotations()
+ if "@Deprecated" in annotations:
+ field.split.append("deprecated")
+ field.split.extend(self.parse_modifiers())
+ field.typ = self.parse_type()
+ field.split.append(field.typ)
+ field.name = self.parse_name()
+ field.split.append(field.name)
+ if self.parse_if("="):
+ field.value = self.parse_value_stripped()
+ else:
+ field.value = None
+
+ self.parse_token(";")
+ self.parse_eof()
+
+ def lookahead(self):
+ return self.tokenized[self.current]
+
+ def parse_one_of(self, *options):
+ found = self.lookahead()
+ if found not in options:
+ raise ValueError("Parsing failed, expected one of `%s` but found `%s` in %s" % (options, found, repr(self.tokenized)))
+ return self.parse_token()
+
+ def parse_token(self, tok = None):
+ found = self.lookahead()
+ if tok is not None and found != tok:
+ raise ValueError("Parsing failed, expected `%s` but found `%s` in %s" % (tok, found, repr(self.tokenized)))
+ self.current += 1
+ return found
+
+ def eof(self):
+ return self.current == self.len
+
+ def parse_eof(self):
+ if not self.eof():
+ raise ValueError("Parsing failed, expected EOF, but %s has not been parsed in %s" % (self.tokenized[self.current:], self.tokenized))
+
+ def parse_if(self, tok):
+ if not self.eof() and self.lookahead() == tok:
+ self.parse_token()
+ return True
+ return False
+
+ def parse_annotations(self):
+ ret = []
+ while self.lookahead() == "@":
+ ret.append(self.parse_annotation())
+ return ret
+
+ def parse_annotation(self):
+ ret = self.parse_token("@") + self.parse_token()
+ self.parse_matching_paren("(", ")")
+ return ret
+
+ def parse_matching_paren(self, open, close):
+ start = self.current
+ if not self.parse_if(open):
+ return
+ length = len(self.tokenized)
+ count = 1
+ while count > 0:
+ if self.current == length:
+ raise ValueError("Unexpected EOF looking for closing paren: `%s`" % (self.tokenized[start:],))
+ t = self.parse_token()
+ if t == open:
+ count += 1
+ elif t == close:
+ count -= 1
+ return self.tokenized[start:self.current]
+
+ def parse_modifiers(self):
+ ret = []
+ while self.lookahead() in V2LineParser.MODIFIERS:
+ ret.append(self.parse_token())
+ return ret
+
+ def parse_kotlin_nullability(self):
+ t = self.lookahead()
+ if t == "?" or t == "!":
+ return self.parse_token()
+ return None
+
+ def parse_type(self):
+ self.parse_annotations()
+ type = self.parse_token()
+ if type[-1] == '.':
+ self.parse_annotations()
+ type += self.parse_token()
+ if type in V2LineParser.JAVA_LANG_TYPES:
+ type = "java.lang." + type
+ self.parse_matching_paren("<", ">")
+ while True:
+ t = self.lookahead()
+ if t == "@":
+ self.parse_annotation()
+ elif t == "[]":
+ type += self.parse_token()
+ elif self.parse_kotlin_nullability() is not None:
+ pass # discard nullability for now
+ else:
+ break
+ return type
+
+ def parse_arg_type(self):
+ type = self.parse_type()
+ if self.parse_if("..."):
+ type += "..."
+ self.parse_kotlin_nullability() # discard nullability for now
+ return type
+
+ def parse_name(self):
+ return self.parse_token()
+
+ def parse_args(self):
+ args = []
+ if self.lookahead() == ")":
+ return args
+
+ while True:
+ args.append(self.parse_arg())
+ if self.lookahead() == ")":
+ return args
+ self.parse_token(",")
+
+ def parse_arg(self):
+ self.parse_if("vararg") # kotlin vararg
+ self.parse_annotations()
+ type = self.parse_arg_type()
+ l = self.lookahead()
+ if l != "," and l != ")":
+ if self.lookahead() != '=':
+ self.parse_token() # kotlin argument name
+ if self.parse_if('='): # kotlin default value
+ self.parse_expression()
+ return type
+
+ def parse_expression(self):
+ while not self.lookahead() in [')', ',', ';']:
+ (self.parse_matching_paren('(', ')') or
+ self.parse_matching_paren('{', '}') or
+ self.parse_token())
+
+ def parse_throws(self):
+ ret = []
+ if self.parse_if("throws"):
+ ret.append(self.parse_type())
+ while self.parse_if(","):
+ ret.append(self.parse_type())
+ return ret
+
+ def parse_extends(self):
+ if self.parse_if("extends"):
+ return self.parse_space_delimited_type_list()
+ return []
+
+ def parse_implements(self):
+ if self.parse_if("implements"):
+ return self.parse_space_delimited_type_list()
+ return []
+
+ def parse_space_delimited_type_list(self, terminals = ["implements", "{"]):
+ types = []
+ while True:
+ types.append(self.parse_type())
+ if self.lookahead() in terminals:
+ return types
+
+ def parse_annotation_default(self):
+ if self.parse_if("default"):
+ self.parse_expression()
+
+ def parse_value(self):
+ if self.lookahead() == "{":
+ return " ".join(self.parse_matching_paren("{", "}"))
+ elif self.lookahead() == "(":
+ return " ".join(self.parse_matching_paren("(", ")"))
+ else:
+ return self.parse_token()
+
+ def parse_value_stripped(self):
+ value = self.parse_value()
+ if value[0] == '"':
+ return value[1:-1]
+ return value
+
def _parse_stream(f, clazz_cb=None, base_f=None, out_classes_with_base=None,
in_classes_with_base=[]):
@@ -252,6 +588,7 @@ def _parse_stream_to_generator(f):
pkg = None
clazz = None
blame = None
+ sig_format = 1
re_blame = re.compile("^([a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$")
for raw in f:
@@ -264,16 +601,18 @@ def _parse_stream_to_generator(f):
else:
blame = None
- if raw.startswith("package"):
+ if line == 1 and raw == "// Signature format: 2.0":
+ sig_format = 2
+ elif raw.startswith("package"):
pkg = Package(line, raw, blame)
elif raw.startswith(" ") and raw.endswith("{"):
- clazz = Class(pkg, line, raw, blame)
+ clazz = Class(pkg, line, raw, blame, sig_format=sig_format)
elif raw.startswith(" ctor"):
- clazz.ctors.append(Method(clazz, line, raw, blame))
+ clazz.ctors.append(Method(clazz, line, raw, blame, sig_format=sig_format))
elif raw.startswith(" method"):
- clazz.methods.append(Method(clazz, line, raw, blame))
- elif raw.startswith(" field"):
- clazz.fields.append(Field(clazz, line, raw, blame))
+ clazz.methods.append(Method(clazz, line, raw, blame, sig_format=sig_format))
+ elif raw.startswith(" field") or raw.startswith(" property"):
+ clazz.fields.append(Field(clazz, line, raw, blame, sig_format=sig_format))
elif raw.startswith(" }") and clazz:
yield clazz
@@ -367,7 +706,7 @@ def _fail(clazz, detail, error, rule, msg):
"""Records an API failure to be processed later."""
global failures
- sig = "%s-%s-%s" % (clazz.fullname, repr(detail), msg)
+ sig = "%s-%s-%s" % (clazz.fullname, detail.ident if detail else None, msg)
sig = sig.replace(" deprecated ", " ")
failures[sig] = Failure(sig, clazz, detail, error, rule, msg)
@@ -408,7 +747,7 @@ def verify_constants(clazz):
def verify_enums(clazz):
"""Enums are bad, mmkay?"""
- if "extends java.lang.Enum" in clazz.raw:
+ if clazz.extends == "java.lang.Enum" or "enum" in clazz.split:
error(clazz, None, "F5", "Enums are not allowed")
@@ -467,7 +806,7 @@ def verify_listeners(clazz):
interface OnFooListener { void onFoo() }"""
if clazz.name.endswith("Listener"):
- if " abstract class " in clazz.raw:
+ if "abstract" in clazz.split and "class" in clazz.split:
error(clazz, None, "L1", "Listeners should be an interface, or otherwise renamed Callback")
for m in clazz.methods:
@@ -546,16 +885,16 @@ def verify_equals(clazz):
eq = False
hc = False
for m in clazz.methods:
- if " static " in m.raw: continue
- if "boolean equals(java.lang.Object)" in m.raw: eq = True
- if "int hashCode()" in m.raw: hc = True
+ if "static" in m.split: continue
+ if m.sig_matches("boolean", "equals", ["java.lang.Object"]): eq = True
+ if m.sig_matches("int", "hashCode", []): hc = True
if eq != hc:
error(clazz, None, "M8", "Must override both equals and hashCode; missing one")
def verify_parcelable(clazz):
"""Verify that Parcelable objects aren't hiding required bits."""
- if "implements android.os.Parcelable" in clazz.raw:
+ if clazz.implements == "android.os.Parcelable":
creator = [ i for i in clazz.fields if i.name == "CREATOR" ]
write = [ i for i in clazz.methods if i.name == "writeToParcel" ]
describe = [ i for i in clazz.methods if i.name == "describeContents" ]
@@ -563,8 +902,7 @@ def verify_parcelable(clazz):
if len(creator) == 0 or len(write) == 0 or len(describe) == 0:
error(clazz, None, "FW3", "Parcelable requires CREATOR, writeToParcel, and describeContents; missing one")
- if ((" final class " not in clazz.raw) and
- (" final deprecated class " not in clazz.raw)):
+ if "final" not in clazz.split:
error(clazz, None, "FW8", "Parcelable classes must be final")
for c in clazz.ctors:
@@ -616,7 +954,7 @@ def verify_fields(clazz):
else:
error(clazz, f, "F2", "Bare fields must be marked final, or add accessors if mutable")
- if not "static" in f.split:
+ if "static" not in f.split and "property" not in f.split:
if not re.match("[a-z]([a-zA-Z]+)?", f.name):
error(clazz, f, "S1", "Non-static fields must be named using myField style")
@@ -684,7 +1022,7 @@ def verify_helper_classes(clazz):
"""Verify that helper classes are named consistently with what they extend.
All developer extendable methods should be named onFoo()."""
test_methods = False
- if "extends android.app.Service" in clazz.raw:
+ if clazz.extends == "android.app.Service":
test_methods = True
if not clazz.name.endswith("Service"):
error(clazz, None, "CL4", "Inconsistent class name; should be FooService")
@@ -696,7 +1034,7 @@ def verify_helper_classes(clazz):
if f.value != clazz.fullname:
error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
- if "extends android.content.ContentProvider" in clazz.raw:
+ if clazz.extends == "android.content.ContentProvider":
test_methods = True
if not clazz.name.endswith("Provider"):
error(clazz, None, "CL4", "Inconsistent class name; should be FooProvider")
@@ -708,12 +1046,12 @@ def verify_helper_classes(clazz):
if f.value != clazz.fullname:
error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
- if "extends android.content.BroadcastReceiver" in clazz.raw:
+ if clazz.extends == "android.content.BroadcastReceiver":
test_methods = True
if not clazz.name.endswith("Receiver"):
error(clazz, None, "CL4", "Inconsistent class name; should be FooReceiver")
- if "extends android.app.Activity" in clazz.raw:
+ if clazz.extends == "android.app.Activity":
test_methods = True
if not clazz.name.endswith("Activity"):
error(clazz, None, "CL4", "Inconsistent class name; should be FooActivity")
@@ -731,7 +1069,7 @@ def verify_helper_classes(clazz):
def verify_builder(clazz):
"""Verify builder classes.
Methods should return the builder to enable chaining."""
- if " extends " in clazz.raw: return
+ if clazz.extends: return
if not clazz.name.endswith("Builder"): return
if clazz.name != "Builder":
@@ -759,7 +1097,7 @@ def verify_builder(clazz):
def verify_aidl(clazz):
"""Catch people exposing raw AIDL."""
- if "extends android.os.Binder" in clazz.raw or "implements android.os.IInterface" in clazz.raw:
+ if clazz.extends == "android.os.Binder" or clazz.implements == "android.os.IInterface":
error(clazz, None, None, "Raw AIDL interfaces must not be exposed")
@@ -768,48 +1106,66 @@ def verify_internal(clazz):
if clazz.pkg.name.startswith("com.android"):
error(clazz, None, None, "Internal classes must not be exposed")
+def layering_build_ranking(ranking_list):
+ r = {}
+ for rank, ps in enumerate(ranking_list):
+ if not isinstance(ps, list):
+ ps = [ps]
+ for p in ps:
+ rs = r
+ for n in p.split('.'):
+ if n not in rs:
+ rs[n] = {}
+ rs = rs[n]
+ rs['-rank'] = rank
+ return r
+
+LAYERING_PACKAGE_RANKING = layering_build_ranking([
+ ["android.service","android.accessibilityservice","android.inputmethodservice","android.printservice","android.appwidget","android.webkit","android.preference","android.gesture","android.print"],
+ "android.app",
+ "android.widget",
+ "android.view",
+ "android.animation",
+ "android.provider",
+ ["android.content","android.graphics.drawable"],
+ "android.database",
+ "android.text",
+ "android.graphics",
+ "android.os",
+ "android.util"
+])
def verify_layering(clazz):
"""Catch package layering violations.
For example, something in android.os depending on android.app."""
- ranking = [
- ["android.service","android.accessibilityservice","android.inputmethodservice","android.printservice","android.appwidget","android.webkit","android.preference","android.gesture","android.print"],
- "android.app",
- "android.widget",
- "android.view",
- "android.animation",
- "android.provider",
- ["android.content","android.graphics.drawable"],
- "android.database",
- "android.text",
- "android.graphics",
- "android.os",
- "android.util"
- ]
def rank(p):
- for i in range(len(ranking)):
- if isinstance(ranking[i], list):
- for j in ranking[i]:
- if p.startswith(j): return i
+ r = None
+ l = LAYERING_PACKAGE_RANKING
+ for n in p.split('.'):
+ if n in l:
+ l = l[n]
+ if '-rank' in l:
+ r = l['-rank']
else:
- if p.startswith(ranking[i]): return i
+ break
+ return r
cr = rank(clazz.pkg.name)
if cr is None: return
for f in clazz.fields:
ir = rank(f.typ)
- if ir and ir < cr:
+ if ir is not None and ir < cr:
warn(clazz, f, "FW6", "Field type violates package layering")
- for m in clazz.methods:
+ for m in itertools.chain(clazz.methods, clazz.ctors):
ir = rank(m.typ)
- if ir and ir < cr:
+ if ir is not None and ir < cr:
warn(clazz, m, "FW6", "Method return type violates package layering")
for arg in m.args:
ir = rank(arg)
- if ir and ir < cr:
+ if ir is not None and ir < cr:
warn(clazz, m, "FW6", "Method argument type violates package layering")
@@ -900,21 +1256,18 @@ def verify_exception(clazz):
if len(m.args) == 0 and t in ["java.lang.IllegalArgumentException", "java.lang.NullPointerException"]:
warn(clazz, m, "S1", "Methods taking no arguments should throw IllegalStateException")
+GOOGLE_IGNORECASE = re.compile("google", re.IGNORECASE)
def verify_google(clazz):
"""Verifies that APIs never reference Google."""
- if re.search("google", clazz.raw, re.IGNORECASE):
+ if GOOGLE_IGNORECASE.search(clazz.raw) is not None:
error(clazz, None, None, "Must never reference Google")
- test = []
- test.extend(clazz.ctors)
- test.extend(clazz.fields)
- test.extend(clazz.methods)
-
- for t in test:
- if re.search("google", t.raw, re.IGNORECASE):
- error(clazz, t, None, "Must never reference Google")
+ for test in clazz.ctors, clazz.fields, clazz.methods:
+ for t in test:
+ if GOOGLE_IGNORECASE.search(t.raw) is not None:
+ error(clazz, t, None, "Must never reference Google")
def verify_bitset(clazz):
@@ -1168,7 +1521,7 @@ def verify_abstract_inner(clazz):
"""Verifies that abstract inner classes are static."""
if re.match(".+?\.[A-Z][^\.]+\.[A-Z]", clazz.fullname):
- if " abstract " in clazz.raw and " static " not in clazz.raw:
+ if "abstract" in clazz.split and "static" not in clazz.split:
warn(clazz, None, None, "Abstract inner classes should be static to improve testability")
@@ -1263,8 +1616,8 @@ def verify_units(clazz):
def verify_closable(clazz):
"""Verifies that classes are AutoClosable."""
- if "implements java.lang.AutoCloseable" in clazz.raw: return
- if "implements java.io.Closeable" in clazz.raw: return
+ if clazz.implements == "java.lang.AutoCloseable": return
+ if clazz.implements == "java.io.Closeable": return
for m in clazz.methods:
if len(m.args) > 0: continue
@@ -1309,7 +1662,7 @@ def verify_method_name_not_kotlin_operator(clazz):
binary.add(op)
for m in clazz.methods:
- if 'static' in m.split:
+ if 'static' in m.split or 'operator' in m.split:
continue
# https://kotlinlang.org/docs/reference/operator-overloading.html#unary-prefix-operators
@@ -1350,6 +1703,9 @@ def verify_method_name_not_kotlin_operator(clazz):
def verify_collections_over_arrays(clazz):
"""Warn that [] should be Collections."""
+ if "@interface" in clazz.split:
+ return
+
safe = ["java.lang.String[]","byte[]","short[]","int[]","long[]","float[]","double[]","boolean[]","char[]"]
for m in clazz.methods:
if m.typ.endswith("[]") and m.typ not in safe:
@@ -1683,11 +2039,11 @@ def show_deprecations_at_birth(cur, prev):
del cur[prev_clazz.fullname]
for clazz in cur.values():
- if " deprecated " in clazz.raw and not clazz.fullname in prev:
+ if "deprecated" in clazz.split and not clazz.fullname in prev:
error(clazz, None, None, "Found API deprecation at birth")
for i in clazz.ctors + clazz.methods + clazz.fields:
- if " deprecated " in i.raw:
+ if "deprecated" in i.split:
error(clazz, i, None, "Found API deprecation at birth")
print "%s Deprecated at birth %s\n" % ((format(fg=WHITE, bg=BLUE, bold=True),
diff --git a/tools/apilint/apilint_test.py b/tools/apilint/apilint_test.py
index ece69a99f579..fde61a902341 100644
--- a/tools/apilint/apilint_test.py
+++ b/tools/apilint/apilint_test.py
@@ -143,5 +143,189 @@ class BaseFileTests(unittest.TestCase):
out_classes_with_base=classes_with_base)
self.assertEquals(map(lambda x: x.fullname, classes_with_base), ["android.app.WallpaperColors"])
+class V2TokenizerTests(unittest.TestCase):
+ def _test(self, raw, expected):
+ self.assertEquals(apilint.V2Tokenizer(raw).tokenize(), expected)
+
+ def test_simple(self):
+ self._test(" method public some.Type someName(some.Argument arg, int arg);",
+ ['method', 'public', 'some.Type', 'someName', '(', 'some.Argument',
+ 'arg', ',', 'int', 'arg', ')', ';'])
+ self._test("class Some.Class extends SomeOther {",
+ ['class', 'Some.Class', 'extends', 'SomeOther', '{'])
+
+ def test_varargs(self):
+ self._test("name(String...)",
+ ['name', '(', 'String', '...', ')'])
+
+ def test_kotlin(self):
+ self._test("String? name(String!...)",
+ ['String', '?', 'name', '(', 'String', '!', '...', ')'])
+
+ def test_annotation(self):
+ self._test("method @Nullable public void name();",
+ ['method', '@', 'Nullable', 'public', 'void', 'name', '(', ')', ';'])
+
+ def test_annotation_args(self):
+ self._test("@Some(val=1, other=2) class Class {",
+ ['@', 'Some', '(', 'val', '=', '1', ',', 'other', '=', '2', ')',
+ 'class', 'Class', '{'])
+ def test_comment(self):
+ self._test("some //comment", ['some'])
+
+ def test_strings(self):
+ self._test(r'"" "foo" "\"" "\\"', ['""', '"foo"', r'"\""', r'"\\"'])
+
+ def test_at_interface(self):
+ self._test("public @interface Annotation {",
+ ['public', '@interface', 'Annotation', '{'])
+
+ def test_array_type(self):
+ self._test("int[][]", ['int', '[]', '[]'])
+
+ def test_generics(self):
+ self._test("<>foobar<A extends Object>",
+ ['<', '>', 'foobar', '<', 'A', 'extends', 'Object', '>'])
+
+class V2ParserTests(unittest.TestCase):
+ def _cls(self, raw):
+ pkg = apilint.Package(999, "package pkg {", None)
+ return apilint.Class(pkg, 1, raw, '', sig_format=2)
+
+ def _method(self, raw, cls=None):
+ if not cls:
+ cls = self._cls("class Class {")
+ return apilint.Method(cls, 1, raw, '', sig_format=2)
+
+ def _field(self, raw):
+ cls = self._cls("class Class {")
+ return apilint.Field(cls, 1, raw, '', sig_format=2)
+
+ def test_class(self):
+ cls = self._cls("@Deprecated @IntRange(from=1, to=2) public static abstract class Some.Name extends Super<Class> implements Interface<Class> {")
+ self.assertTrue('deprecated' in cls.split)
+ self.assertTrue('static' in cls.split)
+ self.assertTrue('abstract' in cls.split)
+ self.assertTrue('class' in cls.split)
+ self.assertEquals('Super', cls.extends)
+ self.assertEquals('Interface', cls.implements)
+ self.assertEquals('pkg.Some.Name', cls.fullname)
+
+ def test_interface(self):
+ cls = self._cls("@Deprecated @IntRange(from=1, to=2) public interface Some.Name extends Interface<Class> {")
+ self.assertTrue('deprecated' in cls.split)
+ self.assertTrue('interface' in cls.split)
+ self.assertEquals('Interface', cls.extends)
+ self.assertEquals('Interface', cls.implements)
+ self.assertEquals('pkg.Some.Name', cls.fullname)
+
+ def test_at_interface(self):
+ cls = self._cls("@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SuppressLint {")
+ self.assertTrue('@interface' in cls.split)
+ self.assertEquals('pkg.SuppressLint', cls.fullname)
+
+ def test_parse_method(self):
+ m = self._method("method @Deprecated public static native <T> Class<T>[][] name("
+ + "Class<T[]>[][], Class<T[][][]>[][]...) throws Exception, T;")
+ self.assertTrue('static' in m.split)
+ self.assertTrue('public' in m.split)
+ self.assertTrue('method' in m.split)
+ self.assertTrue('native' in m.split)
+ self.assertTrue('deprecated' in m.split)
+ self.assertEquals('java.lang.Class[][]', m.typ)
+ self.assertEquals('name', m.name)
+ self.assertEquals(['java.lang.Class[][]', 'java.lang.Class[][]...'], m.args)
+ self.assertEquals(['java.lang.Exception', 'T'], m.throws)
+
+ def test_ctor(self):
+ m = self._method("ctor @Deprecated <T> ClassName();")
+ self.assertTrue('ctor' in m.split)
+ self.assertTrue('deprecated' in m.split)
+ self.assertEquals('ctor', m.typ)
+ self.assertEquals('ClassName', m.name)
+
+ def test_parse_annotation_method(self):
+ cls = self._cls("@interface Annotation {")
+ self._method('method abstract String category() default "";', cls=cls)
+ self._method('method abstract boolean deepExport() default false;', cls=cls)
+ self._method('method abstract ViewDebug.FlagToString[] flagMapping() default {};', cls=cls)
+ self._method('method abstract ViewDebug.FlagToString[] flagMapping() default (double)java.lang.Float.NEGATIVE_INFINITY;', cls=cls)
+
+ def test_parse_string_field(self):
+ f = self._field('field @Deprecated public final String SOME_NAME = "value";')
+ self.assertTrue('field' in f.split)
+ self.assertTrue('deprecated' in f.split)
+ self.assertTrue('final' in f.split)
+ self.assertEquals('java.lang.String', f.typ)
+ self.assertEquals('SOME_NAME', f.name)
+ self.assertEquals('value', f.value)
+
+ def test_parse_field(self):
+ f = self._field('field public Object SOME_NAME;')
+ self.assertTrue('field' in f.split)
+ self.assertEquals('java.lang.Object', f.typ)
+ self.assertEquals('SOME_NAME', f.name)
+ self.assertEquals(None, f.value)
+
+ def test_parse_int_field(self):
+ f = self._field('field public int NAME = 123;')
+ self.assertTrue('field' in f.split)
+ self.assertEquals('int', f.typ)
+ self.assertEquals('NAME', f.name)
+ self.assertEquals('123', f.value)
+
+ def test_parse_quotient_field(self):
+ f = self._field('field public int NAME = (0.0/0.0);')
+ self.assertTrue('field' in f.split)
+ self.assertEquals('int', f.typ)
+ self.assertEquals('NAME', f.name)
+ self.assertEquals('( 0.0 / 0.0 )', f.value)
+
+ def test_kotlin_types(self):
+ self._field('field public List<Integer[]?[]!>?[]![]? NAME;')
+ self._method("method <T?> Class<T!>?[]![][]? name(Type!, Type argname,"
+ + "Class<T?>[][]?[]!...!) throws Exception, T;")
+ self._method("method <T> T name(T a = 1, T b = A(1), Lambda f = { false }, N? n = null, "
+ + """double c = (1/0), float d = 1.0f, String s = "heyo", char c = 'a');""")
+
+ def test_kotlin_operator(self):
+ self._method('method public operator void unaryPlus(androidx.navigation.NavDestination);')
+ self._method('method public static operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);')
+ self._method('method public static operator <T> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);')
+
+ def test_kotlin_property(self):
+ self._field('property public VM value;')
+ self._field('property public final String? action;')
+
+ def test_kotlin_varargs(self):
+ self._method('method public void error(int p = "42", Integer int2 = "null", int p1 = "42", vararg String args);')
+
+ def test_kotlin_default_values(self):
+ self._method('method public void foo(String! = null, String! = "Hello World", int = 42);')
+ self._method('method void method(String, String firstArg = "hello", int secondArg = "42", String thirdArg = "world");')
+ self._method('method void method(String, String firstArg = "hello", int secondArg = "42");')
+ self._method('method void method(String, String firstArg = "hello");')
+ self._method('method void edit(android.Type, boolean commit = false, Function1<? super Editor,kotlin.Unit> action);')
+ self._method('method <K, V> LruCache<K,V> lruCache(int maxSize, Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, Function1<? extends V> create = { (V)null }, Function4<kotlin.Unit> onEntryRemoved = { _, _, _, _ -> });')
+ self._method('method android.Bitmap? drawToBitmap(android.View, android.Config config = android.graphics.Bitmap.Config.ARGB_8888);')
+ self._method('method void emptyLambda(Function0<kotlin.Unit> sizeOf = {});')
+ self._method('method void method1(int p = 42, Integer? int2 = null, int p1 = 42, String str = "hello world", java.lang.String... args);')
+ self._method('method void method2(int p, int int2 = (2 * int) * some.other.pkg.Constants.Misc.SIZE);')
+ self._method('method void method3(String str, int p, int int2 = double(int) + str.length);')
+ self._method('method void print(test.pkg.Foo foo = test.pkg.Foo());')
+
+ def test_type_use_annotation(self):
+ self._method('method public static int codePointAt(char @NonNull [], int);')
+ self._method('method @NonNull public java.util.Set<java.util.Map.@NonNull Entry<K,V>> entrySet();')
+
+ m = self._method('method @NonNull public java.lang.annotation.@NonNull Annotation @NonNull [] getAnnotations();')
+ self.assertEquals('java.lang.annotation.Annotation[]', m.typ)
+
+ m = self._method('method @NonNull public abstract java.lang.annotation.@NonNull Annotation @NonNull [] @NonNull [] getParameterAnnotations();')
+ self.assertEquals('java.lang.annotation.Annotation[][]', m.typ)
+
+ m = self._method('method @NonNull public @NonNull String @NonNull [] split(@NonNull String, int);')
+ self.assertEquals('java.lang.String[]', m.typ)
+
if __name__ == "__main__":
- unittest.main() \ No newline at end of file
+ unittest.main()
diff --git a/tools/bit/command.h b/tools/bit/command.h
index fb44900b0806..dd7103e10fe7 100644
--- a/tools/bit/command.h
+++ b/tools/bit/command.h
@@ -25,7 +25,7 @@ using namespace std;
struct Command
{
- Command(const string& prog);
+ explicit Command(const string& prog);
~Command();
void AddArg(const string& arg);
diff --git a/tools/hiddenapi/generate_hiddenapi_lists.py b/tools/hiddenapi/generate_hiddenapi_lists.py
index 01728fa1a0db..2a8f69525eb8 100755
--- a/tools/hiddenapi/generate_hiddenapi_lists.py
+++ b/tools/hiddenapi/generate_hiddenapi_lists.py
@@ -17,6 +17,7 @@
Generate API lists for non-SDK API enforcement.
"""
import argparse
+from collections import defaultdict
import os
import sys
import re
@@ -27,16 +28,20 @@ FLAG_GREYLIST = "greylist"
FLAG_BLACKLIST = "blacklist"
FLAG_GREYLIST_MAX_O = "greylist-max-o"
FLAG_GREYLIST_MAX_P = "greylist-max-p"
+FLAG_CORE_PLATFORM_API = "core-platform-api"
# List of all known flags.
-FLAGS = [
+FLAGS_API_LIST = [
FLAG_WHITELIST,
FLAG_GREYLIST,
FLAG_BLACKLIST,
FLAG_GREYLIST_MAX_O,
FLAG_GREYLIST_MAX_P,
]
-FLAGS_SET = set(FLAGS)
+ALL_FLAGS = FLAGS_API_LIST + [ FLAG_CORE_PLATFORM_API ]
+
+FLAGS_API_LIST_SET = set(FLAGS_API_LIST)
+ALL_FLAGS_SET = set(ALL_FLAGS)
# Suffix used in command line args to express that only known and
# otherwise unassigned entries should be assign the given flag.
@@ -62,7 +67,7 @@ SERIALIZATION_PATTERNS = [
SERIALIZATION_REGEX = re.compile(r'.*->(' + '|'.join(SERIALIZATION_PATTERNS) + r')$')
# Predicates to be used with filter_apis.
-IS_UNASSIGNED = lambda api, flags: not flags
+HAS_NO_API_LIST_ASSIGNED = lambda api, flags: not FLAGS_API_LIST_SET.intersection(flags)
IS_SERIALIZATION = lambda api, flags: SERIALIZATION_REGEX.match(api)
def get_args():
@@ -73,12 +78,10 @@ def get_args():
"""
parser = argparse.ArgumentParser()
parser.add_argument('--output', required=True)
- parser.add_argument('--public', required=True, help='list of all public entries')
- parser.add_argument('--private', required=True, help='list of all private entries')
parser.add_argument('--csv', nargs='*', default=[], metavar='CSV_FILE',
help='CSV files to be merged into output')
- for flag in FLAGS:
+ for flag in ALL_FLAGS:
ignore_conflicts_flag = flag + FLAG_IGNORE_CONFLICTS_SUFFIX
parser.add_argument('--' + flag, dest=flag, nargs='*', default=[], metavar='TXT_FILE',
help='lists of entries with flag "' + flag + '"')
@@ -118,26 +121,9 @@ def write_lines(filename, lines):
f.writelines(lines)
class FlagsDict:
- def __init__(self, public_api, private_api):
- # Bootstrap the entries dictionary.
-
- # Check that the two sets do not overlap.
- public_api_set = set(public_api)
- private_api_set = set(private_api)
- assert public_api_set.isdisjoint(private_api_set), (
- "Lists of public and private API overlap. " +
- "This suggests an issue with the `hiddenapi` build tool.")
-
- # Compute the whole key set
- self._dict_keyset = public_api_set.union(private_api_set)
-
- # Create a dict that creates entries for both public and private API,
- # and assigns public API to the whitelist.
- self._dict = {}
- for api in public_api:
- self._dict[api] = set([ FLAG_WHITELIST ])
- for api in private_api:
- self._dict[api] = set()
+ def __init__(self):
+ self._dict_keyset = set()
+ self._dict = defaultdict(set)
def _check_entries_set(self, keys_subset, source):
assert isinstance(keys_subset, set)
@@ -150,12 +136,12 @@ class FlagsDict:
def _check_flags_set(self, flags_subset, source):
assert isinstance(flags_subset, set)
- assert flags_subset.issubset(FLAGS_SET), (
+ assert flags_subset.issubset(ALL_FLAGS_SET), (
"Error processing: {}\n"
"The following flags were not recognized: \n"
"{}\n"
"Please visit go/hiddenapi for more information.").format(
- source, "\n".join(flags_subset - FLAGS_SET))
+ source, "\n".join(flags_subset - ALL_FLAGS_SET))
def filter_apis(self, filter_fn):
"""Returns APIs which match a given predicate.
@@ -173,7 +159,7 @@ class FlagsDict:
def get_valid_subset_of_unassigned_apis(self, api_subset):
"""Sanitizes a key set input to only include keys which exist in the dictionary
- and have not been assigned any flags.
+ and have not been assigned any API list flags.
Args:
entries_subset (set/list): Key set to be sanitized.
@@ -182,7 +168,7 @@ class FlagsDict:
Sanitized key set.
"""
assert isinstance(api_subset, set)
- return api_subset.intersection(self.filter_apis(IS_UNASSIGNED))
+ return api_subset.intersection(self.filter_apis(HAS_NO_API_LIST_ASSIGNED))
def generate_csv(self):
"""Constructs CSV entries from a dictionary.
@@ -203,14 +189,13 @@ class FlagsDict:
source (string): Origin of `csv_lines`. Will be printed in error messages.
Throws:
- AssertionError if parsed API signatures of flags are invalid.
+ AssertionError if parsed flags are invalid.
"""
# Split CSV lines into arrays of values.
csv_values = [ line.split(',') for line in csv_lines ]
- # Check that all entries exist in the dict.
- csv_keys = set([ csv[0] for csv in csv_values ])
- self._check_entries_set(csv_keys, source)
+ # Update the full set of API signatures.
+ self._dict_keyset.update([ csv[0] for csv in csv_values ])
# Check that all flags are known.
csv_flags = set(reduce(lambda x, y: set(x).union(y), [ csv[1:] for csv in csv_values ], []))
@@ -224,7 +209,7 @@ class FlagsDict:
"""Assigns a flag to given subset of entries.
Args:
- flag (string): One of FLAGS.
+ flag (string): One of ALL_FLAGS.
apis (set): Subset of APIs to recieve the flag.
source (string): Origin of `entries_subset`. Will be printed in error messages.
@@ -245,18 +230,23 @@ def main(argv):
# Parse arguments.
args = vars(get_args())
- flags = FlagsDict(read_lines(args["public"]), read_lines(args["private"]))
+ # Initialize API->flags dictionary.
+ flags = FlagsDict()
+
+ # Merge input CSV files into the dictionary.
+ # Do this first because CSV files produced by parsing API stubs will
+ # contain the full set of APIs. Subsequent additions from text files
+ # will be able to detect invalid entries, and/or filter all as-yet
+ # unassigned entries.
+ for filename in args["csv"]:
+ flags.parse_and_merge_csv(read_lines(filename), filename)
# Combine inputs which do not require any particular order.
# (1) Assign serialization API to whitelist.
flags.assign_flag(FLAG_WHITELIST, flags.filter_apis(IS_SERIALIZATION))
- # (2) Merge input CSV files into the dictionary.
- for filename in args["csv"]:
- flags.parse_and_merge_csv(read_lines(filename), filename)
-
- # (3) Merge text files with a known flag into the dictionary.
- for flag in FLAGS:
+ # (2) Merge text files with a known flag into the dictionary.
+ for flag in ALL_FLAGS:
for filename in args[flag]:
flags.assign_flag(flag, read_lines(filename), filename)
@@ -265,13 +255,13 @@ def main(argv):
# (a) the entry exists, and
# (b) it has not been assigned any other flag.
# Because of (b), this must run after all strict assignments have been performed.
- for flag in FLAGS:
+ for flag in ALL_FLAGS:
for filename in args[flag + FLAG_IGNORE_CONFLICTS_SUFFIX]:
valid_entries = flags.get_valid_subset_of_unassigned_apis(read_lines(filename))
flags.assign_flag(flag, valid_entries, filename)
# Assign all remaining entries to the blacklist.
- flags.assign_flag(FLAG_BLACKLIST, flags.filter_apis(IS_UNASSIGNED))
+ flags.assign_flag(FLAG_BLACKLIST, flags.filter_apis(HAS_NO_API_LIST_ASSIGNED))
# Write output.
write_lines(args["output"], flags.generate_csv())
diff --git a/tools/processors/view_inspector/Android.bp b/tools/processors/view_inspector/Android.bp
index ca6b3c4572f5..9b5df56e3987 100644
--- a/tools/processors/view_inspector/Android.bp
+++ b/tools/processors/view_inspector/Android.bp
@@ -5,7 +5,7 @@ java_library_host {
java_resource_dirs: ["src/resources"],
static_libs: [
- "javapoet",
+ "javapoet",
],
use_tools_jar: true,
@@ -18,9 +18,9 @@ java_test_host {
java_resource_dirs: ["test/resources"],
static_libs: [
- "guava",
"junit",
- "view-inspector-annotation-processor",
+ "guava",
+ "view-inspector-annotation-processor"
],
test_suites: ["general-tests"],
diff --git a/tools/processors/view_inspector/TEST_MAPPING b/tools/processors/view_inspector/TEST_MAPPING
index a91b5b452c39..b4c9cab6916e 100644
--- a/tools/processors/view_inspector/TEST_MAPPING
+++ b/tools/processors/view_inspector/TEST_MAPPING
@@ -2,6 +2,8 @@
"presubmit": [
{
"name": "view-inspector-annotation-processor-test"
+ }, {
+ "name": "CtsViewInspectorAnnotationProcessorTestCases"
}
]
}
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/AnnotationUtils.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/AnnotationUtils.java
index f157949f4d1b..fc4cd01a5a2a 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/AnnotationUtils.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/AnnotationUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -24,6 +24,7 @@ import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
@@ -78,40 +79,126 @@ final class AnnotationUtils {
}
/**
- * Extract a string-valued property from an {@link AnnotationMirror}.
+ * Determine if an annotation with the supplied qualified name is present on the element.
*
- * @param propertyName The name of the requested property
- * @param annotationMirror The mirror to search for the property
- * @return The String value of the annotation or null
+ * @param element The element to check for the presence of an annotation
+ * @param annotationQualifiedName The name of the annotation to check for
+ * @return True if the annotation is present, false otherwise
*/
- Optional<String> stringProperty(String propertyName, AnnotationMirror annotationMirror) {
- final AnnotationValue value = valueByName(propertyName, annotationMirror);
- if (value != null) {
- return Optional.of((String) value.getValue());
- } else {
- return Optional.empty();
+ boolean hasAnnotation(Element element, String annotationQualifiedName) {
+ final TypeElement namedElement = mElementUtils.getTypeElement(annotationQualifiedName);
+
+ if (namedElement != null) {
+ final TypeMirror annotationType = namedElement.asType();
+
+ for (AnnotationMirror annotation : element.getAnnotationMirrors()) {
+ if (mTypeUtils.isSubtype(annotation.getAnnotationType(), annotationType)) {
+ return true;
+ }
+ }
}
+
+ return false;
}
+ /**
+ * Get the typed value of an annotation property by name.
+ *
+ * The returned optional will be empty if the value was left at the default, or if the value
+ * of the property is null.
+ *
+ * @param propertyName The name of the property to search for
+ * @param valueClass The expected class of the property value
+ * @param element The element the annotation is on, used for exceptions
+ * @param annotationMirror An annotation mirror to search for the property
+ * @param <T> The type of the value
+ * @return An optional containing the typed value of the named property
+ */
+ <T> Optional<T> typedValueByName(
+ String propertyName,
+ Class<T> valueClass,
+ Element element,
+ AnnotationMirror annotationMirror) {
+ return valueByName(propertyName, annotationMirror).map(annotationValue -> {
+ final Object value = annotationValue.getValue();
+
+ if (value == null) {
+ throw new ProcessingException(
+ String.format(
+ "Unexpected null value for annotation property \"%s\".",
+ propertyName),
+ element,
+ annotationMirror,
+ annotationValue);
+ }
+
+ if (valueClass.isAssignableFrom(value.getClass())) {
+ return valueClass.cast(value);
+ } else {
+ throw new ProcessingException(
+ String.format(
+ "Expected annotation property \"%s\" to have type %s, but got %s.",
+ propertyName,
+ valueClass.getCanonicalName(),
+ value.getClass().getCanonicalName()),
+ element,
+ annotationMirror,
+ annotationValue);
+ }
+ });
+ }
+
+ /**
+ * Get the untyped value of an annotation property by name.
+ *
+ * The returned optional will be empty if the value was left at the default, or if the value
+ * of the property is null.
+ *
+ * @param propertyName The name of the property to search for
+ * @param element The element the annotation is on, used for exceptions
+ * @param annotationMirror An annotation mirror to search for the property
+ * @return An optional containing the untyped value of the named property
+ * @see AnnotationValue#getValue()
+ */
+ Optional<Object> untypedValueByName(
+ String propertyName,
+ Element element,
+ AnnotationMirror annotationMirror) {
+ return valueByName(propertyName, annotationMirror).map(annotationValue -> {
+ final Object value = annotationValue.getValue();
+
+ if (value == null) {
+ throw new ProcessingException(
+ String.format(
+ "Unexpected null value for annotation property \"%s\".",
+ propertyName),
+ element,
+ annotationMirror,
+ annotationValue);
+ }
+
+ return value;
+ });
+ }
/**
* Extract a {@link AnnotationValue} from a mirror by string property name.
*
* @param propertyName The name of the property requested property
- * @param annotationMirror
- * @return
+ * @param annotationMirror The mirror to search for the property
+ * @return The value of the property
*/
- AnnotationValue valueByName(String propertyName, AnnotationMirror annotationMirror) {
+ Optional<AnnotationValue> valueByName(String propertyName, AnnotationMirror annotationMirror) {
final Map<? extends ExecutableElement, ? extends AnnotationValue> valueMap =
annotationMirror.getElementValues();
for (ExecutableElement method : valueMap.keySet()) {
if (method.getSimpleName().contentEquals(propertyName)) {
- return valueMap.get(method);
+ return Optional.ofNullable(valueMap.get(method));
}
}
- return null;
+ // Property not explicitly defined, use default value.
+ return Optional.empty();
}
-
}
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
index 579745d2aaef..f1ebb87fed4d 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -21,6 +21,7 @@ import com.squareup.javapoet.ClassName;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
/**
@@ -70,7 +71,7 @@ public final class InspectableClassModel {
* @return The property or an empty optional
*/
public Optional<Property> getProperty(String name) {
- return Optional.of(mPropertyMap.get(name));
+ return Optional.ofNullable(mPropertyMap.get(name));
}
/**
@@ -87,13 +88,15 @@ public final class InspectableClassModel {
*/
public static final class Property {
private final String mName;
- private String mGetter;
- private Type mType;
+ private final String mGetter;
+ private final Type mType;
private boolean mAttributeIdInferrableFromR = true;
private int mAttributeId = 0;
- public Property(String name) {
- mName = name;
+ public Property(String name, String getter, Type type) {
+ mName = Objects.requireNonNull(name, "Name must not be null");
+ mGetter = Objects.requireNonNull(getter, "Getter must not be null");
+ mType = Objects.requireNonNull(type, "Type must not be null");
}
public int getAttributeId() {
@@ -126,18 +129,10 @@ public final class InspectableClassModel {
return mGetter;
}
- public void setGetter(String getter) {
- mGetter = getter;
- }
-
public Type getType() {
return mType;
}
- public void setType(Type type) {
- mType = type;
- }
-
public enum Type {
/** Primitive or boxed {@code boolean} */
BOOLEAN,
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java
index a186a82af160..46819b28c1e8 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -23,7 +23,7 @@ import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
/**
- * Process {InspectableNodeName} annotations
+ * Process {@code @InspectableNodeName} annotations.
*
* @see android.view.inspector.InspectableNodeName
*/
@@ -58,7 +58,8 @@ public final class InspectableNodeNameProcessor implements ModelProcessor {
try {
final AnnotationMirror mirror =
mAnnotationUtils.exactlyOneMirror(mQualifiedName, element);
- final Optional<String> nodeName = mAnnotationUtils.stringProperty("value", mirror);
+ final Optional<String> nodeName = mAnnotationUtils
+ .typedValueByName("value", String.class, element, mirror);
if (!model.getNodeName().isPresent() || model.getNodeName().equals(nodeName)) {
model.setNodeName(nodeName);
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
new file mode 100644
index 000000000000..f666be7a2a61
--- /dev/null
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
@@ -0,0 +1,408 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.processor.view.inspector;
+
+import android.processor.view.inspector.InspectableClassModel.Property;
+
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.NoType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
+
+/**
+ * Process {@code @InspectableProperty} annotations.
+ *
+ * @see android.view.inspector.InspectableProperty
+ */
+public final class InspectablePropertyProcessor implements ModelProcessor {
+ private final String mQualifiedName;
+ private final ProcessingEnvironment mProcessingEnv;
+ private final AnnotationUtils mAnnotationUtils;
+
+ /**
+ * Regex that matches methods names of the form {@code #getValue()}.
+ */
+ private static final Pattern GETTER_GET_PREFIX = Pattern.compile("\\Aget[A-Z]");
+
+ /**
+ * Regex that matches method name of the form {@code #isPredicate()}.
+ */
+ private static final Pattern GETTER_IS_PREFIX = Pattern.compile("\\Ais[A-Z]");
+
+ /**
+ * Set of android and androidx annotation qualified names for colors packed into {@code int}.
+ *
+ * @see android.annotation.ColorInt
+ */
+ private static final String[] COLOR_INT_ANNOTATION_NAMES = {
+ "android.annotation.ColorInt",
+ "androidx.annotation.ColorInt"};
+
+ /**
+ * Set of android and androidx annotation qualified names for colors packed into {@code long}.
+ * @see android.annotation.ColorLong
+ */
+ private static final String[] COLOR_LONG_ANNOTATION_NAMES = {
+ "android.annotation.ColorLong",
+ "androidx.annotation.ColorLong"};
+
+ /**
+ * @param annotationQualifiedName The qualified name of the annotation to process
+ * @param processingEnv The processing environment from the parent processor
+ */
+ public InspectablePropertyProcessor(
+ String annotationQualifiedName,
+ ProcessingEnvironment processingEnv) {
+ mQualifiedName = annotationQualifiedName;
+ mProcessingEnv = processingEnv;
+ mAnnotationUtils = new AnnotationUtils(processingEnv);
+ }
+
+ @Override
+ public void process(Element element, InspectableClassModel model) {
+ try {
+ final AnnotationMirror annotation =
+ mAnnotationUtils.exactlyOneMirror(mQualifiedName, element);
+ final ExecutableElement getter = ensureGetter(element);
+ final Property property = buildProperty(getter, annotation);
+
+ model.getProperty(property.getName()).ifPresent(p -> {
+ throw new ProcessingException(
+ String.format(
+ "Property \"%s\" is already defined on #%s().",
+ p.getName(),
+ p.getGetter()),
+ getter,
+ annotation);
+ });
+
+ model.putProperty(property);
+ } catch (ProcessingException processingException) {
+ processingException.print(mProcessingEnv.getMessager());
+ }
+ }
+
+ /**
+ * Check that an element is shaped like a getter.
+ *
+ * @param element An element that hopefully represents a getter
+ * @throws ProcessingException if the element isn't a getter
+ * @return An {@link ExecutableElement} that represents a getter method.
+ */
+ private ExecutableElement ensureGetter(Element element) {
+ if (element.getKind() != ElementKind.METHOD) {
+ throw new ProcessingException(
+ String.format("Expected a method, got a %s", element.getKind()),
+ element);
+ }
+
+ final ExecutableElement method = (ExecutableElement) element;
+ final Set<Modifier> modifiers = method.getModifiers();
+
+ if (modifiers.contains(Modifier.PRIVATE)) {
+ throw new ProcessingException(
+ "Property getter methods must not be private.",
+ element);
+ }
+
+ if (modifiers.contains(Modifier.ABSTRACT)) {
+ throw new ProcessingException(
+ "Property getter methods must not be abstract.",
+ element);
+ }
+
+ if (modifiers.contains(Modifier.STATIC)) {
+ throw new ProcessingException(
+ "Property getter methods must not be static.",
+ element);
+ }
+
+ if (!method.getParameters().isEmpty()) {
+ throw new ProcessingException(
+ String.format(
+ "Expected a getter method to take no parameters, "
+ + "but got %d parameters.",
+ method.getParameters().size()),
+ element);
+ }
+
+ if (method.isVarArgs()) {
+ throw new ProcessingException(
+ "Expected a getter method to take no arguments, but got a var args method.",
+ element);
+ }
+
+ if (method.getReturnType() instanceof NoType) {
+ throw new ProcessingException(
+ "Expected a getter to have a return type, got void.",
+ element);
+ }
+
+ return method;
+ }
+
+ /**
+ * Build a {@link Property} from a getter and an inspectable property annotation.
+ *
+ * @param getter An element representing the getter to build from
+ * @param annotation A mirror of an inspectable property-shaped annotation
+ * @throws ProcessingException If the supplied data is invalid and a property cannot be modeled
+ * @return A property for the getter and annotation
+ */
+ private Property buildProperty(ExecutableElement getter, AnnotationMirror annotation) {
+ final String name = mAnnotationUtils
+ .typedValueByName("name", String.class, getter, annotation)
+ .orElseGet(() -> inferPropertyNameFromGetter(getter));
+
+ final Property property = new Property(
+ name,
+ getter.getSimpleName().toString(),
+ determinePropertyType(getter, annotation));
+
+ mAnnotationUtils
+ .typedValueByName("hasAttributeId", Boolean.class, getter, annotation)
+ .ifPresent(property::setAttributeIdInferrableFromR);
+
+ mAnnotationUtils
+ .typedValueByName("attributeId", Integer.class, getter, annotation)
+ .ifPresent(property::setAttributeId);
+
+ return property;
+ }
+
+ /**
+ * Determine the property type from the annotation, return type, or context clues.
+ *
+ * @param getter An element representing the getter to build from
+ * @param annotation A mirror of an inspectable property-shaped annotation
+ * @return The resolved property type
+ * @throws ProcessingException If the property type cannot be resolved
+ * @see android.view.inspector.InspectableProperty#valueType()
+ */
+ private Property.Type determinePropertyType(
+ ExecutableElement getter,
+ AnnotationMirror annotation) {
+
+ final String valueType = mAnnotationUtils
+ .untypedValueByName("valueType", getter, annotation)
+ .map(Object::toString)
+ .orElse("INFERRED");
+
+ final Property.Type returnType = convertReturnTypeToPropertyType(getter);
+
+ switch (valueType) {
+ case "INFERRED":
+ if (hasColorAnnotation(getter)) {
+ return Property.Type.COLOR;
+ } else {
+ return returnType;
+ }
+ case "NONE":
+ return returnType;
+ case "COLOR":
+ switch (returnType) {
+ case COLOR:
+ case INT:
+ case LONG:
+ return Property.Type.COLOR;
+ default:
+ throw new ProcessingException(
+ "Color must be a long, integer, or android.graphics.Color",
+ getter,
+ annotation);
+ }
+ case "GRAVITY":
+ if (returnType == Property.Type.INT) {
+ return Property.Type.GRAVITY;
+ } else {
+ throw new ProcessingException(
+ String.format("Gravity must be an integer, got %s", returnType),
+ getter,
+ annotation);
+ }
+ case "INT_ENUM":
+ case "INT_FLAG":
+ throw new ProcessingException("Not implemented", getter, annotation);
+ default:
+ throw new ProcessingException(
+ String.format("Unknown value type enumeration value: %s", valueType),
+ getter,
+ annotation);
+ }
+ }
+
+ /**
+ * Get a property type from the return type of a getter.
+ *
+ * @param getter The getter to extract the return type of
+ * @throws ProcessingException If the return type is not a primitive or an object
+ * @return The property type returned by the getter
+ */
+ private Property.Type convertReturnTypeToPropertyType(ExecutableElement getter) {
+ final TypeMirror returnType = getter.getReturnType();
+
+ switch (unboxType(returnType)) {
+ case BOOLEAN:
+ return Property.Type.BOOLEAN;
+ case BYTE:
+ return Property.Type.BYTE;
+ case CHAR:
+ return Property.Type.CHAR;
+ case DOUBLE:
+ return Property.Type.DOUBLE;
+ case FLOAT:
+ return Property.Type.FLOAT;
+ case INT:
+ return Property.Type.INT;
+ case LONG:
+ return Property.Type.LONG;
+ case SHORT:
+ return Property.Type.SHORT;
+ case DECLARED:
+ if (isColorType(returnType)) {
+ return Property.Type.COLOR;
+ } else {
+ return Property.Type.OBJECT;
+ }
+ default:
+ throw new ProcessingException(
+ String.format("Unsupported return type %s.", returnType),
+ getter);
+ }
+ }
+
+ /**
+ * Determine if a getter is annotated with color annotation matching its return type.
+ *
+ * Note that an {@code int} return value annotated with {@link android.annotation.ColorLong} is
+ * not considered to be annotated, nor is a {@code long} annotated with
+ * {@link android.annotation.ColorInt}.
+ *
+ * @param getter The getter to query
+ * @return True if the getter has a color annotation, false otherwise
+ *
+ */
+ private boolean hasColorAnnotation(ExecutableElement getter) {
+ switch (unboxType(getter.getReturnType())) {
+ case INT:
+ for (String name : COLOR_INT_ANNOTATION_NAMES) {
+ if (mAnnotationUtils.hasAnnotation(getter, name)) {
+ return true;
+ }
+ }
+ return false;
+ case LONG:
+ for (String name : COLOR_LONG_ANNOTATION_NAMES) {
+ if (mAnnotationUtils.hasAnnotation(getter, name)) {
+ return true;
+ }
+ }
+ return false;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Infer a property name from a getter method.
+ *
+ * If the method is prefixed with {@code get}, the prefix will be stripped, and the
+ * capitalization fixed. E.g.: {@code getSomeProperty} to {@code someProperty}.
+ *
+ * Additionally, if the method's return type is a boolean, an {@code is} prefix will also be
+ * stripped. E.g.: {@code isPropertyEnabled} to {@code propertyEnabled}.
+ *
+ * Failing that, this method will just return the full name of the getter.
+ *
+ * @param getter An element representing a getter
+ * @return A string property name
+ */
+ private String inferPropertyNameFromGetter(ExecutableElement getter) {
+ final String name = getter.getSimpleName().toString();
+
+ if (GETTER_GET_PREFIX.matcher(name).find()) {
+ return name.substring(3, 4).toLowerCase() + name.substring(4);
+ } else if (isBoolean(getter.getReturnType()) && GETTER_IS_PREFIX.matcher(name).find()) {
+ return name.substring(2, 3).toLowerCase() + name.substring(3);
+ } else {
+ return name;
+ }
+ }
+
+ /**
+ * Determine if a {@link TypeMirror} is a boxed or unboxed boolean.
+ *
+ * @param type The type mirror to check
+ * @return True if the type is a boolean
+ */
+ private boolean isBoolean(TypeMirror type) {
+ if (type.getKind() == TypeKind.DECLARED) {
+ return mProcessingEnv.getTypeUtils().unboxedType(type).getKind() == TypeKind.BOOLEAN;
+ } else {
+ return type.getKind() == TypeKind.BOOLEAN;
+ }
+ }
+
+ /**
+ * Unbox a type mirror if it represents a boxed type, otherwise pass it through.
+ *
+ * @param typeMirror The type mirror to unbox
+ * @return The same type mirror, or an unboxed primitive version
+ */
+ private TypeKind unboxType(TypeMirror typeMirror) {
+ final TypeKind typeKind = typeMirror.getKind();
+
+ if (typeKind.isPrimitive()) {
+ return typeKind;
+ } else if (typeKind == TypeKind.DECLARED) {
+ try {
+ return mProcessingEnv.getTypeUtils().unboxedType(typeMirror).getKind();
+ } catch (IllegalArgumentException e) {
+ return typeKind;
+ }
+ } else {
+ return typeKind;
+ }
+ }
+
+ /**
+ * Determine if a type mirror represents a subtype of {@link android.graphics.Color}.
+ *
+ * @param typeMirror The type mirror to test
+ * @return True if it represents a subclass of color, false otherwise
+ */
+ private boolean isColorType(TypeMirror typeMirror) {
+ final TypeElement colorType = mProcessingEnv
+ .getElementUtils()
+ .getTypeElement("android.graphics.Color");
+
+ if (colorType == null) {
+ return false;
+ } else {
+ return mProcessingEnv.getTypeUtils().isSubtype(typeMirror, colorType.asType());
+ }
+ }
+}
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
index 3b85dbb77d5c..dd4d8f54fb68 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -51,12 +51,6 @@ public final class InspectionCompanionGenerator {
private static final ClassName R_CLASS_NAME = ClassName.get("android", "R");
/**
- * The class name of {@link android.content.res.ResourceId}.
- */
- private static final ClassName RESOURCE_ID_CLASS_NAME = ClassName.get(
- "android.content.res", "ResourceId");
-
- /**
* The class name of {@link android.view.inspector.InspectionCompanion}.
*/
private static final ClassName INSPECTION_COMPANION = ClassName.get(
@@ -91,11 +85,11 @@ public final class InspectionCompanionGenerator {
private static final String GENERATED_CLASS_SUFFIX = "$$InspectionCompanion";
/**
- * The null resource ID.
+ * The null resource ID, copied to avoid a host dependency on platform code.
*
- * @see android.content.res.ResourceId#ID_NULL
+ * @see android.content.res.Resources#ID_NULL
*/
- private static final int NO_ID = 0;
+ private static final int ID_NULL = 0;
/**
* @param filer A filer to write the generated source to
@@ -289,8 +283,8 @@ public final class InspectionCompanionGenerator {
if (property.isAttributeIdInferrableFromR()) {
builder.add("$T.attr.$L", R_CLASS_NAME, property.getName());
} else {
- if (property.getAttributeId() == NO_ID) {
- builder.add("$T.ID_NULL", RESOURCE_ID_CLASS_NAME);
+ if (property.getAttributeId() == ID_NULL) {
+ builder.add("$L", ID_NULL);
} else {
builder.add("$L", String.format("0x%08x", property.getAttributeId()));
}
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java
index 3ffcff8a87d3..6f522608a9b4 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java
index e531b67d9ea2..455f5b08e49e 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -46,11 +46,14 @@ import javax.lang.model.element.TypeElement;
* @see android.view.inspector.InspectableProperty
*/
@SupportedAnnotationTypes({
- PlatformInspectableProcessor.NODE_NAME_QUALIFIED_NAME
+ PlatformInspectableProcessor.NODE_NAME_QUALIFIED_NAME,
+ PlatformInspectableProcessor.PROPERTY_QUALIFIED_NAME
})
public final class PlatformInspectableProcessor extends AbstractProcessor {
static final String NODE_NAME_QUALIFIED_NAME =
"android.view.inspector.InspectableNodeName";
+ static final String PROPERTY_QUALIFIED_NAME =
+ "android.view.inspector.InspectableProperty";
@Override
public SourceVersion getSupportedSourceVersion() {
@@ -68,6 +71,11 @@ public final class PlatformInspectableProcessor extends AbstractProcessor {
new InspectableNodeNameProcessor(NODE_NAME_QUALIFIED_NAME, processingEnv),
modelMap);
+ } else if (annotation.getQualifiedName().contentEquals(PROPERTY_QUALIFIED_NAME)) {
+ runModelProcessor(
+ roundEnv.getElementsAnnotatedWith(annotation),
+ new InspectablePropertyProcessor(PROPERTY_QUALIFIED_NAME, processingEnv),
+ modelMap);
} else {
fail("Unexpected annotation type", annotation);
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ProcessingException.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/ProcessingException.java
index 6360e0a2de39..b4c6466b2b2f 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ProcessingException.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/ProcessingException.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
diff --git a/tools/processors/view_inspector/src/resources/META-INF/services/javax.annotation.processing.Processor b/tools/processors/view_inspector/src/resources/META-INF/services/javax.annotation.processing.Processor
index fa4f71ffd0fa..79185cc80f04 100644
--- a/tools/processors/view_inspector/src/resources/META-INF/services/javax.annotation.processing.Processor
+++ b/tools/processors/view_inspector/src/resources/META-INF/services/javax.annotation.processing.Processor
@@ -1 +1 @@
-android.processor.inspector.view.PlatformInspectableProcessor
+android.processor.view.inspector.PlatformInspectableProcessor
diff --git a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
index f639719800f6..b0775dc77f45 100644
--- a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
+++ b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright 2019 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.
@@ -20,7 +20,7 @@ import android.processor.view.inspector.InspectableClassModel.Property;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
-import static junit.framework.TestCase.fail;
+import static junit.framework.Assert.fail;
import com.google.common.base.Charsets;
import com.google.common.io.Resources;
@@ -65,27 +65,28 @@ public class InspectionCompanionGeneratorTest {
@Test
public void testSimpleProperties() {
- addProperty("boolean", Property.Type.BOOLEAN, "getBoolean");
- addProperty("byte", Property.Type.BYTE, "getByte");
- addProperty("char", Property.Type.CHAR, "getChar");
- addProperty("double", Property.Type.DOUBLE, "getDouble");
- addProperty("float", Property.Type.FLOAT, "getFloat");
- addProperty("int", Property.Type.INT, "getInt");
- addProperty("long", Property.Type.LONG, "getLong");
- addProperty("short", Property.Type.SHORT, "getShort");
-
- addProperty("object", Property.Type.OBJECT, "getObject");
- addProperty("color", Property.Type.COLOR, "getColor");
- addProperty("gravity", Property.Type.GRAVITY, "getGravity");
+ addProperty("boolean", "getBoolean", Property.Type.BOOLEAN);
+ addProperty("byte", "getByte", Property.Type.BYTE);
+ addProperty("char", "getChar", Property.Type.CHAR);
+ addProperty("double", "getDouble", Property.Type.DOUBLE);
+ addProperty("float", "getFloat", Property.Type.FLOAT);
+ addProperty("int", "getInt", Property.Type.INT);
+ addProperty("long", "getLong", Property.Type.LONG);
+ addProperty("short", "getShort", Property.Type.SHORT);
+
+ addProperty("object", "getObject", Property.Type.OBJECT);
+ addProperty("color", "getColor", Property.Type.COLOR);
+ addProperty("gravity", "getGravity", Property.Type.GRAVITY);
assertGeneratedFileEquals("SimpleProperties");
}
@Test
public void testNoAttributeId() {
- final Property property = new Property("noAttributeProperty");
- property.setType(Property.Type.INT);
- property.setGetter("getNoAttributeProperty");
+ final Property property = new Property(
+ "noAttributeProperty",
+ "getNoAttributeProperty",
+ Property.Type.INT);
property.setAttributeIdInferrableFromR(false);
mModel.putProperty(property);
@@ -94,19 +95,18 @@ public class InspectionCompanionGeneratorTest {
@Test
public void testSuppliedAttributeId() {
- final Property property = new Property("suppliedAttributeProperty");
- property.setType(Property.Type.INT);
- property.setGetter("getSuppliedAttributeProperty");
+ final Property property = new Property(
+ "suppliedAttributeProperty",
+ "getSuppliedAttributeProperty",
+ Property.Type.INT);
property.setAttributeId(0xdecafbad);
mModel.putProperty(property);
assertGeneratedFileEquals("SuppliedAttributeId");
}
- private Property addProperty(String name, Property.Type type, String getter) {
- final Property property = new Property(name);
- property.setType(type);
- property.setGetter(getter);
+ private Property addProperty(String name, String getter, Property.Type type) {
+ final Property property = new Property(name, getter, type);
mModel.putProperty(property);
return property;
}
diff --git a/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NoAttributeId.java.txt b/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NoAttributeId.java.txt
index 277e84065fb7..23d0f7807aa5 100644
--- a/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NoAttributeId.java.txt
+++ b/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NoAttributeId.java.txt
@@ -1,6 +1,5 @@
package com.android.inspectable;
-import android.content.res.ResourceId;
import android.view.inspector.InspectionCompanion;
import android.view.inspector.PropertyMapper;
import android.view.inspector.PropertyReader;
@@ -25,7 +24,7 @@ public final class TestInspectable$$InspectionCompanion implements InspectionCom
@Override
public void mapProperties(PropertyMapper propertyMapper) {
- mNoAttributePropertyId = propertyMapper.mapInt("noAttributeProperty", ResourceId.ID_NULL);
+ mNoAttributePropertyId = propertyMapper.mapInt("noAttributeProperty", 0);
mPropertiesMapped = true;
}
diff --git a/tools/signedconfig/prod_public.pem b/tools/signedconfig/prod_public.pem
new file mode 100644
index 000000000000..8c10215eb083
--- /dev/null
+++ b/tools/signedconfig/prod_public.pem
@@ -0,0 +1,5 @@
+-----BEGIN PUBLIC KEY-----
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+lky6wKyGL6lE1VrD0YTMHwb0Xwc
++tzC8MvnrzVxodvTpVY/jV7V+Zktcx+pry43XPABFRXtbhTo+qykhyBA1g==
+-----END PUBLIC KEY-----
+
diff --git a/tools/signedconfig/verify_b64.sh b/tools/signedconfig/verify_b64.sh
index 8e1f58ce7b45..a4ac6a816d14 100755
--- a/tools/signedconfig/verify_b64.sh
+++ b/tools/signedconfig/verify_b64.sh
@@ -7,4 +7,30 @@
# The arg values can be taken from the debug log for SignedConfigService when verbose logging is
# enabled.
-openssl dgst -sha256 -verify $(dirname $0)/debug_public.pem -signature <(echo $2 | base64 -d) <(echo $1 | base64 -d)
+function verify() {
+ D=${1}
+ S=${2}
+ K=${3}
+ echo Trying ${K}
+ openssl dgst -sha256 -verify $(dirname $0)/${K} -signature <(echo ${S} | base64 -d) <(echo ${D} | base64 -d)
+}
+
+
+PROD_KEY_NAME=prod_public.pem
+DEBUG_KEY_NAME=debug_public.pem
+SIGNATURE="$2"
+DATA="$1"
+
+echo DATA: ${DATA}
+echo SIGNATURE: ${SIGNATURE}
+
+if verify "${DATA}" "${SIGNATURE}" "${PROD_KEY_NAME}"; then
+ echo Verified with ${PROD_KEY_NAME}
+ exit 0
+fi
+
+if verify "${DATA}" "${SIGNATURE}" "${DEBUG_KEY_NAME}"; then
+ echo Verified with ${DEBUG_KEY_NAME}
+ exit 0
+fi
+exit 1
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index 11b408fb8b9e..4491a8567441 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -67,7 +67,7 @@ cpp_type_name(java_type_t type)
case JAVA_TYPE_STRING:
return "char const*";
case JAVA_TYPE_BYTE_ARRAY:
- return "char const*";
+ return "const BytesField&";
default:
return "UNKNOWN";
}
@@ -270,10 +270,6 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms,
chainField.name.c_str(), chainField.name.c_str());
}
}
- } else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", %s arg%d, size_t arg%d_length",
- cpp_type_name(*arg), argIndex, argIndex);
-
} else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
fprintf(out, ", const std::map<int, int32_t>& arg%d_1, "
"const std::map<int, int64_t>& arg%d_2, "
@@ -355,7 +351,8 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms,
fprintf(out, " event.end();\n\n");
} else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
fprintf(out,
- " event.AppendCharArray(arg%d, arg%d_length);\n",
+ " event.AppendCharArray(arg%d.arg, "
+ "arg%d.arg_length);\n",
argIndex, argIndex);
} else {
if (*arg == JAVA_TYPE_STRING) {
@@ -397,10 +394,6 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms,
chainField.name.c_str(), chainField.name.c_str());
}
}
- } else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", %s arg%d, size_t arg%d_length",
- cpp_type_name(*arg), argIndex, argIndex);
-
} else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
fprintf(out,
", const std::map<int, int32_t>& arg%d_1, "
@@ -434,8 +427,6 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms,
chainField.name.c_str(), chainField.name.c_str());
}
}
- } else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", arg%d, arg%d_length", argIndex, argIndex);
} else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
fprintf(out, ", arg%d_1, arg%d_2, arg%d_3, arg%d_4", argIndex,
argIndex, argIndex, argIndex);
@@ -494,7 +485,14 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms,
fprintf(out, " arg%d = \"\";\n", argIndex);
fprintf(out, " }\n");
}
- fprintf(out, " event << arg%d;\n", argIndex);
+ if (*arg == JAVA_TYPE_BYTE_ARRAY) {
+ fprintf(out,
+ " event.AppendCharArray(arg%d.arg, "
+ "arg%d.arg_length);",
+ argIndex, argIndex);
+ } else {
+ fprintf(out, " event << arg%d;\n", argIndex);
+ }
if (argIndex == 2) {
fprintf(out, " event.end();\n\n");
fprintf(out, " event.end();\n\n");
@@ -577,7 +575,9 @@ void build_non_chained_decl_map(const Atoms& atoms,
static void write_cpp_usage(
FILE* out, const string& method_name, const string& atom_code_name,
const AtomDecl& atom, const AtomDecl &attributionDecl) {
- fprintf(out, " * Usage: %s(StatsLog.%s", method_name.c_str(), atom_code_name.c_str());
+ fprintf(out, " * Usage: %s(StatsLog.%s", method_name.c_str(),
+ atom_code_name.c_str());
+
for (vector<AtomField>::const_iterator field = atom.fields.begin();
field != atom.fields.end(); field++) {
if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
@@ -601,11 +601,6 @@ static void write_cpp_usage(
field->name.c_str(),
field->name.c_str(),
field->name.c_str());
- } else if (field->javaType == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", %s %s, size_t %s_length",
- cpp_type_name(field->javaType), field->name.c_str(),
- field->name.c_str());
-
} else {
fprintf(out, ", %s %s", cpp_type_name(field->javaType), field->name.c_str());
}
@@ -639,9 +634,6 @@ static void write_cpp_method_header(
"const std::map<int, char const*>& arg%d_3, "
"const std::map<int, float>& arg%d_4",
argIndex, argIndex, argIndex, argIndex);
- } else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", %s arg%d, size_t arg%d_length",
- cpp_type_name(*arg), argIndex, argIndex);
} else {
fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex);
}
@@ -708,6 +700,15 @@ write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl &attributio
fprintf(out, "};\n");
fprintf(out, "\n");
+ fprintf(out, "struct BytesField {\n");
+ fprintf(out,
+ " BytesField(char const* array, size_t len) : arg(array), "
+ "arg_length(len) {}\n");
+ fprintf(out, " char const* arg;\n");
+ fprintf(out, " size_t arg_length;\n");
+ fprintf(out, "};\n");
+ fprintf(out, "\n");
+
fprintf(out, "struct StateAtomFieldOptions {\n");
fprintf(out, " std::vector<int> primaryFields;\n");
fprintf(out, " int exclusiveField;\n");
@@ -775,6 +776,7 @@ static void write_java_method(
const AtomDecl &attributionDecl) {
for (set<vector<java_type_t>>::const_iterator signature = signatures.begin();
signature != signatures.end(); signature++) {
+ fprintf(out, " /** @hide */\n");
fprintf(out, " public static native int %s(int code", method_name.c_str());
int argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
@@ -820,6 +822,7 @@ static void write_java_work_source_method(FILE* out, const set<vector<java_type_
}
// Method header (signature)
+ fprintf(out, " /** @hide */\n");
fprintf(out, " public static void write(int code");
int argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
@@ -900,6 +903,7 @@ write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionD
if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) {
write_java_usage(out, "write_non_chained", constant, *non_chained_decl->second);
}
+ fprintf(out, " * @hide\n");
fprintf(out, " */\n");
fprintf(out, " public static final int %s = %d;\n", constant.c_str(), atom->code);
}
@@ -916,6 +920,7 @@ write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionD
field->name.c_str());
for (map<int, string>::const_iterator value = field->enumValues.begin();
value != field->enumValues.end(); value++) {
+ fprintf(out, " /** @hide */\n");
fprintf(out, " public static final int %s__%s__%s = %d;\n",
make_constant_name(atom->message).c_str(),
make_constant_name(field->name).c_str(),
@@ -1179,6 +1184,11 @@ write_stats_log_jni(FILE* out, const string& java_method_name, const string& cpp
fprintf(out, " str%d = NULL;\n", argIndex);
fprintf(out, " }\n");
+ fprintf(out,
+ " android::util::BytesField bytesField%d(str%d, "
+ "str%d_length);",
+ argIndex, argIndex, argIndex);
+
} else if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
hadStringOrChain = true;
for (auto chainField : attributionDecl.fields) {
@@ -1236,7 +1246,8 @@ write_stats_log_jni(FILE* out, const string& java_method_name, const string& cpp
// stats_write call
argIndex = 1;
- fprintf(out, "\n int ret = android::util::%s(code", cpp_method_name.c_str());
+ fprintf(out, "\n int ret = android::util::%s(code",
+ cpp_method_name.c_str());
for (vector<java_type_t>::const_iterator arg = signature->begin();
arg != signature->end(); arg++) {
if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
@@ -1251,16 +1262,12 @@ write_stats_log_jni(FILE* out, const string& java_method_name, const string& cpp
}
} else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
fprintf(out, ", int32_t_map, int64_t_map, string_map, float_map");
+ } else if (*arg == JAVA_TYPE_BYTE_ARRAY) {
+ fprintf(out, ", bytesField%d", argIndex);
} else {
- const char* argName = (*arg == JAVA_TYPE_STRING ||
- *arg == JAVA_TYPE_BYTE_ARRAY)
- ? "str"
- : "arg";
+ const char* argName =
+ (*arg == JAVA_TYPE_STRING) ? "str" : "arg";
fprintf(out, ", (%s)%s%d", cpp_type_name(*arg), argName, argIndex);
-
- if (*arg == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", %s%d_length", argName, argIndex);
- }
}
argIndex++;
}
diff --git a/tools/streaming_proto/Errors.h b/tools/streaming_proto/Errors.h
index f14bbfd55b5f..bddd9819e8f5 100644
--- a/tools/streaming_proto/Errors.h
+++ b/tools/streaming_proto/Errors.h
@@ -11,7 +11,7 @@ using namespace std;
struct Error
{
Error();
- explicit Error(const Error& that);
+ Error(const Error& that);
Error(const string& filename, int lineno, const char* message);
string filename;
diff --git a/wifi/java/android/net/wifi/DppStatusCallback.java b/wifi/java/android/net/wifi/DppStatusCallback.java
deleted file mode 100644
index fa2ab30ef479..000000000000
--- a/wifi/java/android/net/wifi/DppStatusCallback.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.SystemApi;
-import android.os.Handler;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * DPP Status Callback. Use this callback to get status updates (success, failure, progress)
- * from the DPP operation started with {@link WifiManager#startDppAsConfiguratorInitiator(String,
- * int, int, Handler, DppStatusCallback)} or {@link WifiManager#startDppAsEnrolleeInitiator(String,
- * Handler, DppStatusCallback)}
- * @hide
- */
-@SystemApi
-public abstract class DppStatusCallback {
- /**
- * DPP Success event: Configuration sent (Configurator mode).
- */
- public static final int DPP_EVENT_SUCCESS_CONFIGURATION_SENT = 0;
-
- /** @hide */
- @IntDef(prefix = { "DPP_EVENT_SUCCESS_" }, value = {
- DPP_EVENT_SUCCESS_CONFIGURATION_SENT,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface DppSuccessStatusCode {}
-
- /**
- * DPP Progress event: Initial authentication with peer succeeded.
- */
- public static final int DPP_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0;
-
- /**
- * DPP Progress event: Peer requires more time to process bootstrapping.
- */
- public static final int DPP_EVENT_PROGRESS_RESPONSE_PENDING = 1;
-
- /** @hide */
- @IntDef(prefix = { "DPP_EVENT_PROGRESS_" }, value = {
- DPP_EVENT_PROGRESS_AUTHENTICATION_SUCCESS,
- DPP_EVENT_PROGRESS_RESPONSE_PENDING,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface DppProgressStatusCode {}
-
- /**
- * DPP Failure event: Scanned QR code is either not a DPP URI, or the DPP URI has errors.
- */
- public static final int DPP_EVENT_FAILURE_INVALID_URI = -1;
-
- /**
- * DPP Failure event: Bootstrapping/Authentication initialization process failure.
- */
- public static final int DPP_EVENT_FAILURE_AUTHENTICATION = -2;
-
- /**
- * DPP Failure event: Both devices are implementing the same role and are incompatible.
- */
- public static final int DPP_EVENT_FAILURE_NOT_COMPATIBLE = -3;
-
- /**
- * DPP Failure event: Configuration process has failed due to malformed message.
- */
- public static final int DPP_EVENT_FAILURE_CONFIGURATION = -4;
-
- /**
- * DPP Failure event: DPP request while in another DPP exchange.
- */
- public static final int DPP_EVENT_FAILURE_BUSY = -5;
-
- /**
- * DPP Failure event: No response from the peer.
- */
- public static final int DPP_EVENT_FAILURE_TIMEOUT = -6;
-
- /**
- * DPP Failure event: General protocol failure.
- */
- public static final int DPP_EVENT_FAILURE = -7;
-
- /**
- * DPP Failure event: Feature or option is not supported.
- */
- public static final int DPP_EVENT_FAILURE_NOT_SUPPORTED = -8;
-
- /**
- * DPP Failure event: Invalid network provided to DPP configurator.
- * Network must either be WPA3-Personal (SAE) or WPA2-Personal (PSK).
- */
- public static final int DPP_EVENT_FAILURE_INVALID_NETWORK = -9;
-
-
- /** @hide */
- @IntDef(prefix = {"DPP_EVENT_FAILURE_"}, value = {
- DPP_EVENT_FAILURE_INVALID_URI,
- DPP_EVENT_FAILURE_AUTHENTICATION,
- DPP_EVENT_FAILURE_NOT_COMPATIBLE,
- DPP_EVENT_FAILURE_CONFIGURATION,
- DPP_EVENT_FAILURE_BUSY,
- DPP_EVENT_FAILURE_TIMEOUT,
- DPP_EVENT_FAILURE,
- DPP_EVENT_FAILURE_NOT_SUPPORTED,
- DPP_EVENT_FAILURE_INVALID_NETWORK,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface DppFailureStatusCode {
- }
-
- /**
- * Called when local DPP Enrollee successfully receives a new Wi-Fi configuration from the
- * peer DPP configurator. This callback marks the successful end of the DPP current DPP
- * session, and no further callbacks will be called. This callback is the successful outcome
- * of a DPP flow starting with {@link WifiManager#startDppAsEnrolleeInitiator(String, Handler,
- * DppStatusCallback)}.
- *
- * @param newNetworkId New Wi-Fi configuration with a network ID received from the configurator
- */
- public abstract void onEnrolleeSuccess(int newNetworkId);
-
- /**
- * Called when a DPP success event takes place, except for when configuration is received from
- * an external Configurator. The callback onSuccessConfigReceived will be used in this case.
- * This callback marks the successful end of the current DPP session, and no further
- * callbacks will be called. This callback is the successful outcome of a DPP flow starting with
- * {@link WifiManager#startDppAsConfiguratorInitiator(String, int, int, Handler,
- * DppStatusCallback)}.
- *
- * @param code DPP success status code.
- */
- public abstract void onConfiguratorSuccess(@DppSuccessStatusCode int code);
-
- /**
- * Called when a DPP Failure event takes place. This callback marks the unsuccessful end of the
- * current DPP session, and no further callbacks will be called.
- *
- * @param code DPP failure status code.
- */
- public abstract void onFailure(@DppFailureStatusCode int code);
-
- /**
- * Called when DPP events that indicate progress take place. Can be used by UI elements
- * to show progress.
- *
- * @param code DPP progress status code.
- */
- public abstract void onProgress(@DppProgressStatusCode int code);
-}
diff --git a/wifi/java/android/net/wifi/EasyConnectStatusCallback.java b/wifi/java/android/net/wifi/EasyConnectStatusCallback.java
new file mode 100644
index 000000000000..b8c82fd9e0ae
--- /dev/null
+++ b/wifi/java/android/net/wifi/EasyConnectStatusCallback.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi;
+
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
+import android.os.Handler;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Easy Connect (DPP) Status Callback. Use this callback to get status updates (success, failure,
+ * progress) from the Easy Connect operation started with
+ * {@link WifiManager#startEasyConnectAsConfiguratorInitiator(String,
+ * int, int, Handler, EasyConnectStatusCallback)} or
+ * {@link WifiManager#startEasyConnectAsEnrolleeInitiator(String,
+ * Handler, EasyConnectStatusCallback)}
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class EasyConnectStatusCallback {
+ /**
+ * Easy Connect Success event: Configuration sent (Configurator mode).
+ */
+ public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0;
+
+ /** @hide */
+ @IntDef(prefix = {"EASY_CONNECT_EVENT_SUCCESS_"}, value = {
+ EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface EasyConnectSuccessStatusCode {
+ }
+
+ /**
+ * Easy Connect Progress event: Initial authentication with peer succeeded.
+ */
+ public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0;
+
+ /**
+ * Easy Connect Progress event: Peer requires more time to process bootstrapping.
+ */
+ public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1;
+
+ /** @hide */
+ @IntDef(prefix = {"EASY_CONNECT_EVENT_PROGRESS_"}, value = {
+ EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS,
+ EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface EasyConnectProgressStatusCode {
+ }
+
+ /**
+ * Easy Connect Failure event: Scanned QR code is either not a Easy Connect URI, or the Easy
+ * Connect URI has errors.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_URI = -1;
+
+ /**
+ * Easy Connect Failure event: Bootstrapping/Authentication initialization process failure.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = -2;
+
+ /**
+ * Easy Connect Failure event: Both devices are implementing the same role and are incompatible.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = -3;
+
+ /**
+ * Easy Connect Failure event: Configuration process has failed due to malformed message.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = -4;
+
+ /**
+ * Easy Connect Failure event: Easy Connect request while in another Easy Connect exchange.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_BUSY = -5;
+
+ /**
+ * Easy Connect Failure event: No response from the peer.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6;
+
+ /**
+ * Easy Connect Failure event: General protocol failure.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_GENERIC = -7;
+
+ /**
+ * Easy Connect Failure event: Feature or option is not supported.
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = -8;
+
+ /**
+ * Easy Connect Failure event: Invalid network provided to Easy Connect configurator.
+ * Network must either be WPA3-Personal (SAE) or WPA2-Personal (PSK).
+ */
+ public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = -9;
+
+
+ /** @hide */
+ @IntDef(prefix = {"EASY_CONNECT_EVENT_FAILURE_"}, value = {
+ EASY_CONNECT_EVENT_FAILURE_INVALID_URI,
+ EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION,
+ EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE,
+ EASY_CONNECT_EVENT_FAILURE_CONFIGURATION,
+ EASY_CONNECT_EVENT_FAILURE_BUSY,
+ EASY_CONNECT_EVENT_FAILURE_TIMEOUT,
+ EASY_CONNECT_EVENT_FAILURE_GENERIC,
+ EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED,
+ EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface EasyConnectFailureStatusCode {
+ }
+
+ /**
+ * Called when local Easy Connect Enrollee successfully receives a new Wi-Fi configuration from
+ * the
+ * peer Easy Connect configurator. This callback marks the successful end of the Easy Connect
+ * current Easy Connect
+ * session, and no further callbacks will be called. This callback is the successful outcome
+ * of a Easy Connect flow starting with
+ * {@link WifiManager#startEasyConnectAsEnrolleeInitiator(String,
+ * Handler,
+ * EasyConnectStatusCallback)}.
+ *
+ * @param newNetworkId New Wi-Fi configuration with a network ID received from the configurator
+ */
+ public abstract void onEnrolleeSuccess(int newNetworkId);
+
+ /**
+ * Called when a Easy Connect success event takes place, except for when configuration is
+ * received from
+ * an external Configurator. The callback onSuccessConfigReceived will be used in this case.
+ * This callback marks the successful end of the current Easy Connect session, and no further
+ * callbacks will be called. This callback is the successful outcome of a Easy Connect flow
+ * starting with
+ * {@link WifiManager#startEasyConnectAsConfiguratorInitiator(String, int, int, Handler,
+ * EasyConnectStatusCallback)}.
+ *
+ * @param code Easy Connect success status code.
+ */
+ public abstract void onConfiguratorSuccess(@EasyConnectSuccessStatusCode int code);
+
+ /**
+ * Called when a Easy Connect Failure event takes place. This callback marks the unsuccessful
+ * end of the
+ * current Easy Connect session, and no further callbacks will be called.
+ *
+ * @param code Easy Connect failure status code.
+ */
+ public abstract void onFailure(@EasyConnectFailureStatusCode int code);
+
+ /**
+ * Called when Easy Connect events that indicate progress take place. Can be used by UI elements
+ * to show progress.
+ *
+ * @param code Easy Connect progress status code.
+ */
+ public abstract void onProgress(@EasyConnectProgressStatusCode int code);
+}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 5ed368618449..cb265fd46722 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -16,7 +16,6 @@
package android.net.wifi;
-
import android.content.pm.ParceledListSlice;
import android.net.wifi.hotspot2.OsuProvider;
@@ -48,7 +47,7 @@ import android.os.WorkSource;
*/
interface IWifiManager
{
- int getSupportedFeatures();
+ long getSupportedFeatures();
WifiActivityEnergyInfo reportActivityInfo();
@@ -62,11 +61,11 @@ interface IWifiManager
ParceledListSlice getConfiguredNetworks(String packageName);
- ParceledListSlice getPrivilegedConfiguredNetworks();
+ ParceledListSlice getPrivilegedConfiguredNetworks(String packageName);
- List<WifiConfiguration> getAllMatchingWifiConfigs(in List<ScanResult> scanResult);
+ Map getAllMatchingFqdnsForScanResults(in List<ScanResult> scanResult);
- List<OsuProvider> getMatchingOsuProviders(in List<ScanResult> scanResult);
+ Map getMatchingOsuProviders(in List<ScanResult> scanResult);
Map getMatchingPasspointConfigsForOsuProviders(in List<OsuProvider> osuProviders);
@@ -78,6 +77,8 @@ interface IWifiManager
List<PasspointConfiguration> getPasspointConfigurations();
+ List<WifiConfiguration> getWifiConfigsForPasspointProfiles(in List<String> fqdnList);
+
void queryPasspointIcon(long bssid, String fileName);
int matchProviderWithCurrentNetwork(String fqdn);
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 963a42662d55..dd82b715e9a5 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -27,7 +27,6 @@ import android.net.NetworkSpecifier;
import android.net.ProxyInfo;
import android.net.StaticIpConfiguration;
import android.net.Uri;
-import android.net.wifi.WifiInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -150,26 +149,40 @@ public class WifiConfiguration implements Parcelable {
public static final int SUITE_B_192 = 10;
/**
+ * WPA pre-shared key with stronger SHA256-based algorithms.
+ * @hide
+ */
+ public static final int WPA_PSK_SHA256 = 11;
+
+ /**
+ * WPA using EAP authentication with stronger SHA256-based algorithms.
+ * @hide
+ */
+ public static final int WPA_EAP_SHA256 = 12;
+
+ /**
* IEEE 802.11ai FILS SK with SHA256
* @hide
*/
- public static final int FILS_SHA256 = 11;
+ public static final int FILS_SHA256 = 13;
/**
* IEEE 802.11ai FILS SK with SHA384:
* @hide
*/
- public static final int FILS_SHA384 = 12;
+ public static final int FILS_SHA384 = 14;
/**
* Device Provisioning Protocol
* @hide
*/
- public static final int DPP = 13;
+ public static final int DPP = 15;
public static final String varName = "key_mgmt";
public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP",
"IEEE8021X", "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP",
- "SAE", "OWE", "SUITE_B_192", "FILS_SHA256", "FILS_SHA384", "DPP"};
+ "SAE", "OWE", "SUITE_B_192", "FILS_SHA256", "FILS_SHA384",
+ "DPP", "WPA_PSK_SHA256", "WPA_EAP_SHA256",
+ };
}
/**
@@ -522,7 +535,7 @@ public class WifiConfiguration implements Parcelable {
* The set of group management ciphers supported by this configuration.
* See {@link GroupMgmtCipher} for descriptions of the values.
*/
- public BitSet allowedGroupMgmtCiphers;
+ public BitSet allowedGroupManagementCiphers;
/**
* The set of SuiteB ciphers supported by this configuration.
* To be used for WPA3-Enterprise mode.
@@ -975,9 +988,12 @@ public class WifiConfiguration implements Parcelable {
}
/**
- * @hide
* Returns MAC address set to be the local randomized MAC address.
* Does not guarantee that the returned address is valid for use.
+ * <p>
+ * Information is restricted to Device Owner, Profile Owner, and Carrier apps
+ * (which will only obtain addresses for configurations which they create). Other callers
+ * will receive a default "02:00:00:00:00:00" MAC address.
*/
public @NonNull MacAddress getRandomizedMacAddress() {
return mRandomizedMacAddress;
@@ -1697,7 +1713,7 @@ public class WifiConfiguration implements Parcelable {
allowedAuthAlgorithms = new BitSet();
allowedPairwiseCiphers = new BitSet();
allowedGroupCiphers = new BitSet();
- allowedGroupMgmtCiphers = new BitSet();
+ allowedGroupManagementCiphers = new BitSet();
allowedSuiteBCiphers = new BitSet();
wepKeys = new String[4];
for (int i = 0; i < wepKeys.length; i++) {
@@ -1894,8 +1910,8 @@ public class WifiConfiguration implements Parcelable {
}
sbuf.append('\n');
sbuf.append(" GroupMgmtCiphers:");
- for (int gmc = 0; gmc < this.allowedGroupMgmtCiphers.size(); gmc++) {
- if (this.allowedGroupMgmtCiphers.get(gmc)) {
+ for (int gmc = 0; gmc < this.allowedGroupManagementCiphers.size(); gmc++) {
+ if (this.allowedGroupManagementCiphers.get(gmc)) {
sbuf.append(" ");
if (gmc < GroupMgmtCipher.strings.length) {
sbuf.append(GroupMgmtCipher.strings[gmc]);
@@ -1957,6 +1973,7 @@ public class WifiConfiguration implements Parcelable {
if (creatorName != null) sbuf.append(" cname=" + creatorName);
if (lastUpdateUid != 0) sbuf.append(" luid=" + lastUpdateUid);
if (lastUpdateName != null) sbuf.append(" lname=" + lastUpdateName);
+ if (updateIdentifier != null) sbuf.append(" updateIdentifier=" + updateIdentifier);
sbuf.append(" lcuid=" + lastConnectUid);
sbuf.append(" userApproved=" + userApprovedAsString(userApproved));
sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected);
@@ -2313,7 +2330,7 @@ public class WifiConfiguration implements Parcelable {
allowedAuthAlgorithms = (BitSet) source.allowedAuthAlgorithms.clone();
allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
allowedGroupCiphers = (BitSet) source.allowedGroupCiphers.clone();
- allowedGroupMgmtCiphers = (BitSet) source.allowedGroupMgmtCiphers.clone();
+ allowedGroupManagementCiphers = (BitSet) source.allowedGroupManagementCiphers.clone();
allowedSuiteBCiphers = (BitSet) source.allowedSuiteBCiphers.clone();
enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
@@ -2365,6 +2382,7 @@ public class WifiConfiguration implements Parcelable {
macRandomizationSetting = source.macRandomizationSetting;
requirePMF = source.requirePMF;
+ updateIdentifier = source.updateIdentifier;
}
}
@@ -2401,7 +2419,7 @@ public class WifiConfiguration implements Parcelable {
writeBitSet(dest, allowedAuthAlgorithms);
writeBitSet(dest, allowedPairwiseCiphers);
writeBitSet(dest, allowedGroupCiphers);
- writeBitSet(dest, allowedGroupMgmtCiphers);
+ writeBitSet(dest, allowedGroupManagementCiphers);
writeBitSet(dest, allowedSuiteBCiphers);
dest.writeParcelable(enterpriseConfig, flags);
@@ -2478,7 +2496,7 @@ public class WifiConfiguration implements Parcelable {
config.allowedAuthAlgorithms = readBitSet(in);
config.allowedPairwiseCiphers = readBitSet(in);
config.allowedGroupCiphers = readBitSet(in);
- config.allowedGroupMgmtCiphers = readBitSet(in);
+ config.allowedGroupManagementCiphers = readBitSet(in);
config.allowedSuiteBCiphers = readBitSet(in);
config.enterpriseConfig = in.readParcelable(null);
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 7cdd16a6a4ed..35fba3dcf7cf 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -16,6 +16,7 @@
package android.net.wifi;
+import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkUtils;
@@ -93,12 +94,22 @@ public class WifiInfo implements Parcelable {
private int mRssi;
/**
- * Link speed in Mbps
+ * The unit in which links speeds are expressed.
*/
public static final String LINK_SPEED_UNITS = "Mbps";
private int mLinkSpeed;
/**
+ * Tx(transmit) Link speed in Mbps
+ */
+ private int mTxLinkSpeed;
+
+ /**
+ * Rx(receive) Link speed in Mbps
+ */
+ private int mRxLinkSpeed;
+
+ /**
* Frequency in MHz
*/
public static final String FREQUENCY_UNITS = "MHz";
@@ -114,6 +125,11 @@ public class WifiInfo implements Parcelable {
private boolean mTrusted;
/**
+ * OSU (Online Sign Up) AP for Passpoint R2.
+ */
+ private boolean mOsuAp;
+
+ /**
* Running total count of lost (not ACKed) transmitted unicast data packets.
* @hide
*/
@@ -187,9 +203,12 @@ public class WifiInfo implements Parcelable {
setNetworkId(-1);
setRssi(INVALID_RSSI);
setLinkSpeed(-1);
+ setTxLinkSpeedMbps(-1);
+ setRxLinkSpeedMbps(-1);
setFrequency(-1);
setMeteredHint(false);
setEphemeral(false);
+ setOsuAp(false);
txBad = 0;
txSuccess = 0;
rxSuccess = 0;
@@ -213,12 +232,15 @@ public class WifiInfo implements Parcelable {
mNetworkId = source.mNetworkId;
mRssi = source.mRssi;
mLinkSpeed = source.mLinkSpeed;
+ mTxLinkSpeed = source.mTxLinkSpeed;
+ mRxLinkSpeed = source.mRxLinkSpeed;
mFrequency = source.mFrequency;
mIpAddress = source.mIpAddress;
mMacAddress = source.mMacAddress;
mMeteredHint = source.mMeteredHint;
mEphemeral = source.mEphemeral;
mTrusted = source.mTrusted;
+ mOsuAp = source.mOsuAp;
txBad = source.txBad;
txRetries = source.txRetries;
txSuccess = source.txSuccess;
@@ -306,7 +328,7 @@ public class WifiInfo implements Parcelable {
/**
* Returns the current link speed in {@link #LINK_SPEED_UNITS}.
- * @return the link speed.
+ * @return the link speed or -1 if there is no valid value.
* @see #LINK_SPEED_UNITS
*/
public int getLinkSpeed() {
@@ -316,7 +338,39 @@ public class WifiInfo implements Parcelable {
/** @hide */
@UnsupportedAppUsage
public void setLinkSpeed(int linkSpeed) {
- this.mLinkSpeed = linkSpeed;
+ mLinkSpeed = linkSpeed;
+ }
+
+ /**
+ * Returns the current transmit link speed in Mbps.
+ * @return the Tx link speed or -1 if there is no valid value.
+ */
+ public int getTxLinkSpeedMbps() {
+ return mTxLinkSpeed;
+ }
+
+ /**
+ * Update the last transmitted packet bit rate in Mbps.
+ * @hide
+ */
+ public void setTxLinkSpeedMbps(int txLinkSpeed) {
+ mTxLinkSpeed = txLinkSpeed;
+ }
+
+ /**
+ * Returns the current receive link speed in Mbps.
+ * @return the Rx link speed or -1 if there is no valid value.
+ */
+ public int getRxLinkSpeedMbps() {
+ return mRxLinkSpeed;
+ }
+
+ /**
+ * Update the last received packet bit rate in Mbps.
+ * @hide
+ */
+ public void setRxLinkSpeedMbps(int rxLinkSpeed) {
+ mRxLinkSpeed = rxLinkSpeed;
}
/**
@@ -411,6 +465,16 @@ public class WifiInfo implements Parcelable {
return mTrusted;
}
+ /** {@hide} */
+ public void setOsuAp(boolean osuAp) {
+ mOsuAp = osuAp;
+ }
+
+ /** {@hide} */
+ @SystemApi
+ public boolean isOsuAp() {
+ return mOsuAp;
+ }
/** @hide */
@UnsupportedAppUsage
@@ -513,17 +577,19 @@ public class WifiInfo implements Parcelable {
StringBuffer sb = new StringBuffer();
String none = "<none>";
- sb.append("SSID: ").append(mWifiSsid == null ? WifiSsid.NONE : mWifiSsid).
- append(", BSSID: ").append(mBSSID == null ? none : mBSSID).
- append(", MAC: ").append(mMacAddress == null ? none : mMacAddress).
- append(", Supplicant state: ").
- append(mSupplicantState == null ? none : mSupplicantState).
- append(", RSSI: ").append(mRssi).
- append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS).
- append(", Frequency: ").append(mFrequency).append(FREQUENCY_UNITS).
- append(", Net ID: ").append(mNetworkId).
- append(", Metered hint: ").append(mMeteredHint).
- append(", score: ").append(Integer.toString(score));
+ sb.append("SSID: ").append(mWifiSsid == null ? WifiSsid.NONE : mWifiSsid)
+ .append(", BSSID: ").append(mBSSID == null ? none : mBSSID)
+ .append(", MAC: ").append(mMacAddress == null ? none : mMacAddress)
+ .append(", Supplicant state: ")
+ .append(mSupplicantState == null ? none : mSupplicantState)
+ .append(", RSSI: ").append(mRssi)
+ .append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS)
+ .append(", Tx Link speed: ").append(mTxLinkSpeed).append(LINK_SPEED_UNITS)
+ .append(", Rx Link speed: ").append(mRxLinkSpeed).append(LINK_SPEED_UNITS)
+ .append(", Frequency: ").append(mFrequency).append(FREQUENCY_UNITS)
+ .append(", Net ID: ").append(mNetworkId)
+ .append(", Metered hint: ").append(mMeteredHint)
+ .append(", score: ").append(Integer.toString(score));
return sb.toString();
}
@@ -537,6 +603,8 @@ public class WifiInfo implements Parcelable {
dest.writeInt(mNetworkId);
dest.writeInt(mRssi);
dest.writeInt(mLinkSpeed);
+ dest.writeInt(mTxLinkSpeed);
+ dest.writeInt(mRxLinkSpeed);
dest.writeInt(mFrequency);
if (mIpAddress != null) {
dest.writeByte((byte)1);
@@ -565,6 +633,7 @@ public class WifiInfo implements Parcelable {
dest.writeLong(rxSuccess);
dest.writeDouble(rxSuccessRate);
mSupplicantState.writeToParcel(dest, flags);
+ dest.writeInt(mOsuAp ? 1 : 0);
}
/** Implement the Parcelable interface {@hide} */
@@ -576,6 +645,8 @@ public class WifiInfo implements Parcelable {
info.setNetworkId(in.readInt());
info.setRssi(in.readInt());
info.setLinkSpeed(in.readInt());
+ info.setTxLinkSpeedMbps(in.readInt());
+ info.setRxLinkSpeedMbps(in.readInt());
info.setFrequency(in.readInt());
if (in.readByte() == 1) {
try {
@@ -600,6 +671,7 @@ public class WifiInfo implements Parcelable {
info.rxSuccess = in.readLong();
info.rxSuccessRate = in.readDouble();
info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in);
+ info.mOsuAp = in.readInt() != 0;
return info;
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 5bbd2687a442..c46e322052a6 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -16,6 +16,11 @@
package android.net.wifi;
+import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
+import static android.Manifest.permission.ACCESS_WIFI_STATE;
+import static android.Manifest.permission.READ_WIFI_CREDENTIAL;
+
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -44,6 +49,7 @@ import android.os.Messenger;
import android.os.RemoteException;
import android.os.WorkSource;
import android.util.Log;
+import android.util.Pair;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -63,6 +69,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
/**
* This class provides the primary API for managing all aspects of Wi-Fi
@@ -184,6 +191,7 @@ public class WifiManager {
*/
public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5;
+ /** @hide */
@IntDef(prefix = { "STATUS_NETWORK_SUGGESTIONS_" }, value = {
STATUS_NETWORK_SUGGESTIONS_SUCCESS,
STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL,
@@ -242,6 +250,14 @@ public class WifiManager {
@SystemApi
public static final int WIFI_CREDENTIAL_FORGOT = 1;
+ /** @hide */
+ @SystemApi
+ public static final int PASSPOINT_HOME_NETWORK = 0;
+
+ /** @hide */
+ @SystemApi
+ public static final int PASSPOINT_ROAMING_NETWORK = 1;
+
/**
* Broadcast intent action indicating that a Passpoint provider icon has been received.
*
@@ -1196,6 +1212,10 @@ public class WifiManager {
/**
* Return a list of all the networks configured for the current foreground
* user.
+ *
+ * Requires the same permissions as {@link #getScanResults}.
+ * If such access is not allowed, this API will always return an empty list.
+ *
* Not all fields of WifiConfiguration are returned. Only the following
* fields are filled in:
* <ul>
@@ -1219,9 +1239,12 @@ public class WifiManager {
* {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
* when auto-connecting to wifi.
* <b>Compatibility Note:</b> For applications targeting
- * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return an empty list.
+ * {@link android.os.Build.VERSION_CODES#Q} or above, this API will return an empty list,
+ * except to callers with Carrier privilege which will receive a restricted list only
+ * containing configurations which they created.
*/
@Deprecated
+ @RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_WIFI_STATE})
public List<WifiConfiguration> getConfiguredNetworks() {
try {
ParceledListSlice<WifiConfiguration> parceledList =
@@ -1237,11 +1260,11 @@ public class WifiManager {
/** @hide */
@SystemApi
- @RequiresPermission(android.Manifest.permission.READ_WIFI_CREDENTIAL)
+ @RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_WIFI_STATE, READ_WIFI_CREDENTIAL})
public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
try {
ParceledListSlice<WifiConfiguration> parceledList =
- mService.getPrivilegedConfiguredNetworks();
+ mService.getPrivilegedConfiguredNetworks(mContext.getOpPackageName());
if (parceledList == null) {
return Collections.emptyList();
}
@@ -1252,25 +1275,47 @@ public class WifiManager {
}
/**
- * Returns all matching WifiConfigurations for a given list of ScanResult.
+ * Returns a list of all matching WifiConfigurations for a given list of ScanResult.
*
* An empty list will be returned when no configurations are installed or if no configurations
* match the ScanResult.
-
+ *
* @param scanResults a list of scanResult that represents the BSSID
- * @return A list of {@link WifiConfiguration} that can have duplicate entries.
+ * @return List that consists of {@link WifiConfiguration} and corresponding scanResults per
+ * network type({@link #PASSPOINT_HOME_NETWORK} and {@link #PASSPOINT_ROAMING_NETWORK}).
* @throws UnsupportedOperationException if Passpoint is not enabled on the device.
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
- public List<WifiConfiguration> getAllMatchingWifiConfigs(
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
+ public List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> getAllMatchingWifiConfigs(
@NonNull List<ScanResult> scanResults) {
+ List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> configs = new ArrayList<>();
try {
- return mService.getAllMatchingWifiConfigs(scanResults);
+ Map<String, Map<Integer, List<ScanResult>>> results =
+ mService.getAllMatchingFqdnsForScanResults(
+ scanResults);
+ if (results.isEmpty()) {
+ return configs;
+ }
+ List<WifiConfiguration> wifiConfigurations =
+ mService.getWifiConfigsForPasspointProfiles(
+ new ArrayList<>(results.keySet()));
+ for (WifiConfiguration configuration : wifiConfigurations) {
+ Map<Integer, List<ScanResult>> scanResultsPerNetworkType = results.get(
+ configuration.FQDN);
+ if (scanResultsPerNetworkType != null) {
+ configs.add(Pair.create(configuration, scanResultsPerNetworkType));
+ }
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
+
+ return configs;
}
/**
@@ -1280,12 +1325,17 @@ public class WifiManager {
* An empty list will be returned if no match is found.
*
* @param scanResults a list of ScanResult
- * @return A list of {@link OsuProvider} that does not contain duplicate entries.
+ * @return Map that consists {@link OsuProvider} and a list of matching {@link ScanResult}
* @throws UnsupportedOperationException if Passpoint is not enabled on the device.
* @hide
*/
- @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
- public List<OsuProvider> getMatchingOsuProviders(List<ScanResult> scanResults) {
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
+ public Map<OsuProvider, List<ScanResult>> getMatchingOsuProviders(
+ List<ScanResult> scanResults) {
try {
return mService.getMatchingOsuProviders(scanResults);
} catch (RemoteException e) {
@@ -1306,7 +1356,11 @@ public class WifiManager {
* @throws UnsupportedOperationException if Passpoint is not enabled on the device.
* @hide
*/
- @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
public Map<OsuProvider, PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(
@NonNull Set<OsuProvider> osuProviders) {
try {
@@ -1724,7 +1778,7 @@ public class WifiManager {
* suggestion back using this API.</li>
*
* @param networkSuggestions List of network suggestions provided by the app.
- * @return Status code corresponding to the values in {@link NetworkSuggestionsStatusCode}.
+ * @return Status code for the operation. One of the STATUS_NETWORK_SUGGESTIONS_ values.
* {@link WifiNetworkSuggestion#equals(Object)} any previously provided suggestions by the app.
* @throws {@link SecurityException} if the caller is missing required permissions.
*/
@@ -1745,8 +1799,7 @@ public class WifiManager {
*
* @param networkSuggestions List of network suggestions to be removed. Pass an empty list
* to remove all the previous suggestions provided by the app.
- * @return Status code corresponding to the values in
- * {@link NetworkSuggestionsStatusCode}.
+ * @return Status code for the operation. One of the STATUS_NETWORK_SUGGESTIONS_ values.
* Any matching suggestions are removed from the device and will not be considered for any
* further connection attempts.
*/
@@ -1799,7 +1852,13 @@ public class WifiManager {
* @param fqdn The FQDN of the Passpoint configuration to be removed
* @throws IllegalArgumentException if no configuration is associated with the given FQDN.
* @throws UnsupportedOperationException if Passpoint is not enabled on the device.
+ * @deprecated This is no longer supported.
*/
+ @Deprecated
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
public void removePasspointConfiguration(String fqdn) {
try {
if (!mService.removePasspointConfiguration(fqdn, mContext.getOpPackageName())) {
@@ -1817,7 +1876,13 @@ public class WifiManager {
*
* @return A list of {@link PasspointConfiguration}
* @throws UnsupportedOperationException if Passpoint is not enabled on the device.
+ * @deprecated This is no longer supported.
*/
+ @Deprecated
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
public List<PasspointConfiguration> getPasspointConfigurations() {
try {
return mService.getPasspointConfigurations();
@@ -2127,7 +2192,7 @@ public class WifiManager {
/** @hide */
public static final int WIFI_FEATURE_DPP = 0x80000000; // DPP (Easy-Connect)
- private int getSupportedFeatures() {
+ private long getSupportedFeatures() {
try {
return mService.getSupportedFeatures();
} catch (RemoteException e) {
@@ -2135,7 +2200,7 @@ public class WifiManager {
}
}
- private boolean isFeatureSupported(int feature) {
+ private boolean isFeatureSupported(long feature) {
return (getSupportedFeatures() & feature) == feature;
}
/**
@@ -4428,6 +4493,11 @@ public class WifiManager {
* @param callback {@link ProvisioningCallback} for updates regarding provisioning flow
* @hide
*/
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.NETWORK_SETTINGS,
+ android.Manifest.permission.NETWORK_SETUP_WIZARD
+ })
public void startSubscriptionProvisioning(OsuProvider provider, ProvisioningCallback callback,
@Nullable Handler handler) {
Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper();
@@ -4789,9 +4859,14 @@ public class WifiManager {
}
/**
- * @return true if this device supports Wi-Fi Device Provisioning Protocol (Easy-connect)
+ * Wi-Fi Easy Connect (DPP) introduces standardized mechanisms to simplify the provisioning and
+ * configuration of Wi-Fi devices.
+ * For more details, visit <a href="https://www.wi-fi.org/">https://www.wi-fi.org/</a> and
+ * search for "Easy Connect" or "Device Provisioning Protocol specification".
+ *
+ * @return true if this device supports Wi-Fi Easy-connect (Device Provisioning Protocol)
*/
- public boolean isDppSupported() {
+ public boolean isEasyConnectSupported() {
return isFeatureSupported(WIFI_FEATURE_DPP);
}
@@ -4875,93 +4950,101 @@ public class WifiManager {
}
}
- /* DPP - Device Provisioning Protocol AKA "Easy Connect" */
+ /* Easy Connect - AKA Device Provisioning Protocol (DPP) */
/**
- * DPP Network role: Station.
+ * Easy Connect Network role: Station.
+ *
* @hide
*/
@SystemApi
- public static final int DPP_NETWORK_ROLE_STA = 0;
+ public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0;
/**
- * DPP Network role: Access Point.
+ * Easy Connect Network role: Access Point.
+ *
* @hide
*/
@SystemApi
- public static final int DPP_NETWORK_ROLE_AP = 1;
+ public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1;
/** @hide */
- @IntDef(prefix = {"DPP_NETWORK_ROLE_"}, value = {
- DPP_NETWORK_ROLE_STA,
- DPP_NETWORK_ROLE_AP,
+ @IntDef(prefix = {"EASY_CONNECT_NETWORK_ROLE_"}, value = {
+ EASY_CONNECT_NETWORK_ROLE_STA,
+ EASY_CONNECT_NETWORK_ROLE_AP,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface DppNetworkRole {}
+ public @interface EasyConnectNetworkRole {
+ }
/**
- * Start DPP in Configurator-Initiator role. The current device will initiate DPP bootstrapping
- * with a peer, and configure the peer with the SSID and password of the specified network using
- * the DPP protocol on an encrypted link.
+ * Start Easy Connect (DPP) in Configurator-Initiator role. The current device will initiate
+ * Easy Connect bootstrapping with a peer, and configure the peer with the SSID and password of
+ * the specified network using the Easy Connect protocol on an encrypted link.
*
- * @param enrolleeUri URI of the Enrollee obtained separately (e.g. QR code scanning)
- * @param selectedNetworkId Selected network ID to be sent to the peer
+ * @param enrolleeUri URI of the Enrollee obtained separately (e.g. QR code scanning)
+ * @param selectedNetworkId Selected network ID to be sent to the peer
* @param enrolleeNetworkRole The network role of the enrollee
- * @param callback Callback for status updates
- * @param handler The handler on whose thread to execute the callbacks. Null for main thread.
+ * @param callback Callback for status updates
+ * @param executor The Executor on which to run the callback.
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD})
- public void startDppAsConfiguratorInitiator(@NonNull String enrolleeUri,
- int selectedNetworkId, @DppNetworkRole int enrolleeNetworkRole,
- @Nullable Handler handler, @NonNull DppStatusCallback callback) {
- Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper();
+ public void startEasyConnectAsConfiguratorInitiator(@NonNull String enrolleeUri,
+ int selectedNetworkId, @EasyConnectNetworkRole int enrolleeNetworkRole,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull EasyConnectStatusCallback callback) {
Binder binder = new Binder();
try {
mService.startDppAsConfiguratorInitiator(binder, enrolleeUri, selectedNetworkId,
- enrolleeNetworkRole, new DppCallbackProxy(looper, callback));
+ enrolleeNetworkRole, new EasyConnectCallbackProxy(executor, callback));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Start DPP in Enrollee-Initiator role. The current device will initiate DPP bootstrapping
- * with a peer, and receive the SSID and password from the peer configurator.
+ * Start Easy Connect (DPP) in Enrollee-Initiator role. The current device will initiate Easy
+ * Connect bootstrapping with a peer, and receive the SSID and password from the peer
+ * configurator.
*
* @param configuratorUri URI of the Configurator obtained separately (e.g. QR code scanning)
- * @param callback Callback for status updates
- * @param handler The handler on whose thread to execute the callbacks. Null for main thread.
+ * @param callback Callback for status updates
+ * @param executor The Executor on which to run the callback.
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD})
- public void startDppAsEnrolleeInitiator(@NonNull String configuratorUri,
- @Nullable Handler handler, @NonNull DppStatusCallback callback) {
- Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper();
+ public void startEasyConnectAsEnrolleeInitiator(@NonNull String configuratorUri,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull EasyConnectStatusCallback callback) {
Binder binder = new Binder();
try {
mService.startDppAsEnrolleeInitiator(binder, configuratorUri,
- new DppCallbackProxy(looper, callback));
+ new EasyConnectCallbackProxy(executor, callback));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Stop or abort a current DPP session.
+ * Stop or abort a current Easy Connect (DPP) session. This call, once processed, will
+ * terminate any ongoing transaction, and clean up all associated resources. Caller should not
+ * expect any callbacks once this call is made. However, due to the asynchronous nature of
+ * this call, a callback may be fired if it was already pending in the queue.
+ *
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD})
- public void stopDppSession() {
+ public void stopEasyConnectSession() {
try {
/* Request lower layers to stop/abort and clear resources */
mService.stopDppSession();
@@ -4971,48 +5054,50 @@ public class WifiManager {
}
/**
- * Helper class to support DPP callbacks
+ * Helper class to support Easy Connect (DPP) callbacks
+ *
* @hide
*/
@SystemApi
- private static class DppCallbackProxy extends IDppCallback.Stub {
- private final Handler mHandler;
- private final DppStatusCallback mDppStatusCallback;
+ private static class EasyConnectCallbackProxy extends IDppCallback.Stub {
+ private final Executor mExecutor;
+ private final EasyConnectStatusCallback mEasyConnectStatusCallback;
- DppCallbackProxy(Looper looper, DppStatusCallback dppStatusCallback) {
- mHandler = new Handler(looper);
- mDppStatusCallback = dppStatusCallback;
+ EasyConnectCallbackProxy(Executor executor,
+ EasyConnectStatusCallback easyConnectStatusCallback) {
+ mExecutor = executor;
+ mEasyConnectStatusCallback = easyConnectStatusCallback;
}
@Override
public void onSuccessConfigReceived(int newNetworkId) {
- Log.d(TAG, "DPP onSuccessConfigReceived callback");
- mHandler.post(() -> {
- mDppStatusCallback.onEnrolleeSuccess(newNetworkId);
+ Log.d(TAG, "Easy Connect onSuccessConfigReceived callback");
+ mExecutor.execute(() -> {
+ mEasyConnectStatusCallback.onEnrolleeSuccess(newNetworkId);
});
}
@Override
public void onSuccess(int status) {
- Log.d(TAG, "DPP onSuccess callback");
- mHandler.post(() -> {
- mDppStatusCallback.onConfiguratorSuccess(status);
+ Log.d(TAG, "Easy Connect onSuccess callback");
+ mExecutor.execute(() -> {
+ mEasyConnectStatusCallback.onConfiguratorSuccess(status);
});
}
@Override
public void onFailure(int status) {
- Log.d(TAG, "DPP onFailure callback");
- mHandler.post(() -> {
- mDppStatusCallback.onFailure(status);
+ Log.d(TAG, "Easy Connect onFailure callback");
+ mExecutor.execute(() -> {
+ mEasyConnectStatusCallback.onFailure(status);
});
}
@Override
public void onProgress(int status) {
- Log.d(TAG, "DPP onProgress callback");
- mHandler.post(() -> {
- mDppStatusCallback.onProgress(status);
+ Log.d(TAG, "Easy Connect onProgress callback");
+ mExecutor.execute(() -> {
+ mEasyConnectStatusCallback.onProgress(status);
});
}
}
diff --git a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
index 955e040a46f1..aa1669ee6d94 100644
--- a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
@@ -168,8 +168,9 @@ public final class WifiNetworkAgentSpecifier extends NetworkSpecifier implements
@Override
public String toString() {
StringBuilder sb = new StringBuilder("WifiNetworkAgentSpecifier [");
- sb.append("WifiConfiguration=").append(
- mWifiConfiguration == null ? null : mWifiConfiguration.configKey())
+ sb.append("WifiConfiguration=")
+ .append(", SSID=").append(mWifiConfiguration.SSID)
+ .append(", BSSID=").append(mWifiConfiguration.BSSID)
.append(", mOriginalRequestorUid=").append(mOriginalRequestorUid)
.append("]");
return sb.toString();
@@ -180,4 +181,9 @@ public final class WifiNetworkAgentSpecifier extends NetworkSpecifier implements
throw new IllegalStateException("WifiNetworkAgentSpecifier should never be used "
+ "for requests.");
}
+
+ @Override
+ public NetworkSpecifier redact() {
+ return null;
+ }
}
diff --git a/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java b/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java
index f73b9e5e2a00..ecee5ff0161d 100644
--- a/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java
+++ b/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java
@@ -412,7 +412,7 @@ public class WifiNetworkConfigBuilder {
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
// TODO (b/113878056): Verify these params once we verify SuiteB configuration.
- configuration.allowedGroupMgmtCiphers.set(
+ configuration.allowedGroupManagementCiphers.set(
WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256);
configuration.allowedSuiteBCiphers.set(
WifiConfiguration.SuiteBCipher.ECDHE_ECDSA);
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
index 4348399b404b..6e4eeef4dd55 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -162,11 +162,11 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
@Override
public String toString() {
return new StringBuilder()
- .append("WifiNetworkSpecifierWifiNetworkSpecifier [")
+ .append("WifiNetworkSpecifier [")
.append(", SSID Match pattern=").append(ssidPatternMatcher)
.append(", BSSID Match pattern=").append(bssidPatternMatcher)
- .append(", WifiConfiguration=").append(
- wifiConfiguration == null ? null : wifiConfiguration.configKey())
+ .append(", SSID=").append(wifiConfiguration.SSID)
+ .append(", BSSID=").append(wifiConfiguration.BSSID)
.append(", requestorUid=").append(requestorUid)
.append("]")
.toString();
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 760f1e6bc5e2..3c90eb763e81 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -130,7 +130,8 @@ public final class WifiNetworkSuggestion implements Parcelable {
@Override
public String toString() {
StringBuilder sb = new StringBuilder("WifiNetworkSuggestion [")
- .append(", WifiConfiguration=").append(wifiConfiguration)
+ .append(", SSID=").append(wifiConfiguration.SSID)
+ .append(", BSSID=").append(wifiConfiguration.BSSID)
.append(", isAppInteractionRequired=").append(isAppInteractionRequired)
.append(", isUserInteractionRequired=").append(isUserInteractionRequired)
.append(", suggestorUid=").append(suggestorUid)
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java
index 14263830660f..4bee837d6089 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java
@@ -149,6 +149,11 @@ public class WifiAwareAgentNetworkSpecifier extends NetworkSpecifier implements
"WifiAwareAgentNetworkSpecifier should not be used in network requests");
}
+ @Override
+ public NetworkSpecifier redact() {
+ return null;
+ }
+
private void initialize() {
try {
mDigester = MessageDigest.getInstance("SHA-256");
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
index 26a6c08bee29..1fa1fd521a8e 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
@@ -35,6 +35,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
+import android.text.TextUtils;
import android.util.Log;
import libcore.util.HexEncoding;
@@ -434,6 +435,8 @@ public class WifiAwareManager {
null, // peerMac (not used in this method)
pmk,
passphrase,
+ 0, // no port info for deprecated IB APIs
+ -1, // no transport info for deprecated IB APIs
Process.myUid());
}
@@ -473,6 +476,8 @@ public class WifiAwareManager {
peer,
pmk,
passphrase,
+ 0, // no port info for OOB APIs
+ -1, // no transport protocol info for OOB APIs
Process.myUid());
}
@@ -824,6 +829,8 @@ public class WifiAwareManager {
private PeerHandle mPeerHandle;
private String mPskPassphrase;
private byte[] mPmk;
+ private int mPort = 0; // invalid value
+ private int mTransportProtocol = -1; // invalid value
/**
* Configure the {@link PublishDiscoverySession} or {@link SubscribeDiscoverySession}
@@ -902,6 +909,55 @@ public class WifiAwareManager {
}
/**
+ * Configure the port number which will be used to create a connection over this link. This
+ * configuration should only be done on the server device, e.g. the device creating the
+ * {@link java.net.ServerSocket}.
+ * <p>Notes:
+ * <ul>
+ * <li>The server device must be the Publisher device!
+ * <li>The port information can only be specified on secure links, specified using
+ * {@link #setPskPassphrase(String)}.
+ * </ul>
+ *
+ * @param port A positive integer indicating the port to be used for communication.
+ * @return the current {@link NetworkSpecifierBuilder} builder, enabling chaining of builder
+ * methods.
+ */
+ public @NonNull NetworkSpecifierBuilder setPort(int port) {
+ if (port <= 0 || port > 65535) {
+ throw new IllegalArgumentException("The port must be a positive value (0, 65535]");
+ }
+ mPort = port;
+ return this;
+ }
+
+ /**
+ * Configure the transport protocol which will be used to create a connection over this
+ * link. This configuration should only be done on the server device, e.g. the device
+ * creating the {@link java.net.ServerSocket} for TCP.
+ * <p>Notes:
+ * <ul>
+ * <li>The server device must be the Publisher device!
+ * <li>The transport protocol information can only be specified on secure links,
+ * specified using {@link #setPskPassphrase(String)}.
+ * </ul>
+ * The transport protocol number is assigned by the Internet Assigned Numbers Authority
+ * (IANA) https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml.
+ *
+ * @param transportProtocol The transport protocol to be used for communication.
+ * @return the current {@link NetworkSpecifierBuilder} builder, enabling chaining of builder
+ * methods.
+ */
+ public @NonNull NetworkSpecifierBuilder setTransportProtocol(int transportProtocol) {
+ if (transportProtocol < 0 || transportProtocol > 255) {
+ throw new IllegalArgumentException(
+ "The transport protocol must be in range [0, 255]");
+ }
+ mTransportProtocol = transportProtocol;
+ return this;
+ }
+
+ /**
* Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)}
* for a WiFi Aware connection (link) to the specified peer. The
* {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
@@ -929,6 +985,18 @@ public class WifiAwareManager {
? WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
: WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
+ if (mPort != 0 || mTransportProtocol != -1) {
+ if (role != WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER) {
+ throw new IllegalStateException(
+ "Port and transport protocol information can only "
+ + "be specified on the Publisher device (which is the server");
+ }
+ if (TextUtils.isEmpty(mPskPassphrase) && mPmk == null) {
+ throw new IllegalStateException("Port and transport protocol information can "
+ + "only be specified on a secure link");
+ }
+ }
+
if (role == WIFI_AWARE_DATA_PATH_ROLE_INITIATOR && mPeerHandle == null) {
throw new IllegalStateException("Null peerHandle!?");
}
@@ -936,7 +1004,7 @@ public class WifiAwareManager {
return new WifiAwareNetworkSpecifier(
WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB, role,
mDiscoverySession.mClientId, mDiscoverySession.mSessionId, mPeerHandle.peerId,
- null, mPmk, mPskPassphrase, Process.myUid());
+ null, mPmk, mPskPassphrase, mPort, mTransportProtocol, Process.myUid());
}
}
}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java
index 0f29e081e2a0..b258906df522 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java
@@ -38,17 +38,30 @@ import java.util.Objects;
* android.net.NetworkCapabilities)} callback.
* <p>
* The Wi-Fi Aware-specific network information include the peer's scoped link-local IPv6 address
- * for the Wi-Fi Aware link. The scoped link-local IPv6 can then be used to create a
+ * for the Wi-Fi Aware link, as well as (optionally) the port and transport protocol specified by
+ * the peer.
+ * The scoped link-local IPv6, port, and transport protocol can then be used to create a
* {@link java.net.Socket} connection to the peer.
+ * <p>
+ * Note: these are the peer's IPv6 and port information - not the local device's!
*/
public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
private Inet6Address mIpv6Addr;
+ private int mPort = 0; // a value of 0 is considered invalid
+ private int mTransportProtocol = -1; // a value of -1 is considered invalid
/** @hide */
public WifiAwareNetworkInfo(Inet6Address ipv6Addr) {
mIpv6Addr = ipv6Addr;
}
+ /** @hide */
+ public WifiAwareNetworkInfo(Inet6Address ipv6Addr, int port, int transportProtocol) {
+ mIpv6Addr = ipv6Addr;
+ mPort = port;
+ mTransportProtocol = transportProtocol;
+ }
+
/**
* Get the scoped link-local IPv6 address of the Wi-Fi Aware peer (not of the local device!).
*
@@ -59,6 +72,34 @@ public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
return mIpv6Addr;
}
+ /**
+ * Get the port number to be used to create a network connection to the Wi-Fi Aware peer.
+ * The port information is provided by the app running on the peer which requested the
+ * connection, using the {@link WifiAwareManager.NetworkSpecifierBuilder#setPort(int)}.
+ *
+ * @return A port number on the peer. A value of 0 indicates that no port was specified by the
+ * peer.
+ */
+ public int getPort() {
+ return mPort;
+ }
+
+ /**
+ * Get the transport protocol to be used to communicate over a network connection to the Wi-Fi
+ * Aware peer. The transport protocol is provided by the app running on the peer which requested
+ * the connection, using the
+ * {@link WifiAwareManager.NetworkSpecifierBuilder#setTransportProtocol(int)}.
+ * <p>
+ * The transport protocol number is assigned by the Internet Assigned Numbers Authority
+ * (IANA) https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml.
+ *
+ * @return A transport protocol id. A value of -1 indicates that no transport protocol was
+ * specified by the peer.
+ */
+ public int getTransportProtocol() {
+ return mTransportProtocol;
+ }
+
// parcelable methods
@Override
@@ -71,6 +112,8 @@ public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
dest.writeByteArray(mIpv6Addr.getAddress());
NetworkInterface ni = mIpv6Addr.getScopedInterface();
dest.writeString(ni == null ? null : ni.getName());
+ dest.writeInt(mPort);
+ dest.writeInt(mTransportProtocol);
}
public static final Creator<WifiAwareNetworkInfo> CREATOR =
@@ -94,8 +137,10 @@ public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
e.printStackTrace();
return null;
}
+ int port = in.readInt();
+ int transportProtocol = in.readInt();
- return new WifiAwareNetworkInfo(ipv6Addr);
+ return new WifiAwareNetworkInfo(ipv6Addr, port, transportProtocol);
}
@Override
@@ -109,7 +154,9 @@ public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
@Override
public String toString() {
- return new StringBuilder("AwareNetworkInfo: IPv6=").append(mIpv6Addr).toString();
+ return new StringBuilder("AwareNetworkInfo: IPv6=").append(mIpv6Addr).append(
+ ", port=").append(mPort).append(", transportProtocol=").append(
+ mTransportProtocol).toString();
}
/** @hide */
@@ -124,12 +171,13 @@ public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
}
WifiAwareNetworkInfo lhs = (WifiAwareNetworkInfo) obj;
- return Objects.equals(mIpv6Addr, lhs.mIpv6Addr);
+ return Objects.equals(mIpv6Addr, lhs.mIpv6Addr) && mPort == lhs.mPort
+ && mTransportProtocol == lhs.mTransportProtocol;
}
/** @hide */
@Override
public int hashCode() {
- return Objects.hash(mIpv6Addr);
+ return Objects.hash(mIpv6Addr, mPort, mTransportProtocol);
}
}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java
index 6e37fcf4d338..a93a6d58a3ec 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java
@@ -19,7 +19,6 @@ package android.net.wifi.aware;
import android.net.NetworkSpecifier;
import android.os.Parcel;
import android.os.Parcelable;
-import android.util.Log;
import java.util.Arrays;
import java.util.Objects;
@@ -117,6 +116,32 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
public final String passphrase;
/**
+ * The port information to be used for this link. This information will be communicated to the
+ * peer as part of the layer 2 link setup.
+ *
+ * Information only allowed on secure links since a single layer-2 link is set up for all
+ * requestors. Therefore if multiple apps on a single device request links to the same peer
+ * device they all get the same link. However, the link is only set up on the first request -
+ * hence only the first can transmit the port information. But we don't want to expose that
+ * information to other apps. Limiting to secure links would (usually) imply single app usage.
+ *
+ * @hide
+ */
+ public final int port;
+
+ /**
+ * The transport protocol information to be used for this link. This information will be
+ * communicated to the peer as part of the layer 2 link setup.
+ *
+ * Information only allowed on secure links since a single layer-2 link is set up for all
+ * requestors. Therefore if multiple apps on a single device request links to the same peer
+ * device they all get the same link. However, the link is only set up on the first request -
+ * hence only the first can transmit the port information. But we don't want to expose that
+ * information to other apps. Limiting to secure links would (usually) imply single app usage.
+ */
+ public final int transportProtocol;
+
+ /**
* The UID of the process initializing this network specifier. Validated by receiver using
* checkUidIfNecessary() and is used by satisfiedBy() to determine whether matches the
* offered network.
@@ -127,7 +152,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
/** @hide */
public WifiAwareNetworkSpecifier(int type, int role, int clientId, int sessionId, int peerId,
- byte[] peerMac, byte[] pmk, String passphrase, int requestorUid) {
+ byte[] peerMac, byte[] pmk, String passphrase, int port, int transportProtocol,
+ int requestorUid) {
this.type = type;
this.role = role;
this.clientId = clientId;
@@ -136,6 +162,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
this.peerMac = peerMac;
this.pmk = pmk;
this.passphrase = passphrase;
+ this.port = port;
+ this.transportProtocol = transportProtocol;
this.requestorUid = requestorUid;
}
@@ -152,6 +180,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
in.createByteArray(), // peerMac
in.createByteArray(), // pmk
in.readString(), // passphrase
+ in.readInt(), // port
+ in.readInt(), // transportProtocol
in.readInt()); // requestorUid
}
@@ -186,6 +216,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
dest.writeByteArray(peerMac);
dest.writeByteArray(pmk);
dest.writeString(passphrase);
+ dest.writeInt(port);
+ dest.writeInt(transportProtocol);
dest.writeInt(requestorUid);
}
@@ -202,19 +234,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
/** @hide */
@Override
public int hashCode() {
- int result = 17;
-
- result = 31 * result + type;
- result = 31 * result + role;
- result = 31 * result + clientId;
- result = 31 * result + sessionId;
- result = 31 * result + peerId;
- result = 31 * result + Arrays.hashCode(peerMac);
- result = 31 * result + Arrays.hashCode(pmk);
- result = 31 * result + Objects.hashCode(passphrase);
- result = 31 * result + requestorUid;
-
- return result;
+ return Objects.hash(type, role, clientId, sessionId, peerId, Arrays.hashCode(peerMac),
+ Arrays.hashCode(pmk), passphrase, port, transportProtocol, requestorUid);
}
/** @hide */
@@ -238,6 +259,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
&& Arrays.equals(peerMac, lhs.peerMac)
&& Arrays.equals(pmk, lhs.pmk)
&& Objects.equals(passphrase, lhs.passphrase)
+ && port == lhs.port
+ && transportProtocol == lhs.transportProtocol
&& requestorUid == lhs.requestorUid;
}
@@ -256,7 +279,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements
.append(", pmk=").append((pmk == null) ? "<null>" : "<non-null>")
// masking PII
.append(", passphrase=").append((passphrase == null) ? "<null>" : "<non-null>")
- .append(", requestorUid=").append(requestorUid)
+ .append(", port=").append(port).append(", transportProtocol=")
+ .append(transportProtocol).append(", requestorUid=").append(requestorUid)
.append("]");
return sb.toString();
}
diff --git a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
index 6d82ca152202..f91790f5b3b1 100644
--- a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
+++ b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
@@ -16,6 +16,7 @@
package android.net.wifi.hotspot2;
+import android.annotation.SystemApi;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.net.wifi.WifiSsid;
@@ -36,16 +37,19 @@ import java.util.Objects;
*
* @hide
*/
+@SystemApi
public final class OsuProvider implements Parcelable {
/**
* OSU (Online Sign-Up) method: OMA DM (Open Mobile Alliance Device Management).
* For more info, refer to Section 8.3 of the Hotspot 2.0 Release 2 Technical Specification.
+ * @hide
*/
public static final int METHOD_OMA_DM = 0;
/**
* OSU (Online Sign-Up) method: SOAP XML SPP (Subscription Provisioning Protocol).
* For more info, refer to Section 8.4 of the Hotspot 2.0 Release 2 Technical Specification.
+ * @hide
*/
public static final int METHOD_SOAP_XML_SPP = 1;
@@ -84,6 +88,7 @@ public final class OsuProvider implements Parcelable {
*/
private final Icon mIcon;
+ /** @hide */
public OsuProvider(WifiSsid osuSsid, Map<String, String> friendlyNames,
String serviceDescription, Uri serverUri, String nai, List<Integer> methodList,
Icon icon) {
@@ -104,6 +109,7 @@ public final class OsuProvider implements Parcelable {
* Copy constructor.
*
* @param source The source to copy from
+ * @hide
*/
public OsuProvider(OsuProvider source) {
if (source == null) {
@@ -130,10 +136,12 @@ public final class OsuProvider implements Parcelable {
mIcon = source.mIcon;
}
+ /** @hide */
public WifiSsid getOsuSsid() {
return mOsuSsid;
}
+ /** @hide */
public void setOsuSsid(WifiSsid osuSsid) {
mOsuSsid = osuSsid;
}
@@ -162,10 +170,12 @@ public final class OsuProvider implements Parcelable {
return mFriendlyNames.get(mFriendlyNames.keySet().stream().findFirst().get());
}
+ /** @hide */
public Map<String, String> getFriendlyNameList() {
return mFriendlyNames;
}
+ /** @hide */
public String getServiceDescription() {
return mServiceDescription;
}
@@ -174,14 +184,17 @@ public final class OsuProvider implements Parcelable {
return mServerUri;
}
+ /** @hide */
public String getNetworkAccessIdentifier() {
return mNetworkAccessIdentifier;
}
+ /** @hide */
public List<Integer> getMethodList() {
return mMethodList;
}
+ /** @hide */
public Icon getIcon() {
return mIcon;
}
diff --git a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java b/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
index a62d63cd8910..1ee874a9698b 100644
--- a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
+++ b/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
@@ -16,6 +16,7 @@
package android.net.wifi.hotspot2;
+import android.annotation.SystemApi;
import android.net.wifi.WifiManager;
import android.os.Handler;
@@ -25,6 +26,7 @@ import android.os.Handler;
*
* @hide
*/
+@SystemApi
public abstract class ProvisioningCallback {
/**
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
index 7689fc34ff5b..59a7290eb8a9 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
@@ -572,7 +572,7 @@ public final class Credential implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mCertType, mCertSha256Fingerprint);
+ return Objects.hash(mCertType, Arrays.hashCode(mCertSha256Fingerprint));
}
@Override
@@ -842,24 +842,50 @@ public final class Credential implements Parcelable {
}
/**
- * CA (Certificate Authority) X509 certificate.
+ * CA (Certificate Authority) X509 certificates.
*/
- private X509Certificate mCaCertificate = null;
+ private X509Certificate[] mCaCertificates = null;
+
/**
* Set the CA (Certification Authority) certificate associated with this credential.
*
* @param caCertificate The CA certificate to set to
*/
public void setCaCertificate(X509Certificate caCertificate) {
- mCaCertificate = caCertificate;
+ mCaCertificates = null;
+ if (caCertificate != null) {
+ mCaCertificates = new X509Certificate[] {caCertificate};
+ }
}
+
+ /**
+ * Set the CA (Certification Authority) certificates associated with this credential.
+ *
+ * @param caCertificates The list of CA certificates to set to
+ * @hide
+ */
+ public void setCaCertificates(X509Certificate[] caCertificates) {
+ mCaCertificates = caCertificates;
+ }
+
/**
* Get the CA (Certification Authority) certificate associated with this credential.
*
- * @return CA certificate associated with this credential
+ * @return CA certificate associated with this credential, {@code null} if certificate is not
+ * set or certificate is more than one.
*/
public X509Certificate getCaCertificate() {
- return mCaCertificate;
+ return mCaCertificates == null || mCaCertificates.length > 1 ? null : mCaCertificates[0];
+ }
+
+ /**
+ * Get the CA (Certification Authority) certificates associated with this credential.
+ *
+ * @return The list of CA certificates associated with this credential
+ * @hide
+ */
+ public X509Certificate[] getCaCertificates() {
+ return mCaCertificates;
}
/**
@@ -933,7 +959,11 @@ public final class Credential implements Parcelable {
mClientCertificateChain = Arrays.copyOf(source.mClientCertificateChain,
source.mClientCertificateChain.length);
}
- mCaCertificate = source.mCaCertificate;
+ if (source.mCaCertificates != null) {
+ mCaCertificates = Arrays.copyOf(source.mCaCertificates,
+ source.mCaCertificates.length);
+ }
+
mClientPrivateKey = source.mClientPrivateKey;
}
}
@@ -952,7 +982,7 @@ public final class Credential implements Parcelable {
dest.writeParcelable(mUserCredential, flags);
dest.writeParcelable(mCertCredential, flags);
dest.writeParcelable(mSimCredential, flags);
- ParcelUtil.writeCertificate(dest, mCaCertificate);
+ ParcelUtil.writeCertificates(dest, mCaCertificates);
ParcelUtil.writeCertificates(dest, mClientCertificateChain);
ParcelUtil.writePrivateKey(dest, mClientPrivateKey);
}
@@ -977,16 +1007,17 @@ public final class Credential implements Parcelable {
: mCertCredential.equals(that.mCertCredential))
&& (mSimCredential == null ? that.mSimCredential == null
: mSimCredential.equals(that.mSimCredential))
- && isX509CertificateEquals(mCaCertificate, that.mCaCertificate)
+ && isX509CertificatesEquals(mCaCertificates, that.mCaCertificates)
&& isX509CertificatesEquals(mClientCertificateChain, that.mClientCertificateChain)
&& isPrivateKeyEquals(mClientPrivateKey, that.mClientPrivateKey);
}
@Override
public int hashCode() {
- return Objects.hash(mRealm, mCreationTimeInMillis, mExpirationTimeInMillis,
+ return Objects.hash(mCreationTimeInMillis, mExpirationTimeInMillis, mRealm,
mCheckAaaServerCertStatus, mUserCredential, mCertCredential, mSimCredential,
- mCaCertificate, mClientCertificateChain, mClientPrivateKey);
+ mClientPrivateKey, Arrays.hashCode(mCaCertificates),
+ Arrays.hashCode(mClientCertificateChain));
}
@Override
@@ -1067,7 +1098,7 @@ public final class Credential implements Parcelable {
credential.setUserCredential(in.readParcelable(null));
credential.setCertCredential(in.readParcelable(null));
credential.setSimCredential(in.readParcelable(null));
- credential.setCaCertificate(ParcelUtil.readCertificate(in));
+ credential.setCaCertificates(ParcelUtil.readCertificates(in));
credential.setClientCertificateChain(ParcelUtil.readCertificates(in));
credential.setClientPrivateKey(ParcelUtil.readPrivateKey(in));
return credential;
@@ -1100,7 +1131,7 @@ public final class Credential implements Parcelable {
// CA certificate is required for R1 Passpoint profile.
// For R2, it is downloaded using cert URL provided in PPS MO after validation completes.
- if (isR1 && mCaCertificate == null) {
+ if (isR1 && mCaCertificates == null) {
Log.d(TAG, "Missing CA Certificate for user credential");
return false;
}
@@ -1131,7 +1162,7 @@ public final class Credential implements Parcelable {
// Verify required key and certificates for certificate credential.
// CA certificate is required for R1 Passpoint profile.
// For R2, it is downloaded using cert URL provided in PPS MO after validation completes.
- if (isR1 && mCaCertificate == null) {
+ if (isR1 && mCaCertificates == null) {
Log.d(TAG, "Missing CA Certificate for certificate credential");
return false;
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
index 6631fa806fc6..f931ad2bdf6d 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
@@ -223,7 +223,8 @@ public class WifiP2pConfig implements Parcelable {
private MacAddress mDeviceAddress = MAC_ANY_ADDRESS;
private String mNetworkName = "";
private String mPassphrase = "";
- private int mGroupOwnerBand = GROUP_OWNER_BAND_AUTO;
+ private int mGroupOperatingBand = GROUP_OWNER_BAND_AUTO;
+ private int mGroupOperatingFrequency = GROUP_OWNER_BAND_AUTO;
private int mNetId = WifiP2pGroup.TEMPORARY_NET_ID;
/**
@@ -285,22 +286,84 @@ public class WifiP2pConfig implements Parcelable {
}
/**
- * Specify the band to use for creating the group. This method only applies when
- * creating a group as Group Owner using {@link WifiP2pManager#createGroup}.
- * The band should be {@link #GROUP_OWNER_BAND_2GHZ} or {@link #GROUP_OWNER_BAND_5GHZ},
- * or allow the system to pick the band by specifying {@link #GROUP_OWNER_BAND_AUTO}.
+ * Specify the band to use for creating the group or joining the group. The band should
+ * be {@link #GROUP_OWNER_BAND_2GHZ}, {@link #GROUP_OWNER_BAND_5GHZ} or
+ * {@link #GROUP_OWNER_BAND_AUTO}.
+ * <p>
+ * When creating a group as Group Owner using {@link
+ * WifiP2pManager#createGroup(WifiP2pManager.Channel,
+ * WifiP2pConfig, WifiP2pManager.ActionListener)},
+ * specifying {@link #GROUP_OWNER_BAND_AUTO} allows the system to pick the operating
+ * frequency from all supported bands.
+ * Specifying {@link #GROUP_OWNER_BAND_2GHZ} or {@link #GROUP_OWNER_BAND_5GHZ}
+ * only allows the system to pick the operating frequency in the specified band.
* If the Group Owner cannot create a group in the specified band, the operation will fail.
* <p>
+ * When joining a group as Group Client using {@link
+ * WifiP2pManager#connect(WifiP2pManager.Channel, WifiP2pConfig,
+ * WifiP2pManager.ActionListener)},
+ * specifying {@link #GROUP_OWNER_BAND_AUTO} allows the system to scan all supported
+ * frequencies to find the desired group. Specifying {@link #GROUP_OWNER_BAND_2GHZ} or
+ * {@link #GROUP_OWNER_BAND_5GHZ} only allows the system to scan the specified band.
+ * <p>
+ * {@link #setGroupOperatingBand(int)} and {@link #setGroupOperatingFrequency(int)} are
+ * mutually exclusive. Setting operating band and frequency both is invalid.
+ * <p>
* Optional. {@link #GROUP_OWNER_BAND_AUTO} by default.
*
- * @param band the required band of group owner.
+ * @param band the operating band of the group.
* This should be one of {@link #GROUP_OWNER_BAND_AUTO},
* {@link #GROUP_OWNER_BAND_2GHZ}, {@link #GROUP_OWNER_BAND_5GHZ}.
* @return The builder to facilitate chaining
* {@code builder.setXXX(..).setXXX(..)}.
*/
- public Builder setGroupOwnerBand(int band) {
- mGroupOwnerBand = band;
+ public Builder setGroupOperatingBand(@GroupOwnerBandType int band) {
+ switch (band) {
+ case GROUP_OWNER_BAND_AUTO:
+ case GROUP_OWNER_BAND_2GHZ:
+ case GROUP_OWNER_BAND_5GHZ:
+ mGroupOperatingBand = band;
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Invalid constant for the group operating band!");
+ }
+ return this;
+ }
+
+ /**
+ * Specify the frequency to use for creating the group or joining the group.
+ * <p>
+ * When creating a group as Group Owner using {@link WifiP2pManager#createGroup(
+ * WifiP2pManager.Channel, WifiP2pConfig, WifiP2pManager.ActionListener)},
+ * specifying a frequency only allows the system to pick the specified frequency.
+ * If the Group Owner cannot create a group at the specified frequency,
+ * the operation will fail.
+ * When not specifying a frequency, it allows the system to pick operating frequency
+ * from all supported bands.
+ * <p>
+ * When joining a group as Group Client using {@link WifiP2pManager#connect(
+ * WifiP2pManager.Channel, WifiP2pConfig, WifiP2pManager.ActionListener)},
+ * specifying a frequency only allows the system to scan the specified frequency.
+ * If the frequency is not supported or invalid, the operation will fail.
+ * When not specifying a frequency, it allows the system to scan all supported
+ * frequencies to find the desired group.
+ * <p>
+ * {@link #setGroupOperatingBand(int)} and {@link #setGroupOperatingFrequency(int)} are
+ * mutually exclusive. Setting operating band and frequency both is invalid.
+ * <p>
+ * Optional. 0 by default.
+ *
+ * @param frequency the operating frequency of the group.
+ * @return The builder to facilitate chaining
+ * {@code builder.setXXX(..).setXXX(..)}.
+ */
+ public Builder setGroupOperatingFrequency(int frequency) {
+ if (frequency < 0) {
+ throw new IllegalArgumentException(
+ "Invalid group operating frequency!");
+ }
+ mGroupOperatingFrequency = frequency;
return this;
}
@@ -337,11 +400,21 @@ public class WifiP2pConfig implements Parcelable {
"passphrase must be non-empty.");
}
+ if (mGroupOperatingFrequency > 0 && mGroupOperatingBand > 0) {
+ throw new IllegalStateException(
+ "Preferred frequency and band are mutually exclusive.");
+ }
+
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mDeviceAddress.toString();
config.networkName = mNetworkName;
config.passphrase = mPassphrase;
- config.groupOwnerBand = mGroupOwnerBand;
+ config.groupOwnerBand = GROUP_OWNER_BAND_AUTO;
+ if (mGroupOperatingFrequency > 0) {
+ config.groupOwnerBand = mGroupOperatingFrequency;
+ } else if (mGroupOperatingBand > 0) {
+ config.groupOwnerBand = mGroupOperatingBand;
+ }
config.netId = mNetId;
return config;
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
index 01feb1ef5b42..72e57a16712b 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
@@ -17,15 +17,15 @@
package android.net.wifi.p2p;
import android.annotation.UnsupportedAppUsage;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import java.util.ArrayList;
-import java.util.List;
import java.util.Collection;
import java.util.Collections;
-import java.util.regex.Pattern;
+import java.util.List;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* A class representing a Wi-Fi P2p group. A p2p group consists of a single group
@@ -67,6 +67,9 @@ public class WifiP2pGroup implements Parcelable {
/** The network id in the wpa_supplicant */
private int mNetId;
+ /** The frequency used by this group */
+ private int mFrequency;
+
/** P2P group started string pattern */
private static final Pattern groupStartedPattern = Pattern.compile(
"ssid=\"(.+)\" " +
@@ -116,8 +119,9 @@ public class WifiP2pGroup implements Parcelable {
}
mNetworkName = match.group(1);
- //freq and psk are unused right now
- //int freq = Integer.parseInt(match.group(2));
+ // It throws NumberFormatException if the string cannot be parsed as an integer.
+ mFrequency = Integer.parseInt(match.group(2));
+ // psk is unused right now
//String psk = match.group(3);
mPassphrase = match.group(4);
mOwner = new WifiP2pDevice(match.group(5));
@@ -269,6 +273,16 @@ public class WifiP2pGroup implements Parcelable {
this.mNetId = netId;
}
+ /** Get the operating frequency of the p2p group */
+ public int getFrequency() {
+ return mFrequency;
+ }
+
+ /** @hide */
+ public void setFrequency(int freq) {
+ this.mFrequency = freq;
+ }
+
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("network: ").append(mNetworkName);
@@ -279,6 +293,7 @@ public class WifiP2pGroup implements Parcelable {
}
sbuf.append("\n interface: ").append(mInterface);
sbuf.append("\n networkId: ").append(mNetId);
+ sbuf.append("\n frequency: ").append(mFrequency);
return sbuf.toString();
}
@@ -297,6 +312,7 @@ public class WifiP2pGroup implements Parcelable {
mPassphrase = source.getPassphrase();
mInterface = source.getInterface();
mNetId = source.getNetworkId();
+ mFrequency = source.getFrequency();
}
}
@@ -312,6 +328,7 @@ public class WifiP2pGroup implements Parcelable {
dest.writeString(mPassphrase);
dest.writeString(mInterface);
dest.writeInt(mNetId);
+ dest.writeInt(mFrequency);
}
/** Implement the Parcelable interface */
@@ -329,6 +346,7 @@ public class WifiP2pGroup implements Parcelable {
group.setPassphrase(in.readString());
group.setInterface(in.readString());
group.setNetworkId(in.readInt());
+ group.setFrequency(in.readInt());
return group;
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 22f63b542256..1f0b52a835e6 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -1290,7 +1290,16 @@ public class WifiP2pManager {
c.mAsyncChannel.sendMessage(REMOVE_GROUP, 0, c.putListener(listener));
}
- /** @hide */
+ /**
+ * Force p2p to enter or exit listen state
+ *
+ * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}
+ * @param enable enables or disables listening
+ * @param listener for callbacks on success or failure. Can be null.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public void listen(Channel c, boolean enable, ActionListener listener) {
checkChannel(c);
c.mAsyncChannel.sendMessage(enable ? START_LISTEN : STOP_LISTEN,
diff --git a/wifi/java/com/android/server/wifi/AbstractWifiService.java b/wifi/java/com/android/server/wifi/BaseWifiService.java
index e94b9e6c8671..b3ac9f15eb9a 100644
--- a/wifi/java/com/android/server/wifi/AbstractWifiService.java
+++ b/wifi/java/com/android/server/wifi/BaseWifiService.java
@@ -21,6 +21,7 @@ package com.android.server.wifi;
import android.content.pm.ParceledListSlice;
import android.net.DhcpInfo;
import android.net.Network;
+import android.net.wifi.IDppCallback;
import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ITrafficStateCallback;
@@ -35,6 +36,7 @@ import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.os.IBinder;
import android.os.Messenger;
+import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.WorkSource;
@@ -42,7 +44,7 @@ import java.util.List;
import java.util.Map;
/**
- * Abstract class implementing IWifiManager with stub methods throwing runtime exceptions.
+ * Empty concrete class implementing IWifiManager with stub methods throwing runtime exceptions.
*
* This class is meant to be extended by real implementations of IWifiManager in order to facilitate
* cross-repo changes to WiFi internal APIs, including the introduction of new APIs, the removal of
@@ -53,13 +55,16 @@ import java.util.Map;
* then given a short grace period to update themselves before the @Deprecated stub is removed for
* good. If the API scheduled for removal has a replacement or an overload (signature change),
* these should be introduced before the stub is removed to allow children to migrate.
+ *
+ * When a new API is added to IWifiManager.aidl, a stub should be added in BaseWifiService as
+ * well otherwise compilation will fail.
*/
-public abstract class AbstractWifiService extends IWifiManager.Stub {
+public class BaseWifiService extends IWifiManager.Stub {
- private static final String TAG = AbstractWifiService.class.getSimpleName();
+ private static final String TAG = BaseWifiService.class.getSimpleName();
@Override
- public int getSupportedFeatures() {
+ public long getSupportedFeatures() {
throw new UnsupportedOperationException();
}
@@ -79,51 +84,19 @@ public abstract class AbstractWifiService extends IWifiManager.Stub {
}
@Override
- public ParceledListSlice getPrivilegedConfiguredNetworks() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns a WifiConfiguration matching this ScanResult
- * @param scanResult a single ScanResult Object
- * @return
- * @deprecated use {@link #getAllMatchingWifiConfigs(List)} instead.
- */
- @Deprecated
- public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns all matching WifiConfigurations for this ScanResult.
- * @param scanResult a single ScanResult Object
- * @return
- * @deprecated use {@link #getAllMatchingWifiConfigs(List)} instead.
- */
- @Deprecated
- public List<WifiConfiguration> getAllMatchingWifiConfigs(ScanResult scanResult) {
+ public ParceledListSlice getPrivilegedConfiguredNetworks(String packageName) {
throw new UnsupportedOperationException();
}
@Override
- public List<WifiConfiguration> getAllMatchingWifiConfigs(List<ScanResult> scanResults) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns a list of Hotspot 2.0 OSU (Online Sign-Up) providers associated with the given AP.
- *
- * @param scanResult a single ScanResult Object
- * @return
- * @deprecated use {@link #getMatchingOsuProviders(List)} instead.
- */
- @Deprecated
- public List<OsuProvider> getMatchingOsuProviders(ScanResult scanResult) {
+ public Map<String, Map<Integer, List<ScanResult>>> getAllMatchingFqdnsForScanResults(
+ List<ScanResult> scanResults) {
throw new UnsupportedOperationException();
}
@Override
- public List<OsuProvider> getMatchingOsuProviders(List<ScanResult> scanResults) {
+ public Map<OsuProvider, List<ScanResult>> getMatchingOsuProviders(
+ List<ScanResult> scanResults) {
throw new UnsupportedOperationException();
}
@@ -155,6 +128,11 @@ public abstract class AbstractWifiService extends IWifiManager.Stub {
}
@Override
+ public List<WifiConfiguration> getWifiConfigsForPasspointProfiles(List<String> fqdnList) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void queryPasspointIcon(long bssid, String fileName) {
throw new UnsupportedOperationException();
}
@@ -464,4 +442,26 @@ public abstract class AbstractWifiService extends IWifiManager.Stub {
public String[] getFactoryMacAddresses() {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public void setDeviceMobilityState(int state) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void startDppAsConfiguratorInitiator(IBinder binder, String enrolleeUri,
+ int selectedNetworkId, int netRole, IDppCallback callback) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void startDppAsEnrolleeInitiator(IBinder binder, String configuratorUri,
+ IDppCallback callback) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void stopDppSession() throws RemoteException {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index c744f18cf408..7bff68aaaa97 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -59,6 +59,7 @@ public class WifiConfigurationTest {
WifiConfiguration config = new WifiConfiguration();
config.setPasspointManagementObjectTree(cookie);
config.trusted = false;
+ config.updateIdentifier = "1234";
MacAddress macBeforeParcel = config.getOrCreateRandomizedMacAddress();
Parcel parcelW = Parcel.obtain();
config.writeToParcel(parcelW, 0);
@@ -73,6 +74,7 @@ public class WifiConfigurationTest {
// lacking a useful config.equals, check two fields near the end.
assertEquals(cookie, reconfig.getMoTree());
assertEquals(macBeforeParcel, reconfig.getOrCreateRandomizedMacAddress());
+ assertEquals(config.updateIdentifier, reconfig.updateIdentifier);
assertFalse(reconfig.trusted);
Parcel parcelWW = Parcel.obtain();
@@ -251,6 +253,18 @@ public class WifiConfigurationTest {
}
/**
+ * Verifies that updateIdentifier should be copied for copy constructor.
+ */
+ @Test
+ public void testUpdateIdentifierForCopyConstructor() {
+ WifiConfiguration config = new WifiConfiguration();
+ config.updateIdentifier = "1234";
+ WifiConfiguration copyConfig = new WifiConfiguration(config);
+
+ assertEquals(config.updateIdentifier, copyConfig.updateIdentifier);
+ }
+
+ /**
* Verifies that the serialization/de-serialization for softap config works.
*/
@Test
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index fb0af5fbcce3..677bf371c781 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -47,6 +47,7 @@ public class WifiInfoTest {
writeWifiInfo.txBad = TEST_TX_BAD;
writeWifiInfo.rxSuccess = TEST_RX_SUCCESS;
writeWifiInfo.setTrusted(true);
+ writeWifiInfo.setOsuAp(true);
Parcel parcel = Parcel.obtain();
writeWifiInfo.writeToParcel(parcel, 0);
@@ -60,5 +61,6 @@ public class WifiInfoTest {
assertEquals(TEST_TX_BAD, readWifiInfo.txBad);
assertEquals(TEST_RX_SUCCESS, readWifiInfo.rxSuccess);
assertTrue(readWifiInfo.isTrusted());
+ assertTrue(readWifiInfo.isOsuAp());
}
}
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index c43948bb0c04..4fbef5a8493d 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -77,7 +77,9 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* Unit tests for {@link android.net.wifi.WifiManager}.
@@ -1274,14 +1276,20 @@ i * Verify that a call to cancel WPS immediately returns a failure.
}
/**
- * Check the call to getAllMatchingWifiConfigs calls getAllMatchingWifiConfigs of WifiService
- * with the provided a list of ScanResult.
+ * Check the call to getAllMatchingWifiConfigs calls getAllMatchingFqdnsForScanResults and
+ * getWifiConfigsForPasspointProfiles of WifiService in order.
*/
@Test
public void testGetAllMatchingWifiConfigs() throws Exception {
+ Map<String, List<ScanResult>> fqdns = new HashMap<>();
+ fqdns.put("www.test.com", new ArrayList<>());
+ when(mWifiService.getAllMatchingFqdnsForScanResults(any(List.class))).thenReturn(fqdns);
+ InOrder inOrder = inOrder(mWifiService);
+
mWifiManager.getAllMatchingWifiConfigs(new ArrayList<>());
- verify(mWifiService).getAllMatchingWifiConfigs(any(List.class));
+ inOrder.verify(mWifiService).getAllMatchingFqdnsForScanResults(any(List.class));
+ inOrder.verify(mWifiService).getWifiConfigsForPasspointProfiles(any(List.class));
}
/**
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java
index 83627ad524d2..dd6e2c9ce7af 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java
@@ -518,7 +518,7 @@ public class WifiNetworkConfigBuilderTest {
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
.get(WifiConfiguration.GroupCipher.GCMP_256));
- assertTrue(suggestion.wifiConfiguration.allowedGroupMgmtCiphers
+ assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
.get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
assertTrue(suggestion.wifiConfiguration.allowedSuiteBCiphers
.get(WifiConfiguration.SuiteBCipher.ECDHE_ECDSA));
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java
index 4189e40718d8..c3b62854f12c 100644
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java
+++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java
@@ -62,6 +62,7 @@ public class WifiAwareAgentNetworkSpecifierTest {
WifiAwareAgentNetworkSpecifier.CREATOR.createFromParcel(parcelR);
assertEquals(dut, rereadDut);
+ assertEquals(dut.hashCode(), rereadDut.hashCode());
// Ensure that individual network specifiers are satisfied by both the original & marshaled
// |WifiAwareNetworkAgentSpecifier instances.
@@ -181,6 +182,6 @@ public class WifiAwareAgentNetworkSpecifierTest {
WifiAwareNetworkSpecifier getDummyNetworkSpecifier(int clientId) {
return new WifiAwareNetworkSpecifier(WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_OOB,
WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, clientId, 0, 0, new byte[6],
- null, null, 0);
+ null, null, 10, 5, 0);
}
}
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
index ed38c7613a62..6da6d4adeb62 100644
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
@@ -16,8 +16,11 @@
package android.net.wifi.aware;
+import static android.net.wifi.aware.WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB;
+
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
@@ -913,9 +916,10 @@ public class WifiAwareManagerTest {
final int clientId = 4565;
final int sessionId = 123;
final PeerHandle peerHandle = new PeerHandle(123412);
- final int role = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
final byte[] pmk = PMK_VALID;
final String passphrase = PASSPHRASE_VALID;
+ final int port = 5;
+ final int transportProtocol = 10;
final ConfigRequest configRequest = new ConfigRequest.Builder().build();
final PublishConfig publishConfig = new PublishConfig.Builder().build();
@@ -959,56 +963,70 @@ public class WifiAwareManagerTest {
.setPeerHandle(peerHandle).build();
// validate format
- collector.checkThat("role", role, equalTo(ns.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(ns.role));
collector.checkThat("client_id", clientId, equalTo(ns.clientId));
collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
- collector.checkThat("role", role, equalTo(nsb.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(nsb.role));
collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
+ collector.checkThat("port", 0, equalTo(nsb.port));
+ collector.checkThat("transportProtocol", -1, equalTo(nsb.transportProtocol));
// (4) request an encrypted (PMK) network specifier from the session
ns = (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierPmk(
peerHandle, pmk);
- nsb =
- (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
- .setDiscoverySession(
- publishSession.getValue()).setPeerHandle(peerHandle).setPmk(pmk).build();
+ nsb = (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession.getValue()).setPeerHandle(peerHandle)
+ .setPmk(pmk).setPort(port).setTransportProtocol(transportProtocol).build();
// validate format
- collector.checkThat("role", role, equalTo(ns.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(ns.role));
collector.checkThat("client_id", clientId, equalTo(ns.clientId));
collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
collector.checkThat("pmk", pmk , equalTo(ns.pmk));
- collector.checkThat("role", role, equalTo(nsb.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(nsb.role));
collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
collector.checkThat("pmk", pmk , equalTo(nsb.pmk));
+ collector.checkThat("port", port, equalTo(nsb.port));
+ collector.checkThat("transportProtocol", transportProtocol, equalTo(nsb.transportProtocol));
// (5) request an encrypted (Passphrase) network specifier from the session
- ns = (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierPassphrase(
- peerHandle, passphrase);
+ ns =
+ (WifiAwareNetworkSpecifier) publishSession.getValue()
+ .createNetworkSpecifierPassphrase(
+ peerHandle, passphrase);
nsb = (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
.setDiscoverySession(publishSession.getValue()).setPeerHandle(peerHandle)
- .setPskPassphrase(passphrase).build();
+ .setPskPassphrase(passphrase).setPort(port).setTransportProtocol(transportProtocol)
+ .build();
// validate format
- collector.checkThat("role", role, equalTo(ns.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(ns.role));
collector.checkThat("client_id", clientId, equalTo(ns.clientId));
collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
collector.checkThat("passphrase", passphrase, equalTo(ns.passphrase));
- collector.checkThat("role", role, equalTo(nsb.role));
+ collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
+ equalTo(nsb.role));
collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
collector.checkThat("passphrase", passphrase, equalTo(nsb.passphrase));
+ collector.checkThat("port", port, equalTo(nsb.port));
+ collector.checkThat("transportProtocol", transportProtocol, equalTo(nsb.transportProtocol));
verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
mockPublishSession, mockRttListener);
@@ -1325,6 +1343,140 @@ public class WifiAwareManagerTest {
executeNetworkSpecifierDirect(null, false, null, PASSPHRASE_VALID, false);
}
+ /**
+ * Validate that get an exception when creating a network specifier with an invalid port number
+ * (<=0).
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void testNetworkSpecifierBuilderInvalidPortNumber() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final byte[] pmk = PMK_VALID;
+ final int port = 0;
+
+ DiscoverySession publishSession = executeSessionStartup(true);
+
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setPmk(pmk).setPort(port).build();
+ }
+
+ /**
+ * Validate that get an exception when creating a network specifier with port information
+ * without also requesting a secure link.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testNetworkSpecifierBuilderInvalidPortOnInsecure() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final int port = 5;
+
+ DiscoverySession publishSession = executeSessionStartup(true);
+
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setPort(port).build();
+ }
+
+ /**
+ * Validate that get an exception when creating a network specifier with port information on
+ * a responder.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testNetworkSpecifierBuilderInvalidPortOnResponder() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final int port = 5;
+
+ DiscoverySession subscribeSession = executeSessionStartup(false);
+
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(subscribeSession).setPeerHandle(peerHandle)
+ .setPort(port).build();
+ }
+
+ /**
+ * Validate that get an exception when creating a network specifier with an invalid transport
+ * protocol number (not in [0, 255]).
+ */
+ @Test
+ public void testNetworkSpecifierBuilderInvalidTransportProtocolNumber() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final byte[] pmk = PMK_VALID;
+ final int tpNegative = -1;
+ final int tpTooLarge = 256;
+ final int tpSmallest = 0;
+ final int tpLargest = 255;
+
+ DiscoverySession publishSession = executeSessionStartup(true);
+
+ try {
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setPmk(pmk).setTransportProtocol(tpNegative).build();
+ assertTrue("No exception on negative transport protocol!", false);
+ } catch (IllegalArgumentException e) {
+ // nop - exception is correct!
+ }
+ try {
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setPmk(pmk).setTransportProtocol(tpTooLarge).build();
+ assertTrue("No exception on >255 transport protocol!", false);
+ } catch (IllegalArgumentException e) {
+ // nop - exception is correct!
+ }
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setPmk(pmk).setTransportProtocol(tpSmallest).build();
+ nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(
+ publishSession).setPeerHandle(peerHandle).setPmk(
+ pmk).setTransportProtocol(tpLargest).build();
+ }
+
+ /**
+ * Validate that get an exception when creating a network specifier with transport protocol
+ * information without also requesting a secure link.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testNetworkSpecifierBuilderInvalidTransportProtocolOnInsecure() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final int transportProtocol = 5;
+
+ DiscoverySession publishSession = executeSessionStartup(true);
+
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(publishSession).setPeerHandle(peerHandle)
+ .setTransportProtocol(transportProtocol).build();
+ }
+
+ /**
+ * Validate that get an exception when creating a network specifier with transport protocol
+ * information on a responder.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testNetworkSpecifierBuilderInvalidTransportProtocolOnResponder() throws Exception {
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final int transportProtocol = 5;
+
+ DiscoverySession subscribeSession = executeSessionStartup(false);
+
+ WifiAwareNetworkSpecifier nsb =
+ (WifiAwareNetworkSpecifier) new WifiAwareManager.NetworkSpecifierBuilder()
+ .setDiscoverySession(subscribeSession).setPeerHandle(peerHandle)
+ .setTransportProtocol(transportProtocol).build();
+ }
+
+ /*
+ * Utilities
+ */
+
private void executeNetworkSpecifierDirect(byte[] someMac, boolean doPmk, byte[] pmk,
String passphrase, boolean doInitiator) throws Exception {
final int clientId = 134;
@@ -1356,7 +1508,83 @@ public class WifiAwareManagerTest {
}
}
- // WifiAwareNetworkInfo tests
+ private DiscoverySession executeSessionStartup(boolean isPublish) throws Exception {
+ final int clientId = 4565;
+ final int sessionId = 123;
+ final PeerHandle peerHandle = new PeerHandle(123412);
+ final int port = 5;
+ final ConfigRequest configRequest = new ConfigRequest.Builder().build();
+ final SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
+ final PublishConfig publishConfig = new PublishConfig.Builder().build();
+
+ ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
+ WifiAwareSession.class);
+ ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
+ .forClass(IWifiAwareEventCallback.class);
+ ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
+ .forClass(IWifiAwareDiscoverySessionCallback.class);
+ ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
+ .forClass(PublishDiscoverySession.class);
+ ArgumentCaptor<SubscribeDiscoverySession> subscribeSession = ArgumentCaptor
+ .forClass(SubscribeDiscoverySession.class);
+
+
+ InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
+ mockPublishSession, mockRttListener);
+
+ // (1) connect successfully
+ mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
+ inOrder.verify(mockAwareService).connect(any(), any(), clientProxyCallback.capture(),
+ eq(configRequest), eq(false));
+ clientProxyCallback.getValue().onConnectSuccess(clientId);
+ mMockLooper.dispatchAll();
+ inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
+ WifiAwareSession session = sessionCaptor.getValue();
+
+ if (isPublish) {
+ // (2) publish successfully
+ session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
+ inOrder.verify(mockAwareService).publish(any(), eq(clientId), eq(publishConfig),
+ sessionProxyCallback.capture());
+ sessionProxyCallback.getValue().onSessionStarted(sessionId);
+ mMockLooper.dispatchAll();
+ inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
+ return publishSession.getValue();
+ } else {
+ // (2) subscribe successfully
+ session.subscribe(subscribeConfig, mockSessionCallback, mMockLooperHandler);
+ inOrder.verify(mockAwareService).subscribe(any(), eq(clientId), eq(subscribeConfig),
+ sessionProxyCallback.capture());
+ sessionProxyCallback.getValue().onSessionStarted(sessionId);
+ mMockLooper.dispatchAll();
+ inOrder.verify(mockSessionCallback).onSubscribeStarted(subscribeSession.capture());
+ return subscribeSession.getValue();
+ }
+ }
+
+ // WifiAwareNetworkSpecifier && WifiAwareNetworkInfo tests
+
+ @Test
+ public void testWifiAwareNetworkSpecifierParcel() {
+ WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier(NETWORK_SPECIFIER_TYPE_IB,
+ WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, 5, 568, 334,
+ HexEncoding.decode("000102030405".toCharArray(), false),
+ "01234567890123456789012345678901".getBytes(), "blah blah", 666, 4, 10001);
+
+ Parcel parcelW = Parcel.obtain();
+ ns.writeToParcel(parcelW, 0);
+ byte[] bytes = parcelW.marshall();
+ parcelW.recycle();
+
+ Parcel parcelR = Parcel.obtain();
+ parcelR.unmarshall(bytes, 0, bytes.length);
+ parcelR.setDataPosition(0);
+ WifiAwareNetworkSpecifier rereadNs =
+ WifiAwareNetworkSpecifier.CREATOR.createFromParcel(parcelR);
+
+ assertEquals(ns, rereadNs);
+ assertEquals(ns.hashCode(), rereadNs.hashCode());
+ }
@Test
public void testWifiAwareNetworkCapabilitiesParcel() throws UnknownHostException {
@@ -1364,9 +1592,11 @@ public class WifiAwareManagerTest {
"11:22:33:44:55:66").getLinkLocalIpv6FromEui48Mac();
// note: dummy scope = 5
final Inet6Address inet6Scoped = Inet6Address.getByAddress(null, inet6.getAddress(), 5);
+ final int port = 5;
+ final int transportProtocol = 6;
assertEquals(inet6Scoped.toString(), "/fe80::1322:33ff:fe44:5566%5");
- WifiAwareNetworkInfo cap = new WifiAwareNetworkInfo(inet6Scoped);
+ WifiAwareNetworkInfo cap = new WifiAwareNetworkInfo(inet6Scoped, port, transportProtocol);
Parcel parcelW = Parcel.obtain();
cap.writeToParcel(parcelW, 0);
@@ -1380,6 +1610,7 @@ public class WifiAwareManagerTest {
WifiAwareNetworkInfo.CREATOR.createFromParcel(parcelR);
assertEquals(cap.getPeerIpv6Addr().toString(), "/fe80::1322:33ff:fe44:5566%5");
+ assertEquals(cap, rereadCap);
assertEquals(cap.hashCode(), rereadCap.hashCode());
}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
index a9d4b8f008f6..1ecc3fecf7c3 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
@@ -16,6 +16,7 @@
package android.net.wifi.hotspot2.pps;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -44,17 +45,16 @@ public class CredentialTest {
* @param userCred Instance of UserCredential
* @param certCred Instance of CertificateCredential
* @param simCred Instance of SimCredential
- * @param caCert CA certificate
* @param clientCertificateChain Chain of client certificates
* @param clientPrivateKey Client private key
+ * @param caCerts CA certificates
* @return {@link Credential}
*/
private static Credential createCredential(Credential.UserCredential userCred,
- Credential.CertificateCredential certCred,
- Credential.SimCredential simCred,
- X509Certificate caCert,
- X509Certificate[] clientCertificateChain,
- PrivateKey clientPrivateKey) {
+ Credential.CertificateCredential certCred,
+ Credential.SimCredential simCred,
+ X509Certificate[] clientCertificateChain, PrivateKey clientPrivateKey,
+ X509Certificate... caCerts) {
Credential cred = new Credential();
cred.setCreationTimeInMillis(123455L);
cred.setExpirationTimeInMillis(2310093L);
@@ -63,7 +63,11 @@ public class CredentialTest {
cred.setUserCredential(userCred);
cred.setCertCredential(certCred);
cred.setSimCredential(simCred);
- cred.setCaCertificate(caCert);
+ if (caCerts != null && caCerts.length == 1) {
+ cred.setCaCertificate(caCerts[0]);
+ } else {
+ cred.setCaCertificates(caCerts);
+ }
cred.setClientCertificateChain(clientCertificateChain);
cred.setClientPrivateKey(clientPrivateKey);
return cred;
@@ -80,8 +84,8 @@ public class CredentialTest {
certCred.setCertType("x509v3");
certCred.setCertSha256Fingerprint(
MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
- return createCredential(null, certCred, null, FakeKeys.CA_CERT0,
- new X509Certificate[] {FakeKeys.CLIENT_CERT}, FakeKeys.RSA_KEY1);
+ return createCredential(null, certCred, null, new X509Certificate[] {FakeKeys.CLIENT_CERT},
+ FakeKeys.RSA_KEY1, FakeKeys.CA_CERT0, FakeKeys.CA_CERT1);
}
/**
@@ -93,7 +97,7 @@ public class CredentialTest {
Credential.SimCredential simCred = new Credential.SimCredential();
simCred.setImsi("1234*");
simCred.setEapType(EAPConstants.EAP_SIM);
- return createCredential(null, null, simCred, null, null, null);
+ return createCredential(null, null, simCred, null, null, (X509Certificate[]) null);
}
/**
@@ -110,7 +114,7 @@ public class CredentialTest {
userCred.setSoftTokenApp("TestApp");
userCred.setEapType(EAPConstants.EAP_TTLS);
userCred.setNonEapInnerMethod("MS-CHAP");
- return createCredential(userCred, null, null, FakeKeys.CA_CERT0, null, null);
+ return createCredential(userCred, null, null, null, null, FakeKeys.CA_CERT0);
}
private static void verifyParcel(Credential writeCred) {
@@ -120,6 +124,7 @@ public class CredentialTest {
parcel.setDataPosition(0); // Rewind data position back to the beginning for read.
Credential readCred = Credential.CREATOR.createFromParcel(parcel);
assertTrue(readCred.equals(writeCred));
+ assertEquals(writeCred.hashCode(), readCred.hashCode());
}
/**